@aiwg/cli 2026.10.3 → 2026.10.4

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 (279) hide show
  1. package/README.md +2 -2
  2. package/agentic/code/providers/model-capabilities.v1.json +96 -4
  3. package/bin/aiwg.mjs +50 -27
  4. package/dist/src/agents/grounding/knowledge-base.js +54 -6
  5. package/dist/src/artifacts/browser-export.js +6 -0
  6. package/dist/src/artifacts/checksum-manifest.js +1 -0
  7. package/dist/src/artifacts/citation-parser.js +173 -92
  8. package/dist/src/artifacts/citation-table-schema.js +59 -0
  9. package/dist/src/artifacts/cli.js +57 -18
  10. package/dist/src/artifacts/corpus-tools/snapshot.js +1 -1
  11. package/dist/src/artifacts/corpus-tools/vision-extract.js +2 -0
  12. package/dist/src/artifacts/corpus-views/ref-parser.js +3 -1
  13. package/dist/src/artifacts/corpus-views/renderers.js +3 -3
  14. package/dist/src/artifacts/discovery-eval.js +6 -4
  15. package/dist/src/artifacts/fortemi-core-query-adapter.js +36 -3
  16. package/dist/src/artifacts/fortemi-core-sync.js +166 -40
  17. package/dist/src/artifacts/framework-capabilities.js +171 -0
  18. package/dist/src/artifacts/framework-index-paths.js +73 -0
  19. package/dist/src/artifacts/framework-source-digest.js +75 -0
  20. package/dist/src/artifacts/index-builder.js +285 -131
  21. package/dist/src/artifacts/index-files.js +132 -18
  22. package/dist/src/artifacts/index-preparation.js +65 -0
  23. package/dist/src/artifacts/index-refresh.js +576 -0
  24. package/dist/src/artifacts/index-worker.mjs +9 -0
  25. package/dist/src/artifacts/prebuilt-build-lock.js +47 -4
  26. package/dist/src/artifacts/prebuilt-deployment.js +46 -0
  27. package/dist/src/artifacts/prebuilt-relations.js +80 -0
  28. package/dist/src/artifacts/query-engine.js +410 -88
  29. package/dist/src/artifacts/relations-builder.js +168 -0
  30. package/dist/src/artifacts/relations.js +148 -0
  31. package/dist/src/artifacts/stats.js +5 -2
  32. package/dist/src/artifacts/types.js +30 -10
  33. package/dist/src/artifacts/watcher.js +1 -1
  34. package/dist/src/auth/credential-store.js +2 -1
  35. package/dist/src/catalog/cli.d.mts +5 -0
  36. package/dist/src/channel/manager.d.mts +20 -0
  37. package/dist/src/channel/manager.mjs +19 -2
  38. package/dist/src/cli/command-log.js +2 -3
  39. package/dist/src/cli/handlers/artifacts.js +3 -0
  40. package/dist/src/cli/handlers/auth.js +3 -0
  41. package/dist/src/cli/handlers/decision.js +19 -12
  42. package/dist/src/cli/handlers/diagnose.js +4 -3
  43. package/dist/src/cli/handlers/effect.js +4 -2
  44. package/dist/src/cli/handlers/evidence.js +3 -0
  45. package/dist/src/cli/handlers/help.js +1 -0
  46. package/dist/src/cli/handlers/index.js +3 -1
  47. package/dist/src/cli/handlers/init.js +4 -1
  48. package/dist/src/cli/handlers/lint.js +5 -0
  49. package/dist/src/cli/handlers/models.js +104 -8
  50. package/dist/src/cli/handlers/ralph-launcher.js +2 -0
  51. package/dist/src/cli/handlers/refresh.js +12 -0
  52. package/dist/src/cli/handlers/resource-versions.js +3 -0
  53. package/dist/src/cli/handlers/rules.js +195 -0
  54. package/dist/src/cli/handlers/run.js +4 -0
  55. package/dist/src/cli/handlers/runtime-info.js +1 -2
  56. package/dist/src/cli/handlers/script-runner.js +3 -2
  57. package/dist/src/cli/handlers/session.js +19 -9
  58. package/dist/src/cli/handlers/sessions.js +98 -37
  59. package/dist/src/cli/handlers/setup-manifest.js +39 -44
  60. package/dist/src/cli/handlers/setup.js +41 -0
  61. package/dist/src/cli/handlers/steward.js +11 -0
  62. package/dist/src/cli/handlers/subcommands.js +57 -2
  63. package/dist/src/cli/handlers/uhp.js +3 -0
  64. package/dist/src/cli/handlers/use.js +294 -55
  65. package/dist/src/cli/handlers/utilities.js +26 -10
  66. package/dist/src/cli/handlers/version.js +8 -0
  67. package/dist/src/cli/router.js +15 -1
  68. package/dist/src/cli/services/deployment-verification.js +19 -9
  69. package/dist/src/cli/services/provider-prepare-coordinator.js +24 -0
  70. package/dist/src/cli/skill-usage.js +2 -3
  71. package/dist/src/config/aiwg-config.js +87 -37
  72. package/dist/src/config/cli.js +111 -5
  73. package/dist/src/config/decision-config.js +106 -0
  74. package/dist/src/config/dispatch-thresholds-runtime.d.mts +8 -0
  75. package/dist/src/config/gitignore.js +50 -0
  76. package/dist/src/config/index-graph-overrides.js +36 -0
  77. package/dist/src/config/project-artifacts-health.d.mts +37 -0
  78. package/dist/src/config/project-artifacts-runtime.d.mts +16 -0
  79. package/dist/src/config/user-config-dir.d.mts +9 -0
  80. package/dist/src/config/user-config.js +2 -1
  81. package/dist/src/config/user-registry.js +23 -15
  82. package/dist/src/config/user-state.js +7 -0
  83. package/dist/src/decision/ask.js +203 -43
  84. package/dist/src/decision/context-live-qualification.js +2 -2
  85. package/dist/src/decision/driver.js +13 -8
  86. package/dist/src/decision/ensemble/aggregate.js +23 -10
  87. package/dist/src/decision/ensemble-study/multifact-study.js +6 -2
  88. package/dist/src/decision/entry.js +2 -15
  89. package/dist/src/decision/graph-live-qualification.js +1 -1
  90. package/dist/src/decision/graph-run.js +9 -0
  91. package/dist/src/decision/heldout/collector.js +5 -13
  92. package/dist/src/decision/heldout/contract.js +30 -7
  93. package/dist/src/decision/jev-credentials.js +15 -1
  94. package/dist/src/decision/ledger.js +131 -28
  95. package/dist/src/decision/offload-activation.js +137 -0
  96. package/dist/src/decision/offload.js +550 -0
  97. package/dist/src/decision/qualification/load.js +4 -6
  98. package/dist/src/decision/savings.js +28 -0
  99. package/dist/src/effects/types.js +5 -1
  100. package/dist/src/effects/verifiers/git.js +2 -1
  101. package/dist/src/effects/verifiers/tracker.js +26 -14
  102. package/dist/src/extensions/commands/definitions.js +19 -0
  103. package/dist/src/extensions/project-local-remove.js +36 -1
  104. package/dist/src/gates/providers/loader.js +61 -17
  105. package/dist/src/installation/manager-command.d.mts +18 -0
  106. package/dist/src/installation/manager-command.mjs +14 -2
  107. package/dist/src/installation/manager.d.mts +49 -0
  108. package/dist/src/installation/manager.mjs +78 -3
  109. package/dist/src/issues/cli.js +4 -4
  110. package/dist/src/issues/local.js +24 -5
  111. package/dist/src/jobs/runner.js +1 -1
  112. package/dist/src/lint/cli.js +27 -1
  113. package/dist/src/lint/loader.js +2 -1
  114. package/dist/src/lint/reporters.js +25 -1
  115. package/dist/src/lint/rule-activation.js +43 -0
  116. package/dist/src/lint/runner.js +137 -62
  117. package/dist/src/mcp/adapters/codex-runtime.js +7 -1
  118. package/dist/src/mcp/claude-install.d.mts +4 -0
  119. package/dist/src/mcp/claude-install.mjs +41 -0
  120. package/dist/src/mcp/cli.d.mts +1 -0
  121. package/dist/src/mcp/cli.mjs +36 -11
  122. package/dist/src/mcp/config-file.d.mts +28 -0
  123. package/dist/src/mcp/config-layers.d.mts +36 -0
  124. package/dist/src/mcp/credentials.d.mts +51 -0
  125. package/dist/src/mcp/grok-build-config.d.mts +6 -0
  126. package/dist/src/mcp/grok-build-config.mjs +1 -1
  127. package/dist/src/mcp/helpers.mjs +3 -2
  128. package/dist/src/mcp/muse-native-config.d.mts +13 -0
  129. package/dist/src/mcp/muse-native-config.mjs +1 -0
  130. package/dist/src/mcp/omp-config.d.mts +4 -0
  131. package/dist/src/mcp/registry.js +3 -93
  132. package/dist/src/mcp/registry.mjs +3 -87
  133. package/dist/src/mcp/server-config.d.mts +3 -0
  134. package/dist/src/mcp/server-config.mjs +89 -0
  135. package/dist/src/mcp/server.mjs +37 -375
  136. package/dist/src/mcp/test-simple.mjs +2 -1
  137. package/dist/src/mcp/toml-editor.d.mts +4 -0
  138. package/dist/src/mcp/toml-string.d.mts +1 -0
  139. package/dist/src/mcp/toml-strip-mcp.d.mts +1 -0
  140. package/dist/src/mcp/tool-filters.d.mts +46 -0
  141. package/dist/src/mcp/tools/decision.mjs +12 -11
  142. package/dist/src/mcp/tools/discovery.mjs +62 -55
  143. package/dist/src/mcp/tools/orchestration.mjs +12 -2
  144. package/dist/src/mcp/tools/worker-invoke.mjs +1340 -23
  145. package/dist/src/mcp/tools/worker-shell-control.mjs +52 -21
  146. package/dist/src/mcp/tools/worker-stdin-runtime.mjs +3 -3
  147. package/dist/src/mission-protocol/codecs.js +8 -0
  148. package/dist/src/models/config-loader.js +7 -2
  149. package/dist/src/models/model-capabilities.v1.json +96 -4
  150. package/dist/src/models/model-discovery.js +76 -11
  151. package/dist/src/models/provider-policy.js +101 -7
  152. package/dist/src/models/qualification-digest.d.mts +2 -0
  153. package/dist/src/models/resolver.js +12 -10
  154. package/dist/src/models/worker-direct-readiness.js +65 -44
  155. package/dist/src/models/worker-dispatch-offer.js +3 -3
  156. package/dist/src/models/worker-health-readiness.js +16 -3
  157. package/dist/src/models/worker-installation.d.mts +39 -0
  158. package/dist/src/models/worker-installation.mjs +135 -28
  159. package/dist/src/process/bounded-child-process.d.mts +84 -0
  160. package/dist/src/process/bounded-child-process.mjs +43 -0
  161. package/dist/src/process/cli-command.d.mts +16 -0
  162. package/dist/src/process/signal-child.d.mts +6 -0
  163. package/dist/src/process/signal-child.mjs +7 -0
  164. package/dist/src/providers/deployed-skill-roots.js +20 -0
  165. package/dist/src/providers/grok-build-acp.js +3 -2
  166. package/dist/src/providers/grok-build-headless.js +12 -4
  167. package/dist/src/providers/grok-build-inspect.js +1 -0
  168. package/dist/src/providers/omp-agent.d.mts +8 -0
  169. package/dist/src/providers/omp-diagnostics.d.mts +1 -0
  170. package/dist/src/providers/omp-paths.d.mts +13 -0
  171. package/dist/src/providers/skill-ownership.d.mts +9 -0
  172. package/dist/src/providers/skill-ownership.mjs +88 -0
  173. package/dist/src/rules/activation.d.mts +21 -0
  174. package/dist/src/rules/activation.mjs +62 -0
  175. package/dist/src/rules/inline-budget.d.mts +26 -0
  176. package/dist/src/rules/inline-budget.mjs +66 -0
  177. package/dist/src/rules/inventory.js +129 -0
  178. package/dist/src/rules/pin-state.js +73 -0
  179. package/dist/src/rules/pins.d.mts +14 -0
  180. package/dist/src/rules/pins.mjs +112 -0
  181. package/dist/src/rules/rule-frontmatter.schema.json +197 -0
  182. package/dist/src/serve/mission-conductor.js +38 -12
  183. package/dist/src/serve/worker-invocation.js +30 -10
  184. package/dist/src/serve/worker-stdin-frame.d.mts +10 -0
  185. package/dist/src/sessions/adapter-registry.js +23 -19
  186. package/dist/src/sessions/adapters/claude.js +39 -54
  187. package/dist/src/sessions/adapters/codex.js +82 -67
  188. package/dist/src/sessions/adapters/copilot.js +4 -4
  189. package/dist/src/sessions/adapters/cursor.js +40 -57
  190. package/dist/src/sessions/adapters/deepseek-harness.js +15 -12
  191. package/dist/src/sessions/adapters/factory.js +31 -27
  192. package/dist/src/sessions/adapters/generic.js +10 -10
  193. package/dist/src/sessions/adapters/grok-build.js +11 -11
  194. package/dist/src/sessions/adapters/grokbot.js +24 -13
  195. package/dist/src/sessions/adapters/hermes.js +27 -29
  196. package/dist/src/sessions/adapters/muse-workspace-scan.js +31 -11
  197. package/dist/src/sessions/adapters/muse.js +150 -93
  198. package/dist/src/sessions/adapters/omp.js +28 -14
  199. package/dist/src/sessions/adapters/openclaw.js +89 -79
  200. package/dist/src/sessions/adapters/opencode.js +27 -24
  201. package/dist/src/sessions/adapters/openhuman.js +18 -60
  202. package/dist/src/sessions/adapters/pi.js +29 -14
  203. package/dist/src/sessions/adapters/warp.js +3 -3
  204. package/dist/src/sessions/adapters/windsurf.js +19 -48
  205. package/dist/src/sessions/batch-contracts.js +16 -8
  206. package/dist/src/sessions/batch-import.js +51 -11
  207. package/dist/src/sessions/contracts.js +40 -2
  208. package/dist/src/sessions/coverage-preflight.js +1 -1
  209. package/dist/src/sessions/export-plan.js +4 -3
  210. package/dist/src/sessions/import-exclusions.js +72 -0
  211. package/dist/src/sessions/import-lease.js +34 -18
  212. package/dist/src/sessions/import-limits.js +37 -0
  213. package/dist/src/sessions/importer.js +60 -38
  214. package/dist/src/sessions/lifecycle.js +45 -0
  215. package/dist/src/sessions/policy.js +133 -25
  216. package/dist/src/sessions/readers.js +106 -53
  217. package/dist/src/sessions/refresh.js +106 -0
  218. package/dist/src/sessions/repository.js +147 -52
  219. package/dist/src/sessions/workspace-discovery.js +221 -56
  220. package/dist/src/sessions/workspace-matching.js +107 -0
  221. package/dist/src/skills/importer.js +1 -0
  222. package/dist/src/smiths/context-pipeline/aiwg-md.js +11 -0
  223. package/dist/src/smiths/context-pipeline/claude-hook.js +3 -26
  224. package/dist/src/smiths/context-pipeline/finalization.js +6 -5
  225. package/dist/src/smiths/context-pipeline/generator.js +21 -4
  226. package/dist/src/smiths/context-pipeline/parallelism-section.js +7 -15
  227. package/dist/src/smiths/mcpsmith/generator.js +1 -1
  228. package/dist/src/smiths/toolsmith/runtime-discovery.d.mts +10 -0
  229. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +76 -18
  230. package/dist/src/storage/backends/fs.js +18 -76
  231. package/dist/src/storage/backends/obsidian.js +1 -0
  232. package/dist/src/tracker/forge-http.js +2 -1
  233. package/dist/src/update/checker.d.mts +2 -0
  234. package/dist/src/update/service.d.mts +22 -0
  235. package/dist/src/utils/contained-filesystem.d.mts +37 -0
  236. package/dist/src/utils/contained-filesystem.mjs +683 -0
  237. package/dist/src/utils/temporary-directory.js +36 -0
  238. package/dist/src/writing/example-generator.js +1 -1
  239. package/package.json +15 -2
  240. package/schemas/models/model-catalog.v1.schema.json +1 -1
  241. package/schemas/models/provider-model-capabilities.v1.schema.json +6 -0
  242. package/tools/_resolve-impl.mjs +13 -15
  243. package/tools/agents/deploy-agents.mjs +49 -21
  244. package/tools/agents/providers/base.mjs +104 -134
  245. package/tools/agents/providers/claude.mjs +8 -24
  246. package/tools/agents/providers/codex.mjs +18 -11
  247. package/tools/agents/providers/cursor.mjs +19 -18
  248. package/tools/agents/providers/grok-build.mjs +3 -1
  249. package/tools/agents/providers/hermes.mjs +57 -47
  250. package/tools/agents/providers/openclaw.mjs +9 -4
  251. package/tools/agents/providers/pi.mjs +5 -0
  252. package/tools/agents/providers/provider-prepare-channel.mjs +5 -0
  253. package/tools/agents/providers/provider-prepare-coordinator.mjs +247 -0
  254. package/tools/agents/providers/provider-prepare-worker.mjs +84 -0
  255. package/tools/agents/providers/rule-delivery.mjs +1270 -0
  256. package/tools/agents/providers/warp.mjs +20 -26
  257. package/tools/cli/decision-offload-report.mjs +40 -0
  258. package/tools/cli/workspace-status.mjs +862 -0
  259. package/tools/plugin/package-plugins.mjs +186 -8
  260. package/tools/plugin/plugin-links.mjs +114 -0
  261. package/tools/providers/antigravity-transport.mjs +3 -1
  262. package/tools/providers/deepseek-harness-transport.mjs +6 -4
  263. package/tools/providers/omp-transport.mjs +4 -2
  264. package/tools/ralph-external/lib/consecutive-failure-circuit-breaker.mjs +1748 -0
  265. package/tools/ralph-external/lib/launcher-recovery-evidence.mjs +55 -0
  266. package/tools/ralph-external/lib/omp-adapter.mjs +1 -1
  267. package/tools/ralph-external/lib/pi-adapter.mjs +0 -4
  268. package/tools/ralph-external/lib/provider-adapter.mjs +59 -1
  269. package/tools/ralph-external/lib/recovery-probe.mjs +72 -0
  270. package/tools/ralph-external/lib/session-environment.mjs +28 -0
  271. package/tools/ralph-external/lib/systemd-client.mjs +49 -0
  272. package/tools/ralph-external/lib/worker-health.mjs +1 -1
  273. package/tools/ralph-external/lib/worker-isolation.mjs +717 -0
  274. package/tools/ralph-external/lib/worker-overflow.mjs +50 -0
  275. package/tools/ralph-external/process-monitor.mjs +1017 -0
  276. package/tools/ralph-external/session-launcher.mjs +5057 -0
  277. package/tools/scripts/resource-preflight.mjs +541 -0
  278. package/tools/skills/deploy-skills-codex.mjs +2 -1
  279. package/vscode-extension/schemas/aiwg.config.v1.json +1194 -231
