oh-my-opencode 5.0.0-beta.1 → 5.0.0-beta.11

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 (202) hide show
  1. package/.agents/command/publish.md +44 -16
  2. package/.agents/skills/publish/SKILL.md +44 -16
  3. package/.agents/skills/work-with-pr/SKILL.md +37 -23
  4. package/.opencode/command/publish.md +44 -16
  5. package/.opencode/skills/work-with-pr/SKILL.md +37 -23
  6. package/README.md +12 -1
  7. package/dist/agents/atlas/agent.d.ts +0 -1
  8. package/dist/agents/sisyphus/grok-4.d.ts +20 -0
  9. package/dist/agents/sisyphus/index.d.ts +2 -0
  10. package/dist/agents/sisyphus-agent-config.d.ts +6 -0
  11. package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
  12. package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +15 -4
  13. package/dist/agents/types.d.ts +2 -2
  14. package/dist/cli/index.js +805 -534
  15. package/dist/cli/run/on-complete-hook.d.ts +2 -0
  16. package/dist/cli-node/index.js +805 -534
  17. package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
  18. package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
  19. package/dist/index.js +1566 -1217
  20. package/dist/shared/normalize-sdk-response.d.ts +1 -0
  21. package/dist/shared/shell-env.d.ts +1 -1
  22. package/dist/skills/coding-agent-sessions/SKILL.md +3 -2
  23. package/dist/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  24. package/dist/skills/coding-agent-sessions/references/senpi.md +4 -4
  25. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  26. package/dist/skills/frontend/SKILL.md +10 -7
  27. package/dist/skills/frontend/references/design/_INDEX.md +1 -0
  28. package/dist/skills/frontend/references/design/stylegallery.md +80 -0
  29. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
  30. package/dist/skills/ultimate-browsing/engine/AGENTS.md +179 -0
  31. package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
  32. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
  33. package/dist/skills/ulw-plan/SKILL.md +2 -2
  34. package/dist/skills/ulw-plan/references/full-workflow.md +27 -3
  35. package/dist/skills/ulw-plan/references/intent-clear.md +2 -1
  36. package/dist/skills/ulw-plan/references/intent-unclear.md +3 -3
  37. package/dist/tools/delegate-task/builtin-categories.d.ts +1 -0
  38. package/dist/tools/delegate-task/builtin-category-definition.d.ts +1 -0
  39. package/dist/tools/delegate-task/tool-description.d.ts +3 -1
  40. package/dist/tui.js +184 -83
  41. package/package.json +21 -19
  42. package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +44 -0
  43. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +0 -28
  44. package/packages/lsp-core/src/lsp/client-wrapper-outside-cwd.test.ts +78 -0
  45. package/packages/lsp-core/src/lsp/client-wrapper.test.ts +66 -13
  46. package/packages/lsp-core/src/lsp/client-wrapper.ts +70 -18
  47. package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
  48. package/packages/lsp-core/src/lsp/workspace-edit-adversarial.test.ts +20 -1
  49. package/packages/lsp-core/src/lsp/workspace-markers.ts +1 -0
  50. package/packages/lsp-core/src/tools/diagnostics.ts +3 -3
  51. package/packages/lsp-core/src/tools/navigation.ts +4 -2
  52. package/packages/lsp-core/src/tools/rename.ts +4 -2
  53. package/packages/lsp-core/src/tools/symbols.ts +1 -1
  54. package/packages/lsp-daemon/dist/cli.js +160 -71
  55. package/packages/lsp-daemon/dist/client.js +135 -46
  56. package/packages/lsp-daemon/dist/index.js +143 -54
  57. package/packages/lsp-tools-mcp/dist/cli.js +131 -42
  58. package/packages/lsp-tools-mcp/dist/mcp.js +131 -42
  59. package/packages/lsp-tools-mcp/dist/tools.js +131 -42
  60. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  61. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  62. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  63. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +118 -8
  64. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +118 -8
  65. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  66. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  67. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  68. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  69. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  70. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  71. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  72. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +3 -17
  73. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  74. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +147 -64
  75. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  76. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  77. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  78. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  79. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
  80. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +16 -23
  81. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
  82. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
  83. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
  84. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
  85. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
  86. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +37 -69
  87. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
  88. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +1 -15
  89. package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +3 -2
  90. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  91. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  92. package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +0 -3
  93. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +2 -16
  94. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  95. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  96. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +3 -9
  97. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +24 -12
  98. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +24 -12
  99. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  100. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  101. package/packages/omo-codex/plugin/components/ultrawork/directive.md +6 -0
  102. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  103. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  104. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +6 -0
  105. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +2 -2
  106. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +27 -3
  107. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -1
  108. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +3 -3
  109. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
  110. package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
  111. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +6 -0
  112. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  113. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  114. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -2
  115. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +108 -0
  116. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -0
  117. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
  118. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +2 -2
  119. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
  120. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +2 -35
  121. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +4 -5
  122. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  123. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  124. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  125. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  126. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  127. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  128. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  129. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  130. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  131. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  132. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  133. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  134. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  135. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  136. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  137. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  138. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  139. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  140. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  141. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  142. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  143. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  144. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  145. package/packages/omo-codex/plugin/package-lock.json +20 -20
  146. package/packages/omo-codex/plugin/package.json +1 -1
  147. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +3 -2
  148. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  149. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +4 -4
  150. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  151. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +10 -7
  152. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
  153. package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
  154. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
  155. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +179 -0
  156. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
  157. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
  158. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +6 -0
  159. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -2
  160. package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
  161. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -0
  162. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +2 -2
  163. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +27 -3
  164. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
  165. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +3 -3
  166. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
  167. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +4 -24
  168. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
  169. package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
  170. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
  171. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
  172. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
  173. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
  174. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +1 -119
  175. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
  176. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
  177. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
  178. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
  179. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
  180. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +0 -3
  181. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
  182. package/packages/omo-codex/scripts/install-dist/install-local.mjs +57 -19
  183. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
  184. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +3 -2
  185. package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  186. package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +4 -4
  187. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  188. package/packages/shared-skills/skills/frontend/SKILL.md +10 -7
  189. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
  190. package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
  191. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
  192. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +179 -0
  193. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
  194. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
  195. package/packages/shared-skills/skills/ulw-plan/SKILL.md +2 -2
  196. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +27 -3
  197. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
  198. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +3 -3
  199. package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
  200. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
  201. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
  202. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
