enigma-cli 1.59.0 → 1.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/assets/commands/handoff.md +48 -0
  2. package/assets/mods/enigma-relay/.claude-plugin/plugin.json +1 -0
  3. package/assets/mods/enigma-relay/hooks/hooks.json +1 -0
  4. package/assets/mods/enigma-relay/hooks/register.ts +86 -0
  5. package/assets/mods/enigma-relay/tests/relay.test.ts +65 -0
  6. package/assets/skills/anti-overengineering-policy/skill.json +1 -1
  7. package/assets/skills/anti-overengineering-review/skill.json +1 -1
  8. package/assets/skills/backend-policy/skill.json +1 -1
  9. package/assets/skills/ciphera-style-policy/skill.json +1 -1
  10. package/assets/skills/code-review-policy/skill.json +1 -1
  11. package/assets/skills/core-engineering-policy/skill.json +1 -1
  12. package/assets/skills/database-expert/skill.json +1 -1
  13. package/assets/skills/debugging-policy/skill.json +1 -1
  14. package/assets/skills/dependency-policy/skill.json +1 -1
  15. package/assets/skills/email-policy/skill.json +1 -1
  16. package/assets/skills/frontend-design/skill.json +1 -1
  17. package/assets/skills/frontend-policy/skill.json +1 -1
  18. package/assets/skills/git-policy/skill.json +1 -1
  19. package/assets/skills/logo-sourcing-policy/skill.json +1 -1
  20. package/assets/skills/security-policy/skill.json +1 -1
  21. package/assets/skills/skill-creator/skill.json +1 -1
  22. package/assets/skills/task-completion-policy/skill.json +1 -1
  23. package/assets/skills/technical-writing-policy/skill.json +1 -1
  24. package/assets/skills/testing-policy/skill.json +1 -1
  25. package/assets/skills/validation-policy/skill.json +1 -1
  26. package/bin/checksums.json +4 -4
  27. package/dist/ci-watch.js +2 -0
  28. package/dist/codegraph-hook.js +576 -48
  29. package/dist/post-edit.js +576 -48
  30. package/package.json +1 -1
