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
@@ -10,32 +10,6 @@ import { resolveServeProcessInvocation, runCodegraphServe } from "../src/serve.t
10
10
  const componentRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
11
11
 
12
12
  describe("runCodegraphServe", () => {
13
- it("#given CodeGraph is unresolved #when serving MCP #then exits non-zero with a one-line skip hint", async () => {
14
- // given
15
- const stderr: string[] = [];
16
- const spawned: string[] = [];
17
-
18
- // when
19
- const exitCode = await runCodegraphServe({
20
- config: { codegraph: { auto_provision: false, enabled: true }, sources: [], warnings: [] },
21
- env: { PATH: "/bin" },
22
- buildEnv: () => ({}),
23
- resolve: () => ({ argsPrefix: [], command: "codegraph", exists: false, source: "path" }),
24
- runProcess: (command: string) => {
25
- spawned.push(command);
26
- return Promise.resolve(0);
27
- },
28
- stderr: { write: (chunk: string) => stderr.push(chunk) },
29
- });
30
-
31
- // then
32
- expect(exitCode).toBe(1);
33
- expect(spawned).toEqual([]);
34
- expect(stderr).toEqual([
35
- "CodeGraph MCP skipped: codegraph binary not found. Install CodeGraph or set OMO_CODEGRAPH_BIN.\n",
36
- ]);
37
- });
38
-
39
13
  it("#given CodeGraph resolves #when serving MCP #then execs codegraph serve --mcp with inherited stdio and telemetry disabled", async () => {
40
14
  // given
41
15
  const calls: Array<{
@@ -87,32 +61,6 @@ describe("runCodegraphServe", () => {
87
61
  ]);
88
62
  });
89
63
 
90
- it("#given an unsupported local Node #when serving MCP #then skips fast without spawning codegraph", async () => {
91
- // given
92
- const stderr: string[] = [];
93
- const spawned: string[] = [];
94
-
95
- // when
96
- const exitCode = await runCodegraphServe({
97
- env: {},
98
- nodeVersion: "26.3.0",
99
- buildEnv: () => ({}),
100
- resolve: () => ({ argsPrefix: [], command: "codegraph", exists: true, source: "path" }),
101
- runProcess: (command: string) => {
102
- spawned.push(command);
103
- return Promise.resolve(0);
104
- },
105
- stderr: { write: (chunk: string) => stderr.push(chunk) },
106
- });
107
-
108
- // then
109
- expect(exitCode).toBe(1);
110
- expect(spawned).toEqual([]);
111
- expect(stderr).toHaveLength(1);
112
- expect(stderr[0]).toContain("CodeGraph MCP skipped");
113
- expect(stderr[0]).toContain("CODEGRAPH_ALLOW_UNSAFE_NODE");
114
- });
115
-
116
64
  it("#given an unsupported local Node but the unsafe override is set #when serving MCP #then it still spawns codegraph", async () => {
117
65
  // given
118
66
  const spawned: string[] = [];
@@ -182,66 +130,6 @@ describe("runCodegraphServe", () => {
182
130
  expect(spawned).toEqual([{ args: ["serve", "--mcp"], command: commandPath }]);
183
131
  });
184
132
 
185
- it("#given OMO_CODEGRAPH_BIN points at a missing path #when serving MCP #then exits before spawn", async () => {
186
- // given
187
- const stderr: string[] = [];
188
- const spawned: string[] = [];
189
-
190
- // when
191
- const exitCode = await runCodegraphServe({
192
- buildEnv: () => ({}),
193
- commandExists: () => false,
194
- resolve: () => ({ argsPrefix: [], command: "/nonexistent", exists: true, source: "env" }),
195
- runProcess: (command: string) => {
196
- spawned.push(command);
197
- return Promise.resolve(0);
198
- },
199
- stderr: { write: (chunk: string) => stderr.push(chunk) },
200
- });
201
-
202
- // then
203
- expect(exitCode).toBe(1);
204
- expect(spawned).toEqual([]);
205
- expect(stderr).toEqual([
206
- "CodeGraph MCP skipped: codegraph binary not found. Install CodeGraph or set OMO_CODEGRAPH_BIN.\n",
207
- ]);
208
- });
209
-
210
- it("#given Codex SOT disables CodeGraph #when serving MCP #then exits non-zero with a disabled hint", async () => {
211
- // given
212
- const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-serve-disabled-home-"));
213
- const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-serve-disabled-workspace-"));
214
- const stderr: string[] = [];
215
- const spawned: string[] = [];
216
- try {
217
- mkdirSync(join(homeDir, ".omo"), { recursive: true });
218
- mkdirSync(join(workspace, ".omo"), { recursive: true });
219
- writeFileSync(join(homeDir, ".omo", "config.jsonc"), '{ "codegraph": { "enabled": true } }\n');
220
- writeFileSync(join(workspace, ".omo", "config.jsonc"), '{ "[codex]": { "codegraph": { "enabled": false } } }\n');
221
-
222
- // when
223
- const exitCode = await runCodegraphServe({
224
- cwd: workspace,
225
- env: { HOME: homeDir },
226
- runProcess: (command: string) => {
227
- spawned.push(command);
228
- return Promise.resolve(0);
229
- },
230
- stderr: { write: (chunk: string) => stderr.push(chunk) },
231
- });
232
-
233
- // then
234
- expect(exitCode).toBe(1);
235
- expect(spawned).toEqual([]);
236
- expect(stderr).toEqual([
237
- "CodeGraph MCP skipped: disabled by OMO SOT config. Set [codex].codegraph.enabled=true to enable it.\n",
238
- ]);
239
- } finally {
240
- rmSync(homeDir, { recursive: true, force: true });
241
- rmSync(workspace, { recursive: true, force: true });
242
- }
243
- });
244
-
245
133
  it("#given Windows Codex SOT install_dir has codegraph.cmd #when serving MCP #then it resolves there and exports CODEGRAPH_INSTALL_DIR", async () => {
246
134
  await withProcessPlatform("win32", async () => {
247
135
  // given
@@ -260,7 +148,7 @@ describe("runCodegraphServe", () => {
260
148
 
261
149
  // when
262
150
  const exitCode = await runCodegraphServe({
263
- config: { codegraph: { enabled: true, install_dir: installDir }, sources: [], warnings: [] },
151
+ config: { codegraph: { enabled: true, install_dir: installDir }, sources: [], trustedCodegraphInstallDir: installDir, warnings: [] },
264
152
  env: { HOME: "/tmp/home" },
265
153
  nodeVersion: "22.14.0",
266
154
  homeDir: "/tmp/home",
@@ -52,6 +52,7 @@ describe("CodeGraph SessionStart worker Node support", () => {
52
52
  const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-node-provision-home-"));
53
53
  const binPath = join(homeDir, ".omo", "codegraph", "bin", "codegraph");
54
54
  const calls: Array<{ readonly args: readonly string[]; readonly command: string }> = [];
55
+ const provisionCalls: Array<{ readonly installDir?: string; readonly lockDir: string; readonly version: "1.0.1" }> = [];
55
56
  const outcomes: unknown[] = [];
56
57
 
57
58
  try {
@@ -63,7 +64,10 @@ describe("CodeGraph SessionStart worker Node support", () => {
63
64
  logOutcome: (outcome) => outcomes.push(outcome),
64
65
  deps: {
65
66
  ensureGitignored: () => true,
66
- ensureProvisioned: () => Promise.resolve({ binPath, provisioned: true }),
67
+ ensureProvisioned: (options) => {
68
+ provisionCalls.push(options);
69
+ return Promise.resolve({ binPath, provisioned: true });
70
+ },
67
71
  prepareWorkspace: () => ({
68
72
  dataDir: join(homeDir, ".omo/codegraph/projects/test"),
69
73
  dataRoot: join(homeDir, ".omo/codegraph"),
@@ -85,6 +89,9 @@ describe("CodeGraph SessionStart worker Node support", () => {
85
89
  { args: ["status", "--json"], command: binPath },
86
90
  { args: ["init"], command: binPath },
87
91
  ]);
92
+ expect(provisionCalls).toEqual([
93
+ { installDir: join(homeDir, ".omo", "codegraph"), lockDir: join(homeDir, ".omo", "codegraph", ".locks"), version: "1.0.1" },
94
+ ]);
88
95
  expect(outcomes).toEqual([{ action: "initialized", exitCode: 0, projectRoot: workspace, source: "provisioned", timedOut: false }]);
89
96
  } finally {
90
97
  rmSync(workspace, { recursive: true, force: true });
@@ -0,0 +1,63 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+
6
+ import { runCodegraphSessionStartWorker } from "../src/hook.ts";
7
+
8
+ describe("CodeGraph SessionStart trust boundary", () => {
9
+ it("#given project config sets install_dir #when worker provisions CodeGraph #then it uses the trusted home install root", async () => {
10
+ // given
11
+ const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-untrusted-project-"));
12
+ const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-untrusted-project-home-"));
13
+ const attackerInstallDir = join(workspace, "attacker-install");
14
+ const trustedInstallDir = join(homeDir, ".omo", "codegraph");
15
+ const calls: Array<{ readonly env: Record<string, string>; readonly installDir?: string; readonly lockDir?: string }> = [];
16
+ try {
17
+ mkdirSync(join(workspace, ".omo"), { recursive: true });
18
+ writeFileSync(join(workspace, ".omo", "config.jsonc"), JSON.stringify({ codegraph: { enabled: true, install_dir: attackerInstallDir } }));
19
+
20
+ // when
21
+ const result = await runCodegraphSessionStartWorker({
22
+ cwd: workspace,
23
+ env: { HOME: homeDir },
24
+ nodeVersion: "22.14.0",
25
+ deps: {
26
+ ensureGitignored: () => true,
27
+ ensureProvisioned: (options) => {
28
+ calls.push({
29
+ env: {},
30
+ ...(options.installDir === undefined ? {} : { installDir: options.installDir }),
31
+ ...(options.lockDir === undefined ? {} : { lockDir: options.lockDir }),
32
+ });
33
+ return Promise.resolve({ binPath: join(trustedInstallDir, "bin", "codegraph"), provisioned: true });
34
+ },
35
+ prepareWorkspace: () => ({
36
+ dataDir: join(homeDir, ".omo/codegraph/projects/test"),
37
+ dataRoot: join(homeDir, ".omo/codegraph"),
38
+ linked: true,
39
+ mode: "global-linked",
40
+ projectLink: join(workspace, ".codegraph"),
41
+ }),
42
+ resolveCommand: (options) => {
43
+ expect(options?.provisioned?.()).toBe(null);
44
+ return { argsPrefix: [], command: "missing-codegraph", exists: false, source: "path" };
45
+ },
46
+ runCommand: (_projectRoot, _command, _args, options) => {
47
+ calls.push({ env: options.env });
48
+ return Promise.resolve({ exitCode: 0, stdout: calls.length === 2 ? '{"initialized":false}' : "", timedOut: false });
49
+ },
50
+ },
51
+ });
52
+
53
+ // then
54
+ expect(result).toEqual({ action: "initialized" });
55
+ expect(calls[0]).toEqual({ env: {}, installDir: trustedInstallDir, lockDir: join(trustedInstallDir, ".locks") });
56
+ expect(calls[1]?.env["CODEGRAPH_INSTALL_DIR"]).toBe(trustedInstallDir);
57
+ expect(calls[1]?.env["CODEGRAPH_INSTALL_DIR"]).not.toBe(attackerInstallDir);
58
+ } finally {
59
+ rmSync(workspace, { recursive: true, force: true });
60
+ rmSync(homeDir, { recursive: true, force: true });
61
+ }
62
+ });
63
+ });
@@ -0,0 +1,106 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { existsSync, mkdtempSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+
6
+ import { runCodegraphSessionStartWorker } from "../src/hook.ts";
7
+
8
+ describe("CodeGraph SessionStart worker availability", () => {
9
+ it("#given CodeGraph cannot be resolved or provisioned #when worker runs #then it logs a graceful skip", async () => {
10
+ // given
11
+ const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-"));
12
+ const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-home-"));
13
+ const outcomes: unknown[] = [];
14
+ const calls: string[] = [];
15
+
16
+ try {
17
+ // when
18
+ const result = await runCodegraphSessionStartWorker({
19
+ cwd: workspace,
20
+ env: { HOME: homeDir },
21
+ nodeVersion: "22.14.0",
22
+ logOutcome: (outcome) => outcomes.push(outcome),
23
+ deps: {
24
+ ensureGitignored: () => {
25
+ calls.push("ensureGitignored");
26
+ return true;
27
+ },
28
+ ensureProvisioned: () => Promise.resolve({ error: "offline", provisioned: false }),
29
+ prepareWorkspace: () => {
30
+ calls.push("prepareWorkspace");
31
+ return {
32
+ dataDir: join(homeDir, ".omo/codegraph/projects/test"),
33
+ dataRoot: join(homeDir, ".omo/codegraph"),
34
+ linked: true,
35
+ mode: "global-linked",
36
+ projectLink: join(workspace, ".codegraph"),
37
+ };
38
+ },
39
+ resolveCommand: () => ({ argsPrefix: [], command: "codegraph", exists: false, source: "path" }),
40
+ runCommand: () => {
41
+ calls.push("runCommand");
42
+ return Promise.resolve({ exitCode: 0, stdout: "", timedOut: false });
43
+ },
44
+ },
45
+ });
46
+
47
+ // then
48
+ expect(result).toEqual({ action: "skipped-unavailable" });
49
+ expect(calls).toEqual([]);
50
+ expect(outcomes).toEqual([
51
+ {
52
+ action: "skipped-unavailable",
53
+ error: "offline",
54
+ projectRoot: workspace,
55
+ source: "path",
56
+ },
57
+ ]);
58
+ } finally {
59
+ rmSync(workspace, { recursive: true, force: true });
60
+ rmSync(homeDir, { recursive: true, force: true });
61
+ }
62
+ });
63
+
64
+ it("#given CodeGraph is unavailable and auto provisioning is disabled #when worker runs #then it leaves the project untouched", async () => {
65
+ // given
66
+ const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-unavailable-"));
67
+ const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-unavailable-home-"));
68
+ const outcomes: unknown[] = [];
69
+
70
+ try {
71
+ // when
72
+ const result = await runCodegraphSessionStartWorker({
73
+ config: { codegraph: { auto_provision: false, enabled: true }, sources: [], warnings: [] },
74
+ nodeVersion: "22.14.0",
75
+ cwd: workspace,
76
+ env: { HOME: homeDir },
77
+ logOutcome: (outcome) => outcomes.push(outcome),
78
+ deps: {
79
+ ensureProvisioned: () => {
80
+ throw new Error("auto provision should not run");
81
+ },
82
+ resolveCommand: () => ({ argsPrefix: [], command: "missing-codegraph", exists: false, source: "path" }),
83
+ runCommand: () => {
84
+ throw new Error("codegraph command should not run");
85
+ },
86
+ },
87
+ });
88
+
89
+ // then
90
+ expect(result).toEqual({ action: "skipped-unavailable" });
91
+ expect(existsSync(join(workspace, ".codegraph"))).toBe(false);
92
+ expect(existsSync(join(workspace, ".git", "info", "exclude"))).toBe(false);
93
+ expect(outcomes).toEqual([
94
+ {
95
+ action: "skipped-unavailable",
96
+ error: "codegraph binary unavailable and auto_provision is disabled",
97
+ projectRoot: workspace,
98
+ source: "path",
99
+ },
100
+ ]);
101
+ } finally {
102
+ rmSync(workspace, { recursive: true, force: true });
103
+ rmSync(homeDir, { recursive: true, force: true });
104
+ }
105
+ });
106
+ });
@@ -0,0 +1,150 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+
6
+ import { resolveCodegraphCommandInvocation, runCodegraphSessionStartWorker } from "../src/hook.ts";
7
+
8
+ describe("CodeGraph SessionStart worker flow", () => {
9
+ it("#given Windows install_dir has codegraph.cmd #when worker resolves provisioned CodeGraph #then it uses the cmd shim", async () => {
10
+ await withProcessPlatform("win32", async () => {
11
+ // given
12
+ const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-win32-"));
13
+ const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-win32-home-"));
14
+ const installDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-win32-install-"));
15
+ const binPath = join(installDir, "bin", "codegraph.cmd");
16
+ const calls: { readonly args: readonly string[]; readonly command: string; readonly env: Record<string, string> }[] = [];
17
+ const outcomes: unknown[] = [];
18
+ try {
19
+ mkdirSync(join(installDir, "bin"), { recursive: true });
20
+ writeFileSync(binPath, "");
21
+
22
+ // when
23
+ const result = await runCodegraphSessionStartWorker({
24
+ config: { codegraph: { enabled: true, install_dir: installDir }, sources: [], trustedCodegraphInstallDir: installDir, warnings: [] },
25
+ nodeVersion: "22.14.0",
26
+ cwd: workspace,
27
+ env: { HOME: homeDir },
28
+ logOutcome: (outcome) => outcomes.push(outcome),
29
+ deps: {
30
+ ensureGitignored: () => true,
31
+ ensureProvisioned: () => {
32
+ throw new Error("provisioning should not run when install_dir binary exists");
33
+ },
34
+ prepareWorkspace: () => ({
35
+ dataDir: join(homeDir, ".omo/codegraph/projects/test"),
36
+ dataRoot: join(homeDir, ".omo/codegraph"),
37
+ linked: true,
38
+ mode: "global-linked",
39
+ projectLink: join(workspace, ".codegraph"),
40
+ }),
41
+ resolveCommand: (options) => {
42
+ const provisioned = options?.provisioned?.() ?? null;
43
+ return { argsPrefix: [], command: provisioned ?? "missing-codegraph", exists: provisioned !== null, source: provisioned === null ? "path" : "provisioned" };
44
+ },
45
+ runCommand: (_projectRoot, command, args, options) => {
46
+ calls.push({ args, command, env: options.env });
47
+ return Promise.resolve({ exitCode: 0, stdout: calls.length === 1 ? '{"initialized":false}' : "", timedOut: false });
48
+ },
49
+ },
50
+ });
51
+
52
+ // then
53
+ expect(result).toEqual({ action: "initialized" });
54
+ expect(calls.map((call) => ({ args: [...call.args], command: call.command }))).toEqual([
55
+ { args: ["status", "--json"], command: binPath },
56
+ { args: ["init"], command: binPath },
57
+ ]);
58
+ expect(calls[0]?.env["CODEGRAPH_INSTALL_DIR"]).toBe(installDir);
59
+ expect(outcomes).toEqual([{ action: "initialized", exitCode: 0, projectRoot: workspace, source: "provisioned", timedOut: false }]);
60
+ } finally {
61
+ rmSync(workspace, { recursive: true, force: true });
62
+ rmSync(homeDir, { recursive: true, force: true });
63
+ rmSync(installDir, { recursive: true, force: true });
64
+ }
65
+ });
66
+ });
67
+
68
+ it("#given Windows codegraph.cmd #when default worker runner builds invocation #then it runs through cmd.exe", () => {
69
+ // given
70
+ const command = "C:\\Users\\test\\.omo\\codegraph\\bin\\codegraph.cmd";
71
+
72
+ // when
73
+ const invocation = resolveCodegraphCommandInvocation(command, ["status", "--json"], "win32");
74
+
75
+ // then
76
+ expect(invocation).toEqual({
77
+ args: ["/d", "/s", "/c", command, "status", "--json"],
78
+ command: "cmd.exe",
79
+ });
80
+ });
81
+
82
+ it("#given non-Windows codegraph command #when default worker runner builds invocation #then it executes directly", () => {
83
+ // given
84
+ const command = "/home/test/.omo/codegraph/bin/codegraph";
85
+
86
+ // when
87
+ const invocation = resolveCodegraphCommandInvocation(command, ["sync"], "linux");
88
+
89
+ // then
90
+ expect(invocation).toEqual({ args: ["sync"], command });
91
+ });
92
+
93
+ it("#given resolved CodeGraph status #when worker runs #then it runs status before init or sync", async () => {
94
+ for (const scenario of [
95
+ { action: "initialized", args: [["status", "--json"], ["init"]], stdout: '{"initialized":false}' },
96
+ { action: "synced", args: [["status", "--json"], ["sync"]], stdout: '{"initialized":true}' },
97
+ ] as const) {
98
+ // given
99
+ const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-status-"));
100
+ const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-status-home-"));
101
+ const calls: { readonly args: readonly string[]; readonly command: string; readonly env: Record<string, string> }[] = [];
102
+ const outcomes: unknown[] = [];
103
+ try {
104
+ // when
105
+ const result = await runCodegraphSessionStartWorker({
106
+ config: { codegraph: { enabled: true, install_dir: "/tmp/codegraph-install" }, sources: [], trustedCodegraphInstallDir: "/tmp/codegraph-install", warnings: [] },
107
+ nodeVersion: "22.14.0",
108
+ cwd: workspace,
109
+ env: { HOME: homeDir },
110
+ logOutcome: (outcome) => outcomes.push(outcome),
111
+ deps: {
112
+ ensureGitignored: () => true,
113
+ ensureProvisioned: () => Promise.resolve({ binPath: "/tmp/codegraph", provisioned: true }),
114
+ prepareWorkspace: () => ({
115
+ dataDir: join(homeDir, ".omo/codegraph/projects/test"),
116
+ dataRoot: join(homeDir, ".omo/codegraph"),
117
+ linked: true,
118
+ mode: "global-linked",
119
+ projectLink: join(workspace, ".codegraph"),
120
+ }),
121
+ resolveCommand: () => ({ argsPrefix: [], command: "/tmp/codegraph", exists: true, source: "path" }),
122
+ runCommand: (_projectRoot, command, args, options) => {
123
+ calls.push({ args, command, env: options.env });
124
+ return Promise.resolve({ exitCode: 0, stdout: calls.length === 1 ? scenario.stdout : "", timedOut: false });
125
+ },
126
+ },
127
+ });
128
+
129
+ // then
130
+ expect(result).toEqual({ action: scenario.action });
131
+ expect(calls.map((call) => [...call.args])).toEqual(scenario.args.map((args) => [...args]));
132
+ expect(calls[0]?.env["CODEGRAPH_INSTALL_DIR"]).toBe("/tmp/codegraph-install");
133
+ expect(outcomes).toEqual([{ action: scenario.action, exitCode: 0, projectRoot: workspace, source: "path", timedOut: false }]);
134
+ } finally {
135
+ rmSync(workspace, { recursive: true, force: true });
136
+ rmSync(homeDir, { recursive: true, force: true });
137
+ }
138
+ }
139
+ });
140
+ });
141
+
142
+ async function withProcessPlatform(platform: NodeJS.Platform, run: () => Promise<void>): Promise<void> {
143
+ const descriptor = Object.getOwnPropertyDescriptor(process, "platform");
144
+ Object.defineProperty(process, "platform", { configurable: true, enumerable: true, value: platform });
145
+ try {
146
+ await run();
147
+ } finally {
148
+ if (descriptor !== undefined) Object.defineProperty(process, "platform", descriptor);
149
+ }
150
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "4.12.1",
3
+ "version": "4.13.0",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "4.12.1",
3
+ "version": "4.13.0",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "4.12.1",
3
+ "version": "4.13.0",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lsp",
3
- "version": "4.12.1",
3
+ "version": "4.13.0",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -4032,9 +4032,9 @@ function getSparkShellRuntimeAwareness(env = process.env, deps = {}) {
4032
4032
  return [
4033
4033
  SPARKSHELL_AWARENESS_MARKER,
4034
4034
  "",
4035
- `- Prefer \`${command} sparkshell <command>\` for repo inspection, CLI smoke tests, git/history checks, and bounded verification before falling back to raw shell commands.`,
4036
- `- Use \`${command} sparkshell --shell '<command>'\` only when shell metacharacters are required.`,
4037
- `- Use \`${command} sparkshell --tmux-pane <pane-id> --tail-lines 400\` to inspect an existing tmux pane. Tail lines must stay between 100 and 1000.`,
4035
+ `- Use \`${command} sparkshell <command>\` first for repo inspection, CLI smoke tests, git/history checks, and bounded command output. Raw \`rg\`/\`grep\`/\`cat\`/\`git\` are fallbacks when Sparkshell is unavailable or too narrow for the task.`,
4036
+ `- Use \`${command} sparkshell --shell '<command>'\` only for shell metacharacters or pipelines.`,
4037
+ `- Use \`${command} sparkshell --tmux-pane <pane-id> --tail-lines 400\` only to inspect an existing pane, never to launch ordinary commands. Tail lines must stay between 100 and 1000.`,
4038
4038
  "- When no native sidecar or appserver is available, Sparkshell silently falls back to raw command execution. `OMO_SPARKSHELL_BIN` selects a native sidecar path.",
4039
4039
  "- When `CODEX_THREAD_ID` identifies a Codex session, Sparkshell feeds recent session context (first/latest user request + last 5 conversation messages) into oversized-output condensation for relevance ranking, but never appends that context to command output. `OMO_SPARKSHELL_SESSION_CONTEXT=0` disables the lookup.",
4040
4040
  `- Route potentially huge output (full log files, big diffs, \`cat\`/\`grep\` over large artifacts) through \`${command} sparkshell\` instead of reading it raw: oversized output is condensed to a budget while preserving error signatures, repeated patterns, session-goal-relevant lines, and head/tail. Tune with \`--budget <chars>\`; disable with \`OMO_SPARKSHELL_CONDENSE=0\`.`,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-rules",
3
- "version": "4.12.1",
3
+ "version": "4.13.0",
4
4
  "description": "Codex plugin that injects project rule files into model context through lifecycle hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -81,9 +81,9 @@ export function getSparkShellRuntimeAwareness(env: RuntimeEnv = process.env, dep
81
81
  return [
82
82
  SPARKSHELL_AWARENESS_MARKER,
83
83
  "",
84
- `- Prefer \`${command} sparkshell <command>\` for repo inspection, CLI smoke tests, git/history checks, and bounded verification before falling back to raw shell commands.`,
85
- `- Use \`${command} sparkshell --shell '<command>'\` only when shell metacharacters are required.`,
86
- `- Use \`${command} sparkshell --tmux-pane <pane-id> --tail-lines 400\` to inspect an existing tmux pane. Tail lines must stay between 100 and 1000.`,
84
+ `- Use \`${command} sparkshell <command>\` first for repo inspection, CLI smoke tests, git/history checks, and bounded command output. Raw \`rg\`/\`grep\`/\`cat\`/\`git\` are fallbacks when Sparkshell is unavailable or too narrow for the task.`,
85
+ `- Use \`${command} sparkshell --shell '<command>'\` only for shell metacharacters or pipelines.`,
86
+ `- Use \`${command} sparkshell --tmux-pane <pane-id> --tail-lines 400\` only to inspect an existing pane, never to launch ordinary commands. Tail lines must stay between 100 and 1000.`,
87
87
  "- When no native sidecar or appserver is available, Sparkshell silently falls back to raw command execution. `OMO_SPARKSHELL_BIN` selects a native sidecar path.",
88
88
  "- When `CODEX_THREAD_ID` identifies a Codex session, Sparkshell feeds recent session context (first/latest user request + last 5 conversation messages) into oversized-output condensation for relevance ranking, but never appends that context to command output. `OMO_SPARKSHELL_SESSION_CONTEXT=0` disables the lookup.",
89
89
  `- Route potentially huge output (full log files, big diffs, \`cat\`/\`grep\` over large artifacts) through \`${command} sparkshell\` instead of reading it raw: oversized output is condensed to a budget while preserving error signatures, repeated patterns, session-goal-relevant lines, and head/tail. Tune with \`--budget <chars>\`; disable with \`OMO_SPARKSHELL_CONDENSE=0\`.`,
@@ -19,6 +19,29 @@ function parseAdditionalContext(output: string): string {
19
19
  return parsed.hookSpecificOutput?.additionalContext ?? "";
20
20
  }
21
21
 
22
+ function normalizeGuidance(value: string): string {
23
+ return value.toLowerCase().replace(/\s+/g, " ").trim();
24
+ }
25
+
26
+ function expectSparkshellFirstContract(value: string): void {
27
+ const guidance = normalizeGuidance(value);
28
+
29
+ expect(guidance).toMatch(/`omo sparkshell <command>`[^.]*\bfirst\b/);
30
+ expect(guidance).toMatch(/\brepo inspection\b/);
31
+ expect(guidance).toMatch(/\bcli smoke tests\b/);
32
+ expect(guidance).toMatch(/\bgit\/history checks\b/);
33
+ expect(guidance).toMatch(/\bbounded command output\b/);
34
+ expect(guidance).toMatch(/\braw\b[^.]*`rg`\/`grep`\/`cat`\/`git`[^.]*\bfallbacks?\b/);
35
+ expect(guidance).toMatch(/\bsparkshell is unavailable\b/);
36
+ expect(guidance).toMatch(/\btoo narrow\b/);
37
+ expect(guidance).toMatch(/`omo sparkshell --shell '<command>'`[^.]*\bmetacharacters\b[^.]*\bpipelines\b/);
38
+ expect(guidance).toMatch(
39
+ /`omo sparkshell --tmux-pane <pane-id> --tail-lines 400`[^.]*\bonly\b[^.]*\binspect\b[^.]*\bexisting pane\b/,
40
+ );
41
+ expect(guidance).toMatch(/`omo sparkshell --tmux-pane <pane-id> --tail-lines 400`[^.]*\bnever\b[^.]*\blaunch ordinary commands\b/);
42
+ expect(guidance).not.toMatch(/\bprefer\b[^.]*\bbefore raw shell commands\b/);
43
+ }
44
+
22
45
  function parseHookOutput(value: unknown): HookOutput {
23
46
  if (typeof value !== "object" || value === null) {
24
47
  return {};
@@ -85,15 +108,16 @@ describe("Codex Sparkshell awareness", () => {
85
108
  );
86
109
 
87
110
  // then
88
- expect(parseAdditionalContext(output)).toContain("omo sparkshell <command>");
89
- expect(parseAdditionalContext(output)).toContain("OMO_SPARKSHELL_SESSION_CONTEXT");
90
- expect(parseAdditionalContext(output)).toContain("OMO_SPARKSHELL_CONDENSE");
91
- expect(parseAdditionalContext(output)).toContain("OMO_SPARKSHELL_SPARK");
92
- expect(parseAdditionalContext(output)).toContain("[sparkshell caption]");
93
- expect(parseAdditionalContext(output)).toContain("never appends that context to command output");
94
- expect(parseAdditionalContext(output)).toContain("what the full output contained");
95
- expect(parseAdditionalContext(output)).not.toContain("[REDACTED]");
96
- expect(parseAdditionalContext(output)).not.toContain("appends recent session context");
111
+ const context = parseAdditionalContext(output);
112
+ expectSparkshellFirstContract(context);
113
+ expect(context).toContain("OMO_SPARKSHELL_SESSION_CONTEXT");
114
+ expect(context).toContain("OMO_SPARKSHELL_CONDENSE");
115
+ expect(context).toContain("OMO_SPARKSHELL_SPARK");
116
+ expect(context).toContain("[sparkshell caption]");
117
+ expect(context).toContain("never appends that context to command output");
118
+ expect(context).toContain("what the full output contained");
119
+ expect(context).not.toContain("[REDACTED]");
120
+ expect(context).not.toContain("appends recent session context");
97
121
  });
98
122
 
99
123
  it("#given inactive env #when SessionStart runs #then emits no Sparkshell guidance", async () => {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-start-work-continuation",
3
- "version": "4.12.1",
3
+ "version": "4.13.0",
4
4
  "description": "Codex Stop hook continuation injector for omo-codex start-work plans.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-teammode",
3
- "version": "4.12.1",
3
+ "version": "4.13.0",
4
4
  "description": "Codex team-mode hook component that keeps background thread titles descriptive after create_thread.",
5
5
  "type": "module",
6
6
  "private": true,