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,20 +1,27 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
|
+
import { execFile } from "node:child_process";
|
|
2
3
|
import { lstat, mkdir, mkdtemp, readdir, readFile, readlink, rm, stat, writeFile } from "node:fs/promises";
|
|
3
4
|
import { tmpdir } from "node:os";
|
|
4
|
-
import { join, sep } from "node:path";
|
|
5
|
+
import { dirname, join, sep } from "node:path";
|
|
5
6
|
import test from "node:test";
|
|
7
|
+
import { promisify } from "node:util";
|
|
6
8
|
|
|
7
9
|
const CLI_URL = new URL("../components/bootstrap/dist/cli.js", import.meta.url);
|
|
8
10
|
const { runBootstrapWorker, runWorkerSetup } = await import(CLI_URL.href);
|
|
9
11
|
|
|
10
12
|
const MARKETPLACE_SOURCE_LINE = 'source = "https://github.com/code-yeongyu/lazycodex.git"';
|
|
11
13
|
const COMPONENT_BIN_NAME = "omo-toolbox";
|
|
14
|
+
const execFileAsync = promisify(execFile);
|
|
12
15
|
const OMO_CLI_DEGRADED_ENTRY = {
|
|
13
16
|
component: "omo-cli",
|
|
14
17
|
hint: "use npx lazycodex-ai for the omo CLI",
|
|
15
18
|
reason: "marketplace payload has no dist/cli",
|
|
16
19
|
};
|
|
17
20
|
|
|
21
|
+
function escapeRegExp(value) {
|
|
22
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
23
|
+
}
|
|
24
|
+
|
|
18
25
|
async function withBinLinkFixture(run) {
|
|
19
26
|
const root = await mkdtemp(join(tmpdir(), "omo-bootstrap-binlinks-"));
|
|
20
27
|
try {
|
|
@@ -33,7 +40,7 @@ async function withBinLinkFixture(run) {
|
|
|
33
40
|
// Mirrors the Codex marketplace store layout: each plugin version is installed
|
|
34
41
|
// under its own root and old version dirs are deleted on upgrade
|
|
35
42
|
// (core-plugins store.rs), which is why stale bin links MUST be re-pointed.
|
|
36
|
-
async function writeVersionedRoot(root, version, { withRuntimeCli = false } = {}) {
|
|
43
|
+
async function writeVersionedRoot(root, version, { withRuntimeCli = false, withUlwLoopAliases = false } = {}) {
|
|
37
44
|
const pluginRoot = join(root, "store", "omo", version);
|
|
38
45
|
await mkdir(join(pluginRoot, ".codex-plugin"), { recursive: true });
|
|
39
46
|
await writeFile(
|
|
@@ -76,9 +83,27 @@ async function writeVersionedRoot(root, version, { withRuntimeCli = false } = {}
|
|
|
76
83
|
`${JSON.stringify({ bin: { [COMPONENT_BIN_NAME]: "./dist/cli.js" }, name: "@sisyphuslabs/toolbox" })}\n`,
|
|
77
84
|
);
|
|
78
85
|
await writeFile(join(componentRoot, "dist", "cli.js"), "#!/usr/bin/env node\nconsole.log('toolbox');\n");
|
|
86
|
+
if (withUlwLoopAliases) {
|
|
87
|
+
const ulwLoopRoot = join(pluginRoot, "components", "ulw-loop");
|
|
88
|
+
await mkdir(join(ulwLoopRoot, "dist"), { recursive: true });
|
|
89
|
+
await writeFile(
|
|
90
|
+
join(ulwLoopRoot, "package.json"),
|
|
91
|
+
`${JSON.stringify({
|
|
92
|
+
bin: {
|
|
93
|
+
"omo-ulw-loop": "./dist/cli.js",
|
|
94
|
+
ulw: "./dist/cli.js",
|
|
95
|
+
"ulw-loop": "./dist/cli.js",
|
|
96
|
+
},
|
|
97
|
+
name: "@sisyphuslabs/ulw-loop",
|
|
98
|
+
})}\n`,
|
|
99
|
+
);
|
|
100
|
+
await writeFile(join(ulwLoopRoot, "dist", "cli.js"), "#!/usr/bin/env node\nconsole.log('ulw-loop');\n");
|
|
101
|
+
}
|
|
79
102
|
if (withRuntimeCli) {
|
|
80
103
|
await mkdir(join(pluginRoot, "dist", "cli"), { recursive: true });
|
|
81
104
|
await writeFile(join(pluginRoot, "dist", "cli", "index.js"), "console.log('omo');\n");
|
|
105
|
+
await mkdir(join(pluginRoot, "dist", "cli-node"), { recursive: true });
|
|
106
|
+
await writeFile(join(pluginRoot, "dist", "cli-node", "index.js"), "console.log('omo node runtime');\n");
|
|
82
107
|
}
|
|
83
108
|
return pluginRoot;
|
|
84
109
|
}
|
|
@@ -196,14 +221,18 @@ test("#given platform win32 #when the worker setup links bins #then component bi
|
|
|
196
221
|
assert.deepEqual(outcome.degraded, []);
|
|
197
222
|
const shim = await readFile(join(fixture.binDir, `${COMPONENT_BIN_NAME}.cmd`), "utf8");
|
|
198
223
|
assert.match(shim, /@echo off/);
|
|
199
|
-
|
|
224
|
+
const componentEntrypoint = join(pluginRoot, "components", "toolbox", "dist", "cli.js");
|
|
225
|
+
assert.match(shim, /NODE_REPL_NODE_PATH/);
|
|
226
|
+
assert.match(shim, /"%OMO_NODE_BINARY%"/);
|
|
227
|
+
assert.match(shim, new RegExp(`"${escapeRegExp(componentEntrypoint)}" %\\*`));
|
|
228
|
+
assert.doesNotMatch(shim, new RegExp(`node "${escapeRegExp(componentEntrypoint)}" %\\*`));
|
|
200
229
|
const wrapper = await readFile(join(fixture.binDir, "omo.cmd"), "utf8");
|
|
201
230
|
assert.ok(wrapper.includes(join(pluginRoot, "dist", "cli", "index.js")));
|
|
202
231
|
await assert.rejects(() => lstat(join(fixture.binDir, COMPONENT_BIN_NAME)), "win32 must not leave posix symlinks behind");
|
|
203
232
|
});
|
|
204
233
|
});
|
|
205
234
|
|
|
206
|
-
test("#given a
|
|
235
|
+
test("#given a legacy payload without root CLI dist #when the worker setup runs #then it records degraded omo-cli and leaves no broken link", async () => {
|
|
207
236
|
await withBinLinkFixture(async (fixture) => {
|
|
208
237
|
const pluginRoot = await writeVersionedRoot(fixture.root, "1.0.0");
|
|
209
238
|
|
|
@@ -219,7 +248,7 @@ test("#given a marketplace payload without dist/cli #when the worker setup runs
|
|
|
219
248
|
assert.ok(
|
|
220
249
|
warning.includes("skipped the omo runtime wrapper because ") &&
|
|
221
250
|
warning.includes(`${join("dist", "cli", "index.js")} is missing; `) &&
|
|
222
|
-
warning.includes("omo
|
|
251
|
+
warning.includes("omo ulw-loop commands will be unavailable until a package shipping dist/cli is installed"),
|
|
223
252
|
`bootstrap.log must carry the install-local warning text, got: ${log}`,
|
|
224
253
|
);
|
|
225
254
|
});
|
|
@@ -234,17 +263,42 @@ test("#given a payload shipping dist/cli #when the worker setup runs with no bin
|
|
|
234
263
|
assert.deepEqual(outcome.degraded, []);
|
|
235
264
|
const defaultBinDir = join(fixture.codexHome, "bin");
|
|
236
265
|
const wrapperName = process.platform === "win32" ? "omo.cmd" : "omo";
|
|
237
|
-
const
|
|
266
|
+
const wrapperPath = join(defaultBinDir, wrapperName);
|
|
267
|
+
const wrapper = await readFile(wrapperPath, "utf8");
|
|
238
268
|
assert.ok(wrapper.includes(join(pluginRoot, "dist", "cli", "index.js")));
|
|
239
269
|
if (process.platform !== "win32") {
|
|
240
|
-
assert.ok((await stat(
|
|
270
|
+
assert.ok((await stat(wrapperPath)).mode & 0o111, "the posix omo wrapper must be executable");
|
|
241
271
|
assert.equal(
|
|
242
272
|
await readlink(join(defaultBinDir, COMPONENT_BIN_NAME)),
|
|
243
273
|
join(pluginRoot, "components", "toolbox", "dist", "cli.js"),
|
|
244
274
|
);
|
|
275
|
+
const result = await execFileAsync(wrapperPath, ["--version"], {
|
|
276
|
+
env: { ...process.env, OMO_RUNTIME: "node", PATH: `${dirname(process.execPath)}:/usr/bin:/bin` },
|
|
277
|
+
});
|
|
278
|
+
assert.match(result.stdout, /omo node runtime/);
|
|
245
279
|
} else {
|
|
246
280
|
const shim = await readFile(join(defaultBinDir, `${COMPONENT_BIN_NAME}.cmd`), "utf8");
|
|
247
281
|
assert.ok(shim.includes(join(pluginRoot, "components", "toolbox", "dist", "cli.js")));
|
|
248
282
|
}
|
|
249
283
|
});
|
|
250
284
|
});
|
|
285
|
+
|
|
286
|
+
test("#given ulw-loop aliases in the plugin payload #when worker setup links bins #then public ULW commands point at the current component without adding SessionStart hooks", async () => {
|
|
287
|
+
await withBinLinkFixture(async (fixture) => {
|
|
288
|
+
const pluginRoot = await writeVersionedRoot(fixture.root, "1.0.0", { withUlwLoopAliases: true });
|
|
289
|
+
|
|
290
|
+
await runWorkerSetup(setupOptions(fixture, pluginRoot));
|
|
291
|
+
|
|
292
|
+
const targets = await symlinkTargets(fixture.binDir);
|
|
293
|
+
const ulwLoopCli = join(pluginRoot, "components", "ulw-loop", "dist", "cli.js");
|
|
294
|
+
assert.equal(targets.get("omo-ulw-loop"), ulwLoopCli);
|
|
295
|
+
assert.equal(targets.get("ulw"), ulwLoopCli);
|
|
296
|
+
assert.equal(targets.get("ulw-loop"), ulwLoopCli);
|
|
297
|
+
const hooks = JSON.parse(await readFile(join(pluginRoot, "hooks", "hooks.json"), "utf8"));
|
|
298
|
+
const sessionStartCommands = hooks.hooks.SessionStart.flatMap((group) => group.hooks)
|
|
299
|
+
.filter((hook) => hook.type === "command")
|
|
300
|
+
.map((hook) => hook.command)
|
|
301
|
+
.filter((command) => command.includes("components/bootstrap/dist/cli.js"));
|
|
302
|
+
assert.equal(sessionStartCommands.length, 1);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
@@ -16,6 +16,8 @@ const SKIPPED_DIRECTORY_NAMES = new Set([".git", "node_modules"]);
|
|
|
16
16
|
const EXPECTED_BOOTSTRAP_COMMAND = 'node "${PLUGIN_ROOT}/components/bootstrap/dist/cli.js" hook session-start';
|
|
17
17
|
const EXPECTED_BOOTSTRAP_COMMAND_WINDOWS =
|
|
18
18
|
'powershell -NoProfile -ExecutionPolicy Bypass -File "${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1"';
|
|
19
|
+
const EXPECTED_NODE_DISPATCH_PREFIX =
|
|
20
|
+
'powershell -NoProfile -ExecutionPolicy Bypass -File "${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1"';
|
|
19
21
|
|
|
20
22
|
async function pathExists(absolutePath) {
|
|
21
23
|
try {
|
|
@@ -127,6 +129,23 @@ test("#given aggregate and component hook manifests #when command targets are re
|
|
|
127
129
|
assert.deepEqual(missing, []);
|
|
128
130
|
});
|
|
129
131
|
|
|
132
|
+
test("#given aggregate hook manifests #when command handlers are inspected #then each has a Windows dispatcher", async () => {
|
|
133
|
+
// given
|
|
134
|
+
const aggregateHooks = await readAggregateHookManifests();
|
|
135
|
+
|
|
136
|
+
// when
|
|
137
|
+
const missing = [];
|
|
138
|
+
for (const manifest of aggregateHooks) {
|
|
139
|
+
for (const { handler } of collectCommandHooks(manifest.hooks, manifest.source)) {
|
|
140
|
+
if (typeof handler.commandWindows === "string" && handler.commandWindows.length > 0) continue;
|
|
141
|
+
missing.push(`${manifest.source}: ${handler.command}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// then
|
|
146
|
+
assert.deepEqual(missing, [], `Aggregate hook commands need commandWindows dispatchers:\n${missing.join("\n")}`);
|
|
147
|
+
});
|
|
148
|
+
|
|
130
149
|
test("#given the bootstrap component #when its SessionStart registration is inspected #then aggregate and component entries declare both platform commands", async () => {
|
|
131
150
|
// given
|
|
132
151
|
const aggregateHooks = (await readAggregateHookManifests()).find(({ source }) =>
|
|
@@ -156,6 +175,25 @@ test("#given the bootstrap component #when its SessionStart registration is insp
|
|
|
156
175
|
}
|
|
157
176
|
});
|
|
158
177
|
|
|
178
|
+
test("#given non-bootstrap aggregate hook manifests #when commandWindows entries are read #then they launch the managed Node dispatcher", async () => {
|
|
179
|
+
// given
|
|
180
|
+
const aggregateHooks = await readAggregateHookManifests();
|
|
181
|
+
|
|
182
|
+
// when
|
|
183
|
+
const offenders = [];
|
|
184
|
+
for (const manifest of aggregateHooks) {
|
|
185
|
+
for (const { handler } of collectCommandHooks(manifest.hooks, manifest.source)) {
|
|
186
|
+
if (handler.command === EXPECTED_BOOTSTRAP_COMMAND) continue;
|
|
187
|
+
if (typeof handler.commandWindows !== "string" || !handler.commandWindows.startsWith(EXPECTED_NODE_DISPATCH_PREFIX)) {
|
|
188
|
+
offenders.push(`${manifest.source}: ${handler.commandWindows ?? "<missing>"}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// then
|
|
194
|
+
assert.deepEqual(offenders, [], `Non-bootstrap aggregate hooks must use node-dispatch.ps1 on Windows:\n${offenders.join("\n")}`);
|
|
195
|
+
});
|
|
196
|
+
|
|
159
197
|
test("#given the built bootstrap bundle #when its module references are inspected #then it depends on Node built-ins only", async () => {
|
|
160
198
|
// given
|
|
161
199
|
const bundlePath = join(root, "components", "bootstrap", "dist", "cli.js");
|
|
@@ -68,6 +68,31 @@ test("#given bootstrap.ps1 #when environment writes are scanned #then no Machine
|
|
|
68
68
|
assert.deepEqual(offenders, [], "bootstrap.ps1 must only touch User-scope environment values (Machine scope needs elevation)");
|
|
69
69
|
});
|
|
70
70
|
|
|
71
|
+
test("#given bootstrap.ps1 #when dependency discovery misses #then it never invokes winget or mutates user PATH", async () => {
|
|
72
|
+
// given
|
|
73
|
+
const content = await readBootstrapScript();
|
|
74
|
+
|
|
75
|
+
// then
|
|
76
|
+
assert.doesNotMatch(content, /&\s*winget\s+install/i, "bootstrap.ps1 must not install system dependencies with winget");
|
|
77
|
+
assert.doesNotMatch(
|
|
78
|
+
content,
|
|
79
|
+
/SetEnvironmentVariable\("Path"/,
|
|
80
|
+
"bootstrap.ps1 must not mutate the user PATH when Codex Desktop misses PATH entries",
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test("#given bootstrap.ps1 #when resolving Node #then Codex NODE_REPL_NODE_PATH is checked before PATH", async () => {
|
|
85
|
+
// given
|
|
86
|
+
const content = await readBootstrapScript();
|
|
87
|
+
|
|
88
|
+
// then
|
|
89
|
+
assert.match(content, /NODE_REPL_NODE_PATH/, "bootstrap.ps1 must know how to read the Codex bundled Node setting");
|
|
90
|
+
assert(
|
|
91
|
+
content.indexOf("NODE_REPL_NODE_PATH") < content.indexOf("Get-Command node"),
|
|
92
|
+
"bootstrap.ps1 must prefer Codex bundled Node config before probing PATH",
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
|
|
71
96
|
test("#given bootstrap.ps1 #when execution policy mutations are scanned #then Set-ExecutionPolicy is never invoked", async () => {
|
|
72
97
|
// given
|
|
73
98
|
const content = await readBootstrapScript();
|
|
@@ -205,21 +205,15 @@ test("#given an unwritable config.toml #when the worker setup runs #then it degr
|
|
|
205
205
|
});
|
|
206
206
|
});
|
|
207
207
|
|
|
208
|
-
test("#given win32 without Git Bash
|
|
208
|
+
test("#given win32 without Git Bash #when the worker setup runs #then it degrades instead of throwing and disables the git_bash MCP", async () => {
|
|
209
209
|
await withSetupFixture(async (fixture) => {
|
|
210
|
-
const commands = [];
|
|
211
210
|
const outcome = await runWorkerSetup(
|
|
212
211
|
setupOptions(fixture, {
|
|
213
|
-
env: { OMO_CODEX_SKIP_GIT_BASH_AUTO_INSTALL: "1" },
|
|
214
212
|
platform: "win32",
|
|
215
213
|
resolveGitBash: () => ({ checkedPaths: [], found: false, installHint: "install git bash" }),
|
|
216
|
-
runCommand: async (command, args) => {
|
|
217
|
-
commands.push([command, ...args]);
|
|
218
|
-
},
|
|
219
214
|
}),
|
|
220
215
|
);
|
|
221
216
|
|
|
222
|
-
assert.deepEqual(commands, []);
|
|
223
217
|
const gitBashEntries = outcome.degraded.filter((entry) => entry.component === "git-bash");
|
|
224
218
|
assert.equal(gitBashEntries.length, 1);
|
|
225
219
|
const config = await readConfig(fixture);
|
|
@@ -7,13 +7,13 @@ import { fileURLToPath } from "node:url";
|
|
|
7
7
|
const root = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
8
8
|
|
|
9
9
|
const EXPECTED_COMPONENT_BINS = new Map([
|
|
10
|
-
["comment-checker", "omo-comment-checker"],
|
|
11
|
-
["lsp", "omo-lsp"],
|
|
12
|
-
["rules", "omo-rules"],
|
|
13
|
-
["start-work-continuation", "omo-start-work-continuation"],
|
|
14
|
-
["telemetry", "omo-telemetry"],
|
|
15
|
-
["ultrawork", "omo-ultrawork"],
|
|
16
|
-
["ulw-loop", "omo-ulw-loop"],
|
|
10
|
+
["comment-checker", ["omo-comment-checker"]],
|
|
11
|
+
["lsp", ["omo-lsp"]],
|
|
12
|
+
["rules", ["omo-rules"]],
|
|
13
|
+
["start-work-continuation", ["omo-start-work-continuation"]],
|
|
14
|
+
["telemetry", ["omo-telemetry"]],
|
|
15
|
+
["ultrawork", ["omo-ultrawork"]],
|
|
16
|
+
["ulw-loop", ["omo-ulw-loop", "ulw", "ulw-loop"]],
|
|
17
17
|
]);
|
|
18
18
|
|
|
19
19
|
const EXPECTED_USAGE_PREFIXES = new Map([
|
|
@@ -29,18 +29,19 @@ async function readJson(relativePath) {
|
|
|
29
29
|
return JSON.parse(await readFile(join(root, relativePath), "utf8"));
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
test("#given aggregate component package metadata #when bin names are inspected #then
|
|
32
|
+
test("#given aggregate component package metadata #when bin names are inspected #then component CLIs expose documented commands", async () => {
|
|
33
33
|
// given
|
|
34
34
|
const components = [...EXPECTED_COMPONENT_BINS.entries()];
|
|
35
35
|
|
|
36
36
|
// when
|
|
37
37
|
const mismatches = [];
|
|
38
|
-
for (const [component,
|
|
38
|
+
for (const [component, expectedNames] of components) {
|
|
39
39
|
const packageJson = await readJson(join("components", component, "package.json"));
|
|
40
40
|
const bin = packageJson.bin ?? {};
|
|
41
41
|
const binNames = Object.keys(bin).sort();
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
const missing = expectedNames.filter((expectedName) => bin[expectedName] !== "./dist/cli.js");
|
|
43
|
+
if (missing.length > 0 || binNames.some((name) => name.startsWith("codex-"))) {
|
|
44
|
+
mismatches.push({ component, missing, bin });
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
47
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
|
-
import { chmodSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { chmodSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { readFile } from "node:fs/promises";
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
@@ -125,6 +125,54 @@ test("#given representative component hook payloads #when executed through dist
|
|
|
125
125
|
}
|
|
126
126
|
});
|
|
127
127
|
|
|
128
|
+
test("#given bundled LSP hook CLI in installed layout #when diagnostics run #then it spawns sibling daemon target", () => {
|
|
129
|
+
const tempRoot = mkdtempSync(join(tmpdir(), "omo-codex-lsp-installed-"));
|
|
130
|
+
try {
|
|
131
|
+
const lspDist = join(tempRoot, "components", "lsp", "dist");
|
|
132
|
+
const daemonDist = join(tempRoot, "components", "lsp-daemon", "dist");
|
|
133
|
+
const daemonDir = join(tempRoot, "daemon");
|
|
134
|
+
const invocationLog = join(tempRoot, "fake-daemon-invocations.jsonl");
|
|
135
|
+
mkdirSync(lspDist, { recursive: true });
|
|
136
|
+
mkdirSync(daemonDist, { recursive: true });
|
|
137
|
+
mkdirSync(join(tempRoot, "src"), { recursive: true });
|
|
138
|
+
writeFileSync(join(tempRoot, "package.json"), JSON.stringify({ type: "module" }));
|
|
139
|
+
writeFileSync(join(lspDist, "cli.js"), readFileSync(componentCliPath("lsp"), "utf8"));
|
|
140
|
+
writeFileSync(join(daemonDist, "package.json"), JSON.stringify({ type: "module", version: "0.1.0" }));
|
|
141
|
+
writeFakeLspDaemonCli(join(daemonDist, "cli.js"));
|
|
142
|
+
const editedFile = join(tempRoot, "src", "broken.c");
|
|
143
|
+
writeFileSync(editedFile, "int main(void) { return missing_symbol; }\n");
|
|
144
|
+
|
|
145
|
+
const result = spawnSync(process.execPath, [join(lspDist, "cli.js"), "hook", "post-tool-use"], {
|
|
146
|
+
cwd: tempRoot,
|
|
147
|
+
encoding: "utf8",
|
|
148
|
+
env: hookEnv(tempRoot, {
|
|
149
|
+
CODEX_LSP_DAEMON_DIR: daemonDir,
|
|
150
|
+
FAKE_LSP_DAEMON_LOG: invocationLog,
|
|
151
|
+
}),
|
|
152
|
+
input: JSON.stringify({
|
|
153
|
+
session_id: "bundled-lsp-hook",
|
|
154
|
+
tool_name: "Edit",
|
|
155
|
+
tool_input: { file_path: editedFile },
|
|
156
|
+
tool_response: { ok: true },
|
|
157
|
+
}),
|
|
158
|
+
timeout: HOOK_CLI_TEST_TIMEOUT_MS,
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
const daemonInvocations = existsSync(invocationLog) ? readFileSync(invocationLog, "utf8") : "";
|
|
162
|
+
const failureContext = `stdout: ${result.stdout}\nstderr: ${result.stderr}\ndaemon log: ${daemonInvocations}`;
|
|
163
|
+
assert.equal(result.status, 0, failureContext);
|
|
164
|
+
assert.equal(result.stderr, "", failureContext);
|
|
165
|
+
assert.notEqual(result.stdout, "", failureContext);
|
|
166
|
+
const parsed = JSON.parse(result.stdout);
|
|
167
|
+
assert.equal(parsed.decision, "block");
|
|
168
|
+
assert.match(parsed.reason, /error\[fake\] \(1\) at 1:1: Missing fake symbol\./);
|
|
169
|
+
assert.deepEqual(daemonInvocations.trim().split("\n").map(JSON.parse), [["daemon"]]);
|
|
170
|
+
assert.equal(existsSync(join(daemonDir, "v0.1.0", "daemon.log")), true);
|
|
171
|
+
} finally {
|
|
172
|
+
rmSync(tempRoot, { recursive: true, force: true });
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
|
|
128
176
|
test("#given malformed comment-checker stdin #when executed through dist CLI contract #then it exits successfully without output", () => {
|
|
129
177
|
// given
|
|
130
178
|
const tempRoot = mkdtempSync(join(tmpdir(), "omo-codex-cli-malformed-"));
|
|
@@ -276,6 +324,56 @@ function smokeImportComponent(component, event) {
|
|
|
276
324
|
}
|
|
277
325
|
}
|
|
278
326
|
|
|
327
|
+
function writeFakeLspDaemonCli(path) {
|
|
328
|
+
writeFileSync(
|
|
329
|
+
path,
|
|
330
|
+
[
|
|
331
|
+
"#!/usr/bin/env node",
|
|
332
|
+
'import { createHash } from "node:crypto";',
|
|
333
|
+
'import { appendFileSync, mkdirSync, readdirSync, unlinkSync } from "node:fs";',
|
|
334
|
+
'import { tmpdir } from "node:os";',
|
|
335
|
+
'import { dirname, join } from "node:path";',
|
|
336
|
+
'import { createServer } from "node:net";',
|
|
337
|
+
"",
|
|
338
|
+
"appendFileSync(process.env.FAKE_LSP_DAEMON_LOG, `${JSON.stringify(process.argv.slice(2))}\\n`);",
|
|
339
|
+
"const baseDir = process.env.CODEX_LSP_DAEMON_DIR;",
|
|
340
|
+
'const versionDirName = readdirSync(baseDir).find((entry) => entry.startsWith("v")) ?? "v0";',
|
|
341
|
+
"const version = versionDirName.slice(1);",
|
|
342
|
+
"const dir = join(baseDir, versionDirName);",
|
|
343
|
+
'const naturalSocket = join(dir, "daemon.sock");',
|
|
344
|
+
'const digest = createHash("sha256").update(dir).digest("hex").slice(0, 16);',
|
|
345
|
+
"const socketPath = process.platform === \"win32\"",
|
|
346
|
+
"\t? `\\\\\\\\.\\\\pipe\\\\omo-lsp-${version}-${digest}`",
|
|
347
|
+
"\t: naturalSocket.length < 100 ? naturalSocket : join(tmpdir(), `omo-lsp-${version}-${digest}.sock`);",
|
|
348
|
+
"if (process.platform !== \"win32\") {",
|
|
349
|
+
"\tmkdirSync(dirname(socketPath), { recursive: true });",
|
|
350
|
+
"\ttry { unlinkSync(socketPath); } catch {}",
|
|
351
|
+
"}",
|
|
352
|
+
"const server = createServer((socket) => {",
|
|
353
|
+
'\tlet raw = "";',
|
|
354
|
+
'\tsocket.setEncoding("utf8");',
|
|
355
|
+
'\tsocket.on("data", (chunk) => {',
|
|
356
|
+
"\t\traw += chunk;",
|
|
357
|
+
'\t\tif (!raw.includes("\\n")) return;',
|
|
358
|
+
"\t\tconst request = JSON.parse(raw.trim());",
|
|
359
|
+
"\t\tconst response = {",
|
|
360
|
+
'\t\t\tjsonrpc: "2.0",',
|
|
361
|
+
"\t\t\tid: request.id,",
|
|
362
|
+
"\t\t\tresult: {",
|
|
363
|
+
'\t\t\t\tcontent: [{ type: "text", text: "error[fake] (1) at 1:1: Missing fake symbol." }],',
|
|
364
|
+
"\t\t\t},",
|
|
365
|
+
"\t\t};",
|
|
366
|
+
'\t\tsocket.end(`${JSON.stringify(response)}\\n`);',
|
|
367
|
+
"\t\tserver.close(() => process.exit(0));",
|
|
368
|
+
"\t});",
|
|
369
|
+
"});",
|
|
370
|
+
"server.listen(socketPath);",
|
|
371
|
+
"setTimeout(() => process.exit(1), 10000).unref();",
|
|
372
|
+
"",
|
|
373
|
+
].join("\n"),
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
|
|
279
377
|
function hookEnv(tempRoot, extraEnv = {}) {
|
|
280
378
|
return {
|
|
281
379
|
...process.env,
|
|
@@ -4,11 +4,16 @@ import { dirname, join } from "node:path";
|
|
|
4
4
|
import test from "node:test";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
|
|
7
|
-
const
|
|
7
|
+
const pluginRoot = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
8
|
+
const sharedSkillsRoot = join(pluginRoot, "..", "..", "shared-skills");
|
|
9
|
+
|
|
10
|
+
async function readSkill(name) {
|
|
11
|
+
return readFile(join(sharedSkillsRoot, "skills", name, "SKILL.md"), "utf8");
|
|
12
|
+
}
|
|
8
13
|
|
|
9
14
|
test("#given synced lcx-report-bug skill #when inspected #then it files LazyCodex bug issues with generated labels", async () => {
|
|
10
15
|
// given
|
|
11
|
-
const skillRoot = join(
|
|
16
|
+
const skillRoot = join(sharedSkillsRoot, "skills", "lcx-report-bug");
|
|
12
17
|
|
|
13
18
|
// when
|
|
14
19
|
const skill = await readFile(join(skillRoot, "SKILL.md"), "utf8");
|
|
@@ -20,14 +25,14 @@ test("#given synced lcx-report-bug skill #when inspected #then it files LazyCode
|
|
|
20
25
|
assert.match(skill, /gh pr create --repo openai\/codex/);
|
|
21
26
|
assert.doesNotMatch(skill, /gh pr create --repo "\$TARGET_REPO"/);
|
|
22
27
|
assert.doesNotMatch(skill, /gh pr create --repo code-yeongyu\/lazycodex/);
|
|
23
|
-
assert.match(interfaceMetadata, /display_name: "
|
|
28
|
+
assert.match(interfaceMetadata, /display_name: "lcx-report-bug \(omo\)"/);
|
|
24
29
|
assert.match(interfaceMetadata, /- "lazycodex bug"/);
|
|
25
30
|
assert.match(interfaceMetadata, /- "openai codex bug"/);
|
|
26
31
|
});
|
|
27
32
|
|
|
28
33
|
test("#given synced lcx-contribute-bug-fix skill #when inspected #then it delivers LazyCodex fixes as issues and upstream fixes as fork PRs", async () => {
|
|
29
34
|
// given
|
|
30
|
-
const skillRoot = join(
|
|
35
|
+
const skillRoot = join(sharedSkillsRoot, "skills", "lcx-contribute-bug-fix");
|
|
31
36
|
|
|
32
37
|
// when
|
|
33
38
|
const skill = await readFile(join(skillRoot, "SKILL.md"), "utf8");
|
|
@@ -40,14 +45,14 @@ test("#given synced lcx-contribute-bug-fix skill #when inspected #then it delive
|
|
|
40
45
|
assert.match(skill, /gh pr create --repo openai\/codex/);
|
|
41
46
|
assert.doesNotMatch(skill, /gh pr create --repo "\$TARGET_REPO"/);
|
|
42
47
|
assert.doesNotMatch(skill, /gh pr create --repo code-yeongyu\/lazycodex/);
|
|
43
|
-
assert.match(interfaceMetadata, /display_name: "
|
|
48
|
+
assert.match(interfaceMetadata, /display_name: "lcx-contribute-bug-fix \(omo\)"/);
|
|
44
49
|
assert.match(interfaceMetadata, /- "contribute a bug fix"/);
|
|
45
50
|
assert.match(interfaceMetadata, /- "fix bug pr"/);
|
|
46
51
|
});
|
|
47
52
|
|
|
48
|
-
test("#given synced lcx-doctor skill #when inspected #then it diagnoses installs against latest
|
|
53
|
+
test("#given synced lcx-doctor skill #when inspected #then it diagnoses installs against latest temp-root sources without mutating them", async () => {
|
|
49
54
|
// given
|
|
50
|
-
const skillRoot = join(
|
|
55
|
+
const skillRoot = join(sharedSkillsRoot, "skills", "lcx-doctor");
|
|
51
56
|
|
|
52
57
|
// when
|
|
53
58
|
const skill = await readFile(join(skillRoot, "SKILL.md"), "utf8");
|
|
@@ -55,7 +60,56 @@ test("#given synced lcx-doctor skill #when inspected #then it diagnoses installs
|
|
|
55
60
|
|
|
56
61
|
// then
|
|
57
62
|
assert.match(skill, /^---\r?\nname: lcx-doctor\r?\n/m);
|
|
58
|
-
assert.match(interfaceMetadata, /display_name: "\(
|
|
63
|
+
assert.match(interfaceMetadata, /display_name: "lcx-doctor \(omo\)"/);
|
|
59
64
|
assert.match(interfaceMetadata, /- "lazycodex doctor"/);
|
|
60
65
|
assert.match(interfaceMetadata, /- "lazycodex health check"/);
|
|
61
66
|
});
|
|
67
|
+
|
|
68
|
+
test("#given lcx source-sync skills #when inspected #then source caches are validated before reuse", async () => {
|
|
69
|
+
// given
|
|
70
|
+
const skillNames = ["lcx-doctor", "lcx-report-bug", "lcx-contribute-bug-fix"];
|
|
71
|
+
|
|
72
|
+
for (const skillName of skillNames) {
|
|
73
|
+
// when
|
|
74
|
+
const skill = await readSkill(skillName);
|
|
75
|
+
|
|
76
|
+
// then
|
|
77
|
+
assert.match(skill, /LAZYCODEX_SOURCE_ROOT="\$\{LAZYCODEX_SOURCE_ROOT:-\$\{TMPDIR:-\/tmp\}\/lazycodex-sources\}"/);
|
|
78
|
+
assert.match(skill, /git -C "\$DEST" rev-parse --is-inside-work-tree/);
|
|
79
|
+
assert.match(skill, /git -C "\$DEST" config --get remote\.origin\.url/);
|
|
80
|
+
assert.match(skill, /DEST\.corrupt\.\$\(date \+%Y%m%d%H%M%S\)/);
|
|
81
|
+
assert.doesNotMatch(skill, /if \[ ! -d "\$DEST\/\.git" \]; then/);
|
|
82
|
+
assert.doesNotMatch(skill, /sync_latest_source code-yeongyu\/lazycodex \/tmp\/lazycodex-source/);
|
|
83
|
+
assert.doesNotMatch(skill, /sync_latest_source openai\/codex \/tmp\/openai-codex-source/);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test("#given lcx-doctor skill #when inspected #then aggregate hook validation follows the current manifest", async () => {
|
|
88
|
+
// given
|
|
89
|
+
const skill = await readSkill("lcx-doctor");
|
|
90
|
+
|
|
91
|
+
// then
|
|
92
|
+
assert.match(skill, /\.codex-plugin\/plugin\.json/);
|
|
93
|
+
assert.match(skill, /manifest declares a `hooks` array/);
|
|
94
|
+
assert.match(skill, /validate every direct hook path declared by the manifest/);
|
|
95
|
+
assert.match(skill, /`hooks\/hooks\.json` only when the manifest declares it/);
|
|
96
|
+
assert.match(skill, /do not require retired paths such as `components\/workflow-selector`/);
|
|
97
|
+
assert.match(skill, /`hooks\/user-prompt-submit-selecting-lazycodex-workflow\.json` unless the current manifest declares them/);
|
|
98
|
+
assert.doesNotMatch(skill, /Plugin payload present and non-empty: `hooks\/hooks\.json`/);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("#given lcx-doctor skill #when inspected #then runtime probes and materialized payloads distinguish expected rewrites from missing files", async () => {
|
|
102
|
+
// given
|
|
103
|
+
const skill = await readSkill("lcx-doctor");
|
|
104
|
+
|
|
105
|
+
// then
|
|
106
|
+
assert.match(skill, /manifest-declared runtime payload/);
|
|
107
|
+
assert.match(skill, /`dist\/cli\/index\.js` and `dist\/cli-node\/index\.js`/);
|
|
108
|
+
assert.match(skill, /install-time materialization rewrites as expected/);
|
|
109
|
+
assert.match(skill, /absolute `\.mcp\.json` runtime paths/);
|
|
110
|
+
assert.match(skill, /Missing or zero-byte rewritten targets are FAIL/);
|
|
111
|
+
assert.match(skill, /Use the configured Codex default model/);
|
|
112
|
+
assert.match(skill, /unless the user explicitly passed a model override/);
|
|
113
|
+
assert.match(skill, /never force a guessed\/rejected model such as `gpt-5\.5-codex-mini`/);
|
|
114
|
+
assert.doesNotMatch(skill, /--model gpt-5\.5-codex-mini/);
|
|
115
|
+
});
|