@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,591 @@
1
+ /**
2
+ * Research-corpus snapshot renderer (#1647).
3
+ *
4
+ * Produces the computed sections formerly assembled by the corpus-snapshot
5
+ * skill by hand. The command is intentionally deterministic: one parser pass
6
+ * feeds JSON, terminal summary, and markdown report output.
7
+ */
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import { load as loadYaml } from 'js-yaml';
11
+ import { loadCorpus, refSortKey } from '../corpus-views/ref-parser.js';
12
+ import { findOrphans } from './sidecar-lint.js';
13
+ import { scanCorpus } from './integrity-scan.js';
14
+ export const SNAPSHOT_FLOW_PATH = 'agentic/code/frameworks/research-complete/flows/corpus-snapshot.playbook.yaml';
15
+ const DEFAULT_TEMPLATE = `# Corpus Snapshot - [DATE]
16
+
17
+ ## Dimensions
18
+ [COMPUTE: dimensions-table]
19
+
20
+ ## Citation Topology
21
+ [COMPUTE: topology-metrics]
22
+
23
+ ## Degree Distribution
24
+ [COMPUTE: degree-histogram]
25
+
26
+ ## GRADE Distribution
27
+ [COMPUTE: grade-distribution]
28
+
29
+ ## Source-Type Distribution
30
+ [COMPUTE: source-type-distribution]
31
+
32
+ ## Integrity and Orphans
33
+ [COMPUTE: integrity-orphans]
34
+
35
+ ## Delta
36
+ [COMPUTE: delta-from-previous]
37
+
38
+ ## Cluster Analysis
39
+ [ANALYZE: describe main clusters, their themes, and notable papers]
40
+
41
+ ## Citation Chains
42
+ [ANALYZE: identify significant citation chains and their meaning]
43
+
44
+ ## Gaps and Opportunities
45
+ [ANALYZE: summarize disconnected areas and bridge opportunities]
46
+
47
+ ## Recommendations
48
+ [ANALYZE: what should be inducted next, what needs expansion]
49
+ `;
50
+ const CONTROLLED_GRADES = ['A', 'A-', 'B', 'B-', 'C', 'C-', 'D'];
51
+ function countFiles(dir, predicate = () => true) {
52
+ if (!fs.existsSync(dir))
53
+ return 0;
54
+ let count = 0;
55
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
56
+ const full = path.join(dir, entry.name);
57
+ if (entry.isDirectory())
58
+ count += countFiles(full, predicate);
59
+ else if (predicate(entry.name))
60
+ count++;
61
+ }
62
+ return count;
63
+ }
64
+ function firstExistingCount(root, dirs, predicate) {
65
+ for (const rel of dirs) {
66
+ const full = path.join(root, rel);
67
+ if (fs.existsSync(full))
68
+ return countFiles(full, predicate);
69
+ }
70
+ return 0;
71
+ }
72
+ function inc(map, key) {
73
+ map[key] = (map[key] ?? 0) + 1;
74
+ }
75
+ function sortedEntries(map) {
76
+ return Object.entries(map).sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));
77
+ }
78
+ function sortRefs(a, b) {
79
+ const ak = refSortKey(a);
80
+ const bk = refSortKey(b);
81
+ return ak[0] !== bk[0] ? ak[0] - bk[0] : ak[1].localeCompare(bk[1]);
82
+ }
83
+ function degreeBucket(total) {
84
+ if (total === 0)
85
+ return '0';
86
+ if (total <= 2)
87
+ return '1-2';
88
+ if (total <= 5)
89
+ return '3-5';
90
+ if (total <= 10)
91
+ return '6-10';
92
+ if (total <= 20)
93
+ return '11-20';
94
+ return '20+';
95
+ }
96
+ function parseNumber(value) {
97
+ const cleaned = value.replace(/[`*_]/g, '').replace(/,/g, '').trim();
98
+ const m = cleaned.match(/-?\d+(?:\.\d+)?/);
99
+ if (!m)
100
+ return null;
101
+ const parsed = Number(m[0]);
102
+ return Number.isFinite(parsed) ? parsed : null;
103
+ }
104
+ function metricFromRows(text, labels) {
105
+ const wanted = labels.map((label) => label.toLowerCase());
106
+ for (const line of text.split('\n')) {
107
+ const trimmed = line.trim();
108
+ if (!trimmed.startsWith('|'))
109
+ continue;
110
+ const cells = trimmed.replace(/^\||\|$/g, '').split('|').map((c) => c.trim());
111
+ if (cells.length < 2)
112
+ continue;
113
+ const label = cells[0].replace(/[`*_]/g, '').toLowerCase();
114
+ if (!wanted.some((w) => label === w || label.includes(w)))
115
+ continue;
116
+ const parsed = parseNumber(cells[1]);
117
+ if (parsed !== null)
118
+ return parsed;
119
+ }
120
+ return undefined;
121
+ }
122
+ function buildPreviousMetrics(data, text) {
123
+ const metrics = {};
124
+ for (const key of ['papers', 'edges', 'density', 'isolatedNodes', 'orphanCount']) {
125
+ const value = data[key];
126
+ if (typeof value === 'number' && Number.isFinite(value))
127
+ metrics[key] = value;
128
+ if (typeof value === 'string' && value.trim() && Number.isFinite(Number(value))) {
129
+ metrics[key] = Number(value);
130
+ }
131
+ }
132
+ const rowLabels = {
133
+ papers: ['REF analysis docs', 'summaries (analysis docs)', 'Total papers'],
134
+ citationSidecars: ['Citation sidecars'],
135
+ radarSidecars: ['Radar sidecars'],
136
+ edges: ['Citation edges (index)', 'Citation edges', 'Edges (directed, in-corpus)', 'Edges'],
137
+ density: ['Graph density', 'Density'],
138
+ isolatedNodes: ['Isolated nodes', 'Orphan papers'],
139
+ webSources: ['Web source snapshots', 'web-sources'],
140
+ gradeOffVocabulary: ['Radar off-vocab values', 'Off-vocabulary GRADE values'],
141
+ };
142
+ for (const [key, labels] of Object.entries(rowLabels)) {
143
+ if (metrics[key] !== undefined)
144
+ continue;
145
+ const value = metricFromRows(text, labels);
146
+ if (value !== undefined)
147
+ metrics[key] = value;
148
+ }
149
+ return metrics;
150
+ }
151
+ function parseFrontmatter(text) {
152
+ const m = text.match(/^---\n([\s\S]*?)\n---\n/);
153
+ if (!m)
154
+ return {};
155
+ try {
156
+ const loaded = loadYaml(m[1]);
157
+ return loaded && typeof loaded === 'object' && !Array.isArray(loaded)
158
+ ? loaded
159
+ : {};
160
+ }
161
+ catch {
162
+ return {};
163
+ }
164
+ }
165
+ export function findPreviousSnapshot(root, date) {
166
+ const reports = path.join(root, '.aiwg', 'reports');
167
+ if (!fs.existsSync(reports))
168
+ return null;
169
+ const files = fs
170
+ .readdirSync(reports)
171
+ .filter((f) => /^corpus-snapshot-\d{4}-\d{2}-\d{2}\.md$/.test(f))
172
+ .filter((f) => f !== `corpus-snapshot-${date}.md`)
173
+ .sort()
174
+ .reverse();
175
+ const file = files[0];
176
+ if (!file)
177
+ return null;
178
+ const full = path.join(reports, file);
179
+ const text = fs.readFileSync(full, 'utf-8');
180
+ const fm = parseFrontmatter(text);
181
+ return {
182
+ path: path.relative(root, full),
183
+ date: typeof fm.date === 'string' ? fm.date : file.match(/\d{4}-\d{2}-\d{2}/)?.[0] ?? null,
184
+ metrics: buildPreviousMetrics(fm, text),
185
+ };
186
+ }
187
+ function computeDelta(current, previous) {
188
+ if (!previous)
189
+ return null;
190
+ const candidates = [
191
+ ['papers', current.dimensions.papers],
192
+ ['citationSidecars', current.dimensions.citationSidecars],
193
+ ['radarSidecars', current.dimensions.radarSidecars],
194
+ ['edges', current.topology.edges],
195
+ ['density', Number(current.topology.density.toFixed(6))],
196
+ ['isolatedNodes', current.topology.isolatedNodes],
197
+ ['webSources', current.dimensions.webSources],
198
+ ['gradeOffVocabulary', current.gradeOffVocabulary],
199
+ ['orphanCount', current.integrity.orphanCount],
200
+ ];
201
+ const values = candidates
202
+ .filter(([key]) => previous.metrics[key] !== undefined)
203
+ .map(([metric, value]) => ({
204
+ metric,
205
+ previous: previous.metrics[metric],
206
+ current: value,
207
+ delta: Number((value - previous.metrics[metric]).toFixed(6)),
208
+ }));
209
+ return { previousPath: previous.path, previousDate: previous.date, values };
210
+ }
211
+ export function computeSnapshot(root, options = {}) {
212
+ const refsDir = path.join(root, 'documentation', 'references');
213
+ if (!fs.existsSync(refsDir))
214
+ return null;
215
+ const generated = options.date ?? new Date().toISOString().slice(0, 10);
216
+ const { records } = loadCorpus(root);
217
+ if (!records.length)
218
+ return null;
219
+ const authors = new Set();
220
+ const topics = new Set();
221
+ const years = [];
222
+ const grades = { A: 0, B: 0, C: 0, D: 0, Missing: 0 };
223
+ const sourceTypes = {};
224
+ const degreeDistribution = {
225
+ '0': 0,
226
+ '1-2': 0,
227
+ '3-5': 0,
228
+ '6-10': 0,
229
+ '11-20': 0,
230
+ '20+': 0,
231
+ };
232
+ let offVocab = 0;
233
+ for (const r of records) {
234
+ for (const a of r.authors)
235
+ authors.add(a);
236
+ for (const t of r.topics)
237
+ topics.add(t);
238
+ if (r.year)
239
+ years.push(r.year);
240
+ inc(sourceTypes, r.sourceType || 'other');
241
+ const grade = r.radar?.gradeCurrent?.trim().toUpperCase();
242
+ if (!grade)
243
+ grades.Missing++;
244
+ else if (CONTROLLED_GRADES.includes(grade))
245
+ grades[grade] = (grades[grade] ?? 0) + 1;
246
+ else
247
+ offVocab++;
248
+ inc(degreeDistribution, degreeBucket(r.incoming.size + r.outgoing.size));
249
+ }
250
+ const nodes = records.length;
251
+ const edges = records.reduce((sum, r) => sum + r.outgoing.size, 0);
252
+ const density = nodes > 1 ? edges / (nodes * (nodes - 1)) : 0;
253
+ const topHubs = [...records]
254
+ .sort((a, b) => {
255
+ const total = b.incoming.size + b.outgoing.size - (a.incoming.size + a.outgoing.size);
256
+ if (total !== 0)
257
+ return total;
258
+ return sortRefs(a.refId, b.refId);
259
+ })
260
+ .slice(0, 25)
261
+ .map((r) => ({
262
+ ref: r.refId,
263
+ title: r.title,
264
+ in: r.incoming.size,
265
+ out: r.outgoing.size,
266
+ total: r.incoming.size + r.outgoing.size,
267
+ }));
268
+ const isolatedRecords = records.filter((r) => !r.incoming.size && !r.outgoing.size);
269
+ const scan = scanCorpus(root);
270
+ const recommendations = {};
271
+ for (const s of Object.values(scan.summary))
272
+ inc(recommendations, s.recommendation);
273
+ const previous = findPreviousSnapshot(root, generated);
274
+ const metrics = {
275
+ corpusRoot: root,
276
+ generated,
277
+ flow: SNAPSHOT_FLOW_PATH,
278
+ dimensions: {
279
+ papers: nodes,
280
+ citationSidecars: countFiles(path.join(root, 'documentation', 'citations'), (f) => /^REF-.*-citations\.md$/.test(f)),
281
+ radarSidecars: countFiles(path.join(root, 'documentation', 'radar'), (f) => /^REF-.*-radar\.md$/.test(f)),
282
+ pdfsFull: firstExistingCount(root, ['pdfs/full', 'sources/pdfs/full'], (f) => !f.startsWith('.')),
283
+ webSources: firstExistingCount(root, ['sources/web'], () => true),
284
+ indexFiles: firstExistingCount(root, ['indices'], (f) => /\.md$/i.test(f)),
285
+ peopleProfiles: countFiles(path.join(root, 'documentation', 'profiles', 'people'), (f) => /^PROF-P-.*\.md$/.test(f)),
286
+ authors: authors.size,
287
+ topics: topics.size,
288
+ yearRange: years.length ? `${Math.min(...years)}-${Math.max(...years)}` : 'unknown',
289
+ },
290
+ topology: {
291
+ nodes,
292
+ edges,
293
+ density,
294
+ averageDegree: nodes ? edges / nodes : 0,
295
+ isolatedNodes: isolatedRecords.length,
296
+ isolatedRefs: isolatedRecords.map((r) => r.refId).sort(sortRefs),
297
+ topHubs,
298
+ },
299
+ degreeDistribution,
300
+ gradeDistribution: grades,
301
+ gradeOffVocabulary: offVocab,
302
+ sourceTypeDistribution: sourceTypes,
303
+ integrity: {
304
+ orphanCount: findOrphans(root).length,
305
+ orphanRefs: findOrphans(root).map((o) => o.ref).sort(sortRefs),
306
+ recommendations,
307
+ },
308
+ previous,
309
+ delta: null,
310
+ };
311
+ metrics.delta = computeDelta(metrics, previous);
312
+ return metrics;
313
+ }
314
+ function table(rows) {
315
+ return rows.map((r) => `| ${r.join(' | ')} |`).join('\n') + '\n';
316
+ }
317
+ function renderDimensions(m) {
318
+ return table([
319
+ ['Metric', 'Value'],
320
+ ['---', '---:'],
321
+ ['Papers', String(m.dimensions.papers)],
322
+ ['Citation sidecars', String(m.dimensions.citationSidecars)],
323
+ ['Radar sidecars', String(m.dimensions.radarSidecars)],
324
+ ['PDFs (full)', String(m.dimensions.pdfsFull)],
325
+ ['Web sources', String(m.dimensions.webSources)],
326
+ ['Index files', String(m.dimensions.indexFiles)],
327
+ ['People profiles', String(m.dimensions.peopleProfiles)],
328
+ ['Unique authors', String(m.dimensions.authors)],
329
+ ['Unique topics', String(m.dimensions.topics)],
330
+ ['Year range', m.dimensions.yearRange],
331
+ ]);
332
+ }
333
+ function renderCorpusDimensions(m) {
334
+ return table([
335
+ ['Graph', 'Nodes', 'Edges'],
336
+ ['---', '---:', '---:'],
337
+ ['papers (PDFs)', String(m.dimensions.pdfsFull), '0'],
338
+ ['summaries (analysis docs)', String(m.dimensions.papers), '0'],
339
+ ['citation-network', String(m.topology.nodes), String(m.topology.edges)],
340
+ ['web-sources', String(m.dimensions.webSources), '0'],
341
+ ['indices', String(m.dimensions.indexFiles), '0'],
342
+ ]) +
343
+ `\n${m.dimensions.papers} reference entries, ${m.dimensions.pdfsFull} archived PDFs, ${m.dimensions.webSources} web source snapshots.\n` +
344
+ `Citation graph: ${m.topology.edges} outgoing directed in-corpus edges; density ${m.topology.density.toFixed(4)}.\n`;
345
+ }
346
+ function median(values) {
347
+ if (!values.length)
348
+ return 0;
349
+ const sorted = [...values].sort((a, b) => a - b);
350
+ const mid = Math.floor(sorted.length / 2);
351
+ return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
352
+ }
353
+ function degreeStats(values) {
354
+ const sum = values.reduce((a, b) => a + b, 0);
355
+ return {
356
+ max: values.length ? Math.max(...values) : 0,
357
+ median: median(values),
358
+ mean: values.length ? sum / values.length : 0,
359
+ };
360
+ }
361
+ function renderTopology(m) {
362
+ const lines = table([
363
+ ['Metric', 'Value'],
364
+ ['---', '---:'],
365
+ ['Nodes', String(m.topology.nodes)],
366
+ ['Citation edges', String(m.topology.edges)],
367
+ ['Graph density', m.topology.density.toFixed(6)],
368
+ ['Average out-degree', m.topology.averageDegree.toFixed(2)],
369
+ ['Isolated nodes', String(m.topology.isolatedNodes)],
370
+ ]).split('\n').filter(Boolean);
371
+ lines.push('', '### Top Hubs', '', '| REF | Title | In | Out | Total |', '|---|---|---:|---:|---:|');
372
+ for (const h of m.topology.topHubs.slice(0, 10)) {
373
+ lines.push(`| ${h.ref} | ${h.title.replace(/\|/g, '\\|').slice(0, 80)} | ${h.in} | ${h.out} | ${h.total} |`);
374
+ }
375
+ return lines.join('\n') + '\n';
376
+ }
377
+ function renderGraphTopology(m) {
378
+ const incoming = m.topology.topHubs
379
+ .slice()
380
+ .sort((a, b) => b.in - a.in || b.out - a.out || a.ref.localeCompare(b.ref));
381
+ const outgoing = m.topology.topHubs
382
+ .slice()
383
+ .sort((a, b) => b.out - a.out || b.in - a.in || a.ref.localeCompare(b.ref));
384
+ const foundational = incoming.filter((h) => h.in >= 9 && h.out <= 2);
385
+ const inStats = degreeStats(m.topology.topHubs.map((h) => h.in));
386
+ const outStats = degreeStats(m.topology.topHubs.map((h) => h.out));
387
+ const lines = [];
388
+ lines.push('### Hub Nodes (Most Cited Within Corpus)', '');
389
+ lines.push('| Rank | REF | Paper | Cited-by | Cites |', '|---:|---|---|---:|---:|');
390
+ incoming.slice(0, 10).forEach((h, i) => {
391
+ lines.push(`| ${i + 1} | ${h.ref} | ${h.title.replace(/\|/g, '\\|').slice(0, 90)} | ${h.in} | ${h.out} |`);
392
+ });
393
+ lines.push('', '### Highest Out-Degree (Synthesis Papers)', '');
394
+ lines.push('| REF | Paper | Cites | Cited-by |', '|---|---|---:|---:|');
395
+ outgoing.slice(0, 5).forEach((h) => {
396
+ lines.push(`| ${h.ref} | ${h.title.replace(/\|/g, '\\|').slice(0, 90)} | ${h.out} | ${h.in} |`);
397
+ });
398
+ lines.push('', '### Foundational Papers (High Cited-by, Low Cites)', '');
399
+ lines.push('| REF | Paper | Cited-by | Cites |', '|---|---|---:|---:|');
400
+ foundational.slice(0, 10).forEach((h) => {
401
+ lines.push(`| ${h.ref} | ${h.title.replace(/\|/g, '\\|').slice(0, 90)} | ${h.in} | ${h.out} |`);
402
+ });
403
+ if (!foundational.length)
404
+ lines.push('| none | - | 0 | 0 |');
405
+ lines.push('', '### Orphan Papers (Zero Incoming)', '');
406
+ lines.push(`${m.topology.isolatedNodes} isolated papers with zero incoming and zero outgoing citations. Sample: ${m.topology.isolatedRefs.slice(0, 25).join(', ') || 'none'}.`);
407
+ lines.push('', '### Degree Distribution', '');
408
+ lines.push('| Direction | Max | Median | Mean |', '|---|---:|---:|---:|');
409
+ lines.push(`| Incoming | ${inStats.max} | ${inStats.median.toFixed(1)} | ${inStats.mean.toFixed(2)} |`);
410
+ lines.push(`| Outgoing | ${outStats.max} | ${outStats.median.toFixed(1)} | ${outStats.mean.toFixed(2)} |`);
411
+ return lines.join('\n') + '\n';
412
+ }
413
+ function renderDistribution(title, values) {
414
+ const rows = [[title, 'Count'], ['---', '---:'], ...sortedEntries(values).map(([k, v]) => [k, String(v)])];
415
+ return table(rows);
416
+ }
417
+ function renderGrade(m) {
418
+ return renderDistribution('GRADE', m.gradeDistribution) + `\nOff-vocabulary GRADE values: ${m.gradeOffVocabulary}\n`;
419
+ }
420
+ function renderIntegrity(m) {
421
+ const recs = Object.keys(m.integrity.recommendations).length
422
+ ? sortedEntries(m.integrity.recommendations).map(([k, v]) => `${k}: ${v}`).join(', ')
423
+ : 'none';
424
+ const sample = m.integrity.orphanRefs.slice(0, 20).join(', ') || 'none';
425
+ return `Orphan sidecars: ${m.integrity.orphanCount}\n\nIntegrity recommendations: ${recs}\n\nOrphan refs: ${sample}${m.integrity.orphanRefs.length > 20 ? ', ...' : ''}\n`;
426
+ }
427
+ export function renderDelta(m) {
428
+ if (!m.delta)
429
+ return 'No previous snapshot found.\n';
430
+ const rows = [
431
+ ['Metric', 'Previous', 'Current', 'Delta'],
432
+ ['---', '---:', '---:', '---:'],
433
+ ...m.delta.values.map((d) => [d.metric, String(d.previous), String(d.current), d.delta > 0 ? `+${d.delta}` : String(d.delta)]),
434
+ ];
435
+ return `Previous snapshot: ${m.delta.previousPath}${m.delta.previousDate ? ` (${m.delta.previousDate})` : ''}\n\n${table(rows)}`;
436
+ }
437
+ function extractOutputFormatTemplate(template) {
438
+ const match = template.match(/## Output Format[\s\S]*?```markdown\n([\s\S]*?)\n```/);
439
+ if (!match)
440
+ return template;
441
+ let body = match[1];
442
+ body = body.replace(/^---\n[\s\S]*?\n---\n+/, '');
443
+ return body;
444
+ }
445
+ function replaceSection(body, headingPattern, replacement) {
446
+ const match = body.match(headingPattern);
447
+ if (!match || match.index === undefined)
448
+ return body;
449
+ const start = match.index;
450
+ const next = body.slice(start + match[0].length).search(/\n##\s+/);
451
+ const end = next === -1 ? body.length : start + match[0].length + next;
452
+ const heading = match[0].replace(/\s+\[COMPUTE\]/, '').trimEnd();
453
+ return body.slice(0, start) + `${heading}\n\n${replacement.trimEnd()}\n` + body.slice(end);
454
+ }
455
+ function fillScalarPlaceholders(body, m) {
456
+ const previous = m.previous?.date ?? m.previous?.path ?? 'none';
457
+ const delta = m.delta?.values ?? [];
458
+ const papersDelta = delta.find((d) => d.metric === 'papers')?.delta;
459
+ const edgesDelta = delta.find((d) => d.metric === 'edges')?.delta;
460
+ const signed = (n) => n === undefined ? '+0' : n >= 0 ? `+${n}` : String(n);
461
+ return body
462
+ .replaceAll('{{YYYY-MM-DD}}', m.generated)
463
+ .replaceAll('{{total REF count}}', String(m.dimensions.papers))
464
+ .replaceAll('{{total unique directed edges}}', String(m.topology.edges))
465
+ .replaceAll('{{current phase description}}', 'compute-only snapshot')
466
+ .replaceAll('{{planned next phase}}', 'human/agent analysis')
467
+ .replaceAll('{{path to prior snapshot}}', m.previous?.path ?? 'none')
468
+ .replaceAll('{{phase description}}', 'compute-only snapshot')
469
+ .replaceAll('{{date and path}}', previous)
470
+ .replaceAll('{{+N papers, +M edges since last snapshot}}', `${signed(papersDelta)} papers, ${signed(edgesDelta)} edges`);
471
+ }
472
+ function materializeTemplate(template, m) {
473
+ let body = extractOutputFormatTemplate(template).replace(/\[DATE\]/g, m.generated);
474
+ body = fillScalarPlaceholders(body, m);
475
+ body = replaceSection(body, /^## Corpus Dimensions\s+\[COMPUTE\]/m, renderCorpusDimensions(m));
476
+ body = replaceSection(body, /^## Graph Topology\s+\[COMPUTE\]/m, renderGraphTopology(m));
477
+ body = replaceSection(body, /^## Temporal Distribution\s+\[COMPUTE\]/m, '[ANALYZE: temporal distribution narrative not computed by this command]');
478
+ body = replaceSection(body, /^## Delta from Previous Snapshot\s+\[COMPUTE\]/m, renderDelta(m));
479
+ return body;
480
+ }
481
+ function frontmatter(m) {
482
+ const prev = m.previous?.path ?? null;
483
+ return [
484
+ '---',
485
+ 'type: corpus-snapshot',
486
+ `date: ${m.generated}`,
487
+ `papers: ${m.dimensions.papers}`,
488
+ `edges: ${m.topology.edges}`,
489
+ `density: ${Number(m.topology.density.toFixed(6))}`,
490
+ `isolatedNodes: ${m.topology.isolatedNodes}`,
491
+ `orphanCount: ${m.integrity.orphanCount}`,
492
+ `gradeOffVocabulary: ${m.gradeOffVocabulary}`,
493
+ `flow: ${SNAPSHOT_FLOW_PATH}`,
494
+ prev ? `previous: ${prev}` : 'previous: null',
495
+ '---',
496
+ '',
497
+ ].join('\n');
498
+ }
499
+ function analysisPlaceholder(marker, notes) {
500
+ return notes ? notes : marker;
501
+ }
502
+ export function renderSnapshotMarkdown(m, options = {}) {
503
+ if (options.deltaOnly)
504
+ return renderDelta(m);
505
+ let template = DEFAULT_TEMPLATE;
506
+ if (options.template) {
507
+ const full = path.isAbsolute(options.template) ? options.template : path.join(m.corpusRoot, options.template);
508
+ template = fs.readFileSync(full, 'utf-8');
509
+ }
510
+ else {
511
+ const defaultTemplatePath = path.join(m.corpusRoot, '.aiwg', 'reports', 'corpus-snapshot-template.md');
512
+ if (fs.existsSync(defaultTemplatePath))
513
+ template = fs.readFileSync(defaultTemplatePath, 'utf-8');
514
+ }
515
+ let body = materializeTemplate(template, m);
516
+ const replacements = {
517
+ '[COMPUTE: dimensions-table]': renderDimensions(m).trimEnd(),
518
+ '[COMPUTE: topology-metrics]': renderTopology(m).trimEnd(),
519
+ '[COMPUTE: degree-histogram]': renderDistribution('Degree', m.degreeDistribution).trimEnd(),
520
+ '[COMPUTE: grade-distribution]': renderGrade(m).trimEnd(),
521
+ '[COMPUTE: source-type-distribution]': renderDistribution('Source type', m.sourceTypeDistribution).trimEnd(),
522
+ '[COMPUTE: integrity-orphans]': renderIntegrity(m).trimEnd(),
523
+ '[COMPUTE: delta-from-previous]': renderDelta(m).trimEnd(),
524
+ };
525
+ for (const [marker, value] of Object.entries(replacements)) {
526
+ body = body.replaceAll(marker, value);
527
+ }
528
+ if (options.computeOnly) {
529
+ body = body.replace(/\[ANALYZE: [^\]]+\]/g, '[ANALYZE: intentionally left for human/agent narrative]');
530
+ }
531
+ else {
532
+ body = body.replace(/\[ANALYZE: [^\]]+\]/g, (marker) => analysisPlaceholder(marker, options.notes));
533
+ }
534
+ body = body.replace(/\{\{([^}]+)\}\}/g, (_m, inner) => `[ANALYZE: ${String(inner).trim()}]`);
535
+ return frontmatter(m) + body.replace(/\s+$/, '') + '\n';
536
+ }
537
+ export function renderSnapshotSummary(m) {
538
+ const delta = m.delta?.values ?? [];
539
+ const d = (metric) => {
540
+ const item = delta.find((x) => x.metric === metric);
541
+ if (!item)
542
+ return '';
543
+ return item.delta > 0 ? ` (+${item.delta})` : ` (${item.delta})`;
544
+ };
545
+ const top = m.topology.topHubs[0];
546
+ return [
547
+ 'Corpus Snapshot',
548
+ '',
549
+ `Papers: ${m.dimensions.papers}${d('papers')} | Edges: ${m.topology.edges}${d('edges')}`,
550
+ `Density: ${m.topology.density.toFixed(6)}${d('density')} | Isolated: ${m.topology.isolatedNodes}${d('isolatedNodes')}`,
551
+ `Top hub: ${top ? `${top.ref} (${top.total})` : 'none'}`,
552
+ `GRADE: ${sortedEntries(m.gradeDistribution).map(([k, v]) => `${k}=${v}`).join(', ')}; off-vocab=${m.gradeOffVocabulary}`,
553
+ `Source types: ${sortedEntries(m.sourceTypeDistribution).map(([k, v]) => `${k}=${v}`).join(', ')}`,
554
+ `Flow: ${SNAPSHOT_FLOW_PATH}`,
555
+ ].join('\n') + '\n';
556
+ }
557
+ export function renderSnapshotJson(m) {
558
+ return JSON.stringify(m, null, 2) + '\n';
559
+ }
560
+ export function renderSnapshot(m, options = {}) {
561
+ const format = options.format ?? 'full';
562
+ if (format === 'json')
563
+ return renderSnapshotJson(m);
564
+ if (format === 'summary')
565
+ return renderSnapshotSummary(m);
566
+ return renderSnapshotMarkdown(m, options);
567
+ }
568
+ export function snapshotOutputPath(root, options) {
569
+ if (options.out)
570
+ return path.isAbsolute(options.out) ? options.out : path.join(root, options.out);
571
+ if (options.write)
572
+ return path.join(root, '.aiwg', 'reports', `corpus-snapshot-${options.date ?? new Date().toISOString().slice(0, 10)}.md`);
573
+ return null;
574
+ }
575
+ export function runSnapshot(root, options = {}) {
576
+ const metrics = computeSnapshot(root, options);
577
+ if (!metrics) {
578
+ const message = options.format === 'json'
579
+ ? JSON.stringify({ status: 'skipped', reason: 'no research corpus found', corpusRoot: root }, null, 2) + '\n'
580
+ : `No research corpus found at ${root}; expected documentation/references/REF-*.md\n`;
581
+ return { content: message, outPath: null, metrics: null };
582
+ }
583
+ const content = renderSnapshot(metrics, options);
584
+ const outPath = snapshotOutputPath(root, { ...options, date: metrics.generated });
585
+ if (outPath) {
586
+ fs.mkdirSync(path.dirname(outPath), { recursive: true });
587
+ fs.writeFileSync(outPath, content, 'utf-8');
588
+ }
589
+ return { content, outPath, metrics };
590
+ }
591
+ //# sourceMappingURL=snapshot.js.map