@mmerterden/multi-agent-pipeline 16.10.1 → 16.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +115 -4
  3. package/README.tr.md +116 -4
  4. package/docs/adr/0001-three-model-triage.md +5 -0
  5. package/docs/features.md +18 -2
  6. package/install/templates/copilot-instructions.md +1 -1
  7. package/package.json +1 -1
  8. package/pipeline/claude-md-template.md +1 -1
  9. package/pipeline/commands/multi-agent/SKILL.md +4 -4
  10. package/pipeline/commands/multi-agent/analysis/SKILL.md +10 -10
  11. package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +2 -2
  12. package/pipeline/commands/multi-agent/autopilot/SKILL.md +1 -1
  13. package/pipeline/commands/multi-agent/build-optimize/SKILL.md +2 -2
  14. package/pipeline/commands/multi-agent/channels/SKILL.md +1 -1
  15. package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +1 -1
  16. package/pipeline/commands/multi-agent/create-jira/SKILL.md +1 -1
  17. package/pipeline/commands/multi-agent/design-check/SKILL.md +2 -2
  18. package/pipeline/commands/multi-agent/help/SKILL.md +6 -6
  19. package/pipeline/commands/multi-agent/language/SKILL.md +3 -3
  20. package/pipeline/commands/multi-agent/local/SKILL.md +1 -1
  21. package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +1 -1
  22. package/pipeline/commands/multi-agent/purge/SKILL.md +2 -2
  23. package/pipeline/commands/multi-agent/resume-local/SKILL.md +4 -4
  24. package/pipeline/commands/multi-agent/review/SKILL.md +10 -9
  25. package/pipeline/commands/multi-agent/review-analysis/SKILL.md +1 -1
  26. package/pipeline/commands/multi-agent/setup/SKILL.md +9 -9
  27. package/pipeline/commands/multi-agent/stack/SKILL.md +12 -13
  28. package/pipeline/lib/extract-conventions.sh +19 -18
  29. package/pipeline/lib/figma-screenshot.sh +107 -7
  30. package/pipeline/lib/md2confluence-v3.py +133 -25
  31. package/pipeline/multi-agent-refs/_account-picker.md +1 -1
  32. package/pipeline/multi-agent-refs/_dev-context.md +2 -2
  33. package/pipeline/multi-agent-refs/_input-parser.md +1 -1
  34. package/pipeline/multi-agent-refs/analysis/evidence.md +4 -4
  35. package/pipeline/multi-agent-refs/analysis/intake.md +112 -36
  36. package/pipeline/multi-agent-refs/analysis/locked.md +5 -4
  37. package/pipeline/multi-agent-refs/analysis/render.md +72 -14
  38. package/pipeline/multi-agent-refs/analysis/review.md +17 -1
  39. package/pipeline/multi-agent-refs/analysis/synthesis.md +7 -7
  40. package/pipeline/multi-agent-refs/analysis-template-corporate.md +15 -4
  41. package/pipeline/multi-agent-refs/analysis-template.md +6 -6
  42. package/pipeline/multi-agent-refs/channels/confluence.md +1 -0
  43. package/pipeline/multi-agent-refs/channels/pr.md +2 -2
  44. package/pipeline/multi-agent-refs/conventions-defaults.md +13 -13
  45. package/pipeline/multi-agent-refs/features/stack-skill-routing.md +1 -1
  46. package/pipeline/multi-agent-refs/knowledge.md +1 -1
  47. package/pipeline/multi-agent-refs/phases/modes.md +1 -1
  48. package/pipeline/multi-agent-refs/phases/phase-0-init.md +10 -6
  49. package/pipeline/multi-agent-refs/phases/phase-2-planning.md +6 -5
  50. package/pipeline/multi-agent-refs/phases/phase-3-dev.md +4 -4
  51. package/pipeline/multi-agent-refs/phases/phase-4-review.md +8 -8
  52. package/pipeline/multi-agent-refs/phases/phase-6-commit.md +7 -7
  53. package/pipeline/multi-agent-refs/picker-contract.md +29 -4
  54. package/pipeline/multi-agent-refs/readiness-review.md +1 -1
  55. package/pipeline/multi-agent-refs/rules.md +4 -4
  56. package/pipeline/multi-agent-refs/{frontend-guide.md → web-guide.md} +2 -2
  57. package/pipeline/schemas/analysis-output.schema.json +1 -1
  58. package/pipeline/schemas/analysis-spec.schema.json +5 -3
  59. package/pipeline/schemas/prefs.schema.json +18 -2
  60. package/pipeline/schemas/reviewer-output.schema.json +1 -1
  61. package/pipeline/schemas/triage-output.schema.json +1 -1
  62. package/pipeline/scripts/anonymize-findings.mjs +1 -1
  63. package/pipeline/scripts/gen-skills-index.mjs +1 -1
  64. package/pipeline/scripts/smoke-cross-cli-behavior.sh +9 -9
  65. package/pipeline/scripts/validate-analysis-doc.mjs +92 -26
  66. package/pipeline/scripts/validate-analysis.mjs +6 -1
  67. package/pipeline/skills/.skills-index.json +2 -2
  68. package/pipeline/skills/shared/README.md +4 -4
  69. package/pipeline/skills/shared/core/multi-agent/SKILL.md +4 -4
  70. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +3 -3
  71. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +1 -1
  72. package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +1 -1
  73. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +4 -4
  74. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -2
  75. package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +1 -1
  76. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +2 -2
  77. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +1 -1
  78. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +11 -12
  79. package/pipeline/skills/skills-index.md +2 -2
@@ -8,7 +8,7 @@ argument-hint: "(none - operates on current repo)"
8
8
 
9
9
  Wraps the vendored `xcode-build-orchestrator` skill (and its 5 specialist analyzers) so iOS users do not have to remember the orchestrator skill name. Recommend-first: no project files are modified without explicit developer approval. All output lands in `.build-benchmark/` in the current repo.
10
10
 
11
- > **Language**: Per `$HOME/.claude/multi-agent-refs/rules.md` Language Application matrix - instruction prose stays English (this file is read as a system prompt). `AskUserQuestion.label` and `header` stay English. `question` and `description` follow `outputLanguage`. The emitted benchmark plan body (the upstream skill controls it) is English by upstream convention.
11
+ > **Language**: Per `$HOME/.claude/multi-agent-refs/rules.md` Language Application matrix - instruction prose stays English (this file is read as a system prompt). `AskUserQuestion.question`, `.options[].label` and `.options[].description` follow `outputLanguage`; only `header` stays English (<=12-char chip). The emitted benchmark plan body (the upstream skill controls it) is English by upstream convention.
12
12
 
13
13
  ## When to use
14
14
 
@@ -25,7 +25,7 @@ Before dispatch, fail fast on non-iOS repos. Detect iOS context via the standard
25
25
  |--------|--------|
