oh-my-codex 0.19.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +5 -0
  4. package/dist/cli/__tests__/mission.test.d.ts +2 -0
  5. package/dist/cli/__tests__/mission.test.d.ts.map +1 -0
  6. package/dist/cli/__tests__/mission.test.js +239 -0
  7. package/dist/cli/__tests__/mission.test.js.map +1 -0
  8. package/dist/cli/__tests__/session-scoped-runtime.test.js +67 -0
  9. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  10. package/dist/cli/__tests__/ultragoal.test.js +1 -1
  11. package/dist/cli/index.d.ts +2 -2
  12. package/dist/cli/index.d.ts.map +1 -1
  13. package/dist/cli/index.js +30 -4
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/mission.d.ts +36 -0
  16. package/dist/cli/mission.d.ts.map +1 -0
  17. package/dist/cli/mission.js +443 -0
  18. package/dist/cli/mission.js.map +1 -0
  19. package/dist/hud/__tests__/state.test.js +31 -6
  20. package/dist/hud/__tests__/state.test.js.map +1 -1
  21. package/dist/hud/state.d.ts.map +1 -1
  22. package/dist/hud/state.js +7 -3
  23. package/dist/hud/state.js.map +1 -1
  24. package/dist/mcp/__tests__/state-paths.test.js +32 -1
  25. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  26. package/dist/mcp/state-paths.d.ts +4 -0
  27. package/dist/mcp/state-paths.d.ts.map +1 -1
  28. package/dist/mcp/state-paths.js +6 -15
  29. package/dist/mcp/state-paths.js.map +1 -1
  30. package/dist/ralplan/__tests__/consensus-gate.test.js +193 -0
  31. package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
  32. package/dist/ralplan/consensus-gate.js +24 -3
  33. package/dist/ralplan/consensus-gate.js.map +1 -1
  34. package/dist/scripts/__tests__/codex-native-hook.test.js +330 -0
  35. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  36. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  37. package/dist/scripts/codex-native-hook.js +68 -10
  38. package/dist/scripts/codex-native-hook.js.map +1 -1
  39. package/dist/scripts/generate-catalog-docs.js +1 -0
  40. package/dist/scripts/generate-catalog-docs.js.map +1 -1
  41. package/dist/state/__tests__/operations.test.js +287 -0
  42. package/dist/state/__tests__/operations.test.js.map +1 -1
  43. package/dist/state/__tests__/skill-active.test.js +59 -0
  44. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  45. package/dist/state/operations.d.ts.map +1 -1
  46. package/dist/state/operations.js +8 -6
  47. package/dist/state/operations.js.map +1 -1
  48. package/dist/state/skill-active.js +3 -3
  49. package/dist/state/skill-active.js.map +1 -1
  50. package/dist/ultragoal/__tests__/artifacts.test.js +14 -4
  51. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  52. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  53. package/dist/ultragoal/artifacts.js +70 -5
  54. package/dist/ultragoal/artifacts.js.map +1 -1
  55. package/package.json +1 -1
  56. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  57. package/src/scripts/__tests__/codex-native-hook.test.ts +340 -0
  58. package/src/scripts/codex-native-hook.ts +75 -9
  59. package/src/scripts/generate-catalog-docs.ts +1 -0
@@ -15,6 +15,7 @@ const docsToScan = [
15
15
  join(root, 'docs', 'skills.html'),
16
16
  join(root, 'docs', 'agents.html'),
17
17
  join(root, 'README.md'),
18
+ join(root, 'CONTRIBUTING.md'),
18
19
  join(root, 'src', 'cli', 'setup.ts'),
19
20
  join(root, 'src', 'cli', 'doctor.ts'),
20
21
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"generate-catalog-docs.js","sourceRoot":"","sources":["../../src/scripts/generate-catalog-docs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate-catalog-docs.js","sourceRoot":"","sources":["../../src/scripts/generate-catalog-docs.ts"],"names":[],"mappings":"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"}
@@ -66,6 +66,45 @@ async function withOmxRootEnv(root, run) {
66
66
  delete process.env.OMX_TEAM_STATE_ROOT;
67
67
  }
68
68
  }
