oh-my-codex 0.17.0 → 0.17.2
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/Cargo.lock +5 -5
- package/Cargo.toml +1 -1
- package/dist/cli/__tests__/question.test.js +2 -0
- package/dist/cli/__tests__/question.test.js.map +1 -1
- package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +3 -0
- package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
- package/dist/cli/__tests__/ralph.test.js +0 -124
- package/dist/cli/__tests__/ralph.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +156 -3
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/setup-refresh.test.js +3 -3
- package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +166 -42
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/doctor.js +9 -4
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/plugin-marketplace.d.ts +5 -1
- package/dist/cli/plugin-marketplace.d.ts.map +1 -1
- package/dist/cli/plugin-marketplace.js +31 -2
- package/dist/cli/plugin-marketplace.js.map +1 -1
- package/dist/cli/question.d.ts +1 -1
- package/dist/cli/question.d.ts.map +1 -1
- package/dist/cli/question.js +98 -4
- package/dist/cli/question.js.map +1 -1
- package/dist/cli/ralph.d.ts.map +1 -1
- package/dist/cli/ralph.js +1 -49
- package/dist/cli/ralph.js.map +1 -1
- package/dist/cli/setup.d.ts +1 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +75 -9
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +21 -29
- package/dist/cli/team.js.map +1 -1
- package/dist/config/generator.d.ts +4 -0
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +58 -0
- package/dist/config/generator.js.map +1 -1
- package/dist/hooks/__tests__/agents-overlay.test.js +29 -0
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/__tests__/session.test.js +126 -1
- package/dist/hooks/__tests__/session.test.js.map +1 -1
- package/dist/hooks/agents-overlay.d.ts.map +1 -1
- package/dist/hooks/agents-overlay.js +6 -3
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hooks/session.d.ts +11 -3
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +68 -6
- package/dist/hooks/session.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +63 -0
- package/dist/hud/__tests__/reconcile.test.js.map +1 -1
- package/dist/hud/__tests__/tmux.test.d.ts +2 -0
- package/dist/hud/__tests__/tmux.test.d.ts.map +1 -0
- package/dist/hud/__tests__/tmux.test.js +92 -0
- package/dist/hud/__tests__/tmux.test.js.map +1 -0
- package/dist/hud/reconcile.d.ts +2 -0
- package/dist/hud/reconcile.d.ts.map +1 -1
- package/dist/hud/reconcile.js +14 -1
- package/dist/hud/reconcile.js.map +1 -1
- package/dist/hud/tmux.d.ts +12 -0
- package/dist/hud/tmux.d.ts.map +1 -1
- package/dist/hud/tmux.js +88 -0
- package/dist/hud/tmux.js.map +1 -1
- package/dist/mcp/__tests__/hermes-bridge.test.js +82 -1
- package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -1
- package/dist/mcp/hermes-bridge.d.ts +34 -1
- package/dist/mcp/hermes-bridge.d.ts.map +1 -1
- package/dist/mcp/hermes-bridge.js +75 -0
- package/dist/mcp/hermes-bridge.js.map +1 -1
- package/dist/mcp/hermes-server.d.ts +111 -6
- package/dist/mcp/hermes-server.d.ts.map +1 -1
- package/dist/mcp/hermes-server.js +38 -1
- package/dist/mcp/hermes-server.js.map +1 -1
- package/dist/pipeline/__tests__/stages.test.js +18 -9
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/stages/team-exec.d.ts.map +1 -1
- package/dist/pipeline/stages/team-exec.js +2 -7
- package/dist/pipeline/stages/team-exec.js.map +1 -1
- package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js +111 -269
- package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js.map +1 -1
- package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.js +31 -72
- package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.js.map +1 -1
- package/dist/planning/__tests__/artifacts.test.js +27 -372
- package/dist/planning/__tests__/artifacts.test.js.map +1 -1
- package/dist/planning/artifacts.d.ts +1 -14
- package/dist/planning/artifacts.d.ts.map +1 -1
- package/dist/planning/artifacts.js +11 -31
- package/dist/planning/artifacts.js.map +1 -1
- package/dist/question/__tests__/state.test.js +349 -1
- package/dist/question/__tests__/state.test.js.map +1 -1
- package/dist/question/__tests__/ui.test.js +6 -6
- package/dist/question/__tests__/ui.test.js.map +1 -1
- package/dist/question/events.d.ts +53 -0
- package/dist/question/events.d.ts.map +1 -0
- package/dist/question/events.js +201 -0
- package/dist/question/events.js.map +1 -0
- package/dist/question/state.d.ts +30 -2
- package/dist/question/state.d.ts.map +1 -1
- package/dist/question/state.js +276 -5
- package/dist/question/state.js.map +1 -1
- package/dist/question/types.d.ts +1 -0
- package/dist/question/types.d.ts.map +1 -1
- package/dist/question/types.js.map +1 -1
- package/dist/question/ui.d.ts.map +1 -1
- package/dist/question/ui.js +3 -18
- package/dist/question/ui.js.map +1 -1
- package/dist/ralph/__tests__/completion-audit.test.js +39 -0
- package/dist/ralph/__tests__/completion-audit.test.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +111 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/run-test-files.test.js +22 -0
- package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +93 -1
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
- package/dist/scripts/codex-native-pre-post.js +12 -6
- package/dist/scripts/codex-native-pre-post.js.map +1 -1
- package/dist/scripts/run-test-files.js +12 -1
- package/dist/scripts/run-test-files.js.map +1 -1
- package/dist/team/__tests__/approved-execution.test.js +25 -24
- package/dist/team/__tests__/approved-execution.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +173 -26
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/scaling.test.js +66 -17
- package/dist/team/__tests__/scaling.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +42 -0
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/worker-bootstrap.test.js +205 -0
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
- package/dist/team/approved-execution.d.ts +13 -0
- package/dist/team/approved-execution.d.ts.map +1 -1
- package/dist/team/approved-execution.js +65 -30
- package/dist/team/approved-execution.js.map +1 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +28 -24
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +7 -8
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +48 -2
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/ultragoal-context.d.ts +35 -0
- package/dist/team/ultragoal-context.d.ts.map +1 -0
- package/dist/team/ultragoal-context.js +191 -0
- package/dist/team/ultragoal-context.js.map +1 -0
- package/dist/ultragoal/__tests__/docs-contract.test.js +19 -0
- package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
- package/package.json +1 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/skills/plan/SKILL.md +3 -3
- package/plugins/oh-my-codex/skills/ralph/SKILL.md +2 -2
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/team/SKILL.md +6 -0
- package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +11 -0
- package/skills/plan/SKILL.md +3 -3
- package/skills/ralph/SKILL.md +2 -2
- package/skills/ralplan/SKILL.md +1 -1
- package/skills/team/SKILL.md +6 -0
- package/skills/ultragoal/SKILL.md +11 -0
- package/src/scripts/__tests__/codex-native-hook.test.ts +133 -1
- package/src/scripts/__tests__/run-test-files.test.ts +32 -0
- package/src/scripts/codex-native-hook.ts +121 -2
- package/src/scripts/codex-native-pre-post.ts +12 -6
- package/src/scripts/run-test-files.ts +13 -2
- package/dist/planning/__tests__/context-pack-status.test.d.ts +0 -2
- package/dist/planning/__tests__/context-pack-status.test.d.ts.map +0 -1
- package/dist/planning/__tests__/context-pack-status.test.js +0 -795
- package/dist/planning/__tests__/context-pack-status.test.js.map +0 -1
- package/dist/planning/__tests__/ready-context-pack-role-refs.test.d.ts +0 -2
- package/dist/planning/__tests__/ready-context-pack-role-refs.test.d.ts.map +0 -1
- package/dist/planning/__tests__/ready-context-pack-role-refs.test.js +0 -612
- package/dist/planning/__tests__/ready-context-pack-role-refs.test.js.map +0 -1
- package/dist/planning/context-pack-status.d.ts +0 -73
- package/dist/planning/context-pack-status.d.ts.map +0 -1
- package/dist/planning/context-pack-status.js +0 -745
- package/dist/planning/context-pack-status.js.map +0 -1
|
@@ -1,66 +1,21 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, it } from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { createHash } from 'node:crypto';
|
|
4
3
|
import { existsSync } from 'node:fs';
|
|
5
|
-
import { mkdir, mkdtemp,
|
|
4
|
+
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
6
5
|
import { tmpdir } from 'node:os';
|
|
7
|
-
import { join
|
|
8
|
-
import { readApprovedExecutionLaunchHintOutcome, readLatestPlanningArtifacts, } from '../artifacts.js';
|
|
9
|
-
import { buildApprovedTeamExecutionBinding, buildApprovedTeamHandoffSection, } from '../../team/approved-execution.js';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { readApprovedExecutionLaunchHint, readApprovedExecutionLaunchHintOutcome, readLatestPlanningArtifacts, } from '../artifacts.js';
|
|
8
|
+
import { buildApprovedTeamExecutionBinding, buildApprovedTeamHandoffSection, buildUltragoalCheckpointGuidance, } from '../../team/approved-execution.js';
|
|
10
9
|
import { buildRalphAppendInstructions } from '../../cli/ralph.js';
|
|
11
10
|
import { createTeamExecStage } from '../../pipeline/stages/team-exec.js';
|
|
12
|
-
const LIFECYCLE_STATUSES = [
|
|
13
|
-
'missing-baseline',
|
|
14
|
-
'plan-only',
|
|
15
|
-
'incomplete',
|
|
16
|
-
'invalid',
|
|
17
|
-
'ready',
|
|
18
|
-
];
|
|
19
|
-
const READY_ROLE_REFS = {
|
|
20
|
-
scope: ['src/scope.ts'],
|
|
21
|
-
build: ['src/build.ts'],
|
|
22
|
-
verify: ['src/verify.ts'],
|
|
23
|
-
};
|
|
24
11
|
let tempDir;
|
|
25
|
-
function
|
|
26
|
-
|
|
27
|
-
const header = Buffer.from(`blob ${buffer.length}\0`, 'utf-8');
|
|
28
|
-
return createHash('sha1').update(header).update(buffer).digest('hex');
|
|
29
|
-
}
|
|
30
|
-
function relativeToRepo(path) {
|
|
31
|
-
return relative(tempDir, path).replaceAll('\\', '/');
|
|
32
|
-
}
|
|
33
|
-
function canonicalContextPackRelativePath(slug) {
|
|
34
|
-
return `.omx/context/context-20260507T120000Z-${slug}.json`;
|
|
35
|
-
}
|
|
36
|
-
function buildContextPackOutcome(relativePackPath) {
|
|
37
|
-
return [
|
|
38
|
-
'## Context Pack Outcome',
|
|
39
|
-
'',
|
|
40
|
-
`- pack: created \`${relativePackPath}\``,
|
|
41
|
-
].join('\n');
|
|
42
|
-
}
|
|
43
|
-
function decodeRuntimeCliInstructionPayload(instruction) {
|
|
44
|
-
const match = instruction.match(/--input-json-base64\s+([A-Za-z0-9_-]+)/);
|
|
45
|
-
assert.ok(match?.[1], 'expected --input-json-base64 payload');
|
|
46
|
-
return JSON.parse(Buffer.from(match[1], 'base64url').toString('utf-8'));
|
|
47
|
-
}
|
|
48
|
-
function expectedMissingRoles(status) {
|
|
49
|
-
return status === 'incomplete' ? ['build', 'verify'] : [];
|
|
50
|
-
}
|
|
51
|
-
function expectedContextPack(status, packPath) {
|
|
52
|
-
if (status === 'incomplete' || status === 'invalid' || status === 'ready') {
|
|
53
|
-
assert.ok(packPath, `expected pack path for ${status}`);
|
|
54
|
-
return { path: packPath };
|
|
55
|
-
}
|
|
56
|
-
return null;
|
|
12
|
+
async function setup() {
|
|
13
|
+
tempDir = await mkdtemp(join(tmpdir(), 'omx-approved-lifecycle-baseline-'));
|
|
57
14
|
}
|
|
58
|
-
function
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
throw new Error(`expected resolved ${mode} approved-execution outcome`);
|
|
15
|
+
async function cleanup() {
|
|
16
|
+
if (tempDir && existsSync(tempDir)) {
|
|
17
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
62
18
|
}
|
|
63
|
-
return outcome.hint;
|
|
64
19
|
}
|
|
65
20
|
function makeCtx(overrides = {}) {
|
|
66
21
|
return {
|
|
@@ -70,230 +25,117 @@ function makeCtx(overrides = {}) {
|
|
|
70
25
|
...overrides,
|
|
71
26
|
};
|
|
72
27
|
}
|
|
73
|
-
async function
|
|
74
|
-
tempDir = await mkdtemp(join(tmpdir(), 'omx-approved-lifecycle-matrix-'));
|
|
75
|
-
}
|
|
76
|
-
async function cleanup() {
|
|
77
|
-
if (tempDir && existsSync(tempDir)) {
|
|
78
|
-
await rm(tempDir, { recursive: true, force: true });
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
async function writeContextPack(slug, prdPath, testSpecPath, roles) {
|
|
82
|
-
const contextDir = join(tempDir, '.omx', 'context');
|
|
83
|
-
await mkdir(contextDir, { recursive: true });
|
|
84
|
-
const packPath = join(tempDir, canonicalContextPackRelativePath(slug));
|
|
85
|
-
const prdContent = await readFile(prdPath, 'utf-8');
|
|
86
|
-
const testSpecContent = await readFile(testSpecPath, 'utf-8');
|
|
87
|
-
await writeFile(packPath, JSON.stringify({
|
|
88
|
-
slug,
|
|
89
|
-
basis: {
|
|
90
|
-
prd: {
|
|
91
|
-
path: relativeToRepo(prdPath),
|
|
92
|
-
sha1: computeGitBlobSha1(prdContent),
|
|
93
|
-
},
|
|
94
|
-
testSpecs: [{
|
|
95
|
-
path: relativeToRepo(testSpecPath),
|
|
96
|
-
sha1: computeGitBlobSha1(testSpecContent),
|
|
97
|
-
}],
|
|
98
|
-
},
|
|
99
|
-
entries: roles.map((role) => ({
|
|
100
|
-
path: `src/${role}.ts`,
|
|
101
|
-
roles: [role],
|
|
102
|
-
})),
|
|
103
|
-
}, null, 2));
|
|
104
|
-
return packPath;
|
|
105
|
-
}
|
|
106
|
-
async function writeLifecycleFixture(status) {
|
|
28
|
+
async function writePrd(slug, withTestSpec) {
|
|
107
29
|
const plansDir = join(tempDir, '.omx', 'plans');
|
|
108
30
|
await mkdir(plansDir, { recursive: true });
|
|
109
|
-
const prdPath = join(plansDir, `prd-${
|
|
110
|
-
const testSpecPath =
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const ralphTask = status === 'ready' || status === 'plan-only'
|
|
116
|
-
? `Execute ${status} ralph handoff`
|
|
117
|
-
: `Repair ${status} ralph handoff`;
|
|
118
|
-
const ralphCommand = `omx ralph "${ralphTask}"`;
|
|
119
|
-
const prdLines = [
|
|
120
|
-
`# ${status}`,
|
|
31
|
+
const prdPath = join(plansDir, `prd-${slug}.md`);
|
|
32
|
+
const testSpecPath = join(plansDir, `test-spec-${slug}.md`);
|
|
33
|
+
const teamTask = `Execute ${slug} with team`;
|
|
34
|
+
const ralphTask = `Execute ${slug} with ralph`;
|
|
35
|
+
await writeFile(prdPath, [
|
|
36
|
+
`# ${slug}`,
|
|
121
37
|
'',
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
await writeFile(prdPath, prdLines.join('\n'));
|
|
128
|
-
if (testSpecPath) {
|
|
129
|
-
await writeFile(testSpecPath, `# ${status} test spec\n`);
|
|
130
|
-
}
|
|
131
|
-
let packPath = null;
|
|
132
|
-
if (status === 'incomplete') {
|
|
133
|
-
if (!testSpecPath) {
|
|
134
|
-
throw new Error('expected incomplete lifecycle fixture to include a test spec');
|
|
135
|
-
}
|
|
136
|
-
packPath = await writeContextPack(status, prdPath, testSpecPath, ['scope']);
|
|
137
|
-
}
|
|
138
|
-
if (status === 'invalid') {
|
|
139
|
-
if (!testSpecPath) {
|
|
140
|
-
throw new Error('expected invalid lifecycle fixture to include a test spec');
|
|
141
|
-
}
|
|
142
|
-
packPath = await writeContextPack(status, prdPath, testSpecPath, ['scope', 'build', 'verify']);
|
|
143
|
-
await writeFile(testSpecPath, '# invalid drifted test spec\n');
|
|
144
|
-
}
|
|
145
|
-
if (status === 'ready') {
|
|
146
|
-
if (!testSpecPath) {
|
|
147
|
-
throw new Error('expected ready lifecycle fixture to include a test spec');
|
|
148
|
-
}
|
|
149
|
-
packPath = await writeContextPack(status, prdPath, testSpecPath, ['scope', 'build', 'verify']);
|
|
150
|
-
}
|
|
151
|
-
return {
|
|
152
|
-
status,
|
|
153
|
-
prdPath,
|
|
154
|
-
testSpecPath,
|
|
155
|
-
packPath,
|
|
156
|
-
teamTask,
|
|
157
|
-
teamCommand,
|
|
158
|
-
ralphTask,
|
|
159
|
-
ralphCommand,
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
async function runTeamExecForPlan(prdPath) {
|
|
163
|
-
const previousCwd = process.cwd();
|
|
164
|
-
try {
|
|
165
|
-
process.chdir(tmpdir());
|
|
166
|
-
return await createTeamExecStage().run(makeCtx({
|
|
167
|
-
artifacts: {
|
|
168
|
-
ralplan: {
|
|
169
|
-
task: 'original request task',
|
|
170
|
-
stage: 'ralplan',
|
|
171
|
-
latestPlanPath: relativeToRepo(prdPath),
|
|
172
|
-
},
|
|
173
|
-
},
|
|
174
|
-
}));
|
|
175
|
-
}
|
|
176
|
-
finally {
|
|
177
|
-
process.chdir(previousCwd);
|
|
38
|
+
`Launch via omx team 2:executor "${teamTask}"`,
|
|
39
|
+
`Launch via omx ralph "${ralphTask}"`,
|
|
40
|
+
].join('\n'));
|
|
41
|
+
if (withTestSpec) {
|
|
42
|
+
await writeFile(testSpecPath, `# ${slug} test spec\n`);
|
|
178
43
|
}
|
|
44
|
+
return { prdPath, testSpecPath, teamTask, ralphTask };
|
|
179
45
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
assert.
|
|
222
|
-
|
|
223
|
-
const
|
|
224
|
-
const instruction = artifacts.instruction;
|
|
225
|
-
const runtimeCliInput = decodeRuntimeCliInstructionPayload(instruction);
|
|
226
|
-
assert.equal(descriptor.task, fixture.teamTask);
|
|
227
|
-
assert.deepEqual(descriptor.approvedExecution, expectedBinding);
|
|
228
|
-
assert.equal(runtimeCliInput.task, fixture.teamTask);
|
|
229
|
-
assert.deepEqual(runtimeCliInput.approvedExecution, expectedBinding);
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
if (fixture.status === 'plan-only') {
|
|
46
|
+
describe('approved execution lifecycle baseline matrix', () => {
|
|
47
|
+
beforeEach(async () => { await setup(); });
|
|
48
|
+
afterEach(async () => { await cleanup(); });
|
|
49
|
+
it('keeps approved execution absent when the PRD has no matching test-spec baseline', async () => {
|
|
50
|
+
const fixture = await writePrd('missing-baseline', false);
|
|
51
|
+
const selection = readLatestPlanningArtifacts(tempDir);
|
|
52
|
+
assert.equal(selection.prdPath, fixture.prdPath);
|
|
53
|
+
assert.deepEqual(selection.testSpecPaths, []);
|
|
54
|
+
assert.equal(readApprovedExecutionLaunchHintOutcome(tempDir, 'team').status, 'absent');
|
|
55
|
+
assert.equal(readApprovedExecutionLaunchHintOutcome(tempDir, 'ralph').status, 'absent');
|
|
56
|
+
assert.equal(readApprovedExecutionLaunchHint(tempDir, 'team'), null);
|
|
57
|
+
assert.equal(readApprovedExecutionLaunchHint(tempDir, 'ralph'), null);
|
|
58
|
+
const result = await createTeamExecStage().run(makeCtx({ artifacts: { ralplan: { latestPlanPath: fixture.prdPath } } }));
|
|
59
|
+
assert.equal(result.status, 'failed');
|
|
60
|
+
assert.match(result.error ?? '', /team_exec_approved_handoff_missing/);
|
|
61
|
+
});
|
|
62
|
+
it('reuses approved execution only with an explicit PRD and matching test-spec baseline', async () => {
|
|
63
|
+
const fixture = await writePrd('ready-baseline', true);
|
|
64
|
+
const teamOutcome = readApprovedExecutionLaunchHintOutcome(tempDir, 'team');
|
|
65
|
+
assert.equal(teamOutcome.status, 'resolved');
|
|
66
|
+
if (teamOutcome.status !== 'resolved')
|
|
67
|
+
throw new Error('expected ready team hint');
|
|
68
|
+
assert.equal(teamOutcome.hint.sourcePath, fixture.prdPath);
|
|
69
|
+
assert.deepEqual(teamOutcome.hint.testSpecPaths, [fixture.testSpecPath]);
|
|
70
|
+
assert.equal(teamOutcome.hint.task, fixture.teamTask);
|
|
71
|
+
assert.deepEqual(buildApprovedTeamExecutionBinding(teamOutcome.hint), {
|
|
72
|
+
prd_path: fixture.prdPath,
|
|
73
|
+
task: fixture.teamTask,
|
|
74
|
+
command: `omx team 2:executor "${fixture.teamTask}"`,
|
|
75
|
+
});
|
|
76
|
+
assert.match(buildApprovedTeamHandoffSection(teamOutcome.hint) ?? '', /approved plan/i);
|
|
77
|
+
assert.match(buildApprovedTeamHandoffSection(teamOutcome.hint) ?? '', /matching test specs|Test specs/);
|
|
78
|
+
const ralphOutcome = readApprovedExecutionLaunchHintOutcome(tempDir, 'ralph');
|
|
79
|
+
assert.equal(ralphOutcome.status, 'resolved');
|
|
80
|
+
if (ralphOutcome.status !== 'resolved')
|
|
81
|
+
throw new Error('expected ready ralph hint');
|
|
82
|
+
const instructions = buildRalphAppendInstructions(fixture.ralphTask, {
|
|
83
|
+
changedFilesPath: '.omx/ralph/changed-files.txt',
|
|
84
|
+
noDeslop: false,
|
|
85
|
+
approvedHint: ralphOutcome.hint,
|
|
86
|
+
});
|
|
87
|
+
assert.match(instructions, /Approved execution baseline is ready/);
|
|
88
|
+
assert.doesNotMatch(instructions, /context pack/i);
|
|
89
|
+
const result = await createTeamExecStage().run(makeCtx({ artifacts: { ralplan: { latestPlanPath: fixture.prdPath } } }));
|
|
233
90
|
assert.equal(result.status, 'completed');
|
|
234
91
|
const artifacts = result.artifacts;
|
|
235
92
|
const descriptor = artifacts.teamDescriptor;
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
assert.equal(runtimeCliInput.task, fixture.teamTask);
|
|
241
|
-
assert.equal(runtimeCliInput.approvedExecution, null);
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
assert.equal(result.status, 'failed');
|
|
245
|
-
assert.match(result.error ?? '', new RegExp(`team_exec_approved_handoff_nonready:${fixture.status}:.*prd-${fixture.status}\\.md`));
|
|
246
|
-
assert.deepEqual(result.artifacts, {});
|
|
247
|
-
}
|
|
248
|
-
describe('approved execution lifecycle matrix', () => {
|
|
249
|
-
beforeEach(async () => { await setup(); });
|
|
250
|
-
afterEach(async () => { await cleanup(); });
|
|
251
|
-
for (const status of LIFECYCLE_STATUSES) {
|
|
252
|
-
it(`proves ${status} behavior across planning, Ralph, Team, and pipeline boundaries`, async () => {
|
|
253
|
-
const fixture = await writeLifecycleFixture(status);
|
|
254
|
-
const selection = readLatestPlanningArtifacts(tempDir);
|
|
255
|
-
assert.equal(selection.prdPath, fixture.prdPath);
|
|
256
|
-
assert.equal(selection.contextPackStatus, status);
|
|
257
|
-
assert.deepEqual(selection.contextPack, expectedContextPack(status, fixture.packPath));
|
|
258
|
-
assert.deepEqual(selection.contextPackRoleRefs, status === 'ready' ? READY_ROLE_REFS : null);
|
|
259
|
-
assert.deepEqual(selection.missingRequiredContextPackRoles, expectedMissingRoles(status));
|
|
260
|
-
const teamHint = assertResolvedOutcome(readApprovedExecutionLaunchHintOutcome(tempDir, 'team'), 'team');
|
|
261
|
-
assert.equal(teamHint.sourcePath, fixture.prdPath);
|
|
262
|
-
assert.equal(teamHint.task, fixture.teamTask);
|
|
263
|
-
assert.equal(teamHint.command, fixture.teamCommand);
|
|
264
|
-
assert.equal(teamHint.contextPackStatus, status);
|
|
265
|
-
assert.deepEqual(teamHint.contextPack, expectedContextPack(status, fixture.packPath));
|
|
266
|
-
assert.deepEqual(teamHint.contextPackRoleRefs, status === 'ready' ? READY_ROLE_REFS : null);
|
|
267
|
-
assert.deepEqual(teamHint.missingRequiredContextPackRoles, expectedMissingRoles(status));
|
|
268
|
-
const ralphHint = assertResolvedOutcome(readApprovedExecutionLaunchHintOutcome(tempDir, 'ralph'), 'ralph');
|
|
269
|
-
assert.equal(ralphHint.sourcePath, fixture.prdPath);
|
|
270
|
-
assert.equal(ralphHint.task, fixture.ralphTask);
|
|
271
|
-
assert.equal(ralphHint.command, fixture.ralphCommand);
|
|
272
|
-
assert.equal(ralphHint.contextPackStatus, status);
|
|
273
|
-
assert.deepEqual(ralphHint.contextPack, expectedContextPack(status, fixture.packPath));
|
|
274
|
-
assert.deepEqual(ralphHint.contextPackRoleRefs, status === 'ready' ? READY_ROLE_REFS : null);
|
|
275
|
-
assert.deepEqual(ralphHint.missingRequiredContextPackRoles, expectedMissingRoles(status));
|
|
276
|
-
if (status === 'ready') {
|
|
277
|
-
assert.deepEqual(buildApprovedTeamExecutionBinding(teamHint), {
|
|
278
|
-
prd_path: fixture.prdPath,
|
|
279
|
-
task: fixture.teamTask,
|
|
280
|
-
command: fixture.teamCommand,
|
|
281
|
-
});
|
|
282
|
-
assert.match(buildApprovedTeamHandoffSection(teamHint) ?? '', /Build refs \(read first\): src\/build\.ts/);
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
assert.equal(buildApprovedTeamHandoffSection(teamHint), undefined);
|
|
286
|
-
}
|
|
287
|
-
const instructions = buildRalphAppendInstructions(fixture.ralphTask, {
|
|
288
|
-
changedFilesPath: '.omx/ralph/changed-files.txt',
|
|
289
|
-
noDeslop: false,
|
|
290
|
-
approvedHint: ralphHint,
|
|
291
|
-
});
|
|
292
|
-
assertRalphGuidance(status, instructions);
|
|
293
|
-
const result = await runTeamExecForPlan(fixture.prdPath);
|
|
294
|
-
assertTeamExecOutcome(fixture, result);
|
|
93
|
+
assert.deepEqual(descriptor.approvedExecution, {
|
|
94
|
+
prd_path: fixture.prdPath,
|
|
95
|
+
task: fixture.teamTask,
|
|
96
|
+
command: `omx team 2:executor "${fixture.teamTask}"`,
|
|
295
97
|
});
|
|
296
|
-
}
|
|
98
|
+
});
|
|
99
|
+
it('adds leader-owned Ultragoal checkpoint context to approved Team handoffs without breaking launch hint selection', async () => {
|
|
100
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
101
|
+
await mkdir(plansDir, { recursive: true });
|
|
102
|
+
const prdPath = join(plansDir, 'prd-ultragoal-team.md');
|
|
103
|
+
const testSpecPath = join(plansDir, 'test-spec-ultragoal-team.md');
|
|
104
|
+
const teamTask = 'Use Team + Ultragoal together for G001-team-runtime-bridge';
|
|
105
|
+
await writeFile(prdPath, [
|
|
106
|
+
'# Ultragoal Team bridge',
|
|
107
|
+
'',
|
|
108
|
+
'Active ultragoal story: G001-team-runtime-bridge in .omx/ultragoal/goals.json.',
|
|
109
|
+
'Team returns evidence for .omx/ultragoal/ledger.jsonl; the leader checkpoints with a fresh get_goal snapshot.',
|
|
110
|
+
'',
|
|
111
|
+
`Launch via omx team 3:executor "${teamTask}"`,
|
|
112
|
+
'Use Ralph only for a later sequential single-owner verification/fix loop.',
|
|
113
|
+
].join('\n'));
|
|
114
|
+
await writeFile(testSpecPath, '# Ultragoal Team bridge test spec\n');
|
|
115
|
+
const teamOutcome = readApprovedExecutionLaunchHintOutcome(tempDir, 'team', {
|
|
116
|
+
prdPath,
|
|
117
|
+
task: teamTask,
|
|
118
|
+
});
|
|
119
|
+
assert.equal(teamOutcome.status, 'resolved');
|
|
120
|
+
if (teamOutcome.status !== 'resolved')
|
|
121
|
+
throw new Error('expected ultragoal team hint');
|
|
122
|
+
const guidance = buildUltragoalCheckpointGuidance(teamOutcome.hint);
|
|
123
|
+
assert.equal(guidance?.goal_id, 'G001-team-runtime-bridge');
|
|
124
|
+
assert.equal(guidance?.checkpoint_policy, 'fresh_leader_get_goal_required');
|
|
125
|
+
assert.match(guidance?.checkpoint_command_template ?? '', /verified \.omx\/ultragoal\/goals\.json context/);
|
|
126
|
+
const section = buildApprovedTeamHandoffSection(teamOutcome.hint) ?? '';
|
|
127
|
+
assert.match(section, /Approved-plan Ultragoal hint/);
|
|
128
|
+
assert.match(section, /\.omx\/ultragoal\/goals\.json/);
|
|
129
|
+
assert.match(section, /\.omx\/ultragoal\/ledger\.jsonl/);
|
|
130
|
+
assert.match(section, /Team workers provide task\/evidence updates only/i);
|
|
131
|
+
assert.match(section, /No checkpoint command is emitted from approved-plan hints/i);
|
|
132
|
+
assert.doesNotMatch(section, /omx ultragoal checkpoint --goal-id/i);
|
|
133
|
+
assert.doesNotMatch(section, /auto[- ]launch.*team/i);
|
|
134
|
+
const ralphOutcome = readApprovedExecutionLaunchHintOutcome(tempDir, 'ralph', {
|
|
135
|
+
prdPath,
|
|
136
|
+
});
|
|
137
|
+
assert.equal(ralphOutcome.status, 'absent');
|
|
138
|
+
});
|
|
297
139
|
it('keeps same-task team selector outcomes fail-closed when launch hints are ambiguous', async () => {
|
|
298
140
|
const plansDir = join(tempDir, '.omx', 'plans');
|
|
299
141
|
await mkdir(plansDir, { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approved-execution-lifecycle-matrix.test.js","sourceRoot":"","sources":["../../../src/planning/__tests__/approved-execution-lifecycle-matrix.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,sCAAsC,EACtC,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iCAAiC,EACjC,+BAA+B,GAChC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAuBzE,MAAM,kBAAkB,GAA+B;IACrD,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,SAAS;IACT,OAAO;CACR,CAAC;AAEF,MAAM,eAAe,GAAG;IACtB,KAAK,EAAE,CAAC,cAAc,CAAC;IACvB,KAAK,EAAE,CAAC,cAAc,CAAC;IACvB,MAAM,EAAE,CAAC,eAAe,CAAC;CAC1B,CAAC;AAEF,IAAI,OAAe,CAAC;AAEpB,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,MAAM,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/D,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,gCAAgC,CAAC,IAAY;IACpD,OAAO,yCAAyC,IAAI,OAAO,CAAC;AAC9D,CAAC;AAED,SAAS,uBAAuB,CAAC,gBAAwB;IACvD,OAAO;QACL,yBAAyB;QACzB,EAAE;QACF,qBAAqB,gBAAgB,IAAI;KAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,kCAAkC,CAAC,WAAmB;IAC7D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC1E,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,sCAAsC,CAAC,CAAC;IAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA4B,CAAC;AACrG,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAuB;IACnD,OAAO,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAuB,EAAE,QAAuB;IAC3E,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QAC1E,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,0BAA0B,MAAM,EAAE,CAAC,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAkE,EAClE,IAAsB;IAEtB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,6BAA6B,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,SAAS,OAAO,CAAC,YAAmC,EAAE;IACpD,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,SAAS,EAAE,EAAE;QACb,GAAG,EAAE,OAAO;QACZ,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,KAAK;IAClB,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gCAAgC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,IAAI,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,IAAY,EACZ,OAAe,EACf,YAAoB,EACpB,KAAiC;IAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACpD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;QACvC,IAAI;QACJ,KAAK,EAAE;YACL,GAAG,EAAE;gBACH,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC;gBAC7B,IAAI,EAAE,kBAAkB,CAAC,UAAU,CAAC;aACrC;YACD,SAAS,EAAE,CAAC;oBACV,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC;oBAClC,IAAI,EAAE,kBAAkB,CAAC,eAAe,CAAC;iBAC1C,CAAC;SACH;QACD,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5B,IAAI,EAAE,OAAO,IAAI,KAAK;YACtB,KAAK,EAAE,CAAC,IAAI,CAAC;SACd,CAAC,CAAC;KACJ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACb,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,MAAuB;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,MAAM,KAAK,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,MAAM,KAAK,kBAAkB;QAChD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,MAAM,KAAK,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,WAAW,MAAM,eAAe,CAAC;IAClD,MAAM,WAAW,GAAG,wBAAwB,QAAQ,GAAG,CAAC;IACxD,MAAM,SAAS,GAAG,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,WAAW;QAC5D,CAAC,CAAC,WAAW,MAAM,gBAAgB;QACnC,CAAC,CAAC,UAAU,MAAM,gBAAgB,CAAC;IACrC,MAAM,YAAY,GAAG,cAAc,SAAS,GAAG,CAAC;IAEhD,MAAM,QAAQ,GAAG;QACf,KAAK,MAAM,EAAE;QACb,EAAE;KACH,CAAC;IACF,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QAC1E,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,gCAAgC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACzC,MAAM,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE9C,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,SAAS,CAAC,YAAY,EAAE,KAAK,MAAM,cAAc,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QACD,QAAQ,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,QAAQ,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/F,MAAM,SAAS,CAAC,YAAY,EAAE,+BAA+B,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,QAAQ,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjG,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO;QACP,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,SAAS;QACT,YAAY;KACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAe;IAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACxB,OAAO,MAAM,mBAAmB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC;YAC7C,SAAS,EAAE;gBACT,OAAO,EAAE;oBACP,IAAI,EAAE,uBAAuB;oBAC7B,KAAK,EAAE,SAAS;oBAChB,cAAc,EAAE,cAAc,CAAC,OAAO,CAAC;iBACxC;aACF;SACF,CAAC,CAAC,CAAC;IACN,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAuB,EAAE,YAAoB;IACxE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,kBAAkB;YACrB,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YACzD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,yDAAyD,CAAC,CAAC;YACtF,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YAChE,OAAO;QACT,KAAK,WAAW;YACd,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,8CAA8C,CAAC,CAAC;YAC3E,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YAChE,OAAO;QACT,KAAK,YAAY;YACf,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,gDAAgD,CAAC,CAAC;YAC7E,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YACzD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,4EAA4E,CAAC,CAAC;YACzG,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YAChE,OAAO;QACT,KAAK,SAAS;YACZ,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,+BAA+B,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,gDAAgD,CAAC,CAAC;YAC7E,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YAChE,OAAO;QACT,KAAK,OAAO;YACV,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,gEAAgE,CAAC,CAAC;YAC7F,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,4CAA4C,CAAC,CAAC;YACzE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,4DAA4D,CAAC,CAAC;YACzF,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YAChE,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,gDAAgD,CAAC,CAAC;YACpF,OAAO;QACT;YACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAyB,EACzB,MAA0E;IAE1E,MAAM,eAAe,GAAG;QACtB,QAAQ,EAAE,OAAO,CAAC,OAAO;QACzB,IAAI,EAAE,OAAO,CAAC,QAAQ;QACtB,OAAO,EAAE,OAAO,CAAC,WAAW;KAC7B,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAoC,CAAC;QAC9D,MAAM,UAAU,GAAG,SAAS,CAAC,cAAyC,CAAC;QACvE,MAAM,WAAW,GAAG,SAAS,CAAC,WAAqB,CAAC;QACpD,MAAM,eAAe,GAAG,kCAAkC,CAAC,WAAW,CAAC,CAAC;QAExE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAoC,CAAC;QAC9D,MAAM,UAAU,GAAG,SAAS,CAAC,cAAyC,CAAC;QACvE,MAAM,WAAW,GAAG,SAAS,CAAC,WAAqB,CAAC;QACpD,MAAM,eAAe,GAAG,kCAAkC,CAAC,WAAW,CAAC,CAAC;QAExE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,KAAK,IAAI,EAAE,EAClB,IAAI,MAAM,CAAC,uCAAuC,OAAO,CAAC,MAAM,UAAU,OAAO,CAAC,MAAM,OAAO,CAAC,CACjG,CAAC;IACF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,UAAU,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,SAAS,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5C,KAAK,MAAM,MAAM,IAAI,kBAAkB,EAAE,CAAC;QACxC,EAAE,CAAC,UAAU,MAAM,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/F,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvF,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7F,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE1F,MAAM,QAAQ,GAAG,qBAAqB,CACpC,sCAAsC,CAAC,OAAO,EAAE,MAAM,CAAC,EACvD,MAAM,CACP,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtF,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5F,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;YAEzF,MAAM,SAAS,GAAG,qBAAqB,CACrC,sCAAsC,CAAC,OAAO,EAAE,OAAO,CAAC,EACxD,OAAO,CACR,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvF,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7F,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE1F,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,MAAM,CAAC,SAAS,CAAC,iCAAiC,CAAC,QAAQ,CAAC,EAAE;oBAC5D,QAAQ,EAAE,OAAO,CAAC,OAAO;oBACzB,IAAI,EAAE,OAAO,CAAC,QAAQ;oBACtB,OAAO,EAAE,OAAO,CAAC,WAAW;iBAC7B,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,CACV,+BAA+B,CAAC,QAAQ,CAAC,IAAI,EAAE,EAC/C,2CAA2C,CAC5C,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YACrE,CAAC;YAED,MAAM,YAAY,GAAG,4BAA4B,CAAC,OAAO,CAAC,SAAS,EAAE;gBACnE,gBAAgB,EAAE,8BAA8B;gBAChD,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,SAAS;aACxB,CAAC,CAAC;YACH,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAE1C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACzD,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,gCAAgC,CAAC;QACpD,MAAM,SAAS,CACb,OAAO,EACP;YACE,kBAAkB;YAClB,EAAE;YACF,mCAAmC,UAAU,GAAG;YAChD,mCAAmC,UAAU,GAAG;SACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,6BAA6B,CAAC,EAAE,8BAA8B,CAAC,CAAC;QAE/F,MAAM,OAAO,GAAG,sCAAsC,CAAC,OAAO,EAAE,MAAM,EAAE;YACtE,OAAO;YACP,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"approved-execution-lifecycle-matrix.test.js","sourceRoot":"","sources":["../../../src/planning/__tests__/approved-execution-lifecycle-matrix.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,+BAA+B,EAC/B,sCAAsC,EACtC,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iCAAiC,EACjC,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAGzE,IAAI,OAAe,CAAC;AAEpB,KAAK,UAAU,KAAK;IAClB,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kCAAkC,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,IAAI,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,YAAmC,EAAE;IACpD,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,SAAS,EAAE,EAAE;QACb,GAAG,EAAE,OAAO;QACZ,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,YAAqB;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,IAAI,KAAK,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,WAAW,IAAI,YAAY,CAAC;IAC7C,MAAM,SAAS,GAAG,WAAW,IAAI,aAAa,CAAC;IAC/C,MAAM,SAAS,CACb,OAAO,EACP;QACE,KAAK,IAAI,EAAE;QACX,EAAE;QACF,mCAAmC,QAAQ,GAAG;QAC9C,yBAAyB,SAAS,GAAG;KACtC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACF,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,SAAS,CAAC,YAAY,EAAE,KAAK,IAAI,cAAc,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACxD,CAAC;AAED,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,UAAU,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,SAAS,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5C,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAE1D,MAAM,SAAS,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAE9C,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvF,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACxF,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACzH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,oCAAoC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAEvD,MAAM,WAAW,GAAG,sCAAsC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC7C,IAAI,WAAW,CAAC,MAAM,KAAK,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACnF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,CAAC,SAAS,CAAC,iCAAiC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YACpE,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,IAAI,EAAE,OAAO,CAAC,QAAQ;YACtB,OAAO,EAAE,wBAAwB,OAAO,CAAC,QAAQ,GAAG;SACrD,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACxF,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,gCAAgC,CAAC,CAAC;QAExG,MAAM,YAAY,GAAG,sCAAsC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC9C,IAAI,YAAY,CAAC,MAAM,KAAK,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACrF,MAAM,YAAY,GAAG,4BAA4B,CAAC,OAAO,CAAC,SAAS,EAAE;YACnE,gBAAgB,EAAE,8BAA8B;YAChD,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,YAAY,CAAC,IAAI;SAChC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,sCAAsC,CAAC,CAAC;QACnE,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACzH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAoC,CAAC;QAC9D,MAAM,UAAU,GAAG,SAAS,CAAC,cAAyC,CAAC;QACvE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,iBAAiB,EAAE;YAC7C,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,IAAI,EAAE,OAAO,CAAC,QAAQ;YACtB,OAAO,EAAE,wBAAwB,OAAO,CAAC,QAAQ,GAAG;SACrD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iHAAiH,EAAE,KAAK,IAAI,EAAE;QAC/H,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,4DAA4D,CAAC;QAC9E,MAAM,SAAS,CACb,OAAO,EACP;YACE,yBAAyB;YACzB,EAAE;YACF,gFAAgF;YAChF,+GAA+G;YAC/G,EAAE;YACF,mCAAmC,QAAQ,GAAG;YAC9C,2EAA2E;SAC5E,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,SAAS,CAAC,YAAY,EAAE,qCAAqC,CAAC,CAAC;QAErE,MAAM,WAAW,GAAG,sCAAsC,CAAC,OAAO,EAAE,MAAM,EAAE;YAC1E,OAAO;YACP,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC7C,IAAI,WAAW,CAAC,MAAM,KAAK,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAEvF,MAAM,QAAQ,GAAG,gCAAgC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,iBAAiB,EAAE,gCAAgC,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,2BAA2B,IAAI,EAAE,EAAE,gDAAgD,CAAC,CAAC;QAE5G,MAAM,OAAO,GAAG,+BAA+B,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,iCAAiC,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,mDAAmD,CAAC,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,4DAA4D,CAAC,CAAC;QACpF,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,qCAAqC,CAAC,CAAC;QACpE,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;QAEtD,MAAM,YAAY,GAAG,sCAAsC,CAAC,OAAO,EAAE,OAAO,EAAE;YAC5E,OAAO;SACR,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,gCAAgC,CAAC;QACpD,MAAM,SAAS,CACb,OAAO,EACP;YACE,kBAAkB;YAClB,EAAE;YACF,mCAAmC,UAAU,GAAG;YAChD,mCAAmC,UAAU,GAAG;SACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,6BAA6B,CAAC,EAAE,8BAA8B,CAAC,CAAC;QAE/F,MAAM,OAAO,GAAG,sCAAsC,CAAC,OAAO,EAAE,MAAM,EAAE;YACtE,OAAO;YACP,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -133,77 +133,49 @@ function selectUniqueHint(visibleHints, query, signatureFilter) {
|
|
|
133
133
|
}
|
|
134
134
|
return { status: 'unique', hint: matches[0] };
|
|
135
135
|
}
|
|
136
|
+
function reusableRalphHints(state) {
|
|
137
|
+
return ralphVisibleHints(state).filter((hint) => hint.ready);
|
|
138
|
+
}
|
|
136
139
|
function resolveExpectedRalphSelection(stems, states, query) {
|
|
137
|
-
const newestNonready = [];
|
|
138
140
|
if (!query.task && !query.command) {
|
|
139
141
|
const latestIndex = states.length - 1;
|
|
140
|
-
const latestSelection = selectUniqueHint(
|
|
142
|
+
const latestSelection = selectUniqueHint(reusableRalphHints(states[latestIndex]), query);
|
|
141
143
|
if (latestSelection.status === 'ambiguous') {
|
|
142
144
|
return { status: 'ambiguous' };
|
|
143
145
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
if (latestSelection.hint.ready) {
|
|
148
|
-
return { status: 'resolved', stem: stems[latestIndex], hint: latestSelection.hint };
|
|
149
|
-
}
|
|
150
|
-
for (let index = latestIndex - 1; index >= 0; index -= 1) {
|
|
151
|
-
const selection = selectUniqueHint(ralphVisibleHints(states[index]), { task: latestSelection.hint.task });
|
|
152
|
-
if (selection.status === 'ambiguous') {
|
|
153
|
-
return { status: 'ambiguous' };
|
|
154
|
-
}
|
|
155
|
-
if (selection.status === 'unique' && selection.hint.ready) {
|
|
156
|
-
return { status: 'resolved', stem: stems[index], hint: selection.hint };
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return { status: 'resolved', stem: stems[latestIndex], hint: latestSelection.hint };
|
|
146
|
+
return latestSelection.status === 'unique'
|
|
147
|
+
? { status: 'resolved', stem: stems[latestIndex], hint: latestSelection.hint }
|
|
148
|
+
: { status: 'absent' };
|
|
160
149
|
}
|
|
161
150
|
for (let index = states.length - 1; index >= 0; index -= 1) {
|
|
162
|
-
const selection = selectUniqueHint(
|
|
151
|
+
const selection = selectUniqueHint(reusableRalphHints(states[index]), query);
|
|
163
152
|
if (selection.status === 'ambiguous') {
|
|
164
153
|
return { status: 'ambiguous' };
|
|
165
154
|
}
|
|
166
|
-
if (selection.status
|
|
167
|
-
continue;
|
|
168
|
-
}
|
|
169
|
-
if (selection.hint.ready) {
|
|
155
|
+
if (selection.status === 'unique') {
|
|
170
156
|
return { status: 'resolved', stem: stems[index], hint: selection.hint };
|
|
171
157
|
}
|
|
172
|
-
newestNonready.push({ stem: stems[index], hint: selection.hint });
|
|
173
158
|
}
|
|
174
|
-
return
|
|
175
|
-
|
|
176
|
-
|
|
159
|
+
return { status: 'absent' };
|
|
160
|
+
}
|
|
161
|
+
function reusableTeamHints(state) {
|
|
162
|
+
return teamVisibleHints(state).filter((hint) => hint.ready);
|
|
177
163
|
}
|
|
178
164
|
function resolveExpectedTeamSelection(stems, states, query) {
|
|
179
165
|
const requestedSignature = query.command ? undefined : query.signature;
|
|
180
166
|
if (!query.task && !query.command) {
|
|
181
167
|
const latestIndex = states.length - 1;
|
|
182
|
-
const latestSelection = selectUniqueHint(
|
|
168
|
+
const latestSelection = selectUniqueHint(reusableTeamHints(states[latestIndex]), query, requestedSignature);
|
|
183
169
|
if (latestSelection.status === 'ambiguous') {
|
|
184
170
|
return { status: 'ambiguous' };
|
|
185
171
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
if (latestSelection.hint.ready) {
|
|
190
|
-
return { status: 'resolved', stem: stems[latestIndex], hint: latestSelection.hint };
|
|
191
|
-
}
|
|
192
|
-
for (let index = latestIndex - 1; index >= 0; index -= 1) {
|
|
193
|
-
const selection = selectUniqueHint(teamVisibleHints(states[index]), { task: latestSelection.hint.task }, latestSelection.hint.signature);
|
|
194
|
-
if (selection.status === 'ambiguous') {
|
|
195
|
-
return { status: 'ambiguous' };
|
|
196
|
-
}
|
|
197
|
-
if (selection.status === 'unique' && selection.hint.ready) {
|
|
198
|
-
return { status: 'resolved', stem: stems[index], hint: selection.hint };
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
return { status: 'resolved', stem: stems[latestIndex], hint: latestSelection.hint };
|
|
172
|
+
return latestSelection.status === 'unique'
|
|
173
|
+
? { status: 'resolved', stem: stems[latestIndex], hint: latestSelection.hint }
|
|
174
|
+
: { status: 'absent' };
|
|
202
175
|
}
|
|
203
|
-
let newestNonready = null;
|
|
204
176
|
let lineageSignature = null;
|
|
205
177
|
for (let index = states.length - 1; index >= 0; index -= 1) {
|
|
206
|
-
const selection = selectUniqueHint(
|
|
178
|
+
const selection = selectUniqueHint(reusableTeamHints(states[index]), query, requestedSignature ?? (query.task && !query.command
|
|
207
179
|
? lineageSignature ?? undefined
|
|
208
180
|
: undefined));
|
|
209
181
|
if (selection.status === 'ambiguous') {
|
|
@@ -215,14 +187,9 @@ function resolveExpectedTeamSelection(stems, states, query) {
|
|
|
215
187
|
if (query.task && !query.command) {
|
|
216
188
|
lineageSignature ??= selection.hint.signature ?? null;
|
|
217
189
|
}
|
|
218
|
-
|
|
219
|
-
return { status: 'resolved', stem: stems[index], hint: selection.hint };
|
|
220
|
-
}
|
|
221
|
-
newestNonready ??= { stem: stems[index], hint: selection.hint };
|
|
190
|
+
return { status: 'resolved', stem: stems[index], hint: selection.hint };
|
|
222
191
|
}
|
|
223
|
-
return
|
|
224
|
-
? { status: 'resolved', stem: newestNonready.stem, hint: newestNonready.hint }
|
|
225
|
-
: { status: 'absent' };
|
|
192
|
+
return { status: 'absent' };
|
|
226
193
|
}
|
|
227
194
|
function ralphQueryModel(kind) {
|
|
228
195
|
switch (kind) {
|
|
@@ -374,7 +341,7 @@ function assertExpectedSelection(cwd, label, mode, options, expected) {
|
|
|
374
341
|
}
|
|
375
342
|
assert.equal(outcome.hint.sourcePath, planPath(cwd, expected.stem), `${label}: unexpected selected PRD`);
|
|
376
343
|
assert.equal(outcome.hint.command, expected.hint?.command, `${label}: unexpected selected command`);
|
|
377
|
-
assert.
|
|
344
|
+
assert.deepEqual(outcome.hint.testSpecPaths.length > 0, true, `${label}: unexpected baseline readiness`);
|
|
378
345
|
if (mode === 'team') {
|
|
379
346
|
assert.equal(outcome.hint.workerCount, expected.hint?.signature === 'A' ? 3 : 5, `${label}: unexpected worker count`);
|
|
380
347
|
assert.equal(outcome.hint.agentType, expected.hint?.signature === 'A' ? 'executor' : 'debugger', `${label}: unexpected agent type`);
|
|
@@ -443,38 +410,30 @@ describe('approved launch hint lineage matrix', () => {
|
|
|
443
410
|
}
|
|
444
411
|
}
|
|
445
412
|
});
|
|
446
|
-
it('
|
|
413
|
+
it('treats newer no-baseline Ralph siblings as absent for bare lookups', async () => {
|
|
447
414
|
const cwd = join(tempDir, 'ralph-three-plan-skip');
|
|
448
415
|
await writeRalphScenario(cwd, ['ready', 'nonready', 'nonready']);
|
|
449
|
-
assertExpectedSelection(cwd, 'ralph three-plan
|
|
450
|
-
status: 'resolved',
|
|
451
|
-
stem: 'alpha',
|
|
452
|
-
hint: { command: RALPH_COMMAND, task: RALPH_SHARED_TASK, ready: true },
|
|
453
|
-
});
|
|
416
|
+
assertExpectedSelection(cwd, 'ralph three-plan no-baseline bare', 'ralph', {}, { status: 'absent' });
|
|
454
417
|
});
|
|
455
|
-
it('
|
|
418
|
+
it('counts same-lineage ambiguity only among baseline-ready Team candidates', async () => {
|
|
456
419
|
const cwd = join(tempDir, 'team-three-plan-ambiguous');
|
|
457
420
|
await writeTeamScenario(cwd, ['readyA', 'nonreadyAA', 'nonreadyA']);
|
|
458
|
-
assertExpectedSelection(cwd, 'team three-plan ambiguity', 'team', { task: TEAM_SHARED_TASK }, {
|
|
421
|
+
assertExpectedSelection(cwd, 'team three-plan baseline-only ambiguity', 'team', { task: TEAM_SHARED_TASK }, {
|
|
422
|
+
status: 'resolved',
|
|
423
|
+
stem: 'alpha',
|
|
424
|
+
hint: { command: TEAM_COMMANDS.A, task: TEAM_SHARED_TASK, ready: true, signature: 'A' },
|
|
425
|
+
});
|
|
459
426
|
});
|
|
460
427
|
it('keeps hidden lineage candidates invisible even for exact-command lookups', async () => {
|
|
461
428
|
{
|
|
462
429
|
const cwd = join(tempDir, 'ralph-hidden-command');
|
|
463
430
|
await writeRalphScenario(cwd, ['hidden', 'nonready']);
|
|
464
|
-
assertExpectedSelection(cwd, 'ralph hidden exact command', 'ralph', ralphQueryOptions('command'), {
|
|
465
|
-
status: 'resolved',
|
|
466
|
-
stem: 'beta',
|
|
467
|
-
hint: { command: RALPH_COMMAND, task: RALPH_SHARED_TASK, ready: false },
|
|
468
|
-
});
|
|
431
|
+
assertExpectedSelection(cwd, 'ralph hidden exact command', 'ralph', ralphQueryOptions('command'), { status: 'absent' });
|
|
469
432
|
}
|
|
470
433
|
{
|
|
471
434
|
const cwd = join(tempDir, 'team-hidden-command');
|
|
472
435
|
await writeTeamScenario(cwd, ['hiddenA', 'nonreadyA']);
|
|
473
|
-
assertExpectedSelection(cwd, 'team hidden exact command', 'team', teamQueryOptions('commandA'), {
|
|
474
|
-
status: 'resolved',
|
|
475
|
-
stem: 'beta',
|
|
476
|
-
hint: { command: TEAM_COMMANDS.A, task: TEAM_SHARED_TASK, ready: false, signature: 'A' },
|
|
477
|
-
});
|
|
436
|
+
assertExpectedSelection(cwd, 'team hidden exact command', 'team', teamQueryOptions('commandA'), { status: 'absent' });
|
|
478
437
|
}
|
|
479
438
|
});
|
|
480
439
|
});
|