@massu/core 1.14.0 → 1.15.1

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/CHANGELOG.md CHANGED
@@ -4,6 +4,40 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
+ ## [1.15.1] - 2026-07-05
8
+
9
+ **Node 26 compatibility — native-module (better-sqlite3) ABI fix + Node-major CI matrix**. Restores massu on the now-default Node 26. `@massu/core` shipped a prebuilt `better-sqlite3` binary compiled for an older `NODE_MODULE_VERSION` (ABI) and declared `engines.node` `">=20.0.0 <26.0.0"`; when Homebrew's default Node became v26 (ABI 147), the native module failed to load (`NODE_MODULE_VERSION 127 ... requires 147`), breaking BOTH the license check and the memory database in every consumer repo — `npx @massu/core@1 doctor` reported UNHEALTHY. This bumps `better-sqlite3` `^12.6.2` → `^12.11.1` (which ships prebuilt ABI-147 binaries for macOS/Linux/Alpine/Windows, so `npx` consumers with no compiler still load it) and removes the artificial `<26.0.0` engines ceiling (now `>=20.0.0`). Verified end-to-end: the full sqlite-backed suite (2710 tests) + `doctor` HEALTHY on Node 26 AND Node 22 (previously-shipped ABI 127 — no regression). Patch per semver: a compatibility fix with no API change.
10
+
11
+ ### Fixed
12
+
13
+ - **better-sqlite3 native module fails to load on Node 26 (ABI 147).** Bumped `better-sqlite3` to `^12.11.1` (prebuilt ABI-147 binaries for every consumer platform) and widened `packages/core` + `@massu/adapter-rails` + `@massu/adapter-spring` `engines.node` to `>=20.0.0` (dropped the `<26.0.0` ceiling that excluded the new default Node). `checkNativeModules()` + `checkLicenseStatus()` in `massu doctor` now pass on Node 26 (Status: HEALTHY).
14
+ - **root `npm audit` → 0 findings.** Bumped `tsx` `^4.0.0` → `^4.23.0` (built on patched esbuild `~0.28.0`) and added a root `overrides` pin `esbuild` `^0.28.1`, deduping the dev/test tree onto esbuild 0.28.1 and closing GHSA-g7r4-m6w7-qqqr (esbuild dev-server file read, Windows-only; esbuild is a build/test-only dep — never in `@massu/core` `dependencies` nor any published artifact). `npm audit fix` resolved `tar` (GHSA-vmf3-w455-68vh, file smuggling) and `vite` (GHSA-v6wh-96g9-6wx3, high). All-severity closure: `npm audit` reports zero at repo root.
15
+
16
+ ### Added
17
+
18
+ - **CI Node-major matrix + hard gate (structural drift-prevention, CR-46).** `.github/workflows/ci.yml` `native-module` job runs a better-sqlite3 load assertion + the full sqlite-backed suite on Node `20 / 22 / 24 / 26 / latest` — the `latest` leg auto-tracks the newest release, so a FUTURE Node major that breaks the native-module ABI fails CI with no manual matrix edit. Fronted by a required `Native Module Gate` status check (`.github/rulesets/main-branch.json`). The class is pinned by `node-compat-drift-guard.test.ts` (native load + no-`<`-ceiling on `engines.node` + CI-guard-wired) and the ruleset allowlist mirror (`ruleset-parser.ts` ↔ `ruleset-context-coverage.mjs`). Closes the "single-Node CI never sees a new-major ABI break" gap that let this incident ship. Incident: `docs/incidents/2026-07-05-node-26-native-module-abi.md`.
19
+
20
+ ## [1.15.0] - 2026-06-02
21
+
22
+ **Enterprise auto-learning governance + signed audit export (`plan-2026-06-01-enterprise-governance-audit-export`)**. Generalizes the Phase-3 per-rule two-operator review into an org-level governance policy enforced at the server promotion chokepoint + role-aware RLS, and adds a cryptographically-signed compliance export. Enterprise orgs (`plan='cloud_enterprise'`) can now set a promotion policy — minimum promoter role (rank-compared, never lexicographic), N-of-M distinct-approver requirement, allowed destinations, and a tighten-only hardened-review flag — that `promoted_rule_upsert` enforces before any promotion applies; a promotion below threshold is held `pending` and excluded from every seat's pull cursor until enough distinct operators (each other than the promoter) approve it. The new signed audit export streams the org's full governance history (policy, approvals, promotions, revocations) as a single Ed25519-signed FLAT envelope (records carried as a `records_json` STRING so the signature covers every record — no nested-array forgery hole), verifiable offline against the bundled public key. The `audit-export` edge function is the SOLE signer (single-signer, CR-46) for both the programmatic `ms_live_` path (admin-scoped) and the dashboard path (which calls it server-side via a service-role bearer and holds no key). Backwards-compatible additive feature — off the Enterprise path, behavior is unchanged (`approval_state` defaults to `applied`) — minor per semver.
23
+
24
+ ### Added
25
+
26
+ - **`packages/core/src/security/governance-export-verifier.ts`** — Ed25519 verifier for the signed `/audit-export` envelope; a one-line wrapper over the consolidated `verifyEd25519SignedEnvelope` core (third signed-envelope artifact, no copy-pasted crypto), NO transition mode. Bundled pubkey via `scripts/bundle-audit-export-pubkey.mjs` (+ `generate-audit-export-keypair.mjs`), wired into `prepublishOnly`.
27
+ - **`packages/core/src/rule-candidate-hardened.ts`** — `validateGovernanceGate(policy, approvals)` (generalized N-of-M gate) + `roleRank()` ladder; `validateHardenedApplyGate` now delegates as the N=2 special case (CR-10: symbol + refs + exact messages preserved).
28
+ - **`packages/core/src/auto-learning-entitlement.ts`** — `ENTERPRISE_GOVERNANCE_MIN_TIER` + `entitledForEnterpriseGovernance` (reuses the existing `tierLevel` + `PLAN_TO_TIER_MAP`; no parallel tier scheme).
29
+ - **`/massu-rule approvals`** subcommand — surfaces the org policy + pending N-of-M approval state.
30
+ - **pattern-scanner Check 37** + `governance-gate-invariant.test.ts` — the client-gate ↔ server-RPC ↔ RLS drift-guard (vitest ↔ scanner parity).
31
+ - **Website (massu_prod + massu.ai)**: migration 049 (`org_promotion_policy` + `promotion_approvals` ledger + `promoted_rules.approval_state` + the `promoted_rule_upsert` governance branch + `promotion_approval_record`/`promotion_policy_reconcile` RPCs + role-aware RLS + widened `activity_feed` CHECK), the `audit-export` Enterprise-gated Ed25519-signing edge function (CR-58 `verify_jwt=false`), and the `/dashboard/governance` admin page (policy editor + approvals + signed-export download).
32
+
33
+ ### Changed
34
+
35
+ - `promoted_rule_upsert` re-defined (CREATE OR REPLACE of the 045 body + governance branch); `/sync` recognizes the new `pending_approval` status; `/promoted-rules` excludes `approval_state='pending'` rows from the differential-pull cursor.
36
+
37
+ ### Fixed
38
+
39
+ - **loop-controller mirror drift closed** (`plan-loop-controller-mirror-drift-closure`) — reconciled the 78-line preexisting drift between the canonical `.claude/commands/massu-loop/references/loop-controller.md` and its shipped mirror `packages/core/commands/massu-loop/references/loop-controller.md`, and extended the byte-equivalence drift-guard (`auto-learning-mirror-drift-guard.test.ts`) to cover the loop-controller pair so the drift class is now structurally impossible for both command-reference mirrors. Docs-only; no API change.
40
+
7
41
  ## [1.14.0] - 2026-06-02
