@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,93 @@
1
+ /**
2
+ * radar-init — scaffold a radar/freshness sidecar for a REF (#1498).
3
+ *
4
+ * Faithful port of corpus/radar_init.py scaffold(): pulls title/authors from the
5
+ * citation sidecar and GRADE from the analysis doc, defaults the refresh cadence
6
+ * from GRADE (shared cadenceForGrade) and the cluster from the externalized
7
+ * cluster map, and stamps `documentation/radar/REF-XXX-radar.md`. Skip-if-exists;
8
+ * dry-run unless `write`.
9
+ *
10
+ * @source historical: corpus/radar_init.py (scaffold, main --all-missing)
11
+ */
12
+ import * as fs from 'fs';
13
+ import * as path from 'path';
14
+ import { cadenceForGrade } from '../corpus-views/corpus-config.js';
15
+ import { readAnalysisGrade, readCitationMeta, analysisRelPath, loadClusterMap, listCitationRefs, listRadarRefs, } from './radar-shared.js';
16
+ function todayUtc() {
17
+ return new Date().toISOString().slice(0, 10);
18
+ }
19
+ /** Build the `../…` link from documentation/radar/ to the analysis doc. */
20
+ function analysisLink(relPath, refId) {
21
+ if (!relPath)
22
+ return `../references/${refId}-*.md`;
23
+ const segs = relPath.split(path.sep);
24
+ // documentation/references/REF.md -> ../references/REF.md
25
+ return segs[0] === 'documentation' ? `../${segs.slice(1).join('/')}` : `../${segs.join('/')}`;
26
+ }
27
+ /** Render the radar-sidecar markdown body. Mirrors radar_init.scaffold()'s line block. */
28
+ function renderSidecar(args) {
29
+ const { refId, title, authors, grade, cadence, cluster, today, analysisRel } = args;
30
+ const link = analysisLink(analysisRel, refId);
31
+ const analysisName = analysisRel ? analysisRel.split(path.sep).pop() : 'n/a';
32
+ const lines = [
33
+ '---',
34
+ `ref: ${refId}`,
35
+ `title: "${title}"`,
36
+ 'type: radar',
37
+ `refresh-cadence: ${cadence}`,
38
+ `last-refreshed: ${today}`,
39
+ 'last-refreshed-by: radar-init-scaffold',
40
+ ];
41
+ if (cluster)
42
+ lines.push(`cluster: ${cluster}`);
43
+ lines.push(`grade-original: ${grade}`, `grade-current: ${grade}`, 'grade-trajectory: stable', 'sources-searched: [] # populate on first refresh', '---', '', `# ${refId} Radar`, '', `**Paper**: [citation sidecar](../citations/${refId}-citations.md) · [analysis doc](${link})`, `**Title**: ${title}`);
44
+ if (authors.length) {
45
+ const display = authors.slice(0, 3);
46
+ const suffix = authors.length > 3 ? ' et al.' : '';
47
+ lines.push(`**Authors**: ${display.join(', ')}${suffix}`);
48
+ }
49
+ lines.push(`**Last refreshed**: ${today}`, '**Next refresh due**: — (compute from cadence)', '**Refresh rationale**: Initial scaffold. Full multi-vector signal gather pending first `/radar refresh` invocation.', '', '---', '', '## 1. GRADE Re-Assessment', '', '| Attribute | At Induction | Current | Δ |', '|---|---|---|---|', `| GRADE letter | ${grade} | ${grade} | — |`, '| Peer-reviewed | — | — | — |', '| Replication status | — | — | — |', '| Retraction status | clean | clean | — |', '| Author active | — | — | — |', '', '**Rationale**: Initial scaffold, no re-assessment performed yet.', '', '## 2. Citation Signals', '', `**As of ${today}** — pending first refresh.`, '', '## 3. Implementation / Code Signals', '', 'Pending first refresh.', '', '## 4. News & Discussion', '', 'Pending first refresh.', '', '## 5. Retractions / Corrections / Concerns', '', '| Category | Status | Detail |', '|---|---|---|', `| Retraction Watch | unchecked (scaffold created ${today}) | — |`, '| PubPeer | unchecked | — |', '| Formal corrigenda | none known | — |', '| Methodology critiques | none known | — |', '| Reproducibility attempts | — | — |', '', '## 6. Notable Links', '', '**Primary**:', `- Analysis doc: [${analysisName}](${link})`, `- Citation sidecar: [${refId}-citations.md](../citations/${refId}-citations.md)`, '- PDF: (in `pdfs/full/`)', '', '## 7. Open Questions / Watch Items', '', 'Pending first refresh — what should we watch for?', '', '## 8. Refresh History', '', '| Date | Refreshed by | GRADE before → after | Key changes |', '|---|---|---|---|', `| ${today} | radar-init-scaffold | — → ${grade} | Initial scaffold (no signals gathered yet) |`, '');
50
+ return lines.join('\n');
51
+ }
52
+ /** Scaffold a radar sidecar for one REF. */
53
+ export function scaffoldRadar(corpusRoot, refId, opts = {}) {
54
+ const outRel = path.join('documentation', 'radar', `${refId}-radar.md`);
55
+ const citationPath = path.join(corpusRoot, 'documentation', 'citations', `${refId}-citations.md`);
56
+ if (!fs.existsSync(citationPath)) {
57
+ return { refId, status: 'skip', message: `SKIP ${refId}: no citation sidecar found`, outPath: outRel };
58
+ }
59
+ const { title, authors } = readCitationMeta(corpusRoot, refId);
60
+ const grade = readAnalysisGrade(corpusRoot, refId);
61
+ const cadence = opts.cadence || cadenceForGrade(grade);
62
+ const resolve = opts.clusterResolver ?? loadClusterMap(corpusRoot);
63
+ const cluster = opts.cluster ?? resolve(refId);
64
+ const today = opts.today || todayUtc();
65
+ const content = renderSidecar({
66
+ refId,
67
+ title,
68
+ authors,
69
+ grade,
70
+ cadence,
71
+ cluster,
72
+ today,
73
+ analysisRel: analysisRelPath(corpusRoot, refId),
74
+ });
75
+ const outAbs = path.join(corpusRoot, outRel);
76
+ if (!opts.write) {
77
+ return { refId, status: 'dry-run', message: `DRY-RUN ${refId}: would write ${outRel} (${content.length} chars)`, outPath: outRel, content };
78
+ }
79
+ if (fs.existsSync(outAbs)) {
80
+ return { refId, status: 'skip', message: `SKIP ${refId}: radar already exists at ${outRel}`, outPath: outRel };
81
+ }
82
+ fs.mkdirSync(path.dirname(outAbs), { recursive: true });
83
+ fs.writeFileSync(outAbs, content, 'utf-8');
84
+ return { refId, status: 'wrote', message: `WROTE ${outRel}`, outPath: outRel, content };
85
+ }
86
+ /** Scaffold radars for every REF with a citation sidecar but no radar yet. */
87
+ export function radarInitMissing(corpusRoot, opts = {}) {
88
+ const haveRadar = new Set(listRadarRefs(corpusRoot));
89
+ const missing = listCitationRefs(corpusRoot).filter((r) => !haveRadar.has(r));
90
+ const clusterResolver = opts.clusterResolver ?? loadClusterMap(corpusRoot);
91
+ return missing.map((refId) => scaffoldRadar(corpusRoot, refId, { ...opts, clusterResolver }));
92
+ }
93
+ //# sourceMappingURL=radar-init.js.map
@@ -0,0 +1,118 @@
1
+ /**
2
+ * radar-report — aggregate radar sidecars into a corpus/cluster freshness report (#1498).
3
+ *
4
+ * Port of corpus/radar_report.py: totals, overdue count, per-cluster / per-GRADE
5
+ * / per-trajectory breakdowns, an overdue table (most-overdue-first), and a
6
+ * per-radar summary with the §1 GRADE-reassessment rationale snippet. Reuses the
7
+ * shared loader + staleness helper.
8
+ *
9
+ * @source historical: corpus/radar_report.py
10
+ */
11
+ import { computeStaleness } from '../corpus-views/corpus-config.js';
12
+ import { loadRadars } from './radar-shared.js';
13
+ /** Extract the first prose line from a `## <prefix>` section (skips tables/rules). */
14
+ function sectionSnippet(text, prefix) {
15
+ const lines = text.split('\n');
16
+ let inSection = false;
17
+ const buf = [];
18
+ for (const line of lines) {
19
+ if (line.startsWith('## ')) {
20
+ if (inSection)
21
+ break;
22
+ if (line.startsWith(prefix)) {
23
+ inSection = true;
24
+ continue;
25
+ }
26
+ }
27
+ if (inSection)
28
+ buf.push(line);
29
+ }
30
+ for (const raw of buf) {
31
+ const line = raw.trim();
32
+ if (line && !line.startsWith('|') && !line.startsWith('---'))
33
+ return line.slice(0, 200);
34
+ }
35
+ return '';
36
+ }
37
+ function toRow(doc, today) {
38
+ const s = computeStaleness(doc.meta.refreshCadence, doc.meta.lastRefreshed, today);
39
+ return {
40
+ refId: doc.refId,
41
+ cluster: doc.meta.cluster ?? '',
42
+ grade: doc.meta.gradeCurrent ?? doc.meta.gradeOriginal ?? '?',
43
+ trajectory: doc.meta.gradeTrajectory ?? 'stable',
44
+ cadence: doc.meta.refreshCadence ?? '?',
45
+ lastRefreshed: doc.meta.lastRefreshed ?? '',
46
+ daysSince: s.daysSince,
47
+ overdueDays: s.overdueDays,
48
+ isStale: s.isStale,
49
+ text: doc.text,
50
+ };
51
+ }
52
+ function countBy(rows, key) {
53
+ const m = new Map();
54
+ for (const r of rows) {
55
+ const k = key(r);
56
+ if (!m.has(k))
57
+ m.set(k, []);
58
+ m.get(k).push(r);
59
+ }
60
+ return m;
61
+ }
62
+ /** Build the markdown freshness report. Returns a "no radars" note when empty. */
63
+ export function renderRadarReport(corpusRoot, opts = {}) {
64
+ const iso = opts.today ?? new Date().toISOString().slice(0, 10);
65
+ const today = new Date(`${iso}T00:00:00Z`);
66
+ let docs = loadRadars(corpusRoot);
67
+ if (opts.cluster)
68
+ docs = docs.filter((d) => (d.meta.cluster ?? '') === opts.cluster);
69
+ if (!docs.length) {
70
+ return opts.cluster ? `No radars matched cluster \`${opts.cluster}\`.\n` : 'No radar sidecars yet.\n';
71
+ }
72
+ const rows = docs.map((d) => toRow(d, today));
73
+ const stale = rows.filter((r) => r.isStale);
74
+ const byCluster = countBy(rows, (r) => r.cluster || '(untagged)');
75
+ const byGrade = countBy(rows, (r) => r.grade);
76
+ const byTrajectory = countBy(rows, (r) => r.trajectory);
77
+ const sortedKeys = (m) => [...m.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
78
+ const tag = opts.cluster ? ` — cluster \`${opts.cluster}\`` : '';
79
+ const lines = [
80
+ `# Radar Report ${iso}${tag}`,
81
+ '',
82
+ `**Total radars**: ${rows.length}`,
83
+ `**Overdue (stale)**: ${stale.length}`,
84
+ '',
85
+ '## Clusters',
86
+ '',
87
+ '| Cluster | Count | Stale |',
88
+ '|---|---:|---:|',
89
+ ];
90
+ for (const c of sortedKeys(byCluster)) {
91
+ const members = byCluster.get(c);
92
+ lines.push(`| ${c} | ${members.length} | ${members.filter((m) => m.isStale).length} |`);
93
+ }
94
+ lines.push('', '## GRADE Distribution', '', '| Grade | Count |', '|---|---:|');
95
+ for (const g of sortedKeys(byGrade))
96
+ lines.push(`| ${g || '?'} | ${byGrade.get(g).length} |`);
97
+ lines.push('', '## GRADE Trajectories', '', '| Trajectory | Count |', '|---|---:|');
98
+ for (const t of sortedKeys(byTrajectory))
99
+ lines.push(`| ${t || '?'} | ${byTrajectory.get(t).length} |`);
100
+ if (stale.length) {
101
+ lines.push('', '## Overdue Refreshes', '', '| REF | Cadence | Last refresh | Overdue days | GRADE | Cluster |', '|---|---|---|---:|---|---|');
102
+ for (const s of [...stale].sort((a, b) => (b.overdueDays ?? 0) - (a.overdueDays ?? 0))) {
103
+ lines.push(`| ${s.refId} | ${s.cadence} | ${s.lastRefreshed} | ${s.overdueDays} | ${s.grade} | ${s.cluster} |`);
104
+ }
105
+ }
106
+ lines.push('', '## Individual Radars', '');
107
+ for (const r of rows) {
108
+ lines.push(`### ${r.refId} — grade **${r.grade}**, trajectory \`${r.trajectory}\`, cadence \`${r.cadence}\``, '');
109
+ lines.push(`- Cluster: ${r.cluster || '(none)'}`);
110
+ lines.push(`- Last refreshed: ${r.lastRefreshed || '?'} (${r.daysSince ?? '?'} days ago)`);
111
+ const snippet = sectionSnippet(r.text, '## 1.');
112
+ if (snippet)
113
+ lines.push(`- Rationale: ${snippet}`);
114
+ lines.push('');
115
+ }
116
+ return lines.join('\n').replace(/\s+$/, '') + '\n';
117
+ }
118
+ //# sourceMappingURL=radar-report.js.map
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Shared primitives for the radar/freshness subsystem (#1498).
3
+ *
4
+ * Write-side counterpart to the read-only corpus-views renderers. Ports the
5
+ * common helpers from corpus/radar_init.py + radar_report.py:
6
+ * - externalized cluster map (mechanism only — the literal REF-range table
7
+ * from radar_init.guess_cluster is NOT ported; the corpus supplies its own
8
+ * `documentation/radar/clusters.yaml`, per the #1498 "don't port the literal
9
+ * ranges" requirement),
10
+ * - GRADE extraction from the analysis doc (improved over the Python source:
11
+ * also matches the `**Quality**: A-` form the canonical/expanded reference
12
+ * templates use, and preserves the +/- sign the Python `([A-D])` dropped),
13
+ * - citation-sidecar title/authors,
14
+ * - the radar-sidecar loader.
15
+ *
16
+ * @source historical: corpus/radar_init.py, corpus/radar_report.py
17
+ */
18
+ import * as fs from 'fs';
19
+ import * as path from 'path';
20
+ import { load as loadYaml } from 'js-yaml';
21
+ import { parseFrontmatter, extractRadar } from '../corpus-views/ref-parser.js';
22
+ const RADAR_DIR = ['documentation', 'radar'];
23
+ const REFS_DIR = ['documentation', 'references'];
24
+ const CITES_DIR = ['documentation', 'citations'];
25
+ function radarDir(corpusRoot) {
26
+ return path.join(corpusRoot, ...RADAR_DIR);
27
+ }
28
+ /** List REF ids that have a radar sidecar (`documentation/radar/REF-*-radar.md`). */
29
+ export function listRadarRefs(corpusRoot) {
30
+ try {
31
+ return fs
32
+ .readdirSync(radarDir(corpusRoot))
33
+ .filter((f) => /^REF-\d{3,4}[a-z]?-radar\.md$/.test(f))
34
+ .map((f) => f.replace(/-radar\.md$/, ''))
35
+ .sort();
36
+ }
37
+ catch {
38
+ return [];
39
+ }
40
+ }
41
+ /** List REF ids that have a citation sidecar (`documentation/citations/REF-*-citations.md`). */
42
+ export function listCitationRefs(corpusRoot) {
43
+ try {
44
+ return fs
45
+ .readdirSync(path.join(corpusRoot, ...CITES_DIR))
46
+ .filter((f) => /^REF-\d{3,4}[a-z]?-citations\.md$/.test(f))
47
+ .map((f) => f.replace(/-citations\.md$/, ''))
48
+ .sort();
49
+ }
50
+ catch {
51
+ return [];
52
+ }
53
+ }
54
+ /**
55
+ * Build a REF-id → cluster-tag resolver from `documentation/radar/clusters.yaml`.
56
+ *
57
+ * Format (corpus-supplied; absent file → resolver always returns ''):
58
+ * cluster-tag:
59
+ * - "599" # a single REF number
60
+ * - "600-605" # an inclusive REF-number range
61
+ *
62
+ * Mirrors the *behavior* of radar_init.guess_cluster (number-range → tag) without
63
+ * porting its hardcoded ranges.
64
+ */
65
+ export function loadClusterMap(corpusRoot) {
66
+ const file = path.join(radarDir(corpusRoot), 'clusters.yaml');
67
+ let raw;
68
+ try {
69
+ raw = loadYaml(fs.readFileSync(file, 'utf-8'));
70
+ }
71
+ catch {
72
+ return () => '';
73
+ }
74
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
75
+ return () => '';
76
+ // Flatten to ordered [low, high, tag] rules; singletons are low===high.
77
+ const rules = [];
78
+ for (const [tag, spec] of Object.entries(raw)) {
79
+ const entries = Array.isArray(spec) ? spec : [spec];
80
+ for (const e of entries) {
81
+ const s = String(e).trim();
82
+ const range = s.match(/^(\d+)\s*-\s*(\d+)$/);
83
+ if (range) {
84
+ rules.push([parseInt(range[1], 10), parseInt(range[2], 10), tag]);
85
+ }
86
+ else if (/^\d+$/.test(s)) {
87
+ const n = parseInt(s, 10);
88
+ rules.push([n, n, tag]);
89
+ }
90
+ }
91
+ }
92
+ return (refId) => {
93
+ const m = refId.match(/^REF-(\d+)/);
94
+ if (!m)
95
+ return '';
96
+ const n = parseInt(m[1], 10);
97
+ for (const [low, high, tag] of rules) {
98
+ if (n >= low && n <= high)
99
+ return tag;
100
+ }
101
+ return '';
102
+ };
103
+ }
104
+ /** GRADE patterns, tried in order. Each captures a letter plus optional +/- sign. */
105
+ const GRADE_PATTERNS = [
106
+ // Canonical/expanded reference templates: §14/§20 Document Classification.
107
+ /\*\*Quality\*\*:\s*([A-D][+-]?)/,
108
+ // radar_init.py forms (sign-preserving; the Python source dropped the sign).
109
+ /GRADE[^|\n]*\|\s*\*{0,2}([A-D][+-]?)\*{0,2}/,
110
+ /\*\*GRADE[^:]*:\*\*\s*([A-D][+-]?)/,
111
+ /\bGRADE\s*[-—:]\s*([A-D][+-]?)/,
112
+ ];
113
+ /**
114
+ * Extract the GRADE letter (with sign, e.g. `A-`) from the REF analysis doc.
115
+ * Scans `documentation/references/REF-XXX-*.md` (skipping templates). Returns
116
+ * `?` when no GRADE is found. Improves on radar_init.read_analysis_grade by
117
+ * matching the `**Quality**:` classification form and preserving the sign.
118
+ */
119
+ export function readAnalysisGrade(corpusRoot, refId) {
120
+ for (const file of analysisFiles(corpusRoot, refId)) {
121
+ const text = fs.readFileSync(file, 'utf-8');
122
+ for (const pat of GRADE_PATTERNS) {
123
+ const m = text.match(pat);
124
+ if (m)
125
+ return m[1].toUpperCase();
126
+ }
127
+ }
128
+ return '?';
129
+ }
130
+ /** Analysis-doc files for a REF (references/REF-XXX-*.md), excluding TEMPLATE-* . */
131
+ function analysisFiles(corpusRoot, refId) {
132
+ const dir = path.join(corpusRoot, ...REFS_DIR);
133
+ try {
134
+ return fs
135
+ .readdirSync(dir)
136
+ .filter((f) => f.startsWith(`${refId}-`) && f.endsWith('.md') && !f.startsWith('TEMPLATE'))
137
+ .sort()
138
+ .map((f) => path.join(dir, f));
139
+ }
140
+ catch {
141
+ return [];
142
+ }
143
+ }
144
+ /** Corpus-relative path of the first analysis doc for a REF, or null. */
145
+ export function analysisRelPath(corpusRoot, refId) {
146
+ const files = analysisFiles(corpusRoot, refId);
147
+ return files.length ? path.relative(corpusRoot, files[0]) : null;
148
+ }
149
+ /** Title + author display names parsed from the citation sidecar frontmatter. */
150
+ export function readCitationMeta(corpusRoot, refId) {
151
+ const p = path.join(corpusRoot, ...CITES_DIR, `${refId}-citations.md`);
152
+ if (!fs.existsSync(p))
153
+ return { title: '', authors: [] };
154
+ const fm = parseFrontmatter(fs.readFileSync(p, 'utf-8'));
155
+ const title = typeof fm.title === 'string' ? fm.title.trim() : '';
156
+ const authors = [];
157
+ if (Array.isArray(fm.authors)) {
158
+ for (const a of fm.authors) {
159
+ if (a && typeof a === 'object' && 'name' in a && a.name) {
160
+ authors.push(String(a.name).trim());
161
+ }
162
+ else if (typeof a === 'string' && a.trim()) {
163
+ authors.push(a.trim());
164
+ }
165
+ }
166
+ }
167
+ return { title, authors };
168
+ }
169
+ /** Load every radar sidecar in the corpus (parsed meta + title + raw body). */
170
+ export function loadRadars(corpusRoot) {
171
+ const out = [];
172
+ for (const refId of listRadarRefs(corpusRoot)) {
173
+ const meta = extractRadar(corpusRoot, refId);
174
+ if (!meta)
175
+ continue;
176
+ const full = path.join(radarDir(corpusRoot), `${refId}-radar.md`);
177
+ const text = fs.readFileSync(full, 'utf-8');
178
+ const fm = parseFrontmatter(text);
179
+ out.push({
180
+ refId,
181
+ meta,
182
+ title: typeof fm.title === 'string' ? fm.title.trim() : null,
183
+ relPath: path.relative(corpusRoot, full),
184
+ text,
185
+ });
186
+ }
187
+ return out;
188
+ }
189
+ //# sourceMappingURL=radar-shared.js.map
@@ -0,0 +1,68 @@
1
+ /**
2
+ * radar-status — overdue/freshness report over all radar sidecars (#1498).
3
+ *
4
+ * Port of corpus/radar_staleness.py: computes staleness for every radar sidecar
5
+ * (shared computeStaleness), sorts most-overdue-first, and renders table / csv /
6
+ * list. on-demand and undatable radars sort last (no overdue).
7
+ *
8
+ * @source historical: corpus/radar_staleness.py
9
+ */
10
+ import { computeStaleness } from '../corpus-views/corpus-config.js';
11
+ import { loadRadars } from './radar-shared.js';
12
+ function asOf(today) {
13
+ const iso = today ?? new Date().toISOString().slice(0, 10);
14
+ return new Date(`${iso}T00:00:00Z`);
15
+ }
16
+ /** Compute one status row per radar sidecar, sorted most-overdue-first. */
17
+ export function radarStatusRows(corpusRoot, opts = {}) {
18
+ const today = asOf(opts.today);
19
+ const rows = loadRadars(corpusRoot).map((doc) => {
20
+ const s = computeStaleness(doc.meta.refreshCadence, doc.meta.lastRefreshed, today);
21
+ return {
22
+ refId: doc.refId,
23
+ cadence: doc.meta.refreshCadence ?? '?',
24
+ lastRefreshed: doc.meta.lastRefreshed ?? '',
25
+ daysSince: s.daysSince,
26
+ overdueDays: s.overdueDays,
27
+ isStale: s.isStale,
28
+ grade: doc.meta.gradeCurrent ?? doc.meta.gradeOriginal ?? '?',
29
+ trajectory: doc.meta.gradeTrajectory ?? 'stable',
30
+ cluster: doc.meta.cluster ?? '',
31
+ };
32
+ });
33
+ const filtered = opts.staleOnly ? rows.filter((r) => r.isStale) : rows;
34
+ // Most overdue first; non-overdue (null) sort after; ties by REF id.
35
+ return filtered.sort((a, b) => {
36
+ const ao = a.overdueDays ?? -Infinity;
37
+ const bo = b.overdueDays ?? -Infinity;
38
+ if (ao !== bo)
39
+ return bo - ao;
40
+ return a.refId < b.refId ? -1 : a.refId > b.refId ? 1 : 0;
41
+ });
42
+ }
43
+ /** Render status rows as a markdown table, CSV, or plain list. */
44
+ export function renderRadarStatus(rows, format = 'table') {
45
+ if (format === 'csv') {
46
+ const head = 'ref,cadence,last_refreshed,days_since,overdue_days,is_stale,grade,trajectory,cluster';
47
+ const body = rows.map((r) => `${r.refId},${r.cadence},${r.lastRefreshed},${r.daysSince ?? ''},${r.overdueDays ?? ''},${r.isStale},${r.grade},${r.trajectory},${r.cluster}`);
48
+ return [head, ...body].join('\n') + '\n';
49
+ }
50
+ if (format === 'list') {
51
+ return (rows
52
+ .map((r) => {
53
+ const tag = r.isStale ? `OVERDUE +${r.overdueDays}d` : r.overdueDays === null ? 'n/a' : `ok (${-r.overdueDays}d left)`;
54
+ return `- ${r.refId} [${r.grade}] ${r.cadence} — last ${r.lastRefreshed || '?'} — ${tag}`;
55
+ })
56
+ .join('\n') + '\n');
57
+ }
58
+ // table
59
+ const lines = [
60
+ '| REF | GRADE | Cadence | Last Refreshed | Days Since | Overdue (days) | Stale |',
61
+ '|---|---|---|---|---:|---:|---|',
62
+ ];
63
+ for (const r of rows) {
64
+ lines.push(`| ${r.refId} | ${r.grade} | ${r.cadence} | ${r.lastRefreshed || '—'} | ${r.daysSince ?? '—'} | ${r.overdueDays ?? '—'} | ${r.isStale ? 'yes' : 'no'} |`);
65
+ }
66
+ return lines.join('\n') + '\n';
67
+ }
68
+ //# sourceMappingURL=radar-status.js.map