@aiwg/cli 2026.10.3 → 2026.10.5

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 +69 -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 +286 -131
  21. package/dist/src/artifacts/index-files.js +132 -18
  22. package/dist/src/artifacts/index-preparation.js +130 -0
  23. package/dist/src/artifacts/index-refresh.js +591 -0
  24. package/dist/src/artifacts/index-worker.mjs +11 -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 +137 -43
  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 +95 -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 +252 -12
  207. package/dist/src/sessions/contracts.js +50 -3
  208. package/dist/src/sessions/coverage-preflight.js +27 -2
  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 +145 -26
  216. package/dist/src/sessions/readers.js +106 -53
  217. package/dist/src/sessions/refresh.js +105 -0
  218. package/dist/src/sessions/repository.js +151 -54
  219. package/dist/src/sessions/workspace-discovery.js +292 -60
  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
package/README.md CHANGED
@@ -42,7 +42,7 @@ and doctor commands remain advanced maintenance and recovery tools.
42
42
  [![npm downloads](https://img.shields.io/npm/dm/%40aiwg%2Fcli?color=CB3837&logo=npm&style=flat-square)](https://www.npmjs.com/package/@aiwg/cli)
43
43
  [![full distribution](https://img.shields.io/npm/v/aiwg/latest?label=aiwg&color=CB3837&logo=npm&style=flat-square)](https://www.npmjs.com/package/aiwg)
44
44
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](https://github.com/jmagly/aiwg/blob/main/LICENSE)
45
- [![Node Version](https://img.shields.io/badge/node-%E2%89%A520.0.0-brightgreen?style=flat-square&logo=node.js)](https://nodejs.org)
45
+ [![Node Version](https://img.shields.io/badge/node-%E2%89%A524-brightgreen?style=flat-square&logo=node.js)](https://nodejs.org)
46
46
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue?style=flat-square&logo=typescript)](https://www.typescriptlang.org)
47
47
  [![Signed Resources](https://img.shields.io/badge/resources-signed-00a67d?style=flat-square)](https://releases.aiwg.io/)
48
48
 
@@ -857,7 +857,7 @@ mechanism, not a separate set of AIWG instructions.
857
857
 
858
858
  ### Requirements
859
859
 
860
- - Node.js 20 or newer;
860
+ - Node.js 24 or newer;
861
861
  - npm or another package manager capable of installing npm packages;
862
862
  - HTTPS access to npmjs.org for installation;
863
863
  - HTTPS access to `releases.aiwg.io` for cold web-resource reads.
@@ -208,6 +208,28 @@
208
208
  }
209
209
  },
210
210
  "claude": {
211
+ "sessionEnvAllowlist": [
212
+ "ANTHROPIC_API_KEY",
213
+ "ANTHROPIC_AUTH_TOKEN",
214
+ "ANTHROPIC_BASE_URL",
215
+ "ANTHROPIC_MODEL",
216
+ "CLAUDE_CONFIG_DIR",
217
+ "CLAUDE_CODE_OAUTH_TOKEN",
218
+ "CLAUDE_CODE_DISABLE_1M_CONTEXT",
219
+ "CLAUDE_CODE_USE_BEDROCK",
220
+ "CLAUDE_CODE_USE_VERTEX",
221
+ "AWS_PROFILE",
222
+ "AWS_REGION",
223
+ "AWS_DEFAULT_REGION",
224
+ "AWS_ACCESS_KEY_ID",
225
+ "AWS_SECRET_ACCESS_KEY",
226
+ "AWS_SESSION_TOKEN",
227
+ "AWS_CONFIG_FILE",
228
+ "AWS_SHARED_CREDENTIALS_FILE",
229
+ "GOOGLE_APPLICATION_CREDENTIALS",
230
+ "ANTHROPIC_VERTEX_PROJECT_ID",
231
+ "CLOUD_ML_REGION"
232
+ ],
211
233
  "agent": "native",
212
234
  "skill": "native",
213
235
  "globalChild": "inherited",
@@ -429,6 +451,14 @@
429
451
  }
430
452
  },
431
453
  "codex": {
454
+ "sessionEnvAllowlist": [
455
+ "OPENAI_API_KEY",
456
+ "CODEX_API_KEY",
457
+ "OPENAI_BASE_URL",
458
+ "OPENAI_ORG_ID",
459
+ "OPENAI_PROJECT_ID",
460
+ "CODEX_HOME"
461
+ ],
432
462
  "agent": "native",
433
463
  "skill": "unsupported",
434
464
  "globalChild": "inherited",
@@ -452,7 +482,7 @@
452
482
  "id": "codex",
453
483
  "provider": "codex",
454
484
  "adapterVersion": "1",
455
- "supportedVersions": "0.161.0",
485
+ "supportedVersions": ">=0.161.0 <0.200.0",
456
486
  "runtimeDriver": "installed:codex",
457
487
  "catalogAdapter": {
458
488
  "kind": "file",
@@ -513,7 +543,7 @@
513
543
  "invocationProfiles": {
514
544
  "direct-shell": {
515
545
  "transport": "shell",
516
- "supportedVersions": "0.161.0",
546
+ "supportedVersions": ">=0.161.0 <0.200.0",
517
547
  "controls": {
518
548
  "model": {
519
549
  "support": "unqualified",
@@ -640,6 +670,12 @@
640
670
  }
641
671
  },
642
672
  "copilot": {
673
+ "sessionEnvAllowlist": [
674
+ "COPILOT_GITHUB_TOKEN",
675
+ "GH_TOKEN",
676
+ "GITHUB_TOKEN",
677
+ "COPILOT_HOME"
678
+ ],
643
679
  "agent": "native",
644
680
  "skill": "unsupported",
645
681
  "globalChild": "inherited",
@@ -1025,6 +1061,9 @@
1025
1061
  }
1026
1062
  },
1027
1063
  "factory": {
1064
+ "sessionEnvAllowlist": [
1065
+ "FACTORY_API_KEY"
1066
+ ],
1028
1067
  "agent": "native",
1029
1068
  "skill": "informational",
1030
1069
  "globalChild": "native",
@@ -1220,6 +1259,23 @@
1220
1259
  }
1221
1260
  },
1222
1261
  "opencode": {
1262
+ "sessionEnvAllowlist": [
1263
+ "OPENAI_API_KEY",
1264
+ "ANTHROPIC_API_KEY",
1265
+ "GEMINI_API_KEY",
1266
+ "GOOGLE_API_KEY",
1267
+ "OPENROUTER_API_KEY",
1268
+ "GROQ_API_KEY",
1269
+ "MISTRAL_API_KEY",
1270
+ "XAI_API_KEY",
1271
+ "DEEPSEEK_API_KEY",
1272
+ "OPENCODE_API_KEY",
1273
+ "OPENCODE_CONFIG",
1274
+ "OPENCODE_CONFIG_DIR",
1275
+ "OPENCODE_CONFIG_CONTENT",
1276
+ "OPENCODE_SERVER_USERNAME",
1277
+ "OPENCODE_SERVER_PASSWORD"
1278
+ ],
1223
1279
  "agent": "native",
1224
1280
  "skill": "unsupported",
1225
1281
  "globalChild": "inherited",
@@ -1596,6 +1652,19 @@
1596
1652
  }
1597
1653
  },
1598
1654
  "omp": {
1655
+ "sessionEnvAllowlist": [
1656
+ "OPENAI_API_KEY",
1657
+ "ANTHROPIC_API_KEY",
1658
+ "GEMINI_API_KEY",
1659
+ "GOOGLE_API_KEY",
1660
+ "OPENROUTER_API_KEY",
1661
+ "GROQ_API_KEY",
1662
+ "MISTRAL_API_KEY",
1663
+ "XAI_API_KEY",
1664
+ "DEEPSEEK_API_KEY",
1665
+ "PI_CONFIG_DIR",
1666
+ "PI_CODING_AGENT_DIR"
1667
+ ],
1599
1668
  "agent": "native",
1600
1669
  "skill": "inherited",
1601
1670
  "globalChild": "native",
@@ -1796,6 +1865,21 @@
1796
1865
  }
1797
1866
  },
1798
1867
  "pi": {
1868
+ "sessionEnvAllowlist": [
1869
+ "OPENAI_API_KEY",
1870
+ "ANTHROPIC_API_KEY",
1871
+ "GEMINI_API_KEY",
1872
+ "GOOGLE_API_KEY",
1873
+ "OPENROUTER_API_KEY",
1874
+ "GROQ_API_KEY",
1875
+ "MISTRAL_API_KEY",
1876
+ "XAI_API_KEY",
1877
+ "DEEPSEEK_API_KEY",
1878
+ "PI_CODING_AGENT_DIR",
1879
+ "PI_CODING_AGENT_SESSION_DIR",
1880
+ "AIWG_PI_STUB_SCENARIO",
1881
+ "AIWG_PI_STUB_RECEIPT"
1882
+ ],
1799
1883
  "agent": "native",
1800
1884
  "skill": "inherited",
1801
1885
  "globalChild": "native",
@@ -1992,6 +2076,10 @@
1992
2076
  }
1993
2077
  },
1994
2078
  "deepseek-harness": {
2079
+ "sessionEnvAllowlist": [
2080
+ "DEEPSEEK_API_KEY",
2081
+ "DSH_HOME"
2082
+ ],
1995
2083
  "agent": "native",
1996
2084
  "skill": "inherited",
1997
2085
  "globalChild": "native",
@@ -3001,6 +3089,10 @@
3001
3089
  }
3002
3090
  },
3003
3091
  "muse": {
3092
+ "sessionEnvAllowlist": [
3093
+ "AIWG_MUSE_STUB_SCENARIO",
3094
+ "AIWG_MUSE_STUB_RECEIPT"
3095
+ ],
3004
3096
  "agent": "unsupported",
3005
3097
  "skill": "unsupported",
3006
3098
  "globalChild": "informational",
@@ -3027,7 +3119,7 @@
3027
3119
  "id": "muse",
3028
3120
  "provider": "muse",
3029
3121
  "adapterVersion": "1",
3030
- "supportedVersions": "1.4.4-R5419.1",
3122
+ "supportedVersions": ">=1.4.4-R5419.1 <2.0.0",
3031
3123
  "runtimeDriver": "tools/ralph-external/lib/muse-adapter.mjs",
3032
3124
  "catalogAdapter": {
3033
3125
  "kind": "file",
@@ -3087,7 +3179,7 @@
3087
3179
  "invocationProfiles": {
3088
3180
  "direct-shell": {
3089
3181
  "transport": "shell",
3090
- "supportedVersions": "1.4.4-R5419.1",
3182
+ "supportedVersions": ">=1.4.4-R5419.1 <2.0.0",
3091
3183
  "controls": {
3092
3184
  "model": {
3093
3185
  "support": "unqualified",
package/bin/aiwg.mjs CHANGED
@@ -30,41 +30,52 @@ import { randomUUID } from 'crypto';
30
30
  const __filename = fileURLToPath(import.meta.url);
31
31
  const __dirname = path.dirname(__filename);
32
32
  const packageRoot = path.resolve(__dirname, '..');
33
+ process.env['AIWG_LAUNCHER_ROOT'] = packageRoot;
33
34
 
34
- function readPackageVersion() {
35
+ function readPackageVersion(root = packageRoot) {
35
36
  try {
36
- const pkg = JSON.parse(readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
37
+ const pkg = JSON.parse(readFileSync(path.join(root, 'package.json'), 'utf8'));
37
38
  return typeof pkg.version === 'string' ? pkg.version : '(unknown)';
38
39
  } catch {
39
40
  return '(unknown)';
40
41
  }
41
42
  }
42
43
 
43
- function detectVersionChannel(version) {
44
- if (version.includes('-rc.')) return 'rc';
45
- if (version.includes('-beta.')) return 'beta';
46
- if (version.includes('-alpha.')) return 'alpha';
47
- if (version.includes('-nightly.')) return 'nightly';
44
+ function readVersionConfig() {
48
45
  try {
49
46
  const legacyDir = path.join(os.homedir(), '.aiwg');
50
47
  const xdgDir = path.join(os.homedir(), '.config', 'aiwg');
51
48
  const configDir = process.env.AIWG_CONFIG
52
49
  ? path.resolve(process.env.AIWG_CONFIG)
53
50
  : existsSync(legacyDir) ? legacyDir : existsSync(xdgDir) ? xdgDir : legacyDir;
51
+ let config = {};
52
+ try {
53
+ config = JSON.parse(readFileSync(path.join(configDir, 'channel.json'), 'utf8'));
54
+ } catch { /* Legacy config is optional. */ }
54
55
  const installationFile = path.join(configDir, 'installation.json');
55
56
  if (existsSync(installationFile)) {
56
57
  const installation = JSON.parse(readFileSync(installationFile, 'utf8'));
57
- if (installation?.runMode === 'development') return 'dev';
58
- if (typeof installation?.channel === 'string') return installation.channel;
58
+ return {
59
+ ...config,
60
+ devMode: installation?.runMode === 'development',
61
+ channel: installation?.channel,
62
+ edgePath: installation?.edgePath ?? config.edgePath,
63
+ };
59
64
  }
60
- const raw = readFileSync(path.join(configDir, 'channel.json'), 'utf8');
61
- const cfg = JSON.parse(raw);
62
- if (cfg?.devMode) return 'dev';
63
- if (typeof cfg?.channel === 'string') return cfg.channel;
65
+ return config;
64
66
  } catch {
65
67
  // Default below.
66
68
  }
67
- return 'stable';
69
+ return {};
70
+ }
71
+
72
+ function detectVersionChannel(version, config) {
73
+ if (config.devMode) return 'dev';
74
+ if (version.includes('-rc.')) return 'rc';
75
+ if (version.includes('-beta.')) return 'beta';
76
+ if (version.includes('-alpha.')) return 'alpha';
77
+ if (version.includes('-nightly.')) return 'nightly';
78
+ return config.channel || 'stable';
68
79
  }
69
80
 
70
81
  function maybeHandleFastVersion(args) {
@@ -72,8 +83,15 @@ function maybeHandleFastVersion(args) {
72
83
  if (args[0] !== '--version' && args[0] !== '-version') return false;
73
84
 
74
85
  const version = readPackageVersion();
75
- const channel = detectVersionChannel(version);
86
+ const config = readVersionConfig();
87
+ const channel = detectVersionChannel(version, config);
88
+ const runtimePath = config.devMode && config.edgePath ? config.edgePath : packageRoot;
76
89
  console.log(` aiwg ${version} [${channel}]`);
90
+ if (config.devMode) {
91
+ console.log(` launcher: ${version}`);
92
+ console.log(` runtime: ${readPackageVersion(runtimePath)}`);
93
+ console.log(` runtime path: ${runtimePath}`);
94
+ }
77
95
  console.log(` path: ${packageRoot}`);
78
96
  return true;
79
97
  }
@@ -240,7 +258,13 @@ maybeWarnUnbuiltDist();
240
258
 
241
259
  // Propagate the strict no-write contract through helpers that may resolve
242
260
  // installation/channel state before the command context exists.
243
- if (process.argv.slice(2).includes('--dry-run')) {
261
+ function isReadOnlyReport(args) {
262
+ return (args[0] === 'rules' && ['inventory', 'list'].includes(args[1]))
263
+ || (['doctor', '-doctor', '--doctor'].includes(args[0]) && args.includes('--decision-offload'))
264
+ || (args[0] === 'steward' && args[1] === 'decision-offload');
265
+ }
266
+ const readOnlyReport = isReadOnlyReport(process.argv.slice(2));
267
+ if (process.argv.slice(2).includes('--dry-run') || readOnlyReport) {
244
268
  process.env['AIWG_CLI_DRY_RUN'] = '1';
245
269
  }
246
270
 
@@ -332,7 +356,10 @@ async function runUpdateNotifierBootstrap() {
332
356
  }
333
357
 
334
358
  const cliArgs = process.argv.slice(2);
335
- if (isCredentialHandlingCommand(cliArgs)) {
359
+ const indexRefresh = cliArgs[0] === 'index' && cliArgs[1] === 'refresh';
360
+ if (indexRefresh || readOnlyReport) {
361
+ trace(`notifier:skip (${indexRefresh ? 'index refresh' : 'read-only report'})`);
362
+ } else if (isCredentialHandlingCommand(cliArgs)) {
336
363
  trace('notifier:skip (credential-handling command)');
337
364
  } else {
338
365
  await runUpdateNotifierBootstrap();
@@ -441,7 +468,7 @@ async function applyVerbosityFromArgs(args, routerPath) {
441
468
  setInvocationId(invocationId);
442
469
  // One-shot prune of old JSONL files on startup. Bounded work; safe to
443
470
  // call on every invocation because the work is a single directory list.
444
- pruneOldLogs();
471
+ if (!readOnlyReport) pruneOldLogs();
445
472
  }
446
473
  } catch {
447
474
  // If the logger isn't importable yet (fresh clone without dist/), the
@@ -463,6 +490,7 @@ const RECOVERY_SAFE_COMMANDS = new Set([
463
490
  const RECOVERY_SAFE_INDEX_SUBCOMMANDS = new Set(['query', 'deps', 'stats']);
464
491
 
465
492
  function isRecoverySafeCommand(args) {
493
+ if (isReadOnlyReport(args)) return true;
466
494
  const command = args.find((arg) => !arg.startsWith('-'));
467
495
  if (!command) return false;
468
496
  if (RECOVERY_SAFE_COMMANDS.has(command)) return true;
@@ -512,8 +540,8 @@ async function main() {
512
540
  console.error(` Or switch back: aiwg --use-stable`);
513
541
  process.exit(1);
514
542
  }
515
- const { assertCanonicalInstallation } = await import(pathToFileURL(identityPath).href);
516
- const readOnlyPreview = args.includes('--dry-run');
543
+ const { assertCanonicalInstallation, formatInstallationDiagnostic } = await import(pathToFileURL(identityPath).href);
544
+ const readOnlyPreview = args.includes('--dry-run') || indexRefresh || readOnlyReport;
517
545
  try {
518
546
  assertCanonicalInstallation({
519
547
  actualRoot: activePackageRoot,
@@ -532,12 +560,7 @@ async function main() {
532
560
  drift,
533
561
  });
534
562
  process.stderr.write(
535
- `aiwg: warning: installation identity drift detected; \`${args[0]}\` is read-only and continues, ` +
536
- 'but update, refresh, and deployment stay blocked until the identity is repaired.\n' +
537
- drift.map((item) => `- ${item}\n`).join('') +
538
- 'Inspect: aiwg installation show\n' +
539
- 'Adopt this installation: aiwg installation adopt\n' +
540
- 'Switch deliberately: aiwg installation switch --root <path> --method <npm|web|source> [--manager <absolute-path>]\n',
563
+ `aiwg: warning: ${formatInstallationDiagnostic(error.status, { readOnlyCommand: args[0] })}\n`,
541
564
  );
542
565
  }
543
566
  }
@@ -545,7 +568,7 @@ async function main() {
545
568
  // Wire up the logger level from -v/-vv/--quiet/AIWG_LOG_LEVEL before any
546
569
  // handler runs, and stamp the top-level invocation ID so the logger can
547
570
  // tag every record with it.
548
- await applyVerbosityFromArgs(args, routerPath);
571
+ if (!indexRefresh) await applyVerbosityFromArgs(args, routerPath);
549
572
 
550
573
  // Top-level cancellation controller. SIGINT / SIGTERM flip it, long-running
551
574
  // handlers plumb ctx.signal through fetches and loops so Ctrl-C cancels
@@ -108,7 +108,11 @@ export class KnowledgeStore {
108
108
  .slice(0, limit);
109
109
  }
110
110
  /**
111
- * Verify a claim against domain knowledge
111
+ * Verify literal support against the top three retrieved knowledge entries.
112
+ * Only a whole-entry statement match establishes support; direct copular
113
+ * negation vetoes it. Other wording abstains, including paraphrases and
114
+ * multi-sentence passages. This is not a general semantic entailment judge
115
+ * or a check that the stored knowledge is itself true.
112
116
  */
113
117
  verifyClaim(claim, domain) {
114
118
  const fragments = this.search(claim, { domain, limit: 3 });
@@ -118,17 +122,31 @@ export class KnowledgeStore {
118
122
  verified: false,
119
123
  confidence: 0,
120
124
  sources: [],
125
+ evidence: [],
121
126
  correction: 'No relevant knowledge found in knowledge base',
122
127
  };
123
128
  }
124
- // Simple verification: check if top fragments support or contradict
125
- const topFragment = fragments[0];
126
- const confidence = Math.min(topFragment.relevance_score, 1.0);
129
+ // Relevance selects candidates; only their content can establish support.
130
+ const evidence = fragments.map((fragment) => ({
131
+ source: fragment.source,
132
+ entry_id: fragment.metadata?.id,
133
+ content: fragment.content,
134
+ relation: compareStatements(claim, fragment.content),
135
+ }));
136
+ const contradictions = evidence.filter((item) => item.relation === 'contradicts');
137
+ const verified = contradictions.length === 0
138
+ && evidence.some((item) => item.relation === 'supports');
127
139
  return {
128
140
  claim,
129
- verified: confidence > 0.3,
130
- confidence,
141
+ verified,
142
+ confidence: verified ? 1 : 0,
131
143
  sources: fragments.map((f) => f.source),
144
+ evidence,
145
+ ...(!verified && {
146
+ correction: contradictions.length > 0
147
+ ? `Conflicting knowledge: ${contradictions.map((item) => item.content).join(' | ')}`
148
+ : 'Relevant knowledge was retrieved, but explicit support was not established',
149
+ }),
132
150
  };
133
151
  }
134
152
  listDomains() {
@@ -144,6 +162,36 @@ export class KnowledgeStore {
144
162
  // ============================================================================
145
163
  // Helpers
146
164
  // ============================================================================
165
+ function normalizeStatement(text) {
166
+ // Preserve case, numbers and internal punctuation: they can change meaning.
167
+ return text.trim().replace(/\s+/g, ' ').replace(/\.$/, '');
168
+ }
169
+ function compareStatements(claim, content) {
170
+ const statement = normalizeStatement(claim);
171
+ const evidence = normalizeStatement(content);
172
+ if (!statement || !evidence)
173
+ return 'unknown';
174
+ // Do not extract assertions from questions, quotations or multi-sentence text.
175
+ if ([statement, evidence].some((text) => /[?!;"“”]|\.(?:\s|$)/.test(text)))
176
+ return 'unknown';
177
+ if (statement === evidence)
178
+ return 'supports';
179
+ // A deliberately limited conflict rule: the same whole statement with a
180
+ // single "not" following is/are/was/were. Never infer support by dropping
181
+ // negation, and abstain on complex negation (e.g. "not only" or "not always").
182
+ const affirmative = (text) => {
183
+ if (/[.!?;:\n]/.test(text))
184
+ return undefined;
185
+ const match = text.match(/^(.+?\b(?:is|are|was|were)) not (.+)$/);
186
+ if (!match || /\b(?:not|only|just|always|necessarily)\b/.test(match[2]))
187
+ return undefined;
188
+ return `${match[1]} ${match[2]}`;
189
+ };
190
+ if (affirmative(statement) === evidence || affirmative(evidence) === statement) {
191
+ return 'contradicts';
192
+ }
193
+ return 'unknown';
194
+ }
147
195
  function calculateRelevance(entry, queryTerms) {
148
196
  const searchable = [
149
197
  entry.topic,
@@ -455,6 +455,12 @@ function recordForEntry(cwd, entry, graphName, dependencyGraph, privacy, schemaV
455
455
  ? { aiwg_search_terms: uniqueSorted(entry.searchTerms) }
456
456
  : {}),
457
457
  ...(entry.script ? { aiwg_script: entry.script } : {}),
458
+ ...(entry.activation ? { activation: entry.activation } : {}),
459
+ ...(entry.bound_to ? { bound_to: entry.bound_to } : {}),
460
+ ...(entry.ruleEnforcement ? { enforcement: entry.ruleEnforcement } : {}),
461
+ ...(entry.rulePaths ? { paths: entry.rulePaths } : {}),
462
+ ...(entry.governedPaths ? { aiwg_governed_paths: entry.governedPaths } : {}),
463
+ ...(entry.ruleSummary !== undefined ? { summary: entry.ruleSummary } : {}),
458
464
  },
459
465
  },
460
466
  }
@@ -58,6 +58,7 @@ export function writeManifest(indexDir, manifest) {
58
58
  version: 1,
59
59
  generated: new Date().toISOString(),
60
60
  entries: manifest.entries,
61
+ ...(manifest.receipt ? { receipt: manifest.receipt } : {}),
61
62
  };
62
63
  fs.writeFileSync(tmpPath, JSON.stringify(payload, null, 2), 'utf-8');
63
64
  fs.renameSync(tmpPath, manifestPath);