bmad-plus 0.17.0 → 0.18.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 (63) hide show
  1. package/CHANGELOG.md +108 -30
  2. package/README.md +23 -23
  3. package/SECURITY.md +9 -1
  4. package/osint-agent-package/README.md +13 -0
  5. package/osint-agent-package/SETUP_KEYS.md +13 -0
  6. package/package.json +32 -8
  7. package/readme-international/README.de.md +133 -542
  8. package/readme-international/README.es.md +135 -561
  9. package/readme-international/README.fr.md +134 -558
  10. package/src/bmad-plus/agents/agent-shadow/SKILL.md +6 -0
  11. package/src/bmad-plus/packs/pack-memory/README.md +1 -1
  12. package/src/bmad-plus/packs/pack-memory/memory-orchestrator.md +1 -1
  13. package/src/bmad-plus/packs/pack-memory/shared/memory-protocol.md +1 -1
  14. package/src/bmad-plus/packs/pack-shield/README.md +2 -0
  15. package/src/bmad-plus/packs/pack-shield/SKILL.md +2 -0
  16. package/src/bmad-plus/packs/pack-shield/shared/audit-report-template.md +6 -0
  17. package/src/bmad-plus/packs/pack-shield/shield-orchestrator.md +4 -0
  18. package/src/bmad-plus/skills/bmad-plus-uat/SKILL.md +61 -1
  19. package/src/bmad-plus/skills/bmad-plus-uat/ref/uat-results.schema.json +11 -0
  20. package/src/bmad-plus/skills/bmad-plus-uat/template/page.html +455 -137
  21. package/src/bmad-plus/skills/bmad-plus-uat/template/strings.json +230 -20
  22. package/tools/build/adapters.config.js +1 -1
  23. package/tools/build/generate-adapters.js +186 -60
  24. package/tools/build/generate.js +49 -13
  25. package/tools/cli/bmad-plus-cli.js +3 -6
  26. package/tools/cli/commands/autoconfig.js +62 -22
  27. package/tools/cli/commands/install.js +620 -356
  28. package/tools/cli/commands/memory.js +40 -13
  29. package/tools/cli/commands/scan.js +94 -30
  30. package/tools/cli/commands/uat.js +50 -5
  31. package/tools/cli/commands/uninstall.js +65 -16
  32. package/tools/cli/commands/update-check.js +13 -4
  33. package/tools/cli/commands/update-policy.js +14 -5
  34. package/tools/cli/commands/update.js +96 -21
  35. package/tools/cli/i18n.js +120 -68
  36. package/tools/cli/lib/ide-config.js +3 -1
  37. package/tools/cli/lib/install-manifest.js +32 -7
  38. package/tools/cli/lib/installation-health.js +33 -1
  39. package/tools/cli/lib/installed-adapters.js +29 -6
  40. package/tools/cli/lib/memory-init.js +19 -4
  41. package/tools/cli/lib/packs.js +17 -28
  42. package/tools/cli/lib/path-hash.js +5 -1
  43. package/tools/cli/lib/python-provision.js +51 -12
  44. package/tools/cli/lib/stack-detect.js +51 -25
  45. package/tools/cli/lib/uat.js +139 -1
  46. package/tools/cli/lib/update-check.js +132 -34
  47. package/tools/cli/lib/update-dispatch.js +2 -2
  48. package/tools/cli/lib/update-policy.js +57 -19
  49. package/tools/cli/lib/update-transaction.js +439 -85
  50. package/tools/build/README.md +0 -78
  51. package/tools/build/check-counts.js +0 -626
  52. package/tools/build/check-install-contract.js +0 -648
  53. package/tools/build/generated-adapters/.codex/AGENTS.md +0 -134
  54. package/tools/build/generated-adapters/.cursor/rules/bmad-plus.mdc +0 -139
  55. package/tools/build/generated-adapters/.opencode/AGENTS.md +0 -134
  56. package/tools/build/generated-adapters/AGENTS.md +0 -132
  57. package/tools/build/generated-adapters/CLAUDE.md +0 -135
  58. package/tools/build/generated-adapters/CONVENTIONS.md +0 -134
  59. package/tools/build/generated-adapters/GEMINI.md +0 -139
  60. package/tools/build/generated-adapters/README.md +0 -79
  61. package/tools/maintain/upstream-candidate.js +0 -456
  62. package/tools/release/publication-content.js +0 -904
  63. package/tools/release/supply-chain.js +0 -282
