@specpow/framework 0.2.2 → 0.4.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 (108) hide show
  1. package/.specpow/hooks/session-start +1 -1
  2. package/.specpow/skills/cli-router/SKILL.md +107 -0
  3. package/.specpow/skills/execution-parallel-agents/SKILL.md +0 -5
  4. package/.specpow/skills/execution-sdd-orchestrator/SKILL.md +366 -0
  5. package/.specpow/skills/execution-subagent-dispatch/SKILL.md +295 -0
  6. package/.specpow/skills/execution-subagent-driven-dev/SKILL.md +0 -5
  7. package/.specpow/skills/planning-apply-change/SKILL.md +0 -5
  8. package/.specpow/skills/planning-explore/SKILL.md +0 -5
  9. package/.specpow/skills/planning-propose/SKILL.md +0 -5
  10. package/.specpow/skills/using-specpow/SKILL.md +232 -0
  11. package/CHANGELOG.md +143 -0
  12. package/README.md +55 -20
  13. package/dist/cli/index.d.ts.map +1 -1
  14. package/dist/cli/index.js +13 -0
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/commands/apply.d.ts +1 -0
  17. package/dist/commands/apply.d.ts.map +1 -1
  18. package/dist/commands/apply.js +93 -3
  19. package/dist/commands/apply.js.map +1 -1
  20. package/dist/commands/channel.d.ts.map +1 -1
  21. package/dist/commands/channel.js +10 -3
  22. package/dist/commands/channel.js.map +1 -1
  23. package/dist/commands/config.js +1 -1
  24. package/dist/commands/config.js.map +1 -1
  25. package/dist/commands/debug.d.ts.map +1 -1
  26. package/dist/commands/debug.js +0 -1
  27. package/dist/commands/debug.js.map +1 -1
  28. package/dist/commands/doctor.d.ts.map +1 -1
  29. package/dist/commands/doctor.js +11 -16
  30. package/dist/commands/doctor.js.map +1 -1
  31. package/dist/commands/init.d.ts.map +1 -1
  32. package/dist/commands/init.js +125 -4
  33. package/dist/commands/init.js.map +1 -1
  34. package/dist/commands/propose.d.ts.map +1 -1
  35. package/dist/commands/propose.js +23 -10
  36. package/dist/commands/propose.js.map +1 -1
  37. package/dist/commands/review.d.ts.map +1 -1
  38. package/dist/commands/review.js +25 -0
  39. package/dist/commands/review.js.map +1 -1
  40. package/dist/commands/status.js +2 -2
  41. package/dist/commands/status.js.map +1 -1
  42. package/dist/commands/verify.d.ts.map +1 -1
  43. package/dist/commands/verify.js +26 -1
  44. package/dist/commands/verify.js.map +1 -1
  45. package/dist/core/agent-contract.d.ts +1 -1
  46. package/dist/core/agent-contract.d.ts.map +1 -1
  47. package/dist/core/artifact-graph/types.d.ts +4 -4
  48. package/dist/core/channel/channel-event-log.d.ts +1 -0
  49. package/dist/core/channel/channel-event-log.d.ts.map +1 -1
  50. package/dist/core/channel/channel-event-log.js +4 -2
  51. package/dist/core/channel/channel-event-log.js.map +1 -1
  52. package/dist/core/channel/channel-runtime.d.ts +8 -1
  53. package/dist/core/channel/channel-runtime.d.ts.map +1 -1
  54. package/dist/core/channel/channel-runtime.js +29 -2
  55. package/dist/core/channel/channel-runtime.js.map +1 -1
  56. package/dist/core/hooks/hook-registry.d.ts +1 -1
  57. package/dist/core/hooks/hook-registry.d.ts.map +1 -1
  58. package/dist/core/hooks/hook-registry.js +13 -15
  59. package/dist/core/hooks/hook-registry.js.map +1 -1
  60. package/dist/core/hooks/hook-types.d.ts +3 -3
  61. package/dist/core/hooks/hook-types.d.ts.map +1 -1
  62. package/dist/core/hooks/post-tool-call-hook.d.ts.map +1 -1
  63. package/dist/core/hooks/post-tool-call-hook.js +17 -11
  64. package/dist/core/hooks/post-tool-call-hook.js.map +1 -1
  65. package/dist/core/hooks/pre-tool-call-hook.d.ts.map +1 -1
  66. package/dist/core/hooks/pre-tool-call-hook.js +1 -2
  67. package/dist/core/hooks/pre-tool-call-hook.js.map +1 -1
  68. package/dist/core/hooks/session-start-hook.d.ts +1 -1
  69. package/dist/core/hooks/session-start-hook.d.ts.map +1 -1
  70. package/dist/core/hooks/session-start-hook.js +88 -18
  71. package/dist/core/hooks/session-start-hook.js.map +1 -1
  72. package/dist/core/init/engine.d.ts +6 -0
  73. package/dist/core/init/engine.d.ts.map +1 -1
  74. package/dist/core/init/engine.js +3 -1
  75. package/dist/core/init/engine.js.map +1 -1
  76. package/dist/core/parsers/index.d.ts.map +1 -1
  77. package/dist/core/parsers/index.js +16 -0
  78. package/dist/core/parsers/index.js.map +1 -1
  79. package/dist/core/sdd-engine/ai-caller.d.ts +5 -0
  80. package/dist/core/sdd-engine/ai-caller.d.ts.map +1 -1
  81. package/dist/core/sdd-engine/ai-caller.js +7 -2
  82. package/dist/core/sdd-engine/ai-caller.js.map +1 -1
  83. package/dist/core/sdd-engine/controller.d.ts +8 -0
  84. package/dist/core/sdd-engine/controller.d.ts.map +1 -1
  85. package/dist/core/sdd-engine/controller.js +26 -13
  86. package/dist/core/sdd-engine/controller.js.map +1 -1
  87. package/dist/core/sdd-engine/index.d.ts.map +1 -1
  88. package/dist/core/sdd-engine/index.js +0 -1
  89. package/dist/core/sdd-engine/index.js.map +1 -1
  90. package/dist/core/sdd-engine/model-selector.d.ts +6 -0
  91. package/dist/core/sdd-engine/model-selector.d.ts.map +1 -1
  92. package/dist/core/sdd-engine/model-selector.js +6 -0
  93. package/dist/core/sdd-engine/model-selector.js.map +1 -1
  94. package/dist/core/templates/index.d.ts.map +1 -1
  95. package/dist/core/templates/index.js +12 -2
  96. package/dist/core/templates/index.js.map +1 -1
  97. package/dist/templates/claude-commands/specpow-apply.md +23 -0
  98. package/dist/templates/claude-commands/specpow-archive.md +22 -0
  99. package/dist/templates/claude-commands/specpow-explore.md +21 -0
  100. package/dist/templates/claude-commands/specpow-propose.md +27 -0
  101. package/dist/templates/claude-commands/specpow-status.md +22 -0
  102. package/dist/templates/claude-commands/specpow-verify.md +21 -0
  103. package/dist/templates/claude-commands/specpow.md +33 -0
  104. package/package.json +1 -1
  105. package/dist/core/sdd-engine/dispatcher.d.ts +0 -62
  106. package/dist/core/sdd-engine/dispatcher.d.ts.map +0 -1
  107. package/dist/core/sdd-engine/dispatcher.js +0 -133
  108. package/dist/core/sdd-engine/dispatcher.js.map +0 -1
