@rryando/arcs 3.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 (370) hide show
  1. package/README.md +448 -0
  2. package/dist/cli/arcs-orchestrate-caveman.d.ts +16 -0
  3. package/dist/cli/arcs-orchestrate-caveman.d.ts.map +1 -0
  4. package/dist/cli/arcs-orchestrate-caveman.js +109 -0
  5. package/dist/cli/arcs-orchestrate-caveman.js.map +1 -0
  6. package/dist/cli/arcs-orchestrate.d.ts +2 -0
  7. package/dist/cli/arcs-orchestrate.d.ts.map +1 -0
  8. package/dist/cli/arcs-orchestrate.js +431 -0
  9. package/dist/cli/arcs-orchestrate.js.map +1 -0
  10. package/dist/cli/arg-parser.d.ts +20 -0
  11. package/dist/cli/arg-parser.d.ts.map +1 -0
  12. package/dist/cli/arg-parser.js +216 -0
  13. package/dist/cli/arg-parser.js.map +1 -0
  14. package/dist/cli/brief-renderer.d.ts +32 -0
  15. package/dist/cli/brief-renderer.d.ts.map +1 -0
  16. package/dist/cli/brief-renderer.js +67 -0
  17. package/dist/cli/brief-renderer.js.map +1 -0
  18. package/dist/cli/bundle-installer.d.ts +77 -0
  19. package/dist/cli/bundle-installer.d.ts.map +1 -0
  20. package/dist/cli/bundle-installer.js +328 -0
  21. package/dist/cli/bundle-installer.js.map +1 -0
  22. package/dist/cli/command-registry.d.ts +52 -0
  23. package/dist/cli/command-registry.d.ts.map +1 -0
  24. package/dist/cli/command-registry.js +68 -0
  25. package/dist/cli/command-registry.js.map +1 -0
  26. package/dist/cli/commands/batch.d.ts +2 -0
  27. package/dist/cli/commands/batch.d.ts.map +1 -0
  28. package/dist/cli/commands/batch.js +307 -0
  29. package/dist/cli/commands/batch.js.map +1 -0
  30. package/dist/cli/commands/brief.d.ts +2 -0
  31. package/dist/cli/commands/brief.d.ts.map +1 -0
  32. package/dist/cli/commands/brief.js +146 -0
  33. package/dist/cli/commands/brief.js.map +1 -0
  34. package/dist/cli/commands/bundle.d.ts +2 -0
  35. package/dist/cli/commands/bundle.d.ts.map +1 -0
  36. package/dist/cli/commands/bundle.js +90 -0
  37. package/dist/cli/commands/bundle.js.map +1 -0
  38. package/dist/cli/commands/dependency.d.ts +2 -0
  39. package/dist/cli/commands/dependency.d.ts.map +1 -0
  40. package/dist/cli/commands/dependency.js +260 -0
  41. package/dist/cli/commands/dependency.js.map +1 -0
  42. package/dist/cli/commands/diagnostics.d.ts +2 -0
  43. package/dist/cli/commands/diagnostics.d.ts.map +1 -0
  44. package/dist/cli/commands/diagnostics.js +91 -0
  45. package/dist/cli/commands/diagnostics.js.map +1 -0
  46. package/dist/cli/commands/diagram.d.ts +2 -0
  47. package/dist/cli/commands/diagram.d.ts.map +1 -0
  48. package/dist/cli/commands/diagram.js +305 -0
  49. package/dist/cli/commands/diagram.js.map +1 -0
  50. package/dist/cli/commands/done.d.ts +2 -0
  51. package/dist/cli/commands/done.d.ts.map +1 -0
  52. package/dist/cli/commands/done.js +140 -0
  53. package/dist/cli/commands/done.js.map +1 -0
  54. package/dist/cli/commands/graph.d.ts +2 -0
  55. package/dist/cli/commands/graph.d.ts.map +1 -0
  56. package/dist/cli/commands/graph.js +105 -0
  57. package/dist/cli/commands/graph.js.map +1 -0
  58. package/dist/cli/commands/index.d.ts +21 -0
  59. package/dist/cli/commands/index.d.ts.map +1 -0
  60. package/dist/cli/commands/index.js +22 -0
  61. package/dist/cli/commands/index.js.map +1 -0
  62. package/dist/cli/commands/knowledge-search.d.ts +2 -0
  63. package/dist/cli/commands/knowledge-search.d.ts.map +1 -0
  64. package/dist/cli/commands/knowledge-search.js +43 -0
  65. package/dist/cli/commands/knowledge-search.js.map +1 -0
  66. package/dist/cli/commands/knowledge.d.ts +2 -0
  67. package/dist/cli/commands/knowledge.d.ts.map +1 -0
  68. package/dist/cli/commands/knowledge.js +416 -0
  69. package/dist/cli/commands/knowledge.js.map +1 -0
  70. package/dist/cli/commands/loop.d.ts +2 -0
  71. package/dist/cli/commands/loop.d.ts.map +1 -0
  72. package/dist/cli/commands/loop.js +192 -0
  73. package/dist/cli/commands/loop.js.map +1 -0
  74. package/dist/cli/commands/maintenance.d.ts +2 -0
  75. package/dist/cli/commands/maintenance.d.ts.map +1 -0
  76. package/dist/cli/commands/maintenance.js +231 -0
  77. package/dist/cli/commands/maintenance.js.map +1 -0
  78. package/dist/cli/commands/next.d.ts +2 -0
  79. package/dist/cli/commands/next.d.ts.map +1 -0
  80. package/dist/cli/commands/next.js +116 -0
  81. package/dist/cli/commands/next.js.map +1 -0
  82. package/dist/cli/commands/plan.d.ts +2 -0
  83. package/dist/cli/commands/plan.d.ts.map +1 -0
  84. package/dist/cli/commands/plan.js +340 -0
  85. package/dist/cli/commands/plan.js.map +1 -0
  86. package/dist/cli/commands/project-updates.d.ts +2 -0
  87. package/dist/cli/commands/project-updates.d.ts.map +1 -0
  88. package/dist/cli/commands/project-updates.js +243 -0
  89. package/dist/cli/commands/project-updates.js.map +1 -0
  90. package/dist/cli/commands/project.d.ts +2 -0
  91. package/dist/cli/commands/project.d.ts.map +1 -0
  92. package/dist/cli/commands/project.js +362 -0
  93. package/dist/cli/commands/project.js.map +1 -0
  94. package/dist/cli/commands/remember.d.ts +2 -0
  95. package/dist/cli/commands/remember.d.ts.map +1 -0
  96. package/dist/cli/commands/remember.js +70 -0
  97. package/dist/cli/commands/remember.js.map +1 -0
  98. package/dist/cli/commands/status.d.ts +2 -0
  99. package/dist/cli/commands/status.d.ts.map +1 -0
  100. package/dist/cli/commands/status.js +104 -0
  101. package/dist/cli/commands/status.js.map +1 -0
  102. package/dist/cli/commands/task.d.ts +6 -0
  103. package/dist/cli/commands/task.d.ts.map +1 -0
  104. package/dist/cli/commands/task.js +361 -0
  105. package/dist/cli/commands/task.js.map +1 -0
  106. package/dist/cli/commands/utility.d.ts +9 -0
  107. package/dist/cli/commands/utility.d.ts.map +1 -0
  108. package/dist/cli/commands/utility.js +302 -0
  109. package/dist/cli/commands/utility.js.map +1 -0
  110. package/dist/cli/config.d.ts +42 -0
  111. package/dist/cli/config.d.ts.map +1 -0
  112. package/dist/cli/config.js +134 -0
  113. package/dist/cli/config.js.map +1 -0
  114. package/dist/cli/dag-commands.d.ts +7 -0
  115. package/dist/cli/dag-commands.d.ts.map +1 -0
  116. package/dist/cli/dag-commands.js +152 -0
  117. package/dist/cli/dag-commands.js.map +1 -0
  118. package/dist/cli/diagram-renderer.d.ts +26 -0
  119. package/dist/cli/diagram-renderer.d.ts.map +1 -0
  120. package/dist/cli/diagram-renderer.js +118 -0
  121. package/dist/cli/diagram-renderer.js.map +1 -0
  122. package/dist/cli/help-generator.d.ts +21 -0
  123. package/dist/cli/help-generator.d.ts.map +1 -0
  124. package/dist/cli/help-generator.js +100 -0
  125. package/dist/cli/help-generator.js.map +1 -0
  126. package/dist/cli/index.d.ts +8 -0
  127. package/dist/cli/index.d.ts.map +1 -0
  128. package/dist/cli/index.js +95 -0
  129. package/dist/cli/index.js.map +1 -0
  130. package/dist/cli/instructions.d.ts +53 -0
  131. package/dist/cli/instructions.d.ts.map +1 -0
  132. package/dist/cli/instructions.js +219 -0
  133. package/dist/cli/instructions.js.map +1 -0
  134. package/dist/cli/lean-output.d.ts +15 -0
  135. package/dist/cli/lean-output.d.ts.map +1 -0
  136. package/dist/cli/lean-output.js +66 -0
  137. package/dist/cli/lean-output.js.map +1 -0
  138. package/dist/cli/md-renderer.d.ts +6 -0
  139. package/dist/cli/md-renderer.d.ts.map +1 -0
  140. package/dist/cli/md-renderer.js +396 -0
  141. package/dist/cli/md-renderer.js.map +1 -0
  142. package/dist/cli/output-envelope.d.ts +15 -0
  143. package/dist/cli/output-envelope.d.ts.map +1 -0
  144. package/dist/cli/output-envelope.js +61 -0
  145. package/dist/cli/output-envelope.js.map +1 -0
  146. package/dist/cli/setup.d.ts +11 -0
  147. package/dist/cli/setup.d.ts.map +1 -0
  148. package/dist/cli/setup.js +415 -0
  149. package/dist/cli/setup.js.map +1 -0
  150. package/dist/cli/status-dashboard.d.ts +5 -0
  151. package/dist/cli/status-dashboard.d.ts.map +1 -0
  152. package/dist/cli/status-dashboard.js +248 -0
  153. package/dist/cli/status-dashboard.js.map +1 -0
  154. package/dist/index.d.ts +3 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +25 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/retrieval/bm25.d.ts +23 -0
  159. package/dist/retrieval/bm25.d.ts.map +1 -0
  160. package/dist/retrieval/bm25.js +92 -0
  161. package/dist/retrieval/bm25.js.map +1 -0
  162. package/dist/retrieval/cross-project-search.d.ts +30 -0
  163. package/dist/retrieval/cross-project-search.d.ts.map +1 -0
  164. package/dist/retrieval/cross-project-search.js +109 -0
  165. package/dist/retrieval/cross-project-search.js.map +1 -0
  166. package/dist/retrieval/graph-builder.d.ts +6 -0
  167. package/dist/retrieval/graph-builder.d.ts.map +1 -0
  168. package/dist/retrieval/graph-builder.js +196 -0
  169. package/dist/retrieval/graph-builder.js.map +1 -0
  170. package/dist/retrieval/graph-cache.d.ts +15 -0
  171. package/dist/retrieval/graph-cache.d.ts.map +1 -0
  172. package/dist/retrieval/graph-cache.js +66 -0
  173. package/dist/retrieval/graph-cache.js.map +1 -0
  174. package/dist/retrieval/graph-invalidate.d.ts +18 -0
  175. package/dist/retrieval/graph-invalidate.d.ts.map +1 -0
  176. package/dist/retrieval/graph-invalidate.js +23 -0
  177. package/dist/retrieval/graph-invalidate.js.map +1 -0
  178. package/dist/retrieval/graph-retrieval.d.ts +24 -0
  179. package/dist/retrieval/graph-retrieval.d.ts.map +1 -0
  180. package/dist/retrieval/graph-retrieval.js +165 -0
  181. package/dist/retrieval/graph-retrieval.js.map +1 -0
  182. package/dist/retrieval/graph-traverse.d.ts +3 -0
  183. package/dist/retrieval/graph-traverse.d.ts.map +1 -0
  184. package/dist/retrieval/graph-traverse.js +53 -0
  185. package/dist/retrieval/graph-traverse.js.map +1 -0
  186. package/dist/retrieval/graph-types.d.ts +37 -0
  187. package/dist/retrieval/graph-types.d.ts.map +1 -0
  188. package/dist/retrieval/graph-types.js +12 -0
  189. package/dist/retrieval/graph-types.js.map +1 -0
  190. package/dist/retrieval/index-builder.d.ts +21 -0
  191. package/dist/retrieval/index-builder.d.ts.map +1 -0
  192. package/dist/retrieval/index-builder.js +94 -0
  193. package/dist/retrieval/index-builder.js.map +1 -0
  194. package/dist/retrieval/knowledge-selection.d.ts +7 -0
  195. package/dist/retrieval/knowledge-selection.d.ts.map +1 -0
  196. package/dist/retrieval/knowledge-selection.js +80 -0
  197. package/dist/retrieval/knowledge-selection.js.map +1 -0
  198. package/dist/retrieval/task-scoped.d.ts +23 -0
  199. package/dist/retrieval/task-scoped.d.ts.map +1 -0
  200. package/dist/retrieval/task-scoped.js +51 -0
  201. package/dist/retrieval/task-scoped.js.map +1 -0
  202. package/dist/utils/content-assembly.d.ts +44 -0
  203. package/dist/utils/content-assembly.d.ts.map +1 -0
  204. package/dist/utils/content-assembly.js +101 -0
  205. package/dist/utils/content-assembly.js.map +1 -0
  206. package/dist/utils/dag.d.ts +28 -0
  207. package/dist/utils/dag.d.ts.map +1 -0
  208. package/dist/utils/dag.js +68 -0
  209. package/dist/utils/dag.js.map +1 -0
  210. package/dist/utils/diagram-generator.d.ts +17 -0
  211. package/dist/utils/diagram-generator.d.ts.map +1 -0
  212. package/dist/utils/diagram-generator.js +38 -0
  213. package/dist/utils/diagram-generator.js.map +1 -0
  214. package/dist/utils/errors.d.ts +40 -0
  215. package/dist/utils/errors.d.ts.map +1 -0
  216. package/dist/utils/errors.js +83 -0
  217. package/dist/utils/errors.js.map +1 -0
  218. package/dist/utils/file-lock.d.ts +13 -0
  219. package/dist/utils/file-lock.d.ts.map +1 -0
  220. package/dist/utils/file-lock.js +80 -0
  221. package/dist/utils/file-lock.js.map +1 -0
  222. package/dist/utils/git.d.ts +14 -0
  223. package/dist/utils/git.d.ts.map +1 -0
  224. package/dist/utils/git.js +56 -0
  225. package/dist/utils/git.js.map +1 -0
  226. package/dist/utils/graphify-knowledge.d.ts +6 -0
  227. package/dist/utils/graphify-knowledge.d.ts.map +1 -0
  228. package/dist/utils/graphify-knowledge.js +60 -0
  229. package/dist/utils/graphify-knowledge.js.map +1 -0
  230. package/dist/utils/graphify.d.ts +49 -0
  231. package/dist/utils/graphify.d.ts.map +1 -0
  232. package/dist/utils/graphify.js +306 -0
  233. package/dist/utils/graphify.js.map +1 -0
  234. package/dist/utils/json-schemas.d.ts +723 -0
  235. package/dist/utils/json-schemas.d.ts.map +1 -0
  236. package/dist/utils/json-schemas.js +147 -0
  237. package/dist/utils/json-schemas.js.map +1 -0
  238. package/dist/utils/json.d.ts +15 -0
  239. package/dist/utils/json.d.ts.map +1 -0
  240. package/dist/utils/json.js +39 -0
  241. package/dist/utils/json.js.map +1 -0
  242. package/dist/utils/knowledge-store.d.ts +49 -0
  243. package/dist/utils/knowledge-store.d.ts.map +1 -0
  244. package/dist/utils/knowledge-store.js +191 -0
  245. package/dist/utils/knowledge-store.js.map +1 -0
  246. package/dist/utils/loop-state.d.ts +51 -0
  247. package/dist/utils/loop-state.d.ts.map +1 -0
  248. package/dist/utils/loop-state.js +123 -0
  249. package/dist/utils/loop-state.js.map +1 -0
  250. package/dist/utils/paths.d.ts +16 -0
  251. package/dist/utils/paths.d.ts.map +1 -0
  252. package/dist/utils/paths.js +66 -0
  253. package/dist/utils/paths.js.map +1 -0
  254. package/dist/utils/plan-store.d.ts +46 -0
  255. package/dist/utils/plan-store.d.ts.map +1 -0
  256. package/dist/utils/plan-store.js +184 -0
  257. package/dist/utils/plan-store.js.map +1 -0
  258. package/dist/utils/project-documents.d.ts +20 -0
  259. package/dist/utils/project-documents.d.ts.map +1 -0
  260. package/dist/utils/project-documents.js +10 -0
  261. package/dist/utils/project-documents.js.map +1 -0
  262. package/dist/utils/project-memory.d.ts +16 -0
  263. package/dist/utils/project-memory.d.ts.map +1 -0
  264. package/dist/utils/project-memory.js +16 -0
  265. package/dist/utils/project-memory.js.map +1 -0
  266. package/dist/utils/project-resolver.d.ts +28 -0
  267. package/dist/utils/project-resolver.d.ts.map +1 -0
  268. package/dist/utils/project-resolver.js +119 -0
  269. package/dist/utils/project-resolver.js.map +1 -0
  270. package/dist/utils/quick-scan.d.ts +13 -0
  271. package/dist/utils/quick-scan.d.ts.map +1 -0
  272. package/dist/utils/quick-scan.js +156 -0
  273. package/dist/utils/quick-scan.js.map +1 -0
  274. package/dist/utils/schemas.d.ts +13 -0
  275. package/dist/utils/schemas.d.ts.map +1 -0
  276. package/dist/utils/schemas.js +6 -0
  277. package/dist/utils/schemas.js.map +1 -0
  278. package/dist/utils/slug.d.ts +10 -0
  279. package/dist/utils/slug.d.ts.map +1 -0
  280. package/dist/utils/slug.js +18 -0
  281. package/dist/utils/slug.js.map +1 -0
  282. package/dist/utils/stdin.d.ts +6 -0
  283. package/dist/utils/stdin.d.ts.map +1 -0
  284. package/dist/utils/stdin.js +25 -0
  285. package/dist/utils/stdin.js.map +1 -0
  286. package/dist/utils/storage-utils.d.ts +48 -0
  287. package/dist/utils/storage-utils.d.ts.map +1 -0
  288. package/dist/utils/storage-utils.js +175 -0
  289. package/dist/utils/storage-utils.js.map +1 -0
  290. package/dist/utils/task-store.d.ts +49 -0
  291. package/dist/utils/task-store.d.ts.map +1 -0
  292. package/dist/utils/task-store.js +178 -0
  293. package/dist/utils/task-store.js.map +1 -0
  294. package/dist/utils/template.d.ts +15 -0
  295. package/dist/utils/template.d.ts.map +1 -0
  296. package/dist/utils/template.js +27 -0
  297. package/dist/utils/template.js.map +1 -0
  298. package/dist/utils/tool-response.d.ts +37 -0
  299. package/dist/utils/tool-response.d.ts.map +1 -0
  300. package/dist/utils/tool-response.js +44 -0
  301. package/dist/utils/tool-response.js.map +1 -0
  302. package/dist/utils/workflow-policy.d.ts +50 -0
  303. package/dist/utils/workflow-policy.d.ts.map +1 -0
  304. package/dist/utils/workflow-policy.js +111 -0
  305. package/dist/utils/workflow-policy.js.map +1 -0
  306. package/dist/utils/workspace-match.d.ts +35 -0
  307. package/dist/utils/workspace-match.d.ts.map +1 -0
  308. package/dist/utils/workspace-match.js +58 -0
  309. package/dist/utils/workspace-match.js.map +1 -0
  310. package/opencode/arcs/.opencode/plugins/arcs.js +348 -0
  311. package/opencode/arcs/bundle-runtime.json +68 -0
  312. package/opencode/arcs/manifest.json +279 -0
  313. package/opencode/arcs/prompts/arcs-docs.txt +124 -0
  314. package/opencode/arcs/prompts/arcs-orchestrate-caveman.txt +529 -0
  315. package/opencode/arcs/prompts/arcs-orchestrate.txt +437 -0
  316. package/opencode/arcs/prompts/code-reviewer.txt +55 -0
  317. package/opencode/arcs/prompts/devil-advocate.txt +121 -0
  318. package/opencode/arcs/prompts/docs-researcher.txt +54 -0
  319. package/opencode/arcs/prompts/oncall-ops.txt +54 -0
  320. package/opencode/arcs/prompts/qa-analyst.txt +54 -0
  321. package/opencode/arcs/prompts/software-engineer.txt +48 -0
  322. package/opencode/arcs/prompts/system-architect.txt +60 -0
  323. package/opencode/arcs/prompts/tech-architect.txt +54 -0
  324. package/opencode/arcs/skills/brainstorming/SKILL.md +144 -0
  325. package/opencode/arcs/skills/brainstorming/scripts/frame-template.html +214 -0
  326. package/opencode/arcs/skills/brainstorming/scripts/helper.js +88 -0
  327. package/opencode/arcs/skills/brainstorming/scripts/server.js +338 -0
  328. package/opencode/arcs/skills/brainstorming/scripts/start-server.sh +137 -0
  329. package/opencode/arcs/skills/brainstorming/scripts/stop-server.sh +31 -0
  330. package/opencode/arcs/skills/brainstorming/spec-document-reviewer-prompt.md +50 -0
  331. package/opencode/arcs/skills/brainstorming/visual-companion.md +277 -0
  332. package/opencode/arcs/skills/caveman-commit/SKILL.md +51 -0
  333. package/opencode/arcs/skills/code-agent/SKILL.md +58 -0
  334. package/opencode/arcs/skills/deep-pr-review/SKILL.md +191 -0
  335. package/opencode/arcs/skills/deep-pr-review/graphify-diff.md +102 -0
  336. package/opencode/arcs/skills/deep-pr-review/review-template.md +69 -0
  337. package/opencode/arcs/skills/executing-plans/SKILL.md +91 -0
  338. package/opencode/arcs/skills/init-project/SKILL.md +150 -0
  339. package/opencode/arcs/skills/quick-dev/SKILL.md +47 -0
  340. package/opencode/arcs/skills/requesting-code-review/SKILL.md +47 -0
  341. package/opencode/arcs/skills/requesting-code-review/code-reviewer.md +179 -0
  342. package/opencode/arcs/skills/subagent-driven-development/SKILL.md +162 -0
  343. package/opencode/arcs/skills/subagent-driven-development/code-quality-reviewer-prompt.md +53 -0
  344. package/opencode/arcs/skills/subagent-driven-development/implementer-prompt.md +148 -0
  345. package/opencode/arcs/skills/subagent-driven-development/spec-reviewer-prompt.md +85 -0
  346. package/opencode/arcs/skills/systematic-debugging/SKILL.md +174 -0
  347. package/opencode/arcs/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  348. package/opencode/arcs/skills/systematic-debugging/condition-based-waiting.md +115 -0
  349. package/opencode/arcs/skills/systematic-debugging/defense-in-depth.md +122 -0
  350. package/opencode/arcs/skills/systematic-debugging/find-polluter.sh +63 -0
  351. package/opencode/arcs/skills/systematic-debugging/phases-reference.md +168 -0
  352. package/opencode/arcs/skills/systematic-debugging/root-cause-tracing.md +169 -0
  353. package/opencode/arcs/skills/test-driven-development/SKILL.md +72 -0
  354. package/opencode/arcs/skills/test-driven-development/tdd-rationalizations-and-examples.md +157 -0
  355. package/opencode/arcs/skills/test-driven-development/testing-anti-patterns.md +299 -0
  356. package/opencode/arcs/skills/to-diagram/SKILL.md +235 -0
  357. package/opencode/arcs/skills/to-diagram/scripts/manage-diagram.mjs +963 -0
  358. package/opencode/arcs/skills/writing-plans/SKILL.md +179 -0
  359. package/opencode/arcs/skills/writing-plans/plan-document-reviewer-prompt.md +52 -0
  360. package/package.json +60 -0
  361. package/scripts/arcs-cli.mjs +45 -0
  362. package/skills/explore-dag.md +57 -0
  363. package/skills/init-project.md +105 -0
  364. package/skills/orchestrate.md +94 -0
  365. package/skills/update-docs.md +72 -0
  366. package/templates/dependency.md.tmpl +9 -0
  367. package/templates/knowledge.md.tmpl +15 -0
  368. package/templates/project-meta.json.tmpl +13 -0
  369. package/templates/project.md.tmpl +11 -0
  370. package/templates/task.md.tmpl +9 -0
