@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. package/README.md +21 -1
  2. package/bin/aiwg.mjs +349 -0
  3. package/dist/src/a2a/agent-card.js +145 -0
  4. package/dist/src/a2a/client.js +411 -0
  5. package/dist/src/a2a/hitl-cli.js +171 -0
  6. package/dist/src/a2a/hitl-driver.js +370 -0
  7. package/dist/src/a2a/hitl.js +181 -0
  8. package/dist/src/a2a/http.js +193 -0
  9. package/dist/src/a2a/jcs.js +128 -0
  10. package/dist/src/a2a/jws.js +187 -0
  11. package/dist/src/a2a/types.js +24 -0
  12. package/dist/src/a2a/webhook.js +240 -0
  13. package/dist/src/activity-log/cli.js +348 -0
  14. package/dist/src/activity-log/parser.js +81 -0
  15. package/dist/src/activity-log/types.js +50 -0
  16. package/dist/src/agents/agent-deployer.js +367 -0
  17. package/dist/src/agents/agent-packager.js +271 -0
  18. package/dist/src/agents/agent-validator.js +271 -0
  19. package/dist/src/agents/grounding/knowledge-base.js +161 -0
  20. package/dist/src/agents/grounding/types.js +12 -0
  21. package/dist/src/agents/index.js +10 -0
  22. package/dist/src/agents/packaged-agent-inventory.js +75 -0
  23. package/dist/src/agents/types.js +7 -0
  24. package/dist/src/api/index.d.ts +10 -0
  25. package/dist/src/api/index.js +10 -0
  26. package/dist/src/artifacts/address-parser.js +73 -0
  27. package/dist/src/artifacts/audit/cli.js +183 -0
  28. package/dist/src/artifacts/audit/drift.js +122 -0
  29. package/dist/src/artifacts/audit/types.js +12 -0
  30. package/dist/src/artifacts/backends/graphology-backend.js +160 -0
  31. package/dist/src/artifacts/backends/json-backend.js +129 -0
  32. package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
  33. package/dist/src/artifacts/browser-export.js +622 -0
  34. package/dist/src/artifacts/capability-resolver.js +94 -0
  35. package/dist/src/artifacts/checksum-manifest.js +91 -0
  36. package/dist/src/artifacts/citation-parser.js +162 -0
  37. package/dist/src/artifacts/cli.js +1462 -0
  38. package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
  39. package/dist/src/artifacts/corpus-tools/cli.js +393 -0
  40. package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
  41. package/dist/src/artifacts/corpus-tools/curator.js +186 -0
  42. package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
  43. package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
  44. package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
  45. package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
  46. package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
  47. package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
  48. package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
  49. package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
  50. package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
  51. package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
  52. package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
  53. package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
  54. package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
  55. package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
  56. package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
  57. package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
  58. package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
  59. package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
  60. package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
  61. package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
  62. package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
  63. package/dist/src/artifacts/corpus-views/build.js +126 -0
  64. package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
  65. package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
  66. package/dist/src/artifacts/corpus-views/renderers.js +353 -0
  67. package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
  68. package/dist/src/artifacts/dep-graph.js +173 -0
  69. package/dist/src/artifacts/discover-facets.js +375 -0
  70. package/dist/src/artifacts/embedding-index.js +354 -0
  71. package/dist/src/artifacts/enrichment/cli.js +240 -0
  72. package/dist/src/artifacts/enrichment/prompt.js +47 -0
  73. package/dist/src/artifacts/enrichment/store.js +90 -0
  74. package/dist/src/artifacts/enrichment/types.js +12 -0
  75. package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
  76. package/dist/src/artifacts/fortemi-core-sync.js +251 -0
  77. package/dist/src/artifacts/fortemi-shard-export.js +44 -0
  78. package/dist/src/artifacts/fulltext.js +108 -0
  79. package/dist/src/artifacts/graph-backend.js +51 -0
  80. package/dist/src/artifacts/graph-query.js +247 -0
  81. package/dist/src/artifacts/hybrid-query.js +225 -0
  82. package/dist/src/artifacts/index-builder.js +1089 -0
  83. package/dist/src/artifacts/index-reader.js +112 -0
  84. package/dist/src/artifacts/index-status.js +193 -0
  85. package/dist/src/artifacts/legacy-index-migration.js +169 -0
  86. package/dist/src/artifacts/move.js +154 -0
  87. package/dist/src/artifacts/operational-state.js +239 -0
  88. package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
  89. package/dist/src/artifacts/query-engine.js +1955 -0
  90. package/dist/src/artifacts/source-graph.js +529 -0
  91. package/dist/src/artifacts/stats.js +169 -0
  92. package/dist/src/artifacts/types.js +606 -0
  93. package/dist/src/artifacts/views/cli.js +293 -0
  94. package/dist/src/artifacts/views/definition.js +170 -0
  95. package/dist/src/artifacts/views/store.js +149 -0
  96. package/dist/src/artifacts/views/types.js +8 -0
  97. package/dist/src/artifacts/watcher.js +255 -0
  98. package/dist/src/catalog/builtin-models.json +636 -0
  99. package/dist/src/catalog/cli.js +228 -0
  100. package/dist/src/catalog/cli.mjs +289 -0
  101. package/dist/src/catalog/index.js +15 -0
  102. package/dist/src/catalog/loader.js +217 -0
  103. package/dist/src/catalog/loader.mjs +251 -0
  104. package/dist/src/catalog/sources.json +41 -0
  105. package/dist/src/catalog/types.js +8 -0
  106. package/dist/src/channel/manager.mjs +504 -0
  107. package/dist/src/cli/agent-spawn.js +178 -0
  108. package/dist/src/cli/cli-extension-loader.js +245 -0
  109. package/dist/src/cli/command-log.js +275 -0
  110. package/dist/src/cli/config-loader.js +232 -0
  111. package/dist/src/cli/env.js +82 -0
  112. package/dist/src/cli/errors.js +150 -0
  113. package/dist/src/cli/find-package-root.js +40 -0
  114. package/dist/src/cli/git-hooks.js +250 -0
  115. package/dist/src/cli/handlers/agentcard.js +206 -0
  116. package/dist/src/cli/handlers/artifacts.js +76 -0
  117. package/dist/src/cli/handlers/best-practices-audit.js +280 -0
  118. package/dist/src/cli/handlers/cockpit.js +137 -0
  119. package/dist/src/cli/handlers/command-log.js +37 -0
  120. package/dist/src/cli/handlers/daemon.js +59 -0
  121. package/dist/src/cli/handlers/diagnose.js +300 -0
  122. package/dist/src/cli/handlers/execution-mode.js +105 -0
  123. package/dist/src/cli/handlers/feedback.js +341 -0
  124. package/dist/src/cli/handlers/help.js +147 -0
  125. package/dist/src/cli/handlers/index.js +302 -0
  126. package/dist/src/cli/handlers/init.js +179 -0
  127. package/dist/src/cli/handlers/install.js +129 -0
  128. package/dist/src/cli/handlers/issues.js +46 -0
  129. package/dist/src/cli/handlers/lint.js +42 -0
  130. package/dist/src/cli/handlers/local-executor.js +315 -0
  131. package/dist/src/cli/handlers/marketplace.js +168 -0
  132. package/dist/src/cli/handlers/mc.js +1010 -0
  133. package/dist/src/cli/handlers/models.js +352 -0
  134. package/dist/src/cli/handlers/packages.js +155 -0
  135. package/dist/src/cli/handlers/ralph-launcher.js +717 -0
  136. package/dist/src/cli/handlers/ralph.js +575 -0
  137. package/dist/src/cli/handlers/refresh.js +432 -0
  138. package/dist/src/cli/handlers/regenerate.js +336 -0
  139. package/dist/src/cli/handlers/repo-access.js +109 -0
  140. package/dist/src/cli/handlers/run.js +165 -0
  141. package/dist/src/cli/handlers/runtime-info.js +301 -0
  142. package/dist/src/cli/handlers/sandbox.js +197 -0
  143. package/dist/src/cli/handlers/scaffolding.js +149 -0
  144. package/dist/src/cli/handlers/script-runner.js +121 -0
  145. package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
  146. package/dist/src/cli/handlers/serve.js +1835 -0
  147. package/dist/src/cli/handlers/session.js +348 -0
  148. package/dist/src/cli/handlers/setup.js +440 -0
  149. package/dist/src/cli/handlers/skill-lint.js +367 -0
  150. package/dist/src/cli/handlers/skill-usage.js +74 -0
  151. package/dist/src/cli/handlers/steward.js +567 -0
  152. package/dist/src/cli/handlers/subcommands.js +1702 -0
  153. package/dist/src/cli/handlers/team.js +337 -0
  154. package/dist/src/cli/handlers/types.js +11 -0
  155. package/dist/src/cli/handlers/use.js +2772 -0
  156. package/dist/src/cli/handlers/utilities.js +703 -0
  157. package/dist/src/cli/handlers/version.js +134 -0
  158. package/dist/src/cli/handlers/workspace-context.js +93 -0
  159. package/dist/src/cli/handlers/workspace.js +126 -0
  160. package/dist/src/cli/help-generator.js +178 -0
  161. package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
  162. package/dist/src/cli/hooks/executor.js +96 -0
  163. package/dist/src/cli/hooks/index.js +15 -0
  164. package/dist/src/cli/hooks/registry.js +143 -0
  165. package/dist/src/cli/hooks/types.js +13 -0
  166. package/dist/src/cli/log.js +492 -0
  167. package/dist/src/cli/project-isolation/detect.js +70 -0
  168. package/dist/src/cli/project-isolation/index.js +7 -0
  169. package/dist/src/cli/project-isolation/signals.js +17 -0
  170. package/dist/src/cli/project-isolation/warning.js +102 -0
  171. package/dist/src/cli/prompt-utils.js +155 -0
  172. package/dist/src/cli/provider-deployment-plan.js +126 -0
  173. package/dist/src/cli/provider-resolution.js +119 -0
  174. package/dist/src/cli/router.js +305 -0
  175. package/dist/src/cli/scope-resolver.js +392 -0
  176. package/dist/src/cli/skill-usage.js +616 -0
  177. package/dist/src/cli/ui.js +224 -0
  178. package/dist/src/cli/watch-service.js +203 -0
  179. package/dist/src/cli/workflow-orchestrator.js +478 -0
  180. package/dist/src/cli/workspace-signals.js +321 -0
  181. package/dist/src/community/footer.js +14 -0
  182. package/dist/src/community/links.js +123 -0
  183. package/dist/src/community/milestones.js +46 -0
  184. package/dist/src/community/nudge-policy.js +93 -0
  185. package/dist/src/config/aiwg-config.js +883 -0
  186. package/dist/src/config/cli.js +703 -0
  187. package/dist/src/config/gitignore.js +156 -0
  188. package/dist/src/config/project-artifacts.js +76 -0
  189. package/dist/src/config/user-config.js +428 -0
  190. package/dist/src/config/user-registry.js +127 -0
  191. package/dist/src/config/workspace.js +276 -0
  192. package/dist/src/contributors/detect.js +39 -0
  193. package/dist/src/contributors/discover.js +172 -0
  194. package/dist/src/contributors/heuristic.js +186 -0
  195. package/dist/src/contributors/index.js +11 -0
  196. package/dist/src/contributors/types.js +13 -0
  197. package/dist/src/contributors/validation.js +116 -0
  198. package/dist/src/data/community.schema.json +43 -0
  199. package/dist/src/data/community.yaml +16 -0
  200. package/dist/src/extensions/capability-index.js +270 -0
  201. package/dist/src/extensions/claude-hooks-installer.js +268 -0
  202. package/dist/src/extensions/commands/definitions.js +3485 -0
  203. package/dist/src/extensions/deployment-registration.js +463 -0
  204. package/dist/src/extensions/index.js +22 -0
  205. package/dist/src/extensions/loader.js +132 -0
  206. package/dist/src/extensions/managed-marker.js +100 -0
  207. package/dist/src/extensions/manifest.js +196 -0
  208. package/dist/src/extensions/project-local-activity.js +114 -0
  209. package/dist/src/extensions/project-local-discovery.js +261 -0
  210. package/dist/src/extensions/project-local-doctor.js +281 -0
  211. package/dist/src/extensions/project-local-gitignore.js +176 -0
  212. package/dist/src/extensions/project-local-paths.js +121 -0
  213. package/dist/src/extensions/project-local-promote.js +218 -0
  214. package/dist/src/extensions/project-local-remove.js +373 -0
  215. package/dist/src/extensions/project-local-scaffold.js +252 -0
  216. package/dist/src/extensions/project-quickref.js +291 -0
  217. package/dist/src/extensions/registry.js +368 -0
  218. package/dist/src/extensions/shadow-resolver.js +271 -0
  219. package/dist/src/extensions/types.js +86 -0
  220. package/dist/src/extensions/upstream-registry.js +195 -0
  221. package/dist/src/extensions/validation.js +631 -0
  222. package/dist/src/features/catalog.js +88 -0
  223. package/dist/src/features/cli.js +197 -0
  224. package/dist/src/features/installer.js +57 -0
  225. package/dist/src/features/paths.js +14 -0
  226. package/dist/src/features/runtime.js +21 -0
  227. package/dist/src/features/status.js +134 -0
  228. package/dist/src/hooks/laziness-detection.js +532 -0
  229. package/dist/src/intake/git-history-analyzer.js +486 -0
  230. package/dist/src/intake/index.js +9 -0
  231. package/dist/src/issues/cli.js +327 -0
  232. package/dist/src/issues/index.js +5 -0
  233. package/dist/src/issues/live.js +154 -0
  234. package/dist/src/issues/local.js +666 -0
  235. package/dist/src/issues/sync.js +143 -0
  236. package/dist/src/issues/types.js +2 -0
  237. package/dist/src/issues/workflows.js +164 -0
  238. package/dist/src/kb/cli.js +173 -0
  239. package/dist/src/lint/cli.js +171 -0
  240. package/dist/src/lint/loader.js +225 -0
  241. package/dist/src/lint/reporters.js +141 -0
  242. package/dist/src/lint/runner.js +364 -0
  243. package/dist/src/lint/types.js +10 -0
  244. package/dist/src/marketplace/cache.js +110 -0
  245. package/dist/src/marketplace/identifier.js +63 -0
  246. package/dist/src/marketplace/registry.js +36 -0
  247. package/dist/src/marketplace/sources/clawhub.js +53 -0
  248. package/dist/src/marketplace/sources/git.js +45 -0
  249. package/dist/src/marketplace/types.js +9 -0
  250. package/dist/src/mcp/adapters/codex-runtime.js +224 -0
  251. package/dist/src/mcp/cli.mjs +1197 -0
  252. package/dist/src/mcp/elicitation.mjs +149 -0
  253. package/dist/src/mcp/helpers.mjs +287 -0
  254. package/dist/src/mcp/index.mjs +11 -0
  255. package/dist/src/mcp/profiles.js +263 -0
  256. package/dist/src/mcp/profiles.mjs +360 -0
  257. package/dist/src/mcp/registry.js +376 -0
  258. package/dist/src/mcp/registry.mjs +387 -0
  259. package/dist/src/mcp/server.mjs +633 -0
  260. package/dist/src/mcp/test-simple.mjs +271 -0
  261. package/dist/src/mcp/tools/command-run.mjs +101 -0
  262. package/dist/src/mcp/tools/discovery.mjs +291 -0
  263. package/dist/src/mcp/tools/interaction.mjs +87 -0
  264. package/dist/src/mcp/tools/orchestration.mjs +320 -0
  265. package/dist/src/mcp/tools/subsystems.mjs +640 -0
  266. package/dist/src/memory/cli.js +166 -0
  267. package/dist/src/memory/project-registry.js +282 -0
  268. package/dist/src/metrics/artifact-metrics.js +184 -0
  269. package/dist/src/metrics/context-budget.js +174 -0
  270. package/dist/src/metrics/token-counter.js +133 -0
  271. package/dist/src/models/config-loader.js +228 -0
  272. package/dist/src/models/index.js +22 -0
  273. package/dist/src/models/model-capabilities.v1.json +120 -0
  274. package/dist/src/models/model-catalog.v1.json +96 -0
  275. package/dist/src/models/model-discovery.js +521 -0
  276. package/dist/src/models/provider-models.js +73 -0
  277. package/dist/src/models/provider-policy.js +273 -0
  278. package/dist/src/models/resolver.js +245 -0
  279. package/dist/src/models/router.js +70 -0
  280. package/dist/src/models/types.js +8 -0
  281. package/dist/src/models/wrapper-deployment.js +178 -0
  282. package/dist/src/models/wrapper-route.js +54 -0
  283. package/dist/src/ops/cli.js +268 -0
  284. package/dist/src/ops/registry.js +623 -0
  285. package/dist/src/packages/adapters/clawhub.js +113 -0
  286. package/dist/src/packages/adapters/git.js +153 -0
  287. package/dist/src/packages/adapters/gitea.js +93 -0
  288. package/dist/src/packages/adapters/github.js +69 -0
  289. package/dist/src/packages/adapters/local-cache.js +89 -0
  290. package/dist/src/packages/package-registry.js +143 -0
  291. package/dist/src/packages/registry.js +238 -0
  292. package/dist/src/packages/types.js +11 -0
  293. package/dist/src/plugin/cross-framework-ops.js +475 -0
  294. package/dist/src/plugin/framework-config-loader.js +235 -0
  295. package/dist/src/plugin/framework-detector.js +186 -0
  296. package/dist/src/plugin/framework-isolator.js +341 -0
  297. package/dist/src/plugin/framework-migration.js +371 -0
  298. package/dist/src/plugin/metadata-validator.js +906 -0
  299. package/dist/src/plugin/plugin-installer.js +436 -0
  300. package/dist/src/plugin/plugin-status.js +369 -0
  301. package/dist/src/plugin/plugin-uninstaller.js +473 -0
  302. package/dist/src/plugin/registry-validator.js +344 -0
  303. package/dist/src/plugin/skill-command-translator.js +415 -0
  304. package/dist/src/plugin/workspace-creator.js +189 -0
  305. package/dist/src/plugin/workspace-migrator.js +821 -0
  306. package/dist/src/policy/authorization.js +390 -0
  307. package/dist/src/policy/repo-access.js +215 -0
  308. package/dist/src/provenance/cli.js +16 -0
  309. package/dist/src/providers/capability-matrix.js +300 -0
  310. package/dist/src/providers/capability-matrix.yaml +514 -0
  311. package/dist/src/providers/provider-definitions.js +977 -0
  312. package/dist/src/providers/provider-definitions.mjs +159 -0
  313. package/dist/src/providers/provider-inventory.js +169 -0
  314. package/dist/src/quality/feedback-ab.js +174 -0
  315. package/dist/src/quality/feedback-collector.js +176 -0
  316. package/dist/src/quality/feedback-tracker.js +123 -0
  317. package/dist/src/quality/patterns/adr.json +24 -0
  318. package/dist/src/quality/patterns/sad.json +24 -0
  319. package/dist/src/quality/patterns/test-plan.json +24 -0
  320. package/dist/src/quality/patterns/use-case.json +24 -0
  321. package/dist/src/quality/scoring.js +157 -0
  322. package/dist/src/reflections/cli.js +15 -0
  323. package/dist/src/release/plan.js +139 -0
  324. package/dist/src/research/cache/manager.js +227 -0
  325. package/dist/src/research/clients/arxiv.js +156 -0
  326. package/dist/src/research/clients/base.js +197 -0
  327. package/dist/src/research/clients/crossref.js +112 -0
  328. package/dist/src/research/clients/semantic-scholar.js +126 -0
  329. package/dist/src/research/clients/unpaywall.js +87 -0
  330. package/dist/src/research/index.js +14 -0
  331. package/dist/src/research/query-cli.js +336 -0
  332. package/dist/src/research/services/acquisition.js +313 -0
  333. package/dist/src/research/services/archival.js +225 -0
  334. package/dist/src/research/services/citation.js +279 -0
  335. package/dist/src/research/services/discovery.js +243 -0
  336. package/dist/src/research/services/documentation.js +269 -0
  337. package/dist/src/research/services/index.js +14 -0
  338. package/dist/src/research/services/provenance.js +279 -0
  339. package/dist/src/research/services/quality.js +370 -0
  340. package/dist/src/research/services/types.js +7 -0
  341. package/dist/src/research/storage-cli.js +20 -0
  342. package/dist/src/research/types.js +47 -0
  343. package/dist/src/resources/index.d.ts +2 -0
  344. package/dist/src/resources/index.js +2 -0
  345. package/dist/src/resources/web-release.d.ts +89 -0
  346. package/dist/src/resources/web-release.js +882 -0
  347. package/dist/src/rlm/cache/cli.js +162 -0
  348. package/dist/src/rlm/cache/hash.js +35 -0
  349. package/dist/src/rlm/cache/store.js +170 -0
  350. package/dist/src/rlm/cache/types.js +8 -0
  351. package/dist/src/rlm/cli.js +650 -0
  352. package/dist/src/serve/a2a-terminal-observer.js +120 -0
  353. package/dist/src/serve/agent-router.js +205 -0
  354. package/dist/src/serve/dispatch-router.js +171 -0
  355. package/dist/src/serve/executor-registry.js +715 -0
  356. package/dist/src/serve/mission-conductor.js +177 -0
  357. package/dist/src/serve/orchestrator-adapter.js +113 -0
  358. package/dist/src/serve/orchestrator-override.js +94 -0
  359. package/dist/src/serve/orchestrator-pty.js +133 -0
  360. package/dist/src/serve/pty-bridge.js +799 -0
  361. package/dist/src/serve/sandbox-registry.js +832 -0
  362. package/dist/src/serve/screen-reader.js +228 -0
  363. package/dist/src/serve/stack-adapters.js +68 -0
  364. package/dist/src/serve/telemetry.js +143 -0
  365. package/dist/src/skills/adapters/clawhub.js +250 -0
  366. package/dist/src/skills/adapters/local.js +335 -0
  367. package/dist/src/skills/adapters/openclaw.js +316 -0
  368. package/dist/src/skills/cli.js +334 -0
  369. package/dist/src/skills/registry.js +117 -0
  370. package/dist/src/skills/run.js +259 -0
  371. package/dist/src/skills/runtime.js +94 -0
  372. package/dist/src/skills/types.js +10 -0
  373. package/dist/src/smiths/agentsmith/demo.js +116 -0
  374. package/dist/src/smiths/agentsmith/examples.js +300 -0
  375. package/dist/src/smiths/agentsmith/generator.js +503 -0
  376. package/dist/src/smiths/agentsmith/index.js +11 -0
  377. package/dist/src/smiths/agentsmith/types.js +8 -0
  378. package/dist/src/smiths/commandsmith/example.js +220 -0
  379. package/dist/src/smiths/commandsmith/generator.js +288 -0
  380. package/dist/src/smiths/commandsmith/index.js +41 -0
  381. package/dist/src/smiths/commandsmith/templates.js +296 -0
  382. package/dist/src/smiths/commandsmith/types.js +7 -0
  383. package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
  384. package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
  385. package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
  386. package/dist/src/smiths/context-pipeline/discovery.js +187 -0
  387. package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
  388. package/dist/src/smiths/context-pipeline/finalization.js +147 -0
  389. package/dist/src/smiths/context-pipeline/generator.js +477 -0
  390. package/dist/src/smiths/context-pipeline/index.js +30 -0
  391. package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
  392. package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
  393. package/dist/src/smiths/context-pipeline/overflow.js +212 -0
  394. package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
  395. package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
  396. package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
  397. package/dist/src/smiths/context-pipeline/types.js +23 -0
  398. package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
  399. package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
  400. package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
  401. package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
  402. package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
  403. package/dist/src/smiths/hook-bridge/index.js +79 -0
  404. package/dist/src/smiths/hook-bridge/loader.js +116 -0
  405. package/dist/src/smiths/hook-bridge/shim.js +89 -0
  406. package/dist/src/smiths/hook-bridge/types.js +31 -0
  407. package/dist/src/smiths/index.js +39 -0
  408. package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
  409. package/dist/src/smiths/mcpsmith/example.js +119 -0
  410. package/dist/src/smiths/mcpsmith/generator.js +236 -0
  411. package/dist/src/smiths/mcpsmith/index.js +17 -0
  412. package/dist/src/smiths/mcpsmith/types.js +10 -0
  413. package/dist/src/smiths/platform-paths.js +101 -0
  414. package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
  415. package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
  416. package/dist/src/smiths/skillsmith/demo.js +83 -0
  417. package/dist/src/smiths/skillsmith/examples.js +161 -0
  418. package/dist/src/smiths/skillsmith/generator.js +316 -0
  419. package/dist/src/smiths/skillsmith/index.js +12 -0
  420. package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
  421. package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
  422. package/dist/src/smiths/skillsmith/types.js +9 -0
  423. package/dist/src/smiths/toolsmith/index.js +10 -0
  424. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
  425. package/dist/src/smiths/toolsmith/types.js +8 -0
  426. package/dist/src/storage/backends/fortemi.js +227 -0
  427. package/dist/src/storage/backends/fs.js +134 -0
  428. package/dist/src/storage/backends/logseq.js +309 -0
  429. package/dist/src/storage/backends/obsidian.js +233 -0
  430. package/dist/src/storage/cli.js +468 -0
  431. package/dist/src/storage/config.js +272 -0
  432. package/dist/src/storage/index.js +108 -0
  433. package/dist/src/storage/subsystem-cli.js +201 -0
  434. package/dist/src/storage/types.js +33 -0
  435. package/dist/src/testing/corpus/corpus-builder.js +383 -0
  436. package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
  437. package/dist/src/testing/corpus/index.js +10 -0
  438. package/dist/src/testing/fixtures/index.js +9 -0
  439. package/dist/src/testing/fixtures/test-data-factory.js +472 -0
  440. package/dist/src/testing/generators/index.js +11 -0
  441. package/dist/src/testing/generators/test-case-generator.js +393 -0
  442. package/dist/src/testing/generators/test-code-generator.js +384 -0
  443. package/dist/src/testing/generators/use-case-parser.js +325 -0
  444. package/dist/src/testing/index.js +11 -0
  445. package/dist/src/tracker/capability-protocol.js +118 -0
  446. package/dist/src/update/checker.mjs +396 -0
  447. package/dist/src/update/notifier.mjs +235 -0
  448. package/dist/src/writing/content-diversifier.js +804 -0
  449. package/dist/src/writing/example-generator.js +959 -0
  450. package/dist/src/writing/example-templates.js +99 -0
  451. package/dist/src/writing/pattern-library.js +486 -0
  452. package/dist/src/writing/patterns/banned-phrases.json +4413 -0
  453. package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
  454. package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
  455. package/dist/src/writing/patterns/hedging-language.json +2096 -0
  456. package/dist/src/writing/patterns/transition-words.json +1285 -0
  457. package/dist/src/writing/patterns/weak-verbs.json +1112 -0
  458. package/dist/src/writing/prompt-optimizer.js +660 -0
  459. package/dist/src/writing/prompt-templates.js +583 -0
  460. package/dist/src/writing/scoring-config-loader.js +168 -0
  461. package/dist/src/writing/validation-engine.js +595 -0
  462. package/dist/src/writing/validation-rules.js +380 -0
  463. package/dist/src/writing/voice-analyzer.js +439 -0
  464. package/dist/src/writing/voice-calibration.js +661 -0
  465. package/dist/src/writing/voice-profiles.json +588 -0
  466. package/package.json +64 -9