@@ -1,62 +0,0 @@
1
- /**
2
- * 任务分发器
3
- *
4
- * 负责将任务分发给子代理实现者
5
- * 核心原则:
6
- * - 每个任务分发一个全新的子代理(上下文隔离)
7
- * - 分发 prompt 只包含当前任务所需的信息
8
- * - 不传递历史任务的累积摘要
9
- *
10
- * @deprecated 此模块为遗留代码,当前未被任何 CLI 命令使用。
11
- * 功能已由 SDDController 通过 AICaller 实现。
12
- * 建议在未来版本中移除此文件,或将其集成到 CLI 命令中。
13
- */
14
- import type { TaskBrief, SDDConfig } from './types.js';
15
- export interface DispatchPrompt {
16
- taskContext: string;
17
- briefPath: string;
18
- reportPath: string;
19
- interfaces: string;
20
- resolutions: string;
21
- specConstraints: string;
22
- globalConstraints: string;
23
- }
24
- export declare class TaskDispatcher {
25
- private config;
26
- constructor(config: SDDConfig);
27
- /**
28
- * 构建实现者分发 prompt
29
- *
30
- * 关键设计:
31
- * - 简报路径是需求的唯一来源
32
- * - 不粘贴历史任务摘要
33
- * - 只传递接口信息和全局约束
34
- */
35
- buildImplementerPrompt(brief: TaskBrief, projectContext: string, priorInterfaces: string, specConstraints: string): DispatchPrompt;
36
- /**
37
- * 构建修复轮次的分发 prompt
38
- *
39
- * Rounds 1-3: 恢复原始实现者(上下文完整)
40
- * Rounds 4-5: 分发全新实现者,使用更强模型
41
- */
42
- buildFixPrompt(brief: TaskBrief, reportPath: string, openFindings: string[], round: number, useFreshAgent: boolean): DispatchPrompt;
43
- /**
44
- * 判断是否应该使用全新实现者
45
- * Rounds 1-3: 恢复原始实现者
46
- * Rounds 4-5: 全新实现者 + 更强模型
47
- */
48
- shouldUseFreshAgent(round: number): boolean;
49
- /**
50
- * 提取全局约束
51
- *
52
- * 从项目根目录的约束文件中读取全局编码规范,
53
- * 这些约束会注入到每个子代理的 prompt 中。
54
- *
55
- * 约束来源优先级:
56
- * 1. .specpow/config.json 中的 globalConstraints 字段
57
- * 2. CLAUDE.md / AGENTS.md / GEMINI.md 中的编码规范
58
- * 3. 默认约束
59
- */
60
- private extractGlobalConstraints;
61
- }
62
- //# sourceMappingURL=dispatcher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../src/core/sdd-engine/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAI7B;;;;;;;OAOG;IACH,sBAAsB,CACpB,KAAK,EAAE,SAAS,EAChB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,GACtB,cAAc;IAYjB;;;;;OAKG;IACH,cAAc,CACZ,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,OAAO,GACrB,cAAc;IAgBjB;;;;OAIG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;;;;;;;OAUG;IACH,OAAO,CAAC,wBAAwB;CAsEjC"}
@@ -1,133 +0,0 @@
1
- /**
2
- * 任务分发器
3
- *
4
- * 负责将任务分发给子代理实现者
5
- * 核心原则:
6
- * - 每个任务分发一个全新的子代理(上下文隔离)
7
- * - 分发 prompt 只包含当前任务所需的信息
8
- * - 不传递历史任务的累积摘要
9
- *
10
- * @deprecated 此模块为遗留代码,当前未被任何 CLI 命令使用。
11
- * 功能已由 SDDController 通过 AICaller 实现。
12
- * 建议在未来版本中移除此文件,或将其集成到 CLI 命令中。
13
- */
14
- import { existsSync, readFileSync } from 'fs';
15
- import { join } from 'path';
16
- export class TaskDispatcher {
17
- config;
18
- constructor(config) {
19
- this.config = config;
20
- }
21
- /**
22
- * 构建实现者分发 prompt
23
- *
24
- * 关键设计:
25
- * - 简报路径是需求的唯一来源
26
- * - 不粘贴历史任务摘要
27
- * - 只传递接口信息和全局约束
28
- */
29
- buildImplementerPrompt(brief, projectContext, priorInterfaces, specConstraints) {
30
- return {
31
- taskContext: `Project: ${projectContext}. Task ${brief.taskNumber}: ${brief.title}`,
32
- briefPath: brief.briefPath,
33
- reportPath: brief.reportPath,
34
- interfaces: priorInterfaces,
35
- resolutions: '',
36
- specConstraints,
37
- globalConstraints: this.extractGlobalConstraints(),
38
- };
39
- }
40
- /**
41
- * 构建修复轮次的分发 prompt
42
- *
43
- * Rounds 1-3: 恢复原始实现者(上下文完整)
44
- * Rounds 4-5: 分发全新实现者,使用更强模型
45
- */
46
- buildFixPrompt(brief, reportPath, openFindings, round, useFreshAgent) {
47
- const framing = useFreshAgent
48
- ? `A prior implementer attempted this task ${round - 1} time(s); you own it now. Read the report file for what was tried.`
49
- : `Fix round ${round}/5. Address the following open findings.`;
50
- return {
51
- taskContext: `${framing} Task ${brief.taskNumber}: ${brief.title}`,
52
- briefPath: brief.briefPath,
53
- reportPath,
54
- interfaces: '',
55
- resolutions: '',
56
- specConstraints: this.config.specConstraints,
57
- globalConstraints: `Open findings to address:\n${openFindings.map((f, i) => `${i + 1}. ${f}`).join('\n')}`,
58
- };
59
- }
60
- /**
61
- * 判断是否应该使用全新实现者
62
- * Rounds 1-3: 恢复原始实现者
63
- * Rounds 4-5: 全新实现者 + 更强模型
64
- */
65
- shouldUseFreshAgent(round) {
66
- return round >= 4;
67
- }
68
- /**
69
- * 提取全局约束
70
- *
71
- * 从项目根目录的约束文件中读取全局编码规范,
72
- * 这些约束会注入到每个子代理的 prompt 中。
73
- *
74
- * 约束来源优先级:
75
- * 1. .specpow/config.json 中的 globalConstraints 字段
76
- * 2. CLAUDE.md / AGENTS.md / GEMINI.md 中的编码规范
77
- * 3. 默认约束
78
- */
79
- extractGlobalConstraints() {
80
- const projectRoot = process.cwd();
81
- const constraints = [];
82
- // 1. 尝试读取 .specpow/config.json
83
- const configPath = join(projectRoot, '.specpow', 'config.json');
84
- if (existsSync(configPath)) {
85
- try {
86
- const config = JSON.parse(readFileSync(configPath, 'utf-8'));
87
- if (config.globalConstraints) {
88
- constraints.push(config.globalConstraints);
89
- }
90
- }
91
- catch {
92
- // 配置解析失败,跳过
93
- }
94
- }
95
- // 2. 尝试读取编码规范文件
96
- const specFiles = ['CLAUDE.md', 'AGENTS.md', 'GEMINI.md'];
97
- for (const file of specFiles) {
98
- const path = join(projectRoot, file);
99
- if (existsSync(path)) {
100
- try {
101
- const content = readFileSync(path, 'utf-8');
102
- // 提取编码规范相关的内容(常见模式)
103
- const patterns = [
104
- /(?:coding (?:standard|convention|style|guideline))[:\s]*([^\n]+)/gi,
105
- /(?:代码(?:规范|风格|标准))[:\s]*([^\n]+)/gi,
106
- /(?:naming (?:convention|pattern))[:\s]*([^\n]+)/gi,
107
- /(?:禁止|禁止使用|不允许)[^\n]+/gi,
108
- ];
109
- for (const pattern of patterns) {
110
- const matches = content.matchAll(pattern);
111
- for (const match of matches) {
112
- constraints.push(match[0].trim());
113
- }
114
- }
115
- // 限制从每个文件提取的约束数量
116
- if (constraints.length > 20)
117
- break;
118
- }
119
- catch {
120
- // 读取失败,跳过
121
- }
122
- }
123
- }
124
- // 3. 默认约束
125
- if (constraints.length === 0) {
126
- constraints.push('Follow existing code style and patterns in the project', 'Keep changes minimal and focused on the task', 'Prefer composition over inheritance', 'Handle errors explicitly');
127
- }
128
- // 4. TDD 铁律 — 始终注入(来自 execution-tdd 技能)
129
- constraints.push('', '## TDD 铁律:没有失败测试就不写产品代码', '遵循 RED-GREEN-REFACTOR 循环:', '1. RED: 先写一个描述期望行为的失败测试', '2. GREEN: 写最少的代码让测试通过(YAGNI)', '3. REFACTOR: 在测试保护下清理代码');
130
- return constraints.join('\n');
131
- }
132
- }
133
- //# sourceMappingURL=dispatcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../../src/core/sdd-engine/dispatcher.ts"],"names":[],"mappings":"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"}