@aiwg/cli 2026.9.20 → 2026.9.24

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 (275) hide show
  1. package/agentic/code/providers/capability-matrix.yaml +58 -6
  2. package/agentic/code/providers/model-capabilities.v1.json +34 -0
  3. package/agentic/code/providers/model-catalog.v1.json +55 -13
  4. package/bin/aiwg.mjs +2 -0
  5. package/dist/src/api/index.d.ts +1 -0
  6. package/dist/src/api/index.js +1 -0
  7. package/dist/src/artifacts/cli.js +23 -18
  8. package/dist/src/artifacts/enrichment/cli.js +1 -1
  9. package/dist/src/artifacts/fortemi-core-query-adapter.js +6 -2
  10. package/dist/src/artifacts/query-engine.js +14 -4
  11. package/dist/src/artifacts/views/cli.js +1 -1
  12. package/dist/src/audit/operator-decision.js +10 -0
  13. package/dist/src/auth/credential-store.js +127 -27
  14. package/dist/src/catalog/builtin-models.json +272 -40
  15. package/dist/src/catalog/cli.js +1 -1
  16. package/dist/src/catalog/cli.mjs +1 -1
  17. package/dist/src/cli/handlers/effect.js +872 -0
  18. package/dist/src/cli/handlers/help.js +2 -0
  19. package/dist/src/cli/handlers/index.js +4 -2
  20. package/dist/src/cli/handlers/models.js +41 -10
  21. package/dist/src/cli/handlers/ralph.js +1 -1
  22. package/dist/src/cli/handlers/sessions.js +113 -37
  23. package/dist/src/cli/handlers/subcommands.js +31 -0
  24. package/dist/src/cli/handlers/use.js +46 -9
  25. package/dist/src/cli/handlers/utilities.js +10 -0
  26. package/dist/src/cli/handlers/workspace.js +3 -1
  27. package/dist/src/cli/scope-resolver.js +112 -9
  28. package/dist/src/cli/services/deployment-verification.js +5 -0
  29. package/dist/src/config/aiwg-config.js +3 -0
  30. package/dist/src/decision/acceptance-rollout.js +93 -0
  31. package/dist/src/decision/acceptance.js +175 -0
  32. package/dist/src/decision/adapters/jev.js +234 -13
  33. package/dist/src/decision/adapters/llm-subagent.js +60 -12
  34. package/dist/src/decision/admission.js +550 -0
  35. package/dist/src/decision/batch-benchmark.js +47 -0
  36. package/dist/src/decision/batch-receipts/accounting.js +75 -0
  37. package/dist/src/decision/batch-receipts/export.js +40 -0
  38. package/dist/src/decision/batch-receipts/index.js +9 -0
  39. package/dist/src/decision/batch-receipts/protection.js +40 -0
  40. package/dist/src/decision/batch-receipts/receipt.js +44 -0
  41. package/dist/src/decision/batch-receipts/result-store.js +341 -0
  42. package/dist/src/decision/batch-receipts/store.js +362 -0
  43. package/dist/src/decision/batch-receipts/types.js +2 -0
  44. package/dist/src/decision/batch-receipts/validate.js +127 -0
  45. package/dist/src/decision/batch.js +68 -0
  46. package/dist/src/decision/calibration/index.js +4 -0
  47. package/dist/src/decision/calibration/receipts.js +130 -0
  48. package/dist/src/decision/calibration/registry.js +258 -0
  49. package/dist/src/decision/calibration/types.js +2 -0
  50. package/dist/src/decision/compile-cache/benchmark.js +62 -0
  51. package/dist/src/decision/compile-cache/compatibility.js +65 -0
  52. package/dist/src/decision/compile-cache/file-store.js +280 -0
  53. package/dist/src/decision/compile-cache/identity.js +26 -0
  54. package/dist/src/decision/compile-cache/index.js +9 -0
  55. package/dist/src/decision/compile-cache/prefix.js +21 -0
  56. package/dist/src/decision/compile-cache/records.js +86 -0
  57. package/dist/src/decision/compile-cache/runtime.js +68 -0
  58. package/dist/src/decision/compile-cache/store.js +108 -0
  59. package/dist/src/decision/compile-cache/types.js +2 -0
  60. package/dist/src/decision/context-plan.js +234 -0
  61. package/dist/src/decision/context-qualification.js +60 -0
  62. package/dist/src/decision/ensemble/aggregate.js +215 -0
  63. package/dist/src/decision/ensemble/contract.js +316 -0
  64. package/dist/src/decision/ensemble/drift.js +51 -0
  65. package/dist/src/decision/ensemble/index.js +6 -0
  66. package/dist/src/decision/ensemble/report.js +71 -0
  67. package/dist/src/decision/ensemble/types.js +2 -0
  68. package/dist/src/decision/evaluate.js +1024 -78
  69. package/dist/src/decision/file-lifecycle-store.js +168 -0
  70. package/dist/src/decision/graph-beam.js +40 -0
  71. package/dist/src/decision/graph-budget.js +110 -0
  72. package/dist/src/decision/graph-decision-bridge.js +93 -0
  73. package/dist/src/decision/graph-evidence.js +123 -0
  74. package/dist/src/decision/graph-flow-adapter.js +56 -0
  75. package/dist/src/decision/graph-flow.js +105 -0
  76. package/dist/src/decision/graph-parallel.js +79 -0
  77. package/dist/src/decision/graph-patterns.js +20 -0
  78. package/dist/src/decision/graph-run-store.js +66 -0
  79. package/dist/src/decision/graph-run.js +166 -0
  80. package/dist/src/decision/graph-skill-bridge.js +91 -0
  81. package/dist/src/decision/graph-templates.js +56 -0
  82. package/dist/src/decision/graph.js +115 -0
  83. package/dist/src/decision/index.js +35 -0
  84. package/dist/src/decision/job-accounting.js +93 -0
  85. package/dist/src/decision/job-contract.js +186 -0
  86. package/dist/src/decision/job-effects.js +95 -0
  87. package/dist/src/decision/job-evaluate.js +80 -0
  88. package/dist/src/decision/job-gateway.js +121 -0
  89. package/dist/src/decision/job-http.js +194 -0
  90. package/dist/src/decision/job-payload-store.js +258 -0
  91. package/dist/src/decision/job-poll-limiter.js +92 -0
  92. package/dist/src/decision/job-quota.js +158 -0
  93. package/dist/src/decision/job-runtime.js +240 -0
  94. package/dist/src/decision/job-scheduler.js +26 -0
  95. package/dist/src/decision/job-service.js +117 -0
  96. package/dist/src/decision/job-store.js +264 -0
  97. package/dist/src/decision/job-worker.js +141 -0
  98. package/dist/src/decision/lifecycle.js +148 -0
  99. package/dist/src/decision/patterns/artifacts.js +173 -0
  100. package/dist/src/decision/patterns/catalog.js +108 -0
  101. package/dist/src/decision/patterns/durable-review.js +237 -0
  102. package/dist/src/decision/patterns/index.js +8 -0
  103. package/dist/src/decision/patterns/playground.js +401 -0
  104. package/dist/src/decision/patterns/recorded.js +43 -0
  105. package/dist/src/decision/patterns/specs.js +174 -0
  106. package/dist/src/decision/patterns/types.js +2 -0
  107. package/dist/src/decision/portable-secrets.js +53 -0
  108. package/dist/src/decision/projection.js +210 -0
  109. package/dist/src/decision/qualification/capture.js +67 -0
  110. package/dist/src/decision/qualification/drift.js +68 -0
  111. package/dist/src/decision/qualification/gate-evidence.js +172 -0
  112. package/dist/src/decision/qualification/gates.js +83 -0
  113. package/dist/src/decision/qualification/index.js +12 -0
  114. package/dist/src/decision/qualification/load.js +282 -0
  115. package/dist/src/decision/qualification/manifest.js +37 -0
  116. package/dist/src/decision/qualification/privacy.js +41 -0
  117. package/dist/src/decision/qualification/quality.js +213 -0
  118. package/dist/src/decision/qualification/release.js +116 -0
  119. package/dist/src/decision/qualification/runner.js +408 -0
  120. package/dist/src/decision/qualification/types.js +2 -0
  121. package/dist/src/decision/receipts.js +30 -7
  122. package/dist/src/decision/result-cache/index.js +6 -0
  123. package/dist/src/decision/result-cache/integrity.js +28 -0
  124. package/dist/src/decision/result-cache/key.js +28 -0
  125. package/dist/src/decision/result-cache/service.js +92 -0
  126. package/dist/src/decision/result-cache/store.js +327 -0
  127. package/dist/src/decision/result-cache/types.js +3 -0
  128. package/dist/src/decision/review/authorization.js +110 -0
  129. package/dist/src/decision/review/effect-ledger-adapter.js +321 -0
  130. package/dist/src/decision/review/index.js +12 -0
  131. package/dist/src/decision/review/migrate.js +34 -0
  132. package/dist/src/decision/review/operator-audit.js +59 -0
  133. package/dist/src/decision/review/recovery-adapters.js +252 -0
  134. package/dist/src/decision/review/recovery.js +33 -0
  135. package/dist/src/decision/review/service.js +498 -0
  136. package/dist/src/decision/review/store.js +219 -0
  137. package/dist/src/decision/review/types.js +2 -0
  138. package/dist/src/decision/review/validate.js +205 -0
  139. package/dist/src/decision/scheduler.js +115 -0
  140. package/dist/src/decision/telemetry/context.js +42 -0
  141. package/dist/src/decision/telemetry/debug-sidecar.js +152 -0
  142. package/dist/src/decision/telemetry/exporter.js +77 -0
  143. package/dist/src/decision/telemetry/file-debug-backend.js +112 -0
  144. package/dist/src/decision/telemetry/index.js +13 -0
  145. package/dist/src/decision/telemetry/mapping.js +146 -0
  146. package/dist/src/decision/telemetry/metrics.js +164 -0
  147. package/dist/src/decision/telemetry/otlp-http.js +183 -0
  148. package/dist/src/decision/telemetry/redaction.js +93 -0
  149. package/dist/src/decision/telemetry/retention.js +109 -0
  150. package/dist/src/decision/telemetry/runtime.js +310 -0
  151. package/dist/src/decision/telemetry/trace.js +158 -0
  152. package/dist/src/decision/telemetry/types.js +3 -0
  153. package/dist/src/decision/validate.js +135 -5
  154. package/dist/src/effects/checkpoint-sinks.js +94 -0
  155. package/dist/src/effects/checkpoint.js +76 -0
  156. package/dist/src/effects/decision-links.js +54 -0
  157. package/dist/src/effects/errors.js +48 -0
  158. package/dist/src/effects/identity.js +178 -0
  159. package/dist/src/effects/index.js +25 -0
  160. package/dist/src/effects/keyring.js +160 -0
  161. package/dist/src/effects/keys.js +130 -0
  162. package/dist/src/effects/ledger.js +435 -0
  163. package/dist/src/effects/lifecycle.js +110 -0
  164. package/dist/src/effects/lock-recovery.js +269 -0
  165. package/dist/src/effects/reader.js +103 -0
  166. package/dist/src/effects/records.js +114 -0
  167. package/dist/src/effects/redaction.js +51 -0
  168. package/dist/src/effects/schema.js +73 -0
  169. package/dist/src/effects/store.js +239 -0
  170. package/dist/src/effects/types.js +49 -0
  171. package/dist/src/effects/verifiers/decision.js +168 -0
  172. package/dist/src/effects/verifiers/file.js +106 -0
  173. package/dist/src/effects/verifiers/git.js +206 -0
  174. package/dist/src/effects/verifiers/index.js +90 -0
  175. package/dist/src/effects/verifiers/registry.js +148 -0
  176. package/dist/src/effects/verifiers/review.js +123 -0
  177. package/dist/src/effects/verifiers/tracker.js +299 -0
  178. package/dist/src/effects/verifiers/types.js +21 -0
  179. package/dist/src/effects/verify.js +295 -0
  180. package/dist/src/evidence/bundle.js +2 -0
  181. package/dist/src/extensions/commands/definitions.js +28 -0
  182. package/dist/src/extensions/manifest.js +1 -0
  183. package/dist/src/marketplace/provenance.js +25 -27
  184. package/dist/src/mcp/cli.mjs +11 -1
  185. package/dist/src/mcp/grok-build-config.mjs +189 -0
  186. package/dist/src/mcp/registry.js +21 -1
  187. package/dist/src/mcp/registry.mjs +20 -1
  188. package/dist/src/models/grok-build-models.js +356 -0
  189. package/dist/src/models/index.js +1 -0
  190. package/dist/src/models/model-capabilities.v1.json +34 -0
  191. package/dist/src/models/model-catalog.v1.json +55 -13
  192. package/dist/src/models/model-discovery.js +41 -5
  193. package/dist/src/models/provider-policy.js +3 -2
  194. package/dist/src/plugin/skill-command-translator.js +1 -0
  195. package/dist/src/providers/capability-matrix.yaml +58 -6
  196. package/dist/src/providers/grok-build-acp.js +192 -0
  197. package/dist/src/providers/grok-build-dispatch.js +251 -0
  198. package/dist/src/providers/grok-build-headless.js +170 -0
  199. package/dist/src/providers/muse-paths.js +105 -0
  200. package/dist/src/providers/provider-definitions.js +93 -7
  201. package/dist/src/providers/provider-definitions.mjs +21 -1
  202. package/dist/src/providers/provider-inventory.js +3 -0
  203. package/dist/src/security/artifact-attestation.js +4 -8
  204. package/dist/src/security/signing.js +119 -0
  205. package/dist/src/sessions/adapters/grok-build.js +187 -0
  206. package/dist/src/sessions/adapters/muse.js +412 -0
  207. package/dist/src/sessions/contracts.js +1 -1
  208. package/dist/src/sessions/grok-build-cli.js +196 -0
  209. package/dist/src/sessions/index.js +3 -0
  210. package/dist/src/sessions/workspace-discovery.js +9 -5
  211. package/dist/src/skills/deployer.js +33 -5
  212. package/dist/src/smiths/context-pipeline/claude-hook.js +2 -0
  213. package/dist/src/smiths/context-pipeline/context-file-safety.js +18 -0
  214. package/dist/src/smiths/context-pipeline/finalization.js +1 -32
  215. package/dist/src/smiths/context-pipeline/generator.js +12 -0
  216. package/dist/src/smiths/context-pipeline/index.js +1 -1
  217. package/dist/src/smiths/context-pipeline/managed-hook.js +2 -0
  218. package/dist/src/smiths/context-pipeline/muse-bridge.js +50 -0
  219. package/dist/src/smiths/context-pipeline/provider-policy.js +5 -0
  220. package/dist/src/smiths/context-pipeline/workspace-context.js +22 -16
  221. package/dist/src/smiths/hook-bridge/grok-build-translator.js +64 -0
  222. package/dist/src/smiths/hook-bridge/index.js +3 -0
  223. package/dist/src/smiths/hook-bridge/shim.js +2 -0
  224. package/dist/src/smiths/hook-bridge/types.js +5 -0
  225. package/dist/src/smiths/skillsmith/collision-detector.js +1 -0
  226. package/dist/src/storage/protected-files.js +102 -0
  227. package/dist/src/tracker/forge-http.js +371 -0
  228. package/dist/src/tracker/project-inputs.js +41 -0
  229. package/package.json +2 -1
  230. package/schemas/decision/BatchReceipt.v1.schema.json +50 -0
  231. package/schemas/decision/CalibrationArtifact.v1.schema.json +76 -0
  232. package/schemas/decision/CalibrationCompatibility.v1.schema.json +18 -0
  233. package/schemas/decision/CalibrationGovernanceReceipt.v1.schema.json +44 -0
  234. package/schemas/decision/DecisionAdmissionEvidence.v1.schema.json +43 -0
  235. package/schemas/decision/DecisionBinding.schema.json +309 -0
  236. package/schemas/decision/DecisionBinding.v1alpha2.schema.json +369 -0
  237. package/schemas/decision/DecisionCacheTelemetry.v1.schema.json +20 -0
  238. package/schemas/decision/DecisionChampionChallenger.v1.schema.json +100 -0
  239. package/schemas/decision/DecisionCompileCacheEntry.v1.schema.json +35 -0
  240. package/schemas/decision/DecisionCompileCacheIdentity.v1.schema.json +26 -0
  241. package/schemas/decision/DecisionCompileCacheTombstone.v1.schema.json +31 -0
  242. package/schemas/decision/DecisionContextEvidence.v1.schema.json +136 -0
  243. package/schemas/decision/DecisionDefinition.schema.json +159 -0
  244. package/schemas/decision/DecisionDefinition.v1alpha2.schema.json +203 -0
  245. package/schemas/decision/DecisionDriftResponse.v1.schema.json +55 -0
  246. package/schemas/decision/DecisionEnsembleAggregate.v1.schema.json +86 -0
  247. package/schemas/decision/DecisionEnsembleIntegrityReport.v1.schema.json +64 -0
  248. package/schemas/decision/DecisionEnsemblePolicy.v1.schema.json +130 -0
  249. package/schemas/decision/DecisionGraph.v1.schema.json +77 -0
  250. package/schemas/decision/DecisionJob.v1.schema.json +71 -0
  251. package/schemas/decision/DecisionLifecyclePolicy.v1.schema.json +52 -0
  252. package/schemas/decision/DecisionProjectionPolicy.v1.schema.json +65 -0
  253. package/schemas/decision/DecisionProviderPrefixCompatibility.v1.schema.json +45 -0
  254. package/schemas/decision/DecisionProviderPrefixEvidence.v1.schema.json +17 -0
  255. package/schemas/decision/DecisionProviderPrefixIdentity.v1.schema.json +36 -0
  256. package/schemas/decision/DecisionResult.schema.json +524 -0
  257. package/schemas/decision/DecisionResult.v1alpha2.schema.json +619 -0
  258. package/schemas/decision/DecisionResultCacheEntry.v1.schema.json +53 -0
  259. package/schemas/decision/DecisionReview.schema.json +29 -0
  260. package/schemas/decision/DecisionRuleset.schema.json +313 -0
  261. package/schemas/decision/DecisionRuleset.v1alpha2.schema.json +313 -0
  262. package/schemas/decision/DecisionTelemetryTrace.v1.schema.json +95 -0
  263. package/schemas/decision/RulesetResult.schema.json +721 -0
  264. package/schemas/decision/RulesetResult.v1alpha2.schema.json +891 -0
  265. package/schemas/security/pr-evidence-receipt.v1.schema.json +77 -0
  266. package/schemas/security/threat-assessment-report.v1.schema.json +71 -1
  267. package/tools/agents/deploy-agents.mjs +21 -6
  268. package/tools/agents/providers/base.mjs +7 -4
  269. package/tools/agents/providers/codex.mjs +1 -1
  270. package/tools/agents/providers/grok-build.d.mts +7 -0
  271. package/tools/agents/providers/grok-build.mjs +249 -9
  272. package/tools/agents/providers/model-role.mjs +6 -3
  273. package/tools/agents/providers/muse-hooks.mjs +785 -0
  274. package/tools/agents/providers/muse-paths.mjs +112 -0
  275. package/tools/agents/providers/muse.mjs +336 -0
