@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.
- package/dist/agents/methodologies/agent-builder.js +54 -7
- package/dist/agents/methodologies/agent-builder.js.map +1 -1
- package/dist/agents/methodologies/phases/bmad/analyze.d.ts.map +1 -1
- package/dist/agents/methodologies/phases/bmad/analyze.js +1 -0
- package/dist/agents/methodologies/phases/bmad/analyze.js.map +1 -1
- package/dist/agents/methodologies/phases/bmad/design.d.ts.map +1 -1
- package/dist/agents/methodologies/phases/bmad/design.js +1 -0
- package/dist/agents/methodologies/phases/bmad/design.js.map +1 -1
- package/dist/agents/methodologies/phases/bmad/implement.d.ts.map +1 -1
- package/dist/agents/methodologies/phases/bmad/implement.js +1 -0
- package/dist/agents/methodologies/phases/bmad/implement.js.map +1 -1
- package/dist/agents/methodologies/phases/bmad/review.d.ts.map +1 -1
- package/dist/agents/methodologies/phases/bmad/review.js +1 -0
- package/dist/agents/methodologies/phases/bmad/review.js.map +1 -1
- package/dist/agents/methodologies/phases/bmad/test.d.ts.map +1 -1
- package/dist/agents/methodologies/phases/bmad/test.js +1 -0
- package/dist/agents/methodologies/phases/bmad/test.js.map +1 -1
- package/dist/agents/methodologies/phases/harness/fix.d.ts.map +1 -1
- package/dist/agents/methodologies/phases/harness/fix.js +1 -0
- package/dist/agents/methodologies/phases/harness/fix.js.map +1 -1
- package/dist/agents/methodologies/phases/harness/reproduce.d.ts.map +1 -1
- package/dist/agents/methodologies/phases/harness/reproduce.js +1 -0
- package/dist/agents/methodologies/phases/harness/reproduce.js.map +1 -1
- package/dist/agents/methodologies/phases/harness/root-cause.d.ts.map +1 -1
- package/dist/agents/methodologies/phases/harness/root-cause.js +2 -1
- package/dist/agents/methodologies/phases/harness/root-cause.js.map +1 -1
- package/dist/agents/methodologies/phases/harness/safety-net.d.ts.map +1 -1
- package/dist/agents/methodologies/phases/harness/safety-net.js +1 -0
- package/dist/agents/methodologies/phases/harness/safety-net.js.map +1 -1
- package/dist/agents/methodologies/phases/harness/verify.d.ts.map +1 -1
- package/dist/agents/methodologies/phases/harness/verify.js +1 -0
- package/dist/agents/methodologies/phases/harness/verify.js.map +1 -1
- package/dist/agents/methodologies/types.d.ts +2 -0
- package/dist/agents/methodologies/types.d.ts.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +7 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/types.d.ts +10 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +13 -4
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.js +51 -58
- package/dist/daemon/handlers/pre-tool-use.js.map +1 -1
- package/dist/daemon/index.js +1 -1
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/routing-state.d.ts +1 -0
- package/dist/daemon/routing-state.d.ts.map +1 -1
- package/dist/daemon/routing-state.js +17 -0
- package/dist/daemon/routing-state.js.map +1 -1
- package/dist/engine/security-gates.d.ts +42 -0
- package/dist/engine/security-gates.d.ts.map +1 -0
- package/dist/engine/security-gates.js +210 -0
- package/dist/engine/security-gates.js.map +1 -0
- package/dist/skills/tools/skill-invoke.d.ts +2 -0
- package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
- package/dist/skills/tools/skill-invoke.js +5 -2
- package/dist/skills/tools/skill-invoke.js.map +1 -1
- package/dist/web/routes/agents.d.ts.map +1 -1
- package/dist/web/routes/agents.js +17 -0
- package/dist/web/routes/agents.js.map +1 -1
- 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
|
-
//
|
|
70
|
-
//
|
|
71
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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"}
|
|
@@ -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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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"}
|
|
@@ -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;
|
|
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;
|
|
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"}
|
package/dist/core/config.js
CHANGED
|
@@ -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
|
}
|
package/dist/core/config.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -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
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
18
|
+
private securityGates;
|
|
19
|
+
constructor(ruleEngine: RuleEngine, contextBuilder: ContextBuilder, securityConfig?: SecurityConfig);
|
|
18
20
|
handle(event: ForgeEvent): Promise<HookResult>;
|
|
19
21
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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
|
|
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;
|
|
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
|
-
|
|
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
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
//
|
|
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
|
-
*
|
|
44
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
84
|
+
return;
|
|
56
85
|
}
|
|
57
|
-
//
|
|
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
|
|
90
|
+
// Correct agent invoked - clear routing state
|
|
67
91
|
routingState.clearRouting(event.session_id);
|
|
68
|
-
logger.info(`[PreToolUse] Routing
|
|
69
|
-
|
|
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
|
-
//
|
|
88
|
-
if (ROUTING_ENFORCEMENT_TOOLS.has(toolName)) {
|
|
89
|
-
logger.
|
|
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 {
|