@planu/cli 0.63.7 → 0.64.1

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 (647) 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/architecture-pattern-detector/actor-temporal-detector.d.ts.map +1 -1
  43. package/dist/engine/architecture-pattern-detector/actor-temporal-detector.js +2 -0
  44. package/dist/engine/architecture-pattern-detector/actor-temporal-detector.js.map +1 -1
  45. package/dist/engine/audit-trail/attestation.d.ts +11 -0
  46. package/dist/engine/audit-trail/attestation.d.ts.map +1 -0
  47. package/dist/engine/audit-trail/attestation.js +47 -0
  48. package/dist/engine/audit-trail/attestation.js.map +1 -0
  49. package/dist/engine/audit-trail/index.d.ts +6 -0
  50. package/dist/engine/audit-trail/index.d.ts.map +1 -0
  51. package/dist/engine/audit-trail/index.js +6 -0
  52. package/dist/engine/audit-trail/index.js.map +1 -0
  53. package/dist/engine/audit-trail/logger.d.ts +17 -0
  54. package/dist/engine/audit-trail/logger.d.ts.map +1 -0
  55. package/dist/engine/audit-trail/logger.js +78 -0
  56. package/dist/engine/audit-trail/logger.js.map +1 -0
  57. package/dist/engine/audit-trail/query.d.ts +7 -0
  58. package/dist/engine/audit-trail/query.d.ts.map +1 -0
  59. package/dist/engine/audit-trail/query.js +61 -0
  60. package/dist/engine/audit-trail/query.js.map +1 -0
  61. package/dist/engine/audit-trail/utils.d.ts +18 -0
  62. package/dist/engine/audit-trail/utils.d.ts.map +1 -0
  63. package/dist/engine/audit-trail/utils.js +44 -0
  64. package/dist/engine/audit-trail/utils.js.map +1 -0
  65. package/dist/engine/audit-trail/verifier.d.ts +10 -0
  66. package/dist/engine/audit-trail/verifier.d.ts.map +1 -0
  67. package/dist/engine/audit-trail/verifier.js +78 -0
  68. package/dist/engine/audit-trail/verifier.js.map +1 -0
  69. package/dist/engine/auditor-architecture.d.ts.map +1 -1
  70. package/dist/engine/auditor-architecture.js +16 -13
  71. package/dist/engine/auditor-architecture.js.map +1 -1
  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/clarify/contradictions.d.ts.map +1 -1
  104. package/dist/engine/clarify/contradictions.js +4 -1
  105. package/dist/engine/clarify/contradictions.js.map +1 -1
  106. package/dist/engine/design-to-spec/ac-generator.d.ts +21 -0
  107. package/dist/engine/design-to-spec/ac-generator.d.ts.map +1 -0
  108. package/dist/engine/design-to-spec/ac-generator.js +185 -0
  109. package/dist/engine/design-to-spec/ac-generator.js.map +1 -0
  110. package/dist/engine/design-to-spec/index.d.ts +11 -0
  111. package/dist/engine/design-to-spec/index.d.ts.map +1 -0
  112. package/dist/engine/design-to-spec/index.js +19 -0
  113. package/dist/engine/design-to-spec/index.js.map +1 -0
  114. package/dist/engine/design-to-spec/parser.d.ts +7 -0
  115. package/dist/engine/design-to-spec/parser.d.ts.map +1 -0
  116. package/dist/engine/design-to-spec/parser.js +290 -0
  117. package/dist/engine/design-to-spec/parser.js.map +1 -0
  118. package/dist/engine/design-to-spec/spec-builder.d.ts +12 -0
  119. package/dist/engine/design-to-spec/spec-builder.d.ts.map +1 -0
  120. package/dist/engine/design-to-spec/spec-builder.js +148 -0
  121. package/dist/engine/design-to-spec/spec-builder.js.map +1 -0
  122. package/dist/engine/design-to-spec/ui-contract-builder.d.ts +17 -0
  123. package/dist/engine/design-to-spec/ui-contract-builder.d.ts.map +1 -0
  124. package/dist/engine/design-to-spec/ui-contract-builder.js +175 -0
  125. package/dist/engine/design-to-spec/ui-contract-builder.js.map +1 -0
  126. package/dist/engine/detection-utils.d.ts.map +1 -1
  127. package/dist/engine/detection-utils.js +3 -0
  128. package/dist/engine/detection-utils.js.map +1 -1
  129. package/dist/engine/doc-generator/portal/decision-timeline-builder.d.ts.map +1 -1
  130. package/dist/engine/doc-generator/portal/decision-timeline-builder.js +1 -0
  131. package/dist/engine/doc-generator/portal/decision-timeline-builder.js.map +1 -1
  132. package/dist/engine/doc-generator/portal/portal-breadcrumbs.d.ts.map +1 -1
  133. package/dist/engine/doc-generator/portal/portal-breadcrumbs.js +1 -0
  134. package/dist/engine/doc-generator/portal/portal-breadcrumbs.js.map +1 -1
  135. package/dist/engine/elicitation/builder.d.ts +37 -0
  136. package/dist/engine/elicitation/builder.d.ts.map +1 -0
  137. package/dist/engine/elicitation/builder.js +115 -0
  138. package/dist/engine/elicitation/builder.js.map +1 -0
  139. package/dist/engine/elicitation/fallback.d.ts +20 -0
  140. package/dist/engine/elicitation/fallback.d.ts.map +1 -0
  141. package/dist/engine/elicitation/fallback.js +72 -0
  142. package/dist/engine/elicitation/fallback.js.map +1 -0
  143. package/dist/engine/elicitation/index.d.ts +4 -0
  144. package/dist/engine/elicitation/index.d.ts.map +1 -0
  145. package/dist/engine/elicitation/index.js +5 -0
  146. package/dist/engine/elicitation/index.js.map +1 -0
  147. package/dist/engine/elicitation/response-parser.d.ts +9 -0
  148. package/dist/engine/elicitation/response-parser.d.ts.map +1 -0
  149. package/dist/engine/elicitation/response-parser.js +163 -0
  150. package/dist/engine/elicitation/response-parser.js.map +1 -0
  151. package/dist/engine/event-schema-validator/version-utils.d.ts.map +1 -1
  152. package/dist/engine/event-schema-validator/version-utils.js +1 -0
  153. package/dist/engine/event-schema-validator/version-utils.js.map +1 -1
  154. package/dist/engine/federation/cross-repo-resolver.d.ts +21 -0
  155. package/dist/engine/federation/cross-repo-resolver.d.ts.map +1 -0
  156. package/dist/engine/federation/cross-repo-resolver.js +75 -0
  157. package/dist/engine/federation/cross-repo-resolver.js.map +1 -0
  158. package/dist/engine/federation/drift-checker.d.ts +19 -0
  159. package/dist/engine/federation/drift-checker.d.ts.map +1 -0
  160. package/dist/engine/federation/drift-checker.js +114 -0
  161. package/dist/engine/federation/drift-checker.js.map +1 -0
  162. package/dist/engine/federation/federation-store.d.ts +25 -0
  163. package/dist/engine/federation/federation-store.d.ts.map +1 -0
  164. package/dist/engine/federation/federation-store.js +58 -0
  165. package/dist/engine/federation/federation-store.js.map +1 -0
  166. package/dist/engine/federation/index.d.ts +4 -0
  167. package/dist/engine/federation/index.d.ts.map +1 -0
  168. package/dist/engine/federation/index.js +5 -0
  169. package/dist/engine/federation/index.js.map +1 -0
  170. package/dist/engine/framework-detector.js +1 -1
  171. package/dist/engine/framework-detector.js.map +1 -1
  172. package/dist/engine/github/spec-ac-analyzer.d.ts +40 -0
  173. package/dist/engine/github/spec-ac-analyzer.d.ts.map +1 -0
  174. package/dist/engine/github/spec-ac-analyzer.js +181 -0
  175. package/dist/engine/github/spec-ac-analyzer.js.map +1 -0
  176. package/dist/engine/hooks/handlers/on-impl-change.d.ts +3 -1
  177. package/dist/engine/hooks/handlers/on-impl-change.d.ts.map +1 -1
  178. package/dist/engine/hooks/handlers/on-impl-change.js +25 -1
  179. package/dist/engine/hooks/handlers/on-impl-change.js.map +1 -1
  180. package/dist/engine/infrastructure/component-mapper.d.ts +9 -0
  181. package/dist/engine/infrastructure/component-mapper.d.ts.map +1 -0
  182. package/dist/engine/infrastructure/component-mapper.js +162 -0
  183. package/dist/engine/infrastructure/component-mapper.js.map +1 -0
  184. package/dist/engine/infrastructure/cost-estimator.d.ts +6 -0
  185. package/dist/engine/infrastructure/cost-estimator.d.ts.map +1 -0
  186. package/dist/engine/infrastructure/cost-estimator.js +48 -0
  187. package/dist/engine/infrastructure/cost-estimator.js.map +1 -0
  188. package/dist/engine/infrastructure/docker-compose-generator.d.ts +6 -0
  189. package/dist/engine/infrastructure/docker-compose-generator.d.ts.map +1 -0
  190. package/dist/engine/infrastructure/docker-compose-generator.js +201 -0
  191. package/dist/engine/infrastructure/docker-compose-generator.js.map +1 -0
  192. package/dist/engine/infrastructure/index.d.ts +15 -0
  193. package/dist/engine/infrastructure/index.d.ts.map +1 -0
  194. package/dist/engine/infrastructure/index.js +67 -0
  195. package/dist/engine/infrastructure/index.js.map +1 -0
  196. package/dist/engine/infrastructure/kubernetes-generator.d.ts +6 -0
  197. package/dist/engine/infrastructure/kubernetes-generator.d.ts.map +1 -0
  198. package/dist/engine/infrastructure/kubernetes-generator.js +141 -0
  199. package/dist/engine/infrastructure/kubernetes-generator.js.map +1 -0
  200. package/dist/engine/infrastructure/railway-generator.d.ts +6 -0
  201. package/dist/engine/infrastructure/railway-generator.d.ts.map +1 -0
  202. package/dist/engine/infrastructure/railway-generator.js +87 -0
  203. package/dist/engine/infrastructure/railway-generator.js.map +1 -0
  204. package/dist/engine/infrastructure/signal-detector.d.ts +7 -0
  205. package/dist/engine/infrastructure/signal-detector.d.ts.map +1 -0
  206. package/dist/engine/infrastructure/signal-detector.js +174 -0
  207. package/dist/engine/infrastructure/signal-detector.js.map +1 -0
  208. package/dist/engine/infrastructure/terraform-generator.d.ts +6 -0
  209. package/dist/engine/infrastructure/terraform-generator.d.ts.map +1 -0
  210. package/dist/engine/infrastructure/terraform-generator.js +241 -0
  211. package/dist/engine/infrastructure/terraform-generator.js.map +1 -0
  212. package/dist/engine/learning-router.d.ts.map +1 -1
  213. package/dist/engine/learning-router.js +2 -0
  214. package/dist/engine/learning-router.js.map +1 -1
  215. package/dist/engine/living-spec/annotation-parser.d.ts.map +1 -1
  216. package/dist/engine/living-spec/annotation-parser.js.map +1 -1
  217. package/dist/engine/living-spec/auto-updater.d.ts +58 -0
  218. package/dist/engine/living-spec/auto-updater.d.ts.map +1 -0
  219. package/dist/engine/living-spec/auto-updater.js +311 -0
  220. package/dist/engine/living-spec/auto-updater.js.map +1 -0
  221. package/dist/engine/living-spec/conflict-resolver.d.ts +46 -0
  222. package/dist/engine/living-spec/conflict-resolver.d.ts.map +1 -0
  223. package/dist/engine/living-spec/conflict-resolver.js +301 -0
  224. package/dist/engine/living-spec/conflict-resolver.js.map +1 -0
  225. package/dist/engine/living-spec/hash-tracker.d.ts.map +1 -1
  226. package/dist/engine/living-spec/hash-tracker.js.map +1 -1
  227. package/dist/engine/living-spec/index.d.ts +1 -0
  228. package/dist/engine/living-spec/index.d.ts.map +1 -1
  229. package/dist/engine/living-spec/index.js +1 -0
  230. package/dist/engine/living-spec/index.js.map +1 -1
  231. package/dist/engine/living-spec/signature-tracker.d.ts.map +1 -1
  232. package/dist/engine/living-spec/signature-tracker.js.map +1 -1
  233. package/dist/engine/mobile-detector-android.d.ts.map +1 -1
  234. package/dist/engine/mobile-detector-android.js +6 -0
  235. package/dist/engine/mobile-detector-android.js.map +1 -1
  236. package/dist/engine/observability/config.d.ts +16 -0
  237. package/dist/engine/observability/config.d.ts.map +1 -0
  238. package/dist/engine/observability/config.js +44 -0
  239. package/dist/engine/observability/config.js.map +1 -0
  240. package/dist/engine/observability/index.d.ts +7 -0
  241. package/dist/engine/observability/index.d.ts.map +1 -0
  242. package/dist/engine/observability/index.js +8 -0
  243. package/dist/engine/observability/index.js.map +1 -0
  244. package/dist/engine/observability/metrics.d.ts +12 -0
  245. package/dist/engine/observability/metrics.d.ts.map +1 -0
  246. package/dist/engine/observability/metrics.js +61 -0
  247. package/dist/engine/observability/metrics.js.map +1 -0
  248. package/dist/engine/observability/noop-tracer.d.ts +13 -0
  249. package/dist/engine/observability/noop-tracer.d.ts.map +1 -0
  250. package/dist/engine/observability/noop-tracer.js +41 -0
  251. package/dist/engine/observability/noop-tracer.js.map +1 -0
  252. package/dist/engine/observability/otel-tracer.d.ts +19 -0
  253. package/dist/engine/observability/otel-tracer.d.ts.map +1 -0
  254. package/dist/engine/observability/otel-tracer.js +134 -0
  255. package/dist/engine/observability/otel-tracer.js.map +1 -0
  256. package/dist/engine/observability/span-helpers.d.ts +28 -0
  257. package/dist/engine/observability/span-helpers.d.ts.map +1 -0
  258. package/dist/engine/observability/span-helpers.js +68 -0
  259. package/dist/engine/observability/span-helpers.js.map +1 -0
  260. package/dist/engine/observability/tracer.d.ts +26 -0
  261. package/dist/engine/observability/tracer.d.ts.map +1 -0
  262. package/dist/engine/observability/tracer.js +45 -0
  263. package/dist/engine/observability/tracer.js.map +1 -0
  264. package/dist/engine/rbac/index.d.ts +3 -0
  265. package/dist/engine/rbac/index.d.ts.map +1 -0
  266. package/dist/engine/rbac/index.js +4 -0
  267. package/dist/engine/rbac/index.js.map +1 -0
  268. package/dist/engine/rbac/permission-checker.d.ts +21 -0
  269. package/dist/engine/rbac/permission-checker.d.ts.map +1 -0
  270. package/dist/engine/rbac/permission-checker.js +74 -0
  271. package/dist/engine/rbac/permission-checker.js.map +1 -0
  272. package/dist/engine/rbac/roles.d.ts +12 -0
  273. package/dist/engine/rbac/roles.d.ts.map +1 -0
  274. package/dist/engine/rbac/roles.js +37 -0
  275. package/dist/engine/rbac/roles.js.map +1 -0
  276. package/dist/engine/reverse-engineer/orchestrator.d.ts.map +1 -1
  277. package/dist/engine/reverse-engineer/orchestrator.js +2 -0
  278. package/dist/engine/reverse-engineer/orchestrator.js.map +1 -1
  279. package/dist/engine/self-improver.d.ts.map +1 -1
  280. package/dist/engine/self-improver.js +2 -0
  281. package/dist/engine/self-improver.js.map +1 -1
  282. package/dist/engine/shared/ac-extractor.d.ts +9 -0
  283. package/dist/engine/shared/ac-extractor.d.ts.map +1 -0
  284. package/dist/engine/shared/ac-extractor.js +36 -0
  285. package/dist/engine/shared/ac-extractor.js.map +1 -0
  286. package/dist/engine/shared/line-diff.d.ts +11 -0
  287. package/dist/engine/shared/line-diff.d.ts.map +1 -0
  288. package/dist/engine/shared/line-diff.js +32 -0
  289. package/dist/engine/shared/line-diff.js.map +1 -0
  290. package/dist/engine/spec-decomposer/analyzer.d.ts +18 -0
  291. package/dist/engine/spec-decomposer/analyzer.d.ts.map +1 -0
  292. package/dist/engine/spec-decomposer/analyzer.js +263 -0
  293. package/dist/engine/spec-decomposer/analyzer.js.map +1 -0
  294. package/dist/engine/spec-decomposer/file-mapper.d.ts +17 -0
  295. package/dist/engine/spec-decomposer/file-mapper.d.ts.map +1 -0
  296. package/dist/engine/spec-decomposer/file-mapper.js +96 -0
  297. package/dist/engine/spec-decomposer/file-mapper.js.map +1 -0
  298. package/dist/engine/spec-decomposer/index.d.ts +14 -0
  299. package/dist/engine/spec-decomposer/index.d.ts.map +1 -0
  300. package/dist/engine/spec-decomposer/index.js +50 -0
  301. package/dist/engine/spec-decomposer/index.js.map +1 -0
  302. package/dist/engine/spec-decomposer/ownership-resolver.d.ts +7 -0
  303. package/dist/engine/spec-decomposer/ownership-resolver.d.ts.map +1 -0
  304. package/dist/engine/spec-decomposer/ownership-resolver.js +169 -0
  305. package/dist/engine/spec-decomposer/ownership-resolver.js.map +1 -0
  306. package/dist/engine/spec-observability/index.d.ts +4 -0
  307. package/dist/engine/spec-observability/index.d.ts.map +1 -0
  308. package/dist/engine/spec-observability/index.js +4 -0
  309. package/dist/engine/spec-observability/index.js.map +1 -0
  310. package/dist/engine/spec-observability/metrics.d.ts +8 -0
  311. package/dist/engine/spec-observability/metrics.d.ts.map +1 -0
  312. package/dist/engine/spec-observability/metrics.js +116 -0
  313. package/dist/engine/spec-observability/metrics.js.map +1 -0
  314. package/dist/engine/spec-observability/tracker.d.ts +22 -0
  315. package/dist/engine/spec-observability/tracker.d.ts.map +1 -0
  316. package/dist/engine/spec-observability/tracker.js +77 -0
  317. package/dist/engine/spec-observability/tracker.js.map +1 -0
  318. package/dist/engine/spec-reader.d.ts +7 -0
  319. package/dist/engine/spec-reader.d.ts.map +1 -0
  320. package/dist/engine/spec-reader.js +23 -0
  321. package/dist/engine/spec-reader.js.map +1 -0
  322. package/dist/engine/spec-repair.d.ts +10 -0
  323. package/dist/engine/spec-repair.d.ts.map +1 -0
  324. package/dist/engine/spec-repair.js +388 -0
  325. package/dist/engine/spec-repair.js.map +1 -0
  326. package/dist/engine/spec-versioning/brancher.d.ts +17 -0
  327. package/dist/engine/spec-versioning/brancher.d.ts.map +1 -0
  328. package/dist/engine/spec-versioning/brancher.js +113 -0
  329. package/dist/engine/spec-versioning/brancher.js.map +1 -0
  330. package/dist/engine/spec-versioning/differ.d.ts +19 -0
  331. package/dist/engine/spec-versioning/differ.d.ts.map +1 -0
  332. package/dist/engine/spec-versioning/differ.js +151 -0
  333. package/dist/engine/spec-versioning/differ.js.map +1 -0
  334. package/dist/engine/spec-versioning/index.d.ts +5 -0
  335. package/dist/engine/spec-versioning/index.d.ts.map +1 -0
  336. package/dist/engine/spec-versioning/index.js +6 -0
  337. package/dist/engine/spec-versioning/index.js.map +1 -0
  338. package/dist/engine/spec-versioning/merger.d.ts +18 -0
  339. package/dist/engine/spec-versioning/merger.d.ts.map +1 -0
  340. package/dist/engine/spec-versioning/merger.js +113 -0
  341. package/dist/engine/spec-versioning/merger.js.map +1 -0
  342. package/dist/engine/spec-versioning/version-store.d.ts +18 -0
  343. package/dist/engine/spec-versioning/version-store.d.ts.map +1 -0
  344. package/dist/engine/spec-versioning/version-store.js +96 -0
  345. package/dist/engine/spec-versioning/version-store.js.map +1 -0
  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/analyze-spec-dependencies.d.ts.map +1 -1
  387. package/dist/tools/analyze-spec-dependencies.js +1 -0
  388. package/dist/tools/analyze-spec-dependencies.js.map +1 -1
  389. package/dist/tools/assign-role-handler.d.ts +3 -0
  390. package/dist/tools/assign-role-handler.d.ts.map +1 -0
  391. package/dist/tools/assign-role-handler.js +25 -0
  392. package/dist/tools/assign-role-handler.js.map +1 -0
  393. package/dist/tools/audit-trail-handler.d.ts +4 -0
  394. package/dist/tools/audit-trail-handler.d.ts.map +1 -0
  395. package/dist/tools/audit-trail-handler.js +91 -0
  396. package/dist/tools/audit-trail-handler.js.map +1 -0
  397. package/dist/tools/auto-update-spec.d.ts +3 -0
  398. package/dist/tools/auto-update-spec.d.ts.map +1 -0
  399. package/dist/tools/auto-update-spec.js +43 -0
  400. package/dist/tools/auto-update-spec.js.map +1 -0
  401. package/dist/tools/branch-spec.d.ts +3 -0
  402. package/dist/tools/branch-spec.d.ts.map +1 -0
  403. package/dist/tools/branch-spec.js +68 -0
  404. package/dist/tools/branch-spec.js.map +1 -0
  405. package/dist/tools/configure-auth-handler.d.ts +15 -0
  406. package/dist/tools/configure-auth-handler.d.ts.map +1 -0
  407. package/dist/tools/configure-auth-handler.js +113 -0
  408. package/dist/tools/configure-auth-handler.js.map +1 -0
  409. package/dist/tools/configure-observability.d.ts +14 -0
  410. package/dist/tools/configure-observability.d.ts.map +1 -0
  411. package/dist/tools/configure-observability.js +96 -0
  412. package/dist/tools/configure-observability.js.map +1 -0
  413. package/dist/tools/configure-roles-handler.d.ts +4 -0
  414. package/dist/tools/configure-roles-handler.d.ts.map +1 -0
  415. package/dist/tools/configure-roles-handler.js +36 -0
  416. package/dist/tools/configure-roles-handler.js.map +1 -0
  417. package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.d.ts +7 -0
  418. package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.d.ts.map +1 -0
  419. package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.js +114 -0
  420. package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.js.map +1 -0
  421. package/dist/tools/create-spec-hu/ac-adapters/database-adapter.d.ts +7 -0
  422. package/dist/tools/create-spec-hu/ac-adapters/database-adapter.d.ts.map +1 -0
  423. package/dist/tools/create-spec-hu/ac-adapters/database-adapter.js +48 -0
  424. package/dist/tools/create-spec-hu/ac-adapters/database-adapter.js.map +1 -0
  425. package/dist/tools/create-spec-hu/ac-adapters/index.d.ts +14 -0
  426. package/dist/tools/create-spec-hu/ac-adapters/index.d.ts.map +1 -0
  427. package/dist/tools/create-spec-hu/ac-adapters/index.js +28 -0
  428. package/dist/tools/create-spec-hu/ac-adapters/index.js.map +1 -0
  429. package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.d.ts +7 -0
  430. package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.d.ts.map +1 -0
  431. package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.js +99 -0
  432. package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.js.map +1 -0
  433. package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.d.ts +7 -0
  434. package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.d.ts.map +1 -0
  435. package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.js +62 -0
  436. package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.js.map +1 -0
  437. package/dist/tools/create-spec-hu/hu-body-generators.d.ts.map +1 -1
  438. package/dist/tools/create-spec-hu/hu-body-generators.js +41 -19
  439. package/dist/tools/create-spec-hu/hu-body-generators.js.map +1 -1
  440. package/dist/tools/create-spec-tech/ficha-content.d.ts.map +1 -1
  441. package/dist/tools/create-spec-tech/ficha-content.js +235 -5
  442. package/dist/tools/create-spec-tech/ficha-content.js.map +1 -1
  443. package/dist/tools/decompose-spec.d.ts +7 -0
  444. package/dist/tools/decompose-spec.d.ts.map +1 -0
  445. package/dist/tools/decompose-spec.js +49 -0
  446. package/dist/tools/decompose-spec.js.map +1 -0
  447. package/dist/tools/define-ui-contract-desktop/desktop-contract.js +2 -1
  448. package/dist/tools/define-ui-contract-desktop/desktop-contract.js.map +1 -1
  449. package/dist/tools/design-to-spec.d.ts +12 -0
  450. package/dist/tools/design-to-spec.d.ts.map +1 -0
  451. package/dist/tools/design-to-spec.js +73 -0
  452. package/dist/tools/design-to-spec.js.map +1 -0
  453. package/dist/tools/detect-ac-gaps.d.ts +7 -0
  454. package/dist/tools/detect-ac-gaps.d.ts.map +1 -0
  455. package/dist/tools/detect-ac-gaps.js +63 -0
  456. package/dist/tools/detect-ac-gaps.js.map +1 -0
  457. package/dist/tools/discover-registry.d.ts +8 -0
  458. package/dist/tools/discover-registry.d.ts.map +1 -0
  459. package/dist/tools/discover-registry.js +79 -0
  460. package/dist/tools/discover-registry.js.map +1 -0
  461. package/dist/tools/federate-specs.d.ts +6 -0
  462. package/dist/tools/federate-specs.d.ts.map +1 -0
  463. package/dist/tools/federate-specs.js +41 -0
  464. package/dist/tools/federate-specs.js.map +1 -0
  465. package/dist/tools/federation-status.d.ts +6 -0
  466. package/dist/tools/federation-status.d.ts.map +1 -0
  467. package/dist/tools/federation-status.js +56 -0
  468. package/dist/tools/federation-status.js.map +1 -0
  469. package/dist/tools/generate-annotations.d.ts.map +1 -1
  470. package/dist/tools/generate-annotations.js +3 -1
  471. package/dist/tools/generate-annotations.js.map +1 -1
  472. package/dist/tools/generate-infrastructure.d.ts +3 -0
  473. package/dist/tools/generate-infrastructure.d.ts.map +1 -0
  474. package/dist/tools/generate-infrastructure.js +60 -0
  475. package/dist/tools/generate-infrastructure.js.map +1 -0
  476. package/dist/tools/manage-hooks.d.ts.map +1 -1
  477. package/dist/tools/manage-hooks.js +1 -0
  478. package/dist/tools/manage-hooks.js.map +1 -1
  479. package/dist/tools/merge-spec-branch.d.ts +3 -0
  480. package/dist/tools/merge-spec-branch.d.ts.map +1 -0
  481. package/dist/tools/merge-spec-branch.js +103 -0
  482. package/dist/tools/merge-spec-branch.js.map +1 -0
  483. package/dist/tools/publish-registry.d.ts +8 -0
  484. package/dist/tools/publish-registry.d.ts.map +1 -0
  485. package/dist/tools/publish-registry.js +76 -0
  486. package/dist/tools/publish-registry.js.map +1 -0
  487. package/dist/tools/register-a2a-tools.d.ts +3 -0
  488. package/dist/tools/register-a2a-tools.d.ts.map +1 -0
  489. package/dist/tools/register-a2a-tools.js +66 -0
  490. package/dist/tools/register-a2a-tools.js.map +1 -0
  491. package/dist/tools/register-audit-trail-tools.d.ts +3 -0
  492. package/dist/tools/register-audit-trail-tools.d.ts.map +1 -0
  493. package/dist/tools/register-audit-trail-tools.js +62 -0
  494. package/dist/tools/register-audit-trail-tools.js.map +1 -0
  495. package/dist/tools/register-decompose-tools.d.ts +3 -0
  496. package/dist/tools/register-decompose-tools.d.ts.map +1 -0
  497. package/dist/tools/register-decompose-tools.js +31 -0
  498. package/dist/tools/register-decompose-tools.js.map +1 -0
  499. package/dist/tools/register-federation-tools.d.ts +6 -0
  500. package/dist/tools/register-federation-tools.d.ts.map +1 -0
  501. package/dist/tools/register-federation-tools.js +48 -0
  502. package/dist/tools/register-federation-tools.js.map +1 -0
  503. package/dist/tools/register-infrastructure-tools.d.ts +3 -0
  504. package/dist/tools/register-infrastructure-tools.d.ts.map +1 -0
  505. package/dist/tools/register-infrastructure-tools.js +34 -0
  506. package/dist/tools/register-infrastructure-tools.js.map +1 -0
  507. package/dist/tools/register-living-spec-tools.d.ts.map +1 -1
  508. package/dist/tools/register-living-spec-tools.js +2 -8
  509. package/dist/tools/register-living-spec-tools.js.map +1 -1
  510. package/dist/tools/register-observability-tools.d.ts +3 -0
  511. package/dist/tools/register-observability-tools.d.ts.map +1 -0
  512. package/dist/tools/register-observability-tools.js +48 -0
  513. package/dist/tools/register-observability-tools.js.map +1 -0
  514. package/dist/tools/register-rbac-tools.d.ts +3 -0
  515. package/dist/tools/register-rbac-tools.d.ts.map +1 -0
  516. package/dist/tools/register-rbac-tools.js +36 -0
  517. package/dist/tools/register-rbac-tools.js.map +1 -0
  518. package/dist/tools/register-spec-observability-tools.d.ts +3 -0
  519. package/dist/tools/register-spec-observability-tools.d.ts.map +1 -0
  520. package/dist/tools/register-spec-observability-tools.js +24 -0
  521. package/dist/tools/register-spec-observability-tools.js.map +1 -0
  522. package/dist/tools/register-versioning-tools.d.ts +3 -0
  523. package/dist/tools/register-versioning-tools.d.ts.map +1 -0
  524. package/dist/tools/register-versioning-tools.js +93 -0
  525. package/dist/tools/register-versioning-tools.js.map +1 -0
  526. package/dist/tools/register-well-known-tools.d.ts +3 -0
  527. package/dist/tools/register-well-known-tools.d.ts.map +1 -0
  528. package/dist/tools/register-well-known-tools.js +36 -0
  529. package/dist/tools/register-well-known-tools.js.map +1 -0
  530. package/dist/tools/repair-spec.d.ts +9 -0
  531. package/dist/tools/repair-spec.d.ts.map +1 -0
  532. package/dist/tools/repair-spec.js +93 -0
  533. package/dist/tools/repair-spec.js.map +1 -0
  534. package/dist/tools/resolve-spec-conflict.d.ts +7 -0
  535. package/dist/tools/resolve-spec-conflict.d.ts.map +1 -0
  536. package/dist/tools/resolve-spec-conflict.js +63 -0
  537. package/dist/tools/resolve-spec-conflict.js.map +1 -0
  538. package/dist/tools/response-helpers.d.ts +42 -0
  539. package/dist/tools/response-helpers.d.ts.map +1 -1
  540. package/dist/tools/response-helpers.js +29 -0
  541. package/dist/tools/response-helpers.js.map +1 -1
  542. package/dist/tools/schemas/auth-schema.d.ts +12 -0
  543. package/dist/tools/schemas/auth-schema.d.ts.map +1 -0
  544. package/dist/tools/schemas/auth-schema.js +38 -0
  545. package/dist/tools/schemas/auth-schema.js.map +1 -0
  546. package/dist/tools/schemas/rbac.d.ts +26 -0
  547. package/dist/tools/schemas/rbac.d.ts.map +1 -0
  548. package/dist/tools/schemas/rbac.js +25 -0
  549. package/dist/tools/schemas/rbac.js.map +1 -0
  550. package/dist/tools/schemas/well-known.d.ts +12 -0
  551. package/dist/tools/schemas/well-known.d.ts.map +1 -0
  552. package/dist/tools/schemas/well-known.js +31 -0
  553. package/dist/tools/schemas/well-known.js.map +1 -0
  554. package/dist/tools/snapshot-spec-hashes.d.ts.map +1 -1
  555. package/dist/tools/snapshot-spec-hashes.js.map +1 -1
  556. package/dist/tools/spec-usage-report.d.ts +3 -0
  557. package/dist/tools/spec-usage-report.d.ts.map +1 -0
  558. package/dist/tools/spec-usage-report.js +95 -0
  559. package/dist/tools/spec-usage-report.js.map +1 -0
  560. package/dist/tools/start-hooks.d.ts.map +1 -1
  561. package/dist/tools/start-hooks.js +93 -16
  562. package/dist/tools/start-hooks.js.map +1 -1
  563. package/dist/tools/suggest-tooling/catalog-loader.d.ts.map +1 -1
  564. package/dist/tools/suggest-tooling/catalog-loader.js +1 -0
  565. package/dist/tools/suggest-tooling/catalog-loader.js.map +1 -1
  566. package/dist/tools/version-spec.d.ts +3 -0
  567. package/dist/tools/version-spec.d.ts.map +1 -0
  568. package/dist/tools/version-spec.js +54 -0
  569. package/dist/tools/version-spec.js.map +1 -0
  570. package/dist/types/a2a.d.ts +125 -0
  571. package/dist/types/a2a.d.ts.map +1 -0
  572. package/dist/types/a2a.js +3 -0
  573. package/dist/types/a2a.js.map +1 -0
  574. package/dist/types/ac-gap.d.ts +57 -0
  575. package/dist/types/ac-gap.d.ts.map +1 -0
  576. package/dist/types/ac-gap.js +3 -0
  577. package/dist/types/ac-gap.js.map +1 -0
  578. package/dist/types/audit-trail.d.ts +77 -0
  579. package/dist/types/audit-trail.d.ts.map +1 -0
  580. package/dist/types/audit-trail.js +3 -0
  581. package/dist/types/audit-trail.js.map +1 -0
  582. package/dist/types/auth.d.ts +82 -0
  583. package/dist/types/auth.d.ts.map +1 -0
  584. package/dist/types/auth.js +3 -0
  585. package/dist/types/auth.js.map +1 -0
  586. package/dist/types/ci.d.ts +10 -25
  587. package/dist/types/ci.d.ts.map +1 -1
  588. package/dist/types/design-to-spec.d.ts +89 -0
  589. package/dist/types/design-to-spec.d.ts.map +1 -0
  590. package/dist/types/design-to-spec.js +3 -0
  591. package/dist/types/design-to-spec.js.map +1 -0
  592. package/dist/types/elicitation.d.ts +109 -0
  593. package/dist/types/elicitation.d.ts.map +1 -0
  594. package/dist/types/elicitation.js +3 -0
  595. package/dist/types/elicitation.js.map +1 -0
  596. package/dist/types/federation.d.ts +95 -0
  597. package/dist/types/federation.d.ts.map +1 -0
  598. package/dist/types/federation.js +3 -0
  599. package/dist/types/federation.js.map +1 -0
  600. package/dist/types/file-hooks.d.ts +8 -6
  601. package/dist/types/file-hooks.d.ts.map +1 -1
  602. package/dist/types/github.d.ts +17 -0
  603. package/dist/types/github.d.ts.map +1 -1
  604. package/dist/types/index.d.ts +16 -0
  605. package/dist/types/index.d.ts.map +1 -1
  606. package/dist/types/index.js +16 -0
  607. package/dist/types/index.js.map +1 -1
  608. package/dist/types/infrastructure.d.ts +71 -0
  609. package/dist/types/infrastructure.d.ts.map +1 -0
  610. package/dist/types/infrastructure.js +3 -0
  611. package/dist/types/infrastructure.js.map +1 -0
  612. package/dist/types/living-spec.d.ts +100 -0
  613. package/dist/types/living-spec.d.ts.map +1 -1
  614. package/dist/types/observability.d.ts +105 -0
  615. package/dist/types/observability.d.ts.map +1 -0
  616. package/dist/types/observability.js +3 -0
  617. package/dist/types/observability.js.map +1 -0
  618. package/dist/types/rbac.d.ts +51 -0
  619. package/dist/types/rbac.d.ts.map +1 -0
  620. package/dist/types/rbac.js +4 -0
  621. package/dist/types/rbac.js.map +1 -0
  622. package/dist/types/resources.d.ts +20 -0
  623. package/dist/types/resources.d.ts.map +1 -0
  624. package/dist/types/resources.js +3 -0
  625. package/dist/types/resources.js.map +1 -0
  626. package/dist/types/spec/repair.d.ts +33 -0
  627. package/dist/types/spec/repair.d.ts.map +1 -0
  628. package/dist/types/spec/repair.js +3 -0
  629. package/dist/types/spec/repair.js.map +1 -0
  630. package/dist/types/spec-decomposer.d.ts +108 -0
  631. package/dist/types/spec-decomposer.d.ts.map +1 -0
  632. package/dist/types/spec-decomposer.js +4 -0
  633. package/dist/types/spec-decomposer.js.map +1 -0
  634. package/dist/types/spec-observability.d.ts +71 -0
  635. package/dist/types/spec-observability.d.ts.map +1 -0
  636. package/dist/types/spec-observability.js +4 -0
  637. package/dist/types/spec-observability.js.map +1 -0
  638. package/dist/types/spec-versioning.d.ts +117 -0
  639. package/dist/types/spec-versioning.d.ts.map +1 -0
  640. package/dist/types/spec-versioning.js +3 -0
  641. package/dist/types/spec-versioning.js.map +1 -0
  642. package/dist/types/well-known.d.ts +70 -0
  643. package/dist/types/well-known.d.ts.map +1 -0
  644. package/dist/types/well-known.js +3 -0
  645. package/dist/types/well-known.js.map +1 -0
  646. package/package.json +1 -1
  647. package/src/config/license-plans.json +16 -1
