bmad-plus 0.14.0 → 0.16.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/CHANGELOG.md +52 -0
- package/README.md +34 -15
- package/SECURITY.md +71 -0
- package/THIRD-PARTY-LICENSES.md +349 -0
- package/osint-agent-package/README.md +1 -1
- package/package.json +9 -3
- package/readme-international/README.de.md +14 -8
- package/readme-international/README.es.md +15 -9
- package/readme-international/README.fr.md +14 -8
- package/src/bmad-plus/agents/agent-architect-dev/SKILL.md +11 -13
- package/src/bmad-plus/agents/agent-orchestrator/SKILL.md +147 -8
- package/src/bmad-plus/agents/agent-quality/SKILL.md +41 -11
- package/src/bmad-plus/data/role-triggers.yaml +19 -0
- package/src/bmad-plus/module-help.csv +1 -0
- package/src/bmad-plus/module.yaml +1 -0
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/create-story.md +3 -1
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/dev-story-checklist.md +2 -0
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/dev-story.md +5 -1
- package/src/bmad-plus/packs/pack-memory/README.md +29 -4
- package/src/bmad-plus/packs/pack-memory/memory-orchestrator.md +21 -1
- package/src/bmad-plus/packs/pack-memory/shared/karpathy-guardrails.md +3 -3
- package/src/bmad-plus/packs/pack-memory/shared/memory-protocol.md +27 -3
- package/src/bmad-plus/packs/pack-memory/zecher-agent.md +18 -2
- package/src/bmad-plus/skills/bmad-plus-autopilot/SKILL.md +47 -10
- package/src/bmad-plus/skills/bmad-plus-parallel/SKILL.md +17 -3
- package/src/bmad-plus/skills/bmad-plus-sync/SKILL.md +76 -67
- package/src/bmad-plus/skills/bmad-plus-uat/SKILL.md +144 -0
- package/src/bmad-plus/skills/bmad-plus-uat/ref/uat-results.schema.json +60 -0
- package/src/bmad-plus/skills/bmad-plus-uat/ref/uat-spec.schema.json +121 -0
- package/src/bmad-plus/skills/bmad-plus-uat/ref/uat-triage.schema.json +60 -0
- package/src/bmad-plus/skills/bmad-plus-uat/template/page.html +552 -0
- package/src/bmad-plus/skills/bmad-plus-uat/template/strings.json +362 -0
- package/tools/build/check-install-contract.js +202 -4
- package/tools/build/generate.js +16 -0
- package/tools/build/generated-adapters/.codex/AGENTS.md +1 -1
- package/tools/build/generated-adapters/.cursor/rules/bmad-plus.mdc +1 -1
- package/tools/build/generated-adapters/.opencode/AGENTS.md +1 -1
- package/tools/build/generated-adapters/AGENTS.md +1 -1
- package/tools/build/generated-adapters/CLAUDE.md +1 -1
- package/tools/build/generated-adapters/CONVENTIONS.md +1 -1
- package/tools/build/generated-adapters/GEMINI.md +1 -1
- package/tools/cli/bmad-plus-cli.js +15 -12
- package/tools/cli/commands/doctor.js +1 -0
- package/tools/cli/commands/install.js +21 -2
- package/tools/cli/commands/memory-journal-cmd.js +119 -19
- package/tools/cli/commands/nexus.js +111 -0
- package/tools/cli/commands/uat.js +389 -0
- package/tools/cli/lib/README-memory-journal.md +19 -8
- package/tools/cli/lib/installation-health.js +6 -0
- package/tools/cli/lib/memory-journal.js +0 -0
- package/tools/cli/lib/memory-outcomes.js +293 -0
- package/tools/cli/lib/memory-store.js +139 -0
- package/tools/cli/lib/nexus-process.js +377 -0
- package/tools/cli/lib/nexus.js +1532 -0
- package/tools/cli/lib/pack-copy.js +39 -11
- package/tools/cli/lib/packs.js +17 -3
- package/tools/cli/lib/uat.js +869 -0
- package/tools/maintain/upstream-candidate.js +456 -0
- package/tools/release/publication-content.js +3 -1
- package/tools/release/supply-chain.js +282 -0
|
@@ -7,47 +7,74 @@ const fs = require('node:fs');
|
|
|
7
7
|
const crypto = require('node:crypto');
|
|
8
8
|
const { safeTarget } = require('../../build/generate-adapters');
|
|
9
9
|
|
|
10
|
-
const fileHash = content => crypto.createHash('sha256').update(content).digest('hex');
|
|
10
|
+
const fileHash = (content) => crypto.createHash('sha256').update(content).digest('hex');
|
|
11
11
|
|
|
12
12
|
function listPackFiles({ bmadSrc, targetAgentsDir, targetDataDir, projectRoot, pack }) {
|
|
13
13
|
const result = { copiedAgents: 0, copiedSkills: 0, copiedFiles: 0, files: [] };
|
|
14
14
|
if (!pack) return result;
|
|
15
15
|
function walk(source, target) {
|
|
16
|
+
// Local Python execution must not turn interpreter caches into owned/shipped
|
|
17
|
+
// framework files. Keep this aligned with the explicit npm files exclusions.
|
|
18
|
+
if (path.basename(source) === '__pycache__' || /\.py[co]$/i.test(source)) return false;
|
|
16
19
|
let stat;
|
|
17
|
-
try {
|
|
20
|
+
try {
|
|
21
|
+
stat = fs.lstatSync(source);
|
|
22
|
+
} catch (error) {
|
|
18
23
|
if (error.code === 'ENOENT') return false;
|
|
19
24
|
throw error;
|
|
20
25
|
}
|
|
21
26
|
if (stat.isSymbolicLink()) throw new Error('Pack source is a symbolic link: ' + source);
|
|
22
27
|
if (stat.isDirectory()) {
|
|
23
|
-
for (const name of fs.readdirSync(source).sort())
|
|
28
|
+
for (const name of fs.readdirSync(source).sort())
|
|
29
|
+
walk(path.join(source, name), path.join(target, name));
|
|
24
30
|
} else if (stat.isFile()) {
|
|
25
31
|
result.files.push({ source, target });
|
|
26
32
|
} else throw new Error('Pack source is not a regular file: ' + source);
|
|
27
33
|
return true;
|
|
28
34
|
}
|
|
29
35
|
for (const name of pack.agents || []) {
|
|
30
|
-
if (walk(path.join(bmadSrc, 'agents', name), path.join(targetAgentsDir, name)))
|
|
36
|
+
if (walk(path.join(bmadSrc, 'agents', name), path.join(targetAgentsDir, name)))
|
|
37
|
+
result.copiedAgents++;
|
|
31
38
|
}
|
|
32
39
|
for (const name of pack.skills || []) {
|
|
33
|
-
if (walk(path.join(bmadSrc, 'skills', name), path.join(targetAgentsDir, name)))
|
|
40
|
+
if (walk(path.join(bmadSrc, 'skills', name), path.join(targetAgentsDir, name)))
|
|
41
|
+
result.copiedSkills++;
|
|
34
42
|
}
|
|
35
43
|
for (const name of pack.data || []) {
|
|
36
|
-
if (walk(path.join(bmadSrc, 'data', name), path.join(targetDataDir, name)))
|
|
44
|
+
if (walk(path.join(bmadSrc, 'data', name), path.join(targetDataDir, name)))
|
|
45
|
+
result.copiedFiles++;
|
|
37
46
|
}
|
|
38
|
-
if (
|
|
39
|
-
|
|
47
|
+
if (
|
|
48
|
+
pack.externalPackage &&
|
|
49
|
+
walk(path.join(projectRoot, pack.externalPackage, 'skills'), targetAgentsDir)
|
|
50
|
+
)
|
|
51
|
+
result.copiedSkills++;
|
|
52
|
+
if (
|
|
53
|
+
pack.packDir &&
|
|
54
|
+
walk(
|
|
55
|
+
path.join(bmadSrc, pack.packSrcDir || 'agents', pack.packDir),
|
|
56
|
+
path.join(targetAgentsDir, pack.packDir)
|
|
57
|
+
)
|
|
58
|
+
) {
|
|
40
59
|
result.copiedAgents++;
|
|
41
60
|
result.copiedFiles++;
|
|
42
61
|
}
|
|
43
62
|
return result;
|
|
44
63
|
}
|
|
45
64
|
|
|
46
|
-
function copyManagedFile({
|
|
65
|
+
function copyManagedFile({
|
|
66
|
+
source,
|
|
67
|
+
target,
|
|
68
|
+
projectDir,
|
|
69
|
+
inventory,
|
|
70
|
+
previousInventory = {},
|
|
71
|
+
onConflict = () => {},
|
|
72
|
+
}) {
|
|
47
73
|
const file = path.relative(projectDir, target).split(path.sep).join('/');
|
|
48
74
|
safeTarget(projectDir, file);
|
|
49
75
|
const sourceStat = fs.lstatSync(source);
|
|
50
|
-
if (!sourceStat.isFile() || sourceStat.isSymbolicLink())
|
|
76
|
+
if (!sourceStat.isFile() || sourceStat.isSymbolicLink())
|
|
77
|
+
throw new Error('Pack source is not a regular file: ' + source);
|
|
51
78
|
const content = fs.readFileSync(source);
|
|
52
79
|
const hash = fileHash(content);
|
|
53
80
|
if (fs.existsSync(target)) {
|
|
@@ -72,7 +99,8 @@ function copyManagedFile({ source, target, projectDir, inventory, previousInvent
|
|
|
72
99
|
function copyPackFiles(options) {
|
|
73
100
|
const { files, ...counts } = listPackFiles(options);
|
|
74
101
|
const projectDir = options.projectDir || path.dirname(options.targetAgentsDir);
|
|
75
|
-
for (const { target } of files)
|
|
102
|
+
for (const { target } of files)
|
|
103
|
+
safeTarget(projectDir, path.relative(projectDir, target).split(path.sep).join('/'));
|
|
76
104
|
for (const entry of files) copyManagedFile({ ...options, ...entry, projectDir });
|
|
77
105
|
return counts;
|
|
78
106
|
}
|
package/tools/cli/lib/packs.js
CHANGED
|
@@ -19,7 +19,8 @@ const PACKS = {
|
|
|
19
19
|
"skills": [
|
|
20
20
|
"bmad-plus-autopilot",
|
|
21
21
|
"bmad-plus-parallel",
|
|
22
|
-
"bmad-plus-sync"
|
|
22
|
+
"bmad-plus-sync",
|
|
23
|
+
"bmad-plus-uat"
|
|
23
24
|
],
|
|
24
25
|
"data": [
|
|
25
26
|
"role-triggers.yaml"
|
|
@@ -210,7 +211,7 @@ const DERIVED = {
|
|
|
210
211
|
"product": {
|
|
211
212
|
"code": "bmad-plus",
|
|
212
213
|
"displayName": "BMAD+",
|
|
213
|
-
"version": "0.
|
|
214
|
+
"version": "0.16.0",
|
|
214
215
|
"derivedFrom": "BMAD-METHOD v6.6.0"
|
|
215
216
|
},
|
|
216
217
|
"packOrder": [
|
|
@@ -253,7 +254,7 @@ const DERIVED = {
|
|
|
253
254
|
"workflowCount": 0,
|
|
254
255
|
"frameworkCount": 0,
|
|
255
256
|
"categoryCount": 0,
|
|
256
|
-
"skillCount":
|
|
257
|
+
"skillCount": 4,
|
|
257
258
|
"referenceFiles": 0,
|
|
258
259
|
"categoryAgentCounts": [],
|
|
259
260
|
"runtimes": [
|
|
@@ -267,6 +268,7 @@ const DERIVED = {
|
|
|
267
268
|
".agents/skills/bmad-plus-autopilot/SKILL.md",
|
|
268
269
|
".agents/skills/bmad-plus-parallel/SKILL.md",
|
|
269
270
|
".agents/skills/bmad-plus-sync/SKILL.md",
|
|
271
|
+
".agents/skills/bmad-plus-uat/SKILL.md",
|
|
270
272
|
".agents/data/role-triggers.yaml"
|
|
271
273
|
],
|
|
272
274
|
"personas": [
|
|
@@ -666,6 +668,18 @@ const DERIVED = {
|
|
|
666
668
|
},
|
|
667
669
|
"diagnostics": {
|
|
668
670
|
"schemaVersion": 1,
|
|
671
|
+
"processExecution": {
|
|
672
|
+
"adapters": [
|
|
673
|
+
"command",
|
|
674
|
+
"codex-exec"
|
|
675
|
+
],
|
|
676
|
+
"supervisor": "foreground",
|
|
677
|
+
"launch": "explicit-plan",
|
|
678
|
+
"collect": "exact-attempt-receipt",
|
|
679
|
+
"cancellation": "original-owner-direct-child",
|
|
680
|
+
"verification": "independent-required",
|
|
681
|
+
"scheduling": "none"
|
|
682
|
+
},
|
|
669
683
|
"runtimeMinimums": {
|
|
670
684
|
"node": "20.0.0",
|
|
671
685
|
"python": "3.11"
|