oh-my-opencode 4.5.1 → 4.5.12
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 +33 -18
- package/README.ko.md +33 -18
- package/README.md +82 -24
- package/README.ru.md +33 -18
- package/README.zh-cn.md +45 -24
- package/bin/oh-my-opencode.js +47 -2
- package/bin/oh-my-opencode.test.ts +174 -0
- package/bin/platform.d.ts +6 -0
- package/bin/platform.js +19 -0
- package/bin/platform.test.ts +66 -1
- package/dist/cli/cli-program.d.ts +18 -0
- package/dist/cli/index.js +28472 -26159
- package/dist/cli/install-codex/codex-cache-bundled-mcps.d.ts +5 -0
- package/dist/cli/install-codex/codex-cache-command-shim.d.ts +1 -0
- package/dist/cli/install-codex/codex-cache-legacy-bins.d.ts +3 -0
- package/dist/cli/install-codex/codex-cache-local-dependencies.d.ts +1 -0
- package/dist/cli/install-codex/codex-cache-paths.d.ts +2 -0
- package/dist/cli/install-codex/codex-cache.d.ts +31 -0
- package/dist/cli/install-codex/codex-config-toml.d.ts +11 -0
- package/dist/cli/install-codex/codex-hook-trust.d.ts +6 -0
- package/dist/cli/install-codex/codex-marketplace-snapshot.d.ts +15 -0
- package/dist/cli/install-codex/codex-marketplace.d.ts +9 -0
- package/dist/cli/install-codex/codex-multi-agent-v2-config.d.ts +1 -0
- package/dist/cli/install-codex/codex-process.d.ts +2 -0
- package/dist/cli/install-codex/index.d.ts +7 -0
- package/dist/cli/install-codex/install-codex.d.ts +17 -0
- package/dist/cli/install-codex/link-cached-plugin-agents.d.ts +12 -0
- package/dist/cli/install-codex/toml-section-editor.d.ts +9 -0
- package/dist/cli/install-codex/types.d.ts +56 -0
- package/dist/cli/star-request.d.ts +2 -0
- package/dist/cli/tui-install-prompts.d.ts +3 -2
- package/dist/cli/types.d.ts +8 -0
- package/dist/config/schema/agent-names.d.ts +4 -1
- package/dist/config/schema/commands.d.ts +1 -2
- package/dist/config/schema/oh-my-opencode-config.d.ts +5 -3
- package/dist/create-managers.d.ts +1 -0
- package/dist/features/background-agent/parent-wake-message-activity.d.ts +23 -0
- package/dist/features/background-agent/parent-wake-notifier.d.ts +0 -1
- package/dist/features/boulder-state/storage.d.ts +1 -1
- package/dist/features/builtin-commands/templates/refactor.d.ts +1 -1
- package/dist/features/builtin-commands/templates/remove-ai-slops.d.ts +2 -2
- package/dist/features/builtin-commands/types.d.ts +1 -1
- package/dist/features/builtin-skills/skill-file-loader.d.ts +4 -0
- package/dist/features/builtin-skills/skills/index.d.ts +4 -1
- package/dist/features/builtin-skills/skills/init-deep.d.ts +2 -0
- package/dist/features/builtin-skills/skills/remove-ai-slops.d.ts +2 -0
- package/dist/features/builtin-skills/skills/security-research.d.ts +2 -0
- package/dist/features/builtin-skills/skills/security-review.d.ts +2 -0
- package/dist/features/opencode-runtime-skills/index.d.ts +2 -0
- package/dist/features/opencode-runtime-skills/runtime-skill-config.d.ts +17 -0
- package/dist/features/opencode-runtime-skills/skill-markdown.d.ts +7 -0
- package/dist/features/opencode-runtime-skills/source-server.d.ts +8 -0
- package/dist/hooks/claude-code-hooks/hook-text.d.ts +2 -0
- package/dist/hooks/session-recovery/storage/latest-assistant-message.d.ts +5 -0
- package/dist/hooks/session-recovery/storage/thinking-prepend.d.ts +3 -0
- package/dist/hooks/thinking-block-validator/hook.d.ts +0 -18
- package/dist/hooks/todo-continuation-enforcer/pending-question-detection.d.ts +4 -0
- package/dist/index.js +1684 -1801
- package/dist/oh-my-opencode.schema.json +4 -2
- package/dist/plugin-handlers/config-handler.d.ts +2 -1
- package/dist/shared/external-plugin-detector.d.ts +8 -0
- package/dist/shared/prompt-async-gate/message-inspection-error.d.ts +1 -0
- package/dist/shared/prompt-async-gate/pending-tool-turn.d.ts +1 -0
- package/dist/shared/prompt-async-gate/prompt-message-state.d.ts +8 -0
- package/dist/shared/prompt-timeout-context.d.ts +2 -0
- package/dist/testing/create-plugin-module.d.ts +5 -1
- package/dist/tools/delegate-task/sync-prompt-sender.d.ts +2 -2
- package/package.json +31 -16
- package/packages/ast-grep-mcp/dist/cli.js +245 -40
- package/packages/lsp-tools-mcp/dist/cli.js +1 -1
- package/packages/omo-codex/marketplace.json +17 -0
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +35 -0
- package/packages/omo-codex/plugin/.mcp.json +14 -0
- package/packages/omo-codex/plugin/README.md +13 -0
- package/packages/omo-codex/plugin/components/comment-checker/.gitattributes +13 -0
- package/packages/omo-codex/plugin/components/comment-checker/.github/CODEOWNERS +12 -0
- package/packages/omo-codex/plugin/components/comment-checker/.github/ISSUE_TEMPLATE/bug.yml +40 -0
- package/packages/omo-codex/plugin/components/comment-checker/.github/ISSUE_TEMPLATE/feature.yml +27 -0
- package/packages/omo-codex/plugin/components/comment-checker/.github/branch-ruleset.json +45 -0
- package/packages/omo-codex/plugin/components/comment-checker/.github/dependabot.yml +16 -0
- package/packages/omo-codex/plugin/components/comment-checker/.github/pull_request_template.md +19 -0
- package/packages/omo-codex/plugin/components/comment-checker/.github/workflows/ci.yml +47 -0
- package/packages/omo-codex/plugin/components/comment-checker/.github/workflows/publish.yml +51 -0
- package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +35 -0
- package/packages/omo-codex/plugin/components/comment-checker/CHANGELOG.md +33 -0
- package/packages/omo-codex/plugin/components/comment-checker/LICENSE +21 -0
- package/packages/omo-codex/plugin/components/comment-checker/NOTICE +6 -0
- package/packages/omo-codex/plugin/components/comment-checker/README.md +87 -0
- package/packages/omo-codex/plugin/components/comment-checker/biome.json +48 -0
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +17 -0
- package/packages/omo-codex/plugin/components/comment-checker/package.json +57 -0
- package/packages/omo-codex/plugin/components/comment-checker/skills/comment-checker/SKILL.md +16 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/cli.ts +12 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/codex-hook.ts +205 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +361 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +195 -0
- package/packages/omo-codex/plugin/components/comment-checker/test/codex-hook-newline.test.ts +52 -0
- package/packages/omo-codex/plugin/components/comment-checker/test/codex-hook.test.ts +368 -0
- package/packages/omo-codex/plugin/components/comment-checker/test/fixtures/post-tool-use.json +15 -0
- package/packages/omo-codex/plugin/components/comment-checker/test/package-smoke.test.ts +93 -0
- package/packages/omo-codex/plugin/components/comment-checker/test/runner.test.ts +66 -0
- package/packages/omo-codex/plugin/components/comment-checker/tsconfig.build.json +12 -0
- package/packages/omo-codex/plugin/components/comment-checker/tsconfig.json +27 -0
- package/packages/omo-codex/plugin/components/comment-checker/vitest.config.ts +9 -0
- package/packages/omo-codex/plugin/components/lsp/.gitattributes +13 -0
- package/packages/omo-codex/plugin/components/lsp/.github/CODEOWNERS +1 -0
- package/packages/omo-codex/plugin/components/lsp/.github/ISSUE_TEMPLATE/bug.yml +26 -0
- package/packages/omo-codex/plugin/components/lsp/.github/ISSUE_TEMPLATE/feature.yml +19 -0
- package/packages/omo-codex/plugin/components/lsp/.github/branch-ruleset.json +45 -0
- package/packages/omo-codex/plugin/components/lsp/.github/dependabot.yml +11 -0
- package/packages/omo-codex/plugin/components/lsp/.github/pull_request_template.md +11 -0
- package/packages/omo-codex/plugin/components/lsp/.github/workflows/ci.yml +56 -0
- package/packages/omo-codex/plugin/components/lsp/.github/workflows/publish.yml +60 -0
- package/packages/omo-codex/plugin/components/lsp/.mcp.json +9 -0
- package/packages/omo-codex/plugin/components/lsp/AGENTS.md +25 -0
- package/packages/omo-codex/plugin/components/lsp/CHANGELOG.md +25 -0
- package/packages/omo-codex/plugin/components/lsp/LICENSE +21 -0
- package/packages/omo-codex/plugin/components/lsp/NOTICE +3 -0
- package/packages/omo-codex/plugin/components/lsp/README.md +148 -0
- package/packages/omo-codex/plugin/components/lsp/biome.json +48 -0
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +17 -0
- package/packages/omo-codex/plugin/components/lsp/package.json +64 -0
- package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-tools.mjs +46 -0
- package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-tools.test.mjs +104 -0
- package/packages/omo-codex/plugin/components/lsp/scripts/clean-dist.mjs +5 -0
- package/packages/omo-codex/plugin/components/lsp/scripts/test.mjs +8 -0
- package/packages/omo-codex/plugin/components/lsp/skills/lsp/SKILL.md +35 -0
- package/packages/omo-codex/plugin/components/lsp/src/cli.ts +44 -0
- package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +285 -0
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +358 -0
- package/packages/omo-codex/plugin/components/lsp/test/fixtures/broken.py +1 -0
- package/packages/omo-codex/plugin/components/lsp/test/fixtures/post-tool-use.json +15 -0
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +153 -0
- package/packages/omo-codex/plugin/components/lsp/tsconfig.build.json +12 -0
- package/packages/omo-codex/plugin/components/lsp/tsconfig.json +27 -0
- package/packages/omo-codex/plugin/components/lsp/vitest.config.ts +9 -0
- package/packages/omo-codex/plugin/components/rules/.codex-plugin/plugin.json +3 -0
- package/packages/omo-codex/plugin/components/rules/.gitattributes +13 -0
- package/packages/omo-codex/plugin/components/rules/.github/CODEOWNERS +12 -0
- package/packages/omo-codex/plugin/components/rules/.github/ISSUE_TEMPLATE/bug.yml +49 -0
- package/packages/omo-codex/plugin/components/rules/.github/ISSUE_TEMPLATE/feature.yml +27 -0
- package/packages/omo-codex/plugin/components/rules/.github/branch-ruleset.json +45 -0
- package/packages/omo-codex/plugin/components/rules/.github/dependabot.yml +16 -0
- package/packages/omo-codex/plugin/components/rules/.github/pull_request_template.md +20 -0
- package/packages/omo-codex/plugin/components/rules/.github/workflows/ci.yml +47 -0
- package/packages/omo-codex/plugin/components/rules/.github/workflows/publish.yml +51 -0
- package/packages/omo-codex/plugin/components/rules/AGENTS.md +34 -0
- package/packages/omo-codex/plugin/components/rules/CHANGELOG.md +19 -0
- package/packages/omo-codex/plugin/components/rules/LICENSE +21 -0
- package/packages/omo-codex/plugin/components/rules/NOTICE +15 -0
- package/packages/omo-codex/plugin/components/rules/README.md +124 -0
- package/packages/omo-codex/plugin/components/rules/biome.json +48 -0
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +209 -0
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +54 -0
- package/packages/omo-codex/plugin/components/rules/package.json +62 -0
- package/packages/omo-codex/plugin/components/rules/scripts/bench-codex-rules.mjs +268 -0
- package/packages/omo-codex/plugin/components/rules/skills/rules/SKILL.md +34 -0
- package/packages/omo-codex/plugin/components/rules/src/cli.ts +143 -0
- package/packages/omo-codex/plugin/components/rules/src/codex-hook-options.ts +4 -0
- package/packages/omo-codex/plugin/components/rules/src/codex-hook.ts +238 -0
- package/packages/omo-codex/plugin/components/rules/src/config.ts +107 -0
- package/packages/omo-codex/plugin/components/rules/src/context-pressure.ts +26 -0
- package/packages/omo-codex/plugin/components/rules/src/debug-log.ts +65 -0
- package/packages/omo-codex/plugin/components/rules/src/dynamic-target-fingerprints.ts +98 -0
- package/packages/omo-codex/plugin/components/rules/src/hook-output.ts +19 -0
- package/packages/omo-codex/plugin/components/rules/src/path-utils.ts +29 -0
- package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +234 -0
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +104 -0
- package/packages/omo-codex/plugin/components/rules/src/post-compact-claim.ts +13 -0
- package/packages/omo-codex/plugin/components/rules/src/post-compact-state.ts +45 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/cache.ts +64 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +115 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +535 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/errors.ts +13 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/finder-cache.ts +73 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/finder-paths.ts +47 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/finder-sources.ts +50 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/finder.ts +207 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/formatter.ts +123 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/matcher.ts +142 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/ordering.ts +33 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/parser.ts +326 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/plugin-root.ts +55 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/project-root.ts +30 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/scanner.ts +162 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/truncator.ts +67 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/types.ts +141 -0
- package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +24 -0
- package/packages/omo-codex/plugin/components/rules/src/session-state-lock.ts +47 -0
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +56 -0
- package/packages/omo-codex/plugin/components/rules/src/tool-paths.ts +192 -0
- package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +44 -0
- package/packages/omo-codex/plugin/components/rules/src/transcript-search.ts +108 -0
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +107 -0
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +268 -0
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-context-pressure.test.ts +243 -0
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-performance.test.ts +99 -0
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +132 -0
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +156 -0
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +299 -0
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-lock.test.ts +46 -0
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-process.test.ts +83 -0
- package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +667 -0
- package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +192 -0
- package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +102 -0
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +168 -0
- package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +42 -0
- package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +206 -0
- package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +151 -0
- package/packages/omo-codex/plugin/components/rules/test/persistent-cache.test.ts +63 -0
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +172 -0
- package/packages/omo-codex/plugin/components/rules/test/post-compact-test-fixture.ts +196 -0
- package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +63 -0
- package/packages/omo-codex/plugin/components/rules/test/tool-paths.test.ts +198 -0
- package/packages/omo-codex/plugin/components/rules/tsconfig.build.json +12 -0
- package/packages/omo-codex/plugin/components/rules/tsconfig.json +27 -0
- package/packages/omo-codex/plugin/components/rules/vitest.config.ts +8 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/.gitattributes +13 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +43 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/CHANGELOG.md +5 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +21 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/NOTICE +5 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/README.md +55 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/biome.json +48 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +51 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +28 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +53 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/src/boulder-reader.ts +167 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/src/cli.ts +52 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +66 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/src/directive.ts +6 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/src/index.ts +5 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/src/types.ts +23 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/boulder-reader.test.ts +63 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +124 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +160 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/boulder-completed.json +19 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/boulder-mixed-platforms.json +27 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/boulder-single-codex-work.json +19 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-all-done.md +5 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-with-nested-checkboxes.md +11 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-with-unchecked.md +6 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/tsconfig.build.json +12 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/tsconfig.json +27 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/vitest.config.ts +10 -0
- package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +37 -0
- package/packages/omo-codex/plugin/components/telemetry/README.md +102 -0
- package/packages/omo-codex/plugin/components/telemetry/biome.json +48 -0
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +16 -0
- package/packages/omo-codex/plugin/components/telemetry/package.json +56 -0
- package/packages/omo-codex/plugin/components/telemetry/src/atomic-write.ts +22 -0
- package/packages/omo-codex/plugin/components/telemetry/src/cli.ts +69 -0
- package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +49 -0
- package/packages/omo-codex/plugin/components/telemetry/src/data-path.ts +45 -0
- package/packages/omo-codex/plugin/components/telemetry/src/env-flags.ts +43 -0
- package/packages/omo-codex/plugin/components/telemetry/src/posthog-activity-state.ts +81 -0
- package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +165 -0
- package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +35 -0
- package/packages/omo-codex/plugin/components/telemetry/test/codex-hook.test.ts +270 -0
- package/packages/omo-codex/plugin/components/telemetry/tsconfig.build.json +12 -0
- package/packages/omo-codex/plugin/components/telemetry/tsconfig.json +27 -0
- package/packages/omo-codex/plugin/components/telemetry/vitest.config.ts +8 -0
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +41 -0
- package/packages/omo-codex/plugin/components/ultrawork/CHANGELOG.md +25 -0
- package/packages/omo-codex/plugin/components/ultrawork/LICENSE +21 -0
- package/packages/omo-codex/plugin/components/ultrawork/NOTICE +5 -0
- package/packages/omo-codex/plugin/components/ultrawork/README.md +60 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/codex-ultrawork-reviewer.toml +17 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +82 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +221 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +65 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +69 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +163 -0
- package/packages/omo-codex/plugin/components/ultrawork/biome.json +48 -0
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +264 -0
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +16 -0
- package/packages/omo-codex/plugin/components/ultrawork/package.json +54 -0
- package/packages/omo-codex/plugin/components/ultrawork/src/cli.ts +50 -0
- package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +84 -0
- package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +3 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +252 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +78 -0
- package/packages/omo-codex/plugin/components/ultrawork/tsconfig.build.json +12 -0
- package/packages/omo-codex/plugin/components/ultrawork/tsconfig.json +27 -0
- package/packages/omo-codex/plugin/components/ulw-loop/.gitattributes +13 -0
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +48 -0
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/LICENSE +21 -0
- package/packages/omo-codex/plugin/components/ulw-loop/NOTICE +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +74 -0
- package/packages/omo-codex/plugin/components/ulw-loop/biome.json +48 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +29 -0
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +55 -0
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/.gitkeep +0 -0
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +222 -0
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/agents/openai.yaml +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/.gitkeep +0 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +155 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +95 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +156 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +63 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +94 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +40 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +129 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +139 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +177 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/evidence.ts +122 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/goal-status.ts +88 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +73 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +113 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +124 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +102 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +81 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +270 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/types.ts +277 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint.test.ts +213 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +375 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-helpers.test.ts +250 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering.test.ts +407 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +169 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +156 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +275 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/evidence-criteria-gate.test.ts +100 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/evidence.test.ts +263 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/.gitkeep +0 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/codex-goal-snapshot.json +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/sample-brief.md +5 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/sample-plan.json +108 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/sample-quality-gate.json +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/steering-proposal.json +8 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/user-prompt-submit.json +10 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/goal-status.test.ts +327 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +164 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +62 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-crud.test.ts +256 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +239 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +203 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/review-blockers.test.ts +180 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +353 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/types.test.ts +79 -0
- package/packages/omo-codex/plugin/components/ulw-loop/tsconfig.build.json +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/tsconfig.json +27 -0
- package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +10 -0
- package/packages/omo-codex/plugin/hooks/hooks.json +138 -0
- package/packages/omo-codex/plugin/package-lock.json +1750 -0
- package/packages/omo-codex/plugin/package.json +26 -0
- package/packages/omo-codex/plugin/scripts/build-bundled-mcp-runtimes.mjs +50 -0
- package/packages/omo-codex/plugin/scripts/build-components.mjs +23 -0
- package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +46 -0
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +75 -0
- package/packages/omo-codex/plugin/skills/comment-checker/SKILL.md +16 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +116 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +108 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +130 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/04-oracle-triple.md +136 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/05-escalate.md +69 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +116 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/08-qa.md +94 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/09-cleanup.md +164 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/partial-runtime-evidence.md +229 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/bundled-js-binary.md +415 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +252 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +484 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +260 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +248 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +234 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/ghidra.md +212 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +194 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/pwndbg.md +263 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/pwntools.md +265 -0
- package/packages/omo-codex/plugin/skills/frontend-ui-ux/SKILL.md +77 -0
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +325 -0
- package/packages/omo-codex/plugin/skills/lsp/SKILL.md +35 -0
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +463 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/README.md +90 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/backend-stack.md +641 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/bootstrap.md +328 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/bubbletea-v2.md +360 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/cobra-stack.md +468 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/concurrency.md +362 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/data-modeling.md +329 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/error-handling.md +359 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/golangci-strict.md +236 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/grpc-connect.md +375 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/libraries.md +337 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/one-liners.md +202 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/sqlc-pgx.md +471 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/testing.md +467 -0
- package/packages/omo-codex/plugin/skills/programming/references/go/type-patterns.md +298 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/README.md +314 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/async-anyio.md +442 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/data-modeling.md +233 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/data-processing.md +133 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/error-handling.md +218 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/fastapi-stack.md +316 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/httpx2-optimization.md +360 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/libraries.md +307 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/one-liners.md +268 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/orjson-stack.md +378 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/pydantic-ai.md +285 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/pyproject-strict.md +232 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/textual-tui.md +201 -0
- package/packages/omo-codex/plugin/skills/programming/references/python/type-patterns.md +176 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/README.md +317 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/async-tokio.md +299 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/axum-stack.md +467 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/cargo-strict.md +317 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/clap-stack.md +409 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/concurrency.md +375 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/libraries.md +439 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/one-liners.md +291 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/proptest-insta.md +429 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/type-state.md +354 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/unsafe-discipline.md +250 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/zero-cost-safety.md +527 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust-ub/README.md +289 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust-ub/miri-sanitizers-loom.md +411 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust-ub/ub-taxonomy.md +269 -0
- package/packages/omo-codex/plugin/skills/programming/references/typescript/README.md +195 -0
- package/packages/omo-codex/plugin/skills/programming/references/typescript/backend-hono.md +672 -0
- package/packages/omo-codex/plugin/skills/programming/references/typescript/bootstrap.md +199 -0
- package/packages/omo-codex/plugin/skills/programming/references/typescript/data-modeling.md +202 -0
- package/packages/omo-codex/plugin/skills/programming/references/typescript/error-handling.md +169 -0
- package/packages/omo-codex/plugin/skills/programming/references/typescript/tsconfig-strict.md +152 -0
- package/packages/omo-codex/plugin/skills/programming/references/typescript/type-patterns.md +196 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/go/check-no-excuse-rules.sh +173 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/go/new-project.py +138 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/.editorconfig +13 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/.golangci.yml +95 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/AGENTS.md.tmpl +24 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/README.md.tmpl +12 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/Taskfile.yml +40 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/ci.yml +37 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/config.go +24 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/gitignore +15 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/main.go.tmpl +22 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/go/templates/run.go +15 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/python/check-no-excuse-rules.py +687 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/python/new-project.py +172 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/python/new-script.py +116 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.py +296 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.sh +158 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/new-project.py +175 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-no-excuse-rules.ts +282 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/new-project.ts +177 -0
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +779 -0
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +333 -0
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +549 -0
- package/packages/omo-codex/plugin/skills/rules/SKILL.md +34 -0
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +129 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/.gitkeep +0 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +222 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/agents/openai.yaml +6 -0
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +399 -0
- package/packages/omo-codex/plugin/test/aggregate.test.mjs +330 -0
- package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +66 -0
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +150 -0
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +199 -0
- package/packages/omo-codex/scripts/install/agents.mjs +84 -0
- package/packages/omo-codex/scripts/install/cache.mjs +245 -0
- package/packages/omo-codex/scripts/install/command-shim.mjs +1 -0
- package/packages/omo-codex/scripts/install/config.mjs +229 -0
- package/packages/omo-codex/scripts/install/hook-trust.mjs +84 -0
- package/packages/omo-codex/scripts/install/legacy-bins.mjs +57 -0
- package/packages/omo-codex/scripts/install/marketplace.mjs +104 -0
- package/packages/omo-codex/scripts/install/mcp-runtime-cache.mjs +77 -0
- package/packages/omo-codex/scripts/install/multi-agent-v2-config.mjs +32 -0
- package/packages/omo-codex/scripts/install/process.mjs +19 -0
- package/packages/omo-codex/scripts/install/snapshot.mjs +54 -0
- package/packages/omo-codex/scripts/install/toml-editor.mjs +47 -0
- package/packages/omo-codex/scripts/install/utils.mjs +15 -0
- package/packages/omo-codex/scripts/install-agent-links.test.mjs +104 -0
- package/packages/omo-codex/scripts/install-bin-links.test.mjs +123 -0
- package/packages/omo-codex/scripts/install-cache-copy.test.mjs +30 -0
- package/packages/omo-codex/scripts/install-config.test.mjs +118 -0
- package/packages/omo-codex/scripts/install-local.mjs +192 -0
- package/packages/omo-codex/scripts/install-local.test.mjs +379 -0
- package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +173 -0
- package/packages/omo-codex/scripts/install-test-fixtures.mjs +58 -0
- package/packages/omo-codex/scripts/sync-telemetry-component.mjs +115 -0
- package/packages/omo-codex/scripts/sync-telemetry-component.test.mjs +94 -0
- package/packages/shared-skills/index.mjs +5 -0
- package/packages/shared-skills/package.json +14 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +116 -0
- package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +108 -0
- package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +130 -0
- package/packages/shared-skills/skills/debugging/references/methodology/04-oracle-triple.md +136 -0
- package/packages/shared-skills/skills/debugging/references/methodology/05-escalate.md +69 -0
- package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +116 -0
- package/packages/shared-skills/skills/debugging/references/methodology/08-qa.md +94 -0
- package/packages/shared-skills/skills/debugging/references/methodology/09-cleanup.md +164 -0
- package/packages/shared-skills/skills/debugging/references/methodology/partial-runtime-evidence.md +229 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/bundled-js-binary.md +415 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/go.md +252 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +484 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/node.md +260 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/python.md +248 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +234 -0
- package/packages/shared-skills/skills/debugging/references/tools/ghidra.md +212 -0
- package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +194 -0
- package/packages/shared-skills/skills/debugging/references/tools/pwndbg.md +263 -0
- package/packages/shared-skills/skills/debugging/references/tools/pwntools.md +265 -0
- package/packages/shared-skills/skills/frontend-ui-ux/SKILL.md +77 -0
- package/packages/shared-skills/skills/init-deep/SKILL.md +309 -0
- package/packages/shared-skills/skills/programming/SKILL.md +463 -0
- package/packages/shared-skills/skills/programming/references/go/README.md +90 -0
- package/packages/shared-skills/skills/programming/references/go/backend-stack.md +641 -0
- package/packages/shared-skills/skills/programming/references/go/bootstrap.md +328 -0
- package/packages/shared-skills/skills/programming/references/go/bubbletea-v2.md +360 -0
- package/packages/shared-skills/skills/programming/references/go/cobra-stack.md +468 -0
- package/packages/shared-skills/skills/programming/references/go/concurrency.md +362 -0
- package/packages/shared-skills/skills/programming/references/go/data-modeling.md +329 -0
- package/packages/shared-skills/skills/programming/references/go/error-handling.md +359 -0
- package/packages/shared-skills/skills/programming/references/go/golangci-strict.md +236 -0
- package/packages/shared-skills/skills/programming/references/go/grpc-connect.md +375 -0
- package/packages/shared-skills/skills/programming/references/go/libraries.md +337 -0
- package/packages/shared-skills/skills/programming/references/go/one-liners.md +202 -0
- package/packages/shared-skills/skills/programming/references/go/sqlc-pgx.md +471 -0
- package/packages/shared-skills/skills/programming/references/go/testing.md +467 -0
- package/packages/shared-skills/skills/programming/references/go/type-patterns.md +298 -0
- package/packages/shared-skills/skills/programming/references/python/README.md +314 -0
- package/packages/shared-skills/skills/programming/references/python/async-anyio.md +442 -0
- package/packages/shared-skills/skills/programming/references/python/data-modeling.md +233 -0
- package/packages/shared-skills/skills/programming/references/python/data-processing.md +133 -0
- package/packages/shared-skills/skills/programming/references/python/error-handling.md +218 -0
- package/packages/shared-skills/skills/programming/references/python/fastapi-stack.md +316 -0
- package/packages/shared-skills/skills/programming/references/python/httpx2-optimization.md +360 -0
- package/packages/shared-skills/skills/programming/references/python/libraries.md +307 -0
- package/packages/shared-skills/skills/programming/references/python/one-liners.md +268 -0
- package/packages/shared-skills/skills/programming/references/python/orjson-stack.md +378 -0
- package/packages/shared-skills/skills/programming/references/python/pydantic-ai.md +285 -0
- package/packages/shared-skills/skills/programming/references/python/pyproject-strict.md +232 -0
- package/packages/shared-skills/skills/programming/references/python/textual-tui.md +201 -0
- package/packages/shared-skills/skills/programming/references/python/type-patterns.md +176 -0
- package/packages/shared-skills/skills/programming/references/rust/README.md +317 -0
- package/packages/shared-skills/skills/programming/references/rust/async-tokio.md +299 -0
- package/packages/shared-skills/skills/programming/references/rust/axum-stack.md +467 -0
- package/packages/shared-skills/skills/programming/references/rust/cargo-strict.md +317 -0
- package/packages/shared-skills/skills/programming/references/rust/clap-stack.md +409 -0
- package/packages/shared-skills/skills/programming/references/rust/concurrency.md +375 -0
- package/packages/shared-skills/skills/programming/references/rust/libraries.md +439 -0
- package/packages/shared-skills/skills/programming/references/rust/one-liners.md +291 -0
- package/packages/shared-skills/skills/programming/references/rust/proptest-insta.md +429 -0
- package/packages/shared-skills/skills/programming/references/rust/type-state.md +354 -0
- package/packages/shared-skills/skills/programming/references/rust/unsafe-discipline.md +250 -0
- package/packages/shared-skills/skills/programming/references/rust/zero-cost-safety.md +527 -0
- package/packages/shared-skills/skills/programming/references/rust-ub/README.md +289 -0
- package/packages/shared-skills/skills/programming/references/rust-ub/miri-sanitizers-loom.md +411 -0
- package/packages/shared-skills/skills/programming/references/rust-ub/ub-taxonomy.md +269 -0
- package/packages/shared-skills/skills/programming/references/typescript/README.md +195 -0
- package/packages/shared-skills/skills/programming/references/typescript/backend-hono.md +672 -0
- package/packages/shared-skills/skills/programming/references/typescript/bootstrap.md +199 -0
- package/packages/shared-skills/skills/programming/references/typescript/data-modeling.md +202 -0
- package/packages/shared-skills/skills/programming/references/typescript/error-handling.md +169 -0
- package/packages/shared-skills/skills/programming/references/typescript/tsconfig-strict.md +152 -0
- package/packages/shared-skills/skills/programming/references/typescript/type-patterns.md +196 -0
- package/packages/shared-skills/skills/programming/scripts/go/check-no-excuse-rules.sh +173 -0
- package/packages/shared-skills/skills/programming/scripts/go/new-project.py +138 -0
- package/packages/shared-skills/skills/programming/scripts/go/templates/.editorconfig +13 -0
- package/packages/shared-skills/skills/programming/scripts/go/templates/.golangci.yml +95 -0
- package/packages/shared-skills/skills/programming/scripts/go/templates/AGENTS.md.tmpl +24 -0
- package/packages/shared-skills/skills/programming/scripts/go/templates/README.md.tmpl +12 -0
- package/packages/shared-skills/skills/programming/scripts/go/templates/Taskfile.yml +40 -0
- package/packages/shared-skills/skills/programming/scripts/go/templates/ci.yml +37 -0
- package/packages/shared-skills/skills/programming/scripts/go/templates/config.go +24 -0
- package/packages/shared-skills/skills/programming/scripts/go/templates/gitignore +15 -0
- package/packages/shared-skills/skills/programming/scripts/go/templates/main.go.tmpl +22 -0
- package/packages/shared-skills/skills/programming/scripts/go/templates/run.go +15 -0
- package/packages/shared-skills/skills/programming/scripts/python/check-no-excuse-rules.py +687 -0
- package/packages/shared-skills/skills/programming/scripts/python/new-project.py +172 -0
- package/packages/shared-skills/skills/programming/scripts/python/new-script.py +116 -0
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.py +296 -0
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.sh +158 -0
- package/packages/shared-skills/skills/programming/scripts/rust/new-project.py +175 -0
- package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.ts +282 -0
- package/packages/shared-skills/skills/programming/scripts/typescript/new-project.ts +177 -0
- package/packages/shared-skills/skills/refactor/SKILL.md +763 -0
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +317 -0
- package/packages/shared-skills/skills/review-work/SKILL.md +549 -0
- package/packages/shared-skills/skills/start-work/SKILL.md +129 -0
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +383 -0
- package/postinstall.mjs +6 -2
- package/dist/features/builtin-commands/templates/init-deep.d.ts +0 -1
- package/dist/features/builtin-skills/skills/ai-slop-remover.d.ts +0 -2
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { sharedSkillsRootPath } from "@oh-my-opencode/shared-skills";
|
|
7
|
+
|
|
8
|
+
const root = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
9
|
+
const repoRoot = join(root, "..", "..", "..");
|
|
10
|
+
|
|
11
|
+
const expectedSkills = [
|
|
12
|
+
"comment-checker",
|
|
13
|
+
"debugging",
|
|
14
|
+
"frontend-ui-ux",
|
|
15
|
+
"init-deep",
|
|
16
|
+
"lsp",
|
|
17
|
+
"programming",
|
|
18
|
+
"refactor",
|
|
19
|
+
"remove-ai-slops",
|
|
20
|
+
"review-work",
|
|
21
|
+
"rules",
|
|
22
|
+
"start-work",
|
|
23
|
+
"ulw-loop",
|
|
24
|
+
"ulw-plan",
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const componentSkillSources = [
|
|
28
|
+
["comment-checker", "components/comment-checker/skills/comment-checker"],
|
|
29
|
+
["lsp", "components/lsp/skills/lsp"],
|
|
30
|
+
["rules", "components/rules/skills/rules"],
|
|
31
|
+
["ulw-loop", "components/ulw-loop/skills/ulw-loop"],
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
const codexCompatibilityEndMarkers = [
|
|
35
|
+
"When translating `load_skills=[...]`, include the requested skill names in the spawned agent's `message`. If a code block below conflicts with this section, this section wins.\n\n",
|
|
36
|
+
"When translating `load_skills=[...]`, name the skills inside the spawned agent's `message`. If a code block below conflicts with this section, this section wins.\n\n",
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
function removeCodexCompatibilityGuidance(content) {
|
|
40
|
+
const start = content.indexOf("## Codex Harness Tool Compatibility\n\n");
|
|
41
|
+
if (start === -1) return content;
|
|
42
|
+
const endMarker = codexCompatibilityEndMarkers.find((marker) => content.indexOf(marker, start) !== -1);
|
|
43
|
+
assert.notEqual(endMarker, undefined, "Codex compatibility guidance block is missing its terminator");
|
|
44
|
+
const end = content.indexOf(endMarker, start);
|
|
45
|
+
assert.notEqual(end, -1, "Codex compatibility guidance block is missing its terminator");
|
|
46
|
+
return `${content.slice(0, start)}${content.slice(end + endMarker.length)}`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
test("#given synced aggregate Codex skills #when inspected #then component and shared skills are present", async () => {
|
|
50
|
+
// given
|
|
51
|
+
const skillsRoot = join(root, "skills");
|
|
52
|
+
|
|
53
|
+
// when
|
|
54
|
+
const skillNames = (await readdir(skillsRoot, { withFileTypes: true }))
|
|
55
|
+
.filter((entry) => entry.isDirectory())
|
|
56
|
+
.map((entry) => entry.name)
|
|
57
|
+
.sort();
|
|
58
|
+
|
|
59
|
+
// then
|
|
60
|
+
assert.deepEqual(skillNames, expectedSkills);
|
|
61
|
+
for (const skillName of expectedSkills) {
|
|
62
|
+
const content = await readFile(join(skillsRoot, skillName, "SKILL.md"), "utf8");
|
|
63
|
+
assert.match(removeCodexCompatibilityGuidance(content), /^---\r?\n/);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("#given aggregate Codex skills #when source wiring is inspected #then shared skills are imported from the shared-skills package", async () => {
|
|
68
|
+
// given
|
|
69
|
+
const pluginPackageJson = JSON.parse(await readFile(join(root, "package.json"), "utf8"));
|
|
70
|
+
const sharedPackageJson = JSON.parse(await readFile(join(root, "..", "..", "shared-skills", "package.json"), "utf8"));
|
|
71
|
+
const rootPackageJson = JSON.parse(await readFile(join(repoRoot, "package.json"), "utf8"));
|
|
72
|
+
const syncScript = await readFile(join(root, "scripts", "sync-skills.mjs"), "utf8");
|
|
73
|
+
|
|
74
|
+
// when
|
|
75
|
+
const sharedSkillDependency = pluginPackageJson.dependencies?.["@oh-my-opencode/shared-skills"];
|
|
76
|
+
const rootPackageFiles = rootPackageJson.files ?? [];
|
|
77
|
+
|
|
78
|
+
// then
|
|
79
|
+
assert.equal(sharedPackageJson.exports?.["."], "./index.mjs");
|
|
80
|
+
assert.equal(sharedPackageJson.files?.includes("skills"), true);
|
|
81
|
+
assert.equal(rootPackageFiles.includes("packages/shared-skills/package.json"), true);
|
|
82
|
+
assert.equal(rootPackageFiles.includes("packages/shared-skills/index.mjs"), true);
|
|
83
|
+
assert.equal(rootPackageFiles.includes("packages/shared-skills/skills"), true);
|
|
84
|
+
assert.equal(sharedSkillDependency, "file:../../shared-skills");
|
|
85
|
+
assert.match(syncScript, /from "@oh-my-opencode\/shared-skills"/);
|
|
86
|
+
assert.doesNotMatch(syncScript, /shared-skills",\s*"skills"/);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test("#given shared skill package source #when aggregate Codex shared skills are inspected #then generated copies have no hand-authored drift", async () => {
|
|
90
|
+
// given
|
|
91
|
+
const sharedSkillsRoot = sharedSkillsRootPath();
|
|
92
|
+
const aggregateSkillsRoot = join(root, "skills");
|
|
93
|
+
const sharedSkillNames = (await readdir(sharedSkillsRoot, { withFileTypes: true }))
|
|
94
|
+
.filter((entry) => entry.isDirectory())
|
|
95
|
+
.map((entry) => entry.name)
|
|
96
|
+
.sort();
|
|
97
|
+
|
|
98
|
+
// when / then
|
|
99
|
+
for (const skillName of sharedSkillNames) {
|
|
100
|
+
const sharedContent = await readFile(join(sharedSkillsRoot, skillName, "SKILL.md"), "utf8");
|
|
101
|
+
const aggregateContent = await readFile(join(aggregateSkillsRoot, skillName, "SKILL.md"), "utf8");
|
|
102
|
+
assert.equal(
|
|
103
|
+
removeCodexCompatibilityGuidance(aggregateContent),
|
|
104
|
+
removeCodexCompatibilityGuidance(sharedContent),
|
|
105
|
+
`${skillName} drifted from shared-skills`,
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("#given component skill sources #when aggregate Codex component skills are inspected #then generated copies have no hand-authored drift", async () => {
|
|
111
|
+
// given
|
|
112
|
+
const aggregateSkillsRoot = join(root, "skills");
|
|
113
|
+
|
|
114
|
+
// when / then
|
|
115
|
+
for (const [skillName, sourcePath] of componentSkillSources) {
|
|
116
|
+
const sourceContent = await readFile(join(root, sourcePath, "SKILL.md"), "utf8");
|
|
117
|
+
const aggregateContent = await readFile(join(aggregateSkillsRoot, skillName, "SKILL.md"), "utf8");
|
|
118
|
+
assert.equal(
|
|
119
|
+
removeCodexCompatibilityGuidance(aggregateContent),
|
|
120
|
+
removeCodexCompatibilityGuidance(sourceContent),
|
|
121
|
+
`${skillName} drifted from its component skill source`,
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test("#given synced ulw-loop skill #when Codex hint metadata is inspected #then ulw-loop surfaces the ulw-loop alias", async () => {
|
|
127
|
+
// given
|
|
128
|
+
const skillRoot = join(root, "skills", "ulw-loop");
|
|
129
|
+
|
|
130
|
+
// when
|
|
131
|
+
const skill = await readFile(join(skillRoot, "SKILL.md"), "utf8");
|
|
132
|
+
const interfaceMetadata = await readFile(join(skillRoot, "agents", "openai.yaml"), "utf8");
|
|
133
|
+
|
|
134
|
+
// then
|
|
135
|
+
assert.match(skill, /^---\r?\nname: ulw-loop\r?\n/m);
|
|
136
|
+
assert.match(skill, /Goal-like loop that uses ultrawork mode to decompose work into systematic, evidence-bound steps\./);
|
|
137
|
+
assert.match(interfaceMetadata, /display_name: "ulw-loop \(omo\)"/);
|
|
138
|
+
assert.doesNotMatch(interfaceMetadata, /ulw-loop \/ ulw-loop/);
|
|
139
|
+
assert.match(interfaceMetadata, /short_description: "Goal-like ultrawork loop for systematic decomposition"/);
|
|
140
|
+
assert.match(interfaceMetadata, /default_prompt: "Use \$ulw-loop/);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test("#given synced ulw-loop skill #when Codex hint metadata is inspected #then ulw-loop remains discoverable as an alias", async () => {
|
|
144
|
+
// given
|
|
145
|
+
const skillRoot = join(root, "skills", "ulw-loop");
|
|
146
|
+
|
|
147
|
+
// when
|
|
148
|
+
const interfaceMetadata = await readFile(join(skillRoot, "agents", "openai.yaml"), "utf8");
|
|
149
|
+
|
|
150
|
+
// then
|
|
151
|
+
assert.match(interfaceMetadata, /search_terms:/);
|
|
152
|
+
assert.match(interfaceMetadata, /- "ulw-loop"/);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test("#given synced ulw-loop skill #when worker guidance is inspected #then context-hygiene guidance matches the source", async () => {
|
|
156
|
+
// given
|
|
157
|
+
const sourceSkill = await readFile(join(root, "components", "ulw-loop", "skills", "ulw-loop", "SKILL.md"), "utf8");
|
|
158
|
+
const syncedSkill = await readFile(join(root, "skills", "ulw-loop", "SKILL.md"), "utf8");
|
|
159
|
+
const requiredPatterns = [
|
|
160
|
+
["list_agents polling guard", /list_agents/],
|
|
161
|
+
["status polling warning", /polling or status tool/],
|
|
162
|
+
["large payload replay risk", /replay large agent status and latest-message payloads/],
|
|
163
|
+
["local spawned-name tracking", /Track spawned agent names locally/],
|
|
164
|
+
["wait_agent completion path", /wait_agent.*completion/],
|
|
165
|
+
["targeted followups", /targeted followups only when needed/],
|
|
166
|
+
["close_agent cleanup", /close_agent.*after integrating each result/],
|
|
167
|
+
];
|
|
168
|
+
|
|
169
|
+
// when / then
|
|
170
|
+
for (const [label, pattern] of requiredPatterns) {
|
|
171
|
+
assert.match(sourceSkill, pattern, `source skill missing ${label}`);
|
|
172
|
+
assert.match(syncedSkill, pattern, `synced skill missing ${label}`);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test("#given synced aggregate Codex skills #when they contain OpenCode orchestration examples #then Codex tool compatibility guidance is injected", async () => {
|
|
177
|
+
// given
|
|
178
|
+
const skillsRoot = join(root, "skills");
|
|
179
|
+
const opencodeOnlyToolPattern = /\b(?:call_omo_agent|background_output|team_[a-z_]+|task)\s*\(/;
|
|
180
|
+
|
|
181
|
+
// when
|
|
182
|
+
const skillNames = (await readdir(skillsRoot, { withFileTypes: true }))
|
|
183
|
+
.filter((entry) => entry.isDirectory())
|
|
184
|
+
.map((entry) => entry.name)
|
|
185
|
+
.sort();
|
|
186
|
+
|
|
187
|
+
// then
|
|
188
|
+
for (const skillName of skillNames) {
|
|
189
|
+
const content = await readFile(join(skillsRoot, skillName, "SKILL.md"), "utf8");
|
|
190
|
+
if (!opencodeOnlyToolPattern.test(content)) continue;
|
|
191
|
+
|
|
192
|
+
const compatibilityIndex = content.indexOf("## Codex Harness Tool Compatibility");
|
|
193
|
+
assert.notEqual(compatibilityIndex, -1, `${skillName} is missing Codex compatibility guidance`);
|
|
194
|
+
assert.ok(
|
|
195
|
+
compatibilityIndex < content.search(opencodeOnlyToolPattern),
|
|
196
|
+
`${skillName} must explain Codex tool translation before OpenCode-only examples`,
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { basename, join } from "node:path";
|
|
2
|
+
import { copyFile, lstat, mkdir, readdir, rm, symlink, writeFile } from "node:fs/promises";
|
|
3
|
+
|
|
4
|
+
import { exists } from "./utils.mjs";
|
|
5
|
+
|
|
6
|
+
const MANIFEST_FILE = ".installed-agents.json";
|
|
7
|
+
|
|
8
|
+
export async function linkCachedPluginAgents({ codexHome, pluginRoot, platform = process.platform }) {
|
|
9
|
+
const bundledAgents = await discoverBundledAgents(pluginRoot);
|
|
10
|
+
if (bundledAgents.length === 0) {
|
|
11
|
+
await writeManifest(pluginRoot, []);
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const agentsDir = join(codexHome, "agents");
|
|
16
|
+
await mkdir(agentsDir, { recursive: true });
|
|
17
|
+
const linked = [];
|
|
18
|
+
for (const agentPath of bundledAgents) {
|
|
19
|
+
const linkPath = join(agentsDir, basename(agentPath));
|
|
20
|
+
if (platform === "win32") {
|
|
21
|
+
await replaceWithCopy(linkPath, agentPath);
|
|
22
|
+
} else {
|
|
23
|
+
await replaceWithSymlink(linkPath, agentPath);
|
|
24
|
+
}
|
|
25
|
+
linked.push({ name: basename(agentPath), path: linkPath, target: agentPath });
|
|
26
|
+
}
|
|
27
|
+
await writeManifest(pluginRoot, linked.map((entry) => entry.path));
|
|
28
|
+
return linked;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function discoverBundledAgents(pluginRoot) {
|
|
32
|
+
const componentsRoot = join(pluginRoot, "components");
|
|
33
|
+
if (!(await exists(componentsRoot))) return [];
|
|
34
|
+
|
|
35
|
+
const componentEntries = await readdir(componentsRoot, { withFileTypes: true });
|
|
36
|
+
const agents = [];
|
|
37
|
+
for (const entry of componentEntries) {
|
|
38
|
+
if (!entry.isDirectory()) continue;
|
|
39
|
+
const agentsRoot = join(componentsRoot, entry.name, "agents");
|
|
40
|
+
if (!(await exists(agentsRoot))) continue;
|
|
41
|
+
const agentEntries = await readdir(agentsRoot, { withFileTypes: true });
|
|
42
|
+
for (const file of agentEntries) {
|
|
43
|
+
if (!file.isFile() || !file.name.endsWith(".toml")) continue;
|
|
44
|
+
agents.push(join(agentsRoot, file.name));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
agents.sort();
|
|
48
|
+
return agents;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function replaceWithSymlink(linkPath, target) {
|
|
52
|
+
await prepareReplacement(linkPath);
|
|
53
|
+
await symlink(target, linkPath);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function replaceWithCopy(linkPath, target) {
|
|
57
|
+
await prepareReplacement(linkPath);
|
|
58
|
+
await copyFile(target, linkPath);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function prepareReplacement(linkPath) {
|
|
62
|
+
if (!(await lstatExists(linkPath))) return;
|
|
63
|
+
const entryStat = await lstat(linkPath);
|
|
64
|
+
if (entryStat.isDirectory() && !entryStat.isSymbolicLink()) {
|
|
65
|
+
throw new Error(`${linkPath} already exists and is a directory; refusing to replace`);
|
|
66
|
+
}
|
|
67
|
+
await rm(linkPath, { force: true });
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function writeManifest(pluginRoot, agentPaths) {
|
|
71
|
+
const manifestPath = join(pluginRoot, MANIFEST_FILE);
|
|
72
|
+
const payload = { agents: [...agentPaths].sort() };
|
|
73
|
+
await writeFile(manifestPath, `${JSON.stringify(payload, null, "\t")}\n`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function lstatExists(path) {
|
|
77
|
+
try {
|
|
78
|
+
await lstat(path);
|
|
79
|
+
return true;
|
|
80
|
+
} catch (error) {
|
|
81
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
2
|
+
import { cp, lstat, mkdir, readFile, readdir, readlink, rename, rm, symlink, writeFile } from "node:fs/promises";
|
|
3
|
+
|
|
4
|
+
import { createCachedMcpRuntimeArgRewriter } from "./mcp-runtime-cache.mjs";
|
|
5
|
+
import { exists, isRecord } from "./utils.mjs";
|
|
6
|
+
import { COMMAND_SHIM_MARKER } from "./command-shim.mjs";
|
|
7
|
+
import { removeLegacyCodexComponentBins } from "./legacy-bins.mjs";
|
|
8
|
+
|
|
9
|
+
export async function installCachedPlugin({ codexHome, marketplaceName, name, runCommand, sourcePath, version }) {
|
|
10
|
+
await maybeRunNpmInstall(sourcePath, runCommand);
|
|
11
|
+
await maybeRunNpmBuild(sourcePath, runCommand);
|
|
12
|
+
|
|
13
|
+
const targetPath = join(codexHome, "plugins", "cache", marketplaceName, name, version);
|
|
14
|
+
await replaceDirectory(sourcePath, targetPath, shouldCopyPluginPath);
|
|
15
|
+
await rewriteCachedPackageLocalFileDependencies(targetPath, sourcePath);
|
|
16
|
+
await maybeRunNpmInstall(targetPath, runCommand, ["install", "--omit=dev"]);
|
|
17
|
+
await rewriteCachedMcpManifest(targetPath, sourcePath);
|
|
18
|
+
return { name, version, path: targetPath };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function pruneMarketplaceCache({ codexHome, marketplaceName, keepPluginNames }) {
|
|
22
|
+
const cacheRoot = join(codexHome, "plugins", "cache", marketplaceName);
|
|
23
|
+
if (!(await exists(cacheRoot))) return;
|
|
24
|
+
const keep = new Set(keepPluginNames);
|
|
25
|
+
const entries = await readdir(cacheRoot, { withFileTypes: true });
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
if (!entry.isDirectory() || keep.has(entry.name)) continue;
|
|
28
|
+
await rm(join(cacheRoot, entry.name), { recursive: true, force: true });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function pruneMarketplacePluginCaches({ codexHome, marketplaceName, pluginNames }) {
|
|
33
|
+
const cacheRoot = join(codexHome, "plugins", "cache", marketplaceName);
|
|
34
|
+
if (!(await exists(cacheRoot))) return;
|
|
35
|
+
for (const pluginName of pluginNames) {
|
|
36
|
+
await rm(join(cacheRoot, pluginName), { recursive: true, force: true });
|
|
37
|
+
}
|
|
38
|
+
if ((await readdir(cacheRoot)).length === 0) {
|
|
39
|
+
await rm(cacheRoot, { recursive: true, force: true });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function linkCachedPluginBins({ binDir, pluginRoot, platform = process.platform }) {
|
|
44
|
+
const binLinks = await discoverPackageBins(pluginRoot);
|
|
45
|
+
await mkdir(binDir, { recursive: true });
|
|
46
|
+
await removeLegacyCodexComponentBins(binDir, platform);
|
|
47
|
+
const linked = [];
|
|
48
|
+
for (const link of binLinks) {
|
|
49
|
+
const linkPath = await linkCachedPluginBin(binDir, link, platform);
|
|
50
|
+
linked.push({ name: link.name, path: linkPath, target: link.target });
|
|
51
|
+
}
|
|
52
|
+
return linked;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function linkCachedPluginBin(binDir, link, platform) {
|
|
56
|
+
if (platform === "win32") {
|
|
57
|
+
const linkPath = join(binDir, `${link.name}.cmd`);
|
|
58
|
+
await replaceCommandShim(linkPath, link.target);
|
|
59
|
+
return linkPath;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const linkPath = join(binDir, link.name);
|
|
63
|
+
await replaceSymlink(linkPath, link.target);
|
|
64
|
+
return linkPath;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function maybeRunNpmInstall(cwd, runCommand, args = ["install"]) {
|
|
68
|
+
if (!(await exists(join(cwd, "package.json")))) return;
|
|
69
|
+
await runCommand("npm", args, { cwd });
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function maybeRunNpmBuild(cwd, runCommand) {
|
|
73
|
+
if (!(await exists(join(cwd, "package.json")))) return;
|
|
74
|
+
const packageJson = JSON.parse(await readFile(join(cwd, "package.json"), "utf8"));
|
|
75
|
+
if (!isRecord(packageJson.scripts) || typeof packageJson.scripts.build !== "string") return;
|
|
76
|
+
await runCommand("npm", ["run", "build"], { cwd });
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function replaceDirectory(sourcePath, targetPath, filter) {
|
|
80
|
+
await mkdir(dirname(targetPath), { recursive: true });
|
|
81
|
+
const tempPath = join(dirname(targetPath), `.tmp-${basename(targetPath)}-${process.pid}-${Date.now()}`);
|
|
82
|
+
await rm(tempPath, { recursive: true, force: true });
|
|
83
|
+
await cp(sourcePath, tempPath, {
|
|
84
|
+
recursive: true,
|
|
85
|
+
filter: (source) => filter(source, sourcePath),
|
|
86
|
+
});
|
|
87
|
+
await rm(targetPath, { recursive: true, force: true });
|
|
88
|
+
await rename(tempPath, targetPath);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function discoverPackageBins(root) {
|
|
92
|
+
const links = [];
|
|
93
|
+
await collectPackageBins(root, root, links);
|
|
94
|
+
return links;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function collectPackageBins(directory, root, links) {
|
|
98
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
99
|
+
const packageJsonPath = join(directory, "package.json");
|
|
100
|
+
if (entries.some((entry) => entry.isFile() && entry.name === "package.json")) {
|
|
101
|
+
await appendPackageBinLinks(packageJsonPath, directory, links);
|
|
102
|
+
}
|
|
103
|
+
for (const entry of entries) {
|
|
104
|
+
if (!entry.isDirectory()) continue;
|
|
105
|
+
if (entry.name === "node_modules" || entry.name === ".git" || entry.name === "dist") continue;
|
|
106
|
+
const childPath = join(directory, entry.name);
|
|
107
|
+
if (!childPath.startsWith(root)) continue;
|
|
108
|
+
await collectPackageBins(childPath, root, links);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function appendPackageBinLinks(packageJsonPath, packageRoot, links) {
|
|
113
|
+
const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));
|
|
114
|
+
if (!isRecord(packageJson)) return;
|
|
115
|
+
const bin = packageJson.bin;
|
|
116
|
+
if (typeof bin === "string" && typeof packageJson.name === "string") {
|
|
117
|
+
links.push({ name: basename(packageJson.name), target: join(packageRoot, bin) });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (!isRecord(bin)) return;
|
|
121
|
+
for (const [name, target] of Object.entries(bin)) {
|
|
122
|
+
if (typeof target !== "string") continue;
|
|
123
|
+
links.push({ name, target: join(packageRoot, target) });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function replaceSymlink(linkPath, targetPath) {
|
|
128
|
+
if (await existingNonSymlink(linkPath)) {
|
|
129
|
+
throw new Error(`${linkPath} already exists and is not a symlink`);
|
|
130
|
+
}
|
|
131
|
+
await rm(linkPath, { force: true });
|
|
132
|
+
await symlink(targetPath, linkPath);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function replaceCommandShim(linkPath, targetPath) {
|
|
136
|
+
if (await existingNonShim(linkPath)) {
|
|
137
|
+
throw new Error(`${linkPath} already exists and is not a command shim`);
|
|
138
|
+
}
|
|
139
|
+
await writeFile(linkPath, `@echo off\r\n${COMMAND_SHIM_MARKER}\r\nnode "${targetPath}" %*\r\n`);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function existingNonShim(path) {
|
|
143
|
+
try {
|
|
144
|
+
const stat = await lstat(path);
|
|
145
|
+
if (!stat.isFile()) return true;
|
|
146
|
+
const content = await readFile(path, "utf8");
|
|
147
|
+
if (content.includes(COMMAND_SHIM_MARKER)) return false;
|
|
148
|
+
throw new Error(`${path} already exists and is not a generated command shim`);
|
|
149
|
+
} catch (error) {
|
|
150
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async function existingNonSymlink(path) {
|
|
156
|
+
try {
|
|
157
|
+
const stat = await lstat(path);
|
|
158
|
+
if (!stat.isSymbolicLink()) return true;
|
|
159
|
+
await readlink(path);
|
|
160
|
+
return false;
|
|
161
|
+
} catch (error) {
|
|
162
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function shouldCopyPluginPath(path, root) {
|
|
168
|
+
const relative = path === root ? "" : path.slice(root.length + sep.length);
|
|
169
|
+
if (relative === "") return true;
|
|
170
|
+
const parts = relative.split(sep);
|
|
171
|
+
if (parts[parts.length - 1] === "package-lock.json") return false;
|
|
172
|
+
return !parts.some((part) => part === ".git" || part === "node_modules");
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export async function rewriteCachedMcpManifest(pluginRoot, sourceRoot = pluginRoot) {
|
|
176
|
+
const manifestPath = join(pluginRoot, ".mcp.json");
|
|
177
|
+
if (!(await exists(manifestPath))) return;
|
|
178
|
+
const raw = await readFile(manifestPath, "utf8");
|
|
179
|
+
const parsed = JSON.parse(raw);
|
|
180
|
+
if (!isRecord(parsed) || !isRecord(parsed.mcpServers)) return;
|
|
181
|
+
let changed = false;
|
|
182
|
+
const rewriteRuntimeArg = createCachedMcpRuntimeArgRewriter();
|
|
183
|
+
for (const [serverName, server] of Object.entries(parsed.mcpServers)) {
|
|
184
|
+
if (!isRecord(server)) continue;
|
|
185
|
+
if (server.cwd === "." || server.cwd === "./") {
|
|
186
|
+
delete server.cwd;
|
|
187
|
+
changed = true;
|
|
188
|
+
}
|
|
189
|
+
if (!Array.isArray(server.args)) continue;
|
|
190
|
+
const nextArgs = await Promise.all(
|
|
191
|
+
server.args.map((arg) => rewriteRuntimeArg({ arg, pluginRoot, serverName, sourceRoot })),
|
|
192
|
+
);
|
|
193
|
+
if (nextArgs.some((value, index) => value !== server.args[index])) {
|
|
194
|
+
server.args = nextArgs;
|
|
195
|
+
changed = true;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (changed) await writeFile(manifestPath, `${JSON.stringify(parsed, null, "\t")}\n`);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async function rewriteCachedPackageLocalFileDependencies(pluginRoot, sourceRoot) {
|
|
202
|
+
const packageJsonPaths = [];
|
|
203
|
+
await collectPackageJsonPaths(pluginRoot, pluginRoot, packageJsonPaths);
|
|
204
|
+
for (const packageJsonPath of packageJsonPaths) {
|
|
205
|
+
const raw = await readFile(packageJsonPath, "utf8");
|
|
206
|
+
const parsed = JSON.parse(raw);
|
|
207
|
+
if (!isRecord(parsed)) continue;
|
|
208
|
+
const packageDir = dirname(packageJsonPath);
|
|
209
|
+
const sourcePackageDir = join(sourceRoot, relative(pluginRoot, packageDir));
|
|
210
|
+
let changed = false;
|
|
211
|
+
for (const field of ["dependencies", "optionalDependencies", "peerDependencies"]) {
|
|
212
|
+
const dependencies = parsed[field];
|
|
213
|
+
if (!isRecord(dependencies)) continue;
|
|
214
|
+
for (const [name, specifier] of Object.entries(dependencies)) {
|
|
215
|
+
if (typeof specifier !== "string" || !specifier.startsWith("file:")) continue;
|
|
216
|
+
const filePath = specifier.slice("file:".length);
|
|
217
|
+
if (filePath.length === 0 || isAbsolute(filePath)) continue;
|
|
218
|
+
const targetPath = resolve(packageDir, filePath);
|
|
219
|
+
if (isPathInside(targetPath, pluginRoot)) continue;
|
|
220
|
+
dependencies[name] = `file:${resolve(sourcePackageDir, filePath)}`;
|
|
221
|
+
changed = true;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (changed) await writeFile(packageJsonPath, `${JSON.stringify(parsed, null, "\t")}\n`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
async function collectPackageJsonPaths(directory, root, paths) {
|
|
229
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
230
|
+
if (entries.some((entry) => entry.isFile() && entry.name === "package.json")) {
|
|
231
|
+
paths.push(join(directory, "package.json"));
|
|
232
|
+
}
|
|
233
|
+
for (const entry of entries) {
|
|
234
|
+
if (!entry.isDirectory()) continue;
|
|
235
|
+
if (entry.name === "node_modules" || entry.name === ".git" || entry.name === "dist") continue;
|
|
236
|
+
const childPath = join(directory, entry.name);
|
|
237
|
+
if (!childPath.startsWith(root)) continue;
|
|
238
|
+
await collectPackageJsonPaths(childPath, root, paths);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function isPathInside(candidatePath, rootPath) {
|
|
243
|
+
const pathFromRoot = relative(rootPath, candidatePath);
|
|
244
|
+
return pathFromRoot === "" || (!pathFromRoot.startsWith("..") && !isAbsolute(pathFromRoot));
|
|
245
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const COMMAND_SHIM_MARKER = ":: generated by oh-my-openagent Codex installer";
|