@@ -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, /Your Codex thread link is codex:\/\/threads\/019ef350-ee78-72a3-bd5e-e40cebc3d814/);
79
- assert.match(prompt, /Work inside `\/tmp\/review-worktree`/);
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 flips the member's guide to ISOLATION IS ON with the derived branch", () => {
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:7bc4b0f020f0a1b4448cc75385a7e3c60042e3b270e304d4c1a43a859e81a4c2:b6c36b51e1610bef51d65ec06f11860411fcf0c3bece75ba263c9495c8873cbf
2
+ // omo-codex-install:1d8359e77ebe41655f091cd2e455f320cde2f9c681f0651797c47d8fdfa2dd76:db5152e3a007b805b15d782d7df1412ce8a15f343c7ab735debe608ded499b5a
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 }) && getTelemetryApiKey(env, input.product.defaultApiKey).length > 0;
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.1",
5930
+ version: "5.0.0-beta.11",
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
- return timedOut ? { kind: "timed-out" } : outcome;
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
- assert.equal(hooks.hooks.PostToolUse[0].hooks[0].statusMessage, "(OmO 4.7.6) Checking Comments");
81
- assert.equal(componentHooks.hooks.UserPromptSubmit[0].hooks[0].statusMessage, "(OmO 4.7.6) Checking Ulw-Loop Steering");
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
 
@@ -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
 
@@ -5,7 +5,7 @@ description: "MUST USE for frontend/web UI/UX/visual work: building, styling, re
5
5
 
6
6
  # Frontend
7
7
 
8
- This file is a router, not a rulebook. The rules live in four rulesets under `references/`; your first job is to load the smallest set of files that covers the request, state which you loaded in one sentence, then execute under their guidance. Loading nothing and freestyling produces the generic AI-slop output this skill exists to prevent; loading everything wastes context and creates contradictory instructions.
8
+ This file is a router, not a rulebook. The rules live in four rulesets under `references/`, and reading them is the work, not the preamble to it. Before touching any file, name the references the request routes to and the one reason each is needed, then read exactly those. Declaring the set first is what makes the choice reviewable: a reference you never named is one you decided to skip, and a reference you named but never opened is a gap you still owe. Freestyling past the routed set produces the generic AI-slop output this skill exists to prevent.
9
9
 
