@winspan/claude-forge 8.38.0 → 8.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/agents/methodologies/agent-builder.js +54 -7
  2. package/dist/agents/methodologies/agent-builder.js.map +1 -1
  3. package/dist/agents/methodologies/phases/bmad/analyze.d.ts.map +1 -1
  4. package/dist/agents/methodologies/phases/bmad/analyze.js +1 -0
  5. package/dist/agents/methodologies/phases/bmad/analyze.js.map +1 -1
  6. package/dist/agents/methodologies/phases/bmad/design.d.ts.map +1 -1
  7. package/dist/agents/methodologies/phases/bmad/design.js +1 -0
  8. package/dist/agents/methodologies/phases/bmad/design.js.map +1 -1
  9. package/dist/agents/methodologies/phases/bmad/implement.d.ts.map +1 -1
  10. package/dist/agents/methodologies/phases/bmad/implement.js +1 -0
  11. package/dist/agents/methodologies/phases/bmad/implement.js.map +1 -1
  12. package/dist/agents/methodologies/phases/bmad/review.d.ts.map +1 -1
  13. package/dist/agents/methodologies/phases/bmad/review.js +1 -0
  14. package/dist/agents/methodologies/phases/bmad/review.js.map +1 -1
  15. package/dist/agents/methodologies/phases/bmad/test.d.ts.map +1 -1
  16. package/dist/agents/methodologies/phases/bmad/test.js +1 -0
  17. package/dist/agents/methodologies/phases/bmad/test.js.map +1 -1
  18. package/dist/agents/methodologies/phases/harness/fix.d.ts.map +1 -1
  19. package/dist/agents/methodologies/phases/harness/fix.js +1 -0
  20. package/dist/agents/methodologies/phases/harness/fix.js.map +1 -1
  21. package/dist/agents/methodologies/phases/harness/reproduce.d.ts.map +1 -1
  22. package/dist/agents/methodologies/phases/harness/reproduce.js +1 -0
  23. package/dist/agents/methodologies/phases/harness/reproduce.js.map +1 -1
  24. package/dist/agents/methodologies/phases/harness/root-cause.d.ts.map +1 -1
  25. package/dist/agents/methodologies/phases/harness/root-cause.js +2 -1
  26. package/dist/agents/methodologies/phases/harness/root-cause.js.map +1 -1
  27. package/dist/agents/methodologies/phases/harness/safety-net.d.ts.map +1 -1
  28. package/dist/agents/methodologies/phases/harness/safety-net.js +1 -0
  29. package/dist/agents/methodologies/phases/harness/safety-net.js.map +1 -1
  30. package/dist/agents/methodologies/phases/harness/verify.d.ts.map +1 -1
  31. package/dist/agents/methodologies/phases/harness/verify.js +1 -0
  32. package/dist/agents/methodologies/phases/harness/verify.js.map +1 -1
  33. package/dist/agents/methodologies/types.d.ts +2 -0
  34. package/dist/agents/methodologies/types.d.ts.map +1 -1
  35. package/dist/core/config.d.ts.map +1 -1
  36. package/dist/core/config.js +7 -0
  37. package/dist/core/config.js.map +1 -1
  38. package/dist/core/types.d.ts +10 -0
  39. package/dist/core/types.d.ts.map +1 -1
  40. package/dist/daemon/handlers/pre-tool-use.d.ts +13 -4
  41. package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -1
  42. package/dist/daemon/handlers/pre-tool-use.js +51 -58
  43. package/dist/daemon/handlers/pre-tool-use.js.map +1 -1
  44. package/dist/daemon/index.js +1 -1
  45. package/dist/daemon/index.js.map +1 -1
  46. package/dist/daemon/routing-state.d.ts +1 -0
  47. package/dist/daemon/routing-state.d.ts.map +1 -1
  48. package/dist/daemon/routing-state.js +17 -0
  49. package/dist/daemon/routing-state.js.map +1 -1
  50. package/dist/engine/security-gates.d.ts +42 -0
  51. package/dist/engine/security-gates.d.ts.map +1 -0
  52. package/dist/engine/security-gates.js +210 -0
  53. package/dist/engine/security-gates.js.map +1 -0
  54. package/dist/skills/tools/skill-invoke.d.ts +2 -0
  55. package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
  56. package/dist/skills/tools/skill-invoke.js +5 -2
  57. package/dist/skills/tools/skill-invoke.js.map +1 -1
  58. package/dist/web/routes/agents.d.ts.map +1 -1
  59. package/dist/web/routes/agents.js +17 -0
  60. package/dist/web/routes/agents.js.map +1 -1
  61. package/package.json +1 -1
@@ -59,6 +59,22 @@ export function buildMethodologyAgent(preset) {
59
59
  content,
60
60
  };
61
61
  }
