bmad-plus 0.21.0 → 0.22.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 (46) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +13 -13
  3. package/SECURITY.md +62 -0
  4. package/osint-agent-package/skills/bmad-osint-investigate/osint/scripts/_http.py +68 -24
  5. package/package.json +1 -1
  6. package/readme-international/README.de.md +13 -13
  7. package/readme-international/README.es.md +13 -13
  8. package/readme-international/README.fr.md +13 -13
  9. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/code-review.md +3 -1
  10. package/src/bmad-plus/packs/pack-seo/SKILL.md +3 -1
  11. package/src/bmad-plus/packs/pack-seo/ref/cwv-thresholds.md +2 -2
  12. package/src/bmad-plus/packs/pack-seo/requirements.txt +1 -1
  13. package/src/bmad-plus/packs/pack-seo/scripts/seo_apis.py +72 -30
  14. package/src/bmad-plus/packs/pack-seo/scripts/seo_report.py +5 -6
  15. package/src/bmad-plus/packs/pack-seo/scripts/seo_screenshot.py +176 -14
  16. package/src/bmad-plus/packs/pack-shield/README.md +12 -0
  17. package/src/bmad-plus/packs/pack-shield/SKILL.md +7 -1
  18. package/src/bmad-plus/packs/pack-shield/review-rules/access-control.md +10 -0
  19. package/src/bmad-plus/packs/pack-shield/review-rules/ai-integrations.md +10 -0
  20. package/src/bmad-plus/packs/pack-shield/review-rules/change-and-supply-chain.md +10 -0
  21. package/src/bmad-plus/packs/pack-shield/review-rules/cryptography.md +10 -0
  22. package/src/bmad-plus/packs/pack-shield/review-rules/index.yaml +134 -0
  23. package/src/bmad-plus/packs/pack-shield/review-rules/logging.md +10 -0
  24. package/src/bmad-plus/packs/pack-shield/review-rules/personal-data.md +10 -0
  25. package/src/bmad-plus/packs/pack-shield/shared/ai-processing-register-template.yaml +53 -0
  26. package/src/bmad-plus/packs/pack-shield/shared/ai-processing-register.md +32 -0
  27. package/src/bmad-plus/packs/pack-shield/shared/assurance-case-template.yaml +87 -0
  28. package/src/bmad-plus/packs/pack-shield/shared/assurance-case.md +50 -0
  29. package/src/bmad-plus/packs/pack-shield/shield-orchestrator.md +24 -1
  30. package/src/bmad-plus/skills/bmad-plus-uat/SKILL.md +1 -0
  31. package/src/bmad-plus/skills/bmad-plus-uat/template/page.html +5 -4
  32. package/tools/build/generate-adapters.js +7 -0
  33. package/tools/build/generate.js +14 -0
  34. package/tools/cli/bmad-plus-cli.js +2 -0
  35. package/tools/cli/commands/ai-register.js +63 -0
  36. package/tools/cli/commands/assurance.js +162 -0
  37. package/tools/cli/commands/review.js +10 -3
  38. package/tools/cli/lib/ai-register.js +393 -0
  39. package/tools/cli/lib/assurance.js +822 -0
  40. package/tools/cli/lib/control-refs.js +132 -0
  41. package/tools/cli/lib/installation-health.js +17 -0
  42. package/tools/cli/lib/packs.js +60 -2
  43. package/tools/cli/lib/page-origins.js +582 -0
  44. package/tools/cli/lib/review-rules.js +92 -24
  45. package/tools/cli/lib/review.js +28 -1
  46. package/tools/cli/lib/uat.js +22 -5
package/CHANGELOG.md CHANGED
@@ -5,6 +5,26 @@ All notable changes to BMAD+ will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.22.0] - 2026-09-29
9
+
10
+ ### Added
11
+
12
+ - **Shield security assurance case** (`bmad-plus assurance init|run|verify <case>`). A case states claims, an argument for each, and evidence that can only be a check that ran. `run` executes each declared command without a shell and with a minimal environment, and appends a hash-chained ledger record (exit code, output digest, redacted excerpt, digests of the artifacts it wrote, commit, working-tree state). `verify` finds a claim unsupported when its evidence is missing, failed or stale, and can emit a CI check. `verify --ledger-head` catches removed runs; with `BMAD_PLUS_ASSURANCE_KEY` every record carries an HMAC that no check can read.
13
+ - **Shield AI processing register** (`bmad-plus ai-register init|check`). `_bmad/ai-processing-register.yaml` records each AI tool with its provider, purpose, data categories, legal basis, retention, transfers and processing agreement. `check` compares it with the AI integrations found in the project (BMAD+ adapters, tool folders, MCP server declarations) and warns about any tool not registered; `bmad-plus doctor` reports it when Shield is installed.
14
+ - **Compliance review rules.** A review rule can name the controls it examines (`FRAMEWORK:ID`, validated). An installed Shield adds six path-scoped rules in a `compliance` group (access control, personal data, cryptography, logging, AI integrations, change and supply chain); the checklist opens with the controls a change touches, and a finding may list the controls it breaks.
15
+
16
+ ### Security
17
+
18
+ - **Data-handling doctrine and egress gate.** `registry.yaml` declares what BMAD+ sends, to whom, when and under which consent basis. `tools/build/verify-egress.js` fails CI when a network, listener or process site of the package or of the maintainer services is undeclared, miscounted or stale, or when a module load cannot be resolved. `SECURITY.md` has a generated "Data handling" section and the generated adapters state the flows of the installed packs. BMAD+ has no telemetry; `update-check` is opt-out.
19
+ - **The UAT recipe page loads nothing from another origin.** Google Fonts is gone; the page uses installed fonts. The build refuses a template that would load or send anything elsewhere (`no-third-party-requests`), reading it as the HTML tokenizer does, with references, escapes and `data:` documents decoded. The jsdom and Chromium checks record every request and socket of a run.
20
+ - **The SEO HTML report opens without asking any server**, and `GOOGLE_API_KEY` is sent in the `x-goog-api-key` header, never in a URL, and redacted from errors.
21
+ - **OSINT provider calls are HTTPS-only**: other schemes, URL credentials and redirects that leave https or the host are refused before connecting.
22
+ - **SEO screenshots are pinned** to the address `seo_fetch.py` validated: Chromium resolves nothing else, other hosts and redirect hops are blocked and reported.
23
+
24
+ ### Fixed
25
+
26
+ - **MCP server:** SSE client disconnects and graceful shutdowns no longer log `Exception in ASGI application`; an open SSE stream ends cleanly on SIGTERM. The middlewares are pure ASGI. An `MCP_TOKEN_CREATED_AT` with a UTC offset no longer makes every authenticated request answer 500, and non-ASCII secrets are refused with 401 instead of raising.
27
+
8
28
  ## [0.21.0] - 2026-09-28
9
29
 
10
30
  ### Added
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # BMAD+
2
2
 
