本文へ移動
cccskills
無料GitHub で公開

playwright

Run Playwright browser E2E against a REAL portal, not the dev Monolith. The Monolith has DevLogin but no language model; the running `memex` stack has a model but uses Entra OAuth and is the user's data. This skill stands up a throwaway, DevLogin portal on Colima k3s — built from the CURRENT working tree, with its OWN database (memex_e2e), reusing the existing memex Postgres + host Ollama + ingress/TLS — then points Playwright at it over the ingress (reverse proxy). Use when an E2E must actually log in, render Blazor/SignalR, AND execute a chat round (or any flow needing a model); or when a test "skips execution" for lack of a model. One command: `memex-local e2e up` → `e2e test` → `e2e down`. Built on memex-local / LocalColimaMac.

日本語の概要は準備中です。原文の説明を表示しています。

Systemorph/MeshWeaverスター 12(GitHub 12 + cccskills 0)

実行スコア 未検証

インストール方法を見る

含まれるファイル(1)

  • SKILL.md6.6 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

/playwright — deploy a throwaway portal on Colima, then drive it with Playwright

Never run a chat/model E2E against the dev Monolith — it has DevLogin but no language model, so Send is gated and the test can only assert the composer renders, never that it executes. And never point Playwright at the user's memex portal — it authenticates through Entra (no /dev/signin) and holds their real data.

Instead: build the image from the working tree, deploy a dedicated DevLogin portal on Colima k3s, and drive THAT. It reuses the running memex stack's Postgres, host Ollama and ingress/TLS, but runs against its own database (memex_e2e) with DevLogin on, behind the ingress (reverse proxy) at https://e2e.memex.localhost:8444. It is additive — it never touches the memex release, DB, or config.

Canonical references:

  • LocalColimaMac.md — the Colima k3s stack this builds on (§15 = the e2e portal).
  • deploy/homebrew/bin/memex-local — the CLI; the e2e subcommand is the whole flow.
  • src/MeshWeaver.Portal.E2E.Test/PortalFixture.cs in MeshWeaver.Plugins — the DevLogin fixture every E2E uses (the suite moved there with the portal GUI; core carries no GUI technology — CoreCarriesNoGuiTechnology.md).

The flow (one CLI, three steps)

# 0. Prereq: the memex stack must already be up (provides PG, Ollama, ingress, TLS):
memex-local up                      # or: memex-local status   (skip if already running)

# 1. Build the working tree → image, create memex_e2e, migrate, deploy, reverse-proxy:
memex-local e2e up                  # add --skip-build to reuse the last image (fast iterate)

# 2. Run a Playwright test against the e2e portal (E2E_BASE_URL + DevLogin are preset):
memex-local e2e test HomeChatExecuteTest    # default filter is HomeChatExecuteTest

# 3. Tear down — delete the e2e objects + drop the e2e DB (keeps the memex stack):
memex-local e2e down                # add --keep-db to keep memex_e2e between runs

Run the CLI from the repo (it auto-resolves the chart/repo), or MEMEX_REPO=$PWD memex-local … when invoking deploy/homebrew/bin/memex-local directly. memex-local e2e status / e2e logs inspect the running instance.

