oh-my-opencode 4.13.0 → 4.14.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/SKILL.md +15 -0
- package/.agents/skills/codex-qa/references/isolation.md +1 -1
- package/.agents/skills/codex-qa/references/logging-debug.md +12 -0
- package/.agents/skills/opencode-qa/SKILL.md +17 -0
- package/.agents/skills/opencode-qa/references/tui-tmux.md +17 -0
- package/.agents/skills/work-with-pr/SKILL.md +18 -10
- package/.opencode/skills/work-with-pr/SKILL.md +18 -10
- package/README.md +3 -3
- package/dist/cli/doctor/checks/telemetry.d.ts +2 -0
- package/dist/cli/doctor/framework/constants.d.ts +1 -0
- package/dist/cli/doctor/framework/doctor-target.d.ts +1 -1
- package/dist/cli/doctor/framework/types.d.ts +2 -0
- package/dist/cli/index.js +24779 -17857
- package/dist/cli-node/index.js +24779 -17857
- package/dist/config/schema/oh-my-opencode-config.d.ts +1 -0
- package/dist/features/team-mode/test-support/async-test-helpers.d.ts +19 -0
- package/dist/hooks/atlas/final-wave-approval-gate.d.ts +1 -0
- package/dist/hooks/atlas/subagent-completion-reminder.d.ts +30 -0
- package/dist/hooks/atlas/types.d.ts +2 -0
- package/dist/hooks/atlas/verification-reminders.d.ts +3 -0
- package/dist/hooks/team-session-events/team-idle-wake-hint.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +43845 -26631
- package/dist/mcp/context7.d.ts +9 -8
- package/dist/oh-my-opencode.schema.json +4 -0
- package/dist/plugin/native-skills.d.ts +9 -0
- package/dist/plugin/system-transform.d.ts +1 -1
- package/dist/shared/posthog.d.ts +17 -10
- package/dist/shared/telemetry-product-identity.d.ts +2 -0
- package/dist/skills/coding-agent-sessions/SKILL.md +128 -0
- package/dist/skills/coding-agent-sessions/agents/openai.yaml +4 -0
- package/dist/skills/coding-agent-sessions/references/all-platforms.md +71 -0
- package/dist/skills/coding-agent-sessions/references/claude.md +32 -0
- package/dist/skills/coding-agent-sessions/references/codex.md +30 -0
- package/dist/skills/coding-agent-sessions/references/opencode.md +43 -0
- package/dist/skills/coding-agent-sessions/references/senpi.md +17 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/__init__.py +1 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/claude.py +66 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +283 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/codex.py +105 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +275 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/jsonio.py +55 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/kiro_scanner.py +91 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/opencode.py +289 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +92 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_optional_scanners.py +203 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_scanners.py +177 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/timeparse.py +51 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +149 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/types.py +57 -0
- package/dist/skills/coding-agent-sessions/scripts/find-agent-sessions.py +19 -0
- package/dist/skills/frontend/ATTRIBUTION.md +52 -8
- package/dist/skills/frontend/SKILL.md +29 -8
- package/dist/skills/frontend/references/design/README.md +29 -12
- package/dist/skills/frontend/references/design/_INDEX.md +3 -3
- package/dist/skills/frontend/references/design/design-system-architecture.md +22 -19
- package/dist/skills/frontend/references/designpowers/EVIDENCE.md +89 -0
- package/dist/skills/frontend/references/designpowers/README.md +48 -0
- package/dist/skills/frontend/references/designpowers/UPSTREAM.md +80 -0
- package/dist/skills/frontend/references/designpowers/lane-a-direction.md +64 -0
- package/dist/skills/frontend/references/designpowers/lane-b-execution.md +65 -0
- package/dist/skills/frontend/references/designpowers/lane-c-review.md +65 -0
- package/dist/skills/frontend/references/designpowers/lane-d-memory.md +83 -0
- package/dist/skills/frontend/references/designpowers/orchestration.md +80 -0
- package/dist/skills/frontend/references/designpowers/routing.md +79 -0
- package/dist/skills/frontend/references/designpowers/vendor/LICENSE +21 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/content-writer.md +132 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/design-builder.md +109 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/design-critic.md +89 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/design-lead.md +113 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/design-scout.md +78 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/design-strategist.md +121 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/motion-designer.md +120 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/accessible-content/SKILL.md +101 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/SKILL.md +109 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/SKILL.md +107 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-debate/SKILL.md +199 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/SKILL.md +174 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-handoff/SKILL.md +125 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-md/SKILL.md +106 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-retrospective/SKILL.md +266 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-review/SKILL.md +123 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/SKILL.md +120 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/SKILL.md +164 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/SKILL.md +85 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/SKILL.md +98 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/SKILL.md +165 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/interaction-design/SKILL.md +122 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/motion-choreography/SKILL.md +81 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/research-planning/SKILL.md +96 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/SKILL.md +77 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/SKILL.md +192 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/taste-feedback/SKILL.md +165 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/taste-report/SKILL.md +78 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/token-architecture/SKILL.md +75 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/ui-composition/SKILL.md +117 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/usability-testing/SKILL.md +78 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/SKILL.md +125 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/SKILL.md +79 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/SKILL.md +119 -0
- package/dist/skills/frontend/references/ui-ux-db/scripts/core.py +0 -0
- package/dist/skills/git-master/SKILL.md +4 -0
- package/dist/skills/lcx-contribute-bug-fix/SKILL.md +44 -13
- package/dist/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
- package/dist/skills/lcx-doctor/SKILL.md +48 -13
- package/dist/skills/lcx-doctor/agents/openai.yaml +1 -1
- package/dist/skills/lcx-report-bug/SKILL.md +44 -13
- package/dist/skills/lcx-report-bug/agents/openai.yaml +1 -1
- package/dist/skills/review-work/SKILL.md +3 -3
- package/dist/skills/start-work/SKILL.md +7 -5
- package/dist/skills/ultraresearch/SKILL.md +4 -252
- package/dist/skills/ulw-plan/SKILL.md +8 -6
- package/dist/skills/ulw-plan/references/full-workflow.md +11 -6
- package/dist/skills/ulw-plan/references/intent-clear.md +3 -3
- package/dist/skills/ulw-plan/references/intent-unclear.md +1 -1
- package/{packages/shared-skills/skills/ultraresearch → dist/skills/ulw-research}/ATTRIBUTION.md +1 -1
- package/dist/skills/ulw-research/SKILL.md +260 -0
- package/dist/skills/visual-qa/SKILL.md +109 -18
- package/dist/skills/visual-qa/references/agent-browser-setup.md +5 -4
- package/dist/skills/visual-qa/scripts/cli.test.ts +7 -2
- package/dist/skills/visual-qa/scripts/skill-prompt-contract.test.ts +130 -3
- package/dist/skills/visual-qa/scripts/visual-qa.mjs +530 -0
- package/dist/testing/create-plugin-module.d.ts +2 -0
- package/dist/tools/delegate-task/skill-resolver.d.ts +1 -0
- package/dist/tools/delegate-task/types.d.ts +2 -0
- package/dist/tools/skill/types.d.ts +1 -0
- package/dist/tui.js +23917 -16117
- package/docs/reference/github-attachment-upload.md +51 -0
- package/docs/reference/web-terminal-visual-qa.md +81 -0
- package/package.json +33 -14
- package/packages/git-bash-mcp/dist/cli.js +2 -0
- package/packages/lsp-core/src/lsp/process.ts +4 -1
- package/packages/lsp-core/src/mcp.ts +1 -0
- package/packages/lsp-daemon/dist/cli.js +20 -5
- package/packages/lsp-daemon/dist/ensure-daemon.d.ts +1 -0
- package/packages/lsp-daemon/dist/ensure-daemon.js +9 -3
- package/packages/lsp-daemon/dist/index.js +20 -5
- package/packages/lsp-daemon/dist/paths.d.ts +1 -0
- package/packages/lsp-daemon/dist/paths.js +6 -1
- package/packages/lsp-daemon/dist/proxy.js +1 -0
- package/packages/lsp-tools-mcp/dist/cli.js +5 -1
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +4 -1
- package/packages/lsp-tools-mcp/dist/mcp.js +5 -1
- package/packages/lsp-tools-mcp/dist/tools.js +4 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +327 -69
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/scripts/bootstrap.ps1 +37 -68
- package/packages/omo-codex/plugin/components/bootstrap/scripts/node-dispatch.ps1 +75 -0
- package/packages/omo-codex/plugin/components/bootstrap/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +3 -19
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +688 -334
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +317 -39
- package/packages/omo-codex/plugin/components/codegraph/package.json +2 -2
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +7 -1
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +103 -3
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +231 -0
- package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +29 -0
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +31 -57
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +7 -4
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +43 -9
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +287 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +12 -7
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +71 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +94 -26
- package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.js +2 -0
- package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.d.ts +2 -0
- package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +56 -0
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/cli.ts +2 -5
- package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +2 -0
- package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +65 -0
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +6 -1
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +8 -106
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -17
- package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +6 -6
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +23 -0
- package/packages/omo-codex/plugin/components/teammode/dist/cli.js +22 -4
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +57 -7
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-guide.mjs +32 -5
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-state.mjs +63 -1
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +87 -53
- package/packages/omo-codex/plugin/components/teammode/src/codex-hook.ts +19 -4
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +32 -2
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/README.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +18 -10
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +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 +6 -4
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +11 -6
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +3 -3
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +24 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +7 -28
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +25 -21
- package/packages/omo-codex/plugin/components/ulw-loop/biome.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +373 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +14 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +145 -14
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.d.ts +6 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +16 -6
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.d.ts +5 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.js +104 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +5 -2
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +22 -14
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +14 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +28 -6
- package/packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-directive.ts +113 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +33 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-kind-guidance.test.ts +31 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +13 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/sample-quality-gate.json +7 -7
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +39 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-doc.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +7 -6
- package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +64 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +2 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +2 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +2 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +2 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +2 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +2 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +2 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +2 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +2 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +2 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +2 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +2 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +2 -1
- package/packages/omo-codex/plugin/package-lock.json +16 -56
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +9 -5
- package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +1 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/context7-placeholder-guard.mjs +131 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-mode-guard.mjs +60 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +3 -10
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/root-settings.mjs +31 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +73 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +20 -3
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +30 -8
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +128 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/agents/openai.yaml +4 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +71 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/claude.md +32 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/codex.md +30 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/opencode.md +43 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +17 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/__init__.py +1 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/claude.py +66 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +283 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/codex.py +105 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +275 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/jsonio.py +55 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/kiro_scanner.py +91 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/opencode.py +289 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +92 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_optional_scanners.py +203 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_scanners.py +177 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/timeparse.py +51 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +149 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/types.py +57 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/find-agent-sessions.py +19 -0
- package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +52 -8
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +29 -8
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +29 -12
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +3 -3
- package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +22 -19
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/EVIDENCE.md +89 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +48 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/UPSTREAM.md +80 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +64 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +65 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-c-review.md +65 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +83 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +80 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +79 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/LICENSE +21 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/content-writer.md +132 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-builder.md +109 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-critic.md +89 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-lead.md +113 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-scout.md +78 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-strategist.md +121 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/motion-designer.md +120 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/accessible-content/SKILL.md +101 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/SKILL.md +109 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/SKILL.md +107 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debate/SKILL.md +199 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/SKILL.md +174 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-handoff/SKILL.md +125 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-md/SKILL.md +106 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-retrospective/SKILL.md +266 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-review/SKILL.md +123 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/SKILL.md +120 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/SKILL.md +164 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/SKILL.md +85 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/SKILL.md +98 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/SKILL.md +165 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/interaction-design/SKILL.md +122 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/motion-choreography/SKILL.md +81 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/research-planning/SKILL.md +96 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/SKILL.md +77 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/SKILL.md +192 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-feedback/SKILL.md +165 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-report/SKILL.md +78 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/token-architecture/SKILL.md +75 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/ui-composition/SKILL.md +117 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/usability-testing/SKILL.md +78 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/SKILL.md +125 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/SKILL.md +79 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/SKILL.md +119 -0
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/core.py +0 -0
- package/packages/omo-codex/plugin/skills/git-master/SKILL.md +4 -0
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +4 -0
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +44 -13
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +48 -13
- package/packages/omo-codex/plugin/skills/lcx-doctor/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +44 -13
- package/packages/omo-codex/plugin/skills/lcx-report-bug/agents/openai.yaml +1 -1
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +4 -0
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +4 -0
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +12 -4
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +14 -8
- package/packages/omo-codex/plugin/skills/teammode/SKILL.md +57 -7
- package/packages/omo-codex/plugin/skills/teammode/scripts/team-guide.mjs +32 -5
- package/packages/omo-codex/plugin/skills/teammode/scripts/team-state.mjs +63 -1
- package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +87 -53
- package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +4 -250
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +22 -14
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -4
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +11 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +3 -3
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +1 -1
- package/{dist/skills/ultraresearch → packages/omo-codex/plugin/skills/ulw-research}/ATTRIBUTION.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +262 -0
- package/packages/omo-codex/plugin/skills/ulw-research/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +113 -18
- package/packages/omo-codex/plugin/skills/visual-qa/references/agent-browser-setup.md +5 -4
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/visual-qa.mjs +530 -0
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +23 -0
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -0
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +1 -0
- package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +24 -1
- package/packages/omo-codex/plugin/test/bootstrap-binlinks.test.mjs +61 -7
- package/packages/omo-codex/plugin/test/bootstrap-hooks.test.mjs +38 -0
- package/packages/omo-codex/plugin/test/bootstrap-ps-guard.test.mjs +25 -0
- package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +1 -7
- package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +12 -11
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +99 -1
- package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +62 -8
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +206 -6
- package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +1 -0
- package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +44 -0
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +50 -1
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +10 -7
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +28 -2
- package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +102 -0
- package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +20 -0
- package/packages/omo-codex/plugin/test/teammode-safety-fixture.mjs +41 -1
- package/packages/omo-codex/plugin/test/teammode-safety.test.mjs +93 -0
- package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +117 -0
- package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +5 -2
- package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +285 -0
- package/packages/omo-codex/scripts/install-bin-links.test.mjs +12 -1
- package/packages/omo-codex/scripts/install-cache-copy.test.mjs +79 -0
- package/packages/omo-codex/scripts/install-config-autonomous-features.test.mjs +43 -3
- package/packages/omo-codex/scripts/install-config.test.mjs +198 -17
- package/packages/omo-codex/scripts/install-delegated-command.test.mjs +93 -0
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +803 -309
- package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +21 -2
- package/packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs +24 -15
- package/packages/omo-codex/scripts/install-local.test.mjs +5 -2
- package/packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs +84 -0
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +128 -0
- package/packages/shared-skills/skills/coding-agent-sessions/agents/openai.yaml +4 -0
- package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +71 -0
- package/packages/shared-skills/skills/coding-agent-sessions/references/claude.md +32 -0
- package/packages/shared-skills/skills/coding-agent-sessions/references/codex.md +30 -0
- package/packages/shared-skills/skills/coding-agent-sessions/references/opencode.md +43 -0
- package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +17 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/__init__.py +1 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/claude.py +66 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +283 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/codex.py +105 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +275 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/jsonio.py +55 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/kiro_scanner.py +91 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/opencode.py +289 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +92 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_optional_scanners.py +203 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_scanners.py +177 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/timeparse.py +51 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +149 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/types.py +57 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/find-agent-sessions.py +19 -0
- package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +52 -8
- package/packages/shared-skills/skills/frontend/SKILL.md +29 -8
- package/packages/shared-skills/skills/frontend/references/design/README.md +29 -12
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +3 -3
- package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +22 -19
- package/packages/shared-skills/skills/frontend/references/designpowers/EVIDENCE.md +89 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/README.md +48 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/UPSTREAM.md +80 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +64 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +65 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-c-review.md +65 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +83 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +80 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +79 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/LICENSE +21 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/content-writer.md +132 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-builder.md +109 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-critic.md +89 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-lead.md +113 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-scout.md +78 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-strategist.md +121 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/motion-designer.md +120 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/accessible-content/SKILL.md +101 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/SKILL.md +109 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/SKILL.md +107 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debate/SKILL.md +199 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/SKILL.md +174 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-handoff/SKILL.md +125 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-md/SKILL.md +106 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-retrospective/SKILL.md +266 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-review/SKILL.md +123 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/SKILL.md +120 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/SKILL.md +164 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/SKILL.md +85 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/SKILL.md +98 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/SKILL.md +165 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/interaction-design/SKILL.md +122 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/motion-choreography/SKILL.md +81 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/research-planning/SKILL.md +96 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/SKILL.md +77 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/SKILL.md +192 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-feedback/SKILL.md +165 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-report/SKILL.md +78 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/token-architecture/SKILL.md +75 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/ui-composition/SKILL.md +117 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/usability-testing/SKILL.md +78 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/SKILL.md +125 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/SKILL.md +79 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/SKILL.md +119 -0
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/core.py +0 -0
- package/packages/shared-skills/skills/git-master/SKILL.md +4 -0
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +44 -13
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
- package/packages/shared-skills/skills/lcx-doctor/SKILL.md +48 -13
- package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +1 -1
- package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +44 -13
- package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +1 -1
- package/packages/shared-skills/skills/review-work/SKILL.md +3 -3
- package/packages/shared-skills/skills/start-work/SKILL.md +7 -5
- package/packages/shared-skills/skills/ultraresearch/SKILL.md +4 -252
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +8 -6
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +11 -6
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +3 -3
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +1 -1
- package/packages/{omo-codex/plugin/skills/ultraresearch → shared-skills/skills/ulw-research}/ATTRIBUTION.md +1 -1
- package/packages/shared-skills/skills/ulw-research/SKILL.md +260 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +109 -18
- package/packages/shared-skills/skills/visual-qa/references/agent-browser-setup.md +5 -4
- package/packages/shared-skills/skills/visual-qa/scripts/cli.test.ts +7 -2
- package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +130 -3
- package/packages/shared-skills/skills/visual-qa/scripts/visual-qa.mjs +530 -0
- package/script/qa/web-terminal-redaction.d.mts +13 -0
- package/script/qa/web-terminal-redaction.mjs +43 -0
- package/script/qa/web-terminal-renderer.mjs +218 -0
- package/script/qa/web-terminal-visual-qa.mjs +264 -0
- package/dist/cli/sparkshell-appserver-websocket.d.ts +0 -4
- package/dist/cli/sparkshell-appserver.d.ts +0 -16
- package/dist/cli/sparkshell-condense.d.ts +0 -10
- package/dist/cli/sparkshell-parse.d.ts +0 -24
- package/dist/cli/sparkshell-session-context.d.ts +0 -20
- package/dist/cli/sparkshell-spark.d.ts +0 -23
- package/dist/cli/sparkshell.d.ts +0 -33
- package/dist/shared/sparkshell-awareness.d.ts +0 -5
- package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +0 -106
- package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +0 -346
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +0 -110
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +0 -245
- package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +0 -204
|
@@ -3927,7 +3927,7 @@ function createRulesEngine(options, config = configFromEnvironment(options.env))
|
|
|
3927
3927
|
}
|
|
3928
3928
|
|
|
3929
3929
|
// components/rules/src/static-injection.ts
|
|
3930
|
-
import { existsSync as
|
|
3930
|
+
import { existsSync as existsSync4 } from "node:fs";
|
|
3931
3931
|
|
|
3932
3932
|
// components/rules/src/post-compact-directive.ts
|
|
3933
3933
|
var DIRECTIVE_HEADER = [
|
|
@@ -3965,96 +3965,6 @@ function buildPostCompactReadDirective(rulePaths, maxChars) {
|
|
|
3965
3965
|
`)}${DIRECTIVE_FOOTER}`;
|
|
3966
3966
|
}
|
|
3967
3967
|
|
|
3968
|
-
// components/rules/src/sparkshell-awareness.ts
|
|
3969
|
-
import { existsSync as existsSync4 } from "node:fs";
|
|
3970
|
-
import { join as join7 } from "node:path";
|
|
3971
|
-
var SPARKSHELL_AWARENESS_MARKER = "## Sparkshell Runtime";
|
|
3972
|
-
var SPARKSHELL_AWARENESS_DEDUP_KEY = "__omo_sparkshell_awareness__";
|
|
3973
|
-
function isCodexAppServerActive(env = process.env) {
|
|
3974
|
-
const originator = env["CODEX_INTERNAL_ORIGINATOR_OVERRIDE"]?.toLowerCase() ?? "";
|
|
3975
|
-
const bundleIdentifier = env["__CFBundleIdentifier"]?.toLowerCase() ?? "";
|
|
3976
|
-
const shellActive = isTruthy2(env["CODEX_SHELL"]);
|
|
3977
|
-
return shellActive && (originator.includes("codex desktop") || originator.includes("codex app") || bundleIdentifier === "com.openai.codex");
|
|
3978
|
-
}
|
|
3979
|
-
function isSparkShellAppServerConfigured(env = process.env) {
|
|
3980
|
-
const codexSocketPath = env["CODEX_APP_SERVER_SOCKET"]?.trim() ?? "";
|
|
3981
|
-
const omoSocketPath = env["OMO_SPARKSHELL_APP_SERVER_SOCKET"]?.trim() ?? "";
|
|
3982
|
-
return codexSocketPath.length > 0 || omoSocketPath.length > 0;
|
|
3983
|
-
}
|
|
3984
|
-
function resolveOmoInvocation(env = process.env, deps = {}) {
|
|
3985
|
-
const fileExists = deps.fileExists ?? existsSync4;
|
|
3986
|
-
const platform = deps.platform ?? process.platform;
|
|
3987
|
-
const binNames = platform === "win32" ? ["omo.cmd", "omo.exe", "omo"] : ["omo"];
|
|
3988
|
-
const pathDelimiter = platform === "win32" ? ";" : ":";
|
|
3989
|
-
const pathEntries = (env["PATH"] ?? "").split(pathDelimiter).filter((entry) => entry.trim().length > 0);
|
|
3990
|
-
for (const pathEntry of pathEntries) {
|
|
3991
|
-
for (const binName of binNames) {
|
|
3992
|
-
if (fileExists(join7(pathEntry, binName)))
|
|
3993
|
-
return "omo";
|
|
3994
|
-
}
|
|
3995
|
-
}
|
|
3996
|
-
for (const candidateDir of omoCandidateBinDirs(env)) {
|
|
3997
|
-
for (const binName of binNames) {
|
|
3998
|
-
const candidate = join7(candidateDir, binName);
|
|
3999
|
-
if (fileExists(candidate))
|
|
4000
|
-
return candidate;
|
|
4001
|
-
}
|
|
4002
|
-
}
|
|
4003
|
-
return null;
|
|
4004
|
-
}
|
|
4005
|
-
function omoCandidateBinDirs(env) {
|
|
4006
|
-
const dirs = [];
|
|
4007
|
-
const localBinDir = env["CODEX_LOCAL_BIN_DIR"]?.trim() ?? "";
|
|
4008
|
-
if (localBinDir.length > 0)
|
|
4009
|
-
dirs.push(localBinDir);
|
|
4010
|
-
const home = env["HOME"]?.trim() || env["USERPROFILE"]?.trim() || "";
|
|
4011
|
-
const codexHome = env["CODEX_HOME"]?.trim() || (home.length > 0 ? join7(home, ".codex") : "");
|
|
4012
|
-
if (codexHome.length > 0)
|
|
4013
|
-
dirs.push(join7(codexHome, "bin"));
|
|
4014
|
-
if (home.length > 0)
|
|
4015
|
-
dirs.push(join7(home, ".local", "bin"));
|
|
4016
|
-
return dirs;
|
|
4017
|
-
}
|
|
4018
|
-
function getSparkShellRuntimeAwareness(env = process.env, deps = {}) {
|
|
4019
|
-
const override = env["OMO_SPARKSHELL_AWARENESS"] ?? env["LAZYCODEX_SPARKSHELL_AWARENESS"];
|
|
4020
|
-
if (isFalsy(override)) {
|
|
4021
|
-
return "";
|
|
4022
|
-
}
|
|
4023
|
-
if (!isTruthy2(override) && !isCodexAppServerActive(env) && !isSparkShellAppServerConfigured(env)) {
|
|
4024
|
-
return "";
|
|
4025
|
-
}
|
|
4026
|
-
const resolved = resolveOmoInvocation(env, deps);
|
|
4027
|
-
const invocation = resolved ?? (isTruthy2(override) ? "omo" : null);
|
|
4028
|
-
if (invocation === null) {
|
|
4029
|
-
return "";
|
|
4030
|
-
}
|
|
4031
|
-
const command = /\s/.test(invocation) ? `"${invocation}"` : invocation;
|
|
4032
|
-
return [
|
|
4033
|
-
SPARKSHELL_AWARENESS_MARKER,
|
|
4034
|
-
"",
|
|
4035
|
-
`- Use \`${command} sparkshell <command>\` first for repo inspection, CLI smoke tests, git/history checks, and bounded command output. Raw \`rg\`/\`grep\`/\`cat\`/\`git\` are fallbacks when Sparkshell is unavailable or too narrow for the task.`,
|
|
4036
|
-
`- Use \`${command} sparkshell --shell '<command>'\` only for shell metacharacters or pipelines.`,
|
|
4037
|
-
`- Use \`${command} sparkshell --tmux-pane <pane-id> --tail-lines 400\` only to inspect an existing pane, never to launch ordinary commands. Tail lines must stay between 100 and 1000.`,
|
|
4038
|
-
"- When no native sidecar or appserver is available, Sparkshell silently falls back to raw command execution. `OMO_SPARKSHELL_BIN` selects a native sidecar path.",
|
|
4039
|
-
"- When `CODEX_THREAD_ID` identifies a Codex session, Sparkshell feeds recent session context (first/latest user request + last 5 conversation messages) into oversized-output condensation for relevance ranking, but never appends that context to command output. `OMO_SPARKSHELL_SESSION_CONTEXT=0` disables the lookup.",
|
|
4040
|
-
`- Route potentially huge output (full log files, big diffs, \`cat\`/\`grep\` over large artifacts) through \`${command} sparkshell\` instead of reading it raw: oversized output is condensed to a budget while preserving error signatures, repeated patterns, session-goal-relevant lines, and head/tail. Tune with \`--budget <chars>\`; disable with \`OMO_SPARKSHELL_CONDENSE=0\`.`,
|
|
4041
|
-
"- Oversized output is first summarized by the spark model (`codex exec`, default `gpt-5.3-codex-spark`) fed with the shell output plus session context: the summary keeps selected output as-is (no masking) and ends with a `[sparkshell caption]` line describing what ran, what the full output contained, and which lines were omitted. `OMO_SPARKSHELL_SPARK=0` skips the model and uses deterministic condensation directly."
|
|
4042
|
-
].join(`
|
|
4043
|
-
`);
|
|
4044
|
-
}
|
|
4045
|
-
function isTruthy2(value) {
|
|
4046
|
-
if (value === undefined) {
|
|
4047
|
-
return false;
|
|
4048
|
-
}
|
|
4049
|
-
return ["1", "true", "yes", "on"].includes(value.trim().toLowerCase());
|
|
4050
|
-
}
|
|
4051
|
-
function isFalsy(value) {
|
|
4052
|
-
if (value === undefined) {
|
|
4053
|
-
return false;
|
|
4054
|
-
}
|
|
4055
|
-
return ["0", "false", "no", "off"].includes(value.trim().toLowerCase());
|
|
4056
|
-
}
|
|
4057
|
-
|
|
4058
3968
|
// components/rules/src/transcript-rule-filter.ts
|
|
4059
3969
|
function filterRulesAlreadyInTranscript(rules, transcriptPath, markInjected, options = {}) {
|
|
4060
3970
|
if (rules.length === 0 || transcriptPath === null) {
|
|
@@ -4131,8 +4041,7 @@ function runStaticInjection(cwd, transcriptPath, eventName, cachePath, options,
|
|
|
4131
4041
|
const rules = filterRulesAlreadyInTranscript(loaded.rules.filter((rule) => !engine.isStaticInjected(rule)), transcriptPath, (rule) => {
|
|
4132
4042
|
engine.markStaticInjected(rule);
|
|
4133
4043
|
}, transcriptSearchOptions);
|
|
4134
|
-
|
|
4135
|
-
if (rules.length === 0 && sparkshellAwareness.length === 0) {
|
|
4044
|
+
if (rules.length === 0) {
|
|
4136
4045
|
persistEngineState(engine, cachePath);
|
|
4137
4046
|
return "";
|
|
4138
4047
|
}
|
|
@@ -4140,11 +4049,8 @@ function runStaticInjection(cwd, transcriptPath, eventName, cachePath, options,
|
|
|
4140
4049
|
for (const rule of rules) {
|
|
4141
4050
|
engine.markStaticInjected(rule);
|
|
4142
4051
|
}
|
|
4143
|
-
if (sparkshellAwareness.length > 0) {
|
|
4144
|
-
engine.state.staticDedup.add(SPARKSHELL_AWARENESS_DEDUP_KEY);
|
|
4145
|
-
}
|
|
4146
4052
|
persistEngineState(engine, cachePath);
|
|
4147
|
-
return formatAdditionalContextOutput(eventName,
|
|
4053
|
+
return formatAdditionalContextOutput(eventName, block);
|
|
4148
4054
|
}
|
|
4149
4055
|
function runPostCompactRecovery(input) {
|
|
4150
4056
|
const effectiveConfig = withPostCompactBudget(input.config, {
|
|
@@ -4160,8 +4066,7 @@ function runPostCompactRecovery(input) {
|
|
|
4160
4066
|
engine.markStaticInjected(rule);
|
|
4161
4067
|
});
|
|
4162
4068
|
const dynamicRulePaths = recoverDynamicRulePaths(engine, transcriptText, loaded.rules);
|
|
4163
|
-
|
|
4164
|
-
if (missingRules.length === 0 && dynamicRulePaths.length === 0 && sparkshellAwareness.length === 0) {
|
|
4069
|
+
if (missingRules.length === 0 && dynamicRulePaths.length === 0) {
|
|
4165
4070
|
persistEngineState(engine, input.cachePath, input.channel);
|
|
4166
4071
|
return "";
|
|
4167
4072
|
}
|
|
@@ -4172,11 +4077,8 @@ function runPostCompactRecovery(input) {
|
|
|
4172
4077
|
for (const rule of missingRules) {
|
|
4173
4078
|
engine.markStaticInjected(rule);
|
|
4174
4079
|
}
|
|
4175
|
-
if (sparkshellAwareness.length > 0) {
|
|
4176
|
-
engine.state.staticDedup.add(SPARKSHELL_AWARENESS_DEDUP_KEY);
|
|
4177
|
-
}
|
|
4178
4080
|
persistEngineState(engine, input.cachePath, input.channel);
|
|
4179
|
-
return formatAdditionalContextOutput(input.eventName, combineStaticContext(bodyBlock, directive
|
|
4081
|
+
return formatAdditionalContextOutput(input.eventName, combineStaticContext(bodyBlock, directive));
|
|
4180
4082
|
}
|
|
4181
4083
|
function readRecoveryTranscriptText(transcriptPath) {
|
|
4182
4084
|
if (transcriptPath === null) {
|
|
@@ -4200,7 +4102,7 @@ function recoverDynamicRulePaths(engine, transcriptText, staticRules) {
|
|
|
4200
4102
|
if (transcriptText !== null && transcriptText.includes(rulePath)) {
|
|
4201
4103
|
continue;
|
|
4202
4104
|
}
|
|
4203
|
-
if (!
|
|
4105
|
+
if (!existsSync4(rulePath)) {
|
|
4204
4106
|
continue;
|
|
4205
4107
|
}
|
|
4206
4108
|
recoveredPaths.add(rulePath);
|
|
@@ -4218,7 +4120,7 @@ function combineStaticContext(...blocks) {
|
|
|
4218
4120
|
}
|
|
4219
4121
|
|
|
4220
4122
|
// components/rules/src/tool-paths.ts
|
|
4221
|
-
import { existsSync as
|
|
4123
|
+
import { existsSync as existsSync5, statSync as statSync6 } from "node:fs";
|
|
4222
4124
|
import { isAbsolute as isAbsolute4, resolve as resolve10 } from "node:path";
|
|
4223
4125
|
var COMMAND_TOOL_NAMES = new Set(["bash", "shell_command", "exec_command"]);
|
|
4224
4126
|
var TRACKED_TOOL_NAMES = new Set([
|
|
@@ -4329,7 +4231,7 @@ function resolvePath(cwd, filePath) {
|
|
|
4329
4231
|
}
|
|
4330
4232
|
function isExistingFile(filePath) {
|
|
4331
4233
|
try {
|
|
4332
|
-
return
|
|
4234
|
+
return existsSync5(filePath) && statSync6(filePath).isFile();
|
|
4333
4235
|
} catch {
|
|
4334
4236
|
return false;
|
|
4335
4237
|
}
|
|
@@ -11,7 +11,6 @@ import type { Engine } from "@oh-my-opencode/rules-engine/engine";
|
|
|
11
11
|
import { isNeverTruncatedRule } from "@oh-my-opencode/rules-engine/engine";
|
|
12
12
|
import type { LoadedRule, PiRulesConfig } from "@oh-my-opencode/rules-engine/engine";
|
|
13
13
|
import { createRulesEngine } from "./rules-engine-factory.js";
|
|
14
|
-
import { getSparkShellRuntimeAwareness, SPARKSHELL_AWARENESS_DEDUP_KEY } from "./sparkshell-awareness.js";
|
|
15
14
|
import { filterRulesAlreadyInTranscript, filterRulesNotInTranscriptText } from "./transcript-rule-filter.js";
|
|
16
15
|
import type { TranscriptSearchOptions } from "./transcript-search.js";
|
|
17
16
|
import { readTranscriptSearchText } from "./transcript-search.js";
|
|
@@ -61,10 +60,7 @@ export function runStaticInjection(
|
|
|
61
60
|
},
|
|
62
61
|
transcriptSearchOptions,
|
|
63
62
|
);
|
|
64
|
-
|
|
65
|
-
? ""
|
|
66
|
-
: getSparkShellRuntimeAwareness(options.env);
|
|
67
|
-
if (rules.length === 0 && sparkshellAwareness.length === 0) {
|
|
63
|
+
if (rules.length === 0) {
|
|
68
64
|
persistEngineState(engine, cachePath);
|
|
69
65
|
return "";
|
|
70
66
|
}
|
|
@@ -73,11 +69,8 @@ export function runStaticInjection(
|
|
|
73
69
|
for (const rule of rules) {
|
|
74
70
|
engine.markStaticInjected(rule);
|
|
75
71
|
}
|
|
76
|
-
if (sparkshellAwareness.length > 0) {
|
|
77
|
-
engine.state.staticDedup.add(SPARKSHELL_AWARENESS_DEDUP_KEY);
|
|
78
|
-
}
|
|
79
72
|
persistEngineState(engine, cachePath);
|
|
80
|
-
return formatAdditionalContextOutput(eventName,
|
|
73
|
+
return formatAdditionalContextOutput(eventName, block);
|
|
81
74
|
}
|
|
82
75
|
|
|
83
76
|
interface PostCompactRecoveryInput {
|
|
@@ -110,11 +103,8 @@ function runPostCompactRecovery(input: PostCompactRecoveryInput): string {
|
|
|
110
103
|
},
|
|
111
104
|
);
|
|
112
105
|
const dynamicRulePaths = recoverDynamicRulePaths(engine, transcriptText, loaded.rules);
|
|
113
|
-
const sparkshellAwareness = engine.state.staticDedup.has(SPARKSHELL_AWARENESS_DEDUP_KEY)
|
|
114
|
-
? ""
|
|
115
|
-
: getSparkShellRuntimeAwareness(input.options.env);
|
|
116
106
|
|
|
117
|
-
if (missingRules.length === 0 && dynamicRulePaths.length === 0
|
|
107
|
+
if (missingRules.length === 0 && dynamicRulePaths.length === 0) {
|
|
118
108
|
persistEngineState(engine, input.cachePath, input.channel);
|
|
119
109
|
return "";
|
|
120
110
|
}
|
|
@@ -129,13 +119,10 @@ function runPostCompactRecovery(input: PostCompactRecoveryInput): string {
|
|
|
129
119
|
for (const rule of missingRules) {
|
|
130
120
|
engine.markStaticInjected(rule);
|
|
131
121
|
}
|
|
132
|
-
if (sparkshellAwareness.length > 0) {
|
|
133
|
-
engine.state.staticDedup.add(SPARKSHELL_AWARENESS_DEDUP_KEY);
|
|
134
|
-
}
|
|
135
122
|
persistEngineState(engine, input.cachePath, input.channel);
|
|
136
123
|
return formatAdditionalContextOutput(
|
|
137
124
|
input.eventName,
|
|
138
|
-
combineStaticContext(bodyBlock, directive
|
|
125
|
+
combineStaticContext(bodyBlock, directive),
|
|
139
126
|
);
|
|
140
127
|
}
|
|
141
128
|
|
|
@@ -20,7 +20,7 @@ You are mid-flight on a Prometheus work plan; this turn is an automatic continua
|
|
|
20
20
|
3. Follow the `start-work` skill in full. The skill is already loaded from your earlier turn — re-read its file at `packages/omo-codex/plugin/skills/start-work/SKILL.md` if you have lost context.
|
|
21
21
|
4. Apply the checkbox's tier from its ledger entry, or classify it now per the start-work skill: LIGHT (default — a narrow change inside existing layers) needs one real-surface proof of the deliverable, with auxiliary surfaces first-class for CLI- or data-shaped work, and only trigger-mapped adversarial classes; HEAVY (new module/abstraction, auth/security, external integration, schema/migration, concurrency, cross-domain refactor, care signals) takes the full per-criterion regime. When unsure, take HEAVY; never downgrade.
|
|
22
22
|
5. Decompose the checkbox into atomic sub-tasks. Dispatch them in PARALLEL via `multi_agent_v1.spawn_agent` calls in this same response unless a sub-task has a NAMED blocking dependency (input from another sub-task or shared file). Use `fork_context: false` unless full history is truly required. Put role and specialty instructions inside `message`.
|
|
23
|
-
6. Every sub-task message MUST be self-contained,
|
|
23
|
+
6. Every sub-task message MUST be self-contained, executable, not a context handoff: start with `TASK: <imperative assignment>`, then name `DELIVERABLE`, `SCOPE`, and `VERIFY`. It must include all 7 sections and a Manual-QA channel with exact invocation (`curl`, `send-keys`, `browser:control-in-app-browser` action, `page.click`) and PASS/FAIL observable, plus ultraqa classes, artifact, and cleanup receipt. Channels: HTTP (`curl -i`); tmux (`send-keys` + `capture-pane`); browser (Codex: `browser:control-in-app-browser` first unless auth/persistent profile needed; else Chrome/agent-browser); computer use.
|
|
24
24
|
7. Treat every worker DoneClaim as untrusted input. Run independent AdversarialVerify before any checkbox can become FullyDone; `confirmed` is the only pass verdict, while `false-positive`, `needs-fix`, and `needs-human-review` loop back to the executor with exact feedback.
|
|
25
25
|
8. Use `multi_agent_v1.wait_agent` for mailbox signals, not proof of completion — a timeout only means no new mailbox update arrived; a running child is alive. For sub-tasks likely to exceed one wait cycle, require `WORKING: <task> - <current phase>` before long passes and `BLOCKED: <reason>` only when progress stops. Send `TASK STILL ACTIVE: return <deliverable> or BLOCKED: <reason>` only when the child is completed without the deliverable, ack-only, or no longer running. If that followup is still silent or ack-only, record inconclusive, do not count it as pass/review approval, close if safe, and respawn a smaller `fork_context: false` task with the missing deliverable.
|
|
26
26
|
9. After verification of ALL sub-tasks under this checkbox: `apply_patch` the plan to change `- [ ]` → `- [x]`, re-read the plan to confirm the count decreased, append a `task-completed` line to the ledger, then continue.
|
|
@@ -30,17 +30,17 @@ You are mid-flight on a Prometheus work plan; this turn is an automatic continua
|
|
|
30
30
|
|
|
31
31
|
- No production code before a failing-first proof exists: a unit test at a seam, otherwise the sub-task's Manual-QA scenario captured failing. A test that mirrors its implementation (mock-call assertions, pinned constants) is not evidence. When the change touches existing behavior, PIN it first: a baseline characterization test that passes on the unchanged code, with exact inputs, exact observable, and exact assertion. PIN → RED → GREEN → SURFACE.
|
|
32
32
|
- No `--dry-run` as evidence. No "should work". No "tests pass" as completion proof.
|
|
33
|
+
- TUI visual evidence MUST use the web terminal pattern when a task drives an OpenCode/Codex/terminal UI: capture the pane or run `node script/qa/web-terminal-visual-qa.mjs --title "<surface>" --from-file <capture.txt> --evidence-dir <dir>` (or `--command` when tmux is available), then cite `terminal.png`, `terminal.txt`, and `metadata.json`.
|
|
33
34
|
- No `as any` / `@ts-ignore` / `@ts-expect-error`. No deleting failing tests.
|
|
34
35
|
- Probe every ultraqa adversarial class whose trigger fact holds (malformed input, prompt injection, cancel/resume, stale state, dirty worktree, hung or long commands, flaky tests, misleading success output, repeated interruptions — trigger map in the start-work skill) and capture the observable for each. A clean happy-path artifact alone is NOT a PASS when an applicable class went unprobed; record skipped classes with a one-line not-applicable reason.
|
|
35
|
-
- Cleanup receipt is mandatory. Register each QA
|
|
36
|
+
- Cleanup receipt is mandatory. Register each QA teardown (scripts, tmux, browser contexts, PIDs, ports, containers, temp dirs) as a todo when it spawns, then execute it. Leftover QA state = BLOCKED, not PASS.
|
|
36
37
|
- The worktree path (if set in boulder.json) governs every file edit and command. Do not stray into the main repo.
|
|
38
|
+
- PR or branch implementation/review/merge work requires a task-owned git worktree. Treat the main worktree as read-only context.
|
|
37
39
|
- session_ids you write to boulder.json MUST be prefixed `codex:`. Bare ids on read are legacy `opencode:`.
|
|
38
40
|
|
|
39
|
-
#
|
|
41
|
+
# Final gate
|
|
40
42
|
|
|
41
|
-
Before completion, run `review-work` and a `debugging` runtime audit.
|
|
42
|
-
|
|
43
|
-
Do not print `ORCHESTRATION COMPLETE`. Do not create a PR, PR handoff, or branch handoff. Do not write a final completion answer until this gate passes. Always redact secrets, tokens, credentials, auth headers, cookies, env dumps, private logs, and PII from ledgers, PR bodies, and handoffs.
|
|
43
|
+
Before completion, run `review-work` and a `debugging` runtime audit; inconclusive lanes fail. Do not create a PR, PR handoff, branch handoff, merge, or final completion answer until this gate passes. For PR/branch work, stay in the task-owned worktree: create/update the PR, wait for CI/review/Cubic gates, merge by default unless explicitly opted out, then clean up. Redact secrets, tokens, credentials, auth headers, cookies, env dumps, logs, and PII.
|
|
44
44
|
|
|
45
45
|
# Stop conditions for THIS turn
|
|
46
46
|
|
package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts
CHANGED
|
@@ -138,6 +138,29 @@ describe("start-work Stop hook", () => {
|
|
|
138
138
|
expect(parsed.reason.split(/\s+/).filter(Boolean).length).toBeLessThanOrEqual(1100);
|
|
139
139
|
});
|
|
140
140
|
|
|
141
|
+
it("#given active codex work #when continuation directive is emitted #then PR lifecycle stays worktree-bound", () => {
|
|
142
|
+
// given
|
|
143
|
+
const workspace = createWorkspace({
|
|
144
|
+
boulderJson: createBoulderJson({
|
|
145
|
+
sessionIds: ["codex:sess_abc"],
|
|
146
|
+
status: "active",
|
|
147
|
+
worktreePath: "/tmp/worktree",
|
|
148
|
+
}),
|
|
149
|
+
planMarkdown: ["# Plan", "", "## TODOs", "- [ ] First"].join("\n"),
|
|
150
|
+
});
|
|
151
|
+
const fs = createMemoryFs();
|
|
152
|
+
|
|
153
|
+
// when
|
|
154
|
+
const output = runStopHook(createStopInput(workspace), fs);
|
|
155
|
+
|
|
156
|
+
// then
|
|
157
|
+
const parsed = parseBlockOutput(output);
|
|
158
|
+
expect(parsed.reason).toContain("PR or branch implementation/review/merge work requires a task-owned git worktree");
|
|
159
|
+
expect(parsed.reason).toContain("Treat the main worktree as read-only context");
|
|
160
|
+
expect(parsed.reason).toContain("create/update the PR, wait for CI/review/Cubic gates, merge by default");
|
|
161
|
+
expect(parsed.reason).toContain("Do not create a PR, PR handoff, branch handoff, merge");
|
|
162
|
+
});
|
|
163
|
+
|
|
141
164
|
it("#given stop hook source #when inspected #then it remains Boulder-only without planning bootstrap logic", () => {
|
|
142
165
|
// given
|
|
143
166
|
const hook = readFileSync(new URL("../src/codex-hook.ts", import.meta.url), "utf8");
|
|
@@ -41,25 +41,43 @@ async function runTeammodeHookCli(stdin, stdout) {
|
|
|
41
41
|
}
|
|
42
42
|
function threadTitleReminder(threadReference) {
|
|
43
43
|
const id = formatIdentifier(threadReference.id);
|
|
44
|
-
return threadReference.kind === "thread" ? `THREAD ID ${id}: CALL codex_app.set_thread_title NOW. USE THE REAL TASK/ROLE.` : `PENDING WORKTREE ID ${id}:
|
|
44
|
+
return threadReference.kind === "thread" ? `THREAD ID ${id}: CALL codex_app.set_thread_title NOW. USE THE REAL TASK/ROLE.` : `PENDING WORKTREE ID ${id}: WORKTREE THREAD IS NOT READY YET. DO NOT bind-thread OR SEND THE MEMBER BOOTSTRAP UNTIL A REAL THREAD ID EXISTS. THEN CALL codex_app.set_thread_title USING THE REAL TASK/ROLE.`;
|
|
45
45
|
}
|
|
46
46
|
function formatIdentifier(value) {
|
|
47
47
|
const normalized = value.replace(/\s+/g, " ").trim();
|
|
48
48
|
return normalized.length <= 200 ? normalized : `${normalized.slice(0, 197)}...`;
|
|
49
49
|
}
|
|
50
50
|
function extractThreadCreationReference(toolResponse) {
|
|
51
|
-
|
|
51
|
+
const response = parseToolResponseRecord(toolResponse);
|
|
52
|
+
if (response === null)
|
|
52
53
|
return null;
|
|
53
|
-
const threadId =
|
|
54
|
+
const threadId = response["threadId"];
|
|
54
55
|
if (typeof threadId === "string" && threadId.trim().length > 0) {
|
|
55
56
|
return { kind: "thread", id: threadId };
|
|
56
57
|
}
|
|
57
|
-
const pendingWorktreeId =
|
|
58
|
+
const pendingWorktreeId = response["pendingWorktreeId"];
|
|
58
59
|
if (typeof pendingWorktreeId === "string" && pendingWorktreeId.trim().length > 0) {
|
|
59
60
|
return { kind: "pendingWorktree", id: pendingWorktreeId };
|
|
60
61
|
}
|
|
61
62
|
return null;
|
|
62
63
|
}
|
|
64
|
+
function parseToolResponseRecord(toolResponse) {
|
|
65
|
+
if (isRecord(toolResponse))
|
|
66
|
+
return toolResponse;
|
|
67
|
+
if (typeof toolResponse !== "string")
|
|
68
|
+
return null;
|
|
69
|
+
const trimmed = toolResponse.trim();
|
|
70
|
+
if (trimmed.length === 0)
|
|
71
|
+
return null;
|
|
72
|
+
try {
|
|
73
|
+
const parsed = JSON.parse(trimmed);
|
|
74
|
+
return isRecord(parsed) ? parsed : null;
|
|
75
|
+
} catch (error) {
|
|
76
|
+
if (error instanceof SyntaxError)
|
|
77
|
+
return null;
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
63
81
|
function isPostToolUsePayload(value) {
|
|
64
82
|
if (!isRecord(value))
|
|
65
83
|
return false;
|
|
@@ -68,7 +68,7 @@ node "<skill-root>/scripts/team.mjs" set-status --team <session_id> --id A --s
|
|
|
68
68
|
node "<skill-root>/scripts/team.mjs" worktree-add --team <session_id> --id A [--base-branch <branch>]
|
|
69
69
|
node "<skill-root>/scripts/team.mjs" worktree-remove --team <session_id> --id A [--force]
|
|
70
70
|
node "<skill-root>/scripts/team.mjs" integrate --team <session_id> [--id A]
|
|
71
|
-
node "<skill-root>/scripts/team.mjs" archive --team <session_id> [--id A]
|
|
71
|
+
node "<skill-root>/scripts/team.mjs" archive --team <session_id> [--id A] [--note "<...>"]
|
|
72
72
|
node "<skill-root>/scripts/team.mjs" delete --team <session_id> [--force]
|
|
73
73
|
node "<skill-root>/scripts/team.mjs" status --team <session_id>
|
|
74
74
|
```
|
|
@@ -80,6 +80,13 @@ space). `{session_id}` is the leader's Codex session id when you can pass it via
|
|
|
80
80
|
otherwise the script generates a stable handle. Re-running `init` is a safe no-op. Every mutating
|
|
81
81
|
subcommand rewrites `guide.md`, so the manual always matches the current team.
|
|
82
82
|
|
|
83
|
+
Mutating subcommands take a per-team state lock before reading and rewriting `team.json`. It is
|
|
84
|
+
safe to run independent `add-member`, `bind-thread`, `set-status`, `archive`, `delete`, `guide`,
|
|
85
|
+
and worktree mutation commands concurrently against the same team: they serialize and each command
|
|
86
|
+
reads the latest committed state before writing. If a command reports that team state is locked,
|
|
87
|
+
do not treat the intended mutation as complete; retry after the named command finishes, or inspect
|
|
88
|
+
`.omo/teams/{session_id}/.team.lock/owner.json` if the previous command crashed.
|
|
89
|
+
|
|
83
90
|
## Create the team and its threads
|
|
84
91
|
|
|
85
92
|
1. `init` the team, then `add-member` once per member.
|
|
@@ -89,10 +96,18 @@ subcommand rewrites `guide.md`, so the manual always matches the current team.
|
|
|
89
96
|
exact title to use. If `codex_app.create_thread` accepts a working directory / cwd argument,
|
|
90
97
|
set it to that member's worktree; otherwise the member's manual tells it to `cd` there first.
|
|
91
98
|
Use `codex_app.set_thread_title` if the title did not land at creation.
|
|
99
|
+
If Codex returns only `pendingWorktreeId`, the worktree-backed thread is not ready yet: do not
|
|
100
|
+
`bind-thread` and do not send the member bootstrap. Wait until Codex surfaces a real `threadId`
|
|
101
|
+
or the thread appears in the thread list, then set the title, bind that real id with the cwd,
|
|
102
|
+
and only then send the bootstrap.
|
|
92
103
|
3. `bind-thread` to record each thread id (and `--cwd`), then send that member's bootstrap
|
|
93
104
|
trigger (printed by `add-member` / `member-prompt`) as the thread's first message. The trigger
|
|
94
105
|
is short on purpose: it tells the new thread to READ its `guide.md` and `team.json` rather than
|
|
95
106
|
carrying the whole protocol inline.
|
|
107
|
+
4. Whenever you report, audit, reopen, or hand off a member thread, include the app deep link
|
|
108
|
+
`codex://threads/<thread_id>` next to the raw id. For example:
|
|
109
|
+
`codex://threads/019ef350-ee78-72a3-bd5e-e40cebc3d814`. Worktree-backed threads are easy to
|
|
110
|
+
lose in the sidebar without this link.
|
|
96
111
|
|
|
97
112
|
Every team member is a real Codex thread created with `codex_app.create_thread` - this is strict,
|
|
98
113
|
not a preference. NEVER substitute `multi_agent_v1.spawn_agent`, or any other in-process subagent,
|
|
@@ -113,8 +128,28 @@ members to the hard rules, so you mainly keep the channel open: expect frequent
|
|
|
113
128
|
from each member - findings, `WORKING:`/`BLOCKED:` markers, peer digests - rather than one final
|
|
114
129
|
dump, and act on them as they arrive. All member-to-member and member-to-leader traffic is in English;
|
|
115
130
|
when the END user addresses a member, that member replies in the user's own language. Members hand off
|
|
116
|
-
files and memos through the team `artifacts/` directory and reference them by path.
|
|
117
|
-
|
|
131
|
+
files and memos through the team `artifacts/` directory and reference them by path.
|
|
132
|
+
|
|
133
|
+
## Let members work - do not rush them
|
|
134
|
+
|
|
135
|
+
Members heartbeat every few tool calls and message you on every finding, blocker, and finished
|
|
136
|
+
slice (their manual binds them to this). So a member that is quiet between heartbeats is **working,
|
|
137
|
+
not stalled** - a stretch of silence is the normal sound of focused work, not a problem to chase.
|
|
138
|
+
Re-reading `codex_app.read_thread` to check on a calm member, or sending "any update?" / "are you
|
|
139
|
+
done?" / "hurry up" pings, interrupts that member and slows the whole team. Trust the heartbeat and
|
|
140
|
+
let them cook.
|
|
141
|
+
|
|
142
|
+
Message a member only when one of these is true:
|
|
143
|
+
- you have new information, context, or a correction it needs to do its slice right;
|
|
144
|
+
- you are reassigning, narrowing, or unblocking its scope;
|
|
145
|
+
- a peer's result changes what it should do; or
|
|
146
|
+
- it has gone fully silent well past its heartbeat cadence AND that stall is blocking the team -
|
|
147
|
+
then send one specific question, not a barrage.
|
|
148
|
+
|
|
149
|
+
Otherwise stay calm and keep the channel open: read inbound updates as they arrive and act on them.
|
|
150
|
+
A long-running member is alive; a heartbeat you have not received yet is not a failure. Wait for
|
|
151
|
+
every required member's final report before you declare the team done - rushing toward "done" while
|
|
152
|
+
members are still mid-slice just produces half-built work you will have to redo.
|
|
118
153
|
|
|
119
154
|
## Worktrees - isolate members who would touch the same files
|
|
120
155
|
|
|
@@ -127,6 +162,16 @@ its own worktree. To land the work, `integrate --team <id>` merges every member
|
|
|
127
162
|
current branch with a merge commit (never a squash or rebase); resolve any conflict it reports, then
|
|
128
163
|
`worktree-remove` each worktree at cleanup.
|
|
129
164
|
|
|
165
|
+
After `worktree-add`, immediately send the member a follow-up that includes both its assigned
|
|
166
|
+
worktree path and its `codex://threads/<thread_id>` link. Use `bind-thread --cwd <worktree>` or
|
|
167
|
+
`--worktree-path <worktree>` after the thread exists so `team.json`, `guide.md`, `status`, and
|
|
168
|
+
`member-prompt` all point at the same worktree-backed thread.
|
|
169
|
+
|
|
170
|
+
When the member starts inside a worktree, it must verify the assigned cwd exists and contains the
|
|
171
|
+
repository checkout before editing. If the directory is missing, empty, or does not look like a git
|
|
172
|
+
worktree/repository yet, the member reports `BLOCKED: worktree not ready` to the leader and waits
|
|
173
|
+
instead of editing a parent checkout or an empty directory.
|
|
174
|
+
|
|
130
175
|
## Run a ulw-plan in parallel
|
|
131
176
|
|
|
132
177
|
When a decision-complete plan already exists at `.omo/plans/<slug>.md` (from ulw-plan), execute its
|
|
@@ -145,12 +190,17 @@ result against that todo's acceptance criteria before you integrate.
|
|
|
145
190
|
|
|
146
191
|
DISBAND the team the moment it is no longer needed. A team exists only to do its work; once that
|
|
147
192
|
work is done, or the user no longer wants it, do not leave it lying around - archive every member,
|
|
148
|
-
then delete the team state
|
|
193
|
+
then delete the team state only after archival evidence is clean or preserved. A finished team that
|
|
194
|
+
is never disbanded is a leak.
|
|
149
195
|
|
|
150
196
|
- `archive` closes the team: notify each active member, copy anything useful into `artifacts/`,
|
|
151
|
-
archive each member thread with `codex_app.set_thread_archived
|
|
152
|
-
|
|
153
|
-
|
|
197
|
+
then try to archive each member thread with `codex_app.set_thread_archived`. Treat Codex App
|
|
198
|
+
failures such as "Ambiguous Codex thread id" or a thread id that is ambiguous across hosts as an
|
|
199
|
+
app-thread archival blocker, not as a team-state blocker: record the failure in the team log,
|
|
200
|
+
tell the user which member thread was not proven archived, and continue the team-state archive
|
|
201
|
+
with `archive --note "<blocker>"`. Never pretend a member thread was archived. Do not delete the
|
|
202
|
+
team state after an app-thread archival blocker unless the evidence has been copied elsewhere or
|
|
203
|
+
the user explicitly accepts that evidence loss.
|
|
154
204
|
- `delete` removes `.omo/teams/{session_id}` and refuses while the team is unarchived or any member
|
|
155
205
|
is still active unless `--force`.
|
|
156
206
|
- When the work wraps up, land it the way the user asked: `integrate --team <id>` for a direct merge
|
package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-guide.mjs
CHANGED
|
@@ -5,8 +5,12 @@
|
|
|
5
5
|
// writes it once at team creation, and every member thread is told to READ it instead of
|
|
6
6
|
// receiving the rules inline each turn.
|
|
7
7
|
|
|
8
|
+
export function codexThreadLink(threadId) {
|
|
9
|
+
return `codex://threads/${threadId}`;
|
|
10
|
+
}
|
|
11
|
+
|
|
8
12
|
function memberLine(member) {
|
|
9
|
-
const thread = member.threadId ? ` | thread ${member.threadId}` : " | thread not created yet";
|
|
13
|
+
const thread = member.threadId ? ` | thread ${member.threadId} (${codexThreadLink(member.threadId)})` : " | thread not created yet";
|
|
10
14
|
const wt = member.worktree?.path ? ` | worktree ${member.worktree.path}` : "";
|
|
11
15
|
const name = member.name ? ` "${member.name}"` : "";
|
|
12
16
|
const title = member.threadTitle ? ` | thread title \`${member.threadTitle}\`` : "";
|
|
@@ -23,13 +27,23 @@ that is a coordination signal: mark yourself \`blocked\` and tell the leader at
|
|
|
23
27
|
}
|
|
24
28
|
const lines = team.members
|
|
25
29
|
.filter((m) => m.worktree?.path || m.worktree?.branch)
|
|
26
|
-
.map((m) =>
|
|
30
|
+
.map((m) => {
|
|
31
|
+
const thread = m.threadId ? `; thread ${codexThreadLink(m.threadId)}` : "";
|
|
32
|
+
return `- **${m.id}**: worktree \`${m.worktree.path ?? "(assign with bind-thread --cwd)"}\` on branch \`${m.worktree.branch ?? team.worktree.baseBranch}\`${thread}`;
|
|
33
|
+
});
|
|
27
34
|
return `## Worktrees (ISOLATION IS ON - this is not optional for you)
|
|
28
35
|
|
|
29
36
|
This team runs each member in its own git worktree branched off \`${team.worktree.baseBranch}\`.
|
|
30
37
|
**You MUST work only inside your own worktree.** The very first thing you do is \`cd\` into it;
|
|
31
38
|
every edit, command, and commit happens there. Never touch another member's worktree, and
|
|
32
39
|
never edit files outside your assigned scope. Commit your work so the leader can integrate it.
|
|
40
|
+
Before editing, verify that your assigned worktree exists and contains repo files. If the path is
|
|
41
|
+
missing, empty, or does not look like a git worktree/repository yet, send \`BLOCKED: worktree not ready\`
|
|
42
|
+
to the leader and wait instead of editing any parent checkout or empty directory.
|
|
43
|
+
|
|
44
|
+
If Codex returns only \`pendingWorktreeId\` while the leader is creating a worktree-backed member
|
|
45
|
+
thread, the thread is not ready yet. The leader must wait until Codex surfaces a real thread id,
|
|
46
|
+
then bind that real id and send the bootstrap.
|
|
33
47
|
|
|
34
48
|
${lines.length ? lines.join("\n") : "- (worktree paths are assigned as threads are bound; read team.json for yours)"}`;
|
|
35
49
|
}
|
|
@@ -71,6 +85,8 @@ coordinate with each other, but the leader owns the final decision and integrati
|
|
|
71
85
|
- **Reach the leader and your peers with \`codex_app.send_message_to_thread\` - not by narrating in
|
|
72
86
|
your own thread, where no one reads it.** The address book is in team.json: the leader thread id
|
|
73
87
|
is \`leader.sessionId\`, and each peer thread id is its \`members[].threadId\`.
|
|
88
|
+
- **When you mention a Codex thread, include its app link too:** \`codex://threads/<threadId>\`.
|
|
89
|
+
These links are the fastest way for the leader to reopen worktree-backed member threads.
|
|
74
90
|
- **Push a short message at each of these moments - never batch them into one report at the end:**
|
|
75
91
|
- to the **leader**: every finding or decision, every file or sub-task you finish, a
|
|
76
92
|
\`WORKING: <focus> - <phase>\` heartbeat every few tool calls so you never look stale, a
|
|
@@ -78,7 +94,9 @@ coordinate with each other, but the leader owns the final decision and integrati
|
|
|
78
94
|
- to a **peer**: the instant you learn anything that touches their slice - a shared finding, a
|
|
79
95
|
changed assumption, an interface they depend on. When unsure who owns it, send it to the leader.
|
|
80
96
|
- **Going quiet is the only failure.** Many small lean messages beat one end-of-work dump; keep
|
|
81
|
-
every message short.
|
|
97
|
+
every message short. Your heartbeats are what let the leader relax and leave you to work: a leader
|
|
98
|
+
who can see your progress has no reason to interrupt you, while silence forces it to break in and
|
|
99
|
+
ask where things stand. Frequent lean updates buy you uninterrupted focus.
|
|
82
100
|
|
|
83
101
|
## Artifacts (how you hand work off)
|
|
84
102
|
|
|
@@ -103,10 +121,19 @@ export function buildMemberPrompt(team, id) {
|
|
|
103
121
|
if (!member) throw new Error(`no member with id "${id}"`);
|
|
104
122
|
const guide = team.paths?.guide ?? ".omo/teams/<session_id>/guide.md";
|
|
105
123
|
const teamJson = team.paths?.team ?? ".omo/teams/<session_id>/team.json";
|
|
106
|
-
const where = member.cwd
|
|
124
|
+
const where = member.cwd
|
|
125
|
+
? `Work inside \`${member.cwd}\`.`
|
|
126
|
+
: team.worktree?.enabled
|
|
127
|
+
? "Wait for the leader to bind your worktree cwd before editing."
|
|
128
|
+
: "Work from the repository root unless your manual assigns a worktree.";
|
|
129
|
+
const threadLink = member.threadId ? `\nYour Codex thread link is ${codexThreadLink(member.threadId)}. Include it when reporting handoffs or worktree status.` : "";
|
|
130
|
+
const readiness =
|
|
131
|
+
team.worktree?.enabled
|
|
132
|
+
? "\nBefore editing, verify that your assigned worktree exists and contains repo files. If this prompt arrived before your Codex worktree checkout is ready, or the path is missing, empty, or not a git worktree/repository yet, report `BLOCKED: worktree not ready` to the leader and wait."
|
|
133
|
+
: "";
|
|
107
134
|
return `You are member ${member.id}${member.name ? ` (${member.name})` : ""} of team ${team.teamName} - owner of: ${member.focus}. Your thread title is \`${member.threadTitle}\`.
|
|
108
135
|
FIRST read your field manual at \`${guide}\`, then the team state at \`${teamJson}\`; they define your scope, deliverable, the leader, the artifacts directory, and the communication rules.
|
|
109
|
-
${where}
|
|
136
|
+
${where}${threadLink}${readiness}
|
|
110
137
|
Communicate with the team and leader in English; reply to the end user in the user's own language.
|
|
111
138
|
Start now. Push updates to the leader and relevant peers with \`codex_app.send_message_to_thread\` as you work - findings, \`WORKING:\` heartbeats, and \`BLOCKED:\` the instant you stall - never just one report at the end.`;
|
|
112
139
|
}
|