ma-agents 2.10.0 → 2.12.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
+ "manifestVersion": "1.0.0",
3
+ "agent": "antigravity",
4
+ "scope": "project",
5
+ "skills": {
6
+ "docker-image-signing": {
7
+ "version": "1.0.0",
8
+ "installedAt": "2026-03-01T10:05:53.821Z",
9
+ "updatedAt": "2026-03-01T10:05:53.821Z",
10
+ "installerVersion": "2.10.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
@@ -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/lib/agents.js CHANGED
@@ -32,7 +32,7 @@ const agents = [
32
32
  },
33
33
  fileExtension: '.md',
34
34
  template: 'claude-code',
35
- instructionFiles: ['CLAUDE.md']
35
+ instructionFiles: ['.claude/CLAUDE.md']
36
36
  },
37
37
  {
38
38
  id: 'gemini',
@@ -52,7 +52,7 @@ const agents = [
52
52
  },
53
53
  fileExtension: '.md',
54
54
  template: 'generic',
55
- instructionFiles: [] // Gemini doesn't have a standard project-level instruction file yet
55
+ instructionFiles: ['.gemini/gemini.md']
56
56
  },
57
57
  {
58
58
  id: 'copilot',
@@ -72,7 +72,7 @@ const agents = [
72
72
  },
73
73
  fileExtension: '.md',
74
74
  template: 'generic',
75
- instructionFiles: [] // Copilot uses path-scoped instructions, maybe support .github/instructions/ later
75
+ instructionFiles: ['.github/copilot/copilot.md']
76
76
  },
77
77
  {
78
78
  id: 'kilocode',
@@ -92,7 +92,7 @@ const agents = [
92
92
  },
93
93
  fileExtension: '.md',
94
94
  template: 'generic',
95
- instructionFiles: []
95
+ instructionFiles: ['.kilocode/kilocode.md']
96
96
  },
97
97
  {
98
98
  id: 'cline',
@@ -117,7 +117,7 @@ const agents = [
117
117
  'references': 'docs',
118
118
  'assets': 'templates'
119
119
  },
120
- instructionFiles: ['.clinerules']
120
+ instructionFiles: ['.cline/clinerules.md', '.clinerules']
121
121
  },
122
122
  {
123
123
  id: 'cursor',
@@ -137,14 +137,14 @@ const agents = [
137
137
  },
138
138
  fileExtension: '.md',
139
139
  template: 'generic',
140
- instructionFiles: [] // Cursor uses .cursorrules or individual .mdc files
140
+ instructionFiles: ['.cursor/cursor.md']
141
141
  },
142
142
  {
143
143
  id: 'bmm-sre',
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: []
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: []
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: []
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: []
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
@@ -125,7 +128,7 @@ Do not load skills that are not relevant to the current task.
125
128
  content = wrappedInstruction;
126
129
  }
127
130
 
128
- await fs.writeFile(filePath, content, 'utf-8');
131
+ await fs.outputFile(filePath, content, 'utf-8');
129
132
  console.log(chalk.cyan(` + Updated ${fileName}`));
130
133
  }
131
134
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ma-agents",
3
- "version": "2.10.0",
3
+ "version": "2.12.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": {
File without changes