@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,368 @@
1
+ /**
2
+ * Extension Registry
3
+ *
4
+ * Provides efficient storage, indexing, and retrieval of AIWG extensions.
5
+ * Supports O(1) lookup by ID, type-based indexing, and command alias resolution.
6
+ *
7
+ * @architecture @.aiwg/architecture/unified-extension-schema.md
8
+ * @tests @test/unit/extensions/registry.test.ts
9
+ * @version 1.0.0
10
+ */
11
+ /**
12
+ * Extension registry for storing and querying extensions
13
+ *
14
+ * Maintains multiple indexes for efficient lookup:
15
+ * - Primary storage: Map<id, Extension> for O(1) lookup by ID
16
+ * - Type index: Map<type, Set<id>> for filtering by type
17
+ * - Alias map: Map<alias, id> for command resolution
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const registry = new ExtensionRegistry();
22
+ *
23
+ * // Register an extension
24
+ * registry.register(myExtension);
25
+ *
26
+ * // Lookup by ID (O(1))
27
+ * const ext = registry.get('mention-wire');
28
+ *
29
+ * // Get all commands
30
+ * const commands = registry.getByType('command');
31
+ *
32
+ * // Resolve command alias
33
+ * const id = registry.resolveCommand('wire'); // Returns 'mention-wire'
34
+ * ```
35
+ */
36
+ export class ExtensionRegistry {
37
+ /**
38
+ * Primary storage: extension ID to Extension
39
+ *
40
+ * Provides O(1) lookup by ID.
41
+ */
42
+ extensions = new Map();
43
+ /**
44
+ * Type index: extension type to Set of extension IDs
45
+ *
46
+ * Enables efficient filtering by type.
47
+ */
48
+ byType = new Map();
49
+ /**
50
+ * Alias map: command alias to extension ID
51
+ *
52
+ * Enables O(1) command resolution by name or alias.
53
+ */
54
+ aliasMap = new Map();
55
+ /**
56
+ * Qualified name map: `{namespace}-{id}` to extension ID
57
+ *
58
+ * Enables lookup by canonical namespaced slug (e.g. `aiwg-sync` → `sync`).
59
+ * Only populated for skills/commands that carry a `namespace` field.
60
+ */
61
+ qualifiedNameMap = new Map();
62
+ /**
63
+ * Register an extension in the registry
64
+ *
65
+ * If an extension with the same ID already exists, it will be replaced.
66
+ * Automatically updates type index and registers command aliases.
67
+ *
68
+ * @param extension - Extension to register
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * registry.register({
73
+ * id: 'mention-wire',
74
+ * type: 'command',
75
+ * name: 'Mention Wire',
76
+ * // ... other fields
77
+ * });
78
+ * ```
79
+ */
80
+ register(extension) {
81
+ const { id } = extension;
82
+ // If extension already exists, remove it from old type index
83
+ const existing = this.extensions.get(id);
84
+ if (existing) {
85
+ this.removeFromTypeIndex(existing);
86
+ }
87
+ // Store extension
88
+ this.extensions.set(id, extension);
89
+ // Add to type index
90
+ this.addToTypeIndex(extension);
91
+ // Register command aliases if present
92
+ if ((extension.type === 'command' || extension.type === 'skill') && 'aliases' in extension.metadata) {
93
+ const aliases = extension.metadata.aliases;
94
+ if (Array.isArray(aliases)) {
95
+ aliases.forEach((alias) => {
96
+ this.registerAlias(alias, id);
97
+ });
98
+ }
99
+ }
100
+ // Register primary command/skill name
101
+ if (extension.type === 'command' || extension.type === 'skill') {
102
+ this.aliasMap.set(id, id);
103
+ }
104
+ // Register qualified name for namespaced skills/commands
105
+ if ((extension.type === 'skill' || extension.type === 'command') && 'namespace' in extension.metadata) {
106
+ const namespace = extension.metadata.namespace;
107
+ if (namespace) {
108
+ const prefix = `${namespace}-`;
109
+ const qualifiedName = id.startsWith(prefix) ? id : `${prefix}${id}`;
110
+ this.qualifiedNameMap.set(qualifiedName, id);
111
+ }
112
+ }
113
+ }
114
+ /**
115
+ * Get extension by ID
116
+ *
117
+ * O(1) lookup via Map.
118
+ *
119
+ * @param id - Extension ID
120
+ * @returns Extension if found, undefined otherwise
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * const ext = registry.get('mention-wire');
125
+ * if (ext) {
126
+ * console.log(ext.name);
127
+ * }
128
+ * ```
129
+ */
130
+ get(id) {
131
+ return this.extensions.get(id);
132
+ }
133
+ /**
134
+ * Get all extensions of a specific type
135
+ *
136
+ * Uses type index for efficient filtering.
137
+ *
138
+ * @param type - Extension type to filter by
139
+ * @returns Array of extensions of the specified type
140
+ *
141
+ * @example
142
+ * ```typescript
143
+ * const commands = registry.getByType('command');
144
+ * const agents = registry.getByType('agent');
145
+ * ```
146
+ */
147
+ getByType(type) {
148
+ const ids = this.byType.get(type);
149
+ if (!ids || ids.size === 0) {
150
+ return [];
151
+ }
152
+ const extensions = [];
153
+ for (const id of ids) {
154
+ const ext = this.extensions.get(id);
155
+ if (ext) {
156
+ extensions.push(ext);
157
+ }
158
+ }
159
+ return extensions;
160
+ }
161
+ /**
162
+ * Resolve a command name or alias to extension ID
163
+ *
164
+ * O(1) lookup via Map.
165
+ *
166
+ * @param command - Command name or alias
167
+ * @returns Extension ID if found, undefined otherwise
168
+ *
169
+ * @example
170
+ * ```typescript
171
+ * const id = registry.resolveCommand('wire'); // 'mention-wire'
172
+ * const ext = registry.get(id);
173
+ * ```
174
+ */
175
+ resolveCommand(command) {
176
+ return this.aliasMap.get(command);
177
+ }
178
+ /**
179
+ * Register a command alias
180
+ *
181
+ * Associates an alias with an extension ID. The extension does not
182
+ * need to be registered first.
183
+ *
184
+ * @param alias - Command alias
185
+ * @param extensionId - Target extension ID
186
+ *
187
+ * @example
188
+ * ```typescript
189
+ * registry.registerAlias('wire', 'mention-wire');
190
+ * registry.registerAlias('w', 'mention-wire');
191
+ * ```
192
+ */
193
+ registerAlias(alias, extensionId) {
194
+ this.aliasMap.set(alias, extensionId);
195
+ }
196
+ /**
197
+ * Resolve a qualified namespaced name to an extension ID.
198
+ *
199
+ * Accepts either the canonical qualified slug (`aiwg-sync`) or the bare ID (`sync`).
200
+ * Falls back to bare ID lookup when no qualified name match is found.
201
+ *
202
+ * @param qualifiedName - Qualified skill name (e.g. `aiwg-sync`) or bare ID
203
+ * @returns Extension ID if found, undefined otherwise
204
+ *
205
+ * @example
206
+ * ```typescript
207
+ * const id = registry.resolveQualifiedName('aiwg-sync'); // 'sync'
208
+ * const ext = registry.get(id);
209
+ * ```
210
+ */
211
+ resolveQualifiedName(qualifiedName) {
212
+ return this.qualifiedNameMap.get(qualifiedName) ?? this.extensions.get(qualifiedName)?.id;
213
+ }
214
+ /**
215
+ * Get all registered extensions
216
+ *
217
+ * Returns a new array containing all extensions. Modifications to the
218
+ * returned array will not affect the registry.
219
+ *
220
+ * @returns Array of all extensions
221
+ *
222
+ * @example
223
+ * ```typescript
224
+ * const all = registry.getAll();
225
+ * console.log(`Registry contains ${all.length} extensions`);
226
+ * ```
227
+ */
228
+ getAll() {
229
+ return Array.from(this.extensions.values());
230
+ }
231
+ /**
232
+ * Get count of registered extensions
233
+ *
234
+ * @returns Number of extensions in the registry
235
+ *
236
+ * @example
237
+ * ```typescript
238
+ * console.log(`${registry.size} extensions registered`);
239
+ * ```
240
+ */
241
+ get size() {
242
+ return this.extensions.size;
243
+ }
244
+ /**
245
+ * Check if extension exists in registry
246
+ *
247
+ * O(1) lookup via Map.
248
+ *
249
+ * @param id - Extension ID to check
250
+ * @returns True if extension exists, false otherwise
251
+ *
252
+ * @example
253
+ * ```typescript
254
+ * if (registry.has('mention-wire')) {
255
+ * console.log('Extension is registered');
256
+ * }
257
+ * ```
258
+ */
259
+ has(id) {
260
+ return this.extensions.has(id);
261
+ }
262
+ /**
263
+ * Clear the registry
264
+ *
265
+ * Removes all extensions, type index entries, and aliases.
266
+ *
267
+ * @example
268
+ * ```typescript
269
+ * registry.clear();
270
+ * console.log(registry.size); // 0
271
+ * ```
272
+ */
273
+ clear() {
274
+ this.extensions.clear();
275
+ this.byType.clear();
276
+ this.aliasMap.clear();
277
+ this.qualifiedNameMap.clear();
278
+ }
279
+ /**
280
+ * Add extension to type index
281
+ *
282
+ * @private
283
+ * @param extension - Extension to index
284
+ */
285
+ addToTypeIndex(extension) {
286
+ const { id, type } = extension;
287
+ let typeSet = this.byType.get(type);
288
+ if (!typeSet) {
289
+ typeSet = new Set();
290
+ this.byType.set(type, typeSet);
291
+ }
292
+ typeSet.add(id);
293
+ }
294
+ /**
295
+ * Remove extension from type index
296
+ *
297
+ * @private
298
+ * @param extension - Extension to remove from index
299
+ */
300
+ removeFromTypeIndex(extension) {
301
+ const { id, type } = extension;
302
+ const typeSet = this.byType.get(type);
303
+ if (typeSet) {
304
+ typeSet.delete(id);
305
+ // Clean up empty sets
306
+ if (typeSet.size === 0) {
307
+ this.byType.delete(type);
308
+ }
309
+ }
310
+ }
311
+ }
312
+ // ============================================
313
+ // Singleton Instance
314
+ // ============================================
315
+ /**
316
+ * Global registry instance
317
+ *
318
+ * Singleton instance shared across all calls to getRegistry().
319
+ */
320
+ let globalRegistry = null;
321
+ /**
322
+ * Get the global registry instance
323
+ *
324
+ * Returns a singleton ExtensionRegistry instance. All calls to this
325
+ * function return the same instance, allowing state to be shared
326
+ * across the application.
327
+ *
328
+ * @returns Global ExtensionRegistry instance
329
+ *
330
+ * @example
331
+ * ```typescript
332
+ * import { getRegistry } from './registry.js';
333
+ *
334
+ * const registry = getRegistry();
335
+ * registry.register(myExtension);
336
+ *
337
+ * // Later, in another module
338
+ * const sameRegistry = getRegistry();
339
+ * console.log(sameRegistry.has('my-extension')); // true
340
+ * ```
341
+ */
342
+ export function getRegistry() {
343
+ if (!globalRegistry) {
344
+ globalRegistry = new ExtensionRegistry();
345
+ }
346
+ return globalRegistry;
347
+ }
348
+ /**
349
+ * Create a new registry instance
350
+ *
351
+ * Returns a new, independent ExtensionRegistry instance. Use this when
352
+ * you need an isolated registry for testing or scoped operations.
353
+ *
354
+ * @returns New ExtensionRegistry instance
355
+ *
356
+ * @example
357
+ * ```typescript
358
+ * import { createRegistry } from './registry.js';
359
+ *
360
+ * const testRegistry = createRegistry();
361
+ * testRegistry.register(testExtension);
362
+ * // testRegistry is independent of global registry
363
+ * ```
364
+ */
365
+ export function createRegistry() {
366
+ return new ExtensionRegistry();
367
+ }
368
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Shadow Resolver
3
+ *
4
+ * Implements the override / shadow-resolution policy from
5
+ * `.aiwg/architecture/adr-override-shadow-policy.md` (#1041) for project-local
6
+ * artifact bundles deployed via `aiwg use` / `aiwg refresh`.
7
+ *
8
+ * Resolves the seven cases from ADR §4:
9
+ *
10
+ * 1. No collision — deploy normally
11
+ * 2. Non-safety-critical shadow — deploy + warn
12
+ * 3. Safety-critical shadow with `overrides:` declaration — deploy + prominent warn
13
+ * 4. Safety-critical shadow without `overrides:` — REFUSE
14
+ * 5. Phantom override (declared override has no upstream match) — REFUSE
15
+ * 6. Two project-local bundles export the same id — REFUSE both
16
+ * 7. git-installed source collides with project-local — same as 2/3/4 against cache
17
+ *
18
+ * Inputs: the project-local bundles (from `discoverProjectLocalBundles`) and
19
+ * an upstream registry (from `buildUpstreamRegistry`). Outputs a per-artifact
20
+ * verdict that the deployment pipeline consumes to decide what to write to
21
+ * provider paths.
22
+ *
23
+ * @implements #1036
24
+ */
25
+ import { readdir, readFile, stat } from 'fs/promises';
26
+ import { join, basename } from 'path';
27
+ const ARTIFACT_DIRS = {
28
+ agents: 'agent',
29
+ skills: 'skill',
30
+ rules: 'rule',
31
+ commands: 'command',
32
+ };
33
+ const FRONTMATTER_RE = /^---\s*\n([\s\S]*?)\n---/;
34
+ const ID_LINE_RE = /^id\s*:\s*['"]?([^'"\n]+?)['"]?\s*$/m;
35
+ const NAME_LINE_RE = /^name\s*:\s*['"]?([^'"\n]+?)['"]?\s*$/m;
36
+ function parseId(raw) {
37
+ const m = FRONTMATTER_RE.exec(raw);
38
+ if (!m)
39
+ return {};
40
+ return {
41
+ id: ID_LINE_RE.exec(m[1])?.[1]?.trim(),
42
+ name: NAME_LINE_RE.exec(m[1])?.[1]?.trim(),
43
+ };
44
+ }
45
+ /** Enumerate the artifacts a project-local bundle would deploy by walking its
46
+ * source `agents/`, `skills/`, `rules/`, `commands/` subdirs — same pattern as
47
+ * `deployOneProjectLocalBundle` and `countBundleSourceArtifacts` in use.ts. */
48
+ export async function enumerateBundleArtifacts(bundlePath) {
49
+ const out = [];
50
+ for (const [dirName, type] of Object.entries(ARTIFACT_DIRS)) {
51
+ const artifactDir = join(bundlePath, dirName);
52
+ let entries;
53
+ try {
54
+ entries = await readdir(artifactDir);
55
+ }
56
+ catch {
57
+ continue;
58
+ }
59
+ if (type === 'skill') {
60
+ for (const entry of entries) {
61
+ const skillDir = join(artifactDir, entry);
62
+ try {
63
+ const st = await stat(skillDir);
64
+ if (!st.isDirectory())
65
+ continue;
66
+ }
67
+ catch {
68
+ continue;
69
+ }
70
+ let id = entry;
71
+ try {
72
+ const skillMd = await readFile(join(skillDir, 'SKILL.md'), 'utf-8');
73
+ const fm = parseId(skillMd);
74
+ id = fm.name ?? fm.id ?? entry;
75
+ }
76
+ catch {
77
+ // No SKILL.md — fall back to dir name
78
+ }
79
+ out.push({ id, type, sourcePath: skillDir });
80
+ }
81
+ continue;
82
+ }
83
+ for (const entry of entries) {
84
+ if (!entry.endsWith('.md'))
85
+ continue;
86
+ if (entry === 'README.md' || entry === 'RULES-INDEX.md' || entry === 'INDEX.md')
87
+ continue;
88
+ const filePath = join(artifactDir, entry);
89
+ let id = basename(entry, '.md');
90
+ try {
91
+ const raw = await readFile(filePath, 'utf-8');
92
+ const fm = parseId(raw);
93
+ id = fm.id ?? fm.name ?? id;
94
+ }
95
+ catch {
96
+ // Read failure — fall back to filename
97
+ }
98
+ out.push({ id, type, sourcePath: filePath });
99
+ }
100
+ }
101
+ return out;
102
+ }
103
+ /** Resolve overrides + shadows for a set of project-local bundles against an
104
+ * upstream registry. Pure function — no filesystem side effects beyond reading
105
+ * the bundle artifact files for id extraction. */
106
+ export async function resolveShadows(bundles, upstream, options = {}) {
107
+ const strictPhantomOverrides = options.strictPhantomOverrides ?? true;
108
+ const resolutions = [];
109
+ const blockedBundleIds = new Set();
110
+ // Pre-pass: case 6 — duplicate project-local bundle ids (cross-bundle, by
111
+ // artifact id+type). Discovery already rejects same-type duplicate bundle
112
+ // ids (#1041 §4 case 6 at the bundle level); here we additionally guard
113
+ // against two distinct bundles exporting an artifact with the same id+type.
114
+ const projectLocalArtifacts = new Map();
115
+ // Enumerate every artifact in every bundle once.
116
+ const enumerated = [];
117
+ for (const bundle of bundles) {
118
+ const arts = await enumerateBundleArtifacts(bundle.bundlePath);
119
+ enumerated.push({ bundle, arts });
120
+ for (const art of arts) {
121
+ const key = `${art.type}:${art.id}`;
122
+ const list = projectLocalArtifacts.get(key) ?? [];
123
+ list.push({ bundle, art });
124
+ projectLocalArtifacts.set(key, list);
125
+ }
126
+ }
127
+ for (const { bundle, arts } of enumerated) {
128
+ const declaredOverrides = new Set(bundle.manifest.overrides ?? []);
129
+ // Case 5 pre-pass: validate every declared override resolves to *some*
130
+ // upstream artifact (any type). Phantom overrides refuse the bundle.
131
+ for (const overrideId of declaredOverrides) {
132
+ if (!upstream.byId.has(overrideId)) {
133
+ resolutions.push({
134
+ bundleId: bundle.id,
135
+ bundleLocalPath: bundle.localPath,
136
+ artifactId: overrideId,
137
+ artifactType: 'rule', // unknown — picked nominal type for surface
138
+ artifactSourcePath: bundle.manifestPath,
139
+ verdict: 'refuse-phantom',
140
+ message: `Phantom override: '${overrideId}' declared in ${bundle.manifestPath} but no upstream artifact has that id.`,
141
+ blocking: strictPhantomOverrides,
142
+ prominent: false,
143
+ });
144
+ if (strictPhantomOverrides)
145
+ blockedBundleIds.add(bundle.id);
146
+ }
147
+ }
148
+ for (const art of arts) {
149
+ const key = `${art.type}:${art.id}`;
150
+ // Case 6 — duplicate project-local artifact id+type across bundles
151
+ const projectLocalGroup = projectLocalArtifacts.get(key) ?? [];
152
+ if (projectLocalGroup.length > 1) {
153
+ const others = projectLocalGroup
154
+ .filter((p) => p.bundle.id !== bundle.id)
155
+ .map((p) => p.bundle.localPath);
156
+ resolutions.push({
157
+ bundleId: bundle.id,
158
+ bundleLocalPath: bundle.localPath,
159
+ artifactId: art.id,
160
+ artifactType: art.type,
161
+ artifactSourcePath: art.sourcePath,
162
+ verdict: 'refuse-duplicate',
163
+ message: `Duplicate project-local ${art.type} '${art.id}' also exported by: ${others.join(', ')}`,
164
+ blocking: true,
165
+ prominent: false,
166
+ });
167
+ blockedBundleIds.add(bundle.id);
168
+ continue;
169
+ }
170
+ const upstreamMatch = upstream.byKey.get(key);
171
+ // Case 1 — no collision
172
+ if (!upstreamMatch) {
173
+ resolutions.push({
174
+ bundleId: bundle.id,
175
+ bundleLocalPath: bundle.localPath,
176
+ artifactId: art.id,
177
+ artifactType: art.type,
178
+ artifactSourcePath: art.sourcePath,
179
+ verdict: 'deploy',
180
+ message: '',
181
+ blocking: false,
182
+ prominent: false,
183
+ });
184
+ continue;
185
+ }
186
+ const acknowledged = declaredOverrides.has(art.id);
187
+ if (upstreamMatch.safetyCritical) {
188
+ if (acknowledged) {
189
+ // Case 3 — safety-critical with explicit override
190
+ resolutions.push({
191
+ bundleId: bundle.id,
192
+ bundleLocalPath: bundle.localPath,
193
+ artifactId: art.id,
194
+ artifactType: art.type,
195
+ artifactSourcePath: art.sourcePath,
196
+ upstream: upstreamMatch,
197
+ verdict: 'deploy-acknowledged',
198
+ message: `SAFETY-CRITICAL SHADOW: ${art.type} '${art.id}' overridden by ${art.sourcePath}.\n` +
199
+ ` Acknowledge: this disables upstream safeguard at ${upstreamMatch.sourcePath}.\n` +
200
+ ` Use 'aiwg doctor' to review all active shadows.`,
201
+ blocking: false,
202
+ prominent: true,
203
+ });
204
+ }
205
+ else {
206
+ // Case 4 — refuse
207
+ resolutions.push({
208
+ bundleId: bundle.id,
209
+ bundleLocalPath: bundle.localPath,
210
+ artifactId: art.id,
211
+ artifactType: art.type,
212
+ artifactSourcePath: art.sourcePath,
213
+ upstream: upstreamMatch,
214
+ verdict: 'refuse-unsafe',
215
+ message: `Refused to shadow safety-critical upstream ${art.type} '${art.id}'. ` +
216
+ `Add 'overrides: ["${art.id}"]' to ${bundle.manifestPath} to authorize the override.`,
217
+ blocking: true,
218
+ prominent: true,
219
+ });
220
+ blockedBundleIds.add(bundle.id);
221
+ }
222
+ continue;
223
+ }
224
+ // Case 2 — non-safety shadow
225
+ const sourceLabel = upstreamMatch.source === 'cache' ? 'git-installed' : 'bundled';
226
+ resolutions.push({
227
+ bundleId: bundle.id,
228
+ bundleLocalPath: bundle.localPath,
229
+ artifactId: art.id,
230
+ artifactType: art.type,
231
+ artifactSourcePath: art.sourcePath,
232
+ upstream: upstreamMatch,
233
+ verdict: 'deploy-with-warning',
234
+ message: `Shadow: ${art.type} '${art.id}' — project-local at ${art.sourcePath} ` +
235
+ `overrides ${sourceLabel} at ${upstreamMatch.sourcePath}`,
236
+ blocking: false,
237
+ prominent: false,
238
+ });
239
+ }
240
+ }
241
+ const shadows = resolutions.filter((r) => r.upstream !== undefined);
242
+ return { resolutions, blockedBundleIds, shadows };
243
+ }
244
+ /** Format a multi-resolution summary suitable for stderr or doctor output. */
245
+ export function formatShadowReport(result) {
246
+ if (result.resolutions.length === 0)
247
+ return '';
248
+ const lines = [];
249
+ const blockers = result.resolutions.filter((r) => r.blocking);
250
+ const warnings = result.resolutions.filter((r) => !r.blocking && (r.verdict === 'deploy-with-warning' || r.verdict === 'deploy-acknowledged'));
251
+ if (blockers.length > 0) {
252
+ lines.push('── Project-local shadow resolution: blocked artifacts ──');
253
+ for (const r of blockers) {
254
+ lines.push(` ✗ [${r.verdict}] ${r.bundleId} :: ${r.artifactType}/${r.artifactId}`);
255
+ for (const ml of r.message.split('\n'))
256
+ lines.push(` ${ml}`);
257
+ }
258
+ lines.push('');
259
+ }
260
+ if (warnings.length > 0) {
261
+ lines.push('── Project-local shadows ──');
262
+ for (const r of warnings) {
263
+ const marker = r.prominent ? '!!' : '⚠';
264
+ lines.push(` ${marker} [${r.verdict}] ${r.bundleId} :: ${r.artifactType}/${r.artifactId}`);
265
+ for (const ml of r.message.split('\n'))
266
+ lines.push(` ${ml}`);
267
+ }
268
+ }
269
+ return lines.join('\n');
270
+ }
271
+ //# sourceMappingURL=shadow-resolver.js.map