oh-my-opencode 4.13.0 → 4.14.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 (445) hide show
  1. package/.agents/skills/codex-qa/SKILL.md +15 -0
  2. package/.agents/skills/codex-qa/references/logging-debug.md +12 -0
  3. package/.agents/skills/opencode-qa/SKILL.md +17 -0
  4. package/.agents/skills/opencode-qa/references/tui-tmux.md +17 -0
  5. package/.agents/skills/work-with-pr/SKILL.md +18 -10
  6. package/.opencode/skills/work-with-pr/SKILL.md +18 -10
  7. package/README.md +2 -2
  8. package/dist/cli/doctor/checks/telemetry.d.ts +2 -0
  9. package/dist/cli/doctor/framework/constants.d.ts +1 -0
  10. package/dist/cli/doctor/framework/doctor-target.d.ts +1 -1
  11. package/dist/cli/index.js +24651 -16452
  12. package/dist/cli-node/index.js +24651 -16452
  13. package/dist/config/schema/oh-my-opencode-config.d.ts +1 -0
  14. package/dist/features/team-mode/test-support/async-test-helpers.d.ts +19 -0
  15. package/dist/hooks/atlas/final-wave-approval-gate.d.ts +1 -0
  16. package/dist/hooks/atlas/subagent-completion-reminder.d.ts +30 -0
  17. package/dist/hooks/atlas/types.d.ts +2 -0
  18. package/dist/hooks/atlas/verification-reminders.d.ts +3 -0
  19. package/dist/hooks/team-session-events/team-idle-wake-hint.d.ts +1 -0
  20. package/dist/index.d.ts +1 -0
  21. package/dist/index.js +33232 -19559
  22. package/dist/mcp/context7.d.ts +9 -8
  23. package/dist/oh-my-opencode.schema.json +4 -0
  24. package/dist/shared/posthog.d.ts +17 -10
  25. package/dist/shared/telemetry-product-identity.d.ts +2 -0
  26. package/dist/skills/coding-agent-sessions/SKILL.md +128 -0
  27. package/dist/skills/coding-agent-sessions/agents/openai.yaml +4 -0
  28. package/dist/skills/coding-agent-sessions/references/all-platforms.md +71 -0
  29. package/dist/skills/coding-agent-sessions/references/claude.md +32 -0
  30. package/dist/skills/coding-agent-sessions/references/codex.md +30 -0
  31. package/dist/skills/coding-agent-sessions/references/opencode.md +43 -0
  32. package/dist/skills/coding-agent-sessions/references/senpi.md +17 -0
  33. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/__init__.py +1 -0
  34. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/claude.py +66 -0
  35. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +283 -0
  36. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/codex.py +105 -0
  37. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +275 -0
  38. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/jsonio.py +55 -0
  39. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/kiro_scanner.py +91 -0
  40. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/opencode.py +289 -0
  41. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +92 -0
  42. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_optional_scanners.py +203 -0
  43. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_scanners.py +177 -0
  44. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/timeparse.py +51 -0
  45. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +149 -0
  46. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/types.py +57 -0
  47. package/dist/skills/coding-agent-sessions/scripts/find-agent-sessions.py +19 -0
  48. package/dist/skills/frontend/ATTRIBUTION.md +52 -8
  49. package/dist/skills/frontend/SKILL.md +29 -8
  50. package/dist/skills/frontend/references/design/README.md +29 -12
  51. package/dist/skills/frontend/references/design/_INDEX.md +3 -3
  52. package/dist/skills/frontend/references/design/design-system-architecture.md +22 -19
  53. package/dist/skills/frontend/references/designpowers/EVIDENCE.md +89 -0
  54. package/dist/skills/frontend/references/designpowers/README.md +48 -0
  55. package/dist/skills/frontend/references/designpowers/UPSTREAM.md +80 -0
  56. package/dist/skills/frontend/references/designpowers/lane-a-direction.md +64 -0
  57. package/dist/skills/frontend/references/designpowers/lane-b-execution.md +65 -0
  58. package/dist/skills/frontend/references/designpowers/lane-c-review.md +65 -0
  59. package/dist/skills/frontend/references/designpowers/lane-d-memory.md +83 -0
  60. package/dist/skills/frontend/references/designpowers/orchestration.md +80 -0
  61. package/dist/skills/frontend/references/designpowers/routing.md +79 -0
  62. package/dist/skills/frontend/references/designpowers/vendor/LICENSE +21 -0
  63. package/dist/skills/frontend/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
  64. package/dist/skills/frontend/references/designpowers/vendor/agents/content-writer.md +132 -0
  65. package/dist/skills/frontend/references/designpowers/vendor/agents/design-builder.md +109 -0
  66. package/dist/skills/frontend/references/designpowers/vendor/agents/design-critic.md +89 -0
  67. package/dist/skills/frontend/references/designpowers/vendor/agents/design-lead.md +113 -0
  68. package/dist/skills/frontend/references/designpowers/vendor/agents/design-scout.md +78 -0
  69. package/dist/skills/frontend/references/designpowers/vendor/agents/design-strategist.md +121 -0
  70. package/dist/skills/frontend/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
  71. package/dist/skills/frontend/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
  72. package/dist/skills/frontend/references/designpowers/vendor/agents/motion-designer.md +120 -0
  73. package/dist/skills/frontend/references/designpowers/vendor/skills/accessible-content/SKILL.md +101 -0
  74. package/dist/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/SKILL.md +109 -0
  75. package/dist/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/SKILL.md +107 -0
  76. package/dist/skills/frontend/references/designpowers/vendor/skills/design-debate/SKILL.md +199 -0
  77. package/dist/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/SKILL.md +174 -0
  78. package/dist/skills/frontend/references/designpowers/vendor/skills/design-handoff/SKILL.md +125 -0
  79. package/dist/skills/frontend/references/designpowers/vendor/skills/design-md/SKILL.md +106 -0
  80. package/dist/skills/frontend/references/designpowers/vendor/skills/design-retrospective/SKILL.md +266 -0
  81. package/dist/skills/frontend/references/designpowers/vendor/skills/design-review/SKILL.md +123 -0
  82. package/dist/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/SKILL.md +120 -0
  83. package/dist/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/SKILL.md +164 -0
  84. package/dist/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/SKILL.md +85 -0
  85. package/dist/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/SKILL.md +98 -0
  86. package/dist/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/SKILL.md +165 -0
  87. package/dist/skills/frontend/references/designpowers/vendor/skills/interaction-design/SKILL.md +122 -0
  88. package/dist/skills/frontend/references/designpowers/vendor/skills/motion-choreography/SKILL.md +81 -0
  89. package/dist/skills/frontend/references/designpowers/vendor/skills/research-planning/SKILL.md +96 -0
  90. package/dist/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/SKILL.md +77 -0
  91. package/dist/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/SKILL.md +192 -0
  92. package/dist/skills/frontend/references/designpowers/vendor/skills/taste-feedback/SKILL.md +165 -0
  93. package/dist/skills/frontend/references/designpowers/vendor/skills/taste-report/SKILL.md +78 -0
  94. package/dist/skills/frontend/references/designpowers/vendor/skills/token-architecture/SKILL.md +75 -0
  95. package/dist/skills/frontend/references/designpowers/vendor/skills/ui-composition/SKILL.md +117 -0
  96. package/dist/skills/frontend/references/designpowers/vendor/skills/usability-testing/SKILL.md +78 -0
  97. package/dist/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/SKILL.md +125 -0
  98. package/dist/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/SKILL.md +79 -0
  99. package/dist/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/SKILL.md +119 -0
  100. package/dist/skills/frontend/references/ui-ux-db/scripts/core.py +0 -0
  101. package/dist/skills/git-master/SKILL.md +4 -0
  102. package/dist/skills/review-work/SKILL.md +3 -3
  103. package/dist/skills/start-work/SKILL.md +7 -5
  104. package/dist/skills/ultraresearch/SKILL.md +4 -252
  105. package/dist/skills/ulw-plan/SKILL.md +8 -6
  106. package/dist/skills/ulw-plan/references/full-workflow.md +11 -6
  107. package/dist/skills/ulw-plan/references/intent-clear.md +3 -3
  108. package/dist/skills/ulw-plan/references/intent-unclear.md +1 -1
  109. package/dist/skills/{ultraresearch → ulw-research}/ATTRIBUTION.md +1 -1
  110. package/dist/skills/ulw-research/SKILL.md +260 -0
  111. package/dist/skills/visual-qa/SKILL.md +105 -14
  112. package/dist/skills/visual-qa/scripts/skill-prompt-contract.test.ts +120 -1
  113. package/dist/testing/create-plugin-module.d.ts +2 -0
  114. package/dist/tui.js +23917 -16117
  115. package/docs/reference/github-attachment-upload.md +51 -0
  116. package/docs/reference/web-terminal-visual-qa.md +81 -0
  117. package/package.json +20 -14
  118. package/packages/lsp-core/src/lsp/process.ts +4 -1
  119. package/packages/lsp-core/src/mcp.ts +1 -0
  120. package/packages/lsp-daemon/dist/cli.js +5 -1
  121. package/packages/lsp-daemon/dist/index.js +5 -1
  122. package/packages/lsp-daemon/dist/proxy.js +1 -0
  123. package/packages/lsp-tools-mcp/dist/cli.js +5 -1
  124. package/packages/lsp-tools-mcp/dist/lsp/manager.js +4 -1
  125. package/packages/lsp-tools-mcp/dist/mcp.js +5 -1
  126. package/packages/lsp-tools-mcp/dist/tools.js +4 -1
  127. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  128. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +323 -62
  129. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  130. package/packages/omo-codex/plugin/components/bootstrap/scripts/bootstrap.ps1 +37 -68
  131. package/packages/omo-codex/plugin/components/bootstrap/scripts/node-dispatch.ps1 +75 -0
  132. package/packages/omo-codex/plugin/components/bootstrap/src/cli.ts +1 -1
  133. package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +2 -18
  134. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +575 -334
  135. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +204 -39
  136. package/packages/omo-codex/plugin/components/codegraph/package.json +2 -2
  137. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +7 -1
  138. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +103 -3
  139. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +114 -0
  140. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +29 -0
  141. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +31 -57
  142. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +7 -4
  143. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +43 -9
  144. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +146 -0
  145. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +12 -7
  146. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +71 -1
  147. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  148. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  149. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  150. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +4 -1
  151. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  152. package/packages/omo-codex/plugin/components/rules/dist/cli.js +2 -2
  153. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  154. package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +2 -2
  155. package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +11 -2
  156. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +6 -6
  157. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  158. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +23 -0
  159. package/packages/omo-codex/plugin/components/teammode/dist/cli.js +22 -4
  160. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  161. package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +40 -2
  162. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-guide.mjs +32 -5
  163. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +7 -3
  164. package/packages/omo-codex/plugin/components/teammode/src/codex-hook.ts +19 -4
  165. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +32 -2
  166. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  167. package/packages/omo-codex/plugin/components/ultrawork/README.md +1 -1
  168. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
  169. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
  170. package/packages/omo-codex/plugin/components/ultrawork/directive.md +23 -7
  171. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +1 -1
  172. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  173. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +6 -4
  174. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +11 -6
  175. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +3 -3
  176. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +1 -1
  177. package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +1 -1
  178. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +24 -0
  179. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +6 -1
  180. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
  181. package/packages/omo-codex/plugin/components/ulw-loop/README.md +25 -21
  182. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +1 -1
  183. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +381 -0
  184. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +14 -1
  185. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +145 -14
  186. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.d.ts +6 -3
  187. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +16 -6
  188. package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.d.ts +5 -0
  189. package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.js +104 -0
  190. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +1 -1
  191. package/packages/omo-codex/plugin/components/ulw-loop/package.json +2 -1
  192. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +19 -11
  193. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +14 -1
  194. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +4 -2
  195. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +28 -6
  196. package/packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-directive.ts +113 -0
  197. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +33 -2
  198. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-kind-guidance.test.ts +31 -0
  199. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +13 -0
  200. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +36 -0
  201. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +12 -0
  202. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +64 -0
  203. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +2 -1
  204. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +2 -1
  205. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +2 -1
  206. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +2 -1
  207. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +2 -1
  208. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +2 -1
  209. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +2 -1
  210. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +2 -1
  211. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +2 -1
  212. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +2 -1
  213. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +2 -1
  214. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +2 -1
  215. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +2 -1
  216. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +2 -1
  217. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +2 -1
  218. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +2 -1
  219. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +2 -1
  220. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +2 -1
  221. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +2 -1
  222. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +2 -1
  223. package/packages/omo-codex/plugin/package-lock.json +13 -13
  224. package/packages/omo-codex/plugin/package.json +1 -1
  225. package/packages/omo-codex/plugin/scripts/auto-update.mjs +9 -5
  226. package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +1 -0
  227. package/packages/omo-codex/plugin/scripts/migrate-codex-config/context7-placeholder-guard.mjs +131 -0
  228. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-mode-guard.mjs +60 -0
  229. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +3 -10
  230. package/packages/omo-codex/plugin/scripts/migrate-codex-config/root-settings.mjs +31 -1
  231. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +73 -0
  232. package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +20 -3
  233. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +30 -8
  234. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +128 -0
  235. package/packages/omo-codex/plugin/skills/coding-agent-sessions/agents/openai.yaml +4 -0
  236. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +71 -0
  237. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/claude.md +32 -0
  238. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/codex.md +30 -0
  239. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/opencode.md +43 -0
  240. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +17 -0
  241. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/__init__.py +1 -0
  242. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/claude.py +66 -0
  243. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +283 -0
  244. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/codex.py +105 -0
  245. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +275 -0
  246. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/jsonio.py +55 -0
  247. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/kiro_scanner.py +91 -0
  248. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/opencode.py +289 -0
  249. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +92 -0
  250. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_optional_scanners.py +203 -0
  251. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_scanners.py +177 -0
  252. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/timeparse.py +51 -0
  253. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +149 -0
  254. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/types.py +57 -0
  255. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/find-agent-sessions.py +19 -0
  256. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +52 -8
  257. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +29 -8
  258. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +29 -12
  259. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +3 -3
  260. package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +22 -19
  261. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/EVIDENCE.md +89 -0
  262. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +48 -0
  263. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/UPSTREAM.md +80 -0
  264. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +64 -0
  265. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +65 -0
  266. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-c-review.md +65 -0
  267. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +83 -0
  268. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +80 -0
  269. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +79 -0
  270. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/LICENSE +21 -0
  271. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
  272. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/content-writer.md +132 -0
  273. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-builder.md +109 -0
  274. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-critic.md +89 -0
  275. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-lead.md +113 -0
  276. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-scout.md +78 -0
  277. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-strategist.md +121 -0
  278. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
  279. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
  280. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/motion-designer.md +120 -0
  281. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/accessible-content/SKILL.md +101 -0
  282. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/SKILL.md +109 -0
  283. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/SKILL.md +107 -0
  284. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debate/SKILL.md +199 -0
  285. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/SKILL.md +174 -0
  286. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-handoff/SKILL.md +125 -0
  287. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-md/SKILL.md +106 -0
  288. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-retrospective/SKILL.md +266 -0
  289. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-review/SKILL.md +123 -0
  290. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/SKILL.md +120 -0
  291. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/SKILL.md +164 -0
  292. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/SKILL.md +85 -0
  293. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/SKILL.md +98 -0
  294. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/SKILL.md +165 -0
  295. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/interaction-design/SKILL.md +122 -0
  296. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/motion-choreography/SKILL.md +81 -0
  297. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/research-planning/SKILL.md +96 -0
  298. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/SKILL.md +77 -0
  299. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/SKILL.md +192 -0
  300. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-feedback/SKILL.md +165 -0
  301. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-report/SKILL.md +78 -0
  302. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/token-architecture/SKILL.md +75 -0
  303. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/ui-composition/SKILL.md +117 -0
  304. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/usability-testing/SKILL.md +78 -0
  305. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/SKILL.md +125 -0
  306. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/SKILL.md +79 -0
  307. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/SKILL.md +119 -0
  308. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/core.py +0 -0
  309. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +4 -0
  310. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +4 -0
  311. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +4 -0
  312. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +4 -0
  313. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +12 -4
  314. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +14 -8
  315. package/packages/omo-codex/plugin/skills/teammode/SKILL.md +40 -2
  316. package/packages/omo-codex/plugin/skills/teammode/scripts/team-guide.mjs +32 -5
  317. package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +7 -3
  318. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +4 -250
  319. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +19 -11
  320. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -4
  321. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +11 -6
  322. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +3 -3
  323. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +1 -1
  324. package/packages/{shared-skills/skills/ultraresearch → omo-codex/plugin/skills/ulw-research}/ATTRIBUTION.md +1 -1
  325. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +262 -0
  326. package/packages/omo-codex/plugin/skills/ulw-research/agents/openai.yaml +2 -0
  327. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +109 -14
  328. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +23 -0
  329. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -0
  330. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +1 -0
  331. package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +24 -1
  332. package/packages/omo-codex/plugin/test/bootstrap-binlinks.test.mjs +23 -5
  333. package/packages/omo-codex/plugin/test/bootstrap-hooks.test.mjs +38 -0
  334. package/packages/omo-codex/plugin/test/bootstrap-ps-guard.test.mjs +25 -0
  335. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +1 -7
  336. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +206 -6
  337. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +44 -0
  338. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +50 -1
  339. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +10 -7
  340. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +28 -2
  341. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +20 -0
  342. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +117 -0
  343. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +5 -2
  344. package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +285 -0
  345. package/packages/omo-codex/scripts/install-bin-links.test.mjs +6 -1
  346. package/packages/omo-codex/scripts/install-cache-copy.test.mjs +51 -0
  347. package/packages/omo-codex/scripts/install-config.test.mjs +198 -17
  348. package/packages/omo-codex/scripts/install-dist/install-local.mjs +701 -282
  349. package/packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs +24 -15
  350. package/packages/omo-codex/scripts/install-local.test.mjs +5 -1
  351. package/packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs +84 -0
  352. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +128 -0
  353. package/packages/shared-skills/skills/coding-agent-sessions/agents/openai.yaml +4 -0
  354. package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +71 -0
  355. package/packages/shared-skills/skills/coding-agent-sessions/references/claude.md +32 -0
  356. package/packages/shared-skills/skills/coding-agent-sessions/references/codex.md +30 -0
  357. package/packages/shared-skills/skills/coding-agent-sessions/references/opencode.md +43 -0
  358. package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +17 -0
  359. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/__init__.py +1 -0
  360. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/claude.py +66 -0
  361. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +283 -0
  362. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/codex.py +105 -0
  363. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +275 -0
  364. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/jsonio.py +55 -0
  365. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/kiro_scanner.py +91 -0
  366. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/opencode.py +289 -0
  367. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +92 -0
  368. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_optional_scanners.py +203 -0
  369. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_scanners.py +177 -0
  370. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/timeparse.py +51 -0
  371. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +149 -0
  372. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/types.py +57 -0
  373. package/packages/shared-skills/skills/coding-agent-sessions/scripts/find-agent-sessions.py +19 -0
  374. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +52 -8
  375. package/packages/shared-skills/skills/frontend/SKILL.md +29 -8
  376. package/packages/shared-skills/skills/frontend/references/design/README.md +29 -12
  377. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +3 -3
  378. package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +22 -19
  379. package/packages/shared-skills/skills/frontend/references/designpowers/EVIDENCE.md +89 -0
  380. package/packages/shared-skills/skills/frontend/references/designpowers/README.md +48 -0
  381. package/packages/shared-skills/skills/frontend/references/designpowers/UPSTREAM.md +80 -0
  382. package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +64 -0
  383. package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +65 -0
  384. package/packages/shared-skills/skills/frontend/references/designpowers/lane-c-review.md +65 -0
  385. package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +83 -0
  386. package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +80 -0
  387. package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +79 -0
  388. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/LICENSE +21 -0
  389. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
  390. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/content-writer.md +132 -0
  391. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-builder.md +109 -0
  392. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-critic.md +89 -0
  393. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-lead.md +113 -0
  394. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-scout.md +78 -0
  395. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-strategist.md +121 -0
  396. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
  397. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
  398. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/motion-designer.md +120 -0
  399. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/accessible-content/SKILL.md +101 -0
  400. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/SKILL.md +109 -0
  401. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/SKILL.md +107 -0
  402. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debate/SKILL.md +199 -0
  403. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/SKILL.md +174 -0
  404. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-handoff/SKILL.md +125 -0
  405. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-md/SKILL.md +106 -0
  406. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-retrospective/SKILL.md +266 -0
  407. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-review/SKILL.md +123 -0
  408. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/SKILL.md +120 -0
  409. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/SKILL.md +164 -0
  410. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/SKILL.md +85 -0
  411. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/SKILL.md +98 -0
  412. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/SKILL.md +165 -0
  413. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/interaction-design/SKILL.md +122 -0
  414. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/motion-choreography/SKILL.md +81 -0
  415. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/research-planning/SKILL.md +96 -0
  416. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/SKILL.md +77 -0
  417. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/SKILL.md +192 -0
  418. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-feedback/SKILL.md +165 -0
  419. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-report/SKILL.md +78 -0
  420. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/token-architecture/SKILL.md +75 -0
  421. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/ui-composition/SKILL.md +117 -0
  422. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/usability-testing/SKILL.md +78 -0
  423. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/SKILL.md +125 -0
  424. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/SKILL.md +79 -0
  425. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/SKILL.md +119 -0
  426. package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/core.py +0 -0
  427. package/packages/shared-skills/skills/git-master/SKILL.md +4 -0
  428. package/packages/shared-skills/skills/review-work/SKILL.md +3 -3
  429. package/packages/shared-skills/skills/start-work/SKILL.md +7 -5
  430. package/packages/shared-skills/skills/ultraresearch/SKILL.md +4 -252
  431. package/packages/shared-skills/skills/ulw-plan/SKILL.md +8 -6
  432. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +11 -6
  433. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +3 -3
  434. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +1 -1
  435. package/packages/{omo-codex/plugin/skills/ultraresearch → shared-skills/skills/ulw-research}/ATTRIBUTION.md +1 -1
  436. package/packages/shared-skills/skills/ulw-research/SKILL.md +260 -0
  437. package/packages/shared-skills/skills/visual-qa/SKILL.md +105 -14
  438. package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +120 -1
  439. package/script/qa/web-terminal-redaction.d.mts +13 -0
  440. package/script/qa/web-terminal-redaction.mjs +43 -0
  441. package/script/qa/web-terminal-renderer.mjs +218 -0
  442. package/script/qa/web-terminal-visual-qa.mjs +264 -0
  443. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +0 -110
  444. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +0 -245
  445. package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +0 -204
