enigma-cli 1.40.0 → 1.41.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.
@@ -156,7 +156,7 @@
156
156
  {
157
157
  "name": "input",
158
158
  "title": "Input, one field for every type",
159
- "description": "A field you pass props to, typed by its `type`: password gets the reveal toggle, a generator, a strength meter and a breach check; search gets debouncing, ranking and a clear button; everything else is a plain field with native props. What each type needs is loaded when that type is used, so a form of text fields ships none of it.",
159
+ "description": "A field you pass props to, typed by its `type`: password gets the reveal toggle, a generator, a strength meter and a breach check; search gets debouncing, ranking and a clear button; color gets a swatch and a picker panel - saturation square, hue and alpha rails, presets and the screen eyedropper - instead of the operating system popup; everything else is a plain field with native props. What each type needs is loaded when that type is used, so a form of text fields ships none of it.",
160
160
  "targets": [
161
161
  "vanilla",
162
162
  "astro",
@@ -224,7 +224,8 @@
224
224
  ],
225
225
  "rewrite": {
226
226
  "@/core/search": "./search-core",
227
- "@/core/password": "./password-core"
227
+ "@/core/password": "./password-core",
228
+ "@/core/color": "./color-core"
228
229
  }
229
230
  },
230
231
  {
@@ -262,6 +263,43 @@
262
263
  "@/core/search": "./search-core"
263
264
  }
264
265
  },
266
+ {
267
+ "path": "src/core/color.ts",
268
+ "dest": "input/color-core.ts",
269
+ "targets": [
270
+ "vanilla",
271
+ "astro",
272
+ "react"
273
+ ]
274
+ },
275
+ {
276
+ "path": "src/react/input/color-styles.ts",
277
+ "dest": "input/color-styles.ts",
278
+ "targets": [
279
+ "react"
280
+ ]
281
+ },
282
+ {
283
+ "path": "src/react/input/color.tsx",
284
+ "dest": "input/color.tsx",
285
+ "targets": [
286
+ "react"
287
+ ],
288
+ "rewrite": {
289
+ "@/core/color": "./color-core",
290
+ "@/react/input/write-value": "./write-value",
291
+ "@/react/input/color-styles": "./color-styles",
292
+ "@/react/input/types": "./types"
293
+ }
294
+ },
295
+ {
296
+ "path": "recipes/color/styles.css",
297
+ "dest": "input/color.css",
298
+ "targets": [
299
+ "react"
300
+ ],
301
+ "style": "css"
302
+ },
265
303
  {
266
304
  "path": "recipes/input/styles.css",
267
305
  "dest": "input/styles.css",
@@ -286,7 +324,8 @@
286
324
  "@/react/input/types": "./types",
287
325
  "@/react/input/password": "./password",
288
326
  "@/react/input/search": "./search",
289
- "@/core/password": "./password-core"
327
+ "@/core/password": "./password-core",
328
+ "@/react/input/color": "./color"
290
329
  }
291
330
  },
292
331
  {
@@ -322,7 +361,26 @@
322
361
  "[data-enigma-password-strength-segment][data-filled]",
323
362
  "[data-enigma-password-strength-label]",
324
363
  "[data-enigma-password-strength-warning]",
325
- "[data-enigma-input-action=clear]"
364
+ "[data-enigma-input-action=clear]",
365
+ "[data-enigma-color]",
366
+ "[data-enigma-color][data-open]",
367
+ "[data-enigma-color-swatch]",
368
+ "[data-enigma-color-swatch][data-invalid]",
369
+ "[data-enigma-color-checkers]",
370
+ "[data-enigma-color-fill]",
371
+ "[data-enigma-color-panel]",
372
+ "[data-enigma-color-panel][data-side=top]",
373
+ "[data-enigma-color-area]",
374
+ "[data-enigma-color-controls]",
375
+ "[data-enigma-color-rails]",
376
+ "[data-enigma-color-rail=hue]",
377
+ "[data-enigma-color-rail=alpha]",
378
+ "[data-enigma-color-gradient]",
379
+ "[data-enigma-color-thumb]",
380
+ "[data-enigma-color-preview]",
381
+ "[data-enigma-color-eyedropper]",
382
+ "[data-enigma-color-swatches]",
383
+ "[data-enigma-color-preset]"
326
384
  ],
