monomind 2.7.11 → 2.7.12

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 (1152) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +0 -0
  3. package/bin/npx-safe-launch.js +0 -0
  4. package/package.json +2 -2
  5. package/packages/@monomind/cli/.claude/agents/architecture/system-design/arch-system-design.md +0 -0
  6. package/packages/@monomind/cli/.claude/agents/consensus/crdt-synchronizer.md +0 -0
  7. package/packages/@monomind/cli/.claude/agents/consensus/quorum-manager.md +0 -0
  8. package/packages/@monomind/cli/.claude/agents/consensus/security-manager.md +0 -0
  9. package/packages/@monomind/cli/.claude/agents/core/coder.md +0 -0
  10. package/packages/@monomind/cli/.claude/agents/core/coordinator.md +0 -0
  11. package/packages/@monomind/cli/.claude/agents/core/planner.md +0 -0
  12. package/packages/@monomind/cli/.claude/agents/core/researcher.md +0 -0
  13. package/packages/@monomind/cli/.claude/agents/core/reviewer.md +0 -0
  14. package/packages/@monomind/cli/.claude/agents/core/tester.md +0 -0
  15. package/packages/@monomind/cli/.claude/agents/design/design-monodesign.md +0 -0
  16. package/packages/@monomind/cli/.claude/agents/engineering/engineering-ai-data-remediation-engineer.md +0 -0
  17. package/packages/@monomind/cli/.claude/agents/engineering/engineering-ai-engineer.md +0 -0
  18. package/packages/@monomind/cli/.claude/agents/engineering/engineering-autonomous-optimization-architect.md +0 -0
  19. package/packages/@monomind/cli/.claude/agents/engineering/engineering-backend-architect.md +0 -0
  20. package/packages/@monomind/cli/.claude/agents/engineering/engineering-code-reviewer.md +0 -0
  21. package/packages/@monomind/cli/.claude/agents/engineering/engineering-data-engineer.md +0 -0
  22. package/packages/@monomind/cli/.claude/agents/engineering/engineering-database-optimizer.md +0 -0
  23. package/packages/@monomind/cli/.claude/agents/engineering/engineering-devops-automator.md +0 -0
  24. package/packages/@monomind/cli/.claude/agents/engineering/engineering-embedded-firmware-engineer.md +0 -0
  25. package/packages/@monomind/cli/.claude/agents/engineering/engineering-feishu-integration-developer.md +0 -0
  26. package/packages/@monomind/cli/.claude/agents/engineering/engineering-frontend-developer.md +0 -0
  27. package/packages/@monomind/cli/.claude/agents/engineering/engineering-git-workflow-master.md +0 -0
  28. package/packages/@monomind/cli/.claude/agents/engineering/engineering-incident-response-commander.md +0 -0
  29. package/packages/@monomind/cli/.claude/agents/engineering/engineering-mobile-app-builder.md +0 -0
  30. package/packages/@monomind/cli/.claude/agents/engineering/engineering-rapid-prototyper.md +0 -0
  31. package/packages/@monomind/cli/.claude/agents/engineering/engineering-security-engineer.md +0 -0
  32. package/packages/@monomind/cli/.claude/agents/engineering/engineering-senior-developer.md +0 -0
  33. package/packages/@monomind/cli/.claude/agents/engineering/engineering-software-architect.md +0 -0
  34. package/packages/@monomind/cli/.claude/agents/engineering/engineering-solidity-smart-contract-engineer.md +0 -0
  35. package/packages/@monomind/cli/.claude/agents/engineering/engineering-sre.md +0 -0
  36. package/packages/@monomind/cli/.claude/agents/engineering/engineering-technical-writer.md +0 -0
  37. package/packages/@monomind/cli/.claude/agents/engineering/engineering-threat-detection-engineer.md +0 -0
  38. package/packages/@monomind/cli/.claude/agents/engineering/engineering-wechat-mini-program-developer.md +0 -0
  39. package/packages/@monomind/cli/.claude/agents/github/code-review-swarm.md +0 -0
  40. package/packages/@monomind/cli/.claude/agents/github/github-modes.md +0 -0
  41. package/packages/@monomind/cli/.claude/agents/github/issue-tracker.md +0 -0
  42. package/packages/@monomind/cli/.claude/agents/github/multi-repo-swarm.md +0 -0
  43. package/packages/@monomind/cli/.claude/agents/github/pr-manager.md +0 -0
  44. package/packages/@monomind/cli/.claude/agents/github/project-board-sync.md +0 -0
  45. package/packages/@monomind/cli/.claude/agents/github/release-manager.md +0 -0
  46. package/packages/@monomind/cli/.claude/agents/github/repo-architect.md +0 -0
  47. package/packages/@monomind/cli/.claude/agents/github/swarm-issue.md +0 -0
  48. package/packages/@monomind/cli/.claude/agents/github/swarm-pr.md +0 -0
  49. package/packages/@monomind/cli/.claude/agents/github/sync-coordinator.md +0 -0
  50. package/packages/@monomind/cli/.claude/agents/github/workflow-automation.md +0 -0
  51. package/packages/@monomind/cli/.claude/agents/goal/goal-planner.md +0 -0
  52. package/packages/@monomind/cli/.claude/agents/hive-mind/collective-intelligence-coordinator.md +0 -0
  53. package/packages/@monomind/cli/.claude/agents/hive-mind/scout-explorer.md +0 -0
  54. package/packages/@monomind/cli/.claude/agents/hive-mind/swarm-memory-manager.md +0 -0
  55. package/packages/@monomind/cli/.claude/agents/hive-mind/worker-specialist.md +0 -0
  56. package/packages/@monomind/cli/.claude/agents/marketing/marketing-competitive-content.md +0 -0
  57. package/packages/@monomind/cli/.claude/agents/marketing/marketing-cro-specialist.md +0 -0
  58. package/packages/@monomind/cli/.claude/agents/marketing/marketing-email-specialist.md +0 -0
  59. package/packages/@monomind/cli/.claude/agents/marketing/marketing-launch-strategist.md +0 -0
  60. package/packages/@monomind/cli/.claude/agents/marketing/marketing-pricing-strategist.md +0 -0
  61. package/packages/@monomind/cli/.claude/agents/optimization/benchmark-suite.md +0 -0
  62. package/packages/@monomind/cli/.claude/agents/optimization/load-balancer.md +0 -0
  63. package/packages/@monomind/cli/.claude/agents/optimization/performance-monitor.md +0 -0
  64. package/packages/@monomind/cli/.claude/agents/optimization/resource-allocator.md +0 -0
  65. package/packages/@monomind/cli/.claude/agents/optimization/topology-optimizer.md +0 -0
  66. package/packages/@monomind/cli/.claude/agents/schemas/architecture-output.json +0 -0
  67. package/packages/@monomind/cli/.claude/agents/schemas/code-review-output.json +0 -0
  68. package/packages/@monomind/cli/.claude/agents/schemas/generic-task-input.json +0 -0
  69. package/packages/@monomind/cli/.claude/agents/schemas/implementation-output.json +0 -0
  70. package/packages/@monomind/cli/.claude/agents/schemas/research-output.json +0 -0
  71. package/packages/@monomind/cli/.claude/agents/schemas/security-audit-output.json +0 -0
  72. package/packages/@monomind/cli/.claude/agents/schemas/test-report-output.json +0 -0
  73. package/packages/@monomind/cli/.claude/agents/specialists/integration-architect.md +0 -0
  74. package/packages/@monomind/cli/.claude/agents/specialized/agentic-identity-trust.md +0 -0
  75. package/packages/@monomind/cli/.claude/agents/specialized/agents-orchestrator.md +0 -0
  76. package/packages/@monomind/cli/.claude/agents/specialized/automation-governance-architect.md +0 -0
  77. package/packages/@monomind/cli/.claude/agents/specialized/blockchain-security-auditor.md +0 -0
  78. package/packages/@monomind/cli/.claude/agents/specialized/compliance-auditor.md +0 -0
  79. package/packages/@monomind/cli/.claude/agents/specialized/identity-graph-operator.md +0 -0
  80. package/packages/@monomind/cli/.claude/agents/specialized/lsp-index-engineer.md +0 -0
  81. package/packages/@monomind/cli/.claude/agents/specialized/mobile/spec-mobile-react-native.md +0 -0
  82. package/packages/@monomind/cli/.claude/agents/specialized/specialized-cultural-intelligence-strategist.md +0 -0
  83. package/packages/@monomind/cli/.claude/agents/specialized/specialized-developer-advocate.md +0 -0
  84. package/packages/@monomind/cli/.claude/agents/specialized/specialized-document-generator.md +0 -0
  85. package/packages/@monomind/cli/.claude/agents/specialized/specialized-mcp-builder.md +0 -0
  86. package/packages/@monomind/cli/.claude/agents/specialized/specialized-model-qa.md +0 -0
  87. package/packages/@monomind/cli/.claude/agents/specialized/specialized-workflow-architect.md +0 -0
  88. package/packages/@monomind/cli/.claude/agents/specialized/zk-steward.md +0 -0
  89. package/packages/@monomind/cli/.claude/agents/swarm/mesh-coordinator.md +0 -0
  90. package/packages/@monomind/cli/.claude/agents/templates/automation-smart-agent.md +0 -0
  91. package/packages/@monomind/cli/.claude/agents/templates/coordinator-swarm-init.md +0 -0
  92. package/packages/@monomind/cli/.claude/agents/testing/production-validator.md +0 -0
  93. package/packages/@monomind/cli/.claude/agents/testing/tdd-london-swarm.md +0 -0
  94. package/packages/@monomind/cli/.claude/agents/testing/testing-accessibility-auditor.md +0 -0
  95. package/packages/@monomind/cli/.claude/agents/testing/testing-api-tester.md +0 -0
  96. package/packages/@monomind/cli/.claude/agents/testing/testing-evidence-collector.md +0 -0
  97. package/packages/@monomind/cli/.claude/agents/testing/testing-performance-benchmarker.md +0 -0
  98. package/packages/@monomind/cli/.claude/agents/testing/testing-test-results-analyzer.md +0 -0
  99. package/packages/@monomind/cli/.claude/agents/testing/testing-tool-evaluator.md +0 -0
  100. package/packages/@monomind/cli/.claude/agents/testing/testing-workflow-optimizer.md +0 -0
  101. package/packages/@monomind/cli/.claude/commands/agents/README.md +0 -0
  102. package/packages/@monomind/cli/.claude/commands/agents/agent-capabilities.md +0 -0
  103. package/packages/@monomind/cli/.claude/commands/agents/agent-coordination.md +0 -0
  104. package/packages/@monomind/cli/.claude/commands/agents/agent-spawning.md +0 -0
  105. package/packages/@monomind/cli/.claude/commands/agents/agent-types.md +0 -0
  106. package/packages/@monomind/cli/.claude/commands/analysis/README.md +0 -0
  107. package/packages/@monomind/cli/.claude/commands/analysis/bottleneck-detect.md +0 -0
  108. package/packages/@monomind/cli/.claude/commands/analysis/performance-bottlenecks.md +0 -0
  109. package/packages/@monomind/cli/.claude/commands/analysis/performance-report.md +0 -0
  110. package/packages/@monomind/cli/.claude/commands/analysis/token-usage.md +0 -0
  111. package/packages/@monomind/cli/.claude/commands/automation/README.md +0 -0
  112. package/packages/@monomind/cli/.claude/commands/automation/auto-agent.md +0 -0
  113. package/packages/@monomind/cli/.claude/commands/automation/self-healing.md +0 -0
  114. package/packages/@monomind/cli/.claude/commands/automation/session-memory.md +0 -0
  115. package/packages/@monomind/cli/.claude/commands/automation/smart-agents.md +0 -0
  116. package/packages/@monomind/cli/.claude/commands/automation/smart-spawn.md +0 -0
  117. package/packages/@monomind/cli/.claude/commands/automation/workflow-select.md +0 -0
  118. package/packages/@monomind/cli/.claude/commands/coordination/README.md +0 -0
  119. package/packages/@monomind/cli/.claude/commands/coordination/agent-spawn.md +0 -0
  120. package/packages/@monomind/cli/.claude/commands/coordination/swarm-init.md +0 -0
  121. package/packages/@monomind/cli/.claude/commands/coordination/task-orchestrate.md +0 -0
  122. package/packages/@monomind/cli/.claude/commands/github/README.md +0 -0
  123. package/packages/@monomind/cli/.claude/commands/github/github-modes.md +0 -0
  124. package/packages/@monomind/cli/.claude/commands/github/issue-tracker.md +0 -0
  125. package/packages/@monomind/cli/.claude/commands/github/pr-manager.md +0 -0
  126. package/packages/@monomind/cli/.claude/commands/github/release-manager.md +0 -0
  127. package/packages/@monomind/cli/.claude/commands/github/repo-architect.md +0 -0
  128. package/packages/@monomind/cli/.claude/commands/github/sync-coordinator.md +0 -0
  129. package/packages/@monomind/cli/.claude/commands/hive-mind/README.md +0 -0
  130. package/packages/@monomind/cli/.claude/commands/hive-mind/hive-mind-consensus.md +0 -0
  131. package/packages/@monomind/cli/.claude/commands/hive-mind/hive-mind-init.md +0 -0
  132. package/packages/@monomind/cli/.claude/commands/hive-mind/hive-mind-memory.md +0 -0
  133. package/packages/@monomind/cli/.claude/commands/hive-mind/hive-mind-spawn.md +0 -0
  134. package/packages/@monomind/cli/.claude/commands/hive-mind/hive-mind-status.md +0 -0
  135. package/packages/@monomind/cli/.claude/commands/hive-mind/hive-mind-stop.md +0 -0
  136. package/packages/@monomind/cli/.claude/commands/hive-mind/hive-mind.md +0 -0
  137. package/packages/@monomind/cli/.claude/commands/hooks/README.md +0 -0
  138. package/packages/@monomind/cli/.claude/commands/hooks/overview.md +0 -0
  139. package/packages/@monomind/cli/.claude/commands/hooks/post-edit.md +0 -0
  140. package/packages/@monomind/cli/.claude/commands/hooks/post-task.md +0 -0
  141. package/packages/@monomind/cli/.claude/commands/hooks/pre-edit.md +0 -0
  142. package/packages/@monomind/cli/.claude/commands/hooks/pre-task.md +0 -0
  143. package/packages/@monomind/cli/.claude/commands/hooks/session-end.md +0 -0
  144. package/packages/@monomind/cli/.claude/commands/hooks/setup.md +0 -0
  145. package/packages/@monomind/cli/.claude/commands/mastermind/_repeat.md +0 -0
  146. package/packages/@monomind/cli/.claude/commands/mastermind/_taskfile.md +0 -0
  147. package/packages/@monomind/cli/.claude/commands/mastermind/adr.md +0 -0
  148. package/packages/@monomind/cli/.claude/commands/mastermind/approvev1.md +0 -0
  149. package/packages/@monomind/cli/.claude/commands/mastermind/architect.md +0 -0
  150. package/packages/@monomind/cli/.claude/commands/mastermind/autodev.md +0 -0
  151. package/packages/@monomind/cli/.claude/commands/mastermind/brain.md +0 -0
  152. package/packages/@monomind/cli/.claude/commands/mastermind/budget.md +0 -0
  153. package/packages/@monomind/cli/.claude/commands/mastermind/build.md +0 -0
  154. package/packages/@monomind/cli/.claude/commands/mastermind/code-review.md +0 -0
  155. package/packages/@monomind/cli/.claude/commands/mastermind/content.md +0 -0
  156. package/packages/@monomind/cli/.claude/commands/mastermind/createorg.md +0 -0
  157. package/packages/@monomind/cli/.claude/commands/mastermind/createtask.md +0 -0
  158. package/packages/@monomind/cli/.claude/commands/mastermind/debug.md +0 -0
  159. package/packages/@monomind/cli/.claude/commands/mastermind/design.md +0 -0
  160. package/packages/@monomind/cli/.claude/commands/mastermind/do.md +0 -0
  161. package/packages/@monomind/cli/.claude/commands/mastermind/execute.md +0 -0
  162. package/packages/@monomind/cli/.claude/commands/mastermind/finance.md +0 -0
  163. package/packages/@monomind/cli/.claude/commands/mastermind/finish.md +0 -0
  164. package/packages/@monomind/cli/.claude/commands/mastermind/graph-status.md +0 -0
  165. package/packages/@monomind/cli/.claude/commands/mastermind/help.md +0 -0
  166. package/packages/@monomind/cli/.claude/commands/mastermind/idea.md +0 -0
  167. package/packages/@monomind/cli/.claude/commands/mastermind/ideate.md +0 -0
  168. package/packages/@monomind/cli/.claude/commands/mastermind/improve.md +0 -0
  169. package/packages/@monomind/cli/.claude/commands/mastermind/loops.md +0 -0
  170. package/packages/@monomind/cli/.claude/commands/mastermind/marketing.md +0 -0
  171. package/packages/@monomind/cli/.claude/commands/mastermind/master.md +0 -0
  172. package/packages/@monomind/cli/.claude/commands/mastermind/memory.md +0 -0
  173. package/packages/@monomind/cli/.claude/commands/mastermind/okf-export.md +0 -0
  174. package/packages/@monomind/cli/.claude/commands/mastermind/okf-import.md +0 -0
  175. package/packages/@monomind/cli/.claude/commands/mastermind/ops.md +0 -0
  176. package/packages/@monomind/cli/.claude/commands/mastermind/orgs.md +0 -0
  177. package/packages/@monomind/cli/.claude/commands/mastermind/orgstatus.md +0 -0
  178. package/packages/@monomind/cli/.claude/commands/mastermind/plan.md +0 -0
  179. package/packages/@monomind/cli/.claude/commands/mastermind/receive-review.md +0 -0
  180. package/packages/@monomind/cli/.claude/commands/mastermind/references/antigravity-tools.md +0 -0
  181. package/packages/@monomind/cli/.claude/commands/mastermind/references/claude-code-tools.md +0 -0
  182. package/packages/@monomind/cli/.claude/commands/mastermind/references/codex-tools.md +0 -0
  183. package/packages/@monomind/cli/.claude/commands/mastermind/references/copilot-tools.md +0 -0
  184. package/packages/@monomind/cli/.claude/commands/mastermind/references/gemini-tools.md +0 -0
  185. package/packages/@monomind/cli/.claude/commands/mastermind/references/pi-tools.md +0 -0
  186. package/packages/@monomind/cli/.claude/commands/mastermind/release.md +0 -0
  187. package/packages/@monomind/cli/.claude/commands/mastermind/repeat.md +0 -0
  188. package/packages/@monomind/cli/.claude/commands/mastermind/research.md +0 -0
  189. package/packages/@monomind/cli/.claude/commands/mastermind/review.md +0 -0
  190. package/packages/@monomind/cli/.claude/commands/mastermind/runorg.md +0 -0
  191. package/packages/@monomind/cli/.claude/commands/mastermind/runorgv1.md +0 -0
  192. package/packages/@monomind/cli/.claude/commands/mastermind/sales.md +0 -0
  193. package/packages/@monomind/cli/.claude/commands/mastermind/skill-builder.md +0 -0
  194. package/packages/@monomind/cli/.claude/commands/mastermind/specialagents.md +0 -0
  195. package/packages/@monomind/cli/.claude/commands/mastermind/stoporg.md +0 -0
  196. package/packages/@monomind/cli/.claude/commands/mastermind/swarm.md +0 -0
  197. package/packages/@monomind/cli/.claude/commands/mastermind/taskdev.md +0 -0
  198. package/packages/@monomind/cli/.claude/commands/mastermind/tdd.md +0 -0
  199. package/packages/@monomind/cli/.claude/commands/mastermind/techport.md +0 -0
  200. package/packages/@monomind/cli/.claude/commands/mastermind/topology.md +0 -0
  201. package/packages/@monomind/cli/.claude/commands/mastermind/understand.md +0 -0
  202. package/packages/@monomind/cli/.claude/commands/mastermind/verify.md +0 -0
  203. package/packages/@monomind/cli/.claude/commands/mastermind/worktree.md +0 -0
  204. package/packages/@monomind/cli/.claude/commands/mastermind.md +0 -0
  205. package/packages/@monomind/cli/.claude/commands/memory/README.md +0 -0
  206. package/packages/@monomind/cli/.claude/commands/memory/memory-search.md +0 -0
  207. package/packages/@monomind/cli/.claude/commands/monitoring/README.md +0 -0
  208. package/packages/@monomind/cli/.claude/commands/monitoring/agent-metrics.md +0 -0
  209. package/packages/@monomind/cli/.claude/commands/monitoring/agents.md +0 -0
  210. package/packages/@monomind/cli/.claude/commands/monitoring/status.md +0 -0
  211. package/packages/@monomind/cli/.claude/commands/monobrowse.md +0 -0
  212. package/packages/@monomind/cli/.claude/commands/monoes/README.md +0 -0
  213. package/packages/@monomind/cli/.claude/commands/monoes/install.md +0 -0
  214. package/packages/@monomind/cli/.claude/commands/monoes/monoagent.md +0 -0
  215. package/packages/@monomind/cli/.claude/commands/monoes/monoclip.md +0 -0
  216. package/packages/@monomind/cli/.claude/commands/monoes/monotask.md +0 -0
  217. package/packages/@monomind/cli/.claude/commands/monograph/README.md +0 -0
  218. package/packages/@monomind/cli/.claude/commands/monograph/monograph-build.md +0 -0
  219. package/packages/@monomind/cli/.claude/commands/monograph/monograph-search.md +0 -0
  220. package/packages/@monomind/cli/.claude/commands/monograph/monograph-stats.md +0 -0
  221. package/packages/@monomind/cli/.claude/commands/monograph/monograph-watch.md +0 -0
  222. package/packages/@monomind/cli/.claude/commands/monograph/monograph-wiki.md +0 -0
  223. package/packages/@monomind/cli/.claude/commands/optimization/auto-topology.md +0 -0
  224. package/packages/@monomind/cli/.claude/commands/optimization/performance-optimize.md +0 -0
  225. package/packages/@monomind/cli/.claude/commands/pair/README.md +0 -0
  226. package/packages/@monomind/cli/.claude/commands/pair/examples.md +0 -0
  227. package/packages/@monomind/cli/.claude/commands/pair/modes.md +0 -0
  228. package/packages/@monomind/cli/.claude/commands/pair/session.md +0 -0
  229. package/packages/@monomind/cli/.claude/commands/stream-chain/pipeline.md +0 -0
  230. package/packages/@monomind/cli/.claude/commands/stream-chain/run.md +0 -0
  231. package/packages/@monomind/cli/.claude/commands/swarm/README.md +0 -0
  232. package/packages/@monomind/cli/.claude/commands/swarm/analysis.md +0 -0
  233. package/packages/@monomind/cli/.claude/commands/swarm/development.md +0 -0
  234. package/packages/@monomind/cli/.claude/commands/swarm/examples.md +0 -0
  235. package/packages/@monomind/cli/.claude/commands/swarm/maintenance.md +0 -0
  236. package/packages/@monomind/cli/.claude/commands/swarm/optimization.md +0 -0
  237. package/packages/@monomind/cli/.claude/commands/swarm/research.md +0 -0
  238. package/packages/@monomind/cli/.claude/commands/swarm/swarm.md +0 -0
  239. package/packages/@monomind/cli/.claude/commands/swarm/testing.md +0 -0
  240. package/packages/@monomind/cli/.claude/commands/tokens.md +0 -0
  241. package/packages/@monomind/cli/.claude/commands/truth/start.md +0 -0
  242. package/packages/@monomind/cli/.claude/commands/ts.md +0 -0
  243. package/packages/@monomind/cli/.claude/commands/workflows/README.md +0 -0
  244. package/packages/@monomind/cli/.claude/commands/workflows/development.md +0 -0
  245. package/packages/@monomind/cli/.claude/commands/workflows/research.md +0 -0
  246. package/packages/@monomind/cli/.claude/commands/workflows/workflow-create.md +0 -0
  247. package/packages/@monomind/cli/.claude/commands/workflows/workflow-execute.md +0 -0
  248. package/packages/@monomind/cli/.claude/commands/workflows/workflow-export.md +0 -0
  249. package/packages/@monomind/cli/.claude/helpers/build-skill-registry.cjs +0 -0
  250. package/packages/@monomind/cli/.claude/helpers/control-start.cjs +0 -0
  251. package/packages/@monomind/cli/.claude/helpers/control-stop.cjs +0 -0
  252. package/packages/@monomind/cli/.claude/helpers/event-logger.cjs +0 -0
  253. package/packages/@monomind/cli/.claude/helpers/graphify-freshen.cjs +0 -0
  254. package/packages/@monomind/cli/.claude/helpers/handlers/adr-draft-handler.cjs +0 -0
  255. package/packages/@monomind/cli/.claude/helpers/handlers/agent-start-handler.cjs +0 -0
  256. package/packages/@monomind/cli/.claude/helpers/handlers/budget-status-handler.cjs +0 -0
  257. package/packages/@monomind/cli/.claude/helpers/handlers/capture-handler.cjs +0 -0
  258. package/packages/@monomind/cli/.claude/helpers/handlers/compact-handler.cjs +0 -0
  259. package/packages/@monomind/cli/.claude/helpers/handlers/edit-handler.cjs +0 -0
  260. package/packages/@monomind/cli/.claude/helpers/handlers/gates-handler.cjs +0 -0
  261. package/packages/@monomind/cli/.claude/helpers/handlers/graph-status-handler.cjs +0 -0
  262. package/packages/@monomind/cli/.claude/helpers/handlers/loops-status-handler.cjs +0 -0
  263. package/packages/@monomind/cli/.claude/helpers/handlers/route-handler.cjs +0 -0
  264. package/packages/@monomind/cli/.claude/helpers/handlers/session-handler.cjs +0 -0
  265. package/packages/@monomind/cli/.claude/helpers/handlers/session-restore-handler.cjs +0 -0
  266. package/packages/@monomind/cli/.claude/helpers/handlers/stats-handler.cjs +0 -0
  267. package/packages/@monomind/cli/.claude/helpers/handlers/task-handler.cjs +0 -0
  268. package/packages/@monomind/cli/.claude/helpers/intelligence.cjs +0 -0
  269. package/packages/@monomind/cli/.claude/helpers/learning-service.mjs +0 -0
  270. package/packages/@monomind/cli/.claude/helpers/loop-tracker.cjs +0 -0
  271. package/packages/@monomind/cli/.claude/helpers/mastermind-activate.cjs +0 -0
  272. package/packages/@monomind/cli/.claude/helpers/memory-palace.cjs +0 -0
  273. package/packages/@monomind/cli/.claude/helpers/memory.cjs +0 -0
  274. package/packages/@monomind/cli/.claude/helpers/metrics-db.mjs +0 -0
  275. package/packages/@monomind/cli/.claude/helpers/monolean-activate.cjs +0 -0
  276. package/packages/@monomind/cli/.claude/helpers/monolean-config.cjs +0 -0
  277. package/packages/@monomind/cli/.claude/helpers/monolean-instructions.cjs +0 -0
  278. package/packages/@monomind/cli/.claude/helpers/monolean-propagate.cjs +0 -0
  279. package/packages/@monomind/cli/.claude/helpers/monolean-tracker.cjs +0 -0
  280. package/packages/@monomind/cli/.claude/helpers/router.cjs +0 -0
  281. package/packages/@monomind/cli/.claude/helpers/session.cjs +0 -0
  282. package/packages/@monomind/cli/.claude/helpers/skill-registry.json +0 -0
  283. package/packages/@monomind/cli/.claude/helpers/statusline.cjs +0 -0
  284. package/packages/@monomind/cli/.claude/helpers/toggle-statusline.cjs +0 -0
  285. package/packages/@monomind/cli/.claude/helpers/token-tracker.cjs +0 -0
  286. package/packages/@monomind/cli/.claude/helpers/utils/agent-registrations.cjs +0 -0
  287. package/packages/@monomind/cli/.claude/helpers/utils/fs-helpers.cjs +0 -0
  288. package/packages/@monomind/cli/.claude/helpers/utils/micro-agents.cjs +0 -0
  289. package/packages/@monomind/cli/.claude/helpers/utils/monograph.cjs +16 -1
  290. package/packages/@monomind/cli/.claude/helpers/utils/system-pressure.cjs +0 -0
  291. package/packages/@monomind/cli/.claude/helpers/utils/telemetry.cjs +0 -0
  292. package/packages/@monomind/cli/.claude/settings.json +0 -0
  293. package/packages/@monomind/cli/.claude/skills/agent-browser-testing/SKILL.md +0 -0
  294. package/packages/@monomind/cli/.claude/skills/agentic-jujutsu/SKILL.md +0 -0
  295. package/packages/@monomind/cli/.claude/skills/github-issue-triage/SKILL.md +0 -0
  296. package/packages/@monomind/cli/.claude/skills/github-repo-recap/SKILL.md +0 -0
  297. package/packages/@monomind/cli/.claude/skills/github-toolkit/SKILL.md +60 -0
  298. package/packages/@monomind/cli/.claude/skills/hive-mind-advanced/SKILL.md +0 -0
  299. package/packages/@monomind/cli/.claude/skills/hooks-automation/SKILL.md +0 -0
  300. package/packages/@monomind/cli/.claude/skills/mastermind-access/SKILL.md +0 -0
  301. package/packages/@monomind/cli/.claude/skills/mastermind-activity/SKILL.md +0 -0
  302. package/packages/@monomind/cli/.claude/skills/mastermind-adapter-manager/SKILL.md +0 -0
  303. package/packages/@monomind/cli/.claude/skills/mastermind-adapters/SKILL.md +0 -0
  304. package/packages/@monomind/cli/.claude/skills/mastermind-agent-detail/SKILL.md +0 -0
  305. package/packages/@monomind/cli/.claude/skills/mastermind-agent-select/SKILL.md +0 -0
  306. package/packages/@monomind/cli/.claude/skills/mastermind-agents/SKILL.md +0 -0
  307. package/packages/@monomind/cli/.claude/skills/mastermind-approval-detail/SKILL.md +0 -0
  308. package/packages/@monomind/cli/.claude/skills/mastermind-approvev1/SKILL.md +0 -0
  309. package/packages/@monomind/cli/.claude/skills/mastermind-architect/SKILL.md +0 -0
  310. package/packages/@monomind/cli/.claude/skills/mastermind-autodev/SKILL.md +0 -0
  311. package/packages/@monomind/cli/.claude/skills/mastermind-backup/SKILL.md +0 -0
  312. package/packages/@monomind/cli/.claude/skills/mastermind-bootstrap/SKILL.md +0 -0
  313. package/packages/@monomind/cli/.claude/skills/mastermind-budgets/SKILL.md +0 -0
  314. package/packages/@monomind/cli/.claude/skills/mastermind-build/SKILL.md +0 -0
  315. package/packages/@monomind/cli/.claude/skills/mastermind-companies/SKILL.md +0 -0
  316. package/packages/@monomind/cli/.claude/skills/mastermind-content/SKILL.md +0 -0
  317. package/packages/@monomind/cli/.claude/skills/mastermind-costs/SKILL.md +0 -0
  318. package/packages/@monomind/cli/.claude/skills/mastermind-createorg/SKILL.md +0 -0
  319. package/packages/@monomind/cli/.claude/skills/mastermind-debug/SKILL.md +0 -0
  320. package/packages/@monomind/cli/.claude/skills/mastermind-delegation/SKILL.md +0 -0
  321. package/packages/@monomind/cli/.claude/skills/mastermind-design/SKILL.md +0 -0
  322. package/packages/@monomind/cli/.claude/skills/mastermind-diagnose/SKILL.md +0 -0
  323. package/packages/@monomind/cli/.claude/skills/mastermind-env/SKILL.md +0 -0
  324. package/packages/@monomind/cli/.claude/skills/mastermind-environments/SKILL.md +0 -0
  325. package/packages/@monomind/cli/.claude/skills/mastermind-execute/SKILL.md +0 -0
  326. package/packages/@monomind/cli/.claude/skills/mastermind-export/SKILL.md +0 -0
  327. package/packages/@monomind/cli/.claude/skills/mastermind-finance/SKILL.md +0 -0
  328. package/packages/@monomind/cli/.claude/skills/mastermind-finish/SKILL.md +0 -0
  329. package/packages/@monomind/cli/.claude/skills/mastermind-goal-detail/SKILL.md +0 -0
  330. package/packages/@monomind/cli/.claude/skills/mastermind-goals/SKILL.md +0 -0
  331. package/packages/@monomind/cli/.claude/skills/mastermind-heartbeatv1/SKILL.md +0 -0
  332. package/packages/@monomind/cli/.claude/skills/mastermind-idea/SKILL.md +0 -0
  333. package/packages/@monomind/cli/.claude/skills/mastermind-import/SKILL.md +0 -0
  334. package/packages/@monomind/cli/.claude/skills/mastermind-inbox/SKILL.md +0 -0
  335. package/packages/@monomind/cli/.claude/skills/mastermind-instance/SKILL.md +0 -0
  336. package/packages/@monomind/cli/.claude/skills/mastermind-instance-settings/SKILL.md +0 -0
  337. package/packages/@monomind/cli/.claude/skills/mastermind-intake/SKILL.md +0 -0
  338. package/packages/@monomind/cli/.claude/skills/mastermind-invite-landing/SKILL.md +0 -0
  339. package/packages/@monomind/cli/.claude/skills/mastermind-invites/SKILL.md +0 -0
  340. package/packages/@monomind/cli/.claude/skills/mastermind-issue-detail/SKILL.md +0 -0
  341. package/packages/@monomind/cli/.claude/skills/mastermind-issues/SKILL.md +0 -0
  342. package/packages/@monomind/cli/.claude/skills/mastermind-join-queue/SKILL.md +0 -0
  343. package/packages/@monomind/cli/.claude/skills/mastermind-liveness/SKILL.md +0 -0
  344. package/packages/@monomind/cli/.claude/skills/mastermind-marketing/SKILL.md +0 -0
  345. package/packages/@monomind/cli/.claude/skills/mastermind-marketing/references/copywriting-frameworks.md +0 -0
  346. package/packages/@monomind/cli/.claude/skills/mastermind-marketing/references/persuasion-psychology.md +0 -0
  347. package/packages/@monomind/cli/.claude/skills/mastermind-memory/SKILL.md +0 -0
  348. package/packages/@monomind/cli/.claude/skills/mastermind-monitor/SKILL.md +0 -0
  349. package/packages/@monomind/cli/.claude/skills/mastermind-monotask/SKILL.md +0 -0
  350. package/packages/@monomind/cli/.claude/skills/mastermind-my-issues/SKILL.md +0 -0
  351. package/packages/@monomind/cli/.claude/skills/mastermind-new-agent/SKILL.md +0 -0
  352. package/packages/@monomind/cli/.claude/skills/mastermind-ops/SKILL.md +0 -0
  353. package/packages/@monomind/cli/.claude/skills/mastermind-org-chart/SKILL.md +0 -0
  354. package/packages/@monomind/cli/.claude/skills/mastermind-org-settings/SKILL.md +0 -0
  355. package/packages/@monomind/cli/.claude/skills/mastermind-orgs/SKILL.md +0 -0
  356. package/packages/@monomind/cli/.claude/skills/mastermind-orgstatus/SKILL.md +0 -0
  357. package/packages/@monomind/cli/.claude/skills/mastermind-plan/SKILL.md +0 -0
  358. package/packages/@monomind/cli/.claude/skills/mastermind-plan-to-tasks/SKILL.md +0 -0
  359. package/packages/@monomind/cli/.claude/skills/mastermind-plugin-manager/SKILL.md +0 -0
  360. package/packages/@monomind/cli/.claude/skills/mastermind-plugin-settings/SKILL.md +0 -0
  361. package/packages/@monomind/cli/.claude/skills/mastermind-plugins/SKILL.md +0 -0
  362. package/packages/@monomind/cli/.claude/skills/mastermind-profile/SKILL.md +0 -0
  363. package/packages/@monomind/cli/.claude/skills/mastermind-project-detail/SKILL.md +0 -0
  364. package/packages/@monomind/cli/.claude/skills/mastermind-project-workspace/SKILL.md +0 -0
  365. package/packages/@monomind/cli/.claude/skills/mastermind-projects/SKILL.md +0 -0
  366. package/packages/@monomind/cli/.claude/skills/mastermind-protocol/SKILL.md +0 -0
  367. package/packages/@monomind/cli/.claude/skills/mastermind-receive-review/SKILL.md +0 -0
  368. package/packages/@monomind/cli/.claude/skills/mastermind-release/SKILL.md +0 -0
  369. package/packages/@monomind/cli/.claude/skills/mastermind-repeat/SKILL.md +0 -0
  370. package/packages/@monomind/cli/.claude/skills/mastermind-research/SKILL.md +0 -0
  371. package/packages/@monomind/cli/.claude/skills/mastermind-review/SKILL.md +0 -0
  372. package/packages/@monomind/cli/.claude/skills/mastermind-routine-detail/SKILL.md +0 -0
  373. package/packages/@monomind/cli/.claude/skills/mastermind-routines/SKILL.md +0 -0
  374. package/packages/@monomind/cli/.claude/skills/mastermind-runorg/SKILL.md +0 -0
  375. package/packages/@monomind/cli/.claude/skills/mastermind-runorgv1/SKILL.md +0 -0
  376. package/packages/@monomind/cli/.claude/skills/mastermind-sales/SKILL.md +0 -0
  377. package/packages/@monomind/cli/.claude/skills/mastermind-search/SKILL.md +0 -0
  378. package/packages/@monomind/cli/.claude/skills/mastermind-secrets/SKILL.md +0 -0
  379. package/packages/@monomind/cli/.claude/skills/mastermind-skill-builder/SKILL.md +0 -0
  380. package/packages/@monomind/cli/.claude/skills/mastermind-skills/SKILL.md +0 -0
  381. package/packages/@monomind/cli/.claude/skills/mastermind-stoporg/SKILL.md +0 -0
  382. package/packages/@monomind/cli/.claude/skills/mastermind-taskdev/SKILL.md +0 -0
  383. package/packages/@monomind/cli/.claude/skills/mastermind-taskdev/code-quality-reviewer-prompt.md +0 -0
  384. package/packages/@monomind/cli/.claude/skills/mastermind-taskdev/final-reviewer-prompt.md +0 -0
  385. package/packages/@monomind/cli/.claude/skills/mastermind-taskdev/implementer-prompt.md +0 -0
  386. package/packages/@monomind/cli/.claude/skills/mastermind-taskdev/spec-reviewer-prompt.md +0 -0
  387. package/packages/@monomind/cli/.claude/skills/mastermind-tasks/SKILL.md +0 -0
  388. package/packages/@monomind/cli/.claude/skills/mastermind-tdd/SKILL.md +0 -0
  389. package/packages/@monomind/cli/.claude/skills/mastermind-techport/SKILL.md +0 -0
  390. package/packages/@monomind/cli/.claude/skills/mastermind-threads/SKILL.md +0 -0
  391. package/packages/@monomind/cli/.claude/skills/mastermind-tree-control/SKILL.md +0 -0
  392. package/packages/@monomind/cli/.claude/skills/mastermind-verify/SKILL.md +0 -0
  393. package/packages/@monomind/cli/.claude/skills/mastermind-wiki/SKILL.md +0 -0
  394. package/packages/@monomind/cli/.claude/skills/mastermind-workspace-detail/SKILL.md +0 -0
  395. package/packages/@monomind/cli/.claude/skills/mastermind-workspaces/SKILL.md +0 -0
  396. package/packages/@monomind/cli/.claude/skills/mastermind-worktree/SKILL.md +0 -0
  397. package/packages/@monomind/cli/.claude/skills/memory-toolkit/SKILL.md +75 -0
  398. package/packages/@monomind/cli/.claude/skills/monodesign/SKILL.md +257 -0
  399. package/packages/@monomind/cli/.claude/skills/monodesign/adapt.md +53 -0
  400. package/packages/@monomind/cli/.claude/skills/monodesign/agents/monodesign-asset-producer.md +100 -0
  401. package/packages/@monomind/cli/.claude/skills/monodesign/agents/monodesign-manual-edit-applier.md +103 -0
  402. package/packages/@monomind/cli/.claude/skills/monodesign/animate.md +65 -0
  403. package/packages/@monomind/cli/.claude/skills/monodesign/audit.md +89 -0
  404. package/packages/@monomind/cli/.claude/skills/monodesign/bolder.md +50 -0
  405. package/packages/@monomind/cli/.claude/skills/monodesign/clarify.md +64 -0
  406. package/packages/@monomind/cli/.claude/skills/monodesign/colorize.md +68 -0
  407. package/packages/@monomind/cli/.claude/skills/monodesign/craft.md +51 -0
  408. package/packages/@monomind/cli/.claude/skills/monodesign/critique.md +66 -0
  409. package/packages/@monomind/cli/.claude/skills/monodesign/delight.md +47 -0
  410. package/packages/@monomind/cli/.claude/skills/monodesign/distill.md +56 -0
  411. package/packages/@monomind/cli/.claude/skills/monodesign/document.md +83 -0
  412. package/packages/@monomind/cli/.claude/skills/monodesign/extract.md +74 -0
  413. package/packages/@monomind/cli/.claude/skills/monodesign/harden.md +65 -0
  414. package/packages/@monomind/cli/.claude/skills/monodesign/init.md +30 -0
  415. package/packages/@monomind/cli/.claude/skills/monodesign/layout.md +36 -0
  416. package/packages/@monomind/cli/.claude/skills/monodesign/live.md +34 -0
  417. package/packages/@monomind/cli/.claude/skills/monodesign/onboard.md +50 -0
  418. package/packages/@monomind/cli/.claude/skills/monodesign/optimize.md +64 -0
  419. package/packages/@monomind/cli/.claude/skills/monodesign/overdrive.md +56 -0
  420. package/packages/@monomind/cli/.claude/skills/monodesign/polish.md +68 -0
  421. package/packages/@monomind/cli/.claude/skills/monodesign/quieter.md +57 -0
  422. package/packages/@monomind/cli/.claude/skills/monodesign/reference/adapt.md +312 -0
  423. package/packages/@monomind/cli/.claude/skills/monodesign/reference/adapt.native.md +58 -0
  424. package/packages/@monomind/cli/.claude/skills/monodesign/reference/android.md +40 -0
  425. package/packages/@monomind/cli/.claude/skills/monodesign/reference/animate.md +203 -0
  426. package/packages/@monomind/cli/.claude/skills/monodesign/reference/antipatterns-catalog.md +410 -0
  427. package/packages/@monomind/cli/.claude/skills/monodesign/reference/audit.md +135 -0
  428. package/packages/@monomind/cli/.claude/skills/monodesign/reference/audit.native.md +139 -0
  429. package/packages/@monomind/cli/.claude/skills/monodesign/reference/bolder.md +120 -0
  430. package/packages/@monomind/cli/.claude/skills/monodesign/reference/brand-workflow.md +180 -0
  431. package/packages/@monomind/cli/.claude/skills/monodesign/reference/brand.md +108 -0
  432. package/packages/@monomind/cli/.claude/skills/monodesign/reference/clarify.md +288 -0
  433. package/packages/@monomind/cli/.claude/skills/monodesign/reference/codex.md +105 -0
  434. package/packages/@monomind/cli/.claude/skills/monodesign/reference/cognitive-load.md +106 -0
  435. package/packages/@monomind/cli/.claude/skills/monodesign/reference/color-and-contrast.md +105 -0
  436. package/packages/@monomind/cli/.claude/skills/monodesign/reference/colorize.md +257 -0
  437. package/packages/@monomind/cli/.claude/skills/monodesign/reference/component-specs.md +260 -0
  438. package/packages/@monomind/cli/.claude/skills/monodesign/reference/component-states.md +274 -0
  439. package/packages/@monomind/cli/.claude/skills/monodesign/reference/component-system.md +358 -0
  440. package/packages/@monomind/cli/.claude/skills/monodesign/reference/copy-formulas.md +160 -0
  441. package/packages/@monomind/cli/.claude/skills/monodesign/reference/craft.md +123 -0
  442. package/packages/@monomind/cli/.claude/skills/monodesign/reference/critique.md +780 -0
  443. package/packages/@monomind/cli/.claude/skills/monodesign/reference/delight.md +302 -0
  444. package/packages/@monomind/cli/.claude/skills/monodesign/reference/design-principles.md +246 -0
  445. package/packages/@monomind/cli/.claude/skills/monodesign/reference/distill.md +111 -0
  446. package/packages/@monomind/cli/.claude/skills/monodesign/reference/document.md +429 -0
  447. package/packages/@monomind/cli/.claude/skills/monodesign/reference/extract.md +69 -0
  448. package/packages/@monomind/cli/.claude/skills/monodesign/reference/harden.md +347 -0
  449. package/packages/@monomind/cli/.claude/skills/monodesign/reference/heuristics-scoring.md +234 -0
  450. package/packages/@monomind/cli/.claude/skills/monodesign/reference/hooks.md +92 -0
  451. package/packages/@monomind/cli/.claude/skills/monodesign/reference/image-prompts.md +130 -0
  452. package/packages/@monomind/cli/.claude/skills/monodesign/reference/init.md +221 -0
  453. package/packages/@monomind/cli/.claude/skills/monodesign/reference/interaction-design.md +189 -0
  454. package/packages/@monomind/cli/.claude/skills/monodesign/reference/ios.md +45 -0
  455. package/packages/@monomind/cli/.claude/skills/monodesign/reference/layout.md +185 -0
  456. package/packages/@monomind/cli/.claude/skills/monodesign/reference/live.md +710 -0
  457. package/packages/@monomind/cli/.claude/skills/monodesign/reference/motion-design.md +109 -0
  458. package/packages/@monomind/cli/.claude/skills/monodesign/reference/onboard.md +234 -0
  459. package/packages/@monomind/cli/.claude/skills/monodesign/reference/optimize.md +258 -0
  460. package/packages/@monomind/cli/.claude/skills/monodesign/reference/overdrive.md +130 -0
  461. package/packages/@monomind/cli/.claude/skills/monodesign/reference/personas.md +179 -0
  462. package/packages/@monomind/cli/.claude/skills/monodesign/reference/polish.md +241 -0
  463. package/packages/@monomind/cli/.claude/skills/monodesign/reference/pre-delivery-checklist.md +108 -0
  464. package/packages/@monomind/cli/.claude/skills/monodesign/reference/product.md +60 -0
  465. package/packages/@monomind/cli/.claude/skills/monodesign/reference/quieter.md +99 -0
  466. package/packages/@monomind/cli/.claude/skills/monodesign/reference/responsive-design.md +114 -0
  467. package/packages/@monomind/cli/.claude/skills/monodesign/reference/shape.md +165 -0
  468. package/packages/@monomind/cli/.claude/skills/monodesign/reference/spatial-design.md +100 -0
  469. package/packages/@monomind/cli/.claude/skills/monodesign/reference/teach.md +10 -0
  470. package/packages/@monomind/cli/.claude/skills/monodesign/reference/token-architecture.md +222 -0
  471. package/packages/@monomind/cli/.claude/skills/monodesign/reference/typeset.md +301 -0
  472. package/packages/@monomind/cli/.claude/skills/monodesign/reference/typography.md +159 -0
  473. package/packages/@monomind/cli/.claude/skills/monodesign/reference/ux-research.md +143 -0
  474. package/packages/@monomind/cli/.claude/skills/monodesign/reference/ux-rules.md +211 -0
  475. package/packages/@monomind/cli/.claude/skills/monodesign/reference/ux-writing.md +107 -0
  476. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/command-metadata.json +94 -0
  477. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/context-signals.mjs +260 -0
  478. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/context.mjs +1065 -0
  479. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/critique-storage.mjs +416 -0
  480. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detect-csp.mjs +198 -0
  481. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detect.mjs +33 -0
  482. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/browser/injected/index.mjs +1962 -0
  483. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/cli/main.mjs +321 -0
  484. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/design-system.mjs +814 -0
  485. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/detect-antipatterns-browser.js +5608 -0
  486. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/detect-antipatterns.mjs +50 -0
  487. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/engines/browser/detect-url.mjs +259 -0
  488. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/engines/browser/drivers.mjs +258 -0
  489. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/engines/regex/detect-text.mjs +636 -0
  490. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/engines/static-html/css-cascade.mjs +1015 -0
  491. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/engines/static-html/detect-html.mjs +253 -0
  492. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/engines/visual/screenshot-contrast.mjs +198 -0
  493. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/findings.mjs +12 -0
  494. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/fix/css-regions.mjs +181 -0
  495. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/fix/fixers.mjs +373 -0
  496. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/fix/index.mjs +426 -0
  497. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/node/file-system.mjs +198 -0
  498. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/profile/profiler.mjs +166 -0
  499. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/registry/antipatterns.mjs +563 -0
  500. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/rules/checks.mjs +3002 -0
  501. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/shared/color.mjs +124 -0
  502. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/shared/constants.mjs +101 -0
  503. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/shared/fonts.mjs +30 -0
  504. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/shared/inline-ignores.mjs +148 -0
  505. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/shared/page.mjs +7 -0
  506. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/hook-admin.mjs +661 -0
  507. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/hook-before-edit.mjs +516 -0
  508. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/hook-lib.mjs +1776 -0
  509. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/hook.mjs +61 -0
  510. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/lib/design-parser.mjs +842 -0
  511. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/lib/is-generated.mjs +69 -0
  512. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/lib/monodesign-config.mjs +640 -0
  513. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/lib/monodesign-paths.mjs +129 -0
  514. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/lib/provider.mjs +4 -0
  515. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/lib/target-args.mjs +42 -0
  516. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/browser-script-parts.mjs +50 -0
  517. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/completion.mjs +19 -0
  518. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/event-validation.mjs +137 -0
  519. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/insert-ui.mjs +458 -0
  520. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/manual-apply.mjs +939 -0
  521. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/manual-edit-routes.mjs +357 -0
  522. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/manual-edits-buffer.mjs +152 -0
  523. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/session-store.mjs +293 -0
  524. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/svelte-component.mjs +826 -0
  525. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +274 -0
  526. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/ui-core.mjs +180 -0
  527. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/vocabulary.mjs +36 -0
  528. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-accept.mjs +812 -0
  529. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-browser-dom.js +146 -0
  530. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-browser-session.js +123 -0
  531. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-browser.js +11240 -0
  532. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-commit-manual-edits.mjs +1241 -0
  533. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-complete.mjs +75 -0
  534. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-copy-edit-agent.mjs +683 -0
  535. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-discard-manual-edits.mjs +51 -0
  536. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-inject.mjs +583 -0
  537. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-insert.mjs +272 -0
  538. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-manual-edit-evidence.mjs +363 -0
  539. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-poll.mjs +384 -0
  540. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-resume.mjs +94 -0
  541. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-server.mjs +1174 -0
  542. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-status.mjs +61 -0
  543. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-target.mjs +30 -0
  544. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-wrap.mjs +894 -0
  545. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live.mjs +297 -0
  546. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/modern-screenshot.umd.js +14 -0
  547. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/palette.mjs +633 -0
  548. package/packages/@monomind/cli/.claude/skills/monodesign/scripts/pin.mjs +221 -0
  549. package/packages/@monomind/cli/.claude/skills/monodesign/shape.md +71 -0
  550. package/packages/@monomind/cli/.claude/skills/monodesign/teach.md +18 -0
  551. package/packages/@monomind/cli/.claude/skills/monodesign/typeset.md +59 -0
  552. package/packages/@monomind/cli/.claude/skills/monolean/SKILL.md +0 -0
  553. package/packages/@monomind/cli/.claude/skills/monolean-audit/SKILL.md +0 -0
  554. package/packages/@monomind/cli/.claude/skills/monolean-debt/SKILL.md +0 -0
  555. package/packages/@monomind/cli/.claude/skills/monolean-help/SKILL.md +0 -0
  556. package/packages/@monomind/cli/.claude/skills/monolean-review/SKILL.md +0 -0
  557. package/packages/@monomind/cli/.claude/skills/monomind/browse-agentcore.md +0 -0
  558. package/packages/@monomind/cli/.claude/skills/monomind/browse-electron.md +0 -0
  559. package/packages/@monomind/cli/.claude/skills/monomind/browse-qa.md +0 -0
  560. package/packages/@monomind/cli/.claude/skills/monomind/browse-references/authentication.md +0 -0
  561. package/packages/@monomind/cli/.claude/skills/monomind/browse-references/trust-boundaries.md +0 -0
  562. package/packages/@monomind/cli/.claude/skills/monomind/browse-references/video-recording.md +0 -0
  563. package/packages/@monomind/cli/.claude/skills/monomind/browse-slack.md +0 -0
  564. package/packages/@monomind/cli/.claude/skills/monomind/browse-vercel.md +0 -0
  565. package/packages/@monomind/cli/.claude/skills/monomind/browse.md +0 -0
  566. package/packages/@monomind/cli/.claude/skills/monomotion/SKILL.md +0 -0
  567. package/packages/@monomind/cli/.claude/skills/monomotion/rules/api-control.md +0 -0
  568. package/packages/@monomind/cli/.claude/skills/monomotion/rules/effects.md +0 -0
  569. package/packages/@monomind/cli/.claude/skills/monomotion/rules/integration.md +0 -0
  570. package/packages/@monomind/cli/.claude/skills/monomotion/rules/scroll.md +0 -0
  571. package/packages/@monomind/cli/.claude/skills/monomotion/rules/sequencing.md +0 -0
  572. package/packages/@monomind/cli/.claude/skills/monomotion/rules/svg.md +0 -0
  573. package/packages/@monomind/cli/.claude/skills/monomotion/rules/text.md +0 -0
  574. package/packages/@monomind/cli/.claude/skills/pair-programming/SKILL.md +0 -0
  575. package/packages/@monomind/cli/.claude/skills/performance-analysis/SKILL.md +0 -0
  576. package/packages/@monomind/cli/.claude/skills/skill-builder/SKILL.md +0 -0
  577. package/packages/@monomind/cli/.claude/skills/specialagent/SKILL.md +0 -0
  578. package/packages/@monomind/cli/.claude/skills/stop-slop/SKILL.md +0 -0
  579. package/packages/@monomind/cli/.claude/skills/stop-slop/references/examples.md +0 -0
  580. package/packages/@monomind/cli/.claude/skills/stop-slop/references/phrases.md +0 -0
  581. package/packages/@monomind/cli/.claude/skills/stop-slop/references/structures.md +0 -0
  582. package/packages/@monomind/cli/.claude/skills/swarm-advanced/SKILL.md +0 -0
  583. package/packages/@monomind/cli/.claude/skills/swarm-orchestration/SKILL.md +0 -0
  584. package/packages/@monomind/cli/.claude/skills/verification-quality/SKILL.md +0 -0
  585. package/packages/@monomind/cli/README.md +0 -0
  586. package/packages/@monomind/cli/bin/preinstall.cjs +0 -0
  587. package/packages/@monomind/cli/dist/src/agents/registry-builder.d.ts +0 -0
  588. package/packages/@monomind/cli/dist/src/agents/registry-builder.js +0 -0
  589. package/packages/@monomind/cli/dist/src/autopilot-state.d.ts +0 -0
  590. package/packages/@monomind/cli/dist/src/autopilot-state.js +0 -0
  591. package/packages/@monomind/cli/dist/src/browser/action-builder/analyzer.d.ts +0 -0
  592. package/packages/@monomind/cli/dist/src/browser/action-builder/analyzer.js +0 -0
  593. package/packages/@monomind/cli/dist/src/browser/action-builder/types.d.ts +0 -0
  594. package/packages/@monomind/cli/dist/src/browser/action-builder/types.js +0 -0
  595. package/packages/@monomind/cli/dist/src/browser/adapters/gemini.d.ts +0 -0
  596. package/packages/@monomind/cli/dist/src/browser/adapters/gemini.js +0 -0
  597. package/packages/@monomind/cli/dist/src/browser/adapters/index.d.ts +0 -0
  598. package/packages/@monomind/cli/dist/src/browser/adapters/index.js +0 -0
  599. package/packages/@monomind/cli/dist/src/browser/adapters/instagram.d.ts +0 -0
  600. package/packages/@monomind/cli/dist/src/browser/adapters/instagram.js +0 -0
  601. package/packages/@monomind/cli/dist/src/browser/adapters/linkedin.d.ts +0 -0
  602. package/packages/@monomind/cli/dist/src/browser/adapters/linkedin.js +0 -0
  603. package/packages/@monomind/cli/dist/src/browser/adapters/x.d.ts +0 -0
  604. package/packages/@monomind/cli/dist/src/browser/adapters/x.js +0 -0
  605. package/packages/@monomind/cli/dist/src/browser/dashboard/server.d.ts +0 -0
  606. package/packages/@monomind/cli/dist/src/browser/dashboard/server.js +0 -0
  607. package/packages/@monomind/cli/dist/src/browser/dashboard/ui.html +0 -0
  608. package/packages/@monomind/cli/dist/src/browser/workflow/engine.d.ts +0 -0
  609. package/packages/@monomind/cli/dist/src/browser/workflow/engine.js +0 -0
  610. package/packages/@monomind/cli/dist/src/browser/workflow/expression.d.ts +0 -0
  611. package/packages/@monomind/cli/dist/src/browser/workflow/expression.js +0 -0
  612. package/packages/@monomind/cli/dist/src/browser/workflow/store.d.ts +0 -0
  613. package/packages/@monomind/cli/dist/src/browser/workflow/store.js +0 -0
  614. package/packages/@monomind/cli/dist/src/browser/workflow/types.d.ts +0 -0
  615. package/packages/@monomind/cli/dist/src/browser/workflow/types.js +0 -0
  616. package/packages/@monomind/cli/dist/src/capabilities/cap-code.d.ts +0 -0
  617. package/packages/@monomind/cli/dist/src/capabilities/cap-code.js +0 -0
  618. package/packages/@monomind/cli/dist/src/capabilities/cap-data.d.ts +0 -0
  619. package/packages/@monomind/cli/dist/src/capabilities/cap-data.js +0 -0
  620. package/packages/@monomind/cli/dist/src/capabilities/cap-documents.d.ts +0 -0
  621. package/packages/@monomind/cli/dist/src/capabilities/cap-documents.js +0 -0
  622. package/packages/@monomind/cli/dist/src/capabilities/cap-graph.d.ts +0 -0
  623. package/packages/@monomind/cli/dist/src/capabilities/cap-graph.js +0 -0
  624. package/packages/@monomind/cli/dist/src/capabilities/cap-media.d.ts +0 -0
  625. package/packages/@monomind/cli/dist/src/capabilities/cap-media.js +0 -0
  626. package/packages/@monomind/cli/dist/src/capabilities/cap-timeline.d.ts +0 -0
  627. package/packages/@monomind/cli/dist/src/capabilities/cap-timeline.js +0 -0
  628. package/packages/@monomind/cli/dist/src/capabilities/index.d.ts +0 -0
  629. package/packages/@monomind/cli/dist/src/capabilities/index.js +0 -0
  630. package/packages/@monomind/cli/dist/src/capabilities/manager.d.ts +0 -0
  631. package/packages/@monomind/cli/dist/src/capabilities/manager.js +0 -0
  632. package/packages/@monomind/cli/dist/src/capabilities/scanner.d.ts +0 -0
  633. package/packages/@monomind/cli/dist/src/capabilities/scanner.js +0 -0
  634. package/packages/@monomind/cli/dist/src/capabilities/types.d.ts +0 -0
  635. package/packages/@monomind/cli/dist/src/capabilities/types.js +0 -0
  636. package/packages/@monomind/cli/dist/src/commands/agent-lifecycle.d.ts +0 -0
  637. package/packages/@monomind/cli/dist/src/commands/agent-lifecycle.js +0 -0
  638. package/packages/@monomind/cli/dist/src/commands/agent-ops.d.ts +0 -0
  639. package/packages/@monomind/cli/dist/src/commands/agent-ops.js +0 -0
  640. package/packages/@monomind/cli/dist/src/commands/agent.d.ts +0 -0
  641. package/packages/@monomind/cli/dist/src/commands/agent.js +0 -0
  642. package/packages/@monomind/cli/dist/src/commands/analyze-ast.d.ts +0 -0
  643. package/packages/@monomind/cli/dist/src/commands/analyze-ast.js +0 -0
  644. package/packages/@monomind/cli/dist/src/commands/analyze-diff.d.ts +0 -0
  645. package/packages/@monomind/cli/dist/src/commands/analyze-diff.js +0 -0
  646. package/packages/@monomind/cli/dist/src/commands/analyze-imports.d.ts +0 -0
  647. package/packages/@monomind/cli/dist/src/commands/analyze-imports.js +0 -0
  648. package/packages/@monomind/cli/dist/src/commands/analyze-symbols.d.ts +0 -0
  649. package/packages/@monomind/cli/dist/src/commands/analyze-symbols.js +0 -0
  650. package/packages/@monomind/cli/dist/src/commands/analyze.d.ts +0 -0
  651. package/packages/@monomind/cli/dist/src/commands/analyze.js +0 -0
  652. package/packages/@monomind/cli/dist/src/commands/autopilot.d.ts +0 -0
  653. package/packages/@monomind/cli/dist/src/commands/autopilot.js +0 -0
  654. package/packages/@monomind/cli/dist/src/commands/browse-action.d.ts +0 -0
  655. package/packages/@monomind/cli/dist/src/commands/browse-action.js +0 -0
  656. package/packages/@monomind/cli/dist/src/commands/browse-platform.d.ts +0 -0
  657. package/packages/@monomind/cli/dist/src/commands/browse-platform.js +0 -0
  658. package/packages/@monomind/cli/dist/src/commands/browse-workflow.d.ts +0 -0
  659. package/packages/@monomind/cli/dist/src/commands/browse-workflow.js +0 -0
  660. package/packages/@monomind/cli/dist/src/commands/browse.d.ts +0 -0
  661. package/packages/@monomind/cli/dist/src/commands/browse.js +0 -0
  662. package/packages/@monomind/cli/dist/src/commands/cleanup.d.ts +0 -0
  663. package/packages/@monomind/cli/dist/src/commands/cleanup.js +0 -0
  664. package/packages/@monomind/cli/dist/src/commands/completions.d.ts +0 -0
  665. package/packages/@monomind/cli/dist/src/commands/completions.js +0 -0
  666. package/packages/@monomind/cli/dist/src/commands/config.d.ts +0 -0
  667. package/packages/@monomind/cli/dist/src/commands/config.js +0 -0
  668. package/packages/@monomind/cli/dist/src/commands/crash-reporting.d.ts +0 -0
  669. package/packages/@monomind/cli/dist/src/commands/crash-reporting.js +0 -0
  670. package/packages/@monomind/cli/dist/src/commands/design-detect.d.ts +0 -0
  671. package/packages/@monomind/cli/dist/src/commands/design-detect.js +0 -0
  672. package/packages/@monomind/cli/dist/src/commands/design-palette.d.ts +0 -0
  673. package/packages/@monomind/cli/dist/src/commands/design-palette.js +0 -0
  674. package/packages/@monomind/cli/dist/src/commands/doc.d.ts +0 -0
  675. package/packages/@monomind/cli/dist/src/commands/doc.js +0 -0
  676. package/packages/@monomind/cli/dist/src/commands/doctor-env-checks.d.ts +0 -0
  677. package/packages/@monomind/cli/dist/src/commands/doctor-env-checks.js +0 -0
  678. package/packages/@monomind/cli/dist/src/commands/doctor-monoes-checks.d.ts +0 -0
  679. package/packages/@monomind/cli/dist/src/commands/doctor-monoes-checks.js +0 -0
  680. package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.d.ts +0 -0
  681. package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.js +0 -0
  682. package/packages/@monomind/cli/dist/src/commands/doctor.d.ts +0 -0
  683. package/packages/@monomind/cli/dist/src/commands/doctor.js +0 -0
  684. package/packages/@monomind/cli/dist/src/commands/guidance.d.ts +0 -0
  685. package/packages/@monomind/cli/dist/src/commands/guidance.js +0 -0
  686. package/packages/@monomind/cli/dist/src/commands/hooks-core-commands.d.ts +0 -0
  687. package/packages/@monomind/cli/dist/src/commands/hooks-core-commands.js +0 -0
  688. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-commands.d.ts +0 -0
  689. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-commands.js +0 -0
  690. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-gaps.d.ts +0 -0
  691. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-gaps.js +0 -0
  692. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-routing.d.ts +0 -0
  693. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-routing.js +0 -0
  694. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-utils.d.ts +0 -0
  695. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-utils.js +0 -0
  696. package/packages/@monomind/cli/dist/src/commands/hooks-extended-commands.d.ts +0 -0
  697. package/packages/@monomind/cli/dist/src/commands/hooks-extended-commands.js +0 -0
  698. package/packages/@monomind/cli/dist/src/commands/hooks-formatting.d.ts +0 -0
  699. package/packages/@monomind/cli/dist/src/commands/hooks-formatting.js +0 -0
  700. package/packages/@monomind/cli/dist/src/commands/hooks-routing-commands.d.ts +0 -0
  701. package/packages/@monomind/cli/dist/src/commands/hooks-routing-commands.js +0 -0
  702. package/packages/@monomind/cli/dist/src/commands/hooks-workers.d.ts +0 -0
  703. package/packages/@monomind/cli/dist/src/commands/hooks-workers.js +0 -0
  704. package/packages/@monomind/cli/dist/src/commands/hooks.d.ts +0 -0
  705. package/packages/@monomind/cli/dist/src/commands/hooks.js +0 -0
  706. package/packages/@monomind/cli/dist/src/commands/index.d.ts +0 -0
  707. package/packages/@monomind/cli/dist/src/commands/index.js +0 -0
  708. package/packages/@monomind/cli/dist/src/commands/init-subcommands.d.ts +0 -0
  709. package/packages/@monomind/cli/dist/src/commands/init-subcommands.js +0 -0
  710. package/packages/@monomind/cli/dist/src/commands/init-upgrade.d.ts +0 -0
  711. package/packages/@monomind/cli/dist/src/commands/init-upgrade.js +0 -0
  712. package/packages/@monomind/cli/dist/src/commands/init-wizard.d.ts +0 -0
  713. package/packages/@monomind/cli/dist/src/commands/init-wizard.js +0 -0
  714. package/packages/@monomind/cli/dist/src/commands/init.d.ts +0 -0
  715. package/packages/@monomind/cli/dist/src/commands/init.js +0 -0
  716. package/packages/@monomind/cli/dist/src/commands/mcp.d.ts +0 -0
  717. package/packages/@monomind/cli/dist/src/commands/mcp.js +0 -0
  718. package/packages/@monomind/cli/dist/src/commands/memory-admin.d.ts +0 -0
  719. package/packages/@monomind/cli/dist/src/commands/memory-admin.js +0 -0
  720. package/packages/@monomind/cli/dist/src/commands/memory-crud.d.ts +0 -0
  721. package/packages/@monomind/cli/dist/src/commands/memory-crud.js +0 -0
  722. package/packages/@monomind/cli/dist/src/commands/memory-list.d.ts +0 -0
  723. package/packages/@monomind/cli/dist/src/commands/memory-list.js +0 -0
  724. package/packages/@monomind/cli/dist/src/commands/memory-transfer.d.ts +0 -0
  725. package/packages/@monomind/cli/dist/src/commands/memory-transfer.js +0 -0
  726. package/packages/@monomind/cli/dist/src/commands/memory.d.ts +0 -0
  727. package/packages/@monomind/cli/dist/src/commands/memory.js +0 -0
  728. package/packages/@monomind/cli/dist/src/commands/monograph.d.ts +0 -0
  729. package/packages/@monomind/cli/dist/src/commands/monograph.js +0 -0
  730. package/packages/@monomind/cli/dist/src/commands/neural-core.d.ts +0 -0
  731. package/packages/@monomind/cli/dist/src/commands/neural-core.js +0 -0
  732. package/packages/@monomind/cli/dist/src/commands/neural-optimize.d.ts +0 -0
  733. package/packages/@monomind/cli/dist/src/commands/neural-optimize.js +0 -0
  734. package/packages/@monomind/cli/dist/src/commands/neural-registry.d.ts +0 -0
  735. package/packages/@monomind/cli/dist/src/commands/neural-registry.js +0 -0
  736. package/packages/@monomind/cli/dist/src/commands/org-observe.d.ts +0 -0
  737. package/packages/@monomind/cli/dist/src/commands/org-observe.js +0 -0
  738. package/packages/@monomind/cli/dist/src/commands/org.d.ts +0 -0
  739. package/packages/@monomind/cli/dist/src/commands/org.js +0 -0
  740. package/packages/@monomind/cli/dist/src/commands/performance.d.ts +0 -0
  741. package/packages/@monomind/cli/dist/src/commands/performance.js +0 -0
  742. package/packages/@monomind/cli/dist/src/commands/platforms.d.ts +0 -0
  743. package/packages/@monomind/cli/dist/src/commands/platforms.js +0 -0
  744. package/packages/@monomind/cli/dist/src/commands/providers.d.ts +0 -0
  745. package/packages/@monomind/cli/dist/src/commands/providers.js +0 -0
  746. package/packages/@monomind/cli/dist/src/commands/report-crash.d.ts +0 -0
  747. package/packages/@monomind/cli/dist/src/commands/report-crash.js +0 -0
  748. package/packages/@monomind/cli/dist/src/commands/route.d.ts +0 -0
  749. package/packages/@monomind/cli/dist/src/commands/route.js +0 -0
  750. package/packages/@monomind/cli/dist/src/commands/search-universal.d.ts +0 -0
  751. package/packages/@monomind/cli/dist/src/commands/search-universal.js +0 -0
  752. package/packages/@monomind/cli/dist/src/commands/security-cve.d.ts +0 -0
  753. package/packages/@monomind/cli/dist/src/commands/security-cve.js +0 -0
  754. package/packages/@monomind/cli/dist/src/commands/security-misc.d.ts +0 -0
  755. package/packages/@monomind/cli/dist/src/commands/security-misc.js +0 -0
  756. package/packages/@monomind/cli/dist/src/commands/security-scan.d.ts +0 -0
  757. package/packages/@monomind/cli/dist/src/commands/security-scan.js +0 -0
  758. package/packages/@monomind/cli/dist/src/commands/security.d.ts +0 -0
  759. package/packages/@monomind/cli/dist/src/commands/security.js +0 -0
  760. package/packages/@monomind/cli/dist/src/commands/session.d.ts +0 -0
  761. package/packages/@monomind/cli/dist/src/commands/session.js +0 -0
  762. package/packages/@monomind/cli/dist/src/commands/start.d.ts +0 -0
  763. package/packages/@monomind/cli/dist/src/commands/start.js +0 -0
  764. package/packages/@monomind/cli/dist/src/commands/status.d.ts +0 -0
  765. package/packages/@monomind/cli/dist/src/commands/status.js +0 -0
  766. package/packages/@monomind/cli/dist/src/commands/swarm.d.ts +0 -0
  767. package/packages/@monomind/cli/dist/src/commands/swarm.js +0 -0
  768. package/packages/@monomind/cli/dist/src/commands/task.d.ts +0 -0
  769. package/packages/@monomind/cli/dist/src/commands/task.js +0 -0
  770. package/packages/@monomind/cli/dist/src/commands/tokens.d.ts +0 -0
  771. package/packages/@monomind/cli/dist/src/commands/tokens.js +0 -0
  772. package/packages/@monomind/cli/dist/src/commands/update.d.ts +0 -0
  773. package/packages/@monomind/cli/dist/src/commands/update.js +0 -0
  774. package/packages/@monomind/cli/dist/src/consensus/audit-writer.d.ts +0 -0
  775. package/packages/@monomind/cli/dist/src/consensus/audit-writer.js +0 -0
  776. package/packages/@monomind/cli/dist/src/consensus/tally.d.ts +0 -0
  777. package/packages/@monomind/cli/dist/src/consensus/tally.js +0 -0
  778. package/packages/@monomind/cli/dist/src/index.d.ts +0 -0
  779. package/packages/@monomind/cli/dist/src/index.js +0 -0
  780. package/packages/@monomind/cli/dist/src/init/claudemd-generator.d.ts +0 -0
  781. package/packages/@monomind/cli/dist/src/init/claudemd-generator.js +0 -0
  782. package/packages/@monomind/cli/dist/src/init/executor.d.ts +0 -0
  783. package/packages/@monomind/cli/dist/src/init/executor.js +0 -0
  784. package/packages/@monomind/cli/dist/src/init/helpers-generator.d.ts +0 -0
  785. package/packages/@monomind/cli/dist/src/init/helpers-generator.js +0 -0
  786. package/packages/@monomind/cli/dist/src/init/index.d.ts +0 -0
  787. package/packages/@monomind/cli/dist/src/init/index.js +0 -0
  788. package/packages/@monomind/cli/dist/src/init/mcp-generator.d.ts +0 -0
  789. package/packages/@monomind/cli/dist/src/init/mcp-generator.js +0 -0
  790. package/packages/@monomind/cli/dist/src/init/settings-generator.d.ts +0 -0
  791. package/packages/@monomind/cli/dist/src/init/settings-generator.js +0 -0
  792. package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.d.ts +0 -0
  793. package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.js +0 -0
  794. package/packages/@monomind/cli/dist/src/init/statusline-generator.d.ts +0 -0
  795. package/packages/@monomind/cli/dist/src/init/statusline-generator.js +0 -0
  796. package/packages/@monomind/cli/dist/src/init/types.d.ts +0 -0
  797. package/packages/@monomind/cli/dist/src/init/types.js +0 -0
  798. package/packages/@monomind/cli/dist/src/knowledge/document-pipeline.d.ts +0 -0
  799. package/packages/@monomind/cli/dist/src/knowledge/document-pipeline.js +0 -0
  800. package/packages/@monomind/cli/dist/src/mcp-client.d.ts +0 -0
  801. package/packages/@monomind/cli/dist/src/mcp-client.js +0 -0
  802. package/packages/@monomind/cli/dist/src/mcp-server.d.ts +0 -0
  803. package/packages/@monomind/cli/dist/src/mcp-server.js +0 -0
  804. package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.d.ts +0 -0
  805. package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +0 -0
  806. package/packages/@monomind/cli/dist/src/mcp-tools/analyze-tools.d.ts +0 -0
  807. package/packages/@monomind/cli/dist/src/mcp-tools/analyze-tools.js +0 -0
  808. package/packages/@monomind/cli/dist/src/mcp-tools/auto-install.d.ts +0 -0
  809. package/packages/@monomind/cli/dist/src/mcp-tools/auto-install.js +0 -0
  810. package/packages/@monomind/cli/dist/src/mcp-tools/autopilot-tools.d.ts +0 -0
  811. package/packages/@monomind/cli/dist/src/mcp-tools/autopilot-tools.js +0 -0
  812. package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.d.ts +0 -0
  813. package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.js +0 -0
  814. package/packages/@monomind/cli/dist/src/mcp-tools/claims-tools.d.ts +0 -0
  815. package/packages/@monomind/cli/dist/src/mcp-tools/claims-tools.js +0 -0
  816. package/packages/@monomind/cli/dist/src/mcp-tools/config-tools.d.ts +0 -0
  817. package/packages/@monomind/cli/dist/src/mcp-tools/config-tools.js +0 -0
  818. package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.d.ts +0 -0
  819. package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.js +0 -0
  820. package/packages/@monomind/cli/dist/src/mcp-tools/github-tools.d.ts +0 -0
  821. package/packages/@monomind/cli/dist/src/mcp-tools/github-tools.js +0 -0
  822. package/packages/@monomind/cli/dist/src/mcp-tools/graphify-tools.d.ts +0 -0
  823. package/packages/@monomind/cli/dist/src/mcp-tools/graphify-tools.js +0 -0
  824. package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.d.ts +0 -0
  825. package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +0 -0
  826. package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.d.ts +0 -0
  827. package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +0 -0
  828. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-embedding.d.ts +0 -0
  829. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-embedding.js +0 -0
  830. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-intelligence.d.ts +0 -0
  831. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-intelligence.js +0 -0
  832. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.d.ts +0 -0
  833. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.js +0 -0
  834. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.d.ts +0 -0
  835. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +0 -0
  836. package/packages/@monomind/cli/dist/src/mcp-tools/index.d.ts +0 -0
  837. package/packages/@monomind/cli/dist/src/mcp-tools/index.js +0 -0
  838. package/packages/@monomind/cli/dist/src/mcp-tools/knowledge-tools.d.ts +0 -0
  839. package/packages/@monomind/cli/dist/src/mcp-tools/knowledge-tools.js +0 -0
  840. package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.d.ts +0 -0
  841. package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +0 -0
  842. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-compat.d.ts +0 -0
  843. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-compat.js +0 -0
  844. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.d.ts +0 -0
  845. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +0 -0
  846. package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.d.ts +0 -0
  847. package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +0 -0
  848. package/packages/@monomind/cli/dist/src/mcp-tools/performance-tools.d.ts +0 -0
  849. package/packages/@monomind/cli/dist/src/mcp-tools/performance-tools.js +0 -0
  850. package/packages/@monomind/cli/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.d.ts +0 -0
  851. package/packages/@monomind/cli/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.js +0 -0
  852. package/packages/@monomind/cli/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts +0 -0
  853. package/packages/@monomind/cli/dist/src/mcp-tools/quality/security-compliance/detect-secrets.js +0 -0
  854. package/packages/@monomind/cli/dist/src/mcp-tools/quality-tools.d.ts +0 -0
  855. package/packages/@monomind/cli/dist/src/mcp-tools/quality-tools.js +0 -0
  856. package/packages/@monomind/cli/dist/src/mcp-tools/request-tracker.d.ts +0 -0
  857. package/packages/@monomind/cli/dist/src/mcp-tools/request-tracker.js +0 -0
  858. package/packages/@monomind/cli/dist/src/mcp-tools/security-tools.d.ts +0 -0
  859. package/packages/@monomind/cli/dist/src/mcp-tools/security-tools.js +0 -0
  860. package/packages/@monomind/cli/dist/src/mcp-tools/session-tools.d.ts +0 -0
  861. package/packages/@monomind/cli/dist/src/mcp-tools/session-tools.js +0 -0
  862. package/packages/@monomind/cli/dist/src/mcp-tools/swarm-tools.d.ts +0 -0
  863. package/packages/@monomind/cli/dist/src/mcp-tools/swarm-tools.js +0 -0
  864. package/packages/@monomind/cli/dist/src/mcp-tools/system-tools.d.ts +0 -0
  865. package/packages/@monomind/cli/dist/src/mcp-tools/system-tools.js +0 -0
  866. package/packages/@monomind/cli/dist/src/mcp-tools/task-tools.d.ts +0 -0
  867. package/packages/@monomind/cli/dist/src/mcp-tools/task-tools.js +0 -0
  868. package/packages/@monomind/cli/dist/src/mcp-tools/terminal-tools.d.ts +0 -0
  869. package/packages/@monomind/cli/dist/src/mcp-tools/terminal-tools.js +0 -0
  870. package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.d.ts +0 -0
  871. package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +0 -0
  872. package/packages/@monomind/cli/dist/src/mcp-tools/types.d.ts +0 -0
  873. package/packages/@monomind/cli/dist/src/mcp-tools/types.js +0 -0
  874. package/packages/@monomind/cli/dist/src/memory/embedding-operations.d.ts +0 -0
  875. package/packages/@monomind/cli/dist/src/memory/embedding-operations.js +0 -0
  876. package/packages/@monomind/cli/dist/src/memory/ewc-consolidation.d.ts +0 -0
  877. package/packages/@monomind/cli/dist/src/memory/ewc-consolidation.js +0 -0
  878. package/packages/@monomind/cli/dist/src/memory/hnsw-operations.d.ts +0 -0
  879. package/packages/@monomind/cli/dist/src/memory/hnsw-operations.js +0 -0
  880. package/packages/@monomind/cli/dist/src/memory/intelligence.d.ts +0 -0
  881. package/packages/@monomind/cli/dist/src/memory/intelligence.js +0 -0
  882. package/packages/@monomind/cli/dist/src/memory/memory-bridge.d.ts +0 -0
  883. package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +0 -0
  884. package/packages/@monomind/cli/dist/src/memory/memory-crud.d.ts +0 -0
  885. package/packages/@monomind/cli/dist/src/memory/memory-crud.js +0 -0
  886. package/packages/@monomind/cli/dist/src/memory/memory-initializer.d.ts +0 -0
  887. package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +0 -0
  888. package/packages/@monomind/cli/dist/src/memory/memory-kg.d.ts +0 -0
  889. package/packages/@monomind/cli/dist/src/memory/memory-kg.js +0 -0
  890. package/packages/@monomind/cli/dist/src/memory/memory-migrations.d.ts +0 -0
  891. package/packages/@monomind/cli/dist/src/memory/memory-migrations.js +0 -0
  892. package/packages/@monomind/cli/dist/src/memory/memory-read.d.ts +0 -0
  893. package/packages/@monomind/cli/dist/src/memory/memory-read.js +0 -0
  894. package/packages/@monomind/cli/dist/src/memory/memory-schema.d.ts +0 -0
  895. package/packages/@monomind/cli/dist/src/memory/memory-schema.js +0 -0
  896. package/packages/@monomind/cli/dist/src/memory/query-router.d.ts +0 -0
  897. package/packages/@monomind/cli/dist/src/memory/query-router.js +0 -0
  898. package/packages/@monomind/cli/dist/src/memory/sona-optimizer.d.ts +0 -0
  899. package/packages/@monomind/cli/dist/src/memory/sona-optimizer.js +0 -0
  900. package/packages/@monomind/cli/dist/src/monovector/command-outcomes.d.ts +0 -0
  901. package/packages/@monomind/cli/dist/src/monovector/command-outcomes.js +0 -0
  902. package/packages/@monomind/cli/dist/src/monovector/coverage-router.d.ts +0 -0
  903. package/packages/@monomind/cli/dist/src/monovector/coverage-router.js +0 -0
  904. package/packages/@monomind/cli/dist/src/monovector/coverage-tools.d.ts +0 -0
  905. package/packages/@monomind/cli/dist/src/monovector/coverage-tools.js +0 -0
  906. package/packages/@monomind/cli/dist/src/monovector/diff-classifier.d.ts +0 -0
  907. package/packages/@monomind/cli/dist/src/monovector/diff-classifier.js +0 -0
  908. package/packages/@monomind/cli/dist/src/monovector/index.d.ts +0 -0
  909. package/packages/@monomind/cli/dist/src/monovector/index.js +0 -0
  910. package/packages/@monomind/cli/dist/src/monovector/init-state.d.ts +0 -0
  911. package/packages/@monomind/cli/dist/src/monovector/init-state.js +0 -0
  912. package/packages/@monomind/cli/dist/src/monovector/route-outcomes.d.ts +0 -0
  913. package/packages/@monomind/cli/dist/src/monovector/route-outcomes.js +0 -0
  914. package/packages/@monomind/cli/dist/src/observability/replay-reader.d.ts +0 -0
  915. package/packages/@monomind/cli/dist/src/observability/replay-reader.js +0 -0
  916. package/packages/@monomind/cli/dist/src/orgrt/broker.d.ts +0 -0
  917. package/packages/@monomind/cli/dist/src/orgrt/broker.js +0 -0
  918. package/packages/@monomind/cli/dist/src/orgrt/bus.d.ts +0 -0
  919. package/packages/@monomind/cli/dist/src/orgrt/bus.js +0 -0
  920. package/packages/@monomind/cli/dist/src/orgrt/daemon.d.ts +0 -0
  921. package/packages/@monomind/cli/dist/src/orgrt/daemon.js +0 -0
  922. package/packages/@monomind/cli/dist/src/orgrt/forwarder.d.ts +0 -0
  923. package/packages/@monomind/cli/dist/src/orgrt/forwarder.js +0 -0
  924. package/packages/@monomind/cli/dist/src/orgrt/inbox.d.ts +0 -0
  925. package/packages/@monomind/cli/dist/src/orgrt/inbox.js +0 -0
  926. package/packages/@monomind/cli/dist/src/orgrt/mailbox.d.ts +0 -0
  927. package/packages/@monomind/cli/dist/src/orgrt/mailbox.js +0 -0
  928. package/packages/@monomind/cli/dist/src/orgrt/migrate.d.ts +0 -0
  929. package/packages/@monomind/cli/dist/src/orgrt/migrate.js +0 -0
  930. package/packages/@monomind/cli/dist/src/orgrt/policy.d.ts +0 -0
  931. package/packages/@monomind/cli/dist/src/orgrt/policy.js +0 -0
  932. package/packages/@monomind/cli/dist/src/orgrt/provider.d.ts +0 -0
  933. package/packages/@monomind/cli/dist/src/orgrt/provider.js +0 -0
  934. package/packages/@monomind/cli/dist/src/orgrt/reporting.d.ts +0 -0
  935. package/packages/@monomind/cli/dist/src/orgrt/reporting.js +0 -0
  936. package/packages/@monomind/cli/dist/src/orgrt/scheduler.d.ts +0 -0
  937. package/packages/@monomind/cli/dist/src/orgrt/scheduler.js +0 -0
  938. package/packages/@monomind/cli/dist/src/orgrt/server.d.ts +0 -0
  939. package/packages/@monomind/cli/dist/src/orgrt/server.js +0 -0
  940. package/packages/@monomind/cli/dist/src/orgrt/session.d.ts +0 -0
  941. package/packages/@monomind/cli/dist/src/orgrt/session.js +0 -0
  942. package/packages/@monomind/cli/dist/src/orgrt/templates.d.ts +0 -0
  943. package/packages/@monomind/cli/dist/src/orgrt/templates.js +0 -0
  944. package/packages/@monomind/cli/dist/src/orgrt/test-loop.d.ts +0 -0
  945. package/packages/@monomind/cli/dist/src/orgrt/test-loop.js +0 -0
  946. package/packages/@monomind/cli/dist/src/orgrt/types.d.ts +0 -0
  947. package/packages/@monomind/cli/dist/src/orgrt/types.js +0 -0
  948. package/packages/@monomind/cli/dist/src/output.d.ts +0 -0
  949. package/packages/@monomind/cli/dist/src/output.js +0 -0
  950. package/packages/@monomind/cli/dist/src/parser.d.ts +0 -0
  951. package/packages/@monomind/cli/dist/src/parser.js +0 -0
  952. package/packages/@monomind/cli/dist/src/pricing/model-pricing.d.ts +0 -0
  953. package/packages/@monomind/cli/dist/src/pricing/model-pricing.js +0 -0
  954. package/packages/@monomind/cli/dist/src/production/circuit-breaker.d.ts +0 -0
  955. package/packages/@monomind/cli/dist/src/production/circuit-breaker.js +0 -0
  956. package/packages/@monomind/cli/dist/src/production/error-handler.d.ts +0 -0
  957. package/packages/@monomind/cli/dist/src/production/error-handler.js +0 -0
  958. package/packages/@monomind/cli/dist/src/production/index.d.ts +0 -0
  959. package/packages/@monomind/cli/dist/src/production/index.js +0 -0
  960. package/packages/@monomind/cli/dist/src/production/monitoring.d.ts +0 -0
  961. package/packages/@monomind/cli/dist/src/production/monitoring.js +0 -0
  962. package/packages/@monomind/cli/dist/src/production/rate-limiter.d.ts +0 -0
  963. package/packages/@monomind/cli/dist/src/production/rate-limiter.js +0 -0
  964. package/packages/@monomind/cli/dist/src/production/retry.d.ts +0 -0
  965. package/packages/@monomind/cli/dist/src/production/retry.js +0 -0
  966. package/packages/@monomind/cli/dist/src/prompt.d.ts +0 -0
  967. package/packages/@monomind/cli/dist/src/prompt.js +0 -0
  968. package/packages/@monomind/cli/dist/src/routing/embed-worker.d.ts +0 -0
  969. package/packages/@monomind/cli/dist/src/routing/embed-worker.js +0 -0
  970. package/packages/@monomind/cli/dist/src/routing/embedder.d.ts +0 -0
  971. package/packages/@monomind/cli/dist/src/routing/embedder.js +0 -0
  972. package/packages/@monomind/cli/dist/src/routing/llm-caller.d.ts +0 -0
  973. package/packages/@monomind/cli/dist/src/routing/llm-caller.js +0 -0
  974. package/packages/@monomind/cli/dist/src/routing/route-layer-factory.d.ts +0 -0
  975. package/packages/@monomind/cli/dist/src/routing/route-layer-factory.js +0 -0
  976. package/packages/@monomind/cli/dist/src/services/config-file-manager.d.ts +0 -0
  977. package/packages/@monomind/cli/dist/src/services/config-file-manager.js +0 -0
  978. package/packages/@monomind/cli/dist/src/services/crash-reporter.d.ts +0 -0
  979. package/packages/@monomind/cli/dist/src/services/crash-reporter.js +0 -0
  980. package/packages/@monomind/cli/dist/src/suggest.d.ts +0 -0
  981. package/packages/@monomind/cli/dist/src/suggest.js +0 -0
  982. package/packages/@monomind/cli/dist/src/sync/checker.d.ts +0 -0
  983. package/packages/@monomind/cli/dist/src/sync/checker.js +0 -0
  984. package/packages/@monomind/cli/dist/src/transfer/anonymization/index.d.ts +0 -0
  985. package/packages/@monomind/cli/dist/src/transfer/anonymization/index.js +0 -0
  986. package/packages/@monomind/cli/dist/src/transfer/types.d.ts +0 -0
  987. package/packages/@monomind/cli/dist/src/transfer/types.js +0 -0
  988. package/packages/@monomind/cli/dist/src/types.d.ts +0 -0
  989. package/packages/@monomind/cli/dist/src/types.js +0 -0
  990. package/packages/@monomind/cli/dist/src/ui/collector.mjs +0 -0
  991. package/packages/@monomind/cli/dist/src/ui/dashboard.html +0 -0
  992. package/packages/@monomind/cli/dist/src/ui/data/agent-avatars.html +0 -0
  993. package/packages/@monomind/cli/dist/src/ui/data/agent-avatars.json +0 -0
  994. package/packages/@monomind/cli/dist/src/ui/data/avatars/account-strategist.svg +0 -0
  995. package/packages/@monomind/cli/dist/src/ui/data/avatars/accounts-payable.svg +0 -0
  996. package/packages/@monomind/cli/dist/src/ui/data/avatars/adaptive-coordinator.svg +0 -0
  997. package/packages/@monomind/cli/dist/src/ui/data/avatars/adaptive-coordinator2.svg +0 -0
  998. package/packages/@monomind/cli/dist/src/ui/data/avatars/ai-citation.svg +0 -0
  999. package/packages/@monomind/cli/dist/src/ui/data/avatars/ai-engineer.svg +0 -0
  1000. package/packages/@monomind/cli/dist/src/ui/data/avatars/analytics-reporter.svg +0 -0
  1001. package/packages/@monomind/cli/dist/src/ui/data/avatars/api-tester.svg +0 -0
  1002. package/packages/@monomind/cli/dist/src/ui/data/avatars/architecture.svg +0 -0
  1003. package/packages/@monomind/cli/dist/src/ui/data/avatars/automation-governance.svg +0 -0
  1004. package/packages/@monomind/cli/dist/src/ui/data/avatars/backend-dev.svg +0 -0
  1005. package/packages/@monomind/cli/dist/src/ui/data/avatars/benchmarker.svg +0 -0
  1006. package/packages/@monomind/cli/dist/src/ui/data/avatars/blockchain-auditor.svg +0 -0
  1007. package/packages/@monomind/cli/dist/src/ui/data/avatars/byzantine-coord.svg +0 -0
  1008. package/packages/@monomind/cli/dist/src/ui/data/avatars/case-analyst.svg +0 -0
  1009. package/packages/@monomind/cli/dist/src/ui/data/avatars/cicd-engineer.svg +0 -0
  1010. package/packages/@monomind/cli/dist/src/ui/data/avatars/cloud-architect.svg +0 -0
  1011. package/packages/@monomind/cli/dist/src/ui/data/avatars/code-review-swarm.svg +0 -0
  1012. package/packages/@monomind/cli/dist/src/ui/data/avatars/coder-v119.svg +0 -0
  1013. package/packages/@monomind/cli/dist/src/ui/data/avatars/coder.svg +0 -0
  1014. package/packages/@monomind/cli/dist/src/ui/data/avatars/collective-coord.svg +0 -0
  1015. package/packages/@monomind/cli/dist/src/ui/data/avatars/compliance-auditor.svg +0 -0
  1016. package/packages/@monomind/cli/dist/src/ui/data/avatars/consensus-coordinator.svg +0 -0
  1017. package/packages/@monomind/cli/dist/src/ui/data/avatars/content-creator.svg +0 -0
  1018. package/packages/@monomind/cli/dist/src/ui/data/avatars/crdt-synchronizer.svg +0 -0
  1019. package/packages/@monomind/cli/dist/src/ui/data/avatars/cro-specialist.svg +0 -0
  1020. package/packages/@monomind/cli/dist/src/ui/data/avatars/data-consolidator.svg +0 -0
  1021. package/packages/@monomind/cli/dist/src/ui/data/avatars/data-engineer.svg +0 -0
  1022. package/packages/@monomind/cli/dist/src/ui/data/avatars/database-optimizer.svg +0 -0
  1023. package/packages/@monomind/cli/dist/src/ui/data/avatars/deal-strategist.svg +0 -0
  1024. package/packages/@monomind/cli/dist/src/ui/data/avatars/defender.svg +0 -0
  1025. package/packages/@monomind/cli/dist/src/ui/data/avatars/devops-automator.svg +0 -0
  1026. package/packages/@monomind/cli/dist/src/ui/data/avatars/discovery-coach.svg +0 -0
  1027. package/packages/@monomind/cli/dist/src/ui/data/avatars/email-marketing.svg +0 -0
  1028. package/packages/@monomind/cli/dist/src/ui/data/avatars/embedded-firmware.svg +0 -0
  1029. package/packages/@monomind/cli/dist/src/ui/data/avatars/evidence-collector.svg +0 -0
  1030. package/packages/@monomind/cli/dist/src/ui/data/avatars/experiment-tracker.svg +0 -0
  1031. package/packages/@monomind/cli/dist/src/ui/data/avatars/feedback-synthesizer.svg +0 -0
  1032. package/packages/@monomind/cli/dist/src/ui/data/avatars/finance-tracker.svg +0 -0
  1033. package/packages/@monomind/cli/dist/src/ui/data/avatars/frontend-developer.svg +0 -0
  1034. package/packages/@monomind/cli/dist/src/ui/data/avatars/game-audio-engineer.svg +0 -0
  1035. package/packages/@monomind/cli/dist/src/ui/data/avatars/game-designer.svg +0 -0
  1036. package/packages/@monomind/cli/dist/src/ui/data/avatars/gossip-coordinator.svg +0 -0
  1037. package/packages/@monomind/cli/dist/src/ui/data/avatars/hierarchical-coord.svg +0 -0
  1038. package/packages/@monomind/cli/dist/src/ui/data/avatars/incident-commander.svg +0 -0
  1039. package/packages/@monomind/cli/dist/src/ui/data/avatars/infrastructure.svg +0 -0
  1040. package/packages/@monomind/cli/dist/src/ui/data/avatars/input-validator.svg +0 -0
  1041. package/packages/@monomind/cli/dist/src/ui/data/avatars/ios-developer.svg +0 -0
  1042. package/packages/@monomind/cli/dist/src/ui/data/avatars/issue-tracker.svg +0 -0
  1043. package/packages/@monomind/cli/dist/src/ui/data/avatars/judge.svg +0 -0
  1044. package/packages/@monomind/cli/dist/src/ui/data/avatars/launch-strategist.svg +0 -0
  1045. package/packages/@monomind/cli/dist/src/ui/data/avatars/legal-compliance.svg +0 -0
  1046. package/packages/@monomind/cli/dist/src/ui/data/avatars/level-designer.svg +0 -0
  1047. package/packages/@monomind/cli/dist/src/ui/data/avatars/load-balancer.svg +0 -0
  1048. package/packages/@monomind/cli/dist/src/ui/data/avatars/mcp-builder.svg +0 -0
  1049. package/packages/@monomind/cli/dist/src/ui/data/avatars/memory-coordinator.svg +0 -0
  1050. package/packages/@monomind/cli/dist/src/ui/data/avatars/mesh-coordinator.svg +0 -0
  1051. package/packages/@monomind/cli/dist/src/ui/data/avatars/ml-developer.svg +0 -0
  1052. package/packages/@monomind/cli/dist/src/ui/data/avatars/mobile-app-builder.svg +0 -0
  1053. package/packages/@monomind/cli/dist/src/ui/data/avatars/mobile-dev.svg +0 -0
  1054. package/packages/@monomind/cli/dist/src/ui/data/avatars/model-qa.svg +0 -0
  1055. package/packages/@monomind/cli/dist/src/ui/data/avatars/narrative-designer.svg +0 -0
  1056. package/packages/@monomind/cli/dist/src/ui/data/avatars/outbound-strategist.svg +0 -0
  1057. package/packages/@monomind/cli/dist/src/ui/data/avatars/path-validator.svg +0 -0
  1058. package/packages/@monomind/cli/dist/src/ui/data/avatars/payment-agent.svg +0 -0
  1059. package/packages/@monomind/cli/dist/src/ui/data/avatars/perf-analyzer.svg +0 -0
  1060. package/packages/@monomind/cli/dist/src/ui/data/avatars/pipeline-analyst.svg +0 -0
  1061. package/packages/@monomind/cli/dist/src/ui/data/avatars/planner.svg +0 -0
  1062. package/packages/@monomind/cli/dist/src/ui/data/avatars/pr-manager.svg +0 -0
  1063. package/packages/@monomind/cli/dist/src/ui/data/avatars/pricing-strategist.svg +0 -0
  1064. package/packages/@monomind/cli/dist/src/ui/data/avatars/product-manager.svg +0 -0
  1065. package/packages/@monomind/cli/dist/src/ui/data/avatars/production-validator.svg +0 -0
  1066. package/packages/@monomind/cli/dist/src/ui/data/avatars/project-shepherd.svg +0 -0
  1067. package/packages/@monomind/cli/dist/src/ui/data/avatars/proposal-strategist.svg +0 -0
  1068. package/packages/@monomind/cli/dist/src/ui/data/avatars/prosecutor.svg +0 -0
  1069. package/packages/@monomind/cli/dist/src/ui/data/avatars/pseudocode.svg +0 -0
  1070. package/packages/@monomind/cli/dist/src/ui/data/avatars/queen-coordinator.svg +0 -0
  1071. package/packages/@monomind/cli/dist/src/ui/data/avatars/quorum-manager.svg +0 -0
  1072. package/packages/@monomind/cli/dist/src/ui/data/avatars/raft-manager.svg +0 -0
  1073. package/packages/@monomind/cli/dist/src/ui/data/avatars/reality-checker.svg +0 -0
  1074. package/packages/@monomind/cli/dist/src/ui/data/avatars/recruitment.svg +0 -0
  1075. package/packages/@monomind/cli/dist/src/ui/data/avatars/refinement.svg +0 -0
  1076. package/packages/@monomind/cli/dist/src/ui/data/avatars/release-manager.svg +0 -0
  1077. package/packages/@monomind/cli/dist/src/ui/data/avatars/repo-architect.svg +0 -0
  1078. package/packages/@monomind/cli/dist/src/ui/data/avatars/researcher.svg +0 -0
  1079. package/packages/@monomind/cli/dist/src/ui/data/avatars/resource-allocator.svg +0 -0
  1080. package/packages/@monomind/cli/dist/src/ui/data/avatars/reviewer.svg +0 -0
  1081. package/packages/@monomind/cli/dist/src/ui/data/avatars/safe-executor.svg +0 -0
  1082. package/packages/@monomind/cli/dist/src/ui/data/avatars/sales-coach.svg +0 -0
  1083. package/packages/@monomind/cli/dist/src/ui/data/avatars/sales-engineer.svg +0 -0
  1084. package/packages/@monomind/cli/dist/src/ui/data/avatars/scout-explorer.svg +0 -0
  1085. package/packages/@monomind/cli/dist/src/ui/data/avatars/security-architect.svg +0 -0
  1086. package/packages/@monomind/cli/dist/src/ui/data/avatars/security-auditor.svg +0 -0
  1087. package/packages/@monomind/cli/dist/src/ui/data/avatars/senior-developer.svg +0 -0
  1088. package/packages/@monomind/cli/dist/src/ui/data/avatars/senior-pm.svg +0 -0
  1089. package/packages/@monomind/cli/dist/src/ui/data/avatars/seo-specialist.svg +0 -0
  1090. package/packages/@monomind/cli/dist/src/ui/data/avatars/social-media.svg +0 -0
  1091. package/packages/@monomind/cli/dist/src/ui/data/avatars/solidity-engineer.svg +0 -0
  1092. package/packages/@monomind/cli/dist/src/ui/data/avatars/sparc-coder.svg +0 -0
  1093. package/packages/@monomind/cli/dist/src/ui/data/avatars/sparc-coord.svg +0 -0
  1094. package/packages/@monomind/cli/dist/src/ui/data/avatars/specification.svg +0 -0
  1095. package/packages/@monomind/cli/dist/src/ui/data/avatars/sprint-prioritizer.svg +0 -0
  1096. package/packages/@monomind/cli/dist/src/ui/data/avatars/sre.svg +0 -0
  1097. package/packages/@monomind/cli/dist/src/ui/data/avatars/studio-operations.svg +0 -0
  1098. package/packages/@monomind/cli/dist/src/ui/data/avatars/studio-producer.svg +0 -0
  1099. package/packages/@monomind/cli/dist/src/ui/data/avatars/support-responder.svg +0 -0
  1100. package/packages/@monomind/cli/dist/src/ui/data/avatars/system-architect.svg +0 -0
  1101. package/packages/@monomind/cli/dist/src/ui/data/avatars/task-orchestrator.svg +0 -0
  1102. package/packages/@monomind/cli/dist/src/ui/data/avatars/technical-artist.svg +0 -0
  1103. package/packages/@monomind/cli/dist/src/ui/data/avatars/technical-writer.svg +0 -0
  1104. package/packages/@monomind/cli/dist/src/ui/data/avatars/tester.svg +0 -0
  1105. package/packages/@monomind/cli/dist/src/ui/data/avatars/threat-detection.svg +0 -0
  1106. package/packages/@monomind/cli/dist/src/ui/data/avatars/trend-researcher.svg +0 -0
  1107. package/packages/@monomind/cli/dist/src/ui/data/avatars/trial-director.svg +0 -0
  1108. package/packages/@monomind/cli/dist/src/ui/data/avatars/unity-architect.svg +0 -0
  1109. package/packages/@monomind/cli/dist/src/ui/data/avatars/visionos-engineer.svg +0 -0
  1110. package/packages/@monomind/cli/dist/src/ui/data/avatars/worker-specialist.svg +0 -0
  1111. package/packages/@monomind/cli/dist/src/ui/data/avatars/workflow-architect.svg +0 -0
  1112. package/packages/@monomind/cli/dist/src/ui/data/avatars/workflow-automation.svg +0 -0
  1113. package/packages/@monomind/cli/dist/src/ui/data/avatars/zk-steward.svg +0 -0
  1114. package/packages/@monomind/cli/dist/src/ui/data/known-projects.json +1 -0
  1115. package/packages/@monomind/cli/dist/src/ui/data/mastermind-sessions.json +1 -0
  1116. package/packages/@monomind/cli/dist/src/ui/data/sessions/_index.json +1 -0
  1117. package/packages/@monomind/cli/dist/src/ui/mastermind-diagram-fallback.html +0 -0
  1118. package/packages/@monomind/cli/dist/src/ui/orgs-files.js +0 -0
  1119. package/packages/@monomind/cli/dist/src/ui/orgs.html +0 -0
  1120. package/packages/@monomind/cli/dist/src/ui/server.mjs +0 -0
  1121. package/packages/@monomind/cli/dist/src/ui/sse-manager.mjs +0 -0
  1122. package/packages/@monomind/cli/dist/src/update/checker.d.ts +0 -0
  1123. package/packages/@monomind/cli/dist/src/update/checker.js +0 -0
  1124. package/packages/@monomind/cli/dist/src/update/executor.d.ts +0 -0
  1125. package/packages/@monomind/cli/dist/src/update/executor.js +0 -0
  1126. package/packages/@monomind/cli/dist/src/update/index.d.ts +0 -0
  1127. package/packages/@monomind/cli/dist/src/update/index.js +0 -0
  1128. package/packages/@monomind/cli/dist/src/update/rate-limiter.d.ts +0 -0
  1129. package/packages/@monomind/cli/dist/src/update/rate-limiter.js +0 -0
  1130. package/packages/@monomind/cli/dist/src/update/validator.d.ts +0 -0
  1131. package/packages/@monomind/cli/dist/src/update/validator.js +0 -0
  1132. package/packages/@monomind/cli/dist/src/utils/cosine-similarity.d.ts +0 -0
  1133. package/packages/@monomind/cli/dist/src/utils/cosine-similarity.js +0 -0
  1134. package/packages/@monomind/cli/dist/src/utils/input-guards.d.ts +0 -0
  1135. package/packages/@monomind/cli/dist/src/utils/input-guards.js +0 -0
  1136. package/packages/@monomind/cli/dist/src/utils/json-file.d.ts +0 -0
  1137. package/packages/@monomind/cli/dist/src/utils/json-file.js +0 -0
  1138. package/packages/@monomind/cli/dist/src/utils/parse-jsonl.d.ts +0 -0
  1139. package/packages/@monomind/cli/dist/src/utils/parse-jsonl.js +0 -0
  1140. package/packages/@monomind/cli/dist/src/utils/resource-governor.d.ts +0 -0
  1141. package/packages/@monomind/cli/dist/src/utils/resource-governor.js +0 -0
  1142. package/packages/@monomind/cli/package.json +2 -2
  1143. package/packages/@monomind/cli/scripts/deploy-ipfs-node.sh +0 -0
  1144. package/packages/@monomind/cli/scripts/understand-analyze.mjs +0 -0
  1145. package/scripts/build-fs.mjs +0 -0
  1146. package/scripts/generate-agent-avatars.mjs +0 -0
  1147. package/scripts/generate-channel-profile-assets.sh +0 -0
  1148. package/scripts/growth-content-calendar.mjs +0 -0
  1149. package/scripts/growth-profile-kit.mjs +0 -0
  1150. package/scripts/ua-enrich.mjs +0 -0
  1151. package/scripts/ua-import.mjs +0 -0
  1152. package/scripts/verify-appliance.sh +0 -0