@@ -0,0 +1,36 @@
1
+ import { rmSync } from 'node:fs';
2
+ const directories = new Set();
3
+ const removeAll = () => {
4
+ for (const directory of directories)
5
+ rmSync(directory, { recursive: true, force: true });
6
+ };
7
+ const onInterrupt = () => terminate('SIGINT', onInterrupt);
8
+ const onTerminate = () => terminate('SIGTERM', onTerminate);
9
+ function terminate(signal, listener) {
10
+ removeAll();
11
+ // Preserve an existing shutdown handler; otherwise restore default behavior.
12
+ if (process.listenerCount(signal) === 1) {
13
+ process.removeListener(signal, listener);
14
+ process.kill(process.pid, signal);
15
+ }
16
+ }
17
+ /** Own scratch through normal completion, explicit process.exit and termination.
18
+ * SIGKILL cannot be handled; callers should still use finally for normal errors. */
19
+ export function trackTemporaryDirectory(directory) {
20
+ if (directories.size === 0) {
21
+ process.once('exit', removeAll);
22
+ process.on('SIGINT', onInterrupt);
23
+ process.on('SIGTERM', onTerminate);
24
+ }
25
+ directories.add(directory);
26
+ return () => {
27
+ rmSync(directory, { recursive: true, force: true });
28
+ directories.delete(directory);
29
+ if (directories.size === 0) {
30
+ process.removeListener('exit', removeAll);
31
+ process.removeListener('SIGINT', onInterrupt);
32
+ process.removeListener('SIGTERM', onTerminate);
33
+ }
34
+ };
35
+ }
36
+ //# sourceMappingURL=temporary-directory.js.map
@@ -550,7 +550,7 @@ export class ExampleGenerator {
550
550
  postgresql: 'PostgreSQL 15',
551
551
  mysql: 'MySQL 8.0',
552
552
  mongodb: 'MongoDB 6.0',
553
- node: 'Node.js 20',
553
+ node: 'Node.js 24',
554
554
  react: 'React 18',
555
555
  vue: 'Vue 3',
556
556
  angular: 'Angular 17'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiwg/cli",
3
- "version": "2026.10.3",
3
+ "version": "2026.10.4",
4
4
  "description": "Lightweight AIWG CLI for signed, versioned web-backed resources.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -41,6 +41,18 @@
41
41
  "dist/src/resources/web-release.d.ts",
42
42
  "dist/src/dataset/**/*.d.ts",
43
43
  "tools/_resolve-impl.mjs",
44
+ "tools/cli/decision-offload-report.mjs",
45
+ "tools/cli/workspace-status.mjs",
46
+ "tools/ralph-external/session-launcher.mjs",
47
+ "tools/ralph-external/process-monitor.mjs",
48
+ "tools/ralph-external/lib/session-environment.mjs",
49
+ "tools/ralph-external/lib/worker-isolation.mjs",
50
+ "tools/ralph-external/lib/systemd-client.mjs",
51
+ "tools/ralph-external/lib/consecutive-failure-circuit-breaker.mjs",
52
+ "tools/ralph-external/lib/launcher-recovery-evidence.mjs",
53
+ "tools/ralph-external/lib/recovery-probe.mjs",
54
+ "tools/ralph-external/lib/worker-overflow.mjs",
55
+ "tools/scripts/resource-preflight.mjs",
44
56
  "tools/ralph-external/lib/provider-adapter.mjs",
45
57
  "tools/ralph-external/lib/worker-health.mjs",
46
58
  "tools/ralph-external/lib/claude-adapter.mjs",
@@ -59,6 +71,7 @@
59
71
  "tools/providers/antigravity-transport.mjs",
60
72
  "tools/commands/deploy-prompts-codex.mjs",
61
73
  "tools/plugin/package-plugins.mjs",
74
+ "tools/plugin/plugin-links.mjs",
62
75
  "tools/skills/deploy-skills-codex.mjs",
63
76
  "README.md"
64
77
  ],
