@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,233 @@
1
+ /**
2
+ * Citation-sidecar structural lint + orphan detection (#1503).
3
+ *
4
+ * TS-native port of section9 `scripts/corpus/lint_sidecars.py` (structural
5
+ * lint) and `scripts/corpus/find_orphans.py` (zero-edge sidecars). These are
6
+ * *sidecar-structural* checks — distinct from the generic `aiwg lint
7
+ * --ruleset research` (note-level frontmatter/orphans) that the `research-lint`
8
+ * skill runs. The `research-lint` skill references these for sidecar depth
9
+ * rather than duplicating them (reconcile, don't duplicate).
10
+ *
11
+ * @source historical: corpus/lint_sidecars.py, corpus/find_orphans.py
12
+ * @tests @test/unit/artifacts/sidecar-lint.test.ts
13
+ */
14
+ import * as fs from 'fs';
15
+ import * as path from 'path';
16
+ const REF_ID_RE = /\bREF-\d+[a-z]?\b/g;
17
+ const CITES_DIR = ['documentation', 'citations'];
18
+ const REFS_DIR = ['documentation', 'references'];
19
+ /** List `documentation/citations/REF-*-citations.md` files under the corpus root. */
20
+ function listSidecars(root) {
21
+ const dir = path.join(root, ...CITES_DIR);
22
+ if (!fs.existsSync(dir))
23
+ return [];
24
+ return fs
25
+ .readdirSync(dir)
26
+ .filter((f) => /^REF-.*-citations\.md$/.test(f))
27
+ .sort()
28
+ .map((f) => path.join(dir, f));
29
+ }
30
+ /** Extract the ref id (`REF-NNN`) from a sidecar filename. */
31
+ function refOf(file) {
32
+ return path.basename(file).replace(/-citations\.md$/, '');
33
+ }
34
+ /**
35
+ * Structural lint for one sidecar's text. Mirrors `lint_sidecars.lint`:
36
+ * - frontmatter present + has `ref:`/`title:`/`type:`
37
+ * - has an Outgoing section + an Incoming section (merge-redirects exempt)
38
+ * - no duplicate `| # | Title` table headers under the same sub-header
39
+ * (the doubled-append bug pattern)
40
+ */
41
+ export function lintSidecarText(text) {
42
+ const issues = [];
43
+ const lines = text.split('\n');
44
+ // Frontmatter
45
+ if (!text.startsWith('---')) {
46
+ issues.push('missing-frontmatter');
47
+ }
48
+ else {
49
+ const end = lines.indexOf('---', 1);
50
+ if (end === -1) {
51
+ issues.push('malformed-frontmatter');
52
+ }
53
+ else {
54
+ const fm = lines.slice(1, end).join('\n');
55
+ for (const req of ['ref:', 'title:', 'type:']) {
56
+ if (!fm.includes(req))
57
+ issues.push(`frontmatter-missing-${req.replace(/:$/, '')}`);
58
+ }
59
+ }
60
+ }
61
+ // Section presence (H1/H2 only; sub-headers belong to the enclosing section)
62
+ let hasOutgoing = false;
63
+ let hasIncoming = false;
64
+ for (const line of lines) {
65
+ const low = line.toLowerCase().trim();
66
+ if (low.startsWith('## ') && !low.startsWith('### ')) {
67
+ const h = low.replace(/^#+/, '').trim();
68
+ if (h.startsWith('outgoing') ||
69
+ h.includes('papers this work cites') ||
70
+ h.includes('works / resources referenced')) {
71
+ hasOutgoing = true;
72
+ }
73
+ if (h.startsWith('incoming') ||
74
+ h.includes('cited by') ||
75
+ h.includes('referenced by') ||
76
+ h.includes('citing this') ||
77
+ h.includes('that cite')) {
78
+ hasIncoming = true;
79
+ }
80
+ }
81
+ }
82
+ const isRedirect = text.includes('MERGED INTO') || text.includes('status: merged');
83
+ if (!hasOutgoing && !isRedirect)
84
+ issues.push('missing-outgoing-section');
85
+ if (!hasIncoming && !isRedirect)
86
+ issues.push('missing-incoming-section');
87
+ // Duplicate table headers: two `| # | Title` headers with no intervening
88
+ // sub-header (a doubled-append signature).
89
+ let bugDupes = 0;
90
+ let lastSubHdr = -1;
91
+ let lastTable = -1;
92
+ for (let i = 0; i < lines.length; i++) {
93
+ const s = lines[i].trim();
94
+ if (s.startsWith('## ') || s.startsWith('### ')) {
95
+ lastSubHdr = i;
96
+ lastTable = -1;
97
+ }
98
+ else if (s.startsWith('| # | Title')) {
99
+ if (lastTable !== -1 && lastTable > lastSubHdr)
100
+ bugDupes++;
101
+ lastTable = i;
102
+ }
103
+ }
104
+ if (bugDupes > 0)
105
+ issues.push(`duplicate-table-headers-count=${bugDupes}`);
106
+ return issues;
107
+ }
108
+ export function lintSidecars(root) {
109
+ const files = listSidecars(root);
110
+ const byIssue = {};
111
+ let filesWithIssues = 0;
112
+ let totalIssues = 0;
113
+ for (const file of files) {
114
+ const issues = lintSidecarText(fs.readFileSync(file, 'utf-8'));
115
+ if (issues.length) {
116
+ filesWithIssues++;
117
+ totalIssues += issues.length;
118
+ for (const issue of issues)
119
+ (byIssue[issue] ??= []).push(refOf(file));
120
+ }
121
+ }
122
+ return { totalFiles: files.length, filesWithIssues, totalIssues, byIssue };
123
+ }
124
+ export function renderLint(r) {
125
+ const out = [];
126
+ out.push(`Sidecars linted: ${r.totalFiles}`);
127
+ out.push(`Files with issues: ${r.filesWithIssues}`);
128
+ out.push(`Total issues: ${r.totalIssues}`);
129
+ out.push('');
130
+ const sorted = Object.entries(r.byIssue).sort((a, b) => b[1].length - a[1].length);
131
+ for (const [issue, refs] of sorted) {
132
+ out.push(` ${issue}: ${refs.length} files`);
133
+ for (const ref of refs.slice(0, 10))
134
+ out.push(` ${ref}`);
135
+ if (refs.length > 10)
136
+ out.push(` ... and ${refs.length - 10} more`);
137
+ }
138
+ return out.join('\n') + '\n';
139
+ }
140
+ /**
141
+ * Read the title from a reference analysis doc (`REF-NNN-*.md` or `REF-NNN.md`).
142
+ * Prefers frontmatter `title:`, then the first `# ` heading in the body — so
143
+ * docs that open with a `---` frontmatter block still yield a real title (the
144
+ * section9 original read the literal first line and rendered `---`).
145
+ */
146
+ export function refTitle(root, ref) {
147
+ const refsDir = path.join(root, ...REFS_DIR);
148
+ if (!fs.existsSync(refsDir))
149
+ return '?';
150
+ const match = fs
151
+ .readdirSync(refsDir)
152
+ .find((f) => f === `${ref}.md` || f.startsWith(`${ref}-`));
153
+ if (!match)
154
+ return '?';
155
+ const text = fs.readFileSync(path.join(refsDir, match), 'utf-8');
156
+ // 1. frontmatter title:
157
+ const fm = text.match(/^---\n([\s\S]*?)\n---\n/);
158
+ if (fm) {
159
+ const t = fm[1].match(/^title:\s*(.+)$/m);
160
+ if (t)
161
+ return t[1].trim().replace(/^["']|["']$/g, '').slice(0, 80);
162
+ }
163
+ // 2. first `# ` heading (strip a `REF-NNN:` prefix if present)
164
+ const heading = text.match(/^#\s+(.+)$/m);
165
+ if (heading)
166
+ return heading[1].replace(/^REF-[^:]*:\s*/, '').trim().slice(0, 80) || '?';
167
+ return '?';
168
+ }
169
+ /**
170
+ * Scan a sidecar's Outgoing/Incoming sections for any `REF-NNN` edge token
171
+ * (excluding self). Faithful port of `find_orphans.parse_sections` — lenient
172
+ * by design: it matches any ref id appearing in an edge section regardless of
173
+ * table-column naming, unlike the column-specific `parseCitationSidecar`.
174
+ */
175
+ function scanEdges(text, selfRef) {
176
+ const outgoing = new Set();
177
+ const incoming = new Set();
178
+ let current = null;
179
+ for (const line of text.split('\n')) {
180
+ const low = line.toLowerCase().trim();
181
+ const isSectionHeader = low.startsWith('# ') || (low.startsWith('## ') && !low.startsWith('### '));
182
+ if (isSectionHeader) {
183
+ const h = low.replace(/^#+/, '').trim();
184
+ if (h.startsWith('notes') || h === 'note')
185
+ current = null;
186
+ else if (h.startsWith('outgoing'))
187
+ current = 'out';
188
+ else if (h.startsWith('incoming'))
189
+ current = 'in';
190
+ else if (h.includes('cited by') || h.includes('referenced by') || h.includes('citing this') || h.includes('that cite'))
191
+ current = 'in';
192
+ else if (h.includes('papers this work cites') || h.includes('works / resources referenced') || h.startsWith('references ') || h === 'references')
193
+ current = 'out';
194
+ else
195
+ current = null;
196
+ continue;
197
+ }
198
+ if (current === null)
199
+ continue;
200
+ const matches = line.match(REF_ID_RE);
201
+ if (!matches)
202
+ continue;
203
+ for (const m of matches) {
204
+ if (m === selfRef)
205
+ continue;
206
+ if (current === 'out')
207
+ outgoing.add(m);
208
+ else
209
+ incoming.add(m);
210
+ }
211
+ }
212
+ return { outgoing, incoming };
213
+ }
214
+ /** Sidecars with zero incoming AND zero outgoing edges (lenient section scan). */
215
+ export function findOrphans(root) {
216
+ const orphans = [];
217
+ for (const file of listSidecars(root)) {
218
+ const ref = refOf(file);
219
+ const { outgoing, incoming } = scanEdges(fs.readFileSync(file, 'utf-8'), ref);
220
+ if (outgoing.size === 0 && incoming.size === 0) {
221
+ orphans.push({ ref, title: refTitle(root, ref) });
222
+ }
223
+ }
224
+ return orphans;
225
+ }
226
+ export function renderOrphans(orphans) {
227
+ const out = [];
228
+ out.push(`Orphaned sidecars (no incoming AND no outgoing edges): ${orphans.length}`);
229
+ for (const o of orphans)
230
+ out.push(` ${o.ref}: ${o.title}`);
231
+ return out.join('\n') + '\n';
232
+ }
233
+ //# sourceMappingURL=sidecar-lint.js.map
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Citation-sidecar metadata repair (#1503): author backfill + affiliation
3
+ * normalization. TS-native port of section9 `scripts/corpus/fix_broken_authors.py`
4
+ * and `scripts/corpus/normalize_affiliation.py`.
5
+ *
6
+ * Both default to dry-run; pass `{ write: true }` to persist. The affiliation
7
+ * map is loaded from the corpus (`documentation/profiles/orgs/affiliation-map.yaml`)
8
+ * with the built-in `DEFAULT_AFFILIATION_MAP` as fallback — the hardcoded
9
+ * section9 map is externalized to config per epic #1496 principle #3.
10
+ *
11
+ * @source historical: corpus/fix_broken_authors.py, corpus/normalize_affiliation.py
12
+ * @tests @test/unit/artifacts/sidecar-repair.test.ts
13
+ */
14
+ import * as fs from 'fs';
15
+ import * as path from 'path';
16
+ import { load as loadYaml } from 'js-yaml';
17
+ import { DEFAULT_AFFILIATION_MAP, buildAffiliationReverse } from '../corpus-views/corpus-config.js';
18
+ const CITES_DIR = ['documentation', 'citations'];
19
+ const REFS_DIR = ['documentation', 'references'];
20
+ const AFFIL_MAP_FILE = ['documentation', 'profiles', 'orgs', 'affiliation-map.yaml'];
21
+ function listSidecars(root) {
22
+ const dir = path.join(root, ...CITES_DIR);
23
+ if (!fs.existsSync(dir))
24
+ return [];
25
+ return fs
26
+ .readdirSync(dir)
27
+ .filter((f) => /^REF-.*-citations\.md$/.test(f))
28
+ .sort()
29
+ .map((f) => path.join(dir, f));
30
+ }
31
+ function refOf(file) {
32
+ return path.basename(file).replace(/-citations\.md$/, '');
33
+ }
34
+ // ── Author repair ──────────────────────────────────────────────────────────
35
+ const INITIAL_RE = /^[A-Z]\.(?:[\s-]*[A-Z]\.)*$/;
36
+ const INST_KEYWORDS = [
37
+ 'labs', 'contributors', 'foundation', 'team', 'datatracker', 'improvement proposal',
38
+ 'task force', 'consortium', 'committee', 'working group', 'society', 'council', 'inc',
39
+ 'llc', 'corp', 'openai', 'anthropic', 'deepmind', 'meta', 'google', 'microsoft',
40
+ 'ietf', 'ieee', 'iso', 'w3c', 'nist',
41
+ ];
42
+ function isInstitutional(name) {
43
+ const nm = name.toLowerCase();
44
+ return INST_KEYWORDS.some((k) => nm.includes(k));
45
+ }
46
+ /** Extract the body of the `## Citation` section from an analysis doc. */
47
+ export function extractCitationBlock(text) {
48
+ const m = text.match(/##\s+(?:1\.\s+)?Citation\s*\n\s*\n([\s\S]+?)(?=\n##\s|\n---|$)/);
49
+ return m ? m[1].trim() : '';
50
+ }
51
+ /**
52
+ * Parse author names from a citation string. Faithful port of
53
+ * `fix_broken_authors.parse_authors` — handles "Last, F. M., Last2, F. (YYYY)",
54
+ * "& "/" and " separators, et-al truncation, institutional single-authors, and
55
+ * spelled-out first names.
56
+ */
57
+ export function parseAuthors(citation) {
58
+ if (!citation)
59
+ return [];
60
+ const firstLine = citation.split('\n')[0].trim();
61
+ const m = firstLine.match(/^(.+?)\s*\((\d{4})/);
62
+ let authorsStr;
63
+ if (!m) {
64
+ // Institutional: "Org. *Title*..." or "Org Name. Title..."
65
+ const m2 = firstLine.match(/^([A-Z][^.*]+?)\.\s+\*?\S/);
66
+ if (m2)
67
+ return [m2[1].trim()];
68
+ return [];
69
+ }
70
+ authorsStr = m[1].trim().replace(/[,.]+$/, '');
71
+ if (/et al/i.test(authorsStr)) {
72
+ authorsStr = authorsStr.split(/,?\s*et\s+al\.?/i)[0];
73
+ }
74
+ if (!authorsStr)
75
+ return [];
76
+ // Institutional single author
77
+ if (!authorsStr.includes(',') && !/\s+&\s+|\s+and\s+/.test(authorsStr)) {
78
+ return [authorsStr.trim().replace(/\.$/, '')];
79
+ }
80
+ if (isInstitutional(authorsStr.split(',')[0]) && !/^[A-Z][a-z]+,\s*[A-Z]\./.test(authorsStr)) {
81
+ return [authorsStr.trim().replace(/\.$/, '')];
82
+ }
83
+ // Normalize separators
84
+ let norm = authorsStr.replace(/ & /g, ', ');
85
+ norm = norm.replace(/\s+and\s+/gi, ', ');
86
+ norm = norm.replace(/\s*&\s*/g, ', ');
87
+ const parts = norm.split(/,\s*/).map((p) => p.trim()).filter(Boolean);
88
+ const out = [];
89
+ let i = 0;
90
+ while (i < parts.length) {
91
+ const cur = parts[i].trim();
92
+ if (!cur) {
93
+ i++;
94
+ continue;
95
+ }
96
+ if (i + 1 < parts.length) {
97
+ const nxt = parts[i + 1].trim();
98
+ if (INITIAL_RE.test(nxt) || /^[A-Z]\.\s*[A-Z]\.?$/.test(nxt)) {
99
+ out.push(`${cur}, ${nxt}`);
100
+ i += 2;
101
+ continue;
102
+ }
103
+ if (/^[A-Z]\.?(?:\s+[A-Z]\.?)*$/.test(nxt) && nxt.length <= 8) {
104
+ out.push(`${cur}, ${nxt}`);
105
+ i += 2;
106
+ continue;
107
+ }
108
+ if (/^[A-Z][a-zA-Z'-]+$/.test(cur) &&
109
+ /^[A-Z][a-zA-Z'-]+$/.test(nxt) &&
110
+ nxt.split(' ').length === 1) {
111
+ out.push(`${cur}, ${nxt}`);
112
+ i += 2;
113
+ continue;
114
+ }
115
+ }
116
+ out.push(cur);
117
+ i++;
118
+ }
119
+ const cleaned = [];
120
+ for (let a of out) {
121
+ a = a.trim().replace(/[,.]+$/, '').trim().replace(/\s+/g, ' ');
122
+ if (!a)
123
+ continue;
124
+ if (['the', 'et al', 'et al.', 'n/a', 'and'].includes(a.toLowerCase()))
125
+ continue;
126
+ if (a.length < 3 && !isInstitutional(a))
127
+ continue;
128
+ cleaned.push(a);
129
+ }
130
+ return cleaned;
131
+ }
132
+ function findAnalysisDoc(root, ref) {
133
+ const dir = path.join(root, ...REFS_DIR);
134
+ if (!fs.existsSync(dir))
135
+ return null;
136
+ const match = fs.readdirSync(dir).find((f) => f.startsWith(`${ref}-`));
137
+ return match ? path.join(dir, match) : null;
138
+ }
139
+ export function repairAuthors(root, opts = {}) {
140
+ const results = [];
141
+ for (const file of listSidecars(root)) {
142
+ const text = fs.readFileSync(file, 'utf-8');
143
+ if (!text.includes('(see REF doc)') && !text.includes('"see REF doc"'))
144
+ continue;
145
+ const ref = refOf(file);
146
+ const fmMatch = text.match(/^---\n([\s\S]*?)\n---\n/);
147
+ if (!fmMatch) {
148
+ results.push({ ref, ok: false, reason: 'no-frontmatter' });
149
+ continue;
150
+ }
151
+ const analysis = findAnalysisDoc(root, ref);
152
+ if (!analysis) {
153
+ results.push({ ref, ok: false, reason: 'no-analysis-doc' });
154
+ continue;
155
+ }
156
+ const authors = parseAuthors(extractCitationBlock(fs.readFileSync(analysis, 'utf-8')));
157
+ if (!authors.length) {
158
+ results.push({ ref, ok: false, reason: 'could-not-parse-authors' });
159
+ continue;
160
+ }
161
+ const newBlock = ['authors:', ...authors.map((a) => ` - name: "${a}"`)].join('\n');
162
+ const newFm = fmMatch[1].replace(/authors:\s*(?:\n\s*-\s*.*)+/, newBlock);
163
+ if (newFm === fmMatch[1]) {
164
+ results.push({ ref, ok: false, reason: 'frontmatter-replace-no-op' });
165
+ continue;
166
+ }
167
+ const newText = `---\n${newFm}\n---\n${text.slice(fmMatch[0].length)}`;
168
+ if (opts.write)
169
+ fs.writeFileSync(file, newText);
170
+ results.push({ ref, ok: true, reason: 'fixed', authors });
171
+ }
172
+ return results;
173
+ }
174
+ // ── Affiliation normalization ────────────────────────────────────────────────
175
+ /** Load the corpus affiliation map (data-file override → built-in default). */
176
+ export function loadAffiliationMap(root) {
177
+ const file = path.join(root, ...AFFIL_MAP_FILE);
178
+ if (fs.existsSync(file)) {
179
+ try {
180
+ const raw = loadYaml(fs.readFileSync(file, 'utf-8'));
181
+ if (raw && typeof raw === 'object') {
182
+ return buildAffiliationReverse(raw);
183
+ }
184
+ }
185
+ catch {
186
+ /* fall through to default on malformed override */
187
+ }
188
+ }
189
+ return buildAffiliationReverse(DEFAULT_AFFILIATION_MAP);
190
+ }
191
+ /** Resolve an affiliation string to a canonical PROF-O slug, or null if ambiguous. */
192
+ export function normalizeAffiliation(value, reverse) {
193
+ if (!value)
194
+ return null;
195
+ const v = value.trim().replace(/^"|"$/g, '').trim();
196
+ if (/^PROF-O-[a-z0-9-]+$/.test(v))
197
+ return v; // already canonical
198
+ const key = v.toLowerCase().trim();
199
+ if (reverse.has(key))
200
+ return reverse.get(key);
201
+ // Compound (multiple orgs) — skip
202
+ if ([';', ' / ', ' — ', ' ↔ '].some((sep) => v.includes(sep)))
203
+ return null;
204
+ // Parenthetical — try the part before the paren
205
+ if (v.includes('(') && v.includes(')')) {
206
+ const before = v.split('(')[0].trim().replace(/,$/, '').trim().toLowerCase();
207
+ return reverse.get(before) ?? null;
208
+ }
209
+ return null;
210
+ }
211
+ export function normalizeAffiliations(root, opts = {}) {
212
+ const reverse = loadAffiliationMap(root);
213
+ const res = { normalized: 0, alreadyCanonical: 0, ambiguous: [], errors: [], changes: [] };
214
+ for (const file of listSidecars(root)) {
215
+ const ref = refOf(file);
216
+ const text = fs.readFileSync(file, 'utf-8');
217
+ const fmMatch = text.match(/^---\n([\s\S]*?)\n---\n/);
218
+ if (!fmMatch) {
219
+ res.errors.push({ ref, reason: 'no-frontmatter' });
220
+ continue;
221
+ }
222
+ let fm;
223
+ try {
224
+ fm = loadYaml(fmMatch[1]) ?? {};
225
+ }
226
+ catch {
227
+ res.errors.push({ ref, reason: 'yaml-parse-error' });
228
+ continue;
229
+ }
230
+ const cur = String(fm['affiliation-primary'] ?? '').trim().replace(/^"|"$/g, '');
231
+ if (!cur) {
232
+ res.alreadyCanonical++;
233
+ continue;
234
+ }
235
+ const canonical = normalizeAffiliation(cur, reverse);
236
+ if (canonical === null) {
237
+ res.ambiguous.push({ ref, value: cur });
238
+ continue;
239
+ }
240
+ if (canonical === cur) {
241
+ res.alreadyCanonical++;
242
+ continue;
243
+ }
244
+ const newFm = fmMatch[1].replace(/^(affiliation-primary:\s*)"?[^"\n]*"?\s*$/m, `$1${canonical}`);
245
+ if (newFm === fmMatch[1]) {
246
+ res.errors.push({ ref, reason: 'regex-no-op' });
247
+ continue;
248
+ }
249
+ if (opts.write)
250
+ fs.writeFileSync(file, `---\n${newFm}\n---\n${text.slice(fmMatch[0].length)}`);
251
+ res.normalized++;
252
+ res.changes.push({ ref, from: cur, to: canonical });
253
+ }
254
+ return res;
255
+ }
256
+ export function renderRepair(authors, affil, write) {
257
+ const out = [];
258
+ const mode = write ? 'WRITE' : 'dry-run';
259
+ const fixed = authors.filter((a) => a.ok && a.reason === 'fixed');
260
+ const failed = authors.filter((a) => !a.ok);
261
+ out.push(`Sidecar repair (${mode})`);
262
+ out.push('');
263
+ out.push(`Authors — fixed: ${fixed.length}, failed: ${failed.length}`);
264
+ for (const r of fixed.slice(0, 5))
265
+ out.push(` ${r.ref}: ${(r.authors ?? []).join('; ')}`);
266
+ for (const r of failed.slice(0, 10))
267
+ out.push(` ! ${r.ref}: ${r.reason}`);
268
+ out.push('');
269
+ out.push(`Affiliations — normalized: ${affil.normalized}, already-canonical/none: ${affil.alreadyCanonical}, ` +
270
+ `ambiguous: ${affil.ambiguous.length}, errors: ${affil.errors.length}`);
271
+ for (const c of affil.changes.slice(0, 10))
272
+ out.push(` ${c.ref}: ${c.from} → ${c.to}`);
273
+ for (const a of affil.ambiguous.slice(0, 10))
274
+ out.push(` ? ${a.ref}: ${a.value.slice(0, 80)}`);
275
+ return out.join('\n') + '\n';
276
+ }
277
+ //# sourceMappingURL=sidecar-repair.js.map