@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18

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 (467) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -1
  3. package/bin/aiwg.mjs +349 -0
  4. package/dist/src/a2a/agent-card.js +145 -0
  5. package/dist/src/a2a/client.js +411 -0
  6. package/dist/src/a2a/hitl-cli.js +171 -0
  7. package/dist/src/a2a/hitl-driver.js +370 -0
  8. package/dist/src/a2a/hitl.js +181 -0
  9. package/dist/src/a2a/http.js +193 -0
  10. package/dist/src/a2a/jcs.js +128 -0
  11. package/dist/src/a2a/jws.js +187 -0
  12. package/dist/src/a2a/types.js +24 -0
  13. package/dist/src/a2a/webhook.js +240 -0
  14. package/dist/src/activity-log/cli.js +348 -0
  15. package/dist/src/activity-log/parser.js +81 -0
  16. package/dist/src/activity-log/types.js +50 -0
  17. package/dist/src/agents/agent-deployer.js +367 -0
  18. package/dist/src/agents/agent-packager.js +271 -0
  19. package/dist/src/agents/agent-validator.js +271 -0
  20. package/dist/src/agents/grounding/knowledge-base.js +161 -0
  21. package/dist/src/agents/grounding/types.js +12 -0
  22. package/dist/src/agents/index.js +10 -0
  23. package/dist/src/agents/packaged-agent-inventory.js +75 -0
  24. package/dist/src/agents/types.js +7 -0
  25. package/dist/src/api/index.d.ts +10 -0
  26. package/dist/src/api/index.js +10 -0
  27. package/dist/src/artifacts/address-parser.js +73 -0
  28. package/dist/src/artifacts/audit/cli.js +183 -0
  29. package/dist/src/artifacts/audit/drift.js +122 -0
  30. package/dist/src/artifacts/audit/types.js +12 -0
  31. package/dist/src/artifacts/backends/graphology-backend.js +160 -0
  32. package/dist/src/artifacts/backends/json-backend.js +129 -0
  33. package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
  34. package/dist/src/artifacts/browser-export.js +622 -0
  35. package/dist/src/artifacts/capability-resolver.js +94 -0
  36. package/dist/src/artifacts/checksum-manifest.js +91 -0
  37. package/dist/src/artifacts/citation-parser.js +162 -0
  38. package/dist/src/artifacts/cli.js +1486 -0
  39. package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
  40. package/dist/src/artifacts/corpus-tools/cli.js +393 -0
  41. package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
  42. package/dist/src/artifacts/corpus-tools/curator.js +186 -0
  43. package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
  44. package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
  45. package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
  46. package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
  47. package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
  48. package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
  49. package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
  50. package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
  51. package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
  52. package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
  53. package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
  54. package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
  55. package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
  56. package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
  57. package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
  58. package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
  59. package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
  60. package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
  61. package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
  62. package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
  63. package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
  64. package/dist/src/artifacts/corpus-views/build.js +126 -0
  65. package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
  66. package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
  67. package/dist/src/artifacts/corpus-views/renderers.js +353 -0
  68. package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
  69. package/dist/src/artifacts/dep-graph.js +173 -0
  70. package/dist/src/artifacts/discover-facets.js +375 -0
  71. package/dist/src/artifacts/embedding-index.js +354 -0
  72. package/dist/src/artifacts/enrichment/cli.js +240 -0
  73. package/dist/src/artifacts/enrichment/prompt.js +47 -0
  74. package/dist/src/artifacts/enrichment/store.js +90 -0
  75. package/dist/src/artifacts/enrichment/types.js +12 -0
  76. package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
  77. package/dist/src/artifacts/fortemi-core-sync.js +251 -0
  78. package/dist/src/artifacts/fortemi-shard-export.js +44 -0
  79. package/dist/src/artifacts/fulltext.js +108 -0
  80. package/dist/src/artifacts/graph-backend.js +51 -0
  81. package/dist/src/artifacts/graph-query.js +247 -0
  82. package/dist/src/artifacts/hybrid-query.js +225 -0
  83. package/dist/src/artifacts/index-builder.js +1089 -0
  84. package/dist/src/artifacts/index-reader.js +112 -0
  85. package/dist/src/artifacts/index-status.js +193 -0
  86. package/dist/src/artifacts/legacy-index-migration.js +169 -0
  87. package/dist/src/artifacts/move.js +154 -0
  88. package/dist/src/artifacts/operational-state.js +239 -0
  89. package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
  90. package/dist/src/artifacts/query-engine.js +1955 -0
  91. package/dist/src/artifacts/source-graph.js +529 -0
  92. package/dist/src/artifacts/stats.js +169 -0
  93. package/dist/src/artifacts/types.js +606 -0
  94. package/dist/src/artifacts/views/cli.js +293 -0
  95. package/dist/src/artifacts/views/definition.js +170 -0
  96. package/dist/src/artifacts/views/store.js +149 -0
  97. package/dist/src/artifacts/views/types.js +8 -0
  98. package/dist/src/artifacts/watcher.js +255 -0
  99. package/dist/src/catalog/builtin-models.json +636 -0
  100. package/dist/src/catalog/cli.js +228 -0
  101. package/dist/src/catalog/cli.mjs +289 -0
  102. package/dist/src/catalog/index.js +15 -0
  103. package/dist/src/catalog/loader.js +217 -0
  104. package/dist/src/catalog/loader.mjs +251 -0
  105. package/dist/src/catalog/sources.json +41 -0
  106. package/dist/src/catalog/types.js +8 -0
  107. package/dist/src/channel/manager.mjs +504 -0
  108. package/dist/src/cli/agent-spawn.js +178 -0
  109. package/dist/src/cli/cli-extension-loader.js +245 -0
  110. package/dist/src/cli/command-log.js +275 -0
  111. package/dist/src/cli/config-loader.js +232 -0
  112. package/dist/src/cli/env.js +82 -0
  113. package/dist/src/cli/errors.js +150 -0
  114. package/dist/src/cli/find-package-root.js +40 -0
  115. package/dist/src/cli/git-hooks.js +250 -0
  116. package/dist/src/cli/handlers/agentcard.js +206 -0
  117. package/dist/src/cli/handlers/artifacts.js +76 -0
  118. package/dist/src/cli/handlers/best-practices-audit.js +280 -0
  119. package/dist/src/cli/handlers/cockpit.js +137 -0
  120. package/dist/src/cli/handlers/command-log.js +37 -0
  121. package/dist/src/cli/handlers/daemon.js +59 -0
  122. package/dist/src/cli/handlers/diagnose.js +300 -0
  123. package/dist/src/cli/handlers/execution-mode.js +105 -0
  124. package/dist/src/cli/handlers/feedback.js +341 -0
  125. package/dist/src/cli/handlers/help.js +147 -0
  126. package/dist/src/cli/handlers/index.js +302 -0
  127. package/dist/src/cli/handlers/init.js +179 -0
  128. package/dist/src/cli/handlers/install.js +129 -0
  129. package/dist/src/cli/handlers/issues.js +46 -0
  130. package/dist/src/cli/handlers/lint.js +42 -0
  131. package/dist/src/cli/handlers/local-executor.js +315 -0
  132. package/dist/src/cli/handlers/marketplace.js +168 -0
  133. package/dist/src/cli/handlers/mc.js +1010 -0
  134. package/dist/src/cli/handlers/models.js +352 -0
  135. package/dist/src/cli/handlers/packages.js +155 -0
  136. package/dist/src/cli/handlers/ralph-launcher.js +717 -0
  137. package/dist/src/cli/handlers/ralph.js +575 -0
  138. package/dist/src/cli/handlers/refresh.js +432 -0
  139. package/dist/src/cli/handlers/regenerate.js +336 -0
  140. package/dist/src/cli/handlers/repo-access.js +109 -0
  141. package/dist/src/cli/handlers/run.js +165 -0
  142. package/dist/src/cli/handlers/runtime-info.js +301 -0
  143. package/dist/src/cli/handlers/sandbox.js +197 -0
  144. package/dist/src/cli/handlers/scaffolding.js +149 -0
  145. package/dist/src/cli/handlers/script-runner.js +121 -0
  146. package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
  147. package/dist/src/cli/handlers/serve.js +1835 -0
  148. package/dist/src/cli/handlers/session.js +348 -0
  149. package/dist/src/cli/handlers/setup.js +440 -0
  150. package/dist/src/cli/handlers/skill-lint.js +367 -0
  151. package/dist/src/cli/handlers/skill-usage.js +74 -0
  152. package/dist/src/cli/handlers/steward.js +567 -0
  153. package/dist/src/cli/handlers/subcommands.js +1702 -0
  154. package/dist/src/cli/handlers/team.js +337 -0
  155. package/dist/src/cli/handlers/types.js +11 -0
  156. package/dist/src/cli/handlers/use.js +2772 -0
  157. package/dist/src/cli/handlers/utilities.js +703 -0
  158. package/dist/src/cli/handlers/version.js +134 -0
  159. package/dist/src/cli/handlers/workspace-context.js +93 -0
  160. package/dist/src/cli/handlers/workspace.js +126 -0
  161. package/dist/src/cli/help-generator.js +178 -0
  162. package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
  163. package/dist/src/cli/hooks/executor.js +96 -0
  164. package/dist/src/cli/hooks/index.js +15 -0
  165. package/dist/src/cli/hooks/registry.js +143 -0
  166. package/dist/src/cli/hooks/types.js +13 -0
  167. package/dist/src/cli/log.js +492 -0
  168. package/dist/src/cli/project-isolation/detect.js +70 -0
  169. package/dist/src/cli/project-isolation/index.js +7 -0
  170. package/dist/src/cli/project-isolation/signals.js +17 -0
  171. package/dist/src/cli/project-isolation/warning.js +102 -0
  172. package/dist/src/cli/prompt-utils.js +155 -0
  173. package/dist/src/cli/provider-deployment-plan.js +126 -0
  174. package/dist/src/cli/provider-resolution.js +119 -0
  175. package/dist/src/cli/router.js +305 -0
  176. package/dist/src/cli/scope-resolver.js +392 -0
  177. package/dist/src/cli/skill-usage.js +616 -0
  178. package/dist/src/cli/ui.js +224 -0
  179. package/dist/src/cli/watch-service.js +203 -0
  180. package/dist/src/cli/workflow-orchestrator.js +478 -0
  181. package/dist/src/cli/workspace-signals.js +321 -0
  182. package/dist/src/community/footer.js +14 -0
  183. package/dist/src/community/links.js +123 -0
  184. package/dist/src/community/milestones.js +46 -0
  185. package/dist/src/community/nudge-policy.js +93 -0
  186. package/dist/src/config/aiwg-config.js +883 -0
  187. package/dist/src/config/cli.js +703 -0
  188. package/dist/src/config/gitignore.js +156 -0
  189. package/dist/src/config/project-artifacts.js +76 -0
  190. package/dist/src/config/user-config.js +428 -0
  191. package/dist/src/config/user-registry.js +127 -0
  192. package/dist/src/config/workspace.js +276 -0
  193. package/dist/src/contributors/detect.js +39 -0
  194. package/dist/src/contributors/discover.js +172 -0
  195. package/dist/src/contributors/heuristic.js +186 -0
  196. package/dist/src/contributors/index.js +11 -0
  197. package/dist/src/contributors/types.js +13 -0
  198. package/dist/src/contributors/validation.js +116 -0
  199. package/dist/src/data/community.schema.json +43 -0
  200. package/dist/src/data/community.yaml +16 -0
  201. package/dist/src/extensions/capability-index.js +270 -0
  202. package/dist/src/extensions/claude-hooks-installer.js +268 -0
  203. package/dist/src/extensions/commands/definitions.js +3485 -0
  204. package/dist/src/extensions/deployment-registration.js +463 -0
  205. package/dist/src/extensions/index.js +22 -0
  206. package/dist/src/extensions/loader.js +132 -0
  207. package/dist/src/extensions/managed-marker.js +100 -0
  208. package/dist/src/extensions/manifest.js +196 -0
  209. package/dist/src/extensions/project-local-activity.js +114 -0
  210. package/dist/src/extensions/project-local-discovery.js +261 -0
  211. package/dist/src/extensions/project-local-doctor.js +281 -0
  212. package/dist/src/extensions/project-local-gitignore.js +176 -0
  213. package/dist/src/extensions/project-local-paths.js +121 -0
  214. package/dist/src/extensions/project-local-promote.js +218 -0
  215. package/dist/src/extensions/project-local-remove.js +373 -0
  216. package/dist/src/extensions/project-local-scaffold.js +252 -0
  217. package/dist/src/extensions/project-quickref.js +291 -0
  218. package/dist/src/extensions/registry.js +368 -0
  219. package/dist/src/extensions/shadow-resolver.js +271 -0
  220. package/dist/src/extensions/types.js +86 -0
  221. package/dist/src/extensions/upstream-registry.js +195 -0
  222. package/dist/src/extensions/validation.js +631 -0
  223. package/dist/src/features/catalog.js +88 -0
  224. package/dist/src/features/cli.js +197 -0
  225. package/dist/src/features/installer.js +57 -0
  226. package/dist/src/features/paths.js +14 -0
  227. package/dist/src/features/runtime.js +21 -0
  228. package/dist/src/features/status.js +134 -0
  229. package/dist/src/hooks/laziness-detection.js +532 -0
  230. package/dist/src/intake/git-history-analyzer.js +486 -0
  231. package/dist/src/intake/index.js +9 -0
  232. package/dist/src/issues/cli.js +327 -0
  233. package/dist/src/issues/index.js +5 -0
  234. package/dist/src/issues/live.js +154 -0
  235. package/dist/src/issues/local.js +666 -0
  236. package/dist/src/issues/sync.js +143 -0
  237. package/dist/src/issues/types.js +2 -0
  238. package/dist/src/issues/workflows.js +164 -0
  239. package/dist/src/kb/cli.js +173 -0
  240. package/dist/src/lint/cli.js +171 -0
  241. package/dist/src/lint/loader.js +225 -0
  242. package/dist/src/lint/reporters.js +141 -0
  243. package/dist/src/lint/runner.js +364 -0
  244. package/dist/src/lint/types.js +10 -0
  245. package/dist/src/marketplace/cache.js +110 -0
  246. package/dist/src/marketplace/identifier.js +63 -0
  247. package/dist/src/marketplace/registry.js +36 -0
  248. package/dist/src/marketplace/sources/clawhub.js +53 -0
  249. package/dist/src/marketplace/sources/git.js +45 -0
  250. package/dist/src/marketplace/types.js +9 -0
  251. package/dist/src/mcp/adapters/codex-runtime.js +224 -0
  252. package/dist/src/mcp/cli.mjs +1197 -0
  253. package/dist/src/mcp/elicitation.mjs +149 -0
  254. package/dist/src/mcp/helpers.mjs +287 -0
  255. package/dist/src/mcp/index.mjs +11 -0
  256. package/dist/src/mcp/profiles.js +263 -0
  257. package/dist/src/mcp/profiles.mjs +360 -0
  258. package/dist/src/mcp/registry.js +376 -0
  259. package/dist/src/mcp/registry.mjs +387 -0
  260. package/dist/src/mcp/server.mjs +633 -0
  261. package/dist/src/mcp/test-simple.mjs +271 -0
  262. package/dist/src/mcp/tools/command-run.mjs +101 -0
  263. package/dist/src/mcp/tools/discovery.mjs +291 -0
  264. package/dist/src/mcp/tools/interaction.mjs +87 -0
  265. package/dist/src/mcp/tools/orchestration.mjs +320 -0
  266. package/dist/src/mcp/tools/subsystems.mjs +640 -0
  267. package/dist/src/memory/cli.js +166 -0
  268. package/dist/src/memory/project-registry.js +282 -0
  269. package/dist/src/metrics/artifact-metrics.js +184 -0
  270. package/dist/src/metrics/context-budget.js +174 -0
  271. package/dist/src/metrics/token-counter.js +133 -0
  272. package/dist/src/models/config-loader.js +228 -0
  273. package/dist/src/models/index.js +22 -0
  274. package/dist/src/models/model-capabilities.v1.json +120 -0
  275. package/dist/src/models/model-catalog.v1.json +96 -0
  276. package/dist/src/models/model-discovery.js +521 -0
  277. package/dist/src/models/provider-models.js +73 -0
  278. package/dist/src/models/provider-policy.js +273 -0
  279. package/dist/src/models/resolver.js +245 -0
  280. package/dist/src/models/router.js +70 -0
  281. package/dist/src/models/types.js +8 -0
  282. package/dist/src/models/wrapper-deployment.js +178 -0
  283. package/dist/src/models/wrapper-route.js +54 -0
  284. package/dist/src/ops/cli.js +268 -0
  285. package/dist/src/ops/registry.js +623 -0
  286. package/dist/src/packages/adapters/clawhub.js +113 -0
  287. package/dist/src/packages/adapters/git.js +153 -0
  288. package/dist/src/packages/adapters/gitea.js +93 -0
  289. package/dist/src/packages/adapters/github.js +69 -0
  290. package/dist/src/packages/adapters/local-cache.js +89 -0
  291. package/dist/src/packages/package-registry.js +143 -0
  292. package/dist/src/packages/registry.js +238 -0
  293. package/dist/src/packages/types.js +11 -0
  294. package/dist/src/plugin/cross-framework-ops.js +475 -0
  295. package/dist/src/plugin/framework-config-loader.js +235 -0
  296. package/dist/src/plugin/framework-detector.js +186 -0
  297. package/dist/src/plugin/framework-isolator.js +341 -0
  298. package/dist/src/plugin/framework-migration.js +371 -0
  299. package/dist/src/plugin/metadata-validator.js +906 -0
  300. package/dist/src/plugin/plugin-installer.js +436 -0
  301. package/dist/src/plugin/plugin-status.js +369 -0
  302. package/dist/src/plugin/plugin-uninstaller.js +473 -0
  303. package/dist/src/plugin/registry-validator.js +344 -0
  304. package/dist/src/plugin/skill-command-translator.js +415 -0
  305. package/dist/src/plugin/workspace-creator.js +189 -0
  306. package/dist/src/plugin/workspace-migrator.js +821 -0
  307. package/dist/src/policy/authorization.js +390 -0
  308. package/dist/src/policy/repo-access.js +215 -0
  309. package/dist/src/provenance/cli.js +16 -0
  310. package/dist/src/providers/capability-matrix.js +300 -0
  311. package/dist/src/providers/capability-matrix.yaml +514 -0
  312. package/dist/src/providers/provider-definitions.js +977 -0
  313. package/dist/src/providers/provider-definitions.mjs +159 -0
  314. package/dist/src/providers/provider-inventory.js +169 -0
  315. package/dist/src/quality/feedback-ab.js +174 -0
  316. package/dist/src/quality/feedback-collector.js +176 -0
  317. package/dist/src/quality/feedback-tracker.js +123 -0
  318. package/dist/src/quality/patterns/adr.json +24 -0
  319. package/dist/src/quality/patterns/sad.json +24 -0
  320. package/dist/src/quality/patterns/test-plan.json +24 -0
  321. package/dist/src/quality/patterns/use-case.json +24 -0
  322. package/dist/src/quality/scoring.js +157 -0
  323. package/dist/src/reflections/cli.js +15 -0
  324. package/dist/src/release/plan.js +139 -0
  325. package/dist/src/research/cache/manager.js +227 -0
  326. package/dist/src/research/clients/arxiv.js +156 -0
  327. package/dist/src/research/clients/base.js +197 -0
  328. package/dist/src/research/clients/crossref.js +112 -0
  329. package/dist/src/research/clients/semantic-scholar.js +126 -0
  330. package/dist/src/research/clients/unpaywall.js +87 -0
  331. package/dist/src/research/index.js +14 -0
  332. package/dist/src/research/query-cli.js +336 -0
  333. package/dist/src/research/services/acquisition.js +313 -0
  334. package/dist/src/research/services/archival.js +225 -0
  335. package/dist/src/research/services/citation.js +279 -0
  336. package/dist/src/research/services/discovery.js +243 -0
  337. package/dist/src/research/services/documentation.js +269 -0
  338. package/dist/src/research/services/index.js +14 -0
  339. package/dist/src/research/services/provenance.js +279 -0
  340. package/dist/src/research/services/quality.js +370 -0
  341. package/dist/src/research/services/types.js +7 -0
  342. package/dist/src/research/storage-cli.js +20 -0
  343. package/dist/src/research/types.js +47 -0
  344. package/dist/src/resources/index.d.ts +2 -0
  345. package/dist/src/resources/index.js +2 -0
  346. package/dist/src/resources/web-release.d.ts +89 -0
  347. package/dist/src/resources/web-release.js +886 -0
  348. package/dist/src/rlm/cache/cli.js +162 -0
  349. package/dist/src/rlm/cache/hash.js +35 -0
  350. package/dist/src/rlm/cache/store.js +170 -0
  351. package/dist/src/rlm/cache/types.js +8 -0
  352. package/dist/src/rlm/cli.js +650 -0
  353. package/dist/src/serve/a2a-terminal-observer.js +120 -0
  354. package/dist/src/serve/agent-router.js +205 -0
  355. package/dist/src/serve/dispatch-router.js +171 -0
  356. package/dist/src/serve/executor-registry.js +715 -0
  357. package/dist/src/serve/mission-conductor.js +177 -0
  358. package/dist/src/serve/orchestrator-adapter.js +113 -0
  359. package/dist/src/serve/orchestrator-override.js +94 -0
  360. package/dist/src/serve/orchestrator-pty.js +133 -0
  361. package/dist/src/serve/pty-bridge.js +799 -0
  362. package/dist/src/serve/sandbox-registry.js +832 -0
  363. package/dist/src/serve/screen-reader.js +228 -0
  364. package/dist/src/serve/stack-adapters.js +68 -0
  365. package/dist/src/serve/telemetry.js +143 -0
  366. package/dist/src/skills/adapters/clawhub.js +250 -0
  367. package/dist/src/skills/adapters/local.js +335 -0
  368. package/dist/src/skills/adapters/openclaw.js +316 -0
  369. package/dist/src/skills/cli.js +334 -0
  370. package/dist/src/skills/registry.js +117 -0
  371. package/dist/src/skills/run.js +259 -0
  372. package/dist/src/skills/runtime.js +94 -0
  373. package/dist/src/skills/types.js +10 -0
  374. package/dist/src/smiths/agentsmith/demo.js +116 -0
  375. package/dist/src/smiths/agentsmith/examples.js +300 -0
  376. package/dist/src/smiths/agentsmith/generator.js +503 -0
  377. package/dist/src/smiths/agentsmith/index.js +11 -0
  378. package/dist/src/smiths/agentsmith/types.js +8 -0
  379. package/dist/src/smiths/commandsmith/example.js +220 -0
  380. package/dist/src/smiths/commandsmith/generator.js +288 -0
  381. package/dist/src/smiths/commandsmith/index.js +41 -0
  382. package/dist/src/smiths/commandsmith/templates.js +296 -0
  383. package/dist/src/smiths/commandsmith/types.js +7 -0
  384. package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
  385. package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
  386. package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
  387. package/dist/src/smiths/context-pipeline/discovery.js +187 -0
  388. package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
  389. package/dist/src/smiths/context-pipeline/finalization.js +147 -0
  390. package/dist/src/smiths/context-pipeline/generator.js +477 -0
  391. package/dist/src/smiths/context-pipeline/index.js +30 -0
  392. package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
  393. package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
  394. package/dist/src/smiths/context-pipeline/overflow.js +212 -0
  395. package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
  396. package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
  397. package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
  398. package/dist/src/smiths/context-pipeline/types.js +23 -0
  399. package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
  400. package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
  401. package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
  402. package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
  403. package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
  404. package/dist/src/smiths/hook-bridge/index.js +79 -0
  405. package/dist/src/smiths/hook-bridge/loader.js +116 -0
  406. package/dist/src/smiths/hook-bridge/shim.js +89 -0
  407. package/dist/src/smiths/hook-bridge/types.js +31 -0
  408. package/dist/src/smiths/index.js +39 -0
  409. package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
  410. package/dist/src/smiths/mcpsmith/example.js +119 -0
  411. package/dist/src/smiths/mcpsmith/generator.js +236 -0
  412. package/dist/src/smiths/mcpsmith/index.js +17 -0
  413. package/dist/src/smiths/mcpsmith/types.js +10 -0
  414. package/dist/src/smiths/platform-paths.js +101 -0
  415. package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
  416. package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
  417. package/dist/src/smiths/skillsmith/demo.js +83 -0
  418. package/dist/src/smiths/skillsmith/examples.js +161 -0
  419. package/dist/src/smiths/skillsmith/generator.js +316 -0
  420. package/dist/src/smiths/skillsmith/index.js +12 -0
  421. package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
  422. package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
  423. package/dist/src/smiths/skillsmith/types.js +9 -0
  424. package/dist/src/smiths/toolsmith/index.js +10 -0
  425. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
  426. package/dist/src/smiths/toolsmith/types.js +8 -0
  427. package/dist/src/storage/backends/fortemi.js +227 -0
  428. package/dist/src/storage/backends/fs.js +134 -0
  429. package/dist/src/storage/backends/logseq.js +309 -0
  430. package/dist/src/storage/backends/obsidian.js +233 -0
  431. package/dist/src/storage/cli.js +468 -0
  432. package/dist/src/storage/config.js +272 -0
  433. package/dist/src/storage/index.js +108 -0
  434. package/dist/src/storage/subsystem-cli.js +201 -0
  435. package/dist/src/storage/types.js +33 -0
  436. package/dist/src/testing/corpus/corpus-builder.js +383 -0
  437. package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
  438. package/dist/src/testing/corpus/index.js +10 -0
  439. package/dist/src/testing/fixtures/index.js +9 -0
  440. package/dist/src/testing/fixtures/test-data-factory.js +472 -0
  441. package/dist/src/testing/generators/index.js +11 -0
  442. package/dist/src/testing/generators/test-case-generator.js +393 -0
  443. package/dist/src/testing/generators/test-code-generator.js +384 -0
  444. package/dist/src/testing/generators/use-case-parser.js +325 -0
  445. package/dist/src/testing/index.js +11 -0
  446. package/dist/src/tracker/capability-protocol.js +118 -0
  447. package/dist/src/update/checker.mjs +396 -0
  448. package/dist/src/update/notifier.mjs +235 -0
  449. package/dist/src/writing/content-diversifier.js +804 -0
  450. package/dist/src/writing/example-generator.js +959 -0
  451. package/dist/src/writing/example-templates.js +99 -0
  452. package/dist/src/writing/pattern-library.js +486 -0
  453. package/dist/src/writing/patterns/banned-phrases.json +4413 -0
  454. package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
  455. package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
  456. package/dist/src/writing/patterns/hedging-language.json +2096 -0
  457. package/dist/src/writing/patterns/transition-words.json +1285 -0
  458. package/dist/src/writing/patterns/weak-verbs.json +1112 -0
  459. package/dist/src/writing/prompt-optimizer.js +660 -0
  460. package/dist/src/writing/prompt-templates.js +583 -0
  461. package/dist/src/writing/scoring-config-loader.js +168 -0
  462. package/dist/src/writing/validation-engine.js +595 -0
  463. package/dist/src/writing/validation-rules.js +380 -0
  464. package/dist/src/writing/voice-analyzer.js +439 -0
  465. package/dist/src/writing/voice-calibration.js +661 -0
  466. package/dist/src/writing/voice-profiles.json +588 -0
  467. package/package.json +65 -9
