@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.17

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 (466) hide show
  1. package/README.md +21 -1
  2. package/bin/aiwg.mjs +349 -0
  3. package/dist/src/a2a/agent-card.js +145 -0
  4. package/dist/src/a2a/client.js +411 -0
  5. package/dist/src/a2a/hitl-cli.js +171 -0
  6. package/dist/src/a2a/hitl-driver.js +370 -0
  7. package/dist/src/a2a/hitl.js +181 -0
  8. package/dist/src/a2a/http.js +193 -0
  9. package/dist/src/a2a/jcs.js +128 -0
  10. package/dist/src/a2a/jws.js +187 -0
  11. package/dist/src/a2a/types.js +24 -0
  12. package/dist/src/a2a/webhook.js +240 -0
  13. package/dist/src/activity-log/cli.js +348 -0
  14. package/dist/src/activity-log/parser.js +81 -0
  15. package/dist/src/activity-log/types.js +50 -0
  16. package/dist/src/agents/agent-deployer.js +367 -0
  17. package/dist/src/agents/agent-packager.js +271 -0
  18. package/dist/src/agents/agent-validator.js +271 -0
  19. package/dist/src/agents/grounding/knowledge-base.js +161 -0
  20. package/dist/src/agents/grounding/types.js +12 -0
  21. package/dist/src/agents/index.js +10 -0
  22. package/dist/src/agents/packaged-agent-inventory.js +75 -0
  23. package/dist/src/agents/types.js +7 -0
  24. package/dist/src/api/index.d.ts +10 -0
  25. package/dist/src/api/index.js +10 -0
  26. package/dist/src/artifacts/address-parser.js +73 -0
  27. package/dist/src/artifacts/audit/cli.js +183 -0
  28. package/dist/src/artifacts/audit/drift.js +122 -0
  29. package/dist/src/artifacts/audit/types.js +12 -0
  30. package/dist/src/artifacts/backends/graphology-backend.js +160 -0
  31. package/dist/src/artifacts/backends/json-backend.js +129 -0
  32. package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
  33. package/dist/src/artifacts/browser-export.js +622 -0
  34. package/dist/src/artifacts/capability-resolver.js +94 -0
  35. package/dist/src/artifacts/checksum-manifest.js +91 -0
  36. package/dist/src/artifacts/citation-parser.js +162 -0
  37. package/dist/src/artifacts/cli.js +1462 -0
  38. package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
  39. package/dist/src/artifacts/corpus-tools/cli.js +393 -0
  40. package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
  41. package/dist/src/artifacts/corpus-tools/curator.js +186 -0
  42. package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
  43. package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
  44. package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
  45. package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
  46. package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
  47. package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
  48. package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
  49. package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
  50. package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
  51. package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
  52. package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
  53. package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
  54. package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
  55. package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
  56. package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
  57. package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
  58. package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
  59. package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
  60. package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
  61. package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
  62. package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
  63. package/dist/src/artifacts/corpus-views/build.js +126 -0
  64. package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
  65. package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
  66. package/dist/src/artifacts/corpus-views/renderers.js +353 -0
  67. package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
  68. package/dist/src/artifacts/dep-graph.js +173 -0
  69. package/dist/src/artifacts/discover-facets.js +375 -0
  70. package/dist/src/artifacts/embedding-index.js +354 -0
  71. package/dist/src/artifacts/enrichment/cli.js +240 -0
  72. package/dist/src/artifacts/enrichment/prompt.js +47 -0
  73. package/dist/src/artifacts/enrichment/store.js +90 -0
  74. package/dist/src/artifacts/enrichment/types.js +12 -0
  75. package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
  76. package/dist/src/artifacts/fortemi-core-sync.js +251 -0
  77. package/dist/src/artifacts/fortemi-shard-export.js +44 -0
  78. package/dist/src/artifacts/fulltext.js +108 -0
  79. package/dist/src/artifacts/graph-backend.js +51 -0
  80. package/dist/src/artifacts/graph-query.js +247 -0
  81. package/dist/src/artifacts/hybrid-query.js +225 -0
  82. package/dist/src/artifacts/index-builder.js +1089 -0
  83. package/dist/src/artifacts/index-reader.js +112 -0
  84. package/dist/src/artifacts/index-status.js +193 -0
  85. package/dist/src/artifacts/legacy-index-migration.js +169 -0
  86. package/dist/src/artifacts/move.js +154 -0
  87. package/dist/src/artifacts/operational-state.js +239 -0
  88. package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
  89. package/dist/src/artifacts/query-engine.js +1955 -0
  90. package/dist/src/artifacts/source-graph.js +529 -0
  91. package/dist/src/artifacts/stats.js +169 -0
  92. package/dist/src/artifacts/types.js +606 -0
  93. package/dist/src/artifacts/views/cli.js +293 -0
  94. package/dist/src/artifacts/views/definition.js +170 -0
  95. package/dist/src/artifacts/views/store.js +149 -0
  96. package/dist/src/artifacts/views/types.js +8 -0
  97. package/dist/src/artifacts/watcher.js +255 -0
  98. package/dist/src/catalog/builtin-models.json +636 -0
  99. package/dist/src/catalog/cli.js +228 -0
  100. package/dist/src/catalog/cli.mjs +289 -0
  101. package/dist/src/catalog/index.js +15 -0
  102. package/dist/src/catalog/loader.js +217 -0
  103. package/dist/src/catalog/loader.mjs +251 -0
  104. package/dist/src/catalog/sources.json +41 -0
  105. package/dist/src/catalog/types.js +8 -0
  106. package/dist/src/channel/manager.mjs +504 -0
  107. package/dist/src/cli/agent-spawn.js +178 -0
  108. package/dist/src/cli/cli-extension-loader.js +245 -0
  109. package/dist/src/cli/command-log.js +275 -0
  110. package/dist/src/cli/config-loader.js +232 -0
  111. package/dist/src/cli/env.js +82 -0
  112. package/dist/src/cli/errors.js +150 -0
  113. package/dist/src/cli/find-package-root.js +40 -0
  114. package/dist/src/cli/git-hooks.js +250 -0
  115. package/dist/src/cli/handlers/agentcard.js +206 -0
  116. package/dist/src/cli/handlers/artifacts.js +76 -0
  117. package/dist/src/cli/handlers/best-practices-audit.js +280 -0
  118. package/dist/src/cli/handlers/cockpit.js +137 -0
  119. package/dist/src/cli/handlers/command-log.js +37 -0
  120. package/dist/src/cli/handlers/daemon.js +59 -0
  121. package/dist/src/cli/handlers/diagnose.js +300 -0
  122. package/dist/src/cli/handlers/execution-mode.js +105 -0
  123. package/dist/src/cli/handlers/feedback.js +341 -0
  124. package/dist/src/cli/handlers/help.js +147 -0
  125. package/dist/src/cli/handlers/index.js +302 -0
  126. package/dist/src/cli/handlers/init.js +179 -0
  127. package/dist/src/cli/handlers/install.js +129 -0
  128. package/dist/src/cli/handlers/issues.js +46 -0
  129. package/dist/src/cli/handlers/lint.js +42 -0
  130. package/dist/src/cli/handlers/local-executor.js +315 -0
  131. package/dist/src/cli/handlers/marketplace.js +168 -0
  132. package/dist/src/cli/handlers/mc.js +1010 -0
  133. package/dist/src/cli/handlers/models.js +352 -0
  134. package/dist/src/cli/handlers/packages.js +155 -0
  135. package/dist/src/cli/handlers/ralph-launcher.js +717 -0
  136. package/dist/src/cli/handlers/ralph.js +575 -0
  137. package/dist/src/cli/handlers/refresh.js +432 -0
  138. package/dist/src/cli/handlers/regenerate.js +336 -0
  139. package/dist/src/cli/handlers/repo-access.js +109 -0
  140. package/dist/src/cli/handlers/run.js +165 -0
  141. package/dist/src/cli/handlers/runtime-info.js +301 -0
  142. package/dist/src/cli/handlers/sandbox.js +197 -0
  143. package/dist/src/cli/handlers/scaffolding.js +149 -0
  144. package/dist/src/cli/handlers/script-runner.js +121 -0
  145. package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
  146. package/dist/src/cli/handlers/serve.js +1835 -0
  147. package/dist/src/cli/handlers/session.js +348 -0
  148. package/dist/src/cli/handlers/setup.js +440 -0
  149. package/dist/src/cli/handlers/skill-lint.js +367 -0
  150. package/dist/src/cli/handlers/skill-usage.js +74 -0
  151. package/dist/src/cli/handlers/steward.js +567 -0
  152. package/dist/src/cli/handlers/subcommands.js +1702 -0
  153. package/dist/src/cli/handlers/team.js +337 -0
  154. package/dist/src/cli/handlers/types.js +11 -0
  155. package/dist/src/cli/handlers/use.js +2772 -0
  156. package/dist/src/cli/handlers/utilities.js +703 -0
  157. package/dist/src/cli/handlers/version.js +134 -0
  158. package/dist/src/cli/handlers/workspace-context.js +93 -0
  159. package/dist/src/cli/handlers/workspace.js +126 -0
  160. package/dist/src/cli/help-generator.js +178 -0
  161. package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
  162. package/dist/src/cli/hooks/executor.js +96 -0
  163. package/dist/src/cli/hooks/index.js +15 -0
  164. package/dist/src/cli/hooks/registry.js +143 -0
  165. package/dist/src/cli/hooks/types.js +13 -0
  166. package/dist/src/cli/log.js +492 -0
  167. package/dist/src/cli/project-isolation/detect.js +70 -0
  168. package/dist/src/cli/project-isolation/index.js +7 -0
  169. package/dist/src/cli/project-isolation/signals.js +17 -0
  170. package/dist/src/cli/project-isolation/warning.js +102 -0
  171. package/dist/src/cli/prompt-utils.js +155 -0
  172. package/dist/src/cli/provider-deployment-plan.js +126 -0
  173. package/dist/src/cli/provider-resolution.js +119 -0
  174. package/dist/src/cli/router.js +305 -0
  175. package/dist/src/cli/scope-resolver.js +392 -0
  176. package/dist/src/cli/skill-usage.js +616 -0
  177. package/dist/src/cli/ui.js +224 -0
  178. package/dist/src/cli/watch-service.js +203 -0
  179. package/dist/src/cli/workflow-orchestrator.js +478 -0
  180. package/dist/src/cli/workspace-signals.js +321 -0
  181. package/dist/src/community/footer.js +14 -0
  182. package/dist/src/community/links.js +123 -0
  183. package/dist/src/community/milestones.js +46 -0
  184. package/dist/src/community/nudge-policy.js +93 -0
  185. package/dist/src/config/aiwg-config.js +883 -0
  186. package/dist/src/config/cli.js +703 -0
  187. package/dist/src/config/gitignore.js +156 -0
  188. package/dist/src/config/project-artifacts.js +76 -0
  189. package/dist/src/config/user-config.js +428 -0
  190. package/dist/src/config/user-registry.js +127 -0
  191. package/dist/src/config/workspace.js +276 -0
  192. package/dist/src/contributors/detect.js +39 -0
  193. package/dist/src/contributors/discover.js +172 -0
  194. package/dist/src/contributors/heuristic.js +186 -0
  195. package/dist/src/contributors/index.js +11 -0
  196. package/dist/src/contributors/types.js +13 -0
  197. package/dist/src/contributors/validation.js +116 -0
  198. package/dist/src/data/community.schema.json +43 -0
  199. package/dist/src/data/community.yaml +16 -0
  200. package/dist/src/extensions/capability-index.js +270 -0
  201. package/dist/src/extensions/claude-hooks-installer.js +268 -0
  202. package/dist/src/extensions/commands/definitions.js +3485 -0
  203. package/dist/src/extensions/deployment-registration.js +463 -0
  204. package/dist/src/extensions/index.js +22 -0
  205. package/dist/src/extensions/loader.js +132 -0
  206. package/dist/src/extensions/managed-marker.js +100 -0
  207. package/dist/src/extensions/manifest.js +196 -0
  208. package/dist/src/extensions/project-local-activity.js +114 -0
  209. package/dist/src/extensions/project-local-discovery.js +261 -0
  210. package/dist/src/extensions/project-local-doctor.js +281 -0
  211. package/dist/src/extensions/project-local-gitignore.js +176 -0
  212. package/dist/src/extensions/project-local-paths.js +121 -0
  213. package/dist/src/extensions/project-local-promote.js +218 -0
  214. package/dist/src/extensions/project-local-remove.js +373 -0
  215. package/dist/src/extensions/project-local-scaffold.js +252 -0
  216. package/dist/src/extensions/project-quickref.js +291 -0
  217. package/dist/src/extensions/registry.js +368 -0
  218. package/dist/src/extensions/shadow-resolver.js +271 -0
  219. package/dist/src/extensions/types.js +86 -0
  220. package/dist/src/extensions/upstream-registry.js +195 -0
  221. package/dist/src/extensions/validation.js +631 -0
  222. package/dist/src/features/catalog.js +88 -0
  223. package/dist/src/features/cli.js +197 -0
  224. package/dist/src/features/installer.js +57 -0
  225. package/dist/src/features/paths.js +14 -0
  226. package/dist/src/features/runtime.js +21 -0
  227. package/dist/src/features/status.js +134 -0
  228. package/dist/src/hooks/laziness-detection.js +532 -0
  229. package/dist/src/intake/git-history-analyzer.js +486 -0
  230. package/dist/src/intake/index.js +9 -0
  231. package/dist/src/issues/cli.js +327 -0
  232. package/dist/src/issues/index.js +5 -0
  233. package/dist/src/issues/live.js +154 -0
  234. package/dist/src/issues/local.js +666 -0
  235. package/dist/src/issues/sync.js +143 -0
  236. package/dist/src/issues/types.js +2 -0
  237. package/dist/src/issues/workflows.js +164 -0
  238. package/dist/src/kb/cli.js +173 -0
  239. package/dist/src/lint/cli.js +171 -0
  240. package/dist/src/lint/loader.js +225 -0
  241. package/dist/src/lint/reporters.js +141 -0
  242. package/dist/src/lint/runner.js +364 -0
  243. package/dist/src/lint/types.js +10 -0
  244. package/dist/src/marketplace/cache.js +110 -0
  245. package/dist/src/marketplace/identifier.js +63 -0
  246. package/dist/src/marketplace/registry.js +36 -0
  247. package/dist/src/marketplace/sources/clawhub.js +53 -0
  248. package/dist/src/marketplace/sources/git.js +45 -0
  249. package/dist/src/marketplace/types.js +9 -0
  250. package/dist/src/mcp/adapters/codex-runtime.js +224 -0
  251. package/dist/src/mcp/cli.mjs +1197 -0
  252. package/dist/src/mcp/elicitation.mjs +149 -0
  253. package/dist/src/mcp/helpers.mjs +287 -0
  254. package/dist/src/mcp/index.mjs +11 -0
  255. package/dist/src/mcp/profiles.js +263 -0
  256. package/dist/src/mcp/profiles.mjs +360 -0
  257. package/dist/src/mcp/registry.js +376 -0
  258. package/dist/src/mcp/registry.mjs +387 -0
  259. package/dist/src/mcp/server.mjs +633 -0
  260. package/dist/src/mcp/test-simple.mjs +271 -0
  261. package/dist/src/mcp/tools/command-run.mjs +101 -0
  262. package/dist/src/mcp/tools/discovery.mjs +291 -0
  263. package/dist/src/mcp/tools/interaction.mjs +87 -0
  264. package/dist/src/mcp/tools/orchestration.mjs +320 -0
  265. package/dist/src/mcp/tools/subsystems.mjs +640 -0
  266. package/dist/src/memory/cli.js +166 -0
  267. package/dist/src/memory/project-registry.js +282 -0
  268. package/dist/src/metrics/artifact-metrics.js +184 -0
  269. package/dist/src/metrics/context-budget.js +174 -0
  270. package/dist/src/metrics/token-counter.js +133 -0
  271. package/dist/src/models/config-loader.js +228 -0
  272. package/dist/src/models/index.js +22 -0
  273. package/dist/src/models/model-capabilities.v1.json +120 -0
  274. package/dist/src/models/model-catalog.v1.json +96 -0
  275. package/dist/src/models/model-discovery.js +521 -0
  276. package/dist/src/models/provider-models.js +73 -0
  277. package/dist/src/models/provider-policy.js +273 -0
  278. package/dist/src/models/resolver.js +245 -0
  279. package/dist/src/models/router.js +70 -0
  280. package/dist/src/models/types.js +8 -0
  281. package/dist/src/models/wrapper-deployment.js +178 -0
  282. package/dist/src/models/wrapper-route.js +54 -0
  283. package/dist/src/ops/cli.js +268 -0
  284. package/dist/src/ops/registry.js +623 -0
  285. package/dist/src/packages/adapters/clawhub.js +113 -0
  286. package/dist/src/packages/adapters/git.js +153 -0
  287. package/dist/src/packages/adapters/gitea.js +93 -0
  288. package/dist/src/packages/adapters/github.js +69 -0
  289. package/dist/src/packages/adapters/local-cache.js +89 -0
  290. package/dist/src/packages/package-registry.js +143 -0
  291. package/dist/src/packages/registry.js +238 -0
  292. package/dist/src/packages/types.js +11 -0
  293. package/dist/src/plugin/cross-framework-ops.js +475 -0
  294. package/dist/src/plugin/framework-config-loader.js +235 -0
  295. package/dist/src/plugin/framework-detector.js +186 -0
  296. package/dist/src/plugin/framework-isolator.js +341 -0
  297. package/dist/src/plugin/framework-migration.js +371 -0
  298. package/dist/src/plugin/metadata-validator.js +906 -0
  299. package/dist/src/plugin/plugin-installer.js +436 -0
  300. package/dist/src/plugin/plugin-status.js +369 -0
  301. package/dist/src/plugin/plugin-uninstaller.js +473 -0
  302. package/dist/src/plugin/registry-validator.js +344 -0
  303. package/dist/src/plugin/skill-command-translator.js +415 -0
  304. package/dist/src/plugin/workspace-creator.js +189 -0
  305. package/dist/src/plugin/workspace-migrator.js +821 -0
  306. package/dist/src/policy/authorization.js +390 -0
  307. package/dist/src/policy/repo-access.js +215 -0
  308. package/dist/src/provenance/cli.js +16 -0
  309. package/dist/src/providers/capability-matrix.js +300 -0
  310. package/dist/src/providers/capability-matrix.yaml +514 -0
  311. package/dist/src/providers/provider-definitions.js +977 -0
  312. package/dist/src/providers/provider-definitions.mjs +159 -0
  313. package/dist/src/providers/provider-inventory.js +169 -0
  314. package/dist/src/quality/feedback-ab.js +174 -0
  315. package/dist/src/quality/feedback-collector.js +176 -0
  316. package/dist/src/quality/feedback-tracker.js +123 -0
  317. package/dist/src/quality/patterns/adr.json +24 -0
  318. package/dist/src/quality/patterns/sad.json +24 -0
  319. package/dist/src/quality/patterns/test-plan.json +24 -0
  320. package/dist/src/quality/patterns/use-case.json +24 -0
  321. package/dist/src/quality/scoring.js +157 -0
  322. package/dist/src/reflections/cli.js +15 -0
  323. package/dist/src/release/plan.js +139 -0
  324. package/dist/src/research/cache/manager.js +227 -0
  325. package/dist/src/research/clients/arxiv.js +156 -0
  326. package/dist/src/research/clients/base.js +197 -0
  327. package/dist/src/research/clients/crossref.js +112 -0
  328. package/dist/src/research/clients/semantic-scholar.js +126 -0
  329. package/dist/src/research/clients/unpaywall.js +87 -0
  330. package/dist/src/research/index.js +14 -0
  331. package/dist/src/research/query-cli.js +336 -0
  332. package/dist/src/research/services/acquisition.js +313 -0
  333. package/dist/src/research/services/archival.js +225 -0
  334. package/dist/src/research/services/citation.js +279 -0
  335. package/dist/src/research/services/discovery.js +243 -0
  336. package/dist/src/research/services/documentation.js +269 -0
  337. package/dist/src/research/services/index.js +14 -0
  338. package/dist/src/research/services/provenance.js +279 -0
  339. package/dist/src/research/services/quality.js +370 -0
  340. package/dist/src/research/services/types.js +7 -0
  341. package/dist/src/research/storage-cli.js +20 -0
  342. package/dist/src/research/types.js +47 -0
  343. package/dist/src/resources/index.d.ts +2 -0
  344. package/dist/src/resources/index.js +2 -0
  345. package/dist/src/resources/web-release.d.ts +89 -0
  346. package/dist/src/resources/web-release.js +882 -0
  347. package/dist/src/rlm/cache/cli.js +162 -0
  348. package/dist/src/rlm/cache/hash.js +35 -0
  349. package/dist/src/rlm/cache/store.js +170 -0
  350. package/dist/src/rlm/cache/types.js +8 -0
  351. package/dist/src/rlm/cli.js +650 -0
  352. package/dist/src/serve/a2a-terminal-observer.js +120 -0
  353. package/dist/src/serve/agent-router.js +205 -0
  354. package/dist/src/serve/dispatch-router.js +171 -0
  355. package/dist/src/serve/executor-registry.js +715 -0
  356. package/dist/src/serve/mission-conductor.js +177 -0
  357. package/dist/src/serve/orchestrator-adapter.js +113 -0
  358. package/dist/src/serve/orchestrator-override.js +94 -0
  359. package/dist/src/serve/orchestrator-pty.js +133 -0
  360. package/dist/src/serve/pty-bridge.js +799 -0
  361. package/dist/src/serve/sandbox-registry.js +832 -0
  362. package/dist/src/serve/screen-reader.js +228 -0
  363. package/dist/src/serve/stack-adapters.js +68 -0
  364. package/dist/src/serve/telemetry.js +143 -0
  365. package/dist/src/skills/adapters/clawhub.js +250 -0
  366. package/dist/src/skills/adapters/local.js +335 -0
  367. package/dist/src/skills/adapters/openclaw.js +316 -0
  368. package/dist/src/skills/cli.js +334 -0
  369. package/dist/src/skills/registry.js +117 -0
  370. package/dist/src/skills/run.js +259 -0
  371. package/dist/src/skills/runtime.js +94 -0
  372. package/dist/src/skills/types.js +10 -0
  373. package/dist/src/smiths/agentsmith/demo.js +116 -0
  374. package/dist/src/smiths/agentsmith/examples.js +300 -0
  375. package/dist/src/smiths/agentsmith/generator.js +503 -0
  376. package/dist/src/smiths/agentsmith/index.js +11 -0
  377. package/dist/src/smiths/agentsmith/types.js +8 -0
  378. package/dist/src/smiths/commandsmith/example.js +220 -0
  379. package/dist/src/smiths/commandsmith/generator.js +288 -0
  380. package/dist/src/smiths/commandsmith/index.js +41 -0
  381. package/dist/src/smiths/commandsmith/templates.js +296 -0
  382. package/dist/src/smiths/commandsmith/types.js +7 -0
  383. package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
  384. package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
  385. package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
  386. package/dist/src/smiths/context-pipeline/discovery.js +187 -0
  387. package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
  388. package/dist/src/smiths/context-pipeline/finalization.js +147 -0
  389. package/dist/src/smiths/context-pipeline/generator.js +477 -0
  390. package/dist/src/smiths/context-pipeline/index.js +30 -0
  391. package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
  392. package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
  393. package/dist/src/smiths/context-pipeline/overflow.js +212 -0
  394. package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
  395. package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
  396. package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
  397. package/dist/src/smiths/context-pipeline/types.js +23 -0
  398. package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
  399. package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
  400. package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
  401. package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
  402. package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
  403. package/dist/src/smiths/hook-bridge/index.js +79 -0
  404. package/dist/src/smiths/hook-bridge/loader.js +116 -0
  405. package/dist/src/smiths/hook-bridge/shim.js +89 -0
  406. package/dist/src/smiths/hook-bridge/types.js +31 -0
  407. package/dist/src/smiths/index.js +39 -0
  408. package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
  409. package/dist/src/smiths/mcpsmith/example.js +119 -0
  410. package/dist/src/smiths/mcpsmith/generator.js +236 -0
  411. package/dist/src/smiths/mcpsmith/index.js +17 -0
  412. package/dist/src/smiths/mcpsmith/types.js +10 -0
  413. package/dist/src/smiths/platform-paths.js +101 -0
  414. package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
  415. package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
  416. package/dist/src/smiths/skillsmith/demo.js +83 -0
  417. package/dist/src/smiths/skillsmith/examples.js +161 -0
  418. package/dist/src/smiths/skillsmith/generator.js +316 -0
  419. package/dist/src/smiths/skillsmith/index.js +12 -0
  420. package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
  421. package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
  422. package/dist/src/smiths/skillsmith/types.js +9 -0
  423. package/dist/src/smiths/toolsmith/index.js +10 -0
  424. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
  425. package/dist/src/smiths/toolsmith/types.js +8 -0
  426. package/dist/src/storage/backends/fortemi.js +227 -0
  427. package/dist/src/storage/backends/fs.js +134 -0
  428. package/dist/src/storage/backends/logseq.js +309 -0
  429. package/dist/src/storage/backends/obsidian.js +233 -0
  430. package/dist/src/storage/cli.js +468 -0
  431. package/dist/src/storage/config.js +272 -0
  432. package/dist/src/storage/index.js +108 -0
  433. package/dist/src/storage/subsystem-cli.js +201 -0
  434. package/dist/src/storage/types.js +33 -0
  435. package/dist/src/testing/corpus/corpus-builder.js +383 -0
  436. package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
  437. package/dist/src/testing/corpus/index.js +10 -0
  438. package/dist/src/testing/fixtures/index.js +9 -0
  439. package/dist/src/testing/fixtures/test-data-factory.js +472 -0
  440. package/dist/src/testing/generators/index.js +11 -0
  441. package/dist/src/testing/generators/test-case-generator.js +393 -0
  442. package/dist/src/testing/generators/test-code-generator.js +384 -0
  443. package/dist/src/testing/generators/use-case-parser.js +325 -0
  444. package/dist/src/testing/index.js +11 -0
  445. package/dist/src/tracker/capability-protocol.js +118 -0
  446. package/dist/src/update/checker.mjs +396 -0
  447. package/dist/src/update/notifier.mjs +235 -0
  448. package/dist/src/writing/content-diversifier.js +804 -0
  449. package/dist/src/writing/example-generator.js +959 -0
  450. package/dist/src/writing/example-templates.js +99 -0
  451. package/dist/src/writing/pattern-library.js +486 -0
  452. package/dist/src/writing/patterns/banned-phrases.json +4413 -0
  453. package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
  454. package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
  455. package/dist/src/writing/patterns/hedging-language.json +2096 -0
  456. package/dist/src/writing/patterns/transition-words.json +1285 -0
  457. package/dist/src/writing/patterns/weak-verbs.json +1112 -0
  458. package/dist/src/writing/prompt-optimizer.js +660 -0
  459. package/dist/src/writing/prompt-templates.js +583 -0
  460. package/dist/src/writing/scoring-config-loader.js +168 -0
  461. package/dist/src/writing/validation-engine.js +595 -0
  462. package/dist/src/writing/validation-rules.js +380 -0
  463. package/dist/src/writing/voice-analyzer.js +439 -0
  464. package/dist/src/writing/voice-calibration.js +661 -0
  465. package/dist/src/writing/voice-profiles.json +588 -0
  466. package/package.json +64 -9