26
26
  | `*.xcodeproj` or `*.xcworkspace` in cwd | Proceed to dispatch |
27
27
  | `Package.swift` only (SwiftPM lib, no Xcode project) | Proceed; orchestrator handles `xcodebuild -package-path` |
28
- | Android / Backend / Frontend markers only | Surface a short error: "build-optimize is iOS-only. Detected: <stack>. Use the platform-appropriate perf skill (android-performance / web-performance / etc.) instead." Exit. |
28
+ | Android / Backend / Web markers only | Surface a short error: "build-optimize is iOS-only. Detected: <stack>. Use the platform-appropriate perf skill (android-performance / web-performance / etc.) instead." Exit. |
29
29
  | No recognizable stack | Surface "no iOS project found in cwd" and exit. |
30
30
 
31
31
  ## Steps
@@ -334,7 +334,7 @@ Applying the Jira table to the PR body is the recurring failure of this step: it
334
334
 
335
335
  Secondary artifacts ride along as one-line intents at the bottom of the preview: Wiki page list, wiki → Jira triad comment (when Wiki is selected and the triad is active per `$HOME/.claude/multi-agent-refs/issue-jira-triad.md`), Board status move (`{from} → {to}`), GitHub issue comment + Progress-flag sync (Phase 7 Step 1.5 - same gate, see `$HOME/.claude/multi-agent-refs/phases/phase-7-report.md`).
336
336
 
337
- **Then a single AskUserQuestion** (`question`/`description` in `outputLanguage`; `label`/`header` English):
337
+ **Then a single AskUserQuestion** (`question`/`label`/`description` in `outputLanguage`; `header` English):
338
338
 
339
339
  | Option | Behavior |
340
340
  |---|---|