10
10
  **The bar is not clean-and-correct — it is work a senior designer at Linear, Stripe, or Supabase would ship.** Correct-but-flat is a failure, not a finish. Protect the surface as hard as you protect the build: design is a first-class deliverable, not a one-shot decision you lock and walk away from.
11
11
 
@@ -14,12 +14,13 @@ This file is a router, not a rulebook. The rules live in four rulesets under `re
14
14
  | Request involves… | Read |
15
15
  |---|---|
16
16
  | ANY UI implementation, styling, redesign, mockup, or visual decision | `references/design/README.md` FIRST. It enforces two mandatory gates — the Design System Gate (a `DESIGN.md` must exist before any component is written) and the React Dev Tooling Gate (react-grab / react-scan / react-doctor installed by default) — then routes to the taste and brand references below. |
17
+ | Spatial structure — app shells, scroll ownership, "what goes where", "this layout breaks at X" | ALSO `references/design/layout-skill.md` for the mechanics, then `references/design/stylegallery.md` to fetch a named pattern contract for that exact spatial problem. Both stack on the style skill and add no visual direction. |
17
18
  | Interaction or motion work — micro-interactions, animated components, transitions, gestures, hover/press/state feedback, "make it feel alive" | ALSO `references/design/interaction-skill.md`. The beui.dev catalog is the mandatory interaction reference: find the nearest pattern, read its real source through the file's curl recipe, and adapt the mechanism to `DESIGN.md` motion tokens. It stacks on the routed style skill — never replaces it. |
18
19
  | Writing or modifying frontend code, OR auditing performance / SEO / accessibility / quality | ALSO `references/perfection/README.md`. Lighthouse 100 in every category, measured on real Playwright Chromium (never the `lighthouse` CLI), achieved through architecture — never by dropping animations or hiding content. |
19
- | Looking up a concrete style, color palette, font pairing, chart type, landing-page structure, or UX guideline — or generating a project design system from keywords | `references/ui-ux-db/README.md`. A searchable CSV database with a CLI; a lookup tool, not a posture. Load on demand; `design` stays the source of truth for taste and the `DESIGN.md` contract. |
20
- | ANY implementation or redesign that creates or updates `DESIGN.md` — plus explicit operating-layer asks (personas, critique, debt, handoff, synthetic user testing) | `references/designpowers/README.md` + `references/designpowers/lane-c-review.md`. An internal frontend ruleset, not a separate skill: lane-c is the Phase Final flatness/critique reviewer, and its accessibility-constraints and accepted-debt language fills the required `DESIGN.md` sections. Load other lanes only when their phase applies. |
20
+ | Looking up a concrete style, palette, font pairing, chart type, landing structure, or UX guideline — or generating a design system from keywords | `references/ui-ux-db/README.md`. A searchable CSV database with a CLI: a lookup tool, not a posture. `design` stays the source of truth for taste and the `DESIGN.md` contract. |
21
+ | ANY implementation or redesign that creates or updates `DESIGN.md` — plus explicit operating-layer asks (personas, critique, debt, handoff, synthetic user testing) | `references/designpowers/README.md` + `lane-c-review.md`. lane-c is the Phase Final flatness/critique reviewer and fills the accessibility-constraint and accepted-debt sections `DESIGN.md` requires. Load other lanes only when their phase applies. |
21
22
 
22
- **For implementation work, design + perfection load together.** A page that hits Lighthouse 100 but looks like AI slop has failed; a page that looks beautiful but ships a 2 MB bundle has failed. Both win or neither does.
23
+ **For implementation work, design + perfection load together.** Beauty with a 2 MB bundle fails; Lighthouse 100 that looks like AI slop fails. Both win or neither does.
23
24
 
24
25
  ## Design System and Component Workflow
25
26
 
@@ -32,12 +33,13 @@ Every implementation must choose one of these branches before UI code changes:
32
33
  2. **Greenfield or fresh setup:** if the user gave no concrete visual reference, design research is a build step with named deliverables — not exploration to be budgeted. Exploration-stop instincts ("enough exploration", two-wave caps) do not apply here. Fire every research lane IN PARALLEL before `DESIGN.md` is written, and open `DESIGN.md` with a `## 0. Research Log` section recording each lane's deliverable — a lane with no Research Log line did not run. Skip a lane only when its tool or network is genuinely unavailable, and name the skip in `DESIGN.md`:
