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.
@@ -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 @faker-js/faker for realistic test data
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 { faker } from '@faker-js/faker';
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', () => `'${faker.string.uuid()}'`],
37
- ['email', () => `'${faker.internet.email()}'`],
38
- ['name', () => `'${faker.person.fullName()}'`],
39
- ['url', () => `'${faker.internet.url()}'`],
40
- ['date', () => `new Date('${faker.date.recent().toISOString()}')`],
41
- ['phone', () => `'${faker.phone.number()}'`],
42
- ['address', () => `'${faker.location.streetAddress()}'`],
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', () => `'${faker.lorem.word()}'`],
50
- ['number', () => String(faker.number.int({ min: 1, max: 100 }))],
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 @faker-js/faker for realistic test data
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 { faker } from '@faker-js/faker';
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(faker.number.int({ min: 1, max: 1000 }));
500
- return `"${faker.string.uuid()}"`;
499
+ return String(testValues.int(1, 1000));
500
+ return `"${testValues.uuid()}"`;
501
501
  }
502
502
  if (name.includes('name'))
503
- return `"${faker.person.fullName()}"`;
503
+ return `"${testValues.fullName()}"`;
504
504
  if (name.includes('email'))
505
- return `"${faker.internet.email()}"`;
505
+ return `"${testValues.email()}"`;
506
506
  if (name.includes('url'))
507
- return `"${faker.internet.url()}"`;
507
+ return `"${testValues.url()}"`;
508
508
  // Infer from type
509
509
  if (type.includes('string') || type === 'str')
510
- return `"${faker.lorem.word()}"`;
510
+ return `"${testValues.word()}"`;
511
511
  if (type.includes('int64'))
512
- return `int64(${faker.number.int({ min: 1, max: 100 })})`;
512
+ return `int64(${testValues.int(1, 100)})`;
513
513
  if (type.includes('int32'))
514
- return `int32(${faker.number.int({ min: 1, max: 100 })})`;
514
+ return `int32(${testValues.int(1, 100)})`;
515
515
  if (type.includes('int'))
516
- return String(faker.number.int({ min: 1, max: 100 }));
516
+ return String(testValues.int(1, 100));
517
517
  if (type.includes('float64'))
518
- return `${faker.number.float({ min: 1, max: 100, fractionDigits: 2 })}`;
518
+ return `${testValues.float(1, 100, 2)}`;
519
519
  if (type.includes('float32'))
520
- return `float32(${faker.number.float({ min: 1, max: 100, fractionDigits: 2 })})`;
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 { faker } from '@faker-js/faker';
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 `${faker.number.int({ min: 1, max: 1000 })}L`;
491
+ return `${testValues.int(1, 1000)}L`;
492
492
  if (name.includes('email'))
493
- return `"${faker.internet.email()}"`;
493
+ return `"${testValues.email()}"`;
494
494
  if (name.includes('name'))
495
- return `"${faker.person.fullName()}"`;
495
+ return `"${testValues.fullName()}"`;
496
496
  if (name.includes('url'))
497
- return `"${faker.internet.url()}"`;
497
+ return `"${testValues.url()}"`;
498
498
  // Infer from type
499
499
  if (type === 'long' || type === 'Long')
500
- return `${faker.number.int({ min: 1, max: 1000 })}L`;
500
+ return `${testValues.int(1, 1000)}L`;
501
501
  if (type === 'int' || type === 'integer' || type === 'Integer')
502
- return String(faker.number.int({ min: 1, max: 100 }));
502
+ return String(testValues.int(1, 100));
503
503
  if (type === 'double' || type === 'Double' || type === 'float' || type === 'Float')
504
- return `${faker.number.float({ min: 0, max: 100 })}`;
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 `"${faker.lorem.word()}"`;
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 { faker } from '@faker-js/faker';
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 `${faker.number.int({ min: 1, max: 1000 })}L`;
496
+ return `${testValues.int(1, 1000)}L`;
497
497
  if (name.includes('email'))
498
- return `"${faker.internet.email()}"`;
498
+ return `"${testValues.email()}"`;
499
499
  if (name.includes('name'))
500
- return `"${faker.person.fullName()}"`;
500
+ return `"${testValues.fullName()}"`;
501
501
  if (name.includes('url'))
502
- return `"${faker.internet.url()}"`;
502
+ return `"${testValues.url()}"`;
503
503
  // Infer from type
504
504
  if (type === 'long')
505
- return `${faker.number.int({ min: 1, max: 1000 })}L`;
505
+ return `${testValues.int(1, 1000)}L`;
506
506
  if (type === 'int')
