@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.
- package/CHANGELOG.md +63 -0
- package/README.md +53 -14
- package/SECURITY.md +1 -1
- package/agents/sw-php-backend-developer.md +1 -1
- package/agents/sw-storefront-developer.md +5 -5
- package/agents/sw-tender-editor.md +1 -1
- package/bin/cli.mjs +8 -3
- package/codex/agents/sw-php-backend-developer.toml +2 -2
- package/codex/agents/sw-storefront-developer.toml +6 -6
- package/codex/agents/sw-tender-editor.toml +2 -2
- package/content/AGENTS.md +2 -2
- package/copilot/agents/sw-php-backend-developer.agent.md +2 -2
- package/copilot/agents/sw-storefront-developer.agent.md +6 -6
- package/copilot/agents/sw-tender-editor.agent.md +2 -2
- package/lib/actions.mjs +11 -10
- package/lib/commands.mjs +17 -14
- package/lib/{companions.mjs → extra-components.mjs} +16 -16
- package/lib/guide.mjs +39 -18
- package/lib/hosts.mjs +10 -10
- package/lib/merge.mjs +10 -0
- package/package.json +2 -2
- package/plugin.json +1 -1
- package/skills/sw-design-requirements/SKILL.md +1 -1
- package/skills/sw-design-solution/SKILL.md +1 -1
- package/skills/sw-discover-tender/SKILL.md +1 -1
- package/skills/sw-document-feature/SKILL.md +1 -1
- package/skills/sw-document-feature/reference/setup-wiki.md +7 -2
- package/skills/sw-implement-feature/SKILL.md +1 -1
- package/skills/sw-setup/SKILL.md +15 -14
- package/skills/sw-setup/reference/rows.md +31 -34
- package/skills/sw-verify-feature/SKILL.md +1 -1
- package/skills/sw-verify-feature-ac-tests/SKILL.md +1 -1
- package/skills/sw-verify-feature-architecture/SKILL.md +1 -1
- package/skills/sw-verify-feature-code-quality/SKILL.md +1 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
// The two optional
|
|
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
|
|
8
|
-
// the same adopt/conflict/drift/update ladder as everything else
|
|
9
|
-
// writes, and makes `uninstall` exact even after the user has
|
|
10
|
-
//
|
|
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
|
|
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(
|
|
33
|
-
const spec = `${
|
|
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(
|
|
55
|
-
const spec = `${
|
|
56
|
-
const base = { id:
|
|
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
|
|
107
|
-
export function probe(
|
|
108
|
-
const key = `${
|
|
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(
|
|
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
|
|
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 —
|
|
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}
|
|
21
|
-
|
|
22
|
-
|
|
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}
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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-
|
|
49
|
+
--no-extra-components skip the optional extra-component skills
|
|
42
50
|
|
|
43
|
-
## Optional
|
|
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
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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}
|
|
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 {
|
|
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
|
-
*
|
|
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
|
|
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
|
|
111
|
-
return
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
52
|
+
"test": "node -e \"const{spawnSync}=require('node:child_process');const{readdirSync}=require('node:fs');const list=(dir)=>readdirSync(dir).filter((f)=>f.endsWith('.test.mjs')).map((f)=>dir+'/'+f);const files=[...list('test'),...list('scripts')];const r=spawnSync(process.execPath,['--test',...files],{stdio:'inherit'});process.exit(r.status??1);\"",
|
|
53
53
|
"check:mcp": "node scripts/check-mcp.mjs"
|
|
54
54
|
},
|
|
55
55
|
"publishConfig": {
|
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "sw-ecosystem-agentic-harness",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.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
|
-
|
|
30
|
+
Asked once ever per wiki with a structured question tool if you have one (Claude Code: `AskUserQuestion`; Codex: `request_user_input`), in **two calls, never one**:
|
|
31
|
+
|
|
32
|
+
- **Call 1 — question 1 on its own.** Wait for the answer.
|
|
33
|
+
- **Call 2 — questions 2 and 3 together, and only when the answer to question 1 was Jekyll.** On Vanilla there is no second call at all: the flavor is the only answer needed.
|
|
34
|
+
|
|
35
|
+
Questions 2 and 3 exist solely to fill `_config.yml`, which the Vanilla flavor does not have. Never put them in the same call as question 1 — no structured question tool can make an option list conditional on another answer in the same call, so a single call asks every user to pick a GitHub Pages deployment style, `baseurl` and all, before anyone has established that the wiki is a Jekyll site.
|
|
31
36
|
|
|
32
37
|
- **Question 1 — "docs/project-wiki/ does not exist yet — set it up as a Jekyll/GitHub Pages site or a plain Markdown wiki?"**
|
|
33
38
|
- Option 1, label "Jekyll / GitHub Pages (Recommended)": adds `_config.yml`, so pages render as a themed site with left sidebar navigation and search (Just the Docs, via `remote_theme:`), plus a Liquid-generated ADR table on top of the hand-maintained ADR index; ready to publish via GitHub Pages or `jekyll serve`.
|
|
@@ -136,7 +141,7 @@ On Jekyll, always name the resolved `baseurl` in that row, and when it was left
|
|
|
136
141
|
## Dry-run examples
|
|
137
142
|
|
|
138
143
|
- **Empty project, no flag** (`composer.json` name `acme/webshop`, lock `6.7.13.0`, origin `git@github.com:acme/webshop-docs.git`): detect → no directory → ask §2 → Jekyll + own repository + default title → resolve `acme/webshop`, `6.7.13`, today, `baseurl: "/webshop-docs"` → announce → sub-agent writes 16 files → table: 16 created, `flavor | Jekyll / GitHub Pages · baseurl "/webshop-docs"`, no drift check (`guidelines/documentation-guidelines.md` was just created) → continue at step 1.
|
|
139
|
-
- **Empty project, user picks Vanilla**: questions 2–3 are
|
|
144
|
+
- **Empty project, user picks Vanilla**: the second call never happens — questions 2–3 are never shown (no `_config.yml` to configure) → 15 writes, overlay files from `reference/scaffold/vanilla/` → table: 15 created, `flavor | Vanilla / plain Markdown` → continue at step 1.
|
|
140
145
|
- **`--setup`, existing wiki with `domains/platform/logging.md` deleted**: repair → flavor derived from `_config.yml` → 1 write → drift check → table: 1 created, kept count, no `flavor` row → stop. Business domains, feature pages and the hand-edited `_config.yml` untouched.
|
|
141
146
|
- **`--setup`, complete wiki**: nothing missing → drift check only → table: N kept → stop.
|
|
142
147
|
- **No flag, complete wiki**: this file is never opened.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sw-implement-feature
|
|
3
3
|
description: Implement a feature from its technical spec (specs/NNNN-slug-spec.md, written by sw-design-solution) following TDD — tests first per acceptance criterion, then the implementation, fixing until every relevant test passes (including that AC's own acceptance/e2e test, run immediately, not deferred), running Shopware's own shopware-cli fixers/static-analysis per AC to conform to Shopware's coding standards as code is written rather than after the fact. Builds ACs group by group per the spec's Parallel groups/Depends on data, fanning out independent ACs to concurrent agent spawns instead of one at a time. Runs sw-verify-feature as its final step to produce a full verification report. Use when asked to implement, build, or code a feature/epic from an existing tech spec.
|
|
4
4
|
when_to_use: Trigger phrases — "implement spec 0007", "build this feature", "code the epic-1 spec", "implement the tech spec".
|
|
5
|
-
argument-hint: [specs/NNNN-slug-spec.md]
|
|
5
|
+
argument-hint: '[specs/NNNN-slug-spec.md]'
|
|
6
6
|
allowed-tools: Read Write Edit Glob Grep Bash Agent mcp__ShopwareDevKnowledgeBase__list_docs mcp__ShopwareDevKnowledgeBase__grep_docs mcp__ShopwareDevKnowledgeBase__read_doc mcp__ShopwareDevKnowledgeBase__kb_status
|
|
7
7
|
---
|
|
8
8
|
|
package/skills/sw-setup/SKILL.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sw-setup
|
|
3
|
-
description: Print one environment-readiness table for the project's development/test setup —
|
|
3
|
+
description: Print one environment-readiness table for the project's development/test setup — vendor/, Node, the editor CLIs, shopware-cli, the KB MCP, the acceptance-test project, Playwright browsers, its .env, per-plugin test scaffolding, the project wiki and `.gitignore`, plus the installer CLI's own configuration/drift status. Stops when every row is ticked. When rows are missing, asks one yes/no question and delegates the fix to the installer CLI. Use when asked to set up the project, check if the environment is ready, or bootstrap the tests. Never designs, implements or verifies a feature itself — that's sw-design-solution, sw-implement-feature and sw-verify-feature, which call this skill first. Never writes a host configuration file itself — that's the installer CLI.
|
|
4
4
|
when_to_use: Trigger phrases — "set up the project", "is the environment ready", "bootstrap the tests", "sw-setup".
|
|
5
|
-
allowed-tools: Read Glob Grep AskUserQuestion Skill Bash mcp__ShopwareDevKnowledgeBase__kb_status Bash(npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@
|
|
5
|
+
allowed-tools: Read Glob Grep AskUserQuestion Skill Bash mcp__ShopwareDevKnowledgeBase__kb_status Bash(npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest *)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# sw-setup
|
|
@@ -20,7 +20,7 @@ copy of this skill can go stale while the CLI does not. For the current
|
|
|
20
20
|
source of truth, run:
|
|
21
21
|
|
|
22
22
|
```
|
|
23
|
-
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@
|
|
23
|
+
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest guide
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
This skill only renders the CLI's output as a table and relays its one
|
|
@@ -40,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@
|
|
43
|
+
npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest status
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
It prints one JSON object (`ok`, `next_step`, `help`, and its own
|
|
47
47
|
`hosts[]`/`drift[]` configuration state). Alongside it, run every
|
|
48
48
|
environment row's check from `reference/rows.md` in this skill's directory —
|
|
49
|
-
read-only, seconds each: file/directory existence, one
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
read-only, seconds each: file/directory existence, one version command, one
|
|
50
|
+
`kb_status` call. Never write, never install, never ask a question in this
|
|
51
|
+
step.
|
|
52
52
|
|
|
53
53
|
Print one checkbox list, one line per row — the environment rows first, then
|
|
54
54
|
one line per configuration item the CLI's `hosts[]`/`drift[]` reports:
|
|
55
55
|
|
|
56
56
|
```
|
|
57
|
-
- [x] Containers — web running
|
|
58
57
|
- [x] vendor/ — shopware/core 6.7.13.0
|
|
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@
|
|
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
|
-
(
|
|
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@
|
|
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
|
|
116
|
-
|
|
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
|
|
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
|