@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 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 `--no-companions` (skip
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
- # 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
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: "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.
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: 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.
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: 1d248ea38a0118ce2ebcea32f8dc780934bb6228e29c1b034baa1b3c43e102ea
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: \"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."
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: 72f167887e7d97164c0c7bb2ed03e23dd041fb868746857744bcd255909a03d5
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: 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."
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 — containers, 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. |
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@0.1.0 status
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: \"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."
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: 1d248ea38a0118ce2ebcea32f8dc780934bb6228e29c1b034baa1b3c43e102ea -->
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: 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."
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: 72f167887e7d97164c0c7bb2ed03e23dd041fb868746857744bcd255909a03d5 -->
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, parseJsonLoose,
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
- const hash = sha256(fenceInner(action.body, action.syntax));
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('apply', 'apply refuses to write without --yes',
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('apply', e.message, {
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('apply', `cannot write the lock file at ${LOCK_FILE}`, {
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('apply', `${summary.failed} change(s) failed`, body) : out.ok('apply', body);
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 — 11 \`sw-*\` skills and 7
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} status\`
21
- Read-only. Reports which hosts are present, what is already installed, and
22
- anything that has drifted since it was installed. Always safe.
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} plan\`
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
- 3. \`${RUN} apply --yes\`
29
- Performs the changes. It refuses without \`--yes\`; there is no prompt,
30
- because Codex's question tool does not block outside Plan mode and CI has no
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
- 4. \`${RUN} uninstall --yes\`
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} status`,
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.0",
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 --test test/*.test.mjs scripts/*.test.mjs",
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.0",
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
- One call to a structured question tool if you have one (Claude Code: `AskUserQuestion`; Codex: `request_user_input`), asked once ever per wiki. Question 2 is included only when the answer to question 1 is Jekyll — if the tool cannot express that dependency, ask question 1 alone first, then 2–3 in a second call.
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 skipped (no `_config.yml` to configure) → 15 writes, overlay files from `reference/scaffold/vanilla/` → table: 15 created, `flavor | Vanilla / plain Markdown` → continue at step 1.
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
 
@@ -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 — containers, 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.
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@0.1.0 *)
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@0.1.0 guide
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@0.1.0 status
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 `docker compose ps`,
50
- one version command, one `kb_status` call. Never write, never install, never
51
- ask a question in this step.
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@0.1.0 plan
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
- (Containers → vendor/ → Visual editors → KB MCP → Acceptance-test project →
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@0.1.0 apply --yes`
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 needs a running container states so in the step list and stops
116
- before running if the Containers row is still unticked at execution time.
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 twelve environment rows:
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. Containers
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`"). Needs the Containers row ticked first.
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
- ## 3. Node
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
- ## 4. Visual editors (optional)
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@0.1.0 apply --yes
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
- ## 5. shopware-cli
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
- ## 6. KB MCP
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
- ## 7. Acceptance-test project
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
- ## 8. Playwright browsers
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
- ## 9. ATS env
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
- ## 10. Plugin tests, per `custom/plugins/<Name>`
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. Needs the Containers row ticked for the `npm install` steps
185
- that run inside the container.
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
- ## 11. Project wiki
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
- ## 12. `.gitignore`
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