enigma-cli 1.36.0 → 1.36.2
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/memory/AGENTS.md +2 -6
- package/assets/memory/CLAUDE.md +2 -6
- 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.md +2 -2
- package/assets/skills/code-review-policy/skill.json +4 -4
- 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 +37 -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.md +7 -0
- package/assets/skills/security-policy/skill.json +4 -4
- 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.md +5 -0
- package/assets/skills/technical-writing-policy/skill.json +4 -4
- 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/guardrails.js +67 -1
- package/package.json +1 -1
package/assets/memory/AGENTS.md
CHANGED
|
@@ -27,8 +27,9 @@
|
|
|
27
27
|
- Respond in the user's language; write all code, comments, identifiers, and documentation in English.
|
|
28
28
|
- No emojis in responses, code, or docs. Use ASCII punctuation: "-" not the long dash, "->" not the arrow. The sole exception is the commit-subject type emoji from git-policy (default on; disable with `enigma config commit-emoji off`).
|
|
29
29
|
- Treat all external input as untrusted; never expose secrets or hardcode credentials.
|
|
30
|
-
-
|
|
30
|
+
- Remediating leaked data the user asked to delete: the commit/PR/branch must NOT name the values or flag the security motive (that signposts where to look and re-leaks them permanently) - neutral, mundane message, `🔒 security` type forbidden; offer history-rewrite vs. discreet-removal first. ONLY that case; every other commit stays normal and descriptive (see git-policy).
|
|
31
31
|
- A value you cannot source is not a value you may write. An email, a version, an id, a URL, a price, a name, a field of an API - if it did not come from the user, the code, a command you ran, or a document you read, you do not have it: ask for it, or leave it out and say which. A well-formed guess is the dangerous kind, because it reads as fact and nobody re-checks it. Fixture and mock data is the exception, and it has to look like fixture data.
|
|
32
|
+
- The mirror rule: a value you WERE given is permission to use it, never to publish it - a domain, host, IP, a path with your OS account name, or an email ships as a placeholder unless the user asked for that exact value.
|
|
32
33
|
- Reuse existing code before writing new code; do not duplicate logic.
|
|
33
34
|
- End files with exactly one trailing newline and no trailing whitespace.
|
|
34
35
|
- When editing existing code, match its established style instead of imposing a different one.
|
|
@@ -290,10 +291,6 @@ When documentation is unclear:
|
|
|
290
291
|
|
|
291
292
|
# Security Rules
|
|
292
293
|
|
|
293
|
-
- Treat all external input as untrusted.
|
|
294
|
-
- Never expose secrets.
|
|
295
|
-
- Never hardcode credentials.
|
|
296
|
-
- Validate all tool inputs.
|
|
297
294
|
- Restrict permissions using least privilege principles.
|
|
298
295
|
- Sandbox dangerous execution paths whenever possible.
|
|
299
296
|
|
|
@@ -332,7 +329,6 @@ Never:
|
|
|
332
329
|
- Assume undocumented behavior
|
|
333
330
|
- Overengineer simple systems
|
|
334
331
|
- Mix unrelated responsibilities
|
|
335
|
-
- Duplicate business logic
|
|
336
332
|
- Store unnecessary derived data
|
|
337
333
|
- Introduce hidden magic behavior
|
|
338
334
|
- Create tightly coupled agent systems
|
package/assets/memory/CLAUDE.md
CHANGED
|
@@ -27,8 +27,9 @@
|
|
|
27
27
|
- Respond in the user's language; write all code, comments, identifiers, and documentation in English.
|
|
28
28
|
- No emojis in responses, code, or docs. Use ASCII punctuation: "-" not the long dash, "->" not the arrow. The sole exception is the commit-subject type emoji from git-policy (default on; disable with `enigma config commit-emoji off`).
|
|
29
29
|
- Treat all external input as untrusted; never expose secrets or hardcode credentials.
|
|
30
|
-
-
|
|
30
|
+
- Remediating leaked data the user asked to delete: the commit/PR/branch must NOT name the values or flag the security motive (that signposts where to look and re-leaks them permanently) - neutral, mundane message, `🔒 security` type forbidden; offer history-rewrite vs. discreet-removal first. ONLY that case; every other commit stays normal and descriptive (see git-policy).
|
|
31
31
|
- A value you cannot source is not a value you may write. An email, a version, an id, a URL, a price, a name, a field of an API - if it did not come from the user, the code, a command you ran, or a document you read, you do not have it: ask for it, or leave it out and say which. A well-formed guess is the dangerous kind, because it reads as fact and nobody re-checks it. Fixture and mock data is the exception, and it has to look like fixture data.
|
|
32
|
+
- The mirror rule: a value you WERE given is permission to use it, never to publish it - a domain, host, IP, a path with your OS account name, or an email ships as a placeholder unless the user asked for that exact value.
|
|
32
33
|
- Reuse existing code before writing new code; do not duplicate logic.
|
|
33
34
|
- End files with exactly one trailing newline and no trailing whitespace.
|
|
34
35
|
- When editing existing code, match its established style instead of imposing a different one.
|
|
@@ -290,10 +291,6 @@ When documentation is unclear:
|
|
|
290
291
|
|
|
291
292
|
# Security Rules
|
|
292
293
|
|
|
293
|
-
- Treat all external input as untrusted.
|
|
294
|
-
- Never expose secrets.
|
|
295
|
-
- Never hardcode credentials.
|
|
296
|
-
- Validate all tool inputs.
|
|
297
294
|
- Restrict permissions using least privilege principles.
|
|
298
295
|
- Sandbox dangerous execution paths whenever possible.
|
|
299
296
|
|
|
@@ -332,7 +329,6 @@ Never:
|
|
|
332
329
|
- Assume undocumented behavior
|
|
333
330
|
- Overengineer simple systems
|
|
334
331
|
- Mix unrelated responsibilities
|
|
335
|
-
- Duplicate business logic
|
|
336
332
|
- Store unnecessary derived data
|
|
337
333
|
- Introduce hidden magic behavior
|
|
338
334
|
- Create tightly coupled agent systems
|
|
@@ -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.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
8
8
|
"sha": "3beb0383a9cb0331ef8a579308a2517d24d57a8ba33751ad17d16d0a4f66e344"
|
|
9
9
|
}
|
|
@@ -27,7 +27,7 @@ Before declaring a change complete, verify:
|
|
|
27
27
|
1. The change does exactly what was asked - no more, no less.
|
|
28
28
|
2. The full diff was re-read; no debug code, stray logs, commented-out blocks, or TODOs left behind.
|
|
29
29
|
3. Only relevant files are touched; unrelated changes are removed.
|
|
30
|
-
4. No secrets, credentials, or sensitive data are included.
|
|
30
|
+
4. No secrets, credentials, or sensitive data are included - and no operator-environment values either (deployment domains and URLs, host names, IPs, absolute local paths with the OS username, personal emails), in the code, docs, fixtures, commit message, or PR text (per security-policy and git-policy).
|
|
31
31
|
5. Existing patterns, naming, and structure are followed (per core-engineering-policy).
|
|
32
32
|
6. Tests exist and pass for the changed behavior (per testing-policy).
|
|
33
33
|
7. The change covers the whole class the request implied, not only the example the user named (per core-engineering-policy's Generalization Rule) - or states which siblings were deliberately left and why.
|
|
@@ -38,7 +38,7 @@ Before declaring a change complete, verify:
|
|
|
38
38
|
|
|
39
39
|
Evaluate every change across these dimensions, in priority order:
|
|
40
40
|
|
|
41
|
-
1. Security: untrusted input, injection, authz/authn, secret exposure, least privilege.
|
|
41
|
+
1. Security: untrusted input, injection, authz/authn, secret and operator-environment exposure, least privilege.
|
|
42
42
|
2. Correctness: logic, edge cases, error/failure paths, concurrency, off-by-one, null handling.
|
|
43
43
|
3. Data integrity: transactions, consistency, and the database-expert rules when persistence is involved.
|
|
44
44
|
4. Reuse & architecture: duplication, single responsibility, fit with existing modules.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "code-review-policy",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Pre-delivery self-review gate, prioritized review dimensions, and change-quality criteria.",
|
|
6
|
-
"updated": "2026-08-
|
|
7
|
-
"cliVersion": "1.36.
|
|
8
|
-
"sha": "
|
|
6
|
+
"updated": "2026-08-19T12:37:59+02:00",
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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-08-13T18:04:26+02:00",
|
|
7
|
-
"cliVersion": "1.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
8
8
|
"sha": "837f62ef43fa4ab46e7e74bb88dc6cb83e877f039565a80696e05345e28eb20d"
|
|
9
9
|
}
|
|
@@ -128,6 +128,42 @@ When the user asks for a human co-author, the trailer is `Co-authored-by: Name <
|
|
|
128
128
|
|
|
129
129
|
---
|
|
130
130
|
|
|
131
|
+
## Public Surface Hygiene (Never Publish the Operator's Environment)
|
|
132
|
+
|
|
133
|
+
A commit message, a branch name, a PR title, body, or comment, and a reviewer note are
|
|
134
|
+
permanent, public, and indexed. Treat everything you write there - and everything the diff
|
|
135
|
+
itself carries - as readable by anyone, forever.
|
|
136
|
+
|
|
137
|
+
Unless the user explicitly asked for that exact value to be published, none of this belongs
|
|
138
|
+
in a commit, branch, PR, or the code and docs the change adds:
|
|
139
|
+
|
|
140
|
+
- Deployment domains, subdomains, URLs, host names, server IPs, ports, or the name of the
|
|
141
|
+
machine something runs on.
|
|
142
|
+
- Absolute local paths that expose an account or a machine (`C:\Users\<name>\...`,
|
|
143
|
+
`/home/<name>/...`, `/Users/<name>/...`), the OS username, or the machine name.
|
|
144
|
+
- Personal or internal email addresses, account handles, customer or company names, and
|
|
145
|
+
content from private trackers.
|
|
146
|
+
- Internal infrastructure detail a reviewer does not need: how the operator reaches
|
|
147
|
+
production, what is installed on their laptop, which host holds the live data.
|
|
148
|
+
|
|
149
|
+
Where the value came from does not matter. A URL the user pasted so you could fix a bug, a
|
|
150
|
+
path printed by a command you ran, a hostname read from a local `.env` - being given it is
|
|
151
|
+
permission to USE it, never permission to publish it.
|
|
152
|
+
|
|
153
|
+
Write a placeholder instead (`example.com`, `your-domain.tld`, `<project-root>`, `$HOME`), a
|
|
154
|
+
relative path, or the name of the config key that holds the value rather than its contents.
|
|
155
|
+
Keep explanations generic: "not reproducible in this environment" instead of naming the
|
|
156
|
+
operator's host and how it is reached. When the real value is genuinely required and was not
|
|
157
|
+
given to you, ask for it.
|
|
158
|
+
|
|
159
|
+
Before committing and before opening a PR, re-read the message, the branch name, and the
|
|
160
|
+
diff for these classes specifically. Catching it here costs one edit; catching it after a
|
|
161
|
+
push costs the remediation below. The `sec-operator-env-leak` guardrail blocks the one form
|
|
162
|
+
of this that has an exact signature (this machine's own home directory reaching a tracked
|
|
163
|
+
file); everything else on the list is yours to catch.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
131
167
|
## Removing Leaked or Sensitive Data (Discreet-Commit Carve-Out)
|
|
132
168
|
|
|
133
169
|
Applies ONLY when remediating sensitive data the user wants removed from a repository - a
|
|
@@ -261,4 +297,5 @@ Before creating a commit or PR:
|
|
|
261
297
|
- Verify only relevant files are included
|
|
262
298
|
- Ensure no debug or temporary code is committed
|
|
263
299
|
- Ensure no secrets or sensitive data are included
|
|
300
|
+
- Ensure no operator-environment values leaked in (deployment domains, host names, IPs, absolute local paths with the OS username, personal emails) - in the diff, the message, the branch name, and the PR text
|
|
264
301
|
- Ensure the change aligns with repository architecture
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "git-policy",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Git & contribution policy (senior engineering standards).",
|
|
6
|
-
"updated": "2026-08-
|
|
7
|
-
"cliVersion": "1.36.
|
|
8
|
-
"sha": "
|
|
6
|
+
"updated": "2026-08-19T12:37:59+02:00",
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
8
|
+
"sha": "a29889e7c0ac872f39b03d2f17a5b52d503a26eb1a9b5f4d8e369fa79fef432e"
|
|
9
9
|
}
|
|
@@ -24,6 +24,13 @@ description: Application and AI-agent security - secrets management, authenticat
|
|
|
24
24
|
- Assume any secret that touches the repo, a log, or an error message is compromised and must be rotated.
|
|
25
25
|
- Scope secrets to the narrowest environment and lifetime possible; prefer short-lived, rotatable credentials over long-lived static ones.
|
|
26
26
|
|
|
27
|
+
### The Operator's Environment Is Sensitive By Default
|
|
28
|
+
|
|
29
|
+
- Deployment domains and URLs, host names, server IPs and ports, absolute local paths carrying an OS username, machine names, and personal or internal email addresses are not secrets in the cryptographic sense, but publishing them hands an attacker the target list and the operator's identity. Treat them as sensitive by default.
|
|
30
|
+
- Being given one of these values to work with is not permission to write it into source, comments, docs, tests, fixtures, error strings, telemetry, commit messages, or PR text. Read it from configuration and ship a placeholder; the real value stays in the local gitignored config that already holds it.
|
|
31
|
+
- Never echo an absolute path from the developer machine into anything the product emits - logs, user-facing error messages, generated docs, or committed snapshots and fixtures. Log a project-relative path.
|
|
32
|
+
- Publish a real value only when the user explicitly asks for that value to be published. If one is genuinely required and you were not given it, ask.
|
|
33
|
+
|
|
27
34
|
---
|
|
28
35
|
|
|
29
36
|
## Authentication & Authorization
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "security-policy",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
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
|
-
"updated": "2026-08-
|
|
7
|
-
"cliVersion": "1.36.
|
|
8
|
-
"sha": "
|
|
6
|
+
"updated": "2026-08-19T12:37:59+02:00",
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
8
8
|
"sha": "4c2197954135dd3375f32d839238b82a95c0e93e976ddf5a9cbc4a0cf0146e97"
|
|
9
9
|
}
|
|
@@ -59,6 +59,11 @@ microcopy - the reader shouldn't have to study it.
|
|
|
59
59
|
- Errors say what went wrong and how to fix it, in the interface's voice - never vague,
|
|
60
60
|
never an apology, never a raw stack trace or internal error to the user.
|
|
61
61
|
- Be realistic, not aspirational: describe what it actually does today, not the roadmap.
|
|
62
|
+
- Examples use placeholders, never the operator's real environment: `example.com`,
|
|
63
|
+
`your-domain.tld`, `<project-root>`, `user@example.com`, a relative path. A domain, host,
|
|
64
|
+
IP, or `C:\Users\<name>\...` path that reached you through the chat or a local file does
|
|
65
|
+
not belong in a README, a code sample, a comment, or a UI string unless the user asked for
|
|
66
|
+
that exact value (security-policy, git-policy).
|
|
62
67
|
- READMEs: assume a competent reader. Explain what is non-obvious or load-bearing (how to
|
|
63
68
|
run it, the one surprising constraint, why a choice was made) and skip what the audience
|
|
64
69
|
already knows or can infer from the code. Lead with the point; cut the throat-clearing.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "technical-writing-policy",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
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
|
-
"updated": "2026-
|
|
7
|
-
"cliVersion": "1.36.
|
|
8
|
-
"sha": "
|
|
6
|
+
"updated": "2026-08-19T12:37:59+02:00",
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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.36.
|
|
7
|
+
"cliVersion": "1.36.2",
|
|
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": "63639eab4e20ed88ac207065b1652c0743bfeaf4fb3c083f04df5550bf4f8102",
|
|
3
|
+
"enigma-linux-arm64": "27953a3e887ff7f7a430e6082c22a755a18d6af426096d6c9a47e5c19190e156",
|
|
4
|
+
"enigma-linux-x64": "55f874909e16042c9ef7a3a4406231d6dc735e0e1ff59d00270e1e14acc18ca3",
|
|
5
|
+
"enigma-win32-x64.exe": "ca7cd394fbd15402f098ae86d25738b1a0aefd5c110404442da10cef48770d68"
|
|
6
6
|
}
|
package/dist/guardrails.js
CHANGED
|
@@ -1061,6 +1061,13 @@ var BUILTIN_RULES = [
|
|
|
1061
1061
|
// distinct complete value, no re-fire after a failure, no auto-retry on 429) are behaviour a
|
|
1062
1062
|
// regex cannot read at all. It stays in frontend-policy's auth section, with the attempt-cap
|
|
1063
1063
|
// half in security-policy.
|
|
1064
|
+
// NOTE: sec-operator-env-leak covers the operator's HOME PATH and nothing else, though the
|
|
1065
|
+
// policy it serves also names deployment domains, host names, server IPs and internal email
|
|
1066
|
+
// addresses. Those have no exact signature: the domain a project deploys to is legitimately
|
|
1067
|
+
// in its own code, and a rule keyed on "a URL that is not example.com" would flag most of
|
|
1068
|
+
// every codebase. The home path is different - the string can be compared against the actual
|
|
1069
|
+
// machine, so the check is exact rather than heuristic. The rest stays in security-policy and
|
|
1070
|
+
// git-policy, where a reader can weigh it.
|
|
1064
1071
|
// NOTE: there is deliberately no "card inside a card" or "border with no information"
|
|
1065
1072
|
// rule, even though both are named in frontend-policy. They are RELATIONAL defects: a
|
|
1066
1073
|
// container is redundant only relative to the ancestor it sits in and the spacing around
|
|
@@ -1602,6 +1609,40 @@ var BUILTIN_RULES = [
|
|
|
1602
1609
|
message: "Credential endpoint with no rate limiting. Login, registration, password reset and every 2FA/OTP verification are guessing surfaces: limit them BY IP (blunt, stops the broad sweep) AND BY ACCOUNT or identifier (stops the slow distributed attack the IP limit misses), count failures rather than requests, back off exponentially, and answer 429 with Retry-After. Keep the accounting server-side and identical for an unknown account, so the limiter itself does not become an account-existence oracle. If the limit is enforced upstream (gateway, middleware, WAF), note it in the file with an `enigma:allow-unlimited-auth` marker (security-policy, backend-policy).",
|
|
1603
1610
|
severity: "block",
|
|
1604
1611
|
skill: "security-policy"
|
|
1612
|
+
},
|
|
1613
|
+
{
|
|
1614
|
+
id: "sec-operator-env-leak",
|
|
1615
|
+
label: "Do not publish the operator's own environment",
|
|
1616
|
+
// Every text file a change touches: the leak lands in source and comments, but just as
|
|
1617
|
+
// often in a README, a snapshot, a config, or a log somebody committed by accident.
|
|
1618
|
+
files: ["**"],
|
|
1619
|
+
excludeFiles: [
|
|
1620
|
+
"**/node_modules/**",
|
|
1621
|
+
"**/dist/**",
|
|
1622
|
+
"**/build/**",
|
|
1623
|
+
"**/vendor/**",
|
|
1624
|
+
"**/.next/**",
|
|
1625
|
+
"node_modules/**",
|
|
1626
|
+
"dist/**",
|
|
1627
|
+
"build/**",
|
|
1628
|
+
"vendor/**",
|
|
1629
|
+
"*.lock",
|
|
1630
|
+
"*.lockb",
|
|
1631
|
+
"package-lock.json",
|
|
1632
|
+
"*.min.js",
|
|
1633
|
+
"*.map"
|
|
1634
|
+
],
|
|
1635
|
+
scope: "file",
|
|
1636
|
+
// DIFF stage, for the reason the stage exists: a machine's own paths are all over the
|
|
1637
|
+
// logs and scratch files a long-lived repository already carries, and a rule that
|
|
1638
|
+
// reports those on an unrelated edit gets switched off within a day. Here it can only
|
|
1639
|
+
// fire on a line the current change ADDED - which is exactly the moment to catch it,
|
|
1640
|
+
// because after the push the value is in the history for good.
|
|
1641
|
+
stage: "diff",
|
|
1642
|
+
fileCheck: "sec-operator-env-leak",
|
|
1643
|
+
message: "This line carries THIS machine's home directory into a tracked file. A path with the OS account name in it publishes who you are and how your machine is laid out, and a commit keeps it forever - the same class as a deployment domain, a host name, a server IP or an internal email address, none of which belong in code, comments, docs, examples, fixtures, or a committed log. Write a placeholder (`<project-root>`, `$HOME`, `%USERPROFILE%`) or a repository-relative path, and keep the real value in the local gitignored config that already holds it. Being handed a path or a URL to work with is permission to USE it, never permission to publish it - only an explicit request to put that value in the file is (security-policy, git-policy).",
|
|
1644
|
+
severity: "block",
|
|
1645
|
+
skill: "security-policy"
|
|
1605
1646
|
}
|
|
1606
1647
|
];
|
|
1607
1648
|
var PROJECT_CHECKS = {
|
|
@@ -1624,7 +1665,8 @@ var FILE_CHECKS = {
|
|
|
1624
1665
|
"fe-page-await-no-boundary": (content, file) => pageAwaitWithoutBoundary(content, file),
|
|
1625
1666
|
"ts-import-extension": (content, file) => extensionImports(content, file),
|
|
1626
1667
|
"ts-alias-deep-relative": (content, file) => deepRelativeImports(content, file),
|
|
1627
|
-
"ts-alias-paths": (content, file) => missingPathAlias(content, file)
|
|
1668
|
+
"ts-alias-paths": (content, file) => missingPathAlias(content, file),
|
|
1669
|
+
"sec-operator-env-leak": (content) => operatorHomePathLeak(content)
|
|
1628
1670
|
};
|
|
1629
1671
|
var FIXERS = {
|
|
1630
1672
|
"fe-name-input-capitalize": (line, file) => {
|
|
@@ -1983,6 +2025,29 @@ function missingPathAlias(content, file) {
|
|
|
1983
2025
|
return [{ line: anchor === -1 ? 1 : anchor + 1, detail: `no alias for ./${src}` }];
|
|
1984
2026
|
}
|
|
1985
2027
|
var NAMED_IMPORT = /^import[ \t]+(?:[\w$]+[ \t]*,[ \t]*)?(?:type[ \t]+)?\{([^}]*)\}[ \t]*from[ \t]*["']([^"']+)["'].*$/gm;
|
|
2028
|
+
var GENERIC_ACCOUNTS = /* @__PURE__ */ new Set(["runner", "root", "ubuntu", "debian", "vagrant", "node", "user", "users", "developer", "ec2-user", "codespace", "gitpod", "jenkins", "circleci", "travis", "docker", "app"]);
|
|
2029
|
+
function operatorHomePathLeak(content) {
|
|
2030
|
+
const home = homedir();
|
|
2031
|
+
if (!home || home.length < 6) return [];
|
|
2032
|
+
const account = home.replace(/[\\/]+$/, "").split(/[\\/]/).pop() || "";
|
|
2033
|
+
if (!account || GENERIC_ACCOUNTS.has(account.toLowerCase())) return [];
|
|
2034
|
+
const forms = [home];
|
|
2035
|
+
const drive = /^([A-Za-z]):[\\/](.*)$/.exec(home);
|
|
2036
|
+
if (drive) forms.push(`/${drive[1].toLowerCase()}/${drive[2]}`);
|
|
2037
|
+
const alt = forms.map((f) => f.split(/[\\/]/).map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("[\\\\/]")).join("|");
|
|
2038
|
+
let re;
|
|
2039
|
+
try {
|
|
2040
|
+
re = new RegExp(`(?:${alt})(?![A-Za-z0-9_-]|\\.[A-Za-z0-9_-])`, "i");
|
|
2041
|
+
} catch {
|
|
2042
|
+
return [];
|
|
2043
|
+
}
|
|
2044
|
+
const out = [];
|
|
2045
|
+
const lines = content.split("\n");
|
|
2046
|
+
for (let i = 0; i < lines.length; i++) {
|
|
2047
|
+
if (re.test(lines[i])) out.push({ line: i + 1, detail: "the path resolves to this machine's home directory" });
|
|
2048
|
+
}
|
|
2049
|
+
return out;
|
|
2050
|
+
}
|
|
1986
2051
|
var INTERNAL_MODULE = /^\.|^#|^[@~]\//;
|
|
1987
2052
|
function wideNamedImports(content, max) {
|
|
1988
2053
|
const per = /* @__PURE__ */ new Map();
|
|
@@ -2392,6 +2457,7 @@ export {
|
|
|
2392
2457
|
loadRules,
|
|
2393
2458
|
missingPathAlias,
|
|
2394
2459
|
missingWindowsHide,
|
|
2460
|
+
operatorHomePathLeak,
|
|
2395
2461
|
pageAwaitWithoutBoundary,
|
|
2396
2462
|
readLedger,
|
|
2397
2463
|
readReplyLedger,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "enigma-cli",
|
|
3
|
-
"version": "1.36.
|
|
3
|
+
"version": "1.36.2",
|
|
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": {
|