@kbediako/codex-orchestrator 0.1.37 → 0.2.0

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 (302) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/README.md +73 -291
  3. package/bin/codex-orchestrator.js +161 -0
  4. package/codex.orchestrator.json +149 -13
  5. package/dist/bin/codex-orchestrator.js +795 -1154
  6. package/dist/orchestrator/src/cli/adapters/CommandPlanner.js +22 -4
  7. package/dist/orchestrator/src/cli/adapters/CommandReviewer.js +3 -3
  8. package/dist/orchestrator/src/cli/adapters/CommandTester.js +2 -2
  9. package/dist/orchestrator/src/cli/adapters/cloudFailureDiagnostics.js +183 -11
  10. package/dist/orchestrator/src/cli/coStatusAttachCliShell.js +402 -0
  11. package/dist/orchestrator/src/cli/coStatusCliShell.js +429 -0
  12. package/dist/orchestrator/src/cli/coStatusOperatorAutopilotCliShell.js +120 -0
  13. package/dist/orchestrator/src/cli/codexCliShell.js +72 -0
  14. package/dist/orchestrator/src/cli/codexDefaultsSetup.js +49 -11
  15. package/dist/orchestrator/src/cli/config/delegationConfig.js +317 -5
  16. package/dist/orchestrator/src/cli/config/repoConfigPolicy.js +2 -3
  17. package/dist/orchestrator/src/cli/config/userConfig.js +28 -13
  18. package/dist/orchestrator/src/cli/control/authenticatedControlRouteGate.js +69 -0
  19. package/dist/orchestrator/src/cli/control/authenticatedRouteComposition.js +267 -0
  20. package/dist/orchestrator/src/cli/control/authenticatedRouteController.js +5 -0
  21. package/dist/orchestrator/src/cli/control/authenticatedRouteDispatcher.js +41 -0
  22. package/dist/orchestrator/src/cli/control/compatibilityIssuePresenter.js +1035 -0
  23. package/dist/orchestrator/src/cli/control/confirmationApproveController.js +62 -0
  24. package/dist/orchestrator/src/cli/control/confirmationCreateController.js +69 -0
  25. package/dist/orchestrator/src/cli/control/confirmationIssueConsumeController.js +43 -0
  26. package/dist/orchestrator/src/cli/control/confirmationListController.js +22 -0
  27. package/dist/orchestrator/src/cli/control/confirmationValidateController.js +58 -0
  28. package/dist/orchestrator/src/cli/control/confirmations.js +25 -3
  29. package/dist/orchestrator/src/cli/control/controlActionCancelConfirmation.js +65 -0
  30. package/dist/orchestrator/src/cli/control/controlActionController.js +77 -0
  31. package/dist/orchestrator/src/cli/control/controlActionControllerSequencing.js +161 -0
  32. package/dist/orchestrator/src/cli/control/controlActionExecution.js +142 -0
  33. package/dist/orchestrator/src/cli/control/controlActionFinalization.js +43 -0
  34. package/dist/orchestrator/src/cli/control/controlActionOutcome.js +60 -0
  35. package/dist/orchestrator/src/cli/control/controlActionPreflight.js +476 -0
  36. package/dist/orchestrator/src/cli/control/controlAuthenticatedRouteHandoff.js +57 -0
  37. package/dist/orchestrator/src/cli/control/controlBootstrapAssembly.js +39 -0
  38. package/dist/orchestrator/src/cli/control/controlBootstrapMetadataPersistence.js +16 -0
  39. package/dist/orchestrator/src/cli/control/controlEventTransport.js +49 -0
  40. package/dist/orchestrator/src/cli/control/controlExpiryLifecycle.js +102 -0
  41. package/dist/orchestrator/src/cli/control/controlHostOwnership.js +480 -0
  42. package/dist/orchestrator/src/cli/control/controlHostSupervision.js +608 -0
  43. package/dist/orchestrator/src/cli/control/controlOversightFacade.js +8 -0
  44. package/dist/orchestrator/src/cli/control/controlOversightReadContract.js +1 -0
  45. package/dist/orchestrator/src/cli/control/controlOversightReadService.js +16 -0
  46. package/dist/orchestrator/src/cli/control/controlOversightUpdateContract.js +1 -0
  47. package/dist/orchestrator/src/cli/control/controlPersistenceFiles.js +6 -0
  48. package/dist/orchestrator/src/cli/control/controlQuestionChildResolution.js +18 -0
  49. package/dist/orchestrator/src/cli/control/controlRequestContext.js +42 -0
  50. package/dist/orchestrator/src/cli/control/controlRequestController.js +9 -0
  51. package/dist/orchestrator/src/cli/control/controlRequestPredispatch.js +17 -0
  52. package/dist/orchestrator/src/cli/control/controlRequestRouteDispatch.js +44 -0
  53. package/dist/orchestrator/src/cli/control/controlRuntime.js +992 -0
  54. package/dist/orchestrator/src/cli/control/controlServer.js +23 -1456
  55. package/dist/orchestrator/src/cli/control/controlServerAuditAndErrorHelpers.js +115 -0
  56. package/dist/orchestrator/src/cli/control/controlServerAuthenticatedRouteBranch.js +29 -0
  57. package/dist/orchestrator/src/cli/control/controlServerBootstrapLifecycle.js +30 -0
  58. package/dist/orchestrator/src/cli/control/controlServerBootstrapStartSequence.js +21 -0
  59. package/dist/orchestrator/src/cli/control/controlServerOwnedRuntimeLifecycle.js +67 -0
  60. package/dist/orchestrator/src/cli/control/controlServerPublicLifecycle.js +756 -0
  61. package/dist/orchestrator/src/cli/control/controlServerPublicRouteHelpers.js +86 -0
  62. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceLifecycle.js +25 -0
  63. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceStartup.js +18 -0
  64. package/dist/orchestrator/src/cli/control/controlServerRequestBodyHelpers.js +37 -0
  65. package/dist/orchestrator/src/cli/control/controlServerRequestShell.js +40 -0
  66. package/dist/orchestrator/src/cli/control/controlServerRequestShellBinding.js +17 -0
  67. package/dist/orchestrator/src/cli/control/controlServerSeedLoading.js +27 -0
  68. package/dist/orchestrator/src/cli/control/controlServerSeededRuntimeAssembly.js +186 -0
  69. package/dist/orchestrator/src/cli/control/controlServerStartupInputPreparation.js +31 -0
  70. package/dist/orchestrator/src/cli/control/controlServerStartupSequence.js +49 -0
  71. package/dist/orchestrator/src/cli/control/controlState.js +233 -2
  72. package/dist/orchestrator/src/cli/control/controlStatusDashboard.js +1899 -0
  73. package/dist/orchestrator/src/cli/control/controlTelegramBridgeBootstrapLifecycle.js +22 -0
  74. package/dist/orchestrator/src/cli/control/controlTelegramBridgeLifecycle.js +67 -0
  75. package/dist/orchestrator/src/cli/control/controlTelegramBridgeOversightFacadeFactory.js +8 -0
  76. package/dist/orchestrator/src/cli/control/controlTelegramCommandController.js +49 -0
  77. package/dist/orchestrator/src/cli/control/controlTelegramDispatchRead.js +40 -0
  78. package/dist/orchestrator/src/cli/control/controlTelegramPollingController.js +89 -0
  79. package/dist/orchestrator/src/cli/control/controlTelegramProjectionNotificationController.js +29 -0
  80. package/dist/orchestrator/src/cli/control/controlTelegramPushState.js +63 -0
  81. package/dist/orchestrator/src/cli/control/controlTelegramQuestionRead.js +13 -0
  82. package/dist/orchestrator/src/cli/control/controlTelegramReadController.js +216 -0
  83. package/dist/orchestrator/src/cli/control/controlTelegramUpdateHandler.js +63 -0
  84. package/dist/orchestrator/src/cli/control/controlWatcher.js +73 -5
  85. package/dist/orchestrator/src/cli/control/delegationRegisterController.js +35 -0
  86. package/dist/orchestrator/src/cli/control/dynamicToolBridgePolicy.js +139 -0
  87. package/dist/orchestrator/src/cli/control/eventsSseController.js +12 -0
  88. package/dist/orchestrator/src/cli/control/linearBudgetState.js +1789 -0
  89. package/dist/orchestrator/src/cli/control/linearDispatchSource.js +1137 -0
  90. package/dist/orchestrator/src/cli/control/linearGraphqlClient.js +150 -0
  91. package/dist/orchestrator/src/cli/control/linearRateLimit.js +102 -0
  92. package/dist/orchestrator/src/cli/control/linearWebhookController.js +499 -0
  93. package/dist/orchestrator/src/cli/control/liveLinearAdvisoryRuntime.js +70 -0
  94. package/dist/orchestrator/src/cli/control/observabilityApiController.js +173 -0
  95. package/dist/orchestrator/src/cli/control/observabilityReadModel.js +500 -0
  96. package/dist/orchestrator/src/cli/control/observabilitySurface.js +284 -0
  97. package/dist/orchestrator/src/cli/control/observabilityUpdateNotifier.js +22 -0
  98. package/dist/orchestrator/src/cli/control/operatorDashboardPresenter.js +252 -0
  99. package/dist/orchestrator/src/cli/control/providerAgentCapacity.js +70 -0
  100. package/dist/orchestrator/src/cli/control/providerControlHostFreshnessGauge.js +1068 -0
  101. package/dist/orchestrator/src/cli/control/providerIntakeState.js +473 -0
  102. package/dist/orchestrator/src/cli/control/providerIssueHandoff.js +6811 -0
  103. package/dist/orchestrator/src/cli/control/providerIssueObservability.js +1348 -0
  104. package/dist/orchestrator/src/cli/control/providerIssueRetryQueue.js +84 -0
  105. package/dist/orchestrator/src/cli/control/providerLinearRuntimeProof.js +588 -0
  106. package/dist/orchestrator/src/cli/control/providerLinearScreenshotProof.js +473 -0
  107. package/dist/orchestrator/src/cli/control/providerLinearWorkerTruth.js +383 -0
  108. package/dist/orchestrator/src/cli/control/providerLinearWorkflowAudit.js +254 -0
  109. package/dist/orchestrator/src/cli/control/providerLinearWorkflowFacade.js +5573 -0
  110. package/dist/orchestrator/src/cli/control/providerLinearWorkflowStates.js +115 -0
  111. package/dist/orchestrator/src/cli/control/providerMergeCloseout.js +1868 -0
  112. package/dist/orchestrator/src/cli/control/providerOperatorAutopilot.js +1580 -0
  113. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLifecycle.js +154 -0
  114. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLocalRolloutExecution.js +1006 -0
  115. package/dist/orchestrator/src/cli/control/providerPollingHealth.js +435 -0
  116. package/dist/orchestrator/src/cli/control/providerTerminalCleanup.js +516 -0
  117. package/dist/orchestrator/src/cli/control/providerWorkerHosts.js +191 -0
  118. package/dist/orchestrator/src/cli/control/providerWorkflowConfigStore.js +515 -0
  119. package/dist/orchestrator/src/cli/control/questionChildResolutionAdapter.js +361 -0
  120. package/dist/orchestrator/src/cli/control/questionQueueController.js +181 -0
  121. package/dist/orchestrator/src/cli/control/questionReadRetryDeduplication.js +9 -0
  122. package/dist/orchestrator/src/cli/control/questionReadSequence.js +10 -0
  123. package/dist/orchestrator/src/cli/control/securityViolationController.js +27 -0
  124. package/dist/orchestrator/src/cli/control/selectedRunProjection.js +1838 -0
  125. package/dist/orchestrator/src/cli/control/telegramOversightApiClient.js +48 -0
  126. package/dist/orchestrator/src/cli/control/telegramOversightBridge.js +180 -0
  127. package/dist/orchestrator/src/cli/control/telegramOversightBridgeProjectionDeliveryQueue.js +25 -0
  128. package/dist/orchestrator/src/cli/control/telegramOversightBridgeRuntimeLifecycle.js +45 -0
  129. package/dist/orchestrator/src/cli/control/telegramOversightBridgeStateStore.js +77 -0
  130. package/dist/orchestrator/src/cli/control/telegramOversightControlActionApiClient.js +45 -0
  131. package/dist/orchestrator/src/cli/control/trackerDispatchPilot.js +439 -0
  132. package/dist/orchestrator/src/cli/control/uiDataController.js +34 -0
  133. package/dist/orchestrator/src/cli/control/uiSessionController.js +100 -0
  134. package/dist/orchestrator/src/cli/controlHostCliShell.js +860 -0
  135. package/dist/orchestrator/src/cli/controlHostFreshnessGaugeCliShell.js +129 -0
  136. package/dist/orchestrator/src/cli/controlHostSupervisionCliShell.js +2127 -0
  137. package/dist/orchestrator/src/cli/delegationCliShell.js +62 -0
  138. package/dist/orchestrator/src/cli/delegationServer.js +567 -678
  139. package/dist/orchestrator/src/cli/delegationServerCliShell.js +52 -0
  140. package/dist/orchestrator/src/cli/delegationServerQuestionFlowShell.js +228 -0
  141. package/dist/orchestrator/src/cli/delegationServerToolDispatchShell.js +411 -0
  142. package/dist/orchestrator/src/cli/delegationServerTransport.js +274 -0
  143. package/dist/orchestrator/src/cli/delegationSetup.js +51 -171
  144. package/dist/orchestrator/src/cli/devtoolsCliShell.js +34 -0
  145. package/dist/orchestrator/src/cli/doctor.js +542 -122
  146. package/dist/orchestrator/src/cli/doctorCliRequestShell.js +72 -0
  147. package/dist/orchestrator/src/cli/doctorCliShell.js +138 -0
  148. package/dist/orchestrator/src/cli/doctorUsage.js +136 -16
  149. package/dist/orchestrator/src/cli/exec/experience.js +16 -2
  150. package/dist/orchestrator/src/cli/exec/summary.js +3 -0
  151. package/dist/orchestrator/src/cli/execCliShell.js +51 -0
  152. package/dist/orchestrator/src/cli/flowCliRequestShell.js +44 -0
  153. package/dist/orchestrator/src/cli/flowCliShell.js +239 -0
  154. package/dist/orchestrator/src/cli/frontendTestCliRequestShell.js +80 -0
  155. package/dist/orchestrator/src/cli/frontendTestCliShell.js +41 -0
  156. package/dist/orchestrator/src/cli/init.js +1 -0
  157. package/dist/orchestrator/src/cli/initCliShell.js +50 -0
  158. package/dist/orchestrator/src/cli/linearCliShell.js +1200 -0
  159. package/dist/orchestrator/src/cli/mcpEnableCliShell.js +132 -0
  160. package/dist/orchestrator/src/cli/metrics/metricsAggregator.js +3 -2
  161. package/dist/orchestrator/src/cli/metrics/metricsRecorder.js +56 -0
  162. package/dist/orchestrator/src/cli/orchestrator.js +66 -1376
  163. package/dist/orchestrator/src/cli/planCliShell.js +19 -0
  164. package/dist/orchestrator/src/cli/prCliShell.js +41 -0
  165. package/dist/orchestrator/src/cli/providerLinearChildLanePhaseContract.js +204 -0
  166. package/dist/orchestrator/src/cli/providerLinearChildLaneRunner.js +1772 -0
  167. package/dist/orchestrator/src/cli/providerLinearChildLaneShell.js +2420 -0
  168. package/dist/orchestrator/src/cli/providerLinearChildStreamShell.js +385 -0
  169. package/dist/orchestrator/src/cli/providerLinearWorkerRunner.js +5738 -0
  170. package/dist/orchestrator/src/cli/resumeCliShell.js +14 -0
  171. package/dist/orchestrator/src/cli/reviewCliLaunchShell.js +72 -0
  172. package/dist/orchestrator/src/cli/rlm/alignment.js +3 -3
  173. package/dist/orchestrator/src/cli/rlm/context.js +94 -7
  174. package/dist/orchestrator/src/cli/rlm/rlmCodexRuntimeShell.js +546 -0
  175. package/dist/orchestrator/src/cli/rlm/symbolic.js +4 -2
  176. package/dist/orchestrator/src/cli/rlmCliRequestShell.js +42 -0
  177. package/dist/orchestrator/src/cli/rlmCompletionCliShell.js +46 -0
  178. package/dist/orchestrator/src/cli/rlmLaunchCliShell.js +51 -0
  179. package/dist/orchestrator/src/cli/rlmRunner.js +83 -523
  180. package/dist/orchestrator/src/cli/run/blockMemory.js +500 -0
  181. package/dist/orchestrator/src/cli/run/manifest.js +410 -73
  182. package/dist/orchestrator/src/cli/run/manifestPersister.js +45 -14
  183. package/dist/orchestrator/src/cli/run/runMemoryController.js +216 -0
  184. package/dist/orchestrator/src/cli/run/source0.js +690 -0
  185. package/dist/orchestrator/src/cli/run/workspacePath.js +101 -0
  186. package/dist/orchestrator/src/cli/runtime/mode.js +2 -1
  187. package/dist/orchestrator/src/cli/runtime/provider.js +39 -2
  188. package/dist/orchestrator/src/cli/selfCheckCliShell.js +12 -0
  189. package/dist/orchestrator/src/cli/services/commandRunner.js +668 -18
  190. package/dist/orchestrator/src/cli/services/execRuntime.js +66 -1
  191. package/dist/orchestrator/src/cli/services/orchestratorAutoScoutEvidenceRecorder.js +71 -0
  192. package/dist/orchestrator/src/cli/services/orchestratorCloudBranchResolution.js +8 -0
  193. package/dist/orchestrator/src/cli/services/orchestratorCloudEnvironmentResolution.js +22 -0
  194. package/dist/orchestrator/src/cli/services/orchestratorCloudExecutionLifecycleShell.js +39 -0
  195. package/dist/orchestrator/src/cli/services/orchestratorCloudPromptBuilder.js +37 -0
  196. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteFallbackContract.js +45 -0
  197. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteShell.js +36 -0
  198. package/dist/orchestrator/src/cli/services/orchestratorCloudTargetExecutor.js +277 -0
  199. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycle.js +98 -0
  200. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycleShell.js +54 -0
  201. package/dist/orchestrator/src/cli/services/orchestratorExecutionLifecycle.js +112 -0
  202. package/dist/orchestrator/src/cli/services/orchestratorExecutionModePolicy.js +27 -0
  203. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteAdapterShell.js +59 -0
  204. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteDecisionShell.js +57 -0
  205. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteState.js +21 -0
  206. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouter.js +2 -0
  207. package/dist/orchestrator/src/cli/services/orchestratorLocalPipelineExecutor.js +149 -0
  208. package/dist/orchestrator/src/cli/services/orchestratorLocalRouteShell.js +63 -0
  209. package/dist/orchestrator/src/cli/services/orchestratorPlanShell.js +54 -0
  210. package/dist/orchestrator/src/cli/services/orchestratorPlanTargetTracker.js +16 -0
  211. package/dist/orchestrator/src/cli/services/orchestratorResumePreparationShell.js +84 -0
  212. package/dist/orchestrator/src/cli/services/orchestratorResumeTokenValidation.js +15 -0
  213. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleCompletion.js +31 -0
  214. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleExecutionRegistration.js +37 -0
  215. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleOrchestrationShell.js +83 -0
  216. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleTaskManagerShell.js +37 -0
  217. package/dist/orchestrator/src/cli/services/orchestratorRuntimeManifestMutation.js +20 -0
  218. package/dist/orchestrator/src/cli/services/orchestratorStartPreparationShell.js +56 -0
  219. package/dist/orchestrator/src/cli/services/orchestratorStatusShell.js +70 -0
  220. package/dist/orchestrator/src/cli/services/pipelineResolver.js +7 -3
  221. package/dist/orchestrator/src/cli/services/plannerMemory.js +119 -0
  222. package/dist/orchestrator/src/cli/services/runPreparation.js +7 -3
  223. package/dist/orchestrator/src/cli/services/runSummaryWriter.js +9 -0
  224. package/dist/orchestrator/src/cli/setupBootstrapShell.js +114 -0
  225. package/dist/orchestrator/src/cli/setupCliShell.js +51 -0
  226. package/dist/orchestrator/src/cli/skillsCliShell.js +56 -0
  227. package/dist/orchestrator/src/cli/startCliRequestShell.js +53 -0
  228. package/dist/orchestrator/src/cli/startCliShell.js +68 -0
  229. package/dist/orchestrator/src/cli/statusCliShell.js +22 -0
  230. package/dist/orchestrator/src/cli/utils/authProvenanceFingerprint.js +27 -0
  231. package/dist/orchestrator/src/cli/utils/cloudPreflight.js +83 -1
  232. package/dist/orchestrator/src/cli/utils/delegationConfigParser.js +250 -0
  233. package/dist/orchestrator/src/cli/utils/delegationMcpHealth.js +1382 -0
  234. package/dist/orchestrator/src/cli/utils/devtools.js +2 -54
  235. package/dist/orchestrator/src/cli/utils/mcpServerEntry.js +53 -0
  236. package/dist/orchestrator/src/cli/utils/packageProgramResolver.js +151 -0
  237. package/dist/orchestrator/src/cli/utils/providerOverrideEnv.js +71 -0
  238. package/dist/orchestrator/src/cli/utils/trailingJsonObject.js +59 -0
  239. package/dist/orchestrator/src/learning/crystalizer.js +2 -2
  240. package/dist/orchestrator/src/persistence/ExperienceStore.js +233 -49
  241. package/dist/orchestrator/src/persistence/TaskStateStore.js +6 -6
  242. package/dist/orchestrator/src/persistence/lockFile.js +70 -4
  243. package/dist/orchestrator/src/persistence/sanitizeIdentifier.js +39 -0
  244. package/dist/orchestrator/src/sync/createCloudSyncWorker.js +3 -2
  245. package/dist/orchestrator/src/utils/atomicWrite.js +17 -2
  246. package/dist/packages/orchestrator/src/exec/unified-exec.js +99 -6
  247. package/dist/packages/orchestrator/src/instructions/promptPacks.js +150 -19
  248. package/dist/packages/sdk-node/src/orchestrator.js +137 -13
  249. package/dist/packages/shared/config/designConfig.js +8 -1
  250. package/dist/packages/shared/streams/stdio.js +1 -1
  251. package/dist/scripts/design/pipeline/permit.js +15 -0
  252. package/dist/scripts/lib/docs-catalog.js +365 -0
  253. package/dist/scripts/lib/docs-helpers.js +87 -5
  254. package/dist/scripts/lib/pr-watch-merge.js +1088 -80
  255. package/dist/scripts/lib/provider-run-contract.js +26 -0
  256. package/dist/scripts/lib/review-command-intent-classification.js +532 -0
  257. package/dist/scripts/lib/review-command-probe-classification.js +385 -0
  258. package/dist/scripts/lib/review-execution-boundary-preflight.js +279 -0
  259. package/dist/scripts/lib/review-execution-runtime.js +753 -0
  260. package/dist/scripts/lib/review-execution-state.js +1144 -0
  261. package/dist/scripts/lib/review-execution-telemetry.js +215 -0
  262. package/dist/scripts/lib/review-inspection-target-parsing.js +78 -0
  263. package/dist/scripts/lib/review-launch-attempt.js +601 -0
  264. package/dist/scripts/lib/review-meta-surface-boundary-analysis.js +300 -0
  265. package/dist/scripts/lib/review-meta-surface-normalization.js +746 -0
  266. package/dist/scripts/lib/review-non-interactive-handoff.js +61 -0
  267. package/dist/scripts/lib/review-prompt-context.js +376 -0
  268. package/dist/scripts/lib/review-scope-advisory.js +286 -0
  269. package/dist/scripts/lib/review-scope-paths.js +123 -0
  270. package/dist/scripts/lib/review-shell-command-parser.js +389 -0
  271. package/dist/scripts/lib/review-shell-env-interpreter.js +340 -0
  272. package/dist/scripts/lib/run-manifests.js +192 -36
  273. package/dist/scripts/lib/spark-policy-classifier.js +593 -0
  274. package/dist/scripts/run-review.js +507 -1777
  275. package/docs/public/downstream-setup.md +106 -0
  276. package/docs/public/provider-onboarding.md +173 -0
  277. package/package.json +30 -11
  278. package/plugins/codex-orchestrator/.codex-plugin/plugin.json +30 -0
  279. package/plugins/codex-orchestrator/.mcp.json +13 -0
  280. package/plugins/codex-orchestrator/launcher.mjs +359 -0
  281. package/schemas/manifest.json +395 -0
  282. package/skills/chrome-devtools/SKILL.md +1 -1
  283. package/skills/codex-orchestrator/SKILL.md +83 -0
  284. package/skills/collab-subagents-first/SKILL.md +2 -1
  285. package/skills/delegation-usage/DELEGATION_GUIDE.md +24 -11
  286. package/skills/delegation-usage/SKILL.md +20 -13
  287. package/skills/land/SKILL.md +77 -0
  288. package/skills/linear/SKILL.md +255 -0
  289. package/skills/release/SKILL.md +47 -3
  290. package/skills/standalone-review/SKILL.md +6 -1
  291. package/templates/README.md +4 -2
  292. package/templates/codex/.codex/agents/awaiter-high.toml +2 -2
  293. package/templates/codex/.codex/agents/explorer-fast.toml +1 -0
  294. package/templates/codex/.codex/agents/worker-complex.toml +1 -1
  295. package/templates/codex/.codex/config.toml +3 -4
  296. package/templates/codex/.codex/providers/README.md +13 -0
  297. package/templates/codex/.codex/providers/control.example.json +18 -0
  298. package/templates/codex/.codex/providers/provider.env.example +15 -0
  299. package/templates/codex/AGENTS.md +12 -7
  300. package/templates/codex/mcp-client.json +5 -1
  301. package/docs/README.md +0 -307
  302. package/docs/assets/setup.gif +0 -0
