agentic-qe 3.8.13 → 3.8.14

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.
@@ -932,7 +932,7 @@
932
932
  },
933
933
  "metadata": {
934
934
  "generatedBy": "Agentic QE Fleet",
935
- "fleetVersion": "3.8.13",
935
+ "fleetVersion": "3.8.14",
936
936
  "manifestVersion": "1.3.0",
937
937
  "lastUpdated": "2026-02-04T00:00:00.000Z",
938
938
  "contributors": [
package/CHANGELOG.md CHANGED
@@ -5,6 +5,26 @@ All notable changes to the Agentic QE project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [3.8.14] - 2026-03-31
9
+
10
+ ### Fixed
11
+
12
+ - **Security: SQL injection in witness-chain LIMIT/OFFSET** — Parameterized LIMIT and OFFSET values in `getEntries()` query instead of string interpolation. Also handles offset-without-limit correctly via SQLite `LIMIT -1` idiom, and `limit=0` now properly returns zero rows.
13
+ - **Removed `@faker-js/faker` from 7 production generator files** — Replaced with lightweight `test-value-helpers.ts` using only `node:crypto`. Eliminates ~6 MB runtime dependency for npm consumers. Generators now work without devDependencies installed.
14
+ - **`aqe init` hook paths break from subfolders** — Adopted `CLAUDE_PROJECT_DIR` pattern so hook commands resolve correctly regardless of working directory.
15
+ - **Removed ruflo permissions from `aqe init`** — Only AQE-specific entries are injected into user settings; third-party tool permissions no longer leak in.
16
+ - **Dead MCP `server.ts` removed (911 lines)** — Eliminated unused dual-server divergence risk; production uses `MCPProtocolServer` via `entry.ts`.
17
+ - **CI publishes without test gate** — Added mandatory unit test pass gate to `npm-publish.yml`. Removed `continue-on-error` from `optimized-ci.yml` test steps.
18
+ - **ESLint broken in ESM project** — Renamed `.eslintrc.js` to `.eslintrc.cjs` for CommonJS compatibility.
19
+ - **Hardcoded version `3.0.0` in MCP servers** — `protocol-server.ts` and `http-server.ts` now read version dynamically from `package.json`.
20
+ - **Vitest process hang on native modules** — Added worker-level `afterAll` force-exit and global teardown safety net for `better-sqlite3` / `hnswlib-node` handles.
21
+
22
+ ### Added
23
+
24
+ - **`test-value-helpers.ts`** — Zero-dependency test data generator for test-generation domain using `node:crypto` built-ins with range guards for edge cases.
25
+ - **Pagination edge case tests** — `limit=0`, offset-without-limit, and offset-beyond-total coverage in witness-chain tests.
26
+ - **17 unit tests for test-value-helpers** — Covers all value generators including boundary inputs and inverted ranges.
27
+
8
28
  ## [3.8.13] - 2026-03-30
9
29
 
10
30
  ### Added
@@ -190,9 +190,21 @@ export class WitnessChain {
190
190
  params.push(filter.actor);
191
191
  }
192
192
  const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
193
- const limit = filter?.limit ? `LIMIT ${filter.limit}` : '';
194
- const offset = filter?.offset ? `OFFSET ${filter.offset}` : '';
195
- return this.db.prepare(`SELECT * FROM witness_chain ${where} ORDER BY id ASC ${limit} ${offset}`).all(...params);
193
+ const hasLimit = filter?.limit != null;
194
+ const hasOffset = filter?.offset != null;
195
+ // SQLite requires LIMIT before OFFSET; use LIMIT -1 ("all rows") when only offset is given
196
+ const limitClause = hasLimit ? 'LIMIT ?' : (hasOffset ? 'LIMIT ?' : '');
197
+ const offsetClause = hasOffset ? 'OFFSET ?' : '';
198
+ if (hasLimit) {
199
+ params.push(filter.limit);
200
+ }
201
+ else if (hasOffset) {
202
+ params.push(-1);
203
+ }
204
+ if (hasOffset) {
205
+ params.push(filter.offset);
206
+ }
207
+ return this.db.prepare(`SELECT * FROM witness_chain ${where} ORDER BY id ASC ${limitClause} ${offsetClause}`).all(...params);
196
208
  }
197
209
  /** Get all witness entries for a pattern by ID (checks both patternId and pattern_id keys). */
198
210
  getPatternLineage(patternId) {