@@ -0,0 +1,48 @@
1
+ ---
2
+ description: Hand the current work to a fresh session - write a one-page handoff (goal, state, next step, how to verify) so the context can be cleared without losing anything, and the next session continues from it on its own. Use before /clear, when the conversation has grown long, or when switching to an unrelated task.
3
+ argument-hint: [what the next session should focus on]
4
+ ---
5
+
6
+ # /handoff
7
+
8
+ Write the handoff for this project so the context can be cleared. Extra direction from the user: **$ARGUMENTS**
9
+
10
+ Every model call re-reads the whole conversation, so a long one costs more on every step. A handoff carries the work across a `/clear` (or `/new`) at a fraction of the size: the next session in this project receives it once, at start, and continues from it without being asked - unless that session opens on a different request, in which case it does that instead and just mentions the handoff is kept.
11
+
12
+ ## Write it
13
+
14
+ Save it with `enigma handoff save`, the page on stdin:
15
+
16
+ ```bash
17
+ enigma handoff save <<'EOF'
18
+ # <the goal, one line>
19
+
20
+ ## Done
21
+ - <what is finished and verified, with file:line or commit where it helps>
22
+
23
+ ## Next
24
+ 1. <the very next action, concrete enough to start without re-reading anything>
25
+ 2. <then>
26
+
27
+ ## Decisions
28
+ - <a choice already made and why, so the next session does not reopen it>
29
+
30
+ ## Verify
31
+ - <the commands that prove it works>
32
+
33
+ ## Files
34
+ - <the files that matter, and what each is for>
35
+ EOF
36
+ ```
37
+
38
+ Rules for the page:
39
+
40
+ - It is everything the next session gets. Name exact paths, symbols, commands and the user's own requirements; do not paste transcript, diffs or file contents - the next session can open files.
41
+ - Keep it to one page (the store refuses over 32 KB).
42
+ - Unfinished or unverified items go under Next, never under Done.
43
+ - If the work is finished and nothing is left to resume, add the line `STATUS: done`; it is then kept but not delivered.
44
+ - If the user named a different next task, the handoff is for that task: put it as the goal and keep only what it needs from this one.
45
+
46
+ ## Then
47
+
48
+ Tell the user in one line that the handoff is saved and that `/clear` (Kimi, Codex, OpenCode: `/new` or `/clear`) starts the next session from it. In Claude Code with `enigma config relay on`, enigma clears and continues on its own, so say nothing about clearing there.
@@ -0,0 +1 @@
1
+ { "name": "enigma-relay", "version": "0.1.0", "description": "Hands a long Claude Code session to a fresh context: handoff, /clear, continue.", "author": { "name": "enigma" } }
@@ -0,0 +1 @@
1
+ { "modules": ["./register.ts"] }
@@ -0,0 +1,86 @@
1
+ // Generated by enigma (relay). Do not edit; set with 'enigma config relay' and 'enigma config relay-at'.
2
+ //
3
+ // When a turn ends with the context past RELAY_AT tokens, ask the agent for a handoff
4
+ // (`enigma handoff save`); when the next turn ends with a fresh one saved for this project, run
5
+ // /clear and continue the work from it in the cleared session. Nothing is cleared without a saved
6
+ // handoff, and a handoff marked "STATUS: done" ends the relay instead of continuing it. When a
7
+ // relay keeps the context (nothing saved, or the work is done), it is not asked again until the
8
+ // context has grown by another half of RELAY_AT.
9
+ import type { EngineInterface, Register } from "claude-code";
10
+
11
+ const RELAY_AT = 300000;
12
+ const LATEST = "/home/user/.enigma/handoff/latest.json";
13
+ /** Relays one session may make: a runaway loop stops instead of clearing forever. */
14
+ const MAX_RELAYS = 20;
15
+
16
+ interface Latest { root: string; savedAt: number; done: boolean; text: string; meta: string; consumedAt: number | null; }
17
+
18
+ const ASK = [
19
+ "[enigma relay] This conversation is past %TOKENS% tokens and every call re-reads all of it.",
20
+ "Run the /handoff procedure now: save the handoff for the work in progress with `enigma handoff save`",
21
+ "(goal, done, next, decisions, verify, files), then stop. If the work is finished, save it with the line",
22
+ "`STATUS: done`. enigma clears the context and continues from the handoff on its own.",
23
+ ].join(" ");
24
+
25
+ const under = (cwd: string, root: string): boolean => {
26
+ const norm = (p: string): string => p.split("\\").join("/").replace(/\/+$/, "").toLowerCase();
27
+ const c = norm(cwd);
28
+ const r = norm(root);
29
+ return c === r || c.startsWith(`${r}/`);
30
+ };
31
+
32
+ /** The newest handoff save, from the pointer `enigma handoff save` writes. */
33
+ async function latest($: EngineInterface): Promise<Latest | null> {
34
+ try { return JSON.parse(await $.fs.read(LATEST)) as Latest; } catch { return null; }
35
+ }
36
+
37
+ export const register: Register = (on) => {
38
+ let askedAt = 0;
39
+ let relays = 0;
40
+ let nextAt = RELAY_AT;
41
+
42
+ on("turn.complete", async ($, e, next) => {
43
+ const result = await next(e);
44
+ // The main loop only: a subagent's turns and interrupted ones are not a point to relay at.
45
+ if (e.agentId !== undefined || e.reason !== "answer" || relays >= MAX_RELAYS) return result;
46
+
47
+ if (askedAt) {
48
+ const asked = askedAt;
49
+ askedAt = 0;
50
+ const saved = await latest($);
51
+ const cwd = await $.session.cwd();
52
+ const kept = async (): Promise<void> => { nextAt = ((await $.session.usage()).context.tokens ?? 0) + Math.round(RELAY_AT / 2); };
53
+ if (!saved || saved.savedAt < asked || !under(cwd, saved.root)) {
54
+ await kept();
55
+ $.ui.toast("enigma relay: no handoff was saved, so the context was kept.");
56
+ return result;
57
+ }
58
+ if (saved.done) {
59
+ await kept();
60
+ $.ui.toast("enigma relay: the work is finished; the context was kept for questions about it.");
61
+ return result;
62
+ }
63
+ relays++;
64
+ nextAt = RELAY_AT;
65
+ void (async () => {
66
+ await $.command.run({ command: "clear" });
67
+ // The session-start hook delivers the handoff after /clear and marks it consumed; when it
68
+ // did not (hook off, another host), the page goes in the prompt itself.
69
+ let delivered = false;
70
+ try { delivered = (JSON.parse(await $.fs.read(saved.meta)) as Latest).consumedAt != null; } catch { /* unreadable: send it */ }
71
+ let page = "";
72
+ if (!delivered) { try { page = `\n\n${await $.fs.read(saved.text)}`; } catch { /* nothing to add */ } }
73
+ await $.prompt.submit({ text: `[enigma relay] The context was cleared to save tokens. Continue the work from the handoff now, starting at its next step.${page}` });
74
+ })();
75
+ return result;
76
+ }
77
+
78
+ const { context } = await $.session.usage();
79
+ // Back under the threshold (a manual /clear, a compaction): the next crossing asks again.
80
+ if ((context.tokens ?? 0) < RELAY_AT) nextAt = RELAY_AT;
81
+ if ((context.tokens ?? 0) < nextAt) return result;
82
+ askedAt = Date.now();
83
+ void $.prompt.submit({ text: ASK.replace("%TOKENS%", String(Math.round((context.tokens ?? 0) / 1000) * 1000)) });
84
+ return result;
85
+ });
86
+ };
@@ -0,0 +1,65 @@
1
+ import { describe, expect, test } from "claude-code/testing";
2
+
3
+ const CWD = "/work/repo/pkg";
4
+ const turn = { answer: "", text: "", durationMs: 1, isAborted: false, turnId: "t", reason: "answer" as const, category: null, explanation: null };
5
+
6
+ /** Wires the engine's side of every call the relay makes, recording what it asked for. */
7
+ function engine(on: Parameters<Parameters<typeof test>[1] & ((...a: never[]) => unknown)>[1], opts: { tokens: number; latest: () => string | null; }) {
8
+ const seen = { prompts: [] as string[], commands: [] as string[], toasts: [] as string[] };
9
+ let settle: () => void = () => {};
10
+ const submitted = new Promise<void>((r) => { settle = r; });
11
+ on("turn.complete", () => ({ text: "" }));
12
+ on("session.usage", () => ({ value: { startedAt: 0, context: { tokens: opts.tokens, window: 1_000_000, percent: Math.round(opts.tokens / 10_000) }, rateLimits: {}, cost: { totalUsd: 0 } } }) as never);
13
+ on("session.cwd", () => ({ value: CWD }) as never);
14
+ on("fs.read", ($, e) => {
15
+ const path = (e as { path: string; }).path;
16
+ if (path.endsWith("latest.json")) { const v = opts.latest(); return (v === null ? { deny: "ENOENT" } : { value: v }) as never; }
17
+ if (path.endsWith(".json")) return { value: JSON.stringify({ consumedAt: null }) } as never;
18
+ return { value: "# goal\n\n## Next\n1. finish" } as never;
19
+ });
20
+ on("prompt.submit", ($, e) => { seen.prompts.push((e as { text: string; }).text); settle(); return { text: (e as { text: string; }).text } as never; });
21
+ on("command.run", ($, e) => { seen.commands.push((e as { command: string; }).command); return { value: { text: "" } } as never; });
22
+ on("ui.toast", ($, e) => { seen.toasts.push(String((e as { text?: string; }).text ?? e)); return { value: undefined } as never; });
23
+ return { seen, submitted };
24
+ }
25
+
26
+ describe("enigma relay", () => {
27
+ test("stays quiet under the threshold", async ($, on) => {
28
+ const { seen } = engine(on, { tokens: 10_000, latest: () => null });
29
+ await $.turn.complete(turn);
30
+ expect(seen.prompts.length).toBe(0);
31
+ });
32
+
33
+ test("asks for a handoff past the threshold, then clears and continues once it is saved", async ($, on) => {
34
+ let saved: string | null = null;
35
+ const { seen, submitted } = engine(on, { tokens: 400_000, latest: () => saved });
36
+ await $.turn.complete(turn);
37
+ await submitted;
38
+ expect(seen.prompts[0]).toContain("/handoff");
39
+ saved = JSON.stringify({ root: "/work/repo", savedAt: Date.now() + 1000, done: false, text: "/h/x.md", meta: "/h/x.json", consumedAt: null });
40
+ await $.turn.complete(turn);
41
+ for (let i = 0; i < 50 && seen.prompts.length < 2; i++) await new Promise((r) => setTimeout(r, 10));
42
+ expect(seen.commands).toEqual(["clear"]);
43
+ expect(seen.prompts[1]).toContain("Continue the work from the handoff");
44
+ expect(seen.prompts[1]).toContain("## Next");
45
+ });
46
+
47
+ test("never clears without a saved handoff", async ($, on) => {
48
+ const { seen, submitted } = engine(on, { tokens: 400_000, latest: () => null });
49
+ await $.turn.complete(turn);
50
+ await submitted;
51
+ await $.turn.complete(turn);
52
+ expect(seen.commands).toEqual([]);
53
+ });
54
+
55
+ test("does not ask again at the same size after a turn that saved nothing", async ($, on) => {
56
+ const { seen, submitted } = engine(on, { tokens: 400_000, latest: () => null });
57
+ await $.turn.complete(turn);
58
+ await submitted;
59
+ await $.turn.complete(turn);
60
+ await $.turn.complete(turn);
61
+ await new Promise((r) => setTimeout(r, 20));
62
+ expect(seen.prompts.length).toBe(1);
63
+ expect(seen.commands).toEqual([]);
64
+ });
65
+ });
@@ -7,6 +7,6 @@
7
7
  "minimalCode"
