@execuro-sw-ecosystem/sw-ecosystem-agentic-harness 0.1.11 → 0.1.13

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 +35 -0
  2. package/README.md +18 -8
  3. package/agents/sw-product-manager.md +9 -3
  4. package/agents/sw-shopware-architect.md +5 -1
  5. package/agents/sw-tender-editor.md +34 -19
  6. package/bin/cli.mjs +10 -4
  7. package/codex/agents/sw-product-manager.toml +9 -3
  8. package/codex/agents/sw-shopware-architect.toml +6 -2
  9. package/codex/agents/sw-tender-editor.toml +34 -19
  10. package/content/AGENTS.md +3 -3
  11. package/copilot/agents/sw-product-manager.agent.md +9 -3
  12. package/copilot/agents/sw-shopware-architect.agent.md +6 -2
  13. package/copilot/agents/sw-tender-editor.agent.md +35 -20
  14. package/lib/commands.mjs +80 -18
  15. package/lib/guide.mjs +14 -6
  16. package/lib/settings.mjs +77 -0
  17. package/package.json +1 -1
  18. package/plugin.json +1 -1
  19. package/skills/sw-discover-tender/SKILL.md +39 -43
  20. package/skills/sw-discover-tender/reference/agent-briefs.md +65 -110
  21. package/skills/sw-discover-tender/reference/analysis-template.md +41 -208
  22. package/skills/sw-discover-tender/reference/assumption-catalogue.md +69 -104
  23. package/skills/sw-discover-tender/reference/client-question-rules.md +16 -35
  24. package/skills/sw-discover-tender/reference/context-parameters.md +14 -107
  25. package/skills/sw-discover-tender/reference/coverage-mapping.md +33 -56
  26. package/skills/sw-discover-tender/reference/editor-session.md +32 -73
  27. package/skills/sw-discover-tender/reference/estimation-model.md +43 -79
  28. package/skills/sw-discover-tender/reference/procedure.md +36 -72
  29. package/skills/sw-discover-tender/reference/project-information.md +31 -0
  30. package/skills/sw-discover-tender/reference/response-rules.md +11 -10
  31. package/skills/sw-setup/SKILL.md +6 -7
  32. package/skills/sw-setup/reference/rows.md +27 -17
  33. package/skills/sw-discover-tender/reference/confidence-rubric.md +0 -80
  34. package/skills/sw-discover-tender/reference/editor-mode.md +0 -11
@@ -1,13 +1,14 @@
1
- # Response CSV rules
1
+ # Export rules
2
2
 
3
- The rules for the response CSV the client receives. Goes into every §RESP brief verbatim. Section numbers refer to the analysis file.
3
+ The runtime's `export` command applies these; this file is the reference an agent or the operator checks a result against. No agent writes an export file — export is a runtime command / API call, and there is no per-cluster CSV of any kind.
4
4
 