@@ -18,6 +18,21 @@ export async function loadPermitFile(repoRoot) {
18
18
  };
19
19
  }
20
20
  }
21
+ export function resolveRuntimeProofCapabilities(permitEntry) {
22
+ const runtimeProof = permitEntry && typeof permitEntry.runtime_proof === 'object' && permitEntry.runtime_proof !== null
23
+ ? permitEntry.runtime_proof
24
+ : {};
25
+ const screenshot = runtimeProof.allow_screenshot === true;
26
+ const externalLink = runtimeProof.allow_external_link === true;
27
+ const video = typeof runtimeProof.allow_video === 'boolean'
28
+ ? runtimeProof.allow_video === true
29
+ : permitEntry?.allow_video_capture === true;
30
+ return {
31
+ screenshot,
32
+ external_link: externalLink,
33
+ video
34
+ };
35
+ }
21
36
  export function buildAllowedOriginSet(permit) {
22
37
  const allowed = new Set();
23
38
  const sources = Array.isArray(permit?.allowedSources) ? permit.allowedSources : [];
@@ -0,0 +1,365 @@
1
+ import { readFile, readdir } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { pathExists, toPosixPath } from './docs-helpers.js';
4
+ export const DEFAULT_DOCS_CATALOG_PATH = 'docs/docs-catalog.json';
5
+ function isObject(value) {
6
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
7
+ }
8
+ function normalizeString(value) {
9
+ return typeof value === 'string' ? value.trim() : '';
10
+ }
11
+ function normalizeCatalogPath(value) {
12
+ const normalized = normalizeString(value).replace(/\\/g, '/');
13
+ if (!normalized) {
14
+ return '';
15
+ }
16
+ const withoutDotPrefix = normalized.replace(/^\.\//, '');
17
+ const collapsed = path.posix.normalize(withoutDotPrefix);
18
+ return collapsed === '.' ? '' : collapsed.replace(/^\.\//, '');
19
+ }
20
+ function normalizeStringArray(value) {
21
+ if (!Array.isArray(value)) {
22
+ return [];
23
+ }
24
+ return value.map((item) => normalizeString(item)).filter((item) => item.length > 0);
25
+ }
26
+ function escapeRegExp(value) {
27
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
28
+ }
29
+ function globToRegExp(glob) {
30
+ let pattern = '^';
31
+ for (let index = 0; index < glob.length; index += 1) {
32
+ const char = glob[index];
33
+ const next = glob[index + 1];
34
+ const afterNext = glob[index + 2];
35
+ if (char === '*') {
36
+ if (next === '*') {
37
+ if (afterNext === '/') {
38
+ pattern += '(?:.*/)?';
39
+ index += 2;
40
+ }
41
+ else {
42
+ pattern += '.*';
43
+ index += 1;
44
+ }
45
+ }
46
+ else {
47
+ pattern += '[^/]*';
48
+ }
49
+ continue;
50
+ }
51
+ if (char === '?') {
52
+ pattern += '.';
53
+ continue;
54
+ }
55
+ pattern += escapeRegExp(char);
56
+ }
57
+ pattern += '$';
58
+ return new RegExp(pattern);
59
+ }
60
+ function normalizeCatalogRule(raw, kind) {
61
+ if (!isObject(raw)) {
62
+ throw new Error(`Invalid docs catalog ${kind}: expected object.`);
63
+ }
64
+ const pathValue = normalizeCatalogPath(raw.path);
65
+ const glob = normalizeCatalogPath(raw.glob);
66
+ if (kind === 'entry' && !pathValue) {
67
+ throw new Error('Invalid docs catalog entry: missing path.');
68
+ }
69
+ if (kind === 'pattern' && !glob) {
70
+ throw new Error('Invalid docs catalog pattern: missing glob.');
71
+ }
72
+ const cadenceDays = Number.isFinite(raw.cadence_days) ? Number(raw.cadence_days) : null;
73
+ const tier = Number.isFinite(raw.tier) ? Number(raw.tier) : null;
74
+ return {
75
+ path: pathValue,
76
+ glob,
77
+ glob_regex: glob ? globToRegExp(glob) : null,
78
+ status: normalizeString(raw.status) || 'active',
79
+ tier,
80
+ doc_class: normalizeString(raw.doc_class),
81
+ audience: normalizeString(raw.audience),
82
+ source_of_truth: normalizeStringArray(raw.source_of_truth),
83
+ owner: normalizeString(raw.owner),
84
+ cadence_days: cadenceDays,
85
+ update_triggers: normalizeStringArray(raw.update_triggers),
86
+ truth_checks: normalizeStringArray(raw.truth_checks)
87
+ };
88
+ }
89
+ function normalizeClassMap(raw) {
90
+ if (!isObject(raw)) {
91
+ return {};
92
+ }
93
+ const result = {};
94
+ for (const [key, value] of Object.entries(raw)) {
95
+ if (!isObject(value)) {
96
+ continue;
97
+ }
98
+ result[key] = {
99
+ label: normalizeString(value.label) || key,
100
+ report_order: Number.isFinite(value.report_order) ? Number(value.report_order) : 999
101
+ };
102
+ }
103
+ return result;
104
+ }
105
+ export async function loadDocsCatalog(repoRoot, relativePath = DEFAULT_DOCS_CATALOG_PATH) {
106
+ const absolutePath = path.resolve(repoRoot, relativePath);
107
+ const raw = JSON.parse(await readFile(absolutePath, 'utf8'));
108
+ return {
109
+ version: Number.isFinite(raw?.version) ? Number(raw.version) : 1,
110
+ relative_path: toPosixPath(path.relative(repoRoot, absolutePath)),
111
+ absolute_path: absolutePath,
112
+ classes: normalizeClassMap(raw?.classes),
113
+ policies: isObject(raw?.policies) ? raw.policies : {},
114
+ entries: Array.isArray(raw?.entries)
115
+ ? raw.entries.map((entry) => normalizeCatalogRule(entry, 'entry'))
116
+ : [],
117
+ patterns: Array.isArray(raw?.patterns)
118
+ ? raw.patterns.map((entry) => normalizeCatalogRule(entry, 'pattern'))
119
+ : []
120
+ };
121
+ }
122
+ export async function maybeLoadDocsCatalog(repoRoot, relativePath = DEFAULT_DOCS_CATALOG_PATH) {
123
+ const absolutePath = path.resolve(repoRoot, relativePath);
124
+ if (!(await pathExists(absolutePath))) {
125
+ return null;
126
+ }
127
+ return loadDocsCatalog(repoRoot, relativePath);
128
+ }
129
+ export function getDocsCatalogClassMeta(catalog, docClass) {
130
+ const meta = catalog?.classes?.[docClass];
131
+ if (!meta) {
132
+ return { label: docClass, report_order: 999 };
133
+ }
134
+ return {
135
+ label: normalizeString(meta.label) || docClass,
136
+ report_order: Number.isFinite(meta.report_order) ? Number(meta.report_order) : 999
137
+ };
138
+ }
139
+ export function resolveDocsCatalogEntry(docPath, catalog) {
140
+ const normalizedPath = normalizeCatalogPath(docPath);
141
+ if (!normalizedPath || !catalog) {
142
+ return null;
143
+ }
144
+ for (const entry of catalog.entries) {
145
+ if (entry.path === normalizedPath) {
146
+ return { ...entry, matched_by: 'path' };
147
+ }
148
+ }
149
+ for (const entry of catalog.patterns) {
150
+ if (entry.glob_regex?.test(normalizedPath)) {
151
+ return { ...entry, matched_by: 'glob' };
152
+ }
153
+ }
154
+ return null;
155
+ }
156
+ export function summarizeDocsByClass(items, catalog) {
157
+ const byClass = new Map();
158
+ function ensure(docClass) {
159
+ const key = docClass || 'uncatalogued';
160
+ if (!byClass.has(key)) {
161
+ const meta = getDocsCatalogClassMeta(catalog, key);
162
+ byClass.set(key, {
163
+ doc_class: key,
164
+ label: meta.label,
165
+ report_order: meta.report_order,
166
+ docs_scanned: 0,
167
+ registry_entries: 0,
168
+ missing_in_registry: 0,
169
+ missing_on_disk: 0,
170
+ invalid_entries: 0,
171
+ stale_entries: 0,
172
+ uncatalogued_docs: 0
173
+ });
174
+ }
175
+ return byClass.get(key);
176
+ }
177
+ for (const item of items) {
178
+ const bucket = ensure(item.doc_class);
179
+ if (item.metric === 'docs_scanned') {
180
+ bucket.docs_scanned += 1;
181
+ }
182
+ else if (item.metric === 'registry_entries') {
183
+ bucket.registry_entries += 1;
184
+ }
185
+ else if (item.metric === 'missing_in_registry') {
186
+ bucket.missing_in_registry += 1;
187
+ }
188
+ else if (item.metric === 'missing_on_disk') {
189
+ bucket.missing_on_disk += 1;
190
+ }
191
+ else if (item.metric === 'invalid_entries') {
192
+ bucket.invalid_entries += 1;
193
+ }
194
+ else if (item.metric === 'stale_entries') {
195
+ bucket.stale_entries += 1;
196
+ }
197
+ else if (item.metric === 'uncatalogued_docs') {
198
+ bucket.uncatalogued_docs += 1;
199
+ }
200
+ }
201
+ return [...byClass.values()].sort((left, right) => {
202
+ if (left.report_order !== right.report_order) {
203
+ return left.report_order - right.report_order;
204
+ }
205
+ return left.label.localeCompare(right.label);
206
+ });
207
+ }
208
+ export async function listBundledSkillNames(repoRoot) {
209
+ const skillsRoot = path.join(repoRoot, 'skills');
210
+ if (!(await pathExists(skillsRoot))) {
211
+ return [];
212
+ }
213
+ const entries = await readdir(skillsRoot, { withFileTypes: true });
214
+ const results = [];
215
+ for (const entry of entries) {
216
+ if (!entry.isDirectory()) {
217
+ continue;
218
+ }
219
+ const skillPath = path.join(skillsRoot, entry.name, 'SKILL.md');
220
+ if (await pathExists(skillPath)) {
221
+ results.push(entry.name);
222
+ }
223
+ }
224
+ results.sort();
225
+ return results;
226
+ }
227
+ export function extractBundledSkillNamesFromMarkdown(content, policy = {}) {
228
+ const lines = content.split('\n');
229
+ const sectionHeading = normalizeString(policy.section_heading) || '## Skills (bundled)';
230
+ const listIntro = normalizeString(policy.list_intro) || 'Bundled skills';
231
+ const sectionStart = lines.findIndex((line) => line.trim() === sectionHeading);
232
+ if (sectionStart === -1) {
233
+ return [];
234
+ }
235
+ let sectionEnd = lines.length;
236
+ for (let index = sectionStart + 1; index < lines.length; index += 1) {
237
+ if (lines[index]?.startsWith('## ')) {
238
+ sectionEnd = index;
239
+ break;
240
+ }
241
+ }
242
+ const sectionLines = lines.slice(sectionStart + 1, sectionEnd);
243
+ const rosterIntroIndex = sectionLines.findIndex((line) => line.trim().startsWith(listIntro));
244
+ if (rosterIntroIndex === -1) {
245
+ return [];
246
+ }
247
+ const results = [];
248
+ let started = false;
249
+ for (const line of sectionLines.slice(rosterIntroIndex + 1)) {
250
+ const trimmed = line.trim();
251
+ const match = /^- `([^`]+)`/.exec(trimmed);
252
+ if (match?.[1]) {
253
+ results.push(match[1]);
254
+ started = true;
255
+ continue;
256
+ }
257
+ if (started && trimmed.length > 0) {
258
+ break;
259
+ }
260
+ }
261
+ return [...new Set(results)].sort();
262
+ }
263
+ export async function readCurrentCodexPosture(repoRoot, policy = {}) {
264
+ const sourcePath = normalizeString(policy.source_path);
265
+ if (!sourcePath) {
266
+ return {
267
+ source_path: '',
268
+ cli_version: null,
269
+ model: null,
270
+ default_runtime: null,
271
+ explorer_fast_model: null,
272
+ unsupported_review_model: null
273
+ };
274
+ }
275
+ const absolutePath = path.resolve(repoRoot, sourcePath);
276
+ const content = await readFile(absolutePath, 'utf8');
277
+ const unsupportedReviewModel = /do not target delegated(?:\/review| or review)? surfaces at `([^`]+)`/i.exec(content)?.[1] ??
278
+ /delegated subagent and review surfaces on [^;\n]*; `([^`]+)` is currently unsupported there/i.exec(content)?.[1] ??
279
+ /delegated(?: subagent)?(?: and|\/) review surfaces on [^\n]* validates `([^`]+)`/i.exec(content)?.[1] ??
280
+ null;
281
+ return {
282
+ source_path: sourcePath,
283
+ cli_version: /Codex CLI\s+\(?`?([0-9]+\.[0-9]+\.[0-9]+)`?\)?/.exec(content)?.[1] ?? null,
284
+ model: /Current model posture(?: is|:)\s*`([^`]+)`/i.exec(content)?.[1] ?? null,
285
+ default_runtime: /Local ([A-Za-z0-9_-]+) remains the expected default runtime path/.exec(content)?.[1] ?? null,
286
+ explorer_fast_model: /explorer_fast[^\n]*`(gpt-[^`]+)`/i.exec(content)?.[1] ?? null,
287
+ unsupported_review_model: unsupportedReviewModel
288
+ };
289
+ }
290
+ export function extractCodexCliVersionMentions(content) {
291
+ const results = new Set();
292
+ const patterns = [
293
+ /Codex CLI\s+\(?`?([0-9]+\.[0-9]+\.[0-9]+)`?\)?/gi,
294
+ /codex-cli\s+\(?`?([0-9]+\.[0-9]+\.[0-9]+)`?\)?/gi
295
+ ];
296
+ for (const pattern of patterns) {
297
+ for (const match of content.matchAll(pattern)) {
298
+ if (match[1]) {
299
+ results.add(match[1]);
300
+ }
301
+ }
302
+ }
303
+ return [...results].sort();
304
+ }
305
+ export function extractCodexModelMentions(content) {
306
+ const results = new Set();
307
+ for (const match of content.matchAll(/\bgpt-[A-Za-z0-9.-]+\b/g)) {
308
+ if (match[0]) {
309
+ results.add(match[0]);
310
+ }
311
+ }
312
+ return [...results].sort();
313
+ }
314
+ function isModelPostureLine(line) {
315
+ return (isPrimaryModelPostureLine(line) ||
316
+ isSecondaryUnsupportedReviewReferenceLine(line) ||
317
+ /explorer_fast/i.test(line));
318
+ }
319
+ function isPrimaryModelPostureLine(line) {
320
+ return (/current model posture/i.test(line) ||
321
+ /keep delegated subagent and review surfaces on/i.test(line) ||
322
+ /keep delegated or review surfaces on/i.test(line) ||
323
+ /do not target delegated(?:\/review| or review)? surfaces at/i.test(line));
324
+ }
325
+ function isSecondaryUnsupportedReviewReferenceLine(line) {
326
+ return /for chatgpt auth,\s*this means/i.test(line);
327
+ }
328
+ export function extractModelPostureLines(content) {
329
+ return content
330
+ .split('\n')
331
+ .map((line) => line.trim())
332
+ .filter((line) => isModelPostureLine(line));
333
+ }
334
+ export function hasExpectedDefaultRuntimeLine(content, expectedRuntime) {
335
+ if (!normalizeString(expectedRuntime)) {
336
+ return true;
337
+ }
338
+ const relevantLines = content
339
+ .split('\n')
340
+ .map((line) => line.trim())
341
+ .filter((line) => /default runtime|expected default runtime path/i.test(line));
342
+ if (relevantLines.length === 0) {
343
+ return false;
344
+ }
345
+ const runtimePattern = new RegExp(`\\b${escapeRegExp(expectedRuntime)}\\b`, 'i');
346
+ return relevantLines.every((line) => runtimePattern.test(line));
347
+ }
348
+ export function hasExpectedModelPostureLine(content, expectedModel) {
349
+ if (!normalizeString(expectedModel)) {
350
+ return true;
351
+ }
352
+ const relevantLines = extractModelPostureLines(content).filter((line) => isPrimaryModelPostureLine(line));
353
+ if (relevantLines.length === 0) {
354
+ return false;
355
+ }
356
+ const modelPattern = new RegExp(`(^|[^A-Za-z0-9.-])${escapeRegExp(expectedModel)}($|[^A-Za-z0-9.-])`, 'i');
357
+ return relevantLines.every((line) => modelPattern.test(line));
358
+ }
359
+ export function countDocumentLines(content) {
360
+ const lines = content.split('\n');
361
+ return lines.at(-1) === '' ? lines.length - 1 : lines.length;
362
+ }
363
+ export function countHeadingLines(content, headingPrefix = '## ') {
364
+ return content.split('\n').filter((line) => line.startsWith(headingPrefix)).length;
365
+ }
@@ -1,8 +1,10 @@
1
+ import { spawnSync } from 'node:child_process';
1
2
  import { access, readdir } from 'node:fs/promises';
2
3
  import path from 'node:path';
3
- const DOC_ROOTS = ['.agent', '.ai-dev-tasks', 'docs', 'tasks'];
4
+ const DOC_ROOTS = ['.agent', '.ai-dev-tasks', 'docs', 'skills', 'tasks', 'templates'];
4
5
  const DOC_ROOT_FILES = ['README.md', 'AGENTS.md'];
5
6
  const EXCLUDED_DIR_NAMES = new Set(['.runs', 'out', 'archives', 'node_modules', 'dist']);
7
+ const GIT_LS_FILES_MAX_BUFFER = 64 * 1024 * 1024;
6
8
  export async function pathExists(target, options = {}) {
7
9
  const { allowMissingOnly = false } = options;
8
10
  try {
@@ -55,23 +57,103 @@ export async function collectDocFiles(repoRoot) {
55
57
  results.sort();
56
58
  return results;
57
59
  }
60
+ export function listTrackedFiles(repoRoot, pathspecs = []) {
61
+ const args = ['-C', repoRoot, 'ls-files', '-z'];
62
+ if (Array.isArray(pathspecs) && pathspecs.length > 0) {
63
+ args.push('--', ...pathspecs);
64
+ }
65
+ const git = spawnSync('git', args, {
66
+ encoding: 'utf8',
67
+ maxBuffer: GIT_LS_FILES_MAX_BUFFER
68
+ });
69
+ if (git.error || git.status !== 0) {
70
+ const detail = [
71
+ git.error?.message,
72
+ typeof git.stderr === 'string' ? git.stderr.trim() : '',
73
+ typeof git.stdout === 'string' ? git.stdout.trim() : '',
74
+ `status=${git.status ?? '<no status>'}`,
75
+ `signal=${git.signal ?? '<no signal>'}`
76
+ ]
77
+ .filter((part) => part)
78
+ .join('; ');
79
+ throw new Error(`git ls-files failed while collecting tracked files: ${detail}`);
80
+ }
81
+ return git.stdout
82
+ .split('\0')
83
+ .filter((line) => line.length > 0)
84
+ .map((line) => toPosixPath(line))
85
+ .sort();
86
+ }
87
+ function normalizeSlashPath(value) {
88
+ return value.replace(/\\/g, '/');
89
+ }
90
+ const SAFE_TASK_KEY_PATTERN = /^[A-Za-z0-9][A-Za-z0-9-]*$/u;
91
+ function normalizeTaskKeyCandidate(value) {
92
+ if (typeof value !== 'string') {
93
+ return '';
94
+ }
95
+ const normalized = value.trim();
96
+ if (!normalized || !SAFE_TASK_KEY_PATTERN.test(normalized)) {
97
+ return '';
98
+ }
99
+ return normalized;
100
+ }
101
+ function extractTaskKeyFromPath(value) {
102
+ if (typeof value !== 'string') {
103
+ return '';
104
+ }
105
+ const normalized = normalizeSlashPath(value.trim());
106
+ if (!normalized) {
107
+ return '';
108
+ }
109
+ const patterns = [
110
+ /^tasks\/tasks-([A-Za-z0-9][A-Za-z0-9-]*)\.md$/u,
111
+ /^tasks\/specs\/([A-Za-z0-9][A-Za-z0-9-]*)\.md$/u,
112
+ /^\.agent\/task\/([A-Za-z0-9][A-Za-z0-9-]*)\.md$/u
113
+ ];
114
+ for (const pattern of patterns) {
115
+ const match = normalized.match(pattern);
116
+ if (match?.[1]) {
117
+ return match[1];
118
+ }
119
+ }
120
+ return '';
121
+ }
58
122
  export function normalizeTaskKey(item) {
59
123
  if (!item || typeof item !== 'object') {
60
124
  return null;
61
125
  }
62
126
  const id = typeof item.id === 'string' ? item.id.trim() : '';
63
127
  const slug = typeof item.slug === 'string' ? item.slug.trim() : '';
128
+ const taskPathCandidates = [
129
+ item?.paths?.task,
130
+ item?.relates_to,
131
+ item?.path,
132
+ item?.paths?.spec,
133
+ item?.paths?.agent_task
134
+ ];
135
+ const taskPathSlug = taskPathCandidates
136
+ .map((value) => extractTaskKeyFromPath(value))
137
+ .find((value) => value.length > 0) ?? '';
138
+ const datePrefixedIdMatch = id.match(/^\d{8}-([0-9]{4}-[A-Za-z0-9-]+)$/u);
139
+ const datePrefixedSlug = normalizeTaskKeyCandidate(datePrefixedIdMatch?.[1] ?? '');
64
140
  if (slug && id && slug.startsWith(`${id}-`)) {
65
- return slug;
141
+ return normalizeTaskKeyCandidate(slug) || null;
66
142
  }
67
143
  if (id && slug) {
68
- return `${id}-${slug}`;
144
+ return normalizeTaskKeyCandidate(`${id}-${slug}`) || null;
69
145
  }
70
146
  if (slug) {
71
- return slug;
147
+ return normalizeTaskKeyCandidate(slug) || null;
148
+ }
149
+ if (taskPathSlug) {
150
+ return taskPathSlug;
151
+ }
152
+ if (datePrefixedSlug) {
153
+ return datePrefixedSlug;
72
154
  }
73
155
  if (id) {
74
- return id;
156
+ return normalizeTaskKeyCandidate(id) || null;
75
157
  }
76
158
  return null;
77
159
  }