@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -1
  3. package/bin/aiwg.mjs +349 -0
  4. package/dist/src/a2a/agent-card.js +145 -0
  5. package/dist/src/a2a/client.js +411 -0
  6. package/dist/src/a2a/hitl-cli.js +171 -0
  7. package/dist/src/a2a/hitl-driver.js +370 -0
  8. package/dist/src/a2a/hitl.js +181 -0
  9. package/dist/src/a2a/http.js +193 -0
  10. package/dist/src/a2a/jcs.js +128 -0
  11. package/dist/src/a2a/jws.js +187 -0
  12. package/dist/src/a2a/types.js +24 -0
  13. package/dist/src/a2a/webhook.js +240 -0
  14. package/dist/src/activity-log/cli.js +348 -0
  15. package/dist/src/activity-log/parser.js +81 -0
  16. package/dist/src/activity-log/types.js +50 -0
  17. package/dist/src/agents/agent-deployer.js +367 -0
  18. package/dist/src/agents/agent-packager.js +271 -0
  19. package/dist/src/agents/agent-validator.js +271 -0
  20. package/dist/src/agents/grounding/knowledge-base.js +161 -0
  21. package/dist/src/agents/grounding/types.js +12 -0
  22. package/dist/src/agents/index.js +10 -0
  23. package/dist/src/agents/packaged-agent-inventory.js +75 -0
  24. package/dist/src/agents/types.js +7 -0
  25. package/dist/src/api/index.d.ts +10 -0
  26. package/dist/src/api/index.js +10 -0
  27. package/dist/src/artifacts/address-parser.js +73 -0
  28. package/dist/src/artifacts/audit/cli.js +183 -0
  29. package/dist/src/artifacts/audit/drift.js +122 -0
  30. package/dist/src/artifacts/audit/types.js +12 -0
  31. package/dist/src/artifacts/backends/graphology-backend.js +160 -0
  32. package/dist/src/artifacts/backends/json-backend.js +129 -0
  33. package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
  34. package/dist/src/artifacts/browser-export.js +622 -0
  35. package/dist/src/artifacts/capability-resolver.js +94 -0
  36. package/dist/src/artifacts/checksum-manifest.js +91 -0
  37. package/dist/src/artifacts/citation-parser.js +162 -0
  38. package/dist/src/artifacts/cli.js +1486 -0
  39. package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
  40. package/dist/src/artifacts/corpus-tools/cli.js +393 -0
  41. package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
  42. package/dist/src/artifacts/corpus-tools/curator.js +186 -0
  43. package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
  44. package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
  45. package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
  46. package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
  47. package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
  48. package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
  49. package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
  50. package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
  51. package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
  52. package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
  53. package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
  54. package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
  55. package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
  56. package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
  57. package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
  58. package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
  59. package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
  60. package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
  61. package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
  62. package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
  63. package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
  64. package/dist/src/artifacts/corpus-views/build.js +126 -0
  65. package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
  66. package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
  67. package/dist/src/artifacts/corpus-views/renderers.js +353 -0
  68. package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
  69. package/dist/src/artifacts/dep-graph.js +173 -0
  70. package/dist/src/artifacts/discover-facets.js +375 -0
  71. package/dist/src/artifacts/embedding-index.js +354 -0
  72. package/dist/src/artifacts/enrichment/cli.js +240 -0
  73. package/dist/src/artifacts/enrichment/prompt.js +47 -0
  74. package/dist/src/artifacts/enrichment/store.js +90 -0
  75. package/dist/src/artifacts/enrichment/types.js +12 -0
  76. package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
  77. package/dist/src/artifacts/fortemi-core-sync.js +251 -0
  78. package/dist/src/artifacts/fortemi-shard-export.js +44 -0
  79. package/dist/src/artifacts/fulltext.js +108 -0
  80. package/dist/src/artifacts/graph-backend.js +51 -0
  81. package/dist/src/artifacts/graph-query.js +247 -0
  82. package/dist/src/artifacts/hybrid-query.js +225 -0
  83. package/dist/src/artifacts/index-builder.js +1089 -0
  84. package/dist/src/artifacts/index-reader.js +112 -0
  85. package/dist/src/artifacts/index-status.js +193 -0
  86. package/dist/src/artifacts/legacy-index-migration.js +169 -0
  87. package/dist/src/artifacts/move.js +154 -0
  88. package/dist/src/artifacts/operational-state.js +239 -0
  89. package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
  90. package/dist/src/artifacts/query-engine.js +1955 -0
  91. package/dist/src/artifacts/source-graph.js +529 -0
  92. package/dist/src/artifacts/stats.js +169 -0
  93. package/dist/src/artifacts/types.js +606 -0
  94. package/dist/src/artifacts/views/cli.js +293 -0
  95. package/dist/src/artifacts/views/definition.js +170 -0
  96. package/dist/src/artifacts/views/store.js +149 -0
  97. package/dist/src/artifacts/views/types.js +8 -0
  98. package/dist/src/artifacts/watcher.js +255 -0
  99. package/dist/src/catalog/builtin-models.json +636 -0
  100. package/dist/src/catalog/cli.js +228 -0
  101. package/dist/src/catalog/cli.mjs +289 -0
  102. package/dist/src/catalog/index.js +15 -0
  103. package/dist/src/catalog/loader.js +217 -0
  104. package/dist/src/catalog/loader.mjs +251 -0
  105. package/dist/src/catalog/sources.json +41 -0
  106. package/dist/src/catalog/types.js +8 -0
  107. package/dist/src/channel/manager.mjs +504 -0
  108. package/dist/src/cli/agent-spawn.js +178 -0
  109. package/dist/src/cli/cli-extension-loader.js +245 -0
  110. package/dist/src/cli/command-log.js +275 -0
  111. package/dist/src/cli/config-loader.js +232 -0
  112. package/dist/src/cli/env.js +82 -0
  113. package/dist/src/cli/errors.js +150 -0
  114. package/dist/src/cli/find-package-root.js +40 -0
  115. package/dist/src/cli/git-hooks.js +250 -0
  116. package/dist/src/cli/handlers/agentcard.js +206 -0
  117. package/dist/src/cli/handlers/artifacts.js +76 -0
  118. package/dist/src/cli/handlers/best-practices-audit.js +280 -0
  119. package/dist/src/cli/handlers/cockpit.js +137 -0
  120. package/dist/src/cli/handlers/command-log.js +37 -0
  121. package/dist/src/cli/handlers/daemon.js +59 -0
  122. package/dist/src/cli/handlers/diagnose.js +300 -0
  123. package/dist/src/cli/handlers/execution-mode.js +105 -0
  124. package/dist/src/cli/handlers/feedback.js +341 -0
  125. package/dist/src/cli/handlers/help.js +147 -0
  126. package/dist/src/cli/handlers/index.js +302 -0
  127. package/dist/src/cli/handlers/init.js +179 -0
  128. package/dist/src/cli/handlers/install.js +129 -0
  129. package/dist/src/cli/handlers/issues.js +46 -0
  130. package/dist/src/cli/handlers/lint.js +42 -0
  131. package/dist/src/cli/handlers/local-executor.js +315 -0
  132. package/dist/src/cli/handlers/marketplace.js +168 -0
  133. package/dist/src/cli/handlers/mc.js +1010 -0
  134. package/dist/src/cli/handlers/models.js +352 -0
  135. package/dist/src/cli/handlers/packages.js +155 -0
  136. package/dist/src/cli/handlers/ralph-launcher.js +717 -0
  137. package/dist/src/cli/handlers/ralph.js +575 -0
  138. package/dist/src/cli/handlers/refresh.js +432 -0
  139. package/dist/src/cli/handlers/regenerate.js +336 -0
  140. package/dist/src/cli/handlers/repo-access.js +109 -0
  141. package/dist/src/cli/handlers/run.js +165 -0
  142. package/dist/src/cli/handlers/runtime-info.js +301 -0
  143. package/dist/src/cli/handlers/sandbox.js +197 -0
  144. package/dist/src/cli/handlers/scaffolding.js +149 -0
  145. package/dist/src/cli/handlers/script-runner.js +121 -0
  146. package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
  147. package/dist/src/cli/handlers/serve.js +1835 -0
  148. package/dist/src/cli/handlers/session.js +348 -0
  149. package/dist/src/cli/handlers/setup.js +440 -0
  150. package/dist/src/cli/handlers/skill-lint.js +367 -0
  151. package/dist/src/cli/handlers/skill-usage.js +74 -0
  152. package/dist/src/cli/handlers/steward.js +567 -0
  153. package/dist/src/cli/handlers/subcommands.js +1702 -0
  154. package/dist/src/cli/handlers/team.js +337 -0
  155. package/dist/src/cli/handlers/types.js +11 -0
  156. package/dist/src/cli/handlers/use.js +2772 -0
  157. package/dist/src/cli/handlers/utilities.js +703 -0
  158. package/dist/src/cli/handlers/version.js +134 -0
  159. package/dist/src/cli/handlers/workspace-context.js +93 -0
  160. package/dist/src/cli/handlers/workspace.js +126 -0
  161. package/dist/src/cli/help-generator.js +178 -0
  162. package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
  163. package/dist/src/cli/hooks/executor.js +96 -0
  164. package/dist/src/cli/hooks/index.js +15 -0
  165. package/dist/src/cli/hooks/registry.js +143 -0
  166. package/dist/src/cli/hooks/types.js +13 -0
  167. package/dist/src/cli/log.js +492 -0
  168. package/dist/src/cli/project-isolation/detect.js +70 -0
  169. package/dist/src/cli/project-isolation/index.js +7 -0
  170. package/dist/src/cli/project-isolation/signals.js +17 -0
  171. package/dist/src/cli/project-isolation/warning.js +102 -0
  172. package/dist/src/cli/prompt-utils.js +155 -0
  173. package/dist/src/cli/provider-deployment-plan.js +126 -0
  174. package/dist/src/cli/provider-resolution.js +119 -0
  175. package/dist/src/cli/router.js +305 -0
  176. package/dist/src/cli/scope-resolver.js +392 -0
  177. package/dist/src/cli/skill-usage.js +616 -0
  178. package/dist/src/cli/ui.js +224 -0
  179. package/dist/src/cli/watch-service.js +203 -0
  180. package/dist/src/cli/workflow-orchestrator.js +478 -0
  181. package/dist/src/cli/workspace-signals.js +321 -0
  182. package/dist/src/community/footer.js +14 -0
  183. package/dist/src/community/links.js +123 -0
  184. package/dist/src/community/milestones.js +46 -0
  185. package/dist/src/community/nudge-policy.js +93 -0
  186. package/dist/src/config/aiwg-config.js +883 -0
  187. package/dist/src/config/cli.js +703 -0
  188. package/dist/src/config/gitignore.js +156 -0
  189. package/dist/src/config/project-artifacts.js +76 -0
  190. package/dist/src/config/user-config.js +428 -0
  191. package/dist/src/config/user-registry.js +127 -0
  192. package/dist/src/config/workspace.js +276 -0
  193. package/dist/src/contributors/detect.js +39 -0
  194. package/dist/src/contributors/discover.js +172 -0
  195. package/dist/src/contributors/heuristic.js +186 -0
  196. package/dist/src/contributors/index.js +11 -0
  197. package/dist/src/contributors/types.js +13 -0
  198. package/dist/src/contributors/validation.js +116 -0
  199. package/dist/src/data/community.schema.json +43 -0
  200. package/dist/src/data/community.yaml +16 -0
  201. package/dist/src/extensions/capability-index.js +270 -0
  202. package/dist/src/extensions/claude-hooks-installer.js +268 -0
  203. package/dist/src/extensions/commands/definitions.js +3485 -0
  204. package/dist/src/extensions/deployment-registration.js +463 -0
  205. package/dist/src/extensions/index.js +22 -0
  206. package/dist/src/extensions/loader.js +132 -0
  207. package/dist/src/extensions/managed-marker.js +100 -0
  208. package/dist/src/extensions/manifest.js +196 -0
  209. package/dist/src/extensions/project-local-activity.js +114 -0
  210. package/dist/src/extensions/project-local-discovery.js +261 -0
  211. package/dist/src/extensions/project-local-doctor.js +281 -0
  212. package/dist/src/extensions/project-local-gitignore.js +176 -0
  213. package/dist/src/extensions/project-local-paths.js +121 -0
  214. package/dist/src/extensions/project-local-promote.js +218 -0
  215. package/dist/src/extensions/project-local-remove.js +373 -0
  216. package/dist/src/extensions/project-local-scaffold.js +252 -0
  217. package/dist/src/extensions/project-quickref.js +291 -0
  218. package/dist/src/extensions/registry.js +368 -0
  219. package/dist/src/extensions/shadow-resolver.js +271 -0
  220. package/dist/src/extensions/types.js +86 -0
  221. package/dist/src/extensions/upstream-registry.js +195 -0
  222. package/dist/src/extensions/validation.js +631 -0
  223. package/dist/src/features/catalog.js +88 -0
  224. package/dist/src/features/cli.js +197 -0
  225. package/dist/src/features/installer.js +57 -0
  226. package/dist/src/features/paths.js +14 -0
  227. package/dist/src/features/runtime.js +21 -0
  228. package/dist/src/features/status.js +134 -0
  229. package/dist/src/hooks/laziness-detection.js +532 -0
  230. package/dist/src/intake/git-history-analyzer.js +486 -0
  231. package/dist/src/intake/index.js +9 -0
  232. package/dist/src/issues/cli.js +327 -0
  233. package/dist/src/issues/index.js +5 -0
  234. package/dist/src/issues/live.js +154 -0
  235. package/dist/src/issues/local.js +666 -0
  236. package/dist/src/issues/sync.js +143 -0
  237. package/dist/src/issues/types.js +2 -0
  238. package/dist/src/issues/workflows.js +164 -0
  239. package/dist/src/kb/cli.js +173 -0
  240. package/dist/src/lint/cli.js +171 -0
  241. package/dist/src/lint/loader.js +225 -0
  242. package/dist/src/lint/reporters.js +141 -0
  243. package/dist/src/lint/runner.js +364 -0
  244. package/dist/src/lint/types.js +10 -0
  245. package/dist/src/marketplace/cache.js +110 -0
  246. package/dist/src/marketplace/identifier.js +63 -0
  247. package/dist/src/marketplace/registry.js +36 -0
  248. package/dist/src/marketplace/sources/clawhub.js +53 -0
  249. package/dist/src/marketplace/sources/git.js +45 -0
  250. package/dist/src/marketplace/types.js +9 -0
  251. package/dist/src/mcp/adapters/codex-runtime.js +224 -0
  252. package/dist/src/mcp/cli.mjs +1197 -0
  253. package/dist/src/mcp/elicitation.mjs +149 -0
  254. package/dist/src/mcp/helpers.mjs +287 -0
  255. package/dist/src/mcp/index.mjs +11 -0
  256. package/dist/src/mcp/profiles.js +263 -0
  257. package/dist/src/mcp/profiles.mjs +360 -0
  258. package/dist/src/mcp/registry.js +376 -0
  259. package/dist/src/mcp/registry.mjs +387 -0
  260. package/dist/src/mcp/server.mjs +633 -0
  261. package/dist/src/mcp/test-simple.mjs +271 -0
  262. package/dist/src/mcp/tools/command-run.mjs +101 -0
  263. package/dist/src/mcp/tools/discovery.mjs +291 -0
  264. package/dist/src/mcp/tools/interaction.mjs +87 -0
  265. package/dist/src/mcp/tools/orchestration.mjs +320 -0
  266. package/dist/src/mcp/tools/subsystems.mjs +640 -0
  267. package/dist/src/memory/cli.js +166 -0
  268. package/dist/src/memory/project-registry.js +282 -0
  269. package/dist/src/metrics/artifact-metrics.js +184 -0
  270. package/dist/src/metrics/context-budget.js +174 -0
  271. package/dist/src/metrics/token-counter.js +133 -0
  272. package/dist/src/models/config-loader.js +228 -0
  273. package/dist/src/models/index.js +22 -0
  274. package/dist/src/models/model-capabilities.v1.json +120 -0
  275. package/dist/src/models/model-catalog.v1.json +96 -0
  276. package/dist/src/models/model-discovery.js +521 -0
  277. package/dist/src/models/provider-models.js +73 -0
  278. package/dist/src/models/provider-policy.js +273 -0
  279. package/dist/src/models/resolver.js +245 -0
  280. package/dist/src/models/router.js +70 -0
  281. package/dist/src/models/types.js +8 -0
  282. package/dist/src/models/wrapper-deployment.js +178 -0
  283. package/dist/src/models/wrapper-route.js +54 -0
  284. package/dist/src/ops/cli.js +268 -0
  285. package/dist/src/ops/registry.js +623 -0
  286. package/dist/src/packages/adapters/clawhub.js +113 -0
  287. package/dist/src/packages/adapters/git.js +153 -0
  288. package/dist/src/packages/adapters/gitea.js +93 -0
  289. package/dist/src/packages/adapters/github.js +69 -0
  290. package/dist/src/packages/adapters/local-cache.js +89 -0
  291. package/dist/src/packages/package-registry.js +143 -0
  292. package/dist/src/packages/registry.js +238 -0
  293. package/dist/src/packages/types.js +11 -0
  294. package/dist/src/plugin/cross-framework-ops.js +475 -0
  295. package/dist/src/plugin/framework-config-loader.js +235 -0
  296. package/dist/src/plugin/framework-detector.js +186 -0
  297. package/dist/src/plugin/framework-isolator.js +341 -0
  298. package/dist/src/plugin/framework-migration.js +371 -0
  299. package/dist/src/plugin/metadata-validator.js +906 -0
  300. package/dist/src/plugin/plugin-installer.js +436 -0
  301. package/dist/src/plugin/plugin-status.js +369 -0
  302. package/dist/src/plugin/plugin-uninstaller.js +473 -0
  303. package/dist/src/plugin/registry-validator.js +344 -0
  304. package/dist/src/plugin/skill-command-translator.js +415 -0
  305. package/dist/src/plugin/workspace-creator.js +189 -0
  306. package/dist/src/plugin/workspace-migrator.js +821 -0
  307. package/dist/src/policy/authorization.js +390 -0
  308. package/dist/src/policy/repo-access.js +215 -0
  309. package/dist/src/provenance/cli.js +16 -0
  310. package/dist/src/providers/capability-matrix.js +300 -0
  311. package/dist/src/providers/capability-matrix.yaml +514 -0
  312. package/dist/src/providers/provider-definitions.js +977 -0
  313. package/dist/src/providers/provider-definitions.mjs +159 -0
  314. package/dist/src/providers/provider-inventory.js +169 -0
  315. package/dist/src/quality/feedback-ab.js +174 -0
  316. package/dist/src/quality/feedback-collector.js +176 -0
  317. package/dist/src/quality/feedback-tracker.js +123 -0
  318. package/dist/src/quality/patterns/adr.json +24 -0
  319. package/dist/src/quality/patterns/sad.json +24 -0
  320. package/dist/src/quality/patterns/test-plan.json +24 -0
  321. package/dist/src/quality/patterns/use-case.json +24 -0
  322. package/dist/src/quality/scoring.js +157 -0
  323. package/dist/src/reflections/cli.js +15 -0
  324. package/dist/src/release/plan.js +139 -0
  325. package/dist/src/research/cache/manager.js +227 -0
  326. package/dist/src/research/clients/arxiv.js +156 -0
  327. package/dist/src/research/clients/base.js +197 -0
  328. package/dist/src/research/clients/crossref.js +112 -0
  329. package/dist/src/research/clients/semantic-scholar.js +126 -0
  330. package/dist/src/research/clients/unpaywall.js +87 -0
  331. package/dist/src/research/index.js +14 -0
  332. package/dist/src/research/query-cli.js +336 -0
  333. package/dist/src/research/services/acquisition.js +313 -0
  334. package/dist/src/research/services/archival.js +225 -0
  335. package/dist/src/research/services/citation.js +279 -0
  336. package/dist/src/research/services/discovery.js +243 -0
  337. package/dist/src/research/services/documentation.js +269 -0
  338. package/dist/src/research/services/index.js +14 -0
  339. package/dist/src/research/services/provenance.js +279 -0
  340. package/dist/src/research/services/quality.js +370 -0
  341. package/dist/src/research/services/types.js +7 -0
  342. package/dist/src/research/storage-cli.js +20 -0
  343. package/dist/src/research/types.js +47 -0
  344. package/dist/src/resources/index.d.ts +2 -0
  345. package/dist/src/resources/index.js +2 -0
  346. package/dist/src/resources/web-release.d.ts +89 -0
  347. package/dist/src/resources/web-release.js +886 -0
  348. package/dist/src/rlm/cache/cli.js +162 -0
  349. package/dist/src/rlm/cache/hash.js +35 -0
  350. package/dist/src/rlm/cache/store.js +170 -0
  351. package/dist/src/rlm/cache/types.js +8 -0
  352. package/dist/src/rlm/cli.js +650 -0
  353. package/dist/src/serve/a2a-terminal-observer.js +120 -0
  354. package/dist/src/serve/agent-router.js +205 -0
  355. package/dist/src/serve/dispatch-router.js +171 -0
  356. package/dist/src/serve/executor-registry.js +715 -0
  357. package/dist/src/serve/mission-conductor.js +177 -0
  358. package/dist/src/serve/orchestrator-adapter.js +113 -0
  359. package/dist/src/serve/orchestrator-override.js +94 -0
  360. package/dist/src/serve/orchestrator-pty.js +133 -0
  361. package/dist/src/serve/pty-bridge.js +799 -0
  362. package/dist/src/serve/sandbox-registry.js +832 -0
  363. package/dist/src/serve/screen-reader.js +228 -0
  364. package/dist/src/serve/stack-adapters.js +68 -0
  365. package/dist/src/serve/telemetry.js +143 -0
  366. package/dist/src/skills/adapters/clawhub.js +250 -0
  367. package/dist/src/skills/adapters/local.js +335 -0
  368. package/dist/src/skills/adapters/openclaw.js +316 -0
  369. package/dist/src/skills/cli.js +334 -0
  370. package/dist/src/skills/registry.js +117 -0
  371. package/dist/src/skills/run.js +259 -0
  372. package/dist/src/skills/runtime.js +94 -0
  373. package/dist/src/skills/types.js +10 -0
  374. package/dist/src/smiths/agentsmith/demo.js +116 -0
  375. package/dist/src/smiths/agentsmith/examples.js +300 -0
  376. package/dist/src/smiths/agentsmith/generator.js +503 -0
  377. package/dist/src/smiths/agentsmith/index.js +11 -0
  378. package/dist/src/smiths/agentsmith/types.js +8 -0
  379. package/dist/src/smiths/commandsmith/example.js +220 -0
  380. package/dist/src/smiths/commandsmith/generator.js +288 -0
  381. package/dist/src/smiths/commandsmith/index.js +41 -0
  382. package/dist/src/smiths/commandsmith/templates.js +296 -0
  383. package/dist/src/smiths/commandsmith/types.js +7 -0
  384. package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
  385. package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
  386. package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
  387. package/dist/src/smiths/context-pipeline/discovery.js +187 -0
  388. package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
  389. package/dist/src/smiths/context-pipeline/finalization.js +147 -0
  390. package/dist/src/smiths/context-pipeline/generator.js +477 -0
  391. package/dist/src/smiths/context-pipeline/index.js +30 -0
  392. package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
  393. package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
  394. package/dist/src/smiths/context-pipeline/overflow.js +212 -0
  395. package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
  396. package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
  397. package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
  398. package/dist/src/smiths/context-pipeline/types.js +23 -0
  399. package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
  400. package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
  401. package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
  402. package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
  403. package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
  404. package/dist/src/smiths/hook-bridge/index.js +79 -0
  405. package/dist/src/smiths/hook-bridge/loader.js +116 -0
  406. package/dist/src/smiths/hook-bridge/shim.js +89 -0
  407. package/dist/src/smiths/hook-bridge/types.js +31 -0
  408. package/dist/src/smiths/index.js +39 -0
  409. package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
  410. package/dist/src/smiths/mcpsmith/example.js +119 -0
  411. package/dist/src/smiths/mcpsmith/generator.js +236 -0
  412. package/dist/src/smiths/mcpsmith/index.js +17 -0
  413. package/dist/src/smiths/mcpsmith/types.js +10 -0
  414. package/dist/src/smiths/platform-paths.js +101 -0
  415. package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
  416. package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
  417. package/dist/src/smiths/skillsmith/demo.js +83 -0
  418. package/dist/src/smiths/skillsmith/examples.js +161 -0
  419. package/dist/src/smiths/skillsmith/generator.js +316 -0
  420. package/dist/src/smiths/skillsmith/index.js +12 -0
  421. package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
  422. package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
  423. package/dist/src/smiths/skillsmith/types.js +9 -0
  424. package/dist/src/smiths/toolsmith/index.js +10 -0
  425. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
  426. package/dist/src/smiths/toolsmith/types.js +8 -0
  427. package/dist/src/storage/backends/fortemi.js +227 -0
  428. package/dist/src/storage/backends/fs.js +134 -0
  429. package/dist/src/storage/backends/logseq.js +309 -0
  430. package/dist/src/storage/backends/obsidian.js +233 -0
  431. package/dist/src/storage/cli.js +468 -0
  432. package/dist/src/storage/config.js +272 -0
  433. package/dist/src/storage/index.js +108 -0
  434. package/dist/src/storage/subsystem-cli.js +201 -0
  435. package/dist/src/storage/types.js +33 -0
  436. package/dist/src/testing/corpus/corpus-builder.js +383 -0
  437. package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
  438. package/dist/src/testing/corpus/index.js +10 -0
  439. package/dist/src/testing/fixtures/index.js +9 -0
  440. package/dist/src/testing/fixtures/test-data-factory.js +472 -0
  441. package/dist/src/testing/generators/index.js +11 -0
  442. package/dist/src/testing/generators/test-case-generator.js +393 -0
  443. package/dist/src/testing/generators/test-code-generator.js +384 -0
  444. package/dist/src/testing/generators/use-case-parser.js +325 -0
  445. package/dist/src/testing/index.js +11 -0
  446. package/dist/src/tracker/capability-protocol.js +118 -0
  447. package/dist/src/update/checker.mjs +396 -0
  448. package/dist/src/update/notifier.mjs +235 -0
  449. package/dist/src/writing/content-diversifier.js +804 -0
  450. package/dist/src/writing/example-generator.js +959 -0
  451. package/dist/src/writing/example-templates.js +99 -0
  452. package/dist/src/writing/pattern-library.js +486 -0
  453. package/dist/src/writing/patterns/banned-phrases.json +4413 -0
  454. package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
  455. package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
  456. package/dist/src/writing/patterns/hedging-language.json +2096 -0
  457. package/dist/src/writing/patterns/transition-words.json +1285 -0
  458. package/dist/src/writing/patterns/weak-verbs.json +1112 -0
  459. package/dist/src/writing/prompt-optimizer.js +660 -0
  460. package/dist/src/writing/prompt-templates.js +583 -0
  461. package/dist/src/writing/scoring-config-loader.js +168 -0
  462. package/dist/src/writing/validation-engine.js +595 -0
  463. package/dist/src/writing/validation-rules.js +380 -0
  464. package/dist/src/writing/voice-analyzer.js +439 -0
  465. package/dist/src/writing/voice-calibration.js +661 -0
  466. package/dist/src/writing/voice-profiles.json +588 -0
  467. package/package.json +65 -9