8
8
  ],
9
9
  "updated": "2026-07-17T00:17:02+02:00",
10
- "cliVersion": "1.59.0",
10
+ "cliVersion": "1.60.0",
11
11
  "sha": "3f0dcc28341bb0407860534f7ce9314cfc91b5e673f8f3d13b89d61851ed75f6"
12
12
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "On-demand over-engineering review - diff review, whole-repo audit, and enigma: debt-marker ledger (tags delete/stdlib/native/yagni/shrink, line/dep scoring); lists cuts, applies nothing.",
6
6
  "updated": "2026-06-16T11:24:30+02:00",
7
- "cliVersion": "1.59.0",
7
+ "cliVersion": "1.60.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.59.0",
7
+ "cliVersion": "1.60.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.59.0",
7
+ "cliVersion": "1.60.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.59.0",
7
+ "cliVersion": "1.60.0",
8
8
  "sha": "6b8a924cc11b61d4b45b73384aeb095ce622229359b7cc2c6ce4bb0cf3015ed7"
9
9
  }
@@ -7,6 +7,6 @@
7
7
  "codeGraph"
8
8
  ],
9
9
  "updated": "2026-08-15T20:49:24+02:00",
10
- "cliVersion": "1.59.0",
10
+ "cliVersion": "1.60.0",
11
11
  "sha": "95b7202e5659f8d9d6f11ce29e7dc5b01575ba86c78ef948bec4753ccf430155"
