@kbediako/codex-orchestrator 0.1.38 → 0.2.1

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 (311) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/README.md +46 -317
  3. package/bin/codex-orchestrator.js +161 -0
  4. package/codex.orchestrator.json +149 -13
  5. package/dist/bin/codex-orchestrator.js +797 -1154
  6. package/dist/orchestrator/src/cli/adapters/CommandBuilder.js +50 -0
  7. package/dist/orchestrator/src/cli/adapters/CommandPlanner.js +22 -4
  8. package/dist/orchestrator/src/cli/adapters/CommandReviewer.js +3 -3
  9. package/dist/orchestrator/src/cli/adapters/CommandTester.js +2 -2
  10. package/dist/orchestrator/src/cli/adapters/cloudFailureDiagnostics.js +295 -11
  11. package/dist/orchestrator/src/cli/coStatusAttachCliShell.js +402 -0
  12. package/dist/orchestrator/src/cli/coStatusCliShell.js +451 -0
  13. package/dist/orchestrator/src/cli/coStatusOperatorAutopilotCliShell.js +120 -0
  14. package/dist/orchestrator/src/cli/codexCliShell.js +119 -0
  15. package/dist/orchestrator/src/cli/codexDefaultsSetup.js +265 -36
  16. package/dist/orchestrator/src/cli/config/delegationConfig.js +317 -5
  17. package/dist/orchestrator/src/cli/config/repoConfigPolicy.js +2 -3
  18. package/dist/orchestrator/src/cli/config/userConfig.js +28 -13
  19. package/dist/orchestrator/src/cli/control/authenticatedControlRouteGate.js +69 -0
  20. package/dist/orchestrator/src/cli/control/authenticatedRouteComposition.js +267 -0
  21. package/dist/orchestrator/src/cli/control/authenticatedRouteController.js +5 -0
  22. package/dist/orchestrator/src/cli/control/authenticatedRouteDispatcher.js +41 -0
  23. package/dist/orchestrator/src/cli/control/compatibilityIssuePresenter.js +1035 -0
  24. package/dist/orchestrator/src/cli/control/confirmationApproveController.js +62 -0
  25. package/dist/orchestrator/src/cli/control/confirmationCreateController.js +69 -0
  26. package/dist/orchestrator/src/cli/control/confirmationIssueConsumeController.js +43 -0
  27. package/dist/orchestrator/src/cli/control/confirmationListController.js +22 -0
  28. package/dist/orchestrator/src/cli/control/confirmationValidateController.js +58 -0
  29. package/dist/orchestrator/src/cli/control/confirmations.js +25 -3
  30. package/dist/orchestrator/src/cli/control/controlActionCancelConfirmation.js +65 -0
  31. package/dist/orchestrator/src/cli/control/controlActionController.js +77 -0
  32. package/dist/orchestrator/src/cli/control/controlActionControllerSequencing.js +161 -0
  33. package/dist/orchestrator/src/cli/control/controlActionExecution.js +142 -0
  34. package/dist/orchestrator/src/cli/control/controlActionFinalization.js +43 -0
  35. package/dist/orchestrator/src/cli/control/controlActionOutcome.js +60 -0
  36. package/dist/orchestrator/src/cli/control/controlActionPreflight.js +476 -0
  37. package/dist/orchestrator/src/cli/control/controlAuthenticatedRouteHandoff.js +57 -0
  38. package/dist/orchestrator/src/cli/control/controlBootstrapAssembly.js +39 -0
  39. package/dist/orchestrator/src/cli/control/controlBootstrapMetadataPersistence.js +16 -0
  40. package/dist/orchestrator/src/cli/control/controlEventTransport.js +49 -0
  41. package/dist/orchestrator/src/cli/control/controlExpiryLifecycle.js +102 -0
  42. package/dist/orchestrator/src/cli/control/controlHostOwnership.js +480 -0
  43. package/dist/orchestrator/src/cli/control/controlHostSupervision.js +630 -0
  44. package/dist/orchestrator/src/cli/control/controlOversightFacade.js +8 -0
  45. package/dist/orchestrator/src/cli/control/controlOversightReadContract.js +1 -0
  46. package/dist/orchestrator/src/cli/control/controlOversightReadService.js +16 -0
  47. package/dist/orchestrator/src/cli/control/controlOversightUpdateContract.js +1 -0
  48. package/dist/orchestrator/src/cli/control/controlPersistenceFiles.js +6 -0
  49. package/dist/orchestrator/src/cli/control/controlQuestionChildResolution.js +18 -0
  50. package/dist/orchestrator/src/cli/control/controlRequestContext.js +42 -0
  51. package/dist/orchestrator/src/cli/control/controlRequestController.js +9 -0
  52. package/dist/orchestrator/src/cli/control/controlRequestPredispatch.js +17 -0
  53. package/dist/orchestrator/src/cli/control/controlRequestRouteDispatch.js +44 -0
  54. package/dist/orchestrator/src/cli/control/controlRuntime.js +1003 -0
  55. package/dist/orchestrator/src/cli/control/controlServer.js +23 -1456
  56. package/dist/orchestrator/src/cli/control/controlServerAuditAndErrorHelpers.js +115 -0
  57. package/dist/orchestrator/src/cli/control/controlServerAuthenticatedRouteBranch.js +29 -0
  58. package/dist/orchestrator/src/cli/control/controlServerBootstrapLifecycle.js +30 -0
  59. package/dist/orchestrator/src/cli/control/controlServerBootstrapStartSequence.js +21 -0
  60. package/dist/orchestrator/src/cli/control/controlServerOwnedRuntimeLifecycle.js +67 -0
  61. package/dist/orchestrator/src/cli/control/controlServerPublicLifecycle.js +756 -0
  62. package/dist/orchestrator/src/cli/control/controlServerPublicRouteHelpers.js +86 -0
  63. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceLifecycle.js +25 -0
  64. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceStartup.js +18 -0
  65. package/dist/orchestrator/src/cli/control/controlServerRequestBodyHelpers.js +37 -0
  66. package/dist/orchestrator/src/cli/control/controlServerRequestShell.js +40 -0
  67. package/dist/orchestrator/src/cli/control/controlServerRequestShellBinding.js +17 -0
  68. package/dist/orchestrator/src/cli/control/controlServerSeedLoading.js +27 -0
  69. package/dist/orchestrator/src/cli/control/controlServerSeededRuntimeAssembly.js +186 -0
  70. package/dist/orchestrator/src/cli/control/controlServerStartupInputPreparation.js +31 -0
  71. package/dist/orchestrator/src/cli/control/controlServerStartupSequence.js +49 -0
  72. package/dist/orchestrator/src/cli/control/controlState.js +233 -2
  73. package/dist/orchestrator/src/cli/control/controlStatusDashboard.js +1904 -0
  74. package/dist/orchestrator/src/cli/control/controlTelegramBridgeBootstrapLifecycle.js +22 -0
  75. package/dist/orchestrator/src/cli/control/controlTelegramBridgeLifecycle.js +67 -0
  76. package/dist/orchestrator/src/cli/control/controlTelegramBridgeOversightFacadeFactory.js +8 -0
  77. package/dist/orchestrator/src/cli/control/controlTelegramCommandController.js +49 -0
  78. package/dist/orchestrator/src/cli/control/controlTelegramDispatchRead.js +40 -0
  79. package/dist/orchestrator/src/cli/control/controlTelegramPollingController.js +89 -0
  80. package/dist/orchestrator/src/cli/control/controlTelegramProjectionNotificationController.js +29 -0
  81. package/dist/orchestrator/src/cli/control/controlTelegramPushState.js +63 -0
  82. package/dist/orchestrator/src/cli/control/controlTelegramQuestionRead.js +13 -0
  83. package/dist/orchestrator/src/cli/control/controlTelegramReadController.js +216 -0
  84. package/dist/orchestrator/src/cli/control/controlTelegramUpdateHandler.js +63 -0
  85. package/dist/orchestrator/src/cli/control/controlWatcher.js +73 -5
  86. package/dist/orchestrator/src/cli/control/delegationRegisterController.js +35 -0
  87. package/dist/orchestrator/src/cli/control/dynamicToolBridgePolicy.js +139 -0
  88. package/dist/orchestrator/src/cli/control/eventsSseController.js +12 -0
  89. package/dist/orchestrator/src/cli/control/linearBudgetState.js +1789 -0
  90. package/dist/orchestrator/src/cli/control/linearDispatchSource.js +1137 -0
  91. package/dist/orchestrator/src/cli/control/linearGraphqlClient.js +150 -0
  92. package/dist/orchestrator/src/cli/control/linearRateLimit.js +102 -0
  93. package/dist/orchestrator/src/cli/control/linearWebhookController.js +499 -0
  94. package/dist/orchestrator/src/cli/control/liveLinearAdvisoryRuntime.js +70 -0
  95. package/dist/orchestrator/src/cli/control/observabilityApiController.js +173 -0
  96. package/dist/orchestrator/src/cli/control/observabilityReadModel.js +500 -0
  97. package/dist/orchestrator/src/cli/control/observabilitySurface.js +284 -0
  98. package/dist/orchestrator/src/cli/control/observabilityUpdateNotifier.js +22 -0
  99. package/dist/orchestrator/src/cli/control/operatorDashboardPresenter.js +252 -0
  100. package/dist/orchestrator/src/cli/control/providerAgentCapacity.js +70 -0
  101. package/dist/orchestrator/src/cli/control/providerControlHostFreshnessGauge.js +1068 -0
  102. package/dist/orchestrator/src/cli/control/providerIntakeState.js +473 -0
  103. package/dist/orchestrator/src/cli/control/providerIssueHandoff.js +6811 -0
  104. package/dist/orchestrator/src/cli/control/providerIssueObservability.js +1348 -0
  105. package/dist/orchestrator/src/cli/control/providerIssueRetryQueue.js +84 -0
  106. package/dist/orchestrator/src/cli/control/providerLinearRuntimeProof.js +588 -0
  107. package/dist/orchestrator/src/cli/control/providerLinearScreenshotProof.js +473 -0
  108. package/dist/orchestrator/src/cli/control/providerLinearWorkerTruth.js +383 -0
  109. package/dist/orchestrator/src/cli/control/providerLinearWorkflowAudit.js +254 -0
  110. package/dist/orchestrator/src/cli/control/providerLinearWorkflowFacade.js +5573 -0
  111. package/dist/orchestrator/src/cli/control/providerLinearWorkflowStates.js +115 -0
  112. package/dist/orchestrator/src/cli/control/providerMergeCloseout.js +1868 -0
  113. package/dist/orchestrator/src/cli/control/providerOperatorAutopilot.js +1580 -0
  114. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLifecycle.js +154 -0
  115. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLocalRolloutExecution.js +1006 -0
  116. package/dist/orchestrator/src/cli/control/providerPollingHealth.js +435 -0
  117. package/dist/orchestrator/src/cli/control/providerTerminalCleanup.js +516 -0
  118. package/dist/orchestrator/src/cli/control/providerWorkerHosts.js +191 -0
  119. package/dist/orchestrator/src/cli/control/providerWorkflowConfigStore.js +515 -0
  120. package/dist/orchestrator/src/cli/control/questionChildResolutionAdapter.js +361 -0
  121. package/dist/orchestrator/src/cli/control/questionQueueController.js +181 -0
  122. package/dist/orchestrator/src/cli/control/questionReadRetryDeduplication.js +9 -0
  123. package/dist/orchestrator/src/cli/control/questionReadSequence.js +10 -0
  124. package/dist/orchestrator/src/cli/control/securityViolationController.js +27 -0
  125. package/dist/orchestrator/src/cli/control/selectedRunProjection.js +1885 -0
  126. package/dist/orchestrator/src/cli/control/telegramOversightApiClient.js +48 -0
  127. package/dist/orchestrator/src/cli/control/telegramOversightBridge.js +180 -0
  128. package/dist/orchestrator/src/cli/control/telegramOversightBridgeProjectionDeliveryQueue.js +25 -0
  129. package/dist/orchestrator/src/cli/control/telegramOversightBridgeRuntimeLifecycle.js +45 -0
  130. package/dist/orchestrator/src/cli/control/telegramOversightBridgeStateStore.js +77 -0
  131. package/dist/orchestrator/src/cli/control/telegramOversightControlActionApiClient.js +45 -0
  132. package/dist/orchestrator/src/cli/control/trackerDispatchPilot.js +439 -0
  133. package/dist/orchestrator/src/cli/control/uiDataController.js +34 -0
  134. package/dist/orchestrator/src/cli/control/uiSessionController.js +100 -0
  135. package/dist/orchestrator/src/cli/controlHostCliShell.js +860 -0
  136. package/dist/orchestrator/src/cli/controlHostFreshnessGaugeCliShell.js +129 -0
  137. package/dist/orchestrator/src/cli/controlHostSupervisionCliShell.js +2127 -0
  138. package/dist/orchestrator/src/cli/delegationCliShell.js +62 -0
  139. package/dist/orchestrator/src/cli/delegationServer.js +567 -678
  140. package/dist/orchestrator/src/cli/delegationServerCliShell.js +52 -0
  141. package/dist/orchestrator/src/cli/delegationServerQuestionFlowShell.js +228 -0
  142. package/dist/orchestrator/src/cli/delegationServerToolDispatchShell.js +411 -0
  143. package/dist/orchestrator/src/cli/delegationServerTransport.js +274 -0
  144. package/dist/orchestrator/src/cli/delegationSetup.js +51 -171
  145. package/dist/orchestrator/src/cli/devtoolsCliShell.js +34 -0
  146. package/dist/orchestrator/src/cli/doctor.js +678 -164
  147. package/dist/orchestrator/src/cli/doctorCliRequestShell.js +72 -0
  148. package/dist/orchestrator/src/cli/doctorCliShell.js +138 -0
  149. package/dist/orchestrator/src/cli/doctorUsage.js +119 -15
  150. package/dist/orchestrator/src/cli/exec/experience.js +16 -2
  151. package/dist/orchestrator/src/cli/exec/summary.js +3 -0
  152. package/dist/orchestrator/src/cli/execCliShell.js +51 -0
  153. package/dist/orchestrator/src/cli/flowCliRequestShell.js +44 -0
  154. package/dist/orchestrator/src/cli/flowCliShell.js +239 -0
  155. package/dist/orchestrator/src/cli/frontendTestCliRequestShell.js +80 -0
  156. package/dist/orchestrator/src/cli/frontendTestCliShell.js +41 -0
  157. package/dist/orchestrator/src/cli/init.js +95 -1
  158. package/dist/orchestrator/src/cli/initCliShell.js +50 -0
  159. package/dist/orchestrator/src/cli/linearCliShell.js +1200 -0
  160. package/dist/orchestrator/src/cli/mcpEnableCliShell.js +132 -0
  161. package/dist/orchestrator/src/cli/metrics/metricsAggregator.js +3 -2
  162. package/dist/orchestrator/src/cli/metrics/metricsRecorder.js +56 -0
  163. package/dist/orchestrator/src/cli/orchestrator.js +66 -1376
  164. package/dist/orchestrator/src/cli/planCliShell.js +19 -0
  165. package/dist/orchestrator/src/cli/prCliShell.js +41 -0
  166. package/dist/orchestrator/src/cli/providerLinearChildLanePhaseContract.js +204 -0
  167. package/dist/orchestrator/src/cli/providerLinearChildLaneRunner.js +1835 -0
  168. package/dist/orchestrator/src/cli/providerLinearChildLaneShell.js +2420 -0
  169. package/dist/orchestrator/src/cli/providerLinearChildStreamShell.js +385 -0
  170. package/dist/orchestrator/src/cli/providerLinearWorkerRunner.js +6834 -0
  171. package/dist/orchestrator/src/cli/resumeCliShell.js +14 -0
  172. package/dist/orchestrator/src/cli/reviewCliLaunchShell.js +72 -0
  173. package/dist/orchestrator/src/cli/rlm/alignment.js +3 -3
  174. package/dist/orchestrator/src/cli/rlm/context.js +94 -7
  175. package/dist/orchestrator/src/cli/rlm/rlmCodexRuntimeShell.js +546 -0
  176. package/dist/orchestrator/src/cli/rlm/symbolic.js +4 -2
  177. package/dist/orchestrator/src/cli/rlmCliRequestShell.js +42 -0
  178. package/dist/orchestrator/src/cli/rlmCompletionCliShell.js +46 -0
  179. package/dist/orchestrator/src/cli/rlmLaunchCliShell.js +51 -0
  180. package/dist/orchestrator/src/cli/rlmRunner.js +83 -523
  181. package/dist/orchestrator/src/cli/run/blockMemory.js +500 -0
  182. package/dist/orchestrator/src/cli/run/manifest.js +410 -73
  183. package/dist/orchestrator/src/cli/run/manifestPersister.js +45 -14
  184. package/dist/orchestrator/src/cli/run/runMemoryController.js +216 -0
  185. package/dist/orchestrator/src/cli/run/source0.js +690 -0
  186. package/dist/orchestrator/src/cli/run/workspacePath.js +101 -0
  187. package/dist/orchestrator/src/cli/runtime/mode.js +2 -1
  188. package/dist/orchestrator/src/cli/runtime/provider.js +39 -2
  189. package/dist/orchestrator/src/cli/selfCheckCliShell.js +12 -0
  190. package/dist/orchestrator/src/cli/services/commandRunner.js +698 -18
  191. package/dist/orchestrator/src/cli/services/execRuntime.js +66 -1
  192. package/dist/orchestrator/src/cli/services/orchestratorAutoScoutEvidenceRecorder.js +71 -0
  193. package/dist/orchestrator/src/cli/services/orchestratorCloudBranchResolution.js +8 -0
  194. package/dist/orchestrator/src/cli/services/orchestratorCloudEnvironmentResolution.js +22 -0
  195. package/dist/orchestrator/src/cli/services/orchestratorCloudExecutionLifecycleShell.js +39 -0
  196. package/dist/orchestrator/src/cli/services/orchestratorCloudPromptBuilder.js +37 -0
  197. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteFallbackContract.js +45 -0
  198. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteShell.js +36 -0
  199. package/dist/orchestrator/src/cli/services/orchestratorCloudTargetExecutor.js +277 -0
  200. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycle.js +98 -0
  201. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycleShell.js +54 -0
  202. package/dist/orchestrator/src/cli/services/orchestratorExecutionLifecycle.js +112 -0
  203. package/dist/orchestrator/src/cli/services/orchestratorExecutionModePolicy.js +27 -0
  204. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteAdapterShell.js +59 -0
  205. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteDecisionShell.js +57 -0
  206. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteState.js +21 -0
  207. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouter.js +2 -0
  208. package/dist/orchestrator/src/cli/services/orchestratorLocalPipelineExecutor.js +149 -0
  209. package/dist/orchestrator/src/cli/services/orchestratorLocalRouteShell.js +63 -0
  210. package/dist/orchestrator/src/cli/services/orchestratorPlanShell.js +54 -0
  211. package/dist/orchestrator/src/cli/services/orchestratorPlanTargetTracker.js +16 -0
  212. package/dist/orchestrator/src/cli/services/orchestratorResumePreparationShell.js +84 -0
  213. package/dist/orchestrator/src/cli/services/orchestratorResumeTokenValidation.js +15 -0
  214. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleCompletion.js +31 -0
  215. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleExecutionRegistration.js +37 -0
  216. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleOrchestrationShell.js +83 -0
  217. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleTaskManagerShell.js +37 -0
  218. package/dist/orchestrator/src/cli/services/orchestratorRuntimeManifestMutation.js +20 -0
  219. package/dist/orchestrator/src/cli/services/orchestratorStartPreparationShell.js +56 -0
  220. package/dist/orchestrator/src/cli/services/orchestratorStatusShell.js +70 -0
  221. package/dist/orchestrator/src/cli/services/pipelineResolver.js +7 -3
  222. package/dist/orchestrator/src/cli/services/plannerMemory.js +119 -0
  223. package/dist/orchestrator/src/cli/services/runPreparation.js +7 -3
  224. package/dist/orchestrator/src/cli/services/runSummaryWriter.js +9 -0
  225. package/dist/orchestrator/src/cli/setupBootstrapShell.js +114 -0
  226. package/dist/orchestrator/src/cli/setupCliShell.js +51 -0
  227. package/dist/orchestrator/src/cli/skillsCliShell.js +56 -0
  228. package/dist/orchestrator/src/cli/startCliRequestShell.js +53 -0
  229. package/dist/orchestrator/src/cli/startCliShell.js +68 -0
  230. package/dist/orchestrator/src/cli/statusCliShell.js +22 -0
  231. package/dist/orchestrator/src/cli/utils/authProvenanceFingerprint.js +27 -0
  232. package/dist/orchestrator/src/cli/utils/cloudPreflight.js +285 -7
  233. package/dist/orchestrator/src/cli/utils/codexFeatures.js +60 -0
  234. package/dist/orchestrator/src/cli/utils/delegationConfigParser.js +250 -0
  235. package/dist/orchestrator/src/cli/utils/delegationMcpHealth.js +1382 -0
  236. package/dist/orchestrator/src/cli/utils/devtools.js +2 -54
  237. package/dist/orchestrator/src/cli/utils/mcpServerEntry.js +53 -0
  238. package/dist/orchestrator/src/cli/utils/packageProgramResolver.js +151 -0
  239. package/dist/orchestrator/src/cli/utils/providerOverrideEnv.js +71 -0
  240. package/dist/orchestrator/src/cli/utils/trailingJsonObject.js +59 -0
  241. package/dist/orchestrator/src/learning/crystalizer.js +2 -2
  242. package/dist/orchestrator/src/manager.js +74 -4
  243. package/dist/orchestrator/src/persistence/ExperienceStore.js +233 -49
  244. package/dist/orchestrator/src/persistence/TaskStateStore.js +6 -6
  245. package/dist/orchestrator/src/persistence/lockFile.js +70 -4
  246. package/dist/orchestrator/src/persistence/sanitizeIdentifier.js +39 -0
  247. package/dist/orchestrator/src/sync/createCloudSyncWorker.js +3 -2
  248. package/dist/orchestrator/src/utils/atomicWrite.js +17 -2
  249. package/dist/packages/orchestrator/src/exec/unified-exec.js +99 -6
  250. package/dist/packages/orchestrator/src/instructions/promptPacks.js +150 -19
  251. package/dist/packages/sdk-node/src/orchestrator.js +137 -13
  252. package/dist/packages/shared/config/designConfig.js +8 -1
  253. package/dist/packages/shared/streams/stdio.js +1 -1
  254. package/dist/scripts/design/pipeline/permit.js +15 -0
  255. package/dist/scripts/lib/docs-catalog.js +399 -0
  256. package/dist/scripts/lib/docs-helpers.js +87 -5
  257. package/dist/scripts/lib/pr-watch-merge.js +1088 -80
  258. package/dist/scripts/lib/provider-run-contract.js +26 -0
  259. package/dist/scripts/lib/review-command-intent-classification.js +532 -0
  260. package/dist/scripts/lib/review-command-probe-classification.js +385 -0
  261. package/dist/scripts/lib/review-execution-boundary-preflight.js +279 -0
  262. package/dist/scripts/lib/review-execution-runtime.js +753 -0
  263. package/dist/scripts/lib/review-execution-state.js +1144 -0
  264. package/dist/scripts/lib/review-execution-telemetry.js +215 -0
  265. package/dist/scripts/lib/review-inspection-target-parsing.js +78 -0
  266. package/dist/scripts/lib/review-launch-attempt.js +601 -0
  267. package/dist/scripts/lib/review-meta-surface-boundary-analysis.js +300 -0
  268. package/dist/scripts/lib/review-meta-surface-normalization.js +746 -0
  269. package/dist/scripts/lib/review-non-interactive-handoff.js +61 -0
  270. package/dist/scripts/lib/review-prompt-context.js +376 -0
  271. package/dist/scripts/lib/review-scope-advisory.js +286 -0
  272. package/dist/scripts/lib/review-scope-paths.js +123 -0
  273. package/dist/scripts/lib/review-shell-command-parser.js +389 -0
  274. package/dist/scripts/lib/review-shell-env-interpreter.js +340 -0
  275. package/dist/scripts/lib/run-manifests.js +192 -36
  276. package/dist/scripts/lib/spark-policy-classifier.js +593 -0
  277. package/dist/scripts/run-review.js +507 -1777
  278. package/docs/README.md +43 -20
  279. package/docs/book/README.md +19 -0
  280. package/docs/book/codex-cli-0124-adoption.md +68 -0
  281. package/docs/book/local-hook-impact.md +73 -0
  282. package/docs/book/operations.md +60 -0
  283. package/docs/book/public-posture.md +34 -0
  284. package/docs/book/setup.md +91 -0
  285. package/docs/book/skills.md +11 -0
  286. package/docs/guides/codex-version-policy.md +104 -0
  287. package/docs/public/downstream-setup.md +113 -0
  288. package/docs/public/provider-onboarding.md +173 -0
  289. package/package.json +23 -10
  290. package/plugins/codex-orchestrator/.codex-plugin/plugin.json +30 -0
  291. package/plugins/codex-orchestrator/.mcp.json +13 -0
  292. package/plugins/codex-orchestrator/launcher.mjs +361 -0
  293. package/schemas/manifest.json +411 -0
  294. package/skills/README.md +26 -0
  295. package/skills/collab-subagents-first/SKILL.md +1 -1
  296. package/skills/delegation-usage/DELEGATION_GUIDE.md +30 -12
  297. package/skills/delegation-usage/SKILL.md +25 -14
  298. package/skills/land/SKILL.md +77 -0
  299. package/skills/linear/SKILL.md +255 -0
  300. package/skills/release/SKILL.md +47 -3
  301. package/skills/standalone-review/SKILL.md +6 -1
  302. package/templates/README.md +4 -2
  303. package/templates/codex/.codex/agents/awaiter-high.toml +2 -2
  304. package/templates/codex/.codex/agents/worker-complex.toml +1 -1
  305. package/templates/codex/.codex/config.toml +3 -4
  306. package/templates/codex/.codex/providers/README.md +13 -0
  307. package/templates/codex/.codex/providers/control.example.json +18 -0
  308. package/templates/codex/.codex/providers/provider.env.example +15 -0
  309. package/templates/codex/AGENTS.md +15 -8
  310. package/templates/codex/mcp-client.json +5 -1
  311. package/docs/assets/setup.gif +0 -0