327
385
  "docs": "docs/notes/primitives.md#input",
328
386
  "recipes": [
@@ -739,7 +797,7 @@
739
797
  {
740
798
  "name": "context-menu",
741
799
  "title": "Context menu",
742
- "description": "A right-click menu with the desktop's behaviour: submenus that open on a beat of hovering and survive a diagonal pointer, icons, a second line, shortcuts printed on the right, checkable and radio rows, separators and captions, destructive rows in red, an optional heading naming what it acts on, a filter once a level is long, a long level rendered a window at a time, and a submenu fetched on demand and cached. Opens at the pointer, on a long press, and on Shift+F10. A menu with no rows does not open at all. It brings its own theme - an unstyled popup is transparent text over the page rather than a plain-looking control.",
800
+ "description": "A right-click menu with the desktop's behaviour: submenus that open on a beat of hovering and survive a diagonal pointer, icons, a second line, shortcuts printed on the right, checkable and radio rows, separators and captions, destructive rows in red, an optional heading naming what it acts on, a filter once a level is long, a long level rendered a window at a time, and a submenu fetched on demand and cached. Opens at the pointer, on a long press, and on Shift+F10. Copy, Cut and Paste are built from whatever was right-clicked and are on by default, because the browser menu this one replaces has them. A menu with no rows does not open at all. It brings its own theme - an unstyled popup is transparent text over the page rather than a plain-looking control.",
743
801
  "targets": [
744
802
  "react"
745
803
  ],
@@ -779,6 +837,16 @@
779
837
  "@/core/keys": "./keys"
780
838
  }
781
839
  },
840
+ {
841
+ "path": "src/core/clipboard-menu.ts",
842
+ "dest": "context-menu/clipboard-menu.ts",
843
+ "targets": [
844
+ "react"
845
+ ],
846
+ "rewrite": {
847
+ "@/core/context-menu": "./context-menu"
848
+ }
849
+ },
782
850
  {
783
851
  "path": "src/react/slot.tsx",
784
852
  "dest": "context-menu/slot.tsx",
@@ -823,7 +891,8 @@
823
891
  "@/core/keys": "./keys",
824
892
  "@/react/slot": "./slot",
825
893
  "@/react/context-menu/styles": "./styles",
826
- "@/react/context-menu/context": "./context"
894
+ "@/react/context-menu/context": "./context",
895
+ "@/core/clipboard-menu": "./clipboard-menu"
827
896
  }
828
897
  },
829
898
  {
@@ -838,7 +907,8 @@
838
907
  "@/react/context-menu/context": "./context",
839
908
  "@/react/context-menu/styles": "./styles",
840
909
  "@/core/context-menu": "./context-menu",
841
- "@/core/keys": "./keys"
910
+ "@/core/keys": "./keys",
911
+ "@/core/clipboard-menu": "./clipboard-menu"
842
912
  }
843
913
  }
844
914
  ],
@@ -7,6 +7,6 @@
7
7
  "minimalCode"
8
8
  ],
9
9
  "updated": "2026-07-17T00:17:02+02:00",
10
- "cliVersion": "1.40.0",
10
+ "cliVersion": "1.41.0",
11
11
  "sha": "3f0dcc28341bb0407860534f7ce9314cfc91b5e673f8f3d13b89d61851ed75f6"
