enigma-cli 1.57.2 → 1.59.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/README.md +3 -0
- package/assets/commands/gate.md +1 -0
- package/assets/memory/AGENTS.md +2 -2
- package/assets/memory/CLAUDE.md +2 -2
- 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.md +1 -0
- package/assets/skills/git-policy/skill.json +4 -4
- 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.md +1 -0
- package/assets/skills/testing-policy/skill.json +3 -3
- package/assets/skills/validation-policy/skill.json +1 -1
- package/bin/checksums.json +4 -4
- package/dist/ci-watch.js +5 -0
- package/dist/codegraph-hook.js +5 -0
- package/dist/guardrails.js +19 -11
- package/dist/post-edit.js +24 -11
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -88,6 +88,9 @@ enigma verify Check that work reported as finished actually is: scans t
|
|
|
88
88
|
exits 1 on findings, 2 when the check could not run. Also runs at turn
|
|
89
89
|
end, where it additionally checks the reply itself against your
|
|
90
90
|
output-style level
|
|
91
|
+
enigma design <src> Reverse-engineer a design system from a URL, a project folder or a git
|
|
92
|
+
repo into DESIGN.md and an agent skill installed for your agents
|
|
93
|
+
(--ultra: screenshots, motion and hover states via a local Chrome/Edge)
|
|
91
94
|
enigma mcp Run the context-compression MCP server over stdio
|
|
92
95
|
enigma dashboard|dash Open the local dashboard (manage enigma; see savings) in your browser (http://enigma,
|
|
93
96
|
or http://localhost:24282 if :80/hosts is unavailable)
|
package/assets/commands/gate.md
CHANGED
|
@@ -131,6 +131,7 @@ What follows from that:
|
|
|
131
131
|
|
|
132
132
|
| The change | Run |
|
|
133
133
|
| --- | --- |
|
|
134
|
+
| Up to `gate-trivial-lines` changed lines (20 by default) in at most 3 files, no sensitive path (auth, dependencies, CI, migrations, env) and no binary | none: `axi run` declines it with `skipped: true` - push the commit as is, without a branch or PR made just for it. `--full` only when the user asked for a full validation |
|
|
134
135
|
| A typo, a comment, a version bump, generated output | `--quick` |
|
|
135
136
|
| Styles, copy, markup - no new logic | `--quick` |
|
|
136
137
|
| Code whose suite you ALREADY ran green this session, over these commits | `--quick`, and name the suite in your report |
|
package/assets/memory/AGENTS.md
CHANGED
|
@@ -67,7 +67,7 @@ Non-negotiable, language-agnostic defaults - apply them by default without being
|
|
|
67
67
|
- Never declare a task complete while any item is pending, stubbed, or unverified. Before saying "done": reconcile against the checklist, build/typecheck the whole artifact, and run `enigma verify` - it checks what you actually produced for unfinished work and runs the project's verification command. For a port, clone, or migration also run `enigma verify parity <source> <target>`, which reports any module that was never carried over. If anything remains, say exactly what remains instead of rounding up to "done". Never silently skip or stub an item - record it with a reason and report it.
|
|
68
68
|
- Implement what was asked at the difficulty it actually has. Never quietly substitute a simplified stand-in because the real thing is tedious or hard - no regex where a real parser is required, no hardcoded special case where the general logic was asked for, no empty module, no "equivalent for now". If a faithful implementation is genuinely impossible here, say so explicitly and say why; downgrading it silently and then reporting success is the single worst outcome.
|
|
69
69
|
- Never offload doable work to the user: "you can adjust/refresh X yourself" in a final report is a hidden deferral. If you can execute the action, do it before reporting; hand off only what genuinely requires the user (credentials, irreversible/destructive choices, business decisions) or what they explicitly approved deferring.
|
|
70
|
-
- A
|
|
70
|
+
- A work report opens with where each item stands, several as a table (done / missing X / in CI / ~60%), then only the evidence that matters. Estimate time as agent wall-clock from comparable runs, never human-team weeks. A yes/no question is answered yes or no first. "Abbreviate", or a repeated question, means shorter, never longer.
|
|
71
71
|
|
|
72
72
|
<!-- enigma:parallel-subagents:start -->
|
|
73
73
|
- When subtasks are genuinely independent and your runtime can spawn sub-agents (parallel task or sub-agent tools), delegate them to sub-agents that run in parallel to finish faster, then reconcile their results into a coherent whole. If the runtime has no sub-agent support, execute the subtasks sequentially.
|
|
@@ -108,7 +108,7 @@ Prose to the user is compressed at level **{{output-level}}**. It shapes the ANS
|
|
|
108
108
|
### AI Quality Gate (Automatic)
|
|
109
109
|
|
|
110
110
|
- The AI quality gate is active. When you finish a code task and the changes are committed, drive the gate yourself before reporting the work done - on WHATEVER branch the work is on, the default branch included. The user should not have to ask for it.
|
|
111
|
-
- Skip automatic driving only when: the user told you to skip or bypass it, the repo's `.enigma.json` sets `gate: false`, there is nothing committed to validate,
|
|
111
|
+
- Skip automatic driving only when: the user told you to skip or bypass it, the repo's `.enigma.json` sets `gate: false`, there is nothing committed to validate, `axi run` refuses the branch as protected (`gate-protected-branches`), or it declines a trivial change (`gate-trivial-lines`: push that as is, no branch or PR for it) - say so and leave the work unvalidated rather than switching branches on your own. The user's skip is final for that work: do not run it anyway, do not re-offer next turn. To stop it for good the user runs `/gate off` (this project) or `enigma config gate off -g` (everywhere); offer that instead of silently skipping it.
|
|
112
112
|
- Those are the only exits and each has to be NAMED. Asking is not one of them: the gate being on is already the decision, so "tell me if you want me to launch it" ends a turn on a question with one answer. Ending unvalidated and silent is worse. `enigma verify` denies the stop both ways - on a message that reports the gate as skipped, and on commits no run ever saw.
|
|
113
113
|
- On the default branch the pipeline opens no PR and pushes straight to it. That is intended; report it as the outcome instead of waiting for a PR link.
|
|
114
114
|
- If the repo is not initialized yet (`enigma gate axi` says so), run `enigma gate init` yourself, then proceed - a setup step you can perform, never a reason to stop or ask. If `enigma gate` misbehaves, `enigma gate doctor` reports why.
|
package/assets/memory/CLAUDE.md
CHANGED
|
@@ -67,7 +67,7 @@ Non-negotiable, language-agnostic defaults - apply them by default without being
|
|
|
67
67
|
- Never declare a task complete while any item is pending, stubbed, or unverified. Before saying "done": reconcile against the checklist, build/typecheck the whole artifact, and run `enigma verify` - it checks what you actually produced for unfinished work and runs the project's verification command. For a port, clone, or migration also run `enigma verify parity <source> <target>`, which reports any module that was never carried over. If anything remains, say exactly what remains instead of rounding up to "done". Never silently skip or stub an item - record it with a reason and report it.
|
|
68
68
|
- Implement what was asked at the difficulty it actually has. Never quietly substitute a simplified stand-in because the real thing is tedious or hard - no regex where a real parser is required, no hardcoded special case where the general logic was asked for, no empty module, no "equivalent for now". If a faithful implementation is genuinely impossible here, say so explicitly and say why; downgrading it silently and then reporting success is the single worst outcome.
|
|
69
69
|
- Never offload doable work to the user: "you can adjust/refresh X yourself" in a final report is a hidden deferral. If you can execute the action, do it before reporting; hand off only what genuinely requires the user (credentials, irreversible/destructive choices, business decisions) or what they explicitly approved deferring.
|
|
70
|
-
- A
|
|
70
|
+
- A work report opens with where each item stands, several as a table (done / missing X / in CI / ~60%), then only the evidence that matters. Estimate time as agent wall-clock from comparable runs, never human-team weeks. A yes/no question is answered yes or no first. "Abbreviate", or a repeated question, means shorter, never longer.
|
|
71
71
|
|
|
72
72
|
<!-- enigma:parallel-subagents:start -->
|
|
73
73
|
- When subtasks are genuinely independent and your runtime can spawn sub-agents (parallel task or sub-agent tools), delegate them to sub-agents that run in parallel to finish faster, then reconcile their results into a coherent whole. If the runtime has no sub-agent support, execute the subtasks sequentially.
|
|
@@ -108,7 +108,7 @@ Prose to the user is compressed at level **{{output-level}}**. It shapes the ANS
|
|
|
108
108
|
### AI Quality Gate (Automatic)
|
|
109
109
|
|
|
110
110
|
- The AI quality gate is active. When you finish a code task and the changes are committed, drive the gate yourself before reporting the work done - on WHATEVER branch the work is on, the default branch included. The user should not have to ask for it.
|
|
111
|
-
- Skip automatic driving only when: the user told you to skip or bypass it, the repo's `.enigma.json` sets `gate: false`, there is nothing committed to validate,
|
|
111
|
+
- Skip automatic driving only when: the user told you to skip or bypass it, the repo's `.enigma.json` sets `gate: false`, there is nothing committed to validate, `axi run` refuses the branch as protected (`gate-protected-branches`), or it declines a trivial change (`gate-trivial-lines`: push that as is, no branch or PR for it) - say so and leave the work unvalidated rather than switching branches on your own. The user's skip is final for that work: do not run it anyway, do not re-offer next turn. To stop it for good the user runs `/gate off` (this project) or `enigma config gate off -g` (everywhere); offer that instead of silently skipping it.
|
|
112
112
|
- Those are the only exits and each has to be NAMED. Asking is not one of them: the gate being on is already the decision, so "tell me if you want me to launch it" ends a turn on a question with one answer. Ending unvalidated and silent is worse. `enigma verify` denies the stop both ways - on a message that reports the gate as skipped, and on commits no run ever saw.
|
|
113
113
|
- On the default branch the pipeline opens no PR and pushes straight to it. That is intended; report it as the outcome instead of waiting for a PR link.
|
|
114
114
|
- If the repo is not initialized yet (`enigma gate axi` says so), run `enigma gate init` yourself, then proceed - a setup step you can perform, never a reason to stop or ask. If `enigma gate` misbehaves, `enigma gate doctor` reports why.
|
|
@@ -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.59.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.59.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.59.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.59.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.59.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.59.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.59.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-09-28T21:34:15+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.59.0",
|
|
8
8
|
"sha": "648c7ae3d95d5a033f4955a87613e20b40b265bfcc24d41a5732d415abe778f9"
|
|
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-09-28T21:34:15+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.59.0",
|
|
8
8
|
"sha": "5d532c2dc467f960ff800c5cd7021db09911599347959cd04481f2054abd9baa"
|
|
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-10-02T12:11:30+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.59.0",
|
|
8
8
|
"sha": "2571746934548e64ee30348bbf29b1d971d3afa0a7b32277b137150bf8803f90"
|
|
9
9
|
}
|
|
@@ -32,6 +32,7 @@ description: Commit, branch, and pull request standards - conventional commits,
|
|
|
32
32
|
- When in ANY doubt that a branch still holds unmerged, unreleased, or otherwise relevant commits, do NOT delete it - ask the user first. Leaving a stale branch is cheap; losing a branch that held unique work is not.
|
|
33
33
|
- Never delete a protected or long-lived branch (the default branch, release/*, or any branch the repo marks as protected) unless the user explicitly asks.
|
|
34
34
|
- Prune deleted upstreams periodically with `git fetch --prune` so gone remote branches stop lingering locally.
|
|
35
|
+
- Where enigma is installed, clean up with `enigma branches tidy` right after your branch lands instead of deleting by hand: it proves containment by content (squash merges included), clears idle worktrees, merged gate-mirror branches and stale tracking refs, and records every tip so `git branch <name> <sha>` restores it. It also runs on its own after agent turns, at most hourly per repository; a manual run is for the branch you just finished.
|
|
35
36
|
|
|
36
37
|
---
|
|
37
38
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "git-policy",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Git & contribution policy (senior engineering standards).",
|
|
6
|
-
"updated": "2026-10-
|
|
7
|
-
"cliVersion": "1.
|
|
8
|
-
"sha": "
|
|
6
|
+
"updated": "2026-10-05T14:00:39+02:00",
|
|
7
|
+
"cliVersion": "1.59.0",
|
|
8
|
+
"sha": "3863620f77993eff848d52da383cabb658a14a370f4a977929e60af216eb6d8d"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Application and AI-agent security: secrets, authn/authz (least privilege, object- and role-level checks), credential flows with breach-checked passwords (Have I Been Pwned), OWASP Top 10 with vetted helpers for SSRF, redirects and uploads, transport/crypto baseline, cookies and consent, secure logging, and agent/MCP/tool-use safety.",
|
|
6
6
|
"updated": "2026-09-28T21:34:15+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.59.0",
|
|
8
8
|
"sha": "544359122f127cccedfe469232da915b04f7f4aa4795297281bd4bc9cd07d371"
|
|
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.59.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-10-02T12:38:13+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.59.0",
|
|
8
8
|
"sha": "ee8447d5ca9e5d77e0a338d1e762c30e1527ded4665c10ddf21f2c4c9ce3f2d5"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Concise, realistic copy for UI, landing/sales, SEO, email and docs - the user's outcome instead of the mechanism, no full enumerations or \"powered by\" lineage, none of the recognizable AI-writing tells, and never a typographic dash.",
|
|
6
6
|
"updated": "2026-09-28T21:34:15+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.59.0",
|
|
8
8
|
"sha": "e32623f37f1bf90fa611968ca8b216e3381771254b6af7c81a953c17a8889ddb"
|
|
9
9
|
}
|
|
@@ -39,6 +39,7 @@ description: Test strategy (test pyramid), coverage gates, deterministic tests,
|
|
|
39
39
|
- Test edge cases: empty, null, max size, invalid input, concurrency, and timezone/locale where relevant.
|
|
40
40
|
- Test public behavior and contracts, not private implementation details.
|
|
41
41
|
- For input handling, assert that invalid input is rejected as defined in validation-policy.
|
|
42
|
+
- A UI, flow or load-speed change is checked in a real browser before it is called done, when the `chrome-devtools` MCP tools are available (enigma registers them; `enigma config browser`): open the page, do what the user will do, then read the console and failed network requests, and run a performance trace or Lighthouse audit for speed claims. A passing unit test does not show that a button works, a page renders, or a view loads fast.
|
|
42
43
|
|
|
43
44
|
---
|
|
44
45
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"version": "1.2.0",
|
|
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
|
-
"updated": "2026-
|
|
7
|
-
"cliVersion": "1.
|
|
8
|
-
"sha": "
|
|
6
|
+
"updated": "2026-10-04T06:11:13+02:00",
|
|
7
|
+
"cliVersion": "1.59.0",
|
|
8
|
+
"sha": "5dd665ba23faf604db1a89421c5d9d9a03a489c5784d1da8b90f57b09f95d1ca"
|
|
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-10-02T19:07:57+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.59.0",
|
|
8
8
|
"sha": "7b39ded6b82cb7a8424aea7b8d59a293791205d57e7272ff63d9fa558772ecb1"
|
|
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": "b016a81c010e74529d555402587bf822e22bc795fd259a28f9bee500be832c41",
|
|
3
|
+
"enigma-linux-arm64": "e35acc9e3aff4a733ab6934e1a85ca9b4321924e9a1eed1eaba72399813402a0",
|
|
4
|
+
"enigma-linux-x64": "ca58a5d868932cf8b2396d1f8224dd2c2e35e1d393d29d14db4bdb5c6d1485f9",
|
|
5
|
+
"enigma-win32-x64.exe": "30b56be7260c965b8adc39a3617defb0bff88c1b6e9f4cdd081b306311c58a18"
|
|
6
6
|
}
|
package/dist/ci-watch.js
CHANGED
|
@@ -56,6 +56,8 @@ var CONFIG_DEFAULTS = {
|
|
|
56
56
|
selfAudit: true,
|
|
57
57
|
compress: false,
|
|
58
58
|
codeGraph: true,
|
|
59
|
+
browser: true,
|
|
60
|
+
browserHeadless: true,
|
|
59
61
|
gate: true,
|
|
60
62
|
dashboard: "off",
|
|
61
63
|
tokenPrice: 0,
|
|
@@ -73,6 +75,9 @@ var CONFIG_DEFAULTS = {
|
|
|
73
75
|
promptSecretMode: "redact",
|
|
74
76
|
resourceCap: 60,
|
|
75
77
|
lowMemoryCap: 80,
|
|
78
|
+
gateTrivialLines: 20,
|
|
79
|
+
subagentLimit: 4,
|
|
80
|
+
compactWindow: 4e5,
|
|
76
81
|
planSessionLimit: 0,
|
|
77
82
|
planWeeklyLimit: 0,
|
|
78
83
|
planWeeklySonnetLimit: 0,
|
package/dist/codegraph-hook.js
CHANGED
|
@@ -282,6 +282,8 @@ var init_config = __esm({
|
|
|
282
282
|
selfAudit: true,
|
|
283
283
|
compress: false,
|
|
284
284
|
codeGraph: true,
|
|
285
|
+
browser: true,
|
|
286
|
+
browserHeadless: true,
|
|
285
287
|
gate: true,
|
|
286
288
|
dashboard: "off",
|
|
287
289
|
tokenPrice: 0,
|
|
@@ -299,6 +301,9 @@ var init_config = __esm({
|
|
|
299
301
|
promptSecretMode: "redact",
|
|
300
302
|
resourceCap: 60,
|
|
301
303
|
lowMemoryCap: 80,
|
|
304
|
+
gateTrivialLines: 20,
|
|
305
|
+
subagentLimit: 4,
|
|
306
|
+
compactWindow: 4e5,
|
|
302
307
|
planSessionLimit: 0,
|
|
303
308
|
planWeeklyLimit: 0,
|
|
304
309
|
planWeeklySonnetLimit: 0,
|
package/dist/guardrails.js
CHANGED
|
@@ -3350,26 +3350,33 @@ function operatorHome() {
|
|
|
3350
3350
|
return env?.trim() || homedir();
|
|
3351
3351
|
}
|
|
3352
3352
|
function operatorHomePathLeak(content) {
|
|
3353
|
+
const re = operatorHomeRegex("i");
|
|
3354
|
+
if (re === null) return [];
|
|
3355
|
+
const out = [];
|
|
3356
|
+
const lines = content.split("\n");
|
|
3357
|
+
for (let i = 0; i < lines.length; i++) {
|
|
3358
|
+
if (re.test(lines[i])) out.push({ line: i + 1, detail: "the path resolves to this machine's home directory" });
|
|
3359
|
+
}
|
|
3360
|
+
return out;
|
|
3361
|
+
}
|
|
3362
|
+
function redactOperatorHome(text) {
|
|
3363
|
+
const re = operatorHomeRegex("gi");
|
|
3364
|
+
return re === null ? text : text.replace(re, "~");
|
|
3365
|
+
}
|
|
3366
|
+
function operatorHomeRegex(flags) {
|
|
3353
3367
|
const home = operatorHome();
|
|
3354
|
-
if (!home || home.length < 6) return
|
|
3368
|
+
if (!home || home.length < 6) return null;
|
|
3355
3369
|
const account = home.replace(/[\\/]+$/, "").split(/[\\/]/).pop() || "";
|
|
3356
|
-
if (!account || GENERIC_ACCOUNTS.has(account.toLowerCase())) return
|
|
3370
|
+
if (!account || GENERIC_ACCOUNTS.has(account.toLowerCase())) return null;
|
|
3357
3371
|
const forms = [home];
|
|
3358
3372
|
const drive = /^([A-Za-z]):[\\/](.*)$/.exec(home);
|
|
3359
3373
|
if (drive) forms.push(`/${drive[1].toLowerCase()}/${drive[2]}`);
|
|
3360
3374
|
const alt = forms.map((f) => f.split(/[\\/]/).map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("[\\\\/]")).join("|");
|
|
3361
|
-
let re;
|
|
3362
3375
|
try {
|
|
3363
|
-
|
|
3376
|
+
return new RegExp(`(?:${alt})(?![A-Za-z0-9_-]|\\.[A-Za-z0-9_-])`, flags);
|
|
3364
3377
|
} catch {
|
|
3365
|
-
return
|
|
3366
|
-
}
|
|
3367
|
-
const out = [];
|
|
3368
|
-
const lines = content.split("\n");
|
|
3369
|
-
for (let i = 0; i < lines.length; i++) {
|
|
3370
|
-
if (re.test(lines[i])) out.push({ line: i + 1, detail: "the path resolves to this machine's home directory" });
|
|
3378
|
+
return null;
|
|
3371
3379
|
}
|
|
3372
|
-
return out;
|
|
3373
3380
|
}
|
|
3374
3381
|
function readStringLiteral(src, start, python) {
|
|
3375
3382
|
let i = start;
|
|
@@ -4818,6 +4825,7 @@ export {
|
|
|
4818
4825
|
readLedger,
|
|
4819
4826
|
readReplyLedger,
|
|
4820
4827
|
recordFindings,
|
|
4828
|
+
redactOperatorHome,
|
|
4821
4829
|
redirectFromInput,
|
|
4822
4830
|
redirectPrefixCheck,
|
|
4823
4831
|
remoteCollectionNames,
|
package/dist/post-edit.js
CHANGED
|
@@ -282,6 +282,8 @@ var init_config = __esm({
|
|
|
282
282
|
selfAudit: true,
|
|
283
283
|
compress: false,
|
|
284
284
|
codeGraph: true,
|
|
285
|
+
browser: true,
|
|
286
|
+
browserHeadless: true,
|
|
285
287
|
gate: true,
|
|
286
288
|
dashboard: "off",
|
|
287
289
|
tokenPrice: 0,
|
|
@@ -299,6 +301,9 @@ var init_config = __esm({
|
|
|
299
301
|
promptSecretMode: "redact",
|
|
300
302
|
resourceCap: 60,
|
|
301
303
|
lowMemoryCap: 80,
|
|
304
|
+
gateTrivialLines: 20,
|
|
305
|
+
subagentLimit: 4,
|
|
306
|
+
compactWindow: 4e5,
|
|
302
307
|
planSessionLimit: 0,
|
|
303
308
|
planWeeklyLimit: 0,
|
|
304
309
|
planWeeklySonnetLimit: 0,
|
|
@@ -605,6 +610,7 @@ __export(guardrails_exports, {
|
|
|
605
610
|
readLedger: () => readLedger,
|
|
606
611
|
readReplyLedger: () => readReplyLedger,
|
|
607
612
|
recordFindings: () => recordFindings,
|
|
613
|
+
redactOperatorHome: () => redactOperatorHome,
|
|
608
614
|
redirectFromInput: () => redirectFromInput,
|
|
609
615
|
redirectPrefixCheck: () => redirectPrefixCheck,
|
|
610
616
|
remoteCollectionNames: () => remoteCollectionNames,
|
|
@@ -1137,26 +1143,33 @@ function operatorHome() {
|
|
|
1137
1143
|
return env?.trim() || homedir2();
|
|
1138
1144
|
}
|
|
1139
1145
|
function operatorHomePathLeak(content) {
|
|
1146
|
+
const re = operatorHomeRegex("i");
|
|
1147
|
+
if (re === null) return [];
|
|
1148
|
+
const out = [];
|
|
1149
|
+
const lines = content.split("\n");
|
|
1150
|
+
for (let i = 0; i < lines.length; i++) {
|
|
1151
|
+
if (re.test(lines[i])) out.push({ line: i + 1, detail: "the path resolves to this machine's home directory" });
|
|
1152
|
+
}
|
|
1153
|
+
return out;
|
|
1154
|
+
}
|
|
1155
|
+
function redactOperatorHome(text) {
|
|
1156
|
+
const re = operatorHomeRegex("gi");
|
|
1157
|
+
return re === null ? text : text.replace(re, "~");
|
|
1158
|
+
}
|
|
1159
|
+
function operatorHomeRegex(flags) {
|
|
1140
1160
|
const home = operatorHome();
|
|
1141
|
-
if (!home || home.length < 6) return
|
|
1161
|
+
if (!home || home.length < 6) return null;
|
|
1142
1162
|
const account = home.replace(/[\\/]+$/, "").split(/[\\/]/).pop() || "";
|
|
1143
|
-
if (!account || GENERIC_ACCOUNTS.has(account.toLowerCase())) return
|
|
1163
|
+
if (!account || GENERIC_ACCOUNTS.has(account.toLowerCase())) return null;
|
|
1144
1164
|
const forms = [home];
|
|
1145
1165
|
const drive = /^([A-Za-z]):[\\/](.*)$/.exec(home);
|
|
1146
1166
|
if (drive) forms.push(`/${drive[1].toLowerCase()}/${drive[2]}`);
|
|
1147
1167
|
const alt = forms.map((f) => f.split(/[\\/]/).map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("[\\\\/]")).join("|");
|
|
1148
|
-
let re;
|
|
1149
1168
|
try {
|
|
1150
|
-
|
|
1169
|
+
return new RegExp(`(?:${alt})(?![A-Za-z0-9_-]|\\.[A-Za-z0-9_-])`, flags);
|
|
1151
1170
|
} catch {
|
|
1152
|
-
return
|
|
1153
|
-
}
|
|
1154
|
-
const out = [];
|
|
1155
|
-
const lines = content.split("\n");
|
|
1156
|
-
for (let i = 0; i < lines.length; i++) {
|
|
1157
|
-
if (re.test(lines[i])) out.push({ line: i + 1, detail: "the path resolves to this machine's home directory" });
|
|
1171
|
+
return null;
|
|
1158
1172
|
}
|
|
1159
|
-
return out;
|
|
1160
1173
|
}
|
|
1161
1174
|
function readStringLiteral(src, start, python) {
|
|
1162
1175
|
let i = start;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "enigma-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.59.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": {
|