8
42
 
9
43
  **Curated Rule Packs — versioned, installable, actually-enforced (`plan-2026-06-01-curated-rule-packs`)**. Closes the inert-marketplace bug class: the rule-pack marketplace existed but enforced nothing — installing a pack flattened its rules into `org_rules`, which no core enforcement path ever read. Now an installed pack's rules materialize on the developer's machine as Ed25519-signed, provenance-tagged rule candidates that a human reviews and approves through `/massu-rule packs` (packs **propose**, humans **approve** — CR-39; no fake "active"/"enforced" state). Pack rules ride the existing `applyRuleCandidate()` chokepoint with the same Team-gated, signature-verified trust model as team-shared promotion (CR-54/55/57); executable destinations (`pattern-scanner`/`custom-destination`) route through the hardened two-operator review path and never auto-enforce. Ships the versioning + curation workflow (SemVer monotonicity, an immutable `rule_pack_versions` history, a `rule_pack_publish` SECURITY DEFINER RPC) the marketplace previously lacked. Backwards-compatible additive feature — new `/massu-rule packs` subcommand + `pack` provenance origin, zero breaking changes — minor per semver.
@@ -31,12 +31,21 @@ This command is a **loop controller** for implementation + verification. Your jo
31
31
 
32
32
  ### Agent Result Persistence