62
+ function generateExamples(phases, slugPlaceholder) {
63
+ // 只为实际包含的 phase 生成示例,最多取前 2 个有 skillId 的 phase
64
+ const examplePhases = phases
65
+ .filter((p) => p.template.skillId !== null)
66
+ .slice(0, 2);
67
+ if (examplePhases.length === 0) {
68
+ return `- Example: \`skill_invoke(skill_id: "official-skill", reason: "workflow/phase${slugPlaceholder}")\``;
69
+ }
70
+ const exampleSlug = slugPlaceholder.replace(/[<>]/g, '').replace('-slug', '');
71
+ return examplePhases
72
+ .map((p) => {
73
+ const exampleValue = exampleSlug === 'feature' ? 'user-auth' : 'login-crash';
74
+ return `- ${p.template.workflow.toUpperCase()} ${p.template.id} phase: \`skill_invoke(skill_id: "${p.template.skillId}", reason: "${p.template.workflow}/${p.template.id}:${exampleValue}")\``;
75
+ })
76
+ .join('\n');
77
+ }
62
78
  function buildPromptContent(preset, phases) {
63
79
  const workflowSet = new Set(phases.map((p) => p.template.workflow));
64
80
  const workflowName = workflowSet.size === 1 ? [...workflowSet][0] : 'mixed';
@@ -66,13 +82,9 @@ function buildPromptContent(preset, phases) {
66
82
  const tagsLine = preset.tags && preset.tags.length > 0
67
83
  ? `\n## 标签\n${preset.tags.map((t) => `\`${t}\``).join(' ')}\n`
68
84
  : '';
69
- // 根据 workflow 选择 slug 占位符名,跟 phase body 内的约定保持一致:
70
- // - bmad 系列 phase body 用 <feature-slug>
71
- // - harness 系列 phase body 用 <bug-slug>
72
- // 跨方法论(未来)或未知场景 fallback 到通用 <slug>
73
- const slugPlaceholder = workflowName === 'harness' ? '<bug-slug>'
74
- : workflowName === 'bmad' ? '<feature-slug>'
75
- : '<slug>';
85
+ // phase template 读取 slugPlaceholder,优先使用第一个 phase 的定义
86
+ // 如果未定义则 fallback 到通用 <slug>
87
+ const slugPlaceholder = phases[0]?.template.slugPlaceholder ?? '<slug>';
76
88
  return `# ${preset.name}
77
89
 
78
90
  ${preset.description}
@@ -86,6 +98,41 @@ ${tagsLine}
86
98
 
87
99
  **软性建议**:根据任务实际复杂度灵活调整,可跳过明显不需要的 phase。但每次调用 \`skill_invoke\` 请在 reason 字段带 \`${workflowName}/<phase>[:${slugPlaceholder}]\` 格式,方便进度追踪。
88
100
 
101
+ ## 执行流程(必须遵守)
102
+
103
+ 在开始执行每个 phase 之前,**必须**调用 \`skill_invoke\` 工具记录进度:
104
+
105
+ \`\`\`
106
+ skill_invoke(
107
+ skill_id: "<phase 对应的 skill>",
108
+ reason: "${workflowName}/<phase-id>[:${slugPlaceholder}]"
109
+ )
110
+ \`\`\`
111
+
112
+ **示例**:
113
+ ${generateExamples(phases, slugPlaceholder)}
114
+
115
+ **重要**:
116
+ 1. reason 参数格式必须严格遵守 \`${workflowName}/<phase>[:${slugPlaceholder}]\`,这样系统才能正确追踪工作流进度
117
+ 2. 每个 phase 开始前都要调用,不能跳过
118
+ 3. skill_id 必须与 phase 定义中的 skillId 字段一致
119
+ 4. ${slugPlaceholder} 建议使用英文、数字和连字符(如 \`user-auth\`、\`login-crash\`),虽然系统支持中文但英文更利于跨团队协作
120
+
121
+ ### 如果 skill_invoke 调用失败
122
+
123
+ 1. **检查 skill_id 是否正确**:
124
+ - 使用 \`skill_list\` 工具查询可用的 Skill
125
+ - 确认 skill_id 与 phase 匹配
126
+
127
+ 2. **如果 Skill 不存在**:
128
+ - 使用通用方法论继续执行该 phase
129
+ - 在最终报告中说明该 phase 未使用 Skill 指导
130
+
131
+ 3. **如果防护检查失败**:
132
+ - 检查 reason 参数格式是否正确
133
+ - 确认 workflow/phase/slug 符合规范
134
+ - 记录失败原因并继续执行
135
+
89
136
  ---
90
137
 
91
138
  ${phases.map((p) => p.template.promptBody.trim()).join('\n\n---\n\n')}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-builder.js","sourceRoot":"","sources":["../../../src/agents/methodologies/agent-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-builder.js","sourceRoot":"","sources":["../../../src/agents/methodologies/agent-builder.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,YAAY,EAAE,aAgB1B,CAAC"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,YAAY,EAAE,aAiB1B,CAAC"}
@@ -5,6 +5,7 @@ export const BMAD_ANALYZE = {
5
5
  description: '拆解需求边界,识别成功标准与约束,产出《需求规格》',
6
6
  skillId: 'official-spec-driven-design',
7
7
  artifactHint: 'docs/specs/<feature-slug>.md',
8
+ slugPlaceholder: '<feature-slug>',
8
9
  promptBody: `### Phase: analyze(需求分析)
