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.
Files changed (31) hide show
  1. package/bin/specweave.js +25 -1
  2. package/dist/src/cli/commands/scan-plugins.d.ts +12 -0
  3. package/dist/src/cli/commands/scan-plugins.d.ts.map +1 -0
  4. package/dist/src/cli/commands/scan-plugins.js +80 -0
  5. package/dist/src/cli/commands/scan-plugins.js.map +1 -0
  6. package/dist/src/core/doctor/checkers/installation-health-checker.js +6 -6
  7. package/dist/src/core/doctor/checkers/installation-health-checker.js.map +1 -1
  8. package/dist/src/core/skill-security/index.d.ts +9 -0
  9. package/dist/src/core/skill-security/index.d.ts.map +1 -0
  10. package/dist/src/core/skill-security/index.js +5 -0
  11. package/dist/src/core/skill-security/index.js.map +1 -0
  12. package/dist/src/core/skill-security/parser.d.ts +27 -0
  13. package/dist/src/core/skill-security/parser.d.ts.map +1 -0
  14. package/dist/src/core/skill-security/parser.js +55 -0
  15. package/dist/src/core/skill-security/parser.js.map +1 -0
  16. package/dist/src/core/skill-security/reporter.d.ts +21 -0
  17. package/dist/src/core/skill-security/reporter.d.ts.map +1 -0
  18. package/dist/src/core/skill-security/reporter.js +121 -0
  19. package/dist/src/core/skill-security/reporter.js.map +1 -0
  20. package/dist/src/core/skill-security/rules.d.ts +25 -0
  21. package/dist/src/core/skill-security/rules.d.ts.map +1 -0
  22. package/dist/src/core/skill-security/rules.js +137 -0
  23. package/dist/src/core/skill-security/rules.js.map +1 -0
  24. package/dist/src/core/skill-security/scanner.d.ts +41 -0
  25. package/dist/src/core/skill-security/scanner.d.ts.map +1 -0
  26. package/dist/src/core/skill-security/scanner.js +78 -0
  27. package/dist/src/core/skill-security/scanner.js.map +1 -0
  28. package/package.json +1 -1
  29. package/plugins/specweave/hooks/user-prompt-submit.sh +10 -0
  30. package/plugins/specweave/skills/increment/SKILL.md +8 -2
  31. 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', 'Run suggested fix command if issues found')
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":"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"}
@@ -192,21 +192,21 @@ export class InstallationHealthChecker {
192
192
  if (missing.length > 0) {
193
193
  if (fix) {
194
194
  try {
195
- execSync('specweave update', { stdio: 'pipe' });
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 specweave update`,
199
+ message: `${missing.length} skill(s) were missing, ran refresh-plugins`,
200
200
  details: missing.map(m => `Missing: ${m}`),
201
- fixSuggestion: 'Ran: specweave update',
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: `specweave update failed: ${err instanceof Error ? err.message : 'unknown error'}`,
209
- fixSuggestion: 'Run: specweave update',
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 update',
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":"AAAA;;;GAGG;AAEH,OAAO,EACL,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,UAAU,EACV,MAAM,GACP,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAO9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,iCAAiC,CAAC;AAOzC,MAAM,OAAO,yBAAyB;IAKpC,YAAY,IAAgC;QAJ5C,aAAQ,GAAG,qBAAqB,CAAC;QAK/B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC1E,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,KAAK,CACT,WAAmB,EACnB,OAAsB;QAEtB,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC;QAEhE,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,sBAAsB,CAAC,MAAM,CAAC;YACtC,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,GAAY;QACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,OAAO;gBACL,IAAI,EAAE,sBAAsB;gBAC5B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,sCAAsC;aAChD,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,8CAA8C;QAC9C,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACzD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAEhD,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;gBAC9B,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,IAAI,EAAE,sBAAsB;gBAC5B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,yBAAyB;aACnC,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,EAAE,CAAC;YACR,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;gBAC/C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,sBAAsB;gBAC5B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,qCAAqC;gBAC9D,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,aAAa,EAAE,WAAW,MAAM,CAAC,MAAM,gBAAgB;aACxD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,sBAAsB;YAC5B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,4BAA4B;YACrD,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YACvC,aAAa,EAAE,6BAA6B;SAC7C,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,mBAAmB,CAAC,GAAY;QACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO;gBACL,IAAI,EAAE,yBAAyB;gBAC/B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,mCAAmC;aAC7C,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,sCAAsC;QACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,IAAI,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBACpC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC5C,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAC/C,CAAC;oBACF,OAAO,CAAC,IAAI,CAAC,sBAAsB,KAAK,KAAK,QAAQ,QAAQ,CAAC,CAAC;gBACjE,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,IAAI,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,IAAI,EAAE,yBAAyB;gBAC/B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,4BAA4B;aACtC,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,EAAE,CAAC;YACR,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAC1C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,yBAAyB;gBAC/B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,iCAAiC;gBAC5D,OAAO;gBACP,aAAa,EAAE,WAAW,QAAQ,CAAC,MAAM,oBAAoB;aAC9D,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,8BAA8B;YACzD,OAAO;YACP,aAAa,EAAE,6BAA6B;SAC7C,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,sBAAsB,CAC5B,WAAmB,EACnB,GAAY;QAEZ,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,sBAAsB;aAChC,CAAC;QACJ,CAAC;QAED,IAAI,QAKH,CAAC;QACF,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,6BAA6B;gBACtC,aAAa,EAAE,gCAAgC;aAChD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClE,OAAO;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,+BAA+B;aACzC,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBAChD,IAAI,WAAW,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC;oBAC9B,UAAU,CAAC,IAAI,CACb,GAAG,IAAI,cAAc,KAAK,CAAC,GAAG,SAAS,WAAW,EAAE,CACrD,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,CAAC;oBACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;oBAChD,OAAO;wBACL,IAAI,EAAE,oBAAoB;wBAC1B,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,8CAA8C;wBACxE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;wBAC1C,aAAa,EAAE,uBAAuB;qBACvC,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO;wBACL,IAAI,EAAE,oBAAoB;wBAC1B,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;wBAC3F,aAAa,EAAE,uBAAuB;qBACvC,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,qCAAqC;gBAC/D,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC1C,aAAa,EAAE,uBAAuB;aACvC,CAAC;QACJ,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,GAAG,EAAE,CAAC;gBACR,4DAA4D;gBAC5D,IAAI,CAAC;oBACH,MAAM,aAAa,GAA2B,EAAE,CAAC;oBACjD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;wBAC9C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;4BACzB,IAAI,CAAC;gCACH,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;4BACvE,CAAC;4BAAC,MAAM,CAAC;gCACP,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;4BAC9B,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;wBAC9B,CAAC;oBACH,CAAC;oBACD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAClG,OAAO;wBACL,IAAI,EAAE,oBAAoB;wBAC1B,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,0CAA0C;wBACvE,aAAa,EAAE,yBAAyB;qBACzC,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO;wBACL,IAAI,EAAE,oBAAoB;wBAC1B,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;wBAC7F,OAAO,EAAE,UAAU;wBACnB,aAAa,EAAE,uBAAuB;qBACvC,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,6BAA6B;gBAC1D,OAAO,EAAE,UAAU;gBACnB,aAAa,EAAE,6BAA6B;aAC7C,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,iCAAiC;SAC3C,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,uBAAuB,CAAC,GAAY;QAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,OAAO;gBACL,IAAI,EAAE,6BAA6B;gBACnC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,sCAAsC;aAChD,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACzD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAEhD,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;gBAC9B,kEAAkE;gBAClE,gEAAgE;gBAChE,mEAAmE;gBACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAChD,MAAM,WAAW,GACf,QAAQ,KAAK,WAAW;oBACxB,QAAQ,KAAK,WAAW;oBACxB,QAAQ,KAAK,cAAc,CAAC;gBAE9B,IAAI,CAAC,WAAW,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,IAAI,EAAE,6BAA6B;gBACnC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,8BAA8B;aACxC,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,EAAE,CAAC;YACR,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBAC3C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,6BAA6B;gBACnC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,sCAAsC;gBACnE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC/C,aAAa,EAAE,WAAW,UAAU,CAAC,MAAM,oBAAoB;aAChE,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,6BAA6B;YACnC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,6BAA6B;YAC1D,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/C,aAAa,EAAE,6BAA6B;SAC7C,CAAC;IACJ,CAAC;IAED,0EAA0E;IAE1E,+CAA+C;IACvC,QAAQ,CAAC,GAAW;QAC1B,IAAI,CAAC;YACH,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBACjC,IAAI,CAAC;oBACH,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC9C,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,yEAAyE;IACjE,WAAW,CAAC,GAAW,EAAE,MAAc;QAC7C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAClC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gBACtD,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAChC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;wBACvB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;oBACvD,CAAC;yBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBAClD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACxB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,0BAA0B;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
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.299",
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
- **Before executing this skill, you MUST be in plan mode.** If you are not currently in plan mode, call `EnterPlanMode` first. Increment planning is ALWAYS a planning activity never skip straight to implementation.
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 -> wait for CONTRACT_READY
633
- │ └── Phase 2: Spawn backend + frontend + testing (parallel)
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)