ma-agents 3.13.2-skillname.0 → 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.
- package/README.md +1 -1
- package/lib/agents.js +13 -3
- package/lib/bmad-cache/bmb/.claude-plugin/marketplace.json +3 -3
- package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-b388526edf307cf56f8e65673466cff074105abf.idx +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/{pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.pack → pack-b388526edf307cf56f8e65673466cff074105abf.pack} +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-b388526edf307cf56f8e65673466cff074105abf.rev +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/packed-refs +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -1
- package/lib/bmad-cache/bmb/package-lock.json +2 -2
- package/lib/bmad-cache/bmb/package.json +1 -1
- package/lib/bmad-cache/bmb/samples/bmad-agent-code-coach/scripts/wake.py +78 -0
- package/lib/bmad-cache/bmb/samples/bmad-agent-creative-muse/scripts/wake.py +78 -0
- package/lib/bmad-cache/bmb/samples/bmad-agent-sentinel/scripts/wake.py +78 -0
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/customize-template.toml +3 -0
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/init-sanctum-template.py +11 -5
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/report-shell.html +1073 -0
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/wake-template.py +78 -0
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/customize.toml +48 -0
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/count_tokens.py +78 -0
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass.py +258 -0
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/process-template.py +20 -0
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/render_report.py +387 -0
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/assets/adapter-claude-code.json +9 -0
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/aggregate_benchmark.py +236 -0
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/memlog.py +197 -0
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_evals.py +513 -390
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_triggers.py +347 -251
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/tests/test_env_isolation.py +79 -0
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/tests/test_trigger_detection.py +123 -0
- package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-validate-module.py +82 -4
- package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/validate-module.py +55 -11
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/customize-template.toml +3 -5
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/report-shell.html +860 -0
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/customize.toml +59 -0
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/count_tokens.py +77 -0
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/init_skill.py +132 -0
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +186 -221
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/quick_validate.py +117 -0
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/render_report.py +387 -0
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_canon_sync.py +46 -0
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_count_tokens.py +180 -0
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_render_report.py +171 -0
- package/lib/bmad-cache/cache-manifest.json +4 -4
- package/lib/bmad-extension/.claude-plugin/marketplace.json.template +1 -1
- package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +2 -2
- package/lib/bmad.js +6 -1
- package/lib/templates/instruction-block-git.template.md +25 -25
- package/lib/templates/instruction-block-onprem.template.md +86 -86
- package/lib/templates/instruction-block-universal.template.md +29 -29
- package/package.json +3 -3
- package/lib/.bmad-extension-plugin.build-37364-1782300865129/.claude-plugin/marketplace.json +0 -109
- package/lib/.bmad-extension-plugin.build-37364-1782300865129/skills/module-help.csv +0 -62
- package/lib/.bmad-extension-plugin.build-37364-1782300865129/skills/module.yaml +0 -20
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.idx +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.rev +0 -0
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/references/sample-init-sanctum.py +0 -274
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/generate-html-report.py +0 -534
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-execution-deps.py +0 -337
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-prompt-metrics.py +0 -425
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-sanctum-architecture.py +0 -385
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-structure-capabilities.py +0 -482
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/assets/Dockerfile +0 -29
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/docker_setup.py +0 -115
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/generate_report.py +0 -184
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/pty_runner.py +0 -171
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/utils.py +0 -260
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/extract-report-json.py +0 -287
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-html-report.py +0 -588
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-execution-deps.py +0 -288
package/README.md
CHANGED
|
@@ -166,7 +166,7 @@ Skills can be installed into any of these AI coding agents:
|
|
|
166
166
|
|------|-------------|----------|------------------|
|
|
167
167
|
| Claude Code | `.claude/skills/` | `claude-code` | `.claude/CLAUDE.md` |
|
|
168
168
|
| Google Gemini | `.gemini/skills/` | `generic` | `.gemini/gemini.md` |
|
|
169
|
-
| GitHub Copilot | `.
|
|
169
|
+
| GitHub Copilot | `.agents/skills/` | `generic` | `.github/copilot-instructions.md` |
|
|
170
170
|
| Cursor | `.cursor/skills/` | `generic` | `.cursor/cursor.md` |
|
|
171
171
|
| Kilocode | `.kilocode/skills/` | `generic` | `.kilocode/kilocode.md` |
|
|
172
172
|
| Cline | `.cline/skills/` | `cline` | `.cline/clinerules.md` |
|
package/lib/agents.js
CHANGED
|
@@ -78,8 +78,11 @@ const agents = [
|
|
|
78
78
|
// from their tool-specific directories to the shared `.agents/skills/`
|
|
79
79
|
// tree (see platform-codes.yaml). Aligning here keeps the smoke verifier
|
|
80
80
|
// and all downstream consumers in sync with BMAD's actual write target.
|
|
81
|
-
// The
|
|
82
|
-
// is
|
|
81
|
+
// The skill-bootstrap instructions MUST live in `.github/copilot-instructions.md`
|
|
82
|
+
// — that is the only repository custom-instructions file GitHub Copilot reads
|
|
83
|
+
// (VS Code, Visual Studio, github.com; per the PRD agent table). The earlier
|
|
84
|
+
// `.github/copilot/copilot.md` path was never loaded by Copilot, so installed
|
|
85
|
+
// skills were invisible to it.
|
|
83
86
|
skillsDir: '.agents/skills',
|
|
84
87
|
getProjectPath: () => path.join(process.cwd(), '.agents', 'skills'),
|
|
85
88
|
getGlobalPath: () => {
|
|
@@ -95,7 +98,7 @@ const agents = [
|
|
|
95
98
|
fileExtension: '.md',
|
|
96
99
|
template: 'generic',
|
|
97
100
|
bmadPlatformCode: 'github-copilot',
|
|
98
|
-
instructionFiles: ['.github/copilot
|
|
101
|
+
instructionFiles: ['.github/copilot-instructions.md'],
|
|
99
102
|
injectionStrategy: { position: 'top', skipPatterns: ['---'] }
|
|
100
103
|
},
|
|
101
104
|
{
|
|
@@ -337,6 +340,13 @@ const agents = [
|
|
|
337
340
|
instructionFiles: ['_bmad/bmm/agents/demerzel.md'],
|
|
338
341
|
injectionStrategy: { position: 'top', skipPatterns: ['---'] }
|
|
339
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.
|
|
340
350
|
];
|
|
341
351
|
|
|
342
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.
|
|
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": "
|
|
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
|
|
43
|
+
"version": "2.1.0",
|
|
44
44
|
"author": {
|
|
45
45
|
"name": "Brian (BMad) Madison"
|
|
46
46
|
},
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# pack-refs with: peeled fully-peeled sorted
|
|
2
|
-
|
|
2
|
+
e6935f2776c34ffd9b18f4ef1e334584ef10a50f refs/remotes/origin/main
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
e6935f2776c34ffd9b18f4ef1e334584ef10a50f
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
e6935f2776c34ffd9b18f4ef1e334584ef10a50f
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bmad-builder",
|
|
3
|
-
"version": "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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
-
#
|
|
203
|
-
sanctum_refs_path = "
|
|
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():
|