@@ -61,6 +61,12 @@ or a public entity). This gate governs every direct menu path — there is no pa
61
61
  personal data that skips it. It does not remove any capability or restrict lawful,
62
62
  authorized use (CG-02); `QS` on a public handle, `DG`, and tooling paths are exempt.
63
63
 
64
+ **Output disclaimer.** Open every dossier or profile with: *"AI-generated OSINT output —
65
+ may contain errors; not legal advice. The operator is the data controller and is
66
+ responsible for the lawful basis (GDPR Art. 6/9), platform Terms of Service, and human
67
+ verification before any decision."* Never profile a private individual without a
68
+ recorded legal basis.
69
+
64
70
  ## Required Setup
65
71
 
66
72
  - Python 3.10+
@@ -97,7 +97,7 @@ After installation:
97
97
 
98
98
  ```
99
99
  # Scan your projects
100
- "Zecher, scan projects in D:\travail\DEV"
100
+ "Zecher, scan projects in ~/dev"
101
101
 
102
102
  # Start remembering
103
103
  "Atlas, create a PRD for..." ← decisions auto-logged
@@ -29,7 +29,7 @@ While executing the protocol, the host agent should:
29
29
  A session that ends without an agent turn has no guaranteed handoff.
30
30
 
31
31
  Manual activation via Zecher:
32
- - `"Zecher, scan projects in D:\travail\DEV"` — discover and index all projects
32
+ - `"Zecher, scan projects in ~/dev"` — discover and index all projects
33
33
  - `"Zecher, consolidate memory"` — deduplicate, archive stale, promote
34
34
  - `"Zecher, where were we?"` — reconstruct context from last session
35
35
  - `"Zecher, health check"` — verify memory integrity
@@ -165,7 +165,7 @@ AGENTS.md → Already agent-aware
165
165
  ### Project Metadata (per scan)
166
166
  ```yaml
167
167
  # ~/.bmad-plus/brain/projects/<hash>.yaml
168
- path: "D:\\travail\\DEV\\my-project"
168
+ path: "~/dev/my-project"
169
169
  name: "my-project"
170
170
  hash: "a1b2c3d4" # SHA256 of absolute path
171
171
  stack:
@@ -2,6 +2,8 @@
2
2
 
3
3
  > **27 compliance agents across 6 categories, plus 11 GDPR & AI Act workflows** + 1 orchestrator covering Data Privacy, Cybersecurity, Industry Compliance, Defense & Export, AI Governance, and Accessibility & ESG.
4
4
 
5
+ > ⚠️ **Not legal advice.** Shield output is AI-generated, may be incomplete or out of date, and does not replace a lawyer, DPO or certified auditor. Human review by a qualified person is required before any compliance decision, filing or attestation.
6
+
5
7
  ## Overview
6
8
 
7
9
  Pack Shield transforms BMAD+ into a comprehensive GRC (Governance, Risk & Compliance) assistant. Each agent is an expert system prompt for a specific regulatory framework, providing structured compliance guidance including gap analysis, policy drafting, control mapping, and audit support.
@@ -4,6 +4,8 @@
4
4
  > **Version:** 1.0.0
5
5
  > **Created by:** Laurent Rochetta — https://github.com/lrochetta/BMAD-PLUS
6
6
 
7
+ > ⚠️ **Not legal advice.** Shield output is AI-generated, may be incomplete or out of date, and does not replace a lawyer, DPO or certified auditor. Human review by a qualified person is required before any compliance decision, filing or attestation.
8
+
7
9
  ## Overview
8
10
 
9
11
  Shield transforms BMAD+ into a comprehensive GRC (Governance, Risk & Compliance) assistant. It serves as an intelligent orchestrator for 27 compliance agents across 6 categories, plus 11 GDPR & AI Act workflows, covering 25+ regulatory frameworks. Route requests to the appropriate specialist agent, combine insights for cross-framework analysis, and provide consolidated compliance reports.
@@ -4,10 +4,14 @@
4
4
  > **Purpose:** Standardized compliance audit report format
5
5
  > **Version:** 1.0.0
6
6
 
7
+ > ⚠️ **Not legal advice.** Shield output is AI-generated, may be incomplete or out of date, and does not replace a lawyer, DPO or certified auditor. Human review by a qualified person is required before any compliance decision, filing or attestation.
8
+
7
9
  ---
8
10
 
9
11
  ## Compliance Audit Report
10
12
 
