ma-agents 3.5.6 → 3.6.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/.ma-agents.json +10 -0
- package/AGENTS.md +97 -0
- package/MANIFEST.yaml +3 -0
- package/README.md +17 -0
- package/_bmad-output/implementation-artifacts/21-10-profile-reconfigure.md +30 -6
- package/_bmad-output/implementation-artifacts/21-11-profile-uninstall.md +2 -1
- package/_bmad-output/implementation-artifacts/21-2-universal-instruction-block-expansion.md +217 -62
- package/_bmad-output/implementation-artifacts/21-3-roomodes-template-bmad-modes.md +196 -73
- package/_bmad-output/implementation-artifacts/21-4-agents-md-template-opencode.md +242 -53
- package/_bmad-output/implementation-artifacts/21-5-clinerules-template-extension.md +180 -41
- package/_bmad-output/implementation-artifacts/21-6-onprem-layered-guardrails.md +250 -75
- package/_bmad-output/implementation-artifacts/21-7-bmad-persona-phase-prefix.md +221 -89
- package/_bmad-output/implementation-artifacts/21-8-vllm-reference-doc-readme.md +121 -63
- package/_bmad-output/implementation-artifacts/21-9-tests-validation.md +332 -61
- package/_bmad-output/implementation-artifacts/bug-bmad-recompile-fails-on-airgapped-network.md +112 -0
- package/_bmad-output/implementation-artifacts/sprint-status.yaml +3 -2
- package/bin/cli.js +59 -0
- package/docs/deployment/vllm-nemotron.md +130 -0
- package/lib/agents.js +17 -2
- package/lib/bmad-customize/bmm-analyst.customize.yaml +8 -0
- package/lib/bmad-customize/bmm-architect.customize.yaml +2 -0
- package/lib/bmad-customize/bmm-dev.customize.yaml +2 -0
- package/lib/bmad-customize/bmm-pm.customize.yaml +2 -0
- package/lib/bmad-customize/bmm-qa.customize.yaml +2 -0
- package/lib/bmad-customize/bmm-quick-flow-solo-dev.customize.yaml +8 -0
- package/lib/bmad-customize/bmm-sm.customize.yaml +2 -0
- package/lib/bmad-customize/bmm-tech-writer.customize.yaml +2 -0
- package/lib/bmad-customize/bmm-ux-designer.customize.yaml +2 -0
- package/lib/bmad.js +293 -1
- package/lib/installer.js +617 -43
- package/lib/merge/roomodes.js +125 -0
- package/lib/profile.js +25 -2
- package/lib/reconfigure.js +334 -0
- package/lib/templates/agents-md.template.md +67 -0
- package/lib/templates/clinerules.template.md +13 -0
- package/lib/templates/instruction-block-onprem.template.md +86 -0
- package/lib/templates/instruction-block-universal.template.md +29 -0
- package/lib/templates/roomodes.template.yaml +96 -0
- package/lib/uninstall.js +314 -0
- package/package.json +4 -3
- package/test/agents-md.test.js +398 -0
- package/test/bmad-extension.test.js +2 -2
- package/test/bmad-persona-phase-prefix.test.js +271 -0
- package/test/clinerules.test.js +339 -0
- package/test/instruction-block.test.js +388 -0
- package/test/integration-verification.test.js +2 -2
- package/test/migration-validation.test.js +2 -2
- package/test/offline-recompile.test.js +237 -0
- package/test/onprem-injection.test.js +425 -32
- package/test/onprem-layer.test.js +419 -0
- package/test/reconfigure.test.js +436 -0
- package/test/roomodes.test.js +343 -0
- package/test/uninstall.test.js +402 -0
package/bin/cli.js
CHANGED
|
@@ -35,6 +35,8 @@ const fs = require('fs');
|
|
|
35
35
|
const { execFileSync } = require('child_process');
|
|
36
36
|
const { installSkill, uninstallSkill, getStatus, listSkills, listAgents, updateProjectContextRepoLayout } = require('../lib/installer');
|
|
37
37
|
const { getProfile, setProfile, resolveProfile } = require('../lib/profile');
|
|
38
|
+
const { reconfigure: runReconfigure, ReconfigureYesRejectedError, ManifestNotFoundError, RoomodesSlugDivergenceError } = require('../lib/reconfigure');
|
|
39
|
+
const { uninstallProfileArtifacts } = require('../lib/uninstall');
|
|
38
40
|
const bmad = require('../lib/bmad');
|
|
39
41
|
const { getBmadPlatformCode } = require('../lib/agents');
|
|
40
42
|
const { handleCreateSkill, handleValidateSkill, handleSetMandatory, handleCustomizeAgent, handleCreateAgent } = require('../lib/skill-authoring');
|
|
@@ -92,6 +94,7 @@ ${chalk.bold('Usage:')}
|
|
|
92
94
|
${chalk.cyan(`npx ${NAME} install`)} Interactive install wizard
|
|
93
95
|
${chalk.cyan(`npx ${NAME} install`)} <skill> <agents...> Install directly
|
|
94
96
|
${chalk.cyan(`npx ${NAME} uninstall`)} <skill> <agents..> Uninstall a skill
|
|
97
|
+
${chalk.cyan(`npx ${NAME} uninstall --profile-artifacts`)} Remove ma-agents-owned profile content from all injection files
|
|
95
98
|
${chalk.cyan(`npx ${NAME} status`)} Show installed skills
|
|
96
99
|
${chalk.cyan(`npx ${NAME} list`)} List available skills
|
|
97
100
|
${chalk.cyan(`npx ${NAME} agents`)} List supported agents
|
|
@@ -100,6 +103,7 @@ ${chalk.bold('Usage:')}
|
|
|
100
103
|
${chalk.cyan(`npx ${NAME} set-mandatory`)} <name> [--off] Mark a skill as always-load (or remove)
|
|
101
104
|
${chalk.cyan(`npx ${NAME} customize-agent`)} <agent> Customize a BMAD agent persona and actions
|
|
102
105
|
${chalk.cyan(`npx ${NAME} create-agent`)} <name> Create a new specialized BMAD agent
|
|
106
|
+
${chalk.cyan(`npx ${NAME} reconfigure`)} Re-run the profile prompt and re-stamp artifacts
|
|
103
107
|
${chalk.cyan(`npx ${NAME} config layout`)} Reconfigure repository layout
|
|
104
108
|
${chalk.cyan(`npx ${NAME} config layout --show`)} Show current layout (read-only)
|
|
105
109
|
${chalk.cyan(`npx ${NAME} help`)} Show this help
|
|
@@ -112,6 +116,18 @@ ${chalk.bold('Install options:')}
|
|
|
112
116
|
${chalk.cyan('--agent <name>')} Target a specific agent (skip agent selection)
|
|
113
117
|
${chalk.cyan('--log')} Log all console output to install_<datetime>.log
|
|
114
118
|
|
|
119
|
+
${chalk.bold('Reconfigure options:')}
|
|
120
|
+
${chalk.cyan('--force-roomodes-overwrite')} Accept slug-stomp on user-edited ma-agents slugs
|
|
121
|
+
${chalk.gray('(reconfigure rejects --yes by design — it is interactive only)')}
|
|
122
|
+
|
|
123
|
+
${chalk.bold('Uninstall --profile-artifacts options:')}
|
|
124
|
+
${chalk.cyan('--yes')} Skip confirmation prompt (supported for CI decommissioning)
|
|
125
|
+
${chalk.gray('(asymmetry note: uninstall --profile-artifacts accepts --yes; reconfigure does not)')}
|
|
126
|
+
|
|
127
|
+
${chalk.bold('Notes:')}
|
|
128
|
+
Divergent \`.cline/clinerules.md\` vs. \`.clinerules\` marker blocks require
|
|
129
|
+
manual reconciliation — \`--yes\` does not bypass this check.
|
|
130
|
+
|
|
115
131
|
${chalk.bold('Examples:')}
|
|
116
132
|
npx ${NAME} install
|
|
117
133
|
npx ${NAME} install code-review claude-code
|
|
@@ -1197,6 +1213,20 @@ async function handleInstall(args) {
|
|
|
1197
1213
|
}
|
|
1198
1214
|
|
|
1199
1215
|
async function handleUninstall(args) {
|
|
1216
|
+
// Story 21.11 — if --profile-artifacts flag is present, route to uninstallProfileArtifacts.
|
|
1217
|
+
// --yes IS supported for profile-artifact uninstall (CI decommissioning use-case).
|
|
1218
|
+
// This is an intentional asymmetry vs. `reconfigure` which REJECTS --yes.
|
|
1219
|
+
if (args.includes('--profile-artifacts')) {
|
|
1220
|
+
const yesFlag = args.includes('--yes');
|
|
1221
|
+
try {
|
|
1222
|
+
await uninstallProfileArtifacts(process.cwd(), { yes: yesFlag });
|
|
1223
|
+
} catch (error) {
|
|
1224
|
+
console.error(chalk.red('\n Profile artifact uninstall failed:'), error.message);
|
|
1225
|
+
process.exit(1);
|
|
1226
|
+
}
|
|
1227
|
+
return;
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1200
1230
|
const { globalFlag, customPath, scope, positional } = parseFlags(args);
|
|
1201
1231
|
|
|
1202
1232
|
const skillId = positional[0];
|
|
@@ -1281,6 +1311,32 @@ async function handleConfigLayout(args) {
|
|
|
1281
1311
|
console.log(chalk.bold.green('\n Layout reconfigured!\n'));
|
|
1282
1312
|
}
|
|
1283
1313
|
|
|
1314
|
+
// --- Profile reconfigure (Story 21.10) ---
|
|
1315
|
+
async function handleReconfigure(args) {
|
|
1316
|
+
try {
|
|
1317
|
+
await runReconfigure({ projectRoot: process.cwd(), argv: args });
|
|
1318
|
+
} catch (err) {
|
|
1319
|
+
if (err instanceof ReconfigureYesRejectedError) {
|
|
1320
|
+
console.error(chalk.red(err.message));
|
|
1321
|
+
process.exit(1);
|
|
1322
|
+
}
|
|
1323
|
+
if (err instanceof ManifestNotFoundError) {
|
|
1324
|
+
console.error(chalk.red(err.message));
|
|
1325
|
+
console.error(chalk.gray(' Hint: run `npx ma-agents install` before `reconfigure`.'));
|
|
1326
|
+
process.exit(1);
|
|
1327
|
+
}
|
|
1328
|
+
if (err instanceof RoomodesSlugDivergenceError) {
|
|
1329
|
+
console.error(chalk.red(err.message));
|
|
1330
|
+
process.exit(1);
|
|
1331
|
+
}
|
|
1332
|
+
if (err && err.name === 'ClinerulesDualFileDriftError') {
|
|
1333
|
+
console.error(chalk.red(err.message));
|
|
1334
|
+
process.exit(1);
|
|
1335
|
+
}
|
|
1336
|
+
throw err;
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1284
1340
|
// --- Interactive mode ---
|
|
1285
1341
|
|
|
1286
1342
|
async function interactiveMode() {
|
|
@@ -1385,6 +1441,9 @@ async function main() {
|
|
|
1385
1441
|
process.exit(1);
|
|
1386
1442
|
}
|
|
1387
1443
|
break;
|
|
1444
|
+
case 'reconfigure':
|
|
1445
|
+
await handleReconfigure(args.slice(1));
|
|
1446
|
+
break;
|
|
1388
1447
|
case 'help':
|
|
1389
1448
|
case '--help':
|
|
1390
1449
|
case '-h':
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# vLLM Deployment Reference: Nemotron Super 49B
|
|
2
|
+
|
|
3
|
+
This document covers the recommended vLLM server configuration for running **Nvidia Nemotron Super 49B v1** (or similar Nemotron-class reasoning models) as the local LLM backend for `ma-agents` on-prem installations.
|
|
4
|
+
|
|
5
|
+
> **Scope:** This document is reference documentation for the human operator who runs the vLLM inference server. It is not stamped into target projects by the `ma-agents` installer (FR179). Agent-side guardrails are delivered by the on-prem instruction block (`lib/templates/instruction-block-onprem.template.md`) installed into each project's agent files.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Recommended vLLM Flags
|
|
10
|
+
|
|
11
|
+
All five flags below are recommended for Nemotron Super 49B. Omitting any of them will degrade either correctness or stability.
|
|
12
|
+
|
|
13
|
+
### `--enable-auto-tool-choice`
|
|
14
|
+
|
|
15
|
+
Enables automatic tool/function call parsing for supported models. Without this flag, vLLM treats model output as plain text and never extracts structured tool calls, causing the agent runtime to receive raw JSON embedded in prose rather than a parsed tool invocation. Required for any coding agent workflow that relies on file-editing or shell-execution tools.
|
|
16
|
+
|
|
17
|
+
### `--tool-call-parser qwen3_coder`
|
|
18
|
+
|
|
19
|
+
Selects the Qwen3-Coder-compatible parser that correctly extracts structured tool calls from Nemotron's output format. Nemotron Super 49B uses the same tool-call serialization convention as the Qwen3-Coder family. Using the wrong parser (e.g., `hermes`) causes malformed or silently dropped tool calls.
|
|
20
|
+
|
|
21
|
+
### `--max-model-len 32768`
|
|
22
|
+
|
|
23
|
+
Caps the context window at 32K tokens. This balances the KV-cache VRAM budget against coding task context requirements — sufficient for full repository context plus long multi-turn chats. Without an explicit cap, vLLM allocates KV-cache for the model's maximum trained length (often 128K+), exhausting VRAM before the first request completes on single-GPU configurations.
|
|
24
|
+
|
|
25
|
+
### `--enforce-eager`
|
|
26
|
+
|
|
27
|
+
Disables CUDA graph capture. This eliminates the first-request latency spike (CUDA graph warm-up can take 30–90 seconds on large models) and resolves some multi-turn inference stability issues observed with Nemotron-class models. The trade-off is slightly lower sustained throughput on back-to-back short requests. For interactive coding agent use where latency-per-request matters more than throughput, `--enforce-eager` is the correct default.
|
|
28
|
+
|
|
29
|
+
### `--trust-remote-code`
|
|
30
|
+
|
|
31
|
+
Required by the Nemotron Super 49B model class to load custom model code from the HuggingFace snapshot. Nemotron ships custom attention and RoPE scaling implementations that are not yet merged into the vLLM mainline. **Only set this flag when the model source is trusted** — for Nvidia's official HuggingFace repository (`nvidia/Nemotron-Super-49B-v1`) this is safe; for third-party forks, verify the model code before enabling.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Sample `vllm serve` Command
|
|
36
|
+
|
|
37
|
+
Copy-paste-runnable launch command composing all recommended flags:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
vllm serve nvidia/Nemotron-Super-49B-v1 \
|
|
41
|
+
--enable-auto-tool-choice \
|
|
42
|
+
--tool-call-parser qwen3_coder \
|
|
43
|
+
--max-model-len 32768 \
|
|
44
|
+
--enforce-eager \
|
|
45
|
+
--trust-remote-code \
|
|
46
|
+
--dtype bfloat16
|
|
47
|
+
# Per-request sampling parameters are set client-side (see sampling table below):
|
|
48
|
+
# Planning phase: temperature=0.0, top_p=1.0
|
|
49
|
+
# Implementation phase: temperature=0.6, top_p=0.95
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
> **Note on `--dtype`:** Use `bfloat16` for full-precision inference (requires 2× H100 80GB). For single-GPU deployments, substitute with `--quantization fp8` or `--quantization nvfp4` — see the quantization table below. Remove `--dtype bfloat16` when using a quantization flag, as they are mutually exclusive.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Quantization Tradeoffs
|
|
57
|
+
|
|
58
|
+
| Quantization | Approx. VRAM (49B, single H100 80GB) | Instruction-Following Quality |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| BF16 | ~98 GB (requires 2× H100) | Best — full precision weights |
|
|
61
|
+
| FP8 | ~49 GB (fits 1× H100 80GB) | Near-BF16 — minor degradation on complex reasoning |
|
|
62
|
+
| NVFP4 | ~25 GB (fits 1× A100 40GB) | Acceptable — recommended starting point for constrained hardware; test instruction-following quality for your use-case |
|
|
63
|
+
|
|
64
|
+
> **Assumptions:** VRAM figures assume no KV-cache at model load time with `--max-model-len 32768`. Actual VRAM usage is higher at inference as KV-cache fills. Tensor-parallel configurations (e.g., `--tensor-parallel-size 2`) can distribute the model across multiple GPUs, enabling BF16 on 2× H100 80GB.
|
|
65
|
+
|
|
66
|
+
**Recommended starting point for constrained hardware:** NVFP4 on a single A100 40GB. Validate instruction-following quality for your specific task mix before using in production — planning-phase prompts (deterministic, `/no_think`) are typically less sensitive to quantization than implementation-phase prompts (reasoning ON).
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Reasoning Mode and `/no_think`
|
|
71
|
+
|
|
72
|
+
Nemotron Super 49B is a reasoning model. **Thinking mode is ON by default** — the model prefixes its response with an extended internal monologue (`<think>...</think>`) before producing its answer. For coding tasks, this improves output quality at the cost of higher token consumption and latency.
|
|
73
|
+
|
|
74
|
+
### Disabling Reasoning for Planning Personas
|
|
75
|
+
|
|
76
|
+
Planning-phase agents (PM, Architect, Scrum Master, Analyst, Tech Writer, UX, QA) produce structured documents where extended reasoning adds latency without improving output quality — and where deterministic output (`temperature=0.0`) is preferred. To disable reasoning for these personas, prepend `/no_think` to the system prompt.
|
|
77
|
+
|
|
78
|
+
The `ma-agents` on-prem installer delivers `/no_think` in two places:
|
|
79
|
+
|
|
80
|
+
1. **Per-agent system prompt prefix** — the BMAD persona phase-aware prefix (Story 21.7) prepends `/no_think` to the system prompt of all planning-phase personas at install time.
|
|
81
|
+
2. **Per-tool instruction blocks** — `lib/templates/instruction-block-onprem.template.md` also injects `/no_think` into the per-tool instruction blocks stamped into `CLAUDE.md`, `.roo/rules/`, `.clinerules`, and `AGENTS.md` for planning-mode agents.
|
|
82
|
+
|
|
83
|
+
### Retaining Reasoning for Implementation Personas
|
|
84
|
+
|
|
85
|
+
Reasoning mode is intentionally **left ON** for implementation personas (`bmm-dev`, `bmm-quick-flow-solo-dev`). The extended chain-of-thought improves code generation quality, catches edge cases, and produces more careful reasoning about algorithmic choices. The higher token cost is accepted for implementation tasks.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Per-Phase Sampling Parameters
|
|
90
|
+
|
|
91
|
+
Sampling parameters are set client-side on each request (not in the `vllm serve` command). Configure your agent client or OpenAI-compatible API call accordingly.
|
|
92
|
+
|
|
93
|
+
| Phase | Temperature | top_p | Notes |
|
|
94
|
+
|---|---|---|---|
|
|
95
|
+
| Planning (PM, Architect, SM, Analyst, Tech Writer, UX, QA) | 0.0 | 1.0 | Deterministic — avoids hallucinated artifacts; use with `/no_think` |
|
|
96
|
+
| Implementation (Dev, Quick-Flow-Solo-Dev) | 0.6 | 0.95 | Allows creative solutions; reasoning ON |
|
|
97
|
+
|
|
98
|
+
> **Why `temperature=0.0` for planning?** Planning artifacts (PRDs, architecture docs, stories) must be reproducible across re-runs. Non-deterministic output at planning phase leads to artifact drift between sessions, which breaks BMAD-METHOD's assumption that prior context documents are stable. Setting `temperature=0.0` makes the model greedy and fully deterministic given the same prompt.
|
|
99
|
+
|
|
100
|
+
> **Why `temperature=0.6` for implementation?** Implementation tasks benefit from creative exploration — slightly non-zero temperature allows the model to consider multiple candidate approaches rather than always taking the locally-greedy token path. Combined with reasoning ON, this produces higher-quality code than either `temperature=0.0` or pure sampling alone.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## `str_replace_editor` Hallucination Warning
|
|
105
|
+
|
|
106
|
+
### Failure Mode
|
|
107
|
+
|
|
108
|
+
Local LLMs — including Nemotron-class models — may hallucinate invocations of `str_replace_editor`. This tool exists only in Claude Code (Anthropic's hosted Claude environment) and is not available in any locally-hosted LLM agent runtime. When a local model generates a `str_replace_editor` tool call:
|
|
109
|
+
|
|
110
|
+
- The agent runtime fails silently or returns a tool-not-found error.
|
|
111
|
+
- No actual file is edited.
|
|
112
|
+
- The model may then proceed as if the edit succeeded, producing divergent state between the model's internal belief and the actual file system.
|
|
113
|
+
- Downstream tool calls (e.g., `read_file`, `bash`) may then operate on stale content, compounding the error.
|
|
114
|
+
|
|
115
|
+
This failure mode is insidious because it is often silent — the model does not retry, and the user may not notice until the generated code is tested.
|
|
116
|
+
|
|
117
|
+
### Mitigations Delivered by `ma-agents`
|
|
118
|
+
|
|
119
|
+
`ma-agents` addresses this at two layers:
|
|
120
|
+
|
|
121
|
+
**Layer 1 — Instruction-block prohibition (Story 21.6)**
|
|
122
|
+
|
|
123
|
+
The on-prem instruction block (`lib/templates/instruction-block-onprem.template.md`) explicitly forbids invoking `str_replace_editor` in the per-tool rules injected into every agent's instruction file (`CLAUDE.md`, `.roo/rules/`, `.clinerules`, `AGENTS.md`). This rule is present in every on-prem agent installation and is re-stamped on each `ma-agents` update.
|
|
124
|
+
|
|
125
|
+
**Layer 2 — Application-layer path restriction (Stories 21.3, 21.4)**
|
|
126
|
+
|
|
127
|
+
- **Roo Code:** `.roomodes` `fileRegex` patterns (Story 21.3) constrain planning personas to documentation-only paths (e.g., `_bmad-output/**`, `docs/**`). Even if a planning persona hallucinates a `str_replace_editor` call targeting a source file, the Roo Code application layer will block the tool call before it reaches the filesystem.
|
|
128
|
+
- **OpenCode / AGENTS.md:** Story 21.4 similarly scopes planning personas in `AGENTS.md` to documentation paths, reducing the surface where a misrouted tool call could corrupt code files.
|
|
129
|
+
|
|
130
|
+
> **Operator action required:** Neither mitigation eliminates the underlying model behavior. Monitor agent session logs for `str_replace_editor` in model outputs — occurrences indicate the model is operating outside its instruction-following envelope and may require prompt tuning or a different quantization level.
|
package/lib/agents.js
CHANGED
|
@@ -159,7 +159,13 @@ const agents = [
|
|
|
159
159
|
template: 'generic',
|
|
160
160
|
bmadPlatformCode: 'roo',
|
|
161
161
|
instructionFiles: ['.roo/rules/00-ma-agents.md'],
|
|
162
|
-
injectionStrategy: { position: 'top', skipPatterns: ['---'] }
|
|
162
|
+
injectionStrategy: { position: 'top', skipPatterns: ['---'] },
|
|
163
|
+
// Story 21.3 AC #3 — extra YAML template stamped at project root so Roo
|
|
164
|
+
// Code's FileRestrictionError (NFR47) gates BMAD-mode edits at the IDE
|
|
165
|
+
// layer. Processed by applyExtraInstructionTemplates in lib/installer.js.
|
|
166
|
+
extraInstructionTemplates: [
|
|
167
|
+
{ template: 'roomodes.template.yaml', target: '.roomodes', merger: 'yaml-customModes' }
|
|
168
|
+
]
|
|
163
169
|
},
|
|
164
170
|
{
|
|
165
171
|
id: 'cursor',
|
|
@@ -242,7 +248,16 @@ const agents = [
|
|
|
242
248
|
fileExtension: '.md',
|
|
243
249
|
template: 'generic',
|
|
244
250
|
instructionFiles: ['opencode.json'],
|
|
245
|
-
injectionStrategy: { position: 'json-merge', targetKey: 'instructions' }
|
|
251
|
+
injectionStrategy: { position: 'json-merge', targetKey: 'instructions' },
|
|
252
|
+
// Story 21.4 — OpenCode auto-loads AGENTS.md when the file is listed in
|
|
253
|
+
// opencode.json::instructions[]. The extraInstructionTemplates field names
|
|
254
|
+
// the template shipped at lib/templates/<template>, the target path
|
|
255
|
+
// (relative to project root) to stamp, and the merger strategy. Processed
|
|
256
|
+
// by updateAgentInstructions in lib/installer.js in addition to the JSON
|
|
257
|
+
// merge above.
|
|
258
|
+
extraInstructionTemplates: [
|
|
259
|
+
{ template: 'agents-md.template.md', target: 'AGENTS.md', merger: 'markdown-markers' }
|
|
260
|
+
]
|
|
246
261
|
},
|
|
247
262
|
{
|
|
248
263
|
id: 'bmm-devops',
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# MA-AGENTS: skill enforcement for bmm-analyst
|
|
2
|
+
phase: planning
|
|
3
|
+
on_prem_phase_prefix: "/no_think You are in a planning phase — respond in text for questions; create files only when explicitly asked."
|
|
4
|
+
critical_actions:
|
|
5
|
+
- "Read the skills MANIFEST at {project-root}/skills/MANIFEST.yaml"
|
|
6
|
+
- "For each skill marked always_load: true, read the skill file completely"
|
|
7
|
+
- "If _bmad-output/project-context.md exists, read it completely"
|
|
8
|
+
- "Follow all skill directives and project-context rules during this session"
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# MA-AGENTS: skill enforcement for bmm-architect
|
|
2
|
+
phase: planning
|
|
3
|
+
on_prem_phase_prefix: "/no_think You are in a planning phase — respond in text for questions; create files only when explicitly asked."
|
|
2
4
|
critical_actions:
|
|
3
5
|
- "Read the skills MANIFEST at {project-root}/skills/MANIFEST.yaml"
|
|
4
6
|
- "For each skill marked always_load: true, read the skill file completely"
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# MA-AGENTS: skill enforcement for bmm-dev
|
|
2
|
+
phase: implementation
|
|
3
|
+
on_prem_phase_prefix: "Think carefully before writing code. Always reference the story you are implementing before making edits."
|
|
2
4
|
critical_actions:
|
|
3
5
|
- "Read the skills MANIFEST at {project-root}/skills/MANIFEST.yaml"
|
|
4
6
|
- "For each skill marked always_load: true, read the skill file completely"
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# MA-AGENTS: skill enforcement for bmm-pm
|
|
2
|
+
phase: planning
|
|
3
|
+
on_prem_phase_prefix: "/no_think You are in a planning phase — respond in text for questions; create files only when explicitly asked."
|
|
2
4
|
critical_actions:
|
|
3
5
|
- "Read the skills MANIFEST at {project-root}/skills/MANIFEST.yaml"
|
|
4
6
|
- "For each skill marked always_load: true, read the skill file completely"
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# MA-AGENTS: skill enforcement for bmm-quick-flow-solo-dev
|
|
2
|
+
phase: implementation
|
|
3
|
+
on_prem_phase_prefix: "Think carefully before writing code. Always reference the story you are implementing before making edits."
|
|
4
|
+
critical_actions:
|
|
5
|
+
- "Read the skills MANIFEST at {project-root}/skills/MANIFEST.yaml"
|
|
6
|
+
- "For each skill marked always_load: true, read the skill file completely"
|
|
7
|
+
- "If _bmad-output/project-context.md exists, read it completely"
|
|
8
|
+
- "Follow all skill directives and project-context rules during this session"
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# MA-AGENTS: skill enforcement for bmm-sm
|
|
2
|
+
phase: planning
|
|
3
|
+
on_prem_phase_prefix: "/no_think You are in a planning phase — respond in text for questions; create files only when explicitly asked."
|
|
2
4
|
critical_actions:
|
|
3
5
|
- "Read the skills MANIFEST at {project-root}/skills/MANIFEST.yaml"
|
|
4
6
|
- "For each skill marked always_load: true, read the skill file completely"
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# MA-AGENTS: skill enforcement for bmm-tech-writer
|
|
2
|
+
phase: planning
|
|
3
|
+
on_prem_phase_prefix: "/no_think You are in a planning phase — respond in text for questions; create files only when explicitly asked."
|
|
2
4
|
critical_actions:
|
|
3
5
|
- "Read the skills MANIFEST at {project-root}/skills/MANIFEST.yaml"
|
|
4
6
|
- "For each skill marked always_load: true, read the skill file completely"
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# MA-AGENTS: skill enforcement for bmm-ux-designer
|
|
2
|
+
phase: planning
|
|
3
|
+
on_prem_phase_prefix: "/no_think You are in a planning phase — respond in text for questions; create files only when explicitly asked."
|
|
2
4
|
critical_actions:
|
|
3
5
|
- "Read the skills MANIFEST at {project-root}/skills/MANIFEST.yaml"
|
|
4
6
|
- "For each skill marked always_load: true, read the skill file completely"
|