33
33
 
34
- All Task sub-agents MUST write their results to disk in addition to returning text:
35
- - Security review: `.massu/agent-results/{timestamp}-security.json`
36
- - Architecture review: `.massu/agent-results/{timestamp}-architecture.json`
37
- - Verification audit: `.massu/agent-results/{timestamp}-verify-{iteration}.json`
34
+ All Task sub-agents MUST write their results to disk in addition to returning text. Two naming conventions are accepted by the completion gate (CR-52 / `scripts/massu-loop-completion-gate.sh`):
38
35
 
39
- JSON format: `{ iteration, gaps_discovered, gaps_fixed, gaps_remaining, plan_items_total, plan_items_verified, findings: [] }`
36
+ **NEW convention (preferred, plan-token-namespaced)**:
37
+ - `.massu/agent-results/<plan-token>-post-impl-security-<iso>.json`
38
+ - `.massu/agent-results/<plan-token>-post-impl-architecture-<iso>.json`
39
+ - `.massu/agent-results/<plan-token>-post-impl-pattern-<iso>.json`
40
+ - `.massu/agent-results/<plan-token>-post-impl-ux-<iso>.json` (loop-playwright only)
41
+ - Verification audit: `.massu/agent-results/<plan-token>-verify-iter<iteration>-<iso>.json`
42
+
43
+ **LEGACY convention (still valid, accepted via filename + mtime ≥ loop-start)**:
44
+ - `.massu/agent-results/{timestamp}-security.json`
45
+ - `.massu/agent-results/{timestamp}-architecture.json`
46
+ - `.massu/agent-results/{timestamp}-verify-{iteration}.json`
47
+
48
+ JSON format: `{ plan_token, reviewer_type, timestamp, iteration, gaps_discovered, gaps_fixed, gaps_remaining, plan_items_total, plan_items_verified, findings: [] }`
40
49
 
41
50
  This prevents context overflow from killing verification progress. If the parent session crashes, a new session can read these files via `bash scripts/hooks/read-agent-results.sh` to resume.
42
51
 
@@ -53,8 +62,17 @@ At completion, write a completion entry.
53
62
 
