@execuro-sw-ecosystem/sw-ecosystem-agentic-harness 0.1.0 → 0.1.2
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/CHANGELOG.md +24 -0
- package/README.md +30 -13
- package/agents/sw-php-backend-developer.md +1 -1
- package/agents/sw-tender-editor.md +1 -1
- package/bin/cli.mjs +5 -0
- package/codex/agents/sw-php-backend-developer.toml +2 -2
- package/codex/agents/sw-tender-editor.toml +2 -2
- package/content/AGENTS.md +2 -2
- package/copilot/agents/sw-php-backend-developer.agent.md +2 -2
- package/copilot/agents/sw-tender-editor.agent.md +2 -2
- package/lib/actions.mjs +7 -6
- package/lib/commands.mjs +8 -5
- package/lib/guide.mjs +25 -11
- package/lib/merge.mjs +10 -0
- package/package.json +2 -2
- package/plugin.json +1 -1
- package/skills/sw-design-requirements/SKILL.md +1 -1
- package/skills/sw-design-solution/SKILL.md +1 -1
- package/skills/sw-discover-tender/SKILL.md +1 -1
- package/skills/sw-document-feature/SKILL.md +1 -1
- package/skills/sw-document-feature/reference/setup-wiki.md +7 -2
- package/skills/sw-implement-feature/SKILL.md +1 -1
- package/skills/sw-setup/SKILL.md +14 -14
- package/skills/sw-setup/reference/rows.md +17 -26
- package/skills/sw-verify-feature/SKILL.md +1 -1
- package/skills/sw-verify-feature-ac-tests/SKILL.md +1 -1
- package/skills/sw-verify-feature-architecture/SKILL.md +1 -1
- package/skills/sw-verify-feature-code-quality/SKILL.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,30 @@ release.
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.1.2] - 2026-09-16
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **Install/update instructions now anchor to `@latest`.** Every `npx`
|
|
15
|
+
invocation of this package in `README.md`, `sw-setup`'s `SKILL.md` and
|
|
16
|
+
`reference/rows.md` uses `@execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest`
|
|
17
|
+
instead of a bare package name or a frozen version — a bare invocation can
|
|
18
|
+
resolve to a stale copy already in the `npx` cache or `node_modules`. Added
|
|
19
|
+
a **Keep up to date** section to `README.md` and a **Keeping it current**
|
|
20
|
+
section to `guide`'s output.
|
|
21
|
+
|
|
22
|
+
## [0.1.1] - 2026-09-16
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- **An `install` command** — `apply --yes` under a friendlier one-step name.
|
|
27
|
+
Typing the verb is the consent, so it never prompts and needs no `--yes`; the
|
|
28
|
+
scriptable `apply --yes` is unchanged and stays what skills and CI call.
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- CI and the GitHub Pages setup for the plugin marketplace.
|
|
33
|
+
|
|
10
34
|
## [0.1.0] - 2026-09-16
|
|
11
35
|
|
|
12
36
|
### Added
|
package/README.md
CHANGED
|
@@ -49,6 +49,7 @@ declines is fully set up without them, and `--editor` on `sw-design-requirements
|
|
|
49
49
|
|
|
50
50
|
| Command | What it does |
|
|
51
51
|
| --- | --- |
|
|
52
|
+
| `install` | installs into every detected host; the same as `apply --yes` |
|
|
52
53
|
| `status` | read-only; what is installed, what drifted, which optional companion packages are present |
|
|
53
54
|
| `plan` | the exact changes, written as a diff; writes nothing |
|
|
54
55
|
| `apply --yes` | performs them |
|
|
@@ -58,22 +59,18 @@ declines is fully set up without them, and `--editor` on `sw-design-requirements
|
|
|
58
59
|
Flags: `--host claude-code|codex|copilot|cursor` (repeatable; omitting it
|
|
59
60
|
selects every host that is present), `--scope project|user` (default
|
|
60
61
|
`project`), `--root <path>` (default the current directory), `--yes` (required
|
|
61
|
-
by `apply` and `uninstall`, never prompts), and
|
|
62
|
-
detection of the optional editor packages).
|
|
62
|
+
by `apply` and `uninstall`, never prompts — `install` implies it), and
|
|
63
|
+
`--no-companions` (skip detection of the optional editor packages).
|
|
63
64
|
|
|
64
65
|
## Install
|
|
65
66
|
|
|
66
67
|
```bash
|
|
67
|
-
|
|
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
|
|
68
|
+
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest install
|
|
75
69
|
```
|
|
76
70
|
|
|
71
|
+
Want to look first? `status` is read-only and `plan` prints the diff; neither
|
|
72
|
+
writes anything.
|
|
73
|
+
|
|
77
74
|
Then restart your coding agent — every host reads its configuration at startup.
|
|
78
75
|
The command's output tells you which ones and how.
|
|
79
76
|
|
|
@@ -83,6 +80,26 @@ not block outside Plan mode, and CI has no terminal. Add `--host claude-code`
|
|
|
83
80
|
home directory instead of this repository. The default scope is the project —
|
|
84
81
|
nothing is written under `~` unless you ask.
|
|
85
82
|
|
|
83
|
+
## Keep up to date
|
|
84
|
+
|
|
85
|
+
The same command updates:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest install
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
It rewrites what it owns, leaves anything you hand-edited alone (reported as
|
|
92
|
+
drift), and records the new version in the lock file. The `@latest` matters:
|
|
93
|
+
without it, `npx` can reuse a copy already in its cache or in this project's
|
|
94
|
+
`node_modules`, so you would silently keep running whatever version you first
|
|
95
|
+
installed. Restart your coding agent afterwards, same as a first install.
|
|
96
|
+
|
|
97
|
+
Want to check what you have first? `... @latest status` reports
|
|
98
|
+
`installed_version` and any drift, and writes nothing. The Specs Editor and
|
|
99
|
+
Tender Discovery Tool are separate packages and update on their own `npm i -D
|
|
100
|
+
<package>@<version>` line — `status`'s `companions` array names the exact
|
|
101
|
+
command for each.
|
|
102
|
+
|
|
86
103
|
### What it writes
|
|
87
104
|
|
|
88
105
|
| Host | Skills | Sub-agents | MCP | Settings |
|
|
@@ -111,7 +128,7 @@ Codex never reads `CLAUDE.md`.
|
|
|
111
128
|
Undo everything with:
|
|
112
129
|
|
|
113
130
|
```bash
|
|
114
|
-
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness uninstall --yes
|
|
131
|
+
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest uninstall --yes
|
|
115
132
|
```
|
|
116
133
|
|
|
117
134
|
It removes exactly what the lock file at `.sw-ai-sdk/harness.lock.json` records,
|
|
@@ -125,7 +142,7 @@ installed skill file goes stale and the CLI does not. Anything that needs the
|
|
|
125
142
|
protocol runs:
|
|
126
143
|
|
|
127
144
|
```bash
|
|
128
|
-
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness guide
|
|
145
|
+
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest guide
|
|
129
146
|
```
|
|
130
147
|
|
|
131
148
|
## Prerequisites
|
|
@@ -210,7 +227,7 @@ instead — it then applies across every repo without per-repo commits.
|
|
|
210
227
|
|
|
211
228
|
```bash
|
|
212
229
|
# 1. the install is complete and undrifted
|
|
213
|
-
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness status
|
|
230
|
+
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest status
|
|
214
231
|
|
|
215
232
|
# 2. the toolchain the agents call actually exists
|
|
216
233
|
shopware-cli project console --help
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
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
|
|
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
4
|
model: inherit
|
|
5
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
6
|
color: blue
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sw-tender-editor
|
|
3
|
-
description: Mechanical file worker for the sw-discover-tender skill — extracts requirement tables from a tender's source export into cluster files, merges PM/architect/QA cluster reports into finished §4 row blocks, splices those blocks into the analysis sidecar, and assembles and checks the final response CSVs. Deterministic, no judgment
|
|
3
|
+
description: Mechanical file worker for the sw-discover-tender skill — extracts requirement tables from a tender's source export into cluster files, merges PM/architect/QA cluster reports into finished §4 row blocks, splices those blocks into the analysis sidecar, and assembles and checks the final response CSVs. Deterministic, no judgment — every value it writes comes from a named input file, never from memory or estimation. Not for research, feasibility checks, effort estimation or any judgment call — that is `sw-product-manager`, `sw-shopware-architect` and `sw-qa-engineer`'s work; this agent only reshapes what they already produced into the file the skill needs next.
|
|
4
4
|
tools: Read, Write, Edit, Glob, Grep
|
|
5
5
|
---
|
|
6
6
|
|
package/bin/cli.mjs
CHANGED
|
@@ -21,18 +21,23 @@ const COMMANDS = {
|
|
|
21
21
|
status: async () => (await import('../lib/commands.mjs')).status,
|
|
22
22
|
plan: async () => (await import('../lib/commands.mjs')).plan,
|
|
23
23
|
apply: async () => (await import('../lib/commands.mjs')).apply,
|
|
24
|
+
install: async () => (await import('../lib/commands.mjs')).install,
|
|
24
25
|
uninstall: async () => (await import('../lib/commands.mjs')).uninstall,
|
|
25
26
|
guide: async () => (await import('../lib/guide.mjs')).main,
|
|
26
27
|
};
|
|
27
28
|
|
|
28
29
|
const USAGE = `usage: sw-ecosystem-agentic-harness <command> [options]
|
|
29
30
|
|
|
31
|
+
install [--host <h>] [--scope project|user] [--root <path>] [--no-companions]
|
|
30
32
|
status [--host <h>] [--scope project|user] [--root <path>]
|
|
31
33
|
plan [--host <h>] [--scope project|user] [--root <path>] [--no-companions]
|
|
32
34
|
apply --yes [--host <h>] [--scope project|user] [--root <path>] [--no-companions]
|
|
33
35
|
uninstall --yes [--host <h>] [--scope project|user] [--root <path>]
|
|
34
36
|
guide print the install protocol
|
|
35
37
|
|
|
38
|
+
install is apply --yes under a friendlier name: the whole install in one
|
|
39
|
+
command, no --yes needed — typing the verb is the consent.
|
|
40
|
+
|
|
36
41
|
<h> is one of: claude-code, codex, copilot, cursor. Repeat --host to select
|
|
37
42
|
several; omitting it selects every host that is present.
|
|
38
43
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Generated by scripts/gen-codex-agents.mjs — do not edit.
|
|
2
2
|
# source: agents/sw-php-backend-developer.md
|
|
3
|
-
# source-sha256:
|
|
3
|
+
# source-sha256: ea82533b10d08e276f3c82da3555fd49f66b4141850990bca3e7e878fe07df61
|
|
4
4
|
|
|
5
5
|
name = "sw-php-backend-developer"
|
|
6
|
-
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
|
|
6
|
+
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."
|
|
7
7
|
|
|
8
8
|
developer_instructions = '''
|
|
9
9
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Generated by scripts/gen-codex-agents.mjs — do not edit.
|
|
2
2
|
# source: agents/sw-tender-editor.md
|
|
3
|
-
# source-sha256:
|
|
3
|
+
# source-sha256: 288b5d684f40ea62aa2b6021cfa3109a7f664fc2365f32109bcd9d1f94eb8a2c
|
|
4
4
|
|
|
5
5
|
name = "sw-tender-editor"
|
|
6
|
-
description = "Mechanical file worker for the sw-discover-tender skill — extracts requirement tables from a tender's source export into cluster files, merges PM/architect/QA cluster reports into finished §4 row blocks, splices those blocks into the analysis sidecar, and assembles and checks the final response CSVs. Deterministic, no judgment
|
|
6
|
+
description = "Mechanical file worker for the sw-discover-tender skill — extracts requirement tables from a tender's source export into cluster files, merges PM/architect/QA cluster reports into finished §4 row blocks, splices those blocks into the analysis sidecar, and assembles and checks the final response CSVs. Deterministic, no judgment — every value it writes comes from a named input file, never from memory or estimation. Not for research, feasibility checks, effort estimation or any judgment call — that is `sw-product-manager`, `sw-shopware-architect` and `sw-qa-engineer`'s work; this agent only reshapes what they already produced into the file the skill needs next."
|
|
7
7
|
|
|
8
8
|
developer_instructions = '''
|
|
9
9
|
|
package/content/AGENTS.md
CHANGED
|
@@ -16,7 +16,7 @@ procedure, and the detail lives in `reference/*.md` files beside its
|
|
|
16
16
|
| `sw-discover-tender` | Analyse a client tender (RFP, RFI or RFQ) for a Shopware 6 project into one markdown sidecar, <source basename>-analysis.md. |
|
|
17
17
|
| `sw-document-feature` | Document one Shopware project feature into the LLM-wiki under docs/project-wiki/ — one feature page per surface (administration/ and/or storefront/), the "why" row in the domain index, ADR pages only promoted from the WIP ADR files sw-design-solution extracted into specs/ once they are accepted and built (with an organised table of contents) or provided by the user (never invented). |
|
|
18
18
|
| `sw-implement-feature` | Implement a feature from its technical spec (specs/NNNN-slug-spec.md, written by sw-design-solution) following TDD — tests first per acceptance criterion, then the implementation, fixing until every relevant test passes (including that AC's own acceptance/e2e test, run immediately, not deferred), running Shopware's own shopware-cli fixers/static-analysis per AC to conform to Shopware's coding standards as code is written rather than after the fact. |
|
|
19
|
-
| `sw-setup` | Print one environment-readiness table for the project's development/test setup —
|
|
19
|
+
| `sw-setup` | Print one environment-readiness table for the project's development/test setup — vendor/, Node, the editor CLIs, shopware-cli, the KB MCP, the acceptance-test project, Playwright browsers, its .env, per-plugin test scaffolding, the project wiki and `.gitignore`, plus the installer CLI's own configuration/drift status. |
|
|
20
20
|
| `sw-verify-feature` | Verify a feature implementation against its technical spec (specs/NNNN-slug-spec.md) by running three independent verifiers in parallel — AC test coverage/health, architecture/guideline compliance, and code quality/static analysis — then cross-checking their verdicts into one final per-AC pass/not pass/partly report. |
|
|
21
21
|
| `sw-verify-feature-ac-tests` | Verify that a feature's acceptance criteria are backed by tests that actually exist, actually pass, and actually test what their name/comment/PHPDoc claims. |
|
|
22
22
|
| `sw-verify-feature-architecture` | Verify that a feature's implementation matches the architectural decisions its spec made, and complies with Shopware's own Core conventions plus any written Project guidelines this repo defines. |
|
|
@@ -45,7 +45,7 @@ and installs the harness configuration — permission rules and the MCP
|
|
|
45
45
|
server registrations — through the installer CLI:
|
|
46
46
|
|
|
47
47
|
```
|
|
48
|
-
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@
|
|
48
|
+
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest status
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
The Shopware knowledge base is served by the `ShopwareDevKnowledgeBase`
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
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
|
|
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
4
|
tools: [read, edit, search, execute]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!-- Generated by scripts/gen-copilot-agents.mjs — do not edit. -->
|
|
8
8
|
<!-- source: agents/sw-php-backend-developer.md -->
|
|
9
|
-
<!-- source-sha256:
|
|
9
|
+
<!-- source-sha256: ea82533b10d08e276f3c82da3555fd49f66b4141850990bca3e7e878fe07df61 -->
|
|
10
10
|
# PHP Backend Developer (Shopware 6)
|
|
11
11
|
|
|
12
12
|
## Identity
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "sw-tender-editor"
|
|
3
|
-
description: "Mechanical file worker for the sw-discover-tender skill — extracts requirement tables from a tender's source export into cluster files, merges PM/architect/QA cluster reports into finished §4 row blocks, splices those blocks into the analysis sidecar, and assembles and checks the final response CSVs. Deterministic, no judgment
|
|
3
|
+
description: "Mechanical file worker for the sw-discover-tender skill — extracts requirement tables from a tender's source export into cluster files, merges PM/architect/QA cluster reports into finished §4 row blocks, splices those blocks into the analysis sidecar, and assembles and checks the final response CSVs. Deterministic, no judgment — every value it writes comes from a named input file, never from memory or estimation. Not for research, feasibility checks, effort estimation or any judgment call — that is `sw-product-manager`, `sw-shopware-architect` and `sw-qa-engineer`'s work; this agent only reshapes what they already produced into the file the skill needs next."
|
|
4
4
|
tools: [read, edit, search]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!-- Generated by scripts/gen-copilot-agents.mjs — do not edit. -->
|
|
8
8
|
<!-- source: agents/sw-tender-editor.md -->
|
|
9
|
-
<!-- source-sha256:
|
|
9
|
+
<!-- source-sha256: 288b5d684f40ea62aa2b6021cfa3109a7f664fc2365f32109bcd9d1f94eb8a2c -->
|
|
10
10
|
# sw-tender-editor
|
|
11
11
|
|
|
12
12
|
## Identity
|
package/lib/actions.mjs
CHANGED
|
@@ -14,8 +14,8 @@ import {
|
|
|
14
14
|
abs, ensureDir, readMaybe, readTextMaybe, removeDirIfEmpty, removeFile, rel, sha256, writeAtomic,
|
|
15
15
|
} from './fsx.mjs';
|
|
16
16
|
import {
|
|
17
|
-
canonical, deletePointer, fenceInner, findFence, getPointer, mergeArrayUnique,
|
|
18
|
-
removeArrayValues, removeFence, serializeJson, setPointer, upsertFence,
|
|
17
|
+
canonical, deletePointer, fenceInner, findFence, getPointer, mergeArrayUnique, normalizeEol,
|
|
18
|
+
parseJsonLoose, removeArrayValues, removeFence, serializeJson, setPointer, upsertFence,
|
|
19
19
|
} from './merge.mjs';
|
|
20
20
|
import { PKG_ROOT } from './content.mjs';
|
|
21
21
|
import { isDeclined } from './lock.mjs';
|
|
@@ -226,8 +226,9 @@ function previewFence(action, ctx) {
|
|
|
226
226
|
const found = readTextMaybe(target);
|
|
227
227
|
const createdFile = found === null;
|
|
228
228
|
// Hash what will actually sit inside the fence, warning line included, so it
|
|
229
|
-
// can be compared with what `findFence` reads back.
|
|
230
|
-
|
|
229
|
+
// can be compared with what `findFence` reads back. Normalised to LF first —
|
|
230
|
+
// a fence's identity does not depend on the target file's line-ending style.
|
|
231
|
+
const hash = sha256(normalizeEol(fenceInner(action.body, action.syntax)));
|
|
231
232
|
const locked = ctx.lock?.fences?.find(
|
|
232
233
|
(f) => f.file === action.target && f.block === action.block,
|
|
233
234
|
);
|
|
@@ -243,7 +244,7 @@ function previewFence(action, ctx) {
|
|
|
243
244
|
return { ...base, prior: null, state: 'create',
|
|
244
245
|
detail: createdFile ? 'creates the file with a managed block' : 'appends a managed block' };
|
|
245
246
|
}
|
|
246
|
-
const priorHash = sha256(existing.inner);
|
|
247
|
+
const priorHash = sha256(normalizeEol(existing.inner));
|
|
247
248
|
if (priorHash === hash) return { ...base, prior: priorHash, state: 'unchanged', created_file: locked?.created_file ?? false, detail: 'up to date' };
|
|
248
249
|
if (locked && locked.hash !== priorHash) {
|
|
249
250
|
return { ...base, prior: priorHash, state: 'drift', created_file: locked.created_file,
|
|
@@ -401,7 +402,7 @@ export function revert(entry, ctx) {
|
|
|
401
402
|
if (found === null) return { state: 'missing', target: entry.target, reason: 'already gone' };
|
|
402
403
|
const fence = findFence(found.text, entry.block);
|
|
403
404
|
if (!fence) return { state: 'missing', target: entry.target, reason: 'our block is already gone' };
|
|
404
|
-
if (sha256(fence.inner) !== entry.hash) {
|
|
405
|
+
if (sha256(normalizeEol(fence.inner)) !== entry.hash) {
|
|
405
406
|
return { state: 'kept', target: entry.target, reason: 'content inside the managed fence was hand-edited' };
|
|
406
407
|
}
|
|
407
408
|
const { next } = removeFence(found.text, entry.block);
|
package/lib/commands.mjs
CHANGED
|
@@ -245,17 +245,17 @@ const RESTART_HELP = {
|
|
|
245
245
|
cursor: 'Restart Cursor so it re-reads .cursor/mcp.json',
|
|
246
246
|
};
|
|
247
247
|
|
|
248
|
-
export async function apply(argv) {
|
|
248
|
+
export async function apply(argv, label = 'apply') {
|
|
249
249
|
const ctx = buildContext(argv, 'apply');
|
|
250
250
|
if (!ctx.yes) {
|
|
251
|
-
return out.usage(
|
|
251
|
+
return out.usage(label, 'apply refuses to write without --yes',
|
|
252
252
|
[`${RUN} plan`, `${RUN} apply --yes`]);
|
|
253
253
|
}
|
|
254
254
|
|
|
255
255
|
let lock;
|
|
256
256
|
try { lock = loadLock(ctx) ?? lockfile.empty(ctx.scope); } catch (e) {
|
|
257
257
|
if (e instanceof lockfile.LockVersionError) {
|
|
258
|
-
return out.failure(
|
|
258
|
+
return out.failure(label, e.message, {
|
|
259
259
|
next_step: `Upgrade the package: npm i -D ${PKG_NAME}@latest`,
|
|
260
260
|
help: [`npm i -D ${PKG_NAME}@latest`],
|
|
261
261
|
});
|
|
@@ -266,7 +266,7 @@ export async function apply(argv) {
|
|
|
266
266
|
// An apply we cannot record is an apply we cannot undo. Refuse up front
|
|
267
267
|
// rather than leave the user with files and no way back.
|
|
268
268
|
if (!isWritable(abs(ctx.root, LOCK_FILE))) {
|
|
269
|
-
return out.failure(
|
|
269
|
+
return out.failure(label, `cannot write the lock file at ${LOCK_FILE}`, {
|
|
270
270
|
next_step: `Make ${ctx.root} writable, then re-run \`${RUN} apply --yes\`.`,
|
|
271
271
|
help: [`${RUN} status`],
|
|
272
272
|
});
|
|
@@ -345,9 +345,12 @@ export async function apply(argv) {
|
|
|
345
345
|
summary, lock_file: LOCK_FILE, next_step: next, help,
|
|
346
346
|
hosts: [...perHost.values()], actions: results, manual, errors,
|
|
347
347
|
});
|
|
348
|
-
return summary.failed ? out.failure(
|
|
348
|
+
return summary.failed ? out.failure(label, `${summary.failed} change(s) failed`, body) : out.ok(label, body);
|
|
349
349
|
}
|
|
350
350
|
|
|
351
|
+
/** `install` is `apply --yes`: typing the verb is the consent. */
|
|
352
|
+
export const install = (argv) => apply(['--yes', ...argv], 'install');
|
|
353
|
+
|
|
351
354
|
// --------------------------------------------------------------- uninstall
|
|
352
355
|
|
|
353
356
|
export async function uninstall(argv) {
|
package/lib/guide.mjs
CHANGED
|
@@ -11,26 +11,32 @@ const RUN = `npx -y ${PKG_NAME}@${PKG_VERSION}`;
|
|
|
11
11
|
|
|
12
12
|
export const GUIDE = `# ${PKG_NAME} — install protocol
|
|
13
13
|
|
|
14
|
-
This CLI installs the Shopware agentic harness —
|
|
14
|
+
This CLI installs the Shopware agentic harness — 10 \`sw-*\` skills and 7
|
|
15
15
|
\`sw-*\` sub-agents — into whichever coding agents this repository uses, and
|
|
16
16
|
registers the MCP servers and permission rules they depend on.
|
|
17
17
|
|
|
18
18
|
## The loop
|
|
19
19
|
|
|
20
|
-
1. \`${RUN}
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
1. \`${RUN} install\`
|
|
21
|
+
The whole install in one command. It refuses to prompt — Codex's question
|
|
22
|
+
tool does not block outside Plan mode, and CI has no terminal — so the verb
|
|
23
|
+
itself is the consent. Same as \`apply --yes\`.
|
|
23
24
|
|
|
24
|
-
2. \`${RUN}
|
|
25
|
+
2. \`${RUN} status\`
|
|
26
|
+
Read-only, optional. Reports which hosts are present, what is already
|
|
27
|
+
installed, and anything that has drifted since it was installed. Always safe.
|
|
28
|
+
|
|
29
|
+
3. \`${RUN} plan\`
|
|
25
30
|
Prints the exact set of changes and writes nothing. Every entry says what it
|
|
26
31
|
would do and why. Show this to the user before applying.
|
|
27
32
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
4. \`${RUN} apply --yes\`
|
|
34
|
+
The scriptable name for the same write \`install\` performs — use it for
|
|
35
|
+
re-runs and repairs. It refuses without \`--yes\`; there is no prompt, because
|
|
36
|
+
Codex's question tool does not block outside Plan mode and CI has no
|
|
31
37
|
terminal.
|
|
32
38
|
|
|
33
|
-
|
|
39
|
+
5. \`${RUN} uninstall --yes\`
|
|
34
40
|
Removes what the lock file records and reverts the managed config blocks.
|
|
35
41
|
|
|
36
42
|
## Flags
|
|
@@ -82,6 +88,14 @@ Every host reads its configuration at startup. The result's \`help\` array
|
|
|
82
88
|
names the restart or reload each one needs — pass it on to the user rather
|
|
83
89
|
than assuming the change is already live.
|
|
84
90
|
|
|
91
|
+
## Keeping it current
|
|
92
|
+
|
|
93
|
+
This guide is version ${PKG_VERSION}. To install or upgrade to the newest
|
|
94
|
+
published version, run \`npx -y ${PKG_NAME}@latest install\`. Omitting
|
|
95
|
+
\`@latest\` can reuse a copy already in the \`npx\` cache or this project's
|
|
96
|
+
\`node_modules\`, so you would silently stay on whatever version you first
|
|
97
|
+
installed.
|
|
98
|
+
|
|
85
99
|
## If you are a skill
|
|
86
100
|
|
|
87
101
|
Call this CLI. Do not re-implement any of it, and do not copy this text into a
|
|
@@ -91,8 +105,8 @@ skill file — run \`${RUN} guide\` and follow what it says now.
|
|
|
91
105
|
export async function main() {
|
|
92
106
|
return out.ok('guide', {
|
|
93
107
|
version: PKG_VERSION,
|
|
94
|
-
next_step: `${RUN}
|
|
95
|
-
help: [`${RUN} status`, `${RUN} plan`, `${RUN} apply --yes`],
|
|
108
|
+
next_step: `${RUN} install`,
|
|
109
|
+
help: [`${RUN} install`, `${RUN} status`, `${RUN} plan`, `${RUN} apply --yes`],
|
|
96
110
|
guide: GUIDE,
|
|
97
111
|
});
|
|
98
112
|
}
|
package/lib/merge.mjs
CHANGED
|
@@ -17,6 +17,16 @@
|
|
|
17
17
|
|
|
18
18
|
export const FENCE_ID = 'sw-ecosystem-agentic-harness';
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Collapse CRLF (and stray CR) to LF. A fence's identity is what sits between
|
|
22
|
+
* its markers, not the line-ending style the target file happens to use —
|
|
23
|
+
* `writeAtomic` writes back whatever EOL the file already had, so hashing raw
|
|
24
|
+
* bytes would make the same content look edited on a CRLF checkout.
|
|
25
|
+
*/
|
|
26
|
+
export function normalizeEol(text) {
|
|
27
|
+
return text.replace(/\r\n/g, '\n').replace(/\r/g, '');
|
|
28
|
+
}
|
|
29
|
+
|
|
20
30
|
// ---------------------------------------------------------------- JSON
|
|
21
31
|
|
|
22
32
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@execuro-sw-ecosystem/sw-ecosystem-agentic-harness",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Shopware 6 agentic harness: sw-* skills and sub-agents, plus an installer that writes them into Claude Code, Codex, GitHub Copilot and Cursor.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Execuro UG (haftungsbeschränkt)",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"scripts": {
|
|
50
50
|
"gen": "node scripts/gen-codex-agents.mjs && node scripts/gen-copilot-agents.mjs && node scripts/gen-agents-md.mjs",
|
|
51
51
|
"gen:check": "node scripts/gen-codex-agents.mjs --check && node scripts/gen-copilot-agents.mjs --check && node scripts/gen-agents-md.mjs --check",
|
|
52
|
-
"test": "node
|
|
52
|
+
"test": "node -e \"const{spawnSync}=require('node:child_process');const{readdirSync}=require('node:fs');const list=(dir)=>readdirSync(dir).filter((f)=>f.endsWith('.test.mjs')).map((f)=>dir+'/'+f);const files=[...list('test'),...list('scripts')];const r=spawnSync(process.execPath,['--test',...files],{stdio:'inherit'});process.exit(r.status??1);\"",
|
|
53
53
|
"check:mcp": "node scripts/check-mcp.mjs"
|
|
54
54
|
},
|
|
55
55
|
"publishConfig": {
|
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "sw-ecosystem-agentic-harness",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.2",
|
|
5
5
|
"description": "Shopware 6 agentic harness: sw-* skills and sub-agents for requirements, specs, implementation, verification and documentation, with an installer CLI that writes them into Claude Code, Codex, GitHub Copilot and Cursor. The knowledge-base MCP and the editor tools are separate npm packages.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Execuro UG (haftungsbeschränkt)",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sw-design-requirements
|
|
3
3
|
description: Turn a briefing — chat text or a file, covering one or more features — into a lean, business-only PRD stored as specs/NNNN-slug.md. Runs an interactive clarification loop for the requirement gaps and inconsistencies that actually change the requirements, then scores a weighted confidence %. Use when asked to write, draft, refine, continue, or score a PRD / requirements doc / feature brief for this Shopware project. Never writes a tech spec or answers architecture questions — that's sw-design-solution.
|
|
4
4
|
when_to_use: Trigger phrases — "write a PRD", "draft requirements", "turn this brief into a PRD", "continue PRD 0003", "is this PRD ready for specification", "raise the confidence on this PRD", "requirements for <feature>".
|
|
5
|
-
argument-hint: [file-path | briefing text | specs/NNNN-slug.md to continue] [--editor]
|
|
5
|
+
argument-hint: '[file-path | briefing text | specs/NNNN-slug.md to continue] [--editor]'
|
|
6
6
|
allowed-tools: Read Write Edit Glob Grep AskUserQuestion Agent Skill Bash(ls *) Bash(mkdir -p specs) Bash(npx -y @execuro-sw-ecosystem/sw-specs-editor@0.1.0 *) mcp__ShopwareDevKnowledgeBase__list_docs mcp__ShopwareDevKnowledgeBase__grep_docs mcp__ShopwareDevKnowledgeBase__read_doc mcp__ShopwareDevKnowledgeBase__kb_status
|
|
7
7
|
|
|
8
8
|
---
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sw-design-solution
|
|
3
3
|
description: Turn a PRD (specs/NNNN-slug.md) into a technical spec at specs/NNNN-slug-spec.md. Applies TDD — every acceptance criterion gets an implementation plan and e2e coverage, with Shopware toolchain (shopware-cli/PHPStan/ESLint/Stylelint) conventions baked into decisions up front. Runs a clarification loop for the gaps that change the implementation plan, and on the user's say-so extracts project-wide architecture/stack decisions into ADR files (specs/NNNN-slug-adr-<topic>.md) that gate readiness while proposed. Pre-checks vendor/ and the KB before it starts. Use when asked to write, draft, refine, or continue a tech spec / implementation plan. Never edits the source PRD or answers business/requirements questions — that's sw-design-requirements.
|
|
4
4
|
when_to_use: Trigger phrases — "write the tech spec for PRD 0007", "create an implementation plan for this PRD", "draft the spec", "continue spec 0007", "is this spec ready for implementation".
|
|
5
|
-
argument-hint: [specs/NNNN-slug.md | specs/NNNN-slug-spec.md] [--editor]
|
|
5
|
+
argument-hint: '[specs/NNNN-slug.md | specs/NNNN-slug-spec.md] [--editor]'
|
|
6
6
|
allowed-tools: Read Write Edit Glob Grep AskUserQuestion Agent Skill Bash(ls *) Bash(npx -y @execuro-sw-ecosystem/sw-specs-editor@0.1.0 *) WebSearch WebFetch mcp__ShopwareDevKnowledgeBase__list_docs mcp__ShopwareDevKnowledgeBase__grep_docs mcp__ShopwareDevKnowledgeBase__read_doc mcp__ShopwareDevKnowledgeBase__kb_status
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sw-discover-tender
|
|
3
3
|
description: Analyse a client tender (RFP, RFI or RFQ) for a Shopware 6 project into one markdown sidecar, <source basename>-analysis.md. Every requirement row gets a class against the installed Shopware version (stock / config / plugin / custom), a three-point person-day estimate, one line of mechanism and proposed scope-lock assumptions the partner accepts by ticking checkboxes — in the file or on the Tender Discovery Tool page (`--editor`); the next run reconciles the ticks, dissolves answered questions and re-estimates. At Ready to submit it exports one CSV per client table with compliance, comment and effort filled in the client's columns. Scope and PD only — never costs, prices, licence fees or budgets. Never designs the solution — that's sw-design-solution.
|
|
4
4
|
when_to_use: Trigger phrases — "scope this RFP", "analyse the tender", "answer the RFI", "discover RFP 0001", "continue RFP 0001", "reconcile RFP 0001", "export the response for RFP 0001", "is RFP 0001 ready to submit", "open RFP 0001 in the browser", "open the tender tool", "sw-discover-tender specs/rfp-0001-x-analysis.md --editor".
|
|
5
|
-
argument-hint: [tender file or folder of exports (.xlsx|.md|.txt|.csv|.pdf) | specs/rfp-NNNN-slug-analysis.md to continue] [--editor] [--batch <n|all>] [--export]
|
|
5
|
+
argument-hint: '[tender file or folder of exports (.xlsx|.md|.txt|.csv|.pdf) | specs/rfp-NNNN-slug-analysis.md to continue] [--editor] [--batch <n|all>] [--export]'
|
|
6
6
|
allowed-tools: Read Write Edit Glob Grep Agent AskUserQuestion Bash(ls *) Bash(mkdir -p specs) Bash(mkdir -p specs/.rfp *) Bash(shasum -a 256 *) Bash(npx -y @execuro-sw-ecosystem/sw-tender-discovery-tool@0.1.0 *) Bash(open *) Bash(xdg-open *) Bash(tail *) Bash(grep *) Bash(printf *) mcp__ShopwareDevKnowledgeBase__list_docs mcp__ShopwareDevKnowledgeBase__grep_docs mcp__ShopwareDevKnowledgeBase__read_doc mcp__ShopwareDevKnowledgeBase__kb_status
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sw-document-feature
|
|
3
3
|
description: Document one Shopware project feature into the LLM-wiki under docs/project-wiki/ — one feature page per surface (administration/ and/or storefront/), the "why" row in the domain index, ADR pages only promoted from the WIP ADR files sw-design-solution extracted into specs/ once they are accepted and built (with an organised table of contents) or provided by the user (never invented). Sources are a PRD (specs/NNNN-slug.md), its tech spec (specs/NNNN-slug-spec.md), or the current chat. Runs a mandatory built-check gate first — pages for functionality that does not exist in custom/ or vendor/ are written only after the user explicitly enforces it, and then carry the ⚠️ NOT BUILT block. Never restates code; references paths, extension points, decisions, config. Not for writing PRDs or specs — that's sw-design-requirements / sw-design-solution.
|
|
4
4
|
when_to_use: Trigger phrases — "document this feature", "write the wiki page for spec 0007", "document PRD specs/0003-…", "add docs for <feature>", "update the wiki for <feature>", "put this in the project wiki", "record this as a project coding rule", "override/waive this guideline for our project".
|
|
5
|
-
argument-hint: [path to PRD or spec | empty = use chat] [--setup]
|
|
5
|
+
argument-hint: '[path to PRD or spec | empty = use chat] [--setup]'
|
|
6
6
|
allowed-tools: Read Glob Grep Bash Write Edit Agent AskUserQuestion mcp__ShopwareDevKnowledgeBase__list_docs mcp__ShopwareDevKnowledgeBase__grep_docs mcp__ShopwareDevKnowledgeBase__read_doc mcp__ShopwareDevKnowledgeBase__kb_status
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -27,7 +27,12 @@ On repair the flavor is never asked — derive it: `docs/project-wiki/_config.ym
|
|
|
27
27
|
|
|
28
28
|
## 2. Questions (init only)
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
Asked once ever per wiki with a structured question tool if you have one (Claude Code: `AskUserQuestion`; Codex: `request_user_input`), in **two calls, never one**:
|
|
31
|
+
|
|
32
|
+
- **Call 1 — question 1 on its own.** Wait for the answer.
|
|
33
|
+
- **Call 2 — questions 2 and 3 together, and only when the answer to question 1 was Jekyll.** On Vanilla there is no second call at all: the flavor is the only answer needed.
|
|
34
|
+
|
|
35
|
+
Questions 2 and 3 exist solely to fill `_config.yml`, which the Vanilla flavor does not have. Never put them in the same call as question 1 — no structured question tool can make an option list conditional on another answer in the same call, so a single call asks every user to pick a GitHub Pages deployment style, `baseurl` and all, before anyone has established that the wiki is a Jekyll site.
|
|
31
36
|
|
|
32
37
|
- **Question 1 — "docs/project-wiki/ does not exist yet — set it up as a Jekyll/GitHub Pages site or a plain Markdown wiki?"**
|
|
33
38
|
- Option 1, label "Jekyll / GitHub Pages (Recommended)": adds `_config.yml`, so pages render as a themed site with left sidebar navigation and search (Just the Docs, via `remote_theme:`), plus a Liquid-generated ADR table on top of the hand-maintained ADR index; ready to publish via GitHub Pages or `jekyll serve`.
|
|
@@ -136,7 +141,7 @@ On Jekyll, always name the resolved `baseurl` in that row, and when it was left
|
|
|
136
141
|
## Dry-run examples
|
|
137
142
|
|
|
138
143
|
- **Empty project, no flag** (`composer.json` name `acme/webshop`, lock `6.7.13.0`, origin `git@github.com:acme/webshop-docs.git`): detect → no directory → ask §2 → Jekyll + own repository + default title → resolve `acme/webshop`, `6.7.13`, today, `baseurl: "/webshop-docs"` → announce → sub-agent writes 16 files → table: 16 created, `flavor | Jekyll / GitHub Pages · baseurl "/webshop-docs"`, no drift check (`guidelines/documentation-guidelines.md` was just created) → continue at step 1.
|
|
139
|
-
- **Empty project, user picks Vanilla**: questions 2–3 are
|
|
144
|
+
- **Empty project, user picks Vanilla**: the second call never happens — questions 2–3 are never shown (no `_config.yml` to configure) → 15 writes, overlay files from `reference/scaffold/vanilla/` → table: 15 created, `flavor | Vanilla / plain Markdown` → continue at step 1.
|
|
140
145
|
- **`--setup`, existing wiki with `domains/platform/logging.md` deleted**: repair → flavor derived from `_config.yml` → 1 write → drift check → table: 1 created, kept count, no `flavor` row → stop. Business domains, feature pages and the hand-edited `_config.yml` untouched.
|
|
141
146
|
- **`--setup`, complete wiki**: nothing missing → drift check only → table: N kept → stop.
|
|
142
147
|
- **No flag, complete wiki**: this file is never opened.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sw-implement-feature
|
|
3
3
|
description: Implement a feature from its technical spec (specs/NNNN-slug-spec.md, written by sw-design-solution) following TDD — tests first per acceptance criterion, then the implementation, fixing until every relevant test passes (including that AC's own acceptance/e2e test, run immediately, not deferred), running Shopware's own shopware-cli fixers/static-analysis per AC to conform to Shopware's coding standards as code is written rather than after the fact. Builds ACs group by group per the spec's Parallel groups/Depends on data, fanning out independent ACs to concurrent agent spawns instead of one at a time. Runs sw-verify-feature as its final step to produce a full verification report. Use when asked to implement, build, or code a feature/epic from an existing tech spec.
|
|
4
4
|
when_to_use: Trigger phrases — "implement spec 0007", "build this feature", "code the epic-1 spec", "implement the tech spec".
|
|
5
|
-
argument-hint: [specs/NNNN-slug-spec.md]
|
|
5
|
+
argument-hint: '[specs/NNNN-slug-spec.md]'
|
|
6
6
|
allowed-tools: Read Write Edit Glob Grep Bash Agent mcp__ShopwareDevKnowledgeBase__list_docs mcp__ShopwareDevKnowledgeBase__grep_docs mcp__ShopwareDevKnowledgeBase__read_doc mcp__ShopwareDevKnowledgeBase__kb_status
|
|
7
7
|
---
|
|
8
8
|
|
package/skills/sw-setup/SKILL.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sw-setup
|
|
3
|
-
description: Print one environment-readiness table for the project's development/test setup —
|
|
3
|
+
description: Print one environment-readiness table for the project's development/test setup — vendor/, Node, the editor CLIs, shopware-cli, the KB MCP, the acceptance-test project, Playwright browsers, its .env, per-plugin test scaffolding, the project wiki and `.gitignore`, plus the installer CLI's own configuration/drift status. Stops when every row is ticked. When rows are missing, asks one yes/no question and delegates the fix to the installer CLI. Use when asked to set up the project, check if the environment is ready, or bootstrap the tests. Never designs, implements or verifies a feature itself — that's sw-design-solution, sw-implement-feature and sw-verify-feature, which call this skill first. Never writes a host configuration file itself — that's the installer CLI.
|
|
4
4
|
when_to_use: Trigger phrases — "set up the project", "is the environment ready", "bootstrap the tests", "sw-setup".
|
|
5
|
-
allowed-tools: Read Glob Grep AskUserQuestion Skill Bash mcp__ShopwareDevKnowledgeBase__kb_status Bash(npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@
|
|
5
|
+
allowed-tools: Read Glob Grep AskUserQuestion Skill Bash mcp__ShopwareDevKnowledgeBase__kb_status Bash(npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest *)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# sw-setup
|
|
@@ -20,7 +20,7 @@ copy of this skill can go stale while the CLI does not. For the current
|
|
|
20
20
|
source of truth, run:
|
|
21
21
|
|
|
22
22
|
```
|
|
23
|
-
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@
|
|
23
|
+
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest guide
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
This skill only renders the CLI's output as a table and relays its one
|
|
@@ -40,21 +40,20 @@ table from this run's output — it does not re-run `sw-setup`'s checks.
|
|
|
40
40
|
Run:
|
|
41
41
|
|
|
42
42
|
```
|
|
43
|
-
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@
|
|
43
|
+
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest status
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
It prints one JSON object (`ok`, `next_step`, `help`, and its own
|
|
47
47
|
`hosts[]`/`drift[]` configuration state). Alongside it, run every
|
|
48
48
|
environment row's check from `reference/rows.md` in this skill's directory —
|
|
49
|
-
read-only, seconds each: file/directory existence, one
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
read-only, seconds each: file/directory existence, one version command, one
|
|
50
|
+
`kb_status` call. Never write, never install, never ask a question in this
|
|
51
|
+
step.
|
|
52
52
|
|
|
53
53
|
Print one checkbox list, one line per row — the environment rows first, then
|
|
54
54
|
one line per configuration item the CLI's `hosts[]`/`drift[]` reports:
|
|
55
55
|
|
|
56
56
|
```
|
|
57
|
-
- [x] Containers — web running
|
|
58
57
|
- [x] vendor/ — shopware/core 6.7.13.0
|
|
59
58
|
- [ ] Node — 18.x (need >= 20)
|
|
60
59
|
- [-] Visual editors (optional) — Specs Editor not installed, Tender tool not installed
|
|
@@ -86,11 +85,11 @@ For a missing/drifted configuration row, do not research or plan the fix
|
|
|
86
85
|
yourself — the CLI's `plan` command already has it:
|
|
87
86
|
|
|
88
87
|
```
|
|
89
|
-
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@
|
|
88
|
+
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest plan
|
|
90
89
|
```
|
|
91
90
|
|
|
92
91
|
List the concrete steps in plain words: environment-row fixes in order
|
|
93
|
-
(
|
|
92
|
+
(vendor/ → Visual editors → KB MCP → Acceptance-test project →
|
|
94
93
|
Playwright browsers → ATS env → Plugin tests → Project wiki), then the CLI's
|
|
95
94
|
planned configuration changes last. Skip any row already ticked.
|
|
96
95
|
|
|
@@ -100,7 +99,7 @@ if you have one (Claude Code: `AskUserQuestion`; Codex: `request_user_input`,
|
|
|
100
99
|
which is non-blocking outside Plan mode — so end the turn after asking).
|
|
101
100
|
Options:
|
|
102
101
|
- **Yes, run it** — run the environment-row fixes in order, then
|
|
103
|
-
`npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@
|
|
102
|
+
`npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest apply --yes`
|
|
104
103
|
for the configuration changes, then re-run step 1 and print the final table.
|
|
105
104
|
- **No, stop** — stop; the table from step 1 is already on screen.
|
|
106
105
|
|
|
@@ -112,8 +111,9 @@ Options:
|
|
|
112
111
|
itself) are reported with install advice only, never installed.
|
|
113
112
|
- Credentials (ATS env values) are prompted for as part of the single
|
|
114
113
|
question in step 3, never invented, never printed back once entered.
|
|
115
|
-
- A fix that
|
|
116
|
-
|
|
114
|
+
- A fix that runs inside a container says so in the step list; if the
|
|
115
|
+
container is not running at execution time it stops and reports that —
|
|
116
|
+
sw-setup never starts the developer's stack itself.
|
|
117
117
|
- The Project wiki fix invokes `sw-document-feature --setup` with the Skill
|
|
118
118
|
tool; the KB MCP row only reports whether the platform layer is built —
|
|
119
119
|
the corpus ships already built inside the
|
|
@@ -137,7 +137,7 @@ line:
|
|
|
137
137
|
|
|
138
138
|
## Reference files
|
|
139
139
|
|
|
140
|
-
`reference/rows.md` in this skill's directory — the
|
|
140
|
+
`reference/rows.md` in this skill's directory — the eleven environment rows:
|
|
141
141
|
check command(s), what "ticked" means, the fix steps verbatim from the
|
|
142
142
|
guideline, and which skills the row blocks. Host configuration state (what
|
|
143
143
|
gets installed into `.mcp.json`, permissions, `.gitignore`) is not in this
|
|
@@ -6,18 +6,7 @@ unticked. Host configuration files (`.mcp.json` entries, `.gitignore` lines,
|
|
|
6
6
|
permission grants) are not rows here — the installer CLI owns them and
|
|
7
7
|
reports their state in its own `status`/`plan` output; see `SKILL.md`.
|
|
8
8
|
|
|
9
|
-
## 1.
|
|
10
|
-
|
|
11
|
-
- **Check:** `docker compose ps` — service `web` (or the service named in
|
|
12
|
-
`compose.yaml`) shows `running`/`healthy`.
|
|
13
|
-
- **Ticked:** the `web` service is up.
|
|
14
|
-
- **Fix:** `docker compose up -d` (guideline §6.1). If the shop was never
|
|
15
|
-
installed: `docker compose exec web php bin/console system:install --basic-setup --force --no-interaction` (guideline §6.1).
|
|
16
|
-
- **Blocks:** every other row's fix that runs `docker compose exec web …`
|
|
17
|
-
(vendor/, plugin tests). Design/implement/verify skills that need a running
|
|
18
|
-
shop for live checks.
|
|
19
|
-
|
|
20
|
-
## 2. vendor/
|
|
9
|
+
## 1. vendor/
|
|
21
10
|
|
|
22
11
|
- **Check:** `vendor/shopware/core` exists, `composer.lock` exists,
|
|
23
12
|
`vendor/bin/phpunit` exists — file presence only, never a host
|
|
@@ -28,11 +17,12 @@ reports their state in its own `status`/`plan` output; see `SKILL.md`.
|
|
|
28
17
|
`composer.lock`.
|
|
29
18
|
- **Fix:** `docker compose exec web composer install --no-interaction`
|
|
30
19
|
(guideline §6.1 — "a vendor tree built with `--no-dev` has no
|
|
31
|
-
`vendor/bin/phpunit`").
|
|
20
|
+
`vendor/bin/phpunit`"). Runs inside the `web` container; if it is not
|
|
21
|
+
running, stop and report that — sw-setup never starts the stack itself.
|
|
32
22
|
- **Blocks:** `sw-design-solution`, `sw-implement-feature`,
|
|
33
23
|
`sw-verify-feature` (and its architecture/code-quality/ac-tests sub-skills).
|
|
34
24
|
|
|
35
|
-
##
|
|
25
|
+
## 2. Node
|
|
36
26
|
|
|
37
27
|
- **Check:** `node --version`; parse major and minor.
|
|
38
28
|
- **Ticked:** ≥ 20. Warn (do not fail) when < 20.15: the Tender Discovery Tool
|
|
@@ -45,7 +35,7 @@ reports their state in its own `status`/`plan` output; see `SKILL.md`.
|
|
|
45
35
|
(the knowledge-base MCP), the acceptance-test project,
|
|
46
36
|
Playwright.
|
|
47
37
|
|
|
48
|
-
##
|
|
38
|
+
## 3. Visual editors (optional)
|
|
49
39
|
|
|
50
40
|
The Specs Editor and the Tender Discovery Tool are **optional add-ons**, not
|
|
51
41
|
part of this plugin. The installer CLI installs them itself, per host — this
|
|
@@ -70,7 +60,7 @@ So this row never blocks readiness. It asks.
|
|
|
70
60
|
`package` field from `companions[]`), then re-run
|
|
71
61
|
|
|
72
62
|
```
|
|
73
|
-
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@
|
|
63
|
+
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest apply --yes
|
|
74
64
|
```
|
|
75
65
|
|
|
76
66
|
which places one `SKILL.md` per companion into each selected host's own
|
|
@@ -87,7 +77,7 @@ So this row never blocks readiness. It asks.
|
|
|
87
77
|
Discovery Tool missing → `sw-discover-tender --editor` and its `.xlsx`
|
|
88
78
|
import, plus the `sw-tender-discovery-tool` skill.
|
|
89
79
|
|
|
90
|
-
##
|
|
80
|
+
## 4. shopware-cli
|
|
91
81
|
|
|
92
82
|
- **Check:** `command -v shopware-cli`.
|
|
93
83
|
- **Ticked:** present on `PATH`.
|
|
@@ -98,7 +88,7 @@ So this row never blocks readiness. It asks.
|
|
|
98
88
|
(static analysis, Twig linters), `sw-implement-feature` (per-AC
|
|
99
89
|
`extension fix`/`extension validate`).
|
|
100
90
|
|
|
101
|
-
##
|
|
91
|
+
## 5. KB MCP
|
|
102
92
|
|
|
103
93
|
- **Check:** `mcp__ShopwareDevKnowledgeBase__kb_status` reports the `platform`
|
|
104
94
|
layer as `implemented`. (Whether the `ShopwareDevKnowledgeBase` entry
|
|
@@ -118,7 +108,7 @@ So this row never blocks readiness. It asks.
|
|
|
118
108
|
`sw-design-solution` step 0.5/step 3 (KB grep), `sw-product-manager`,
|
|
119
109
|
`sw-shopware-architect`.
|
|
120
110
|
|
|
121
|
-
##
|
|
111
|
+
## 6. Acceptance-test project
|
|
122
112
|
|
|
123
113
|
- **Check:** `tests/acceptance/package.json` exists and lists
|
|
124
114
|
`@shopware-ag/acceptance-test-suite` as a dependency;
|
|
@@ -137,7 +127,7 @@ So this row never blocks readiness. It asks.
|
|
|
137
127
|
- **Blocks:** `sw-implement-feature` (e2e authoring by `sw-qa-engineer`),
|
|
138
128
|
`sw-verify-feature-ac-tests` (Playwright execution).
|
|
139
129
|
|
|
140
|
-
##
|
|
130
|
+
## 7. Playwright browsers
|
|
141
131
|
|
|
142
132
|
- **Check:** `npx playwright install --dry-run` output (or
|
|
143
133
|
`~/.cache/ms-playwright`/the project-local browsers path) shows Chromium
|
|
@@ -148,7 +138,7 @@ So this row never blocks readiness. It asks.
|
|
|
148
138
|
ticked (the `@playwright/test` version comes from there).
|
|
149
139
|
- **Blocks:** `sw-implement-feature` (e2e execution), `sw-verify-feature-ac-tests`.
|
|
150
140
|
|
|
151
|
-
##
|
|
141
|
+
## 8. ATS env
|
|
152
142
|
|
|
153
143
|
- **Check:** `tests/acceptance/.env` exists.
|
|
154
144
|
- **Ticked:** file exists and defines `APP_URL`, `SHOPWARE_ADMIN_USERNAME`,
|
|
@@ -163,7 +153,7 @@ So this row never blocks readiness. It asks.
|
|
|
163
153
|
entered. Needs the Acceptance-test project row ticked.
|
|
164
154
|
- **Blocks:** `sw-implement-feature` (e2e execution), `sw-verify-feature-ac-tests`.
|
|
165
155
|
|
|
166
|
-
##
|
|
156
|
+
## 9. Plugin tests, per `custom/plugins/<Name>`
|
|
167
157
|
|
|
168
158
|
- **Enumerate:** `ls custom/plugins`; one row per directory found.
|
|
169
159
|
- **Check per plugin:**
|
|
@@ -181,12 +171,13 @@ So this row never blocks readiness. It asks.
|
|
|
181
171
|
`phpunit.xml.dist` from §3.3, `tests/TestBootstrap.php` from §3.4 (fill
|
|
182
172
|
`<Name>`/`<Vendor>` from `composer.json`), Jest config(s) from §3.5 (option
|
|
183
173
|
(a), plugin-local preset), `package.json` scripts block from §3.5's closing
|
|
184
|
-
JSON snippet.
|
|
185
|
-
that
|
|
174
|
+
JSON snippet. The `npm install` steps run inside the `web` container; if it
|
|
175
|
+
is not running, stop and report that — sw-setup never starts the stack
|
|
176
|
+
itself.
|
|
186
177
|
- **Blocks:** `sw-implement-feature` (PHPUnit/Jest execution for that
|
|
187
178
|
plugin's ACs), `sw-verify-feature` (and its sub-skills, for that plugin).
|
|
188
179
|
|
|
189
|
-
##
|
|
180
|
+
## 10. Project wiki
|
|
190
181
|
|
|
191
182
|
- **Check:** `docs/project-wiki/` exists.
|
|
192
183
|
- **Ticked:** directory present.
|
|
@@ -195,7 +186,7 @@ So this row never blocks readiness. It asks.
|
|
|
195
186
|
logic here.
|
|
196
187
|
- **Blocks:** `sw-document-feature`.
|
|
197
188
|
|
|
198
|
-
##
|
|
189
|
+
## 11. `.gitignore`
|
|
199
190
|
|
|
200
191
|
- **Check:** `.gitignore` contains all six lines:
|
|
201
192
|
```
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sw-verify-feature
|
|
3
3
|
description: Verify a feature implementation against its technical spec (specs/NNNN-slug-spec.md) by running three independent verifiers in parallel — AC test coverage/health, architecture/guideline compliance, and code quality/static analysis — then cross-checking their verdicts into one final per-AC pass/not pass/partly report. Wired as the final step of sw-implement-feature; can also be run standalone to (re)check a feature. Not to be confused with the existing "verify-implementation" skill, which is a mock and should be ignored.
|
|
4
4
|
when_to_use: Trigger phrases — "verify spec 0007", "check if this feature is done", "run full verification for this feature", "is epic 1 actually passing".
|
|
5
|
-
argument-hint: [specs/NNNN-slug-spec.md]
|
|
5
|
+
argument-hint: '[specs/NNNN-slug-spec.md]'
|
|
6
6
|
allowed-tools: Read Write Glob Grep Agent
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sw-verify-feature-ac-tests
|
|
3
3
|
description: Verify that a feature's acceptance criteria are backed by tests that actually exist, actually pass, and actually test what their name/comment/PHPDoc claims. Classifies tests by type (API/PHPUnit, Admin Panel/Playwright, Storefront/Playwright, CLI/PHPUnit), runs a test-health audit to catch false, mismatched, or unhealthy tests, then reports per-AC Coverage and Execution as pass / partly / not pass. One of three parallel verifiers spawned by sw-verify-feature; can also be run standalone.
|
|
4
4
|
when_to_use: Trigger phrases — "verify AC tests for spec 0007", "audit test health for this feature", "are these tests actually testing what they claim", "check test coverage for epic 1".
|
|
5
|
-
argument-hint: [specs/NNNN-slug-spec.md]
|
|
5
|
+
argument-hint: '[specs/NNNN-slug-spec.md]'
|
|
6
6
|
allowed-tools: Read Glob Grep Bash mcp__playwright__browser_navigate mcp__playwright__browser_click mcp__playwright__browser_type mcp__playwright__browser_fill_form mcp__playwright__browser_snapshot mcp__playwright__browser_take_screenshot mcp__playwright__browser_wait_for mcp__playwright__browser_console_messages mcp__playwright__browser_network_requests mcp__playwright__browser_evaluate mcp__playwright__browser_select_option mcp__playwright__browser_press_key mcp__playwright__browser_hover mcp__playwright__browser_tabs mcp__playwright__browser_close
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sw-verify-feature-architecture
|
|
3
3
|
description: Verify that a feature's implementation matches the architectural decisions its spec made, and complies with Shopware's own Core conventions plus any written Project guidelines this repo defines. Reports per-AC pass/partly/not pass with the specific guideline or mismatch behind any non-pass. One of three parallel verifiers spawned by sw-verify-feature; can also be run standalone.
|
|
4
4
|
when_to_use: Trigger phrases — "verify architecture for spec 0007", "does this implementation follow the spec's design", "check Core/Project guideline compliance for this feature", "architecture audit for epic 1".
|
|
5
|
-
argument-hint: [specs/NNNN-slug-spec.md]
|
|
5
|
+
argument-hint: '[specs/NNNN-slug-spec.md]'
|
|
6
6
|
allowed-tools: Read Glob Grep Bash mcp__ShopwareDevKnowledgeBase__list_docs mcp__ShopwareDevKnowledgeBase__grep_docs mcp__ShopwareDevKnowledgeBase__read_doc mcp__ShopwareDevKnowledgeBase__kb_status
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sw-verify-feature-code-quality
|
|
3
3
|
description: Verify the code-quality gate for a feature — identifies which tool suites actually apply (PHPStan, ESLint, Stylelint, sw-cli structural validation via shopware-cli, PHPUnit regression), executes them, and checks the touched files against written Core and Project guidelines' quality/style clauses (naming, duplication, dead code, unneeded complexity). Reports whole-plugin gate results plus any per-AC quality defect found in that AC's files. One of three parallel verifiers spawned by sw-verify-feature; can also be run standalone.
|
|
4
4
|
when_to_use: Trigger phrases — "verify code quality for spec 0007", "run static analysis for this feature", "does this pass PHPStan/ESLint", "code quality gate for epic 1".
|
|
5
|
-
argument-hint: [specs/NNNN-slug-spec.md]
|
|
5
|
+
argument-hint: '[specs/NNNN-slug-spec.md]'
|
|
6
6
|
allowed-tools: Read Glob Grep Bash mcp__ShopwareDevKnowledgeBase__list_docs mcp__ShopwareDevKnowledgeBase__grep_docs mcp__ShopwareDevKnowledgeBase__read_doc mcp__ShopwareDevKnowledgeBase__kb_status
|
|
7
7
|
---
|
|
8
8
|
|