@@ -0,0 +1,239 @@
1
+ /* eslint-disable patterns/prefer-logger-over-console */
2
+ // This shell preserves the existing CLI output contract, which is rendered via console writes in text/json mode.
3
+ const FLOW_TARGET_PIPELINE_SCOPES = new Set(['docs-review', 'implementation-gate']);
4
+ function isFlowTargetPipelineScope(scope) {
5
+ return FLOW_TARGET_PIPELINE_SCOPES.has(scope);
6
+ }
7
+ function normalizeFlowTargetToken(candidate) {
8
+ const trimmed = candidate.trim();
9
+ if (!trimmed) {
10
+ return null;
11
+ }
12
+ const tokens = trimmed.split(':');
13
+ if (tokens.length > 1 && !(tokens[0] ?? '').trim()) {
14
+ return null;
15
+ }
16
+ let scoped = false;
17
+ let scopeToken = null;
18
+ let suffixToken = trimmed;
19
+ if (tokens.length > 1) {
20
+ const candidateScope = (tokens[0] ?? '').trim().toLowerCase();
21
+ if (isFlowTargetPipelineScope(candidateScope)) {
22
+ scoped = true;
23
+ scopeToken = candidateScope;
24
+ suffixToken = (tokens[tokens.length - 1] ?? '').trim();
25
+ }
26
+ }
27
+ if (!suffixToken) {
28
+ return null;
29
+ }
30
+ return {
31
+ literalLower: trimmed.toLowerCase(),
32
+ stageTokenLower: suffixToken.toLowerCase(),
33
+ scopeLower: scopeToken,
34
+ scoped
35
+ };
36
+ }
37
+ function flowPlanItemPipelineId(item) {
38
+ const metadataPipelineId = item.metadata && typeof item.metadata['pipelineId'] === 'string'
39
+ ? item.metadata['pipelineId'].trim().toLowerCase()
40
+ : '';
41
+ if (metadataPipelineId) {
42
+ return metadataPipelineId;
43
+ }
44
+ const delimiterIndex = item.id.indexOf(':');
45
+ if (delimiterIndex <= 0) {
46
+ return null;
47
+ }
48
+ return item.id.slice(0, delimiterIndex).trim().toLowerCase() || null;
49
+ }
50
+ function flowPlanItemMatchesTarget(item, candidate) {
51
+ const normalized = normalizeFlowTargetToken(candidate);
52
+ if (!normalized) {
53
+ return false;
54
+ }
55
+ if (item.id.toLowerCase() === normalized.literalLower) {
56
+ return true;
57
+ }
58
+ if (normalized.scoped && normalized.scopeLower) {
59
+ const itemPipelineId = flowPlanItemPipelineId(item);
60
+ if (itemPipelineId && itemPipelineId !== normalized.scopeLower) {
61
+ return false;
62
+ }
63
+ }
64
+ const metadataStageId = item.metadata && typeof item.metadata['stageId'] === 'string'
65
+ ? item.metadata['stageId'].toLowerCase()
66
+ : null;
67
+ const aliases = Array.isArray(item.metadata?.['aliases'])
68
+ ? item.metadata?.['aliases']
69
+ : [];
70
+ const aliasTokens = aliases.filter((alias) => typeof alias === 'string').map((alias) => alias.toLowerCase());
71
+ if (normalized.scoped) {
72
+ if (metadataStageId
73
+ && (metadataStageId === normalized.literalLower || metadataStageId === normalized.stageTokenLower)) {
74
+ return true;
75
+ }
76
+ return aliasTokens.some((alias) => alias === normalized.literalLower || alias === normalized.stageTokenLower);
77
+ }
78
+ if (item.id.toLowerCase().endsWith(`:${normalized.stageTokenLower}`)) {
79
+ return true;
80
+ }
81
+ if (metadataStageId
82
+ && (metadataStageId === normalized.stageTokenLower
83
+ || metadataStageId.endsWith(`:${normalized.stageTokenLower}`))) {
84
+ return true;
85
+ }
86
+ return aliasTokens.some((alias) => alias === normalized.stageTokenLower || alias.endsWith(`:${normalized.stageTokenLower}`));
87
+ }
88
+ function planIncludesStageId(plan, stageId) {
89
+ if (!stageId.trim()) {
90
+ return false;
91
+ }
92
+ return plan.plan.items.some((item) => flowPlanItemMatchesTarget(item, stageId));
93
+ }
94
+ function resolveFlowTargetScope(stageId) {
95
+ const delimiterIndex = stageId.indexOf(':');
96
+ if (delimiterIndex <= 0) {
97
+ return null;
98
+ }
99
+ const scope = stageId.slice(0, delimiterIndex).trim().toLowerCase();
100
+ if (!isFlowTargetPipelineScope(scope)) {
101
+ return null;
102
+ }
103
+ return scope;
104
+ }
105
+ export async function resolveFlowTargetStageSelection(orchestrator, taskId, requestedTargetStageId) {
106
+ if (!requestedTargetStageId) {
107
+ return {};
108
+ }
109
+ const [docsPlan, implementationPlan] = (await Promise.all([
110
+ orchestrator.plan({ pipelineId: 'docs-review', taskId }),
111
+ orchestrator.plan({ pipelineId: 'implementation-gate', taskId })
112
+ ]));
113
+ const requestedScope = resolveFlowTargetScope(requestedTargetStageId);
114
+ const docsScopeMatch = !requestedScope || requestedScope === 'docs-review';
115
+ const implementationScopeMatch = !requestedScope || requestedScope === 'implementation-gate';
116
+ const docsReviewTargetStageId = docsScopeMatch && planIncludesStageId(docsPlan, requestedTargetStageId)
117
+ ? requestedTargetStageId
118
+ : undefined;
119
+ const implementationGateTargetStageId = implementationScopeMatch && planIncludesStageId(implementationPlan, requestedTargetStageId)
120
+ ? requestedTargetStageId
121
+ : undefined;
122
+ if (!docsReviewTargetStageId && !implementationGateTargetStageId) {
123
+ throw new Error(`Target stage "${requestedTargetStageId}" is not defined in docs-review or implementation-gate.`);
124
+ }
125
+ return { docsReviewTargetStageId, implementationGateTargetStageId };
126
+ }
127
+ export async function runFlowCliShell(params) {
128
+ try {
129
+ const { docsReviewTargetStageId, implementationGateTargetStageId } = await resolveFlowTargetStageSelection(params.orchestrator, params.taskId, params.targetStageId);
130
+ await params.runWithUi(async (runEvents) => {
131
+ const docsReviewResult = await params.orchestrator.start({
132
+ pipelineId: 'docs-review',
133
+ taskId: params.taskId,
134
+ parentRunId: params.parentRunId,
135
+ approvalPolicy: params.approvalPolicy,
136
+ targetStageId: docsReviewTargetStageId,
137
+ executionMode: params.executionMode,
138
+ runtimeMode: params.runtimeMode,
139
+ runEvents
140
+ });
141
+ const docsPayload = params.toRunOutputPayload(docsReviewResult);
142
+ if (params.format === 'text') {
143
+ params.emitRunOutput(docsReviewResult, params.format, 'Docs-review run');
144
+ }
145
+ if (docsReviewResult.manifest.status !== 'succeeded') {
146
+ const issueLogCapture = await params.maybeCaptureAutoIssueLog({
147
+ enabled: params.autoIssueLogEnabled,
148
+ issueTitle: 'Auto issue log: flow docs-review failed',
149
+ issueNotes: `Automatic failure capture for docs-review run ${docsReviewResult.manifest.run_id} (${docsReviewResult.manifest.status}).`,
150
+ taskFilter: params.resolveTaskFilter(docsReviewResult.manifest.task_id ?? undefined, params.taskId)
151
+ });
152
+ process.exitCode = 1;
153
+ if (params.format === 'json') {
154
+ console.log(JSON.stringify({
155
+ status: docsReviewResult.manifest.status,
156
+ failed_stage: 'docs-review',
157
+ docs_review: docsPayload,
158
+ implementation_gate: null,
159
+ issue_log: issueLogCapture.issueLog,
160
+ issue_log_error: issueLogCapture.issueLogError
161
+ }, null, 2));
162
+ }
163
+ else {
164
+ console.log('Flow halted: docs-review failed.');
165
+ if (issueLogCapture.issueLog) {
166
+ for (const line of params.formatIssueLogSummary(issueLogCapture.issueLog)) {
167
+ console.log(line);
168
+ }
169
+ }
170
+ if (issueLogCapture.issueLogError) {
171
+ console.log(`Auto issue log: failed (${issueLogCapture.issueLogError})`);
172
+ }
173
+ }
174
+ return;
175
+ }
176
+ const implementationGateResult = await params.orchestrator.start({
177
+ pipelineId: 'implementation-gate',
178
+ taskId: params.taskId,
179
+ parentRunId: docsReviewResult.manifest.run_id,
180
+ approvalPolicy: params.approvalPolicy,
181
+ targetStageId: implementationGateTargetStageId,
182
+ executionMode: params.executionMode,
183
+ runtimeMode: params.runtimeMode,
184
+ runEvents
185
+ });
186
+ const implementationPayload = params.toRunOutputPayload(implementationGateResult);
187
+ const issueLogCapture = implementationGateResult.manifest.status !== 'succeeded'
188
+ ? await params.maybeCaptureAutoIssueLog({
189
+ enabled: params.autoIssueLogEnabled,
190
+ issueTitle: 'Auto issue log: flow implementation-gate failed',
191
+ issueNotes: `Automatic failure capture for implementation-gate run ${implementationGateResult.manifest.run_id} (${implementationGateResult.manifest.status}).`,
192
+ taskFilter: params.resolveTaskFilter(implementationGateResult.manifest.task_id ?? undefined, params.taskId)
193
+ })
194
+ : { issueLog: null, issueLogError: null };
195
+ if (params.format === 'json') {
196
+ console.log(JSON.stringify({
197
+ status: implementationGateResult.manifest.status,
198
+ failed_stage: implementationGateResult.manifest.status === 'succeeded' ? null : 'implementation-gate',
199
+ docs_review: docsPayload,
200
+ implementation_gate: implementationPayload,
201
+ issue_log: issueLogCapture.issueLog,
202
+ issue_log_error: issueLogCapture.issueLogError
203
+ }, null, 2));
204
+ if (implementationGateResult.manifest.status !== 'succeeded') {
205
+ process.exitCode = 1;
206
+ }
207
+ return;
208
+ }
209
+ params.emitRunOutput(implementationGateResult, params.format, 'Implementation-gate run');
210
+ if (implementationGateResult.manifest.status !== 'succeeded') {
211
+ process.exitCode = 1;
212
+ console.log('Flow halted: implementation-gate failed.');
213
+ if (issueLogCapture.issueLog) {
214
+ for (const line of params.formatIssueLogSummary(issueLogCapture.issueLog)) {
215
+ console.log(line);
216
+ }
217
+ }
218
+ if (issueLogCapture.issueLogError) {
219
+ console.log(`Auto issue log: failed (${issueLogCapture.issueLogError})`);
220
+ }
221
+ return;
222
+ }
223
+ console.log('Flow complete: docs-review -> implementation-gate.');
224
+ await params.maybeEmitRunAdoptionHint({
225
+ format: params.format,
226
+ taskFilter: params.resolveTaskFilter(implementationGateResult.manifest.task_id ?? undefined, params.taskId)
227
+ });
228
+ });
229
+ }
230
+ catch (error) {
231
+ const issueLogCapture = await params.maybeCaptureAutoIssueLog({
232
+ enabled: params.autoIssueLogEnabled,
233
+ issueTitle: 'Auto issue log: flow failed before run manifest',
234
+ issueNotes: 'Automatic failure capture for flow setup failure before run manifest creation.',
235
+ taskFilter: params.resolveTaskFilter(undefined, params.taskId)
236
+ });
237
+ throw params.withAutoIssueLogContext(error, issueLogCapture);
238
+ }
239
+ }
@@ -0,0 +1,80 @@
1
+ import process from 'node:process';
2
+ import { REPO_CONFIG_REQUIRED_ENV_KEY } from './config/repoConfigPolicy.js';
3
+ import { runFrontendTestCliShell } from './frontendTestCliShell.js';
4
+ import { PROVIDER_OVERRIDE_MARKER_ENV_KEYS, PROVIDER_OVERRIDE_ENV_KEYS, sanitizeProviderOverrideEnv } from './utils/providerOverrideEnv.js';
5
+ const DEFAULT_DEPENDENCIES = {
6
+ runFrontendTestCliShell
7
+ };
8
+ export async function runFrontendTestCliRequestShell(params, overrides = {}) {
9
+ const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
10
+ const format = resolveOutputFormat(params.flags);
11
+ const devtoolsEnabled = Boolean(params.flags['devtools']);
12
+ const runtimeMode = params.resolveRuntimeModeFlag(params.flags);
13
+ const restoreProcessEnv = applyProviderOverrideSanitizationToProcessEnv();
14
+ try {
15
+ params.applyRepoConfigRequiredPolicy(params.flags);
16
+ if (params.positionals.length > 0) {
17
+ params.warn(`[frontend-test] ignoring extra arguments: ${params.positionals.join(' ')}`);
18
+ }
19
+ await dependencies.runFrontendTestCliShell({
20
+ orchestrator: params.orchestrator,
21
+ format,
22
+ devtoolsEnabled,
23
+ runtimeMode,
24
+ taskId: readRawStringFlagValue(params.flags['task']),
25
+ parentRunId: readRawStringFlagValue(params.flags['parent-run']),
26
+ approvalPolicy: readRawStringFlagValue(params.flags['approval-policy']),
27
+ targetStageId: params.resolveTargetStageId(params.flags),
28
+ runWithUi: async (action) => await params.runWithUi(format, action),
29
+ emitRunOutput: params.emitRunOutput
30
+ });
31
+ }
32
+ finally {
33
+ restoreProcessEnv();
34
+ }
35
+ }
36
+ function resolveOutputFormat(flags) {
37
+ return flags['format'] === 'json' ? 'json' : 'text';
38
+ }
39
+ function readRawStringFlagValue(value) {
40
+ return typeof value === 'string' ? value : undefined;
41
+ }
42
+ function applyProviderOverrideSanitizationToProcessEnv(env = process.env) {
43
+ const previous = {
44
+ trackedOverrides: Object.fromEntries([...PROVIDER_OVERRIDE_ENV_KEYS, ...PROVIDER_OVERRIDE_MARKER_ENV_KEYS].map((key) => [key, env[key]])),
45
+ repoConfigRequired: env[REPO_CONFIG_REQUIRED_ENV_KEY]
46
+ };
47
+ const sanitized = sanitizeProviderOverrideEnv(env);
48
+ for (const key of [...PROVIDER_OVERRIDE_ENV_KEYS, ...PROVIDER_OVERRIDE_MARKER_ENV_KEYS]) {
49
+ const value = sanitized[key];
50
+ if (value === undefined) {
51
+ delete env[key];
52
+ }
53
+ else {
54
+ env[key] = value;
55
+ }
56
+ }
57
+ if (sanitized[REPO_CONFIG_REQUIRED_ENV_KEY] === undefined) {
58
+ delete env[REPO_CONFIG_REQUIRED_ENV_KEY];
59
+ }
60
+ else {
61
+ env[REPO_CONFIG_REQUIRED_ENV_KEY] = sanitized[REPO_CONFIG_REQUIRED_ENV_KEY];
62
+ }
63
+ return () => {
64
+ for (const key of [...PROVIDER_OVERRIDE_ENV_KEYS, ...PROVIDER_OVERRIDE_MARKER_ENV_KEYS]) {
65
+ const value = previous.trackedOverrides[key];
66
+ if (value === undefined) {
67
+ delete env[key];
68
+ }
69
+ else {
70
+ env[key] = value;
71
+ }
72
+ }
73
+ if (previous.repoConfigRequired === undefined) {
74
+ delete env[REPO_CONFIG_REQUIRED_ENV_KEY];
75
+ }
76
+ else {
77
+ env[REPO_CONFIG_REQUIRED_ENV_KEY] = previous.repoConfigRequired;
78
+ }
79
+ };
80
+ }
@@ -0,0 +1,41 @@
1
+ import process from 'node:process';
2
+ const DEFAULT_DEPENDENCIES = {
3
+ env: process.env,
4
+ setExitCode: (code) => {
5
+ process.exitCode = code;
6
+ }
7
+ };
8
+ export async function runFrontendTestCliShell(params, overrides = {}) {
9
+ const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
10
+ const originalDevtools = dependencies.env.CODEX_REVIEW_DEVTOOLS;
11
+ if (params.devtoolsEnabled) {
12
+ dependencies.env.CODEX_REVIEW_DEVTOOLS = '1';
13
+ }
14
+ try {
15
+ await params.runWithUi(async (runEvents) => {
16
+ const result = await params.orchestrator.start({
17
+ pipelineId: 'frontend-testing',
18
+ taskId: params.taskId,
19
+ parentRunId: params.parentRunId,
20
+ approvalPolicy: params.approvalPolicy,
21
+ targetStageId: params.targetStageId,
22
+ runtimeMode: params.runtimeMode,
23
+ runEvents
24
+ });
25
+ params.emitRunOutput(result, params.format, 'Run started');
26
+ if (result.manifest.status === 'failed' || result.manifest.status === 'cancelled') {
27
+ dependencies.setExitCode(1);
28
+ }
29
+ });
30
+ }
31
+ finally {
32
+ if (params.devtoolsEnabled) {
33
+ if (originalDevtools === undefined) {
34
+ delete dependencies.env.CODEX_REVIEW_DEVTOOLS;
35
+ }
36
+ else {
37
+ dependencies.env.CODEX_REVIEW_DEVTOOLS = originalDevtools;
38
+ }
39
+ }
40
+ }
41
+ }
@@ -1,12 +1,21 @@
1
- import { copyFile, mkdir, readdir, stat } from 'node:fs/promises';
1
+ import { copyFile, mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';
2
2
  import { existsSync } from 'node:fs';
3
+ import { createRequire } from 'node:module';
3
4
  import { dirname, join, relative } from 'node:path';
5
+ import process from 'node:process';
6
+ import { resolveCodexHome } from './utils/codexPaths.js';
7
+ import { resolveCodexCliBin } from './utils/codexCli.js';
8
+ import { codexFeatureProbeDisablesMultiAgentV2, codexFeatureProbeRejectsAgentMaxThreads, readCodexFeatureProbe } from './utils/codexFeatures.js';
4
9
  import { findPackageRoot } from './utils/packageInfo.js';
5
10
  const CODEX_TEMPLATE = 'codex';
6
11
  const CODEX_PIPELINE_CONFIG = 'codex.orchestrator.json';
12
+ const CODEX_CONFIG_TEMPLATE = join('.codex', 'config.toml');
13
+ const require = createRequire(import.meta.url);
14
+ let tomlLibrary;
7
15
  export async function initCodexTemplates(options) {
8
16
  const root = findPackageRoot();
9
17
  const templateRoot = join(root, 'templates', options.template);
18
+ const env = options.env ?? process.env;
10
19
  const written = [];
11
20
  const skipped = [];
12
21
  await assertDirectory(templateRoot);
@@ -16,6 +25,10 @@ export async function initCodexTemplates(options) {
16
25
  skipped
17
26
  });
18
27
  if (options.template === CODEX_TEMPLATE) {
28
+ const configPath = join(options.cwd, CODEX_CONFIG_TEMPLATE);
29
+ if (written.includes(configPath) && await isMultiAgentV2Enabled(env)) {
30
+ await omitAgentMaxThreads(configPath);
31
+ }
19
32
  await copyTemplateFile(join(root, CODEX_PIPELINE_CONFIG), join(options.cwd, CODEX_PIPELINE_CONFIG), {
20
33
  force: options.force,
21
34
  written,
@@ -24,6 +37,86 @@ export async function initCodexTemplates(options) {
24
37
  }
25
38
  return { written, skipped, templateRoot };
26
39
  }
40
+ async function isMultiAgentV2Enabled(env) {
41
+ const featureProbe = readCodexFeatureProbe(resolveCodexCliBin(env), env);
42
+ if (featureProbe.flags?.multi_agent_v2 === true) {
43
+ return true;
44
+ }
45
+ if (codexFeatureProbeDisablesMultiAgentV2(featureProbe)) {
46
+ return false;
47
+ }
48
+ if (codexFeatureProbeRejectsAgentMaxThreads(featureProbe)) {
49
+ return true;
50
+ }
51
+ const configPath = join(resolveCodexHome(env), 'config.toml');
52
+ if (!existsSync(configPath)) {
53
+ return false;
54
+ }
55
+ let raw;
56
+ try {
57
+ raw = await readFile(configPath, 'utf8');
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ let parsed;
63
+ try {
64
+ parsed = getTomlLibrary().parse(raw);
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ if (!isRecord(parsed) || !isRecord(parsed.features)) {
70
+ return false;
71
+ }
72
+ return parsed.features.multi_agent_v2 === true;
73
+ }
74
+ async function omitAgentMaxThreads(configPath) {
75
+ const raw = await readFile(configPath, 'utf8');
76
+ const { removed, text } = removeAgentMaxThreadsFromToml(raw);
77
+ if (!removed) {
78
+ return;
79
+ }
80
+ await writeFile(configPath, text, 'utf8');
81
+ }
82
+ function removeAgentMaxThreadsFromToml(raw) {
83
+ const lines = raw.split(/(?<=\n)/u);
84
+ let inAgentsTable = false;
85
+ let removed = false;
86
+ const kept = [];
87
+ for (const line of lines) {
88
+ const withoutEol = line.replace(/\r?\n$/u, '');
89
+ const trimmed = withoutEol.trim();
90
+ if (/^\[[^\]]+\]\s*(?:#.*)?$/u.test(trimmed)) {
91
+ inAgentsTable = /^\[agents\]\s*(?:#.*)?$/u.test(trimmed);
92
+ }
93
+ if (inAgentsTable && /^[ \t]*max_threads\s*=/u.test(withoutEol)) {
94
+ removed = true;
95
+ continue;
96
+ }
97
+ kept.push(line);
98
+ }
99
+ return { removed, text: kept.join('') };
100
+ }
101
+ function getTomlLibrary() {
102
+ if (tomlLibrary) {
103
+ return tomlLibrary;
104
+ }
105
+ if (tomlLibrary === null) {
106
+ throw new Error('Failed to load @iarna/toml.');
107
+ }
108
+ try {
109
+ tomlLibrary = require('@iarna/toml');
110
+ return tomlLibrary;
111
+ }
112
+ catch (error) {
113
+ tomlLibrary = null;
114
+ throw error;
115
+ }
116
+ }
117
+ function isRecord(value) {
118
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
119
+ }
27
120
  async function assertDirectory(path) {
28
121
  const info = await stat(path).catch(() => null);
29
122
  if (!info || !info.isDirectory()) {
@@ -84,6 +177,7 @@ export function formatInitSummary(result, cwd) {
84
177
  }
85
178
  lines.push('Next steps (recommended):');
86
179
  lines.push(' - Review codex.orchestrator.json and adjust pipeline commands to your repository toolchain');
180
+ lines.push(' - Review .codex/providers/provider.env.example and .codex/providers/control.example.json');
87
181
  lines.push(' - codex-orchestrator setup --yes # installs bundled skills + configures delegation/devtools wiring');
88
182
  lines.push(' - codex-orchestrator codex setup # optional managed/pinned Codex CLI (activate with CODEX_CLI_USE_MANAGED=1; stock codex is default)');
89
183
  return lines;
@@ -0,0 +1,50 @@
1
+ /* eslint-disable patterns/prefer-logger-over-console */
2
+ import process from 'node:process';
3
+ import { formatCodexCliSetupSummary, runCodexCliSetup } from './codexCliSetup.js';
4
+ import { formatInitSummary, initCodexTemplates } from './init.js';
5
+ const DEFAULT_DEPENDENCIES = {
6
+ initCodexTemplates,
7
+ formatInitSummary,
8
+ runCodexCliSetup,
9
+ formatCodexCliSetupSummary,
10
+ getCwd: () => process.cwd(),
11
+ log: (line) => console.log(line)
12
+ };
13
+ export async function runInitCliShell(params, overrides = {}) {
14
+ const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
15
+ const template = params.positionals[0];
16
+ if (!template) {
17
+ throw new Error('init requires a template name (e.g. init codex).');
18
+ }
19
+ if (template !== 'codex') {
20
+ throw new Error(`Unknown init template: ${template}`);
21
+ }
22
+ const cwd = readStringFlag(params.flags, 'cwd') ?? dependencies.getCwd();
23
+ const force = Boolean(params.flags['force']);
24
+ const result = await dependencies.initCodexTemplates({ template, cwd, force });
25
+ for (const line of dependencies.formatInitSummary(result, cwd)) {
26
+ dependencies.log(line);
27
+ }
28
+ if (params.flags['codex-cli'] !== true) {
29
+ return;
30
+ }
31
+ const setupResult = await dependencies.runCodexCliSetup({
32
+ apply: Boolean(params.flags['yes']),
33
+ force: Boolean(params.flags['codex-force']),
34
+ source: readStringFlag(params.flags, 'codex-source'),
35
+ ref: readStringFlag(params.flags, 'codex-ref'),
36
+ downloadUrl: readStringFlag(params.flags, 'codex-download-url'),
37
+ downloadSha256: readStringFlag(params.flags, 'codex-download-sha256')
38
+ });
39
+ for (const line of dependencies.formatCodexCliSetupSummary(setupResult)) {
40
+ dependencies.log(line);
41
+ }
42
+ }
43
+ function readStringFlag(flags, key) {
44
+ const value = flags[key];
45
+ if (typeof value !== 'string') {
46
+ return undefined;
47
+ }
48
+ const trimmed = value.trim();
49
+ return trimmed.length > 0 ? trimmed : undefined;
50
+ }