33
34
  - **Embedded references:** use `references/design/_INDEX.md` to shortlist 2-3 plausible Layer B references, then read exactly one Layer A style skill and one Layer B reference in full — every line, no partial reads (they are 200-500 lines; a sliced read produces the flattened token set this gate exists to prevent). Log the shortlist, the pick, and why. Use `open-design` only when the curated set has no fit; add `ui-ux-db` lookups for palette/type/domain questions.
34
35
  - **Lazyweb real-product screens:** READ `references/design/lazyweb.md` FIRST and run its recipe verbatim — do not improvise curl calls against lazyweb.com; the recipe mints its own anonymous token. Log the queries run, how many screens you actually VIEWED, and the layout grammar harvested — never pixel copies.
36
+ - **StyleGallery spatial patterns:** read `references/design/stylegallery.md` and fetch the pattern whose primary spatial problem matches the screen. Log the pattern adopted and the element that owns the scroll.
35
37
  - **Imagen concept drafts:** generate 2-3 imagen concept drafts, each seeded with the loaded Layer A + Layer B tokens (palette, type, material); pick the strongest and treat the chosen draft as the reference-fidelity contract. Log the draft paths and the pick.
36
38
  Synthesize every lane into `DESIGN.md`. Treat sources as source material, not mood labels: extract tokens, layout grammar, component anatomy, interaction states, motion, and taste decisions, then recombine them into project-specific primitives. Before laying out sections, inventory the content blocks and assign each a job — hook, explain, prove, compare, convert, navigate, retain — then order sections by the visitor's decision path, not by visual symmetry. Never freestyle past the selected references, never copy logos or brand-specific copy. Then run the Primitive Showcase Gate (`references/design/README.md` Phase 0) before any product screen.
37
39
  3. **Existing project with `DESIGN.md` or a component system:** read it, follow it, and update it before implementation only when the requested work needs a new token, primitive, state, motion rule, accessibility constraint, accepted debt, or reference-fidelity requirement.
38
40
  4. **Existing project with UI but no `DESIGN.md` and no reusable component layer:** STOP and ask the user one focused question: should you preserve the current look with copy-nearby styling, or extract a real `DESIGN.md` plus reusable components before continuing? Do not silently choose.
39
41
 
40
- For implementation, redesign, or design-system work that creates or updates `DESIGN.md`, `references/designpowers/README.md` + `lane-c-review.md` are part of the default load — feed their personas, accessibility, critique, debt, handoff, and role-reference guidance into the branch above. The resulting `DESIGN.md` is the implementation contract: tokens, typography, spacing, primitives, motion, responsive behavior, accessibility constraints, and accepted debt must be named there before code uses them. Verify component primitives, states, and final screens with real visual QA evidence; pass design-system decisions, implementation evidence, and unresolved debt into `/review-work` for significant implementation work.
42
+ The resulting `DESIGN.md` is the implementation contract: tokens, typography, spacing, primitives, motion, responsive behavior, accessibility constraints, and accepted debt must be named there before code uses them. Verify component primitives, states, and final screens with real visual QA evidence; pass design-system decisions, implementation evidence, and unresolved debt into `/review-work` for significant implementation work.
41
43
 
42
44
  ## Ruleset 1 — design (`references/design/`)
43
45
 