What e2e up does (and why each step)

  1. image_build_local — dotnet publish -t:PublishContainer for the portal + migration (native arm64, into Colima's image store). --skip-build reuses the last build for fast loops.
  2. Create memex_e2e in the existing memex-postgres (a separate database — never memex).
  3. Migrate it (a one-off Job on the migration image). The portal's DbVersionGate refuses to start against an un-migrated DB, so this must finish first.
  4. Deploy memex-e2e-portal (Deployment + Service + Ingress) in the memex namespace, reusing memex-portal-config / memex-portal-secrets via envFrom, overriding only: ConnectionStrings__memex → memex_e2e, and Authentication__EnableDevLogin=true. Clustering is Localhost (its own in-process silo) so it never joins memex's cluster.
  5. Reverse proxy — an Ingress for e2e.memex.localhost (covered by the *.memex.localhost mkcert cert), plus a port-forward of ingress-nginx :443 to host :8444.

Driving it with Playwright

PortalFixture authenticates via DevLogin (POST /dev/signin?personId=Roland) and sets IgnoreHTTPSErrors=true, so the self-signed *.memex.localhost cert is fine. memex-local e2e test exports E2E_BASE_URL=https://e2e.memex.localhost:8444 and E2E_USER=Roland for you. To run a test by hand:

# from the MeshWeaver checkout: only it has the global.json that selects Microsoft.Testing.Platform
E2E_BASE_URL=https://e2e.memex.localhost:8444 E2E_USER=Roland \
  dotnet test ../MeshWeaver.Plugins/src/MeshWeaver.Portal.E2E.Test -p:MeshWeaverRoot="$PWD/" \
    --filter "FullyQualifiedName~<TestName>"

When writing a new browser test, follow the existing ones:

  • Put it in MeshWeaver.Plugins' src/MeshWeaver.Portal.E2E.Test, [Collection("portal-e2e")], ctor takes PortalFixture.
  • First line: Assert.SkipUnless(fixture.Available, fixture.SkipReason) — so it no-ops when E2E is off.
  • await fixture.NewAuthenticatedContextAsync() for a logged-in browser context; seed mesh content it can't create via the UI with MintTokenAsync + CreateNodeAsync.
  • Assert on rendered DOM, not typed-but-unsent input (the HomeChatExecuteTest lesson: matching the editor's own text false-passes). Wait for a real message bubble / state change.
  • A model-dependent step should detect "No language model is available" and Assert.Skip rather than false-pass — but under THIS skill a model IS present, so execution actually runs.

Iterate fast

After a code change: memex-local e2e up rebuilds + rolls the portal (the DB/migration are idempotent). For a UI-only change with the image unchanged, --skip-build skips the long publish.

Troubleshooting

  • namespace 'memex' not found → run memex-local up first; e2e reuses that stack.
  • Portal not ready / e2e logs shows a DB error → the migration Job didn't complete; check kubectl -n memex logs job/memex-e2e-migration.
  • Send still gated in the test → host Ollama isn't serving the model. ollama list must show the chat model (qwen3.6-code); the portal addresses it as http://ollama:11434/v1.
  • 502 / not 200 at the URL → the ingress port-forward dropped; memex-local e2e status restarts it, or kubectl -n ingress-nginx port-forward svc/ingress-nginx-controller 8444:443.
  • Leftover env → memex-local e2e down (idempotent). It only removes e2e objects + the e2e DB.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

コメント

ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。

まだコメントはありません。最初のコメントを書いてみませんか。

送信するとすぐに公開されます。メールアドレスや電話番号などの個人情報は書かないでください。URL は 2 つまでです。

0 / 1000 文字

このフォームは reCAPTCHA で保護されており、Google のプライバシーポリシーと利用規約が適用されます。

同じリポジトリのスキル

async

無料

Forwarding AccessContext through async/reactive boundaries, and the no-async rule on the actor-model mesh. Use when writing or reviewing any hub-reachable / Blazor-view / agent-round / IIoPool code that creates, reads, or updates a mesh node, OR when a write "silently does nothing" / "Access denied" appears after a .Subscribe / IIoPool / Observable.Create hop. The async/await/ToTask/.Wait/.Result/.GetAwaiter/FirstAsync family and lost AccessContext are the two ways async boundaries cause wedges and storms. Grounded in AsynchronousCalls.md, SyncedMeshNodeQueries.md, AccessContextPropagation.md.

日本語の概要は準備中です。原文の説明を表示しています。

Systemorph/MeshWeaver122026年10月29日 更新

ci

無料

What CI proves, what it cannot prove, and how to write a gate that cannot pass on no evidence. Use when authoring or changing a GitHub Actions workflow, adding a required check, wiring a satellite repo CI, or reasoning about whether a green run actually covers your change. Covers the absolute no-skip-trapdoor rule (a gate must never carry continue-on-error on its input step nor an if that asks whether a secret is set — GitHub paints a skipped job the same colour as a passed one), the reusable workflow_call jobs satellite repos must call instead of hand-rolling, why runs on main are deliberately never cancelled, and the large body of in-mesh C# that no dotnet build or test ever type-checks.

日本語の概要は準備中です。原文の説明を表示しています。

Systemorph/MeshWeaver122026年10月29日 更新

debug

無料

Debug a deadlock / hang / timeout in the mesh — a test that times out, a hub handler whose response never arrives, a GetRemoteStream / GetMeshNodeStream / GetQuery that never emits, an agent round or per-instance-hub activation that parks forever. Use whenever something times out and you need to find WHERE the message flow breaks down. The timeout is the symptom, never the bug — raising it just hangs longer. Grounded in DebuggingMessageFlow.md.

日本語の概要は準備中です。原文の説明を表示しています。

Systemorph/MeshWeaver122026年10月29日 更新

Remove / reset a user (and their partition) on a running MeshWeaver portal (AKS). Use when you need to kick out a user — e.g. a throwaway test account — so they re-onboard from scratch. The normal delete API REFUSES a user's home ("user partition root … cannot be deleted"), so deletion is a Postgres-schema drop, not an MCP call. Covers where a user's data actually lives (per-user PG schemas named by BOTH id AND email, e.g. `rbuergi` + `rbuergi@systemorph.com`), how to reach PG (the connection string is inline in the portal's `ConnectionStrings__memex` env — NOT the `POSTGRES_PASSWORD` secret), the substring-match footgun (`buergi` also matches admin `rbuergi`), the in-memory resurrection gotcha (a recycle re-saves the node — a portal restart is what actually clears it), and the half-onboarded case where the user has NO schema at all (in-memory only → restart is the whole fix).

日本語の概要は準備中です。原文の説明を表示しています。

Systemorph/MeshWeaver122026年10月29日 更新

deploy

無料

Deploy MeshWeaver — the two routes (shared AKS cluster, and Azure Container Apps via the Aspire test/prod modes) and the traps that make a deploy look done when it is not. Use when rolling a code change onto a portal, standing up or patching an environment, or verifying that what is running is what you built. FIRST RULE (maintainer, 2026-09-08): on AKS an operation is a Hosting/InstanceAction on the control instance (Roll, Restart, Suspend, Audit, Reconcile, …) executed by the in-cluster operator — az aks command invoke / kubectl are break-glass, never the procedure. Also covers the bootstrap build-image / set-image / restart sequence the operator runs for you, why an env deploy.sh is first-time setup and not a code-update path, why the database migration is a run-once Job that a helm upgrade runs — never a Deployment to roll — and the DbVersionGate that makes a portal refuse to serve ahead of its schema.

日本語の概要は準備中です。原文の説明を表示しています。

Systemorph/MeshWeaver122026年10月29日 更新

gui

無料

Build or review ANY MeshWeaver UI — layout areas, editable views, forms, tables, content editing, side-panel composers — by wiring the framework's EXISTING data-binding pieces, NEVER hand-rolling. The one rule is ALWAYS DATA-BIND, especially editable views: the backend layout area declares WHAT to render (a UiControl tree + node PATHS), and every value read / write-back happens on the GUI side through the per-node IMeshNodeStreamCache. Hand-woven binding — replicating a node into a /data/{id} copy + a save subscription, emitting HTML strings, hand-built selects/checkboxes, .Take(1) on a live stream, async/await/QueryAsync in a layout area — is the bug class behind "awaiting first data" / "renders empty" / a stuck editable view. Use when writing or reviewing a layout area, control, editor, form, table, or any data-bound view. Grounded in src/MeshWeaver.Layout/DataBinding/, Doc/GUI/DataBinding.md + Editor.md, the Edit extension (EditorExtensions.cs), and the node-bound editor controls.

日本語の概要は準備中です。原文の説明を表示しています。

Systemorph/MeshWeaver122026年10月29日 更新

Systemorph のスキルをすべて見る

このスキルの問題を報告する