3
- [![Version](https://img.shields.io/badge/version-0.21.0-blue)](https://www.npmjs.com/package/bmad-plus)
3
+ [![Version](https://img.shields.io/badge/version-0.22.0-blue)](https://www.npmjs.com/package/bmad-plus)
4
4
 
5
- **Version 0.21.0** · Node.js `>=20.0.0` · MIT
5
+ **Version 0.22.0** · Node.js `>=20.0.0` · MIT
6
6
 
7
7
  Project-local AI development workflows with clear roles, shared context, safe updates and coding-tool adapters
8
8
 
@@ -35,7 +35,7 @@ Run the installer. Select the adapters for the AI tools you use and the packs yo
35
35
  **In your project terminal:**
36
36
 
37
37
  ```sh
38
- npx bmad-plus@0.21.0 install
38
+ npx bmad-plus@0.22.0 install
39
39
  ```
40
40
 
41
41
  The installer creates the agent instructions, shared project spine and selected tool adapters. Optional packs may need additional runtimes or API access.
@@ -171,18 +171,18 @@ Read AGENTS.md and the available project memory. Summarize the last verified sta
171
171
 
172
172
  Expected result: a short, evidence-based restart. Project notes are useful context and still need to be checked against the current work.
173
173
 
174
- ## What’s new in 0.21.0
174
+ ## What’s new in 0.22.0
175
175
 
176
- Reviews that stop honestly, resume, and report to CI
176
+ What leaves your machine, declared and checked
177
177
 
178
- A review now records why it stopped and what it used, writes a check a CI step can read, and resumes on the scope it sealed. The SEO fetcher connects only to addresses it has validated, and the MCP server moves to the official SDK on Python 3.12. Nothing changes in how you install or update.
178
+ BMAD+ now declares every way it sends data or starts a process, and its CI refuses anything undeclared. The recipe page and the SEO report load nothing from other sites, OSINT calls are HTTPS-only, and Shield gains an evidence-bound assurance case and an AI processing register. Nothing changes in how you install or update.
179
179
 
180
- - coverage.json can record how a review ran: why it stopped (completed, budget, time limit, three failed attempts in a row, interrupted), the passes run and the usage the host reported. A review that stopped early is always incomplete, and a unit is abandoned after three consecutive failed attempts.
181
- - bmad-plus review gate --emit-check followed by a file name writes the verdict as a check document for CI: disposition, reasons, open findings by severity with their lines, and a block shaped for GitHub check runs. The same evidence always gives the same file.
182
- - bmad-plus review continue resumes an interrupted review on the same sealed scope and lists what is still owed. It refuses when the code, the rules or a selected file changed, and points to a new scope and review compare.
183
- - Review rules can belong to a group (code, data, delivery or your own), so parallel reviewers can split a unit by rule family.
184
- - For maintainers, a review bench scores recorded review answers against planted defects and decoys with a published matching rule, and copy-ready CI recipes gate pull requests with a host agent on a self-hosted runner without trusting anything the agent can rewrite.
185
- - The SEO fetcher and crawler resolve each host themselves, refuse internal addresses and connect to the exact address they validated, on every redirect too, which defeats DNS rebinding. The MCP server uses the official SDK on Python 3.12 with current chromadb and sentence-transformers; re-run ingest.py once after upgrading.
180
+ - The registry states what BMAD+ sends, to whom, when and with which consent; SECURITY.md shows it and the installed agent instructions summarise it. A build check fails when a network call or a started process is not declared. BMAD+ has no telemetry, and the update check can be turned off.
181
+ - The acceptance page no longer loads Google Fonts or anything from another site, so opening it tells no one you did. The build refuses a page that would, and a real browser checks every request of a run. The SEO HTML report opens offline too.
182
+ - The Google API key of the SEO pack travels in a request header, never in a URL, and is hidden from error messages. OSINT provider calls refuse anything but HTTPS and never follow a redirect to another host.
183
+ - SEO screenshots reach only the address that was checked: Chromium resolves nothing else, and redirects or resources pointing elsewhere are blocked and listed.
184
+ - Shield: bmad-plus assurance builds a security case whose evidence can only be a check that actually ran, recorded in a tamper-evident ledger; bmad-plus ai-register keeps a register of the AI tools a project uses and warns about any it has not recorded; six review rules name the compliance controls a change touches.
185
+ - The MCP server closes SSE streams cleanly when a client leaves or the server stops, and accepts token dates with a time-zone offset.
186
186
 
187
187
  ## Version History
188
188
 
@@ -190,9 +190,9 @@ These dates identify reviewed CHANGELOG notes, not npm publication dates. The we
190
190
 
191
191
  | Version | Release-notes date | Reviewed summary |
192
192
  | --- | --- | --- |
193
+ | 0.22.0 | 2026-09-29 | BMAD+ now declares every way it sends data or starts a process, and its CI refuses anything undeclared. The recipe page and the SEO report load nothing from other sites, OSINT calls are HTTPS-only, and Shield gains an evidence-bound assurance case and an AI processing register. Nothing changes in how you install or update. |
193
194
  | 0.21.0 | 2026-09-28 | A review now records why it stopped and what it used, writes a check a CI step can read, and resumes on the scope it sealed. The SEO fetcher connects only to addresses it has validated, and the MCP server moves to the official SDK on Python 3.12. Nothing changes in how you install or update. |
194
195
  | 0.20.0 | 2026-09-28 | bmad-plus review now hands the reviewer the rules that apply to the changed files, fixes the depth of a review before it starts, compares a review with an earlier one without calling an unchecked finding fixed, and masks credentials in what it writes. Nothing changes in how you install or update. |
195
- | 0.19.0 | 2026-09-27 | bmad-plus review seals what a review must cover, locates every finding by the code it quotes, and derives the verdict from coverage instead of the number of findings. Review triage now keeps a finding unless a quoted ground refutes it. Nothing changes in how you install or update. |
196
196
 
197
197
  [Release history and update guide](https://bmad-plus.rochetta.fr/docs/#changelog) · [All published npm versions](https://www.npmjs.com/package/bmad-plus?activeTab=versions)
198
198
 
package/SECURITY.md CHANGED
@@ -75,5 +75,67 @@ Security researchers who report valid vulnerabilities will be credited in the CH
75
75
  - Each release retains its CycloneDX production SBOM, archive and integrity manifest as workflow artifacts; registry integrity must match the checked archive before the landing is deployed
76
76
  - Publication uses npm OIDC authentication. npm provenance is not enabled: the private build repository and distribution repository differ. An inventory or hash is not a provenance attestation
77
77
 
78
+ ## Data handling
79
+
80
+ BMAD+ has no telemetry and no silent self-update. The first table lists every flow of the
81
+ npm package that can send data off the machine; the second covers the maintainer services
82
+ deployed from this repository (the Audit 360° MCP server and the upstream monitor), which
83
+ users do not install. Both are generated from the `data_handling` doctrine in
84
+ `registry.yaml`. Before each release, CI scans every shipped and service source file and
85
+ fails when a network, listener or process site is missing from the doctrine, or when a
86
+ declared one no longer exists. "Through a started program" means BMAD+ starts a tool (npm,
87
+ uv or pip, git, Codex CLI, Chromium, a command you declared) and that tool does the sending.
88
+
89
+ <!-- data-handling:begin — generated from registry.yaml by tools/build/verify-egress.js --write -->
90
+
91
+ | Flow | Component | Leaves the machine | What | To whom | When | Consent |
92
+ |---|---|---|---|---|---|---|
93
+ | `update-check` | cli | through a started program | The package name and channel (`npm view bmad-plus@latest`) with npm's request metadata: IP address, user agent (npm, Node.js and OS versions) and npm session headers. | registry.npmjs.org (the policy accepts no other registry) | `bmad-plus update-check`, which the generated adapters ask the agent to run once per session; the answer is cached in `.bmad/update-check.json`. | **opt-out**: `bmad-plus update-policy --mode off` stops every lookup. |
94
+ | `update-apply` | cli | through a started program | The exact release requested, with npm's request metadata, to download that version's package. | registry.npmjs.org | `bmad-plus update --latest --yes`, or `--auto` when the project policy allows it. | **opt-in**: Each run needs `--yes`, or policy mode `auto` with an explicit range (`bmad-plus update-policy --mode auto --range <range>`). |
95
+ | `python-provision` | cli | through a started program | The names and versions in the pack's requirements.txt, with the installer's request metadata; uv may also download a Python build. | pypi.org and files.pythonhosted.org, or the index configured for pip or uv on the machine, github.com (python-build-standalone releases) when uv downloads Python | `bmad-plus install --provision-python` for a selected Python pack. | **opt-in**: Only with `--provision-python`; without it no environment is created. |
96
+ | `nexus-worker` | cli | through a started program | With `codex-exec`, the task's instruction and input files (at most 1 MiB) go to Codex CLI, which sends them to the model provider of the user's own Codex login. With `command`, whatever that command sends. | the model provider configured in the user's Codex CLI, whoever a declared command contacts | `bmad-plus nexus launch` on a plan with an explicit execution contract. | **invocation**: Nothing starts without a plan the user wrote and an explicit launch; shell, environment and arbitrary Codex flags are refused. |
97
+ | `nexus-verifier` | cli | through a started program | Whatever the declared command sends; it runs with a minimal allow-listed environment. | whoever the declared command contacts | `bmad-plus nexus verify` on a task of a plan the user wrote. | **invocation**: The command and its hash are fixed in the plan; a changed executable is refused. |
98
+ | `uat-page-results` | core | directly | The run: tester name, step verdicts and notes. | the origin serving the page: `bmad-plus uat serve` on 127.0.0.1, or the claude.ai artifact store when the page is published as an artifact | Each recorded verdict, when the page is served; a page opened from a file keeps results in the browser. | **invocation**: The tester chooses how the page is opened; a page opened from a file sends nothing. |
99
+ | `osint-providers` | osint | directly | The investigation query (names, handles, keywords and URLs about the subject) and that provider's API key, over verified HTTPS: the shared helper refuses any other scheme and any redirect off the provider's host. | api.apify.com, api.exa.ai, r.jina.ai, s.jina.ai, deepsearch.jina.ai, api.parallel.ai, api.perplexity.ai, api.tavily.com, the Bright Data MCP URL the user configures | When the Shadow agent, or `volley.py` fanning out to the others, runs a provider script during an investigation. | **credential**: A provider is contacted only once its key (or Bright Data MCP URL) is set; the skill's Phase −1 lawful-basis gate precedes profiling a named person. |
100
+ | `seo-site-fetch` | seo | directly | HTTP requests for the audited site's pages, robots.txt and sitemap, with the user agent the audit selects, from the user's IP address. | the site the user asks to audit (public addresses only) | `seo_fetch.py` and `seo_crawl.py`, run by the SEO agents during an audit. | **invocation**: Only the URL the user gives and its internal links are fetched; private, loopback and link-local addresses are refused. |
101
+ | `seo-google-apis` | seo | directly | The audited URL or origin, and the user's GOOGLE_API_KEY in the x-goog-api-key header, never in the request URL; redirects are not followed. | www.googleapis.com, chromeuxreport.googleapis.com, searchconsole.googleapis.com | `seo_apis.py`, run during an audit's performance phase. | **credential**: Only when GOOGLE_API_KEY is set; without it the script returns an error and sends nothing. |
102
+ | `seo-screenshot` | seo | through a started program | Chromium's requests for the audited page and the resources its own host serves, with a browser user agent, from the user's IP address. Third-party resources are blocked, not fetched. | the site the user asks to audit (public addresses only) | `seo_screenshot.py`, when an audit asks for screenshots. | **invocation**: Only the URL the user gives, with the Playwright and Chromium the user installed; non-public addresses, other hosts and redirects off the host are refused. |
103
+ | `assurance-checks` | cli | through a started program | Whatever a declared check command sends; the CLI itself sends nothing. | whoever a declared check command contacts | `bmad-plus assurance run` on a case the user wrote. | **invocation**: Only the commands listed in the user's own case file run, and only on an explicit `assurance run`; the signing key is never passed to a check. |
104
+
105
+ Stays on the machine:
106
+
107
+ - `npx-launcher` (cli): Starts the CLI in the same Node.js executable. When: Every `npx bmad-plus` run.
108
+ - `python-health` (cli): Runs a pack environment's own Python, isolated (-I), to confirm its modules import. When: `bmad-plus doctor` on a project with a provisioned Python pack.
109
+ - `review-git` (cli): Reads the local repository with git (rev-parse, merge-base, diff, ls-files, show) to build a review scope. When: `bmad-plus review` commands.
110
+ - `nexus-git` (cli): Reads the repository root and HEAD commit with `git rev-parse`. When: `bmad-plus nexus` plan and run commands.
111
+ - `uat-serve` (cli): Serves a recipe page and stores its verdicts, listening on 127.0.0.1 only and refusing any other Host header. When: `bmad-plus uat serve`.
112
+ - `uat-release-gate` (core): Runs the project's own bmad-plus CLI with the current Node.js to grade recorded acceptance runs. When: The release-gate script a project copies from the UAT skill, when the project runs it.
113
+ - `osint-install` (osint): Copies the OSINT agent and skills into a BMAD project, then runs the pack's local diagnostic script with the system Python. When: When the user runs the package's install.sh or install.ps1.
114
+
115
+ Maintainer services, deployed from this repository and not part of the npm package:
116
+
117
+ - `mcp-server` (`mcp-server/`): The Audit 360° MCP server the maintainer runs on a VPS: git, GitHub, Gamma, CI, RAG and memory tools for the maintainer's agents, behind a bearer token and a password-protected dashboard.
118
+ - `monitor` (`monitor/`): The upstream monitor the maintainer schedules on a VPS: it watches the BMAD-METHOD repository and notifies the maintainer of new changes.
119
+
120
+ | Flow | Service | Leaves the machine | What | To whom | When | Consent |
121
+ |---|---|---|---|---|---|---|
122
+ | `mcp-listener` | mcp-server | directly | Tool results (repository contents and diffs, command output, audit reports, knowledge-base passages, memory entries) and the dashboard's audit data. | MCP clients presenting the bearer token, dashboard users logged in with the dashboard password | While the service runs: HTTPS on 0.0.0.0:443 when SSL_CERT_FILE and SSL_KEY_FILE are set, plain HTTP on 127.0.0.1:8000 with BMAD_DEV=1, otherwise it refuses to start. | **credential**: Every MCP request needs MCP_AUDIT360_TOKEN and every dashboard request the dashboard password; 30 requests per minute per address. |
123
+ | `mcp-dashboard-cdn` | mcp-server | directly | The dashboard user's IP address, user agent and the dashboard origin as referrer. | cdn.jsdelivr.net | Each time the dashboard page is opened. | **invocation**: Opening the dashboard loads it. |
124
+ | `mcp-knowledge-ingest` | mcp-server | through a started program | Git clone and pull requests for the sources in knowledge/sources.json, and the model download request (model name, library version) on first use. | the Git hosts of the configured knowledge sources, huggingface.co (the embedding model named by RAG_EMBEDDING_MODEL or the default) | At server start when the knowledge base is empty, and on the admin_refresh_knowledge tool. | **invocation**: The maintainer lists the sources; chromadb runs with anonymized_telemetry=False. |
125
+ | `mcp-git-tools` | mcp-server | through a started program | Clone, pull and push traffic for the repositories a client names, with the credentials git holds on the server; pushes carry the commits made through git_commit. | the Git hosts of the repositories the client names (URLs validated before cloning) | git_* tools, audit_scan_repo and orchestrate_full_audit, when an authenticated client calls them. | **credential**: Only through an authenticated MCP call; paths are confined to the server's repository root. |
126
+ | `mcp-github-api` | mcp-server | directly | GITHUB_TOKEN with the repository names, file contents, pull-request texts and collaborator names the client passes; orchestrate_full_audit creates a private delivery repository. | api.github.com | github_* tools and orchestrate_full_audit, when an authenticated client calls them. | **credential**: Only with GITHUB_TOKEN set on the server and an authenticated MCP call. |
127
+ | `mcp-gamma` | mcp-server | directly | The report content (Markdown, title, infographic URLs, instructions) and GAMMA_API_KEY; export downloads carry no content. | public-api.gamma.app, the export host named in Gamma's answer | gamma_* tools, when an authenticated client calls them. | **credential**: Only with GAMMA_API_KEY set on the server and an authenticated MCP call. |
128
+ | `mcp-ci-tools` | mcp-server | through a started program | Whatever those programs send: dependency downloads of npm, pip, cargo or go, Semgrep's registry requests for --config=auto, Trivy's vulnerability-database download, and whatever a repository's deploy script sends. | the package registries of the repository's toolchain, semgrep.dev, Trivy's database mirrors, whoever a repository's deploy script contacts | ci_* tools, when an authenticated client calls them. | **credential**: Only through an authenticated MCP call; commands must equal an allow-listed argv, deploy scripts must lie inside the repository. |
129
+ | `monitor-upstream-git` | monitor | through a started program | Git fetch requests for the configured upstream ref, with the host's IP address. | github.com (bmad-code-org/BMAD-METHOD, or the HTTPS repository the configuration names) | Each scheduled run of weekly-check.py. | **invocation**: The maintainer installs the schedule and chooses the repository and ref. |
130
+ | `monitor-ai-analysis` | monitor | directly | Bounded excerpts of the upstream commit messages, diff statistics and diff, the previous observed version, and the configured API key. | generativelanguage.googleapis.com (Google Gemini API) | weekly-check.py --ai, when a change is observed. | **opt-in**: Only with --ai and an API key and model list in the configuration; --dry-run never calls it. |
131
+ | `monitor-notify` | monitor | directly | The observation report: upstream version and commit summaries, with the advisory analysis when one was requested. | the Evolution API instance the configuration names (loopback unless HTTPS), which relays it to the configured WhatsApp number, the SMTP server of the fallback email configuration (STARTTLS) | weekly-check.py --notify, once per newly observed upstream state. | **opt-in**: Only with --notify and a configured channel; --dry-run never notifies. |
132
+ | `monitor-mcp-bridge` | monitor | directly | Tool names and arguments (repository URLs and paths, pull-request texts) with the MCP bearer token. | the maintainer's MCP server (VPS_HOST or the configured mcp_url) | When code constructs an MCPBridge; weekly-check.py does not. | **credential**: Only with an MCP token and server address supplied by the maintainer. |
133
+
134
+ Stays on the service host:
135
+
136
+ - `mcp-memory` (mcp-server): Runs the bmad-plus CLI's `mem` command with the server's Node.js for the memory tools. When: memory_* tools, when an authenticated client calls them.
137
+
138
+ <!-- data-handling:end -->
139
+
78
140
  BMAD+ is an independent derivative of BMAD-METHOD. It is not an official release
79
141
  of BMad Code, LLC and does not imply its endorsement.
@@ -1,43 +1,87 @@
1
- """Shared HTTP utilities for OSINT scripts — stdlib only, zero dependencies."""
1
+ """Shared HTTP utilities for OSINT scripts — stdlib only, zero dependencies.
2
+
3
+ Every request goes over verified HTTPS: the providers receive API keys and
4
+ investigation queries, so a plain-text or unverified hop is never acceptable.
5
+ """
2
6
 
3
7
  import http.client
4
8
  import json
5
9
  import os
6
10
  import ssl
7
11
  import sys
8
- from urllib.parse import urlparse, urlencode, quote
12
+ from urllib.parse import urljoin, urlparse
9
13
 
14
+ MAX_REDIRECTS = 5
15
+ _REDIRECT_STATUSES = frozenset({301, 302, 303, 307, 308})
10
16
 
11
- def https_request(method, url, headers=None, body=None, timeout=120):
12
- """Make an HTTPS request and return (status, headers, body_str).
13
-
14
- Handles both http and https URLs.
17
+
18
+ class InsecureURLError(ValueError):
19
+ """A URL the helper refuses to contact (not HTTPS, credentials, no host)."""
20
+
21
+
22
+ def _check_https_url(url):
23
+ """Return ``(host, port, target)`` for an acceptable URL, or raise InsecureURLError.
24
+
25
+ Only ``https://`` with a host is accepted: no plain HTTP, no other scheme
26
+ and no implicit one. Credentials in the URL are refused, since they would
27
+ travel outside the headers the caller controls.
15
28
  """
16
29
  parsed = urlparse(url)
17
- scheme = parsed.scheme or "https"
18
- host = parsed.hostname
19
- port = parsed.port or (443 if scheme == "https" else 80)
20
- path = parsed.path or "/"
30
+ if parsed.scheme.lower() != "https":
31
+ raise InsecureURLError(f"only https:// URLs are allowed, got {parsed.scheme or '(none)'}://")
32
+ if parsed.username is not None or parsed.password is not None:
33
+ raise InsecureURLError("credentials in URL are not allowed")
34
+ if not parsed.hostname:
35
+ raise InsecureURLError("URL has no host")
36
+ try:
37
+ port = parsed.port or 443
38
+ except ValueError:
39
+ raise InsecureURLError("URL has an invalid port") from None
40
+ target = parsed.path or "/"
21
41
  if parsed.query:
22
- path += "?" + parsed.query
42
+ target += "?" + parsed.query
43
+ return parsed.hostname, port, target
23
44
 
24
- if scheme == "https":
25
- ctx = ssl.create_default_context()
26
- conn = http.client.HTTPSConnection(host, port, timeout=timeout, context=ctx)
27
- else:
28
- conn = http.client.HTTPConnection(host, port, timeout=timeout)
29
45
 
46
+ def https_request(method, url, headers=None, body=None, timeout=120):
47
+ """Make a verified HTTPS request and return (status, headers, body_str).
48
+
49
+ Refuses anything but ``https://`` with InsecureURLError, verifies the
50
+ certificate and host name against the system trust store (TLS 1.2 or
51
+ later), and follows at most MAX_REDIRECTS redirects that stay on the same
52
+ host and port: a redirect to plain HTTP, another scheme or another host is
53
+ refused rather than handing the API key and query to a recipient the
54
+ caller did not name.
55
+ """
30
56
  hdrs = {"User-Agent": "osint-skill/3.2-python"}
31
57
  if headers:
32
58
  hdrs.update(headers)
33
-
34
- conn.request(method, path, body=body, headers=hdrs)
35
- resp = conn.getresponse()
36
- data = resp.read().decode("utf-8", errors="replace")
37
- status = resp.status
38
- resp_headers = dict(resp.getheaders())
39
- conn.close()
40
- return status, resp_headers, data
59
+ context = ssl.create_default_context()
60
+ context.minimum_version = ssl.TLSVersion.TLSv1_2
61
+
62
+ host, port, target = _check_https_url(url)
63
+ for _ in range(MAX_REDIRECTS + 1):
64
+ conn = http.client.HTTPSConnection(host, port, timeout=timeout, context=context)
65
+ try:
66
+ conn.request(method, target, body=body, headers=hdrs)
67
+ resp = conn.getresponse()
68
+ data = resp.read().decode("utf-8", errors="replace")
69
+ finally:
70
+ conn.close()
71
+
72
+ location = resp.getheader("Location")
73
+ if resp.status not in _REDIRECT_STATUSES or not location:
74
+ return resp.status, dict(resp.getheaders()), data
75
+ url = urljoin(url, location)
76
+ next_host, next_port, target = _check_https_url(url)
77
+ if (next_host.lower(), next_port) != (host.lower(), port):
78
+ raise InsecureURLError(f"redirect leaves {host}:{port} for {next_host}:{next_port}")
79
+ # As browsers do: 301, 302 and 303 continue a POST as a bodiless GET;
80
+ # 307 and 308 repeat the request unchanged.
81
+ if resp.status in (301, 302, 303) and method not in ("GET", "HEAD"):
82
+ method, body = "GET", None
83
+ hdrs = {k: v for k, v in hdrs.items() if k.lower() != "content-type"}
84
+ raise InsecureURLError(f"too many redirects (max {MAX_REDIRECTS})")
41
85
 
42
86
 
43
87
  def api_post(url, payload, headers=None, timeout=120):
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "bmad-plus",
4
- "version": "0.21.0",
4
+ "version": "0.22.0",
5
5
  "description": "Project-local AI development workflows with clear roles, shared context, safe updates and coding-tool adapters",
6
6
  "homepage": "https://bmad-plus.rochetta.fr",
7
7
  "keywords": [
@@ -4,9 +4,9 @@
4
4
  <a href="../README.md">English</a> | <a href="README.fr.md">Français</a> | <a href="README.es.md">Español</a> | 🌐 <b>Deutsch</b>
5
5
  </div>
6
6
 
7
- [![Version](https://img.shields.io/badge/version-0.21.0-blue)](https://www.npmjs.com/package/bmad-plus)
7
+ [![Version](https://img.shields.io/badge/version-0.22.0-blue)](https://www.npmjs.com/package/bmad-plus)
8
8
 
9
- **Version 0.21.0** · Node.js `>=20.0.0` · MIT
9
+ **Version 0.22.0** · Node.js `>=20.0.0` · MIT
10
10
 
11
11
  Projektlokale KI-Entwicklungsworkflows mit klaren Rollen, gemeinsamem Kontext, sicheren Updates und Adaptern für Coding-Tools.
12
12
 
@@ -39,7 +39,7 @@ Starte das Installationsprogramm. Wähle die Adapter deiner KI-Werkzeuge und die
39
39
  **Im Terminal deines Projekts:**
40
40
 
41
41
  ```sh
42
- npx bmad-plus@0.21.0 install
42
+ npx bmad-plus@0.22.0 install
43
43
  ```
44
44
 
45
45
  Die Installation erstellt Agentenanweisungen, die gemeinsame Projektbasis und die gewählten Adapter. Optionale Packs können weitere Laufzeitumgebungen oder API-Zugänge benötigen.
@@ -175,18 +175,18 @@ Lies AGENTS.md und die verfügbare Projekterinnerung. Fasse den letzten geprüft
175
175
 
176
176
  Erwartetes Ergebnis: ein kurzer, belegter Wiedereinstieg. Projektnotizen liefern Kontext und müssen mit dem aktuellen Stand abgeglichen werden.
177
177
 
178
- ## Neu in 0.21.0
178
+ ## Neu in 0.22.0
179
179
 
180
- Reviews, die ehrlich anhalten, fortgesetzt werden und an die CI berichten
180
+ Was deinen Rechner verlässt, erklärt und geprüft
181
181
 
182
- Ein Review hält jetzt fest, warum es angehalten hat und was es verbraucht hat, schreibt eine Prüfung, die ein CI-Schritt lesen kann, und wird auf dem versiegelten Umfang fortgesetzt. Der SEO-Abruf verbindet sich nur mit Adressen, die er geprüft hat, und der MCP-Server wechselt zum offiziellen SDK unter Python 3.12. An Installation und Update ändert sich nichts.
182
+ BMAD+ erklärt jetzt jede Datenübertragung und jeden Prozess, den es startet, und seine CI lehnt alles Unerklärte ab. Die Abnahmeseite und der SEO-Bericht laden nichts mehr von anderen Websites, OSINT-Aufrufe laufen nur über HTTPS, und Shield erhält einen Sicherheitsnachweis aus ausgeführten Prüfungen und ein Verzeichnis der KI-Verarbeitungen. An Installation und Update ändert sich nichts.
183
183
 
184
- - coverage.json kann festhalten, wie ein Review verlief: warum es anhielt (abgeschlossen, Budget, Zeitlimit, drei Fehlversuche in Folge, unterbrochen), die ausgeführten Durchgänge und die vom Host gemeldete Nutzung. Ein vorzeitig angehaltenes Review ist immer unvollständig, und eine Einheit wird nach drei Fehlversuchen in Folge aufgegeben.
185
- - bmad-plus review gate --emit-check mit einem Dateinamen schreibt das Urteil als Prüfdokument für die CI: Ergebnis, Gründe, offene Befunde nach Schwere mit ihren Zeilen und einen Block im Format der GitHub-Check-Runs. Dieselben Belege ergeben immer dieselbe Datei.
186
- - bmad-plus review continue setzt ein unterbrochenes Review auf demselben versiegelten Umfang fort und listet, was noch aussteht. Es verweigert, wenn sich Code, Regeln oder eine ausgewählte Datei geändert haben, und verweist auf einen neuen Umfang und review compare.
187
- - Review-Regeln können einer Gruppe angehören (code, data, delivery oder eine eigene), damit parallele Prüfende eine Einheit nach Regelfamilie aufteilen.
188
- - Für Maintainer bewertet ein Review-Prüfstand aufgezeichnete Review-Antworten gegen eingebaute Fehler und Köder mit einer veröffentlichten Zuordnungsregel, und kopierfertige CI-Vorlagen lassen einen Pull Request von einem Host-Agenten auf einem selbst gehosteten Runner prüfen, ohne etwas zu vertrauen, das der Agent umschreiben kann.
189
- - SEO-Abruf und Crawler lösen jeden Host selbst auf, lehnen interne Adressen ab und verbinden sich genau mit der geprüften Adresse, auch bei jeder Weiterleitung, was DNS-Rebinding verhindert. Der MCP-Server nutzt das offizielle SDK unter Python 3.12 mit aktuellem chromadb und sentence-transformers; führe ingest.py nach dem Update einmal erneut aus.
184
+ - Die Registry gibt an, was BMAD+ sendet, an wen, wann und mit welcher Einwilligung; SECURITY.md zeigt es, und die installierten Agentenanweisungen fassen es zusammen. Eine Build-Prüfung schlägt fehl, wenn ein Netzwerkaufruf oder ein gestarteter Prozess nicht erklärt ist. BMAD+ hat keine Telemetrie, und die Update-Prüfung lässt sich abschalten.
185
+ - Die Abnahmeseite lädt weder Google Fonts noch sonst etwas von einer anderen Website: Wer sie öffnet, verrät das niemandem. Der Build lehnt eine Seite ab, die es täte, und ein echter Browser prüft jede Anfrage eines Durchlaufs. Auch der HTML-SEO-Bericht öffnet sich offline.
186
+ - Der Google-API-Schlüssel des SEO-Packs wird in einem Anfrage-Header übertragen, nie in einer URL, und erscheint in keiner Fehlermeldung. OSINT-Anbieteraufrufe lehnen alles außer HTTPS ab und folgen nie einer Weiterleitung zu einem anderen Host.
187
+ - SEO-Screenshots erreichen nur die geprüfte Adresse: Chromium löst nichts anderes auf, und Weiterleitungen oder Ressourcen, die woanders hinzeigen, werden blockiert und aufgelistet.
188
+ - Shield: bmad-plus assurance erstellt einen Sicherheitsnachweis, dessen Belege nur tatsächlich ausgeführte Prüfungen sein können, festgehalten in einem manipulationssicheren Protokoll; bmad-plus ai-register führt das Verzeichnis der KI-Werkzeuge eines Projekts und warnt vor nicht erfassten; sechs Review-Regeln nennen die Compliance-Kontrollen, die eine Änderung berührt.
189
+ - Der MCP-Server schließt SSE-Streams sauber, wenn ein Client geht oder der Server stoppt, und akzeptiert Token-Daten mit Zeitzonenversatz.
190
190
 
191
191
  ## Versionsverlauf
192
192
 
@@ -194,9 +194,9 @@ Diese Daten bezeichnen geprüfte CHANGELOG-Einträge, nicht die Veröffentlichun
194
194
 
195
195
  | Version | Datum der Notizen | Geprüfte Zusammenfassung |
196
196
  | --- | --- | --- |
197
+ | 0.22.0 | 2026-09-29 | BMAD+ erklärt jetzt jede Datenübertragung und jeden Prozess, den es startet, und seine CI lehnt alles Unerklärte ab. Die Abnahmeseite und der SEO-Bericht laden nichts mehr von anderen Websites, OSINT-Aufrufe laufen nur über HTTPS, und Shield erhält einen Sicherheitsnachweis aus ausgeführten Prüfungen und ein Verzeichnis der KI-Verarbeitungen. An Installation und Update ändert sich nichts. |
197
198
  | 0.21.0 | 2026-09-28 | Ein Review hält jetzt fest, warum es angehalten hat und was es verbraucht hat, schreibt eine Prüfung, die ein CI-Schritt lesen kann, und wird auf dem versiegelten Umfang fortgesetzt. Der SEO-Abruf verbindet sich nur mit Adressen, die er geprüft hat, und der MCP-Server wechselt zum offiziellen SDK unter Python 3.12. An Installation und Update ändert sich nichts. |
198
199
  | 0.20.0 | 2026-09-28 | bmad-plus review gibt der prüfenden Person jetzt die Regeln, die für die geänderten Dateien gelten, legt die Tiefe eines Reviews vor Beginn fest, vergleicht ein Review mit einem früheren, ohne einen ungeprüften Befund für behoben zu erklären, und schwärzt Zugangsdaten in dem, was es schreibt. An Installation und Update ändert sich nichts. |
199
- | 0.19.0 | 2026-09-27 | bmad-plus review versiegelt, was ein Review abdecken muss, findet jeden Befund über den Code, den er zitiert, und leitet das Urteil aus der Abdeckung ab statt aus der Zahl der Befunde. Die Review-Sichtung behält einen Befund jetzt, solange kein zitierter Grund ihn widerlegt. An Installation und Update ändert sich nichts. |
200
200
 
201
201
  [Versionsverlauf und Update-Anleitung](https://bmad-plus.rochetta.fr/de/docs/#changelog) · [Alle veröffentlichten Versionen auf npm](https://www.npmjs.com/package/bmad-plus?activeTab=versions)
202
202
 
@@ -4,9 +4,9 @@
4
4
  <a href="../README.md">English</a> | <a href="README.fr.md">Français</a> | 🌐 <b>Español</b> | <a href="README.de.md">Deutsch</a>
5
5
  </div>
6
6
 
7
- [![Version](https://img.shields.io/badge/version-0.21.0-blue)](https://www.npmjs.com/package/bmad-plus)
7
+ [![Version](https://img.shields.io/badge/version-0.22.0-blue)](https://www.npmjs.com/package/bmad-plus)
8
8
 
9
- **Versión 0.21.0** · Node.js `>=20.0.0` · MIT
9
+ **Versión 0.22.0** · Node.js `>=20.0.0` · MIT
10
10
 
11
11
  Flujos de desarrollo con IA propios de cada proyecto, con roles claros, contexto compartido, actualizaciones seguras y adaptadores para herramientas de programación.
12
12
 
@@ -39,7 +39,7 @@ Ejecuta el instalador. Selecciona los adaptadores de tus herramientas de IA y lo
39
39
  **En la terminal del proyecto:**
40
40
 
41
41
  ```sh
42
- npx bmad-plus@0.21.0 install
42
+ npx bmad-plus@0.22.0 install
43
43
  ```
44
44
 
45
45
  El instalador crea las instrucciones de los agentes, la base compartida y los adaptadores seleccionados. Algunos packs opcionales necesitan otros entornos o acceso a API.
@@ -175,18 +175,18 @@ Lee AGENTS.md y la memoria de proyecto disponible. Resume el último estado veri
175
175
 
176
176
  Resultado esperado: una reanudación breve y fundamentada. Las notas aportan contexto que debe contrastarse con el trabajo actual.
177
177
 
178
- ## Novedades de la 0.21.0
178
+ ## Novedades de la 0.22.0
179
179
 
180
- Revisiones que se detienen con honestidad, se reanudan e informan a la CI
180
+ Lo que sale de tu máquina, declarado y comprobado
181
181
 
182
- Una revisión registra ahora por qué se detuvo y qué consumió, escribe un control que un paso de CI puede leer y se reanuda sobre el alcance que selló. El descargador SEO solo se conecta a direcciones que ha validado, y el servidor MCP pasa al SDK oficial con Python 3.12. Nada cambia en la instalación ni en la actualización.
182
+ BMAD+ declara ahora cada envío de datos y cada proceso que inicia, y su CI rechaza todo lo que no esté declarado. La página de aceptación y el informe SEO ya no cargan nada de otros sitios, las llamadas OSINT van solo por HTTPS, y Shield incorpora un caso de seguridad basado en pruebas ejecutadas y un registro de tratamientos de IA. Nada cambia en la instalación ni en la actualización.
183
183
 
184
- - coverage.json puede registrar cómo transcurrió una revisión: por qué se detuvo (completada, presupuesto, límite de tiempo, tres intentos fallidos seguidos, interrumpida), las pasadas realizadas y el uso que informó el host. Una revisión detenida antes de tiempo siempre está incompleta, y una unidad se abandona tras tres intentos fallidos consecutivos.
185
- - bmad-plus review gate --emit-check seguido de un nombre de archivo escribe el veredicto como un documento de control para la CI: disposición, motivos, hallazgos abiertos por gravedad con sus líneas y un bloque con el formato de los check runs de GitHub. Las mismas pruebas dan siempre el mismo archivo.
186
- - bmad-plus review continue reanuda una revisión interrumpida sobre el mismo alcance sellado y enumera lo que queda pendiente. Se niega cuando cambiaron el código, las reglas o un archivo seleccionado, y remite a un nuevo alcance y a review compare.
187
- - Las reglas de revisión pueden pertenecer a un grupo (code, data, delivery o uno propio), para que revisores en paralelo se repartan una unidad por familia de reglas.
188
- - Para mantenedores, un banco de pruebas puntúa respuestas de revisión grabadas frente a defectos sembrados y señuelos con una regla de correspondencia publicada, y recetas de CI listas para copiar hacen pasar una pull request por un agente en un runner autoalojado sin fiarse de nada que el agente pueda reescribir.
189
- - El descargador y el rastreador SEO resuelven cada host por sí mismos, rechazan direcciones internas y se conectan exactamente a la dirección validada, también en cada redirección, lo que neutraliza el DNS rebinding. El servidor MCP usa el SDK oficial con Python 3.12 y chromadb y sentence-transformers actuales; vuelve a ejecutar ingest.py una vez tras actualizar.
184
+ - El registro indica qué envía BMAD+, a quién, cuándo y con qué consentimiento; SECURITY.md lo muestra y las instrucciones instaladas para los agentes lo resumen. Una comprobación de build falla cuando una llamada de red o un proceso iniciado no está declarado. BMAD+ no tiene telemetría, y la comprobación de actualizaciones se puede desactivar.
185
+ - La página de aceptación ya no carga Google Fonts ni nada de otro sitio: abrirla no se lo comunica a nadie. El build rechaza una página que lo hiciera, y un navegador real controla cada petición de una ejecución. El informe HTML de SEO también se abre sin conexión.
186
+ - La clave de API de Google del pack SEO viaja en una cabecera de la petición, nunca en una URL, y no aparece en los mensajes de error. Las llamadas a proveedores OSINT rechazan todo lo que no sea HTTPS y nunca siguen una redirección a otro host.
187
+ - Las capturas de pantalla SEO solo alcanzan la dirección comprobada: Chromium no resuelve nada más, y las redirecciones o recursos que apuntan a otro lugar se bloquean y se enumeran.
188
+ - Shield: bmad-plus assurance construye un caso de seguridad cuyas pruebas solo pueden ser comprobaciones realmente ejecutadas, anotadas en un registro a prueba de manipulaciones; bmad-plus ai-register mantiene el registro de herramientas de IA de un proyecto y avisa de las que no figuran; seis reglas de revisión nombran los controles de cumplimiento que toca un cambio.
189
+ - El servidor MCP cierra limpiamente los flujos SSE cuando un cliente se va o el servidor se detiene, y acepta fechas de token con desfase horario.
190
190
 
191
191
  ## Historial de versiones
192
192
 
@@ -194,9 +194,9 @@ Estas fechas identifican las notas revisadas del CHANGELOG, no las fechas de pub
194
194
 
195
195
  | Versión | Fecha de las notas | Resumen revisado |
196
196
  | --- | --- | --- |
197
+ | 0.22.0 | 2026-09-29 | BMAD+ declara ahora cada envío de datos y cada proceso que inicia, y su CI rechaza todo lo que no esté declarado. La página de aceptación y el informe SEO ya no cargan nada de otros sitios, las llamadas OSINT van solo por HTTPS, y Shield incorpora un caso de seguridad basado en pruebas ejecutadas y un registro de tratamientos de IA. Nada cambia en la instalación ni en la actualización. |
197
198
  | 0.21.0 | 2026-09-28 | Una revisión registra ahora por qué se detuvo y qué consumió, escribe un control que un paso de CI puede leer y se reanuda sobre el alcance que selló. El descargador SEO solo se conecta a direcciones que ha validado, y el servidor MCP pasa al SDK oficial con Python 3.12. Nada cambia en la instalación ni en la actualización. |
198
199
  | 0.20.0 | 2026-09-28 | bmad-plus review ahora entrega a quien revisa las reglas que se aplican a los archivos modificados, fija la profundidad de una revisión antes de empezar, compara una revisión con otra anterior sin dar por corregido un hallazgo no comprobado y oculta las credenciales en lo que escribe. Nada cambia en la instalación ni en la actualización. |
199
- | 0.19.0 | 2026-09-27 | bmad-plus review sella lo que una revisión debe cubrir, localiza cada hallazgo por el código que cita y deduce el veredicto de la cobertura en lugar del número de hallazgos. La clasificación de las revisiones conserva ahora un hallazgo mientras ningún motivo citado lo refute. Nada cambia en la instalación ni en la actualización. |
200
200
 
201
201
  [Historial de versiones y guía de actualización](https://bmad-plus.rochetta.fr/es/docs/#changelog) · [Todas las versiones publicadas en npm](https://www.npmjs.com/package/bmad-plus?activeTab=versions)
202
202
 
@@ -4,9 +4,9 @@
4
4
  <a href="../README.md">English</a> | 🌐 <b>Français</b> | <a href="README.es.md">Español</a> | <a href="README.de.md">Deutsch</a>
5
5
  </div>
6
6
 
7
- [![Version](https://img.shields.io/badge/version-0.21.0-blue)](https://www.npmjs.com/package/bmad-plus)
7
+ [![Version](https://img.shields.io/badge/version-0.22.0-blue)](https://www.npmjs.com/package/bmad-plus)
8
8
 
9
- **Version 0.21.0** · Node.js `>=20.0.0` · MIT
9
+ **Version 0.22.0** · Node.js `>=20.0.0` · MIT
10
10
 
11
11
  Des workflows de développement IA propres à chaque projet, avec des rôles clairs, un contexte partagé, des mises à jour sûres et des adaptateurs pour vos outils de code.
12
12
 
@@ -39,7 +39,7 @@ Lancez l’installateur. Sélectionnez les adaptateurs de vos outils IA et les p
39
39
  **Dans le terminal du projet :**
40
40
 
41
41
  ```sh
42
- npx bmad-plus@0.21.0 install
42
+ npx bmad-plus@0.22.0 install
43
43
  ```
44
44
 
45
45
  L’installateur crée les instructions des agents, le socle partagé et les adaptateurs sélectionnés. Certains packs facultatifs nécessitent d’autres environnements ou des accès API.
@@ -175,18 +175,18 @@ Lis AGENTS.md et la mémoire de projet disponible. Résume le dernier état vér
175
175
 
176
176
  Résultat attendu : une reprise courte et fondée sur des éléments vérifiés. Les notes apportent du contexte, à confronter au travail actuel.
177
177
 
178
- ## Nouveautés de la 0.21.0
178
+ ## Nouveautés de la 0.22.0
179
179
 
180
- Des revues qui s’arrêtent honnêtement, reprennent et parlent à la CI
180
+ Ce qui sort de votre machine, déclaré et vérifié
181
181
 
182
- Une revue enregistre désormais pourquoi elle s’est arrêtée et ce qu’elle a consommé, écrit un contrôle lisible par une étape de CI, et reprend sur le périmètre qu’elle a scellé. Le récupérateur SEO ne se connecte qu’aux adresses qu’il a validées, et le serveur MCP passe au SDK officiel sous Python 3.12. Rien ne change dans l’installation ou la mise à jour.
182
+ BMAD+ déclare désormais chaque envoi de données et chaque processus qu’il lance, et sa CI refuse tout ce qui n’est pas déclaré. La page de recette et le rapport SEO ne chargent plus rien depuis d’autres sites, les appels OSINT passent uniquement en HTTPS, et Shield gagne un dossier de sécurité fondé sur des preuves exécutées et un registre des traitements IA. Rien ne change dans l’installation ou la mise à jour.
183
183
 
184
- - coverage.json peut enregistrer le déroulé d’une revue : pourquoi elle s’est arrêtée (terminée, budget, limite de temps, trois échecs de suite, interrompue), les passes faites et l’usage rapporté par l’hôte. Une revue arrêtée avant la fin est toujours incomplète, et une unité est abandonnée après trois échecs consécutifs.
185
- - bmad-plus review gate --emit-check suivi d’un nom de fichier écrit le verdict sous forme de contrôle pour la CI : disposition, raisons, remarques ouvertes par gravité avec leurs lignes, et un bloc au format des check runs GitHub. Les mêmes preuves donnent toujours le même fichier.
186
- - bmad-plus review continue reprend une revue interrompue sur le même périmètre scellé et liste ce qui reste dû. Il refuse quand le code, les règles ou un fichier retenu ont changé, et renvoie vers un nouveau périmètre et review compare.
187
- - Les règles de revue peuvent appartenir à un groupe (code, data, delivery ou le vôtre), pour que des relecteurs parallèles se partagent une unité par famille de règles.
188
- - Pour les mainteneurs, un banc d’essai note des réponses de revue enregistrées face à des défauts plantés et des leurres, avec une règle de correspondance publiée, et des modèles de CI prêts à copier font passer une pull request par un agent hôte sur un runner auto-hébergé sans rien croire de ce que l’agent peut réécrire.
189
- - Le récupérateur et le crawler SEO résolvent eux-mêmes chaque hôte, refusent les adresses internes et se connectent exactement à l’adresse validée, redirections comprises, ce qui neutralise le DNS rebinding. Le serveur MCP utilise le SDK officiel sous Python 3.12 avec chromadb et sentence-transformers à jour ; relancez ingest.py une fois après la mise à jour.
184
+ - Le registre indique ce que BMAD+ envoie, à qui, quand et avec quel consentement ; SECURITY.md l’affiche et les instructions installées pour les agents le résument. Une vérification de build échoue quand un appel réseau ou un processus lancé n’est pas déclaré. BMAD+ n’a aucune télémétrie, et la vérification de mise à jour peut être désactivée.
185
+ - La page de recette ne charge plus Google Fonts ni rien d’un autre site : l’ouvrir ne le signale à personne. Le build refuse une page qui le ferait, et un vrai navigateur contrôle chaque requête d’un passage. Le rapport HTML SEO s’ouvre aussi hors ligne.
186
+ - La clé d’API Google du pack SEO voyage dans un en-tête de requête, jamais dans une URL, et n’apparaît pas dans les messages d’erreur. Les appels aux fournisseurs OSINT refusent tout sauf HTTPS et ne suivent jamais une redirection vers un autre hôte.
187
+ - Les captures d’écran SEO n’atteignent que l’adresse vérifiée : Chromium ne résout rien d’autre, et les redirections ou ressources qui pointent ailleurs sont bloquées et listées.
188
+ - Shield : bmad-plus assurance construit un dossier de sécurité dont chaque preuve est une vérification réellement exécutée, consignée dans un journal infalsifiable ; bmad-plus ai-register tient le registre des outils IA d’un projet et signale ceux qui n’y figurent pas ; six règles de revue nomment les contrôles de conformité qu’un changement touche.
189
+ - Le serveur MCP ferme proprement les flux SSE quand un client part ou que le serveur s’arrête, et accepte les dates de jeton avec un décalage horaire.
190
190
 
191
191
  ## Historique des versions
192
192
 
@@ -194,9 +194,9 @@ Ces dates identifient les notes relues du CHANGELOG, pas les dates de publicatio
194
194
 
195
195
  | Version | Date des notes | Résumé relu |
196
196
  | --- | --- | --- |
197
+ | 0.22.0 | 2026-09-29 | BMAD+ déclare désormais chaque envoi de données et chaque processus qu’il lance, et sa CI refuse tout ce qui n’est pas déclaré. La page de recette et le rapport SEO ne chargent plus rien depuis d’autres sites, les appels OSINT passent uniquement en HTTPS, et Shield gagne un dossier de sécurité fondé sur des preuves exécutées et un registre des traitements IA. Rien ne change dans l’installation ou la mise à jour. |
197
198
  | 0.21.0 | 2026-09-28 | Une revue enregistre désormais pourquoi elle s’est arrêtée et ce qu’elle a consommé, écrit un contrôle lisible par une étape de CI, et reprend sur le périmètre qu’elle a scellé. Le récupérateur SEO ne se connecte qu’aux adresses qu’il a validées, et le serveur MCP passe au SDK officiel sous Python 3.12. Rien ne change dans l’installation ou la mise à jour. |
198
199
  | 0.20.0 | 2026-09-28 | bmad-plus review donne désormais au relecteur les règles qui s’appliquent aux fichiers modifiés, fixe la profondeur d’une revue avant qu’elle commence, compare une revue avec une précédente sans déclarer corrigée une remarque non vérifiée, et masque les identifiants dans ce qu’il écrit. Rien ne change dans l’installation ou la mise à jour. |
199
- | 0.19.0 | 2026-09-27 | bmad-plus review scelle ce qu’une revue doit couvrir, retrouve chaque remarque par le code qu’elle cite, et déduit le verdict de la couverture plutôt que du nombre de remarques. Le tri des revues garde désormais une remarque tant qu’un motif cité ne la réfute pas. Rien ne change dans l’installation ou la mise à jour. |
200
200
 
201
201
  [Historique des versions et guide de mise à jour](https://bmad-plus.rochetta.fr/fr/docs/#changelog) · [Toutes les versions publiées sur npm](https://www.npmjs.com/package/bmad-plus?activeTab=versions)
202
202
 
@@ -75,7 +75,9 @@ arbitrary branch. Read the intended behavior and applicable project constraints.
75
75
  when a selected file is unaccounted for or a finding is not anchored, `findings`
76
76
  or `clean` otherwise. `clean` covers the reviewed scope only. A finding that
77
77
  applies a checklist rule names it in `rule`; the CLI refuses a rule that does
78
- not apply to that path. The anchored record replaces credential-like values
78
+ not apply to that path. A finding that breaks a compliance control lists it in
79
+ `controls`, chosen among the controls `scope.json` records for that file; the
80
+ CLI refuses any other and carries them into the check result. The anchored record replaces credential-like values
79
81
  quoted in a finding with `[REDACTED]` and counts them. Record the session in
80
82
  `coverage.json` under `run`: `stop` (`completed`, `budget`, `time-limit`,
81
83
  `failure-streak` or `interrupted`, with a `detail` unless completed), the
@@ -100,7 +100,9 @@ Run Scout and Judge **simultaneously** on each discovered page:
100
100
  **Optional**: Run `scripts/seo_apis.py --all <url>` for live PageSpeed + CrUX data.
101
101
 
102
102
  Use `scripts/seo_parse.py <file> --url <url> --json` on fetched HTML.
103
- Use `scripts/seo_screenshot.py <url> --viewport mobile` for visual audit.
103
+ Use `scripts/seo_screenshot.py <url> --viewport mobile` for visual audit. The browser only
104
+ reaches the audited host: third-party resources are blocked and listed in `blocked_requests`,
105
+ so judge a missing CDN image or font as an effect of the capture, not of the site.
104
106
 
105
107
  ### Phase 3 — AI Readiness & GEO
106
108
  **Agent**: Judge (GEO Analyst role)
@@ -73,8 +73,8 @@
73
73
 
74
74
  ## API Tools
75
75
  ```bash
76
- # PageSpeed Insights API
77
- curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=URL&key=API_KEY"
76
+ # PageSpeed Insights API: the key goes in a header, never in the URL (or use scripts/seo_apis.py)
77
+ curl -H "x-goog-api-key: $GOOGLE_API_KEY" "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=URL"
78
78
 
79
79
  # Lighthouse CLI
80
80
  npx lighthouse URL --output json --output-path report.json
@@ -14,4 +14,4 @@ lxml==6.1.1
14
14
 
15
15
  # Screenshot capture (optional — only for seo_screenshot.py)
16
16
  # Uncomment and run: playwright install chromium
17
- # playwright>=1.40.0
17
+ # playwright>=1.48.0 # route_web_socket guards WebSockets