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.
Files changed (560) 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 +916 -670
  6. package/dist/cli-node/index.js +916 -670
  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 +1042 -640
  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 +34 -6
  169. package/dist/skills/ulw-plan/SKILL.md +4 -1
  170. package/dist/tools/background-task/constants.d.ts +1 -1
  171. package/dist/tools/delegate-task/sync-task-deps.d.ts +8 -6
  172. package/dist/tools/skill-mcp/tools.d.ts +1 -1
  173. package/dist/tui.js +18 -4
  174. package/package.json +16 -14
  175. package/packages/omo-codex/THIRD-PARTY-NOTICES.md +27 -4
  176. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +3 -1
  177. package/packages/omo-codex/plugin/README.md +1 -1
  178. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +134 -42
  179. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  180. package/packages/omo-codex/plugin/components/codegraph/LICENSE +21 -0
  181. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +2951 -0
  182. package/packages/omo-codex/plugin/components/codegraph/NOTICE +16 -0
  183. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +633 -193
  184. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +561 -44
  185. package/packages/omo-codex/plugin/components/codegraph/package.json +9 -3
  186. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +11 -0
  187. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +12 -0
  188. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +34 -0
  189. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +75 -0
  190. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +66 -13
  191. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +26 -12
  192. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +50 -330
  193. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +91 -0
  194. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +2 -2
  195. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +68 -0
  196. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +11 -1
  197. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +48 -0
  198. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +133 -0
  199. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +1 -112
  200. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +149 -0
  201. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +63 -0
  202. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +106 -0
  203. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +150 -0
  204. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  205. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  206. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  207. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  208. package/packages/omo-codex/plugin/components/rules/dist/cli.js +3 -3
  209. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  210. package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +3 -3
  211. package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +33 -9
  212. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  213. package/packages/omo-codex/plugin/components/teammode/dist/cli.js +94 -0
  214. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +17 -0
  215. package/packages/omo-codex/plugin/components/teammode/package.json +26 -0
  216. package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +59 -32
  217. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-guide.mjs +17 -16
  218. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-state.mjs +70 -3
  219. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-worktree.mjs +113 -0
  220. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +63 -4
  221. package/packages/omo-codex/plugin/components/teammode/src/cli.ts +12 -0
  222. package/packages/omo-codex/plugin/components/teammode/src/codex-hook.ts +125 -0
  223. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +116 -0
  224. package/packages/omo-codex/plugin/components/teammode/tsconfig.json +25 -0
  225. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  226. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
  227. package/packages/omo-codex/plugin/components/ultrawork/directive.md +5 -4
  228. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  229. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +24 -3
  230. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  231. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +8 -7
  232. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +1 -1
  233. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +17 -0
  234. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +17 -0
  235. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  236. package/packages/omo-codex/plugin/package-lock.json +129 -12
  237. package/packages/omo-codex/plugin/package.json +3 -2
  238. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +133 -0
  239. package/packages/omo-codex/plugin/scripts/auto-update-release-notes.mjs +135 -0
  240. package/packages/omo-codex/plugin/scripts/auto-update.mjs +33 -133
  241. package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +1 -0
  242. package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +41 -0
  243. package/packages/omo-codex/plugin/shared/src/config-loader.ts +20 -2
  244. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +16 -0
  245. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +32 -8
  246. package/packages/omo-codex/plugin/skills/frontend/references/design/airbnb.md +3 -0
  247. package/packages/omo-codex/plugin/skills/frontend/references/design/airtable.md +3 -0
  248. package/packages/omo-codex/plugin/skills/frontend/references/design/apple.md +3 -0
  249. package/packages/omo-codex/plugin/skills/frontend/references/design/binance.md +3 -0
  250. package/packages/omo-codex/plugin/skills/frontend/references/design/bmw.md +3 -0
  251. package/packages/omo-codex/plugin/skills/frontend/references/design/bugatti.md +3 -0
  252. package/packages/omo-codex/plugin/skills/frontend/references/design/cal.md +3 -0
  253. package/packages/omo-codex/plugin/skills/frontend/references/design/claude.md +3 -0
  254. package/packages/omo-codex/plugin/skills/frontend/references/design/clay.md +3 -0
  255. package/packages/omo-codex/plugin/skills/frontend/references/design/clickhouse.md +3 -0
  256. package/packages/omo-codex/plugin/skills/frontend/references/design/cohere.md +3 -0
  257. package/packages/omo-codex/plugin/skills/frontend/references/design/coinbase.md +3 -0
  258. package/packages/omo-codex/plugin/skills/frontend/references/design/composio.md +3 -0
  259. package/packages/omo-codex/plugin/skills/frontend/references/design/cursor.md +3 -0
  260. package/packages/omo-codex/plugin/skills/frontend/references/design/elevenlabs.md +3 -0
  261. package/packages/omo-codex/plugin/skills/frontend/references/design/expo.md +3 -0
  262. package/packages/omo-codex/plugin/skills/frontend/references/design/ferrari.md +3 -0
  263. package/packages/omo-codex/plugin/skills/frontend/references/design/figma.md +3 -0
  264. package/packages/omo-codex/plugin/skills/frontend/references/design/framer.md +3 -0
  265. package/packages/omo-codex/plugin/skills/frontend/references/design/hashicorp.md +3 -0
  266. package/packages/omo-codex/plugin/skills/frontend/references/design/ibm.md +3 -0
  267. package/packages/omo-codex/plugin/skills/frontend/references/design/imagegen-frontend-web.md +380 -79
  268. package/packages/omo-codex/plugin/skills/frontend/references/design/intercom.md +3 -0
  269. package/packages/omo-codex/plugin/skills/frontend/references/design/kraken.md +3 -0
  270. package/packages/omo-codex/plugin/skills/frontend/references/design/lamborghini.md +3 -0
  271. package/packages/omo-codex/plugin/skills/frontend/references/design/linear.app.md +3 -0
  272. package/packages/omo-codex/plugin/skills/frontend/references/design/lovable.md +3 -0
  273. package/packages/omo-codex/plugin/skills/frontend/references/design/mastercard.md +3 -0
  274. package/packages/omo-codex/plugin/skills/frontend/references/design/meta.md +3 -0
  275. package/packages/omo-codex/plugin/skills/frontend/references/design/minimax.md +3 -0
  276. package/packages/omo-codex/plugin/skills/frontend/references/design/mintlify.md +3 -0
  277. package/packages/omo-codex/plugin/skills/frontend/references/design/miro.md +3 -0
  278. package/packages/omo-codex/plugin/skills/frontend/references/design/mistral.ai.md +3 -0
  279. package/packages/omo-codex/plugin/skills/frontend/references/design/mongodb.md +3 -0
  280. package/packages/omo-codex/plugin/skills/frontend/references/design/nike.md +3 -0
  281. package/packages/omo-codex/plugin/skills/frontend/references/design/notion.md +3 -0
  282. package/packages/omo-codex/plugin/skills/frontend/references/design/nvidia.md +3 -0
  283. package/packages/omo-codex/plugin/skills/frontend/references/design/ollama.md +3 -0
  284. package/packages/omo-codex/plugin/skills/frontend/references/design/opencode.ai.md +3 -0
  285. package/packages/omo-codex/plugin/skills/frontend/references/design/pinterest.md +3 -0
  286. package/packages/omo-codex/plugin/skills/frontend/references/design/playstation.md +3 -0
  287. package/packages/omo-codex/plugin/skills/frontend/references/design/posthog.md +3 -0
  288. package/packages/omo-codex/plugin/skills/frontend/references/design/raycast.md +3 -0
  289. package/packages/omo-codex/plugin/skills/frontend/references/design/renault.md +3 -0
  290. package/packages/omo-codex/plugin/skills/frontend/references/design/replicate.md +3 -0
  291. package/packages/omo-codex/plugin/skills/frontend/references/design/resend.md +3 -0
  292. package/packages/omo-codex/plugin/skills/frontend/references/design/revolut.md +3 -0
  293. package/packages/omo-codex/plugin/skills/frontend/references/design/runwayml.md +3 -0
  294. package/packages/omo-codex/plugin/skills/frontend/references/design/sanity.md +3 -0
  295. package/packages/omo-codex/plugin/skills/frontend/references/design/sentry.md +3 -0
  296. package/packages/omo-codex/plugin/skills/frontend/references/design/shopify.md +3 -0
  297. package/packages/omo-codex/plugin/skills/frontend/references/design/spacex.md +3 -0
  298. package/packages/omo-codex/plugin/skills/frontend/references/design/spotify.md +3 -0
  299. package/packages/omo-codex/plugin/skills/frontend/references/design/starbucks.md +3 -0
  300. package/packages/omo-codex/plugin/skills/frontend/references/design/stitch-skill.md +1 -1
  301. package/packages/omo-codex/plugin/skills/frontend/references/design/stripe.md +3 -0
  302. package/packages/omo-codex/plugin/skills/frontend/references/design/supabase.md +3 -0
  303. package/packages/omo-codex/plugin/skills/frontend/references/design/superhuman.md +3 -0
  304. package/packages/omo-codex/plugin/skills/frontend/references/design/taste-skill.md +1188 -208
  305. package/packages/omo-codex/plugin/skills/frontend/references/design/tesla.md +3 -0
  306. package/packages/omo-codex/plugin/skills/frontend/references/design/theverge.md +3 -0
  307. package/packages/omo-codex/plugin/skills/frontend/references/design/together.ai.md +3 -0
  308. package/packages/omo-codex/plugin/skills/frontend/references/design/uber.md +3 -0
  309. package/packages/omo-codex/plugin/skills/frontend/references/design/vercel.md +3 -0
  310. package/packages/omo-codex/plugin/skills/frontend/references/design/vodafone.md +3 -0
  311. package/packages/omo-codex/plugin/skills/frontend/references/design/voltagent.md +3 -0
  312. package/packages/omo-codex/plugin/skills/frontend/references/design/warp.md +3 -0
  313. package/packages/omo-codex/plugin/skills/frontend/references/design/webflow.md +3 -0
  314. package/packages/omo-codex/plugin/skills/frontend/references/design/wired.md +3 -0
  315. package/packages/omo-codex/plugin/skills/frontend/references/design/wise.md +3 -0
  316. package/packages/omo-codex/plugin/skills/frontend/references/design/x.ai.md +3 -0
  317. package/packages/omo-codex/plugin/skills/frontend/references/design/zapier.md +3 -0
  318. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/README.md +501 -115
  319. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/charts.csv +26 -26
  320. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/colors.csv +162 -97
  321. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/icons.csv +105 -100
  322. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/landing.csv +22 -18
  323. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/products.csv +162 -97
  324. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/flutter.csv +53 -53
  325. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -56
  326. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/nextjs.csv +53 -53
  327. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/react.csv +54 -54
  328. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/svelte.csv +54 -54
  329. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/swiftui.csv +51 -51
  330. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/vue.csv +50 -50
  331. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/styles.csv +17 -0
  332. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/typography.csv +17 -1
  333. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/ui-reasoning.csv +162 -101
  334. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/web-interface.csv +30 -30
  335. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/core.py +31 -22
  336. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/design_system.py +150 -69
  337. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/search.py +3 -3
  338. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
  339. package/packages/omo-codex/plugin/skills/teammode/SKILL.md +59 -32
  340. package/packages/omo-codex/plugin/skills/teammode/scripts/team-guide.mjs +17 -16
  341. package/packages/omo-codex/plugin/skills/teammode/scripts/team-state.mjs +70 -3
  342. package/packages/omo-codex/plugin/skills/teammode/scripts/team-worktree.mjs +113 -0
  343. package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +63 -4
  344. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +105 -0
  345. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +140 -0
  346. package/packages/omo-codex/plugin/skills/ultimate-browsing/agents/openai.yaml +2 -0
  347. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__init__.py +24 -0
  348. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__main__.py +106 -0
  349. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/bias_check.py +174 -0
  350. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/curl_probe.py +91 -0
  351. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/executor.py +192 -0
  352. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/fetch_chain.py +268 -0
  353. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/referers.py +15 -0
  354. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/result_schema.py +45 -0
  355. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/summary.py +37 -0
  356. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +11 -0
  357. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +129 -0
  358. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +167 -0
  359. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +77 -0
  360. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +282 -0
  361. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/url_transforms.py +98 -0
  362. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/validators.py +216 -0
  363. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_detector.py +214 -0
  364. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_profiles.yaml +162 -0
  365. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/README.md +79 -0
  366. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/career.md +29 -0
  367. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/dev.md +62 -0
  368. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/search.md +33 -0
  369. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/social.md +207 -0
  370. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/video.md +115 -0
  371. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/web.md +76 -0
  372. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +120 -0
  373. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +319 -0
  374. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/cache-archive.md +83 -0
  375. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/fallback.md +159 -0
  376. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/jina.md +130 -0
  377. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/json-api.md +133 -0
  378. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/media.md +123 -0
  379. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/metadata.md +116 -0
  380. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/naver.md +107 -0
  381. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +142 -0
  382. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/public-api.md +119 -0
  383. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/rss.md +123 -0
  384. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +186 -0
  385. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/twitter.md +104 -0
  386. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/cookie_crypto.py +75 -0
  387. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/cookie_domains.py +38 -0
  388. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/cookie_paths.py +112 -0
  389. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +280 -0
  390. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +110 -0
  391. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +245 -0
  392. package/packages/omo-codex/plugin/skills/ultraresearch/ATTRIBUTION.md +49 -0
  393. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +34 -6
  394. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +8 -7
  395. package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +2 -1
  396. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +36 -0
  397. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -1
  398. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +1 -1
  399. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +95 -0
  400. package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +12 -3
  401. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -0
  402. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +76 -0
  403. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +24 -0
  404. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +1 -0
  405. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -0
  406. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +87 -0
  407. package/packages/omo-codex/plugin/test/teammode-thread-title.test.mjs +169 -0
  408. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +246 -0
  409. package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +78 -0
  410. package/packages/omo-codex/scripts/install-cli-args.test.mjs +1 -1
  411. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +23 -0
  412. package/packages/omo-codex/scripts/install-delegated-command.test.mjs +76 -4
  413. package/packages/omo-codex/scripts/install-dist/install-local.mjs +531 -214
  414. package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +40 -3
  415. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +32 -8
  416. package/packages/shared-skills/skills/frontend/references/design/airbnb.md +3 -0
  417. package/packages/shared-skills/skills/frontend/references/design/airtable.md +3 -0
  418. package/packages/shared-skills/skills/frontend/references/design/apple.md +3 -0
  419. package/packages/shared-skills/skills/frontend/references/design/binance.md +3 -0
  420. package/packages/shared-skills/skills/frontend/references/design/bmw.md +3 -0
  421. package/packages/shared-skills/skills/frontend/references/design/bugatti.md +3 -0
  422. package/packages/shared-skills/skills/frontend/references/design/cal.md +3 -0
  423. package/packages/shared-skills/skills/frontend/references/design/claude.md +3 -0
  424. package/packages/shared-skills/skills/frontend/references/design/clay.md +3 -0
  425. package/packages/shared-skills/skills/frontend/references/design/clickhouse.md +3 -0
  426. package/packages/shared-skills/skills/frontend/references/design/cohere.md +3 -0
  427. package/packages/shared-skills/skills/frontend/references/design/coinbase.md +3 -0
  428. package/packages/shared-skills/skills/frontend/references/design/composio.md +3 -0
  429. package/packages/shared-skills/skills/frontend/references/design/cursor.md +3 -0
  430. package/packages/shared-skills/skills/frontend/references/design/elevenlabs.md +3 -0
  431. package/packages/shared-skills/skills/frontend/references/design/expo.md +3 -0
  432. package/packages/shared-skills/skills/frontend/references/design/ferrari.md +3 -0
  433. package/packages/shared-skills/skills/frontend/references/design/figma.md +3 -0
  434. package/packages/shared-skills/skills/frontend/references/design/framer.md +3 -0
  435. package/packages/shared-skills/skills/frontend/references/design/hashicorp.md +3 -0
  436. package/packages/shared-skills/skills/frontend/references/design/ibm.md +3 -0
  437. package/packages/shared-skills/skills/frontend/references/design/imagegen-frontend-web.md +380 -79
  438. package/packages/shared-skills/skills/frontend/references/design/intercom.md +3 -0
  439. package/packages/shared-skills/skills/frontend/references/design/kraken.md +3 -0
  440. package/packages/shared-skills/skills/frontend/references/design/lamborghini.md +3 -0
  441. package/packages/shared-skills/skills/frontend/references/design/linear.app.md +3 -0
  442. package/packages/shared-skills/skills/frontend/references/design/lovable.md +3 -0
  443. package/packages/shared-skills/skills/frontend/references/design/mastercard.md +3 -0
  444. package/packages/shared-skills/skills/frontend/references/design/meta.md +3 -0
  445. package/packages/shared-skills/skills/frontend/references/design/minimax.md +3 -0
  446. package/packages/shared-skills/skills/frontend/references/design/mintlify.md +3 -0
  447. package/packages/shared-skills/skills/frontend/references/design/miro.md +3 -0
  448. package/packages/shared-skills/skills/frontend/references/design/mistral.ai.md +3 -0
  449. package/packages/shared-skills/skills/frontend/references/design/mongodb.md +3 -0
  450. package/packages/shared-skills/skills/frontend/references/design/nike.md +3 -0
  451. package/packages/shared-skills/skills/frontend/references/design/notion.md +3 -0
  452. package/packages/shared-skills/skills/frontend/references/design/nvidia.md +3 -0
  453. package/packages/shared-skills/skills/frontend/references/design/ollama.md +3 -0
  454. package/packages/shared-skills/skills/frontend/references/design/opencode.ai.md +3 -0
  455. package/packages/shared-skills/skills/frontend/references/design/pinterest.md +3 -0
  456. package/packages/shared-skills/skills/frontend/references/design/playstation.md +3 -0
  457. package/packages/shared-skills/skills/frontend/references/design/posthog.md +3 -0
  458. package/packages/shared-skills/skills/frontend/references/design/raycast.md +3 -0
  459. package/packages/shared-skills/skills/frontend/references/design/renault.md +3 -0
  460. package/packages/shared-skills/skills/frontend/references/design/replicate.md +3 -0
  461. package/packages/shared-skills/skills/frontend/references/design/resend.md +3 -0
  462. package/packages/shared-skills/skills/frontend/references/design/revolut.md +3 -0
  463. package/packages/shared-skills/skills/frontend/references/design/runwayml.md +3 -0
  464. package/packages/shared-skills/skills/frontend/references/design/sanity.md +3 -0
  465. package/packages/shared-skills/skills/frontend/references/design/sentry.md +3 -0
  466. package/packages/shared-skills/skills/frontend/references/design/shopify.md +3 -0
  467. package/packages/shared-skills/skills/frontend/references/design/spacex.md +3 -0
  468. package/packages/shared-skills/skills/frontend/references/design/spotify.md +3 -0
  469. package/packages/shared-skills/skills/frontend/references/design/starbucks.md +3 -0
  470. package/packages/shared-skills/skills/frontend/references/design/stitch-skill.md +1 -1
  471. package/packages/shared-skills/skills/frontend/references/design/stripe.md +3 -0
  472. package/packages/shared-skills/skills/frontend/references/design/supabase.md +3 -0
  473. package/packages/shared-skills/skills/frontend/references/design/superhuman.md +3 -0
  474. package/packages/shared-skills/skills/frontend/references/design/taste-skill.md +1188 -208
  475. package/packages/shared-skills/skills/frontend/references/design/tesla.md +3 -0
  476. package/packages/shared-skills/skills/frontend/references/design/theverge.md +3 -0
  477. package/packages/shared-skills/skills/frontend/references/design/together.ai.md +3 -0
  478. package/packages/shared-skills/skills/frontend/references/design/uber.md +3 -0
  479. package/packages/shared-skills/skills/frontend/references/design/vercel.md +3 -0
  480. package/packages/shared-skills/skills/frontend/references/design/vodafone.md +3 -0
  481. package/packages/shared-skills/skills/frontend/references/design/voltagent.md +3 -0
  482. package/packages/shared-skills/skills/frontend/references/design/warp.md +3 -0
  483. package/packages/shared-skills/skills/frontend/references/design/webflow.md +3 -0
  484. package/packages/shared-skills/skills/frontend/references/design/wired.md +3 -0
  485. package/packages/shared-skills/skills/frontend/references/design/wise.md +3 -0
  486. package/packages/shared-skills/skills/frontend/references/design/x.ai.md +3 -0
  487. package/packages/shared-skills/skills/frontend/references/design/zapier.md +3 -0
  488. package/packages/shared-skills/skills/frontend/references/ui-ux-db/README.md +501 -115
  489. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/charts.csv +26 -26
  490. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/colors.csv +162 -97
  491. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/icons.csv +105 -100
  492. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/landing.csv +22 -18
  493. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/products.csv +162 -97
  494. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/flutter.csv +53 -53
  495. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -56
  496. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/nextjs.csv +53 -53
  497. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/react.csv +54 -54
  498. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/svelte.csv +54 -54
  499. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/swiftui.csv +51 -51
  500. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/vue.csv +50 -50
  501. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/styles.csv +17 -0
  502. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/typography.csv +17 -1
  503. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/ui-reasoning.csv +162 -101
  504. package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/web-interface.csv +30 -30
  505. package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/core.py +31 -22
  506. package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/design_system.py +150 -69
  507. package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/search.py +3 -3
  508. package/packages/shared-skills/skills/lcx-doctor/SKILL.md +1 -1
  509. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +105 -0
  510. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +140 -0
  511. package/packages/shared-skills/skills/ultimate-browsing/engine/__init__.py +24 -0
  512. package/packages/shared-skills/skills/ultimate-browsing/engine/__main__.py +106 -0
  513. package/packages/shared-skills/skills/ultimate-browsing/engine/bias_check.py +174 -0
  514. package/packages/shared-skills/skills/ultimate-browsing/engine/curl_probe.py +91 -0
  515. package/packages/shared-skills/skills/ultimate-browsing/engine/executor.py +192 -0
  516. package/packages/shared-skills/skills/ultimate-browsing/engine/fetch_chain.py +268 -0
  517. package/packages/shared-skills/skills/ultimate-browsing/engine/referers.py +15 -0
  518. package/packages/shared-skills/skills/ultimate-browsing/engine/result_schema.py +45 -0
  519. package/packages/shared-skills/skills/ultimate-browsing/engine/summary.py +37 -0
  520. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +11 -0
  521. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +129 -0
  522. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +167 -0
  523. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +77 -0
  524. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +282 -0
  525. package/packages/shared-skills/skills/ultimate-browsing/engine/url_transforms.py +98 -0
  526. package/packages/shared-skills/skills/ultimate-browsing/engine/validators.py +216 -0
  527. package/packages/shared-skills/skills/ultimate-browsing/engine/waf_detector.py +214 -0
  528. package/packages/shared-skills/skills/ultimate-browsing/engine/waf_profiles.yaml +162 -0
  529. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/README.md +79 -0
  530. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/career.md +29 -0
  531. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/dev.md +62 -0
  532. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/search.md +33 -0
  533. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/social.md +207 -0
  534. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/video.md +115 -0
  535. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/web.md +76 -0
  536. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +120 -0
  537. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +319 -0
  538. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/cache-archive.md +83 -0
  539. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/fallback.md +159 -0
  540. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/jina.md +130 -0
  541. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/json-api.md +133 -0
  542. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/media.md +123 -0
  543. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/metadata.md +116 -0
  544. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/naver.md +107 -0
  545. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +142 -0
  546. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/public-api.md +119 -0
  547. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/rss.md +123 -0
  548. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +186 -0
  549. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/twitter.md +104 -0
  550. package/packages/shared-skills/skills/ultimate-browsing/scripts/cookie_crypto.py +75 -0
  551. package/packages/shared-skills/skills/ultimate-browsing/scripts/cookie_domains.py +38 -0
  552. package/packages/shared-skills/skills/ultimate-browsing/scripts/cookie_paths.py +112 -0
  553. package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +280 -0
  554. package/packages/shared-skills/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +110 -0
  555. package/packages/shared-skills/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +245 -0
  556. package/packages/shared-skills/skills/ultraresearch/ATTRIBUTION.md +49 -0
  557. package/packages/shared-skills/skills/ultraresearch/SKILL.md +34 -6
  558. package/packages/shared-skills/skills/ulw-plan/SKILL.md +4 -1
  559. package/packages/omo-codex/plugin/components/codegraph/dist/cli.d.ts +0 -2
  560. package/packages/omo-codex/plugin/components/codegraph/dist/serve.d.ts +0 -32
