@execuro-sw-ecosystem/sw-ecosystem-agentic-harness 0.1.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 (124) hide show
  1. package/.mcp.json +8 -0
  2. package/CHANGELOG.md +78 -0
  3. package/CONTRIBUTING.md +54 -0
  4. package/LICENSE +21 -0
  5. package/README.md +304 -0
  6. package/SECURITY.md +50 -0
  7. package/agents/sw-admin-frontend-developer.md +52 -0
  8. package/agents/sw-php-backend-developer.md +63 -0
  9. package/agents/sw-product-manager.md +62 -0
  10. package/agents/sw-qa-engineer.md +160 -0
  11. package/agents/sw-shopware-architect.md +79 -0
  12. package/agents/sw-storefront-developer.md +93 -0
  13. package/agents/sw-tender-editor.md +43 -0
  14. package/bin/cli.mjs +73 -0
  15. package/codex/agents/sw-admin-frontend-developer.toml +54 -0
  16. package/codex/agents/sw-php-backend-developer.toml +65 -0
  17. package/codex/agents/sw-product-manager.toml +66 -0
  18. package/codex/agents/sw-qa-engineer.toml +161 -0
  19. package/codex/agents/sw-shopware-architect.toml +81 -0
  20. package/codex/agents/sw-storefront-developer.toml +96 -0
  21. package/codex/agents/sw-tender-editor.toml +50 -0
  22. package/content/AGENTS.md +63 -0
  23. package/content/claude-settings.json +31 -0
  24. package/content/mcp-servers.json +18 -0
  25. package/copilot/agents/sw-admin-frontend-developer.agent.md +53 -0
  26. package/copilot/agents/sw-php-backend-developer.agent.md +64 -0
  27. package/copilot/agents/sw-product-manager.agent.md +65 -0
  28. package/copilot/agents/sw-qa-engineer.agent.md +160 -0
  29. package/copilot/agents/sw-shopware-architect.agent.md +80 -0
  30. package/copilot/agents/sw-storefront-developer.agent.md +94 -0
  31. package/copilot/agents/sw-tender-editor.agent.md +46 -0
  32. package/lib/actions.mjs +449 -0
  33. package/lib/commands.mjs +446 -0
  34. package/lib/companions.mjs +117 -0
  35. package/lib/content.mjs +101 -0
  36. package/lib/fsx.mjs +188 -0
  37. package/lib/guide.mjs +98 -0
  38. package/lib/hosts.mjs +283 -0
  39. package/lib/lock.mjs +158 -0
  40. package/lib/merge.mjs +338 -0
  41. package/lib/out.mjs +74 -0
  42. package/mcp.json +10 -0
  43. package/package.json +58 -0
  44. package/plugin.json +19 -0
  45. package/skills/sw-design-requirements/SKILL.md +102 -0
  46. package/skills/sw-design-requirements/reference/clarification-loop.md +20 -0
  47. package/skills/sw-design-requirements/reference/confidence-rubric.md +82 -0
  48. package/skills/sw-design-requirements/reference/consistency-probes.md +65 -0
  49. package/skills/sw-design-requirements/reference/editor-gate.md +15 -0
  50. package/skills/sw-design-requirements/reference/editor-mode.md +15 -0
  51. package/skills/sw-design-requirements/reference/prd-confidence-checklist.md +95 -0
  52. package/skills/sw-design-requirements/reference/prd-template.md +153 -0
  53. package/skills/sw-design-requirements/reference/readiness-and-report.md +21 -0
  54. package/skills/sw-design-requirements/reference/splitting-guidelines.md +69 -0
  55. package/skills/sw-design-solution/SKILL.md +48 -0
  56. package/skills/sw-design-solution/reference/adr-flow.md +13 -0
  57. package/skills/sw-design-solution/reference/adr-template.md +40 -0
  58. package/skills/sw-design-solution/reference/clarification-loop.md +13 -0
  59. package/skills/sw-design-solution/reference/draft-and-spawn.md +21 -0
  60. package/skills/sw-design-solution/reference/editor-mode.md +16 -0
  61. package/skills/sw-design-solution/reference/pre-check-and-target.md +19 -0
  62. package/skills/sw-design-solution/reference/readiness-and-report.md +15 -0
  63. package/skills/sw-design-solution/reference/research-and-evidence.md +25 -0
  64. package/skills/sw-design-solution/reference/tech-spec-template.md +112 -0
  65. package/skills/sw-design-solution/reference/toolchain-conformance.md +9 -0
  66. package/skills/sw-discover-tender/SKILL.md +68 -0
  67. package/skills/sw-discover-tender/reference/agent-briefs.md +135 -0
  68. package/skills/sw-discover-tender/reference/analysis-template.md +224 -0
  69. package/skills/sw-discover-tender/reference/assumption-catalogue.md +104 -0
  70. package/skills/sw-discover-tender/reference/client-question-rules.md +47 -0
  71. package/skills/sw-discover-tender/reference/confidence-rubric.md +80 -0
  72. package/skills/sw-discover-tender/reference/context-parameters.md +116 -0
  73. package/skills/sw-discover-tender/reference/coverage-mapping.md +62 -0
  74. package/skills/sw-discover-tender/reference/editor-mode.md +11 -0
  75. package/skills/sw-discover-tender/reference/editor-session.md +115 -0
  76. package/skills/sw-discover-tender/reference/estimation-model.md +106 -0
  77. package/skills/sw-discover-tender/reference/procedure.md +98 -0
  78. package/skills/sw-discover-tender/reference/response-rules.md +13 -0
  79. package/skills/sw-document-feature/SKILL.md +64 -0
  80. package/skills/sw-document-feature/reference/adr-promotion.md +64 -0
  81. package/skills/sw-document-feature/reference/built-check.md +71 -0
  82. package/skills/sw-document-feature/reference/domain-guidelines.md +59 -0
  83. package/skills/sw-document-feature/reference/page-rules.md +129 -0
  84. package/skills/sw-document-feature/reference/procedure.md +58 -0
  85. package/skills/sw-document-feature/reference/scaffold/README.md +78 -0
  86. package/skills/sw-document-feature/reference/scaffold/_config.yml +51 -0
  87. package/skills/sw-document-feature/reference/scaffold/adr/index.md +44 -0
  88. package/skills/sw-document-feature/reference/scaffold/baseline/glossary.md +55 -0
  89. package/skills/sw-document-feature/reference/scaffold/baseline/tech-stack.md +48 -0
  90. package/skills/sw-document-feature/reference/scaffold/domains/index.md +55 -0
  91. package/skills/sw-document-feature/reference/scaffold/domains/platform/configuration.md +54 -0
  92. package/skills/sw-document-feature/reference/scaffold/domains/platform/customization-guidelines.md +47 -0
  93. package/skills/sw-document-feature/reference/scaffold/domains/platform/debugging.md +55 -0
  94. package/skills/sw-document-feature/reference/scaffold/domains/platform/environments-and-deployment.md +49 -0
  95. package/skills/sw-document-feature/reference/scaffold/domains/platform/extensions-inventory.md +40 -0
  96. package/skills/sw-document-feature/reference/scaffold/domains/platform/index.md +39 -0
  97. package/skills/sw-document-feature/reference/scaffold/domains/platform/logging.md +46 -0
  98. package/skills/sw-document-feature/reference/scaffold/guidelines/documentation-guidelines.md +102 -0
  99. package/skills/sw-document-feature/reference/scaffold/guidelines/index.md +50 -0
  100. package/skills/sw-document-feature/reference/scaffold/index.md +68 -0
  101. package/skills/sw-document-feature/reference/scaffold/vanilla/README.md +24 -0
  102. package/skills/sw-document-feature/reference/scaffold/vanilla/adr/index.md +36 -0
  103. package/skills/sw-document-feature/reference/scaffold/vanilla/index.md +68 -0
  104. package/skills/sw-document-feature/reference/setup-wiki.md +142 -0
  105. package/skills/sw-document-feature/reference/source-mapping.md +71 -0
  106. package/skills/sw-document-feature/reference/templates/adr.md +26 -0
  107. package/skills/sw-document-feature/reference/templates/domain-index.md +36 -0
  108. package/skills/sw-document-feature/reference/templates/feature-page.md +64 -0
  109. package/skills/sw-document-feature/reference/templates/guideline.md +42 -0
  110. package/skills/sw-implement-feature/SKILL.md +52 -0
  111. package/skills/sw-implement-feature/reference/ac-loop.md +24 -0
  112. package/skills/sw-implement-feature/reference/build-order.md +17 -0
  113. package/skills/sw-implement-feature/reference/delegation.md +18 -0
  114. package/skills/sw-setup/SKILL.md +144 -0
  115. package/skills/sw-setup/reference/rows.md +223 -0
  116. package/skills/sw-verify-feature/SKILL.md +64 -0
  117. package/skills/sw-verify-feature/reference/reconcile-and-report.md +42 -0
  118. package/skills/sw-verify-feature/reference/verification-report-template.md +57 -0
  119. package/skills/sw-verify-feature-ac-tests/SKILL.md +76 -0
  120. package/skills/sw-verify-feature-ac-tests/reference/audit-execute-score.md +40 -0
  121. package/skills/sw-verify-feature-architecture/SKILL.md +66 -0
  122. package/skills/sw-verify-feature-architecture/reference/guidelines-and-twig.md +27 -0
  123. package/skills/sw-verify-feature-code-quality/SKILL.md +73 -0
  124. package/skills/sw-verify-feature-code-quality/reference/gates.md +22 -0
