ma-agents 2.11.0 → 2.13.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/_bmad/bmm/agents/sre.md +14 -0
- package/_bmad/skills/sre/.ma-agents.json +14 -0
- package/_bmad/skills/sre/MANIFEST.yaml +7 -0
- package/_bmad/skills/sre/docker-image-signing/SKILL.md +28 -0
- package/_bmad/skills/sre/docker-image-signing/scripts/sign-image.sh +33 -0
- package/bin/cli.js +43 -9
- package/lib/agents.js +8 -8
- package/lib/installer.js +4 -1
- package/package.json +1 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
|
|
2
|
+
<!-- MA-AGENTS-START -->
|
|
3
|
+
# AI Agent Skills - Planning Instruction
|
|
4
|
+
|
|
5
|
+
You have access to a library of skills in your skills directory. Before starting any task:
|
|
6
|
+
|
|
7
|
+
1. Read the skill manifest at _bmad/skills/sre/MANIFEST.yaml
|
|
8
|
+
2. Based on the task description, select which skills are relevant
|
|
9
|
+
3. Read only the selected skill files
|
|
10
|
+
4. Then proceed with the task
|
|
11
|
+
|
|
12
|
+
Always load skills marked with always_load: true.
|
|
13
|
+
Do not load skills that are not relevant to the current task.
|
|
14
|
+
<!-- MA-AGENTS-END -->
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifestVersion": "1.0.0",
|
|
3
|
+
"agent": "bmm-sre",
|
|
4
|
+
"scope": "project",
|
|
5
|
+
"skills": {
|
|
6
|
+
"docker-image-signing": {
|
|
7
|
+
"version": "1.0.0",
|
|
8
|
+
"installedAt": "2026-03-01T10:23:35.941Z",
|
|
9
|
+
"updatedAt": "2026-03-01T10:23:35.941Z",
|
|
10
|
+
"installerVersion": "2.11.0",
|
|
11
|
+
"agentVersion": "1.0.0"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Docker Image Signing
|
|
3
|
+
description: Automates the signing of Docker images using certificates and Cosign/Notary.
|
|
4
|
+
---
|
|
5
|
+
# Docker Image Signing
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
Ensure the integrity and authenticity of Docker images by signing them with a cryptographic key/certificate. This prevents unauthorized image substitution and ensures only trusted images are deployed.
|
|
9
|
+
|
|
10
|
+
## Instructions
|
|
11
|
+
1. **Tool Selection**: Use `cosign` (recommended) or `notary`.
|
|
12
|
+
2. **Environment Check**: Verify that the signing tool and Docker/Podman are installed.
|
|
13
|
+
3. **Signing Process**:
|
|
14
|
+
- Load the provided certificate/key.
|
|
15
|
+
- Run the signing command against the target image (using its SHA256 digest for immutability).
|
|
16
|
+
4. **Verification**: Always run a verification check immediately after signing.
|
|
17
|
+
|
|
18
|
+
## Rules
|
|
19
|
+
- NEVER sign images by tag alone; use the immutable digest (e.g., `image@sha256:...`).
|
|
20
|
+
- Private keys must be handled as secrets and never stored in the clear.
|
|
21
|
+
- Ensure the certificate provided is valid and not expired.
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
Run the provided script in `scripts/sign-image.sh` with:
|
|
25
|
+
- `IMAGE`: The image reference with digest.
|
|
26
|
+
- `CERT`: Path to the certificate file.
|
|
27
|
+
- `KEY`: Path to the private key file.
|
|
28
|
+
- `PASSPHRASE`: (Optional) Key passphrase.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# sign-image.sh - Part of ma-agents docker-image-signing skill
|
|
3
|
+
|
|
4
|
+
IMAGE=$1
|
|
5
|
+
CERT=$2
|
|
6
|
+
KEY=$3
|
|
7
|
+
PASSPHRASE=$4
|
|
8
|
+
|
|
9
|
+
if [ -z "$IMAGE" ] || [ -z "$CERT" ] || [ -z "$KEY" ]; then
|
|
10
|
+
echo "Usage: $0 <image_digest> <cert_file> <key_file> [passphrase]"
|
|
11
|
+
exit 1
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
echo "Signing image: $IMAGE"
|
|
15
|
+
|
|
16
|
+
# Check for cosign
|
|
17
|
+
if command -v cosign &> /dev/null; then
|
|
18
|
+
echo "Using Cosign for signing..."
|
|
19
|
+
if [ -n "$PASSPHRASE" ]; then
|
|
20
|
+
export COSIGN_PASSWORD=$PASSPHRASE
|
|
21
|
+
fi
|
|
22
|
+
cosign sign --key "$KEY" --cert "$CERT" "$IMAGE"
|
|
23
|
+
else
|
|
24
|
+
echo "Error: cosign not found. Please install cosign to use this skill."
|
|
25
|
+
exit 1
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
if [ $? -eq 0 ]; then
|
|
29
|
+
echo "Successfully signed $IMAGE"
|
|
30
|
+
else
|
|
31
|
+
echo "Failed to sign $IMAGE"
|
|
32
|
+
exit 1
|
|
33
|
+
fi
|
package/bin/cli.js
CHANGED
|
@@ -51,8 +51,18 @@ function showSkills() {
|
|
|
51
51
|
function showAgents() {
|
|
52
52
|
const agents = listAgents();
|
|
53
53
|
console.log(chalk.bold('\n Supported Agents:\n'));
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
|
|
55
|
+
const ideAgents = agents.filter(a => !['bmm-sre', 'bmm-devops', 'bmm-cyber', 'antigravity'].includes(a.id));
|
|
56
|
+
const bmadAgents = agents.filter(a => ['bmm-sre', 'bmm-devops', 'bmm-cyber', 'antigravity'].includes(a.id));
|
|
57
|
+
|
|
58
|
+
console.log(chalk.bold.yellow(' AI Coding Assistants:'));
|
|
59
|
+
ideAgents.forEach(agent => {
|
|
60
|
+
console.log(chalk.cyan(` ${agent.id.padEnd(20)}`) + chalk.white(agent.name) + chalk.gray(` v${agent.version} - ${agent.description}`));
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
console.log(chalk.bold.yellow('\n BMAD Method Agents:'));
|
|
64
|
+
bmadAgents.forEach(agent => {
|
|
65
|
+
console.log(chalk.cyan(` ${agent.id.padEnd(20)}`) + chalk.white(agent.name) + chalk.gray(` v${agent.version} - ${agent.description}`));
|
|
56
66
|
});
|
|
57
67
|
console.log('');
|
|
58
68
|
}
|
|
@@ -225,21 +235,45 @@ async function installWizard(preselectedSkill, preselectedAgents, customPath, fo
|
|
|
225
235
|
|
|
226
236
|
// Step 2: Select agents
|
|
227
237
|
if (selectedAgentIds.length === 0 || isUpdate) {
|
|
228
|
-
const
|
|
238
|
+
const ideAgents = agents.filter(a => !['bmm-sre', 'bmm-devops', 'bmm-cyber', 'antigravity'].includes(a.id));
|
|
239
|
+
const bmadAgents = agents.filter(a => ['bmm-sre', 'bmm-devops', 'bmm-cyber', 'antigravity'].includes(a.id));
|
|
240
|
+
|
|
241
|
+
// 2.1 Coding Assistants
|
|
242
|
+
const { ideChosen } = await prompts({
|
|
229
243
|
type: 'multiselect',
|
|
230
|
-
name: '
|
|
231
|
-
message: 'Select
|
|
232
|
-
choices:
|
|
244
|
+
name: 'ideChosen',
|
|
245
|
+
message: 'Select AI Coding Assistants:',
|
|
246
|
+
choices: ideAgents.map(a => ({
|
|
233
247
|
title: chalk.white(a.name) + chalk.gray(` v${a.version} - ${a.description}`),
|
|
234
248
|
value: a.id,
|
|
235
249
|
selected: selectedAgentIds.includes(a.id)
|
|
236
250
|
})),
|
|
237
251
|
instructions: chalk.gray(' Use space to select, enter to confirm'),
|
|
238
|
-
min: 1
|
|
239
252
|
});
|
|
240
253
|
|
|
241
|
-
if (
|
|
242
|
-
|
|
254
|
+
if (ideChosen === undefined) process.exit(0);
|
|
255
|
+
|
|
256
|
+
// 2.2 BMAD Method Agents
|
|
257
|
+
const { bmadChosen } = await prompts({
|
|
258
|
+
type: 'multiselect',
|
|
259
|
+
name: 'bmadChosen',
|
|
260
|
+
message: 'Select BMAD Method Agents:',
|
|
261
|
+
choices: bmadAgents.map(a => ({
|
|
262
|
+
title: chalk.white(a.name) + chalk.gray(` v${a.version} - ${a.description}`),
|
|
263
|
+
value: a.id,
|
|
264
|
+
selected: selectedAgentIds.includes(a.id)
|
|
265
|
+
})),
|
|
266
|
+
instructions: chalk.gray(' Use space to select, enter to confirm'),
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
if (bmadChosen === undefined) process.exit(0);
|
|
270
|
+
|
|
271
|
+
selectedAgentIds = [...ideChosen, ...bmadChosen];
|
|
272
|
+
|
|
273
|
+
if (selectedAgentIds.length === 0) {
|
|
274
|
+
console.log(chalk.yellow('No agents selected. Please select at least one agent to install skills.'));
|
|
275
|
+
process.exit(1);
|
|
276
|
+
}
|
|
243
277
|
}
|
|
244
278
|
|
|
245
279
|
// Step 3: Scope (Skip if update, we already know it's project)
|
package/lib/agents.js
CHANGED
|
@@ -144,7 +144,7 @@ const agents = [
|
|
|
144
144
|
name: 'SRE Agent',
|
|
145
145
|
version: '1.0.0',
|
|
146
146
|
description: 'Specialized SRE Agent for BMAD-METHOD',
|
|
147
|
-
getProjectPath: () => path.join(process.cwd(), '
|
|
147
|
+
getProjectPath: () => path.join(process.cwd(), '_bmad', 'skills', 'sre'),
|
|
148
148
|
getGlobalPath: () => {
|
|
149
149
|
const platform = os.platform();
|
|
150
150
|
if (platform === 'win32') {
|
|
@@ -157,14 +157,14 @@ const agents = [
|
|
|
157
157
|
},
|
|
158
158
|
fileExtension: '.md',
|
|
159
159
|
template: 'generic',
|
|
160
|
-
instructionFiles: ['
|
|
160
|
+
instructionFiles: ['_bmad/bmm/agents/sre.md']
|
|
161
161
|
},
|
|
162
162
|
{
|
|
163
163
|
id: 'antigravity',
|
|
164
164
|
name: 'Antigravity',
|
|
165
165
|
version: '1.0.0',
|
|
166
166
|
description: 'Google Deepmind Antigravity Agent',
|
|
167
|
-
getProjectPath: () => path.join(process.cwd(), '
|
|
167
|
+
getProjectPath: () => path.join(process.cwd(), '_bmad', 'skills', 'antigravity'),
|
|
168
168
|
getGlobalPath: () => {
|
|
169
169
|
const platform = os.platform();
|
|
170
170
|
if (platform === 'win32') {
|
|
@@ -177,14 +177,14 @@ const agents = [
|
|
|
177
177
|
},
|
|
178
178
|
fileExtension: '.md',
|
|
179
179
|
template: 'generic',
|
|
180
|
-
instructionFiles: ['
|
|
180
|
+
instructionFiles: ['_bmad/bmm/agents/antigravity.md']
|
|
181
181
|
},
|
|
182
182
|
{
|
|
183
183
|
id: 'bmm-devops',
|
|
184
184
|
name: 'DevOps Agent',
|
|
185
185
|
version: '1.0.0',
|
|
186
186
|
description: 'Specialized DevOps Agent for BMAD-METHOD',
|
|
187
|
-
getProjectPath: () => path.join(process.cwd(), '
|
|
187
|
+
getProjectPath: () => path.join(process.cwd(), '_bmad', 'skills', 'devops'),
|
|
188
188
|
getGlobalPath: () => {
|
|
189
189
|
const platform = os.platform();
|
|
190
190
|
if (platform === 'win32') {
|
|
@@ -197,14 +197,14 @@ const agents = [
|
|
|
197
197
|
},
|
|
198
198
|
fileExtension: '.md',
|
|
199
199
|
template: 'generic',
|
|
200
|
-
instructionFiles: ['
|
|
200
|
+
instructionFiles: ['_bmad/bmm/agents/devops.md']
|
|
201
201
|
},
|
|
202
202
|
{
|
|
203
203
|
id: 'bmm-cyber',
|
|
204
204
|
name: 'Cyber Analyst',
|
|
205
205
|
version: '1.0.0',
|
|
206
206
|
description: 'Specialized Cyber Security Analyst (Yael) for BMAD-METHOD',
|
|
207
|
-
getProjectPath: () => path.join(process.cwd(), '
|
|
207
|
+
getProjectPath: () => path.join(process.cwd(), '_bmad', 'skills', 'yael'),
|
|
208
208
|
getGlobalPath: () => {
|
|
209
209
|
const platform = os.platform();
|
|
210
210
|
if (platform === 'win32') {
|
|
@@ -217,7 +217,7 @@ const agents = [
|
|
|
217
217
|
},
|
|
218
218
|
fileExtension: '.md',
|
|
219
219
|
template: 'generic',
|
|
220
|
-
instructionFiles: ['
|
|
220
|
+
instructionFiles: ['_bmad/bmm/agents/cyber.md']
|
|
221
221
|
}
|
|
222
222
|
];
|
|
223
223
|
|
package/lib/installer.js
CHANGED
|
@@ -90,12 +90,15 @@ async function generateSkillsManifest(installPath, agent) {
|
|
|
90
90
|
async function updateAgentInstructions(agent, projectRoot) {
|
|
91
91
|
if (!agent.instructionFiles || agent.instructionFiles.length === 0) return;
|
|
92
92
|
|
|
93
|
+
const agentProjectPath = agent.getProjectPath();
|
|
94
|
+
const relManifestPath = path.relative(process.cwd(), path.join(agentProjectPath, 'MANIFEST.yaml')).replace(/\\/g, '/');
|
|
95
|
+
|
|
93
96
|
const planningInstruction = `
|
|
94
97
|
# AI Agent Skills - Planning Instruction
|
|
95
98
|
|
|
96
99
|
You have access to a library of skills in your skills directory. Before starting any task:
|
|
97
100
|
|
|
98
|
-
1. Read the skill manifest at
|
|
101
|
+
1. Read the skill manifest at ${relManifestPath}
|
|
99
102
|
2. Based on the task description, select which skills are relevant
|
|
100
103
|
3. Read only the selected skill files
|
|
101
104
|
4. Then proceed with the task
|