@@ -82,7 +95,7 @@
82
95
  "access": "public"
83
96
  },
84
97
  "engines": {
85
- "node": ">=20.0.0"
98
+ "node": ">=24"
86
99
  },
87
100
  "dependencies": {
88
101
  "@fortemi/core": "2026.7.15",
@@ -292,7 +292,7 @@
292
292
  "type": "array",
293
293
  "items": { "$ref": "#/$defs/discoveredModel" }
294
294
  },
295
- "errorKind": { "enum": ["authentication", "rate-limit", "timeout", "unsupported", "invalid-output", "command"] },
295
+ "errorKind": { "enum": ["authentication", "rate-limit", "timeout", "unsupported", "invalid-output", "environment", "command"] },
296
296
  "error": { "type": "string" },
297
297
  "policy": { "type": "object" }
298
298
  }
@@ -37,6 +37,12 @@
37
37
  "verifiedAt"
38
38
  ],
39
39
  "properties": {
40
+ "sessionEnvAllowlist": {
41
+ "description": "Exact provider auth/config names for legacy full agent sessions, in addition to the launcher's base environment. Independent of worker invocation allowlists.",
42
+ "type": "array",
43
+ "items": { "type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" },
44
+ "uniqueItems": true
45
+ },
40
46
  "agent": {
41
47
  "$ref": "#/$defs/control"
42
48
  },
@@ -20,7 +20,7 @@ function findPackageRoot(callerUrl) {
20
20
  dir = parent;
21
21
  }
22
22
 
23
- throw new Error(`Could not locate AIWG package root from ${callerUrl}`);
23
+ throw Object.assign(new Error(`Could not locate AIWG package root from ${callerUrl}`), { code: 'AIWG_PACKAGE_ROOT_MISSING' });
24
24
  }
