oh-my-opencode 4.19.4 → 5.0.0-beta.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/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +6 -5
- package/README.ru.md +1 -1
- package/README.zh-cn.md +1 -1
- package/bin/oh-my-opencode.js +14 -1
- package/bin/oh-my-opencode.test.ts +21 -0
- package/dist/cli/index.js +1452 -703
- package/dist/cli-node/index.js +1452 -703
- package/dist/config/schema/agent-overrides.d.ts +528 -0
- package/dist/config/schema/oh-my-opencode-config.d.ts +495 -0
- package/dist/features/monitor/batcher.d.ts +3 -1
- package/dist/features/monitor/manager-internals.d.ts +1 -0
- package/dist/features/monitor/output-injector-types.d.ts +2 -0
- package/dist/features/monitor/output-injector.d.ts +6 -0
- package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
- package/dist/hooks/todo-continuation-enforcer/unrecoverable-request-error.d.ts +9 -0
- package/dist/hooks/tool-pair-validator/hook.test-support.d.ts +29 -0
- package/dist/hooks/tool-pair-validator/tool-part-ids.d.ts +14 -5
- package/dist/hooks/tool-pair-validator/tool-result-repair.d.ts +4 -3
- package/dist/hooks/tool-pair-validator/types.d.ts +5 -22
- package/dist/index.js +2776 -2240
- package/dist/mcp/lsp.d.ts +1 -0
- package/dist/oh-my-opencode.schema.json +1466 -131
- package/dist/shared/tmux/constants.d.ts +1 -1
- package/dist/skills/ast-grep/SOURCE +1 -1
- package/dist/skills/ast-grep/install.ps1 +2 -2
- package/dist/skills/ast-grep/install.sh +1 -1
- package/dist/skills/ast-grep/references/install.md +2 -2
- package/dist/skills/ast-grep/tests/smoke.sh +1 -1
- package/dist/skills/start-work/SKILL.md +54 -9
- package/dist/skills/ultimate-browsing/SKILL.md +2 -2
- package/dist/skills/ultimate-browsing/engine/__main__.py +8 -1
- package/dist/skills/ultimate-browsing/engine/bias_check.py +11 -0
- package/dist/skills/ultimate-browsing/engine/fetch_chain.py +90 -52
- package/dist/skills/ultimate-browsing/engine/result_schema.py +10 -1
- package/dist/skills/ultimate-browsing/engine/surrogate.py +214 -0
- package/dist/skills/ultimate-browsing/engine/surrogates.yaml +60 -0
- package/dist/skills/ultimate-browsing/engine/tests/fixtures/amp_redirect_stub.html +7 -0
- package/dist/skills/ultimate-browsing/engine/tests/fixtures/search_interstitial.html +19 -0
- package/dist/skills/ultimate-browsing/engine/tests/fixtures/wayback_available.json +1 -0
- package/dist/skills/ultimate-browsing/engine/tests/fixtures/wayback_snapshot.html +1128 -0
- package/dist/skills/ultimate-browsing/engine/tests/test_surrogate.py +252 -0
- package/dist/skills/ultimate-browsing/engine/tests/test_surrogate_validators.py +78 -0
- package/dist/skills/ultimate-browsing/engine/validators.py +46 -0
- package/dist/skills/ultimate-browsing/engine/waf_detector.py +1 -1
- package/dist/skills/ultimate-browsing/engine/waf_profiles.yaml +10 -5
- package/dist/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/dist/skills/ultimate-browsing/references/insane-search/README.md +4 -4
- package/dist/skills/ultimate-browsing/references/insane-search/cache-archive.md +51 -50
- package/dist/skills/ultimate-browsing/references/insane-search/fallback.md +1 -1
- package/dist/skills/ultimate-browsing/references/insane-search/jina.md +8 -2
- package/dist/skills/ultimate-browsing/references/insane-search/naver.md +1 -1
- package/dist/skills/ultimate-browsing/references/insane-search/twitter.md +3 -3
- package/dist/skills/ulw-plan/SKILL.md +1 -1
- package/dist/skills/ulw-plan/references/full-workflow.md +3 -3
- package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
- package/dist/skills/ulw-research/SKILL.md +15 -10
- package/dist/tui.js +307 -28
- package/docs/reference/web-terminal-visual-qa.md +1 -1
- package/package.json +27 -19
- package/packages/lsp-core/src/lsp/connection.ts +1 -1
- package/packages/lsp-daemon/dist/cli.js +27 -13
- package/packages/lsp-daemon/dist/client.js +49 -35
- package/packages/lsp-daemon/dist/ensure-daemon.d.ts +1 -0
- package/packages/lsp-daemon/dist/ensure-daemon.js +18 -5
- package/packages/lsp-daemon/dist/index.js +34 -20
- package/packages/lsp-tools-mcp/dist/cli.js +1 -1
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +1 -1
- package/packages/lsp-tools-mcp/dist/mcp.js +1 -1
- package/packages/lsp-tools-mcp/dist/tools.js +1 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +268 -92
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +7 -7
- package/packages/omo-codex/plugin/components/bootstrap/src/worker.ts +3 -0
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +106 -6
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +106 -6
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +56 -42
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +1 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/README.md +5 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +2 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +18 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +21 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +105 -0
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/CHANGELOG.md +2 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +3 -2
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +3 -2
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +3 -3
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +11 -11
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +9 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +66 -66
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +22 -25
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +9 -9
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-helpers.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-kind-guidance.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +4 -4
- package/packages/omo-codex/plugin/skills/ast-grep/SOURCE +1 -1
- package/packages/omo-codex/plugin/skills/ast-grep/install.ps1 +2 -2
- package/packages/omo-codex/plugin/skills/ast-grep/install.sh +1 -1
- package/packages/omo-codex/plugin/skills/ast-grep/references/install.md +2 -2
- package/packages/omo-codex/plugin/skills/ast-grep/tests/smoke.sh +1 -1
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +54 -9
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__main__.py +8 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/bias_check.py +11 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/fetch_chain.py +90 -52
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/result_schema.py +10 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/surrogate.py +214 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/surrogates.yaml +60 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/amp_redirect_stub.html +7 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/search_interstitial.html +19 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/wayback_available.json +1 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/wayback_snapshot.html +1128 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_surrogate.py +252 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_surrogate_validators.py +78 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/validators.py +46 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_detector.py +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_profiles.yaml +10 -5
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +4 -4
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/cache-archive.md +51 -50
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/fallback.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/jina.md +8 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/naver.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/twitter.md +3 -3
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -3
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +22 -25
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +3 -3
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +15 -10
- package/packages/omo-codex/plugin/test/bootstrap-binlinks.test.mjs +12 -12
- package/packages/omo-codex/plugin/test/bootstrap-orchestration.test.mjs +36 -4
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +4 -4
- package/packages/omo-codex/scripts/install-bin-links.test.mjs +56 -2
- package/packages/omo-codex/scripts/install-delegated-command.test.mjs +6 -6
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +115 -61
- package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +4 -4
- package/packages/omo-codex/scripts/install-local.test.mjs +5 -2
- package/packages/shared-skills/index.mjs +19 -1
- package/packages/shared-skills/skills/ast-grep/SOURCE +1 -1
- package/packages/shared-skills/skills/ast-grep/install.ps1 +2 -2
- package/packages/shared-skills/skills/ast-grep/install.sh +1 -1
- package/packages/shared-skills/skills/ast-grep/references/install.md +2 -2
- package/packages/shared-skills/skills/ast-grep/tests/smoke.sh +1 -1
- package/packages/shared-skills/skills/start-work/SKILL.md +54 -9
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +2 -2
- package/packages/shared-skills/skills/ultimate-browsing/engine/__main__.py +8 -1
- package/packages/shared-skills/skills/ultimate-browsing/engine/bias_check.py +11 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/fetch_chain.py +90 -52
- package/packages/shared-skills/skills/ultimate-browsing/engine/result_schema.py +10 -1
- package/packages/shared-skills/skills/ultimate-browsing/engine/surrogate.py +214 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/surrogates.yaml +60 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/fixtures/amp_redirect_stub.html +7 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/fixtures/search_interstitial.html +19 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/fixtures/wayback_available.json +1 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/fixtures/wayback_snapshot.html +1128 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_surrogate.py +252 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_surrogate_validators.py +78 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/validators.py +46 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/waf_detector.py +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/engine/waf_profiles.yaml +10 -5
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +4 -4
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/cache-archive.md +51 -50
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/fallback.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/jina.md +8 -2
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/naver.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/twitter.md +3 -3
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +1 -1
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +3 -3
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
- package/packages/shared-skills/skills/ulw-research/SKILL.md +15 -10
- package/postinstall.mjs +6 -0
|
@@ -439,7 +439,7 @@ async function readOptionalFile(path) {
|
|
|
439
439
|
|
|
440
440
|
// components/bootstrap/src/worker.ts
|
|
441
441
|
import { appendFile as appendFile2, mkdir as mkdir8, readFile as readFile14 } from "node:fs/promises";
|
|
442
|
-
import { homedir as
|
|
442
|
+
import { homedir as homedir5 } from "node:os";
|
|
443
443
|
import { dirname as dirname9, join as join22, resolve as resolve7 } from "node:path";
|
|
444
444
|
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
445
445
|
|
|
@@ -449,6 +449,10 @@ import { rm as rm4 } from "node:fs/promises";
|
|
|
449
449
|
import { dirname as dirname4, join as join7 } from "node:path";
|
|
450
450
|
import { promisify } from "node:util";
|
|
451
451
|
|
|
452
|
+
// ../../utils/src/ast-grep/sg-candidates.ts
|
|
453
|
+
import { homedir as homedir3 } from "node:os";
|
|
454
|
+
import { join as join4 } from "node:path";
|
|
455
|
+
|
|
452
456
|
// ../../utils/src/ast-grep/sg-manifest.ts
|
|
453
457
|
var SG_PINNED_VERSION = "0.43.0";
|
|
454
458
|
var SG_RELEASE_ASSETS = {
|
|
@@ -494,10 +498,113 @@ function sgBinaryName(platform = process.platform) {
|
|
|
494
498
|
return normalizeRuntimePlatform(platform) === "win32" ? "sg.exe" : "sg";
|
|
495
499
|
}
|
|
496
500
|
|
|
501
|
+
// ../../utils/src/ast-grep/install-script.ts
|
|
502
|
+
var AST_GREP_BIN_DIR_ENV_KEY = "OMO_AST_GREP_BIN_DIR";
|
|
503
|
+
|
|
504
|
+
// ../../utils/src/ast-grep/types.ts
|
|
505
|
+
var SG_PATH_ENV_KEY = "OMO_AST_GREP_SG_PATH";
|
|
506
|
+
var SG_BINARY_NOT_FOUND = "BINARY_NOT_FOUND";
|
|
507
|
+
|
|
508
|
+
// ../../utils/src/ast-grep/sg-candidates.ts
|
|
509
|
+
var HOMEBREW_PREFIXES = {
|
|
510
|
+
darwin: ["/opt/homebrew/bin", "/usr/local/bin"],
|
|
511
|
+
linux: ["/home/linuxbrew/.linuxbrew/bin", "/usr/local/bin"],
|
|
512
|
+
win32: []
|
|
513
|
+
};
|
|
514
|
+
function nonEmptyValue(value) {
|
|
515
|
+
const trimmed = value?.trim();
|
|
516
|
+
return trimmed === undefined || trimmed.length === 0 ? null : trimmed;
|
|
517
|
+
}
|
|
518
|
+
function astGrepBinaryName(platform) {
|
|
519
|
+
return platform === "win32" ? "ast-grep.exe" : "ast-grep";
|
|
520
|
+
}
|
|
521
|
+
function candidate(tier, path) {
|
|
522
|
+
return { path, tier };
|
|
523
|
+
}
|
|
524
|
+
function envOverrideCandidates(env) {
|
|
525
|
+
const override = nonEmptyValue(env[SG_PATH_ENV_KEY]);
|
|
526
|
+
return override === null ? [] : [candidate("env-override", override)];
|
|
527
|
+
}
|
|
528
|
+
function omoRuntimeCandidates(options) {
|
|
529
|
+
const binaryName = sgBinaryName(options.platform);
|
|
530
|
+
const slug = runtimeSlug(options.platform, options.arch);
|
|
531
|
+
const paths = [];
|
|
532
|
+
if (options.runtimeDir !== undefined)
|
|
533
|
+
paths.push(join4(options.runtimeDir, binaryName));
|
|
534
|
+
const codexHome = nonEmptyValue(options.env["CODEX_HOME"]);
|
|
535
|
+
if (codexHome !== null)
|
|
536
|
+
paths.push(join4(codexHome, "runtime", "ast-grep", slug, binaryName));
|
|
537
|
+
paths.push(join4(options.homeDir, ".omo", "runtime", "ast-grep", slug, binaryName));
|
|
538
|
+
return paths.map((path) => candidate("omo-runtime", path));
|
|
539
|
+
}
|
|
540
|
+
function skillBinCandidates(options) {
|
|
541
|
+
const names = [astGrepBinaryName(options.platform), sgBinaryName(options.platform)];
|
|
542
|
+
const directories = [];
|
|
543
|
+
const cacheDir = nonEmptyValue(options.env[AST_GREP_BIN_DIR_ENV_KEY]);
|
|
544
|
+
if (cacheDir !== null)
|
|
545
|
+
directories.push(cacheDir);
|
|
546
|
+
if (options.packageDir !== undefined)
|
|
547
|
+
directories.push(join4(options.packageDir, "bin"));
|
|
548
|
+
return directories.flatMap((directory) => names.map((name) => candidate("skill-bin", join4(directory, name))));
|
|
549
|
+
}
|
|
550
|
+
function homebrewCandidates(platform) {
|
|
551
|
+
const prefixes = platform === "darwin" || platform === "linux" || platform === "win32" ? HOMEBREW_PREFIXES[platform] : [];
|
|
552
|
+
const names = [astGrepBinaryName(platform), sgBinaryName(platform)];
|
|
553
|
+
return prefixes.flatMap((prefix) => names.map((name) => candidate("homebrew", join4(prefix, name))));
|
|
554
|
+
}
|
|
555
|
+
function planSgCandidates(options) {
|
|
556
|
+
const env = options.env ?? process.env;
|
|
557
|
+
const platform = options.platform ?? process.platform;
|
|
558
|
+
const arch = options.arch ?? process.arch;
|
|
559
|
+
const homeDir = options.homeDir ?? homedir3();
|
|
560
|
+
return {
|
|
561
|
+
afterPath: homebrewCandidates(platform),
|
|
562
|
+
beforePath: [
|
|
563
|
+
...envOverrideCandidates(env),
|
|
564
|
+
...omoRuntimeCandidates({ arch, env, homeDir, platform, runtimeDir: options.runtimeDir }),
|
|
565
|
+
...skillBinCandidates({ env, packageDir: options.packageDir, platform })
|
|
566
|
+
],
|
|
567
|
+
pathCommands: ["ast-grep", "sg"]
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
// ../../utils/src/ast-grep/sg-install-hints.ts
|
|
572
|
+
var OMO_PROVISION_HINT = "Start an OMO session so the bundled ast-grep skill provisions the pinned runtime automatically";
|
|
573
|
+
var ENV_OVERRIDE_HINT = `Or point ${SG_PATH_ENV_KEY} at an existing ast-grep binary`;
|
|
574
|
+
var DARWIN_HINTS = [
|
|
575
|
+
"brew install ast-grep",
|
|
576
|
+
"npm install -g @ast-grep/cli",
|
|
577
|
+
"cargo install ast-grep --locked"
|
|
578
|
+
];
|
|
579
|
+
var LINUX_HINTS = [
|
|
580
|
+
"npm install -g @ast-grep/cli",
|
|
581
|
+
"cargo install ast-grep --locked",
|
|
582
|
+
"brew install ast-grep # linuxbrew"
|
|
583
|
+
];
|
|
584
|
+
var WIN32_HINTS = [
|
|
585
|
+
"scoop install main/ast-grep",
|
|
586
|
+
"winget install ast-grep",
|
|
587
|
+
"choco install ast-grep",
|
|
588
|
+
"npm install -g @ast-grep/cli"
|
|
589
|
+
];
|
|
590
|
+
function platformHints(platform) {
|
|
591
|
+
if (platform === "darwin")
|
|
592
|
+
return DARWIN_HINTS;
|
|
593
|
+
if (platform === "win32")
|
|
594
|
+
return WIN32_HINTS;
|
|
595
|
+
return LINUX_HINTS;
|
|
596
|
+
}
|
|
597
|
+
function sgInstallHints(platform = process.platform) {
|
|
598
|
+
return [...platformHints(platform), OMO_PROVISION_HINT, ENV_OVERRIDE_HINT];
|
|
599
|
+
}
|
|
600
|
+
function sgBinaryNotFoundMessage(platform = process.platform) {
|
|
601
|
+
return `ast-grep binary not found for ${platform}: no candidate passed the --version probe across the env override, OMO runtime, skill bin cache, PATH, or Homebrew prefixes.`;
|
|
602
|
+
}
|
|
603
|
+
|
|
497
604
|
// ../../utils/src/ast-grep/sg-provisioner.ts
|
|
498
605
|
import { createHash as createHash2, randomUUID as randomUUID2 } from "node:crypto";
|
|
499
606
|
import { chmod, mkdir as mkdir3, rename as rename2, rm as rm3, writeFile as writeFile2 } from "node:fs/promises";
|
|
500
|
-
import { basename as basename2, isAbsolute, join as
|
|
607
|
+
import { basename as basename2, isAbsolute, join as join5, relative, resolve as resolve2 } from "node:path";
|
|
501
608
|
import { inflateRawSync } from "node:zlib";
|
|
502
609
|
var DEFAULT_DOWNLOAD_TIMEOUT_MS = 60000;
|
|
503
610
|
var EOCD_SIGNATURE = 101010256;
|
|
@@ -603,7 +710,7 @@ function extractStandaloneSgBinary(zip, platform) {
|
|
|
603
710
|
const entries = listZipEntries(zip);
|
|
604
711
|
const preferredNames = [`ast-grep${suffix}`, `sg${suffix}`];
|
|
605
712
|
for (const preferred of preferredNames) {
|
|
606
|
-
const entry = entries.find((
|
|
713
|
+
const entry = entries.find((candidate2) => zipEntryBaseName(candidate2.name) === preferred);
|
|
607
714
|
if (entry !== undefined)
|
|
608
715
|
return readZipEntryBytes(zip, entry);
|
|
609
716
|
}
|
|
@@ -623,8 +730,8 @@ async function provisionSgBinary(options) {
|
|
|
623
730
|
throw new SgProvisionError("unsupported_platform", `ast-grep ${SG_PINNED_VERSION} has no asset for ${slug}`);
|
|
624
731
|
}
|
|
625
732
|
const targetDir = resolve2(options.targetDir);
|
|
626
|
-
const destination =
|
|
627
|
-
const tempPath =
|
|
733
|
+
const destination = join5(targetDir, sgBinaryName(platform));
|
|
734
|
+
const tempPath = join5(targetDir, `.sg-${randomUUID2().slice(0, 8)}.partial`);
|
|
628
735
|
assertInsideTarget(targetDir, destination);
|
|
629
736
|
assertInsideTarget(targetDir, tempPath);
|
|
630
737
|
try {
|
|
@@ -649,11 +756,10 @@ async function provisionSgBinary(options) {
|
|
|
649
756
|
// ../../utils/src/ast-grep/sg-resolver.ts
|
|
650
757
|
import { execFileSync } from "node:child_process";
|
|
651
758
|
import { existsSync, statSync } from "node:fs";
|
|
652
|
-
import { join as join6 } from "node:path";
|
|
653
759
|
|
|
654
760
|
// ../../utils/src/runtime/which.ts
|
|
655
761
|
import { accessSync, constants } from "node:fs";
|
|
656
|
-
import { delimiter, join as
|
|
762
|
+
import { delimiter, join as join6 } from "node:path";
|
|
657
763
|
var runtime = globalThis;
|
|
658
764
|
function isUnsafeCommandName(commandName) {
|
|
659
765
|
if (commandName.includes("/") || commandName.includes("\\"))
|
|
@@ -708,7 +814,7 @@ function bunWhich(commandName) {
|
|
|
708
814
|
return null;
|
|
709
815
|
for (const pathEntry of pathEntries) {
|
|
710
816
|
for (const candidateName of candidateNames) {
|
|
711
|
-
const candidatePath =
|
|
817
|
+
const candidatePath = join6(pathEntry, candidateName);
|
|
712
818
|
if (isExecutable(candidatePath))
|
|
713
819
|
return candidatePath;
|
|
714
820
|
}
|
|
@@ -716,13 +822,15 @@ function bunWhich(commandName) {
|
|
|
716
822
|
return null;
|
|
717
823
|
}
|
|
718
824
|
|
|
719
|
-
// ../../utils/src/ast-grep/types.ts
|
|
720
|
-
var SG_PATH_ENV_KEY = "OMO_AST_GREP_SG_PATH";
|
|
721
|
-
|
|
722
825
|
// ../../utils/src/ast-grep/sg-resolver.ts
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
826
|
+
var SG_VERSION_PROBE_TIMEOUT_MS = 5000;
|
|
827
|
+
var cacheEntry = null;
|
|
828
|
+
function cacheFingerprint(options, plan) {
|
|
829
|
+
return JSON.stringify([
|
|
830
|
+
options.platform ?? process.platform,
|
|
831
|
+
options.arch ?? process.arch,
|
|
832
|
+
plan.beforePath.map((candidate2) => candidate2.path)
|
|
833
|
+
]);
|
|
726
834
|
}
|
|
727
835
|
function defaultFileExists(filePath) {
|
|
728
836
|
if (!existsSync(filePath))
|
|
@@ -730,9 +838,7 @@ function defaultFileExists(filePath) {
|
|
|
730
838
|
try {
|
|
731
839
|
const stats = statSync(filePath);
|
|
732
840
|
return stats.isFile() && stats.size > 0;
|
|
733
|
-
} catch
|
|
734
|
-
if (error instanceof Error)
|
|
735
|
-
return false;
|
|
841
|
+
} catch {
|
|
736
842
|
return false;
|
|
737
843
|
}
|
|
738
844
|
}
|
|
@@ -740,53 +846,79 @@ function defaultVersionProbe(binaryPath) {
|
|
|
740
846
|
return String(execFileSync(binaryPath, ["--version"], {
|
|
741
847
|
encoding: "utf8",
|
|
742
848
|
stdio: ["ignore", "pipe", "ignore"],
|
|
743
|
-
timeout:
|
|
849
|
+
timeout: SG_VERSION_PROBE_TIMEOUT_MS
|
|
744
850
|
}));
|
|
745
851
|
}
|
|
746
|
-
function
|
|
747
|
-
return output.toLowerCase().includes("ast-grep");
|
|
748
|
-
}
|
|
749
|
-
function hasAstGrepVersion(binaryPath, runVersionProbeSync) {
|
|
852
|
+
function probePasses(binaryPath, deps) {
|
|
750
853
|
try {
|
|
751
|
-
return
|
|
752
|
-
} catch
|
|
753
|
-
if (error instanceof Error)
|
|
754
|
-
return false;
|
|
854
|
+
return deps.runVersionProbeSync(binaryPath).toLowerCase().includes("ast-grep");
|
|
855
|
+
} catch {
|
|
755
856
|
return false;
|
|
756
857
|
}
|
|
757
858
|
}
|
|
758
|
-
function
|
|
759
|
-
return
|
|
859
|
+
function acceptsCandidate(binaryPath, deps) {
|
|
860
|
+
return deps.fileExists(binaryPath) && probePasses(binaryPath, deps);
|
|
760
861
|
}
|
|
761
|
-
function
|
|
762
|
-
const
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
862
|
+
function firstAccepted(candidates, deps) {
|
|
863
|
+
for (const candidate2 of candidates) {
|
|
864
|
+
if (acceptsCandidate(candidate2.path, deps))
|
|
865
|
+
return { found: true, path: candidate2.path, tier: candidate2.tier };
|
|
866
|
+
}
|
|
867
|
+
return null;
|
|
868
|
+
}
|
|
869
|
+
function pathCandidates(commands, deps) {
|
|
870
|
+
const resolved = [];
|
|
871
|
+
for (const commandName of commands) {
|
|
872
|
+
const found = deps.which(commandName);
|
|
873
|
+
if (found !== null)
|
|
874
|
+
resolved.push({ path: found, tier: "path" });
|
|
875
|
+
}
|
|
876
|
+
return resolved;
|
|
877
|
+
}
|
|
878
|
+
function notFound(platform) {
|
|
879
|
+
return {
|
|
880
|
+
error: { code: SG_BINARY_NOT_FOUND, hints: sgInstallHints(platform), message: sgBinaryNotFoundMessage(platform) },
|
|
881
|
+
found: false
|
|
882
|
+
};
|
|
883
|
+
}
|
|
884
|
+
function cacheIsStillValid(resolution, deps, revalidate) {
|
|
885
|
+
if (!resolution.found)
|
|
886
|
+
return false;
|
|
887
|
+
if (!deps.fileExists(resolution.path))
|
|
888
|
+
return false;
|
|
889
|
+
return !revalidate || probePasses(resolution.path, deps);
|
|
890
|
+
}
|
|
891
|
+
function resolverDeps(options) {
|
|
892
|
+
return {
|
|
893
|
+
fileExists: options.fileExists ?? defaultFileExists,
|
|
894
|
+
platform: options.platform ?? process.platform,
|
|
895
|
+
runVersionProbeSync: options.runVersionProbeSync ?? defaultVersionProbe,
|
|
896
|
+
which: options.which ?? bunWhich
|
|
897
|
+
};
|
|
898
|
+
}
|
|
899
|
+
function resolveSgBinarySync(options = {}) {
|
|
900
|
+
const deps = resolverDeps(options);
|
|
901
|
+
const useCache = options.cache ?? true;
|
|
767
902
|
try {
|
|
768
|
-
const
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
return runtimeCandidate;
|
|
775
|
-
}
|
|
776
|
-
for (const commandName of pathCommandCandidates()) {
|
|
777
|
-
const pathCandidate = which(commandName);
|
|
778
|
-
if (pathCandidate === null || !fileExists(pathCandidate))
|
|
779
|
-
continue;
|
|
780
|
-
if (commandName !== "sg" || hasAstGrepVersion(pathCandidate, runVersionProbeSync))
|
|
781
|
-
return pathCandidate;
|
|
903
|
+
const plan = planSgCandidates(options);
|
|
904
|
+
const fingerprint = cacheFingerprint(options, plan);
|
|
905
|
+
if (useCache && cacheEntry !== null && cacheEntry.fingerprint === fingerprint) {
|
|
906
|
+
if (cacheIsStillValid(cacheEntry.resolution, deps, options.revalidate ?? false))
|
|
907
|
+
return cacheEntry.resolution;
|
|
908
|
+
cacheEntry = null;
|
|
782
909
|
}
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
910
|
+
const resolution = firstAccepted(plan.beforePath, deps) ?? firstAccepted(pathCandidates(plan.pathCommands, deps), deps) ?? firstAccepted(plan.afterPath, deps) ?? notFound(deps.platform);
|
|
911
|
+
if (useCache && resolution.found)
|
|
912
|
+
cacheEntry = { fingerprint, resolution };
|
|
913
|
+
return resolution;
|
|
914
|
+
} catch {
|
|
915
|
+
return notFound(deps.platform);
|
|
788
916
|
}
|
|
789
917
|
}
|
|
918
|
+
function findSgBinarySync(options = {}) {
|
|
919
|
+
const resolution = resolveSgBinarySync(options);
|
|
920
|
+
return resolution.found ? resolution.path : null;
|
|
921
|
+
}
|
|
790
922
|
|
|
791
923
|
// components/bootstrap/src/provision.ts
|
|
792
924
|
var SG_PROVISION_COMPONENT = "ast_grep";
|
|
@@ -1161,8 +1293,8 @@ function findUnquotedCharacter(line, target, startIndex) {
|
|
|
1161
1293
|
}
|
|
1162
1294
|
return -1;
|
|
1163
1295
|
}
|
|
1164
|
-
function tomlPathMatches(
|
|
1165
|
-
return
|
|
1296
|
+
function tomlPathMatches(candidate2, target) {
|
|
1297
|
+
return candidate2.length === target.length && candidate2.every((part, index) => part === target[index]);
|
|
1166
1298
|
}
|
|
1167
1299
|
function replaceTomlAssignmentValue(line, assignmentIndex, value) {
|
|
1168
1300
|
const newline = line.endsWith(`
|
|
@@ -2027,6 +2159,7 @@ var LEGACY_CODEX_COMPONENT_BINS = [
|
|
|
2027
2159
|
{ name: "codex-telemetry", component: "telemetry" },
|
|
2028
2160
|
{ name: "codex-ultrawork", component: "ultrawork" }
|
|
2029
2161
|
];
|
|
2162
|
+
var LEGACY_CODEX_COMPONENT_BIN_NAMES = LEGACY_CODEX_COMPONENT_BINS.map((entry) => entry.name);
|
|
2030
2163
|
async function removeLegacyCodexComponentBins(binDir, platform) {
|
|
2031
2164
|
for (const entry of LEGACY_CODEX_COMPONENT_BINS) {
|
|
2032
2165
|
const linkPath = join12(binDir, platform === "win32" ? `${entry.name}.cmd` : entry.name);
|
|
@@ -2082,7 +2215,7 @@ function isNodeErrorWithCode2(error) {
|
|
|
2082
2215
|
// ../src/install/codex-cache-runtime-wrapper.ts
|
|
2083
2216
|
import { join as join13 } from "node:path";
|
|
2084
2217
|
var RUNTIME_WRAPPER_MARKER = "OMO_GENERATED_RUNTIME_WRAPPER";
|
|
2085
|
-
function posixRuntimeWrapper(cliPath, codexHome, binDir, nodeCliPath) {
|
|
2218
|
+
function posixRuntimeWrapper(binName, cliPath, codexHome, binDir, nodeCliPath) {
|
|
2086
2219
|
const ulwLoopBin = toPosixPath(join13(binDir, "omo-ulw-loop"));
|
|
2087
2220
|
const nodeCli = escapePosixDoubleQuoted(toPosixPath(nodeCliPath));
|
|
2088
2221
|
const escapedCliPath = escapePosixDoubleQuoted(toPosixPath(cliPath));
|
|
@@ -2092,6 +2225,8 @@ function posixRuntimeWrapper(cliPath, codexHome, binDir, nodeCliPath) {
|
|
|
2092
2225
|
"#!/bin/sh",
|
|
2093
2226
|
`# ${RUNTIME_WRAPPER_MARKER}`,
|
|
2094
2227
|
`export CODEX_HOME="\${CODEX_HOME:-${escapedCodexHome}}"`,
|
|
2228
|
+
`export OMO_INVOCATION_NAME=${binName}`,
|
|
2229
|
+
"export OMO_EDITION=codex",
|
|
2095
2230
|
'if [ "$1" = "ulw-loop" ] && [ -x "' + escapedUlwLoopBin + '" ]; then',
|
|
2096
2231
|
" shift",
|
|
2097
2232
|
' exec "' + escapedUlwLoopBin + '" ulw-loop "$@"',
|
|
@@ -2115,11 +2250,11 @@ function posixRuntimeWrapper(cliPath, codexHome, binDir, nodeCliPath) {
|
|
|
2115
2250
|
` if [ -f "${nodeCli}" ] && command -v node >/dev/null 2>&1; then`,
|
|
2116
2251
|
` exec node "${nodeCli}" "$@"`,
|
|
2117
2252
|
" fi",
|
|
2118
|
-
` echo "
|
|
2253
|
+
` echo "${binName}: bun runtime not found (checked PATH, ~/.bun/bin, /opt/homebrew/bin, /usr/local/bin) and the node fallback CLI is missing at ${nodeCli}; install bun from https://bun.sh, or reinstall ${binName} and force the fallback with OMO_RUNTIME=node" >&2`,
|
|
2119
2254
|
" exit 127",
|
|
2120
2255
|
"fi",
|
|
2121
2256
|
`if [ ! -f "${escapedCliPath}" ]; then`,
|
|
2122
|
-
` echo "
|
|
2257
|
+
` echo "${binName}: runtime target missing at ${escapedCliPath}; reinstall with: npx --yes lazycodex-ai@latest install --no-tui" >&2`,
|
|
2123
2258
|
" exit 1",
|
|
2124
2259
|
"fi",
|
|
2125
2260
|
`exec "$BUN_BINARY" "${escapedCliPath}" "$@"`,
|
|
@@ -2127,12 +2262,14 @@ function posixRuntimeWrapper(cliPath, codexHome, binDir, nodeCliPath) {
|
|
|
2127
2262
|
].join(`
|
|
2128
2263
|
`);
|
|
2129
2264
|
}
|
|
2130
|
-
function windowsRuntimeWrapper(cliPath, codexHome, binDir, nodeCliPath) {
|
|
2265
|
+
function windowsRuntimeWrapper(binName, cliPath, codexHome, binDir, nodeCliPath) {
|
|
2131
2266
|
const ulwLoopBin = join13(binDir, "omo-ulw-loop.cmd");
|
|
2132
2267
|
return [
|
|
2133
2268
|
"@echo off",
|
|
2134
2269
|
`rem ${RUNTIME_WRAPPER_MARKER}`,
|
|
2135
2270
|
`if not defined CODEX_HOME set "CODEX_HOME=${codexHome}"`,
|
|
2271
|
+
`set "OMO_INVOCATION_NAME=${binName}"`,
|
|
2272
|
+
'set "OMO_EDITION=codex"',
|
|
2136
2273
|
...windowsNodeDiscoveryLines(),
|
|
2137
2274
|
`if "%~1"=="ulw-loop" if exist "${ulwLoopBin}" (`,
|
|
2138
2275
|
" shift /1",
|
|
@@ -2150,11 +2287,11 @@ function windowsRuntimeWrapper(cliPath, codexHome, binDir, nodeCliPath) {
|
|
|
2150
2287
|
` "%OMO_NODE_BINARY%" "${nodeCliPath}" %*`,
|
|
2151
2288
|
" exit /b %ERRORLEVEL%",
|
|
2152
2289
|
" )",
|
|
2153
|
-
` echo
|
|
2290
|
+
` echo ${binName}: bun runtime not found, no Node runtime was discovered from NODE_REPL_NODE_PATH or PATH, or the node fallback CLI is missing at ${nodeCliPath}; install bun from https://bun.sh or rerun LazyCodex install from Codex Desktop 1>&2`,
|
|
2154
2291
|
" exit /b 127",
|
|
2155
2292
|
")",
|
|
2156
2293
|
`if not exist "${cliPath}" (`,
|
|
2157
|
-
` echo
|
|
2294
|
+
` echo ${binName}: runtime target missing at ${cliPath}; reinstall with: npx --yes lazycodex-ai@latest install --no-tui 1>&2`,
|
|
2158
2295
|
" exit /b 1",
|
|
2159
2296
|
")",
|
|
2160
2297
|
`"%BUN_BINARY%" "${cliPath}" %*`,
|
|
@@ -2170,7 +2307,14 @@ function escapePosixDoubleQuoted(value) {
|
|
|
2170
2307
|
}
|
|
2171
2308
|
|
|
2172
2309
|
// ../src/install/codex-cache-bins.ts
|
|
2173
|
-
var RESERVED_NESTED_BIN_NAMES = new Set([
|
|
2310
|
+
var RESERVED_NESTED_BIN_NAMES = new Set([
|
|
2311
|
+
"omo",
|
|
2312
|
+
"omo-agent-toolkit",
|
|
2313
|
+
"lazycodex",
|
|
2314
|
+
"lazycodex-ai",
|
|
2315
|
+
"oh-my-opencode",
|
|
2316
|
+
"oh-my-openagent"
|
|
2317
|
+
]);
|
|
2174
2318
|
async function linkCachedPluginBins(input) {
|
|
2175
2319
|
const binLinks = await discoverPackageBins(input.pluginRoot);
|
|
2176
2320
|
const platform = input.platform ?? process.platform;
|
|
@@ -2186,20 +2330,26 @@ async function linkCachedPluginBins(input) {
|
|
|
2186
2330
|
}
|
|
2187
2331
|
async function linkRootRuntimeBin(input) {
|
|
2188
2332
|
const cliPath = join14(input.repoRoot, "dist", "cli", "index.js");
|
|
2189
|
-
|
|
2333
|
+
const platform = input.platform ?? process.platform;
|
|
2334
|
+
const legacyPath = join14(input.binDir, platform === "win32" ? "omo.cmd" : "omo");
|
|
2335
|
+
if (!await isFile2(cliPath)) {
|
|
2336
|
+
await removeGeneratedRuntimeWrapper(legacyPath);
|
|
2190
2337
|
return null;
|
|
2338
|
+
}
|
|
2339
|
+
const binName = "omo-agent-toolkit";
|
|
2191
2340
|
const nodeCliPath = join14(input.repoRoot, "dist", "cli-node", "index.js");
|
|
2192
|
-
const platform = input.platform ?? process.platform;
|
|
2193
2341
|
await mkdir5(input.binDir, { recursive: true });
|
|
2194
2342
|
if (platform === "win32") {
|
|
2195
|
-
const linkPath2 = join14(input.binDir,
|
|
2196
|
-
await replaceRuntimeWrapper(linkPath2, windowsRuntimeWrapper(cliPath, input.codexHome, input.binDir, nodeCliPath));
|
|
2197
|
-
|
|
2343
|
+
const linkPath2 = join14(input.binDir, `${binName}.cmd`);
|
|
2344
|
+
await replaceRuntimeWrapper(linkPath2, windowsRuntimeWrapper(binName, cliPath, input.codexHome, input.binDir, nodeCliPath));
|
|
2345
|
+
await removeGeneratedRuntimeWrapper(legacyPath);
|
|
2346
|
+
return { name: binName, path: linkPath2, target: cliPath };
|
|
2198
2347
|
}
|
|
2199
|
-
const linkPath = join14(input.binDir,
|
|
2200
|
-
await replaceRuntimeWrapper(linkPath, posixRuntimeWrapper(cliPath, input.codexHome, input.binDir, nodeCliPath));
|
|
2348
|
+
const linkPath = join14(input.binDir, binName);
|
|
2349
|
+
await replaceRuntimeWrapper(linkPath, posixRuntimeWrapper(binName, cliPath, input.codexHome, input.binDir, nodeCliPath));
|
|
2201
2350
|
await chmod2(linkPath, 493);
|
|
2202
|
-
|
|
2351
|
+
await removeGeneratedRuntimeWrapper(legacyPath);
|
|
2352
|
+
return { name: binName, path: linkPath, target: cliPath };
|
|
2203
2353
|
}
|
|
2204
2354
|
async function linkCachedPluginBin(binDir, link, platform) {
|
|
2205
2355
|
if (platform === "win32") {
|
|
@@ -2302,6 +2452,29 @@ async function replaceRuntimeWrapper(linkPath, content) {
|
|
|
2302
2452
|
await rm9(linkPath, { force: true });
|
|
2303
2453
|
await writeFile5(linkPath, content);
|
|
2304
2454
|
}
|
|
2455
|
+
async function removeGeneratedRuntimeWrapper(path) {
|
|
2456
|
+
try {
|
|
2457
|
+
const entry = await lstat7(path);
|
|
2458
|
+
if (!entry.isFile() && !entry.isSymbolicLink())
|
|
2459
|
+
return;
|
|
2460
|
+
const content = await readGeneratedWrapperContent(path);
|
|
2461
|
+
if (content.includes(RUNTIME_WRAPPER_MARKER))
|
|
2462
|
+
await rm9(path, { force: true });
|
|
2463
|
+
} catch (error) {
|
|
2464
|
+
if (isNodeErrorWithCode(error) && error.code === "ENOENT")
|
|
2465
|
+
return;
|
|
2466
|
+
throw error;
|
|
2467
|
+
}
|
|
2468
|
+
}
|
|
2469
|
+
async function readGeneratedWrapperContent(path) {
|
|
2470
|
+
try {
|
|
2471
|
+
return await readFile8(path, "utf8");
|
|
2472
|
+
} catch (error) {
|
|
2473
|
+
if (isNodeErrorWithCode(error) && (error.code === "ENOENT" || error.code === "EISDIR"))
|
|
2474
|
+
return "";
|
|
2475
|
+
throw error;
|
|
2476
|
+
}
|
|
2477
|
+
}
|
|
2305
2478
|
async function existingNonRuntimeWrapper(path) {
|
|
2306
2479
|
try {
|
|
2307
2480
|
const stat5 = await lstat7(path);
|
|
@@ -3374,13 +3547,13 @@ async function exists4(path) {
|
|
|
3374
3547
|
}
|
|
3375
3548
|
|
|
3376
3549
|
// ../src/install/codex-installer-bin-dir.ts
|
|
3377
|
-
import { homedir as
|
|
3550
|
+
import { homedir as homedir4 } from "node:os";
|
|
3378
3551
|
import { join as join20, resolve as resolve6 } from "node:path";
|
|
3379
3552
|
function resolveCodexInstallerBinDir(input) {
|
|
3380
3553
|
const explicitBinDir = input.binDir ?? input.env?.CODEX_LOCAL_BIN_DIR;
|
|
3381
3554
|
if (explicitBinDir !== undefined && explicitBinDir.trim().length > 0)
|
|
3382
3555
|
return resolve6(explicitBinDir.trim());
|
|
3383
|
-
const homeDir = input.homeDir ??
|
|
3556
|
+
const homeDir = input.homeDir ?? homedir4();
|
|
3384
3557
|
const defaultCodexHome = resolve6(homeDir, ".codex");
|
|
3385
3558
|
const resolvedCodexHome = resolve6(input.codexHome);
|
|
3386
3559
|
if (resolvedCodexHome !== defaultCodexHome)
|
|
@@ -3407,23 +3580,23 @@ function resolveGitBash(input) {
|
|
|
3407
3580
|
}
|
|
3408
3581
|
return missingGitBash(checkedPaths);
|
|
3409
3582
|
}
|
|
3410
|
-
for (const
|
|
3583
|
+
for (const candidate2 of [
|
|
3411
3584
|
{ path: PROGRAM_FILES_GIT_BASH, source: "program-files" },
|
|
3412
3585
|
{ path: PROGRAM_FILES_X86_GIT_BASH, source: "program-files-x86" }
|
|
3413
3586
|
]) {
|
|
3414
|
-
checkedPaths.push(
|
|
3415
|
-
if (input.exists(
|
|
3416
|
-
return { found: true, path:
|
|
3587
|
+
checkedPaths.push(candidate2.path);
|
|
3588
|
+
if (input.exists(candidate2.path))
|
|
3589
|
+
return { found: true, path: candidate2.path, source: candidate2.source, checkedPaths };
|
|
3417
3590
|
}
|
|
3418
3591
|
for (const pathCandidate of input.where("bash")) {
|
|
3419
|
-
const
|
|
3420
|
-
if (
|
|
3592
|
+
const candidate2 = pathCandidate.trim();
|
|
3593
|
+
if (candidate2.length === 0)
|
|
3421
3594
|
continue;
|
|
3422
|
-
checkedPaths.push(
|
|
3423
|
-
if (isKnownNonGitBashLauncher(
|
|
3595
|
+
checkedPaths.push(candidate2);
|
|
3596
|
+
if (isKnownNonGitBashLauncher(candidate2))
|
|
3424
3597
|
continue;
|
|
3425
|
-
if (isBashExePath(
|
|
3426
|
-
return { found: true, path:
|
|
3598
|
+
if (isBashExePath(candidate2) && input.exists(candidate2))
|
|
3599
|
+
return { found: true, path: candidate2, source: "path", checkedPaths };
|
|
3427
3600
|
}
|
|
3428
3601
|
return missingGitBash(checkedPaths);
|
|
3429
3602
|
}
|
|
@@ -3662,18 +3835,18 @@ async function linkRuntimeWrapperStep(options, binDir, degraded) {
|
|
|
3662
3835
|
if (linked !== null)
|
|
3663
3836
|
return;
|
|
3664
3837
|
degraded.push({
|
|
3665
|
-
component: "omo-
|
|
3666
|
-
hint: "use npx lazycodex-ai for the omo CLI",
|
|
3838
|
+
component: "omo-agent-toolkit",
|
|
3839
|
+
hint: "use npx lazycodex-ai for the omo-agent-toolkit CLI",
|
|
3667
3840
|
reason: "marketplace payload has no dist/cli"
|
|
3668
3841
|
});
|
|
3669
|
-
await appendBootstrapLog(options.pluginData, options.now ?? Date.now(), "omo-
|
|
3670
|
-
warning: `Warning: skipped the omo runtime wrapper because ${cliPath} is missing; omo ulw-loop commands will be unavailable until a package shipping dist/cli is installed`
|
|
3842
|
+
await appendBootstrapLog(options.pluginData, options.now ?? Date.now(), "omo-agent-toolkit-degraded", {
|
|
3843
|
+
warning: `Warning: skipped the omo-agent-toolkit runtime wrapper because ${cliPath} is missing; omo-agent-toolkit ulw-loop commands will be unavailable until a package shipping dist/cli is installed`
|
|
3671
3844
|
});
|
|
3672
3845
|
} catch (error) {
|
|
3673
3846
|
degraded.push({
|
|
3674
|
-
component: "omo-
|
|
3847
|
+
component: "omo-agent-toolkit",
|
|
3675
3848
|
hint: BOOTSTRAP_DOCTOR_HINT,
|
|
3676
|
-
reason: `failed to link the omo runtime wrapper into ${binDir}: ${errorMessage(error)}`
|
|
3849
|
+
reason: `failed to link the omo-agent-toolkit runtime wrapper into ${binDir}: ${errorMessage(error)}`
|
|
3677
3850
|
});
|
|
3678
3851
|
}
|
|
3679
3852
|
}
|
|
@@ -3752,7 +3925,7 @@ function resolvePluginDataRoot(env) {
|
|
|
3752
3925
|
const fromEnv = env["PLUGIN_DATA"]?.trim();
|
|
3753
3926
|
if (fromEnv !== undefined && fromEnv.length > 0)
|
|
3754
3927
|
return fromEnv;
|
|
3755
|
-
return join22(
|
|
3928
|
+
return join22(homedir5(), ".local", "share", "lazycodex");
|
|
3756
3929
|
}
|
|
3757
3930
|
async function readPluginVersion(pluginRoot) {
|
|
3758
3931
|
try {
|
|
@@ -3801,6 +3974,9 @@ async function runBootstrapWorker(options = {}) {
|
|
|
3801
3974
|
const platform = options.platform ?? process.platform;
|
|
3802
3975
|
const flags = parseWorkerFlags(options.argv ?? []);
|
|
3803
3976
|
const steps = options.steps ?? defaultWorkerSteps();
|
|
3977
|
+
if (flags.only !== undefined && !steps.some((step) => step.name === flags.only)) {
|
|
3978
|
+
throw new Error(`unknown --only flag value: ${flags.only}`);
|
|
3979
|
+
}
|
|
3804
3980
|
const pluginRoot = resolvePluginRoot(env);
|
|
3805
3981
|
const pluginData = resolvePluginDataRoot(env);
|
|
3806
3982
|
const statePath = resolveBootstrapStatePath(pluginData);
|
|
@@ -3876,10 +4052,10 @@ function parseDegradedEntries(raw) {
|
|
|
3876
4052
|
if (!Array.isArray(raw))
|
|
3877
4053
|
return;
|
|
3878
4054
|
const entries = [];
|
|
3879
|
-
for (const
|
|
3880
|
-
if (typeof
|
|
4055
|
+
for (const candidate2 of raw) {
|
|
4056
|
+
if (typeof candidate2 !== "object" || candidate2 === null)
|
|
3881
4057
|
continue;
|
|
3882
|
-
const record =
|
|
4058
|
+
const record = candidate2;
|
|
3883
4059
|
if (typeof record["component"] !== "string" || typeof record["reason"] !== "string")
|
|
3884
4060
|
continue;
|
|
3885
4061
|
entries.push({
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
|
|
9
9
|
"commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
|
|
10
10
|
"timeout": 30,
|
|
11
|
-
"statusMessage": "(OmO
|
|
11
|
+
"statusMessage": "(OmO 5.0.0-beta.1) Checking Bootstrap Provisioning"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -224,7 +224,7 @@ async function linkComponentBinsStep(options: WorkerSetupOptions, degraded: Boot
|
|
|
224
224
|
}
|
|
225
225
|
|
|
226
226
|
// Older marketplace payloads may not have <pluginRoot>/dist/cli. Keep that
|
|
227
|
-
// degraded path explicit instead of leaving a broken `omo` link.
|
|
227
|
+
// degraded path explicit instead of leaving a broken `omo-agent-toolkit` link.
|
|
228
228
|
async function linkRuntimeWrapperStep(
|
|
229
229
|
options: WorkerSetupOptions,
|
|
230
230
|
binDir: string,
|
|
@@ -240,18 +240,18 @@ async function linkRuntimeWrapperStep(
|
|
|
240
240
|
});
|
|
241
241
|
if (linked !== null) return;
|
|
242
242
|
degraded.push({
|
|
243
|
-
component: "omo-
|
|
244
|
-
hint: "use npx lazycodex-ai for the omo CLI",
|
|
243
|
+
component: "omo-agent-toolkit",
|
|
244
|
+
hint: "use npx lazycodex-ai for the omo-agent-toolkit CLI",
|
|
245
245
|
reason: "marketplace payload has no dist/cli",
|
|
246
246
|
});
|
|
247
|
-
await appendBootstrapLog(options.pluginData, options.now ?? Date.now(), "omo-
|
|
248
|
-
warning: `Warning: skipped the omo runtime wrapper because ${cliPath} is missing; omo ulw-loop commands will be unavailable until a package shipping dist/cli is installed`,
|
|
247
|
+
await appendBootstrapLog(options.pluginData, options.now ?? Date.now(), "omo-agent-toolkit-degraded", {
|
|
248
|
+
warning: `Warning: skipped the omo-agent-toolkit runtime wrapper because ${cliPath} is missing; omo-agent-toolkit ulw-loop commands will be unavailable until a package shipping dist/cli is installed`,
|
|
249
249
|
});
|
|
250
250
|
} catch (error) {
|
|
251
251
|
degraded.push({
|
|
252
|
-
component: "omo-
|
|
252
|
+
component: "omo-agent-toolkit",
|
|
253
253
|
hint: BOOTSTRAP_DOCTOR_HINT,
|
|
254
|
-
reason: `failed to link the omo runtime wrapper into ${binDir}: ${errorMessage(error)}`,
|
|
254
|
+
reason: `failed to link the omo-agent-toolkit runtime wrapper into ${binDir}: ${errorMessage(error)}`,
|
|
255
255
|
});
|
|
256
256
|
}
|
|
257
257
|
}
|
|
@@ -167,6 +167,9 @@ export async function runBootstrapWorker(options: RunBootstrapWorkerOptions = {}
|
|
|
167
167
|
const platform = options.platform ?? process.platform;
|
|
168
168
|
const flags = parseWorkerFlags(options.argv ?? []);
|
|
169
169
|
const steps = options.steps ?? defaultWorkerSteps();
|
|
170
|
+
if (flags.only !== undefined && !steps.some((step) => step.name === flags.only)) {
|
|
171
|
+
throw new Error(`unknown --only flag value: ${flags.only}`);
|
|
172
|
+
}
|
|
170
173
|
const pluginRoot = resolvePluginRoot(env);
|
|
171
174
|
const pluginData = resolvePluginDataRoot(env);
|
|
172
175
|
const statePath = resolveBootstrapStatePath(pluginData);
|