Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions .claude/agents/code-reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,12 @@ Senior reviewer for NeoBoard. Check staged/unstaged changes against rules, then
1. Run `git diff` and `git diff --cached` to get all changes.
2. Read each changed file to understand full context.
3. Check against the rules below.
4. After code review, run `cd app && npx vitest run` and `cd component && npx vitest run` to verify tests pass.
5. If any UI files changed (`*.tsx` in pages, components, or settings), recommend running `@feature-reviewer` on the affected feature.
4. After code review, run `cd app && npm test` and `cd component && npm test` to verify tests pass.
5. Check external review feedback:
- CodeRabbit: `gh pr view --comments | grep -A10 'coderabbitai'`
- SonarCloud: `gh pr checks` — verify quality gate passes
- Flag any unaddressed CRITICAL/MAJOR findings
6. If any UI files changed (`*.tsx` in pages, components, or settings), recommend running `@feature-reviewer` on the affected feature.
Comment on lines +17 to +22

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Review flow omits connection/ test verification.

Current step can approve PRs with unverified connection/ changes. Add a conditional cd connection && npm test path.

Suggested fix
-4. After code review, run `cd app && npm test` and `cd component && npm test` to verify tests pass.
+4. After code review, run tests for affected packages:
+   - `cd app && npm test` (if `app/` changed)
+   - `cd component && npm test` (if `component/` changed)
+   - `cd connection && npm test` (if `connection/` changed)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.claude/agents/code-reviewer.md around lines 17 - 22, The review flow
currently skips running tests for the connection package; update the workflow
step that runs tests (the list items 4–6) to conditionally run "cd connection &&
npm test" when there are changes under the connection/ directory by adding a
check for modified files in connection/ and executing the test command (so the
steps now include running tests for app, component, and conditionally
connection); ensure the check references the connection/ path and the npm test
invocation so PRs with connection/ changes cannot be approved without running
those tests.


## Rules (priority order)

Expand Down
8 changes: 4 additions & 4 deletions .claude/agents/project-architect.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Read these files for project rules and architecture:

## Tech Stack

Next.js 15 (App Router), React 19, TypeScript, shadcn/ui, Tailwind CSS, ECharts, Neo4j NVL, Leaflet, Zustand, TanStack Query, Auth.js v5, Drizzle ORM.
Next.js 16 (App Router), React 19, TypeScript, shadcn/ui, Tailwind CSS, ECharts, Neo4j NVL, Leaflet, Zustand, TanStack Query, Auth.js v5, Drizzle ORM.

## Three Packages (STRICT boundaries)

Expand All @@ -30,7 +30,7 @@ Next.js 15 (App Router), React 19, TypeScript, shadcn/ui, Tailwind CSS, ECharts,
You may receive:

- An issue number to fetch
- A `REQUIREMENTS BRIEF` from a `/grill` session — if provided, this is your primary source of truth for what the user wants. It contains answers to detailed clarifying questions about scope, UX, data model, security, edge cases, and testing.
- A `REQUIREMENTS BRIEF` from a `/drill` session — if provided, this is your primary source of truth for what the user wants. It contains answers to detailed clarifying questions about scope, UX, data model, security, edge cases, and testing.

## Steps

Expand All @@ -51,7 +51,7 @@ You may receive:
# Implementation Plan: <Feature Name>

## Requirements Summary
<2-3 sentences summarizing what was agreed during the grilling session — scope, MVP, key decisions>
<2-3 sentences summarizing what was agreed during the drill session — scope, MVP, key decisions>

## Impact Analysis
- Packages affected: [app, component, connection]
Expand Down Expand Up @@ -90,7 +90,7 @@ You may receive:
- Unit tests: [what to cover, which files]
- Integration tests: [what to cover]
- E2E tests: [critical user flows to cover]
- Edge cases from brief: [list specific edge cases identified during grilling]
- Edge cases from brief: [list specific edge cases identified during drill]

## Risks
- [Risk] — Mitigation
Expand Down
26 changes: 26 additions & 0 deletions .claude/hooks/check-migration-guard.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/bin/bash
# Hook: Prevent editing existing migration files (forward-only migrations)
# Rule: "Forward-only. Idempotent." — CLAUDE.md
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.filePath // empty')
[ -z "$FILE_PATH" ] && exit 0