13
+ > 🤖 **AI-GENERATED DRAFT — Not legal advice.** Produced with BMAD+ Shield (AI-assisted). Requires review and sign-off by a qualified person (lawyer, DPO or certified auditor) before use. Keep this banner on every copy.
14
+
11
15
  ### Cover Page
12
16
 
13
17
  | Field | Value |
@@ -21,6 +25,8 @@
21
25
  | **Report Date** | [DATE] |
22
26
  | **Prepared by** | [NAME] |
23
27
  | **Classification** | Confidential |
28
+ | **Generation** | AI-generated draft — human review required |
29
+ | **Reviewed by (qualified person)** | [NAME, ROLE, DATE] |
24
30
 
25
31
  ---
26
32
 
@@ -5,6 +5,8 @@
5
5
  > **Version:** 1.0.0
6
6
  > **Created by:** Laurent Rochetta — https://github.com/lrochetta/BMAD-PLUS
7
7
 
8
+ > ⚠️ **Not legal advice.** Shield output is AI-generated, may be incomplete or out of date, and does not replace a lawyer, DPO or certified auditor. Human review by a qualified person is required before any compliance decision, filing or attestation.
9
+
8
10
  ---
9
11
 
10
12
  ## Persona
@@ -216,6 +218,8 @@ Which area? (1-8, or describe your situation)
216
218
  3. Use cross-framework-mapper for overlaps
217
219
  4. Present consolidated report with `shared/audit-report-template.md`
218
220
 
221
+ Every report or assessment you produce MUST keep the template's "AI-generated" marking and the "Not legal advice" disclaimer above.
222
+
219
223
  ### Uncertainty
220
224
  If the framework is ambiguous:
221
225
  1. Ask 2-3 clarifying questions (jurisdiction, industry, data types)
@@ -87,6 +87,60 @@ Deliver in the way the host allows, and say so plainly:
87
87
  Then tell the tester four things: the link or file, how long it takes, **which steps write for
88
88
  real**, and the play order when several recipes share an environment (`bmad-plus uat order`).
89
89
 
90
+ ### What the page guarantees — and what you check before a person opens it
91
+
92
+ A run takes tens of minutes. The tester answers in passing, opens the product in another
93
+ tab, comes back, reloads. On 2026-09-25 a page built outside this command showed its steps
94
+ before any run existed: every tick was displayed and none was kept, a reload emptied the
95
+ form, and the status read "saved" on nobody's word. What follows exists so that this
96
+ cannot happen again, on any project.
97
+
98
+ **The page is built, never written.** Persistence lives in one place, the template that
99
+ `bmad-plus uat build` fills. Do not hand-write an acceptance page, do not re-implement
100
+ saving in a project, do not edit the produced HTML. A page that needs something the
101
+ template lacks is a change to the template, made in BMAD+ with its tests.
102
+
103
+ **What every built page guarantees, by construction** (`uat build --json` lists them under
104
+ `guarantees`, and the build refuses a template that lost one):
105
+
106
+ | Guarantee | What the tester gets |
107
+ |---|---|
108
+ | `hidden-before-start` · `no-answer-before-run` | no answer field before a run exists, whatever a stylesheet says; a tick before that is refused and explained, never dropped |
109
+ | `verified-local-write` · `honest-save-status` | a write counts only once it reads back; the status names a refused save ("Could not save in this browser — save or copy the JSON") and never says "saved" otherwise |
110
+ | `save-on-every-change` | every tick and every keystroke in a note is kept at once, no blur needed, and the cursor never moves |
111
+ | `restore-before-capabilities` · `newer-copy-wins` | the browser's copy comes back synchronously on reload, before any optional capability answers; an older remote copy never overwrites a newer local one |
112
+ | `revision-guard` | a run that answered another revision of the recipe is offered, not poured in: identical lines keep their answers, changed lines are asked again, the earlier run stays untouched and exportable (`carriedFrom` in the results) |
113
+ | `other-tab-notice` | two tabs on one run converge on the latest change, and the page says so |
114
+ | `unreadable-draft-kept` | a saved run that cannot be read is reported and exportable, never deleted |
115
+ | `progress-accessible` | the share of lines *answered* — not passed — as a `progressbar` with its value, next to the seen / not seen / blocked counts |
116
+ | `storage-explained` | where the answers live and what makes them disappear (site data cleared, private window closed), and that nobody receives them until the JSON is handed over |
117
+ | `finished-is-not-accepted` · `unload-guard` | unanswered lines are said on the page before finishing (a second click finishes anyway); finishing keeps the date and says it is not an acceptance; leaving with an unsaved run is questioned |
118
+ | `utf8-and-escaped-diacritics` · `export-is-the-run` | UTF-8 declared, diacritics handled as escapes, and the exported JSON is the run as answered |
119
+
120
+ **Before a person opens the page**, in this order, and say in the delivery which ones ran:
121
+
122
+ 1. `bmad-plus uat lint <id> --src <dir>` passes.
123
+ 2. `bmad-plus uat build <id>` writes the page and lists its guarantees.
124
+ 3. Open the built page in a real browser and play the essential pass yourself: no answer
125
+ field before starting → enter a name and start → tick one *Seen* → tick one *Not seen* →
126
+ type a remark without leaving the field → type an overall remark → **reload at once,
127
+ without clicking anywhere** → everything is back and the progress says two lines are
128
+ answered. `tools/qa/uat-page-browser-check.js` in the BMAD+ repository is this pass,
129
+ automated; the framework's own suite (`tests/unit/uat-page.test.js`) replays every
130
+ scenario of the incident, storage refusal and revision change included.
131
+ 4. Run these where the project's execution policy allows: if tests do not run on this
132
+ machine, run them on the project's remote environment. Never skip them to save time.
133
+
134
+ If any of these fail, the page is **not ready** — say so, and do not hand it over. A page
135
+ handed over without step 3 is handed over with that fact written next to it.
136
+
137
+ **Tell the tester where the answers live**, in one sentence, before the link: in the artifact
138
+ database (saved on every tick, nothing to send), in the project through `uat serve`, or in
139
+ their browser — on that device only, until they save the JSON. The page says it too.
140
+
141
+ **When the recipe is amended** after a run started, tell the tester their earlier run will be
142
+ offered on the new page and that only unchanged lines keep their answers.
143
+
90
144
  ## 3. Read, triage, gate
