@specpow/framework 0.2.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 (362) hide show
  1. package/CHANGELOG.md +307 -0
  2. package/LICENSE +21 -0
  3. package/README.md +557 -0
  4. package/agents/controller/sdd-controller.md +55 -0
  5. package/agents/execution/java-codegen-agent.md +39 -0
  6. package/agents/execution/ui-codegen-agent.md +32 -0
  7. package/agents/ops/deploy-agent.md +181 -0
  8. package/agents/planning/db-designer-agent.md +30 -0
  9. package/agents/planning/prd-agent.md +31 -0
  10. package/agents/quality/review-agent.md +36 -0
  11. package/agents/quality/test-agent.md +33 -0
  12. package/bin/specpow.js +10 -0
  13. package/dist/cli/index.d.ts +7 -0
  14. package/dist/cli/index.d.ts.map +1 -0
  15. package/dist/cli/index.js +444 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/commands/apply.d.ts +14 -0
  18. package/dist/commands/apply.d.ts.map +1 -0
  19. package/dist/commands/apply.js +195 -0
  20. package/dist/commands/apply.js.map +1 -0
  21. package/dist/commands/archive.d.ts +30 -0
  22. package/dist/commands/archive.d.ts.map +1 -0
  23. package/dist/commands/archive.js +141 -0
  24. package/dist/commands/archive.js.map +1 -0
  25. package/dist/commands/channel.d.ts +61 -0
  26. package/dist/commands/channel.d.ts.map +1 -0
  27. package/dist/commands/channel.js +613 -0
  28. package/dist/commands/channel.js.map +1 -0
  29. package/dist/commands/config.d.ts +40 -0
  30. package/dist/commands/config.d.ts.map +1 -0
  31. package/dist/commands/config.js +130 -0
  32. package/dist/commands/config.js.map +1 -0
  33. package/dist/commands/debug.d.ts +45 -0
  34. package/dist/commands/debug.d.ts.map +1 -0
  35. package/dist/commands/debug.js +167 -0
  36. package/dist/commands/debug.js.map +1 -0
  37. package/dist/commands/doctor.d.ts +20 -0
  38. package/dist/commands/doctor.d.ts.map +1 -0
  39. package/dist/commands/doctor.js +121 -0
  40. package/dist/commands/doctor.js.map +1 -0
  41. package/dist/commands/execute.d.ts +25 -0
  42. package/dist/commands/execute.d.ts.map +1 -0
  43. package/dist/commands/execute.js +120 -0
  44. package/dist/commands/execute.js.map +1 -0
  45. package/dist/commands/explore.d.ts +71 -0
  46. package/dist/commands/explore.d.ts.map +1 -0
  47. package/dist/commands/explore.js +481 -0
  48. package/dist/commands/explore.js.map +1 -0
  49. package/dist/commands/init.d.ts +20 -0
  50. package/dist/commands/init.d.ts.map +1 -0
  51. package/dist/commands/init.js +146 -0
  52. package/dist/commands/init.js.map +1 -0
  53. package/dist/commands/memory.d.ts +32 -0
  54. package/dist/commands/memory.d.ts.map +1 -0
  55. package/dist/commands/memory.js +455 -0
  56. package/dist/commands/memory.js.map +1 -0
  57. package/dist/commands/propose.d.ts +13 -0
  58. package/dist/commands/propose.d.ts.map +1 -0
  59. package/dist/commands/propose.js +193 -0
  60. package/dist/commands/propose.js.map +1 -0
  61. package/dist/commands/review.d.ts +50 -0
  62. package/dist/commands/review.d.ts.map +1 -0
  63. package/dist/commands/review.js +198 -0
  64. package/dist/commands/review.js.map +1 -0
  65. package/dist/commands/schema.d.ts +22 -0
  66. package/dist/commands/schema.d.ts.map +1 -0
  67. package/dist/commands/schema.js +79 -0
  68. package/dist/commands/schema.js.map +1 -0
  69. package/dist/commands/status.d.ts +11 -0
  70. package/dist/commands/status.d.ts.map +1 -0
  71. package/dist/commands/status.js +130 -0
  72. package/dist/commands/status.js.map +1 -0
  73. package/dist/commands/store.d.ts +31 -0
  74. package/dist/commands/store.d.ts.map +1 -0
  75. package/dist/commands/store.js +109 -0
  76. package/dist/commands/store.js.map +1 -0
  77. package/dist/commands/update.d.ts +42 -0
  78. package/dist/commands/update.d.ts.map +1 -0
  79. package/dist/commands/update.js +239 -0
  80. package/dist/commands/update.js.map +1 -0
  81. package/dist/commands/verify.d.ts +39 -0
  82. package/dist/commands/verify.d.ts.map +1 -0
  83. package/dist/commands/verify.js +386 -0
  84. package/dist/commands/verify.js.map +1 -0
  85. package/dist/commands/workflow/index.d.ts +12 -0
  86. package/dist/commands/workflow/index.d.ts.map +1 -0
  87. package/dist/commands/workflow/index.js +435 -0
  88. package/dist/commands/workflow/index.js.map +1 -0
  89. package/dist/core/agent-contract.d.ts +133 -0
  90. package/dist/core/agent-contract.d.ts.map +1 -0
  91. package/dist/core/agent-contract.js +71 -0
  92. package/dist/core/agent-contract.js.map +1 -0
  93. package/dist/core/archive/delta-merger.d.ts +101 -0
  94. package/dist/core/archive/delta-merger.d.ts.map +1 -0
  95. package/dist/core/archive/delta-merger.js +398 -0
  96. package/dist/core/archive/delta-merger.js.map +1 -0
  97. package/dist/core/archive/delta-parser.d.ts +48 -0
  98. package/dist/core/archive/delta-parser.d.ts.map +1 -0
  99. package/dist/core/archive/delta-parser.js +193 -0
  100. package/dist/core/archive/delta-parser.js.map +1 -0
  101. package/dist/core/archive/engine.d.ts +136 -0
  102. package/dist/core/archive/engine.d.ts.map +1 -0
  103. package/dist/core/archive/engine.js +506 -0
  104. package/dist/core/archive/engine.js.map +1 -0
  105. package/dist/core/archive/index.d.ts +11 -0
  106. package/dist/core/archive/index.d.ts.map +1 -0
  107. package/dist/core/archive/index.js +9 -0
  108. package/dist/core/archive/index.js.map +1 -0
  109. package/dist/core/artifact-graph/graph.d.ts +48 -0
  110. package/dist/core/artifact-graph/graph.d.ts.map +1 -0
  111. package/dist/core/artifact-graph/graph.js +170 -0
  112. package/dist/core/artifact-graph/graph.js.map +1 -0
  113. package/dist/core/artifact-graph/index.d.ts +13 -0
  114. package/dist/core/artifact-graph/index.d.ts.map +1 -0
  115. package/dist/core/artifact-graph/index.js +12 -0
  116. package/dist/core/artifact-graph/index.js.map +1 -0
  117. package/dist/core/artifact-graph/instruction-loader.d.ts +60 -0
  118. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -0
  119. package/dist/core/artifact-graph/instruction-loader.js +166 -0
  120. package/dist/core/artifact-graph/instruction-loader.js.map +1 -0
  121. package/dist/core/artifact-graph/outputs.d.ts +17 -0
  122. package/dist/core/artifact-graph/outputs.d.ts.map +1 -0
  123. package/dist/core/artifact-graph/outputs.js +27 -0
  124. package/dist/core/artifact-graph/outputs.js.map +1 -0
  125. package/dist/core/artifact-graph/resolver.d.ts +34 -0
  126. package/dist/core/artifact-graph/resolver.d.ts.map +1 -0
  127. package/dist/core/artifact-graph/resolver.js +99 -0
  128. package/dist/core/artifact-graph/resolver.js.map +1 -0
  129. package/dist/core/artifact-graph/state.d.ts +54 -0
  130. package/dist/core/artifact-graph/state.d.ts.map +1 -0
  131. package/dist/core/artifact-graph/state.js +149 -0
  132. package/dist/core/artifact-graph/state.js.map +1 -0
  133. package/dist/core/artifact-graph/types.d.ts +151 -0
  134. package/dist/core/artifact-graph/types.d.ts.map +1 -0
  135. package/dist/core/artifact-graph/types.js +44 -0
  136. package/dist/core/artifact-graph/types.js.map +1 -0
  137. package/dist/core/channel/channel-event-log.d.ts +81 -0
  138. package/dist/core/channel/channel-event-log.d.ts.map +1 -0
  139. package/dist/core/channel/channel-event-log.js +177 -0
  140. package/dist/core/channel/channel-event-log.js.map +1 -0
  141. package/dist/core/channel/channel-inbox.d.ts +70 -0
  142. package/dist/core/channel/channel-inbox.d.ts.map +1 -0
  143. package/dist/core/channel/channel-inbox.js +122 -0
  144. package/dist/core/channel/channel-inbox.js.map +1 -0
  145. package/dist/core/channel/channel-runtime.d.ts +81 -0
  146. package/dist/core/channel/channel-runtime.d.ts.map +1 -0
  147. package/dist/core/channel/channel-runtime.js +291 -0
  148. package/dist/core/channel/channel-runtime.js.map +1 -0
  149. package/dist/core/channel/channel-supervisor.d.ts +72 -0
  150. package/dist/core/channel/channel-supervisor.d.ts.map +1 -0
  151. package/dist/core/channel/channel-supervisor.js +189 -0
  152. package/dist/core/channel/channel-supervisor.js.map +1 -0
  153. package/dist/core/channel/channel-types.d.ts +169 -0
  154. package/dist/core/channel/channel-types.d.ts.map +1 -0
  155. package/dist/core/channel/channel-types.js +26 -0
  156. package/dist/core/channel/channel-types.js.map +1 -0
  157. package/dist/core/channel/index.d.ts +21 -0
  158. package/dist/core/channel/index.d.ts.map +1 -0
  159. package/dist/core/channel/index.js +23 -0
  160. package/dist/core/channel/index.js.map +1 -0
  161. package/dist/core/command-generation/index.d.ts +225 -0
  162. package/dist/core/command-generation/index.d.ts.map +1 -0
  163. package/dist/core/command-generation/index.js +462 -0
  164. package/dist/core/command-generation/index.js.map +1 -0
  165. package/dist/core/config/config-schema.d.ts +745 -0
  166. package/dist/core/config/config-schema.d.ts.map +1 -0
  167. package/dist/core/config/config-schema.js +108 -0
  168. package/dist/core/config/config-schema.js.map +1 -0
  169. package/dist/core/config/global-config.d.ts +73 -0
  170. package/dist/core/config/global-config.d.ts.map +1 -0
  171. package/dist/core/config/global-config.js +225 -0
  172. package/dist/core/config/global-config.js.map +1 -0
  173. package/dist/core/config/index.d.ts +8 -0
  174. package/dist/core/config/index.d.ts.map +1 -0
  175. package/dist/core/config/index.js +8 -0
  176. package/dist/core/config/index.js.map +1 -0
  177. package/dist/core/hooks/hook-registry.d.ts +55 -0
  178. package/dist/core/hooks/hook-registry.d.ts.map +1 -0
  179. package/dist/core/hooks/hook-registry.js +172 -0
  180. package/dist/core/hooks/hook-registry.js.map +1 -0
  181. package/dist/core/hooks/hook-types.d.ts +87 -0
  182. package/dist/core/hooks/hook-types.d.ts.map +1 -0
  183. package/dist/core/hooks/hook-types.js +11 -0
  184. package/dist/core/hooks/hook-types.js.map +1 -0
  185. package/dist/core/hooks/index.d.ts +28 -0
  186. package/dist/core/hooks/index.d.ts.map +1 -0
  187. package/dist/core/hooks/index.js +28 -0
  188. package/dist/core/hooks/index.js.map +1 -0
  189. package/dist/core/hooks/post-tool-call-hook.d.ts +21 -0
  190. package/dist/core/hooks/post-tool-call-hook.d.ts.map +1 -0
  191. package/dist/core/hooks/post-tool-call-hook.js +191 -0
  192. package/dist/core/hooks/post-tool-call-hook.js.map +1 -0
  193. package/dist/core/hooks/pre-tool-call-hook.d.ts +31 -0
  194. package/dist/core/hooks/pre-tool-call-hook.d.ts.map +1 -0
  195. package/dist/core/hooks/pre-tool-call-hook.js +122 -0
  196. package/dist/core/hooks/pre-tool-call-hook.js.map +1 -0
  197. package/dist/core/hooks/session-start-hook.d.ts +25 -0
  198. package/dist/core/hooks/session-start-hook.d.ts.map +1 -0
  199. package/dist/core/hooks/session-start-hook.js +226 -0
  200. package/dist/core/hooks/session-start-hook.js.map +1 -0
  201. package/dist/core/hooks/workflow-state-hook.d.ts +18 -0
  202. package/dist/core/hooks/workflow-state-hook.d.ts.map +1 -0
  203. package/dist/core/hooks/workflow-state-hook.js +181 -0
  204. package/dist/core/hooks/workflow-state-hook.js.map +1 -0
  205. package/dist/core/init/engine.d.ts +69 -0
  206. package/dist/core/init/engine.d.ts.map +1 -0
  207. package/dist/core/init/engine.js +211 -0
  208. package/dist/core/init/engine.js.map +1 -0
  209. package/dist/core/init/template-hash.d.ts +86 -0
  210. package/dist/core/init/template-hash.d.ts.map +1 -0
  211. package/dist/core/init/template-hash.js +228 -0
  212. package/dist/core/init/template-hash.js.map +1 -0
  213. package/dist/core/memory/adapters/json-adapter.d.ts +50 -0
  214. package/dist/core/memory/adapters/json-adapter.d.ts.map +1 -0
  215. package/dist/core/memory/adapters/json-adapter.js +273 -0
  216. package/dist/core/memory/adapters/json-adapter.js.map +1 -0
  217. package/dist/core/memory/adapters/sqlite-adapter.d.ts +26 -0
  218. package/dist/core/memory/adapters/sqlite-adapter.d.ts.map +1 -0
  219. package/dist/core/memory/adapters/sqlite-adapter.js +230 -0
  220. package/dist/core/memory/adapters/sqlite-adapter.js.map +1 -0
  221. package/dist/core/memory/index.d.ts +38 -0
  222. package/dist/core/memory/index.d.ts.map +1 -0
  223. package/dist/core/memory/index.js +40 -0
  224. package/dist/core/memory/index.js.map +1 -0
  225. package/dist/core/memory/memory-indexer.d.ts +39 -0
  226. package/dist/core/memory/memory-indexer.d.ts.map +1 -0
  227. package/dist/core/memory/memory-indexer.js +213 -0
  228. package/dist/core/memory/memory-indexer.js.map +1 -0
  229. package/dist/core/memory/memory-manager.d.ts +59 -0
  230. package/dist/core/memory/memory-manager.d.ts.map +1 -0
  231. package/dist/core/memory/memory-manager.js +194 -0
  232. package/dist/core/memory/memory-manager.js.map +1 -0
  233. package/dist/core/memory/memory-store.d.ts +31 -0
  234. package/dist/core/memory/memory-store.d.ts.map +1 -0
  235. package/dist/core/memory/memory-store.js +148 -0
  236. package/dist/core/memory/memory-store.js.map +1 -0
  237. package/dist/core/memory/memory-types.d.ts +154 -0
  238. package/dist/core/memory/memory-types.d.ts.map +1 -0
  239. package/dist/core/memory/memory-types.js +13 -0
  240. package/dist/core/memory/memory-types.js.map +1 -0
  241. package/dist/core/migration/index.d.ts +80 -0
  242. package/dist/core/migration/index.d.ts.map +1 -0
  243. package/dist/core/migration/index.js +361 -0
  244. package/dist/core/migration/index.js.map +1 -0
  245. package/dist/core/parsers/index.d.ts +95 -0
  246. package/dist/core/parsers/index.d.ts.map +1 -0
  247. package/dist/core/parsers/index.js +367 -0
  248. package/dist/core/parsers/index.js.map +1 -0
  249. package/dist/core/sdd-engine/ai-caller.d.ts +118 -0
  250. package/dist/core/sdd-engine/ai-caller.d.ts.map +1 -0
  251. package/dist/core/sdd-engine/ai-caller.js +624 -0
  252. package/dist/core/sdd-engine/ai-caller.js.map +1 -0
  253. package/dist/core/sdd-engine/controller.d.ts +107 -0
  254. package/dist/core/sdd-engine/controller.d.ts.map +1 -0
  255. package/dist/core/sdd-engine/controller.js +357 -0
  256. package/dist/core/sdd-engine/controller.js.map +1 -0
  257. package/dist/core/sdd-engine/dispatcher.d.ts +69 -0
  258. package/dist/core/sdd-engine/dispatcher.d.ts.map +1 -0
  259. package/dist/core/sdd-engine/dispatcher.js +146 -0
  260. package/dist/core/sdd-engine/dispatcher.js.map +1 -0
  261. package/dist/core/sdd-engine/git-ops.d.ts +73 -0
  262. package/dist/core/sdd-engine/git-ops.d.ts.map +1 -0
  263. package/dist/core/sdd-engine/git-ops.js +326 -0
  264. package/dist/core/sdd-engine/git-ops.js.map +1 -0
  265. package/dist/core/sdd-engine/index.d.ts +17 -0
  266. package/dist/core/sdd-engine/index.d.ts.map +1 -0
  267. package/dist/core/sdd-engine/index.js +15 -0
  268. package/dist/core/sdd-engine/index.js.map +1 -0
  269. package/dist/core/sdd-engine/ledger.d.ts +92 -0
  270. package/dist/core/sdd-engine/ledger.d.ts.map +1 -0
  271. package/dist/core/sdd-engine/ledger.js +273 -0
  272. package/dist/core/sdd-engine/ledger.js.map +1 -0
  273. package/dist/core/sdd-engine/model-selector.d.ts +49 -0
  274. package/dist/core/sdd-engine/model-selector.d.ts.map +1 -0
  275. package/dist/core/sdd-engine/model-selector.js +76 -0
  276. package/dist/core/sdd-engine/model-selector.js.map +1 -0
  277. package/dist/core/sdd-engine/parallel-dispatcher.d.ts +99 -0
  278. package/dist/core/sdd-engine/parallel-dispatcher.d.ts.map +1 -0
  279. package/dist/core/sdd-engine/parallel-dispatcher.js +350 -0
  280. package/dist/core/sdd-engine/parallel-dispatcher.js.map +1 -0
  281. package/dist/core/sdd-engine/review-loop.d.ts +61 -0
  282. package/dist/core/sdd-engine/review-loop.d.ts.map +1 -0
  283. package/dist/core/sdd-engine/review-loop.js +139 -0
  284. package/dist/core/sdd-engine/review-loop.js.map +1 -0
  285. package/dist/core/sdd-engine/types.d.ts +104 -0
  286. package/dist/core/sdd-engine/types.d.ts.map +1 -0
  287. package/dist/core/sdd-engine/types.js +7 -0
  288. package/dist/core/sdd-engine/types.js.map +1 -0
  289. package/dist/core/store/index.d.ts +78 -0
  290. package/dist/core/store/index.d.ts.map +1 -0
  291. package/dist/core/store/index.js +182 -0
  292. package/dist/core/store/index.js.map +1 -0
  293. package/dist/core/templates/index.d.ts +58 -0
  294. package/dist/core/templates/index.d.ts.map +1 -0
  295. package/dist/core/templates/index.js +158 -0
  296. package/dist/core/templates/index.js.map +1 -0
  297. package/dist/core/validation/index.d.ts +34 -0
  298. package/dist/core/validation/index.d.ts.map +1 -0
  299. package/dist/core/validation/index.js +153 -0
  300. package/dist/core/validation/index.js.map +1 -0
  301. package/dist/core/workflow-state.d.ts +96 -0
  302. package/dist/core/workflow-state.d.ts.map +1 -0
  303. package/dist/core/workflow-state.js +284 -0
  304. package/dist/core/workflow-state.js.map +1 -0
  305. package/dist/index.d.ts +18 -0
  306. package/dist/index.d.ts.map +1 -0
  307. package/dist/index.js +21 -0
  308. package/dist/index.js.map +1 -0
  309. package/dist/utils/index.d.ts +48 -0
  310. package/dist/utils/index.d.ts.map +1 -0
  311. package/dist/utils/index.js +119 -0
  312. package/dist/utils/index.js.map +1 -0
  313. package/hooks/hooks.json +30 -0
  314. package/hooks/run-hook.cmd +19 -0
  315. package/hooks/session-start +62 -0
  316. package/hooks/workflow-state +150 -0
  317. package/package.json +122 -0
  318. package/schemas/bug-fix/schema.yaml +64 -0
  319. package/schemas/bug-fix/templates/analysis.md +43 -0
  320. package/schemas/bug-fix/templates/fix-plan.md +19 -0
  321. package/schemas/bug-fix/templates/proposal.md +30 -0
  322. package/schemas/crud-module/schema.yaml +65 -0
  323. package/schemas/crud-module/templates/design.md +36 -0
  324. package/schemas/crud-module/templates/proposal.md +30 -0
  325. package/schemas/crud-module/templates/spec.md +33 -0
  326. package/schemas/crud-module/templates/tasks.md +57 -0
  327. package/schemas/spec-driven/schema.yaml +87 -0
  328. package/schemas/spec-driven/templates/design.md +54 -0
  329. package/schemas/spec-driven/templates/proposal.md +31 -0
  330. package/schemas/spec-driven/templates/spec.md +44 -0
  331. package/schemas/spec-driven/templates/tasks.md +98 -0
  332. package/skills/business-code-review/SKILL.md +78 -0
  333. package/skills/business-db-design/SKILL.md +74 -0
  334. package/skills/business-deploy-check/SKILL.md +72 -0
  335. package/skills/business-doc-sync/SKILL.md +72 -0
  336. package/skills/business-java-codegen/SKILL.md +97 -0
  337. package/skills/business-menu-register/SKILL.md +63 -0
  338. package/skills/business-prd-writer/SKILL.md +80 -0
  339. package/skills/business-test-gen/SKILL.md +82 -0
  340. package/skills/business-ui-codegen/SKILL.md +104 -0
  341. package/skills/execution-finish-branch/SKILL.md +58 -0
  342. package/skills/execution-git-worktrees/SKILL.md +48 -0
  343. package/skills/execution-parallel-agents/SKILL.md +51 -0
  344. package/skills/execution-receiving-review/SKILL.md +47 -0
  345. package/skills/execution-requesting-review/SKILL.md +51 -0
  346. package/skills/execution-subagent-driven-dev/SKILL.md +148 -0
  347. package/skills/execution-systematic-debugging/SKILL.md +95 -0
  348. package/skills/execution-tdd/SKILL.md +74 -0
  349. package/skills/execution-verification-before-completion/SKILL.md +75 -0
  350. package/skills/meta-create-skill/SKILL.md +374 -0
  351. package/skills/meta-using-skills/SKILL.md +97 -0
  352. package/skills/meta-writing-skills/SKILL.md +66 -0
  353. package/skills/planning-apply-change/SKILL.md +199 -0
  354. package/skills/planning-archive-change/SKILL.md +43 -0
  355. package/skills/planning-explore/SKILL.md +108 -0
  356. package/skills/planning-onboard/SKILL.md +60 -0
  357. package/skills/planning-propose/SKILL.md +145 -0
  358. package/skills/planning-update-change/SKILL.md +45 -0
  359. package/skills/planning-verify-change/SKILL.md +58 -0
  360. package/skills/planning-write-design/SKILL.md +59 -0
  361. package/skills/planning-write-plans/SKILL.md +55 -0
  362. package/skills/planning-write-specs/SKILL.md +73 -0
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Delta Spec 合并器 — 移植自 OpenSpec specs-apply.ts
3
+ *
4
+ * 结构化合并算法,支持:
5
+ * - 四阶段合并顺序:RENAMED → REMOVED → MODIFIED → ADDED
6
+ * - 冲突检测与报告
7
+ * - 幂等性检查(已同步则跳过)
8
+ * - 保留原有格式和注释
9
+ *
10
+ * 增强特性(移植自 OpenSpec):
11
+ * - 场景丢失守卫(Scenario-loss guard)
12
+ * - 能力退休(Capability retirement)
13
+ * - 未计入内容检测(Unaccounted content detection)
14
+ * - 代码围栏掩码(Code fence masking)
15
+ */
16
+ import { type DeltaBlock } from './delta-parser.js';
17
+ export interface MergeResult {
18
+ content: string;
19
+ conflicts: string[];
20
+ skipped: number;
21
+ applied: number;
22
+ /** 未计入内容警告(delta 未覆盖但 base 中存在的段落) */
23
+ unaccountedWarnings: string[];
24
+ }
25
+ export interface MergeOptions {
26
+ /** 强制覆盖,跳过幂等性检查 */
27
+ force?: boolean;
28
+ /** 保留被删除的需求(标记为 retired 而非删除,默认 true) */
29
+ retainRemoved?: boolean;
30
+ /** 启用场景丢失守卫(默认 true) */
31
+ scenarioLossGuard?: boolean;
32
+ /** 启用未计入内容检测(默认 true) */
33
+ detectUnaccounted?: boolean;
34
+ }
35
+ /**
36
+ * 构建代码围栏掩码
37
+ *
38
+ * 返回布尔数组,标记哪些行在代码围栏内。
39
+ * 用于防止代码块内的文本被误匹配为需求标题。
40
+ */
41
+ export declare function buildCodeFenceMask(content: string): boolean[];
42
+ /**
43
+ * 将代码围栏内容替换为占位符
44
+ *
45
+ * 返回掩码后的内容和占位符映射表
46
+ */
47
+ export declare function maskCodeFences(content: string): {
48
+ masked: string;
49
+ placeholders: Map<string, string>;
50
+ };
51
+ /**
52
+ * 还原代码围栏占位符
53
+ */
54
+ export declare function unmaskCodeFences(content: string, placeholders: Map<string, string>): string;
55
+ /**
56
+ * 从内容中提取所有场景名称
57
+ *
58
+ * 匹配格式:### Scenario: 场景名
59
+ */
60
+ export declare function extractScenarios(content: string): string[];
61
+ /**
62
+ * 检查 MODIFIED 操作是否会导致场景丢失
63
+ *
64
+ * 比较 base spec 中的场景与 delta 中的场景,
65
+ * 返回 delta 中缺失的场景名称列表。
66
+ */
67
+ export declare function findMissingScenarios(baseContent: string, deltaContent: string): string[];
68
+ /**
69
+ * 检测 base spec 中 delta 未覆盖的内容
70
+ *
71
+ * 审计整个文件,找出 delta 操作范围之外的内容段落。
72
+ * 返回未计入内容的描述列表。
73
+ */
74
+ export declare function detectUnaccountedContent(baseContent: string, delta: {
75
+ added: DeltaBlock[];
76
+ modified: DeltaBlock[];
77
+ removed: DeltaBlock[];
78
+ renamed: {
79
+ oldName: string;
80
+ newName: string;
81
+ }[];
82
+ }): string[];
83
+ /**
84
+ * 合并 Delta Spec 到现有 Spec
85
+ *
86
+ * 四阶段合并顺序:
87
+ * 1. RENAMED — 重命名需求块
88
+ * 2. REMOVED — 删除/退休需求块(默认启用能力退休)
89
+ * 3. MODIFIED — 更新需求块内容(带场景丢失守卫)
90
+ * 4. ADDED — 添加新需求块
91
+ *
92
+ * 每个阶段都进行幂等性检查,已同步的操作会被跳过
93
+ *
94
+ * 增强特性:
95
+ * - 代码围栏掩码:防止代码块内容被误匹配
96
+ * - 场景丢失守卫:MODIFIED 操作前检查场景完整性
97
+ * - 能力退休:REMOVED 操作默认标记为 [RETIRED] 而非删除
98
+ * - 未计入内容检测:合并后检测 delta 未覆盖的内容
99
+ */
100
+ export declare function mergeDeltaSpec(existingContent: string, deltaContent: string, options?: MergeOptions): MergeResult;
101
+ //# sourceMappingURL=delta-merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta-merger.d.ts","sourceRoot":"","sources":["../../../src/core/archive/delta-merger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAM3B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wBAAwB;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,yBAAyB;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CAe7D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAoCrG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAM3F;AAMD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAY1D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAMxF;AAMD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAC7H,MAAM,EAAE,CAgDV;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAC5B,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,YAAiB,GACzB,WAAW,CAgJb"}
@@ -0,0 +1,398 @@
1
+ /**
2
+ * Delta Spec 合并器 — 移植自 OpenSpec specs-apply.ts
3
+ *
4
+ * 结构化合并算法,支持:
5
+ * - 四阶段合并顺序:RENAMED → REMOVED → MODIFIED → ADDED
6
+ * - 冲突检测与报告
7
+ * - 幂等性检查(已同步则跳过)
8
+ * - 保留原有格式和注释
9
+ *
10
+ * 增强特性(移植自 OpenSpec):
11
+ * - 场景丢失守卫(Scenario-loss guard)
12
+ * - 能力退休(Capability retirement)
13
+ * - 未计入内容检测(Unaccounted content detection)
14
+ * - 代码围栏掩码(Code fence masking)
15
+ */
16
+ import { parseDelta, extractRequirementBlock, isBlockIdentical, } from './delta-parser.js';
17
+ // ============================================================
18
+ // 代码围栏掩码
19
+ // ============================================================
20
+ /**
21
+ * 构建代码围栏掩码
22
+ *
23
+ * 返回布尔数组,标记哪些行在代码围栏内。
24
+ * 用于防止代码块内的文本被误匹配为需求标题。
25
+ */
26
+ export function buildCodeFenceMask(content) {
27
+ const lines = content.split('\n');
28
+ const mask = new Array(lines.length).fill(false);
29
+ let inFence = false;
30
+ for (let i = 0; i < lines.length; i++) {
31
+ if (lines[i].trim().startsWith('```')) {
32
+ inFence = !inFence;
33
+ mask[i] = true; // 围栏标记行本身也掩码
34
+ }
35
+ else if (inFence) {
36
+ mask[i] = true;
37
+ }
38
+ }
39
+ return mask;
40
+ }
41
+ /**
42
+ * 将代码围栏内容替换为占位符
43
+ *
44
+ * 返回掩码后的内容和占位符映射表
45
+ */
46
+ export function maskCodeFences(content) {
47
+ const lines = content.split('\n');
48
+ const placeholders = new Map();
49
+ const result = [];
50
+ let inFence = false;
51
+ let fenceLines = [];
52
+ let fenceIndex = 0;
53
+ for (const line of lines) {
54
+ if (line.trim().startsWith('```')) {
55
+ if (!inFence) {
56
+ inFence = true;
57
+ fenceLines = [line];
58
+ }
59
+ else {
60
+ fenceLines.push(line);
61
+ // 完成一个围栏块,替换为占位符
62
+ const placeholder = `__CODE_FENCE_${fenceIndex}__`;
63
+ placeholders.set(placeholder, fenceLines.join('\n'));
64
+ result.push(placeholder);
65
+ fenceIndex++;
66
+ inFence = false;
67
+ fenceLines = [];
68
+ }
69
+ }
70
+ else if (inFence) {
71
+ fenceLines.push(line);
72
+ }
73
+ else {
74
+ result.push(line);
75
+ }
76
+ }
77
+ // 如果围栏未闭合,保持原样
78
+ if (inFence && fenceLines.length > 0) {
79
+ result.push(...fenceLines);
80
+ }
81
+ return { masked: result.join('\n'), placeholders };
82
+ }
83
+ /**
84
+ * 还原代码围栏占位符
85
+ */
86
+ export function unmaskCodeFences(content, placeholders) {
87
+ let result = content;
88
+ for (const [placeholder, original] of placeholders) {
89
+ result = result.replace(placeholder, original);
90
+ }
91
+ return result;
92
+ }
93
+ // ============================================================
94
+ // 场景丢失守卫
95
+ // ============================================================
96
+ /**
97
+ * 从内容中提取所有场景名称
98
+ *
99
+ * 匹配格式:### Scenario: 场景名
100
+ */
101
+ export function extractScenarios(content) {
102
+ const scenarios = [];
103
+ const lines = content.split('\n');
104
+ for (const line of lines) {
105
+ const match = line.match(/^###\s+Scenario:\s*(.+)/i);
106
+ if (match) {
107
+ scenarios.push(match[1].trim());
108
+ }
109
+ }
110
+ return scenarios;
111
+ }
112
+ /**
113
+ * 检查 MODIFIED 操作是否会导致场景丢失
114
+ *
115
+ * 比较 base spec 中的场景与 delta 中的场景,
116
+ * 返回 delta 中缺失的场景名称列表。
117
+ */
118
+ export function findMissingScenarios(baseContent, deltaContent) {
119
+ const baseScenarios = extractScenarios(baseContent);
120
+ const deltaScenarios = extractScenarios(deltaContent);
121
+ const deltaSet = new Set(deltaScenarios.map(s => s.toLowerCase()));
122
+ return baseScenarios.filter(s => !deltaSet.has(s.toLowerCase()));
123
+ }
124
+ // ============================================================
125
+ // 未计入内容检测
126
+ // ============================================================
127
+ /**
128
+ * 检测 base spec 中 delta 未覆盖的内容
129
+ *
130
+ * 审计整个文件,找出 delta 操作范围之外的内容段落。
131
+ * 返回未计入内容的描述列表。
132
+ */
133
+ export function detectUnaccountedContent(baseContent, delta) {
134
+ const unaccounted = [];
135
+ const lines = baseContent.split('\n');
136
+ const mask = buildCodeFenceMask(baseContent);
137
+ // 收集所有被 delta 覆盖的需求名称
138
+ const coveredNames = new Set();
139
+ for (const block of [...delta.added, ...delta.modified, ...delta.removed]) {
140
+ coveredNames.add(block.name.toLowerCase());
141
+ }
142
+ for (const rename of delta.renamed) {
143
+ coveredNames.add(rename.oldName.toLowerCase());
144
+ coveredNames.add(rename.newName.toLowerCase());
145
+ }
146
+ // 检查文件中的每个需求块是否被 delta 覆盖
147
+ let currentBlockName = null;
148
+ let hasContent = false;
149
+ for (let i = 0; i < lines.length; i++) {
150
+ if (mask[i])
151
+ continue; // 跳过代码围栏内容
152
+ const line = lines[i];
153
+ const headerMatch = line.match(/^(#{2,3})\s+(?!Scenario:\s*)(?:Requirement:\s*)?(.+)/i);
154
+ if (headerMatch) {
155
+ // 保存上一个块的状态
156
+ if (currentBlockName && hasContent && !coveredNames.has(currentBlockName.toLowerCase())) {
157
+ unaccounted.push(`Requirement "${currentBlockName}" not covered by delta`);
158
+ }
159
+ currentBlockName = headerMatch[2].trim();
160
+ hasContent = false;
161
+ continue;
162
+ }
163
+ // 检测需求块内的内容
164
+ if (currentBlockName && line.trim() && !line.startsWith('#') && !mask[i]) {
165
+ hasContent = true;
166
+ }
167
+ }
168
+ // 检查最后一个块
169
+ if (currentBlockName && hasContent && !coveredNames.has(currentBlockName.toLowerCase())) {
170
+ unaccounted.push(`Requirement "${currentBlockName}" not covered by delta`);
171
+ }
172
+ return [...new Set(unaccounted)];
173
+ }
174
+ // ============================================================
175
+ // 合并函数
176
+ // ============================================================
177
+ /**
178
+ * 合并 Delta Spec 到现有 Spec
179
+ *
180
+ * 四阶段合并顺序:
181
+ * 1. RENAMED — 重命名需求块
182
+ * 2. REMOVED — 删除/退休需求块(默认启用能力退休)
183
+ * 3. MODIFIED — 更新需求块内容(带场景丢失守卫)
184
+ * 4. ADDED — 添加新需求块
185
+ *
186
+ * 每个阶段都进行幂等性检查,已同步的操作会被跳过
187
+ *
188
+ * 增强特性:
189
+ * - 代码围栏掩码:防止代码块内容被误匹配
190
+ * - 场景丢失守卫:MODIFIED 操作前检查场景完整性
191
+ * - 能力退休:REMOVED 操作默认标记为 [RETIRED] 而非删除
192
+ * - 未计入内容检测:合并后检测 delta 未覆盖的内容
193
+ */
194
+ export function mergeDeltaSpec(existingContent, deltaContent, options = {}) {
195
+ const scenarioLossGuard = options.scenarioLossGuard !== false;
196
+ const detectUnaccounted = options.detectUnaccounted !== false;
197
+ // 代码围栏掩码:先掩码再解析,防止代码块内的标题被误识别
198
+ const { masked: maskedExisting, placeholders: existingPlaceholders } = maskCodeFences(existingContent);
199
+ const { masked: maskedDelta, placeholders: deltaPlaceholders } = maskCodeFences(deltaContent);
200
+ const delta = parseDelta(maskedDelta);
201
+ const result = {
202
+ content: maskedExisting,
203
+ conflicts: [...delta.conflicts],
204
+ skipped: 0,
205
+ applied: 0,
206
+ unaccountedWarnings: [],
207
+ };
208
+ // 如果有冲突,先还原掩码再返回
209
+ if (result.conflicts.length > 0) {
210
+ result.content = unmaskCodeFences(result.content, existingPlaceholders);
211
+ return result;
212
+ }
213
+ // 阶段 1: RENAMED
214
+ for (const rename of delta.renamed) {
215
+ const existingBlock = extractRequirementBlock(result.content, rename.oldName);
216
+ if (!existingBlock) {
217
+ result.conflicts.push(`Cannot rename "${rename.oldName}": not found in existing spec`);
218
+ continue;
219
+ }
220
+ // 检查是否已经重命名过(幂等性)
221
+ const alreadyRenamed = extractRequirementBlock(result.content, rename.newName);
222
+ if (alreadyRenamed && !options.force) {
223
+ result.skipped++;
224
+ continue;
225
+ }
226
+ // 执行重命名:替换 header 中的名称
227
+ const renamedBlock = existingBlock.replace(new RegExp(`(#+\\s+(?:Requirement:\\s*)?)${escapeRegex(rename.oldName)}`, 'i'), `$1${rename.newName}`);
228
+ // 替换整个 block
229
+ result.content = replaceBlock(result.content, rename.oldName, renamedBlock);
230
+ result.applied++;
231
+ }
232
+ // 阶段 2: REMOVED — 默认启用能力退休模式
233
+ for (const block of delta.removed) {
234
+ const existingBlock = extractRequirementBlock(result.content, block.name);
235
+ if (!existingBlock) {
236
+ // 需求不存在,跳过
237
+ result.skipped++;
238
+ continue;
239
+ }
240
+ // 默认启用能力退休:标记为 [RETIRED] 而非删除
241
+ // 只有显式设置 retainRemoved: false 才会完全删除
242
+ const shouldRetain = options.retainRemoved !== false;
243
+ if (shouldRetain) {
244
+ // 标记为 retired 而非删除
245
+ const retiredBlock = existingBlock.replace(/^(#+\s+(?:Requirement:\s*)?)/m, '$1[RETIRED] ');
246
+ result.content = replaceBlock(result.content, block.name, retiredBlock);
247
+ }
248
+ else {
249
+ // 完全删除
250
+ result.content = removeBlock(result.content, block.name);
251
+ }
252
+ result.applied++;
253
+ }
254
+ // 阶段 3: MODIFIED — 带场景丢失守卫
255
+ for (const block of delta.modified) {
256
+ const existingBlock = extractRequirementBlock(result.content, block.name);
257
+ if (!existingBlock) {
258
+ // 需求不存在,作为 ADDED 处理
259
+ result.content = appendBlock(result.content, block);
260
+ result.applied++;
261
+ continue;
262
+ }
263
+ // 场景丢失守卫:检查 MODIFIED 是否会丢失场景
264
+ if (scenarioLossGuard) {
265
+ // 还原掩码后的内容进行场景比较
266
+ const originalExisting = unmaskCodeFences(existingBlock, existingPlaceholders);
267
+ const originalDelta = unmaskCodeFences(block.content, deltaPlaceholders);
268
+ const missingScenarios = findMissingScenarios(originalExisting, originalDelta);
269
+ if (missingScenarios.length > 0) {
270
+ result.conflicts.push(`MODIFIED failed for "${block.name}" - current spec contains scenario(s) not present in the modified block: ${missingScenarios.map(s => `"${s}"`).join(', ')}. Refresh the change spec before archiving to avoid dropping scenarios.`);
271
+ continue;
272
+ }
273
+ }
274
+ // 幂等性检查
275
+ if (!options.force && isBlockIdentical(existingBlock, block.content)) {
276
+ result.skipped++;
277
+ continue;
278
+ }
279
+ // 替换 block
280
+ result.content = replaceBlock(result.content, block.name, formatBlock(block));
281
+ result.applied++;
282
+ }
283
+ // 阶段 4: ADDED
284
+ for (const block of delta.added) {
285
+ const existingBlock = extractRequirementBlock(result.content, block.name);
286
+ if (existingBlock) {
287
+ // 需求已存在
288
+ if (!options.force && isBlockIdentical(existingBlock, block.content)) {
289
+ result.skipped++;
290
+ }
291
+ else {
292
+ result.conflicts.push(`Requirement "${block.name}" already exists (use --force to overwrite)`);
293
+ }
294
+ continue;
295
+ }
296
+ // 添加新 block
297
+ result.content = appendBlock(result.content, block);
298
+ result.applied++;
299
+ }
300
+ // 未计入内容检测
301
+ if (detectUnaccounted && result.conflicts.length === 0) {
302
+ const warnings = detectUnaccountedContent(maskedExisting, delta);
303
+ result.unaccountedWarnings = warnings;
304
+ }
305
+ // 还原代码围栏掩码
306
+ result.content = unmaskCodeFences(result.content, existingPlaceholders);
307
+ return result;
308
+ }
309
+ // ============================================================
310
+ // 辅助函数
311
+ // ============================================================
312
+ /**
313
+ * 格式化 DeltaBlock 为 Markdown
314
+ */
315
+ function formatBlock(block) {
316
+ const header = `## Requirement: ${block.name}`;
317
+ return `${header}\n\n${block.content}`;
318
+ }
319
+ /**
320
+ * 替换 spec 中的指定需求块
321
+ */
322
+ function replaceBlock(content, requirementName, newBlock) {
323
+ const lines = content.split('\n');
324
+ const result = [];
325
+ let inBlock = false;
326
+ let blockLevel = 0;
327
+ let blockStartIndex = -1;
328
+ for (let i = 0; i < lines.length; i++) {
329
+ const line = lines[i];
330
+ const headerMatch = line.match(/^(#{2,3})\s+(?:Requirement:\s*)?(.+)/i);
331
+ if (headerMatch) {
332
+ const level = headerMatch[1].length;
333
+ const name = headerMatch[2].trim();
334
+ if (name === requirementName) {
335
+ inBlock = true;
336
+ blockLevel = level;
337
+ blockStartIndex = result.length;
338
+ // 不添加旧 header,稍后添加新 block
339
+ continue;
340
+ }
341
+ if (inBlock && level <= blockLevel) {
342
+ // 遇到同级或更高级的 header,结束当前 block
343
+ inBlock = false;
344
+ }
345
+ }
346
+ if (!inBlock) {
347
+ result.push(line);
348
+ }
349
+ }
350
+ // 在 block 开始位置插入新内容
351
+ if (blockStartIndex >= 0) {
352
+ result.splice(blockStartIndex, 0, newBlock);
353
+ }
354
+ return result.join('\n');
355
+ }
356
+ /**
357
+ * 删除 spec 中的指定需求块
358
+ */
359
+ function removeBlock(content, requirementName) {
360
+ const lines = content.split('\n');
361
+ const result = [];
362
+ let inBlock = false;
363
+ let blockLevel = 0;
364
+ for (const line of lines) {
365
+ const headerMatch = line.match(/^(#{2,3})\s+(?:Requirement:\s*)?(.+)/i);
366
+ if (headerMatch) {
367
+ const level = headerMatch[1].length;
368
+ const name = headerMatch[2].trim();
369
+ if (name === requirementName) {
370
+ inBlock = true;
371
+ blockLevel = level;
372
+ continue;
373
+ }
374
+ if (inBlock && level <= blockLevel) {
375
+ inBlock = false;
376
+ }
377
+ }
378
+ if (!inBlock) {
379
+ result.push(line);
380
+ }
381
+ }
382
+ return result.join('\n');
383
+ }
384
+ /**
385
+ * 追加新需求块到 spec 末尾
386
+ */
387
+ function appendBlock(content, block) {
388
+ const formatted = formatBlock(block);
389
+ const separator = content.trim() ? '\n\n' : '';
390
+ return content.trim() + separator + formatted;
391
+ }
392
+ /**
393
+ * 转义正则特殊字符
394
+ */
395
+ function escapeRegex(str) {
396
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
397
+ }
398
+ //# sourceMappingURL=delta-merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta-merger.js","sourceRoot":"","sources":["../../../src/core/archive/delta-merger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Delta Spec 解析器 — 移植自 OpenSpec specs-apply.ts
3
+ *
4
+ * 结构化解析 Delta Spec 文件,支持:
5
+ * - ADDED / MODIFIED / REMOVED / RENAMED 四种操作
6
+ * - 需求块提取与规范化
7
+ * - 冲突检测(跨段冲突、重复名称、RENAMED+REMOVED 矛盾)
8
+ * - 幂等性比较(normalizeBlockRaw)
9
+ */
10
+ export type DeltaAction = 'ADDED' | 'MODIFIED' | 'REMOVED' | 'RENAMED';
11
+ export interface DeltaBlock {
12
+ action: DeltaAction;
13
+ name: string;
14
+ content: string;
15
+ rawLines: string[];
16
+ }
17
+ export interface RenameMapping {
18
+ oldName: string;
19
+ newName: string;
20
+ }
21
+ export interface ParsedDelta {
22
+ added: DeltaBlock[];
23
+ modified: DeltaBlock[];
24
+ removed: DeltaBlock[];
25
+ renamed: RenameMapping[];
26
+ conflicts: string[];
27
+ }
28
+ /**
29
+ * 解析 Delta Spec 文件内容
30
+ */
31
+ export declare function parseDelta(content: string): ParsedDelta;
32
+ /**
33
+ * 规范化 block 内容(用于幂等性比较)
34
+ *
35
+ * - 去除首尾空白
36
+ * - 规范化换行符
37
+ * - 移除多余空行
38
+ */
39
+ export declare function normalizeBlockContent(content: string): string;
40
+ /**
41
+ * 从现有 spec 文件中提取指定需求块
42
+ */
43
+ export declare function extractRequirementBlock(content: string, requirementName: string): string | null;
44
+ /**
45
+ * 检查两个 block 是否内容相同(幂等性)
46
+ */
47
+ export declare function isBlockIdentical(a: string, b: string): boolean;
48
+ //# sourceMappingURL=delta-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta-parser.d.ts","sourceRoot":"","sources":["../../../src/core/archive/delta-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAsBD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CA+FvD;AAmCD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkC/F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAE9D"}