5
- - **RSP-1 Columns.** The header row is the client's: every context column verbatim in the client's order and wording, then the vendor columns exactly as the client named them. Context cells are copied from the source unchanged. The skill fills only the compliance, comment and effort columns; every other vendor column (one-off cost, recurring cost, further columns) is present and empty. When the source has no vendor columns, `Vendor: Compliance`, `Vendor: Comment`, `Vendor: Effort (PD)` are appended in the RFP's language.
6
- - **RSP-2 Rows.** Exactly the source rows in source order, one line per requirement. No row added, dropped, merged or reordered. Cells the client had prefilled are kept. Assumption and clarification sub-lines never become rows.
7
- - **RSP-3 Compliance.** The token from the client's allowed list per `coverage-mapping.md`, derived from the row's class after accepted assumptions. A blocked row carries its likely class. `Not offered` only on a partner decision logged as `C-n`.
8
- - **RSP-4 Comment.** Client-facing, RFP language, plain words, no internal identifiers. Order: the one-line mechanism; then every accepted assumption that names the row (its own `.a` lines and global lines) as one sentence each, introduced as "Assumption:"; then clarifications (`.c` lines, `RC-n` naming the row) introduced as "As clarified:"; then, for a row whose status names a still open non-blocking client question (`estimated, CQ-n`), "Subject to the open clarification" in plain words. Never present: proposed or rejected assumptions, PD deltas, evidence paths, agent names, low/mid/high figures, money.
9
- - **RSP-5 Effort.** The row's PD final from section 4 after accepted assumptions, with overhead and buffer as applied in section 2, so the column sums to the Summary totals. Number with a dot decimal, rounded as in the analysis. Blocked rows: empty cell and the comment "Effort stated after clarification of <topic in plain words>". Commitment rows: 0. Service rows: their PD.
10
- - **RSP-6 Money.** Cost cells stay empty. No currency, rate, price or budget reference anywhere in a file.
11
- - **RSP-7 Encoding and delimiter.** UTF-8. When the input was the operator's CSV export, delimiter, quoting and BOM mirror that file. Otherwise UTF-8 with BOM, semicolon for a German RFP, comma otherwise. RFC 4180 quoting: fields containing the delimiter, a quote or a line break are quoted, quotes are doubled; line breaks inside a comment are allowed. One header row, no blank lines, no totals row, no timestamps.
5
+ - **X-1** Available anytime. Unconfirmed scope items export with empty answer cells.
6
+ - **X-2** XLSX input: `<source basename>-response-v<n>.xlsx` (X-9), a copy of the client's own workbook. The original is never modified. `export` refuses while any exported table lacks its coverage-to-client-token map, listing the tables (by their `<sheet> r<headerRow>` key) — map them first (`coverage-mapping.md`, `procedure.md` step 7).
7
+ - **X-3** Fit-back by item pointer: export resolves each item via the committed fit-back map (`import-map.json`, `<srcdir>/<base>/import-map.json`) — `items[id].table` names the table, `items[id].row` the row — and writes the mapped compliance token, the Client Response and the effort into the client's own columns at that row. An item with no pointer is reported as `not written: <id> (no source row)`, never silently dropped. The coverage-to-client-token map is decided agentically at export, not at intake (`coverage-mapping.md`), and stored per table key for later exports of the same document. Accepted assumptions go into the mapped assumptions column when a table named one; otherwise they follow the Client Response as bullets in the same cell. No column is added.
8
+ - **X-4** Surgical write: only the written cells change; every other part of the workbook is copied byte-for-byte; Excel recalculates on open. No library that re-serialises the workbook.
9
+ - **X-5** CSV or PDF input: no fit-back map — `<source basename>-response-v<n>.xlsx` (X-9) built as the tool's own workbook mirroring the working sheet's own tabs in page order: `Overview` (regime, totals by priority and by tab, readiness counts), `Project information` (`Parameter · Value · Source`), `Functional`/`Non-functional`/`Project & services` (always present, columns `ID · Topic · Requirement · Requirement Coverage (the six values as-is) · Estimation · Client Response · Assumptions`, answer cells filled for confirmed items only), `Integrations`, `Glossary`; `Log` and References are never exported.
10
+ - **X-6** The page shows each scope item's exact exported text before it is confirmed, for every item, confirmed or not.
11
+ - **X-7** The tool writes no cost, price, rate, licence fee or budget of its own — see `estimation-model.md`'s money rule for the exact word list, the `cost:` exemption and scope. Project information keeps the client's or the operator's own figure verbatim; a `cost:` reference is never exported.
12
+ - **X-9** Numbered exports: every export writes `<base>-response-v<n>.xlsx`, `n` the next free number — an existing file, and an explicit `--out` that already exists, are never overwritten. Each export appends a section 8 Log line: `- <date> · export v<n> · <file> · confirmed <c>/<n> · changed since v<n-1>: <k>`. "Changed since last export" is the set of confirmed items whose exported text differs from the last export's snapshot, or that are newly confirmed since then; it is shown in the CLI export output, in the section 8 line, and as a page filter.
12
13
 
13
- Class notes for the comment, before the mechanism: `commitment` → "No development, commitment." · `service` → "Service effort, no development." · `config` → "Configuration only." · `plugin` → "Store extension, integration effort only; <extension>, <licence source>."
14
+ Unproven in the XLSX writer, per the task 3 POC: conditional formatting, print area, over-wide or x14 validation, tables, pre-filled answer cells, desktop Excel, Google Sheets.
@@ -50,10 +50,9 @@ npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest status --json
50
50
 
51
51
  `--json` is mandatory for every call this skill makes: without it the CLI
52
52
  prints a human summary, not the object below. It prints one JSON object
53
- (`ok`, `next_step`, `help`, and its own `agents[]`/`drift[]` configuration
54
- state). Alongside it, run every
55
- environment row's check from `reference/rows.md` in this skill's directory —
56
- read-only, seconds each: file/directory existence, one version command, one
53
+ (`ok`, `next_step`, `help`, `targets`, `agents[]`, `drift[]`). First settle
54
+ the target agents (`reference/rows.md`, Target agents); alongside, run every
55
+ environment row's check from `reference/rows.md` — read-only, seconds each: file/directory existence, one version command, one
57
56
  `kb_status` call, one `npm view` registry lookup (Package updates row) — the