12
12
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "On-demand over-engineering review - diff review, whole-repo audit, and enigma: debt-marker ledger (tags delete/stdlib/native/yagni/shrink, line/dep scoring); lists cuts, applies nothing.",
6
6
  "updated": "2026-06-16T11:24:30+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "f742a2be3f328b9ea1ff9a35a449177c2cbec35ad16e46f7054b7a873a2ab017"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Backend/API architecture: controller-service-repository layering, modern TypeScript project configuration (module resolution, strict flags, @/* path alias), API and request optimization (batching, avoiding redundant calls, skipping no-op writes), server-side caching (Redis), and Zod boundary validation.",
6
6
  "updated": "2026-08-02T19:59:01+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "652637f818b4ce4f4d5d83fa68fa57fe7842e32fb179523958c5496af54bb938"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Ciphera code style conventions (formatting, naming, imports incl. namespace imports for wide module surfaces, path-alias specifiers and no file extensions, comments, code-level anti-patterns; TypeScript-first, language-agnostic).",
6
6
  "updated": "2026-08-02T19:59:01+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "3beb0383a9cb0331ef8a579308a2517d24d57a8ba33751ad17d16d0a4f66e344"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Pre-delivery self-review gate, prioritized review dimensions, and change-quality criteria.",
6
6
  "updated": "2026-08-19T12:37:59+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "6b8a924cc11b61d4b45b73384aeb095ce622229359b7cc2c6ce4bb0cf3015ed7"
9
9
  }
@@ -7,6 +7,6 @@
7
7
  "codeGraph"
8
8
  ],
9
9
  "updated": "2026-08-15T20:49:24+02:00",
10
- "cliVersion": "1.40.0",
10
+ "cliVersion": "1.41.0",
11
11
  "sha": "95b7202e5659f8d9d6f11ce29e7dc5b01575ba86c78ef948bec4753ccf430155"
12
12
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Senior database architecture policy: engine selection (PostgreSQL by default, SQLite only for local-first/embedded stores), ORM selection (Prisma in TypeScript/JavaScript), query optimization, anti-duplication/normalization, scalability, and RGPD/GDPR encryption.",
6
6
  "updated": "2026-08-04T18:33:27+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "26fddc14caf697e830448a2cc453ddc470fe83d098d50bd67b278effba63274e"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Reproduce-isolate-fix debugging methodology with root-cause discipline and regression verification.",
6
6
  "updated": "2026-08-02T04:15:47+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "968876bcac9ce6e5a20be05c89ac97191b112c9e08679a8dc506d150c375fec4"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Dependency and supply-chain security: lockfiles and reproducible installs, version pinning, vulnerability auditing, vetting/minimizing packages, vendoring, and SBOM/provenance.",
6
6
  "updated": "2026-06-01T00:45:28+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "6375d835c2aef2c9bd31ce116444dc3d796f510f9970a213aa3ac4696d7e21b9"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Transactional email: React Email templates instead of hand-written HTML tables, server-side rendering, one send module behind the provider SDK, plain-text alternatives, idempotent background sending, link safety, and deliverability (SPF/DKIM/DMARC, bounce suppression, unsubscribe).",
6
6
  "updated": "2026-07-30T19:29:19+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "c9724fdbcdbeab99573be3fd44d4cdd97c2a394d99f3c4395f118f17356b00ed"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one.",