91
145
 
92
146
  ```bash
@@ -144,7 +198,10 @@ keeps acceptance out of reach; the fix task carries the run and the triage entry
144
198
  - It does not invent expectations: what the spec announces comes from the code and the
145
199
  measurement, never from the plan alone.
146
200
  - It does not play the recipe. An agent that "plays" it in a headless browser has written a test,
147
- not a recipe.
201
+ not a recipe. Checking that the *page* keeps answers (the pass above) is not playing the recipe:
202
+ it proves the form, not the product.
203
+ - It does not write pages by hand. Persistence is the template's, tested in BMAD+; a project that
204
+ needs more changes the template, not its copy of the page.
148
205
 
149
206
  ## Pitfalls already paid for
150
207
 
@@ -156,3 +213,6 @@ keeps acceptance out of reach; the fix task carries the run and the triage entry
156
213
  - One step reading two screens: totals were hunted on a page that only shows subtotals. One step, one screen.
157
214
  - Two recipes on one environment destroying each other's witnesses through indirect writes — a save
158
215
  that triggers a recomputation. Declare witnesses, run `uat order`, and re-measure after each pass.
216
+ - A page written outside `uat build`, with its own persistence: the steps showed before the run
217
+ existed, ticks were dropped, a reload lost everything, and "saved" was printed unverified
218
+ (FormaPro, 2026-09-25). Build the page; check it in a browser; say which checks ran.
@@ -20,6 +20,17 @@
20
20
  "updatedAt": { "type": "string", "format": "date-time" },
21
21
  "finishedAt": { "type": ["string", "null"], "format": "date-time" },
22
22
  "overallNote": { "type": "string" },
23
+ "carriedFrom": {
24
+ "type": "object",
25
+ "description": "Present when the page continued a run that answered another revision of the recipe. The rule is fixed: an answer travelled only when its line was identical (same step, same letter, same text); every other line was asked again. The earlier run is left untouched.",
26
+ "required": ["runId", "kept", "toAnswer"],
27
+ "properties": {
28
+ "runId": { "type": "string", "description": "The run the answers came from." },
29
+ "specSha256": { "type": ["string", "null"], "description": "The revision that run answered; null when it carried no fingerprint." },
30
+ "kept": { "type": "integer", "description": "Answers that travelled." },
31
+ "toAnswer": { "type": "integer", "description": "Lines of this revision left unanswered by the carry." }
32
+ }
33
+ },
23
34
  "summary": {
24
35
  "type": "object",
25
36
  "required": ["passed", "failed", "blocked", "skipped", "unanswered"],