@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
package/README.md CHANGED
@@ -1,3 +1,23 @@
1
1
  # @aiwg/cli
2
2
 
3
- Bootstrap reservation for the lightweight AIWG CLI package.
3
+ Lightweight AIWG CLI for signed, versioned resources from
4
+ [`releases.aiwg.io`](https://releases.aiwg.io/).
5
+
6
+ ```bash
7
+ npm install --global @aiwg/cli@next
8
+
9
+ aiwg discover "architecture evolution" \
10
+ --resource-source web \
11
+ --aiwg-version canary
12
+ ```
13
+
14
+ ## Release status
15
+
16
+ This package follows AIWG CalVer in exact lockstep with the `aiwg` package.
17
+ The current beta supports signed web-backed `discover` and `show`, exact or
18
+ channel resource selection, verified caching, and warm offline reads. The
19
+ larger `aiwg` package remains the local/full distribution while web parity is
20
+ completed for mutating commands such as `use` and `regenerate`.
21
+
22
+ Resource bundles and precomputed indices are distributed by the release host,
23
+ not as additional npm packages.
package/bin/aiwg.mjs ADDED
@@ -0,0 +1,349 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * AIWG CLI Entry Point
5
+ *
6
+ * Single entry point for the `aiwg` command. Dispatches directly to the
7
+ * compiled router at `dist/src/cli/router.js` with no intermediate tsx fork
8
+ * or facade layer — one Node process per invocation.
9
+ *
10
+ * Responsibilities:
11
+ * 1. Handle channel-switching commands (--use-dev, --use-edge, --use-stable)
12
+ * 2. Fire a non-blocking background update check
13
+ * 3. Resolve the compiled router (installed path or dev-repo override)
14
+ * 4. Dispatch to router.run(args), then process.exit() deterministically
15
+ *
16
+ * This file is intentionally minimal. All command logic lives in the router
17
+ * and its handlers. If you find yourself adding business logic here, it
18
+ * probably belongs in a handler instead.
19
+ *
20
+ * @module bin/aiwg
21
+ * @implements #919
22
+ */
23
+
24
+ import { fileURLToPath } from 'url';
25
+ import path from 'path';
26
+ import { existsSync, readFileSync } from 'fs';
27
+ import os from 'os';
28
+ import { randomUUID } from 'crypto';
29
+
30
+ const __filename = fileURLToPath(import.meta.url);
31
+ const __dirname = path.dirname(__filename);
32
+ const packageRoot = path.resolve(__dirname, '..');
33
+
34
+ function readPackageVersion() {
35
+ try {
36
+ const pkg = JSON.parse(readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
37
+ return typeof pkg.version === 'string' ? pkg.version : '(unknown)';
38
+ } catch {
39
+ return '(unknown)';
40
+ }
41
+ }
42
+
43
+ function detectVersionChannel(version) {
44
+ if (version.includes('-rc.')) return 'rc';
45
+ if (version.includes('-beta.')) return 'beta';
46
+ if (version.includes('-alpha.')) return 'alpha';
47
+ if (version.includes('-nightly.')) return 'nightly';
48
+ try {
49
+ const raw = readFileSync(path.join(os.homedir(), '.aiwg', 'channel.json'), 'utf8');
50
+ const cfg = JSON.parse(raw);
51
+ if (cfg?.devMode) return 'dev';
52
+ if (typeof cfg?.channel === 'string') return cfg.channel;
53
+ } catch {
54
+ // Default below.
55
+ }
56
+ return 'stable';
57
+ }
58
+
59
+ function maybeHandleFastVersion(args) {
60
+ if (args.length !== 1) return false;
61
+ if (args[0] !== '--version' && args[0] !== '-version') return false;
62
+
63
+ const version = readPackageVersion();
64
+ const channel = detectVersionChannel(version);
65
+ console.log(` aiwg ${version} [${channel}]`);
66
+ console.log(` path: ${packageRoot}`);
67
+ return true;
68
+ }
69
+
70
+ if (maybeHandleFastVersion(process.argv.slice(2))) {
71
+ process.exit(0);
72
+ }
73
+
74
+ // Preflight: verify dist/ is built before any of the dynamic imports below
75
+ // try to resolve files that don't exist. Without this, a missing/incomplete
76
+ // dist/ surfaces as a raw `Cannot find module '.../dist/src/.../*.mjs'` from
77
+ // whichever import lands first, with no remediation hint. Fixes #1513
78
+ // (#1512 follow-up — the research agent hit MODULE_NOT_FOUND when dist/ was
79
+ // absent in their checkout; the answer was always `npm run build:cli`,
80
+ // which is what this preflight tells them).
81
+ //
82
+ // `--version` is handled above without dist, so this runs after that.
83
+ function maybeWarnUnbuiltDist() {
84
+ const required = [
85
+ 'dist/src/cli/router.js',
86
+ 'dist/src/update/notifier.mjs',
87
+ 'dist/src/channel/manager.mjs',
88
+ ];
89
+ const missing = required.filter(rel => !existsSync(path.join(packageRoot, rel)));
90
+ if (missing.length === 0) return;
91
+ const isDevCheckout =
92
+ existsSync(path.join(packageRoot, 'src')) &&
93
+ existsSync(path.join(packageRoot, '.git'));
94
+ const remediation = isDevCheckout
95
+ ? 'Run `npm run build:cli` in the AIWG checkout to build dist/.'
96
+ : 'Reinstall AIWG: `npm install -g aiwg` (the published package ships dist/).';
97
+ process.stderr.write(`aiwg: dist/ is missing or incomplete — required files absent:\n`);
98
+ for (const rel of missing) process.stderr.write(` - ${rel}\n`);
99
+ process.stderr.write(` ${remediation}\n`);
100
+ process.exit(1);
101
+ }
102
+ maybeWarnUnbuiltDist();
103
+
104
+ // Mint or inherit an invocation ID before anything else loads. Child processes
105
+ // spawned by handlers (detached update-notifier, aiwg exec, etc.) inherit the
106
+ // parent's ID via `AIWG_INVOCATION_ID` so their JSONL log records correlate
107
+ // with the parent's — search the log by invocation_id to get the full trace
108
+ // across process boundaries.
109
+ //
110
+ // randomUUID() is UUIDv4 today. Time-ordered v7 is not in Node stdlib yet;
111
+ // the correlation property is what matters, not the ordering.
112
+ function ensureInvocationId() {
113
+ const existing = process.env['AIWG_INVOCATION_ID'];
114
+ if (existing) return existing;
115
+ const fresh = randomUUID();
116
+ process.env['AIWG_INVOCATION_ID'] = fresh;
117
+ return fresh;
118
+ }
119
+ const invocationId = ensureInvocationId();
120
+
121
+ // Startup tracing — set AIWG_TRACE_STARTUP=1 to print per-phase timings to
122
+ // stderr. Useful for diagnosing cold-start regressions. No-op by default so
123
+ // it doesn't cost anything on the hot path.
124
+ const traceStartup = process.env['AIWG_TRACE_STARTUP'] === '1' ||
125
+ process.env['AIWG_TRACE_STARTUP']?.toLowerCase() === 'true';
126
+ const startHr = process.hrtime.bigint();
127
+ function trace(phase) {
128
+ if (!traceStartup) return;
129
+ const ms = Number(process.hrtime.bigint() - startHr) / 1_000_000;
130
+ process.stderr.write(`[trace] +${ms.toFixed(1)}ms ${phase}\n`);
131
+ }
132
+ trace('bin:entry');
133
+
134
+ /**
135
+ * Resolve the path to the compiled router.
136
+ *
137
+ * In dev mode (AIWG --use-dev set), point at the dev repo's `dist/`. In
138
+ * stable/next/edge/nightly mode, use this installed package's `dist/`.
139
+ *
140
+ * If the compiled router is missing (fresh clone without `npm run build`),
141
+ * emit a clear error and exit rather than falling back to a tsx fork.
142
+ */
143
+ async function resolveRouterPath() {
144
+ const { loadConfig } = await import('../dist/src/channel/manager.mjs');
145
+ const config = await loadConfig();
146
+ if (config.devMode && config.edgePath && config.edgePath !== packageRoot) {
147
+ const devRouter = path.join(config.edgePath, 'dist', 'src', 'cli', 'router.js');
148
+ if (!existsSync(devRouter)) {
149
+ console.error(`Dev mode: compiled router not found at ${devRouter}`);
150
+ console.error(` Run: (cd ${config.edgePath} && npm run build)`);
151
+ console.error(` Or switch back: aiwg --use-stable`);
152
+ process.exit(1);
153
+ }
154
+ return devRouter;
155
+ }
156
+ const installedRouter = path.join(packageRoot, 'dist', 'src', 'cli', 'router.js');
157
+ if (!existsSync(installedRouter)) {
158
+ // Config-driven from package.json (single source of truth). Falls back to
159
+ // the homepage if `bugs.url` is absent — never hardcode the build origin.
160
+ let issuesUrl = 'https://aiwg.io';
161
+ try {
162
+ const pkg = JSON.parse(readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
163
+ issuesUrl = pkg.bugs?.url || pkg.homepage || issuesUrl;
164
+ } catch {
165
+ // package.json unreadable in this broken install — keep the homepage fallback.
166
+ }
167
+ console.error(`Compiled router not found at ${installedRouter}`);
168
+ console.error(` This is a packaging bug. Please report it at:`);
169
+ console.error(` ${issuesUrl}`);
170
+ process.exit(1);
171
+ }
172
+ return installedRouter;
173
+ }
174
+
175
+ /**
176
+ * Parse verbosity flags from argv and set the logger level. Stackable:
177
+ * (none) → warn and above
178
+ * -v → info
179
+ * -vv → debug
180
+ * -vvv → debug + scope filter wide-open
181
+ * --quiet → error only
182
+ *
183
+ * `AIWG_LOG_LEVEL` env var overrides argv. `--verbose` is a synonym for -v.
184
+ *
185
+ * Returns the resolved level so the main entry can stash it. Does NOT mutate
186
+ * argv — handlers still see the flags. Call before the router loads so the
187
+ * logger picks up the right level when it initializes.
188
+ */
189
+ async function applyVerbosityFromArgs(args) {
190
+ let level = 'warn'; // default
191
+ if (args.includes('--quiet') || args.includes('-q')) level = 'error';
192
+ else if (args.includes('-vvv')) { level = 'debug'; process.env['AIWG_DEBUG'] ??= '1'; }
193
+ else if (args.includes('-vv')) level = 'debug';
194
+ else if (args.includes('-v') || args.includes('--verbose')) level = 'info';
195
+ // Env var takes precedence (for CI or scripting).
196
+ const envLevel = process.env['AIWG_LOG_LEVEL']?.toLowerCase();
197
+ if (envLevel && ['debug', 'info', 'warn', 'error', 'silent'].includes(envLevel)) {
198
+ level = envLevel;
199
+ }
200
+ // Reach into the compiled logger (same dist/ we're about to dispatch to)
201
+ // and set the level. Failing to import the logger here is non-fatal — the
202
+ // logger's own fallbacks will pick up AIWG_LOG_LEVEL from env.
203
+ try {
204
+ const routerPath = await resolveRouterPath();
205
+ const logPath = path.join(path.dirname(routerPath), 'log.js');
206
+ if (existsSync(logPath)) {
207
+ const { setLogLevel, setInvocationId, pruneOldLogs } = await import('file://' + logPath);
208
+ setLogLevel(level);
209
+ setInvocationId(invocationId);
210
+ // One-shot prune of old JSONL files on startup. Bounded work; safe to
211
+ // call on every invocation because the work is a single directory list.
212
+ pruneOldLogs();
213
+ }
214
+ } catch {
215
+ // If the logger isn't importable yet (fresh clone without dist/), the
216
+ // regular router-resolution error below surfaces it.
217
+ }
218
+ return level;
219
+ }
220
+
221
+ async function main() {
222
+ const args = process.argv.slice(2);
223
+
224
+ // Channel-switching commands — handled before anything else so they work
225
+ // even when the router can't load (e.g. fixing a broken dev-mode pointer).
226
+ if (args[0] === '--use-main' || args[0] === '--use-edge') {
227
+ const { switchToEdge } = await import('../dist/src/channel/manager.mjs');
228
+ await switchToEdge();
229
+ return;
230
+ }
231
+ if (args[0] === '--use-dev') {
232
+ const { switchToDev } = await import('../dist/src/channel/manager.mjs');
233
+ const devPath = args[1] || process.cwd();
234
+ await switchToDev(devPath);
235
+ return;
236
+ }
237
+ if (args[0] === '--use-stable' || args[0] === '--use-npm') {
238
+ const { switchToStable } = await import('../dist/src/channel/manager.mjs');
239
+ await switchToStable();
240
+ return;
241
+ }
242
+
243
+ // Wire up the logger level from -v/-vv/--quiet/AIWG_LOG_LEVEL before any
244
+ // handler runs, and stamp the top-level invocation ID so the logger can
245
+ // tag every record with it.
246
+ await applyVerbosityFromArgs(args);
247
+
248
+ // Update notifier: print any pending notice from the previous run's
249
+ // background check, then schedule the next background check. Both are
250
+ // non-blocking — the current command never waits on the network.
251
+ // Honors NO_UPDATE_NOTIFIER, CI=*, and non-TTY stderr.
252
+ const { scheduleBackgroundCheck, maybePrintNotice } = await import('../dist/src/update/notifier.mjs');
253
+ maybePrintNotice();
254
+ scheduleBackgroundCheck(packageRoot);
255
+
256
+ // Top-level cancellation controller. SIGINT / SIGTERM flip it, long-running
257
+ // handlers plumb ctx.signal through fetches and loops so Ctrl-C cancels
258
+ // in-flight work cleanly instead of leaving orphaned sockets and children.
259
+ // Exit codes 130 (SIGINT = 128+2) and 143 (SIGTERM = 128+15) follow shell
260
+ // convention so scripts can branch on the signal kind.
261
+ const abortController = new AbortController();
262
+ const onSigint = () => {
263
+ abortController.abort('sigint');
264
+ // Safety deadline: if a handler does not honor the signal, force exit
265
+ // after 3s. .unref() so a well-behaved handler can still finish first.
266
+ const deadline = setTimeout(() => process.exit(130), 3_000);
267
+ deadline.unref?.();
268
+ };
269
+ const onSigterm = () => {
270
+ abortController.abort('sigterm');
271
+ const deadline = setTimeout(() => process.exit(143), 3_000);
272
+ deadline.unref?.();
273
+ };
274
+ process.once('SIGINT', onSigint);
275
+ process.once('SIGTERM', onSigterm);
276
+
277
+ // Direct in-process dispatch — no tsx fork, no facade, no router-loader.
278
+ trace('resolve:router');
279
+ const routerPath = await resolveRouterPath();
280
+ trace('import:router');
281
+ const { run } = await import('file://' + routerPath);
282
+ trace('dispatch:begin');
283
+ try {
284
+ await run(args, { cwd: process.cwd(), signal: abortController.signal });
285
+ } finally {
286
+ trace('dispatch:end');
287
+ process.removeListener('SIGINT', onSigint);
288
+ process.removeListener('SIGTERM', onSigterm);
289
+ }
290
+ }
291
+
292
+ // Give the background update check a brief grace window before forcing exit.
293
+ // Without an explicit process.exit(), unawaited promises (HTTPS keepalive
294
+ // sockets, libuv worker handles, buffered readline from the update prompt)
295
+ // can keep the event loop alive for minutes on slow networks or detached
296
+ // terminals — the "30s command that hangs for 5 minutes" symptom we debugged
297
+ // in #924. 1500ms is plenty for a normal npm registry check; if the check
298
+ // is slower the user still gets their shell back promptly and the check
299
+ // runs again on the next invocation.
300
+ // Lazy-loaded structured error formatter. Imported on demand so a failing
301
+ // top-level catch doesn't itself throw by trying to load a missing dist/.
302
+ async function formatAndExit(error, fallbackCode = 1) {
303
+ // Show stack trace when the user has opted in to verbose diagnostics.
304
+ const verbose =
305
+ process.env.AIWG_DEBUG === '1' ||
306
+ process.env.AIWG_DEBUG?.toLowerCase() === 'true' ||
307
+ process.env.DEBUG === '1' ||
308
+ process.argv.includes('--verbose') ||
309
+ process.argv.includes('-vv') ||
310
+ process.argv.includes('-vvv');
311
+
312
+ let exitCode = fallbackCode;
313
+ try {
314
+ const errorsMod = await import(
315
+ 'file://' + path.join(packageRoot, 'dist', 'src', 'cli', 'errors.js')
316
+ );
317
+ const { formatError, exitCodeFor } = errorsMod;
318
+ const formatted = formatError(error, { verbose });
319
+ // Strip ANSI colors when stderr isn't a TTY so piped output stays clean.
320
+ process.stderr.write(formatted + '\n');
321
+ exitCode = exitCodeFor(error);
322
+ } catch {
323
+ // Fallback path: dist/ missing or errors.js failed to load. Print a
324
+ // minimal message so we never silently exit.
325
+ const msg = error instanceof Error ? error.message : String(error);
326
+ process.stderr.write(`aiwg: error: ${msg}\n`);
327
+ if (verbose && error instanceof Error && error.stack) {
328
+ process.stderr.write(error.stack + '\n');
329
+ }
330
+ }
331
+ process.exit(exitCode);
332
+ }
333
+
334
+ // Install process-level handlers for unhandled failures so the same
335
+ // structured formatter renders them instead of Node's default crash dump.
336
+ process.on('uncaughtException', (err) => {
337
+ formatAndExit(err, 1).catch(() => process.exit(1));
338
+ });
339
+ process.on('unhandledRejection', (reason) => {
340
+ formatAndExit(reason, 1).catch(() => process.exit(1));
341
+ });
342
+
343
+ // With the update notifier now running as a detached unref()'d child (#920),
344
+ // main() has no background promise to grace-wait on — the router finishes,
345
+ // we exit. The background child writes its cache file and exits on its own
346
+ // schedule.
347
+ main()
348
+ .then(() => process.exit(0))
349
+ .catch((error) => formatAndExit(error, 1));
@@ -0,0 +1,145 @@
1
+ // AgentCard fetch + signature verification with a TTL cache.
2
+ // Closes the runtime side of #1253; the JCS / JWS / verify primitives are in
3
+ // `src/a2a/{jcs,jws}.ts`.
4
+ //
5
+ // Per A2A §8, agents publish their card at
6
+ // /agents/{instanceId}/.well-known/agent-card.json
7
+ // Sandbox v2 also exposes the authenticated extended card at
8
+ // /agents/{instanceId}/v1/extendedAgentCard
9
+ // with a legacy fallback at
10
+ // /agents/{instanceId}/v1/card.
11
+ // The card declares required + optional extensions, supported transports,
12
+ // and skills.
13
+ import { loadJwkSet, verifyAgentCardSignature } from './jws.js';
14
+ const DEFAULT_TTL_MS = 5 * 60 * 1000;
15
+ export class AgentCardCache {
16
+ ttlMs;
17
+ entries = new Map();
18
+ constructor(ttlMs = DEFAULT_TTL_MS) {
19
+ this.ttlMs = ttlMs;
20
+ }
21
+ get(key) {
22
+ const entry = this.entries.get(key);
23
+ if (!entry)
24
+ return undefined;
25
+ if (Date.now() >= entry.expiresAt) {
26
+ this.entries.delete(key);
27
+ return undefined;
28
+ }
29
+ return entry.verified;
30
+ }
31
+ set(key, verified) {
32
+ this.entries.set(key, { verified, expiresAt: Date.now() + this.ttlMs });
33
+ }
34
+ /** Invalidate a single instance (call this on `instance state change` events). */
35
+ invalidate(key) {
36
+ this.entries.delete(key);
37
+ }
38
+ clear() {
39
+ this.entries.clear();
40
+ }
41
+ size() {
42
+ return this.entries.size;
43
+ }
44
+ }
45
+ /**
46
+ * Fetch + verify an AgentCard. Bypasses any cache the caller may have.
47
+ * Throws on fetch failure or signature mismatch.
48
+ */
49
+ export async function fetchAgentCard(host, instanceId, opts = {}) {
50
+ const fetchImpl = opts.fetch ?? fetch;
51
+ const base = host.replace(/\/+$/, '');
52
+ const encoded = encodeURIComponent(instanceId);
53
+ const urls = [
54
+ `${base}/agents/${encoded}/.well-known/agent-card.json`,
55
+ `${base}/agents/${encoded}/v1/extendedAgentCard`,
56
+ `${base}/agents/${encoded}/v1/card`,
57
+ ];
58
+ const headers = { accept: 'application/json' };
59
+ if (opts.bearer)
60
+ headers.authorization = `Bearer ${opts.bearer}`;
61
+ const init = { method: 'GET', headers };
62
+ if (opts.signal)
63
+ init.signal = opts.signal;
64
+ let url = urls[0];
65
+ let resp;
66
+ for (const candidate of urls) {
67
+ const candidateResp = await fetchImpl(candidate, init);
68
+ if (candidateResp.status === 404 && candidate !== urls[urls.length - 1]) {
69
+ continue;
70
+ }
71
+ url = candidate;
72
+ resp = candidateResp;
73
+ break;
74
+ }
75
+ if (!resp || resp.status !== 200) {
76
+ throw new Error(`fetchAgentCard: ${url} returned ${resp?.status ?? 'no response'}`);
77
+ }
78
+ const raw = await resp.text();
79
+ let card;
80
+ try {
81
+ card = JSON.parse(raw);
82
+ }
83
+ catch (err) {
84
+ throw new Error(`fetchAgentCard: invalid JSON from ${url}: ${err.message}`);
85
+ }
86
+ if (opts.skipVerify) {
87
+ return { card, raw, verifiedAt: new Date().toISOString() };
88
+ }
89
+ let jwks = opts.jwks;
90
+ if (!jwks) {
91
+ if (!opts.jwksSource) {
92
+ throw new Error('fetchAgentCard: provide `jwks` or `jwksSource` for verification');
93
+ }
94
+ jwks = await loadJwks(opts.jwksSource, fetchImpl, opts.signal);
95
+ }
96
+ // Pull the kid before verifying (verify throws on mismatch).
97
+ const kid = card.signatures?.[0]?.header?.['kid'] ?? undefined;
98
+ verifyAgentCardSignature(raw, jwks);
99
+ const verified = {
100
+ card,
101
+ raw,
102
+ verifiedAt: new Date().toISOString(),
103
+ };
104
+ if (kid !== undefined)
105
+ verified.kid = kid;
106
+ return verified;
107
+ }
108
+ /**
109
+ * Cache-aware variant: returns the cached entry when fresh, otherwise
110
+ * fetches and stores. Cache key is `${host}|${instanceId}`.
111
+ */
112
+ export async function fetchAgentCardCached(cache, host, instanceId, opts = {}) {
113
+ const key = `${host}|${instanceId}`;
114
+ const cached = cache.get(key);
115
+ if (cached)
116
+ return cached;
117
+ const verified = await fetchAgentCard(host, instanceId, opts);
118
+ cache.set(key, verified);
119
+ return verified;
120
+ }
121
+ async function loadJwks(source, fetchImpl, signal) {
122
+ if (/^https?:\/\//i.test(source)) {
123
+ const init = { method: 'GET' };
124
+ if (signal)
125
+ init.signal = signal;
126
+ const resp = await fetchImpl(source, init);
127
+ if (resp.status !== 200)
128
+ throw new Error(`loadJwks: ${source} returned ${resp.status}`);
129
+ return loadJwkSet(await resp.text());
130
+ }
131
+ const { readFile } = await import('node:fs/promises');
132
+ const text = await readFile(source, 'utf8');
133
+ return loadJwkSet(text);
134
+ }
135
+ /**
136
+ * Extract the required-set extension URIs from an AgentCard.
137
+ * Used by A2AClient to know which `A2A-Extensions: <URI>` values to inject
138
+ * on every mutating call (#1254).
139
+ */
140
+ export function requiredExtensionUris(card) {
141
+ return (card.capabilities?.extensions ?? [])
142
+ .filter((e) => e.required === true)
143
+ .map((e) => e.uri);
144
+ }
145
+ //# sourceMappingURL=agent-card.js.map