oh-my-opencode 4.12.0 → 4.13.0
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.md +1 -1
- package/THIRD-PARTY-NOTICES.md +1 -1
- package/dist/agents/sisyphus-agent-factory.d.ts +9 -0
- package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +31 -0
- package/dist/cli/index.js +916 -670
- package/dist/cli-node/index.js +916 -670
- package/dist/config/schema/codegraph.d.ts +1 -0
- package/dist/config/schema/oh-my-opencode-config.d.ts +2 -0
- package/dist/config/schema/runtime-fallback.d.ts +1 -0
- package/dist/features/background-agent/background-task-marker.d.ts +8 -0
- package/dist/features/background-agent/fallback-retry-handler.d.ts +1 -0
- package/dist/features/background-agent/manager.d.ts +1 -0
- package/dist/features/background-agent/parent-wake-dedupe.d.ts +1 -0
- package/dist/features/background-agent/parent-wake-notifier-types.d.ts +2 -0
- package/dist/features/background-agent/parent-wake-notifier.d.ts +1 -0
- package/dist/features/background-agent/parent-wake-window-recovery.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-dispatch.d.ts +2 -2
- package/dist/hooks/runtime-fallback/auto-retry-timeout.d.ts +2 -2
- package/dist/hooks/runtime-fallback/auto-retry.d.ts +1 -1
- package/dist/hooks/runtime-fallback/fallback-state-snapshot.d.ts +13 -0
- package/dist/hooks/runtime-fallback/types.d.ts +8 -0
- package/dist/index.js +1042 -640
- package/dist/oh-my-opencode.schema.json +8 -0
- package/dist/plugin/runtime-skill-resolver.d.ts +35 -0
- package/dist/plugin/skill-context.d.ts +9 -0
- package/dist/skills/frontend/ATTRIBUTION.md +32 -8
- package/dist/skills/frontend/references/design/airbnb.md +3 -0
- package/dist/skills/frontend/references/design/airtable.md +3 -0
- package/dist/skills/frontend/references/design/apple.md +3 -0
- package/dist/skills/frontend/references/design/binance.md +3 -0
- package/dist/skills/frontend/references/design/bmw.md +3 -0
- package/dist/skills/frontend/references/design/bugatti.md +3 -0
- package/dist/skills/frontend/references/design/cal.md +3 -0
- package/dist/skills/frontend/references/design/claude.md +3 -0
- package/dist/skills/frontend/references/design/clay.md +3 -0
- package/dist/skills/frontend/references/design/clickhouse.md +3 -0
- package/dist/skills/frontend/references/design/cohere.md +3 -0
- package/dist/skills/frontend/references/design/coinbase.md +3 -0
- package/dist/skills/frontend/references/design/composio.md +3 -0
- package/dist/skills/frontend/references/design/cursor.md +3 -0
- package/dist/skills/frontend/references/design/elevenlabs.md +3 -0
- package/dist/skills/frontend/references/design/expo.md +3 -0
- package/dist/skills/frontend/references/design/ferrari.md +3 -0
- package/dist/skills/frontend/references/design/figma.md +3 -0
- package/dist/skills/frontend/references/design/framer.md +3 -0
- package/dist/skills/frontend/references/design/hashicorp.md +3 -0
- package/dist/skills/frontend/references/design/ibm.md +3 -0
- package/dist/skills/frontend/references/design/imagegen-frontend-web.md +380 -79
- package/dist/skills/frontend/references/design/intercom.md +3 -0
- package/dist/skills/frontend/references/design/kraken.md +3 -0
- package/dist/skills/frontend/references/design/lamborghini.md +3 -0
- package/dist/skills/frontend/references/design/linear.app.md +3 -0
- package/dist/skills/frontend/references/design/lovable.md +3 -0
- package/dist/skills/frontend/references/design/mastercard.md +3 -0
- package/dist/skills/frontend/references/design/meta.md +3 -0
- package/dist/skills/frontend/references/design/minimax.md +3 -0
- package/dist/skills/frontend/references/design/mintlify.md +3 -0
- package/dist/skills/frontend/references/design/miro.md +3 -0
- package/dist/skills/frontend/references/design/mistral.ai.md +3 -0
- package/dist/skills/frontend/references/design/mongodb.md +3 -0
- package/dist/skills/frontend/references/design/nike.md +3 -0
- package/dist/skills/frontend/references/design/notion.md +3 -0
- package/dist/skills/frontend/references/design/nvidia.md +3 -0
- package/dist/skills/frontend/references/design/ollama.md +3 -0
- package/dist/skills/frontend/references/design/opencode.ai.md +3 -0
- package/dist/skills/frontend/references/design/pinterest.md +3 -0
- package/dist/skills/frontend/references/design/playstation.md +3 -0
- package/dist/skills/frontend/references/design/posthog.md +3 -0
- package/dist/skills/frontend/references/design/raycast.md +3 -0
- package/dist/skills/frontend/references/design/renault.md +3 -0
- package/dist/skills/frontend/references/design/replicate.md +3 -0
- package/dist/skills/frontend/references/design/resend.md +3 -0
- package/dist/skills/frontend/references/design/revolut.md +3 -0
- package/dist/skills/frontend/references/design/runwayml.md +3 -0
- package/dist/skills/frontend/references/design/sanity.md +3 -0
- package/dist/skills/frontend/references/design/sentry.md +3 -0
- package/dist/skills/frontend/references/design/shopify.md +3 -0
- package/dist/skills/frontend/references/design/spacex.md +3 -0
- package/dist/skills/frontend/references/design/spotify.md +3 -0
- package/dist/skills/frontend/references/design/starbucks.md +3 -0
- package/dist/skills/frontend/references/design/stitch-skill.md +1 -1
- package/dist/skills/frontend/references/design/stripe.md +3 -0
- package/dist/skills/frontend/references/design/supabase.md +3 -0
- package/dist/skills/frontend/references/design/superhuman.md +3 -0
- package/dist/skills/frontend/references/design/taste-skill.md +1188 -208
- package/dist/skills/frontend/references/design/tesla.md +3 -0
- package/dist/skills/frontend/references/design/theverge.md +3 -0
- package/dist/skills/frontend/references/design/together.ai.md +3 -0
- package/dist/skills/frontend/references/design/uber.md +3 -0
- package/dist/skills/frontend/references/design/vercel.md +3 -0
- package/dist/skills/frontend/references/design/vodafone.md +3 -0
- package/dist/skills/frontend/references/design/voltagent.md +3 -0
- package/dist/skills/frontend/references/design/warp.md +3 -0
- package/dist/skills/frontend/references/design/webflow.md +3 -0
- package/dist/skills/frontend/references/design/wired.md +3 -0
- package/dist/skills/frontend/references/design/wise.md +3 -0
- package/dist/skills/frontend/references/design/x.ai.md +3 -0
- package/dist/skills/frontend/references/design/zapier.md +3 -0
- package/dist/skills/frontend/references/ui-ux-db/README.md +501 -115
- package/dist/skills/frontend/references/ui-ux-db/data/charts.csv +26 -26
- package/dist/skills/frontend/references/ui-ux-db/data/colors.csv +162 -97
- package/dist/skills/frontend/references/ui-ux-db/data/icons.csv +105 -100
- package/dist/skills/frontend/references/ui-ux-db/data/landing.csv +22 -18
- package/dist/skills/frontend/references/ui-ux-db/data/products.csv +162 -97
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/flutter.csv +53 -53
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -56
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/nextjs.csv +53 -53
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/react.csv +54 -54
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/svelte.csv +54 -54
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/swiftui.csv +51 -51
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/vue.csv +50 -50
- package/dist/skills/frontend/references/ui-ux-db/data/styles.csv +17 -0
- package/dist/skills/frontend/references/ui-ux-db/data/typography.csv +17 -1
- package/dist/skills/frontend/references/ui-ux-db/data/ui-reasoning.csv +162 -101
- package/dist/skills/frontend/references/ui-ux-db/data/web-interface.csv +30 -30
- package/dist/skills/frontend/references/ui-ux-db/scripts/core.py +31 -22
- package/dist/skills/frontend/references/ui-ux-db/scripts/design_system.py +150 -69
- package/dist/skills/frontend/references/ui-ux-db/scripts/search.py +3 -3
- package/dist/skills/lcx-doctor/SKILL.md +1 -1
- package/dist/skills/ultimate-browsing/ATTRIBUTION.md +105 -0
- package/dist/skills/ultimate-browsing/SKILL.md +140 -0
- package/dist/skills/ultimate-browsing/engine/__init__.py +24 -0
- package/dist/skills/ultimate-browsing/engine/__main__.py +106 -0
- package/dist/skills/ultimate-browsing/engine/bias_check.py +174 -0
- package/dist/skills/ultimate-browsing/engine/curl_probe.py +91 -0
- package/dist/skills/ultimate-browsing/engine/executor.py +192 -0
- package/dist/skills/ultimate-browsing/engine/fetch_chain.py +268 -0
- package/dist/skills/ultimate-browsing/engine/referers.py +15 -0
- package/dist/skills/ultimate-browsing/engine/result_schema.py +45 -0
- package/dist/skills/ultimate-browsing/engine/summary.py +37 -0
- package/dist/skills/ultimate-browsing/engine/templates/package.json +11 -0
- package/dist/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +129 -0
- package/dist/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +167 -0
- package/dist/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +77 -0
- package/dist/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +282 -0
- package/dist/skills/ultimate-browsing/engine/url_transforms.py +98 -0
- package/dist/skills/ultimate-browsing/engine/validators.py +216 -0
- package/dist/skills/ultimate-browsing/engine/waf_detector.py +214 -0
- package/dist/skills/ultimate-browsing/engine/waf_profiles.yaml +162 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/README.md +79 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/career.md +29 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/dev.md +62 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/search.md +33 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/social.md +207 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/video.md +115 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/web.md +76 -0
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +120 -0
- package/dist/skills/ultimate-browsing/references/insane-search/README.md +319 -0
- package/dist/skills/ultimate-browsing/references/insane-search/cache-archive.md +83 -0
- package/dist/skills/ultimate-browsing/references/insane-search/fallback.md +159 -0
- package/dist/skills/ultimate-browsing/references/insane-search/jina.md +130 -0
- package/dist/skills/ultimate-browsing/references/insane-search/json-api.md +133 -0
- package/dist/skills/ultimate-browsing/references/insane-search/media.md +123 -0
- package/dist/skills/ultimate-browsing/references/insane-search/metadata.md +116 -0
- package/dist/skills/ultimate-browsing/references/insane-search/naver.md +107 -0
- package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +142 -0
- package/dist/skills/ultimate-browsing/references/insane-search/public-api.md +119 -0
- package/dist/skills/ultimate-browsing/references/insane-search/rss.md +123 -0
- package/dist/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +186 -0
- package/dist/skills/ultimate-browsing/references/insane-search/twitter.md +104 -0
- package/dist/skills/ultimate-browsing/scripts/cookie_crypto.py +75 -0
- package/dist/skills/ultimate-browsing/scripts/cookie_domains.py +38 -0
- package/dist/skills/ultimate-browsing/scripts/cookie_paths.py +112 -0
- package/dist/skills/ultimate-browsing/scripts/extract_cookies.py +280 -0
- package/dist/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +110 -0
- package/dist/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +245 -0
- package/dist/skills/ultraresearch/ATTRIBUTION.md +49 -0
- package/dist/skills/ultraresearch/SKILL.md +34 -6
- package/dist/skills/ulw-plan/SKILL.md +4 -1
- package/dist/tools/background-task/constants.d.ts +1 -1
- package/dist/tools/delegate-task/sync-task-deps.d.ts +8 -6
- package/dist/tools/skill-mcp/tools.d.ts +1 -1
- package/dist/tui.js +18 -4
- package/package.json +16 -14
- package/packages/omo-codex/THIRD-PARTY-NOTICES.md +27 -4
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +3 -1
- package/packages/omo-codex/plugin/README.md +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +134 -42
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/LICENSE +21 -0
- package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +2951 -0
- package/packages/omo-codex/plugin/components/codegraph/NOTICE +16 -0
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +633 -193
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +561 -44
- package/packages/omo-codex/plugin/components/codegraph/package.json +9 -3
- package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +11 -0
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +12 -0
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +34 -0
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +75 -0
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +66 -13
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +26 -12
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +50 -330
- package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +91 -0
- package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +2 -2
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +68 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +11 -1
- package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +48 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +133 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +1 -112
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +149 -0
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +63 -0
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +106 -0
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +150 -0
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +3 -3
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +3 -3
- package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +33 -9
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/dist/cli.js +94 -0
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +17 -0
- package/packages/omo-codex/plugin/components/teammode/package.json +26 -0
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +59 -32
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-guide.mjs +17 -16
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-state.mjs +70 -3
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-worktree.mjs +113 -0
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +63 -4
- package/packages/omo-codex/plugin/components/teammode/src/cli.ts +12 -0
- package/packages/omo-codex/plugin/components/teammode/src/codex-hook.ts +125 -0
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +116 -0
- package/packages/omo-codex/plugin/components/teammode/tsconfig.json +25 -0
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +5 -4
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +24 -3
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +8 -7
- package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +17 -0
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +17 -0
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +129 -12
- package/packages/omo-codex/plugin/package.json +3 -2
- package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +133 -0
- package/packages/omo-codex/plugin/scripts/auto-update-release-notes.mjs +135 -0
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +33 -133
- package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +1 -0
- package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +41 -0
- package/packages/omo-codex/plugin/shared/src/config-loader.ts +20 -2
- package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +16 -0
- package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +32 -8
- package/packages/omo-codex/plugin/skills/frontend/references/design/airbnb.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/airtable.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/apple.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/binance.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/bmw.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/bugatti.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/cal.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/claude.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/clay.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/clickhouse.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/cohere.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/coinbase.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/composio.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/cursor.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/elevenlabs.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/expo.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/ferrari.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/figma.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/framer.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/hashicorp.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/ibm.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/imagegen-frontend-web.md +380 -79
- package/packages/omo-codex/plugin/skills/frontend/references/design/intercom.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/kraken.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/lamborghini.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/linear.app.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/lovable.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/mastercard.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/meta.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/minimax.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/mintlify.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/miro.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/mistral.ai.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/mongodb.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/nike.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/notion.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/nvidia.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/ollama.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/opencode.ai.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/pinterest.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/playstation.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/posthog.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/raycast.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/renault.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/replicate.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/resend.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/revolut.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/runwayml.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/sanity.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/sentry.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/shopify.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/spacex.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/spotify.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/starbucks.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/stitch-skill.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/stripe.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/supabase.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/superhuman.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/taste-skill.md +1188 -208
- package/packages/omo-codex/plugin/skills/frontend/references/design/tesla.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/theverge.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/together.ai.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/uber.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/vercel.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/vodafone.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/voltagent.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/warp.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/webflow.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/wired.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/wise.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/x.ai.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/zapier.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/README.md +501 -115
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/charts.csv +26 -26
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/colors.csv +162 -97
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/icons.csv +105 -100
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/landing.csv +22 -18
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/products.csv +162 -97
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/flutter.csv +53 -53
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -56
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/nextjs.csv +53 -53
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/react.csv +54 -54
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/svelte.csv +54 -54
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/swiftui.csv +51 -51
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/vue.csv +50 -50
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/styles.csv +17 -0
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/typography.csv +17 -1
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/ui-reasoning.csv +162 -101
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/web-interface.csv +30 -30
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/core.py +31 -22
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/design_system.py +150 -69
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/search.py +3 -3
- package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/teammode/SKILL.md +59 -32
- package/packages/omo-codex/plugin/skills/teammode/scripts/team-guide.mjs +17 -16
- package/packages/omo-codex/plugin/skills/teammode/scripts/team-state.mjs +70 -3
- package/packages/omo-codex/plugin/skills/teammode/scripts/team-worktree.mjs +113 -0
- package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +63 -4
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +105 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +140 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__init__.py +24 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__main__.py +106 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/bias_check.py +174 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/curl_probe.py +91 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/executor.py +192 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/fetch_chain.py +268 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/referers.py +15 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/result_schema.py +45 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/summary.py +37 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +11 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +129 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +167 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +77 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +282 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/url_transforms.py +98 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/validators.py +216 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_detector.py +214 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_profiles.yaml +162 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/README.md +79 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/career.md +29 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/dev.md +62 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/search.md +33 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/social.md +207 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/video.md +115 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/web.md +76 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +120 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +319 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/cache-archive.md +83 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/fallback.md +159 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/jina.md +130 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/json-api.md +133 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/media.md +123 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/metadata.md +116 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/naver.md +107 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +142 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/public-api.md +119 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/rss.md +123 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +186 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/twitter.md +104 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/cookie_crypto.py +75 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/cookie_domains.py +38 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/cookie_paths.py +112 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +280 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +110 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +245 -0
- package/packages/omo-codex/plugin/skills/ultraresearch/ATTRIBUTION.md +49 -0
- package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +34 -6
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +8 -7
- package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +2 -1
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +36 -0
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -1
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +1 -1
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +95 -0
- package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +12 -3
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -0
- package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +76 -0
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +24 -0
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +1 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -0
- package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +87 -0
- package/packages/omo-codex/plugin/test/teammode-thread-title.test.mjs +169 -0
- package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +246 -0
- package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +78 -0
- package/packages/omo-codex/scripts/install-cli-args.test.mjs +1 -1
- package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +23 -0
- package/packages/omo-codex/scripts/install-delegated-command.test.mjs +76 -4
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +531 -214
- package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +40 -3
- package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +32 -8
- package/packages/shared-skills/skills/frontend/references/design/airbnb.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/airtable.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/apple.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/binance.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/bmw.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/bugatti.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/cal.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/claude.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/clay.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/clickhouse.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/cohere.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/coinbase.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/composio.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/cursor.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/elevenlabs.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/expo.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/ferrari.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/figma.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/framer.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/hashicorp.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/ibm.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/imagegen-frontend-web.md +380 -79
- package/packages/shared-skills/skills/frontend/references/design/intercom.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/kraken.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/lamborghini.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/linear.app.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/lovable.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/mastercard.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/meta.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/minimax.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/mintlify.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/miro.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/mistral.ai.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/mongodb.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/nike.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/notion.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/nvidia.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/ollama.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/opencode.ai.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/pinterest.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/playstation.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/posthog.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/raycast.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/renault.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/replicate.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/resend.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/revolut.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/runwayml.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/sanity.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/sentry.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/shopify.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/spacex.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/spotify.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/starbucks.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/stitch-skill.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/stripe.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/supabase.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/superhuman.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/taste-skill.md +1188 -208
- package/packages/shared-skills/skills/frontend/references/design/tesla.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/theverge.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/together.ai.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/uber.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/vercel.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/vodafone.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/voltagent.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/warp.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/webflow.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/wired.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/wise.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/x.ai.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/zapier.md +3 -0
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/README.md +501 -115
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/charts.csv +26 -26
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/colors.csv +162 -97
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/icons.csv +105 -100
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/landing.csv +22 -18
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/products.csv +162 -97
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/flutter.csv +53 -53
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -56
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/nextjs.csv +53 -53
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/react.csv +54 -54
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/svelte.csv +54 -54
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/swiftui.csv +51 -51
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/vue.csv +50 -50
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/styles.csv +17 -0
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/typography.csv +17 -1
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/ui-reasoning.csv +162 -101
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/web-interface.csv +30 -30
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/core.py +31 -22
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/design_system.py +150 -69
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/search.py +3 -3
- package/packages/shared-skills/skills/lcx-doctor/SKILL.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +105 -0
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +140 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/__init__.py +24 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/__main__.py +106 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/bias_check.py +174 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/curl_probe.py +91 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/executor.py +192 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/fetch_chain.py +268 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/referers.py +15 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/result_schema.py +45 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/summary.py +37 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +11 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +129 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +167 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +77 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +282 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/url_transforms.py +98 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/validators.py +216 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/waf_detector.py +214 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/waf_profiles.yaml +162 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/README.md +79 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/career.md +29 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/dev.md +62 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/search.md +33 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/social.md +207 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/video.md +115 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/web.md +76 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +120 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +319 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/cache-archive.md +83 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/fallback.md +159 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/jina.md +130 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/json-api.md +133 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/media.md +123 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/metadata.md +116 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/naver.md +107 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +142 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/public-api.md +119 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/rss.md +123 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +186 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/twitter.md +104 -0
- package/packages/shared-skills/skills/ultimate-browsing/scripts/cookie_crypto.py +75 -0
- package/packages/shared-skills/skills/ultimate-browsing/scripts/cookie_domains.py +38 -0
- package/packages/shared-skills/skills/ultimate-browsing/scripts/cookie_paths.py +112 -0
- package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +280 -0
- package/packages/shared-skills/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +110 -0
- package/packages/shared-skills/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +245 -0
- package/packages/shared-skills/skills/ultraresearch/ATTRIBUTION.md +49 -0
- package/packages/shared-skills/skills/ultraresearch/SKILL.md +34 -6
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +4 -1
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.d.ts +0 -2
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.d.ts +0 -32
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import shutil
|
|
5
|
+
import sqlite3
|
|
6
|
+
import sys
|
|
7
|
+
import tempfile
|
|
8
|
+
import unittest
|
|
9
|
+
from collections.abc import Callable
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|
13
|
+
|
|
14
|
+
from extract_cookies import extract_cookies # noqa: E402
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _make_chromium_db(path: Path, rows: list[tuple[str, bytes, str]]) -> None:
|
|
18
|
+
conn = sqlite3.connect(str(path))
|
|
19
|
+
conn.execute(
|
|
20
|
+
"CREATE TABLE cookies (name TEXT, encrypted_value BLOB, host_key TEXT, path TEXT, "
|
|
21
|
+
"expires_utc INTEGER, is_secure INTEGER, is_httponly INTEGER, samesite INTEGER)"
|
|
22
|
+
)
|
|
23
|
+
conn.executemany(
|
|
24
|
+
"INSERT INTO cookies VALUES (?,?,?,?,?,?,?,?)",
|
|
25
|
+
[
|
|
26
|
+
(name, value, host, "/", 13_300_000_000_000_000, 1, 1, 1)
|
|
27
|
+
for name, value, host in rows
|
|
28
|
+
],
|
|
29
|
+
)
|
|
30
|
+
conn.commit()
|
|
31
|
+
conn.close()
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _make_firefox_db(path: Path, rows: list[tuple[str, str, str]]) -> None:
|
|
35
|
+
conn = sqlite3.connect(str(path))
|
|
36
|
+
conn.execute(
|
|
37
|
+
"CREATE TABLE moz_cookies (name TEXT, value TEXT, host TEXT, path TEXT, "
|
|
38
|
+
"expiry INTEGER, isSecure INTEGER, isHttpOnly INTEGER, sameSite INTEGER)"
|
|
39
|
+
)
|
|
40
|
+
conn.executemany(
|
|
41
|
+
"INSERT INTO moz_cookies VALUES (?,?,?,?,?,?,?,?)",
|
|
42
|
+
[
|
|
43
|
+
(name, value, host, "/", 9999999999, 1, 1, 1)
|
|
44
|
+
for name, value, host in rows
|
|
45
|
+
],
|
|
46
|
+
)
|
|
47
|
+
conn.commit()
|
|
48
|
+
conn.close()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class DomainFilter(unittest.TestCase):
|
|
52
|
+
def _base_with_db(self, rel: str, make: Callable[[Path], None]) -> Path:
|
|
53
|
+
base = Path(tempfile.mkdtemp())
|
|
54
|
+
self.addCleanup(lambda: shutil.rmtree(str(base), ignore_errors=True))
|
|
55
|
+
db = base / rel
|
|
56
|
+
db.parent.mkdir(parents=True)
|
|
57
|
+
make(db)
|
|
58
|
+
return base
|
|
59
|
+
|
|
60
|
+
def test_chromium_does_not_overmatch_suffix_text(self) -> None:
|
|
61
|
+
base = self._base_with_db(
|
|
62
|
+
"Google/Chrome/User Data/Default/Cookies",
|
|
63
|
+
lambda p: _make_chromium_db(
|
|
64
|
+
p,
|
|
65
|
+
[
|
|
66
|
+
("exact", b"exact-value", "example.com"),
|
|
67
|
+
("sub", b"sub-value", ".login.example.com"),
|
|
68
|
+
("near", b"near-value", ".example.com"),
|
|
69
|
+
],
|
|
70
|
+
),
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
near = extract_cookies(
|
|
74
|
+
"chrome", ["ample.com"], platform="win32",
|
|
75
|
+
keyring_reader=lambda _s: b"k" * 32, base_override=base,
|
|
76
|
+
)
|
|
77
|
+
exact = extract_cookies(
|
|
78
|
+
"chrome", ["example.com"], platform="win32",
|
|
79
|
+
keyring_reader=lambda _s: b"k" * 32, base_override=base,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
self.assertEqual(near, [])
|
|
83
|
+
self.assertEqual({cookie["name"] for cookie in exact}, {"exact", "near", "sub"})
|
|
84
|
+
|
|
85
|
+
def test_firefox_does_not_overmatch_suffix_text(self) -> None:
|
|
86
|
+
base = self._base_with_db(
|
|
87
|
+
"Firefox/Profiles/abc.default/cookies.sqlite",
|
|
88
|
+
lambda p: _make_firefox_db(
|
|
89
|
+
p,
|
|
90
|
+
[
|
|
91
|
+
("exact", "exact-value", "example.com"),
|
|
92
|
+
("sub", "sub-value", ".login.example.com"),
|
|
93
|
+
("near", "near-value", ".example.com"),
|
|
94
|
+
],
|
|
95
|
+
),
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
near = extract_cookies(
|
|
99
|
+
"firefox", ["ample.com"], platform="darwin", base_override=base,
|
|
100
|
+
)
|
|
101
|
+
exact = extract_cookies(
|
|
102
|
+
"firefox", ["example.com"], platform="darwin", base_override=base,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
self.assertEqual(near, [])
|
|
106
|
+
self.assertEqual({cookie["name"] for cookie in exact}, {"exact", "near", "sub"})
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
if __name__ == "__main__":
|
|
110
|
+
unittest.main(verbosity=2)
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Synthetic-fixture tests for cross-platform cookie extraction (no live browser)."""
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import shutil
|
|
6
|
+
import sqlite3
|
|
7
|
+
import sys
|
|
8
|
+
import tempfile
|
|
9
|
+
import unittest
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Callable
|
|
12
|
+
from unittest.mock import patch
|
|
13
|
+
|
|
14
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|
15
|
+
|
|
16
|
+
from cookie_crypto import decrypt_chromium_value, derive_key # noqa: E402
|
|
17
|
+
from cookie_paths import UnsupportedPlatform, resolve_cookie_db # noqa: E402
|
|
18
|
+
from extract_cookies import extract_cookies, inject_cookies, write_cookie_file # noqa: E402
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _make_chromium_db(path: Path, name: str, encrypted_value: bytes, host: str) -> None:
|
|
22
|
+
conn = sqlite3.connect(str(path))
|
|
23
|
+
conn.execute(
|
|
24
|
+
"CREATE TABLE cookies (name TEXT, encrypted_value BLOB, host_key TEXT, path TEXT, "
|
|
25
|
+
"expires_utc INTEGER, is_secure INTEGER, is_httponly INTEGER, samesite INTEGER)"
|
|
26
|
+
)
|
|
27
|
+
conn.execute(
|
|
28
|
+
"INSERT INTO cookies VALUES (?,?,?,?,?,?,?,?)",
|
|
29
|
+
(name, encrypted_value, host, "/", 13_300_000_000_000_000, 1, 1, 1),
|
|
30
|
+
)
|
|
31
|
+
conn.commit()
|
|
32
|
+
conn.close()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _make_firefox_db(path: Path, name: str, value: str, host: str) -> None:
|
|
36
|
+
conn = sqlite3.connect(str(path))
|
|
37
|
+
conn.execute(
|
|
38
|
+
"CREATE TABLE moz_cookies (name TEXT, value TEXT, host TEXT, path TEXT, "
|
|
39
|
+
"expiry INTEGER, isSecure INTEGER, isHttpOnly INTEGER, sameSite INTEGER)"
|
|
40
|
+
)
|
|
41
|
+
conn.execute("INSERT INTO moz_cookies VALUES (?,?,?,?,?,?,?,?)", (name, value, host, "/", 9999999999, 1, 1, 1))
|
|
42
|
+
conn.commit()
|
|
43
|
+
conn.close()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _encrypt_cbc_v10(key: bytes, plaintext: str) -> bytes:
|
|
47
|
+
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
|
48
|
+
|
|
49
|
+
data = plaintext.encode()
|
|
50
|
+
pad = 16 - (len(data) % 16)
|
|
51
|
+
padded = data + bytes([pad]) * pad
|
|
52
|
+
encryptor = Cipher(algorithms.AES128(key), modes.CBC(b" " * 16)).encryptor()
|
|
53
|
+
return b"v10" + encryptor.update(padded) + encryptor.finalize()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _encrypt_gcm_v10(key: bytes, plaintext: str) -> bytes:
|
|
57
|
+
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
|
58
|
+
|
|
59
|
+
nonce = b"n" * 12
|
|
60
|
+
encryptor = Cipher(algorithms.AES(key), modes.GCM(nonce)).encryptor()
|
|
61
|
+
ciphertext = encryptor.update(plaintext.encode()) + encryptor.finalize()
|
|
62
|
+
return b"v10" + nonce + ciphertext + encryptor.tag
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class PathResolution(unittest.TestCase):
|
|
66
|
+
def test_macos_chromium_path(self) -> None:
|
|
67
|
+
base = Path(self.tmp())
|
|
68
|
+
target = base / "Google/Chrome/Default/Cookies"
|
|
69
|
+
target.parent.mkdir(parents=True)
|
|
70
|
+
target.write_bytes(b"")
|
|
71
|
+
self.assertEqual(resolve_cookie_db("chrome", "darwin", base_override=base), target)
|
|
72
|
+
|
|
73
|
+
def test_linux_chromium_network_path(self) -> None:
|
|
74
|
+
base = Path(self.tmp())
|
|
75
|
+
target = base / "google-chrome/Default/Network/Cookies"
|
|
76
|
+
target.parent.mkdir(parents=True)
|
|
77
|
+
target.write_bytes(b"")
|
|
78
|
+
self.assertEqual(resolve_cookie_db("chrome", "linux", base_override=base), target)
|
|
79
|
+
|
|
80
|
+
def test_windows_chromium_path(self) -> None:
|
|
81
|
+
base = Path(self.tmp())
|
|
82
|
+
target = base / "Google/Chrome/User Data/Default/Cookies"
|
|
83
|
+
target.parent.mkdir(parents=True)
|
|
84
|
+
target.write_bytes(b"")
|
|
85
|
+
self.assertEqual(resolve_cookie_db("chrome", "win32", base_override=base), target)
|
|
86
|
+
|
|
87
|
+
def test_unsupported_platform_raises(self) -> None:
|
|
88
|
+
with self.assertRaises(UnsupportedPlatform):
|
|
89
|
+
resolve_cookie_db("chrome", "sunos")
|
|
90
|
+
|
|
91
|
+
def test_unsupported_browser_raises(self) -> None:
|
|
92
|
+
with self.assertRaises(UnsupportedPlatform):
|
|
93
|
+
resolve_cookie_db("nonexistent", "darwin")
|
|
94
|
+
|
|
95
|
+
def tmp(self) -> str:
|
|
96
|
+
import tempfile
|
|
97
|
+
|
|
98
|
+
d = tempfile.mkdtemp()
|
|
99
|
+
self.addCleanup(lambda: __import__("shutil").rmtree(d, ignore_errors=True))
|
|
100
|
+
return d
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class KeyDerivation(unittest.TestCase):
|
|
104
|
+
def test_macos_iters_differ_from_linux(self) -> None:
|
|
105
|
+
secret = b"some-keychain-secret"
|
|
106
|
+
self.assertNotEqual(derive_key("darwin", secret), derive_key("linux", secret))
|
|
107
|
+
self.assertEqual(len(derive_key("darwin", secret)), 16)
|
|
108
|
+
|
|
109
|
+
def test_windows_passthrough_32_bytes(self) -> None:
|
|
110
|
+
key = b"k" * 32
|
|
111
|
+
self.assertEqual(derive_key("win32", key), key)
|
|
112
|
+
|
|
113
|
+
def test_windows_rejects_wrong_length(self) -> None:
|
|
114
|
+
with self.assertRaises(ValueError):
|
|
115
|
+
derive_key("win32", b"short")
|
|
116
|
+
|
|
117
|
+
def test_unsupported_platform_raises(self) -> None:
|
|
118
|
+
with self.assertRaises(UnsupportedPlatform):
|
|
119
|
+
derive_key("sunos", b"x")
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class Decryption(unittest.TestCase):
|
|
123
|
+
def test_macos_cbc_roundtrip(self) -> None:
|
|
124
|
+
key = derive_key("darwin", b"secret")
|
|
125
|
+
blob = _encrypt_cbc_v10(key, "session-token-123")
|
|
126
|
+
self.assertEqual(decrypt_chromium_value("darwin", key, blob), "session-token-123")
|
|
127
|
+
|
|
128
|
+
def test_windows_gcm_roundtrip(self) -> None:
|
|
129
|
+
key = b"k" * 32
|
|
130
|
+
blob = _encrypt_gcm_v10(key, "win-token-xyz")
|
|
131
|
+
self.assertEqual(decrypt_chromium_value("win32", key, blob), "win-token-xyz")
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
class EndToEnd(unittest.TestCase):
|
|
135
|
+
def _base_with_db(self, rel: str, make: Callable[[Path], None]) -> Path:
|
|
136
|
+
base = Path(tempfile.mkdtemp())
|
|
137
|
+
self.addCleanup(lambda: shutil.rmtree(str(base), ignore_errors=True))
|
|
138
|
+
db = base / rel
|
|
139
|
+
db.parent.mkdir(parents=True)
|
|
140
|
+
make(db)
|
|
141
|
+
return base
|
|
142
|
+
|
|
143
|
+
def test_chromium_extract_with_injected_keyring(self) -> None:
|
|
144
|
+
key = derive_key("darwin", b"secret")
|
|
145
|
+
blob = _encrypt_cbc_v10(key, "logged-in")
|
|
146
|
+
base = self._base_with_db(
|
|
147
|
+
"Google/Chrome/Default/Cookies",
|
|
148
|
+
lambda p: _make_chromium_db(p, "SID", blob, ".youtube.com"),
|
|
149
|
+
)
|
|
150
|
+
cookies = extract_cookies(
|
|
151
|
+
"chrome", ["youtube.com"], platform="darwin",
|
|
152
|
+
keyring_reader=lambda _s: b"secret", base_override=base,
|
|
153
|
+
)
|
|
154
|
+
self.assertEqual(len(cookies), 1)
|
|
155
|
+
self.assertEqual(cookies[0]["value"], "logged-in")
|
|
156
|
+
self.assertEqual(cookies[0]["name"], "SID")
|
|
157
|
+
|
|
158
|
+
def test_firefox_extract_unencrypted(self) -> None:
|
|
159
|
+
base = self._base_with_db(
|
|
160
|
+
"Firefox/Profiles/abc.default/cookies.sqlite",
|
|
161
|
+
lambda p: _make_firefox_db(p, "auth", "plain-value", ".example.com"),
|
|
162
|
+
)
|
|
163
|
+
cookies = extract_cookies("firefox", ["example.com"], platform="darwin", base_override=base)
|
|
164
|
+
self.assertEqual(len(cookies), 1)
|
|
165
|
+
self.assertEqual(cookies[0]["value"], "plain-value")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class SecretHandling(unittest.TestCase):
|
|
169
|
+
def test_cookie_output_file_is_owner_only(self) -> None:
|
|
170
|
+
base = Path(tempfile.mkdtemp())
|
|
171
|
+
self.addCleanup(lambda: shutil.rmtree(str(base), ignore_errors=True))
|
|
172
|
+
output = base / "cookies.json"
|
|
173
|
+
|
|
174
|
+
write_cookie_file(output, [{"name": "SID", "value": "secret"}])
|
|
175
|
+
|
|
176
|
+
self.assertEqual(output.stat().st_mode & 0o777, 0o600)
|
|
177
|
+
self.assertIn("secret", output.read_text())
|
|
178
|
+
|
|
179
|
+
def test_cookie_output_replaces_existing_file_only_after_private_temp_write(self) -> None:
|
|
180
|
+
base = Path(tempfile.mkdtemp())
|
|
181
|
+
self.addCleanup(lambda: shutil.rmtree(str(base), ignore_errors=True))
|
|
182
|
+
output = base / "cookies.json"
|
|
183
|
+
output.write_text("old\n")
|
|
184
|
+
output.chmod(0o644)
|
|
185
|
+
|
|
186
|
+
def _dump(_cookies, f, indent: int) -> None:
|
|
187
|
+
self.assertEqual(output.read_text(), "old\n")
|
|
188
|
+
self.assertEqual(output.stat().st_mode & 0o777, 0o644)
|
|
189
|
+
temp_files = list(base.glob(".cookies.json.*.tmp"))
|
|
190
|
+
self.assertEqual(len(temp_files), 1)
|
|
191
|
+
self.assertEqual(temp_files[0].stat().st_mode & 0o777, 0o600)
|
|
192
|
+
f.write('[{"name": "SID", "value": "secret"}]')
|
|
193
|
+
|
|
194
|
+
with patch("extract_cookies.json.dump", side_effect=_dump):
|
|
195
|
+
write_cookie_file(output, [{"name": "SID", "value": "secret"}])
|
|
196
|
+
|
|
197
|
+
self.assertEqual(output.stat().st_mode & 0o777, 0o600)
|
|
198
|
+
self.assertIn("secret", output.read_text())
|
|
199
|
+
|
|
200
|
+
def test_cookie_output_refuses_symlinks(self) -> None:
|
|
201
|
+
base = Path(tempfile.mkdtemp())
|
|
202
|
+
self.addCleanup(lambda: shutil.rmtree(str(base), ignore_errors=True))
|
|
203
|
+
target = base / "target.json"
|
|
204
|
+
target.write_text("{}")
|
|
205
|
+
link = base / "cookies.json"
|
|
206
|
+
link.symlink_to(target)
|
|
207
|
+
|
|
208
|
+
with self.assertRaises(ValueError):
|
|
209
|
+
write_cookie_file(link, [{"name": "SID", "value": "secret"}])
|
|
210
|
+
|
|
211
|
+
def test_cookie_output_refuses_dangling_symlinks(self) -> None:
|
|
212
|
+
base = Path(tempfile.mkdtemp())
|
|
213
|
+
self.addCleanup(lambda: shutil.rmtree(str(base), ignore_errors=True))
|
|
214
|
+
link = base / "cookies.json"
|
|
215
|
+
link.symlink_to(base / "missing.json")
|
|
216
|
+
|
|
217
|
+
with self.assertRaises(ValueError):
|
|
218
|
+
write_cookie_file(link, [{"name": "SID", "value": "secret"}])
|
|
219
|
+
|
|
220
|
+
def test_inject_cookies_sends_values_over_stdin_not_argv(self) -> None:
|
|
221
|
+
cookie = {
|
|
222
|
+
"name": "SID",
|
|
223
|
+
"value": "secret-token",
|
|
224
|
+
"domain": ".youtube.com",
|
|
225
|
+
"path": "/",
|
|
226
|
+
"expires": 9999999999,
|
|
227
|
+
"secure": True,
|
|
228
|
+
"httpOnly": True,
|
|
229
|
+
"sameSite": "Lax",
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
with patch("extract_cookies.subprocess.run") as run:
|
|
233
|
+
run.return_value.returncode = 0
|
|
234
|
+
run.return_value.stdout = "1"
|
|
235
|
+
run.return_value.stderr = ""
|
|
236
|
+
|
|
237
|
+
inject_cookies([cookie], 9242)
|
|
238
|
+
|
|
239
|
+
command = run.call_args.args[0]
|
|
240
|
+
self.assertNotIn("secret-token", command)
|
|
241
|
+
self.assertIn("secret-token", run.call_args.kwargs["input"])
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
if __name__ == "__main__":
|
|
245
|
+
unittest.main(verbosity=2)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# ATTRIBUTION / NOTICE
|
|
2
|
+
|
|
3
|
+
This skill (`ultraresearch`, part of `@oh-my-opencode/shared-skills`) is authored by
|
|
4
|
+
the oh-my-openagent project. One design idea is adapted from a third-party project,
|
|
5
|
+
credited below. No third-party source is vendored here — only the verification idea
|
|
6
|
+
is adapted into this skill's prompt contract.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. insane-research (fivetaku) — inspiration for the claim-ledger verification gate
|
|
11
|
+
|
|
12
|
+
The non-code claim-ledger verification gate (Phase 3b: a data-flow-lock where the
|
|
13
|
+
synthesis may assert a high-risk non-code claim only after it clears `>= 2 independent
|
|
14
|
+
source domains + 1 counter-search + a primary source`, otherwise it is abstained to an
|
|
15
|
+
unresolved/refuted annex) is inspired by the data-flow-lock verification design in
|
|
16
|
+
**insane-research** by fivetaku.
|
|
17
|
+
|
|
18
|
+
- Source: https://github.com/fivetaku/insane-research
|
|
19
|
+
- License: MIT (declared in the project's `README.md`).
|
|
20
|
+
- **What is adapted:** the IDEA only — a verification gate whose output is the sole
|
|
21
|
+
allowlist the synthesis draws from, so skipping verification leaves nothing to
|
|
22
|
+
synthesize. No insane-research code is copied or redistributed. The upstream gate is
|
|
23
|
+
a Python checker (`validate_ledger.py`); this skill translates the concept into a
|
|
24
|
+
runtime-agnostic prompt + message-text contract, because the Codex Light edition has
|
|
25
|
+
no guaranteed Python.
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
MIT License
|
|
29
|
+
|
|
30
|
+
Copyright (c) 2026 fivetaku
|
|
31
|
+
|
|
32
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
33
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
34
|
+
in the Software without restriction, including without limitation the rights
|
|
35
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
36
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
37
|
+
furnished to do so, subject to the following conditions:
|
|
38
|
+
|
|
39
|
+
The above copyright notice and this permission notice shall be included in all
|
|
40
|
+
copies or substantial portions of the Software.
|
|
41
|
+
|
|
42
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
43
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
44
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
45
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
46
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
47
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
48
|
+
SOFTWARE.
|
|
49
|
+
```
|
|
@@ -51,6 +51,14 @@ The research is done when all of these hold:
|
|
|
51
51
|
- Every claim in the deliverable cites a source or a verification artifact.
|
|
52
52
|
- The session journal reconstructs what was searched, found, and expanded, wave by wave.
|
|
53
53
|
|
|
54
|
+
## Run the swarm as a cooperating team
|
|
55
|
+
|
|
56
|
+
Saturation research is the textbook case for a cooperating team, not isolated fire-and-forget workers: a lead one worker surfaces almost always reshapes what another should search next. So when your harness gives you real cooperating members — Codex: the `teammode` skill (`codex_app` threads); OpenCode: `team_mode` — run this swarm as a team. Fall back to the background-worker swarm below only when team mode is unavailable, or the axes are genuinely independent with no cross-pollination expected.
|
|
57
|
+
|
|
58
|
+
- **One member per axis — by part, ownership, or perspective, never a job title.** Each Phase 0 axis is one member owning one concrete slice: a codebase part, a source territory, or a question lens. No two members share an angle. "Backend researcher" or "the web person" gives no real boundary and invites overlap — name what the member owns.
|
|
59
|
+
- **The raise law — broadcast every lead the instant it surfaces.** Members over-communicate relentlessly: every new lead, finding, contradiction, and dead end is raised to you the moment it surfaces, never hoarded for a final dump. Through long passes they send `WORKING: <axis> - <phase>`, and `BLOCKED: <reason>` the moment progress stops, so you always know a member is alive. Too many small updates is correct here; going quiet is the only failure.
|
|
60
|
+
- **You lead; expand on each raised lead.** Members raise via message text, never write session files. Journal each lead and spawn its expansion the instant it lands (Phase 2), not only when a member's final reply arrives.
|
|
61
|
+
|
|
54
62
|
## Worker ground rules
|
|
55
63
|
|
|
56
64
|
Research workers (explore, librarian, browsing) differ by harness, but assume:
|
|
@@ -106,7 +114,7 @@ Append each digest the moment its worker returns, not in a batch at the end —
|
|
|
106
114
|
|
|
107
115
|
## Phase 1 — Saturation wave
|
|
108
116
|
|
|
109
|
-
Launch
|
|
117
|
+
Launch the entire first wave in one turn — every axis at once, as team members if you formed a team, else as background workers. Sequential launches and "start with one and see" defeat the mode.
|
|
110
118
|
|
|
111
119
|
Scaling floor — more angles always justify more workers:
|
|
112
120
|
|
|
@@ -122,7 +130,7 @@ Role protocols — embed the relevant one in each spawn message; every worker ge
|
|
|
122
130
|
|
|
123
131
|
- **Codebase (explore), 2-4 workers.** Grep with 3+ keyword variations; structural/AST search; LSP definitions and references; file-name globs; `git log --all -S '<keyword>'` and `--grep` for history including deleted code. Cross-validate hits across tools. Report absolute file paths, patterns with `file:line`, and how findings connect.
|
|
124
132
|
- **Web (librarian), 3-6 workers.** At least 10 distinct websearch queries per worker, each with a different operator or angle (see Search craft); fetch the full page for every result that matters — snippets lie. Context7 with 3+ queries per known library. grep.app and `gh search code|repos|issues` for real-world usage. Official docs via sitemap discovery (`<base>/sitemap.xml`), then targeted pages.
|
|
125
|
-
- **Browsing, 0-3 workers.** Pages plain fetch cannot read (WAF, dynamic rendering, login):
|
|
133
|
+
- **Browsing, 0-3 workers.** Pages plain fetch cannot read (WAF, 403, Cloudflare, dynamic rendering, login): the worker loads the `ultimate-browsing` skill and escalates through its tiers — Tier-1 insane-search engine first, then Tier-2 Chrome stealth — rather than abandoning the source. Capture screenshots when visual context matters. When one blocked territory hides many leads, fan out more browsing subagents in parallel for breadth instead of serializing one worker through them.
|
|
126
134
|
- **Repo deep-dive (librarian), 0-2 workers.** Shallow-clone the most relevant repos to `${TMPDIR:-/tmp}`, pin the HEAD SHA, read core modules, follow call chains, return SHA-pinned permalinks.
|
|
127
135
|
|
|
128
136
|
Example spawn (codebase axis; librarian, browsing, and repo-dive follow the same contract with their own protocol):
|
|
@@ -137,7 +145,7 @@ End your reply with the ## EXPAND tail: '- LEAD: <discovery> — WHY: <why> —
|
|
|
137
145
|
|
|
138
146
|
## Phase 2 — Expand until convergence
|
|
139
147
|
|
|
140
|
-
This loop is what makes the mode research rather than search. Collect
|
|
148
|
+
This loop is what makes the mode research rather than search. Collect returns as they land — and in team mode, act on each lead the moment a member raises it, never waiting for the full wave or a member's final reply:
|
|
141
149
|
|
|
142
150
|
1. Journal the return: digest plus verbatim EXPAND markers into `wave-<N>-<kind>-<axis>.md`.
|
|
143
151
|
2. Deduplicate new markers against `expansion-log.md` — every lead ever seen, not just confirmed ones, or rejected leads resurface each wave.
|
|
@@ -171,6 +179,25 @@ Reply with: the exact code, the full output, environment (OS, runtime, dependenc
|
|
|
171
179
|
|
|
172
180
|
Journal each verdict to `verify-<slug>.md`.
|
|
173
181
|
|
|
182
|
+
## Phase 3b — Lock non-code claims through a claim ledger
|
|
183
|
+
|
|
184
|
+
Code settles code-shaped claims (Phase 3). Numeric, market-share, legal, dated, causal, and financial claims cannot be run — so they pass through a data-flow-lock instead (the verification idea adapted from fivetaku/insane-research): the synthesis may assert a high-risk non-code claim **only** if it cleared this gate, and the gate's output is the sole allowlist the synthesis draws from. Skip the gate and there is nothing to synthesize — the lock is self-enforcing.
|
|
185
|
+
|
|
186
|
+
The claim ledger is orchestrator-owned. Workers only return verified-claim markers as message text, the same channel as EXPAND markers — never a file. As leads resolve, you record one ledger entry per asserted claim and compute its status; workers report claim candidates in their replies, and you decide.
|
|
187
|
+
|
|
188
|
+
A high-risk claim clears the gate to `verified-claims` only when all hold:
|
|
189
|
+
|
|
190
|
+
- **>= 2 independent source domains** corroborate it (two pages on the same domain count once).
|
|
191
|
+
- **One counter-search** actively looked for a refutation and did not find a stronger one.
|
|
192
|
+
- **A primary source** (the standard, filing, dataset, or first-party doc) backs it, not only secondary commentary.
|
|
193
|
+
|
|
194
|
+
Anything that fails goes to an `Unresolved` (insufficient evidence) or `Refuted` (counter-search won) annex — abstention is a correct outcome, not a gap to paper over. Maintain `claim-ledger.md` with one row per claim — `claim | risk | domains | counter-search | primary? | status (verified/unresolved/refuted)` — and write the cleared rows into a `verified-claims` digest. Worker reply marker (message text, same channel as EXPAND):
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
## CLAIMS
|
|
198
|
+
- CLAIM: <non-code assertion> — RISK: high|normal — SOURCES: <domain1, domain2> — COUNTER: <refutation search result> — PRIMARY: <primary source or none>
|
|
199
|
+
```
|
|
200
|
+
|
|
174
201
|
## Phase 4 — Synthesize
|
|
175
202
|
|
|
176
203
|
After convergence and all verifications, re-read the whole journal and write `SYNTHESIS.md`:
|
|
@@ -183,13 +210,13 @@ Workers: <total> · Waves: <count> · Sources: <count> · Verifications: <count>
|
|
|
183
210
|
## Findings by theme — per theme: consensus, evidence links, key quote (<20 words, attributed), verified yes/no
|
|
184
211
|
## Codebase findings — absolute paths with line references
|
|
185
212
|
## Sources (ranked) — URL, what it contains, reliability, access date
|
|
186
|
-
## Verified claims — claim | verdict | verify-<slug>.md
|
|
213
|
+
## Verified claims — code: claim | verdict | verify-<slug>.md · non-code: only rows cleared into verified-claims
|
|
187
214
|
## Contradictions — source A vs source B, resolution with evidence
|
|
188
|
-
## Gaps — what saturation could not answer
|
|
215
|
+
## Gaps — what saturation could not answer · unresolved/refuted claim-ledger rows
|
|
189
216
|
## Expansion trace — per wave: workers → markers; convergence reason
|
|
190
217
|
```
|
|
191
218
|
|
|
192
|
-
Deliver the synthesis with inline `[Source N]` citations on every claim. When no report was requested, this is the deliverable.
|
|
219
|
+
Deliver the synthesis with inline `[Source N]` citations on every claim. Every high-risk non-code claim you assert must be a verified-claims row from Phase 3b — assert nothing the gate left in the unresolved/refuted annex. When no report was requested, this is the deliverable.
|
|
193
220
|
|
|
194
221
|
## Phase 5 — Report (only when requested)
|
|
195
222
|
|
|
@@ -221,6 +248,7 @@ High-yield combinations: official docs (`site:<docs domain>`), GitHub implementa
|
|
|
221
248
|
| Failure | Correction |
|
|
222
249
|
|---|---|
|
|
223
250
|
| Sequential spawning, or trimming the first wave | All first-wave workers in one turn, background, scaling floor respected |
|
|
251
|
+
| A team member hoards leads for one final dump | Raise law — every lead, finding, and dead end broadcast the moment it surfaces |
|
|
224
252
|
| Worker reply without the EXPAND tail | One follow-up demanding it; the lane stays open until it lands |
|
|
225
253
|
| Stopping after wave 1 because "enough was found" | Convergence rules only: 2+ expansion waves, leads run dry |
|
|
226
254
|
| Obeying a surrounding "stop exploring" rule mid-research | Authority section — those rules do not bind this mode |
|
|
@@ -15,7 +15,10 @@ Outcome-first: explore a lot, ask few sharp questions - or none, when the intent
|
|
|
15
15
|
|
|
16
16
|
## INTENT ROUTING - pick ONE intent reference
|
|
17
17
|
|
|
18
|
-
After grounding, make ONE judgment
|
|
18
|
+
After grounding, make ONE judgment, **ANNOUNCE it to the user in one line**, then load ONE intent reference (you ALSO read `references/full-workflow.md` for the shared mechanics - see below). The test keys on whether the desired **OUTCOME** is clear, NOT on request length. The announcement is the user's first signal of whether they will be interviewed — never skip it.
|
|
19
|
+
|
|
20
|
+
> "Intent: **CLEAR** — you specified the exact endpoint and behavior. I will ask you the genuine forks I cannot resolve from the codebase."
|
|
21
|
+
> "Intent: **UNCLEAR** — 'make auth better' is open-ended. I will research best-practice defaults and present them for your veto, no interview."
|
|
19
22
|
|
|
20
23
|
- **OVERRIDE - explicit ask wins:** if the user explicitly asks to be questioned or interviewed ("ask me", "interview me", "why aren't you asking me" - in any language), route **CLEAR**, run the interview, and turn the adopt-default filter OFF: the user has claimed the forks, so every surviving one is ASKED, not defaulted. This beats the OUTCOME test below, even on a fuzzy brief.
|
|
21
24
|
- **CLEAR** - the user knows the outcome; the only open items are preferences/tradeoffs the repo cannot answer (genuine owner-decisions). Read **`references/intent-clear.md`**: ask the surviving forks with WHY, run the normal approval gate, high-accuracy review is OPTIONAL (offered as one question).
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const BACKGROUND_TASK_DESCRIPTION = "Run agent task in background. Returns a background task ID (`bg_...`) immediately
|
|
1
|
+
export declare const BACKGROUND_TASK_DESCRIPTION = "Run agent task in background. Returns a background task ID (`bg_...`) immediately and notifies on completion.\n\nDo NOT poll for results. The system delivers a <system-reminder> when the task finishes.\n\nPrompts MUST be in English.";
|
|
2
2
|
export declare const BACKGROUND_OUTPUT_DESCRIPTION = "Get output from background task. Use full_session=true to fetch session messages with filters. System notifies on completion, so block=true rarely needed. - Timeout values are in milliseconds (ms), NOT seconds.\n\nIMPORTANT: ONLY call this tool AFTER receiving a <system-reminder> notification for the task. Do NOT call immediately after launching a background task - wait for the notification first.";
|
|
3
3
|
export declare const BACKGROUND_CANCEL_DESCRIPTION = "Cancel running background task(s). Use all=true to cancel ALL before final answer.";
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
import { isProviderExhaustionFallbackEligible } from "@oh-my-opencode/model-core";
|
|
1
2
|
import { createSyncSession } from "./sync-session-creator";
|
|
2
3
|
import { sendSyncPrompt } from "./sync-prompt-sender";
|
|
3
4
|
import { pollSyncSession } from "./sync-session-poller";
|
|
4
5
|
import { fetchSyncResult } from "./sync-result-fetcher";
|
|
5
|
-
export
|
|
6
|
-
createSyncSession: typeof createSyncSession;
|
|
7
|
-
sendSyncPrompt: typeof sendSyncPrompt;
|
|
8
|
-
pollSyncSession: typeof pollSyncSession;
|
|
9
|
-
fetchSyncResult: typeof fetchSyncResult;
|
|
6
|
+
export type SyncTaskDeps = {
|
|
7
|
+
readonly createSyncSession: typeof createSyncSession;
|
|
8
|
+
readonly sendSyncPrompt: typeof sendSyncPrompt;
|
|
9
|
+
readonly pollSyncSession: typeof pollSyncSession;
|
|
10
|
+
readonly fetchSyncResult: typeof fetchSyncResult;
|
|
11
|
+
readonly isProviderExhaustionFallbackEligible?: typeof isProviderExhaustionFallbackEligible;
|
|
10
12
|
};
|
|
11
|
-
export
|
|
13
|
+
export declare const syncTaskDeps: SyncTaskDeps;
|
|
@@ -3,7 +3,7 @@ import type { SkillMcpManager } from "../../features/skill-mcp-manager";
|
|
|
3
3
|
import type { LoadedSkill } from "../../features/opencode-skill-loader/types";
|
|
4
4
|
interface SkillMcpToolOptions {
|
|
5
5
|
manager: SkillMcpManager;
|
|
6
|
-
getLoadedSkills: () => LoadedSkill[]
|
|
6
|
+
getLoadedSkills: () => LoadedSkill[] | Promise<LoadedSkill[]>;
|
|
7
7
|
getSessionID?: () => string | undefined;
|
|
8
8
|
}
|
|
9
9
|
export declare function applyGrepFilter(output: string, pattern: string | undefined): string;
|
package/dist/tui.js
CHANGED
|
@@ -4163,6 +4163,14 @@ var init_ast_grep = __esm(() => {
|
|
|
4163
4163
|
|
|
4164
4164
|
// packages/utils/src/codegraph/env.ts
|
|
4165
4165
|
var init_env = () => {};
|
|
4166
|
+
|
|
4167
|
+
// packages/utils/src/codegraph/workspace.ts
|
|
4168
|
+
var init_workspace = () => {};
|
|
4169
|
+
|
|
4170
|
+
// packages/utils/src/codegraph/guidance.ts
|
|
4171
|
+
var init_guidance = __esm(() => {
|
|
4172
|
+
init_workspace();
|
|
4173
|
+
});
|
|
4166
4174
|
// packages/utils/src/codegraph/manifest.ts
|
|
4167
4175
|
var init_manifest = () => {};
|
|
4168
4176
|
|
|
@@ -4183,12 +4191,10 @@ var init_resolve2 = __esm(() => {
|
|
|
4183
4191
|
requireFromHere = createRequire(import.meta.url);
|
|
4184
4192
|
});
|
|
4185
4193
|
|
|
4186
|
-
// packages/utils/src/codegraph/workspace.ts
|
|
4187
|
-
var init_workspace = () => {};
|
|
4188
|
-
|
|
4189
4194
|
// packages/utils/src/codegraph/index.ts
|
|
4190
4195
|
var init_codegraph = __esm(() => {
|
|
4191
4196
|
init_env();
|
|
4197
|
+
init_guidance();
|
|
4192
4198
|
init_provision();
|
|
4193
4199
|
init_resolve2();
|
|
4194
4200
|
init_workspace();
|
|
@@ -20062,6 +20068,7 @@ var CodegraphConfigSchema;
|
|
|
20062
20068
|
var init_codegraph2 = __esm(() => {
|
|
20063
20069
|
init_zod();
|
|
20064
20070
|
CodegraphConfigSchema = exports_external.object({
|
|
20071
|
+
auto_init: exports_external.boolean().default(true),
|
|
20065
20072
|
auto_provision: exports_external.boolean().default(true),
|
|
20066
20073
|
enabled: exports_external.boolean().default(true),
|
|
20067
20074
|
install_dir: exports_external.string().optional(),
|
|
@@ -20392,7 +20399,8 @@ var init_runtime_fallback = __esm(() => {
|
|
|
20392
20399
|
max_fallback_attempts: exports_external.number().min(1).max(20).optional(),
|
|
20393
20400
|
cooldown_seconds: exports_external.number().min(0).optional(),
|
|
20394
20401
|
timeout_seconds: exports_external.number().min(0).optional(),
|
|
20395
|
-
notify_on_fallback: exports_external.boolean().optional()
|
|
20402
|
+
notify_on_fallback: exports_external.boolean().optional(),
|
|
20403
|
+
restore_primary_after_cooldown: exports_external.boolean().optional()
|
|
20396
20404
|
});
|
|
20397
20405
|
});
|
|
20398
20406
|
|
|
@@ -21462,6 +21470,11 @@ var init_runtime_fallback_error_classifier = __esm(() => {
|
|
|
21462
21470
|
init_runtime_fallback_error_shape();
|
|
21463
21471
|
});
|
|
21464
21472
|
|
|
21473
|
+
// packages/model-core/src/provider-exhaustion-fallback-policy.ts
|
|
21474
|
+
var init_provider_exhaustion_fallback_policy = __esm(() => {
|
|
21475
|
+
init_runtime_fallback_error_classifier();
|
|
21476
|
+
});
|
|
21477
|
+
|
|
21465
21478
|
// packages/model-core/src/runtime-fallback-model.ts
|
|
21466
21479
|
var init_runtime_fallback_model = __esm(() => {
|
|
21467
21480
|
init_model_string_parser();
|
|
@@ -21890,6 +21903,7 @@ var init_src3 = __esm(() => {
|
|
|
21890
21903
|
init_runtime_fallback_auto_retry_signal();
|
|
21891
21904
|
init_runtime_fallback_error_classifier();
|
|
21892
21905
|
init_runtime_fallback_error_shape();
|
|
21906
|
+
init_provider_exhaustion_fallback_policy();
|
|
21893
21907
|
init_runtime_fallback_model();
|
|
21894
21908
|
init_model_capabilities2();
|
|
21895
21909
|
init_context_limit_resolver();
|