@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,703 @@
1
+ /**
2
+ * Utility Command Handlers
3
+ *
4
+ * Handlers for utility commands including card prefilling, contribution workflow,
5
+ * metadata validation, health diagnostics, and update checking.
6
+ *
7
+ * @implements @.aiwg/architecture/decisions/ADR-001-unified-extension-system.md
8
+ * @source @src/cli/router.ts
9
+ * @tests @test/unit/cli/handlers/utilities.test.ts
10
+ * @issue #33, #342
11
+ */
12
+ import fs from 'fs';
13
+ import fsp from 'fs/promises';
14
+ import path from 'path';
15
+ import { createScriptRunner } from './script-runner.js';
16
+ import { getFrameworkRoot } from '../../channel/manager.mjs';
17
+ import { forceUpdateCheck } from '../../update/checker.mjs';
18
+ import { useHandler as useFrameworkHandler } from './use.js';
19
+ import { projectAiwgPath } from '../../config/project-artifacts.js';
20
+ import { checkCollisions, } from '../../smiths/skillsmith/collision-detector.js';
21
+ /**
22
+ * Maps framework registry IDs (e.g. 'sdlc-complete') to `aiwg use` names (e.g. 'sdlc').
23
+ */
24
+ const REGISTRY_ID_TO_USE_NAME = {
25
+ 'sdlc-complete': 'sdlc',
26
+ 'media-marketing-kit': 'marketing',
27
+ 'media-curator': 'media-curator',
28
+ 'research-complete': 'research',
29
+ 'forensics-complete': 'forensics',
30
+ };
31
+ /**
32
+ * Read the installed frameworks from the on-disk registry.
33
+ */
34
+ function readFrameworkRegistry(cwd) {
35
+ const registryPath = projectAiwgPath(cwd, 'frameworks', 'registry.json');
36
+ if (!fs.existsSync(registryPath)) {
37
+ return null;
38
+ }
39
+ try {
40
+ return JSON.parse(fs.readFileSync(registryPath, 'utf8'));
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ /**
47
+ * Handler for prefill-cards command
48
+ *
49
+ * Prefills kanban cards with template data for project planning.
50
+ *
51
+ * Usage:
52
+ * aiwg -prefill-cards
53
+ * aiwg --prefill-cards
54
+ * aiwg -prefill-cards --board <board-name>
55
+ */
56
+ export const prefillCardsHandler = {
57
+ id: 'prefill-cards',
58
+ name: 'Prefill Cards',
59
+ description: 'Prefill kanban cards with template data',
60
+ category: 'utility',
61
+ aliases: ['-prefill-cards', '--prefill-cards'],
62
+ async execute(ctx) {
63
+ const frameworkRoot = await getFrameworkRoot();
64
+ const runner = createScriptRunner(frameworkRoot);
65
+ return runner.run('tools/cards/prefill-cards.mjs', ctx.args, {
66
+ cwd: ctx.cwd,
67
+ });
68
+ },
69
+ };
70
+ /**
71
+ * Handler for contribute-start command
72
+ *
73
+ * Starts a contribution workflow with issue tracking and branching.
74
+ *
75
+ * Usage:
76
+ * aiwg -contribute-start
77
+ * aiwg --contribute-start
78
+ * aiwg -contribute-start --issue <issue-number>
79
+ */
80
+ export const contributeStartHandler = {
81
+ id: 'contribute-start',
82
+ name: 'Start Contribution',
83
+ description: 'Start a contribution workflow',
84
+ category: 'utility',
85
+ aliases: ['-contribute-start', '--contribute-start'],
86
+ async execute(ctx) {
87
+ const frameworkRoot = await getFrameworkRoot();
88
+ const runner = createScriptRunner(frameworkRoot);
89
+ return runner.run('tools/contrib/start-contribution.mjs', ctx.args, {
90
+ cwd: ctx.cwd,
91
+ });
92
+ },
93
+ };
94
+ /**
95
+ * Handler for validate-metadata command
96
+ *
97
+ * Validates metadata across framework components and artifacts.
98
+ *
99
+ * Usage:
100
+ * aiwg validate-metadata
101
+ * aiwg validate-metadata --strict
102
+ * aiwg validate-metadata --recursive agentic/code/frameworks/security-engineering/skills
103
+ */
104
+ /** Namespace field regex for SKILL.md frontmatter */
105
+ const NAMESPACE_RE = /^namespace:\s*(\S+)/m;
106
+ /** Description field regex (single-line + multi-line `>` and `|` block scalars) */
107
+ const DESCRIPTION_RE = /^description:\s*([>|]?)\s*\n?([\s\S]*?)(?=\n\w+:|\n---|$)/m;
108
+ /**
109
+ * Count complete sentences in a description string. A sentence is delimited
110
+ * by `.`, `?`, or `!` followed by whitespace or end-of-string.
111
+ *
112
+ * Per the oz-skills two-sentence discipline (PUW-030 / #1131): skills
113
+ * should describe themselves in 1-2 sentences. Longer descriptions are
114
+ * generally a sign that the skill is doing too much (god-session) or that
115
+ * detail belongs in the body, not the frontmatter. Lint-only — does not
116
+ * block deploy.
117
+ */
118
+ function countSentences(s) {
119
+ if (!s)
120
+ return 0;
121
+ const trimmed = s.trim();
122
+ if (trimmed.length === 0)
123
+ return 0;
124
+ const matches = trimmed.match(/[.!?]+(?:\s|$)/g);
125
+ if (!matches)
126
+ return 1; // No terminator — treat as one bare sentence
127
+ // Trailing terminator counted; if no trailing terminator, the unterminated
128
+ // text is also a sentence.
129
+ const endsWithTerminator = /[.!?][)\]"'\s]*$/.test(trimmed);
130
+ return matches.length + (endsWithTerminator ? 0 : 1);
131
+ }
132
+ /**
133
+ * Scan source SKILL.md files in `agentic/code/` for namespace issues:
134
+ * - Missing `namespace: aiwg`
135
+ * - Slug (`aiwg-{name}`) that would shadow an AIWG CLI command
136
+ *
137
+ * Returns lines suitable for console output, or empty array if clean.
138
+ */
139
+ async function scanSourceNamespaceIssues(frameworkRoot) {
140
+ const issues = [];
141
+ const sourceRoot = path.join(frameworkRoot, 'agentic/code');
142
+ async function walk(dir) {
143
+ let entries;
144
+ try {
145
+ entries = fs.readdirSync(dir, { withFileTypes: true });
146
+ }
147
+ catch {
148
+ return;
149
+ }
150
+ for (const e of entries) {
151
+ const full = path.join(dir, e.name);
152
+ if (e.isDirectory()) {
153
+ await walk(full);
154
+ }
155
+ else if (e.name === 'SKILL.md') {
156
+ try {
157
+ const content = fs.readFileSync(full, 'utf-8');
158
+ const nsMatch = content.match(NAMESPACE_RE);
159
+ if (!nsMatch) {
160
+ const rel = path.relative(frameworkRoot, full);
161
+ issues.push(` WARN missing namespace field: ${rel}`);
162
+ }
163
+ // PUW-030 (#1131) — two-sentence skill description discipline.
164
+ // Lint-only. We extract the description block (handles single-line
165
+ // and YAML block scalars) and count sentence terminators.
166
+ const fmEnd = content.indexOf('\n---', 4);
167
+ const fm = fmEnd > 0 ? content.slice(0, fmEnd) : content;
168
+ const descMatch = fm.match(DESCRIPTION_RE);
169
+ if (descMatch) {
170
+ const desc = (descMatch[2] || '').trim().replace(/\n+/g, ' ');
171
+ const sentenceCount = countSentences(desc);
172
+ if (sentenceCount > 3) {
173
+ const rel = path.relative(frameworkRoot, full);
174
+ issues.push(` WARN description too long (${sentenceCount} sentences; oz-skills convention is 1-2): ${rel}`);
175
+ }
176
+ }
177
+ }
178
+ catch {
179
+ // unreadable
180
+ }
181
+ }
182
+ }
183
+ }
184
+ await walk(sourceRoot);
185
+ return issues;
186
+ }
187
+ /**
188
+ * Scan every `<framework>/<kind>/contributor.md` under `agentic/code/` and
189
+ * validate its frontmatter against the registered schema for its kind.
190
+ * Returns a list of human-readable issue lines for output, plus a count of
191
+ * problems found. Per ADR-023 §Schema validation, malformed contributors
192
+ * fail strict validation.
193
+ */
194
+ async function scanContributorIssues(frameworkRoot) {
195
+ // Lazy-imported so the validate-metadata path stays fast when there are
196
+ // no contributors yet; also avoids an upfront dep load when zod is unused.
197
+ const [{ parseFrontmatter }, { validateContributor, getRegisteredKinds }] = await Promise.all([
198
+ import('../../artifacts/index-builder.js'),
199
+ import('../../contributors/validation.js'),
200
+ ]);
201
+ const kinds = new Set(getRegisteredKinds());
202
+ const sourceRoot = path.join(frameworkRoot, 'agentic/code');
203
+ const lines = [];
204
+ let count = 0;
205
+ async function walk(dir) {
206
+ let entries;
207
+ try {
208
+ entries = fs.readdirSync(dir, { withFileTypes: true });
209
+ }
210
+ catch {
211
+ return;
212
+ }
213
+ for (const e of entries) {
214
+ const full = path.join(dir, e.name);
215
+ if (e.isDirectory()) {
216
+ await walk(full);
217
+ }
218
+ else if (e.name === 'contributor.md') {
219
+ // Only validate if the parent directory name is a registered kind.
220
+ // Avoids treating unrelated files named `contributor.md` as contributors.
221
+ const parent = path.basename(path.dirname(full));
222
+ if (!kinds.has(parent))
223
+ continue;
224
+ try {
225
+ const content = fs.readFileSync(full, 'utf-8');
226
+ const { data } = parseFrontmatter(content);
227
+ const validation = validateContributor(data);
228
+ if (!validation.ok) {
229
+ const rel = path.relative(frameworkRoot, full);
230
+ lines.push(` ERROR ${rel}`);
231
+ for (const err of validation.errors) {
232
+ lines.push(` ${err}`);
233
+ }
234
+ count++;
235
+ }
236
+ }
237
+ catch (err) {
238
+ const rel = path.relative(frameworkRoot, full);
239
+ lines.push(` ERROR ${rel}: ${err.message}`);
240
+ count++;
241
+ }
242
+ }
243
+ }
244
+ }
245
+ await walk(sourceRoot);
246
+ return { lines, count };
247
+ }
248
+ export const validateMetadataHandler = {
249
+ id: 'validate-metadata',
250
+ name: 'Validate Metadata',
251
+ description: 'Validate metadata across components',
252
+ category: 'utility',
253
+ aliases: ['-validate-metadata', '--validate-metadata'],
254
+ async execute(ctx) {
255
+ const frameworkRoot = await getFrameworkRoot();
256
+ const runner = createScriptRunner(frameworkRoot);
257
+ const hasPathArg = ctx.args.some(arg => !arg.startsWith('-'));
258
+ const wantsHelp = ctx.args.includes('--help') || ctx.args.includes('-h');
259
+ const scriptArgs = wantsHelp || hasPathArg
260
+ ? ctx.args
261
+ : ['--recursive', 'agentic/code'];
262
+ // Run the core metadata validation script
263
+ const result = await runner.run('tools/cli/validate-metadata.mjs', scriptArgs, {
264
+ cwd: ctx.cwd,
265
+ });
266
+ // Append namespace validation: scan source SKILL.md files
267
+ try {
268
+ const issues = await scanSourceNamespaceIssues(frameworkRoot);
269
+ if (issues.length > 0) {
270
+ console.log('\n── Namespace validation ──');
271
+ console.log(` ${issues.length} skill(s) missing namespace field:`);
272
+ // Show first 20 to avoid flooding output
273
+ issues.slice(0, 20).forEach(l => console.log(l));
274
+ if (issues.length > 20) {
275
+ console.log(` ... and ${issues.length - 20} more`);
276
+ }
277
+ // Non-zero exit only in strict mode
278
+ if (ctx.args.includes('--strict') && result.exitCode === 0) {
279
+ return { exitCode: 1, message: `Namespace validation failed: ${issues.length} skill(s) missing namespace field` };
280
+ }
281
+ }
282
+ else {
283
+ console.log('\n── Namespace validation: all skills have namespace field ✓');
284
+ }
285
+ }
286
+ catch {
287
+ // Namespace scan is non-fatal
288
+ }
289
+ // Append contributor validation: walk source contributor.md files and
290
+ // validate their frontmatter against the kind's zod schema (ADR-023).
291
+ try {
292
+ const { lines, count } = await scanContributorIssues(frameworkRoot);
293
+ if (count > 0) {
294
+ console.log('\n── Contributor validation ──');
295
+ console.log(` ${count} contributor file(s) failed schema validation:`);
296
+ lines.slice(0, 40).forEach(l => console.log(l));
297
+ if (lines.length > 40) {
298
+ console.log(` ... and ${lines.length - 40} more lines`);
299
+ }
300
+ // Strict mode escalates to a non-zero exit so CI catches drift.
301
+ if (ctx.args.includes('--strict') && result.exitCode === 0) {
302
+ return {
303
+ exitCode: 1,
304
+ message: `Contributor validation failed: ${count} file(s) violated schema`,
305
+ };
306
+ }
307
+ }
308
+ else {
309
+ console.log('\n── Contributor validation: all contributor.md files conform to schema ✓');
310
+ }
311
+ }
312
+ catch {
313
+ // Contributor scan is non-fatal — never break validate-metadata if zod
314
+ // import or filesystem walk hits an unexpected condition.
315
+ }
316
+ return result;
317
+ },
318
+ };
319
+ /**
320
+ * #1156 Phase 1 — Validate the per-user registry at `~/.aiwg/installed.json`.
321
+ *
322
+ * Checks each registered framework+provider deploy:
323
+ * - Registry entry parses correctly
324
+ * - Recorded artifact entries (Cycle 3 mirrors) still exist on disk
325
+ * - Per-artifact-type counts match the actual entry-name list length
326
+ * - Pre-Cycle-3 entries (no `entries` snapshot) are surfaced as "limited
327
+ * drift detection" rather than failures
328
+ *
329
+ * Returns exit 1 when drift is detected, exit 0 otherwise. Output is plain
330
+ * text suitable for terminal consumption.
331
+ */
332
+ async function runUserScopeDoctor(verbose) {
333
+ const { readUserRegistry, userRegistryPath } = await import('../../config/user-registry.js');
334
+ const { USER_SCOPE_PATHS } = await import('../scope-resolver.js');
335
+ const fsp2 = await import('node:fs/promises');
336
+ const path2 = await import('node:path');
337
+ const registry = await readUserRegistry();
338
+ const frameworks = Object.entries(registry.installed);
339
+ const lines = [];
340
+ lines.push('');
341
+ lines.push('── User-scope registry validation ──');
342
+ lines.push(`Registry path: ${userRegistryPath()}`);
343
+ lines.push('');
344
+ if (frameworks.length === 0) {
345
+ lines.push('No frameworks deployed at user scope. Run `aiwg use <fw> --scope user` to install.');
346
+ return { exitCode: 0, message: lines.join('\n') + '\n' };
347
+ }
348
+ let driftCount = 0;
349
+ let limitedCount = 0;
350
+ for (const [name, entry] of frameworks) {
351
+ lines.push(`▸ ${name} v${entry.version} [${entry.source}]`);
352
+ for (const [provider, providerDeployRaw] of Object.entries(entry.deployedTo)) {
353
+ // Cast through unknown for the optional `entries` snapshot.
354
+ const providerDeploy = providerDeployRaw;
355
+ const userPaths = USER_SCOPE_PATHS[provider];
356
+ if (!userPaths) {
357
+ lines.push(` ${provider}: ⚠ no user-scope path map registered for this provider`);
358
+ driftCount++;
359
+ continue;
360
+ }
361
+ const recorded = providerDeploy.entries;
362
+ if (!recorded) {
363
+ lines.push(` ${provider}: ⚠ pre-Cycle-3 entry — no per-artifact manifest, drift detection limited`);
364
+ lines.push(` counts: agents=${providerDeploy.agents} commands=${providerDeploy.commands} skills=${providerDeploy.skills} rules=${providerDeploy.rules}`);
365
+ limitedCount++;
366
+ continue;
367
+ }
368
+ // Walk the recorded entry names and check each one exists on disk.
369
+ const checks = [
370
+ ['agents', userPaths.agents, recorded.agents, providerDeploy.agents],
371
+ ['commands', userPaths.commands, recorded.commands, providerDeploy.commands],
372
+ ['skills', userPaths.skills, recorded.skills, providerDeploy.skills],
373
+ ['rules', userPaths.rules, recorded.rules, providerDeploy.rules],
374
+ ];
375
+ const issues = [];
376
+ for (const [type, dir, names, expectedCount] of checks) {
377
+ if (!dir || !names)
378
+ continue;
379
+ let present = 0;
380
+ const missing = [];
381
+ for (const n of names) {
382
+ const target = path2.join(dir, n);
383
+ const stat = await fsp2.stat(target).catch(() => null);
384
+ if (stat)
385
+ present++;
386
+ else
387
+ missing.push(n);
388
+ }
389
+ if (names.length !== expectedCount) {
390
+ issues.push(`count drift on ${type}: registry says ${expectedCount}, manifest lists ${names.length}`);
391
+ }
392
+ if (missing.length > 0) {
393
+ issues.push(`${type}: ${missing.length}/${names.length} entries missing from ${dir}`);
394
+ if (verbose) {
395
+ for (const m of missing)
396
+ issues.push(` missing: ${path2.join(dir, m)}`);
397
+ }
398
+ }
399
+ else if (verbose) {
400
+ issues.push(`${type}: ${present}/${names.length} present at ${dir}`);
401
+ }
402
+ }
403
+ if (issues.length === 0) {
404
+ lines.push(` ${provider}: ✓ all recorded artifacts present`);
405
+ }
406
+ else {
407
+ const hasMissing = issues.some(i => i.includes('missing') || i.includes('drift'));
408
+ const marker = hasMissing ? '✗' : 'ℹ';
409
+ lines.push(` ${provider}: ${marker}`);
410
+ for (const i of issues)
411
+ lines.push(` ${i}`);
412
+ if (hasMissing)
413
+ driftCount++;
414
+ }
415
+ }
416
+ }
417
+ lines.push('');
418
+ lines.push('═'.repeat(60));
419
+ lines.push(`Frameworks: ${frameworks.length} Drift: ${driftCount} Limited (pre-Cycle-3): ${limitedCount}`);
420
+ if (driftCount > 0) {
421
+ lines.push('');
422
+ lines.push('Drift detected. To repair, re-run `aiwg use <framework> --scope user --provider <p>`.');
423
+ lines.push('To remove a stale registry entry, run `aiwg remove <framework> --scope user`.');
424
+ }
425
+ return {
426
+ exitCode: driftCount > 0 ? 1 : 0,
427
+ message: lines.join('\n') + '\n',
428
+ };
429
+ }
430
+ /**
431
+ * Handler for doctor command
432
+ *
433
+ * Runs health diagnostics on the AIWG installation and workspace.
434
+ *
435
+ * Usage:
436
+ * aiwg doctor
437
+ * aiwg -doctor
438
+ * aiwg --doctor
439
+ * aiwg doctor --verbose
440
+ * aiwg doctor --scope user # validate ~/.aiwg/installed.json
441
+ */
442
+ export const doctorHandler = {
443
+ id: 'doctor',
444
+ name: 'Doctor',
445
+ description: 'Run health diagnostics',
446
+ category: 'maintenance',
447
+ aliases: ['-doctor', '--doctor'],
448
+ async execute(ctx) {
449
+ // #1156 Phase 1 — `aiwg doctor --scope user` / `aiwg doctor --user`
450
+ // validates the per-user registry (~/.aiwg/installed.json) without
451
+ // running the project-scope diagnostics. Operators need this to verify
452
+ // their user-scope deployments from any cwd, including shells with no
453
+ // project at all.
454
+ const userScopeRequested = ctx.args.includes('--user') ||
455
+ (ctx.args.includes('--scope') && ctx.args[ctx.args.indexOf('--scope') + 1] === 'user');
456
+ if (userScopeRequested) {
457
+ return await runUserScopeDoctor(ctx.args.includes('--verbose') || ctx.args.includes('-v'));
458
+ }
459
+ const frameworkRoot = await getFrameworkRoot();
460
+ const runner = createScriptRunner(frameworkRoot);
461
+ // Run core doctor diagnostics
462
+ const result = await runner.run('tools/cli/doctor.mjs', ctx.args, { cwd: ctx.cwd });
463
+ // Surface feedback escape hatch when doctor finds issues
464
+ if (result.exitCode !== 0) {
465
+ console.log(`
466
+ ── Recovery options ──
467
+ aiwg session --no-repair — launch anyway (skip auto-repair)
468
+ aiwg sync — sync to latest and redeploy
469
+ aiwg feedback --type bug — report this issue to GitHub
470
+ `);
471
+ }
472
+ // Append collision scan: check deployed skills dir for bad-state collisions
473
+ // (platform built-ins and AIWG CLI command shadows)
474
+ try {
475
+ const projectDir = ctx.cwd || process.cwd();
476
+ const skillsDir = path.join(projectDir, '.claude', 'skills');
477
+ let deployedSkillNames = [];
478
+ try {
479
+ const entries = await fsp.readdir(skillsDir, { withFileTypes: true });
480
+ deployedSkillNames = entries.filter(e => e.isDirectory()).map(e => e.name);
481
+ }
482
+ catch {
483
+ // No .claude/skills — nothing to check
484
+ }
485
+ if (deployedSkillNames.length > 0) {
486
+ const collisions = await checkCollisions({
487
+ platform: 'claude',
488
+ projectPath: projectDir,
489
+ skillNames: deployedSkillNames,
490
+ namespace: 'aiwg',
491
+ skillsBaseDir: skillsDir,
492
+ });
493
+ const errorAndWarn = collisions.filter(r => r.severity === 'error' || r.severity === 'warn');
494
+ if (errorAndWarn.length > 0) {
495
+ // In doctor context we report stale skills, not deployment blocks.
496
+ // Re-running `aiwg use` will auto-clean aiwg-owned stale skills.
497
+ console.log('\n── Skill collision scan ──');
498
+ console.log('');
499
+ console.log('⚠ Stale skills detected (names collide with Claude built-ins):');
500
+ for (const r of errorAndWarn) {
501
+ console.log(` ✗ ${r.skillName}: ${r.reason}`);
502
+ }
503
+ console.log('');
504
+ console.log(' Fix: run `aiwg use <framework>` to redeploy and auto-clean stale skill directories.');
505
+ }
506
+ }
507
+ }
508
+ catch {
509
+ // Collision scan is non-fatal for doctor
510
+ }
511
+ // #1037 / #1049 — Project-local artifacts section: per-type counts,
512
+ // validation errors, shadows, denylist violations, drift detection,
513
+ // and provider deployment matrix. Replaces the older inline shadow
514
+ // scan with the richer section spec'd by design-doctor-log-promote.md.
515
+ try {
516
+ const projectDir = ctx.cwd || process.cwd();
517
+ const fr = await getFrameworkRoot();
518
+ const { readAiwgConfig } = await import('../../config/aiwg-config.js');
519
+ const config = await readAiwgConfig(projectDir);
520
+ const { buildProjectLocalDoctorSection } = await import('../../extensions/project-local-doctor.js');
521
+ const onlyProjectLocal = ctx.args.includes('--project-local');
522
+ const quiet = ctx.args.includes('--quiet');
523
+ const section = await buildProjectLocalDoctorSection({
524
+ projectDir, frameworkRoot: fr, config, quiet,
525
+ });
526
+ if (section.output) {
527
+ console.log(section.output);
528
+ }
529
+ // When --project-local is requested as the only output and the rest
530
+ // of doctor printed nothing project-local-specific, fold result exit
531
+ // into our own findings.
532
+ if (onlyProjectLocal && section.hasFailures) {
533
+ return { exitCode: 1, message: '' };
534
+ }
535
+ }
536
+ catch {
537
+ // Project-local section is non-fatal for doctor
538
+ }
539
+ // Canonical workspace-context graph diagnostics (#1811). Legacy projects
540
+ // remain valid; drift, loops, conflicts, and possible credentials fail.
541
+ try {
542
+ const { diagnoseWorkspaceContext } = await import('../../smiths/context-pipeline/workspace-context.js');
543
+ const diagnostics = await diagnoseWorkspaceContext(ctx.cwd || process.cwd());
544
+ console.log('\n── Workspace context graph ──');
545
+ for (const diagnostic of diagnostics) {
546
+ const mark = diagnostic.severity === 'error' ? '✗' : diagnostic.severity === 'warning' ? '⚠' : '✓';
547
+ console.log(` ${mark} ${diagnostic.message}`);
548
+ }
549
+ if (diagnostics.some((item) => item.severity === 'error'))
550
+ return { exitCode: 1, message: '' };
551
+ }
552
+ catch (error) {
553
+ console.log(`\n── Workspace context graph ──\n ⚠ unable to audit: ${error instanceof Error ? error.message : String(error)}`);
554
+ }
555
+ return result;
556
+ },
557
+ };
558
+ /**
559
+ * Handler for update command
560
+ *
561
+ * Updates AIWG and re-deploys installed frameworks/addons.
562
+ * - Checks for npm/git updates first
563
+ * - Reads .aiwg/frameworks/registry.json to detect installed items
564
+ * - Re-deploys only those (preserving the user's current selection)
565
+ * - Use --all to deploy everything (equivalent to `aiwg use all`)
566
+ *
567
+ * Usage:
568
+ * aiwg update # Update + re-deploy installed frameworks
569
+ * aiwg update --all # Update + deploy everything
570
+ * aiwg update --dry-run # Show what would be updated
571
+ * aiwg update --provider <name> # Pass through provider to deployment
572
+ * aiwg update --skip-check # Skip npm/git update check, only re-deploy
573
+ *
574
+ * @issue #342
575
+ */
576
+ export const updateHandler = {
577
+ id: 'update',
578
+ name: 'Update',
579
+ description: 'Update AIWG and re-deploy installed frameworks',
580
+ category: 'maintenance',
581
+ aliases: ['-update', '--update'],
582
+ async execute(ctx) {
583
+ const args = ctx.args;
584
+ const deployAll = args.includes('--all');
585
+ const dryRun = args.includes('--dry-run');
586
+ const skipCheck = args.includes('--skip-check');
587
+ // Extract --provider value if present
588
+ const providerIdx = args.findIndex(a => a === '--provider' || a === '--platform');
589
+ const providerArgs = providerIdx >= 0 && args[providerIdx + 1]
590
+ ? ['--provider', args[providerIdx + 1]]
591
+ : [];
592
+ // Step 1: Check for package updates (unless --skip-check)
593
+ if (!skipCheck) {
594
+ try {
595
+ console.log('Checking for AIWG updates...\n');
596
+ await forceUpdateCheck();
597
+ }
598
+ catch (error) {
599
+ console.error(`Warning: Update check failed: ${error instanceof Error ? error.message : String(error)}`);
600
+ console.log('Continuing with re-deployment...\n');
601
+ }
602
+ }
603
+ // Step 2: Determine what to re-deploy
604
+ if (deployAll) {
605
+ // --all: deploy everything (equivalent to `aiwg use all`)
606
+ const frameworks = ['all'];
607
+ if (dryRun) {
608
+ console.log('Dry run: Would re-deploy all frameworks and addons');
609
+ return { exitCode: 0 };
610
+ }
611
+ console.log('Re-deploying all frameworks and addons...\n');
612
+ const result = await useFrameworkHandler.execute({
613
+ ...ctx,
614
+ args: [...frameworks, ...providerArgs],
615
+ });
616
+ return result;
617
+ }
618
+ // Read registry to determine installed frameworks
619
+ const registry = readFrameworkRegistry(ctx.cwd);
620
+ if (!registry || registry.frameworks.length === 0) {
621
+ console.log('No frameworks found in .aiwg/frameworks/registry.json');
622
+ console.log('');
623
+ console.log('To deploy a framework first, run:');
624
+ console.log(' aiwg use sdlc');
625
+ console.log(' aiwg use marketing');
626
+ console.log(' aiwg use all');
627
+ return { exitCode: 0 };
628
+ }
629
+ // Map registry IDs to framework use-names
630
+ const installedFrameworks = [];
631
+ const unmapped = [];
632
+ for (const fw of registry.frameworks) {
633
+ const useName = REGISTRY_ID_TO_USE_NAME[fw.id];
634
+ if (useName) {
635
+ installedFrameworks.push(useName);
636
+ }
637
+ else {
638
+ unmapped.push(fw.id);
639
+ }
640
+ }
641
+ if (installedFrameworks.length === 0) {
642
+ console.log('No recognized frameworks in registry');
643
+ if (unmapped.length > 0) {
644
+ console.log(`Unrecognized entries: ${unmapped.join(', ')}`);
645
+ }
646
+ return { exitCode: 0 };
647
+ }
648
+ // Report what will be updated
649
+ console.log(`Installed frameworks: ${installedFrameworks.join(', ')}`);
650
+ if (unmapped.length > 0) {
651
+ console.log(`Skipping unrecognized: ${unmapped.join(', ')}`);
652
+ }
653
+ console.log('');
654
+ if (dryRun) {
655
+ console.log('Dry run: Would re-deploy the following frameworks:');
656
+ for (const fw of installedFrameworks) {
657
+ console.log(` - ${fw}`);
658
+ }
659
+ return { exitCode: 0 };
660
+ }
661
+ // Step 3: Re-deploy each installed framework
662
+ const results = [];
663
+ for (const fw of installedFrameworks) {
664
+ console.log(`Re-deploying ${fw}...`);
665
+ const result = await useFrameworkHandler.execute({
666
+ ...ctx,
667
+ args: [fw, ...providerArgs],
668
+ });
669
+ results.push({ framework: fw, exitCode: result.exitCode });
670
+ if (result.exitCode !== 0) {
671
+ console.error(`Warning: Failed to re-deploy ${fw}`);
672
+ }
673
+ }
674
+ // Step 4: Report summary
675
+ console.log('');
676
+ console.log('Update Summary:');
677
+ const succeeded = results.filter(r => r.exitCode === 0);
678
+ const failed = results.filter(r => r.exitCode !== 0);
679
+ for (const r of results) {
680
+ const status = r.exitCode === 0 ? 'updated' : 'FAILED';
681
+ console.log(` ${r.framework}: ${status}`);
682
+ }
683
+ console.log('');
684
+ console.log(`Updated: ${succeeded.length}/${results.length}`);
685
+ return {
686
+ exitCode: failed.length > 0 ? 1 : 0,
687
+ message: failed.length > 0
688
+ ? `Some frameworks failed to update: ${failed.map(f => f.framework).join(', ')}`
689
+ : `Successfully updated ${succeeded.length} framework(s)`,
690
+ };
691
+ },
692
+ };
693
+ /**
694
+ * All utility handlers
695
+ */
696
+ export const utilityHandlers = [
697
+ prefillCardsHandler,
698
+ contributeStartHandler,
699
+ validateMetadataHandler,
700
+ doctorHandler,
701
+ updateHandler,
702
+ ];
703
+ //# sourceMappingURL=utilities.js.map