oh-my-opencode 4.13.0 → 4.14.1

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 (516) hide show
  1. package/.agents/skills/codex-qa/SKILL.md +15 -0
  2. package/.agents/skills/codex-qa/references/isolation.md +1 -1
  3. package/.agents/skills/codex-qa/references/logging-debug.md +12 -0
  4. package/.agents/skills/opencode-qa/SKILL.md +17 -0
  5. package/.agents/skills/opencode-qa/references/tui-tmux.md +17 -0
  6. package/.agents/skills/work-with-pr/SKILL.md +18 -10
  7. package/.opencode/skills/work-with-pr/SKILL.md +18 -10
  8. package/README.md +3 -3
  9. package/dist/cli/doctor/checks/telemetry.d.ts +2 -0
  10. package/dist/cli/doctor/framework/constants.d.ts +1 -0
  11. package/dist/cli/doctor/framework/doctor-target.d.ts +1 -1
  12. package/dist/cli/doctor/framework/types.d.ts +2 -0
  13. package/dist/cli/index.js +24779 -17857
  14. package/dist/cli-node/index.js +24779 -17857
  15. package/dist/config/schema/oh-my-opencode-config.d.ts +1 -0
  16. package/dist/features/team-mode/test-support/async-test-helpers.d.ts +19 -0
  17. package/dist/hooks/atlas/final-wave-approval-gate.d.ts +1 -0
  18. package/dist/hooks/atlas/subagent-completion-reminder.d.ts +30 -0
  19. package/dist/hooks/atlas/types.d.ts +2 -0
  20. package/dist/hooks/atlas/verification-reminders.d.ts +3 -0
  21. package/dist/hooks/team-session-events/team-idle-wake-hint.d.ts +1 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.js +43845 -26631
  24. package/dist/mcp/context7.d.ts +9 -8
  25. package/dist/oh-my-opencode.schema.json +4 -0
  26. package/dist/plugin/native-skills.d.ts +9 -0
  27. package/dist/plugin/system-transform.d.ts +1 -1
  28. package/dist/shared/posthog.d.ts +17 -10
  29. package/dist/shared/telemetry-product-identity.d.ts +2 -0
  30. package/dist/skills/coding-agent-sessions/SKILL.md +128 -0
  31. package/dist/skills/coding-agent-sessions/agents/openai.yaml +4 -0
  32. package/dist/skills/coding-agent-sessions/references/all-platforms.md +71 -0
  33. package/dist/skills/coding-agent-sessions/references/claude.md +32 -0
  34. package/dist/skills/coding-agent-sessions/references/codex.md +30 -0
  35. package/dist/skills/coding-agent-sessions/references/opencode.md +43 -0
  36. package/dist/skills/coding-agent-sessions/references/senpi.md +17 -0
  37. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/__init__.py +1 -0
  38. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/claude.py +66 -0
  39. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +283 -0
  40. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/codex.py +105 -0
  41. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +275 -0
  42. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/jsonio.py +55 -0
  43. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/kiro_scanner.py +91 -0
  44. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/opencode.py +289 -0
  45. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +92 -0
  46. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_optional_scanners.py +203 -0
  47. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_scanners.py +177 -0
  48. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/timeparse.py +51 -0
  49. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +149 -0
  50. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/types.py +57 -0
  51. package/dist/skills/coding-agent-sessions/scripts/find-agent-sessions.py +19 -0
  52. package/dist/skills/frontend/ATTRIBUTION.md +52 -8
  53. package/dist/skills/frontend/SKILL.md +29 -8
  54. package/dist/skills/frontend/references/design/README.md +29 -12
  55. package/dist/skills/frontend/references/design/_INDEX.md +3 -3
  56. package/dist/skills/frontend/references/design/design-system-architecture.md +22 -19
  57. package/dist/skills/frontend/references/designpowers/EVIDENCE.md +89 -0
  58. package/dist/skills/frontend/references/designpowers/README.md +48 -0
  59. package/dist/skills/frontend/references/designpowers/UPSTREAM.md +80 -0
  60. package/dist/skills/frontend/references/designpowers/lane-a-direction.md +64 -0
  61. package/dist/skills/frontend/references/designpowers/lane-b-execution.md +65 -0
  62. package/dist/skills/frontend/references/designpowers/lane-c-review.md +65 -0
  63. package/dist/skills/frontend/references/designpowers/lane-d-memory.md +83 -0
  64. package/dist/skills/frontend/references/designpowers/orchestration.md +80 -0
  65. package/dist/skills/frontend/references/designpowers/routing.md +79 -0
  66. package/dist/skills/frontend/references/designpowers/vendor/LICENSE +21 -0
  67. package/dist/skills/frontend/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
  68. package/dist/skills/frontend/references/designpowers/vendor/agents/content-writer.md +132 -0
  69. package/dist/skills/frontend/references/designpowers/vendor/agents/design-builder.md +109 -0
  70. package/dist/skills/frontend/references/designpowers/vendor/agents/design-critic.md +89 -0
  71. package/dist/skills/frontend/references/designpowers/vendor/agents/design-lead.md +113 -0
  72. package/dist/skills/frontend/references/designpowers/vendor/agents/design-scout.md +78 -0
  73. package/dist/skills/frontend/references/designpowers/vendor/agents/design-strategist.md +121 -0
  74. package/dist/skills/frontend/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
  75. package/dist/skills/frontend/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
  76. package/dist/skills/frontend/references/designpowers/vendor/agents/motion-designer.md +120 -0
  77. package/dist/skills/frontend/references/designpowers/vendor/skills/accessible-content/SKILL.md +101 -0
  78. package/dist/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/SKILL.md +109 -0
  79. package/dist/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/SKILL.md +107 -0
  80. package/dist/skills/frontend/references/designpowers/vendor/skills/design-debate/SKILL.md +199 -0
  81. package/dist/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/SKILL.md +174 -0
  82. package/dist/skills/frontend/references/designpowers/vendor/skills/design-handoff/SKILL.md +125 -0
  83. package/dist/skills/frontend/references/designpowers/vendor/skills/design-md/SKILL.md +106 -0
  84. package/dist/skills/frontend/references/designpowers/vendor/skills/design-retrospective/SKILL.md +266 -0
  85. package/dist/skills/frontend/references/designpowers/vendor/skills/design-review/SKILL.md +123 -0
  86. package/dist/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/SKILL.md +120 -0
  87. package/dist/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/SKILL.md +164 -0
  88. package/dist/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/SKILL.md +85 -0
  89. package/dist/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/SKILL.md +98 -0
  90. package/dist/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/SKILL.md +165 -0
  91. package/dist/skills/frontend/references/designpowers/vendor/skills/interaction-design/SKILL.md +122 -0
  92. package/dist/skills/frontend/references/designpowers/vendor/skills/motion-choreography/SKILL.md +81 -0
  93. package/dist/skills/frontend/references/designpowers/vendor/skills/research-planning/SKILL.md +96 -0
  94. package/dist/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/SKILL.md +77 -0
  95. package/dist/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/SKILL.md +192 -0
  96. package/dist/skills/frontend/references/designpowers/vendor/skills/taste-feedback/SKILL.md +165 -0
  97. package/dist/skills/frontend/references/designpowers/vendor/skills/taste-report/SKILL.md +78 -0
  98. package/dist/skills/frontend/references/designpowers/vendor/skills/token-architecture/SKILL.md +75 -0
  99. package/dist/skills/frontend/references/designpowers/vendor/skills/ui-composition/SKILL.md +117 -0
  100. package/dist/skills/frontend/references/designpowers/vendor/skills/usability-testing/SKILL.md +78 -0
  101. package/dist/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/SKILL.md +125 -0
  102. package/dist/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/SKILL.md +79 -0
  103. package/dist/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/SKILL.md +119 -0
  104. package/dist/skills/frontend/references/ui-ux-db/scripts/core.py +0 -0
  105. package/dist/skills/git-master/SKILL.md +4 -0
  106. package/dist/skills/lcx-contribute-bug-fix/SKILL.md +44 -13
  107. package/dist/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
  108. package/dist/skills/lcx-doctor/SKILL.md +48 -13
  109. package/dist/skills/lcx-doctor/agents/openai.yaml +1 -1
  110. package/dist/skills/lcx-report-bug/SKILL.md +44 -13
  111. package/dist/skills/lcx-report-bug/agents/openai.yaml +1 -1
  112. package/dist/skills/review-work/SKILL.md +3 -3
  113. package/dist/skills/start-work/SKILL.md +7 -5
  114. package/dist/skills/ultraresearch/SKILL.md +4 -252
  115. package/dist/skills/ulw-plan/SKILL.md +8 -6
  116. package/dist/skills/ulw-plan/references/full-workflow.md +11 -6
  117. package/dist/skills/ulw-plan/references/intent-clear.md +3 -3
  118. package/dist/skills/ulw-plan/references/intent-unclear.md +1 -1
  119. package/{packages/shared-skills/skills/ultraresearch → dist/skills/ulw-research}/ATTRIBUTION.md +1 -1
  120. package/dist/skills/ulw-research/SKILL.md +260 -0
  121. package/dist/skills/visual-qa/SKILL.md +109 -18
  122. package/dist/skills/visual-qa/references/agent-browser-setup.md +5 -4
  123. package/dist/skills/visual-qa/scripts/cli.test.ts +7 -2
  124. package/dist/skills/visual-qa/scripts/skill-prompt-contract.test.ts +130 -3
  125. package/dist/skills/visual-qa/scripts/visual-qa.mjs +530 -0
  126. package/dist/testing/create-plugin-module.d.ts +2 -0
  127. package/dist/tools/delegate-task/skill-resolver.d.ts +1 -0
  128. package/dist/tools/delegate-task/types.d.ts +2 -0
  129. package/dist/tools/skill/types.d.ts +1 -0
  130. package/dist/tui.js +23917 -16117
  131. package/docs/reference/github-attachment-upload.md +51 -0
  132. package/docs/reference/web-terminal-visual-qa.md +81 -0
  133. package/package.json +33 -14
  134. package/packages/git-bash-mcp/dist/cli.js +2 -0
  135. package/packages/lsp-core/src/lsp/process.ts +4 -1
  136. package/packages/lsp-core/src/mcp.ts +1 -0
  137. package/packages/lsp-daemon/dist/cli.js +20 -5
  138. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +1 -0
  139. package/packages/lsp-daemon/dist/ensure-daemon.js +9 -3
  140. package/packages/lsp-daemon/dist/index.js +20 -5
  141. package/packages/lsp-daemon/dist/paths.d.ts +1 -0
  142. package/packages/lsp-daemon/dist/paths.js +6 -1
  143. package/packages/lsp-daemon/dist/proxy.js +1 -0
  144. package/packages/lsp-tools-mcp/dist/cli.js +5 -1
  145. package/packages/lsp-tools-mcp/dist/lsp/manager.js +4 -1
  146. package/packages/lsp-tools-mcp/dist/mcp.js +5 -1
  147. package/packages/lsp-tools-mcp/dist/tools.js +4 -1
  148. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  149. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +327 -69
  150. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  151. package/packages/omo-codex/plugin/components/bootstrap/scripts/bootstrap.ps1 +37 -68
  152. package/packages/omo-codex/plugin/components/bootstrap/scripts/node-dispatch.ps1 +75 -0
  153. package/packages/omo-codex/plugin/components/bootstrap/src/cli.ts +1 -1
  154. package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +3 -19
  155. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +688 -334
  156. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +317 -39
  157. package/packages/omo-codex/plugin/components/codegraph/package.json +2 -2
  158. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +7 -1
  159. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +103 -3
  160. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +231 -0
  161. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +29 -0
  162. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +31 -57
  163. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +7 -4
  164. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +43 -9
  165. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +287 -0
  166. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +12 -7
  167. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +71 -1
  168. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  169. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  170. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  171. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +94 -26
  172. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.js +2 -0
  173. package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.d.ts +2 -0
  174. package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +56 -0
  175. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  176. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +2 -5
  177. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +2 -0
  178. package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +65 -0
  179. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +6 -1
  180. package/packages/omo-codex/plugin/components/rules/dist/cli.js +8 -106
  181. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  182. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -17
  183. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +6 -6
  184. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  185. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +23 -0
  186. package/packages/omo-codex/plugin/components/teammode/dist/cli.js +22 -4
  187. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  188. package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +57 -7
  189. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-guide.mjs +32 -5
  190. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-state.mjs +63 -1
  191. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +87 -53
  192. package/packages/omo-codex/plugin/components/teammode/src/codex-hook.ts +19 -4
  193. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +32 -2
  194. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  195. package/packages/omo-codex/plugin/components/ultrawork/README.md +1 -1
  196. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
  197. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
  198. package/packages/omo-codex/plugin/components/ultrawork/directive.md +18 -10
  199. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +1 -1
  200. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  201. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +6 -4
  202. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +11 -6
  203. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +3 -3
  204. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +1 -1
  205. package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +1 -1
  206. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +24 -0
  207. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +7 -28
  208. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
  209. package/packages/omo-codex/plugin/components/ulw-loop/README.md +25 -21
  210. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +1 -1
  211. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +373 -0
  212. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +14 -1
  213. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +145 -14
  214. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.d.ts +6 -3
  215. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +16 -6
  216. package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.d.ts +5 -0
  217. package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.js +104 -0
  218. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +1 -1
  219. package/packages/omo-codex/plugin/components/ulw-loop/package.json +5 -2
  220. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +1 -1
  221. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +22 -14
  222. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +14 -1
  223. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +4 -2
  224. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +28 -6
  225. package/packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-directive.ts +113 -0
  226. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +33 -2
  227. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-kind-guidance.test.ts +31 -0
  228. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +13 -0
  229. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/sample-quality-gate.json +7 -7
  230. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +39 -1
  231. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-doc.test.ts +2 -2
  232. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +7 -6
  233. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +12 -0
  234. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +64 -0
  235. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +2 -1
  236. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +2 -1
  237. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +2 -1
  238. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +2 -1
  239. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +2 -1
  240. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +2 -1
  241. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +2 -1
  242. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +2 -1
  243. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +2 -1
  244. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +2 -1
  245. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +2 -1
  246. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +2 -1
  247. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +2 -1
  248. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +2 -1
  249. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +2 -1
  250. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +2 -1
  251. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +2 -1
  252. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +2 -1
  253. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +2 -1
  254. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +2 -1
  255. package/packages/omo-codex/plugin/package-lock.json +16 -56
  256. package/packages/omo-codex/plugin/package.json +1 -1
  257. package/packages/omo-codex/plugin/scripts/auto-update.mjs +9 -5
  258. package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +1 -0
  259. package/packages/omo-codex/plugin/scripts/migrate-codex-config/context7-placeholder-guard.mjs +131 -0
  260. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-mode-guard.mjs +60 -0
  261. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +3 -10
  262. package/packages/omo-codex/plugin/scripts/migrate-codex-config/root-settings.mjs +31 -1
  263. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +73 -0
  264. package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +20 -3
  265. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +30 -8
  266. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +128 -0
  267. package/packages/omo-codex/plugin/skills/coding-agent-sessions/agents/openai.yaml +4 -0
  268. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +71 -0
  269. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/claude.md +32 -0
  270. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/codex.md +30 -0
  271. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/opencode.md +43 -0
  272. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +17 -0
  273. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/__init__.py +1 -0
  274. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/claude.py +66 -0
  275. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +283 -0
  276. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/codex.py +105 -0
  277. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +275 -0
  278. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/jsonio.py +55 -0
  279. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/kiro_scanner.py +91 -0
  280. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/opencode.py +289 -0
  281. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +92 -0
  282. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_optional_scanners.py +203 -0
  283. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_scanners.py +177 -0
  284. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/timeparse.py +51 -0
  285. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +149 -0
  286. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/types.py +57 -0
  287. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/find-agent-sessions.py +19 -0
  288. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +52 -8
  289. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +29 -8
  290. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +29 -12
  291. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +3 -3
  292. package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +22 -19
  293. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/EVIDENCE.md +89 -0
  294. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +48 -0
  295. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/UPSTREAM.md +80 -0
  296. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +64 -0
  297. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +65 -0
  298. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-c-review.md +65 -0
  299. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +83 -0
  300. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +80 -0
  301. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +79 -0
  302. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/LICENSE +21 -0
  303. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
  304. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/content-writer.md +132 -0
  305. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-builder.md +109 -0
  306. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-critic.md +89 -0
  307. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-lead.md +113 -0
  308. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-scout.md +78 -0
  309. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-strategist.md +121 -0
  310. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
  311. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
  312. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/motion-designer.md +120 -0
  313. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/accessible-content/SKILL.md +101 -0
  314. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/SKILL.md +109 -0
  315. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/SKILL.md +107 -0
  316. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debate/SKILL.md +199 -0
  317. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/SKILL.md +174 -0
  318. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-handoff/SKILL.md +125 -0
  319. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-md/SKILL.md +106 -0
  320. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-retrospective/SKILL.md +266 -0
  321. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-review/SKILL.md +123 -0
  322. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/SKILL.md +120 -0
  323. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/SKILL.md +164 -0
  324. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/SKILL.md +85 -0
  325. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/SKILL.md +98 -0
  326. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/SKILL.md +165 -0
  327. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/interaction-design/SKILL.md +122 -0
  328. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/motion-choreography/SKILL.md +81 -0
  329. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/research-planning/SKILL.md +96 -0
  330. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/SKILL.md +77 -0
  331. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/SKILL.md +192 -0
  332. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-feedback/SKILL.md +165 -0
  333. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-report/SKILL.md +78 -0
  334. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/token-architecture/SKILL.md +75 -0
  335. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/ui-composition/SKILL.md +117 -0
  336. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/usability-testing/SKILL.md +78 -0
  337. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/SKILL.md +125 -0
  338. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/SKILL.md +79 -0
  339. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/SKILL.md +119 -0
  340. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/core.py +0 -0
  341. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +4 -0
  342. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +4 -0
  343. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +44 -13
  344. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
  345. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +48 -13
  346. package/packages/omo-codex/plugin/skills/lcx-doctor/agents/openai.yaml +1 -1
  347. package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +44 -13
  348. package/packages/omo-codex/plugin/skills/lcx-report-bug/agents/openai.yaml +1 -1
  349. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +4 -0
  350. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +4 -0
  351. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +12 -4
  352. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +14 -8
  353. package/packages/omo-codex/plugin/skills/teammode/SKILL.md +57 -7
  354. package/packages/omo-codex/plugin/skills/teammode/scripts/team-guide.mjs +32 -5
  355. package/packages/omo-codex/plugin/skills/teammode/scripts/team-state.mjs +63 -1
  356. package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +87 -53
  357. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +4 -250
  358. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
  359. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +22 -14
  360. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -4
  361. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +11 -6
  362. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +3 -3
  363. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +1 -1
  364. package/{dist/skills/ultraresearch → packages/omo-codex/plugin/skills/ulw-research}/ATTRIBUTION.md +1 -1
  365. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +262 -0
  366. package/packages/omo-codex/plugin/skills/ulw-research/agents/openai.yaml +2 -0
  367. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +113 -18
  368. package/packages/omo-codex/plugin/skills/visual-qa/references/agent-browser-setup.md +5 -4
  369. package/packages/omo-codex/plugin/skills/visual-qa/scripts/visual-qa.mjs +530 -0
  370. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +23 -0
  371. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -0
  372. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +1 -0
  373. package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +24 -1
  374. package/packages/omo-codex/plugin/test/bootstrap-binlinks.test.mjs +61 -7
  375. package/packages/omo-codex/plugin/test/bootstrap-hooks.test.mjs +38 -0
  376. package/packages/omo-codex/plugin/test/bootstrap-ps-guard.test.mjs +25 -0
  377. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +1 -7
  378. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +12 -11
  379. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +99 -1
  380. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +62 -8
  381. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +206 -6
  382. package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +1 -0
  383. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +44 -0
  384. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +50 -1
  385. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +10 -7
  386. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +28 -2
  387. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +102 -0
  388. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +20 -0
  389. package/packages/omo-codex/plugin/test/teammode-safety-fixture.mjs +41 -1
  390. package/packages/omo-codex/plugin/test/teammode-safety.test.mjs +93 -0
  391. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +117 -0
  392. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +5 -2
  393. package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +285 -0
  394. package/packages/omo-codex/scripts/install-bin-links.test.mjs +12 -1
  395. package/packages/omo-codex/scripts/install-cache-copy.test.mjs +79 -0
  396. package/packages/omo-codex/scripts/install-config-autonomous-features.test.mjs +43 -3
  397. package/packages/omo-codex/scripts/install-config.test.mjs +198 -17
  398. package/packages/omo-codex/scripts/install-delegated-command.test.mjs +93 -0
  399. package/packages/omo-codex/scripts/install-dist/install-local.mjs +803 -309
  400. package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +21 -2
  401. package/packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs +24 -15
  402. package/packages/omo-codex/scripts/install-local.test.mjs +5 -2
  403. package/packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs +84 -0
  404. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +128 -0
  405. package/packages/shared-skills/skills/coding-agent-sessions/agents/openai.yaml +4 -0
  406. package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +71 -0
  407. package/packages/shared-skills/skills/coding-agent-sessions/references/claude.md +32 -0
  408. package/packages/shared-skills/skills/coding-agent-sessions/references/codex.md +30 -0
  409. package/packages/shared-skills/skills/coding-agent-sessions/references/opencode.md +43 -0
  410. package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +17 -0
  411. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/__init__.py +1 -0
  412. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/claude.py +66 -0
  413. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +283 -0
  414. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/codex.py +105 -0
  415. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +275 -0
  416. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/jsonio.py +55 -0
  417. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/kiro_scanner.py +91 -0
  418. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/opencode.py +289 -0
  419. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +92 -0
  420. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_optional_scanners.py +203 -0
  421. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_scanners.py +177 -0
  422. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/timeparse.py +51 -0
  423. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +149 -0
  424. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/types.py +57 -0
  425. package/packages/shared-skills/skills/coding-agent-sessions/scripts/find-agent-sessions.py +19 -0
  426. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +52 -8
  427. package/packages/shared-skills/skills/frontend/SKILL.md +29 -8
  428. package/packages/shared-skills/skills/frontend/references/design/README.md +29 -12
  429. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +3 -3
  430. package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +22 -19
  431. package/packages/shared-skills/skills/frontend/references/designpowers/EVIDENCE.md +89 -0
  432. package/packages/shared-skills/skills/frontend/references/designpowers/README.md +48 -0
  433. package/packages/shared-skills/skills/frontend/references/designpowers/UPSTREAM.md +80 -0
  434. package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +64 -0
  435. package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +65 -0
  436. package/packages/shared-skills/skills/frontend/references/designpowers/lane-c-review.md +65 -0
  437. package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +83 -0
  438. package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +80 -0
  439. package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +79 -0
  440. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/LICENSE +21 -0
  441. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
  442. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/content-writer.md +132 -0
  443. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-builder.md +109 -0
  444. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-critic.md +89 -0
  445. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-lead.md +113 -0
  446. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-scout.md +78 -0
  447. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-strategist.md +121 -0
  448. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
  449. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
  450. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/motion-designer.md +120 -0
  451. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/accessible-content/SKILL.md +101 -0
  452. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/SKILL.md +109 -0
  453. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/SKILL.md +107 -0
  454. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debate/SKILL.md +199 -0
  455. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/SKILL.md +174 -0
  456. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-handoff/SKILL.md +125 -0
  457. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-md/SKILL.md +106 -0
  458. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-retrospective/SKILL.md +266 -0
  459. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-review/SKILL.md +123 -0
  460. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/SKILL.md +120 -0
  461. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/SKILL.md +164 -0
  462. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/SKILL.md +85 -0
  463. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/SKILL.md +98 -0
  464. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/SKILL.md +165 -0
  465. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/interaction-design/SKILL.md +122 -0
  466. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/motion-choreography/SKILL.md +81 -0
  467. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/research-planning/SKILL.md +96 -0
  468. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/SKILL.md +77 -0
  469. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/SKILL.md +192 -0
  470. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-feedback/SKILL.md +165 -0
  471. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-report/SKILL.md +78 -0
  472. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/token-architecture/SKILL.md +75 -0
  473. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/ui-composition/SKILL.md +117 -0
  474. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/usability-testing/SKILL.md +78 -0
  475. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/SKILL.md +125 -0
  476. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/SKILL.md +79 -0
  477. package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/SKILL.md +119 -0
  478. package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/core.py +0 -0
  479. package/packages/shared-skills/skills/git-master/SKILL.md +4 -0
  480. package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +44 -13
  481. package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
  482. package/packages/shared-skills/skills/lcx-doctor/SKILL.md +48 -13
  483. package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +1 -1
  484. package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +44 -13
  485. package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +1 -1
  486. package/packages/shared-skills/skills/review-work/SKILL.md +3 -3
  487. package/packages/shared-skills/skills/start-work/SKILL.md +7 -5
  488. package/packages/shared-skills/skills/ultraresearch/SKILL.md +4 -252
  489. package/packages/shared-skills/skills/ulw-plan/SKILL.md +8 -6
  490. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +11 -6
  491. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +3 -3
  492. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +1 -1
  493. package/packages/{omo-codex/plugin/skills/ultraresearch → shared-skills/skills/ulw-research}/ATTRIBUTION.md +1 -1
  494. package/packages/shared-skills/skills/ulw-research/SKILL.md +260 -0
  495. package/packages/shared-skills/skills/visual-qa/SKILL.md +109 -18
  496. package/packages/shared-skills/skills/visual-qa/references/agent-browser-setup.md +5 -4
  497. package/packages/shared-skills/skills/visual-qa/scripts/cli.test.ts +7 -2
  498. package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +130 -3
  499. package/packages/shared-skills/skills/visual-qa/scripts/visual-qa.mjs +530 -0
  500. package/script/qa/web-terminal-redaction.d.mts +13 -0
  501. package/script/qa/web-terminal-redaction.mjs +43 -0
  502. package/script/qa/web-terminal-renderer.mjs +218 -0
  503. package/script/qa/web-terminal-visual-qa.mjs +264 -0
  504. package/dist/cli/sparkshell-appserver-websocket.d.ts +0 -4
  505. package/dist/cli/sparkshell-appserver.d.ts +0 -16
  506. package/dist/cli/sparkshell-condense.d.ts +0 -10
  507. package/dist/cli/sparkshell-parse.d.ts +0 -24
  508. package/dist/cli/sparkshell-session-context.d.ts +0 -20
  509. package/dist/cli/sparkshell-spark.d.ts +0 -23
  510. package/dist/cli/sparkshell.d.ts +0 -33
  511. package/dist/shared/sparkshell-awareness.d.ts +0 -5
  512. package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +0 -106
  513. package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +0 -346
  514. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +0 -110
  515. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +0 -245
  516. package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +0 -204
