openlore 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (634) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +268 -0
  3. package/dist/api/analyze.d.ts +17 -0
  4. package/dist/api/analyze.d.ts.map +1 -0
  5. package/dist/api/analyze.js +143 -0
  6. package/dist/api/analyze.js.map +1 -0
  7. package/dist/api/audit.d.ts +10 -0
  8. package/dist/api/audit.d.ts.map +1 -0
  9. package/dist/api/audit.js +117 -0
  10. package/dist/api/audit.js.map +1 -0
  11. package/dist/api/decisions.d.ts +55 -0
  12. package/dist/api/decisions.d.ts.map +1 -0
  13. package/dist/api/decisions.js +157 -0
  14. package/dist/api/decisions.js.map +1 -0
  15. package/dist/api/drift.d.ts +21 -0
  16. package/dist/api/drift.d.ts.map +1 -0
  17. package/dist/api/drift.js +152 -0
  18. package/dist/api/drift.js.map +1 -0
  19. package/dist/api/generate.d.ts +18 -0
  20. package/dist/api/generate.d.ts.map +1 -0
  21. package/dist/api/generate.js +259 -0
  22. package/dist/api/generate.js.map +1 -0
  23. package/dist/api/index.d.ts +41 -0
  24. package/dist/api/index.d.ts.map +1 -0
  25. package/dist/api/index.js +34 -0
  26. package/dist/api/index.js.map +1 -0
  27. package/dist/api/init.d.ts +18 -0
  28. package/dist/api/init.d.ts.map +1 -0
  29. package/dist/api/init.js +83 -0
  30. package/dist/api/init.js.map +1 -0
  31. package/dist/api/run.d.ts +19 -0
  32. package/dist/api/run.d.ts.map +1 -0
  33. package/dist/api/run.js +312 -0
  34. package/dist/api/run.js.map +1 -0
  35. package/dist/api/specs.d.ts +49 -0
  36. package/dist/api/specs.d.ts.map +1 -0
  37. package/dist/api/specs.js +137 -0
  38. package/dist/api/specs.js.map +1 -0
  39. package/dist/api/types.d.ts +201 -0
  40. package/dist/api/types.d.ts.map +1 -0
  41. package/dist/api/types.js +9 -0
  42. package/dist/api/types.js.map +1 -0
  43. package/dist/api/verify.d.ts +20 -0
  44. package/dist/api/verify.d.ts.map +1 -0
  45. package/dist/api/verify.js +117 -0
  46. package/dist/api/verify.js.map +1 -0
  47. package/dist/cli/commands/analyze.d.ts +30 -0
  48. package/dist/cli/commands/analyze.d.ts.map +1 -0
  49. package/dist/cli/commands/analyze.js +683 -0
  50. package/dist/cli/commands/analyze.js.map +1 -0
  51. package/dist/cli/commands/audit.d.ts +9 -0
  52. package/dist/cli/commands/audit.d.ts.map +1 -0
  53. package/dist/cli/commands/audit.js +98 -0
  54. package/dist/cli/commands/audit.js.map +1 -0
  55. package/dist/cli/commands/decisions.d.ts +16 -0
  56. package/dist/cli/commands/decisions.d.ts.map +1 -0
  57. package/dist/cli/commands/decisions.js +864 -0
  58. package/dist/cli/commands/decisions.js.map +1 -0
  59. package/dist/cli/commands/digest.d.ts +9 -0
  60. package/dist/cli/commands/digest.d.ts.map +1 -0
  61. package/dist/cli/commands/digest.js +61 -0
  62. package/dist/cli/commands/digest.js.map +1 -0
  63. package/dist/cli/commands/doctor.d.ts +9 -0
  64. package/dist/cli/commands/doctor.d.ts.map +1 -0
  65. package/dist/cli/commands/doctor.js +398 -0
  66. package/dist/cli/commands/doctor.js.map +1 -0
  67. package/dist/cli/commands/drift.d.ts +9 -0
  68. package/dist/cli/commands/drift.d.ts.map +1 -0
  69. package/dist/cli/commands/drift.js +550 -0
  70. package/dist/cli/commands/drift.js.map +1 -0
  71. package/dist/cli/commands/generate.d.ts +9 -0
  72. package/dist/cli/commands/generate.d.ts.map +1 -0
  73. package/dist/cli/commands/generate.js +565 -0
  74. package/dist/cli/commands/generate.js.map +1 -0
  75. package/dist/cli/commands/init.d.ts +9 -0
  76. package/dist/cli/commands/init.d.ts.map +1 -0
  77. package/dist/cli/commands/init.js +173 -0
  78. package/dist/cli/commands/init.js.map +1 -0
  79. package/dist/cli/commands/mcp.d.ts +2235 -0
  80. package/dist/cli/commands/mcp.d.ts.map +1 -0
  81. package/dist/cli/commands/mcp.js +1384 -0
  82. package/dist/cli/commands/mcp.js.map +1 -0
  83. package/dist/cli/commands/refresh-stories.d.ts +10 -0
  84. package/dist/cli/commands/refresh-stories.d.ts.map +1 -0
  85. package/dist/cli/commands/refresh-stories.js +314 -0
  86. package/dist/cli/commands/refresh-stories.js.map +1 -0
  87. package/dist/cli/commands/run.d.ts +9 -0
  88. package/dist/cli/commands/run.d.ts.map +1 -0
  89. package/dist/cli/commands/run.js +459 -0
  90. package/dist/cli/commands/run.js.map +1 -0
  91. package/dist/cli/commands/setup.d.ts +19 -0
  92. package/dist/cli/commands/setup.d.ts.map +1 -0
  93. package/dist/cli/commands/setup.js +355 -0
  94. package/dist/cli/commands/setup.js.map +1 -0
  95. package/dist/cli/commands/test.d.ts +22 -0
  96. package/dist/cli/commands/test.d.ts.map +1 -0
  97. package/dist/cli/commands/test.js +180 -0
  98. package/dist/cli/commands/test.js.map +1 -0
  99. package/dist/cli/commands/verify.d.ts +9 -0
  100. package/dist/cli/commands/verify.d.ts.map +1 -0
  101. package/dist/cli/commands/verify.js +383 -0
  102. package/dist/cli/commands/verify.js.map +1 -0
  103. package/dist/cli/commands/view.d.ts +13 -0
  104. package/dist/cli/commands/view.d.ts.map +1 -0
  105. package/dist/cli/commands/view.js +547 -0
  106. package/dist/cli/commands/view.js.map +1 -0
  107. package/dist/cli/index.d.ts +9 -0
  108. package/dist/cli/index.d.ts.map +1 -0
  109. package/dist/cli/index.js +118 -0
  110. package/dist/cli/index.js.map +1 -0
  111. package/dist/cli/tui-approval.d.ts +11 -0
  112. package/dist/cli/tui-approval.d.ts.map +1 -0
  113. package/dist/cli/tui-approval.js +129 -0
  114. package/dist/cli/tui-approval.js.map +1 -0
  115. package/dist/constants.d.ts +314 -0
  116. package/dist/constants.d.ts.map +1 -0
  117. package/dist/constants.js +382 -0
  118. package/dist/constants.js.map +1 -0
  119. package/dist/core/analyzer/ai-config-generator.d.ts +54 -0
  120. package/dist/core/analyzer/ai-config-generator.d.ts.map +1 -0
  121. package/dist/core/analyzer/ai-config-generator.js +98 -0
  122. package/dist/core/analyzer/ai-config-generator.js.map +1 -0
  123. package/dist/core/analyzer/architecture-writer.d.ts +67 -0
  124. package/dist/core/analyzer/architecture-writer.d.ts.map +1 -0
  125. package/dist/core/analyzer/architecture-writer.js +209 -0
  126. package/dist/core/analyzer/architecture-writer.js.map +1 -0
  127. package/dist/core/analyzer/artifact-generator.d.ts +261 -0
  128. package/dist/core/analyzer/artifact-generator.d.ts.map +1 -0
  129. package/dist/core/analyzer/artifact-generator.js +909 -0
  130. package/dist/core/analyzer/artifact-generator.js.map +1 -0
  131. package/dist/core/analyzer/ast-chunker.d.ts +24 -0
  132. package/dist/core/analyzer/ast-chunker.d.ts.map +1 -0
  133. package/dist/core/analyzer/ast-chunker.js +198 -0
  134. package/dist/core/analyzer/ast-chunker.js.map +1 -0
  135. package/dist/core/analyzer/call-graph.d.ts +162 -0
  136. package/dist/core/analyzer/call-graph.d.ts.map +1 -0
  137. package/dist/core/analyzer/call-graph.js +2040 -0
  138. package/dist/core/analyzer/call-graph.js.map +1 -0
  139. package/dist/core/analyzer/code-shaper.d.ts +33 -0
  140. package/dist/core/analyzer/code-shaper.d.ts.map +1 -0
  141. package/dist/core/analyzer/code-shaper.js +154 -0
  142. package/dist/core/analyzer/code-shaper.js.map +1 -0
  143. package/dist/core/analyzer/codebase-digest.d.ts +40 -0
  144. package/dist/core/analyzer/codebase-digest.d.ts.map +1 -0
  145. package/dist/core/analyzer/codebase-digest.js +195 -0
  146. package/dist/core/analyzer/codebase-digest.js.map +1 -0
  147. package/dist/core/analyzer/cpp-header-resolver.d.ts +30 -0
  148. package/dist/core/analyzer/cpp-header-resolver.d.ts.map +1 -0
  149. package/dist/core/analyzer/cpp-header-resolver.js +71 -0
  150. package/dist/core/analyzer/cpp-header-resolver.js.map +1 -0
  151. package/dist/core/analyzer/dependency-graph.d.ts +230 -0
  152. package/dist/core/analyzer/dependency-graph.d.ts.map +1 -0
  153. package/dist/core/analyzer/dependency-graph.js +752 -0
  154. package/dist/core/analyzer/dependency-graph.js.map +1 -0
  155. package/dist/core/analyzer/duplicate-detector.d.ts +52 -0
  156. package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -0
  157. package/dist/core/analyzer/duplicate-detector.js +289 -0
  158. package/dist/core/analyzer/duplicate-detector.js.map +1 -0
  159. package/dist/core/analyzer/embedding-service.d.ts +56 -0
  160. package/dist/core/analyzer/embedding-service.d.ts.map +1 -0
  161. package/dist/core/analyzer/embedding-service.js +118 -0
  162. package/dist/core/analyzer/embedding-service.js.map +1 -0
  163. package/dist/core/analyzer/env-extractor.d.ts +33 -0
  164. package/dist/core/analyzer/env-extractor.d.ts.map +1 -0
  165. package/dist/core/analyzer/env-extractor.js +196 -0
  166. package/dist/core/analyzer/env-extractor.js.map +1 -0
  167. package/dist/core/analyzer/external-packages.d.ts +20 -0
  168. package/dist/core/analyzer/external-packages.d.ts.map +1 -0
  169. package/dist/core/analyzer/external-packages.js +175 -0
  170. package/dist/core/analyzer/external-packages.js.map +1 -0
  171. package/dist/core/analyzer/file-walker.d.ts +78 -0
  172. package/dist/core/analyzer/file-walker.d.ts.map +1 -0
  173. package/dist/core/analyzer/file-walker.js +532 -0
  174. package/dist/core/analyzer/file-walker.js.map +1 -0
  175. package/dist/core/analyzer/function-registry-trie.d.ts +21 -0
  176. package/dist/core/analyzer/function-registry-trie.d.ts.map +1 -0
  177. package/dist/core/analyzer/function-registry-trie.js +39 -0
  178. package/dist/core/analyzer/function-registry-trie.js.map +1 -0
  179. package/dist/core/analyzer/http-route-parser.d.ts +152 -0
  180. package/dist/core/analyzer/http-route-parser.d.ts.map +1 -0
  181. package/dist/core/analyzer/http-route-parser.js +971 -0
  182. package/dist/core/analyzer/http-route-parser.js.map +1 -0
  183. package/dist/core/analyzer/import-parser.d.ts +100 -0
  184. package/dist/core/analyzer/import-parser.d.ts.map +1 -0
  185. package/dist/core/analyzer/import-parser.js +952 -0
  186. package/dist/core/analyzer/import-parser.js.map +1 -0
  187. package/dist/core/analyzer/import-resolver-bridge.d.ts +25 -0
  188. package/dist/core/analyzer/import-resolver-bridge.d.ts.map +1 -0
  189. package/dist/core/analyzer/import-resolver-bridge.js +99 -0
  190. package/dist/core/analyzer/import-resolver-bridge.js.map +1 -0
  191. package/dist/core/analyzer/index.d.ts +10 -0
  192. package/dist/core/analyzer/index.d.ts.map +1 -0
  193. package/dist/core/analyzer/index.js +10 -0
  194. package/dist/core/analyzer/index.js.map +1 -0
  195. package/dist/core/analyzer/middleware-extractor.d.ts +29 -0
  196. package/dist/core/analyzer/middleware-extractor.d.ts.map +1 -0
  197. package/dist/core/analyzer/middleware-extractor.js +195 -0
  198. package/dist/core/analyzer/middleware-extractor.js.map +1 -0
  199. package/dist/core/analyzer/refactor-analyzer.d.ts +83 -0
  200. package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -0
  201. package/dist/core/analyzer/refactor-analyzer.js +351 -0
  202. package/dist/core/analyzer/refactor-analyzer.js.map +1 -0
  203. package/dist/core/analyzer/repository-mapper.d.ts +150 -0
  204. package/dist/core/analyzer/repository-mapper.d.ts.map +1 -0
  205. package/dist/core/analyzer/repository-mapper.js +740 -0
  206. package/dist/core/analyzer/repository-mapper.js.map +1 -0
  207. package/dist/core/analyzer/schema-extractor.d.ts +41 -0
  208. package/dist/core/analyzer/schema-extractor.d.ts.map +1 -0
  209. package/dist/core/analyzer/schema-extractor.js +229 -0
  210. package/dist/core/analyzer/schema-extractor.js.map +1 -0
  211. package/dist/core/analyzer/signature-extractor.d.ts +31 -0
  212. package/dist/core/analyzer/signature-extractor.d.ts.map +1 -0
  213. package/dist/core/analyzer/signature-extractor.js +675 -0
  214. package/dist/core/analyzer/signature-extractor.js.map +1 -0
  215. package/dist/core/analyzer/significance-scorer.d.ts +79 -0
  216. package/dist/core/analyzer/significance-scorer.d.ts.map +1 -0
  217. package/dist/core/analyzer/significance-scorer.js +407 -0
  218. package/dist/core/analyzer/significance-scorer.js.map +1 -0
  219. package/dist/core/analyzer/spec-snapshot-generator.d.ts +17 -0
  220. package/dist/core/analyzer/spec-snapshot-generator.d.ts.map +1 -0
  221. package/dist/core/analyzer/spec-snapshot-generator.js +201 -0
  222. package/dist/core/analyzer/spec-snapshot-generator.js.map +1 -0
  223. package/dist/core/analyzer/spec-vector-index.d.ts +68 -0
  224. package/dist/core/analyzer/spec-vector-index.d.ts.map +1 -0
  225. package/dist/core/analyzer/spec-vector-index.js +340 -0
  226. package/dist/core/analyzer/spec-vector-index.js.map +1 -0
  227. package/dist/core/analyzer/subgraph-extractor.d.ts +51 -0
  228. package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -0
  229. package/dist/core/analyzer/subgraph-extractor.js +147 -0
  230. package/dist/core/analyzer/subgraph-extractor.js.map +1 -0
  231. package/dist/core/analyzer/type-inference-engine.d.ts +23 -0
  232. package/dist/core/analyzer/type-inference-engine.d.ts.map +1 -0
  233. package/dist/core/analyzer/type-inference-engine.js +130 -0
  234. package/dist/core/analyzer/type-inference-engine.js.map +1 -0
  235. package/dist/core/analyzer/ui-component-extractor.d.ts +43 -0
  236. package/dist/core/analyzer/ui-component-extractor.d.ts.map +1 -0
  237. package/dist/core/analyzer/ui-component-extractor.js +245 -0
  238. package/dist/core/analyzer/ui-component-extractor.js.map +1 -0
  239. package/dist/core/analyzer/unified-search.d.ts +116 -0
  240. package/dist/core/analyzer/unified-search.d.ts.map +1 -0
  241. package/dist/core/analyzer/unified-search.js +231 -0
  242. package/dist/core/analyzer/unified-search.js.map +1 -0
  243. package/dist/core/analyzer/vector-index.d.ts +92 -0
  244. package/dist/core/analyzer/vector-index.d.ts.map +1 -0
  245. package/dist/core/analyzer/vector-index.js +451 -0
  246. package/dist/core/analyzer/vector-index.js.map +1 -0
  247. package/dist/core/decisions/consolidator.d.ts +14 -0
  248. package/dist/core/decisions/consolidator.d.ts.map +1 -0
  249. package/dist/core/decisions/consolidator.js +169 -0
  250. package/dist/core/decisions/consolidator.js.map +1 -0
  251. package/dist/core/decisions/extractor.d.ts +26 -0
  252. package/dist/core/decisions/extractor.d.ts.map +1 -0
  253. package/dist/core/decisions/extractor.js +156 -0
  254. package/dist/core/decisions/extractor.js.map +1 -0
  255. package/dist/core/decisions/index.d.ts +19 -0
  256. package/dist/core/decisions/index.d.ts.map +1 -0
  257. package/dist/core/decisions/index.js +16 -0
  258. package/dist/core/decisions/index.js.map +1 -0
  259. package/dist/core/decisions/store.d.ts +36 -0
  260. package/dist/core/decisions/store.d.ts.map +1 -0
  261. package/dist/core/decisions/store.js +109 -0
  262. package/dist/core/decisions/store.js.map +1 -0
  263. package/dist/core/decisions/syncer.d.ts +27 -0
  264. package/dist/core/decisions/syncer.d.ts.map +1 -0
  265. package/dist/core/decisions/syncer.js +214 -0
  266. package/dist/core/decisions/syncer.js.map +1 -0
  267. package/dist/core/decisions/verifier.d.ts +20 -0
  268. package/dist/core/decisions/verifier.d.ts.map +1 -0
  269. package/dist/core/decisions/verifier.js +115 -0
  270. package/dist/core/decisions/verifier.js.map +1 -0
  271. package/dist/core/digest/digest-generator.d.ts +29 -0
  272. package/dist/core/digest/digest-generator.d.ts.map +1 -0
  273. package/dist/core/digest/digest-generator.js +181 -0
  274. package/dist/core/digest/digest-generator.js.map +1 -0
  275. package/dist/core/drift/drift-detector.d.ts +102 -0
  276. package/dist/core/drift/drift-detector.d.ts.map +1 -0
  277. package/dist/core/drift/drift-detector.js +598 -0
  278. package/dist/core/drift/drift-detector.js.map +1 -0
  279. package/dist/core/drift/git-diff.d.ts +60 -0
  280. package/dist/core/drift/git-diff.d.ts.map +1 -0
  281. package/dist/core/drift/git-diff.js +383 -0
  282. package/dist/core/drift/git-diff.js.map +1 -0
  283. package/dist/core/drift/index.d.ts +12 -0
  284. package/dist/core/drift/index.d.ts.map +1 -0
  285. package/dist/core/drift/index.js +9 -0
  286. package/dist/core/drift/index.js.map +1 -0
  287. package/dist/core/drift/spec-mapper.d.ts +73 -0
  288. package/dist/core/drift/spec-mapper.d.ts.map +1 -0
  289. package/dist/core/drift/spec-mapper.js +353 -0
  290. package/dist/core/drift/spec-mapper.js.map +1 -0
  291. package/dist/core/drift/test-suggester.d.ts +18 -0
  292. package/dist/core/drift/test-suggester.d.ts.map +1 -0
  293. package/dist/core/drift/test-suggester.js +107 -0
  294. package/dist/core/drift/test-suggester.js.map +1 -0
  295. package/dist/core/generator/adr-generator.d.ts +32 -0
  296. package/dist/core/generator/adr-generator.d.ts.map +1 -0
  297. package/dist/core/generator/adr-generator.js +192 -0
  298. package/dist/core/generator/adr-generator.js.map +1 -0
  299. package/dist/core/generator/index.d.ts +9 -0
  300. package/dist/core/generator/index.d.ts.map +1 -0
  301. package/dist/core/generator/index.js +12 -0
  302. package/dist/core/generator/index.js.map +1 -0
  303. package/dist/core/generator/mapping-generator.d.ts +54 -0
  304. package/dist/core/generator/mapping-generator.d.ts.map +1 -0
  305. package/dist/core/generator/mapping-generator.js +240 -0
  306. package/dist/core/generator/mapping-generator.js.map +1 -0
  307. package/dist/core/generator/openspec-compat.d.ts +160 -0
  308. package/dist/core/generator/openspec-compat.d.ts.map +1 -0
  309. package/dist/core/generator/openspec-compat.js +524 -0
  310. package/dist/core/generator/openspec-compat.js.map +1 -0
  311. package/dist/core/generator/openspec-format-generator.d.ts +131 -0
  312. package/dist/core/generator/openspec-format-generator.d.ts.map +1 -0
  313. package/dist/core/generator/openspec-format-generator.js +963 -0
  314. package/dist/core/generator/openspec-format-generator.js.map +1 -0
  315. package/dist/core/generator/openspec-writer.d.ts +130 -0
  316. package/dist/core/generator/openspec-writer.d.ts.map +1 -0
  317. package/dist/core/generator/openspec-writer.js +404 -0
  318. package/dist/core/generator/openspec-writer.js.map +1 -0
  319. package/dist/core/generator/prompts.d.ts +35 -0
  320. package/dist/core/generator/prompts.d.ts.map +1 -0
  321. package/dist/core/generator/prompts.js +212 -0
  322. package/dist/core/generator/prompts.js.map +1 -0
  323. package/dist/core/generator/rag-manifest-generator.d.ts +37 -0
  324. package/dist/core/generator/rag-manifest-generator.d.ts.map +1 -0
  325. package/dist/core/generator/rag-manifest-generator.js +134 -0
  326. package/dist/core/generator/rag-manifest-generator.js.map +1 -0
  327. package/dist/core/generator/schemas.d.ts +365 -0
  328. package/dist/core/generator/schemas.d.ts.map +1 -0
  329. package/dist/core/generator/schemas.js +190 -0
  330. package/dist/core/generator/schemas.js.map +1 -0
  331. package/dist/core/generator/spec-pipeline.d.ts +123 -0
  332. package/dist/core/generator/spec-pipeline.d.ts.map +1 -0
  333. package/dist/core/generator/spec-pipeline.js +699 -0
  334. package/dist/core/generator/spec-pipeline.js.map +1 -0
  335. package/dist/core/generator/stages/stage1-survey.d.ts +19 -0
  336. package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -0
  337. package/dist/core/generator/stages/stage1-survey.js +171 -0
  338. package/dist/core/generator/stages/stage1-survey.js.map +1 -0
  339. package/dist/core/generator/stages/stage2-entities.d.ts +11 -0
  340. package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -0
  341. package/dist/core/generator/stages/stage2-entities.js +74 -0
  342. package/dist/core/generator/stages/stage2-entities.js.map +1 -0
  343. package/dist/core/generator/stages/stage3-services.d.ts +11 -0
  344. package/dist/core/generator/stages/stage3-services.d.ts.map +1 -0
  345. package/dist/core/generator/stages/stage3-services.js +85 -0
  346. package/dist/core/generator/stages/stage3-services.js.map +1 -0
  347. package/dist/core/generator/stages/stage4-api.d.ts +11 -0
  348. package/dist/core/generator/stages/stage4-api.d.ts.map +1 -0
  349. package/dist/core/generator/stages/stage4-api.js +72 -0
  350. package/dist/core/generator/stages/stage4-api.js.map +1 -0
  351. package/dist/core/generator/stages/stage5-architecture.d.ts +11 -0
  352. package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -0
  353. package/dist/core/generator/stages/stage5-architecture.js +75 -0
  354. package/dist/core/generator/stages/stage5-architecture.js.map +1 -0
  355. package/dist/core/generator/stages/stage6-adr.d.ts +8 -0
  356. package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -0
  357. package/dist/core/generator/stages/stage6-adr.js +47 -0
  358. package/dist/core/generator/stages/stage6-adr.js.map +1 -0
  359. package/dist/core/services/chat-agent.d.ts +50 -0
  360. package/dist/core/services/chat-agent.d.ts.map +1 -0
  361. package/dist/core/services/chat-agent.js +369 -0
  362. package/dist/core/services/chat-agent.js.map +1 -0
  363. package/dist/core/services/chat-tools.d.ts +32 -0
  364. package/dist/core/services/chat-tools.d.ts.map +1 -0
  365. package/dist/core/services/chat-tools.js +494 -0
  366. package/dist/core/services/chat-tools.js.map +1 -0
  367. package/dist/core/services/config-manager.d.ts +61 -0
  368. package/dist/core/services/config-manager.d.ts.map +1 -0
  369. package/dist/core/services/config-manager.js +149 -0
  370. package/dist/core/services/config-manager.js.map +1 -0
  371. package/dist/core/services/edge-store.d.ts +57 -0
  372. package/dist/core/services/edge-store.d.ts.map +1 -0
  373. package/dist/core/services/edge-store.js +419 -0
  374. package/dist/core/services/edge-store.js.map +1 -0
  375. package/dist/core/services/gitignore-manager.d.ts +29 -0
  376. package/dist/core/services/gitignore-manager.d.ts.map +1 -0
  377. package/dist/core/services/gitignore-manager.js +95 -0
  378. package/dist/core/services/gitignore-manager.js.map +1 -0
  379. package/dist/core/services/index.d.ts +8 -0
  380. package/dist/core/services/index.d.ts.map +1 -0
  381. package/dist/core/services/index.js +8 -0
  382. package/dist/core/services/index.js.map +1 -0
  383. package/dist/core/services/llm-service.d.ts +379 -0
  384. package/dist/core/services/llm-service.d.ts.map +1 -0
  385. package/dist/core/services/llm-service.js +1553 -0
  386. package/dist/core/services/llm-service.js.map +1 -0
  387. package/dist/core/services/mcp-handlers/analysis.d.ts +127 -0
  388. package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -0
  389. package/dist/core/services/mcp-handlers/analysis.js +1185 -0
  390. package/dist/core/services/mcp-handlers/analysis.js.map +1 -0
  391. package/dist/core/services/mcp-handlers/change.d.ts +14 -0
  392. package/dist/core/services/mcp-handlers/change.d.ts.map +1 -0
  393. package/dist/core/services/mcp-handlers/change.js +416 -0
  394. package/dist/core/services/mcp-handlers/change.js.map +1 -0
  395. package/dist/core/services/mcp-handlers/decisions.d.ts +16 -0
  396. package/dist/core/services/mcp-handlers/decisions.d.ts.map +1 -0
  397. package/dist/core/services/mcp-handlers/decisions.js +239 -0
  398. package/dist/core/services/mcp-handlers/decisions.js.map +1 -0
  399. package/dist/core/services/mcp-handlers/graph.d.ts +94 -0
  400. package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -0
  401. package/dist/core/services/mcp-handlers/graph.js +693 -0
  402. package/dist/core/services/mcp-handlers/graph.js.map +1 -0
  403. package/dist/core/services/mcp-handlers/orient.d.ts +17 -0
  404. package/dist/core/services/mcp-handlers/orient.d.ts.map +1 -0
  405. package/dist/core/services/mcp-handlers/orient.js +357 -0
  406. package/dist/core/services/mcp-handlers/orient.js.map +1 -0
  407. package/dist/core/services/mcp-handlers/semantic.d.ts +66 -0
  408. package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -0
  409. package/dist/core/services/mcp-handlers/semantic.js +432 -0
  410. package/dist/core/services/mcp-handlers/semantic.js.map +1 -0
  411. package/dist/core/services/mcp-handlers/utils.d.ts +85 -0
  412. package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -0
  413. package/dist/core/services/mcp-handlers/utils.js +262 -0
  414. package/dist/core/services/mcp-handlers/utils.js.map +1 -0
  415. package/dist/core/services/mcp-watcher.d.ts +41 -0
  416. package/dist/core/services/mcp-watcher.d.ts.map +1 -0
  417. package/dist/core/services/mcp-watcher.js +254 -0
  418. package/dist/core/services/mcp-watcher.js.map +1 -0
  419. package/dist/core/services/project-detector.d.ts +32 -0
  420. package/dist/core/services/project-detector.d.ts.map +1 -0
  421. package/dist/core/services/project-detector.js +100 -0
  422. package/dist/core/services/project-detector.js.map +1 -0
  423. package/dist/core/test-generator/coverage-analyzer.d.ts +27 -0
  424. package/dist/core/test-generator/coverage-analyzer.d.ts.map +1 -0
  425. package/dist/core/test-generator/coverage-analyzer.js +285 -0
  426. package/dist/core/test-generator/coverage-analyzer.js.map +1 -0
  427. package/dist/core/test-generator/framework-detector.d.ts +17 -0
  428. package/dist/core/test-generator/framework-detector.d.ts.map +1 -0
  429. package/dist/core/test-generator/framework-detector.js +65 -0
  430. package/dist/core/test-generator/framework-detector.js.map +1 -0
  431. package/dist/core/test-generator/index.d.ts +14 -0
  432. package/dist/core/test-generator/index.d.ts.map +1 -0
  433. package/dist/core/test-generator/index.js +11 -0
  434. package/dist/core/test-generator/index.js.map +1 -0
  435. package/dist/core/test-generator/renderers/catch2.d.ts +8 -0
  436. package/dist/core/test-generator/renderers/catch2.d.ts.map +1 -0
  437. package/dist/core/test-generator/renderers/catch2.js +47 -0
  438. package/dist/core/test-generator/renderers/catch2.js.map +1 -0
  439. package/dist/core/test-generator/renderers/gtest.d.ts +8 -0
  440. package/dist/core/test-generator/renderers/gtest.d.ts.map +1 -0
  441. package/dist/core/test-generator/renderers/gtest.js +45 -0
  442. package/dist/core/test-generator/renderers/gtest.js.map +1 -0
  443. package/dist/core/test-generator/renderers/index.d.ts +20 -0
  444. package/dist/core/test-generator/renderers/index.d.ts.map +1 -0
  445. package/dist/core/test-generator/renderers/index.js +35 -0
  446. package/dist/core/test-generator/renderers/index.js.map +1 -0
  447. package/dist/core/test-generator/renderers/playwright.d.ts +8 -0
  448. package/dist/core/test-generator/renderers/playwright.d.ts.map +1 -0
  449. package/dist/core/test-generator/renderers/playwright.js +44 -0
  450. package/dist/core/test-generator/renderers/playwright.js.map +1 -0
  451. package/dist/core/test-generator/renderers/pytest.d.ts +8 -0
  452. package/dist/core/test-generator/renderers/pytest.d.ts.map +1 -0
  453. package/dist/core/test-generator/renderers/pytest.js +44 -0
  454. package/dist/core/test-generator/renderers/pytest.js.map +1 -0
  455. package/dist/core/test-generator/renderers/shared.d.ts +21 -0
  456. package/dist/core/test-generator/renderers/shared.d.ts.map +1 -0
  457. package/dist/core/test-generator/renderers/shared.js +56 -0
  458. package/dist/core/test-generator/renderers/shared.js.map +1 -0
  459. package/dist/core/test-generator/renderers/vitest.d.ts +8 -0
  460. package/dist/core/test-generator/renderers/vitest.d.ts.map +1 -0
  461. package/dist/core/test-generator/renderers/vitest.js +52 -0
  462. package/dist/core/test-generator/renderers/vitest.js.map +1 -0
  463. package/dist/core/test-generator/scenario-parser.d.ts +33 -0
  464. package/dist/core/test-generator/scenario-parser.d.ts.map +1 -0
  465. package/dist/core/test-generator/scenario-parser.js +244 -0
  466. package/dist/core/test-generator/scenario-parser.js.map +1 -0
  467. package/dist/core/test-generator/test-generator.d.ts +30 -0
  468. package/dist/core/test-generator/test-generator.d.ts.map +1 -0
  469. package/dist/core/test-generator/test-generator.js +174 -0
  470. package/dist/core/test-generator/test-generator.js.map +1 -0
  471. package/dist/core/test-generator/test-writer.d.ts +25 -0
  472. package/dist/core/test-generator/test-writer.d.ts.map +1 -0
  473. package/dist/core/test-generator/test-writer.js +128 -0
  474. package/dist/core/test-generator/test-writer.js.map +1 -0
  475. package/dist/core/test-generator/then-matchers.d.ts +35 -0
  476. package/dist/core/test-generator/then-matchers.d.ts.map +1 -0
  477. package/dist/core/test-generator/then-matchers.js +211 -0
  478. package/dist/core/test-generator/then-matchers.js.map +1 -0
  479. package/dist/core/verifier/index.d.ts +5 -0
  480. package/dist/core/verifier/index.d.ts.map +1 -0
  481. package/dist/core/verifier/index.js +5 -0
  482. package/dist/core/verifier/index.js.map +1 -0
  483. package/dist/core/verifier/verification-engine.d.ts +293 -0
  484. package/dist/core/verifier/verification-engine.d.ts.map +1 -0
  485. package/dist/core/verifier/verification-engine.js +919 -0
  486. package/dist/core/verifier/verification-engine.js.map +1 -0
  487. package/dist/types/index.d.ts +368 -0
  488. package/dist/types/index.d.ts.map +1 -0
  489. package/dist/types/index.js +5 -0
  490. package/dist/types/index.js.map +1 -0
  491. package/dist/types/pipeline.d.ts +167 -0
  492. package/dist/types/pipeline.d.ts.map +1 -0
  493. package/dist/types/pipeline.js +5 -0
  494. package/dist/types/pipeline.js.map +1 -0
  495. package/dist/types/test-generator.d.ts +103 -0
  496. package/dist/types/test-generator.d.ts.map +1 -0
  497. package/dist/types/test-generator.js +17 -0
  498. package/dist/types/test-generator.js.map +1 -0
  499. package/dist/utils/command-helpers.d.ts +68 -0
  500. package/dist/utils/command-helpers.d.ts.map +1 -0
  501. package/dist/utils/command-helpers.js +150 -0
  502. package/dist/utils/command-helpers.js.map +1 -0
  503. package/dist/utils/errors.d.ts +51 -0
  504. package/dist/utils/errors.d.ts.map +1 -0
  505. package/dist/utils/errors.js +129 -0
  506. package/dist/utils/errors.js.map +1 -0
  507. package/dist/utils/logger.d.ts +149 -0
  508. package/dist/utils/logger.d.ts.map +1 -0
  509. package/dist/utils/logger.js +342 -0
  510. package/dist/utils/logger.js.map +1 -0
  511. package/dist/utils/misc.d.ts +10 -0
  512. package/dist/utils/misc.d.ts.map +1 -0
  513. package/dist/utils/misc.js +21 -0
  514. package/dist/utils/misc.js.map +1 -0
  515. package/dist/utils/progress.d.ts +142 -0
  516. package/dist/utils/progress.d.ts.map +1 -0
  517. package/dist/utils/progress.js +283 -0
  518. package/dist/utils/progress.js.map +1 -0
  519. package/dist/utils/prompts.d.ts +53 -0
  520. package/dist/utils/prompts.d.ts.map +1 -0
  521. package/dist/utils/prompts.js +199 -0
  522. package/dist/utils/prompts.js.map +1 -0
  523. package/dist/utils/shutdown.d.ts +89 -0
  524. package/dist/utils/shutdown.d.ts.map +1 -0
  525. package/dist/utils/shutdown.js +238 -0
  526. package/dist/utils/shutdown.js.map +1 -0
  527. package/examples/bmad/README.md +113 -0
  528. package/examples/bmad/agents/architect.md +226 -0
  529. package/examples/bmad/agents/dev-brownfield.md +69 -0
  530. package/examples/bmad/setup/architect.customize.yaml +14 -0
  531. package/examples/bmad/tasks/implement-story.md +254 -0
  532. package/examples/bmad/tasks/onboarding.md +169 -0
  533. package/examples/bmad/tasks/refactor.md +178 -0
  534. package/examples/bmad/tasks/sprint-planning.md +168 -0
  535. package/examples/bmad/templates/story.md +108 -0
  536. package/examples/cline-workflows/openlore-analyze-codebase.md +101 -0
  537. package/examples/cline-workflows/openlore-check-spec-drift.md +102 -0
  538. package/examples/cline-workflows/openlore-execute-refactor.md +212 -0
  539. package/examples/cline-workflows/openlore-implement-feature.md +266 -0
  540. package/examples/cline-workflows/openlore-plan-refactor.md +279 -0
  541. package/examples/cline-workflows/openlore-refactor-codebase.md +16 -0
  542. package/examples/cline-workflows/openlore-write-tests.md +177 -0
  543. package/examples/drift-demo/openspec/config.yaml +14 -0
  544. package/examples/drift-demo/openspec/specs/architecture/spec.md +30 -0
  545. package/examples/drift-demo/openspec/specs/auth/spec.md +71 -0
  546. package/examples/drift-demo/openspec/specs/database/spec.md +33 -0
  547. package/examples/drift-demo/openspec/specs/overview/spec.md +20 -0
  548. package/examples/drift-demo/openspec/specs/projects/spec.md +55 -0
  549. package/examples/drift-demo/openspec/specs/tasks/spec.md +78 -0
  550. package/examples/drift-demo/package.json +21 -0
  551. package/examples/drift-demo/src/auth/auth-middleware.ts +30 -0
  552. package/examples/drift-demo/src/auth/auth-routes.ts +29 -0
  553. package/examples/drift-demo/src/auth/auth-service.ts +45 -0
  554. package/examples/drift-demo/src/database/connection.ts +27 -0
  555. package/examples/drift-demo/src/index.ts +16 -0
  556. package/examples/drift-demo/src/projects/project-model.ts +15 -0
  557. package/examples/drift-demo/src/projects/project-service.ts +34 -0
  558. package/examples/drift-demo/src/tasks/task-model.ts +37 -0
  559. package/examples/drift-demo/src/tasks/task-routes.ts +53 -0
  560. package/examples/drift-demo/src/tasks/task-service.ts +60 -0
  561. package/examples/drift-demo/src/utils/validation.ts +11 -0
  562. package/examples/drift-demo/tests/auth.test.ts +4 -0
  563. package/examples/drift-demo/tests/tasks.test.ts +4 -0
  564. package/examples/drift-demo/tsconfig.json +10 -0
  565. package/examples/drift-test/run-drift-test.sh +1087 -0
  566. package/examples/gsd/README.md +119 -0
  567. package/examples/gsd/commands/gsd/openlore-drift.md +111 -0
  568. package/examples/gsd/commands/gsd/openlore-orient.md +191 -0
  569. package/examples/mistral-vibe/README.md +101 -0
  570. package/examples/mistral-vibe/antipatterns-template.md +18 -0
  571. package/examples/mistral-vibe/skills/openlore-analyze-codebase/SKILL.md +124 -0
  572. package/examples/mistral-vibe/skills/openlore-brainstorm/SKILL.md +379 -0
  573. package/examples/mistral-vibe/skills/openlore-debug/SKILL.md +330 -0
  574. package/examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md +291 -0
  575. package/examples/mistral-vibe/skills/openlore-generate/SKILL.md +245 -0
  576. package/examples/mistral-vibe/skills/openlore-implement-story/SKILL.md +326 -0
  577. package/examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md +365 -0
  578. package/examples/mistral-vibe/skills/openlore-review-changes/SKILL.md +128 -0
  579. package/examples/mistral-vibe/skills/openlore-write-tests/SKILL.md +261 -0
  580. package/examples/opencode/agent-guard.ts +170 -0
  581. package/examples/opencode/plugins/anti-laziness.ts +202 -0
  582. package/examples/opencode/plugins/lib/openlore-context-injector-helpers.ts +116 -0
  583. package/examples/opencode/plugins/lib/openlore-decision-extractor-helpers.ts +65 -0
  584. package/examples/opencode/plugins/openlore-context-injector.test.ts +211 -0
  585. package/examples/opencode/plugins/openlore-context-injector.ts +165 -0
  586. package/examples/opencode/plugins/openlore-decision-extractor.test.ts +131 -0
  587. package/examples/opencode/plugins/openlore-decision-extractor.ts +322 -0
  588. package/examples/opencode/plugins/openlore-enforcer.ts +227 -0
  589. package/examples/opencode/prompts/sisyphus-sdd.md +150 -0
  590. package/examples/opencode-skills/openlore-analyze-codebase/SKILL.md +101 -0
  591. package/examples/opencode-skills/openlore-brainstorm/SKILL.md +354 -0
  592. package/examples/opencode-skills/openlore-debug/SKILL.md +291 -0
  593. package/examples/opencode-skills/openlore-execute-refactor/SKILL.md +241 -0
  594. package/examples/opencode-skills/openlore-generate/SKILL.md +236 -0
  595. package/examples/opencode-skills/openlore-implement-story/SKILL.md +251 -0
  596. package/examples/opencode-skills/openlore-plan-refactor/SKILL.md +298 -0
  597. package/examples/opencode-skills/openlore-review-changes/SKILL.md +134 -0
  598. package/examples/opencode-skills/openlore-write-tests/SKILL.md +230 -0
  599. package/examples/openspec-analysis/README.md +59 -0
  600. package/examples/openspec-analysis/SUMMARY.md +72 -0
  601. package/examples/openspec-analysis/config.json +16 -0
  602. package/examples/openspec-analysis/dependencies.mermaid +35 -0
  603. package/examples/openspec-analysis/dependency-graph.json +12116 -0
  604. package/examples/openspec-analysis/llm-context.json +119 -0
  605. package/examples/openspec-analysis/repo-structure.json +871 -0
  606. package/examples/openspec-cli/README.md +67 -0
  607. package/examples/openspec-cli/openspec/config.yaml +26 -0
  608. package/examples/openspec-cli/openspec/specs/architecture/spec.md +178 -0
  609. package/examples/openspec-cli/openspec/specs/artifact-graph/spec.md +143 -0
  610. package/examples/openspec-cli/openspec/specs/cli/spec.md +138 -0
  611. package/examples/openspec-cli/openspec/specs/overview/spec.md +60 -0
  612. package/examples/openspec-cli/openspec/specs/parsing/spec.md +123 -0
  613. package/examples/openspec-cli/openspec/specs/validation/spec.md +108 -0
  614. package/examples/spec-kit/README.md +104 -0
  615. package/examples/spec-kit/commands/drift.md +87 -0
  616. package/examples/spec-kit/commands/orient.md +138 -0
  617. package/examples/spec-kit/extension.yml +54 -0
  618. package/package.json +125 -0
  619. package/src/viewer/InteractiveGraphViewer.jsx +1600 -0
  620. package/src/viewer/app/index.html +17 -0
  621. package/src/viewer/app/main.jsx +13 -0
  622. package/src/viewer/components/ArchitectureView.jsx +177 -0
  623. package/src/viewer/components/ChatPanel.jsx +450 -0
  624. package/src/viewer/components/ClassGraph.jsx +782 -0
  625. package/src/viewer/components/ClusterGraph.jsx +469 -0
  626. package/src/viewer/components/FilterBar.jsx +179 -0
  627. package/src/viewer/components/FlatGraph.jsx +282 -0
  628. package/src/viewer/components/MicroComponents.jsx +85 -0
  629. package/src/viewer/hooks/usePanZoom.js +79 -0
  630. package/src/viewer/utils/constants.js +64 -0
  631. package/src/viewer/utils/graph-helpers.js +303 -0
  632. package/src/viewer/utils/graph-helpers.test.ts +39 -0
  633. package/src/viewer/utils/themes.js +206 -0
  634. package/stubs/tree-sitter-cli-stub/package.json +6 -0
