ma-agents 3.13.2 → 3.14.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 (70) hide show
  1. package/lib/agents.js +7 -0
  2. package/lib/bmad-cache/bmb/.claude-plugin/marketplace.json +3 -3
  3. package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
  4. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-b388526edf307cf56f8e65673466cff074105abf.idx +0 -0
  5. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/{pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.pack → pack-b388526edf307cf56f8e65673466cff074105abf.pack} +0 -0
  6. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-b388526edf307cf56f8e65673466cff074105abf.rev +0 -0
  7. package/lib/bmad-cache/bmb/_git_preserved/packed-refs +1 -1
  8. package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -1
  9. package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -1
  10. package/lib/bmad-cache/bmb/package-lock.json +2 -2
  11. package/lib/bmad-cache/bmb/package.json +1 -1
  12. package/lib/bmad-cache/bmb/samples/bmad-agent-code-coach/scripts/wake.py +78 -0
  13. package/lib/bmad-cache/bmb/samples/bmad-agent-creative-muse/scripts/wake.py +78 -0
  14. package/lib/bmad-cache/bmb/samples/bmad-agent-sentinel/scripts/wake.py +78 -0
  15. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/customize-template.toml +3 -0
  16. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/init-sanctum-template.py +11 -5
  17. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/report-shell.html +1073 -0
  18. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/wake-template.py +78 -0
  19. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/customize.toml +48 -0
  20. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/count_tokens.py +78 -0
  21. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass.py +258 -0
  22. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/process-template.py +20 -0
  23. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/render_report.py +387 -0
  24. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/assets/adapter-claude-code.json +9 -0
  25. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/aggregate_benchmark.py +236 -0
  26. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/memlog.py +197 -0
  27. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_evals.py +513 -390
  28. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_triggers.py +347 -251
  29. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/tests/test_env_isolation.py +79 -0
  30. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/tests/test_trigger_detection.py +123 -0
  31. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-validate-module.py +82 -4
  32. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/validate-module.py +55 -11
  33. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/customize-template.toml +3 -5
  34. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/report-shell.html +860 -0
  35. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/customize.toml +59 -0
  36. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/count_tokens.py +77 -0
  37. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/init_skill.py +132 -0
  38. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +186 -221
  39. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/quick_validate.py +117 -0
  40. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/render_report.py +387 -0
  41. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_canon_sync.py +46 -0
  42. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_count_tokens.py +180 -0
  43. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_render_report.py +171 -0
  44. package/lib/bmad-cache/cache-manifest.json +4 -4
  45. package/lib/bmad-extension/.claude-plugin/marketplace.json.template +1 -1
  46. package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +2 -2
  47. package/lib/bmad.js +6 -1
  48. package/lib/templates/instruction-block-git.template.md +25 -25
  49. package/lib/templates/instruction-block-onprem.template.md +86 -86
  50. package/lib/templates/instruction-block-universal.template.md +29 -29
  51. package/package.json +3 -3
  52. package/lib/.bmad-extension-plugin.build-22612-1782454014750/.claude-plugin/marketplace.json +0 -109
  53. package/lib/.bmad-extension-plugin.build-22612-1782454014750/skills/module-help.csv +0 -62
  54. package/lib/.bmad-extension-plugin.build-22612-1782454014750/skills/module.yaml +0 -20
  55. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.idx +0 -0
  56. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.rev +0 -0
  57. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/references/sample-init-sanctum.py +0 -274
  58. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/generate-html-report.py +0 -534
  59. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-execution-deps.py +0 -337
  60. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-prompt-metrics.py +0 -425
  61. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-sanctum-architecture.py +0 -385
  62. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-structure-capabilities.py +0 -482
  63. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/assets/Dockerfile +0 -29
  64. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/docker_setup.py +0 -115
  65. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/generate_report.py +0 -184
  66. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/pty_runner.py +0 -171
  67. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/utils.py +0 -260
  68. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/extract-report-json.py +0 -287
  69. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-html-report.py +0 -588
  70. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-execution-deps.py +0 -288