54
63
  ```
55
64
  PLAN_PATH = $ARGUMENTS (the plan file path or task description)
65
+ PLAN_TOKEN = extract `**Plan Token**:` value from PLAN_PATH header (used by Phase 0.5 / 2.2)
66
+ # Interpolation contract: `${PLAN_TOKEN}` references in the snippets below are
67
+ # substituted by the agent at protocol-interpretation time (NOT shell-substituted
68
+ # inside a script). The PLAN_TOKEN value is validated by
69
+ # scripts/lib/loop-completion-helpers.sh:plan_token_strict_check before any
70
+ # script call (rejects newlines, whitespace, and degenerate tokens).
56
71
  iteration = 0
57
72
 
73
+ # Phase 0.5: Record loop-start timestamp (consumed by Phase 2.2 completion gate, CR-52)
74
+ bash -c 'source scripts/lib/loop-completion-helpers.sh && loop_start_record "${PLAN_TOKEN}"'
75
+
58
76
  # Phase 1: IMPLEMENT (do the work)
59
77
  # Read plan, extract items, implement each one with VR-* proof
60
78
 
@@ -62,17 +80,34 @@ iteration = 0
62
80
  # Spawn focused review subagents IN PARALLEL for independent analysis
63
81
  # Each reviewer has an adversarial mindset and a SINGLE focused concern (Principle #20)
64
82
  # Elegance/simplicity assessment happens in Phase 2.1 POST-BUILD REFLECTION (Q4)
83
+ #
84
+ # CR-52: Named reviewers REQUIRED (consolidated with golden-path/phase-2-implementation.md).
85
+ # Each reviewer MUST write evidence JSON to:
86
+ # .massu/agent-results/${PLAN_TOKEN}-post-impl-<reviewer-type>-<iso>.json
87
+ # before returning. The Phase 2.2 completion gate validates evidence existence.
65
88
 
66
- security_result = Task(subagent_type="general-purpose", model="opus", prompt="
89
+ security_result = Task(subagent_type="massu-security-reviewer", model="opus", prompt="
67
90
  Review implementation for plan: {PLAN_PATH}
68
91
  Focus: Security vulnerabilities, auth gaps, input validation, data exposure
69
92
  Check all new/modified files. Return structured result with SECURITY_GATE.
93
+ CR-52: Write evidence to .massu/agent-results/${PLAN_TOKEN}-post-impl-security-<iso>.json
94
+ with fields {plan_token, reviewer_type:'security', timestamp, gaps_discovered, gaps_fixed, findings:[]}
70
95
  ")
71
96
 
72
- architecture_result = Task(subagent_type="general-purpose", model="opus", prompt="
97
+ architecture_result = Task(subagent_type="massu-architecture-reviewer", model="opus", prompt="
73
98
  Review implementation for plan: {PLAN_PATH}
74
99
  Focus: Design issues, coupling problems, pattern compliance, scalability
75
100
  Check all new/modified files. Return structured result with ARCHITECTURE_GATE.
101
+ CR-52: Write evidence to .massu/agent-results/${PLAN_TOKEN}-post-impl-architecture-<iso>.json
102
+ with fields {plan_token, reviewer_type:'architecture', timestamp, gaps_discovered, gaps_fixed, findings:[]}
103
+ ")
104
+
105
+ pattern_result = Task(subagent_type="massu-pattern-reviewer", model="sonnet", prompt="
106
+ Review implementation for plan: {PLAN_PATH}
107
+ Focus: Code quality, ESM compliance, config-driven patterns, TypeScript strict mode, test coverage
108
+ Check all new/modified files. Return structured result with PATTERN_GATE.
109
+ CR-52: Write evidence to .massu/agent-results/${PLAN_TOKEN}-post-impl-pattern-<iso>.json
110
+ with fields {plan_token, reviewer_type:'pattern', timestamp, gaps_discovered, gaps_fixed, findings:[]}
76
111
  ")
77
112
 
78
113
  # Parse results and fix ALL findings at ALL severity levels (CR-45)
@@ -159,6 +194,17 @@ END WHILE
159
194
 
160
195
  # Phase 2.1: POST-BUILD REFLECTION + MANDATORY MEMORY PERSIST (CR-38)
161
196
  # See references/auto-learning.md for full protocol
197
+
198
+ # Phase 2.2: COMPLETION GATE (STRUCTURAL — CR-52)
199
+ # AFTER Phase 2.1 POST-BUILD REFLECTION completes, but BEFORE returning the
200
+ # final report. Non-zero exit BLOCKS the loop from declaring success.
201
+ bash scripts/massu-loop-completion-gate.sh "${PLAN_TOKEN}" || {
202
+ echo "BLOCKED: Phase 1.5 evidence missing for ${PLAN_TOKEN}"
203
+ echo "Spawn at least one named reviewer subagent and ensure evidence JSON is written"
204
+ echo "to .massu/agent-results/${PLAN_TOKEN}-post-impl-*.json before retrying."
205
+ echo "Bypass (audit-trail logged): MASSU_SKIP_COMPLETION_GATE=1"
206
+ exit 1
207
+ }
162
208
  ```
163
209
 
164
210
  ### Rules for the Loop Controller
@@ -175,6 +221,7 @@ END WHILE
175
221
  | **ALWAYS run multi-perspective review after implementation** | Multiple reviewers catch different issues than 1 auditor |
176
222
  | **Run review subagents IN PARALLEL** | Security and architecture reviews are independent |
177
223
  | **Fix CRITICAL/HIGH findings before verification** | Don't waste auditor passes on known issues |
224
+ | **Phase 2.2 completion gate is STRUCTURAL** | `bash scripts/massu-loop-completion-gate.sh` — non-zero exit BLOCKS mark-complete (CR-52). Silent self-attestation is replaced by evidence-file existence check. |
178
225
 
