oh-my-opencode 5.0.0-beta.1 → 5.0.0-beta.10
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/.agents/command/publish.md +44 -16
- package/.agents/skills/publish/SKILL.md +44 -16
- package/.agents/skills/work-with-pr/SKILL.md +37 -23
- package/.opencode/command/publish.md +44 -16
- package/.opencode/skills/work-with-pr/SKILL.md +37 -23
- package/README.md +12 -1
- package/dist/agents/atlas/agent.d.ts +0 -1
- package/dist/agents/sisyphus/grok-4.d.ts +20 -0
- package/dist/agents/sisyphus/index.d.ts +2 -0
- package/dist/agents/sisyphus-agent-config.d.ts +6 -0
- package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
- package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +15 -4
- package/dist/agents/types.d.ts +2 -2
- package/dist/cli/index.js +797 -465
- package/dist/cli/run/on-complete-hook.d.ts +2 -0
- package/dist/cli-node/index.js +797 -465
- package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
- package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
- package/dist/index.js +1511 -1140
- package/dist/shared/normalize-sdk-response.d.ts +1 -0
- package/dist/shared/shell-env.d.ts +1 -1
- package/dist/skills/coding-agent-sessions/SKILL.md +3 -2
- package/dist/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/dist/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/dist/skills/frontend/SKILL.md +10 -7
- package/dist/skills/frontend/references/design/_INDEX.md +1 -0
- package/dist/skills/frontend/references/design/stylegallery.md +80 -0
- package/dist/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/dist/skills/ultimate-browsing/engine/AGENTS.md +179 -0
- package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
- package/dist/skills/ulw-plan/SKILL.md +2 -2
- package/dist/skills/ulw-plan/references/full-workflow.md +27 -3
- package/dist/skills/ulw-plan/references/intent-clear.md +2 -1
- package/dist/skills/ulw-plan/references/intent-unclear.md +3 -3
- package/dist/tui.js +176 -14
- package/package.json +21 -19
- package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +44 -0
- package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +0 -28
- package/packages/lsp-core/src/lsp/client-wrapper.test.ts +60 -7
- package/packages/lsp-core/src/lsp/client-wrapper.ts +69 -16
- package/packages/lsp-core/src/lsp/workspace-edit-adversarial.test.ts +20 -1
- package/packages/lsp-core/src/tools/diagnostics.ts +3 -3
- package/packages/lsp-core/src/tools/navigation.ts +4 -2
- package/packages/lsp-core/src/tools/rename.ts +4 -2
- package/packages/lsp-core/src/tools/symbols.ts +1 -1
- package/packages/lsp-daemon/dist/cli.js +83 -29
- package/packages/lsp-daemon/dist/client.js +76 -22
- package/packages/lsp-daemon/dist/index.js +81 -27
- package/packages/lsp-tools-mcp/dist/cli.js +76 -22
- package/packages/lsp-tools-mcp/dist/mcp.js +76 -22
- package/packages/lsp-tools-mcp/dist/tools.js +76 -22
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +118 -8
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +118 -8
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +3 -17
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +83 -29
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +16 -23
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
- package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +37 -69
- package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +1 -15
- package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +3 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +0 -3
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +2 -16
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +3 -9
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +24 -12
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +24 -12
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +6 -0
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +6 -0
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +27 -3
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +3 -3
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
- package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +108 -0
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +2 -35
- package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +4 -5
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +20 -20
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +10 -7
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +179 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +6 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -0
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +27 -3
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +3 -3
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +4 -24
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
- package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
- package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
- package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
- package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +1 -119
- package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
- package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
- package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
- package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
- package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
- package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +0 -3
- package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +57 -19
- package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/packages/shared-skills/skills/frontend/SKILL.md +10 -7
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +179 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +2 -2
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +27 -3
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +3 -3
- package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
- package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
- package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
|
@@ -3,14 +3,12 @@ import { readFileSync } from "node:fs";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import test from "node:test";
|
|
5
5
|
|
|
6
|
-
import { root } from "./aggregate-plugin-fixture.mjs";
|
|
7
6
|
import { cleanupTeamRoot, createTeamRoot, runTeam, teamDir } from "./teammode-safety-fixture.mjs";
|
|
8
7
|
|
|
9
|
-
// The teammode guide.md is what every member actually reads.
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// These tests pin the fix: a concrete push-communication protocol is the default the manual renders.
|
|
8
|
+
// The teammode guide.md is what every member actually reads. A real leader-session run proved members
|
|
9
|
+
// default to silence when the guide never names the tool or the address book, so the tests below pin
|
|
10
|
+
// only the machine tokens the generator must surface: the cross-thread tool name and the team.json
|
|
11
|
+
// field paths members address messages by. Guide/prompt wording itself is prose and stays unpinned.
|
|
14
12
|
|
|
15
13
|
function buildTwoMemberTeam(tempRoot, sessionId) {
|
|
16
14
|
runTeam(tempRoot, "init", "--name", "Comms", "--session-name", "frequent", "--session", sessionId);
|
|
@@ -39,69 +37,15 @@ test("#given a bound team #when the member field manual renders #then it names t
|
|
|
39
37
|
cleanupTeamRoot(tempRoot);
|
|
40
38
|
}
|
|
41
39
|
});
|
|
42
|
-
|
|
43
|
-
test("#given a bound team #when the member field manual renders #then it gives concrete per-moment cadence triggers, not aspirational 'constantly'", () => {
|
|
44
|
-
const tempRoot = createTeamRoot("omo-codex-teammode-comms-");
|
|
45
|
-
try {
|
|
46
|
-
buildTwoMemberTeam(tempRoot, "comms-cadence");
|
|
47
|
-
const guide = readGuide(tempRoot, "comms-cadence");
|
|
48
|
-
|
|
49
|
-
// then - a concrete heartbeat cadence the model can bind to
|
|
50
|
-
assert.match(guide, /every few tool calls/, "guide must give a concrete heartbeat trigger");
|
|
51
|
-
assert.match(guide, /WORKING:/, "guide must keep the WORKING heartbeat marker");
|
|
52
|
-
assert.match(guide, /BLOCKED:/, "guide must keep the BLOCKED marker");
|
|
53
|
-
// then - an explicit peer-notify rule so cross-cutting findings are pushed, not siloed
|
|
54
|
-
assert.match(guide, /to a \*\*peer\*\*/, "guide must have an explicit peer-notify rule");
|
|
55
|
-
assert.match(guide, /touches their slice/, "guide must trigger peer messages on slice-touching findings");
|
|
56
|
-
// then - the reassurance WHY that ties the two halves together: frequent reporting is what earns
|
|
57
|
-
// uninterrupted focus, so the leader has no reason to interrupt a member who keeps it informed
|
|
58
|
-
assert.match(guide, /uninterrupted focus/i, "guide must tell members frequent updates buy uninterrupted focus from the leader");
|
|
59
|
-
// then - the end-only directive that previously won is gone (it licensed batch-at-the-end reporting)
|
|
60
|
-
assert.doesNotMatch(guide, /the moment your work is complete/, "the standalone end-only report directive must be removed");
|
|
61
|
-
} finally {
|
|
62
|
-
cleanupTeamRoot(tempRoot);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
test("#given a member bootstrap trigger #when it is generated #then it points at the push tool and a continuous cadence, not an end-of-work report", () => {
|
|
40
|
+
test("#given a member bootstrap trigger #when it is generated #then it names the cross-thread push tool", () => {
|
|
67
41
|
const tempRoot = createTeamRoot("omo-codex-teammode-comms-");
|
|
68
42
|
try {
|
|
69
43
|
buildTwoMemberTeam(tempRoot, "comms-bootstrap");
|
|
70
44
|
const prompt = runTeam(tempRoot, "member-prompt", "--team", "comms-bootstrap", "--id", "A").stdout;
|
|
71
45
|
|
|
72
|
-
// then - the first thing a member reads
|
|
46
|
+
// then - the first thing a member reads names the tool it can push through
|
|
73
47
|
assert.match(prompt, /codex_app\.send_message_to_thread/, "bootstrap must name the push tool");
|
|
74
|
-
assert.match(prompt, /never just one report at the end/, "bootstrap must reject end-only reporting");
|
|
75
|
-
// then - it no longer frames reporting as a one-shot completion event
|
|
76
|
-
assert.doesNotMatch(prompt, /report to the leader the moment you are done/, "the end-only bootstrap line must be removed");
|
|
77
48
|
} finally {
|
|
78
49
|
cleanupTeamRoot(tempRoot);
|
|
79
50
|
}
|
|
80
51
|
});
|
|
81
|
-
|
|
82
|
-
test("#given the leader-facing SKILL.md #when it describes communication #then it requires --session so members can reach the leader and frames members as pushing", () => {
|
|
83
|
-
const skill = readFileSync(join(root, "components", "teammode", "skills", "teammode", "SKILL.md"), "utf8");
|
|
84
|
-
|
|
85
|
-
// then - the leader is told members PUSH to it (not only that the leader sends)
|
|
86
|
-
assert.match(skill, /Members push to you/i, "SKILL.md must frame members as pushing to the leader");
|
|
87
|
-
// then - the --session requirement is stated WITH its reason (member->leader push needs a real leader thread)
|
|
88
|
-
assert.match(skill, /--session <your own thread id>/, "SKILL.md must require init --session <your own thread id>");
|
|
89
|
-
assert.match(skill, /stuck polling|cannot report to you/i, "SKILL.md must explain why --session matters");
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
// The leader (a GPT-5.5 main session) over-polls when nothing reframes silence as work: real jobdori
|
|
93
|
-
// run 019f07a6- fired 6 leader->child pings, 4 pure "WORKING CHECK"/"NUDGE" nags that interrupted the
|
|
94
|
-
// child mid-slice. The member guide already mandates frequent reporting; the missing half is telling the
|
|
95
|
-
// leader to WAIT. These tests pin that the leader-facing skill reframes quiet-as-working and gates any
|
|
96
|
-
// outbound ping behind concrete decision rules instead of letting anxiety drive a barrage.
|
|
97
|
-
test("#given the leader-facing SKILL.md #when it covers waiting on members #then it reframes a quiet member as working and gates leader pings behind decision rules", () => {
|
|
98
|
-
const skill = readFileSync(join(root, "components", "teammode", "skills", "teammode", "SKILL.md"), "utf8");
|
|
99
|
-
|
|
100
|
-
// then - a quiet member between heartbeats is reframed as working, not a stall to chase
|
|
101
|
-
// (\s+ tolerates markdown line-wrapping between the two words)
|
|
102
|
-
assert.match(skill, /working,\s+not stalled/i, "SKILL.md must reframe a quiet member as working, not stalled");
|
|
103
|
-
// then - outbound leader messages are gated behind explicit decision rules, not anxiety
|
|
104
|
-
assert.match(skill, /Message a member only when/i, "SKILL.md must gate leader pings behind a concrete decision rule");
|
|
105
|
-
// then - the anti-pattern nag pings the real run produced are named as what NOT to send
|
|
106
|
-
assert.match(skill, /are you\s+done\?/i, "SKILL.md must name the 'are you done?' style nag as forbidden");
|
|
107
|
-
});
|
|
@@ -71,46 +71,13 @@ test("#given a worktree-backed team has bound member threads #when guide and sta
|
|
|
71
71
|
const status = runTeam(tempRoot, "status", "--team", sessionId).stdout;
|
|
72
72
|
const prompt = runTeam(tempRoot, "member-prompt", "--team", sessionId, "--id", "A").stdout;
|
|
73
73
|
|
|
74
|
+
// then - guide, status, and bootstrap prompt all surface the member's bound thread link and cwd
|
|
74
75
|
assert.match(guide, /codex:\/\/threads\/019ef350-ee78-72a3-bd5e-e40cebc3d814/);
|
|
75
76
|
assert.match(guide, /codex:\/\/threads\/019ef2dd-5b99-7ae2-8461-ffa6ca309d23/);
|
|
76
77
|
assert.match(guide, /worktree `\/tmp\/review-worktree`/);
|
|
77
78
|
assert.match(status, /link=codex:\/\/threads\/019ef350-ee78-72a3-bd5e-e40cebc3d814/);
|
|
78
|
-
assert.match(prompt, /
|
|
79
|
-
assert.match(prompt,
|
|
80
|
-
assert.match(prompt, /Before editing, verify that your assigned worktree exists and contains repo files/);
|
|
81
|
-
assert.match(prompt, /BLOCKED: worktree not ready/);
|
|
82
|
-
} finally {
|
|
83
|
-
cleanupTeamRoot(tempRoot);
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
test("#given a worktree member has no cwd bound yet #when guide and prompt render #then they tell Codex to wait for readiness", () => {
|
|
88
|
-
const tempRoot = createTeamRoot("omo-codex-teammode-worktree-wait-");
|
|
89
|
-
try {
|
|
90
|
-
const sessionId = "worktree-wait";
|
|
91
|
-
runTeam(tempRoot, "init", "--name", "Wait", "--session-name", "worktrees", "--session", sessionId, "--worktree", "--base-branch", "main");
|
|
92
|
-
addMember(tempRoot, sessionId, {
|
|
93
|
-
id: "A",
|
|
94
|
-
name: "worktree-driver",
|
|
95
|
-
focus: "drive a pending Codex worktree thread",
|
|
96
|
-
lens: "ownership",
|
|
97
|
-
deliverable: "ready worktree report",
|
|
98
|
-
});
|
|
99
|
-
addMember(tempRoot, sessionId, {
|
|
100
|
-
id: "B",
|
|
101
|
-
name: "integration-watch",
|
|
102
|
-
focus: "watch integration boundaries",
|
|
103
|
-
lens: "perspective",
|
|
104
|
-
deliverable: "integration notes",
|
|
105
|
-
});
|
|
106
|
-
runTeam(tempRoot, "bind-thread", "--team", sessionId, "--id", "A", "--thread", "019ef350-ee78-72a3-bd5e-e40cebc3d814");
|
|
107
|
-
|
|
108
|
-
const guide = readFileSync(`${teamDir(tempRoot, sessionId)}/guide.md`, "utf8");
|
|
109
|
-
const prompt = runTeam(tempRoot, "member-prompt", "--team", sessionId, "--id", "A").stdout;
|
|
110
|
-
|
|
111
|
-
assert.match(guide, /If Codex returns only `pendingWorktreeId`/);
|
|
112
|
-
assert.match(guide, /wait until Codex surfaces a real thread id/);
|
|
113
|
-
assert.match(prompt, /If this prompt arrived before your Codex worktree checkout is ready/);
|
|
79
|
+
assert.match(prompt, /codex:\/\/threads\/019ef350-ee78-72a3-bd5e-e40cebc3d814/);
|
|
80
|
+
assert.match(prompt, /\/tmp\/review-worktree/);
|
|
114
81
|
} finally {
|
|
115
82
|
cleanupTeamRoot(tempRoot);
|
|
116
83
|
}
|
|
@@ -3,7 +3,6 @@ import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import test from "node:test";
|
|
5
5
|
|
|
6
|
-
import { root } from "./aggregate-plugin-fixture.mjs";
|
|
7
6
|
import {
|
|
8
7
|
cleanupTeamRoot,
|
|
9
8
|
createTeamRoot,
|
|
@@ -53,45 +52,6 @@ function addV2Members(tempRoot, sessionId) {
|
|
|
53
52
|
);
|
|
54
53
|
}
|
|
55
54
|
|
|
56
|
-
test("#given flat V2 tools are available #when the leader reads teammode #then transport selection and user announcement precede init", () => {
|
|
57
|
-
const skill = readFileSync(join(root, "components", "teammode", "skills", "teammode", "SKILL.md"), "utf8");
|
|
58
|
-
const inspectIndex = skill.indexOf("Inspect your active tool list");
|
|
59
|
-
const initIndex = skill.indexOf('team.mjs" init');
|
|
60
|
-
|
|
61
|
-
assert.notEqual(inspectIndex, -1, "skill must inspect the active tool list");
|
|
62
|
-
assert.notEqual(initIndex, -1, "skill must still document init");
|
|
63
|
-
assert.ok(inspectIndex < initIndex, "transport inspection must happen before init");
|
|
64
|
-
assert.match(skill, /spawn_agent.*task_name[\s\S]*send_message[\s\S]*followup_task[\s\S]*wait_agent[\s\S]*list_agents[\s\S]*interrupt_agent/);
|
|
65
|
-
assert.match(skill, /tell the user|announce.*transport/i);
|
|
66
|
-
assert.match(skill, /MultiAgentV2/i);
|
|
67
|
-
assert.match(skill, /Codex App.*fallback/i);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("#given neither transport's tools are visible #when the leader reads teammode #then search hits are revalidated and fallback is capability-aware without team state", () => {
|
|
71
|
-
const skill = readFileSync(join(root, "components", "teammode", "skills", "teammode", "SKILL.md"), "utf8");
|
|
72
|
-
|
|
73
|
-
const searchIndex = skill.indexOf("tool_search");
|
|
74
|
-
const unavailableIndex = skill.indexOf("Teammode unavailable");
|
|
75
|
-
assert.notEqual(searchIndex, -1, "skill must route hidden tools through the tool_search check");
|
|
76
|
-
assert.notEqual(unavailableIndex, -1, "skill must give the leader unavailable announcement templates");
|
|
77
|
-
assert.ok(searchIndex < unavailableIndex, "tool_search must precede the unavailable conclusion");
|
|
78
|
-
assert.match(skill, /revalidate.*COMPLETE.*compatible transport set/is, "a deferred-tool hit must be revalidated as a complete transport");
|
|
79
|
-
assert.match(skill, /another visible plain-subagent mechanism.*spawn.*communicate.*observe/is, "plain-subagent fallback requires a complete visible lifecycle");
|
|
80
|
-
assert.match(skill, /Otherwise continue serially.*capability limitation/is, "missing all transports must continue serially rather than promise workers");
|
|
81
|
-
assert.match(skill, /Do NOT run `init`/, "the fallback must not create team state");
|
|
82
|
-
assert.doesNotMatch(skill, /splitting the work across plain fire-and-forget subagents/i, "the skill must not promise unavailable plain subagents");
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
test("#given a MultiAgentV2 team #when the leader spawns members #then guidance limits calls to exposed V2 fields", () => {
|
|
86
|
-
const skill = readFileSync(join(root, "components", "teammode", "skills", "teammode", "SKILL.md"), "utf8");
|
|
87
|
-
|
|
88
|
-
assert.match(skill, /using only the V2 schema fields/i);
|
|
89
|
-
assert.match(skill, /`task_name`[\s\S]*`message`[\s\S]*`fork_turns`/);
|
|
90
|
-
assert.match(skill, /role, priority, or task-specific routing instruction in `message`/i);
|
|
91
|
-
assert.match(skill, /V2 does not accept[\s\S]*`agent_type`, `model`, `reasoning_effort`, or `service_tier`/);
|
|
92
|
-
assert.match(skill, /inherit the[\s\S]*session model/i);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
55
|
test("#given MultiAgentV2 transport #when members are added and bound #then task names and canonical agent paths form the address book", () => {
|
|
96
56
|
const tempRoot = createTeamRoot("omo-codex-teammode-v2-transport-");
|
|
97
57
|
try {
|
|
@@ -123,7 +83,6 @@ test("#given MultiAgentV2 transport #when members are added and bound #then task
|
|
|
123
83
|
{ id: "B", taskName: "mailbox_delivery", agentPath: "/root/mailbox_delivery", threadId: null, threadTitle: null, status: "active" },
|
|
124
84
|
],
|
|
125
85
|
);
|
|
126
|
-
assert.match(guide, /Transport:.*MultiAgentV2/i);
|
|
127
86
|
assert.match(guide, /members\[\]\.agentPath/);
|
|
128
87
|
assert.match(guide, /send_message/);
|
|
129
88
|
assert.match(guide, /followup_task/);
|
|
@@ -223,9 +182,7 @@ test("#given a V2 team #when the whole team is archived without a note #then no
|
|
|
223
182
|
const archiveEntry = team.log.find((entry) => entry.event === "archive");
|
|
224
183
|
|
|
225
184
|
assert.equal(team.status, "archived");
|
|
226
|
-
assert.doesNotMatch(result.stdout, /closed all members/i, "V2 has no runtime close/archive operation to claim");
|
|
227
185
|
assert.match(result.stdout, /no runtime archive operation/i);
|
|
228
|
-
assert.doesNotMatch(archiveEntry.detail, /all members closed/i);
|
|
229
186
|
assert.match(archiveEntry.detail, /no runtime archive operation/i);
|
|
230
187
|
} finally {
|
|
231
188
|
cleanupTeamRoot(tempRoot);
|
|
@@ -261,7 +218,6 @@ test("#given a codex_app team #when one member is archived #then the existing wo
|
|
|
261
218
|
const result = runTeam(tempRoot, "archive", "--team", "app-archive-member", "--id", "A");
|
|
262
219
|
|
|
263
220
|
assert.match(result.stdout, /archived member A/);
|
|
264
|
-
assert.doesNotMatch(result.stdout, /no runtime archive operation/i);
|
|
265
221
|
} finally {
|
|
266
222
|
cleanupTeamRoot(tempRoot);
|
|
267
223
|
}
|
|
@@ -83,24 +83,21 @@ test("#given a worktree team #when worktree-add A #then a real git worktree on a
|
|
|
83
83
|
assert.match(result.stdout, /A/);
|
|
84
84
|
assert.match(result.stdout, /wait for the real Codex thread id/);
|
|
85
85
|
assert.match(result.stdout, /bind-thread before sending bootstrap/);
|
|
86
|
-
assert.doesNotMatch(result.stdout, /Tell that member to:/);
|
|
87
86
|
} finally {
|
|
88
87
|
cleanupTeamRoot(tempRoot);
|
|
89
88
|
}
|
|
90
89
|
});
|
|
91
90
|
|
|
92
|
-
test("#given worktree-add ran #when the field manual is regenerated #then it
|
|
91
|
+
test("#given worktree-add ran #when the field manual is regenerated #then it shows the member's derived worktree branch", () => {
|
|
93
92
|
const tempRoot = createTeamRoot("omo-codex-teammode-wt-guide-");
|
|
94
93
|
try {
|
|
95
94
|
initGitRepo(tempRoot);
|
|
96
95
|
bootstrapTeam(tempRoot, "wt-guide", { worktree: false });
|
|
97
|
-
// before: no isolation, so the manual tells members to signal collisions instead
|
|
98
|
-
assert.match(readFileSync(join(teamDir(tempRoot, "wt-guide"), "guide.md"), "utf8"), /does not use isolated git worktrees/);
|
|
99
96
|
|
|
100
97
|
runTeam(tempRoot, "worktree-add", "--team", "wt-guide", "--id", "A");
|
|
101
98
|
|
|
99
|
+
// then - the regenerated guide carries the derived branch recorded in team state
|
|
102
100
|
const guide = readFileSync(join(teamDir(tempRoot, "wt-guide"), "guide.md"), "utf8");
|
|
103
|
-
assert.match(guide, /ISOLATION IS ON/);
|
|
104
101
|
assert.match(guide, /team\/wt-guide\/A/, "the member's row must show its derived worktree branch");
|
|
105
102
|
} finally {
|
|
106
103
|
cleanupTeamRoot(tempRoot);
|
|
@@ -225,7 +222,6 @@ test("#given a member branch that cannot be merged #when integrate runs #then it
|
|
|
225
222
|
const out = `${result.stdout}${result.stderr}`;
|
|
226
223
|
assert.notEqual(result.status, 0);
|
|
227
224
|
assert.match(out, /could not integrate|not something we can merge|ghost-branch-404/i, "must surface git's actual reason");
|
|
228
|
-
assert.doesNotMatch(out, /Conflicting files/, "a non-conflict failure must NOT be mislabeled as a merge conflict");
|
|
229
225
|
} finally {
|
|
230
226
|
cleanupTeamRoot(tempRoot);
|
|
231
227
|
}
|
|
@@ -33,7 +33,6 @@ test("#given synced skills #when the ultrawork skill is inspected #then it carri
|
|
|
33
33
|
const directive = readFileSync(join(root, "components", "ultrawork", "directive.md"), "utf8");
|
|
34
34
|
assert.match(skill, /^---\nname: ultrawork\n/);
|
|
35
35
|
assert.equal(skill.endsWith(directive), true);
|
|
36
|
-
assert.match(skill, /## 1\. Create the goal with binding success criteria/);
|
|
37
36
|
});
|
|
38
37
|
|
|
39
38
|
test("#given the built ultrawork CLI #when a ulw prompt is submitted #then a compact skill pointer is emitted", () => {
|
|
@@ -42,10 +41,8 @@ test("#given the built ultrawork CLI #when a ulw prompt is submitted #then a com
|
|
|
42
41
|
const output = JSON.parse(result.stdout);
|
|
43
42
|
const context = output.hookSpecificOutput.additionalContext;
|
|
44
43
|
assert.match(context, /^<ultrawork-mode>/);
|
|
45
|
-
assert.match(context, /First user-visible line this turn MUST be exactly:/);
|
|
46
44
|
assert.match(context, /create_goal/);
|
|
47
45
|
assert.equal(context.includes(skillPath), true);
|
|
48
|
-
assert.equal(context.includes("Tier triage"), false);
|
|
49
46
|
assert.equal(Buffer.byteLength(context, "utf8") < POINTER_MAX_BYTES, true);
|
|
50
47
|
});
|
|
51
48
|
|
|
@@ -54,15 +54,12 @@ function matchesCas(state, expected, clauses) {
|
|
|
54
54
|
|
|
55
55
|
for (const surface of surfaces) {
|
|
56
56
|
test(`#given ${surface.name} #when deeper review becomes required before plan completion #then durable request state covers explicit and automatic review without inventing a digest`, async () => {
|
|
57
|
-
const skill = await readFile(surface.skillPath, "utf8");
|
|
58
57
|
const workflow = await readFile(surface.workflowPath, "utf8");
|
|
59
58
|
const contract = readJsonContract(workflow, "ulw-plan-review-request-state-contract");
|
|
60
59
|
|
|
61
60
|
assert.equal(contract.transition, "replace");
|
|
62
61
|
assert.equal(contract.phase, "review_requested");
|
|
63
62
|
assert.deepEqual(contract.applies_when, ["explicit_review_modifier_before_complete_plan", "intent=unclear_and_nontrivial"]);
|
|
64
|
-
assert.match(skill, /Include `--review-required`[\s\S]{0,180}non-Trivial UNCLEAR/);
|
|
65
|
-
assert.match(workflow, /--draft-only/);
|
|
66
63
|
assert.equal(contract.atomic, true);
|
|
67
64
|
assert.equal(contract.review_required, true);
|
|
68
65
|
assert.equal(contract.plan_path, ".omo/plans/<slug>.md");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// omo-codex-install:
|
|
2
|
+
// omo-codex-install:1d8359e77ebe41655f091cd2e455f320cde2f9c681f0651797c47d8fdfa2dd76:73b0878485b4eee3443d4677abaa1155ef215b62b939e85584c64dbab100bfbc
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __returnValue = (v) => v;
|
|
5
5
|
function __exportSetter(name, newValue) {
|
|
@@ -177,7 +177,7 @@ var init_activity_state = __esm(() => {
|
|
|
177
177
|
});
|
|
178
178
|
|
|
179
179
|
// packages/telemetry-core/src/constants.ts
|
|
180
|
-
var DEFAULT_POSTHOG_HOST = "https://us.i.posthog.com", DEFAULT_POSTHOG_API_KEY = "phc_CFJhj5HyvA62QPhvyaUCtaq23aUfznnijg5VaaGkNk74";
|
|
180
|
+
var DEFAULT_POSTHOG_HOST = "https://us.i.posthog.com", DEFAULT_POSTHOG_API_KEY = "phc_CFJhj5HyvA62QPhvyaUCtaq23aUfznnijg5VaaGkNk74", UNCONFIGURED_POSTHOG_API_KEY = "phc_REPLACE_ME_OMO_NATIVE";
|
|
181
181
|
|
|
182
182
|
// packages/telemetry-core/src/diagnostics.ts
|
|
183
183
|
import { appendFileSync, existsSync as existsSync6, mkdirSync as mkdirSync3, readFileSync as readFileSync3 } from "node:fs";
|
|
@@ -315,6 +315,9 @@ function shouldDisableTelemetry(input) {
|
|
|
315
315
|
const env = input.env ?? process.env;
|
|
316
316
|
const globalPrefix = input.globalEnvPrefix ?? "OMO";
|
|
317
317
|
const prefixes = Array.from(new Set([globalPrefix, input.productEnvPrefix]));
|
|
318
|
+
if (isDisableFlag(env["DO_NOT_TRACK"])) {
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
318
321
|
for (const prefix of prefixes) {
|
|
319
322
|
if (isDisableFlag(env[`${prefix}_DISABLE_POSTHOG`])) {
|
|
320
323
|
return true;
|
|
@@ -328,6 +331,13 @@ function shouldDisableTelemetry(input) {
|
|
|
328
331
|
function getTelemetryApiKey(env = process.env, defaultApiKey = DEFAULT_POSTHOG_API_KEY) {
|
|
329
332
|
return env["POSTHOG_API_KEY"]?.trim() ?? defaultApiKey;
|
|
330
333
|
}
|
|
334
|
+
function isConfiguredTelemetryApiKey(apiKey) {
|
|
335
|
+
const normalized = apiKey.trim();
|
|
336
|
+
return normalized.length > 0 && normalized !== UNCONFIGURED_POSTHOG_API_KEY;
|
|
337
|
+
}
|
|
338
|
+
function hasTelemetryApiKey(env, defaultApiKey) {
|
|
339
|
+
return isConfiguredTelemetryApiKey(getTelemetryApiKey(env, defaultApiKey));
|
|
340
|
+
}
|
|
331
341
|
function getTelemetryHost(env = process.env, defaultHost = DEFAULT_POSTHOG_HOST) {
|
|
332
342
|
return env["POSTHOG_HOST"]?.trim() || defaultHost;
|
|
333
343
|
}
|
|
@@ -337,17 +347,6 @@ var init_env = __esm(() => {
|
|
|
337
347
|
SEND_OPT_OUT_VALUES = ["0", "false", "no", "yes"];
|
|
338
348
|
});
|
|
339
349
|
|
|
340
|
-
// packages/telemetry-core/src/machine-id.ts
|
|
341
|
-
import { createHash as createHash3 } from "node:crypto";
|
|
342
|
-
import os2 from "node:os";
|
|
343
|
-
function getDefaultTelemetryOsProvider() {
|
|
344
|
-
return os2;
|
|
345
|
-
}
|
|
346
|
-
function getTelemetryDistinctId(machineIdPrefix, osProvider = getDefaultTelemetryOsProvider()) {
|
|
347
|
-
return createHash3("sha256").update(`${machineIdPrefix}${osProvider.hostname()}`).digest("hex");
|
|
348
|
-
}
|
|
349
|
-
var init_machine_id = () => {};
|
|
350
|
-
|
|
351
350
|
// node_modules/.bun/posthog-node@5.35.12/node_modules/posthog-node/dist/extensions/error-tracking/modifiers/module.node.mjs
|
|
352
351
|
import { dirname as dirname10, posix as posix2, sep as sep7 } from "node:path";
|
|
353
352
|
function createModulerModifier() {
|
|
@@ -5722,6 +5721,17 @@ var init_index_node = __esm(() => {
|
|
|
5722
5721
|
};
|
|
5723
5722
|
});
|
|
5724
5723
|
|
|
5724
|
+
// packages/telemetry-core/src/machine-id.ts
|
|
5725
|
+
import { createHash as createHash3 } from "node:crypto";
|
|
5726
|
+
import os2 from "node:os";
|
|
5727
|
+
function getDefaultTelemetryOsProvider() {
|
|
5728
|
+
return os2;
|
|
5729
|
+
}
|
|
5730
|
+
function getTelemetryDistinctId(machineIdPrefix, osProvider = getDefaultTelemetryOsProvider()) {
|
|
5731
|
+
return createHash3("sha256").update(`${machineIdPrefix}${osProvider.hostname()}`).digest("hex");
|
|
5732
|
+
}
|
|
5733
|
+
var init_machine_id = () => {};
|
|
5734
|
+
|
|
5725
5735
|
// packages/telemetry-core/src/posthog-client.ts
|
|
5726
5736
|
class PostHogTelemetryTransport {
|
|
5727
5737
|
#client;
|
|
@@ -5743,7 +5753,7 @@ function createDefaultPostHogTransport(apiKey, options) {
|
|
|
5743
5753
|
}
|
|
5744
5754
|
function isTelemetryClientEnabled(input) {
|
|
5745
5755
|
const env = input.env ?? process.env;
|
|
5746
|
-
return !shouldDisableTelemetry({ env, productEnvPrefix: input.product.productEnvPrefix }) &&
|
|
5756
|
+
return !shouldDisableTelemetry({ env, productEnvPrefix: input.product.productEnvPrefix }) && hasTelemetryApiKey(env, input.product.defaultApiKey);
|
|
5747
5757
|
}
|
|
5748
5758
|
function createTelemetryClient(input) {
|
|
5749
5759
|
if (!isTelemetryClientEnabled(input)) {
|
|
@@ -5809,7 +5819,8 @@ function createTransport(input) {
|
|
|
5809
5819
|
flushAt: 1,
|
|
5810
5820
|
flushInterval: 0,
|
|
5811
5821
|
host: getTelemetryHost(env, input.product.defaultHost),
|
|
5812
|
-
disableGeoip: false
|
|
5822
|
+
disableGeoip: input.product.disableGeoip ?? false,
|
|
5823
|
+
...input.product.transportOptions
|
|
5813
5824
|
});
|
|
5814
5825
|
} catch (error) {
|
|
5815
5826
|
input.diagnostics?.({
|
|
@@ -5886,6 +5897,17 @@ var init_posthog_client = __esm(() => {
|
|
|
5886
5897
|
};
|
|
5887
5898
|
});
|
|
5888
5899
|
|
|
5900
|
+
// packages/telemetry-core/src/events.ts
|
|
5901
|
+
var ALLOWED_DOLLAR_KEYS;
|
|
5902
|
+
var init_events = __esm(() => {
|
|
5903
|
+
ALLOWED_DOLLAR_KEYS = new Set([
|
|
5904
|
+
"$os",
|
|
5905
|
+
"$os_version",
|
|
5906
|
+
"$process_person_profile",
|
|
5907
|
+
"$session_id"
|
|
5908
|
+
]);
|
|
5909
|
+
});
|
|
5910
|
+
|
|
5889
5911
|
// packages/telemetry-core/src/record-daily-active.ts
|
|
5890
5912
|
var init_record_daily_active = () => {};
|
|
5891
5913
|
|
|
@@ -5894,6 +5916,7 @@ var init_src = __esm(() => {
|
|
|
5894
5916
|
init_activity_state();
|
|
5895
5917
|
init_diagnostics();
|
|
5896
5918
|
init_env();
|
|
5919
|
+
init_events();
|
|
5897
5920
|
init_machine_id();
|
|
5898
5921
|
init_posthog_client();
|
|
5899
5922
|
init_record_daily_active();
|
|
@@ -5904,7 +5927,7 @@ var package_default;
|
|
|
5904
5927
|
var init_package = __esm(() => {
|
|
5905
5928
|
package_default = {
|
|
5906
5929
|
name: "@oh-my-opencode/omo-codex",
|
|
5907
|
-
version: "5.0.0-beta.
|
|
5930
|
+
version: "5.0.0-beta.10",
|
|
5908
5931
|
type: "module",
|
|
5909
5932
|
private: true,
|
|
5910
5933
|
description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
|
|
@@ -10796,6 +10819,7 @@ function runtimeSlug(platform = process.platform, arch = process.arch) {
|
|
|
10796
10819
|
|
|
10797
10820
|
// packages/utils/src/ast-grep/install-script.ts
|
|
10798
10821
|
var AST_GREP_BIN_DIR_ENV_KEY = "OMO_AST_GREP_BIN_DIR";
|
|
10822
|
+
var KILL_GRACE_MS = 1000;
|
|
10799
10823
|
var AST_GREP_INSTALL_TIMEOUT_MS = 30000;
|
|
10800
10824
|
function astGrepRuntimeDir(baseDir, platform = process.platform, arch = process.arch) {
|
|
10801
10825
|
return join32(baseDir, "runtime", "ast-grep", runtimeSlug(platform, arch));
|
|
@@ -10847,16 +10871,30 @@ function invocationsForPlatform(scriptPath, platform) {
|
|
|
10847
10871
|
async function runInvocation(input) {
|
|
10848
10872
|
const child = input.spawnProcess(input.invocation.command, input.invocation.args, { cwd: input.skillDir, env: input.env });
|
|
10849
10873
|
let timedOut = false;
|
|
10874
|
+
let terminateDeadline;
|
|
10875
|
+
let terminateDeadlineGrace;
|
|
10876
|
+
const killIgnored = new Promise((_, reject) => {
|
|
10877
|
+
terminateDeadline = () => reject(new Error("ast-grep install child ignored termination"));
|
|
10878
|
+
});
|
|
10850
10879
|
const timeout = setTimeout(() => {
|
|
10851
10880
|
timedOut = true;
|
|
10852
10881
|
child.kill();
|
|
10882
|
+
terminateDeadlineGrace = setTimeout(() => terminateDeadline?.(), KILL_GRACE_MS);
|
|
10853
10883
|
}, input.timeoutMs);
|
|
10854
|
-
timeout.unref?.();
|
|
10855
10884
|
try {
|
|
10856
|
-
const outcome = await child.outcome;
|
|
10857
|
-
|
|
10885
|
+
const outcome = await Promise.race([child.outcome, killIgnored]);
|
|
10886
|
+
if (timedOut)
|
|
10887
|
+
return { kind: "timed-out" };
|
|
10888
|
+
return outcome;
|
|
10889
|
+
} catch (error) {
|
|
10890
|
+
if (error instanceof Error && error.message.includes("ignored termination")) {
|
|
10891
|
+
return { kind: "spawn-error", error, missingExecutable: false };
|
|
10892
|
+
}
|
|
10893
|
+
throw error;
|
|
10858
10894
|
} finally {
|
|
10859
10895
|
clearTimeout(timeout);
|
|
10896
|
+
if (terminateDeadlineGrace !== undefined)
|
|
10897
|
+
clearTimeout(terminateDeadlineGrace);
|
|
10860
10898
|
}
|
|
10861
10899
|
}
|
|
10862
10900
|
function failedReason(outcome) {
|
|
@@ -77,8 +77,13 @@ test("#given sisyphuslabs lazycodex install #when installing locally #then stamp
|
|
|
77
77
|
assert.equal(manifest.version, "4.7.6");
|
|
78
78
|
assert.equal(packageJson.version, "4.7.6");
|
|
79
79
|
assert.equal(componentPackageJson.version, "4.7.6");
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
for (const statusMessage of [
|
|
81
|
+
hooks.hooks.PostToolUse[0].hooks[0].statusMessage,
|
|
82
|
+
componentHooks.hooks.UserPromptSubmit[0].hooks[0].statusMessage,
|
|
83
|
+
]) {
|
|
84
|
+
assert.match(statusMessage, /^\(OmO 4\.7\.6\) \S/);
|
|
85
|
+
assert.doesNotMatch(statusMessage, /0\.1\.0/);
|
|
86
|
+
}
|
|
82
87
|
assert.deepEqual(snapshot, {
|
|
83
88
|
packageName: "lazycodex-ai",
|
|
84
89
|
version: "4.7.6",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: coding-agent-sessions
|
|
3
|
-
description: "MUST USE when asked to find, read, list, search, inspect, fetch, export, or reconstruct coding-agent sessions across Codex, Claude Code/Desktop, OpenCode, Senpi/pi, oh-my-pi (omp), gajae-code (gjc), OpenClaw, Factory Droid, Amp, Gemini/Kimi/Qwen CLIs, Codebuff, Roo/Kilo/Cline, Kodu, Cursor CLI, Aider, Aside browser-agent sessions, or unknown local agent logs. Covers transcripts, session IDs, rollout JSONL, state SQLite, Claude projects/pre-compact histories, OpenCode messages/parts, child/subagent linkage, cwd/model/time/token filters, archives, and cost clues. Expands fuzzy recall into parallel query lanes and first probes known stores so absent platforms are skipped cheaply. Triggers: coding agent sessions, Codex/Claude/OpenCode/Senpi/pi/oh-my-pi/omp/gajae-code/gjc/OpenClaw/Droid/Amp/Kodu/Cursor/Aider/Aside sessions, transcript search, session history, session ID, read transcript, token usage, subagent sessions, what did I do yesterday, did we already do this."
|
|
3
|
+
description: "MUST USE when asked to find, read, list, search, inspect, fetch, export, or reconstruct coding-agent sessions across Codex, Claude Code/Desktop, OpenCode, OMO/Senpi/pi, oh-my-pi (omp), gajae-code (gjc), OpenClaw, Factory Droid, Amp, Gemini/Kimi/Qwen CLIs, Codebuff, Roo/Kilo/Cline, Kodu, Cursor CLI, Aider, Aside browser-agent sessions, or unknown local agent logs. Covers transcripts, session IDs, rollout JSONL, state SQLite, Claude projects/pre-compact histories, OpenCode messages/parts, child/subagent linkage, cwd/model/time/token filters, archives, and cost clues. Expands fuzzy recall into parallel query lanes and first probes known stores so absent platforms are skipped cheaply. Triggers: coding agent sessions, Codex/Claude/OpenCode/OMO/Senpi/pi/oh-my-pi/omp/gajae-code/gjc/OpenClaw/Droid/Amp/Kodu/Cursor/Aider/Aside sessions, transcript search, session history, session ID, read transcript, token usage, subagent sessions, what did I do yesterday, did we already do this."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Coding Agent Sessions
|
|
@@ -15,7 +15,7 @@ Find local coding-agent sessions across agent products before answering from mem
|
|
|
15
15
|
|---|---|
|
|
16
16
|
| Codex / OpenAI Codex CLI | `references/codex.md` |
|
|
17
17
|
| Claude Code / Claude Desktop histories | `references/claude.md` |
|
|
18
|
-
| Senpi / pi coding-agent logs | `references/senpi.md` |
|
|
18
|
+
| OMO / Senpi / pi coding-agent logs | `references/senpi.md` |
|
|
19
19
|
| oh-my-pi (`omp`, `~/.omp`) and gajae-code (`gjc`, `~/.gjc`) logs | `references/senpi.md` |
|
|
20
20
|
| OpenCode / oh-my-openagent (formerly oh-my-opencode) storage | `references/opencode.md` |
|
|
21
21
|
| OpenClaw, Droid, Amp, Gemini, Kimi, Qwen, Codebuff, Roo/Kilo/Cline, Kodu, Cursor CLI, Aider, Kiro, Goose, Hermes, Crush, Zed, Aside | `references/all-platforms.md` |
|
|
@@ -120,6 +120,7 @@ Use `references/codex.md` for Codex storage details.
|
|
|
120
120
|
|---|---|
|
|
121
121
|
| Missing Codex sessions | Set `CODEX_HOME` or pass `--root /path/to/.codex`. |
|
|
122
122
|
| Missing oh-my-pi / gajae-code sessions | Those stores live in `~/.omp/agent/sessions` and `~/.gjc/agent/sessions`. For a custom `PI_CONFIG_DIR` / `PI_CODING_AGENT_DIR`, pass that agent dir with `--root`. |
|
|
123
|
+
| Missing OMO / Senpi sessions | The `senpi` platform searches `~/.omo/agent/sessions`, `~/.senpi/agent/sessions`, and `~/.pi/agent/sessions` (plus matching profile roots). Pass a nonstandard agent directory with `--root`. |
|
|
123
124
|
| Missing OpenCode sessions | Pass the data dir that contains `messages/` and `parts/`, often `~/.opencode` or `~/.local/share/opencode`. |
|
|
124
125
|
| Missing Claude sessions | Search `~/.claude/projects`, `~/.claude/transcripts`, and `~/.claude/pre-compact-session-histories`; use `--root` for nonstandard config dirs. |
|
|
125
126
|
| Missing Aside sessions | The Aside browser agent stores per-user data under `~/.aside/u/<n>/` (`sessions/<date>_<id>/messages.jsonl` transcripts + a `state.db` index; `agents/*/sessions/` is just a hardlink mirror). Pass `--root` for a nonstandard `.aside` dir or an exported user dir. |
|
|
@@ -10,7 +10,7 @@ Registered platform keys: `codex`, `claude`, `senpi`, `oh-my-pi`, `gajae-code`,
|
|
|
10
10
|
|---|---|---|
|
|
11
11
|
| Codex | `$CODEX_HOME`, `~/.codex` | `%CODEX_HOME%`, `%USERPROFILE%\.codex` |
|
|
12
12
|
| Claude | `~/.claude` | `%USERPROFILE%\.claude`, `%APPDATA%\Claude` |
|
|
13
|
-
| Senpi / pi | `~/.senpi/agent`, `~/.pi/agent` | `%USERPROFILE%\.senpi\agent`, `%USERPROFILE%\.pi\agent` |
|
|
13
|
+
| OMO / Senpi / pi | `~/.omo/agent`, `~/.senpi/agent`, `~/.pi/agent` | `%USERPROFILE%\.omo\agent`, `%USERPROFILE%\.senpi\agent`, `%USERPROFILE%\.pi\agent` |
|
|
14
14
|
| oh-my-pi (`omp`) | `~/.omp/agent`, `~/.omp/profiles/*/agent`, `$XDG_DATA_HOME/omp` | `%USERPROFILE%\.omp\agent` |
|
|
15
15
|
| gajae-code (`gjc`) | `~/.gjc/agent`, `~/.gjc/profiles/*/agent`, `$XDG_DATA_HOME/gjc` | `%USERPROFILE%\.gjc\agent` |
|
|
16
16
|
| OpenCode | `$OPENCODE_HOME`, `~/.opencode`, `~/.local/share/opencode` | `%OPENCODE_HOME%`, `%APPDATA%\opencode`, `%USERPROFILE%\.opencode` |
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# Senpi / pi Family Coding-Agent Sessions
|
|
1
|
+
# OMO / Senpi / pi Family Coding-Agent Sessions
|
|
2
2
|
|
|
3
|
-
The pi family (Senpi, oh-my-pi, gajae-code) shares one session format, so one scanner serves all three under separate platform keys.
|
|
3
|
+
The pi family (OMO/Senpi, oh-my-pi, gajae-code) shares one session format, so one scanner serves all three under separate platform keys.
|
|
4
4
|
|
|
5
5
|
| Platform key | Aliases | Config root | Sessions |
|
|
6
6
|
|---|---|---|---|
|
|
7
|
-
| `senpi` | - | `~/.senpi`, `~/.pi` | `<root>/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl` |
|
|
7
|
+
| `senpi` | - | `~/.omo`, `~/.senpi`, `~/.pi` | `<root>/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl` |
|
|
8
8
|
| `oh-my-pi` | `omp`, `ohmypi` | `~/.omp` | `~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl` |
|
|
9
9
|
| `gajae-code` | `gjc`, `gajae` | `~/.gjc` | `~/.gjc/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl` |
|
|
10
10
|
|
|
@@ -14,7 +14,7 @@ Extra roots scanned for every pi-family platform:
|
|
|
14
14
|
- XDG stores (macOS/Linux, default profile): `$XDG_DATA_HOME/<app>/sessions/**` and `$XDG_DATA_HOME/<app>/profiles/<profile>/sessions/**`, where `<app>` is `senpi`, `omp`, or `gjc`. XDG flattens the `agent/` path segment.
|
|
15
15
|
- A custom `PI_CONFIG_DIR` / `PI_CODING_AGENT_DIR` / `GJC_CONFIG_DIR` store: pass that agent directory with `--root`.
|
|
16
16
|
|
|
17
|
-
`~/.senpi/agent/settings.json`, `models.json`, and `auth.json` provide environment context; oh-my-pi and gajae-code keep the same files plus `config.yml` and `models.yml` next to their sessions directory.
|
|
17
|
+
`~/.omo/agent` and `~/.senpi/agent` are the current and legacy OMO/Senpi stores. Their `settings.json`, `models.json`, and `auth.json` files provide environment context; oh-my-pi and gajae-code keep the same files plus `config.yml` and `models.yml` next to their sessions directory.
|
|
18
18
|
|
|
19
19
|
Common event types:
|
|
20
20
|
|
package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py
CHANGED
|
@@ -5,7 +5,7 @@ from pathlib import Path
|
|
|
5
5
|
from .transcript import env_path, existing, jsonl_parallel, recent, stem_id
|
|
6
6
|
from .types import Session
|
|
7
7
|
|
|
8
|
-
SENPI_CONFIG_DIRS = (".senpi", ".pi")
|
|
8
|
+
SENPI_CONFIG_DIRS = (".omo", ".senpi", ".pi")
|
|
9
9
|
OH_MY_PI_CONFIG_DIRS = (".omp",)
|
|
10
10
|
GAJAE_CODE_CONFIG_DIRS = (".gjc",)
|
|
11
11
|
|