@@ -104,7 +106,7 @@ Domains: `product` `style` `typography` `color` `landing` `chart` `ux` `react` `
104
106
 
105
107
  ## Ruleset 4 — designpowers (`references/designpowers/`)
106
108
 
107
- `README.md` routes design operating-layer guidance from the pinned `Owl-Listener/designpowers` reference corpus into the existing frontend workflow. Load it — together with `lane-c-review.md` — for every implementation or redesign that creates or updates `DESIGN.md`, and additionally when a task needs explicit personas, accessibility and cognitive constraints, design critique, design debt, handoff, synthetic user testing, motion guidance, or role-reference prompts. It does not replace this frontend skill, `/visual-qa`, `/ulw-plan`, `/start-work`, or `/review-work`; it supplies richer design context that must first be distilled into the project `DESIGN.md`, then used as the design-system contract for implementation and verification.
109
+ `README.md` routes the pinned `Owl-Listener/designpowers` corpus into this workflow. It supplies design context — personas, accessibility and cognitive constraints, critique, debt, handoff, synthetic user testing, motion, role prompts — that must be distilled into `DESIGN.md` first, then used as the implementation contract. It replaces nothing: not this skill, not `/visual-qa`, `/ulw-plan`, `/start-work`, or `/review-work`.
108
110
 
109
111
  ## Quick routes — most common requests
110
112
 
@@ -120,6 +122,7 @@ Domains: `product` `style` `typography` `color` `landing` `chart` `ux` `react` `
120
122
  | "Audit my site" / "make this page faster" | `perfection/README.md` (+ `perfection/react-perf-tooling.md` if React) |
121
123
  | "Mockup image of a fintech app" — no code | `design/imagegen-frontend-mobile.md` (+ a Layer B brand if named) |
122
124
  | "What palette/fonts fit a wellness brand?" | `ui-ux-db/README.md` → search CLI |
125
+ | "Where should this go?" / "the layout breaks" / scroll + containment | `design/layout-skill.md` + `design/stylegallery.md` on the current style skill |
123
126
  | "What do shipped apps in this space look like?" / design-direction research | `design/lazyweb.md` (curl-only) + `design/_INDEX.md` shortlist |
124
127
  | "Set up this React project" | `design/README.md` + `design/react-dev-tooling-skill.md` |
125
128
  | "Use designpowers", "make the design workflow stronger", "add personas/accessibility/debt/handoff" | `design/README.md` + `designpowers/README.md` (+ `perfection/README.md` if implementation or audit follows) |
@@ -127,7 +130,7 @@ Domains: `product` `style` `typography` `color` `landing` `chart` `ux` `react` `
127
130
  ## Shared axioms (all four rulesets agree — apply always)
128
131
 
129
132
  - **No design system = no UI work.** `DESIGN.md` exists before components do; every color, font size, and spacing value traces back to a token in it.
130
- - **Concrete reference = contract.** When a screenshot, generated mockup, overview, or annotated reference exists, the implementation must match its pixels, copy, component structure, and responsive intent unless the user explicitly accepts a deviation.
133
+ - **Concrete reference = contract.** When a screenshot, mockup, or annotated reference exists, match its pixels, copy, component structure, and responsive intent unless the user accepts a deviation.
131
134
  - **Never weaken UX OR flatten the surface to buy points.** No dropping animations, hiding content, simplifying interactions, or replacing rendered/lit material with flat fills and flat geometric primitives for a Lighthouse score or a deadline. Hit 100 AND keep the surface dimensional — both, or neither.
132
135
  - **No emojis as icons.** SVG icon sets only (Lucide, Heroicons, Radix, Phosphor).
133
136
  - **GPU-composited animation only** — `transform`, `opacity`, `filter`; never animate layout properties.
@@ -61,6 +61,7 @@ Beyond the 12-file Layer A library, the design ruleset carries project-original
61
61
  | `interaction-skill.md` | Interaction mechanics anchored to the beui.dev catalog: find the nearest pattern, read its real source through the curl recipe, extract the mechanism (spring config, layout strategy, enter/exit order, reduced-motion path), and adapt it to `DESIGN.md` motion tokens. | Any work adding or changing interaction or motion — micro-interactions, animated components, transitions, gestures, hover/press/state feedback, loading/success/error morphs, "make it feel alive". |
62
62
  | `layout-skill.md` | Layout mechanics: scroll ownership, the two silent CSS contracts, named primitives, content-stress matrix. Zero visual direction. | App shells, dashboards, split panes, or a layout that breaks under real content. |
63
63
  | `lazyweb.md` | Curl-only real-product screen research for design direction. | Greenfield design research lanes. |
64
+ | `stylegallery.md` | Curl-only lookup of named spatial pattern contracts: primary problem, constraints, scroll ownership, anti-patterns. | A concrete spatial problem needs a documented pattern, alongside `layout-skill.md` mechanics. |
64
65
  | `clone-from-url.md` | Runtime extraction workflow (browser + `getComputedStyle`) for cloning a named site. | A live site or URL is the visual reference. |
65
66
 
66
67
  ---