@@ -68,6 +68,8 @@ describe("visual-qa skill prompt contract", () => {
68
68
  expect(lowerPassB, fixture.label).toContain("view_image")
69
69
  expect(lowerPassB, fixture.label).toContain("source code")
70
70
  expect(passB, fixture.label).toContain("[Image #1]")
71
+ expect(passB, fixture.label).toContain("semantic phrases")
72
+ expect(passB, fixture.label).toContain("놀라운 변 / 화")
71
73
  expect(passB, fixture.label).toContain("에이전트 오케스트")
72
74
  expect(passB, fixture.label).toContain("레이션 현황 및 미")
73
75
  expect(passB, fixture.label).toContain("래")
@@ -96,7 +98,7 @@ describe("visual-qa skill prompt contract", () => {
96
98
  const web = sectionBetween(fixture.text, "### Web", "### TUI")
97
99
 
98
100
  expect(web, fixture.label).toContain("agent-browser")
99
- expect(fixture.text, fixture.label).toContain("bun add -g agent-browser")
101
+ expect(fixture.text, fixture.label).toContain("npm install -g agent-browser")
100
102
  expect(fixture.text, fixture.label).toContain("https://github.com/vercel-labs/agent-browser")
101
103
  expect(fixture.text, fixture.label).toContain("references/agent-browser-setup.md")
102
104
  }
@@ -106,22 +108,147 @@ describe("visual-qa skill prompt contract", () => {
106
108
  expect(existsSync(referencesPath)).toBe(true)
107
109
  const doc = readFileSync(referencesPath, "utf8")
108
110
 
109
- expect(doc).toContain("bun add -g agent-browser")
111
+ expect(doc).toContain("npm install -g agent-browser")
110
112
  expect(doc).toContain("agent-browser install")
111
113
  expect(doc).toContain("https://github.com/vercel-labs/agent-browser")
112
114
  expect(doc).toContain("agent-browser --help")
113
115
  })
114
116
 
115
- test("#given a clone/design-port task #when in clone-coding mode #then dual pixel + code-fidelity verification loops until both pass", () => {
117
+ test("#given the visual QA evidence commands #when documented #then they use the Node bundle, not a Bun-only TypeScript launcher", () => {
118
+ for (const fixture of fixtures()) {
119
+ expect(fixture.text, fixture.label).toContain('node "$SKILL_DIR/scripts/visual-qa.mjs" image-diff')
120
+ expect(fixture.text, fixture.label).toContain('node "$SKILL_DIR/scripts/visual-qa.mjs" tui-check')
121
+ expect(fixture.text, fixture.label).not.toContain('bun "$SKILL_DIR/scripts/cli.ts"')
122
+ }
123
+ })
124
+
125
+ test("#given a concrete visual target #when in reference-fidelity mode #then dual pixel + code-fidelity verification loops until both pass", () => {
116
126
  for (const fixture of fixtures()) {
117
127
  const cloneMode = sectionBetween(fixture.text, "## Step 5", "## Reference evidence is not the verdict")
118
128
  const lowerCloneMode = cloneMode.toLowerCase()
119
129
 
120
130
  expect(lowerCloneMode, fixture.label).toContain("clone")
131
+ expect(lowerCloneMode, fixture.label).toContain("imagen")
132
+ expect(lowerCloneMode, fixture.label).toContain("stitch")
133
+ expect(lowerCloneMode, fixture.label).toContain("generated mockup")
134
+ expect(lowerCloneMode, fixture.label).toContain("overview")
121
135
  expect(cloneMode, fixture.label).toContain("pixel-by-pixel")
122
136
  expect(cloneMode, fixture.label).toContain("image-diff")
123
137
  expect(cloneMode, fixture.label).toContain("lazycodex-clone-fidelity-reviewer")
138
+ expect(lowerCloneMode, fixture.label).toContain("extensible state variants")
124
139
  expect(lowerCloneMode, fixture.label).toContain("retry")
125
140
  }
126
141
  })
127
142
  })
143
+
144
+ describe("visual-qa skill exhaustive-coverage and review-gate contract", () => {
145
+ test("#given a multi-page surface #when capturing #then every page is enumerated and verified per page, not sampled", () => {
146
+ for (const fixture of fixtures()) {
147
+ const capture = sectionBetween(fixture.text, "## Step 2", "## Step 3")
148
+ const lower = capture.toLowerCase()
149
+
150
+ expect(lower, fixture.label).toContain("every page")
151
+ expect(lower, fixture.label).toContain("enumerate")
152
+ expect(lower, fixture.label).toContain("never sample")
153
+ expect(lower, fixture.label).toContain("per page")
154
+ expect(lower, fixture.label).toContain("one failing page fails")
155
+ }
156
+ })
157
+
158
+ test("#given prior QA artifacts #when verifying #then stale evidence older than the source must be regenerated", () => {
159
+ for (const fixture of fixtures()) {
160
+ const capture = sectionBetween(fixture.text, "## Step 2", "## Step 3")
161
+ const lower = capture.toLowerCase()
162
+
163
+ expect(lower, fixture.label).toContain("stale")
164
+ expect(lower, fixture.label).toContain("older than")
165
+ expect(lower, fixture.label).toContain("regenerate")
166
+ }
167
+ })
168
+
169
+ test("#given Step 3 dispatch #when running the review #then it is required pre-done, harness-native, and covers every enumerated page", () => {
170
+ for (const fixture of fixtures()) {
171
+ const dispatch = sectionBetween(fixture.text, "## Step 3", "### Pass A")
172
+ const lower = dispatch.toLowerCase()
173
+
174
+ expect(lower, fixture.label).toContain("required before")
175
+ expect(lower, fixture.label).toContain("do not self-review")
176
+ expect(dispatch, fixture.label).toContain("spawn_agent")
177
+ expect(dispatch, fixture.label).toContain("lazycodex-gate-reviewer")
178
+ expect(lower, fixture.label).toContain("every enumerated page")
179
+ }
180
+ })
181
+
182
+ test("#given the completion gate #when deciding done #then an independent reviewer must PASS on a fresh full capture, looping until clean", () => {
183
+ for (const fixture of fixtures()) {
184
+ const gate = sectionBetween(fixture.text, "## Step 4", "## Step 5")
185
+ const lower = gate.toLowerCase()
186
+
187
+ expect(lower, fixture.label).toContain("hard stop rule")
188
+ expect(lower, fixture.label).toContain("independent")
189
+ expect(lower, fixture.label).toContain("no blocking")
190
+ expect(lower, fixture.label).toContain("fresh")
191
+ expect(lower, fixture.label).toContain("every enumerated page")
192
+ expect(lower, fixture.label).toContain("loop until")
193
+ expect(lower, fixture.label).toContain("do not stop because the automated script")
194
+ }
195
+ })
196
+
197
+ test("#given Pass B CJK checks #when inspecting #then it flags topic, connective, and source-citation splits across every page", () => {
198
+ for (const fixture of fixtures()) {
199
+ const passB = sectionBetween(fixture.text, "### Pass B", "## Step 4")
200
+ const lower = passB.toLowerCase()
201
+
202
+ expect(passB, fixture.label).toContain("두 강은")
203
+ expect(passB, fixture.label).toContain("쓸 수")
204
+ expect(passB, fixture.label).toContain("Attention Is")
205
+ expect(lower, fixture.label).toContain("citation")
206
+ expect(lower, fixture.label).toContain("every page")
207
+ expect(lower, fixture.label).toContain("regardless of similarityscore")
208
+ }
209
+ })
210
+
211
+ test("#given a generated reference packet #when reviewing #then Pass A and B require extensible design-system code and pixel-level reference matching", () => {
212
+ for (const fixture of fixtures()) {
213
+ const passA = sectionBetween(fixture.text, "### Pass A", "### Pass B")
214
+ const passB = sectionBetween(fixture.text, "### Pass B", "## Step 4")
215
+ const lowerPassA = passA.toLowerCase()
216
+ const lowerPassB = passB.toLowerCase()
217
+
218
+ expect(passA, fixture.label).toContain("REFERENCE PACKET:")
219
+ expect(passB, fixture.label).toContain("REFERENCE PACKET:")
220
+ expect(lowerPassA, fixture.label).toContain("reusable tokens/primitives")
221
+ expect(lowerPassA, fixture.label).toContain("extend to new pages")
222
+ expect(lowerPassA, fixture.label).toContain("missing overview content")
223
+ expect(lowerPassB, fixture.label).toContain("pixel-perfectly")
224
+ expect(lowerPassB, fixture.label).toContain("actual against reference")
225
+ expect(lowerPassB, fixture.label).toContain("overview text is part of the target")
226
+ }
227
+ })
228
+
229
+ test("#given reference packet evidence #when prompting reviewers #then sensitive content is redacted and annotations stay untrusted data", () => {
230
+ for (const fixture of fixtures()) {
231
+ const capture = sectionBetween(fixture.text, "## Step 2", "## Step 3")
232
+ const passA = sectionBetween(fixture.text, "### Pass A", "### Pass B")
233
+ const passB = sectionBetween(fixture.text, "### Pass B", "## Step 4")
234
+ const combined = `${capture}\n${passA}\n${passB}`.toLowerCase()
235
+
236
+ expect(combined, fixture.label).toContain("redact or omit secrets")
237
+ expect(combined, fixture.label).toContain("credentials")
238
+ expect(combined, fixture.label).toContain("tokens")
239
+ expect(combined, fixture.label).toContain("auth headers")
240
+ expect(combined, fixture.label).toContain("customer data")
241
+ expect(combined, fixture.label).toContain("private messages")
242
+ expect(combined, fixture.label).toContain("internal urls")
243
+ expect(combined, fixture.label).toContain("other sensitive content")
244
+ expect(combined, fixture.label).toContain("overview text")
245
+ expect(combined, fixture.label).toContain("annotations")
246
+ expect(combined, fixture.label).toContain("untrusted data")
247
+ expect(combined, fixture.label).toContain("captured ui copy")
248
+ expect(combined, fixture.label).toContain("comments")
249
+ expect(combined, fixture.label).toContain("filenames")
250
+ expect(combined, fixture.label).toContain("not reviewer instructions")
251
+ expect(combined, fixture.label).toContain("never as instructions")
252
+ }
253
+ })
254
+ })
@@ -0,0 +1,530 @@
1
+ import { createRequire } from "node:module";
2
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
3
+
4
+ // packages/shared-skills/skills/visual-qa/scripts/cli.ts
5
+ import { readFileSync } from "node:fs";
6
+
7
+ // packages/shared-skills/skills/visual-qa/scripts/image-diff.ts
8
+ var GRID_SIZE = 8;
9
+ function round4(value) {
10
+ return Math.round(value * 1e4) / 1e4;
11
+ }
12
+ function pixelsDiffer(ref, refOffset, act, actOffset) {
13
+ return ref[refOffset] !== act[actOffset] || ref[refOffset + 1] !== act[actOffset + 1] || ref[refOffset + 2] !== act[actOffset + 2] || ref[refOffset + 3] !== act[actOffset + 3];
14
+ }
15
+ function buildHotspots(cellDiff, cellTotal, cols, rows, overlapWidth, overlapHeight) {
16
+ const hotspots = [];
17
+ for (let gridY = 0;gridY < rows; gridY++) {
18
+ for (let gridX = 0;gridX < cols; gridX++) {
19
+ const index = gridY * cols + gridX;
20
+ const diff = cellDiff[index] ?? 0;
21
+ const total = cellTotal[index] ?? 0;
22
+ if (diff === 0 || total === 0)
23
+ continue;
24
+ const left = Math.floor(gridX * overlapWidth / cols);
25
+ const right = Math.floor((gridX + 1) * overlapWidth / cols);
26
+ const top = Math.floor(gridY * overlapHeight / rows);
27
+ const bottom = Math.floor((gridY + 1) * overlapHeight / rows);
28
+ hotspots.push({
29
+ gridX,
30
+ gridY,
31
+ x: left,
32
+ y: top,
33
+ width: right - left,
34
+ height: bottom - top,
35
+ diffRatio: round4(diff / total)
36
+ });
37
+ }
38
+ }
39
+ hotspots.sort((a, b) => b.diffRatio - a.diffRatio);
40
+ return hotspots;
41
+ }
42
+ function buildSummary(similarityScore, diffPixels, totalPixels, dimensionsMatch, hotspotCount) {
43
+ const parts = [`${similarityScore}/100 similarity`, `${diffPixels}/${totalPixels} pixels differ`];
44
+ if (!dimensionsMatch)
45
+ parts.push("dimensions differ");
46
+ if (hotspotCount > 0)
47
+ parts.push(`${hotspotCount} hotspot region(s)`);
48
+ return `${parts.join("; ")}.`;
49
+ }
50
+ function diffImages(reference, actual) {
51
+ const overlapWidth = Math.min(reference.width, actual.width);
52
+ const overlapHeight = Math.min(reference.height, actual.height);
53
+ const totalPixels = overlapWidth * overlapHeight;
54
+ const cols = Math.max(1, Math.min(GRID_SIZE, overlapWidth));
55
+ const rows = Math.max(1, Math.min(GRID_SIZE, overlapHeight));
56
+ const cellDiff = new Array(cols * rows).fill(0);
57
+ const cellTotal = new Array(cols * rows).fill(0);
58
+ let diffPixels = 0;
59
+ for (let y = 0;y < overlapHeight; y++) {
60
+ const cellY = Math.min(rows - 1, Math.floor(y * rows / overlapHeight));
61
+ for (let x = 0;x < overlapWidth; x++) {
62
+ const cellX = Math.min(cols - 1, Math.floor(x * cols / overlapWidth));
63
+ const cellIndex = cellY * cols + cellX;
64
+ cellTotal[cellIndex] = (cellTotal[cellIndex] ?? 0) + 1;
65
+ const refOffset = (y * reference.width + x) * 4;
66
+ const actOffset = (y * actual.width + x) * 4;
67
+ if (pixelsDiffer(reference.rgba, refOffset, actual.rgba, actOffset)) {
68
+ diffPixels++;
69
+ cellDiff[cellIndex] = (cellDiff[cellIndex] ?? 0) + 1;
70
+ }
71
+ }
72
+ }
73
+ const diffRatio = totalPixels === 0 ? 0 : diffPixels / totalPixels;
74
+ const similarityScore = Math.round((1 - diffRatio) * 100);
75
+ const hotspots = buildHotspots(cellDiff, cellTotal, cols, rows, overlapWidth, overlapHeight);
76
+ const dimensionsMatch = reference.width === actual.width && reference.height === actual.height;
77
+ const alphaChannelIntact = !(reference.hasTransparentPixels && !actual.hasTransparentPixels);
78
+ return {
79
+ command: "image-diff",
80
+ dimensionsMatch,
81
+ reference: { width: reference.width, height: reference.height },
82
+ actual: { width: actual.width, height: actual.height },
83
+ totalPixels,
84
+ diffPixels,
85
+ diffRatio: round4(diffRatio),
86
+ similarityScore,
87
+ alphaChannelIntact,
88
+ hotspots,
89
+ summary: buildSummary(similarityScore, diffPixels, totalPixels, dimensionsMatch, hotspots.length)
90
+ };
91
+ }
92
+
93
+ // packages/shared-skills/skills/visual-qa/scripts/png-decode.ts
94
+ import { Buffer as Buffer2 } from "node:buffer";
95
+ import { inflateSync } from "node:zlib";
96
+
97
+ // packages/shared-skills/skills/visual-qa/scripts/png-crc.ts
98
+ import { Buffer } from "node:buffer";
99
+ var PNG_SIGNATURE = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
100
+ function buildCrcTable() {
101
+ const table = new Uint32Array(256);
102
+ for (let n = 0;n < 256; n++) {
103
+ let c = n;
104
+ for (let k = 0;k < 8; k++) {
105
+ c = (c & 1) === 1 ? 3988292384 ^ c >>> 1 : c >>> 1;
106
+ }
107
+ table[n] = c >>> 0;
108
+ }
109
+ return table;
110
+ }
111
+ var CRC_TABLE = buildCrcTable();
112
+
113
+ // packages/shared-skills/skills/visual-qa/scripts/png-decode.ts
114
+ class PngDecodeError extends Error {
115
+ name = "PngDecodeError";
116
+ }
117
+ function readChunks(buffer) {
118
+ const chunks = [];
119
+ let offset = 8;
120
+ while (offset + 8 <= buffer.length) {
121
+ const length = buffer.readUInt32BE(offset);
122
+ const type = buffer.toString("ascii", offset + 4, offset + 8);
123
+ const dataStart = offset + 8;
124
+ const dataEnd = dataStart + length;
125
+ if (dataEnd + 4 > buffer.length)
126
+ break;
127
+ chunks.push({ type, data: buffer.subarray(dataStart, dataEnd) });
128
+ offset = dataEnd + 4;
129
+ }
130
+ return chunks;
131
+ }
132
+ function channelsForColorType(colorType) {
133
+ switch (colorType) {
134
+ case 0:
135
+ return 1;
136
+ case 2:
137
+ return 3;
138
+ case 4:
139
+ return 2;
140
+ case 6:
141
+ return 4;
142
+ default:
143
+ throw new PngDecodeError(`unsupported color type ${colorType}`);
144
+ }
145
+ }
146
+ function parseHeader(data) {
147
+ if (data.length < 13) {
148
+ throw new PngDecodeError("invalid IHDR chunk length");
149
+ }
150
+ const colorType = data[9] ?? 0;
151
+ return {
152
+ width: data.readUInt32BE(0),
153
+ height: data.readUInt32BE(4),
154
+ bitDepth: data[8] ?? 0,
155
+ colorType,
156
+ channels: channelsForColorType(colorType)
157
+ };
158
+ }
159
+ function paeth(a, b, c) {
160
+ const p = a + b - c;
161
+ const pa = Math.abs(p - a);
162
+ const pb = Math.abs(p - b);
163
+ const pc = Math.abs(p - c);
164
+ if (pa <= pb && pa <= pc)
165
+ return a;
166
+ if (pb <= pc)
167
+ return b;
168
+ return c;
169
+ }
170
+ function unfilterRow(filterType, row, prev, bpp) {
171
+ const out = Buffer2.alloc(row.length);
172
+ for (let i = 0;i < row.length; i++) {
173
+ const raw = row[i] ?? 0;
174
+ const a = i >= bpp ? out[i - bpp] ?? 0 : 0;
175
+ const b = prev ? prev[i] ?? 0 : 0;
176
+ const c = i >= bpp && prev ? prev[i - bpp] ?? 0 : 0;
177
+ switch (filterType) {
178
+ case 0:
179
+ out[i] = raw;
180
+ break;
181
+ case 1:
182
+ out[i] = raw + a & 255;
183
+ break;
184
+ case 2:
185
+ out[i] = raw + b & 255;
186
+ break;
187
+ case 3:
188
+ out[i] = raw + (a + b >> 1) & 255;
189
+ break;
190
+ case 4:
191
+ out[i] = raw + paeth(a, b, c) & 255;
192
+ break;
193
+ default:
194
+ throw new PngDecodeError(`unsupported filter type ${filterType}`);
195
+ }
196
+ }
197
+ return out;
198
+ }
199
+ function decodePixels(idat, width, height, bpp) {
200
+ const inflated = inflateSync(idat);
201
+ const rowBytes = width * bpp;
202
+ if (inflated.length < height * (rowBytes + 1)) {
203
+ throw new PngDecodeError("truncated image data");
204
+ }
205
+ const pixels = Buffer2.alloc(width * height * bpp);
206
+ let prev = null;
207
+ for (let y = 0;y < height; y++) {
208
+ const rowStart = y * (rowBytes + 1);
209
+ const filterType = inflated[rowStart] ?? 0;
210
+ const filtered = inflated.subarray(rowStart + 1, rowStart + 1 + rowBytes);
211
+ const row = unfilterRow(filterType, filtered, prev, bpp);
212
+ row.copy(pixels, y * rowBytes);
213
+ prev = row;
214
+ }
215
+ return pixels;
216
+ }
217
+ function normalizeToRgba(pixels, pixelCount, channels) {
218
+ const rgba = new Uint8Array(pixelCount * 4);
219
+ let hasTransparent = false;
220
+ for (let i = 0;i < pixelCount; i++) {
221
+ const src = i * channels;
222
+ let r = 0;
223
+ let g = 0;
224
+ let b = 0;
225
+ let a = 255;
226
+ switch (channels) {
227
+ case 1: {
228
+ const v = pixels[src] ?? 0;
229
+ r = v;
230
+ g = v;
231
+ b = v;
232
+ break;
233
+ }
234
+ case 2: {
235
+ const v = pixels[src] ?? 0;
236
+ r = v;
237
+ g = v;
238
+ b = v;
239
+ a = pixels[src + 1] ?? 255;
240
+ break;
241
+ }
242
+ case 3: {
243
+ r = pixels[src] ?? 0;
244
+ g = pixels[src + 1] ?? 0;
245
+ b = pixels[src + 2] ?? 0;
246
+ break;
247
+ }
248
+ default: {
249
+ r = pixels[src] ?? 0;
250
+ g = pixels[src + 1] ?? 0;
251
+ b = pixels[src + 2] ?? 0;
252
+ a = pixels[src + 3] ?? 255;
253
+ }
254
+ }
255
+ const dst = i * 4;
256
+ rgba[dst] = r;
257
+ rgba[dst + 1] = g;
258
+ rgba[dst + 2] = b;
259
+ rgba[dst + 3] = a;
260
+ if (a < 255)
261
+ hasTransparent = true;
262
+ }
263
+ return { rgba, hasTransparent };
264
+ }
265
+ function decodePng(buffer) {
266
+ if (buffer.length < 8 || !buffer.subarray(0, 8).equals(PNG_SIGNATURE)) {
267
+ throw new PngDecodeError("not a PNG file (bad signature)");
268
+ }
269
+ const chunks = readChunks(buffer);
270
+ const ihdr = chunks.find((chunk) => chunk.type === "IHDR");
271
+ if (ihdr === undefined) {
272
+ throw new PngDecodeError("missing IHDR chunk");
273
+ }
274
+ const header = parseHeader(ihdr.data);
275
+ if (header.bitDepth !== 8) {
276
+ throw new PngDecodeError(`unsupported bit depth ${header.bitDepth}`);
277
+ }
278
+ const idatChunks = chunks.filter((chunk) => chunk.type === "IDAT");
279
+ if (idatChunks.length === 0) {
280
+ throw new PngDecodeError("missing IDAT chunk");
281
+ }
282
+ const idat = Buffer2.concat(idatChunks.map((chunk) => chunk.data));
283
+ const pixels = decodePixels(idat, header.width, header.height, header.channels);
284
+ const normalized = normalizeToRgba(pixels, header.width * header.height, header.channels);
285
+ return {
286
+ width: header.width,
287
+ height: header.height,
288
+ rgba: normalized.rgba,
289
+ hasAlphaChannel: header.colorType === 4 || header.colorType === 6,
290
+ hasTransparentPixels: normalized.hasTransparent
291
+ };
292
+ }
293
+
294
+ // packages/shared-skills/skills/visual-qa/scripts/ansi.ts
295
+ var ESC = String.fromCharCode(27);
296
+ var CSI = String.fromCharCode(155);
297
+ var ANSI_PATTERN = new RegExp(`[${ESC}${CSI}][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]`, "g");
298
+ function stripAnsi(input) {
299
+ return input.replace(ANSI_PATTERN, "");
300
+ }
301
+ function hasAnsi(input) {
302
+ return stripAnsi(input) !== input;
303
+ }
304
+
305
+ // packages/shared-skills/skills/visual-qa/scripts/east-asian-width.ts
306
+ var ZERO_WIDTH_RANGES = [
307
+ { start: 768, end: 879 },
308
+ { start: 1155, end: 1161 },
309
+ { start: 1425, end: 1469 },
310
+ { start: 1552, end: 1562 },
311
+ { start: 1611, end: 1631 },
312
+ { start: 1648, end: 1648 },
313
+ { start: 1750, end: 1756 },
314
+ { start: 4448, end: 4607 },
315
+ { start: 8203, end: 8207 },
316
+ { start: 8234, end: 8238 },
317
+ { start: 8288, end: 8292 },
318
+ { start: 8400, end: 8447 },
319
+ { start: 65056, end: 65071 },
320
+ { start: 65279, end: 65279 }
321
+ ];
322
+ var WIDE_RANGES = [
323
+ { start: 4352, end: 4447 },
324
+ { start: 8986, end: 8987 },
325
+ { start: 11904, end: 12350 },
326
+ { start: 12353, end: 13311 },
327
+ { start: 13312, end: 19903 },
328
+ { start: 19968, end: 40959 },
329
+ { start: 40960, end: 42191 },
330
+ { start: 43360, end: 43391 },
331
+ { start: 44032, end: 55203 },
332
+ { start: 63744, end: 64255 },
333
+ { start: 65040, end: 65049 },
334
+ { start: 65072, end: 65135 },
335
+ { start: 65280, end: 65376 },
336
+ { start: 65504, end: 65510 },
337
+ { start: 110592, end: 110959 },
338
+ { start: 127488, end: 127743 },
339
+ { start: 127744, end: 129791 },
340
+ { start: 131072, end: 262141 }
341
+ ];
342
+ function inRanges(codePoint, ranges) {
343
+ for (const range of ranges) {
344
+ if (codePoint >= range.start && codePoint <= range.end) {
345
+ return true;
346
+ }
347
+ }
348
+ return false;
349
+ }
350
+ function charWidth(codePoint) {
351
+ if (codePoint === 0)
352
+ return 0;
353
+ if (codePoint < 32)
354
+ return 0;
355
+ if (codePoint >= 127 && codePoint <= 159)
356
+ return 0;
357
+ if (inRanges(codePoint, ZERO_WIDTH_RANGES))
358
+ return 0;
359
+ if (inRanges(codePoint, WIDE_RANGES))
360
+ return 2;
361
+ return 1;
362
+ }
363
+ function stringWidth(text) {
364
+ let total = 0;
365
+ for (const char of text) {
366
+ const codePoint = char.codePointAt(0);
367
+ if (codePoint === undefined)
368
+ continue;
369
+ total += charWidth(codePoint);
370
+ }
371
+ return total;
372
+ }
373
+
374
+ // packages/shared-skills/skills/visual-qa/scripts/tui-grid.ts
375
+ var BOX_DRAWING_START = 9472;
376
+ var BOX_DRAWING_END = 9599;
377
+ var MAX_WIDE_COLUMNS = 64;
378
+ function splitLines(text) {
379
+ const lines = text.split(/\r?\n/);
380
+ if (lines.length > 1 && lines[lines.length - 1] === "")
381
+ lines.pop();
382
+ return lines;
383
+ }
384
+ function isFrameLine(plain) {
385
+ for (const char of plain) {
386
+ const codePoint = char.codePointAt(0);
387
+ if (codePoint !== undefined && codePoint >= BOX_DRAWING_START && codePoint <= BOX_DRAWING_END) {
388
+ return true;
389
+ }
390
+ }
391
+ return false;
392
+ }
393
+ function wideStartColumns(plain) {
394
+ const columns = [];
395
+ let column = 0;
396
+ for (const char of plain) {
397
+ const codePoint = char.codePointAt(0);
398
+ if (codePoint === undefined)
399
+ continue;
400
+ const width = charWidth(codePoint);
401
+ if (width === 2)
402
+ columns.push(column);
403
+ column += width;
404
+ }
405
+ return columns;
406
+ }
407
+ function summarize(lineCount, maxWidth, expectedColumns, overflowCount, borderMisaligned, containsAnsi) {
408
+ const parts = [`${lineCount} line(s)`, `max width ${maxWidth}/${expectedColumns}`];
409
+ if (overflowCount > 0)
410
+ parts.push(`${overflowCount} overflow line(s)`);
411
+ if (borderMisaligned)
412
+ parts.push("borders misaligned");
413
+ if (containsAnsi)
414
+ parts.push("contains ANSI");
415
+ return `${parts.join("; ")}.`;
416
+ }
417
+ function checkTui(text, expectedColumns) {
418
+ const lines = splitLines(text);
419
+ const lineWidths = [];
420
+ const overflowLines = [];
421
+ const wideColumns = new Set;
422
+ const frameWidths = new Set;
423
+ for (let index = 0;index < lines.length; index++) {
424
+ const plain = stripAnsi(lines[index] ?? "");
425
+ const width = stringWidth(plain);
426
+ lineWidths.push(width);
427
+ if (expectedColumns > 0 && width > expectedColumns) {
428
+ overflowLines.push({ line: index + 1, width });
429
+ }
430
+ if (isFrameLine(plain))
431
+ frameWidths.add(width);
432
+ for (const column of wideStartColumns(plain)) {
433
+ if (wideColumns.size < MAX_WIDE_COLUMNS)
434
+ wideColumns.add(column);
435
+ }
436
+ }
437
+ const maxWidth = lineWidths.reduce((max, width) => width > max ? width : max, 0);
438
+ const borderMisaligned = frameWidths.size > 1;
439
+ const containsAnsi = hasAnsi(text);
440
+ return {
441
+ command: "tui-check",
442
+ expectedColumns,
443
+ lineCount: lines.length,
444
+ lineWidths,
445
+ maxWidth,
446
+ overflowLines,
447
+ borderMisaligned,
448
+ wideCharColumns: [...wideColumns].sort((a, b) => a - b),
449
+ hasAnsi: containsAnsi,
450
+ summary: summarize(lines.length, maxWidth, expectedColumns, overflowLines.length, borderMisaligned, containsAnsi)
451
+ };
452
+ }
453
+
454
+ // packages/shared-skills/skills/visual-qa/scripts/cli.ts
455
+ class CliError extends Error {
456
+ name = "CliError";
457
+ }
458
+ var DEFAULT_COLUMNS = 80;
459
+ var COLS_FLAG = "--cols";
460
+ function runImageDiff(args) {
461
+ const referencePath = args[0];
462
+ const actualPath = args[1];
463
+ if (referencePath === undefined || actualPath === undefined) {
464
+ throw new CliError("usage: image-diff <reference.png> <actual.png>");
465
+ }
466
+ const reference = decodePng(readFileSync(referencePath));
467
+ const actual = decodePng(readFileSync(actualPath));
468
+ return diffImages(reference, actual);
469
+ }
470
+ function parseColumns(args) {
471
+ for (let index = 0;index < args.length; index++) {
472
+ const arg = args[index] ?? "";
473
+ if (arg === COLS_FLAG) {
474
+ const parsed = Number(args[index + 1]);
475
+ if (!Number.isInteger(parsed) || parsed <= 0) {
476
+ throw new CliError(`${COLS_FLAG} requires a positive integer`);
477
+ }
478
+ return parsed;
479
+ }
480
+ if (arg.startsWith(`${COLS_FLAG}=`)) {
481
+ const parsed = Number(arg.slice(COLS_FLAG.length + 1));
482
+ if (!Number.isInteger(parsed) || parsed <= 0) {
483
+ throw new CliError(`${COLS_FLAG} requires a positive integer`);
484
+ }
485
+ return parsed;
486
+ }
487
+ }
488
+ return DEFAULT_COLUMNS;
489
+ }
490
+ function runTuiCheck(args) {
491
+ const capturePath = args[0];
492
+ if (capturePath === undefined || capturePath.startsWith("--")) {
493
+ throw new CliError("usage: tui-check <capture.txt> [--cols N]");
494
+ }
495
+ const text = readFileSync(capturePath, "utf8");
496
+ return checkTui(text, parseColumns(args.slice(1)));
497
+ }
498
+ function run(argv) {
499
+ const command = argv[0];
500
+ const rest = argv.slice(1);
501
+ switch (command) {
502
+ case "image-diff":
503
+ return runImageDiff(rest);
504
+ case "tui-check":
505
+ return runTuiCheck(rest);
506
+ default:
507
+ throw new CliError(`unknown command "${command ?? ""}"; expected "image-diff" or "tui-check"`);
508
+ }
509
+ }
510
+ function main(argv) {
511
+ try {
512
+ const result = run(argv);
513
+ process.stdout.write(`${JSON.stringify(result, null, 2)}
514
+ `);
515
+ } catch (error) {
516
+ const message = error instanceof Error ? error.message : String(error);
517
+ process.stderr.write(`visual-qa error: ${message}
518
+ `);
519
+ process.exitCode = 1;
520
+ }
521
+ }
522
+ if (__require.main == __require.module) {
523
+ main(process.argv.slice(2));
524
+ }
525
+ export {
526
+ runTuiCheck,
527
+ runImageDiff,
528
+ run,
529
+ CliError
530
+ };