@@ -1,110 +0,0 @@
1
- #!/usr/bin/env python3
2
- from __future__ import annotations
3
-
4
- import shutil
5
- import sqlite3
6
- import sys
7
- import tempfile
8
- import unittest
9
- from collections.abc import Callable
10
- from pathlib import Path
11
-
12
- sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
13
-
14
- from extract_cookies import extract_cookies # noqa: E402
15
-
16
-
17
- def _make_chromium_db(path: Path, rows: list[tuple[str, bytes, str]]) -> None:
18
- conn = sqlite3.connect(str(path))
19
- conn.execute(
20
- "CREATE TABLE cookies (name TEXT, encrypted_value BLOB, host_key TEXT, path TEXT, "
21
- "expires_utc INTEGER, is_secure INTEGER, is_httponly INTEGER, samesite INTEGER)"
22
- )
23
- conn.executemany(
24
- "INSERT INTO cookies VALUES (?,?,?,?,?,?,?,?)",
25
- [
26
- (name, value, host, "/", 13_300_000_000_000_000, 1, 1, 1)
27
- for name, value, host in rows
28
- ],
29
- )
30
- conn.commit()
31
- conn.close()
32
-
33
-
34
- def _make_firefox_db(path: Path, rows: list[tuple[str, str, str]]) -> None:
35
- conn = sqlite3.connect(str(path))
36
- conn.execute(
37
- "CREATE TABLE moz_cookies (name TEXT, value TEXT, host TEXT, path TEXT, "
38
- "expiry INTEGER, isSecure INTEGER, isHttpOnly INTEGER, sameSite INTEGER)"
39
- )
40
- conn.executemany(
41
- "INSERT INTO moz_cookies VALUES (?,?,?,?,?,?,?,?)",
42
- [
43
- (name, value, host, "/", 9999999999, 1, 1, 1)
44
- for name, value, host in rows
45
- ],
46
- )
47
- conn.commit()
48
- conn.close()
49
-
50
-
51
- class DomainFilter(unittest.TestCase):
52
- def _base_with_db(self, rel: str, make: Callable[[Path], None]) -> Path:
53
- base = Path(tempfile.mkdtemp())
54
- self.addCleanup(lambda: shutil.rmtree(str(base), ignore_errors=True))
55
- db = base / rel
56
- db.parent.mkdir(parents=True)
57
- make(db)
58
- return base
59
-
60
- def test_chromium_does_not_overmatch_suffix_text(self) -> None:
61
- base = self._base_with_db(
62
- "Google/Chrome/User Data/Default/Cookies",
63
- lambda p: _make_chromium_db(
64
- p,
65
- [
66
- ("exact", b"exact-value", "example.com"),
67
- ("sub", b"sub-value", ".login.example.com"),
68
- ("near", b"near-value", ".example.com"),
69
- ],
70
- ),
71
- )
72
-
73
- near = extract_cookies(
74
- "chrome", ["ample.com"], platform="win32",
75
- keyring_reader=lambda _s: b"k" * 32, base_override=base,
76
- )
77
- exact = extract_cookies(
78
- "chrome", ["example.com"], platform="win32",
79
- keyring_reader=lambda _s: b"k" * 32, base_override=base,
80
- )
81
-
82
- self.assertEqual(near, [])
83
- self.assertEqual({cookie["name"] for cookie in exact}, {"exact", "near", "sub"})
84
-
85
- def test_firefox_does_not_overmatch_suffix_text(self) -> None:
86
- base = self._base_with_db(
87
- "Firefox/Profiles/abc.default/cookies.sqlite",
88
- lambda p: _make_firefox_db(
89
- p,
90
- [
91
- ("exact", "exact-value", "example.com"),
92
- ("sub", "sub-value", ".login.example.com"),
93
- ("near", "near-value", ".example.com"),
94
- ],
95
- ),
96
- )
97
-
98
- near = extract_cookies(
99
- "firefox", ["ample.com"], platform="darwin", base_override=base,
100
- )
101
- exact = extract_cookies(
102
- "firefox", ["example.com"], platform="darwin", base_override=base,
103
- )
104
-
105
- self.assertEqual(near, [])
106
- self.assertEqual({cookie["name"] for cookie in exact}, {"exact", "near", "sub"})
107
-
108
-
109
- if __name__ == "__main__":
110
- unittest.main(verbosity=2)
@@ -1,245 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Synthetic-fixture tests for cross-platform cookie extraction (no live browser)."""
3
- from __future__ import annotations
4
-
5
- import shutil
6
- import sqlite3
7
- import sys
8
- import tempfile
9
- import unittest
10
- from pathlib import Path
11
- from typing import Callable
12
- from unittest.mock import patch
13
-
14
- sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
15
-
16
- from cookie_crypto import decrypt_chromium_value, derive_key # noqa: E402
17
- from cookie_paths import UnsupportedPlatform, resolve_cookie_db # noqa: E402
18
- from extract_cookies import extract_cookies, inject_cookies, write_cookie_file # noqa: E402
19
-
20
-
21
- def _make_chromium_db(path: Path, name: str, encrypted_value: bytes, host: str) -> None:
22
- conn = sqlite3.connect(str(path))
23
- conn.execute(
24
- "CREATE TABLE cookies (name TEXT, encrypted_value BLOB, host_key TEXT, path TEXT, "
25
- "expires_utc INTEGER, is_secure INTEGER, is_httponly INTEGER, samesite INTEGER)"
26
- )
27
- conn.execute(
28
- "INSERT INTO cookies VALUES (?,?,?,?,?,?,?,?)",
29
- (name, encrypted_value, host, "/", 13_300_000_000_000_000, 1, 1, 1),
30
- )
31
- conn.commit()
32
- conn.close()
33
-
34
-
35
- def _make_firefox_db(path: Path, name: str, value: str, host: str) -> None:
36
- conn = sqlite3.connect(str(path))
37
- conn.execute(
38
- "CREATE TABLE moz_cookies (name TEXT, value TEXT, host TEXT, path TEXT, "
39
- "expiry INTEGER, isSecure INTEGER, isHttpOnly INTEGER, sameSite INTEGER)"
40
- )
41
- conn.execute("INSERT INTO moz_cookies VALUES (?,?,?,?,?,?,?,?)", (name, value, host, "/", 9999999999, 1, 1, 1))
42
- conn.commit()
43
- conn.close()
44
-
45
-
46
- def _encrypt_cbc_v10(key: bytes, plaintext: str) -> bytes:
47
- from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
48
-
49
- data = plaintext.encode()
50
- pad = 16 - (len(data) % 16)
51
- padded = data + bytes([pad]) * pad
52
- encryptor = Cipher(algorithms.AES128(key), modes.CBC(b" " * 16)).encryptor()
53
- return b"v10" + encryptor.update(padded) + encryptor.finalize()
54
-
55
-
56
- def _encrypt_gcm_v10(key: bytes, plaintext: str) -> bytes:
57
- from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
58
-
59
- nonce = b"n" * 12
60
- encryptor = Cipher(algorithms.AES(key), modes.GCM(nonce)).encryptor()
61
- ciphertext = encryptor.update(plaintext.encode()) + encryptor.finalize()
62
- return b"v10" + nonce + ciphertext + encryptor.tag
63
-
64
-
65
- class PathResolution(unittest.TestCase):
66
- def test_macos_chromium_path(self) -> None:
67
- base = Path(self.tmp())
68
- target = base / "Google/Chrome/Default/Cookies"
69
- target.parent.mkdir(parents=True)
70
- target.write_bytes(b"")
71
- self.assertEqual(resolve_cookie_db("chrome", "darwin", base_override=base), target)
72
-
73
- def test_linux_chromium_network_path(self) -> None:
74
- base = Path(self.tmp())
75
- target = base / "google-chrome/Default/Network/Cookies"
76
- target.parent.mkdir(parents=True)
77
- target.write_bytes(b"")
78
- self.assertEqual(resolve_cookie_db("chrome", "linux", base_override=base), target)
79
-
80
- def test_windows_chromium_path(self) -> None:
81
- base = Path(self.tmp())
82
- target = base / "Google/Chrome/User Data/Default/Cookies"
83
- target.parent.mkdir(parents=True)
84
- target.write_bytes(b"")
85
- self.assertEqual(resolve_cookie_db("chrome", "win32", base_override=base), target)
86
-
87
- def test_unsupported_platform_raises(self) -> None:
88
- with self.assertRaises(UnsupportedPlatform):
89
- resolve_cookie_db("chrome", "sunos")
90
-
91
- def test_unsupported_browser_raises(self) -> None:
92
- with self.assertRaises(UnsupportedPlatform):
93
- resolve_cookie_db("nonexistent", "darwin")
94
-
95
- def tmp(self) -> str:
96
- import tempfile
97
-
98
- d = tempfile.mkdtemp()
99
- self.addCleanup(lambda: __import__("shutil").rmtree(d, ignore_errors=True))
100
- return d
101
-
102
-
103
- class KeyDerivation(unittest.TestCase):
104
- def test_macos_iters_differ_from_linux(self) -> None:
105
- secret = b"some-keychain-secret"
106
- self.assertNotEqual(derive_key("darwin", secret), derive_key("linux", secret))
107
- self.assertEqual(len(derive_key("darwin", secret)), 16)
108
-
109
- def test_windows_passthrough_32_bytes(self) -> None:
110
- key = b"k" * 32
111
- self.assertEqual(derive_key("win32", key), key)
112
-
113
- def test_windows_rejects_wrong_length(self) -> None:
114
- with self.assertRaises(ValueError):
115
- derive_key("win32", b"short")
116
-
117
- def test_unsupported_platform_raises(self) -> None:
118
- with self.assertRaises(UnsupportedPlatform):
119
- derive_key("sunos", b"x")
120
-
121
-
122
- class Decryption(unittest.TestCase):
123
- def test_macos_cbc_roundtrip(self) -> None:
124
- key = derive_key("darwin", b"secret")
125
- blob = _encrypt_cbc_v10(key, "session-token-123")
126
- self.assertEqual(decrypt_chromium_value("darwin", key, blob), "session-token-123")
127
-
128
- def test_windows_gcm_roundtrip(self) -> None:
129
- key = b"k" * 32
130
- blob = _encrypt_gcm_v10(key, "win-token-xyz")
131
- self.assertEqual(decrypt_chromium_value("win32", key, blob), "win-token-xyz")
132
-
133
-
134
- class EndToEnd(unittest.TestCase):
135
- def _base_with_db(self, rel: str, make: Callable[[Path], None]) -> Path:
136
- base = Path(tempfile.mkdtemp())
137
- self.addCleanup(lambda: shutil.rmtree(str(base), ignore_errors=True))
138
- db = base / rel
139
- db.parent.mkdir(parents=True)
140
- make(db)
141
- return base
142
-
143
- def test_chromium_extract_with_injected_keyring(self) -> None:
144
- key = derive_key("darwin", b"secret")
145
- blob = _encrypt_cbc_v10(key, "logged-in")
146
- base = self._base_with_db(
147
- "Google/Chrome/Default/Cookies",
148
- lambda p: _make_chromium_db(p, "SID", blob, ".youtube.com"),
149
- )
150
- cookies = extract_cookies(
151
- "chrome", ["youtube.com"], platform="darwin",
152
- keyring_reader=lambda _s: b"secret", base_override=base,
153
- )
154
- self.assertEqual(len(cookies), 1)
155
- self.assertEqual(cookies[0]["value"], "logged-in")
156
- self.assertEqual(cookies[0]["name"], "SID")
157
-
158
- def test_firefox_extract_unencrypted(self) -> None:
159
- base = self._base_with_db(
160
- "Firefox/Profiles/abc.default/cookies.sqlite",
161
- lambda p: _make_firefox_db(p, "auth", "plain-value", ".example.com"),
162
- )
163
- cookies = extract_cookies("firefox", ["example.com"], platform="darwin", base_override=base)
164
- self.assertEqual(len(cookies), 1)
165
- self.assertEqual(cookies[0]["value"], "plain-value")
166
-
167
-
168
- class SecretHandling(unittest.TestCase):
169
- def test_cookie_output_file_is_owner_only(self) -> None:
170
- base = Path(tempfile.mkdtemp())
171
- self.addCleanup(lambda: shutil.rmtree(str(base), ignore_errors=True))
172
- output = base / "cookies.json"
173
-
174
- write_cookie_file(output, [{"name": "SID", "value": "secret"}])
175
-
176
- self.assertEqual(output.stat().st_mode & 0o777, 0o600)
177
- self.assertIn("secret", output.read_text())
178
-
179
- def test_cookie_output_replaces_existing_file_only_after_private_temp_write(self) -> None:
180
- base = Path(tempfile.mkdtemp())
181
- self.addCleanup(lambda: shutil.rmtree(str(base), ignore_errors=True))
182
- output = base / "cookies.json"
183
- output.write_text("old\n")
184
- output.chmod(0o644)
185
-
186
- def _dump(_cookies, f, indent: int) -> None:
187
- self.assertEqual(output.read_text(), "old\n")
188
- self.assertEqual(output.stat().st_mode & 0o777, 0o644)
189
- temp_files = list(base.glob(".cookies.json.*.tmp"))
190
- self.assertEqual(len(temp_files), 1)
191
- self.assertEqual(temp_files[0].stat().st_mode & 0o777, 0o600)
192
- f.write('[{"name": "SID", "value": "secret"}]')
193
-
194
- with patch("extract_cookies.json.dump", side_effect=_dump):
195
- write_cookie_file(output, [{"name": "SID", "value": "secret"}])
196
-
197
- self.assertEqual(output.stat().st_mode & 0o777, 0o600)
198
- self.assertIn("secret", output.read_text())
199
-
200
- def test_cookie_output_refuses_symlinks(self) -> None:
201
- base = Path(tempfile.mkdtemp())
202
- self.addCleanup(lambda: shutil.rmtree(str(base), ignore_errors=True))
203
- target = base / "target.json"
204
- target.write_text("{}")
205
- link = base / "cookies.json"
206
- link.symlink_to(target)
207
-
208
- with self.assertRaises(ValueError):
209
- write_cookie_file(link, [{"name": "SID", "value": "secret"}])
210
-
211
- def test_cookie_output_refuses_dangling_symlinks(self) -> None:
212
- base = Path(tempfile.mkdtemp())
213
- self.addCleanup(lambda: shutil.rmtree(str(base), ignore_errors=True))
214
- link = base / "cookies.json"
215
- link.symlink_to(base / "missing.json")
216
-
217
- with self.assertRaises(ValueError):
218
- write_cookie_file(link, [{"name": "SID", "value": "secret"}])
219
-
220
- def test_inject_cookies_sends_values_over_stdin_not_argv(self) -> None:
221
- cookie = {
222
- "name": "SID",
223
- "value": "secret-token",
224
- "domain": ".youtube.com",
225
- "path": "/",
226
- "expires": 9999999999,
227
- "secure": True,
228
- "httpOnly": True,
229
- "sameSite": "Lax",
230
- }
231
-
232
- with patch("extract_cookies.subprocess.run") as run:
233
- run.return_value.returncode = 0
234
- run.return_value.stdout = "1"
235
- run.return_value.stderr = ""
236
-
237
- inject_cookies([cookie], 9242)
238
-
239
- command = run.call_args.args[0]
240
- self.assertNotIn("secret-token", command)
241
- self.assertIn("secret-token", run.call_args.kwargs["input"])
242
-
243
-
244
- if __name__ == "__main__":
245
- unittest.main(verbosity=2)
@@ -1,204 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import { readFile } from "node:fs/promises";
3
- import { dirname, join } from "node:path";
4
- import test from "node:test";
5
- import { fileURLToPath } from "node:url";
6
- import { sharedSkillsRootPath } from "@oh-my-opencode/shared-skills";
7
-
8
- const root = dirname(dirname(fileURLToPath(import.meta.url)));
9
-
10
- async function readUltraresearchCopies() {
11
- const sharedPath = join(sharedSkillsRootPath(), "ultraresearch", "SKILL.md");
12
- const packagedPath = join(root, "skills", "ultraresearch", "SKILL.md");
13
- return [
14
- { label: "shared", path: sharedPath, content: await readFile(sharedPath, "utf8") },
15
- { label: "packaged", path: packagedPath, content: await readFile(packagedPath, "utf8") },
16
- ];
17
- }
18
-
19
- function frontmatterDescription(content) {
20
- const match = content.match(/^---\r?\n[\s\S]*?\bdescription:\s*"([\s\S]*?)"\r?\n[\s\S]*?---/);
21
- assert.notEqual(match, null, "SKILL.md frontmatter description not found");
22
- return match[1];
23
- }
24
-
25
- test("#given ultraresearch skill #when scanned for non-English content #then it contains no Hangul", async () => {
26
- for (const copy of await readUltraresearchCopies()) {
27
- assert.doesNotMatch(
28
- copy.content,
29
- /[ᄀ-ᇿ㄰-㆏가-힣]/,
30
- `${copy.label} copy contains Hangul characters`,
31
- );
32
- }
33
- });
34
-
35
- test("#given ultraresearch description #when activation policy is inspected #then it gates on explicit research demands only", async () => {
36
- for (const copy of await readUltraresearchCopies()) {
37
- const description = frontmatterDescription(copy.content);
38
- assert.match(description, /explicit/i, `${copy.label}: description must gate activation on explicit demand`);
39
- assert.match(
40
- description,
41
- /ultra-precise investigation/i,
42
- `${copy.label}: description must name the ultra-precise investigation trigger`,
43
- );
44
- assert.match(description, /\bresearch\b/i, `${copy.label}: description must name the research trigger`);
45
- }
46
- });
47
-
48
- test("#given ultraresearch body #when authority is inspected #then it takes precedence over exploration-bounding instructions", async () => {
49
- for (const copy of await readUltraresearchCopies()) {
50
- assert.match(
51
- copy.content,
52
- /exploration-bounding|exploration (?:caps|budgets|limits)/i,
53
- `${copy.label}: body must name the exploration-bounding instructions it overrides`,
54
- );
55
- assert.match(
56
- copy.content,
57
- /supersede|override|do(?:es)? not (?:bind|apply)/i,
58
- `${copy.label}: body must state precedence while the mode is active`,
59
- );
60
- }
61
- });
62
-
63
- test("#given ultraresearch worker protocol #when EXPAND flow is inspected #then markers travel as message text and workers never write files", async () => {
64
- for (const copy of await readUltraresearchCopies()) {
65
- assert.match(copy.content, /EXPAND/, `${copy.label}: body must keep the EXPAND marker protocol`);
66
- assert.match(
67
- copy.content,
68
- /(?:reply|message|response) text|end (?:its|the|your) (?:reply|response|final message)/i,
69
- `${copy.label}: EXPAND markers must be returned as message text`,
70
- );
71
- assert.match(
72
- copy.content,
73
- /read-only|cannot write files|never ask (?:a )?worker(?:s)? to write/i,
74
- `${copy.label}: body must state the read-only worker constraint`,
75
- );
76
- assert.doesNotMatch(
77
- copy.content,
78
- /APPEND (?:your )?findings to \$SESSION_DIR/i,
79
- `${copy.label}: workers must not be instructed to append session-dir files`,
80
- );
81
- }
82
- });
83
-
84
- test("#given ultraresearch journaling #when ownership is inspected #then the orchestrator owns the session journal", async () => {
85
- for (const copy of await readUltraresearchCopies()) {
86
- assert.match(
87
- copy.content,
88
- /orchestrator[\s\S]{0,200}journal|journal[\s\S]{0,200}orchestrator/i,
89
- `${copy.label}: body must assign session-journal writes to the orchestrator`,
90
- );
91
- assert.match(copy.content, /SESSION_DIR/, `${copy.label}: body must keep the session directory protocol`);
92
- }
93
- });
94
-
95
- test("#given ultraresearch expansion loop #when stop rules are inspected #then convergence rules and a depth cap are stated", async () => {
96
- for (const copy of await readUltraresearchCopies()) {
97
- assert.match(copy.content, /converg/i, `${copy.label}: body must define convergence`);
98
- assert.match(copy.content, /depth/i, `${copy.label}: body must define an expansion depth cap`);
99
- assert.match(
100
- copy.content,
101
- /minimum (?:of )?(?:2|two) expansion waves|at least (?:2|two) expansion waves/i,
102
- `${copy.label}: body must require a minimum of two expansion waves before convergence`,
103
- );
104
- }
105
- });
106
-
107
- test("#given ultraresearch under ultrawork #when coexistence is inspected #then marker and done-definition conflicts are resolved", async () => {
108
- for (const copy of await readUltraresearchCopies()) {
109
- assert.match(copy.content, /ultrawork|\bulw\b/i, `${copy.label}: body must address ultrawork coexistence`);
110
- assert.match(
111
- copy.content,
112
- /first(?:-| )line/i,
113
- `${copy.label}: body must resolve the first-line activation marker conflict`,
114
- );
115
- }
116
- });
117
-
118
- test("#given ultraresearch worker sizing #when spawn guidance is inspected #then capable-model and high-effort routing is stated", async () => {
119
- for (const copy of await readUltraresearchCopies()) {
120
- assert.match(
121
- copy.content,
122
- /capable model|high(?:est)? (?:reasoning )?effort/i,
123
- `${copy.label}: body must route research workers to a capable model or high effort`,
124
- );
125
- }
126
- });
127
-
128
- test("#given ultraresearch execution substrate #when team usage is inspected #then it prefers a cooperating team with harness-native team tools", async () => {
129
- for (const copy of await readUltraresearchCopies()) {
130
- assert.match(
131
- copy.content,
132
- /cooperating team/i,
133
- `${copy.label}: body must encourage running the swarm as a cooperating team`,
134
- );
135
- assert.match(copy.content, /\bteammode\b/i, `${copy.label}: body must name the Codex teammode skill`);
136
- assert.match(copy.content, /team_mode/i, `${copy.label}: body must name the OpenCode team_mode path`);
137
- }
138
- });
139
-
140
- test("#given ultraresearch team composition #when member slicing is inspected #then members map to part/ownership/perspective, never job titles", async () => {
141
- for (const copy of await readUltraresearchCopies()) {
142
- assert.match(
143
- copy.content,
144
- /by part, ownership, or perspective/i,
145
- `${copy.label}: body must compose members by part, ownership, or perspective`,
146
- );
147
- assert.match(
148
- copy.content,
149
- /never a job title|not (?:a |by )?job title/i,
150
- `${copy.label}: body must forbid vague job-title members`,
151
- );
152
- }
153
- });
154
-
155
- test("#given ultraresearch team communication #when the raise law is inspected #then members broadcast every lead immediately rather than hoarding", async () => {
156
- for (const copy of await readUltraresearchCopies()) {
157
- assert.match(
158
- copy.content,
159
- /raise law|broadcast every lead/i,
160
- `${copy.label}: body must state the raise/broadcast law`,
161
- );
162
- assert.match(copy.content, /over-communicate/i, `${copy.label}: body must demand over-communication`);
163
- assert.match(
164
- copy.content,
165
- /the (?:moment|instant) it (?:surfaces|appears|lands)/i,
166
- `${copy.label}: body must require raising leads the moment they surface`,
167
- );
168
- assert.match(
169
- copy.content,
170
- /hoard/i,
171
- `${copy.label}: body must reject hoarding leads for a final dump`,
172
- );
173
- }
174
- });
175
-
176
- test("#given ultraresearch non-code verification #when the gate is inspected #then a claim ledger / verified-claims data-flow-lock exists", async () => {
177
- for (const copy of await readUltraresearchCopies()) {
178
- assert.match(
179
- copy.content,
180
- /claim ledger|verified-claims/i,
181
- `${copy.label}: body must define the non-code claim-ledger verification gate`,
182
- );
183
- }
184
- });
185
-
186
- test("#given ultraresearch claim ledger #when ownership is inspected #then workers never write the ledger / verified-claims artifact", async () => {
187
- for (const copy of await readUltraresearchCopies()) {
188
- assert.doesNotMatch(
189
- copy.content,
190
- /worker[^.]*\b(?:write|append|create)s?\b[^.]*(?:ledger|verified-claims)/i,
191
- `${copy.label}: workers must not be instructed to write/append/create the ledger or verified-claims`,
192
- );
193
- }
194
- });
195
-
196
- test("#given ultraresearch blocked sources #when escalation is inspected #then it routes through the ultimate-browsing skill", async () => {
197
- for (const copy of await readUltraresearchCopies()) {
198
- assert.match(
199
- copy.content,
200
- /ultimate-browsing/,
201
- `${copy.label}: body must escalate blocked sources via the ultimate-browsing skill`,
202
- );
203
- }
204
- });