package/.mcp.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "playwright": {
4
+ "command": "npx",
5
+ "args": ["-y", "@playwright/mcp@latest"]
6
+ }
7
+ }
8
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,78 @@
1
+ # Changelog
2
+
3
+ All notable changes to the Shopware Ecosystem Agentic Harness are recorded here.
4
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
5
+ versioning is [semver](https://semver.org/) — `0.x` until the first stable
6
+ release.
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.0] - 2026-09-16
11
+
12
+ ### Added
13
+
14
+ - **An npm package with an installer CLI** — `bin/cli.mjs` plus `lib/`,
15
+ published as `@execuro-sw-ecosystem/sw-ecosystem-agentic-harness` with the bin
16
+ `sw-ecosystem-agentic-harness`. Commands `status`, `plan`, `apply`,
17
+ `uninstall` and `guide`, each printing one JSON object with a mandatory
18
+ `next_step`; `exit 2` on a usage error with a `help` array of runnable
19
+ commands. Zero runtime dependencies, no install hooks.
20
+ - **Installs into all four hosts** — Claude Code, OpenAI Codex, GitHub Copilot
21
+ and Cursor, each into its own native discovery directories, with the MCP
22
+ servers written in each host's own format.
23
+ - `copilot/agents/*.agent.md` — Copilot adapters generated by
24
+ `scripts/gen-copilot-agents.mjs`, with Claude tool names mapped through
25
+ Copilot's alias table. An unknown tool name fails the build rather than
26
+ disappearing.
27
+ - `content/AGENTS.md` — generated from the shipped skills and agents by
28
+ `scripts/gen-agents-md.mjs`. Codex, Copilot and Cursor read it from the
29
+ installed tree, and Codex never reads `CLAUDE.md`.
30
+ - `scripts/frontmatter.mjs` — the frontmatter reader shared by all three
31
+ generators.
32
+ - `scripts/check-pack.mjs` — fails when the tarball would carry anything outside
33
+ the `files` allow-list, or when a lifecycle script is declared.
34
+ - `.github/workflows/release.yml` — OIDC trusted publishing with
35
+ `--provenance`, gated on the generators, the tests, the pack check and the
36
+ licence metadata.
37
+ - A full `node --test` suite, zero dependencies, covering the whole risk
38
+ surface the compatibility guide names: install idempotency asserted on
39
+ **mtimes**, malformed and JSONC configs, the uninstall round trip, Windows
40
+ command wrapping and POSIX lock keys, and per-host error aggregation.
41
+ - The remaining `sw-*` skills — `sw-setup`, `sw-discover-tender`,
42
+ `sw-design-requirements`, `sw-design-solution` — so the package now ships
43
+ all **10** skills and **7** sub-agents. The Specs Editor's own skill ships
44
+ inside its own package, not here.
45
+
46
+ ### Changed
47
+
48
+ - **`sw-setup` is now a stub skill.** It runs the CLI's `status`, renders the
49
+ table, asks its one question and runs `apply --yes`. It never writes a host
50
+ file and no longer carries the rule list — the CLI is the single source of
51
+ truth for what gets installed.
52
+ - **Every `SKILL.md` is under 8 KB**, Codex's effective cap, enforced by a test.
53
+ `sw-discover-tender` (27.5 KB), `sw-design-solution` (17.8 KB) and
54
+ `sw-design-requirements` (12.7 KB) were reorganised into `reference/` router
55
+ files — reorganised, not compressed: each split was audited line-by-line
56
+ against its pre-split copy.
57
+ - **No Claude-only construct is left anywhere.** All `${CLAUDE_SKILL_DIR}`,
58
+ `$ARGUMENTS`, `SendMessage`, `subagent_type` and literal `.claude/…` paths are
59
+ gone, and every `AskUserQuestion` in prose now names the capability with both
60
+ hosts as an aside.
61
+ - `mcp.json` is now the portable Agent Plugins 1.0 form — it carries the
62
+ `$schema` and a `type: "stdio"` per server, and is no longer a copy of
63
+ Claude Code's `.mcp.json`. They are different formats.
64
+ - `README.md` documents the installer rather than a marketplace install.
65
+
66
+ ### Removed
67
+
68
+ - `extensions.com.openai.codex` from the root `plugin.json`. No Codex manifest
69
+ struct has an `agents` field, so the declaration was a no-op.
70
+ - The "carries no executables" claim from both plugin descriptions. The package
71
+ now carries exactly one: the installer.
72
+
73
+ ### Notes
74
+
75
+ - Distribution is the installer, not a plugin marketplace. The plugin
76
+ manifests are kept valid in CI although nothing reads them today.
77
+ - The `ShopwareDevKnowledgeBase` and `playwright` MCP registrations both track
78
+ `@latest`; every other pinned thing in this package is pinned exactly.
@@ -0,0 +1,54 @@
1
+ # Contributing
2
+
3
+ ## Toolchain
4
+
5
+ Node >= 20, `git`. Zero runtime dependencies — keep it that way; a new
6
+ dependency here ships to every project that installs this package.
7
+
8
+ ## Before you send a change
9
+
10
+ All of these must pass:
11
+
12
+ ```bash
13
+ npm test # the full suite
14
+ npm run gen:check # generated adapters match their sources
15
+ node scripts/check-pack.mjs # the tarball matches the files allow-list
16
+ ```
17
+
18
+ If you edited an agent or a skill, regenerate the host adapters first and
19
+ commit the result:
20
+
21
+ ```bash
22
+ npm run gen
23
+ ```
24
+
25
+ ## Rules that bite
26
+
27
+ - **`codex/agents/*.toml` and `copilot/agents/*.agent.md` are generated** from
28
+ `agents/*.md` by `scripts/gen-codex-agents.mjs` and
29
+ `scripts/gen-copilot-agents.mjs`. Never hand-edit them — run `npm run gen`
30
+ and commit the output. `npm run gen:check` fails the build on drift.
31
+ - **Every `SKILL.md` stays under 8192 bytes**, Codex's effective cap and the
32
+ smallest of the four hosts'. A test enforces it. When a skill grows past the
33
+ cap, move material into `reference/*.md` beside it — that is
34
+ **reorganisation, never compression**. Audit the split against the
35
+ pre-split file line by line; do not drop meaning to make the number work.
36
+ - **Skills stay host-neutral.** No `${CLAUDE_SKILL_DIR}`, no `$ARGUMENTS`, no
37
+ `SendMessage` or `subagent_type`, no literal `.claude/…` path. Any prose that
38
+ asks the user a question names both Claude Code's and Codex's question
39
+ tools, not just one.
40
+ - **The installer never prompts, never fetches, and writes atomically.**
41
+ Every file is written to a temporary path and renamed. A change that breaks
42
+ any of those three properties is a change to the contract this package
43
+ makes with its users, not an implementation detail — flag it explicitly in
44
+ the change description.
45
+
46
+ ## Working on the package
47
+
48
+ `scripts/` is developer tooling: run by hand and by CI, never shipped in the
49
+ published tarball, and never run on a user's machine.
50
+
51
+ `claude plugin validate <dir> --strict` resolves a directory to one manifest
52
+ and returns `contents: []` on its own, so run it against all four explicit
53
+ targets — `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`,
54
+ `skills`, `agents` — not just the directory.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Execuro UG (haftungsbeschränkt)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,304 @@
1
+ # Shopware Ecosystem Agentic Harness
2
+
3
+ The `sw-*` skills and sub-agents for Shopware 6 projects: they turn a briefing
4
+ into a PRD, a PRD into a technical spec, a spec into tested code, and tested
5
+ code into a project wiki page.
6
+
7
+ It ships as **one npm package carrying an installer**. The installer copies the
8
+ skills and agents into whichever coding agents your repository uses and
9
+ registers the MCP servers and permission rules they depend on. Nothing is
10
+ loaded as a plugin, because the configuration the harness needs has no plugin
11
+ vehicle on any host.
12
+
13
+ - Published by Execuro UG (haftungsbeschränkt) under the MIT licence.
14
+ - Installs into **Claude Code, OpenAI Codex, GitHub Copilot and Cursor**.
15
+ - Zero runtime dependencies, and no install hooks: nothing executes on your
16
+ machine except the CLI you invoke yourself.
17
+
18
+ ## What it ships
19
+
20
+ | Component | Where | Contents |
21
+ | --- | --- | --- |
22
+ | Skills | `skills/` | 10 `sw-*` skills — `sw-setup`, `sw-discover-tender`, `sw-design-requirements`, `sw-design-solution`, `sw-implement-feature`, `sw-document-feature`, `sw-verify-feature` and its three verifiers (`-ac-tests`, `-architecture`, `-code-quality`) |
23
+ | Sub-agents | `agents/` | `sw-storefront-developer`, `sw-php-backend-developer`, `sw-admin-frontend-developer`, `sw-qa-engineer`, `sw-shopware-architect`, `sw-product-manager`, `sw-tender-editor` |
24
+ | Codex adapters | `codex/agents/` | The seven agents as Codex TOML roles — Codex plugins cannot ship sub-agents, so the installer writes these into `.codex/agents/` |
25
+ | Copilot adapters | `copilot/agents/` | The same seven as `.agent.md`, with Claude tool names mapped to Copilot's |
26
+ | Installer | `bin/`, `lib/` | The `sw-ecosystem-agentic-harness` CLI |
27
+
28
+ Every adapter is generated from `agents/*.md` at build time, committed, and
29
+ diff-checked in CI — so a bad mapping is a red build here, never a broken
30
+ install on your machine.
31
+
32
+ ### Separate packages
33
+
34
+ The knowledge-base MCP server (`@execuro-sw-ecosystem/sw-dev-knowledge-base-mcp`)
35
+ and the two visual editors (`@execuro-sw-ecosystem/sw-specs-editor`,
36
+ `@execuro-sw-ecosystem/sw-tender-discovery-tool`) are their own npm packages.
37
+ This package registers the knowledge base as an MCP server; it does not contain
38
+ it. The knowledge-base server is also listed in the MCP Registry as
39
+ `io.github.execuro/sw-dev-knowledge-base-mcp` — a separate discovery-catalogue
40
+ identity, not an npm package name — and can be run standalone in any stdio MCP
41
+ client without this harness.
42
+
43
+ The two editors are **optional add-ons**, and each ships its own skill inside
44
+ its package rather than here. `sw-setup` offers to install them; a host that
45
+ declines is fully set up without them, and `--editor` on `sw-design-requirements`,
46
+ `sw-design-solution` or `sw-discover-tender` then stops with one line saying so.
47
+
48
+ ## Commands
49
+
50
+ | Command | What it does |
51
+ | --- | --- |
52
+ | `status` | read-only; what is installed, what drifted, which optional companion packages are present |
53
+ | `plan` | the exact changes, written as a diff; writes nothing |
54
+ | `apply --yes` | performs them |
55
+ | `uninstall --yes` | removes what the lock file records |
56
+ | `guide` | the install protocol, the single source of truth |
57
+
58
+ Flags: `--host claude-code|codex|copilot|cursor` (repeatable; omitting it
59
+ selects every host that is present), `--scope project|user` (default
60
+ `project`), `--root <path>` (default the current directory), `--yes` (required
61
+ by `apply` and `uninstall`, never prompts), and `--no-companions` (skip
62
+ detection of the optional editor packages).
63
+
64
+ ## Install
65
+
66
+ ```bash
67
+ # see what is there and what is missing — read-only, always safe
68
+ npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness status
69
+
70
+ # see the exact changes, written as a diff. Writes nothing.
71
+ npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness plan
72
+
73
+ # perform them
74
+ npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness apply --yes
75
+ ```
76
+
77
+ Then restart your coding agent — every host reads its configuration at startup.
78
+ The command's output tells you which ones and how.
79
+
80
+ `apply` refuses without `--yes` and never prompts: Codex's question tool does
81
+ not block outside Plan mode, and CI has no terminal. Add `--host claude-code`
82
+ (repeatable) to install into one agent, and `--scope user` to install into your
83
+ home directory instead of this repository. The default scope is the project —
84
+ nothing is written under `~` unless you ask.
85
+
86
+ ### What it writes
87
+
88
+ | Host | Skills | Sub-agents | MCP | Settings |
89
+ | --- | --- | --- | --- | --- |
90
+ | Claude Code | `.claude/skills/` | `.claude/agents/` | `.mcp.json` | `.claude/settings.json` |
91
+ | Codex | `.agents/skills/` | `.codex/agents/*.toml` | `.codex/config.toml` | `.codex/config.toml` |
92
+ | GitHub Copilot | `.github/skills/` | `.github/agents/*.agent.md` | `.mcp.json`, `.vscode/mcp.json` | — |
93
+ | Cursor | reads Claude's | reads Claude's | `.cursor/mcp.json` | — |
94
+
95
+ `AGENTS.md` gets a managed block too — Codex, Copilot and Cursor read it, and
96
+ Codex never reads `CLAUDE.md`.
97
+
98
+ ### What it will not do
99
+
100
+ - **It never overwrites a file it did not install.** A file already at one of
101
+ these paths that differs from ours is reported as a conflict and left alone.
102
+ - **It never overwrites your edits.** Once installed, a file you change is
103
+ reported as drift and skipped on every later run.
104
+ - **It never removes or loosens an existing rule.** Permission lists are merged.
105
+ A rule you delete after install is remembered as declined and never re-added.
106
+ - **It never rewrites a config with comments.** A JSONC `.vscode/mcp.json`
107
+ becomes a manual step with the exact snippet, rather than losing your notes.
108
+ - **It writes atomically.** Every file is written to a temporary file and
109
+ renamed, so an interrupted run cannot truncate your settings.
110
+
111
+ Undo everything with:
112
+
113
+ ```bash
114
+ npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness uninstall --yes
115
+ ```
116
+
117
+ It removes exactly what the lock file at `.sw-ai-sdk/harness.lock.json` records,
118
+ keeps anything you hand-edited, and tells you what it kept.
119
+
120
+ ### From a skill
121
+
122
+ `sw-setup` is a stub: it runs `status`, renders the table, asks once, and runs
123
+ `apply --yes`. It deliberately restates none of the protocol, because an
124
+ installed skill file goes stale and the CLI does not. Anything that needs the
125
+ protocol runs:
126
+
127
+ ```bash
128
+ npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness guide
129
+ ```
130
+
131
+ ## Prerequisites
132
+
133
+ | Requirement | Why | Check |
134
+ | --- | --- | --- |
135
+ | `shopware-cli` ≥ 0.16 | Every `bin/console` call and every build the agents run goes through it | `shopware-cli --version` |
136
+ | A running dev environment | `shopware-cli project console` proxies into the `web` container; without it you get `service "web" is not running` | `shopware-cli project dev` |
137
+ | Node ≥ 20 | The MCP servers and the editor tools run through `npx` | `node -v` |
138
+
139
+ PHP on the host is **not** required. The agents never call `php` or
140
+ `bin/console` directly, and never call webpack or vite directly — the storefront
141
+ ships both bundler configs and only the CLI knows which one applies to a given
142
+ version.
143
+
144
+ ## Configuration
145
+
146
+ The installer writes these; `sw-setup` reports on them. Both are covered by
147
+ `apply --yes` above, so this section is what is being installed and why, not a
148
+ second step to run.
149
+
150
+ - the permission rules below, into `.claude/settings.json` (Claude Code) or
151
+ `.codex/config.toml` (Codex);
152
+ - the `playwright` and `ShopwareDevKnowledgeBase` MCP registrations, with the
153
+ `--project-wiki` path resolved for this machine — Codex performs no variable
154
+ expansion, so it cannot be left as a placeholder;
155
+ - `sandbox.network.allowLocalBinding`, which the Specs Editor and Tender
156
+ Discovery Tool loopback servers need.
157
+
158
+ The package's own `mcp.json` carries only `playwright` — it is the portable
159
+ manifest checked by `claude plugin validate`, not what gets installed. Both
160
+ servers are written into each host's own MCP config (`.mcp.json`,
161
+ `.codex/config.toml`, `.vscode/mcp.json`, `.cursor/mcp.json`) at `apply` time,
162
+ from `content/mcp-servers.json`.
163
+
164
+ ### The `@latest` exception
165
+
166
+ `playwright` and `ShopwareDevKnowledgeBase` are registered as `@latest`; every
167
+ other pinned thing in this package is pinned exactly. That is deliberate: a
168
+ browser driver and a documentation corpus both ship stale if pinned, and
169
+ staleness there is a worse failure than a version drifting under you.
170
+
171
+ ### The permission rules
172
+
173
+ ```json
174
+ {
175
+ "permissions": {
176
+ "deny": [
177
+ "Edit(vendor/**)",
178
+ "Edit(public/theme/**)",
179
+ "Edit(public/bundles/**)",
180
+ "Edit(custom/**/Resources/app/storefront/dist/**)",
181
+ "Edit(custom/**/Resources/public/**)",
182
+ "Bash(shopware-cli project ci*)"
183
+ ],
184
+ "allow": ["Bash(grep *)"]
185
+ }
186
+ }
187
+ ```
188
+
189
+ Why each group:
190
+
191
+ - **`vendor/**`** — an agent finds the "real" block fastest in core and can
192
+ patch it there. Core edits are silently lost on the next `composer update` and
193
+ break every other extension. The correct move is always `sw_extends` from
194
+ `custom/plugins/<Name>/src/Resources/views/…`.
195
+ - **`public/theme/**`, `public/bundles/**`, `**/dist/**`, `**/Resources/public/**`**
196
+ — compiled output. Editing it looks like it works and is overwritten by the
197
+ next `theme:compile` or asset build.
198
+ - **`Bash(shopware-cli project ci*)`** — `project ci` is a CI build step; run
199
+ against a working tree it deletes source files.
200
+
201
+ Do not add matching `Write(…)` entries. File-permission checks match on
202
+ `Edit(path)` rules only, and an `Edit(…)` rule already covers every
203
+ file-editing tool — `Write`, `Edit`, `MultiEdit`, `NotebookEdit`. A
204
+ `Write(path)` deny rule is inert and Claude Code warns about it on every start.
205
+
206
+ If your team uses enterprise managed settings, put the same `deny` array there
207
+ instead — it then applies across every repo without per-repo commits.
208
+
209
+ ## Verifying the installation
210
+
211
+ ```bash
212
+ # 1. the install is complete and undrifted
213
+ npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness status
214
+
215
+ # 2. the toolchain the agents call actually exists
216
+ shopware-cli project console --help
217
+ shopware-cli project storefront-build --help
218
+ shopware-cli extension validate --help
219
+
220
+ # 3. the deny rules are live — ask the session to edit any file under
221
+ # vendor/shopware/storefront/Resources/views/ and confirm it is blocked
222
+ ```
223
+
224
+ `status` reports `state: "ok"` when every host is installed and nothing has
225
+ drifted. A second `apply --yes` is the other check: it must report everything
226
+ as `unchanged` and rewrite nothing.
227
+
228
+ Then run one real task: ask `sw-storefront-developer` for a trivial storefront
229
+ change (for example a `data-testid` on the header logo block). A correct report
230
+ contains the Locate proofs (template path, block name and the file it was found
231
+ in, other bundles providing that path), a `lint:twig` result, and a Playwright
232
+ assertion that the attribute appears in the rendered HTML. If any of the three
233
+ is missing, the configuration above is incomplete.
234
+
235
+ ## What the agents do differently once configured
236
+
237
+ These are the behaviours the configuration above switches on:
238
+
239
+ - **Locate before writing.** No `{% block %}` is written until the template path
240
+ is confirmed on disk, the block name is confirmed *in that file* (block names
241
+ are not unique across the storefront), every other bundle providing the same
242
+ relative path is listed, and — when the dev env is up — `debug:twig` has
243
+ printed the matched and overridden files.
244
+ - **Lint, build, render as a gate.** `shopware-cli project console lint:twig
245
+ <file>` after every Twig edit; `shopware-cli extension validate --full --only
246
+ eslint,stylelint` after SCSS/JS; then cache/theme/`storefront-build`; then a
247
+ render assertion. A `sw_extends` with a wrong path or a non-existent block
248
+ name is a **silent no-op** — only the render assertion catches it.
249
+ - **Correct inheritance model.** `@Storefront` < `@Plugins` < one active-theme
250
+ slot, `theme.json` `views` reordering, the silent two-bundle conflict, and
251
+ never targeting your own namespace.
252
+
253
+ ## Working on the package
254
+
255
+ ```bash
256
+ # regenerate every host adapter after editing an agent or a skill
257
+ npm run gen
258
+
259
+ # what CI checks
260
+ npm run gen:check
261
+ npm test # the full suite, zero dependencies
262
+ node scripts/check-pack.mjs # the tarball matches the files allow-list
263
+ claude plugin validate .claude-plugin/plugin.json --strict
264
+ claude plugin validate .claude-plugin/marketplace.json --strict
265
+ claude plugin validate skills --strict
266
+ claude plugin validate agents --strict
267
+ ```
268
+
269
+ `claude plugin validate <dir>` resolves a directory to one manifest and returns
270
+ `contents: []`, so it is not a sufficient gate on its own — hence the four
271
+ explicit targets.
272
+
273
+ `scripts/` is developer tooling, run by hand and by CI. It is not in the
274
+ published tarball and never runs on a user's machine.
275
+
276
+ ### The plugin manifests
277
+
278
+ `plugin.json`, `.claude-plugin/plugin.json` and `.claude-plugin/marketplace.json`
279
+ are kept valid in CI although nothing reads them today. Distribution is the
280
+ installer, not a plugin marketplace. **The marketplace manifest in this
281
+ repository is development-only.**
282
+
283
+ ### Every `SKILL.md` is capped at 8 KB
284
+
285
+ Codex's effective skill-body limit is the smallest of the four hosts', so it is
286
+ the budget every skill is written to. Overflow lives in `reference/*.md` beside
287
+ each `SKILL.md`, loaded on demand. A test enforces the cap, so the gate is
288
+ mechanical rather than a review habit.
289
+
290
+ ## Troubleshooting
291
+
292
+ | Symptom | What it means | What to do |
293
+ | --- | --- | --- |
294
+ | `state: "conflict"` | A file we did not install already sits at that path. It is never overwritten. | Move or delete the existing file, or `--host`-scope the run away from it, then re-run `apply`. |
295
+ | `state: "drift"` | You (or something else) edited a file this installer wrote. It is left alone on every later run. | Nothing to fix — this is by design. Re-run `status` to confirm it is the only thing reported. |
296
+ | A manual step for `.vscode/mcp.json` | That file is JSONC (comments or trailing commas). Rewriting it would destroy your notes, so it is never touched automatically. | Add the printed snippet to `.vscode/mcp.json` yourself, under the `servers` key. |
297
+ | `.codex/` reported read-only | Codex's default workspace-write sandbox makes `.codex/` and `.agents/` read-only from inside a Codex session. | Run the installer from a plain shell, not from inside Codex. |
298
+ | A manual step for `[agents]` in `.codex/config.toml` | An unfenced `[agents]` table already exists. TOML forbids a duplicate table header, and the installer never edits lines it did not write. | Add `max_concurrent_threads_per_session = 4` to your existing `[agents]` table by hand. |
299
+ | An MCP server that will not start after install | Usually a stale or unpublished package version, or a registry/network problem reaching npm. | Run the server's `npx` command directly (see the registration in your host's MCP config) to see the real error; `npm i -D` the package first if the registry needs auth. |
300
+
301
+ ## Licence
302
+
303
+ MIT — see [LICENSE](LICENSE). Copyright (c) 2026 Execuro UG
304
+ (haftungsbeschränkt).
package/SECURITY.md ADDED
@@ -0,0 +1,50 @@
1
+ # Security Policy
2
+
3
+ ## Supported versions
4
+
5
+ `0.x`, latest release only. This package is pre-1.0; fixes land on the tip of
6
+ `main` and ship in the next `0.x` release rather than being backported.
7
+
8
+ ## Reporting a vulnerability
9
+
10
+ Report a suspected vulnerability privately, using GitHub's private
11
+ vulnerability reporting: open
12
+ **https://github.com/execuro/sw-ecosystem-agentic-harness/security/advisories/new**,
13
+ or click **Report a vulnerability** on the repository's **Security** tab.
14
+ This opens a private thread visible only to you and the maintainers; nothing
15
+ becomes public until an advisory is published. Please do not open a public
16
+ GitHub issue for a suspected vulnerability — that discloses it before a fix
17
+ exists.
18
+
19
+ We aim to acknowledge a report within **5 business days** and to have a fix or
20
+ a mitigation plan within **30 days** of confirming it.
21
+
22
+ ## What is in scope
23
+
24
+ This package's installer writes to files outside its own tree: your coding
25
+ agent's settings, MCP configuration and permission rules, under both project
26
+ and user (`$HOME`) scope. In-scope classes of issue include:
27
+
28
+ - the installer writing outside the paths it documents, or outside `--root`
29
+ and the selected `--scope`;
30
+ - path traversal in any value the installer reads from a project (skill
31
+ names, host markers, lock file entries) and turns into a filesystem path;
32
+ - the installer overwriting a file it did not create, or silently discarding
33
+ a user's edits (the "conflict" and "drift" states existing precisely to
34
+ prevent this — a bypass of either is a vulnerability);
35
+ - a JSONC or TOML config being corrupted by a partial or non-atomic write;
36
+ - the installer executing anything beyond the CLI invocation the user typed,
37
+ or an install hook firing without the user running `apply` themselves.
38
+
39
+ This package declares **zero runtime dependencies** and runs **no lifecycle
40
+ scripts** on install, which removes a large part of the usual npm attack
41
+ surface.
42
+
43
+ Out of scope: vulnerabilities in the coding agents themselves, in the
44
+ separately published companion packages (they have their own repositories
45
+ and their own reporting), or in a third-party MCP server this package merely
46
+ registers, such as Playwright's (report those upstream).
47
+
48
+ ## Disclosure
49
+
50
+ We credit reporters in the release notes unless you ask not to be named.
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: sw-admin-frontend-developer
3
+ description: Senior Shopware 6 Administration (Vue admin) specialist for building, extending, and unit-testing admin modules, components, ACL, snippets, and data-layer code. Use proactively for any task touching the admin UI, an admin plugin/app extension, or admin Jest specs.
4
+ tools: Read, Grep, Glob, Edit, Write, Bash, WebFetch, mcp__ShopwareDevKnowledgeBase__list_docs, mcp__ShopwareDevKnowledgeBase__grep_docs, mcp__ShopwareDevKnowledgeBase__read_doc, mcp__ShopwareDevKnowledgeBase__kb_status
5
+ model: inherit
6
+ color: purple
7
+ ---
8
+
9
+ You are a senior Shopware 6 Administration engineer. Your extensions feel native, survive core upgrades, and leave no trace outside their own module. The vendored administration bundle (`AGENTS.md` files, `technical-docs/`) is the version-matched source of truth: read it for the areas you touch before relying on memory, because admin APIs shift between minor releases. This project's version is not this skill's version.
10
+
11
+ ## Non-negotiables
12
+
13
+ - Registries, not imports: register through the Shopware global; inject services, never import core components or services directly.
14
+ - Never touch core or vendored files: hook via Twig blocks (`{% parent %}`) or `Component.override`/`extend`; never fork or subclass a core component.
15
+ - ACL first: map privileges, gate routes, navigation entries and every mutating control; the server enforces, the UI only hides.
16
+ - A module is one unit: meta, routes, navigation, ACL, snippets, pages and views live together; no cross-module imports.
17
+ - Extend vs override is a deliberate choice: call `$super` wherever the original must still run, and state which was chosen and why.
18
+
19
+ ## Mindset
20
+
21
+ - **Shopware version — never assume, before writing anything version-sensitive** (a class, event, trait, DAL flag, deprecation): use the brief's version + source if already stated (flag it if `vendor/` contradicts); else `vendor/shopware/core/composer.json` `version` → `composer.lock` → `composer.json` constraint ("unconfirmed"); PHP from the project runtime (`compose.yaml`, `.ddev/config.yaml`, `Dockerfile`), not the host. The major (`6.7`) scopes KB paths (`guidelines/<major>/…`, `platform/dev/<major>/…`). Cite the version on version-sensitive claims; `vendor/` beats docs. Ambiguous or unknown → stop and ask (the caller if spawned, else the user) — never assume it from memory or a prior project.
22
+ - **Docs via the ShopwareDevKnowledgeBase MCP** (`mcp__ShopwareDevKnowledgeBase__*`), never the wiki files on disk: `read_doc` every KB path in your brief before coding; for an uncited component, directive or module API, `grep_docs` it in `platform/dev/<installed version>` and read the page. Then confirm `vendor/shopware/administration` matches — docs and installed version drift.
23
+ - **Guidelines**: first call `read_doc { path: "guidelines/<version>/<base-file>" }` with the detected Shopware major (6.6 or 6.7), then its surface file(s) for the area touched. Each is the effective file — Shopware's rules with this project's rules merged in; a `[project …]` section takes precedence. Apply every rule; cite it by the section's tag-line path, as `[rule: <path>]` — the tag line already ends with `#anchor`. If a call returns a not-found notice, say so in the report and continue — never substitute rules from memory. `<base-file>` is `code-guidelines.md`; surface file is `admin-code-guidelines.md`.
24
+ - **AC test markers**: every Jest spec covering an acceptance criterion has a title starting with `AC-n:`; any PHPUnit test you touch carries `Ac<n>` in the method name and `#[Group('NNNN-ACn')]` (`NNNN` = spec number). `sw-verify-feature` greps for exactly these; an unmarked spec is not coverage. Inside `sw-implement-feature` the specs for an AC are authored first by `sw-qa-engineer` and are the contract: make them pass, never weaken, skip or delete one; a spec you believe wrong relative to the tech spec is reported, not edited.
25
+
26
+ ## When invoked
27
+
28
+ 1. **Orient.** Read the task or spec, then the bundle's `AGENTS.md` / `technical-docs/` for the areas touched, then the target component's blocks and public methods.
29
+ 2. **Design the seam.** Extend vs override, blocks hooked, privileges and roles, services injected. A few lines; they go into the report.
30
+ 3. **Test first.** One co-located `*.spec.ts` per behaviour: wrap the component so Twig inheritance resolves, flush promises, grant ACL roles per test (default none), mock the repository factory. Confirm it fails for the right reason.
31
+ 4. **Implement** the smallest module-local footprint that passes. Add snippets for every supported locale alongside the code, not afterwards.
32
+ 5. **Run the static gates.** The project's admin lint, format, fix and validate steps (typically via `shopware-cli`), the type check, and the spec suite. Fix what they report; never suppress or silence a failure.
33
+ 6. **Self-check, then report.** Passing spec-first test per behaviour; seam documented; no core file changed; privileges, roles and gating in place; snippets in every locale; gates clean; verification hand-off list written.
34
+
35
+ ## Project skills and boundaries
36
+
37
+ - Tech spec exists: follow `sw-implement-feature`'s per-acceptance-criterion TDD loop and its architectural decisions.
38
+ - No spec and more than a small change: say so and recommend `sw-design-solution`. Do not invent requirements.
39
+ - Never edit PRDs or specs; report gaps and ambiguities instead.
40
+ - Acceptance verification is out of scope. A dedicated verification skill owns end-to-end and click-through checks; do not attempt them. Hand off a list of what should be verified.
41
+
42
+ ## Report
43
+
44
+ Under 20 lines, no file bodies:
45
+
46
+ - **Summary** — what was built, one or two sentences.
47
+ - **Seam** — extend/override choice, blocks hooked, services injected.
48
+ - **ACL** — privileges, roles, what is gated.
49
+ - **Files** — absolute paths, created vs changed.
50
+ - **Gates run** — each with pass/fail.
51
+ - **Handed off for verification** — scenarios the verification skill should cover.
52
+ - **Open points** — only gaps affecting correctness or upgrade safety.
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: sw-php-backend-developer
3
+ description: Shopware 6 PHP backend specialist. Use PROACTIVELY for any Shopware backend work — plugin/app PHP, DAL entities & migrations, Store/Admin API routes, services & decorators, event subscribers, flow actions, message handlers, caching, ACL. Triggers: "add an entity", "create an API endpoint", "extend checkout/order/product logic", "write a migration", "implement backend AC". Not for Administration (Vue) or Storefront (Twig/JS) work.
4
+ model: inherit
5
+ tools: Read, Write, Edit, Glob, Grep, Bash, mcp__ShopwareDevKnowledgeBase__list_docs, mcp__ShopwareDevKnowledgeBase__grep_docs, mcp__ShopwareDevKnowledgeBase__read_doc, mcp__ShopwareDevKnowledgeBase__kb_status
6
+ color: blue
7
+ ---
8
+
9
+ # PHP Backend Developer (Shopware 6)
10
+
11
+ ## Identity
12
+
13
+ Senior Shopware 6 backend engineer, core-contributor mindset. Ship extension-safe, backward-compatible, tested PHP that survives platform upgrades; tests and static analysis are part of the deliverable.
14
+
15
+ ## Non-negotiables
16
+
17
+ - Never edit core, `vendor/`, or a shipped migration; everything lives in an extension (plugin or app).
18
+ - Lowest-power extension point wins: config > event subscriber > flow/rule/registry > decorator > new service. Decorate to change behaviour, subscribe to react to it.
19
+ - Decorate via the `AbstractX` base class and `getDecorated()`, always delegating to the inner instance; never skip `getDecorated()`, subclass a concrete service, or depend on `@internal`/`@final` classes.
20
+ - Never hardcode UUIDs, language, currency, tax, or sales-channel IDs; pass `Context`/`SalesChannelContext` down the call chain.
21
+ - Migrations: append-only, idempotent; schema in migrations, data in plugin lifecycle hooks; honour `keepUserData()` on uninstall.
22
+
23
+ ## Principles
24
+
25
+ - **Shopware version — never assume, before writing anything version-sensitive** (a class, event, trait, DAL flag, deprecation): use the brief's version + source if already stated (flag it if `vendor/` contradicts); else `vendor/shopware/core/composer.json` `version` → `composer.lock` → `composer.json` constraint ("unconfirmed"); PHP from the project runtime (`compose.yaml`, `.ddev/config.yaml`, `Dockerfile`), not the host. The major (`6.7`) scopes KB paths (`guidelines/<major>/…`, `platform/dev/<major>/…`). Cite the version on version-sensitive claims; `vendor/` beats docs. Ambiguous or unknown → stop and ask (the caller if spawned, else the user) — never assume it from memory or a prior project. This project's version is not this skill's version.
26
+ - Docs via the ShopwareDevKnowledgeBase MCP (`mcp__ShopwareDevKnowledgeBase__*`), never the wiki files on disk: `read_doc` every KB path in your brief before coding; for an uncited mechanism, `grep_docs` it in `platform/dev/<installed version>` and read the page. Then confirm `vendor/` matches — docs and installed version drift.
27
+ - Guidelines: first call `read_doc { path: "guidelines/<version>/<base-file>" }` with the detected Shopware major (6.6 or 6.7), then its surface file(s) for the area touched. Each is the effective file — Shopware's rules with this project's rules merged in; a `[project …]` section takes precedence. Apply every rule; cite it by the section's tag-line path, as `[rule: <path>]` — the tag line already ends with `#anchor`. If a call returns a not-found notice, say so in the report and continue — never substitute rules from memory. `<base-file>` is `code-guidelines.md`; surface file is `be-code-guidelines.md`.
28
+ - AC test markers: every test covering an acceptance criterion has `Ac<n>` in its method name **and** `#[Group('NNNN-ACn')]` (`NNNN` = spec number). `sw-verify-feature` greps for exactly this; an unmarked test is not coverage. Inside `sw-implement-feature` the tests for an AC are authored first by `sw-qa-engineer` and are the contract: make them pass, never weaken, skip or delete one; a test you believe wrong relative to the spec is reported, not edited.
29
+ - Unsure about a framework contract: look it up in the Shopware docs, don't guess.
30
+
31
+ ## Flow
32
+
33
+ 1. **Understand** the brief, given spec section/AC, and surrounding code. Check: which interface exposes the result (API, DAL, message, event)? What is out of scope?
34
+ 2. **Locate the extension point**: existing service, event, route, or definition to extend. Check: lower-power option available? Relied-on class `@internal`/`@final`?
35
+ 3. **Tests first**: write unit/integration test(s) for the AC, run them. Check: they fail, for the right reason.
36
+ 4. **Implement** the minimum satisfying the AC and given architecture. Add the changelog entry. Check: no hardcoded IDs, context passed through, DI wired in service config.
37
+ 5. **Static analysis**: `shopware-cli extension fix` then `shopware-cli extension validate` on the extension; `bin/console dal:validate` for DAL changes; `bin/console database:migrate <PluginName> --all` for migrations. Check: zero issues before moving on.
38
+ 6. **Verify**: run the relevant test suite. Check: green; exercise new routes with a real `SalesChannelContext`, the required ACL privilege, and a second language; no N+1 in new queries; install/update/uninstall round-trip works when lifecycle code changed.
39
+ 7. **Report** per the contract below.
40
+
41
+ ## Never
42
+
43
+ - Skip `shopware-cli extension validate`, the tests, or the changelog entry.
44
+ - Widen scope beyond the given AC.
45
+ - Report done while any relevant test fails or a validation error is open.
46
+
47
+ ## Report
48
+
49
+ Reply with exactly this structure, under 20 lines, no file dumps, no code unless a single snippet is load-bearing:
50
+
51
+ - **AC → tests → status**: one line per AC: test file(s), pass / fail / partly.
52
+ - **Extension point**: choice and why it was lowest-power.
53
+ - **Files**: created/changed paths, one per line, no contents.
54
+ - **Migrations / BC**: new migrations, deprecations, feature flags, lifecycle hooks; "none" if none.
55
+ - **Toolchain**: results of `extension fix` / `validate`, `dal:validate`, `database:migrate --all`.
56
+ - **Skipped / blocked**: what you did not do and why (missing tool, ambiguous spec, out of scope).
57
+ - **Open questions**: anything the caller must decide.
58
+
59
+ ## Boundaries
60
+
61
+ - Never modify specs or PRDs; report discrepancies instead.
62
+ - Never commit, push, or alter git state.
63
+ - Follow caller-injected project context and any active `sw-*` skill; on conflict with this file, the caller wins.