speccore 6.83.0 → 6.89.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/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +32 -7
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/change.d.ts.map +1 -1
- package/dist/commands/change.js +39 -1
- package/dist/commands/change.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +118 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +75 -38
- package/dist/commands/pr.js.map +1 -1
- package/dist/core/agents/defaults/_INDEX.md +68 -0
- package/dist/core/agents/defaults/_TEMPLATE.md +34 -0
- package/dist/core/agents/defaults/code-reviewer.md +49 -0
- package/dist/core/agents/defaults/compiler.md +25 -0
- package/dist/core/agents/defaults/compliance-checker.md +38 -0
- package/dist/core/agents/defaults/dependency-analyst.md +42 -0
- package/dist/core/agents/defaults/doc-sync-agent.md +25 -0
- package/dist/core/agents/defaults/impact-analyst.md +37 -0
- package/dist/core/agents/defaults/interaction-designer.md +73 -0
- package/dist/core/agents/defaults/performance-expert.md +35 -0
- package/dist/core/agents/defaults/product-analyst-backend.md +68 -0
- package/dist/core/agents/defaults/product-analyst-frontend.md +72 -0
- package/dist/core/agents/defaults/product-analyst.md +48 -0
- package/dist/core/agents/defaults/regression-tester.md +36 -0
- package/dist/core/agents/defaults/risk-assessor.md +38 -0
- package/dist/core/agents/defaults/schedule-planner.md +37 -0
- package/dist/core/agents/defaults/security-reviewer-finance.md +67 -0
- package/dist/core/agents/defaults/security-reviewer.md +43 -0
- package/dist/core/agents/defaults/task-decomposer.md +33 -0
- package/dist/core/agents/defaults/test-engineer.md +25 -0
- package/dist/core/agents/defaults/test-reviewer.md +48 -0
- package/dist/core/agents/engine/agent-executor.d.ts +50 -0
- package/dist/core/agents/engine/agent-executor.d.ts.map +1 -0
- package/dist/core/agents/engine/agent-executor.js +225 -0
- package/dist/core/agents/engine/agent-executor.js.map +1 -0
- package/dist/core/agents/engine/agent-loader.d.ts +58 -0
- package/dist/core/agents/engine/agent-loader.d.ts.map +1 -0
- package/dist/core/agents/engine/agent-loader.js +377 -0
- package/dist/core/agents/engine/agent-loader.js.map +1 -0
- package/dist/core/agents/engine/types.d.ts +71 -0
- package/dist/core/agents/engine/types.d.ts.map +1 -0
- package/dist/core/agents/engine/types.js +8 -0
- package/dist/core/agents/engine/types.js.map +1 -0
- package/dist/core/agents/index.d.ts +4 -0
- package/dist/core/agents/index.d.ts.map +1 -1
- package/dist/core/agents/index.js +17 -1
- package/dist/core/agents/index.js.map +1 -1
- package/dist/core/command-loader.d.ts +31 -0
- package/dist/core/command-loader.d.ts.map +1 -0
- package/dist/core/command-loader.js +76 -0
- package/dist/core/command-loader.js.map +1 -0
- package/dist/core/commands/defaults/change-impact.md +40 -0
- package/dist/core/commands/defaults/pr-review.md +42 -0
- package/dist/core/commands/defaults/refactor.md +37 -0
- package/dist/core/context-injector.d.ts +56 -0
- package/dist/core/context-injector.d.ts.map +1 -0
- package/dist/core/context-injector.js +122 -0
- package/dist/core/context-injector.js.map +1 -0
- package/dist/core/hook-runner.d.ts +36 -0
- package/dist/core/hook-runner.d.ts.map +1 -0
- package/dist/core/hook-runner.js +93 -0
- package/dist/core/hook-runner.js.map +1 -0
- package/dist/core/hooks/defaults/post-execute.md +22 -0
- package/dist/core/hooks/defaults/pre-execute.md +18 -0
- package/dist/core/prompt-builder.d.ts +1 -0
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +60 -1
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/core/rule-loader.d.ts +38 -0
- package/dist/core/rule-loader.d.ts.map +1 -0
- package/dist/core/rule-loader.js +156 -0
- package/dist/core/rule-loader.js.map +1 -0
- package/dist/core/rules/defaults/_INDEX.md +16 -0
- package/dist/core/rules/defaults/api-design.md +44 -0
- package/dist/core/rules/defaults/database.md +37 -0
- package/dist/core/rules/defaults/frontend-common.md +38 -0
- package/dist/core/rules/defaults/nodejs.md +38 -0
- package/dist/core/rules/defaults/react.md +34 -0
- package/dist/core/rules/defaults/security.md +31 -0
- package/dist/core/rules/defaults/testing.md +35 -0
- package/dist/core/rules/defaults/typescript.md +36 -0
- package/dist/core/skill-loader.d.ts +28 -0
- package/dist/core/skill-loader.d.ts.map +1 -0
- package/dist/core/skill-loader.js +102 -0
- package/dist/core/skill-loader.js.map +1 -0
- package/dist/core/skills/defaults/caching.md +33 -0
- package/dist/core/skills/defaults/db-migration.md +46 -0
- package/dist/core/skills/defaults/deployment.md +50 -0
- package/dist/core/skills/defaults/logging.md +38 -0
- package/dist/core/verify-engine.d.ts +7 -0
- package/dist/core/verify-engine.d.ts.map +1 -1
- package/dist/core/verify-engine.js +27 -1
- package/dist/core/verify-engine.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-loader.js","sourceRoot":"","sources":["../../src/core/command-loader.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAsDH,kDAMC;AAMD,wCAMC;AAKD,8DAEC;AA7ED,+BAA4B;AAC5B,uCAAyD;AAEzD,MAAM,oBAAoB,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAOrE,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,IAAI,CAAC,CAAC,MAAM,IAAA,qBAAU,EAAC,GAAG,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAwC,EAAE,CAAC;IAEzD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACrD,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAErC,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAA,WAAI,EAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3D,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACjC,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,WAAmB;IAChD,MAAM,eAAe,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEtD,YAAY;IACZ,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IAClE,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,aAAa;IACb,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC1D,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,mBAAmB,CACvC,IAAY,EACZ,WAAmB;IAEnB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,QAAgB,EAAE,IAA4B;IAC3E,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,aAAa,GAAG,YAAY,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,yBAAyB;IAC7C,OAAO,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# 变更影响分析流程
|
|
2
|
+
|
|
3
|
+
## 任务
|
|
4
|
+
|
|
5
|
+
1. 分析用户输入的变更需求
|
|
6
|
+
2. 评估对现有任务的影响范围
|
|
7
|
+
3. 识别需要修改的文件和关联模块
|
|
8
|
+
4. 生成结构化的影响分析报告
|
|
9
|
+
|
|
10
|
+
## 用户输入
|
|
11
|
+
|
|
12
|
+
{{description}}
|
|
13
|
+
|
|
14
|
+
## 附件
|
|
15
|
+
|
|
16
|
+
{{attachments}}
|
|
17
|
+
|
|
18
|
+
## 现有任务
|
|
19
|
+
|
|
20
|
+
{{tasks}}
|
|
21
|
+
|
|
22
|
+
## 输出格式
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"intent": "new|change",
|
|
27
|
+
"structuredDesc": "结构化需求描述",
|
|
28
|
+
"impactReport": {
|
|
29
|
+
"directTasks": [{"id": "Task-XXX", "name": "", "impact": "描述"}],
|
|
30
|
+
"indirectTasks": [{"id": "Task-XXX", "name": "", "reason": "原因"}],
|
|
31
|
+
"newTasks": [{"name": "", "description": "", "platform": ""}]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 规则
|
|
37
|
+
|
|
38
|
+
- intent=new:新增功能,可能需要创建新任务
|
|
39
|
+
- intent=change:修改现有功能,影响已有任务
|
|
40
|
+
- 必须评估对 API 契约、数据模型、前端界面的影响
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# PR 审查流程
|
|
2
|
+
|
|
3
|
+
## 任务
|
|
4
|
+
|
|
5
|
+
1. 分析 git 变更,生成简洁的 commit 信息(< 72 字)
|
|
6
|
+
2. 对照 ANALYSIS.md 判断变更是否对齐分析范围
|
|
7
|
+
3. 检查代码质量和潜在风险
|
|
8
|
+
4. 返回 JSON 格式结果
|
|
9
|
+
|
|
10
|
+
## 变更文件
|
|
11
|
+
|
|
12
|
+
{{changedFiles}}
|
|
13
|
+
|
|
14
|
+
## 暂存文件
|
|
15
|
+
|
|
16
|
+
{{stagedFiles}}
|
|
17
|
+
|
|
18
|
+
## 变更差异
|
|
19
|
+
|
|
20
|
+
{{diff}}
|
|
21
|
+
|
|
22
|
+
## 分析文档
|
|
23
|
+
|
|
24
|
+
{{analysis}}
|
|
25
|
+
|
|
26
|
+
## 输出格式
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"commitMsg": "提交信息(中文,<72字)",
|
|
31
|
+
"analysisMatch": true|false,
|
|
32
|
+
"mismatchReason": "不匹配原因(仅 analysisMatch=false 时填写)",
|
|
33
|
+
"recommendation": "建议:auto-commit 或 confirm-first",
|
|
34
|
+
"qualityNotes": "代码质量备注(可选)"
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 规则
|
|
39
|
+
|
|
40
|
+
- analysisMatch=true:变更内容符合分析范围,可以直接提交
|
|
41
|
+
- analysisMatch=false:变更超出分析范围,建议用户先确认
|
|
42
|
+
- 若无分析文档,analysisMatch 填 true,但 recommend 填 "confirm-first"
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# 重构流程
|
|
2
|
+
|
|
3
|
+
## 任务
|
|
4
|
+
|
|
5
|
+
1. 分析现有代码,识别重构目标
|
|
6
|
+
2. 制定重构计划(小步快跑,每步可验证)
|
|
7
|
+
3. 确保重构不改变外部行为
|
|
8
|
+
4. 更新相关测试和文档
|
|
9
|
+
|
|
10
|
+
## 重构原则
|
|
11
|
+
|
|
12
|
+
1. **小步快跑**:每次只做一件事(重命名、提取函数、移动文件)
|
|
13
|
+
2. **绿灯保障**:重构前确保测试通过,重构后测试仍通过
|
|
14
|
+
3. **版本控制**:每个重构步骤单独提交
|
|
15
|
+
4. **不混合功能变更**:重构时不修改行为
|
|
16
|
+
|
|
17
|
+
## 检查清单
|
|
18
|
+
|
|
19
|
+
- [ ] 重构前有测试覆盖
|
|
20
|
+
- [ ] 重构后所有测试通过
|
|
21
|
+
- [ ] 接口契约未改变
|
|
22
|
+
- [ ] 性能未退化
|
|
23
|
+
- [ ] 文档已同步更新
|
|
24
|
+
|
|
25
|
+
## 输出格式
|
|
26
|
+
|
|
27
|
+
```markdown
|
|
28
|
+
## 重构计划
|
|
29
|
+
|
|
30
|
+
### 步骤 1:XXX
|
|
31
|
+
- 目标:
|
|
32
|
+
- 影响文件:
|
|
33
|
+
- 验证方式:
|
|
34
|
+
|
|
35
|
+
### 步骤 2:XXX
|
|
36
|
+
...
|
|
37
|
+
```
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Injector — 统一注入框架
|
|
3
|
+
*
|
|
4
|
+
* v6.89.0+: 将 RULES / AGENTS / COMMANDS / SKILLS / HOOKS 的注入逻辑
|
|
5
|
+
* 统一到一个入口,避免各命令文件重复实现。
|
|
6
|
+
*
|
|
7
|
+
* 使用方式:
|
|
8
|
+
* ```ts
|
|
9
|
+
* const injected = await injectAll(basePrompt, {
|
|
10
|
+
* projectRoot,
|
|
11
|
+
* command: 'execute',
|
|
12
|
+
* phase: 'code-gen',
|
|
13
|
+
* techStack: { language: 'typescript', framework: 'react' },
|
|
14
|
+
* agentContext: { iteration: 'Iteration-001' },
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
import type { AgentContext } from './agents';
|
|
19
|
+
import { type HookContext } from './hook-runner';
|
|
20
|
+
export interface InjectOptions {
|
|
21
|
+
projectRoot: string;
|
|
22
|
+
command?: string;
|
|
23
|
+
phase?: string;
|
|
24
|
+
agentContext?: AgentContext;
|
|
25
|
+
techStack?: {
|
|
26
|
+
language?: string;
|
|
27
|
+
framework?: string;
|
|
28
|
+
database?: string;
|
|
29
|
+
cache?: string;
|
|
30
|
+
frontend?: string;
|
|
31
|
+
};
|
|
32
|
+
platform?: string;
|
|
33
|
+
taskKeywords?: string[];
|
|
34
|
+
commandTemplate?: {
|
|
35
|
+
name: string;
|
|
36
|
+
vars: Record<string, string>;
|
|
37
|
+
};
|
|
38
|
+
hooks?: {
|
|
39
|
+
trigger: 'pre' | 'post';
|
|
40
|
+
hookContext: HookContext;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 统一注入入口:按需注入 RULES / AGENTS / COMMANDS / SKILLS / HOOKS
|
|
45
|
+
*/
|
|
46
|
+
export declare function injectAll(prompt: string, options: InjectOptions): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* 简化版:只注入 AGENTS
|
|
49
|
+
*/
|
|
50
|
+
export declare function injectAgents(prompt: string, command: string, phase: string, agentContext: AgentContext, projectRoot: string): Promise<string>;
|
|
51
|
+
/**
|
|
52
|
+
* 简化版:只注入 RULES
|
|
53
|
+
*/
|
|
54
|
+
export declare function injectRules(prompt: string, techStack: NonNullable<InjectOptions['techStack']>, projectRoot: string, platform?: string): Promise<string>;
|
|
55
|
+
export { runHooks, type HookContext, type HookResult } from './hook-runner';
|
|
56
|
+
//# sourceMappingURL=context-injector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-injector.d.ts","sourceRoot":"","sources":["../../src/core/context-injector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC9B,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,KAAK,GAAG,MAAM,CAAC;QACxB,WAAW,EAAE,WAAW,CAAC;KAC1B,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAyEvF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAClD,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Context Injector — 统一注入框架
|
|
4
|
+
*
|
|
5
|
+
* v6.89.0+: 将 RULES / AGENTS / COMMANDS / SKILLS / HOOKS 的注入逻辑
|
|
6
|
+
* 统一到一个入口,避免各命令文件重复实现。
|
|
7
|
+
*
|
|
8
|
+
* 使用方式:
|
|
9
|
+
* ```ts
|
|
10
|
+
* const injected = await injectAll(basePrompt, {
|
|
11
|
+
* projectRoot,
|
|
12
|
+
* command: 'execute',
|
|
13
|
+
* phase: 'code-gen',
|
|
14
|
+
* techStack: { language: 'typescript', framework: 'react' },
|
|
15
|
+
* agentContext: { iteration: 'Iteration-001' },
|
|
16
|
+
* });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.runHooks = void 0;
|
|
21
|
+
exports.injectAll = injectAll;
|
|
22
|
+
exports.injectAgents = injectAgents;
|
|
23
|
+
exports.injectRules = injectRules;
|
|
24
|
+
const rule_loader_1 = require("./rule-loader");
|
|
25
|
+
const agents_1 = require("./agents");
|
|
26
|
+
const command_loader_1 = require("./command-loader");
|
|
27
|
+
const skill_loader_1 = require("./skill-loader");
|
|
28
|
+
/**
|
|
29
|
+
* 统一注入入口:按需注入 RULES / AGENTS / COMMANDS / SKILLS / HOOKS
|
|
30
|
+
*/
|
|
31
|
+
async function injectAll(prompt, options) {
|
|
32
|
+
let result = prompt;
|
|
33
|
+
// 1. RULES 编码规范注入
|
|
34
|
+
if (options.techStack) {
|
|
35
|
+
const identifiers = [];
|
|
36
|
+
if (options.techStack.language)
|
|
37
|
+
identifiers.push(options.techStack.language.toLowerCase());
|
|
38
|
+
if (options.techStack.framework)
|
|
39
|
+
identifiers.push(options.techStack.framework.toLowerCase());
|
|
40
|
+
if (options.techStack.database)
|
|
41
|
+
identifiers.push(options.techStack.database.toLowerCase());
|
|
42
|
+
if (options.techStack.frontend)
|
|
43
|
+
identifiers.push(options.techStack.frontend.toLowerCase());
|
|
44
|
+
if (options.techStack.cache)
|
|
45
|
+
identifiers.push(options.techStack.cache.toLowerCase());
|
|
46
|
+
if (options.platform)
|
|
47
|
+
identifiers.push(options.platform.toLowerCase());
|
|
48
|
+
if (identifiers.length > 0) {
|
|
49
|
+
try {
|
|
50
|
+
const rules = await (0, rule_loader_1.resolveRulesForTechStack)(identifiers, options.projectRoot);
|
|
51
|
+
if (rules.length > 0) {
|
|
52
|
+
result += '\n\n';
|
|
53
|
+
result += (0, rule_loader_1.formatRulesPrompt)(rules);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// 静默跳过
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// 2. AGENTS 角色注入
|
|
62
|
+
if (options.command && options.phase && options.agentContext) {
|
|
63
|
+
try {
|
|
64
|
+
const agents = await (0, agents_1.resolveAgentsForPhase)(options.command, options.phase, options.agentContext, options.projectRoot);
|
|
65
|
+
if (agents.length > 0) {
|
|
66
|
+
result += '\n\n## 专业角色指引\n\n';
|
|
67
|
+
for (const ra of agents) {
|
|
68
|
+
result += ra.definition.rolePrompt;
|
|
69
|
+
result += '\n\n';
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// 静默跳过
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// 3. COMMANDS 命令模板注入
|
|
78
|
+
if (options.commandTemplate) {
|
|
79
|
+
try {
|
|
80
|
+
const template = await (0, command_loader_1.loadCommandTemplate)(options.commandTemplate.name, options.projectRoot);
|
|
81
|
+
if (template) {
|
|
82
|
+
result += '\n\n';
|
|
83
|
+
result += (0, command_loader_1.renderTemplate)(template.content, options.commandTemplate.vars);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// 静默跳过
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// 4. SKILLS 技能注入
|
|
91
|
+
if (options.taskKeywords && options.taskKeywords.length > 0) {
|
|
92
|
+
try {
|
|
93
|
+
const skills = await (0, skill_loader_1.resolveSkillsForTask)(options.taskKeywords, options.projectRoot);
|
|
94
|
+
if (skills.length > 0) {
|
|
95
|
+
result += '\n\n';
|
|
96
|
+
result += (0, skill_loader_1.formatSkillsPrompt)(skills);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// 静默跳过
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// 5. HOOKS 钩子执行(返回结果由调用方处理)
|
|
104
|
+
// HOOKS 不修改 prompt,而是返回执行结果,所以不在此处处理
|
|
105
|
+
// 调用方需要单独调用 runHooks
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 简化版:只注入 AGENTS
|
|
110
|
+
*/
|
|
111
|
+
async function injectAgents(prompt, command, phase, agentContext, projectRoot) {
|
|
112
|
+
return injectAll(prompt, { projectRoot, command, phase, agentContext });
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 简化版:只注入 RULES
|
|
116
|
+
*/
|
|
117
|
+
async function injectRules(prompt, techStack, projectRoot, platform) {
|
|
118
|
+
return injectAll(prompt, { projectRoot, techStack, platform });
|
|
119
|
+
}
|
|
120
|
+
var hook_runner_1 = require("./hook-runner");
|
|
121
|
+
Object.defineProperty(exports, "runHooks", { enumerable: true, get: function () { return hook_runner_1.runHooks; } });
|
|
122
|
+
//# sourceMappingURL=context-injector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-injector.js","sourceRoot":"","sources":["../../src/core/context-injector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HOOKS 生命周期钩子执行器
|
|
3
|
+
*
|
|
4
|
+
* 负责:
|
|
5
|
+
* 1. 扫描 .speccore/HOOKS/ 目录下的钩子定义
|
|
6
|
+
* 2. 在命令执行前后触发对应钩子
|
|
7
|
+
* 3. 支持 pre-{command} 和 post-{command} 两种钩子
|
|
8
|
+
*
|
|
9
|
+
* v6.88.0+
|
|
10
|
+
*/
|
|
11
|
+
export interface HookDefinition {
|
|
12
|
+
name: string;
|
|
13
|
+
content: string;
|
|
14
|
+
trigger: 'pre' | 'post';
|
|
15
|
+
command: string;
|
|
16
|
+
}
|
|
17
|
+
export interface HookContext {
|
|
18
|
+
command: string;
|
|
19
|
+
iteration?: string;
|
|
20
|
+
task?: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
export interface HookResult {
|
|
24
|
+
blocked: boolean;
|
|
25
|
+
reason?: string;
|
|
26
|
+
messages: string[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 执行指定命令的钩子
|
|
30
|
+
*/
|
|
31
|
+
export declare function runHooks(trigger: 'pre' | 'post', command: string, context: HookContext, projectRoot: string): Promise<HookResult>;
|
|
32
|
+
export declare function getBuiltinHookContents(): Promise<{
|
|
33
|
+
name: string;
|
|
34
|
+
content: string;
|
|
35
|
+
}[]>;
|
|
36
|
+
//# sourceMappingURL=hook-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-runner.d.ts","sourceRoot":"","sources":["../../src/core/hook-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAqDD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,KAAK,GAAG,MAAM,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC,CAuBrB;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAE3F"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HOOKS 生命周期钩子执行器
|
|
4
|
+
*
|
|
5
|
+
* 负责:
|
|
6
|
+
* 1. 扫描 .speccore/HOOKS/ 目录下的钩子定义
|
|
7
|
+
* 2. 在命令执行前后触发对应钩子
|
|
8
|
+
* 3. 支持 pre-{command} 和 post-{command} 两种钩子
|
|
9
|
+
*
|
|
10
|
+
* v6.88.0+
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.runHooks = runHooks;
|
|
14
|
+
exports.getBuiltinHookContents = getBuiltinHookContents;
|
|
15
|
+
const path_1 = require("path");
|
|
16
|
+
const fs_extra_1 = require("fs-extra");
|
|
17
|
+
const logger_1 = require("../utils/logger");
|
|
18
|
+
const BUILTIN_HOOKS_DIR = (0, path_1.join)(__dirname, 'hooks', 'defaults');
|
|
19
|
+
async function scanHookFiles(dir) {
|
|
20
|
+
if (!(await (0, fs_extra_1.pathExists)(dir)))
|
|
21
|
+
return [];
|
|
22
|
+
const entries = await (0, fs_extra_1.readdir)(dir, { withFileTypes: true });
|
|
23
|
+
const hooks = [];
|
|
24
|
+
for (const e of entries) {
|
|
25
|
+
if (!e.isFile() || !e.name.endsWith('.md'))
|
|
26
|
+
continue;
|
|
27
|
+
if (e.name.startsWith('_'))
|
|
28
|
+
continue;
|
|
29
|
+
const content = await (0, fs_extra_1.readFile)((0, path_1.join)(dir, e.name), 'utf-8');
|
|
30
|
+
hooks.push({
|
|
31
|
+
name: e.name.replace(/\.md$/, ''),
|
|
32
|
+
content,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return hooks;
|
|
36
|
+
}
|
|
37
|
+
function parseHookMeta(name) {
|
|
38
|
+
// 文件名格式:pre-execute.md 或 post-execute.md
|
|
39
|
+
const match = name.match(/^(pre|post)-(.+)$/);
|
|
40
|
+
if (match) {
|
|
41
|
+
return { trigger: match[1], command: match[2] };
|
|
42
|
+
}
|
|
43
|
+
return { trigger: 'pre', command: name };
|
|
44
|
+
}
|
|
45
|
+
async function loadAllHooks(projectRoot) {
|
|
46
|
+
const userHooksDir = (0, path_1.join)(projectRoot, '.speccore', 'HOOKS');
|
|
47
|
+
const hooks = [];
|
|
48
|
+
const builtinFiles = await scanHookFiles(BUILTIN_HOOKS_DIR);
|
|
49
|
+
for (const f of builtinFiles) {
|
|
50
|
+
const meta = parseHookMeta(f.name);
|
|
51
|
+
hooks.push({ name: f.name, content: f.content, trigger: meta.trigger, command: meta.command });
|
|
52
|
+
}
|
|
53
|
+
const userFiles = await scanHookFiles(userHooksDir);
|
|
54
|
+
for (const f of userFiles) {
|
|
55
|
+
const meta = parseHookMeta(f.name);
|
|
56
|
+
// 用户自定义覆盖内置
|
|
57
|
+
const idx = hooks.findIndex(h => h.trigger === meta.trigger && h.command === meta.command);
|
|
58
|
+
if (idx >= 0)
|
|
59
|
+
hooks[idx] = { name: f.name, content: f.content, trigger: meta.trigger, command: meta.command };
|
|
60
|
+
else
|
|
61
|
+
hooks.push({ name: f.name, content: f.content, trigger: meta.trigger, command: meta.command });
|
|
62
|
+
}
|
|
63
|
+
return hooks;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 执行指定命令的钩子
|
|
67
|
+
*/
|
|
68
|
+
async function runHooks(trigger, command, context, projectRoot) {
|
|
69
|
+
const allHooks = await loadAllHooks(projectRoot);
|
|
70
|
+
const matched = allHooks.filter(h => h.trigger === trigger && h.command === command);
|
|
71
|
+
const result = { blocked: false, messages: [] };
|
|
72
|
+
for (const hook of matched) {
|
|
73
|
+
try {
|
|
74
|
+
// 钩子执行:目前将钩子内容作为 prompt 输出给 AI
|
|
75
|
+
// 未来可扩展为执行实际脚本
|
|
76
|
+
result.messages.push(`[${trigger}-${command}] ${hook.name}`);
|
|
77
|
+
// 简单解析:如果钩子内容中有 "BLOCK:" 标记,则拦截
|
|
78
|
+
if (hook.content.includes('BLOCK:')) {
|
|
79
|
+
const reasonMatch = hook.content.match(/BLOCK:\s*(.+)/);
|
|
80
|
+
result.blocked = true;
|
|
81
|
+
result.reason = reasonMatch ? reasonMatch[1] : 'Hook blocked';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
logger_1.logger.warn(`钩子 ${hook.name} 执行失败: ${e}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
async function getBuiltinHookContents() {
|
|
91
|
+
return scanHookFiles(BUILTIN_HOOKS_DIR);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=hook-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-runner.js","sourceRoot":"","sources":["../../src/core/hook-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# post-execute 钩子
|
|
2
|
+
|
|
3
|
+
> 在 `speccore execute` 执行后触发
|
|
4
|
+
|
|
5
|
+
## 检查项
|
|
6
|
+
|
|
7
|
+
- [ ] 代码编译是否通过
|
|
8
|
+
- [ ] 测试是否全部通过
|
|
9
|
+
- [ ] 质量门禁是否达标
|
|
10
|
+
- [ ] 文档是否同步更新
|
|
11
|
+
|
|
12
|
+
## 自动操作
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
if (compileFailed) {
|
|
16
|
+
BLOCK: 代码编译失败,请修复后重新执行
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (testFailed) {
|
|
20
|
+
WARN: 测试未全部通过,请检查测试用例
|
|
21
|
+
}
|
|
22
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# pre-execute 钩子
|
|
2
|
+
|
|
3
|
+
> 在 `speccore execute` 执行前触发
|
|
4
|
+
|
|
5
|
+
## 检查项
|
|
6
|
+
|
|
7
|
+
- [ ] 当前分支是否为任务分支(feature/Task-XXX)
|
|
8
|
+
- [ ] 代码基线是否与迭代最新状态一致
|
|
9
|
+
- [ ] 相邻任务的接口契约是否已确认
|
|
10
|
+
- [ ] 是否有未提交的本地变更
|
|
11
|
+
|
|
12
|
+
## 自动操作
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
if (branch !== 'feature/{taskId}') {
|
|
16
|
+
BLOCK: 当前分支不是任务分支,请先切换到正确的任务分支
|
|
17
|
+
}
|
|
18
|
+
```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/core/prompt-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/core/prompt-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,10 @@ const knowledge_graph_1 = require("./knowledge-graph");
|
|
|
22
22
|
const context_builder_1 = require("./context-builder");
|
|
23
23
|
const spec_paths_1 = require("./spec-paths");
|
|
24
24
|
const unified_retrieval_1 = require("./unified-retrieval");
|
|
25
|
+
// v6.85.0+: RULES 规范库注入
|
|
26
|
+
const rule_loader_1 = require("./rule-loader");
|
|
27
|
+
// v6.86.0+: AGENTS 全阶段扩展
|
|
28
|
+
const agents_1 = require("./agents");
|
|
25
29
|
const techStackCache = new Map();
|
|
26
30
|
const constitutionCache = new Map();
|
|
27
31
|
const reqContentCache = new Map();
|
|
@@ -1185,6 +1189,55 @@ async function buildPrompt(command, options) {
|
|
|
1185
1189
|
projectPathsInfo = lines.join('\n');
|
|
1186
1190
|
}
|
|
1187
1191
|
}
|
|
1192
|
+
// v6.85.0+: 根据技术栈加载编码规范
|
|
1193
|
+
let rulesContent;
|
|
1194
|
+
if (command === 'execute') {
|
|
1195
|
+
const identifiers = [];
|
|
1196
|
+
if (techStack.language)
|
|
1197
|
+
identifiers.push(techStack.language.toLowerCase());
|
|
1198
|
+
if (techStack.framework)
|
|
1199
|
+
identifiers.push(techStack.framework.toLowerCase());
|
|
1200
|
+
if (techStack.database)
|
|
1201
|
+
identifiers.push(techStack.database.toLowerCase());
|
|
1202
|
+
if (techStack.frontend)
|
|
1203
|
+
identifiers.push(techStack.frontend.toLowerCase());
|
|
1204
|
+
if (techStack.cache)
|
|
1205
|
+
identifiers.push(techStack.cache.toLowerCase());
|
|
1206
|
+
if (options.platform)
|
|
1207
|
+
identifiers.push(options.platform.toLowerCase());
|
|
1208
|
+
if (identifiers.length > 0) {
|
|
1209
|
+
try {
|
|
1210
|
+
const rules = await (0, rule_loader_1.resolveRulesForTechStack)(identifiers, cwd);
|
|
1211
|
+
if (rules.length > 0) {
|
|
1212
|
+
rulesContent = (0, rule_loader_1.formatRulesPrompt)(rules);
|
|
1213
|
+
}
|
|
1214
|
+
}
|
|
1215
|
+
catch {
|
|
1216
|
+
// RULES 加载失败静默跳过,不影响主流程
|
|
1217
|
+
}
|
|
1218
|
+
}
|
|
1219
|
+
}
|
|
1220
|
+
// v6.86.0+: 为 split/plan 命令注入 AGENTS
|
|
1221
|
+
let instruction = getInstruction(command, context);
|
|
1222
|
+
if (command === 'split' || command === 'plan') {
|
|
1223
|
+
const phase = 'default';
|
|
1224
|
+
const agentContext = {
|
|
1225
|
+
iteration: options.iteration || '',
|
|
1226
|
+
};
|
|
1227
|
+
try {
|
|
1228
|
+
const agents = await (0, agents_1.resolveAgentsForPhase)(command, phase, agentContext, cwd);
|
|
1229
|
+
if (agents.length > 0) {
|
|
1230
|
+
instruction += '\n\n## 专业角色指引\n\n';
|
|
1231
|
+
for (const ra of agents) {
|
|
1232
|
+
instruction += ra.definition.rolePrompt;
|
|
1233
|
+
instruction += '\n\n';
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
catch {
|
|
1238
|
+
// AGENTS 加载失败静默跳过
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1188
1241
|
return {
|
|
1189
1242
|
marker: '[SPECCORE_PROMPT]',
|
|
1190
1243
|
version: '1.0',
|
|
@@ -1200,7 +1253,8 @@ async function buildPrompt(command, options) {
|
|
|
1200
1253
|
globalContext: (globalContext.indexSummary || globalContext.toc.length > 0) ? globalContext : undefined,
|
|
1201
1254
|
taskContext: taskContextStr,
|
|
1202
1255
|
projectPaths: projectPathsInfo,
|
|
1203
|
-
|
|
1256
|
+
rulesContent,
|
|
1257
|
+
instruction,
|
|
1204
1258
|
outputHint: command === 'execute'
|
|
1205
1259
|
? '请返回格式: {"files": [{"path": "工程标识/相对路径", "content": "代码内容"}]}'
|
|
1206
1260
|
: command === 'split'
|
|
@@ -1298,6 +1352,11 @@ function buildPromptText(prompt) {
|
|
|
1298
1352
|
lines.push(`- 前端: ${prompt.techStack.frontend}`);
|
|
1299
1353
|
lines.push('');
|
|
1300
1354
|
}
|
|
1355
|
+
// v6.85.0+: 编码规范注入
|
|
1356
|
+
if (prompt.rulesContent) {
|
|
1357
|
+
lines.push(prompt.rulesContent);
|
|
1358
|
+
lines.push('');
|
|
1359
|
+
}
|
|
1301
1360
|
// API 定义
|
|
1302
1361
|
if (prompt.apiSpecs.length > 0) {
|
|
1303
1362
|
lines.push('## API 接口定义');
|