@@ -0,0 +1,650 @@
1
+ /**
2
+ * RLM Agentic Tools CLI — Subcommand router for RLM support tools
3
+ *
4
+ * Subcommands:
5
+ * chunk <file> — Split file into overlapping chunks for fanout
6
+ * fanout <query> — Dispatch parallel subagent queries across chunks
7
+ * rlm-prep <file|dir> — Prepare source content (chunk + index + manifest)
8
+ * rlm-search <query> — Full recursive search pipeline
9
+ * rlm-status — Show active task tree, progress, and cost
10
+ *
11
+ * These tools are designed for agentic sessions implementing the RLM pattern
12
+ * (recursive decomposition + programmatic environment interaction). They are
13
+ * also directly invocable by users.
14
+ *
15
+ * Research foundation: REF-089 (Zhang et al., 2026)
16
+ *
17
+ * @implements #559
18
+ */
19
+ import * as fs from 'node:fs';
20
+ import * as path from 'node:path';
21
+ import { projectAiwgPath } from '../config/project-artifacts.js';
22
+ /**
23
+ * Resolve the effective `--parallel` / `--max-parallel` value for RLM CLI
24
+ * commands, composing all applicable caps. Returns:
25
+ * { effective, source, clamped, hardCapHit }
26
+ *
27
+ * Precedence (smallest wins):
28
+ * 1. `parallelism.max_parallel_subagents` from `.aiwg/aiwg.config` (#1359)
29
+ * 2. The RLM Rule 8 hard cap of 7
30
+ * 3. The user-supplied flag value (or hardcoded fallback when unset)
31
+ *
32
+ * When the user passes a value above the cap, we warn and clamp. When no
33
+ * flag is passed, we use the resolved cap directly as the default — that is
34
+ * the whole point of the project-level config.
35
+ *
36
+ * @implements #1360
37
+ */
38
+ export async function resolveRlmParallel(userValue, fallbackDefault, projectDir = process.cwd()) {
39
+ const RLM_HARD_CAP = 7;
40
+ try {
41
+ const { readAiwgConfig, resolveParallelism } = await import('../config/aiwg-config.js');
42
+ const cfg = await readAiwgConfig(projectDir);
43
+ if (!cfg) {
44
+ // No config — fall back to user value or fallback default, still clamped to RLM hard cap
45
+ const intended = userValue ?? fallbackDefault;
46
+ if (intended > RLM_HARD_CAP) {
47
+ return {
48
+ effective: RLM_HARD_CAP,
49
+ source: 'rlm-hard-cap',
50
+ warning: `--parallel=${intended} clamped to ${RLM_HARD_CAP} (RLM Rule 8 hard cap)`,
51
+ };
52
+ }
53
+ return { effective: intended, source: userValue !== undefined ? 'user-flag' : 'fallback-default' };
54
+ }
55
+ const resolved = resolveParallelism(cfg.parallelism, cfg.providers[0]);
56
+ const providerCap = resolved.max_parallel_subagents;
57
+ const effectiveCap = Math.min(providerCap, RLM_HARD_CAP);
58
+ if (userValue === undefined) {
59
+ // No flag — use the resolved cap as the default
60
+ return { effective: effectiveCap, source: providerCap <= RLM_HARD_CAP ? 'provider-default' : 'rlm-hard-cap' };
61
+ }
62
+ if (userValue > effectiveCap) {
63
+ const reason = providerCap < RLM_HARD_CAP
64
+ ? `parallelism.max_parallel_subagents=${providerCap}`
65
+ : `RLM Rule 8 hard cap of ${RLM_HARD_CAP}`;
66
+ return {
67
+ effective: effectiveCap,
68
+ source: providerCap < RLM_HARD_CAP ? 'provider-cap-clamp' : 'rlm-hard-cap',
69
+ warning: `--parallel=${userValue} clamped to ${effectiveCap} (${reason})`,
70
+ };
71
+ }
72
+ return { effective: userValue, source: 'user-flag' };
73
+ }
74
+ catch {
75
+ // Config read failed — fall back to user value or fallback default
76
+ const intended = userValue ?? fallbackDefault;
77
+ return { effective: Math.min(intended, RLM_HARD_CAP), source: 'fallback' };
78
+ }
79
+ }
80
+ /**
81
+ * Main CLI entry point for RLM agentic tool subcommands
82
+ */
83
+ export async function main(args) {
84
+ const subcommand = args[0];
85
+ const subArgs = args.slice(1);
86
+ switch (subcommand) {
87
+ case 'chunk':
88
+ await handleChunk(subArgs);
89
+ break;
90
+ case 'fanout':
91
+ await handleFanout(subArgs);
92
+ break;
93
+ case 'rlm-prep':
94
+ await handleRlmPrep(subArgs);
95
+ break;
96
+ case 'rlm-search':
97
+ await handleRlmSearch(subArgs);
98
+ break;
99
+ case 'rlm-status':
100
+ await handleRlmStatus(subArgs);
101
+ break;
102
+ case 'rlm-cache': {
103
+ const { main: cacheMain } = await import('./cache/cli.js');
104
+ await cacheMain(subArgs);
105
+ break;
106
+ }
107
+ default:
108
+ printUsage();
109
+ if (subcommand) {
110
+ throw new Error(`Unknown RLM subcommand: ${subcommand}`);
111
+ }
112
+ break;
113
+ }
114
+ }
115
+ // ============================================================
116
+ // chunk
117
+ // ============================================================
118
+ async function handleChunk(args) {
119
+ let file;
120
+ let chunkSize = 2000; // lines per chunk
121
+ let overlapArg; // resolved after chunkSize is known
122
+ let format = 'json';
123
+ let outputDir;
124
+ for (let i = 0; i < args.length; i++) {
125
+ switch (args[i]) {
126
+ case '--size':
127
+ chunkSize = parseInt(args[++i], 10);
128
+ break;
129
+ case '--overlap':
130
+ overlapArg = parseInt(args[++i], 10);
131
+ break;
132
+ case '--format':
133
+ format = args[++i];
134
+ break;
135
+ case '--output':
136
+ outputDir = args[++i];
137
+ break;
138
+ default:
139
+ if (!args[i].startsWith('--'))
140
+ file = args[i];
141
+ }
142
+ }
143
+ if (!file) {
144
+ throw new Error('Usage: aiwg chunk <file> [--size N] [--overlap N] [--format json|text] [--output <dir>]');
145
+ }
146
+ // Default overlap is 5% of chunkSize, clamped to [0, chunkSize-1] so stride is always ≥ 1.
147
+ const overlap = overlapArg !== undefined
148
+ ? Math.min(overlapArg, chunkSize - 1)
149
+ : Math.min(Math.floor(chunkSize * 0.05), chunkSize - 1);
150
+ const absoluteFile = path.resolve(file);
151
+ if (!fs.existsSync(absoluteFile)) {
152
+ throw new Error(`File not found: ${absoluteFile}`);
153
+ }
154
+ const content = fs.readFileSync(absoluteFile, 'utf-8');
155
+ const rawLines = content.split('\n');
156
+ // Remove trailing empty line produced by files ending with \n
157
+ const lines = rawLines[rawLines.length - 1] === '' ? rawLines.slice(0, -1) : rawLines;
158
+ const totalLines = lines.length;
159
+ if (totalLines <= chunkSize) {
160
+ const chunkFile = outputDir ? path.join(outputDir, 'chunk-0000.txt') : absoluteFile;
161
+ const manifestFile = outputDir ? path.join(outputDir, 'manifest.json') : undefined;
162
+ const chunks = [{ index: 0, start: 0, end: totalLines - 1, file: chunkFile, lines: totalLines }];
163
+ const result = {
164
+ source: absoluteFile,
165
+ totalLines,
166
+ chunkSize,
167
+ overlap: 0,
168
+ chunkDir: outputDir,
169
+ chunks,
170
+ message: 'File fits in a single chunk, no splitting required',
171
+ };
172
+ if (outputDir) {
173
+ fs.mkdirSync(outputDir, { recursive: true });
174
+ fs.writeFileSync(chunkFile, lines.join('\n'), 'utf-8');
175
+ fs.writeFileSync(manifestFile, JSON.stringify(result, null, 2), 'utf-8');
176
+ }
177
+ // File fits in one chunk — no splitting needed
178
+ console.log(JSON.stringify(result, null, 2));
179
+ return;
180
+ }
181
+ const chunkDir = outputDir ?? path.join(path.dirname(absoluteFile), `.rlm-chunks-${path.basename(absoluteFile)}`);
182
+ fs.mkdirSync(chunkDir, { recursive: true });
183
+ const chunks = [];
184
+ let chunkIndex = 0;
185
+ let start = 0;
186
+ while (start < totalLines) {
187
+ const end = Math.min(start + chunkSize - 1, totalLines - 1);
188
+ const chunkLines = lines.slice(start, end + 1);
189
+ const chunkFile = path.join(chunkDir, `chunk-${String(chunkIndex).padStart(4, '0')}.txt`);
190
+ fs.writeFileSync(chunkFile, chunkLines.join('\n'), 'utf-8');
191
+ chunks.push({ index: chunkIndex, start, end, file: chunkFile, lines: chunkLines.length });
192
+ chunkIndex++;
193
+ // Advance with overlap: next chunk starts (chunkSize - overlap) lines ahead.
194
+ // Clamp stride to at least 1 to prevent infinite loop when overlap >= chunkSize.
195
+ const stride = Math.max(1, chunkSize - overlap);
196
+ start += stride;
197
+ if (start >= totalLines)
198
+ break;
199
+ }
200
+ const manifest = {
201
+ source: absoluteFile,
202
+ totalLines,
203
+ chunkSize,
204
+ overlap,
205
+ chunkDir,
206
+ chunks,
207
+ createdAt: new Date().toISOString(),
208
+ };
209
+ const manifestFile = path.join(chunkDir, 'manifest.json');
210
+ fs.writeFileSync(manifestFile, JSON.stringify(manifest, null, 2), 'utf-8');
211
+ if (format === 'json') {
212
+ console.log(JSON.stringify(manifest, null, 2));
213
+ }
214
+ else {
215
+ console.log(`Chunked ${absoluteFile} into ${chunks.length} chunks`);
216
+ console.log(`Chunk directory: ${chunkDir}`);
217
+ console.log(`Manifest: ${manifestFile}`);
218
+ for (const chunk of chunks) {
219
+ console.log(` chunk-${String(chunk.index).padStart(4, '0')}: lines ${chunk.start}-${chunk.end} (${chunk.lines} lines)`);
220
+ }
221
+ }
222
+ }
223
+ // ============================================================
224
+ // fanout
225
+ // ============================================================
226
+ async function handleFanout(args) {
227
+ let query;
228
+ let chunksPath;
229
+ let userParallel;
230
+ let model = 'sonnet';
231
+ for (let i = 0; i < args.length; i++) {
232
+ switch (args[i]) {
233
+ case '--chunks':
234
+ chunksPath = args[++i];
235
+ break;
236
+ case '--parallel':
237
+ case '--max-parallel':
238
+ userParallel = parseInt(args[++i], 10);
239
+ break;
240
+ case '--model':
241
+ model = args[++i];
242
+ break;
243
+ default:
244
+ if (!args[i].startsWith('--'))
245
+ query = args[i];
246
+ }
247
+ }
248
+ if (!query || !chunksPath) {
249
+ throw new Error('Usage: aiwg fanout <query> --chunks <dir|manifest.json> [--parallel N] [--model haiku|sonnet|opus]');
250
+ }
251
+ // #1360: Resolve --parallel against aiwg.config parallelism cap (warn + clamp).
252
+ const resolved = await resolveRlmParallel(userParallel, 5);
253
+ const parallel = resolved.effective;
254
+ if (resolved.warning)
255
+ console.warn(`⚠ ${resolved.warning}`);
256
+ // Resolve manifest
257
+ let manifestFile;
258
+ const absoluteChunks = path.resolve(chunksPath);
259
+ if (!fs.existsSync(absoluteChunks)) {
260
+ throw new Error(`Manifest not found: ${absoluteChunks}. Run 'aiwg chunk' first.`);
261
+ }
262
+ if (fs.statSync(absoluteChunks).isDirectory()) {
263
+ manifestFile = path.join(absoluteChunks, 'manifest.json');
264
+ }
265
+ else {
266
+ manifestFile = absoluteChunks;
267
+ }
268
+ if (!fs.existsSync(manifestFile)) {
269
+ throw new Error(`Manifest not found: ${manifestFile}. Run 'aiwg chunk' first.`);
270
+ }
271
+ const manifest = JSON.parse(fs.readFileSync(manifestFile, 'utf-8'));
272
+ const chunks = manifest.chunks;
273
+ console.log(`Fanout: "${query}" across ${chunks.length} chunks`);
274
+ console.log(`Model: ${model}, Max parallel: ${parallel}`);
275
+ console.log('');
276
+ console.log('NOTE: This command produces a dispatch plan for the RLM agent to execute.');
277
+ console.log('The RLM agent spawns subagents for each chunk using the Task tool.');
278
+ console.log('');
279
+ console.log('Dispatch plan:');
280
+ // Output structured dispatch plan for the RLM agent
281
+ const dispatchPlan = {
282
+ query,
283
+ model,
284
+ maxParallel: parallel,
285
+ totalChunks: chunks.length,
286
+ waves: [],
287
+ };
288
+ for (let i = 0; i < chunks.length; i += parallel) {
289
+ const wave = chunks.slice(i, i + parallel);
290
+ dispatchPlan.waves.push({ wave: Math.floor(i / parallel), chunks: wave });
291
+ }
292
+ console.log(JSON.stringify(dispatchPlan, null, 2));
293
+ }
294
+ // ============================================================
295
+ // rlm-prep
296
+ // ============================================================
297
+ async function handleRlmPrep(args) {
298
+ let source;
299
+ let outputDir;
300
+ let strategy = 'adaptive';
301
+ let chunkSize = 2000;
302
+ for (let i = 0; i < args.length; i++) {
303
+ switch (args[i]) {
304
+ case '--output':
305
+ outputDir = args[++i];
306
+ break;
307
+ case '--strategy':
308
+ strategy = args[++i];
309
+ break;
310
+ case '--size':
311
+ chunkSize = parseInt(args[++i], 10);
312
+ break;
313
+ default:
314
+ if (!args[i].startsWith('--'))
315
+ source = args[i];
316
+ }
317
+ }
318
+ if (!source) {
319
+ throw new Error('Usage: aiwg rlm-prep <file|dir> [--output <dir>] [--strategy semantic-boundary|fixed-count|adaptive] [--size N]');
320
+ }
321
+ const absoluteSource = path.resolve(source);
322
+ if (!fs.existsSync(absoluteSource)) {
323
+ throw new Error(`Source not found: ${absoluteSource}`);
324
+ }
325
+ const prepDir = outputDir ?? path.join(process.cwd(), '.rlm-prep');
326
+ fs.mkdirSync(prepDir, { recursive: true });
327
+ const stat = fs.statSync(absoluteSource);
328
+ const files = [];
329
+ if (stat.isFile()) {
330
+ files.push(absoluteSource);
331
+ }
332
+ else {
333
+ // Recursively collect text files from directory
334
+ collectFiles(absoluteSource, files);
335
+ }
336
+ console.log(`RLM Prep: ${files.length} file(s) from ${absoluteSource}`);
337
+ console.log(`Strategy: ${strategy}, Chunk size: ${chunkSize} lines`);
338
+ console.log(`Output: ${prepDir}`);
339
+ console.log('');
340
+ const index = {
341
+ source: absoluteSource,
342
+ prepDir,
343
+ strategy,
344
+ chunkSize,
345
+ files: [],
346
+ createdAt: new Date().toISOString(),
347
+ };
348
+ for (const file of files) {
349
+ const relRoot = stat.isFile() ? path.dirname(absoluteSource) : absoluteSource;
350
+ const relPath = path.relative(relRoot, file);
351
+ const fileOutputDir = path.join(prepDir, relPath + '.chunks');
352
+ fs.mkdirSync(fileOutputDir, { recursive: true });
353
+ // Chunk this file
354
+ await handleChunk([file, '--size', String(chunkSize), '--output', fileOutputDir, '--format', 'json']);
355
+ const manifestFile = path.join(fileOutputDir, 'manifest.json');
356
+ if (fs.existsSync(manifestFile)) {
357
+ const manifest = JSON.parse(fs.readFileSync(manifestFile, 'utf-8'));
358
+ index.files.push({ path: file, manifest: manifestFile, chunks: manifest.chunks.length });
359
+ console.log(` ✓ ${relPath || path.basename(file)}: ${manifest.chunks.length} chunk(s)`);
360
+ }
361
+ }
362
+ const indexFile = path.join(prepDir, 'index.json');
363
+ fs.writeFileSync(indexFile, JSON.stringify(index, null, 2), 'utf-8');
364
+ console.log('');
365
+ console.log(`Index written: ${indexFile}`);
366
+ console.log(`Total files: ${index.files.length}`);
367
+ console.log(`Total chunks: ${index.files.reduce((sum, f) => sum + f.chunks, 0)}`);
368
+ }
369
+ function collectFiles(dir, results) {
370
+ const SKIP_DIRS = new Set(['.git', 'node_modules', '.rlm-prep', '.rlm-chunks']);
371
+ const TEXT_EXTENSIONS = new Set(['.ts', '.js', '.mjs', '.cjs', '.md', '.txt', '.json', '.yaml', '.yml', '.toml', '.sh']);
372
+ for (const entry of fs.readdirSync(dir)) {
373
+ if (SKIP_DIRS.has(entry))
374
+ continue;
375
+ const full = path.join(dir, entry);
376
+ const stat = fs.statSync(full);
377
+ if (stat.isDirectory()) {
378
+ collectFiles(full, results);
379
+ }
380
+ else if (TEXT_EXTENSIONS.has(path.extname(entry).toLowerCase())) {
381
+ results.push(full);
382
+ }
383
+ }
384
+ }
385
+ // ============================================================
386
+ // rlm-search
387
+ // ============================================================
388
+ async function handleRlmSearch(args) {
389
+ let query;
390
+ let sourceArg;
391
+ let depth = 3;
392
+ let userParallel;
393
+ let budget = 500000;
394
+ for (let i = 0; i < args.length; i++) {
395
+ switch (args[i]) {
396
+ case '--source':
397
+ sourceArg = args[++i];
398
+ break;
399
+ case '--depth':
400
+ depth = parseInt(args[++i], 10);
401
+ break;
402
+ case '--parallel':
403
+ case '--max-parallel':
404
+ userParallel = parseInt(args[++i], 10);
405
+ break;
406
+ case '--budget':
407
+ budget = parseInt(args[++i], 10);
408
+ break;
409
+ case '--help':
410
+ case '-h':
411
+ throw new Error('Usage: aiwg rlm-search <query> --source <file|dir> [--depth N] [--parallel N|--max-parallel N] [--budget N]');
412
+ default:
413
+ if (args[i].startsWith('--')) {
414
+ throw new Error(`Unknown rlm-search option: ${args[i]}`);
415
+ }
416
+ if (!query)
417
+ query = args[i];
418
+ }
419
+ }
420
+ if (!query || !sourceArg) {
421
+ throw new Error('Usage: aiwg rlm-search <query> --source <file|dir> [--depth N] [--parallel N|--max-parallel N] [--budget N]');
422
+ }
423
+ // #1360: Resolve --parallel against aiwg.config parallelism cap (warn + clamp).
424
+ const resolvedParallel = await resolveRlmParallel(userParallel, 5);
425
+ const parallel = resolvedParallel.effective;
426
+ if (resolvedParallel.warning)
427
+ console.warn(`⚠ ${resolvedParallel.warning}`);
428
+ const absoluteSource = path.resolve(sourceArg);
429
+ const prepDir = path.join(process.cwd(), '.rlm-prep');
430
+ const indexFile = path.join(prepDir, 'index.json');
431
+ console.log(`RLM Search: "${query}"`);
432
+ console.log(`Source: ${absoluteSource}`);
433
+ console.log(`Max depth: ${depth}, Max parallel: ${parallel}, Token budget: ${budget}`);
434
+ console.log('');
435
+ // Check if source is already prepped for this source. Older prep indexes may
436
+ // have omitted single-chunk files, so validate file coverage before reuse.
437
+ if (!isPrepIndexUsable(indexFile, absoluteSource)) {
438
+ console.log('Source not prepped — running rlm-prep first...');
439
+ await handleRlmPrep(['--output', prepDir, absoluteSource]);
440
+ console.log('');
441
+ }
442
+ const index = JSON.parse(fs.readFileSync(indexFile, 'utf-8'));
443
+ console.log(`Search plan (${index.files.length} file(s), ${index.files.reduce((s, f) => s + f.chunks, 0)} chunks total):`);
444
+ console.log('');
445
+ console.log('Phase 1 — Fan out query across all chunks');
446
+ console.log(` Dispatch ${Math.ceil(index.files.reduce((s, f) => s + f.chunks, 0) / parallel)} wave(s) of up to ${parallel} parallel subagents`);
447
+ console.log(' Each subagent: grep chunk for query, extract relevant passages');
448
+ console.log('');
449
+ console.log('Phase 2 — Synthesize results');
450
+ console.log(' Collect all relevant passages from Phase 1');
451
+ console.log(' If synthesis exceeds context: chunk passages and recurse (Phase 1 again)');
452
+ console.log(' When fits in one context: produce final answer');
453
+ console.log('');
454
+ console.log('Execution plan (JSON for RLM agent):');
455
+ const executionPlan = {
456
+ query,
457
+ source: absoluteSource,
458
+ indexFile,
459
+ maxDepth: depth,
460
+ maxParallel: parallel,
461
+ tokenBudget: budget,
462
+ phases: [
463
+ {
464
+ phase: 1,
465
+ name: 'fanout',
466
+ files: index.files.map((f) => ({
467
+ path: f.path,
468
+ manifest: f.manifest,
469
+ chunks: f.chunks,
470
+ })),
471
+ },
472
+ {
473
+ phase: 2,
474
+ name: 'synthesize',
475
+ description: 'Collect Phase 1 results, synthesize answer, recurse if needed',
476
+ },
477
+ ],
478
+ estimatedSubAgents: index.files.reduce((s, f) => s + f.chunks, 0),
479
+ };
480
+ console.log(JSON.stringify(executionPlan, null, 2));
481
+ }
482
+ function isPrepIndexUsable(indexFile, absoluteSource) {
483
+ if (!fs.existsSync(indexFile))
484
+ return false;
485
+ try {
486
+ const index = JSON.parse(fs.readFileSync(indexFile, 'utf-8'));
487
+ if (index.source !== absoluteSource)
488
+ return false;
489
+ if (!Array.isArray(index.files))
490
+ return false;
491
+ const stat = fs.statSync(absoluteSource);
492
+ const expectedFiles = [];
493
+ if (stat.isFile()) {
494
+ expectedFiles.push(absoluteSource);
495
+ }
496
+ else {
497
+ collectFiles(absoluteSource, expectedFiles);
498
+ }
499
+ if (index.files.length !== expectedFiles.length)
500
+ return false;
501
+ const indexed = new Set(index.files.map((f) => f.path));
502
+ for (const file of expectedFiles) {
503
+ if (!indexed.has(file))
504
+ return false;
505
+ }
506
+ for (const entry of index.files) {
507
+ if (!fs.existsSync(entry.manifest))
508
+ return false;
509
+ const manifest = JSON.parse(fs.readFileSync(entry.manifest, 'utf-8'));
510
+ if (!Array.isArray(manifest.chunks) || manifest.chunks.length !== entry.chunks)
511
+ return false;
512
+ if (manifest.chunks.some((chunk) => !chunk.file || !fs.existsSync(chunk.file)))
513
+ return false;
514
+ }
515
+ return true;
516
+ }
517
+ catch {
518
+ return false;
519
+ }
520
+ }
521
+ // ============================================================
522
+ // rlm-status
523
+ // ============================================================
524
+ async function handleRlmStatus(args) {
525
+ const showCost = args.includes('--cost');
526
+ const showTree = args.includes('--tree');
527
+ const asJson = args.includes('--json');
528
+ let taskId;
529
+ const taskIdIndex = args.indexOf('--task-id');
530
+ if (taskIdIndex !== -1)
531
+ taskId = args[taskIdIndex + 1];
532
+ // Look for RLM state files
533
+ const statePaths = [
534
+ projectAiwgPath(process.cwd(), 'ralph', 'rlm-state.json'),
535
+ path.join(process.cwd(), '.rlm-prep', 'index.json'),
536
+ ];
537
+ const stateFile = statePaths.find((p) => fs.existsSync(p));
538
+ if (!stateFile) {
539
+ const status = {
540
+ status: 'idle',
541
+ message: 'No active RLM task found. Start a task with `aiwg rlm-search` or `/rlm-query`.',
542
+ checkedPaths: statePaths,
543
+ };
544
+ if (asJson) {
545
+ console.log(JSON.stringify(status, null, 2));
546
+ }
547
+ else {
548
+ console.log('RLM Status: Idle');
549
+ console.log('No active RLM task found.');
550
+ console.log('Start a task with `aiwg rlm-search` or `/rlm-query`.');
551
+ }
552
+ return;
553
+ }
554
+ const state = JSON.parse(fs.readFileSync(stateFile, 'utf-8'));
555
+ if (asJson) {
556
+ console.log(JSON.stringify({ stateFile, taskId, state }, null, 2));
557
+ return;
558
+ }
559
+ console.log('RLM Status');
560
+ console.log('══════════');
561
+ console.log(`State file: ${stateFile}`);
562
+ if (state.source) {
563
+ console.log(`Source: ${state.source}`);
564
+ }
565
+ if (state.createdAt) {
566
+ console.log(`Created: ${state.createdAt}`);
567
+ }
568
+ if (state.files) {
569
+ console.log(`Files indexed: ${state.files.length}`);
570
+ const totalChunks = state.files.reduce((s, f) => s + f.chunks, 0);
571
+ console.log(`Total chunks: ${totalChunks}`);
572
+ }
573
+ if (showCost) {
574
+ const costFile = projectAiwgPath(process.cwd(), 'ralph', 'rlm-cost.json');
575
+ if (fs.existsSync(costFile)) {
576
+ const cost = JSON.parse(fs.readFileSync(costFile, 'utf-8'));
577
+ console.log('');
578
+ console.log('Cost breakdown:');
579
+ console.log(JSON.stringify(cost, null, 2));
580
+ }
581
+ else {
582
+ console.log('');
583
+ console.log('Cost tracking: No cost data available yet.');
584
+ }
585
+ }
586
+ if (showTree && state.taskTree) {
587
+ console.log('');
588
+ console.log('Task tree:');
589
+ printTaskTree(state.taskTree, 0);
590
+ }
591
+ }
592
+ function printTaskTree(node, depth) {
593
+ const indent = ' '.repeat(depth);
594
+ const status = node.status ?? 'unknown';
595
+ const icon = status === 'complete' ? '✓' : status === 'running' ? '⏳' : status === 'failed' ? '✗' : '○';
596
+ console.log(`${indent}${icon} ${node.id ?? 'root'} [${status}]`);
597
+ if (Array.isArray(node.children)) {
598
+ for (const child of node.children) {
599
+ printTaskTree(child, depth + 1);
600
+ }
601
+ }
602
+ }
603
+ // ============================================================
604
+ // Usage
605
+ // ============================================================
606
+ function printUsage() {
607
+ console.log(`AIWG Agentic Tools — Support tools for RLM sessions
608
+
609
+ Usage: aiwg <tool> [options]
610
+
611
+ Tools:
612
+ chunk <file> Split a file into overlapping chunks for fanout
613
+ fanout <query> Dispatch parallel subagent queries across chunks
614
+ rlm-prep <file|dir> Prepare source content (chunk + index + manifest)
615
+ rlm-search <query> Full recursive search pipeline
616
+ rlm-status Show active RLM task tree, progress, and cost
617
+
618
+ chunk options:
619
+ --size N Lines per chunk (default: 2000)
620
+ --overlap N Overlap lines between chunks (default: 100)
621
+ --format json|text Output format (default: json)
622
+ --output <dir> Output directory for chunks
623
+
624
+ fanout options:
625
+ --chunks <dir|manifest> Chunk directory or manifest.json (required)
626
+ --parallel N Max parallel subagents (default: 5)
627
+ --model haiku|sonnet|opus Model tier for subagents (default: sonnet)
628
+
629
+ rlm-prep options:
630
+ --output <dir> Output directory (default: .rlm-prep)
631
+ --strategy <s> semantic-boundary | fixed-count | adaptive (default: adaptive)
632
+ --size N Lines per chunk (default: 2000)
633
+
634
+ rlm-search options:
635
+ --source <file|dir> Source to search (required)
636
+ --depth N Max recursion depth (default: 3)
637
+ --parallel N Max parallel subagents per wave (default: 5)
638
+ --max-parallel N Alias for --parallel
639
+ --budget N Token budget (default: 500000)
640
+
641
+ rlm-status options:
642
+ --cost Show cost breakdown
643
+ --tree Show task tree
644
+ --json Output as JSON
645
+ --task-id <id> Show specific task
646
+
647
+ Research foundation: REF-089 (Zhang et al., 2026)
648
+ Documentation: agentic/code/addons/rlm/README.md`);
649
+ }
650
+ //# sourceMappingURL=cli.js.map