# Only check migration files
case "$FILE_PATH" in
*migrations/*.sql|*migrations/*.ts)
# Allow creating NEW migration files (Write tool with no existing file)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // empty')
if [ "$TOOL_NAME" = "Write" ] && [ ! -f "$FILE_PATH" ]; then
exit 0
fi
# Block editing existing migration files
if [ -f "$FILE_PATH" ]; then
echo "BLOCKED: Cannot edit existing migration file: $(basename "$FILE_PATH")" >&2
echo "Rule: Migrations are forward-only. Create a new migration instead." >&2
echo "Use: npm run db:generate" >&2
exit 2
fi
;;
esac

exit 0
11 changes: 11 additions & 0 deletions .claude/hooks/session-context.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,17 @@ cd "$PROJECT_DIR"

echo "=== Session Context ==="

# Docker health check
if command -v docker >/dev/null 2>&1; then
if docker info >/dev/null 2>&1; then
echo "Docker: running"
else
echo "WARNING: Docker is installed but not running. Tests requiring Docker (connection/, E2E) will fail."
fi
else
echo "WARNING: Docker not found. Tests requiring Docker (connection/, E2E) will fail."
fi

# Current branch & tracking
BRANCH=$(git branch --show-current 2>/dev/null)
echo "Branch: $BRANCH"
Expand Down
6 changes: 6 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@
"timeout": 5,
"statusMessage": "Checking credential logging..."
},
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/check-migration-guard.sh",
"timeout": 5,
"statusMessage": "Checking migration file safety..."
},
{
"type": "command",
"command": "INPUT=$(cat); FILE_PATH=$(echo \"$INPUT\" | jq -r '.tool_input.file_path // .tool_input.filePath // empty'); NEW_CONTENT=$(echo \"$INPUT\" | jq -r '.tool_input.new_string // .tool_input.content // empty'); [ -z \"$NEW_CONTENT\" ] && exit 0; if echo \"$NEW_CONTENT\" | grep -qE \"import \\* as echarts from ['\\\"]echarts['\\\"]|from ['\\\"]echarts['\\\"]\" && ! echo \"$NEW_CONTENT\" | grep -q 'echarts/core'; then echo 'BLOCKED: Never import * from echarts. Use echarts/core + specific modules.' >&2; exit 2; fi",
Expand Down
7 changes: 4 additions & 3 deletions .claude/skills/code/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ allowed-tools: Read, Write, Edit, MultiEdit, Bash(npm *), Bash(npx *), Bash(git
## Before coding

1. If issue number: `gh issue view <number>`
2. If existing PR: `gh pr view <number> --comments` — check CodeRabbit & SonarQube feedback
3. Identify package: component/ (UI only), connection/ (DB only), app/ (orchestration)
4. Read relevant docs in `claude_code_docs/`
2. **Run `/drill <number>`** — mandatory requirements gathering before implementation. No exceptions.
3. If existing PR: `gh pr view <number> --comments` — check CodeRabbit & SonarCloud feedback
4. Identify package: component/ (UI only), connection/ (DB only), app/ (orchestration)
5. Read relevant docs in `claude_code_docs/`

## TDD Workflow (mandatory — no exceptions)

Expand Down
13 changes: 0 additions & 13 deletions .claude/skills/github-workflow/SKILL.md

This file was deleted.

5 changes: 3 additions & 2 deletions .claude/skills/issue/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ model: haiku

Create a GitHub issue based on $ARGUMENTS.

Title format: `type(scope): description`
Scopes: app, component, connection, auth, encryption, migration, api, widget, chart

Labels — always apply type + package + area:

- Type: bug, enhancement, security, documentation, performance, urgent
- Package: pkg:app, pkg:component, pkg:connection
- Area: area:auth, area:connectors, area:widgets, area:charts, area:query-exec, area:dashboard, area:api
- Special: enterprise, breaking-change, good-first-issue

Title format: `type(scope): description`
23 changes: 15 additions & 8 deletions .claude/skills/next/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,32 +35,39 @@ git checkout -b <type>/<short-description>

Branch prefix from labels: bug → fix/, enhancement → feat/, security → security/, docs → docs/.

## Step 3 — Read the issue and relevant docs
## Step 3 — Run /drill

Before implementing, run `/drill <number>` to gather requirements, edge cases, and acceptance criteria. This is mandatory per CLAUDE.md.

## Step 4 — Read the issue and relevant docs

Comment on lines +38 to 43

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Move /drill before branch creation to match the mandatory workflow.

This step says /drill is mandatory, but branch creation currently happens earlier. Reorder so /drill <number> runs before any branch command.

Based on learnings: Run /drill <issue-number> before creating a branch or starting implementation. Do NOT skip the drill.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.claude/skills/next/SKILL.md around lines 38 - 43, Reorder the workflow so
the mandatory "/drill <number>" step runs before any branch creation commands:
move the "Step 3 — Run /drill" block to precede the branch-creation step and
update surrounding headings (e.g., the current "Step 4 — Read the issue and
relevant docs") so the sequence is Drill -> Branch creation -> Read/implement;
ensure the text explicitly states "Run /drill <issue-number> before creating a
branch" and remove any wording that implies branch creation can occur first.

Read the full issue body. Check `claude_code_docs/` for relevant context.
Identify which package(s) are affected: app/, component/, connection/.

## Step 4 — Implement
## Step 5 — Implement

Follow all CLAUDE.md rules. Respect package boundaries.
If building UI, check existing components first (`find component/src -name '*.tsx'`).

## Step 5 — Test and lint
## Step 6 — Test and lint

```bash
npm run lint:fix
cd app && npx next lint --fix
npm run lint
npm run build
npm run test
cd app && npm test
cd component && npm test
cd app && npx playwright test
Comment on lines +52 to +60

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Step 6 command sequence is brittle due to persistent cd state.

After cd app, subsequent commands are no longer guaranteed to run from repo root, and cd component can fail from inside app/. Use workspace-scoped commands and include connection/ tests.

Suggested fix
-cd app && npx next lint --fix
-npm run lint
-npm run build
-cd app && npm test
-cd component && npm test
-cd app && npx playwright test
+npm -w app exec next lint -- --fix
+npm run lint
+npm run build
+npm -w app run test
+npm -w component run test
+npm -w connection run test
+npm run test:e2e

Based on learnings: Run npm run lint from repo root to lint all packages. Run cd app && npx next lint --fix for auto-fixes in app/.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.claude/skills/next/SKILL.md around lines 52 - 60, Replace the brittle
sequence of cd commands with workspace-scoped invocations and an explicit
app-only fix step: run lint from the repo root (npm run lint) so all packages
are checked, run the app-specific auto-fix with npm -w app run lint -- --fix or
cd app && npx next lint --fix to apply Next.js fixes, build the project from
root (npm run build), run all tests from root (npm test) and explicitly run
package-scoped tests for component and app (npm -w component test and npm -w app
test), and run Playwright from the app workspace (npm -w app run playwright test
or cd app && npx playwright test); also ensure connection/ tests are included in
the root or workspace test script so they run with npm test.

```

Fix any failures. Do not skip.

## Step 6 — Commit
## Step 7 — Commit

Use Conventional Commits: `type(scope): description`
Reference the issue: `Closes #<number>`

## Step 7 — Push and create PR
## Step 8 — Push and create PR

```bash
git push -u origin HEAD
Expand All @@ -71,7 +78,7 @@ gh pr create \
--label '<labels from the issue>'
```

## Step 8 — Report
## Step 9 — Report

Output:

Expand Down
11 changes: 9 additions & 2 deletions .claude/skills/pr/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,20 @@ allowed-tools: Bash(gh *), Bash(git *), Bash(npm *)
- Commits: !`git log origin/dev..HEAD --oneline 2>/dev/null || echo 'No upstream'`
- Changed: !`git diff origin/dev --name-only 2>/dev/null || git diff --name-only`

## Conventions

- Branch prefixes: `feat/`, `fix/`, `chore/`, `docs/`, `refactor/`, `security/`
- Commits: `type(scope): description`
- Scopes: app, component, connection, auth, encryption, migration, api, widget, chart

## Pre-flight (fix failures before creating PR)

1. `git fetch origin && git rebase origin/dev` (PRs always target `dev`)
1. `git fetch origin && git rebase origin/dev` (PRs always target `dev`; exception: target `release/X.Y` if active)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Pre-flight command conflicts with the release-target exception.

The text allows targeting release/X.Y, but the command still always rebases on origin/dev. That can put release PRs on the wrong base.

Suggested fix
-1. `git fetch origin && git rebase origin/dev` (PRs always target `dev`; exception: target `release/X.Y` if active)
+1. `git fetch origin` then rebase onto the intended PR base:
+   - `git rebase origin/dev` (default)
+   - `git rebase origin/release/X.Y` (when targeting release)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
1. `git fetch origin && git rebase origin/dev` (PRs always target `dev`; exception: target `release/X.Y` if active)
1. `git fetch origin` then rebase onto the intended PR base:
- `git rebase origin/dev` (default)
- `git rebase origin/release/X.Y` (when targeting release)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.claude/skills/pr/SKILL.md at line 23, The pre-flight instruction `git fetch
origin && git rebase origin/dev` conflicts with the release-target exception;
update the phrasing (or command example) so it rebases onto the actual PR target
branch instead of always `origin/dev` — e.g., show a conditional or placeholder
such as `git fetch origin && git rebase origin/$(TARGET_BRANCH)` or explain to
use `origin/release/X.Y` when the PR target is a release branch; update the `git
fetch origin && git rebase origin/dev` occurrence in SKILL.md accordingly.

2. `npm run lint`
3. `npm run build`
4. Run tests for affected packages (`cd app && npm test`, `cd component && npm test`)
5. If updating existing PR: `gh pr view <number> --comments` — address CodeRabbit/SonarQube feedback
5. Run E2E if UI changed: `cd app && npx playwright test`
6. If updating existing PR: `gh pr view <number> --comments` — address CodeRabbit/SonarCloud feedback

## Labels (required: type + package)

Expand Down
4 changes: 2 additions & 2 deletions .claude/skills/test/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ allowed-tools: Bash(npm *), Bash(npx *), Bash(git *), Bash(cd *)
## State

- Branch: !`git branch --show-current`
- Changed files: !`git diff --name-only HEAD~1 2>/dev/null || git diff --name-only`
- Changed files: !`git diff --name-only origin/dev..HEAD 2>/dev/null || git diff --name-only`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Refresh base ref before diffing changed files.

Using origin/dev..HEAD without fetching can miss or misclassify changed packages when the local remote ref is stale, which can skip required tests.

Suggested fix
-- Changed files: !`git diff --name-only origin/dev..HEAD 2>/dev/null || git diff --name-only`
+- Changed files: !`git fetch origin dev --quiet 2>/dev/null || true; git diff --name-only origin/dev...HEAD 2>/dev/null || git diff --name-only`
-CHANGED=$(git diff --name-only origin/dev..HEAD 2>/dev/null || git diff --name-only)
+git fetch origin dev --quiet 2>/dev/null || true
+CHANGED=$(git diff --name-only origin/dev...HEAD 2>/dev/null || git diff --name-only)

Also applies to: 24-24

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.claude/skills/test/SKILL.md at line 14, The diff command snippet "Changed
files: !`git diff --name-only origin/dev..HEAD 2>/dev/null || git diff
--name-only`" can use a stale origin/dev; before running that command ensure the
base ref is refreshed (e.g., run a fetch) so changed-package detection is
accurate—update the workflow/script to perform git fetch origin (or git fetch
--all --prune) before evaluating the diff command or compare against a freshly
fetched ref (use FETCH_HEAD or an explicit fetched branch) so the "Changed
files" check reliably detects changes.


## Instructions

Expand All @@ -21,7 +21,7 @@ Detect which packages have changes and run the appropriate test suites.

```bash
# Check which packages have changes
CHANGED=$(git diff --name-only HEAD~1 2>/dev/null || git diff --name-only)
CHANGED=$(git diff --name-only origin/dev..HEAD 2>/dev/null || git diff --name-only)
RUN_APP=false
RUN_COMPONENT=false
RUN_CONNECTION=false
Expand Down
33 changes: 30 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ Rules:
- Run the relevant test suite before and after every change to confirm Red → Green.
- Every new behavior, bug fix, and edge case gets a test.
- Tests live in `__tests__/` next to the file under test, same package.
- See `claude_code_docs/TESTING_APPROACH.md` for suite structure, commands, and patterns.

## Testing Boundaries (app/ package)

Expand Down Expand Up @@ -94,6 +93,7 @@ Playwright E2E with **server-side coverage collection** (`collectServer: true` i

- Conventional Commits: `type(scope): description`.
- Branch from `dev`: `feat/issue-<N>-<slug>`, `fix/issue-<N>-<slug>`, `chore/`, etc.
- **Exception**: when a `release/X.Y` branch is active, branch from and target it instead of `dev`.
- PRs target `dev` (integration) before merging to `main`.
Comment on lines +96 to 97

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Clarify PR target rule for release branches to avoid contradictory guidance.

The release exception says target release/X.Y, but the next rule still says PRs target dev. Please make the default+exception explicit in one place.

Suggested wording
-- PRs target `dev` (integration) before merging to `main`.
+- PRs target `dev` (integration) before merging to `main`.
+- If working on an active `release/X.Y` branch, PRs target that `release/X.Y` branch.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CLAUDE.md` around lines 96 - 97, Combine the default rule and the release
exception into one clear statement so there is no contradiction: replace the
separate lines containing "**Exception**: when a `release/X.Y` branch is active,
branch from and target it instead of `dev`." and "PRs target `dev` (integration)
before merging to `main`." with a single explicit sentence such as "By default,
open PRs targeting `dev` (integration) before merging to `main`; exception: if a
`release/X.Y` branch is active, branch from and target `release/X.Y` instead of
`dev`." Ensure the phrases "`release/X.Y`" and "`dev` (integration)" remain
unchanged so the rule is unambiguous.

- Do not push if tests are failing.
- PRs need labels: type + package + area. See `/github` skill.
Expand All @@ -103,7 +103,7 @@ Playwright E2E with **server-side coverage collection** (`collectServer: true` i

- Read `gh pr view <number> --comments` when resuming work on an existing PR.
- Address all CodeRabbit suggestions or dismiss with justification.
- SonarQube quality gate must pass (coverage, duplications, code smells).
- SonarCloud quality gate must pass (coverage, duplications, code smells).

## Query Safety — DO NOT VIOLATE

Expand Down Expand Up @@ -146,6 +146,33 @@ Includes: SSO, Custom Roles, Connector Labels, Bulk Import, Connector CRUD API,
Forward-only. Idempotent. Advisory lock prevents concurrent runs.
Test version-skip paths. `--skip-migrations` flag exists for emergency debugging.

## Automated Guardrails (Hooks)

The `.claude/settings.json` hooks enforce critical rules automatically:

**PreToolUse (Edit/Write):**
- Package boundary enforcement — blocks cross-package imports
- Query interpolation guard — blocks `${...}` near SQL/Cypher keywords
- Credential logging guard — blocks `console.log` of sensitive variables
- Migration file guard — blocks edits to existing migration files (forward-only)
- ECharts import guard — blocks `import * from 'echarts'`
- SSR guard — blocks chart components without `ssr: false`
- Main branch guard — blocks edits on `main`

**PreToolUse (Bash):**
- Dependency install guard — blocks `npm install/uninstall` without approval
- E2E enforcement — blocks `git commit` if UI files edited but Playwright not run

**PostToolUse:**
- Auto-format + lint on every TypeScript file edit
- E2E marker tracking (marks UI files as needing E2E, clears after playwright runs)
- Coverage threshold warning after test runs

**Session/Lifecycle:**
- SessionStart: branch status, PR info, Docker health check
- Stop: completion checklist (tests run? lint run? screenshots taken?)
- PreCompact: re-injects critical rules after context compaction

Comment on lines +171 to +175

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

The lifecycle hook docs mention phases not present in current hook config.

Stop and PreCompact are documented here, but the provided .claude/settings.json hook config only defines SessionStart for lifecycle hooks. Either add those hooks or remove these bullets to prevent drift.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CLAUDE.md` around lines 171 - 175, The docs list lifecycle hooks Stop and
PreCompact that aren't defined in .claude/settings.json while only SessionStart
exists; update either the documentation or the hook config to match: either
remove the Stop and PreCompact bullets from the "Session/Lifecycle" section or
add corresponding lifecycle entries named "Stop" and "PreCompact" to
.claude/settings.json with the intended behavior (e.g., Stop: completion
checklist, PreCompact: re-inject critical rules) so the documented phases align
with the actual SessionStart/Stop/PreCompact hook names.

## Design Review

Before touching any UI code, read `.claude/skills/design-review/skill.md` — tokens, spacing, typography, color, chart patterns.
Expand Down Expand Up @@ -174,4 +201,4 @@ Agents work together in a pipeline. Each stage gates the next:

### Playwright CLI (for browser agents)

`feature-reviewer` and `ux-crawler` use `npx @playwright/cli` to interact with the running app at `http://localhost:3000`. Ensure Docker is running before invoking them.
`feature-reviewer`, `ux-crawler`, `user-sim-admin`, and `user-sim-creator` use `npx @playwright/cli` to interact with the running app at `http://localhost:3000`. Ensure Docker is running before invoking them.