@@ -0,0 +1,1962 @@
1
+ const IS_BROWSER = typeof window !== 'undefined';
2
+
3
+ // ─── Section 7: Browser UI (IS_BROWSER only) ────────────────────────────────
4
+
5
+ if (IS_BROWSER) {
6
+ // Detect extension mode via the script tag's data attribute or the document element fallback.
7
+ // currentScript is reliable for synchronously-executing scripts (which our IIFE is).
8
+ const _myScript = document.currentScript;
9
+ const EXTENSION_MODE = (_myScript && _myScript.dataset.monodesignExtension === 'true')
10
+ || document.documentElement.dataset.monodesignExtension === 'true';
11
+
12
+ // Kinpaku gold — pinned to the site's brand token (see
13
+ // site/styles/kinpaku-tokens.css --ks-kinpaku). Keep this in sync with
14
+ // the picker's C.brand in skill/scripts/live-browser.js and the kit's
15
+ // picker section in site/styles/kinpaku-kit.css.
16
+ //
17
+ // One color across both light and dark host pages. The outline is a
18
+ // 2px gesture pointing at an element + a labeled tag — it's a marker,
19
+ // not body text, so it doesn't need WCAG AA against the page. The
20
+ // label text inside the gold tag is dark (LABEL_INK) which has ~16:1
21
+ // against the leaf gold, so reading the rule name is solid in both
22
+ // modes. Hover deepens the gold (preserves chroma — never drops it,
23
+ // dropping chroma washes the gold into a sand/olive tone).
24
+ const BRAND_COLOR = 'oklch(84% 0.19 80.46)';
25
+ const BRAND_COLOR_HOVER = 'oklch(74% 0.18 80)';
26
+ const LABEL_INK = 'oklch(4% 0.004 95)';
27
+ const LABEL_BG = BRAND_COLOR;
28
+ const OUTLINE_COLOR = BRAND_COLOR;
29
+
30
+ // Inject hover styles via CSS (more reliable than JS event listeners)
31
+ const styleEl = document.createElement('style');
32
+ styleEl.textContent = `
33
+ @keyframes monodesign-reveal {
34
+ from { opacity: 0; }
35
+ to { opacity: 1; }
36
+ }
37
+ .monodesign-overlay:not(.monodesign-banner) {
38
+ pointer-events: none;
39
+ outline: 2px solid ${OUTLINE_COLOR};
40
+ border-radius: 4px;
41
+ transition: outline-color 0.15s ease;
42
+ animation: monodesign-reveal 0.4s cubic-bezier(0.16, 1, 0.3, 1) both;
43
+ animation-play-state: paused;
44
+ border-top-left-radius: 0;
45
+ }
46
+ .monodesign-overlay.monodesign-visible {
47
+ animation-play-state: running;
48
+ }
49
+ .monodesign-overlay.monodesign-hover {
50
+ outline-color: ${BRAND_COLOR_HOVER};
51
+ z-index: 100001 !important;
52
+ }
53
+ .monodesign-overlay.monodesign-hover .monodesign-label {
54
+ background: ${BRAND_COLOR_HOVER};
55
+ }
56
+ .monodesign-overlay.monodesign-spotlight {
57
+ z-index: 100002 !important;
58
+ }
59
+ .monodesign-overlay.monodesign-spotlight-dimmed {
60
+ opacity: 0.15 !important;
61
+ animation: none !important;
62
+ filter: blur(3px);
63
+ }
64
+ .monodesign-spotlight-backdrop {
65
+ position: fixed;
66
+ top: 0; left: 0; right: 0; bottom: 0;
67
+ backdrop-filter: blur(3px) brightness(0.6);
68
+ -webkit-backdrop-filter: blur(3px) brightness(0.6);
69
+ pointer-events: none;
70
+ z-index: 99998;
71
+ opacity: 0;
72
+ outline: none !important;
73
+ animation: none !important;
74
+ }
75
+ .monodesign-spotlight-backdrop.monodesign-visible {
76
+ opacity: 1;
77
+ }
78
+ .monodesign-hidden .monodesign-overlay${EXTENSION_MODE ? '' : ':not(.monodesign-banner)'} {
79
+ display: none !important;
80
+ }
81
+ `;
82
+ (document.head || document.documentElement).appendChild(styleEl);
83
+
84
+ // Spotlight backdrop element (created lazily on first use)
85
+ let spotlightBackdrop = null;
86
+ let spotlightTarget = null;
87
+
88
+ function getSpotlightBackdrop() {
89
+ if (!spotlightBackdrop) {
90
+ spotlightBackdrop = document.createElement('div');
91
+ spotlightBackdrop.className = 'monodesign-spotlight-backdrop';
92
+ document.body.appendChild(spotlightBackdrop);
93
+ }
94
+ return spotlightBackdrop;
95
+ }
96
+
97
+ function updateSpotlightClipPath() {
98
+ if (!spotlightBackdrop || !spotlightTarget) return;
99
+ const r = spotlightTarget.getBoundingClientRect();
100
+ // Match the overlay's outer edge: element rect + 4px (2px overlay offset + 2px outline width)
101
+ const inset = 4;
102
+ const radius = 6; // outline border-radius (4) + outline width (2)
103
+ const x1 = r.left - inset;
104
+ const y1 = r.top - inset;
105
+ const x2 = r.right + inset;
106
+ const y2 = r.bottom + inset;
107
+ const vw = window.innerWidth;
108
+ const vh = window.innerHeight;
109
+ // Outer rect + rounded inner rect (evenodd creates a hole)
110
+ const path = `M0 0H${vw}V${vh}H0Z M${x1 + radius} ${y1}H${x2 - radius}A${radius} ${radius} 0 0 1 ${x2} ${y1 + radius}V${y2 - radius}A${radius} ${radius} 0 0 1 ${x2 - radius} ${y2}H${x1 + radius}A${radius} ${radius} 0 0 1 ${x1} ${y2 - radius}V${y1 + radius}A${radius} ${radius} 0 0 1 ${x1 + radius} ${y1}Z`;
111
+ spotlightBackdrop.style.clipPath = `path(evenodd, "${path}")`;
112
+ }
113
+
114
+ function showSpotlight(target) {
115
+ if (!target || !target.getBoundingClientRect) return;
116
+ // Respect the spotlightBlur setting: if disabled, don't show the backdrop
117
+ if (window.__MONODESIGN_CONFIG__?.spotlightBlur === false) {
118
+ spotlightTarget = target;
119
+ return;
120
+ }
121
+ spotlightTarget = target;
122
+ const bd = getSpotlightBackdrop();
123
+ updateSpotlightClipPath();
124
+ bd.classList.add('monodesign-visible');
125
+ }
126
+
127
+ function hideSpotlight() {
128
+ spotlightTarget = null;
129
+ if (spotlightBackdrop) spotlightBackdrop.classList.remove('monodesign-visible');
130
+ }
131
+
132
+ function isInViewport(el) {
133
+ const r = el.getBoundingClientRect();
134
+ return r.top >= 0 && r.left >= 0 && r.bottom <= window.innerHeight && r.right <= window.innerWidth;
135
+ }
136
+
137
+ // Reposition spotlight on scroll/resize
138
+ window.addEventListener('scroll', () => {
139
+ if (spotlightTarget) updateSpotlightClipPath();
140
+ }, { passive: true });
141
+ window.addEventListener('resize', () => {
142
+ if (spotlightTarget) updateSpotlightClipPath();
143
+ });
144
+
145
+ const overlays = [];
146
+ const TYPE_LABELS = {};
147
+ const RULE_CATEGORY = {};
148
+ for (const ap of ANTIPATTERNS) {
149
+ TYPE_LABELS[ap.id] = ap.name.toLowerCase();
150
+ RULE_CATEGORY[ap.id] = ap.category || 'quality';
151
+ }
152
+
153
+ function isInFixedContext(el) {
154
+ let p = el;
155
+ while (p && p !== document.body) {
156
+ if (getComputedStyle(p).position === 'fixed') return true;
157
+ p = p.parentElement;
158
+ }
159
+ return false;
160
+ }
161
+
162
+ function positionOverlay(overlay) {
163
+ const el = overlay._targetEl;
164
+ if (!el) return;
165
+ const rect = el.getBoundingClientRect();
166
+ if (overlay._isFixed) {
167
+ // Viewport-relative coords for fixed targets
168
+ overlay.style.top = `${rect.top - 2}px`;
169
+ overlay.style.left = `${rect.left - 2}px`;
170
+ } else {
171
+ // Document-relative coords for normal targets
172
+ overlay.style.top = `${rect.top + scrollY - 2}px`;
173
+ overlay.style.left = `${rect.left + scrollX - 2}px`;
174
+ }
175
+ overlay.style.width = `${rect.width + 4}px`;
176
+ overlay.style.height = `${rect.height + 4}px`;
177
+ }
178
+
179
+ function repositionOverlays() {
180
+ for (const o of overlays) {
181
+ if (!o._targetEl || o.classList.contains('monodesign-banner')) continue;
182
+ // Skip overlays whose target is currently hidden (display: none on the overlay)
183
+ if (o.style.display === 'none') continue;
184
+ positionOverlay(o);
185
+ }
186
+ }
187
+
188
+ let resizeRAF;
189
+ const onResize = () => {
190
+ cancelAnimationFrame(resizeRAF);
191
+ resizeRAF = requestAnimationFrame(repositionOverlays);
192
+ };
193
+ window.addEventListener('resize', onResize);
194
+ // Reposition on scroll too -- catches sticky/parallax shifts
195
+ window.addEventListener('scroll', onResize, { passive: true });
196
+ // Reposition when body resizes (lazy-loaded images, dynamic content, fonts loading)
197
+ if (typeof ResizeObserver !== 'undefined') {
198
+ const bodyResizeObserver = new ResizeObserver(onResize);
199
+ bodyResizeObserver.observe(document.body);
200
+ }
201
+
202
+ // Track target element visibility via IntersectionObserver.
203
+ // Uses a huge rootMargin so all *rendered* elements count as intersecting,
204
+ // while display:none / closed <details> / hidden modals etc. do not.
205
+ // This is event-driven -- no polling needed.
206
+ let overlayIndex = 0;
207
+ const visibilityObserver = new IntersectionObserver((entries) => {
208
+ for (const entry of entries) {
209
+ const overlay = entry.target._monodesignOverlay;
210
+ if (!overlay) continue;
211
+ if (entry.isIntersecting) {
212
+ overlay.style.display = '';
213
+ positionOverlay(overlay);
214
+ if (!overlay._revealed) {
215
+ overlay._revealed = true;
216
+ if (firstScanDone) {
217
+ // Subsequent reveals (re-scans, scroll-into-view): instant, no animation
218
+ overlay.style.animation = 'none';
219
+ } else {
220
+ // Initial scan: staggered cascade reveal
221
+ overlay.style.animationDelay = `${Math.min((overlay._staggerIndex || 0) * 60, 600)}ms`;
222
+ }
223
+ requestAnimationFrame(() => {
224
+ overlay.classList.add('monodesign-visible');
225
+ if (overlay._checkLabel) overlay._checkLabel();
226
+ });
227
+ }
228
+ } else {
229
+ overlay.style.display = 'none';
230
+ }
231
+ }
232
+ }, { rootMargin: '99999px' });
233
+
234
+ function detachOverlay(overlay) {
235
+ if (!overlay) return;
236
+ if (typeof overlay._cleanup === 'function') {
237
+ try { overlay._cleanup(); } catch { /* best effort overlay teardown */ }
238
+ }
239
+ if (overlay._targetEl && overlay._targetEl._monodesignOverlay === overlay) {
240
+ visibilityObserver.unobserve(overlay._targetEl);
241
+ delete overlay._targetEl._monodesignOverlay;
242
+ }
243
+ const idx = overlays.indexOf(overlay);
244
+ if (idx >= 0) overlays.splice(idx, 1);
245
+ overlay.remove();
246
+ }
247
+
248
+ // Reposition overlays after CSS transitions end (e.g. reveal animations).
249
+ // Listens at document level so it catches transitions on ancestor elements
250
+ // (the transform may be on a parent, not the flagged element itself).
251
+ document.addEventListener('transitionend', (e) => {
252
+ if (e.propertyName !== 'transform') return;
253
+ for (const o of overlays) {
254
+ if (!o._targetEl || o.classList.contains('monodesign-banner') || o.style.display === 'none') continue;
255
+ if (e.target === o._targetEl || e.target.contains(o._targetEl)) {
256
+ positionOverlay(o);
257
+ }
258
+ }
259
+ });
260
+
261
+ const highlight = function(el, findings) {
262
+ if (el._monodesignOverlay) detachOverlay(el._monodesignOverlay);
263
+ const hasSlop = findings.some(f => RULE_CATEGORY[f.type || f.id] === 'slop');
264
+
265
+ const fixed = isInFixedContext(el);
266
+ const rect = el.getBoundingClientRect();
267
+ const outline = document.createElement('div');
268
+ outline.className = 'monodesign-overlay';
269
+ outline._targetEl = el;
270
+ outline._isFixed = fixed;
271
+ Object.assign(outline.style, {
272
+ position: fixed ? 'fixed' : 'absolute',
273
+ top: fixed ? `${rect.top - 2}px` : `${rect.top + scrollY - 2}px`,
274
+ left: fixed ? `${rect.left - 2}px` : `${rect.left + scrollX - 2}px`,
275
+ width: `${rect.width + 4}px`, height: `${rect.height + 4}px`,
276
+ zIndex: '99999', boxSizing: 'border-box',
277
+ });
278
+
279
+ // Build per-finding label entries: ✦ prefix for slop
280
+ const entries = findings.map(f => {
281
+ const name = TYPE_LABELS[f.type || f.id] || f.type || f.id;
282
+ const prefix = RULE_CATEGORY[f.type || f.id] === 'slop' ? '\u2726 ' : '';
283
+ return { name: prefix + name, detail: f.detail || f.snippet };
284
+ });
285
+ const allText = entries.map(e => e.name).join(', ');
286
+
287
+ const label = document.createElement('div');
288
+ label.className = 'monodesign-label';
289
+ Object.assign(label.style, {
290
+ position: 'absolute', bottom: '100%', left: '-2px',
291
+ display: 'flex', alignItems: 'center',
292
+ whiteSpace: 'nowrap',
293
+ fontSize: '11px', fontWeight: '600', letterSpacing: '0.02em',
294
+ color: LABEL_INK, lineHeight: '14px',
295
+ background: LABEL_BG,
296
+ fontFamily: 'system-ui, sans-serif',
297
+ borderRadius: '4px 4px 0 0',
298
+ });
299
+
300
+ const textSpan = document.createElement('span');
301
+ textSpan.style.padding = '3px 8px';
302
+ textSpan.textContent = allText;
303
+ label.appendChild(textSpan);
304
+
305
+ // State for cycling mode
306
+ let cycleMode = false;
307
+ let cycleIndex = 0;
308
+ let isHovered = false;
309
+ let prevBtn, nextBtn;
310
+
311
+ function updateCycleText() {
312
+ const e = entries[cycleIndex];
313
+ textSpan.textContent = isHovered ? e.detail : e.name;
314
+ }
315
+
316
+ function enableCycleMode() {
317
+ if (cycleMode || entries.length < 2) return;
318
+ cycleMode = true;
319
+
320
+ const btnStyle = {
321
+ background: 'none', border: 'none', color: 'rgba(255,255,255,0.7)',
322
+ fontSize: '11px', cursor: 'pointer', padding: '3px 4px',
323
+ fontFamily: 'system-ui, sans-serif', lineHeight: '14px',
324
+ pointerEvents: 'auto',
325
+ };
326
+
327
+ const navGroup = document.createElement('span');
328
+ Object.assign(navGroup.style, {
329
+ display: 'inline-flex', alignItems: 'center', flexShrink: '0',
330
+ });
331
+
332
+ prevBtn = document.createElement('button');
333
+ prevBtn.textContent = '\u2039';
334
+ Object.assign(prevBtn.style, btnStyle);
335
+ prevBtn.style.paddingLeft = '6px';
336
+ prevBtn.addEventListener('click', (e) => {
337
+ e.stopPropagation();
338
+ cycleIndex = (cycleIndex - 1 + entries.length) % entries.length;
339
+ updateCycleText();
340
+ });
341
+
342
+ nextBtn = document.createElement('button');
343
+ nextBtn.textContent = '\u203A';
344
+ Object.assign(nextBtn.style, btnStyle);
345
+ nextBtn.style.paddingRight = '2px';
346
+ nextBtn.addEventListener('click', (e) => {
347
+ e.stopPropagation();
348
+ cycleIndex = (cycleIndex + 1) % entries.length;
349
+ updateCycleText();
350
+ });
351
+
352
+ navGroup.appendChild(prevBtn);
353
+ navGroup.appendChild(nextBtn);
354
+ label.insertBefore(navGroup, textSpan);
355
+ textSpan.style.padding = '3px 8px 3px 4px';
356
+ updateCycleText();
357
+ }
358
+
359
+ outline.appendChild(label);
360
+
361
+ // Start hidden; the IntersectionObserver will show it once the target is rendered
362
+ outline.style.display = 'none';
363
+ outline._staggerIndex = overlayIndex++;
364
+ el._monodesignOverlay = outline;
365
+ visibilityObserver.observe(el);
366
+
367
+ // After first paint, check label width vs outline
368
+ outline._checkLabel = () => {
369
+ if (entries.length > 1 && label.offsetWidth > outline.offsetWidth) {
370
+ enableCycleMode();
371
+ }
372
+ };
373
+
374
+ // Hover: show detail text, darken
375
+ const onMouseEnter = () => {
376
+ isHovered = true;
377
+ outline.classList.add('monodesign-hover');
378
+ outline.style.outlineColor = BRAND_COLOR_HOVER;
379
+ label.style.background = BRAND_COLOR_HOVER;
380
+ if (cycleMode) {
381
+ updateCycleText();
382
+ } else {
383
+ textSpan.textContent = entries.map(e => e.detail).join(' | ');
384
+ }
385
+ };
386
+ const onMouseLeave = () => {
387
+ isHovered = false;
388
+ outline.classList.remove('monodesign-hover');
389
+ outline.style.outlineColor = '';
390
+ label.style.background = LABEL_BG;
391
+ if (cycleMode) {
392
+ updateCycleText();
393
+ } else {
394
+ textSpan.textContent = allText;
395
+ }
396
+ };
397
+ el.addEventListener('mouseenter', onMouseEnter);
398
+ el.addEventListener('mouseleave', onMouseLeave);
399
+ outline._cleanup = () => {
400
+ el.removeEventListener('mouseenter', onMouseEnter);
401
+ el.removeEventListener('mouseleave', onMouseLeave);
402
+ };
403
+
404
+ document.body.appendChild(outline);
405
+ overlays.push(outline);
406
+ };
407
+
408
+ const showPageBanner = function(findings) {
409
+ if (!findings.length) return;
410
+ const banner = document.createElement('div');
411
+ banner.className = 'monodesign-overlay monodesign-banner';
412
+ Object.assign(banner.style, {
413
+ position: 'fixed', top: '0', left: '0', right: '0', zIndex: '100000',
414
+ background: LABEL_BG, color: LABEL_INK,
415
+ fontFamily: 'system-ui, sans-serif', fontSize: '13px',
416
+ display: 'flex', alignItems: 'center', pointerEvents: 'auto',
417
+ height: '36px', overflow: 'hidden', maxWidth: '100vw',
418
+ transform: 'translateY(-100%)',
419
+ transition: 'transform 0.4s cubic-bezier(0.16, 1, 0.3, 1)',
420
+ });
421
+ requestAnimationFrame(() => requestAnimationFrame(() => {
422
+ banner.style.transform = 'translateY(0)';
423
+ }));
424
+
425
+ // Scrollable findings area
426
+ const scrollArea = document.createElement('div');
427
+ Object.assign(scrollArea.style, {
428
+ flex: '1', minWidth: '0', overflowX: 'auto', overflowY: 'hidden',
429
+ display: 'flex', gap: '8px', alignItems: 'center',
430
+ padding: '0 12px', scrollSnapType: 'x mandatory',
431
+ scrollbarWidth: 'none',
432
+ });
433
+ for (const f of findings) {
434
+ const prefix = RULE_CATEGORY[f.type] === 'slop' ? '\u2726 ' : '';
435
+ const tag = document.createElement('span');
436
+ tag.textContent = `${prefix}${TYPE_LABELS[f.type] || f.type}: ${f.detail}`;
437
+ Object.assign(tag.style, {
438
+ background: 'rgba(255,255,255,0.15)', padding: '2px 8px',
439
+ borderRadius: '3px', fontSize: '12px', fontFamily: 'ui-monospace, monospace',
440
+ whiteSpace: 'nowrap', flexShrink: '0', scrollSnapAlign: 'start',
441
+ });
442
+ scrollArea.appendChild(tag);
443
+ }
444
+ banner.appendChild(scrollArea);
445
+
446
+ // Controls area (only in standalone mode, not extension)
447
+ if (!EXTENSION_MODE) {
448
+ const controls = document.createElement('div');
449
+ Object.assign(controls.style, {
450
+ display: 'flex', alignItems: 'center', gap: '2px',
451
+ padding: '0 8px', flexShrink: '0',
452
+ });
453
+
454
+ // Toggle visibility button
455
+ const toggle = document.createElement('button');
456
+ toggle.textContent = '\u25C9'; // circle with dot (visible state)
457
+ toggle.title = 'Toggle overlay visibility';
458
+ Object.assign(toggle.style, {
459
+ background: 'none', border: 'none',
460
+ color: 'white', fontSize: '16px', cursor: 'pointer', padding: '0 4px',
461
+ opacity: '0.85', transition: 'opacity 0.15s',
462
+ });
463
+ let overlaysVisible = true;
464
+ toggle.addEventListener('click', () => {
465
+ overlaysVisible = !overlaysVisible;
466
+ document.body.classList.toggle('monodesign-hidden', !overlaysVisible);
467
+ toggle.textContent = overlaysVisible ? '\u25C9' : '\u25CB'; // filled vs empty circle
468
+ toggle.style.opacity = overlaysVisible ? '0.85' : '0.5';
469
+ });
470
+ controls.appendChild(toggle);
471
+
472
+ // Close button
473
+ const close = document.createElement('button');
474
+ close.textContent = '\u00d7';
475
+ close.title = 'Dismiss banner';
476
+ Object.assign(close.style, {
477
+ background: 'none', border: 'none',
478
+ color: 'white', fontSize: '18px', cursor: 'pointer', padding: '0 4px',
479
+ });
480
+ close.addEventListener('click', () => banner.remove());
481
+ controls.appendChild(close);
482
+
483
+ banner.appendChild(controls);
484
+ }
485
+ document.body.appendChild(banner);
486
+ overlays.push(banner);
487
+ };
488
+
489
+ // Heuristic for skipping CSS-in-JS hashed class names like "css-1a2b3c" or "_2x4hG_".
490
+ // These change between builds and produce brittle, ugly selectors.
491
+ function isLikelyHashedClass(c) {
492
+ if (!c) return true;
493
+ if (/^(css|sc|emotion|jsx|module)-[\w-]{4,}$/i.test(c)) return true;
494
+ if (/^_[\w-]{5,}$/.test(c)) return true;
495
+ if (/^[a-z0-9]{6,}$/i.test(c) && /\d/.test(c)) return true;
496
+ return false;
497
+ }
498
+
499
+ function buildSelectorSegment(el) {
500
+ const tag = el.tagName.toLowerCase();
501
+ let sel = tag;
502
+
503
+ if (el.classList && el.classList.length > 0) {
504
+ const classes = [...el.classList]
505
+ .filter(c => !c.startsWith('monodesign-') && !isLikelyHashedClass(c))
506
+ .slice(0, 2);
507
+ if (classes.length > 0) {
508
+ sel += '.' + classes.map(c => CSS.escape(c)).join('.');
509
+ }
510
+ }
511
+
512
+ // Disambiguate among siblings only if the parent has multiple matches
513
+ const parent = el.parentElement;
514
+ if (parent) {
515
+ try {
516
+ const matching = parent.querySelectorAll(':scope > ' + sel);
517
+ if (matching.length > 1) {
518
+ const sameType = [...parent.children].filter(c => c.tagName === el.tagName);
519
+ const idx = sameType.indexOf(el) + 1;
520
+ sel += `:nth-of-type(${idx})`;
521
+ }
522
+ } catch {
523
+ const idx = [...parent.children].indexOf(el) + 1;
524
+ sel = `${tag}:nth-child(${idx})`;
525
+ }
526
+ }
527
+ return sel;
528
+ }
529
+
530
+ function generateSelector(el) {
531
+ if (el === document.body) return 'body';
532
+ if (el === document.documentElement) return 'html';
533
+ if (el.id) return '#' + CSS.escape(el.id);
534
+
535
+ const parts = [];
536
+ let current = el;
537
+ let depth = 0;
538
+ const MAX_DEPTH = 10;
539
+
540
+ while (current && current !== document.body && current !== document.documentElement && depth < MAX_DEPTH) {
541
+ parts.unshift(buildSelectorSegment(current));
542
+
543
+ // Anchor on an ancestor's ID and stop walking up
544
+ if (current.id) {
545
+ parts[0] = '#' + CSS.escape(current.id);
546
+ break;
547
+ }
548
+
549
+ // Stop as soon as the partial selector uniquely identifies the target
550
+ const trySelector = parts.join(' > ');
551
+ try {
552
+ const matches = document.querySelectorAll(trySelector);
553
+ if (matches.length === 1 && matches[0] === el) {
554
+ return trySelector;
555
+ }
556
+ } catch { /* invalid selector — keep walking */ }
557
+
558
+ current = current.parentElement;
559
+ depth++;
560
+ }
561
+
562
+ return parts.join(' > ');
563
+ }
564
+
565
+ function getDirectText(el) {
566
+ return [...el.childNodes]
567
+ .filter(n => n.nodeType === 3)
568
+ .map(n => n.textContent || '')
569
+ .join('');
570
+ }
571
+
572
+ function getDirectTextRect(el) {
573
+ const rects = [];
574
+ for (const node of el.childNodes) {
575
+ if (node.nodeType !== 3 || !(node.textContent || '').trim()) continue;
576
+ const range = document.createRange();
577
+ range.selectNodeContents(node);
578
+ for (const rect of range.getClientRects()) {
579
+ if (rect.width >= 1 && rect.height >= 1) rects.push(rect);
580
+ }
581
+ range.detach?.();
582
+ }
583
+ if (rects.length === 0) return null;
584
+ const left = Math.min(...rects.map(r => r.left));
585
+ const top = Math.min(...rects.map(r => r.top));
586
+ const right = Math.max(...rects.map(r => r.right));
587
+ const bottom = Math.max(...rects.map(r => r.bottom));
588
+ return {
589
+ left,
590
+ top,
591
+ right,
592
+ bottom,
593
+ width: right - left,
594
+ height: bottom - top,
595
+ x: left,
596
+ y: top,
597
+ };
598
+ }
599
+
600
+ function collectVisualContrastReasons(el, style) {
601
+ const reasons = new Set();
602
+ const bgClip = style.webkitBackgroundClip || style.backgroundClip || '';
603
+ const ownBgImage = style.backgroundImage || '';
604
+ if (bgClip === 'text' && ownBgImage && ownBgImage !== 'none') {
605
+ reasons.add('background-clip text');
606
+ }
607
+ if (style.textShadow && style.textShadow !== 'none') reasons.add('text shadow');
608
+
609
+ let current = el;
610
+ while (current && current.nodeType === 1) {
611
+ const tag = current.tagName?.toLowerCase();
612
+ const currentStyle = getComputedStyle(current);
613
+ const bgImage = currentStyle.backgroundImage || '';
614
+ const isDocumentSurface = tag === 'body' || tag === 'html';
615
+
616
+ if (!isDocumentSurface && bgImage && bgImage !== 'none') {
617
+ if (/url\s*\(/i.test(bgImage)) reasons.add('image background');
618
+ if (/gradient/i.test(bgImage)) reasons.add('gradient background');
619
+ }
620
+ if (parseFloat(currentStyle.opacity) < 0.99) reasons.add('opacity stack');
621
+ if (currentStyle.mixBlendMode && currentStyle.mixBlendMode !== 'normal') reasons.add('blend mode');
622
+ if (currentStyle.filter && currentStyle.filter !== 'none') reasons.add('filter');
623
+ if (currentStyle.backdropFilter && currentStyle.backdropFilter !== 'none') reasons.add('backdrop filter');
624
+
625
+ const solidBg = parseRgb(currentStyle.backgroundColor);
626
+ if (solidBg && solidBg.a >= 0.95 && (!bgImage || bgImage === 'none')) break;
627
+ current = current.parentElement;
628
+ }
629
+
630
+ const sampleRect = getDirectTextRect(el) || el.getBoundingClientRect();
631
+ if (sampleRect && document.elementsFromPoint) {
632
+ const points = [
633
+ [sampleRect.left + sampleRect.width / 2, sampleRect.top + sampleRect.height / 2],
634
+ [sampleRect.left + Math.min(sampleRect.width - 1, Math.max(1, sampleRect.width * 0.25)), sampleRect.top + sampleRect.height / 2],
635
+ [sampleRect.left + Math.min(sampleRect.width - 1, Math.max(1, sampleRect.width * 0.75)), sampleRect.top + sampleRect.height / 2],
636
+ ];
637
+ for (const [x, y] of points) {
638
+ if (x < 0 || y < 0 || x > window.innerWidth || y > window.innerHeight) continue;
639
+ const stack = document.elementsFromPoint(x, y);
640
+ const selfIndex = stack.findIndex(node => node === el || el.contains(node) || node.contains?.(el));
641
+ if (selfIndex < 0) continue;
642
+ for (const node of stack.slice(selfIndex + 1)) {
643
+ const nodeTag = node.tagName?.toLowerCase();
644
+ if (nodeTag === 'img' || nodeTag === 'picture' || nodeTag === 'video' || nodeTag === 'canvas' || nodeTag === 'svg') {
645
+ reasons.add(`${nodeTag} underlay`);
646
+ break;
647
+ }
648
+ }
649
+ }
650
+ }
651
+
652
+ return [...reasons];
653
+ }
654
+
655
+ function collectVisualContrastCandidates(options = {}) {
656
+ const maxCandidates = Number.isFinite(options.maxCandidates) ? options.maxCandidates : 12;
657
+ const candidates = [];
658
+ for (const el of document.querySelectorAll('*')) {
659
+ if (candidates.length >= maxCandidates) break;
660
+ if (el.closest('.monodesign-overlay, .monodesign-label, .monodesign-banner, .monodesign-tooltip')) continue;
661
+ if (el.closest('[id^="monodesign-live-"]')) continue;
662
+ if (el === document.body || el === document.documentElement) continue;
663
+ if (!isRenderedForBrowserRule(el)) continue;
664
+
665
+ const tag = el.tagName.toLowerCase();
666
+ const style = getComputedStyle(el);
667
+ if (style.display === 'none' || style.visibility === 'hidden') continue;
668
+ const directText = getDirectText(el);
669
+ const hasDirectText = directText.trim().length > 0;
670
+ if (!hasDirectText || isEmojiOnlyText(directText)) continue;
671
+
672
+ const bgColor = readOwnBackgroundColor(el, style);
673
+ const isStyledButton = (tag === 'a' || tag === 'button')
674
+ && bgColor && bgColor.a > 0.5;
675
+ if (SAFE_TAGS.has(tag) && !isStyledButton) continue;
676
+
677
+ const rect = getDirectTextRect(el) || el.getBoundingClientRect();
678
+ if (!rect || rect.width < 4 || rect.height < 4) continue;
679
+
680
+ const reasons = collectVisualContrastReasons(el, style);
681
+ if (reasons.length === 0) continue;
682
+
683
+ const textColor = parseRgb(style.color);
684
+ const fontSize = parseFloat(style.fontSize) || 16;
685
+ const fontWeight = parseInt(style.fontWeight) || 400;
686
+ const isLargeText = fontSize >= WCAG_LARGE_TEXT_PX || (fontSize >= WCAG_LARGE_BOLD_TEXT_PX && fontWeight >= 700);
687
+ const threshold = isLargeText ? 3.0 : 4.5;
688
+ const clip = {
689
+ x: Math.max(0, Math.floor(rect.left + window.scrollX - 2)),
690
+ y: Math.max(0, Math.floor(rect.top + window.scrollY - 2)),
691
+ width: Math.max(1, Math.ceil(rect.width + 4)),
692
+ height: Math.max(1, Math.ceil(rect.height + 4)),
693
+ };
694
+
695
+ candidates.push({
696
+ selector: generateSelector(el),
697
+ tagName: tag,
698
+ text: directText.trim().replace(/\s+/g, ' ').slice(0, 80),
699
+ threshold,
700
+ reasons,
701
+ clip,
702
+ textColor,
703
+ preferRenderedForeground: !textColor || textColor.a < 0.99 || reasons.some(reason =>
704
+ reason === 'opacity stack' ||
705
+ reason === 'blend mode' ||
706
+ reason === 'filter' ||
707
+ reason === 'backdrop filter' ||
708
+ reason === 'background-clip text'
709
+ ),
710
+ backgroundClipText: reasons.includes('background-clip text'),
711
+ });
712
+ }
713
+ return candidates;
714
+ }
715
+
716
+ const visualContrastImageCache = new Map();
717
+ const visualContrastRasterCache = new WeakMap();
718
+
719
+ function clampByte(value) {
720
+ return Math.max(0, Math.min(255, Math.round(value)));
721
+ }
722
+
723
+ function blendRgba(fg, bg) {
724
+ if (!fg) return bg || null;
725
+ if (!bg || fg.a == null || fg.a >= 0.999) {
726
+ return { r: clampByte(fg.r), g: clampByte(fg.g), b: clampByte(fg.b), a: fg.a == null ? 1 : fg.a };
727
+ }
728
+ const alpha = Math.max(0, Math.min(1, fg.a));
729
+ return {
730
+ r: clampByte(fg.r * alpha + bg.r * (1 - alpha)),
731
+ g: clampByte(fg.g * alpha + bg.g * (1 - alpha)),
732
+ b: clampByte(fg.b * alpha + bg.b * (1 - alpha)),
733
+ a: 1,
734
+ };
735
+ }
736
+
737
+ function pickWorstContrastColor(textColor, colors) {
738
+ const usable = (colors || []).filter(Boolean);
739
+ if (!usable.length) return null;
740
+ let worst = usable[0];
741
+ let worstRatio = contrastRatio(textColor, worst);
742
+ for (const color of usable.slice(1)) {
743
+ const ratio = contrastRatio(textColor, color);
744
+ if (ratio < worstRatio) {
745
+ worst = color;
746
+ worstRatio = ratio;
747
+ }
748
+ }
749
+ return worst;
750
+ }
751
+
752
+ function firstCssUrl(value) {
753
+ const match = String(value || '').match(/url\((?:"([^"]+)"|'([^']+)'|([^)]*))\)/i);
754
+ if (!match) return '';
755
+ return (match[1] || match[2] || match[3] || '').trim();
756
+ }
757
+
758
+ function getLayerValue(value, index = 0) {
759
+ return String(value || '').split(',')[index]?.trim() || '';
760
+ }
761
+
762
+ function parsePositionToken(token, container, painted) {
763
+ if (!token || token === 'center') return (container - painted) / 2;
764
+ if (token === 'left' || token === 'top') return 0;
765
+ if (token === 'right' || token === 'bottom') return container - painted;
766
+ if (/%$/.test(token)) {
767
+ const pct = parseFloat(token) / 100;
768
+ return (container - painted) * pct;
769
+ }
770
+ if (/px$/.test(token)) return parseFloat(token) || 0;
771
+ return (container - painted) / 2;
772
+ }
773
+
774
+ function parsePositionPair(positionValue) {
775
+ const tokens = String(positionValue || '50% 50%').trim().split(/\s+/).filter(Boolean);
776
+ const first = tokens[0] || '50%';
777
+ if (tokens.length < 2) {
778
+ if (first === 'top' || first === 'bottom') return ['50%', first];
779
+ return [first, '50%'];
780
+ }
781
+ return [first, tokens[1] || '50%'];
782
+ }
783
+
784
+ function resolvePaintedImageRect(containerRect, image, sizeValue, positionValue) {
785
+ const intrinsicWidth = image.naturalWidth || image.videoWidth || image.width || 1;
786
+ const intrinsicHeight = image.naturalHeight || image.videoHeight || image.height || 1;
787
+ let paintedWidth = intrinsicWidth;
788
+ let paintedHeight = intrinsicHeight;
789
+ const size = String(sizeValue || 'auto').trim();
790
+
791
+ if (size === 'cover' || size === 'contain') {
792
+ const scale = size === 'cover'
793
+ ? Math.max(containerRect.width / intrinsicWidth, containerRect.height / intrinsicHeight)
794
+ : Math.min(containerRect.width / intrinsicWidth, containerRect.height / intrinsicHeight);
795
+ paintedWidth = intrinsicWidth * scale;
796
+ paintedHeight = intrinsicHeight * scale;
797
+ } else if (size && size !== 'auto') {
798
+ const parts = size.split(/\s+/);
799
+ const widthToken = parts[0];
800
+ const heightToken = parts[1] || 'auto';
801
+ if (/%$/.test(widthToken)) paintedWidth = containerRect.width * (parseFloat(widthToken) / 100);
802
+ else if (/px$/.test(widthToken)) paintedWidth = parseFloat(widthToken) || paintedWidth;
803
+ if (heightToken === 'auto') paintedHeight = paintedWidth * (intrinsicHeight / intrinsicWidth);
804
+ else if (/%$/.test(heightToken)) paintedHeight = containerRect.height * (parseFloat(heightToken) / 100);
805
+ else if (/px$/.test(heightToken)) paintedHeight = parseFloat(heightToken) || paintedHeight;
806
+ }
807
+
808
+ const [xToken, yToken] = parsePositionPair(positionValue);
809
+ const positionX = parsePositionToken(xToken, containerRect.width, paintedWidth);
810
+ const positionY = parsePositionToken(yToken, containerRect.height, paintedHeight);
811
+ return {
812
+ left: containerRect.left + positionX,
813
+ top: containerRect.top + positionY,
814
+ width: paintedWidth,
815
+ height: paintedHeight,
816
+ intrinsicWidth,
817
+ intrinsicHeight,
818
+ };
819
+ }
820
+
821
+ function parseObjectPosition(positionValue) {
822
+ return parsePositionPair(positionValue);
823
+ }
824
+
825
+ function resolveObjectImageRect(containerRect, image, style) {
826
+ const intrinsicWidth = image.naturalWidth || image.videoWidth || image.width || 1;
827
+ const intrinsicHeight = image.naturalHeight || image.videoHeight || image.height || 1;
828
+ const fit = style.objectFit || 'fill';
829
+ let paintedWidth = containerRect.width;
830
+ let paintedHeight = containerRect.height;
831
+ if (fit === 'contain' || fit === 'cover') {
832
+ const scale = fit === 'cover'
833
+ ? Math.max(containerRect.width / intrinsicWidth, containerRect.height / intrinsicHeight)
834
+ : Math.min(containerRect.width / intrinsicWidth, containerRect.height / intrinsicHeight);
835
+ paintedWidth = intrinsicWidth * scale;
836
+ paintedHeight = intrinsicHeight * scale;
837
+ } else if (fit === 'none') {
838
+ paintedWidth = intrinsicWidth;
839
+ paintedHeight = intrinsicHeight;
840
+ } else if (fit === 'scale-down') {
841
+ const containScale = Math.min(containerRect.width / intrinsicWidth, containerRect.height / intrinsicHeight, 1);
842
+ paintedWidth = intrinsicWidth * containScale;
843
+ paintedHeight = intrinsicHeight * containScale;
844
+ }
845
+ const [xToken, yToken] = parseObjectPosition(style.objectPosition);
846
+ return {
847
+ left: containerRect.left + parsePositionToken(xToken, containerRect.width, paintedWidth),
848
+ top: containerRect.top + parsePositionToken(yToken, containerRect.height, paintedHeight),
849
+ width: paintedWidth,
850
+ height: paintedHeight,
851
+ intrinsicWidth,
852
+ intrinsicHeight,
853
+ };
854
+ }
855
+
856
+ function pointToImageSource(point, paintedRect) {
857
+ if (
858
+ point.x < paintedRect.left ||
859
+ point.y < paintedRect.top ||
860
+ point.x > paintedRect.left + paintedRect.width ||
861
+ point.y > paintedRect.top + paintedRect.height
862
+ ) {
863
+ return null;
864
+ }
865
+ return {
866
+ x: Math.max(0, Math.min(paintedRect.intrinsicWidth - 1, ((point.x - paintedRect.left) / paintedRect.width) * paintedRect.intrinsicWidth)),
867
+ y: Math.max(0, Math.min(paintedRect.intrinsicHeight - 1, ((point.y - paintedRect.top) / paintedRect.height) * paintedRect.intrinsicHeight)),
868
+ };
869
+ }
870
+
871
+ async function loadVisualContrastImage(src) {
872
+ if (!src) return null;
873
+ if (visualContrastImageCache.has(src)) return visualContrastImageCache.get(src);
874
+ const promise = new Promise(resolve => {
875
+ const img = new Image();
876
+ let settled = false;
877
+ const finish = value => {
878
+ if (settled) return;
879
+ settled = true;
880
+ clearTimeout(timer);
881
+ resolve(value);
882
+ };
883
+ const timer = setTimeout(() => finish(null), 800);
884
+ try {
885
+ const absolute = new URL(src, location.href);
886
+ if (absolute.origin !== location.origin && absolute.protocol !== 'data:' && absolute.protocol !== 'blob:') {
887
+ img.crossOrigin = 'anonymous';
888
+ }
889
+ } catch {
890
+ // Let the browser resolve unusual URLs itself.
891
+ }
892
+ img.onload = () => finish(img);
893
+ img.onerror = () => finish(null);
894
+ img.src = src;
895
+ });
896
+ visualContrastImageCache.set(src, promise);
897
+ return promise;
898
+ }
899
+
900
+ function sampleDrawablePixel(drawable, sourcePoint) {
901
+ if (visualContrastRasterCache.has(drawable)) {
902
+ const cached = visualContrastRasterCache.get(drawable);
903
+ if (!cached || !cached.ctx) return { status: 'unresolved', reason: cached?.reason || 'image sample failed' };
904
+ try {
905
+ const x = Math.max(0, Math.min(cached.width - 1, Math.floor(sourcePoint.x * cached.scaleX)));
906
+ const y = Math.max(0, Math.min(cached.height - 1, Math.floor(sourcePoint.y * cached.scaleY)));
907
+ const data = cached.ctx.getImageData(x, y, 1, 1).data;
908
+ return {
909
+ status: 'sampled',
910
+ color: { r: data[0], g: data[1], b: data[2], a: data[3] / 255 },
911
+ };
912
+ } catch (err) {
913
+ return {
914
+ status: 'unresolved',
915
+ reason: /taint|cross-origin|Security/i.test(err?.message || '') ? 'tainted image' : 'image sample failed',
916
+ };
917
+ }
918
+ }
919
+
920
+ const canvas = document.createElement('canvas');
921
+ const intrinsicWidth = drawable.naturalWidth || drawable.videoWidth || drawable.width || 1;
922
+ const intrinsicHeight = drawable.naturalHeight || drawable.videoHeight || drawable.height || 1;
923
+ const maxRasterSide = 640;
924
+ const scale = Math.min(1, maxRasterSide / Math.max(intrinsicWidth, intrinsicHeight));
925
+ canvas.width = Math.max(1, Math.round(intrinsicWidth * scale));
926
+ canvas.height = Math.max(1, Math.round(intrinsicHeight * scale));
927
+ const ctx = canvas.getContext('2d', { willReadFrequently: true });
928
+ if (!ctx) return { status: 'unresolved', reason: 'canvas unavailable' };
929
+ try {
930
+ ctx.drawImage(drawable, 0, 0, canvas.width, canvas.height);
931
+ const cached = {
932
+ ctx,
933
+ width: canvas.width,
934
+ height: canvas.height,
935
+ scaleX: canvas.width / intrinsicWidth,
936
+ scaleY: canvas.height / intrinsicHeight,
937
+ };
938
+ visualContrastRasterCache.set(drawable, cached);
939
+ const x = Math.max(0, Math.min(cached.width - 1, Math.floor(sourcePoint.x * cached.scaleX)));
940
+ const y = Math.max(0, Math.min(cached.height - 1, Math.floor(sourcePoint.y * cached.scaleY)));
941
+ const data = ctx.getImageData(x, y, 1, 1).data;
942
+ return {
943
+ status: 'sampled',
944
+ color: { r: data[0], g: data[1], b: data[2], a: data[3] / 255 },
945
+ };
946
+ } catch (err) {
947
+ const reason = /taint|cross-origin|Security/i.test(err?.message || '') ? 'tainted image' : 'image sample failed';
948
+ visualContrastRasterCache.set(drawable, { ctx: null, reason });
949
+ return {
950
+ status: 'unresolved',
951
+ reason,
952
+ };
953
+ }
954
+ }
955
+
956
+ async function sampleCssBackground(el, style, point, textColor) {
957
+ const rect = el.getBoundingClientRect();
958
+ const bgImage = style.backgroundImage || '';
959
+ if (bgImage && bgImage !== 'none') {
960
+ if (/gradient/i.test(bgImage)) {
961
+ const color = pickWorstContrastColor(textColor, parseGradientColors(bgImage));
962
+ if (color) return { status: 'sampled', color, method: 'analytic-gradient' };
963
+ }
964
+ if (/url\s*\(/i.test(bgImage)) {
965
+ const img = await loadVisualContrastImage(firstCssUrl(bgImage));
966
+ if (!img) return { status: 'unresolved', reason: 'image unavailable' };
967
+ const paintedRect = resolvePaintedImageRect(
968
+ rect,
969
+ img,
970
+ getLayerValue(style.backgroundSize) || 'auto',
971
+ getLayerValue(style.backgroundPosition) || '50% 50%',
972
+ );
973
+ const sourcePoint = pointToImageSource(point, paintedRect);
974
+ if (!sourcePoint) return { status: 'unresolved', reason: 'point outside background image' };
975
+ const sample = sampleDrawablePixel(img, sourcePoint);
976
+ if (sample.status === 'sampled') return { ...sample, method: 'canvas-background-image' };
977
+ return sample;
978
+ }
979
+ }
980
+ const bg = parseRgb(style.backgroundColor);
981
+ if (bg && bg.a > 0.05) return { status: 'sampled', color: bg, method: 'solid-background' };
982
+ return { status: 'unresolved', reason: 'no readable background' };
983
+ }
984
+
985
+ async function sampleImageElement(img, point) {
986
+ const rect = img.getBoundingClientRect();
987
+ const style = getComputedStyle(img);
988
+ const paintedRect = resolveObjectImageRect(rect, img, style);
989
+ const sourcePoint = pointToImageSource(point, paintedRect);
990
+ if (!sourcePoint) return { status: 'unresolved', reason: 'point outside image' };
991
+ const sample = sampleDrawablePixel(img, sourcePoint);
992
+ if (sample.status === 'sampled') return { ...sample, method: 'canvas-img-underlay' };
993
+
994
+ if (img.currentSrc || img.src) {
995
+ const loaded = await loadVisualContrastImage(img.currentSrc || img.src);
996
+ if (loaded) {
997
+ const loadedRect = { ...paintedRect, intrinsicWidth: loaded.naturalWidth || loaded.width || paintedRect.intrinsicWidth, intrinsicHeight: loaded.naturalHeight || loaded.height || paintedRect.intrinsicHeight };
998
+ const loadedPoint = pointToImageSource(point, loadedRect);
999
+ if (loadedPoint) {
1000
+ const loadedSample = sampleDrawablePixel(loaded, loadedPoint);
1001
+ if (loadedSample.status === 'sampled') return { ...loadedSample, method: 'canvas-img-underlay' };
1002
+ }
1003
+ }
1004
+ }
1005
+ return sample;
1006
+ }
1007
+
1008
+ function textSamplePoints(rect) {
1009
+ const insetX = Math.min(12, Math.max(1, rect.width * 0.12));
1010
+ const insetY = Math.min(8, Math.max(1, rect.height * 0.22));
1011
+ const xs = rect.width < 28
1012
+ ? [rect.left + rect.width / 2]
1013
+ : [rect.left + insetX, rect.left + rect.width / 2, rect.right - insetX];
1014
+ const ys = rect.height < 22
1015
+ ? [rect.top + rect.height / 2]
1016
+ : [rect.top + insetY, rect.top + rect.height / 2, rect.bottom - insetY];
1017
+ const points = [];
1018
+ for (const y of ys) {
1019
+ for (const x of xs) {
1020
+ if (x >= 0 && y >= 0 && x <= window.innerWidth && y <= window.innerHeight) points.push({ x, y });
1021
+ }
1022
+ }
1023
+ return points;
1024
+ }
1025
+
1026
+ async function sampleVisualBackgroundAtPoint(el, point, textColor, depth = 0) {
1027
+ if (depth > 8) {
1028
+ return { status: 'unresolved', reason: 'background stack too deep' };
1029
+ }
1030
+ const stack = typeof document.elementsFromPoint === 'function'
1031
+ ? document.elementsFromPoint(point.x, point.y)
1032
+ : [];
1033
+ const selfIndex = stack.findIndex(node => node === el || el.contains(node));
1034
+ const nodes = selfIndex >= 0 ? stack.slice(selfIndex) : [el, ...stack];
1035
+ const unresolved = [];
1036
+
1037
+ for (const node of nodes) {
1038
+ if (!node || node.nodeType !== 1) continue;
1039
+ if (node.closest?.('.monodesign-overlay, .monodesign-label, .monodesign-banner, .monodesign-tooltip')) continue;
1040
+ const tag = node.tagName?.toLowerCase();
1041
+ if (tag === 'img') {
1042
+ const sample = await sampleImageElement(node, point);
1043
+ if (sample.status === 'sampled') return sample;
1044
+ unresolved.push(sample.reason);
1045
+ continue;
1046
+ }
1047
+ if (tag === 'canvas' || tag === 'video') {
1048
+ const rect = node.getBoundingClientRect();
1049
+ const sourcePoint = pointToImageSource(point, {
1050
+ left: rect.left,
1051
+ top: rect.top,
1052
+ width: rect.width,
1053
+ height: rect.height,
1054
+ intrinsicWidth: node.width || node.videoWidth || rect.width,
1055
+ intrinsicHeight: node.height || node.videoHeight || rect.height,
1056
+ });
1057
+ if (sourcePoint) {
1058
+ const sample = sampleDrawablePixel(node, sourcePoint);
1059
+ if (sample.status === 'sampled') return { ...sample, method: `canvas-${tag}-underlay` };
1060
+ unresolved.push(sample.reason);
1061
+ }
1062
+ continue;
1063
+ }
1064
+ const style = getComputedStyle(node);
1065
+ const sample = await sampleCssBackground(node, style, point, textColor);
1066
+ if (sample.status === 'sampled') {
1067
+ if (!sample.color || sample.color.a == null || sample.color.a >= 0.95) return sample;
1068
+ const under = await sampleVisualBackgroundAtPoint(node.parentElement || document.body, point, textColor, depth + 1);
1069
+ if (under.status === 'sampled') {
1070
+ return {
1071
+ status: 'sampled',
1072
+ color: blendRgba(sample.color, under.color),
1073
+ method: `${sample.method}+alpha`,
1074
+ };
1075
+ }
1076
+ return sample;
1077
+ }
1078
+ unresolved.push(sample.reason);
1079
+ }
1080
+
1081
+ return {
1082
+ status: 'unresolved',
1083
+ reason: [...new Set(unresolved.filter(Boolean))].slice(0, 3).join(', ') || 'no readable visual background',
1084
+ };
1085
+ }
1086
+
1087
+ async function analyzeVisualContrastCandidate(candidate) {
1088
+ let el;
1089
+ try {
1090
+ el = document.querySelector(candidate.selector);
1091
+ } catch {
1092
+ return { ...candidate, status: 'unresolved', confidence: 'none', reason: 'stale selector' };
1093
+ }
1094
+ if (!el) return { ...candidate, status: 'unresolved', confidence: 'none', reason: 'missing element' };
1095
+ if (!isRenderedForBrowserRule(el)) return { ...candidate, status: 'unresolved', confidence: 'none', reason: 'hidden element' };
1096
+
1097
+ const blockingReason = (candidate.reasons || []).find(reason =>
1098
+ reason === 'background-clip text' ||
1099
+ reason === 'blend mode' ||
1100
+ reason === 'filter' ||
1101
+ reason === 'backdrop filter' ||
1102
+ reason === 'opacity stack' ||
1103
+ reason === 'text shadow'
1104
+ );
1105
+ if (blockingReason) {
1106
+ return { ...candidate, status: 'unresolved', confidence: 'none', reason: `${blockingReason} needs screenshot pixels` };
1107
+ }
1108
+
1109
+ const style = getComputedStyle(el);
1110
+ const textColor = parseRgb(style.color) || candidate.textColor;
1111
+ if (!textColor) return { ...candidate, status: 'unresolved', confidence: 'none', reason: 'unreadable text color' };
1112
+
1113
+ const rect = getDirectTextRect(el) || el.getBoundingClientRect();
1114
+ if (!rect || rect.width < 4 || rect.height < 4) {
1115
+ return { ...candidate, status: 'unresolved', confidence: 'none', reason: 'missing text rect' };
1116
+ }
1117
+
1118
+ const points = textSamplePoints(rect);
1119
+ if (points.length === 0) {
1120
+ return { ...candidate, status: 'unresolved', confidence: 'none', reason: 'text outside viewport' };
1121
+ }
1122
+
1123
+ const ratios = [];
1124
+ const methods = new Set();
1125
+ const unresolved = [];
1126
+ for (const point of points) {
1127
+ const sample = await sampleVisualBackgroundAtPoint(el, point, textColor);
1128
+ if (sample.status !== 'sampled' || !sample.color) {
1129
+ unresolved.push(sample.reason);
1130
+ continue;
1131
+ }
1132
+ const fg = blendRgba(textColor, sample.color);
1133
+ ratios.push(contrastRatio(fg, sample.color));
1134
+ if (sample.method) methods.add(sample.method);
1135
+ }
1136
+
1137
+ if (ratios.length < Math.min(3, points.length)) {
1138
+ return {
1139
+ ...candidate,
1140
+ status: 'unresolved',
1141
+ confidence: 'none',
1142
+ samples: ratios.length,
1143
+ reason: [...new Set(unresolved.filter(Boolean))].slice(0, 3).join(', ') || 'not enough readable samples',
1144
+ };
1145
+ }
1146
+
1147
+ ratios.sort((a, b) => a - b);
1148
+ const pick = pct => ratios[Math.min(ratios.length - 1, Math.max(0, Math.floor((pct / 100) * ratios.length)))];
1149
+ const measuredRatio = pick(10);
1150
+ const medianRatio = pick(50);
1151
+ const status = measuredRatio < candidate.threshold ? 'fail' : 'pass';
1152
+ const method = [...methods].sort().join(', ') || 'browser-visual';
1153
+ const textLabel = candidate.text ? ` "${candidate.text}"` : '';
1154
+ const detail = `browser contrast ${measuredRatio.toFixed(1)}:1 median ${medianRatio.toFixed(1)}:1 (need ${candidate.threshold}:1) via ${method}${textLabel}`;
1155
+ return {
1156
+ ...candidate,
1157
+ status,
1158
+ confidence: method.includes('canvas-') ? 'high' : 'medium',
1159
+ method,
1160
+ ratio: measuredRatio,
1161
+ medianRatio,
1162
+ samples: ratios.length,
1163
+ finding: status === 'fail' ? { id: 'low-contrast', snippet: detail } : null,
1164
+ };
1165
+ }
1166
+
1167
+ function waitForVisualPaint() {
1168
+ return new Promise(resolve => {
1169
+ requestAnimationFrame(() => requestAnimationFrame(resolve));
1170
+ });
1171
+ }
1172
+
1173
+ async function analyzeVisualContrast(options = {}) {
1174
+ const candidates = collectVisualContrastCandidates(options);
1175
+ const results = [];
1176
+ const shouldScrollOffscreen = options.scrollOffscreen === true;
1177
+ const restoreScroll = { x: window.scrollX, y: window.scrollY };
1178
+ for (const candidate of candidates) {
1179
+ if (shouldScrollOffscreen && (window.scrollX !== restoreScroll.x || window.scrollY !== restoreScroll.y)) {
1180
+ window.scrollTo(restoreScroll.x, restoreScroll.y);
1181
+ await waitForVisualPaint();
1182
+ }
1183
+ let result = await analyzeVisualContrastCandidate(candidate);
1184
+ if (shouldScrollOffscreen && result.status === 'unresolved' && result.reason === 'text outside viewport') {
1185
+ let el = null;
1186
+ try {
1187
+ el = document.querySelector(candidate.selector);
1188
+ } catch {
1189
+ el = null;
1190
+ }
1191
+ if (el && typeof el.scrollIntoView === 'function') {
1192
+ el.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'instant' });
1193
+ await waitForVisualPaint();
1194
+ result = await analyzeVisualContrastCandidate(candidate);
1195
+ }
1196
+ }
1197
+ results.push(result);
1198
+ }
1199
+ if (shouldScrollOffscreen && (window.scrollX !== restoreScroll.x || window.scrollY !== restoreScroll.y)) {
1200
+ window.scrollTo(restoreScroll.x, restoreScroll.y);
1201
+ }
1202
+ return results;
1203
+ }
1204
+
1205
+ function isElementHidden(el) {
1206
+ if (!el || el === document.body || el === document.documentElement) return false;
1207
+ if (typeof el.checkVisibility === 'function') return !el.checkVisibility({ checkOpacity: false, checkVisibilityCSS: true });
1208
+ // Fallback: zero size or no offsetParent (covers display:none and detached subtrees)
1209
+ return el.offsetWidth === 0 && el.offsetHeight === 0;
1210
+ }
1211
+
1212
+ function serializeFindings(allFindings) {
1213
+ return allFindings.map(({ el, findings }) => ({
1214
+ selector: generateSelector(el),
1215
+ tagName: el.tagName?.toLowerCase() || 'unknown',
1216
+ rect: (el !== document.body && el !== document.documentElement && el.getBoundingClientRect)
1217
+ ? el.getBoundingClientRect().toJSON() : null,
1218
+ isPageLevel: el === document.body || el === document.documentElement,
1219
+ isHidden: isElementHidden(el),
1220
+ findings: findings.map(f => {
1221
+ const ap = ANTIPATTERNS.find(a => a.id === (f.type || f.id));
1222
+ return {
1223
+ type: f.type || f.id,
1224
+ category: ap ? ap.category : 'quality',
1225
+ severity: ap?.severity || 'warning',
1226
+ detail: f.detail || f.snippet,
1227
+ ignoreValue: f.ignoreValue || f.value || '',
1228
+ name: ap ? ap.name : (f.type || f.id),
1229
+ description: ap ? ap.description : '',
1230
+ };
1231
+ }),
1232
+ }));
1233
+ }
1234
+
1235
+ const printSummary = function(allFindings) {
1236
+ if (allFindings.length === 0) {
1237
+ console.log('%c[monodesign] No anti-patterns found.', 'color: #22c55e; font-weight: bold');
1238
+ return;
1239
+ }
1240
+ console.group(
1241
+ `%c[monodesign] ${allFindings.length} anti-pattern${allFindings.length === 1 ? '' : 's'} found`,
1242
+ 'color: oklch(84% 0.19 80.46); font-weight: bold'
1243
+ );
1244
+ for (const { el, findings } of allFindings) {
1245
+ for (const f of findings) {
1246
+ console.log(`%c${f.type || f.id}%c ${f.detail || f.snippet}`,
1247
+ 'color: oklch(84% 0.19 80.46); font-weight: bold', 'color: inherit', el);
1248
+ }
1249
+ }
1250
+ console.groupEnd();
1251
+ };
1252
+
1253
+ function addBrowserFindings(groupMap, el, findings) {
1254
+ if (!findings || findings.length === 0) return;
1255
+ const existing = groupMap.get(el);
1256
+ if (existing) existing.push(...findings);
1257
+ else groupMap.set(el, [...findings]);
1258
+ }
1259
+
1260
+ function browserFindingsFromMap(groupMap) {
1261
+ return [...groupMap.entries()].map(([el, findings]) => ({ el, findings }));
1262
+ }
1263
+
1264
+ const DESIGN_COLOR_TOLERANCE = 6;
1265
+ const DESIGN_RADIUS_TOLERANCE_PX = 0.5;
1266
+ const DESIGN_SKIP_TAGS = new Set(['head', 'title', 'meta', 'link', 'style', 'script', 'noscript', 'template', 'source']);
1267
+
1268
+ function normalizeBrowserFontName(value) {
1269
+ return String(value || '')
1270
+ .trim()
1271
+ .replace(/^["']|["']$/g, '')
1272
+ .replace(/\+/g, ' ')
1273
+ .replace(/\s+/g, ' ')
1274
+ .toLowerCase();
1275
+ }
1276
+
1277
+ function browserPrimaryFont(stack) {
1278
+ if (!stack || /var\(/i.test(stack)) return '';
1279
+ return String(stack || '')
1280
+ .split(',')
1281
+ .map(normalizeBrowserFontName)
1282
+ .find(font => font && !GENERIC_FONTS.has(font)) || '';
1283
+ }
1284
+
1285
+ function browserDesignSystemConfig() {
1286
+ const raw = window.__MONODESIGN_CONFIG__?.designSystem;
1287
+ if (!raw?.present) return null;
1288
+ const allowedFonts = new Set((raw.allowedFonts || []).map(normalizeBrowserFontName).filter(Boolean));
1289
+ const allowedColors = (raw.allowedColors || [])
1290
+ .filter(color => color && Number.isFinite(color.r) && Number.isFinite(color.g) && Number.isFinite(color.b))
1291
+ .map(color => ({ r: color.r, g: color.g, b: color.b }));
1292
+ const allowedRadii = (raw.allowedRadii || [])
1293
+ .map(Number)
1294
+ .filter(px => Number.isFinite(px));
1295
+ return {
1296
+ present: true,
1297
+ hasFonts: raw.hasFonts === true && allowedFonts.size > 0,
1298
+ allowedFonts,
1299
+ hasColors: raw.hasColors === true && allowedColors.length > 0,
1300
+ allowedColors,
1301
+ hasRadii: raw.hasRadii === true && allowedRadii.length > 0,
1302
+ allowedRadii,
1303
+ hasPillRadius: raw.hasPillRadius === true,
1304
+ };
1305
+ }
1306
+
1307
+ function browserColorsClose(a, b) {
1308
+ if (!a || !b) return false;
1309
+ return Math.max(
1310
+ Math.abs(a.r - b.r),
1311
+ Math.abs(a.g - b.g),
1312
+ Math.abs(a.b - b.b),
1313
+ ) <= DESIGN_COLOR_TOLERANCE;
1314
+ }
1315
+
1316
+ function isBrowserDesignColorAllowed(raw, designSystem) {
1317
+ if (!designSystem?.hasColors) return true;
1318
+ const text = String(raw || '').trim().toLowerCase();
1319
+ if (!text || text === 'transparent' || text === 'currentcolor' || text === 'inherit' || text === 'initial') return true;
1320
+ if (text.includes('var(')) return true;
1321
+ const parsed = parseAnyColor(text);
1322
+ if (!parsed) return true;
1323
+ if ((parsed.a ?? 1) <= 0.05) return true;
1324
+ return designSystem.allowedColors.some(color => browserColorsClose(parsed, color));
1325
+ }
1326
+
1327
+ function isBrowserTransparentCss(value) {
1328
+ const text = String(value || '').trim().toLowerCase();
1329
+ if (!text || text === 'transparent') return true;
1330
+ const parsed = parseAnyColor(text);
1331
+ return parsed ? (parsed.a ?? 1) <= 0.05 : false;
1332
+ }
1333
+
1334
+ function isBrowserDesignRadiusAllowed(raw, designSystem) {
1335
+ if (!designSystem?.hasRadii) return true;
1336
+ const text = String(raw || '').trim().toLowerCase();
1337
+ if (!text || text === '0' || text === 'none' || text === 'initial' || text === 'inherit') return true;
1338
+ if (text.includes('var(') || text.includes('%')) return true;
1339
+ const px = resolveLengthPx(text, 16);
1340
+ if (px == null || !Number.isFinite(px) || px <= DESIGN_RADIUS_TOLERANCE_PX) return true;
1341
+ if (designSystem.hasPillRadius && px >= 99) return true;
1342
+ return designSystem.allowedRadii.some(allowed => Math.abs(allowed - px) <= DESIGN_RADIUS_TOLERANCE_PX);
1343
+ }
1344
+
1345
+ function browserRadiusTokens(value) {
1346
+ return String(value || '')
1347
+ .replace(/\s*\/\s*/g, ' ')
1348
+ .split(/\s+/)
1349
+ .map(token => token.trim())
1350
+ .filter(Boolean);
1351
+ }
1352
+
1353
+ function browserHasDirectText(el) {
1354
+ return [...(el.childNodes || [])].some(node => node.nodeType === 3 && node.textContent.trim().length > 0);
1355
+ }
1356
+
1357
+ function browserSampleText(el) {
1358
+ const text = String(el.textContent || '').replace(/\s+/g, ' ').trim();
1359
+ return text ? ` "${text.slice(0, 40)}"` : '';
1360
+ }
1361
+
1362
+ function shouldSkipDesignElement(el) {
1363
+ const tag = el.tagName?.toLowerCase?.() || '';
1364
+ return DESIGN_SKIP_TAGS.has(tag) || isElementHidden(el);
1365
+ }
1366
+
1367
+ function checkElementDesignSystemDOM(el, designSystem, seen) {
1368
+ if (!designSystem?.present || shouldSkipDesignElement(el)) return [];
1369
+ const findings = [];
1370
+ const tag = el.tagName?.toLowerCase?.() || 'unknown';
1371
+ const style = getComputedStyle(el);
1372
+
1373
+ if (designSystem.hasFonts && browserHasDirectText(el)) {
1374
+ const font = browserPrimaryFont(style.fontFamily || '');
1375
+ if (font && !designSystem.allowedFonts.has(font) && !seen.fonts.has(font)) {
1376
+ seen.fonts.add(font);
1377
+ findings.push({
1378
+ type: 'design-system-font',
1379
+ detail: `${tag}${browserSampleText(el)} uses ${font}; not declared in DESIGN.md typography`,
1380
+ ignoreValue: font,
1381
+ });
1382
+ }
1383
+ }
1384
+
1385
+ if (designSystem.hasColors) {
1386
+ const colorChecks = [];
1387
+ if (browserHasDirectText(el)) colorChecks.push(['text color', style.color]);
1388
+ if (!isBrowserTransparentCss(style.backgroundColor)) colorChecks.push(['background', style.backgroundColor]);
1389
+ for (const side of ['Top', 'Right', 'Bottom', 'Left']) {
1390
+ if ((parseFloat(style[`border${side}Width`]) || 0) > 0) {
1391
+ colorChecks.push([`border-${side.toLowerCase()}`, style[`border${side}Color`]]);
1392
+ }
1393
+ }
1394
+ if ((parseFloat(style.outlineWidth) || 0) > 0) colorChecks.push(['outline', style.outlineColor]);
1395
+
1396
+ for (const [kind, raw] of colorChecks) {
1397
+ const label = String(raw || '').trim().replace(/\s+/g, ' ');
1398
+ if (isBrowserDesignColorAllowed(label, designSystem)) continue;
1399
+ const key = `${kind}:${label}`;
1400
+ if (seen.colors.has(key)) continue;
1401
+ seen.colors.add(key);
1402
+ findings.push({
1403
+ type: 'design-system-color',
1404
+ detail: `${kind} ${label} on ${tag}${browserSampleText(el)} is outside DESIGN.md colors`,
1405
+ ignoreValue: label,
1406
+ });
1407
+ }
1408
+ }
1409
+
1410
+ if (designSystem.hasRadii) {
1411
+ for (const token of browserRadiusTokens(style.borderRadius || '')) {
1412
+ if (isBrowserDesignRadiusAllowed(token, designSystem)) continue;
1413
+ if (seen.radii.has(token)) continue;
1414
+ seen.radii.add(token);
1415
+ findings.push({
1416
+ type: 'design-system-radius',
1417
+ detail: `border-radius ${token} on ${tag}${browserSampleText(el)} is outside the DESIGN.md rounded scale`,
1418
+ ignoreValue: token,
1419
+ });
1420
+ }
1421
+ }
1422
+
1423
+ return findings;
1424
+ }
1425
+
1426
+ function decodeBrowserGoogleFamily(value) {
1427
+ const family = String(value || '').split(':')[0].replace(/\+/g, ' ');
1428
+ try {
1429
+ return decodeURIComponent(family);
1430
+ } catch {
1431
+ return family;
1432
+ }
1433
+ }
1434
+
1435
+ function checkBrowserDesignSystemSources(designSystem, seen) {
1436
+ if (!designSystem?.hasFonts) return [];
1437
+ const findings = [];
1438
+ for (const link of document.querySelectorAll('link[href*="fonts.googleapis.com/css"]')) {
1439
+ const href = link.getAttribute('href') || '';
1440
+ for (const match of href.matchAll(/[?&]family=([^&]+)/g)) {
1441
+ const display = decodeBrowserGoogleFamily(match[1]);
1442
+ const font = normalizeBrowserFontName(display);
1443
+ if (!font || designSystem.allowedFonts.has(font) || seen.fonts.has(font)) continue;
1444
+ seen.fonts.add(font);
1445
+ findings.push({
1446
+ type: 'design-system-font',
1447
+ detail: `Google Fonts: ${display} is not declared in DESIGN.md typography`,
1448
+ ignoreValue: display,
1449
+ });
1450
+ }
1451
+ }
1452
+ return findings;
1453
+ }
1454
+
1455
+ function collectBrowserFindings() {
1456
+ const groupMap = new Map();
1457
+ const _disabled = EXTENSION_MODE ? (window.__MONODESIGN_CONFIG__?.disabledRules || []) : [];
1458
+ const _ruleOk = (id) => !_disabled.length || !_disabled.includes(id);
1459
+ const designSystem = browserDesignSystemConfig();
1460
+ const designSeen = { fonts: new Set(), colors: new Set(), radii: new Set() };
1461
+ // Note: provider-gated rules (--gpt / --gemini) are NOT filtered here. In a
1462
+ // real browser env (detector page, live overlay, extension) running every
1463
+ // check is free, so we always surface them; the gating is purely a CLI
1464
+ // output concern, applied in the Node engines' detect* return paths.
1465
+
1466
+ for (const el of document.querySelectorAll('*')) {
1467
+ // Skip monodesign's own elements and any descendants (overlays, labels, banner, nav buttons)
1468
+ if (el.closest('.monodesign-overlay, .monodesign-label, .monodesign-banner, .monodesign-tooltip')) continue;
1469
+ // Skip browser extension elements (Claude, etc.)
1470
+ const elId = el.id || '';
1471
+ if (elId.startsWith('claude-') || elId.startsWith('cic-')) continue;
1472
+ // Skip the monodesign live-mode overlay (highlight, tooltip, bar, picker, toast).
1473
+ // These are inspector chrome, not part of the user's design.
1474
+ if (el.closest('[id^="monodesign-live-"]')) continue;
1475
+ // Skip html/body -- page-level findings go in the banner, not a full-page overlay
1476
+ if (el === document.body || el === document.documentElement) continue;
1477
+
1478
+ const findings = [
1479
+ ...checkElementBordersDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1480
+ ...checkElementColorsDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1481
+ ...checkElementMotionDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1482
+ ...checkElementGlowDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1483
+ ...checkElementAIPaletteDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1484
+ ...checkElementIconTileDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1485
+ ...checkElementItalicSerifDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1486
+ ...checkElementQualityDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1487
+ ...checkElementOversizedH1DOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1488
+ ...checkElementClippedOverflowDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1489
+ ...checkElementGptBorderShadowDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1490
+ ...checkElementTextOverflowDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1491
+ ...checkElementImageDimensionsDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1492
+ ...checkElementSmallTouchTargetDOM(el).map(f => ({ type: f.id, detail: f.snippet })),
1493
+ ...checkElementDesignSystemDOM(el, designSystem, designSeen),
1494
+ ].filter(f => _ruleOk(f.type));
1495
+
1496
+ addBrowserFindings(groupMap, el, findings);
1497
+
1498
+ // Hero eyebrow: the offending element is the eyebrow above the heading,
1499
+ // not the heading itself — highlight the previous sibling instead.
1500
+ const eyebrowFindings = checkElementHeroEyebrowDOM(el)
1501
+ .map(f => ({ type: f.id, detail: f.snippet }))
1502
+ .filter(f => _ruleOk(f.type));
1503
+ if (eyebrowFindings.length > 0 && el.previousElementSibling) {
1504
+ addBrowserFindings(groupMap, el.previousElementSibling, eyebrowFindings);
1505
+ }
1506
+ }
1507
+
1508
+ const pageLevelFindings = [];
1509
+
1510
+ const designSourceFindings = checkBrowserDesignSystemSources(designSystem, designSeen)
1511
+ .filter(f => _ruleOk(f.type));
1512
+ if (designSourceFindings.length > 0) {
1513
+ pageLevelFindings.push(...designSourceFindings);
1514
+ addBrowserFindings(groupMap, document.body, designSourceFindings);
1515
+ }
1516
+
1517
+ const typoFindings = checkTypography().filter(f => _ruleOk(f.type));
1518
+ if (typoFindings.length > 0) {
1519
+ pageLevelFindings.push(...typoFindings);
1520
+ addBrowserFindings(groupMap, document.body, typoFindings);
1521
+ }
1522
+
1523
+ const sectionKickerFindings = checkRepeatedSectionKickersDOM()
1524
+ .map(f => ({ type: f.id, detail: f.snippet }))
1525
+ .filter(f => _ruleOk(f.type));
1526
+ if (sectionKickerFindings.length > 0) {
1527
+ pageLevelFindings.push(...sectionKickerFindings);
1528
+ addBrowserFindings(groupMap, document.body, sectionKickerFindings);
1529
+ }
1530
+
1531
+ const layoutFindings = checkLayout().filter(f => _ruleOk(f.type));
1532
+ for (const f of layoutFindings) {
1533
+ const el = f.el || document.body;
1534
+ addBrowserFindings(groupMap, el, [{ type: f.type, detail: f.detail || f.snippet }]);
1535
+ }
1536
+
1537
+ // Page-level quality checks (headings, etc.)
1538
+ const qualityFindings = checkPageQualityDOM().filter(f => _ruleOk(f.type));
1539
+ if (qualityFindings.length > 0) {
1540
+ pageLevelFindings.push(...qualityFindings);
1541
+ addBrowserFindings(groupMap, document.body, qualityFindings);
1542
+ }
1543
+
1544
+ const creamFindings = checkCreamPalette(document)
1545
+ .map(f => ({ type: f.id, detail: f.snippet }))
1546
+ .filter(f => _ruleOk(f.type));
1547
+ if (creamFindings.length > 0) {
1548
+ pageLevelFindings.push(...creamFindings);
1549
+ addBrowserFindings(groupMap, document.body, creamFindings);
1550
+ }
1551
+
1552
+ // Stylesheet-level accessibility rules (focus-visible, hover-only,
1553
+ // dark-scheme). Serialize every same-origin stylesheet to CSS text and
1554
+ // run the shared analyzers — cross-origin sheets throw on cssRules access
1555
+ // and are skipped.
1556
+ let stylesheetCssText = '';
1557
+ for (const sheet of Array.from(document.styleSheets || [])) {
1558
+ let rules;
1559
+ try { rules = sheet.cssRules; } catch { continue; }
1560
+ if (!rules) continue;
1561
+ for (const rule of Array.from(rules)) {
1562
+ try { stylesheetCssText += rule.cssText + '\n'; } catch { /* ignore */ }
1563
+ }
1564
+ }
1565
+ const stylesheetFindings = [
1566
+ ...checkFocusVisible(stylesheetCssText),
1567
+ ...checkHoverOnlyAffordance(stylesheetCssText),
1568
+ ...checkDarkSchemeContrast(stylesheetCssText),
1569
+ ].map(f => ({ type: f.id, detail: f.snippet })).filter(f => _ruleOk(f.type));
1570
+ if (stylesheetFindings.length > 0) {
1571
+ pageLevelFindings.push(...stylesheetFindings);
1572
+ addBrowserFindings(groupMap, document.body, stylesheetFindings);
1573
+ }
1574
+
1575
+ // Regex-on-HTML checks (shared with Node)
1576
+ // Clone the document and strip monodesign-live overlay nodes before the
1577
+ // regex scan, so the inspector's own inline styles (transitions on top/
1578
+ // left/width/height, etc.) don't register as page anti-patterns.
1579
+ const docClone = document.documentElement.cloneNode(true);
1580
+ for (const node of docClone.querySelectorAll('[id^="monodesign-live-"]')) {
1581
+ node.remove();
1582
+ }
1583
+ const htmlPatternFindings = checkHtmlPatterns(docClone.outerHTML);
1584
+ if (htmlPatternFindings.length > 0) {
1585
+ const mapped = htmlPatternFindings.map(f => ({ type: f.id, detail: f.snippet })).filter(f => _ruleOk(f.type));
1586
+ pageLevelFindings.push(...mapped);
1587
+ addBrowserFindings(groupMap, document.body, mapped);
1588
+ }
1589
+
1590
+ return {
1591
+ groupMap,
1592
+ allFindings: browserFindingsFromMap(groupMap),
1593
+ pageLevelFindings,
1594
+ };
1595
+ }
1596
+
1597
+ function shouldRunVisualContrast(options = {}) {
1598
+ return options.visualContrast === true || window.__MONODESIGN_CONFIG__?.visualContrast === true;
1599
+ }
1600
+
1601
+ function visualContrastOptions(options = {}) {
1602
+ const config = window.__MONODESIGN_CONFIG__ || {};
1603
+ const scrollOffscreen = typeof options.scrollOffscreen === 'boolean'
1604
+ ? options.scrollOffscreen
1605
+ : typeof options.visualContrastScrollOffscreen === 'boolean'
1606
+ ? options.visualContrastScrollOffscreen
1607
+ : typeof config.visualContrastScrollOffscreen === 'boolean'
1608
+ ? config.visualContrastScrollOffscreen
1609
+ : false;
1610
+ return {
1611
+ ...options,
1612
+ maxCandidates: Number.isFinite(options.visualContrastMaxCandidates)
1613
+ ? options.visualContrastMaxCandidates
1614
+ : Number.isFinite(options.maxCandidates)
1615
+ ? options.maxCandidates
1616
+ : Number.isFinite(config.visualContrastMaxCandidates)
1617
+ ? config.visualContrastMaxCandidates
1618
+ : undefined,
1619
+ scrollOffscreen,
1620
+ };
1621
+ }
1622
+
1623
+ let lastVisualContrastAnalyses = [];
1624
+ let lazyVisualContrastObserver = null;
1625
+ let lazyVisualContrastPending = new WeakMap();
1626
+ const lazyVisualContrastResolving = new WeakSet();
1627
+ let scanGeneration = 0;
1628
+
1629
+ function rememberVisualContrastAnalysis(result) {
1630
+ if (!result?.selector) {
1631
+ lastVisualContrastAnalyses.push(result);
1632
+ return;
1633
+ }
1634
+ const idx = lastVisualContrastAnalyses.findIndex(item => item.selector === result.selector);
1635
+ if (idx >= 0) lastVisualContrastAnalyses[idx] = result;
1636
+ else lastVisualContrastAnalyses.push(result);
1637
+ }
1638
+
1639
+ function disconnectLazyVisualContrastObserver() {
1640
+ if (lazyVisualContrastObserver) {
1641
+ lazyVisualContrastObserver.disconnect();
1642
+ lazyVisualContrastObserver = null;
1643
+ }
1644
+ lazyVisualContrastPending = new WeakMap();
1645
+ }
1646
+
1647
+ function addVisualContrastResult(groupMap, result, options = {}) {
1648
+ if (result.status !== 'fail' || !result.finding || !result.selector) return false;
1649
+ let el = null;
1650
+ try {
1651
+ el = document.querySelector(result.selector);
1652
+ } catch {
1653
+ el = null;
1654
+ }
1655
+ if (!el) return false;
1656
+ const findingType = result.finding.type || result.finding.id || 'low-contrast';
1657
+ const existing = groupMap.get(el) || [];
1658
+ if (existing.some(f => (f.type || f.id) === findingType)) return false;
1659
+ addBrowserFindings(groupMap, el, [{
1660
+ type: findingType,
1661
+ detail: result.finding.detail || result.finding.snippet,
1662
+ }]);
1663
+ if (options.decorate && el !== document.body && el !== document.documentElement) {
1664
+ highlight(el, groupMap.get(el) || []);
1665
+ }
1666
+ return true;
1667
+ }
1668
+
1669
+ function scanResultMeta(options = {}) {
1670
+ const scanId = options.scanId;
1671
+ if (typeof scanId !== 'string' && typeof scanId !== 'number') return {};
1672
+ return { scanId: String(scanId) };
1673
+ }
1674
+
1675
+ function postSerializedFindings(groupMap, options = {}) {
1676
+ if (!EXTENSION_MODE) return;
1677
+ const allFindings = browserFindingsFromMap(groupMap);
1678
+ window.postMessage({
1679
+ source: 'monodesign-results',
1680
+ findings: serializeFindings(allFindings),
1681
+ count: allFindings.length,
1682
+ ...scanResultMeta(options),
1683
+ }, '*');
1684
+ }
1685
+
1686
+ function postExtensionError(err) {
1687
+ if (!EXTENSION_MODE) return;
1688
+ window.postMessage({
1689
+ source: 'monodesign-error',
1690
+ message: err?.message || String(err),
1691
+ }, '*');
1692
+ }
1693
+
1694
+ function reportVisualContrastError(err, detail = {}) {
1695
+ window.dispatchEvent(new CustomEvent('monodesign-visual-contrast-error', {
1696
+ detail: {
1697
+ ...detail,
1698
+ message: err?.message || String(err),
1699
+ },
1700
+ }));
1701
+ if (EXTENSION_MODE) {
1702
+ postExtensionError(err);
1703
+ } else {
1704
+ console.warn('[monodesign] visual contrast scan failed', err);
1705
+ }
1706
+ }
1707
+
1708
+ function scheduleLazyVisualContrast(groupMap, analyses, options = {}, runtime = {}) {
1709
+ disconnectLazyVisualContrastObserver();
1710
+ if (options.visualContrastLazy === false || options.scrollOffscreen !== false) return;
1711
+ if (typeof IntersectionObserver === 'undefined') return;
1712
+ const unresolved = (analyses || []).filter(result =>
1713
+ result?.status === 'unresolved' &&
1714
+ result.reason === 'text outside viewport' &&
1715
+ result.selector
1716
+ );
1717
+ if (unresolved.length === 0) return;
1718
+ const generation = runtime.generation || scanGeneration;
1719
+
1720
+ lazyVisualContrastObserver = new IntersectionObserver((entries) => {
1721
+ for (const entry of entries) {
1722
+ if (!entry.isIntersecting) continue;
1723
+ const el = entry.target;
1724
+ const candidate = lazyVisualContrastPending.get(el);
1725
+ if (!candidate || lazyVisualContrastResolving.has(el)) continue;
1726
+ lazyVisualContrastObserver?.unobserve(el);
1727
+ lazyVisualContrastPending.delete(el);
1728
+ lazyVisualContrastResolving.add(el);
1729
+ waitForVisualPaint()
1730
+ .then(() => analyzeVisualContrastCandidate(candidate))
1731
+ .then(result => {
1732
+ if (generation !== scanGeneration) return;
1733
+ rememberVisualContrastAnalysis(result);
1734
+ const added = addVisualContrastResult(groupMap, result, { decorate: true });
1735
+ if (added) {
1736
+ postSerializedFindings(groupMap, options);
1737
+ window.dispatchEvent(new CustomEvent('monodesign-visual-contrast-resolved', {
1738
+ detail: {
1739
+ selector: result.selector,
1740
+ status: result.status,
1741
+ finding: result.finding || null,
1742
+ },
1743
+ }));
1744
+ }
1745
+ })
1746
+ .catch(err => {
1747
+ reportVisualContrastError(err, { selector: candidate.selector });
1748
+ })
1749
+ .finally(() => {
1750
+ lazyVisualContrastResolving.delete(el);
1751
+ });
1752
+ }
1753
+ }, { threshold: 0.5 });
1754
+
1755
+ for (const candidate of unresolved) {
1756
+ let el = null;
1757
+ try {
1758
+ el = document.querySelector(candidate.selector);
1759
+ } catch {
1760
+ el = null;
1761
+ }
1762
+ if (!el) continue;
1763
+ lazyVisualContrastPending.set(el, candidate);
1764
+ lazyVisualContrastObserver.observe(el);
1765
+ }
1766
+ }
1767
+
1768
+ async function addVisualContrastFindings(groupMap, options = {}, runtime = {}) {
1769
+ if (!shouldRunVisualContrast(options)) {
1770
+ lastVisualContrastAnalyses = [];
1771
+ disconnectLazyVisualContrastObserver();
1772
+ return [];
1773
+ }
1774
+ const resolvedOptions = visualContrastOptions(options);
1775
+ const analyses = await analyzeVisualContrast(resolvedOptions);
1776
+ if (runtime.generation && runtime.generation !== scanGeneration) return analyses;
1777
+ lastVisualContrastAnalyses = analyses;
1778
+ for (const result of analyses) {
1779
+ addVisualContrastResult(groupMap, result, { decorate: runtime.decorate });
1780
+ }
1781
+ if (runtime.decorate || runtime.scheduleLazy) scheduleLazyVisualContrast(groupMap, analyses, resolvedOptions, runtime);
1782
+ return analyses;
1783
+ }
1784
+
1785
+ async function collectBrowserFindingsAsync(options = {}, runtime = {}) {
1786
+ const collected = collectBrowserFindings();
1787
+ await addVisualContrastFindings(collected.groupMap, options, runtime);
1788
+ return {
1789
+ ...collected,
1790
+ allFindings: browserFindingsFromMap(collected.groupMap),
1791
+ visualContrastAnalyses: lastVisualContrastAnalyses,
1792
+ };
1793
+ }
1794
+
1795
+ function clearOverlays() {
1796
+ scanGeneration += 1;
1797
+ disconnectLazyVisualContrastObserver();
1798
+ for (const o of [...overlays]) detachOverlay(o);
1799
+ overlays.length = 0;
1800
+ visibilityObserver.disconnect();
1801
+ overlayIndex = 0;
1802
+ }
1803
+
1804
+ function renderBrowserFindings(collected, options = {}) {
1805
+ const { allFindings, pageLevelFindings } = collected;
1806
+
1807
+ for (const { el, findings } of allFindings) {
1808
+ if (el === document.body || el === document.documentElement) continue;
1809
+ highlight(el, findings);
1810
+ }
1811
+
1812
+ if (pageLevelFindings.length > 0) {
1813
+ showPageBanner(pageLevelFindings);
1814
+ }
1815
+
1816
+ if (!EXTENSION_MODE) printSummary(allFindings);
1817
+
1818
+ // In extension mode, post serialized results for the DevTools panel
1819
+ if (EXTENSION_MODE) {
1820
+ window.postMessage({
1821
+ source: 'monodesign-results',
1822
+ findings: serializeFindings(allFindings),
1823
+ count: allFindings.length,
1824
+ ...scanResultMeta(options),
1825
+ }, '*');
1826
+ }
1827
+
1828
+ // After this scan completes, all subsequent reveals are instant (no stagger, no animation)
1829
+ setTimeout(() => { firstScanDone = true; }, 1000);
1830
+
1831
+ return allFindings;
1832
+ }
1833
+
1834
+ let firstScanDone = false;
1835
+ const scan = function(options = {}) {
1836
+ clearOverlays();
1837
+ const generation = scanGeneration;
1838
+ const collected = collectBrowserFindings();
1839
+ const allFindings = renderBrowserFindings(collected, options);
1840
+ if (shouldRunVisualContrast(options)) {
1841
+ addVisualContrastFindings(collected.groupMap, options, { decorate: true, generation })
1842
+ .then(() => {
1843
+ if (generation === scanGeneration) postSerializedFindings(collected.groupMap, options);
1844
+ })
1845
+ .catch(err => {
1846
+ reportVisualContrastError(err);
1847
+ });
1848
+ }
1849
+ return allFindings;
1850
+ };
1851
+
1852
+ const scanAsync = async function(options = {}) {
1853
+ clearOverlays();
1854
+ const generation = scanGeneration;
1855
+ if (shouldRunVisualContrast(options)) {
1856
+ const collected = await collectBrowserFindingsAsync(options, { generation, scheduleLazy: true });
1857
+ if (generation !== scanGeneration) return [];
1858
+ return renderBrowserFindings(collected, options);
1859
+ }
1860
+ lastVisualContrastAnalyses = [];
1861
+ return renderBrowserFindings(collectBrowserFindings(), options);
1862
+ };
1863
+
1864
+ const detect = function(options = {}) {
1865
+ lastVisualContrastAnalyses = [];
1866
+ const { allFindings } = collectBrowserFindings();
1867
+ return options.serialize === false ? allFindings : serializeFindings(allFindings);
1868
+ };
1869
+
1870
+ const detectAsync = async function(options = {}) {
1871
+ if (shouldRunVisualContrast(options)) {
1872
+ const { allFindings } = await collectBrowserFindingsAsync(options);
1873
+ return options.serialize === false ? allFindings : serializeFindings(allFindings);
1874
+ }
1875
+ lastVisualContrastAnalyses = [];
1876
+ const { allFindings } = collectBrowserFindings();
1877
+ return options.serialize === false ? allFindings : serializeFindings(allFindings);
1878
+ };
1879
+
1880
+ if (EXTENSION_MODE) {
1881
+ // Extension mode: listen for commands, don't auto-scan
1882
+ window.addEventListener('message', (e) => {
1883
+ if (e.source !== window || !e.data || e.data.source !== 'monodesign-command') return;
1884
+ if (e.data.action === 'scan') {
1885
+ if (e.data.config) window.__MONODESIGN_CONFIG__ = e.data.config;
1886
+ try {
1887
+ scan(e.data.config || {});
1888
+ } catch (err) {
1889
+ postExtensionError(err);
1890
+ }
1891
+ }
1892
+ if (e.data.action === 'toggle-overlays') {
1893
+ const visible = !document.body.classList.contains('monodesign-hidden');
1894
+ document.body.classList.toggle('monodesign-hidden', visible);
1895
+ window.postMessage({ source: 'monodesign-overlays-toggled', visible: !visible }, '*');
1896
+ }
1897
+ if (e.data.action === 'remove') {
1898
+ clearOverlays();
1899
+ styleEl.remove();
1900
+ if (spotlightBackdrop) { spotlightBackdrop.remove(); spotlightBackdrop = null; }
1901
+ document.body.classList.remove('monodesign-hidden');
1902
+ }
1903
+ if (e.data.action === 'highlight') {
1904
+ try {
1905
+ const target = e.data.selector ? document.querySelector(e.data.selector) : null;
1906
+ if (target) {
1907
+ // Scroll first so positionOverlay reads the post-scroll rect
1908
+ if (!isInViewport(target) && target.scrollIntoView) {
1909
+ target.scrollIntoView({ behavior: 'instant', block: 'center' });
1910
+ }
1911
+ for (const o of overlays) {
1912
+ if (o.classList.contains('monodesign-banner')) continue;
1913
+ const isMatch = o._targetEl === target;
1914
+ o.classList.toggle('monodesign-spotlight', isMatch);
1915
+ o.classList.toggle('monodesign-spotlight-dimmed', !isMatch);
1916
+ if (isMatch) {
1917
+ // Force the matching overlay visible immediately, don't wait for IntersectionObserver
1918
+ o.style.display = '';
1919
+ o.style.animation = 'none';
1920
+ o.classList.add('monodesign-visible');
1921
+ o._revealed = true;
1922
+ positionOverlay(o);
1923
+ }
1924
+ }
1925
+ showSpotlight(target);
1926
+ }
1927
+ } catch { /* invalid selector */ }
1928
+ }
1929
+ if (e.data.action === 'unhighlight') {
1930
+ hideSpotlight();
1931
+ for (const o of overlays) {
1932
+ o.classList.remove('monodesign-spotlight');
1933
+ o.classList.remove('monodesign-spotlight-dimmed');
1934
+ }
1935
+ }
1936
+ });
1937
+ window.postMessage({ source: 'monodesign-ready' }, '*');
1938
+ } else {
1939
+ if (window.__MONODESIGN_CONFIG__?.autoScan !== false) {
1940
+ const runAutoScan = () => {
1941
+ try {
1942
+ scan();
1943
+ } catch (err) {
1944
+ console.warn('[monodesign] scan failed', err);
1945
+ }
1946
+ };
1947
+ if (document.readyState === 'loading') {
1948
+ document.addEventListener('DOMContentLoaded', () => setTimeout(runAutoScan, 100));
1949
+ } else {
1950
+ setTimeout(runAutoScan, 100);
1951
+ }
1952
+ }
1953
+ }
1954
+
1955
+ window.monodesignDetect = detect;
1956
+ window.monodesignDetectAsync = detectAsync;
1957
+ window.monodesignScan = scan;
1958
+ window.monodesignScanAsync = scanAsync;
1959
+ window.monodesignCollectVisualContrastCandidates = collectVisualContrastCandidates;
1960
+ window.monodesignAnalyzeVisualContrast = analyzeVisualContrast;
1961
+ window.monodesignGetLastVisualContrastAnalyses = () => lastVisualContrastAnalyses.slice();
1962
+ }