507
- return String(faker.number.int({ min: 1, max: 100 }));
507
+ return String(testValues.int(1, 100));
508
508
  if (type === 'double')
509
- return `${faker.number.float({ min: 0, max: 100 })}`;
509
+ return `${testValues.float(0, 100)}`;
510
510
  if (type === 'float')
511
- return `${faker.number.float({ min: 0, max: 100 })}f`;
511
+ return `${testValues.float(0, 100)}f`;
512
512
  if (type === 'boolean')
513
513
  return 'true';
514
514
  if (type === 'string')
515
- return `"${faker.lorem.word()}"`;
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 { faker } from '@faker-js/faker';
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 `"${faker.string.uuid()}"`;
415
+ return `"${testValues.uuid()}"`;
416
416
  if (name.includes('name'))
417
- return `"${faker.person.fullName()}"`;
417
+ return `"${testValues.fullName()}"`;
418
418
  if (name.includes('email'))
419
- return `"${faker.internet.email()}"`;
419
+ return `"${testValues.email()}"`;
420
420
  if (name.includes('url'))
421
- return `"${faker.internet.url()}"`;
421
+ return `"${testValues.url()}"`;
422
422
  // Infer from type
423
423
  if (type.includes('str'))
424
- return `"${faker.lorem.word()}"`;
424
+ return `"${testValues.word()}"`;
425
425
  if (type.includes('int') || type.includes('number')) {
426
- return String(faker.number.int({ min: 1, max: 100 }));
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(faker.number.float({ min: 0, max: 100 }));
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 { faker } from '@faker-js/faker';
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 `"${faker.string.uuid()}"`;
428
+ return `"${testValues.uuid()}"`;
429
429
  if (name.includes('email'))
430
- return `"${faker.internet.email()}"`;
430
+ return `"${testValues.email()}"`;
431
431
  if (name.includes('name'))
432
- return `"${faker.person.fullName()}"`;
432
+ return `"${testValues.fullName()}"`;
433
433
  if (name.includes('url'))
434
- return `"${faker.internet.url()}"`;
434
+ return `"${testValues.url()}"`;
435
435
  // Infer from type
436
436
  if (lower === 'string')
437
- return `"${faker.lorem.word()}"`;
437
+ return `"${testValues.word()}"`;
438
438
  if (lower === 'int')
439
- return String(faker.number.int({ min: 1, max: 100 }));
439
+ return String(testValues.int(1, 100));
440
440
  if (lower === 'double' || lower === 'float' || lower === 'cgfloat')
441
- return String(faker.number.float({ min: 0, max: 100, fractionDigits: 2 }));
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 { faker } from '@faker-js/faker';
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(faker.number.int({ min: 1, max: 1000 }));
366
+ return String(testValues.int(1, 1000));
367
367
  }
368
368
  if (name.includes('id'))
369
- return `"${faker.string.uuid()}"`;
369
+ return `"${testValues.uuid()}"`;
370
370
  if (name.includes('name'))
371
- return `"${faker.person.fullName()}"`;
371
+ return `"${testValues.fullName()}"`;
372
372
  if (name.includes('email'))
373
- return `"${faker.internet.email()}"`;
373
+ return `"${testValues.email()}"`;
374
374
  if (name.includes('url'))
375
- return `"${faker.internet.url()}"`;
375
+ return `"${testValues.url()}"`;
376
376
  // Infer from type
377
377
  if (type === 'int' || type === 'int32' || type === 'int64' || type === 'long') {
378
- return String(faker.number.int({ min: 1, max: 100 }));
378
+ return String(testValues.int(1, 100));
379
379
  }
380
380
  if (type === 'double' || type === 'float' || type === 'decimal') {
381
- return `${faker.number.float({ min: 0, max: 100, fractionDigits: 2 })}m`;
381
+ return `${testValues.float(0, 100, 2)}m`;
382
382
  }
383
383
  if (type === 'string' || type.includes('string'))
384
- return `"${faker.lorem.word()}"`;
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(faker.number.int({ min: 1, max: 100 }));
470
+ return String(testValues.int(1, 100));
471
471
  }
472
472
  if (type.includes('string') || type === 'unknown') {
473
- return `"${faker.lorem.word()}"`;
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
- // Export only what's available from mcp module
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
- settings[key] = value;
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 .claude/helpers/brain-checkpoint.cjs verify --json',
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 .claude/helpers/brain-checkpoint.cjs export --json',
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 .claude/helpers/statusline-v3.cjs 2>/dev/null || echo "▊ Agentic QE v3"',
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 ruflo:*)',
107
- 'Bash(npx @ruflo/cli:*)',
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,