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.
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +20 -0
- package/dist/audit/witness-chain.js +15 -3
- package/dist/cli/bundle.js +636 -636
- package/dist/domains/test-generation/generators/base-test-generator.d.ts +1 -1
- package/dist/domains/test-generation/generators/base-test-generator.js +11 -11
- package/dist/domains/test-generation/generators/go-test-generator.js +12 -12
- package/dist/domains/test-generation/generators/junit5-generator.js +9 -9
- package/dist/domains/test-generation/generators/kotlin-junit-generator.js +10 -10
- package/dist/domains/test-generation/generators/pytest-generator.js +8 -8
- package/dist/domains/test-generation/generators/swift-testing-generator.js +8 -8
- package/dist/domains/test-generation/generators/test-value-helpers.d.ts +20 -0
- package/dist/domains/test-generation/generators/test-value-helpers.js +48 -0
- package/dist/domains/test-generation/generators/xunit-generator.js +11 -11
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -2
- package/dist/init/init-wizard-hooks.js +15 -1
- package/dist/init/phases/07-hooks.js +2 -2
- package/dist/init/settings-merge.js +3 -7
- package/dist/mcp/bundle.js +327 -327
- package/dist/mcp/http-server.js +4 -1
- package/dist/mcp/index.d.ts +2 -2
- package/dist/mcp/index.js +5 -4
- package/dist/mcp/protocol-server.d.ts +5 -0
- package/dist/mcp/protocol-server.js +10 -1
- package/package.json +1 -1
- package/dist/mcp/server.d.ts +0 -46
- package/dist/mcp/server.js +0 -802
|
@@ -43,7 +43,7 @@ export declare abstract class BaseTestGenerator implements ITestGenerator {
|
|
|
43
43
|
private static readonly TYPE_VALUE_TABLE;
|
|
44
44
|
/**
|
|
45
45
|
* Generate a test value for a parameter based on its type and name
|
|
46
|
-
* Uses
|
|
46
|
+
* Uses lightweight test value helpers for realistic test data
|
|
47
47
|
*
|
|
48
48
|
* @param param - Parameter information
|
|
49
49
|
* @returns Generated test value as a string
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @module test-generation/generators
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
10
|
+
import { testValues } from './test-value-helpers';
|
|
11
11
|
/**
|
|
12
12
|
* BaseTestGenerator - Abstract base class for test generators
|
|
13
13
|
*
|
|
@@ -33,21 +33,21 @@ export class BaseTestGenerator {
|
|
|
33
33
|
* Checked in order; first match wins.
|
|
34
34
|
*/
|
|
35
35
|
static NAME_VALUE_TABLE = [
|
|
36
|
-
['id', () => `'${
|
|
37
|
-
['email', () => `'${
|
|
38
|
-
['name', () => `'${
|
|
39
|
-
['url', () => `'${
|
|
40
|
-
['date', () => `new Date('${
|
|
41
|
-
['phone', () => `'${
|
|
42
|
-
['address', () => `'${
|
|
36
|
+
['id', () => `'${testValues.uuid()}'`],
|
|
37
|
+
['email', () => `'${testValues.email()}'`],
|
|
38
|
+
['name', () => `'${testValues.fullName()}'`],
|
|
39
|
+
['url', () => `'${testValues.url()}'`],
|
|
40
|
+
['date', () => `new Date('${testValues.recentDate()}')`],
|
|
41
|
+
['phone', () => `'${testValues.phone()}'`],
|
|
42
|
+
['address', () => `'${testValues.streetAddress()}'`],
|
|
43
43
|
];
|
|
44
44
|
/**
|
|
45
45
|
* Type-based value generators. Each entry is [typeSubstring, generatorFn].
|
|
46
46
|
* Checked in order; first match wins.
|
|
47
47
|
*/
|
|
48
48
|
static TYPE_VALUE_TABLE = [
|
|
49
|
-
['string', () => `'${
|
|
50
|
-
['number', () => String(
|
|
49
|
+
['string', () => `'${testValues.word()}'`],
|
|
50
|
+
['number', () => String(testValues.int(1, 100))],
|
|
51
51
|
['boolean', () => 'true'],
|
|
52
52
|
['[]', () => '[]'],
|
|
53
53
|
['array', () => '[]'],
|
|
@@ -59,7 +59,7 @@ export class BaseTestGenerator {
|
|
|
59
59
|
];
|
|
60
60
|
/**
|
|
61
61
|
* Generate a test value for a parameter based on its type and name
|
|
62
|
-
* Uses
|
|
62
|
+
* Uses lightweight test value helpers for realistic test data
|
|
63
63
|
*
|
|
64
64
|
* @param param - Parameter information
|
|
65
65
|
* @returns Generated test value as a string
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*
|
|
15
15
|
* @module test-generation/generators
|
|
16
16
|
*/
|
|
17
|
-
import {
|
|
17
|
+
import { testValues } from './test-value-helpers';
|
|
18
18
|
import { BaseTestGenerator } from './base-test-generator';
|
|
19
19
|
/**
|
|
20
20
|
* GoTestGenerator - Test generator for Go's testing package
|
|
@@ -496,28 +496,28 @@ func Test${funcName}_Cover_${lines[0]}_${lines[lines.length - 1]}(t *testing.T)
|
|
|
496
496
|
// Infer from param name
|
|
497
497
|
if (name.includes('id') && !name.includes('valid')) {
|
|
498
498
|
if (type.includes('int'))
|
|
499
|
-
return String(
|
|
500
|
-
return `"${
|
|
499
|
+
return String(testValues.int(1, 1000));
|
|
500
|
+
return `"${testValues.uuid()}"`;
|
|
501
501
|
}
|
|
502
502
|
if (name.includes('name'))
|
|
503
|
-
return `"${
|
|
503
|
+
return `"${testValues.fullName()}"`;
|
|
504
504
|
if (name.includes('email'))
|
|
505
|
-
return `"${
|
|
505
|
+
return `"${testValues.email()}"`;
|
|
506
506
|
if (name.includes('url'))
|
|
507
|
-
return `"${
|
|
507
|
+
return `"${testValues.url()}"`;
|
|
508
508
|
// Infer from type
|
|
509
509
|
if (type.includes('string') || type === 'str')
|
|
510
|
-
return `"${
|
|
510
|
+
return `"${testValues.word()}"`;
|
|
511
511
|
if (type.includes('int64'))
|
|
512
|
-
return `int64(${
|
|
512
|
+
return `int64(${testValues.int(1, 100)})`;
|
|
513
513
|
if (type.includes('int32'))
|
|
514
|
-
return `int32(${
|
|
514
|
+
return `int32(${testValues.int(1, 100)})`;
|
|
515
515
|
if (type.includes('int'))
|
|
516
|
-
return String(
|
|
516
|
+
return String(testValues.int(1, 100));
|
|
517
517
|
if (type.includes('float64'))
|
|
518
|
-
return `${
|
|
518
|
+
return `${testValues.float(1, 100, 2)}`;
|
|
519
519
|
if (type.includes('float32'))
|
|
520
|
-
return `float32(${
|
|
520
|
+
return `float32(${testValues.float(1, 100, 2)})`;
|
|
521
521
|
if (type.includes('bool'))
|
|
522
522
|
return 'true';
|
|
523
523
|
if (type.includes('[]byte'))
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @module test-generation/generators
|
|
13
13
|
*/
|
|
14
|
-
import {
|
|
14
|
+
import { testValues } from './test-value-helpers';
|
|
15
15
|
import { BaseTestGenerator } from './base-test-generator';
|
|
16
16
|
import { detectSpringAnnotations } from '../detectors/spring-detector.js';
|
|
17
17
|
/**
|
|
@@ -488,24 +488,24 @@ class ${moduleName}CoverageTest {
|
|
|
488
488
|
const name = param.name.toLowerCase();
|
|
489
489
|
// Infer from param name
|
|
490
490
|
if (name.includes('id'))
|
|
491
|
-
return `${
|
|
491
|
+
return `${testValues.int(1, 1000)}L`;
|
|
492
492
|
if (name.includes('email'))
|
|
493
|
-
return `"${
|
|
493
|
+
return `"${testValues.email()}"`;
|
|
494
494
|
if (name.includes('name'))
|
|
495
|
-
return `"${
|
|
495
|
+
return `"${testValues.fullName()}"`;
|
|
496
496
|
if (name.includes('url'))
|
|
497
|
-
return `"${
|
|
497
|
+
return `"${testValues.url()}"`;
|
|
498
498
|
// Infer from type
|
|
499
499
|
if (type === 'long' || type === 'Long')
|
|
500
|
-
return `${
|
|
500
|
+
return `${testValues.int(1, 1000)}L`;
|
|
501
501
|
if (type === 'int' || type === 'integer' || type === 'Integer')
|
|
502
|
-
return String(
|
|
502
|
+
return String(testValues.int(1, 100));
|
|
503
503
|
if (type === 'double' || type === 'Double' || type === 'float' || type === 'Float')
|
|
504
|
-
return `${
|
|
504
|
+
return `${testValues.float(0, 100)}`;
|
|
505
505
|
if (type === 'boolean' || type === 'Boolean')
|
|
506
506
|
return 'true';
|
|
507
507
|
if (type.includes('string'))
|
|
508
|
-
return `"${
|
|
508
|
+
return `"${testValues.word()}"`;
|
|
509
509
|
if (type.includes('list'))
|
|
510
510
|
return 'List.of()';
|
|
511
511
|
if (type.includes('map'))
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @module test-generation/generators
|
|
13
13
|
*/
|
|
14
|
-
import {
|
|
14
|
+
import { testValues } from './test-value-helpers';
|
|
15
15
|
import { BaseTestGenerator } from './base-test-generator';
|
|
16
16
|
/**
|
|
17
17
|
* KotlinJUnitGenerator - Test generator for Kotlin's JUnit 5 + MockK framework
|
|
@@ -493,26 +493,26 @@ class ${moduleName}CoverageTest {
|
|
|
493
493
|
const name = param.name.toLowerCase();
|
|
494
494
|
// Infer from param name
|
|
495
495
|
if (name.includes('id'))
|
|
496
|
-
return `${
|
|
496
|
+
return `${testValues.int(1, 1000)}L`;
|
|
497
497
|
if (name.includes('email'))
|
|
498
|
-
return `"${
|
|
498
|
+
return `"${testValues.email()}"`;
|
|
499
499
|
if (name.includes('name'))
|
|
500
|
-
return `"${
|
|
500
|
+
return `"${testValues.fullName()}"`;
|
|
501
501
|
if (name.includes('url'))
|
|
502
|
-
return `"${
|
|
502
|
+
return `"${testValues.url()}"`;
|
|
503
503
|
// Infer from type
|
|
504
504
|
if (type === 'long')
|
|
505
|
-
return `${
|
|
505
|
+
return `${testValues.int(1, 1000)}L`;
|
|
506
506
|
if (type === 'int')
|
|
507
|
-
return String(
|
|
507
|
+
return String(testValues.int(1, 100));
|
|
508
508
|
if (type === 'double')
|
|
509
|
-
return `${
|
|
509
|
+
return `${testValues.float(0, 100)}`;
|
|
510
510
|
if (type === 'float')
|
|
511
|
-
return `${
|
|
511
|
+
return `${testValues.float(0, 100)}f`;
|
|
512
512
|
if (type === 'boolean')
|
|
513
513
|
return 'true';
|
|
514
514
|
if (type === 'string')
|
|
515
|
-
return `"${
|
|
515
|
+
return `"${testValues.word()}"`;
|
|
516
516
|
if (type.includes('list'))
|
|
517
517
|
return 'emptyList()';
|
|
518
518
|
if (type.includes('map'))
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*
|
|
11
11
|
* @module test-generation/generators
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
13
|
+
import { testValues } from './test-value-helpers';
|
|
14
14
|
import { BaseTestGenerator } from './base-test-generator';
|
|
15
15
|
/**
|
|
16
16
|
* PytestGenerator - Test generator for Python's pytest framework
|
|
@@ -412,18 +412,18 @@ class Test${this.pascalCase(moduleName)}Coverage:
|
|
|
412
412
|
const name = param.name.toLowerCase();
|
|
413
413
|
// Infer from param name
|
|
414
414
|
if (name.includes('id'))
|
|
415
|
-
return `"${
|
|
415
|
+
return `"${testValues.uuid()}"`;
|
|
416
416
|
if (name.includes('name'))
|
|
417
|
-
return `"${
|
|
417
|
+
return `"${testValues.fullName()}"`;
|
|
418
418
|
if (name.includes('email'))
|
|
419
|
-
return `"${
|
|
419
|
+
return `"${testValues.email()}"`;
|
|
420
420
|
if (name.includes('url'))
|
|
421
|
-
return `"${
|
|
421
|
+
return `"${testValues.url()}"`;
|
|
422
422
|
// Infer from type
|
|
423
423
|
if (type.includes('str'))
|
|
424
|
-
return `"${
|
|
424
|
+
return `"${testValues.word()}"`;
|
|
425
425
|
if (type.includes('int') || type.includes('number')) {
|
|
426
|
-
return String(
|
|
426
|
+
return String(testValues.int(1, 100));
|
|
427
427
|
}
|
|
428
428
|
if (type.includes('bool'))
|
|
429
429
|
return 'True';
|
|
@@ -432,7 +432,7 @@ class Test${this.pascalCase(moduleName)}Coverage:
|
|
|
432
432
|
if (type.includes('dict') || type.includes('{}'))
|
|
433
433
|
return '{}';
|
|
434
434
|
if (type.includes('float'))
|
|
435
|
-
return String(
|
|
435
|
+
return String(testValues.float(0, 100));
|
|
436
436
|
return 'None';
|
|
437
437
|
}
|
|
438
438
|
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* @module test-generation/generators
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
16
|
+
import { testValues } from './test-value-helpers';
|
|
17
17
|
import { BaseTestGenerator } from './base-test-generator';
|
|
18
18
|
/**
|
|
19
19
|
* SwiftTestingGenerator - Test generator for Apple's Swift Testing framework
|
|
@@ -425,20 +425,20 @@ struct ${moduleName}CoverageTests {
|
|
|
425
425
|
const lower = type.toLowerCase();
|
|
426
426
|
// Infer from param name
|
|
427
427
|
if (name.includes('id'))
|
|
428
|
-
return `"${
|
|
428
|
+
return `"${testValues.uuid()}"`;
|
|
429
429
|
if (name.includes('email'))
|
|
430
|
-
return `"${
|
|
430
|
+
return `"${testValues.email()}"`;
|
|
431
431
|
if (name.includes('name'))
|
|
432
|
-
return `"${
|
|
432
|
+
return `"${testValues.fullName()}"`;
|
|
433
433
|
if (name.includes('url'))
|
|
434
|
-
return `"${
|
|
434
|
+
return `"${testValues.url()}"`;
|
|
435
435
|
// Infer from type
|
|
436
436
|
if (lower === 'string')
|
|
437
|
-
return `"${
|
|
437
|
+
return `"${testValues.word()}"`;
|
|
438
438
|
if (lower === 'int')
|
|
439
|
-
return String(
|
|
439
|
+
return String(testValues.int(1, 100));
|
|
440
440
|
if (lower === 'double' || lower === 'float' || lower === 'cgfloat')
|
|
441
|
-
return String(
|
|
441
|
+
return String(testValues.float(0, 100, 2));
|
|
442
442
|
if (lower === 'bool')
|
|
443
443
|
return 'true';
|
|
444
444
|
if (lower.startsWith('[') && lower.endsWith(']'))
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight test value generators — replaces @faker-js/faker in generators.
|
|
3
|
+
*
|
|
4
|
+
* These produce plausible string literals for generated test code.
|
|
5
|
+
* They do NOT need cryptographic randomness or statistical distributions —
|
|
6
|
+
* they only produce placeholder values embedded in source code output.
|
|
7
|
+
*/
|
|
8
|
+
export declare const testValues: {
|
|
9
|
+
uuid: () => string;
|
|
10
|
+
email: () => string;
|
|
11
|
+
fullName: () => string;
|
|
12
|
+
url: () => string;
|
|
13
|
+
recentDate: () => string;
|
|
14
|
+
phone: () => string;
|
|
15
|
+
streetAddress: () => string;
|
|
16
|
+
word: () => string;
|
|
17
|
+
int: (min?: number, max?: number) => number;
|
|
18
|
+
float: (min?: number, max?: number, fractionDigits?: number) => number;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=test-value-helpers.d.ts.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight test value generators — replaces @faker-js/faker in generators.
|
|
3
|
+
*
|
|
4
|
+
* These produce plausible string literals for generated test code.
|
|
5
|
+
* They do NOT need cryptographic randomness or statistical distributions —
|
|
6
|
+
* they only produce placeholder values embedded in source code output.
|
|
7
|
+
*/
|
|
8
|
+
import { randomBytes, randomInt, randomUUID } from 'node:crypto';
|
|
9
|
+
function randomHex(bytes) {
|
|
10
|
+
return randomBytes(bytes).toString('hex');
|
|
11
|
+
}
|
|
12
|
+
export const testValues = {
|
|
13
|
+
uuid: () => randomUUID(),
|
|
14
|
+
email: () => `user_${randomHex(3)}@example.com`,
|
|
15
|
+
fullName: () => {
|
|
16
|
+
const first = ['Alice', 'Bob', 'Carol', 'Dave', 'Eve', 'Frank'];
|
|
17
|
+
const last = ['Smith', 'Jones', 'Lee', 'Garcia', 'Chen', 'Novak'];
|
|
18
|
+
return `${first[randomInt(first.length)]} ${last[randomInt(last.length)]}`;
|
|
19
|
+
},
|
|
20
|
+
url: () => `https://example.com/${randomHex(4)}`,
|
|
21
|
+
recentDate: () => new Date(Date.now() - randomInt(7 * 86400000)).toISOString(),
|
|
22
|
+
phone: () => `+1${String(randomInt(2000000000, 9999999999))}`,
|
|
23
|
+
streetAddress: () => `${randomInt(1, 9999)} Main St`,
|
|
24
|
+
word: () => {
|
|
25
|
+
const words = ['alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot', 'golf', 'hotel'];
|
|
26
|
+
return words[randomInt(words.length)];
|
|
27
|
+
},
|
|
28
|
+
int: (min = 1, max = 100) => {
|
|
29
|
+
if (min > max) {
|
|
30
|
+
const t = min;
|
|
31
|
+
min = max;
|
|
32
|
+
max = t;
|
|
33
|
+
}
|
|
34
|
+
return randomInt(min, max + 1);
|
|
35
|
+
},
|
|
36
|
+
float: (min = 0, max = 100, fractionDigits = 2) => {
|
|
37
|
+
if (min > max) {
|
|
38
|
+
const t = min;
|
|
39
|
+
min = max;
|
|
40
|
+
max = t;
|
|
41
|
+
}
|
|
42
|
+
if (min === max)
|
|
43
|
+
return min;
|
|
44
|
+
const raw = min + (randomInt(0, 1_000_001) / 1_000_000) * (max - min);
|
|
45
|
+
return Number(raw.toFixed(fractionDigits));
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=test-value-helpers.js.map
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @module test-generation/generators
|
|
13
13
|
*/
|
|
14
|
-
import {
|
|
14
|
+
import { testValues } from './test-value-helpers';
|
|
15
15
|
import { BaseTestGenerator } from './base-test-generator';
|
|
16
16
|
/**
|
|
17
17
|
* XUnitGenerator - Test generator for C#'s xUnit framework
|
|
@@ -363,25 +363,25 @@ namespace Tests.${className}.Coverage
|
|
|
363
363
|
const name = param.name.toLowerCase();
|
|
364
364
|
// Infer from param name
|
|
365
365
|
if (name.includes('id') && (type.includes('int') || type === 'unknown')) {
|
|
366
|
-
return String(
|
|
366
|
+
return String(testValues.int(1, 1000));
|
|
367
367
|
}
|
|
368
368
|
if (name.includes('id'))
|
|
369
|
-
return `"${
|
|
369
|
+
return `"${testValues.uuid()}"`;
|
|
370
370
|
if (name.includes('name'))
|
|
371
|
-
return `"${
|
|
371
|
+
return `"${testValues.fullName()}"`;
|
|
372
372
|
if (name.includes('email'))
|
|
373
|
-
return `"${
|
|
373
|
+
return `"${testValues.email()}"`;
|
|
374
374
|
if (name.includes('url'))
|
|
375
|
-
return `"${
|
|
375
|
+
return `"${testValues.url()}"`;
|
|
376
376
|
// Infer from type
|
|
377
377
|
if (type === 'int' || type === 'int32' || type === 'int64' || type === 'long') {
|
|
378
|
-
return String(
|
|
378
|
+
return String(testValues.int(1, 100));
|
|
379
379
|
}
|
|
380
380
|
if (type === 'double' || type === 'float' || type === 'decimal') {
|
|
381
|
-
return `${
|
|
381
|
+
return `${testValues.float(0, 100, 2)}m`;
|
|
382
382
|
}
|
|
383
383
|
if (type === 'string' || type.includes('string'))
|
|
384
|
-
return `"${
|
|
384
|
+
return `"${testValues.word()}"`;
|
|
385
385
|
if (type === 'bool' || type === 'boolean')
|
|
386
386
|
return 'true';
|
|
387
387
|
if (type.includes('list<') || type.includes('ienumerable<') || type.includes('[]')) {
|
|
@@ -467,10 +467,10 @@ namespace Tests.${className}.Coverage
|
|
|
467
467
|
const values = params.map(p => {
|
|
468
468
|
const type = p.type?.toLowerCase() || '';
|
|
469
469
|
if (type.includes('int') || type.includes('number')) {
|
|
470
|
-
return String(
|
|
470
|
+
return String(testValues.int(1, 100));
|
|
471
471
|
}
|
|
472
472
|
if (type.includes('string') || type === 'unknown') {
|
|
473
|
-
return `"${
|
|
473
|
+
return `"${testValues.word()}"`;
|
|
474
474
|
}
|
|
475
475
|
return 'null';
|
|
476
476
|
});
|
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export { CrossPhaseHookExecutor, getCrossPhaseHookExecutor, resetCrossPhaseHookE
|
|
|
12
12
|
export type { TeammateIdleHookConfig, TaskQueue, PendingTask, TeammateIdleStats, TaskCompletedHookConfig, ExtractedPattern, PatternStore, CompletionAction, CompletionHandler, GateCheckResult, } from './hooks';
|
|
13
13
|
export { DevilsAdvocate, ClaimVerifier } from './agents';
|
|
14
14
|
export * from './domains';
|
|
15
|
-
export { MCPServer, createMCPServer, ToolRegistry, createToolRegistry, } from './mcp';
|
|
15
|
+
export { MCPProtocolServer, createMCPProtocolServer, MCPServer, createMCPServer, ToolRegistry, createToolRegistry, } from './mcp';
|
|
16
16
|
export { createQEReasoningBank, QEReasoningBank, RealQEReasoningBank, createRealQEReasoningBank, detectQEDomain, detectQEDomains, mapQEDomainToAQE, QE_DOMAIN_LIST, QE_DOMAINS, } from './learning';
|
|
17
17
|
export type { QEPattern, QEPatternType, QEPatternTemplate, QEPatternContext, QEDomain, CreateQEPatternOptions, LearningOutcome, PatternSearchOptions, PatternSearchResult, QERoutingRequest, QERoutingResult, } from './learning';
|
|
18
18
|
export { createTestOutcomeTracker, createCoverageLearner, createQualityScoreCalculator, createPatternPromotionManager, createQualityFeedbackLoop, createInitializedFeedbackLoop, QualityFeedbackLoop, TestOutcomeTracker, CoverageLearner, QualityScoreCalculator, PatternPromotionManager, DEFAULT_FEEDBACK_CONFIG, DEFAULT_QUALITY_WEIGHTS, DEFAULT_PROMOTION_CRITERIA, } from './feedback';
|
package/dist/index.js
CHANGED
|
@@ -24,8 +24,7 @@ export { DevilsAdvocate, ClaimVerifier } from './agents';
|
|
|
24
24
|
// Domain Interfaces - export as namespaces
|
|
25
25
|
export * from './domains';
|
|
26
26
|
// MCP Server - Model Context Protocol integration
|
|
27
|
-
|
|
28
|
-
export { MCPServer, createMCPServer, ToolRegistry, createToolRegistry, } from './mcp';
|
|
27
|
+
export { MCPProtocolServer, createMCPProtocolServer, MCPServer, createMCPServer, ToolRegistry, createToolRegistry, } from './mcp';
|
|
29
28
|
// Learning Module - QE ReasoningBank for pattern learning (ADR-021)
|
|
30
29
|
// Exclude types that conflict with routing (ComplexityLevel, ProgrammingLanguage, TestFramework)
|
|
31
30
|
export { createQEReasoningBank, QEReasoningBank, RealQEReasoningBank, createRealQEReasoningBank, detectQEDomain, detectQEDomains, mapQEDomainToAQE, QE_DOMAIN_LIST, QE_DOMAINS, } from './learning';
|
|
@@ -174,9 +174,23 @@ export async function configureHooks(projectRoot, config) {
|
|
|
174
174
|
...generateAqeEnvVars(config),
|
|
175
175
|
};
|
|
176
176
|
// Apply v3 settings sections
|
|
177
|
+
// Permissions are union-merged to preserve user entries (#362)
|
|
177
178
|
const v3Sections = generateV3SettingsSections(config, projectRoot);
|
|
178
179
|
for (const [key, value] of Object.entries(v3Sections)) {
|
|
179
|
-
|
|
180
|
+
if (key === '_aqePermissions') {
|
|
181
|
+
// Union-merge: add AQE entries without removing user-added permissions
|
|
182
|
+
const existingPerms = settings.permissions || {};
|
|
183
|
+
const existingAllow = existingPerms.allow || [];
|
|
184
|
+
const aqeEntries = value;
|
|
185
|
+
const merged = [...new Set([...existingAllow, ...aqeEntries])];
|
|
186
|
+
settings.permissions = {
|
|
187
|
+
...existingPerms,
|
|
188
|
+
allow: merged,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
settings[key] = value;
|
|
193
|
+
}
|
|
180
194
|
}
|
|
181
195
|
// Enable MCP servers (deduplicate, replace old 'aqe' with 'agentic-qe')
|
|
182
196
|
let existingMcp = settings.enabledMcpjsonServers || [];
|
|
@@ -512,7 +512,7 @@ if (process.argv.includes('--json')) process.stdout.write(JSON.stringify(result)
|
|
|
512
512
|
hooks: [
|
|
513
513
|
{
|
|
514
514
|
type: 'command',
|
|
515
|
-
command: 'node
|
|
515
|
+
command: 'sh -c \'exec node "${CLAUDE_PROJECT_DIR:-.}/.claude/helpers/brain-checkpoint.cjs" verify --json\'',
|
|
516
516
|
timeout: 5000,
|
|
517
517
|
continueOnError: true,
|
|
518
518
|
},
|
|
@@ -534,7 +534,7 @@ if (process.argv.includes('--json')) process.stdout.write(JSON.stringify(result)
|
|
|
534
534
|
hooks: [
|
|
535
535
|
{
|
|
536
536
|
type: 'command',
|
|
537
|
-
command: 'node
|
|
537
|
+
command: 'sh -c \'exec node "${CLAUDE_PROJECT_DIR:-.}/.claude/helpers/brain-checkpoint.cjs" export --json\'',
|
|
538
538
|
timeout: 60000,
|
|
539
539
|
continueOnError: true,
|
|
540
540
|
},
|
|
@@ -97,18 +97,14 @@ export function generateV3SettingsSections(config, projectRoot) {
|
|
|
97
97
|
},
|
|
98
98
|
statusLine: {
|
|
99
99
|
type: 'command',
|
|
100
|
-
command: 'node
|
|
100
|
+
command: 'sh -c \'node "${CLAUDE_PROJECT_DIR:-.}/.claude/helpers/statusline-v3.cjs" 2>/dev/null || echo "▊ Agentic QE v3"\'',
|
|
101
101
|
refreshMs: 5000,
|
|
102
102
|
enabled: true,
|
|
103
103
|
},
|
|
104
104
|
// permissions are union-merged in 07-hooks.ts — not set here to avoid overwriting user entries (#362)
|
|
105
105
|
_aqePermissions: [
|
|
106
|
-
'Bash(npx
|
|
107
|
-
'Bash(npx @
|
|
108
|
-
'Bash(npx claude-flow:*)',
|
|
109
|
-
'Bash(npx @claude-flow/cli:*)',
|
|
110
|
-
'mcp__ruflo__:*',
|
|
111
|
-
'mcp__claude-flow__:*',
|
|
106
|
+
'Bash(npx agentic-qe:*)',
|
|
107
|
+
'Bash(npx @anthropics/agentic-qe:*)',
|
|
112
108
|
'mcp__agentic-qe__*',
|
|
113
109
|
],
|
|
114
110
|
includeCoAuthoredBy: true,
|