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

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 (124) hide show
  1. package/.mcp.json +8 -0
  2. package/CHANGELOG.md +78 -0
  3. package/CONTRIBUTING.md +54 -0
  4. package/LICENSE +21 -0
  5. package/README.md +304 -0
  6. package/SECURITY.md +50 -0
  7. package/agents/sw-admin-frontend-developer.md +52 -0
  8. package/agents/sw-php-backend-developer.md +63 -0
  9. package/agents/sw-product-manager.md +62 -0
  10. package/agents/sw-qa-engineer.md +160 -0
  11. package/agents/sw-shopware-architect.md +79 -0
  12. package/agents/sw-storefront-developer.md +93 -0
  13. package/agents/sw-tender-editor.md +43 -0
  14. package/bin/cli.mjs +73 -0
  15. package/codex/agents/sw-admin-frontend-developer.toml +54 -0
  16. package/codex/agents/sw-php-backend-developer.toml +65 -0
  17. package/codex/agents/sw-product-manager.toml +66 -0
  18. package/codex/agents/sw-qa-engineer.toml +161 -0
  19. package/codex/agents/sw-shopware-architect.toml +81 -0
  20. package/codex/agents/sw-storefront-developer.toml +96 -0
  21. package/codex/agents/sw-tender-editor.toml +50 -0
  22. package/content/AGENTS.md +63 -0
  23. package/content/claude-settings.json +31 -0
  24. package/content/mcp-servers.json +18 -0
  25. package/copilot/agents/sw-admin-frontend-developer.agent.md +53 -0
  26. package/copilot/agents/sw-php-backend-developer.agent.md +64 -0
  27. package/copilot/agents/sw-product-manager.agent.md +65 -0
  28. package/copilot/agents/sw-qa-engineer.agent.md +160 -0
  29. package/copilot/agents/sw-shopware-architect.agent.md +80 -0
  30. package/copilot/agents/sw-storefront-developer.agent.md +94 -0
  31. package/copilot/agents/sw-tender-editor.agent.md +46 -0
  32. package/lib/actions.mjs +449 -0
  33. package/lib/commands.mjs +446 -0
  34. package/lib/companions.mjs +117 -0
  35. package/lib/content.mjs +101 -0
  36. package/lib/fsx.mjs +188 -0
  37. package/lib/guide.mjs +98 -0
  38. package/lib/hosts.mjs +283 -0
  39. package/lib/lock.mjs +158 -0
  40. package/lib/merge.mjs +338 -0
  41. package/lib/out.mjs +74 -0
  42. package/mcp.json +10 -0
  43. package/package.json +58 -0
  44. package/plugin.json +19 -0
  45. package/skills/sw-design-requirements/SKILL.md +102 -0
  46. package/skills/sw-design-requirements/reference/clarification-loop.md +20 -0
  47. package/skills/sw-design-requirements/reference/confidence-rubric.md +82 -0
  48. package/skills/sw-design-requirements/reference/consistency-probes.md +65 -0
  49. package/skills/sw-design-requirements/reference/editor-gate.md +15 -0
  50. package/skills/sw-design-requirements/reference/editor-mode.md +15 -0
  51. package/skills/sw-design-requirements/reference/prd-confidence-checklist.md +95 -0
  52. package/skills/sw-design-requirements/reference/prd-template.md +153 -0
  53. package/skills/sw-design-requirements/reference/readiness-and-report.md +21 -0
  54. package/skills/sw-design-requirements/reference/splitting-guidelines.md +69 -0
  55. package/skills/sw-design-solution/SKILL.md +48 -0
  56. package/skills/sw-design-solution/reference/adr-flow.md +13 -0
  57. package/skills/sw-design-solution/reference/adr-template.md +40 -0
  58. package/skills/sw-design-solution/reference/clarification-loop.md +13 -0
  59. package/skills/sw-design-solution/reference/draft-and-spawn.md +21 -0
  60. package/skills/sw-design-solution/reference/editor-mode.md +16 -0
  61. package/skills/sw-design-solution/reference/pre-check-and-target.md +19 -0
  62. package/skills/sw-design-solution/reference/readiness-and-report.md +15 -0
  63. package/skills/sw-design-solution/reference/research-and-evidence.md +25 -0
  64. package/skills/sw-design-solution/reference/tech-spec-template.md +112 -0
  65. package/skills/sw-design-solution/reference/toolchain-conformance.md +9 -0
  66. package/skills/sw-discover-tender/SKILL.md +68 -0
  67. package/skills/sw-discover-tender/reference/agent-briefs.md +135 -0
  68. package/skills/sw-discover-tender/reference/analysis-template.md +224 -0
  69. package/skills/sw-discover-tender/reference/assumption-catalogue.md +104 -0
  70. package/skills/sw-discover-tender/reference/client-question-rules.md +47 -0
  71. package/skills/sw-discover-tender/reference/confidence-rubric.md +80 -0
  72. package/skills/sw-discover-tender/reference/context-parameters.md +116 -0
  73. package/skills/sw-discover-tender/reference/coverage-mapping.md +62 -0
  74. package/skills/sw-discover-tender/reference/editor-mode.md +11 -0
  75. package/skills/sw-discover-tender/reference/editor-session.md +115 -0
  76. package/skills/sw-discover-tender/reference/estimation-model.md +106 -0
  77. package/skills/sw-discover-tender/reference/procedure.md +98 -0
  78. package/skills/sw-discover-tender/reference/response-rules.md +13 -0
  79. package/skills/sw-document-feature/SKILL.md +64 -0
  80. package/skills/sw-document-feature/reference/adr-promotion.md +64 -0
  81. package/skills/sw-document-feature/reference/built-check.md +71 -0
  82. package/skills/sw-document-feature/reference/domain-guidelines.md +59 -0
  83. package/skills/sw-document-feature/reference/page-rules.md +129 -0
  84. package/skills/sw-document-feature/reference/procedure.md +58 -0
  85. package/skills/sw-document-feature/reference/scaffold/README.md +78 -0
  86. package/skills/sw-document-feature/reference/scaffold/_config.yml +51 -0
  87. package/skills/sw-document-feature/reference/scaffold/adr/index.md +44 -0
  88. package/skills/sw-document-feature/reference/scaffold/baseline/glossary.md +55 -0
  89. package/skills/sw-document-feature/reference/scaffold/baseline/tech-stack.md +48 -0
  90. package/skills/sw-document-feature/reference/scaffold/domains/index.md +55 -0
  91. package/skills/sw-document-feature/reference/scaffold/domains/platform/configuration.md +54 -0
  92. package/skills/sw-document-feature/reference/scaffold/domains/platform/customization-guidelines.md +47 -0
  93. package/skills/sw-document-feature/reference/scaffold/domains/platform/debugging.md +55 -0
  94. package/skills/sw-document-feature/reference/scaffold/domains/platform/environments-and-deployment.md +49 -0
  95. package/skills/sw-document-feature/reference/scaffold/domains/platform/extensions-inventory.md +40 -0
  96. package/skills/sw-document-feature/reference/scaffold/domains/platform/index.md +39 -0
  97. package/skills/sw-document-feature/reference/scaffold/domains/platform/logging.md +46 -0
  98. package/skills/sw-document-feature/reference/scaffold/guidelines/documentation-guidelines.md +102 -0
  99. package/skills/sw-document-feature/reference/scaffold/guidelines/index.md +50 -0
  100. package/skills/sw-document-feature/reference/scaffold/index.md +68 -0
  101. package/skills/sw-document-feature/reference/scaffold/vanilla/README.md +24 -0
  102. package/skills/sw-document-feature/reference/scaffold/vanilla/adr/index.md +36 -0
  103. package/skills/sw-document-feature/reference/scaffold/vanilla/index.md +68 -0
  104. package/skills/sw-document-feature/reference/setup-wiki.md +142 -0
  105. package/skills/sw-document-feature/reference/source-mapping.md +71 -0
  106. package/skills/sw-document-feature/reference/templates/adr.md +26 -0
  107. package/skills/sw-document-feature/reference/templates/domain-index.md +36 -0
  108. package/skills/sw-document-feature/reference/templates/feature-page.md +64 -0
  109. package/skills/sw-document-feature/reference/templates/guideline.md +42 -0
  110. package/skills/sw-implement-feature/SKILL.md +52 -0
  111. package/skills/sw-implement-feature/reference/ac-loop.md +24 -0
  112. package/skills/sw-implement-feature/reference/build-order.md +17 -0
  113. package/skills/sw-implement-feature/reference/delegation.md +18 -0
  114. package/skills/sw-setup/SKILL.md +144 -0
  115. package/skills/sw-setup/reference/rows.md +223 -0
  116. package/skills/sw-verify-feature/SKILL.md +64 -0
  117. package/skills/sw-verify-feature/reference/reconcile-and-report.md +42 -0
  118. package/skills/sw-verify-feature/reference/verification-report-template.md +57 -0
  119. package/skills/sw-verify-feature-ac-tests/SKILL.md +76 -0
  120. package/skills/sw-verify-feature-ac-tests/reference/audit-execute-score.md +40 -0
  121. package/skills/sw-verify-feature-architecture/SKILL.md +66 -0
  122. package/skills/sw-verify-feature-architecture/reference/guidelines-and-twig.md +27 -0
  123. package/skills/sw-verify-feature-code-quality/SKILL.md +73 -0
  124. package/skills/sw-verify-feature-code-quality/reference/gates.md +22 -0
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: sw-document-feature
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
+ 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]
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
+ ---
8
+
9
+ # sw-document-feature
10
+
11
+ Turn one feature — from its PRD/spec or from the chat — into wiki pages under `docs/project-wiki/`. The wiki's own rules win over anything here: read `docs/project-wiki/guidelines/documentation-guidelines.md` before writing and fill pages from the templates in `reference/templates/` in this skill's directory (the single source of page shapes).
12
+
13
+ ## Hard rules
14
+
15
+ - **Gate before ink.** Nothing under `docs/project-wiki/` is created or edited before step 3 has produced its evidence table and a verdict, per the mandatory gate defined in `reference/built-check.md`.
16
+ - **Never restate code.** Class listings, method signatures, DI wiring, Twig markup are pointed to by path, not reproduced. At most a one-line snippet if unavoidable.
17
+ - **One surface per page.** `administration/<feature>.md` and `storefront/<feature>.md` only; never `admin/`, `backend/`, `api/`, never a page without a surface. The "why" lives once, in the domain index feature row.
18
+ - **User answers are anchored, never quoted.** Rewrite them into the page's own voice and add one line to the page's *Decision Log* (see `reference/page-rules.md`).
19
+ - **ADRs are never invented.** `docs/project-wiki/adr/` is the single source of truth and holds only accepted + built ADRs — promoted once from the WIP files `specs/NNNN-slug-adr-<topic>.md` written by `sw-design-solution` (the spec's `[adr] <path>` lines point at them; procedure in `reference/adr-promotion.md`), or provided by the user in chat as accepted (title + context/decision/consequences; anything not accepted is sent to `specs/` as WIP). Never from "precedent", significance, or its own judgment; never written to `specs/`; an existing docs ADR is never overwritten. Everything else goes to Developer › Decisions or the index "Why" column; `[potential ADR]` items are only listed in the report under "ADR candidates (not created)" — no question mid-run unless the user asked about ADRs.
20
+ - **Never paste a page body into chat.** The final report is at most six lines.
21
+
22
+ ## Inputs
23
+
24
+ | Argument | Behaviour |
25
+ | --- | --- |
26
+ | `specs/NNNN-slug.md` (PRD) | Read it; locate the spec `specs/NNNN-*-spec.md` by number, then slug |
27
+ | `specs/NNNN-slug-spec.md` (spec) | Read it; locate the PRD `specs/NNNN-slug.md` (same number, slug without `-spec`) |
28
+ | Both paths | Read both |
29
+ | Nothing | **Chat mode** — the current discussion is the source; `prd: null`, `spec: null` |
30
+ | `--setup` (alone or with a path) | **Setup only** — run step 0, report its table, stop. Nothing is documented. The `sw-setup` Project wiki row invokes this flag as its fix |
31
+ | A path that does not exist | Say so, `ls specs/`, and ask with a structured question tool if you have one (Claude Code: `AskUserQuestion`; Codex: `request_user_input`) offering the nearest match (by number or slug) or chat mode. Never guess a file, never silently fall back to chat |
32
+
33
+ If a counterpart is missing, say so in one line and continue with what exists. In chat mode extract what/why/AC-like statements from the discussion per `reference/source-mapping.md`; ask the user for the feature name in one sentence only if it cannot be inferred.
34
+
35
+ ## Procedure
36
+
37
+ ### 0. Set up the wiki — only when it is missing or `--setup` was passed
38
+
39
+ Enter `reference/setup-wiki.md` in this skill's directory when the run carries `--setup`, **or** when `docs/project-wiki/` does not exist. It asks its own questions, delegates writing to one sub-agent, and returns the created/kept table. With `--setup` the run stops there; otherwise it continues at step 1.
40
+
41
+ Wiki present and no `--setup` → skip this step; no structure work happens on a documentation run.
42
+
43
+
44
+ ### 1-7. Run the documentation steps
45
+
46
+ Follow `reference/procedure.md` in this skill's directory: resolve inputs, find the
47
+ counterpart, the mandatory built-check gate, domain and surface mapping, writing the
48
+ pages, ADR promotion, project guidelines, the link check and the report.
49
+
50
+ ## Reference files
51
+
52
+ All under `reference/` in this skill's directory:
53
+
54
+ - `procedure.md` — steps 1-7 of a documentation run, in order
55
+ - `built-check.md` — the gate: where to search, evidence-table format, verdict rules, the override
56
+ - `page-rules.md` — condensed wiki rules, terminology, Business vs Developer content, Decision Log
57
+ - `source-mapping.md` — PRD / spec / verification report / chat → page sections
58
+ - `domain-guidelines.md` — canonical domains, feature→domain and surface assignment, `platform` boundaries, splitting
59
+ - `adr-promotion.md` — step 5b: discovery of `specs/*-adr-*.md`, accepted + built test, WIP→docs field mapping, TOC block format
60
+ - `templates/feature-page.md`, `templates/domain-index.md`, `templates/adr.md`, `templates/guideline.md` — the page shapes to fill (`adr.md` only for user-provided ADRs; `guideline.md` only for the guideline route, `page-rules.md` "Project guidelines")
61
+ - `setup-wiki.md` — step 0, entered only on `--setup` or a missing wiki: triggers, the setup questions, manifest, detect/init/repair, the sub-agent brief, drift check
62
+ - `scaffold/` — the generic wiki skeleton (16 files for Jekyll, 15 for Vanilla — see `scaffold/vanilla/`) that setup copies from
63
+
64
+ Wiki sources of truth for rules (do not copy them into this skill): `docs/project-wiki/guidelines/documentation-guidelines.md`, `docs/project-wiki/baseline/glossary.md`.
@@ -0,0 +1,64 @@
1
+ # ADR promotion
2
+
3
+ ADR files under `specs/*-adr-*.md` (written by `sw-design-solution`) are **WIP** — proposed, rejected, or accepted but not yet built. `docs/project-wiki/adr/` is the single source of truth and holds **only accepted ADRs whose required changes exist in the code**. This procedure promotes a WIP ADR into `docs/` exactly once; afterwards people may remove the `specs/` copy and everything references `docs/`. Runs on every run that passes the built-check gate (never after a Stop), over **all** WIP files, not only the current feature's. Never writes to `specs/`, never overwrites a docs ADR.
4
+
5
+ ## 1. Discover
6
+
7
+ - Glob `specs/*-adr-*.md`; skip files without an `id:` key (report them).
8
+ - Every `[adr] <path>` line in the spec being documented must resolve to one of those files **or** to a docs ADR with the same `id`. Neither → report `dangling [adr] links: <path>`.
9
+ - Glob `docs/project-wiki/adr/*.md` (not `index.md`) and index them by `id` — a WIP file whose `id` is already there is **already promoted**: skip, docs wins; if the specs file still exists report `promoted, specs copy can be removed: <path>`.
10
+
11
+ ## 2. Decide per WIP file
12
+
13
+ | Condition | Outcome | Report bucket |
14
+ |---|---|---|
15
+ | `status` ≠ `accepted` | not promoted | `WIP ADRs: <id> (<status>)` |
16
+ | `accepted`, required changes not found | not promoted | `accepted, awaiting implementation: <id>` |
17
+ | `accepted`, required changes found (or none needed) | **promote** (§3) | `promoted: <id>` |
18
+
19
+ Built-check for an ADR: its Decision / Consequences sections name the required changes (runtime component, package, service, config key, convention). Search for them as in `built-check.md` — `custom/`, `composer.json`/`composer.lock`/`vendor/`, config — and keep the one-line evidence for the report. An ADR that needs no code (`area: process`, convention-only, or the ADR says so) counts as built.
20
+
21
+ ## 3. Promote (create once)
22
+
23
+ Target: `docs/project-wiki/adr/<date>-<kebab-topic>.md` — `date` = WIP `date`, `kebab-topic` = the part of `id` after `ADR-NNNN-`. Link depth: from `adr/` a spec link is `../../../specs/…`; from `domains/<d>/<surface>/` an ADR link is `../../../adr/…` and a WIP link `../../../../../specs/…` (five levels to the repo root).
24
+
25
+ | WIP field / part | Docs ADR |
26
+ |---|---|
27
+ | `title`, `date`, `area`, `tags`, `authors`, `status` (= `accepted`) | Same keys (wiki ADR schema) |
28
+ | — | `nav_order` (next free slot under `adr/index.md`), `parent: Decision records` (added, not carried from the WIP file — WIP files under `specs/` have no nav front matter) |
29
+ | `id`, `prd`, `spec`, `owner` | Same keys, verbatim |
30
+ | its path, run date | `promoted_from: specs/NNNN-slug-adr-<topic>.md`, `promoted: YYYY-MM-DD` |
31
+ | `decision_needed_by`, HTML comment, `<…>` placeholders | Dropped (`_TBD_` is kept) |
32
+ | H1 | Verbatim, followed by one line `Promoted from specs/… on YYYY-MM-DD.` |
33
+ | `**Status:** … **Spec:** […]` meta line | Carried over; spec link rewritten to `../../../specs/…` |
34
+ | Context, Decision, Options considered, Consequences, Alignment (incl. decision-log table) | Carried over, same headings and order; condensed only where the documentation guidelines forbid (no code listings) |
35
+
36
+ Nothing else is added. Later status changes (`superseded`, `deprecated`) are made by people editing the docs ADR; the skill never touches an existing docs ADR.
37
+
38
+ ## 4. Table of contents (`docs/project-wiki/adr/index.md`)
39
+
40
+ Keep the Liquid loop, where the wiki uses the Jekyll flavor, and everything outside the markers untouched. Rewrite the block between `<!-- adr-toc:start -->` and `<!-- adr-toc:end -->` every run (if missing, insert them directly under the `## Table of contents` heading, creating it after the Liquid block when absent) from all pages under `adr/` except `index.md`:
41
+
42
+ 1. Summary line `N ADRs — accepted x · superseded y · deprecated z`; with zero ADRs the block contains only `0 ADRs`.
43
+ 2. One `#### <area>` per area in canonical order — the domain slugs from `domain-guidelines.md` (catalogues, checkout, orders, customers, content, marketing, sales-channels, automation, settings, integrations), then `platform`, then `process`, unknown areas last alphabetically — each `| Date | ID | Title | Status | Feature |`, newest first by frontmatter `date`. Feature = `[NNNN-slug-spec](../../../specs/NNNN-slug-spec.md)`, or `—` when that path no longer exists.
44
+
45
+ The line after the block, `WIP ADRs live in specs/*-adr-*.md until accepted and built.`, is hand-maintained and stays. Example:
46
+
47
+ ```
48
+ <!-- adr-toc:start -->
49
+ 1 ADRs — accepted 1 · superseded 0 · deprecated 0
50
+
51
+ #### checkout
52
+ | Date | ID | Title | Status | Feature |
53
+ |---|---|---|---|---|
54
+ | 2026-08-12 | ADR-0005-net-prices | [Net prices per sales channel](2026-08-12-net-prices.md) | accepted | [0005-b2b-pricing-spec](../../../specs/0005-b2b-pricing-spec.md) |
55
+ <!-- adr-toc:end -->
56
+ ```
57
+
58
+ ## 5. Feature pages and edge cases
59
+
60
+ - Developer › Decisions: promoted → `[ADR-id](../../../adr/<file>.md)`; still WIP → `[ADR-id](../../../../../specs/<file>) (WIP, <status>)`.
61
+ - Page Decision Log: `YYYY-MM-DD — ADR <id> promoted from <specs path>` (only on the run that promotes).
62
+ - Two WIP files with the same `id` → promote neither, report the collision. `id` without `ADR-NNNN-` prefix → whole `id` kebab-cased as topic, report it.
63
+ - A docs ADR without `promoted_from` (user-provided, hand-written) is listed in the TOC like any other.
64
+ - Link check (SKILL step 6) covers every promoted page and the TOC block.
@@ -0,0 +1,71 @@
1
+ # Built-check gate
2
+
3
+ Run before any file under `docs/project-wiki/` is touched. The question is only: *does this functionality exist in this project?* — not whether it works well.
4
+
5
+ ## 1. Collect search terms
6
+
7
+ From the PRD, spec, or chat (step 1 of SKILL.md), list every concrete name: extension/plugin/app name (`AcmeCheckout`), entity/table names (`acme_return_request`), PHP classes and services, Admin/Store API routes, Storefront routes, Twig templates/blocks, admin modules/components, snippet keys, system-config keys, feature flags, migration names, test names. Add the feature slug and its main nouns as fallback terms. Fewer than three concrete terms → say so in the table; a search on nouns alone is weak evidence.
8
+
9
+ ## 2. Search — all three sources, always
10
+
11
+ **A. Custom project code** (`Grep`/`Glob`, case-insensitive, per term):
12
+
13
+ ```
14
+ custom/plugins/ custom/apps/ custom/static-plugins/ src/
15
+ ```
16
+ Also `ls custom/plugins custom/apps custom/static-plugins` — an empty directory is a finding.
17
+
18
+ **B. Installed extension or bundle delivering it:**
19
+ - `composer.json` `require` — packages beyond `shopware/*` that could deliver the feature (store extensions, bundles).
20
+ - `grep -n '"name": "<package>"' composer.lock` and `ls vendor/<vendor>/<package>` to confirm it is actually installed.
21
+ - Live environment, best effort only: `docker compose exec web bin/console plugin:list` and `… app:list` (or `bin/console` directly if it runs locally). If the command is unavailable or the container is down, record `not reachable` — never block or retry in a loop.
22
+
23
+ **C. Verification report in chat** — an `sw-verify-feature` block with `AC-n | pass / not pass / partly | …` lines for this feature. Absent → `none`.
24
+
25
+ Search **B** even when **A** found code, and **A** even when **B** did: a spec may describe a feature that a store extension already delivers, or vice versa.
26
+
27
+ ## 3. Evidence table
28
+
29
+ Print this before any verdict, whatever the outcome:
30
+
31
+ ```
32
+ | Source | Searched | Found |
33
+ |---|---|---|
34
+ | custom/plugins, apps, static-plugins, src/ | AcmeCheckout, acme_delivery_date, delivery-date route, ACME_DELIVERY_DATE_SELECTION | custom/plugins/AcmeCheckout/src/Storefront/… (3 files), migration Migration17…, no tests |
35
+ | composer.json / composer.lock / vendor | delivery date, shipping | nothing beyond shopware/* |
36
+ | bin/console plugin:list / app:list | — | not reachable (container down) |
37
+ | sw-verify-feature report in chat | — | 2026-08-29: AC-1..AC-4 pass, AC-5 not pass |
38
+ ```
39
+
40
+ One row per source; "Searched" lists the terms actually used, "Found" lists paths/packages/lines or `nothing`.
41
+
42
+ ## 4. Verdict
43
+
44
+ | Verdict | Condition | Page status |
45
+ |---|---|---|
46
+ | `built` | Code found in A **or** installed package in B, **and** a report in C with every AC `pass` | `built` |
47
+ | `partially-built` | Code/package found, but C is missing, or has any `not pass`/`partly`, or only part of the named artefacts exist | `partially-built` + ⚠️ PARTIALLY BUILT block listing missing/failing ACs |
48
+ | `no evidence` | Nothing in A, nothing in B (beyond core), C absent or all `not pass` | STOP → ask (below) |
49
+
50
+ Hits matter only when they match a **concrete artefact** (extension, entity, class, route, template, key, migration, test). Hits on fallback nouns alone (the feature slug or its generic words), or fewer than three concrete terms with no artefact match, are `no evidence` — they never yield `partially-built` and never skip the gate.
51
+
52
+ `built` is never granted on code presence alone — the documentation guidelines require the verification report. Without one, code present = `partially-built` and the block says "verification not run". Status → page mapping and block markup: `page-rules.md`.
53
+
54
+ A chat report with pass lines but **no** code found in A or B is `no evidence` — a report cannot substitute for the artefacts it claims to test; mention the contradiction in the table.
55
+
56
+ ## 5. The override (only on `no evidence`)
57
+
58
+ Ask with a structured question tool if you have one (Claude Code: `AskUserQuestion`; Codex: `request_user_input`), exactly one question:
59
+
60
+ - Question: "Feature not found in project code — enforce documentation anyway?"
61
+ - Option 1: **Stop (Recommended)** — end the run; the evidence table is the report.
62
+ - Option 2: **Enforce — document as planned/not-built** — continue.
63
+
64
+ On enforce, every page written this run must have:
65
+ - `status: planned` if a PRD or spec exists in `specs/`, `status: not-built` if neither does (chat mode with nothing on disk).
66
+ - The `> ⚠️ NOT BUILT` block in *Status*, directly after the page's intro prose — exact markup in `page-rules.md` "Flag block": what exists (PRD/spec paths, flags), what is missing (what was searched and not found), reference (spec ACs, "verification not run"), "Checked against the repo on YYYY-MM-DD".
67
+ - *Developer* section labelled "(planned)" describing the *intended* location from the spec.
68
+ - Decision Log line: `YYYY-MM-DD — User enforced documentation although the built-check found no code`.
69
+ - `planned`/`not-built` added to `tags`.
70
+
71
+ Never continue on `no evidence` without the explicit enforce answer — not when unattended, not when the user "obviously wants docs", not when the spec is marked *Ready for implementation*.
@@ -0,0 +1,59 @@
1
+ # Domain guidelines
2
+
3
+ How the wiki is cut into domains, how a feature is assigned to one, and how surfaces are assigned. The canonical slug list also lives in the scaffolded `docs/project-wiki/domains/index.md`; this file explains it.
4
+
5
+ ## Canonical domains (Shopware-aligned)
6
+
7
+ | Slug | Domain | Administration modules it maps to | Storefront pages / Store API it maps to |
8
+ |---|---|---|---|
9
+ | `catalogues` | Catalogues | Catalogues → Products, Categories, Properties, Manufacturers, Dynamic product groups, Product reviews (moderation) | Product detail, listing/search/navigation, product availability, variants |
10
+ | `checkout` | Checkout | Settings → Shipping, Payment (method setup), Rule Builder conditions used at checkout | Cart, checkout confirm/finish, shipping/payment selection, `store-api/checkout/*` |
11
+ | `orders` | Orders | Orders → Overview, order detail, documents, state machine | Account → Orders, order detail, returns, `store-api/order*` |
12
+ | `customers` | Customers | Customers → Overview, Customer groups, addresses, B2B/employee roles | Registration, login, account pages, addresses, `store-api/account/*` |
13
+ | `content` | Content | Content → Shopping Experiences, Media, Landing pages, SEO, Snippets | CMS-rendered pages, landing pages, SEO URLs, snippets/translations |
14
+ | `marketing` | Marketing | Marketing → Promotions, Newsletter, Product reviews, Cross-selling | Promotion codes, newsletter forms, reviews, cross-selling sliders |
15
+ | `sales-channels` | Sales Channels | Sales Channels → domains, languages, currencies, countries; Settings → Tax | Channel-specific behaviour (currency/language/country switches, tax display) |
16
+ | `automation` | Automation | Settings → Flow Builder, Rule Builder (rule management), Scheduled tasks, Mail templates | — (effects show up in other domains; page only if the shopper sees a dedicated surface) |
17
+ | `settings` | Settings | Settings → System, Shop settings not owned by another domain | — |
18
+ | `integrations` | Integrations | Settings → Integrations, Import/Export, Webhooks, external system connectors | External-system driven behaviour visible to the shopper (e.g. live stock, external payment redirect) |
19
+ | `platform` | Platform | — | — (see below) |
20
+
21
+ Domains exist on disk only once a feature needs them (setup, in `setup-wiki.md`, scaffolds only `platform`). Create a domain from `reference/templates/domain-index.md` in this skill's directory, then add its row to `domains/index.md` and to the domain map in `docs/project-wiki/index.md` (`| [Domain](domains/<domain>/index.md) | Purpose |`).
22
+
23
+ ## Assigning a feature to a domain
24
+
25
+ First rule that matches wins:
26
+
27
+ 1. The source names an extension listed in `domains/platform/extensions-inventory.md` with one owning domain → that domain. (An extension shared by two domains falls through.)
28
+ 2. The PRD §4 Domain Impact / spec entities name a Shopware concept or custom entity owned by one domain (table above; glossary "owned by" notes) → that domain.
29
+ 3. The actor's main workflow in PRD §3 maps to one Administration module or Storefront page in the table → that domain.
30
+ 4. Still two candidates → ask with a structured question tool if you have one (Claude Code: `AskUserQuestion`; Codex: `request_user_input`) with both, then a Decision Log line on the page.
31
+
32
+ Rule of thumb for the tie-breakers: the domain that owns the **data written** wins over the one that only reads it (a return request writes order state → Orders, even though the shopper starts it from the account area).
33
+
34
+ ## The `platform` domain
35
+
36
+ Contains only cross-cutting infrastructure: extensions inventory, customization guidelines, configuration layers, logging, debugging, environments and deployment. It has no surfaces and no feature pages.
37
+
38
+ Must **not** go there: anything a merchant or shopper can see or configure per feature (that is a feature page in a business domain), feature-specific config keys (they go in `configuration.md` *as a row*, but the explanation lives on the feature page), feature decisions (Developer › Decisions on the feature page; `adr/` only when marked `[adr]` or user-provided), and Shopware core behaviour (link the docs).
39
+
40
+ ## Project-specific domains
41
+
42
+ Add one only when a bounded context does not fit the canonical list — a distinct business capability with its own data, its own actors, and its own vocabulary (e.g. a rental workflow, a B2B quotation process, a marketplace vendor portal). Rules:
43
+
44
+ - Name it with the Shopware term if one exists (`Quotations` if Shopware Commercial names it so); otherwise the business term from the glossary, singular or plural as the business says it.
45
+ - Slug: kebab-case, no version numbers, no vendor or plugin names, no abbreviations (`quotations`, not `b2b-quote-mgmt`).
46
+ - Ownership: exactly one owning extension recorded in the extensions inventory; the domain index states what belongs to neighbouring domains.
47
+ - A departure from the canonical list needs an ADR (`area: process`) provided by the user or marked `[adr]` in the spec. The skill never writes it on its own: it creates the domain, and reports the missing ADR under "ADR candidates (not created)".
48
+
49
+ ## Assigning surfaces
50
+
51
+ - Merchant acts in the Administration (module, settings, ACL) → `administration/`.
52
+ - Shopper (guest, registered, B2B buyer) acts in the Storefront or via the Store API → `storefront/`.
53
+ - External system or background job → the surface whose flow it serves: Store API calls and storefront-visible effects → `storefront/`; Admin API, imports, scheduled tasks, mail → `administration/`. State this in the page's Developer section.
54
+ - Both actors → two pages, same slug. Ownership of shared parts: entities, migrations, admin modules, Admin API → `administration/`; Storefront controllers, Twig blocks, JS plugins, Store API → `storefront/`; the other half links.
55
+ - Never a page without a surface, never a third surface (`api/`, `backend/`, `headless/`). A headless-only project still uses `storefront/` for Store API-facing behaviour.
56
+
57
+ ## When a domain gets split
58
+
59
+ Split when its index table needs a second vocabulary to stay readable, when two extensions own disjoint halves of it, or when features in it never link to each other. Move the pages, keep the slugs, add a redirect row (`deprecated` status with a link) in the old index for one release. The split needs an ADR (`area: process`) provided by the user or marked `[adr]` in the spec; the skill does not write one itself — it proceeds and reports the missing ADR as a candidate. Never split on page count alone.
@@ -0,0 +1,129 @@
1
+ # Page rules
2
+
3
+ **Authority.** `docs/project-wiki/guidelines/documentation-guidelines.md` (wiki) is authoritative for reader-facing rules: frontmatter schema, status meanings, folder/surface rules, terminology. This file is authoritative for how the skill derives status and writes pages. Reader-facing rules are referenced here, not copied — when a summary below drifts from the documentation guidelines, the documentation guidelines win and this line gets fixed.
4
+
5
+ ## Templates (in this skill's `reference/templates/` directory, fill them)
6
+
7
+ | Page | Template | Where |
8
+ |---|---|---|
9
+ | Feature page | `reference/templates/feature-page.md` | `domains/<domain>/<surface>/<feature>.md` |
10
+ | Domain index | `reference/templates/domain-index.md` | `domains/<domain>/index.md` (+ row in `domains/index.md`) |
11
+ | ADR (user-provided, accepted) | `reference/templates/adr.md` | `adr/YYYY-MM-DD-<kebab-title>.md` (listed by the regenerated TOC block of `adr/index.md`) |
12
+ | ADR (promoted from `specs/*-adr-*.md`) | none — per `reference/adr-promotion.md` | `adr/<date>-<kebab-topic>.md` |
13
+
14
+ Templates own the page *shape* (section order, placeholders); the documentation guidelines own the rules. Delete every `<…>` placeholder; unknown facts become `_TBD_`, never invented.
15
+
16
+ ## Frontmatter (feature page — every key, no omissions)
17
+
18
+ Schema per the documentation guidelines' "Frontmatter" section. Skill-side derivation:
19
+
20
+ - `nav_order` — position within the parent domain's Features table (order the feature was added, or the position the user asks for).
21
+ - `parent` — the domain's `title` from `domains/<domain>/index.md` (exact string, case-sensitive).
22
+ - `grand_parent` — always `Domains`.
23
+ - `feature` — PRD slug without `NNNN-` (chat mode: kebab-case, 2–5 words); identical on both surface halves.
24
+ - `status` — only from the gate verdict (below).
25
+ - `extension` — plugin/app/theme name in `custom/`, or the Composer package name (`vendor/name`) when a vendor-installed extension delivers it, or `null`.
26
+ - `spec`, `prd` — the paths read, or `null` (chat mode: both `null`).
27
+ - `verified_against` — `Shopware X.Y.Z` from `composer.json` → `shopware/core`, 4th segment stripped (`"6.7.13.0"` → `Shopware 6.7.13`).
28
+ - `last_synced` — run date, set only on pages touched this run.
29
+ - `tags` — `[<domain>, <surface>]` plus `planned` / `not-built` when applicable.
30
+ - `related` — relative paths only; counterpart surface page (if it exists), `../index.md`, platform pages linked from the body.
31
+
32
+ ## Status derivation (single source: `built-check.md` verdict)
33
+
34
+ | Evidence | `status` | Block |
35
+ |---|---|---|
36
+ | Code or package present **and** report with every AC `pass` | `built` | none — Status reads "`built` — verified YYYY-MM-DD (AC-1..AC-n pass)" |
37
+ | Code or package present, no report | `partially-built` | ⚠️ PARTIALLY BUILT, "verification not run" |
38
+ | Code or package present, any AC `not pass` / `partly` | `partially-built` | ⚠️ PARTIALLY BUILT, listing those ACs |
39
+ | No code, PRD and/or spec exist (after enforce) | `planned` | ⚠️ NOT BUILT |
40
+ | Nothing found (after enforce) | `not-built` | ⚠️ NOT BUILT |
41
+
42
+ "Code or package present" = a concrete artefact under `custom/` **or** an installed Composer package (`composer.lock`, `vendor/`). The block is mandatory for every status except `built`.
43
+
44
+ ## Flag block (exact markup — existing pages use it)
45
+
46
+ In `## Status`, directly after the intro prose under the H1:
47
+
48
+ ```
49
+ > ⚠️ NOT BUILT
50
+ >
51
+ > **What exists in the repo:** <PRD/spec paths, flags, partial code with paths>
52
+ > **What is missing:** <what sw-document-feature searched for and could not find under custom/ or vendor/>
53
+ > **Reference:** <spec AC-1..AC-n, verification report date or "verification not run">. Checked against the repo on YYYY-MM-DD.
54
+ >
55
+ > Do not describe this feature as available. Everything below is the *intended* design from the spec.
56
+ ```
57
+
58
+ `partially-built` uses the same shape with the first line `> ⚠️ PARTIALLY BUILT`, "What is missing" listing the failing/unverified ACs (with the report's note) or the missing artefacts, and the last line "Only the parts listed as existing are available." The *Developer* heading becomes `## Developer (planned)` for `planned`/`not-built` and describes the *intended* location from the spec; for `partially-built` it describes what exists and marks intended parts "(planned)".
59
+
60
+ ## Decision Log (trailing section, per the documentation guidelines)
61
+
62
+ `## Decision Log` is the **last** section, after *Related*. One line per user decision, override, or status change the page cannot explain by itself, format `YYYY-MM-DD — <what and who>`. Append only — never rewrite earlier lines; omit the section when it would be empty. Lines this skill writes:
63
+
64
+ - `YYYY-MM-DD — User enforced documentation although the built-check found no code`
65
+ - `YYYY-MM-DD — Status changed <old>→<new> by built-check (<one-line evidence>)`
66
+ - `YYYY-MM-DD — Domain set to <domain> by user (ambiguous between <a> and <b>)`
67
+ - `YYYY-MM-DD — <topic>: <decision> (user)` for any other answer from a structured question tool (Claude Code: `AskUserQuestion`; Codex: `request_user_input`)
68
+ - `YYYY-MM-DD — ADR <title> recorded as provided by user` / `YYYY-MM-DD — ADR <id> promoted from <specs path>`
69
+
70
+ An answer is first rewritten into the section it affects (intro prose, Business user, Developer); the log line is the only trace of the question. Never paste the question or the raw reply.
71
+
72
+ ## Shape and length
73
+
74
+ - Sections in template order: title → intro prose (no "Summary" heading) → Status → Business user → Developer → Related → (Decision Log) → footer line.
75
+ - Intro is 1–2 sentences on **this surface only**, directly under the H1, no bold labels; the why is a link to `../index.md#features`.
76
+ - No paragraph over 4 lines; prefer bullets. Roughly one screen per section — if Developer needs more, the spec is the place and the page links to it.
77
+ - One topic per page; two features → two pages. Relative links only; folder landings are `index.md`, linked explicitly.
78
+ - No `layout` key (applied site-wide from `_config.yml` `defaults:`). `nav_order`, `parent`, `grand_parent` ARE required — see the frontmatter derivation above.
79
+ - Maintenance metadata (scope, last synced, verified against, re-sync) is a single italic line at the *bottom* of the page, never a bold header block under the H1.
80
+
81
+ ## Domain and surface
82
+
83
+ Canonical domain list, feature→domain rules, surface assignment, and `platform` boundaries: `domain-guidelines.md`. Two domains still tie → ask (same tool) with the candidates and log the answer. Never invent a domain slug; a new domain is created from the domain-index template and rowed in `domains/index.md` and the wiki `index.md` domain map.
84
+
85
+ ## Business user / Developer content
86
+
87
+ Business user: only what the actor does or sees on this surface — menu paths, fields, states, error behaviour, ACL/role names. No rationale (index "Why" column), no implementation.
88
+
89
+ Developer, bullets with fixed labels: **Where** · **Extension points used** · **Decisions** (link ADRs) · **Config** (link `../../platform/configuration.md`) · **Debug/observe** (link `../../platform/logging.md`, `../../platform/debugging.md`) · **Gotchas**. Backend-only work is filed here under the triggering surface with one bullet saying so. What not to document: documentation guidelines "Reference code, don't restate it" (point to paths; link Shopware docs via the ShopwareDevKnowledgeBase MCP).
90
+
91
+ Where decisions go: documentation guidelines "Where decisions go". Skill rule — every unmarked decision (PRD §9 items, spec Decision Log lines, chat decisions) → Developer › Decisions; business rule → index "Why" column. Never `adr/` on the skill's own judgment.
92
+
93
+ ## ADRs
94
+
95
+ The skill never invents, decides on, or creates an ADR by itself. Exactly two inputs yield one:
96
+
97
+ 1. **WIP ADR file under `specs/`** — `specs/NNNN-slug-adr-<topic>.md` written by `sw-design-solution`; the spec's `[adr] <path>` Decision Log lines and Dependencies table point at it. Promoted once into `adr/` by `adr-promotion.md` when `accepted` and its required changes exist in the code; `docs/` is then the source of truth and the specs copy may be removed by people.
98
+ 2. **Provided by the user in chat as accepted** — title + context/decision/consequences, or an explicit "record this as an ADR" for a named decision. Written from `templates/adr.md` verbatim in structure, `status: accepted`, `area` = domain | `platform` | `process`, file `adr/YYYY-MM-DD-<kebab-title>.md`, no `promoted_from` key. Not stated as accepted → tell the user to file it under `specs/` as WIP; nothing is written.
99
+
100
+ Both get the matching Decision Log line above on the feature page and a Developer › Decisions link (`adr-promotion.md` §5); both are listed by the regenerated TOC block in `adr/index.md`. Anything the skill *thinks* might deserve an ADR (new project-specific domain, domain split, a spec `[potential ADR]` left unextracted) is not written and not asked about mid-run — it is listed in the report as "ADR candidates (not created)"; the user can provide one later.
101
+
102
+ ## Project guidelines
103
+
104
+ Triggered when a person states a project coding rule directly, or step 5b promotes an ADR whose Decision/Consequences change one — never on the skill's own judgment or "this looks like a rule".
105
+
106
+ 1. Detect the Shopware major from `composer.json`/`composer.lock` (same derivation as `verified_against`), e.g. `6.7`.
107
+ 2. Identify the target platform file by name (`architecture-`, `code-`, `qa-guidelines.md`, or a surface file `be-`/`fe-`/`admin-`/`storefront-…guidelines.md`) from what the rule is about.
108
+ 3. `read_doc platform/guidelines/<version>/<file>.md` first — never write a `merge:` anchor that was not read from this call. Pick the real heading anchor(s) the rule acts on.
109
+ 4. Write or edit `docs/project-wiki/guidelines/<file>.md` from `templates/guideline.md` (no version folder — project guidelines always apply to the installed Shopware version; `verified_against` records it): one `## <heading>` per anchor, `merge:` entry per section (`override`/`extend`/`waive`), `adr:` when the source is a promoted ADR. An anchor not found in the platform file is an addition — no `merge:` entry needed, the section is appended.
110
+ 5. Update `docs/project-wiki/guidelines/index.md`: regenerate the block between `<!-- guidelines-toc:start -->` / `<!-- guidelines-toc:end -->` from every file under `guidelines/` except `index.md`, one row `| <file> | <one-line rule summary> |` per file, newest `last_synced` first; text outside the markers stays untouched.
111
+ 6. No built-check gate — a guideline is a rule the project has decided on, not a feature to verify as built. `status`/⚠️ blocks do not apply.
112
+ 7. Report line: file written/updated, anchors and modes, ADR cited (if any).
113
+
114
+ ## Side pages touched per run
115
+
116
+ - `domains/<domain>/index.md` feature row (see `source-mapping.md`).
117
+ - `domains/platform/extensions-inventory.md` — a row when the feature introduces an extension not listed.
118
+ - `adr/index.md` — the `<!-- adr-toc:start -->`…`<!-- adr-toc:end -->` block is regenerated every run from all pages under `adr/` (`adr-promotion.md` §4); nothing outside the markers is touched.
119
+ - `guidelines/index.md` — the `<!-- guidelines-toc:start -->`…`<!-- guidelines-toc:end -->` block is regenerated whenever the "Project guidelines" route (above) writes or edits a file under `guidelines/`.
120
+ - `docs/project-wiki/baseline/glossary.md` — a row when the source introduces a new project term.
121
+ - Terminology on every touched page: documentation guidelines "Terminology" + the glossary's "Terms we do not use".
122
+
123
+ ## Link check (end of every run)
124
+
125
+ For each touched page (promoted ADRs and the TOC block included), extract every relative target (`[..](path)` and `related:` entries, `#anchor` stripped) and resolve it with `test -e` from the page's directory, e.g. `grep -o '](\.[^)#]*' page.md | sed 's/](//'`. Templates, absolute paths, and URLs into this repo are broken by definition. Fix what you can (wrong `../` depth, wrong surface folder), drop what has no target, and list anything unresolved in the report.
126
+
127
+ ## Touch discipline
128
+
129
+ Update an existing page for the same feature/surface in place; never create a second file. If its `status` contradicts the gate verdict, the gate wins (status, block, Decision Log line). Set `last_synced` only on pages touched this run. Never edit `specs/`.
@@ -0,0 +1,58 @@
1
+ # The documentation run, step by step
2
+
3
+ Entered from `sw-document-feature` after step 0. Steps 1-7 run in order. Step 3 is a hard gate: nothing under `docs/project-wiki/` is created or edited until it has produced its evidence table and verdict.
4
+
5
+ ### 1. Resolve inputs
6
+
7
+ Read the source document(s) or the chat. Collect the names the built-check will search for: extension name, entities, services, routes, templates/Twig blocks, admin modules/components, snippet keys, config keys, feature flags, test names. Note the feature slug: PRD slug without `NNNN-` (chat mode: kebab-case, 2–5 words).
8
+
9
+ ### 2. Find the counterpart
10
+
11
+ `ls specs/` and match by `NNNN`, then by slug. Read the counterpart. Do not create, edit, or renumber anything under `specs/`.
12
+
13
+ ### 3. Built-check gate (mandatory)
14
+
15
+ Follow `reference/built-check.md` in this skill's directory exactly: search custom project code, installed extensions (`composer.json`, `composer.lock`/`vendor/`, `bin/console plugin:list` / `app:list` if an environment is reachable — never fail on an unreachable one, note it), and any `sw-verify-feature` report in chat. Produce the evidence table and the verdict: `built`, `partially-built`, or `no evidence`.
16
+
17
+ **On `no evidence` — STOP.** Print the evidence table, then ask with a structured question tool if you have one (Claude Code: `AskUserQuestion`; Codex: `request_user_input`):
18
+
19
+ > Feature not found in project code — enforce documentation anyway?
20
+ > - **Stop (Recommended)** — nothing is written; document after implementation.
21
+ > - **Enforce — document as planned/not-built** — pages are written with the ⚠️ NOT BUILT block.
22
+
23
+ Only the enforce answer continues. Then every page carries `status: planned` (PRD or spec exists) or `not-built` (neither), the ⚠️ NOT BUILT block, a Developer section labelled "(planned)", and the Decision Log line `YYYY-MM-DD — User enforced documentation although the built-check found no code`. A "Stop" answer ends the run with the evidence table as the report.
24
+
25
+ `partially-built` needs no question but also requires the ⚠️ PARTIALLY BUILT block listing the failing ACs.
26
+
27
+ ### 4. Map domain and surfaces
28
+
29
+ - Domain and surfaces per `reference/domain-guidelines.md` in this skill's directory: canonical slug list, assignment rules, what never goes into `platform`. Ask (same tool) only if two domains fit equally; anchor the answer in the Decision Log.
30
+ - New domain: create `domains/<domain>/index.md` from `reference/templates/domain-index.md`, add a row to `domains/index.md` and to the domain map in `docs/project-wiki/index.md` (`| [Domain](domains/<domain>/index.md) | Purpose |`).
31
+
32
+ ### 5. Write pages
33
+
34
+ Apply `reference/page-rules.md` and `reference/source-mapping.md` in this skill's directory. First check the side pages this run touches exist — `domains/index.md`, `domains/platform/extensions-inventory.md`, `adr/index.md`; if one is missing, stop and tell the user to run `sw-document-feature --setup`.
35
+
36
+ - Feature page(s) from `reference/templates/feature-page.md`, frontmatter complete: `nav_order`, `parent` (the domain's title), `grand_parent: Domains`, `status`, `extension`, `spec`, `prd`, `verified_against` = `Shopware <shopware/core version from composer.json>`, `last_synced` = today, `related`.
37
+ - Feature row in `domains/<domain>/index.md` — the single source of the "why".
38
+ - `domains/platform/extensions-inventory.md` — add a row if the feature introduces an extension not listed.
39
+ - ADR provided by the user in chat and stated as accepted: write it from `reference/templates/adr.md` (structure verbatim), Decision Log line on the page; it lands in the TOC via step 5b. Not stated as accepted → tell the user to file it under `specs/` as WIP. ADRs from `specs/` are handled only by step 5b. Anything else the skill thinks might deserve an ADR is not written — it goes to the report as an ADR candidate.
40
+ - Developer › Decisions references a promoted ADR as `[ADR-id](../../../adr/<file>.md)`, a WIP one as `[ADR-id](../../../../../specs/<file>) (WIP, <status>)`.
41
+ - Existing page for the same feature/surface: update in place, never create a second file. If its `status` contradicts the gate verdict, the gate wins: update status and the ⚠️ block, and append the Decision Log line `YYYY-MM-DD — Status changed <old>→<new> by built-check (<evidence>)`.
42
+
43
+ ### 5b. Promote ADRs
44
+
45
+ Follow `reference/adr-promotion.md`: glob **all** `specs/*-adr-*.md` (not only this feature's); an `accepted` one whose required changes the built-check finds in the code is promoted once into `docs/project-wiki/adr/<date>-<topic>.md` (already present by `id` → skip, docs wins); everything else is reported as WIP / awaiting implementation. Check the spec's `[adr] <path>` lines resolve, then regenerate the block between `<!-- adr-toc:start -->` / `<!-- adr-toc:end -->` in `adr/index.md`; everything outside the markers stays untouched (including the Liquid table block, on wikis using the Jekyll flavor).
46
+
47
+ ### 5c. Update project guidelines — only when triggered
48
+
49
+ Triggered when the user states a project coding rule directly, or a promoted ADR (step 5b) changes one — never on the skill's own judgment. Follow `reference/page-rules.md` "Project guidelines". No built-check gate: a guideline is a rule, not a feature.
50
+
51
+ ### 6. Link check
52
+
53
+ For every touched page, including promoted ADRs and the TOC block, resolve each relative link (`[..](../x.md)`, `related:` entries) against the filesystem, e.g. with `grep -o` + `test -e` from the page's directory. Fix or drop broken links; report any you could not resolve.
54
+
55
+ ### 7. Report
56
+
57
+ At most six lines: structure check (created files or drift, if any); files written/updated; status per page; gate verdict (with "enforced" if applicable); `ADRs: promoted n · WIP n · awaiting implementation n · removable specs copies n · dangling [adr] links: <paths or none>`, inventory rows, "ADR candidates (not created): …" (`[potential ADR]` items the spec left unextracted; omit when none), open questions; link-check result. Never paste page bodies.
58
+
@@ -0,0 +1,78 @@
1
+ ---
2
+ title: "Shopware Project Wiki"
3
+ nav_exclude: true
4
+ tags: [readme, meta]
5
+ ---
6
+
7
+ # Shopware Project Wiki
8
+
9
+ **→ Start reading at [index.md](index.md).** This page explains what the wiki is and how it is
10
+ published; the documentation itself starts at the index.
11
+
12
+ This is the living documentation for one Shopware 6 project. It is structured and atomic so that
13
+ coding agents (MCP/LLM tooling) can consume it page by page, and written so that the whole team —
14
+ PMs, architects, developers, QA — can read the same pages without a translation layer.
15
+
16
+ ## What is inside
17
+
18
+ | Folder | What lives there |
19
+ |---|---|
20
+ | [`domains/`](domains/index.md) | Feature documentation, one page per surface (`administration/`, `storefront/`) |
21
+ | [`domains/platform/`](domains/platform/index.md) | Cross-cutting infrastructure: extensions, configuration, logging, debugging, environments |
22
+ | [`baseline/`](baseline/tech-stack.md) | The project's tech stack and its glossary |
23
+ | [`adr/`](adr/index.md) | Accepted architecture and process decisions |
24
+ | [`guidelines/`](guidelines/index.md) | This project's coding rules, inherited from Shopware unless overridden, plus [documentation guidelines](guidelines/documentation-guidelines.md) — the rules every page follows |
25
+
26
+ Pages are kept in sync by the `sw-document-feature` skill after each feature verification
27
+ (`sw-verify-feature`).
28
+
29
+ ## Publishing with GitHub Pages
30
+
31
+ The wiki uses [Just the Docs](https://just-the-docs.com/) for its sidebar navigation and search.
32
+ It is pulled in with `remote_theme:`, which GitHub Pages supports on an ordinary branch deploy — no
33
+ Actions workflow and no local build are needed. Which of the two setups applies depends on where
34
+ this folder lives:
35
+
36
+ **A. Published as its own repository** (this folder is the repository root — the simplest case):
37
+
38
+ 1. Push the folder to its own GitHub repository.
39
+ 2. Settings → Pages → Build and deployment: Source **Deploy from a branch**, branch `main` (or
40
+ `master`), folder **/ (root)**.
41
+ 3. `_config.yml` here is the site config, so the theme applies automatically. Set its
42
+ `baseurl` to the repository name (`/<repo>`), or the theme's CSS and JS will 404.
43
+
44
+ **B. Published from the parent project repository** (`docs/project-wiki/` inside a larger repo):
45
+
46
+ GitHub Pages only reads `_config.yml` from the Pages source root (`/` or `/docs`), never from a
47
+ nested folder — so a branch deploy from `/docs` renders these pages **unthemed**, without the
48
+ sidebar. To keep the theme, either publish the wiki as its own repository (setup A), or switch
49
+ Source to **GitHub Actions** and point a Jekyll build at this folder (`actions/jekyll-build-pages`
50
+ with `source: docs/project-wiki`).
51
+
52
+ **The site renders as unstyled HTML — plain bullet lists and blue links?** The theme loaded but its
53
+ assets 404'd: `baseurl` in `_config.yml` must be `/<repo>` for a project site
54
+ (`https://<org>.github.io/<repo>/`), and empty only for a user/org site or an Actions build. The
55
+ navigation still renders correctly in that state, so the page looks structurally right and entirely
56
+ unstyled.
57
+
58
+ ## Previewing locally
59
+
60
+ ```sh
61
+ gem install bundler jekyll
62
+ cd docs/project-wiki
63
+ bundle exec jekyll serve # or: jekyll serve
64
+ # open http://127.0.0.1:4000
65
+ ```
66
+
67
+ Minimal `Gemfile` — `github-pages` pins the exact versions GitHub Pages runs, so a local preview
68
+ matches the published site:
69
+
70
+ ```ruby
71
+ source "https://rubygems.org"
72
+ gem "github-pages", group: :jekyll_plugins
73
+ ```
74
+
75
+ ---
76
+
77
+ *Generated {{DATE}} · verified against Shopware {{SHOPWARE_VERSION}} · the rules for pages live in
78
+ [guidelines/documentation-guidelines.md](guidelines/documentation-guidelines.md).*
@@ -0,0 +1,51 @@
1
+ # Jekyll site configuration for the project wiki (GitHub Pages compatible).
2
+ # This folder is the site root: when it is published as its own repository
3
+ # (Settings → Pages → Deploy from a branch → / (root)), this file is the site config.
4
+
5
+ title: Shopware Project Wiki
6
+ description: What we built in this Shopware project, why, where it lives in the code, and how to run it.
7
+
8
+ # Just the Docs gives the left sidebar navigation and search. It is not one of the themes selectable
9
+ # via `theme:`, but GitHub Pages supports `remote_theme:` on a plain branch deploy — no Actions
10
+ # workflow needed. Pinned to a tag so a theme release cannot change the site unannounced.
11
+ remote_theme: just-the-docs/just-the-docs@v0.10.1
12
+
13
+ markdown: kramdown
14
+
15
+ plugins:
16
+ - jekyll-remote-theme
17
+ - jekyll-seo-tag
18
+
19
+ # A GitHub Pages *project* site (this folder published from a repo whose Pages URL is
20
+ # https://<org>.github.io/<repo>/) needs baseurl set to "/<repo>", or the theme's CSS and JS 404.
21
+ # A user/org site (repo named <org>.github.io) or a build via GitHub Actions needs it empty.
22
+ # The scaffold cannot know the repository name — set this by hand after publishing.
23
+ baseurl: ""
24
+
25
+ # The sidebar hierarchy comes from each page's nav_order / parent / grand_parent front matter;
26
+ # the layout is applied here so pages stay free of theme-specific keys.
27
+ defaults:
28
+ - scope:
29
+ path: ""
30
+ values:
31
+ layout: default
32
+
33
+ search_enabled: true
34
+ search:
35
+ heading_level: 2
36
+ previews: 2
37
+
38
+ heading_anchors: true
39
+ back_to_top: true
40
+ back_to_top_text: "Back to top"
41
+
42
+ # aux_links:
43
+ # "Project repository": https://github.com/<org>/<repo>
44
+ # aux_links_new_tab: true
45
+
46
+ color_scheme: light
47
+
48
+ exclude:
49
+ - Gemfile
50
+ - Gemfile.lock
51
+ - vendor