oh-my-opencode 4.12.1 → 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 +896 -669
- package/dist/cli-node/index.js +896 -669
- 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 +708 -413
- 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 +23 -4
- package/dist/skills/ulw-plan/SKILL.md +4 -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 +9 -1
- package/package.json +16 -14
- package/packages/omo-codex/THIRD-PARTY-NOTICES.md +27 -4
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -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 +323 -39
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +292 -19
- package/packages/omo-codex/plugin/components/codegraph/package.json +9 -3
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +75 -0
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +29 -13
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +20 -7
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +1 -243
- 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 +1 -1
- 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-unavailable.test.ts +133 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +1 -113
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +8 -1
- 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/package.json +1 -1
- 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/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/package-lock.json +112 -13
- package/packages/omo-codex/plugin/package.json +2 -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/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 +23 -4
- 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/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-codegraph-mcp-smoke.test.mjs +76 -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 +30 -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 +520 -216
- 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 +23 -4
- 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,105 @@
|
|
|
1
|
+
# ATTRIBUTION / NOTICE
|
|
2
|
+
|
|
3
|
+
This skill (`ultimate-browsing`, part of `@oh-my-opencode/shared-skills`) ships
|
|
4
|
+
project-original content plus two third-party tools that it installs at runtime
|
|
5
|
+
(it does NOT vendor their source). Each runtime tool's license and required
|
|
6
|
+
notices are reproduced below.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. Project-original content (no third-party source vendored)
|
|
11
|
+
|
|
12
|
+
The following are authored by the oh-my-openagent project and carry no third-party
|
|
13
|
+
license obligation:
|
|
14
|
+
|
|
15
|
+
- `engine/**` — the insane-search Tier-1 fetch engine (curl_cffi grid, WAF
|
|
16
|
+
detection, Playwright fallback templates, `bias_check.py` no-site-name gate).
|
|
17
|
+
- `references/insane-search/**` and `references/agent-reach/**` — the Tier-1 and
|
|
18
|
+
Tier-1.5 reference docs.
|
|
19
|
+
- `scripts/extract_cookies.py`, `scripts/cookie_paths.py`, `scripts/cookie_crypto.py`
|
|
20
|
+
and their tests — the cross-platform cookie module.
|
|
21
|
+
- `SKILL.md`, `references/chrome-stealth.md`.
|
|
22
|
+
|
|
23
|
+
These reference platform-native CLIs and public APIs by name (e.g. `xhs`, `yt-dlp`,
|
|
24
|
+
`agent-reach`, `mcporter`, Jina Reader, V2EX public API). Those are external tools the
|
|
25
|
+
user installs separately; this skill includes none of their source.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 2. CloakBrowser (CloakHQ) — Tier-2 stealth Chromium (runtime dependency)
|
|
30
|
+
|
|
31
|
+
The Tier-2 stealth browser is **CloakBrowser**, installed at runtime via `pip`
|
|
32
|
+
(`pip install cloakbrowser`). No CloakBrowser source is vendored in this repository.
|
|
33
|
+
|
|
34
|
+
- Source: https://github.com/CloakHQ/CloakBrowser
|
|
35
|
+
- Pinned runtime version: **0.4.0** (documented in `references/chrome-stealth.md`;
|
|
36
|
+
this is a documented version string, not an automated drift check).
|
|
37
|
+
- Wrapper source license: MIT License.
|
|
38
|
+
- Binary license: the compiled CloakBrowser Chromium binary downloaded by
|
|
39
|
+
`cloakbrowser.ensure_binary()` is governed by the separate CloakBrowser
|
|
40
|
+
Binary License:
|
|
41
|
+
https://github.com/CloakHQ/CloakBrowser/blob/main/BINARY-LICENSE.md
|
|
42
|
+
- Redistribution note: this npm package does not redistribute the CloakBrowser
|
|
43
|
+
binary, does not repackage it, and does not include it in `skills/` or
|
|
44
|
+
`dist/skills`. Users who run the Tier-2 setup download the binary directly
|
|
45
|
+
from CloakHQ's official distribution channels and must comply with that
|
|
46
|
+
binary license.
|
|
47
|
+
|
|
48
|
+
MIT wrapper source license:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
MIT License
|
|
52
|
+
|
|
53
|
+
Copyright (c) 2026 CloakHQ
|
|
54
|
+
|
|
55
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
56
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
57
|
+
in the Software without restriction, including without limitation the rights
|
|
58
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
59
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
60
|
+
furnished to do so, subject to the following conditions:
|
|
61
|
+
|
|
62
|
+
The above copyright notice and this permission notice shall be included in all
|
|
63
|
+
copies or substantial portions of the Software.
|
|
64
|
+
|
|
65
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
66
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
67
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
68
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
69
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
70
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
71
|
+
SOFTWARE.
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 3. agent-browser (vercel-labs) — Tier-2 CDP automation CLI (runtime dependency)
|
|
77
|
+
|
|
78
|
+
The Tier-2 automation CLI is **agent-browser**, installed at runtime via `npm`
|
|
79
|
+
(`npm i -g agent-browser`). No agent-browser source is vendored in this repository.
|
|
80
|
+
|
|
81
|
+
- Source: https://github.com/vercel-labs/agent-browser
|
|
82
|
+
- Pinned runtime version: **0.29.1** (documented in `references/chrome-stealth.md`;
|
|
83
|
+
documented version string, no automated drift check).
|
|
84
|
+
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
|
85
|
+
these files except in compliance with the License. You may obtain a copy of the
|
|
86
|
+
License at:
|
|
87
|
+
|
|
88
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
89
|
+
|
|
90
|
+
Unless required by applicable law or agreed to in writing, software distributed under
|
|
91
|
+
the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
92
|
+
KIND, either express or implied. See the License for the specific language governing
|
|
93
|
+
permissions and limitations under the License.
|
|
94
|
+
|
|
95
|
+
- **Changes (Apache-2.0 §4(b)):** none. agent-browser is installed unmodified at
|
|
96
|
+
runtime; no agent-browser source file is copied, modified, or redistributed by this
|
|
97
|
+
skill. This skill only documents how to invoke the upstream CLI.
|
|
98
|
+
|
|
99
|
+
- **NOTICE:** the upstream agent-browser distribution may include a `NOTICE` file. As
|
|
100
|
+
this skill redistributes no agent-browser source, no upstream NOTICE content is
|
|
101
|
+
bundled here; consult the upstream repository for its `NOTICE` file when present.
|
|
102
|
+
|
|
103
|
+
- **Trademark notice:** "agent-browser" and "Vercel" are referenced by name for
|
|
104
|
+
identification only. No trademark license is granted under the Apache License 2.0
|
|
105
|
+
(Section 6).
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ultimate-browsing
|
|
3
|
+
description: "Escalation skill for blocked or hard-to-reach web access — load it when a normal browse/fetch is blocked (WAF, 403, Cloudflare, JS-only render, login-gated, or a platform a generic fetcher cannot read). Tiered router: TIER 1 insane-search (headless extraction + WAF bypass via curl_cffi TLS impersonation, yt-dlp, Jina Reader, public APIs, Playwright real-Chrome fallback); TIER 1.5 agent-reach (platform-native readers for Chinese and social platforms: Xiaohongshu, Douyin, Weibo, Bilibili, V2EX, WeChat, plus Twitter/Reddit/LinkedIn/GitHub); TIER 2 Chrome stealth (CloakBrowser stealth Chromium + agent-browser CDP for clicks, forms, screenshots, video, cookie login). Triggers: blocked site, bypass bot detection, cloudflare/WAF bypass, scrape, stealth browser, import cookies, fill form, screenshot, play youtube, xiaohongshu, douyin, weibo, bilibili, v2ex, wechat article, podcast transcript. NOT for simple searches (use web-search) or plain fetches (use webfetch)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Ultimate Browsing
|
|
7
|
+
|
|
8
|
+
Escalation web access for tasks a normal browse or fetch cannot complete. Reach for this skill the moment a page is blocked (WAF / 403 / Cloudflare), needs JS rendering, hides behind a login, or lives on a platform a generic fetcher cannot read. Escalate only when the cheaper tier cannot do the job:
|
|
9
|
+
|
|
10
|
+
**Tier 1 — insane-search** (headless extraction + WAF bypass) -> **Tier 1.5 — agent-reach** (platform-native APIs, esp. Chinese platforms) -> **Tier 2 — Chrome stealth** (real interaction via CloakBrowser + agent-browser).
|
|
11
|
+
|
|
12
|
+
## PHASE 0 — ROUTE FIRST (MANDATORY)
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
User request
|
|
16
|
+
|
|
|
17
|
+
+- extract text/data from a URL --------------------- TIER 1 insane-search
|
|
18
|
+
+- URL blocked / 403 / Cloudflare / WAF ------------- TIER 1 insane-search
|
|
19
|
+
+- YouTube/Vimeo/TikTok subtitles or metadata ------- TIER 1 insane-search (yt-dlp)
|
|
20
|
+
+- read an article / blog / Reddit / HN / arXiv ----- TIER 1 insane-search
|
|
21
|
+
|
|
|
22
|
+
+- Chinese platform (xhs/douyin/weibo/bilibili/v2ex/wechat) TIER 1.5 agent-reach
|
|
23
|
+
+- podcast transcript / stock forum ----------------- TIER 1.5 agent-reach
|
|
24
|
+
+- Twitter feed / LinkedIn profile / GitHub via CLI - TIER 1.5 agent-reach
|
|
25
|
+
|
|
|
26
|
+
+- Tier 1/1.5 returned empty or partial ------------- TIER 2 Chrome stealth
|
|
27
|
+
+- click / fill form / scroll / interact ------------ TIER 2 Chrome stealth
|
|
28
|
+
+- screenshot / render / play video ----------------- TIER 2 Chrome stealth
|
|
29
|
+
+- login session across pages / inject cookies ------ TIER 2 Chrome stealth
|
|
30
|
+
+- test web app / QA / dogfood ---------------------- TIER 2 Chrome stealth
|
|
31
|
+
|
|
|
32
|
+
+- simple search query ------------------------------ NOT this skill (use web-search)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Read the matching reference before acting: [`references/insane-search/README.md`](references/insane-search/README.md), [`references/agent-reach/README.md`](references/agent-reach/README.md), or [`references/chrome-stealth.md`](references/chrome-stealth.md).
|
|
36
|
+
|
|
37
|
+
## Tier 1 — insane-search (headless extraction)
|
|
38
|
+
|
|
39
|
+
**When**: content extraction, blocked-URL bypass, media metadata — no browser UI needed.
|
|
40
|
+
**Why first**: ~10x faster than a browser, no process spin-up; handles most "fetch this blocked page" requests via curl_cffi TLS impersonation, yt-dlp (1858 sites), Jina Reader, official public APIs, mobile URL transforms, and a Playwright real-Chrome fallback. The engine lives **inside this skill** at `engine/` and is invoked as a module.
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Core command — auto-detects WAF, runs the full fetch grid (run from the skill dir):
|
|
44
|
+
python3 -m engine "https://example.com/blocked-page"
|
|
45
|
+
# add --selector "<CSS>" for positive-proof validation, --device auto|desktop|mobile,
|
|
46
|
+
# --trace to inspect every attempt, --json for machine-readable output.
|
|
47
|
+
|
|
48
|
+
# YouTube subtitles / metadata (no browser):
|
|
49
|
+
yt-dlp --write-sub --write-auto-sub --sub-lang "en,ko" --skip-download -o "/tmp/%(id)s" "<URL>"
|
|
50
|
+
|
|
51
|
+
# Reddit / HN / Bluesky / arXiv etc. use official public endpoints — see the Phase 0 index in
|
|
52
|
+
# references/insane-search/README.md (Twitter syndication, Reddit .json, HN Firebase, ...).
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The full engine harness (rules R1-R7, the Phase 0 official-API index, the no-site-name rule, and the `references/insane-search/*.md` deep-dives for TLS, Playwright routing, Naver, media, etc.) is in [`references/insane-search/README.md`](references/insane-search/README.md). Read it before tuning the engine or adding a WAF profile.
|
|
56
|
+
|
|
57
|
+
### Escalate to Tier 1.5 or Tier 2 when
|
|
58
|
+
- The target is a Chinese / social platform with a native reader -> Tier 1.5.
|
|
59
|
+
- insane-search returns empty/partial, or the page needs JS interaction, a screenshot, a persistent login, or media playback -> Tier 2.
|
|
60
|
+
|
|
61
|
+
## Tier 1.5 — agent-reach (platform-native readers)
|
|
62
|
+
|
|
63
|
+
**When**: the target is a platform with a first-class API/CLI that beats generic fetching — especially Chinese platforms that stealth browsers still cannot reach cleanly. Several channels are zero-config (Douyin, Weibo via Jina, V2EX, Reddit, Jina Reader, RSS, YouTube); others need a one-time auth you supply via environment variables if you have access.
|
|
64
|
+
|
|
65
|
+
| Category | Platforms | Entry |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| social | xhs (Xiaohongshu), douyin, weibo, bilibili, V2EX, Reddit, Twitter/X | [references/agent-reach/social.md](references/agent-reach/social.md) |
|
|
68
|
+
| web | Jina Reader, WeChat articles, RSS | [references/agent-reach/web.md](references/agent-reach/web.md) |
|
|
69
|
+
| video | YouTube, Bilibili, podcast transcripts, Douyin video | [references/agent-reach/video.md](references/agent-reach/video.md) |
|
|
70
|
+
| career | LinkedIn | [references/agent-reach/career.md](references/agent-reach/career.md) |
|
|
71
|
+
| dev | GitHub (gh CLI) | [references/agent-reach/dev.md](references/agent-reach/dev.md) |
|
|
72
|
+
| search | Exa AI | [references/agent-reach/search.md](references/agent-reach/search.md) |
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
mcporter call 'douyin.parse_douyin_video_info(url: "<URL>")' # douyin, zero-config
|
|
76
|
+
curl -s "https://r.jina.ai/https://weibo.com/<uid>/<pid>" # weibo via Jina
|
|
77
|
+
yt-dlp --dump-json "<bilibili-url>" # Bilibili (overseas: add --cookies-from-browser)
|
|
78
|
+
curl -s "https://www.v2ex.com/api/topics/hot.json" # V2EX public API
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Routing table, per-platform auth (set `TWITTER_*` env vars, `gh auth login`, a transcription key — only if you have access), rate-limit notes, and known version quirks are in [references/agent-reach/README.md](references/agent-reach/README.md).
|
|
82
|
+
|
|
83
|
+
## Tier 2 — Chrome stealth (real interaction)
|
|
84
|
+
|
|
85
|
+
**When**: real interaction is needed (clicks, forms, screenshots, video, persistent login), or Tier 1/1.5 failed.
|
|
86
|
+
|
|
87
|
+
CloakBrowser is a stealth Chromium with source-level fingerprint patches that passes Cloudflare Turnstile, FingerprintJS, BrowserScan, and 30+ detectors; agent-browser is the CDP automation CLI that drives it. Both are runtime-installed tools (not vendored here). Full setup, version pins, launch flow, cookie login, and cross-platform notes are in [references/chrome-stealth.md](references/chrome-stealth.md).
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# 1. Launch CloakBrowser with CDP on :9242 (see chrome-stealth.md for install + venv).
|
|
91
|
+
# 2. CloakBrowser launches tabless — open the first tab via CDP before any agent-browser command:
|
|
92
|
+
curl -s -X PUT "http://127.0.0.1:9242/json/new?https://example.com"
|
|
93
|
+
# 3. Drive it with agent-browser over CDP:
|
|
94
|
+
agent-browser --cdp 9242 snapshot -i # interactive elements (@eN refs)
|
|
95
|
+
agent-browser --cdp 9242 click @e3
|
|
96
|
+
agent-browser --cdp 9242 screenshot out.png
|
|
97
|
+
agent-browser --cdp 9242 close
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Cookie login (cross-platform)
|
|
101
|
+
|
|
102
|
+
`scripts/extract_cookies.py` reads cookies from a local Chromium-family or Firefox-family browser and optionally injects them into the running CDP session. It resolves browser profile paths and decrypts cookie values per-OS (macOS Keychain, Linux libsecret, Windows DPAPI):
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Extract cookies to a file:
|
|
106
|
+
mkdir -p ~/.local/state/omo-cookies
|
|
107
|
+
python3 scripts/extract_cookies.py --browser chrome --domain youtube.com --output ~/.local/state/omo-cookies/youtube.cookies.json
|
|
108
|
+
# Extract and inject into the running CDP session:
|
|
109
|
+
python3 scripts/extract_cookies.py --browser chrome --domain youtube.com --inject --cdp 9242
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Cookie export files are written with owner-only `0600` permissions. Do not place live auth cookies in shared temp directories or commit them to a repo. Cookie injection sends values to CDP over stdin rather than argv. Cookies apply on next navigation — reload after injecting. Google services use fingerprint-bound tokens that may not transfer across browser profiles. Full detail in [references/chrome-stealth.md](references/chrome-stealth.md).
|
|
113
|
+
|
|
114
|
+
## Reference docs
|
|
115
|
+
|
|
116
|
+
| File | When to read |
|
|
117
|
+
|------|-------------|
|
|
118
|
+
| [references/insane-search/README.md](references/insane-search/README.md) | Tier-1 engine harness (R1-R7, Phase 0 API index, no-site-name rule) + its `*.md` deep-dives |
|
|
119
|
+
| [references/agent-reach/README.md](references/agent-reach/README.md) | Tier-1.5 routing table, platform auth, per-category `*.md` |
|
|
120
|
+
| [references/chrome-stealth.md](references/chrome-stealth.md) | Tier-2 CloakBrowser + agent-browser install, CDP flow, version pins, cookie login |
|
|
121
|
+
|
|
122
|
+
## Environment variables
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
CLOAK_CDP_PORT=9242 # CloakBrowser CDP port (default 9242)
|
|
126
|
+
AGENT_BROWSER_USER_AGENT="..." # override UA to hide HeadlessChrome
|
|
127
|
+
AGENT_BROWSER_HEADED=1 # show the browser window
|
|
128
|
+
# agent-reach auth: set the channel-specific env vars from each tool's docs only if you have access
|
|
129
|
+
# insane-search needs no env vars — it auto-installs deps on first run
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Anti-patterns
|
|
133
|
+
|
|
134
|
+
- Do NOT launch Chrome stealth for plain text extraction — use Tier 1.
|
|
135
|
+
- Do NOT pass an `--init-script` for the webdriver flag — CloakBrowser already patches it at source; the only required override is `--user-agent`.
|
|
136
|
+
- Do NOT run agent-browser before creating the first tab via `curl -X PUT .../json/new` — CloakBrowser launches tabless.
|
|
137
|
+
- Do NOT use vanilla Chrome when stealth is needed — always CloakBrowser.
|
|
138
|
+
- Do NOT forget to `close` the session when done.
|
|
139
|
+
- Do NOT inject cookies without reloading the page.
|
|
140
|
+
- Do NOT hardcode site domains/selectors into `engine/**` or `waf_profiles.yaml` — runtime hints only (see the no-site-name rule in the insane-search reference).
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""insane-search engine — generic WAF-profile-based fetch chain.
|
|
2
|
+
|
|
3
|
+
No site-specific logic lives here. Site specifics belong to runtime hints or
|
|
4
|
+
observations, never to code. See `../SKILL.md` for the No-Site-Name Rule.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .validators import Verdict, ValidationResult, validate, CHALLENGE_MARKERS
|
|
8
|
+
from .waf_detector import detect
|
|
9
|
+
from .url_transforms import TRANSFORMS, apply_transform
|
|
10
|
+
from .fetch_chain import fetch
|
|
11
|
+
from .result_schema import Attempt, FetchResult
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"Verdict",
|
|
15
|
+
"ValidationResult",
|
|
16
|
+
"validate",
|
|
17
|
+
"CHALLENGE_MARKERS",
|
|
18
|
+
"detect",
|
|
19
|
+
"TRANSFORMS",
|
|
20
|
+
"apply_transform",
|
|
21
|
+
"fetch",
|
|
22
|
+
"FetchResult",
|
|
23
|
+
"Attempt",
|
|
24
|
+
]
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""CLI entrypoint for the insane-search engine.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
python3 -m engine URL [--selector CSS] [--device auto|desktop|mobile]
|
|
6
|
+
[--timeout N] [--max-attempts N] [--json] [--trace]
|
|
7
|
+
|
|
8
|
+
Examples:
|
|
9
|
+
python3 -m engine "https://example.com/" --selector "h1"
|
|
10
|
+
python3 -m engine "https://example.com/" --json
|
|
11
|
+
python3 -m engine "https://example.com/" --device mobile --trace
|
|
12
|
+
|
|
13
|
+
Exit codes:
|
|
14
|
+
0 strong_ok or weak_ok
|
|
15
|
+
1 ok=False (all attempts failed)
|
|
16
|
+
2 CLI arg error
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import json
|
|
22
|
+
import sys
|
|
23
|
+
|
|
24
|
+
from . import fetch
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def build_parser() -> argparse.ArgumentParser:
|
|
28
|
+
p = argparse.ArgumentParser(prog="python3 -m engine",
|
|
29
|
+
description="Generic WAF-profile fetch chain.")
|
|
30
|
+
p.add_argument("url", help="URL to fetch.")
|
|
31
|
+
p.add_argument("--selector", "-s", action="append", default=None,
|
|
32
|
+
dest="selectors", metavar="CSS",
|
|
33
|
+
help="Positive-proof CSS selector. Repeatable.")
|
|
34
|
+
p.add_argument("--device", choices=("auto", "desktop", "mobile"), default="auto",
|
|
35
|
+
help="Device class pin.")
|
|
36
|
+
p.add_argument("--timeout", type=int, default=25,
|
|
37
|
+
help="Per-attempt timeout seconds (default 25).")
|
|
38
|
+
p.add_argument("--max-attempts", type=int, default=12,
|
|
39
|
+
help="Upper bound across all phases (default 12).")
|
|
40
|
+
p.add_argument("--no-playwright", action="store_true",
|
|
41
|
+
help="Skip Playwright fallback (curl-only).")
|
|
42
|
+
p.add_argument("--json", action="store_true",
|
|
43
|
+
help="Emit FetchResult as JSON to stdout (content omitted).")
|
|
44
|
+
p.add_argument("--trace", action="store_true",
|
|
45
|
+
help="Print per-attempt trace to stderr.")
|
|
46
|
+
return p
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def main(argv: list[str] | None = None) -> int:
|
|
50
|
+
args = build_parser().parse_args(argv)
|
|
51
|
+
try:
|
|
52
|
+
result = fetch(
|
|
53
|
+
args.url,
|
|
54
|
+
success_selectors=args.selectors,
|
|
55
|
+
device_class=args.device,
|
|
56
|
+
timeout=args.timeout,
|
|
57
|
+
max_attempts=args.max_attempts,
|
|
58
|
+
enable_playwright=not args.no_playwright,
|
|
59
|
+
)
|
|
60
|
+
except Exception as e:
|
|
61
|
+
print(f"engine fatal: {type(e).__name__}: {e}", file=sys.stderr)
|
|
62
|
+
return 2
|
|
63
|
+
|
|
64
|
+
if args.trace:
|
|
65
|
+
print("=== trace ===", file=sys.stderr)
|
|
66
|
+
for att in result.trace:
|
|
67
|
+
d = att.to_dict()
|
|
68
|
+
imp = d.get("impersonate") or "-"
|
|
69
|
+
ref = d.get("referer") or "-"
|
|
70
|
+
print(
|
|
71
|
+
f"[{d['phase']:<8}] {d['executor']:<18} "
|
|
72
|
+
f"xform={d['url_transform']:<16} imp={imp:<14} ref={ref:<14} "
|
|
73
|
+
f"status={d['status']:>4} size={d['body_size']:>8} "
|
|
74
|
+
f"verdict={d['verdict']} {('err=' + d['error'][:60]) if d.get('error') else ''}",
|
|
75
|
+
file=sys.stderr,
|
|
76
|
+
)
|
|
77
|
+
print(f"=== summary: {result.summary} ===", file=sys.stderr)
|
|
78
|
+
|
|
79
|
+
# Surface R7 hint (API-first route) prominently when summary contains it,
|
|
80
|
+
# regardless of --trace flag — this is actionable guidance, not noise.
|
|
81
|
+
if "R7 API-first" in (result.summary or ""):
|
|
82
|
+
print(
|
|
83
|
+
"\n════════════════════════════════════════════════════════════════\n"
|
|
84
|
+
"⚠️ R7 triggered — consider API-first route instead of HTML grid.\n"
|
|
85
|
+
" See summary below (or re-run with --trace for full attempt log).\n"
|
|
86
|
+
"════════════════════════════════════════════════════════════════",
|
|
87
|
+
file=sys.stderr,
|
|
88
|
+
)
|
|
89
|
+
# Also print the full summary (which includes the hint) so caller sees it.
|
|
90
|
+
print(result.summary, file=sys.stderr)
|
|
91
|
+
|
|
92
|
+
if args.json:
|
|
93
|
+
payload = result.to_dict()
|
|
94
|
+
print(json.dumps(payload, ensure_ascii=False, indent=2))
|
|
95
|
+
else:
|
|
96
|
+
# Default: HTML to stdout, status to stderr.
|
|
97
|
+
print(result.content, end="")
|
|
98
|
+
print(f"\n[engine] ok={result.ok} verdict={result.verdict} "
|
|
99
|
+
f"profile={result.profile_used} attempts={len(result.trace)}",
|
|
100
|
+
file=sys.stderr)
|
|
101
|
+
|
|
102
|
+
return 0 if result.ok else 1
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
if __name__ == "__main__":
|
|
106
|
+
sys.exit(main())
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""No-Site-Name Rule checker.
|
|
3
|
+
|
|
4
|
+
Run in CI / pre-commit. Scans engine/** for hard-coded site names or
|
|
5
|
+
domains that would bias the generic fetch chain toward one site.
|
|
6
|
+
|
|
7
|
+
Exit code 0 if clean, 1 if violations found.
|
|
8
|
+
|
|
9
|
+
python3 engine/bias_check.py
|
|
10
|
+
python3 engine/bias_check.py --strict # also check references/*.md (usually off)
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import argparse
|
|
15
|
+
import os
|
|
16
|
+
import re
|
|
17
|
+
import sys
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# Known brand / domain substrings that should NOT appear in engine code.
|
|
22
|
+
# This is a non-exhaustive deny list. CI should treat hits as warnings that
|
|
23
|
+
# require human review; false positives (e.g. "github" in comments) can be
|
|
24
|
+
# whitelisted via EXPLICIT_ALLOW.
|
|
25
|
+
BRAND_SUBSTRINGS = [
|
|
26
|
+
"coupang", "11st", "11번가", "musinsa", "무신사",
|
|
27
|
+
"fmkorea", "에펨코리아", "dcinside", "디시인사이드",
|
|
28
|
+
"ohou", "오늘의집", "kurly", "마켓컬리",
|
|
29
|
+
"daangn", "당근",
|
|
30
|
+
# Naver is allowed in Phase 0 references (official APIs) but not in engine code.
|
|
31
|
+
"naver.com", "blog.naver", "shopping.naver",
|
|
32
|
+
# Korean portal brand names
|
|
33
|
+
"daum.net", "kakao.com",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
# Regex for bare URLs / domains. Used as a secondary pass to flag hardcoded
|
|
37
|
+
# site hosts that slipped past the brand denylist.
|
|
38
|
+
URL_PATTERN = re.compile(
|
|
39
|
+
r"https?://[\w\.-]+|[\w-]+\.(?:com|net|org|co\.kr|kr|io)\b",
|
|
40
|
+
re.IGNORECASE,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Generic / neutral hosts that are allowed anywhere (examples, specs, stdlib,
|
|
44
|
+
# and domains that legitimately appear as non-site-specific referrers / test
|
|
45
|
+
# fixtures — Google search as a generic Referer strategy, httpbin for transport
|
|
46
|
+
# tests, etc.). Anything in this set must be provably unrelated to a specific
|
|
47
|
+
# target-site preference.
|
|
48
|
+
URL_ALLOWLIST = {
|
|
49
|
+
"example.com", "example.org", "example.net",
|
|
50
|
+
"localhost", "127.0.0.1",
|
|
51
|
+
# Official API / documentation sources cited in code comments.
|
|
52
|
+
"curl.se", "playwright.dev", "nodejs.org", "npmjs.com",
|
|
53
|
+
# Generic Referer strategy target (used as a neutral off-site referer).
|
|
54
|
+
"www.google.com", "google.com",
|
|
55
|
+
# Generic HTTP test endpoint for infrastructure / transport tests.
|
|
56
|
+
"httpbin.org",
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# Files / dirs that must be clean.
|
|
60
|
+
SCAN_ROOTS_STRICT_OFF = ["engine"]
|
|
61
|
+
SCAN_ROOTS_STRICT_ON = ["engine", "references"]
|
|
62
|
+
|
|
63
|
+
# Directory names skipped during scan (third-party code, build artefacts).
|
|
64
|
+
EXCLUDED_DIR_NAMES = {
|
|
65
|
+
"node_modules", "__pycache__", ".git", ".venv", "dist", "build",
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
# Comment markers within which a brand mention is OK (explanation).
|
|
69
|
+
# Keyed per-extension; any line containing these is skipped.
|
|
70
|
+
COMMENT_OK_MARKERS = {
|
|
71
|
+
".py": ("# NOTE-BIAS-OK", "# EXAMPLE-ONLY"),
|
|
72
|
+
".js": ("// NOTE-BIAS-OK", "// EXAMPLE-ONLY"),
|
|
73
|
+
".yaml": ("# NOTE-BIAS-OK", "# EXAMPLE-ONLY"),
|
|
74
|
+
".yml": ("# NOTE-BIAS-OK", "# EXAMPLE-ONLY"),
|
|
75
|
+
".md": ("<!-- NOTE-BIAS-OK -->", "<!-- EXAMPLE-ONLY -->"),
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
# File paths explicitly exempted (full match against relative path from scan root).
|
|
79
|
+
EXPLICIT_ALLOW_FILES = {
|
|
80
|
+
# None right now — add if needed with justification.
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _line_is_exempt(line: str, ext: str) -> bool:
|
|
85
|
+
markers = COMMENT_OK_MARKERS.get(ext, ())
|
|
86
|
+
return any(m in line for m in markers)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _scan_file(path: Path, root: Path) -> list[str]:
|
|
90
|
+
"""Return list of violation strings for this file."""
|
|
91
|
+
rel = path.relative_to(root.parent)
|
|
92
|
+
if str(rel) in EXPLICIT_ALLOW_FILES:
|
|
93
|
+
return []
|
|
94
|
+
|
|
95
|
+
ext = path.suffix.lower()
|
|
96
|
+
try:
|
|
97
|
+
text = path.read_text(encoding="utf-8", errors="ignore")
|
|
98
|
+
except Exception as e:
|
|
99
|
+
return [f"{rel}:0 — read error: {e}"]
|
|
100
|
+
|
|
101
|
+
violations: list[str] = []
|
|
102
|
+
for lineno, line in enumerate(text.splitlines(), start=1):
|
|
103
|
+
if _line_is_exempt(line, ext):
|
|
104
|
+
continue
|
|
105
|
+
lowered = line.lower()
|
|
106
|
+
# 1) Brand / domain denylist
|
|
107
|
+
hit_brand = None
|
|
108
|
+
for brand in BRAND_SUBSTRINGS:
|
|
109
|
+
if brand.lower() in lowered:
|
|
110
|
+
hit_brand = brand
|
|
111
|
+
break
|
|
112
|
+
if hit_brand:
|
|
113
|
+
violations.append(f"{rel}:{lineno} — brand `{hit_brand}` in: {line.strip()[:120]}")
|
|
114
|
+
continue # one violation per line
|
|
115
|
+
# 2) URL/domain regex scan — catches hosts that aren't in the denylist.
|
|
116
|
+
for match in URL_PATTERN.finditer(line):
|
|
117
|
+
host = match.group(0).lower()
|
|
118
|
+
host = host.split("//", 1)[-1].split("/", 1)[0]
|
|
119
|
+
if host in URL_ALLOWLIST:
|
|
120
|
+
continue
|
|
121
|
+
if host.endswith(".example.com") or host.endswith(".example.org"):
|
|
122
|
+
continue
|
|
123
|
+
violations.append(f"{rel}:{lineno} — hardcoded host `{host}` in: {line.strip()[:120]}")
|
|
124
|
+
break
|
|
125
|
+
return violations
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def main(argv: list[str] | None = None) -> int:
|
|
129
|
+
parser = argparse.ArgumentParser(description="Scan engine for site-name bias")
|
|
130
|
+
parser.add_argument("--strict", action="store_true",
|
|
131
|
+
help="Also scan references/*.md (usually noisy — off by default)")
|
|
132
|
+
parser.add_argument("--root", default=None,
|
|
133
|
+
help="Skill root directory. Defaults to parent of this file.")
|
|
134
|
+
args = parser.parse_args(argv)
|
|
135
|
+
|
|
136
|
+
skill_root = Path(args.root) if args.root else Path(__file__).parent.parent
|
|
137
|
+
scan_roots = SCAN_ROOTS_STRICT_ON if args.strict else SCAN_ROOTS_STRICT_OFF
|
|
138
|
+
|
|
139
|
+
total_violations: list[str] = []
|
|
140
|
+
scanned = 0
|
|
141
|
+
for name in scan_roots:
|
|
142
|
+
root = skill_root / name
|
|
143
|
+
if not root.exists():
|
|
144
|
+
continue
|
|
145
|
+
for dirpath, dirnames, filenames in os.walk(root):
|
|
146
|
+
# In-place filter so os.walk skips these subtrees.
|
|
147
|
+
dirnames[:] = [d for d in dirnames if d not in EXCLUDED_DIR_NAMES]
|
|
148
|
+
for fname in filenames:
|
|
149
|
+
p = Path(dirpath) / fname
|
|
150
|
+
if p.suffix.lower() not in (".py", ".js", ".yaml", ".yml", ".md", ".ts", ".mjs"):
|
|
151
|
+
continue
|
|
152
|
+
if p.name == "bias_check.py":
|
|
153
|
+
continue # self-exempt (this file lists the brands)
|
|
154
|
+
scanned += 1
|
|
155
|
+
total_violations.extend(_scan_file(p, skill_root))
|
|
156
|
+
|
|
157
|
+
print(f"[bias-check] scanned {scanned} files under {skill_root}")
|
|
158
|
+
if total_violations:
|
|
159
|
+
print(f"[bias-check] ❌ {len(total_violations)} violation(s):")
|
|
160
|
+
for v in total_violations:
|
|
161
|
+
print(f" - {v}")
|
|
162
|
+
print()
|
|
163
|
+
print("Fix options:")
|
|
164
|
+
print(" 1) Remove the brand name (preferred)")
|
|
165
|
+
print(" 2) If genuinely explanatory, add '# NOTE-BIAS-OK' on the same line")
|
|
166
|
+
print(" 3) If this is a Phase 0 official API reference, move it to references/*.md and rerun without --strict")
|
|
167
|
+
return 1
|
|
168
|
+
|
|
169
|
+
print("[bias-check] ✅ clean")
|
|
170
|
+
return 0
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
if __name__ == "__main__":
|
|
174
|
+
sys.exit(main())
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import time
|
|
4
|
+
from typing import Iterable, Mapping, Protocol
|
|
5
|
+
|
|
6
|
+
from .referers import REFERER_STRATEGIES
|
|
7
|
+
from .result_schema import Attempt
|
|
8
|
+
from .validators import Verdict, validate
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class _CookieItem(Protocol):
|
|
12
|
+
name: str
|
|
13
|
+
value: str
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class _CookieJar(Protocol):
|
|
17
|
+
jar: Iterable[_CookieItem]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ProbeResponse(Protocol):
|
|
21
|
+
status_code: int
|
|
22
|
+
text: str
|
|
23
|
+
url: str
|
|
24
|
+
cookies: _CookieJar | Mapping[str, str]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _curl_probe(
|
|
28
|
+
url: str, *, impersonate: str, referer: str, timeout: int = 20
|
|
29
|
+
) -> tuple[ProbeResponse | None, str | None]:
|
|
30
|
+
try:
|
|
31
|
+
from curl_cffi import requests as cffi_requests
|
|
32
|
+
except ImportError:
|
|
33
|
+
return None, "curl_cffi not installed"
|
|
34
|
+
|
|
35
|
+
headers = {
|
|
36
|
+
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
37
|
+
"Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
|
|
38
|
+
}
|
|
39
|
+
if referer:
|
|
40
|
+
headers["Referer"] = referer
|
|
41
|
+
|
|
42
|
+
try:
|
|
43
|
+
resp = cffi_requests.get(
|
|
44
|
+
url,
|
|
45
|
+
impersonate=impersonate,
|
|
46
|
+
headers=headers,
|
|
47
|
+
timeout=timeout,
|
|
48
|
+
allow_redirects=True,
|
|
49
|
+
)
|
|
50
|
+
return resp, None
|
|
51
|
+
except cffi_requests.exceptions.RequestException as e:
|
|
52
|
+
return None, f"{type(e).__name__}:{str(e)[:200]}"
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def run_attempt(
|
|
56
|
+
url: str,
|
|
57
|
+
*,
|
|
58
|
+
transform_name: str,
|
|
59
|
+
impersonate: str,
|
|
60
|
+
referer_name: str,
|
|
61
|
+
success_selectors: list[str] | None,
|
|
62
|
+
known_bad_sizes: list[int] | None,
|
|
63
|
+
timeout: int,
|
|
64
|
+
phase: str,
|
|
65
|
+
) -> tuple[Attempt, ProbeResponse | None]:
|
|
66
|
+
referer_url = REFERER_STRATEGIES.get(referer_name, REFERER_STRATEGIES["none"])(url)
|
|
67
|
+
started_at = time.time()
|
|
68
|
+
resp, err = _curl_probe(url, impersonate=impersonate, referer=referer_url, timeout=timeout)
|
|
69
|
+
elapsed = round(time.time() - started_at, 3)
|
|
70
|
+
|
|
71
|
+
att = Attempt(
|
|
72
|
+
phase=phase,
|
|
73
|
+
executor="curl_cffi",
|
|
74
|
+
url=url,
|
|
75
|
+
url_transform=transform_name,
|
|
76
|
+
impersonate=impersonate,
|
|
77
|
+
referer=referer_name,
|
|
78
|
+
elapsed_s=elapsed,
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
if err or resp is None:
|
|
82
|
+
att.error = err or "no response"
|
|
83
|
+
att.verdict = Verdict.UNKNOWN.value
|
|
84
|
+
return att, None
|
|
85
|
+
|
|
86
|
+
vr = validate(resp, success_selectors=success_selectors, known_bad_sizes=known_bad_sizes)
|
|
87
|
+
att.status = vr.status
|
|
88
|
+
att.body_size = vr.body_size
|
|
89
|
+
att.verdict = vr.verdict.value
|
|
90
|
+
att.reasons = vr.reasons
|
|
91
|
+
return att, resp
|