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,107 @@
|
|
|
1
|
+
# 네이버 계열 접근 전략
|
|
2
|
+
|
|
3
|
+
> 네이버 서비스별로 접근 방법이 다르다. 블로그는 모바일 URL, 뉴스/증권은 Jina Reader.
|
|
4
|
+
|
|
5
|
+
## 네이버 블로그
|
|
6
|
+
|
|
7
|
+
WebFetch 차단. 모바일 URL 변환 + iPhone UA로 접근.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# blog.naver.com/{ID}/{NO} → m.blog.naver.com 변환
|
|
11
|
+
curl -sL \
|
|
12
|
+
-H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1" \
|
|
13
|
+
-H "Accept-Language: ko-KR,ko;q=0.9" \
|
|
14
|
+
-H "Referer: https://m.naver.com/" \
|
|
15
|
+
"https://m.blog.naver.com/PostView.naver?blogId={ID}&logNo={NO}"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
RSS도 가능 (최신 50개, 본문 약 300자):
|
|
19
|
+
```bash
|
|
20
|
+
curl -sL "https://rss.blog.naver.com/{BLOG_ID}.xml"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 네이버 뉴스
|
|
24
|
+
|
|
25
|
+
Jina Reader로 완전 접근 가능.
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# 기사 목록
|
|
29
|
+
curl -s "https://r.jina.ai/https://news.naver.com/"
|
|
30
|
+
|
|
31
|
+
# 개별 기사
|
|
32
|
+
curl -s "https://r.jina.ai/https://n.news.naver.com/article/{press_id}/{article_id}"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 네이버 증권
|
|
36
|
+
|
|
37
|
+
Jina Reader로 실시간 주가, 주요 뉴스 접근.
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
curl -s "https://r.jina.ai/https://finance.naver.com/item/main.naver?code={종목코드}"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 네이버 금융 시세 (비공식, 무인증)
|
|
44
|
+
|
|
45
|
+
인증 불필요. 주가 시계열 데이터 JSON 반환.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# 일봉 시세 (삼성전자=005930)
|
|
49
|
+
curl -sL "https://api.finance.naver.com/siseJson.naver?symbol=005930&requestType=1&startTime=20240101&endTime=20241231&timeframe=day"
|
|
50
|
+
|
|
51
|
+
# 분봉
|
|
52
|
+
curl -sL "https://api.finance.naver.com/siseJson.naver?symbol=005930&requestType=0&timeframe=minute&count=200"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
응답: `[[날짜, 시가, 고가, 저가, 종가, 거래량, 외국인거래율], ...]`
|
|
56
|
+
|
|
57
|
+
## 네이버 검색 (신원위장으로 직접 접근)
|
|
58
|
+
|
|
59
|
+
curl_cffi + 세션 쿠키 워밍으로 네이버 검색 결과를 직접 크롤링할 수 있다. API 키 불필요.
|
|
60
|
+
|
|
61
|
+
```python
|
|
62
|
+
from curl_cffi import requests
|
|
63
|
+
from urllib.parse import quote
|
|
64
|
+
|
|
65
|
+
s = requests.Session(impersonate="chrome124")
|
|
66
|
+
s.headers.update({
|
|
67
|
+
"Accept-Language": "ko-KR,ko;q=0.9",
|
|
68
|
+
"Referer": "https://www.google.com/",
|
|
69
|
+
})
|
|
70
|
+
s.get("https://www.naver.com/", timeout=10) # 쿠키 워밍
|
|
71
|
+
s.headers["Referer"] = "https://www.naver.com/"
|
|
72
|
+
|
|
73
|
+
# 통합 검색 (블로그+뉴스+웹 혼합)
|
|
74
|
+
r = s.get(f"https://search.naver.com/search.naver?query={quote('검색어')}")
|
|
75
|
+
|
|
76
|
+
# 블로그 탭
|
|
77
|
+
r = s.get(f"https://search.naver.com/search.naver?where=post&query={quote('검색어')}")
|
|
78
|
+
|
|
79
|
+
# 뉴스 탭
|
|
80
|
+
r = s.get(f"https://search.naver.com/search.naver?where=news&query={quote('검색어')}")
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 추출 가능한 데이터
|
|
84
|
+
|
|
85
|
+
| 탭 | URL 패턴 | 추출 |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| 통합 | `search.naver?query=` | 블로그 URL, 외부 링크, 뉴스 |
|
|
88
|
+
| 블로그 | `where=post&query=` | blog.naver.com URL, 제목, 스니펫 |
|
|
89
|
+
| 뉴스 | `where=news&query=` | n.news.naver.com URL, 제목 |
|
|
90
|
+
|
|
91
|
+
### 한국어 키워드 검색의 핵심 경로
|
|
92
|
+
|
|
93
|
+
WebSearch는 한국어 신규 콘텐츠 인덱싱이 지연되지만, 네이버 검색은 한국어에 최적화되어 있다.
|
|
94
|
+
**한국 사이트 키워드 검색 → 네이버 검색 직접 접근이 가장 정확하고 빠르다.**
|
|
95
|
+
|
|
96
|
+
## 네이버 카페
|
|
97
|
+
|
|
98
|
+
로그인 + iframe 이중 장벽. 본문 직접 접근 불가.
|
|
99
|
+
fallback 체인에서 Phase 1~3을 시도하되, login/paywall 감지 시 "인증 필요"로 종료.
|
|
100
|
+
|
|
101
|
+
## 네이버 TV
|
|
102
|
+
|
|
103
|
+
yt-dlp로 접근 (media.md 참조).
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
yt-dlp --dump-json "https://tv.naver.com/v/{video_id}"
|
|
107
|
+
```
|
package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Playwright — MCP vs Local Chrome
|
|
2
|
+
|
|
3
|
+
> JS 렌더링 / JS 챌린지 사이트를 위한 두 가지 접근. **WAF 프로파일의
|
|
4
|
+
> `capabilities_needed` 태그가 선택을 결정**한다. 사용자가 직접 고를 필요 없다.
|
|
5
|
+
|
|
6
|
+
## 두 Approach 요약
|
|
7
|
+
|
|
8
|
+
| Approach | 실행기 | TLS 스택 | 적합 WAF | 한계 |
|
|
9
|
+
|----------|--------|----------|----------|------|
|
|
10
|
+
| **1. MCP** | `mcp__playwright__*` 도구 | Playwright 번들 Chromium (BoringSSL) | Cloudflare 기본, CAPTCHA 없는 SPA, JS 챌린지 약한 사이트 | Akamai Bot Manager 등 TLS-감지형 WAF에 **즉시 탐지됨** (`channel` 옵션 없음) |
|
|
11
|
+
| **2. Local Node + `channel:'chrome'`** | `engine/templates/playwright_real_chrome.js` | 시스템 설치 실제 Chrome | Akamai Bot Manager, PerimeterX, DataDome 강화 설정 | Node + Chrome 시스템 설치 필요 |
|
|
12
|
+
|
|
13
|
+
`engine/executor.py`가 프로파일 태그를 보고 자동 라우팅하므로, 이 선택을 스킬 외부에서 의식할 필요는 없다.
|
|
14
|
+
|
|
15
|
+
## Approach 1 — Playwright MCP
|
|
16
|
+
|
|
17
|
+
### 의존성
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
claude mcp list 2>/dev/null | grep -q playwright && echo "OK" || echo "NOT CONNECTED"
|
|
21
|
+
claude mcp add playwright -- npx @playwright/mcp@latest
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 기본 워크플로
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
1. browser_navigate → URL
|
|
28
|
+
2. browser_wait_for → 메인 콘텐츠 셀렉터 (SPA는 필수)
|
|
29
|
+
3. browser_snapshot (접근성 트리 — 토큰 효율)
|
|
30
|
+
또는
|
|
31
|
+
browser_evaluate (특정 셀렉터 데이터 추출)
|
|
32
|
+
또는
|
|
33
|
+
browser_run_code (스크롤/페이지네이션)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 도구별 용도
|
|
37
|
+
|
|
38
|
+
| 도구 | 용도 |
|
|
39
|
+
|------|------|
|
|
40
|
+
| `browser_snapshot` | 접근성 트리 반환 — 텍스트+인터랙티브 요소 구조화. 가장 빠르고 토큰 효율적 |
|
|
41
|
+
| `browser_evaluate` | `() => document.querySelector(...).innerText` 등 JS 평가 |
|
|
42
|
+
| `browser_run_code` | `async ({ page }) => {...}` 풀 자동화 — 무한 스크롤, 다단계 인터랙션 |
|
|
43
|
+
| `browser_network_requests` | XHR/fetch 호출 목록 — **WAF 뒤 진짜 API 엔드포인트 발견용** (→ curl_cffi로 직접 호출) |
|
|
44
|
+
| `browser_console_messages` | JS 에러/로그 |
|
|
45
|
+
|
|
46
|
+
### 주의
|
|
47
|
+
|
|
48
|
+
- MCP는 Chromium 번들 기반. TLS 지문이 BoringSSL이라 Akamai/DataDome은 **293 바이트 Access Denied** 또는 즉시 403 반환.
|
|
49
|
+
- 이 경우 자동으로 Approach 2로 이관되도록 `engine/executor.py`가 처리. 수동 선택 불필요.
|
|
50
|
+
|
|
51
|
+
## Approach 2 — Local Node + Real Chrome
|
|
52
|
+
|
|
53
|
+
### 의존성 (최초 1회)
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Node (시스템 설치)
|
|
57
|
+
node -v # v18+ 권장
|
|
58
|
+
|
|
59
|
+
# Playwright + stealth 플러그인
|
|
60
|
+
npm i -g playwright playwright-extra puppeteer-extra-plugin-stealth
|
|
61
|
+
|
|
62
|
+
# 시스템 Chrome 바이너리 (번들 Chromium 아님)
|
|
63
|
+
npx playwright install chrome
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 호출 (engine 내부)
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
from insane_search.engine.executor import run_playwright_fallback
|
|
70
|
+
|
|
71
|
+
attempt, html = run_playwright_fallback(
|
|
72
|
+
"https://example.com/path",
|
|
73
|
+
profile_id="akamai_bot_manager",
|
|
74
|
+
success_selectors=["article"],
|
|
75
|
+
device_class="desktop", # "desktop" | "mobile" | "auto"
|
|
76
|
+
)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
내부에서 `engine/templates/playwright_real_chrome.js` 또는 `playwright_mobile_chrome.js`를 Node로 실행하고 HTML을 받아온다. 템플릿은 **URL과 셀렉터 파라미터만** 받으며 사이트별 분기가 없다.
|
|
80
|
+
|
|
81
|
+
### 데스크톱 템플릿 (`playwright_real_chrome.js`)
|
|
82
|
+
|
|
83
|
+
```js
|
|
84
|
+
const { chromium } = require('playwright-extra');
|
|
85
|
+
const stealth = require('puppeteer-extra-plugin-stealth')();
|
|
86
|
+
chromium.use(stealth);
|
|
87
|
+
|
|
88
|
+
const ctx = await chromium.launchPersistentContext(profileDir, {
|
|
89
|
+
channel: 'chrome', // ← 핵심: 번들 Chromium 아닌 실제 Chrome
|
|
90
|
+
headless: false, // Akamai는 headless 탐지. headful 필요.
|
|
91
|
+
viewport: { width: 1366, height: 900 },
|
|
92
|
+
});
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 모바일 템플릿 (`playwright_mobile_chrome.js`)
|
|
96
|
+
|
|
97
|
+
```js
|
|
98
|
+
const { chromium, devices } = require('playwright-extra');
|
|
99
|
+
const iPhone = devices['iPhone 13 Pro'];
|
|
100
|
+
|
|
101
|
+
const ctx = await chromium.launchPersistentContext(profileDir, {
|
|
102
|
+
channel: 'chrome', // TLS는 실제 Chrome
|
|
103
|
+
...iPhone, // UA/viewport/isMobile/hasTouch 자동 주입
|
|
104
|
+
headless: false,
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**주의**: `channel:'chrome'` + `devices[...]` 조합은 TLS 핑거프린트를 Chrome으로 유지하면서 HTTP 레이어(UA/viewport)만 모바일로 바꾼다. WAF가 실제 Chrome으로 인식해서 관대한 경우가 많다.
|
|
109
|
+
|
|
110
|
+
## 선택 규칙 (자동)
|
|
111
|
+
|
|
112
|
+
`engine/waf_profiles.yaml`의 `capabilities_needed` 태그가 결정한다:
|
|
113
|
+
|
|
114
|
+
| 태그 조합 | 선택 실행기 | 대표 케이스 |
|
|
115
|
+
|----------|-------------|-------------|
|
|
116
|
+
| `needs_real_tls_stack` + `needs_js_exec` | Approach 2 (real_chrome) | Akamai Bot Manager |
|
|
117
|
+
| `needs_js_exec` only | Approach 1 (MCP) | Cloudflare Turnstile |
|
|
118
|
+
| `needs_real_tls_stack` only | Approach 2 (real_chrome) | 일부 DataDome 설정 |
|
|
119
|
+
| 둘 다 없음 | curl 체인에서 해결. Playwright 안 씀 | F5 BIG-IP (TLS만 우회 필요) |
|
|
120
|
+
|
|
121
|
+
`device_class="mobile"`이 지정되면 real_chrome → mobile 변종으로 swap.
|
|
122
|
+
|
|
123
|
+
## 공통 검증
|
|
124
|
+
|
|
125
|
+
두 Approach 모두 최종 HTML을 `engine/validators.py:validate()`로 재검증한다. 즉 Playwright가 HTML을 받아와도 **챌린지 페이지 또는 빈 SPA면 여전히 CHALLENGE 판정**. 자동으로 다음 조합이나 failure 보고로 이어진다.
|
|
126
|
+
|
|
127
|
+
## 디버깅 팁
|
|
128
|
+
|
|
129
|
+
- `profileDir`를 고정 경로로 두면 세션·쿠키가 유지되어 재시도 빠름 (`/tmp/.insane_pw_profile`)
|
|
130
|
+
- Akamai 재시도가 잦으면 `profileDir`를 삭제해 fresh 상태로 리셋
|
|
131
|
+
- 실패 시 `result.trace`의 `error` 필드에 Node stderr 200자가 포함됨
|
|
132
|
+
|
|
133
|
+
## 사이트 예시 (독자 이해용, 코드 분기 근거 아님)
|
|
134
|
+
|
|
135
|
+
> 이 섹션은 **설명 목적**이며 `engine/**` 코드에는 반영되지 않는다.
|
|
136
|
+
|
|
137
|
+
- **Cloudflare 기본 챌린지**: Approach 1 (MCP) 충분
|
|
138
|
+
- **Akamai Bot Manager**: Approach 2 필수. MCP로는 TLS-UA 불일치 탐지됨
|
|
139
|
+
- **SSR 블로그 플랫폼**: curl_cffi safari만으로 HTML 수신. Playwright 불필요
|
|
140
|
+
- **검색 결과 JS 렌더링 SPA**: Approach 1로 `browser_wait_for` 후 `browser_snapshot`
|
|
141
|
+
|
|
142
|
+
실제 라우팅은 프로파일 태그가 결정한다. 위 예시는 참고일 뿐 코드 분기 근거로 쓰지 않는다.
|
package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/public-api.md
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# 공개 API 직접 호출
|
|
2
|
+
|
|
3
|
+
> 인증 없이 구조화된 데이터를 반환하는 공개 API.
|
|
4
|
+
> 웹 크롤링이 아니라 공식 API — 안정적이고 정확.
|
|
5
|
+
|
|
6
|
+
## Bluesky (AT Protocol)
|
|
7
|
+
|
|
8
|
+
프로필과 피드는 완전 공개. 검색은 403 차단.
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
# 프로필
|
|
12
|
+
curl -sL "https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor={handle}" | \
|
|
13
|
+
python3 -c "import sys,json; d=json.load(sys.stdin); print(f'{d[\"displayName\"]} — Followers: {d[\"followersCount\"]}, Posts: {d[\"postsCount\"]}')"
|
|
14
|
+
|
|
15
|
+
# 피드 (최근 게시물)
|
|
16
|
+
curl -sL "https://public.api.bsky.app/xrpc/app.bsky.feed.getAuthorFeed?actor={handle}&limit=10"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Rate limit: ~3,000 req/hour
|
|
20
|
+
|
|
21
|
+
## Mastodon
|
|
22
|
+
|
|
23
|
+
인스턴스별 상이. mastodon.social은 공개 타임라인 차단, hachyderm.io/fosstodon.org 등은 허용.
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# 계정 조회
|
|
27
|
+
curl -sL "https://{instance}/api/v1/accounts/lookup?acct={username}"
|
|
28
|
+
|
|
29
|
+
# 계정 타임라인 (ID 획득 후)
|
|
30
|
+
curl -sL "https://{instance}/api/v1/accounts/{id}/statuses?limit=10"
|
|
31
|
+
|
|
32
|
+
# 해시태그 타임라인 (인스턴스에 따라 인증 필요)
|
|
33
|
+
curl -sL "https://hachyderm.io/api/v1/timelines/tag/{tag}?limit=10"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Stack Exchange (v2.3)
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# 질문 검색
|
|
40
|
+
curl -sL "https://api.stackexchange.com/2.3/search?order=desc&sort=votes&intitle={query}&site=stackoverflow"
|
|
41
|
+
|
|
42
|
+
# 태그 기반
|
|
43
|
+
curl -sL "https://api.stackexchange.com/2.3/questions?tagged={tag1};{tag2}&site=stackoverflow&pagesize=5"
|
|
44
|
+
|
|
45
|
+
# 답변 포함 (본문 필요 시)
|
|
46
|
+
curl -sL "https://api.stackexchange.com/2.3/questions/{id}/answers?order=desc&sort=votes&site=stackoverflow&filter=withbody"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Rate limit: 비인증 300 req/day (IP당)
|
|
50
|
+
|
|
51
|
+
## arXiv (학술 논문)
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# 논문 검색 (ti=제목, au=저자, abs=초록, cat=카테고리)
|
|
55
|
+
curl -sL "http://export.arxiv.org/api/query?search_query=ti:{query}&max_results=5&sortBy=submittedDate&sortOrder=descending"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**주의**: 3 req/second 제한. 요청 간 1초 sleep 필수.
|
|
59
|
+
카테고리: cs.AI, cs.CL, cs.LG, cs.CV 등
|
|
60
|
+
|
|
61
|
+
## CrossRef (DOI / 피어리뷰 논문)
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# 논문 검색
|
|
65
|
+
curl -sL "https://api.crossref.org/works?query={query}&filter=from-pub-date:2025-01&rows=5&sort=relevance"
|
|
66
|
+
|
|
67
|
+
# DOI로 조회
|
|
68
|
+
curl -sL "https://api.crossref.org/works/{DOI}"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Rate limit: 50 req/second. User-Agent에 이메일 추가 시 Polite Pool 진입.
|
|
72
|
+
|
|
73
|
+
## OpenLibrary (도서)
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# ISBN 조회
|
|
77
|
+
curl -sL "https://openlibrary.org/api/books?bibkeys=ISBN:{isbn}&jscmd=data&format=json"
|
|
78
|
+
|
|
79
|
+
# 도서 검색
|
|
80
|
+
curl -sL "https://openlibrary.org/search.json?q={query}&limit=5"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Wayback Machine (아카이브)
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# 스냅샷 확인
|
|
87
|
+
curl -sL "https://archive.org/wayback/available?url={URL}"
|
|
88
|
+
|
|
89
|
+
# CDX API (스냅샷 목록)
|
|
90
|
+
curl -sL "https://web.archive.org/cdx/search/cdx?url={URL}&output=json&fl=timestamp,statuscode&limit=5"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## GitHub REST API (gh CLI 없을 때)
|
|
94
|
+
|
|
95
|
+
비인증 60 req/hour. gh CLI 우선 사용 권장.
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# 저장소 검색
|
|
99
|
+
curl -sL "https://api.github.com/search/repositories?q={query}&sort=stars&per_page=5"
|
|
100
|
+
|
|
101
|
+
# 릴리즈
|
|
102
|
+
curl -sL "https://api.github.com/repos/{owner}/{repo}/releases?per_page=5"
|
|
103
|
+
|
|
104
|
+
# 코드 검색
|
|
105
|
+
curl -sL "https://api.github.com/search/code?q={query}+language:python&per_page=5"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Rate Limit 요약
|
|
109
|
+
|
|
110
|
+
| API | 비인증 | 비고 |
|
|
111
|
+
|-----|-------|------|
|
|
112
|
+
| Bluesky | ~3K/hr | 검색 403 |
|
|
113
|
+
| Mastodon | 인스턴스별 | |
|
|
114
|
+
| Stack Exchange | 300/day | 인증 시 10K |
|
|
115
|
+
| arXiv | 3/sec | sleep 필수 |
|
|
116
|
+
| CrossRef | 50/sec | |
|
|
117
|
+
| OpenLibrary | 무제한 | |
|
|
118
|
+
| Wayback | 무제한 | |
|
|
119
|
+
| GitHub REST | 60/hr | gh CLI 우선 |
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# RSS/Atom 피드
|
|
2
|
+
|
|
3
|
+
> 인증 불필요. URL만 알면 바로 구독. 뉴스/블로그/커뮤니티에서 가장 깔끔한 데이터.
|
|
4
|
+
|
|
5
|
+
## 의존성
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
python3 -c "import feedparser" 2>/dev/null || pip install feedparser -q
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## RSS 자동 발견
|
|
12
|
+
|
|
13
|
+
Jina Reader JSON 모드로 사이트의 RSS URL을 자동 탐지:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
curl -sH "Accept: application/json" "https://r.jina.ai/{URL}" | \
|
|
17
|
+
python3 -c "import sys,json; print(json.load(sys.stdin)['data'].get('external',{}).get('alternate',[]))"
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## URL 변형으로 피드 탐색
|
|
21
|
+
|
|
22
|
+
사이트에 RSS가 명시되지 않아도 시도해볼 패턴:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
curl -sL "{origin}/rss"
|
|
26
|
+
curl -sL "{origin}/feed"
|
|
27
|
+
curl -sL "{origin}/atom.xml"
|
|
28
|
+
curl -sL "{origin}/rss.xml"
|
|
29
|
+
curl -sL "{origin}/index.xml"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Google News RSS (무인증)
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# 키워드 검색
|
|
36
|
+
curl -sL "https://news.google.com/rss/search?q={검색어}&hl=ko&gl=KR&ceid=KR:ko"
|
|
37
|
+
|
|
38
|
+
# 토픽별 (TECHNOLOGY, BUSINESS, SCIENCE, SPORTS, HEALTH, WORLD)
|
|
39
|
+
curl -sL "https://news.google.com/rss/headlines/section/topic/TECHNOLOGY?hl=ko&gl=KR&ceid=KR:ko"
|
|
40
|
+
|
|
41
|
+
# 시간 필터: when:1h, when:7d, when:12m, after:YYYY-MM-DD
|
|
42
|
+
curl -sL "https://news.google.com/rss/search?q={검색어}+when:7d&hl=ko&gl=KR&ceid=KR:ko"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 한국 언론사 RSS
|
|
46
|
+
|
|
47
|
+
전부 무인증. 바로 curl로 접근 가능.
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# SBS 뉴스
|
|
51
|
+
curl -sL "https://news.sbs.co.kr/news/rss.do"
|
|
52
|
+
|
|
53
|
+
# 조선일보
|
|
54
|
+
curl -sL "http://www.chosun.com/site/data/rss/rss.xml"
|
|
55
|
+
|
|
56
|
+
# 중앙일보
|
|
57
|
+
curl -sL "http://rss.joinsmsn.com/joins_news_list.xml"
|
|
58
|
+
|
|
59
|
+
# 동아일보
|
|
60
|
+
curl -sL "http://rss.donga.com/total.xml"
|
|
61
|
+
|
|
62
|
+
# 경향신문
|
|
63
|
+
curl -sL "http://www.khan.co.kr/rss/rssdata/total_news.xml"
|
|
64
|
+
|
|
65
|
+
# 매일경제
|
|
66
|
+
curl -sL "http://file.mk.co.kr/news/rss/rss_30000001.xml"
|
|
67
|
+
|
|
68
|
+
# MBC 뉴스
|
|
69
|
+
curl -sL "http://imnews.imbc.com/rss/news/news_00.xml"
|
|
70
|
+
|
|
71
|
+
# 한국경제
|
|
72
|
+
curl -sL "https://www.hankyung.com/feed/all-news"
|
|
73
|
+
|
|
74
|
+
# 연합뉴스
|
|
75
|
+
curl -sL "https://www.yonhapnewsagency.com/RSS/headline.xml"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 블로그/플랫폼 RSS
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# 네이버 블로그
|
|
82
|
+
curl -sL "https://rss.blog.naver.com/{BLOG_ID}.xml"
|
|
83
|
+
|
|
84
|
+
# 티스토리
|
|
85
|
+
curl -sL "https://{blogname}.tistory.com/rss"
|
|
86
|
+
|
|
87
|
+
# 벨로그
|
|
88
|
+
curl -sL "https://v2.velog.io/rss/@{username}"
|
|
89
|
+
|
|
90
|
+
# Substack
|
|
91
|
+
curl -sL "https://{publication}.substack.com/feed"
|
|
92
|
+
|
|
93
|
+
# GitHub 릴리즈 (Atom)
|
|
94
|
+
curl -sL "https://github.com/{owner}/{repo}/releases.atom"
|
|
95
|
+
|
|
96
|
+
# YouTube 채널
|
|
97
|
+
curl -sL "https://www.youtube.com/feeds/videos.xml?channel_id={id}"
|
|
98
|
+
|
|
99
|
+
# HN (hnrss.org — 비공식이지만 안정적)
|
|
100
|
+
curl -sL "https://hnrss.org/frontpage"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## feedparser 파싱
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
import feedparser
|
|
107
|
+
|
|
108
|
+
feed = feedparser.parse("FEED_URL")
|
|
109
|
+
for e in feed.entries[:10]:
|
|
110
|
+
print(f"{e.title} — {e.link}")
|
|
111
|
+
if hasattr(e, 'summary'):
|
|
112
|
+
print(f" {e.summary[:200]}")
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## SearXNG (무인증 메타검색)
|
|
116
|
+
|
|
117
|
+
공개 인스턴스에서 JSON 검색 가능. 인스턴스별로 JSON 지원 여부 다름.
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# 공개 인스턴스 목록: https://searx.space
|
|
121
|
+
curl -sL "https://search.mdosch.de/search?q={검색어}&format=json" \
|
|
122
|
+
-H "User-Agent: insane-search/1.0"
|
|
123
|
+
```
|
package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/tls-impersonate.md
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# TLS 임퍼소네이션 — curl_cffi
|
|
2
|
+
|
|
3
|
+
> TLS 핑거프린트(JA3/JA4) 기반 WAF를 우회하는 핵심 방법.
|
|
4
|
+
> 일반 curl/requests는 OpenSSL 핑거프린트라 즉시 차단되지만,
|
|
5
|
+
> curl_cffi는 실제 브라우저(Chrome/Safari/Firefox)의 TLS 핑거프린트를 복제한다.
|
|
6
|
+
|
|
7
|
+
## 의존성
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
python3 -c "import curl_cffi" 2>/dev/null || pip install curl_cffi -q
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
설치 후 사용 가능. **미설치를 이유로 이 스텝을 건너뛰지 않는다.**
|
|
14
|
+
|
|
15
|
+
## 다중 타겟 순차 시도
|
|
16
|
+
|
|
17
|
+
하나의 impersonate 타겟이 실패하면 다른 타겟으로 재시도한다.
|
|
18
|
+
**시도 순서: safari → chrome → firefox**
|
|
19
|
+
|
|
20
|
+
```python
|
|
21
|
+
from curl_cffi import requests
|
|
22
|
+
|
|
23
|
+
TARGETS = ["safari", "chrome", "firefox"]
|
|
24
|
+
HEADERS = {
|
|
25
|
+
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
26
|
+
"Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
|
|
27
|
+
"Accept-Encoding": "gzip, deflate, br",
|
|
28
|
+
"Referer": "https://www.google.com/",
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
def cffi_fetch(url, locale="ko-KR"):
|
|
32
|
+
"""다중 타겟 순차 시도 + 신원위장. 성공하면 (response, target) 반환."""
|
|
33
|
+
from urllib.parse import urlparse
|
|
34
|
+
origin = f"{urlparse(url).scheme}://{urlparse(url).netloc}"
|
|
35
|
+
for target in TARGETS:
|
|
36
|
+
try:
|
|
37
|
+
session = requests.Session(impersonate=target)
|
|
38
|
+
session.headers.update(HEADERS)
|
|
39
|
+
session.headers["Accept-Language"] = f"{locale},{locale.split('-')[0]};q=0.9"
|
|
40
|
+
session.headers["Referer"] = "https://www.google.com/"
|
|
41
|
+
# 신원위장: 홈페이지 쿠키 워밍 → Referer 체인
|
|
42
|
+
try:
|
|
43
|
+
session.get(origin, timeout=10)
|
|
44
|
+
except Exception:
|
|
45
|
+
pass # 홈 실패해도 본 요청은 시도
|
|
46
|
+
session.headers["Referer"] = origin
|
|
47
|
+
resp = session.get(url, timeout=20)
|
|
48
|
+
# JS 필수 사이트 감지 → 나머지 타겟 시도 무의미
|
|
49
|
+
if "behavioral-content" in resp.text or "sec-if-cpt" in resp.text:
|
|
50
|
+
return None, None # → Phase 3 Playwright
|
|
51
|
+
if resp.status_code == 200 and len(resp.text) > 500:
|
|
52
|
+
return resp, target
|
|
53
|
+
except Exception:
|
|
54
|
+
continue
|
|
55
|
+
return None, None
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## 임퍼소네이션 타겟 목록 (v0.15.0)
|
|
59
|
+
|
|
60
|
+
generic alias는 항상 최신 버전으로 해석된다. **2026년에 chrome99 같은 옛 버전은 WAF가 의심하므로 generic alias 사용 권장.**
|
|
61
|
+
|
|
62
|
+
| Alias | 해석 (2026.04) | 용도 |
|
|
63
|
+
|-------|---------------|------|
|
|
64
|
+
| `safari` | safari260 | **한국 사이트 최적** (쿠팡, 에펨코리아) |
|
|
65
|
+
| `chrome` | chrome146 | 범용 (Cloudflare, Akamai) |
|
|
66
|
+
| `firefox` | firefox135 | chrome/safari 실패 시 대안 |
|
|
67
|
+
| `chrome_android` | chrome131_android | 모바일 API 엔드포인트 |
|
|
68
|
+
| `safari_ios` | safari260_ios | iOS 모바일 |
|
|
69
|
+
|
|
70
|
+
<details>
|
|
71
|
+
<summary>핀 버전 전체 (클릭)</summary>
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
chrome99, chrome100, chrome101, chrome104, chrome107, chrome110,
|
|
75
|
+
chrome116, chrome119, chrome120, chrome123, chrome124, chrome131,
|
|
76
|
+
chrome133a, chrome136, chrome142, chrome145, chrome146,
|
|
77
|
+
chrome131_android, edge99, edge101,
|
|
78
|
+
safari15_3, safari15_5, safari17_0, safari17_2_ios,
|
|
79
|
+
safari18_0, safari18_0_ios, safari260, safari260_ios,
|
|
80
|
+
firefox133, firefox135
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
</details>
|
|
84
|
+
|
|
85
|
+
## WAF별 최적 전략
|
|
86
|
+
|
|
87
|
+
| WAF | 최적 타겟 | 추가 조건 | 성공률 |
|
|
88
|
+
|-----|-----------|-----------|--------|
|
|
89
|
+
| F5 BIG-IP (쿠팡) | `safari` | `Referer: https://www.coupang.com/` | ~70% |
|
|
90
|
+
| Cloudflare (TLS만) | `chrome` | Sec-Fetch-* 헤더 추가 | ~80% |
|
|
91
|
+
| Akamai | `chrome` | 레지덴셜 프록시 병행 | 80-90% |
|
|
92
|
+
| AWS WAF | `chrome` | — | ~80% |
|
|
93
|
+
| CloudFront (요즘IT) | 불필요 | 일반 curl + Chrome UA로 충분 | 100% |
|
|
94
|
+
|
|
95
|
+
## 세션과 쿠키
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
from curl_cffi import requests
|
|
99
|
+
|
|
100
|
+
# 세션 유지 (쿠키 자동 관리)
|
|
101
|
+
session = requests.Session(impersonate="safari")
|
|
102
|
+
|
|
103
|
+
# 첫 요청으로 세션 쿠키 획득
|
|
104
|
+
session.get("https://www.coupang.com/")
|
|
105
|
+
|
|
106
|
+
# 이후 요청에 쿠키 자동 전달
|
|
107
|
+
resp = session.get("https://www.coupang.com/np/search?q=키보드")
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 콤보: nodriver/FlareSolverr → curl_cffi
|
|
111
|
+
|
|
112
|
+
JS 챌린지 사이트는 브라우저로 쿠키를 획득한 뒤 curl_cffi로 고속 처리:
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
# 1. nodriver로 cf_clearance 쿠키 획득
|
|
116
|
+
import nodriver as uc
|
|
117
|
+
browser = await uc.start(headless=True)
|
|
118
|
+
page = await browser.get("https://cf-protected-site.com")
|
|
119
|
+
await page.cf_verify()
|
|
120
|
+
cookies = await browser.cookies.get_all()
|
|
121
|
+
|
|
122
|
+
# 2. curl_cffi Session에 쿠키 전달
|
|
123
|
+
from curl_cffi import requests
|
|
124
|
+
session = requests.Session(impersonate="chrome")
|
|
125
|
+
for c in cookies:
|
|
126
|
+
session.cookies.set(c["name"], c["value"])
|
|
127
|
+
resp = session.get("https://cf-protected-site.com/api/data")
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## 비동기 (async)
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
import asyncio
|
|
134
|
+
from curl_cffi.requests import AsyncSession
|
|
135
|
+
|
|
136
|
+
async def fetch_many(urls):
|
|
137
|
+
async with AsyncSession(impersonate="chrome") as session:
|
|
138
|
+
tasks = [session.get(url) for url in urls]
|
|
139
|
+
return await asyncio.gather(*tasks)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## HTTP/3 (v0.15.0+)
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
from curl_cffi import requests
|
|
146
|
+
from curl_cffi.const import CurlHttpVersion
|
|
147
|
+
|
|
148
|
+
resp = requests.get(
|
|
149
|
+
"https://www.cloudflare.com/",
|
|
150
|
+
impersonate="chrome",
|
|
151
|
+
http_version=CurlHttpVersion.V3,
|
|
152
|
+
)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
WAF 벤더들이 아직 HTTP/3 핑거프린트를 적극 활용하지 않아 우회 효과가 높다.
|
|
156
|
+
|
|
157
|
+
## 대안 라이브러리
|
|
158
|
+
|
|
159
|
+
curl_cffi 실패 시 대안:
|
|
160
|
+
|
|
161
|
+
| 라이브러리 | 설치 | 특징 |
|
|
162
|
+
|-----------|------|------|
|
|
163
|
+
| primp | `pip install primp` | Rust 기반, Firefox 148까지, 고성능 |
|
|
164
|
+
| wreq/rnet | `pip install wreq` | Rust 기반, 100+ 디바이스 프로필 |
|
|
165
|
+
| tls-client2 | `pip install tls-client2` | Go 기반 포크, 동기만 |
|
|
166
|
+
|
|
167
|
+
```python
|
|
168
|
+
# primp 예시
|
|
169
|
+
import primp
|
|
170
|
+
client = primp.Client(impersonate="chrome_146")
|
|
171
|
+
resp = client.get("https://example.com")
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## curl_cffi가 못 뚫는 것
|
|
175
|
+
|
|
176
|
+
| 방어 수단 | curl_cffi | 대응 |
|
|
177
|
+
|-----------|-----------|------|
|
|
178
|
+
| TLS/JA3 핑거프린트 | 우회 가능 | 핵심 기능 |
|
|
179
|
+
| HTTP/2 SETTINGS 핑거프린트 | 우회 가능 | impersonate에 포함 |
|
|
180
|
+
| HTTP/3 QUIC 핑거프린트 | 우회 가능 (v0.15+) | 신규 |
|
|
181
|
+
| JS 챌린지 (Turnstile 등) | **불가** | → nodriver 또는 Playwright |
|
|
182
|
+
| CAPTCHA | **불가** | → 2captcha/CapSolver |
|
|
183
|
+
| IP 평판 (데이터센터) | **불가** | → 프록시/VPN |
|
|
184
|
+
| 행동 분석 (마우스/타이밍) | **불가** | → 실제 브라우저 |
|
|
185
|
+
|
|
186
|
+
JS 챌린지가 걸린 사이트는 → [playwright.md](playwright.md) 로 넘긴다.
|