6
6
  "updated": "2026-07-29T01:18:36+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "9e30ee7d8a1a1e8c6e7f4e043857cd01841c68a427752e45bc0cad9ec5cfa279"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Frontend architecture: reusable components, abstraction thresholds, state management, real-time form validation where an emptied or not-yet-filled field is incomplete rather than invalid (a `*` on the label and an aria-disabled submit, never \"email is not valid\" over an empty input), no-op detection (skip any operation whose result equals current state, not just form saves; dirty means different from the loaded snapshot, not touched), instant first paint (render the shell, load data async, skeletons), perceived performance (prefetch on intent, debounce/throttle, cancel stale requests, avoid waterfalls, lazy widgets), large-list rendering (infinite scroll is the preferred default, pagination the deliberate exception when the design or the user calls for it, virtualization, skeletons, progressive loading), data views that ship their own affordances by default (a log, expense, transaction or history table is not done when the rows render: fuse.js search, the filters its column kinds imply, a date range, sort, filter state in the URL, and an export of the filtered set), every reference to an entity being a way into it (a name, id, project or path in a row links to that record, reveals it in a hover card, or at minimum copies and filters by it, never inert text; machine codes get human labels and raw payloads are never dumped into a cell), optimistic UI with rollback, visual restraint (one card level, spacing before borders, one elevation scale), icon actions (repeated row/card actions are icon-only buttons with aria-label plus title, not text labels), responsive/adaptive layout (fluid units, breakpoints, no overlap/overflow, viewport meta, touch targets), form fields that declare their keyboard and casing (autocapitalize/autocomplete/inputmode per field kind, set once in the shared Input, normalized on blur), variable-length text (min-width:0 in flex/grid, wrap vs truncate, long unbroken strings, worst-case content checks), auth screens (breached-password feedback, strength meter, cookie consent before login/register), and AI chat/agent interfaces via Vercel's AI Elements registry instead of hand-rolled message threads.",
6
6
  "updated": "2026-09-01T21:30:38+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "c18c746f8c29c591685b81cabbaada43996640bc830181c28b8560e904934bc2"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Git & contribution policy (senior engineering standards).",
6
6
  "updated": "2026-08-22T09:25:34+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "cb320a6a5fd3279604ad7920b877c1a36e48f4f39aeead1a4c4daa89901d9ce0"
9
9
  }
@@ -7,6 +7,6 @@
7
7
  "logoColorPolicy"
8
8
  ],
9
9
  "updated": "2026-07-17T00:17:02+02:00",
10
- "cliVersion": "1.40.0",
10
+ "cliVersion": "1.41.0",
11
11
  "sha": "09cdbefd98625b02a7d03685e5deed128238ff8454a83fe22279610fe3ef8ddf"
12
12
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Application and AI-agent security: secrets, authn/authz (least privilege), credential flows with breach-checked passwords (Have I Been Pwned), OWASP Top 10, transport/crypto baseline, cookies and consent, secure logging, and agent/MCP/tool-use safety.",
6
6
  "updated": "2026-08-19T12:37:59+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "0270c33d2b4559e831aec794c188d293d26fc17e2a8064a967d716ceb3a7bab6"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Create new skills, modify and improve existing skills, and measure skill performance with evals and benchmarks.",
6
6
  "updated": "2026-08-03T00:16:54+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "a49f6166f57d734e0f13487332da37903e925f32257447856af0fbd6a5f1dc84"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Exhaustive completion discipline for long/multi-item tasks - inventory, coverage ledger, verified done.",
6
6
  "updated": "2026-08-02T04:15:47+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "4c2197954135dd3375f32d839238b82a95c0e93e976ddf5a9cbc4a0cf0146e97"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Concise, realistic technical copy - UI microcopy, descriptions, hints, empty/error states, and README/doc prose that informs without over-explaining or restating the obvious, and never uses a typographic dash.",
6
6
  "updated": "2026-08-19T12:37:59+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "a5a228a302f50d975a947b9d84676b4c2a4780f2b222f819388cc98d6a12f207"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Test strategy, coverage gates, deterministic tests, mocking discipline, regression-first bug fixing, and test-suite organization (layout by type/domain, mirrored paths, file naming, fixture/helper placement).",
6
6
  "updated": "2026-06-16T17:11:49+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "3bdf591057b760f674fb2b1425f63acb426cda2c4f042e1a74c5a5d3807df664"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Strict frontend + backend schema validation, normalization before validation (shared normalizers: trim, lowercase email, capitalize names, canonicalize links and handles), real-time error timing (an emptied or not-yet-filled field is incomplete, not invalid: a `*` and an aria-disabled submit instead of \"not valid\" over an empty input), schema consistency, and safe client-facing error handling.",
6
6
  "updated": "2026-08-11T17:10:56+02:00",
