claudecode-omc 5.11.0 → 5.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) hide show
  1. package/bundled/manifest.json +3 -3
  2. package/bundled/upstream/anthropic-skills/.omc-source/bundle.json +2 -2
  3. package/bundled/upstream/anthropic-skills/.omc-source/provenance.json +394 -390
  4. package/bundled/upstream/anthropic-skills/skills/claude-api/SKILL.md +60 -29
  5. package/bundled/upstream/anthropic-skills/skills/claude-api/csharp/claude-api.md +46 -1
  6. package/bundled/upstream/anthropic-skills/skills/claude-api/curl/examples.md +2 -2
  7. package/bundled/upstream/anthropic-skills/skills/claude-api/curl/managed-agents.md +3 -1
  8. package/bundled/upstream/anthropic-skills/skills/claude-api/go/claude-api.md +23 -4
  9. package/bundled/upstream/anthropic-skills/skills/claude-api/java/claude-api.md +32 -3
  10. package/bundled/upstream/anthropic-skills/skills/claude-api/php/claude-api.md +27 -0
  11. package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/README.md +123 -7
  12. package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/batches.md +13 -0
  13. package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/files-api.md +7 -2
  14. package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/streaming.md +18 -1
  15. package/bundled/upstream/anthropic-skills/skills/claude-api/python/managed-agents/README.md +9 -7
  16. package/bundled/upstream/anthropic-skills/skills/claude-api/ruby/claude-api.md +27 -0
  17. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/agent-design.md +1 -1
  18. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/anthropic-cli.md +246 -0
  19. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/claude-platform-on-aws.md +59 -0
  20. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/error-codes.md +24 -4
  21. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/live-sources.md +8 -0
  22. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-api-reference.md +48 -4
  23. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-client-patterns.md +3 -1
  24. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-core.md +15 -1
  25. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-environments.md +10 -6
  26. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-events.md +25 -0
  27. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-onboarding.md +48 -18
  28. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-overview.md +8 -5
  29. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-scheduled-deployments.md +144 -0
  30. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-self-hosted-sandboxes.md +2 -1
  31. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/managed-agents-tools.md +46 -9
  32. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/model-migration.md +259 -3
  33. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/models.md +17 -9
  34. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/prompt-caching.md +55 -3
  35. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/token-counting.md +56 -0
  36. package/bundled/upstream/anthropic-skills/skills/claude-api/shared/tool-use-concepts.md +22 -2
  37. package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/claude-api/README.md +45 -6
  38. package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/claude-api/streaming.md +1 -1
  39. package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/managed-agents/README.md +10 -12
  40. package/bundled/upstream/anthropic-skills/skills/frontend-design/SKILL.md +39 -26
  41. package/bundled/upstream/ecc/.omc-source/bundle.json +2 -2
  42. package/bundled/upstream/ecc/.omc-source/manifests/.claude-plugin/marketplace.json +2 -2
  43. package/bundled/upstream/ecc/.omc-source/provenance.json +602 -550
  44. package/bundled/upstream/ecc/agents/agent-evaluator.md +206 -0
  45. package/bundled/upstream/ecc/agents/performance-optimizer.md +9 -9
  46. package/bundled/upstream/ecc/agents/php-reviewer.md +109 -0
  47. package/bundled/upstream/ecc/agents/spec-miner.md +217 -0
  48. package/bundled/upstream/ecc/agents/vue-reviewer.md +206 -0
  49. package/bundled/upstream/ecc/commands/cost-report.md +58 -84
  50. package/bundled/upstream/ecc/commands/epic-claim.md +26 -0
  51. package/bundled/upstream/ecc/commands/epic-decompose.md +23 -0
  52. package/bundled/upstream/ecc/commands/epic-publish.md +23 -0
  53. package/bundled/upstream/ecc/commands/epic-review.md +23 -0
  54. package/bundled/upstream/ecc/commands/epic-sync.md +23 -0
  55. package/bundled/upstream/ecc/commands/epic-unblock.md +22 -0
  56. package/bundled/upstream/ecc/commands/epic-validate.md +22 -0
  57. package/bundled/upstream/ecc/commands/instinct-status.md +8 -8
  58. package/bundled/upstream/ecc/commands/multi-backend.md +2 -0
  59. package/bundled/upstream/ecc/commands/multi-execute.md +2 -0
  60. package/bundled/upstream/ecc/commands/multi-frontend.md +2 -0
  61. package/bundled/upstream/ecc/commands/multi-plan.md +2 -0
  62. package/bundled/upstream/ecc/commands/multi-workflow.md +2 -0
  63. package/bundled/upstream/ecc/commands/orch-add-feature.md +36 -0
  64. package/bundled/upstream/ecc/commands/orch-build-mvp.md +36 -0
  65. package/bundled/upstream/ecc/commands/orch-change-feature.md +38 -0
  66. package/bundled/upstream/ecc/commands/orch-fix-defect.md +38 -0
  67. package/bundled/upstream/ecc/commands/orch-refine-code.md +39 -0
  68. package/bundled/upstream/ecc/commands/quality-gate.md +34 -16
  69. package/bundled/upstream/ecc/commands/vue-review.md +174 -0
  70. package/bundled/upstream/ecc/skills/accessibility/SKILL.md +2 -1
  71. package/bundled/upstream/ecc/skills/agent-architecture-audit/SKILL.md +2 -1
  72. package/bundled/upstream/ecc/skills/agent-eval/SKILL.md +2 -1
  73. package/bundled/upstream/ecc/skills/agent-harness-construction/SKILL.md +2 -1
  74. package/bundled/upstream/ecc/skills/agent-introspection-debugging/SKILL.md +2 -1
  75. package/bundled/upstream/ecc/skills/agent-payment-x402/SKILL.md +2 -1
  76. package/bundled/upstream/ecc/skills/agent-self-evaluation/SKILL.md +182 -0
  77. package/bundled/upstream/ecc/skills/agent-self-evaluation/examples/high-score-example.md +87 -0
  78. package/bundled/upstream/ecc/skills/agent-self-evaluation/examples/low-score-example.md +86 -0
  79. package/bundled/upstream/ecc/skills/agent-self-evaluation/references/evaluation-criteria.md +71 -0
  80. package/bundled/upstream/ecc/skills/agent-self-evaluation/references/hook-integration.md +64 -0
  81. package/bundled/upstream/ecc/skills/agent-self-evaluation/scripts/evaluate.py +408 -0
  82. package/bundled/upstream/ecc/skills/agent-self-evaluation/templates/evaluation-report.md +86 -0
  83. package/bundled/upstream/ecc/skills/agent-sort/SKILL.md +2 -1
  84. package/bundled/upstream/ecc/skills/agentic-engineering/SKILL.md +2 -1
  85. package/bundled/upstream/ecc/skills/agentic-os/SKILL.md +2 -1
  86. package/bundled/upstream/ecc/skills/ai-first-engineering/SKILL.md +2 -1
  87. package/bundled/upstream/ecc/skills/ai-regression-testing/SKILL.md +2 -1
  88. package/bundled/upstream/ecc/skills/android-clean-architecture/SKILL.md +2 -1
  89. package/bundled/upstream/ecc/skills/angular-developer/SKILL.md +2 -1
  90. package/bundled/upstream/ecc/skills/api-connector-builder/SKILL.md +2 -1
  91. package/bundled/upstream/ecc/skills/api-design/SKILL.md +2 -1
  92. package/bundled/upstream/ecc/skills/architecture-decision-records/SKILL.md +2 -1
  93. package/bundled/upstream/ecc/skills/article-writing/SKILL.md +2 -1
  94. package/bundled/upstream/ecc/skills/automation-audit-ops/SKILL.md +2 -1
  95. package/bundled/upstream/ecc/skills/autonomous-agent-harness/SKILL.md +2 -1
  96. package/bundled/upstream/ecc/skills/autonomous-loops/SKILL.md +2 -1
  97. package/bundled/upstream/ecc/skills/backend-patterns/SKILL.md +2 -1
  98. package/bundled/upstream/ecc/skills/benchmark/SKILL.md +2 -1
  99. package/bundled/upstream/ecc/skills/benchmark-methodology/SKILL.md +190 -0
  100. package/bundled/upstream/ecc/skills/benchmark-optimization-loop/SKILL.md +2 -1
  101. package/bundled/upstream/ecc/skills/blender-motion-state-inspection/SKILL.md +2 -1
  102. package/bundled/upstream/ecc/skills/blueprint/SKILL.md +2 -1
  103. package/bundled/upstream/ecc/skills/brand-discovery/SKILL.md +145 -0
  104. package/bundled/upstream/ecc/skills/brand-discovery/references/10_purpose-why.md +40 -0
  105. package/bundled/upstream/ecc/skills/brand-discovery/references/20_positioning.md +44 -0
  106. package/bundled/upstream/ecc/skills/brand-discovery/references/30_audience-niche.md +52 -0
  107. package/bundled/upstream/ecc/skills/brand-discovery/references/40_personality-archetype.md +57 -0
  108. package/bundled/upstream/ecc/skills/brand-discovery/references/50_voice-tone.md +59 -0
  109. package/bundled/upstream/ecc/skills/brand-discovery/references/60_narrative-story.md +50 -0
  110. package/bundled/upstream/ecc/skills/brand-discovery/references/70_founder-tension.md +49 -0
  111. package/bundled/upstream/ecc/skills/brand-discovery/references/90_SYNTHESIS.md +133 -0
  112. package/bundled/upstream/ecc/skills/brand-voice/SKILL.md +2 -1
  113. package/bundled/upstream/ecc/skills/browser-qa/SKILL.md +22 -4
  114. package/bundled/upstream/ecc/skills/bun-runtime/SKILL.md +2 -1
  115. package/bundled/upstream/ecc/skills/canary-watch/SKILL.md +2 -1
  116. package/bundled/upstream/ecc/skills/carrier-relationship-management/SKILL.md +1 -1
  117. package/bundled/upstream/ecc/skills/cisco-ios-patterns/SKILL.md +2 -1
  118. package/bundled/upstream/ecc/skills/ck/SKILL.md +2 -1
  119. package/bundled/upstream/ecc/skills/claude-devfleet/SKILL.md +11 -2
  120. package/bundled/upstream/ecc/skills/click-path-audit/SKILL.md +2 -1
  121. package/bundled/upstream/ecc/skills/clickhouse-io/SKILL.md +2 -1
  122. package/bundled/upstream/ecc/skills/code-tour/SKILL.md +2 -1
  123. package/bundled/upstream/ecc/skills/codebase-onboarding/SKILL.md +2 -1
  124. package/bundled/upstream/ecc/skills/codehealth-mcp/SKILL.md +167 -0
  125. package/bundled/upstream/ecc/skills/coding-standards/SKILL.md +4 -2
  126. package/bundled/upstream/ecc/skills/competitive-platform-analysis/SKILL.md +214 -0
  127. package/bundled/upstream/ecc/skills/competitive-report-structure/SKILL.md +162 -0
  128. package/bundled/upstream/ecc/skills/compose-multiplatform-patterns/SKILL.md +2 -1
  129. package/bundled/upstream/ecc/skills/config-gc/SKILL.md +120 -0
  130. package/bundled/upstream/ecc/skills/configure-ecc/SKILL.md +2 -1
  131. package/bundled/upstream/ecc/skills/connections-optimizer/SKILL.md +2 -1
  132. package/bundled/upstream/ecc/skills/content-engine/SKILL.md +2 -1
  133. package/bundled/upstream/ecc/skills/content-hash-cache-pattern/SKILL.md +2 -1
  134. package/bundled/upstream/ecc/skills/context-budget/SKILL.md +2 -1
  135. package/bundled/upstream/ecc/skills/continuous-agent-loop/SKILL.md +2 -1
  136. package/bundled/upstream/ecc/skills/continuous-learning/SKILL.md +2 -1
  137. package/bundled/upstream/ecc/skills/continuous-learning-v2/SKILL.md +2 -1
  138. package/bundled/upstream/ecc/skills/continuous-learning-v2/agents/observer-loop.sh +14 -1
  139. package/bundled/upstream/ecc/skills/continuous-learning-v2/hooks/observe.sh +31 -7
  140. package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/instinct-cli.py +90 -2
  141. package/bundled/upstream/ecc/skills/continuous-learning-v2/scripts/test_parse_instinct.py +27 -0
  142. package/bundled/upstream/ecc/skills/cost-aware-llm-pipeline/SKILL.md +2 -1
  143. package/bundled/upstream/ecc/skills/cost-tracking/SKILL.md +58 -108
  144. package/bundled/upstream/ecc/skills/council/SKILL.md +2 -1
  145. package/bundled/upstream/ecc/skills/cpp-coding-standards/SKILL.md +2 -1
  146. package/bundled/upstream/ecc/skills/cpp-testing/SKILL.md +2 -1
  147. package/bundled/upstream/ecc/skills/crosspost/SKILL.md +2 -1
  148. package/bundled/upstream/ecc/skills/csharp-testing/SKILL.md +2 -1
  149. package/bundled/upstream/ecc/skills/customer-billing-ops/SKILL.md +2 -1
  150. package/bundled/upstream/ecc/skills/customs-trade-compliance/SKILL.md +1 -1
  151. package/bundled/upstream/ecc/skills/dart-flutter-patterns/SKILL.md +2 -1
  152. package/bundled/upstream/ecc/skills/dashboard-builder/SKILL.md +2 -1
  153. package/bundled/upstream/ecc/skills/data-scraper-agent/SKILL.md +2 -1
  154. package/bundled/upstream/ecc/skills/data-throughput-accelerator/SKILL.md +2 -1
  155. package/bundled/upstream/ecc/skills/database-migrations/SKILL.md +2 -1
  156. package/bundled/upstream/ecc/skills/deep-research/SKILL.md +2 -1
  157. package/bundled/upstream/ecc/skills/defi-amm-security/SKILL.md +2 -1
  158. package/bundled/upstream/ecc/skills/deployment-patterns/SKILL.md +2 -1
  159. package/bundled/upstream/ecc/skills/design-system/SKILL.md +2 -1
  160. package/bundled/upstream/ecc/skills/django-celery/SKILL.md +3 -2
  161. package/bundled/upstream/ecc/skills/django-patterns/SKILL.md +2 -1
  162. package/bundled/upstream/ecc/skills/django-security/SKILL.md +2 -1
  163. package/bundled/upstream/ecc/skills/django-tdd/SKILL.md +2 -1
  164. package/bundled/upstream/ecc/skills/django-verification/SKILL.md +2 -1
  165. package/bundled/upstream/ecc/skills/dmux-workflows/SKILL.md +2 -1
  166. package/bundled/upstream/ecc/skills/docker-patterns/SKILL.md +2 -1
  167. package/bundled/upstream/ecc/skills/documentation-lookup/SKILL.md +2 -1
  168. package/bundled/upstream/ecc/skills/dotnet-patterns/SKILL.md +2 -1
  169. package/bundled/upstream/ecc/skills/dynamic-workflow-mode/SKILL.md +2 -1
  170. package/bundled/upstream/ecc/skills/e2e-testing/SKILL.md +2 -1
  171. package/bundled/upstream/ecc/skills/ecc-guide/SKILL.md +2 -1
  172. package/bundled/upstream/ecc/skills/ecc-tools-cost-audit/SKILL.md +2 -1
  173. package/bundled/upstream/ecc/skills/email-ops/SKILL.md +2 -1
  174. package/bundled/upstream/ecc/skills/energy-procurement/SKILL.md +1 -1
  175. package/bundled/upstream/ecc/skills/enterprise-agent-ops/SKILL.md +2 -1
  176. package/bundled/upstream/ecc/skills/error-handling/SKILL.md +2 -1
  177. package/bundled/upstream/ecc/skills/eval-harness/SKILL.md +2 -1
  178. package/bundled/upstream/ecc/skills/evm-token-decimals/SKILL.md +2 -1
  179. package/bundled/upstream/ecc/skills/exa-search/SKILL.md +2 -1
  180. package/bundled/upstream/ecc/skills/fal-ai-media/SKILL.md +2 -1
  181. package/bundled/upstream/ecc/skills/fastapi-patterns/SKILL.md +375 -188
  182. package/bundled/upstream/ecc/skills/finance-billing-ops/SKILL.md +2 -1
  183. package/bundled/upstream/ecc/skills/flox-environments/SKILL.md +3 -2
  184. package/bundled/upstream/ecc/skills/flutter-dart-code-review/SKILL.md +2 -1
  185. package/bundled/upstream/ecc/skills/frontend-a11y/SKILL.md +3 -3
  186. package/bundled/upstream/ecc/skills/frontend-design-direction/SKILL.md +2 -1
  187. package/bundled/upstream/ecc/skills/frontend-patterns/SKILL.md +23 -8
  188. package/bundled/upstream/ecc/skills/frontend-slides/SKILL.md +2 -1
  189. package/bundled/upstream/ecc/skills/frontend-slides/scripts/export-pdf.sh +1 -1
  190. package/bundled/upstream/ecc/skills/fsharp-testing/SKILL.md +2 -1
  191. package/bundled/upstream/ecc/skills/gan-style-harness/SKILL.md +2 -1
  192. package/bundled/upstream/ecc/skills/gateguard/SKILL.md +9 -1
  193. package/bundled/upstream/ecc/skills/generating-python-installer/SKILL.md +820 -0
  194. package/bundled/upstream/ecc/skills/git-workflow/SKILL.md +2 -1
  195. package/bundled/upstream/ecc/skills/github-ops/SKILL.md +2 -1
  196. package/bundled/upstream/ecc/skills/golang-patterns/SKILL.md +2 -1
  197. package/bundled/upstream/ecc/skills/golang-testing/SKILL.md +2 -1
  198. package/bundled/upstream/ecc/skills/google-workspace-ops/SKILL.md +2 -1
  199. package/bundled/upstream/ecc/skills/healthcare-cdss-patterns/SKILL.md +2 -1
  200. package/bundled/upstream/ecc/skills/healthcare-emr-patterns/SKILL.md +2 -1
  201. package/bundled/upstream/ecc/skills/healthcare-eval-harness/SKILL.md +2 -1
  202. package/bundled/upstream/ecc/skills/healthcare-phi-compliance/SKILL.md +2 -1
  203. package/bundled/upstream/ecc/skills/hermes-imports/SKILL.md +2 -1
  204. package/bundled/upstream/ecc/skills/hexagonal-architecture/SKILL.md +2 -1
  205. package/bundled/upstream/ecc/skills/hipaa-compliance/SKILL.md +2 -1
  206. package/bundled/upstream/ecc/skills/homelab-network-readiness/SKILL.md +2 -1
  207. package/bundled/upstream/ecc/skills/homelab-network-setup/SKILL.md +2 -1
  208. package/bundled/upstream/ecc/skills/homelab-pihole-dns/SKILL.md +10 -9
  209. package/bundled/upstream/ecc/skills/homelab-vlan-segmentation/SKILL.md +2 -1
  210. package/bundled/upstream/ecc/skills/homelab-wireguard-vpn/SKILL.md +4 -3
  211. package/bundled/upstream/ecc/skills/inherit-legacy-style/SKILL.md +157 -0
  212. package/bundled/upstream/ecc/skills/intent-driven-development/SKILL.md +360 -0
  213. package/bundled/upstream/ecc/skills/inventory-demand-planning/SKILL.md +1 -1
  214. package/bundled/upstream/ecc/skills/investor-materials/SKILL.md +2 -1
  215. package/bundled/upstream/ecc/skills/investor-outreach/SKILL.md +2 -1
  216. package/bundled/upstream/ecc/skills/ios-icon-gen/SKILL.md +2 -1
  217. package/bundled/upstream/ecc/skills/iterative-retrieval/SKILL.md +2 -1
  218. package/bundled/upstream/ecc/skills/ito-basket-compare/SKILL.md +2 -1
  219. package/bundled/upstream/ecc/skills/ito-data-atlas-agent/SKILL.md +2 -1
  220. package/bundled/upstream/ecc/skills/ito-market-intelligence/SKILL.md +2 -1
  221. package/bundled/upstream/ecc/skills/ito-trade-planner/SKILL.md +2 -1
  222. package/bundled/upstream/ecc/skills/java-coding-standards/SKILL.md +2 -1
  223. package/bundled/upstream/ecc/skills/jira-integration/SKILL.md +17 -7
  224. package/bundled/upstream/ecc/skills/jpa-patterns/SKILL.md +2 -1
  225. package/bundled/upstream/ecc/skills/knowledge-ops/SKILL.md +2 -1
  226. package/bundled/upstream/ecc/skills/kotlin-coroutines-flows/SKILL.md +2 -1
  227. package/bundled/upstream/ecc/skills/kotlin-exposed-patterns/SKILL.md +2 -1
  228. package/bundled/upstream/ecc/skills/kotlin-ktor-patterns/SKILL.md +2 -1
  229. package/bundled/upstream/ecc/skills/kotlin-patterns/SKILL.md +2 -1
  230. package/bundled/upstream/ecc/skills/kotlin-testing/SKILL.md +2 -1
  231. package/bundled/upstream/ecc/skills/kubernetes-patterns/SKILL.md +756 -0
  232. package/bundled/upstream/ecc/skills/laravel-patterns/SKILL.md +2 -1
  233. package/bundled/upstream/ecc/skills/laravel-plugin-discovery/SKILL.md +2 -1
  234. package/bundled/upstream/ecc/skills/laravel-security/SKILL.md +826 -163
  235. package/bundled/upstream/ecc/skills/laravel-tdd/SKILL.md +541 -149
  236. package/bundled/upstream/ecc/skills/laravel-verification/SKILL.md +2 -1
  237. package/bundled/upstream/ecc/skills/latency-critical-systems/SKILL.md +2 -1
  238. package/bundled/upstream/ecc/skills/lead-intelligence/SKILL.md +2 -1
  239. package/bundled/upstream/ecc/skills/llm-trading-agent-security/SKILL.md +2 -1
  240. package/bundled/upstream/ecc/skills/logistics-exception-management/SKILL.md +1 -1
  241. package/bundled/upstream/ecc/skills/make-interfaces-feel-better/SKILL.md +2 -1
  242. package/bundled/upstream/ecc/skills/manim-video/SKILL.md +2 -1
  243. package/bundled/upstream/ecc/skills/market-research/SKILL.md +2 -1
  244. package/bundled/upstream/ecc/skills/marketing-campaign/SKILL.md +2 -1
  245. package/bundled/upstream/ecc/skills/mcp-server-patterns/SKILL.md +2 -1
  246. package/bundled/upstream/ecc/skills/messages-ops/SKILL.md +2 -1
  247. package/bundled/upstream/ecc/skills/ml-adoption-playbook/SKILL.md +57 -0
  248. package/bundled/upstream/ecc/skills/mle-workflow/SKILL.md +2 -1
  249. package/bundled/upstream/ecc/skills/motion-patterns/SKILL.md +1 -2
  250. package/bundled/upstream/ecc/skills/motion-ui/SKILL.md +2 -1
  251. package/bundled/upstream/ecc/skills/mysql-patterns/SKILL.md +2 -1
  252. package/bundled/upstream/ecc/skills/nanoclaw-repl/SKILL.md +2 -1
  253. package/bundled/upstream/ecc/skills/nestjs-patterns/SKILL.md +2 -1
  254. package/bundled/upstream/ecc/skills/netmiko-ssh-automation/SKILL.md +2 -1
  255. package/bundled/upstream/ecc/skills/network-bgp-diagnostics/SKILL.md +2 -1
  256. package/bundled/upstream/ecc/skills/network-config-validation/SKILL.md +2 -1
  257. package/bundled/upstream/ecc/skills/network-interface-health/SKILL.md +2 -1
  258. package/bundled/upstream/ecc/skills/nextjs-turbopack/SKILL.md +2 -1
  259. package/bundled/upstream/ecc/skills/nodejs-keccak256/SKILL.md +2 -1
  260. package/bundled/upstream/ecc/skills/nutrient-document-processing/SKILL.md +2 -1
  261. package/bundled/upstream/ecc/skills/nuxt4-patterns/SKILL.md +2 -1
  262. package/bundled/upstream/ecc/skills/openclaw-persona-forge/SKILL.md +2 -1
  263. package/bundled/upstream/ecc/skills/opensource-pipeline/SKILL.md +2 -1
  264. package/bundled/upstream/ecc/skills/orch-add-feature/SKILL.md +45 -0
  265. package/bundled/upstream/ecc/skills/orch-build-mvp/SKILL.md +49 -0
  266. package/bundled/upstream/ecc/skills/orch-change-feature/SKILL.md +43 -0
  267. package/bundled/upstream/ecc/skills/orch-fix-defect/SKILL.md +43 -0
  268. package/bundled/upstream/ecc/skills/orch-pipeline/SKILL.md +121 -0
  269. package/bundled/upstream/ecc/skills/orch-refine-code/SKILL.md +44 -0
  270. package/bundled/upstream/ecc/skills/parallel-execution-optimizer/SKILL.md +2 -1
  271. package/bundled/upstream/ecc/skills/perl-patterns/SKILL.md +2 -1
  272. package/bundled/upstream/ecc/skills/perl-security/SKILL.md +2 -1
  273. package/bundled/upstream/ecc/skills/perl-testing/SKILL.md +2 -1
  274. package/bundled/upstream/ecc/skills/plan-orchestrate/SKILL.md +2 -1
  275. package/bundled/upstream/ecc/skills/plankton-code-quality/SKILL.md +2 -1
  276. package/bundled/upstream/ecc/skills/postgres-patterns/SKILL.md +2 -1
  277. package/bundled/upstream/ecc/skills/prediction-market-oracle-research/SKILL.md +2 -1
  278. package/bundled/upstream/ecc/skills/prediction-market-risk-review/SKILL.md +2 -1
  279. package/bundled/upstream/ecc/skills/prisma-patterns/SKILL.md +2 -1
  280. package/bundled/upstream/ecc/skills/product-capability/SKILL.md +2 -1
  281. package/bundled/upstream/ecc/skills/product-lens/SKILL.md +2 -1
  282. package/bundled/upstream/ecc/skills/production-audit/SKILL.md +2 -1
  283. package/bundled/upstream/ecc/skills/production-scheduling/SKILL.md +1 -1
  284. package/bundled/upstream/ecc/skills/project-flow-ops/SKILL.md +2 -1
  285. package/bundled/upstream/ecc/skills/prompt-optimizer/SKILL.md +1 -1
  286. package/bundled/upstream/ecc/skills/python-patterns/SKILL.md +4 -3
  287. package/bundled/upstream/ecc/skills/python-testing/SKILL.md +2 -1
  288. package/bundled/upstream/ecc/skills/pytorch-patterns/SKILL.md +2 -1
  289. package/bundled/upstream/ecc/skills/quality-nonconformance/SKILL.md +1 -1
  290. package/bundled/upstream/ecc/skills/quarkus-patterns/SKILL.md +51 -50
  291. package/bundled/upstream/ecc/skills/quarkus-security/SKILL.md +25 -24
  292. package/bundled/upstream/ecc/skills/quarkus-tdd/SKILL.md +73 -72
  293. package/bundled/upstream/ecc/skills/quarkus-verification/SKILL.md +8 -7
  294. package/bundled/upstream/ecc/skills/ralphinho-rfc-pipeline/SKILL.md +2 -1
  295. package/bundled/upstream/ecc/skills/react-patterns/SKILL.md +2 -1
  296. package/bundled/upstream/ecc/skills/react-performance/SKILL.md +2 -1
  297. package/bundled/upstream/ecc/skills/react-testing/SKILL.md +2 -1
  298. package/bundled/upstream/ecc/skills/recsys-pipeline-architect/SKILL.md +2 -1
  299. package/bundled/upstream/ecc/skills/recursive-decision-ledger/SKILL.md +2 -1
  300. package/bundled/upstream/ecc/skills/redis-patterns/SKILL.md +2 -1
  301. package/bundled/upstream/ecc/skills/regex-vs-llm-structured-text/SKILL.md +2 -1
  302. package/bundled/upstream/ecc/skills/repo-scan/SKILL.md +64 -63
  303. package/bundled/upstream/ecc/skills/research-ops/SKILL.md +2 -1
  304. package/bundled/upstream/ecc/skills/returns-reverse-logistics/SKILL.md +1 -1
  305. package/bundled/upstream/ecc/skills/rules-distill/SKILL.md +2 -1
  306. package/bundled/upstream/ecc/skills/rust-patterns/SKILL.md +2 -1
  307. package/bundled/upstream/ecc/skills/rust-testing/SKILL.md +2 -1
  308. package/bundled/upstream/ecc/skills/safety-guard/SKILL.md +2 -1
  309. package/bundled/upstream/ecc/skills/santa-method/SKILL.md +2 -1
  310. package/bundled/upstream/ecc/skills/scientific-db-pubmed-database/SKILL.md +2 -1
  311. package/bundled/upstream/ecc/skills/scientific-db-uspto-database/SKILL.md +2 -1
  312. package/bundled/upstream/ecc/skills/scientific-pkg-gget/SKILL.md +2 -1
  313. package/bundled/upstream/ecc/skills/scientific-thinking-literature-review/SKILL.md +2 -1
  314. package/bundled/upstream/ecc/skills/scientific-thinking-scholar-evaluation/SKILL.md +2 -1
  315. package/bundled/upstream/ecc/skills/search-first/SKILL.md +2 -1
  316. package/bundled/upstream/ecc/skills/security-bounty-hunter/SKILL.md +2 -1
  317. package/bundled/upstream/ecc/skills/security-review/SKILL.md +2 -1
  318. package/bundled/upstream/ecc/skills/security-scan/SKILL.md +2 -1
  319. package/bundled/upstream/ecc/skills/seo/SKILL.md +2 -1
  320. package/bundled/upstream/ecc/skills/skill-comply/SKILL.md +2 -1
  321. package/bundled/upstream/ecc/skills/skill-comply/scripts/runner.py +8 -0
  322. package/bundled/upstream/ecc/skills/skill-scout/SKILL.md +2 -1
  323. package/bundled/upstream/ecc/skills/skill-stocktake/SKILL.md +2 -1
  324. package/bundled/upstream/ecc/skills/social-graph-ranker/SKILL.md +2 -1
  325. package/bundled/upstream/ecc/skills/social-publisher/SKILL.md +17 -2
  326. package/bundled/upstream/ecc/skills/springboot-patterns/SKILL.md +2 -1
  327. package/bundled/upstream/ecc/skills/springboot-security/SKILL.md +2 -1
  328. package/bundled/upstream/ecc/skills/springboot-tdd/SKILL.md +2 -1
  329. package/bundled/upstream/ecc/skills/springboot-verification/SKILL.md +2 -1
  330. package/bundled/upstream/ecc/skills/strategic-compact/SKILL.md +10 -5
  331. package/bundled/upstream/ecc/skills/swift-actor-persistence/SKILL.md +2 -1
  332. package/bundled/upstream/ecc/skills/swift-protocol-di-testing/SKILL.md +2 -1
  333. package/bundled/upstream/ecc/skills/taste/SKILL.md +264 -0
  334. package/bundled/upstream/ecc/skills/taste/references/genre-taxonomy.md +87 -0
  335. package/bundled/upstream/ecc/skills/tdd-workflow/SKILL.md +64 -1
  336. package/bundled/upstream/ecc/skills/team-agent-orchestration/SKILL.md +2 -1
  337. package/bundled/upstream/ecc/skills/team-builder/SKILL.md +2 -1
  338. package/bundled/upstream/ecc/skills/terminal-ops/SKILL.md +2 -1
  339. package/bundled/upstream/ecc/skills/tinystruct-patterns/SKILL.md +77 -1
  340. package/bundled/upstream/ecc/skills/token-budget-advisor/SKILL.md +2 -1
  341. package/bundled/upstream/ecc/skills/ui-demo/SKILL.md +2 -1
  342. package/bundled/upstream/ecc/skills/ui-to-vue/SKILL.md +2 -1
  343. package/bundled/upstream/ecc/skills/uncloud/SKILL.md +2 -1
  344. package/bundled/upstream/ecc/skills/unified-notifications-ops/SKILL.md +2 -1
  345. package/bundled/upstream/ecc/skills/verification-loop/SKILL.md +2 -1
  346. package/bundled/upstream/ecc/skills/video-editing/SKILL.md +2 -1
  347. package/bundled/upstream/ecc/skills/videodb/SKILL.md +2 -1
  348. package/bundled/upstream/ecc/skills/vite-patterns/SKILL.md +2 -1
  349. package/bundled/upstream/ecc/skills/vue-patterns/SKILL.md +471 -0
  350. package/bundled/upstream/ecc/skills/windows-desktop-e2e/SKILL.md +9 -8
  351. package/bundled/upstream/ecc/skills/workspace-surface-audit/SKILL.md +2 -1
  352. package/bundled/upstream/ecc/skills/x-api/SKILL.md +2 -1
  353. package/bundled/upstream/impeccable/.omc-source/bundle.json +2 -2
  354. package/bundled/upstream/impeccable/.omc-source/provenance.json +30 -25
  355. package/bundled/upstream/impeccable/skills/impeccable/SKILL.md +2 -2
  356. package/bundled/upstream/impeccable/skills/impeccable/reference/hooks.md +10 -8
  357. package/bundled/upstream/impeccable/skills/impeccable/reference/live.md +1 -1
  358. package/bundled/upstream/impeccable/skills/impeccable/scripts/context.mjs +707 -26
  359. package/bundled/upstream/impeccable/skills/impeccable/scripts/detector/browser/injected/index.mjs +202 -0
  360. package/bundled/upstream/impeccable/skills/impeccable/scripts/detector/cli/main.mjs +57 -11
  361. package/bundled/upstream/impeccable/skills/impeccable/scripts/detector/design-system.mjs +750 -0
  362. package/bundled/upstream/impeccable/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +231 -0
  363. package/bundled/upstream/impeccable/skills/impeccable/scripts/detector/detect-antipatterns.mjs +7 -0
  364. package/bundled/upstream/impeccable/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +29 -4
  365. package/bundled/upstream/impeccable/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +20 -4
  366. package/bundled/upstream/impeccable/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +2 -0
  367. package/bundled/upstream/impeccable/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +27 -1
  368. package/bundled/upstream/impeccable/skills/impeccable/scripts/detector/registry/antipatterns.mjs +29 -0
  369. package/bundled/upstream/impeccable/skills/impeccable/scripts/detector/shared/inline-ignores.mjs +148 -0
  370. package/bundled/upstream/impeccable/skills/impeccable/scripts/hook-admin.mjs +135 -48
  371. package/bundled/upstream/impeccable/skills/impeccable/scripts/hook-before-edit.mjs +5 -2
  372. package/bundled/upstream/impeccable/skills/impeccable/scripts/hook-lib.mjs +375 -29
  373. package/bundled/upstream/impeccable/skills/impeccable/scripts/lib/design-parser.mjs +8 -1
  374. package/bundled/upstream/impeccable/skills/impeccable/scripts/lib/impeccable-config.mjs +638 -0
  375. package/bundled/upstream/impeccable/skills/impeccable/scripts/lib/impeccable-paths.mjs +37 -35
  376. package/bundled/upstream/impeccable/skills/impeccable/scripts/lib/target-args.mjs +42 -0
  377. package/bundled/upstream/impeccable/skills/impeccable/scripts/live-browser.js +159 -72
  378. package/bundled/upstream/impeccable/skills/impeccable/scripts/live-poll.mjs +16 -11
  379. package/bundled/upstream/impeccable/skills/impeccable/scripts/live-server.mjs +9 -8
  380. package/bundled/upstream/impeccable/skills/impeccable/scripts/live-target.mjs +30 -0
  381. package/bundled/upstream/impeccable/skills/impeccable/scripts/live-wrap.mjs +1 -1
  382. package/bundled/upstream/impeccable/skills/impeccable/scripts/live.mjs +72 -21
  383. package/bundled/upstream/oh-my-claudecode/.omc-source/bundle.json +2 -2
  384. package/bundled/upstream/oh-my-claudecode/.omc-source/provenance.json +103 -103
  385. package/bundled/upstream/oh-my-claudecode/agents/analyst.md +6 -0
  386. package/bundled/upstream/oh-my-claudecode/agents/architect.md +6 -0
  387. package/bundled/upstream/oh-my-claudecode/agents/code-reviewer.md +6 -0
  388. package/bundled/upstream/oh-my-claudecode/agents/critic.md +6 -0
  389. package/bundled/upstream/oh-my-claudecode/agents/debugger.md +6 -0
  390. package/bundled/upstream/oh-my-claudecode/agents/security-reviewer.md +6 -0
  391. package/bundled/upstream/oh-my-claudecode/agents/tracer.md +6 -0
  392. package/bundled/upstream/oh-my-claudecode/agents/verifier.md +7 -0
  393. package/bundled/upstream/oh-my-claudecode/hooks/hooks.json +9 -2
  394. package/bundled/upstream/oh-my-claudecode/skills/ask/SKILL.md +15 -4
  395. package/bundled/upstream/oh-my-claudecode/skills/autopilot/SKILL.md +30 -1
  396. package/bundled/upstream/oh-my-claudecode/skills/cancel/SKILL.md +29 -35
  397. package/bundled/upstream/oh-my-claudecode/skills/ccg/SKILL.md +20 -9
  398. package/bundled/upstream/oh-my-claudecode/skills/configure-notifications/SKILL.md +2 -2
  399. package/bundled/upstream/oh-my-claudecode/skills/omc-reference/SKILL.md +6 -4
  400. package/bundled/upstream/oh-my-claudecode/skills/omc-setup/phases/02-configure.md +1 -1
  401. package/bundled/upstream/oh-my-claudecode/skills/omc-setup/phases/03-integrations.md +2 -1
  402. package/bundled/upstream/oh-my-claudecode/skills/omc-setup/phases/04-welcome.md +2 -2
  403. package/bundled/upstream/oh-my-claudecode/skills/omc-teams/SKILL.md +29 -18
  404. package/bundled/upstream/oh-my-claudecode/skills/team/SKILL.md +127 -165
  405. package/bundled/upstream/superpowers/.omc-source/bundle.json +2 -2
  406. package/bundled/upstream/superpowers/.omc-source/provenance.json +59 -52
  407. package/bundled/upstream/superpowers/hooks/hooks-codex.json +16 -0
  408. package/bundled/upstream/superpowers/hooks/session-start +4 -12
  409. package/bundled/upstream/superpowers/hooks/session-start-codex +26 -0
  410. package/bundled/upstream/superpowers/skills/brainstorming/SKILL.md +5 -10
  411. package/bundled/upstream/superpowers/skills/brainstorming/scripts/frame-template.html +25 -26
  412. package/bundled/upstream/superpowers/skills/brainstorming/scripts/helper.js +101 -22
  413. package/bundled/upstream/superpowers/skills/brainstorming/scripts/server.cjs +399 -30
  414. package/bundled/upstream/superpowers/skills/brainstorming/scripts/start-server.sh +70 -9
  415. package/bundled/upstream/superpowers/skills/brainstorming/scripts/stop-server.sh +66 -2
  416. package/bundled/upstream/superpowers/skills/brainstorming/spec-document-reviewer-prompt.md +1 -1
  417. package/bundled/upstream/superpowers/skills/brainstorming/visual-companion.md +33 -22
  418. package/bundled/upstream/superpowers/skills/dispatching-parallel-agents/SKILL.md +9 -6
  419. package/bundled/upstream/superpowers/skills/executing-plans/SKILL.md +2 -2
  420. package/bundled/upstream/superpowers/skills/finishing-a-development-branch/SKILL.md +2 -12
  421. package/bundled/upstream/superpowers/skills/receiving-code-review/SKILL.md +2 -2
  422. package/bundled/upstream/superpowers/skills/requesting-code-review/SKILL.md +2 -2
  423. package/bundled/upstream/superpowers/skills/requesting-code-review/code-reviewer.md +15 -11
  424. package/bundled/upstream/superpowers/skills/subagent-driven-development/SKILL.md +206 -67
  425. package/bundled/upstream/superpowers/skills/subagent-driven-development/implementer-prompt.md +30 -4
  426. package/bundled/upstream/superpowers/skills/subagent-driven-development/scripts/review-package +44 -0
  427. package/bundled/upstream/superpowers/skills/subagent-driven-development/scripts/sdd-workspace +22 -0
  428. package/bundled/upstream/superpowers/skills/subagent-driven-development/scripts/task-brief +40 -0
  429. package/bundled/upstream/superpowers/skills/subagent-driven-development/task-reviewer-prompt.md +188 -0
  430. package/bundled/upstream/superpowers/skills/systematic-debugging/SKILL.md +1 -1
  431. package/bundled/upstream/superpowers/skills/test-driven-development/SKILL.md +1 -1
  432. package/bundled/upstream/superpowers/skills/using-git-worktrees/SKILL.md +9 -22
  433. package/bundled/upstream/superpowers/skills/using-superpowers/SKILL.md +19 -15
  434. package/bundled/upstream/superpowers/skills/using-superpowers/references/antigravity-tools.md +96 -0
  435. package/bundled/upstream/superpowers/skills/using-superpowers/references/claude-code-tools.md +50 -0
  436. package/bundled/upstream/superpowers/skills/using-superpowers/references/codex-tools.md +25 -12
  437. package/bundled/upstream/superpowers/skills/using-superpowers/references/copilot-tools.md +27 -20
  438. package/bundled/upstream/superpowers/skills/using-superpowers/references/gemini-tools.md +44 -32
  439. package/bundled/upstream/superpowers/skills/using-superpowers/references/pi-tools.md +28 -0
  440. package/bundled/upstream/superpowers/skills/writing-plans/SKILL.md +22 -0
  441. package/bundled/upstream/superpowers/skills/writing-plans/plan-document-reviewer-prompt.md +1 -1
  442. package/bundled/upstream/superpowers/skills/writing-skills/SKILL.md +52 -18
  443. package/bundled/upstream/superpowers/skills/writing-skills/anthropic-best-practices.md +88 -88
  444. package/bundled/upstream/superpowers/skills/writing-skills/persuasion-principles.md +3 -3
  445. package/package.json +1 -1
  446. package/bundled/upstream/superpowers/skills/subagent-driven-development/code-quality-reviewer-prompt.md +0 -25
  447. package/bundled/upstream/superpowers/skills/subagent-driven-development/spec-reviewer-prompt.md +0 -61
