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,202 @@
1
+ /**
2
+ * anti-laziness.ts
3
+ *
4
+ * Plugin OpenCode — Prévention de l'arrêt prématuré sur tâches longues.
5
+ *
6
+ * Problème ciblé :
7
+ * Mistral Small / Devstral s'arrêtent dès qu'une sous-tâche est terminée
8
+ * même si le plan global n'est pas terminé.
9
+ *
10
+ * Mécanisme :
11
+ * 1. `todo.updated` event → capture le plan dès que l'agent le crée/met à jour.
12
+ * 2. `session.idle` event → au moment où l'agent s'arrête, vérifie si des
13
+ * tâches sont incomplètes et réinjecte un prompt de continuation.
14
+ * 3. `experimental.session.compacting` → préserve le plan en mémoire lors des
15
+ * compactions de contexte pour éviter que l'agent oublie ses tâches.
16
+ *
17
+ * Safeguards :
18
+ * - MAX_CONTINUATIONS : évite une boucle infinie si le modèle est bloqué.
19
+ * - IDLE_DEBOUNCE_MS : ignore les idle très courts (transitions internes).
20
+ *
21
+ * Placer dans : .opencode/plugins/anti-laziness.ts
22
+ */
23
+
24
+ import type { Plugin } from "@opencode-ai/plugin"
25
+
26
+ // ─── Config ──────────────────────────────────────────────────────────────────
27
+
28
+ const MAX_CONTINUATIONS = 8
29
+ const IDLE_DEBOUNCE_MS = 1500
30
+ const IDLE_CHECK_DELAY_MS = 800
31
+
32
+ // ─── Types ───────────────────────────────────────────────────────────────────
33
+
34
+ interface TodoItem {
35
+ id: string
36
+ content: string
37
+ status: "pending" | "in_progress" | "completed"
38
+ priority?: "high" | "medium" | "low"
39
+ }
40
+
41
+ interface SessionState {
42
+ plan: TodoItem[]
43
+ continuationCount: number
44
+ lastIdleAt: number
45
+ }
46
+
47
+ // ─── Plugin ──────────────────────────────────────────────────────────────────
48
+
49
+ export const AntiLazinessPlugin: Plugin = async ({ client }) => {
50
+ const sessions = new Map<string, SessionState>()
51
+
52
+ // ─── Helpers ───────────────────────────────────────────────────────────────
53
+
54
+ function getOrCreate(sessionId: string): SessionState {
55
+ if (!sessions.has(sessionId)) {
56
+ sessions.set(sessionId, { plan: [], continuationCount: 0, lastIdleAt: 0 })
57
+ }
58
+ return sessions.get(sessionId)!
59
+ }
60
+
61
+ function pendingTasks(state: SessionState): TodoItem[] {
62
+ return state.plan.filter(t => t.status === "pending" || t.status === "in_progress")
63
+ }
64
+
65
+ function buildContinuationPrompt(state: SessionState, pending: TodoItem[]): string {
66
+ const done = state.plan.filter(t => t.status === "completed")
67
+ const pendingList = pending
68
+ .map((t, i) => {
69
+ const marker = t.status === "in_progress" ? "⏳" : "◻"
70
+ return ` ${marker} ${i + 1}. ${t.content}${t.priority ? ` [${t.priority}]` : ""}`
71
+ })
72
+ .join("\n")
73
+ const doneList = done.length > 0
74
+ ? done.map(t => ` ✓ ${t.content}`).join("\n")
75
+ : " (none yet)"
76
+
77
+ return [
78
+ `⚠️ TASK NOT COMPLETE — Continuation required (${state.continuationCount + 1}/${MAX_CONTINUATIONS})`,
79
+ ``,
80
+ `Progress: ${done.length}/${state.plan.length} tasks completed.`,
81
+ ``,
82
+ `Completed:`,
83
+ doneList,
84
+ ``,
85
+ `Still pending (${pending.length} task${pending.length > 1 ? "s" : ""}):`,
86
+ pendingList,
87
+ ``,
88
+ `You stopped before finishing the full plan. Continue immediately with the next pending task.`,
89
+ `Do NOT summarize or declare "task completed" until ALL tasks above are marked done.`,
90
+ `Start with the first ◻ task now.`,
91
+ ].join("\n")
92
+ }
93
+
94
+ // ─── Hooks ─────────────────────────────────────────────────────────────────
95
+
96
+ return {
97
+ // ── 1. Capture du plan via l'event todo.updated ──────────────────────────
98
+ //
99
+ // OpenCode émet todo.updated chaque fois que l'agent crée ou met à jour
100
+ // sa todo list — plus fiable que d'intercepter tool.execute.after sur todowrite.
101
+ //
102
+ event: async ({ event }: any) => {
103
+ // Capture / mise à jour du plan
104
+ if (event.type === "todo.updated") {
105
+ const state = getOrCreate(event.sessionID)
106
+ state.plan = (event.todos ?? []) as TodoItem[]
107
+ await client.app.log({
108
+ body: {
109
+ service: "anti-laziness",
110
+ level: "info",
111
+ message: `Plan updated: ${state.plan.length} tasks, ${pendingTasks(state).length} pending`,
112
+ },
113
+ })
114
+ return
115
+ }
116
+
117
+ // ── 2. Détection d'arrêt prématuré ──────────────────────────────────
118
+ if (event.type === "session.idle") {
119
+ const state = sessions.get(event.sessionID)
120
+ if (!state || state.plan.length === 0) return
121
+
122
+ const now = Date.now()
123
+ if (now - state.lastIdleAt < IDLE_DEBOUNCE_MS) return
124
+ state.lastIdleAt = now
125
+
126
+ // Laisser le modèle finir d'écrire
127
+ await new Promise(r => setTimeout(r, IDLE_CHECK_DELAY_MS))
128
+
129
+ const pending = pendingTasks(state)
130
+
131
+ if (pending.length === 0) {
132
+ sessions.delete(event.sessionID)
133
+ await client.app.log({
134
+ body: { service: "anti-laziness", level: "info",
135
+ message: `All tasks completed for session ${event.sessionID}` },
136
+ })
137
+ return
138
+ }
139
+
140
+ if (state.continuationCount >= MAX_CONTINUATIONS) {
141
+ await client.app.log({
142
+ body: { service: "anti-laziness", level: "warn",
143
+ message: `Max continuations (${MAX_CONTINUATIONS}) reached — human intervention needed`,
144
+ extra: { pending: pending.map(t => t.content) },
145
+ },
146
+ })
147
+ return
148
+ }
149
+
150
+ state.continuationCount++
151
+ const prompt = buildContinuationPrompt(state, pending)
152
+
153
+ await client.app.log({
154
+ body: { service: "anti-laziness", level: "info",
155
+ message: `Injecting continuation ${state.continuationCount}/${MAX_CONTINUATIONS} — ${pending.length} task(s) remaining`,
156
+ },
157
+ })
158
+
159
+ try {
160
+ await client.session.prompt({
161
+ path: { id: event.sessionID },
162
+ body: { parts: [{ type: "text", text: prompt }] },
163
+ })
164
+ } catch (err: any) {
165
+ await client.app.log({
166
+ body: { service: "anti-laziness", level: "error",
167
+ message: `session.prompt failed: ${err.message}` },
168
+ })
169
+ }
170
+ return
171
+ }
172
+
173
+ // ── 3. Nettoyage à la suppression de session ─────────────────────────
174
+ if (event.type === "session.deleted") {
175
+ sessions.delete(event.sessionID)
176
+ }
177
+ },
178
+
179
+ // ── 4. Préserver le plan lors des compactions de contexte ────────────────
180
+ //
181
+ // Évite que l'agent oublie ses tâches en cours quand le contexte est compressé.
182
+ //
183
+ "experimental.session.compacting": async (input: any, output: any) => {
184
+ const state = sessions.get(input.sessionID)
185
+ if (!state || state.plan.length === 0) return
186
+
187
+ const pending = pendingTasks(state)
188
+ if (pending.length === 0) return
189
+
190
+ output.context.push(
191
+ "## ACTIVE TASK PLAN — DO NOT STOP EARLY",
192
+ "",
193
+ `Progress: ${state.plan.length - pending.length}/${state.plan.length} tasks done.`,
194
+ "",
195
+ "Still pending:",
196
+ ...pending.map(t => `- [${t.status}] ${t.content}${t.priority ? ` [${t.priority}]` : ""}`),
197
+ "",
198
+ "Continue with pending tasks. Do NOT declare the session complete until all tasks are done.",
199
+ )
200
+ },
201
+ }
202
+ }
@@ -0,0 +1,116 @@
1
+ /**
2
+ * openlore-context-injector-helpers.ts
3
+ *
4
+ * Pure helper functions extracted from openlore-context-injector.ts so they
5
+ * can be exported for testing without exposing them as OpenCode Plugin symbols.
6
+ *
7
+ * OpenCode loads every export from a plugin file and tries to call it as a
8
+ * Plugin — exporting plain helpers directly from the plugin file causes a
9
+ * crash when OpenCode calls fileToSpecDomain(pluginContext) and reaches
10
+ * `for (const domain of domains)` with domains = undefined.
11
+ * This companion file is the safe export surface for unit tests.
12
+ */
13
+
14
+ import { readdirSync, readFileSync } from 'fs';
15
+ import { join } from 'path';
16
+
17
+ // ─── Config ──────────────────────────────────────────────────────────────────
18
+
19
+ /** Taille max d'une spec injectée en compaction (pour éviter le bloat). */
20
+ export const MAX_SPEC_CHARS = 3000;
21
+
22
+ /** Nb max de specs complètes injectées en compaction. */
23
+ export const MAX_FULL_SPECS = 4;
24
+
25
+ // ─── Types ────────────────────────────────────────────────────────────────────
26
+
27
+ export interface SpecDomain {
28
+ name: string;
29
+ path: string; // chemin absolu vers spec.md
30
+ purpose: string; // première ligne du ## Purpose
31
+ }
32
+
33
+ // ─── loadSpecDomains ─────────────────────────────────────────────────────────
34
+
35
+ /** Lit l'index des domaines OpenSpec depuis openspec/specs/. */
36
+ export function loadSpecDomains(rootDir = process.cwd()): SpecDomain[] {
37
+ const specsDir = join(rootDir, 'openspec', 'specs');
38
+ try {
39
+ const dirs = readdirSync(specsDir, { withFileTypes: true })
40
+ .filter((d) => d.isDirectory())
41
+ .map((d) => d.name);
42
+
43
+ return dirs.flatMap((name) => {
44
+ const specPath = join(specsDir, name, 'spec.md');
45
+ try {
46
+ const content = readFileSync(specPath, 'utf-8');
47
+ const purposeMatch = content.match(/^## Purpose\s*\n+(.+)/m);
48
+ const purpose = purposeMatch
49
+ ? purposeMatch[1].replace(/\[PARTIAL SPEC[^\]]*\]\s*/g, '').trim()
50
+ : '';
51
+ return [{ name, path: specPath, purpose }];
52
+ } catch {
53
+ return [];
54
+ }
55
+ });
56
+ } catch {
57
+ return [];
58
+ }
59
+ }
60
+
61
+ // ─── readSpec ────────────────────────────────────────────────────────────────
62
+
63
+ /** Lit le contenu d'une spec, tronqué à maxChars. */
64
+ export function readSpec(domain: SpecDomain, maxChars = MAX_SPEC_CHARS): string {
65
+ try {
66
+ const content = readFileSync(domain.path, 'utf-8');
67
+ if (content.length <= maxChars) return content;
68
+ const truncated = content.slice(0, maxChars);
69
+ const lastSection = truncated.lastIndexOf('\n##');
70
+ return (
71
+ (lastSection > 0 ? truncated.slice(0, lastSection) : truncated) +
72
+ `\n\n… (spec truncated — use get_spec ${domain.name} for full content)`
73
+ );
74
+ } catch {
75
+ return '';
76
+ }
77
+ }
78
+
79
+ // ─── fileToSpecDomain ────────────────────────────────────────────────────────
80
+
81
+ /**
82
+ * Mappe un chemin de fichier source vers un domaine OpenSpec probable.
83
+ * Utilise le mapping.json si disponible, sinon heuristique par répertoire.
84
+ */
85
+ export function fileToSpecDomain(
86
+ filePath: string,
87
+ domains: SpecDomain[],
88
+ rootDir = process.cwd()
89
+ ): string | null {
90
+ try {
91
+ const raw = readFileSync(join(rootDir, '.openlore', 'analysis', 'mapping.json'), 'utf-8');
92
+ const mapping = JSON.parse(raw);
93
+ const entries: any[] = Array.isArray(mapping) ? mapping : Object.values(mapping);
94
+ const match = entries.find(
95
+ (e: any) =>
96
+ e.file === filePath ||
97
+ e.filePath === filePath ||
98
+ (Array.isArray(e.files) && e.files.includes(filePath))
99
+ );
100
+ if (match?.domain || match?.spec) return match.domain ?? match.spec;
101
+ } catch {
102
+ /* mapping non disponible */
103
+ }
104
+
105
+ for (const domain of domains) {
106
+ if (filePath.toLowerCase().includes(domain.name.toLowerCase())) return domain.name;
107
+ }
108
+
109
+ const parts = filePath.split('/');
110
+ for (const part of parts) {
111
+ const match = domains.find((d) => d.name === part);
112
+ if (match) return match.name;
113
+ }
114
+
115
+ return null;
116
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * openlore-decision-extractor-helpers.ts
3
+ *
4
+ * Pure helper functions extracted from openlore-decision-extractor.ts so they
5
+ * can be exported for testing without exposing them as OpenCode Plugin symbols.
6
+ *
7
+ * OpenCode loads every export from a plugin file and tries to call it as a
8
+ * Plugin — exporting plain helpers directly from the plugin file causes a
9
+ * null-deref on S.auth at TUI bootstrap. This companion file is the safe
10
+ * export surface for unit tests.
11
+ */
12
+
13
+ import { readFileSync } from 'fs';
14
+ import { join } from 'path';
15
+
16
+ // ─── Thresholds ───────────────────────────────────────────────────────────────
17
+
18
+ export const HUB_INDEGREE = 3; // ≥ 3 files import this file
19
+ export const HIGH_PAGERANK = 0.4; // normalised PageRank ≥ 40 %
20
+ export const HIGH_FILE_SCORE = 0.65; // significance score ≥ 65 %
21
+
22
+ // ─── Types ────────────────────────────────────────────────────────────────────
23
+
24
+ export interface FileScore {
25
+ inDegree: number;
26
+ pageRank: number;
27
+ fileScore: number;
28
+ isHub: boolean;
29
+ }
30
+
31
+ // ─── scoreFromDepGraph ────────────────────────────────────────────────────────
32
+
33
+ /**
34
+ * Read the dep-graph and score a file by its structural centrality.
35
+ * Returns null if the file is not in the graph (new file — treat as unknown).
36
+ */
37
+ export function scoreFromDepGraph(filePath: string, rootDir = process.cwd()): FileScore | null {
38
+ try {
39
+ const raw = readFileSync(
40
+ join(rootDir, '.openlore', 'analysis', 'dependency-graph.json'),
41
+ 'utf-8'
42
+ );
43
+ const graph = JSON.parse(raw);
44
+ const nodes: any[] = graph.nodes ?? [];
45
+
46
+ // Match by relative path or absolute path suffix
47
+ const node = nodes.find(
48
+ (n) => n.file?.path === filePath || n.id === filePath || n.file?.path?.endsWith(filePath)
49
+ );
50
+ if (!node) return null;
51
+
52
+ const inDegree: number = node.metrics?.inDegree ?? 0;
53
+ const pageRank: number = node.metrics?.pageRank ?? 0;
54
+ const fileScore: number = node.file?.score ?? 0;
55
+
56
+ return {
57
+ inDegree,
58
+ pageRank,
59
+ fileScore,
60
+ isHub: inDegree >= HUB_INDEGREE || pageRank >= HIGH_PAGERANK || fileScore >= HIGH_FILE_SCORE,
61
+ };
62
+ } catch {
63
+ return null;
64
+ }
65
+ }
@@ -0,0 +1,211 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdtemp, mkdir, writeFile, rm } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import {
6
+ loadSpecDomains,
7
+ readSpec,
8
+ fileToSpecDomain,
9
+ } from './lib/openlore-context-injector-helpers.ts';
10
+
11
+ // ─── Fixtures ─────────────────────────────────────────────────────────────────
12
+
13
+ const SPEC_CONTENT = `# Auth Specification
14
+
15
+ > Generated by openlore
16
+
17
+ ## Purpose
18
+
19
+ Handles authentication and session management.
20
+
21
+ ## Requirements
22
+
23
+ ### Requirement: Login
24
+
25
+ The system SHALL authenticate users via JWT.
26
+
27
+ #### Scenario: ValidCredentials
28
+ - **GIVEN** valid credentials
29
+ - **WHEN** login is called
30
+ - **THEN** a JWT is returned
31
+ `;
32
+
33
+ async function createSpec(tmpDir: string, domain: string, content = SPEC_CONTENT) {
34
+ const specDir = join(tmpDir, 'openspec', 'specs', domain);
35
+ await mkdir(specDir, { recursive: true });
36
+ await writeFile(join(specDir, 'spec.md'), content);
37
+ }
38
+
39
+ // ─── loadSpecDomains ──────────────────────────────────────────────────────────
40
+
41
+ describe('loadSpecDomains', () => {
42
+ let tmpDir: string;
43
+
44
+ beforeEach(async () => {
45
+ tmpDir = await mkdtemp(join(tmpdir(), 'openlore-injector-test-'));
46
+ });
47
+
48
+ afterEach(async () => {
49
+ await rm(tmpDir, { recursive: true, force: true });
50
+ });
51
+
52
+ it('returns empty array when openspec/specs/ does not exist', () => {
53
+ const result = loadSpecDomains(tmpDir);
54
+ expect(result).toEqual([]);
55
+ });
56
+
57
+ it('returns empty array when openspec/specs/ has no subdirectories', async () => {
58
+ await mkdir(join(tmpDir, 'openspec', 'specs'), { recursive: true });
59
+ const result = loadSpecDomains(tmpDir);
60
+ expect(result).toEqual([]);
61
+ });
62
+
63
+ it('loads a single spec domain', async () => {
64
+ await createSpec(tmpDir, 'auth');
65
+ const result = loadSpecDomains(tmpDir);
66
+ expect(result).toHaveLength(1);
67
+ expect(result[0].name).toBe('auth');
68
+ expect(result[0].purpose).toBe('Handles authentication and session management.');
69
+ expect(result[0].path).toContain('spec.md');
70
+ });
71
+
72
+ it('loads multiple spec domains', async () => {
73
+ await createSpec(tmpDir, 'auth');
74
+ await createSpec(tmpDir, 'api', `# Api\n\n## Purpose\n\nProvides REST endpoints.\n`);
75
+ const result = loadSpecDomains(tmpDir);
76
+ expect(result).toHaveLength(2);
77
+ const names = result.map((d) => d.name).sort();
78
+ expect(names).toEqual(['api', 'auth']);
79
+ });
80
+
81
+ it('skips a domain with missing spec.md', async () => {
82
+ await mkdir(join(tmpDir, 'openspec', 'specs', 'empty-domain'), { recursive: true });
83
+ await createSpec(tmpDir, 'auth');
84
+ const result = loadSpecDomains(tmpDir);
85
+ expect(result).toHaveLength(1);
86
+ expect(result[0].name).toBe('auth');
87
+ });
88
+
89
+ it('extracts purpose even with [PARTIAL SPEC] prefix', async () => {
90
+ await createSpec(
91
+ tmpDir,
92
+ 'analyzer',
93
+ `# Analyzer\n\n## Purpose\n\n[PARTIAL SPEC — file too large] Analyzes codebase.\n`
94
+ );
95
+ const result = loadSpecDomains(tmpDir);
96
+ expect(result[0].purpose).toBe('Analyzes codebase.');
97
+ });
98
+
99
+ it('returns empty purpose when ## Purpose section is missing', async () => {
100
+ await createSpec(tmpDir, 'nopurpose', `# No Purpose\n\n## Requirements\n\nSomething.\n`);
101
+ const result = loadSpecDomains(tmpDir);
102
+ expect(result[0].purpose).toBe('');
103
+ });
104
+ });
105
+
106
+ // ─── readSpec ─────────────────────────────────────────────────────────────────
107
+
108
+ describe('readSpec', () => {
109
+ let tmpDir: string;
110
+
111
+ beforeEach(async () => {
112
+ tmpDir = await mkdtemp(join(tmpdir(), 'openlore-injector-test-'));
113
+ });
114
+
115
+ afterEach(async () => {
116
+ await rm(tmpDir, { recursive: true, force: true });
117
+ });
118
+
119
+ it('returns empty string when spec file does not exist', () => {
120
+ const domain = { name: 'auth', path: join(tmpDir, 'nonexistent.md'), purpose: '' };
121
+ expect(readSpec(domain)).toBe('');
122
+ });
123
+
124
+ it('returns full content when under maxChars', async () => {
125
+ await createSpec(tmpDir, 'auth');
126
+ const [domain] = loadSpecDomains(tmpDir);
127
+ const result = readSpec(domain);
128
+ expect(result).toBe(SPEC_CONTENT);
129
+ });
130
+
131
+ it('truncates at a section boundary when over maxChars', async () => {
132
+ const longContent = SPEC_CONTENT + '\n## Section2\n\n' + 'x'.repeat(5000);
133
+ await createSpec(tmpDir, 'auth', longContent);
134
+ const [domain] = loadSpecDomains(tmpDir);
135
+ const result = readSpec(domain, 200);
136
+ expect(result).toContain('spec truncated');
137
+ expect(result.length).toBeLessThan(longContent.length);
138
+ });
139
+
140
+ it('truncates without section boundary when content has no ## headers after truncation point', async () => {
141
+ const flatContent = 'a'.repeat(500);
142
+ await createSpec(tmpDir, 'auth', flatContent);
143
+ const [domain] = loadSpecDomains(tmpDir);
144
+ const result = readSpec(domain, 100);
145
+ expect(result).toContain('spec truncated');
146
+ });
147
+ });
148
+
149
+ // ─── fileToSpecDomain ─────────────────────────────────────────────────────────
150
+
151
+ describe('fileToSpecDomain', () => {
152
+ let tmpDir: string;
153
+ const domains = [
154
+ { name: 'auth', path: '', purpose: '' },
155
+ { name: 'api', path: '', purpose: '' },
156
+ { name: 'analyzer', path: '', purpose: '' },
157
+ ];
158
+
159
+ beforeEach(async () => {
160
+ tmpDir = await mkdtemp(join(tmpdir(), 'openlore-injector-test-'));
161
+ await mkdir(join(tmpDir, '.openlore', 'analysis'), { recursive: true });
162
+ });
163
+
164
+ afterEach(async () => {
165
+ await rm(tmpDir, { recursive: true, force: true });
166
+ });
167
+
168
+ it('returns null when no match is found', () => {
169
+ const result = fileToSpecDomain('src/unknown/mystery.ts', domains, tmpDir);
170
+ expect(result).toBeNull();
171
+ });
172
+
173
+ it('matches by domain name in file path (heuristic)', () => {
174
+ const result = fileToSpecDomain('src/auth/middleware.ts', domains, tmpDir);
175
+ expect(result).toBe('auth');
176
+ });
177
+
178
+ it('matches by parent directory name', () => {
179
+ const result = fileToSpecDomain('src/api/routes.ts', domains, tmpDir);
180
+ expect(result).toBe('api');
181
+ });
182
+
183
+ it('uses mapping.json when available (array form)', async () => {
184
+ const mapping = [{ file: 'src/core/analyzer/engine.ts', domain: 'analyzer' }];
185
+ await writeFile(join(tmpDir, '.openlore', 'analysis', 'mapping.json'), JSON.stringify(mapping));
186
+ const result = fileToSpecDomain('src/core/analyzer/engine.ts', domains, tmpDir);
187
+ expect(result).toBe('analyzer');
188
+ });
189
+
190
+ it('uses mapping.json when available (object form)', async () => {
191
+ const mapping = {
192
+ 'req-1': { filePath: 'src/api/server.ts', spec: 'api' },
193
+ };
194
+ await writeFile(join(tmpDir, '.openlore', 'analysis', 'mapping.json'), JSON.stringify(mapping));
195
+ const result = fileToSpecDomain('src/api/server.ts', domains, tmpDir);
196
+ expect(result).toBe('api');
197
+ });
198
+
199
+ it('falls back to heuristic when mapping.json has no match', async () => {
200
+ const mapping = [{ file: 'src/other.ts', domain: 'api' }];
201
+ await writeFile(join(tmpDir, '.openlore', 'analysis', 'mapping.json'), JSON.stringify(mapping));
202
+ const result = fileToSpecDomain('src/auth/service.ts', domains, tmpDir);
203
+ expect(result).toBe('auth');
204
+ });
205
+
206
+ it('handles malformed mapping.json without throwing', async () => {
207
+ await writeFile(join(tmpDir, '.openlore', 'analysis', 'mapping.json'), 'not valid json');
208
+ const result = fileToSpecDomain('src/auth/service.ts', domains, tmpDir);
209
+ expect(result).toBe('auth');
210
+ });
211
+ });