@execuro-sw-ecosystem/sw-ecosystem-agentic-harness 0.1.0 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +53 -14
  3. package/SECURITY.md +1 -1
  4. package/agents/sw-php-backend-developer.md +1 -1
  5. package/agents/sw-storefront-developer.md +5 -5
  6. package/agents/sw-tender-editor.md +1 -1
  7. package/bin/cli.mjs +8 -3
  8. package/codex/agents/sw-php-backend-developer.toml +2 -2
  9. package/codex/agents/sw-storefront-developer.toml +6 -6
  10. package/codex/agents/sw-tender-editor.toml +2 -2
  11. package/content/AGENTS.md +2 -2
  12. package/copilot/agents/sw-php-backend-developer.agent.md +2 -2
  13. package/copilot/agents/sw-storefront-developer.agent.md +6 -6
  14. package/copilot/agents/sw-tender-editor.agent.md +2 -2
  15. package/lib/actions.mjs +11 -10
  16. package/lib/commands.mjs +17 -14
  17. package/lib/{companions.mjs → extra-components.mjs} +16 -16
  18. package/lib/guide.mjs +39 -18
  19. package/lib/hosts.mjs +10 -10
  20. package/lib/merge.mjs +10 -0
  21. package/package.json +2 -2
  22. package/plugin.json +1 -1
  23. package/skills/sw-design-requirements/SKILL.md +1 -1
  24. package/skills/sw-design-solution/SKILL.md +1 -1
  25. package/skills/sw-discover-tender/SKILL.md +1 -1
  26. package/skills/sw-document-feature/SKILL.md +1 -1
  27. package/skills/sw-document-feature/reference/setup-wiki.md +7 -2
  28. package/skills/sw-implement-feature/SKILL.md +1 -1
  29. package/skills/sw-setup/SKILL.md +15 -14
  30. package/skills/sw-setup/reference/rows.md +31 -34
  31. package/skills/sw-verify-feature/SKILL.md +1 -1
  32. package/skills/sw-verify-feature-ac-tests/SKILL.md +1 -1
  33. package/skills/sw-verify-feature-architecture/SKILL.md +1 -1
  34. package/skills/sw-verify-feature-code-quality/SKILL.md +1 -1
@@ -1,13 +1,13 @@
1
- // The two optional companion packages, probed rather than installed by us.
1
+ // The two optional extra components, probed rather than installed by us.
2
2
  //
3
3
  // Read-then-copy, not `install-skill --target`: the engine's whole safety
4
4
  // story is "hash what we intend to write, compare, record". A foreign binary
5
5
  // that writes on its own cannot be previewed, so `plan` would lie and
6
6
  // `uninstall` would have to guess. Reading the body with `--print` and
7
- // copying it ourselves through `writeAtomic` keeps every companion skill on
8
- // the same adopt/conflict/drift/update ladder as everything else this CLI
9
- // writes, and makes `uninstall` exact even after the user has removed the
10
- // companion package — the common case, since it is optional.
7
+ // copying it ourselves through `writeAtomic` keeps every extra-component
8
+ // skill on the same adopt/conflict/drift/update ladder as everything else
9
+ // this CLI writes, and makes `uninstall` exact even after the user has
10
+ // removed the extra component — the common case, since it is optional.
11
11
  //
12
12
  // `--no-install` plus `npm_config_yes=false` are two independent guards that
13
13
  // this can never reach the network: the first tells npx not to fetch a
@@ -17,7 +17,7 @@ import { spawnSync } from 'node:child_process';
17
17
  import { sha256 } from './fsx.mjs';
18
18
  import { wrapCommand } from './content.mjs';
19
19
 
