specweave 1.0.299 → 1.0.300
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/bin/specweave.js +25 -1
- package/dist/src/cli/commands/scan-plugins.d.ts +12 -0
- package/dist/src/cli/commands/scan-plugins.d.ts.map +1 -0
- package/dist/src/cli/commands/scan-plugins.js +80 -0
- package/dist/src/cli/commands/scan-plugins.js.map +1 -0
- package/dist/src/core/doctor/checkers/installation-health-checker.js +6 -6
- package/dist/src/core/doctor/checkers/installation-health-checker.js.map +1 -1
- package/dist/src/core/skill-security/index.d.ts +9 -0
- package/dist/src/core/skill-security/index.d.ts.map +1 -0
- package/dist/src/core/skill-security/index.js +5 -0
- package/dist/src/core/skill-security/index.js.map +1 -0
- package/dist/src/core/skill-security/parser.d.ts +27 -0
- package/dist/src/core/skill-security/parser.d.ts.map +1 -0
- package/dist/src/core/skill-security/parser.js +55 -0
- package/dist/src/core/skill-security/parser.js.map +1 -0
- package/dist/src/core/skill-security/reporter.d.ts +21 -0
- package/dist/src/core/skill-security/reporter.d.ts.map +1 -0
- package/dist/src/core/skill-security/reporter.js +121 -0
- package/dist/src/core/skill-security/reporter.js.map +1 -0
- package/dist/src/core/skill-security/rules.d.ts +25 -0
- package/dist/src/core/skill-security/rules.d.ts.map +1 -0
- package/dist/src/core/skill-security/rules.js +137 -0
- package/dist/src/core/skill-security/rules.js.map +1 -0
- package/dist/src/core/skill-security/scanner.d.ts +41 -0
- package/dist/src/core/skill-security/scanner.d.ts.map +1 -0
- package/dist/src/core/skill-security/scanner.js +78 -0
- package/dist/src/core/skill-security/scanner.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/hooks/user-prompt-submit.sh +10 -0
- package/plugins/specweave/skills/increment/SKILL.md +8 -2
- package/plugins/specweave/skills/team-lead/SKILL.md +69 -5
package/bin/specweave.js
CHANGED
|
@@ -270,6 +270,18 @@ program
|
|
|
270
270
|
await scanSkillCommand(file, options);
|
|
271
271
|
});
|
|
272
272
|
|
|
273
|
+
// Scan plugins command - Batch security scan of all plugins/*/skills/*/SKILL.md files
|
|
274
|
+
program
|
|
275
|
+
.command('scan-plugins')
|
|
276
|
+
.description('Batch-scan all plugin SKILL.md files for security issues (Gen Agent Trust Hub categories)')
|
|
277
|
+
.option('--json', 'Output results as JSON for CI integration', false)
|
|
278
|
+
.option('--verbose', 'Show per-skill reports in addition to batch summary', false)
|
|
279
|
+
.option('--dir <path>', 'Path to plugins directory (default: ./plugins)')
|
|
280
|
+
.action(async (options) => {
|
|
281
|
+
const { scanPluginsCommand } = await import('../dist/src/cli/commands/scan-plugins.js');
|
|
282
|
+
await scanPluginsCommand(options);
|
|
283
|
+
});
|
|
284
|
+
|
|
273
285
|
// Judge skill command - Combined Tier 1 + Tier 2 LLM security analysis
|
|
274
286
|
program
|
|
275
287
|
.command('judge-skill <file>')
|
|
@@ -1011,6 +1023,18 @@ program
|
|
|
1011
1023
|
await refreshMarketplaceCommand(options);
|
|
1012
1024
|
});
|
|
1013
1025
|
|
|
1026
|
+
// Refresh plugins command - Copy first-party plugins to ~/.claude/commands/
|
|
1027
|
+
program
|
|
1028
|
+
.command('refresh-plugins')
|
|
1029
|
+
.description('Copy SpecWeave plugins to ~/.claude/commands/ (lazy mode by default - core only)')
|
|
1030
|
+
.option('--all', 'Install ALL plugins (not just core)')
|
|
1031
|
+
.option('-f, --force', 'Force reinstall (skip hash check)')
|
|
1032
|
+
.option('-v, --verbose', 'Show skipped plugins')
|
|
1033
|
+
.action(async (options) => {
|
|
1034
|
+
const { refreshPluginsCommand } = await import('../dist/src/cli/commands/refresh-plugins.js');
|
|
1035
|
+
await refreshPluginsCommand(options);
|
|
1036
|
+
});
|
|
1037
|
+
|
|
1014
1038
|
// Doctor command - Comprehensive health check
|
|
1015
1039
|
program
|
|
1016
1040
|
.command('doctor')
|
|
@@ -1019,7 +1043,7 @@ program
|
|
|
1019
1043
|
.option('--json', 'Output as JSON')
|
|
1020
1044
|
.option('--quick', 'Skip slow checks (network, hook execution)')
|
|
1021
1045
|
.option('--skip-external', 'Skip external tool connectivity checks')
|
|
1022
|
-
.option('--fix', '
|
|
1046
|
+
.option('--fix', 'Apply inline fixes (remove ghost files, stale cache, update lockfile hashes)')
|
|
1023
1047
|
.action(async (options) => {
|
|
1024
1048
|
const { doctor } = await import('../dist/src/cli/commands/doctor.js');
|
|
1025
1049
|
const report = await doctor(process.cwd(), {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: specweave scan-plugins [pluginsDir]
|
|
3
|
+
* Batch-scans all plugins/{name}/skills/{name}/SKILL.md files for security issues.
|
|
4
|
+
*/
|
|
5
|
+
interface ScanPluginsOptions {
|
|
6
|
+
json?: boolean;
|
|
7
|
+
verbose?: boolean;
|
|
8
|
+
dir?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function scanPluginsCommand(options?: ScanPluginsOptions): Promise<void>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=scan-plugins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-plugins.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/scan-plugins.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAiCD,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDxF"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: specweave scan-plugins [pluginsDir]
|
|
3
|
+
* Batch-scans all plugins/{name}/skills/{name}/SKILL.md files for security issues.
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { scanSkillMd } from '../../core/skill-security/scanner.js';
|
|
9
|
+
import { printScanReport, printBatchReport, toBatchJson } from '../../core/skill-security/reporter.js';
|
|
10
|
+
/**
|
|
11
|
+
* Discover all SKILL.md files under pluginsDir (plugins/{name}/skills/{name}/SKILL.md).
|
|
12
|
+
*/
|
|
13
|
+
function discoverSkillFiles(pluginsDir) {
|
|
14
|
+
const files = [];
|
|
15
|
+
if (!fs.existsSync(pluginsDir))
|
|
16
|
+
return files;
|
|
17
|
+
const plugins = fs.readdirSync(pluginsDir, { withFileTypes: true })
|
|
18
|
+
.filter(e => e.isDirectory())
|
|
19
|
+
.map(e => path.join(pluginsDir, e.name));
|
|
20
|
+
for (const pluginDir of plugins) {
|
|
21
|
+
const skillsDir = path.join(pluginDir, 'skills');
|
|
22
|
+
if (!fs.existsSync(skillsDir))
|
|
23
|
+
continue;
|
|
24
|
+
const skills = fs.readdirSync(skillsDir, { withFileTypes: true })
|
|
25
|
+
.filter(e => e.isDirectory())
|
|
26
|
+
.map(e => path.join(skillsDir, e.name));
|
|
27
|
+
for (const skillDir of skills) {
|
|
28
|
+
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
29
|
+
if (fs.existsSync(skillFile)) {
|
|
30
|
+
files.push(skillFile);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return files.sort();
|
|
35
|
+
}
|
|
36
|
+
export async function scanPluginsCommand(options = {}) {
|
|
37
|
+
// Determine plugins directory
|
|
38
|
+
const cwd = process.cwd();
|
|
39
|
+
const pluginsDir = options.dir ?? path.join(cwd, 'plugins');
|
|
40
|
+
if (!fs.existsSync(pluginsDir)) {
|
|
41
|
+
console.error(chalk.red(`Error: plugins directory not found: ${pluginsDir}`));
|
|
42
|
+
console.error(chalk.dim('Run this command from the specweave project root, or use --dir <path>.'));
|
|
43
|
+
process.exit(1);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const skillFiles = discoverSkillFiles(pluginsDir);
|
|
47
|
+
if (skillFiles.length === 0) {
|
|
48
|
+
console.error(chalk.yellow('No SKILL.md files found under: ' + pluginsDir));
|
|
49
|
+
process.exit(0);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
console.log(chalk.dim(`\n Found ${skillFiles.length} SKILL.md files to scan...\n`));
|
|
53
|
+
const entries = [];
|
|
54
|
+
for (const file of skillFiles) {
|
|
55
|
+
const content = fs.readFileSync(file, 'utf-8');
|
|
56
|
+
const result = scanSkillMd(content);
|
|
57
|
+
entries.push({ file, result });
|
|
58
|
+
if (options.verbose && result.findings.length > 0) {
|
|
59
|
+
printScanReport(file, result);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (options.json) {
|
|
63
|
+
console.log(toBatchJson(entries));
|
|
64
|
+
const hasFailure = entries.some(e => e.result.exitCode === 2);
|
|
65
|
+
if (hasFailure)
|
|
66
|
+
process.exit(2);
|
|
67
|
+
const hasWarnings = entries.some(e => e.result.exitCode === 1);
|
|
68
|
+
if (hasWarnings)
|
|
69
|
+
process.exit(1);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
printBatchReport(entries);
|
|
73
|
+
const hasFailure = entries.some(e => e.result.exitCode === 2);
|
|
74
|
+
if (hasFailure)
|
|
75
|
+
process.exit(2);
|
|
76
|
+
const hasWarnings = entries.some(e => e.result.exitCode === 1);
|
|
77
|
+
if (hasWarnings)
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=scan-plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-plugins.js","sourceRoot":"","sources":["../../../../src/cli/commands/scan-plugins.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AASvG;;GAEG;AACH,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAE7C,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAChE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE3C,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QAExC,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAC9D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAE1C,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAClD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAA8B,EAAE;IACvE,8BAA8B;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAE5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC,CAAC;QACnG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAElD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,iCAAiC,GAAG,UAAU,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,UAAU,CAAC,MAAM,8BAA8B,CAAC,CAAC,CAAC;IAErF,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAE/B,IAAI,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;QAC9D,IAAI,UAAU;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;QAC/D,IAAI,WAAW;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE1B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;IAC9D,IAAI,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEhC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;IAC/D,IAAI,WAAW;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -192,21 +192,21 @@ export class InstallationHealthChecker {
|
|
|
192
192
|
if (missing.length > 0) {
|
|
193
193
|
if (fix) {
|
|
194
194
|
try {
|
|
195
|
-
execSync('specweave
|
|
195
|
+
execSync('specweave refresh-plugins', { stdio: 'pipe' });
|
|
196
196
|
return {
|
|
197
197
|
name: 'Lockfile integrity',
|
|
198
198
|
status: 'warn',
|
|
199
|
-
message: `${missing.length} skill(s) were missing, ran
|
|
199
|
+
message: `${missing.length} skill(s) were missing, ran refresh-plugins`,
|
|
200
200
|
details: missing.map(m => `Missing: ${m}`),
|
|
201
|
-
fixSuggestion: 'Ran: specweave
|
|
201
|
+
fixSuggestion: 'Ran: specweave refresh-plugins',
|
|
202
202
|
};
|
|
203
203
|
}
|
|
204
204
|
catch (err) {
|
|
205
205
|
return {
|
|
206
206
|
name: 'Lockfile integrity',
|
|
207
207
|
status: 'fail',
|
|
208
|
-
message: `
|
|
209
|
-
fixSuggestion: 'Run: specweave
|
|
208
|
+
message: `refresh-plugins failed: ${err instanceof Error ? err.message : 'unknown error'}`,
|
|
209
|
+
fixSuggestion: 'Run: specweave refresh-plugins',
|
|
210
210
|
};
|
|
211
211
|
}
|
|
212
212
|
}
|
|
@@ -215,7 +215,7 @@ export class InstallationHealthChecker {
|
|
|
215
215
|
status: 'fail',
|
|
216
216
|
message: `${missing.length} skill(s) missing from commands dir`,
|
|
217
217
|
details: missing.map(m => `Missing: ${m}`),
|
|
218
|
-
fixSuggestion: 'Run: specweave
|
|
218
|
+
fixSuggestion: 'Run: specweave refresh-plugins',
|
|
219
219
|
};
|
|
220
220
|
}
|
|
221
221
|
if (mismatches.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installation-health-checker.js","sourceRoot":"","sources":["../../../../../src/core/doctor/checkers/installation-health-checker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"installation-health-checker.js","sourceRoot":"","sources":["../../../../../src/core/doctor/checkers/installation-health-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { SKILL_SECURITY_RULES } from './rules.js';
|
|
2
|
+
export type { SkillSecurityRule } from './rules.js';
|
|
3
|
+
export { extractCodeBlocks, extractBashBlocks } from './parser.js';
|
|
4
|
+
export type { CodeBlock } from './parser.js';
|
|
5
|
+
export { scanSkillMd } from './scanner.js';
|
|
6
|
+
export type { SkillFinding, SkillScanResult } from './scanner.js';
|
|
7
|
+
export { printScanReport, printBatchReport, toBatchJson } from './reporter.js';
|
|
8
|
+
export type { BatchScanEntry } from './reporter.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/skill-security/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { SKILL_SECURITY_RULES } from './rules.js';
|
|
2
|
+
export { extractCodeBlocks, extractBashBlocks } from './parser.js';
|
|
3
|
+
export { scanSkillMd } from './scanner.js';
|
|
4
|
+
export { printScanReport, printBatchReport, toBatchJson } from './reporter.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/skill-security/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SKILL.md parser — extracts fenced code blocks with line numbers.
|
|
3
|
+
*/
|
|
4
|
+
export interface CodeBlock {
|
|
5
|
+
/** Language specifier (e.g., "bash", "sh", "shell") */
|
|
6
|
+
lang: string;
|
|
7
|
+
/** Code block content (without fence lines) */
|
|
8
|
+
content: string;
|
|
9
|
+
/** 1-based line number of the opening fence (``` lang) */
|
|
10
|
+
startLine: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Extracts all fenced code blocks from markdown content.
|
|
14
|
+
*
|
|
15
|
+
* Given:
|
|
16
|
+
* ```bash
|
|
17
|
+
* curl $URL
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* Returns: [{ lang: "bash", content: "curl $URL\n", startLine: 1 }]
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractCodeBlocks(markdown: string): CodeBlock[];
|
|
23
|
+
/**
|
|
24
|
+
* Returns only bash/shell code blocks (lang is "bash", "sh", "shell", or empty).
|
|
25
|
+
*/
|
|
26
|
+
export declare function extractBashBlocks(markdown: string): CodeBlock[];
|
|
27
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../src/core/skill-security/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAsC/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAI/D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SKILL.md parser — extracts fenced code blocks with line numbers.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Extracts all fenced code blocks from markdown content.
|
|
6
|
+
*
|
|
7
|
+
* Given:
|
|
8
|
+
* ```bash
|
|
9
|
+
* curl $URL
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* Returns: [{ lang: "bash", content: "curl $URL\n", startLine: 1 }]
|
|
13
|
+
*/
|
|
14
|
+
export function extractCodeBlocks(markdown) {
|
|
15
|
+
const lines = markdown.split('\n');
|
|
16
|
+
const blocks = [];
|
|
17
|
+
let inBlock = false;
|
|
18
|
+
let currentLang = '';
|
|
19
|
+
let currentLines = [];
|
|
20
|
+
let blockStartLine = 0;
|
|
21
|
+
for (let i = 0; i < lines.length; i++) {
|
|
22
|
+
const line = lines[i];
|
|
23
|
+
const fenceMatch = line.match(/^```(\w*)\s*$/);
|
|
24
|
+
if (!inBlock && fenceMatch) {
|
|
25
|
+
inBlock = true;
|
|
26
|
+
currentLang = fenceMatch[1] || '';
|
|
27
|
+
currentLines = [];
|
|
28
|
+
blockStartLine = i + 1; // 1-based
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (inBlock) {
|
|
32
|
+
if (/^```\s*$/.test(line)) {
|
|
33
|
+
blocks.push({
|
|
34
|
+
lang: currentLang,
|
|
35
|
+
content: currentLines.join('\n'),
|
|
36
|
+
startLine: blockStartLine,
|
|
37
|
+
});
|
|
38
|
+
inBlock = false;
|
|
39
|
+
currentLang = '';
|
|
40
|
+
currentLines = [];
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
currentLines.push(line);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return blocks;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Returns only bash/shell code blocks (lang is "bash", "sh", "shell", or empty).
|
|
51
|
+
*/
|
|
52
|
+
export function extractBashBlocks(markdown) {
|
|
53
|
+
return extractCodeBlocks(markdown).filter(b => ['bash', 'sh', 'shell', ''].includes(b.lang.toLowerCase()));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../src/core/skill-security/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAE/C,IAAI,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;YAC3B,OAAO,GAAG,IAAI,CAAC;YACf,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,YAAY,GAAG,EAAE,CAAC;YAClB,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU;YAClC,SAAS;QACX,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;oBAChC,SAAS,EAAE,cAAc;iBAC1B,CAAC,CAAC;gBACH,OAAO,GAAG,KAAK,CAAC;gBAChB,WAAW,GAAG,EAAE,CAAC;gBACjB,YAAY,GAAG,EAAE,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAChE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report formatter for SKILL.md security scan results.
|
|
3
|
+
*/
|
|
4
|
+
import type { SkillScanResult } from './scanner.js';
|
|
5
|
+
export interface BatchScanEntry {
|
|
6
|
+
file: string;
|
|
7
|
+
result: SkillScanResult;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Print a human-readable scan report for a single file.
|
|
11
|
+
*/
|
|
12
|
+
export declare function printScanReport(file: string, result: SkillScanResult): void;
|
|
13
|
+
/**
|
|
14
|
+
* Print a batch scan summary table.
|
|
15
|
+
*/
|
|
16
|
+
export declare function printBatchReport(entries: BatchScanEntry[]): void;
|
|
17
|
+
/**
|
|
18
|
+
* Serialize batch results to JSON for CI integration.
|
|
19
|
+
*/
|
|
20
|
+
export declare function toBatchJson(entries: BatchScanEntry[]): string;
|
|
21
|
+
//# sourceMappingURL=reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../../../src/core/skill-security/reporter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAgB,eAAe,EAAE,MAAM,cAAc,CAAC;AAUlE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAqC3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CA2ChE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAY7D"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report formatter for SKILL.md security scan results.
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
const SEVERITY_COLORS = {
|
|
6
|
+
critical: chalk.bgRed.white.bold,
|
|
7
|
+
high: chalk.red.bold,
|
|
8
|
+
medium: chalk.yellow,
|
|
9
|
+
low: chalk.blue,
|
|
10
|
+
info: chalk.dim,
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Print a human-readable scan report for a single file.
|
|
14
|
+
*/
|
|
15
|
+
export function printScanReport(file, result) {
|
|
16
|
+
console.log('');
|
|
17
|
+
console.log(chalk.bold(` Scanning: ${file}`));
|
|
18
|
+
console.log(chalk.dim(' ' + '─'.repeat(50)));
|
|
19
|
+
if (result.findings.length === 0) {
|
|
20
|
+
console.log(chalk.green.bold('\n PASSED — No findings\n'));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// Group by severity
|
|
24
|
+
const bySeverity = groupBySeverity(result.findings);
|
|
25
|
+
const order = ['critical', 'high', 'medium', 'low', 'info'];
|
|
26
|
+
for (const sev of order) {
|
|
27
|
+
const findings = bySeverity[sev];
|
|
28
|
+
if (!findings?.length)
|
|
29
|
+
continue;
|
|
30
|
+
const colorFn = SEVERITY_COLORS[sev] || chalk.white;
|
|
31
|
+
console.log(`\n ${colorFn(` ${sev.toUpperCase()} `)} (${findings.length})`);
|
|
32
|
+
for (const f of findings) {
|
|
33
|
+
console.log(` ${chalk.dim('•')} [${chalk.cyan(f.ruleId)}] ${f.message}`);
|
|
34
|
+
console.log(` ${chalk.dim(`line ${f.line}:`)} ${chalk.italic(f.matchedText.slice(0, 80))}`);
|
|
35
|
+
console.log(` ${chalk.dim('fix:')} ${f.suggestedFix}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
console.log('');
|
|
39
|
+
console.log(chalk.dim(' ' + '─'.repeat(50)));
|
|
40
|
+
const counts = getSeverityCounts(result.findings);
|
|
41
|
+
if (result.passed) {
|
|
42
|
+
const total = result.findings.length;
|
|
43
|
+
console.log(chalk.yellow.bold(' CONCERNS') + chalk.dim(` — ${total} finding(s) (no critical/high)`));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log(chalk.red.bold(' FAILED') + ` — ${counts.critical} critical, ${counts.high} high finding(s)`);
|
|
47
|
+
}
|
|
48
|
+
console.log('');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Print a batch scan summary table.
|
|
52
|
+
*/
|
|
53
|
+
export function printBatchReport(entries) {
|
|
54
|
+
console.log('');
|
|
55
|
+
console.log(chalk.bold(' Plugin Security Scan — Batch Report'));
|
|
56
|
+
console.log(chalk.dim(' ' + '═'.repeat(70)));
|
|
57
|
+
let totalFindings = 0;
|
|
58
|
+
let failCount = 0;
|
|
59
|
+
let warnCount = 0;
|
|
60
|
+
let passCount = 0;
|
|
61
|
+
for (const { file, result } of entries) {
|
|
62
|
+
const counts = getSeverityCounts(result.findings);
|
|
63
|
+
totalFindings += result.findings.length;
|
|
64
|
+
const shortName = file.replace(/^.*plugins\//, '').replace(/\/SKILL\.md$/, '');
|
|
65
|
+
const status = result.exitCode === 0
|
|
66
|
+
? chalk.green('PASS')
|
|
67
|
+
: result.exitCode === 1
|
|
68
|
+
? chalk.yellow('WARN')
|
|
69
|
+
: chalk.red('FAIL');
|
|
70
|
+
const breakdown = result.findings.length === 0
|
|
71
|
+
? chalk.dim('no findings')
|
|
72
|
+
: [
|
|
73
|
+
counts.critical > 0 ? chalk.red(`${counts.critical}C`) : '',
|
|
74
|
+
counts.high > 0 ? chalk.red(`${counts.high}H`) : '',
|
|
75
|
+
counts.medium > 0 ? chalk.yellow(`${counts.medium}M`) : '',
|
|
76
|
+
counts.low > 0 ? chalk.blue(`${counts.low}L`) : '',
|
|
77
|
+
].filter(Boolean).join(' ');
|
|
78
|
+
console.log(` ${status} ${chalk.bold(shortName.padEnd(45))} ${breakdown}`);
|
|
79
|
+
if (result.exitCode === 2)
|
|
80
|
+
failCount++;
|
|
81
|
+
else if (result.exitCode === 1)
|
|
82
|
+
warnCount++;
|
|
83
|
+
else
|
|
84
|
+
passCount++;
|
|
85
|
+
}
|
|
86
|
+
console.log(chalk.dim(' ' + '─'.repeat(70)));
|
|
87
|
+
console.log(` ${chalk.green(`${passCount} pass`)} ${chalk.yellow(`${warnCount} warn`)} ${chalk.red(`${failCount} fail`)}` +
|
|
88
|
+
chalk.dim(` (${totalFindings} total findings across ${entries.length} skills)`));
|
|
89
|
+
console.log('');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Serialize batch results to JSON for CI integration.
|
|
93
|
+
*/
|
|
94
|
+
export function toBatchJson(entries) {
|
|
95
|
+
return JSON.stringify(entries.map(({ file, result }) => ({
|
|
96
|
+
file,
|
|
97
|
+
exitCode: result.exitCode,
|
|
98
|
+
passed: result.passed,
|
|
99
|
+
findings: result.findings,
|
|
100
|
+
counts: getSeverityCounts(result.findings),
|
|
101
|
+
})), null, 2);
|
|
102
|
+
}
|
|
103
|
+
function groupBySeverity(findings) {
|
|
104
|
+
const map = {};
|
|
105
|
+
for (const f of findings) {
|
|
106
|
+
if (!map[f.severity])
|
|
107
|
+
map[f.severity] = [];
|
|
108
|
+
map[f.severity].push(f);
|
|
109
|
+
}
|
|
110
|
+
return map;
|
|
111
|
+
}
|
|
112
|
+
function getSeverityCounts(findings) {
|
|
113
|
+
return {
|
|
114
|
+
critical: findings.filter(f => f.severity === 'critical').length,
|
|
115
|
+
high: findings.filter(f => f.severity === 'high').length,
|
|
116
|
+
medium: findings.filter(f => f.severity === 'medium').length,
|
|
117
|
+
low: findings.filter(f => f.severity === 'low').length,
|
|
118
|
+
info: findings.filter(f => f.severity === 'info').length,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../../src/core/skill-security/reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured detection rules for SKILL.md self-scan.
|
|
3
|
+
* Maps to Gen Agent Trust Hub audit categories.
|
|
4
|
+
*/
|
|
5
|
+
export interface SkillSecurityRule {
|
|
6
|
+
/** Unique rule identifier (Gen Agent Trust Hub category) */
|
|
7
|
+
id: string;
|
|
8
|
+
/** Finding category label */
|
|
9
|
+
category: string;
|
|
10
|
+
/** Severity level */
|
|
11
|
+
severity: 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
12
|
+
/** Regex pattern to match against content */
|
|
13
|
+
pattern: RegExp;
|
|
14
|
+
/** Human-readable description of the finding */
|
|
15
|
+
message: string;
|
|
16
|
+
/** Actionable fix suggestion */
|
|
17
|
+
suggestedFix: string;
|
|
18
|
+
/** If true, only scan inside bash/shell code blocks */
|
|
19
|
+
codeBlockOnly?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* All detection rules, ordered by severity (medium → low)
|
|
23
|
+
*/
|
|
24
|
+
export declare const SKILL_SECURITY_RULES: SkillSecurityRule[];
|
|
25
|
+
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../../src/core/skill-security/rules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IACX,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC1D,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAiID;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAKnD,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured detection rules for SKILL.md self-scan.
|
|
3
|
+
* Maps to Gen Agent Trust Hub audit categories.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* CREDENTIALS_UNSAFE (MEDIUM)
|
|
7
|
+
* Skills that instruct agents to collect or write secrets.
|
|
8
|
+
*/
|
|
9
|
+
const CREDENTIALS_UNSAFE_RULES = [
|
|
10
|
+
{
|
|
11
|
+
id: 'CREDENTIALS_UNSAFE',
|
|
12
|
+
category: 'credentials-unsafe',
|
|
13
|
+
severity: 'medium',
|
|
14
|
+
pattern: /cat\s+>>?\s*\.env|echo\s+\w+=.*>>?\s*\.env|>>?\s*\.env\b/,
|
|
15
|
+
message: 'CREDENTIALS_UNSAFE: Bash snippet writes to .env file',
|
|
16
|
+
suggestedFix: 'Skills should only CHECK for credential presence (e.g., grep -q KEY .env), never write or append secrets.',
|
|
17
|
+
codeBlockOnly: true,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: 'CREDENTIALS_UNSAFE',
|
|
21
|
+
category: 'credentials-unsafe',
|
|
22
|
+
severity: 'medium',
|
|
23
|
+
pattern: /echo\s+[A-Z_][A-Z0-9_]*=/,
|
|
24
|
+
message: 'CREDENTIALS_UNSAFE: Bash snippet echoes a secret variable assignment',
|
|
25
|
+
suggestedFix: 'Avoid echoing credential assignments. Use grep -q to check if a key already exists.',
|
|
26
|
+
codeBlockOnly: true,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 'CREDENTIALS_UNSAFE',
|
|
30
|
+
category: 'credentials-unsafe',
|
|
31
|
+
severity: 'medium',
|
|
32
|
+
pattern: /(?:please\s+)?(?:provide|enter|share|give|ask\s+for|supply|add)\s+(?:your\s+)?(?:api\s+)?(?:token|secret|key|password|credential|auth)/i,
|
|
33
|
+
message: 'CREDENTIALS_UNSAFE: Skill instructs agent to prompt user for secrets',
|
|
34
|
+
suggestedFix: 'Check for credential presence via environment variables or config files; never ask the user to type secrets.',
|
|
35
|
+
codeBlockOnly: false,
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* DATA_EXFILTRATION (MEDIUM)
|
|
40
|
+
* Skills that read secrets and transmit to user-controlled destinations.
|
|
41
|
+
*/
|
|
42
|
+
const DATA_EXFILTRATION_RULES = [
|
|
43
|
+
{
|
|
44
|
+
id: 'DATA_EXFILTRATION',
|
|
45
|
+
category: 'data-exfiltration',
|
|
46
|
+
severity: 'medium',
|
|
47
|
+
pattern: /\bcurl\b[^\n]*\$\{?[A-Za-z_]\w*\}?/,
|
|
48
|
+
message: 'DATA_EXFILTRATION: curl uses a variable URL without domain validation',
|
|
49
|
+
suggestedFix: 'Validate domain strictly (allowlist of known-safe hostnames), enforce HTTPS-only, and prevent SSRF (block localhost/private IPs).',
|
|
50
|
+
codeBlockOnly: true,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: 'DATA_EXFILTRATION',
|
|
54
|
+
category: 'data-exfiltration',
|
|
55
|
+
severity: 'medium',
|
|
56
|
+
pattern: /\bfetch\s*\(\s*\$\{?[A-Za-z_]\w*\}?/,
|
|
57
|
+
message: 'DATA_EXFILTRATION: fetch() uses a variable URL without domain validation',
|
|
58
|
+
suggestedFix: 'Validate the URL against an allowlist of known-safe domains before making the request.',
|
|
59
|
+
codeBlockOnly: true,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'DATA_EXFILTRATION',
|
|
63
|
+
category: 'data-exfiltration',
|
|
64
|
+
severity: 'medium',
|
|
65
|
+
pattern: /https?:\/\/\*\.|domain\s*validation\s*allows\s*wildcards/i,
|
|
66
|
+
message: 'DATA_EXFILTRATION: Domain validation allows wildcards (potential SSRF)',
|
|
67
|
+
suggestedFix: 'Use strict hostname allowlists. Wildcards in domain validation enable SSRF attacks.',
|
|
68
|
+
codeBlockOnly: false,
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
/**
|
|
72
|
+
* COMMAND_EXECUTION (LOW)
|
|
73
|
+
* Bash snippets with unquoted variable interpolation or dynamic shell execution.
|
|
74
|
+
*/
|
|
75
|
+
const COMMAND_EXECUTION_RULES = [
|
|
76
|
+
{
|
|
77
|
+
id: 'COMMAND_EXECUTION',
|
|
78
|
+
category: 'command-execution',
|
|
79
|
+
severity: 'low',
|
|
80
|
+
pattern: /\b(?:eval|source)\s+\$[A-Za-z_]/,
|
|
81
|
+
message: 'COMMAND_EXECUTION: eval/source with variable argument enables arbitrary code execution',
|
|
82
|
+
suggestedFix: 'Avoid eval/source with variable arguments. Use explicit paths or validated input.',
|
|
83
|
+
codeBlockOnly: true,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: 'COMMAND_EXECUTION',
|
|
87
|
+
category: 'command-execution',
|
|
88
|
+
severity: 'low',
|
|
89
|
+
pattern: /\bsh\s+-c\s+["']?\$[A-Za-z_]/,
|
|
90
|
+
message: 'COMMAND_EXECUTION: sh -c with unquoted variable input enables shell injection',
|
|
91
|
+
suggestedFix: 'Pass sh -c arguments as array elements, not interpolated strings. Validate all dynamic input before execution.',
|
|
92
|
+
codeBlockOnly: true,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: 'COMMAND_EXECUTION',
|
|
96
|
+
category: 'command-execution',
|
|
97
|
+
severity: 'low',
|
|
98
|
+
pattern: /\b\w[\w-]+\s+\$[A-Z_][A-Z0-9_]*\b(?!\s*=)/,
|
|
99
|
+
message: 'COMMAND_EXECUTION: Command uses unquoted variable argument (risk of word splitting/globbing)',
|
|
100
|
+
suggestedFix: 'Double-quote all variable references: use "$VARIABLE" instead of $VARIABLE in command arguments.',
|
|
101
|
+
codeBlockOnly: true,
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
/**
|
|
105
|
+
* PROMPT_INJECTION (LOW)
|
|
106
|
+
* User input interpolated without boundary markers or sanitization.
|
|
107
|
+
*/
|
|
108
|
+
const PROMPT_INJECTION_RULES = [
|
|
109
|
+
{
|
|
110
|
+
id: 'PROMPT_INJECTION',
|
|
111
|
+
category: 'prompt-injection',
|
|
112
|
+
severity: 'low',
|
|
113
|
+
pattern: /\$\{?(?:USER_INPUT|USER_QUERY|INPUT|QUERY|REQUEST|USER_DATA|UNTRUSTED|RAW_INPUT)\}?/i,
|
|
114
|
+
message: 'PROMPT_INJECTION: User-supplied input variable interpolated without sanitization',
|
|
115
|
+
suggestedFix: 'Validate input against an allowlist regex before use. Add boundary markers (e.g., "--- USER INPUT ---") to separate trusted from untrusted content.',
|
|
116
|
+
codeBlockOnly: false,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: 'PROMPT_INJECTION',
|
|
120
|
+
category: 'prompt-injection',
|
|
121
|
+
severity: 'low',
|
|
122
|
+
pattern: /\{\{[^}]+\}\}.*without\s+(?:sanitiz|validat|escap)/i,
|
|
123
|
+
message: 'PROMPT_INJECTION: Template interpolation without sanitization noted',
|
|
124
|
+
suggestedFix: 'Add explicit sanitization or validation before interpolating dynamic content.',
|
|
125
|
+
codeBlockOnly: false,
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
/**
|
|
129
|
+
* All detection rules, ordered by severity (medium → low)
|
|
130
|
+
*/
|
|
131
|
+
export const SKILL_SECURITY_RULES = [
|
|
132
|
+
...CREDENTIALS_UNSAFE_RULES,
|
|
133
|
+
...DATA_EXFILTRATION_RULES,
|
|
134
|
+
...COMMAND_EXECUTION_RULES,
|
|
135
|
+
...PROMPT_INJECTION_RULES,
|
|
136
|
+
];
|
|
137
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../../src/core/skill-security/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SKILL.md self-scan scanner.
|
|
3
|
+
* Applies detection rules against SKILL.md content and bash code blocks.
|
|
4
|
+
*/
|
|
5
|
+
import { SkillSecurityRule } from './rules.js';
|
|
6
|
+
export interface SkillFinding {
|
|
7
|
+
/** Rule identifier (e.g., "CREDENTIALS_UNSAFE") */
|
|
8
|
+
ruleId: string;
|
|
9
|
+
/** Finding category */
|
|
10
|
+
category: string;
|
|
11
|
+
/** Severity level */
|
|
12
|
+
severity: 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
13
|
+
/** Human-readable finding description */
|
|
14
|
+
message: string;
|
|
15
|
+
/** Suggested fix */
|
|
16
|
+
suggestedFix: string;
|
|
17
|
+
/** 1-based line number in the original file */
|
|
18
|
+
line: number;
|
|
19
|
+
/** The matched text snippet */
|
|
20
|
+
matchedText: string;
|
|
21
|
+
}
|
|
22
|
+
export interface SkillScanResult {
|
|
23
|
+
/**
|
|
24
|
+
* Exit code:
|
|
25
|
+
* 0 = pass (no findings)
|
|
26
|
+
* 1 = concerns (medium or low only)
|
|
27
|
+
* 2 = fail (critical or high)
|
|
28
|
+
*/
|
|
29
|
+
exitCode: 0 | 1 | 2;
|
|
30
|
+
/** Whether the scan passed (no critical/high findings) */
|
|
31
|
+
passed: boolean;
|
|
32
|
+
/** All findings */
|
|
33
|
+
findings: SkillFinding[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Scan SKILL.md content using structured detection rules.
|
|
37
|
+
* Rules marked `codeBlockOnly: true` only apply inside bash code blocks.
|
|
38
|
+
* Other rules apply to the full markdown content.
|
|
39
|
+
*/
|
|
40
|
+
export declare function scanSkillMd(content: string, rules?: SkillSecurityRule[]): SkillScanResult;
|
|
41
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../../src/core/skill-security/scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAwB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGrE,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC1D,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;IAChB,mBAAmB;IACnB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,iBAAiB,EAAyB,GAAG,eAAe,CAwE/G"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SKILL.md self-scan scanner.
|
|
3
|
+
* Applies detection rules against SKILL.md content and bash code blocks.
|
|
4
|
+
*/
|
|
5
|
+
import { SKILL_SECURITY_RULES } from './rules.js';
|
|
6
|
+
import { extractBashBlocks } from './parser.js';
|
|
7
|
+
/**
|
|
8
|
+
* Scan SKILL.md content using structured detection rules.
|
|
9
|
+
* Rules marked `codeBlockOnly: true` only apply inside bash code blocks.
|
|
10
|
+
* Other rules apply to the full markdown content.
|
|
11
|
+
*/
|
|
12
|
+
export function scanSkillMd(content, rules = SKILL_SECURITY_RULES) {
|
|
13
|
+
const findings = [];
|
|
14
|
+
const allLines = content.split('\n');
|
|
15
|
+
// Build a set of line ranges for bash code blocks (1-based)
|
|
16
|
+
const bashBlocks = extractBashBlocks(content);
|
|
17
|
+
const bashBlockLines = new Set();
|
|
18
|
+
for (const block of bashBlocks) {
|
|
19
|
+
const blockLineCount = block.content.split('\n').length;
|
|
20
|
+
for (let offset = 0; offset < blockLineCount; offset++) {
|
|
21
|
+
bashBlockLines.add(block.startLine + 1 + offset); // +1 because startLine is the fence
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Separate rules by scope
|
|
25
|
+
const codeOnlyRules = rules.filter(r => r.codeBlockOnly);
|
|
26
|
+
const fullContentRules = rules.filter(r => !r.codeBlockOnly);
|
|
27
|
+
// Apply full-content rules to every line
|
|
28
|
+
for (let i = 0; i < allLines.length; i++) {
|
|
29
|
+
const line = allLines[i];
|
|
30
|
+
const lineNum = i + 1;
|
|
31
|
+
for (const rule of fullContentRules) {
|
|
32
|
+
if (rule.pattern.test(line)) {
|
|
33
|
+
const match = line.match(rule.pattern);
|
|
34
|
+
findings.push({
|
|
35
|
+
ruleId: rule.id,
|
|
36
|
+
category: rule.category,
|
|
37
|
+
severity: rule.severity,
|
|
38
|
+
message: rule.message,
|
|
39
|
+
suggestedFix: rule.suggestedFix,
|
|
40
|
+
line: lineNum,
|
|
41
|
+
matchedText: match?.[0] ?? line.trim().slice(0, 60),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Apply code-block-only rules to lines inside bash blocks
|
|
47
|
+
for (let i = 0; i < allLines.length; i++) {
|
|
48
|
+
const lineNum = i + 1;
|
|
49
|
+
if (!bashBlockLines.has(lineNum))
|
|
50
|
+
continue;
|
|
51
|
+
const line = allLines[i];
|
|
52
|
+
for (const rule of codeOnlyRules) {
|
|
53
|
+
if (rule.pattern.test(line)) {
|
|
54
|
+
const match = line.match(rule.pattern);
|
|
55
|
+
findings.push({
|
|
56
|
+
ruleId: rule.id,
|
|
57
|
+
category: rule.category,
|
|
58
|
+
severity: rule.severity,
|
|
59
|
+
message: rule.message,
|
|
60
|
+
suggestedFix: rule.suggestedFix,
|
|
61
|
+
line: lineNum,
|
|
62
|
+
matchedText: match?.[0] ?? line.trim().slice(0, 60),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Sort findings by line number
|
|
68
|
+
findings.sort((a, b) => a.line - b.line);
|
|
69
|
+
const hasCriticalOrHigh = findings.some(f => f.severity === 'critical' || f.severity === 'high');
|
|
70
|
+
const hasAny = findings.length > 0;
|
|
71
|
+
const exitCode = hasCriticalOrHigh ? 2 : hasAny ? 1 : 0;
|
|
72
|
+
return {
|
|
73
|
+
exitCode,
|
|
74
|
+
passed: !hasCriticalOrHigh,
|
|
75
|
+
findings,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../../src/core/skill-security/scanner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.300",
|
|
4
4
|
"description": "Spec-driven development framework for AI coding agents. Works with Claude Code, Codex, Antigravity, Cursor, Copilot & more. 100+ skills, 49 CLI commands, verified skill certification, autonomous execution, and living documentation.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -1158,6 +1158,16 @@ if [[ "${SPECWEAVE_DISABLE_AUTO_LOAD:-0}" != "1" ]] && [[ "${SPECWEAVE_DISABLE_H
|
|
|
1158
1158
|
# Quick skip: already using /sw: commands (user is in workflow)
|
|
1159
1159
|
if ! echo "$PROMPT" | grep -qE "^[[:space:]]*/sw:"; then
|
|
1160
1160
|
|
|
1161
|
+
# BYPASS: Native Claude Code slash commands (e.g., /context, /help, /doctor)
|
|
1162
|
+
# Prevents 15s detect-intent timeout -> LLM_DETECTION_FAILED -> keyword fallback
|
|
1163
|
+
# that falsely matches "test" as substring inside "/context". Pattern matches
|
|
1164
|
+
# /word or /word-word prompts that do not mention specweave.
|
|
1165
|
+
if echo "$PROMPT" | grep -qE "^[[:space:]]*/[a-z][a-z0-9-]*([[:space:]]|$)" &&
|
|
1166
|
+
! echo "$PROMPT" | grep -qiE "specweave"; then
|
|
1167
|
+
echo '{"decision":"approve"}'
|
|
1168
|
+
exit 0
|
|
1169
|
+
fi
|
|
1170
|
+
|
|
1161
1171
|
# Check if specweave CLI is available
|
|
1162
1172
|
if command -v specweave >/dev/null 2>&1; then
|
|
1163
1173
|
# Setup logging (use project root, never create dirs at $HOME)
|
|
@@ -20,9 +20,15 @@ hooks:
|
|
|
20
20
|
|
|
21
21
|
# Plan Product Increment
|
|
22
22
|
|
|
23
|
-
## CRITICAL: Plan Mode Required
|
|
23
|
+
## CRITICAL: Plan Mode Required (BLOCKING)
|
|
24
24
|
|
|
25
|
-
**
|
|
25
|
+
**You MUST be in plan mode before proceeding.** If not, call `EnterPlanMode` now and wait for confirmation before continuing to Step 0A.
|
|
26
|
+
|
|
27
|
+
1. Call `EnterPlanMode` immediately
|
|
28
|
+
2. Wait for plan mode confirmation
|
|
29
|
+
3. Then proceed to Step 0A
|
|
30
|
+
|
|
31
|
+
Increment planning produces specs, plans, and task breakdowns that require user review. Do not skip plan mode or defer it — the user must approve the plan before any implementation begins.
|
|
26
32
|
|
|
27
33
|
## Project Overrides
|
|
28
34
|
|
|
@@ -27,7 +27,9 @@ description: Orchestrate multi-agent parallel development with domain-specialize
|
|
|
27
27
|
| Action | Tool | Parameters |
|
|
28
28
|
|--------|------|------------|
|
|
29
29
|
| Create team | `TeamCreate` | `team_name`, `description` |
|
|
30
|
-
| Spawn agent | `Task` | `team_name`, `name`, `subagent_type`, `prompt` |
|
|
30
|
+
| Spawn agent | `Task` | `team_name`, `name`, `subagent_type`, `prompt`, `mode` |
|
|
31
|
+
| Spawn agent (plan mode) | `Task` | `mode: "plan"` — agent must submit plan for team lead review |
|
|
32
|
+
| Approve/reject plan | `SendMessage` | `type: "plan_approval_response"`, `request_id`, `recipient`, `approve`, `content` |
|
|
31
33
|
| Send message | `SendMessage` | `type`, `recipient`, `content`, `summary` |
|
|
32
34
|
| Shutdown agent | `SendMessage` | `type: "shutdown_request"`, `recipient` |
|
|
33
35
|
|
|
@@ -191,6 +193,58 @@ Analyze domains
|
|
|
191
193
|
|
|
192
194
|
---
|
|
193
195
|
|
|
196
|
+
## 3b. Plan Review Workflow
|
|
197
|
+
|
|
198
|
+
The team lead acts as **architectural reviewer** for all sub-agent plans. Do NOT auto-accept plans.
|
|
199
|
+
|
|
200
|
+
### Why Review
|
|
201
|
+
|
|
202
|
+
Without review, agents may duplicate work across domains, misinterpret scope, make conflicting architectural decisions, or produce plans misaligned with the spec.
|
|
203
|
+
|
|
204
|
+
### Protocol
|
|
205
|
+
|
|
206
|
+
**Spawn all agents with `mode: "plan"`.** This forces agents to call `ExitPlanMode` before implementing, which sends a `plan_approval_request` to the team lead.
|
|
207
|
+
|
|
208
|
+
When you receive a plan approval request:
|
|
209
|
+
|
|
210
|
+
1. **Read the plan** — check the agent's spec.md, plan.md, and tasks.md
|
|
211
|
+
2. **Evaluate**:
|
|
212
|
+
- Does it align with the feature spec and ACs?
|
|
213
|
+
- Is the architecture consistent with existing codebase patterns?
|
|
214
|
+
- Does the agent stay within its file ownership boundaries?
|
|
215
|
+
- Are there conflicts with other agents' plans?
|
|
216
|
+
- Is scope correct — not too broad, not too narrow?
|
|
217
|
+
3. **Approve or reject**:
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
// Approve
|
|
221
|
+
SendMessage({
|
|
222
|
+
type: "plan_approval_response",
|
|
223
|
+
request_id: "<from plan_approval_request>",
|
|
224
|
+
recipient: "database-agent",
|
|
225
|
+
approve: true
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// Reject with feedback
|
|
229
|
+
SendMessage({
|
|
230
|
+
type: "plan_approval_response",
|
|
231
|
+
request_id: "<from plan_approval_request>",
|
|
232
|
+
recipient: "database-agent",
|
|
233
|
+
approve: false,
|
|
234
|
+
content: "Revise: 1) Add index on user_id for sessions. 2) Missing migration for AC-US1-03."
|
|
235
|
+
});
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Non-Blocking Review
|
|
239
|
+
|
|
240
|
+
Plan review MUST NOT block other agents. Review plans as they arrive — agents waiting for approval are idle, but other agents continue working normally.
|
|
241
|
+
|
|
242
|
+
### Multi-Increment Consideration
|
|
243
|
+
|
|
244
|
+
For very large features, the team lead MAY split work into multiple increments per domain for better tracking and independent closure. Decide this during initial analysis (Step 1), before spawning agents.
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
194
248
|
## 4. Agent Spawn Prompt Templates
|
|
195
249
|
|
|
196
250
|
Each agent receives a detailed prompt that includes its skill invocations, file ownership, and workflow instructions.
|
|
@@ -528,11 +582,14 @@ TeamCreate({
|
|
|
528
582
|
|
|
529
583
|
### Step 2: Spawn Upstream Agents (Phase 1)
|
|
530
584
|
|
|
585
|
+
All agents are spawned with `mode: "plan"` so the team lead reviews their plans before implementation (see Section 3b).
|
|
586
|
+
|
|
531
587
|
```typescript
|
|
532
588
|
Task({
|
|
533
589
|
team_name: "feature-checkout",
|
|
534
590
|
name: "database-agent",
|
|
535
591
|
subagent_type: "general-purpose",
|
|
592
|
+
mode: "plan",
|
|
536
593
|
prompt: `[DATABASE AGENT PROMPT - see template in Section 4c]`,
|
|
537
594
|
});
|
|
538
595
|
|
|
@@ -540,6 +597,7 @@ Task({
|
|
|
540
597
|
team_name: "feature-checkout",
|
|
541
598
|
name: "shared-types-agent",
|
|
542
599
|
subagent_type: "general-purpose",
|
|
600
|
+
mode: "plan",
|
|
543
601
|
prompt: `[SHARED/TYPES AGENT PROMPT]`,
|
|
544
602
|
});
|
|
545
603
|
```
|
|
@@ -555,6 +613,7 @@ Task({
|
|
|
555
613
|
team_name: "feature-checkout",
|
|
556
614
|
name: "backend-agent",
|
|
557
615
|
subagent_type: "general-purpose",
|
|
616
|
+
mode: "plan",
|
|
558
617
|
prompt: `[BACKEND AGENT PROMPT - see template in Section 4b]`,
|
|
559
618
|
});
|
|
560
619
|
|
|
@@ -562,6 +621,7 @@ Task({
|
|
|
562
621
|
team_name: "feature-checkout",
|
|
563
622
|
name: "frontend-agent",
|
|
564
623
|
subagent_type: "general-purpose",
|
|
624
|
+
mode: "plan",
|
|
565
625
|
prompt: `[FRONTEND AGENT PROMPT - see template in Section 4a]`,
|
|
566
626
|
});
|
|
567
627
|
|
|
@@ -569,6 +629,7 @@ Task({
|
|
|
569
629
|
team_name: "feature-checkout",
|
|
570
630
|
name: "testing-agent",
|
|
571
631
|
subagent_type: "general-purpose",
|
|
632
|
+
mode: "plan",
|
|
572
633
|
prompt: `[TESTING AGENT PROMPT - see template in Section 4d]`,
|
|
573
634
|
});
|
|
574
635
|
```
|
|
@@ -625,12 +686,15 @@ Orchestrator Final Check:
|
|
|
625
686
|
```
|
|
626
687
|
/sw:team-lead "Build checkout flow"
|
|
627
688
|
│
|
|
628
|
-
├── Step 1: Analyze feature -> identify domains
|
|
689
|
+
├── Step 1: Analyze feature -> identify domains -> decide increment split
|
|
629
690
|
├── Step 2: Create team via TeamCreate
|
|
630
691
|
├── Step 3: Create per-domain increments
|
|
631
|
-
├── Step 4: Contract-first spawning
|
|
632
|
-
│ ├── Phase 1: Spawn shared + database
|
|
633
|
-
│ └──
|
|
692
|
+
├── Step 4: Contract-first spawning (all agents with mode: "plan")
|
|
693
|
+
│ ├── Phase 1: Spawn shared + database
|
|
694
|
+
│ │ └── Review & approve each agent's plan (Section 3b)
|
|
695
|
+
│ │ └── Wait for CONTRACT_READY after approval
|
|
696
|
+
│ └── Phase 2: Spawn backend + frontend + testing
|
|
697
|
+
│ └── Review & approve each agent's plan
|
|
634
698
|
├── Step 5: Monitor progress via SendMessage
|
|
635
699
|
├── Step 6: Quality gates (each agent runs /sw:grill)
|
|
636
700
|
└── Step 7: Merge and close (/sw:team-merge)
|