9
10
 
10
11
  1. 调用 \`skill_invoke({skill_id: "official-spec-driven-design", reason: "bmad/analyze:<feature-slug>"})\`
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/analyze.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,2BAA2B;IACxC,OAAO,EAAE,6BAA6B;IACtC,YAAY,EAAE,8BAA8B;IAC5C,UAAU,EAAE;;;;;;;;CAQb;CACA,CAAC"}
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/analyze.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,2BAA2B;IACxC,OAAO,EAAE,6BAA6B;IACtC,YAAY,EAAE,8BAA8B;IAC5C,eAAe,EAAE,gBAAgB;IACjC,UAAU,EAAE;;;;;;;;CAQb;CACA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/design.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,WAAW,EAAE,aAezB,CAAC"}
1
+ {"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/design.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,WAAW,EAAE,aAgBzB,CAAC"}
@@ -5,6 +5,7 @@ export const BMAD_DESIGN = {
5
5
  description: '产出设计文档,包括数据模型 / API 契约 / 关键决策',
6
6
  skillId: 'official-architecture-decision',
7
7
  artifactHint: 'docs/design/<feature-slug>.md',
8
+ slugPlaceholder: '<feature-slug>',
8
9
  promptBody: `### Phase: design(架构设计)
9
10
 
10
11
  1. 调用 \`skill_invoke({skill_id: "official-architecture-decision", reason: "bmad/design:<feature-slug>"})\`
@@ -1 +1 @@
1
- {"version":3,"file":"design.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/design.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,EAAE,EAAE,QAAQ;IACZ,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,+BAA+B;IAC5C,OAAO,EAAE,gCAAgC;IACzC,YAAY,EAAE,+BAA+B;IAC7C,UAAU,EAAE;;;;;;;CAOb;CACA,CAAC"}
1
+ {"version":3,"file":"design.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/design.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,EAAE,EAAE,QAAQ;IACZ,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,+BAA+B;IAC5C,OAAO,EAAE,gCAAgC;IACzC,YAAY,EAAE,+BAA+B;IAC7C,eAAe,EAAE,gBAAgB;IACjC,UAAU,EAAE;;;;;;;CAOb;CACA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/implement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,cAAc,EAAE,aAc5B,CAAC"}
1
+ {"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/implement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,cAAc,EAAE,aAe5B,CAAC"}
@@ -5,6 +5,7 @@ export const BMAD_IMPLEMENT = {
5
5
  description: '按 TDD 流程编写代码 + 测试',
6
6
  skillId: 'official-tdd',
7
7
  artifactHint: 'src/...(源代码)+ tests/...(测试)',
8
+ slugPlaceholder: '<feature-slug>',
8
9
  promptBody: `### Phase: implement(实现编码)
9
10
 
10
11
  1. 调用 \`skill_invoke({skill_id: "official-tdd", reason: "bmad/implement:<feature-slug>"})\`
@@ -1 +1 @@
1
- {"version":3,"file":"implement.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/implement.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,EAAE,EAAE,WAAW;IACf,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,mBAAmB;IAChC,OAAO,EAAE,cAAc;IACvB,YAAY,EAAE,6BAA6B;IAC3C,UAAU,EAAE;;;;;;CAMb;CACA,CAAC"}
1
+ {"version":3,"file":"implement.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/implement.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,EAAE,EAAE,WAAW;IACf,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,mBAAmB;IAChC,OAAO,EAAE,cAAc;IACvB,YAAY,EAAE,6BAA6B;IAC3C,eAAe,EAAE,gBAAgB;IACjC,UAAU,EAAE;;;;;;CAMb;CACA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,WAAW,EAAE,aAczB,CAAC"}
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,WAAW,EAAE,aAezB,CAAC"}
@@ -5,6 +5,7 @@ export const BMAD_REVIEW = {
5
5
  description: '自审代码 + 检查 git diff,产出审查清单',
6
6
  skillId: 'official-pr-review',
7
7
  artifactHint: 'docs/reviews/<feature-slug>.md',
8
+ slugPlaceholder: '<feature-slug>',
8
9
  promptBody: `### Phase: review(代码审核)
