@trench-craft/sds 1.0.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 (276) hide show
  1. package/README.en.md +522 -0
  2. package/README.md +566 -0
  3. package/dist/bin/sds.d.ts +3 -0
  4. package/dist/bin/sds.d.ts.map +1 -0
  5. package/dist/bin/sds.js +50 -0
  6. package/dist/bin/sds.js.map +1 -0
  7. package/dist/src/__tests__/cli.test.d.ts +2 -0
  8. package/dist/src/__tests__/cli.test.d.ts.map +1 -0
  9. package/dist/src/__tests__/cli.test.js +37 -0
  10. package/dist/src/__tests__/cli.test.js.map +1 -0
  11. package/dist/src/__tests__/e2e.test.d.ts +5 -0
  12. package/dist/src/__tests__/e2e.test.d.ts.map +1 -0
  13. package/dist/src/__tests__/e2e.test.js +143 -0
  14. package/dist/src/__tests__/e2e.test.js.map +1 -0
  15. package/dist/src/__tests__/graph.test.d.ts +5 -0
  16. package/dist/src/__tests__/graph.test.d.ts.map +1 -0
  17. package/dist/src/__tests__/graph.test.js +423 -0
  18. package/dist/src/__tests__/graph.test.js.map +1 -0
  19. package/dist/src/__tests__/openspec.test.d.ts +5 -0
  20. package/dist/src/__tests__/openspec.test.d.ts.map +1 -0
  21. package/dist/src/__tests__/openspec.test.js +172 -0
  22. package/dist/src/__tests__/openspec.test.js.map +1 -0
  23. package/dist/src/commands/apply.d.ts +4 -0
  24. package/dist/src/commands/apply.d.ts.map +1 -0
  25. package/dist/src/commands/apply.js +14 -0
  26. package/dist/src/commands/apply.js.map +1 -0
  27. package/dist/src/commands/archive.d.ts +4 -0
  28. package/dist/src/commands/archive.d.ts.map +1 -0
  29. package/dist/src/commands/archive.js +20 -0
  30. package/dist/src/commands/archive.js.map +1 -0
  31. package/dist/src/commands/cache.d.ts +4 -0
  32. package/dist/src/commands/cache.d.ts.map +1 -0
  33. package/dist/src/commands/cache.js +31 -0
  34. package/dist/src/commands/cache.js.map +1 -0
  35. package/dist/src/commands/config.d.ts +4 -0
  36. package/dist/src/commands/config.d.ts.map +1 -0
  37. package/dist/src/commands/config.js +29 -0
  38. package/dist/src/commands/config.js.map +1 -0
  39. package/dist/src/commands/e2e.d.ts +4 -0
  40. package/dist/src/commands/e2e.d.ts.map +1 -0
  41. package/dist/src/commands/e2e.js +65 -0
  42. package/dist/src/commands/e2e.js.map +1 -0
  43. package/dist/src/commands/graph.d.ts +4 -0
  44. package/dist/src/commands/graph.d.ts.map +1 -0
  45. package/dist/src/commands/graph.js +783 -0
  46. package/dist/src/commands/graph.js.map +1 -0
  47. package/dist/src/commands/init.d.ts +4 -0
  48. package/dist/src/commands/init.d.ts.map +1 -0
  49. package/dist/src/commands/init.js +15 -0
  50. package/dist/src/commands/init.js.map +1 -0
  51. package/dist/src/commands/project.d.ts +4 -0
  52. package/dist/src/commands/project.d.ts.map +1 -0
  53. package/dist/src/commands/project.js +6 -0
  54. package/dist/src/commands/project.js.map +1 -0
  55. package/dist/src/commands/propose.d.ts +4 -0
  56. package/dist/src/commands/propose.d.ts.map +1 -0
  57. package/dist/src/commands/propose.js +26 -0
  58. package/dist/src/commands/propose.js.map +1 -0
  59. package/dist/src/commands/registry.d.ts +4 -0
  60. package/dist/src/commands/registry.d.ts.map +1 -0
  61. package/dist/src/commands/registry.js +6 -0
  62. package/dist/src/commands/registry.js.map +1 -0
  63. package/dist/src/commands/skills-install.d.ts +4 -0
  64. package/dist/src/commands/skills-install.d.ts.map +1 -0
  65. package/dist/src/commands/skills-install.js +158 -0
  66. package/dist/src/commands/skills-install.js.map +1 -0
  67. package/dist/src/commands/skills.d.ts +4 -0
  68. package/dist/src/commands/skills.d.ts.map +1 -0
  69. package/dist/src/commands/skills.js +19 -0
  70. package/dist/src/commands/skills.js.map +1 -0
  71. package/dist/src/commands/verify.d.ts +4 -0
  72. package/dist/src/commands/verify.d.ts.map +1 -0
  73. package/dist/src/commands/verify.js +31 -0
  74. package/dist/src/commands/verify.js.map +1 -0
  75. package/dist/src/core/engine.d.ts +33 -0
  76. package/dist/src/core/engine.d.ts.map +1 -0
  77. package/dist/src/core/engine.js +87 -0
  78. package/dist/src/core/engine.js.map +1 -0
  79. package/dist/src/core/engine.test.d.ts +2 -0
  80. package/dist/src/core/engine.test.d.ts.map +1 -0
  81. package/dist/src/core/engine.test.js +13 -0
  82. package/dist/src/core/engine.test.js.map +1 -0
  83. package/dist/src/core/session-state.d.ts +18 -0
  84. package/dist/src/core/session-state.d.ts.map +1 -0
  85. package/dist/src/core/session-state.js +55 -0
  86. package/dist/src/core/session-state.js.map +1 -0
  87. package/dist/src/core/session-state.test.d.ts +2 -0
  88. package/dist/src/core/session-state.test.d.ts.map +1 -0
  89. package/dist/src/core/session-state.test.js +90 -0
  90. package/dist/src/core/session-state.test.js.map +1 -0
  91. package/dist/src/core/subagent-timeout.d.ts +18 -0
  92. package/dist/src/core/subagent-timeout.d.ts.map +1 -0
  93. package/dist/src/core/subagent-timeout.js +61 -0
  94. package/dist/src/core/subagent-timeout.js.map +1 -0
  95. package/dist/src/core/subagent-timeout.test.d.ts +2 -0
  96. package/dist/src/core/subagent-timeout.test.d.ts.map +1 -0
  97. package/dist/src/core/subagent-timeout.test.js +57 -0
  98. package/dist/src/core/subagent-timeout.test.js.map +1 -0
  99. package/dist/src/core/task-sync.d.ts +19 -0
  100. package/dist/src/core/task-sync.d.ts.map +1 -0
  101. package/dist/src/core/task-sync.js +62 -0
  102. package/dist/src/core/task-sync.js.map +1 -0
  103. package/dist/src/core/task-sync.test.d.ts +2 -0
  104. package/dist/src/core/task-sync.test.d.ts.map +1 -0
  105. package/dist/src/core/task-sync.test.js +84 -0
  106. package/dist/src/core/task-sync.test.js.map +1 -0
  107. package/dist/src/graph/advanced-performance.d.ts +137 -0
  108. package/dist/src/graph/advanced-performance.d.ts.map +1 -0
  109. package/dist/src/graph/advanced-performance.js +375 -0
  110. package/dist/src/graph/advanced-performance.js.map +1 -0
  111. package/dist/src/graph/database.d.ts +79 -0
  112. package/dist/src/graph/database.d.ts.map +1 -0
  113. package/dist/src/graph/database.js +305 -0
  114. package/dist/src/graph/database.js.map +1 -0
  115. package/dist/src/graph/engine.d.ts +43 -0
  116. package/dist/src/graph/engine.d.ts.map +1 -0
  117. package/dist/src/graph/engine.js +334 -0
  118. package/dist/src/graph/engine.js.map +1 -0
  119. package/dist/src/graph/exporter.d.ts +56 -0
  120. package/dist/src/graph/exporter.d.ts.map +1 -0
  121. package/dist/src/graph/exporter.js +273 -0
  122. package/dist/src/graph/exporter.js.map +1 -0
  123. package/dist/src/graph/index.d.ts +21 -0
  124. package/dist/src/graph/index.d.ts.map +1 -0
  125. package/dist/src/graph/index.js +14 -0
  126. package/dist/src/graph/index.js.map +1 -0
  127. package/dist/src/graph/layouts.d.ts +77 -0
  128. package/dist/src/graph/layouts.d.ts.map +1 -0
  129. package/dist/src/graph/layouts.js +368 -0
  130. package/dist/src/graph/layouts.js.map +1 -0
  131. package/dist/src/graph/parser.d.ts +47 -0
  132. package/dist/src/graph/parser.d.ts.map +1 -0
  133. package/dist/src/graph/parser.js +228 -0
  134. package/dist/src/graph/parser.js.map +1 -0
  135. package/dist/src/graph/performance.d.ts +90 -0
  136. package/dist/src/graph/performance.d.ts.map +1 -0
  137. package/dist/src/graph/performance.js +275 -0
  138. package/dist/src/graph/performance.js.map +1 -0
  139. package/dist/src/graph/semantic.d.ts +151 -0
  140. package/dist/src/graph/semantic.d.ts.map +1 -0
  141. package/dist/src/graph/semantic.js +402 -0
  142. package/dist/src/graph/semantic.js.map +1 -0
  143. package/dist/src/graph/types.d.ts +114 -0
  144. package/dist/src/graph/types.d.ts.map +1 -0
  145. package/dist/src/graph/types.js +5 -0
  146. package/dist/src/graph/types.js.map +1 -0
  147. package/dist/src/graph/visualizer.d.ts +50 -0
  148. package/dist/src/graph/visualizer.d.ts.map +1 -0
  149. package/dist/src/graph/visualizer.js +869 -0
  150. package/dist/src/graph/visualizer.js.map +1 -0
  151. package/dist/src/openspec/apply.d.ts +16 -0
  152. package/dist/src/openspec/apply.d.ts.map +1 -0
  153. package/dist/src/openspec/apply.js +140 -0
  154. package/dist/src/openspec/apply.js.map +1 -0
  155. package/dist/src/openspec/archive.d.ts +3 -0
  156. package/dist/src/openspec/archive.d.ts.map +1 -0
  157. package/dist/src/openspec/archive.js +17 -0
  158. package/dist/src/openspec/archive.js.map +1 -0
  159. package/dist/src/openspec/e2e-generate.d.ts +39 -0
  160. package/dist/src/openspec/e2e-generate.d.ts.map +1 -0
  161. package/dist/src/openspec/e2e-generate.js +315 -0
  162. package/dist/src/openspec/e2e-generate.js.map +1 -0
  163. package/dist/src/openspec/e2e-runner.d.ts +32 -0
  164. package/dist/src/openspec/e2e-runner.d.ts.map +1 -0
  165. package/dist/src/openspec/e2e-runner.js +208 -0
  166. package/dist/src/openspec/e2e-runner.js.map +1 -0
  167. package/dist/src/openspec/explore.d.ts +3 -0
  168. package/dist/src/openspec/explore.d.ts.map +1 -0
  169. package/dist/src/openspec/explore.js +20 -0
  170. package/dist/src/openspec/explore.js.map +1 -0
  171. package/dist/src/openspec/propose.d.ts +8 -0
  172. package/dist/src/openspec/propose.d.ts.map +1 -0
  173. package/dist/src/openspec/propose.js +124 -0
  174. package/dist/src/openspec/propose.js.map +1 -0
  175. package/dist/src/openspec/verify.d.ts +13 -0
  176. package/dist/src/openspec/verify.d.ts.map +1 -0
  177. package/dist/src/openspec/verify.js +156 -0
  178. package/dist/src/openspec/verify.js.map +1 -0
  179. package/dist/src/platform/claudecode.d.ts +2 -0
  180. package/dist/src/platform/claudecode.d.ts.map +1 -0
  181. package/dist/src/platform/claudecode.js +7 -0
  182. package/dist/src/platform/claudecode.js.map +1 -0
  183. package/dist/src/platform/codex.d.ts +2 -0
  184. package/dist/src/platform/codex.d.ts.map +1 -0
  185. package/dist/src/platform/codex.js +7 -0
  186. package/dist/src/platform/codex.js.map +1 -0
  187. package/dist/src/platform/opencode.d.ts +2 -0
  188. package/dist/src/platform/opencode.d.ts.map +1 -0
  189. package/dist/src/platform/opencode.js +7 -0
  190. package/dist/src/platform/opencode.js.map +1 -0
  191. package/dist/src/platform/router.d.ts +13 -0
  192. package/dist/src/platform/router.d.ts.map +1 -0
  193. package/dist/src/platform/router.js +57 -0
  194. package/dist/src/platform/router.js.map +1 -0
  195. package/dist/src/skills/cache.d.ts +16 -0
  196. package/dist/src/skills/cache.d.ts.map +1 -0
  197. package/dist/src/skills/cache.js +53 -0
  198. package/dist/src/skills/cache.js.map +1 -0
  199. package/dist/src/skills/discovery.d.ts +12 -0
  200. package/dist/src/skills/discovery.d.ts.map +1 -0
  201. package/dist/src/skills/discovery.js +61 -0
  202. package/dist/src/skills/discovery.js.map +1 -0
  203. package/dist/src/skills/loader.d.ts +12 -0
  204. package/dist/src/skills/loader.d.ts.map +1 -0
  205. package/dist/src/skills/loader.js +69 -0
  206. package/dist/src/skills/loader.js.map +1 -0
  207. package/dist/src/skills/registry.d.ts +23 -0
  208. package/dist/src/skills/registry.d.ts.map +1 -0
  209. package/dist/src/skills/registry.js +68 -0
  210. package/dist/src/skills/registry.js.map +1 -0
  211. package/dist/src/utils/fs.d.ts +5 -0
  212. package/dist/src/utils/fs.d.ts.map +1 -0
  213. package/dist/src/utils/fs.js +23 -0
  214. package/dist/src/utils/fs.js.map +1 -0
  215. package/dist/src/utils/logger.d.ts +7 -0
  216. package/dist/src/utils/logger.d.ts.map +1 -0
  217. package/dist/src/utils/logger.js +8 -0
  218. package/dist/src/utils/logger.js.map +1 -0
  219. package/dist/src/utils/yaml.d.ts +3 -0
  220. package/dist/src/utils/yaml.d.ts.map +1 -0
  221. package/dist/src/utils/yaml.js +8 -0
  222. package/dist/src/utils/yaml.js.map +1 -0
  223. package/package.json +62 -0
  224. package/registry/skills-registry.yaml +218 -0
  225. package/skills/core/brainstorming/SKILL.md +259 -0
  226. package/skills/core/brainstorming/scripts/frame-template.html +214 -0
  227. package/skills/core/brainstorming/scripts/helper.js +88 -0
  228. package/skills/core/brainstorming/scripts/server.cjs +338 -0
  229. package/skills/core/brainstorming/scripts/start-server.sh +153 -0
  230. package/skills/core/brainstorming/scripts/stop-server.sh +55 -0
  231. package/skills/core/brainstorming/skill.yaml +12 -0
  232. package/skills/core/brainstorming/spec-document-reviewer-prompt.md +48 -0
  233. package/skills/core/brainstorming/visual-companion.md +286 -0
  234. package/skills/core/claude-code-core/SKILL.md +164 -0
  235. package/skills/core/claude-code-core/skill.yaml +14 -0
  236. package/skills/core/claude-code-prompt/SKILL.md +283 -0
  237. package/skills/core/claude-code-prompt/skill.yaml +14 -0
  238. package/skills/core/claude-code-subagent/SKILL.md +168 -0
  239. package/skills/core/claude-code-subagent/skill.yaml +14 -0
  240. package/skills/core/e2e-generate/SKILL.md +147 -0
  241. package/skills/core/e2e-generate/skill.yaml +12 -0
  242. package/skills/core/ecc-agents-md-router/SKILL.md +90 -0
  243. package/skills/core/ecc-agents-md-router/skill.yaml +12 -0
  244. package/skills/core/ecc-context-injector/SKILL.md +69 -0
  245. package/skills/core/ecc-context-injector/skill.yaml +12 -0
  246. package/skills/core/existing-code-caveman/SKILL.md +340 -0
  247. package/skills/core/existing-code-caveman/skill.yaml +12 -0
  248. package/skills/core/opsx-apply/SKILL.md +121 -0
  249. package/skills/core/opsx-apply/skill.yaml +12 -0
  250. package/skills/core/opsx-archive/SKILL.md +83 -0
  251. package/skills/core/opsx-archive/skill.yaml +12 -0
  252. package/skills/core/opsx-explore/SKILL.md +101 -0
  253. package/skills/core/opsx-explore/skill.yaml +12 -0
  254. package/skills/core/opsx-propose/SKILL.md +131 -0
  255. package/skills/core/opsx-propose/skill.yaml +16 -0
  256. package/skills/core/opsx-verify/SKILL.md +109 -0
  257. package/skills/core/opsx-verify/skill.yaml +12 -0
  258. package/skills/core/subagent-driven-development/SKILL.md +157 -0
  259. package/skills/core/subagent-driven-development/code-quality-reviewer-prompt.md +64 -0
  260. package/skills/core/subagent-driven-development/implementer-prompt.md +122 -0
  261. package/skills/core/subagent-driven-development/skill.yaml +12 -0
  262. package/skills/core/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  263. package/skills/core/writing-plans/SKILL.md +268 -0
  264. package/skills/core/writing-plans/plan-document-reviewer-prompt.md +63 -0
  265. package/skills/core/writing-plans/skill.yaml +12 -0
  266. package/skills/locale/chinese-code-review/SKILL.md +17 -0
  267. package/skills/locale/chinese-code-review/skill.yaml +16 -0
  268. package/skills/locale/chinese-commit-conventions/SKILL.md +17 -0
  269. package/skills/locale/chinese-commit-conventions/skill.yaml +16 -0
  270. package/skills/locale/chinese-documentation/SKILL.md +17 -0
  271. package/skills/locale/chinese-documentation/skill.yaml +16 -0
  272. package/skills/locale/chinese-git-workflow/SKILL.md +17 -0
  273. package/skills/locale/chinese-git-workflow/skill.yaml +16 -0
  274. package/templates/agents-md.md +42 -0
  275. package/templates/claude-md.md +44 -0
  276. package/templates/codex-md.md +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualizer.js","sourceRoot":"","sources":["../../../src/graph/visualizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { SDSEngine } from '../core/engine.js';