58
57
  one part of step 1 that touches the network, so it is the slow part.
59
58
  Never write, never install, never ask a question in this step.
@@ -74,7 +73,8 @@ one line per configuration item the CLI's `agents[]`/`drift[]` reports:
74
73
  - [x] Plugin tests — AhCheckout: phpunit + jest ok
75
74
  - [ ] Project wiki — docs/project-wiki/ missing
76
75
  - [ ] Package updates — harness 0.1.0 → 0.1.3
77
- - [ ] Installer config — .mcp.json entry: drift (from CLI status)
76
+ - [x] Target agents — claude-code (anchored)
77
+ - [ ] Installer config — .mcp.json entry: drift
78
78
  ```
79
79
 
80
80
  Per-plugin rows print one line per directory under `custom/plugins/`, e.g.
@@ -87,8 +87,7 @@ Print one closing line: `Environment ready.` Stop. No question.
87
87
  ### 3. Missing rows
88
88
 
89
89
  For a missing environment row, research only what it needs: the guideline
90
- sections `reference/rows.md` cites for that row
91
- (`shopware-project-qa-guidelines.md` §3.3–§3.7, §6.1), `compose.yaml` for the
90
+ sections `reference/rows.md` cites for that row, `compose.yaml` for the
92
91
  service name, `custom/plugins/*` names for per-plugin rows.
93
92
 
94
93
  For a missing/drifted configuration row, do not research or plan the fix
@@ -11,16 +11,25 @@ Every installer-CLI call this skill makes passes `--json`. Without it the CLI
11
11
  prints a short human summary instead of the object these rows read — that
12
12
  summary is for the person typing the command, never for a skill parsing it.
13
13
 
14
- When that `status --json` call reports no install at all (no lock file, so no
15
- recorded agents), the installer CLI's `apply --yes`/`install` has no `--agent`
16
- to reuse and, run from this skill, no terminal to ask on — it would exit 2.
17
- Do not pass a guessed `--agent`. Report this to the user instead: the first
18
- install must be run by them directly in a terminal, e.g.
19
- `npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest install`,
20
- which then either takes their `--agent` or prompts them interactively. Re-run
21
- this skill's `status` check afterwards — every later `apply --yes --json`
22
- reuses the agents that first run recorded, and this skill can call it
23
- directly again. Expect `agents[]` in every output this skill reads.
14
+ ## Target agents
15
+
16
+ Every row below is judged against the **anchored target agents** only, never
17
+ against marker directories: a stray `.vscode/` makes Copilot a candidate, not a
18
+ target. Read `targets` and `candidates` from the step-1 `status --json`.
19
+
20
+ - `targets.source` is `settings`: use `targets.agents`. Ask nothing.
21
+ - `none` and exactly one candidate: anchor it with
22
+ `npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest agents --agent <id> --json`
23
+ and say so in one line. This is the one write allowed before the question.
24
+ - `none` and zero or several candidates: ask one multi-select question listing
25
+ the four agents (`claude-code`, `codex`, `copilot`, `cursor`), detected ones
26
+ marked, then anchor the answer the same way (one `--agent` per pick). Ask
27
+ with the structured question tool as in `SKILL.md` step 3.
28
+ - A later change of mind goes through the same `agents --agent …` call.
29
+
30
+ Re-run `status --json` after anchoring and read `agents[]` from that. An agent
31
+ whose `state` is `not-targeted` is never printed or acted on. Print
32
+ `- [x] Target agents — <ids> (anchored)` as the first configuration line.
24
33
 
25
34
  ## 1. vendor/
26
35
 
@@ -69,7 +78,7 @@ So this row never blocks readiness, and it never probes. It asks.
69
78
 
70
79
  - **Check:** read `agents[]` from the `status --json` output step 1 already
71
80
  ran. Each entry carries `id` and `skills_dir` — the directory that agent
72
- actually reads skills from. For each agent whose `state` is not `absent`,
81
+ actually reads skills from. For each target agent (`targeted` is true),
73
82
  list `<skills_dir>/sw-specs-editor/` and
74
83
  `<skills_dir>/sw-tender-discovery-tool/`: a `SKILL.md` there means that
75
84
  editor is installed for that agent. That directory read is the whole check —
@@ -78,12 +87,12 @@ So this row never blocks readiness, and it never probes. It asks.
78
87
  state, not something to go looking for. Also read
79
88
  `sw-setup-editors.json` from the installer's own state directory if it
80
89
  exists — this skill's note of what the user has already declined
81
- (`{"sw-specs-editor": "declined"}`). That directory is whatever `lock_file`
82
- in the step-1 `status --json` output names, minus the file name — normally
90
+ (`{"sw-specs-editor": "declined"}`). That directory is the one
91
+ `settings_file` in `targets` names, minus the file name — normally
83
92
  `var/sw-ai-sdk/`, which a Shopware project already ignores. Read the path;
84
93
  never hard-code it.
85
94
  - **Ticked:** `[x]` when the editor's `SKILL.md` is present in every
86
- non-`absent` agent's `skills_dir`; `[-]` when the note records a decline, or
95
+ target agent's `skills_dir`; `[-]` when the note records a decline, or
87
96
  when it is installed for some agents but not all (say which). `[ ]` only for
88
97
  an editor that is neither installed nor declined — and even then it does not
89
98
  hold the table open: report it as optional and move on.
@@ -97,7 +106,7 @@ So this row never blocks readiness, and it never probes. It asks.
97
106
  `--editor` and the `.xlsx` import on `sw-discover-tender`. Install?"
98
107
 
99
108
  On yes, for each accepted editor, run its own installer once per
100
- non-`absent` agent, passing that agent's `skills_dir` from `status --json`:
109
+ target agent, passing that agent's `skills_dir` from `status --json`:
101
110
 
102
111
  ```
103
112
  npx -y @execuro-sw-ecosystem/sw-specs-editor@latest install-skill --target <skills_dir>
@@ -130,7 +139,7 @@ So this row never blocks readiness, and it never probes. It asks.
130
139
  <skills_dir>` and re-run the removal" — and carry on with the other agents
131
140
  and the other editor.
132
141
  - **On no:** write the decline to `sw-setup-editors.json` in the directory
133
- `lock_file` names (create the file, and that directory, if absent; it is
142
+ `targets.settings_file` names (create the file, and that directory, if absent; it is
134
143
  never tracked) and do not
135
144
  offer that editor again on any later run. The user asking for it by name is
136
145
  the only thing that re-opens it — then delete its key and install. `--editor`
@@ -305,7 +314,8 @@ This row never blocks readiness. It folds into step 3's single question.
305
314
  npx -y @execuro-sw-ecosystem/sw-ecosystem-agentic-harness@latest install
306
315
  ```
307
316
 
308
- That command rewrites the installed `sw-setup` skill itself, so the newer
317
+ That command reuses the anchored target agents and rewrites the installed
318
+ `sw-setup` skill itself, so the newer
309
319
  skill takes effect on the next run — which step 3 already causes by re-running
310
320
  step 1. For the editors, see row 3: re-running their `install-skill` line is
311
321
  their update.
@@ -1,80 +0,0 @@
1
- # Confidence rubric
2
-
3
- Score each dimension 0–100 against its bands, multiply by weight, sum, round to a whole percent. `points = score × weight / 100`. Score the document as written; a verdict given in chat does not count.
4
-
5
- ## Coverage evidence — weight 20
6
-
7
- | Score | Band |
8
- | --- | --- |
9
- | 100 | Every Must `req` line's class rests on a PM verdict or a mechanism cited to `vendor/` or a KB page; ≤5% of rows `unverified` |
10
- | 70 | ≤15% `unverified`; Should/Could rows partly evidenced |
11
- | 40 | The PM wave was partly not consulted, or >15% `unverified` |
12
- | 0 | Classes set from memory |
13
-
14
- ## Estimate basis — weight 20
15
-
16
- | Score | Band |
17
- | --- | --- |
18
- | 100 | Every estimated row has low/mid/high, a level and drivers; foundation efforts attached to named rows |
19
- | 70 | ≤10% of estimated rows lack a three-point |
20
- | 40 | The architect was not consulted for at least one cluster |
21
- | 0 | PD figures without agent input |
22
-
23
- ## Scope lock — weight 20
24
-
25
- Counts `accepted` lines only. `[ ]`, an unreconciled `[x]`, `rejected` and `suspect` count as nothing.
26
-
27
- | Score | Band |
28
- | --- | --- |
29
- | 100 | ≥80% of Must PD sits on rows that are `detailed` or covered by an accepted line; every vague Must row has a `CQ-n` |
30
- | 70 | 60–80% of Must PD locked; every vague Must row has a `CQ-n` |
31
- | 40 | <60% locked, or a vague Must row without a `CQ-n` |
32
- | 0 | No accepted line and no client question |
33
-
34
- ## Platform decision — weight 15
35
-
36
- | Score | Band |
37
- | --- | --- |
38
- | 100 | Plan, hosting, PSP and CMP decided in §6, each with a reason naming the rows it serves and a source (profile, PM tier, architect alternative); the plan's PD delta stated |
39
- | 70 | One §6 platform item `_TBD_` or open in a `Q-n` |
40
- | 40 | Two or more `_TBD_` or open, or the plan undecided |
41
- | 0 | Profile missing, or the §6 platform table empty |
42
-
43
- ## Integration & migration — weight 15
44
-
45
- | Score | Band |
46
- | --- | --- |
47
- | 100 | Every interface and migration object the RFP names is in §6 with pattern and owner split; §8 and §1.2 are complete for every estimate-driving parameter and migration volume |
48
- | 70 | Main interfaces covered; secondary ones or the owner split missing; §8/§1.2 mostly complete |
49
- | 40 | Approach lines missing for named interfaces, or an estimate-driving §1.2 parameter or a §1.2 migration volume is missing without a `CQ-n` |
50
- | 0 | §6 interface and migration tables `_TBD_` |
51
-
52
- ## Consistency — weight 10
53
-
54
- | Score | Band |
55
- | --- | --- |
56
- | 100 | All probes run (plugins, prior analyses, PRDs, partner assets, RFP-internal); every conflict resolved or logged as `K-n` in §7 |
57
- | 70 | Probes run; a `K-n` unresolved |
58
- | 40 | Probes run only partially |
59
- | 0 | A known conflict unrecorded |
60
-
61
- ## Status
62
-
63
- | Confidence | Open `high` `Q-n` | Blocking `CQ-n` on a Must row | `suspect` lines | Unreconciled ticks | Status |
64
- | --- | --- | --- | --- | --- | --- |
65
- | > 90 | none | none | none | none | **Ready to submit** |
66
- | > 90 | any of the four present | | | | **Review** |
67
- | 80–90 | | | | | **Review** |
68
- | < 80 | | | | | **Draft** |
69
-
70
- The four conditions override the arithmetic. §2 *Weakest dimension* names every blocker by id.
71
-
72
- ## Honesty rules
73
-
74
- - Do not round up to cross 80 or 90.
75
- - Never raise a score because the deadline is close or the user wants the response finished.
76
- - A row with an open non-blocking question (`estimated, CQ-n`) caps *Scope lock* at 70 for the share of Must PD it carries, unless the assumption its estimate rests on is `accepted`.
77
- - `_TBD_` anywhere in §6 caps that dimension at 40.
78
- - `_TBD_` overhead or buffer in the profile caps *Estimate basis* at 70; §2 states that PD is given before both.
79
- - `reuse: rfp-NNNN <ID>` is evidence only if the source row carried a verdict, not a guess.
80
- - If the total moved down since the last run, the report says so and names the cause.
@@ -1,11 +0,0 @@
1
- # Pending harness edits for the tender skill
2
-
3
- The "Editor mode" section and the eight SKILL.md edits this file used to carry were **applied** (SKILL.md `## Editor mode`, the `--editor` / `--editor-session` input rows, step 0, the `[x] suspect` reconcile bullet, frontmatter, reference list), with the batch kinds redefined for staged writes. What follows is the only part still outstanding.
4
-
5
- ## `extension` class (ladder OOTB → Plugin → Extension → Custom)
6
-
7
- - `coverage-mapping.md` Internal classes: add `| extension | Development on a specific, named, existing base — a stock feature, a store plugin, a partner asset or a project plugin under custom/plugins — materially smaller than building the capability from scratch; the base is named in the row's Text |`. Token rule: `| extension | the development token; comment prefix "Extension of <base>." |`. Synonyms: `| extension | Extension of, Erweiterung von |`. Note under the table: "Not the Shopware plugin/app sense and not 'uses extension points'; test: if the base disappeared, would the estimate roughly double? yes → extension, no → custom."
8
- - `analysis-template.md` kinds line: class `stock | config | plugin | extension | custom | commitment | service | not-offered | blocked`; the tool shows `stock` and `config` as OOTB.
9
- - `agent-briefs.md` §ARCH: the class list gains `extension` with the definition and test above; an `assume` candidate may name `extension` as the class the row takes once accepted. §ROWS: plugin vs extension, and extension vs custom, are not conflicts (the architect decides).
10
- - `estimation-model.md`: one line — an `extension` row states its base in Text; the three-point covers the delta on that base only.
11
- - `response-rules.md` class note line: `extension` → "Extension of <base>."