@@ -0,0 +1,105 @@
1
+ # ATTRIBUTION / NOTICE
2
+
3
+ This skill (`ultimate-browsing`, part of `@oh-my-opencode/shared-skills`) ships
4
+ project-original content plus two third-party tools that it installs at runtime
5
+ (it does NOT vendor their source). Each runtime tool's license and required
6
+ notices are reproduced below.
7
+
8
+ ---
9
+
10
+ ## 1. Project-original content (no third-party source vendored)
11
+
12
+ The following are authored by the oh-my-openagent project and carry no third-party
13
+ license obligation:
14
+
15
+ - `engine/**` — the insane-search Tier-1 fetch engine (curl_cffi grid, WAF
16
+ detection, Playwright fallback templates, `bias_check.py` no-site-name gate).
17
+ - `references/insane-search/**` and `references/agent-reach/**` — the Tier-1 and
18
+ Tier-1.5 reference docs.
19
+ - `scripts/extract_cookies.py`, `scripts/cookie_paths.py`, `scripts/cookie_crypto.py`
20
+ and their tests — the cross-platform cookie module.
21
+ - `SKILL.md`, `references/chrome-stealth.md`.
22
+
23
+ These reference platform-native CLIs and public APIs by name (e.g. `xhs`, `yt-dlp`,
24
+ `agent-reach`, `mcporter`, Jina Reader, V2EX public API). Those are external tools the
25
+ user installs separately; this skill includes none of their source.
26
+
27
+ ---
28
+
29
+ ## 2. CloakBrowser (CloakHQ) — Tier-2 stealth Chromium (runtime dependency)
30
+
31
+ The Tier-2 stealth browser is **CloakBrowser**, installed at runtime via `pip`
32
+ (`pip install cloakbrowser`). No CloakBrowser source is vendored in this repository.
33
+
34
+ - Source: https://github.com/CloakHQ/CloakBrowser
35
+ - Pinned runtime version: **0.4.0** (documented in `references/chrome-stealth.md`;
36
+ this is a documented version string, not an automated drift check).
37
+ - Wrapper source license: MIT License.
38
+ - Binary license: the compiled CloakBrowser Chromium binary downloaded by
39
+ `cloakbrowser.ensure_binary()` is governed by the separate CloakBrowser
40
+ Binary License:
41
+ https://github.com/CloakHQ/CloakBrowser/blob/main/BINARY-LICENSE.md
42
+ - Redistribution note: this npm package does not redistribute the CloakBrowser
43
+ binary, does not repackage it, and does not include it in `skills/` or
44
+ `dist/skills`. Users who run the Tier-2 setup download the binary directly
45
+ from CloakHQ's official distribution channels and must comply with that
46
+ binary license.
47
+
48
+ MIT wrapper source license:
49
+
50
+ ```
51
+ MIT License
52
+
53
+ Copyright (c) 2026 CloakHQ
54
+
55
+ Permission is hereby granted, free of charge, to any person obtaining a copy
56
+ of this software and associated documentation files (the "Software"), to deal
57
+ in the Software without restriction, including without limitation the rights
58
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
59
+ copies of the Software, and to permit persons to whom the Software is
60
+ furnished to do so, subject to the following conditions:
61
+
62
+ The above copyright notice and this permission notice shall be included in all
63
+ copies or substantial portions of the Software.
64
+
65
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
66
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
67
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
68
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
69
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
70
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
71
+ SOFTWARE.
72
+ ```
73
+
74
+ ---
75
+
76
+ ## 3. agent-browser (vercel-labs) — Tier-2 CDP automation CLI (runtime dependency)
77
+
78
+ The Tier-2 automation CLI is **agent-browser**, installed at runtime via `npm`
79
+ (`npm i -g agent-browser`). No agent-browser source is vendored in this repository.
80
+
81
+ - Source: https://github.com/vercel-labs/agent-browser
82
+ - Pinned runtime version: **0.29.1** (documented in `references/chrome-stealth.md`;
83
+ documented version string, no automated drift check).
84
+ - Licensed under the Apache License, Version 2.0 (the "License"); you may not use
85
+ these files except in compliance with the License. You may obtain a copy of the
86
+ License at:
87
+
88
+ http://www.apache.org/licenses/LICENSE-2.0
89
+
90
+ Unless required by applicable law or agreed to in writing, software distributed under
91
+ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
92
+ KIND, either express or implied. See the License for the specific language governing
93
+ permissions and limitations under the License.
94
+
95
+ - **Changes (Apache-2.0 §4(b)):** none. agent-browser is installed unmodified at
96
+ runtime; no agent-browser source file is copied, modified, or redistributed by this
97
+ skill. This skill only documents how to invoke the upstream CLI.
98
+
99
+ - **NOTICE:** the upstream agent-browser distribution may include a `NOTICE` file. As
100
+ this skill redistributes no agent-browser source, no upstream NOTICE content is
101
+ bundled here; consult the upstream repository for its `NOTICE` file when present.
102
+
103
+ - **Trademark notice:** "agent-browser" and "Vercel" are referenced by name for
104
+ identification only. No trademark license is granted under the Apache License 2.0
105
+ (Section 6).
@@ -0,0 +1,140 @@
1
+ ---
2
+ name: ultimate-browsing
3
+ description: "Escalation skill for blocked or hard-to-reach web access — load it when a normal browse/fetch is blocked (WAF, 403, Cloudflare, JS-only render, login-gated, or a platform a generic fetcher cannot read). Tiered router: TIER 1 insane-search (headless extraction + WAF bypass via curl_cffi TLS impersonation, yt-dlp, Jina Reader, public APIs, Playwright real-Chrome fallback); TIER 1.5 agent-reach (platform-native readers for Chinese and social platforms: Xiaohongshu, Douyin, Weibo, Bilibili, V2EX, WeChat, plus Twitter/Reddit/LinkedIn/GitHub); TIER 2 Chrome stealth (CloakBrowser stealth Chromium + agent-browser CDP for clicks, forms, screenshots, video, cookie login). Triggers: blocked site, bypass bot detection, cloudflare/WAF bypass, scrape, stealth browser, import cookies, fill form, screenshot, play youtube, xiaohongshu, douyin, weibo, bilibili, v2ex, wechat article, podcast transcript. NOT for simple searches (use web-search) or plain fetches (use webfetch)."
4
+ ---
5
+
6
+ # Ultimate Browsing
7
+
8
+ Escalation web access for tasks a normal browse or fetch cannot complete. Reach for this skill the moment a page is blocked (WAF / 403 / Cloudflare), needs JS rendering, hides behind a login, or lives on a platform a generic fetcher cannot read. Escalate only when the cheaper tier cannot do the job:
9
+
10
+ **Tier 1 — insane-search** (headless extraction + WAF bypass) -> **Tier 1.5 — agent-reach** (platform-native APIs, esp. Chinese platforms) -> **Tier 2 — Chrome stealth** (real interaction via CloakBrowser + agent-browser).
11
+
12
+ ## PHASE 0 — ROUTE FIRST (MANDATORY)
13
+
14
+ ```
15
+ User request
16
+ |
17
+ +- extract text/data from a URL --------------------- TIER 1 insane-search
18
+ +- URL blocked / 403 / Cloudflare / WAF ------------- TIER 1 insane-search
19
+ +- YouTube/Vimeo/TikTok subtitles or metadata ------- TIER 1 insane-search (yt-dlp)
20
+ +- read an article / blog / Reddit / HN / arXiv ----- TIER 1 insane-search
21
+ |
22
+ +- Chinese platform (xhs/douyin/weibo/bilibili/v2ex/wechat) TIER 1.5 agent-reach
23
+ +- podcast transcript / stock forum ----------------- TIER 1.5 agent-reach
24
+ +- Twitter feed / LinkedIn profile / GitHub via CLI - TIER 1.5 agent-reach
25
+ |
26
+ +- Tier 1/1.5 returned empty or partial ------------- TIER 2 Chrome stealth
27
+ +- click / fill form / scroll / interact ------------ TIER 2 Chrome stealth
28
+ +- screenshot / render / play video ----------------- TIER 2 Chrome stealth
29
+ +- login session across pages / inject cookies ------ TIER 2 Chrome stealth
30
+ +- test web app / QA / dogfood ---------------------- TIER 2 Chrome stealth
31
+ |
32
+ +- simple search query ------------------------------ NOT this skill (use web-search)
33
+ ```
34
+
35
+ Read the matching reference before acting: [`references/insane-search/README.md`](references/insane-search/README.md), [`references/agent-reach/README.md`](references/agent-reach/README.md), or [`references/chrome-stealth.md`](references/chrome-stealth.md).
36
+
37
+ ## Tier 1 — insane-search (headless extraction)
38
+
39
+ **When**: content extraction, blocked-URL bypass, media metadata — no browser UI needed.
40
+ **Why first**: ~10x faster than a browser, no process spin-up; handles most "fetch this blocked page" requests via curl_cffi TLS impersonation, yt-dlp (1858 sites), Jina Reader, official public APIs, mobile URL transforms, and a Playwright real-Chrome fallback. The engine lives **inside this skill** at `engine/` and is invoked as a module.
41
+
42
+ ```bash
43
+ # Core command — auto-detects WAF, runs the full fetch grid (run from the skill dir):
44
+ python3 -m engine "https://example.com/blocked-page"
45
+ # add --selector "<CSS>" for positive-proof validation, --device auto|desktop|mobile,
46
+ # --trace to inspect every attempt, --json for machine-readable output.
47
+
48
+ # YouTube subtitles / metadata (no browser):
49
+ yt-dlp --write-sub --write-auto-sub --sub-lang "en,ko" --skip-download -o "/tmp/%(id)s" "<URL>"
50
+
51
+ # Reddit / HN / Bluesky / arXiv etc. use official public endpoints — see the Phase 0 index in
52
+ # references/insane-search/README.md (Twitter syndication, Reddit .json, HN Firebase, ...).
53
+ ```
54
+
55
+ The full engine harness (rules R1-R7, the Phase 0 official-API index, the no-site-name rule, and the `references/insane-search/*.md` deep-dives for TLS, Playwright routing, Naver, media, etc.) is in [`references/insane-search/README.md`](references/insane-search/README.md). Read it before tuning the engine or adding a WAF profile.
56
+
57
+ ### Escalate to Tier 1.5 or Tier 2 when
58
+ - The target is a Chinese / social platform with a native reader -> Tier 1.5.
59
+ - insane-search returns empty/partial, or the page needs JS interaction, a screenshot, a persistent login, or media playback -> Tier 2.
60
+
61
+ ## Tier 1.5 — agent-reach (platform-native readers)
62
+
63
+ **When**: the target is a platform with a first-class API/CLI that beats generic fetching — especially Chinese platforms that stealth browsers still cannot reach cleanly. Several channels are zero-config (Douyin, Weibo via Jina, V2EX, Reddit, Jina Reader, RSS, YouTube); others need a one-time auth you supply via environment variables if you have access.
64
+
65
+ | Category | Platforms | Entry |
66
+ |---|---|---|
67
+ | social | xhs (Xiaohongshu), douyin, weibo, bilibili, V2EX, Reddit, Twitter/X | [references/agent-reach/social.md](references/agent-reach/social.md) |
68
+ | web | Jina Reader, WeChat articles, RSS | [references/agent-reach/web.md](references/agent-reach/web.md) |
69
+ | video | YouTube, Bilibili, podcast transcripts, Douyin video | [references/agent-reach/video.md](references/agent-reach/video.md) |
70
+ | career | LinkedIn | [references/agent-reach/career.md](references/agent-reach/career.md) |
71
+ | dev | GitHub (gh CLI) | [references/agent-reach/dev.md](references/agent-reach/dev.md) |
72
+ | search | Exa AI | [references/agent-reach/search.md](references/agent-reach/search.md) |
73
+
74
+ ```bash
75
+ mcporter call 'douyin.parse_douyin_video_info(url: "<URL>")' # douyin, zero-config
76
+ curl -s "https://r.jina.ai/https://weibo.com/<uid>/<pid>" # weibo via Jina
77
+ yt-dlp --dump-json "<bilibili-url>" # Bilibili (overseas: add --cookies-from-browser)
78
+ curl -s "https://www.v2ex.com/api/topics/hot.json" # V2EX public API
79
+ ```
80
+
81
+ Routing table, per-platform auth (set `TWITTER_*` env vars, `gh auth login`, a transcription key — only if you have access), rate-limit notes, and known version quirks are in [references/agent-reach/README.md](references/agent-reach/README.md).
82
+
83
+ ## Tier 2 — Chrome stealth (real interaction)
84
+
85
+ **When**: real interaction is needed (clicks, forms, screenshots, video, persistent login), or Tier 1/1.5 failed.
86
+
87
+ CloakBrowser is a stealth Chromium with source-level fingerprint patches that passes Cloudflare Turnstile, FingerprintJS, BrowserScan, and 30+ detectors; agent-browser is the CDP automation CLI that drives it. Both are runtime-installed tools (not vendored here). Full setup, version pins, launch flow, cookie login, and cross-platform notes are in [references/chrome-stealth.md](references/chrome-stealth.md).
88
+
89
+ ```bash
90
+ # 1. Launch CloakBrowser with CDP on :9242 (see chrome-stealth.md for install + venv).
91
+ # 2. CloakBrowser launches tabless — open the first tab via CDP before any agent-browser command:
92
+ curl -s -X PUT "http://127.0.0.1:9242/json/new?https://example.com"
93
+ # 3. Drive it with agent-browser over CDP:
94
+ agent-browser --cdp 9242 snapshot -i # interactive elements (@eN refs)
95
+ agent-browser --cdp 9242 click @e3
96
+ agent-browser --cdp 9242 screenshot out.png
97
+ agent-browser --cdp 9242 close
98
+ ```
99
+
100
+ ### Cookie login (cross-platform)
101
+
102
+ `scripts/extract_cookies.py` reads cookies from a local Chromium-family or Firefox-family browser and optionally injects them into the running CDP session. It resolves browser profile paths and decrypts cookie values per-OS (macOS Keychain, Linux libsecret, Windows DPAPI):
103
+
104
+ ```bash
105
+ # Extract cookies to a file:
106
+ mkdir -p ~/.local/state/omo-cookies
107
+ python3 scripts/extract_cookies.py --browser chrome --domain youtube.com --output ~/.local/state/omo-cookies/youtube.cookies.json
108
+ # Extract and inject into the running CDP session:
109
+ python3 scripts/extract_cookies.py --browser chrome --domain youtube.com --inject --cdp 9242
110
+ ```
111
+
112
+ Cookie export files are written with owner-only `0600` permissions. Do not place live auth cookies in shared temp directories or commit them to a repo. Cookie injection sends values to CDP over stdin rather than argv. Cookies apply on next navigation — reload after injecting. Google services use fingerprint-bound tokens that may not transfer across browser profiles. Full detail in [references/chrome-stealth.md](references/chrome-stealth.md).
113
+
114
+ ## Reference docs
115
+
116
+ | File | When to read |
117
+ |------|-------------|
118
+ | [references/insane-search/README.md](references/insane-search/README.md) | Tier-1 engine harness (R1-R7, Phase 0 API index, no-site-name rule) + its `*.md` deep-dives |
119
+ | [references/agent-reach/README.md](references/agent-reach/README.md) | Tier-1.5 routing table, platform auth, per-category `*.md` |
120
+ | [references/chrome-stealth.md](references/chrome-stealth.md) | Tier-2 CloakBrowser + agent-browser install, CDP flow, version pins, cookie login |
121
+
122
+ ## Environment variables
123
+
124
+ ```bash
125
+ CLOAK_CDP_PORT=9242 # CloakBrowser CDP port (default 9242)
126
+ AGENT_BROWSER_USER_AGENT="..." # override UA to hide HeadlessChrome
127
+ AGENT_BROWSER_HEADED=1 # show the browser window
128
+ # agent-reach auth: set the channel-specific env vars from each tool's docs only if you have access
129
+ # insane-search needs no env vars — it auto-installs deps on first run
130
+ ```
131
+
132
+ ## Anti-patterns
133
+
134
+ - Do NOT launch Chrome stealth for plain text extraction — use Tier 1.
135
+ - Do NOT pass an `--init-script` for the webdriver flag — CloakBrowser already patches it at source; the only required override is `--user-agent`.
136
+ - Do NOT run agent-browser before creating the first tab via `curl -X PUT .../json/new` — CloakBrowser launches tabless.
137
+ - Do NOT use vanilla Chrome when stealth is needed — always CloakBrowser.
138
+ - Do NOT forget to `close` the session when done.
139
+ - Do NOT inject cookies without reloading the page.
140
+ - Do NOT hardcode site domains/selectors into `engine/**` or `waf_profiles.yaml` — runtime hints only (see the no-site-name rule in the insane-search reference).
@@ -0,0 +1,24 @@
1
+ """insane-search engine — generic WAF-profile-based fetch chain.
2
+
3
+ No site-specific logic lives here. Site specifics belong to runtime hints or
4
+ observations, never to code. See `../SKILL.md` for the No-Site-Name Rule.
5
+ """
6
+
7
+ from .validators import Verdict, ValidationResult, validate, CHALLENGE_MARKERS
8
+ from .waf_detector import detect
9
+ from .url_transforms import TRANSFORMS, apply_transform
10
+ from .fetch_chain import fetch
11
+ from .result_schema import Attempt, FetchResult
12
+
13
+ __all__ = [
14
+ "Verdict",
15
+ "ValidationResult",
16
+ "validate",
17
+ "CHALLENGE_MARKERS",
18
+ "detect",
19
+ "TRANSFORMS",
20
+ "apply_transform",
21
+ "fetch",
22
+ "FetchResult",
23
+ "Attempt",
24
+ ]
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env python3
2
+ """CLI entrypoint for the insane-search engine.
3
+
4
+ Usage:
5
+ python3 -m engine URL [--selector CSS] [--device auto|desktop|mobile]
6
+ [--timeout N] [--max-attempts N] [--json] [--trace]
7
+
8
+ Examples:
9
+ python3 -m engine "https://example.com/" --selector "h1"
10
+ python3 -m engine "https://example.com/" --json
11
+ python3 -m engine "https://example.com/" --device mobile --trace
12
+
13
+ Exit codes:
14
+ 0 strong_ok or weak_ok
15
+ 1 ok=False (all attempts failed)
16
+ 2 CLI arg error
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import argparse
21
+ import json
22
+ import sys
23
+
24
+ from . import fetch
25
+
26
+
27
+ def build_parser() -> argparse.ArgumentParser:
28
+ p = argparse.ArgumentParser(prog="python3 -m engine",
29
+ description="Generic WAF-profile fetch chain.")
30
+ p.add_argument("url", help="URL to fetch.")
31
+ p.add_argument("--selector", "-s", action="append", default=None,
32
+ dest="selectors", metavar="CSS",
33
+ help="Positive-proof CSS selector. Repeatable.")
34
+ p.add_argument("--device", choices=("auto", "desktop", "mobile"), default="auto",
35
+ help="Device class pin.")
36
+ p.add_argument("--timeout", type=int, default=25,
37
+ help="Per-attempt timeout seconds (default 25).")
38
+ p.add_argument("--max-attempts", type=int, default=12,
39
+ help="Upper bound across all phases (default 12).")
40
+ p.add_argument("--no-playwright", action="store_true",
41
+ help="Skip Playwright fallback (curl-only).")
42
+ p.add_argument("--json", action="store_true",
43
+ help="Emit FetchResult as JSON to stdout (content omitted).")
44
+ p.add_argument("--trace", action="store_true",
45
+ help="Print per-attempt trace to stderr.")
46
+ return p
47
+
48
+
49
+ def main(argv: list[str] | None = None) -> int:
50
+ args = build_parser().parse_args(argv)
51
+ try:
52
+ result = fetch(
53
+ args.url,
54
+ success_selectors=args.selectors,
55
+ device_class=args.device,
56
+ timeout=args.timeout,
57
+ max_attempts=args.max_attempts,
58
+ enable_playwright=not args.no_playwright,
59
+ )
60
+ except Exception as e:
61
+ print(f"engine fatal: {type(e).__name__}: {e}", file=sys.stderr)
62
+ return 2
63
+
64
+ if args.trace:
65
+ print("=== trace ===", file=sys.stderr)
66
+ for att in result.trace:
67
+ d = att.to_dict()
68
+ imp = d.get("impersonate") or "-"
69
+ ref = d.get("referer") or "-"
70
+ print(
71
+ f"[{d['phase']:<8}] {d['executor']:<18} "
72
+ f"xform={d['url_transform']:<16} imp={imp:<14} ref={ref:<14} "
73
+ f"status={d['status']:>4} size={d['body_size']:>8} "
74
+ f"verdict={d['verdict']} {('err=' + d['error'][:60]) if d.get('error') else ''}",
75
+ file=sys.stderr,
76
+ )
77
+ print(f"=== summary: {result.summary} ===", file=sys.stderr)
78
+
79
+ # Surface R7 hint (API-first route) prominently when summary contains it,
80
+ # regardless of --trace flag — this is actionable guidance, not noise.
81
+ if "R7 API-first" in (result.summary or ""):
82
+ print(
83
+ "\n════════════════════════════════════════════════════════════════\n"
84
+ "⚠️ R7 triggered — consider API-first route instead of HTML grid.\n"
85
+ " See summary below (or re-run with --trace for full attempt log).\n"
86
+ "════════════════════════════════════════════════════════════════",
87
+ file=sys.stderr,
88
+ )
89
+ # Also print the full summary (which includes the hint) so caller sees it.
90
+ print(result.summary, file=sys.stderr)
91
+
92
+ if args.json:
93
+ payload = result.to_dict()
94
+ print(json.dumps(payload, ensure_ascii=False, indent=2))
95
+ else:
96
+ # Default: HTML to stdout, status to stderr.
97
+ print(result.content, end="")
98
+ print(f"\n[engine] ok={result.ok} verdict={result.verdict} "
99
+ f"profile={result.profile_used} attempts={len(result.trace)}",
100
+ file=sys.stderr)
101
+
102
+ return 0 if result.ok else 1
103
+
104
+
105
+ if __name__ == "__main__":
106
+ sys.exit(main())
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env python3
2
+ """No-Site-Name Rule checker.
3
+
4
+ Run in CI / pre-commit. Scans engine/** for hard-coded site names or
5
+ domains that would bias the generic fetch chain toward one site.
6
+
7
+ Exit code 0 if clean, 1 if violations found.
8
+
9
+ python3 engine/bias_check.py
10
+ python3 engine/bias_check.py --strict # also check references/*.md (usually off)
11
+ """
12
+ from __future__ import annotations
13
+
14
+ import argparse
15
+ import os
16
+ import re
17
+ import sys
18
+ from pathlib import Path
19
+
20
+
21
+ # Known brand / domain substrings that should NOT appear in engine code.
22
+ # This is a non-exhaustive deny list. CI should treat hits as warnings that
23
+ # require human review; false positives (e.g. "github" in comments) can be
24
+ # whitelisted via EXPLICIT_ALLOW.
25
+ BRAND_SUBSTRINGS = [
26
+ "coupang", "11st", "11번가", "musinsa", "무신사",
27
+ "fmkorea", "에펨코리아", "dcinside", "디시인사이드",
28
+ "ohou", "오늘의집", "kurly", "마켓컬리",
29
+ "daangn", "당근",
30
+ # Naver is allowed in Phase 0 references (official APIs) but not in engine code.
31
+ "naver.com", "blog.naver", "shopping.naver",
32
+ # Korean portal brand names
33
+ "daum.net", "kakao.com",
34
+ ]
35
+
36
+ # Regex for bare URLs / domains. Used as a secondary pass to flag hardcoded
37
+ # site hosts that slipped past the brand denylist.
38
+ URL_PATTERN = re.compile(
39
+ r"https?://[\w\.-]+|[\w-]+\.(?:com|net|org|co\.kr|kr|io)\b",
40
+ re.IGNORECASE,
41
+ )
42
+
43
+ # Generic / neutral hosts that are allowed anywhere (examples, specs, stdlib,
44
+ # and domains that legitimately appear as non-site-specific referrers / test
45
+ # fixtures — Google search as a generic Referer strategy, httpbin for transport
46
+ # tests, etc.). Anything in this set must be provably unrelated to a specific
47
+ # target-site preference.
48
+ URL_ALLOWLIST = {
49
+ "example.com", "example.org", "example.net",
50
+ "localhost", "127.0.0.1",
51
+ # Official API / documentation sources cited in code comments.
52
+ "curl.se", "playwright.dev", "nodejs.org", "npmjs.com",
53
+ # Generic Referer strategy target (used as a neutral off-site referer).
54
+ "www.google.com", "google.com",
55
+ # Generic HTTP test endpoint for infrastructure / transport tests.
56
+ "httpbin.org",
57
+ }
58
+
59
+ # Files / dirs that must be clean.
60
+ SCAN_ROOTS_STRICT_OFF = ["engine"]
61
+ SCAN_ROOTS_STRICT_ON = ["engine", "references"]
62
+
63
+ # Directory names skipped during scan (third-party code, build artefacts).
64
+ EXCLUDED_DIR_NAMES = {
65
+ "node_modules", "__pycache__", ".git", ".venv", "dist", "build",
66
+ }
67
+
68
+ # Comment markers within which a brand mention is OK (explanation).
69
+ # Keyed per-extension; any line containing these is skipped.
70
+ COMMENT_OK_MARKERS = {
71
+ ".py": ("# NOTE-BIAS-OK", "# EXAMPLE-ONLY"),
72
+ ".js": ("// NOTE-BIAS-OK", "// EXAMPLE-ONLY"),
73
+ ".yaml": ("# NOTE-BIAS-OK", "# EXAMPLE-ONLY"),
74
+ ".yml": ("# NOTE-BIAS-OK", "# EXAMPLE-ONLY"),
75
+ ".md": ("<!-- NOTE-BIAS-OK -->", "<!-- EXAMPLE-ONLY -->"),
76
+ }
77
+
78
+ # File paths explicitly exempted (full match against relative path from scan root).
79
+ EXPLICIT_ALLOW_FILES = {
80
+ # None right now — add if needed with justification.
81
+ }
82
+
83
+
84
+ def _line_is_exempt(line: str, ext: str) -> bool:
85
+ markers = COMMENT_OK_MARKERS.get(ext, ())
86
+ return any(m in line for m in markers)
87
+
88
+
89
+ def _scan_file(path: Path, root: Path) -> list[str]:
90
+ """Return list of violation strings for this file."""
91
+ rel = path.relative_to(root.parent)
92
+ if str(rel) in EXPLICIT_ALLOW_FILES:
93
+ return []
94
+
95
+ ext = path.suffix.lower()
96
+ try:
97
+ text = path.read_text(encoding="utf-8", errors="ignore")
98
+ except Exception as e:
99
+ return [f"{rel}:0 — read error: {e}"]
100
+
101
+ violations: list[str] = []
102
+ for lineno, line in enumerate(text.splitlines(), start=1):
103
+ if _line_is_exempt(line, ext):
104
+ continue
105
+ lowered = line.lower()
106
+ # 1) Brand / domain denylist
107
+ hit_brand = None
108
+ for brand in BRAND_SUBSTRINGS:
109
+ if brand.lower() in lowered:
110
+ hit_brand = brand
111
+ break
112
+ if hit_brand:
113
+ violations.append(f"{rel}:{lineno} — brand `{hit_brand}` in: {line.strip()[:120]}")
114
+ continue # one violation per line
115
+ # 2) URL/domain regex scan — catches hosts that aren't in the denylist.
116
+ for match in URL_PATTERN.finditer(line):
117
+ host = match.group(0).lower()
118
+ host = host.split("//", 1)[-1].split("/", 1)[0]
119
+ if host in URL_ALLOWLIST:
120
+ continue
121
+ if host.endswith(".example.com") or host.endswith(".example.org"):
122
+ continue
123
+ violations.append(f"{rel}:{lineno} — hardcoded host `{host}` in: {line.strip()[:120]}")
124
+ break
125
+ return violations
126
+
127
+
128
+ def main(argv: list[str] | None = None) -> int:
129
+ parser = argparse.ArgumentParser(description="Scan engine for site-name bias")
130
+ parser.add_argument("--strict", action="store_true",
131
+ help="Also scan references/*.md (usually noisy — off by default)")
132
+ parser.add_argument("--root", default=None,
133
+ help="Skill root directory. Defaults to parent of this file.")
134
+ args = parser.parse_args(argv)
135
+
136
+ skill_root = Path(args.root) if args.root else Path(__file__).parent.parent
137
+ scan_roots = SCAN_ROOTS_STRICT_ON if args.strict else SCAN_ROOTS_STRICT_OFF
138
+
139
+ total_violations: list[str] = []
140
+ scanned = 0
141
+ for name in scan_roots:
142
+ root = skill_root / name
143
+ if not root.exists():
144
+ continue
145
+ for dirpath, dirnames, filenames in os.walk(root):
146
+ # In-place filter so os.walk skips these subtrees.
147
+ dirnames[:] = [d for d in dirnames if d not in EXCLUDED_DIR_NAMES]
148
+ for fname in filenames:
149
+ p = Path(dirpath) / fname
150
+ if p.suffix.lower() not in (".py", ".js", ".yaml", ".yml", ".md", ".ts", ".mjs"):
151
+ continue
152
+ if p.name == "bias_check.py":
153
+ continue # self-exempt (this file lists the brands)
154
+ scanned += 1
155
+ total_violations.extend(_scan_file(p, skill_root))
156
+
157
+ print(f"[bias-check] scanned {scanned} files under {skill_root}")
158
+ if total_violations:
159
+ print(f"[bias-check] ❌ {len(total_violations)} violation(s):")
160
+ for v in total_violations:
161
+ print(f" - {v}")
162
+ print()
163
+ print("Fix options:")
164
+ print(" 1) Remove the brand name (preferred)")
165
+ print(" 2) If genuinely explanatory, add '# NOTE-BIAS-OK' on the same line")
166
+ print(" 3) If this is a Phase 0 official API reference, move it to references/*.md and rerun without --strict")
167
+ return 1
168
+
169
+ print("[bias-check] ✅ clean")
170
+ return 0
171
+
172
+
173
+ if __name__ == "__main__":
174
+ sys.exit(main())
@@ -0,0 +1,91 @@
1
+ from __future__ import annotations
2
+
3
+ import time
4
+ from typing import Iterable, Mapping, Protocol
5
+
6
+ from .referers import REFERER_STRATEGIES
7
+ from .result_schema import Attempt
8
+ from .validators import Verdict, validate
9
+
10
+
11
+ class _CookieItem(Protocol):
12
+ name: str
13
+ value: str
14
+
15
+
16
+ class _CookieJar(Protocol):
17
+ jar: Iterable[_CookieItem]
18
+
19
+
20
+ class ProbeResponse(Protocol):
21
+ status_code: int
22
+ text: str
23
+ url: str
24
+ cookies: _CookieJar | Mapping[str, str]
25
+
26
+
27
+ def _curl_probe(
28
+ url: str, *, impersonate: str, referer: str, timeout: int = 20
29
+ ) -> tuple[ProbeResponse | None, str | None]:
30
+ try:
31
+ from curl_cffi import requests as cffi_requests
32
+ except ImportError:
33
+ return None, "curl_cffi not installed"
34
+
35
+ headers = {
36
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
37
+ "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
38
+ }
39
+ if referer:
40
+ headers["Referer"] = referer
41
+
42
+ try:
43
+ resp = cffi_requests.get(
44
+ url,
45
+ impersonate=impersonate,
46
+ headers=headers,
47
+ timeout=timeout,
48
+ allow_redirects=True,
49
+ )
50
+ return resp, None
51
+ except cffi_requests.exceptions.RequestException as e:
52
+ return None, f"{type(e).__name__}:{str(e)[:200]}"
53
+
54
+
55
+ def run_attempt(
56
+ url: str,
57
+ *,
58
+ transform_name: str,
59
+ impersonate: str,
60
+ referer_name: str,
61
+ success_selectors: list[str] | None,
62
+ known_bad_sizes: list[int] | None,
63
+ timeout: int,
64
+ phase: str,
65
+ ) -> tuple[Attempt, ProbeResponse | None]:
66
+ referer_url = REFERER_STRATEGIES.get(referer_name, REFERER_STRATEGIES["none"])(url)
67
+ started_at = time.time()
68
+ resp, err = _curl_probe(url, impersonate=impersonate, referer=referer_url, timeout=timeout)
69
+ elapsed = round(time.time() - started_at, 3)
70
+
71
+ att = Attempt(
72
+ phase=phase,
73
+ executor="curl_cffi",
74
+ url=url,
75
+ url_transform=transform_name,
76
+ impersonate=impersonate,
77
+ referer=referer_name,
78
+ elapsed_s=elapsed,
79
+ )
80
+
81
+ if err or resp is None:
82
+ att.error = err or "no response"
83
+ att.verdict = Verdict.UNKNOWN.value
84
+ return att, None
85
+
86
+ vr = validate(resp, success_selectors=success_selectors, known_bad_sizes=known_bad_sizes)
87
+ att.status = vr.status
88
+ att.body_size = vr.body_size
89
+ att.verdict = vr.verdict.value
90
+ att.reasons = vr.reasons
91
+ return att, resp