@planu/cli 0.63.6 → 0.64.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 (664) hide show
  1. package/dist/config/license-plans.json +16 -1
  2. package/dist/engine/a2a/capability-card.d.ts +16 -0
  3. package/dist/engine/a2a/capability-card.d.ts.map +1 -0
  4. package/dist/engine/a2a/capability-card.js +69 -0
  5. package/dist/engine/a2a/capability-card.js.map +1 -0
  6. package/dist/engine/a2a/delegate.d.ts +15 -0
  7. package/dist/engine/a2a/delegate.d.ts.map +1 -0
  8. package/dist/engine/a2a/delegate.js +47 -0
  9. package/dist/engine/a2a/delegate.js.map +1 -0
  10. package/dist/engine/a2a/fallback.d.ts +12 -0
  11. package/dist/engine/a2a/fallback.d.ts.map +1 -0
  12. package/dist/engine/a2a/fallback.js +52 -0
  13. package/dist/engine/a2a/fallback.js.map +1 -0
  14. package/dist/engine/a2a/index.d.ts +5 -0
  15. package/dist/engine/a2a/index.d.ts.map +1 -0
  16. package/dist/engine/a2a/index.js +6 -0
  17. package/dist/engine/a2a/index.js.map +1 -0
  18. package/dist/engine/a2a/task-manager.d.ts +39 -0
  19. package/dist/engine/a2a/task-manager.d.ts.map +1 -0
  20. package/dist/engine/a2a/task-manager.js +84 -0
  21. package/dist/engine/a2a/task-manager.js.map +1 -0
  22. package/dist/engine/ac-gap-detector/analyze-gaps.d.ts +13 -0
  23. package/dist/engine/ac-gap-detector/analyze-gaps.d.ts.map +1 -0
  24. package/dist/engine/ac-gap-detector/analyze-gaps.js +43 -0
  25. package/dist/engine/ac-gap-detector/analyze-gaps.js.map +1 -0
  26. package/dist/engine/ac-gap-detector/constants.d.ts +22 -0
  27. package/dist/engine/ac-gap-detector/constants.d.ts.map +1 -0
  28. package/dist/engine/ac-gap-detector/constants.js +143 -0
  29. package/dist/engine/ac-gap-detector/constants.js.map +1 -0
  30. package/dist/engine/ac-gap-detector/gap-rules.d.ts +16 -0
  31. package/dist/engine/ac-gap-detector/gap-rules.d.ts.map +1 -0
  32. package/dist/engine/ac-gap-detector/gap-rules.js +180 -0
  33. package/dist/engine/ac-gap-detector/gap-rules.js.map +1 -0
  34. package/dist/engine/ac-gap-detector/pattern-matcher.d.ts +16 -0
  35. package/dist/engine/ac-gap-detector/pattern-matcher.d.ts.map +1 -0
  36. package/dist/engine/ac-gap-detector/pattern-matcher.js +62 -0
  37. package/dist/engine/ac-gap-detector/pattern-matcher.js.map +1 -0
  38. package/dist/engine/ac-gap-detector.d.ts +3 -0
  39. package/dist/engine/ac-gap-detector.d.ts.map +1 -0
  40. package/dist/engine/ac-gap-detector.js +5 -0
  41. package/dist/engine/ac-gap-detector.js.map +1 -0
  42. package/dist/engine/analyzer/analyze-project.js +1 -1
  43. package/dist/engine/analyzer/analyze-project.js.map +1 -1
  44. package/dist/engine/analyzer/completeness-checker.js +1 -1
  45. package/dist/engine/analyzer/completeness-checker.js.map +1 -1
  46. package/dist/engine/analyzer/detectors.js +2 -2
  47. package/dist/engine/analyzer/detectors.js.map +1 -1
  48. package/dist/engine/audit-trail/attestation.d.ts +11 -0
  49. package/dist/engine/audit-trail/attestation.d.ts.map +1 -0
  50. package/dist/engine/audit-trail/attestation.js +47 -0
  51. package/dist/engine/audit-trail/attestation.js.map +1 -0
  52. package/dist/engine/audit-trail/index.d.ts +6 -0
  53. package/dist/engine/audit-trail/index.d.ts.map +1 -0
  54. package/dist/engine/audit-trail/index.js +6 -0
  55. package/dist/engine/audit-trail/index.js.map +1 -0
  56. package/dist/engine/audit-trail/logger.d.ts +17 -0
  57. package/dist/engine/audit-trail/logger.d.ts.map +1 -0
  58. package/dist/engine/audit-trail/logger.js +78 -0
  59. package/dist/engine/audit-trail/logger.js.map +1 -0
  60. package/dist/engine/audit-trail/query.d.ts +7 -0
  61. package/dist/engine/audit-trail/query.d.ts.map +1 -0
  62. package/dist/engine/audit-trail/query.js +61 -0
  63. package/dist/engine/audit-trail/query.js.map +1 -0
  64. package/dist/engine/audit-trail/utils.d.ts +18 -0
  65. package/dist/engine/audit-trail/utils.d.ts.map +1 -0
  66. package/dist/engine/audit-trail/utils.js +44 -0
  67. package/dist/engine/audit-trail/utils.js.map +1 -0
  68. package/dist/engine/audit-trail/verifier.d.ts +10 -0
  69. package/dist/engine/audit-trail/verifier.d.ts.map +1 -0
  70. package/dist/engine/audit-trail/verifier.js +78 -0
  71. package/dist/engine/audit-trail/verifier.js.map +1 -0
  72. package/dist/engine/auth/config.d.ts +20 -0
  73. package/dist/engine/auth/config.d.ts.map +1 -0
  74. package/dist/engine/auth/config.js +49 -0
  75. package/dist/engine/auth/config.js.map +1 -0
  76. package/dist/engine/auth/index.d.ts +6 -0
  77. package/dist/engine/auth/index.d.ts.map +1 -0
  78. package/dist/engine/auth/index.js +7 -0
  79. package/dist/engine/auth/index.js.map +1 -0
  80. package/dist/engine/auth/middleware.d.ts +19 -0
  81. package/dist/engine/auth/middleware.d.ts.map +1 -0
  82. package/dist/engine/auth/middleware.js +64 -0
  83. package/dist/engine/auth/middleware.js.map +1 -0
  84. package/dist/engine/auth/pkce.d.ts +17 -0
  85. package/dist/engine/auth/pkce.d.ts.map +1 -0
  86. package/dist/engine/auth/pkce.js +33 -0
  87. package/dist/engine/auth/pkce.js.map +1 -0
  88. package/dist/engine/auth/scope-mapper.d.ts +21 -0
  89. package/dist/engine/auth/scope-mapper.d.ts.map +1 -0
  90. package/dist/engine/auth/scope-mapper.js +124 -0
  91. package/dist/engine/auth/scope-mapper.js.map +1 -0
  92. package/dist/engine/auth/token-validator.d.ts +15 -0
  93. package/dist/engine/auth/token-validator.d.ts.map +1 -0
  94. package/dist/engine/auth/token-validator.js +121 -0
  95. package/dist/engine/auth/token-validator.js.map +1 -0
  96. package/dist/engine/ci-generator/index.d.ts.map +1 -1
  97. package/dist/engine/ci-generator/index.js +8 -2
  98. package/dist/engine/ci-generator/index.js.map +1 -1
  99. package/dist/engine/ci-generator/yaml-builder.d.ts +7 -2
  100. package/dist/engine/ci-generator/yaml-builder.d.ts.map +1 -1
  101. package/dist/engine/ci-generator/yaml-builder.js +49 -1
  102. package/dist/engine/ci-generator/yaml-builder.js.map +1 -1
  103. package/dist/engine/code-transforms/typescript/ast-utils.js +1 -1
  104. package/dist/engine/code-transforms/typescript/ast-utils.js.map +1 -1
  105. package/dist/engine/design-to-spec/ac-generator.d.ts +21 -0
  106. package/dist/engine/design-to-spec/ac-generator.d.ts.map +1 -0
  107. package/dist/engine/design-to-spec/ac-generator.js +185 -0
  108. package/dist/engine/design-to-spec/ac-generator.js.map +1 -0
  109. package/dist/engine/design-to-spec/index.d.ts +11 -0
  110. package/dist/engine/design-to-spec/index.d.ts.map +1 -0
  111. package/dist/engine/design-to-spec/index.js +19 -0
  112. package/dist/engine/design-to-spec/index.js.map +1 -0
  113. package/dist/engine/design-to-spec/parser.d.ts +7 -0
  114. package/dist/engine/design-to-spec/parser.d.ts.map +1 -0
  115. package/dist/engine/design-to-spec/parser.js +290 -0
  116. package/dist/engine/design-to-spec/parser.js.map +1 -0
  117. package/dist/engine/design-to-spec/spec-builder.d.ts +12 -0
  118. package/dist/engine/design-to-spec/spec-builder.d.ts.map +1 -0
  119. package/dist/engine/design-to-spec/spec-builder.js +148 -0
  120. package/dist/engine/design-to-spec/spec-builder.js.map +1 -0
  121. package/dist/engine/design-to-spec/ui-contract-builder.d.ts +17 -0
  122. package/dist/engine/design-to-spec/ui-contract-builder.d.ts.map +1 -0
  123. package/dist/engine/design-to-spec/ui-contract-builder.js +175 -0
  124. package/dist/engine/design-to-spec/ui-contract-builder.js.map +1 -0
  125. package/dist/engine/detectors/css-framework-detector.js +9 -9
  126. package/dist/engine/detectors/css-framework-detector.js.map +1 -1
  127. package/dist/engine/detectors/mcp-server-detector.js +2 -2
  128. package/dist/engine/detectors/mcp-server-detector.js.map +1 -1
  129. package/dist/engine/docs-site-generator/markdown-renderer.js +1 -1
  130. package/dist/engine/docs-site-generator/markdown-renderer.js.map +1 -1
  131. package/dist/engine/elicitation/builder.d.ts +37 -0
  132. package/dist/engine/elicitation/builder.d.ts.map +1 -0
  133. package/dist/engine/elicitation/builder.js +115 -0
  134. package/dist/engine/elicitation/builder.js.map +1 -0
  135. package/dist/engine/elicitation/fallback.d.ts +20 -0
  136. package/dist/engine/elicitation/fallback.d.ts.map +1 -0
  137. package/dist/engine/elicitation/fallback.js +72 -0
  138. package/dist/engine/elicitation/fallback.js.map +1 -0
  139. package/dist/engine/elicitation/index.d.ts +4 -0
  140. package/dist/engine/elicitation/index.d.ts.map +1 -0
  141. package/dist/engine/elicitation/index.js +5 -0
  142. package/dist/engine/elicitation/index.js.map +1 -0
  143. package/dist/engine/elicitation/response-parser.d.ts +9 -0
  144. package/dist/engine/elicitation/response-parser.d.ts.map +1 -0
  145. package/dist/engine/elicitation/response-parser.js +163 -0
  146. package/dist/engine/elicitation/response-parser.js.map +1 -0
  147. package/dist/engine/federation/cross-repo-resolver.d.ts +21 -0
  148. package/dist/engine/federation/cross-repo-resolver.d.ts.map +1 -0
  149. package/dist/engine/federation/cross-repo-resolver.js +75 -0
  150. package/dist/engine/federation/cross-repo-resolver.js.map +1 -0
  151. package/dist/engine/federation/drift-checker.d.ts +19 -0
  152. package/dist/engine/federation/drift-checker.d.ts.map +1 -0
  153. package/dist/engine/federation/drift-checker.js +114 -0
  154. package/dist/engine/federation/drift-checker.js.map +1 -0
  155. package/dist/engine/federation/federation-store.d.ts +25 -0
  156. package/dist/engine/federation/federation-store.d.ts.map +1 -0
  157. package/dist/engine/federation/federation-store.js +58 -0
  158. package/dist/engine/federation/federation-store.js.map +1 -0
  159. package/dist/engine/federation/index.d.ts +4 -0
  160. package/dist/engine/federation/index.d.ts.map +1 -0
  161. package/dist/engine/federation/index.js +5 -0
  162. package/dist/engine/federation/index.js.map +1 -0
  163. package/dist/engine/github/spec-ac-analyzer.d.ts +40 -0
  164. package/dist/engine/github/spec-ac-analyzer.d.ts.map +1 -0
  165. package/dist/engine/github/spec-ac-analyzer.js +181 -0
  166. package/dist/engine/github/spec-ac-analyzer.js.map +1 -0
  167. package/dist/engine/hooks/handlers/on-impl-change.d.ts +3 -1
  168. package/dist/engine/hooks/handlers/on-impl-change.d.ts.map +1 -1
  169. package/dist/engine/hooks/handlers/on-impl-change.js +25 -1
  170. package/dist/engine/hooks/handlers/on-impl-change.js.map +1 -1
  171. package/dist/engine/infrastructure/component-mapper.d.ts +9 -0
  172. package/dist/engine/infrastructure/component-mapper.d.ts.map +1 -0
  173. package/dist/engine/infrastructure/component-mapper.js +162 -0
  174. package/dist/engine/infrastructure/component-mapper.js.map +1 -0
  175. package/dist/engine/infrastructure/cost-estimator.d.ts +6 -0
  176. package/dist/engine/infrastructure/cost-estimator.d.ts.map +1 -0
  177. package/dist/engine/infrastructure/cost-estimator.js +48 -0
  178. package/dist/engine/infrastructure/cost-estimator.js.map +1 -0
  179. package/dist/engine/infrastructure/docker-compose-generator.d.ts +6 -0
  180. package/dist/engine/infrastructure/docker-compose-generator.d.ts.map +1 -0
  181. package/dist/engine/infrastructure/docker-compose-generator.js +201 -0
  182. package/dist/engine/infrastructure/docker-compose-generator.js.map +1 -0
  183. package/dist/engine/infrastructure/index.d.ts +15 -0
  184. package/dist/engine/infrastructure/index.d.ts.map +1 -0
  185. package/dist/engine/infrastructure/index.js +67 -0
  186. package/dist/engine/infrastructure/index.js.map +1 -0
  187. package/dist/engine/infrastructure/kubernetes-generator.d.ts +6 -0
  188. package/dist/engine/infrastructure/kubernetes-generator.d.ts.map +1 -0
  189. package/dist/engine/infrastructure/kubernetes-generator.js +141 -0
  190. package/dist/engine/infrastructure/kubernetes-generator.js.map +1 -0
  191. package/dist/engine/infrastructure/railway-generator.d.ts +6 -0
  192. package/dist/engine/infrastructure/railway-generator.d.ts.map +1 -0
  193. package/dist/engine/infrastructure/railway-generator.js +87 -0
  194. package/dist/engine/infrastructure/railway-generator.js.map +1 -0
  195. package/dist/engine/infrastructure/signal-detector.d.ts +7 -0
  196. package/dist/engine/infrastructure/signal-detector.d.ts.map +1 -0
  197. package/dist/engine/infrastructure/signal-detector.js +174 -0
  198. package/dist/engine/infrastructure/signal-detector.js.map +1 -0
  199. package/dist/engine/infrastructure/terraform-generator.d.ts +6 -0
  200. package/dist/engine/infrastructure/terraform-generator.d.ts.map +1 -0
  201. package/dist/engine/infrastructure/terraform-generator.js +241 -0
  202. package/dist/engine/infrastructure/terraform-generator.js.map +1 -0
  203. package/dist/engine/legal-compliance/detector.js +1 -1
  204. package/dist/engine/legal-compliance/detector.js.map +1 -1
  205. package/dist/engine/living-spec/annotation-parser.d.ts.map +1 -1
  206. package/dist/engine/living-spec/annotation-parser.js.map +1 -1
  207. package/dist/engine/living-spec/auto-updater.d.ts +58 -0
  208. package/dist/engine/living-spec/auto-updater.d.ts.map +1 -0
  209. package/dist/engine/living-spec/auto-updater.js +311 -0
  210. package/dist/engine/living-spec/auto-updater.js.map +1 -0
  211. package/dist/engine/living-spec/bidirectional-sync.d.ts +10 -0
  212. package/dist/engine/living-spec/bidirectional-sync.d.ts.map +1 -1
  213. package/dist/engine/living-spec/bidirectional-sync.js +11 -3
  214. package/dist/engine/living-spec/bidirectional-sync.js.map +1 -1
  215. package/dist/engine/living-spec/conflict-resolver.d.ts +46 -0
  216. package/dist/engine/living-spec/conflict-resolver.d.ts.map +1 -0
  217. package/dist/engine/living-spec/conflict-resolver.js +301 -0
  218. package/dist/engine/living-spec/conflict-resolver.js.map +1 -0
  219. package/dist/engine/living-spec/hash-tracker.d.ts.map +1 -1
  220. package/dist/engine/living-spec/hash-tracker.js.map +1 -1
  221. package/dist/engine/living-spec/index.d.ts +1 -0
  222. package/dist/engine/living-spec/index.d.ts.map +1 -1
  223. package/dist/engine/living-spec/index.js +1 -0
  224. package/dist/engine/living-spec/index.js.map +1 -1
  225. package/dist/engine/living-spec/signature-tracker.d.ts.map +1 -1
  226. package/dist/engine/living-spec/signature-tracker.js.map +1 -1
  227. package/dist/engine/observability/config.d.ts +16 -0
  228. package/dist/engine/observability/config.d.ts.map +1 -0
  229. package/dist/engine/observability/config.js +44 -0
  230. package/dist/engine/observability/config.js.map +1 -0
  231. package/dist/engine/observability/index.d.ts +7 -0
  232. package/dist/engine/observability/index.d.ts.map +1 -0
  233. package/dist/engine/observability/index.js +8 -0
  234. package/dist/engine/observability/index.js.map +1 -0
  235. package/dist/engine/observability/metrics.d.ts +12 -0
  236. package/dist/engine/observability/metrics.d.ts.map +1 -0
  237. package/dist/engine/observability/metrics.js +61 -0
  238. package/dist/engine/observability/metrics.js.map +1 -0
  239. package/dist/engine/observability/noop-tracer.d.ts +13 -0
  240. package/dist/engine/observability/noop-tracer.d.ts.map +1 -0
  241. package/dist/engine/observability/noop-tracer.js +41 -0
  242. package/dist/engine/observability/noop-tracer.js.map +1 -0
  243. package/dist/engine/observability/otel-tracer.d.ts +19 -0
  244. package/dist/engine/observability/otel-tracer.d.ts.map +1 -0
  245. package/dist/engine/observability/otel-tracer.js +134 -0
  246. package/dist/engine/observability/otel-tracer.js.map +1 -0
  247. package/dist/engine/observability/span-helpers.d.ts +28 -0
  248. package/dist/engine/observability/span-helpers.d.ts.map +1 -0
  249. package/dist/engine/observability/span-helpers.js +68 -0
  250. package/dist/engine/observability/span-helpers.js.map +1 -0
  251. package/dist/engine/observability/tracer.d.ts +26 -0
  252. package/dist/engine/observability/tracer.d.ts.map +1 -0
  253. package/dist/engine/observability/tracer.js +45 -0
  254. package/dist/engine/observability/tracer.js.map +1 -0
  255. package/dist/engine/rbac/index.d.ts +3 -0
  256. package/dist/engine/rbac/index.d.ts.map +1 -0
  257. package/dist/engine/rbac/index.js +4 -0
  258. package/dist/engine/rbac/index.js.map +1 -0
  259. package/dist/engine/rbac/permission-checker.d.ts +21 -0
  260. package/dist/engine/rbac/permission-checker.d.ts.map +1 -0
  261. package/dist/engine/rbac/permission-checker.js +74 -0
  262. package/dist/engine/rbac/permission-checker.js.map +1 -0
  263. package/dist/engine/rbac/roles.d.ts +12 -0
  264. package/dist/engine/rbac/roles.d.ts.map +1 -0
  265. package/dist/engine/rbac/roles.js +37 -0
  266. package/dist/engine/rbac/roles.js.map +1 -0
  267. package/dist/engine/shared/ac-extractor.d.ts +9 -0
  268. package/dist/engine/shared/ac-extractor.d.ts.map +1 -0
  269. package/dist/engine/shared/ac-extractor.js +36 -0
  270. package/dist/engine/shared/ac-extractor.js.map +1 -0
  271. package/dist/engine/shared/line-diff.d.ts +11 -0
  272. package/dist/engine/shared/line-diff.d.ts.map +1 -0
  273. package/dist/engine/shared/line-diff.js +32 -0
  274. package/dist/engine/shared/line-diff.js.map +1 -0
  275. package/dist/engine/skill-generator/sections-platform.d.ts.map +1 -1
  276. package/dist/engine/skill-generator/sections-platform.js +13 -37
  277. package/dist/engine/skill-generator/sections-platform.js.map +1 -1
  278. package/dist/engine/skill-registry/agentskill-adapter.d.ts +1 -2
  279. package/dist/engine/skill-registry/agentskill-adapter.d.ts.map +1 -1
  280. package/dist/engine/skill-registry/agentskill-adapter.js +1 -2
  281. package/dist/engine/skill-registry/agentskill-adapter.js.map +1 -1
  282. package/dist/engine/source-resolver.d.ts +1 -1
  283. package/dist/engine/source-resolver.d.ts.map +1 -1
  284. package/dist/engine/source-resolver.js +3 -2
  285. package/dist/engine/source-resolver.js.map +1 -1
  286. package/dist/engine/spec-decomposer/analyzer.d.ts +18 -0
  287. package/dist/engine/spec-decomposer/analyzer.d.ts.map +1 -0
  288. package/dist/engine/spec-decomposer/analyzer.js +263 -0
  289. package/dist/engine/spec-decomposer/analyzer.js.map +1 -0
  290. package/dist/engine/spec-decomposer/file-mapper.d.ts +17 -0
  291. package/dist/engine/spec-decomposer/file-mapper.d.ts.map +1 -0
  292. package/dist/engine/spec-decomposer/file-mapper.js +96 -0
  293. package/dist/engine/spec-decomposer/file-mapper.js.map +1 -0
  294. package/dist/engine/spec-decomposer/index.d.ts +14 -0
  295. package/dist/engine/spec-decomposer/index.d.ts.map +1 -0
  296. package/dist/engine/spec-decomposer/index.js +50 -0
  297. package/dist/engine/spec-decomposer/index.js.map +1 -0
  298. package/dist/engine/spec-decomposer/ownership-resolver.d.ts +7 -0
  299. package/dist/engine/spec-decomposer/ownership-resolver.d.ts.map +1 -0
  300. package/dist/engine/spec-decomposer/ownership-resolver.js +169 -0
  301. package/dist/engine/spec-decomposer/ownership-resolver.js.map +1 -0
  302. package/dist/engine/spec-observability/index.d.ts +4 -0
  303. package/dist/engine/spec-observability/index.d.ts.map +1 -0
  304. package/dist/engine/spec-observability/index.js +4 -0
  305. package/dist/engine/spec-observability/index.js.map +1 -0
  306. package/dist/engine/spec-observability/metrics.d.ts +8 -0
  307. package/dist/engine/spec-observability/metrics.d.ts.map +1 -0
  308. package/dist/engine/spec-observability/metrics.js +116 -0
  309. package/dist/engine/spec-observability/metrics.js.map +1 -0
  310. package/dist/engine/spec-observability/tracker.d.ts +22 -0
  311. package/dist/engine/spec-observability/tracker.d.ts.map +1 -0
  312. package/dist/engine/spec-observability/tracker.js +77 -0
  313. package/dist/engine/spec-observability/tracker.js.map +1 -0
  314. package/dist/engine/spec-reader.d.ts +7 -0
  315. package/dist/engine/spec-reader.d.ts.map +1 -0
  316. package/dist/engine/spec-reader.js +23 -0
  317. package/dist/engine/spec-reader.js.map +1 -0
  318. package/dist/engine/spec-repair.d.ts +10 -0
  319. package/dist/engine/spec-repair.d.ts.map +1 -0
  320. package/dist/engine/spec-repair.js +388 -0
  321. package/dist/engine/spec-repair.js.map +1 -0
  322. package/dist/engine/spec-summary-html.js +2 -2
  323. package/dist/engine/spec-versioning/brancher.d.ts +17 -0
  324. package/dist/engine/spec-versioning/brancher.d.ts.map +1 -0
  325. package/dist/engine/spec-versioning/brancher.js +113 -0
  326. package/dist/engine/spec-versioning/brancher.js.map +1 -0
  327. package/dist/engine/spec-versioning/differ.d.ts +19 -0
  328. package/dist/engine/spec-versioning/differ.d.ts.map +1 -0
  329. package/dist/engine/spec-versioning/differ.js +151 -0
  330. package/dist/engine/spec-versioning/differ.js.map +1 -0
  331. package/dist/engine/spec-versioning/index.d.ts +5 -0
  332. package/dist/engine/spec-versioning/index.d.ts.map +1 -0
  333. package/dist/engine/spec-versioning/index.js +6 -0
  334. package/dist/engine/spec-versioning/index.js.map +1 -0
  335. package/dist/engine/spec-versioning/merger.d.ts +18 -0
  336. package/dist/engine/spec-versioning/merger.d.ts.map +1 -0
  337. package/dist/engine/spec-versioning/merger.js +113 -0
  338. package/dist/engine/spec-versioning/merger.js.map +1 -0
  339. package/dist/engine/spec-versioning/version-store.d.ts +18 -0
  340. package/dist/engine/spec-versioning/version-store.d.ts.map +1 -0
  341. package/dist/engine/spec-versioning/version-store.js +96 -0
  342. package/dist/engine/spec-versioning/version-store.js.map +1 -0
  343. package/dist/engine/web-fetcher/stack-advisor.d.ts.map +1 -1
  344. package/dist/engine/web-fetcher/stack-advisor.js +5 -6
  345. package/dist/engine/web-fetcher/stack-advisor.js.map +1 -1
  346. package/dist/engine/well-known/discovery.d.ts +7 -0
  347. package/dist/engine/well-known/discovery.d.ts.map +1 -0
  348. package/dist/engine/well-known/discovery.js +109 -0
  349. package/dist/engine/well-known/discovery.js.map +1 -0
  350. package/dist/engine/well-known/index.d.ts +6 -0
  351. package/dist/engine/well-known/index.d.ts.map +1 -0
  352. package/dist/engine/well-known/index.js +5 -0
  353. package/dist/engine/well-known/index.js.map +1 -0
  354. package/dist/engine/well-known/manifest-generator.d.ts +7 -0
  355. package/dist/engine/well-known/manifest-generator.d.ts.map +1 -0
  356. package/dist/engine/well-known/manifest-generator.js +60 -0
  357. package/dist/engine/well-known/manifest-generator.js.map +1 -0
  358. package/dist/engine/well-known/manifest-schema.d.ts +92 -0
  359. package/dist/engine/well-known/manifest-schema.d.ts.map +1 -0
  360. package/dist/engine/well-known/manifest-schema.js +70 -0
  361. package/dist/engine/well-known/manifest-schema.js.map +1 -0
  362. package/dist/resources/spec-granular.d.ts +33 -0
  363. package/dist/resources/spec-granular.d.ts.map +1 -0
  364. package/dist/resources/spec-granular.js +299 -0
  365. package/dist/resources/spec-granular.js.map +1 -0
  366. package/dist/storage/federation-store.d.ts +29 -0
  367. package/dist/storage/federation-store.d.ts.map +1 -0
  368. package/dist/storage/federation-store.js +111 -0
  369. package/dist/storage/federation-store.js.map +1 -0
  370. package/dist/storage/index.d.ts +3 -0
  371. package/dist/storage/index.d.ts.map +1 -1
  372. package/dist/storage/index.js +3 -0
  373. package/dist/storage/index.js.map +1 -1
  374. package/dist/storage/rbac-store.d.ts +8 -0
  375. package/dist/storage/rbac-store.d.ts.map +1 -0
  376. package/dist/storage/rbac-store.js +75 -0
  377. package/dist/storage/rbac-store.js.map +1 -0
  378. package/dist/storage/spec-observability-store.d.ts +16 -0
  379. package/dist/storage/spec-observability-store.d.ts.map +1 -0
  380. package/dist/storage/spec-observability-store.js +55 -0
  381. package/dist/storage/spec-observability-store.js.map +1 -0
  382. package/dist/tools/a2a-handler.d.ts +14 -0
  383. package/dist/tools/a2a-handler.d.ts.map +1 -0
  384. package/dist/tools/a2a-handler.js +100 -0
  385. package/dist/tools/a2a-handler.js.map +1 -0
  386. package/dist/tools/assign-role-handler.d.ts +3 -0
  387. package/dist/tools/assign-role-handler.d.ts.map +1 -0
  388. package/dist/tools/assign-role-handler.js +25 -0
  389. package/dist/tools/assign-role-handler.js.map +1 -0
  390. package/dist/tools/audit-trail-handler.d.ts +4 -0
  391. package/dist/tools/audit-trail-handler.d.ts.map +1 -0
  392. package/dist/tools/audit-trail-handler.js +91 -0
  393. package/dist/tools/audit-trail-handler.js.map +1 -0
  394. package/dist/tools/audit.js +2 -2
  395. package/dist/tools/audit.js.map +1 -1
  396. package/dist/tools/auto-update-spec.d.ts +3 -0
  397. package/dist/tools/auto-update-spec.d.ts.map +1 -0
  398. package/dist/tools/auto-update-spec.js +43 -0
  399. package/dist/tools/auto-update-spec.js.map +1 -0
  400. package/dist/tools/branch-spec.d.ts +3 -0
  401. package/dist/tools/branch-spec.d.ts.map +1 -0
  402. package/dist/tools/branch-spec.js +68 -0
  403. package/dist/tools/branch-spec.js.map +1 -0
  404. package/dist/tools/challenge-spec/platform-challenge-scenarios-b.js +1 -1
  405. package/dist/tools/challenge-spec/platform-challenge-scenarios-b.js.map +1 -1
  406. package/dist/tools/challenge-spec/platform-challenge-scenarios.js +1 -1
  407. package/dist/tools/challenge-spec/platform-challenge-scenarios.js.map +1 -1
  408. package/dist/tools/configure-auth-handler.d.ts +15 -0
  409. package/dist/tools/configure-auth-handler.d.ts.map +1 -0
  410. package/dist/tools/configure-auth-handler.js +113 -0
  411. package/dist/tools/configure-auth-handler.js.map +1 -0
  412. package/dist/tools/configure-observability.d.ts +14 -0
  413. package/dist/tools/configure-observability.d.ts.map +1 -0
  414. package/dist/tools/configure-observability.js +96 -0
  415. package/dist/tools/configure-observability.js.map +1 -0
  416. package/dist/tools/configure-roles-handler.d.ts +4 -0
  417. package/dist/tools/configure-roles-handler.d.ts.map +1 -0
  418. package/dist/tools/configure-roles-handler.js +36 -0
  419. package/dist/tools/configure-roles-handler.js.map +1 -0
  420. package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.d.ts +7 -0
  421. package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.d.ts.map +1 -0
  422. package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.js +114 -0
  423. package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.js.map +1 -0
  424. package/dist/tools/create-spec-hu/ac-adapters/database-adapter.d.ts +7 -0
  425. package/dist/tools/create-spec-hu/ac-adapters/database-adapter.d.ts.map +1 -0
  426. package/dist/tools/create-spec-hu/ac-adapters/database-adapter.js +48 -0
  427. package/dist/tools/create-spec-hu/ac-adapters/database-adapter.js.map +1 -0
  428. package/dist/tools/create-spec-hu/ac-adapters/index.d.ts +14 -0
  429. package/dist/tools/create-spec-hu/ac-adapters/index.d.ts.map +1 -0
  430. package/dist/tools/create-spec-hu/ac-adapters/index.js +28 -0
  431. package/dist/tools/create-spec-hu/ac-adapters/index.js.map +1 -0
  432. package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.d.ts +7 -0
  433. package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.d.ts.map +1 -0
  434. package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.js +99 -0
  435. package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.js.map +1 -0
  436. package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.d.ts +7 -0
  437. package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.d.ts.map +1 -0
  438. package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.js +62 -0
  439. package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.js.map +1 -0
  440. package/dist/tools/create-spec-hu/ai-testing-governance-adapter.js +4 -4
  441. package/dist/tools/create-spec-hu/ai-testing-governance-adapter.js.map +1 -1
  442. package/dist/tools/create-spec-hu/hu-body-generators.d.ts.map +1 -1
  443. package/dist/tools/create-spec-hu/hu-body-generators.js +41 -19
  444. package/dist/tools/create-spec-hu/hu-body-generators.js.map +1 -1
  445. package/dist/tools/create-spec-hu/llm-security-hu-adapter.js +1 -1
  446. package/dist/tools/create-spec-hu/llm-security-hu-adapter.js.map +1 -1
  447. package/dist/tools/create-spec-hu/quality-helpers.d.ts.map +1 -1
  448. package/dist/tools/create-spec-hu/quality-helpers.js +2 -3
  449. package/dist/tools/create-spec-hu/quality-helpers.js.map +1 -1
  450. package/dist/tools/create-spec-hu/swift-android-hu-adapter.js +1 -1
  451. package/dist/tools/create-spec-hu/swift-android-hu-adapter.js.map +1 -1
  452. package/dist/tools/create-spec-tech/ficha-content.d.ts.map +1 -1
  453. package/dist/tools/create-spec-tech/ficha-content.js +236 -6
  454. package/dist/tools/create-spec-tech/ficha-content.js.map +1 -1
  455. package/dist/tools/decompose-spec.d.ts +7 -0
  456. package/dist/tools/decompose-spec.d.ts.map +1 -0
  457. package/dist/tools/decompose-spec.js +49 -0
  458. package/dist/tools/decompose-spec.js.map +1 -0
  459. package/dist/tools/design-to-spec.d.ts +12 -0
  460. package/dist/tools/design-to-spec.d.ts.map +1 -0
  461. package/dist/tools/design-to-spec.js +73 -0
  462. package/dist/tools/design-to-spec.js.map +1 -0
  463. package/dist/tools/detect-ac-gaps.d.ts +7 -0
  464. package/dist/tools/detect-ac-gaps.d.ts.map +1 -0
  465. package/dist/tools/detect-ac-gaps.js +63 -0
  466. package/dist/tools/detect-ac-gaps.js.map +1 -0
  467. package/dist/tools/discover-registry.d.ts +8 -0
  468. package/dist/tools/discover-registry.d.ts.map +1 -0
  469. package/dist/tools/discover-registry.js +79 -0
  470. package/dist/tools/discover-registry.js.map +1 -0
  471. package/dist/tools/federate-specs.d.ts +6 -0
  472. package/dist/tools/federate-specs.d.ts.map +1 -0
  473. package/dist/tools/federate-specs.js +41 -0
  474. package/dist/tools/federate-specs.js.map +1 -0
  475. package/dist/tools/federation-status.d.ts +6 -0
  476. package/dist/tools/federation-status.d.ts.map +1 -0
  477. package/dist/tools/federation-status.js +56 -0
  478. package/dist/tools/federation-status.js.map +1 -0
  479. package/dist/tools/generate-annotations.d.ts.map +1 -1
  480. package/dist/tools/generate-annotations.js +3 -1
  481. package/dist/tools/generate-annotations.js.map +1 -1
  482. package/dist/tools/generate-docs/agent-docs-generator.js +1 -1
  483. package/dist/tools/generate-docs/agent-docs-generator.js.map +1 -1
  484. package/dist/tools/generate-infrastructure.d.ts +3 -0
  485. package/dist/tools/generate-infrastructure.d.ts.map +1 -0
  486. package/dist/tools/generate-infrastructure.js +60 -0
  487. package/dist/tools/generate-infrastructure.js.map +1 -0
  488. package/dist/tools/generate-tests/generators/advanced-testing-generator.d.ts.map +1 -1
  489. package/dist/tools/generate-tests/generators/advanced-testing-generator.js +5 -4
  490. package/dist/tools/generate-tests/generators/advanced-testing-generator.js.map +1 -1
  491. package/dist/tools/merge-spec-branch.d.ts +3 -0
  492. package/dist/tools/merge-spec-branch.d.ts.map +1 -0
  493. package/dist/tools/merge-spec-branch.js +103 -0
  494. package/dist/tools/merge-spec-branch.js.map +1 -0
  495. package/dist/tools/publish-registry.d.ts +8 -0
  496. package/dist/tools/publish-registry.d.ts.map +1 -0
  497. package/dist/tools/publish-registry.js +76 -0
  498. package/dist/tools/publish-registry.js.map +1 -0
  499. package/dist/tools/register-a2a-tools.d.ts +3 -0
  500. package/dist/tools/register-a2a-tools.d.ts.map +1 -0
  501. package/dist/tools/register-a2a-tools.js +66 -0
  502. package/dist/tools/register-a2a-tools.js.map +1 -0
  503. package/dist/tools/register-audit-trail-tools.d.ts +3 -0
  504. package/dist/tools/register-audit-trail-tools.d.ts.map +1 -0
  505. package/dist/tools/register-audit-trail-tools.js +62 -0
  506. package/dist/tools/register-audit-trail-tools.js.map +1 -0
  507. package/dist/tools/register-decompose-tools.d.ts +3 -0
  508. package/dist/tools/register-decompose-tools.d.ts.map +1 -0
  509. package/dist/tools/register-decompose-tools.js +31 -0
  510. package/dist/tools/register-decompose-tools.js.map +1 -0
  511. package/dist/tools/register-federation-tools.d.ts +6 -0
  512. package/dist/tools/register-federation-tools.d.ts.map +1 -0
  513. package/dist/tools/register-federation-tools.js +48 -0
  514. package/dist/tools/register-federation-tools.js.map +1 -0
  515. package/dist/tools/register-infrastructure-tools.d.ts +3 -0
  516. package/dist/tools/register-infrastructure-tools.d.ts.map +1 -0
  517. package/dist/tools/register-infrastructure-tools.js +34 -0
  518. package/dist/tools/register-infrastructure-tools.js.map +1 -0
  519. package/dist/tools/register-living-spec-tools.d.ts.map +1 -1
  520. package/dist/tools/register-living-spec-tools.js +2 -8
  521. package/dist/tools/register-living-spec-tools.js.map +1 -1
  522. package/dist/tools/register-observability-tools.d.ts +3 -0
  523. package/dist/tools/register-observability-tools.d.ts.map +1 -0
  524. package/dist/tools/register-observability-tools.js +48 -0
  525. package/dist/tools/register-observability-tools.js.map +1 -0
  526. package/dist/tools/register-rbac-tools.d.ts +3 -0
  527. package/dist/tools/register-rbac-tools.d.ts.map +1 -0
  528. package/dist/tools/register-rbac-tools.js +36 -0
  529. package/dist/tools/register-rbac-tools.js.map +1 -0
  530. package/dist/tools/register-spec-observability-tools.d.ts +3 -0
  531. package/dist/tools/register-spec-observability-tools.d.ts.map +1 -0
  532. package/dist/tools/register-spec-observability-tools.js +24 -0
  533. package/dist/tools/register-spec-observability-tools.js.map +1 -0
  534. package/dist/tools/register-versioning-tools.d.ts +3 -0
  535. package/dist/tools/register-versioning-tools.d.ts.map +1 -0
  536. package/dist/tools/register-versioning-tools.js +93 -0
  537. package/dist/tools/register-versioning-tools.js.map +1 -0
  538. package/dist/tools/register-well-known-tools.d.ts +3 -0
  539. package/dist/tools/register-well-known-tools.d.ts.map +1 -0
  540. package/dist/tools/register-well-known-tools.js +36 -0
  541. package/dist/tools/register-well-known-tools.js.map +1 -0
  542. package/dist/tools/repair-spec.d.ts +9 -0
  543. package/dist/tools/repair-spec.d.ts.map +1 -0
  544. package/dist/tools/repair-spec.js +93 -0
  545. package/dist/tools/repair-spec.js.map +1 -0
  546. package/dist/tools/resolve-spec-conflict.d.ts +7 -0
  547. package/dist/tools/resolve-spec-conflict.d.ts.map +1 -0
  548. package/dist/tools/resolve-spec-conflict.js +63 -0
  549. package/dist/tools/resolve-spec-conflict.js.map +1 -0
  550. package/dist/tools/response-helpers.d.ts +42 -0
  551. package/dist/tools/response-helpers.d.ts.map +1 -1
  552. package/dist/tools/response-helpers.js +29 -0
  553. package/dist/tools/response-helpers.js.map +1 -1
  554. package/dist/tools/schemas/auth-schema.d.ts +12 -0
  555. package/dist/tools/schemas/auth-schema.d.ts.map +1 -0
  556. package/dist/tools/schemas/auth-schema.js +38 -0
  557. package/dist/tools/schemas/auth-schema.js.map +1 -0
  558. package/dist/tools/schemas/rbac.d.ts +26 -0
  559. package/dist/tools/schemas/rbac.d.ts.map +1 -0
  560. package/dist/tools/schemas/rbac.js +25 -0
  561. package/dist/tools/schemas/rbac.js.map +1 -0
  562. package/dist/tools/schemas/well-known.d.ts +12 -0
  563. package/dist/tools/schemas/well-known.d.ts.map +1 -0
  564. package/dist/tools/schemas/well-known.js +31 -0
  565. package/dist/tools/schemas/well-known.js.map +1 -0
  566. package/dist/tools/snapshot-spec-hashes.d.ts.map +1 -1
  567. package/dist/tools/snapshot-spec-hashes.js.map +1 -1
  568. package/dist/tools/spec-usage-report.d.ts +3 -0
  569. package/dist/tools/spec-usage-report.d.ts.map +1 -0
  570. package/dist/tools/spec-usage-report.js +95 -0
  571. package/dist/tools/spec-usage-report.js.map +1 -0
  572. package/dist/tools/start-hooks.d.ts.map +1 -1
  573. package/dist/tools/start-hooks.js +93 -16
  574. package/dist/tools/start-hooks.js.map +1 -1
  575. package/dist/tools/suggest-tooling/advanced-testing-catalog.d.ts.map +1 -1
  576. package/dist/tools/suggest-tooling/advanced-testing-catalog.js +8 -5
  577. package/dist/tools/suggest-tooling/advanced-testing-catalog.js.map +1 -1
  578. package/dist/tools/tool-registry.d.ts.map +1 -1
  579. package/dist/tools/tool-registry.js +2 -0
  580. package/dist/tools/tool-registry.js.map +1 -1
  581. package/dist/tools/version-spec.d.ts +3 -0
  582. package/dist/tools/version-spec.d.ts.map +1 -0
  583. package/dist/tools/version-spec.js +54 -0
  584. package/dist/tools/version-spec.js.map +1 -0
  585. package/dist/types/a2a.d.ts +125 -0
  586. package/dist/types/a2a.d.ts.map +1 -0
  587. package/dist/types/a2a.js +3 -0
  588. package/dist/types/a2a.js.map +1 -0
  589. package/dist/types/ac-gap.d.ts +57 -0
  590. package/dist/types/ac-gap.d.ts.map +1 -0
  591. package/dist/types/ac-gap.js +3 -0
  592. package/dist/types/ac-gap.js.map +1 -0
  593. package/dist/types/audit-trail.d.ts +77 -0
  594. package/dist/types/audit-trail.d.ts.map +1 -0
  595. package/dist/types/audit-trail.js +3 -0
  596. package/dist/types/audit-trail.js.map +1 -0
  597. package/dist/types/auth.d.ts +82 -0
  598. package/dist/types/auth.d.ts.map +1 -0
  599. package/dist/types/auth.js +3 -0
  600. package/dist/types/auth.js.map +1 -0
  601. package/dist/types/ci.d.ts +10 -25
  602. package/dist/types/ci.d.ts.map +1 -1
  603. package/dist/types/design-to-spec.d.ts +89 -0
  604. package/dist/types/design-to-spec.d.ts.map +1 -0
  605. package/dist/types/design-to-spec.js +3 -0
  606. package/dist/types/design-to-spec.js.map +1 -0
  607. package/dist/types/elicitation.d.ts +109 -0
  608. package/dist/types/elicitation.d.ts.map +1 -0
  609. package/dist/types/elicitation.js +3 -0
  610. package/dist/types/elicitation.js.map +1 -0
  611. package/dist/types/federation.d.ts +95 -0
  612. package/dist/types/federation.d.ts.map +1 -0
  613. package/dist/types/federation.js +3 -0
  614. package/dist/types/federation.js.map +1 -0
  615. package/dist/types/file-hooks.d.ts +8 -6
  616. package/dist/types/file-hooks.d.ts.map +1 -1
  617. package/dist/types/github.d.ts +17 -0
  618. package/dist/types/github.d.ts.map +1 -1
  619. package/dist/types/index.d.ts +16 -0
  620. package/dist/types/index.d.ts.map +1 -1
  621. package/dist/types/index.js +16 -0
  622. package/dist/types/index.js.map +1 -1
  623. package/dist/types/infrastructure.d.ts +71 -0
  624. package/dist/types/infrastructure.d.ts.map +1 -0
  625. package/dist/types/infrastructure.js +3 -0
  626. package/dist/types/infrastructure.js.map +1 -0
  627. package/dist/types/living-spec.d.ts +100 -0
  628. package/dist/types/living-spec.d.ts.map +1 -1
  629. package/dist/types/observability.d.ts +105 -0
  630. package/dist/types/observability.d.ts.map +1 -0
  631. package/dist/types/observability.js +3 -0
  632. package/dist/types/observability.js.map +1 -0
  633. package/dist/types/rbac.d.ts +51 -0
  634. package/dist/types/rbac.d.ts.map +1 -0
  635. package/dist/types/rbac.js +4 -0
  636. package/dist/types/rbac.js.map +1 -0
  637. package/dist/types/resources.d.ts +20 -0
  638. package/dist/types/resources.d.ts.map +1 -0
  639. package/dist/types/resources.js +3 -0
  640. package/dist/types/resources.js.map +1 -0
  641. package/dist/types/safe-schemas.js +1 -1
  642. package/dist/types/safe-schemas.js.map +1 -1
  643. package/dist/types/spec/repair.d.ts +33 -0
  644. package/dist/types/spec/repair.d.ts.map +1 -0
  645. package/dist/types/spec/repair.js +3 -0
  646. package/dist/types/spec/repair.js.map +1 -0
  647. package/dist/types/spec-decomposer.d.ts +108 -0
  648. package/dist/types/spec-decomposer.d.ts.map +1 -0
  649. package/dist/types/spec-decomposer.js +4 -0
  650. package/dist/types/spec-decomposer.js.map +1 -0
  651. package/dist/types/spec-observability.d.ts +71 -0
  652. package/dist/types/spec-observability.d.ts.map +1 -0
  653. package/dist/types/spec-observability.js +4 -0
  654. package/dist/types/spec-observability.js.map +1 -0
  655. package/dist/types/spec-versioning.d.ts +117 -0
  656. package/dist/types/spec-versioning.d.ts.map +1 -0
  657. package/dist/types/spec-versioning.js +3 -0
  658. package/dist/types/spec-versioning.js.map +1 -0
  659. package/dist/types/well-known.d.ts +70 -0
  660. package/dist/types/well-known.d.ts.map +1 -0
  661. package/dist/types/well-known.js +3 -0
  662. package/dist/types/well-known.js.map +1 -0
  663. package/package.json +1 -1
  664. package/src/config/license-plans.json +16 -1
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Attempt to read the content of a spec file from disk.
3
+ * Returns null when specPath is undefined, the file does not exist, or a read
4
+ * error occurs. Callers should substitute a placeholder when null is returned.
5
+ */
6
+ export declare function readSpecContent(specPath: string | undefined): Promise<string | null>;
7
+ //# sourceMappingURL=spec-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-reader.d.ts","sourceRoot":"","sources":["../../src/engine/spec-reader.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAY1F"}
@@ -0,0 +1,23 @@
1
+ // engine/spec-reader.ts — Shared helper for reading spec file content from disk
2
+ import { existsSync } from 'node:fs';
3
+ import { readFile } from 'node:fs/promises';
4
+ /**
5
+ * Attempt to read the content of a spec file from disk.
6
+ * Returns null when specPath is undefined, the file does not exist, or a read
7
+ * error occurs. Callers should substitute a placeholder when null is returned.
8
+ */
9
+ export async function readSpecContent(specPath) {
10
+ if (specPath === undefined) {
11
+ return null;
12
+ }
13
+ try {
14
+ if (existsSync(specPath)) {
15
+ return await readFile(specPath, 'utf-8');
16
+ }
17
+ }
18
+ catch {
19
+ // ignore filesystem errors — callers handle null
20
+ }
21
+ return null;
22
+ }
23
+ //# sourceMappingURL=spec-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-reader.js","sourceRoot":"","sources":["../../src/engine/spec-reader.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAA4B;IAChE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { RepairResult } from '../types/index.js';
2
+ /**
3
+ * Detect and optionally fix common spec problems.
4
+ *
5
+ * @param specContent - Raw markdown content of the spec.md file.
6
+ * @param dryRun - When true, detects issues but does not apply fixes.
7
+ * @returns RepairResult with all detected fixes and (if !dryRun) repaired content.
8
+ */
9
+ export declare function repairSpec(specContent: string, dryRun?: boolean): RepairResult;
10
+ //# sourceMappingURL=spec-repair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-repair.d.ts","sourceRoot":"","sources":["../../src/engine/spec-repair.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAiZjE;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,YAAY,CA2C5E"}
@@ -0,0 +1,388 @@
1
+ // engine/spec-repair.ts — Auto-detect and fix common spec problems (SPEC-164)
2
+ // Pure function module: no I/O, no side effects.
3
+ import { parseFrontmatter, updateFrontmatterField } from './frontmatter-parser.js';
4
+ // ---------------------------------------------------------------------------
5
+ // Constants
6
+ // ---------------------------------------------------------------------------
7
+ /** Required YAML frontmatter fields for a well-formed spec. */
8
+ const REQUIRED_FRONTMATTER_FIELDS = ['id', 'title', 'type', 'status'];
9
+ /** Vague phrases that indicate an untestable acceptance criterion. */
10
+ const VAGUE_AC_PATTERNS = [
11
+ /\bshould work( well)?\b/i,
12
+ /\bworks? correctly\b/i,
13
+ /\bworks? (as expected|properly|fine)\b/i,
14
+ /\bfunctions? (correctly|properly|well)\b/i,
15
+ /\bis (fast|quick|efficient|smooth)\b/i,
16
+ /\buser.?friendly\b/i,
17
+ /\beasy to use\b/i,
18
+ /\bgood (performance|ux|experience)\b/i,
19
+ /\bsomething\b/i,
20
+ /\betc\.?\b/i,
21
+ ];
22
+ /** Required markdown sections for a complete spec. */
23
+ const REQUIRED_SECTIONS = ['## Acceptance Criteria', '## Description'];
24
+ /**
25
+ * Tag keywords mapped to tag suggestions.
26
+ * Each keyword is matched as a whole word (word boundary) in the spec content.
27
+ */
28
+ const TAG_KEYWORD_MAP = [
29
+ { pattern: /\bauth(entication)?\b/i, tag: 'authentication' },
30
+ { pattern: /\blogin\b/i, tag: 'authentication' },
31
+ { pattern: /\boauth\b/i, tag: 'authentication' },
32
+ { pattern: /\bpayment\b/i, tag: 'billing' },
33
+ { pattern: /\bbilling\b/i, tag: 'billing' },
34
+ { pattern: /\bstripe\b/i, tag: 'billing' },
35
+ { pattern: /\bnotification\b/i, tag: 'notifications' },
36
+ { pattern: /\bdashboard\b/i, tag: 'ui' },
37
+ { pattern: /\bfrontend\b/i, tag: 'frontend' },
38
+ { pattern: /\bbackend\b/i, tag: 'backend' },
39
+ { pattern: /\bapi\b/i, tag: 'api' },
40
+ { pattern: /\bdatabase\b/i, tag: 'database' },
41
+ { pattern: /\bmigration\b/i, tag: 'migration' },
42
+ { pattern: /\bsecurity\b/i, tag: 'security' },
43
+ { pattern: /\baudit\b/i, tag: 'security' },
44
+ { pattern: /\bperformance\b/i, tag: 'performance' },
45
+ { pattern: /\bcache\b/i, tag: 'performance' },
46
+ { pattern: /\bci\/cd\b|\bpipeline\b/i, tag: 'ci' },
47
+ { pattern: /\bdocker\b/i, tag: 'devops' },
48
+ { pattern: /\bdeploy(ment)?\b/i, tag: 'devops' },
49
+ ];
50
+ // ---------------------------------------------------------------------------
51
+ // Helpers
52
+ // ---------------------------------------------------------------------------
53
+ /**
54
+ * Find 1-based line number of the first line that matches a string pattern.
55
+ * Returns 0 if not found.
56
+ */
57
+ function findLineNumber(content, search) {
58
+ const lines = content.split('\n');
59
+ for (let i = 0; i < lines.length; i++) {
60
+ if (lines[i]?.includes(search)) {
61
+ return i + 1;
62
+ }
63
+ }
64
+ return 0;
65
+ }
66
+ /**
67
+ * Check whether the frontmatter block is syntactically malformed
68
+ * (missing closing `---`, or opening delimiter not on first line).
69
+ */
70
+ function detectMalformedFrontmatter(content) {
71
+ const lines = content.split('\n');
72
+ if (lines[0]?.trim() !== '---') {
73
+ return null; // No frontmatter at all — handled by missing-field checks
74
+ }
75
+ const closingIdx = lines.findIndex((l, i) => i > 0 && l.trim() === '---');
76
+ if (closingIdx === -1) {
77
+ const fix = {
78
+ type: 'frontmatter-malformed',
79
+ description: 'Frontmatter block is missing closing --- delimiter',
80
+ before: lines.slice(0, 5).join('\n'),
81
+ after: '',
82
+ line: 1,
83
+ };
84
+ return fix;
85
+ }
86
+ return null;
87
+ }
88
+ /**
89
+ * Check for missing required frontmatter fields.
90
+ * Returns one fix per missing field.
91
+ */
92
+ function detectMissingFrontmatterFields(content, parsed) {
93
+ const fixes = [];
94
+ for (const field of REQUIRED_FRONTMATTER_FIELDS) {
95
+ if (parsed.metadata[field] === undefined || parsed.metadata[field] === null) {
96
+ fixes.push({
97
+ type: 'frontmatter-missing-field',
98
+ description: `Required frontmatter field "${field}" is missing`,
99
+ before: '',
100
+ after: `${field}: (fill in)`,
101
+ line: findLineNumber(content, '---'),
102
+ });
103
+ }
104
+ }
105
+ return fixes;
106
+ }
107
+ /**
108
+ * Detect acceptance criteria lines that use vague/untestable language.
109
+ * Matches checkbox lines (`- [ ]`) containing vague patterns.
110
+ */
111
+ function detectVagueAcs(content) {
112
+ const fixes = [];
113
+ const lines = content.split('\n');
114
+ for (let i = 0; i < lines.length; i++) {
115
+ const line = lines[i] ?? '';
116
+ const isAcLine = /^\s*-\s*\[[ x]\]\s+/i.test(line);
117
+ if (!isAcLine) {
118
+ continue;
119
+ }
120
+ for (const pattern of VAGUE_AC_PATTERNS) {
121
+ if (pattern.test(line)) {
122
+ const trimmed = line.trim();
123
+ const rewritten = trimmed.replace(/^(-\s*\[[ x]\]\s*)/i, '$1[REWRITE] Given <context>, when <action>, then <measurable outcome> — ');
124
+ fixes.push({
125
+ type: 'ac-vague',
126
+ description: `Acceptance criterion on line ${String(i + 1)} uses vague language ("${pattern.source}")`,
127
+ before: trimmed,
128
+ after: rewritten,
129
+ line: i + 1,
130
+ });
131
+ break; // One fix per line
132
+ }
133
+ }
134
+ }
135
+ return fixes;
136
+ }
137
+ /**
138
+ * Detect missing required markdown sections.
139
+ */
140
+ function detectMissingSections(content) {
141
+ const fixes = [];
142
+ for (const section of REQUIRED_SECTIONS) {
143
+ if (!content.includes(section)) {
144
+ fixes.push({
145
+ type: 'section-missing',
146
+ description: `Required section "${section}" is missing from the spec`,
147
+ before: '',
148
+ after: `${section}\n\n(Add content here)\n`,
149
+ line: 0,
150
+ });
151
+ }
152
+ }
153
+ return fixes;
154
+ }
155
+ /**
156
+ * Extract array values from a frontmatter field that may have hyphenated keys.
157
+ * Reads directly from the raw content because the frontmatter parser's KV regex
158
+ * only supports \w+ keys (no hyphens).
159
+ */
160
+ function extractFrontmatterArray(content, field) {
161
+ const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n/;
162
+ const match = FRONTMATTER_RE.exec(content);
163
+ if (!match?.[1]) {
164
+ return [];
165
+ }
166
+ const escaped = field.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
167
+ const fieldRe = new RegExp(`^${escaped}:\\s*\\[(.*)\\]`, 'm');
168
+ const fieldMatch = fieldRe.exec(match[1]);
169
+ if (!fieldMatch?.[1]) {
170
+ return [];
171
+ }
172
+ return fieldMatch[1]
173
+ .split(',')
174
+ .map((s) => s.trim().replace(/^["']|["']$/g, ''))
175
+ .filter((s) => s.length > 0);
176
+ }
177
+ /**
178
+ * Detect broken cross-references: `depends-on` or `blockedBy` values pointing
179
+ * to spec IDs that don't look like valid SPEC-NNN identifiers.
180
+ */
181
+ function detectBrokenCrossReferences(content, parsed) {
182
+ const fixes = [];
183
+ const SPEC_ID_RE = /^SPEC-\d+$/;
184
+ // Fields accessible via standard parser (no hyphens)
185
+ const standardFields = [
186
+ { field: 'blockedBy', values: parsed.metadata.blockedBy },
187
+ { field: 'dependencies', values: parsed.metadata.dependencies },
188
+ ];
189
+ for (const { field, values } of standardFields) {
190
+ if (!Array.isArray(values)) {
191
+ continue;
192
+ }
193
+ for (const v of values) {
194
+ if (typeof v === 'string' && v.length > 0 && !SPEC_ID_RE.test(v)) {
195
+ fixes.push({
196
+ type: 'cross-reference-broken',
197
+ description: `Cross-reference "${v}" in "${field}" does not match SPEC-NNN format`,
198
+ before: v,
199
+ after: 'SPEC-??? (verify or remove)',
200
+ line: findLineNumber(content, v),
201
+ });
202
+ }
203
+ }
204
+ }
205
+ // Handle hyphenated key `depends-on` via raw content parsing
206
+ const dependsOnValues = extractFrontmatterArray(content, 'depends-on');
207
+ for (const v of dependsOnValues) {
208
+ if (!SPEC_ID_RE.test(v)) {
209
+ fixes.push({
210
+ type: 'cross-reference-broken',
211
+ description: `Cross-reference "${v}" in "depends-on" does not match SPEC-NNN format`,
212
+ before: v,
213
+ after: 'SPEC-??? (verify or remove)',
214
+ line: findLineNumber(content, v),
215
+ });
216
+ }
217
+ }
218
+ return fixes;
219
+ }
220
+ /**
221
+ * Extract the searchable content for tag analysis: frontmatter + Description section only.
222
+ * Excludes Acceptance Criteria and other sections to reduce false positives.
223
+ */
224
+ function extractTagSearchContent(content) {
225
+ // Use frontmatter block + Description section only
226
+ const parts = [];
227
+ // Frontmatter
228
+ const fmMatch = /^---\n([\s\S]*?)\n---\n/.exec(content);
229
+ if (fmMatch?.[1]) {
230
+ parts.push(fmMatch[1]);
231
+ }
232
+ // Description section (up to the next ## heading)
233
+ const descMatch = /##\s+Description\n([\s\S]*?)(?=\n##\s|$)/.exec(content);
234
+ if (descMatch?.[1]) {
235
+ parts.push(descMatch[1]);
236
+ }
237
+ // Fall back to first 30 lines if no description section found
238
+ if (parts.length === 0) {
239
+ parts.push(content.split('\n').slice(0, 30).join('\n'));
240
+ }
241
+ return parts.join('\n');
242
+ }
243
+ /**
244
+ * Suggest missing tags based on content analysis.
245
+ * Returns at most one fix listing all recommended tags.
246
+ */
247
+ function detectMissingTags(content, parsed) {
248
+ const existingTags = new Set(Array.isArray(parsed.metadata.tags) ? parsed.metadata.tags : []);
249
+ const searchContent = extractTagSearchContent(content);
250
+ const recommended = [];
251
+ for (const { pattern, tag } of TAG_KEYWORD_MAP) {
252
+ if (!existingTags.has(tag) && pattern.test(searchContent) && !recommended.includes(tag)) {
253
+ recommended.push(tag);
254
+ }
255
+ }
256
+ if (recommended.length === 0) {
257
+ return [];
258
+ }
259
+ const allTags = [...existingTags, ...recommended];
260
+ const tagsStr = `[${allTags.join(', ')}]`;
261
+ return [
262
+ {
263
+ type: 'tags-missing',
264
+ description: `Suggested tags based on content analysis: ${recommended.join(', ')}`,
265
+ before: Array.isArray(parsed.metadata.tags)
266
+ ? `[${parsed.metadata.tags.join(', ')}]`
267
+ : '(none)',
268
+ after: tagsStr,
269
+ line: findLineNumber(content, 'tags:'),
270
+ },
271
+ ];
272
+ }
273
+ // ---------------------------------------------------------------------------
274
+ // Apply fixes helpers
275
+ // ---------------------------------------------------------------------------
276
+ /**
277
+ * Apply a single fix to the content string.
278
+ * Returns the updated content.
279
+ */
280
+ function applyFix(content, fix) {
281
+ switch (fix.type) {
282
+ case 'frontmatter-malformed': {
283
+ // Add closing delimiter after the last frontmatter line if missing
284
+ const lines = content.split('\n');
285
+ const startIdx = lines.findIndex((l) => l.trim() === '---');
286
+ if (startIdx === -1) {
287
+ return content;
288
+ }
289
+ // Find empty line or end of file after opening ---
290
+ let insertAt = lines.length;
291
+ for (let i = startIdx + 1; i < lines.length; i++) {
292
+ if (lines[i]?.trim() === '' && i > startIdx + 1) {
293
+ insertAt = i;
294
+ break;
295
+ }
296
+ }
297
+ lines.splice(insertAt, 0, '---');
298
+ return lines.join('\n');
299
+ }
300
+ case 'frontmatter-missing-field': {
301
+ // Extract field name from description
302
+ const match = /field "(\w+)"/.exec(fix.description);
303
+ if (!match?.[1]) {
304
+ return content;
305
+ }
306
+ return updateFrontmatterField(content, match[1], '(fill in)');
307
+ }
308
+ case 'ac-vague': {
309
+ // Replace vague AC line with the rewritten version
310
+ const lines = content.split('\n');
311
+ const lineIdx = fix.line - 1;
312
+ const currentLine = lines[lineIdx];
313
+ if (lineIdx >= 0 && lineIdx < lines.length && currentLine?.includes(fix.before)) {
314
+ lines[lineIdx] = currentLine.replace(fix.before, fix.after);
315
+ }
316
+ return lines.join('\n');
317
+ }
318
+ case 'section-missing': {
319
+ // Append missing section before the last heading or at end
320
+ if (content.trimEnd().endsWith('\n')) {
321
+ return `${content}${fix.after}`;
322
+ }
323
+ return `${content}\n\n${fix.after}`;
324
+ }
325
+ case 'cross-reference-broken': {
326
+ // Cannot auto-fix — user must verify the referenced spec ID
327
+ return content;
328
+ }
329
+ case 'tags-missing': {
330
+ // Update tags in frontmatter
331
+ return updateFrontmatterField(content, 'tags', fix.after);
332
+ }
333
+ case 'ac-format': {
334
+ // Cannot auto-fix ac-format issues automatically
335
+ return content;
336
+ }
337
+ }
338
+ }
339
+ // ---------------------------------------------------------------------------
340
+ // Public API
341
+ // ---------------------------------------------------------------------------
342
+ /**
343
+ * Detect and optionally fix common spec problems.
344
+ *
345
+ * @param specContent - Raw markdown content of the spec.md file.
346
+ * @param dryRun - When true, detects issues but does not apply fixes.
347
+ * @returns RepairResult with all detected fixes and (if !dryRun) repaired content.
348
+ */
349
+ export function repairSpec(specContent, dryRun = false) {
350
+ const parsed = parseFrontmatter(specContent);
351
+ const malformedFix = detectMalformedFrontmatter(specContent);
352
+ const fixes = [
353
+ ...(malformedFix ? [malformedFix] : []),
354
+ ...detectMissingFrontmatterFields(specContent, parsed),
355
+ ...detectVagueAcs(specContent),
356
+ ...detectMissingSections(specContent),
357
+ ...detectBrokenCrossReferences(specContent, parsed),
358
+ ...detectMissingTags(specContent, parsed),
359
+ ];
360
+ if (dryRun || fixes.length === 0) {
361
+ return {
362
+ fixes,
363
+ repairedContent: specContent,
364
+ fixCount: fixes.length,
365
+ dryRun,
366
+ };
367
+ }
368
+ // Apply fixes sequentially — skip cross-reference-broken (manual fix required)
369
+ let repaired = specContent;
370
+ let applied = 0;
371
+ for (const fix of fixes) {
372
+ if (fix.type === 'cross-reference-broken') {
373
+ continue; // Cannot auto-fix
374
+ }
375
+ const before = repaired;
376
+ repaired = applyFix(repaired, fix);
377
+ if (repaired !== before) {
378
+ applied++;
379
+ }
380
+ }
381
+ return {
382
+ fixes,
383
+ repairedContent: repaired,
384
+ fixCount: applied,
385
+ dryRun: false,
386
+ };
387
+ }
388
+ //# sourceMappingURL=spec-repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-repair.js","sourceRoot":"","sources":["../../src/engine/spec-repair.ts"],"names":[],"mappings":"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"}
@@ -253,7 +253,7 @@ function getInlineScript() {
253
253
  });
254
254
  if (search) search.placeholder = lang === 'es' ? 'Buscar specs\\u2026' : 'Search specs\\u2026';
255
255
  langBtns.forEach(function(b) { b.classList.toggle('active', b.dataset.lang === lang); });
256
- try { localStorage.setItem('planu-lang', lang); } catch(e) {}
256
+ try { localStorage.setItem('planu-lang', lang); } catch(e) { /* localStorage unavailable in private browsing — ignore */ }
257
257
  applyFilters();
258
258
  }
259
259
 
@@ -272,7 +272,7 @@ function getInlineScript() {
272
272
  });