25
25
 
26
26
  function candidatesFor(root, relativeFromSrc, base) {
@@ -59,10 +59,10 @@ function resolveCandidate(root, relativeFromSrc, base) {
59
59
  * `importImpl(import.meta.url, '<module-path-relative-to-src>')` instead of
60
60
  * a literal relative import, so it finds `dist/src/` when installed and
61
61
  * `src/` in a checkout. `test/integration/tools-packed-relative-imports.test.ts`
62
- * guards this for every relative import already known to resolve.
62
+ * guards this for every shipped relative import without exceptions.
63
63
  *
64
64
  * Directories `package.json`'s `files` excludes from the npm package
65
- * (`tools/benchmarks/`, `tools/ci/`, `tools/contrib/`, `tools/docker/`,
65
+ * (`tools/benchmarks/`, `tools/ci/`, `tools/contrib/`,
66
66
  * `tools/eval/`, `tools/lint/` other than its listed exceptions,
67
67
  * `tools/manifest/` other than its listed exception, `tools/qualification/`,
68
68
  * and `tools/release/`) are maintainer/CI-only: they never run from an
@@ -74,17 +74,15 @@ function resolveCandidate(root, relativeFromSrc, base) {
74
74
  * shipped ever referenced them (#3062 B/C finding 2) — removing them
75
75
  * also trims install size (#3075).
76
76
  *
77
- * `.ts` files directly under `tools/**` that remain shipped (e.g. under
78
- * `tools/decision/`, `tools/experiments/`) are a separate, still-open
79
- * case: they are only ever run via `tsx` through an `npm run` script in a
80
- * checkout (there is no compile step that makes them directly
81
- * `node`-executable), so they also keep literal `src/**` imports — there
82
- * is no installed-package code path that reaches them to break. This is
83
- * pre-existing, documented debt (see the baseline in
84
- * `test/integration/tools-packed-relative-imports.test.ts`), not a
85
- * recommendation to add more of it: a new shipped `.ts` tool should
86
- * resolve through `importImpl` like everything else unless it has the
87
- * same checkout-only justification.
77
+ * Decision study/replay scripts, experiments, OMP conformance probes, the
78
+ * desktop issuer qualification, and repository testing scripts are also
79
+ * excluded: they require checkout fixtures, development dependencies, or
80
+ * unshipped application code and have no installed CLI callers. Keep those
81
+ * scripts in the repository rather than adapting them for installation.
82
+ *
83
+ * `tools/docker/container-manager.mjs` and `Dockerfile.daemon` are shipped
84
+ * exceptions to the Docker directory exclusion: `aiwg daemon start --docker`
85
+ * needs both. The manager uses this resolver for its implementation import.
88
86
  */
89
87
  export function resolveImpl(callerUrl, relativeFromSrc) {
90
88
  const root = findPackageRoot(callerUrl);
@@ -104,7 +102,7 @@ export function resolveImpl(callerUrl, relativeFromSrc) {
104
102
  const attempted = order
105
103
  .flatMap((base) => candidatesFor(root, relativeFromSrc, base))
106
104
  .join(', ');
107
- throw new Error(`Could not resolve ${relativeFromSrc}; attempted: ${attempted}`);
105
+ throw Object.assign(new Error(`Could not resolve ${relativeFromSrc}; attempted: ${attempted}`), { code: 'AIWG_IMPLEMENTATION_MISSING' });
108
106
  }
109
107
 
110
108
  export async function importImpl(callerUrl, relativeFromSrc) {
@@ -19,7 +19,9 @@
19
19
  * --deploy-rules Deploy rules in addition to agents
20
20
  * --commands-only Deploy only commands (skip agents)
21
21
  * --skills-only Deploy only skills (skip agents)
22
- * --rules-only Deploy only rules (skip agents)
22
+ * --strict Fail startup budget overruns before deployment promotion
23
+ --report-only Warn on startup budget overruns (migration default; CI remains strict)
24
+ --rules-only Deploy only rules (skip agents)
23
25
  * --dry-run Show what would be deployed without writing
24
26
  * --force Overwrite existing files
25
27
  * --provider <name> Target provider: antigravity (agy), claude (default), openai, codex, cursor, opencode, copilot, factory, grokbot, grok-build, muse, pi, omp, deepseek-harness (dsh), warp, devin, hermes, openhuman, or openclaw
@@ -189,7 +191,7 @@ function uniquePaths(paths) {
189
191
  return [...new Set(paths.filter(Boolean))];
190
192
  }
191
193
 
192
- function collectMirrorSkillDirs(srcRoot, mode) {
194
+ export function collectMirrorSkillDirs(srcRoot, mode, providerName) {
193
195
  const dirs = [];
194
196
 
195
197
  const directSkillsDir = path.join(srcRoot, 'skills');
@@ -208,7 +210,14 @@ function collectMirrorSkillDirs(srcRoot, mode) {
208
210
  });
209
211
  dirs.push(...artifacts.skills);
210
212
 
211
- if (mode === 'all') {
213
+ // Pi's provider collector already deploys all eligible addon skills for
214
+ // every root framework mode. Mirror the command-shaped addon skills in
215
+ // that same root pass so `aiwg use` does not need to repeat the entire
216
+ // deployment once per addon merely to produce these wrappers. Keep addon
217
+ // skills after framework skills: this preserves the existing per-addon
218
+ // winner when a framework and addon expose the same command name.
219
+ if (mode === 'all'
220
+ || (providerName === 'pi' && ['general', 'sdlc', 'both'].includes(mode))) {
212
221
  dirs.push(...getAddonSkillDirs(srcRoot));
213
222
  }
214
223
  }
@@ -294,7 +303,7 @@ function mirrorSkillsAsCommands(provider, target, srcRoot, opts) {
294
303
  const targetDir = resolveCommandMirrorDir(provider, target);
295
304
  if (!targetDir) return 0;
296
305
 
297
- const skillDirs = collectMirrorSkillDirs(srcRoot, opts.mode)
306
+ const skillDirs = collectMirrorSkillDirs(srcRoot, opts.mode, provider.name)
298
307
  .filter((dir) => shouldMirrorCommandSkill(provider.name, path.basename(dir)));
299
308
 
300
309
  if (skillDirs.length === 0) return 0;
@@ -497,6 +506,8 @@ export function parseArgs(args = process.argv.slice(2)) {
497
506
  commandsOnly: false,
498
507
  skillsOnly: false,
499
508
  rulesOnly: false,
509
+ strict: false,
510
+ reportOnly: true,
500
511
  kernelOnly: false,
501
512
  filter: null, // Glob pattern for agent names
502
513
  filterRole: null, // Filter by role: reasoning|coding|efficiency
@@ -548,6 +559,9 @@ export function parseArgs(args = process.argv.slice(2)) {
548
559
  else if (a === '--commands-only') cfg.commandsOnly = true;
549
560
  else if (a === '--skills-only') cfg.skillsOnly = true;
550
561
  else if (a === '--rules-only') cfg.rulesOnly = true;
562
+ else if (a === '--strict') { cfg.strict = true; cfg.reportOnly = false; }
563
+ else if (a === '--allow-over-budget') cfg.allowOverBudget = true;
564
+ else if (a === '--report-only') cfg.reportOnly = true;
551
565
  else if (a === '--kernel-only') cfg.kernelOnly = true;
552
566
  else if (a === '--deploy-behaviors') cfg.deployBehaviors = true;
553
567
  else if (a === '--filter' && args[i + 1]) cfg.filter = args[++i];
@@ -932,8 +946,8 @@ async function promptCommandsMigration(cfg, provider, targetDir) {
932
946
  // Main Entry Point
933
947
  // ============================================================================
934
948
 
935
- export async function main() {
936
- const cfg = parseArgs();
949
+ export async function main(args = process.argv.slice(2), internal = {}) {
950
+ const cfg = parseArgs(args);
937
951
 
938
952
  // Resolve source directory (default to repo root relative to this script)
939
953
  const __filename = fileURLToPath(import.meta.url);
@@ -1033,6 +1047,9 @@ export async function main() {
1033
1047
  commandsOnly: cfg.commandsOnly,
1034
1048
  skillsOnly: cfg.skillsOnly || cfg.kernelOnly,
1035
1049
  rulesOnly: cfg.rulesOnly,
1050
+ strict: cfg.strict,
1051
+ reportOnly: cfg.reportOnly,
1052
+ allowOverBudget: cfg.allowOverBudget === true,
1036
1053
  kernelOnly: cfg.kernelOnly,
1037
1054
  filter: cfg.filter,
1038
1055
  filterRole: cfg.filterRole,
@@ -1056,31 +1073,41 @@ export async function main() {
1056
1073
  deployVersion: cfg.deployVersion || getDeployVersion(srcRoot),
1057
1074
  deploySource: cfg.deploySource || 'bundled',
1058
1075
  };
1076
+ const { isRuleDeploymentPreparationActive } = await import('./providers/rule-delivery.mjs');
1077
+ const preparationActive = isRuleDeploymentPreparationActive();
1059
1078
 
1060
1079
  // Commands → Skills migration: prompt then delete the commands directory
1061
1080
  // so stale command files don't create duplicates in the provider TUI.
1062
- if (!cfg.dryRun && !cfg.skipCommandsMigration) {
1063
- const doMigrate = await promptCommandsMigration(cfg, provider, cfg.target);
1064
- if (doMigrate) {
1081
+ if (!preparationActive && !internal.finalizeOnly) {
1082
+ if (!cfg.dryRun && !cfg.skipCommandsMigration) {
1083
+ const doMigrate = await promptCommandsMigration(cfg, provider, cfg.target);
1084
+ if (doMigrate) {
1085
+ const commandsRelPath = provider.paths?.commands;
1086
+ if (commandsRelPath) {
1087
+ migrateCommandsDirectory(path.join(cfg.target, commandsRelPath), opts);
1088
+ }
1089
+ } else {
1090
+ // User said no — flip the flag so the provider knows to emit the duplicate warning
1091
+ opts.skipCommandsMigration = true;
1092
+ }
1093
+ } else if (cfg.skipCommandsMigration) {
1094
+ // Flag was passed explicitly — emit the duplicate warning now via a dry migration call
1065
1095
  const commandsRelPath = provider.paths?.commands;
1066
- if (commandsRelPath) {
1096
+ if (commandsRelPath && !provider.capabilities?.homeDirectoryDeploy) {
1067
1097
  migrateCommandsDirectory(path.join(cfg.target, commandsRelPath), opts);
1068
1098
  }
1069
- } else {
1070
- // User said no — flip the flag so the provider knows to emit the duplicate warning
1071
- opts.skipCommandsMigration = true;
1072
- }
1073
- } else if (cfg.skipCommandsMigration) {
1074
- // Flag was passed explicitly — emit the duplicate warning now via a dry migration call
1075
- const commandsRelPath = provider.paths?.commands;
1076
- if (commandsRelPath && !provider.capabilities?.homeDirectoryDeploy) {
1077
- migrateCommandsDirectory(path.join(cfg.target, commandsRelPath), opts);
1078
1099
  }
1079
1100
  }
1080
1101
 
1102
+ // Concurrent deployment runs this parent-owned preflight before any child
1103
+ // snapshots its inputs. Migration can remove a provider command tree, so it
1104
+ // must remain on the same side of the transaction boundary as serial deploy.
1105
+ if (internal.preflightOnly) return;
1106
+
1081
1107
  // Delegate to provider
1082
1108
  try {
1083
- await provider.deploy(opts);
1109
+ if (!internal.finalizeOnly) await provider.deploy(opts);
1110
+ if (preparationActive) return;
1084
1111
 
1085
1112
  const mirroredCommandCount = mirrorSkillsAsCommands(provider, cfg.target, srcRoot, opts);
1086
1113
  if (mirroredCommandCount > 0 && !cfg.quiet) {
@@ -1091,7 +1118,7 @@ export async function main() {
1091
1118
  // or removed (the flat-file analogue of the skills holistic prune). #1627.
1092
1119
  pruneStaleAiwgArtifacts(provider, cfg.target, srcRoot, opts, cfg.source);
1093
1120
 
1094
- if (!opts.commandsOnly && !opts.skillsOnly && !opts.rulesOnly) {
1121
+ if (!['claude', 'codex', 'cursor', 'hermes', 'warp', 'openclaw'].includes(provider.name) && !opts.commandsOnly && !opts.skillsOnly && !opts.rulesOnly) {
1095
1122
  const behaviorDirs = collectBehaviorDirs(srcRoot);
1096
1123
  const behaviorCount = deployEmulatedBehaviors(behaviorDirs, provider.name, cfg.target, opts);
1097
1124
  if (behaviorCount > 0 && !cfg.quiet) {
@@ -1106,6 +1133,7 @@ export async function main() {
1106
1133
 
1107
1134
  if (!cfg.quiet) console.log(`\n=== Deployment complete ===\n`);
1108
1135
  } catch (err) {
1136
+ if (preparationActive || internal.finalizeOnly) throw err;
1109
1137
  console.error(`\nDeployment failed:`, err.message);
1110
1138
  if (cfg.dryRun) {
1111
1139
  console.error('(dry-run mode - no files were modified)');