package/lib/agents.js CHANGED
@@ -340,6 +340,13 @@ const agents = [
340
340
  instructionFiles: ['_bmad/bmm/agents/demerzel.md'],
341
341
  injectionStrategy: { position: 'top', skipPatterns: ['---'] }
342
342
  }
343
+ // DEFERRED (Story 28.3 / Decision P5-6(d), FR214): BMAD v6.9.0 adds two new
344
+ // installer platform targets — `hermes` (Hermes Agent) and `codewhale`
345
+ // (CodeWhale). They are intentionally NOT added to this registry. Passthrough
346
+ // already deploys upstream support via the BMAD installer; first-class adoption
347
+ // would pull the full per-tool routing / instruction-injection / skill-
348
+ // resolution stack into ma-agents for two platforms with no current demand.
349
+ // Add them here in a dedicated future story if/when demand appears.
343
350
  ];
344
351
 
345
352
  function getAgent(agentId) {
@@ -12,7 +12,7 @@
12
12
  "name": "bmad-builder",
13
13
  "source": "./",
14
14
  "description": "Build AI agents, workflows, and modules from a conversation. Four skills — Agent Builder, Workflow Builder, Module Builder, and Setup — guide you from idea to production-ready skill structure with built-in quality optimization. Part of the BMad Method ecosystem.",
15
- "version": "1.8.0",
15
+ "version": "2.1.0",
16
16
  "author": {
17
17
  "name": "Brian (BMad) Madison"
18
18
  },
@@ -22,7 +22,7 @@
22
22
  "name": "sample-plugins",
23
23
  "source": "./",
24
24
  "description": "Sample plugins demonstrating how to build BMad agents and skills. Includes a code coach, creative muse, diagram reviewer, dream weaver, sentinel, and excalidraw generator.",
25
- "version": "1.1.0",
25
+ "version": "2.1.0",
26
26
  "author": {
27
27
  "name": "Brian (BMad) Madison"
28
28
  },
@@ -40,7 +40,7 @@
40
40
  "name": "bmad-dream-weaver-agent",
41
41
  "source": "./",
42
42
  "description": "Dream journaling and interpretation agent with lucid dreaming coaching, pattern discovery, symbol analysis, and recall training.",
43
- "version": "1.0.0",
43
+ "version": "2.1.0",
44
44
  "author": {
45
45
  "name": "Brian (BMad) Madison"
46
46
  },
@@ -1,2 +1,2 @@
1
1
  # pack-refs with: peeled fully-peeled sorted
2
- 7cfa7711778f04c5df56f7ae895fabc942fd920c refs/remotes/origin/main
2
+ e6935f2776c34ffd9b18f4ef1e334584ef10a50f refs/remotes/origin/main
@@ -1 +1 @@
1
- 7cfa7711778f04c5df56f7ae895fabc942fd920c
1
+ e6935f2776c34ffd9b18f4ef1e334584ef10a50f
@@ -1 +1 @@
1
- 7cfa7711778f04c5df56f7ae895fabc942fd920c
1
+ e6935f2776c34ffd9b18f4ef1e334584ef10a50f
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "bmad-builder",
3
- "version": "1.8.1",
3
+ "version": "2.1.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "bmad-builder",
9
- "version": "1.8.1",
9
+ "version": "2.1.0",
10
10
  "license": "MIT",
11
11
  "devDependencies": {
12
12
  "@astrojs/sitemap": "^3.6.0",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "bmad-builder",
4
- "version": "1.8.1",
4
+ "version": "2.1.0",
5
5
  "private": true,
6
6
  "description": "A BMad Core expansion module that guides users through the creation of Modules Workflow and Agents",
7
7
  "keywords": [
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env python3
2
+ # /// script
3
+ # requires-python = ">=3.10"
4
+ # ///
5
+ """
6
+ Waking — load the agent's sanctum in one pass, or route to First Breath.
7
+
8
+ Run on activation. Determines the mode from the filesystem (and the --pulse
9
+ flag) and, when the sanctum exists, prints the full identity in a single read
10
+ (INDEX, PERSONA, CREED, BOND, MEMORY, CAPABILITIES) so the agent becomes itself
11
+ in one shot instead of six. In --pulse mode it also appends PULSE.md. When no
12
+ sanctum exists, it prints a directive to run First Breath.
13
+
14
+ This loads runtime memory only. It never reads or writes config or customize.toml.
15
+
16
+ Usage:
17
+ python3 wake.py <project-root> [--pulse]
18
+
19
+ project-root: The root of the project (where _bmad/ lives)
20
+ """
21
+
22
+ import sys
23
+ from pathlib import Path
24
+
25
+ SKILL_NAME = "bmad-agent-code-coach"
26
+
27
+ # Load order — the "become yourself" set.
28
+ IDENTITY_FILES = [
29
+ "INDEX.md",
30
+ "PERSONA.md",
31
+ "CREED.md",
32
+ "BOND.md",
33
+ "MEMORY.md",
34
+ "CAPABILITIES.md",
35
+ ]
36
+
37
+
38
+ def emit(path: Path) -> None:
39
+ print(f"\n===== {path.name} =====")
40
+ try:
41
+ print(path.read_text(encoding="utf-8").rstrip())
42
+ except FileNotFoundError:
43
+ print(f"(missing: {path.name})")
44
+
45
+
46
+ def main() -> int:
47
+ args = sys.argv[1:]
48
+ pulse = "--pulse" in args
49
+ positional = [a for a in args if not a.startswith("--")]
50
+ if not positional:
51
+ print("Usage: wake.py <project-root> [--pulse]", file=sys.stderr)
52
+ return 2
53
+
54
+ project_root = Path(positional[0]).resolve()
55
+ sanctum = project_root / "_bmad" / "memory" / SKILL_NAME
56
+
57
+ core_ok = (
58
+ sanctum.is_dir()
59
+ and (sanctum / "CREED.md").is_file()
60
+ and (sanctum / "MEMORY.md").is_file()
61
+ )
62
+ if not core_ok:
63
+ print("MODE: FIRST_BREATH")
64
+ print(f"NO SANCTUM at {sanctum}")
65
+ print("This is your one birth. Load references/first-breath.md and follow it.")
66
+ return 0
67
+
68
+ print("MODE: PULSE" if pulse else "MODE: WAKING")
69
+ print(f"Sanctum: {sanctum}")
70
+ for name in IDENTITY_FILES:
71
+ emit(sanctum / name)
72
+ if pulse:
73
+ emit(sanctum / "PULSE.md")
74
+ return 0
75
+
76
+
77
+ if __name__ == "__main__":
78
+ raise SystemExit(main())
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env python3
2
+ # /// script
3
+ # requires-python = ">=3.10"
4
+ # ///
5
+ """
6
+ Waking — load the agent's sanctum in one pass, or route to First Breath.
7
+
8
+ Run on activation. Determines the mode from the filesystem (and the --pulse
9
+ flag) and, when the sanctum exists, prints the full identity in a single read
10
+ (INDEX, PERSONA, CREED, BOND, MEMORY, CAPABILITIES) so the agent becomes itself
11
+ in one shot instead of six. In --pulse mode it also appends PULSE.md. When no
12
+ sanctum exists, it prints a directive to run First Breath.
13
+
14
+ This loads runtime memory only. It never reads or writes config or customize.toml.
15
+
16
+ Usage:
17
+ python3 wake.py <project-root> [--pulse]
18
+
19
+ project-root: The root of the project (where _bmad/ lives)
20
+ """
21
+
22
+ import sys
23
+ from pathlib import Path
24
+
25
+ SKILL_NAME = "bmad-agent-creative-muse"
26
+
27
+ # Load order — the "become yourself" set.
28
+ IDENTITY_FILES = [
29
+ "INDEX.md",
30
+ "PERSONA.md",
31
+ "CREED.md",
32
+ "BOND.md",
33
+ "MEMORY.md",
34
+ "CAPABILITIES.md",
35
+ ]
36
+
37
+
38
+ def emit(path: Path) -> None:
39
+ print(f"\n===== {path.name} =====")
40
+ try:
41
+ print(path.read_text(encoding="utf-8").rstrip())
42
+ except FileNotFoundError:
43
+ print(f"(missing: {path.name})")
44
+
45
+
46
+ def main() -> int:
47
+ args = sys.argv[1:]
48
+ pulse = "--pulse" in args
49
+ positional = [a for a in args if not a.startswith("--")]
50
+ if not positional:
51
+ print("Usage: wake.py <project-root> [--pulse]", file=sys.stderr)
52
+ return 2
53
+
54
+ project_root = Path(positional[0]).resolve()
55
+ sanctum = project_root / "_bmad" / "memory" / SKILL_NAME
56
+
57
+ core_ok = (
58
+ sanctum.is_dir()
59
+ and (sanctum / "CREED.md").is_file()
60
+ and (sanctum / "MEMORY.md").is_file()
61
+ )
62
+ if not core_ok:
63
+ print("MODE: FIRST_BREATH")
64
+ print(f"NO SANCTUM at {sanctum}")
65
+ print("This is your one birth. Load references/first-breath.md and follow it.")
66
+ return 0
67
+
68
+ print("MODE: PULSE" if pulse else "MODE: WAKING")
69
+ print(f"Sanctum: {sanctum}")
70
+ for name in IDENTITY_FILES:
71
+ emit(sanctum / name)
72
+ if pulse:
73
+ emit(sanctum / "PULSE.md")
74
+ return 0
75
+
76
+
77
+ if __name__ == "__main__":
78
+ raise SystemExit(main())
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env python3
2
+ # /// script
3
+ # requires-python = ">=3.10"
4
+ # ///
5
+ """
6
+ Waking — load the agent's sanctum in one pass, or route to First Breath.
7
+
8
+ Run on activation. Determines the mode from the filesystem (and the --pulse
9
+ flag) and, when the sanctum exists, prints the full identity in a single read
10
+ (INDEX, PERSONA, CREED, BOND, MEMORY, CAPABILITIES) so the agent becomes itself
11
+ in one shot instead of six. In --pulse mode it also appends PULSE.md. When no
12
+ sanctum exists, it prints a directive to run First Breath.
13
+
14
+ This loads runtime memory only. It never reads or writes config or customize.toml.
15
+
16
+ Usage:
17
+ python3 wake.py <project-root> [--pulse]
18
+
19
+ project-root: The root of the project (where _bmad/ lives)
20
+ """
21
+
22
+ import sys
23
+ from pathlib import Path
24
+
25
+ SKILL_NAME = "bmad-agent-sentinel"
26
+
27
+ # Load order — the "become yourself" set.
28
+ IDENTITY_FILES = [
29
+ "INDEX.md",
30
+ "PERSONA.md",
31
+ "CREED.md",
32
+ "BOND.md",
33
+ "MEMORY.md",
34
+ "CAPABILITIES.md",
35
+ ]
36
+
37
+
38
+ def emit(path: Path) -> None:
39
+ print(f"\n===== {path.name} =====")
40
+ try:
41
+ print(path.read_text(encoding="utf-8").rstrip())
42
+ except FileNotFoundError:
43
+ print(f"(missing: {path.name})")
44
+
45
+
46
+ def main() -> int:
47
+ args = sys.argv[1:]
48
+ pulse = "--pulse" in args
49
+ positional = [a for a in args if not a.startswith("--")]
50
+ if not positional:
51
+ print("Usage: wake.py <project-root> [--pulse]", file=sys.stderr)
52
+ return 2
53
+
54
+ project_root = Path(positional[0]).resolve()
55
+ sanctum = project_root / "_bmad" / "memory" / SKILL_NAME
56
+
57
+ core_ok = (
58
+ sanctum.is_dir()
59
+ and (sanctum / "CREED.md").is_file()
60
+ and (sanctum / "MEMORY.md").is_file()
61
+ )
62
+ if not core_ok:
63
+ print("MODE: FIRST_BREATH")
64
+ print(f"NO SANCTUM at {sanctum}")
65
+ print("This is your one birth. Load references/first-breath.md and follow it.")
66
+ return 0
67
+
68
+ print("MODE: PULSE" if pulse else "MODE: WAKING")
69
+ print(f"Sanctum: {sanctum}")
70
+ for name in IDENTITY_FILES:
71
+ emit(sanctum / name)
72
+ if pulse:
73
+ emit(sanctum / "PULSE.md")
74
+ return 0
75
+
76
+
77
+ if __name__ == "__main__":
78
+ raise SystemExit(main())
@@ -38,6 +38,9 @@ activation_steps_append = []
38
38
 
39
39
  # Persistent facts the agent keeps in mind for the whole session
40
40
  # (org rules, domain constants, user preferences). Overrides append.
41
+ # These are static build-time config loaded on activation. They are not
42
+ # the sanctum: the sanctum is the agent's runtime memory across wakings,
43
+ # a separate surface that lives under {project-root}/_bmad/memory/.
41
44
  #
42
45
  # Each entry is either:
43
46
  # - a literal sentence, e.g. "Our org is AWS-only -- do not propose GCP or Azure."
@@ -10,8 +10,14 @@ and auto-generates CAPABILITIES.md from capability prompt frontmatter.
10
10
  After this script runs, the sanctum is fully self-contained — the agent does
11
11
  not depend on the skill bundle location for normal operation.
12
12
 
13
+ This initializes the agent's runtime sanctum memory, not build-time config. It
14
+ reads config.yaml and config.user.yaml strictly to substitute values into the
15
+ sanctum templates, and it never writes or authors any config file. Build-time
16
+ customization is owned by customize.toml, a separate surface this script never
17
+ touches.
18
+
13
19
  Usage:
14
- python3 init-sanctum.py <project-root> <skill-path>
20
+ uv run init-sanctum.py <project-root> <skill-path>
15
21
 
16
22
  project-root: The root of the project (where _bmad/ lives)
17
23
  skill-path: Path to the skill directory (where SKILL.md, references/, assets/ live)
@@ -154,7 +160,7 @@ def generate_capabilities_md(capabilities: list[dict], evolvable: bool) -> str:
154
160
  'Tell me "I want you to be able to do X" and we\'ll create it together.',
155
161
  "I'll write the prompt, save it to `capabilities/`, and register it here.",
156
162
  "Next session, I'll know how.",
157
- "Load `./references/capability-authoring.md` for the full creation framework.",
163
+ "Load `references/capability-authoring.md` for the full creation framework.",
158
164
  ])
159
165
 
160
166
  lines.extend([
@@ -181,7 +187,7 @@ def substitute_vars(content: str, variables: dict) -> str:
181
187
 
182
188
  def main():
183
189
  if len(sys.argv) < 3:
184
- print("Usage: python3 init-sanctum.py <project-root> <skill-path>")
190
+ print("Usage: uv run init-sanctum.py <project-root> <skill-path>")
185
191
  sys.exit(1)
186
192
 
187
193
  project_root = Path(sys.argv[1]).resolve()
@@ -199,8 +205,8 @@ def main():
199
205
  sanctum_refs = sanctum_path / "references"
200
206
  sanctum_scripts = sanctum_path / "scripts"
201
207
 
202
- # Fully qualified path for CAPABILITIES.md references
203
- sanctum_refs_path = "./references"
208
+ # Relative path for CAPABILITIES.md references (agent loads from within sanctum)
209
+ sanctum_refs_path = "references"
204
210
 
205
211
  # Check if sanctum already exists
206
212
  if sanctum_path.exists():