@@ -0,0 +1,750 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ import { finding } from './findings.mjs';
5
+ import { GENERIC_FONTS } from './shared/constants.mjs';
6
+ import { parseAnyColor, resolveLengthPx } from './rules/checks.mjs';
7
+
8
+ const DESIGN_NAMES = ['DESIGN.md', 'Design.md', 'design.md'];
9
+ const FALLBACK_DIRS = ['.agents/context', 'docs'];
10
+ const COLOR_CHANNEL_TOLERANCE = 6;
11
+ const RADIUS_TOLERANCE_PX = 0.5;
12
+
13
+ const CSS_COLOR_RE = /#[0-9a-f]{3,8}\b|rgba?\([^)]+\)|oklch\([^)]+\)|hsla?\([^)]+\)/gi;
14
+ const FONT_DECL_RE = /font-family\s*:\s*([^;}\n]+)/gi;
15
+ const FONT_JS_RE = /fontFamily\s*[:=]\s*["'`]([^"'`]+)["'`]/g;
16
+ const GOOGLE_FONT_RE = /fonts\.googleapis\.com\/css2?\?[^"'\s)<>]*/gi;
17
+ const BORDER_RADIUS_RE = /border-radius\s*:\s*([^;}\n]+)/gi;
18
+ const BORDER_RADIUS_JS_RE = /borderRadius\s*[:=]\s*["'`]([^"'`]+)["'`]/g;
19
+ const STATIC_DESIGN_SKIP_TAGS = new Set(['head', 'title', 'meta', 'link', 'style', 'script', 'noscript', 'template', 'source']);
20
+
21
+ function firstExisting(dir, names) {
22
+ for (const name of names) {
23
+ const abs = path.join(dir, name);
24
+ if (fs.existsSync(abs)) return abs;
25
+ }
26
+ return null;
27
+ }
28
+
29
+ function resolveDesignMdPath(cwd = process.cwd()) {
30
+ const root = firstExisting(cwd, DESIGN_NAMES);
31
+ if (root) return { path: root, contextDir: cwd };
32
+
33
+ for (const rel of FALLBACK_DIRS) {
34
+ const dir = path.resolve(cwd, rel);
35
+ const found = firstExisting(dir, DESIGN_NAMES);
36
+ if (found) return { path: found, contextDir: dir };
37
+ }
38
+
39
+ return null;
40
+ }
41
+
42
+ function resolveDesignSidecarPath(cwd = process.cwd(), contextDir = cwd) {
43
+ const candidates = [
44
+ path.join(cwd, '.impeccable', 'design.json'),
45
+ path.join(cwd, 'DESIGN.json'),
46
+ path.join(contextDir, 'DESIGN.json'),
47
+ ];
48
+ return candidates.find((candidate, index) =>
49
+ candidates.indexOf(candidate) === index && fs.existsSync(candidate)
50
+ ) || null;
51
+ }
52
+
53
+ function parseFrontmatter(md) {
54
+ const lines = String(md || '').split(/\r?\n/);
55
+ if (lines[0]?.trim() !== '---') return null;
56
+ let end = -1;
57
+ for (let i = 1; i < lines.length; i++) {
58
+ if (lines[i].trim() === '---') { end = i; break; }
59
+ }
60
+ if (end === -1) return null;
61
+ try {
62
+ return parseYamlSubset(lines.slice(1, end).join('\n'));
63
+ } catch {
64
+ return null;
65
+ }
66
+ }
67
+
68
+ function parseYamlSubset(yaml) {
69
+ const root = {};
70
+ const stack = [{ indent: -1, obj: root }];
71
+
72
+ for (const raw of String(yaml || '').split(/\r?\n/)) {
73
+ if (!raw.trim() || /^\s*#/.test(raw)) continue;
74
+ const indent = raw.match(/^\s*/)[0].length;
75
+ const content = raw.slice(indent);
76
+ const colonIdx = findTopLevelColon(content);
77
+ if (colonIdx === -1) continue;
78
+
79
+ while (stack.length > 1 && stack[stack.length - 1].indent >= indent) stack.pop();
80
+
81
+ const key = unquoteYamlKey(content.slice(0, colonIdx).trim());
82
+ const rest = stripInlineYamlComment(content.slice(colonIdx + 1).trim());
83
+ const parent = stack[stack.length - 1].obj;
84
+
85
+ if (rest === '') {
86
+ const obj = {};
87
+ parent[key] = obj;
88
+ stack.push({ indent, obj });
89
+ } else {
90
+ parent[key] = parseScalar(rest);
91
+ }
92
+ }
93
+
94
+ return root;
95
+ }
96
+
97
+ function findTopLevelColon(s) {
98
+ let inQuote = null;
99
+ for (let i = 0; i < s.length; i++) {
100
+ const ch = s[i];
101
+ if (inQuote) {
102
+ if (ch === inQuote && s[i - 1] !== '\\') inQuote = null;
103
+ } else if (ch === '"' || ch === "'") {
104
+ inQuote = ch;
105
+ } else if (ch === ':') {
106
+ return i;
107
+ }
108
+ }
109
+ return -1;
110
+ }
111
+
112
+ function unquoteYamlKey(key) {
113
+ if ((key.startsWith('"') && key.endsWith('"')) || (key.startsWith("'") && key.endsWith("'"))) {
114
+ return key.slice(1, -1);
115
+ }
116
+ return key;
117
+ }
118
+
119
+ function stripInlineYamlComment(s) {
120
+ let inQuote = null;
121
+ for (let i = 0; i < s.length; i++) {
122
+ const ch = s[i];
123
+ if (inQuote) {
124
+ if (ch === inQuote && s[i - 1] !== '\\') inQuote = null;
125
+ } else if (ch === '"' || ch === "'") {
126
+ inQuote = ch;
127
+ } else if (ch === '#' && i > 0 && /\s/.test(s[i - 1])) {
128
+ return s.slice(0, i).trimEnd();
129
+ }
130
+ }
131
+ return s;
132
+ }
133
+
134
+ function parseScalar(raw) {
135
+ const s = raw.trim();
136
+ if ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'"))) {
137
+ return s.slice(1, -1);
138
+ }
139
+ if (s === 'true') return true;
140
+ if (s === 'false') return false;
141
+ if (s === 'null' || s === '~') return null;
142
+ if (/^-?\d+$/.test(s)) return Number(s);
143
+ if (/^-?\d*\.\d+$/.test(s)) return Number(s);
144
+ return s;
145
+ }
146
+
147
+ function safeReadJson(filePath) {
148
+ if (!filePath) return null;
149
+ try {
150
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
151
+ } catch {
152
+ return null;
153
+ }
154
+ }
155
+
156
+ function normalizeFontName(value) {
157
+ return String(value || '')
158
+ .trim()
159
+ .replace(/\s*!important\s*$/i, '')
160
+ .trim()
161
+ .replace(/^["']|["']$/g, '')
162
+ .replace(/\+/g, ' ')
163
+ .replace(/\s+/g, ' ')
164
+ .toLowerCase();
165
+ }
166
+
167
+ function splitFontStack(stack) {
168
+ return String(stack || '')
169
+ .replace(/\s*!important\s*$/i, '')
170
+ .split(',')
171
+ .map(normalizeFontName)
172
+ .filter(Boolean);
173
+ }
174
+
175
+ function primaryFont(stack) {
176
+ if (!stack || /var\(/i.test(stack) || !isLiteralFontStack(stack)) return '';
177
+ return splitFontStack(stack).find(font => !GENERIC_FONTS.has(font)) || '';
178
+ }
179
+
180
+ function isLiteralFontStack(stack) {
181
+ const text = String(stack || '');
182
+ return !/[$`{}]|\s\+\s|\|\|/.test(text);
183
+ }
184
+
185
+ function cssColorLabel(raw) {
186
+ return String(raw || '').trim().replace(/\s+/g, ' ');
187
+ }
188
+
189
+ function colorKey(color) {
190
+ if (!color) return '';
191
+ return `${color.r},${color.g},${color.b}`;
192
+ }
193
+
194
+ function colorsClose(a, b) {
195
+ if (!a || !b) return false;
196
+ return Math.max(
197
+ Math.abs(a.r - b.r),
198
+ Math.abs(a.g - b.g),
199
+ Math.abs(a.b - b.b),
200
+ ) <= COLOR_CHANNEL_TOLERANCE;
201
+ }
202
+
203
+ function hslToRgb(H, S, L, alpha = 1) {
204
+ const h = (((H % 360) + 360) % 360) / 360;
205
+ const s = Math.max(0, Math.min(1, S));
206
+ const l = Math.max(0, Math.min(1, L));
207
+ const hue2rgb = (p, q, t) => {
208
+ if (t < 0) t += 1;
209
+ if (t > 1) t -= 1;
210
+ if (t < 1 / 6) return p + (q - p) * 6 * t;
211
+ if (t < 1 / 2) return q;
212
+ if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
213
+ return p;
214
+ };
215
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
216
+ const p = 2 * l - q;
217
+ return {
218
+ r: Math.round(hue2rgb(p, q, h + 1 / 3) * 255),
219
+ g: Math.round(hue2rgb(p, q, h) * 255),
220
+ b: Math.round(hue2rgb(p, q, h - 1 / 3) * 255),
221
+ a: alpha,
222
+ };
223
+ }
224
+
225
+ function parseDesignColor(value) {
226
+ const text = String(value || '').trim();
227
+ const parsed = parseAnyColor(text);
228
+ if (parsed) return parsed;
229
+ const hsl = text.match(/hsla?\(\s*([-\d.]+)(?:deg)?\s*,?\s*([\d.]+)%\s*,?\s*([\d.]+)%(?:\s*[,/]\s*([\d.]+))?\s*\)/i);
230
+ if (hsl) {
231
+ return hslToRgb(
232
+ parseFloat(hsl[1]),
233
+ parseFloat(hsl[2]) / 100,
234
+ parseFloat(hsl[3]) / 100,
235
+ hsl[4] !== undefined ? parseFloat(hsl[4]) : 1,
236
+ );
237
+ }
238
+ return null;
239
+ }
240
+
241
+ function addDesignColor(out, value, label) {
242
+ const parsed = parseDesignColor(value);
243
+ if (!parsed) return;
244
+ const key = colorKey(parsed);
245
+ if (!out.allowedColorKeys.has(key)) {
246
+ out.allowedColorKeys.set(key, { color: parsed, labels: [] });
247
+ }
248
+ out.allowedColorKeys.get(key).labels.push(label || cssColorLabel(value));
249
+ }
250
+
251
+ function addColorObject(out, colors, prefix = 'colors') {
252
+ if (!colors || typeof colors !== 'object') return;
253
+ for (const [name, value] of Object.entries(colors)) {
254
+ if (typeof value === 'string') {
255
+ addDesignColor(out, value, `${prefix}.${name}`);
256
+ }
257
+ }
258
+ }
259
+
260
+ function addSidecarColors(out, sidecar) {
261
+ const colorMeta = sidecar?.extensions?.colorMeta;
262
+ if (!colorMeta || typeof colorMeta !== 'object') return;
263
+
264
+ for (const [name, meta] of Object.entries(colorMeta)) {
265
+ if (!meta || typeof meta !== 'object') continue;
266
+ if (typeof meta.canonical === 'string') addDesignColor(out, meta.canonical, `sidecar.${name}`);
267
+ if (Array.isArray(meta.tonalRamp)) {
268
+ for (const [index, value] of meta.tonalRamp.entries()) {
269
+ if (typeof value === 'string') addDesignColor(out, value, `sidecar.${name}.tonalRamp[${index}]`);
270
+ }
271
+ }
272
+ }
273
+ }
274
+
275
+ function addTypographyFonts(out, typography) {
276
+ if (!typography || typeof typography !== 'object') return;
277
+ for (const role of Object.values(typography)) {
278
+ if (!role || typeof role !== 'object') continue;
279
+ if (typeof role.fontFamily !== 'string') continue;
280
+ for (const font of splitFontStack(role.fontFamily)) {
281
+ if (!GENERIC_FONTS.has(font)) out.allowedFonts.add(font);
282
+ }
283
+ }
284
+ }
285
+
286
+ function addRoundedScale(out, rounded) {
287
+ if (!rounded || typeof rounded !== 'object') return;
288
+ for (const [rawName, value] of Object.entries(rounded)) {
289
+ const name = unquoteYamlKey(rawName).toLowerCase();
290
+ addRoundedToken(out, name, value);
291
+ }
292
+ }
293
+
294
+ function addRoundedToken(out, name, value) {
295
+ if (typeof value !== 'string' && typeof value !== 'number') return;
296
+ const raw = String(value).trim();
297
+ if (!raw || /var\(/i.test(raw) || raw.includes('%')) return;
298
+ const px = resolveLengthPx(raw, 16);
299
+ if (px == null || !Number.isFinite(px)) return;
300
+ out.allowedRadii.push({ name, value: raw, px });
301
+ if (/(^|\.)(full|pill|round|rounded-full)$/.test(name)) out.hasPillRadius = true;
302
+ }
303
+
304
+ function addSidecarRadii(out, sidecar) {
305
+ const roundedMeta = sidecar?.extensions?.roundedMeta;
306
+ if (!roundedMeta || typeof roundedMeta !== 'object') return;
307
+
308
+ for (const [rawName, meta] of Object.entries(roundedMeta)) {
309
+ const name = unquoteYamlKey(rawName).toLowerCase();
310
+ if (typeof meta === 'string' || typeof meta === 'number') {
311
+ addRoundedToken(out, `sidecar.${name}`, meta);
312
+ continue;
313
+ }
314
+ if (!meta || typeof meta !== 'object') continue;
315
+ for (const key of ['canonical', 'value']) {
316
+ if (typeof meta[key] === 'string' || typeof meta[key] === 'number') {
317
+ addRoundedToken(out, `sidecar.${name}.${key}`, meta[key]);
318
+ }
319
+ }
320
+ for (const key of ['values', 'aliases']) {
321
+ if (!Array.isArray(meta[key])) continue;
322
+ for (const [index, value] of meta[key].entries()) {
323
+ addRoundedToken(out, `sidecar.${name}.${key}[${index}]`, value);
324
+ }
325
+ }
326
+ if (/^(full|pill|round|rounded-full)$/.test(name) || /^(full|pill|round)$/i.test(String(meta.role || ''))) {
327
+ out.hasPillRadius = true;
328
+ }
329
+ }
330
+ }
331
+
332
+ function normalizeDesignSystem(input = {}) {
333
+ const frontmatter = input.frontmatter || {};
334
+ const sidecar = input.sidecar || null;
335
+ const out = {
336
+ present: true,
337
+ sourcePath: input.sourcePath || null,
338
+ sidecarPath: input.sidecarPath || null,
339
+ mdNewerThanJson: input.mdNewerThanJson === true,
340
+ allowedFonts: new Set(),
341
+ allowedColorKeys: new Map(),
342
+ allowedRadii: [],
343
+ hasPillRadius: false,
344
+ };
345
+
346
+ addTypographyFonts(out, frontmatter.typography);
347
+ addColorObject(out, frontmatter.colors);
348
+ addSidecarColors(out, sidecar);
349
+ addRoundedScale(out, frontmatter.rounded);
350
+ addSidecarRadii(out, sidecar);
351
+
352
+ out.hasFonts = out.allowedFonts.size > 0;
353
+ out.hasColors = out.allowedColorKeys.size > 0;
354
+ out.hasRadii = out.allowedRadii.length > 0;
355
+ return out;
356
+ }
357
+
358
+ function loadDesignSystemForCwd(cwd = process.cwd()) {
359
+ const md = resolveDesignMdPath(cwd);
360
+ if (!md) return null;
361
+
362
+ let frontmatter = null;
363
+ let mdStat = null;
364
+ try {
365
+ mdStat = fs.statSync(md.path);
366
+ frontmatter = parseFrontmatter(fs.readFileSync(md.path, 'utf-8'));
367
+ } catch {
368
+ return null;
369
+ }
370
+ if (!frontmatter || typeof frontmatter !== 'object') return null;
371
+
372
+ const sidecarPath = resolveDesignSidecarPath(cwd, md.contextDir);
373
+ const sidecar = safeReadJson(sidecarPath);
374
+ let sidecarStat = null;
375
+ try {
376
+ if (sidecarPath) sidecarStat = fs.statSync(sidecarPath);
377
+ } catch {
378
+ sidecarStat = null;
379
+ }
380
+
381
+ return normalizeDesignSystem({
382
+ frontmatter,
383
+ sidecar,
384
+ sourcePath: md.path,
385
+ sidecarPath,
386
+ mdNewerThanJson: !!(mdStat && sidecarStat && mdStat.mtimeMs > sidecarStat.mtimeMs + 1000),
387
+ });
388
+ }
389
+
390
+ function isAllowedFont(font, designSystem) {
391
+ if (!font || GENERIC_FONTS.has(font)) return true;
392
+ if (!designSystem?.hasFonts) return true;
393
+ return designSystem.allowedFonts.has(font);
394
+ }
395
+
396
+ function isAllowedColorRaw(raw, designSystem) {
397
+ if (!designSystem?.hasColors) return true;
398
+ const text = String(raw || '').trim().toLowerCase();
399
+ if (!text || text === 'transparent' || text === 'currentcolor' || text === 'inherit' || text === 'initial') return true;
400
+ if (text.includes('var(')) return true;
401
+ const parsed = parseDesignColor(text);
402
+ if (!parsed) return true;
403
+ if ((parsed.a ?? 1) <= 0.05) return true;
404
+ for (const entry of designSystem.allowedColorKeys.values()) {
405
+ if (colorsClose(parsed, entry.color)) return true;
406
+ }
407
+ return false;
408
+ }
409
+
410
+ function isAllowedRadiusRaw(raw, designSystem) {
411
+ if (!designSystem?.hasRadii) return true;
412
+ const text = String(raw || '').trim().toLowerCase();
413
+ if (!text || text === '0' || text === 'none' || text === 'initial' || text === 'inherit') return true;
414
+ if (text.includes('var(') || text.includes('%')) return true;
415
+ const px = resolveLengthPx(text, 16);
416
+ if (px == null || !Number.isFinite(px) || px <= RADIUS_TOLERANCE_PX) return true;
417
+ if (designSystem.hasPillRadius && px >= 99) return true;
418
+ return designSystem.allowedRadii.some(entry => Math.abs(entry.px - px) <= RADIUS_TOLERANCE_PX);
419
+ }
420
+
421
+ function lineLooksCommented(line) {
422
+ const trimmed = String(line || '').trim();
423
+ return trimmed.startsWith('//') || trimmed.startsWith('/*') || trimmed.startsWith('*') || trimmed.startsWith('<!--');
424
+ }
425
+
426
+ function isProbablyColorLiteral(line, match) {
427
+ const raw = match?.[0] || '';
428
+ const index = match.index ?? -1;
429
+ if (index < 0) return false;
430
+ if (isInsideCssAttributeSelector(line, index)) return false;
431
+
432
+ const before = line.slice(0, index);
433
+ const after = line.slice(index + raw.length);
434
+
435
+ if (raw.startsWith('#')) {
436
+ if (before.endsWith('&')) return false; // HTML numeric entity, e.g. &#8596;
437
+
438
+ const prevNonSpace = before.match(/\S(?=\s*$)/)?.[0] || '';
439
+ const nextNonSpace = after.match(/^\s*(\S)/)?.[1] || '';
440
+ if (prevNonSpace === '>' && nextNonSpace === '<') return false; // plain text, e.g. PR #155
441
+ }
442
+
443
+ const styleContext = /(?:^|[{\s;"'`(,])(?:color|background(?:-color|-image)?|border(?:-(?:top|right|bottom|left))?(?:-color)?|outline(?:-color)?|box-shadow|text-shadow|fill|stroke)\s*:\s*[^;{}"'`]*/i.test(before);
444
+ const cssFunctionContext = /(?:linear-gradient|radial-gradient|conic-gradient|color-mix)\([^)]*$/i.test(before);
445
+ const jsColorKeyContext = /(?:^|[,{]\s*)(?:color|background|backgroundColor|borderColor|outlineColor|fill|stroke|boxShadow|textShadow)\s*[:=]\s*["'`]?[^"'`,}]*/i.test(before);
446
+
447
+ return styleContext || cssFunctionContext || jsColorKeyContext;
448
+ }
449
+
450
+ function isInsideCssAttributeSelector(line, index) {
451
+ if (index < 0) return false;
452
+ const before = line.slice(0, index);
453
+ const lastOpen = before.lastIndexOf('[');
454
+ if (lastOpen === -1) return false;
455
+ const lastClose = before.lastIndexOf(']');
456
+ if (lastClose > lastOpen) return false;
457
+ const after = line.slice(index);
458
+ const close = after.indexOf(']');
459
+ const block = after.indexOf('{');
460
+ return close !== -1 && (block === -1 || close < block);
461
+ }
462
+
463
+ function makeDesignFinding(id, filePath, snippet, line = 0, extras = {}) {
464
+ return { ...finding(id, filePath, snippet, line), ...extras };
465
+ }
466
+
467
+ function decodeGoogleFamily(value) {
468
+ const family = String(value || '').split(':')[0].replace(/\+/g, ' ');
469
+ try {
470
+ return decodeURIComponent(family);
471
+ } catch {
472
+ return family;
473
+ }
474
+ }
475
+
476
+ function checkFontStack(stack, filePath, line, designSystem, context) {
477
+ const primary = primaryFont(stack);
478
+ if (!primary || isAllowedFont(primary, designSystem)) return [];
479
+ const display = primary.replace(/\b\w/g, ch => ch.toUpperCase());
480
+ return [makeDesignFinding(
481
+ 'design-system-font',
482
+ filePath,
483
+ `${context}: ${display} is not declared in DESIGN.md typography`,
484
+ line,
485
+ { ignoreValue: display },
486
+ )];
487
+ }
488
+
489
+ function extractRadiusTokens(value) {
490
+ return String(value || '')
491
+ .replace(/\s*\/\s*/g, ' ')
492
+ .split(/\s+/)
493
+ .map(token => token.trim())
494
+ .filter(Boolean);
495
+ }
496
+
497
+ function checkRadiusValue(value, filePath, line, designSystem, context) {
498
+ const findings = [];
499
+ for (const token of extractRadiusTokens(value)) {
500
+ if (isAllowedRadiusRaw(token, designSystem)) continue;
501
+ findings.push(makeDesignFinding(
502
+ 'design-system-radius',
503
+ filePath,
504
+ `${context}: ${token} is outside the DESIGN.md rounded scale`,
505
+ line,
506
+ { ignoreValue: token },
507
+ ));
508
+ }
509
+ return findings;
510
+ }
511
+
512
+ function checkSourceDesignSystem(content, filePath, options = {}) {
513
+ const designSystem = options.designSystem;
514
+ if (!designSystem?.present) return [];
515
+
516
+ const findings = [];
517
+ const lines = String(content || '').split('\n');
518
+ for (let i = 0; i < lines.length; i++) {
519
+ const line = lines[i];
520
+ const lineNum = i + 1;
521
+ if (lineLooksCommented(line)) continue;
522
+
523
+ if (designSystem.hasFonts) {
524
+ for (const match of line.matchAll(FONT_DECL_RE)) {
525
+ findings.push(...checkFontStack(match[1], filePath, lineNum, designSystem, 'font-family'));
526
+ }
527
+ for (const match of line.matchAll(FONT_JS_RE)) {
528
+ findings.push(...checkFontStack(match[1], filePath, lineNum, designSystem, 'fontFamily'));
529
+ }
530
+ for (const match of line.matchAll(GOOGLE_FONT_RE)) {
531
+ const url = match[0];
532
+ for (const familyMatch of url.matchAll(/[?&]family=([^&]+)/g)) {
533
+ const font = normalizeFontName(decodeGoogleFamily(familyMatch[1]));
534
+ if (!font || isAllowedFont(font, designSystem)) continue;
535
+ const display = decodeGoogleFamily(familyMatch[1]);
536
+ findings.push(makeDesignFinding(
537
+ 'design-system-font',
538
+ filePath,
539
+ `Google Fonts: ${display} is not declared in DESIGN.md typography`,
540
+ lineNum,
541
+ { ignoreValue: display },
542
+ ));
543
+ }
544
+ }
545
+ }
546
+
547
+ if (designSystem.hasColors) {
548
+ for (const match of line.matchAll(CSS_COLOR_RE)) {
549
+ if (!isProbablyColorLiteral(line, match)) continue;
550
+ const raw = cssColorLabel(match[0]);
551
+ if (isAllowedColorRaw(raw, designSystem)) continue;
552
+ findings.push(makeDesignFinding(
553
+ 'design-system-color',
554
+ filePath,
555
+ `Undocumented color ${raw} is outside DESIGN.md colors`,
556
+ lineNum,
557
+ { ignoreValue: raw },
558
+ ));
559
+ }
560
+ }
561
+
562
+ if (designSystem.hasRadii) {
563
+ for (const match of line.matchAll(BORDER_RADIUS_RE)) {
564
+ findings.push(...checkRadiusValue(match[1], filePath, lineNum, designSystem, 'border-radius'));
565
+ }
566
+ for (const match of line.matchAll(BORDER_RADIUS_JS_RE)) {
567
+ findings.push(...checkRadiusValue(match[1], filePath, lineNum, designSystem, 'borderRadius'));
568
+ }
569
+ }
570
+ }
571
+
572
+ return dedupeDesignFindings(findings);
573
+ }
574
+
575
+ function hasDirectText(el) {
576
+ return Array.from(el.childNodes || []).some(node => node.nodeType === 3 && node.textContent.trim().length > 0);
577
+ }
578
+
579
+ function sampleText(el) {
580
+ const text = String(el.textContent || '').replace(/\s+/g, ' ').trim();
581
+ return text ? ` "${text.slice(0, 40)}"` : '';
582
+ }
583
+
584
+ function collectStaticDesignSystemFindings(document, window, filePath, designSystem) {
585
+ if (!designSystem?.present) return [];
586
+ const findings = [];
587
+ const seenFonts = new Set();
588
+ const seenColors = new Set();
589
+ const seenRadii = new Set();
590
+
591
+ for (const el of document.querySelectorAll('*')) {
592
+ if (shouldSkipStaticDesignElement(el, window)) continue;
593
+ const tag = el.tagName?.toLowerCase?.() || 'unknown';
594
+ const style = window.getComputedStyle(el);
595
+
596
+ if (designSystem.hasFonts && hasDirectText(el)) {
597
+ const font = primaryFont(style.fontFamily || '');
598
+ if (font && !seenFonts.has(font) && !isAllowedFont(font, designSystem)) {
599
+ seenFonts.add(font);
600
+ findings.push(makeDesignFinding(
601
+ 'design-system-font',
602
+ filePath,
603
+ `${tag}${sampleText(el)} uses ${font}; not declared in DESIGN.md typography`,
604
+ 0,
605
+ { ignoreValue: font },
606
+ ));
607
+ }
608
+ }
609
+
610
+ if (designSystem.hasColors) {
611
+ const colorChecks = [];
612
+ if (hasDirectText(el)) colorChecks.push(['text color', style.color]);
613
+ if (!isTransparentCss(style.backgroundColor)) colorChecks.push(['background', style.backgroundColor]);
614
+ for (const side of ['Top', 'Right', 'Bottom', 'Left']) {
615
+ if ((parseFloat(style[`border${side}Width`]) || 0) > 0) {
616
+ colorChecks.push([`border-${side.toLowerCase()}`, style[`border${side}Color`]]);
617
+ }
618
+ }
619
+ if ((parseFloat(style.outlineWidth) || 0) > 0) colorChecks.push(['outline', style.outlineColor]);
620
+
621
+ for (const [kind, raw] of colorChecks) {
622
+ const label = cssColorLabel(raw);
623
+ if (isAllowedColorRaw(label, designSystem)) continue;
624
+ const key = `${kind}:${label}`;
625
+ if (seenColors.has(key)) continue;
626
+ seenColors.add(key);
627
+ findings.push(makeDesignFinding(
628
+ 'design-system-color',
629
+ filePath,
630
+ `${kind} ${label} on ${tag}${sampleText(el)} is outside DESIGN.md colors`,
631
+ 0,
632
+ { ignoreValue: label },
633
+ ));
634
+ }
635
+ }
636
+
637
+ if (designSystem.hasRadii) {
638
+ const rawRadius = String(style.borderRadius || '').trim();
639
+ if (!rawRadius) continue;
640
+ for (const token of extractRadiusTokens(rawRadius)) {
641
+ if (isAllowedRadiusRaw(token, designSystem)) continue;
642
+ if (seenRadii.has(token)) continue;
643
+ seenRadii.add(token);
644
+ findings.push(makeDesignFinding(
645
+ 'design-system-radius',
646
+ filePath,
647
+ `border-radius ${token} on ${tag}${sampleText(el)} is outside the DESIGN.md rounded scale`,
648
+ 0,
649
+ { ignoreValue: token },
650
+ ));
651
+ }
652
+ }
653
+ }
654
+
655
+ return findings;
656
+ }
657
+
658
+ function shouldSkipStaticDesignElement(el, window) {
659
+ const tag = el.tagName?.toLowerCase?.() || '';
660
+ if (STATIC_DESIGN_SKIP_TAGS.has(tag)) return true;
661
+
662
+ let current = el;
663
+ while (current) {
664
+ if (current.getAttribute?.('hidden') !== null || current.getAttribute?.('aria-hidden') === 'true') return true;
665
+ const style = window.getComputedStyle(current);
666
+ const display = String(style.display || '').toLowerCase();
667
+ const visibility = String(style.visibility || '').toLowerCase();
668
+ if (display === 'none' || visibility === 'hidden' || visibility === 'collapse') return true;
669
+ current = current.parentElement;
670
+ }
671
+ return false;
672
+ }
673
+
674
+ function isTransparentCss(value) {
675
+ const text = String(value || '').trim().toLowerCase();
676
+ if (!text || text === 'transparent') return true;
677
+ const parsed = parseDesignColor(text);
678
+ return parsed ? (parsed.a ?? 1) <= 0.05 : false;
679
+ }
680
+
681
+ function canonicalDesignFindingKey(item) {
682
+ if (!item?.antipattern?.startsWith?.('design-system-')) return null;
683
+ const value = item.ignoreValue || item.value || '';
684
+ if (item.antipattern === 'design-system-font') {
685
+ const context = /google fonts/i.test(item.snippet || '') ? 'google-font' : 'font';
686
+ const font = normalizeFontName(value);
687
+ return font ? `${item.antipattern}:${context}:${font}` : null;
688
+ }
689
+ if (item.antipattern === 'design-system-color') {
690
+ const parsed = parseDesignColor(value);
691
+ if (parsed) return `${item.antipattern}:color:${colorKey(parsed)}`;
692
+ const label = cssColorLabel(value).toLowerCase();
693
+ return label ? `${item.antipattern}:color:${label}` : null;
694
+ }
695
+ if (item.antipattern === 'design-system-radius') {
696
+ const px = resolveLengthPx(String(value || '').trim(), 16);
697
+ if (px != null && Number.isFinite(px)) return `${item.antipattern}:radius:${Math.round(px * 100) / 100}`;
698
+ const label = String(value || '').trim().toLowerCase();
699
+ return label ? `${item.antipattern}:radius:${label}` : null;
700
+ }
701
+ return null;
702
+ }
703
+
704
+ function mergeDesignSystemFindings(...groups) {
705
+ const out = [];
706
+ const seen = new Map();
707
+ for (const group of groups) {
708
+ for (const item of group || []) {
709
+ const key = canonicalDesignFindingKey(item);
710
+ if (key) {
711
+ if (seen.has(key)) {
712
+ const existing = out[seen.get(key)];
713
+ if ((existing.line || 0) <= 0 && (item.line || 0) > 0) existing.line = item.line;
714
+ continue;
715
+ }
716
+ seen.set(key, out.length);
717
+ }
718
+ out.push(item);
719
+ }
720
+ }
721
+ return out;
722
+ }
723
+
724
+ function dedupeDesignFindings(findings) {
725
+ const out = [];
726
+ const seen = new Set();
727
+ for (const item of findings) {
728
+ const key = [
729
+ item.antipattern,
730
+ item.line || 0,
731
+ normalizeFontName(item.ignoreValue || item.snippet || ''),
732
+ ].join('\0');
733
+ if (seen.has(key)) continue;
734
+ seen.add(key);
735
+ out.push(item);
736
+ }
737
+ return out;
738
+ }
739
+
740
+ export {
741
+ parseFrontmatter,
742
+ normalizeDesignSystem,
743
+ loadDesignSystemForCwd,
744
+ isAllowedFont,
745
+ isAllowedColorRaw,
746
+ isAllowedRadiusRaw,
747
+ checkSourceDesignSystem,
748
+ collectStaticDesignSystemFindings,
749
+ mergeDesignSystemFindings,
750
+ };