@@ -0,0 +1,151 @@
1
+ // engine/spec-versioning/differ.ts — Diff two spec versions at AC-level granularity
2
+ import { getVersion } from './version-store.js';
3
+ import { extractAcceptanceCriteria } from '../shared/ac-extractor.js';
4
+ import { computeLineDiff } from '../shared/line-diff.js';
5
+ export { extractAcceptanceCriteria, computeLineDiff };
6
+ /** Extract section headers from spec content. */
7
+ function extractSectionHeaders(content) {
8
+ return content
9
+ .split('\n')
10
+ .filter((line) => /^#+\s/.test(line.trim()))
11
+ .map((line) => line.trim());
12
+ }
13
+ /** Compute AC-level diff between two sets of criteria. */
14
+ export function computeAcDiff(fromCriteria, toCriteria) {
15
+ const fromSet = new Set(fromCriteria);
16
+ const toSet = new Set(toCriteria);
17
+ const added = [];
18
+ const removed = [];
19
+ const modified = [];
20
+ // Find removed and potentially modified
21
+ for (const criterion of fromCriteria) {
22
+ if (!toSet.has(criterion)) {
23
+ // Check if it was modified (high similarity match)
24
+ const similar = findSimilar(criterion, toCriteria, fromCriteria);
25
+ if (similar !== null && !fromSet.has(similar)) {
26
+ modified.push({ before: criterion, after: similar });
27
+ toSet.delete(similar); // Mark as consumed
28
+ }
29
+ else {
30
+ removed.push(criterion);
31
+ }
32
+ }
33
+ }
34
+ // Find added (those in toCriteria not matched yet)
35
+ for (const criterion of toCriteria) {
36
+ if (!fromSet.has(criterion) && !modified.some((m) => m.after === criterion)) {
37
+ added.push(criterion);
38
+ }
39
+ }
40
+ return { added, removed, modified };
41
+ }
42
+ /** Find the most similar string in a list (similarity > 0.5). Returns null if none. */
43
+ function findSimilar(target, candidates, excludeFrom) {
44
+ const excludeSet = new Set(excludeFrom);
45
+ let bestScore = 0.5; // threshold
46
+ let bestMatch = null;
47
+ for (const candidate of candidates) {
48
+ if (excludeSet.has(candidate)) {
49
+ continue;
50
+ }
51
+ const score = bigramSimilarity(target, candidate);
52
+ if (score > bestScore) {
53
+ bestScore = score;
54
+ bestMatch = candidate;
55
+ }
56
+ }
57
+ return bestMatch;
58
+ }
59
+ /** Compute bigram similarity between two strings (0–1). */
60
+ function bigramSimilarity(a, b) {
61
+ if (a === b) {
62
+ return 1;
63
+ }
64
+ if (a.length < 2 || b.length < 2) {
65
+ return 0;
66
+ }
67
+ const buildBigrams = (str) => {
68
+ const bigrams = new Set();
69
+ for (let i = 0; i < str.length - 1; i++) {
70
+ bigrams.add(str.slice(i, i + 2));
71
+ }
72
+ return bigrams;
73
+ };
74
+ const bigramsA = buildBigrams(a.toLowerCase());
75
+ const bigramsB = buildBigrams(b.toLowerCase());
76
+ let intersection = 0;
77
+ for (const bigram of bigramsA) {
78
+ if (bigramsB.has(bigram)) {
79
+ intersection++;
80
+ }
81
+ }
82
+ return (2 * intersection) / (bigramsA.size + bigramsB.size);
83
+ }
84
+ /** Detect which sections changed between two spec contents. */
85
+ export function detectSectionChanges(fromContent, toContent) {
86
+ const fromHeaders = new Set(extractSectionHeaders(fromContent));
87
+ const toHeaders = new Set(extractSectionHeaders(toContent));
88
+ const changes = [];
89
+ for (const header of toHeaders) {
90
+ if (!fromHeaders.has(header)) {
91
+ changes.push(`Added section: ${header}`);
92
+ }
93
+ }
94
+ for (const header of fromHeaders) {
95
+ if (!toHeaders.has(header)) {
96
+ changes.push(`Removed section: ${header}`);
97
+ }
98
+ }
99
+ return changes;
100
+ }
101
+ /**
102
+ * Diff two spec versions stored on disk.
103
+ * Throws if either version tag is not found.
104
+ */
105
+ export async function diffVersions(dataDir, specId, fromTag, toTag) {
106
+ const [fromVersion, toVersion] = await Promise.all([
107
+ getVersion(dataDir, specId, fromTag),
108
+ getVersion(dataDir, specId, toTag),
109
+ ]);
110
+ if (fromVersion === null) {
111
+ throw new Error(`Version "${fromTag}" not found for spec ${specId}.`);
112
+ }
113
+ if (toVersion === null) {
114
+ throw new Error(`Version "${toTag}" not found for spec ${specId}.`);
115
+ }
116
+ const { added, removed } = computeLineDiff(fromVersion.content, toVersion.content);
117
+ const fromCriteria = extractAcceptanceCriteria(fromVersion.content);
118
+ const toCriteria = extractAcceptanceCriteria(toVersion.content);
119
+ const criteriaChanges = computeAcDiff(fromCriteria, toCriteria);
120
+ const sectionChanges = detectSectionChanges(fromVersion.content, toVersion.content);
121
+ return {
122
+ fromTag,
123
+ toTag,
124
+ specId,
125
+ added,
126
+ removed,
127
+ criteriaChanges,
128
+ sectionChanges,
129
+ };
130
+ }
131
+ /**
132
+ * Diff two spec content strings directly (no disk lookup).
133
+ * Used before merging to show what will change.
134
+ */
135
+ export function diffContents(specId, fromTag, toTag, fromContent, toContent) {
136
+ const { added, removed } = computeLineDiff(fromContent, toContent);
137
+ const fromCriteria = extractAcceptanceCriteria(fromContent);
138
+ const toCriteria = extractAcceptanceCriteria(toContent);
139
+ const criteriaChanges = computeAcDiff(fromCriteria, toCriteria);
140
+ const sectionChanges = detectSectionChanges(fromContent, toContent);
141
+ return {
142
+ fromTag,
143
+ toTag,
144
+ specId,
145
+ added,
146
+ removed,
147
+ criteriaChanges,
148
+ sectionChanges,
149
+ };
150
+ }
151
+ //# sourceMappingURL=differ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"differ.js","sourceRoot":"","sources":["../../../src/engine/spec-versioning/differ.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './version-store.js';
2
+ export * from './brancher.js';
3
+ export * from './differ.js';
4
+ export * from './merger.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-versioning/index.ts"],"names":[],"mappings":"AACA,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ // engine/spec-versioning/index.ts — Barrel export for spec-versioning module
2
+ export * from './version-store.js';
3
+ export * from './brancher.js';
4
+ export * from './differ.js';
5
+ export * from './merger.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/spec-versioning/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { SpecMergeResult, SpecMergeConflict, MergeSpecBranchInput } from '../../types/index.js';
2
+ /**
3
+ * Detect merge conflicts between branch content and latest main content.
4
+ * Simple strategy: if the branch diverged from the latest version, flag it.
5
+ */
6
+ export declare function detectConflicts(baseContent: string, branchContent: string, mainContent: string): SpecMergeConflict[];
7
+ /**
8
+ * Attempt a simple auto-merge: apply branch additions to main content.
9
+ * Returns merged content or null if auto-merge is not safe.
10
+ */
11
+ export declare function autoMerge(branchContent: string, mainContent: string): string | null;
12
+ /**
13
+ * Merge a spec branch back into main.
14
+ * Creates a new version snapshot with the merged content.
15
+ * Deletes the branch on success.
16
+ */
17
+ export declare function mergeBranch(dataDir: string, input: MergeSpecBranchInput): Promise<SpecMergeResult>;
18
+ //# sourceMappingURL=merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-versioning/merger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAU9B;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,iBAAiB,EAAE,CA2BrB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASnF;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,eAAe,CAAC,CA+E1B"}
@@ -0,0 +1,113 @@
1
+ // engine/spec-versioning/merger.ts — Merge a spec branch back into main with conflict detection
2
+ import { loadBranch, deleteBranch } from './brancher.js';
3
+ import { createVersion, getLatestVersionTag, loadVersionStore, suggestNextTag, } from './version-store.js';
4
+ import { diffContents } from './differ.js';
5
+ /**
6
+ * Detect merge conflicts between branch content and latest main content.
7
+ * Simple strategy: if the branch diverged from the latest version, flag it.
8
+ */
9
+ export function detectConflicts(baseContent, branchContent, mainContent) {
10
+ const conflicts = [];
11
+ // If main content changed from the base (concurrent edit), flag it
12
+ if (mainContent !== baseContent) {
13
+ const mainLines = new Set(mainContent.split('\n'));
14
+ const branchLines = branchContent.split('\n');
15
+ const conflictingLines = [];
16
+ for (const line of branchLines) {
17
+ if (line.trim().length > 0 && !mainLines.has(line)) {
18
+ conflictingLines.push(line.trim());
19
+ }
20
+ }
21
+ if (conflictingLines.length > 0) {
22
+ conflicts.push({
23
+ type: 'concurrent_edit',
24
+ description: 'The main spec was modified after the branch was created. ' +
25
+ 'Some branch changes conflict with current main content.',
26
+ details: conflictingLines.slice(0, 10), // Show up to 10 conflicting lines
27
+ });
28
+ }
29
+ }
30
+ return conflicts;
31
+ }
32
+ /**
33
+ * Attempt a simple auto-merge: apply branch additions to main content.
34
+ * Returns merged content or null if auto-merge is not safe.
35
+ */
36
+ export function autoMerge(branchContent, mainContent) {
37
+ // Simple strategy: if main has no divergence (same as base), use branch content directly
38
+ if (branchContent === mainContent) {
39
+ return mainContent;
40
+ }
41
+ // For now, trust branch content as the resolved merge when no conflicts are critical
42
+ // A more sophisticated approach would do 3-way merge, but that requires the base content
43
+ return branchContent;
44
+ }
45
+ /**
46
+ * Merge a spec branch back into main.
47
+ * Creates a new version snapshot with the merged content.
48
+ * Deletes the branch on success.
49
+ */
50
+ export async function mergeBranch(dataDir, input) {
51
+ const { specId, branchName, message } = input;
52
+ // Load the branch
53
+ const branch = await loadBranch(dataDir, specId, branchName);
54
+ if (branch === null) {
55
+ return {
56
+ success: false,
57
+ specId,
58
+ branchName,
59
+ conflicts: [],
60
+ message: `Branch "${branchName}" not found for spec ${specId}.`,
61
+ };
62
+ }
63
+ // Load the current main spec content (latest version snapshot)
64
+ const versionStore = await loadVersionStore(dataDir, specId);
65
+ const latestSnapshot = versionStore.versions[versionStore.versions.length - 1];
66
+ const mainContent = latestSnapshot?.content ?? '';
67
+ // Determine the content to use for the merge
68
+ const resolvedContent = input.resolvedContent ?? autoMerge(branch.content, mainContent);
69
+ if (resolvedContent === null) {
70
+ return {
71
+ success: false,
72
+ specId,
73
+ branchName,
74
+ conflicts: [
75
+ {
76
+ type: 'content_diverged',
77
+ description: 'Auto-merge failed. Provide resolvedContent to complete the merge.',
78
+ details: [],
79
+ },
80
+ ],
81
+ message: 'Merge failed: could not auto-merge. Please provide resolvedContent.',
82
+ };
83
+ }
84
+ // Determine the new version tag
85
+ const latestTag = await getLatestVersionTag(dataDir, specId);
86
+ const newVersionTag = input.newVersionTag ?? suggestNextTag(latestTag);
87
+ // Create the new version snapshot
88
+ const newVersion = await createVersion(dataDir, {
89
+ projectId: input.projectId,
90
+ specId,
91
+ tag: newVersionTag,
92
+ content: resolvedContent,
93
+ message: message ?? `Merged branch "${branchName}" into main`,
94
+ author: `merge:${branchName}`,
95
+ });
96
+ // Compute diff for reporting
97
+ const diff = diffContents(specId, branch.fromVersion, newVersionTag, branch.content, resolvedContent);
98
+ // Delete the branch after successful merge
99
+ await deleteBranch(dataDir, specId, branchName);
100
+ const totalChanges = diff.criteriaChanges.added.length +
101
+ diff.criteriaChanges.removed.length +
102
+ diff.criteriaChanges.modified.length;
103
+ return {
104
+ success: true,
105
+ specId,
106
+ branchName,
107
+ newVersionTag: newVersion.tag,
108
+ conflicts: [],
109
+ message: `Merged branch "${branchName}" into spec ${specId} as version ${newVersion.tag}. ` +
110
+ `${totalChanges} AC-level change(s) detected.`,
111
+ };
112
+ }
113
+ //# sourceMappingURL=merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merger.js","sourceRoot":"","sources":["../../../src/engine/spec-versioning/merger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { SpecVersionSnapshot, SpecVersionSnapshotStore, CreateVersionSnapshotInput } from '../../types/index.js';
2
+ /** Build the storage directory for a spec's versions. */
3
+ export declare function getVersionsDir(dataDir: string, specId: string): string;
4
+ /** Load the version store for a spec. Returns empty store if not found. */
5
+ export declare function loadVersionStore(dataDir: string, specId: string): Promise<SpecVersionSnapshotStore>;
6
+ /** Validate that a tag matches semantic versioning (vMAJOR.MINOR.PATCH). */
7
+ export declare function isValidVersionTag(tag: string): boolean;
8
+ /** Create and persist a new version snapshot. Returns the created snapshot. */
9
+ export declare function createVersion(dataDir: string, input: CreateVersionSnapshotInput): Promise<SpecVersionSnapshot>;
10
+ /** Retrieve a specific snapshot by tag. Returns null if not found. */
11
+ export declare function getVersion(dataDir: string, specId: string, tag: string): Promise<SpecVersionSnapshot | null>;
12
+ /** List all snapshots for a spec, ordered from oldest to newest. */
13
+ export declare function listVersions(dataDir: string, specId: string): Promise<SpecVersionSnapshot[]>;
14
+ /** Get the latest version tag for a spec. Returns null if no versions exist. */
15
+ export declare function getLatestVersionTag(dataDir: string, specId: string): Promise<string | null>;
16
+ /** Suggest the next patch version given the current latest tag. */
17
+ export declare function suggestNextTag(latestTag: string | null): string;
18
+ //# sourceMappingURL=version-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-store.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-versioning/version-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,sBAAsB,CAAC;AAI9B,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtE;AAOD,2EAA2E;AAC3E,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,wBAAwB,CAAC,CAQnC;AAgBD,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD;AAOD,+EAA+E;AAC/E,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,mBAAmB,CAAC,CA0B9B;AAED,sEAAsE;AACtE,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAGrC;AAED,oEAAoE;AACpE,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAKhC;AAED,gFAAgF;AAChF,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOjG;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAY/D"}
@@ -0,0 +1,96 @@
1
+ // engine/spec-versioning/version-store.ts — Store and retrieve spec version snapshots
2
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { existsSync } from 'node:fs';
5
+ const VERSIONS_FILENAME = 'versions.json';
6
+ /** Build the storage directory for a spec's versions. */
7
+ export function getVersionsDir(dataDir, specId) {
8
+ return join(dataDir, 'spec-versions', specId);
9
+ }
10
+ /** Build the path to the versions.json file for a spec. */
11
+ function getVersionsFilePath(dataDir, specId) {
12
+ return join(getVersionsDir(dataDir, specId), VERSIONS_FILENAME);
13
+ }
14
+ /** Load the version store for a spec. Returns empty store if not found. */
15
+ export async function loadVersionStore(dataDir, specId) {
16
+ const filePath = getVersionsFilePath(dataDir, specId);
17
+ try {
18
+ const raw = await readFile(filePath, 'utf-8');
19
+ return JSON.parse(raw);
20
+ }
21
+ catch {
22
+ return { specId, versions: [] };
23
+ }
24
+ }
25
+ /** Persist the version store to disk. Creates directories as needed. */
26
+ async function saveVersionStore(dataDir, specId, store) {
27
+ const dir = getVersionsDir(dataDir, specId);
28
+ if (!existsSync(dir)) {
29
+ await mkdir(dir, { recursive: true });
30
+ }
31
+ const filePath = join(dir, VERSIONS_FILENAME);
32
+ await writeFile(filePath, JSON.stringify(store, null, 2), 'utf-8');
33
+ }
34
+ /** Validate that a tag matches semantic versioning (vMAJOR.MINOR.PATCH). */
35
+ export function isValidVersionTag(tag) {
36
+ return /^v\d+\.\d+\.\d+$/.test(tag);
37
+ }
38
+ /** Check if a tag already exists in the store. */
39
+ function tagExists(store, tag) {
40
+ return store.versions.some((v) => v.tag === tag);
41
+ }
42
+ /** Create and persist a new version snapshot. Returns the created snapshot. */
43
+ export async function createVersion(dataDir, input) {
44
+ const { specId, tag, content, message, author } = input;
45
+ if (!isValidVersionTag(tag)) {
46
+ throw new Error(`Invalid version tag "${tag}". Use semantic versioning format: v1.0.0, v1.1.0, v2.0.0`);
47
+ }
48
+ const store = await loadVersionStore(dataDir, specId);
49
+ if (tagExists(store, tag)) {
50
+ throw new Error(`Version "${tag}" already exists for spec ${specId}. Use a different tag.`);
51
+ }
52
+ const version = {
53
+ tag,
54
+ timestamp: new Date().toISOString(),
55
+ content,
56
+ ...(message !== undefined ? { message } : {}),
57
+ ...(author !== undefined ? { author } : {}),
58
+ };
59
+ store.versions.push(version);
60
+ await saveVersionStore(dataDir, specId, store);
61
+ return version;
62
+ }
63
+ /** Retrieve a specific snapshot by tag. Returns null if not found. */
64
+ export async function getVersion(dataDir, specId, tag) {
65
+ const store = await loadVersionStore(dataDir, specId);
66
+ return store.versions.find((v) => v.tag === tag) ?? null;
67
+ }
68
+ /** List all snapshots for a spec, ordered from oldest to newest. */
69
+ export async function listVersions(dataDir, specId) {
70
+ const store = await loadVersionStore(dataDir, specId);
71
+ return [...store.versions].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
72
+ }
73
+ /** Get the latest version tag for a spec. Returns null if no versions exist. */
74
+ export async function getLatestVersionTag(dataDir, specId) {
75
+ const versions = await listVersions(dataDir, specId);
76
+ if (versions.length === 0) {
77
+ return null;
78
+ }
79
+ const latest = versions[versions.length - 1];
80
+ return latest?.tag ?? null;
81
+ }
82
+ /** Suggest the next patch version given the current latest tag. */
83
+ export function suggestNextTag(latestTag) {
84
+ if (latestTag === null) {
85
+ return 'v1.0.0';
86
+ }
87
+ const match = /^v(\d+)\.(\d+)\.(\d+)$/.exec(latestTag);
88
+ if (!match) {
89
+ return 'v1.0.0';
90
+ }
91
+ const major = Number(match[1]);
92
+ const minor = Number(match[2]);
93
+ const patch = Number(match[3]);
94
+ return `v${major}.${minor}.${patch + 1}`;
95
+ }
96
+ //# sourceMappingURL=version-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-store.js","sourceRoot":"","sources":["../../../src/engine/spec-versioning/version-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { DiscoveryResult } from '../../types/well-known.js';
2
+ /**
3
+ * Parse and validate a .well-known/planu.json manifest from a raw JSON string.
4
+ * Returns a DiscoveryResult with the parsed manifest or validation errors.
5
+ */
6
+ export declare function parseManifest(source: string, rawJson: string): DiscoveryResult;
7
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/engine/well-known/discovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmC,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA+FlG;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAiC9E"}
@@ -0,0 +1,109 @@
1
+ // engine/well-known/discovery.ts — SPEC-162: Parse and validate a .well-known/planu.json manifest
2
+ /** Validate that a value is a non-empty string. */
3
+ function isNonEmptyString(value) {
4
+ return typeof value === 'string' && value.trim().length > 0;
5
+ }
6
+ /** Validate a single ManifestSpec entry. Returns error strings or empty array. */
7
+ function validateManifestSpec(spec, index) {
8
+ const errors = [];
9
+ const prefix = `specs[${String(index)}]`;
10
+ if (spec === null || typeof spec !== 'object') {
11
+ return [`${prefix}: must be an object`];
12
+ }
13
+ const s = spec;
14
+ if (!isNonEmptyString(s.id)) {
15
+ errors.push(`${prefix}.id: must be a non-empty string`);
16
+ }
17
+ else if (!/^SPEC-\d+$/.test(s.id)) {
18
+ errors.push(`${prefix}.id: must match pattern SPEC-NNN (e.g. SPEC-001)`);
19
+ }
20
+ if (!isNonEmptyString(s.title)) {
21
+ errors.push(`${prefix}.title: must be a non-empty string`);
22
+ }
23
+ if (!isNonEmptyString(s.status)) {
24
+ errors.push(`${prefix}.status: must be a non-empty string`);
25
+ }
26
+ if (!isNonEmptyString(s.type)) {
27
+ errors.push(`${prefix}.type: must be a non-empty string`);
28
+ }
29
+ if (typeof s.description !== 'string') {
30
+ errors.push(`${prefix}.description: must be a string`);
31
+ }
32
+ if (!Array.isArray(s.tags)) {
33
+ errors.push(`${prefix}.tags: must be an array`);
34
+ }
35
+ if (!isNonEmptyString(s.created)) {
36
+ errors.push(`${prefix}.created: must be a non-empty string`);
37
+ }
38
+ return errors;
39
+ }
40
+ /** Validate the top-level structure of a parsed manifest object. */
41
+ function validateManifestShape(raw) {
42
+ const errors = [];
43
+ if (raw === null || typeof raw !== 'object') {
44
+ return ['manifest: must be a JSON object'];
45
+ }
46
+ const m = raw;
47
+ if (m.version !== 1) {
48
+ errors.push(`version: must be 1, got ${String(m.version)}`);
49
+ }
50
+ if (!isNonEmptyString(m.name)) {
51
+ errors.push('name: must be a non-empty string');
52
+ }
53
+ if (typeof m.specCount !== 'number' || !Number.isInteger(m.specCount) || m.specCount < 0) {
54
+ errors.push('specCount: must be a non-negative integer');
55
+ }
56
+ if (!Array.isArray(m.specs)) {
57
+ errors.push('specs: must be an array');
58
+ }
59
+ else {
60
+ for (let i = 0; i < m.specs.length; i++) {
61
+ const specErrors = validateManifestSpec(m.specs[i], i);
62
+ errors.push(...specErrors);
63
+ }
64
+ }
65
+ if (!Array.isArray(m.capabilities)) {
66
+ errors.push('capabilities: must be an array');
67
+ }
68
+ else if (!m.capabilities.every((c) => typeof c === 'string')) {
69
+ errors.push('capabilities: all items must be strings');
70
+ }
71
+ if (!isNonEmptyString(m.generatedAt)) {
72
+ errors.push('generatedAt: must be a non-empty string');
73
+ }
74
+ return errors;
75
+ }
76
+ /**
77
+ * Parse and validate a .well-known/planu.json manifest from a raw JSON string.
78
+ * Returns a DiscoveryResult with the parsed manifest or validation errors.
79
+ */
80
+ export function parseManifest(source, rawJson) {
81
+ let parsed;
82
+ try {
83
+ parsed = JSON.parse(rawJson);
84
+ }
85
+ catch (err) {
86
+ const message = err instanceof Error ? err.message : String(err);
87
+ return {
88
+ valid: false,
89
+ errors: [`Failed to parse JSON: ${message}`],
90
+ source,
91
+ };
92
+ }
93
+ const errors = validateManifestShape(parsed);
94
+ if (errors.length > 0) {
95
+ return { valid: false, errors, source };
96
+ }
97
+ // Safe cast: validateManifestShape confirmed structure is correct
98
+ const m = parsed;
99
+ const manifest = {
100
+ version: 1,
101
+ name: m.name,
102
+ specCount: m.specCount,
103
+ specs: m.specs.map((s) => s),
104
+ capabilities: m.capabilities,
105
+ generatedAt: m.generatedAt,
106
+ };
107
+ return { valid: true, manifest, source };
108
+ }
109
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/engine/well-known/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { generateManifest } from './manifest-generator.js';
2
+ export type { ManifestGeneratorOptions } from '../../types/well-known.js';
3
+ export { parseManifest } from './discovery.js';
4
+ export { MANIFEST_SCHEMA_V1, KNOWN_CAPABILITIES } from './manifest-schema.js';
5
+ export type { KnownCapability } from './manifest-schema.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/well-known/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,5 @@
1
+ // engine/well-known/index.ts — SPEC-162: Barrel export for well-known engine module
2
+ export { generateManifest } from './manifest-generator.js';
3
+ export { parseManifest } from './discovery.js';
4
+ export { MANIFEST_SCHEMA_V1, KNOWN_CAPABILITIES } from './manifest-schema.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/well-known/index.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { WellKnownManifest, ManifestGeneratorOptions } from '../../types/well-known.js';
2
+ /**
3
+ * Generate a WellKnownManifest from a list of project specs.
4
+ * Filters out private/draft specs unless includePrivate is true.
5
+ */
6
+ export declare function generateManifest(options: ManifestGeneratorOptions): WellKnownManifest;
7
+ //# sourceMappingURL=manifest-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-generator.d.ts","sourceRoot":"","sources":["../../../src/engine/well-known/manifest-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EAEjB,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AAiDnC;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAkBrF"}