@@ -12,7 +12,7 @@ Triage of customer-reported errors across the layers the team owns (client apps
12
12
 
13
13
  **Side-effect contract**: may write a local markdown report, post a Confluence page, or add a Jira comment/description - but **never** creates branches, worktrees, commits, or PRs. Stops at the report.
14
14
 
15
- > **Language**: Per `$HOME/.claude/multi-agent-refs/rules.md` Language Application matrix - instruction prose stays English. `AskUserQuestion.label` and `header` stay English. `question` and `description` follow `outputLanguage`. The report body follows `outputLanguage`; Graylog excerpts, verdict tokens, and external payload metadata stay English.
15
+ > **Language**: Per `$HOME/.claude/multi-agent-refs/rules.md` Language Application matrix - instruction prose stays English. `AskUserQuestion.question`, `.options[].label` and `.options[].description` follow `outputLanguage`; only `header` stays English (<=12-char chip). The report body follows `outputLanguage`; Graylog excerpts, verdict tokens, and external payload metadata stay English.
16
16
 
17
17
  ## Locked decisions (do not re-ask)
18
18
 
@@ -10,7 +10,7 @@ argument-hint: "[\"<free-text description>\"] [figma-url] [swagger-url] - all
10
10
 
11
11
  Creates exactly one Jira issue, and only after explicit approval. The issue type (Task / Bug / Story) is asked at the start of every run. No branches, no commits, no worktrees, no pipeline chaining. The draft learns the target project's conventions from its recent same-type issues (summary format, labels, components, priority norms, test-scenario style) and offers active-sprint placement when a sprint is running.
12
12
 
13
- > **Language**: instruction prose here is English. AskUserQuestion `question`/`description` and the issue content (summary + description) follow `prefs.global.outputLanguage`, like every other user-facing payload body (`rules.md` matrix). `label`/`header` stay English.
13
+ > **Language**: instruction prose here is English. AskUserQuestion `question`/`label`/`description` and the issue content (summary + description) follow `prefs.global.outputLanguage`, like every other user-facing payload body (`rules.md` matrix). Only `header` stays English (<=12-char chip).
14
14
 
15
15
  ## Issue types
16
16
 
@@ -16,7 +16,7 @@ Local, on-device design-conformance auditor. It runs the app in a **mock mode**
16
16
  > 1. **`prefs.global.promptLanguage` is always `en`** - this spec and every instruction to the LLM stay English.
17
17
  > 2. **`prefs.global.outputLanguage` is user-selectable** - applies to conversational lines and the human-readable parts of the report. Pass it to `design_report` as `report.lang`; the engine defaults to English and ships an `en` + `tr` label pack, plus per-key `report.labels` overrides.
18
18
  >
19
- > Regardless of `outputLanguage`, these stay English: `AskUserQuestion` labels/headers, branch names, file paths, code identifiers, log lines. Full contract: `$HOME/.claude/multi-agent-refs/rules.md` "Language Application".
19
+ > Regardless of `outputLanguage`, these stay English: `AskUserQuestion` `header` chips, branch names, file paths, code identifiers, log lines. Option `label`s follow `outputLanguage` like the rest of the picker copy. Full contract: `$HOME/.claude/multi-agent-refs/rules.md` "Language Application".
20
20
 
21
21
  ## Scope - `$ARGUMENTS`
22
22
 
@@ -113,7 +113,7 @@ for l in sys.stdin:
113
113
  ```
114
114
  Branch on `supported`:
115
115
  - **`false`** → **HALT**. Show `reason` + that no runtime mock switch / launchable app / mock fixtures were found. Tell the user this module cannot be audited by design-check and stop. Do not fabricate a comparison.
116
- - **`"debug-only"`** → surface an `AskUserQuestion` warning: mocks are compiled into the Debug build via `#if DEBUG` DI, so **variants cannot be toggled at launch** - only the default Debug state is comparable. Options: `{ label: "Continue", description: "Audit the single default Debug state only" }`, `{ label: "Cancel", description: "Stop" }`.
116
+ - **`"debug-only"`** → surface an `AskUserQuestion` warning: mocks are compiled into the Debug build via `#if DEBUG` DI, so **variants cannot be toggled at launch** - only the default Debug state is comparable. Options (label + description in `outputLanguage`): option 1 semantically "Continue" - audit the single default Debug state only; option 2 semantically "Cancel" - stop.
117
117
  - **`true`** → continue. Persist `state.designCheck.mock = <detect result>` (mechanism, activation, variantsHint, evidence).
118
118
  5. **SCENARIO INVENTORY (this is the audit's target set)**:
119
119
  ```
@@ -59,7 +59,7 @@ Pipeline (after Phase 0) - shown as visual cards in terminal:
59
59
  only; a Short run has no plan, autopilot may not ask)
60
60
  Phase 3: Dev -> TDD: test -> code -> build (Sonnet) + build queue
61
61
  Phase 4: Review -> Deterministic gates + parallel AI review + Fable triage
62
- (Claude Code: Fable + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
62
+ (Claude Code: Fable + Opus + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
63
63
  Phase 5: Test -> Optional: switch to branch, test in Xcode
64
64
  (only /multi-agent has it; every autopilot and local entry drops it)
65
65
  Phase 6: Commit -> Commit -> push -> PR + issue body update (never auto-closes)
@@ -239,7 +239,7 @@ Setup:
239
239
 
240
240
  Key Features:
241
241
 
242
- Multi-Platform iOS, Android, Backend, Frontend - auto-detected
242
+ Multi-Platform iOS, Android, Backend, Web - auto-detected
243
243
  Build Queue xcodebuild/Gradle serialized with lock file - parallel safe
244
244
  Stack Aware Auto-detects iOS/Android/Python/Node/Go/Docker, uses the enabled stack plugin's skills
245
245
  Det. Gates Build + lint + test + secret scan BEFORE AI review
@@ -279,7 +279,7 @@ Examples:
279
279
  /multi-agent:autopilot "LoginView dark mode fix" # iOS
280
280
  /multi-agent "Add pagination to /api/users endpoint" # Backend
281
281
  /multi-agent "Fix bottom nav recomposition in HomeScreen" # Android
282
- /multi-agent "Responsive layout broken on tablet" # Frontend, choose Short
282
+ /multi-agent "Responsive layout broken on tablet" # Web, choose Short
283
283
 
284
284
  # Review current diff only
285
285
  /multi-agent:review
@@ -334,7 +334,7 @@ Pipeline (Phase 0'dan sonra) - terminalde görsel kart olarak görünür:
334
334
  etkileşimli; Kısa'da plan yok, autopilot soru soramaz)
335
335
  Phase 3: Dev -> TDD: test -> kod -> build (Sonnet) + build queue
336
336
  Phase 4: Review -> Deterministik kapılar + paralel AI review + Fable triage
337
- (Claude Code: Fable + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
337
+ (Claude Code: Fable + Opus + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
338
338
  Phase 5: Test -> Opsiyonel: branch'e geç, Xcode'da test
339
339
  (yalnız /multi-agent'ta var; her autopilot ve local girişi düşürür)
340
340
  Phase 6: Commit -> Commit -> push -> PR + issue body güncelleme (hiç auto-close yok)
@@ -514,7 +514,7 @@ Setup:
514
514
 
515
515
  Temel Özellikler:
516
516
 
517
- Multi-Platform iOS, Android, Backend, Frontend - otomatik tespit
517
+ Multi-Platform iOS, Android, Backend, Web - otomatik tespit
518
518
  Build Queue xcodebuild/Gradle lock file ile seri - parallel güvenli
519
519
  Stack Aware iOS/Android/Python/Node/Go/Docker algılanır, etkin stack plugin'inin skilleri kullanılır
520
520
  Det. Gates AI review'dan ÖNCE build + lint + test + secret scan
@@ -554,7 +554,7 @@ Quality & Telemetry (advisory, default açık - prefs.global.* ile kapatılabi
554
554
  /multi-agent:autopilot "LoginView dark mode fix" # iOS
555
555
  /multi-agent "Add pagination to /api/users endpoint" # Backend
556
556
  /multi-agent "Fix bottom nav recomposition in HomeScreen" # Android
557
- /multi-agent "Responsive layout broken on tablet" # Frontend, Kısa seç
557
+ /multi-agent "Responsive layout broken on tablet" # Web, Kısa seç
558
558
 
559
559
  # Sadece mevcut diff'i review et
560
560
  /multi-agent:review
@@ -15,9 +15,9 @@ Two-axis language preference for the pipeline:
15
15
  | `promptLanguage` | Interactive prompts during a pipeline run (account picker, project picker, dev-context picker, base-branch picker, branch-name picker, maturity ack, channels picker, Phase 5 test prompt, Phase 6 local-checkout prompt) | `prefs.global.promptLanguage` | **Fixed to `en`** - never toggled by this skill |
16
16
  | `outputLanguage` | Assistant's explanations, status updates, error messages, and pipeline-generated reports rendered to the user (NOT external payloads) | `prefs.global.outputLanguage` | Toggled by this skill |
17
17
 
18
- **Why promptLanguage is fixed:** it governs the picker's structural chrome only - `AskUserQuestion` `label` (button text) and `header` (chip), host error UI, and internal contract identifiers. Those stay English so tooling reads the same across CLIs. Everything a user actually reads follows `outputLanguage`, including the picker `question` and each option's `description`, per the canonical per-field matrix in `multi-agent-refs/rules.md`. A picker whose question is English on a Turkish run is a bug, not the contract.
18
+ **Why promptLanguage is fixed:** it governs the picker's structural chrome only - the `AskUserQuestion` `header` chip, host error UI, and internal contract identifiers. The chip stays English because it is capped at 12 characters and most Turkish equivalents overflow it. Everything a user actually reads follows `outputLanguage`: the picker `question`, each option's `label`, and each option's `description`, per the canonical per-field matrix in `multi-agent-refs/rules.md`. A picker whose question or buttons are English on a Turkish run is a bug, not the contract. The host's own **Other** row is injected by the CLI and stays English on every run; nothing in the pipeline can localize it.
19
19
 
20
- **Always English regardless of either field**: commit messages, PR titles/bodies, Jira comments, wiki pages, reviewer/triage system prompts, agent-log.md payloads, confirmation / error UI exposed by the CLI host.
20
+ **Always English regardless of either field**: commit messages, PR title prefixes (`feat:`, `fix:`), branch names, code identifiers, file paths, `agent-state.json` values, `agent-log.md` payloads, reviewer/triage system prompts, and confirmation / error UI exposed by the CLI host. PR descriptions, Jira comments, GitHub issue comments and wiki/Confluence page **bodies** follow `outputLanguage` - they are written for a human reader, per the `rules.md` matrix.
21
21
 
22
22
  **Follows outputLanguage (localized at install/toggle time)**: the slash-command picker `description` shown by the CLI host autocomplete. Repo and npm files always keep the English `description:`; files shipping a `description-tr:` line get swapped in the INSTALLED `~/.claude/commands/multi-agent/` tree by `localize-commands.mjs` (reversible via a `description-en:` sidecar). `/multi-agent:sync` restores English before mirroring back to the repo.
23
23
 
@@ -109,5 +109,5 @@ Render in the **new** outputLanguage:
109
109
 
110
110
  - `setup.md` Step 0 - first-run language picker (asks only outputLanguage; promptLanguage seeded as `en`)
111
111
  - `prefs.schema.json` - `global.promptLanguage` (fixed `"en"`) and `global.outputLanguage` definitions
112
- - `phase-5-test.md`, `phase-6-commit.md` - interactive prompts follow the per-field matrix: `question` + `description` in `outputLanguage`, `label` + `header` English
112
+ - `phase-5-test.md`, `phase-6-commit.md` - interactive prompts follow the per-field matrix: `question` + `label` + `description` in `outputLanguage`, `header` English
113
113
  - `help.md` - reads outputLanguage to render its own help text
@@ -6,7 +6,7 @@ allowed-tools: Agent, Bash, Read, Write, Edit, Glob, Grep, TaskCreate, TaskUpdat
6
6
 
7
7
  # multi-agent local - Full Pipeline, Local Branch
8
8
 
9
- > **Language (read FIRST)**: Before any status output, read `prefs.global.outputLanguage` and render every conversational line in it. `AskUserQuestion` `label`/`header` stay English, but its `question` and option `description`s render in `outputLanguage`; external payload bodies follow `outputLanguage` too (identifiers, commit messages, branch names stay English). Full contract: `$HOME/.claude/multi-agent-refs/rules.md` "Language Application".
9
+ > **Language (read FIRST)**: Before any status output, read `prefs.global.outputLanguage` and render every conversational line in it. `AskUserQuestion` renders its `question`, option `label`s and option `description`s in `outputLanguage`; only `header` stays English (<=12-char chip); external payload bodies follow `outputLanguage` too (identifiers, commit messages, branch names stay English). Full contract: `$HOME/.claude/multi-agent-refs/rules.md` "Language Application".
10
10
 
11
11
  The full pipeline in normal mode (Plan Approval Gate + parallel review + triage included), running on the **current branch with no worktree**. Dedicated alias for the `multi-agent "task" --local` flag form. Phase 5 (User Test) is skipped because there is no worktree to check the change out from; the other seven phases all run.
12
12
 
@@ -9,7 +9,7 @@ allowed-tools: Agent, Bash, Read, Write, Edit, Glob, Grep, TaskCreate, TaskUpdat
9
9
 
10
10
  **Input**: $ARGUMENTS
11
11
 
12
- > **Language (read FIRST)**: Before any status output, read `prefs.global.outputLanguage` and render every conversational line in it. `AskUserQuestion` `label`/`header` stay English, but its `question` and option `description`s render in `outputLanguage`; external payload bodies follow `outputLanguage` too (identifiers, commit messages, branch names stay English). Full contract: `$HOME/.claude/multi-agent-refs/rules.md` "Language Application".
12
+ > **Language (read FIRST)**: Before any status output, read `prefs.global.outputLanguage` and render every conversational line in it. `AskUserQuestion` renders its `question`, option `label`s and option `description`s in `outputLanguage`; only `header` stays English (<=12-char chip); external payload bodies follow `outputLanguage` too (identifiers, commit messages, branch names stay English). Full contract: `$HOME/.claude/multi-agent-refs/rules.md` "Language Application".
13
13
 
14
14
  Run the full pipeline **without a worktree** and **with every confirmation skipped**. Phase 5 (User Test) does not run (no worktree to check out from, and no interaction), so 7 phases execute. The `autopilot + local` combination - vs `/multi-agent:autopilot` the only difference is no worktree (work stays on the current branch); vs `/multi-agent:local` the only difference is zero interaction.
15
15
 
@@ -27,12 +27,12 @@ audit trail and metrics corpus at the log root are always preserved.
27
27
  2. **First confirmation** - native `AskUserQuestion` picker (no typed keyword),
28
28
  in `outputLanguage`, including the dry-run counts:
29
29
  - `question`: "Wipe the listed worktrees, branches, and counter?"
30
- - `header`: "Purge" · `options`: `{ label: "Continue", description: "Proceed to the final confirmation" }`, `{ label: "Cancel", description: "Abort, change nothing" }`
30
+ - `header`: "Purge" (English, <=12 chars) · `options` (label + description in `outputLanguage`; the names below are the option SEMANTICS, not strings to print): option 1 "Continue" - proceed to the final confirmation; option 2 "Cancel" - abort, change nothing
31
31
  - **Cancel** → exit.
32
32
 
33
33
  3. **Second confirmation** (paranoia gate) - a second `AskUserQuestion` picker:
34
34
  - `question`: "This is irreversible. Permanently wipe every worktree, branch, and state now?" (`outputLanguage`)
35
- - `header`: "Confirm" · `options`: `{ label: "Purge permanently", description: "Delete all worktrees, branches, and the counter" }`, `{ label: "Cancel", description: "Abort, change nothing" }`
35
+ - `header`: "Confirm" (English, <=12 chars) · `options` (label + description in `outputLanguage`; the names below are the option SEMANTICS, not strings to print): option 1 "Purge permanently" - delete all worktrees, branches, and the counter; option 2 "Cancel" - abort, change nothing
36
36
  - Anything other than **Purge permanently** → cancel.
37
37
 
38
38
  4. **Remote branches** - ask once whether to delete the remote branches too;
@@ -6,7 +6,7 @@ allowed-tools: Agent, Bash, Read, Write, Edit, Glob, Grep, TaskCreate, TaskUpdat
6
6
 
7
7
  # multi-agent resume-local - Take Existing Branch Work Through the Pipeline Tail
8
8
 
9
- > **Language (read FIRST)**: Before any status output, read `prefs.global.outputLanguage` and render every conversational line in it. `AskUserQuestion` `label`/`header` stay English, but its `question` and option `description`s render in `outputLanguage`; external payload bodies follow `outputLanguage` too (identifiers, commit messages, branch names stay English). Full contract: `$HOME/.claude/multi-agent-refs/rules.md` "Language Application".
9
+ > **Language (read FIRST)**: Before any status output, read `prefs.global.outputLanguage` and render every conversational line in it. `AskUserQuestion` renders its `question`, option `label`s and option `description`s in `outputLanguage`; only `header` stays English (<=12-char chip); external payload bodies follow `outputLanguage` too (identifiers, commit messages, branch names stay English). Full contract: `$HOME/.claude/multi-agent-refs/rules.md` "Language Application".
10
10
 
11
11
  You already did the work locally - wrote code on the current branch and maybe tested it by hand, or committed it outside the pipeline entirely. (As of v14.0.0 a Short run reviews its own output, so this command is for work that had no pipeline run behind it, not a patch for a mode that skipped review.) `/multi-agent:resume-local` picks up from there and runs the **pipeline tail** over that existing local work in one command: parallel review, a build + test success gate, commit/push + PR, then the technical analysis and a **Jira comment with test scenarios**. It does NOT re-develop - Analysis / Planning / Dev (phases 1-3) are intentionally skipped; the diff already on the branch IS the input.
12
12
 
@@ -34,7 +34,7 @@ You already did the work locally - wrote code on the current branch and maybe
34
34
 
35
35
  ```
36
36
  Phase 0: Init → project/branch detect, resolve base + diff (work-already-done), Jira id, state (NO worktree)
37
- Phase 4: Review → deterministic gates + parallel review (Fable + Sonnet) + Fable triage
37
+ Phase 4: Review → deterministic gates + parallel review (Fable + Opus + Sonnet) + Fable triage
38
38
  Phase 5: Build+Test → stack-aware build gate + run existing tests; SUCCESS required (automated, not the interactive user-test)
39
39
  Phase 6: Commit → commit remaining local changes + push + open PR if none exists
40
40
  Phase 7: Report → technical analysis + Jira comment with test scenarios (channels: Jira / PR / Confluence / Wiki)
@@ -52,10 +52,10 @@ Phases 1-3 (Analysis / Planning / Dev) are skipped by design - `ship` treats t
52
52
 
53
53
  ## Phase execution (reuse the existing phase contracts)
54
54
 
55
- - **Phase 4 Review** - run per `$HOME/.claude/multi-agent-refs/phases/phase-4-review.md` against the resolved diff: deterministic gates (Step 1.x), stack-specific parallel reviewers (Fable + Sonnet on Claude Code; GPT + Opus + Sonnet on Copilot CLI), Fable triage → `triage.accepted`. Blocking/important accepted findings:
55
+ - **Phase 4 Review** - run per `$HOME/.claude/multi-agent-refs/phases/phase-4-review.md` against the resolved diff: deterministic gates (Step 1.x), stack-specific parallel reviewers (Fable + Opus + Sonnet on Claude Code; GPT + Opus + Sonnet on Copilot CLI), Fable triage → `triage.accepted`. Blocking/important accepted findings:
56
56
  - interactive: present them and ask (`AskUserQuestion`) whether to fix now (loop back through a minimal Phase-3-style TDD fix) or proceed;
57
57
  - `autopilot` (or `prefs.global.resumeLocal.autoFix == true`): auto-fix accepted blocking/important findings, then re-review the fix, before advancing.
58
- - **Phase 5 Build+Test** - the **automated success gate** (this is what "build+test success" means here; the interactive device user-test is `/multi-agent:manual-test`). Stack-aware: build via `figma-config.build` (iOS scheme / Android gradle / detected backend/frontend build) and run the existing test suite if present (`swift test` / `xcodebuild test` / `./gradlew test` / `pytest` / `npm test` / `vitest`). Require success to advance; on failure, surface logs and (interactive) stop or (autopilot) attempt a bounded fix loop. **If the repo has no tests, report "no tests present" - never fabricate test results.**
58
+ - **Phase 5 Build+Test** - the **automated success gate** (this is what "build+test success" means here; the interactive device user-test is `/multi-agent:manual-test`). Stack-aware: build via `figma-config.build` (iOS scheme / Android gradle / detected backend/web build) and run the existing test suite if present (`swift test` / `xcodebuild test` / `./gradlew test` / `pytest` / `npm test` / `vitest`). Require success to advance; on failure, surface logs and (interactive) stop or (autopilot) attempt a bounded fix loop. **If the repo has no tests, report "no tests present" - never fabricate test results.**
59
59
  - **Phase 6 Commit/PR** - per `$HOME/.claude/multi-agent-refs/phases/phase-6-commit.md`: stage + commit any remaining local changes with a conventional message (`{type}(scope): desc [{JIRA_KEY}-{id}]`), push, and open a PR **only if one does not already exist** for the branch. PR body per `$HOME/.claude/multi-agent-refs/rules.md "External System Outputs"` and `$HOME/.claude/rules/git-conventions.md` - `Ref: #N` / `Related: #N`, never `Closes/Fixes/Resolves`; NO AI/bot attribution anywhere.
60
60
  - **Phase 7 Report** - per `$HOME/.claude/multi-agent-refs/phases/phase-7-report.md` + `channels.md`: produce the **technical analysis** and **test scenarios**, then post to the configured channels. Default content for `ship`: a Jira **comment** carrying the technical analysis + the test scenarios (and, when the PR was opened, the PR description). Every body runs through the humanizer; bot/tool/AI signatures are FORBIDDEN in comments.
61
61
 
@@ -1,6 +1,6 @@
1
1
  ---
2
- description: "Run parallel review on a branch's diff or a Pull Request: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). On PR input, posts per-finding inline comments and sets approve/needs-work review state. Use when a branch diff or a pull request needs reviewing before it merges."
3
- description-tr: "Bir branch diff'i veya Pull Request üzerinde paralel review koşar: Claude Code'da 2 model (Fable + Sonnet), Copilot CLI'da 3 model (GPT + Opus + Sonnet). PR girdisinde bulgu başına inline yorum atar ve approve/needs-work durumunu işaretler."
2
+ description: "Run parallel review on a branch's diff or a Pull Request: 3 models on Claude Code (Fable + Opus + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). On PR input, posts per-finding inline comments and sets approve/needs-work review state. Use when a branch diff or a pull request needs reviewing before it merges."
3
+ description-tr: "Bir branch diff'i veya Pull Request üzerinde paralel review koşar: Claude Code'da 3 model (Fable + Opus + Sonnet), Copilot CLI'da 3 model (GPT + Opus + Sonnet). PR girdisinde bulgu başına inline yorum atar ve approve/needs-work durumunu işaretler."
4
4
  argument-hint: "[#N | repo#N | PR-URL | branch] - optional: PR by number/URL, repo+number, or local branch. Supports GitHub and Bitbucket Server URLs. If omitted (interactive), open GitHub + Bitbucket PRs are listed for multi-select; autopilot falls back to the current branch."
5
5
  ---
6
6
 
@@ -175,7 +175,7 @@ Scope note: a guide governs only files under its own directory - a guide found
175
175
 
176
176
  ### 3. Launch parallel reviewers - host-CLI dependent
177
177
 
178
- **Claude Code (2 in parallel):**
178
+ **Claude Code (3 in parallel):**
179
179
  - Agent 1: `claude-fable-5` → security + architecture
180
180
  - Agent 2: `claude-sonnet-5` → general quality
181
181
 
@@ -242,18 +242,19 @@ Optional opt-out prompt (interactive mode only; autopilot skips and posts):
242
242
  ```
243
243
  question (outputLanguage): "PR #{N} için review action gönderilsin mi?"
244
244
  header (English): "Post review"
245
- options:
246
- - label "Post review", description (outputLanguage): "Bulgular varsa inline yorum + Request changes; yoksa Approve"
247
- - label "Chat only", description (outputLanguage): "Sadece sohbet özetiyle yetin, PR'a dokunma"
248
- default: option 1 (Post review)
245
+ options (label + description in outputLanguage; semantics, not literals):
246
+ - option 1 - "Post review": inline comments + Request changes when there are
247
+ findings, Approve when there are none
248
+ - option 2 - "Chat only": leave the PR untouched, the chat summary is enough
249
+ default: option 1
249
250
  ```
250
251
 
251
252
  Defaults:
252
- - Interactive mode: prompt with default `Post review`
253
+ - Interactive mode: prompt with default option 1
253
254
  - Autopilot mode: auto-post (no prompt)
254
255
  - `--no-comment` / `--no-post` flag: skip the post entirely
255
256
 
256
- If the user picks "Post review":
257
+ If the user picks option 1 (post the review):
257
258
 
258
259
  ```bash
259
260
  bash $HOME/.claude/lib/post-pr-review.sh "$TASK_ID"
@@ -16,7 +16,7 @@ Read `$HOME/.claude/multi-agent-refs/analysis/review.md` and execute it:
16
16
 
17
17
  1. **Resolve** the document from a local path, a Confluence URL or `pageId`, or a Jira key. With no argument, offer the recent analyses from `~/Desktop/multiAgentAnalysis/` and from each selected repo's `analysis/`, newest first.
18
18
  2. **Deterministic gates first**: `validate-analysis-doc.mjs` on the document, and `build-references.mjs --check` when the run's state JSON is available (`--state`, or a fresh analysis). Their output is reported verbatim, before any model reads the document. A finding a script already proves does not need an opinion.
19
- 3. **Parallel model review** against the rubric (buildability, evidence, spine, altitude, admitted gaps, contradiction), CLI-aware: 2 models on Claude Code, 3 on Copilot CLI.
19
+ 3. **Parallel model review** against the rubric (buildability, evidence, spine, altitude, admitted gaps, contradiction), CLI-aware: 3 models on Claude Code, 3 on Copilot CLI.
20
20
  4. **Fable triage** into Blocker / Important / Suggestion, dropping duplicates and anything the document answers elsewhere.
21
21
  5. **Report**, naming the profile it judged against and, explicitly, what was NOT checked.
22
22
  6. **Output** on request only: chat (default), Confluence comment, Jira comment, or a `-review.md` beside the document.
@@ -24,7 +24,7 @@ Ask BEFORE anything else, so every subsequent setup prompt and the rest of the p
24
24
 
25
25
  | Axis | What it controls | Configurable? |
26
26
  |---|---|---|
27
- | `promptLanguage` | The picker's structural UI chrome only: `AskUserQuestion` `label` (button text) and `header` (chip), plus host error UI and internal contract identifiers | **No - fixed to `en`.** Button and chip text stays English so tooling reads the same across CLIs. |
27
+ | `promptLanguage` | Picker chrome only: the `AskUserQuestion` `header` chip, host error UI, internal contract identifiers | **No - fixed to `en`.** The chip is capped at 12 chars, which most Turkish equivalents overflow. |
28
28
  | `outputLanguage` | The assistant's non-interactive explanations, status updates, error messages, and pipeline-generated reports rendered to the user | Yes - set here and changeable later via `/multi-agent:language <en\|tr>` |
29
29
 
30
30
  `promptLanguage` is seeded as `"en"` and never offered to the user. **External payloads always stay English** (commits, PR titles/bodies, Jira comments, wiki content, reviewer/triage prompts, agent-log.md).
@@ -53,21 +53,20 @@ Select (1-2):
53
53
 
54
54
  From this point forward, every prompt in Steps 1-6 below follows the canonical
55
55
  per-field matrix in `$HOME/.claude/multi-agent-refs/rules.md` ("Language Application"):
56
- the `question` text and each option's `description` render in `outputLanguage`, while
57
- `label` and `header` stay English. The wizard's status text and post-setup summary
58
- render in `outputLanguage`. External payloads remain English.
56
+ `question`, `label` and `description` render in `outputLanguage`; `header` stays
57
+ English. Wizard status and the post-setup summary follow `outputLanguage`. External
58
+ payloads remain English.
59
59
 
60
60
  > This paragraph used to say every prompt renders in English "per the fixed
61
61
  > `promptLanguage`", which contradicted the canonical matrix and produced
62
62
  > half-English pickers on Turkish runs: `promptLanguage` governs only the button and
63
63
  > chip chrome, never the question a user reads.
64
64
 
65
- ### Step 0.5 - Credential Backend Check
66
-
67
- Before discovery, verify the platform's credential backend is available:
65
+ ### Step 0.5 - Dependency check
68
66
 
69
67
  ```bash
70
68
  ~/.claude/lib/credential-store.sh doctor
69
+ command -v pdftotext >/dev/null 2>&1 || echo "pdftotext: MISSING"
71
70
  ```
72
71
 
73
72
  | Output | Action |
@@ -76,6 +75,7 @@ Before discovery, verify the platform's credential backend is available:
76
75
  | Linux: `secret-tool ✗ MISSING` | Prompt: `sudo apt install libsecret-tools` (Debian/Ubuntu) or `sudo dnf install libsecret` (Fedora). Re-run setup after install. |
77
76
  | Windows: `CredentialManager ✗ MISSING` | Prompt: `Install-Module CredentialManager -Scope CurrentUser -Force` in an elevated PowerShell. Re-run setup. |
78
77
  | Platform `unknown` | Halt - credential storage cannot proceed. |
78
+ | `pdftotext: MISSING` | Advisory. Print `brew install poppler` (or distro equivalent), continue. `.docx` needs nothing. |
79
79
 
80
80
  ### Credential Key Naming Rule
81
81
 
@@ -316,7 +316,7 @@ Expired / rejected token (401 / 403 mid-run) - the Expired-token decision from
316
316
  Select:
317
317
  ```
318
318
 
319
- Render `question` + `description` in `outputLanguage`; `label` + `header` English. The picked label is a choice, never the secret - the value still enters via Step B clipboard.
319
+ Render `question` + `label` + `description` in `outputLanguage`; `header` English. Names below are option semantics, not strings to print. The picked option is a choice, never the secret: the value enters via Step B clipboard.
320
320
 
321
321
  - **Skip** (missing `[2]` / expired `[3]`) → skip semantics. During setup: `keychainMapping` stays `null`. During Phase 0 / mid-run: abort that service's contribution, warn and continue if non-critical, halt if critical (e.g. Jira token for Jira input).
322
322
  - **Add now** / **Regenerate** → proceed to Step B (clipboard save). Regenerate reuses the same `{KEY_NAME}`.
@@ -835,6 +835,6 @@ Stack skills ship as versioned plugins in the `{owner}/multi-agent-plugins` mark
835
835
  - `requirements.txt` / `pyproject.toml` / server `package.json` → `ai-backend-toolkit`
836
836
  - **no clear marker → default `ai-ios-toolkit`**
837
837
  `ai-common-toolkit@multi-agent-plugins` and `ai-analyst-toolkit@multi-agent-plugins` are always set `true` alongside the stack plugin: neither is stack-specific.
838
- 3. Report the enabled set. To change later, run `/multi-agent:stack <ios|android|frontend|backend|...>` in the repo. Pipeline Phase 1 auto-detects the stack for its own routing regardless of enablement.
838
+ 3. Report the enabled set. To change later, run `/multi-agent:stack <ios|android|web|backend|...>` in the repo. Pipeline Phase 1 auto-detects the stack for its own routing regardless of enablement.
839
839
 
840
840
  The marketplace repo name (`multi-agent-plugins`) is generic; a different org points `{owner}` at its own fork - nothing in the pipeline is coupled to a specific account.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: "Select the active stack(s) for this repo by enabling the matching marketplace plugin(s) in .claude/settings.json. Multi-select: pass several stacks (ios backend) or pick them in the native picker. Use when a repo's stack changed or the wrong plugins are enabled for it."
3
3
  description-tr: "Bu repo için aktif stack'leri seçer: eşleşen marketplace plugin'lerini .claude/settings.json'da etkinleştirir. Çoklu seçim: birden fazla stack yazılabilir (ios backend) ya da native picker'dan seçilir."
4
- argument-hint: "[ios|android|frontend|web|backend|mobile|fullstack|all ...]"
4
+ argument-hint: "[ios|android|web|frontend|backend|mobile|fullstack|all ...]"
5
5
  allowed-tools: Bash, Read, Edit, Write, AskUserQuestion
6
6
  ---
7
7
 
@@ -22,8 +22,8 @@ This replaces the old `stack-swap.sh` mechanic that physically moved skill direc
22
22
  /multi-agent:stack android # Compose toolkit + common
23
23
  /multi-agent:stack mobile # alias: ios + android + common
24
24
  /multi-agent:stack backend # Python / Node spec-driven toolkit + common
25
- /multi-agent:stack frontend # React / TSX toolkit + common (alias: web)
26
- /multi-agent:stack fullstack # alias: frontend + backend + common
25
+ /multi-agent:stack web # React / TSX toolkit + common (alias: frontend)
26
+ /multi-agent:stack fullstack # alias: web + backend + common
27
27
  /multi-agent:stack all # all four stack toolkits + common
28
28
  ```
29
29
 
@@ -33,7 +33,7 @@ This replaces the old `stack-swap.sh` mechanic that physically moved skill direc
33
33
  |---|---|
34
34
  | `ios` | `ai-common-toolkit`, `ai-analyst-toolkit`, `ai-ios-toolkit` |
35
35
  | `android` | `ai-common-toolkit`, `ai-analyst-toolkit`, `ai-android-toolkit` |
36
- | `frontend` / `web` | `ai-common-toolkit`, `ai-analyst-toolkit`, `ai-frontend-toolkit` |
36
+ | `web` / `frontend` | `ai-common-toolkit`, `ai-analyst-toolkit`, `ai-frontend-toolkit` |
37
37
  | `backend` | `ai-common-toolkit`, `ai-analyst-toolkit`, `ai-backend-toolkit` |
38
38
  | `mobile` | common + `ai-ios-toolkit` + `ai-android-toolkit` |
39
39
  | `fullstack` | common + `ai-frontend-toolkit` + `ai-backend-toolkit` |
@@ -46,10 +46,10 @@ Multiple args union their plugin sets: `ios backend` → common + iOS + backend.
46
46
  1. **No arg → native multi-select picker.** Read `.claude/settings.json` (repo) + `~/.claude/settings.json` (global) to learn the current state, then ask with `AskUserQuestion` (`multiSelect: true`) - NEVER a numbered text menu:
47
47
  - `question` (in `outputLanguage`): which stacks should be active in this repo, noting the currently enabled ones
48
48
  - `header`: "Stacks" (English, UI contract)
49
- - `options` (4): `ios` / `android` / `frontend (web)` / `backend`, each `description` (in `outputLanguage`) naming the plugin it enables and marking the ones already enabled with "(currently on)" / "(şu an açık)"
50
- - Map each selected label back to its canonical arg before step 2: the token before any parenthesis (`frontend (web)` → `frontend`).
49
+ - `options` (4): `ios` / `android` / `web` / `backend`, each `description` (in `outputLanguage`) naming the plugin it enables and marking the ones already enabled with "(currently on)" / "(şu an açık)"
50
+ - Map each selected label back to its canonical arg before step 2: the token before any parenthesis.
51
51
  - Empty selection or cancel → **status mode**: print the currently enabled `@multi-agent-plugins` plugins and exit without modifying anything. Status mode never runs the Implementation block below - that block is enable-mode only.
52
- 2. **Arg(s) present → enable mode.** Accept multiple space-separated stacks. Resolve each through the alias table (`web`→`frontend`, `mobile`→`ios android`, `fullstack`→`frontend backend`, `all`→every stack), union the plugin sets, then write the **current repo's** `.claude/settings.json`.
52
+ 2. **Arg(s) present → enable mode.** Accept multiple space-separated stacks. Resolve each through the alias table (`frontend`→`web`, `mobile`→`ios android`, `fullstack`→`web backend`, `all`→every stack), union the plugin sets, then write the **current repo's** `.claude/settings.json`.
53
53
  3. **Write rules:**
54
54
  - every plugin in the union is set to `true`
55
55
  - every stack toolkit **not** in the union is set to `false` (leave non-`@multi-agent-plugins` entries untouched)
@@ -74,7 +74,7 @@ COMMON="ai-common-toolkit@${MP}"
74
74
  ANALYST="ai-analyst-toolkit@${MP}"
75
75
  IOS="ai-ios-toolkit@${MP}"
76
76
  ANDROID="ai-android-toolkit@${MP}"
77
- FRONTEND="ai-frontend-toolkit@${MP}"
77
+ WEB="ai-frontend-toolkit@${MP}"
78
78
  BACKEND="ai-backend-toolkit@${MP}"
79
79
 
80
80
  # Enable-mode only: with zero args the write rules below would set every stack
@@ -91,13 +91,12 @@ for ARG in "$@"; do
91
91
  case "$ARG" in
92
92
  ios) ON="$ON $IOS" ;;
93
93
  android) ON="$ON $ANDROID" ;;
94
- frontend|web) ON="$ON $FRONTEND" ;;
95
- "frontend (web)") ON="$ON $FRONTEND" ;;
94
+ web|frontend) ON="$ON $WEB" ;;
96
95
  backend) ON="$ON $BACKEND" ;;
97
96
  mobile) ON="$ON $IOS $ANDROID" ;;
98
- fullstack) ON="$ON $FRONTEND $BACKEND" ;;
99
- all) ON="$ON $IOS $ANDROID $FRONTEND $BACKEND" ;;
100
- *) echo "Unknown stack '$ARG'. One of: ios android mobile backend frontend web fullstack all"; exit 1 ;;
97
+ fullstack) ON="$ON $WEB $BACKEND" ;;
98
+ all) ON="$ON $IOS $ANDROID $WEB $BACKEND" ;;
99
+ *) echo "Unknown stack '$ARG'. One of: ios android mobile backend web fullstack all"; exit 1 ;;
101
100
  esac
102
101
  done
103
102
  ```
@@ -6,7 +6,7 @@
6
6
  #
7
7
  # Usage:
8
8
  # extract-conventions.sh <repo-path> <platform>
9
- # Platform: ios | android | backend | frontend
9
+ # Platform: ios | android | backend | web ('frontend' accepted as the pre-rename alias)
10
10
  #
11
11
  # Output schema (per bucket):
12
12
  # { pattern, example, confidence, evidenceFiles[], alternativeCandidates[] }
@@ -28,9 +28,10 @@ if [ ! -d "$REPO_PATH" ]; then
28
28
  fi
29
29
 
30
30
  case "$PLATFORM" in
31
- ios|android|backend|frontend) ;;
31
+ frontend) PLATFORM=web ;;
32
+ ios|android|backend|web) ;;
32
33
  *)