7
- "cliVersion": "1.40.0",
7
+ "cliVersion": "1.41.0",
8
8
  "sha": "24928a4c9eed28ebede9f23f746b09a9d3d8176f8fcca61a7780a853fa5bed4e"
9
9
  }
@@ -1,6 +1,6 @@
1
1
  {
2
- "enigma-darwin-arm64": "89c71b173c88a987392879ccc0f62a8c276916f65e714d0fb21c48e8570ff877",
3
- "enigma-linux-arm64": "d38d44c8b5b971613a1ff6f86e6d87dae12201684556d8eaf6320f6ecc27c18b",
4
- "enigma-linux-x64": "4cdc0b2292f506db2ecb9f2d38fad9ac6542ece0040e56303c265b1521312b27",
5
- "enigma-win32-x64.exe": "4ca6de381ce04c8bc904ced1bca9e7ddfdcb0d5f6366ea8f118bea8d1679555a"
2
+ "enigma-darwin-arm64": "c5c528ef8a0ae37240cf6bc4dc852b45ba0ee923df1ec4cc5eb8268c2c8129c8",
3
+ "enigma-linux-arm64": "466819fb8250849c075e1637908313dd0fa045f47095b0eb06888f6844745e9e",
4
+ "enigma-linux-x64": "ad2f11cce55da362d4dc8b1767aaf5bbf6a62e16b316f0d9a1514df8d1709967",
5
+ "enigma-win32-x64.exe": "a0d397bc6c307943ed3967b29ecd9688c87d347bd3c53be634e4ff9ce7bb1bcc"
6
6
  }
@@ -1036,6 +1036,33 @@ var BUILTIN_RULES = [
1036
1036
  severity: "block",
1037
1037
  skill: "frontend-policy"
1038
1038
  },
