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.
Files changed (96) hide show
  1. package/dist/commands/analyze.d.ts.map +1 -1
  2. package/dist/commands/analyze.js +32 -7
  3. package/dist/commands/analyze.js.map +1 -1
  4. package/dist/commands/change.d.ts.map +1 -1
  5. package/dist/commands/change.js +39 -1
  6. package/dist/commands/change.js.map +1 -1
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +118 -0
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/pr.d.ts.map +1 -1
  11. package/dist/commands/pr.js +75 -38
  12. package/dist/commands/pr.js.map +1 -1
  13. package/dist/core/agents/defaults/_INDEX.md +68 -0
  14. package/dist/core/agents/defaults/_TEMPLATE.md +34 -0
  15. package/dist/core/agents/defaults/code-reviewer.md +49 -0
  16. package/dist/core/agents/defaults/compiler.md +25 -0
  17. package/dist/core/agents/defaults/compliance-checker.md +38 -0
  18. package/dist/core/agents/defaults/dependency-analyst.md +42 -0
  19. package/dist/core/agents/defaults/doc-sync-agent.md +25 -0
  20. package/dist/core/agents/defaults/impact-analyst.md +37 -0
  21. package/dist/core/agents/defaults/interaction-designer.md +73 -0
  22. package/dist/core/agents/defaults/performance-expert.md +35 -0
  23. package/dist/core/agents/defaults/product-analyst-backend.md +68 -0
  24. package/dist/core/agents/defaults/product-analyst-frontend.md +72 -0
  25. package/dist/core/agents/defaults/product-analyst.md +48 -0
  26. package/dist/core/agents/defaults/regression-tester.md +36 -0
  27. package/dist/core/agents/defaults/risk-assessor.md +38 -0
  28. package/dist/core/agents/defaults/schedule-planner.md +37 -0
  29. package/dist/core/agents/defaults/security-reviewer-finance.md +67 -0
  30. package/dist/core/agents/defaults/security-reviewer.md +43 -0
  31. package/dist/core/agents/defaults/task-decomposer.md +33 -0
  32. package/dist/core/agents/defaults/test-engineer.md +25 -0
  33. package/dist/core/agents/defaults/test-reviewer.md +48 -0
  34. package/dist/core/agents/engine/agent-executor.d.ts +50 -0
  35. package/dist/core/agents/engine/agent-executor.d.ts.map +1 -0
  36. package/dist/core/agents/engine/agent-executor.js +225 -0
  37. package/dist/core/agents/engine/agent-executor.js.map +1 -0
  38. package/dist/core/agents/engine/agent-loader.d.ts +58 -0
  39. package/dist/core/agents/engine/agent-loader.d.ts.map +1 -0
  40. package/dist/core/agents/engine/agent-loader.js +377 -0
  41. package/dist/core/agents/engine/agent-loader.js.map +1 -0
  42. package/dist/core/agents/engine/types.d.ts +71 -0
  43. package/dist/core/agents/engine/types.d.ts.map +1 -0
  44. package/dist/core/agents/engine/types.js +8 -0
  45. package/dist/core/agents/engine/types.js.map +1 -0
  46. package/dist/core/agents/index.d.ts +4 -0
  47. package/dist/core/agents/index.d.ts.map +1 -1
  48. package/dist/core/agents/index.js +17 -1
  49. package/dist/core/agents/index.js.map +1 -1
  50. package/dist/core/command-loader.d.ts +31 -0
  51. package/dist/core/command-loader.d.ts.map +1 -0
  52. package/dist/core/command-loader.js +76 -0
  53. package/dist/core/command-loader.js.map +1 -0
  54. package/dist/core/commands/defaults/change-impact.md +40 -0
  55. package/dist/core/commands/defaults/pr-review.md +42 -0
  56. package/dist/core/commands/defaults/refactor.md +37 -0
  57. package/dist/core/context-injector.d.ts +56 -0
  58. package/dist/core/context-injector.d.ts.map +1 -0
  59. package/dist/core/context-injector.js +122 -0
  60. package/dist/core/context-injector.js.map +1 -0
  61. package/dist/core/hook-runner.d.ts +36 -0
  62. package/dist/core/hook-runner.d.ts.map +1 -0
  63. package/dist/core/hook-runner.js +93 -0
  64. package/dist/core/hook-runner.js.map +1 -0
  65. package/dist/core/hooks/defaults/post-execute.md +22 -0
  66. package/dist/core/hooks/defaults/pre-execute.md +18 -0
  67. package/dist/core/prompt-builder.d.ts +1 -0
  68. package/dist/core/prompt-builder.d.ts.map +1 -1
  69. package/dist/core/prompt-builder.js +60 -1
  70. package/dist/core/prompt-builder.js.map +1 -1
  71. package/dist/core/rule-loader.d.ts +38 -0
  72. package/dist/core/rule-loader.d.ts.map +1 -0
  73. package/dist/core/rule-loader.js +156 -0
  74. package/dist/core/rule-loader.js.map +1 -0
  75. package/dist/core/rules/defaults/_INDEX.md +16 -0
  76. package/dist/core/rules/defaults/api-design.md +44 -0
  77. package/dist/core/rules/defaults/database.md +37 -0
  78. package/dist/core/rules/defaults/frontend-common.md +38 -0
  79. package/dist/core/rules/defaults/nodejs.md +38 -0
  80. package/dist/core/rules/defaults/react.md +34 -0
  81. package/dist/core/rules/defaults/security.md +31 -0
  82. package/dist/core/rules/defaults/testing.md +35 -0
  83. package/dist/core/rules/defaults/typescript.md +36 -0
  84. package/dist/core/skill-loader.d.ts +28 -0
  85. package/dist/core/skill-loader.d.ts.map +1 -0
  86. package/dist/core/skill-loader.js +102 -0
  87. package/dist/core/skill-loader.js.map +1 -0
  88. package/dist/core/skills/defaults/caching.md +33 -0
  89. package/dist/core/skills/defaults/db-migration.md +46 -0
  90. package/dist/core/skills/defaults/deployment.md +50 -0
  91. package/dist/core/skills/defaults/logging.md +38 -0
  92. package/dist/core/verify-engine.d.ts +7 -0
  93. package/dist/core/verify-engine.d.ts.map +1 -1
  94. package/dist/core/verify-engine.js +27 -1
  95. package/dist/core/verify-engine.js.map +1 -1
  96. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-loader.js","sourceRoot":"","sources":["../../src/core/command-loader.ts"],"names":[],"mappings":"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"}
@@ -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
+ ```
@@ -77,6 +77,7 @@ export interface SpecCorePrompt {
77
77
  globalContext?: GlobalContext;
78
78
  taskContext?: string;
79
79
  projectPaths?: string;
80
+ rulesContent?: string;
80
81
  instruction: string;
81
82
  outputHint: string;
82
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/core/prompt-builder.ts"],"names":[],"mappings":"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"}
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
- instruction: getInstruction(command, context),
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 接口定义');