33
- echo "extract-conventions: invalid platform: $PLATFORM (expected ios|android|backend|frontend)" >&2
34
+ echo "extract-conventions: invalid platform: $PLATFORM (expected ios|android|backend|web)" >&2
34
35
  exit 1
35
36
  ;;
36
37
  esac
@@ -100,7 +101,7 @@ scan_roots() {
100
101
  [ -d "$REPO_PATH/$d" ] && roots+=("$REPO_PATH/$d")
101
102
  done
102
103
  ;;
103
- frontend)
104
+ web)
104
105
  for d in src app components features lib hooks pages; do
105
106
  [ -d "$REPO_PATH/$d" ] && roots+=("$REPO_PATH/$d")
106
107
  done
@@ -341,7 +342,7 @@ bucket_folder_structure() {
341
342
  empty_bucket
342
343
  fi
343
344
  ;;
344
- frontend)
345
+ web)
345
346
  local feats
346
347
  feats=$(run_find -type d -name 'features' 2>/dev/null | head -10)
347
348
  if [ -z "$feats" ]; then
@@ -439,7 +440,7 @@ bucket_state_holder() {
439
440
  backend)
440
441
  empty_bucket
441
442
  ;;
442
- frontend)
443
+ web)
443
444
  # Look for hooks (useXxx) or stores