12
12
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Senior database architecture policy: engine selection (PostgreSQL by default, SQLite only for local-first/embedded stores), ORM selection (Prisma in TypeScript/JavaScript), query optimization, anti-duplication/normalization, scalability, and RGPD/GDPR encryption.",
6
6
  "updated": "2026-08-04T18:33:27+02:00",
7
- "cliVersion": "1.59.0",
7
+ "cliVersion": "1.60.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.59.0",
7
+ "cliVersion": "1.60.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.59.0",
7
+ "cliVersion": "1.60.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.59.0",
7
+ "cliVersion": "1.60.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.59.0",
7
+ "cliVersion": "1.60.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.59.0",
7
+ "cliVersion": "1.60.0",
8
8
  "sha": "2571746934548e64ee30348bbf29b1d971d3afa0a7b32277b137150bf8803f90"
9
9
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Git & contribution policy (senior engineering standards).",
6
6
  "updated": "2026-10-05T14:00:39+02:00",
7
- "cliVersion": "1.59.0",
7
+ "cliVersion": "1.60.0",
8
8
  "sha": "3863620f77993eff848d52da383cabb658a14a370f4a977929e60af216eb6d8d"
9
9
  }
@@ -7,6 +7,6 @@
7
7
  "logoColorPolicy"
8
8
  ],