1039
+ {
1040
+ id: "fe-color-picker-hand-rolled",
1041
+ label: "Colour pickers come from the primitive",
1042
+ files: ["*.tsx", "*.jsx", "*.vue", "*.svelte", "*.astro", "*.ts", "*.js"],
1043
+ excludeFiles: [
1044
+ "*.test.*",
1045
+ "*.spec.*",
1046
+ "**/tests/**",
1047
+ "**/__tests__/**",
1048
+ "**/fixtures/**",
1049
+ "*.min.js",
1050
+ "**/dist/**",
1051
+ "**/build/**",
1052
+ "**/node_modules/**",
1053
+ "**/vendor/**",
1054
+ "dist/**",
1055
+ "build/**",
1056
+ "node_modules/**",
1057
+ "vendor/**"
1058
+ ],
1059
+ scope: "file",
1060
+ stage: "diff",
1061
+ fileCheck: "fe-color-picker-hand-rolled",
1062
+ message: 'A colour picker written by hand. The one that always breaks is the hue: it is undefined at black, at white and at every grey, so re-deriving HSV from the field\'s RGB answers 0 and the rail snaps to red the moment the square is dragged into a corner - the hue has to be kept as state and carried through those cases. The rest of the tail is just as reliable: a hex parser that pads five digits into a colour nobody picked, `#rrggbbaa` written into a column that takes seven characters, no keyboard on either axis (there is no ARIA role for a 2D slider - `aria-valuetext` is what says what `aria-valuenow` cannot), a panel that opens off the bottom of the window, and `touch-action` left alone so the page scrolls under the finger that is dragging. `enigma add input` (@enigmax/primitives) is `<Input type="color">`: a text field holding the canonical string - typed, pasted and submitted like any other value, instead of the operating system\'s own popup that `<input type="color">` opens - with the square, the rails, presets and the screen eyedropper in a chunk that only a colour field downloads, and a baseline theme so the panel is not transparent boxes on the page. Mark the line `enigma:allow-hand-rolled-color-picker` when the picker genuinely has to be your own (frontend-policy).',
1063
+ severity: "block",
1064
+ skill: "frontend-policy"
1065
+ },
1039
1066
  {
1040
1067
  id: "fe-icon-action-button",
1041
1068
  label: "Repeated actions are icon buttons, not text labels",
@@ -1834,7 +1861,8 @@ var FILE_CHECKS = {
1834
1861
  "sec-operator-env-leak": (content) => operatorHomePathLeak(content),
1835
1862
  "fe-new-password-affordance-on-signin": (content) => newPasswordAffordanceOnSignIn(content),
1836
1863
  "fe-context-menu-hand-rolled": (content) => handRolledContextMenu(content),
1837
- "fe-selection-hand-rolled": (content) => handRolledSelection(content)
1864
+ "fe-selection-hand-rolled": (content) => handRolledSelection(content),
1865
+ "fe-color-picker-hand-rolled": (content) => handRolledColorPicker(content)
1838
1866
  };
1839
1867
  var FIXERS = {
1840
1868
  "fe-name-input-capitalize": (line, file) => {
@@ -2123,6 +2151,23 @@ function handRolledSelection(content) {
2123
2151
  }
2124
2152
  return [];
2125
2153
  }
2154
+ var COLOR_MATHS = /\b(?:hsv|hsl|hwb|rgb|hex)(?:To|2)(?:Rgb|Hsv|Hsl|Hwb|Hex|String)\b/i;
2155
+ var COLOR_DRAG = /onPointerDown|onMouseDown|@pointerdown|@mousedown|on:pointerdown|on:mousedown|addEventListener\(\s*["'`](?:pointerdown|mousedown)["'`]/;
2156
+ var COLOR_MEASURE = /getBoundingClientRect/;
2157
+ var COLOR_STATE = /\bset(?:Color|Colour|Hue|Saturation|Lightness|Brightness|Alpha|Opacity)\b|\b(?:hue|saturation)\s*[:=]/i;
2158
+ var COLOR_MITIGATED = /@enigmax\/primitives|type=["']color["']|react-colorful|react-color|@uiw\/react-color|vue-color|ngx-color|@radix-ui|enigma:allow-hand-rolled-color-picker/;
2159
+ function handRolledColorPicker(content) {
2160
+ if (COLOR_MITIGATED.test(content)) return [];
2161
+ if (!COLOR_MATHS.test(content) || !COLOR_DRAG.test(content) || !COLOR_MEASURE.test(content) || !COLOR_STATE.test(content)) return [];
2162
+ const lines = content.split("\n");
2163
+ for (let i = 0; i < lines.length; i++) {
2164
+ const line = lines[i];
2165
+ if (COMMENT_LINE.test(line) || /enigma:/.test(line)) continue;
2166
+ if (!COLOR_DRAG.test(line)) continue;
2167
+ return [{ line: i + 1, detail: "a colour-space conversion, a drag measured off a box, and the colour it sets" }];
2168
+ }
2169
+ return [];
2170
+ }
2126
2171
  var CLIP_ONE_LINE = /\btruncate\b|\btext-ellipsis\b|text-overflow\s*:\s*ellipsis/;
2127
2172
  var DYNAMIC_CHILD = /(?<![=!<>-])>\s*\{(?![#/:@])/;
2128
2173
  var VALUE_REACHABLE = /\btitle\s*=|aria-label\s*=|<\s*Tooltip|TooltipTrigger|data-tooltip|hoverCard|HoverCard/i;
@@ -2700,6 +2745,7 @@ export {
2700
2745
  extensionImports,
2701
2746
  findProjectRoot,
2702
2747
  formatFindings,
2748
+ handRolledColorPicker,
2703
2749
  handRolledContextMenu,
2704
2750
  handRolledSelection,
2705
2751
  loadRules,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "enigma-cli",
3
- "version": "1.40.0",
3
+ "version": "1.41.0",
4
4
  "description": "Everything you need to work with a coding agent: install shared policy skills for Claude Code, OpenAI Codex and opencode, and set up portable git security hooks.",
5
5
  "type": "module",
6
6
  "bin": {