179
226
  ### Why This Architecture Exists
180
227
 
package/dist/cli.js CHANGED
@@ -12,11 +12,20 @@ var __require = /* @__PURE__ */ ((x2) => typeof require !== "undefined" ? requir
12
12
  if (typeof require !== "undefined") return require.apply(this, arguments);
13
13
  throw Error('Dynamic require of "' + x2 + '" is not supported');
14
14
  });
15
- var __esm = (fn, res) => function __init() {
16
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
15
+ var __esm = (fn, res, err) => function __init() {
16
+ if (err) throw err[0];
17
+ try {
18
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
19
+ } catch (e2) {
20
+ throw err = [e2], e2;
21
+ }
17
22
  };
18
23
  var __commonJS = (cb, mod) => function __require2() {
19
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
24
+ try {
25
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
26
+ } catch (e2) {
27
+ throw mod = 0, e2;
28
+ }
20
29
  };
21
30
  var __export = (target, all) => {
22
31
  for (var name in all)
@@ -16622,6 +16631,10 @@ var init_fileLock = __esm({
16622
16631
  this.causeCode = causeCode;
16623
16632
  this.name = "FileLockBusyError";
16624
16633
  }
16634
+ lockPath;
16635
+ holderPid;
16636
+ retryAfterSeconds;
16637
+ causeCode;
16625
16638
  };
16626
16639
  }
16627
16640
  });
@@ -16654,6 +16667,10 @@ var init_installLock = __esm({
16654
16667
  this.causeCode = causeCode;
16655
16668
  this.name = "InstallLockBusyError";
16656
16669
  }
16670
+ lockPath;
16671
+ holderPid;
16672
+ retryAfterSeconds;
16673
+ causeCode;
16657
16674
  };
16658
16675
  }
16659
16676
  });
@@ -17197,6 +17214,8 @@ var init_paths = __esm({
17197
17214
  this.cap = cap;
17198
17215
  this.name = "WatchSurfaceTooLargeError";
17199
17216
  }
17217
+ fileCount;
17218
+ cap;
17200
17219
  };
17201
17220
  }
17202
17221
  });
@@ -17312,6 +17331,8 @@ var init_state = __esm({
17312
17331
  this.daemonMax = daemonMax;
17313
17332
  this.name = "WatchStateNewerError";
17314
17333
  }
17334
+ stateVersion;
17335
+ daemonMax;
17315
17336
  };
17316
17337
  writeStateAtomicCounter = 0;
17317
17338
  }
@@ -18242,6 +18263,8 @@ var init_fetcher = __esm({
18242
18263
  this.host = host;
18243
18264
  this.name = "FetchAllowlistError";
18244
18265
  }
18266
+ url;
18267
+ host;
18245
18268
  };
18246
18269
  FetchTimeoutError = class extends Error {
18247
18270
  constructor(url, timeoutMs) {
@@ -18250,6 +18273,8 @@ var init_fetcher = __esm({
18250
18273
  this.timeoutMs = timeoutMs;
18251
18274
  this.name = "FetchTimeoutError";
18252
18275
  }
18276
+ url;
18277
+ timeoutMs;
18253
18278
  };
18254
18279
  FetchBodySizeError = class extends Error {
18255
18280
  constructor(url, maxBodyBytes) {
@@ -18260,6 +18285,8 @@ var init_fetcher = __esm({
18260
18285
  this.maxBodyBytes = maxBodyBytes;
18261
18286
  this.name = "FetchBodySizeError";
18262
18287
  }
18288
+ url;
18289
+ maxBodyBytes;
18263
18290
  };
18264
18291
  }
18265
18292
  });
@@ -12,11 +12,20 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
12
12
  if (typeof require !== "undefined") return require.apply(this, arguments);
13
13
  throw Error('Dynamic require of "' + x + '" is not supported');
14
14
  });