9
10
 
10
11
  1. 调用 \`skill_invoke({skill_id: "official-pr-review", reason: "bmad/review:<feature-slug>"})\`
@@ -1 +1 @@
1
- {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/review.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,EAAE,EAAE,QAAQ;IACZ,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,2BAA2B;IACxC,OAAO,EAAE,oBAAoB;IAC7B,YAAY,EAAE,gCAAgC;IAC9C,UAAU,EAAE;;;;;;CAMb;CACA,CAAC"}
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/review.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,EAAE,EAAE,QAAQ;IACZ,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,2BAA2B;IACxC,OAAO,EAAE,oBAAoB;IAC7B,YAAY,EAAE,gCAAgC;IAC9C,eAAe,EAAE,gBAAgB;IACjC,UAAU,EAAE;;;;;;CAMb;CACA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,SAAS,EAAE,aAkBvB,CAAC"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,SAAS,EAAE,aAmBvB,CAAC"}
@@ -5,6 +5,7 @@ export const BMAD_TEST = {
5
5
  description: '运行测试套件并产出测试报告,失败则回到 implement 修正',
6
6
  skillId: null,
7
7
  artifactHint: 'docs/test-reports/<feature-slug>.md',
8
+ slugPlaceholder: '<feature-slug>',
8
9
  promptBody: `### Phase: test(测试验证)
9
10
 