444
445
  local files
445
446
  files=$(run_find -type f \( -name '*.ts' -o -name '*.tsx' -o -name '*.js' -o -name '*.jsx' \) 2>/dev/null || true)
@@ -480,7 +481,7 @@ bucket_view_naming() {
480
481
  backend)
481
482
  empty_bucket
482
483
  ;;
483
- frontend)
484
+ web)
484
485
  local files
485
486
  files=$(run_find -type f \( -name '*.tsx' -o -name '*.jsx' \) 2>/dev/null || true)
486
487
  if [ -z "$files" ]; then empty_bucket; return; fi
@@ -522,7 +523,7 @@ bucket_navigator_naming() {
522
523
  backend)
523
524
  empty_bucket
524
525
  ;;
525
- frontend)
526
+ web)
526
527
  empty_bucket
527
528
  ;;
528
529
  esac
@@ -542,7 +543,7 @@ bucket_usecase_naming() {
542
543
  backend)
543
544
  emit_naming_bucket "*.py" "" "Service" "Handler"
544
545
  ;;
545
- frontend)
546
+ web)
546
547
  # useFooQuery / useFooMutation as a proxy
547
548
  local files cnt sample
548
549
  files=$(run_find -type f \( -name '*.ts' -o -name '*.tsx' \) 2>/dev/null || true)