@@ -0,0 +1,248 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { resolve } from "node:path";
5
+ import pc from "picocolors";
6
+ import { getDataDir } from "../utils/paths.js";
7
+ /**
8
+ * Show a compact status dashboard when `arcs` is invoked with no args in a TTY.
9
+ */
10
+ export async function showStatusDashboard() {
11
+ const cwd = process.cwd();
12
+ const dataDir = getDataDir();
13
+ const projectsDir = resolve(dataDir, "projects");
14
+ // 1. Find project matching cwd
15
+ const project = findProject(projectsDir, dataDir, cwd);
16
+ if (!project) {
17
+ console.log(pc.dim("No ARCS project found for this directory."));
18
+ return;
19
+ }
20
+ // 2. Read tasks
21
+ const taskCounts = readTaskCounts(resolve(projectsDir, project.slug));
22
+ // 3. Read plans with diagram info
23
+ const plans = readPlans(resolve(projectsDir, project.slug));
24
+ // 4. Render
25
+ render(project, taskCounts, plans);
26
+ }
27
+ function findProject(projectsDir, dataDir, cwd) {
28
+ const metaPath = resolve(dataDir, "meta.json");
29
+ if (!existsSync(metaPath))
30
+ return null;
31
+ let rootMeta;
32
+ try {
33
+ rootMeta = JSON.parse(readFileSync(metaPath, "utf-8"));
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ if (!rootMeta.projects)
39
+ return null;
40
+ for (const node of rootMeta.projects) {
41
+ const projMetaPath = resolve(projectsDir, node.id, "meta.json");
42
+ if (!existsSync(projMetaPath))
43
+ continue;
44
+ try {
45
+ const projMeta = JSON.parse(readFileSync(projMetaPath, "utf-8"));
46
+ const paths = Array.isArray(projMeta.workspacePaths) ? projMeta.workspacePaths : [];
47
+ for (const wp of paths) {
48
+ const resolved = wp.startsWith("~") ? resolve(homedir(), wp.slice(2)) : resolve(wp);
49
+ if (cwd === resolved || cwd.startsWith(`${resolved}/`)) {
50
+ return { slug: node.id, name: node.name, status: node.status };
51
+ }
52
+ }
53
+ }
54
+ catch { }
55
+ }
56
+ return null;
57
+ }
58
+ function readTaskCounts(projectDir) {
59
+ const counts = { backlog: 0, inProgress: 0, done: 0 };
60
+ const tasksPath = resolve(projectDir, "tasks.md");
61
+ if (!existsSync(tasksPath))
62
+ return counts;
63
+ try {
64
+ const content = readFileSync(tasksPath, "utf-8");
65
+ const lines = content.split("\n");
66
+ for (const line of lines) {
67
+ if (line.includes("- [ ]"))
68
+ counts.backlog++;
69
+ else if (line.includes("- [/]"))
70
+ counts.inProgress++;
71
+ else if (line.includes("- [x]"))
72
+ counts.done++;
73
+ }
74
+ }
75
+ catch {
76
+ // graceful degradation
77
+ }
78
+ return counts;
79
+ }
80
+ function readPlans(projectDir) {
81
+ const plansDir = resolve(projectDir, "plans");
82
+ if (!existsSync(plansDir))
83
+ return [];
84
+ const plans = [];
85
+ try {
86
+ const entries = readdirSync(plansDir);
87
+ // Find .diagram.mmd files
88
+ const diagramFiles = entries.filter((e) => e.endsWith(".diagram.mmd"));
89
+ for (const diagramFile of diagramFiles) {
90
+ const planId = diagramFile.replace(".diagram.mmd", "");
91
+ // Try to get plan name from meta
92
+ const planMetaPath = resolve(plansDir, `${planId}.meta.json`);
93
+ let planName = planId;
94
+ if (existsSync(planMetaPath)) {
95
+ try {
96
+ const meta = JSON.parse(readFileSync(planMetaPath, "utf-8"));
97
+ if (meta.title)
98
+ planName = meta.title;
99
+ }
100
+ catch {
101
+ // use planId
102
+ }
103
+ }
104
+ // Run manage-diagram.mjs inspect
105
+ const diagramPath = resolve(plansDir, diagramFile);
106
+ try {
107
+ const scriptPath = resolveManageDiagramScript();
108
+ if (!scriptPath)
109
+ continue;
110
+ const output = execSync(`node "${scriptPath}" inspect "${diagramPath}"`, {
111
+ encoding: "utf-8",
112
+ timeout: 5000,
113
+ stdio: ["pipe", "pipe", "pipe"],
114
+ });
115
+ const data = JSON.parse(output);
116
+ const nodes = data.nodes ?? [];
117
+ const totalNodes = nodes.length;
118
+ const doneNodes = nodes.filter((n) => n.status === "done").length;
119
+ const inProgressNodes = nodes.filter((n) => n.status === "inProgress").length;
120
+ const blockedNodes = nodes.filter((n) => n.status === "blocked").length;
121
+ const backlogNodes = totalNodes - doneNodes - inProgressNodes - blockedNodes;
122
+ // Parse ready from readyComment (format: "T002" or "T002,T003" or "ready=T002,T003")
123
+ const readyComment = data.readyComment ?? "";
124
+ let readyIds = [];
125
+ if (readyComment) {
126
+ const eqMatch = readyComment.match(/ready=([A-Z0-9,]+)/i);
127
+ if (eqMatch) {
128
+ readyIds = eqMatch[1].split(",").map((s) => s.trim());
129
+ }
130
+ else {
131
+ readyIds = readyComment
132
+ .split(",")
133
+ .map((s) => s.trim())
134
+ .filter((s) => /^T\d+$/i.test(s));
135
+ }
136
+ }
137
+ const nextReadyNode = readyIds.length > 0 ? nodes.find((n) => n.id === readyIds[0]) : undefined;
138
+ const nextReady = nextReadyNode ? `${nextReadyNode.id} ${nextReadyNode.label ?? ""}` : "";
139
+ plans.push({
140
+ name: planName,
141
+ totalNodes,
142
+ doneNodes,
143
+ inProgressNodes,
144
+ blockedNodes,
145
+ backlogNodes,
146
+ nextReady,
147
+ });
148
+ }
149
+ catch {
150
+ // If inspect fails, still show the plan without progress
151
+ plans.push({
152
+ name: planName,
153
+ totalNodes: 0,
154
+ doneNodes: 0,
155
+ inProgressNodes: 0,
156
+ blockedNodes: 0,
157
+ backlogNodes: 0,
158
+ nextReady: "",
159
+ });
160
+ }
161
+ }
162
+ }
163
+ catch {
164
+ // graceful degradation
165
+ }
166
+ return plans;
167
+ }
168
+ function resolveManageDiagramScript() {
169
+ // Check local repo path first, then config path
170
+ const candidates = [
171
+ resolve(import.meta.dirname, "../../opencode/arcs/skills/to-diagram/scripts/manage-diagram.mjs"),
172
+ resolve(homedir(), ".config/opencode/skills/arcs/to-diagram/scripts/manage-diagram.mjs"),
173
+ ];
174
+ for (const p of candidates) {
175
+ if (existsSync(p))
176
+ return p;
177
+ }
178
+ return null;
179
+ }
180
+ function render(project, tasks, plans) {
181
+ const WIDTH = 60;
182
+ const innerWidth = WIDTH - 4; // inside box padding
183
+ // Header box
184
+ const topLine = `┌─ ${pc.bold("ARCS")} ${"─".repeat(WIDTH - 7)}┐`;
185
+ const botLine = `└${"─".repeat(WIDTH - 2)}┘`;
186
+ const dirLine = padRight(` Dir: ${process.cwd()}`, innerWidth);
187
+ const projectLine = padRight(` Project: ${pc.bold(project.name)} (${project.status})`, innerWidth);
188
+ const taskParts = [];
189
+ if (tasks.inProgress > 0)
190
+ taskParts.push(pc.yellow(`${tasks.inProgress} in-progress`));
191
+ if (tasks.backlog > 0)
192
+ taskParts.push(pc.dim(`${tasks.backlog} backlog`));
193
+ if (tasks.done > 0)
194
+ taskParts.push(pc.green(`${tasks.done} done`));
195
+ const taskLine = padRight(` Tasks: ${taskParts.join(" · ")}`, innerWidth);
196
+ console.log(topLine);
197
+ console.log(`│${dirLine}│`);
198
+ console.log(`│${projectLine}│`);
199
+ console.log(`│${taskLine}│`);
200
+ console.log(botLine);
201
+ // Plans
202
+ if (plans.length > 0) {
203
+ console.log("");
204
+ console.log("Plans:");
205
+ for (const plan of plans) {
206
+ const barWidth = 7;
207
+ const filled = plan.totalNodes > 0 ? Math.round((plan.doneNodes / plan.totalNodes) * barWidth) : 0;
208
+ const bar = "█".repeat(filled) + "░".repeat(barWidth - filled);
209
+ const progress = plan.totalNodes > 0 ? `${plan.doneNodes}/${plan.totalNodes}` : "—";
210
+ const isDone = plan.totalNodes > 0 && plan.doneNodes === plan.totalNodes;
211
+ const doneFlag = isDone ? ` ${pc.green("✓ done")}` : "";
212
+ const name = truncate(plan.name, 30);
213
+ console.log(` ▸ ${pc.bold(name.padEnd(30))} ${bar} ${progress.padEnd(5)}${doneFlag}`);
214
+ // Second line: node status counts + next ready task (only if diagram has nodes)
215
+ if (plan.totalNodes > 0 && !isDone) {
216
+ const counts = [];
217
+ if (plan.doneNodes > 0)
218
+ counts.push(pc.green(`✓${plan.doneNodes}`));
219
+ if (plan.inProgressNodes > 0)
220
+ counts.push(pc.yellow(`◉${plan.inProgressNodes}`));
221
+ if (plan.blockedNodes > 0)
222
+ counts.push(pc.red(`✗${plan.blockedNodes}`));
223
+ if (plan.backlogNodes > 0)
224
+ counts.push(pc.dim(`○${plan.backlogNodes}`));
225
+ const next = plan.nextReady ? ` next: ${truncate(plan.nextReady, 25)}` : "";
226
+ console.log(` ${counts.join(" ")}${pc.dim(next)}`);
227
+ }
228
+ }
229
+ }
230
+ // Hints
231
+ console.log("");
232
+ console.log(pc.dim("Hints:"));
233
+ console.log(pc.dim(" arcs diagram show <plan-id> tree view"));
234
+ console.log(pc.dim(" arcs task <slug> list tasks"));
235
+ }
236
+ function padRight(str, width) {
237
+ // Strip ANSI for length calculation
238
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: intentional ANSI escape detection
239
+ const stripped = str.replace(/\u001b\[[0-9;]*m/g, "");
240
+ const pad = Math.max(0, width - stripped.length);
241
+ return str + " ".repeat(pad);
242
+ }
243
+ function truncate(str, maxLen) {
244
+ if (str.length <= maxLen)
245
+ return str;
246
+ return `${str.slice(0, maxLen - 1)}…`;
247
+ }
248
+ //# sourceMappingURL=status-dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-dashboard.js","sourceRoot":"","sources":["../../src/cli/status-dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import { handleCli } from "./cli/index.js";
3
+ async function run() {
4
+ const args = process.argv.slice(2);
5
+ // TTY detection: if human at terminal with no args, show status dashboard
6
+ if (args.length === 0 && process.stdin.isTTY) {
7
+ const { showStatusDashboard } = await import("./cli/status-dashboard.js");
8
+ await showStatusDashboard();
9
+ return;
10
+ }
11
+ // Handle CLI subcommands
12
+ if (args.length > 0) {
13
+ const handled = await handleCli(args);
14
+ if (handled)
15
+ return;
16
+ }
17
+ // No recognized command
18
+ console.error("Unknown command. Run `arcs --help` for usage.");
19
+ process.exit(1);
20
+ }
21
+ run().catch((err) => {
22
+ console.error("Fatal error:", err);
23
+ process.exit(1);
24
+ });
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,KAAK,UAAU,GAAG;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,0EAA0E;IAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7C,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAC1E,MAAM,mBAAmB,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,yBAAyB;IACzB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,OAAO;YAAE,OAAO;IACtB,CAAC;IAED,wBAAwB;IACxB,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAClB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * BM25 (Okapi BM25) scoring algorithm for full-text search.
3
+ */
4
+ export interface Document {
5
+ id: string;
6
+ fields: Record<string, string>;
7
+ }
8
+ export interface ScoredResult {
9
+ id: string;
10
+ score: number;
11
+ }
12
+ export interface Bm25Index {
13
+ search(query: string, limit?: number): ScoredResult[];
14
+ }
15
+ /**
16
+ * Tokenizes input text: lowercase, split on non-alphanumeric, filter short tokens.
17
+ */
18
+ export declare function tokenize(text: string): string[];
19
+ /**
20
+ * Creates a BM25 index over the given documents with field weights.
21
+ */
22
+ export declare function createBm25Index(documents: Document[], fieldWeights: Record<string, number>): Bm25Index;
23
+ //# sourceMappingURL=bm25.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25.d.ts","sourceRoot":"","sources":["../../src/retrieval/bm25.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;CACvD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,QAAQ,EAAE,EACrB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,SAAS,CAqFX"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * BM25 (Okapi BM25) scoring algorithm for full-text search.
3
+ */
4
+ const K1 = 1.2;
5
+ const B = 0.75;
6
+ /**
7
+ * Tokenizes input text: lowercase, split on non-alphanumeric, filter short tokens.
8
+ */
9
+ export function tokenize(text) {
10
+ return text
11
+ .toLowerCase()
12
+ .split(/[^\p{L}\p{N}]+/u)
13
+ .filter((t) => t.length >= 2);
14
+ }
15
+ /**
16
+ * Creates a BM25 index over the given documents with field weights.
17
+ */
18
+ export function createBm25Index(documents, fieldWeights) {
19
+ const N = documents.length;
20
+ const fieldNames = Object.keys(fieldWeights);
21
+ // Pre-compute: tokenized fields, field lengths, avg field lengths, document frequencies
22
+ const tokenizedDocs = new Map();
23
+ const fieldLengthSums = {};
24
+ const fieldLengthCounts = {};
25
+ for (const field of fieldNames) {
26
+ fieldLengthSums[field] = 0;
27
+ fieldLengthCounts[field] = 0;
28
+ }
29
+ for (const doc of documents) {
30
+ const fieldTokens = new Map();
31
+ for (const field of fieldNames) {
32
+ const tokens = tokenize(doc.fields[field] ?? "");
33
+ fieldTokens.set(field, tokens);
34
+ fieldLengthSums[field] += tokens.length;
35
+ fieldLengthCounts[field] += 1;
36
+ }
37
+ tokenizedDocs.set(doc.id, fieldTokens);
38
+ }
39
+ const avgFieldLen = {};
40
+ for (const field of fieldNames) {
41
+ avgFieldLen[field] = N > 0 ? fieldLengthSums[field] / N : 0;
42
+ }
43
+ // Document frequency: count each doc once per term (across all fields)
44
+ const df = new Map();
45
+ for (const doc of documents) {
46
+ const fieldTokens = tokenizedDocs.get(doc.id);
47
+ const termsInDoc = new Set();
48
+ for (const field of fieldNames) {
49
+ for (const token of fieldTokens.get(field) ?? []) {
50
+ termsInDoc.add(token);
51
+ }
52
+ }
53
+ for (const term of termsInDoc) {
54
+ df.set(term, (df.get(term) ?? 0) + 1);
55
+ }
56
+ }
57
+ return {
58
+ search(query, limit = 10) {
59
+ const queryTerms = tokenize(query);
60
+ if (queryTerms.length === 0 || N === 0)
61
+ return [];
62
+ const results = [];
63
+ for (const doc of documents) {
64
+ let docScore = 0;
65
+ const fieldTokens = tokenizedDocs.get(doc.id);
66
+ for (const term of queryTerms) {
67
+ const termDf = df.get(term) ?? 0;
68
+ if (termDf === 0)
69
+ continue;
70
+ const idf = Math.log((N - termDf + 0.5) / (termDf + 0.5) + 1);
71
+ for (const field of fieldNames) {
72
+ const tokens = fieldTokens.get(field) ?? [];
73
+ const tf = tokens.filter((t) => t === term).length;
74
+ if (tf === 0)
75
+ continue;
76
+ const fieldLen = tokens.length;
77
+ const avgLen = avgFieldLen[field];
78
+ const tfNorm = (tf * (K1 + 1)) / (tf + K1 * (1 - B + B * (fieldLen / (avgLen || 1))));
79
+ const weight = fieldWeights[field] ?? 1;
80
+ docScore += idf * tfNorm * weight;
81
+ }
82
+ }
83
+ if (docScore > 0) {
84
+ results.push({ id: doc.id, score: docScore });
85
+ }
86
+ }
87
+ results.sort((a, b) => b.score - a.score);
88
+ return results.slice(0, limit);
89
+ },
90
+ };
91
+ }
92
+ //# sourceMappingURL=bm25.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../src/retrieval/bm25.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Cross-project knowledge search.
3
+ *
4
+ * Queries knowledge entries (and optionally plans) across ALL projects in the
5
+ * DAG, returning results annotated with their source project slug.
6
+ */
7
+ export interface CrossProjectSearchOptions {
8
+ query: string;
9
+ limit?: number;
10
+ projectSlugs?: string[];
11
+ includeKnowledge?: boolean;
12
+ includePlans?: boolean;
13
+ kind?: string;
14
+ }
15
+ export interface CrossProjectResult {
16
+ projectSlug: string;
17
+ entryId: string;
18
+ entryType: "knowledge" | "plan";
19
+ title: string;
20
+ summary: string;
21
+ score: number;
22
+ kind?: string;
23
+ status?: string;
24
+ }
25
+ /**
26
+ * Search knowledge and/or plan entries across all (or a subset of) projects.
27
+ * Results are sorted by BM25 score descending and capped at the specified limit.
28
+ */
29
+ export declare function searchAcrossProjects(options: CrossProjectSearchOptions): Promise<CrossProjectResult[]>;
30
+ //# sourceMappingURL=cross-project-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-project-search.d.ts","sourceRoot":"","sources":["../../src/retrieval/cross-project-search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,WAAW,GAAG,MAAM,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAkF/B"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Cross-project knowledge search.
3
+ *
4
+ * Queries knowledge entries (and optionally plans) across ALL projects in the
5
+ * DAG, returning results annotated with their source project slug.
6
+ */
7
+ import { readRootMeta } from "../utils/dag.js";
8
+ import { getDataDir, getProjectDir } from "../utils/paths.js";
9
+ import { readKnowledgeIndex } from "../utils/project-memory.js";
10
+ import { buildProjectRetrievalIndex } from "./index-builder.js";
11
+ /**
12
+ * Search knowledge and/or plan entries across all (or a subset of) projects.
13
+ * Results are sorted by BM25 score descending and capped at the specified limit.
14
+ */
15
+ export async function searchAcrossProjects(options) {
16
+ const { query, limit = 10, projectSlugs, includeKnowledge = true, includePlans = false, } = options;
17
+ if (!query.trim())
18
+ return [];
19
+ const dataDir = getDataDir();
20
+ const rootMeta = await readRootMeta(dataDir);
21
+ // Determine which projects to search
22
+ const slugs = projectSlugs && projectSlugs.length > 0
23
+ ? projectSlugs.filter((s) => rootMeta.projects.some((p) => p.id === s))
24
+ : rootMeta.projects.map((p) => p.id);
25
+ // Collect results across all projects
26
+ const allResults = [];
27
+ // Use a generous per-project limit to avoid premature truncation before global sort
28
+ const perProjectLimit = limit * 3;
29
+ for (const slug of slugs) {
30
+ let index;
31
+ try {
32
+ index = await buildProjectRetrievalIndex(slug);
33
+ }
34
+ catch {
35
+ // Skip projects with missing/corrupt data
36
+ continue;
37
+ }
38
+ if (includeKnowledge) {
39
+ const knowledgeResults = index.searchKnowledge(query, perProjectLimit);
40
+ for (const r of knowledgeResults) {
41
+ // Apply kind filter if specified (BM25 doesn't filter by kind natively)
42
+ if (options.kind && r.type === "knowledge") {
43
+ // We need to check kind from the entry metadata — but ScoredEntry doesn't carry kind.
44
+ // We'll do a post-filter below after enrichment.
45
+ }
46
+ allResults.push({
47
+ projectSlug: slug,
48
+ entryId: r.id,
49
+ entryType: "knowledge",
50
+ title: r.title,
51
+ summary: r.summary,
52
+ score: r.score,
53
+ });
54
+ }
55
+ }
56
+ if (includePlans) {
57
+ const planResults = index.searchPlans(query, perProjectLimit);
58
+ for (const r of planResults) {
59
+ allResults.push({
60
+ projectSlug: slug,
61
+ entryId: r.id,
62
+ entryType: "plan",
63
+ title: r.title,
64
+ summary: r.summary,
65
+ score: r.score,
66
+ });
67
+ }
68
+ }
69
+ }
70
+ // Sort by score descending
71
+ allResults.sort((a, b) => b.score - a.score);
72
+ // Apply kind filter if specified (for knowledge entries only)
73
+ let filtered = allResults;
74
+ if (options.kind) {
75
+ // We need to enrich knowledge entries with their kind to filter.
76
+ // Since buildProjectRetrievalIndex doesn't expose kind, we do a lazy
77
+ // enrichment by re-reading knowledge indexes for projects that have results.
78
+ filtered = await filterByKind(allResults, options.kind);
79
+ }
80
+ return filtered.slice(0, limit);
81
+ }
82
+ /**
83
+ * Post-filter results by knowledge kind. Plan entries pass through unfiltered.
84
+ */
85
+ async function filterByKind(results, kind) {
86
+ // Build a map of project -> Set<entryId> that match the kind
87
+ const kindCache = new Map();
88
+ const projectSlugs = [
89
+ ...new Set(results.filter((r) => r.entryType === "knowledge").map((r) => r.projectSlug)),
90
+ ];
91
+ for (const slug of projectSlugs) {
92
+ try {
93
+ const projectDir = getProjectDir(slug);
94
+ const knowledgeIndex = await readKnowledgeIndex(projectDir);
95
+ const matchingIds = new Set(knowledgeIndex.entries.filter((e) => e.kind === kind).map((e) => e.id));
96
+ kindCache.set(slug, matchingIds);
97
+ }
98
+ catch {
99
+ kindCache.set(slug, new Set());
100
+ }
101
+ }
102
+ return results.filter((r) => {
103
+ if (r.entryType !== "knowledge")
104
+ return true;
105
+ const allowed = kindCache.get(r.projectSlug);
106
+ return allowed?.has(r.entryId) ?? false;
107
+ });
108
+ }
109
+ //# sourceMappingURL=cross-project-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-project-search.js","sourceRoot":"","sources":["../../src/retrieval/cross-project-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Builds an adjacency index (graph) from project metadata indexes.
3
+ */
4
+ import type { AdjacencyIndex } from "./graph-types.js";
5
+ export declare function buildAdjacencyIndex(slug: string): Promise<AdjacencyIndex>;
6
+ //# sourceMappingURL=graph-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-builder.d.ts","sourceRoot":"","sources":["../../src/retrieval/graph-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AA6B7E,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAuL/E"}