agentic-qe 3.7.15 → 3.7.17
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/agents/v3/qe-devils-advocate.md +20 -0
- package/.claude/agents/v3/qe-gap-detector.md +25 -0
- package/.claude/agents/v3/qe-quality-gate.md +8 -0
- package/.claude/agents/v3/qe-requirements-validator.md +25 -0
- package/.claude/agents/v3/subagents/qe-code-reviewer.md +11 -0
- package/.claude/agents/v3/subagents/qe-integration-reviewer.md +11 -0
- package/.claude/agents/v3/subagents/qe-performance-reviewer.md +11 -0
- package/.claude/agents/v3/subagents/qe-security-reviewer.md +11 -0
- package/.claude/helpers/adr-compliance.sh +10 -10
- package/.claude/helpers/auto-memory-hook.mjs +24 -9
- package/.claude/helpers/brain-checkpoint.cjs +55 -134
- package/.claude/helpers/ddd-tracker.sh +2 -2
- package/.claude/helpers/guidance-hooks.sh +2 -2
- package/.claude/helpers/hook-handler.cjs +57 -18
- package/.claude/helpers/statusline.cjs +414 -595
- package/.claude/helpers/v3/quality-criteria/evidence-classification.md +116 -116
- package/.claude/helpers/v3/quality-criteria/htsm-categories.md +139 -139
- package/.claude/skills/README.md +8 -11
- package/.claude/skills/brutal-honesty-review/SKILL.md +3 -0
- package/.claude/skills/code-review-quality/SKILL.md +3 -0
- package/.claude/skills/qcsd-cicd-swarm/SKILL.md +79 -2075
- package/.claude/skills/qcsd-cicd-swarm/steps/01-flag-detection.md +62 -0
- package/.claude/skills/qcsd-cicd-swarm/steps/02-core-agents.md +33 -0
- package/.claude/skills/qcsd-cicd-swarm/steps/03-batch1-results.md +21 -0
- package/.claude/skills/qcsd-cicd-swarm/steps/04-conditional-agents.md +23 -0
- package/.claude/skills/qcsd-cicd-swarm/steps/05-decision-synthesis.md +30 -0
- package/.claude/skills/qcsd-cicd-swarm/steps/06-report-generation.md +17 -0
- package/.claude/skills/qcsd-cicd-swarm/steps/07-learning-persistence.md +27 -0
- package/.claude/skills/qcsd-cicd-swarm/steps/08-deployment-advisor.md +25 -0
- package/.claude/skills/qcsd-cicd-swarm/steps/09-final-output.md +16 -0
- package/.claude/skills/qcsd-development-swarm/SKILL.md +79 -2027
- package/.claude/skills/qcsd-development-swarm/steps/01-flag-detection.md +50 -0
- package/.claude/skills/qcsd-development-swarm/steps/02-core-agents.md +29 -0
- package/.claude/skills/qcsd-development-swarm/steps/03-batch1-results.md +14 -0
- package/.claude/skills/qcsd-development-swarm/steps/04-conditional-agents.md +23 -0
- package/.claude/skills/qcsd-development-swarm/steps/05-decision-synthesis.md +30 -0
- package/.claude/skills/qcsd-development-swarm/steps/06-report-generation.md +16 -0
- package/.claude/skills/qcsd-development-swarm/steps/07-learning-persistence.md +25 -0
- package/.claude/skills/qcsd-development-swarm/steps/08-defect-predictor.md +25 -0
- package/.claude/skills/qcsd-development-swarm/steps/09-final-output.md +16 -0
- package/.claude/skills/qcsd-ideation-swarm/SKILL.md +94 -1894
- package/.claude/skills/qcsd-ideation-swarm/steps/01-flag-detection.md +57 -0
- package/.claude/skills/qcsd-ideation-swarm/steps/02-core-agents.md +29 -0
- package/.claude/skills/qcsd-ideation-swarm/steps/03-batch1-results.md +15 -0
- package/.claude/skills/qcsd-ideation-swarm/steps/04-conditional-agents.md +23 -0
- package/.claude/skills/qcsd-ideation-swarm/steps/05-decision-synthesis.md +29 -0
- package/.claude/skills/qcsd-ideation-swarm/steps/06-report-generation.md +18 -0
- package/.claude/skills/qcsd-ideation-swarm/steps/07-learning-persistence.md +29 -0
- package/.claude/skills/qcsd-ideation-swarm/steps/08-final-output.md +18 -0
- package/.claude/skills/qcsd-production-swarm/SKILL.md +88 -2663
- package/.claude/skills/qcsd-production-swarm/steps/01-flag-detection.md +206 -0
- package/.claude/skills/qcsd-production-swarm/steps/02-core-agents.md +428 -0
- package/.claude/skills/qcsd-production-swarm/steps/03-batch1-results.md +101 -0
- package/.claude/skills/qcsd-production-swarm/steps/04-conditional-agents.md +125 -0
- package/.claude/skills/qcsd-production-swarm/steps/05-decision-synthesis.md +136 -0
- package/.claude/skills/qcsd-production-swarm/steps/06-report-generation.md +181 -0
- package/.claude/skills/qcsd-production-swarm/steps/07-learning-persistence.md +185 -0
- package/.claude/skills/qcsd-production-swarm/steps/08-feedback-loop.md +122 -0
- package/.claude/skills/qcsd-production-swarm/steps/09-final-output.md +140 -0
- package/.claude/skills/qcsd-refinement-swarm/SKILL.md +59 -2312
- package/.claude/skills/qcsd-refinement-swarm/steps/01-flag-detection.md +91 -0
- package/.claude/skills/qcsd-refinement-swarm/steps/02-core-agents.md +40 -0
- package/.claude/skills/qcsd-refinement-swarm/steps/03-batch1-results.md +40 -0
- package/.claude/skills/qcsd-refinement-swarm/steps/04-conditional-agents.md +35 -0
- package/.claude/skills/qcsd-refinement-swarm/steps/05-decision-synthesis.md +43 -0
- package/.claude/skills/qcsd-refinement-swarm/steps/06-report-generation.md +42 -0
- package/.claude/skills/qcsd-refinement-swarm/steps/07-learning-persistence.md +53 -0
- package/.claude/skills/qcsd-refinement-swarm/steps/08-transformation.md +36 -0
- package/.claude/skills/qcsd-refinement-swarm/steps/09-final-output.md +46 -0
- package/.claude/skills/sherlock-review/SKILL.md +3 -0
- package/.claude/skills/skill-builder/SKILL.md +103 -0
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +44 -0
- package/assets/agents/v3/qe-devils-advocate.md +20 -0
- package/assets/agents/v3/qe-gap-detector.md +25 -0
- package/assets/agents/v3/qe-quality-gate.md +8 -0
- package/assets/agents/v3/qe-requirements-validator.md +25 -0
- package/assets/agents/v3/subagents/qe-code-reviewer.md +11 -0
- package/assets/agents/v3/subagents/qe-integration-reviewer.md +11 -0
- package/assets/agents/v3/subagents/qe-performance-reviewer.md +11 -0
- package/assets/agents/v3/subagents/qe-security-reviewer.md +11 -0
- package/assets/helpers/statusline-v3.cjs +693 -0
- package/assets/skills/brutal-honesty-review/SKILL.md +3 -0
- package/assets/skills/code-review-quality/SKILL.md +3 -0
- package/assets/skills/qcsd-cicd-swarm/SKILL.md +79 -2075
- package/assets/skills/qcsd-cicd-swarm/steps/01-flag-detection.md +62 -0
- package/assets/skills/qcsd-cicd-swarm/steps/02-core-agents.md +33 -0
- package/assets/skills/qcsd-cicd-swarm/steps/03-batch1-results.md +21 -0
- package/assets/skills/qcsd-cicd-swarm/steps/04-conditional-agents.md +23 -0
- package/assets/skills/qcsd-cicd-swarm/steps/05-decision-synthesis.md +30 -0
- package/assets/skills/qcsd-cicd-swarm/steps/06-report-generation.md +17 -0
- package/assets/skills/qcsd-cicd-swarm/steps/07-learning-persistence.md +27 -0
- package/assets/skills/qcsd-cicd-swarm/steps/08-deployment-advisor.md +25 -0
- package/assets/skills/qcsd-cicd-swarm/steps/09-final-output.md +16 -0
- package/assets/skills/qcsd-development-swarm/SKILL.md +79 -2027
- package/assets/skills/qcsd-development-swarm/steps/01-flag-detection.md +50 -0
- package/assets/skills/qcsd-development-swarm/steps/02-core-agents.md +29 -0
- package/assets/skills/qcsd-development-swarm/steps/03-batch1-results.md +14 -0
- package/assets/skills/qcsd-development-swarm/steps/04-conditional-agents.md +23 -0
- package/assets/skills/qcsd-development-swarm/steps/05-decision-synthesis.md +30 -0
- package/assets/skills/qcsd-development-swarm/steps/06-report-generation.md +16 -0
- package/assets/skills/qcsd-development-swarm/steps/07-learning-persistence.md +25 -0
- package/assets/skills/qcsd-development-swarm/steps/08-defect-predictor.md +25 -0
- package/assets/skills/qcsd-development-swarm/steps/09-final-output.md +16 -0
- package/assets/skills/qcsd-ideation-swarm/SKILL.md +94 -1894
- package/assets/skills/qcsd-ideation-swarm/steps/01-flag-detection.md +57 -0
- package/assets/skills/qcsd-ideation-swarm/steps/02-core-agents.md +29 -0
- package/assets/skills/qcsd-ideation-swarm/steps/03-batch1-results.md +15 -0
- package/assets/skills/qcsd-ideation-swarm/steps/04-conditional-agents.md +23 -0
- package/assets/skills/qcsd-ideation-swarm/steps/05-decision-synthesis.md +29 -0
- package/assets/skills/qcsd-ideation-swarm/steps/06-report-generation.md +18 -0
- package/assets/skills/qcsd-ideation-swarm/steps/07-learning-persistence.md +29 -0
- package/assets/skills/qcsd-ideation-swarm/steps/08-final-output.md +18 -0
- package/assets/skills/qcsd-production-swarm/SKILL.md +88 -2663
- package/assets/skills/qcsd-production-swarm/steps/01-flag-detection.md +206 -0
- package/assets/skills/qcsd-production-swarm/steps/02-core-agents.md +428 -0
- package/assets/skills/qcsd-production-swarm/steps/03-batch1-results.md +101 -0
- package/assets/skills/qcsd-production-swarm/steps/04-conditional-agents.md +125 -0
- package/assets/skills/qcsd-production-swarm/steps/05-decision-synthesis.md +136 -0
- package/assets/skills/qcsd-production-swarm/steps/06-report-generation.md +181 -0
- package/assets/skills/qcsd-production-swarm/steps/07-learning-persistence.md +185 -0
- package/assets/skills/qcsd-production-swarm/steps/08-feedback-loop.md +122 -0
- package/assets/skills/qcsd-production-swarm/steps/09-final-output.md +140 -0
- package/assets/skills/qcsd-refinement-swarm/SKILL.md +59 -2312
- package/assets/skills/qcsd-refinement-swarm/steps/01-flag-detection.md +91 -0
- package/assets/skills/qcsd-refinement-swarm/steps/02-core-agents.md +40 -0
- package/assets/skills/qcsd-refinement-swarm/steps/03-batch1-results.md +40 -0
- package/assets/skills/qcsd-refinement-swarm/steps/04-conditional-agents.md +35 -0
- package/assets/skills/qcsd-refinement-swarm/steps/05-decision-synthesis.md +43 -0
- package/assets/skills/qcsd-refinement-swarm/steps/06-report-generation.md +42 -0
- package/assets/skills/qcsd-refinement-swarm/steps/07-learning-persistence.md +53 -0
- package/assets/skills/qcsd-refinement-swarm/steps/08-transformation.md +36 -0
- package/assets/skills/qcsd-refinement-swarm/steps/09-final-output.md +46 -0
- package/assets/skills/sherlock-review/SKILL.md +3 -0
- package/assets/templates/agent-override-example.yaml +39 -0
- package/dist/agents/devils-advocate/agent.d.ts +25 -1
- package/dist/agents/devils-advocate/agent.js +108 -4
- package/dist/agents/devils-advocate/types.d.ts +54 -0
- package/dist/agents/devils-advocate/types.js +14 -0
- package/dist/agents/overlay-loader.d.ts +28 -0
- package/dist/agents/overlay-loader.js +232 -0
- package/dist/agents/overlay-schema.d.ts +56 -0
- package/dist/agents/overlay-schema.js +77 -0
- package/dist/analysis/branch-enumerator.d.ts +68 -0
- package/dist/analysis/branch-enumerator.js +393 -0
- package/dist/analysis/index.d.ts +2 -0
- package/dist/analysis/index.js +2 -0
- package/dist/cli/bundle.js +2469 -634
- package/dist/cli/commands/coverage.js +50 -0
- package/dist/cli/handlers/brain-handler.js +2 -1
- package/dist/context/compiler.d.ts +62 -0
- package/dist/context/compiler.js +143 -0
- package/dist/context/index.d.ts +8 -0
- package/dist/context/index.js +6 -0
- package/dist/context/sources/coverage-source.d.ts +15 -0
- package/dist/context/sources/coverage-source.js +77 -0
- package/dist/context/sources/git-source.d.ts +12 -0
- package/dist/context/sources/git-source.js +33 -0
- package/dist/context/sources/index.d.ts +6 -0
- package/dist/context/sources/index.js +5 -0
- package/dist/context/sources/memory-source.d.ts +17 -0
- package/dist/context/sources/memory-source.js +94 -0
- package/dist/context/sources/test-source.d.ts +13 -0
- package/dist/context/sources/test-source.js +53 -0
- package/dist/context/sources/types.d.ts +42 -0
- package/dist/context/sources/types.js +5 -0
- package/dist/domains/test-generation/coordinator.js +6 -4
- package/dist/feedback/feedback-loop.d.ts +5 -0
- package/dist/feedback/feedback-loop.js +12 -0
- package/dist/feedback/index.d.ts +1 -1
- package/dist/feedback/index.js +1 -1
- package/dist/init/agents-installer.d.ts +9 -0
- package/dist/init/agents-installer.js +72 -0
- package/dist/init/phases/07-hooks.d.ts +11 -0
- package/dist/init/phases/07-hooks.js +67 -0
- package/dist/init/phases/09-assets.js +3 -0
- package/dist/init/settings-merge.js +1 -1
- package/dist/kernel/hnsw-adapter.d.ts +3 -0
- package/dist/kernel/hnsw-adapter.js +11 -1
- package/dist/kernel/unified-memory-schemas.d.ts +1 -1
- package/dist/kernel/unified-memory-schemas.js +2 -0
- package/dist/kernel/unified-memory.js +25 -0
- package/dist/learning/experience-capture-middleware.js +24 -0
- package/dist/learning/sqlite-persistence.d.ts +3 -0
- package/dist/learning/sqlite-persistence.js +9 -0
- package/dist/learning/token-tracker.js +4 -0
- package/dist/mcp/bundle.js +3694 -3101
- package/dist/mcp/handlers/handler-factory.js +92 -11
- package/dist/mcp/services/task-router.d.ts +11 -0
- package/dist/mcp/services/task-router.js +26 -0
- package/dist/routing/qe-agent-registry.d.ts +11 -0
- package/dist/routing/qe-agent-registry.js +34 -0
- package/dist/routing/qe-task-router.d.ts +1 -0
- package/dist/routing/qe-task-router.js +34 -2
- package/dist/routing/routing-feedback.d.ts +5 -0
- package/dist/routing/routing-feedback.js +29 -3
- package/dist/routing/types.d.ts +2 -0
- package/dist/sync/pull-agent.js +2 -1
- package/dist/test-scheduling/pipeline.d.ts +7 -0
- package/dist/test-scheduling/pipeline.js +9 -0
- package/dist/validation/index.d.ts +3 -0
- package/dist/validation/index.js +10 -0
- package/dist/validation/pipeline.d.ts +80 -0
- package/dist/validation/pipeline.js +173 -0
- package/dist/validation/steps/requirements.d.ts +32 -0
- package/dist/validation/steps/requirements.js +596 -0
- package/package.json +6 -6
- package/.claude/agents/consensus/README.md +0 -253
- package/.claude/agents/deprecated/qe-api-contract-validator.md.v2 +0 -162
- package/.claude/agents/deprecated/qe-coverage-analyzer.md.v2 +0 -208
- package/.claude/agents/deprecated/qe-test-generator.md.v2 +0 -212
- package/.claude/agents/deprecated/qe-visual-tester.md.v2 +0 -216
- package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +0 -130
- package/.claude/agents/hive-mind/queen-coordinator.md +0 -203
- package/.claude/agents/hive-mind/scout-explorer.md +0 -242
- package/.claude/agents/hive-mind/swarm-memory-manager.md +0 -193
- package/.claude/agents/hive-mind/worker-specialist.md +0 -217
- package/.claude/agents/neural/safla-neural.md +0 -74
- package/.claude/agents/optimization/README.md +0 -250
- package/.claude/agents/reasoning/agent.md +0 -816
- package/.claude/agents/reasoning/goal-planner.md +0 -73
- package/.claude/agents/subagents/qe-code-reviewer.md +0 -76
- package/.claude/agents/subagents/qe-coverage-gap-analyzer.md +0 -76
- package/.claude/agents/subagents/qe-data-generator.md +0 -77
- package/.claude/agents/subagents/qe-flaky-investigator.md +0 -91
- package/.claude/agents/subagents/qe-integration-tester.md +0 -90
- package/.claude/agents/subagents/qe-performance-validator.md +0 -92
- package/.claude/agents/subagents/qe-security-auditor.md +0 -94
- package/.claude/agents/subagents/qe-test-data-architect-sub.md +0 -93
- package/.claude/agents/subagents/qe-test-implementer.md +0 -106
- package/.claude/agents/subagents/qe-test-refactorer.md +0 -117
- package/.claude/agents/subagents/qe-test-writer.md +0 -112
- package/.claude/agents/swarm/README.md +0 -190
- package/.claude/agents/templates/migration-plan.md +0 -746
- package/.claude/agents/testing/unit/tdd-london-swarm.md +0 -244
- package/.claude/agents/testing/validation/production-validator.md +0 -395
- package/.claude/agents/v3/README.md +0 -39
- package/.claude/agents/v3/typescript-specialist.yaml +0 -21
- package/.claude/agents/v3/v3-memory-specialist.md +0 -318
- package/.claude/agents/v3/v3-performance-engineer.md +0 -397
- package/.claude/agents/v3/v3-queen-coordinator.md +0 -98
- package/.claude/agents/v3/v3-security-architect.md +0 -174
- package/.claude/commands/README.md +0 -106
- package/.claude/commands/agents/README.md +0 -10
- package/.claude/commands/agents/agent-capabilities.md +0 -21
- package/.claude/commands/agents/agent-coordination.md +0 -28
- package/.claude/commands/agents/agent-spawning.md +0 -28
- package/.claude/commands/agents/agent-types.md +0 -26
- package/.claude/commands/coordination/README.md +0 -9
- package/.claude/commands/coordination/agent-spawn.md +0 -25
- package/.claude/commands/coordination/init.md +0 -44
- package/.claude/commands/coordination/orchestrate.md +0 -43
- package/.claude/commands/coordination/spawn.md +0 -45
- package/.claude/commands/coordination/swarm-init.md +0 -85
- package/.claude/commands/coordination/task-orchestrate.md +0 -25
- package/.claude/commands/hive-mind/README.md +0 -17
- package/.claude/commands/hive-mind/hive-mind-consensus.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-init.md +0 -18
- package/.claude/commands/hive-mind/hive-mind-memory.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-metrics.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-resume.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-sessions.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-spawn.md +0 -21
- package/.claude/commands/hive-mind/hive-mind-status.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-stop.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-wizard.md +0 -8
- package/.claude/commands/hive-mind/hive-mind.md +0 -27
- package/.claude/commands/memory/README.md +0 -9
- package/.claude/commands/memory/memory-persist.md +0 -25
- package/.claude/commands/memory/memory-search.md +0 -25
- package/.claude/commands/memory/memory-usage.md +0 -25
- package/.claude/commands/memory/neural.md +0 -47
- package/.claude/commands/swarm/README.md +0 -15
- package/.claude/commands/swarm/swarm-analysis.md +0 -8
- package/.claude/commands/swarm/swarm-background.md +0 -8
- package/.claude/commands/swarm/swarm-init.md +0 -19
- package/.claude/commands/swarm/swarm-modes.md +0 -8
- package/.claude/commands/swarm/swarm-monitor.md +0 -8
- package/.claude/commands/swarm/swarm-spawn.md +0 -19
- package/.claude/commands/swarm/swarm-status.md +0 -8
- package/.claude/commands/swarm/swarm-strategies.md +0 -8
- package/.claude/commands/swarm/swarm.md +0 -27
- package/.claude/commands/training/README.md +0 -9
- package/.claude/commands/training/model-update.md +0 -25
- package/.claude/commands/training/neural-patterns.md +0 -74
- package/.claude/commands/training/neural-train.md +0 -25
- package/.claude/commands/training/pattern-learn.md +0 -25
- package/.claude/commands/training/specialization.md +0 -63
- package/.claude/commands/workflows/README.md +0 -9
- package/.claude/commands/workflows/development.md +0 -78
- package/.claude/commands/workflows/research.md +0 -63
- package/.claude/commands/workflows/workflow-create.md +0 -25
- package/.claude/commands/workflows/workflow-execute.md +0 -25
- package/.claude/commands/workflows/workflow-export.md +0 -25
- package/.claude/skills/agentic-jujutsu/SKILL.md +0 -645
- package/.claude/skills/hive-mind-advanced/SKILL.md +0 -712
- package/.claude/skills/iterative-loop/SKILL.md +0 -371
- package/.claude/skills/performance-analysis/SKILL.md +0 -569
- package/.claude/skills/performance-analysis/evals/performance-analysis.yaml +0 -144
- package/.claude/skills/performance-analysis/schemas/output.json +0 -588
- package/.claude/skills/performance-analysis/scripts/validate-config.json +0 -36
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Source Types (BMAD-005)
|
|
3
|
+
*/
|
|
4
|
+
export interface ContextRequest {
|
|
5
|
+
/** Target files to gather context for */
|
|
6
|
+
targetFiles: string[];
|
|
7
|
+
/** Agent type requesting context */
|
|
8
|
+
agentType: string;
|
|
9
|
+
/** Task description */
|
|
10
|
+
taskDescription: string;
|
|
11
|
+
/** Maximum token budget across all sources */
|
|
12
|
+
maxTokenBudget?: number;
|
|
13
|
+
/** Additional metadata */
|
|
14
|
+
metadata?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
export interface ContextFragment {
|
|
17
|
+
/** Source identifier */
|
|
18
|
+
sourceId: string;
|
|
19
|
+
/** Fragment title */
|
|
20
|
+
title: string;
|
|
21
|
+
/** Fragment content */
|
|
22
|
+
content: string;
|
|
23
|
+
/** Estimated token count (chars / 3.5 with safety margin) */
|
|
24
|
+
estimatedTokens: number;
|
|
25
|
+
/** Relevance score 0-1 */
|
|
26
|
+
relevance: number;
|
|
27
|
+
/** Metadata */
|
|
28
|
+
metadata?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
export interface ContextSource {
|
|
31
|
+
/** Source identifier */
|
|
32
|
+
id: string;
|
|
33
|
+
/** Human-readable name */
|
|
34
|
+
name: string;
|
|
35
|
+
/** Priority (higher = more important, included first) */
|
|
36
|
+
priority: number;
|
|
37
|
+
/** Maximum tokens this source can use */
|
|
38
|
+
maxTokens: number;
|
|
39
|
+
/** Gather context fragments */
|
|
40
|
+
gather(request: ContextRequest): Promise<ContextFragment[]>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -140,8 +140,9 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
|
140
140
|
console.log('[TestGenerationCoordinator] QEFlashAttention initialized for test-similarity');
|
|
141
141
|
}
|
|
142
142
|
catch (error) {
|
|
143
|
-
|
|
144
|
-
|
|
143
|
+
// Graceful degradation: native module may not be available on all platforms
|
|
144
|
+
console.warn('[TestGenerationCoordinator] QEFlashAttention unavailable (optional native module), continuing without it:', toErrorMessage(error));
|
|
145
|
+
this.flashAttention = null;
|
|
145
146
|
}
|
|
146
147
|
}
|
|
147
148
|
// Initialize Decision Transformer for test case selection
|
|
@@ -155,8 +156,9 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
|
155
156
|
console.log('[TestGenerationCoordinator] DecisionTransformer created for test case selection');
|
|
156
157
|
}
|
|
157
158
|
catch (error) {
|
|
158
|
-
|
|
159
|
-
|
|
159
|
+
// Graceful degradation: native module may not be available on all platforms
|
|
160
|
+
console.warn('[TestGenerationCoordinator] DecisionTransformer unavailable (optional native module), continuing without it:', toErrorMessage(error));
|
|
161
|
+
this.decisionTransformer = null;
|
|
160
162
|
}
|
|
161
163
|
}
|
|
162
164
|
// Subscribe to relevant events
|
|
@@ -176,4 +176,9 @@ export declare function createQualityFeedbackLoop(config?: Partial<FeedbackConfi
|
|
|
176
176
|
* Create and initialize a quality feedback loop with DB persistence
|
|
177
177
|
*/
|
|
178
178
|
export declare function createInitializedFeedbackLoop(config?: Partial<FeedbackConfig>): Promise<QualityFeedbackLoop>;
|
|
179
|
+
/**
|
|
180
|
+
* Get the initialized feedback loop singleton.
|
|
181
|
+
* Returns null if not yet initialized (call createInitializedFeedbackLoop first).
|
|
182
|
+
*/
|
|
183
|
+
export declare function getQualityFeedbackLoop(): QualityFeedbackLoop | null;
|
|
179
184
|
//# sourceMappingURL=feedback-loop.d.ts.map
|
|
@@ -295,6 +295,18 @@ export function createQualityFeedbackLoop(config) {
|
|
|
295
295
|
export async function createInitializedFeedbackLoop(config) {
|
|
296
296
|
const loop = new QualityFeedbackLoop(config);
|
|
297
297
|
await loop.initialize();
|
|
298
|
+
_feedbackLoopInstance = loop;
|
|
298
299
|
return loop;
|
|
299
300
|
}
|
|
301
|
+
// ============================================================================
|
|
302
|
+
// Singleton accessor for cross-module integration
|
|
303
|
+
// ============================================================================
|
|
304
|
+
let _feedbackLoopInstance = null;
|
|
305
|
+
/**
|
|
306
|
+
* Get the initialized feedback loop singleton.
|
|
307
|
+
* Returns null if not yet initialized (call createInitializedFeedbackLoop first).
|
|
308
|
+
*/
|
|
309
|
+
export function getQualityFeedbackLoop() {
|
|
310
|
+
return _feedbackLoopInstance;
|
|
311
|
+
}
|
|
300
312
|
//# sourceMappingURL=feedback-loop.js.map
|
package/dist/feedback/index.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export { CoverageLearner, createCoverageLearner, } from './coverage-learner.js';
|
|
|
11
11
|
export { QualityScoreCalculator, createQualityScoreCalculator, } from './quality-score-calculator.js';
|
|
12
12
|
export { PatternPromotionManager, createPatternPromotionManager, } from './pattern-promotion.js';
|
|
13
13
|
export type { PatternMetrics } from './pattern-promotion.js';
|
|
14
|
-
export { QualityFeedbackLoop, createQualityFeedbackLoop, createInitializedFeedbackLoop, } from './feedback-loop.js';
|
|
14
|
+
export { QualityFeedbackLoop, createQualityFeedbackLoop, createInitializedFeedbackLoop, getQualityFeedbackLoop, } from './feedback-loop.js';
|
|
15
15
|
export type { FeedbackLoopStats, RoutingAnalysis, RoutingOutcomeInput, } from './feedback-loop.js';
|
|
16
16
|
export { RoutingFeedbackCollector, createRoutingFeedbackCollector, } from '../routing/routing-feedback.js';
|
|
17
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/feedback/index.js
CHANGED
|
@@ -14,7 +14,7 @@ export { QualityScoreCalculator, createQualityScoreCalculator, } from './quality
|
|
|
14
14
|
// Pattern Promotion Manager
|
|
15
15
|
export { PatternPromotionManager, createPatternPromotionManager, } from './pattern-promotion.js';
|
|
16
16
|
// Main Feedback Loop Integrator
|
|
17
|
-
export { QualityFeedbackLoop, createQualityFeedbackLoop, createInitializedFeedbackLoop, } from './feedback-loop.js';
|
|
17
|
+
export { QualityFeedbackLoop, createQualityFeedbackLoop, createInitializedFeedbackLoop, getQualityFeedbackLoop, } from './feedback-loop.js';
|
|
18
18
|
// Re-export routing feedback for direct access
|
|
19
19
|
export { RoutingFeedbackCollector, createRoutingFeedbackCollector, } from '../routing/routing-feedback.js';
|
|
20
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -17,6 +17,10 @@ export interface AgentsInstallResult {
|
|
|
17
17
|
errors: string[];
|
|
18
18
|
totalCount: number;
|
|
19
19
|
agentsDir: string;
|
|
20
|
+
/** Agents that had customization overlays applied */
|
|
21
|
+
overlaysApplied?: string[];
|
|
22
|
+
/** Warnings from overlay loading */
|
|
23
|
+
overlayWarnings?: string[];
|
|
20
24
|
}
|
|
21
25
|
export interface AgentsInstallerOptions {
|
|
22
26
|
/** Project root directory */
|
|
@@ -43,6 +47,11 @@ export declare class AgentsInstaller {
|
|
|
43
47
|
* PRIORITY: assets directory (has helpers) > root .claude (no helpers)
|
|
44
48
|
*/
|
|
45
49
|
private findSourceAgentsDir;
|
|
50
|
+
/**
|
|
51
|
+
* Ensure the agent-overrides directory exists and is preserved during install.
|
|
52
|
+
* This directory holds user customization overlays that survive `aqe init`.
|
|
53
|
+
*/
|
|
54
|
+
private preserveOverridesDir;
|
|
46
55
|
/**
|
|
47
56
|
* Install agents to the project
|
|
48
57
|
*/
|
|
@@ -9,6 +9,7 @@ import { existsSync, mkdirSync, readdirSync, statSync, readFileSync, writeFileSy
|
|
|
9
9
|
import { join, dirname } from 'path';
|
|
10
10
|
import { fileURLToPath } from 'url';
|
|
11
11
|
import { toErrorMessage } from '../shared/error-utils.js';
|
|
12
|
+
import { loadOverlays, applyOverlayToContent } from '../agents/overlay-loader.js';
|
|
12
13
|
// ============================================================================
|
|
13
14
|
// Agent Categories
|
|
14
15
|
// ============================================================================
|
|
@@ -169,6 +170,30 @@ export class AgentsInstaller {
|
|
|
169
170
|
// If no agents found, return the first path (will fail gracefully)
|
|
170
171
|
return possiblePaths[0];
|
|
171
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Ensure the agent-overrides directory exists and is preserved during install.
|
|
175
|
+
* This directory holds user customization overlays that survive `aqe init`.
|
|
176
|
+
*/
|
|
177
|
+
preserveOverridesDir() {
|
|
178
|
+
const overridesDir = join(this.projectRoot, '.claude', 'agent-overrides');
|
|
179
|
+
if (!existsSync(overridesDir)) {
|
|
180
|
+
mkdirSync(overridesDir, { recursive: true });
|
|
181
|
+
}
|
|
182
|
+
// Copy the example overlay template if not already present
|
|
183
|
+
const exampleDest = join(overridesDir, '_example.yaml');
|
|
184
|
+
if (!existsSync(exampleDest)) {
|
|
185
|
+
const templateSources = [
|
|
186
|
+
join(__dirname, '..', '..', 'assets', 'templates', 'agent-override-example.yaml'),
|
|
187
|
+
join(__dirname, '..', 'assets', 'templates', 'agent-override-example.yaml'),
|
|
188
|
+
];
|
|
189
|
+
for (const src of templateSources) {
|
|
190
|
+
if (existsSync(src)) {
|
|
191
|
+
copyFileSync(src, exampleDest);
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
172
197
|
/**
|
|
173
198
|
* Install agents to the project
|
|
174
199
|
*/
|
|
@@ -179,7 +204,11 @@ export class AgentsInstaller {
|
|
|
179
204
|
errors: [],
|
|
180
205
|
totalCount: 0,
|
|
181
206
|
agentsDir: join(this.projectRoot, '.claude', 'agents', 'v3'),
|
|
207
|
+
overlaysApplied: [],
|
|
208
|
+
overlayWarnings: [],
|
|
182
209
|
};
|
|
210
|
+
// Preserve the agent-overrides directory (survives reinstall)
|
|
211
|
+
this.preserveOverridesDir();
|
|
183
212
|
// Check if source agents exist
|
|
184
213
|
if (!existsSync(this.sourceAgentsDir)) {
|
|
185
214
|
result.errors.push(`Source agents directory not found: ${this.sourceAgentsDir}`);
|
|
@@ -219,6 +248,49 @@ export class AgentsInstaller {
|
|
|
219
248
|
result.errors.push(`Failed to install ${agentName}: ${toErrorMessage(error)}`);
|
|
220
249
|
}
|
|
221
250
|
}
|
|
251
|
+
// Load and apply agent customization overlays (BMAD-002)
|
|
252
|
+
const overlayResult = loadOverlays(this.projectRoot);
|
|
253
|
+
if (overlayResult.warnings.length > 0) {
|
|
254
|
+
result.overlayWarnings = overlayResult.warnings;
|
|
255
|
+
for (const warning of overlayResult.warnings) {
|
|
256
|
+
console.error(`[AgentsInstaller] Overlay warning: ${warning}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (overlayResult.errors.length > 0) {
|
|
260
|
+
for (const error of overlayResult.errors) {
|
|
261
|
+
result.errors.push(`Overlay error: ${error}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Apply overlays to installed agent files
|
|
265
|
+
for (const overlay of overlayResult.overlays) {
|
|
266
|
+
const agentName = overlay.agent;
|
|
267
|
+
const isSubagent = V3_SUBAGENTS.includes(agentName);
|
|
268
|
+
const agentFile = isSubagent
|
|
269
|
+
? join(targetSubagentsDir, `${agentName}.md`)
|
|
270
|
+
: join(targetAgentsDir, `${agentName}.md`);
|
|
271
|
+
if (!existsSync(agentFile)) {
|
|
272
|
+
result.overlayWarnings.push(`Overlay for "${agentName}" found but agent file does not exist. Skipping.`);
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
try {
|
|
276
|
+
const agentContent = readFileSync(agentFile, 'utf-8');
|
|
277
|
+
const { content: modifiedContent, applied } = applyOverlayToContent(agentContent, overlay);
|
|
278
|
+
writeFileSync(agentFile, modifiedContent, 'utf-8');
|
|
279
|
+
result.overlaysApplied.push(agentName);
|
|
280
|
+
const changes = [
|
|
281
|
+
...applied.replacedFields.map(f => `replaced:${f}`),
|
|
282
|
+
...applied.appendedFields.map(f => `appended:${f}`),
|
|
283
|
+
...applied.configOverrides.map(f => `config:${f}`),
|
|
284
|
+
];
|
|
285
|
+
console.error(`[AgentsInstaller] Applied overlay for ${agentName}: ${changes.join(', ')}`);
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
result.overlayWarnings.push(`Failed to apply overlay for "${agentName}": ${toErrorMessage(error)}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (result.overlaysApplied.length > 0) {
|
|
292
|
+
console.error(`[AgentsInstaller] Applied ${result.overlaysApplied.length} agent overlay(s): ${result.overlaysApplied.join(', ')}`);
|
|
293
|
+
}
|
|
222
294
|
// Create agents index file
|
|
223
295
|
await this.createAgentsIndex(targetAgentsDir, result.installed);
|
|
224
296
|
return result;
|
|
@@ -46,6 +46,17 @@ export declare class HooksPhase extends BasePhase<HooksResult> {
|
|
|
46
46
|
* verifies the checkpoint exists on session start.
|
|
47
47
|
*/
|
|
48
48
|
private installBrainCheckpoint;
|
|
49
|
+
/**
|
|
50
|
+
* Install the statusline-v3.cjs helper into .claude/helpers/.
|
|
51
|
+
* This script generates a dynamic status line for Claude Code showing
|
|
52
|
+
* fleet status, learning metrics, domain progress, and architecture info.
|
|
53
|
+
*/
|
|
54
|
+
private installStatusline;
|
|
55
|
+
/**
|
|
56
|
+
* Generate a minimal statusline-v3.cjs script as a fallback.
|
|
57
|
+
* Used when the full asset isn't available for copying.
|
|
58
|
+
*/
|
|
59
|
+
private generateMinimalStatuslineScript;
|
|
49
60
|
/**
|
|
50
61
|
* Generate the brain-checkpoint.cjs script inline.
|
|
51
62
|
* Used when the source file isn't available for copying.
|
|
@@ -153,6 +153,8 @@ export class HooksPhase extends BasePhase {
|
|
|
153
153
|
const { projectRoot } = context;
|
|
154
154
|
// Install brain-checkpoint helper into .claude/helpers/
|
|
155
155
|
this.installBrainCheckpoint(projectRoot, context);
|
|
156
|
+
// Install statusline-v3 helper into .claude/helpers/
|
|
157
|
+
this.installStatusline(projectRoot, context);
|
|
156
158
|
// Install cross-phase memory config
|
|
157
159
|
const crossPhasePath = join(hooksDir, 'cross-phase-memory.yaml');
|
|
158
160
|
if (!existsSync(crossPhasePath)) {
|
|
@@ -241,6 +243,71 @@ export class HooksPhase extends BasePhase {
|
|
|
241
243
|
context.services.log(' Installed brain-checkpoint.cjs (generated)');
|
|
242
244
|
}
|
|
243
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Install the statusline-v3.cjs helper into .claude/helpers/.
|
|
248
|
+
* This script generates a dynamic status line for Claude Code showing
|
|
249
|
+
* fleet status, learning metrics, domain progress, and architecture info.
|
|
250
|
+
*/
|
|
251
|
+
installStatusline(projectRoot, context) {
|
|
252
|
+
const helpersDir = join(projectRoot, '.claude', 'helpers');
|
|
253
|
+
if (!existsSync(helpersDir)) {
|
|
254
|
+
mkdirSync(helpersDir, { recursive: true });
|
|
255
|
+
}
|
|
256
|
+
const destPath = join(helpersDir, 'statusline-v3.cjs');
|
|
257
|
+
// Try to copy from distributed assets or our own installation
|
|
258
|
+
const sourcePaths = [
|
|
259
|
+
join(projectRoot, 'node_modules', 'agentic-qe', 'assets', 'helpers', 'statusline-v3.cjs'),
|
|
260
|
+
join(projectRoot, 'assets', 'helpers', 'statusline-v3.cjs'),
|
|
261
|
+
];
|
|
262
|
+
for (const src of sourcePaths) {
|
|
263
|
+
if (existsSync(src) && src !== destPath) {
|
|
264
|
+
const { copyFileSync } = require('fs');
|
|
265
|
+
copyFileSync(src, destPath);
|
|
266
|
+
context.services.log(' Installed statusline-v3.cjs (copied)');
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// If not available from source, generate a minimal fallback
|
|
271
|
+
if (!existsSync(destPath)) {
|
|
272
|
+
writeFileSync(destPath, this.generateMinimalStatuslineScript(), 'utf-8');
|
|
273
|
+
context.services.log(' Installed statusline-v3.cjs (generated)');
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Generate a minimal statusline-v3.cjs script as a fallback.
|
|
278
|
+
* Used when the full asset isn't available for copying.
|
|
279
|
+
*/
|
|
280
|
+
generateMinimalStatuslineScript() {
|
|
281
|
+
return `#!/usr/bin/env node
|
|
282
|
+
/**
|
|
283
|
+
* Agentic QE v3 Statusline (minimal fallback, generated by aqe init)
|
|
284
|
+
* For the full statusline, reinstall: npx agentic-qe init --auto
|
|
285
|
+
*/
|
|
286
|
+
const fs = require('fs');
|
|
287
|
+
const path = require('path');
|
|
288
|
+
const { execSync } = require('child_process');
|
|
289
|
+
|
|
290
|
+
function q(cmd, d) { try { return execSync(cmd, { encoding: 'utf-8', timeout: 3000 }).trim(); } catch { return d || ''; } }
|
|
291
|
+
|
|
292
|
+
const dir = process.cwd();
|
|
293
|
+
const dbPath = path.join(dir, '.agentic-qe', 'memory.db');
|
|
294
|
+
let patterns = 0;
|
|
295
|
+
try {
|
|
296
|
+
if (fs.existsSync(dbPath)) {
|
|
297
|
+
const Database = require('better-sqlite3');
|
|
298
|
+
const db = new Database(dbPath, { readonly: true, fileMustExist: true });
|
|
299
|
+
patterns = db.prepare('SELECT COUNT(*) AS c FROM qe_patterns').get()?.c || 0;
|
|
300
|
+
db.close();
|
|
301
|
+
}
|
|
302
|
+
} catch { /* ignore */ }
|
|
303
|
+
|
|
304
|
+
const branch = q('git branch --show-current 2>/dev/null');
|
|
305
|
+
const branchStr = branch ? \` \\x1b[34m⎇ \${branch}\\x1b[0m\` : '';
|
|
306
|
+
const patStr = patterns > 0 ? \` \\x1b[35m🎓 \${patterns} patterns\\x1b[0m\` : '';
|
|
307
|
+
|
|
308
|
+
console.log(\`\\x1b[1m\\x1b[35m▊ Agentic QE v3\\x1b[0m\${branchStr}\${patStr}\`);
|
|
309
|
+
`;
|
|
310
|
+
}
|
|
244
311
|
/**
|
|
245
312
|
* Generate the brain-checkpoint.cjs script inline.
|
|
246
313
|
* Used when the source file isn't available for copying.
|
|
@@ -8,6 +8,7 @@ import { BasePhase, } from './phase-interface.js';
|
|
|
8
8
|
import { createSkillsInstaller } from '../skills-installer.js';
|
|
9
9
|
import { createAgentsInstaller } from '../agents-installer.js';
|
|
10
10
|
import { createN8nInstaller } from '../n8n-installer.js';
|
|
11
|
+
import { initializeOverlays } from '../../routing/qe-agent-registry.js';
|
|
11
12
|
/**
|
|
12
13
|
* Assets phase - installs skills and agents
|
|
13
14
|
*/
|
|
@@ -66,6 +67,8 @@ export class AssetsPhase extends BasePhase {
|
|
|
66
67
|
if (agentsResult.errors.length > 0) {
|
|
67
68
|
context.services.warn(`Agents warnings: ${agentsResult.errors.join(', ')}`);
|
|
68
69
|
}
|
|
70
|
+
// Initialize overlay configs in agent registry for runtime use
|
|
71
|
+
initializeOverlays(projectRoot);
|
|
69
72
|
// Install n8n platform (optional)
|
|
70
73
|
if (options.withN8n) {
|
|
71
74
|
const n8nInstaller = createN8nInstaller({
|
|
@@ -95,7 +95,7 @@ export function generateV3SettingsSections(config) {
|
|
|
95
95
|
},
|
|
96
96
|
statusLine: {
|
|
97
97
|
type: 'command',
|
|
98
|
-
command: 'node .claude/helpers/statusline-v3.cjs 2>/dev/null ||
|
|
98
|
+
command: 'node .claude/helpers/statusline-v3.cjs 2>/dev/null || echo "▊ Agentic QE v3"',
|
|
99
99
|
refreshMs: 5000,
|
|
100
100
|
enabled: true,
|
|
101
101
|
},
|
|
@@ -31,6 +31,9 @@ export declare class HnswAdapter implements IHnswIndexProvider {
|
|
|
31
31
|
constructor(name: string, config?: Partial<HnswConfig>);
|
|
32
32
|
add(id: number, vector: Float32Array, metadata?: Record<string, unknown>): void;
|
|
33
33
|
search(query: Float32Array, k: number): SearchResult[];
|
|
34
|
+
/** Last search latency in ms, for instrumentation */
|
|
35
|
+
private _lastSearchLatencyMs;
|
|
36
|
+
get lastSearchLatencyMs(): number;
|
|
34
37
|
remove(id: number): boolean;
|
|
35
38
|
size(): number;
|
|
36
39
|
dimensions(): number;
|
|
@@ -76,8 +76,18 @@ export class HnswAdapter {
|
|
|
76
76
|
this.backend.add(id, vector, metadata);
|
|
77
77
|
}
|
|
78
78
|
search(query, k) {
|
|
79
|
-
|
|
79
|
+
const start = performance.now();
|
|
80
|
+
const results = this.backend.search(query, k);
|
|
81
|
+
const elapsed = performance.now() - start;
|
|
82
|
+
if (elapsed > 50) {
|
|
83
|
+
console.warn(`[HNSW] search took ${elapsed.toFixed(1)}ms (k=${k}, results=${results.length})`);
|
|
84
|
+
}
|
|
85
|
+
this._lastSearchLatencyMs = elapsed;
|
|
86
|
+
return results;
|
|
80
87
|
}
|
|
88
|
+
/** Last search latency in ms, for instrumentation */
|
|
89
|
+
_lastSearchLatencyMs = 0;
|
|
90
|
+
get lastSearchLatencyMs() { return this._lastSearchLatencyMs; }
|
|
81
91
|
remove(id) {
|
|
82
92
|
return this.backend.remove(id);
|
|
83
93
|
}
|
|
@@ -17,6 +17,6 @@ export declare const QE_PATTERNS_SCHEMA = "\n -- QE Patterns table (unified fro
|
|
|
17
17
|
export declare const MINCUT_SCHEMA = "\n -- MinCut Graph Snapshots (ADR-047)\n CREATE TABLE IF NOT EXISTS mincut_snapshots (\n id TEXT PRIMARY KEY,\n timestamp TEXT NOT NULL DEFAULT (datetime('now')),\n vertex_count INTEGER NOT NULL,\n edge_count INTEGER NOT NULL,\n total_weight REAL NOT NULL DEFAULT 0.0,\n is_connected INTEGER NOT NULL DEFAULT 1,\n component_count INTEGER NOT NULL DEFAULT 1,\n vertices_json TEXT NOT NULL,\n edges_json TEXT NOT NULL,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- MinCut History (time-series MinCut values)\n CREATE TABLE IF NOT EXISTS mincut_history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp TEXT NOT NULL DEFAULT (datetime('now')),\n mincut_value REAL NOT NULL,\n vertex_count INTEGER NOT NULL,\n edge_count INTEGER NOT NULL,\n algorithm TEXT NOT NULL DEFAULT 'weighted-degree',\n duration_ms INTEGER,\n snapshot_id TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n FOREIGN KEY (snapshot_id) REFERENCES mincut_snapshots(id) ON DELETE SET NULL\n );\n\n -- MinCut Weak Vertices (detected bottlenecks)\n CREATE TABLE IF NOT EXISTS mincut_weak_vertices (\n id TEXT PRIMARY KEY,\n vertex_id TEXT NOT NULL,\n weighted_degree REAL NOT NULL,\n risk_score REAL NOT NULL,\n reason TEXT NOT NULL,\n domain TEXT,\n vertex_type TEXT NOT NULL,\n suggestions_json TEXT,\n detected_at TEXT NOT NULL DEFAULT (datetime('now')),\n resolved_at TEXT,\n snapshot_id TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n FOREIGN KEY (snapshot_id) REFERENCES mincut_snapshots(id) ON DELETE SET NULL\n );\n\n -- MinCut Alerts\n CREATE TABLE IF NOT EXISTS mincut_alerts (\n id TEXT PRIMARY KEY,\n severity TEXT NOT NULL,\n message TEXT NOT NULL,\n mincut_value REAL NOT NULL,\n threshold REAL NOT NULL,\n affected_vertices_json TEXT,\n remediations_json TEXT,\n acknowledged INTEGER DEFAULT 0,\n acknowledged_at TEXT,\n acknowledged_by TEXT,\n timestamp TEXT NOT NULL DEFAULT (datetime('now')),\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- MinCut Healing Actions (self-healing history)\n CREATE TABLE IF NOT EXISTS mincut_healing_actions (\n id TEXT PRIMARY KEY,\n action_type TEXT NOT NULL,\n action_params_json TEXT NOT NULL,\n success INTEGER NOT NULL,\n mincut_before REAL NOT NULL,\n mincut_after REAL NOT NULL,\n improvement REAL NOT NULL DEFAULT 0.0,\n error_message TEXT,\n duration_ms INTEGER NOT NULL,\n triggered_by TEXT,\n snapshot_before_id TEXT,\n snapshot_after_id TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n FOREIGN KEY (snapshot_before_id) REFERENCES mincut_snapshots(id) ON DELETE SET NULL,\n FOREIGN KEY (snapshot_after_id) REFERENCES mincut_snapshots(id) ON DELETE SET NULL\n );\n\n -- MinCut Strange Loop Observations (P1: self-organizing)\n CREATE TABLE IF NOT EXISTS mincut_observations (\n id TEXT PRIMARY KEY,\n iteration INTEGER NOT NULL,\n mincut_value REAL NOT NULL,\n weak_vertex_count INTEGER NOT NULL DEFAULT 0,\n weak_vertices_json TEXT,\n snapshot_id TEXT,\n prediction_json TEXT,\n actual_vs_predicted_diff REAL,\n timestamp TEXT NOT NULL DEFAULT (datetime('now')),\n FOREIGN KEY (snapshot_id) REFERENCES mincut_snapshots(id) ON DELETE SET NULL\n );\n\n -- MinCut Indexes\n CREATE INDEX IF NOT EXISTS idx_mincut_history_timestamp ON mincut_history(timestamp DESC);\n CREATE INDEX IF NOT EXISTS idx_mincut_history_value ON mincut_history(mincut_value);\n CREATE INDEX IF NOT EXISTS idx_mincut_weak_vertex ON mincut_weak_vertices(vertex_id);\n CREATE INDEX IF NOT EXISTS idx_mincut_weak_risk ON mincut_weak_vertices(risk_score DESC);\n CREATE INDEX IF NOT EXISTS idx_mincut_weak_resolved ON mincut_weak_vertices(resolved_at);\n CREATE INDEX IF NOT EXISTS idx_mincut_alerts_severity ON mincut_alerts(severity);\n CREATE INDEX IF NOT EXISTS idx_mincut_alerts_ack ON mincut_alerts(acknowledged);\n CREATE INDEX IF NOT EXISTS idx_mincut_healing_type ON mincut_healing_actions(action_type);\n CREATE INDEX IF NOT EXISTS idx_mincut_healing_success ON mincut_healing_actions(success);\n CREATE INDEX IF NOT EXISTS idx_mincut_observations_iter ON mincut_observations(iteration);\n";
|
|
18
18
|
export declare const SONA_PATTERNS_SCHEMA = "\n -- SONA Patterns table (ADR-046: Pattern Persistence for Neural Backbone)\n CREATE TABLE IF NOT EXISTS sona_patterns (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n domain TEXT NOT NULL,\n state_embedding BLOB,\n action_embedding BLOB,\n action_type TEXT NOT NULL,\n action_value TEXT,\n outcome_reward REAL NOT NULL DEFAULT 0.0,\n outcome_success INTEGER NOT NULL DEFAULT 0,\n outcome_quality REAL NOT NULL DEFAULT 0.0,\n confidence REAL DEFAULT 0.5,\n usage_count INTEGER DEFAULT 0,\n success_count INTEGER DEFAULT 0,\n failure_count INTEGER DEFAULT 0,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n last_used_at TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_sona_patterns_type ON sona_patterns(type);\n CREATE INDEX IF NOT EXISTS idx_sona_patterns_domain ON sona_patterns(domain);\n CREATE INDEX IF NOT EXISTS idx_sona_patterns_confidence ON sona_patterns(confidence DESC);\n CREATE INDEX IF NOT EXISTS idx_sona_patterns_updated ON sona_patterns(updated_at DESC);\n";
|
|
19
19
|
export declare const WITNESS_CHAIN_SCHEMA = "\n -- Witness Chain (ADR-070: Cryptographic audit trail for QE decisions)\n CREATE TABLE IF NOT EXISTS witness_chain (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n prev_hash TEXT NOT NULL,\n action_hash TEXT NOT NULL,\n action_type TEXT NOT NULL,\n action_data TEXT,\n timestamp TEXT NOT NULL,\n actor TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_witness_action_type ON witness_chain(action_type);\n CREATE INDEX IF NOT EXISTS idx_witness_timestamp ON witness_chain(timestamp);\n";
|
|
20
|
-
export declare const FEEDBACK_SCHEMA = "\n -- Test outcomes (ADR-023: Quality Feedback Loop)\n CREATE TABLE IF NOT EXISTS test_outcomes (\n id TEXT PRIMARY KEY,\n test_id TEXT NOT NULL,\n test_name TEXT NOT NULL,\n generated_by TEXT NOT NULL,\n pattern_id TEXT,\n framework TEXT NOT NULL,\n language TEXT NOT NULL,\n domain TEXT NOT NULL,\n passed INTEGER NOT NULL,\n error_message TEXT,\n coverage_lines REAL DEFAULT 0,\n coverage_branches REAL DEFAULT 0,\n coverage_functions REAL DEFAULT 0,\n mutation_score REAL,\n execution_time_ms REAL NOT NULL,\n flaky INTEGER DEFAULT 0,\n flakiness_score REAL,\n maintainability_score REAL NOT NULL,\n complexity REAL,\n lines_of_code INTEGER,\n assertion_count INTEGER,\n file_path TEXT,\n source_file_path TEXT,\n metadata_json TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n CREATE INDEX IF NOT EXISTS idx_test_outcomes_pattern ON test_outcomes(pattern_id);\n CREATE INDEX IF NOT EXISTS idx_test_outcomes_agent ON test_outcomes(generated_by);\n CREATE INDEX IF NOT EXISTS idx_test_outcomes_domain ON test_outcomes(domain);\n CREATE INDEX IF NOT EXISTS idx_test_outcomes_created ON test_outcomes(created_at);\n\n -- Routing outcomes (ADR-022: Adaptive QE Agent Routing)\n CREATE TABLE IF NOT EXISTS routing_outcomes (\n id TEXT PRIMARY KEY,\n task_json TEXT NOT NULL,\n decision_json TEXT NOT NULL,\n used_agent TEXT NOT NULL,\n followed_recommendation INTEGER NOT NULL,\n success INTEGER NOT NULL,\n quality_score REAL NOT NULL,\n duration_ms REAL NOT NULL,\n error TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n CREATE INDEX IF NOT EXISTS idx_routing_outcomes_agent ON routing_outcomes(used_agent);\n CREATE INDEX IF NOT EXISTS idx_routing_outcomes_created ON routing_outcomes(created_at);\n\n -- Coverage sessions (ADR-023: Coverage Learning)\n CREATE TABLE IF NOT EXISTS coverage_sessions (\n id TEXT PRIMARY KEY,\n target_path TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n technique TEXT NOT NULL,\n before_lines REAL DEFAULT 0,\n before_branches REAL DEFAULT 0,\n before_functions REAL DEFAULT 0,\n after_lines REAL DEFAULT 0,\n after_branches REAL DEFAULT 0,\n after_functions REAL DEFAULT 0,\n tests_generated INTEGER DEFAULT 0,\n tests_passed INTEGER DEFAULT 0,\n gaps_json TEXT,\n duration_ms REAL NOT NULL,\n started_at TEXT NOT NULL,\n completed_at TEXT NOT NULL,\n context_json TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n CREATE INDEX IF NOT EXISTS idx_coverage_sessions_technique ON coverage_sessions(technique);\n CREATE INDEX IF NOT EXISTS idx_coverage_sessions_agent ON coverage_sessions(agent_id);\n CREATE INDEX IF NOT EXISTS idx_coverage_sessions_created ON coverage_sessions(created_at);\n";
|
|
20
|
+
export declare const FEEDBACK_SCHEMA = "\n -- Test outcomes (ADR-023: Quality Feedback Loop)\n CREATE TABLE IF NOT EXISTS test_outcomes (\n id TEXT PRIMARY KEY,\n test_id TEXT NOT NULL,\n test_name TEXT NOT NULL,\n generated_by TEXT NOT NULL,\n pattern_id TEXT,\n framework TEXT NOT NULL,\n language TEXT NOT NULL,\n domain TEXT NOT NULL,\n passed INTEGER NOT NULL,\n error_message TEXT,\n coverage_lines REAL DEFAULT 0,\n coverage_branches REAL DEFAULT 0,\n coverage_functions REAL DEFAULT 0,\n mutation_score REAL,\n execution_time_ms REAL NOT NULL,\n flaky INTEGER DEFAULT 0,\n flakiness_score REAL,\n maintainability_score REAL NOT NULL,\n complexity REAL,\n lines_of_code INTEGER,\n assertion_count INTEGER,\n file_path TEXT,\n source_file_path TEXT,\n metadata_json TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n CREATE INDEX IF NOT EXISTS idx_test_outcomes_pattern ON test_outcomes(pattern_id);\n CREATE INDEX IF NOT EXISTS idx_test_outcomes_agent ON test_outcomes(generated_by);\n CREATE INDEX IF NOT EXISTS idx_test_outcomes_domain ON test_outcomes(domain);\n CREATE INDEX IF NOT EXISTS idx_test_outcomes_created ON test_outcomes(created_at);\n\n -- Routing outcomes (ADR-022: Adaptive QE Agent Routing)\n CREATE TABLE IF NOT EXISTS routing_outcomes (\n id TEXT PRIMARY KEY,\n task_json TEXT NOT NULL,\n decision_json TEXT NOT NULL,\n used_agent TEXT NOT NULL,\n followed_recommendation INTEGER NOT NULL,\n success INTEGER NOT NULL,\n quality_score REAL NOT NULL,\n duration_ms REAL NOT NULL,\n error TEXT,\n model_tier TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n CREATE INDEX IF NOT EXISTS idx_routing_outcomes_agent ON routing_outcomes(used_agent);\n CREATE INDEX IF NOT EXISTS idx_routing_outcomes_created ON routing_outcomes(created_at);\n CREATE INDEX IF NOT EXISTS idx_routing_outcomes_tier ON routing_outcomes(model_tier);\n\n -- Coverage sessions (ADR-023: Coverage Learning)\n CREATE TABLE IF NOT EXISTS coverage_sessions (\n id TEXT PRIMARY KEY,\n target_path TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n technique TEXT NOT NULL,\n before_lines REAL DEFAULT 0,\n before_branches REAL DEFAULT 0,\n before_functions REAL DEFAULT 0,\n after_lines REAL DEFAULT 0,\n after_branches REAL DEFAULT 0,\n after_functions REAL DEFAULT 0,\n tests_generated INTEGER DEFAULT 0,\n tests_passed INTEGER DEFAULT 0,\n gaps_json TEXT,\n duration_ms REAL NOT NULL,\n started_at TEXT NOT NULL,\n completed_at TEXT NOT NULL,\n context_json TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n CREATE INDEX IF NOT EXISTS idx_coverage_sessions_technique ON coverage_sessions(technique);\n CREATE INDEX IF NOT EXISTS idx_coverage_sessions_agent ON coverage_sessions(agent_id);\n CREATE INDEX IF NOT EXISTS idx_coverage_sessions_created ON coverage_sessions(created_at);\n";
|
|
21
21
|
export declare const STATS_TABLES: string[];
|
|
22
22
|
//# sourceMappingURL=unified-memory-schemas.d.ts.map
|
|
@@ -551,10 +551,12 @@ export const FEEDBACK_SCHEMA = `
|
|
|
551
551
|
quality_score REAL NOT NULL,
|
|
552
552
|
duration_ms REAL NOT NULL,
|
|
553
553
|
error TEXT,
|
|
554
|
+
model_tier TEXT,
|
|
554
555
|
created_at TEXT DEFAULT (datetime('now'))
|
|
555
556
|
);
|
|
556
557
|
CREATE INDEX IF NOT EXISTS idx_routing_outcomes_agent ON routing_outcomes(used_agent);
|
|
557
558
|
CREATE INDEX IF NOT EXISTS idx_routing_outcomes_created ON routing_outcomes(created_at);
|
|
559
|
+
CREATE INDEX IF NOT EXISTS idx_routing_outcomes_tier ON routing_outcomes(model_tier);
|
|
558
560
|
|
|
559
561
|
-- Coverage sessions (ADR-023: Coverage Learning)
|
|
560
562
|
CREATE TABLE IF NOT EXISTS coverage_sessions (
|
|
@@ -25,6 +25,7 @@ import Database from 'better-sqlite3';
|
|
|
25
25
|
import { safeJsonParse } from '../shared/safe-json.js';
|
|
26
26
|
import { toErrorMessage } from '../shared/error-utils.js';
|
|
27
27
|
import * as fs from 'fs';
|
|
28
|
+
import * as os from 'os';
|
|
28
29
|
import * as path from 'path';
|
|
29
30
|
import { MEMORY_CONSTANTS } from './constants.js';
|
|
30
31
|
import { LoggerFactory } from '../logging/index.js';
|
|
@@ -207,6 +208,11 @@ export class UnifiedMemoryManager {
|
|
|
207
208
|
UnifiedMemoryManager.instance = null;
|
|
208
209
|
}
|
|
209
210
|
UnifiedMemoryManager.instancePromise = null;
|
|
211
|
+
// CRITICAL: Clear the cached project root so the next getInstance() call
|
|
212
|
+
// re-reads AQE_PROJECT_ROOT from the environment. Without this, tests that
|
|
213
|
+
// call resetUnifiedMemory() would still use the stale cached path, potentially
|
|
214
|
+
// opening the production database instead of the test database.
|
|
215
|
+
clearProjectRootCache();
|
|
210
216
|
}
|
|
211
217
|
async initialize() {
|
|
212
218
|
if (this.initialized)
|
|
@@ -220,6 +226,25 @@ export class UnifiedMemoryManager {
|
|
|
220
226
|
if (this.initialized)
|
|
221
227
|
return;
|
|
222
228
|
try {
|
|
229
|
+
// SAFETY: Detect test processes trying to open the production DB.
|
|
230
|
+
// If AQE_PROJECT_ROOT is set to a temp dir (vitest isolation) but the
|
|
231
|
+
// dbPath resolves to the REAL project's .agentic-qe/memory.db, redirect.
|
|
232
|
+
// Only redirect production paths — leave explicitly-set temp paths alone.
|
|
233
|
+
const envRoot = process.env.AQE_PROJECT_ROOT;
|
|
234
|
+
if (envRoot) {
|
|
235
|
+
const resolvedPath = path.resolve(this.config.dbPath);
|
|
236
|
+
const resolvedRoot = path.resolve(envRoot);
|
|
237
|
+
// Only redirect if path points OUTSIDE the env root AND into a real
|
|
238
|
+
// .agentic-qe directory (not another temp test dir)
|
|
239
|
+
if (!resolvedPath.startsWith(resolvedRoot) &&
|
|
240
|
+
!resolvedPath.startsWith(os.tmpdir()) &&
|
|
241
|
+
resolvedPath.includes('.agentic-qe')) {
|
|
242
|
+
console.error(`[UnifiedMemory] WARNING: DB path "${this.config.dbPath}" points to a ` +
|
|
243
|
+
`production .agentic-qe/ while AQE_PROJECT_ROOT="${envRoot}". ` +
|
|
244
|
+
`Redirecting to test-safe path.`);
|
|
245
|
+
this.config.dbPath = path.join(envRoot, '.agentic-qe', 'memory.db');
|
|
246
|
+
}
|
|
247
|
+
}
|
|
223
248
|
const dir = path.dirname(this.config.dbPath);
|
|
224
249
|
if (!fs.existsSync(dir)) {
|
|
225
250
|
fs.mkdirSync(dir, { recursive: true });
|
|
@@ -268,11 +268,35 @@ async function persistExperience(context, outcome) {
|
|
|
268
268
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'), ?)
|
|
269
269
|
`);
|
|
270
270
|
stmt.run(outcome.id, context.task, context.agent, context.domain, outcome.success ? 1 : 0, outcome.quality, outcome.durationMs, context.modelTier || null, safeJsonStringify(context.routing), safeJsonStringify(outcome.steps), safeJsonStringify(outcome.result), outcome.error || null, context.startedAt.toISOString(), 'middleware');
|
|
271
|
+
// Fire-and-forget: compute and store embedding for this experience
|
|
272
|
+
computeExperienceEmbedding(db, outcome.id, context.task, context.domain).catch(() => { });
|
|
271
273
|
}
|
|
272
274
|
catch (error) {
|
|
273
275
|
console.error('[ExperienceCaptureMiddleware] Failed to persist experience:', error);
|
|
274
276
|
}
|
|
275
277
|
}
|
|
278
|
+
/**
|
|
279
|
+
* Compute and store embedding for a captured experience (async, non-blocking).
|
|
280
|
+
* Uses the shared ONNX transformer model (all-MiniLM-L6-v2, 384-dim).
|
|
281
|
+
*/
|
|
282
|
+
async function computeExperienceEmbedding(db, experienceId, task, domain) {
|
|
283
|
+
try {
|
|
284
|
+
const { computeRealEmbedding } = await import('./real-embeddings.js');
|
|
285
|
+
const text = `${domain}: ${task}`.slice(0, 512); // Cap input length
|
|
286
|
+
const embedding = await computeRealEmbedding(text);
|
|
287
|
+
if (!embedding || embedding.length === 0)
|
|
288
|
+
return;
|
|
289
|
+
const buffer = Buffer.from(new Float32Array(embedding).buffer);
|
|
290
|
+
db.prepare(`
|
|
291
|
+
UPDATE captured_experiences
|
|
292
|
+
SET embedding = ?, embedding_dimension = ?
|
|
293
|
+
WHERE id = ? AND embedding IS NULL
|
|
294
|
+
`).run(buffer, embedding.length, experienceId);
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// Non-critical — embedding will be backfilled later if needed
|
|
298
|
+
}
|
|
299
|
+
}
|
|
276
300
|
/**
|
|
277
301
|
* Persist to sona_patterns for learning integration
|
|
278
302
|
*/
|
|
@@ -93,6 +93,9 @@ export declare class SQLitePatternStore {
|
|
|
93
93
|
id: string;
|
|
94
94
|
ftsScore: number;
|
|
95
95
|
}>;
|
|
96
|
+
/** Last FTS5 search latency in ms, for instrumentation */
|
|
97
|
+
private _lastFtsLatencyMs;
|
|
98
|
+
get lastFtsLatencyMs(): number;
|
|
96
99
|
/**
|
|
97
100
|
* Ghost pattern check: find patterns in SQLite that have no embeddings.
|
|
98
101
|
* Used by aqe_health to detect data integrity issues.
|
|
@@ -417,6 +417,7 @@ export class SQLitePatternStore {
|
|
|
417
417
|
// Sanitize: wrap in double quotes to force literal phrase match,
|
|
418
418
|
// escaping any internal double quotes to prevent FTS5 syntax injection
|
|
419
419
|
const sanitized = '"' + query.replace(/"/g, '""') + '"';
|
|
420
|
+
const start = performance.now();
|
|
420
421
|
try {
|
|
421
422
|
const rows = this.db.prepare(`
|
|
422
423
|
SELECT p.id, rank AS fts_score
|
|
@@ -426,6 +427,11 @@ export class SQLitePatternStore {
|
|
|
426
427
|
ORDER BY rank
|
|
427
428
|
LIMIT ?
|
|
428
429
|
`).all(sanitized, limit);
|
|
430
|
+
const elapsed = performance.now() - start;
|
|
431
|
+
if (elapsed > 50) {
|
|
432
|
+
console.warn(`[FTS5] searchFTS took ${elapsed.toFixed(1)}ms (results=${rows.length})`);
|
|
433
|
+
}
|
|
434
|
+
this._lastFtsLatencyMs = elapsed;
|
|
429
435
|
// FTS5 rank is negative (lower = better), normalize to 0..1
|
|
430
436
|
// Use Math.max(maxScore, 1.0) to prevent single-result inflation:
|
|
431
437
|
// without this, a single FTS5 result always normalizes to 1.0
|
|
@@ -440,6 +446,9 @@ export class SQLitePatternStore {
|
|
|
440
446
|
return [];
|
|
441
447
|
}
|
|
442
448
|
}
|
|
449
|
+
/** Last FTS5 search latency in ms, for instrumentation */
|
|
450
|
+
_lastFtsLatencyMs = 0;
|
|
451
|
+
get lastFtsLatencyMs() { return this._lastFtsLatencyMs; }
|
|
443
452
|
/**
|
|
444
453
|
* Ghost pattern check: find patterns in SQLite that have no embeddings.
|
|
445
454
|
* Used by aqe_health to detect data integrity issues.
|
|
@@ -83,6 +83,9 @@ class TokenMetricsCollectorImpl {
|
|
|
83
83
|
if (config) {
|
|
84
84
|
this.costConfig = { ...DEFAULT_COST_CONFIG, ...config };
|
|
85
85
|
}
|
|
86
|
+
// Activate DB-backed persistence and auto-save timer
|
|
87
|
+
this.initializeDb().catch(() => { });
|
|
88
|
+
this.startAutoSave();
|
|
86
89
|
}
|
|
87
90
|
/**
|
|
88
91
|
* Set cost configuration for token pricing.
|
|
@@ -146,6 +149,7 @@ class TokenMetricsCollectorImpl {
|
|
|
146
149
|
}
|
|
147
150
|
// Mark as dirty for persistence
|
|
148
151
|
this.isDirty = true;
|
|
152
|
+
this.maybePersistToKv();
|
|
149
153
|
}
|
|
150
154
|
/**
|
|
151
155
|
* Record pattern reuse for a task (tokens saved by skipping LLM call).
|