@@ -117,6 +117,8 @@ function displayHelp() {
117
117
  helpGroup('EVIDENCE', [
118
118
  ['evidence export --output <dir>', 'Package portable activity, report, source, eval, and provenance evidence'],
119
119
  ['evidence verify <bundle>', 'Verify every member hash and the bundle checkpoint'],
120
+ ['effect record|lookup|reconcile', 'Record, look up or reconcile a side effect in the signed effect ledger'],
121
+ ['effect verify|checkpoint|keys', 'Verify the effect ledger, checkpoint it, or manage its signing key'],
120
122
  ]);
121
123
  helpGroup('SCAFFOLDING', [
122
124
  ['new-bundle <name>', 'Create project-local bundle (--type extension|addon|framework|plugin|provider, --starter skill|rule|agent|minimal, --dry-run)'],
@@ -31,6 +31,7 @@ import { refreshHandler } from './refresh.js';
31
31
  import { regenerateHandler, regenerateHandlers } from './regenerate.js';
32
32
  import { workspaceContextHandler, workspaceContextHandlers } from './workspace-context.js';
33
33
  import { artifactsHandler, artifactsHandlers } from './artifacts.js';
34
+ import { effectHandler, effectHandlers } from './effect.js';
34
35
  import { mcHandler, mcHandlers } from './mc.js';
35
36
  import { missionHandlers } from './mission.js';
36
37
  import { sdlcAccelerateHandler } from './sdlc-accelerate.js';
@@ -83,7 +84,7 @@ newBundleHandler, quickrefHandler, newProjectHandler, sessionHandler, sessionsHa
83
84
  // Workspace
84
85
  statusHandler, wizardHandler, migrateWorkspaceHandler, rollbackWorkspaceHandler,
85
86
  // Subcommands
86
- mcpHandler, catalogHandler, modelsHandler, versionsHandler, indexHandler, artifactsHandler, corpusHandler, discoverHandler, showHandler, featuresHandler, skillsHandler, configHandler, opsHandler, storageHandler, activityLogHandler, commandLogHandler, skillUsageHandler, kbHandler, memoryHandler, reflectionsHandler, provenanceHandler, researchStoreHandler, researchQueryHandler, runtimeInfoHandler, agentcardHandler, uhpHandler,
87
+ mcpHandler, catalogHandler, modelsHandler, versionsHandler, indexHandler, artifactsHandler, effectHandler, corpusHandler, discoverHandler, showHandler, featuresHandler, skillsHandler, configHandler, opsHandler, storageHandler, activityLogHandler, commandLogHandler, skillUsageHandler, kbHandler, memoryHandler, reflectionsHandler, provenanceHandler, researchStoreHandler, researchQueryHandler, runtimeInfoHandler, agentcardHandler, uhpHandler,
87
88
  // Agentic Tools (RLM)
88
89
  chunkHandler, fanoutHandler, rlmPrepHandler, rlmSearchHandler, rlmStatusCliHandler, rlmCacheHandler,
89
90
  // Utilities
@@ -119,7 +120,7 @@ repoAccessHandler,
119
120
  // Lint
120
121
  lintHandler, };
121
122
  // Re-export handler arrays
122
- export { workspaceHandlers, utilityHandlers, scaffoldingHandlers, ralphHandlers, subcommandHandlers, mcHandlers, missionHandlers, teamHandlers, stewardHandlers, regenerateHandlers, workspaceContextHandlers, artifactsHandlers, daemonHandlers, sandboxHandlers, repoAccessHandlers, };
123
+ export { workspaceHandlers, utilityHandlers, scaffoldingHandlers, ralphHandlers, subcommandHandlers, mcHandlers, missionHandlers, teamHandlers, stewardHandlers, regenerateHandlers, workspaceContextHandlers, artifactsHandlers, effectHandlers, daemonHandlers, sandboxHandlers, repoAccessHandlers, };
123
124
  /**
124
125
  * All registered command handlers
125
126
  *
@@ -177,6 +178,7 @@ export const allHandlers = [
177
178
  versionsHandler,
178
179
  indexHandler,
179
180
  artifactsHandler,
181
+ effectHandler,
180
182
  corpusHandler,
181
183
  discoverHandler,
182
184
  showHandler,
@@ -8,9 +8,10 @@ import path from 'node:path';
8
8
  import { glob } from 'glob';
9
9
  import { load as loadYaml } from 'js-yaml';
10
10
  import { compileModelPolicy, validateCanonicalModelPolicy, validateUserProjectModelConfig, } from '../../models/provider-policy.js';
11
+ import { resolveGrokBuildRoleModel } from '../../models/grok-build-models.js';
11
12
  const TIERS = new Set(['economy', 'standard', 'premium', 'max-quality']);
12
13
  const PROVIDERS = new Set([
13
- 'antigravity', 'claude', 'codex', 'copilot', 'cursor', 'deepseek-harness', 'factory', 'hermes',
14
+ 'antigravity', 'claude', 'codex', 'copilot', 'cursor', 'deepseek-harness', 'factory', 'grok-build', 'grokbot', 'hermes',
14
15
  'opencode', 'openclaw', 'openhuman', 'omp', 'pi', 'warp', 'windsurf',
15
16
  ]);
16
17
  function parseArgs(args) {
@@ -169,18 +170,25 @@ async function updateJson(file, mutate, dryRun) {
169
170
  await atomicWrite(file, content);
170
171
  return { file, beforeWrite: value, dryRun };
171
172
  }
172
- async function effectiveCatalog(ctx, target, allowNetwork, parsed) {
173
+ async function effectiveCatalog(ctx, target, allowNetwork, parsed, provider) {
173
174
  const { collectProviderInventory } = await import('../../providers/provider-inventory.js');
174
175
  const { resolveDynamicModelCatalog } = await import('../../models/model-discovery.js');
175
176
  const inventory = await collectProviderInventory(target);
176
177
  const aiwgRoot = await fs.access(path.join(ctx.frameworkRoot, 'agentic/code/providers/model-catalog.v1.json'))
177
178
  .then(() => ctx.frameworkRoot)
178
179
  .catch(() => process.cwd());
180
+ const nativeDiscoverers = provider === 'grok-build' ? {
181
+ 'grok-build': async () => {
182
+ const { discoverGrokBuildModels } = await import('../../models/grok-build-models.js');
183
+ return discoverGrokBuildModels({ cwd: target, env: process.env });
184
+ },
185
+ } : undefined;
179
186
  return resolveDynamicModelCatalog({
180
187
  aiwgRoot,
181
188
  inventory,
182
189
  allowNetwork,
183
190
  forceRefresh: allowNetwork,
191
+ ...(nativeDiscoverers ? { nativeDiscoverers } : {}),
184
192
  ...(flagString(parsed, 'url') ? { remoteUrl: flagString(parsed, 'url') } : {}),
185
193
  });
186
194
  }
@@ -228,7 +236,7 @@ async function execute(ctx) {
228
236
  }
229
237
  if (parsed.subcommand === 'sources' || parsed.subcommand === 'refresh') {
230
238
  const { diffModelCatalog } = await import('../../models/model-discovery.js');
231
- const catalog = await effectiveCatalog(ctx, target, parsed.subcommand === 'refresh', parsed);
239
+ const catalog = await effectiveCatalog(ctx, target, parsed.subcommand === 'refresh', parsed, provider);
232
240
  if (parsed.flags.has('drift')) {
233
241
  const staticCatalog = JSON.parse(await fs.readFile(path.join(ctx.frameworkRoot, 'agentic/code/providers/model-catalog.v1.json'), 'utf8'));
234
242
  print({ catalog, drift: diffModelCatalog(staticCatalog, catalog) }, json);
@@ -259,15 +267,38 @@ async function execute(ctx) {
259
267
  return { exitCode: 0 };
260
268
  }
261
269
  if (parsed.subcommand === 'audit' || parsed.subcommand === 'resolve') {
262
- const catalog = await effectiveCatalog(ctx, target, false, parsed);
270
+ const catalog = await effectiveCatalog(ctx, target, false, parsed, provider);
263
271
  const catalogSource = catalog.discovery?.source ?? 'static';
264
- const output = artifacts.map(item => ({
265
- ...resolved(item, provider, catalog),
266
- catalogSource,
267
- catalogFetchedAt: catalog.discovery?.fetchedAt ?? null,
268
- }));
272
+ let roleMappings = {};
273
+ if (provider === 'grok-build') {
274
+ try {
275
+ const projectConfig = JSON.parse(await fs.readFile(path.join(target, 'models.json'), 'utf8'));
276
+ const candidate = projectConfig?.providers?.['grok-build'];
277
+ if (candidate && typeof candidate === 'object')
278
+ roleMappings = candidate;
279
+ }
280
+ catch { /* optional project policy */ }
281
+ }
282
+ const output = artifacts.map(item => {
283
+ const base = {
284
+ ...resolved(item, provider, catalog),
285
+ catalogSource,
286
+ catalogFetchedAt: catalog.discovery?.fetchedAt ?? null,
287
+ };
288
+ if (provider !== 'grok-build')
289
+ return base;
290
+ const discovery = catalog.discovery?.providers['grok-build'];
291
+ if (!discovery)
292
+ return base;
293
+ const providerResolution = resolveGrokBuildRoleModel(discovery, base.policy.role, roleMappings, flagString(parsed, 'model'));
294
+ return { ...base,
295
+ compiled: { ...base.compiled, effectiveModel: providerResolution.model, fields: {},
296
+ source: 'inheritance' },
297
+ providerPolicy: discovery.policy, providerResolution };
298
+ });
269
299
  print(output, json);