273
273
 
274
274
  var saved = null;
275
- try { saved = localStorage.getItem('planu-lang'); } catch(e) {}
275
+ try { saved = localStorage.getItem('planu-lang'); } catch(e) { /* localStorage unavailable in private browsing — ignore */ }
276
276
  var autoLang = saved || (navigator.language.startsWith('es') ? 'es' : 'en');
277
277
  setLang(autoLang);
278
278
  })();`;
@@ -0,0 +1,17 @@
1
+ import type { SpecBranch, CreateSpecBranchInput } from '../../types/index.js';
2
+ /** Validate branch name: lowercase kebab-case, non-empty. */
3
+ export declare function isValidBranchName(name: string): boolean;
4
+ /** Load a branch. Returns null if not found. */
5
+ export declare function loadBranch(dataDir: string, specId: string, branchName: string): Promise<SpecBranch | null>;
6
+ /**
7
+ * Create a new spec branch.
8
+ * Throws if branch name is invalid, already exists, or fromVersion is not found.
9
+ */
10
+ export declare function createBranch(dataDir: string, input: CreateSpecBranchInput): Promise<SpecBranch>;
11
+ /** Update the content of an existing branch. Throws if not found. */
12
+ export declare function updateBranchContent(dataDir: string, specId: string, branchName: string, newContent: string): Promise<SpecBranch>;
13
+ /** List all branches for a spec. Returns empty array if none found. */
14
+ export declare function listBranches(dataDir: string, specId: string): Promise<SpecBranch[]>;
15
+ /** Delete a branch after a successful merge. Returns true if deleted, false if not found. */
16
+ export declare function deleteBranch(dataDir: string, specId: string, branchName: string): Promise<boolean>;
17
+ //# sourceMappingURL=brancher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brancher.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-versioning/brancher.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAe9E,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,gDAAgD;AAChD,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ5B;AAYD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,UAAU,CAAC,CA6BrB;AAED,qEAAqE;AACrE,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED,uEAAuE;AACvE,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA0BzF;AAED,6FAA6F;AAC7F,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAQlB"}
@@ -0,0 +1,113 @@
1
+ // engine/spec-versioning/brancher.ts — Create, list, and delete spec branches
2
+ import { readFile, writeFile, mkdir, unlink } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { existsSync } from 'node:fs';
5
+ import { getVersionsDir, getLatestVersionTag } from './version-store.js';
6
+ const BRANCHES_SUBDIR = 'branches';
7
+ /** Build the path to a branch JSON file. */
8
+ function getBranchFilePath(dataDir, specId, branchName) {
9
+ return join(getVersionsDir(dataDir, specId), BRANCHES_SUBDIR, `${branchName}.json`);
10
+ }
11
+ /** Build the branches directory for a spec. */
12
+ function getBranchesDir(dataDir, specId) {
13
+ return join(getVersionsDir(dataDir, specId), BRANCHES_SUBDIR);
14
+ }
15
+ /** Validate branch name: lowercase kebab-case, non-empty. */
16
+ export function isValidBranchName(name) {
17
+ return /^[a-z][a-z0-9-]*$/.test(name) && name.length <= 100;
18
+ }
19
+ /** Load a branch. Returns null if not found. */
20
+ export async function loadBranch(dataDir, specId, branchName) {
21
+ const filePath = getBranchFilePath(dataDir, specId, branchName);
22
+ try {
23
+ const raw = await readFile(filePath, 'utf-8');
24
+ return JSON.parse(raw);
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ /** Persist a branch to disk. Creates directories as needed. */
31
+ async function saveBranch(dataDir, branch) {
32
+ const dir = getBranchesDir(dataDir, branch.specId);
33
+ if (!existsSync(dir)) {
34
+ await mkdir(dir, { recursive: true });
35
+ }
36
+ const filePath = getBranchFilePath(dataDir, branch.specId, branch.name);
37
+ await writeFile(filePath, JSON.stringify(branch, null, 2), 'utf-8');
38
+ }
39
+ /**
40
+ * Create a new spec branch.
41
+ * Throws if branch name is invalid, already exists, or fromVersion is not found.
42
+ */
43
+ export async function createBranch(dataDir, input) {
44
+ const { specId, branchName, content } = input;
45
+ if (!isValidBranchName(branchName)) {
46
+ throw new Error(`Invalid branch name "${branchName}". Use lowercase kebab-case (e.g., "auth-refactor").`);
47
+ }
48
+ const existing = await loadBranch(dataDir, specId, branchName);
49
+ if (existing !== null) {
50
+ throw new Error(`Branch "${branchName}" already exists for spec ${specId}. Choose a different name.`);
51
+ }
52
+ const fromVersion = input.fromVersion ?? (await getLatestVersionTag(dataDir, specId)) ?? 'unversioned';
53
+ const branch = {
54
+ name: branchName,
55
+ specId,
56
+ createdAt: new Date().toISOString(),
57
+ fromVersion,
58
+ content,
59
+ };
60
+ await saveBranch(dataDir, branch);
61
+ return branch;
62
+ }
63
+ /** Update the content of an existing branch. Throws if not found. */
64
+ export async function updateBranchContent(dataDir, specId, branchName, newContent) {
65
+ const existing = await loadBranch(dataDir, specId, branchName);
66
+ if (existing === null) {
67
+ throw new Error(`Branch "${branchName}" not found for spec ${specId}.`);
68
+ }
69
+ const updated = { ...existing, content: newContent };
70
+ await saveBranch(dataDir, updated);
71
+ return updated;
72
+ }
73
+ /** List all branches for a spec. Returns empty array if none found. */
74
+ export async function listBranches(dataDir, specId) {
75
+ const { readdir } = await import('node:fs/promises');
76
+ const dir = getBranchesDir(dataDir, specId);
77
+ if (!existsSync(dir)) {
78
+ return [];
79
+ }
80
+ try {
81
+ const files = await readdir(dir);
82
+ const branches = [];
83
+ for (const file of files) {
84
+ if (!file.endsWith('.json')) {
85
+ continue;
86
+ }
87
+ const filePath = join(dir, file);
88
+ try {
89
+ const raw = await readFile(filePath, 'utf-8');
90
+ branches.push(JSON.parse(raw));
91
+ }
92
+ catch {
93
+ // Skip corrupt files
94
+ }
95
+ }
96
+ return branches.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
97
+ }
98
+ catch {
99
+ return [];
100
+ }
101
+ }
102
+ /** Delete a branch after a successful merge. Returns true if deleted, false if not found. */
103
+ export async function deleteBranch(dataDir, specId, branchName) {
104
+ const filePath = getBranchFilePath(dataDir, specId, branchName);
105
+ try {
106
+ await unlink(filePath);
107
+ return true;
108
+ }
109
+ catch {
110
+ return false;
111
+ }
112
+ }
113
+ //# sourceMappingURL=brancher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brancher.js","sourceRoot":"","sources":["../../../src/engine/spec-versioning/brancher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { SpecVersionDiff } from '../../types/index.js';
2
+ import { extractAcceptanceCriteria } from '../shared/ac-extractor.js';
3
+ import { computeLineDiff } from '../shared/line-diff.js';
4
+ export { extractAcceptanceCriteria, computeLineDiff };
5
+ /** Compute AC-level diff between two sets of criteria. */
6
+ export declare function computeAcDiff(fromCriteria: string[], toCriteria: string[]): SpecVersionDiff['criteriaChanges'];
7
+ /** Detect which sections changed between two spec contents. */
8
+ export declare function detectSectionChanges(fromContent: string, toContent: string): string[];
9
+ /**
10
+ * Diff two spec versions stored on disk.
11
+ * Throws if either version tag is not found.
12
+ */
13
+ export declare function diffVersions(dataDir: string, specId: string, fromTag: string, toTag: string): Promise<SpecVersionDiff>;
14
+ /**
15
+ * Diff two spec content strings directly (no disk lookup).
16
+ * Used before merging to show what will change.
17
+ */
18
+ export declare function diffContents(specId: string, fromTag: string, toTag: string, fromContent: string, toContent: string): SpecVersionDiff;
19
+ //# sourceMappingURL=differ.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"differ.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-versioning/differ.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,CAAC;AAUtD,0DAA0D;AAC1D,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EAAE,EACtB,UAAU,EAAE,MAAM,EAAE,GACnB,eAAe,CAAC,iBAAiB,CAAC,CA8BpC;AAmDD,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBrF;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CA8B1B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,eAAe,CAgBjB"}