speccore 8.3.182 → 8.3.189

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 (215) hide show
  1. package/.agents/skills/spec-analyze/SKILL.md +2 -169
  2. package/.agents/skills/spec-ask/SKILL.md +2 -177
  3. package/.agents/skills/spec-change/SKILL.md +2 -214
  4. package/.agents/skills/spec-dashboard/SKILL.md +1 -76
  5. package/.agents/skills/spec-deploy/SKILL.md +2 -298
  6. package/.agents/skills/spec-doc2spec/SKILL.md +2 -116
  7. package/.agents/skills/spec-done/SKILL.md +2 -203
  8. package/.agents/skills/spec-execute/SKILL.md +2 -178
  9. package/.agents/skills/spec-help/SKILL.md +1 -75
  10. package/.agents/skills/spec-iteration-create/SKILL.md +2 -123
  11. package/.agents/skills/spec-plan/SKILL.md +2 -117
  12. package/.agents/skills/spec-pr/SKILL.md +2 -203
  13. package/.agents/skills/spec-run/SKILL.md +16 -0
  14. package/.agents/skills/spec-spec2doc/SKILL.md +2 -121
  15. package/.agents/skills/spec-split/SKILL.md +2 -208
  16. package/.agents/skills/spec-task-create/SKILL.md +2 -151
  17. package/.agents/skills/spec-verify/SKILL.md +2 -214
  18. package/.agents/skills/spec-welcome/SKILL.md +1 -67
  19. package/.agents/skills/speccore-router/SKILL.md +14 -2
  20. package/README.en.md +9 -9
  21. package/README.md +2 -1
  22. package/dist/cli.js +24 -25
  23. package/dist/cli.js.map +1 -1
  24. package/dist/commands/about.js +1 -1
  25. package/dist/commands/about.js.map +1 -1
  26. package/dist/commands/analyze.d.ts +1 -0
  27. package/dist/commands/analyze.d.ts.map +1 -1
  28. package/dist/commands/analyze.js +38 -5
  29. package/dist/commands/analyze.js.map +1 -1
  30. package/dist/commands/ask.js +6 -6
  31. package/dist/commands/ask.js.map +1 -1
  32. package/dist/commands/dev.d.ts +2 -0
  33. package/dist/commands/dev.d.ts.map +1 -1
  34. package/dist/commands/dev.js +102 -1
  35. package/dist/commands/dev.js.map +1 -1
  36. package/dist/commands/doctor.js +28 -0
  37. package/dist/commands/doctor.js.map +1 -1
  38. package/dist/commands/execute.js +3 -3
  39. package/dist/commands/execute.js.map +1 -1
  40. package/dist/commands/init.d.ts.map +1 -1
  41. package/dist/commands/init.js +31 -52
  42. package/dist/commands/init.js.map +1 -1
  43. package/dist/commands/iteration/split.d.ts.map +1 -1
  44. package/dist/commands/iteration/split.js +12 -39
  45. package/dist/commands/iteration/split.js.map +1 -1
  46. package/dist/commands/knowledge.d.ts +0 -12
  47. package/dist/commands/knowledge.d.ts.map +1 -1
  48. package/dist/commands/knowledge.js +0 -80
  49. package/dist/commands/knowledge.js.map +1 -1
  50. package/dist/commands/refresh.d.ts.map +1 -1
  51. package/dist/commands/refresh.js +10 -0
  52. package/dist/commands/refresh.js.map +1 -1
  53. package/dist/commands/search.d.ts +1 -0
  54. package/dist/commands/search.d.ts.map +1 -1
  55. package/dist/commands/search.js +38 -0
  56. package/dist/commands/search.js.map +1 -1
  57. package/dist/commands/update.d.ts.map +1 -1
  58. package/dist/commands/update.js +13 -3
  59. package/dist/commands/update.js.map +1 -1
  60. package/dist/core/agent-adapter.d.ts +6 -0
  61. package/dist/core/agent-adapter.d.ts.map +1 -1
  62. package/dist/core/agent-adapter.js +56 -172
  63. package/dist/core/agent-adapter.js.map +1 -1
  64. package/dist/core/agents/defaults/code-generator.md +64 -0
  65. package/dist/core/agents/defaults/code-reviewer.md +5 -0
  66. package/dist/core/agents/defaults/compiler.md +7 -0
  67. package/dist/core/agents/defaults/compliance-checker.md +2 -0
  68. package/dist/core/agents/defaults/dependency-analyst.md +5 -0
  69. package/dist/core/agents/defaults/doc-sync-agent.md +5 -0
  70. package/dist/core/agents/defaults/effort-estimator.md +28 -0
  71. package/dist/core/agents/defaults/global-analyzer.md +66 -0
  72. package/dist/core/agents/defaults/impact-analyst.md +5 -0
  73. package/dist/core/agents/defaults/interaction-designer.md +5 -0
  74. package/dist/core/agents/defaults/performance-expert.md +2 -0
  75. package/dist/core/agents/defaults/product-analyst-backend.md +6 -0
  76. package/dist/core/agents/defaults/product-analyst-frontend.md +6 -0
  77. package/dist/core/agents/defaults/product-analyst.md +5 -0
  78. package/dist/core/agents/defaults/regression-tester.md +5 -0
  79. package/dist/core/agents/defaults/requirement-analyzer.md +72 -0
  80. package/dist/core/agents/defaults/risk-assessor.md +5 -0
  81. package/dist/core/agents/defaults/schedule-planner.md +5 -0
  82. package/dist/core/agents/defaults/security-reviewer-finance.md +6 -0
  83. package/dist/core/agents/defaults/security-reviewer.md +7 -0
  84. package/dist/core/agents/defaults/task-decomposer.md +5 -0
  85. package/dist/core/agents/defaults/test-engineer.md +2 -0
  86. package/dist/core/agents/defaults/test-reviewer.md +5 -0
  87. package/dist/core/agents/engine/agent-loader.d.ts.map +1 -1
  88. package/dist/core/agents/engine/agent-loader.js +76 -6
  89. package/dist/core/agents/engine/agent-loader.js.map +1 -1
  90. package/dist/core/agents/engine/types.d.ts +5 -0
  91. package/dist/core/agents/engine/types.d.ts.map +1 -1
  92. package/dist/core/analyze-engine.d.ts.map +1 -1
  93. package/dist/core/analyze-engine.js +73 -82
  94. package/dist/core/analyze-engine.js.map +1 -1
  95. package/dist/core/ask-engine.d.ts +0 -58
  96. package/dist/core/ask-engine.d.ts.map +1 -1
  97. package/dist/core/ask-engine.js +63 -361
  98. package/dist/core/ask-engine.js.map +1 -1
  99. package/dist/core/business-rules.d.ts +36 -0
  100. package/dist/core/business-rules.d.ts.map +1 -0
  101. package/dist/core/business-rules.js +109 -0
  102. package/dist/core/business-rules.js.map +1 -0
  103. package/dist/core/change-impact-global.d.ts.map +1 -1
  104. package/dist/core/change-impact-global.js +4 -3
  105. package/dist/core/change-impact-global.js.map +1 -1
  106. package/dist/core/code-scanner.d.ts +1 -0
  107. package/dist/core/code-scanner.d.ts.map +1 -1
  108. package/dist/core/code-scanner.js +32 -3
  109. package/dist/core/code-scanner.js.map +1 -1
  110. package/dist/core/content-delivery.d.ts +59 -0
  111. package/dist/core/content-delivery.d.ts.map +1 -0
  112. package/dist/core/content-delivery.js +219 -0
  113. package/dist/core/content-delivery.js.map +1 -0
  114. package/dist/core/global-artifacts.d.ts.map +1 -1
  115. package/dist/core/global-artifacts.js +262 -19
  116. package/dist/core/global-artifacts.js.map +1 -1
  117. package/dist/core/global-retrieval.d.ts +38 -0
  118. package/dist/core/global-retrieval.d.ts.map +1 -0
  119. package/dist/core/global-retrieval.js +100 -0
  120. package/dist/core/global-retrieval.js.map +1 -0
  121. package/dist/core/html-prototype.d.ts +22 -0
  122. package/dist/core/html-prototype.d.ts.map +1 -0
  123. package/dist/core/html-prototype.js +103 -0
  124. package/dist/core/html-prototype.js.map +1 -0
  125. package/dist/core/multi-lang-parser.d.ts +43 -0
  126. package/dist/core/multi-lang-parser.d.ts.map +1 -0
  127. package/dist/core/multi-lang-parser.js +317 -0
  128. package/dist/core/multi-lang-parser.js.map +1 -0
  129. package/dist/core/pipeline-engine.js +16 -16
  130. package/dist/core/pipeline-engine.js.map +1 -1
  131. package/dist/core/platform-inference.d.ts +35 -0
  132. package/dist/core/platform-inference.d.ts.map +1 -0
  133. package/dist/core/platform-inference.js +205 -0
  134. package/dist/core/platform-inference.js.map +1 -0
  135. package/dist/core/prompt-builder.d.ts +1 -1
  136. package/dist/core/prompt-builder.d.ts.map +1 -1
  137. package/dist/core/prompt-builder.js +62 -63
  138. package/dist/core/prompt-builder.js.map +1 -1
  139. package/dist/core/refresh-scheduler.d.ts +50 -0
  140. package/dist/core/refresh-scheduler.d.ts.map +1 -0
  141. package/dist/core/refresh-scheduler.js +139 -0
  142. package/dist/core/refresh-scheduler.js.map +1 -0
  143. package/dist/core/reverse-requirement.d.ts +54 -0
  144. package/dist/core/reverse-requirement.d.ts.map +1 -0
  145. package/dist/core/reverse-requirement.js +277 -0
  146. package/dist/core/reverse-requirement.js.map +1 -0
  147. package/dist/core/schemas/task.schema.d.ts +2 -2
  148. package/dist/core/spec-skeleton.d.ts.map +1 -1
  149. package/dist/core/spec-skeleton.js +123 -0
  150. package/dist/core/spec-skeleton.js.map +1 -1
  151. package/dist/core/unified-config.d.ts +14 -0
  152. package/dist/core/unified-config.d.ts.map +1 -1
  153. package/dist/core/unified-config.js +94 -10
  154. package/dist/core/unified-config.js.map +1 -1
  155. package/dist/core/unified-retrieval.d.ts.map +1 -1
  156. package/dist/core/unified-retrieval.js +34 -8
  157. package/dist/core/unified-retrieval.js.map +1 -1
  158. package/dist/utils/task-utils.d.ts +4 -0
  159. package/dist/utils/task-utils.d.ts.map +1 -1
  160. package/dist/utils/task-utils.js +18 -0
  161. package/dist/utils/task-utils.js.map +1 -1
  162. package/package.json +6 -4
  163. package/vendor/tree-sitter/tree-sitter-go.wasm +0 -0
  164. package/vendor/tree-sitter/tree-sitter-java.wasm +0 -0
  165. package/vendor/tree-sitter/tree-sitter-python.wasm +0 -0
  166. package/vendor/tree-sitter/tree-sitter-rust.wasm +0 -0
  167. package/.agents/agents/README.md +0 -79
  168. package/.agents/agents/spec-analyzer.md +0 -41
  169. package/.agents/agents/spec-architect.md +0 -57
  170. package/.agents/agents/spec-change-detector.md +0 -55
  171. package/.agents/agents/spec-clarifier.md +0 -83
  172. package/.agents/agents/spec-executor.md +0 -41
  173. package/.agents/agents/spec-gatekeeper.md +0 -84
  174. package/.agents/agents/spec-global-analyzer.md +0 -111
  175. package/.agents/agents/spec-knowledge-curator.md +0 -54
  176. package/.agents/agents/spec-reviewer.md +0 -46
  177. package/.agents/agents/spec-security-auditor.md +0 -56
  178. package/.agents/agents/spec-tester.md +0 -120
  179. package/.agents/skills/spec-analyze/references/analysis-report.md +0 -9
  180. package/.agents/skills/spec-execute/references/code-output.md +0 -13
  181. package/.agents/skills/spec-plan/references/plan-template.md +0 -29
  182. package/.agents/skills/spec-task-create/references/requirement-template.md +0 -23
  183. package/dist/commands/bugfix.d.ts +0 -17
  184. package/dist/commands/bugfix.d.ts.map +0 -1
  185. package/dist/commands/bugfix.js +0 -301
  186. package/dist/commands/bugfix.js.map +0 -1
  187. package/dist/commands/help-quick.d.ts +0 -3
  188. package/dist/commands/help-quick.d.ts.map +0 -1
  189. package/dist/commands/help-quick.js +0 -66
  190. package/dist/commands/help-quick.js.map +0 -1
  191. package/dist/commands/index-update.d.ts +0 -8
  192. package/dist/commands/index-update.d.ts.map +0 -1
  193. package/dist/commands/index-update.js +0 -180
  194. package/dist/commands/index-update.js.map +0 -1
  195. package/dist/commands/schedule.d.ts +0 -26
  196. package/dist/commands/schedule.d.ts.map +0 -1
  197. package/dist/commands/schedule.js +0 -182
  198. package/dist/commands/schedule.js.map +0 -1
  199. package/dist/commands/watch.d.ts +0 -11
  200. package/dist/commands/watch.d.ts.map +0 -1
  201. package/dist/commands/watch.js +0 -166
  202. package/dist/commands/watch.js.map +0 -1
  203. package/dist/core/agents/defaults/_INDEX.md +0 -68
  204. package/dist/core/ai-markdown.d.ts +0 -5
  205. package/dist/core/ai-markdown.d.ts.map +0 -1
  206. package/dist/core/ai-markdown.js +0 -29
  207. package/dist/core/ai-markdown.js.map +0 -1
  208. package/dist/core/schedule-engine.d.ts +0 -25
  209. package/dist/core/schedule-engine.d.ts.map +0 -1
  210. package/dist/core/schedule-engine.js +0 -281
  211. package/dist/core/schedule-engine.js.map +0 -1
  212. package/dist/core/schedule-store.d.ts +0 -119
  213. package/dist/core/schedule-store.d.ts.map +0 -1
  214. package/dist/core/schedule-store.js +0 -216
  215. package/dist/core/schedule-store.js.map +0 -1
