enigma-cli 1.48.0 → 1.50.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.
- package/assets/skills/anti-overengineering-policy/skill.json +1 -1
- package/assets/skills/anti-overengineering-review/skill.json +1 -1
- package/assets/skills/backend-policy/skill.json +1 -1
- package/assets/skills/ciphera-style-policy/skill.json +1 -1
- package/assets/skills/code-review-policy/skill.json +1 -1
- package/assets/skills/core-engineering-policy/skill.json +1 -1
- package/assets/skills/database-expert/skill.json +1 -1
- package/assets/skills/debugging-policy/skill.json +1 -1
- package/assets/skills/dependency-policy/skill.json +1 -1
- package/assets/skills/email-policy/skill.json +1 -1
- package/assets/skills/frontend-design/skill.json +1 -1
- package/assets/skills/frontend-policy/skill.json +1 -1
- package/assets/skills/git-policy/skill.json +1 -1
- package/assets/skills/logo-sourcing-policy/skill.json +1 -1
- package/assets/skills/security-policy/skill.json +1 -1
- package/assets/skills/skill-creator/skill.json +1 -1
- package/assets/skills/task-completion-policy/skill.json +1 -1
- package/assets/skills/technical-writing-policy/skill.json +1 -1
- package/assets/skills/testing-policy/skill.json +1 -1
- package/assets/skills/validation-policy/skill.json +1 -1
- package/bin/checksums.json +4 -4
- package/dist/codegraph-hook.js +1 -0
- package/dist/guardrails.js +45 -0
- package/dist/post-edit.js +47 -1
- package/package.json +1 -1
|
@@ -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.
|
|
7
|
+
"cliVersion": "1.50.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.
|
|
7
|
+
"cliVersion": "1.50.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.
|
|
7
|
+
"cliVersion": "1.50.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.
|
|
7
|
+
"cliVersion": "1.50.0",
|
|
8
8
|
"sha": "6b8a924cc11b61d4b45b73384aeb095ce622229359b7cc2c6ce4bb0cf3015ed7"
|
|
9
9
|
}
|
|
@@ -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.
|
|
7
|
+
"cliVersion": "1.50.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.
|
|
7
|
+
"cliVersion": "1.50.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.
|
|
7
|
+
"cliVersion": "1.50.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.
|
|
7
|
+
"cliVersion": "1.50.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.
|
|
7
|
+
"cliVersion": "1.50.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-07T04:01:56+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.50.0",
|
|
8
8
|
"sha": "8bfd675f3a66dbdcaa7e670bc40246adb0c470b93c1d8677338b4092dfa9ada4"
|
|
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.
|
|
7
|
+
"cliVersion": "1.50.0",
|
|
8
8
|
"sha": "cb320a6a5fd3279604ad7920b877c1a36e48f4f39aeead1a4c4daa89901d9ce0"
|
|
9
9
|
}
|
|
@@ -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-09-05T02:46:46+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.50.0",
|
|
8
8
|
"sha": "d64fe3a4a54f27a71e3066875ee949500f170d04da5c548ef605268a12102afb"
|
|
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.
|
|
7
|
+
"cliVersion": "1.50.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.
|
|
7
|
+
"cliVersion": "1.50.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.
|
|
7
|
+
"cliVersion": "1.50.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.
|
|
7
|
+
"cliVersion": "1.50.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.
|
|
7
|
+
"cliVersion": "1.50.0",
|
|
8
8
|
"sha": "24928a4c9eed28ebede9f23f746b09a9d3d8176f8fcca61a7780a853fa5bed4e"
|
|
9
9
|
}
|
package/bin/checksums.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"enigma-darwin-arm64": "
|
|
3
|
-
"enigma-linux-arm64": "
|
|
4
|
-
"enigma-linux-x64": "
|
|
5
|
-
"enigma-win32-x64.exe": "
|
|
2
|
+
"enigma-darwin-arm64": "ce65e8b6f82710ca32574f8d6e45410f0255a8b1509b2cd50d6a41386885cf6b",
|
|
3
|
+
"enigma-linux-arm64": "a0a48f23f1bd2ecb7a9a22d8725ca8995628b0bbe428b19fa73b7ab1c51d2984",
|
|
4
|
+
"enigma-linux-x64": "d84ba00ca0cb88b4203e521db9d20a9950d50668282dab65ca52485d36b3dd2a",
|
|
5
|
+
"enigma-win32-x64.exe": "925cf7a1cc446bbed77dc7c2f8ca071b09094a24e19883d4ada2d989baee8027"
|
|
6
6
|
}
|
package/dist/codegraph-hook.js
CHANGED
package/dist/guardrails.js
CHANGED
|
@@ -1256,6 +1256,33 @@ var BUILTIN_RULES = [
|
|
|
1256
1256
|
severity: "block",
|
|
1257
1257
|
skill: "frontend-policy"
|
|
1258
1258
|
},
|
|
1259
|
+
{
|
|
1260
|
+
id: "fe-native-select-over-primitive",
|
|
1261
|
+
label: "A project with the select primitive uses it",
|
|
1262
|
+
files: ["*.tsx", "*.jsx", "*.vue", "*.svelte", "*.astro", "*.ts", "*.js"],
|
|
1263
|
+
excludeFiles: [
|
|
1264
|
+
"*.test.*",
|
|
1265
|
+
"*.spec.*",
|
|
1266
|
+
"**/tests/**",
|
|
1267
|
+
"**/__tests__/**",
|
|
1268
|
+
"**/fixtures/**",
|
|
1269
|
+
"*.min.js",
|
|
1270
|
+
"**/dist/**",
|
|
1271
|
+
"**/build/**",
|
|
1272
|
+
"**/node_modules/**",
|
|
1273
|
+
"**/vendor/**",
|
|
1274
|
+
"dist/**",
|
|
1275
|
+
"build/**",
|
|
1276
|
+
"node_modules/**",
|
|
1277
|
+
"vendor/**"
|
|
1278
|
+
],
|
|
1279
|
+
scope: "file",
|
|
1280
|
+
stage: "diff",
|
|
1281
|
+
fileCheck: "fe-native-select-over-primitive",
|
|
1282
|
+
message: "A native <select> built from a list of data, in a file that already imports @enigmax/primitives. The hand-rolled listbox rule deliberately lets the native element through - it needs no role and a bad replacement is worse - but that carve-out is about projects with nothing better; this one HAS the better one installed. The native popup is drawn by the OS: it cannot carry an icon, a second line, a count or a tag, it cannot be searched however long the list gets, and no part of it takes the design system's styling. `Select` from `@enigmax/primitives/react/select` is the same control with a typeahead, a panel that measures before it opens, one highlight shared by pointer and keyboard, a filter that turns itself on past eight rows, and a hidden field so the form still posts. Mark the line `enigma:allow-native-select` where the native element is the right answer anyway - a short fixed list, a form that must work with no JavaScript, or a surface the primitive does not reach (frontend-policy).",
|
|
1283
|
+
severity: "block",
|
|
1284
|
+
skill: "frontend-policy"
|
|
1285
|
+
},
|
|
1259
1286
|
{
|
|
1260
1287
|
id: "fe-toast-hand-rolled",
|
|
1261
1288
|
label: "Toasts come from the primitive",
|
|
@@ -2116,6 +2143,7 @@ var FILE_CHECKS = {
|
|
|
2116
2143
|
"fe-video-player-hand-rolled": (content) => handRolledVideoPlayer(content),
|
|
2117
2144
|
"sec-2fa-reauth-prompt": (content) => twoFactorPasswordPrompt(content),
|
|
2118
2145
|
"fe-select-hand-rolled": (content) => handRolledSelect(content),
|
|
2146
|
+
"fe-native-select-over-primitive": (content) => nativeSelectOverPrimitive(content),
|
|
2119
2147
|
"fe-toast-hand-rolled": (content) => handRolledToast(content),
|
|
2120
2148
|
"fe-palette-hand-rolled": (content) => handRolledPalette(content)
|
|
2121
2149
|
};
|
|
@@ -2536,6 +2564,22 @@ function handRolledSelect(content) {
|
|
|
2536
2564
|
}
|
|
2537
2565
|
return [];
|
|
2538
2566
|
}
|
|
2567
|
+
var NATIVE_SELECT = /<select\b/;
|
|
2568
|
+
var NATIVE_SELECT_MAPPED = /<option\b|\.map\(/;
|
|
2569
|
+
var NATIVE_SELECT_TRIGGER = /@enigmax\/primitives/;
|
|
2570
|
+
var NATIVE_SELECT_MITIGATED = /enigma:allow-native-select|SelectRoot|useSelectContext/;
|
|
2571
|
+
function nativeSelectOverPrimitive(content) {
|
|
2572
|
+
if (NATIVE_SELECT_MITIGATED.test(content)) return [];
|
|
2573
|
+
if (!NATIVE_SELECT_TRIGGER.test(content) || !NATIVE_SELECT.test(content) || !NATIVE_SELECT_MAPPED.test(content)) return [];
|
|
2574
|
+
const lines = content.split("\n");
|
|
2575
|
+
for (let i = 0; i < lines.length; i++) {
|
|
2576
|
+
const line = lines[i];
|
|
2577
|
+
if (COMMENT_LINE.test(line) || /enigma:/.test(line)) continue;
|
|
2578
|
+
if (!NATIVE_SELECT.test(line)) continue;
|
|
2579
|
+
return [{ line: i + 1, detail: "a native <select> in a file that already imports the primitives package" }];
|
|
2580
|
+
}
|
|
2581
|
+
return [];
|
|
2582
|
+
}
|
|
2539
2583
|
var TOAST_QUEUE = /\bset(?:Toasts?|Snackbars?)\b|\btoasts\.(?:map|filter|slice)\b|\btoastQueue\b/;
|
|
2540
2584
|
var TOAST_TIMER = /setTimeout\(/;
|
|
2541
2585
|
var TOAST_MITIGATED = /@enigmax\/primitives|createNotifications|useNotifications|<Toaster|ToastT\b|ToasterProps\b|["']sonner["']|react-hot-toast|react-toastify|notistack|@radix-ui|@mui\/material|@chakra-ui|@mantine|antd|enigma:allow-hand-rolled-toast/;
|
|
@@ -3158,6 +3202,7 @@ export {
|
|
|
3158
3202
|
missingPathAlias,
|
|
3159
3203
|
missingWindowsHide,
|
|
3160
3204
|
mutationWithoutOptimisticUpdate,
|
|
3205
|
+
nativeSelectOverPrimitive,
|
|
3161
3206
|
newPasswordAffordanceOnSignIn,
|
|
3162
3207
|
operatorHomePathLeak,
|
|
3163
3208
|
pageAwaitWithoutBoundary,
|
package/dist/post-edit.js
CHANGED
|
@@ -265,6 +265,7 @@ var init_config = __esm({
|
|
|
265
265
|
minimalCode: "full",
|
|
266
266
|
logoColorPolicy: "ask",
|
|
267
267
|
autoSync: true,
|
|
268
|
+
shareSessions: true,
|
|
268
269
|
statusline: true,
|
|
269
270
|
statuslineRefresh: 10,
|
|
270
271
|
claudeTrust: true,
|
|
@@ -579,6 +580,7 @@ __export(guardrails_exports, {
|
|
|
579
580
|
missingPathAlias: () => missingPathAlias,
|
|
580
581
|
missingWindowsHide: () => missingWindowsHide,
|
|
581
582
|
mutationWithoutOptimisticUpdate: () => mutationWithoutOptimisticUpdate,
|
|
583
|
+
nativeSelectOverPrimitive: () => nativeSelectOverPrimitive,
|
|
582
584
|
newPasswordAffordanceOnSignIn: () => newPasswordAffordanceOnSignIn,
|
|
583
585
|
operatorHomePathLeak: () => operatorHomePathLeak,
|
|
584
586
|
pageAwaitWithoutBoundary: () => pageAwaitWithoutBoundary,
|
|
@@ -935,6 +937,18 @@ function handRolledSelect(content) {
|
|
|
935
937
|
}
|
|
936
938
|
return [];
|
|
937
939
|
}
|
|
940
|
+
function nativeSelectOverPrimitive(content) {
|
|
941
|
+
if (NATIVE_SELECT_MITIGATED.test(content)) return [];
|
|
942
|
+
if (!NATIVE_SELECT_TRIGGER.test(content) || !NATIVE_SELECT.test(content) || !NATIVE_SELECT_MAPPED.test(content)) return [];
|
|
943
|
+
const lines = content.split("\n");
|
|
944
|
+
for (let i = 0; i < lines.length; i++) {
|
|
945
|
+
const line = lines[i];
|
|
946
|
+
if (COMMENT_LINE.test(line) || /enigma:/.test(line)) continue;
|
|
947
|
+
if (!NATIVE_SELECT.test(line)) continue;
|
|
948
|
+
return [{ line: i + 1, detail: "a native <select> in a file that already imports the primitives package" }];
|
|
949
|
+
}
|
|
950
|
+
return [];
|
|
951
|
+
}
|
|
938
952
|
function handRolledToast(content) {
|
|
939
953
|
if (TOAST_MITIGATED.test(content)) return [];
|
|
940
954
|
if (!TOAST_QUEUE.test(content) || !TOAST_TIMER.test(content)) return [];
|
|
@@ -1495,7 +1509,7 @@ enigma-guardrails: BLOCKED - ${r.blocks.length} convention violation(s):`);
|
|
|
1495
1509
|
console.log(`enigma-guardrails: ${r.count} ${all ? "tracked" : "staged"} file(s) checked, no blocking violations.`);
|
|
1496
1510
|
return 0;
|
|
1497
1511
|
}
|
|
1498
|
-
var COMMENT_LINE, SKELETON_GUARD_SRC, SKELETON_SIGNAL_SRC, BUILTIN_RULES, PROJECT_CHECKS, CURRENT_PASSWORD, NEW_PASSWORD, NEW_PASSWORD_PROP, NOT_A_JSX_PROP, FILE_CHECKS, FIXERS, SPAWNERS, MUTATING_REQUEST, ENTITY_WRITE, OPTIMISTIC_SIGNAL, ALLOW_SERVER_FIRST, RESULT_BINDING, BLOCK_LOOKBACK, BLOCK_LOOKAHEAD, REVALIDATE_AFTER, PROMISE_FANOUT, FANOUT_LITERAL, FANOUT_MAPPED, FANOUT_OVER_OBJECT, EXPENSIVE_PER_ITEM, CONCURRENCY_BOUND, FANOUT_WINDOW, TEXTAREA, TEXTAREA_LOWER, TEXTAREA_UPPER, TEXTAREA_FIXED, TEXTAREA_AUTOSIZE, VIEW_GUARD, LOADING_NAME, LOADING_VALUE, VIEW_GUARD_LOADING, VIEW_CHROME_HEADING, VIEW_CHROME_TEXT, VIEW_BODY_LOOKAHEAD, ALLOW_VIEW_SKELETON, SKELETON_GUARD, SKELETON_SIGNAL, REMOTE_COLLECTION_BINDINGS, LIST_BOUNDED, ALLOW_UNBOUNDED_LIST, MENU_HANDLER, MENU_POINT, MENU_STATE, MENU_MITIGATED, SELECT_RANGE_KEY, SELECT_ADD_KEY, SELECT_STATE, SELECT_MITIGATED, COLOR_MATHS, COLOR_DRAG, COLOR_MEASURE, COLOR_STATE, COLOR_MITIGATED, LIGHTBOX_IMAGE, LIGHTBOX_WHEEL, LIGHTBOX_ZOOM, LIGHTBOX_DIALOG, LIGHTBOX_MITIGATED, VIDEO_ELEMENT, VIDEO_DRIVEN, VIDEO_TIMELINE, VIDEO_CONTROLS, VIDEO_MITIGATED, TWOFA_SUBJECT, TWOFA_ENROLL, TWOFA_PASSWORD, TWOFA_MITIGATED, TWOFA_WINDOW, LISTBOX_ROLE, LISTBOX_OPEN, LISTBOX_OPTIONS, LISTBOX_MITIGATED, TOAST_QUEUE, TOAST_TIMER, TOAST_MITIGATED, PALETTE_SHORTCUT, PALETTE_MODIFIER, PALETTE_OPEN, PALETTE_FILTER, PALETTE_MITIGATED, CLIP_ONE_LINE, DYNAMIC_CHILD, VALUE_REACHABLE, WRAPPER_LOOKBACK, ALLOW_CLIPPED_VALUE, CLIPPED_SIMPLE_VALUE, NOT_TEXT_BINDING, ASYNC_ROUTE, SERVER_DATA_AWAIT, STREAM_BOUNDARY, ALLOW_BLOCKING_PAGE, LOADING_BOUNDARY_FILE, SPECIFIER, MODULE_EXT, JS_EXT, tsconfigCache, NAMED_IMPORT, GENERIC_ACCOUNTS, INTERNAL_MODULE, globCache, DIFF_HUNK, LEDGER_MAX_BYTES, LEDGER_KEEP, LEDGER_KEEP_REPLY, grEntry, isGrEntry;
|
|
1512
|
+
var COMMENT_LINE, SKELETON_GUARD_SRC, SKELETON_SIGNAL_SRC, BUILTIN_RULES, PROJECT_CHECKS, CURRENT_PASSWORD, NEW_PASSWORD, NEW_PASSWORD_PROP, NOT_A_JSX_PROP, FILE_CHECKS, FIXERS, SPAWNERS, MUTATING_REQUEST, ENTITY_WRITE, OPTIMISTIC_SIGNAL, ALLOW_SERVER_FIRST, RESULT_BINDING, BLOCK_LOOKBACK, BLOCK_LOOKAHEAD, REVALIDATE_AFTER, PROMISE_FANOUT, FANOUT_LITERAL, FANOUT_MAPPED, FANOUT_OVER_OBJECT, EXPENSIVE_PER_ITEM, CONCURRENCY_BOUND, FANOUT_WINDOW, TEXTAREA, TEXTAREA_LOWER, TEXTAREA_UPPER, TEXTAREA_FIXED, TEXTAREA_AUTOSIZE, VIEW_GUARD, LOADING_NAME, LOADING_VALUE, VIEW_GUARD_LOADING, VIEW_CHROME_HEADING, VIEW_CHROME_TEXT, VIEW_BODY_LOOKAHEAD, ALLOW_VIEW_SKELETON, SKELETON_GUARD, SKELETON_SIGNAL, REMOTE_COLLECTION_BINDINGS, LIST_BOUNDED, ALLOW_UNBOUNDED_LIST, MENU_HANDLER, MENU_POINT, MENU_STATE, MENU_MITIGATED, SELECT_RANGE_KEY, SELECT_ADD_KEY, SELECT_STATE, SELECT_MITIGATED, COLOR_MATHS, COLOR_DRAG, COLOR_MEASURE, COLOR_STATE, COLOR_MITIGATED, LIGHTBOX_IMAGE, LIGHTBOX_WHEEL, LIGHTBOX_ZOOM, LIGHTBOX_DIALOG, LIGHTBOX_MITIGATED, VIDEO_ELEMENT, VIDEO_DRIVEN, VIDEO_TIMELINE, VIDEO_CONTROLS, VIDEO_MITIGATED, TWOFA_SUBJECT, TWOFA_ENROLL, TWOFA_PASSWORD, TWOFA_MITIGATED, TWOFA_WINDOW, LISTBOX_ROLE, LISTBOX_OPEN, LISTBOX_OPTIONS, LISTBOX_MITIGATED, NATIVE_SELECT, NATIVE_SELECT_MAPPED, NATIVE_SELECT_TRIGGER, NATIVE_SELECT_MITIGATED, TOAST_QUEUE, TOAST_TIMER, TOAST_MITIGATED, PALETTE_SHORTCUT, PALETTE_MODIFIER, PALETTE_OPEN, PALETTE_FILTER, PALETTE_MITIGATED, CLIP_ONE_LINE, DYNAMIC_CHILD, VALUE_REACHABLE, WRAPPER_LOOKBACK, ALLOW_CLIPPED_VALUE, CLIPPED_SIMPLE_VALUE, NOT_TEXT_BINDING, ASYNC_ROUTE, SERVER_DATA_AWAIT, STREAM_BOUNDARY, ALLOW_BLOCKING_PAGE, LOADING_BOUNDARY_FILE, SPECIFIER, MODULE_EXT, JS_EXT, tsconfigCache, NAMED_IMPORT, GENERIC_ACCOUNTS, INTERNAL_MODULE, globCache, DIFF_HUNK, LEDGER_MAX_BYTES, LEDGER_KEEP, LEDGER_KEEP_REPLY, grEntry, isGrEntry;
|
|
1499
1513
|
var init_guardrails = __esm({
|
|
1500
1514
|
"src/guardrails.ts"() {
|
|
1501
1515
|
"use strict";
|
|
@@ -2749,6 +2763,33 @@ var init_guardrails = __esm({
|
|
|
2749
2763
|
severity: "block",
|
|
2750
2764
|
skill: "frontend-policy"
|
|
2751
2765
|
},
|
|
2766
|
+
{
|
|
2767
|
+
id: "fe-native-select-over-primitive",
|
|
2768
|
+
label: "A project with the select primitive uses it",
|
|
2769
|
+
files: ["*.tsx", "*.jsx", "*.vue", "*.svelte", "*.astro", "*.ts", "*.js"],
|
|
2770
|
+
excludeFiles: [
|
|
2771
|
+
"*.test.*",
|
|
2772
|
+
"*.spec.*",
|
|
2773
|
+
"**/tests/**",
|
|
2774
|
+
"**/__tests__/**",
|
|
2775
|
+
"**/fixtures/**",
|
|
2776
|
+
"*.min.js",
|
|
2777
|
+
"**/dist/**",
|
|
2778
|
+
"**/build/**",
|
|
2779
|
+
"**/node_modules/**",
|
|
2780
|
+
"**/vendor/**",
|
|
2781
|
+
"dist/**",
|
|
2782
|
+
"build/**",
|
|
2783
|
+
"node_modules/**",
|
|
2784
|
+
"vendor/**"
|
|
2785
|
+
],
|
|
2786
|
+
scope: "file",
|
|
2787
|
+
stage: "diff",
|
|
2788
|
+
fileCheck: "fe-native-select-over-primitive",
|
|
2789
|
+
message: "A native <select> built from a list of data, in a file that already imports @enigmax/primitives. The hand-rolled listbox rule deliberately lets the native element through - it needs no role and a bad replacement is worse - but that carve-out is about projects with nothing better; this one HAS the better one installed. The native popup is drawn by the OS: it cannot carry an icon, a second line, a count or a tag, it cannot be searched however long the list gets, and no part of it takes the design system's styling. `Select` from `@enigmax/primitives/react/select` is the same control with a typeahead, a panel that measures before it opens, one highlight shared by pointer and keyboard, a filter that turns itself on past eight rows, and a hidden field so the form still posts. Mark the line `enigma:allow-native-select` where the native element is the right answer anyway - a short fixed list, a form that must work with no JavaScript, or a surface the primitive does not reach (frontend-policy).",
|
|
2790
|
+
severity: "block",
|
|
2791
|
+
skill: "frontend-policy"
|
|
2792
|
+
},
|
|
2752
2793
|
{
|
|
2753
2794
|
id: "fe-toast-hand-rolled",
|
|
2754
2795
|
label: "Toasts come from the primitive",
|
|
@@ -3597,6 +3638,7 @@ var init_guardrails = __esm({
|
|
|
3597
3638
|
"fe-video-player-hand-rolled": (content) => handRolledVideoPlayer(content),
|
|
3598
3639
|
"sec-2fa-reauth-prompt": (content) => twoFactorPasswordPrompt(content),
|
|
3599
3640
|
"fe-select-hand-rolled": (content) => handRolledSelect(content),
|
|
3641
|
+
"fe-native-select-over-primitive": (content) => nativeSelectOverPrimitive(content),
|
|
3600
3642
|
"fe-toast-hand-rolled": (content) => handRolledToast(content),
|
|
3601
3643
|
"fe-palette-hand-rolled": (content) => handRolledPalette(content)
|
|
3602
3644
|
};
|
|
@@ -3698,6 +3740,10 @@ var init_guardrails = __esm({
|
|
|
3698
3740
|
LISTBOX_OPEN = /\bset(?:Open|IsOpen|DropdownOpen|MenuOpen|Expanded)\b|\bisOpen\b|\baria-expanded\b/;
|
|
3699
3741
|
LISTBOX_OPTIONS = /\b(?:options|choices)\b/;
|
|
3700
3742
|
LISTBOX_MITIGATED = /@enigmax\/primitives|createSelect|useSelectContext|<Select|SelectRoot|radix-ui|@headlessui|downshift|react-select|@mui\/material|antd|@mantine|@chakra-ui|primereact|enigma:allow-hand-rolled-select/;
|
|
3743
|
+
NATIVE_SELECT = /<select\b/;
|
|
3744
|
+
NATIVE_SELECT_MAPPED = /<option\b|\.map\(/;
|
|
3745
|
+
NATIVE_SELECT_TRIGGER = /@enigmax\/primitives/;
|
|
3746
|
+
NATIVE_SELECT_MITIGATED = /enigma:allow-native-select|SelectRoot|useSelectContext/;
|
|
3701
3747
|
TOAST_QUEUE = /\bset(?:Toasts?|Snackbars?)\b|\btoasts\.(?:map|filter|slice)\b|\btoastQueue\b/;
|
|
3702
3748
|
TOAST_TIMER = /setTimeout\(/;
|
|
3703
3749
|
TOAST_MITIGATED = /@enigmax\/primitives|createNotifications|useNotifications|<Toaster|ToastT\b|ToasterProps\b|["']sonner["']|react-hot-toast|react-toastify|notistack|@radix-ui|@mui\/material|@chakra-ui|@mantine|antd|enigma:allow-hand-rolled-toast/;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "enigma-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.50.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": {
|