oxe-cc 1.2.1 → 1.3.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.
- package/.cursor/commands/oxe-ask.md +2 -2
- package/.cursor/commands/oxe-capabilities.md +2 -2
- package/.cursor/commands/oxe-checkpoint.md +2 -2
- package/.cursor/commands/oxe-compact.md +2 -2
- package/.cursor/commands/oxe-dashboard.md +2 -2
- package/.cursor/commands/oxe-debug.md +2 -2
- package/.cursor/commands/oxe-discuss.md +2 -2
- package/.cursor/commands/oxe-execute.md +5 -2
- package/.cursor/commands/oxe-forensics.md +2 -2
- package/.cursor/commands/oxe-help.md +2 -2
- package/.cursor/commands/oxe-loop.md +2 -2
- package/.cursor/commands/oxe-milestone.md +2 -2
- package/.cursor/commands/oxe-next.md +2 -2
- package/.cursor/commands/oxe-obs.md +2 -2
- package/.cursor/commands/oxe-plan-agent.md +2 -2
- package/.cursor/commands/oxe-plan.md +2 -2
- package/.cursor/commands/oxe-project.md +2 -2
- package/.cursor/commands/oxe-quick.md +2 -2
- package/.cursor/commands/oxe-research.md +2 -2
- package/.cursor/commands/oxe-retro.md +2 -2
- package/.cursor/commands/oxe-review-pr.md +2 -2
- package/.cursor/commands/oxe-route.md +2 -2
- package/.cursor/commands/oxe-scan.md +2 -2
- package/.cursor/commands/oxe-security.md +2 -2
- package/.cursor/commands/oxe-session.md +2 -2
- package/.cursor/commands/oxe-ship.md +2 -2
- package/.cursor/commands/oxe-skill.md +2 -2
- package/.cursor/commands/oxe-spec.md +2 -2
- package/.cursor/commands/oxe-ui-review.md +2 -2
- package/.cursor/commands/oxe-ui-spec.md +2 -2
- package/.cursor/commands/oxe-update.md +2 -2
- package/.cursor/commands/oxe-validate-gaps.md +2 -2
- package/.cursor/commands/oxe-verify.md +5 -2
- package/.cursor/commands/oxe-workstream.md +2 -2
- package/.cursor/commands/oxe.md +2 -2
- package/.github/copilot-instructions.md +13 -13
- package/.github/prompts/oxe-ask.prompt.md +2 -2
- package/.github/prompts/oxe-capabilities.prompt.md +2 -2
- package/.github/prompts/oxe-checkpoint.prompt.md +2 -2
- package/.github/prompts/oxe-compact.prompt.md +2 -2
- package/.github/prompts/oxe-dashboard.prompt.md +2 -2
- package/.github/prompts/oxe-debug.prompt.md +2 -2
- package/.github/prompts/oxe-discuss.prompt.md +2 -2
- package/.github/prompts/oxe-execute.prompt.md +5 -2
- package/.github/prompts/oxe-forensics.prompt.md +2 -2
- package/.github/prompts/oxe-help.prompt.md +2 -2
- package/.github/prompts/oxe-loop.prompt.md +2 -2
- package/.github/prompts/oxe-milestone.prompt.md +2 -2
- package/.github/prompts/oxe-next.prompt.md +2 -2
- package/.github/prompts/oxe-obs.prompt.md +2 -2
- package/.github/prompts/oxe-plan-agent.prompt.md +2 -2
- package/.github/prompts/oxe-plan.prompt.md +2 -2
- package/.github/prompts/oxe-project.prompt.md +2 -2
- package/.github/prompts/oxe-quick.prompt.md +2 -2
- package/.github/prompts/oxe-research.prompt.md +2 -2
- package/.github/prompts/oxe-retro.prompt.md +2 -2
- package/.github/prompts/oxe-review-pr.prompt.md +2 -2
- package/.github/prompts/oxe-route.prompt.md +2 -2
- package/.github/prompts/oxe-scan.prompt.md +2 -2
- package/.github/prompts/oxe-security.prompt.md +2 -2
- package/.github/prompts/oxe-session.prompt.md +2 -2
- package/.github/prompts/oxe-ship.prompt.md +2 -2
- package/.github/prompts/oxe-skill.prompt.md +2 -2
- package/.github/prompts/oxe-spec.prompt.md +2 -2
- package/.github/prompts/oxe-ui-review.prompt.md +2 -2
- package/.github/prompts/oxe-ui-spec.prompt.md +2 -2
- package/.github/prompts/oxe-update.prompt.md +2 -2
- package/.github/prompts/oxe-validate-gaps.prompt.md +2 -2
- package/.github/prompts/oxe-verify.prompt.md +5 -2
- package/.github/prompts/oxe-workstream.prompt.md +2 -2
- package/.github/prompts/oxe.prompt.md +2 -2
- package/CHANGELOG.md +52 -17
- package/README.md +610 -551
- package/bin/banner.txt +1 -1
- package/bin/lib/oxe-agent-install.cjs +69 -69
- package/bin/lib/oxe-azure.cjs +1445 -1445
- package/bin/lib/oxe-context-engine.cjs +867 -867
- package/bin/lib/oxe-dashboard.cjs +76 -28
- package/bin/lib/oxe-operational.cjs +2144 -1340
- package/bin/lib/oxe-project-health.cjs +483 -1
- package/bin/lib/oxe-runtime-semantics.cjs +12 -0
- package/bin/oxe-cc.js +554 -152
- package/commands/oxe/ask.md +2 -2
- package/commands/oxe/capabilities.md +2 -2
- package/commands/oxe/checkpoint.md +2 -2
- package/commands/oxe/compact.md +2 -2
- package/commands/oxe/dashboard.md +2 -2
- package/commands/oxe/debug.md +2 -2
- package/commands/oxe/discuss.md +2 -2
- package/commands/oxe/execute.md +5 -2
- package/commands/oxe/forensics.md +2 -2
- package/commands/oxe/help.md +2 -2
- package/commands/oxe/loop.md +2 -2
- package/commands/oxe/milestone.md +2 -2
- package/commands/oxe/next.md +2 -2
- package/commands/oxe/obs.md +2 -2
- package/commands/oxe/oxe.md +2 -2
- package/commands/oxe/plan-agent.md +2 -2
- package/commands/oxe/plan.md +2 -2
- package/commands/oxe/project.md +2 -2
- package/commands/oxe/quick.md +2 -2
- package/commands/oxe/research.md +2 -2
- package/commands/oxe/retro.md +2 -2
- package/commands/oxe/review-pr.md +2 -2
- package/commands/oxe/route.md +2 -2
- package/commands/oxe/scan.md +2 -2
- package/commands/oxe/security.md +2 -2
- package/commands/oxe/session.md +2 -2
- package/commands/oxe/ship.md +2 -2
- package/commands/oxe/skill.md +2 -2
- package/commands/oxe/spec.md +2 -2
- package/commands/oxe/ui-review.md +2 -2
- package/commands/oxe/ui-spec.md +2 -2
- package/commands/oxe/update.md +2 -2
- package/commands/oxe/validate-gaps.md +2 -2
- package/commands/oxe/verify.md +5 -2
- package/commands/oxe/workstream.md +2 -2
- package/lib/runtime/delivery/branch-manager.d.ts +1 -0
- package/lib/runtime/delivery/branch-manager.js +7 -0
- package/lib/runtime/delivery/ci-checks.js +34 -1
- package/lib/runtime/delivery/delivery-records.d.ts +34 -0
- package/lib/runtime/delivery/delivery-records.js +48 -0
- package/lib/runtime/delivery/index.d.ts +1 -0
- package/lib/runtime/delivery/index.js +1 -0
- package/lib/runtime/delivery/promotion-pipeline.d.ts +26 -2
- package/lib/runtime/delivery/promotion-pipeline.js +111 -14
- package/lib/runtime/gate/gate-manager.d.ts +41 -0
- package/lib/runtime/gate/gate-manager.js +108 -1
- package/lib/runtime/index.d.ts +2 -2
- package/lib/runtime/index.js +3 -1
- package/lib/runtime/models/gate-decision.d.ts +4 -1
- package/lib/runtime/models/workspace.d.ts +3 -0
- package/lib/runtime/plugins/capability-adapter.d.ts +12 -0
- package/lib/runtime/plugins/capability-adapter.js +204 -0
- package/lib/runtime/plugins/capability-matrix.d.ts +5 -0
- package/lib/runtime/plugins/capability-matrix.js +48 -17
- package/lib/runtime/plugins/index.d.ts +1 -0
- package/lib/runtime/plugins/index.js +1 -0
- package/lib/runtime/plugins/plugin-abi.d.ts +2 -0
- package/lib/runtime/plugins/plugin-manifest.d.ts +1 -1
- package/lib/runtime/plugins/plugin-manifest.js +6 -2
- package/lib/runtime/plugins/plugin-registry.d.ts +46 -0
- package/lib/runtime/plugins/plugin-registry.js +79 -2
- package/lib/runtime/policy/policy-engine.d.ts +19 -0
- package/lib/runtime/policy/policy-engine.js +76 -4
- package/lib/runtime/projection/projection-engine.d.ts +9 -1
- package/lib/runtime/projection/projection-engine.js +73 -3
- package/lib/runtime/scheduler/multi-agent-coordinator.d.ts +43 -1
- package/lib/runtime/scheduler/multi-agent-coordinator.js +151 -39
- package/lib/runtime/scheduler/run-journal.d.ts +1 -1
- package/lib/runtime/scheduler/scheduler.d.ts +19 -1
- package/lib/runtime/scheduler/scheduler.js +258 -13
- package/lib/runtime/verification/verification-compiler.d.ts +43 -0
- package/lib/runtime/verification/verification-compiler.js +137 -0
- package/lib/runtime/verification/verification-manifest.d.ts +9 -0
- package/lib/runtime/verification/verification-manifest.js +56 -6
- package/lib/runtime/workspace/strategies/ephemeral-container.d.ts +1 -0
- package/lib/runtime/workspace/strategies/ephemeral-container.js +4 -0
- package/lib/runtime/workspace/strategies/git-worktree.d.ts +1 -0
- package/lib/runtime/workspace/strategies/git-worktree.js +2 -0
- package/lib/runtime/workspace/strategies/inplace.d.ts +1 -0
- package/lib/runtime/workspace/strategies/inplace.js +2 -0
- package/lib/runtime/workspace/workspace-manager.d.ts +2 -1
- package/lib/sdk/README.md +9 -9
- package/lib/sdk/index.cjs +33 -24
- package/lib/sdk/index.d.ts +149 -14
- package/oxe/templates/ACTIVE-RUN.template.json +32 -32
- package/oxe/templates/CAPABILITIES.template.md +7 -7
- package/oxe/templates/CAPABILITY.template.md +45 -45
- package/oxe/templates/CHECKPOINTS.template.md +7 -7
- package/oxe/templates/EXECUTION-RUNTIME.template.md +68 -68
- package/oxe/templates/HYPOTHESES.template.md +33 -33
- package/oxe/templates/LESSONS-METRICS.template.json +13 -13
- package/oxe/templates/NOTES.template.md +16 -16
- package/oxe/templates/PLAN-REVIEW.template.md +31 -31
- package/oxe/templates/SESSION.template.md +34 -34
- package/oxe/templates/SKILL.template.md +26 -26
- package/oxe/templates/STATE.md +55 -55
- package/oxe/templates/WORKFLOW_AUTHORING.md +18 -18
- package/oxe/workflows/ask.md +96 -96
- package/oxe/workflows/capabilities.md +25 -25
- package/oxe/workflows/dashboard.md +33 -33
- package/oxe/workflows/discuss.md +12 -12
- package/oxe/workflows/execute.md +14 -0
- package/oxe/workflows/help.md +352 -352
- package/oxe/workflows/next.md +22 -22
- package/oxe/workflows/oxe.md +6 -6
- package/oxe/workflows/plan-agent.md +9 -9
- package/oxe/workflows/quick.md +10 -10
- package/oxe/workflows/references/reasoning-discovery.md +28 -28
- package/oxe/workflows/references/reasoning-execution.md +29 -29
- package/oxe/workflows/references/reasoning-planning.md +32 -32
- package/oxe/workflows/references/reasoning-review.md +29 -29
- package/oxe/workflows/references/reasoning-status.md +24 -24
- package/oxe/workflows/references/robustness-elevation.md +295 -295
- package/oxe/workflows/references/workflow-runtime-contracts.json +952 -930
- package/oxe/workflows/route.md +16 -16
- package/oxe/workflows/session.md +213 -213
- package/oxe/workflows/ship.md +142 -142
- package/oxe/workflows/skill.md +44 -44
- package/oxe/workflows/ui-review.md +36 -36
- package/oxe/workflows/verify-audit.md +73 -73
- package/oxe/workflows/verify.md +10 -0
- package/package.json +92 -92
- package/packages/runtime/package.json +17 -17
- package/packages/runtime/src/audit/audit-trail.ts +243 -243
- package/packages/runtime/src/audit/index.ts +2 -2
- package/packages/runtime/src/audit/policy-pack.ts +62 -62
- package/packages/runtime/src/compiler/graph-compiler.ts +245 -245
- package/packages/runtime/src/compiler/index.ts +1 -1
- package/packages/runtime/src/context/context-pack-builder.ts +259 -259
- package/packages/runtime/src/context/context-pack-store.ts +197 -197
- package/packages/runtime/src/context/context-profiles.ts +60 -60
- package/packages/runtime/src/context/index.ts +3 -3
- package/packages/runtime/src/decision/decision-engine.ts +174 -174
- package/packages/runtime/src/decision/decision-memo.ts +211 -211
- package/packages/runtime/src/decision/index.ts +2 -2
- package/packages/runtime/src/delivery/branch-manager.ts +91 -84
- package/packages/runtime/src/delivery/ci-checks.ts +285 -252
- package/packages/runtime/src/delivery/delivery-records.ts +75 -0
- package/packages/runtime/src/delivery/index.ts +5 -4
- package/packages/runtime/src/delivery/pr-manager.ts +112 -112
- package/packages/runtime/src/delivery/promotion-pipeline.ts +334 -180
- package/packages/runtime/src/events/bus.ts +92 -92
- package/packages/runtime/src/events/catalog.ts +29 -29
- package/packages/runtime/src/events/envelope.ts +14 -14
- package/packages/runtime/src/events/index.ts +3 -3
- package/packages/runtime/src/evidence/evidence-store.ts +130 -130
- package/packages/runtime/src/evidence/index.ts +1 -1
- package/packages/runtime/src/gate/gate-manager.ts +289 -137
- package/packages/runtime/src/gate/index.ts +1 -1
- package/packages/runtime/src/index.ts +41 -37
- package/packages/runtime/src/models/attempt.ts +19 -19
- package/packages/runtime/src/models/evidence.ts +21 -21
- package/packages/runtime/src/models/gate-decision.ts +25 -21
- package/packages/runtime/src/models/index.ts +8 -8
- package/packages/runtime/src/models/run.ts +24 -24
- package/packages/runtime/src/models/session.ts +11 -11
- package/packages/runtime/src/models/verification-result.ts +10 -10
- package/packages/runtime/src/models/work-item.ts +25 -25
- package/packages/runtime/src/models/workspace.ts +31 -28
- package/packages/runtime/src/plugins/capability-adapter.ts +206 -0
- package/packages/runtime/src/plugins/capability-matrix.ts +126 -83
- package/packages/runtime/src/plugins/index.ts +5 -4
- package/packages/runtime/src/plugins/plugin-abi.ts +97 -95
- package/packages/runtime/src/plugins/plugin-manifest.ts +118 -113
- package/packages/runtime/src/plugins/plugin-registry.ts +232 -124
- package/packages/runtime/src/policy/index.ts +1 -1
- package/packages/runtime/src/policy/policy-engine.ts +330 -244
- package/packages/runtime/src/projection/index.ts +1 -1
- package/packages/runtime/src/projection/projection-engine.ts +328 -249
- package/packages/runtime/src/reducers/debug-reducer.ts +36 -36
- package/packages/runtime/src/reducers/index.ts +2 -2
- package/packages/runtime/src/reducers/run-state-reducer.ts +269 -269
- package/packages/runtime/src/scheduler/agent-registry.ts +132 -132
- package/packages/runtime/src/scheduler/agent-roles.ts +109 -109
- package/packages/runtime/src/scheduler/index.ts +4 -4
- package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +521 -333
- package/packages/runtime/src/scheduler/run-journal.ts +62 -62
- package/packages/runtime/src/scheduler/scheduler.ts +722 -441
- package/packages/runtime/src/verification/index.ts +2 -2
- package/packages/runtime/src/verification/verification-compiler.ts +436 -225
- package/packages/runtime/src/verification/verification-manifest.ts +252 -192
- package/packages/runtime/src/workspace/index.ts +5 -5
- package/packages/runtime/src/workspace/strategies/ephemeral-container.ts +126 -121
- package/packages/runtime/src/workspace/strategies/git-worktree.ts +79 -77
- package/packages/runtime/src/workspace/strategies/inplace.ts +38 -35
- package/packages/runtime/src/workspace/workspace-manager.ts +16 -15
- package/packages/runtime/tsconfig.json +17 -17
- package/vscode-extension/.vscodeignore +7 -7
- package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
- package/vscode-extension/package.json +185 -185
- package/vscode-extension/src/extension.js +310 -310
- package/vscode-extension/src/shared/contextLoader.js +137 -137
- package/vscode-extension/src/shared/contractBuilder.js +159 -159
- package/vscode-extension/src/shared/stateReader.js +101 -101
package/commands/oxe/verify.md
CHANGED
|
@@ -16,7 +16,7 @@ oxe_tool_profile: review_heavy
|
|
|
16
16
|
oxe_confidence_policy: explicit
|
|
17
17
|
oxe_context_tier: standard
|
|
18
18
|
oxe_contract_version: 2.0.0
|
|
19
|
-
oxe_semantics_hash:
|
|
19
|
+
oxe_semantics_hash: 8b47625394eec62a
|
|
20
20
|
---
|
|
21
21
|
|
|
22
22
|
<!-- oxe-reasoning-contract:start -->
|
|
@@ -30,7 +30,7 @@ oxe_semantics_hash: 442bb4594208d058
|
|
|
30
30
|
- **Política de confiança:** explícita
|
|
31
31
|
- **Tier de contexto padrão:** padrão
|
|
32
32
|
- **Versão do contrato:** 2.0.0
|
|
33
|
-
- **Checksum semântico:** `
|
|
33
|
+
- **Checksum semântico:** `8b47625394eec62a`
|
|
34
34
|
- **Entrada de contexto prioritária:** `.oxe/context/packs/verify.md` e `.oxe/context/packs/verify.json`
|
|
35
35
|
- **Regra pack-first:** ler o context pack primeiro; se estiver stale, incompleto ou ausente, cair para leitura direta com fallback explícito.
|
|
36
36
|
- **Inspeção estruturada:** `oxe-cc context inspect --workflow verify --json`
|
|
@@ -39,6 +39,9 @@ oxe_semantics_hash: 442bb4594208d058
|
|
|
39
39
|
- Se não houver findings, declarar isso explicitamente e listar riscos residuais.
|
|
40
40
|
- **Seções esperadas:** Findings · Perguntas abertas · Riscos residuais · Resumo
|
|
41
41
|
- **Bloqueios formais:** missing:state
|
|
42
|
+
- **Caminho runtime padrão:** `oxe-cc runtime verify --dir <projeto>` → `oxe-cc runtime project --dir <projeto>`
|
|
43
|
+
- **Artefatos canónicos primários:** `.oxe/runs/<run_id>/verification-manifest.json` · `.oxe/runs/<run_id>/residual-risk-ledger.json` · `.oxe/runs/<run_id>/evidence-coverage.json` · `VERIFY.md projetado`
|
|
44
|
+
- **Fallback runtime:** Se runtime verify não estiver disponível, declarar fallback explícito para a verificação manual; se retornar partial, usar os gaps explícitos como backlog da revisão.
|
|
42
45
|
- **Referência canónica:** `oxe/workflows/references/reasoning-review.md`
|
|
43
46
|
|
|
44
47
|
<!-- oxe-reasoning-contract:end -->
|
|
@@ -17,7 +17,7 @@ oxe_tool_profile: write_bounded
|
|
|
17
17
|
oxe_confidence_policy: explicit
|
|
18
18
|
oxe_context_tier: standard
|
|
19
19
|
oxe_contract_version: 2.0.0
|
|
20
|
-
oxe_semantics_hash:
|
|
20
|
+
oxe_semantics_hash: 380bd0a3f3620845
|
|
21
21
|
---
|
|
22
22
|
|
|
23
23
|
<!-- oxe-reasoning-contract:start -->
|
|
@@ -31,7 +31,7 @@ oxe_semantics_hash: 82d171363381cc0d
|
|
|
31
31
|
- **Política de confiança:** explícita
|
|
32
32
|
- **Tier de contexto padrão:** padrão
|
|
33
33
|
- **Versão do contrato:** 2.0.0
|
|
34
|
-
- **Checksum semântico:** `
|
|
34
|
+
- **Checksum semântico:** `380bd0a3f3620845`
|
|
35
35
|
- **Entrada de contexto prioritária:** `.oxe/context/packs/workstream.md` e `.oxe/context/packs/workstream.json`
|
|
36
36
|
- **Regra pack-first:** ler o context pack primeiro; se estiver stale, incompleto ou ausente, cair para leitura direta com fallback explícito.
|
|
37
37
|
- **Inspeção estruturada:** `oxe-cc context inspect --workflow workstream --json`
|
|
@@ -15,5 +15,6 @@ export declare class BranchManager {
|
|
|
15
15
|
listOxeBranches(): BranchInfo[];
|
|
16
16
|
mergeWorktreeBranch(worktreeBranch: string, targetBranch: string): void;
|
|
17
17
|
branchExists(name: string): boolean;
|
|
18
|
+
push(remote: string, branchName: string, setUpstream?: boolean): void;
|
|
18
19
|
private git;
|
|
19
20
|
}
|
|
@@ -68,6 +68,13 @@ class BranchManager {
|
|
|
68
68
|
});
|
|
69
69
|
return result.status === 0;
|
|
70
70
|
}
|
|
71
|
+
push(remote, branchName, setUpstream = false) {
|
|
72
|
+
const args = ['push'];
|
|
73
|
+
if (setUpstream)
|
|
74
|
+
args.push('-u');
|
|
75
|
+
args.push(remote, branchName);
|
|
76
|
+
this.git(args);
|
|
77
|
+
}
|
|
71
78
|
git(args) {
|
|
72
79
|
return (0, child_process_1.execFileSync)('git', args, {
|
|
73
80
|
cwd: this.projectRoot,
|
|
@@ -41,6 +41,25 @@ exports.verifyAcceptanceCheck = {
|
|
|
41
41
|
name: 'oxe-verify-acceptance',
|
|
42
42
|
description: 'Checks that VERIFY.md exists and contains no failed criteria',
|
|
43
43
|
async run(ctx) {
|
|
44
|
+
const manifestPath = path_1.default.join(ctx.projectRoot, '.oxe', 'runs', ctx.runId || '', 'verification-manifest.json');
|
|
45
|
+
if (ctx.runId && fs_1.default.existsSync(manifestPath)) {
|
|
46
|
+
try {
|
|
47
|
+
const manifest = JSON.parse(fs_1.default.readFileSync(manifestPath, 'utf8'));
|
|
48
|
+
const failCount = Number(manifest.summary?.fail || 0);
|
|
49
|
+
const errorCount = Number(manifest.summary?.error || 0);
|
|
50
|
+
return failCount === 0 && errorCount === 0
|
|
51
|
+
? { check: this.name, status: 'pass', message: `Manifest reports ${manifest.summary.total} checks with no failures` }
|
|
52
|
+
: {
|
|
53
|
+
check: this.name,
|
|
54
|
+
status: 'fail',
|
|
55
|
+
message: `Manifest reports ${failCount} failed and ${errorCount} errored checks`,
|
|
56
|
+
details: manifest.summary,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
return { check: this.name, status: 'error', message: `Failed to parse verification manifest: ${String(err)}` };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
44
63
|
const verifyPath = ctx.sessionId
|
|
45
64
|
? path_1.default.join(ctx.projectRoot, '.oxe', ctx.sessionId, 'verification', 'VERIFY.md')
|
|
46
65
|
: path_1.default.join(ctx.projectRoot, '.oxe', 'VERIFY.md');
|
|
@@ -86,7 +105,21 @@ exports.policyCheck = {
|
|
|
86
105
|
details: pending.map((g) => ({ gate_id: g.gate_id, scope: g.scope })),
|
|
87
106
|
};
|
|
88
107
|
}
|
|
89
|
-
|
|
108
|
+
if (ctx.runId) {
|
|
109
|
+
const policyPath = path_1.default.join(ctx.projectRoot, '.oxe', 'runs', ctx.runId, 'policy-decisions.json');
|
|
110
|
+
if (fs_1.default.existsSync(policyPath)) {
|
|
111
|
+
const policyDecisions = JSON.parse(fs_1.default.readFileSync(policyPath, 'utf8'));
|
|
112
|
+
const withoutRationale = policyDecisions.filter((decision) => decision.override && !decision.rationale);
|
|
113
|
+
if (withoutRationale.length > 0) {
|
|
114
|
+
return {
|
|
115
|
+
check: this.name,
|
|
116
|
+
status: 'fail',
|
|
117
|
+
message: `${withoutRationale.length} policy override(s) without rationale`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { check: this.name, status: 'pass', message: 'All gates resolved and policy overrides are justified' };
|
|
90
123
|
}
|
|
91
124
|
catch (err) {
|
|
92
125
|
return { check: this.name, status: 'error', message: `Failed to read GATES.json: ${String(err)}` };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type PromotionTarget = 'local_commit' | 'remote_promotion';
|
|
2
|
+
export type PromotionRemoteTarget = 'pr_draft' | 'branch_push';
|
|
3
|
+
export interface CommitRecord {
|
|
4
|
+
run_id: string;
|
|
5
|
+
branch: string;
|
|
6
|
+
commit_sha: string | null;
|
|
7
|
+
status: 'pending' | 'committed' | 'blocked';
|
|
8
|
+
created_at: string;
|
|
9
|
+
committed_at: string | null;
|
|
10
|
+
message: string | null;
|
|
11
|
+
summary_path: string | null;
|
|
12
|
+
}
|
|
13
|
+
export interface PromotionRecord {
|
|
14
|
+
run_id: string;
|
|
15
|
+
target: PromotionTarget;
|
|
16
|
+
target_kind: PromotionRemoteTarget;
|
|
17
|
+
branch: string;
|
|
18
|
+
status: 'pending' | 'open' | 'merged' | 'closed' | 'blocked' | 'promoted';
|
|
19
|
+
created_at: string;
|
|
20
|
+
promoted_at: string | null;
|
|
21
|
+
summary_path: string | null;
|
|
22
|
+
remote: string | null;
|
|
23
|
+
target_ref: string | null;
|
|
24
|
+
pr_url: string | null;
|
|
25
|
+
pr_number: number | null;
|
|
26
|
+
reasons?: string[];
|
|
27
|
+
coverage_percent?: number | null;
|
|
28
|
+
}
|
|
29
|
+
export declare function commitRecordPath(projectRoot: string, runId: string): string;
|
|
30
|
+
export declare function promotionRecordPath(projectRoot: string, runId: string): string;
|
|
31
|
+
export declare function saveCommitRecord(projectRoot: string, runId: string, record: CommitRecord): void;
|
|
32
|
+
export declare function loadCommitRecord(projectRoot: string, runId: string): CommitRecord | null;
|
|
33
|
+
export declare function savePromotionRecord(projectRoot: string, runId: string, record: PromotionRecord): void;
|
|
34
|
+
export declare function loadPromotionRecord(projectRoot: string, runId: string): PromotionRecord | null;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.commitRecordPath = commitRecordPath;
|
|
7
|
+
exports.promotionRecordPath = promotionRecordPath;
|
|
8
|
+
exports.saveCommitRecord = saveCommitRecord;
|
|
9
|
+
exports.loadCommitRecord = loadCommitRecord;
|
|
10
|
+
exports.savePromotionRecord = savePromotionRecord;
|
|
11
|
+
exports.loadPromotionRecord = loadPromotionRecord;
|
|
12
|
+
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
function runDir(projectRoot, runId) {
|
|
15
|
+
return path_1.default.join(projectRoot, '.oxe', 'runs', runId);
|
|
16
|
+
}
|
|
17
|
+
function saveJson(filePath, payload) {
|
|
18
|
+
fs_1.default.mkdirSync(path_1.default.dirname(filePath), { recursive: true });
|
|
19
|
+
fs_1.default.writeFileSync(filePath, JSON.stringify(payload, null, 2), 'utf8');
|
|
20
|
+
}
|
|
21
|
+
function loadJson(filePath) {
|
|
22
|
+
if (!fs_1.default.existsSync(filePath))
|
|
23
|
+
return null;
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(fs_1.default.readFileSync(filePath, 'utf8'));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function commitRecordPath(projectRoot, runId) {
|
|
32
|
+
return path_1.default.join(runDir(projectRoot, runId), 'commit-record.json');
|
|
33
|
+
}
|
|
34
|
+
function promotionRecordPath(projectRoot, runId) {
|
|
35
|
+
return path_1.default.join(runDir(projectRoot, runId), 'promotion-record.json');
|
|
36
|
+
}
|
|
37
|
+
function saveCommitRecord(projectRoot, runId, record) {
|
|
38
|
+
saveJson(commitRecordPath(projectRoot, runId), record);
|
|
39
|
+
}
|
|
40
|
+
function loadCommitRecord(projectRoot, runId) {
|
|
41
|
+
return loadJson(commitRecordPath(projectRoot, runId));
|
|
42
|
+
}
|
|
43
|
+
function savePromotionRecord(projectRoot, runId, record) {
|
|
44
|
+
saveJson(promotionRecordPath(projectRoot, runId), record);
|
|
45
|
+
}
|
|
46
|
+
function loadPromotionRecord(projectRoot, runId) {
|
|
47
|
+
return loadJson(promotionRecordPath(projectRoot, runId));
|
|
48
|
+
}
|
|
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./branch-manager"), exports);
|
|
18
18
|
__exportStar(require("./pr-manager"), exports);
|
|
19
19
|
__exportStar(require("./ci-checks"), exports);
|
|
20
|
+
__exportStar(require("./delivery-records"), exports);
|
|
20
21
|
__exportStar(require("./promotion-pipeline"), exports);
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { PRManager } from './pr-manager';
|
|
2
2
|
import type { BranchManager } from './branch-manager';
|
|
3
3
|
import type { VerificationManifest, ResidualRiskLedger } from '../verification/verification-manifest';
|
|
4
|
+
import type { EvidenceCoverageSummary } from '../verification/verification-manifest';
|
|
4
5
|
import type { RunResult } from '../scheduler/scheduler';
|
|
6
|
+
import type { GateToken } from '../gate/gate-manager';
|
|
7
|
+
import { type CommitRecord, type PromotionRecord, type PromotionRemoteTarget } from './delivery-records';
|
|
5
8
|
export interface RunPRLink {
|
|
6
9
|
run_id: string;
|
|
7
10
|
branch: string;
|
|
@@ -16,15 +19,24 @@ export interface PromotionOptions {
|
|
|
16
19
|
draftPR?: boolean;
|
|
17
20
|
autoMerge?: boolean;
|
|
18
21
|
mergeMethod?: 'merge' | 'squash' | 'rebase';
|
|
22
|
+
targetRef?: string;
|
|
23
|
+
remote?: string;
|
|
24
|
+
targetKind?: PromotionRemoteTarget;
|
|
25
|
+
minimumCoverage?: number;
|
|
19
26
|
}
|
|
20
27
|
export type MergeGateVerdict = 'approved' | 'blocked' | 'needs_review';
|
|
21
28
|
export interface MergeGateReport {
|
|
22
29
|
verdict: MergeGateVerdict;
|
|
23
30
|
reasons: string[];
|
|
24
31
|
blocking_risks: string[];
|
|
32
|
+
pending_gates: Array<{
|
|
33
|
+
gate_id: string;
|
|
34
|
+
scope: string;
|
|
35
|
+
work_item_id: string | null;
|
|
36
|
+
}>;
|
|
25
37
|
}
|
|
26
38
|
export declare class MergeGateEvaluator {
|
|
27
|
-
evaluate(runResult: RunResult, manifest: VerificationManifest | null, riskLedger: ResidualRiskLedger | null): MergeGateReport;
|
|
39
|
+
evaluate(runResult: RunResult, manifest: VerificationManifest | null, riskLedger: ResidualRiskLedger | null, gates?: GateToken[], evidenceCoverage?: EvidenceCoverageSummary | null, minimumCoverage?: number): MergeGateReport;
|
|
28
40
|
}
|
|
29
41
|
export declare class PromotionPipeline {
|
|
30
42
|
private readonly projectRoot;
|
|
@@ -32,8 +44,20 @@ export declare class PromotionPipeline {
|
|
|
32
44
|
private readonly prManager;
|
|
33
45
|
private readonly gateEvaluator;
|
|
34
46
|
constructor(projectRoot: string, branchManager: BranchManager, prManager: PRManager, gateEvaluator?: MergeGateEvaluator);
|
|
47
|
+
private baseSummaryLines;
|
|
48
|
+
buildCommitSummary(runResult: RunResult, manifest: VerificationManifest | null, riskLedger: ResidualRiskLedger | null, commitMessage?: string | null): string;
|
|
49
|
+
buildPromotionSummary(runResult: RunResult, manifest: VerificationManifest | null, riskLedger: ResidualRiskLedger | null): string;
|
|
35
50
|
buildPRBody(runResult: RunResult, manifest: VerificationManifest | null, riskLedger: ResidualRiskLedger | null): string;
|
|
36
|
-
|
|
51
|
+
recordLocalCommit(runResult: RunResult, manifest: VerificationManifest | null, riskLedger: ResidualRiskLedger | null, options?: {
|
|
52
|
+
commitMessage?: string;
|
|
53
|
+
commitSha?: string | null;
|
|
54
|
+
summaryPath?: string | null;
|
|
55
|
+
}): CommitRecord;
|
|
56
|
+
promote(runResult: RunResult, manifest: VerificationManifest | null, riskLedger: ResidualRiskLedger | null, opts?: PromotionOptions, gates?: GateToken[], evidenceCoverage?: EvidenceCoverageSummary | null): Promise<PromotionRecord>;
|
|
57
|
+
loadCommitRecord(runId: string): CommitRecord | null;
|
|
58
|
+
loadPromotionRecord(runId: string): PromotionRecord | null;
|
|
37
59
|
savePRLink(runId: string, link: RunPRLink): void;
|
|
38
60
|
loadPRLink(runId: string): RunPRLink | null;
|
|
61
|
+
private asRunPRLink;
|
|
62
|
+
private safeCurrentCommit;
|
|
39
63
|
}
|
|
@@ -6,10 +6,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.PromotionPipeline = exports.MergeGateEvaluator = void 0;
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const delivery_records_1 = require("./delivery-records");
|
|
9
10
|
class MergeGateEvaluator {
|
|
10
|
-
evaluate(runResult, manifest, riskLedger) {
|
|
11
|
+
evaluate(runResult, manifest, riskLedger, gates = [], evidenceCoverage = null, minimumCoverage = 100) {
|
|
11
12
|
const reasons = [];
|
|
12
13
|
const blockingRisks = [];
|
|
14
|
+
const pendingGates = gates
|
|
15
|
+
.filter((gate) => gate.status === 'pending')
|
|
16
|
+
.map((gate) => ({
|
|
17
|
+
gate_id: gate.gate_id,
|
|
18
|
+
scope: gate.scope,
|
|
19
|
+
work_item_id: gate.work_item_id ?? null,
|
|
20
|
+
}));
|
|
13
21
|
if (runResult.failed.length > 0) {
|
|
14
22
|
reasons.push(`${runResult.failed.length} task(s) failed: ${runResult.failed.join(', ')}`);
|
|
15
23
|
}
|
|
@@ -25,9 +33,15 @@ class MergeGateEvaluator {
|
|
|
25
33
|
blockingRisks.push(`[${risk.severity.toUpperCase()}] ${risk.description}`);
|
|
26
34
|
}
|
|
27
35
|
}
|
|
36
|
+
if (pendingGates.length > 0) {
|
|
37
|
+
reasons.push(`${pendingGates.length} pending gate(s)`);
|
|
38
|
+
}
|
|
39
|
+
if (evidenceCoverage && evidenceCoverage.coverage_percent < minimumCoverage) {
|
|
40
|
+
reasons.push(`Evidence coverage below threshold: ${evidenceCoverage.coverage_percent}%/${minimumCoverage}%`);
|
|
41
|
+
}
|
|
28
42
|
const hasBlockers = reasons.length > 0 || blockingRisks.length > 0;
|
|
29
43
|
const verdict = hasBlockers ? 'blocked' : 'approved';
|
|
30
|
-
return { verdict, reasons, blocking_risks: blockingRisks };
|
|
44
|
+
return { verdict, reasons, blocking_risks: blockingRisks, pending_gates: pendingGates };
|
|
31
45
|
}
|
|
32
46
|
}
|
|
33
47
|
exports.MergeGateEvaluator = MergeGateEvaluator;
|
|
@@ -38,10 +52,8 @@ class PromotionPipeline {
|
|
|
38
52
|
this.prManager = prManager;
|
|
39
53
|
this.gateEvaluator = gateEvaluator;
|
|
40
54
|
}
|
|
41
|
-
|
|
55
|
+
baseSummaryLines(runResult, manifest, riskLedger) {
|
|
42
56
|
const lines = [];
|
|
43
|
-
lines.push('## OXE Run Summary');
|
|
44
|
-
lines.push('');
|
|
45
57
|
lines.push(`**Run ID:** \`${runResult.run_id}\``);
|
|
46
58
|
lines.push(`**Status:** ${runResult.status}`);
|
|
47
59
|
lines.push(`**Completed:** ${runResult.completed.length} tasks`);
|
|
@@ -71,25 +83,79 @@ class PromotionPipeline {
|
|
|
71
83
|
lines.push('');
|
|
72
84
|
lines.push('---');
|
|
73
85
|
lines.push('*Generated by OXE Runtime*');
|
|
86
|
+
return lines;
|
|
87
|
+
}
|
|
88
|
+
buildCommitSummary(runResult, manifest, riskLedger, commitMessage = null) {
|
|
89
|
+
const lines = ['## OXE Commit Summary', ''];
|
|
90
|
+
if (commitMessage)
|
|
91
|
+
lines.push(`**Commit message:** \`${commitMessage}\``, '');
|
|
92
|
+
lines.push(...this.baseSummaryLines(runResult, manifest, riskLedger));
|
|
93
|
+
return lines.join('\n');
|
|
94
|
+
}
|
|
95
|
+
buildPromotionSummary(runResult, manifest, riskLedger) {
|
|
96
|
+
const lines = ['## OXE Promotion Summary', '', ...this.baseSummaryLines(runResult, manifest, riskLedger)];
|
|
74
97
|
return lines.join('\n');
|
|
75
98
|
}
|
|
76
|
-
|
|
77
|
-
|
|
99
|
+
buildPRBody(runResult, manifest, riskLedger) {
|
|
100
|
+
return this.buildPromotionSummary(runResult, manifest, riskLedger);
|
|
101
|
+
}
|
|
102
|
+
recordLocalCommit(runResult, manifest, riskLedger, options = {}) {
|
|
103
|
+
const blocked = runResult.failed.length > 0 || runResult.blocked.length > 0;
|
|
104
|
+
const record = {
|
|
105
|
+
run_id: runResult.run_id,
|
|
106
|
+
branch: this.branchManager.currentBranch(),
|
|
107
|
+
commit_sha: options.commitSha ?? this.safeCurrentCommit(),
|
|
108
|
+
status: blocked ? 'blocked' : 'committed',
|
|
109
|
+
created_at: new Date().toISOString(),
|
|
110
|
+
committed_at: blocked ? null : new Date().toISOString(),
|
|
111
|
+
message: options.commitMessage ?? null,
|
|
112
|
+
summary_path: options.summaryPath ?? null,
|
|
113
|
+
};
|
|
114
|
+
(0, delivery_records_1.saveCommitRecord)(this.projectRoot, runResult.run_id, record);
|
|
115
|
+
return record;
|
|
116
|
+
}
|
|
117
|
+
async promote(runResult, manifest, riskLedger, opts = {}, gates = [], evidenceCoverage = null) {
|
|
118
|
+
const gateReport = this.gateEvaluator.evaluate(runResult, manifest, riskLedger, gates, evidenceCoverage, opts.minimumCoverage ?? 100);
|
|
119
|
+
const targetKind = opts.targetKind ?? 'pr_draft';
|
|
78
120
|
const link = {
|
|
79
121
|
run_id: runResult.run_id,
|
|
122
|
+
target: 'remote_promotion',
|
|
123
|
+
target_kind: targetKind,
|
|
80
124
|
branch: this.branchManager.currentBranch(),
|
|
81
|
-
pr_url: null,
|
|
82
|
-
pr_number: null,
|
|
83
125
|
status: 'pending',
|
|
84
126
|
created_at: new Date().toISOString(),
|
|
85
|
-
|
|
127
|
+
promoted_at: null,
|
|
128
|
+
summary_path: null,
|
|
129
|
+
remote: opts.remote ?? 'origin',
|
|
130
|
+
target_ref: opts.targetRef ?? opts.baseBranch ?? 'main',
|
|
131
|
+
pr_url: null,
|
|
132
|
+
pr_number: null,
|
|
133
|
+
reasons: gateReport.reasons,
|
|
134
|
+
coverage_percent: evidenceCoverage ? evidenceCoverage.coverage_percent : null,
|
|
86
135
|
};
|
|
87
136
|
if (gateReport.verdict === 'blocked') {
|
|
88
137
|
link.status = 'blocked';
|
|
89
|
-
this.
|
|
138
|
+
(0, delivery_records_1.savePromotionRecord)(this.projectRoot, runResult.run_id, link);
|
|
139
|
+
this.savePRLink(runResult.run_id, this.asRunPRLink(link));
|
|
90
140
|
return link;
|
|
91
141
|
}
|
|
92
|
-
|
|
142
|
+
if (targetKind === 'branch_push') {
|
|
143
|
+
try {
|
|
144
|
+
this.branchManager.push(opts.remote ?? 'origin', link.branch, false);
|
|
145
|
+
link.status = 'promoted';
|
|
146
|
+
link.promoted_at = new Date().toISOString();
|
|
147
|
+
(0, delivery_records_1.savePromotionRecord)(this.projectRoot, runResult.run_id, link);
|
|
148
|
+
this.savePRLink(runResult.run_id, this.asRunPRLink(link));
|
|
149
|
+
return link;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
link.status = 'blocked';
|
|
153
|
+
(0, delivery_records_1.savePromotionRecord)(this.projectRoot, runResult.run_id, link);
|
|
154
|
+
this.savePRLink(runResult.run_id, this.asRunPRLink(link));
|
|
155
|
+
return link;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const body = this.buildPromotionSummary(runResult, manifest, riskLedger);
|
|
93
159
|
const title = `oxe: run ${runResult.run_id} — ${runResult.completed.length} tasks`;
|
|
94
160
|
const prResult = this.prManager.createDraft({
|
|
95
161
|
title,
|
|
@@ -99,14 +165,23 @@ class PromotionPipeline {
|
|
|
99
165
|
});
|
|
100
166
|
if (!prResult.success || !prResult.url) {
|
|
101
167
|
link.status = 'blocked';
|
|
102
|
-
this.
|
|
168
|
+
(0, delivery_records_1.savePromotionRecord)(this.projectRoot, runResult.run_id, link);
|
|
169
|
+
this.savePRLink(runResult.run_id, this.asRunPRLink(link));
|
|
103
170
|
return link;
|
|
104
171
|
}
|
|
105
172
|
link.pr_url = prResult.url;
|
|
106
173
|
link.status = 'open';
|
|
107
|
-
|
|
174
|
+
link.promoted_at = new Date().toISOString();
|
|
175
|
+
(0, delivery_records_1.savePromotionRecord)(this.projectRoot, runResult.run_id, link);
|
|
176
|
+
this.savePRLink(runResult.run_id, this.asRunPRLink(link));
|
|
108
177
|
return link;
|
|
109
178
|
}
|
|
179
|
+
loadCommitRecord(runId) {
|
|
180
|
+
return (0, delivery_records_1.loadCommitRecord)(this.projectRoot, runId);
|
|
181
|
+
}
|
|
182
|
+
loadPromotionRecord(runId) {
|
|
183
|
+
return (0, delivery_records_1.loadPromotionRecord)(this.projectRoot, runId);
|
|
184
|
+
}
|
|
110
185
|
savePRLink(runId, link) {
|
|
111
186
|
const p = path_1.default.join(this.projectRoot, '.oxe', 'runs', runId, 'pr-link.json');
|
|
112
187
|
fs_1.default.mkdirSync(path_1.default.dirname(p), { recursive: true });
|
|
@@ -119,6 +194,28 @@ class PromotionPipeline {
|
|
|
119
194
|
try {
|
|
120
195
|
return JSON.parse(fs_1.default.readFileSync(p, 'utf8'));
|
|
121
196
|
}
|
|
197
|
+
catch {
|
|
198
|
+
const promotion = (0, delivery_records_1.loadPromotionRecord)(this.projectRoot, runId);
|
|
199
|
+
return promotion ? this.asRunPRLink(promotion) : null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
asRunPRLink(record) {
|
|
203
|
+
return {
|
|
204
|
+
run_id: record.run_id,
|
|
205
|
+
branch: record.branch,
|
|
206
|
+
pr_url: record.pr_url,
|
|
207
|
+
pr_number: record.pr_number,
|
|
208
|
+
status: record.target_kind === 'branch_push'
|
|
209
|
+
? (record.status === 'blocked' ? 'blocked' : 'open')
|
|
210
|
+
: (record.status === 'promoted' ? 'open' : record.status),
|
|
211
|
+
created_at: record.created_at,
|
|
212
|
+
merged_at: record.status === 'merged' ? record.promoted_at : null,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
safeCurrentCommit() {
|
|
216
|
+
try {
|
|
217
|
+
return this.branchManager.currentCommit();
|
|
218
|
+
}
|
|
122
219
|
catch {
|
|
123
220
|
return null;
|
|
124
221
|
}
|
|
@@ -2,13 +2,25 @@ import type { GateScope, GateDecisionValue } from '../models/gate-decision';
|
|
|
2
2
|
export interface GateContext {
|
|
3
3
|
work_item_id?: string;
|
|
4
4
|
run_id?: string;
|
|
5
|
+
action?: string;
|
|
5
6
|
description: string;
|
|
6
7
|
evidence_refs: string[];
|
|
7
8
|
risks: string[];
|
|
9
|
+
rationale?: string;
|
|
10
|
+
policy_decision_id?: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface GateResolutionRecord {
|
|
13
|
+
decision: GateDecisionValue;
|
|
14
|
+
actor: string;
|
|
15
|
+
reason?: string;
|
|
16
|
+
resolved_at: string;
|
|
8
17
|
}
|
|
9
18
|
export interface GateToken {
|
|
10
19
|
gate_id: string;
|
|
11
20
|
scope: GateScope;
|
|
21
|
+
run_id: string | null;
|
|
22
|
+
work_item_id: string | null;
|
|
23
|
+
action: string | null;
|
|
12
24
|
requested_at: string;
|
|
13
25
|
context: GateContext;
|
|
14
26
|
status: 'pending' | 'resolved';
|
|
@@ -16,12 +28,32 @@ export interface GateToken {
|
|
|
16
28
|
actor?: string;
|
|
17
29
|
reason?: string;
|
|
18
30
|
resolved_at?: string;
|
|
31
|
+
resolution_history?: GateResolutionRecord[];
|
|
19
32
|
}
|
|
20
33
|
export interface GateResolution {
|
|
21
34
|
decision: GateDecisionValue;
|
|
22
35
|
actor: string;
|
|
23
36
|
reason?: string;
|
|
24
37
|
}
|
|
38
|
+
export interface GateQuery {
|
|
39
|
+
run_id?: string | null;
|
|
40
|
+
status?: 'pending' | 'stale' | 'resolved' | 'all';
|
|
41
|
+
scope?: GateScope;
|
|
42
|
+
work_item_id?: string | null;
|
|
43
|
+
action?: string | null;
|
|
44
|
+
gate_sla_hours?: number;
|
|
45
|
+
}
|
|
46
|
+
export interface GateQueueSnapshot {
|
|
47
|
+
total: number;
|
|
48
|
+
gate_sla_hours: number;
|
|
49
|
+
pending: GateToken[];
|
|
50
|
+
stale_pending: GateToken[];
|
|
51
|
+
staleCount: number;
|
|
52
|
+
resolved_recent: GateToken[];
|
|
53
|
+
byRun: Record<string, number>;
|
|
54
|
+
byScope: Record<string, number>;
|
|
55
|
+
all: GateToken[];
|
|
56
|
+
}
|
|
25
57
|
export declare class GateManager {
|
|
26
58
|
private readonly projectRoot;
|
|
27
59
|
private readonly sessionId;
|
|
@@ -34,6 +66,15 @@ export declare class GateManager {
|
|
|
34
66
|
resolve(token: GateToken, resolution: GateResolution): Promise<GateToken>;
|
|
35
67
|
isPending(scope: GateScope): boolean;
|
|
36
68
|
listPending(): GateToken[];
|
|
69
|
+
listResolved(): GateToken[];
|
|
70
|
+
listPendingByRun(runId?: string): GateToken[];
|
|
71
|
+
listPendingForWorkItem(workItemId: string): GateToken[];
|
|
72
|
+
stalePending(maxAgeHours?: number): GateToken[];
|
|
73
|
+
listRecentResolved(maxAgeHours?: number): GateToken[];
|
|
37
74
|
listAll(): GateToken[];
|
|
38
75
|
get(gateId: string): GateToken | null;
|
|
76
|
+
filter(query?: GateQuery): GateToken[];
|
|
77
|
+
snapshot(maxAgeHours?: number, query?: Omit<GateQuery, 'gate_sla_hours'>): GateQueueSnapshot;
|
|
39
78
|
}
|
|
79
|
+
export declare function listPendingGates(manager: GateManager, runId?: string, query?: Omit<GateQuery, 'run_id'>): GateQueueSnapshot;
|
|
80
|
+
export declare function resolveGate(manager: GateManager, gateId: string, resolution: GateResolution): Promise<GateToken>;
|