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
|
@@ -1,12 +1,41 @@
|
|
|
1
|
+
// allow: SIZE_OK - migration scenarios share one temp Codex-home harness across legacy TOML shapes; this release only adds config cases and future additions should split by migration family.
|
|
2
|
+
|
|
1
3
|
import assert from "node:assert/strict";
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
2
5
|
import { mkdir, mkdtemp, readFile, rm, symlink, writeFile } from "node:fs/promises";
|
|
3
6
|
import { tmpdir } from "node:os";
|
|
4
7
|
import { dirname, join } from "node:path";
|
|
5
8
|
import test from "node:test";
|
|
6
9
|
|
|
10
|
+
import { removeUnsupportedRootMultiAgentMode } from "../scripts/migrate-codex-config/multi-agent-mode-guard.mjs";
|
|
7
11
|
import { forceDisableMultiAgentV2 } from "../scripts/migrate-codex-config/multi-agent-v2-guard.mjs";
|
|
8
12
|
import { ensureCodexReasoningConfig, migrateCodexConfig } from "../scripts/migrate-codex-config.mjs";
|
|
9
13
|
|
|
14
|
+
function parseTomlWithPython(config) {
|
|
15
|
+
const python = resolvePython();
|
|
16
|
+
const result = spawnSync(
|
|
17
|
+
python,
|
|
18
|
+
[
|
|
19
|
+
"-c",
|
|
20
|
+
[
|
|
21
|
+
"import json, sys, tomllib",
|
|
22
|
+
"print(json.dumps(tomllib.loads(sys.stdin.read())))",
|
|
23
|
+
].join("; "),
|
|
24
|
+
],
|
|
25
|
+
{ encoding: "utf8", input: config },
|
|
26
|
+
);
|
|
27
|
+
assert.equal(result.status, 0, result.stderr);
|
|
28
|
+
return JSON.parse(result.stdout);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function resolvePython() {
|
|
32
|
+
for (const command of ["python3", "python"]) {
|
|
33
|
+
const result = spawnSync(command, ["-c", "import tomllib"], { encoding: "utf8" });
|
|
34
|
+
if (result.status === 0) return command;
|
|
35
|
+
}
|
|
36
|
+
assert.fail("Python with tomllib is required for TOML parse assertions");
|
|
37
|
+
}
|
|
38
|
+
|
|
10
39
|
test("#given stale root reasoning config #when ensuring config #then replaces stale values without duplicate keys", () => {
|
|
11
40
|
const result = ensureCodexReasoningConfig(
|
|
12
41
|
[
|
|
@@ -181,7 +210,7 @@ test("#given model catalog is malformed and stale config #when migrating #then f
|
|
|
181
210
|
assert.match(content, /model_context_window = 400000/);
|
|
182
211
|
});
|
|
183
212
|
|
|
184
|
-
test("#given user-customized Codex model config #when migrating #then user values are preserved", async () => {
|
|
213
|
+
test("#given user-customized Codex model config #when migrating #then user values are preserved without root multi-agent mode", async () => {
|
|
185
214
|
const root = await mkdtemp(join(tmpdir(), "lazycodex-config-custom-"));
|
|
186
215
|
const codexHome = join(root, "codex-home");
|
|
187
216
|
await mkdir(codexHome, { recursive: true });
|
|
@@ -205,11 +234,16 @@ test("#given user-customized Codex model config #when migrating #then user value
|
|
|
205
234
|
});
|
|
206
235
|
|
|
207
236
|
const content = await readFile(join(codexHome, "config.toml"), "utf8");
|
|
208
|
-
assert.deepEqual(result.changed, []);
|
|
237
|
+
assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
|
|
238
|
+
assert.deepEqual(result.modeChanged, []);
|
|
209
239
|
assert.match(content, /model = "gpt-5\.4"/);
|
|
210
240
|
assert.match(content, /model_context_window = 123456/);
|
|
211
241
|
assert.match(content, /model_reasoning_effort = "medium"/);
|
|
212
242
|
assert.match(content, /plan_mode_reasoning_effort = "medium"/);
|
|
243
|
+
assert.doesNotMatch(content, /^\s*multi_agent_mode\s*=/m);
|
|
244
|
+
assert.match(content, /\[agents\][\s\S]*?max_threads = 1000/);
|
|
245
|
+
assert.match(content, /\[features\.multi_agent_v2\][\s\S]*?enabled = false/);
|
|
246
|
+
assert.match(content, /max_concurrent_threads_per_session = 1000/);
|
|
213
247
|
});
|
|
214
248
|
|
|
215
249
|
test("#given managed config state is malformed #when migrating #then migration ignores stale state safely", async () => {
|
|
@@ -328,6 +362,7 @@ test("#given config already matches current catalog #when catalog version advanc
|
|
|
328
362
|
"model_context_window = 400000",
|
|
329
363
|
'model_reasoning_effort = "high"',
|
|
330
364
|
'plan_mode_reasoning_effort = "xhigh"',
|
|
365
|
+
'multi_agent_mode = "proactive"',
|
|
331
366
|
"",
|
|
332
367
|
"[features.multi_agent_v2]",
|
|
333
368
|
"enabled = false",
|
|
@@ -363,9 +398,88 @@ test("#given config already matches current catalog #when catalog version advanc
|
|
|
363
398
|
});
|
|
364
399
|
|
|
365
400
|
const state = JSON.parse(await readFile(statePath, "utf8"));
|
|
366
|
-
assert.deepEqual(result.changed, []);
|
|
401
|
+
assert.deepEqual(result.changed, [configPath]);
|
|
402
|
+
assert.deepEqual(result.modeChanged, [configPath]);
|
|
367
403
|
assert.equal(state.files[configPath].managed, true);
|
|
368
404
|
assert.equal(state.files[configPath].catalogVersion, "test.role-only");
|
|
405
|
+
const content = await readFile(configPath, "utf8");
|
|
406
|
+
assert.doesNotMatch(content, /^\s*multi_agent_mode\s*=/m);
|
|
407
|
+
assert.match(content, /\[agents\][\s\S]*?max_threads = 1000/);
|
|
408
|
+
assert.match(content, /max_concurrent_threads_per_session = 1000/);
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
test("#given stale Context7 placeholder MCP config #when migrating #then removes it and keeps plugin policy", async () => {
|
|
412
|
+
const root = await mkdtemp(join(tmpdir(), "lazycodex-context7-placeholder-cleanup-"));
|
|
413
|
+
const codexHome = join(root, "codex-home");
|
|
414
|
+
const configPath = join(codexHome, "config.toml");
|
|
415
|
+
await mkdir(codexHome, { recursive: true });
|
|
416
|
+
await writeFile(
|
|
417
|
+
configPath,
|
|
418
|
+
[
|
|
419
|
+
'model = "gpt-5.5"',
|
|
420
|
+
"model_context_window = 400000",
|
|
421
|
+
'model_reasoning_effort = "high"',
|
|
422
|
+
'plan_mode_reasoning_effort = "xhigh"',
|
|
423
|
+
"",
|
|
424
|
+
"[mcp_servers.context7] # stale npx package from old docs",
|
|
425
|
+
'command = "npx"',
|
|
426
|
+
'args = ["-y", "@upstash/context7-mcp", "--api-key", "YOUR_API_KEY"]',
|
|
427
|
+
"startup_timeout_sec = 20",
|
|
428
|
+
"",
|
|
429
|
+
'[plugins."omo@sisyphuslabs".mcp_servers.context7]',
|
|
430
|
+
"enabled = true",
|
|
431
|
+
"",
|
|
432
|
+
].join("\n"),
|
|
433
|
+
);
|
|
434
|
+
|
|
435
|
+
const result = await migrateCodexConfig({
|
|
436
|
+
env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json") },
|
|
437
|
+
cwd: root,
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
const content = await readFile(configPath, "utf8");
|
|
441
|
+
assert.deepEqual(result.changed, [configPath]);
|
|
442
|
+
assert.doesNotMatch(content, /\[mcp_servers\.context7\]/);
|
|
443
|
+
assert.doesNotMatch(content, /@upstash\/context7-mcp/);
|
|
444
|
+
assert.doesNotMatch(content, /YOUR_API_KEY/);
|
|
445
|
+
assert.match(content, /\[plugins\."omo@sisyphuslabs"\.mcp_servers\.context7\][\s\S]*?enabled = true/);
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
test("#given real Context7 API key and placeholder comment #when migrating #then preserves user server settings", async () => {
|
|
449
|
+
const root = await mkdtemp(join(tmpdir(), "lazycodex-context7-real-key-"));
|
|
450
|
+
const codexHome = join(root, "codex-home");
|
|
451
|
+
const configPath = join(codexHome, "config.toml");
|
|
452
|
+
await mkdir(codexHome, { recursive: true });
|
|
453
|
+
await writeFile(
|
|
454
|
+
configPath,
|
|
455
|
+
[
|
|
456
|
+
'model = "gpt-5.5"',
|
|
457
|
+
"model_context_window = 400000",
|
|
458
|
+
'model_reasoning_effort = "high"',
|
|
459
|
+
'plan_mode_reasoning_effort = "xhigh"',
|
|
460
|
+
"",
|
|
461
|
+
"[mcp_servers.context7]",
|
|
462
|
+
'command = "npx"',
|
|
463
|
+
'args = ["-y", "@upstash/context7-mcp", "--api-key", "ctx7sk_live_example"] # replace YOUR_API_KEY in docs only',
|
|
464
|
+
"startup_timeout_sec = 20",
|
|
465
|
+
"",
|
|
466
|
+
'[plugins."omo@sisyphuslabs".mcp_servers.context7]',
|
|
467
|
+
"enabled = true",
|
|
468
|
+
"",
|
|
469
|
+
].join("\n"),
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
const result = await migrateCodexConfig({
|
|
473
|
+
env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json") },
|
|
474
|
+
cwd: root,
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
const content = await readFile(configPath, "utf8");
|
|
478
|
+
assert.deepEqual(result.changed, [configPath]);
|
|
479
|
+
assert.match(content, /\[mcp_servers\.context7\]/);
|
|
480
|
+
assert.match(content, /ctx7sk_live_example/);
|
|
481
|
+
assert.match(content, /replace YOUR_API_KEY in docs only/);
|
|
482
|
+
assert.match(content, /\[plugins\."omo@sisyphuslabs"\.mcp_servers\.context7\][\s\S]*?enabled = true/);
|
|
369
483
|
});
|
|
370
484
|
|
|
371
485
|
test("#given multi_agent_v2 enabled #when forcing disable #then flips the flag to false", () => {
|
|
@@ -470,18 +584,23 @@ test("#given an annotated managed section #when forcing disable runs again #then
|
|
|
470
584
|
assert.match(rerun, /enabled = false/);
|
|
471
585
|
});
|
|
472
586
|
|
|
473
|
-
test("#given [features] boolean shorthand multi_agent_v2 = false #when forcing disable #then
|
|
587
|
+
test("#given [features] boolean shorthand multi_agent_v2 = false #when forcing disable #then rewrites to the non-conflicting disabled table", () => {
|
|
474
588
|
const config = [
|
|
475
589
|
'model = "gpt-5.5"',
|
|
476
590
|
"",
|
|
477
591
|
"[features]",
|
|
478
592
|
"multi_agent_v2 = false",
|
|
593
|
+
"plugins = true",
|
|
479
594
|
"",
|
|
480
595
|
].join("\n");
|
|
481
596
|
|
|
482
597
|
const result = forceDisableMultiAgentV2(config);
|
|
598
|
+
const parsed = parseTomlWithPython(result);
|
|
483
599
|
|
|
484
|
-
assert.
|
|
600
|
+
assert.doesNotMatch(result, /^\s*multi_agent_v2\s*=/m);
|
|
601
|
+
assert.equal((result.match(/\[features\.multi_agent_v2\]/g) ?? []).length, 1);
|
|
602
|
+
assert.equal(parsed.features.plugins, true);
|
|
603
|
+
assert.equal(parsed.features.multi_agent_v2.enabled, false);
|
|
485
604
|
});
|
|
486
605
|
|
|
487
606
|
test("#given multi_agent_v2 already disabled #when forcing disable #then returns config unchanged", () => {
|
|
@@ -520,8 +639,87 @@ test("#given global config without multi_agent_v2 section #when full migration r
|
|
|
520
639
|
});
|
|
521
640
|
|
|
522
641
|
assert.deepEqual(result.changed, [configPath]);
|
|
642
|
+
assert.deepEqual(result.modeChanged, []);
|
|
523
643
|
const content = await readFile(configPath, "utf8");
|
|
524
|
-
assert.match(content, /\[features\.multi_agent_v2\]\
|
|
644
|
+
assert.match(content, /\[features\.multi_agent_v2\][\s\S]*?enabled = false/);
|
|
645
|
+
assert.match(content, /max_concurrent_threads_per_session = 1000/);
|
|
646
|
+
assert.match(content, /\[agents\][\s\S]*?max_threads = 1000/);
|
|
647
|
+
assert.doesNotMatch(content, /^\s*multi_agent_mode\s*=/m);
|
|
648
|
+
});
|
|
649
|
+
|
|
650
|
+
test("#given global config starts with inline-comment features table #when full migration runs #then managed root settings stay at TOML root", async () => {
|
|
651
|
+
const root = await mkdtemp(join(tmpdir(), "lazycodex-root-settings-inline-features-"));
|
|
652
|
+
const codexHome = join(root, "codex-home");
|
|
653
|
+
await mkdir(codexHome, { recursive: true });
|
|
654
|
+
const configPath = join(codexHome, "config.toml");
|
|
655
|
+
await writeFile(
|
|
656
|
+
configPath,
|
|
657
|
+
[
|
|
658
|
+
"[features] # keep comment",
|
|
659
|
+
"plugins = true",
|
|
660
|
+
"",
|
|
661
|
+
].join("\n"),
|
|
662
|
+
);
|
|
663
|
+
|
|
664
|
+
const result = await migrateCodexConfig({
|
|
665
|
+
env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json") },
|
|
666
|
+
cwd: root,
|
|
667
|
+
});
|
|
668
|
+
|
|
669
|
+
assert.deepEqual(result.changed, [configPath]);
|
|
670
|
+
const content = await readFile(configPath, "utf8");
|
|
671
|
+
const parsed = parseTomlWithPython(content);
|
|
672
|
+
assert.equal("multi_agent_mode" in parsed, false);
|
|
673
|
+
assert.equal(parsed.model, "gpt-5.5");
|
|
674
|
+
assert.equal(parsed.model_context_window, 400000);
|
|
675
|
+
assert.equal(parsed.model_reasoning_effort, "high");
|
|
676
|
+
assert.equal(parsed.plan_mode_reasoning_effort, "xhigh");
|
|
677
|
+
assert.equal(parsed.features.plugins, true);
|
|
678
|
+
assert.equal("multi_agent_mode" in parsed.features, false);
|
|
679
|
+
assert.equal("model" in parsed.features, false);
|
|
680
|
+
assert.equal("model_context_window" in parsed.features, false);
|
|
681
|
+
assert.match(content, /^model = "gpt-5\.5"\nmodel_context_window = 400000/m);
|
|
682
|
+
assert.doesNotMatch(content, /^\s*multi_agent_mode\s*=/m);
|
|
683
|
+
assert.match(content, /\[features\] # keep comment\nplugins = true/);
|
|
684
|
+
});
|
|
685
|
+
|
|
686
|
+
test("#given queue multi-agent mode #when removing unsupported root key #then deletes root setting", () => {
|
|
687
|
+
const config = ['multi_agent_mode = "queue"', "", "[features]", "multi_agent = true", ""].join("\n");
|
|
688
|
+
|
|
689
|
+
const result = removeUnsupportedRootMultiAgentMode(config);
|
|
690
|
+
|
|
691
|
+
assert.doesNotMatch(result, /^\s*multi_agent_mode\s*=/m);
|
|
692
|
+
assert.doesNotMatch(result, /multi_agent_mode = "queue"/);
|
|
693
|
+
assert.match(result, /\[features\]/);
|
|
694
|
+
});
|
|
695
|
+
|
|
696
|
+
test("#given proactive multi-agent mode #when removing unsupported root key #then deletes root setting", () => {
|
|
697
|
+
const config = ['multi_agent_mode = "proactive" # user already opted in', "", "[features]", "multi_agent = true", ""].join("\n");
|
|
698
|
+
|
|
699
|
+
const result = removeUnsupportedRootMultiAgentMode(config);
|
|
700
|
+
|
|
701
|
+
assert.doesNotMatch(result, /^\s*multi_agent_mode\s*=/m);
|
|
702
|
+
assert.match(result, /\[features\]/);
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
test("#given inline-comment features table #when removing unsupported root key #then config stays unchanged", () => {
|
|
706
|
+
const config = ["[features] # keep comment", "multi_agent = true", ""].join("\n");
|
|
707
|
+
|
|
708
|
+
const result = removeUnsupportedRootMultiAgentMode(config);
|
|
709
|
+
const parsed = parseTomlWithPython(result);
|
|
710
|
+
|
|
711
|
+
assert.equal(result, config);
|
|
712
|
+
assert.equal("multi_agent_mode" in parsed, false);
|
|
713
|
+
assert.equal(parsed.features.multi_agent, true);
|
|
714
|
+
});
|
|
715
|
+
|
|
716
|
+
test("#given indented root proactive mode #when removing unsupported root key #then no root setting remains", () => {
|
|
717
|
+
const config = [' multi_agent_mode = "proactive" # user already opted in', "", "[features] # keep comment", "multi_agent = true", ""].join("\n");
|
|
718
|
+
|
|
719
|
+
const result = removeUnsupportedRootMultiAgentMode(config);
|
|
720
|
+
|
|
721
|
+
assert.equal(result.match(/multi_agent_mode\s*=/g)?.length ?? 0, 0);
|
|
722
|
+
assert.match(result, /^\[features\] # keep comment$/m);
|
|
525
723
|
});
|
|
526
724
|
|
|
527
725
|
test("#given global config with forced multi_agent_v2 #when full migration runs #then disables it on disk", async () => {
|
|
@@ -551,6 +749,8 @@ test("#given global config with forced multi_agent_v2 #when full migration runs
|
|
|
551
749
|
const content = await readFile(configPath, "utf8");
|
|
552
750
|
assert.match(content, /enabled = false/);
|
|
553
751
|
assert.doesNotMatch(content, /enabled = true/);
|
|
752
|
+
assert.match(content, /max_concurrent_threads_per_session = 1000/);
|
|
753
|
+
assert.match(content, /\[agents\][\s\S]*?max_threads = 1000/);
|
|
554
754
|
});
|
|
555
755
|
|
|
556
756
|
test("#given enabled = true with an inline comment #when forcing disable #then flips to false and preserves the comment", () => {
|
|
@@ -25,5 +25,6 @@ test("#given Codex Light install docs #when inspected #then lazycodex is npm-fir
|
|
|
25
25
|
for (const [path, text] of docs) {
|
|
26
26
|
assert.match(text, /\bnpx lazycodex-ai install\b/, `${path} should document the Node/npm install command`);
|
|
27
27
|
assert.doesNotMatch(text, /\bbunx lazycodex-ai\b/, `${path} should not require Bun for lazycodex`);
|
|
28
|
+
assert.doesNotMatch(text, /npx\s+--package\s+oh-my-openagent\s+omo\s+install/, `${path} should not recommend the Windows-broken --package install command`);
|
|
28
29
|
}
|
|
29
30
|
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { mkdtemp, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
|
|
7
|
+
import { migrateConfigFile } from "../scripts/migrate-codex-config.mjs";
|
|
8
|
+
|
|
9
|
+
test("#given SessionStart config migration sees a low subagent cap #when migrating #then raises it to 1000", async () => {
|
|
10
|
+
const root = await mkdtemp(join(tmpdir(), "lazycodex-subagent-limit-migration-"));
|
|
11
|
+
const configPath = join(root, "config.toml");
|
|
12
|
+
await writeFile(
|
|
13
|
+
configPath,
|
|
14
|
+
[
|
|
15
|
+
'model = "gpt-5.4"',
|
|
16
|
+
"model_context_window = 123456",
|
|
17
|
+
'model_reasoning_effort = "medium"',
|
|
18
|
+
'plan_mode_reasoning_effort = "medium"',
|
|
19
|
+
"",
|
|
20
|
+
"[agents]",
|
|
21
|
+
"max_threads = 6",
|
|
22
|
+
"max_depth = 4",
|
|
23
|
+
"",
|
|
24
|
+
"[agents.explorer]",
|
|
25
|
+
'config_file = "./agents/explorer.toml"',
|
|
26
|
+
"",
|
|
27
|
+
"[features.multi_agent_v2]",
|
|
28
|
+
"enabled = false",
|
|
29
|
+
"max_concurrent_threads_per_session = 6",
|
|
30
|
+
"",
|
|
31
|
+
].join("\n"),
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const result = await migrateConfigFile(configPath);
|
|
35
|
+
|
|
36
|
+
const content = await readFile(configPath, "utf8");
|
|
37
|
+
assert.equal(result.changed, true);
|
|
38
|
+
assert.match(content, /\[agents\][\s\S]*?max_threads = 1000/);
|
|
39
|
+
assert.match(content, /max_depth = 4/);
|
|
40
|
+
assert.match(content, /\[agents\.explorer\]\nconfig_file = "\.\/agents\/explorer\.toml"/);
|
|
41
|
+
assert.match(content, /\[features\.multi_agent_v2\][\s\S]*?enabled = false/);
|
|
42
|
+
assert.match(content, /max_concurrent_threads_per_session = 1000/);
|
|
43
|
+
assert.doesNotMatch(content, /^max_threads\s*=\s*6$/m);
|
|
44
|
+
});
|
|
@@ -20,10 +20,19 @@ async function readSkill(skillName) {
|
|
|
20
20
|
return readFile(join(root, "skills", skillName, "SKILL.md"), "utf8");
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
async function readSharedSkill(skillName) {
|
|
24
|
+
return readFile(join(root, "../../shared-skills/skills", skillName, "SKILL.md"), "utf8");
|
|
25
|
+
}
|
|
26
|
+
|
|
23
27
|
function patternFromParts(parts, flags) {
|
|
24
28
|
return new RegExp(parts.join(""), flags);
|
|
25
29
|
}
|
|
26
30
|
|
|
31
|
+
const multiAgentV2RoleGuidance =
|
|
32
|
+
"On `multi_agent_v2` sessions the same `agent_type` applies (the OMO installer exposes it) with `fork_turns` instead of `fork_context`.";
|
|
33
|
+
const loadSkillsGuidance =
|
|
34
|
+
"When translating `load_skills=[...]`, include the requested skill names in the spawned agent's `message`.";
|
|
35
|
+
|
|
27
36
|
test("#given synced aggregate Codex skills #when they contain OpenCode orchestration examples #then Codex tool compatibility guidance is injected", async () => {
|
|
28
37
|
// given
|
|
29
38
|
const opencodeOnlyToolPattern = /\b(?:call_omo_agent|background_output|team_[a-z_]+|task)\s*\(/;
|
|
@@ -41,6 +50,8 @@ test("#given synced aggregate Codex skills #when they contain OpenCode orchestra
|
|
|
41
50
|
compatibilityIndex < content.search(opencodeOnlyToolPattern),
|
|
42
51
|
`${skillName} must explain Codex tool translation before OpenCode-only examples`,
|
|
43
52
|
);
|
|
53
|
+
assert.ok(content.includes(multiAgentV2RoleGuidance), `${skillName} missing multi_agent_v2 role guidance`);
|
|
54
|
+
assert.ok(content.includes(loadSkillsGuidance), `${skillName} missing load_skills guidance`);
|
|
44
55
|
}
|
|
45
56
|
});
|
|
46
57
|
|
|
@@ -77,7 +88,7 @@ task(category="quick", prompt="verify")
|
|
|
77
88
|
assert.ok(compatibilityIndex < firstToolIndex);
|
|
78
89
|
assert.equal(adapted.match(/## Codex Harness Tool Compatibility/g)?.length, 1);
|
|
79
90
|
assert.doesNotMatch(adapted, /Older variant guidance/);
|
|
80
|
-
assert.doesNotMatch(adapted, /
|
|
91
|
+
assert.doesNotMatch(adapted, /name the skills inside the spawned agent's `message`/);
|
|
81
92
|
assert.match(adapted, /\n---\n\n## Next Section/);
|
|
82
93
|
});
|
|
83
94
|
|
|
@@ -141,6 +152,25 @@ call_omo_agent(subagent_type="explore", prompt="inspect")
|
|
|
141
152
|
assert.doesNotMatch(adapted, /Obsolete generated compatibility prose/);
|
|
142
153
|
});
|
|
143
154
|
|
|
155
|
+
test("#given generated Codex compatibility guidance #when adapting a skill #then multi-agent role and load_skills guidance are both present", () => {
|
|
156
|
+
// given
|
|
157
|
+
const content = `---
|
|
158
|
+
name: example
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
# Example Skill
|
|
162
|
+
|
|
163
|
+
task(subagent_type="oracle", load_skills=["debugging"], prompt="verify")
|
|
164
|
+
`;
|
|
165
|
+
|
|
166
|
+
// when
|
|
167
|
+
const adapted = insertCodexCompatibilityGuidance(content);
|
|
168
|
+
|
|
169
|
+
// then
|
|
170
|
+
assert.ok(adapted.includes(multiAgentV2RoleGuidance));
|
|
171
|
+
assert.ok(adapted.includes(loadSkillsGuidance));
|
|
172
|
+
});
|
|
173
|
+
|
|
144
174
|
test("#given generated guidance before a template export #when adapting a skill #then the export wrapper is preserved", () => {
|
|
145
175
|
// given
|
|
146
176
|
const content = `---
|
|
@@ -214,3 +244,22 @@ test("#given review-work skill #when some lanes do not finish #then aggregate re
|
|
|
214
244
|
assert.match(content, /Do not spin in repeated/);
|
|
215
245
|
assert.match(content, /Do not use `multi_agent_v1\.send_input` as an interrupt/);
|
|
216
246
|
});
|
|
247
|
+
|
|
248
|
+
test("#given PR and review skills #when synced for Codex #then worktree lifecycle is mandatory", async () => {
|
|
249
|
+
const startWork = await readSkill("start-work");
|
|
250
|
+
const reviewWork = await readSkill("review-work");
|
|
251
|
+
const sharedStartWork = await readSharedSkill("start-work");
|
|
252
|
+
|
|
253
|
+
assert.match(startWork, /PR creation, PR handoff, branch handoff, or merge/);
|
|
254
|
+
assert.match(startWork, /Finish the PR\/branch lifecycle from its task-owned worktree/);
|
|
255
|
+
assert.match(startWork, /merge by default unless explicitly opted out/);
|
|
256
|
+
assert.match(startWork, /No PR\/branch implementation or review in the main worktree/);
|
|
257
|
+
|
|
258
|
+
assert.match(sharedStartWork, /required for PR\/branch work/);
|
|
259
|
+
assert.match(sharedStartWork, /No PR\/branch implementation, review, or merge in the main worktree/);
|
|
260
|
+
assert.doesNotMatch(sharedStartWork, /If worktree mode was used/);
|
|
261
|
+
assert.doesNotMatch(sharedStartWork, /merge or hand off exactly as requested/);
|
|
262
|
+
|
|
263
|
+
assert.match(reviewWork, /dedicated review worktree attached to that branch/);
|
|
264
|
+
assert.match(reviewWork, /Never\s+checkout, test, or edit the review branch in the main worktree/);
|
|
265
|
+
});
|
|
@@ -6,6 +6,7 @@ export const CONTEXT_PRESSURE_SKILL_BUDGET_BYTES = 25_000;
|
|
|
6
6
|
|
|
7
7
|
export const expectedSkills = [
|
|
8
8
|
"ast-grep",
|
|
9
|
+
"coding-agent-sessions",
|
|
9
10
|
"comment-checker",
|
|
10
11
|
"debugging",
|
|
11
12
|
"frontend",
|
|
@@ -27,6 +28,7 @@ export const expectedSkills = [
|
|
|
27
28
|
"ultraresearch",
|
|
28
29
|
"ulw-loop",
|
|
29
30
|
"ulw-plan",
|
|
31
|
+
"ulw-research",
|
|
30
32
|
"visual-qa",
|
|
31
33
|
];
|
|
32
34
|
|
|
@@ -41,6 +43,7 @@ export const componentSkillSources = [
|
|
|
41
43
|
|
|
42
44
|
const codexCompatibilityEndMarkers = [
|
|
43
45
|
"For work likely to exceed one wait cycle, require the child to send `WORKING: <task> - <current phase>` before long passes and `BLOCKED: <reason>` only when progress stops. A `multi_agent_v1.wait_agent` timeout only means no new mailbox update arrived. Treat a running child as alive. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running.\n\n",
|
|
46
|
+
"On `multi_agent_v2` sessions the same `agent_type` applies (the OMO installer exposes it) with `fork_turns` instead of `fork_context`. If a code block below conflicts with this section, this section wins.\n\n",
|
|
44
47
|
"Role-specific behavior must be described in a self-contained `message`. Use `fork_context: false` to start the child with only the initial prompt (no parent history); use `fork_context: true` only when full parent history is truly required. Include any required conversation context, files, diffs, constraints, and requested skill names directly in the spawned agent's `message`. If a code block below conflicts with this section, this section wins.\n\n",
|
|
45
48
|
"When translating `load_skills=[...]`, include the requested skill names in the spawned agent's `message`. If a code block below conflicts with this section, this section wins.\n\n",
|
|
46
49
|
"When translating `load_skills=[...]`, name the skills inside the spawned agent's `message`. If a code block below conflicts with this section, this section wins.\n\n",
|
|
@@ -64,29 +67,29 @@ export function removeCodexCompatibilityGuidance(content) {
|
|
|
64
67
|
const startWorkOriginalCompletion = `When all top-level checkboxes in \`## TODOs\` and \`## Final Verification Wave\` are complete:
|
|
65
68
|
|
|
66
69
|
1. Run the plan's final verification commands.
|
|
67
|
-
2.
|
|
70
|
+
2. For PR/branch work, finish the lifecycle from the task-owned worktree: sync \`.omo/\` state back to the main repo, create or update the PR, wait for review/verification gates, merge by default unless explicitly opted out, and remove the worktree only after successful merge or explicit handoff.
|
|
68
71
|
3. Remove or mark the Boulder work as completed.
|
|
69
72
|
4. Print an \`ORCHESTRATION COMPLETE\` block with the plan path, verification commands, artifacts, and cleanup receipts.`;
|
|
70
73
|
|
|
71
74
|
const startWorkCodexCompletion = `When all top-level checkboxes in \`## TODOs\` and \`## Final Verification Wave\` are complete:
|
|
72
75
|
|
|
73
76
|
1. Run the plan's final verification commands.
|
|
74
|
-
2. Complete the **Global Review and Debugging Gate** before any completion claim, PR handoff,
|
|
77
|
+
2. Complete the **Global Review and Debugging Gate** before any completion claim, PR creation, PR handoff, branch handoff, or merge:
|
|
75
78
|
- Invoke the \`review-work\` skill with the final diff, changed files, user goal, constraints, run command, and verification evidence. All five review lanes must return PASS. A timeout, missing deliverable, ack-only child, \`BLOCKED:\`, or inconclusive lane is a gate failure, not approval.
|
|
76
79
|
- Run a debugging-oriented runtime audit even when the review passes: name at least three plausible failure hypotheses for the changed surface, run the distinguishing checks against the actual artifact, and append the ruled-out or confirmed result to \`.omo/start-work/ledger.jsonl\`.
|
|
77
80
|
- If any review lane or debugging hypothesis fails, invoke the \`debugging\` skill, confirm root cause with runtime evidence, add the minimal failing test or reproduction, fix it, rerun the affected verification, then rerun the Global Review and Debugging Gate.
|
|
78
81
|
- Evidence hygiene is mandatory: redact or mask secrets and sensitive user data before writing \`.omo/start-work/ledger.jsonl\`, a PR body, or a handoff. Never include raw tokens, credentials, auth headers, cookies, API keys, env dumps, private logs, or PII; use concise summaries, lengths, hashes, or short non-sensitive prefixes instead.
|
|
79
|
-
- If the work includes creating, updating, or handing off a PR, refresh \`git status\` and the PR/branch state after the gate, and include only redacted review/debugging evidence in the PR body or handoff.
|
|
80
|
-
3.
|
|
82
|
+
- If the work includes creating, updating, or handing off a PR, refresh \`git status\` and the PR/branch state from the task-owned worktree after the gate, and include only redacted review/debugging evidence in the PR body or handoff.
|
|
83
|
+
3. Finish the PR/branch lifecycle from its task-owned worktree: sync \`.omo/\` state back to the main repo, create or update the PR when requested, wait for CI/review/Cubic gates, merge by default unless explicitly opted out, and remove the worktree only after successful merge or explicit handoff.
|
|
81
84
|
4. Remove or mark the Boulder work as completed.
|
|
82
85
|
5. Print an \`ORCHESTRATION COMPLETE\` block with the plan path, verification commands, Global Review and Debugging Gate verdict, artifacts, and cleanup receipts.`;
|
|
83
86
|
|
|
84
|
-
const startWorkOriginalHardRule = "- No completion claim while an applicable ultraqa adversarial class was never probed. Each applicable class needs a captured observable result; each skipped class needs a one-line not-applicable reason in the ledger.\n- No unprefixed session ids in Boulder state. Codex sessions are always `codex:<session_id>`.";
|
|
87
|
+
const startWorkOriginalHardRule = "- No completion claim while an applicable ultraqa adversarial class was never probed. Each applicable class needs a captured observable result; each skipped class needs a one-line not-applicable reason in the ledger.\n- No PR/branch implementation, review, or merge in the main worktree; use the task-owned git worktree.\n- No unprefixed session ids in Boulder state. Codex sessions are always `codex:<session_id>`.";
|
|
85
88
|
|
|
86
|
-
const startWorkCodexHardRule = "- No completion claim while an applicable ultraqa adversarial class was never probed. Each applicable class needs a captured observable result; each skipped class needs a one-line not-applicable reason in the ledger.\n- No `ORCHESTRATION COMPLETE`, final response, PR creation,
|
|
89
|
+
const startWorkCodexHardRule = "- No completion claim while an applicable ultraqa adversarial class was never probed. Each applicable class needs a captured observable result; each skipped class needs a one-line not-applicable reason in the ledger.\n- No `ORCHESTRATION COMPLETE`, final response, PR creation, PR handoff, or merge before the Global Review and Debugging Gate passes with recorded evidence.\n- No PR/branch implementation or review in the main worktree; create or use a task-owned git worktree first.\n- No unprefixed session ids in Boulder state. Codex sessions are always `codex:<session_id>`.";
|
|
87
90
|
|
|
88
91
|
const reviewWorkCodexGatePattern =
|
|
89
|
-
/\nWhen `review-work` is used as a final implementation, PR, or `\$start-work`\ngate, it is blocking\. A timeout, missing deliverable, ack-only response,\nexplicit `BLOCKED:`, or inconclusive lane is not a pass\. Treat that lane as\nfailed, investigate the underlying uncertainty with the `debugging` skill when\nruntime behavior may be wrong, fix with evidence, and rerun the affected lane\nbefore claiming completion or handing off a PR\.\n\nReview evidence must be safe to share\. Redact or mask secrets and sensitive\nuser data before including evidence in logs, PR bodies, or handoffs\. Never\ninclude raw tokens, credentials, auth headers, cookies, API keys, env dumps,\nprivate logs, or PII; summarize with lengths, hashes, and short non-sensitive\nprefixes when identity is needed\.\n/;
|
|
92
|
+
/\nWhen `review-work` is used as a final implementation, PR, or `\$start-work`\ngate, it is blocking\. A timeout, missing deliverable, ack-only response,\nexplicit `BLOCKED:`, or inconclusive lane is not a pass\. Treat that lane as\nfailed, investigate the underlying uncertainty with the `debugging` skill when\nruntime behavior may be wrong, fix with evidence, and rerun the affected lane\nbefore claiming completion, creating or handing off a PR, or merging\.\n\nWhen reviewing a PR or branch, collect diff, file contents, and verification\nresults from a dedicated review worktree attached to that branch\. Never\ncheckout, test, or edit the review branch in the main worktree\.\n\nReview evidence must be safe to share\. Redact or mask secrets and sensitive\nuser data before including evidence in logs, PR bodies, or handoffs\. Never\ninclude raw tokens, credentials, auth headers, cookies, API keys, env dumps,\nprivate logs, or PII; summarize with lengths, hashes, and short non-sensitive\nprefixes when identity is needed\.\n/;
|
|
90
93
|
|
|
91
94
|
export function removeCodexSkillOverlays(skillName, content) {
|
|
92
95
|
if (skillName === "start-work") {
|
|
@@ -112,10 +112,22 @@ test("#given shared skill source tests #when aggregate Codex skills are synced #
|
|
|
112
112
|
const aggregateSkillsRoot = join(root, "skills");
|
|
113
113
|
|
|
114
114
|
// when
|
|
115
|
-
const
|
|
115
|
+
const forbiddenFiles = [];
|
|
116
|
+
for (const skillName of expectedSkills) {
|
|
117
|
+
for (const file of await listSkillFiles(join(aggregateSkillsRoot, skillName))) {
|
|
118
|
+
const normalized = file.replaceAll("\\", "/");
|
|
119
|
+
const segments = normalized.split("/");
|
|
120
|
+
const scriptsIndex = segments.lastIndexOf("scripts");
|
|
121
|
+
const hasPythonTestDir = scriptsIndex !== -1 && segments[scriptsIndex + 1] === "tests";
|
|
122
|
+
const isSourceMetadata = normalized === ".gitignore" || normalized === ".npmignore" || normalized === "pyrightconfig.json";
|
|
123
|
+
if (normalized.endsWith(".test.ts") || hasPythonTestDir || segments.includes("__pycache__") || normalized.endsWith(".pyc") || isSourceMetadata) {
|
|
124
|
+
forbiddenFiles.push(`${skillName}/${normalized}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
116
128
|
|
|
117
129
|
// then
|
|
118
|
-
assert.
|
|
130
|
+
assert.deepEqual(forbiddenFiles, []);
|
|
119
131
|
});
|
|
120
132
|
|
|
121
133
|
test("#given component skill sources #when aggregate Codex component skills are inspected #then generated copies have no hand-authored drift", async () => {
|
|
@@ -169,6 +181,20 @@ test("#given synced ulw-loop skill #when Codex hint metadata is inspected #then
|
|
|
169
181
|
assert.match(interfaceMetadata, /- "ulw-loop"/);
|
|
170
182
|
});
|
|
171
183
|
|
|
184
|
+
test("#given synced legacy ultraresearch alias #when inspected #then it points users at ulw-research", async () => {
|
|
185
|
+
// given
|
|
186
|
+
const skillRoot = join(root, "skills", "ultraresearch");
|
|
187
|
+
|
|
188
|
+
// when
|
|
189
|
+
const skill = await readFile(join(skillRoot, "SKILL.md"), "utf8");
|
|
190
|
+
const interfaceMetadata = await readFile(join(skillRoot, "agents", "openai.yaml"), "utf8");
|
|
191
|
+
|
|
192
|
+
// then
|
|
193
|
+
assert.match(skill, /^---\r?\nname: ultraresearch\r?\n/m);
|
|
194
|
+
assert.match(skill, /legacy name for `ulw-research`/);
|
|
195
|
+
assert.match(interfaceMetadata, /display_name: "\(OmO\) ultraresearch"/);
|
|
196
|
+
});
|
|
197
|
+
|
|
172
198
|
test("#given synced git-master skill #when inspected #then commits and git history route through it", async () => {
|
|
173
199
|
// given
|
|
174
200
|
const skillRoot = join(root, "skills", "git-master");
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
|
|
6
|
+
import { root } from "./aggregate-plugin-fixture.mjs";
|
|
7
|
+
import { cleanupTeamRoot, createTeamRoot, readTeamJson, runTeam } from "./teammode-safety-fixture.mjs";
|
|
8
|
+
|
|
9
|
+
const teammodeSkillPath = join("components", "teammode", "skills", "teammode", "SKILL.md");
|
|
10
|
+
|
|
11
|
+
test("#given Codex App thread ids can be ambiguous across hosts #when archive guidance is read #then it separates app-thread archival from team-state archival", () => {
|
|
12
|
+
const body = readFileSync(join(root, teammodeSkillPath), "utf8");
|
|
13
|
+
|
|
14
|
+
assert.match(
|
|
15
|
+
body,
|
|
16
|
+
/Ambiguous Codex thread id|ambiguous across hosts/i,
|
|
17
|
+
"archive guidance must name the Codex App multi-host ambiguity failure instead of only saying the archive tool is unavailable",
|
|
18
|
+
);
|
|
19
|
+
assert.match(
|
|
20
|
+
body,
|
|
21
|
+
/app-thread archival blocker/i,
|
|
22
|
+
"archive guidance must classify ambiguous app-thread ids as app-thread archival blockers",
|
|
23
|
+
);
|
|
24
|
+
assert.match(
|
|
25
|
+
body,
|
|
26
|
+
/record .*team log/i,
|
|
27
|
+
"archive guidance must require a durable team-log record when app-thread archival cannot be proven",
|
|
28
|
+
);
|
|
29
|
+
assert.match(
|
|
30
|
+
body,
|
|
31
|
+
/continue .*team-state archive/i,
|
|
32
|
+
"archive guidance must let the team-state archive proceed after recording the app-thread archival blocker",
|
|
33
|
+
);
|
|
34
|
+
assert.match(
|
|
35
|
+
body,
|
|
36
|
+
/archive --note/i,
|
|
37
|
+
"archive guidance must route ambiguous app-thread archive blockers into archive --note evidence",
|
|
38
|
+
);
|
|
39
|
+
assert.match(
|
|
40
|
+
body,
|
|
41
|
+
/Do not delete/i,
|
|
42
|
+
"archive guidance must keep evidence available until ambiguous app-thread archival is resolved",
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("#given app-thread archival is blocked by an ambiguous id #when archive runs with a note #then team state is archived and keeps the blocker in the log", () => {
|
|
47
|
+
const tempRoot = createTeamRoot("omo-codex-teammode-archive-ambiguity-");
|
|
48
|
+
try {
|
|
49
|
+
runTeam(tempRoot, "init", "--name", "ArchiveQA", "--session-name", "cleanup", "--session", "archive-ambiguity");
|
|
50
|
+
runTeam(
|
|
51
|
+
tempRoot,
|
|
52
|
+
"add-member",
|
|
53
|
+
"--team",
|
|
54
|
+
"archive-ambiguity",
|
|
55
|
+
"--id",
|
|
56
|
+
"A",
|
|
57
|
+
"--name",
|
|
58
|
+
"local",
|
|
59
|
+
"--focus",
|
|
60
|
+
"local host member",
|
|
61
|
+
"--lens",
|
|
62
|
+
"area",
|
|
63
|
+
"--deliverable",
|
|
64
|
+
"local notes",
|
|
65
|
+
);
|
|
66
|
+
runTeam(
|
|
67
|
+
tempRoot,
|
|
68
|
+
"add-member",
|
|
69
|
+
"--team",
|
|
70
|
+
"archive-ambiguity",
|
|
71
|
+
"--id",
|
|
72
|
+
"B",
|
|
73
|
+
"--name",
|
|
74
|
+
"remote",
|
|
75
|
+
"--focus",
|
|
76
|
+
"remote host member",
|
|
77
|
+
"--lens",
|
|
78
|
+
"perspective",
|
|
79
|
+
"--deliverable",
|
|
80
|
+
"remote notes",
|
|
81
|
+
);
|
|
82
|
+
runTeam(tempRoot, "bind-thread", "--team", "archive-ambiguity", "--id", "A", "--thread", "duplicate-thread-id");
|
|
83
|
+
runTeam(tempRoot, "bind-thread", "--team", "archive-ambiguity", "--id", "B", "--thread", "remote-thread-id");
|
|
84
|
+
|
|
85
|
+
const blocker = "app-thread archive blocker: Ambiguous Codex thread id duplicate-thread-id; matching hosts: local, remote-ssh-discovered:m5";
|
|
86
|
+
runTeam(tempRoot, "archive", "--team", "archive-ambiguity", "--note", blocker);
|
|
87
|
+
const team = readTeamJson(tempRoot, "archive-ambiguity");
|
|
88
|
+
|
|
89
|
+
assert.equal(team.status, "archived");
|
|
90
|
+
assert.deepEqual(
|
|
91
|
+
team.members.map((member) => member.status),
|
|
92
|
+
["archived", "archived"],
|
|
93
|
+
);
|
|
94
|
+
assert.equal(
|
|
95
|
+
team.log.some((entry) => entry.event === "archive" && entry.detail === blocker),
|
|
96
|
+
true,
|
|
97
|
+
"team log must preserve the app-thread archival blocker after durable team-state archival",
|
|
98
|
+
);
|
|
99
|
+
} finally {
|
|
100
|
+
cleanupTeamRoot(tempRoot);
|
|
101
|
+
}
|
|
102
|
+
});
|