@@ -0,0 +1,703 @@
1
+ /**
2
+ * Config CLI — Subcommand router for `aiwg config`
3
+ *
4
+ * Subcommands:
5
+ * get <key> — Read a config value
6
+ * set <key> <value> — Write a config value
7
+ * list — Show all user config (merged view)
8
+ * validate — Validate all config files
9
+ * reset [<key>] — Reset key or all config to defaults
10
+ * path — Print the active config directory path
11
+ * edit — Open config in $EDITOR
12
+ * gitignore — Show/check/fix .gitignore for AIWG runtime dirs
13
+ *
14
+ * Global flags:
15
+ * --config-dir <path> — Override config directory
16
+ *
17
+ * @implements #545
18
+ * @implements #553
19
+ */
20
+ import { fileURLToPath } from 'url';
21
+ import path from 'path';
22
+ import { UserConfig } from './user-config.js';
23
+ import { AiwgError, EXIT_CODES } from '../cli/errors.js';
24
+ const _scriptDir = path.dirname(fileURLToPath(import.meta.url));
25
+ /**
26
+ * Main CLI entry point for `aiwg config <subcommand> [args]`
27
+ */
28
+ export async function main(args) {
29
+ // Extract --config-dir flag before routing
30
+ let configDir;
31
+ const filteredArgs = [];
32
+ for (let i = 0; i < args.length; i++) {
33
+ if (args[i] === '--config-dir' && i + 1 < args.length) {
34
+ configDir = args[i + 1];
35
+ i++; // skip next arg
36
+ }
37
+ else {
38
+ filteredArgs.push(args[i]);
39
+ }
40
+ }
41
+ const subcommand = filteredArgs[0];
42
+ const subArgs = filteredArgs.slice(1);
43
+ const config = new UserConfig(configDir);
44
+ switch (subcommand) {
45
+ case 'get':
46
+ await handleGet(config, subArgs);
47
+ break;
48
+ case 'set':
49
+ await handleSet(config, subArgs);
50
+ break;
51
+ case 'list':
52
+ case 'ls':
53
+ await handleList(config);
54
+ break;
55
+ case 'validate':
56
+ await handleValidate(config, subArgs);
57
+ break;
58
+ case 'reset':
59
+ await handleReset(config, subArgs);
60
+ break;
61
+ case 'path':
62
+ handlePath(config);
63
+ break;
64
+ case 'edit':
65
+ await handleEdit(config);
66
+ break;
67
+ case 'gitignore':
68
+ await handleGitignore(subArgs);
69
+ break;
70
+ case 'show':
71
+ await handleShow(subArgs);
72
+ break;
73
+ default:
74
+ printUsage();
75
+ if (subcommand) {
76
+ throw new AiwgError({
77
+ code: 'ERR_USAGE_UNKNOWN_SUBCOMMAND',
78
+ message: `Unknown config subcommand: ${subcommand}`,
79
+ hint: "Run 'aiwg config' without arguments to see usage",
80
+ exitCode: EXIT_CODES.USAGE,
81
+ });
82
+ }
83
+ break;
84
+ }
85
+ }
86
+ async function handleGet(config, args) {
87
+ const isProject = args.includes('--project');
88
+ const positional = args.filter(a => a !== '--project' && a !== '--user');
89
+ const key = positional[0];
90
+ if (!key) {
91
+ throw new AiwgError({
92
+ code: 'ERR_USAGE_MISSING_ARG',
93
+ message: 'aiwg config get requires a key',
94
+ hint: 'Example: aiwg config get defaults.provider (or --project delivery.mode)',
95
+ exitCode: EXIT_CODES.USAGE,
96
+ });
97
+ }
98
+ if (isProject) {
99
+ await projectConfigGet(key, args);
100
+ return;
101
+ }
102
+ const value = await config.get(key);
103
+ if (value === undefined) {
104
+ console.log(`(not set)`);
105
+ }
106
+ else if (typeof value === 'object') {
107
+ console.log(JSON.stringify(value, null, 2));
108
+ }
109
+ else {
110
+ console.log(String(value));
111
+ }
112
+ }
113
+ async function handleSet(config, args) {
114
+ const isProject = args.includes('--project');
115
+ const positional = args.filter(a => a !== '--project' && a !== '--user');
116
+ const key = positional[0];
117
+ const value = positional[1];
118
+ if (!key || value === undefined) {
119
+ throw new AiwgError({
120
+ code: 'ERR_USAGE_MISSING_ARG',
121
+ message: 'aiwg config set requires both a key and a value',
122
+ hint: 'Example: aiwg config set defaults.verbosity quiet (or --project delivery.mode pr-required)',
123
+ exitCode: EXIT_CODES.USAGE,
124
+ });
125
+ }
126
+ if (isProject) {
127
+ await projectConfigSet(key, value, args);
128
+ return;
129
+ }
130
+ await config.set(key, value);
131
+ console.log(`Set ${key} = ${value}`);
132
+ }
133
+ // ── Project-config get/set (#1006) ────────────────────────────────────────────
134
+ //
135
+ // Extends `aiwg config get|set` with `--project` to read/write the project-
136
+ // level .aiwg/aiwg.config. Dotted paths address nested fields:
137
+ // aiwg config get --project delivery.mode
138
+ // aiwg config set --project delivery.mode pr-required
139
+ // aiwg config get --project remotes.primary
140
+ //
141
+ // Set validates enum membership for known fields (delivery.mode,
142
+ // delivery.merge_style, delivery.force_push_policy) before writing.
143
+ const ENUM_RULES = {
144
+ 'delivery.mode': ['direct', 'feature-branch', 'pr-required'],
145
+ 'delivery.merge_style': ['rebase-merge', 'squash', 'merge', 'fast-forward-only'],
146
+ 'delivery.force_push_policy': ['never', 'own-branch-only', 'allowed'],
147
+ 'delivery.signing.format': ['openpgp', 'ssh', 'x509'],
148
+ 'delivery.signing.enforce': ['commits', 'tags', 'all'],
149
+ 'delivery.release_signing.format': ['openpgp', 'ssh', 'x509'],
150
+ 'delivery.release_signing.enforce': ['commits', 'tags', 'all'],
151
+ 'remotes.tracker_actor.via': ['tea', 'gh', 'mcp', 'api'],
152
+ 'remotes.transport.protocol': ['ssh', 'https'],
153
+ 'repo_maintainer.tiers.local': ['collaborator', 'maintainer', 'admin'],
154
+ };
155
+ const BOOLEAN_FIELDS = new Set([
156
+ 'delivery.delete_branch_on_merge',
157
+ 'delivery.require_ci_green',
158
+ 'delivery.require_signed_commits',
159
+ 'delivery.auto_close_issues',
160
+ 'delivery.issue_comment_on_cycle',
161
+ 'command_log.enabled',
162
+ 'telemetry.skill_usage.enabled',
163
+ ]);
164
+ const STRING_ARRAY_FIELDS = new Set([
165
+ 'remotes.tracker_actor.forbid_actors',
166
+ 'command_log.scopes',
167
+ 'telemetry.skill_usage.scopes',
168
+ ]);
169
+ // Integer fields with valid range constraints. Validated at `aiwg config set`.
170
+ // Bounds mirror the JSON schema (vscode-extension/schemas/aiwg.config.v1.json).
171
+ const INTEGER_FIELDS = {
172
+ 'parallelism.max_parallel_subagents': { min: 1, max: 50 },
173
+ 'parallelism.max_parallel_ralph_loops': { min: 1, max: 20 },
174
+ 'parallelism.max_parallel_mc_missions': { min: 1, max: 20 },
175
+ 'command_log.max_bytes': { min: 1024, max: 104_857_600 },
176
+ 'telemetry.skill_usage.max_bytes': { min: 1024, max: 104_857_600 },
177
+ };
178
+ async function projectConfigGet(key, args) {
179
+ const { readAiwgConfig, getProjectDir } = await import('./aiwg-config.js');
180
+ const projectDir = getProjectDir(undefined, args);
181
+ const cfg = await readAiwgConfig(projectDir);
182
+ if (!cfg) {
183
+ throw new AiwgError({
184
+ code: 'ERR_NO_PROJECT_CONFIG',
185
+ message: 'No .aiwg/aiwg.config in this project.',
186
+ hint: 'Run `aiwg init`, then ask your AIWG agent to set up repo/tracker/delivery policy.',
187
+ exitCode: EXIT_CODES.CONFIG,
188
+ });
189
+ }
190
+ const value = getDottedPath(cfg, key);
191
+ if (value === undefined) {
192
+ console.log('(not set)');
193
+ }
194
+ else if (typeof value === 'object') {
195
+ console.log(JSON.stringify(value, null, 2));
196
+ }
197
+ else {
198
+ console.log(String(value));
199
+ }
200
+ }
201
+ async function projectConfigSet(key, raw, args) {
202
+ const { readAiwgConfig, writeAiwgConfig, getProjectDir, emptyConfig, validateExternalLinks, } = await import('./aiwg-config.js');
203
+ const projectDir = getProjectDir(undefined, args);
204
+ // Validate enum fields before writing
205
+ const allowed = ENUM_RULES[key];
206
+ if (allowed && !allowed.includes(raw)) {
207
+ throw new AiwgError({
208
+ code: 'ERR_INVALID_VALUE',
209
+ message: `Invalid value for ${key}: '${raw}'. Allowed: ${allowed.join(', ')}`,
210
+ hint: `Try: aiwg config set --project ${key} ${allowed[0]}`,
211
+ exitCode: EXIT_CODES.USAGE,
212
+ });
213
+ }
214
+ // Coerce booleans for known boolean fields
215
+ let value = raw;
216
+ if (/^externalLinks\.[^.]+$/.test(key)) {
217
+ try {
218
+ value = JSON.parse(raw);
219
+ }
220
+ catch {
221
+ throw new AiwgError({
222
+ code: 'ERR_INVALID_VALUE',
223
+ message: `${key} must be a JSON object containing label and url`,
224
+ hint: `Try: aiwg config set --project ${key} '{"label":"Project docs","url":"https://example.com/docs"}'`,
225
+ exitCode: EXIT_CODES.USAGE,
226
+ });
227
+ }
228
+ }
229
+ if (BOOLEAN_FIELDS.has(key)) {
230
+ if (raw === 'true')
231
+ value = true;
232
+ else if (raw === 'false')
233
+ value = false;
234
+ else {
235
+ throw new AiwgError({
236
+ code: 'ERR_INVALID_VALUE',
237
+ message: `${key} must be 'true' or 'false', got '${raw}'`,
238
+ hint: `Try: aiwg config set --project ${key} true`,
239
+ exitCode: EXIT_CODES.USAGE,
240
+ });
241
+ }
242
+ }
243
+ if (STRING_ARRAY_FIELDS.has(key)) {
244
+ value = raw
245
+ .split(',')
246
+ .map(item => item.trim())
247
+ .filter(Boolean);
248
+ if (key === 'command_log.scopes' || key === 'telemetry.skill_usage.scopes') {
249
+ const invalid = value.filter(item => item !== 'project' && item !== 'global');
250
+ if (invalid.length > 0) {
251
+ throw new AiwgError({
252
+ code: 'ERR_INVALID_VALUE',
253
+ message: `${key} supports only 'project' and 'global', got '${invalid.join(', ')}'`,
254
+ hint: `Try: aiwg config set --project ${key} project,global`,
255
+ exitCode: EXIT_CODES.USAGE,
256
+ });
257
+ }
258
+ }
259
+ }
260
+ // Coerce + range-check integers for known integer fields (#1359).
261
+ const intRule = INTEGER_FIELDS[key];
262
+ if (intRule) {
263
+ const n = Number(raw);
264
+ if (!Number.isInteger(n) || n < intRule.min || n > intRule.max) {
265
+ throw new AiwgError({
266
+ code: 'ERR_INVALID_VALUE',
267
+ message: `${key} must be an integer between ${intRule.min} and ${intRule.max}, got '${raw}'`,
268
+ hint: `Try: aiwg config set --project ${key} ${intRule.min}`,
269
+ exitCode: EXIT_CODES.USAGE,
270
+ });
271
+ }
272
+ value = n;
273
+ }
274
+ // Read-modify-write — preserve unrelated fields. emptyConfig() seeds the
275
+ // base shape when no config file exists yet (e.g. brand-new project).
276
+ const cfg = (await readAiwgConfig(projectDir)) ?? emptyConfig();
277
+ setDottedPath(cfg, key, value);
278
+ const externalLinkErrors = validateExternalLinks(cfg.externalLinks);
279
+ if (externalLinkErrors.length > 0) {
280
+ throw new AiwgError({
281
+ code: 'ERR_INVALID_VALUE',
282
+ message: `Invalid external link configuration: ${externalLinkErrors.join('; ')}`,
283
+ hint: 'Each link needs a stable key, non-empty label, and absolute HTTP(S) URL without embedded credentials.',
284
+ exitCode: EXIT_CODES.USAGE,
285
+ });
286
+ }
287
+ await writeAiwgConfig(projectDir, cfg);
288
+ console.log(`Set --project ${key} = ${raw}`);
289
+ }
290
+ /** Read a dotted path from a nested record. Returns undefined when any segment is missing. */
291
+ function getDottedPath(obj, key) {
292
+ const parts = key.split('.');
293
+ let cur = obj;
294
+ for (const p of parts) {
295
+ if (cur === null || typeof cur !== 'object')
296
+ return undefined;
297
+ cur = cur[p];
298
+ }
299
+ return cur;
300
+ }
301
+ /** Write a dotted path into a nested record, creating intermediate objects. */
302
+ function setDottedPath(obj, key, value) {
303
+ const parts = key.split('.');
304
+ const last = parts.pop();
305
+ let cur = obj;
306
+ for (const p of parts) {
307
+ const next = cur[p];
308
+ if (next === undefined || next === null || typeof next !== 'object' || Array.isArray(next)) {
309
+ cur[p] = {};
310
+ }
311
+ cur = cur[p];
312
+ }
313
+ cur[last] = value;
314
+ }
315
+ async function handleList(config) {
316
+ const allConfig = await config.list();
317
+ console.log(`Config directory: ${config.getPath()}\n`);
318
+ for (const [filename, data] of Object.entries(allConfig)) {
319
+ console.log(`── ${filename} ──`);
320
+ if (typeof data === 'string') {
321
+ console.log(data);
322
+ }
323
+ else {
324
+ console.log(JSON.stringify(data, null, 2));
325
+ }
326
+ console.log('');
327
+ }
328
+ }
329
+ async function handleValidate(config, args) {
330
+ if (args.includes('--project')) {
331
+ await handleProjectValidate(args);
332
+ return;
333
+ }
334
+ const issues = await config.validate();
335
+ console.log(`Config directory: ${config.getPath()}\n`);
336
+ if (issues.length === 0) {
337
+ console.log('✓ All config files valid');
338
+ return;
339
+ }
340
+ const errors = issues.filter(i => i.severity === 'error');
341
+ const warnings = issues.filter(i => i.severity === 'warning');
342
+ const infos = issues.filter(i => i.severity === 'info');
343
+ for (const issue of issues) {
344
+ const icon = issue.severity === 'error' ? '✗' : issue.severity === 'warning' ? '!' : 'i';
345
+ console.log(` ${icon} [${issue.file}] ${issue.message}`);
346
+ }
347
+ console.log('');
348
+ console.log(`${errors.length} error(s), ${warnings.length} warning(s), ${infos.length} info`);
349
+ if (errors.length > 0) {
350
+ throw new AiwgError({
351
+ code: 'ERR_CONFIG_VALIDATION',
352
+ message: `Config validation failed with ${errors.length} error(s)`,
353
+ hint: 'Fix the errors listed above, or run: aiwg config edit',
354
+ exitCode: EXIT_CODES.CONFIG,
355
+ });
356
+ }
357
+ }
358
+ async function handleProjectValidate(args) {
359
+ const { getProjectDir, readAiwgConfig, resolveIssueLabels, validateExternalLinks, validateIndexConfig, validateIssueLabels, } = await import('./aiwg-config.js');
360
+ const projectDir = getProjectDir(undefined, args);
361
+ const cfg = await readAiwgConfig(projectDir);
362
+ if (!cfg) {
363
+ throw new AiwgError({
364
+ code: 'ERR_NO_PROJECT_CONFIG',
365
+ message: 'No .aiwg/aiwg.config in this project.',
366
+ hint: 'Run `aiwg init`, then configure project policy.',
367
+ exitCode: EXIT_CODES.CONFIG,
368
+ });
369
+ }
370
+ const providerIndex = args.indexOf('--provider');
371
+ const providerArg = providerIndex >= 0 ? args[providerIndex + 1] : undefined;
372
+ const allowedProviders = ['gitea', 'github', 'local'];
373
+ if (providerArg && !allowedProviders.includes(providerArg)) {
374
+ throw new AiwgError({
375
+ code: 'ERR_INVALID_VALUE',
376
+ message: `Unsupported issue label provider '${providerArg}'.`,
377
+ hint: 'Use --provider gitea, --provider github, or --provider local.',
378
+ exitCode: EXIT_CODES.USAGE,
379
+ });
380
+ }
381
+ const provider = providerArg;
382
+ const availableLabels = [];
383
+ for (let i = 0; i < args.length; i += 1) {
384
+ if (args[i] === '--available-label' && args[i + 1])
385
+ availableLabels.push(args[++i]);
386
+ }
387
+ const indexErrors = validateIndexConfig(cfg.index).map((message) => ({
388
+ severity: 'error',
389
+ code: 'index',
390
+ message,
391
+ }));
392
+ const externalLinkErrors = validateExternalLinks(cfg.externalLinks).map((message) => ({
393
+ severity: 'error',
394
+ code: 'external-links',
395
+ message,
396
+ }));
397
+ const labelDiagnostics = provider
398
+ ? validateIssueLabels(cfg.issues, {
399
+ provider,
400
+ ...(availableLabels.length ? { availableLabels } : {}),
401
+ })
402
+ : cfg.issues?.labels
403
+ ? validateIssueLabels(cfg.issues)
404
+ : resolveIssueLabels(undefined, 'local').diagnostics;
405
+ const diagnostics = [...indexErrors, ...externalLinkErrors, ...labelDiagnostics];
406
+ console.log(`Project config: ${projectDir}/.aiwg/aiwg.config\n`);
407
+ if (diagnostics.length === 0) {
408
+ console.log('✓ Project config valid');
409
+ return;
410
+ }
411
+ for (const diagnostic of diagnostics) {
412
+ const icon = diagnostic.severity === 'error' ? '✗' : '!';
413
+ console.log(` ${icon} [${diagnostic.code}] ${diagnostic.message}`);
414
+ }
415
+ const errors = diagnostics.filter((diagnostic) => diagnostic.severity === 'error');
416
+ const warnings = diagnostics.filter((diagnostic) => diagnostic.severity === 'warning');
417
+ console.log(`\n${errors.length} error(s), ${warnings.length} warning(s)`);
418
+ if (errors.length) {
419
+ throw new AiwgError({
420
+ code: 'ERR_CONFIG_VALIDATION',
421
+ message: `Project config validation failed with ${errors.length} error(s)`,
422
+ hint: 'Fix the reported taxonomy or index configuration. Missing tracker labels must be provisioned explicitly.',
423
+ exitCode: EXIT_CODES.CONFIG,
424
+ });
425
+ }
426
+ }
427
+ async function handleReset(config, args) {
428
+ const isProject = args.includes('--project');
429
+ const positional = args.filter(a => a !== '--project');
430
+ const key = positional[0];
431
+ if (isProject) {
432
+ await projectConfigReset(key, args);
433
+ return;
434
+ }
435
+ if (key) {
436
+ await config.reset(key);
437
+ console.log(`Reset ${key} to default`);
438
+ }
439
+ else {
440
+ await config.reset();
441
+ console.log('Reset all config to defaults');
442
+ }
443
+ }
444
+ /**
445
+ * Reset a project-config key to its provider-aware default.
446
+ *
447
+ * Currently scoped to the `parallelism` block (#1359). Resetting
448
+ * `parallelism` (no field suffix) restores the block to the primary
449
+ * provider's defaults. Resetting a specific field like
450
+ * `parallelism.max_parallel_subagents` restores just that field.
451
+ */
452
+ async function projectConfigReset(key, args) {
453
+ const { readAiwgConfig, writeAiwgConfig, getProjectDir, getProviderParallelismDefaults, } = await import('./aiwg-config.js');
454
+ if (!key) {
455
+ throw new AiwgError({
456
+ code: 'ERR_USAGE_MISSING_ARG',
457
+ message: 'aiwg config reset --project requires a key',
458
+ hint: 'Example: aiwg config reset --project parallelism',
459
+ exitCode: EXIT_CODES.USAGE,
460
+ });
461
+ }
462
+ const projectDir = getProjectDir(undefined, args);
463
+ const cfg = await readAiwgConfig(projectDir);
464
+ if (!cfg) {
465
+ throw new AiwgError({
466
+ code: 'ERR_NO_PROJECT_CONFIG',
467
+ message: 'No .aiwg/aiwg.config in this project.',
468
+ hint: 'Run `aiwg init`, then ask your AIWG agent to establish project policy.',
469
+ exitCode: EXIT_CODES.CONFIG,
470
+ });
471
+ }
472
+ const primary = cfg.providers[0];
473
+ const defaults = getProviderParallelismDefaults(primary);
474
+ if (key === 'parallelism') {
475
+ cfg.parallelism = {
476
+ max_parallel_subagents: defaults.max_parallel_subagents,
477
+ max_parallel_ralph_loops: defaults.max_parallel_ralph_loops,
478
+ max_parallel_mc_missions: defaults.max_parallel_mc_missions,
479
+ rationale: `Reset to provider default for ${primary ?? 'unknown'}`,
480
+ };
481
+ await writeAiwgConfig(projectDir, cfg);
482
+ console.log(`Reset --project parallelism to provider default (${primary ?? 'unknown'})`);
483
+ return;
484
+ }
485
+ if (key.startsWith('parallelism.')) {
486
+ const field = key.slice('parallelism.'.length);
487
+ if (field in defaults) {
488
+ cfg.parallelism = cfg.parallelism ?? {};
489
+ cfg.parallelism[field] = defaults[field];
490
+ await writeAiwgConfig(projectDir, cfg);
491
+ console.log(`Reset --project ${key} to provider default (${defaults[field]})`);
492
+ return;
493
+ }
494
+ }
495
+ throw new AiwgError({
496
+ code: 'ERR_INVALID_KEY',
497
+ message: `Reset for project key '${key}' is not supported.`,
498
+ hint: 'Supported: parallelism, parallelism.max_parallel_subagents, parallelism.max_parallel_ralph_loops, parallelism.max_parallel_mc_missions',
499
+ exitCode: EXIT_CODES.USAGE,
500
+ });
501
+ }
502
+ function handlePath(config) {
503
+ console.log(config.getPath());
504
+ }
505
+ async function handleEdit(config) {
506
+ const editor = process.env.EDITOR || process.env.VISUAL || 'vi';
507
+ const configPath = `${config.getPath()}/config.yaml`;
508
+ // Ensure the config file exists before opening
509
+ await config.ensureDir();
510
+ const { execSync } = await import('child_process');
511
+ try {
512
+ execSync(`${editor} "${configPath}"`, { stdio: 'inherit' });
513
+ }
514
+ catch (err) {
515
+ throw new AiwgError({
516
+ code: 'ERR_EDITOR_FAILED',
517
+ message: `Failed to open editor: ${editor}`,
518
+ hint: 'Set EDITOR or VISUAL to a valid editor binary, or edit the file directly',
519
+ exitCode: EXIT_CODES.GENERAL,
520
+ cause: err,
521
+ });
522
+ }
523
+ }
524
+ /**
525
+ * `aiwg config show --project [--json]` — print the resolved project-level
526
+ * .aiwg/aiwg.config (#999).
527
+ *
528
+ * Without `--project`, prints a hint pointing at `list` (user config) or
529
+ * `show --project` (project config). Project mode resolves the remotes block
530
+ * via the same defaults the rest of AIWG uses (origin → primary → issue/ci).
531
+ */
532
+ async function handleShow(args) {
533
+ const isProject = args.includes('--project');
534
+ const isJson = args.includes('--json');
535
+ if (!isProject) {
536
+ console.log(`aiwg config show requires a scope flag.
537
+
538
+ For user-level config: aiwg config list
539
+ For project-level config: aiwg config show --project [--json]
540
+ `);
541
+ throw new AiwgError({
542
+ code: 'ERR_USAGE_MISSING_FLAG',
543
+ message: 'aiwg config show requires --project (or use `aiwg config list` for user config)',
544
+ hint: 'Try: aiwg config show --project',
545
+ exitCode: EXIT_CODES.USAGE,
546
+ });
547
+ }
548
+ // Lazy-import to keep startup cost low for unrelated subcommands.
549
+ const { readAiwgConfig, resolveRemotes, getProjectDir } = await import('./aiwg-config.js');
550
+ const { spawnSync } = await import('child_process');
551
+ const projectDir = getProjectDir(undefined, args);
552
+ const cfg = await readAiwgConfig(projectDir);
553
+ if (!cfg) {
554
+ throw new AiwgError({
555
+ code: 'ERR_NO_PROJECT_CONFIG',
556
+ message: 'No .aiwg/aiwg.config in this project.',
557
+ hint: 'Run `aiwg init`, then ask your AIWG agent to set up repo/tracker/delivery policy.',
558
+ exitCode: EXIT_CODES.CONFIG,
559
+ });
560
+ }
561
+ const resolvedRemotes = resolveRemotes(cfg.remotes);
562
+ // Resolve each declared remote name to its URL via git. Best-effort.
563
+ function getUrl(name) {
564
+ const r = spawnSync('git', ['-C', projectDir, 'remote', 'get-url', name], {
565
+ encoding: 'utf-8',
566
+ stdio: ['ignore', 'pipe', 'ignore'],
567
+ });
568
+ if (r.status !== 0)
569
+ return null;
570
+ const out = r.stdout?.toString().trim();
571
+ return out || null;
572
+ }
573
+ const remotesView = {
574
+ primary: { name: resolvedRemotes.primary, url: getUrl(resolvedRemotes.primary) },
575
+ issue_tracker: { name: resolvedRemotes.issue_tracker, url: getUrl(resolvedRemotes.issue_tracker) },
576
+ ci: { name: resolvedRemotes.ci, url: getUrl(resolvedRemotes.ci) },
577
+ secondary: resolvedRemotes.secondary.map((s) => ({
578
+ ...s,
579
+ url: getUrl(s.name),
580
+ })),
581
+ has_remotes_block: !!cfg.remotes,
582
+ };
583
+ if (isJson) {
584
+ console.log(JSON.stringify({
585
+ project_dir: projectDir,
586
+ version: cfg.version,
587
+ providers: cfg.providers,
588
+ installed: cfg.installed,
589
+ scripts: cfg.scripts,
590
+ externalLinks: cfg.externalLinks ?? {},
591
+ remotes: remotesView,
592
+ }, null, 2));
593
+ return;
594
+ }
595
+ // Human-readable view
596
+ console.log(`Project config: ${projectDir}/.aiwg/aiwg.config\n`);
597
+ console.log(`Schema version: ${cfg.version}`);
598
+ console.log(`Providers: ${cfg.providers.join(', ') || '(none)'}`);
599
+ console.log('');
600
+ console.log('Installed frameworks:');
601
+ const installed = Object.entries(cfg.installed);
602
+ if (installed.length === 0) {
603
+ console.log(' (none)');
604
+ }
605
+ else {
606
+ for (const [name, entry] of installed) {
607
+ const providers = Object.keys(entry.deployedTo).join(', ') || '(no targets)';
608
+ console.log(` - ${name} v${entry.version} → ${providers}`);
609
+ }
610
+ }
611
+ console.log('');
612
+ console.log('External links:');
613
+ const externalLinks = Object.entries(cfg.externalLinks ?? {});
614
+ if (externalLinks.length === 0) {
615
+ console.log(' (none)');
616
+ }
617
+ else {
618
+ for (const [key, link] of externalLinks) {
619
+ const metadata = [link.category, link.audience].filter(Boolean).join(', ');
620
+ console.log(` - ${key}: ${link.label} — ${link.url}${metadata ? ` [${metadata}]` : ''}`);
621
+ if (link.description)
622
+ console.log(` ${link.description}`);
623
+ }
624
+ }
625
+ console.log('');
626
+ console.log('Remote topology:');
627
+ if (!remotesView.has_remotes_block) {
628
+ console.log(' (no `remotes` block — defaults: origin is primary, issue tracker, and CI)');
629
+ }
630
+ const fmt = (label, ref) => {
631
+ const u = ref.url ? ` (${ref.url})` : ' (no such remote in `git remote`)';
632
+ return ` ${label}: ${ref.name}${u}`;
633
+ };
634
+ console.log(fmt('Primary ', remotesView.primary));
635
+ if (remotesView.issue_tracker.name !== remotesView.primary.name) {
636
+ console.log(fmt('Issue tracker ', remotesView.issue_tracker));
637
+ }
638
+ if (remotesView.ci.name !== remotesView.primary.name) {
639
+ console.log(fmt('CI ', remotesView.ci));
640
+ }
641
+ for (const sec of remotesView.secondary) {
642
+ const purpose = sec.purpose ? ` — ${sec.purpose}` : '';
643
+ const release = sec.push_on_release ? ' [push tags on release]' : '';
644
+ const u = sec.url ? ` (${sec.url})` : ' (no such remote in `git remote`)';
645
+ console.log(` Secondary : ${sec.name}${u}${purpose}${release}`);
646
+ }
647
+ console.log('');
648
+ }
649
+ async function handleGitignore(args) {
650
+ const { spawnSync } = await import('child_process');
651
+ // Locate the gitignore CLI script relative to this compiled module
652
+ // (#1228). At runtime this module lives at `dist/src/config/cli.js`,
653
+ // so we need three `..` segments to reach the package root where
654
+ // `tools/cli/` is shipped (see package.json `files`).
655
+ const scriptPath = path.resolve(_scriptDir, '../../../tools/cli/config-gitignore.mjs');
656
+ const result = spawnSync(process.execPath, [scriptPath, ...args], { stdio: 'inherit' });
657
+ if (result.status !== 0) {
658
+ process.exit(result.status ?? 1);
659
+ }
660
+ }
661
+ function printUsage() {
662
+ console.log(`Usage: aiwg config <subcommand> [options]
663
+
664
+ Subcommands:
665
+ get <key> Read a user config value
666
+ get --project <key> Read a project config value (.aiwg/aiwg.config)
667
+ set <key> <value> Write a user config value
668
+ set --project <key> <value> Write a project config value (validates enums)
669
+ list Show all user config
670
+ show --project Show resolved project config (.aiwg/aiwg.config)
671
+ validate Validate user config files
672
+ validate --project Validate .aiwg/aiwg.config taxonomy/index semantics
673
+ [--provider gitea|github|local] [--available-label NAME ...]
674
+ reset [<key>] Reset key or all config to defaults
675
+ path Print config directory path
676
+ edit Open config in $EDITOR
677
+ gitignore Show/check/fix .gitignore AIWG entries
678
+
679
+ Global flags:
680
+ --config-dir <path> Override config directory
681
+
682
+ Examples:
683
+ aiwg config get defaults.provider
684
+ aiwg config set defaults.verbosity quiet
685
+ aiwg config set updates.channel next
686
+ aiwg config list
687
+ aiwg config show --project
688
+ aiwg config show --project --json
689
+ aiwg config get --project delivery.mode
690
+ aiwg config set --project delivery.mode pr-required
691
+ aiwg config set --project delivery.merge_style squash
692
+ aiwg config get --project parallelism
693
+ aiwg config set --project parallelism.max_parallel_subagents 6
694
+ aiwg config reset --project parallelism
695
+ aiwg config validate
696
+ aiwg config path
697
+ aiwg config reset defaults.provider
698
+ aiwg config --config-dir /custom/path list
699
+ aiwg config gitignore
700
+ aiwg config gitignore --fix
701
+ aiwg config gitignore --check`);
702
+ }
703
+ //# sourceMappingURL=cli.js.map