@@ -0,0 +1,160 @@
1
+ /**
2
+ * OpenSpec Compatibility Layer
3
+ *
4
+ * Ensures perfect compatibility with OpenSpec's tooling and conventions.
5
+ * Handles config.yaml integration, validation, and context injection.
6
+ */
7
+ import type { ProjectSurveyResult } from './spec-pipeline.js';
8
+ /**
9
+ * Validation result for specs and config
10
+ */
11
+ export interface ValidationResult {
12
+ valid: boolean;
13
+ errors: string[];
14
+ warnings: string[];
15
+ }
16
+ /**
17
+ * OpenSpec config.yaml structure
18
+ */
19
+ export interface OpenSpecConfig {
20
+ schema?: string;
21
+ context?: string;
22
+ rules?: {
23
+ proposal?: string[];
24
+ specs?: string[];
25
+ design?: string[];
26
+ tasks?: string[];
27
+ };
28
+ 'openlore'?: OpenLoreMetadata;
29
+ }
30
+ /**
31
+ * openlore metadata added to config.yaml
32
+ */
33
+ export interface OpenLoreMetadata {
34
+ version: string;
35
+ generatedAt: string;
36
+ domains: string[];
37
+ confidence: number;
38
+ adrCount?: number;
39
+ }
40
+ /**
41
+ * Detected project context for injection
42
+ */
43
+ export interface DetectedContext {
44
+ techStack: string;
45
+ architecture: string;
46
+ domains: string[];
47
+ patterns: string[];
48
+ }
49
+ /**
50
+ * Options for context update
51
+ */
52
+ export interface ContextUpdateOptions {
53
+ preserveUserContext: boolean;
54
+ appendDetectedInfo: boolean;
55
+ version: string;
56
+ }
57
+ /**
58
+ * OpenSpec validator for specs and configuration
59
+ */
60
+ export declare class OpenSpecValidator {
61
+ /**
62
+ * Validate the complete spec structure
63
+ */
64
+ validateSpecStructure(content: string): ValidationResult;
65
+ /**
66
+ * Validate requirement format follows RFC 2119
67
+ */
68
+ validateRequirementFormat(requirement: string): ValidationResult;
69
+ /**
70
+ * Validate scenario format (Given/When/Then)
71
+ */
72
+ validateScenarioFormat(scenario: string): ValidationResult;
73
+ /**
74
+ * Validate config.yaml structure
75
+ */
76
+ validateConfigYaml(config: unknown): ValidationResult;
77
+ /**
78
+ * Check heading hierarchy is valid (no skipped levels)
79
+ */
80
+ private checkHeadingHierarchy;
81
+ /**
82
+ * Check for malformed markdown links
83
+ */
84
+ private checkMarkdownLinks;
85
+ }
86
+ /**
87
+ * OpenSpec config.yaml manager
88
+ */
89
+ export declare class OpenSpecConfigManager {
90
+ private configPath;
91
+ private openspecRoot;
92
+ constructor(projectRoot: string);
93
+ /**
94
+ * Check if OpenSpec is initialized
95
+ */
96
+ isInitialized(): Promise<boolean>;
97
+ /**
98
+ * Check if config.yaml exists
99
+ */
100
+ hasConfig(): Promise<boolean>;
101
+ /**
102
+ * Read existing config.yaml
103
+ */
104
+ readConfig(): Promise<OpenSpecConfig | null>;
105
+ /**
106
+ * Write config.yaml, preserving user content
107
+ */
108
+ writeConfig(config: OpenSpecConfig): Promise<void>;
109
+ /**
110
+ * Update config with openlore metadata while preserving user content
111
+ */
112
+ updateWithOpenLoreMetadata(metadata: OpenLoreMetadata, detectedContext?: DetectedContext, options?: ContextUpdateOptions): Promise<OpenSpecConfig>;
113
+ /**
114
+ * Build context string combining user and detected info
115
+ */
116
+ private buildContext;
117
+ /**
118
+ * Get existing user context from config
119
+ */
120
+ getUserContext(): Promise<string | null>;
121
+ /**
122
+ * Get existing domains from specs directory
123
+ */
124
+ getExistingDomains(): Promise<string[]>;
125
+ }
126
+ /**
127
+ * Build detected context from analysis results
128
+ */
129
+ export declare function buildDetectedContext(survey: ProjectSurveyResult): DetectedContext;
130
+ /**
131
+ * Normalize domain name to OpenSpec conventions
132
+ */
133
+ export declare function normalizeDomainName(name: string): string;
134
+ /**
135
+ * Check if domain name follows conventions
136
+ */
137
+ export declare function isValidDomainName(name: string): boolean;
138
+ /**
139
+ * Match suggested domains against existing domains
140
+ */
141
+ export declare function matchExistingDomains(suggestedDomains: string[], existingDomains: string[]): Map<string, string>;
142
+ /**
143
+ * Validate a complete spec file
144
+ */
145
+ export declare function validateFullSpec(content: string): ValidationResult;
146
+ /**
147
+ * Validate all specs in a directory
148
+ */
149
+ export declare function validateSpecsDirectory(specsDir: string): Promise<{
150
+ valid: boolean;
151
+ results: Map<string, ValidationResult>;
152
+ }>;
153
+ /**
154
+ * Create a new OpenSpec compatibility helper
155
+ */
156
+ export declare function createOpenSpecCompat(projectRoot: string): {
157
+ validator: OpenSpecValidator;
158
+ configManager: OpenSpecConfigManager;
159
+ };
160
+ //# sourceMappingURL=openspec-compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openspec-compat.d.ts","sourceRoot":"","sources":["../../../src/core/generator/openspec-compat.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAM9D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB;IA2CxD;;OAEG;IACH,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB;IA2BhE;;OAEG;IACH,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB;IAgD1D;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB;IAiErD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAyB3B;AAMD;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;gBAEjB,WAAW,EAAE,MAAM;IAK/B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IASvC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IASnC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IASlD;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxD;;OAEG;IACG,0BAA0B,CAC9B,QAAQ,EAAE,gBAAgB,EAC1B,eAAe,CAAC,EAAE,eAAe,EACjC,OAAO,GAAE,oBAIR,GACA,OAAO,CAAC,cAAc,CAAC;IAqB1B;;OAEG;IACH,OAAO,CAAC,YAAY;IA0BpB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAK9C;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAY9C;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,eAAe,CAsCjF;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAavD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,eAAe,EAAE,MAAM,EAAE,GACxB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBrB;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAwBlE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACxC,CAAC,CAqCD;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG;IACzD,SAAS,EAAE,iBAAiB,CAAC;IAC7B,aAAa,EAAE,qBAAqB,CAAC;CACtC,CAKA"}
@@ -0,0 +1,524 @@
1
+ /**
2
+ * OpenSpec Compatibility Layer
3
+ *
4
+ * Ensures perfect compatibility with OpenSpec's tooling and conventions.
5
+ * Handles config.yaml integration, validation, and context injection.
6
+ */
7
+ import { readFile, writeFile, mkdir, access, readdir } from 'node:fs/promises';
8
+ import { join } from 'node:path';
9
+ import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
10
+ import logger from '../../utils/logger.js';
11
+ import { OPENSPEC_DIR, OPENSPEC_CONFIG_FILENAME } from '../../constants.js';
12
+ // ============================================================================
13
+ // OPENSPEC VALIDATION
14
+ // ============================================================================
15
+ /**
16
+ * OpenSpec validator for specs and configuration
17
+ */
18
+ export class OpenSpecValidator {
19
+ /**
20
+ * Validate the complete spec structure
21
+ */
22
+ validateSpecStructure(content) {
23
+ const errors = [];
24
+ const warnings = [];
25
+ // Check for title (# heading at start)
26
+ if (!content.match(/^#\s+.+/m)) {
27
+ errors.push('Missing title (# heading)');
28
+ }
29
+ // Check for Purpose section
30
+ if (!content.includes('## Purpose')) {
31
+ warnings.push('Missing Purpose section (recommended)');
32
+ }
33
+ // Check for Requirements section (except overview which may have Domains instead)
34
+ if (!content.includes('## Requirements') && !content.includes('## Domains') && !content.includes('## Key Capabilities')) {
35
+ warnings.push('Missing Requirements section');
36
+ }
37
+ // Check for delta markers (should not be in generated specs)
38
+ if (content.match(/\[ADDED\]|\[MODIFIED\]|\[REMOVED\]/)) {
39
+ errors.push('Generated specs should not contain delta markers ([ADDED], [MODIFIED], [REMOVED])');
40
+ }
41
+ // Check markdown structure is valid
42
+ const headingLevels = this.checkHeadingHierarchy(content);
43
+ if (!headingLevels.valid) {
44
+ warnings.push(...headingLevels.issues);
45
+ }
46
+ // Check for broken links
47
+ const brokenLinks = this.checkMarkdownLinks(content);
48
+ if (brokenLinks.length > 0) {
49
+ warnings.push(...brokenLinks.map(link => `Potentially malformed link: ${link}`));
50
+ }
51
+ return {
52
+ valid: errors.length === 0,
53
+ errors,
54
+ warnings,
55
+ };
56
+ }
57
+ /**
58
+ * Validate requirement format follows RFC 2119
59
+ */
60
+ validateRequirementFormat(requirement) {
61
+ const errors = [];
62
+ const warnings = [];
63
+ // Check for RFC 2119 keywords
64
+ const rfc2119Keywords = /\b(SHALL|MUST|SHOULD|MAY|SHALL NOT|MUST NOT|SHOULD NOT|MAY NOT)\b/;
65
+ if (!rfc2119Keywords.test(requirement)) {
66
+ warnings.push('Requirement does not use RFC 2119 keywords (SHALL, MUST, SHOULD, MAY)');
67
+ }
68
+ // Check for imperative form
69
+ if (requirement.match(/^The system\s+/i) === null && requirement.match(/^The\s+\w+\s+(SHALL|MUST|SHOULD|MAY)/i) === null) {
70
+ warnings.push('Requirement should start with "The system" or "The [component]"');
71
+ }
72
+ // Check it's not too short (likely incomplete)
73
+ if (requirement.split(/\s+/).length < 5) {
74
+ warnings.push('Requirement may be too brief');
75
+ }
76
+ return {
77
+ valid: errors.length === 0,
78
+ errors,
79
+ warnings,
80
+ };
81
+ }
82
+ /**
83
+ * Validate scenario format (Given/When/Then)
84
+ */
85
+ validateScenarioFormat(scenario) {
86
+ const errors = [];
87
+ const warnings = [];
88
+ // Check for scenario heading with exactly 4 hashtags
89
+ if (!scenario.match(/^####\s+Scenario:/m)) {
90
+ errors.push('Scenario heading must use exactly 4 hashtags (####)');
91
+ }
92
+ // Check for GIVEN
93
+ if (!scenario.includes('**GIVEN**') && !scenario.includes('- **GIVEN**')) {
94
+ errors.push('Scenario missing GIVEN clause');
95
+ }
96
+ // Check for WHEN
97
+ if (!scenario.includes('**WHEN**') && !scenario.includes('- **WHEN**')) {
98
+ errors.push('Scenario missing WHEN clause');
99
+ }
100
+ // Check for THEN
101
+ if (!scenario.includes('**THEN**') && !scenario.includes('- **THEN**')) {
102
+ errors.push('Scenario missing THEN clause');
103
+ }
104
+ // AND is optional but if present should be formatted correctly
105
+ if (scenario.includes('AND') && !scenario.match(/\*\*AND\*\*/)) {
106
+ warnings.push('AND clause should be bolded (**AND**)');
107
+ }
108
+ // Check order: GIVEN should come before WHEN, WHEN before THEN
109
+ const givenIndex = scenario.indexOf('**GIVEN**');
110
+ const whenIndex = scenario.indexOf('**WHEN**');
111
+ const thenIndex = scenario.indexOf('**THEN**');
112
+ if (givenIndex !== -1 && whenIndex !== -1 && givenIndex > whenIndex) {
113
+ errors.push('GIVEN must come before WHEN');
114
+ }
115
+ if (whenIndex !== -1 && thenIndex !== -1 && whenIndex > thenIndex) {
116
+ errors.push('WHEN must come before THEN');
117
+ }
118
+ return {
119
+ valid: errors.length === 0,
120
+ errors,
121
+ warnings,
122
+ };
123
+ }
124
+ /**
125
+ * Validate config.yaml structure
126
+ */
127
+ validateConfigYaml(config) {
128
+ const errors = [];
129
+ const warnings = [];
130
+ if (typeof config !== 'object' || config === null) {
131
+ errors.push('Config must be an object');
132
+ return { valid: false, errors, warnings };
133
+ }
134
+ const configObj = config;
135
+ // Check schema field
136
+ if (configObj.schema !== undefined && typeof configObj.schema !== 'string') {
137
+ errors.push('schema must be a string');
138
+ }
139
+ // Check context field
140
+ if (configObj.context !== undefined && typeof configObj.context !== 'string') {
141
+ errors.push('context must be a string');
142
+ }
143
+ // Check rules field
144
+ if (configObj.rules !== undefined) {
145
+ if (typeof configObj.rules !== 'object' || configObj.rules === null) {
146
+ errors.push('rules must be an object');
147
+ }
148
+ else {
149
+ const rules = configObj.rules;
150
+ const allowedRuleKeys = ['proposal', 'specs', 'design', 'tasks'];
151
+ for (const key of Object.keys(rules)) {
152
+ if (!allowedRuleKeys.includes(key)) {
153
+ warnings.push(`Unknown rule key: ${key}`);
154
+ }
155
+ if (!Array.isArray(rules[key])) {
156
+ errors.push(`rules.${key} must be an array`);
157
+ }
158
+ }
159
+ }
160
+ }
161
+ // Check openlore metadata if present
162
+ if (configObj['openlore'] !== undefined) {
163
+ const openlore = configObj['openlore'];
164
+ if (typeof openlore.version !== 'string') {
165
+ warnings.push('openlore.version should be a string');
166
+ }
167
+ if (typeof openlore.generatedAt !== 'string') {
168
+ warnings.push('openlore.generatedAt should be a string');
169
+ }
170
+ if (!Array.isArray(openlore.domains)) {
171
+ warnings.push('openlore.domains should be an array');
172
+ }
173
+ if (typeof openlore.confidence !== 'number') {
174
+ warnings.push('openlore.confidence should be a number');
175
+ }
176
+ }
177
+ return {
178
+ valid: errors.length === 0,
179
+ errors,
180
+ warnings,
181
+ };
182
+ }
183
+ /**
184
+ * Check heading hierarchy is valid (no skipped levels)
185
+ */
186
+ checkHeadingHierarchy(content) {
187
+ const issues = [];
188
+ const headings = content.match(/^#{1,6}\s+.+/gm) || [];
189
+ let lastLevel = 0;
190
+ for (const heading of headings) {
191
+ const match = heading.match(/^(#{1,6})/);
192
+ if (match) {
193
+ const level = match[1].length;
194
+ if (level > lastLevel + 1 && lastLevel !== 0) {
195
+ issues.push(`Heading level jumped from ${lastLevel} to ${level}: "${heading.slice(0, 50)}..."`);
196
+ }
197
+ lastLevel = level;
198
+ }
199
+ }
200
+ return { valid: issues.length === 0, issues };
201
+ }
202
+ /**
203
+ * Check for malformed markdown links
204
+ */
205
+ checkMarkdownLinks(content) {
206
+ const malformed = [];
207
+ // Find all markdown links
208
+ const linkPattern = /\[([^\]]*)\]\(([^)]*)\)/g;
209
+ let match;
210
+ while ((match = linkPattern.exec(content)) !== null) {
211
+ const [fullMatch, text, url] = match;
212
+ // Check for empty text or URL
213
+ if (!text.trim()) {
214
+ malformed.push(fullMatch);
215
+ }
216
+ if (!url.trim()) {
217
+ malformed.push(fullMatch);
218
+ }
219
+ // Check for obviously broken URLs
220
+ if (url.includes(' ') && !url.startsWith('http')) {
221
+ malformed.push(fullMatch);
222
+ }
223
+ }
224
+ return malformed;
225
+ }
226
+ }
227
+ // ============================================================================
228
+ // CONFIG.YAML MANAGER
229
+ // ============================================================================
230
+ /**
231
+ * OpenSpec config.yaml manager
232
+ */
233
+ export class OpenSpecConfigManager {
234
+ configPath;
235
+ openspecRoot;
236
+ constructor(projectRoot) {
237
+ this.openspecRoot = join(projectRoot, OPENSPEC_DIR);
238
+ this.configPath = join(this.openspecRoot, OPENSPEC_CONFIG_FILENAME);
239
+ }
240
+ /**
241
+ * Check if OpenSpec is initialized
242
+ */
243
+ async isInitialized() {
244
+ try {
245
+ await access(this.openspecRoot);
246
+ return true;
247
+ }
248
+ catch {
249
+ return false;
250
+ }
251
+ }
252
+ /**
253
+ * Check if config.yaml exists
254
+ */
255
+ async hasConfig() {
256
+ try {
257
+ await access(this.configPath);
258
+ return true;
259
+ }
260
+ catch {
261
+ return false;
262
+ }
263
+ }
264
+ /**
265
+ * Read existing config.yaml
266
+ */
267
+ async readConfig() {
268
+ try {
269
+ const content = await readFile(this.configPath, 'utf-8');
270
+ return parseYaml(content);
271
+ }
272
+ catch {
273
+ return null;
274
+ }
275
+ }
276
+ /**
277
+ * Write config.yaml, preserving user content
278
+ */
279
+ async writeConfig(config) {
280
+ await mkdir(this.openspecRoot, { recursive: true });
281
+ const content = stringifyYaml(config, { lineWidth: 100 });
282
+ await writeFile(this.configPath, content, 'utf-8');
283
+ logger.success(`Updated ${this.configPath}`);
284
+ }
285
+ /**
286
+ * Update config with openlore metadata while preserving user content
287
+ */
288
+ async updateWithOpenLoreMetadata(metadata, detectedContext, options = {
289
+ preserveUserContext: true,
290
+ appendDetectedInfo: true,
291
+ version: '1.0.0',
292
+ }) {
293
+ let config = await this.readConfig();
294
+ if (!config) {
295
+ config = {
296
+ schema: 'spec-driven',
297
+ };
298
+ }
299
+ // Add openlore metadata
300
+ config['openlore'] = metadata;
301
+ // Update context if we have detected info and user approves
302
+ if (detectedContext && options.appendDetectedInfo) {
303
+ config.context = this.buildContext(config.context, detectedContext, options.preserveUserContext);
304
+ }
305
+ await this.writeConfig(config);
306
+ return config;
307
+ }
308
+ /**
309
+ * Build context string combining user and detected info
310
+ */
311
+ buildContext(existingContext, detected, preserveUser) {
312
+ const lines = [];
313
+ // Preserve user context if it exists
314
+ if (preserveUser && existingContext) {
315
+ lines.push('# User-provided context (preserved)');
316
+ lines.push(existingContext.trim());
317
+ lines.push('');
318
+ }
319
+ // Add auto-detected context
320
+ lines.push('# Auto-detected by openlore');
321
+ lines.push(`Tech stack: ${detected.techStack}`);
322
+ lines.push(`Architecture: ${detected.architecture}`);
323
+ lines.push(`Domains: ${detected.domains.join(', ')}`);
324
+ if (detected.patterns.length > 0) {
325
+ lines.push(`Key patterns: ${detected.patterns.join(', ')}`);
326
+ }
327
+ return lines.join('\n');
328
+ }
329
+ /**
330
+ * Get existing user context from config
331
+ */
332
+ async getUserContext() {
333
+ const config = await this.readConfig();
334
+ return config?.context ?? null;
335
+ }
336
+ /**
337
+ * Get existing domains from specs directory
338
+ */
339
+ async getExistingDomains() {
340
+ const specsDir = join(this.openspecRoot, 'specs');
341
+ try {
342
+ const entries = await readdir(specsDir, { withFileTypes: true });
343
+ return entries
344
+ .filter(e => e.isDirectory())
345
+ .map(e => e.name)
346
+ .filter(name => !['overview', 'architecture', 'api'].includes(name));
347
+ }
348
+ catch {
349
+ return [];
350
+ }
351
+ }
352
+ }
353
+ // ============================================================================
354
+ // CONTEXT INJECTION
355
+ // ============================================================================
356
+ /**
357
+ * Build detected context from analysis results
358
+ */
359
+ export function buildDetectedContext(survey) {
360
+ // Build tech stack description
361
+ const techStack = [survey.primaryLanguage, ...survey.frameworks].join(', ');
362
+ // Build architecture description
363
+ const archPatterns = {
364
+ layered: 'Layered (routes → controllers → services → repositories)',
365
+ hexagonal: 'Hexagonal/Ports & Adapters',
366
+ microservices: 'Microservices',
367
+ monolith: 'Monolithic',
368
+ serverless: 'Serverless',
369
+ 'event-driven': 'Event-Driven',
370
+ mvc: 'Model-View-Controller',
371
+ other: 'Custom architecture',
372
+ };
373
+ const architecture = archPatterns[survey.architecturePattern] || survey.architecturePattern;
374
+ // Detect common patterns from frameworks
375
+ const patterns = [];
376
+ if (survey.frameworks.some(f => f.toLowerCase().includes('typeorm') || f.toLowerCase().includes('prisma'))) {
377
+ patterns.push('Repository pattern');
378
+ }
379
+ if (survey.frameworks.some(f => f.toLowerCase().includes('inversify') || f.toLowerCase().includes('tsyringe'))) {
380
+ patterns.push('Dependency injection');
381
+ }
382
+ if (survey.frameworks.some(f => f.toLowerCase().includes('express') || f.toLowerCase().includes('fastify'))) {
383
+ patterns.push('Middleware pipeline');
384
+ }
385
+ if (survey.frameworks.some(f => f.toLowerCase().includes('react') || f.toLowerCase().includes('vue'))) {
386
+ patterns.push('Component-based UI');
387
+ }
388
+ return {
389
+ techStack,
390
+ architecture,
391
+ domains: survey.suggestedDomains,
392
+ patterns,
393
+ };
394
+ }
395
+ // ============================================================================
396
+ // DOMAIN NAMING
397
+ // ============================================================================
398
+ /**
399
+ * Normalize domain name to OpenSpec conventions
400
+ */
401
+ export function normalizeDomainName(name) {
402
+ return name
403
+ .toLowerCase()
404
+ .replace(/[^a-z0-9]+/g, '-')
405
+ .replace(/^-+|-+$/g, '')
406
+ .replace(/--+/g, '-');
407
+ }
408
+ /**
409
+ * Check if domain name follows conventions
410
+ */
411
+ export function isValidDomainName(name) {
412
+ // Must be lowercase kebab-case
413
+ if (!/^[a-z][a-z0-9-]*[a-z0-9]$/.test(name) && !/^[a-z]$/.test(name)) {
414
+ return false;
415
+ }
416
+ // Avoid generic names
417
+ const genericNames = ['misc', 'other', 'utils', 'common', 'shared', 'general', 'helpers'];
418
+ if (genericNames.includes(name)) {
419
+ return false;
420
+ }
421
+ return true;
422
+ }
423
+ /**
424
+ * Match suggested domains against existing domains
425
+ */
426
+ export function matchExistingDomains(suggestedDomains, existingDomains) {
427
+ const matches = new Map();
428
+ for (const suggested of suggestedDomains) {
429
+ const normalized = normalizeDomainName(suggested);
430
+ // Exact match
431
+ if (existingDomains.includes(normalized)) {
432
+ matches.set(suggested, normalized);
433
+ continue;
434
+ }
435
+ // Partial match (suggested is substring or vice versa)
436
+ for (const existing of existingDomains) {
437
+ if (existing.includes(normalized) || normalized.includes(existing)) {
438
+ matches.set(suggested, existing);
439
+ break;
440
+ }
441
+ }
442
+ }
443
+ return matches;
444
+ }
445
+ // ============================================================================
446
+ // FULL SPEC VALIDATION
447
+ // ============================================================================
448
+ /**
449
+ * Validate a complete spec file
450
+ */
451
+ export function validateFullSpec(content) {
452
+ const validator = new OpenSpecValidator();
453
+ const result = validator.validateSpecStructure(content);
454
+ // Also validate all requirements in the spec
455
+ const requirementBlocks = content.match(/###\s+Requirement:[^\n]+[\s\S]*?(?=###\s+Requirement:|## |$)/g) || [];
456
+ for (const block of requirementBlocks) {
457
+ const reqResult = validator.validateRequirementFormat(block);
458
+ result.warnings.push(...reqResult.warnings);
459
+ result.errors.push(...reqResult.errors);
460
+ }
461
+ // Validate all scenarios
462
+ const scenarioBlocks = content.match(/####\s+Scenario:[^\n]+[\s\S]*?(?=####\s+Scenario:|###\s+Requirement:|## |$)/g) || [];
463
+ for (const block of scenarioBlocks) {
464
+ const scenResult = validator.validateScenarioFormat(block);
465
+ result.warnings.push(...scenResult.warnings);
466
+ result.errors.push(...scenResult.errors);
467
+ }
468
+ // Update valid status
469
+ result.valid = result.errors.length === 0;
470
+ return result;
471
+ }
472
+ /**
473
+ * Validate all specs in a directory
474
+ */
475
+ export async function validateSpecsDirectory(specsDir) {
476
+ const results = new Map();
477
+ let allValid = true;
478
+ try {
479
+ const entries = await readdir(specsDir, { withFileTypes: true });
480
+ for (const entry of entries) {
481
+ if (entry.isDirectory()) {
482
+ const specPath = join(specsDir, entry.name, 'spec.md');
483
+ try {
484
+ const content = await readFile(specPath, 'utf-8');
485
+ const result = validateFullSpec(content);
486
+ results.set(entry.name, result);
487
+ if (!result.valid) {
488
+ allValid = false;
489
+ }
490
+ }
491
+ catch {
492
+ // spec.md doesn't exist in this directory
493
+ results.set(entry.name, {
494
+ valid: false,
495
+ errors: ['spec.md not found'],
496
+ warnings: [],
497
+ });
498
+ allValid = false;
499
+ }
500
+ }
501
+ }
502
+ }
503
+ catch {
504
+ // specs directory doesn't exist
505
+ return {
506
+ valid: false,
507
+ results: new Map([['specs', { valid: false, errors: ['specs directory not found'], warnings: [] }]]),
508
+ };
509
+ }
510
+ return { valid: allValid, results };
511
+ }
512
+ // ============================================================================
513
+ // CONVENIENCE EXPORTS
514
+ // ============================================================================
515
+ /**
516
+ * Create a new OpenSpec compatibility helper
517
+ */
518
+ export function createOpenSpecCompat(projectRoot) {
519
+ return {
520
+ validator: new OpenSpecValidator(),
521
+ configManager: new OpenSpecConfigManager(projectRoot),
522
+ };
523
+ }
524
+ //# sourceMappingURL=openspec-compat.js.map