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.
Files changed (539) hide show
  1. package/README.md +1 -1
  2. package/THIRD-PARTY-NOTICES.md +1 -1
  3. package/dist/agents/sisyphus-agent-factory.d.ts +9 -0
  4. package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +31 -0
  5. package/dist/cli/index.js +896 -669
  6. package/dist/cli-node/index.js +896 -669
  7. package/dist/config/schema/codegraph.d.ts +1 -0
  8. package/dist/config/schema/oh-my-opencode-config.d.ts +2 -0
  9. package/dist/config/schema/runtime-fallback.d.ts +1 -0
  10. package/dist/features/background-agent/background-task-marker.d.ts +8 -0
  11. package/dist/features/background-agent/fallback-retry-handler.d.ts +1 -0
  12. package/dist/features/background-agent/manager.d.ts +1 -0
  13. package/dist/features/background-agent/parent-wake-dedupe.d.ts +1 -0
  14. package/dist/features/background-agent/parent-wake-notifier-types.d.ts +2 -0
  15. package/dist/features/background-agent/parent-wake-notifier.d.ts +1 -0
  16. package/dist/features/background-agent/parent-wake-window-recovery.d.ts +2 -0
  17. package/dist/hooks/runtime-fallback/auto-retry-dispatch.d.ts +2 -2
  18. package/dist/hooks/runtime-fallback/auto-retry-timeout.d.ts +2 -2
  19. package/dist/hooks/runtime-fallback/auto-retry.d.ts +1 -1
  20. package/dist/hooks/runtime-fallback/fallback-state-snapshot.d.ts +13 -0
  21. package/dist/hooks/runtime-fallback/types.d.ts +8 -0
  22. package/dist/index.js +708 -413
  23. package/dist/oh-my-opencode.schema.json +8 -0
  24. package/dist/plugin/runtime-skill-resolver.d.ts +35 -0
  25. package/dist/plugin/skill-context.d.ts +9 -0
  26. package/dist/skills/frontend/ATTRIBUTION.md +32 -8
  27. package/dist/skills/frontend/references/design/airbnb.md +3 -0
  28. package/dist/skills/frontend/references/design/airtable.md +3 -0
  29. package/dist/skills/frontend/references/design/apple.md +3 -0
  30. package/dist/skills/frontend/references/design/binance.md +3 -0
  31. package/dist/skills/frontend/references/design/bmw.md +3 -0
  32. package/dist/skills/frontend/references/design/bugatti.md +3 -0
  33. package/dist/skills/frontend/references/design/cal.md +3 -0
  34. package/dist/skills/frontend/references/design/claude.md +3 -0
  35. package/dist/skills/frontend/references/design/clay.md +3 -0
  36. package/dist/skills/frontend/references/design/clickhouse.md +3 -0
  37. package/dist/skills/frontend/references/design/cohere.md +3 -0
  38. package/dist/skills/frontend/references/design/coinbase.md +3 -0
  39. package/dist/skills/frontend/references/design/composio.md +3 -0
  40. package/dist/skills/frontend/references/design/cursor.md +3 -0
  41. package/dist/skills/frontend/references/design/elevenlabs.md +3 -0
  42. package/dist/skills/frontend/references/design/expo.md +3 -0
  43. package/dist/skills/frontend/references/design/ferrari.md +3 -0
  44. package/dist/skills/frontend/references/design/figma.md +3 -0
  45. package/dist/skills/frontend/references/design/framer.md +3 -0
  46. package/dist/skills/frontend/references/design/hashicorp.md +3 -0
  47. package/dist/skills/frontend/references/design/ibm.md +3 -0
  48. package/dist/skills/frontend/references/design/imagegen-frontend-web.md +380 -79
  49. package/dist/skills/frontend/references/design/intercom.md +3 -0
  50. package/dist/skills/frontend/references/design/kraken.md +3 -0
  51. package/dist/skills/frontend/references/design/lamborghini.md +3 -0
  52. package/dist/skills/frontend/references/design/linear.app.md +3 -0
  53. package/dist/skills/frontend/references/design/lovable.md +3 -0
  54. package/dist/skills/frontend/references/design/mastercard.md +3 -0
  55. package/dist/skills/frontend/references/design/meta.md +3 -0
  56. package/dist/skills/frontend/references/design/minimax.md +3 -0
  57. package/dist/skills/frontend/references/design/mintlify.md +3 -0
  58. package/dist/skills/frontend/references/design/miro.md +3 -0
  59. package/dist/skills/frontend/references/design/mistral.ai.md +3 -0
  60. package/dist/skills/frontend/references/design/mongodb.md +3 -0
  61. package/dist/skills/frontend/references/design/nike.md +3 -0
  62. package/dist/skills/frontend/references/design/notion.md +3 -0
  63. package/dist/skills/frontend/references/design/nvidia.md +3 -0
  64. package/dist/skills/frontend/references/design/ollama.md +3 -0
  65. package/dist/skills/frontend/references/design/opencode.ai.md +3 -0
  66. package/dist/skills/frontend/references/design/pinterest.md +3 -0
  67. package/dist/skills/frontend/references/design/playstation.md +3 -0
  68. package/dist/skills/frontend/references/design/posthog.md +3 -0
  69. package/dist/skills/frontend/references/design/raycast.md +3 -0
  70. package/dist/skills/frontend/references/design/renault.md +3 -0
  71. package/dist/skills/frontend/references/design/replicate.md +3 -0
  72. package/dist/skills/frontend/references/design/resend.md +3 -0
  73. package/dist/skills/frontend/references/design/revolut.md +3 -0
  74. package/dist/skills/frontend/references/design/runwayml.md +3 -0
  75. package/dist/skills/frontend/references/design/sanity.md +3 -0
  76. package/dist/skills/frontend/references/design/sentry.md +3 -0
  77. package/dist/skills/frontend/references/design/shopify.md +3 -0
  78. package/dist/skills/frontend/references/design/spacex.md +3 -0
  79. package/dist/skills/frontend/references/design/spotify.md +3 -0
  80. package/dist/skills/frontend/references/design/starbucks.md +3 -0
  81. package/dist/skills/frontend/references/design/stitch-skill.md +1 -1
  82. package/dist/skills/frontend/references/design/stripe.md +3 -0
  83. package/dist/skills/frontend/references/design/supabase.md +3 -0
  84. package/dist/skills/frontend/references/design/superhuman.md +3 -0
  85. package/dist/skills/frontend/references/design/taste-skill.md +1188 -208
  86. package/dist/skills/frontend/references/design/tesla.md +3 -0
  87. package/dist/skills/frontend/references/design/theverge.md +3 -0
  88. package/dist/skills/frontend/references/design/together.ai.md +3 -0
  89. package/dist/skills/frontend/references/design/uber.md +3 -0
  90. package/dist/skills/frontend/references/design/vercel.md +3 -0
  91. package/dist/skills/frontend/references/design/vodafone.md +3 -0
  92. package/dist/skills/frontend/references/design/voltagent.md +3 -0
  93. package/dist/skills/frontend/references/design/warp.md +3 -0
  94. package/dist/skills/frontend/references/design/webflow.md +3 -0
  95. package/dist/skills/frontend/references/design/wired.md +3 -0
  96. package/dist/skills/frontend/references/design/wise.md +3 -0
  97. package/dist/skills/frontend/references/design/x.ai.md +3 -0
  98. package/dist/skills/frontend/references/design/zapier.md +3 -0
  99. package/dist/skills/frontend/references/ui-ux-db/README.md +501 -115
  100. package/dist/skills/frontend/references/ui-ux-db/data/charts.csv +26 -26
  101. package/dist/skills/frontend/references/ui-ux-db/data/colors.csv +162 -97
  102. package/dist/skills/frontend/references/ui-ux-db/data/icons.csv +105 -100
  103. package/dist/skills/frontend/references/ui-ux-db/data/landing.csv +22 -18
  104. package/dist/skills/frontend/references/ui-ux-db/data/products.csv +162 -97
  105. package/dist/skills/frontend/references/ui-ux-db/data/stacks/flutter.csv +53 -53
  106. package/dist/skills/frontend/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -56
  107. package/dist/skills/frontend/references/ui-ux-db/data/stacks/nextjs.csv +53 -53
  108. package/dist/skills/frontend/references/ui-ux-db/data/stacks/react.csv +54 -54
  109. package/dist/skills/frontend/references/ui-ux-db/data/stacks/svelte.csv +54 -54
  110. package/dist/skills/frontend/references/ui-ux-db/data/stacks/swiftui.csv +51 -51
  111. package/dist/skills/frontend/references/ui-ux-db/data/stacks/vue.csv +50 -50
  112. package/dist/skills/frontend/references/ui-ux-db/data/styles.csv +17 -0
  113. package/dist/skills/frontend/references/ui-ux-db/data/typography.csv +17 -1
  114. package/dist/skills/frontend/references/ui-ux-db/data/ui-reasoning.csv +162 -101
  115. package/dist/skills/frontend/references/ui-ux-db/data/web-interface.csv +30 -30
  116. package/dist/skills/frontend/references/ui-ux-db/scripts/core.py +31 -22
  117. package/dist/skills/frontend/references/ui-ux-db/scripts/design_system.py +150 -69
  118. package/dist/skills/frontend/references/ui-ux-db/scripts/search.py +3 -3
  119. package/dist/skills/lcx-doctor/SKILL.md +1 -1
  120. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +105 -0
  121. package/dist/skills/ultimate-browsing/SKILL.md +140 -0
  122. package/dist/skills/ultimate-browsing/engine/__init__.py +24 -0
  123. package/dist/skills/ultimate-browsing/engine/__main__.py +106 -0
  124. package/dist/skills/ultimate-browsing/engine/bias_check.py +174 -0
  125. package/dist/skills/ultimate-browsing/engine/curl_probe.py +91 -0
  126. package/dist/skills/ultimate-browsing/engine/executor.py +192 -0
  127. package/dist/skills/ultimate-browsing/engine/fetch_chain.py +268 -0
  128. package/dist/skills/ultimate-browsing/engine/referers.py +15 -0
  129. package/dist/skills/ultimate-browsing/engine/result_schema.py +45 -0
  130. package/dist/skills/ultimate-browsing/engine/summary.py +37 -0
  131. package/dist/skills/ultimate-browsing/engine/templates/package.json +11 -0
  132. package/dist/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +129 -0
  133. package/dist/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +167 -0
  134. package/dist/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +77 -0
  135. package/dist/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +282 -0
  136. package/dist/skills/ultimate-browsing/engine/url_transforms.py +98 -0
  137. package/dist/skills/ultimate-browsing/engine/validators.py +216 -0
  138. package/dist/skills/ultimate-browsing/engine/waf_detector.py +214 -0
  139. package/dist/skills/ultimate-browsing/engine/waf_profiles.yaml +162 -0
  140. package/dist/skills/ultimate-browsing/references/agent-reach/README.md +79 -0
  141. package/dist/skills/ultimate-browsing/references/agent-reach/career.md +29 -0
  142. package/dist/skills/ultimate-browsing/references/agent-reach/dev.md +62 -0
  143. package/dist/skills/ultimate-browsing/references/agent-reach/search.md +33 -0
  144. package/dist/skills/ultimate-browsing/references/agent-reach/social.md +207 -0
  145. package/dist/skills/ultimate-browsing/references/agent-reach/video.md +115 -0
  146. package/dist/skills/ultimate-browsing/references/agent-reach/web.md +76 -0
  147. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +120 -0
  148. package/dist/skills/ultimate-browsing/references/insane-search/README.md +319 -0
  149. package/dist/skills/ultimate-browsing/references/insane-search/cache-archive.md +83 -0
  150. package/dist/skills/ultimate-browsing/references/insane-search/fallback.md +159 -0
  151. package/dist/skills/ultimate-browsing/references/insane-search/jina.md +130 -0
  152. package/dist/skills/ultimate-browsing/references/insane-search/json-api.md +133 -0
  153. package/dist/skills/ultimate-browsing/references/insane-search/media.md +123 -0
  154. package/dist/skills/ultimate-browsing/references/insane-search/metadata.md +116 -0
  155. package/dist/skills/ultimate-browsing/references/insane-search/naver.md +107 -0
  156. package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +142 -0
  157. package/dist/skills/ultimate-browsing/references/insane-search/public-api.md +119 -0
  158. package/dist/skills/ultimate-browsing/references/insane-search/rss.md +123 -0
  159. package/dist/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +186 -0
  160. package/dist/skills/ultimate-browsing/references/insane-search/twitter.md +104 -0
  161. package/dist/skills/ultimate-browsing/scripts/cookie_crypto.py +75 -0
  162. package/dist/skills/ultimate-browsing/scripts/cookie_domains.py +38 -0
  163. package/dist/skills/ultimate-browsing/scripts/cookie_paths.py +112 -0
  164. package/dist/skills/ultimate-browsing/scripts/extract_cookies.py +280 -0
  165. package/dist/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +110 -0
  166. package/dist/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +245 -0
  167. package/dist/skills/ultraresearch/ATTRIBUTION.md +49 -0
  168. package/dist/skills/ultraresearch/SKILL.md +23 -4
  169. package/dist/skills/ulw-plan/SKILL.md +4 -1
  170. package/dist/tools/delegate-task/sync-task-deps.d.ts +8 -6
  171. package/dist/tools/skill-mcp/tools.d.ts +1 -1
  172. package/dist/tui.js +9 -1
  173. package/package.json +16 -14
  174. package/packages/omo-codex/THIRD-PARTY-NOTICES.md +27 -4
  175. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  176. package/packages/omo-codex/plugin/README.md +1 -1
  177. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +134 -42
  178. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  179. package/packages/omo-codex/plugin/components/codegraph/LICENSE +21 -0
  180. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +2951 -0
  181. package/packages/omo-codex/plugin/components/codegraph/NOTICE +16 -0
  182. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +323 -39
  183. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +292 -19
  184. package/packages/omo-codex/plugin/components/codegraph/package.json +9 -3
  185. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +75 -0
  186. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +29 -13
  187. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +20 -7
  188. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +1 -243
  189. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +91 -0
  190. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +1 -1
  191. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +68 -0
  192. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +11 -1
  193. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +133 -0
  194. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +1 -113
  195. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +8 -1
  196. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +63 -0
  197. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +106 -0
  198. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +150 -0
  199. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  200. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  201. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  202. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  203. package/packages/omo-codex/plugin/components/rules/dist/cli.js +3 -3
  204. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  205. package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +3 -3
  206. package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +33 -9
  207. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  208. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  209. package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +59 -32
  210. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-guide.mjs +17 -16
  211. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-state.mjs +70 -3
  212. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-worktree.mjs +113 -0
  213. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +63 -4
  214. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  215. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
  216. package/packages/omo-codex/plugin/components/ultrawork/directive.md +5 -4
  217. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  218. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +24 -3
  219. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  220. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +8 -7
  221. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +1 -1
  222. package/packages/omo-codex/plugin/package-lock.json +112 -13
  223. package/packages/omo-codex/plugin/package.json +2 -2
  224. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +133 -0
  225. package/packages/omo-codex/plugin/scripts/auto-update-release-notes.mjs +135 -0
  226. package/packages/omo-codex/plugin/scripts/auto-update.mjs +33 -133
  227. package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +41 -0
  228. package/packages/omo-codex/plugin/shared/src/config-loader.ts +20 -2
  229. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +16 -0
  230. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +32 -8
  231. package/packages/omo-codex/plugin/skills/frontend/references/design/airbnb.md +3 -0
  232. package/packages/omo-codex/plugin/skills/frontend/references/design/airtable.md +3 -0
  233. package/packages/omo-codex/plugin/skills/frontend/references/design/apple.md +3 -0
  234. package/packages/omo-codex/plugin/skills/frontend/references/design/binance.md +3 -0
  235. package/packages/omo-codex/plugin/skills/frontend/references/design/bmw.md +3 -0
  236. package/packages/omo-codex/plugin/skills/frontend/references/design/bugatti.md +3 -0
  237. package/packages/omo-codex/plugin/skills/frontend/references/design/cal.md +3 -0
  238. package/packages/omo-codex/plugin/skills/frontend/references/design/claude.md +3 -0
  239. package/packages/omo-codex/plugin/skills/frontend/references/design/clay.md +3 -0
  240. package/packages/omo-codex/plugin/skills/frontend/references/design/clickhouse.md +3 -0
  241. package/packages/omo-codex/plugin/skills/frontend/references/design/cohere.md +3 -0
  242. package/packages/omo-codex/plugin/skills/frontend/references/design/coinbase.md +3 -0
  243. package/packages/omo-codex/plugin/skills/frontend/references/design/composio.md +3 -0
  244. package/packages/omo-codex/plugin/skills/frontend/references/design/cursor.md +3 -0
  245. package/packages/omo-codex/plugin/skills/frontend/references/design/elevenlabs.md +3 -0
  246. package/packages/omo-codex/plugin/skills/frontend/references/design/expo.md +3 -0
  247. package/packages/omo-codex/plugin/skills/frontend/references/design/ferrari.md +3 -0
  248. package/packages/omo-codex/plugin/skills/frontend/references/design/figma.md +3 -0
  249. package/packages/omo-codex/plugin/skills/frontend/references/design/framer.md +3 -0
  250. package/packages/omo-codex/plugin/skills/frontend/references/design/hashicorp.md +3 -0
  251. package/packages/omo-codex/plugin/skills/frontend/references/design/ibm.md +3 -0
  252. package/packages/omo-codex/plugin/skills/frontend/references/design/imagegen-frontend-web.md +380 -79
  253. package/packages/omo-codex/plugin/skills/frontend/references/design/intercom.md +3 -0
  254. package/packages/omo-codex/plugin/skills/frontend/references/design/kraken.md +3 -0
  255. package/packages/omo-codex/plugin/skills/frontend/references/design/lamborghini.md +3 -0
  256. package/packages/omo-codex/plugin/skills/frontend/references/design/linear.app.md +3 -0
  257. package/packages/omo-codex/plugin/skills/frontend/references/design/lovable.md +3 -0
  258. package/packages/omo-codex/plugin/skills/frontend/references/design/mastercard.md +3 -0
  259. package/packages/omo-codex/plugin/skills/frontend/references/design/meta.md +3 -0
  260. package/packages/omo-codex/plugin/skills/frontend/references/design/minimax.md +3 -0
  261. package/packages/omo-codex/plugin/skills/frontend/references/design/mintlify.md +3 -0
  262. package/packages/omo-codex/plugin/skills/frontend/references/design/miro.md +3 -0
  263. package/packages/omo-codex/plugin/skills/frontend/references/design/mistral.ai.md +3 -0
  264. package/packages/omo-codex/plugin/skills/frontend/references/design/mongodb.md +3 -0
  265. package/packages/omo-codex/plugin/skills/frontend/references/design/nike.md +3 -0
  266. package/packages/omo-codex/plugin/skills/frontend/references/design/notion.md +3 -0
  267. package/packages/omo-codex/plugin/skills/frontend/references/design/nvidia.md +3 -0
  268. package/packages/omo-codex/plugin/skills/frontend/references/design/ollama.md +3 -0
  269. package/packages/omo-codex/plugin/skills/frontend/references/design/opencode.ai.md +3 -0
  270. package/packages/omo-codex/plugin/skills/frontend/references/design/pinterest.md +3 -0
  271. package/packages/omo-codex/plugin/skills/frontend/references/design/playstation.md +3 -0
  272. package/packages/omo-codex/plugin/skills/frontend/references/design/posthog.md +3 -0
  273. package/packages/omo-codex/plugin/skills/frontend/references/design/raycast.md +3 -0
  274. package/packages/omo-codex/plugin/skills/frontend/references/design/renault.md +3 -0
  275. package/packages/omo-codex/plugin/skills/frontend/references/design/replicate.md +3 -0
  276. package/packages/omo-codex/plugin/skills/frontend/references/design/resend.md +3 -0
  277. package/packages/omo-codex/plugin/skills/frontend/references/design/revolut.md +3 -0
  278. package/packages/omo-codex/plugin/skills/frontend/references/design/runwayml.md +3 -0
  279. package/packages/omo-codex/plugin/skills/frontend/references/design/sanity.md +3 -0
  280. package/packages/omo-codex/plugin/skills/frontend/references/design/sentry.md +3 -0
  281. package/packages/omo-codex/plugin/skills/frontend/references/design/shopify.md +3 -0
  282. package/packages/omo-codex/plugin/skills/frontend/references/design/spacex.md +3 -0
  283. package/packages/omo-codex/plugin/skills/frontend/references/design/spotify.md +3 -0
  284. package/packages/omo-codex/plugin/skills/frontend/references/design/starbucks.md +3 -0
  285. package/packages/omo-codex/plugin/skills/frontend/references/design/stitch-skill.md +1 -1
  286. package/packages/omo-codex/plugin/skills/frontend/references/design/stripe.md +3 -0
  287. package/packages/omo-codex/plugin/skills/frontend/references/design/supabase.md +3 -0
  288. package/packages/omo-codex/plugin/skills/frontend/references/design/superhuman.md +3 -0
  289. package/packages/omo-codex/plugin/skills/frontend/references/design/taste-skill.md +1188 -208
  290. package/packages/omo-codex/plugin/skills/frontend/references/design/tesla.md +3 -0
  291. package/packages/omo-codex/plugin/skills/frontend/references/design/theverge.md +3 -0
  292. package/packages/omo-codex/plugin/skills/frontend/references/design/together.ai.md +3 -0
  293. package/packages/omo-codex/plugin/skills/frontend/references/design/uber.md +3 -0
  294. package/packages/omo-codex/plugin/skills/frontend/references/design/vercel.md +3 -0
  295. package/packages/omo-codex/plugin/skills/frontend/references/design/vodafone.md +3 -0
  296. package/packages/omo-codex/plugin/skills/frontend/references/design/voltagent.md +3 -0
  297. package/packages/omo-codex/plugin/skills/frontend/references/design/warp.md +3 -0
  298. package/packages/omo-codex/plugin/skills/frontend/references/design/webflow.md +3 -0
  299. package/packages/omo-codex/plugin/skills/frontend/references/design/wired.md +3 -0
  300. package/packages/omo-codex/plugin/skills/frontend/references/design/wise.md +3 -0
  301. package/packages/omo-codex/plugin/skills/frontend/references/design/x.ai.md +3 -0
  302. package/packages/omo-codex/plugin/skills/frontend/references/design/zapier.md +3 -0
  303. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/README.md +501 -115
  304. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/charts.csv +26 -26
  305. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/colors.csv +162 -97
  306. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/icons.csv +105 -100
  307. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/landing.csv +22 -18
  308. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/products.csv +162 -97
  309. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/flutter.csv +53 -53
  310. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -56
  311. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/nextjs.csv +53 -53
  312. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/react.csv +54 -54
  313. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/svelte.csv +54 -54
  314. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/swiftui.csv +51 -51
  315. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/vue.csv +50 -50
  316. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/styles.csv +17 -0
  317. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/typography.csv +17 -1
  318. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/ui-reasoning.csv +162 -101
  319. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/web-interface.csv +30 -30
  320. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/core.py +31 -22
  321. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/design_system.py +150 -69
  322. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/search.py +3 -3
  323. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
  324. package/packages/omo-codex/plugin/skills/teammode/SKILL.md +59 -32
  325. package/packages/omo-codex/plugin/skills/teammode/scripts/team-guide.mjs +17 -16
  326. package/packages/omo-codex/plugin/skills/teammode/scripts/team-state.mjs +70 -3
  327. package/packages/omo-codex/plugin/skills/teammode/scripts/team-worktree.mjs +113 -0
  328. package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +63 -4
  329. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +105 -0
  330. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +140 -0
  331. package/packages/omo-codex/plugin/skills/ultimate-browsing/agents/openai.yaml +2 -0
  332. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__init__.py +24 -0
  333. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__main__.py +106 -0
  334. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/bias_check.py +174 -0
  335. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/curl_probe.py +91 -0
  336. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/executor.py +192 -0
  337. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/fetch_chain.py +268 -0
  338. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/referers.py +15 -0
  339. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/result_schema.py +45 -0
  340. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/summary.py +37 -0
  341. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +11 -0
  342. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +129 -0
  343. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +167 -0
  344. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +77 -0
  345. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +282 -0
  346. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/url_transforms.py +98 -0
  347. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/validators.py +216 -0
  348. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_detector.py +214 -0
  349. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_profiles.yaml +162 -0
  350. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/README.md +79 -0
  351. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/career.md +29 -0
  352. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/dev.md +62 -0
  353. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/search.md +33 -0
  354. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/social.md +207 -0
  355. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/video.md +115 -0
  356. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/web.md +76 -0
  357. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +120 -0
  358. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +319 -0
  359. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/cache-archive.md +83 -0
  360. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/fallback.md +159 -0
  361. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/jina.md +130 -0
  362. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/json-api.md +133 -0
  363. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/media.md +123 -0
  364. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/metadata.md +116 -0
  365. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/naver.md +107 -0
  366. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +142 -0
  367. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/public-api.md +119 -0
  368. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/rss.md +123 -0
  369. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +186 -0
  370. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/twitter.md +104 -0
  371. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/cookie_crypto.py +75 -0
  372. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/cookie_domains.py +38 -0
  373. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/cookie_paths.py +112 -0
  374. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +280 -0
  375. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +110 -0
  376. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +245 -0
  377. package/packages/omo-codex/plugin/skills/ultraresearch/ATTRIBUTION.md +49 -0
  378. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +23 -4
  379. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +8 -7
  380. package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +2 -1
  381. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +95 -0
  382. package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +12 -3
  383. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +76 -0
  384. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -0
  385. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +87 -0
  386. package/packages/omo-codex/plugin/test/teammode-thread-title.test.mjs +169 -0
  387. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +246 -0
  388. package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +30 -0
  389. package/packages/omo-codex/scripts/install-cli-args.test.mjs +1 -1
  390. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +23 -0
  391. package/packages/omo-codex/scripts/install-delegated-command.test.mjs +76 -4
  392. package/packages/omo-codex/scripts/install-dist/install-local.mjs +520 -216
  393. package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +40 -3
  394. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +32 -8
  395. package/packages/shared-skills/skills/frontend/references/design/airbnb.md +3 -0
  396. package/packages/shared-skills/skills/frontend/references/design/airtable.md +3 -0
  397. package/packages/shared-skills/skills/frontend/references/design/apple.md +3 -0
  398. package/packages/shared-skills/skills/frontend/references/design/binance.md +3 -0
  399. package/packages/shared-skills/skills/frontend/references/design/bmw.md +3 -0
  400. package/packages/shared-skills/skills/frontend/references/design/bugatti.md +3 -0
  401. package/packages/shared-skills/skills/frontend/references/design/cal.md +3 -0
  402. package/packages/shared-skills/skills/frontend/references/design/claude.md +3 -0
  403. package/packages/shared-skills/skills/frontend/references/design/clay.md +3 -0
  404. package/packages/shared-skills/skills/frontend/references/design/clickhouse.md +3 -0
  405. package/packages/shared-skills/skills/frontend/references/design/cohere.md +3 -0
  406. package/packages/shared-skills/skills/frontend/references/design/coinbase.md +3 -0
  407. package/packages/shared-skills/skills/frontend/references/design/composio.md +3 -0
  408. package/packages/shared-skills/skills/frontend/references/design/cursor.md +3 -0
  409. package/packages/shared-skills/skills/frontend/references/design/elevenlabs.md +3 -0
  410. package/packages/shared-skills/skills/frontend/references/design/expo.md +3 -0
  411. package/packages/shared-skills/skills/frontend/references/design/ferrari.md +3 -0
  412. package/packages/shared-skills/skills/frontend/references/design/figma.md +3 -0
  413. package/packages/shared-skills/skills/frontend/references/design/framer.md +3 -0
  414. package/packages/shared-skills/skills/frontend/references/design/hashicorp.md +3 -0
  415. package/packages/shared-skills/skills/frontend/references/design/ibm.md +3 -0
  416. package/packages/shared-skills/skills/frontend/references/design/imagegen-frontend-web.md +380 -79
  417. package/packages/shared-skills/skills/frontend/references/design/intercom.md +3 -0
  418. package/packages/shared-skills/skills/frontend/references/design/kraken.md +3 -0
  419. package/packages/shared-skills/skills/frontend/references/design/lamborghini.md +3 -0
  420. package/packages/shared-skills/skills/frontend/references/design/linear.app.md +3 -0
  421. package/packages/shared-skills/skills/frontend/references/design/lovable.md +3 -0
  422. package/packages/shared-skills/skills/frontend/references/design/mastercard.md +3 -0
  423. package/packages/shared-skills/skills/frontend/references/design/meta.md +3 -0
  424. package/packages/shared-skills/skills/frontend/references/design/minimax.md +3 -0
  425. package/packages/shared-skills/skills/frontend/references/design/mintlify.md +3 -0
  426. package/packages/shared-skills/skills/frontend/references/design/miro.md +3 -0
  427. package/packages/shared-skills/skills/frontend/references/design/mistral.ai.md +3 -0
  428. package/packages/shared-skills/skills/frontend/references/design/mongodb.md +3 -0
  429. package/packages/shared-skills/skills/frontend/references/design/nike.md +3 -0
  430. package/packages/shared-skills/skills/frontend/references/design/notion.md +3 -0
  431. package/packages/shared-skills/skills/frontend/references/design/nvidia.md +3 -0
  432. package/packages/shared-skills/skills/frontend/references/design/ollama.md +3 -0
  433. package/packages/shared-skills/skills/frontend/references/design/opencode.ai.md +3 -0
  434. package/packages/shared-skills/skills/frontend/references/design/pinterest.md +3 -0
  435. package/packages/shared-skills/skills/frontend/references/design/playstation.md +3 -0
  436. package/packages/shared-skills/skills/frontend/references/design/posthog.md +3 -0
  437. package/packages/shared-skills/skills/frontend/references/design/raycast.md +3 -0
  438. package/packages/shared-skills/skills/frontend/references/design/renault.md +3 -0
  439. package/packages/shared-skills/skills/frontend/references/design/replicate.md +3 -0
  440. package/packages/shared-skills/skills/frontend/references/design/resend.md +3 -0
  441. package/packages/shared-skills/skills/frontend/references/design/revolut.md +3 -0
  442. package/packages/shared-skills/skills/frontend/references/design/runwayml.md +3 -0
  443. package/packages/shared-skills/skills/frontend/references/design/sanity.md +3 -0
  444. package/packages/shared-skills/skills/frontend/references/design/sentry.md +3 -0
  445. package/packages/shared-skills/skills/frontend/references/design/shopify.md +3 -0
  446. package/packages/shared-skills/skills/frontend/references/design/spacex.md +3 -0
  447. package/packages/shared-skills/skills/frontend/references/design/spotify.md +3 -0
  448. package/packages/shared-skills/skills/frontend/references/design/starbucks.md +3 -0
  449. package/packages/shared-skills/skills/frontend/references/design/stitch-skill.md +1 -1
  450. package/packages/shared-skills/skills/frontend/references/design/stripe.md +3 -0
  451. package/packages/shared-skills/skills/frontend/references/design/supabase.md +3 -0
  452. package/packages/shared-skills/skills/frontend/references/design/superhuman.md +3 -0
  453. package/packages/shared-skills/skills/frontend/references/design/taste-skill.md +1188 -208
  454. package/packages/shared-skills/skills/frontend/references/design/tesla.md +3 -0
  455. package/packages/shared-skills/skills/frontend/references/design/theverge.md +3 -0
  456. package/packages/shared-skills/skills/frontend/references/design/together.ai.md +3 -0
  457. package/packages/shared-skills/skills/frontend/references/design/uber.md +3 -0
  458. package/packages/shared-skills/skills/frontend/references/design/vercel.md +3 -0
  459. package/packages/shared-skills/skills/frontend/references/design/vodafone.md +3 -0
  460. package/packages/shared-skills/skills/frontend/references/design/voltagent.md +3 -0
  461. package/packages/shared-skills/skills/frontend/references/design/warp.md +3 -0
  462. package/packages/shared-skills/skills/frontend/references/design/webflow.md +3 -0
  463. package/packages/shared-skills/skills/frontend/references/design/wired.md +3 -0
  464. package/packages/shared-skills/skills/frontend/references/design/wise.md +3 -0
  465. package/packages/shared-skills/skills/frontend/references/design/x.ai.md +3 -0
  466. package/packages/shared-skills/skills/frontend/references/design/zapier.md +3 -0
  467. package/packages/shared-skills/skills/frontend/references/ui-ux-db/README.md +501 -115
  468. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/charts.csv +26 -26
  469. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/colors.csv +162 -97
  470. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/icons.csv +105 -100
  471. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/landing.csv +22 -18
  472. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/products.csv +162 -97
  473. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/flutter.csv +53 -53
  474. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -56
  475. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/nextjs.csv +53 -53
  476. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/react.csv +54 -54
  477. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/svelte.csv +54 -54
  478. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/swiftui.csv +51 -51
  479. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/vue.csv +50 -50
  480. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/styles.csv +17 -0
  481. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/typography.csv +17 -1
  482. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/ui-reasoning.csv +162 -101
  483. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/web-interface.csv +30 -30
  484. package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/core.py +31 -22
  485. package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/design_system.py +150 -69
  486. package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/search.py +3 -3
  487. package/packages/shared-skills/skills/lcx-doctor/SKILL.md +1 -1
  488. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +105 -0
  489. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +140 -0
  490. package/packages/shared-skills/skills/ultimate-browsing/engine/__init__.py +24 -0
  491. package/packages/shared-skills/skills/ultimate-browsing/engine/__main__.py +106 -0
  492. package/packages/shared-skills/skills/ultimate-browsing/engine/bias_check.py +174 -0
  493. package/packages/shared-skills/skills/ultimate-browsing/engine/curl_probe.py +91 -0
  494. package/packages/shared-skills/skills/ultimate-browsing/engine/executor.py +192 -0
  495. package/packages/shared-skills/skills/ultimate-browsing/engine/fetch_chain.py +268 -0
  496. package/packages/shared-skills/skills/ultimate-browsing/engine/referers.py +15 -0
  497. package/packages/shared-skills/skills/ultimate-browsing/engine/result_schema.py +45 -0
  498. package/packages/shared-skills/skills/ultimate-browsing/engine/summary.py +37 -0
  499. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +11 -0
  500. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +129 -0
  501. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +167 -0
  502. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +77 -0
  503. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +282 -0
  504. package/packages/shared-skills/skills/ultimate-browsing/engine/url_transforms.py +98 -0
  505. package/packages/shared-skills/skills/ultimate-browsing/engine/validators.py +216 -0
  506. package/packages/shared-skills/skills/ultimate-browsing/engine/waf_detector.py +214 -0
  507. package/packages/shared-skills/skills/ultimate-browsing/engine/waf_profiles.yaml +162 -0
  508. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/README.md +79 -0
  509. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/career.md +29 -0
  510. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/dev.md +62 -0
  511. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/search.md +33 -0
  512. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/social.md +207 -0
  513. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/video.md +115 -0
  514. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/web.md +76 -0
  515. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +120 -0
  516. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +319 -0
  517. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/cache-archive.md +83 -0
  518. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/fallback.md +159 -0
  519. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/jina.md +130 -0
  520. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/json-api.md +133 -0
  521. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/media.md +123 -0
  522. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/metadata.md +116 -0
  523. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/naver.md +107 -0
  524. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +142 -0
  525. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/public-api.md +119 -0
  526. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/rss.md +123 -0
  527. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +186 -0
  528. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/twitter.md +104 -0
  529. package/packages/shared-skills/skills/ultimate-browsing/scripts/cookie_crypto.py +75 -0
  530. package/packages/shared-skills/skills/ultimate-browsing/scripts/cookie_domains.py +38 -0
  531. package/packages/shared-skills/skills/ultimate-browsing/scripts/cookie_paths.py +112 -0
  532. package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +280 -0
  533. package/packages/shared-skills/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +110 -0
  534. package/packages/shared-skills/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +245 -0
  535. package/packages/shared-skills/skills/ultraresearch/ATTRIBUTION.md +49 -0
  536. package/packages/shared-skills/skills/ultraresearch/SKILL.md +23 -4
  537. package/packages/shared-skills/skills/ulw-plan/SKILL.md +4 -1
  538. package/packages/omo-codex/plugin/components/codegraph/dist/cli.d.ts +0 -2
  539. 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
+ ```
@@ -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
+ 실제 라우팅은 프로파일 태그가 결정한다. 위 예시는 참고일 뿐 코드 분기 근거로 쓰지 않는다.
@@ -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
+ ```
@@ -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) 로 넘긴다.