@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Joe Magly
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,24 @@
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
8
+
9
+ aiwg discover "architecture evolution"
10
+ aiwg show skill architecture-evolution
11
+ ```
12
+
13
+ ## Release status
14
+
15
+ This package follows AIWG CalVer in exact lockstep with the `aiwg` package.
16
+ It selects the signed `stable` web channel automatically when no resource
17
+ flags are supplied. Operators can still select an exact version or another
18
+ channel with `--aiwg-version`, force local resources with
19
+ `--resource-source local`, use verified caching, and perform warm offline
20
+ reads. The larger `aiwg` package remains the local/full distribution while
21
+ web parity is completed for mutating commands such as `use` and `regenerate`.
22
+
23
+ Resource bundles and precomputed indices are distributed by the release host,
24
+ 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