15
- var __esm = (fn, res) => function __init() {
16
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
15
+ var __esm = (fn, res, err) => function __init() {
16
+ if (err) throw err[0];
17
+ try {
18
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
19
+ } catch (e) {
20
+ throw err = [e], e;
21
+ }
17
22
  };
18
23
  var __commonJS = (cb, mod) => function __require2() {
19
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
24
+ try {
25
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
26
+ } catch (e) {
27
+ throw mod = 0, e;
28
+ }
20
29
  };
21
30
  var __export = (target, all) => {
22
31
  for (var name in all)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@massu/core",
3
- "version": "1.14.0",
3
+ "version": "1.15.1",
4
4
  "type": "module",
5
5
  "description": "AI Engineering Governance MCP Server - Session memory, knowledge system, feature registry, code intelligence, rule enforcement, tiered tooling (12 free / 73 total), 56 workflow commands, 11 agents, 20+ patterns",
6
6
  "main": "./dist/cli.js",
@@ -29,7 +29,7 @@
29
29
  "build:bundle-adapters": "tsx scripts/bundle-adapters.ts",
30
30
  "build:cli": "esbuild --bundle --platform=node --format=esm --outfile=dist/cli.js src/cli.ts --external:better-sqlite3 --external:yaml --external:zod --external:chokidar --external:proper-lockfile --external:fsevents --external:web-tree-sitter --external:tweetnacl --external:tar --external:smol-toml --external:vscode-languageserver-protocol --external:@massu/adapter-rails --external:@massu/adapter-spring --banner:js='#!/usr/bin/env node\nimport{createRequire as __cr}from\"module\";const require=__cr(import.meta.url);'",
31
31
  "build:hooks": "esbuild --bundle --platform=node --format=esm --outdir=dist/hooks src/hooks/*.ts --external:better-sqlite3 --external:yaml --external:zod --external:chokidar --external:proper-lockfile --external:fsevents --external:web-tree-sitter --external:tweetnacl --external:tar --external:smol-toml --external:vscode-languageserver-protocol --external:@massu/adapter-rails --external:@massu/adapter-spring --banner:js='import{createRequire as __cr}from\"module\";const require=__cr(import.meta.url);'",
32
- "prepublishOnly": "bash ../../scripts/prepublish-check.sh && node ../../scripts/bundle-pubkey.mjs && node ../../scripts/bundle-license-pubkey.mjs && node ../../scripts/bundle-promotion-pubkey.mjs && cp ../../CHANGELOG.md ./CHANGELOG.md && npm run build",
32
+ "prepublishOnly": "bash ../../scripts/prepublish-check.sh && node ../../scripts/bundle-pubkey.mjs && node ../../scripts/bundle-license-pubkey.mjs && node ../../scripts/bundle-promotion-pubkey.mjs && node ../../scripts/bundle-audit-export-pubkey.mjs && cp ../../CHANGELOG.md ./CHANGELOG.md && npm run build",
33
33
  "bench:watch": "tsx test/perf/watch-benchmark.ts"
34
34
  },
35
35
  "dependencies": {
@@ -37,7 +37,7 @@
37
37
  "@massu/adapter-rails": "^1.0.0",
38
38
  "@massu/adapter-spring": "^1.0.0",
39
39
  "@massu/types": "1.12.0",
40
- "better-sqlite3": "^12.6.2",
40
+ "better-sqlite3": "^12.11.1",
41
41
  "chokidar": "^3.6.0",
42
42
  "fast-glob": "^3.3.0",
43
43
  "proper-lockfile": "^4.1.2",
@@ -52,10 +52,11 @@
52
52
  "devDependencies": {
53
53
  "@types/better-sqlite3": "^7.6.13",
54
54
  "@types/proper-lockfile": "^4.1.4",
55
- "esbuild": "^0.27.3",
56
- "tsx": "^4.0.0",
55
+ "@vitest/coverage-v8": "^4.1.8",
56
+ "esbuild": "^0.28.1",
57
+ "tsx": "^4.23.0",
57
58
  "typescript": "^5.4.0",
58
- "vitest": "^4.0.18"
59
+ "vitest": "^4.1.8"
59
60
  },
60
61
  "files": [
61
62
  "dist/**/*",
@@ -79,7 +80,7 @@
79
80
  "feature-registry"
80
81
  ],
81
82
  "engines": {
82
- "node": ">=20.0.0 <26.0.0"
83
+ "node": ">=20.0.0"
83
84
  },
84
85
  "repository": {
85
86
  "type": "git",