@@ -0,0 +1,504 @@
1
+ /**
2
+ * Channel Manager
3
+ *
4
+ * Manages the distribution channel (stable vs edge) for AIWG.
5
+ * - Stable: Uses the npm-installed package
6
+ * - Edge: Uses a git clone of the main branch for bleeding-edge updates
7
+ *
8
+ * @module src/channel/manager
9
+ * @version 2024.12.0
10
+ */
11
+
12
+ import fs from 'fs/promises';
13
+ import { readFileSync, existsSync } from 'fs';
14
+ import path from 'path';
15
+ import { fileURLToPath } from 'url';
16
+ import { execSync, spawn } from 'child_process';
17
+ import os from 'os';
18
+
19
+ /**
20
+ * Run a command with inherited stdio, applying a wall-clock timeout so a
21
+ * slow or hung git fetch cannot wedge the CLI for minutes. On timeout the
22
+ * child is SIGTERM'd and escalated to SIGKILL after 5s if it does not exit.
23
+ * Rejects with an Error carrying `.code = 'ETIMEDOUT'` on timeout or the
24
+ * original exit code otherwise.
25
+ *
26
+ * Replaces execSync() sites that had no timeout. Overridable via
27
+ * AIWG_GIT_TIMEOUT_MS (default 60s — fetch/pull on slow networks can take
28
+ * a while but must eventually terminate).
29
+ */
30
+ async function runWithTimeout(cmd, args, options = {}) {
31
+ const timeoutMs = (() => {
32
+ const raw = process.env['AIWG_GIT_TIMEOUT_MS'];
33
+ const n = raw ? parseInt(raw, 10) : NaN;
34
+ return Number.isFinite(n) && n > 0 ? n : 60_000;
35
+ })();
36
+
37
+ return new Promise((resolve, reject) => {
38
+ const child = spawn(cmd, args, {
39
+ stdio: 'inherit',
40
+ ...options,
41
+ });
42
+
43
+ let settled = false;
44
+ const timer = setTimeout(() => {
45
+ if (settled) return;
46
+ try { child.kill('SIGTERM'); } catch { /* already exited */ }
47
+ const kill9 = setTimeout(() => {
48
+ try { child.kill('SIGKILL'); } catch { /* already exited */ }
49
+ }, 5_000);
50
+ kill9.unref?.();
51
+ settled = true;
52
+ const err = new Error(`\`${cmd} ${args.join(' ')}\` timed out after ${timeoutMs}ms`);
53
+ err.code = 'ETIMEDOUT';
54
+ reject(err);
55
+ }, timeoutMs);
56
+ timer.unref?.();
57
+
58
+ child.on('close', (code) => {
59
+ if (settled) return;
60
+ settled = true;
61
+ clearTimeout(timer);
62
+ if (code === 0) resolve();
63
+ else {
64
+ const err = new Error(`\`${cmd} ${args.join(' ')}\` exited with code ${code}`);
65
+ err.code = code ?? 1;
66
+ reject(err);
67
+ }
68
+ });
69
+
70
+ child.on('error', (err) => {
71
+ if (settled) return;
72
+ settled = true;
73
+ clearTimeout(timer);
74
+ reject(err);
75
+ });
76
+ });
77
+ }
78
+
79
+ const __filename = fileURLToPath(import.meta.url);
80
+ const __dirname = path.dirname(__filename);
81
+
82
+ // Configuration paths
83
+ const CONFIG_DIR = path.join(os.homedir(), '.aiwg');
84
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'channel.json');
85
+ const EDGE_INSTALL_PATH = path.join(os.homedir(), '.local', 'share', 'ai-writing-guide');
86
+ const REPO_URL = 'https://github.com/jmagly/aiwg.git';
87
+
88
+ /**
89
+ * Default channel configuration
90
+ */
91
+ const DEFAULT_CONFIG = {
92
+ channel: 'stable',
93
+ edgePath: EDGE_INSTALL_PATH,
94
+ lastUpdateCheck: null,
95
+ updateCheckInterval: 86400000, // 24 hours in ms
96
+ };
97
+
98
+ /**
99
+ * Get the package root directory.
100
+ *
101
+ * Walks up from this file's directory looking for the nearest package.json
102
+ * that names "aiwg". This works whether this module runs from its source
103
+ * location (`src/channel/manager.mjs`) or from its compiled-build copy
104
+ * (`dist/src/channel/manager.mjs`), both of which have package.json at
105
+ * the repo root.
106
+ *
107
+ * The walk is bounded to 10 levels as a safety cap.
108
+ *
109
+ * @returns {string} Path to package root
110
+ */
111
+ export function getPackageRoot() {
112
+ let dir = __dirname;
113
+ for (let i = 0; i < 10; i++) {
114
+ const pkg = path.join(dir, 'package.json');
115
+ if (existsSync(pkg)) {
116
+ try {
117
+ const content = JSON.parse(readFileSync(pkg, 'utf8'));
118
+ if (content.name === 'aiwg') return dir;
119
+ } catch {
120
+ // keep walking
121
+ }
122
+ }
123
+ const parent = path.dirname(dir);
124
+ if (parent === dir) break;
125
+ dir = parent;
126
+ }
127
+ // Fallback to the legacy hardcoded two-up resolution.
128
+ return path.resolve(__dirname, '..', '..');
129
+ }
130
+
131
+ /**
132
+ * Load channel configuration
133
+ * @returns {Promise<object>} Channel configuration
134
+ */
135
+ export async function loadConfig() {
136
+ try {
137
+ const data = await fs.readFile(CONFIG_FILE, 'utf8');
138
+ return { ...DEFAULT_CONFIG, ...JSON.parse(data) };
139
+ } catch {
140
+ return { ...DEFAULT_CONFIG };
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Save channel configuration
146
+ * @param {object} config - Configuration to save
147
+ */
148
+ export async function saveConfig(config) {
149
+ await fs.mkdir(CONFIG_DIR, { recursive: true });
150
+ await fs.writeFile(CONFIG_FILE, JSON.stringify(config, null, 2));
151
+ }
152
+
153
+ /**
154
+ * Get the current channel
155
+ * @returns {Promise<string>} 'stable' or 'edge'
156
+ */
157
+ export async function getChannel() {
158
+ const config = await loadConfig();
159
+ return config.channel;
160
+ }
161
+
162
+ /**
163
+ * Get the framework root path based on current channel
164
+ * @returns {Promise<string>} Path to framework root
165
+ */
166
+ export async function getFrameworkRoot() {
167
+ const config = await loadConfig();
168
+
169
+ if (config.channel === 'edge') {
170
+ // Check if edge installation exists
171
+ try {
172
+ await fs.access(config.edgePath);
173
+ return config.edgePath;
174
+ } catch {
175
+ // Edge path doesn't exist, fall back to stable
176
+ console.warn('Edge installation not found, using stable channel');
177
+ return getPackageRoot();
178
+ }
179
+ }
180
+
181
+ return getPackageRoot();
182
+ }
183
+
184
+ /**
185
+ * Switch to edge (bleeding edge) channel
186
+ * Clones or updates the git repository for latest main branch
187
+ */
188
+ export async function switchToEdge() {
189
+ const config = await loadConfig();
190
+
191
+ console.log('Switching to edge channel (bleeding edge from main branch)...');
192
+ console.log('');
193
+
194
+ // Check if edge installation exists
195
+ const edgeExists = await fs.access(config.edgePath).then(() => true).catch(() => false);
196
+
197
+ if (edgeExists) {
198
+ // Update existing installation
199
+ console.log(`Updating edge installation at ${config.edgePath}...`);
200
+ try {
201
+ await runWithTimeout('git', ['fetch', '--all'], { cwd: config.edgePath });
202
+ await runWithTimeout('git', ['checkout', 'main'], { cwd: config.edgePath });
203
+ await runWithTimeout('git', ['pull', '--ff-only'], { cwd: config.edgePath });
204
+ // Ensure sparse checkout excludes .aiwg/ on existing installs
205
+ try {
206
+ const sparseConfig = path.join(config.edgePath, '.git', 'info', 'sparse-checkout');
207
+ const hasSparse = await fs.access(sparseConfig).then(() => true).catch(() => false);
208
+ if (!hasSparse) {
209
+ execSync('git sparse-checkout init --cone', { cwd: config.edgePath, stdio: 'pipe' });
210
+ execSync('git sparse-checkout set --no-cone "/*" "!/.aiwg"', { cwd: config.edgePath, stdio: 'pipe' });
211
+ }
212
+ } catch {
213
+ // Sparse checkout is optional — older git may not support it
214
+ }
215
+ console.log('Edge installation updated successfully.');
216
+ } catch (error) {
217
+ console.error('Failed to update edge installation:', error.message);
218
+ console.log('Try removing the directory and running again:');
219
+ console.log(` rm -rf ${config.edgePath}`);
220
+ console.log(' aiwg --use-main');
221
+ process.exit(1);
222
+ }
223
+ } else {
224
+ // Clone fresh
225
+ console.log(`Cloning repository to ${config.edgePath}...`);
226
+ await fs.mkdir(path.dirname(config.edgePath), { recursive: true });
227
+ try {
228
+ execSync(`git clone --branch main ${REPO_URL} "${config.edgePath}"`, { stdio: 'inherit' });
229
+ // Exclude dogfooding artifacts from edge clones — users want framework source only
230
+ try {
231
+ execSync('git sparse-checkout init --cone', { cwd: config.edgePath, stdio: 'pipe' });
232
+ execSync('git sparse-checkout set --no-cone "/*" "!/.aiwg"', { cwd: config.edgePath, stdio: 'pipe' });
233
+ } catch {
234
+ // Sparse checkout is optional — older git versions may not support it
235
+ console.log('Note: sparse checkout not available, .aiwg/ will be present in edge install.');
236
+ }
237
+ console.log('Edge installation created successfully.');
238
+ } catch (error) {
239
+ console.error('Failed to clone repository:', error.message);
240
+ process.exit(1);
241
+ }
242
+ }
243
+
244
+ // Update config
245
+ config.channel = 'edge';
246
+ await saveConfig(config);
247
+
248
+ console.log('');
249
+ console.log('Switched to edge channel.');
250
+ console.log('You are now using the latest code from the main branch.');
251
+ console.log('');
252
+ console.log('To update edge installation: aiwg -update');
253
+ console.log('To switch back to stable: aiwg --use-stable');
254
+ }
255
+
256
+ /**
257
+ * Switch to dev mode (use local repo as both framework source and CLI)
258
+ *
259
+ * In dev mode, the CLI entry point delegates to the dev repo's facade,
260
+ * so all code (including `aiwg index`, `aiwg use`, etc.) runs from the
261
+ * local build rather than the npm-installed package.
262
+ *
263
+ * @param {string} devPath - Path to the local development repository
264
+ */
265
+ export async function switchToDev(devPath) {
266
+ const config = await loadConfig();
267
+
268
+ const resolvedPath = path.resolve(devPath);
269
+
270
+ console.log('Switching to dev mode (local repository source)...');
271
+ console.log('');
272
+
273
+ // Verify the path looks like an AIWG repo
274
+ try {
275
+ await fs.access(path.join(resolvedPath, 'agentic', 'code', 'frameworks'));
276
+ } catch {
277
+ console.error(`Error: ${resolvedPath} does not appear to be an AIWG repository.`);
278
+ console.error('Expected to find agentic/code/frameworks/ directory.');
279
+ process.exit(1);
280
+ }
281
+
282
+ // Verify compiled router exists (dev-mode dispatch imports from dist/).
283
+ // Accept repos that have never been built by emitting a clear build hint
284
+ // rather than hard-failing here — the first `aiwg` invocation will re-check
285
+ // and print the same hint. This lets `aiwg --use-dev /path/to/fresh/clone`
286
+ // succeed followed by `npm run build`.
287
+ const distRouter = path.join(resolvedPath, 'dist', 'src', 'cli', 'router.js');
288
+ const distExists = await fs.access(distRouter).then(() => true).catch(() => false);
289
+
290
+ config.channel = 'edge';
291
+ config.edgePath = resolvedPath;
292
+ config.devMode = true;
293
+ await saveConfig(config);
294
+
295
+ console.log('Switched to dev mode.');
296
+ console.log(`Dev repo: ${resolvedPath}`);
297
+ console.log(`Router: ${distRouter}`);
298
+ if (!distExists) {
299
+ console.log('');
300
+ console.log('NOTE: dist/ is not built yet. Before running aiwg commands:');
301
+ console.log(` (cd ${resolvedPath} && npm run build)`);
302
+ }
303
+ console.log('');
304
+ console.log('The aiwg command now runs the compiled router from your local repo.');
305
+ console.log('After making changes, run: npm run build');
306
+ console.log('');
307
+ console.log('Commands:');
308
+ console.log(' aiwg use all Deploy from local source');
309
+ console.log(' aiwg version Verify dev mode active');
310
+ console.log(' aiwg --use-stable Switch back to npm package');
311
+ }
312
+
313
+ /**
314
+ * Switch to next (alpha/beta/RC) channel
315
+ * Installs the latest pre-release from the `next` dist-tag
316
+ */
317
+ export async function switchToNext() {
318
+ const config = await loadConfig();
319
+
320
+ console.log('Switching to next channel (alpha/beta/RC — latest pre-release)...');
321
+ console.log('');
322
+
323
+ try {
324
+ execSync('npm install -g aiwg@next', { stdio: 'inherit' });
325
+ } catch (error) {
326
+ console.error('Failed to install aiwg@next:', error.message);
327
+ console.error('Check that npm is available and you have write access to the global prefix.');
328
+ process.exit(1);
329
+ }
330
+
331
+ config.channel = 'next';
332
+ config.devMode = false;
333
+ await saveConfig(config);
334
+
335
+ console.log('');
336
+ console.log('Switched to next channel.');
337
+ console.log('You are now running the latest alpha/beta/RC release.');
338
+ console.log('');
339
+ console.log('To see what version you installed: aiwg version');
340
+ console.log('To switch back to stable: aiwg sync --channel latest');
341
+ }
342
+
343
+ /**
344
+ * Switch to nightly channel
345
+ * Installs the latest nightly snapshot from the `nightly` dist-tag
346
+ */
347
+ export async function switchToNightly() {
348
+ const config = await loadConfig();
349
+
350
+ console.log('Switching to nightly channel (latest automated snapshot)...');
351
+ console.log('');
352
+
353
+ try {
354
+ execSync('npm install -g aiwg@nightly', { stdio: 'inherit' });
355
+ } catch (error) {
356
+ console.error('Failed to install aiwg@nightly:', error.message);
357
+ console.error('Check that npm is available and you have write access to the global prefix.');
358
+ process.exit(1);
359
+ }
360
+
361
+ config.channel = 'nightly';
362
+ config.devMode = false;
363
+ await saveConfig(config);
364
+
365
+ console.log('');
366
+ console.log('Switched to nightly channel.');
367
+ console.log('You are now running the latest automated nightly snapshot.');
368
+ console.log('');
369
+ console.log('To see what version you installed: aiwg version');
370
+ console.log('To switch back to stable: aiwg sync --channel latest');
371
+ }
372
+
373
+ /**
374
+ * Switch to stable (npm) channel
375
+ */
376
+ export async function switchToStable() {
377
+ const config = await loadConfig();
378
+
379
+ console.log('Switching to stable channel (npm package)...');
380
+ console.log('');
381
+
382
+ config.channel = 'stable';
383
+ config.devMode = false;
384
+ await saveConfig(config);
385
+
386
+ console.log('Switched to stable channel.');
387
+ console.log('You are now using the npm-installed package.');
388
+ console.log('');
389
+ console.log('To update: npm install -g aiwg@latest');
390
+ console.log('To switch to edge: aiwg --use-main');
391
+ }
392
+
393
+ /**
394
+ * Get version information based on current channel
395
+ * @returns {Promise<object>} Version info
396
+ */
397
+ /**
398
+ * Normalize a package.json `repository` field (string or `{ url }`) into a clean
399
+ * `host/owner/repo` display form for version stamps — stripping the `git+`
400
+ * prefix, URL scheme, and `.git` suffix. Returns '' if none is declared.
401
+ *
402
+ * @param {string | { url?: string } | undefined} repository
403
+ * @returns {string}
404
+ */
405
+ function normalizeRepoUrl(repository) {
406
+ const raw = typeof repository === 'string' ? repository : repository?.url || '';
407
+ return raw
408
+ .replace(/^git\+/, '')
409
+ .replace(/^git@([^:]+):/, '$1/')
410
+ .replace(/^[a-z]+:\/\//i, '')
411
+ .replace(/\.git$/, '')
412
+ .replace(/\/$/, '');
413
+ }
414
+
415
+ export async function getVersionInfo() {
416
+ const config = await loadConfig();
417
+ const packageRoot = getPackageRoot();
418
+
419
+ // Read package.json version
420
+ const packageJsonPath = path.join(packageRoot, 'package.json');
421
+ const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'));
422
+
423
+ // Detect pre-release channel from version string when channel.json says 'stable'
424
+ // This handles the case where a user ran `npm install -g aiwg@next` directly —
425
+ // npm updates the binary but channel.json stays as 'stable'.
426
+ let channel = config.channel;
427
+ const version = packageJson.version;
428
+ if (!config.devMode && channel === 'stable') {
429
+ if (version.includes('-rc.')) {
430
+ channel = 'rc';
431
+ } else if (version.includes('-beta.')) {
432
+ channel = 'beta';
433
+ } else if (version.includes('-alpha.')) {
434
+ channel = 'alpha';
435
+ } else if (version.includes('-nightly.')) {
436
+ channel = 'nightly';
437
+ }
438
+ }
439
+
440
+ const info = {
441
+ version,
442
+ channel,
443
+ packageRoot,
444
+ devMode: config.devMode || false,
445
+ // Public-facing URLs — single source of truth is package.json, so user-visible
446
+ // stamps/links never hardcode the internal build origin. The published package
447
+ // declares the public repository/homepage/bugs; read them here rather than
448
+ // duplicating literals across the CLI.
449
+ repoUrl: normalizeRepoUrl(packageJson.repository), // e.g. github.com/jmagly/aiwg
450
+ homepage: packageJson.homepage || '', // e.g. https://aiwg.io
451
+ issuesUrl: packageJson.bugs?.url || '', // e.g. https://github.com/jmagly/aiwg/issues
452
+ };
453
+
454
+ if (config.channel === 'edge') {
455
+ // Get git info for edge channel
456
+ try {
457
+ const gitHash = execSync('git rev-parse --short HEAD', {
458
+ cwd: config.edgePath,
459
+ encoding: 'utf8',
460
+ }).trim();
461
+ const gitBranch = execSync('git branch --show-current', {
462
+ cwd: config.edgePath,
463
+ encoding: 'utf8',
464
+ }).trim();
465
+ info.edgePath = config.edgePath;
466
+ info.gitHash = gitHash;
467
+ info.gitBranch = gitBranch;
468
+ } catch {
469
+ // Git info not available
470
+ }
471
+ }
472
+
473
+ return info;
474
+ }
475
+
476
+ /**
477
+ * Update the edge installation from git
478
+ */
479
+ export async function updateEdge() {
480
+ const config = await loadConfig();
481
+
482
+ if (config.channel !== 'edge') {
483
+ console.log('Not in edge channel. Use npm install -g aiwg@latest for stable channel.');
484
+ return;
485
+ }
486
+
487
+ console.log('Updating edge installation...');
488
+
489
+ try {
490
+ await runWithTimeout('git', ['fetch', '--all'], { cwd: config.edgePath });
491
+ await runWithTimeout('git', ['pull', '--ff-only'], { cwd: config.edgePath });
492
+ console.log('');
493
+ console.log('Edge installation updated successfully.');
494
+ } catch (error) {
495
+ console.error('Update failed:', error.message);
496
+ console.log('');
497
+ console.log('If you have local changes, try:');
498
+ console.log(` cd ${config.edgePath}`);
499
+ console.log(' git stash');
500
+ console.log(' git pull');
501
+ console.log(' git stash pop');
502
+ process.exit(1);
503
+ }
504
+ }
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Agent Spawn Utility
3
+ *
4
+ * Centralized utility for spawning agentic CLI tools across providers.
5
+ * Handles --dangerous, --provider, and --params passthrough flags uniformly
6
+ * across all commands that invoke an underlying agent system.
7
+ *
8
+ * Usage pattern:
9
+ * const { opts, remaining } = parseAgentSpawnFlags(ctx.args);
10
+ * const config = getProviderConfig(opts.provider);
11
+ * const spawnArgs = buildAgentArgs(prompt, opts);
12
+ * spawn(config.binary, spawnArgs, { stdio: 'inherit' });
13
+ */
14
+ export const PROVIDER_CONFIGS = {
15
+ claude: {
16
+ binary: 'claude',
17
+ dangerousFlag: '--dangerously-skip-permissions',
18
+ name: 'Claude Code',
19
+ },
20
+ opencode: {
21
+ binary: 'opencode',
22
+ // OpenCode uses `opencode run "<prompt>"` for non-interactive execution.
23
+ // Dangerous mode flag not yet confirmed; omit rather than guess.
24
+ promptPrefix: ['run'],
25
+ dangerousFlag: null,
26
+ name: 'OpenCode',
27
+ },
28
+ codex: {
29
+ binary: 'codex',
30
+ // Codex supports --full-auto (no approval prompts) and --approval-mode full-auto
31
+ dangerousFlag: '--full-auto',
32
+ name: 'OpenAI Codex',
33
+ },
34
+ hermes: {
35
+ // Hermes is a model series (NousResearch), not a confirmed standalone CLI.
36
+ // Treat as IDE/runtime-integrated until a CLI is confirmed.
37
+ binary: null,
38
+ dangerousFlag: null,
39
+ name: 'Hermes',
40
+ guidanceMessage: 'Hermes does not have a confirmed standalone CLI.\n' +
41
+ 'Run via Ollama (`ollama run hermes3`) or through your configured MCP sidecar.',
42
+ },
43
+ copilot: {
44
+ binary: null,
45
+ dangerousFlag: null,
46
+ name: 'GitHub Copilot',
47
+ guidanceMessage: 'GitHub Copilot is IDE-integrated and cannot be spawned from the CLI.\n' +
48
+ 'Open your IDE, navigate to the Copilot chat panel, and run the skill manually.',
49
+ },
50
+ cursor: {
51
+ binary: null,
52
+ dangerousFlag: null,
53
+ name: 'Cursor',
54
+ guidanceMessage: 'Cursor is IDE-integrated and cannot be spawned from the CLI.\n' +
55
+ 'For unrestricted AIWG tool access, use the MCP sidecar:\n' +
56
+ ' aiwg mcp install cursor && aiwg mcp serve\n' +
57
+ 'See: docs/integrations/cursor-mcp-sidecar.md',
58
+ },
59
+ factory: {
60
+ binary: null,
61
+ dangerousFlag: null,
62
+ name: 'Factory AI',
63
+ guidanceMessage: 'Factory AI is cloud-based and cannot be spawned from the CLI.\n' +
64
+ 'Use the Factory AI dashboard to dispatch the workflow.',
65
+ },
66
+ warp: {
67
+ binary: null,
68
+ dangerousFlag: null,
69
+ name: 'Warp Terminal',
70
+ guidanceMessage: 'Warp Terminal cannot be spawned programmatically.\n' +
71
+ 'For unrestricted AIWG tool access, use the MCP sidecar:\n' +
72
+ ' aiwg mcp install warp && aiwg mcp serve\n' +
73
+ 'See: docs/integrations/warp-mcp-sidecar.md',
74
+ },
75
+ windsurf: {
76
+ binary: null,
77
+ dangerousFlag: null,
78
+ name: 'Windsurf',
79
+ guidanceMessage: 'Windsurf is IDE-integrated and cannot be spawned from the CLI.\n' +
80
+ 'For unrestricted AIWG tool access, use the MCP sidecar:\n' +
81
+ ' aiwg mcp install windsurf && aiwg mcp serve\n' +
82
+ 'See: docs/integrations/windsurf-mcp-sidecar.md',
83
+ },
84
+ };
85
+ /**
86
+ * Extract --provider, --dangerous, and --params from an args array.
87
+ * Returns the parsed options and the remaining args with those flags removed.
88
+ *
89
+ * This is non-destructive — the original array is not modified.
90
+ */
91
+ export function parseAgentSpawnFlags(args) {
92
+ const opts = {};
93
+ const remaining = [];
94
+ for (let i = 0; i < args.length; i++) {
95
+ const arg = args[i];
96
+ if (arg === '--provider' && i + 1 < args.length) {
97
+ opts.provider = args[++i];
98
+ }
99
+ else if (arg === '--dangerous') {
100
+ opts.dangerous = true;
101
+ }
102
+ else if (arg === '--params' && i + 1 < args.length) {
103
+ opts.params = args[++i];
104
+ }
105
+ else {
106
+ remaining.push(arg);
107
+ }
108
+ }
109
+ return { opts, remaining };
110
+ }
111
+ // ── Arg construction ──────────────────────────────────────────
112
+ /**
113
+ * Build the final args array for spawning a provider binary.
114
+ *
115
+ * Order: [prompt, dangerous-flag?, ...raw-params]
116
+ */
117
+ export function buildAgentArgs(prompt, opts) {
118
+ const config = getProviderConfig(opts.provider ?? 'claude');
119
+ const args = [];
120
+ // Dangerous flag must precede the prompt — it is a CLI flag to the binary,
121
+ // not content to pass to the agent. e.g. `claude --dangerously-skip-permissions "<prompt>"`
122
+ if (opts.dangerous && config.dangerousFlag) {
123
+ args.push(config.dangerousFlag);
124
+ // If provider has no dangerous flag, silently ignored —
125
+ // callers should warn via dangerousWarning().
126
+ }
127
+ // Some providers require a subcommand before the prompt (e.g. `opencode run "<prompt>"`)
128
+ args.push(...(config.promptPrefix ?? []));
129
+ // The prompt
130
+ args.push(prompt);
131
+ // User passthrough params — appended after the prompt verbatim
132
+ if (opts.params) {
133
+ args.push(...splitParams(opts.params));
134
+ }
135
+ return args;
136
+ }
137
+ /**
138
+ * Split a params string into individual args, respecting double/single quotes.
139
+ * "hello world" → ['hello world']
140
+ * --flag value → ['--flag', 'value']
141
+ */
142
+ export function splitParams(params) {
143
+ const result = [];
144
+ const re = /(?:[^\s"']+|"[^"]*"|'[^']*')+/g;
145
+ let match;
146
+ while ((match = re.exec(params)) !== null) {
147
+ // Strip surrounding quotes from individual tokens
148
+ result.push(match[0].replace(/^["']|["']$/g, ''));
149
+ }
150
+ return result;
151
+ }
152
+ // ── Provider helpers ──────────────────────────────────────────
153
+ /** Get config for a provider, falling back to claude for unknown values. */
154
+ export function getProviderConfig(provider) {
155
+ return PROVIDER_CONFIGS[provider] ?? PROVIDER_CONFIGS['claude'];
156
+ }
157
+ /** Returns true if the provider has a CLI binary that can be spawned. */
158
+ export function isSpawnableProvider(provider) {
159
+ return getProviderConfig(provider).binary !== null;
160
+ }
161
+ /**
162
+ * Warn string if --dangerous was requested but the provider has no
163
+ * corresponding flag. Returns null if the combination is valid.
164
+ */
165
+ export function dangerousWarning(provider) {
166
+ const config = getProviderConfig(provider);
167
+ if (!config.dangerousFlag) {
168
+ return `--dangerous is not supported for provider '${config.name}' and will be ignored.`;
169
+ }
170
+ return null;
171
+ }
172
+ /** List all spawnable provider names. */
173
+ export function spawnableProviders() {
174
+ return Object.entries(PROVIDER_CONFIGS)
175
+ .filter(([, c]) => c.binary !== null)
176
+ .map(([k]) => k);
177
+ }
178
+ //# sourceMappingURL=agent-spawn.js.map