9
9
  "updated": "2026-07-17T00:17:02+02:00",
10
- "cliVersion": "1.59.0",
10
+ "cliVersion": "1.60.0",
11
11
  "sha": "09cdbefd98625b02a7d03685e5deed128238ff8454a83fe22279610fe3ef8ddf"
12
12
  }
@@ -4,6 +4,6 @@
4
4
  "provider": "FJRG2007/enigma",
5
5
  "description": "Application and AI-agent security: secrets, authn/authz (least privilege, 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.59.0",
7
+ "cliVersion": "1.60.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.59.0",
7
+ "cliVersion": "1.60.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.59.0",
7
+ "cliVersion": "1.60.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.59.0",
7
+ "cliVersion": "1.60.0",
8
8
  "sha": "e32623f37f1bf90fa611968ca8b216e3381771254b6af7c81a953c17a8889ddb"
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-10-04T06:11:13+02:00",
7
- "cliVersion": "1.59.0",
7
+ "cliVersion": "1.60.0",
8
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.59.0",
7
+ "cliVersion": "1.60.0",
8
8
  "sha": "7b39ded6b82cb7a8424aea7b8d59a293791205d57e7272ff63d9fa558772ecb1"
9
9
  }
@@ -1,6 +1,6 @@
1
1
  {
2
- "enigma-darwin-arm64": "b016a81c010e74529d555402587bf822e22bc795fd259a28f9bee500be832c41",
3
- "enigma-linux-arm64": "e35acc9e3aff4a733ab6934e1a85ca9b4321924e9a1eed1eaba72399813402a0",
4
- "enigma-linux-x64": "ca58a5d868932cf8b2396d1f8224dd2c2e35e1d393d29d14db4bdb5c6d1485f9",
5
- "enigma-win32-x64.exe": "30b56be7260c965b8adc39a3617defb0bff88c1b6e9f4cdd081b306311c58a18"
2
+ "enigma-darwin-arm64": "f8c94da3cdb9218455ea60c64c310262b09aa4efa0ed2f6f6f78ebb2cf69747c",
3
+ "enigma-linux-arm64": "4097233ea8dbefe9a98cb5bd106e6c1310379bac526faa17a771e8c0d502b89b",
4
+ "enigma-linux-x64": "95684040db12c4966c1d760af0e94b8eb1e51136326183d1409a1cc1e9f7c43b",
5
+ "enigma-win32-x64.exe": "0350f51e5a2deff7fa561fc84bc7ba755644c1110389db26fb885f7dcc06e9d4"
6
6
  }
package/dist/ci-watch.js CHANGED
@@ -78,6 +78,8 @@ var CONFIG_DEFAULTS = {
78
78
  gateTrivialLines: 20,
79
79
  subagentLimit: 4,
80
80
  compactWindow: 4e5,
81
+ relay: true,
82
+ relayAt: 3e5,
81
83
  planSessionLimit: 0,
82
84
  planWeeklyLimit: 0,
83
85
  planWeeklySonnetLimit: 0,