10
11
  1. 运行测试套件(\`npm test\` 或项目对应命令)
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/test.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAkB;IACtC,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,kCAAkC;IAC/C,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,qCAAqC;IACnD,UAAU,EAAE;;;;;;;;;;CAUb;CACA,CAAC"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/bmad/test.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAkB;IACtC,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,kCAAkC;IAC/C,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,qCAAqC;IACnD,eAAe,EAAE,gBAAgB;IACjC,UAAU,EAAE;;;;;;;;;;CAUb;CACA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/fix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,WAAW,EAAE,aAczB,CAAC"}
1
+ {"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/fix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,WAAW,EAAE,aAezB,CAAC"}
@@ -5,6 +5,7 @@ export const HARNESS_FIX = {
5
5
  description: '在测试覆盖下修改代码,确保所有相关测试通过',
6
6
  skillId: 'official-tdd',
7
7
  artifactHint: 'src/...(修复代码)',
8
+ slugPlaceholder: '<bug-slug>',
8
9
  promptBody: `### Phase: fix(修复)
9
10
 
10
11
  1. 调用 \`skill_invoke({skill_id: "official-tdd", reason: "harness/fix:<bug-slug>"})\`
@@ -1 +1 @@
1
- {"version":3,"file":"fix.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/fix.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,EAAE,EAAE,KAAK;IACT,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,uBAAuB;IACpC,OAAO,EAAE,cAAc;IACvB,YAAY,EAAE,eAAe;IAC7B,UAAU,EAAE;;;;;;CAMb;CACA,CAAC"}
1
+ {"version":3,"file":"fix.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/fix.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,EAAE,EAAE,KAAK;IACT,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,uBAAuB;IACpC,OAAO,EAAE,cAAc;IACvB,YAAY,EAAE,eAAe;IAC7B,eAAe,EAAE,YAAY;IAC7B,UAAU,EAAE;;;;;;CAMb;CACA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"reproduce.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/reproduce.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,iBAAiB,EAAE,aAiB/B,CAAC"}
1
+ {"version":3,"file":"reproduce.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/reproduce.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,iBAAiB,EAAE,aAkB/B,CAAC"}
@@ -5,6 +5,7 @@ export const HARNESS_REPRODUCE = {
5
5
  description: '编写最小复现脚本,明确 bug 触发路径',
6
6
  skillId: 'official-debug',
7
7
  artifactHint: 'docs/investigations/<bug-slug>.md',
8
+ slugPlaceholder: '<bug-slug>',
8
9
  promptBody: `### Phase: reproduce(现象复现)
9
10
 
10
11
  1. 调用 \`skill_invoke({skill_id: "official-debug", reason: "harness/reproduce:<bug-slug>"})\`
@@ -1 +1 @@
1
- {"version":3,"file":"reproduce.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/reproduce.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAkB;IAC9C,EAAE,EAAE,WAAW;IACf,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,sBAAsB;IACnC,OAAO,EAAE,gBAAgB;IACzB,YAAY,EAAE,mCAAmC;IACjD,UAAU,EAAE;;;;;;;;;CASb;CACA,CAAC"}
1
+ {"version":3,"file":"reproduce.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/reproduce.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAkB;IAC9C,EAAE,EAAE,WAAW;IACf,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,sBAAsB;IACnC,OAAO,EAAE,gBAAgB;IACzB,YAAY,EAAE,mCAAmC;IACjD,eAAe,EAAE,YAAY;IAC7B,UAAU,EAAE;;;;;;;;;CASb;CACA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"root-cause.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/root-cause.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,kBAAkB,EAAE,aAkBhC,CAAC"}
1
+ {"version":3,"file":"root-cause.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/root-cause.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,kBAAkB,EAAE,aAmBhC,CAAC"}
@@ -4,7 +4,8 @@ export const HARNESS_ROOT_CAUSE = {
4
4
  title: '根因定位',
5
5
  description: '通过测试和 git blame/log 定位真因,追加到诊断文档',
6
6
  skillId: null,
7
- artifactHint: 'docs/investigations/<bug-slug>.md(追加“根因”段落)',
7
+ artifactHint: 'docs/investigations/<bug-slug>.md(追加”根因”段落)',
8
+ slugPlaceholder: '<bug-slug>',
8
9
  promptBody: `### Phase: root-cause(根因定位)
9
10
 
10
11
  1. 通过测试和 \`git blame\` / \`git log\` 定位真因
@@ -1 +1 @@
1
- {"version":3,"file":"root-cause.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/root-cause.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAkB;IAC/C,EAAE,EAAE,YAAY;IAChB,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,kCAAkC;IAC/C,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,6CAA6C;IAC3D,UAAU,EAAE;;;;;;;;;;CAUb;CACA,CAAC"}
1
+ {"version":3,"file":"root-cause.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/root-cause.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAkB;IAC/C,EAAE,EAAE,YAAY;IAChB,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,kCAAkC;IAC/C,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,6CAA6C;IAC3D,eAAe,EAAE,YAAY;IAC7B,UAAU,EAAE;;;;;;;;;;CAUb;CACA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"safety-net.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/safety-net.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,kBAAkB,EAAE,aAchC,CAAC"}
1
+ {"version":3,"file":"safety-net.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/safety-net.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,kBAAkB,EAAE,aAehC,CAAC"}
@@ -5,6 +5,7 @@ export const HARNESS_SAFETY_NET = {
5
5
  description: '为受影响模块补特性测试(characterization test),锁定现有行为',
6
6
  skillId: 'official-harness-engineering',
7
7
  artifactHint: 'tests/...(新增特性测试)',
8
+ slugPlaceholder: '<bug-slug>',
8
9
  promptBody: `### Phase: safety-net(防护网构建)
9
10
 
10
11
  1. 调用 \`skill_invoke({skill_id: "official-harness-engineering", reason: "harness/safety-net:<bug-slug>"})\`
@@ -1 +1 @@
1
- {"version":3,"file":"safety-net.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/safety-net.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAkB;IAC/C,EAAE,EAAE,YAAY;IAChB,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,2CAA2C;IACxD,OAAO,EAAE,8BAA8B;IACvC,YAAY,EAAE,mBAAmB;IACjC,UAAU,EAAE;;;;;;CAMb;CACA,CAAC"}
1
+ {"version":3,"file":"safety-net.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/safety-net.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAkB;IAC/C,EAAE,EAAE,YAAY;IAChB,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,2CAA2C;IACxD,OAAO,EAAE,8BAA8B;IACvC,YAAY,EAAE,mBAAmB;IACjC,eAAe,EAAE,YAAY;IAC7B,UAAU,EAAE;;;;;;CAMb;CACA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/verify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,cAAc,EAAE,aAmB5B,CAAC"}
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/verify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,cAAc,EAAE,aAoB5B,CAAC"}
@@ -5,6 +5,7 @@ export const HARNESS_VERIFY = {
5
5
  description: '完整跑测试套件并产出修复报告',
6
6
  skillId: null,
7
7
  artifactHint: 'docs/reviews/<bug-slug>.md',
8
+ slugPlaceholder: '<bug-slug>',
8
9
  promptBody: `### Phase: verify(验证报告)
9
10
 
10
11
  1. 完整跑测试套件(\`npm test\` 或项目对应命令)
@@ -1 +1 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/verify.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,EAAE,EAAE,QAAQ;IACZ,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,gBAAgB;IAC7B,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,4BAA4B;IAC1C,UAAU,EAAE;;;;;;;;;;;CAWb;CACA,CAAC"}
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../../../src/agents/methodologies/phases/harness/verify.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,EAAE,EAAE,QAAQ;IACZ,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,gBAAgB;IAC7B,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,4BAA4B;IAC1C,eAAe,EAAE,YAAY;IAC7B,UAAU,EAAE;;;;;;;;;;;CAWb;CACA,CAAC"}
@@ -21,6 +21,8 @@ export interface PhaseTemplate {
21
21
  artifactHint: string | null;
22
22
  /** Detailed phase instructions (markdown) */
23
23
  promptBody: string;
24
+ /** Slug placeholder name used in this phase, e.g. '<feature-slug>' or '<bug-slug>' */
25
+ slugPlaceholder?: string;
24
26
  }
25
27
  export interface MethodologyAgentPreset {
26
28
  /** Agent slug (subagent_type) */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/agents/methodologies/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iEAAiE;IACjE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/agents/methodologies/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iEAAiE;IACjE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAqB9C;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,UAAU,CAAC,EAAE,MAAM;IAI/B;;OAEG;IACH,GAAG,IAAI,WAAW;IA+BlB;;OAEG;IACH,IAAI,IAAI,IAAI;CASb"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA2B9C;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,UAAU,CAAC,EAAE,MAAM;IAI/B;;OAEG;IACH,GAAG,IAAI,WAAW;IAgClB;;OAEG;IACH,IAAI,IAAI,IAAI;CASb"}
@@ -16,6 +16,12 @@ function defaultConfig() {
16
16
  enabled: false,
17
17
  port: DEFAULTS.WEB_PORT,
18
18
  },
19
+ security: {
20
+ destructiveOps: true,
21
+ secretsCheck: true,
22
+ diffSizeCheck: true,
23
+ diffSizeThreshold: 300,
24
+ },
19
25
  };
20
26
  }
21
27
  /**
@@ -49,6 +55,7 @@ export class ConfigManager {
49
55
  distill: { ...defaults.distill, ...parsed.distill },
50
56
  storage: { ...defaults.storage, ...parsed.storage },
51
57
  web: { ...defaults.web, ...parsed.web },
58
+ security: { ...defaults.security, ...parsed.security },
52
59
  };
53
60
  return this.config;
54
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEvD,SAAS,aAAa;IACpB,OAAO;QACL,OAAO,EAAE;YACP,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,QAAQ,CAAC,aAAa;YAC7B,QAAQ,EAAE,QAAQ,CAAC,gBAAgB;SACpC;QACD,OAAO,EAAE;YACP,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE;YAC5B,WAAW,EAAE,QAAQ,CAAC,mBAAmB;SAC1C;QACD,GAAG,EAAE;YACH,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,QAAQ,CAAC,QAAQ;SACxB;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,GAAuB,IAAI,CAAC;IACzB,UAAU,CAAS;IAEpC,YAAY,UAAmB;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,GAAG;QACD,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAEpC,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;QAEjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvB,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAgC,CAAC;YAE7D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC1C,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;gBACvB,OAAO,IAAI,CAAC,MAAM,CAAC;YACrB,CAAC;YAED,IAAI,CAAC,MAAM,GAAG;gBACZ,OAAO,EAAE,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE;gBACnD,OAAO,EAAE,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE;gBACnD,GAAG,EAAE,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE;aACxC,CAAC;YACF,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvB,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI;QACF,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;CACF"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,15 @@ export interface HookResult {
23
23
  systemMessage?: string;
24
24
  additionalContext?: string;
25
25
  }
26
+ /**
27
+ * Security configuration
28
+ */
29
+ export interface SecurityConfig {
30
+ destructiveOps: boolean;
31
+ secretsCheck: boolean;
32
+ diffSizeCheck: boolean;
33
+ diffSizeThreshold: number;
34
+ }
26
35
  /**
27
36
  * Configuration structure
28
37
  */
@@ -46,5 +55,6 @@ export interface ForgeConfig {
46
55
  skill_matching?: {
47
56
  api_key?: string;
48
57
  };
58
+ security?: SecurityConfig;
49
59
  }
50
60
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,YAAY,GAAG,aAAa,GAAG,kBAAkB,GAAG,cAAc,GAAG,MAAM,CAAC;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,GAAG,EAAE;QACH,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,cAAc,CAAC,EAAE;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,YAAY,GAAG,aAAa,GAAG,kBAAkB,GAAG,cAAc,GAAG,MAAM,CAAC;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,GAAG,EAAE;QACH,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,cAAc,CAAC,EAAE;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B"}
@@ -10,17 +10,26 @@ import type { ForgeEvent, HookResult } from '../../core/types.js';
10
10
  import type { RuleEngine } from '../../engine/rule-engine.js';
11
11
  import type { GovernanceDecision } from '../../engine/dsl/types.js';
12
12
  import type { ContextBuilder } from '../../engine/context-builder.js';
13
+ import type { SecurityConfig } from '../../core/types.js';
13
14
  export declare class PreToolUseHandler {
14
15
  private ruleEngine;
15
16
  private contextBuilder;
16
17
  private sessionStartTime;
17
- constructor(ruleEngine: RuleEngine, contextBuilder: ContextBuilder);
18
+ private securityGates;
19
+ constructor(ruleEngine: RuleEngine, contextBuilder: ContextBuilder, securityConfig?: SecurityConfig);
18
20
  handle(event: ForgeEvent): Promise<HookResult>;
19
21
  /**
20
- * Enforce routing decisions: if session was routed to an agent,
21
- * block direct tool calls that bypass the agent.
22
+ * Track routing compliance without blocking (inspired by ruflo's design).
23
+ *
24
+ * Ruflo's approach: routing is a SUGGESTION enforced by CLAUDE.md instructions,
25
+ * not a hard block in the hook layer. This prevents the deadlock where:
26
+ * 1. UserPrompt injects [ROUTE_TO: agent]
27
+ * 2. PreToolUse blocks all tools
28
+ * 3. Claude can't call Agent tool because it's blocked
29
+ *
30
+ * New approach: Let CLAUDE.md guide behavior, track compliance for metrics.
22
31
  */
23
- private checkRoutingEnforcement;
32
+ private trackRoutingCompliance;
24
33
  handleWithDecision(event: ForgeEvent): Promise<{
25
34
  result: HookResult;
26
35
  decision: GovernanceDecision;
@@ -1 +1 @@
1
- {"version":3,"file":"pre-tool-use.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/pre-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAe,MAAM,2BAA2B,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAyB,MAAM,iCAAiC,CAAC;AAmB7F,qBAAa,iBAAiB;IAI1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,cAAc;IAJxB,OAAO,CAAC,gBAAgB,CAAc;gBAG5B,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc;IAGlC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAYpD;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAwEzB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,kBAAkB,CAAA;KAAE,CAAC;IAyD1G,OAAO,CAAC,gBAAgB;CASzB"}
1
+ {"version":3,"file":"pre-tool-use.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/pre-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAe,MAAM,2BAA2B,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAyB,MAAM,iCAAiC,CAAC;AAI7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAiB1D,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,cAAc;IALxB,OAAO,CAAC,gBAAgB,CAAc;IACtC,OAAO,CAAC,aAAa,CAA8B;gBAGzC,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EACtC,cAAc,CAAC,EAAE,cAAc;IAO3B,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IA+BpD;;;;;;;;;;OAUG;IACH,OAAO,CAAC,sBAAsB;IA6BxB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,kBAAkB,CAAA;KAAE,CAAC;IAyD1G,OAAO,CAAC,gBAAgB;CASzB"}
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { logger } from '../../core/utils/logger.js';
10
10
  import { routingState } from '../routing-state.js';
11
+ import { SecurityGates } from '../../engine/security-gates.js';
11
12
  // Tools that are allowed even when routing is active (investigation phase)
12
13
  const ROUTING_WHITELIST = new Set([
13
14
  'Read', 'Grep', 'Glob', // Code exploration
@@ -25,87 +26,79 @@ export class PreToolUseHandler {
25
26
  ruleEngine;
26
27
  contextBuilder;
27
28
  sessionStartTime = Date.now();
28
- constructor(ruleEngine, contextBuilder) {
29
+ securityGates = null;
30
+ constructor(ruleEngine, contextBuilder, securityConfig) {
29
31
  this.ruleEngine = ruleEngine;
30
32
  this.contextBuilder = contextBuilder;
33
+ if (securityConfig) {
34
+ this.securityGates = new SecurityGates(securityConfig);
35
+ }
31
36
  }
32
37
  async handle(event) {
33
- // 1. Check routing enforcement FIRST (before governance rules)
34
- const routingCheck = this.checkRoutingEnforcement(event);
35
- if (!routingCheck.allow) {
36
- return routingCheck;
38
+ // Security checks run first (highest priority)
39
+ if (this.securityGates) {
40
+ const securityResult = this.securityGates.evaluate(event);
41
+ if (securityResult) {
42
+ if (securityResult.level === 'block') {
43
+ logger.info(`[PreToolUse] BLOCKED by security gate: ${securityResult.checkName}`);
44
+ return { allow: false, reason: securityResult.reason };
45
+ }
46
+ if (securityResult.level === 'warn') {
47
+ logger.info(`[PreToolUse] WARNED by security gate: ${securityResult.checkName}`);
48
+ // Continue to governance rules but include security warning
49
+ const { result } = await this.handleWithDecision(event);
50
+ if (result.additionalContext) {
51
+ result.additionalContext = `${securityResult.reason}\n\n${result.additionalContext}`;
52
+ }
53
+ else {
54
+ result.additionalContext = securityResult.reason;
55
+ }
56
+ return result;
57
+ }
58
+ }
37
59
  }
38
- // 2. Then run governance rules
60
+ // Track routing compliance but don't block (inspired by ruflo's design)
61
+ this.trackRoutingCompliance(event);
62
+ // Run governance rules
39
63
  const { result } = await this.handleWithDecision(event);
40
64
  return result;
41
65
  }
42
66
  /**
43
- * Enforce routing decisions: if session was routed to an agent,
44
- * block direct tool calls that bypass the agent.
67
+ * Track routing compliance without blocking (inspired by ruflo's design).
68
+ *
69
+ * Ruflo's approach: routing is a SUGGESTION enforced by CLAUDE.md instructions,
70
+ * not a hard block in the hook layer. This prevents the deadlock where:
71
+ * 1. UserPrompt injects [ROUTE_TO: agent]
72
+ * 2. PreToolUse blocks all tools
73
+ * 3. Claude can't call Agent tool because it's blocked
74
+ *
75
+ * New approach: Let CLAUDE.md guide behavior, track compliance for metrics.
45
76
  */
46
- checkRoutingEnforcement(event) {
77
+ trackRoutingCompliance(event) {
47
78
  const routing = routingState.getRouting(event.session_id);
48
- logger.warn(`[PreToolUse] checkRoutingEnforcement: session=${event.session_id}, tool=${event.tool_name}, routing=${routing ? routing.agentName : 'null'}`);
49
79
  if (!routing) {
50
- logger.warn(`[PreToolUse] No routing state found, allowing`);
51
- return { allow: true }; // No active routing, allow everything
80
+ return; // No active routing
52
81
  }
53
82
  const toolName = event.tool_name;
54
83
  if (!toolName) {
55
- return { allow: true };
84
+ return;
56
85
  }
57
- // Allow whitelisted tools (investigation phase)
58
- if (ROUTING_WHITELIST.has(toolName)) {
59
- logger.info(`[PreToolUse] Tool ${toolName} is whitelisted, allowing`);
60
- return { allow: true };
61
- }
62
- // Check if this is the correct Agent/Task call
86
+ // Track Agent tool invocations
63
87
  if (toolName === 'Agent' || toolName === 'Task') {
64
88
  const subagentType = event.tool_input?.subagent_type;
65
89
  if (subagentType === routing.agentName) {
66
- // Correct agent invoked - clear routing state and allow
90
+ // Correct agent invoked - clear routing state
67
91
  routingState.clearRouting(event.session_id);
68
- logger.info(`[PreToolUse] Routing enforced: ${routing.agentName} invoked correctly`);
69
- return { allow: true };
92
+ logger.info(`[PreToolUse] Routing complied: ${routing.agentName} invoked correctly`);
93
+ }
94
+ else {
95
+ logger.warn(`[PreToolUse] ⚠️ Routing mismatch: expected ${routing.agentName}, got ${subagentType}`);
70
96
  }
71
- // Wrong agent - block
72
- logger.warn(`[PreToolUse] Routing violation: expected ${routing.agentName}, got ${subagentType}`);
73
- return {
74
- allow: false,
75
- reason: [
76
- `⚠️ 路由冲突:当前任务已被路由到 ${routing.agentName} agent。`,
77
- ``,
78
- `你尝试调用的是 ${subagentType},这与路由决策不符。`,
79
- ``,
80
- `请使用正确的 agent:`,
81
- ` Tool: Agent`,
82
- ` subagent_type: "${routing.agentName}"`,
83
- ` prompt: <用户原始 prompt>`,
84
- ].join('\n'),
85
- };
86
97
  }
87
- // Enforcement tools (Edit/Write/Bash) - block and force Agent call
88
- if (ROUTING_ENFORCEMENT_TOOLS.has(toolName)) {
89
- logger.warn(`[PreToolUse] Routing enforcement: blocked ${toolName}, must use ${routing.agentName}`);
90
- return {
91
- allow: false,
92
- reason: [
93
- `⚠️ 路由强制执行:当前任务必须通过 ${routing.agentName} agent 处理。`,
94
- ``,
95
- `你尝试直接调用 ${toolName} 工具,这违反了路由决策。`,
96
- ``,
97
- `正确做法:使用 Agent 工具调用专业 agent`,
98
- ` Tool: Agent`,
99
- ` subagent_type: "${routing.agentName}"`,
100
- ` description: "执行用户请求的任务"`,
101
- ` prompt: <将用户的完整 prompt 传入>`,
102
- ``,
103
- `Agent 职责:${routing.agentDescription}`,
104
- ].join('\n'),
105
- };
98
+ // Log potential routing bypasses (for metrics, not blocking)
99
+ if (ROUTING_ENFORCEMENT_TOOLS.has(toolName) && toolName !== 'Agent' && toolName !== 'Task') {
100
+ logger.info(`[PreToolUse] ℹ️ Direct tool usage while routing active: ${toolName} (routed to ${routing.agentName})`);
106
101
  }
107
- // Other tools - allow (e.g., AskUserQuestion for clarification)
108
- return { allow: true };
109
102
  }
110
103
  async handleWithDecision(event) {
111
104
  try {