codex-orchestrator 0.1.30 → 0.1.35
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.
- package/CHANGELOG.md +65 -0
- package/README.md +152 -164
- package/dist/src/cli.js +68 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/codex/command-adapter.d.ts +2 -1
- package/dist/src/codex/command-adapter.d.ts.map +1 -1
- package/dist/src/codex/command-adapter.js +13 -2
- package/dist/src/codex/command-adapter.js.map +1 -1
- package/dist/src/codex/mobile-device-guard.d.ts +7 -0
- package/dist/src/codex/mobile-device-guard.d.ts.map +1 -0
- package/dist/src/codex/mobile-device-guard.js +63 -0
- package/dist/src/codex/mobile-device-guard.js.map +1 -0
- package/dist/src/config/constants.d.ts +1 -1
- package/dist/src/config/constants.d.ts.map +1 -1
- package/dist/src/config/constants.js +1 -0
- package/dist/src/config/constants.js.map +1 -1
- package/dist/src/config/schema.d.ts +16 -2
- package/dist/src/config/schema.d.ts.map +1 -1
- package/dist/src/config/schema.js +42 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/github/gh-pull-request-adapter.d.ts +1 -0
- package/dist/src/github/gh-pull-request-adapter.d.ts.map +1 -1
- package/dist/src/github/gh-pull-request-adapter.js +20 -0
- package/dist/src/github/gh-pull-request-adapter.js.map +1 -1
- package/dist/src/github/pull-requests.d.ts +2 -0
- package/dist/src/github/pull-requests.d.ts.map +1 -1
- package/dist/src/github/pull-requests.js +9 -0
- package/dist/src/github/pull-requests.js.map +1 -1
- package/dist/src/runner/acceptance-proof-runner.d.ts +54 -0
- package/dist/src/runner/acceptance-proof-runner.d.ts.map +1 -0
- package/dist/src/runner/acceptance-proof-runner.js +229 -0
- package/dist/src/runner/acceptance-proof-runner.js.map +1 -0
- package/dist/src/runner/acceptance-proof.d.ts +121 -0
- package/dist/src/runner/acceptance-proof.d.ts.map +1 -0
- package/dist/src/runner/acceptance-proof.js +405 -0
- package/dist/src/runner/acceptance-proof.js.map +1 -0
- package/dist/src/runner/android-visual-proof-command.d.ts +26 -0
- package/dist/src/runner/android-visual-proof-command.d.ts.map +1 -0
- package/dist/src/runner/android-visual-proof-command.js +598 -0
- package/dist/src/runner/android-visual-proof-command.js.map +1 -0
- package/dist/src/runner/command-utils.d.ts.map +1 -1
- package/dist/src/runner/command-utils.js +55 -6
- package/dist/src/runner/command-utils.js.map +1 -1
- package/dist/src/runner/completion-report.d.ts +3 -1
- package/dist/src/runner/completion-report.d.ts.map +1 -1
- package/dist/src/runner/completion-report.js +2 -1
- package/dist/src/runner/completion-report.js.map +1 -1
- package/dist/src/runner/daemon-command.d.ts +1 -0
- package/dist/src/runner/daemon-command.d.ts.map +1 -1
- package/dist/src/runner/daemon-command.js +139 -14
- package/dist/src/runner/daemon-command.js.map +1 -1
- package/dist/src/runner/doctor-command.js +3 -3
- package/dist/src/runner/doctor-command.js.map +1 -1
- package/dist/src/runner/durable-run-summary.d.ts +3 -0
- package/dist/src/runner/durable-run-summary.d.ts.map +1 -1
- package/dist/src/runner/durable-run-summary.js +2 -0
- package/dist/src/runner/durable-run-summary.js.map +1 -1
- package/dist/src/runner/handoff-evidence.d.ts +5 -0
- package/dist/src/runner/handoff-evidence.d.ts.map +1 -1
- package/dist/src/runner/handoff-evidence.js +22 -0
- package/dist/src/runner/handoff-evidence.js.map +1 -1
- package/dist/src/runner/ios-visual-proof-command.d.ts +25 -0
- package/dist/src/runner/ios-visual-proof-command.d.ts.map +1 -0
- package/dist/src/runner/ios-visual-proof-command.js +355 -0
- package/dist/src/runner/ios-visual-proof-command.js.map +1 -0
- package/dist/src/runner/lifecycle-events.d.ts +1 -1
- package/dist/src/runner/lifecycle-events.d.ts.map +1 -1
- package/dist/src/runner/local-execution-session.d.ts +20 -6
- package/dist/src/runner/local-execution-session.d.ts.map +1 -1
- package/dist/src/runner/local-execution-session.js +98 -11
- package/dist/src/runner/local-execution-session.js.map +1 -1
- package/dist/src/runner/local-state.d.ts +6 -0
- package/dist/src/runner/local-state.d.ts.map +1 -1
- package/dist/src/runner/local-state.js +14 -0
- package/dist/src/runner/local-state.js.map +1 -1
- package/dist/src/runner/mobile-device-lease.d.ts +11 -0
- package/dist/src/runner/mobile-device-lease.d.ts.map +1 -0
- package/dist/src/runner/mobile-device-lease.js +121 -0
- package/dist/src/runner/mobile-device-lease.js.map +1 -0
- package/dist/src/runner/mobile-visual-proof-command.d.ts +17 -0
- package/dist/src/runner/mobile-visual-proof-command.d.ts.map +1 -0
- package/dist/src/runner/mobile-visual-proof-command.js +168 -0
- package/dist/src/runner/mobile-visual-proof-command.js.map +1 -0
- package/dist/src/runner/plan-auto-command.d.ts.map +1 -1
- package/dist/src/runner/plan-auto-command.js +58 -7
- package/dist/src/runner/plan-auto-command.js.map +1 -1
- package/dist/src/runner/prompt.js +2 -2
- package/dist/src/runner/prompt.js.map +1 -1
- package/dist/src/runner/recovery.d.ts +2 -1
- package/dist/src/runner/recovery.d.ts.map +1 -1
- package/dist/src/runner/recovery.js +24 -0
- package/dist/src/runner/recovery.js.map +1 -1
- package/dist/src/runner/review-gate-policy.d.ts +7 -0
- package/dist/src/runner/review-gate-policy.d.ts.map +1 -1
- package/dist/src/runner/review-gate-policy.js +88 -22
- package/dist/src/runner/review-gate-policy.js.map +1 -1
- package/dist/src/runner/review-gates.d.ts.map +1 -1
- package/dist/src/runner/review-gates.js +44 -11
- package/dist/src/runner/review-gates.js.map +1 -1
- package/dist/src/runner/rework-policy.d.ts +1 -0
- package/dist/src/runner/rework-policy.d.ts.map +1 -1
- package/dist/src/runner/rework-policy.js +7 -0
- package/dist/src/runner/rework-policy.js.map +1 -1
- package/dist/src/runner/scoped-auto-command.d.ts +46 -1
- package/dist/src/runner/scoped-auto-command.d.ts.map +1 -1
- package/dist/src/runner/scoped-auto-command.js +148 -48
- package/dist/src/runner/scoped-auto-command.js.map +1 -1
- package/dist/src/runner/scoped-recovery.d.ts +65 -0
- package/dist/src/runner/scoped-recovery.d.ts.map +1 -0
- package/dist/src/runner/scoped-recovery.js +484 -0
- package/dist/src/runner/scoped-recovery.js.map +1 -0
- package/dist/src/runner/status-command.d.ts.map +1 -1
- package/dist/src/runner/status-command.js +1 -0
- package/dist/src/runner/status-command.js.map +1 -1
- package/dist/src/runner/visual-proof-runner.d.ts +1 -0
- package/dist/src/runner/visual-proof-runner.d.ts.map +1 -1
- package/dist/src/runner/visual-proof-runner.js +144 -16
- package/dist/src/runner/visual-proof-runner.js.map +1 -1
- package/dist/src/setup/project-config.d.ts +4 -0
- package/dist/src/setup/project-config.d.ts.map +1 -1
- package/dist/src/setup/project-config.js +142 -9
- package/dist/src/setup/project-config.js.map +1 -1
- package/dist/src/setup/setup-command.d.ts.map +1 -1
- package/dist/src/setup/setup-command.js +2 -2
- package/dist/src/setup/setup-command.js.map +1 -1
- package/dist/src/setup/workflows.d.ts.map +1 -1
- package/dist/src/setup/workflows.js +5 -0
- package/dist/src/setup/workflows.js.map +1 -1
- package/docs/deep-dive.md +230 -31
- package/package.json +1 -1
- package/prompts/workflows/acceptance-proof.md +25 -0
- package/prompts/workflows/issue-breakdown.md +7 -0
- package/prompts/workflows/scoped-implementation.md +6 -2
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { hasIssueClosureEvidence } from '../github/issues.js';
|
|
2
2
|
import { clearClarificationGate, hasMaintainerResponseAfterLatestClarification, } from './issue-state-machine.js';
|
|
3
|
+
import { classifyScopedRecoveryRun } from './scoped-recovery.js';
|
|
3
4
|
const recoveryReasons = {
|
|
4
5
|
active: 'GitHub still marks the issue running',
|
|
6
|
+
'unknown-or-foreign': 'local scoped run is not safely recoverable from available evidence',
|
|
7
|
+
'completed-pending-handoff': 'completed scoped run is pending runner-owned handoff',
|
|
8
|
+
'failed-pending-block': 'stale scoped run is pending runner-owned blocked recovery',
|
|
5
9
|
stale: 'local run exists but GitHub no longer marks it running',
|
|
6
10
|
missing: 'local run has no matching GitHub issue',
|
|
7
11
|
completed: 'GitHub marks the work completed',
|
|
@@ -17,6 +21,26 @@ export async function reconcileRunnerState(input) {
|
|
|
17
21
|
for (const run of state.runs) {
|
|
18
22
|
const issue = await input.issueAdapter.getIssue(run.issueNumber);
|
|
19
23
|
const status = classifyIssue(issue, input.config);
|
|
24
|
+
if (run.mode === 'scoped-issue' && status === 'active' && input.targetRoot) {
|
|
25
|
+
const scoped = await classifyScopedRecoveryRun({
|
|
26
|
+
targetRoot: input.targetRoot,
|
|
27
|
+
config: input.config,
|
|
28
|
+
run,
|
|
29
|
+
issue,
|
|
30
|
+
invocation: 'status',
|
|
31
|
+
now: input.now,
|
|
32
|
+
});
|
|
33
|
+
entries.push({
|
|
34
|
+
issueNumber: run.issueNumber,
|
|
35
|
+
mode: run.mode,
|
|
36
|
+
status: scoped.status,
|
|
37
|
+
reason: scoped.reason,
|
|
38
|
+
workspacePath: run.workspacePath,
|
|
39
|
+
sessionId: run.sessionId,
|
|
40
|
+
retryCount: run.retryCount,
|
|
41
|
+
});
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
20
44
|
if (status === 'clarification-resumable' && allowClarificationResume) {
|
|
21
45
|
await clearClarificationGate(input.issueAdapter, input.config, run.issueNumber, input.now);
|
|
22
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../../src/runner/recovery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,6CAA6C,GAE9C,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../../src/runner/recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,11 @@ export declare function shouldApplyVisualProofGate(input: {
|
|
|
8
8
|
issue: GitHubIssue;
|
|
9
9
|
changedFiles: string[];
|
|
10
10
|
}): boolean;
|
|
11
|
+
export declare function isVisualProofDesirable(input: {
|
|
12
|
+
config: CodexOrchestratorConfig;
|
|
13
|
+
issue: GitHubIssue;
|
|
14
|
+
changedFiles: string[];
|
|
15
|
+
}): boolean;
|
|
11
16
|
export declare function hasPassedValidation(validation: RunnerValidationLine[], patterns: string[]): boolean;
|
|
12
17
|
export declare function hasPassedTddValidation(validation: RunnerValidationLine[], patterns: string[]): boolean;
|
|
13
18
|
export declare function validationText(line: RunnerValidationLine): string;
|
|
@@ -20,5 +25,7 @@ export declare function runnerVisualProofPolicy(config: CodexOrchestratorConfig)
|
|
|
20
25
|
envPassthrough: string[];
|
|
21
26
|
timeoutMs?: number;
|
|
22
27
|
minScreenshotArtifacts: number;
|
|
28
|
+
requireWhenDesirable: boolean;
|
|
29
|
+
blockOnMissingProof: boolean;
|
|
23
30
|
};
|
|
24
31
|
//# sourceMappingURL=review-gate-policy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-gate-policy.d.ts","sourceRoot":"","sources":["../../../src/runner/review-gate-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"review-gate-policy.d.ts","sourceRoot":"","sources":["../../../src/runner/review-gate-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CA4C1G;AAuBD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,EAAE,CAerF;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,GAAG,OAAO,CAqBV;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,GAAG,OAAO,CAiBV;AAOD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,oBAAoB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAInG;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,oBAAoB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAgBtG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAEjE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAE5E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAE5E;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB,GAAG;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAsBA"}
|
|
@@ -1,30 +1,43 @@
|
|
|
1
1
|
import { globMatches } from '../path-policy.js';
|
|
2
|
+
import { uiEvidenceFailureDimensions } from './acceptance-proof.js';
|
|
2
3
|
export function buildVisualProofPromptLines(config, issueNumber) {
|
|
3
|
-
const
|
|
4
|
+
const acceptanceProof = config.reviewGates.acceptanceProof;
|
|
5
|
+
const policy = runnerVisualProofPolicy(config);
|
|
6
|
+
const command = policy.commandTemplate;
|
|
4
7
|
if (!command) {
|
|
5
8
|
return [
|
|
6
|
-
`For
|
|
9
|
+
`For acceptance proof, save proof artifacts under ${policy.artifactDir}/issue-${issueNumber}/ and include them as screenshot, ui-dump, log, smoke-output, or other artifacts.`,
|
|
10
|
+
'For visual/UI work, screenshots and UI dumps require a Proof Report uiEvidence contract with workflowScope, viewportCoverage, artifactFreshness, layoutReview, copyReview, and sourceInputs; screenshot existence alone is not enough proof.',
|
|
7
11
|
'For browser/web UI work, prefer a Playwright-based proof script when available; do not rely on in-session browser plugins for proof.',
|
|
8
12
|
...androidMobileProofPromptLines(),
|
|
9
13
|
...iosMobileProofPromptLines(),
|
|
10
|
-
'
|
|
14
|
+
'For non-visual acceptance criteria, prefer a live smoke proof that exercises observable product behavior and records the output as an artifact.',
|
|
15
|
+
'If acceptance proof is not possible in this environment, state that explicitly in skippedChecks along with the concrete reason (missing dependencies, missing credentials, dev server cannot start, etc.).',
|
|
11
16
|
];
|
|
12
17
|
}
|
|
13
|
-
const envNames =
|
|
18
|
+
const envNames = policy.envPassthrough;
|
|
14
19
|
const loginEnvLine = envNames.length > 0
|
|
15
|
-
? `The runner
|
|
16
|
-
: 'If authentication is required, make the
|
|
20
|
+
? `The runner acceptance proof command will receive these project environment variables when they exist: ${envNames.join(', ')}. Use them for login if authentication is required; never hardcode credentials.`
|
|
21
|
+
: 'If authentication is required, make the acceptance proof script read credentials from environment variables configured in reviewGates.acceptanceProof.envPassthrough; never hardcode credentials.';
|
|
17
22
|
return [
|
|
18
|
-
`For
|
|
19
|
-
`After your run, the runner will execute this visual proof command outside the child Codex sandbox: ${command}.`,
|
|
23
|
+
`For acceptance proof, prepare proof artifacts under ${policy.artifactDir}/issue-${issueNumber}/ and include them as screenshot, ui-dump, log, smoke-output, or other artifacts when you create them.`,
|
|
24
|
+
`After your run, the runner will execute this visual proof command outside the child Codex sandbox as the configured acceptance proof command: ${command}.`,
|
|
20
25
|
'Prepare any project files this command needs, but do not execute this runner-owned command yourself or start long-lived browser/dev-server proof loops from child Codex.',
|
|
26
|
+
`Proof script repair is allowed only in these proof-owned paths: ${acceptanceProof.proofOwnedPathGlobs.join(', ')}.`,
|
|
27
|
+
'Product-code changes made during the proof phase are blockers; route missing behavior back through implementation instead.',
|
|
28
|
+
'Every required acceptance criterion must map to high-confidence artifact evidence before Draft PR Handoff.',
|
|
29
|
+
'For visual/UI work, screenshots and UI dumps require a Proof Report uiEvidence contract with workflowScope, viewportCoverage, artifactFreshness, layoutReview, copyReview, and sourceInputs.',
|
|
30
|
+
`UI Evidence failure dimensions are runner-owned and stable: ${uiEvidenceFailureDimensions.join(', ')}.`,
|
|
31
|
+
'For web layout proof, include wide desktop viewport coverage; include mobile coverage only when the issue or acceptance criteria call for mobile or responsive behavior.',
|
|
32
|
+
'Prefer real UI login when configured credentials exist; session or cookie seeding must be explained in uiEvidence.authShortcutReason.',
|
|
21
33
|
'For browser/web UI work, prefer Playwright-based screenshot proof via the runner-owned command; do not rely on in-session browser plugins for proof.',
|
|
22
34
|
...androidMobileProofPromptLines(),
|
|
23
35
|
...iosMobileProofPromptLines(),
|
|
24
36
|
'When this runner-owned proof command can validate the visual behavior, treat it as the primary visual proof path.',
|
|
25
37
|
'Do not report browser tool unavailability as a skipped check or residual risk when the runner-owned proof command is prepared.',
|
|
26
38
|
'For UI layout fixes, a focused visual proof script with concrete assertions can be the TDD evidence when regular unit tests cannot observe the layout.',
|
|
27
|
-
'
|
|
39
|
+
'For non-visual acceptance criteria, prefer a live smoke proof that exercises observable product behavior and records the output as an artifact.',
|
|
40
|
+
'Do not claim the runner-owned visual proof passed or acceptance proof passed; the runner will append the passed/failed result after your run.',
|
|
28
41
|
'The runner will expose CODEX_ORCHESTRATOR_PLAYWRIGHT_PROFILE_DIR for proof scripts that need a stable Playwright user data directory.',
|
|
29
42
|
loginEnvLine,
|
|
30
43
|
'If required login environment variables are missing, the visual proof script must fail with a short clear error.',
|
|
@@ -32,10 +45,10 @@ export function buildVisualProofPromptLines(config, issueNumber) {
|
|
|
32
45
|
}
|
|
33
46
|
function androidMobileProofPromptLines() {
|
|
34
47
|
return [
|
|
35
|
-
'For Android mobile app UI work, use device-backed proof instead of browser automation
|
|
36
|
-
'If
|
|
48
|
+
'For Android mobile app UI work, use runner-owned device-backed proof instead of browser automation. Do not start Android emulators from child Codex; the runner-owned mobile proof command serializes shared adb/emulator access.',
|
|
49
|
+
'If a specific connected Android target is required, document the desired `ANDROID_SERIAL` value or project environment requirement, but leave device selection and emulator startup to the runner-owned proof command.',
|
|
37
50
|
'If Test Android Apps skills are unavailable, try to enable or load that plugin through the available Codex plugin/tool discovery mechanism before falling back.',
|
|
38
|
-
'
|
|
51
|
+
'When a target is already selected by the runner or provided through the environment, use Test Android Apps skills for app launch, navigation, screenshots, logs, and performance evidence.',
|
|
39
52
|
'For native Android projects, use the project Gradle wrapper (`./gradlew`) with a writable `GRADLE_USER_HOME`, build the relevant debug APK, then install and launch it through adb on the selected target.',
|
|
40
53
|
'For Flutter Android projects only, start Flutter rebuild/install with the detected Flutter SDK and writable `PUB_CACHE` and `GRADLE_USER_HOME` directories. If rebuild/install fails because the SDK cache is read-only, retry only when `CODEX_ORCHESTRATOR_FLUTTER_ROOT` points to a preconfigured writable Flutter SDK: set `FLUTTER_ROOT` to that path, prepend `$FLUTTER_ROOT/bin` to `PATH`, run `flutter precache --android`, then rebuild/install again. If no writable Flutter SDK is configured, report the concrete SDK cache permission error.',
|
|
41
54
|
'Do not use Playwright as the primary proof path for Android mobile app verification.',
|
|
@@ -65,14 +78,40 @@ export function buildQualityGatePromptLines(config) {
|
|
|
65
78
|
];
|
|
66
79
|
}
|
|
67
80
|
export function shouldApplyVisualProofGate(input) {
|
|
81
|
+
const acceptanceProof = input.config.reviewGates.acceptanceProof;
|
|
82
|
+
if (!acceptanceProof.enabled) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const policy = runnerVisualProofPolicy(input.config);
|
|
86
|
+
if (!policy.commandTemplate) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
const issueText = `${input.issue.title}\n${input.issue.body}`;
|
|
90
|
+
const acceptanceCommand = acceptanceProof.runnerValidationCommand?.trim();
|
|
91
|
+
const canRunGenericAcceptanceProof = Boolean(acceptanceCommand) && !isMobileVisualProofCommand(acceptanceCommand);
|
|
92
|
+
const issueNeedsAcceptanceProof = canRunGenericAcceptanceProof
|
|
93
|
+
&& acceptanceProof.issueTextPatterns.some((pattern) => regexMatches(pattern, issueText));
|
|
94
|
+
const changedAcceptanceProofFiles = canRunGenericAcceptanceProof
|
|
95
|
+
&& input.changedFiles.some((path) => acceptanceProof.changedPathGlobs.some((pattern) => globMatches(pattern, path)));
|
|
96
|
+
return issueNeedsAcceptanceProof || changedAcceptanceProofFiles || isVisualProofDesirable(input);
|
|
97
|
+
}
|
|
98
|
+
export function isVisualProofDesirable(input) {
|
|
68
99
|
const visualProof = input.config.reviewGates.visualProof;
|
|
69
100
|
if (!visualProof.enabled) {
|
|
70
101
|
return false;
|
|
71
102
|
}
|
|
72
103
|
const issueText = `${input.issue.title}\n${input.issue.body}`;
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
104
|
+
const internalRunnerProofOnlyChange = input.changedFiles.length > 0
|
|
105
|
+
&& input.changedFiles.every(isInternalRunnerProofPath);
|
|
106
|
+
const issueNeedsVisualProof = visualProof.enabled
|
|
107
|
+
&& !internalRunnerProofOnlyChange
|
|
108
|
+
&& visualProof.issueTextPatterns.some((pattern) => regexMatches(pattern, issueText));
|
|
109
|
+
const changedProofFiles = input.changedFiles.filter((path) => visualProof.changedPathGlobs.some((pattern) => globMatches(pattern, path)));
|
|
110
|
+
return issueNeedsVisualProof || changedProofFiles.length > 0;
|
|
111
|
+
}
|
|
112
|
+
function isInternalRunnerProofPath(path) {
|
|
113
|
+
return /^src\/runner\/(?:acceptance-proof|visual-proof-runner)\.ts$/u.test(path)
|
|
114
|
+
|| /^test\/(?:acceptance-proof|visual-proof-runner)\.test\.ts$/u.test(path);
|
|
76
115
|
}
|
|
77
116
|
export function hasPassedValidation(validation, patterns) {
|
|
78
117
|
return validation.some((line) => line.status === 'passed' && patterns.some((pattern) => regexMatches(pattern, validationText(line))));
|
|
@@ -98,27 +137,54 @@ export function isStrongVisualValidation(line) {
|
|
|
98
137
|
return /(Playwright|screenshot|viewport)/iu.test(validationText(line));
|
|
99
138
|
}
|
|
100
139
|
export function isRunnerVisualValidation(line) {
|
|
101
|
-
return /runner visual proof/iu.test(validationText(line));
|
|
140
|
+
return /runner (?:visual|acceptance) proof/iu.test(validationText(line));
|
|
102
141
|
}
|
|
103
142
|
export function regexMatches(pattern, text) {
|
|
104
143
|
return new RegExp(pattern, 'iu').test(text);
|
|
105
144
|
}
|
|
106
145
|
export function runnerVisualProofPolicy(config) {
|
|
107
146
|
const visualProof = config.reviewGates.visualProof;
|
|
147
|
+
const acceptanceProof = config.reviewGates.acceptanceProof;
|
|
148
|
+
const preferLegacyVisual = isLegacyVisualProofOverride(acceptanceProof, visualProof);
|
|
149
|
+
const commandTemplate = preferLegacyVisual
|
|
150
|
+
? visualProof.runnerValidationCommand?.trim()
|
|
151
|
+
: acceptanceProof.runnerValidationCommand?.trim() || visualProof.runnerValidationCommand?.trim();
|
|
108
152
|
return {
|
|
109
|
-
commandTemplate:
|
|
110
|
-
artifactDir: visualProof.artifactDir,
|
|
111
|
-
envPassthrough:
|
|
112
|
-
|
|
153
|
+
commandTemplate: commandTemplate || undefined,
|
|
154
|
+
artifactDir: preferLegacyVisual ? visualProof.artifactDir : acceptanceProof.artifactDir,
|
|
155
|
+
envPassthrough: preferLegacyVisual
|
|
156
|
+
? visualProof.envPassthrough ?? acceptanceProof.envPassthrough ?? []
|
|
157
|
+
: acceptanceProof.envPassthrough?.length
|
|
158
|
+
? acceptanceProof.envPassthrough
|
|
159
|
+
: visualProof.envPassthrough ?? [],
|
|
160
|
+
timeoutMs: preferLegacyVisual
|
|
161
|
+
? visualProof.runnerTimeoutMs ?? acceptanceProof.runnerTimeoutMs
|
|
162
|
+
: acceptanceProof.runnerTimeoutMs ?? visualProof.runnerTimeoutMs,
|
|
113
163
|
minScreenshotArtifacts: visualProof.minScreenshotArtifacts,
|
|
164
|
+
requireWhenDesirable: visualProof.requireWhenDesirable ?? false,
|
|
165
|
+
blockOnMissingProof: !preferLegacyVisual,
|
|
114
166
|
};
|
|
115
167
|
}
|
|
168
|
+
function isLegacyVisualProofOverride(acceptanceProof, visualProof) {
|
|
169
|
+
const defaultMobileCommand = 'codex-orchestrator visual-proof mobile --issue ${issueNumber}';
|
|
170
|
+
return (acceptanceProof.runnerValidationCommand?.trim() || '') === defaultMobileCommand
|
|
171
|
+
&& Boolean(visualProof.runnerValidationCommand?.trim())
|
|
172
|
+
&& visualProof.runnerValidationCommand?.trim() !== defaultMobileCommand;
|
|
173
|
+
}
|
|
174
|
+
function isMobileVisualProofCommand(command) {
|
|
175
|
+
return /\bcodex-orchestrator\s+visual-proof\s+(?:mobile|android|ios)\b/iu.test(command ?? '');
|
|
176
|
+
}
|
|
116
177
|
function hasTddRedEvidence(text) {
|
|
117
|
-
return /\bred\s*:/iu.test(text)
|
|
178
|
+
return /\bred\s*:/iu.test(text)
|
|
179
|
+
|| /\bred\b[\s\S]{0,160}\bfail(?:ed|ing)?\b/iu.test(text)
|
|
180
|
+
|| /\bfail(?:ed|ing)?\b[\s\S]{0,160}\bred\b/iu.test(text)
|
|
181
|
+
|| /\b(?:test|tests|spec|specs|check|checks)\b[\s\S]{0,120}\bfail(?:ed|ing)?\b/iu.test(text);
|
|
118
182
|
}
|
|
119
183
|
function hasTddGreenEvidence(text) {
|
|
120
184
|
return /\bgreen\s*:/iu.test(text)
|
|
121
|
-
|| /\
|
|
185
|
+
|| /\bgreen\b[\s\S]{0,160}\bpass(?:ed|ing)?\b/iu.test(text)
|
|
186
|
+
|| /\bpass(?:ed|ing)?\b[\s\S]{0,160}\bgreen\b/iu.test(text)
|
|
187
|
+
|| /\b(?:test|tests|spec|specs|check|checks|jest|vitest|playwright|pytest)\b[\s\S]{0,120}\bpass(?:ed|ing)?\b/iu.test(text)
|
|
122
188
|
|| /\b(?:flutter|dart|npm|pnpm|yarn)\s+(?:run\s+)?test\b[\s\S]{0,120}\bpass(?:ed|ing)?\b/iu.test(text);
|
|
123
189
|
}
|
|
124
190
|
function hasMissingTddProofText(text) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-gate-policy.js","sourceRoot":"","sources":["../../../src/runner/review-gate-policy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"review-gate-policy.js","sourceRoot":"","sources":["../../../src/runner/review-gate-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-gates.d.ts","sourceRoot":"","sources":["../../../src/runner/review-gates.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAMvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"review-gates.d.ts","sourceRoot":"","sources":["../../../src/runner/review-gates.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAMvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAalE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CA8E5E"}
|
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { acceptsScreenshotArtifactPath, classifyChangedPaths, isRunnerVisualProofCodeArtifactPath, } from '../path-policy.js';
|
|
4
|
-
import { hasPassedTddValidation, hasPassedValidation, isRunnerVisualValidation, isStrongVisualValidation, shouldApplyVisualProofGate, } from './review-gate-policy.js';
|
|
4
|
+
import { hasPassedTddValidation, hasPassedValidation, isVisualProofDesirable, isRunnerVisualValidation, isStrongVisualValidation, runnerVisualProofPolicy, shouldApplyVisualProofGate, } from './review-gate-policy.js';
|
|
5
5
|
export { shouldApplyVisualProofGate } from './review-gate-policy.js';
|
|
6
6
|
export function evaluateReviewGates(input) {
|
|
7
7
|
const reasons = [];
|
|
8
8
|
const warnings = [];
|
|
9
9
|
reasons.push(...evaluateQualityGate(input));
|
|
10
|
-
|
|
10
|
+
const visualProofDesirable = isVisualProofDesirable(input);
|
|
11
|
+
const visualProofGateApplies = shouldApplyVisualProofGate(input);
|
|
12
|
+
if (!visualProofDesirable && !visualProofGateApplies) {
|
|
11
13
|
return { ok: reasons.length === 0, reasons, warnings };
|
|
12
14
|
}
|
|
13
15
|
const visualProof = input.config.reviewGates.visualProof;
|
|
14
|
-
const
|
|
16
|
+
const runnerPolicy = runnerVisualProofPolicy(input.config);
|
|
17
|
+
const runnerCommand = runnerPolicy.commandTemplate ?? '';
|
|
15
18
|
const runnerVisualValidation = input.validation.filter(isRunnerVisualValidation);
|
|
16
19
|
const hasPassedRunnerVisualValidation = runnerVisualValidation.some((line) => line.status === 'passed' && isStrongVisualValidation(line));
|
|
17
20
|
const nonPassingRunnerVisualValidation = runnerVisualValidation.filter((line) => line.status !== 'passed');
|
|
21
|
+
const capabilityUnavailableRunnerValidation = nonPassingRunnerVisualValidation.filter(isVisualProofCapabilityUnavailable);
|
|
22
|
+
const otherNonPassingRunnerVisualValidation = nonPassingRunnerVisualValidation.filter((line) => !capabilityUnavailableRunnerValidation.includes(line));
|
|
18
23
|
const screenshotArtifacts = input.report.artifacts.filter((artifact) => {
|
|
19
24
|
if (artifact.type !== 'screenshot') {
|
|
20
25
|
return false;
|
|
@@ -28,23 +33,51 @@ export function evaluateReviewGates(input) {
|
|
|
28
33
|
const worktreePath = input.worktreePath;
|
|
29
34
|
return acceptsScreenshotArtifactPath({
|
|
30
35
|
artifactPath: artifact.path,
|
|
31
|
-
artifactDir:
|
|
36
|
+
artifactDir: runnerPolicy.artifactDir,
|
|
32
37
|
changedFiles: input.changedFiles,
|
|
33
38
|
hasPassedRunnerVisualValidation,
|
|
34
39
|
exists: worktreePath ? (path) => existsSync(join(worktreePath, path)) : undefined,
|
|
35
40
|
});
|
|
36
41
|
});
|
|
37
|
-
|
|
38
|
-
|
|
42
|
+
const proofPossible = Boolean(runnerCommand) && capabilityUnavailableRunnerValidation.length === 0;
|
|
43
|
+
const strictVisualProofRequired = visualProofDesirable && runnerPolicy.requireWhenDesirable;
|
|
44
|
+
if (!runnerCommand && visualProofDesirable) {
|
|
45
|
+
const message = strictVisualProofRequired
|
|
46
|
+
? 'Visual proof is required by strict visual proof config, but no runner-owned visual proof command/provider is configured.'
|
|
47
|
+
: 'Visual proof capability note: visual proof is desirable, but no runner-owned visual proof command/provider is configured; not required for review-ready outcome.';
|
|
48
|
+
(strictVisualProofRequired ? reasons : warnings).push(message);
|
|
49
|
+
}
|
|
50
|
+
for (const line of capabilityUnavailableRunnerValidation) {
|
|
51
|
+
if (strictVisualProofRequired) {
|
|
52
|
+
reasons.push(`Visual proof is required by strict visual proof config, but proof capability is unavailable: ${line.command} - ${line.summary}.`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
warnings.push(`Visual proof capability note: ${line.command} - ${line.summary}; not required for review-ready outcome.`);
|
|
56
|
+
}
|
|
39
57
|
}
|
|
40
|
-
for (const line of
|
|
41
|
-
|
|
58
|
+
for (const line of otherNonPassingRunnerVisualValidation) {
|
|
59
|
+
const message = strictVisualProofRequired
|
|
60
|
+
? `Visual proof validation failed under strict visual proof config: ${line.command} - ${line.summary}`
|
|
61
|
+
: `Visual proof validation warning: ${line.command} - ${line.summary}`;
|
|
62
|
+
(strictVisualProofRequired ? reasons : warnings).push(message);
|
|
42
63
|
}
|
|
43
|
-
if (
|
|
44
|
-
|
|
64
|
+
if (visualProofDesirable
|
|
65
|
+
&& (proofPossible || runnerPolicy.requireWhenDesirable)
|
|
66
|
+
&& screenshotArtifacts.length < visualProof.minScreenshotArtifacts) {
|
|
67
|
+
const message = strictVisualProofRequired
|
|
68
|
+
? `Visual proof is required by strict visual proof config, but expected at least ${visualProof.minScreenshotArtifacts} screenshot artifact under ${runnerPolicy.artifactDir} or a screenshot URL.`
|
|
69
|
+
: `Visual proof warning: expected at least ${visualProof.minScreenshotArtifacts} screenshot artifact under ${runnerPolicy.artifactDir} or a screenshot URL.`;
|
|
70
|
+
(strictVisualProofRequired ? reasons : warnings).push(message);
|
|
45
71
|
}
|
|
46
72
|
return { ok: reasons.length === 0, reasons, warnings };
|
|
47
73
|
}
|
|
74
|
+
function isVisualProofCapabilityUnavailable(line) {
|
|
75
|
+
if (line.status !== 'skipped') {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
return /(?:no runner-owned|not configured|no .*provider|unavailable|not available|not installed|not found|missing tool|no devices? connected|no usable .*device|adb|emulator|xcodebuild|simctl|flutter .*requires flutter|flutter was not found)/iu
|
|
79
|
+
.test(line.summary);
|
|
80
|
+
}
|
|
48
81
|
function evaluateQualityGate(input) {
|
|
49
82
|
const quality = input.config.reviewGates.quality;
|
|
50
83
|
if (!quality.enabled) {
|
|
@@ -93,7 +126,7 @@ function hasPassedRunnerVisualProofEvidence(input) {
|
|
|
93
126
|
return false;
|
|
94
127
|
}
|
|
95
128
|
return input.changedFiles.some((file) => {
|
|
96
|
-
return isRunnerVisualProofCodeArtifactPath(file, input.config.
|
|
129
|
+
return isRunnerVisualProofCodeArtifactPath(file, runnerVisualProofPolicy(input.config).artifactDir);
|
|
97
130
|
});
|
|
98
131
|
}
|
|
99
132
|
//# sourceMappingURL=review-gates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-gates.js","sourceRoot":"","sources":["../../../src/runner/review-gates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,mCAAmC,GACpC,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EAExB,0BAA0B,GAE3B,MAAM,yBAAyB,CAAC;AAkBjC,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,UAAU,mBAAmB,CAAC,KAAsB;IACxD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IAE5C,
|
|
1
|
+
{"version":3,"file":"review-gates.js","sourceRoot":"","sources":["../../../src/runner/review-gates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import type { CodexOrchestratorConfig } from '../config/schema.js';
|
|
2
2
|
export declare function shouldRequestImplementationRework(reasons: string[], config: CodexOrchestratorConfig): boolean;
|
|
3
|
+
export declare function maxReworkAttemptsForReasons(reasons: string[], config: CodexOrchestratorConfig): number;
|
|
3
4
|
//# sourceMappingURL=rework-policy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rework-policy.d.ts","sourceRoot":"","sources":["../../../src/runner/rework-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"rework-policy.d.ts","sourceRoot":"","sources":["../../../src/runner/rework-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAiBnE,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAS7G;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,uBAAuB,GAAG,MAAM,CAKtG"}
|
|
@@ -6,6 +6,7 @@ const nonRetryableBlockerPatterns = [
|
|
|
6
6
|
const retryableBlockerPatterns = [
|
|
7
7
|
['missing-quality-gate-evidence', /Quality gate requires/iu],
|
|
8
8
|
['failed-configured-checks', /One or more configured checks failed/iu],
|
|
9
|
+
['failed-acceptance-proof', /Acceptance proof/iu],
|
|
9
10
|
['invalid-completion-report', /Invalid scoped completion report/iu],
|
|
10
11
|
['missing-completion-report', /Codex did not write CODEX_ORCHESTRATOR_REPORT_FILE/iu],
|
|
11
12
|
['no-changed-files', /Codex completed without file changes/iu],
|
|
@@ -17,4 +18,10 @@ export function shouldRequestImplementationRework(reasons, config) {
|
|
|
17
18
|
const retryable = new Set(config.loopPolicy.rework.retryableBlockers);
|
|
18
19
|
return reasons.some((reason) => retryableBlockerPatterns.some(([blocker, pattern]) => retryable.has(blocker) && pattern.test(reason)));
|
|
19
20
|
}
|
|
21
|
+
export function maxReworkAttemptsForReasons(reasons, config) {
|
|
22
|
+
if (reasons.some((reason) => /Acceptance proof/iu.test(reason))) {
|
|
23
|
+
return Math.max(0, config.reviewGates.acceptanceProof.maxIterations - 1);
|
|
24
|
+
}
|
|
25
|
+
return config.loopPolicy.rework.maxAttempts;
|
|
26
|
+
}
|
|
20
27
|
//# sourceMappingURL=rework-policy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rework-policy.js","sourceRoot":"","sources":["../../../src/runner/rework-policy.ts"],"names":[],"mappings":"AAEA,MAAM,2BAA2B,GAAG;IAClC,0BAA0B;IAC1B,yCAAyC;IACzC,wDAAwD;CAChD,CAAC;AAEX,MAAM,wBAAwB,GAAG;IAC/B,CAAC,+BAA+B,EAAE,yBAAyB,CAAC;IAC5D,CAAC,0BAA0B,EAAE,wCAAwC,CAAC;IACtE,CAAC,2BAA2B,EAAE,oCAAoC,CAAC;IACnE,CAAC,2BAA2B,EAAE,sDAAsD,CAAC;IACrF,CAAC,kBAAkB,EAAE,wCAAwC,CAAC;CACtD,CAAC;AAEX,MAAM,UAAU,iCAAiC,CAAC,OAAiB,EAAE,MAA+B;IAClG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACtE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAC3D,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CACvE,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"rework-policy.js","sourceRoot":"","sources":["../../../src/runner/rework-policy.ts"],"names":[],"mappings":"AAEA,MAAM,2BAA2B,GAAG;IAClC,0BAA0B;IAC1B,yCAAyC;IACzC,wDAAwD;CAChD,CAAC;AAEX,MAAM,wBAAwB,GAAG;IAC/B,CAAC,+BAA+B,EAAE,yBAAyB,CAAC;IAC5D,CAAC,0BAA0B,EAAE,wCAAwC,CAAC;IACtE,CAAC,yBAAyB,EAAE,oBAAoB,CAAC;IACjD,CAAC,2BAA2B,EAAE,oCAAoC,CAAC;IACnE,CAAC,2BAA2B,EAAE,sDAAsD,CAAC;IACrF,CAAC,kBAAkB,EAAE,wCAAwC,CAAC;CACtD,CAAC;AAEX,MAAM,UAAU,iCAAiC,CAAC,OAAiB,EAAE,MAA+B;IAClG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACtE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAC3D,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CACvE,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAAiB,EAAE,MAA+B;IAC5F,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC;AAC9C,CAAC"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { type CodexCommandRunInput, type CodexCommandRunResult } from '../codex/command-adapter.js';
|
|
2
|
+
import type { CodexOrchestratorConfig } from '../config/schema.js';
|
|
2
3
|
import type { GitHubIssueAdapter } from '../github/issues.js';
|
|
3
4
|
import type { GitHubPullRequest, GitHubPullRequestAdapter } from '../github/pull-requests.js';
|
|
4
5
|
import { GitWorktreeManager } from '../git/worktree.js';
|
|
5
6
|
import { type ShellCommandExecutor } from '../process/command.js';
|
|
6
|
-
import { type
|
|
7
|
+
import { type FreshContextReviewEvidence } from './handoff-evidence.js';
|
|
8
|
+
import { writeDurableRunSummary } from './durable-run-summary.js';
|
|
9
|
+
import { type ImplementationPublishabilityResult, type LocalExecutionPhaseExecutor } from './local-execution-session.js';
|
|
10
|
+
import type { AcceptanceProofAttemptEvidence } from './acceptance-proof-runner.js';
|
|
7
11
|
export interface ScopedAutoCommandOptions {
|
|
8
12
|
targetRoot: string;
|
|
9
13
|
issueNumber: number;
|
|
@@ -30,4 +34,45 @@ export interface ScopedAutoCommandResult {
|
|
|
30
34
|
reportComment: string;
|
|
31
35
|
}
|
|
32
36
|
export declare function runScopedAutoCommand(options: ScopedAutoCommandOptions): Promise<ScopedAutoCommandResult>;
|
|
37
|
+
export interface FinishScopedReviewReadyHandoffInput {
|
|
38
|
+
issueNumber: number;
|
|
39
|
+
branchName: string;
|
|
40
|
+
baseBranch: string;
|
|
41
|
+
worktreePath: string;
|
|
42
|
+
logPath: string;
|
|
43
|
+
config: CodexOrchestratorConfig;
|
|
44
|
+
git: Pick<GitWorktreeManager, 'pushBranch'>;
|
|
45
|
+
pullRequestAdapter: GitHubPullRequestAdapter;
|
|
46
|
+
issueAdapter: GitHubIssueAdapter;
|
|
47
|
+
publishability: Extract<ImplementationPublishabilityResult, {
|
|
48
|
+
status: 'publish-ready';
|
|
49
|
+
}>;
|
|
50
|
+
freshContextReview?: FreshContextReviewEvidence;
|
|
51
|
+
durableRunSummary?: Awaited<ReturnType<typeof writeDurableRunSummary>>;
|
|
52
|
+
acceptanceProof?: AcceptanceProofAttemptEvidence;
|
|
53
|
+
onPullRequestReady?: (pullRequest: GitHubPullRequest) => void;
|
|
54
|
+
}
|
|
55
|
+
export declare function finishScopedReviewReadyHandoff(input: FinishScopedReviewReadyHandoffInput): Promise<{
|
|
56
|
+
pullRequest: GitHubPullRequest;
|
|
57
|
+
reportComment: string;
|
|
58
|
+
}>;
|
|
59
|
+
export interface FinishScopedBlockedHandoffInput {
|
|
60
|
+
issueNumber: number;
|
|
61
|
+
logPath: string;
|
|
62
|
+
issueAdapter: GitHubIssueAdapter;
|
|
63
|
+
config: CodexOrchestratorConfig;
|
|
64
|
+
reasons: string[];
|
|
65
|
+
changedFiles: string[];
|
|
66
|
+
skippedChecks: string[];
|
|
67
|
+
residualRisks: string[];
|
|
68
|
+
freshContextReview?: FreshContextReviewEvidence;
|
|
69
|
+
durableRunSummary?: Awaited<ReturnType<typeof writeDurableRunSummary>>;
|
|
70
|
+
acceptanceProof?: AcceptanceProofAttemptEvidence;
|
|
71
|
+
commentPrefix?: string;
|
|
72
|
+
skipCommentIfIncludes?: string;
|
|
73
|
+
}
|
|
74
|
+
export declare function finishScopedBlockedHandoff(input: FinishScopedBlockedHandoffInput): Promise<{
|
|
75
|
+
reportComment: string;
|
|
76
|
+
postedComment: boolean;
|
|
77
|
+
}>;
|
|
33
78
|
//# sourceMappingURL=scoped-auto-command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoped-auto-command.d.ts","sourceRoot":"","sources":["../../../src/runner/scoped-auto-command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scoped-auto-command.d.ts","sourceRoot":"","sources":["../../../src/runner/scoped-auto-command.ts"],"names":[],"mappings":"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"}
|