270
- return { exitCode: output.some(item => item.compiled.diagnostics.some(d => d.severity === 'error')) ? 2 : 0 };
300
+ return { exitCode: output.some(item => item.compiled.diagnostics.some(d => d.severity === 'error')
301
+ || ('providerResolution' in item && item.providerResolution?.source === 'unresolved')) ? 2 : 0 };
271
302
  }
272
303
  if (parsed.subcommand === 'validate') {
273
304
  const invalid = artifacts.filter(item => !validateCanonicalModelPolicy({
@@ -261,7 +261,7 @@ ARGUMENTS:
261
261
  OPTIONS:
262
262
  -c, --completion <str> Completion criteria (required)
263
263
  --max-iterations <n> Maximum iterations (default: 5)
264
- --model <model> Claude model (default: claude-sonnet-4-6)
264
+ --model <model> Claude model (default: claude-sonnet-5)
265
265
  --budget <usd> Budget per iteration in USD (default: 5.0)
266
266
  --timeout <min> Timeout per iteration in minutes (default: 60)
267
267
 
@@ -2,7 +2,7 @@ import { existsSync, linkSync, mkdirSync, readFileSync, realpathSync, renameSync
2
2
  import { randomUUID } from 'node:crypto';
3
3
  import { basename, dirname, isAbsolute, join, resolve, } from 'node:path';
4
4
  import { pathToFileURL } from 'node:url';
5
- import { CLAUDE_ADAPTER_VERSION, ClaudeSessionAdapter, CODEX_ADAPTER_VERSION, CodexSessionAdapter, COPILOT_ADAPTER_VERSION, CopilotSessionAdapter, CURSOR_ADAPTER_VERSION, CursorSessionAdapter, FACTORY_ADAPTER_VERSION, FactorySessionAdapter, HERMES_ADAPTER_VERSION, HermesSessionAdapter, OPENCODE_ADAPTER_VERSION, OpenCodeSessionAdapter, OPENCLAW_ADAPTER_VERSION, OpenClawSessionAdapter, OPENHUMAN_ADAPTER_VERSION, OpenHumanSessionAdapter, GROKBOT_ADAPTER_VERSION, GrokbotSessionAdapter, PI_ADAPTER_VERSION, PiSessionAdapter, DEEPSEEK_HARNESS_ADAPTER_VERSION, DeepSeekHarnessSessionAdapter, OmpSessionAdapter, OMP_ADAPTER_VERSION, WARP_ADAPTER_VERSION, WarpSessionAdapter, DEVIN_DESKTOP_ADAPTER_VERSION, DevinDesktopSessionAdapter, CandidateExtractionService, GENERIC_ADAPTER_VERSION, GenericSessionInterchangeAdapter, IncrementalSessionImporter, ImportLeaseContentionError, FilesystemMemoryDestination, FilesystemPromotionDispositionCoordinator, MemoryPromotionGateway, SESSION_CONTRACT_VERSION, SESSION_PROVIDER_IDS, SessionContractError, SessionRepository, SessionSourceSchema, StructuralCandidateExtractor, resolveMemoryConsumerManifest, assertSessionProviderId, acquireImportLease, defaultDiscoveryManifestPath, discoverWorkspaceHistories, deriveSessionTimeline, importDiscoveryManifest, previewDiscoveryImport, publicDiscoveryManifest, readDiscoveryManifest, redactSourceLocator, sha256, parseTimelineGap, writeDiscoveryManifest, buildSessionExportPlan, reverifySessionExportPlan, buildSessionAiwgFortemiIndexExport, recoverAiwgFortemiIndexFromFullV1Shard, embedAttachmentsInFullV1Shard, recoverEmbeddedAttachments, SESSION_EXPORT_PLAN_SCHEMA_VERSION, } from '../../sessions/index.js';
5
+ import { CLAUDE_ADAPTER_VERSION, ClaudeSessionAdapter, CODEX_ADAPTER_VERSION, CodexSessionAdapter, COPILOT_ADAPTER_VERSION, CopilotSessionAdapter, CURSOR_ADAPTER_VERSION, CursorSessionAdapter, FACTORY_ADAPTER_VERSION, FactorySessionAdapter, HERMES_ADAPTER_VERSION, HermesSessionAdapter, OPENCODE_ADAPTER_VERSION, OpenCodeSessionAdapter, OPENCLAW_ADAPTER_VERSION, OpenClawSessionAdapter, OPENHUMAN_ADAPTER_VERSION, OpenHumanSessionAdapter, GROKBOT_ADAPTER_VERSION, GrokbotSessionAdapter, GROK_BUILD_ADAPTER_VERSION, GROK_BUILD_CLI_EXPORT_LOCATOR_CLASS, GrokBuildSessionAdapter, grokBuildList, grokBuildSearch, grokBuildExport, grokHeadlessSessionIdFromFile, MUSE_ADAPTER_VERSION, MuseSessionAdapter, PI_ADAPTER_VERSION, PiSessionAdapter, DEEPSEEK_HARNESS_ADAPTER_VERSION, DeepSeekHarnessSessionAdapter, OmpSessionAdapter, OMP_ADAPTER_VERSION, WARP_ADAPTER_VERSION, WarpSessionAdapter, DEVIN_DESKTOP_ADAPTER_VERSION, DevinDesktopSessionAdapter, CandidateExtractionService, GENERIC_ADAPTER_VERSION, GenericSessionInterchangeAdapter, IncrementalSessionImporter, ImportLeaseContentionError, FilesystemMemoryDestination, FilesystemPromotionDispositionCoordinator, MemoryPromotionGateway, SESSION_CONTRACT_VERSION, SESSION_PROVIDER_IDS, SessionContractError, SessionRepository, SessionSourceSchema, StructuralCandidateExtractor, resolveMemoryConsumerManifest, assertSessionProviderId, acquireImportLease, defaultDiscoveryManifestPath, discoverWorkspaceHistories, deriveSessionTimeline, importDiscoveryManifest, previewDiscoveryImport, publicDiscoveryManifest, readDiscoveryManifest, redactSourceLocator, sha256, parseTimelineGap, writeDiscoveryManifest, buildSessionExportPlan, reverifySessionExportPlan, buildSessionAiwgFortemiIndexExport, recoverAiwgFortemiIndexFromFullV1Shard, embedAttachmentsInFullV1Shard, recoverEmbeddedAttachments, SESSION_EXPORT_PLAN_SCHEMA_VERSION, } from '../../sessions/index.js';
6
6
  const JSON_CONTRACT_VERSION = '1.0.0';
7
7
  async function createLineMemoryPromotionDestination(projectRoot, manifestPath) {
8
8
  const modulePath = resolve(dirname(manifestPath), 'commands', 'line-memory.mjs');
@@ -28,6 +28,10 @@ Commands:
28
28
  sources Show all canonical provider dispositions
29
29
  discover --workspace <path> Inventory authorized workspace histories
30
30
  import-discovered --workspace <path> Import the exact saved manifest
31
+ grok-list --workspace <path> List Grok Build CLI session IDs for a workspace
32
+ grok-search <query> --workspace <path> Search Grok Build CLI session IDs
33
+ grok-export <id> --workspace <path> --out <dir> Export one CLI transcript
34
+ grok-id <file> --format json|streaming-json Read a headless session ID
31
35
  import <file> --source-id <id> Import a supported provider JSONL source
32
36
  list [--limit N] [--cursor N] List normalized sessions
33
37
  timeline [--gap 30m] Report chronological activity segments
@@ -155,6 +159,28 @@ async function executeCommand(ctx, args) {
155
159
  return discoverWorkspace(ctx, args);
156
160
  if (command === 'import-discovered')
157
161
  return importDiscovered(ctx, args);
162
+ if (command === 'grok-list' || command === 'grok-search' || command === 'grok-export') {
163
+ const workspace = resolve(ctx.cwd, requiredValue(args, '--workspace'));
164
+ const options = { cwd: workspace, binary: args.values.get('--grok-bin') };
165
+ if (command === 'grok-list') {
166
+ return ok(command, { sessionIds: await grokBuildList(options, boundedInteger(args.values.get('--limit'), 20, 1, 500, '--limit')) });
167
+ }
168
+ if (command === 'grok-search') {
169
+ return ok(command, { sessionIds: await grokBuildSearch(options, requiredPositional(args, 0, 'query'), boundedInteger(args.values.get('--limit'), 20, 1, 500, '--limit')) });
170
+ }
171
+ if (isDryRun(ctx, args)) {
172
+ return preview(command, { sessionId: requiredPositional(args, 0, 'session ID'), wouldExport: true });
173
+ }
174
+ const output = await grokBuildExport(options, requiredPositional(args, 0, 'session ID'), resolve(ctx.cwd, requiredValue(args, '--out')));
175
+ return ok(command, { source: output, provider: 'grok-build', sourceId: `grok-build-${basename(output, '.md')}` });
176
+ }
177
+ if (command === 'grok-id') {
178
+ const format = args.values.get('--format');
179
+ if (format !== 'json' && format !== 'streaming-json') {
180
+ throw new SessionContractError('INVALID_ARGUMENT', '--format must be json or streaming-json');
181
+ }
182
+ return ok(command, { sessionId: await grokHeadlessSessionIdFromFile(resolve(ctx.cwd, requiredPositional(args, 0, 'file')), format) });
183
+ }
158
184
  const repository = openRepository(ctx, args);
159
185
  try {
160
186
  switch (command) {
@@ -656,7 +682,7 @@ async function importSource(ctx, args) {
656
682
  if (provider !== 'generic' && provider !== 'claude' && provider !== 'codex'
657
683
  && provider !== 'copilot' && provider !== 'cursor' && provider !== 'factory'
658
684
  && provider !== 'hermes' && provider !== 'opencode' && provider !== 'openclaw'
659
- && provider !== 'openhuman' && provider !== 'grokbot' && provider !== 'pi' && provider !== 'omp' && provider !== 'deepseek-harness' && provider !== 'warp' && provider !== 'devin-desktop') {
685
+ && provider !== 'openhuman' && provider !== 'grokbot' && provider !== 'grok-build' && provider !== 'muse' && provider !== 'pi' && provider !== 'omp' && provider !== 'deepseek-harness' && provider !== 'warp' && provider !== 'devin-desktop') {
660
686
  throw new CliError('UNSUPPORTED_OPERATION', `session import is not implemented for ${provider}`, EXIT.unsupported);
661
687
  }
662
688
  const sourceId = requiredValue(args, '--source-id');
@@ -673,6 +699,8 @@ async function importSource(ctx, args) {
673
699
  const isOpenClaw = provider === 'openclaw';
674
700
  const isOpenHuman = provider === 'openhuman';
675
701
  const isGrokbot = provider === 'grokbot';
702
+ const isGrokBuild = provider === 'grok-build';
703
+ const isMuse = provider === 'muse';
676
704
  const isPi = provider === 'pi';
677
705
  const isOmp = provider === 'omp';
678
706
  const isDsh = provider === 'deepseek-harness';
@@ -698,13 +726,17 @@ async function importSource(ctx, args) {
698
726
  ? new OpenHumanSessionAdapter()
699
727
  : isGrokbot
700
728
  ? new GrokbotSessionAdapter()
701
- : isPi
702
- ? new PiSessionAdapter()
703
- : isWarp
704
- ? new WarpSessionAdapter()
705
- : isDevinDesktop
706
- ? new DevinDesktopSessionAdapter()
707
- : new GenericSessionInterchangeAdapter();
729
+ : isGrokBuild
730
+ ? new GrokBuildSessionAdapter()
731
+ : isMuse
732
+ ? new MuseSessionAdapter()
733
+ : isPi
734
+ ? new PiSessionAdapter()
735
+ : isWarp
736
+ ? new WarpSessionAdapter()
737
+ : isDevinDesktop
738
+ ? new DevinDesktopSessionAdapter()
739
+ : new GenericSessionInterchangeAdapter();
708
740
  const locatorClass = isDsh ? 'deepseek-harness-session-v2-jsonl' : isOmp ? 'omp-session-v3-jsonl' : isClaude
709
741
  ? claudeLocatorClass(input)
710
742
  : isCodex
@@ -725,13 +757,17 @@ async function importSource(ctx, args) {
725
757
  ? 'openhuman-enriched-jsonl'
726
758
  : isGrokbot
727
759
  ? 'manual-export'
728
- : isPi
729
- ? 'pi-session-v3-jsonl'
730
- : isWarp
731
- ? 'warp-markdown-export'
732
- : isDevinDesktop
733
- ? 'devin-desktop-cascade-hook-jsonl'
734
- : 'manual-export';
760
+ : isGrokBuild
761
+ ? GROK_BUILD_CLI_EXPORT_LOCATOR_CLASS
762
+ : isMuse
763
+ ? 'manual-export'
764
+ : isPi
765
+ ? 'pi-session-v3-jsonl'
766
+ : isWarp
767
+ ? 'warp-markdown-export'
768
+ : isDevinDesktop
769
+ ? 'devin-desktop-cascade-hook-jsonl'
770
+ : 'manual-export';
735
771
  const selectedSource = {
736
772
  provider, locator: input, locatorClass, sourceId,
737
773
  authorizedScope: { workspaceId, allowedRoots: [dirname(input)] },
@@ -759,11 +795,15 @@ async function importSource(ctx, args) {
759
795
  ? 'schema-1-session-raw-enriched'
760
796
  : isGrokbot
761
797
  ? 'manual-interchange'
762
- : isWarp
763
- ? 'manual-lossy-markdown-export'
764
- : isDevinDesktop
765
- ? 'opt-in-cascade-transcript-hook'
766
- : 'manual-interchange',
798
+ : isGrokBuild
799
+ ? 'documented-cli-markdown-export'
800
+ : isMuse
801
+ ? 'muse-export-trajectory-v1'
802
+ : isWarp
803
+ ? 'manual-lossy-markdown-export'
804
+ : isDevinDesktop
805
+ ? 'opt-in-cascade-transcript-hook'
806
+ : 'manual-interchange',
767
807
  locatorClass, redactedLocator: redactSourceLocator(input),
768
808
  adapterVersion: isDsh ? DEEPSEEK_HARNESS_ADAPTER_VERSION : isOmp ? OMP_ADAPTER_VERSION : isClaude
769
809
  ? CLAUDE_ADAPTER_VERSION
@@ -785,16 +825,20 @@ async function importSource(ctx, args) {
785
825
  ? OPENHUMAN_ADAPTER_VERSION
786
826
  : isGrokbot
787
827
  ? GROKBOT_ADAPTER_VERSION
788
- : isWarp
789
- ? WARP_ADAPTER_VERSION
790
- : isDevinDesktop
791
- ? DEVIN_DESKTOP_ADAPTER_VERSION
792
- : GENERIC_ADAPTER_VERSION,
828
+ : isGrokBuild
829
+ ? GROK_BUILD_ADAPTER_VERSION
830
+ : isMuse
831
+ ? MUSE_ADAPTER_VERSION
832
+ : isWarp
833
+ ? WARP_ADAPTER_VERSION
834
+ : isDevinDesktop
835
+ ? DEVIN_DESKTOP_ADAPTER_VERSION
836
+ : GENERIC_ADAPTER_VERSION,
793
837
  sourceSchemaVersion: probe.sourceSchemaVersion,
794
- disposition: isWarp || isGrokbot
838
+ disposition: isWarp || isGrokbot || isMuse
795
839
  ? 'manual-only'
796
840
  : isClaude || isCodex || isCopilot || isCursor || isFactory || isHermes
797
- || isOpenCode || isOpenClaw || isOpenHuman || isDevinDesktop || isOmp || isDsh || isPi
841
+ || isOpenCode || isOpenClaw || isOpenHuman || isGrokBuild || isDevinDesktop || isOmp || isDsh || isPi
798
842
  ? 'implemented' : 'manual-only',
799
843
  operationalState: probe.operationalState,
800
844
  consistency: probe.consistency, authorizedAt: new Date().toISOString(),
@@ -818,14 +862,18 @@ async function importSource(ctx, args) {
818
862
  ? { 'native.openhuman': {} }
819
863
  : isGrokbot
820
864
  ? { 'native.grokbot': {} }
821
- : isWarp
822
- ? { 'native.warp': {} }
823
- : isDevinDesktop
824
- ? { 'native.devin-desktop': {
825
- product: 'Devin Desktop',
826
- compatibilityProviderId: 'windsurf',
827
- } }
828
- : { 'native.generic': {} },
865
+ : isGrokBuild
866
+ ? { 'native.grok-build': { acquisition: 'grok-cli-export-markdown' } }
867
+ : isMuse
868
+ ? { 'native.muse': {} }
869
+ : isWarp
870
+ ? { 'native.warp': {} }
871
+ : isDevinDesktop
872
+ ? { 'native.devin-desktop': {
873
+ product: 'Devin Desktop',
874
+ compatibilityProviderId: 'windsurf',
875
+ } }
876
+ : { 'native.generic': {} },
829
877
  });
830
878
  if (isDryRun(ctx, args)) {
831
879
  return preview('import', { source, wouldInspect: true, wouldPersist: false });
@@ -1375,6 +1423,34 @@ function providerDisposition(provider) {
1375
1423
  },
1376
1424
  };
1377
1425
  }
1426
+ if (provider === 'grok-build') {
1427
+ return {
1428
+ provider, disposition: 'implemented', operationalState: 'available',
1429
+ supportedOperations: ['inspect', 'stream'],
1430
+ acquisitionModes: ['manual-export'],
1431
+ reasonCode: 'CLI_EXPORT_REQUIRED',
1432
+ remediation: 'Run `grok sessions list`, then `grok export <session-id> <session-id>.md` and import the explicitly authorized Markdown file.',
1433
+ evidence: {
1434
+ adapterVersion: GROK_BUILD_ADAPTER_VERSION,
1435
+ verifiedAt: '2026-09-21',
1436
+ documentation: 'https://docs.x.ai/build/features/sessions',
1437
+ },
1438
+ };
1439
+ }
1440
+ if (provider === 'muse') {
1441
+ return {
1442
+ provider, disposition: 'manual-only', operationalState: 'available',
1443
+ supportedOperations: ['inspect', 'stream'],
1444
+ acquisitionModes: ['manual-export'],
1445
+ reasonCode: 'MANUAL_SOURCE_SELECTION_REQUIRED',
1446
+ remediation: 'Run `muse export --session <id-or-session.jsonl>` and explicitly select the trajectory JSON; sessions live under $XDG_DATA_HOME/muse/sessions, but that native log format is internal, so auto-discover is unsupported.',
1447
+ evidence: {
1448
+ adapterVersion: MUSE_ADAPTER_VERSION,
1449
+ verifiedAt: '2026-09-24',
1450
+ documentation: 'docs/providers/muse-sessions.md',
1451
+ },
1452
+ };
1453
+ }
1378
1454
  if (provider === 'warp') {
1379
1455
  return {
1380
1456
  provider, disposition: 'manual-only', operationalState: 'available',
@@ -1487,7 +1563,7 @@ function parseArgs(argv) {
1487
1563
  '--inactivity-threshold',
1488
1564
  '--control-events',
1489
1565
  '--session', '--status', '--actor', '--group-by',
1490
- '--out', '--plan', '--input', '--shard-name', '--max-attachment-bytes',
1566
+ '--out', '--plan', '--input', '--shard-name', '--max-attachment-bytes', '--format', '--grok-bin',
1491
1567
  ]);
1492
1568
  let command;
1493
1569
  for (let index = 0; index < argv.length; index += 1) {
@@ -24,6 +24,7 @@ import { getProjectDir } from "../../config/aiwg-config.js";
24
24
  import { formatDeployedWorkspaceSignalPlan, readWorkspaceSignalPlan } from "../workspace-signals.js";
25
25
  import * as path from "node:path";
26
26
  import * as fsSync from "node:fs";
27
+ import { pathToFileURL } from "node:url";
27
28
  /** Generate or deploy the canonical project quickref. */
28
29
  export const quickrefHandler = {
29
30
  id: 'quickref',
@@ -713,6 +714,36 @@ export const removeHandler = {
713
714
  if (ctx.args.includes('--user') || isScopeUser(ctx.args)) {
714
715
  return await removeUserScopeDeploy(ctx.args);
715
716
  }
717
+ if (firstRemovePositional(ctx.args) === 'grok-build') {
718
+ const providerParse = parseRemoveProvider(ctx.args);
719
+ if (providerParse.provider !== 'grok-build' || providerParse.error) {
720
+ return { exitCode: 1, message: 'Use aiwg remove grok-build --provider grok-build [--dry-run] for reviewed project-scope removal.' };
721
+ }
722
+ const frameworkRoot = await getFrameworkRoot();
723
+ const { uninstall } = (await import(pathToFileURL(path.join(frameworkRoot, 'tools/agents/providers/grok-build.mjs')).href));
724
+ const { readAiwgConfig, writeAiwgConfig } = await import('../../config/aiwg-config.js');
725
+ const target = getProjectDir({ cwd: ctx.cwd }, ctx.args);
726
+ const dryRun = ctx.args.includes('--dry-run');
727
+ const report = uninstall(target, { dryRun, srcRoot: frameworkRoot });
728
+ if (!dryRun && report.skipped.length === 0) {
729
+ const config = await readAiwgConfig(target);
730
+ if (config) {
731
+ for (const [name, entry] of Object.entries(config.installed ?? {})) {
732
+ delete entry.deployedTo?.['grok-build'];
733
+ if (Object.keys(entry.deployedTo ?? {}).length === 0)
734
+ delete config.installed[name];
735
+ }
736
+ await writeAiwgConfig(target, config);
737
+ }
738
+ }
739
+ const lines = [
740
+ `${dryRun ? 'Would remove' : 'Removed'} ${dryRun ? report.planned.length : report.removed.length} unchanged AIWG-owned Grok Build artifact(s).`,
741
+ ...report.planned.map(relative => ` ${relative}`),
742
+ ...report.skipped.map(relative => ` Preserved modified or unverifiable: ${relative}`),
743
+ 'Operator-owned Grok content and shared context files are preserved.',
744
+ ];
745
+ return { exitCode: report.skipped.length ? 1 : 0, message: lines.join('\n') };
746
+ }
716
747
  // #1037 — Project-local-aware remove. If the first positional arg matches
717
748
  // a project-local entry in `installed`, route to the new handler.
718
749
  // Otherwise fall through to the existing plugin-uninstaller flow.
@@ -179,9 +179,9 @@ async function loadDeployModelsConfig(frameworkRoot) {
179
179
  }
180
180
  return {
181
181
  shorthand: {
182
- opus: 'claude-opus-4-6',
183
- sonnet: 'claude-sonnet-4-6',
184
- haiku: 'claude-haiku-4-5-20251001',
182
+ opus: 'claude-opus-5',
183
+ sonnet: 'claude-sonnet-5',
184
+ haiku: 'claude-haiku-4-5',
185
185
  inherit: 'inherit',
186
186
  },
187
187
  claude_shorthand: { opus: 'opus', sonnet: 'sonnet', haiku: 'haiku', inherit: 'inherit' },
@@ -249,6 +249,27 @@ function resolveFrameworkDir(framework) {
249
249
  * aiwg-dev is contributor-only tooling — not for end users.
250
250
  */
251
251
  export const USE_ALL_DISALLOW = new Set(['aiwg-dev']);
252
+ /**
253
+ * Whether an addon's manifest keeps it out of bulk deploys (#2641).
254
+ *
255
+ * `devOnly` marks contributor tooling; `explicitInstall` marks an addon that is
256
+ * deployed only when named, such as `aiwg use decision-engine`. Both match
257
+ * `discoverAddons()` in tools/agents/providers/base.mjs, which applies the same
258
+ * rule to framework-mode deploys.
259
+ *
260
+ * `autoInstall: false` is deliberately NOT an exclusion signal: most addons
261
+ * declare it (and the extension manifest schema defaults to it), so honoring
262
+ * it would drop most addons from `all` for existing users.
263
+ */
264
+ async function isExplicitOnlyAddon(addonDir) {
265
+ try {
266
+ const manifest = JSON.parse(await fs.readFile(path.join(addonDir, 'manifest.json'), 'utf8'));
267
+ return manifest?.devOnly === true || manifest?.explicitInstall === true;
268
+ }
269
+ catch {
270
+ return false;
271
+ }
272
+ }
252
273
  /** Full-framework setup requires the corpus omitted by the lightweight CLI. */
253
274
  async function bundledSetupPrerequisiteMessage(frameworkRoot) {
254
275
  let packageName;
@@ -280,14 +301,15 @@ async function bundledSetupPrerequisiteMessage(frameworkRoot) {
280
301
  ].join('\n');
281
302
  }
282
303
  /**
283
- * Discover all addon names from the filesystem, minus the disallow list.
304
+ * Discover all addon names from the filesystem, minus the disallow list and
305
+ * addons whose manifest restricts them to explicit installs.
284
306
  */
285
307
  export async function getAllAddons(frameworkRoot) {
286
308
  const addonsDir = path.join(frameworkRoot, 'agentic/code/addons');
287
309
  const entries = await fs.readdir(addonsDir, { withFileTypes: true });
288
- return entries
289
- .filter(e => e.isDirectory() && !USE_ALL_DISALLOW.has(e.name))
290
- .map(e => e.name);
310
+ const candidates = entries.filter(e => e.isDirectory() && !USE_ALL_DISALLOW.has(e.name));
311
+ const excluded = await Promise.all(candidates.map(e => isExplicitOnlyAddon(path.join(addonsDir, e.name))));
312
+ return candidates.filter((_, index) => !excluded[index]).map(e => e.name);
291
313
  }
292
314
  /**
293
315
  * Extensions excluded from `aiwg use all` deployment.
@@ -338,7 +360,8 @@ export function extensionPath(frameworkRoot, name) {
338
360
  /**
339
361
  * Check whether a given addon name exists on disk.
340
362
  * The USE_ALL_DISALLOW list does NOT block explicit single-addon installs —
341
- * contributors can still run `aiwg use aiwg-dev` directly.
363
+ * contributors can still run `aiwg use aiwg-dev`, and operators
364
+ * `aiwg use decision-engine` (an explicitInstall addon), directly.
342
365
  */
343
366
  /** Resolve canonical addon folder name from user-supplied alias. */
344
367
  function resolveAddonFolderName(name) {
@@ -3338,6 +3361,17 @@ export class UseHandler {
3338
3361
  };
3339
3362
  }
3340
3363
  }
3364
+ if (provider === 'muse') {
3365
+ // #226 — fail closed: never let --scope user proceed with unusable
3366
+ // XDG metadata (the mirror would silently land nothing at user scope).
3367
+ const { resolveMuseXdgSkillsDir, museXdgSkillsDirRemediation } = await import('../../providers/muse-paths.js');
3368
+ if (!resolveMuseXdgSkillsDir()) {
3369
+ return {
3370
+ exitCode: 1,
3371
+ message: museXdgSkillsDirRemediation(),
3372
+ };
3373
+ }
3374
+ }
3341
3375
  }
3342
3376
  // Pre-deployment collision check (skip in dry-run — nothing is written)
3343
3377
  if (!dryRun) {
@@ -3767,6 +3801,9 @@ export class UseHandler {
3767
3801
  }
3768
3802
  }
3769
3803
  catch (err) {
3804
+ if (provider === 'grok-build') {
3805
+ return { exitCode: 1, message: `--scope user mirror failed: ${err instanceof Error ? err.message : String(err)}` };
3806
+ }
3770
3807
  ui.warn(`--scope user mirror failed: ${err instanceof Error ? err.message : String(err)}`);
3771
3808
  }
3772
3809
  }
@@ -3825,7 +3862,7 @@ export class UseHandler {
3825
3862
  }
3826
3863
  else {
3827
3864
  // Cross-provider providers per ADR-3 §7 (no-op if their dir not present)
3828
- const bridgeProviders = ['codex', 'copilot', 'factory', 'hermes'];
3865
+ const bridgeProviders = ['codex', 'copilot', 'factory', 'grok-build', 'hermes'];
3829
3866
  const results = await bridgeAll(sources, bridgeProviders, {
3830
3867
  projectPath: target,
3831
3868
  dryRun,
@@ -509,6 +509,16 @@ export const doctorHandler = {
509
509
  // Run core doctor diagnostics
510
510
  const result = await runner.run('tools/cli/doctor.mjs', ctx.args, { cwd: ctx.cwd });
511
511
  let agentSkillsFailure = false;
512
+ try {
513
+ const { inspectGrokBuildNative } = await import('../../mcp/grok-build-config.mjs');
514
+ const native = await inspectGrokBuildNative({ projectDir: ctx.cwd || process.cwd() });
515
+ console.log(`\n── Grok Build native extensions ──\n MCP: ${native.mcp}\n Hooks: ${native.hooks}`);
516
+ for (const diagnostic of native.diagnostics)
517
+ console.log(` ⚠ ${diagnostic}`);
518
+ }
519
+ catch (error) {
520
+ console.log(`\n── Grok Build native extensions ──\n ⚠ unable to audit: ${error instanceof Error ? error.message : String(error)}`);
521
+ }
512
522
  try {
513
523
  const { buildAgentSkillsDoctorSection } = await import('../../skills/doctor.js');
514
524
  const section = buildAgentSkillsDoctorSection(ctx.cwd || process.cwd());
@@ -55,9 +55,11 @@ export const statusHandler = {
55
55
  provider: statusFlagValue(ctx.args, '--provider'),
56
56
  bundle: statusFlagValue(ctx.args, '--bundle'),
57
57
  });
58
+ const { inspectGrokBuildNative } = await import('../../mcp/grok-build-config.mjs');
59
+ const grokBuildNative = await inspectGrokBuildNative({ projectDir: projectRoot });
58
60
  return {
59
61
  exitCode: probe.status === 'needs-repair' ? 1 : 0,
60
- message: JSON.stringify(probe, null, 2),
62
+ message: JSON.stringify({ ...probe, grokBuildNative }, null, 2),
61
63
  rawOutput: true,
62
64
  };
63
65
  }