2
+ export type ExecutionMode = 'subagent' | 'inline';
3
+ export interface ApplyOptions {
4
+ executionMode: ExecutionMode;
5
+ }
6
+ export interface TaskDispatchInfo {
7
+ taskName: string;
8
+ taskText: string;
9
+ must: string[];
10
+ shall: string[];
11
+ specsPath: string;
12
+ designPath: string;
13
+ changeDir: string;
14
+ }
15
+ export declare function opsxApply(engine: SDSEngine, changeName: string, executionMode?: ExecutionMode): Promise<TaskDispatchInfo[]>;
16
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/openspec/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAM9C,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,aAAa,GAAE,aAA0B,GACxC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAkG7B"}
@@ -0,0 +1,140 @@
1
+ import { resolve } from 'path';
2
+ import { TaskSyncManager } from '../core/task-sync.js';
3
+ import { SessionStateManager } from '../core/session-state.js';
4
+ import { SubagentRunner } from '../core/subagent-timeout.js';
5
+ export async function opsxApply(engine, changeName, executionMode = 'subagent') {
6
+ const changeDir = resolve(engine.projectDir, 'openspec', 'changes', changeName);
7
+ const taskSync = new TaskSyncManager(changeDir);
8
+ const sessionManager = new SessionStateManager(engine.projectDir);
9
+ const runner = new SubagentRunner({ timeoutMs: 300000, maxRetries: 1 });
10
+ const existingState = await sessionManager.loadState(changeName);
11
+ if (existingState && existingState.executionMode === executionMode) {
12
+ console.log(`检测到未完成的 ${executionMode} 执行会话(任务 ${existingState.currentTaskIndex}/${existingState.tasksCompleted.length})`);
13
+ console.log('将自动恢复执行...');
14
+ }
15
+ const tasks = await engine.readFile(resolve(changeDir, 'tasks.md')).catch(() => '');
16
+ const taskList = parseTasks(tasks);
17
+ if (taskList.length === 0) {
18
+ console.log('没有找到可执行的任务');
19
+ return [];
20
+ }
21
+ console.log(`找到 ${taskList.length} 个任务`);
22
+ await sessionManager.saveState({
23
+ changeName,
24
+ executionMode,
25
+ currentTaskIndex: 0,
26
+ tasksCompleted: [],
27
+ startedAt: new Date().toISOString(),
28
+ lastUpdatedAt: new Date().toISOString()
29
+ });
30
+ const dispatchInfos = [];
31
+ for (let i = 0; i < taskList.length; i++) {
32
+ const task = taskList[i];
33
+ console.log(`\n[${i + 1}/${taskList.length}] 执行任务: ${task.name}`);
34
+ const tasksContent = await engine.readFile(resolve(changeDir, 'tasks.md')).catch(() => '');
35
+ const taskText = extractTaskLines(tasksContent, task.name);
36
+ const dispatchInfo = {
37
+ taskName: task.name,
38
+ taskText,
39
+ must: task.must,
40
+ shall: task.shall,
41
+ specsPath: resolve(changeDir, 'specs.md'),
42
+ designPath: resolve(changeDir, 'design.md'),
43
+ changeDir,
44
+ };
45
+ dispatchInfos.push(dispatchInfo);
46
+ if (executionMode === 'subagent') {
47
+ console.log(` → 子代理模式: 需要通过 Task tool 调度子代理`);
48
+ console.log(` → 使用 implementer-prompt.md 模板构造子代理指令`);
49
+ console.log(` → 任务文本已提取,供子代理使用`);
50
+ }
51
+ else {
52
+ console.log(` → 内联模式: 在当前会话中执行任务`);
53
+ console.log(` → 任务描述:\n${taskText}`);
54
+ }
55
+ if (task.must.length > 0) {
56
+ console.log(` → MUST 要求:`);
57
+ task.must.forEach(m => console.log(` - ${m}`));
58
+ }
59
+ if (task.shall.length > 0) {
60
+ console.log(` → SHALL 要求:`);
61
+ task.shall.forEach(s => console.log(` - ${s}`));
62
+ }
63
+ try {
64
+ await runner.execute(async () => {
65
+ // 内联模式下执行基本验证
66
+ if (executionMode === 'inline') {
67
+ await verifyTask(engine, changeDir, task.name);
68
+ }
69
+ }, task.name);
70
+ await sessionManager.saveState({
71
+ changeName,
72
+ executionMode,
73
+ currentTaskIndex: i + 1,
74
+ tasksCompleted: taskList.slice(0, i + 1).map(t => t.name),
75
+ startedAt: existingState?.startedAt || new Date().toISOString(),
76
+ lastUpdatedAt: new Date().toISOString()
77
+ });
78
+ await taskSync.updateTaskStatus(task.name, true);
79
+ console.log(`✓ 任务完成: ${task.name}`);
80
+ }
81
+ catch (error) {
82
+ console.error(`✗ 任务失败: ${task.name}`, error);
83
+ throw error;
84
+ }
85
+ }
86
+ await sessionManager.markComplete(changeName);
87
+ console.log('\n所有任务执行完成');
88
+ return dispatchInfos;
89
+ }
90
+ async function verifyTask(engine, changeDir, taskName) {
91
+ // 内联模式下的基本验证:检查测试是否通过
92
+ const testResult = await engine.exec('npm test -- --run 2>&1 || npm test 2>&1');
93
+ if (testResult.exitCode !== 0) {
94
+ throw new Error(`任务 "${taskName}" 验证失败: 测试未通过`);
95
+ }
96
+ }
97
+ function parseTasks(tasksMd) {
98
+ const tasks = [];
99
+ const lines = tasksMd.split('\n');
100
+ let current = null;
101
+ for (const line of lines) {
102
+ const taskMatch = line.match(/^- \[[ x]\] \*\*(.+?)\*\*/);
103
+ if (taskMatch) {
104
+ if (current)
105
+ tasks.push(current);
106
+ current = { name: taskMatch[1], must: [], shall: [] };
107
+ }
108
+ if (current) {
109
+ const mustMatch = line.match(/MUST (.+)/);
110
+ if (mustMatch)
111
+ current.must.push(mustMatch[1]);
112
+ const shallMatch = line.match(/SHALL (.+)/);
113
+ if (shallMatch)
114
+ current.shall.push(shallMatch[1]);
115
+ }
116
+ }
117
+ if (current)
118
+ tasks.push(current);
119
+ return tasks;
120
+ }
121
+ function extractTaskLines(tasksContent, taskName) {
122
+ const lines = tasksContent.split('\n');
123
+ const result = [];
124
+ let capturing = false;
125
+ for (const line of lines) {
126
+ if (line.includes(`**${taskName}**`)) {
127
+ capturing = true;
128
+ result.push(line);
129
+ continue;
130
+ }
131
+ if (capturing) {
132
+ if (line.match(/^- \[[ x]\] \*\*/) || line.trim() === '') {
133
+ break;
134
+ }
135
+ result.push(line);
136
+ }
137
+ }
138
+ return result.join('\n');
139
+ }
140
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/openspec/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { SDSEngine } from '../core/engine.js';
2
+ export declare function opsxArchive(engine: SDSEngine, changeName: string): Promise<void>;
3
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/openspec/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAI9C,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAStF"}
@@ -0,0 +1,17 @@
1
+ import { rename, mkdir, readFile, writeFile } from 'fs/promises';
2
+ import { resolve } from 'path';
3
+ export async function opsxArchive(engine, changeName) {
4
+ const sourceDir = resolve(engine.projectDir, 'openspec', 'changes', changeName);
5
+ const date = new Date().toISOString().split('T')[0];
6
+ const destDir = resolve(engine.projectDir, 'openspec', 'archive', `${date}-${changeName}`);
7
+ await mkdir(resolve(engine.projectDir, 'openspec', 'archive'), { recursive: true });
8
+ await rename(sourceDir, destDir);
9
+ await appendChangelog(engine, changeName, date);
10
+ }
11
+ async function appendChangelog(engine, name, date) {
12
+ const changelogPath = resolve(engine.projectDir, 'openspec', 'CHANGELOG.md');
13
+ const entry = `## ${date}\n- ${name}\n\n`;
14
+ const existing = await readFile(changelogPath, 'utf8').catch(() => '# CHANGELOG\n\n');
15
+ await writeFile(changelogPath, existing + entry);
16
+ }
17
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/openspec/archive.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAiB,EAAE,UAAkB;IACrE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC;IAE3F,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpF,MAAM,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEjC,MAAM,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAiB,EAAE,IAAY,EAAE,IAAY;IAC1E,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,IAAI,MAAM,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,CAAC;IACtF,MAAM,SAAS,CAAC,aAAa,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * E2E 测试生成器
3
+ *
4
+ * 从 specs.md 驱动生成:
5
+ * 1. E2E 需求文档(e2e/requirements.md)— 覆盖矩阵
6
+ * 2. E2E 测试计划(e2e/plan.md)— 测试用例步骤
7
+ * 3. E2E 测试代码骨架(e2e/tests/)— 可执行的测试文件
8
+ *
9
+ * 设计原则(借鉴 prodready):
10
+ * - E2E 测试从规格驱动生成,不依赖实现者手写
11
+ * - 每个 MUST/SHALL 需求至少对应 1 个正向 + 1 个反向测试用例
12
+ * - 测试骨架可直接运行(fail-first),实现者只需填充断言
13
+ */
14
+ import { SDSEngine } from '../core/engine.js';
15
+ export interface E2ERequirement {
16
+ id: string;
17
+ specRef: string;
18
+ description: string;
19
+ priority: 'MUST' | 'SHALL' | 'SHOULD';
20
+ testCases: E2ETestCase[];
21
+ }
22
+ export interface E2ETestCase {
23
+ id: string;
24
+ type: 'happy-path' | 'edge-case' | 'error';
25
+ title: string;
26
+ preconditions: string[];
27
+ steps: string[];
28
+ expectedResult: string;
29
+ }
30
+ export interface E2EGenerateResult {
31
+ requirementsCount: number;
32
+ testCasesCount: number;
33
+ filesCreated: string[];
34
+ outputDir: string;
35
+ }
36
+ export declare function e2eGenerate(engine: SDSEngine, changeName: string, options?: {
37
+ framework?: string;
38
+ }): Promise<E2EGenerateResult>;
39
+ //# sourceMappingURL=e2e-generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-generate.d.ts","sourceRoot":"","sources":["../../../src/openspec/e2e-generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAM9C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACtC,SAAS,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC,iBAAiB,CAAC,CAqD5B"}
@@ -0,0 +1,315 @@
1
+ /**
2
+ * E2E 测试生成器
3
+ *
4
+ * 从 specs.md 驱动生成:
5
+ * 1. E2E 需求文档(e2e/requirements.md)— 覆盖矩阵
6
+ * 2. E2E 测试计划(e2e/plan.md)— 测试用例步骤
7
+ * 3. E2E 测试代码骨架(e2e/tests/)— 可执行的测试文件
8
+ *
9
+ * 设计原则(借鉴 prodready):
10
+ * - E2E 测试从规格驱动生成,不依赖实现者手写
11
+ * - 每个 MUST/SHALL 需求至少对应 1 个正向 + 1 个反向测试用例
12
+ * - 测试骨架可直接运行(fail-first),实现者只需填充断言
13
+ */
14
+ import { resolve } from 'path';
15
+ import { mkdir, readFile } from 'fs/promises';
16
+ // ── 主入口 ────────────────────────────────────────────
17
+ export async function e2eGenerate(engine, changeName, options = {}) {
18
+ const changeDir = resolve(engine.projectDir, 'openspec', 'changes', changeName);
19
+ const e2eDir = resolve(changeDir, 'e2e');
20
+ const testsDir = resolve(e2eDir, 'tests');
21
+ await mkdir(testsDir, { recursive: true });
22
+ // 读取规格
23
+ const specs = await engine.readFile(resolve(changeDir, 'specs.md')).catch(() => '');
24
+ const design = await engine.readFile(resolve(changeDir, 'design.md')).catch(() => '');
25
+ const tasks = await engine.readFile(resolve(changeDir, 'tasks.md')).catch(() => '');
26
+ if (!specs.trim()) {
27
+ throw new Error(`specs.md 为空或不存在: ${changeDir}/specs.md`);
28
+ }
29
+ // 1. 解析规格 → E2E 需求
30
+ const requirements = parseRequirements(specs);
31
+ // 2. 为每个需求生成测试用例
32
+ for (const req of requirements) {
33
+ req.testCases = generateTestCases(req);
34
+ }
35
+ // 3. 生成文件
36
+ const framework = options.framework ?? await detectTestFramework(engine);
37
+ const filesCreated = [];
38
+ // requirements.md
39
+ const reqMd = renderRequirementsMd(requirements);
40
+ await engine.writeFile(resolve(e2eDir, 'requirements.md'), reqMd);
41
+ filesCreated.push('e2e/requirements.md');
42
+ // plan.md
43
+ const planMd = renderPlanMd(requirements, framework);
44
+ await engine.writeFile(resolve(e2eDir, 'plan.md'), planMd);
45
+ filesCreated.push('e2e/plan.md');
46
+ // 测试代码骨架
47
+ const testFiles = renderTestFiles(requirements, framework);
48
+ for (const [filename, content] of Object.entries(testFiles)) {
49
+ await engine.writeFile(resolve(testsDir, filename), content);
50
+ filesCreated.push(`e2e/tests/${filename}`);
51
+ }
52
+ const totalCases = requirements.reduce((sum, r) => sum + r.testCases.length, 0);
53
+ return {
54
+ requirementsCount: requirements.length,
55
+ testCasesCount: totalCases,
56
+ filesCreated,
57
+ outputDir: e2eDir,
58
+ };
59
+ }
60
+ // ── 规格解析 ──────────────────────────────────────────
61
+ function parseRequirements(specs) {
62
+ const requirements = [];
63
+ const lines = specs.split('\n');
64
+ let currentSection = '';
65
+ let reqCounter = 0;
66
+ for (const line of lines) {
67
+ // 捕获章节标题
68
+ const sectionMatch = line.match(/^#{1,3}\s+(.+)/);
69
+ if (sectionMatch) {
70
+ currentSection = sectionMatch[1].trim();
71
+ }
72
+ // 捕获 MUST / SHALL / SHOULD 需求
73
+ const reqMatch = line.match(/^[-*]\s+.*(MUST|SHALL|SHOULD)\s+(.+)/i);
74
+ if (reqMatch) {
75
+ reqCounter++;
76
+ const priority = reqMatch[1].toUpperCase();
77
+ const description = reqMatch[2].trim();
78
+ requirements.push({
79
+ id: `REQ-${String(reqCounter).padStart(3, '0')}`,
80
+ specRef: currentSection || `line-${lines.indexOf(line) + 1}`,
81
+ description,
82
+ priority,
83
+ testCases: [],
84
+ });
85
+ }
86
+ // 捕获功能规格(F1: xxx 格式)
87
+ const funcMatch = line.match(/^#{2,4}\s+(F\d+):\s*(.+)/);
88
+ if (funcMatch) {
89
+ reqCounter++;
90
+ requirements.push({
91
+ id: `REQ-${String(reqCounter).padStart(3, '0')}`,
92
+ specRef: funcMatch[1],
93
+ description: funcMatch[2].trim(),
94
+ priority: 'MUST',
95
+ testCases: [],
96
+ });
97
+ }
98
+ }
99
+ // 如果没有解析到任何需求,用章节作为需求
100
+ if (requirements.length === 0) {
101
+ const sections = specs.match(/^#{2,3}\s+.+/gm) || [];
102
+ for (const section of sections) {
103
+ reqCounter++;
104
+ requirements.push({
105
+ id: `REQ-${String(reqCounter).padStart(3, '0')}`,
106
+ specRef: section.replace(/^#+\s+/, ''),
107
+ description: section.replace(/^#+\s+/, ''),
108
+ priority: 'SHOULD',
109
+ testCases: [],
110
+ });
111
+ }
112
+ }
113
+ return requirements;
114
+ }
115
+ // ── 测试用例生成 ──────────────────────────────────────
116
+ function generateTestCases(req) {
117
+ const cases = [];
118
+ let caseCounter = 0;
119
+ const makeId = () => {
120
+ caseCounter++;
121
+ return `${req.id}-TC-${String(caseCounter).padStart(2, '0')}`;
122
+ };
123
+ // 正向路径
124
+ cases.push({
125
+ id: makeId(),
126
+ type: 'happy-path',
127
+ title: `${req.description} — 正向`,
128
+ preconditions: ['系统正常运行', '测试数据已准备'],
129
+ steps: [
130
+ `执行: ${req.description}`,
131
+ '验证: 操作成功',
132
+ '验证: 返回预期结果',
133
+ ],
134
+ expectedResult: '操作成功,返回正确结果',
135
+ });
136
+ // 反向路径(MUST/SHALL 级别)
137
+ if (req.priority === 'MUST' || req.priority === 'SHALL') {
138
+ cases.push({
139
+ id: makeId(),
140
+ type: 'error',
141
+ title: `${req.description} — 参数错误/异常`,
142
+ preconditions: ['系统正常运行'],
143
+ steps: [
144
+ `执行: 使用无效参数 ${req.description}`,
145
+ '验证: 返回错误响应',
146
+ '验证: 错误消息明确',
147
+ ],
148
+ expectedResult: '返回明确的错误信息,状态码正确',
149
+ });
150
+ }
151
+ // 边界情况(MUST 级别)
152
+ if (req.priority === 'MUST') {
153
+ cases.push({
154
+ id: makeId(),
155
+ type: 'edge-case',
156
+ title: `${req.description} — 边界条件`,
157
+ preconditions: ['系统正常运行', '边界数据已准备'],
158
+ steps: [
159
+ `执行: 使用边界值 ${req.description}`,
160
+ '验证: 系统行为符合预期',
161
+ ],
162
+ expectedResult: '系统正确处理边界条件',
163
+ });
164
+ }
165
+ return cases;
166
+ }
167
+ // ── 框架检测 ──────────────────────────────────────────
168
+ async function detectTestFramework(engine) {
169
+ // 检查 package.json 中的测试框架
170
+ try {
171
+ const pkgContent = await readFile(resolve(engine.projectDir, 'package.json'), 'utf-8');
172
+ const pkg = JSON.parse(pkgContent);
173
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
174
+ if (allDeps.vitest)
175
+ return 'vitest';
176
+ if (allDeps.jest)
177
+ return 'jest';
178
+ if (allDeps.mocha)
179
+ return 'mocha';
180
+ if (allDeps['@playwright/test'])
181
+ return 'playwright';
182
+ }
183
+ catch { }
184
+ return 'vitest'; // 默认
185
+ }
186
+ // ── Markdown 渲染 ─────────────────────────────────────
187
+ function renderRequirementsMd(requirements) {
188
+ let md = `# E2E 测试需求文档
189
+
190
+ > 从 specs.md 自动生成,用于驱动 E2E 测试实现。
191
+
192
+ ## 需求覆盖矩阵
193
+
194
+ | 需求 ID | 规格引用 | 描述 | 优先级 | 测试用例数 |
195
+ |---------|----------|------|--------|-----------|
196
+ `;
197
+ for (const req of requirements) {
198
+ md += `| ${req.id} | ${req.specRef} | ${req.description} | ${req.priority} | ${req.testCases.length} |\n`;
199
+ }
200
+ md += `\n**总计:** ${requirements.length} 个需求,${requirements.reduce((s, r) => s + r.testCases.length, 0)} 个测试用例\n\n---\n\n`;
201
+ for (const req of requirements) {
202
+ md += `## ${req.id}: ${req.description}\n\n`;
203
+ md += `- **规格引用:** ${req.specRef}\n`;
204
+ md += `- **优先级:** ${req.priority}\n\n`;
205
+ for (const tc of req.testCases) {
206
+ md += `### ${tc.id}: ${tc.title}\n\n`;
207
+ md += `- **类型:** ${tc.type}\n`;
208
+ md += `- **前置条件:**\n`;
209
+ for (const pre of tc.preconditions) {
210
+ md += ` - ${pre}\n`;
211
+ }
212
+ md += `- **步骤:**\n`;
213
+ for (let i = 0; i < tc.steps.length; i++) {
214
+ md += ` ${i + 1}. ${tc.steps[i]}\n`;
215
+ }
216
+ md += `- **预期结果:** ${tc.expectedResult}\n\n`;
217
+ }
218
+ }
219
+ return md;
220
+ }
221
+ function renderPlanMd(requirements, framework) {
222
+ const totalCases = requirements.reduce((s, r) => s + r.testCases.length, 0);
223
+ let md = `# E2E 测试实现计划
224
+
225
+ > 从 E2E 需求文档自动生成。使用 ${framework} 执行。
226
+
227
+ **目标:** 实现 ${totalCases} 个 E2E 测试用例,覆盖 ${requirements.length} 个需求
228
+
229
+ **框架:** ${framework}
230
+
231
+ **测试目录:** e2e/tests/
232
+
233
+ ---
234
+
235
+ ## 执行顺序
236
+
237
+ | 序号 | 需求 | 测试文件 | 用例数 | 状态 |
238
+ |------|------|----------|--------|------|
239
+ `;
240
+ let fileIndex = 0;
241
+ for (const req of requirements) {
242
+ fileIndex++;
243
+ const filename = `${String(fileIndex).padStart(2, '0')}-${slugify(req.specRef)}.test.ts`;
244
+ md += `| ${fileIndex} | ${req.id} | \`${filename}\` | ${req.testCases.length} | - [ ] |\n`;
245
+ }
246
+ md += `\n---\n\n`;
247
+ fileIndex = 0;
248
+ for (const req of requirements) {
249
+ fileIndex++;
250
+ const filename = `${String(fileIndex).padStart(2, '0')}-${slugify(req.specRef)}.test.ts`;
251
+ md += `## 任务 ${fileIndex}: ${req.description}\n\n`;
252
+ md += `**文件:** \`e2e/tests/${filename}\`\n\n`;
253
+ for (const tc of req.testCases) {
254
+ md += `- [ ] **${tc.id}**: ${tc.title}\n`;
255
+ md += ` - 类型: ${tc.type}\n`;
256
+ md += ` - 预期: ${tc.expectedResult}\n`;
257
+ }
258
+ md += '\n';
259
+ }
260
+ return md;
261
+ }
262
+ // ── 测试代码骨架 ──────────────────────────────────────
263
+ function renderTestFiles(requirements, framework) {
264
+ const files = {};
265
+ const imports = frameworkImports(framework);
266
+ let fileIndex = 0;
267
+ for (const req of requirements) {
268
+ fileIndex++;
269
+ const filename = `${String(fileIndex).padStart(2, '0')}-${slugify(req.specRef)}.test.ts`;
270
+ let code = `${imports}\n\n`;
271
+ code += `/**\n * E2E: ${req.id} — ${req.description}\n * 规格引用: ${req.specRef}\n * 优先级: ${req.priority}\n */\n\n`;
272
+ for (const tc of req.testCases) {
273
+ code += `describe('${req.id}: ${sanitize(req.description)}', () => {\n`;
274
+ code += ` it('${sanitize(tc.title)}', async () => {\n`;
275
+ code += ` // TODO: 填充实现\n`;
276
+ code += ` // 类型: ${tc.type}\n`;
277
+ code += ` // 预期: ${tc.expectedResult}\n`;
278
+ code += ` \n`;
279
+ code += ` // 步骤:\n`;
280
+ for (const step of tc.steps) {
281
+ code += ` // ${step}\n`;
282
+ }
283
+ code += ` \n`;
284
+ code += ` expect(true).toBe(false); // fail-first: 填充后移除\n`;
285
+ code += ` });\n`;
286
+ code += `});\n\n`;
287
+ }
288
+ files[filename] = code;
289
+ }
290
+ return files;
291
+ }
292
+ function frameworkImports(framework) {
293
+ switch (framework) {
294
+ case 'vitest':
295
+ return `import { describe, it, expect, beforeAll, afterAll } from 'vitest';`;
296
+ case 'jest':
297
+ return `// Jest globals: describe, it, expect, beforeAll, afterAll`;
298
+ case 'playwright':
299
+ return `import { test, expect } from '@playwright/test';`;
300
+ default:
301
+ return `import { describe, it, expect } from 'vitest';`;
302
+ }
303
+ }
304
+ // ── 工具函数 ──────────────────────────────────────────
305
+ function slugify(text) {
306
+ return text
307
+ .toLowerCase()
308
+ .replace(/[^\w\u4e00-\u9fff]+/g, '-')
309
+ .replace(/^-+|-+$/g, '')
310
+ .slice(0, 40);
311
+ }
312
+ function sanitize(text) {
313
+ return text.replace(/'/g, "\\'").replace(/\n/g, ' ');
314
+ }
315
+ //# sourceMappingURL=e2e-generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-generate.js","sourceRoot":"","sources":["../../../src/openspec/e2e-generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * E2E 测试执行器
3
+ *
4
+ * 运行 e2e/tests/ 下的测试,生成执行报告。
5
+ *
6
+ * 流程:
7
+ * 1. 检测测试框架
8
+ * 2. 执行测试
9
+ * 3. 解析结果
10
+ * 4. 生成 e2e/report.md
11
+ */
12
+ import { SDSEngine } from '../core/engine.js';
13
+ export interface E2ETestResult {
14
+ id: string;
15
+ title: string;
16
+ status: 'pass' | 'fail' | 'skip';
17
+ durationMs: number;
18
+ error?: string;
19
+ }
20
+ export interface E2ERunResult {
21
+ total: number;
22
+ passed: number;
23
+ failed: number;
24
+ skipped: number;
25
+ durationMs: number;
26
+ tests: E2ETestResult[];
27
+ reportPath: string;
28
+ }
29
+ export declare function e2eRun(engine: SDSEngine, changeName: string, options?: {
30
+ framework?: string;
31
+ }): Promise<E2ERunResult>;
32
+ //# sourceMappingURL=e2e-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-runner.d.ts","sourceRoot":"","sources":["../../../src/openspec/e2e-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAM9C,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,wBAAsB,MAAM,CAC1B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC,YAAY,CAAC,CAiCvB"}