69
+ async function withStateRootEnv(env, run) {
70
+ const previousOmxRoot = process.env.OMX_ROOT;
71
+ const previousOmxStateRoot = process.env.OMX_STATE_ROOT;
72
+ const previousTeamStateRoot = process.env.OMX_TEAM_STATE_ROOT;
73
+ if (typeof env.OMX_ROOT === 'string')
74
+ process.env.OMX_ROOT = env.OMX_ROOT;
75
+ else
76
+ delete process.env.OMX_ROOT;
77
+ if (typeof env.OMX_STATE_ROOT === 'string')
78
+ process.env.OMX_STATE_ROOT = env.OMX_STATE_ROOT;
79
+ else
80
+ delete process.env.OMX_STATE_ROOT;
81
+ if (typeof env.OMX_TEAM_STATE_ROOT === 'string')
82
+ process.env.OMX_TEAM_STATE_ROOT = env.OMX_TEAM_STATE_ROOT;
83
+ else
84
+ delete process.env.OMX_TEAM_STATE_ROOT;
85
+ try {
86
+ return await run();
87
+ }
88
+ finally {
89
+ if (typeof previousOmxRoot === 'string')
90
+ process.env.OMX_ROOT = previousOmxRoot;
91
+ else
92
+ delete process.env.OMX_ROOT;
93
+ if (typeof previousOmxStateRoot === 'string')
94
+ process.env.OMX_STATE_ROOT = previousOmxStateRoot;
95
+ else
96
+ delete process.env.OMX_STATE_ROOT;
97
+ if (typeof previousTeamStateRoot === 'string')
98
+ process.env.OMX_TEAM_STATE_ROOT = previousTeamStateRoot;
99
+ else
100
+ delete process.env.OMX_TEAM_STATE_ROOT;
101
+ }
102
+ }
103
+ function responsePayload(response) {
104
+ assert.equal(response.isError, undefined);
105
+ assert.ok(response.payload && typeof response.payload === 'object' && !Array.isArray(response.payload));
106
+ return response.payload;
107
+ }
69
108
  function validExecutionContract(stride) {
70
109
  const perStride = {
71
110
  task: {
@@ -235,6 +274,123 @@ describe('state operations directory initialization', () => {
235
274
  await rm(wd, { recursive: true, force: true });
236
275
  }
237
276
  });
277
+ it('writes and clears session state under OMX_TEAM_STATE_ROOT without creating cwd .omx', async () => {
278
+ const root = await mkdtemp(join(tmpdir(), 'omx-state-ops-team-root-'));
279
+ try {
280
+ const wd = join(root, 'workspace');
281
+ const teamStateRoot = join(root, 'team-state');
282
+ await mkdir(wd, { recursive: true });
283
+ await withStateRootEnv({ OMX_TEAM_STATE_ROOT: teamStateRoot }, async () => {
284
+ const writeResponse = await executeStateOperation('state_write', {
285
+ workingDirectory: wd,
286
+ session_id: 'sess-team-write',
287
+ mode: 'autoresearch',
288
+ active: true,
289
+ current_phase: 'running',
290
+ });
291
+ const writePayload = responsePayload(writeResponse);
292
+ assert.equal(writePayload.path, join(teamStateRoot, 'sessions', 'sess-team-write', 'autoresearch-state.json'));
293
+ assert.equal(existsSync(writePayload.path), true);
294
+ assert.equal(existsSync(join(teamStateRoot, 'sessions', 'sess-team-write', 'skill-active-state.json')), true);
295
+ assert.equal(existsSync(join(wd, '.omx')), false);
296
+ const clearResponse = await executeStateOperation('state_clear', {
297
+ workingDirectory: wd,
298
+ session_id: 'sess-team-write',
299
+ mode: 'autoresearch',
300
+ });
301
+ const clearPayload = responsePayload(clearResponse);
302
+ assert.equal(clearPayload.path, writePayload.path);
303
+ assert.equal(existsSync(writePayload.path), false);
304
+ assert.equal(existsSync(join(teamStateRoot, 'sessions', 'sess-team-write', 'skill-active-state.json')), true);
305
+ assert.equal(existsSync(join(wd, '.omx')), false);
306
+ });
307
+ }
308
+ finally {
309
+ await rm(root, { recursive: true, force: true });
310
+ }
311
+ });
312
+ it('writes and clears session state under OMX_ROOT when cwd is filesystem root', async () => {
313
+ const boxRoot = await mkdtemp(join(tmpdir(), 'omx-state-ops-omx-root-'));
314
+ try {
315
+ await withStateRootEnv({ OMX_ROOT: boxRoot }, async () => {
316
+ const writeResponse = await executeStateOperation('state_write', {
317
+ workingDirectory: '/',
318
+ session_id: 'sess-omx-root',
319
+ mode: 'autoresearch',
320
+ active: true,
321
+ current_phase: 'running',
322
+ });
323
+ const writePayload = responsePayload(writeResponse);
324
+ const expectedPath = join(boxRoot, '.omx', 'state', 'sessions', 'sess-omx-root', 'autoresearch-state.json');
325
+ assert.equal(writePayload.path, expectedPath);
326
+ assert.equal(existsSync(expectedPath), true);
327
+ const clearResponse = await executeStateOperation('state_clear', {
328
+ workingDirectory: '/',
329
+ session_id: 'sess-omx-root',
330
+ mode: 'autoresearch',
331
+ });
332
+ const clearPayload = responsePayload(clearResponse);
333
+ assert.equal(clearPayload.path, expectedPath);
334
+ assert.equal(existsSync(expectedPath), false);
335
+ const workspace = join(boxRoot, 'workspace');
336
+ await mkdir(workspace, { recursive: true });
337
+ const workspaceResponse = await executeStateOperation('state_write', {
338
+ workingDirectory: workspace,
339
+ session_id: 'sess-omx-root-workspace',
340
+ mode: 'autoresearch',
341
+ active: true,
342
+ current_phase: 'running',
343
+ });
344
+ const workspacePayload = responsePayload(workspaceResponse);
345
+ assert.equal(workspacePayload.path, join(boxRoot, '.omx', 'state', 'sessions', 'sess-omx-root-workspace', 'autoresearch-state.json'));
346
+ assert.equal(existsSync(join(workspace, '.omx')), false);
347
+ });
348
+ }
349
+ finally {
350
+ await rm(boxRoot, { recursive: true, force: true });
351
+ }
352
+ });
353
+ it('writes and clears session state under OMX_STATE_ROOT when cwd is filesystem root', async () => {
354
+ const stateRoot = await mkdtemp(join(tmpdir(), 'omx-state-ops-state-root-'));
355
+ try {
356
+ await withStateRootEnv({ OMX_STATE_ROOT: stateRoot }, async () => {
357
+ const writeResponse = await executeStateOperation('state_write', {
358
+ workingDirectory: '/',
359
+ session_id: 'sess-state-root',
360
+ mode: 'autoresearch',
361
+ active: true,
362
+ current_phase: 'running',
363
+ });
364
+ const writePayload = responsePayload(writeResponse);
365
+ const expectedPath = join(stateRoot, '.omx', 'state', 'sessions', 'sess-state-root', 'autoresearch-state.json');
366
+ assert.equal(writePayload.path, expectedPath);
367
+ assert.equal(existsSync(expectedPath), true);
368
+ const clearResponse = await executeStateOperation('state_clear', {
369
+ workingDirectory: '/',
370
+ session_id: 'sess-state-root',
371
+ mode: 'autoresearch',
372
+ });
373
+ const clearPayload = responsePayload(clearResponse);
374
+ assert.equal(clearPayload.path, expectedPath);
375
+ assert.equal(existsSync(expectedPath), false);
376
+ const workspace = join(stateRoot, 'workspace');
377
+ await mkdir(workspace, { recursive: true });
378
+ const workspaceResponse = await executeStateOperation('state_write', {
379
+ workingDirectory: workspace,
380
+ session_id: 'sess-state-root-workspace',
381
+ mode: 'autoresearch',
382
+ active: true,
383
+ current_phase: 'running',
384
+ });
385
+ const workspacePayload = responsePayload(workspaceResponse);
386
+ assert.equal(workspacePayload.path, join(stateRoot, '.omx', 'state', 'sessions', 'sess-state-root-workspace', 'autoresearch-state.json'));
387
+ assert.equal(existsSync(join(workspace, '.omx')), false);
388
+ });
389
+ }
390
+ finally {
391
+ await rm(stateRoot, { recursive: true, force: true });
392
+ }
393
+ });
238
394
  it('surfaces active ultragoal artifacts in list-active without mode state files', async () => {
239
395
  const wd = await mkdtemp(join(tmpdir(), 'omx-state-ops-ultragoal-artifact-'));
240
396
  try {
@@ -266,6 +422,57 @@ describe('state operations directory initialization', () => {
266
422
  await rm(wd, { recursive: true, force: true });
267
423
  }
268
424
  });
425
+ it('reports reconciled task-scoped aggregate ultragoal artifacts as inactive in get-status', async () => {
426
+ const wd = await mkdtemp(join(tmpdir(), 'omx-state-ops-ultragoal-reconciled-'));
427
+ try {
428
+ await mkdir(join(wd, '.omx', 'ultragoal'), { recursive: true });
429
+ await writeFile(join(wd, '.omx', 'ultragoal', 'goals.json'), JSON.stringify({
430
+ aggregateCompletion: {
431
+ status: 'complete',
432
+ completedAt: '2026-06-01T12:00:00.000Z',
433
+ evidence: 'task-scoped Codex aggregate completed and active microgoal row was reconciled',
434
+ },
435
+ activeGoalId: 'G002',
436
+ goals: [{
437
+ id: 'G001',
438
+ title: 'Fix duplicate HUD panes',
439
+ objective: 'Keep one HUD renderer per leader.',
440
+ status: 'complete',
441
+ completedAt: '2026-06-01T12:00:00.000Z',
442
+ }, {
443
+ id: 'G002',
444
+ title: 'Still marked running',
445
+ objective: 'Progress-only row left running by the old aggregate path.',
446
+ status: 'in_progress',
447
+ }, {
448
+ id: 'G003',
449
+ title: 'Still marked pending',
450
+ objective: 'Progress-only row left pending by the old aggregate path.',
451
+ status: 'pending',
452
+ }],
453
+ }, null, 2));
454
+ const activeResponse = await executeStateOperation('state_list_active', {
455
+ workingDirectory: wd,
456
+ });
457
+ assert.deepEqual(activeResponse.payload, { active_modes: [] });
458
+ const statusResponse = await executeStateOperation('state_get_status', {
459
+ workingDirectory: wd,
460
+ mode: 'ultragoal',
461
+ });
462
+ const statuses = statusResponse.payload.statuses || {};
463
+ assert.equal(statuses.ultragoal?.active, false);
464
+ assert.equal(statuses.ultragoal?.phase, 'complete');
465
+ assert.equal(statuses.ultragoal?.path, join(wd, '.omx', 'ultragoal', 'goals.json'));
466
+ assert.equal(statuses.ultragoal?.source, 'ultragoal-artifacts');
467
+ assert.equal(statuses.ultragoal?.data?.activeGoal, undefined);
468
+ assert.equal(statuses.ultragoal?.data?.complete, 1);
469
+ assert.equal(statuses.ultragoal?.data?.inProgress, 1);
470
+ assert.equal(statuses.ultragoal?.data?.pending, 1);
471
+ }
472
+ finally {
473
+ await rm(wd, { recursive: true, force: true });
474
+ }
475
+ });
269
476
  it('prefers active ultragoal artifacts over stale inactive mode state', async () => {
270
477
  const wd = await mkdtemp(join(tmpdir(), 'omx-state-ops-ultragoal-stale-state-'));
271
478
  try {
@@ -772,6 +979,86 @@ describe('state operations directory initialization', () => {
772
979
  await rm(wd, { recursive: true, force: true });
773
980
  }
774
981
  });
982
+ it('finalizes ralplan when runtime tracker lags but workspace tracker has completed native reviews', async () => {
983
+ const wd = await mkdtemp(join(tmpdir(), 'omx-state-ops-ralplan-runtime-lag-complete-'));
984
+ const stateRoot = await mkdtemp(join(tmpdir(), 'omx-state-ops-ralplan-runtime-lag-root-'));
985
+ try {
986
+ await withStateRootEnv({ OMX_STATE_ROOT: stateRoot }, async () => {
987
+ const sessionId = 'sess-ralplan-runtime-lag-complete';
988
+ const runtimeStateDir = join(stateRoot, '.omx', 'state');
989
+ const sessionDir = join(runtimeStateDir, 'sessions', sessionId);
990
+ const workspaceStateDir = join(wd, '.omx', 'state');
991
+ await mkdir(sessionDir, { recursive: true });
992
+ await mkdir(workspaceStateDir, { recursive: true });
993
+ await writeFile(join(runtimeStateDir, 'session.json'), JSON.stringify({
994
+ session_id: sessionId,
995
+ native_session_id: 'thread-leader',
996
+ cwd: wd,
997
+ }, null, 2));
998
+ const consensusGate = ralplanConsensusGate(sessionId, 'native_subagent');
999
+ consensusGate.ralplan_architect_review.completed_at = '2026-07-07T04:30:00.000Z';
1000
+ consensusGate.ralplan_critic_review.completed_at = '2026-07-07T04:31:00.000Z';
1001
+ await writeFile(subagentTrackingPath(wd), JSON.stringify({
1002
+ schemaVersion: 1,
1003
+ sessions: {
1004
+ [sessionId]: {
1005
+ session_id: sessionId,
1006
+ leader_thread_id: 'thread-leader',
1007
+ updated_at: '2026-07-07T04:31:00.000Z',
1008
+ threads: {
1009
+ 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-07-07T04:29:00.000Z', last_seen_at: '2026-07-07T04:29:00.000Z', turn_count: 1 },
1010
+ 'thread-architect': { thread_id: 'thread-architect', kind: 'subagent', first_seen_at: '2026-07-07T04:30:00.000Z', last_seen_at: '2026-07-07T04:30:00.000Z', turn_count: 1 },
1011
+ 'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', first_seen_at: '2026-07-07T04:31:00.000Z', last_seen_at: '2026-07-07T04:31:00.000Z', turn_count: 1 },
1012
+ },
1013
+ },
1014
+ },
1015
+ }, null, 2));
1016
+ await writeFile(join(workspaceStateDir, 'subagent-tracking.json'), JSON.stringify({
1017
+ schemaVersion: 1,
1018
+ sessions: {
1019
+ [sessionId]: {
1020
+ session_id: sessionId,
1021
+ leader_thread_id: 'thread-leader',
1022
+ updated_at: '2026-07-07T04:31:00.000Z',
1023
+ threads: {
1024
+ 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-07-07T04:29:00.000Z', last_seen_at: '2026-07-07T04:29:00.000Z', turn_count: 1 },
1025
+ 'thread-architect': { thread_id: 'thread-architect', kind: 'subagent', first_seen_at: '2026-07-07T04:30:00.000Z', last_seen_at: '2026-07-07T04:30:00.000Z', completed_at: '2026-07-07T04:30:00.000Z', turn_count: 1 },
1026
+ 'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', first_seen_at: '2026-07-07T04:31:00.000Z', last_seen_at: '2026-07-07T04:31:00.000Z', completed_at: '2026-07-07T04:31:00.000Z', turn_count: 1 },
1027
+ },
1028
+ },
1029
+ },
1030
+ }, null, 2));
1031
+ await writeFile(join(sessionDir, 'ralplan-state.json'), JSON.stringify({
1032
+ mode: 'ralplan',
1033
+ active: true,
1034
+ current_phase: 'planning',
1035
+ session_id: sessionId,
1036
+ }, null, 2));
1037
+ const response = await executeStateOperation('state_write', {
1038
+ workingDirectory: wd,
1039
+ session_id: sessionId,
1040
+ mode: 'ralplan',
1041
+ active: false,
1042
+ current_phase: 'complete',
1043
+ planning_complete: true,
1044
+ latest_plan_path: '.omx/plans/prd-clickstack-otel-consumer-20260707T043000Z.md',
1045
+ terminal_reason: 'consensus approved despite runtime tracker lag',
1046
+ ralplan_consensus_gate: consensusGate,
1047
+ });
1048
+ assert.equal(response.isError, undefined);
1049
+ const sessionRalplan = JSON.parse(await readFile(join(sessionDir, 'ralplan-state.json'), 'utf-8'));
1050
+ assert.equal(sessionRalplan.active, false);
1051
+ assert.equal(sessionRalplan.current_phase, 'complete');
1052
+ assert.equal(sessionRalplan.status, 'complete');
1053
+ assert.equal(sessionRalplan.terminal_reason, 'consensus approved despite runtime tracker lag');
1054
+ assert.equal(sessionRalplan.ralplan_consensus_gate.complete, true);
1055
+ });
1056
+ }
1057
+ finally {
1058
+ await rm(wd, { recursive: true, force: true });
1059
+ await rm(stateRoot, { recursive: true, force: true });
1060
+ }
1061
+ });
775
1062
  it('rejects forged ralplan complete gates before mutating active session state', async () => {
776
1063
  const wd = await mkdtemp(join(tmpdir(), 'omx-state-ops-ralplan-forged-complete-'));
777
1064
  try {