@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,473 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { mkdir, stat } from 'node:fs/promises';
3
+ import { dirname, extname, resolve } from 'node:path';
4
+ import process from 'node:process';
5
+ import { setTimeout as sleep } from 'node:timers/promises';
6
+ import { pathToFileURL } from 'node:url';
7
+ import { promisify } from 'node:util';
8
+ const execFileAsync = promisify(execFile);
9
+ const DEFAULT_SCREENSHOT_LABEL = 'Proof screenshot';
10
+ const DEFAULT_SCREENSHOT_MEDIA_TYPE = 'image/png';
11
+ const DEFAULT_PREVIEW_CLEANUP_DELAY_MS = 1_200;
12
+ const SUPPORTED_SCREENSHOT_MEDIA_TYPES = new Map([
13
+ ['.png', 'image/png'],
14
+ ['.jpg', 'image/jpeg'],
15
+ ['.jpeg', 'image/jpeg']
16
+ ]);
17
+ const DEFAULT_DEPENDENCIES = {
18
+ platform: process.platform,
19
+ now: () => new Date().toISOString(),
20
+ mkdir,
21
+ stat,
22
+ sleep: async (ms) => {
23
+ await sleep(ms);
24
+ },
25
+ runCommand: async (request) => {
26
+ try {
27
+ const result = await execFileAsync(request.command, request.args, {
28
+ encoding: 'utf8',
29
+ maxBuffer: 10 * 1024 * 1024
30
+ });
31
+ return {
32
+ exit_code: 0,
33
+ stdout: normalizeExecOutput(result.stdout),
34
+ stderr: normalizeExecOutput(result.stderr),
35
+ signal: null,
36
+ command_missing: false,
37
+ error_message: null
38
+ };
39
+ }
40
+ catch (error) {
41
+ const commandError = error;
42
+ return {
43
+ exit_code: typeof commandError.code === 'number' ? commandError.code : 1,
44
+ stdout: normalizeExecOutput(commandError.stdout),
45
+ stderr: normalizeExecOutput(commandError.stderr),
46
+ signal: commandError.signal ?? null,
47
+ command_missing: commandError.code === 'ENOENT',
48
+ error_message: normalizeOptionalString(commandError.message)
49
+ };
50
+ }
51
+ }
52
+ };
53
+ export async function resolveProviderLinearScreenshotProof(input, overrides = {}) {
54
+ const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
55
+ if (dependencies.platform !== 'darwin') {
56
+ return failure('screenshot_proof_platform_unsupported', 'linear screenshot-proof is only supported on macOS.', 422);
57
+ }
58
+ const displayId = normalizeOptionalDigits(input.displayId ?? null);
59
+ if (input.displayId != null && (displayId == null || displayId === '0')) {
60
+ return failure('screenshot_proof_display_id_invalid', '--display-id must be a positive integer when provided.', 422);
61
+ }
62
+ const windowId = normalizeOptionalDigits(input.windowId ?? null);
63
+ if (input.windowId != null && (windowId == null || windowId === '0')) {
64
+ return failure('screenshot_proof_window_id_invalid', '--window-id must be a positive integer when provided.', 422);
65
+ }
66
+ if (displayId && windowId) {
67
+ return failure('screenshot_proof_target_conflict', 'Use either --display-id or --window-id, not both.', 422);
68
+ }
69
+ const openPreview = input.openPreview === true;
70
+ const mode = windowId ? 'window' : 'display';
71
+ const previewProbe = openPreview ? await probePreviewRunning(dependencies) : null;
72
+ const resolvedOutputPathResult = resolveScreenshotOutputPath(input.cwd, input.outputPath ?? null, dependencies.now());
73
+ if (!resolvedOutputPathResult.ok) {
74
+ return failure(resolvedOutputPathResult.error.code, resolvedOutputPathResult.error.message, resolvedOutputPathResult.error.status, resolvedOutputPathResult.error.details);
75
+ }
76
+ const outputPath = resolvedOutputPathResult.output_path;
77
+ const outputDirectory = dirname(outputPath);
78
+ const mediaType = resolvedOutputPathResult.media_type;
79
+ const fileUrl = pathToFileURL(outputPath).toString();
80
+ const embedMarkdown = buildScreenshotEmbedMarkdown(fileUrl);
81
+ const captureCommand = buildCaptureCommand({
82
+ outputPath,
83
+ displayId,
84
+ windowId,
85
+ openPreview
86
+ });
87
+ const baseCapture = buildBaseCaptureRecord({
88
+ mode,
89
+ displayId,
90
+ windowId,
91
+ openPreview,
92
+ outputPath,
93
+ fileUrl,
94
+ embedMarkdown,
95
+ command: captureCommand,
96
+ mediaType
97
+ });
98
+ try {
99
+ await dependencies.mkdir(outputDirectory, { recursive: true });
100
+ }
101
+ catch (error) {
102
+ const directoryError = error;
103
+ return failureWithCapture(baseCapture, buildSkippedCleanup('Capture cleanup was skipped because the screenshot output directory could not be prepared.'), 'screenshot_proof_output_directory_prepare_failed', `Screenshot output directory "${outputDirectory}" could not be prepared before capture.`, 422, {
104
+ output_path: outputPath,
105
+ output_directory: outputDirectory,
106
+ error_code: directoryError.code ?? null,
107
+ error_message: normalizeOptionalString(directoryError.message)
108
+ });
109
+ }
110
+ const captureResult = await dependencies.runCommand({
111
+ command: captureCommand.executable,
112
+ args: captureCommand.args
113
+ });
114
+ if (captureResult.command_missing) {
115
+ return failureWithCapture(baseCapture, buildSkippedCleanup('Capture cleanup was skipped because `screencapture` never started.'), 'screenshot_proof_capture_command_missing', 'macOS `screencapture` is unavailable on this host.', 503);
116
+ }
117
+ if (captureResult.exit_code !== 0) {
118
+ const classifiedError = classifyScreencaptureFailure(captureResult, outputPath);
119
+ return failureWithCapture(baseCapture, buildSkippedCleanup('Capture cleanup was skipped because the screenshot capture did not complete.'), classifiedError.code, classifiedError.message, classifiedError.status, classifiedError.details);
120
+ }
121
+ let fileStats;
122
+ try {
123
+ fileStats = await dependencies.stat(outputPath);
124
+ }
125
+ catch {
126
+ return failureWithCapture(baseCapture, buildSkippedCleanup('Cleanup was skipped because the screenshot file could not be verified after capture.'), 'screenshot_proof_output_unreadable', `Screenshot capture reported success, but "${outputPath}" is not readable.`, 422, {
127
+ output_path: outputPath
128
+ });
129
+ }
130
+ if (!fileStats.isFile() || fileStats.size <= 0) {
131
+ return failureWithCapture(baseCapture, buildSkippedCleanup('Cleanup was skipped because the screenshot file was empty or not a regular file.'), 'screenshot_proof_output_unreadable', `Screenshot capture must produce a non-empty file at "${outputPath}".`, 422, {
132
+ output_path: outputPath,
133
+ bytes: fileStats.size
134
+ });
135
+ }
136
+ const successfulCapture = {
137
+ ...baseCapture,
138
+ bytes: fileStats.size
139
+ };
140
+ if (!openPreview) {
141
+ return {
142
+ ok: true,
143
+ capture: {
144
+ ...successfulCapture,
145
+ cleanup: buildSkippedCleanup('Cleanup skipped because the helper did not open a temporary Preview surface.')
146
+ }
147
+ };
148
+ }
149
+ if (previewProbe?.kind === 'failed') {
150
+ return failureWithCapture(successfulCapture, previewProbe.cleanup, 'screenshot_proof_cleanup_failed', previewProbe.cleanup.summary, 502, {
151
+ output_path: outputPath,
152
+ cleanup_status: previewProbe.cleanup.status
153
+ });
154
+ }
155
+ if (previewProbe?.kind === 'running') {
156
+ return {
157
+ ok: true,
158
+ capture: {
159
+ ...successfulCapture,
160
+ cleanup: buildSkippedCleanup('Cleanup skipped because Preview was already running before capture, so the helper would not close unrelated Preview documents.')
161
+ }
162
+ };
163
+ }
164
+ await dependencies.sleep(DEFAULT_PREVIEW_CLEANUP_DELAY_MS);
165
+ const cleanupResult = await resolvePreviewCleanup(dependencies);
166
+ if (cleanupResult.status === 'failed' || cleanupResult.status === 'automation-denied') {
167
+ return failureWithCapture(successfulCapture, cleanupResult, cleanupResult.status === 'automation-denied'
168
+ ? 'screenshot_proof_cleanup_automation_denied'
169
+ : 'screenshot_proof_cleanup_failed', cleanupResult.summary, cleanupResult.status === 'automation-denied' ? 422 : 502, {
170
+ output_path: outputPath,
171
+ cleanup_status: cleanupResult.status
172
+ });
173
+ }
174
+ return {
175
+ ok: true,
176
+ capture: {
177
+ ...successfulCapture,
178
+ cleanup: cleanupResult
179
+ }
180
+ };
181
+ }
182
+ function resolveScreenshotOutputPath(cwd, outputPath, now) {
183
+ const normalizedOutputPath = normalizeOptionalString(outputPath);
184
+ const resolved = normalizedOutputPath != null
185
+ ? resolve(cwd, normalizedOutputPath)
186
+ : resolve(cwd, '.tmp', `linear-screenshot-proof-${sanitizeTimestamp(now)}.png`);
187
+ const extension = extname(resolved).toLowerCase();
188
+ const mediaType = SUPPORTED_SCREENSHOT_MEDIA_TYPES.get(extension);
189
+ if (!mediaType) {
190
+ return {
191
+ ok: false,
192
+ error: {
193
+ code: 'screenshot_proof_output_extension_invalid',
194
+ message: 'Screenshot output must end in .png, .jpg, or .jpeg so it remains compatible with Linear workpad image embedding.',
195
+ status: 422,
196
+ details: {
197
+ output_path: resolved,
198
+ supported_extensions: [...SUPPORTED_SCREENSHOT_MEDIA_TYPES.keys()]
199
+ }
200
+ }
201
+ };
202
+ }
203
+ return {
204
+ ok: true,
205
+ output_path: resolved,
206
+ media_type: mediaType
207
+ };
208
+ }
209
+ function buildCaptureCommand(input) {
210
+ const args = ['-x'];
211
+ if (input.openPreview) {
212
+ args.push('-P');
213
+ }
214
+ if (input.displayId) {
215
+ args.push('-D', input.displayId);
216
+ }
217
+ if (input.windowId) {
218
+ args.push('-l', input.windowId);
219
+ }
220
+ args.push(input.outputPath);
221
+ return {
222
+ executable: 'screencapture',
223
+ args
224
+ };
225
+ }
226
+ function buildBaseCaptureRecord(input) {
227
+ return {
228
+ platform: 'darwin',
229
+ mode: input.mode,
230
+ display_id: input.displayId,
231
+ window_id: input.windowId,
232
+ open_preview: input.openPreview,
233
+ command: input.command,
234
+ output_path: input.outputPath,
235
+ file_url: input.fileUrl,
236
+ embed_markdown: input.embedMarkdown,
237
+ bytes: null,
238
+ media_type: input.mediaType ?? DEFAULT_SCREENSHOT_MEDIA_TYPE,
239
+ cleanup: buildSkippedCleanup('Cleanup status has not been resolved yet.')
240
+ };
241
+ }
242
+ async function resolvePreviewCleanup(dependencies) {
243
+ const cleanupCommand = {
244
+ executable: 'osascript',
245
+ args: ['-e', buildPreviewCleanupScript()]
246
+ };
247
+ const cleanupResult = await dependencies.runCommand({
248
+ command: cleanupCommand.executable,
249
+ args: cleanupCommand.args
250
+ });
251
+ const stdout = normalizeOptionalString(cleanupResult.stdout);
252
+ const stderr = normalizeOptionalString(cleanupResult.stderr) ?? cleanupResult.error_message;
253
+ if (cleanupResult.command_missing) {
254
+ return {
255
+ attempted: true,
256
+ status: 'failed',
257
+ summary: 'Preview cleanup failed because `osascript` is unavailable on this host.',
258
+ command: cleanupCommand,
259
+ exit_code: cleanupResult.exit_code,
260
+ stdout,
261
+ stderr
262
+ };
263
+ }
264
+ if (cleanupResult.exit_code !== 0) {
265
+ if (isAutomationDenied(stderr)) {
266
+ return {
267
+ attempted: true,
268
+ status: 'automation-denied',
269
+ summary: 'Preview cleanup was blocked by macOS Automation permission. Grant Apple Events access for this helper or rerun without `--open-preview`.',
270
+ command: cleanupCommand,
271
+ exit_code: cleanupResult.exit_code,
272
+ stdout,
273
+ stderr
274
+ };
275
+ }
276
+ return {
277
+ attempted: true,
278
+ status: 'failed',
279
+ summary: 'Preview cleanup failed after capture; inspect stderr for the AppleScript error.',
280
+ command: cleanupCommand,
281
+ exit_code: cleanupResult.exit_code,
282
+ stdout,
283
+ stderr
284
+ };
285
+ }
286
+ if (stdout === 'closed') {
287
+ return {
288
+ attempted: true,
289
+ status: 'succeeded',
290
+ summary: 'Preview cleanup closed the temporary screenshot document after capture.',
291
+ command: cleanupCommand,
292
+ exit_code: 0,
293
+ stdout,
294
+ stderr
295
+ };
296
+ }
297
+ if (stdout === 'not-running' || stdout === 'not-found') {
298
+ return buildSkippedCleanup('Cleanup skipped because Preview was already closed before the AppleScript cleanup step.');
299
+ }
300
+ if (stdout === 'ambiguous') {
301
+ return buildSkippedCleanup('Cleanup skipped because Preview opened more than one document before the bounded cleanup step, so the helper would not guess which document to close.');
302
+ }
303
+ return {
304
+ attempted: true,
305
+ status: 'failed',
306
+ summary: 'Preview cleanup failed after capture; the AppleScript cleanup step returned an unexpected result.',
307
+ command: cleanupCommand,
308
+ exit_code: 0,
309
+ stdout,
310
+ stderr
311
+ };
312
+ }
313
+ async function probePreviewRunning(dependencies) {
314
+ const previewCheck = await dependencies.runCommand({
315
+ command: 'pgrep',
316
+ args: ['-x', 'Preview']
317
+ });
318
+ if (previewCheck.command_missing) {
319
+ return {
320
+ kind: 'failed',
321
+ cleanup: {
322
+ attempted: false,
323
+ status: 'failed',
324
+ summary: 'Preview cleanup preflight failed because `pgrep` is unavailable on this host.',
325
+ command: null,
326
+ exit_code: previewCheck.exit_code,
327
+ stdout: normalizeOptionalString(previewCheck.stdout),
328
+ stderr: normalizeOptionalString(previewCheck.stderr) ?? previewCheck.error_message
329
+ }
330
+ };
331
+ }
332
+ if (previewCheck.exit_code === 1) {
333
+ return { kind: 'not-running' };
334
+ }
335
+ if (previewCheck.exit_code === 0) {
336
+ return { kind: 'running' };
337
+ }
338
+ return {
339
+ kind: 'failed',
340
+ cleanup: {
341
+ attempted: false,
342
+ status: 'failed',
343
+ summary: 'Preview cleanup preflight failed because Preview process discovery did not complete before capture.',
344
+ command: null,
345
+ exit_code: previewCheck.exit_code,
346
+ stdout: normalizeOptionalString(previewCheck.stdout),
347
+ stderr: normalizeOptionalString(previewCheck.stderr) ?? previewCheck.error_message
348
+ }
349
+ };
350
+ }
351
+ function buildPreviewCleanupScript() {
352
+ return [
353
+ 'if application "Preview" is not running then return "not-running"',
354
+ 'tell application "Preview"',
355
+ ' if (count of documents) is 0 then return "not-found"',
356
+ ' if (count of documents) is not 1 then return "ambiguous"',
357
+ ' close front document saving no',
358
+ ' if (count of documents) is 0 then quit',
359
+ 'end tell',
360
+ 'return "closed"'
361
+ ].join('\n');
362
+ }
363
+ function classifyScreencaptureFailure(result, outputPath) {
364
+ const stderr = normalizeOptionalString(result.stderr) ?? result.error_message;
365
+ if (isScreenRecordingDenied(stderr)) {
366
+ return {
367
+ code: 'screenshot_proof_screen_recording_denied',
368
+ message: 'macOS denied Screen Recording access for `screencapture`. Grant Screen Recording permission or use a machine where this helper is authorized.',
369
+ status: 422,
370
+ details: {
371
+ output_path: outputPath,
372
+ exit_code: result.exit_code,
373
+ stderr
374
+ }
375
+ };
376
+ }
377
+ return {
378
+ code: 'screenshot_proof_capture_failed',
379
+ message: 'macOS `screencapture` did not produce a screenshot file.',
380
+ status: 502,
381
+ details: {
382
+ output_path: outputPath,
383
+ exit_code: result.exit_code,
384
+ stderr
385
+ }
386
+ };
387
+ }
388
+ function buildScreenshotEmbedMarkdown(fileUrl) {
389
+ return /[()]/u.test(fileUrl)
390
+ ? `![${DEFAULT_SCREENSHOT_LABEL}](<${fileUrl}>)`
391
+ : `![${DEFAULT_SCREENSHOT_LABEL}](${fileUrl})`;
392
+ }
393
+ function buildSkippedCleanup(summary) {
394
+ return {
395
+ attempted: false,
396
+ status: 'skipped',
397
+ summary,
398
+ command: null,
399
+ exit_code: null,
400
+ stdout: null,
401
+ stderr: null
402
+ };
403
+ }
404
+ function failure(code, message, status, details) {
405
+ return {
406
+ ok: false,
407
+ capture: null,
408
+ error: {
409
+ code,
410
+ message,
411
+ status,
412
+ ...(details ? { details } : {})
413
+ }
414
+ };
415
+ }
416
+ function failureWithCapture(capture, cleanup, code, message, status, details) {
417
+ return {
418
+ ok: false,
419
+ capture: {
420
+ ...capture,
421
+ cleanup
422
+ },
423
+ error: {
424
+ code,
425
+ message,
426
+ status,
427
+ ...(details ? { details } : {})
428
+ }
429
+ };
430
+ }
431
+ function normalizeOptionalDigits(value) {
432
+ const normalized = normalizeOptionalString(value);
433
+ if (!normalized) {
434
+ return null;
435
+ }
436
+ return /^\d+$/u.test(normalized) ? normalized : null;
437
+ }
438
+ function normalizeOptionalString(value) {
439
+ if (typeof value !== 'string') {
440
+ return null;
441
+ }
442
+ const trimmed = value.trim();
443
+ return trimmed.length > 0 ? trimmed : null;
444
+ }
445
+ function normalizeExecOutput(value) {
446
+ if (typeof value === 'string') {
447
+ return value;
448
+ }
449
+ return value ? value.toString('utf8') : '';
450
+ }
451
+ function sanitizeTimestamp(value) {
452
+ return value.replace(/[^0-9A-Za-z]+/gu, '');
453
+ }
454
+ function isScreenRecordingDenied(value) {
455
+ if (!value) {
456
+ return false;
457
+ }
458
+ const normalized = value.toLowerCase();
459
+ return (normalized.includes('screen recording')
460
+ || normalized.includes('not authorized')
461
+ || normalized.includes('not permitted')
462
+ || normalized.includes('windowserver'));
463
+ }
464
+ function isAutomationDenied(value) {
465
+ if (!value) {
466
+ return false;
467
+ }
468
+ const normalized = value.toLowerCase();
469
+ return (normalized.includes('-1743')
470
+ || normalized.includes('not authorized to send apple events')
471
+ || normalized.includes('not permitted to send apple events')
472
+ || normalized.includes('err aeeventnotpermitted'));
473
+ }