oh-my-codex 0.8.6 → 0.8.7
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/README.md +16 -1
- package/dist/agents/definitions.js +7 -7
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/native-config.d.ts.map +1 -1
- package/dist/agents/native-config.js +18 -6
- package/dist/agents/native-config.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +9 -6
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/package-bin-contract.test.d.ts +2 -0
- package/dist/cli/__tests__/package-bin-contract.test.d.ts.map +1 -0
- package/dist/cli/__tests__/package-bin-contract.test.js +29 -0
- package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +9 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/config/__tests__/generator-notify.test.js +3 -4
- package/dist/config/__tests__/generator-notify.test.js.map +1 -1
- package/dist/config/generator.js +1 -1
- package/dist/config/generator.js.map +1 -1
- package/dist/hooks/__tests__/prompt-guidance-catalog.test.js +5 -38
- package/dist/hooks/__tests__/prompt-guidance-catalog.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-guidance-contract.test.js +6 -51
- package/dist/hooks/__tests__/prompt-guidance-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-guidance-fragments.test.d.ts +2 -0
- package/dist/hooks/__tests__/prompt-guidance-fragments.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/prompt-guidance-fragments.test.js +45 -0
- package/dist/hooks/__tests__/prompt-guidance-fragments.test.js.map +1 -0
- package/dist/hooks/__tests__/prompt-guidance-scenarios.test.js +7 -26
- package/dist/hooks/__tests__/prompt-guidance-scenarios.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-guidance-test-helpers.d.ts +4 -0
- package/dist/hooks/__tests__/prompt-guidance-test-helpers.d.ts.map +1 -0
- package/dist/hooks/__tests__/prompt-guidance-test-helpers.js +16 -0
- package/dist/hooks/__tests__/prompt-guidance-test-helpers.js.map +1 -0
- package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +19 -47
- package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-orchestration-boundary.test.d.ts +2 -0
- package/dist/hooks/__tests__/prompt-orchestration-boundary.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/prompt-orchestration-boundary.test.js +37 -0
- package/dist/hooks/__tests__/prompt-orchestration-boundary.test.js.map +1 -0
- package/dist/hooks/__tests__/skill-guidance-contract.test.js +5 -25
- package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -1
- package/dist/hooks/prompt-guidance-contract.d.ts +14 -0
- package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -0
- package/dist/hooks/prompt-guidance-contract.js +160 -0
- package/dist/hooks/prompt-guidance-contract.js.map +1 -0
- package/dist/mcp/__tests__/bootstrap.test.js +51 -13
- package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
- package/dist/mcp/__tests__/code-intel-server.test.js +4 -3
- package/dist/mcp/__tests__/code-intel-server.test.js.map +1 -1
- package/dist/mcp/__tests__/memory-server.test.js +4 -2
- package/dist/mcp/__tests__/memory-server.test.js.map +1 -1
- package/dist/mcp/__tests__/server-lifecycle.test.d.ts +2 -0
- package/dist/mcp/__tests__/server-lifecycle.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/server-lifecycle.test.js +159 -0
- package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -0
- package/dist/mcp/bootstrap.d.ts +7 -0
- package/dist/mcp/bootstrap.d.ts.map +1 -1
- package/dist/mcp/bootstrap.js +51 -0
- package/dist/mcp/bootstrap.js.map +1 -1
- package/dist/mcp/code-intel-server.js +4 -7
- package/dist/mcp/code-intel-server.js.map +1 -1
- package/dist/mcp/memory-server.js +2 -6
- package/dist/mcp/memory-server.js.map +1 -1
- package/dist/mcp/state-server.d.ts.map +1 -1
- package/dist/mcp/state-server.js +2 -6
- package/dist/mcp/state-server.js.map +1 -1
- package/dist/mcp/team-server.d.ts.map +1 -1
- package/dist/mcp/team-server.js +2 -6
- package/dist/mcp/team-server.js.map +1 -1
- package/dist/mcp/trace-server.d.ts.map +1 -1
- package/dist/mcp/trace-server.js +2 -6
- package/dist/mcp/trace-server.js.map +1 -1
- package/dist/team/__tests__/hardening-e2e.test.d.ts +2 -0
- package/dist/team/__tests__/hardening-e2e.test.d.ts.map +1 -0
- package/dist/team/__tests__/hardening-e2e.test.js +71 -0
- package/dist/team/__tests__/hardening-e2e.test.js.map +1 -0
- package/dist/team/__tests__/model-contract.test.js +9 -6
- package/dist/team/__tests__/model-contract.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +34 -6
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/state.test.js +28 -1
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/team-ops-contract.test.js +1 -0
- package/dist/team/__tests__/team-ops-contract.test.js.map +1 -1
- package/dist/team/__tests__/worktree.test.js +22 -0
- package/dist/team/__tests__/worktree.test.js.map +1 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +27 -13
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/state/tasks.d.ts +2 -1
- package/dist/team/state/tasks.d.ts.map +1 -1
- package/dist/team/state/tasks.js +46 -5
- package/dist/team/state/tasks.js.map +1 -1
- package/dist/team/state/types.d.ts +8 -0
- package/dist/team/state/types.d.ts.map +1 -1
- package/dist/team/state/types.js.map +1 -1
- package/dist/team/state.d.ts +9 -0
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +14 -1
- package/dist/team/state.js.map +1 -1
- package/dist/team/team-ops.d.ts +2 -1
- package/dist/team/team-ops.d.ts.map +1 -1
- package/dist/team/team-ops.js +1 -0
- package/dist/team/team-ops.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +3 -2
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worktree.d.ts.map +1 -1
- package/dist/team/worktree.js +14 -0
- package/dist/team/worktree.js.map +1 -1
- package/package.json +2 -2
- package/prompts/analyst.md +56 -42
- package/prompts/api-reviewer.md +42 -38
- package/prompts/architect.md +53 -47
- package/prompts/build-fixer.md +45 -32
- package/prompts/code-reviewer.md +53 -46
- package/prompts/code-simplifier.md +128 -97
- package/prompts/critic.md +49 -34
- package/prompts/debugger.md +50 -38
- package/prompts/dependency-expert.md +50 -34
- package/prompts/designer.md +52 -41
- package/prompts/executor.md +96 -71
- package/prompts/explore.md +57 -47
- package/prompts/git-master.md +43 -32
- package/prompts/information-architect.md +101 -67
- package/prompts/performance-reviewer.md +41 -37
- package/prompts/planner.md +68 -53
- package/prompts/product-analyst.md +69 -76
- package/prompts/product-manager.md +85 -107
- package/prompts/qa-tester.md +43 -32
- package/prompts/quality-reviewer.md +51 -45
- package/prompts/quality-strategist.md +116 -81
- package/prompts/researcher.md +47 -36
- package/prompts/security-reviewer.md +54 -48
- package/prompts/sisyphus-lite.md +145 -0
- package/prompts/style-reviewer.md +40 -36
- package/prompts/test-engineer.md +53 -40
- package/prompts/ux-researcher.md +98 -65
- package/prompts/verifier.md +48 -33
- package/prompts/vision.md +44 -32
- package/prompts/writer.md +44 -32
- package/scripts/dev-refresh-prompts.sh +83 -0
- package/scripts/dev-watch-prompts.sh +139 -0
- package/scripts/sync-prompt-guidance-fragments.js +51 -0
- package/scripts/team-hardening-benchmark.mjs +90 -0
- package/templates/AGENTS.md +14 -2
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { mkdtemp, rm, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { execFileSync } from 'node:child_process';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { performance } from 'node:perf_hooks';
|
|
7
|
+
|
|
8
|
+
import { initTeamState, createTask, claimTask, readTask, writeAtomic } from '../dist/team/state.js';
|
|
9
|
+
import { monitorTeam } from '../dist/team/runtime.js';
|
|
10
|
+
import { planWorktreeTarget, ensureWorktree } from '../dist/team/worktree.js';
|
|
11
|
+
|
|
12
|
+
async function initRepo() {
|
|
13
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-team-bench-repo-'));
|
|
14
|
+
execFileSync('git', ['init'], { cwd, stdio: 'ignore' });
|
|
15
|
+
execFileSync('git', ['config', 'user.email', 'test@example.com'], { cwd, stdio: 'ignore' });
|
|
16
|
+
execFileSync('git', ['config', 'user.name', 'Test User'], { cwd, stdio: 'ignore' });
|
|
17
|
+
await writeFile(join(cwd, 'README.md'), 'hello\n', 'utf-8');
|
|
18
|
+
execFileSync('git', ['add', 'README.md'], { cwd, stdio: 'ignore' });
|
|
19
|
+
execFileSync('git', ['commit', '-m', 'init'], { cwd, stdio: 'ignore' });
|
|
20
|
+
return cwd;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async function benchReclaim(iterations = 10) {
|
|
24
|
+
const samples = [];
|
|
25
|
+
for (let i = 0; i < iterations; i += 1) {
|
|
26
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-team-bench-reclaim-'));
|
|
27
|
+
try {
|
|
28
|
+
await initTeamState('team-bench', 'bench reclaim', 'executor', 2, cwd);
|
|
29
|
+
const task = await createTask('team-bench', { subject: 'recover', description: 'd', status: 'pending' }, cwd);
|
|
30
|
+
const claim = await claimTask('team-bench', task.id, 'worker-1', task.version ?? 1, cwd);
|
|
31
|
+
if (!claim.ok) throw new Error('claim failed');
|
|
32
|
+
|
|
33
|
+
const taskPath = join(cwd, '.omx', 'state', 'team', 'team-bench', 'tasks', `task-${task.id}.json`);
|
|
34
|
+
const current = JSON.parse(await readFile(taskPath, 'utf-8'));
|
|
35
|
+
current.claim.leased_until = new Date(Date.now() - 1000).toISOString();
|
|
36
|
+
await writeAtomic(taskPath, JSON.stringify(current, null, 2));
|
|
37
|
+
|
|
38
|
+
const start = performance.now();
|
|
39
|
+
await monitorTeam('team-bench', cwd);
|
|
40
|
+
const elapsed = performance.now() - start;
|
|
41
|
+
const reopened = await readTask('team-bench', task.id, cwd);
|
|
42
|
+
if (reopened?.status !== 'pending') throw new Error('task not reclaimed');
|
|
43
|
+
samples.push(elapsed);
|
|
44
|
+
} finally {
|
|
45
|
+
await rm(cwd, { recursive: true, force: true });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return samples;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function benchDirtyWorktree(iterations = 10) {
|
|
52
|
+
const samples = [];
|
|
53
|
+
for (let i = 0; i < iterations; i += 1) {
|
|
54
|
+
const repo = await initRepo();
|
|
55
|
+
try {
|
|
56
|
+
const plan = planWorktreeTarget({ cwd: repo, scope: 'launch', mode: { enabled: true, detached: true, name: null } });
|
|
57
|
+
if (!plan.enabled) throw new Error('plan disabled');
|
|
58
|
+
const first = ensureWorktree(plan);
|
|
59
|
+
if (!first.enabled) throw new Error('ensure disabled');
|
|
60
|
+
await writeFile(join(first.worktreePath, 'DIRTY.txt'), 'dirty\n', 'utf-8');
|
|
61
|
+
const start = performance.now();
|
|
62
|
+
let blocked = false;
|
|
63
|
+
try {
|
|
64
|
+
ensureWorktree(plan);
|
|
65
|
+
} catch (error) {
|
|
66
|
+
blocked = /worktree_dirty/.test(String(error));
|
|
67
|
+
}
|
|
68
|
+
const elapsed = performance.now() - start;
|
|
69
|
+
if (!blocked) throw new Error('dirty reuse was not blocked');
|
|
70
|
+
samples.push(elapsed);
|
|
71
|
+
} finally {
|
|
72
|
+
await rm(repo, { recursive: true, force: true });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return samples;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function summarize(name, values) {
|
|
79
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
80
|
+
const avg = sorted.reduce((a, b) => a + b, 0) / sorted.length;
|
|
81
|
+
const median = sorted[Math.floor(sorted.length / 2)];
|
|
82
|
+
const p95 = sorted[Math.min(sorted.length - 1, Math.floor(sorted.length * 0.95))];
|
|
83
|
+
console.log(`${name}: n=${sorted.length} avg_ms=${avg.toFixed(2)} median_ms=${median.toFixed(2)} p95_ms=${p95.toFixed(2)}`);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const reclaim = await benchReclaim(10);
|
|
87
|
+
const dirty = await benchDirtyWorktree(10);
|
|
88
|
+
console.log('team-hardening benchmark');
|
|
89
|
+
summarize('expired-claim-reclaim', reclaim);
|
|
90
|
+
summarize('dirty-worktree-detection', dirty);
|
package/templates/AGENTS.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
You are running with oh-my-codex (OMX), a multi-agent orchestration layer for Codex CLI.
|
|
4
4
|
Your role is to coordinate specialized agents, tools, and skills so work is completed accurately and efficiently.
|
|
5
|
+
In the safe first-step 2-layer prompt architecture, this AGENTS.md file is the orchestrator authority for the workspace: it defines global operating policy, delegation rules, safety constraints, and completion standards.
|
|
6
|
+
Role prompts under `prompts/*.md` are narrower subagent execution surfaces; they should follow this orchestration contract rather than override it.
|
|
5
7
|
|
|
6
8
|
<guidance_schema_contract>
|
|
7
9
|
Canonical guidance schema for this template is defined in `docs/guidance-schema.md`.
|
|
@@ -26,10 +28,12 @@ Keep runtime marker contracts stable and non-destructive when overlays are appli
|
|
|
26
28
|
- Choose the lightest-weight path that preserves quality (direct action, MCP, or agent).
|
|
27
29
|
- Use context files and concrete outputs so delegated tasks are grounded.
|
|
28
30
|
- Consult official documentation before implementing with SDKs, frameworks, or APIs.
|
|
31
|
+
<!-- OMX:GUIDANCE:OPERATING:START -->
|
|
29
32
|
- Default to compact, information-dense responses; expand only when risk, ambiguity, or the user explicitly calls for detail.
|
|
30
33
|
- Proceed automatically on clear, low-risk, reversible next steps; ask only for irreversible, side-effectful, or materially branching actions.
|
|
31
34
|
- Treat newer user task updates as local overrides for the active task while preserving earlier non-conflicting instructions.
|
|
32
35
|
- Persist with tool use when correctness depends on retrieval, inspection, execution, or verification; do not skip prerequisites just because the likely answer seems obvious.
|
|
36
|
+
<!-- OMX:GUIDANCE:OPERATING:END -->
|
|
33
37
|
</operating_principles>
|
|
34
38
|
|
|
35
39
|
---
|
|
@@ -50,6 +54,7 @@ For non-trivial SDK/API/framework usage, delegate to `dependency-expert` to chec
|
|
|
50
54
|
<child_agent_protocol>
|
|
51
55
|
Codex CLI spawns child agents via the `spawn_agent` tool (requires `multi_agent = true`).
|
|
52
56
|
To inject role-specific behavior, the parent MUST read the role prompt and pass it in the spawned agent message.
|
|
57
|
+
Treat the role prompt as a role-local execution surface layered under AGENTS.md: it can specialize behavior for that subtask, but it must stay consistent with AGENTS.md-level orchestration and safety rules.
|
|
53
58
|
|
|
54
59
|
Delegation steps:
|
|
55
60
|
1. Decide which agent role to delegate to (e.g., `architect`, `executor`, `debugger`)
|
|
@@ -65,8 +70,8 @@ spawn_agent(message: "<test-engineer prompt>\n\nTask: Write tests for the auth c
|
|
|
65
70
|
```
|
|
66
71
|
|
|
67
72
|
Each child agent:
|
|
68
|
-
- Receives its role-specific prompt (from ~/.codex/prompts/)
|
|
69
|
-
- Inherits AGENTS.md context (via child_agents_md feature flag)
|
|
73
|
+
- Receives its role-specific prompt (from ~/.codex/prompts/) as the canonical subagent surface for that role
|
|
74
|
+
- Inherits AGENTS.md context (via child_agents_md feature flag) and treats it as higher-level orchestration authority
|
|
70
75
|
- Runs in an isolated context with its own tool access
|
|
71
76
|
- Returns results to the parent when complete
|
|
72
77
|
|
|
@@ -75,6 +80,7 @@ Key constraints:
|
|
|
75
80
|
- Each child has its own context window (not shared with parent)
|
|
76
81
|
- Parent must read prompt file BEFORE calling spawn_agent
|
|
77
82
|
- Child agents can access skills ($name) but should focus on their assigned role
|
|
83
|
+
- Child role prompts should report recommended handoffs upward instead of recursively orchestrating unless the parent explicitly authorizes recursion
|
|
78
84
|
</child_agent_protocol>
|
|
79
85
|
|
|
80
86
|
<invocation_conventions>
|
|
@@ -285,7 +291,13 @@ Sizing guidance:
|
|
|
285
291
|
- Standard changes: standard verifier
|
|
286
292
|
- Large or security/architectural changes (>20 files): thorough verifier
|
|
287
293
|
|
|
294
|
+
<!-- OMX:GUIDANCE:VERIFYSEQ:START -->
|
|
288
295
|
Verification loop: identify what proves the claim, run the verification, read the output, then report with evidence. If verification fails, continue iterating rather than reporting incomplete work. Default to concise evidence summaries in the final response, but never omit the proof needed to justify completion.
|
|
296
|
+
|
|
297
|
+
- Run dependent tasks sequentially; verify prerequisites before starting downstream actions.
|
|
298
|
+
- If a task update changes only the current branch of work, apply it locally and continue without reinterpreting unrelated standing instructions.
|
|
299
|
+
- When correctness depends on retrieval, diagnostics, tests, or other tools, continue using them until the task is grounded and verified.
|
|
300
|
+
<!-- OMX:GUIDANCE:VERIFYSEQ:END -->
|
|
289
301
|
</verification>
|
|
290
302
|
|
|
291
303
|
<execution_protocols>
|