@@ -1,180 +0,0 @@
1
- "use strict";
2
- /**
3
- * index-update — 扫描 GLOBAL/PROJECTS/ 下所有项目需求,自动重建 GLOBAL/INDEX.md
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.indexUpdateCommand = indexUpdateCommand;
7
- const fs_extra_1 = require("fs-extra");
8
- const path_1 = require("path");
9
- const logger_1 = require("../utils/logger");
10
- const global_layer_1 = require("../core/global-layer");
11
- async function indexUpdateCommand(options) {
12
- const spinner = new logger_1.Spinner('Scanning requirements and rebuilding index');
13
- spinner.start();
14
- try {
15
- const globalDir = (0, path_1.join)(process.cwd(), '.speccore', 'GLOBAL');
16
- if (!(await (0, fs_extra_1.pathExists)(globalDir))) {
17
- spinner.fail('Global layer not initialized. Run: speccore init');
18
- return;
19
- }
20
- const projectsDir = (0, path_1.join)(globalDir, 'PROJECTS');
21
- if (!(await (0, fs_extra_1.pathExists)(projectsDir))) {
22
- spinner.fail('No projects found in GLOBAL/PROJECTS/');
23
- return;
24
- }
25
- const index = await (0, global_layer_1.readGlobalIndex)();
26
- const today = new Date().toISOString().split('T')[0];
27
- // 扫描所有项目
28
- const projects = await scanAllProjects(projectsDir);
29
- // 收集所有需求
30
- const allReqs = [];
31
- let totalReqs = 0;
32
- let newReqs = 0;
33
- let updatedReqs = 0;
34
- const currentReqIds = new Set();
35
- for (const proj of projects) {
36
- // 提取 REQ-XXX 条目
37
- const reqContent = await (0, fs_extra_1.readFile)((0, path_1.join)(projectsDir, proj, 'REQUIREMENT.md'), 'utf-8');
38
- const reqMatches = reqContent.matchAll(/### (REQ-\d+).*\n([\s\S]*?)(?=### REQ-\d+|$)/g);
39
- for (const match of reqMatches) {
40
- const reqId = match[1];
41
- const reqBody = match[2];
42
- currentReqIds.add(reqId);
43
- totalReqs++;
44
- // 从 GLOBAL/INDEX 查找现有状态
45
- const existingEntry = index.reqs?.find((r) => r.id === reqId);
46
- const name = extractField(reqBody, '需求名称') || proj;
47
- const status = extractField(reqBody, '状态') || '📝 待开发';
48
- const version = extractField(reqBody, '版本') || 'v1.0';
49
- allReqs.push({ id: reqId, project: proj, name, status, version });
50
- if (!existingEntry) {
51
- newReqs++;
52
- }
53
- else if (existingEntry.status !== status ||
54
- existingEntry.name !== name) {
55
- updatedReqs++;
56
- }
57
- }
58
- }
59
- // 重建 INDEX.md
60
- if (!options.dryRun) {
61
- await rebuildIndex(globalDir, allReqs, projects, totalReqs, today);
62
- }
63
- spinner.stop(options.dryRun ? 'Dry run completed (no changes made)' : 'Index rebuilt successfully');
64
- logger_1.logger.info('');
65
- logger_1.logger.info('📊 扫描结果:');
66
- logger_1.logger.info(` 项目数:${projects.length} 个`);
67
- logger_1.logger.info(` 需求数:${totalReqs} 条`);
68
- if (!options.dryRun) {
69
- logger_1.logger.info(` 新增需求:${newReqs} 条`);
70
- logger_1.logger.info(` 状态更新:${updatedReqs} 条`);
71
- logger_1.logger.info('');
72
- logger_1.logger.info('✅ GLOBAL/INDEX.md 已更新!');
73
- }
74
- else {
75
- logger_1.logger.info('');
76
- logger_1.logger.info('💡 预览模式(--dry-run),索引未被实际修改。');
77
- logger_1.logger.info(' 去除 --dry-run 执行实际更新。');
78
- }
79
- // 列出项目摘要
80
- logger_1.logger.info('');
81
- logger_1.logger.info('📁 项目摘要:');
82
- for (const proj of projects) {
83
- const reqCount = allReqs.filter((r) => r.project === proj).length;
84
- logger_1.logger.info(` - ${proj}: ${reqCount} 个需求`);
85
- }
86
- }
87
- catch (error) {
88
- spinner.fail(`Index update failed: ${error}`);
89
- throw error;
90
- }
91
- }
92
- /**
93
- * 扫描 GLOBAL/PROJECTS/ 下所有项目
94
- */
95
- async function scanAllProjects(projectsDir) {
96
- const projects = [];
97
- if (!(await (0, fs_extra_1.pathExists)(projectsDir)))
98
- return projects;
99
- const entries = await (0, fs_extra_1.readdir)(projectsDir, { withFileTypes: true });
100
- for (const entry of entries) {
101
- if (entry.isDirectory() && !entry.name.startsWith('_')) {
102
- const reqPath = (0, path_1.join)(projectsDir, entry.name, 'REQUIREMENT.md');
103
- if (await (0, fs_extra_1.pathExists)(reqPath)) {
104
- projects.push(entry.name);
105
- }
106
- }
107
- }
108
- return projects;
109
- }
110
- /**
111
- * 从 markdown 正文中提取字段
112
- */
113
- function extractField(body, field) {
114
- const patterns = [
115
- new RegExp(`\\*\\*${field}\\*\\*\\s*[::]\\s*([^\\n]+)`, 'i'),
116
- new RegExp(`\\|\\s*${field}\\s*\\|\\s*([^\\|]+)\\|`, 'i'),
117
- ];
118
- for (const pattern of patterns) {
119
- const match = body.match(pattern);
120
- if (match)
121
- return match[1].trim();
122
- }
123
- return null;
124
- }
125
- /**
126
- * 重建 INDEX.md
127
- */
128
- async function rebuildIndex(globalDir, reqs, projects, totalReqs, today) {
129
- const indexPath = (0, path_1.join)(globalDir, 'INDEX.md');
130
- // 按需求 ID 排序
131
- reqs.sort((a, b) => a.id.localeCompare(b.id));
132
- let content = `# 全量需求索引(Global Catalog)
133
-
134
- > 本文件是需求定位的"地图"。具体需求内容请查看各项目的 \`PROJECTS/{项目名}/REQUIREMENT.md\`。
135
- > 本文件由 \`speccore import\` 和 \`speccore index-update\` 自动维护,请勿手动编辑。
136
-
137
- ---
138
-
139
- ## 需求索引
140
-
141
- | 需求 ID | 项目 | 需求名称 | 状态 | 版本 | 文件路径 |
142
- | :--- | :--- | :--- | :--- | :--- | :--- |
143
- `;
144
- if (reqs.length === 0) {
145
- content += '| _暂无需求_ | - | - | - | - | - |\n';
146
- }
147
- else {
148
- for (const req of reqs) {
149
- content += `| ${req.id} | ${req.project} | ${req.name} | ${req.status} | ${req.version} | GLOBAL/PROJECTS/${req.project}/REQUIREMENT.md |\n`;
150
- }
151
- }
152
- content += `
153
- ---
154
-
155
- ## 项目列表
156
-
157
- | 项目名称 | 需求数 | 状态 | 最后更新 |
158
- | :--- | :--- | :--- | :--- |
159
- `;
160
- if (projects.length === 0) {
161
- content += '| _暂无项目_ | - | - | - |\n';
162
- }
163
- else {
164
- for (const proj of projects) {
165
- const reqCount = reqs.filter((r) => r.project === proj).length;
166
- content += `| ${proj} | ${reqCount} | 洝衃 | ${today} |\n`;
167
- }
168
- }
169
- content += `
170
- ---
171
-
172
- ## 版本信息
173
-
174
- | 版本 | 日期 | 变更说明 |
175
- | :--- | :--- | :--- |
176
- | v1.0 | ${today} | 由 speccore index-update 自动重建 |
177
- `;
178
- await (0, fs_extra_1.writeFile)(indexPath, content);
179
- }
180
- //# sourceMappingURL=index-update.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-update.js","sourceRoot":"","sources":["../../src/commands/index-update.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- export interface ScheduleCreateOptions {
2
- task?: string;
3
- all?: boolean;
4
- iteration?: string;
5
- at: string;
6
- name?: string;
7
- batchSize?: string;
8
- assignee?: string;
9
- type?: string;
10
- priority?: string;
11
- platform?: string;
12
- backend?: boolean;
13
- frontend?: boolean;
14
- }
15
- export declare function scheduleCreateCommand(options: ScheduleCreateOptions): Promise<void>;
16
- export declare function scheduleListCommand(): Promise<void>;
17
- export declare function scheduleCancelCommand(options: {
18
- id: string;
19
- }): Promise<void>;
20
- export declare function scheduleDetailCommand(options: {
21
- id: string;
22
- }): Promise<void>;
23
- export declare function scheduleDeleteCommand(options: {
24
- id: string;
25
- }): Promise<void>;
26
- //# sourceMappingURL=schedule.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"AAgDA,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IACjD,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC1D;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCzF;AAKD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAczD;AAKD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAYlF;AAKD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBlF;AAKD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAYlF"}
@@ -1,182 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.scheduleCreateCommand = scheduleCreateCommand;
4
- exports.scheduleListCommand = scheduleListCommand;
5
- exports.scheduleCancelCommand = scheduleCancelCommand;
6
- exports.scheduleDetailCommand = scheduleDetailCommand;
7
- exports.scheduleDeleteCommand = scheduleDeleteCommand;
8
- const logger_1 = require("../utils/logger");
9
- const context_1 = require("../core/context");
10
- // ============================================================
11
- // 轻量 schedule store(内联,不依赖 daemon)
12
- // ============================================================
13
- const fs_extra_1 = require("fs-extra");
14
- const path_1 = require("path");
15
- const SCHEDULE_FILE = '.speccore/local/schedule.json';
16
- let _store = null;
17
- async function loadStore() {
18
- if (_store)
19
- return _store;
20
- await (0, fs_extra_1.ensureDir)((0, path_1.join)(process.cwd(), '.speccore', 'local'));
21
- try {
22
- const data = await (0, fs_extra_1.readFile)(SCHEDULE_FILE, 'utf-8');
23
- _store = JSON.parse(data);
24
- }
25
- catch {
26
- _store = [];
27
- }
28
- return _store;
29
- }
30
- async function saveStore(store) {
31
- _store = store;
32
- await (0, fs_extra_1.writeFile)(SCHEDULE_FILE, JSON.stringify(store, null, 2));
33
- }
34
- function generateId() {
35
- return `sch-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
36
- }
37
- async function scheduleCreateCommand(options) {
38
- try {
39
- if (!options.task && !options.all) {
40
- logger_1.logger.error('必须指定 --task 或 --all');
41
- return;
42
- }
43
- if (options.task && options.all) {
44
- logger_1.logger.error('--task 和 --all 不能同时使用');
45
- return;
46
- }
47
- if (!options.at) {
48
- logger_1.logger.error('必须指定 --at "YYYY-MM-DD HH:mm:ss"');
49
- return;
50
- }
51
- const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
52
- if (!iteration) {
53
- logger_1.logger.error('未找到活跃迭代,请使用 --iteration 指定');
54
- return;
55
- }
56
- const taskName = options.name || (options.all ? `Batch all [${iteration}]` : `Execute ${options.task} [${iteration}]`);
57
- const task = {
58
- id: generateId(),
59
- name: taskName,
60
- iteration,
61
- taskId: options.task || null,
62
- all: !!options.all,
63
- scheduledAt: options.at,
64
- createdAt: new Date().toISOString(),
65
- status: 'pending',
66
- execOptions: {
67
- batchSize: options.batchSize ? parseInt(options.batchSize, 10) : undefined,
68
- assignee: options.assignee, type: options.type,
69
- priority: options.priority, platform: options.platform,
70
- backend: options.backend, frontend: options.frontend,
71
- },
72
- };
73
- const store = await loadStore();
74
- store.push(task);
75
- await saveStore(store);
76
- logger_1.logger.success(`调度任务已创建`);
77
- logger_1.logger.info(` ID: ${task.id}`);
78
- logger_1.logger.info(` 任务: ${task.name}`);
79
- logger_1.logger.info(` 执行时间: ${task.scheduledAt}`);
80
- logger_1.logger.info(` 状态: ⏳ 待执行`);
81
- }
82
- catch (error) {
83
- logger_1.logger.error(`创建调度任务失败: ${error.message}`);
84
- }
85
- }
86
- // ============================================================
87
- // schedule list
88
- // ============================================================
89
- async function scheduleListCommand() {
90
- try {
91
- const tasks = await loadStore();
92
- if (tasks.length === 0) {
93
- logger_1.logger.info('没有调度任务');
94
- return;
95
- }
96
- logger_1.logger.info(`共 ${tasks.length} 个调度任务:`);
97
- for (const t of tasks) {
98
- logger_1.logger.info(` ${t.id.slice(0, 14)} ${t.name.padEnd(25)} ${t.scheduledAt} ${t.status}`);
99
- }
100
- logger_1.logger.info('💡 speccore schedule detail --id=<id> 查看详情');
101
- logger_1.logger.info(' speccore schedule cancel --id=<id> 取消任务');
102
- }
103
- catch (error) {
104
- logger_1.logger.error(`查看失败: ${error.message}`);
105
- }
106
- }
107
- // ============================================================
108
- // schedule cancel
109
- // ============================================================
110
- async function scheduleCancelCommand(options) {
111
- try {
112
- if (!options.id) {
113
- logger_1.logger.error('请指定 --id=<id>');
114
- return;
115
- }
116
- const store = await loadStore();
117
- const idx = store.findIndex(t => t.id === options.id);
118
- if (idx === -1) {
119
- logger_1.logger.error(`未找到: ${options.id}`);
120
- return;
121
- }
122
- store[idx].status = 'cancelled';
123
- await saveStore(store);
124
- logger_1.logger.success(`已取消: ${store[idx].name}`);
125
- }
126
- catch (error) {
127
- logger_1.logger.error(`取消失败: ${error.message}`);
128
- }
129
- }
130
- // ============================================================
131
- // schedule detail
132
- // ============================================================
133
- async function scheduleDetailCommand(options) {
134
- try {
135
- if (!options.id) {
136
- logger_1.logger.error('请指定 --id=<id>');
137
- return;
138
- }
139
- const store = await loadStore();
140
- const t = store.find(t => t.id === options.id);
141
- if (!t) {
142
- logger_1.logger.error(`未找到: ${options.id}`);
143
- return;
144
- }
145
- logger_1.logger.info(`📋 ${t.name}`);
146
- logger_1.logger.info(` ID: ${t.id}`);
147
- logger_1.logger.info(` 状态: ${t.status}`);
148
- logger_1.logger.info(` 迭䝣: ${t.iteration}`);
149
- logger_1.logger.info(` 执行时间: ${t.scheduledAt}`);
150
- if (t.taskId)
151
- logger_1.logger.info(` 目标: ${t.taskId}`);
152
- if (t.all)
153
- logger_1.logger.info(` 目标: 全部 Task`);
154
- }
155
- catch (error) {
156
- logger_1.logger.error(`查看失败: ${error.message}`);
157
- }
158
- }
159
- // ============================================================
160
- // schedule delete
161
- // ============================================================
162
- async function scheduleDeleteCommand(options) {
163
- try {
164
- if (!options.id) {
165
- logger_1.logger.error('请指定 --id=<id>');
166
- return;
167
- }
168
- const store = await loadStore();
169
- const idx = store.findIndex(t => t.id === options.id);
170
- if (idx === -1) {
171
- logger_1.logger.error(`未找到: ${options.id}`);
172
- return;
173
- }
174
- store.splice(idx, 1);
175
- await saveStore(store);
176
- logger_1.logger.success(`已删除: ${options.id}`);
177
- }
178
- catch (error) {
179
- logger_1.logger.error(`删除失败: ${error.message}`);
180
- }
181
- }
182
- //# sourceMappingURL=schedule.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * watch — 文件变更自动校验
3
- *
4
- * 监听 Spec 文件变化,保存时自动运行 validate
5
- */
6
- export interface WatchOptions {
7
- task?: string;
8
- iteration?: string;
9
- }
10
- export declare function watchCommand(options: WatchOptions): Promise<void>;
11
- //# sourceMappingURL=watch.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDvE"}
@@ -1,166 +0,0 @@
1
- "use strict";
2
- /**
3
- * watch — 文件变更自动校验
4
- *
5
- * 监听 Spec 文件变化,保存时自动运行 validate
6
- */
7
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
- if (k2 === undefined) k2 = k;
9
- var desc = Object.getOwnPropertyDescriptor(m, k);
10
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
- desc = { enumerable: true, get: function() { return m[k]; } };
12
- }
13
- Object.defineProperty(o, k2, desc);
14
- }) : (function(o, m, k, k2) {
15
- if (k2 === undefined) k2 = k;
16
- o[k2] = m[k];
17
- }));
18
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
- Object.defineProperty(o, "default", { enumerable: true, value: v });
20
- }) : function(o, v) {
21
- o["default"] = v;
22
- });
23
- var __importStar = (this && this.__importStar) || (function () {
24
- var ownKeys = function(o) {
25
- ownKeys = Object.getOwnPropertyNames || function (o) {
26
- var ar = [];
27
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
- return ar;
29
- };
30
- return ownKeys(o);
31
- };
32
- return function (mod) {
33
- if (mod && mod.__esModule) return mod;
34
- var result = {};
35
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
- __setModuleDefault(result, mod);
37
- return result;
38
- };
39
- })();
40
- Object.defineProperty(exports, "__esModule", { value: true });
41
- exports.watchCommand = watchCommand;
42
- const fs_1 = require("fs");
43
- const path_1 = require("path");
44
- const fs_extra_1 = require("fs-extra");
45
- const logger_1 = require("../utils/logger");
46
- async function watchCommand(options) {
47
- const cwd = process.cwd();
48
- const watchDirs = [];
49
- // Determine what to watch
50
- if (options.task) {
51
- const iter = options.iteration || await findIterationForTask(cwd, options.task);
52
- if (iter) {
53
- watchDirs.push((0, path_1.join)(cwd, iter, options.task));
54
- }
55
- else {
56
- logger_1.logger.error(`Task "${options.task}" not found`);
57
- return;
58
- }
59
- }
60
- else if (options.iteration) {
61
- watchDirs.push((0, path_1.join)(cwd, options.iteration));
62
- }
63
- else {
64
- // Watch entire project
65
- watchDirs.push((0, path_1.join)(cwd, '.speccore'));
66
- watchDirs.push(cwd); // all iterations
67
- }
68
- logger_1.logger.info('');
69
- logger_1.logger.info('👀 Watching Spec files for changes...');
70
- logger_1.logger.info(' Save a file to auto-validate. Press Ctrl+C to stop.');
71
- logger_1.logger.info('');
72
- // Debounce: avoid duplicate validations for rapid saves
73
- const debounceMap = new Map();
74
- for (const dir of watchDirs) {
75
- if (!(await (0, fs_extra_1.pathExists)(dir))) {
76
- logger_1.logger.warn(` Directory not found: ${dir}`);
77
- continue;
78
- }
79
- watchRecursive(dir, (filePath) => {
80
- // Only react to .md and .yaml changes
81
- if (!filePath.endsWith('.md') && !filePath.endsWith('.yaml'))
82
- return;
83
- // Debounce 300ms
84
- if (debounceMap.has(filePath)) {
85
- clearTimeout(debounceMap.get(filePath));
86
- }
87
- debounceMap.set(filePath, setTimeout(() => {
88
- validateFile(filePath);
89
- debounceMap.delete(filePath);
90
- }, 300));
91
- });
92
- }
93
- // Keep process alive
94
- await new Promise(() => { });
95
- }
96
- function watchRecursive(dir, callback) {
97
- try {
98
- (0, fs_1.watch)(dir, { recursive: true }, (eventType, filename) => {
99
- if (filename && eventType === 'change') {
100
- callback((0, path_1.join)(dir, filename));
101
- }
102
- });
103
- }
104
- catch (err) {
105
- logger_1.logger.warn(`Watch error: ${err}`);
106
- }
107
- }
108
- async function findIterationForTask(cwd, taskId) {
109
- const { readdir } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
110
- const entries = await readdir(cwd, { withFileTypes: true });
111
- for (const e of entries) {
112
- if (e.isDirectory() && e.name.startsWith('Iteration-')) {
113
- if (await (0, fs_extra_1.pathExists)((0, path_1.join)(cwd, e.name, taskId))) {
114
- return e.name;
115
- }
116
- }
117
- }
118
- return '';
119
- }
120
- function validateFile(filePath) {
121
- const filename = filePath.split('/').pop() || filePath;
122
- const relPath = filePath.replace(process.cwd() + '/', '');
123
- // Quick validation heuristics
124
- let status;
125
- let detail = '';
126
- if (filePath.endsWith('.yaml')) {
127
- // Check YAML indentation (2-space rule)
128
- try {
129
- const { readFileSync } = require('fs');
130
- const content = readFileSync(filePath, 'utf-8');
131
- const lines = content.split('\n');
132
- let hasTab = false;
133
- for (const line of lines) {
134
- if (line.match(/^\t/)) {
135
- hasTab = true;
136
- break;
137
- }
138
- }
139
- status = hasTab ? '❌' : '✅';
140
- detail = hasTab ? ' (tab indentation — use 2 spaces)' : ' (valid YAML)';
141
- }
142
- catch {
143
- status = '❌';
144
- detail = ' (read error)';
145
- }
146
- }
147
- else if (filePath.endsWith('REQ.md')) {
148
- try {
149
- const { readFileSync } = require('fs');
150
- const content = readFileSync(filePath, 'utf-8');
151
- const sections = ['## 1. 需求背景', '## 2. 功能描述', '## 3. 接口定义', '## 4. 验收标准'];
152
- const missing = sections.filter(s => !content.includes(s));
153
- status = missing.length === 0 ? '✅' : '⚠️';
154
- detail = missing.length > 0 ? ` (missing: ${missing.map(s => s.split('. ')[1]).join(', ')})` : '';
155
- }
156
- catch {
157
- status = '❌';
158
- detail = ' (read error)';
159
- }
160
- }
161
- else {
162
- status = '✅';
163
- }
164
- logger_1.logger.info(` ${status} ${relPath}${detail}`);
165
- }
166
- //# sourceMappingURL=watch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}