oh-my-opencode 4.11.1 → 4.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/codex-qa/scripts/lib/app-server-client.mjs +132 -82
- package/.agents/skills/codex-qa/scripts/lib/app-server-client.test.js +48 -0
- package/.agents/skills/opencode-qa/scripts/serve-wake-split-probe.sh +361 -84
- package/.agents/skills/work-with-pr/SKILL.md +19 -5
- package/.opencode/skills/work-with-pr/SKILL.md +19 -5
- package/dist/agents/types.d.ts +7 -6
- package/dist/cli/index.js +460 -309
- package/dist/cli-node/index.js +460 -309
- package/dist/features/background-agent/parent-wake-flush-runner.d.ts +1 -0
- package/dist/features/background-agent/parent-wake-history-state.d.ts +1 -0
- package/dist/features/background-agent/parent-wake-session-history.d.ts +1 -47
- package/dist/features/background-agent/parent-wake-session-message.d.ts +47 -0
- package/dist/index.js +593 -310
- package/dist/plugin/tool-execute-before.d.ts +2 -0
- package/dist/plugin-handlers/plugin-components-loader.d.ts +1 -0
- package/dist/skills/ultraresearch/SKILL.md +11 -2
- package/dist/skills/ulw-plan/SKILL.md +2 -1
- package/dist/skills/ulw-plan/references/full-workflow.md +1 -1
- package/dist/skills/ulw-plan/references/intent-clear.md +2 -2
- package/dist/tools/background-task/constants.d.ts +1 -1
- package/dist/tools/delegate-task/sync-session-poller.d.ts +1 -2
- package/dist/tools/delegate-task/sync-session-turns.d.ts +3 -0
- package/dist/tui.js +25 -10
- package/package.json +13 -13
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +24 -2
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +25 -9
- 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 +336 -173
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +284 -33
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +11 -0
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +12 -0
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +34 -0
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +47 -5
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +7 -5
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +58 -96
- package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +94 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +33 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +48 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +1 -0
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +142 -0
- 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/comment-checker/test/package-smoke.test.ts +2 -71
- 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/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +26 -104
- 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/package-smoke.test.ts +12 -92
- package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +157 -234
- 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 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/src/boulder-reader.ts +227 -15
- package/packages/omo-codex/plugin/components/start-work-continuation/test/boulder-reader.test.ts +62 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +34 -3
- package/packages/omo-codex/plugin/components/teammode/dist/cli.js +94 -0
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +17 -0
- package/packages/omo-codex/plugin/components/teammode/package.json +26 -0
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +139 -0
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-guide.mjs +111 -0
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-state.mjs +250 -0
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +220 -0
- package/packages/omo-codex/plugin/components/teammode/src/cli.ts +12 -0
- package/packages/omo-codex/plugin/components/teammode/src/codex-hook.ts +125 -0
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +116 -0
- package/packages/omo-codex/plugin/components/teammode/tsconfig.json +25 -0
- 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/test-support/package-smoke-fixture.ts +158 -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/ulw-plan/SKILL.md +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +76 -49
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +17 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +17 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +17 -0
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +17 -0
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +17 -0
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +17 -0
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +17 -0
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +17 -0
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +17 -0
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +17 -0
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +17 -0
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +17 -0
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +16 -0
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +16 -0
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +16 -0
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +16 -0
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +16 -0
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +17 -0
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +16 -0
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +16 -0
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +16 -0
- package/packages/omo-codex/plugin/package-lock.json +30 -22
- package/packages/omo-codex/plugin/package.json +2 -1
- package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +15 -11
- package/packages/omo-codex/plugin/scripts/sync-hook-status-messages.mjs +15 -4
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +37 -0
- package/packages/omo-codex/plugin/skills/ast-grep/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/comment-checker/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/debugging/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/frontend/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/git-master/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/skills/init-deep/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/skills/lcx-doctor/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/skills/lcx-report-bug/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/skills/lsp/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/lsp-setup/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/programming/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/refactor/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/remove-ai-slops/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/review-work/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/rules/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/teammode/SKILL.md +139 -0
- package/packages/omo-codex/plugin/skills/teammode/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/teammode/scripts/team-guide.mjs +111 -0
- package/packages/omo-codex/plugin/skills/teammode/scripts/team-state.mjs +250 -0
- package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +220 -0
- package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +11 -2
- package/packages/omo-codex/plugin/skills/ultraresearch/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -2
- package/packages/omo-codex/plugin/skills/visual-qa/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +70 -33
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +6 -2
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +14 -1
- package/packages/omo-codex/plugin/test/bootstrap-binlinks.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/bootstrap-hooks.test.mjs +14 -6
- package/packages/omo-codex/plugin/test/bootstrap-ps-guard.test.mjs +7 -3
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +4 -3
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +24 -0
- package/packages/omo-codex/plugin/test/display-metadata.test.mjs +83 -0
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +31 -19
- package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +3 -3
- package/packages/omo-codex/plugin/test/sync-hook-status-messages.test.mjs +6 -6
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +2 -0
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +9 -4
- package/packages/omo-codex/plugin/test/teammode-safety-fixture.mjs +88 -0
- package/packages/omo-codex/plugin/test/teammode-safety.test.mjs +240 -0
- package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +48 -0
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +398 -206
- package/packages/omo-codex/scripts/install-hook-targets.test.mjs +93 -0
- package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +2 -2
- package/packages/omo-codex/scripts/install-local-bun-global-update.test.mjs +63 -0
- package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +109 -1
- package/packages/omo-codex/scripts/install-local.mjs +1 -0
- package/packages/shared-skills/skills/ultraresearch/SKILL.md +11 -2
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +2 -1
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -2
- package/packages/omo-codex/plugin/hooks/hooks.json +0 -214
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"UserPromptSubmit": [
|
|
4
|
+
{
|
|
5
|
+
"hooks": [
|
|
6
|
+
{
|
|
7
|
+
"type": "command",
|
|
8
|
+
"command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook user-prompt-submit",
|
|
9
|
+
"timeout": 10,
|
|
10
|
+
"statusMessage": "(OmO) Loading Project Rules"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sisyphuslabs/omo-codex-plugin",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.12.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@sisyphuslabs/omo-codex-plugin",
|
|
9
|
-
"version": "4.
|
|
9
|
+
"version": "4.12.0",
|
|
10
10
|
"workspaces": [
|
|
11
11
|
"components/codegraph",
|
|
12
12
|
"components/comment-checker",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"components/rules",
|
|
16
16
|
"components/lsp",
|
|
17
17
|
"components/telemetry",
|
|
18
|
+
"components/teammode",
|
|
18
19
|
"components/start-work-continuation",
|
|
19
20
|
"components/ulw-loop",
|
|
20
21
|
"components/ultrawork"
|
|
@@ -23,11 +24,6 @@
|
|
|
23
24
|
"@oh-my-opencode/shared-skills": "file:../../shared-skills"
|
|
24
25
|
}
|
|
25
26
|
},
|
|
26
|
-
"../../boulder-state": {
|
|
27
|
-
"name": "@oh-my-opencode/boulder-state",
|
|
28
|
-
"version": "0.1.0",
|
|
29
|
-
"dev": true
|
|
30
|
-
},
|
|
31
27
|
"../../comment-checker-core": {
|
|
32
28
|
"name": "@oh-my-opencode/comment-checker-core",
|
|
33
29
|
"version": "0.1.0",
|
|
@@ -97,7 +93,7 @@
|
|
|
97
93
|
},
|
|
98
94
|
"components/codegraph": {
|
|
99
95
|
"name": "@sisyphuslabs/codex-codegraph",
|
|
100
|
-
"version": "4.
|
|
96
|
+
"version": "4.12.0",
|
|
101
97
|
"bin": {
|
|
102
98
|
"omo-codegraph": "dist/cli.js"
|
|
103
99
|
},
|
|
@@ -113,7 +109,7 @@
|
|
|
113
109
|
},
|
|
114
110
|
"components/comment-checker": {
|
|
115
111
|
"name": "@code-yeongyu/codex-comment-checker",
|
|
116
|
-
"version": "4.
|
|
112
|
+
"version": "4.12.0",
|
|
117
113
|
"license": "MIT",
|
|
118
114
|
"bin": {
|
|
119
115
|
"omo-comment-checker": "dist/cli.js"
|
|
@@ -134,7 +130,7 @@
|
|
|
134
130
|
},
|
|
135
131
|
"components/git-bash": {
|
|
136
132
|
"name": "@sisyphuslabs/codex-git-bash-hook",
|
|
137
|
-
"version": "4.
|
|
133
|
+
"version": "4.12.0",
|
|
138
134
|
"bin": {
|
|
139
135
|
"omo-git-bash-hook": "dist/cli.js"
|
|
140
136
|
},
|
|
@@ -149,7 +145,7 @@
|
|
|
149
145
|
},
|
|
150
146
|
"components/lazycodex-executor-verify": {
|
|
151
147
|
"name": "@code-yeongyu/codex-lazycodex-executor-verify",
|
|
152
|
-
"version": "4.
|
|
148
|
+
"version": "4.12.0",
|
|
153
149
|
"license": "MIT",
|
|
154
150
|
"bin": {
|
|
155
151
|
"lazycodex-executor-verify": "dist/cli.js"
|
|
@@ -166,7 +162,7 @@
|
|
|
166
162
|
},
|
|
167
163
|
"components/lsp": {
|
|
168
164
|
"name": "@code-yeongyu/codex-lsp",
|
|
169
|
-
"version": "4.
|
|
165
|
+
"version": "4.12.0",
|
|
170
166
|
"license": "MIT",
|
|
171
167
|
"dependencies": {
|
|
172
168
|
"@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon"
|
|
@@ -186,7 +182,7 @@
|
|
|
186
182
|
},
|
|
187
183
|
"components/rules": {
|
|
188
184
|
"name": "@code-yeongyu/codex-rules",
|
|
189
|
-
"version": "4.
|
|
185
|
+
"version": "4.12.0",
|
|
190
186
|
"license": "MIT",
|
|
191
187
|
"dependencies": {
|
|
192
188
|
"picomatch": "^4.0.3"
|
|
@@ -208,14 +204,13 @@
|
|
|
208
204
|
},
|
|
209
205
|
"components/start-work-continuation": {
|
|
210
206
|
"name": "@code-yeongyu/codex-start-work-continuation",
|
|
211
|
-
"version": "4.
|
|
207
|
+
"version": "4.12.0",
|
|
212
208
|
"license": "MIT",
|
|
213
209
|
"bin": {
|
|
214
210
|
"omo-start-work-continuation": "dist/cli.js"
|
|
215
211
|
},
|
|
216
212
|
"devDependencies": {
|
|
217
213
|
"@biomejs/biome": "2.4.16",
|
|
218
|
-
"@oh-my-opencode/boulder-state": "file:../../../../boulder-state",
|
|
219
214
|
"@types/node": "^25.9.3",
|
|
220
215
|
"typescript": "^6.0.3",
|
|
221
216
|
"vitest": "^4.1.8"
|
|
@@ -224,9 +219,22 @@
|
|
|
224
219
|
"node": ">=20.0.0"
|
|
225
220
|
}
|
|
226
221
|
},
|
|
222
|
+
"components/teammode": {
|
|
223
|
+
"name": "@sisyphuslabs/codex-teammode",
|
|
224
|
+
"version": "4.12.0",
|
|
225
|
+
"devDependencies": {
|
|
226
|
+
"@types/node": "^25.9.3",
|
|
227
|
+
"bun-types": "^1.3.1",
|
|
228
|
+
"typescript": "^6.0.3",
|
|
229
|
+
"vitest": "^4.1.8"
|
|
230
|
+
},
|
|
231
|
+
"engines": {
|
|
232
|
+
"node": ">=20.0.0"
|
|
233
|
+
}
|
|
234
|
+
},
|
|
227
235
|
"components/telemetry": {
|
|
228
236
|
"name": "@code-yeongyu/codex-telemetry",
|
|
229
|
-
"version": "4.
|
|
237
|
+
"version": "4.12.0",
|
|
230
238
|
"license": "MIT",
|
|
231
239
|
"bin": {
|
|
232
240
|
"omo-telemetry": "dist/cli.js"
|
|
@@ -244,7 +252,7 @@
|
|
|
244
252
|
},
|
|
245
253
|
"components/ultrawork": {
|
|
246
254
|
"name": "@code-yeongyu/codex-ultrawork",
|
|
247
|
-
"version": "4.
|
|
255
|
+
"version": "4.12.0",
|
|
248
256
|
"license": "MIT",
|
|
249
257
|
"bin": {
|
|
250
258
|
"omo-ultrawork": "dist/cli.js"
|
|
@@ -262,7 +270,7 @@
|
|
|
262
270
|
},
|
|
263
271
|
"components/ulw-loop": {
|
|
264
272
|
"name": "@code-yeongyu/codex-ulw-loop",
|
|
265
|
-
"version": "4.
|
|
273
|
+
"version": "4.12.0",
|
|
266
274
|
"license": "MIT",
|
|
267
275
|
"bin": {
|
|
268
276
|
"omo-ulw-loop": "dist/cli.js"
|
|
@@ -562,10 +570,6 @@
|
|
|
562
570
|
"@emnapi/runtime": "^1.7.1"
|
|
563
571
|
}
|
|
564
572
|
},
|
|
565
|
-
"node_modules/@oh-my-opencode/boulder-state": {
|
|
566
|
-
"resolved": "../../boulder-state",
|
|
567
|
-
"link": true
|
|
568
|
-
},
|
|
569
573
|
"node_modules/@oh-my-opencode/comment-checker-core": {
|
|
570
574
|
"resolved": "../../comment-checker-core",
|
|
571
575
|
"link": true
|
|
@@ -890,6 +894,10 @@
|
|
|
890
894
|
"resolved": "components/git-bash",
|
|
891
895
|
"link": true
|
|
892
896
|
},
|
|
897
|
+
"node_modules/@sisyphuslabs/codex-teammode": {
|
|
898
|
+
"resolved": "components/teammode",
|
|
899
|
+
"link": true
|
|
900
|
+
},
|
|
893
901
|
"node_modules/@standard-schema/spec": {
|
|
894
902
|
"version": "1.1.0",
|
|
895
903
|
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sisyphuslabs/omo-codex-plugin",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.12.1",
|
|
4
4
|
"description": "Aggregate Codex plugin root for OMO components.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "npm@11.12.1",
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"components/rules",
|
|
14
14
|
"components/lsp",
|
|
15
15
|
"components/telemetry",
|
|
16
|
+
"components/teammode",
|
|
16
17
|
"components/start-work-continuation",
|
|
17
18
|
"components/ulw-loop",
|
|
18
19
|
"components/ultrawork"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
const
|
|
1
|
+
const PRODUCT_PREFIX = "(OmO)";
|
|
2
2
|
|
|
3
3
|
const WORD_OVERRIDES = new Map([
|
|
4
|
+
["codegraph", "CodeGraph"],
|
|
4
5
|
["lazycodex", "LazyCodex"],
|
|
5
6
|
["lsp", "LSP"],
|
|
6
7
|
["mcp", "MCP"],
|
|
@@ -8,13 +9,18 @@ const WORD_OVERRIDES = new Map([
|
|
|
8
9
|
]);
|
|
9
10
|
|
|
10
11
|
export function formatLazyCodexHookStatusMessage(version, label) {
|
|
11
|
-
|
|
12
|
+
void version;
|
|
13
|
+
return `${PRODUCT_PREFIX} ${normalizeLazyCodexHookStatusLabel(label)}`;
|
|
12
14
|
}
|
|
13
15
|
|
|
14
16
|
export function normalizeLazyCodexHookStatusLabel(label) {
|
|
15
17
|
const parsed = parseLazyCodexHookStatusMessage(label);
|
|
16
18
|
const rawLabel = parsed === null ? label : parsed.label;
|
|
17
|
-
const normalized = rawLabel
|
|
19
|
+
const normalized = rawLabel
|
|
20
|
+
.replace(/^\(OmO\)\s*/i, " ")
|
|
21
|
+
.replace(/\bOMO\b/gi, " ")
|
|
22
|
+
.replace(/\s+/g, " ")
|
|
23
|
+
.trim();
|
|
18
24
|
if (normalized.length === 0) return "";
|
|
19
25
|
return normalized
|
|
20
26
|
.split(" ")
|
|
@@ -23,17 +29,15 @@ export function normalizeLazyCodexHookStatusLabel(label) {
|
|
|
23
29
|
}
|
|
24
30
|
|
|
25
31
|
export function parseLazyCodexHookStatusMessage(message) {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
const trimmed = message.trim();
|
|
33
|
+
const current = /^\(OmO\)\s+(.+)$/.exec(trimmed);
|
|
34
|
+
if (current !== null) return { version: undefined, label: current[1] };
|
|
35
|
+
const legacy = /^LazyCodex\(([^)]+)\):\s+(.+)$/.exec(trimmed);
|
|
36
|
+
if (legacy === null) return null;
|
|
37
|
+
const [, version, label] = legacy;
|
|
29
38
|
return { version, label };
|
|
30
39
|
}
|
|
31
40
|
|
|
32
|
-
function normalizeVersion(version) {
|
|
33
|
-
const normalized = version.trim();
|
|
34
|
-
return normalized.length === 0 ? "local" : normalized;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
41
|
function formatWord(word) {
|
|
38
42
|
const lower = word.toLowerCase();
|
|
39
43
|
const override = WORD_OVERRIDES.get(lower);
|
|
@@ -31,6 +31,15 @@ async function readPackageVersion(path) {
|
|
|
31
31
|
return packageJson.version;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
async function readAggregateHookPaths(root) {
|
|
35
|
+
const manifest = await readJson(join(root, ".codex-plugin", "plugin.json"));
|
|
36
|
+
if (typeof manifest.hooks === "string") return [manifest.hooks];
|
|
37
|
+
if (Array.isArray(manifest.hooks)) {
|
|
38
|
+
return manifest.hooks.filter((hookPath) => typeof hookPath === "string");
|
|
39
|
+
}
|
|
40
|
+
return ["./hooks/hooks.json"];
|
|
41
|
+
}
|
|
42
|
+
|
|
34
43
|
async function readComponentNames(root) {
|
|
35
44
|
const componentsRoot = join(root, "components");
|
|
36
45
|
const entries = await readdir(componentsRoot, { withFileTypes: true });
|
|
@@ -79,10 +88,12 @@ export async function syncHookStatusMessages(root = defaultRoot, options = {}) {
|
|
|
79
88
|
const releaseVersion = readReleaseVersion(options);
|
|
80
89
|
const aggregateVersion = releaseVersion ?? (await readPackageVersion(join(root, ".codex-plugin", "plugin.json")));
|
|
81
90
|
const componentNames = await readComponentNames(root);
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
91
|
+
for (const hookPath of await readAggregateHookPaths(root)) {
|
|
92
|
+
const aggregateHooksPath = join(root, hookPath.replace(/^\.\//, ""));
|
|
93
|
+
const aggregateHooks = await readJson(aggregateHooksPath);
|
|
94
|
+
syncHooksJson(aggregateHooks, () => aggregateVersion);
|
|
95
|
+
await writeJson(aggregateHooksPath, aggregateHooks);
|
|
96
|
+
}
|
|
86
97
|
|
|
87
98
|
for (const componentName of componentNames) {
|
|
88
99
|
const componentVersion =
|
|
@@ -12,10 +12,12 @@ const skillSources = [
|
|
|
12
12
|
["comment-checker", "components/comment-checker/skills/comment-checker"],
|
|
13
13
|
["lsp", "components/lsp/skills/lsp"],
|
|
14
14
|
["rules", "components/rules/skills/rules"],
|
|
15
|
+
["teammode", "components/teammode/skills/teammode"],
|
|
15
16
|
["ulw-loop", "components/ulw-loop/skills/ulw-loop"],
|
|
16
17
|
["ulw-plan", "components/ultrawork/skills/ulw-plan"],
|
|
17
18
|
];
|
|
18
19
|
const componentSkillNames = new Set(skillSources.map(([name]) => name));
|
|
20
|
+
const skillDisplayPrefix = "(OmO) ";
|
|
19
21
|
|
|
20
22
|
const opencodeOnlyOrchestrationPattern = /\b(?:call_omo_agent|background_output|team_[a-z_]+|task)\s*\(/;
|
|
21
23
|
|
|
@@ -151,6 +153,40 @@ function applyCodexSkillOverlays(skillName, content) {
|
|
|
151
153
|
return content;
|
|
152
154
|
}
|
|
153
155
|
|
|
156
|
+
function readSkillFrontmatterName(content, fallbackName) {
|
|
157
|
+
const frontmatter = content.match(/^---\n(?<body>[\s\S]*?)\n---\n+/);
|
|
158
|
+
const rawName = frontmatter?.groups?.body.match(/^name:\s*"?([^"\n]+)"?\s*$/m)?.[1]?.trim();
|
|
159
|
+
return rawName && rawName.length > 0 ? rawName : fallbackName;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function upsertDisplayName(metadata, displayName) {
|
|
163
|
+
const content = metadata.endsWith("\n") ? metadata : `${metadata}\n`;
|
|
164
|
+
if (/^\s*display_name:/m.test(metadata)) {
|
|
165
|
+
return content.replace(/^(\s*display_name:\s*).+$/m, `$1"${displayName}"`);
|
|
166
|
+
}
|
|
167
|
+
if (/^interface:\s*$/m.test(metadata)) {
|
|
168
|
+
return content.replace(/^interface:\s*$/m, `interface:\n display_name: "${displayName}"`);
|
|
169
|
+
}
|
|
170
|
+
return `interface:\n display_name: "${displayName}"\n${content}`;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async function writeCodexSkillDisplayMetadata(skillName) {
|
|
174
|
+
const skillRoot = join(skillsRoot, skillName);
|
|
175
|
+
const skillPath = join(skillRoot, "SKILL.md");
|
|
176
|
+
const content = await readFile(skillPath, "utf8");
|
|
177
|
+
const frontmatterName = readSkillFrontmatterName(content, skillName);
|
|
178
|
+
const metadataDir = join(skillRoot, "agents");
|
|
179
|
+
const metadataPath = join(metadataDir, "openai.yaml");
|
|
180
|
+
await mkdir(metadataDir, { recursive: true });
|
|
181
|
+
let metadata = "interface:\n";
|
|
182
|
+
try {
|
|
183
|
+
metadata = await readFile(metadataPath, "utf8");
|
|
184
|
+
} catch (error) {
|
|
185
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT")) throw error;
|
|
186
|
+
}
|
|
187
|
+
await writeFile(metadataPath, upsertDisplayName(metadata, `${skillDisplayPrefix}${frontmatterName}`), "utf8");
|
|
188
|
+
}
|
|
189
|
+
|
|
154
190
|
async function adaptSkillForCodex(skillName) {
|
|
155
191
|
const skillPath = join(skillsRoot, skillName, "SKILL.md");
|
|
156
192
|
const content = await readFile(skillPath, "utf8");
|
|
@@ -158,6 +194,7 @@ async function adaptSkillForCodex(skillName) {
|
|
|
158
194
|
if (adapted !== content) {
|
|
159
195
|
await writeFile(skillPath, adapted, "utf8");
|
|
160
196
|
}
|
|
197
|
+
await writeCodexSkillDisplayMetadata(skillName);
|
|
161
198
|
}
|
|
162
199
|
|
|
163
200
|
async function syncSkills() {
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: teammode
|
|
3
|
+
description: "Codex-only team orchestration: run a named team of cooperating Codex threads with durable, script-managed state. MUST USE when the user asks Codex to create, run, coordinate, inspect, archive, or delete a team of threads/sessions, or to work on something as a team in parallel. The main session is always the leader; members are defined by a concrete part, ownership area, or perspective - never a vague job role; a bundled cross-platform script writes the .omo/teams state plus an auto-generated member field manual. Use a team when the work is not perfectly isolated but parallelizing helps, or when a task still needs exploration under a clear goal; use plain subagents when scope is perfectly isolated or the goal is ambiguous. Triggers: team mode, teammode, make a team, run as a team, team of agents, coordinate threads, parallel Codex threads, archive the team, delete the team."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Teammode
|
|
7
|
+
|
|
8
|
+
Run a named team of cooperating Codex threads under one leader, with durable state on disk.
|
|
9
|
+
This is a Codex-only workflow. It is inspired by the lifecycle concerns in the
|
|
10
|
+
Yeachan-Heo/oh-my-codex team skill, but it does not copy that runtime model and never depends
|
|
11
|
+
on an external terminal runner - it coordinates through Codex's own thread tools plus a bundled
|
|
12
|
+
state script.
|
|
13
|
+
|
|
14
|
+
## When to use a team (and when to use plain subagents instead)
|
|
15
|
+
|
|
16
|
+
Use a TEAM when EITHER holds:
|
|
17
|
+
- the work does NOT split into perfectly isolated pieces, but doing it in parallel is clearly
|
|
18
|
+
more convenient - members will need to see and react to each other's findings; or
|
|
19
|
+
- one task still needs exploration, yet its GOAL is already clear - parallel investigation under
|
|
20
|
+
a fixed objective.
|
|
21
|
+
|
|
22
|
+
Use plain subagents (`$ulw` / `multi_agent_v1.spawn_agent`) - NOT a team - when EITHER holds:
|
|
23
|
+
- the work IS perfectly isolated, so there is no coordination cost worth paying; or
|
|
24
|
+
- the GOAL is still ambiguous, where one mind should resolve direction before any fan-out.
|
|
25
|
+
|
|
26
|
+
A team buys cross-member coordination at a real overhead cost; only spend it when coordination
|
|
27
|
+
is the thing you actually need.
|
|
28
|
+
|
|
29
|
+
## You are the leader
|
|
30
|
+
|
|
31
|
+
The main session is ALWAYS the team leader. Do NOT create a separate leader thread - you
|
|
32
|
+
orchestrate directly. Members are the threads you create; they report to you, and you own the
|
|
33
|
+
final synthesis and any integration.
|
|
34
|
+
|
|
35
|
+
## Compose by part, ownership, or perspective - not by job title
|
|
36
|
+
|
|
37
|
+
A team is ALWAYS two or more members - never a single-member team. One worker on an isolated
|
|
38
|
+
job is a subagent (`multi_agent_v1.spawn_agent`), not a team; if you end up with a single member,
|
|
39
|
+
either split off a second distinct slice or drop the team and use a subagent.
|
|
40
|
+
|
|
41
|
+
Compose the team from what you actually KNOW about the work. Ground the split in real knowledge
|
|
42
|
+
of the problem, then divide it into clear, non-overlapping responsibilities - one per aspect of
|
|
43
|
+
the work - and give each member exactly one. No two members may own the same thing. Define each
|
|
44
|
+
member by a concrete slice: a specific part of the codebase, an ownership area, or a distinct
|
|
45
|
+
perspective/lens. Assigning a vague role ("backend dev", "release analyst", "the tester") is an
|
|
46
|
+
anti-pattern - it gives the member no real boundary and invites overlap. Each member's `focus`
|
|
47
|
+
names what they own concretely; the `lens` is one of `area`, `ownership`, or `perspective`.
|
|
48
|
+
|
|
49
|
+
## Run the script - never hand-write team state
|
|
50
|
+
|
|
51
|
+
A bundled, dependency-free Node script owns all team state so you never author `team.json` or
|
|
52
|
+
the member manual by hand. Run it with `node` (or `bun`); it works on macOS, Linux, and Windows.
|
|
53
|
+
Replace `<skill-root>` with this skill's own directory.
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
node "<skill-root>/scripts/team.mjs" init --name "<team>" --session-name "<session>" [--session <leader_session_id>] [--worktree] [--base-branch dev]
|
|
57
|
+
node "<skill-root>/scripts/team.mjs" add-member --team <session_id> --id A --focus "<part/ownership/perspective>" --lens area|ownership|perspective --deliverable "<...>" [--branch <branch>]
|
|
58
|
+
node "<skill-root>/scripts/team.mjs" bind-thread --team <session_id> --id A --thread <thread_id> [--cwd <path>]
|
|
59
|
+
node "<skill-root>/scripts/team.mjs" member-prompt --team <session_id> --id A
|
|
60
|
+
node "<skill-root>/scripts/team.mjs" set-status --team <session_id> --id A --status reported|blocked|active|archived [--note "<...>"]
|
|
61
|
+
node "<skill-root>/scripts/team.mjs" archive --team <session_id> [--id A]
|
|
62
|
+
node "<skill-root>/scripts/team.mjs" delete --team <session_id> [--force]
|
|
63
|
+
node "<skill-root>/scripts/team.mjs" status --team <session_id>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
`init` creates `.omo/teams/{session_id}/` containing `team.json` (the single durable state file:
|
|
67
|
+
team id, the main-session leader, the member roster, status, worktree config, and a lifecycle
|
|
68
|
+
log), `guide.md` (the auto-generated member field manual), and `artifacts/` (a shared exchange
|
|
69
|
+
space). `{session_id}` is the leader's Codex session id when you can pass it via `--session`;
|
|
70
|
+
otherwise the script generates a stable handle. Re-running `init` is a safe no-op. Every mutating
|
|
71
|
+
subcommand rewrites `guide.md`, so the manual always matches the current team.
|
|
72
|
+
|
|
73
|
+
## Create the team and its threads
|
|
74
|
+
|
|
75
|
+
1. `init` the team, then `add-member` once per member.
|
|
76
|
+
2. Create a durable thread per member with `codex_app.create_thread` - ALWAYS this tool for every
|
|
77
|
+
member, never a spawned agent - titled EXACTLY
|
|
78
|
+
`[team name] {session name}` (keep this convention strictly). If `codex_app.create_thread`
|
|
79
|
+
accepts a working directory / cwd argument, set it to that member's worktree; otherwise the
|
|
80
|
+
member's manual tells it to `cd` there first. Use `codex_app.set_thread_title` if the title
|
|
81
|
+
did not land at creation.
|
|
82
|
+
3. `bind-thread` to record each thread id (and `--cwd`), then send that member's bootstrap
|
|
83
|
+
trigger (printed by `add-member` / `member-prompt`) as the thread's first message. The trigger
|
|
84
|
+
is short on purpose: it tells the new thread to READ its `guide.md` and `team.json` rather than
|
|
85
|
+
carrying the whole protocol inline.
|
|
86
|
+
|
|
87
|
+
Every team member is a real Codex thread created with `codex_app.create_thread` - this is strict,
|
|
88
|
+
not a preference. NEVER substitute `multi_agent_v1.spawn_agent`, or any other in-process subagent,
|
|
89
|
+
for a team member: a spawned agent is an ephemeral helper that does not show up as a team thread,
|
|
90
|
+
cannot carry the `[team name] {session name}` title, and cannot be inspected, titled, archived, or
|
|
91
|
+
re-opened with the `codex_app.*` thread tools - which defeats the entire point of a durable team.
|
|
92
|
+
A member only counts once you have `bind-thread`-ed it to a real `codex_app.create_thread` thread
|
|
93
|
+
id. If the thread-creation tool is unavailable, STOP and say so (see Stop rules); do not quietly
|
|
94
|
+
fall back to a spawned agent.
|
|
95
|
+
|
|
96
|
+
## Communication
|
|
97
|
+
|
|
98
|
+
Coordinate with `codex_app.send_message_to_thread` (leader-to-member and peer digests) and inspect
|
|
99
|
+
status with `codex_app.read_thread`. The generated manual already binds members to the hard rules,
|
|
100
|
+
so you mostly enforce them: all member-to-member and member-to-leader communication is in English;
|
|
101
|
+
when the END user addresses a member, that member replies in the user's own language. Members
|
|
102
|
+
over-communicate relentlessly - constant, small, lean updates that report every finding, hand-off,
|
|
103
|
+
and even the smallest or most trivial step as it happens rather than one final dump - and send
|
|
104
|
+
`WORKING:`/`BLOCKED:` markers so the leader always knows their state; stale, stuck, or
|
|
105
|
+
silently-blocked members are not acceptable, and a finished
|
|
106
|
+
member reports to the leader immediately. Members hand off files and
|
|
107
|
+
memos through the team `artifacts/` directory and reference them by path instead of pasting large
|
|
108
|
+
content. Wait for every required member's final report before you declare the team done.
|
|
109
|
+
|
|
110
|
+
## Worktrees (optional isolation)
|
|
111
|
+
|
|
112
|
+
When parallel members would edit overlapping files, enable isolation with `init --worktree`. Create
|
|
113
|
+
one git worktree per member off the base branch, `bind-thread --cwd <worktree>` so each member's
|
|
114
|
+
worktree is recorded in `team.json`, and rely on the manual to direct each member into its own
|
|
115
|
+
worktree. Each member commits inside its worktree so you can integrate.
|
|
116
|
+
|
|
117
|
+
## Archive, delete, and cleanup
|
|
118
|
+
|
|
119
|
+
DISBAND the team the moment it is no longer needed. A team exists only to do its work; once that
|
|
120
|
+
work is done, or the user no longer wants it, do not leave it lying around - archive every member,
|
|
121
|
+
then delete the team state. A finished team that is never disbanded is a leak.
|
|
122
|
+
|
|
123
|
+
- `archive` closes the team: notify each active member, copy anything useful into `artifacts/`,
|
|
124
|
+
archive each member thread with `codex_app.set_thread_archived`, then `archive` flips the team
|
|
125
|
+
and all members to archived. If a thread-archive tool is unavailable, record that in the team log
|
|
126
|
+
and tell the user - never pretend a member was archived.
|
|
127
|
+
- `delete` removes `.omo/teams/{session_id}` and refuses while the team is unarchived or any member
|
|
128
|
+
is still active unless `--force`.
|
|
129
|
+
- When the work wraps up, integrate each member's worktree the way the user asked - merge directly,
|
|
130
|
+
or open a fresh PR and merge it - then archive and delete. Cleanup is real work; respect the
|
|
131
|
+
user's instruction on how to land it.
|
|
132
|
+
|
|
133
|
+
## Stop rules
|
|
134
|
+
|
|
135
|
+
- Stop and ask before deleting an unarchived team while any member is still active.
|
|
136
|
+
- Member communication stays English unless the user explicitly requests otherwise; user-facing
|
|
137
|
+
replies follow the user's language.
|
|
138
|
+
- Stop if the requested operation needs Codex thread tools (create/read/send/title/archive) and
|
|
139
|
+
they are unavailable; say so instead of faking it.
|