@@ -573,7 +574,7 @@ bucket_repository_naming() {
573
574
  backend)
574
575
  emit_naming_bucket "*.py" "" "Repository" "Dao"
575
576
  ;;
576
- frontend)
577
+ web)
577
578
  emit_naming_bucket "*.ts" "" "Api" "Client"
578
579
  ;;
579
580
  esac
@@ -593,7 +594,7 @@ bucket_dto_naming() {
593
594
  backend)
594
595
  emit_naming_bucket "*.py" "" "Response" "Request" "In" "Out"
595
596
  ;;
596
- frontend)
597
+ web)
597
598
  emit_naming_bucket "*.ts" "" "Dto" "Response" "Request"
598
599
  ;;
599
600
  esac
@@ -640,7 +641,7 @@ bucket_ui_state_model() {
640
641
  empty_bucket
641
642
  return
642
643
  ;;
643
- frontend)
644
+ web)
644
645
  local hook_files
645
646
  hook_files=$(run_find -type f \( -name 'use*.ts' -o -name 'use*.tsx' \) 2>/dev/null | head -50 || true)
646
647
  if [ -z "$hook_files" ]; then empty_bucket; return; fi
@@ -689,7 +690,7 @@ bucket_test_method_naming() {
689
690
  backend)
690
691
  test_files=$(run_find -type f -name 'test_*.py' 2>/dev/null | head -20 || true)
