oh-my-opencode 4.19.3 → 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/.agents/command/get-unpublished-changes.md +2 -0
- package/.agents/command/omomomo.md +1 -1
- package/.agents/command/publish.md +7 -0
- package/.agents/skills/get-unpublished-changes/SKILL.md +2 -0
- package/.agents/skills/hyperplan/SKILL.md +3 -3
- package/.agents/skills/omomomo/SKILL.md +1 -1
- package/.agents/skills/publish/SKILL.md +7 -0
- package/.opencode/command/get-unpublished-changes.md +2 -0
- package/.opencode/command/omomomo.md +1 -1
- package/.opencode/command/publish.md +7 -0
- package/.opencode/skills/hyperplan/SKILL.md +3 -3
- 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/agents/sisyphus-junior/agent.d.ts +1 -1
- package/dist/cli/doctor/checks/deprecated-reasoning-keys.d.ts +2 -0
- package/dist/cli/index.js +2925 -1919
- package/dist/cli-node/index.js +2925 -1919
- package/dist/config/schema/agent-overrides.d.ts +1343 -15
- package/dist/config/schema/categories.d.ts +132 -0
- package/dist/config/schema/fallback-models.d.ts +50 -0
- package/dist/config/schema/oh-my-opencode-config.d.ts +1322 -11
- package/dist/config-migration/index.d.ts +1 -0
- package/dist/config-migration/migration-plans.d.ts +1 -0
- package/dist/config-migration/reasoning-unification.d.ts +3 -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/features/team-mode/tools/lifecycle-test-fixture.d.ts +2 -0
- package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +1 -0
- package/dist/hooks/model-fallback/next-fallback.d.ts +1 -0
- package/dist/hooks/runtime-fallback/constants.d.ts +1 -1
- 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 +4864 -4011
- package/dist/mcp/lsp.d.ts +1 -0
- package/dist/oh-my-opencode.schema.json +3221 -222
- package/dist/plugin-handlers/prometheus-agent-config-builder.d.ts +1 -0
- package/dist/shared/agent-variant.d.ts +11 -0
- package/dist/shared/session-prompt-params-helpers.d.ts +6 -1
- 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/coding-agent-sessions/SKILL.md +4 -3
- package/dist/skills/coding-agent-sessions/references/all-platforms.md +3 -1
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +140 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +3 -0
- package/dist/skills/data-scientist/SKILL.md +243 -0
- package/dist/skills/data-scientist/references/common-scenarios.md +176 -0
- package/dist/skills/data-scientist/references/execution-templates.md +197 -0
- package/dist/skills/data-scientist/references/integration-patterns.md +153 -0
- package/dist/skills/data-scientist/references/performance-benchmarks.md +37 -0
- package/dist/skills/data-scientist/references/uv-setup.md +78 -0
- package/dist/skills/data-scientist/scripts/quick-query.py +111 -0
- package/dist/skills/data-scientist/scripts/setup-uv.ps1 +53 -0
- package/dist/skills/data-scientist/scripts/setup-uv.sh +60 -0
- package/dist/skills/debugging/SKILL.md +1 -1
- package/dist/skills/programming/SKILL.md +1 -2
- 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 +2 -2
- 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 +128 -12
- package/dist/tools/delegate-task/builtin-categories.d.ts +1 -0
- package/dist/tools/delegate-task/builtin-category-definition.d.ts +1 -0
- package/dist/tools/delegate-task/constants.d.ts +1 -1
- package/dist/tui.js +1271 -1108
- package/docs/reference/web-terminal-visual-qa.md +1 -1
- package/package.json +27 -19
- package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +2 -2
- 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 +289 -95
- 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 +385 -64
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +336 -47
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +6 -0
- 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/dist/cli.js +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/rules/src/post-compact-budget.ts +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 +2 -2
- 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 +8 -2
- 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/coding-agent-sessions/SKILL.md +4 -3
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +3 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +140 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +3 -0
- package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +243 -0
- package/packages/omo-codex/plugin/skills/data-scientist/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +176 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +197 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +153 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +37 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +78 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/quick-query.py +111 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/setup-uv.ps1 +53 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/setup-uv.sh +60 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +1 -2
- 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 +2 -2
- 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 +127 -12
- 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 +9 -2
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +12 -0
- 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 +138 -65
- 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/coding-agent-sessions/SKILL.md +4 -3
- package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +3 -1
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +140 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +3 -0
- package/packages/shared-skills/skills/data-scientist/SKILL.md +243 -0
- package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +176 -0
- package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +197 -0
- package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +153 -0
- package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +37 -0
- package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +78 -0
- package/packages/shared-skills/skills/data-scientist/scripts/quick-query.py +111 -0
- package/packages/shared-skills/skills/data-scientist/scripts/setup-uv.ps1 +53 -0
- package/packages/shared-skills/skills/data-scientist/scripts/setup-uv.sh +60 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +1 -1
- package/packages/shared-skills/skills/programming/SKILL.md +1 -2
- 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 +2 -2
- 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 +128 -12
- package/postinstall.mjs +6 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# Integration Patterns: DuckDB ↔ Polars
|
|
2
|
+
|
|
3
|
+
## Zero-Copy Conversions (FASTEST)
|
|
4
|
+
|
|
5
|
+
### DuckDB → Polars (Recommended)
|
|
6
|
+
|
|
7
|
+
```python
|
|
8
|
+
import duckdb
|
|
9
|
+
import polars as pl
|
|
10
|
+
|
|
11
|
+
# Direct conversion with .pl() - zero-copy via Arrow
|
|
12
|
+
df_polars = duckdb.sql("""
|
|
13
|
+
SELECT * FROM 'data.parquet'
|
|
14
|
+
WHERE amount > 100
|
|
15
|
+
""").pl() # Returns Polars DataFrame directly
|
|
16
|
+
|
|
17
|
+
# Lazy version for large datasets
|
|
18
|
+
lazy_df = duckdb.sql("SELECT * FROM 'data.parquet'").pl(lazy=True)
|
|
19
|
+
result = lazy_df.filter(pl.col('status') == 'active').collect()
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Polars → DuckDB (Direct Reference)
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
import duckdb
|
|
26
|
+
import polars as pl
|
|
27
|
+
|
|
28
|
+
# DuckDB can query Polars DataFrames directly by name
|
|
29
|
+
df = pl.read_parquet('data.parquet')
|
|
30
|
+
|
|
31
|
+
result = duckdb.sql("""
|
|
32
|
+
SELECT category, SUM(amount) as total
|
|
33
|
+
FROM df
|
|
34
|
+
GROUP BY category
|
|
35
|
+
ORDER BY total DESC
|
|
36
|
+
""").pl() # Query df directly, return as Polars
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Via Arrow (When Needed)
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
# Polars → Arrow → DuckDB
|
|
43
|
+
df_polars = pl.read_csv('data.csv')
|
|
44
|
+
duckdb.register('my_table', df_polars.to_arrow())
|
|
45
|
+
|
|
46
|
+
# DuckDB → Arrow → Polars
|
|
47
|
+
arrow_table = duckdb.sql("SELECT * FROM data").arrow()
|
|
48
|
+
df_polars = pl.from_arrow(arrow_table)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## WRONG vs RIGHT Patterns
|
|
52
|
+
|
|
53
|
+
### ❌ NEVER - Using Pandas
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
# FORBIDDEN - decisively slower than Polars/DuckDB on every operation!
|
|
57
|
+
import pandas as pd
|
|
58
|
+
df = pd.read_csv('data.csv')
|
|
59
|
+
result = df.groupby('category')['amount'].sum()
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### ✅ CORRECT - DuckDB for simple aggregation query
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
import duckdb
|
|
66
|
+
# Direct file query - no memory loading!
|
|
67
|
+
result = duckdb.sql("""
|
|
68
|
+
SELECT category, SUM(amount) as total
|
|
69
|
+
FROM 'data.csv'
|
|
70
|
+
GROUP BY category
|
|
71
|
+
""").pl() # Fast, memory-efficient
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### ❌ NEVER - Loading file before DuckDB query
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
# WRONG - Unnecessary memory usage
|
|
78
|
+
import polars as pl
|
|
79
|
+
import duckdb
|
|
80
|
+
df = pl.read_csv('data.csv') # Loads entire file
|
|
81
|
+
result = duckdb.sql("SELECT * FROM df WHERE amount > 100").pl()
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### ✅ CORRECT - Let DuckDB query directly
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
import duckdb
|
|
88
|
+
# DuckDB queries file directly - much faster!
|
|
89
|
+
result = duckdb.sql("""
|
|
90
|
+
SELECT * FROM 'data.csv'
|
|
91
|
+
WHERE amount > 100
|
|
92
|
+
""").pl()
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### ❌ NEVER - Eager evaluation in Polars
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
# WRONG - Loads everything immediately
|
|
99
|
+
import polars as pl
|
|
100
|
+
df = pl.read_csv('large_data.csv') # Eager load
|
|
101
|
+
filtered = df.filter(pl.col('value') > 100)
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### ✅ CORRECT - Lazy evaluation
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
import polars as pl
|
|
108
|
+
# Lazy - builds query plan, optimizes, executes once
|
|
109
|
+
df = pl.scan_csv('large_data.csv') # Lazy
|
|
110
|
+
result = (
|
|
111
|
+
df
|
|
112
|
+
.filter(pl.col('value') > 100)
|
|
113
|
+
.groupby('category')
|
|
114
|
+
.agg(pl.sum('value'))
|
|
115
|
+
.collect() # Execute optimized plan
|
|
116
|
+
)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### ❌ NEVER - Unnecessary Conversions
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
# WASTEFUL (DuckDB → Pandas → Polars)
|
|
123
|
+
import duckdb, pandas as pd, polars as pl
|
|
124
|
+
df_pd = duckdb.sql("SELECT * FROM 'data.csv'").df() # requires pandas - the skill never ships it
|
|
125
|
+
df_pl = pl.from_pandas(df_pd)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### ✅ CORRECT - Direct conversion
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
# DIRECT (DuckDB → Polars via Arrow)
|
|
132
|
+
import duckdb
|
|
133
|
+
df_pl = duckdb.sql("SELECT * FROM 'data.csv'").pl()
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### ❌ NEVER - Wrong tool for heavy filtering
|
|
137
|
+
|
|
138
|
+
```python
|
|
139
|
+
# SLOW (DuckDB not optimal for filtering)
|
|
140
|
+
import duckdb
|
|
141
|
+
result = duckdb.sql("""
|
|
142
|
+
SELECT * FROM 'huge.csv'
|
|
143
|
+
WHERE complex_filter = true
|
|
144
|
+
""").pl()
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### ✅ CORRECT - Use Polars for filtering
|
|
148
|
+
|
|
149
|
+
```python
|
|
150
|
+
# FAST (Polars 128x faster for filtering)
|
|
151
|
+
import polars as pl
|
|
152
|
+
result = pl.scan_csv('huge.csv').filter(pl.col('complex_filter')).collect()
|
|
153
|
+
```
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Performance Benchmarks
|
|
2
|
+
|
|
3
|
+
Routing heuristics distilled from public 2024-2025 results in the [db-benchmark suite](https://github.com/h2oai/db-benchmark) (rendered at [h2oai.github.io/db-benchmark](https://h2oai.github.io/db-benchmark/)) and from the vendors' own documentation ([duckdb.org](https://duckdb.org/), [pola.rs](https://pola.rs/)).
|
|
4
|
+
|
|
5
|
+
**Read these as routing guidance, not guarantees.** Multipliers vary with dataset size, cardinality, data types, and hardware. When the choice materially matters, measure on the actual data.
|
|
6
|
+
|
|
7
|
+
## Operation Performance Comparison
|
|
8
|
+
|
|
9
|
+
| Operation Type | Winner | Indicative advantage | When to Use |
|
|
10
|
+
|---------------------|-------------|----------------------|------------------------------------------------|
|
|
11
|
+
| **Filtering** | **Polars** | often the fastest by a wide margin (SIMD, predicate pushdown) | Single-table filters |
|
|
12
|
+
| **Sorting** | **Polars** | typically the fastest | ORDER BY operations, ranking |
|
|
13
|
+
| **Joins** | **DuckDB** | typically faster; richer join types | Multi-table joins, especially complex joins |
|
|
14
|
+
| **Aggregations** | **DuckDB** | typically faster on large datasets | GROUP BY, complex aggregations |
|
|
15
|
+
| **Window Funcs** | **Polars** | typically faster | RANK, LAG/LEAD, running totals |
|
|
16
|
+
| **Transformations** | **Polars** | typically faster | Pivot, melt, string operations |
|
|
17
|
+
| **Direct Query** | **DuckDB** | avoids loading to memory entirely | Ad-hoc exploration without loading to memory |
|
|
18
|
+
| **Streaming** | **Polars** | handles datasets larger than RAM | Datasets larger than RAM |
|
|
19
|
+
|
|
20
|
+
Both tools are decisively faster than pandas on 1M+ row workloads, which is why pandas is banned outright in this skill.
|
|
21
|
+
|
|
22
|
+
## Operation Detection Keywords
|
|
23
|
+
|
|
24
|
+
Automatically detect operation types from user requests:
|
|
25
|
+
|
|
26
|
+
- **Filter**: "where", "filter", "condition", "select rows", "find"
|
|
27
|
+
- **Sort**: "sort", "order", "top", "bottom", "rank"
|
|
28
|
+
- **Join**: "join", "merge", "combine tables"
|
|
29
|
+
- **Aggregate**: "group", "sum", "avg", "count", "mean", "total", "aggregate"
|
|
30
|
+
- **Transform**: "pivot", "melt", "reshape", "string operations", "clean", "transform"
|
|
31
|
+
- **Window**: "running", "cumulative", "lag", "lead", "rank", "partition"
|
|
32
|
+
|
|
33
|
+
## Benchmarking Notes
|
|
34
|
+
|
|
35
|
+
- Public suites exercise typical analytical workloads (1M-100M rows).
|
|
36
|
+
- Performance advantages are approximate and vary by dataset characteristics.
|
|
37
|
+
- Real-world performance depends on data types, cardinality, and hardware.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# uv Setup — Per-Platform
|
|
2
|
+
|
|
3
|
+
This skill runs every data operation through `uv run --with ...`. If `uv --version` fails, set uv up with the automated scripts or the manual commands below, then verify.
|
|
4
|
+
|
|
5
|
+
## Automated (recommended)
|
|
6
|
+
|
|
7
|
+
| Platform | Command |
|
|
8
|
+
|---|---|
|
|
9
|
+
| macOS / Linux / WSL / Git Bash | `bash scripts/setup-uv.sh` |
|
|
10
|
+
| Windows (PowerShell) | `powershell -ExecutionPolicy Bypass -File scripts/setup-uv.ps1` |
|
|
11
|
+
|
|
12
|
+
Both scripts: detect OS + architecture → install uv to the latest release when missing → upgrade it when present (`uv self update`) → make it resolvable for the current shell → verify with `uv --version`. They are idempotent — safe to re-run any time.
|
|
13
|
+
|
|
14
|
+
## Manual install per platform
|
|
15
|
+
|
|
16
|
+
### macOS
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh # official installer → ~/.local/bin/uv
|
|
20
|
+
# or, with Homebrew:
|
|
21
|
+
brew install uv
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Linux (x86_64 / aarch64)
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh # official installer → ~/.local/bin/uv
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The installer detects glibc vs musl and downloads the right static binary. On minimal containers, ensure `curl` (or `wget`) exists; `wget -qO- https://astral.sh/uv/install.sh | sh` is the fallback.
|
|
31
|
+
|
|
32
|
+
### Windows (native)
|
|
33
|
+
|
|
34
|
+
```powershell
|
|
35
|
+
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
|
|
36
|
+
# or, with winget:
|
|
37
|
+
winget install --id=astral-sh.uv -e
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Windows Subsystem for Linux / Git Bash
|
|
41
|
+
|
|
42
|
+
Use the Linux/macOS installer inside the Unix shell, not the PowerShell installer:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### CI
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
# GitHub Actions
|
|
52
|
+
- uses: astral-sh/setup-uv@v5
|
|
53
|
+
# or plain shell anywhere:
|
|
54
|
+
- run: curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## PATH notes
|
|
58
|
+
|
|
59
|
+
- The official installers put the binary in `~/.local/bin` (Unix) or `%USERPROFILE%\.local\bin` (Windows). New shells get it automatically on most setups; an already-open shell needs `export PATH="$HOME/.local/bin:$PATH"` (Unix) or `$env:Path = "$env:USERPROFILE\.local\bin;$env:Path"` (PowerShell) once.
|
|
60
|
+
- Homebrew and winget install into their own prefixes that are already on PATH.
|
|
61
|
+
|
|
62
|
+
## Upgrade to latest
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
uv self update
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`uv self update` only works for official-installer binaries; Homebrew/winget installs upgrade through their package manager (`brew upgrade uv` / `winget upgrade astral-sh.uv`). The setup scripts handle this automatically.
|
|
69
|
+
|
|
70
|
+
## Verify
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
uv --version
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Offline / air-gapped
|
|
77
|
+
|
|
78
|
+
Download the matching archive from the uv GitHub releases page, extract it, and put the `uv` binary anywhere on PATH. `uv run --with <pkg>` still needs network for first-time package resolution unless a mirror is configured via `UV_INDEX_URL`.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env -S uv run --script
|
|
2
|
+
# /// script
|
|
3
|
+
# requires-python = ">=3.11"
|
|
4
|
+
# dependencies = [
|
|
5
|
+
# "duckdb",
|
|
6
|
+
# "polars",
|
|
7
|
+
# "numpy",
|
|
8
|
+
# "pyarrow",
|
|
9
|
+
# "typer",
|
|
10
|
+
# "rich",
|
|
11
|
+
# ]
|
|
12
|
+
# ///
|
|
13
|
+
|
|
14
|
+
"""Quick data query runner. SQL arg -> DuckDB; --filter (Polars SQL) -> Polars; --describe -> schema + stats."""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
import typer
|
|
21
|
+
from rich import print as rprint
|
|
22
|
+
from rich.table import Table
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _run_duckdb(file_path: Path, sql: str) -> None:
|
|
26
|
+
import duckdb
|
|
27
|
+
|
|
28
|
+
table_ref = f"'{file_path}'"
|
|
29
|
+
stem = file_path.stem
|
|
30
|
+
query = sql
|
|
31
|
+
for alias in ("data", "df", stem):
|
|
32
|
+
query = query.replace(f"FROM {alias} ", f"FROM {table_ref} ")
|
|
33
|
+
query = query.replace(f"FROM {alias}\n", f"FROM {table_ref}\n")
|
|
34
|
+
query = query.replace(f"from {alias} ", f"from {table_ref} ")
|
|
35
|
+
query = query.replace(f"from {alias}\n", f"from {table_ref}\n")
|
|
36
|
+
if query.endswith(f"FROM {alias}") or query.endswith(f"from {alias}"):
|
|
37
|
+
query = query[: -len(alias)] + table_ref
|
|
38
|
+
|
|
39
|
+
result = duckdb.sql(query)
|
|
40
|
+
df = result.pl()
|
|
41
|
+
_print_polars(df)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _run_polars_filter(file_path: Path, expr: str) -> None:
|
|
45
|
+
import polars as pl
|
|
46
|
+
|
|
47
|
+
df = _read_file(file_path)
|
|
48
|
+
filtered = df.filter(pl.sql_expr(expr))
|
|
49
|
+
_print_polars(filtered)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _run_describe(file_path: Path) -> None:
|
|
53
|
+
df = _read_file(file_path)
|
|
54
|
+
|
|
55
|
+
rprint(f"\n[bold]Schema:[/bold] {file_path.name} ({len(df)} rows × {len(df.columns)} cols)")
|
|
56
|
+
for name, dtype in zip(df.columns, df.dtypes):
|
|
57
|
+
rprint(f" {name}: [cyan]{dtype}[/cyan]")
|
|
58
|
+
|
|
59
|
+
rprint("\n[bold]Statistics:[/bold]")
|
|
60
|
+
_print_polars(df.describe())
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _read_file(file_path: Path): # noqa: ANN202
|
|
64
|
+
import polars as pl
|
|
65
|
+
|
|
66
|
+
suffix = file_path.suffix.lower()
|
|
67
|
+
if suffix == ".csv":
|
|
68
|
+
return pl.read_csv(file_path)
|
|
69
|
+
if suffix == ".parquet":
|
|
70
|
+
return pl.read_parquet(file_path)
|
|
71
|
+
if suffix == ".json":
|
|
72
|
+
return pl.read_json(file_path)
|
|
73
|
+
if suffix in (".jsonl", ".ndjson"):
|
|
74
|
+
return pl.read_ndjson(file_path)
|
|
75
|
+
rprint(f"[red]Unsupported format:[/red] {suffix} (Excel: export to CSV or Parquet first)")
|
|
76
|
+
raise SystemExit(1)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _print_polars(df) -> None: # noqa: ANN001
|
|
80
|
+
table = Table(show_lines=False)
|
|
81
|
+
for col_name in df.columns:
|
|
82
|
+
table.add_column(col_name)
|
|
83
|
+
for row in df.iter_rows():
|
|
84
|
+
table.add_row(*(str(v) for v in row))
|
|
85
|
+
rprint(table)
|
|
86
|
+
rprint(f"[dim]{df.shape[0]} rows × {df.shape[1]} cols[/dim]")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def main(
|
|
90
|
+
file: Path = typer.Argument(help="Data file (csv, parquet, json, ndjson)"),
|
|
91
|
+
sql: str = typer.Argument(None, help="SQL query (uses DuckDB). Use 'data' as table name."),
|
|
92
|
+
filter_expr: str = typer.Option(None, "--filter", "-f", help="Polars SQL filter, e.g. 'amount > 100'"),
|
|
93
|
+
describe: bool = typer.Option(False, "--describe", "-d", help="Print schema + stats"),
|
|
94
|
+
) -> None:
|
|
95
|
+
"""Query data files with DuckDB (SQL) or Polars (SQL filter expressions)."""
|
|
96
|
+
if not file.exists():
|
|
97
|
+
rprint(f"[red]File not found:[/red] {file}")
|
|
98
|
+
raise SystemExit(1)
|
|
99
|
+
|
|
100
|
+
if describe:
|
|
101
|
+
_run_describe(file)
|
|
102
|
+
elif filter_expr:
|
|
103
|
+
_run_polars_filter(file, filter_expr)
|
|
104
|
+
elif sql:
|
|
105
|
+
_run_duckdb(file, sql)
|
|
106
|
+
else:
|
|
107
|
+
_run_describe(file)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
if __name__ == "__main__":
|
|
111
|
+
typer.run(main)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
[CmdletBinding()]
|
|
2
|
+
param()
|
|
3
|
+
Set-StrictMode -Version Latest
|
|
4
|
+
$ErrorActionPreference = 'Stop'
|
|
5
|
+
|
|
6
|
+
function Write-Step([string]$Message) { Write-Host "[setup-uv] $Message" }
|
|
7
|
+
|
|
8
|
+
Write-Step "detected os=$([System.Runtime.InteropServices.RuntimeInformation]::OSDescription) arch=$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)"
|
|
9
|
+
|
|
10
|
+
$uv = Get-Command uv -ErrorAction SilentlyContinue
|
|
11
|
+
if ($null -ne $uv) {
|
|
12
|
+
$current = (& uv --version) | Select-Object -First 1
|
|
13
|
+
Write-Step "uv already installed ($current) - upgrading"
|
|
14
|
+
& uv self update 2>$null
|
|
15
|
+
if ($LASTEXITCODE -ne 0) {
|
|
16
|
+
Write-Step "uv self update unavailable (package-manager install) - trying winget"
|
|
17
|
+
if (Get-Command winget -ErrorAction SilentlyContinue) {
|
|
18
|
+
& winget upgrade --id=astral-sh.uv -e --accept-source-agreements --accept-package-agreements 2>$null
|
|
19
|
+
if ($LASTEXITCODE -ne 0) { & winget install --id=astral-sh.uv -e --accept-source-agreements --accept-package-agreements }
|
|
20
|
+
} else {
|
|
21
|
+
Write-Step "no winget; keeping current uv (already functional)"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
} else {
|
|
25
|
+
Write-Step "uv not found - installing latest via the official installer"
|
|
26
|
+
$installed = $false
|
|
27
|
+
try {
|
|
28
|
+
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
|
|
29
|
+
$installed = $true
|
|
30
|
+
} catch {
|
|
31
|
+
Write-Step "official installer failed ($($_.Exception.Message)) - trying winget"
|
|
32
|
+
if (Get-Command winget -ErrorAction SilentlyContinue) {
|
|
33
|
+
& winget install --id=astral-sh.uv -e --accept-source-agreements --accept-package-agreements
|
|
34
|
+
$installed = ($LASTEXITCODE -eq 0)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (-not $installed -and $null -eq (Get-Command uv -ErrorAction SilentlyContinue)) {
|
|
38
|
+
Write-Step "FAIL: could not install uv - install it manually per references/uv-setup.md"
|
|
39
|
+
exit 1
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if ($null -eq (Get-Command uv -ErrorAction SilentlyContinue)) {
|
|
44
|
+
$localBin = Join-Path $env:USERPROFILE '.local\bin'
|
|
45
|
+
if (Test-Path (Join-Path $localBin 'uv.exe')) { $env:Path = "$localBin;$env:Path" }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if ($null -eq (Get-Command uv -ErrorAction SilentlyContinue)) {
|
|
49
|
+
Write-Step "FAIL: uv still not on PATH after install - add %USERPROFILE%\.local\bin to PATH and retry"
|
|
50
|
+
exit 1
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
Write-Step "OK: $((& uv --version) | Select-Object -First 1)"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
log() { printf '[setup-uv] %s\n' "$*"; }
|
|
5
|
+
|
|
6
|
+
os="$(uname -s 2>/dev/null || echo unknown)"
|
|
7
|
+
arch="$(uname -m 2>/dev/null || echo unknown)"
|
|
8
|
+
log "detected os=${os} arch=${arch}"
|
|
9
|
+
|
|
10
|
+
case "$os" in
|
|
11
|
+
Darwin|Linux) ;;
|
|
12
|
+
MINGW*|MSYS*|CYGWIN*)
|
|
13
|
+
log "Git Bash / MSYS environment detected - installing the Windows build is not supported here."
|
|
14
|
+
log "Use the Linux installer inside WSL, or run scripts/setup-uv.ps1 in PowerShell instead."
|
|
15
|
+
exit 1
|
|
16
|
+
;;
|
|
17
|
+
*)
|
|
18
|
+
log "unsupported OS: ${os} - see references/uv-setup.md for manual steps."
|
|
19
|
+
exit 1
|
|
20
|
+
;;
|
|
21
|
+
esac
|
|
22
|
+
|
|
23
|
+
if command -v uv >/dev/null 2>&1; then
|
|
24
|
+
current="$(uv --version 2>/dev/null | head -n1)"
|
|
25
|
+
log "uv already installed (${current}) - upgrading"
|
|
26
|
+
if uv self update >/dev/null 2>&1; then
|
|
27
|
+
log "uv self update succeeded"
|
|
28
|
+
else
|
|
29
|
+
log "uv self update unavailable (package-manager install) - trying Homebrew"
|
|
30
|
+
if command -v brew >/dev/null 2>&1; then
|
|
31
|
+
brew upgrade uv >/dev/null 2>&1 || brew install uv
|
|
32
|
+
else
|
|
33
|
+
log "no Homebrew; keeping current uv (already functional)"
|
|
34
|
+
fi
|
|
35
|
+
fi
|
|
36
|
+
else
|
|
37
|
+
log "uv not found - installing latest via the official installer"
|
|
38
|
+
if command -v curl >/dev/null 2>&1; then
|
|
39
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
40
|
+
elif command -v wget >/dev/null 2>&1; then
|
|
41
|
+
wget -qO- https://astral.sh/uv/install.sh | sh
|
|
42
|
+
elif command -v brew >/dev/null 2>&1; then
|
|
43
|
+
log "no curl/wget - installing via Homebrew"
|
|
44
|
+
brew install uv
|
|
45
|
+
else
|
|
46
|
+
log "neither curl, wget, nor brew available - install one of them and re-run."
|
|
47
|
+
exit 1
|
|
48
|
+
fi
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
if ! command -v uv >/dev/null 2>&1; then
|
|
52
|
+
export PATH="$HOME/.local/bin:$PATH"
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
if ! command -v uv >/dev/null 2>&1; then
|
|
56
|
+
log "FAIL: uv still not on PATH after install - add \$HOME/.local/bin to PATH and retry."
|
|
57
|
+
exit 1
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
log "OK: $(uv --version)"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: debugging
|
|
3
|
-
description: "MUST USE for any real runtime debugging across ANY language or binary — crashes, silent failures, wrong responses, stuck processes, memory leaks, async misbehavior, unexplained timing, reverse engineering. Runs a hypothesis-driven loop: form ≥3 hypotheses, investigate in parallel, after 2 failed rounds spawn Oracles from orthogonal angles, confirm root cause, lock with a failing test, fix minimally, QA by actually USING the system, scrub artifacts. The actual HOW lives in `references/` — READ THEM. Triggers: 'debug this', 'why is X not working', 'hanging', 'attach a debugger', 'reverse engineer', 'pwndbg', 'gdb', 'lldb', 'node inspect', '
|
|
3
|
+
description: "MUST USE for any real runtime debugging across ANY language or binary — crashes, silent failures, wrong responses, stuck processes, memory leaks, async misbehavior, unexplained timing, reverse engineering. Runs a hypothesis-driven loop: form ≥3 hypotheses, investigate in parallel, after 2 failed rounds spawn Oracles from orthogonal angles, confirm root cause, lock with a failing test, fix minimally, QA by actually USING the system, scrub artifacts. The actual HOW lives in `references/` — READ THEM. Triggers: 'debug this', 'why is X not working', 'hanging', 'attach a debugger', 'reverse engineer', 'pwndbg', 'gdb', 'lldb', 'node inspect', 'pdb', 'dlv', 'delve', 'rust-gdb', 'set a breakpoint', 'context window exploded', 'why is the response empty', 'why is this happening', 'trace this bug', 'reproduce and fix', 'silent failure', 'HTTP 200 but empty', 'why did it stop', 'inspect the binary', 'playwright', 'flaky test', 'fails intermittently', 'passes in isolation', 'only fails in CI'."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Debugging
|
|
@@ -238,8 +238,7 @@ Logging is part of the code you ship, and it has iron rules of its own: levels c
|
|
|
238
238
|
## DEPENDENCY UPGRADES — CROSS-CUTTING RULES
|
|
239
239
|
|
|
240
240
|
- **`0.x` minor = major.** Semver promises nothing below 1.0: treat `0.N → 0.N+1` as a breaking upgrade — read the changelog, build, and run the full suite before trusting it. A required field appearing in a public options type is a routine `0.x` "minor".
|
|
241
|
-
- **Version literals live outside the manifest.** Before committing a bump, grep the repo for the old version string: Dockerfiles pinning a global CLI, CI workflows,
|
|
242
|
-
- **Pin-parity contract tests are a pattern, not a nuisance.** A small test asserting the lockfile-resolved version equals the deploy artifact's pin (Dockerfile, image tag) turns silent drift into a red test. If the project has one, update it deliberately; if the bump reveals unguarded drift, add the test with the bump.
|
|
241
|
+
- **Version literals live outside the manifest.** Before committing a bump, grep the repo for the old version string: Dockerfiles pinning a global CLI, CI workflows, and docs all carry copies. A bump that updates only the package manifest ships a split-brain deploy.
|
|
243
242
|
- **Never hand-merge a lockfile.** On conflict, take either side whole and regenerate with the package manager — the resolver owns that file, not you.
|
|
244
243
|
|
|
245
244
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: start-work
|
|
3
|
-
description: "Execute a Prometheus work plan
|
|
3
|
+
description: "Execute a Prometheus work plan with Boulder state, evidence ledger updates, worktree discipline, parallel subagents, and Stop-hook continuation. Use after planning when the user says start work, execute plan, continue plan, resume plan, or asks to run a .omo/plans plan."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
## Codex Harness Tool Compatibility
|
|
@@ -29,8 +29,8 @@ For work likely to exceed one wait cycle, require the child to send `WORKING: <t
|
|
|
29
29
|
|
|
30
30
|
**YOU DO NOT WRITE CODE. YOU DO NOT EDIT PRODUCT FILES. YOU DO NOT RUN QA YOURSELF. EVERY unit of implementation, test, QA, and review work MUST be delegated to a spawned subagent. NO EXCEPTIONS.** Your hands touch only plan selection, `.omo/` state (Boulder, ledger, plan checkboxes), decomposition, dispatch, verdicts, and evidence records. About to edit a product file or run an implementation command yourself? **STOP. SPAWN A WORKER INSTEAD.** Orchestrate at **MAXIMUM PARALLELISM**: every independent unit runs concurrently; only named dependencies serialize.
|
|
31
31
|
|
|
32
|
-
###
|
|
33
|
-
When tier worker agents are installed
|
|
32
|
+
### Codex tier mapping for the delegation router
|
|
33
|
+
When tier worker agents are installed, map the delegation router's parenthesized difficulty to `agent_type`: (low) -> `lazycodex-worker-low`; (medium) -> `lazycodex-worker-medium`; (high) -> `lazycodex-worker-high`. Explorer/librarian research lanes keep their own roles. On spawn surfaces without `agent_type`, state the tier inside `message`. Difficulty (model power) is orthogonal to the LIGHT/HEAVY rigor tier in step 4 — judge each on its own facts.
|
|
34
34
|
|
|
35
35
|
## Codex Subagent Reliability
|
|
36
36
|
|
|
@@ -40,7 +40,7 @@ Plan and reviewer agents may run for a long time: spawn them in the background a
|
|
|
40
40
|
|
|
41
41
|
# start-work
|
|
42
42
|
|
|
43
|
-
Execute a Prometheus work plan until every top-level checkbox is complete. This skill pairs with the
|
|
43
|
+
Execute a Prometheus work plan until every top-level checkbox is complete. This skill pairs with the harness's start-work continuation hook, which re-injects the next turn while `.omo/boulder.json` says this `codex:<session_id>` still has unchecked plan work.
|
|
44
44
|
|
|
45
45
|
## Usage
|
|
46
46
|
|
|
@@ -104,14 +104,58 @@ Write `.omo/boulder.json` before implementation starts. Prefix session ids with
|
|
|
104
104
|
|
|
105
105
|
For PR/branch work, a task-owned worktree is mandatory before implementation starts: pass `--worktree`, or use `--make-pr`/`--ship`, which auto-create one. Verify the path with `git worktree list --porcelain` or create it with `git worktree add <path> <branch-or-HEAD>`, then store the absolute path as `worktree_path`. All edits, commands, tests, and evidence capture must run inside that worktree.
|
|
106
106
|
|
|
107
|
+
## Parallel delivery lanes (teams and worktrees)
|
|
108
|
+
|
|
109
|
+
Solo orchestration with parallel background workers is the default topology. Decide once, when the wave's lanes are known, and record the verdict in the ledger:
|
|
110
|
+
|
|
111
|
+
- **Independent lanes -> parallel workers.** Separate files, no shared contract: one parallel spawn burst; no team.
|
|
112
|
+
- **Overlapping lanes -> a team.** The lanes touch the same module or contract AND running them concurrently actually finishes sooner: stand up a team (where the harness has one) so one lane's discoveries relay through you mid-flight.
|
|
113
|
+
- **PR-mode independent lanes -> a worktree per lane.** Under `--make-pr`/`--ship`, when a wave holds independent checkboxes, give each lane its own branch and task-owned worktree, delivered as its own PR.
|
|
114
|
+
|
|
115
|
+
Landing rules, regardless of topology:
|
|
116
|
+
|
|
117
|
+
- **Merge per verified unit.** A lane lands the moment its own gates pass — it never waits for the slowest sibling. Integrate landed work back into the base the remaining lanes branch from.
|
|
118
|
+
- **Only the orchestrator merges.** Workers and team members never merge and never push the base branch.
|
|
119
|
+
- **Conflicts are the orchestrator's job.** Decide the landing order and tell the later lane what changed; a worker never resolves a sibling's conflict blind.
|
|
120
|
+
|
|
107
121
|
## Phase 3: Execute the next checkbox
|
|
108
122
|
|
|
109
123
|
1. Read the full selected plan.
|
|
110
124
|
2. Find the first unchecked column-0 checkbox in `## TODOs` or `## Final Verification Wave`.
|
|
111
125
|
3. Ignore nested checkboxes under acceptance criteria, evidence, and definition-of-done sections.
|
|
112
126
|
4. Classify the checkbox tier and record it in its ledger entry. Default is LIGHT — a narrow change inside existing layers. Take HEAVY only on a fact you can point to: a new module / abstraction / domain model; auth, security, or session; an external integration; a DB schema or migration; concurrency or transaction boundaries; a cross-domain refactor; or the plan or user signals care. When unsure, take HEAVY; upgrade and redo skipped gates the moment a HEAVY fact surfaces; never downgrade.
|
|
113
|
-
5. Decompose that checkbox into atomic sub-tasks. Collect every other unchecked checkbox in the same plan wave whose dependencies are met — their lanes execute concurrently.
|
|
114
|
-
6. **DELEGATE EVERYTHING. YOU NEVER IMPLEMENT.**
|
|
127
|
+
5. Decompose that checkbox into atomic sub-tasks sized for ONE worker in ONE run — a sub-task that would need mid-flight steering is two sub-tasks. Collect every other unchecked checkbox in the same plan wave whose dependencies are met — their lanes execute concurrently. A wave that could split further but holds fewer than 3 independent sub-tasks is under-split.
|
|
128
|
+
6. **DELEGATE EVERYTHING. YOU NEVER IMPLEMENT.** Route every sub-task through the delegation router below, then dispatch ALL independent sub-tasks across those checkboxes in one parallel worker-spawn burst (a single batched spawn call where the harness supports it); serialize only named dependencies. Verification and checkbox marking stay per-checkbox.
|
|
129
|
+
7. Give every dispatched sub-task its completion condition and watch for it per the section below. A dispatch whose completion nobody watches is an unfinished dispatch.
|
|
130
|
+
|
|
131
|
+
### Monitor every dispatched subagent to its completion condition
|
|
132
|
+
|
|
133
|
+
A spawned worker is not fire-and-forget. For EACH subagent in the burst, name the observable state that ends its lane — the file written, the PR opened, the checkbox's gates green — and put a watcher on THAT state, never on a clock.
|
|
134
|
+
|
|
135
|
+
- **Arm one watcher per lane, at spawn time.** The worker's own completion arrives on its own as an injected notification; arm an explicit `monitor` on top of it only when the lane's completion condition lives OUTSIDE the child's final message — CI turning green, a log line, a build artifact appearing, a branch landing. Watch the state itself (`monitor` with a command that exits or emits on that condition), and keep the burst's watchers distinct so one lane firing never reads as another's.
|
|
136
|
+
- **NEVER poll and NEVER sleep.** No `sleep`, no timed retry loop, no re-reading the same status hoping it changed. Between waves, do independent root work or end the turn; an idle session is always woken. A single `task_output({ mode: "tail" })` peek is allowed only when a midpoint decision genuinely depends on it.
|
|
137
|
+
- **Tear the watcher down the instant it resolves.** The moment a monitor fires, or you discover it was armed on the WRONG condition (it watches a path the lane never touches, a pattern that can never match, a lane you already cancelled), stop it with `kill_bash` and say so in the ledger. A stale watcher re-fires on unrelated output and corrupts the next wave's verdict.
|
|
138
|
+
- **Then advance.** Fired watcher plus verified evidence means that lane's gates run and its checkbox closes; a mis-set watcher means re-arm it on the right condition or drop it, and continue. Never let a dead watcher hold the run open, and never treat watcher silence as a pass.
|
|
139
|
+
|
|
140
|
+
### Delegation router — recommended task executor category
|
|
141
|
+
|
|
142
|
+
When the plan annotates a todo with `Recommended task executor category:`, follow that annotation; deviate only for a reason recorded in the ledger entry. Otherwise route by shape, in the omo category vocabulary (category-capable harnesses pass it directly on the worker-spawn tool, e.g. `task(category="quick", ...)`; others map the parenthesized difficulty):
|
|
143
|
+
|
|
144
|
+
| Category | Route here |
|
|
145
|
+
| --- | --- |
|
|
146
|
+
| `quick` (low) | mechanical, single-file, boilerplate, config/copy — the default for every splittable piece |
|
|
147
|
+
| `unspecified-low` (low) | small tasks that fit no other category |
|
|
148
|
+
| `unspecified-high` (medium) | standard features across a few files with known patterns |
|
|
149
|
+
| `visual-engineering` (medium) | frontend, UI/UX, styling, animation |
|
|
150
|
+
| `writing` (low) | documentation and prose |
|
|
151
|
+
| `git` (low) | git operations |
|
|
152
|
+
| `deep` (high) | hairy debugging, research-heavy or subtle cross-module work |
|
|
153
|
+
| `ultrabrain` (high) | ONE genuinely hard, logic-heavy problem — hand it the goal, not step-by-step instructions |
|
|
154
|
+
|
|
155
|
+
Sizing is a two-branch decision made per checkbox, before dispatch:
|
|
156
|
+
|
|
157
|
+
- **Splittable work splits.** When the checkbox decomposes into independent pieces, dispatch them as a swarm of `quick`/`unspecified-low` workers in ONE parallel burst — many small cheap workers in parallel beat one large delegation.
|
|
158
|
+
- **Cohesive hard work stays whole.** When splitting would sever shared reasoning (one algorithm, one migration, one subtle bug), send the WHOLE problem to `deep` or `ultrabrain` as ONE delegation. Never force-split work whose parts share one insight.
|
|
115
159
|
|
|
116
160
|
Each sub-task message must include:
|
|
117
161
|
|
|
@@ -122,11 +166,12 @@ Each sub-task message must include:
|
|
|
122
166
|
5. One Manual-QA channel, named with the exact tool and exact invocation (the literal `curl`, `send-keys`, `browser:control-in-app-browser` action, `page.click`, payload, selectors, and the binary observable that decides PASS/FAIL), not "verify it works". A LIGHT checkbox needs one real-surface proof of its deliverable, and auxiliary surfaces (CLI stdout, DB state diff, parsed config dump) are first-class when the surface is CLI- or data-shaped:
|
|
123
167
|
- HTTP call: `curl -i` against the live endpoint.
|
|
124
168
|
- Terminal / TUI: drive a real pty; `tmux send-keys` is fine for a boot/behavior smoke, but color/layout/CJK evidence goes through the xterm.js web terminal below, NEVER `tmux capture-pane`.
|
|
125
|
-
- Browser use:
|
|
169
|
+
- Browser use: prefer the harness's in-app browser control when available and the scenario does not need an authenticated or persistent user browser profile; otherwise drive the real page with Chrome, or agent-browser (https://github.com/vercel-labs/agent-browser) when Chrome is unavailable.
|
|
126
170
|
- Computer use: OS-level GUI automation against the running desktop app when the surface is not a page.
|
|
127
171
|
- TUI visual evidence: when a TUI claim needs visual QA or PR proof, run `node script/qa/web-terminal-visual-qa.mjs --command "<cmd>" --input "{Enter}" --evidence-dir <dir>` (real pty rendered through xterm.js in Chrome) and attach `terminal.png` plus `metadata.json`.
|
|
128
172
|
6. The adversarial classes that apply to this sub-task (from the 9 ultraqa classes) and how each is probed.
|
|
129
173
|
7. Required artifact path and cleanup receipt.
|
|
174
|
+
8. Tool-use expectations: batch independent tool calls in parallel; when the harness exposes a code-execution surface (eval), use it for multi-call steps instead of one-by-one calls.
|
|
130
175
|
|
|
131
176
|
The 9 ultraqa classes are trigger-mapped: new input parsing → malformed input; untrusted external text → prompt injection; resumable or long-running flows → cancel/resume; generated or cached artifacts → stale state; uncommitted user files in scope → dirty worktree; long external commands → hung or long commands; new or timing-sensitive tests → flaky tests; log-based success claims → misleading success output; mid-operation interrupts → repeated interruptions. A class applies when its trigger fact holds. Probe each applicable class; record the rest as not-applicable with a one-line reason.
|
|
132
177
|
|
|
@@ -167,7 +212,7 @@ A worker done claim is never final: each implementation sub-task returns a `Done
|
|
|
167
212
|
|
|
168
213
|
Rules:
|
|
169
214
|
- `confirmed` is the only pass verdict. `false-positive`, `needs-fix`, and `needs-human-review` all block checkbox completion.
|
|
170
|
-
- The verifier must be independent from the executor: use
|
|
215
|
+
- The verifier must be independent from the executor: use the harness's gate reviewer (see the harness compatibility section) or a fresh reviewer worker on a strong model, or root only when root did not implement or materially rewrite that task.
|
|
171
216
|
- A worker done claim must be independently verified before it becomes checkbox completion.
|
|
172
217
|
- On any non-confirmed verdict, append the feedback to the ledger, reset the checkbox work to in-progress, and re-dispatch the executor with the exact failure.
|
|
173
218
|
- The verifier must probe the applicable adversarial keys, including `stale_state`, `dirty_worktree`, and `misleading_success_output`, before allowing `FullyDone`.
|
|
@@ -206,5 +251,5 @@ When all top-level checkboxes in `## TODOs` and `## Final Verification Wave` are
|
|
|
206
251
|
- No completion claim while an applicable ultraqa adversarial class was never probed. Each applicable class needs a captured observable result; each skipped class needs a one-line not-applicable reason in the ledger.
|
|
207
252
|
- No `ORCHESTRATION COMPLETE`, final response, PR creation, PR handoff, or merge before the Global Review and Debugging Gate passes with recorded evidence.
|
|
208
253
|
- No PR/branch implementation or review in the main worktree; create or use a task-owned git worktree first.
|
|
209
|
-
- No unprefixed session ids in Boulder state.
|
|
254
|
+
- No unprefixed session ids in Boulder state. Sessions are always recorded as `codex:<session_id>`.
|
|
210
255
|
- No stale-memory execution. The plan and ledger are the durable source of truth.
|