@@ -0,0 +1,393 @@
1
+ /**
2
+ * `aiwg corpus` subcommand router — radar/freshness tools (#1498).
3
+ *
4
+ * Mirrors src/artifacts/cli.ts (the `aiwg index` router): a thin arg parser that
5
+ * resolves the corpus root (env > research.corpusRoot > cwd, via build.ts's
6
+ * resolveCorpusRoot) and dispatches to the corpus-tools functions. The
7
+ * research-complete radar-* skills wrap these subcommands.
8
+ *
9
+ * Subcommands:
10
+ * radar-init --ref REF-XXX | --all-missing [--cadence C] [--cluster T] [--write]
11
+ * radar-status [--stale-only] [--format table|csv|list] [--out PATH]
12
+ * radar-report [--cluster T] [--out PATH]
13
+ *
14
+ * @source historical: corpus/radar_init.py, radar_staleness.py, radar_report.py
15
+ */
16
+ import * as fs from 'fs';
17
+ import * as path from 'path';
18
+ import { resolveCorpusRoot } from '../corpus-views/build.js';
19
+ import { scaffoldRadar, radarInitMissing } from './radar-init.js';
20
+ import { radarStatusRows, renderRadarStatus } from './radar-status.js';
21
+ import { renderRadarReport } from './radar-report.js';
22
+ import { profileStatusRows, renderProfileStatus } from './profile-status.js';
23
+ import { generateTier1Profiles } from './profile-generate.js';
24
+ import { generateFmProfiles } from './profile-generate-fm.js';
25
+ import { curatorRows, curatorOrphans, renderCuratorStatus, scaffoldCurator } from './curator.js';
26
+ import { logDiscovery } from './discovery-log.js';
27
+ import { computeMetrics, renderMetrics } from './profile-metrics.js';
28
+ import { computeTrajectory, renderTrajectory } from './profile-temporal.js';
29
+ import { detectCommunities, detectSkosCommunities, renderCommunities, renderSkosCommunities } from './profile-communities.js';
30
+ import { funderRows, cofundingClusters, renderFunderNetwork } from './funder-network.js';
31
+ import { lintSidecars, renderLint, findOrphans, renderOrphans } from './sidecar-lint.js';
32
+ import { repairAuthors, normalizeAffiliations, renderRepair } from './sidecar-repair.js';
33
+ import { extractCrossrefs, renderCrossrefs, backfillCitations, renderBackfill } from './citation-densify.js';
34
+ import { scanCorpus, renderScan, writeQuarantineReports, failsThreshold } from './integrity-scan.js';
35
+ import { loadSourceTypeRegistry, renderSourceTypes } from './source-types.js';
36
+ import { auditInductions, renderAudit, backfillFrontmatter, renderBackfill as renderBackfillFm } from './induction-audit.js';
37
+ import { buildProfileEdges, renderProfileEdges } from './profile-edges.js';
38
+ import { extractPages, renderExtract, resolveAdapter, rasterizePdf } from './vision-extract.js';
39
+ import { runSnapshot } from './snapshot.js';
40
+ function flagValue(args, name) {
41
+ const i = args.indexOf(name);
42
+ return i !== -1 && i + 1 < args.length ? args[i + 1] : undefined;
43
+ }
44
+ function hasFlag(args, name) {
45
+ return args.includes(name);
46
+ }
47
+ const HELP = `aiwg corpus — research-corpus tools
48
+
49
+ Usage:
50
+ aiwg corpus radar-init --ref REF-XXX [--cadence C] [--cluster T] [--write]
51
+ aiwg corpus radar-init --all-missing [--write]
52
+ aiwg corpus radar-status [--stale-only] [--format table|csv|list] [--out PATH]
53
+ aiwg corpus radar-report [--cluster TAG] [--out PATH]
54
+ aiwg corpus profile-status [--stale-only] [--format table|csv|list] [--out PATH]
55
+ aiwg corpus profile-generate [--limit N] [--scan N] [--write]
56
+ aiwg corpus profile-generate --fm [--write]
57
+ aiwg corpus curator-status [--out PATH]
58
+ aiwg corpus curator-init --handle @h [--platform x] [--name "N"] [--cadence weekly] [--write]
59
+ aiwg corpus discovery-log --ref REF-XXX --surface SURFACE [--via "..."] [--curator PROF-S-x] [--date D] [--batch B] [--by A] [--write]
60
+ aiwg corpus profile-metrics [--papers] [--out PATH]
61
+ aiwg corpus profile-temporal --entity PROF-P-x [--out PATH]
62
+ aiwg corpus profile-communities [--skos-export PATH] [--out PATH]
63
+ aiwg corpus funder-network [--scan-acks] [--out PATH]
64
+ aiwg corpus sidecar-lint [--orphans] [--out PATH]
65
+ aiwg corpus sidecar-repair [--authors-only | --affiliations-only] [--write] [--out PATH]
66
+ aiwg corpus extract-crossrefs [--refs REF-a,REF-b] [--write] [--out PATH]
67
+ aiwg corpus citation-backfill [--write] [--out PATH]
68
+ aiwg corpus integrity-scan [--ref REF-XXX] [--quarantine] [--fail-on review|quarantine] [--out PATH]
69
+ aiwg corpus source-types [--json] [--out PATH]
70
+ aiwg corpus induction-audit [--start N --end N | --ref REF-XXX] [--out PATH]
71
+ aiwg corpus snapshot [--compute-only] [--delta-only] [--template PATH] [--format full|summary|json] [--out PATH] [--date YYYY-MM-DD] [--write] [--notes TEXT]
72
+ aiwg corpus frontmatter-backfill [--write] [--out PATH]
73
+ aiwg corpus profile-edges [--out PATH]
74
+ aiwg corpus profile-similar --entity PROF-P-x [--top K] | --predict-collabs [--threshold T] [--out PATH]
75
+ aiwg corpus vision-extract --slug SLUG [--images DIR] [--out DIR] [--start N] [--end N] [--provider codex|command] [--command TMPL] [--model M] [--retries N] [--title T] [--force] [--rasterize PDF] [--dpi N]
76
+
77
+ radar-init scaffolds radar sidecars (dry-run unless --write; skips existing).
78
+ radar-status reports overdue radars (most-overdue-first).
79
+ radar-report aggregates corpus/cluster freshness.
80
+ profile-status reports entity profiles past their refresh cadence.
81
+ profile-generate scaffolds PROF-P profiles for unprofiled hub authors (dry-run unless --write).
82
+ profile-generate --fm scaffolds FM-author PROF-P + group PROF-G profiles from documentation/profiles/fm-config.yaml.
83
+ curator-status reports PROF-S curators by yield (return-to score) + discovery orphans.
84
+ curator-init scaffolds a PROF-S source/curator profile from a handle.
85
+ discovery-log records the discovery block on a citation sidecar.
86
+ profile-metrics computes h-index / CD-index / PageRank / centrality per profile (--papers for paper-level).
87
+ profile-temporal computes publication trajectory + hot-streak for one profile.
88
+ profile-communities detects co-author communities + modularity + bridge authors; --skos-export groups Fortemi v2 records by extracted SKOS concepts.
89
+ funder-network reports per-funder yield (A-grade, mean CD, novelty bias) + co-funding clusters.
90
+ sidecar-lint reports citation-sidecar structural issues (missing sections/frontmatter, duplicate table headers); --orphans lists zero-edge sidecars.
91
+ sidecar-repair backfills (see REF doc) authors from the analysis citation block + normalizes affiliation-primary to PROF-O slugs (dry-run unless --write).
92
+ extract-crossrefs injects analysis-doc Cross-References REFs (that have a sidecar) as missing outgoing edges (dry-run unless --write).
93
+ citation-backfill computes the inverse citation map + injects missing incoming edges; reports dangling cited-but-no-sidecar targets (dry-run unless --write).
94
+ integrity-scan flags LLM residue / placeholders / submission risks per REF (pass/review/quarantine); --quarantine writes per-REF reports; --fail-on exits non-zero at threshold.
95
+ source-types lists the canonical source-type registry (paper/preprint/blog/repo/…) that normalizes the type/source_type/Source-Type vocabularies; override per-corpus at documentation/source-types.yaml.
96
+ induction-audit checks induction depth-bands + structural integrity + per-source-type required sections (a blog isn't flagged for missing Benchmark Results).
97
+ snapshot computes one-shot corpus snapshot metrics and renders full markdown, terminal summary, or JSON; --write emits .aiwg/reports/corpus-snapshot-YYYY-MM-DD.md.
98
+ frontmatter-backfill adds minimal ref_id/title/year/pdf_hash frontmatter to legacy analysis docs lacking it (dry-run unless --write; additive, skips docs that already have frontmatter).
99
+ profile-edges builds the profile→REF edge graph (first-class adjacency; reconciled against the citation graph so only edges to existing REFs are kept).
100
+ profile-similar embeds person profiles (text-embedding; opt-in @xenova/transformers) → nearest researchers (--entity) or collaboration link-prediction (--predict-collabs).
101
+ vision-extract transcribes scanned page PNGs → per-page + combined Markdown via a provider-neutral vision adapter (codex | command template), resumable with retry/validation; --rasterize PDF first renders pages via pdftoppm.
102
+ `;
103
+ function radarInit(root, args) {
104
+ const write = hasFlag(args, '--write');
105
+ const cadence = flagValue(args, '--cadence');
106
+ const cluster = flagValue(args, '--cluster');
107
+ if (hasFlag(args, '--all-missing')) {
108
+ const results = radarInitMissing(root, { cadence, cluster, write });
109
+ console.log(`Refs missing radars: ${results.length}`);
110
+ for (const r of results)
111
+ console.log(' ' + r.message);
112
+ return;
113
+ }
114
+ const ref = flagValue(args, '--ref');
115
+ if (!ref)
116
+ throw new Error('radar-init requires --ref <REF-XXX> or --all-missing');
117
+ console.log(scaffoldRadar(root, ref, { cadence, cluster, write }).message);
118
+ }
119
+ function radarStatus(root, args) {
120
+ const staleOnly = hasFlag(args, '--stale-only');
121
+ const format = (flagValue(args, '--format') ?? 'table');
122
+ if (!['table', 'csv', 'list'].includes(format)) {
123
+ throw new Error(`radar-status: invalid --format '${format}' (table|csv|list)`);
124
+ }
125
+ const content = renderRadarStatus(radarStatusRows(root, { staleOnly }), format);
126
+ emit(content, flagValue(args, '--out'), root);
127
+ }
128
+ function radarReport(root, args) {
129
+ const content = renderRadarReport(root, { cluster: flagValue(args, '--cluster') });
130
+ emit(content, flagValue(args, '--out'), root);
131
+ }
132
+ function profileStatus(root, args) {
133
+ const staleOnly = hasFlag(args, '--stale-only');
134
+ const format = (flagValue(args, '--format') ?? 'table');
135
+ if (!['table', 'csv', 'list'].includes(format)) {
136
+ throw new Error(`profile-status: invalid --format '${format}' (table|csv|list)`);
137
+ }
138
+ const content = renderProfileStatus(profileStatusRows(root, { staleOnly }), format);
139
+ emit(content, flagValue(args, '--out'), root);
140
+ }
141
+ function profileGenerate(root, args) {
142
+ const write = hasFlag(args, '--write');
143
+ if (hasFlag(args, '--fm')) {
144
+ const results = generateFmProfiles(root, { write });
145
+ console.log(`FM profiles (from fm-config.yaml): ${results.length}`);
146
+ for (const r of results)
147
+ console.log(' ' + r.message);
148
+ return;
149
+ }
150
+ const limit = flagValue(args, '--limit');
151
+ const scan = flagValue(args, '--scan');
152
+ const results = generateTier1Profiles(root, {
153
+ write,
154
+ limit: limit ? parseInt(limit, 10) : undefined,
155
+ scan: scan ? parseInt(scan, 10) : undefined,
156
+ });
157
+ console.log(`Tier-1 candidates: ${results.length}`);
158
+ for (const r of results)
159
+ console.log(' ' + r.message);
160
+ }
161
+ function curatorInit(root, args) {
162
+ const handle = flagValue(args, '--handle');
163
+ if (!handle)
164
+ throw new Error('curator-init requires --handle <@account>');
165
+ const res = scaffoldCurator(root, handle, {
166
+ platform: flagValue(args, '--platform'),
167
+ name: flagValue(args, '--name'),
168
+ cadence: flagValue(args, '--cadence'),
169
+ write: hasFlag(args, '--write'),
170
+ });
171
+ console.log(res.message);
172
+ }
173
+ function discoveryLog(root, args) {
174
+ const ref = flagValue(args, '--ref');
175
+ const surface = flagValue(args, '--surface');
176
+ if (!ref || !surface)
177
+ throw new Error('discovery-log requires --ref <REF-XXX> and --surface <surface>');
178
+ const res = logDiscovery(root, ref, {
179
+ surface,
180
+ via: flagValue(args, '--via'),
181
+ curatorId: flagValue(args, '--curator'),
182
+ date: flagValue(args, '--date'),
183
+ harvestBatch: flagValue(args, '--batch'),
184
+ harvestedBy: flagValue(args, '--by'),
185
+ write: hasFlag(args, '--write'),
186
+ });
187
+ console.log(res.message);
188
+ if (res.status === 'dry-run') {
189
+ console.log('--- discovery block ---');
190
+ console.log(res.block);
191
+ }
192
+ }
193
+ function profileTemporal(root, args) {
194
+ const entity = flagValue(args, '--entity');
195
+ if (!entity)
196
+ throw new Error('profile-temporal requires --entity <PROF-P-x>');
197
+ emit(renderTrajectory(computeTrajectory(root, entity)), flagValue(args, '--out'), root);
198
+ }
199
+ function sidecarLint(root, args) {
200
+ if (hasFlag(args, '--orphans')) {
201
+ emit(renderOrphans(findOrphans(root)), flagValue(args, '--out'), root);
202
+ return;
203
+ }
204
+ emit(renderLint(lintSidecars(root)), flagValue(args, '--out'), root);
205
+ }
206
+ function sidecarRepair(root, args) {
207
+ const write = hasFlag(args, '--write');
208
+ const authorsOnly = hasFlag(args, '--authors-only');
209
+ const affilOnly = hasFlag(args, '--affiliations-only');
210
+ const authors = affilOnly ? [] : repairAuthors(root, { write });
211
+ const affil = authorsOnly
212
+ ? { normalized: 0, alreadyCanonical: 0, ambiguous: [], errors: [], changes: [] }
213
+ : normalizeAffiliations(root, { write });
214
+ emit(renderRepair(authors, affil, write), flagValue(args, '--out'), root);
215
+ }
216
+ function snapshot(root, args) {
217
+ const format = (flagValue(args, '--format') ?? 'full');
218
+ if (!['full', 'summary', 'json'].includes(format ?? '')) {
219
+ throw new Error(`snapshot: invalid --format '${format}' (full|summary|json)`);
220
+ }
221
+ const result = runSnapshot(root, {
222
+ computeOnly: hasFlag(args, '--compute-only'),
223
+ deltaOnly: hasFlag(args, '--delta-only'),
224
+ write: hasFlag(args, '--write'),
225
+ template: flagValue(args, '--template'),
226
+ format,
227
+ out: flagValue(args, '--out'),
228
+ date: flagValue(args, '--date'),
229
+ notes: flagValue(args, '--notes'),
230
+ });
231
+ if (result.outPath) {
232
+ console.log(`Wrote ${path.relative(root, result.outPath)}`);
233
+ return;
234
+ }
235
+ process.stdout.write(result.content);
236
+ }
237
+ /** Write to --out (resolved against the corpus root) or print to stdout. */
238
+ function emit(content, out, root) {
239
+ if (!out) {
240
+ process.stdout.write(content);
241
+ return;
242
+ }
243
+ const outPath = path.isAbsolute(out) ? out : path.join(root, out);
244
+ fs.mkdirSync(path.dirname(outPath), { recursive: true });
245
+ fs.writeFileSync(outPath, content, 'utf-8');
246
+ console.log(`Wrote ${path.relative(root, outPath)}`);
247
+ }
248
+ /** Route `aiwg corpus <subcommand> [...args]`. Throws on error (handler maps to exit code). */
249
+ export async function corpusMain(args, cwd = process.cwd()) {
250
+ const sub = args[0];
251
+ const rest = args.slice(1);
252
+ if (!sub || sub === 'help' || sub === '--help' || sub === '-h') {
253
+ process.stdout.write(HELP);
254
+ return;
255
+ }
256
+ const root = await resolveCorpusRoot(cwd);
257
+ switch (sub) {
258
+ case 'radar-init':
259
+ return radarInit(root, rest);
260
+ case 'radar-status':
261
+ return radarStatus(root, rest);
262
+ case 'radar-report':
263
+ return radarReport(root, rest);
264
+ case 'profile-status':
265
+ return profileStatus(root, rest);
266
+ case 'profile-generate':
267
+ return profileGenerate(root, rest);
268
+ case 'curator-status':
269
+ return emit(renderCuratorStatus(curatorRows(root), curatorOrphans(root)), flagValue(rest, '--out'), root);
270
+ case 'curator-init':
271
+ return curatorInit(root, rest);
272
+ case 'discovery-log':
273
+ return discoveryLog(root, rest);
274
+ case 'profile-metrics':
275
+ return emit(renderMetrics(computeMetrics(root), hasFlag(rest, '--papers') ? 'papers' : 'people'), flagValue(rest, '--out'), root);
276
+ case 'profile-temporal':
277
+ return profileTemporal(root, rest);
278
+ case 'profile-communities':
279
+ if (flagValue(rest, '--skos-export')) {
280
+ const exportPath = path.resolve(root, flagValue(rest, '--skos-export'));
281
+ const exported = JSON.parse(fs.readFileSync(exportPath, 'utf-8'));
282
+ return emit(renderSkosCommunities(detectSkosCommunities(exported)), flagValue(rest, '--out'), root);
283
+ }
284
+ return emit(renderCommunities(detectCommunities(root)), flagValue(rest, '--out'), root);
285
+ case 'funder-network':
286
+ return emit(renderFunderNetwork(funderRows(root, { scanAcks: hasFlag(rest, '--scan-acks') }), cofundingClusters(root)), flagValue(rest, '--out'), root);
287
+ case 'sidecar-lint':
288
+ return sidecarLint(root, rest);
289
+ case 'sidecar-repair':
290
+ return sidecarRepair(root, rest);
291
+ case 'extract-crossrefs': {
292
+ const refs = flagValue(rest, '--refs')?.split(',').map((s) => s.trim()).filter(Boolean);
293
+ const write = hasFlag(rest, '--write');
294
+ return emit(renderCrossrefs(extractCrossrefs(root, { refs, write }), write), flagValue(rest, '--out'), root);
295
+ }
296
+ case 'citation-backfill': {
297
+ const write = hasFlag(rest, '--write');
298
+ return emit(renderBackfill(backfillCitations(root, { write }), write), flagValue(rest, '--out'), root);
299
+ }
300
+ case 'integrity-scan': {
301
+ const result = scanCorpus(root, { ref: flagValue(rest, '--ref') });
302
+ emit(renderScan(result), flagValue(rest, '--out'), root);
303
+ if (hasFlag(rest, '--quarantine')) {
304
+ const written = writeQuarantineReports(root, result);
305
+ if (written.length) {
306
+ console.log('\nQuarantine reports written:');
307
+ for (const w of written)
308
+ console.log(` ${w}`);
309
+ }
310
+ }
311
+ const failOn = flagValue(rest, '--fail-on');
312
+ if (failOn === 'review' || failOn === 'quarantine') {
313
+ if (failsThreshold(result, failOn))
314
+ throw new Error(`integrity-scan: REFs reached '${failOn}' threshold`);
315
+ }
316
+ return;
317
+ }
318
+ case 'source-types': {
319
+ const reg = loadSourceTypeRegistry(root);
320
+ if (hasFlag(rest, '--json')) {
321
+ emit(JSON.stringify(reg, null, 2) + '\n', flagValue(rest, '--out'), root);
322
+ }
323
+ else {
324
+ emit(renderSourceTypes(reg), flagValue(rest, '--out'), root);
325
+ }
326
+ return;
327
+ }
328
+ case 'induction-audit': {
329
+ const startStr = flagValue(rest, '--start');
330
+ const endStr = flagValue(rest, '--end');
331
+ const ref = flagValue(rest, '--ref');
332
+ const results = auditInductions(root, {
333
+ start: startStr ? parseInt(startStr, 10) : undefined,
334
+ end: endStr ? parseInt(endStr, 10) : undefined,
335
+ refs: ref ? [ref] : undefined,
336
+ });
337
+ return emit(renderAudit(results), flagValue(rest, '--out'), root);
338
+ }
339
+ case 'snapshot':
340
+ return snapshot(root, rest);
341
+ case 'frontmatter-backfill': {
342
+ const write = hasFlag(rest, '--write');
343
+ return emit(renderBackfillFm(backfillFrontmatter(root, { write }), write), flagValue(rest, '--out'), root);
344
+ }
345
+ case 'profile-edges':
346
+ return emit(renderProfileEdges(buildProfileEdges(root)), flagValue(rest, '--out'), root);
347
+ case 'vision-extract': {
348
+ const slug = flagValue(rest, '--slug');
349
+ if (!slug)
350
+ throw new Error('vision-extract requires --slug <slug>');
351
+ const imageDir = flagValue(rest, '--images') ?? path.join(root, '.aiwg', 'research', 'sources', 'images', slug, 'pages');
352
+ const outDir = flagValue(rest, '--out') ?? path.join(root, '.aiwg', 'research', 'sources', 'text', `${slug}-vision`);
353
+ const pdf = flagValue(rest, '--rasterize');
354
+ if (pdf) {
355
+ const dpi = flagValue(rest, '--dpi') ? parseInt(flagValue(rest, '--dpi'), 10) : 200;
356
+ const n = rasterizePdf(path.isAbsolute(pdf) ? pdf : path.join(root, pdf), imageDir, dpi);
357
+ console.log(`Rasterized ${n} pages → ${imageDir}`);
358
+ }
359
+ const adapter = resolveAdapter({ provider: flagValue(rest, '--provider'), command: flagValue(rest, '--command') });
360
+ const result = await extractPages({
361
+ imageDir,
362
+ outDir,
363
+ adapter,
364
+ title: flagValue(rest, '--title'),
365
+ start: flagValue(rest, '--start') ? parseInt(flagValue(rest, '--start'), 10) : undefined,
366
+ end: flagValue(rest, '--end') ? parseInt(flagValue(rest, '--end'), 10) : undefined,
367
+ retries: flagValue(rest, '--retries') ? parseInt(flagValue(rest, '--retries'), 10) : undefined,
368
+ model: flagValue(rest, '--model'),
369
+ force: hasFlag(rest, '--force'),
370
+ });
371
+ console.log(renderExtract(result));
372
+ console.log(` per-page + combined → ${outDir}`);
373
+ return;
374
+ }
375
+ case 'profile-similar': {
376
+ const { buildProfileEmbeddings, profileSimilar, collaborationPredictions, renderSimilar, renderCollabPredictions } = await import('./profile-embed.js');
377
+ const emb = await buildProfileEmbeddings(root);
378
+ if (hasFlag(rest, '--predict-collabs')) {
379
+ const threshold = flagValue(rest, '--threshold') ? parseFloat(flagValue(rest, '--threshold')) : 0.8;
380
+ return emit(renderCollabPredictions(collaborationPredictions(emb, threshold), threshold), flagValue(rest, '--out'), root);
381
+ }
382
+ const entity = flagValue(rest, '--entity');
383
+ if (!entity)
384
+ throw new Error('profile-similar requires --entity <PROF-P-x> or --predict-collabs');
385
+ const top = flagValue(rest, '--top') ? parseInt(flagValue(rest, '--top'), 10) : 10;
386
+ return emit(renderSimilar(entity, profileSimilar(emb, entity, top)), flagValue(rest, '--out'), root);
387
+ }
388
+ default:
389
+ process.stderr.write(`Unknown corpus subcommand: ${sub}\n\n${HELP}`);
390
+ throw new Error(`unknown corpus subcommand: ${sub}`);
391
+ }
392
+ }
393
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Corpus graph construction + analytics algorithms (#1501).
3
+ *
4
+ * NetworkX-equivalent ports (no graph library): co-author + citation graphs from
5
+ * the #1497 parser, plus h-index, CD-index (disruption), PageRank, betweenness,
6
+ * eigenvector, and clustering. Used by profile-metrics / profile-communities.
7
+ *
8
+ * @source historical: profiles/build_graphs.py, profiles/compute_metrics.py
9
+ * References: Hirsch 2005 (h-index); Wu-Wang-Evans 2019 (CD-index);
10
+ * Brandes 2001 (betweenness); Newman 2003 (centrality).
11
+ */
12
+ /** Build the citation graph from corpus outgoing edges (in-corpus targets only). */
13
+ export function buildCitationGraph(records) {
14
+ const inCorpus = new Set(records.map((r) => r.refId));
15
+ const out = new Map();
16
+ const inn = new Map();
17
+ for (const r of records) {
18
+ out.set(r.refId, out.get(r.refId) ?? new Set());
19
+ inn.set(r.refId, inn.get(r.refId) ?? new Set());
20
+ }
21
+ for (const r of records) {
22
+ for (const t of r.outgoing) {
23
+ if (!inCorpus.has(t) || t === r.refId)
24
+ continue;
25
+ out.get(r.refId).add(t);
26
+ inn.get(t).add(r.refId);
27
+ }
28
+ }
29
+ return { nodes: records.map((r) => r.refId), out, in: inn };
30
+ }
31
+ /** Undirected co-author graph: person → (person → shared-paper weight). */
32
+ export function buildCoauthorGraph(records) {
33
+ const g = new Map();
34
+ const link = (a, b) => {
35
+ const m = g.get(a) ?? g.set(a, new Map()).get(a);
36
+ m.set(b, (m.get(b) ?? 0) + 1);
37
+ };
38
+ for (const r of records) {
39
+ const authors = [...new Set(r.authors)];
40
+ for (let i = 0; i < authors.length; i++) {
41
+ if (!g.has(authors[i]))
42
+ g.set(authors[i], new Map());
43
+ for (let j = i + 1; j < authors.length; j++) {
44
+ link(authors[i], authors[j]);
45
+ link(authors[j], authors[i]);
46
+ }
47
+ }
48
+ }
49
+ return g;
50
+ }
51
+ /** h-index: max k such that ≥k papers have ≥k in-corpus citations (Hirsch 2005). */
52
+ export function hIndex(citationCounts) {
53
+ const sorted = [...citationCounts].sort((a, b) => b - a);
54
+ let h = 0;
55
+ for (let i = 0; i < sorted.length; i++) {
56
+ if (sorted[i] >= i + 1)
57
+ h = i + 1;
58
+ else
59
+ break;
60
+ }
61
+ return h;
62
+ }
63
+ /**
64
+ * CD-index (disruption): (F − B) / (F + B + N). +1 fully disruptive, −1 consolidating.
65
+ * Null when < 3 citers (low confidence). Wu-Wang-Evans 2019.
66
+ */
67
+ export function cdIndex(ref, g) {
68
+ if (!g.out.has(ref))
69
+ return null;
70
+ const citers = g.in.get(ref) ?? new Set();
71
+ const references = g.out.get(ref) ?? new Set();
72
+ if (citers.size < 3)
73
+ return null;
74
+ let F = 0;
75
+ let B = 0;
76
+ for (const c of citers) {
77
+ const cOut = g.out.get(c) ?? new Set();
78
+ let citesARef = false;
79
+ for (const x of references)
80
+ if (cOut.has(x)) {
81
+ citesARef = true;
82
+ break;
83
+ }
84
+ if (citesARef)
85
+ B++;
86
+ else
87
+ F++;
88
+ }
89
+ const citersOfRefs = new Set();
90
+ for (const rf of references)
91
+ for (const p of g.in.get(rf) ?? new Set())
92
+ citersOfRefs.add(p);
93
+ citersOfRefs.delete(ref);
94
+ for (const c of citers)
95
+ citersOfRefs.delete(c);
96
+ const N = citersOfRefs.size;
97
+ const denom = F + B + N;
98
+ return denom > 0 ? (F - B) / denom : 0;
99
+ }
100
+ /** PageRank over the directed citation graph (α=0.85), with dangling redistribution. */
101
+ export function pageRank(g, alpha = 0.85, maxIter = 200, tol = 1e-6) {
102
+ const nodes = g.nodes;
103
+ const n = nodes.length;
104
+ if (n === 0)
105
+ return new Map();
106
+ let pr = new Map(nodes.map((x) => [x, 1 / n]));
107
+ const outDeg = new Map(nodes.map((x) => [x, (g.out.get(x) ?? new Set()).size]));
108
+ for (let iter = 0; iter < maxIter; iter++) {
109
+ const next = new Map(nodes.map((x) => [x, 0]));
110
+ let dangling = 0;
111
+ for (const x of nodes)
112
+ if (outDeg.get(x) === 0)
113
+ dangling += pr.get(x);
114
+ const base = (1 - alpha) / n + (alpha * dangling) / n;
115
+ for (const x of nodes)
116
+ next.set(x, base);
117
+ for (const x of nodes) {
118
+ const deg = outDeg.get(x);
119
+ if (deg === 0)
120
+ continue;
121
+ const share = (alpha * pr.get(x)) / deg;
122
+ for (const t of g.out.get(x))
123
+ next.set(t, next.get(t) + share);
124
+ }
125
+ let diff = 0;
126
+ for (const x of nodes)
127
+ diff += Math.abs(next.get(x) - pr.get(x));
128
+ pr = next;
129
+ if (diff < tol)
130
+ break;
131
+ }
132
+ return pr;
133
+ }
134
+ /** Brandes betweenness centrality on an undirected unweighted graph, normalized. */
135
+ export function betweenness(g) {
136
+ const nodes = [...g.keys()];
137
+ const cb = new Map(nodes.map((x) => [x, 0]));
138
+ for (const s of nodes) {
139
+ const stack = [];
140
+ const pred = new Map(nodes.map((x) => [x, []]));
141
+ const sigma = new Map(nodes.map((x) => [x, 0]));
142
+ const dist = new Map(nodes.map((x) => [x, -1]));
143
+ sigma.set(s, 1);
144
+ dist.set(s, 0);
145
+ const queue = [s];
146
+ while (queue.length) {
147
+ const v = queue.shift();
148
+ stack.push(v);
149
+ for (const w of (g.get(v) ?? new Map()).keys()) {
150
+ if (dist.get(w) < 0) {
151
+ queue.push(w);
152
+ dist.set(w, dist.get(v) + 1);
153
+ }
154
+ if (dist.get(w) === dist.get(v) + 1) {
155
+ sigma.set(w, sigma.get(w) + sigma.get(v));
156
+ pred.get(w).push(v);
157
+ }
158
+ }
159
+ }
160
+ const delta = new Map(nodes.map((x) => [x, 0]));
161
+ while (stack.length) {
162
+ const w = stack.pop();
163
+ for (const v of pred.get(w)) {
164
+ delta.set(v, delta.get(v) + (sigma.get(v) / sigma.get(w)) * (1 + delta.get(w)));
165
+ }
166
+ if (w !== s)
167
+ cb.set(w, cb.get(w) + delta.get(w));
168
+ }
169
+ }
170
+ // Undirected normalization: divide by 2, then scale to [0,1].
171
+ const nn = nodes.length;
172
+ const scale = nn > 2 ? 1 / ((nn - 1) * (nn - 2)) : 1;
173
+ for (const x of nodes)
174
+ cb.set(x, (cb.get(x) / 2) * 2 * scale);
175
+ return cb;
176
+ }
177
+ /** Eigenvector centrality via power iteration on the undirected (weighted) graph. */
178
+ export function eigenvector(g, maxIter = 500, tol = 1e-6) {
179
+ const nodes = [...g.keys()];
180
+ const n = nodes.length;
181
+ if (n === 0)
182
+ return new Map();
183
+ let x = new Map(nodes.map((k) => [k, 1 / n]));
184
+ for (let iter = 0; iter < maxIter; iter++) {
185
+ const xLast = x;
186
+ x = new Map(nodes.map((k) => [k, 0]));
187
+ for (const v of nodes) {
188
+ let acc = xLast.get(v);
189
+ for (const [w, weight] of g.get(v) ?? new Map())
190
+ acc += xLast.get(w) * weight;
191
+ x.set(v, acc);
192
+ }
193
+ const norm = Math.sqrt([...x.values()].reduce((a, b) => a + b * b, 0)) || 1;
194
+ for (const k of nodes)
195
+ x.set(k, x.get(k) / norm);
196
+ let diff = 0;
197
+ for (const k of nodes)
198
+ diff += Math.abs(x.get(k) - xLast.get(k));
199
+ if (diff < n * tol)
200
+ break;
201
+ }
202
+ return x;
203
+ }
204
+ /** Local clustering coefficient per node on the undirected graph. */
205
+ export function clustering(g) {
206
+ const cc = new Map();
207
+ for (const [v, nbrsMap] of g) {
208
+ const nbrs = [...nbrsMap.keys()];
209
+ const k = nbrs.length;
210
+ if (k < 2) {
211
+ cc.set(v, 0);
212
+ continue;
213
+ }
214
+ let links = 0;
215
+ for (let i = 0; i < nbrs.length; i++) {
216
+ for (let j = i + 1; j < nbrs.length; j++) {
217
+ if ((g.get(nbrs[i]) ?? new Map()).has(nbrs[j]))
218
+ links++;
219
+ }
220
+ }
221
+ cc.set(v, (2 * links) / (k * (k - 1)));
222
+ }
223
+ return cc;
224
+ }
225
+ //# sourceMappingURL=corpus-graph.js.map