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.
@@ -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,7 @@
1
+ # skills/MANIFEST.yaml
2
+
3
+ skills:
4
+ - id: docker-image-signing
5
+ file: skills/docker-image-signing/SKILL.md
6
+ description: Automates the signing of Docker images using certificates and Cosign/Notary.
7
+
@@ -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
- agents.forEach(agent => {
55
- console.log(chalk.cyan(` ${agent.id.padEnd(20)}`) + chalk.white(agent.name) + chalk.gray(` v${agent.version} - ${agent.description}`));
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 { agents: chosen } = await prompts({
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: 'agents',
231
- message: 'Select which coding agents to include:',
232
- choices: agents.map(a => ({
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 (!chosen) process.exit(0);
242
- selectedAgentIds = chosen;
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(), '.sre', 'skills'),
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: ['.sre/sre.md']
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(), '.antigravity', 'skills'),
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: ['.antigravity/antigravity.md']
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(), '.devops', 'skills'),
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: ['.devops/devops.md']
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(), '.cyber', 'skills'),
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: ['.cyber/yael.md']
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 skills/MANIFEST.yaml
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ma-agents",
3
- "version": "2.11.0",
3
+ "version": "2.13.0",
4
4
  "description": "NPX tool to install skills for AI coding agents (Claude Code, Gemini, Copilot, Kilocode, Cline, Cursor)",
5
5
  "main": "index.js",
6
6
  "bin": {