@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.
- package/.mcp.json +8 -0
- package/CHANGELOG.md +78 -0
- package/CONTRIBUTING.md +54 -0
- package/LICENSE +21 -0
- package/README.md +304 -0
- package/SECURITY.md +50 -0
- package/agents/sw-admin-frontend-developer.md +52 -0
- package/agents/sw-php-backend-developer.md +63 -0
- package/agents/sw-product-manager.md +62 -0
- package/agents/sw-qa-engineer.md +160 -0
- package/agents/sw-shopware-architect.md +79 -0
- package/agents/sw-storefront-developer.md +93 -0
- package/agents/sw-tender-editor.md +43 -0
- package/bin/cli.mjs +73 -0
- package/codex/agents/sw-admin-frontend-developer.toml +54 -0
- package/codex/agents/sw-php-backend-developer.toml +65 -0
- package/codex/agents/sw-product-manager.toml +66 -0
- package/codex/agents/sw-qa-engineer.toml +161 -0
- package/codex/agents/sw-shopware-architect.toml +81 -0
- package/codex/agents/sw-storefront-developer.toml +96 -0
- package/codex/agents/sw-tender-editor.toml +50 -0
- package/content/AGENTS.md +63 -0
- package/content/claude-settings.json +31 -0
- package/content/mcp-servers.json +18 -0
- package/copilot/agents/sw-admin-frontend-developer.agent.md +53 -0
- package/copilot/agents/sw-php-backend-developer.agent.md +64 -0
- package/copilot/agents/sw-product-manager.agent.md +65 -0
- package/copilot/agents/sw-qa-engineer.agent.md +160 -0
- package/copilot/agents/sw-shopware-architect.agent.md +80 -0
- package/copilot/agents/sw-storefront-developer.agent.md +94 -0
- package/copilot/agents/sw-tender-editor.agent.md +46 -0
- package/lib/actions.mjs +449 -0
- package/lib/commands.mjs +446 -0
- package/lib/companions.mjs +117 -0
- package/lib/content.mjs +101 -0
- package/lib/fsx.mjs +188 -0
- package/lib/guide.mjs +98 -0
- package/lib/hosts.mjs +283 -0
- package/lib/lock.mjs +158 -0
- package/lib/merge.mjs +338 -0
- package/lib/out.mjs +74 -0
- package/mcp.json +10 -0
- package/package.json +58 -0
- package/plugin.json +19 -0
- package/skills/sw-design-requirements/SKILL.md +102 -0
- package/skills/sw-design-requirements/reference/clarification-loop.md +20 -0
- package/skills/sw-design-requirements/reference/confidence-rubric.md +82 -0
- package/skills/sw-design-requirements/reference/consistency-probes.md +65 -0
- package/skills/sw-design-requirements/reference/editor-gate.md +15 -0
- package/skills/sw-design-requirements/reference/editor-mode.md +15 -0
- package/skills/sw-design-requirements/reference/prd-confidence-checklist.md +95 -0
- package/skills/sw-design-requirements/reference/prd-template.md +153 -0
- package/skills/sw-design-requirements/reference/readiness-and-report.md +21 -0
- package/skills/sw-design-requirements/reference/splitting-guidelines.md +69 -0
- package/skills/sw-design-solution/SKILL.md +48 -0
- package/skills/sw-design-solution/reference/adr-flow.md +13 -0
- package/skills/sw-design-solution/reference/adr-template.md +40 -0
- package/skills/sw-design-solution/reference/clarification-loop.md +13 -0
- package/skills/sw-design-solution/reference/draft-and-spawn.md +21 -0
- package/skills/sw-design-solution/reference/editor-mode.md +16 -0
- package/skills/sw-design-solution/reference/pre-check-and-target.md +19 -0
- package/skills/sw-design-solution/reference/readiness-and-report.md +15 -0
- package/skills/sw-design-solution/reference/research-and-evidence.md +25 -0
- package/skills/sw-design-solution/reference/tech-spec-template.md +112 -0
- package/skills/sw-design-solution/reference/toolchain-conformance.md +9 -0
- package/skills/sw-discover-tender/SKILL.md +68 -0
- package/skills/sw-discover-tender/reference/agent-briefs.md +135 -0
- package/skills/sw-discover-tender/reference/analysis-template.md +224 -0
- package/skills/sw-discover-tender/reference/assumption-catalogue.md +104 -0
- package/skills/sw-discover-tender/reference/client-question-rules.md +47 -0
- package/skills/sw-discover-tender/reference/confidence-rubric.md +80 -0
- package/skills/sw-discover-tender/reference/context-parameters.md +116 -0
- package/skills/sw-discover-tender/reference/coverage-mapping.md +62 -0
- package/skills/sw-discover-tender/reference/editor-mode.md +11 -0
- package/skills/sw-discover-tender/reference/editor-session.md +115 -0
- package/skills/sw-discover-tender/reference/estimation-model.md +106 -0
- package/skills/sw-discover-tender/reference/procedure.md +98 -0
- package/skills/sw-discover-tender/reference/response-rules.md +13 -0
- package/skills/sw-document-feature/SKILL.md +64 -0
- package/skills/sw-document-feature/reference/adr-promotion.md +64 -0
- package/skills/sw-document-feature/reference/built-check.md +71 -0
- package/skills/sw-document-feature/reference/domain-guidelines.md +59 -0
- package/skills/sw-document-feature/reference/page-rules.md +129 -0
- package/skills/sw-document-feature/reference/procedure.md +58 -0
- package/skills/sw-document-feature/reference/scaffold/README.md +78 -0
- package/skills/sw-document-feature/reference/scaffold/_config.yml +51 -0
- package/skills/sw-document-feature/reference/scaffold/adr/index.md +44 -0
- package/skills/sw-document-feature/reference/scaffold/baseline/glossary.md +55 -0
- package/skills/sw-document-feature/reference/scaffold/baseline/tech-stack.md +48 -0
- package/skills/sw-document-feature/reference/scaffold/domains/index.md +55 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/configuration.md +54 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/customization-guidelines.md +47 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/debugging.md +55 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/environments-and-deployment.md +49 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/extensions-inventory.md +40 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/index.md +39 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/logging.md +46 -0
- package/skills/sw-document-feature/reference/scaffold/guidelines/documentation-guidelines.md +102 -0
- package/skills/sw-document-feature/reference/scaffold/guidelines/index.md +50 -0
- package/skills/sw-document-feature/reference/scaffold/index.md +68 -0
- package/skills/sw-document-feature/reference/scaffold/vanilla/README.md +24 -0
- package/skills/sw-document-feature/reference/scaffold/vanilla/adr/index.md +36 -0
- package/skills/sw-document-feature/reference/scaffold/vanilla/index.md +68 -0
- package/skills/sw-document-feature/reference/setup-wiki.md +142 -0
- package/skills/sw-document-feature/reference/source-mapping.md +71 -0
- package/skills/sw-document-feature/reference/templates/adr.md +26 -0
- package/skills/sw-document-feature/reference/templates/domain-index.md +36 -0
- package/skills/sw-document-feature/reference/templates/feature-page.md +64 -0
- package/skills/sw-document-feature/reference/templates/guideline.md +42 -0
- package/skills/sw-implement-feature/SKILL.md +52 -0
- package/skills/sw-implement-feature/reference/ac-loop.md +24 -0
- package/skills/sw-implement-feature/reference/build-order.md +17 -0
- package/skills/sw-implement-feature/reference/delegation.md +18 -0
- package/skills/sw-setup/SKILL.md +144 -0
- package/skills/sw-setup/reference/rows.md +223 -0
- package/skills/sw-verify-feature/SKILL.md +64 -0
- package/skills/sw-verify-feature/reference/reconcile-and-report.md +42 -0
- package/skills/sw-verify-feature/reference/verification-report-template.md +57 -0
- package/skills/sw-verify-feature-ac-tests/SKILL.md +76 -0
- package/skills/sw-verify-feature-ac-tests/reference/audit-execute-score.md +40 -0
- package/skills/sw-verify-feature-architecture/SKILL.md +66 -0
- package/skills/sw-verify-feature-architecture/reference/guidelines-and-twig.md +27 -0
- package/skills/sw-verify-feature-code-quality/SKILL.md +73 -0
- package/skills/sw-verify-feature-code-quality/reference/gates.md +22 -0
package/.mcp.json
ADDED
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.
|
package/CONTRIBUTING.md
ADDED
|
@@ -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.
|