20
- export const COMPANIONS = [
20
+ export const EXTRA_COMPONENTS = [
21
21
  {
22
22
  id: 'sw-specs-editor', pkg: '@execuro-sw-ecosystem/sw-specs-editor', version: '0.1.0',
23
23
  label: 'Specs Editor',
@@ -29,8 +29,8 @@ export const COMPANIONS = [
29
29
  ];
30
30
 
31
31
  /** The argv `probe` would spawn, without spawning it — for tests. */
32
- export function probeArgs(companion, platform) {
33
- const spec = `${companion.pkg}@${companion.version}`;
32
+ export function probeArgs(component, platform) {
33
+ const spec = `${component.pkg}@${component.version}`;
34
34
  const wrapped = wrapCommand(
35
35
  { command: 'npx', args: ['--no-install', spec, 'install-skill', '--print'] },
36
36
  platform,
@@ -51,9 +51,9 @@ function lastLine(text) {
51
51
  return lines.length ? lines[lines.length - 1] : '';
52
52
  }
53
53
 
54
- function doProbe(companion, platform) {
55
- const spec = `${companion.pkg}@${companion.version}`;
56
- const base = { id: companion.id, pkg: companion.pkg, version: companion.version, spec, label: companion.label };
54
+ function doProbe(component, platform) {
55
+ const spec = `${component.pkg}@${component.version}`;
56
+ const base = { id: component.id, pkg: component.pkg, version: component.version, spec, label: component.label };
57
57
  const wrapped = wrapCommand(
58
58
  { command: 'npx', args: ['--no-install', spec, 'install-skill', '--print'] },
59
59
  platform,
@@ -103,15 +103,15 @@ function doProbe(companion, platform) {
103
103
  return { ...base, available: true, state: 'available', body: stdout, hash: sha256(stdout), bytes: stdout.length };
104
104
  }
105
105
 
106
- /** Probe one companion. Never throws. */
107
- export function probe(companion, { platform = process.platform } = {}) {
108
- const key = `${companion.pkg}@${companion.version}`;
106
+ /** Probe one extra component. Never throws. */
107
+ export function probe(component, { platform = process.platform } = {}) {
108
+ const key = `${component.pkg}@${component.version}`;
109
109
  if (cache.has(key)) return cache.get(key);
110
- const result = doProbe(companion, platform);
110
+ const result = doProbe(component, platform);
111
111
  cache.set(key, result);
112
112
  return result;
113
113
  }
114
114
 
115
115
  export function probeAll(opts) {
116
- return COMPANIONS.map((c) => probe(c, opts));
116
+ return EXTRA_COMPONENTS.map((c) => probe(c, opts));
117
117
  }
package/lib/guide.mjs CHANGED
@@ -6,31 +6,39 @@
6
6
 
7
7
  import * as out from './out.mjs';
8
8
  import { PKG_NAME, PKG_VERSION } from './content.mjs';
9
+ import { EXTRA_COMPONENTS } from './extra-components.mjs';
9
10
 
10
11
  const RUN = `npx -y ${PKG_NAME}@${PKG_VERSION}`;
12
+ const EXTRA_COMPONENT_INSTALLS = EXTRA_COMPONENTS.map((c) => `npm i -D ${c.pkg}@${c.version}`).join('\n');
11
13
 
12
14
  export const GUIDE = `# ${PKG_NAME} — install protocol
13
15
 
14
- This CLI installs the Shopware agentic harness — 11 \`sw-*\` skills and 7
16
+ This CLI installs the Shopware agentic harness — 10 \`sw-*\` skills and 7
15
17
  \`sw-*\` sub-agents — into whichever coding agents this repository uses, and
16
18
  registers the MCP servers and permission rules they depend on.
17
19
 
18
20
  ## The loop
19
21
 
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.
22
+ 1. \`${RUN} install\`
23
+ The whole install in one command. It refuses to prompt — Codex's question
24
+ tool does not block outside Plan mode, and CI has no terminal — so the verb
25
+ itself is the consent. Same as \`apply --yes\`.
23
26
 
24
- 2. \`${RUN} plan\`
27
+ 2. \`${RUN} status\`
28
+ Read-only, optional. Reports which hosts are present, what is already
29
+ installed, and anything that has drifted since it was installed. Always safe.
30
+
31
+ 3. \`${RUN} plan\`
25
32
  Prints the exact set of changes and writes nothing. Every entry says what it
26
33
  would do and why. Show this to the user before applying.
27
34
 
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
35
+ 4. \`${RUN} apply --yes\`
36
+ The scriptable name for the same write \`install\` performs — use it for
37
+ re-runs and repairs. It refuses without \`--yes\`; there is no prompt, because
38
+ Codex's question tool does not block outside Plan mode and CI has no
31
39
  terminal.
32
40
 
33
- 4. \`${RUN} uninstall --yes\`
41
+ 5. \`${RUN} uninstall --yes\`
34
42
  Removes what the lock file records and reverts the managed config blocks.
35
43
 
36
44
  ## Flags
@@ -38,17 +46,22 @@ registers the MCP servers and permission rules they depend on.
38
46
  --host claude-code|codex|copilot|cursor restrict to one host, repeatable
39
47
  --scope project|user default: project
40
48
  --root <path> default: the current directory
41
- --no-companions skip the optional companion-package skills
49
+ --no-extra-components skip the optional extra-component skills
42
50
 
43
- ## Optional companion packages
51
+ ## Optional extra components
44
52
 
45
53
  Two skills — Specs Editor and Tender Discovery Tool — ship inside their own
46
54
  npm packages, not this one. \`plan\`/\`apply\` detect them offline
47
- (\`npx --no-install\`) and never fetch them. A \`skipped\` action means the
48
- package is not on this machine yet: install it with
49
- \`npm i -D <package>@<version>\` (the exact command is in the action's
50
- \`remedy\`, and in \`status\`'s \`companions\` array), then re-run
51
- \`${RUN} apply --yes\`.
55
+ (\`npx --no-install\`) and never fetch them, probing for the exact version
56
+ this release pins — any other version, including \`@latest\`, is treated as
57
+ absent and the skill is skipped:
58
+
59
+ \`\`\`bash
60
+ ${EXTRA_COMPONENT_INSTALLS}
61
+ \`\`\`
62
+
63
+ The exact command is also in a \`skipped\` action's \`remedy\`, and in
64
+ \`status\`'s \`extra_components\` array. Install it, then re-run \`${RUN} apply --yes\`.
52
65
 
53
66
  ## What you can rely on
54
67
 
@@ -82,6 +95,14 @@ Every host reads its configuration at startup. The result's \`help\` array
82
95
  names the restart or reload each one needs — pass it on to the user rather
83
96
  than assuming the change is already live.
84
97
 
98
+ ## Keeping it current
99
+
100
+ This guide is version ${PKG_VERSION}. To install or upgrade to the newest
101
+ published version, run \`npx -y ${PKG_NAME}@latest install\`. Omitting
102
+ \`@latest\` can reuse a copy already in the \`npx\` cache or this project's
103
+ \`node_modules\`, so you would silently stay on whatever version you first
104
+ installed.
105
+
85
106
  ## If you are a skill
86
107
 
87
108
  Call this CLI. Do not re-implement any of it, and do not copy this text into a
@@ -91,8 +112,8 @@ skill file — run \`${RUN} guide\` and follow what it says now.
91
112
  export async function main() {
92
113
  return out.ok('guide', {
93
114
  version: PKG_VERSION,
94
- next_step: `${RUN} status`,
95
- help: [`${RUN} status`, `${RUN} plan`, `${RUN} apply --yes`],
115
+ next_step: `${RUN} install`,
116
+ help: [`${RUN} install`, `${RUN} status`, `${RUN} plan`, `${RUN} apply --yes`],
96
117
  guide: GUIDE,
97
118
  });
98
119
  }
package/lib/hosts.mjs CHANGED
@@ -14,12 +14,12 @@ import {
14
14
  import { abs, isDir, isWritable, walk } from './fsx.mjs';
15
15
  import { renderTomlTable, tomlTableExists, findFence } from './merge.mjs';
16
16
  import { readTextMaybe } from './fsx.mjs';
17
- import { COMPANIONS } from './companions.mjs';
17
+ import { EXTRA_COMPONENTS } from './extra-components.mjs';
18
18
 
19
19
  export const HOSTS = ['claude-code', 'codex', 'copilot', 'cursor'];
20
20
 
21
21
  /** Where each host reads its skills from — the base every skill-copy and
22
- * companion skill-copy action is rooted at. */
22
+ * extra-component skill-copy action is rooted at. */
23
23
  export const SKILL_DIR = {
24
24
  'claude-code': '.claude/skills',
25
25
  codex: '.agents/skills',
@@ -103,16 +103,16 @@ function skillActions(host, targetBase) {
103
103
  }
104
104
 
105
105
  /**
106
- * One `skill-copy` action per optional companion package. The `skill:`
106
+ * One `skill-copy` action per optional extra component. The `skill:`
107
107
  * segment (not `file:`) keeps these ids from colliding, or deduping,
108
108
  * against a shipped `file-copy` action at the same path.
109
109
  */
110
- function companionActions(host, targetBase) {
111
- return COMPANIONS.map((c) => {
110
+ function extraComponentActions(host, targetBase) {
111
+ return EXTRA_COMPONENTS.map((c) => {
112
112
  const target = `${targetBase}/${c.id}/SKILL.md`;
113
113
  return {
114
114
  id: `${host}:skill:${target}`, host, kind: 'skill-copy',
115
- companion: c.id, package: `${c.pkg}@${c.version}`, target,
115
+ component: c.id, package: `${c.pkg}@${c.version}`, target,
116
116
  };
117
117
  });
118
118
  }
@@ -158,7 +158,7 @@ function planClaude(ctx) {
158
158
  const host = 'claude-code';
159
159
  const out = [
160
160
  ...skillActions(host, SKILL_DIR[host]),
161
- ...(ctx.companions === false ? [] : companionActions(host, SKILL_DIR[host])),
161
+ ...(ctx.extraComponents === false ? [] : extraComponentActions(host, SKILL_DIR[host])),
162
162
  ...agentActions(host, '.claude/agents', 'claude', '.md'),
163
163
  ...mcpJsonActions(host, '.mcp.json', 'mcpServers', ctx),
164
164
  ];
@@ -184,7 +184,7 @@ function planCodex(ctx) {
184
184
  const out = [
185
185
  // Codex discovers skills from `.agents/skills`, never `.claude/skills`.
186
186
  ...skillActions(host, SKILL_DIR[host]),
187
- ...(ctx.companions === false ? [] : companionActions(host, SKILL_DIR[host])),
187
+ ...(ctx.extraComponents === false ? [] : extraComponentActions(host, SKILL_DIR[host])),
188
188
  ...agentActions(host, '.codex/agents', 'codex', '.toml'),
189
189
  ];
190
190
 
@@ -229,7 +229,7 @@ function planCopilot(ctx) {
229
229
  const host = 'copilot';
230
230
  const out = [
231
231
  ...skillActions(host, SKILL_DIR[host]),
232
- ...(ctx.companions === false ? [] : companionActions(host, SKILL_DIR[host])),
232
+ ...(ctx.extraComponents === false ? [] : extraComponentActions(host, SKILL_DIR[host])),
233
233
  ...agentActions(host, '.github/agents', 'copilot', '.agent.md'),
234
234
  // Copilot CLI reads `.mcp.json`; VS Code reads `.vscode/mcp.json` under the
235
235
  // incompatible `servers` key. Both, or the two surfaces disagree.
@@ -256,7 +256,7 @@ function planCursor(ctx) {
256
256
  || (isDir(abs(ctx.root, '.claude/skills')) && isDir(abs(ctx.root, '.claude/agents')));
257
257
  if (!claudeTrees) {
258
258
  out.push(...skillActions(host, SKILL_DIR[host]));
259
- if (ctx.companions !== false) out.push(...companionActions(host, SKILL_DIR[host]));
259
+ if (ctx.extraComponents !== false) out.push(...extraComponentActions(host, SKILL_DIR[host]));
260
260
  out.push(...agentActions(host, '.cursor/agents', 'claude', '.md'));
261
261
  }
262
262
  out.push(...mcpJsonActions(host, '.cursor/mcp.json', 'mcpServers', ctx));
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.3",
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.3",
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,22 +40,22 @@ 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
58
+ - [ ] vendor/ — vendor/bin/phpunit missing (tree built --no-dev)
59
59
  - [ ] Node — 18.x (need >= 20)
60
60
  - [-] Visual editors (optional) — Specs Editor not installed, Tender tool not installed
61
61
  - [x] shopware-cli — 0.16.10
@@ -86,11 +86,11 @@ For a missing/drifted configuration row, do not research or plan the fix
86
86
  yourself — the CLI's `plan` command already has it:
87
87
 
88
88
  ```
89
- npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@0.1.0 plan
89
+ npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest plan
90
90
  ```
91
91
 
92
92
  List the concrete steps in plain words: environment-row fixes in order
93
- (Containers → vendor/ → Visual editors → KB MCP → Acceptance-test project →
93
+ (vendor/ → Visual editors → KB MCP → Acceptance-test project →
94
94
  Playwright browsers → ATS env → Plugin tests → Project wiki), then the CLI's
95
95
  planned configuration changes last. Skip any row already ticked.
96
96
 
@@ -100,7 +100,7 @@ if you have one (Claude Code: `AskUserQuestion`; Codex: `request_user_input`,
100
100
  which is non-blocking outside Plan mode — so end the turn after asking).
101
101
  Options:
102
102
  - **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`
103
+ `npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest apply --yes`
104
104
  for the configuration changes, then re-run step 1 and print the final table.
105
105
  - **No, stop** — stop; the table from step 1 is already on screen.
106
106
 
@@ -112,8 +112,9 @@ Options:
112
112
  itself) are reported with install advice only, never installed.
113
113
  - Credentials (ATS env values) are prompted for as part of the single
114
114
  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.
115
+ - A fix that runs inside a container says so in the step list; if the
116
+ container is not running at execution time it stops and reports that —
117
+ sw-setup never starts the developer's stack itself.
117
118
  - The Project wiki fix invokes `sw-document-feature --setup` with the Skill
118
119
  tool; the KB MCP row only reports whether the platform layer is built —
119
120
  the corpus ships already built inside the
@@ -137,7 +138,7 @@ line:
137
138
 
138
139
  ## Reference files
139
140
 
140
- `reference/rows.md` in this skill's directory — the twelve environment rows:
141
+ `reference/rows.md` in this skill's directory — the eleven environment rows:
141
142
  check command(s), what "ticked" means, the fix steps verbatim from the
142
143
  guideline, and which skills the row blocks. Host configuration state (what
143
144
  gets installed into `.mcp.json`, permissions, `.gitignore`) is not in this