691
692
  ;;
692
- frontend)
693
+ web)
693
694
  test_files=$(run_find -type f \( -name '*.test.ts' -o -name '*.test.tsx' -o -name '*.spec.ts' -o -name '*.spec.tsx' \) 2>/dev/null | head -20 || true)
694
695
  ;;
695
696
  esac
@@ -709,7 +710,7 @@ bucket_test_method_naming() {
709
710
  backend)
710
711
  underscore_count=$((underscore_count + $(count_matches -E '^def +test_[a-z0-9_]+' "$f")))
711
712
  ;;
712
- frontend)
713
+ web)
713
714
  it_count=$((it_count + $(count_matches -E "(it|test)\\(['\"\`]" "$f")))
714
715
  ;;
715
716
  esac
@@ -739,7 +740,7 @@ bucket_test_method_naming() {
739
740
  empty_bucket
740
741
  fi
741
742
  ;;
742
- frontend)
743
+ web)
743
744
  if [ "$it_count" -gt 0 ]; then
744
745
  emit_bucket "it/test sentence" "it('returns error when email invalid', ...)" "$(confidence_for "$it_count")" "$evidence_json" '["describe-it","test-only"]'
745
746
  else
@@ -837,7 +838,7 @@ bucket_accessibility_identifier() {
837
838
  empty_bucket
838
839
  fi
839
840
  ;;
840
- frontend)
841
+ web)
841
842
  local files ids
842
843
  files=$(run_find -type f \( -name '*.tsx' -o -name '*.jsx' \) 2>/dev/null | head -100 || true)
843
844
  if [ -z "$files" ]; then empty_bucket; return; fi
@@ -901,7 +902,7 @@ bucket_localization_key() {
901
902
  ;;
902
903
  backend)
903
904
  empty_bucket; return ;;
904
- frontend)
905
+ web)
905
906
  local json_files
906
907
  json_files=$(run_find -type f -path '*i18n*' -name '*.json' 2>/dev/null | head -5 || true)
907
908
  if [ -n "$json_files" ]; then
@@ -1002,7 +1003,7 @@ bucket_di_registration() {
1002
1003
  empty_bucket
1003
1004
  fi
1004
1005
  ;;
1005
- frontend)
1006
+ web)
1006
1007
  files=$(run_find -type f \( -name '*.tsx' -o -name '*.ts' \) 2>/dev/null || true)
1007
1008
  if [ -z "$files" ]; then empty_bucket; return; fi
1008
1009
  local context_count zustand_count hook_count