agentic-qe 3.8.6 → 3.8.8
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/n8n/n8n-base-agent.md +4 -35
- package/.claude/agents/n8n/n8n-bdd-scenario-tester.md +4 -25
- package/.claude/agents/n8n/n8n-chaos-tester.md +4 -26
- package/.claude/agents/n8n/n8n-ci-orchestrator.md +4 -27
- package/.claude/agents/n8n/n8n-compliance-validator.md +4 -25
- package/.claude/agents/n8n/n8n-expression-validator.md +4 -25
- package/.claude/agents/n8n/n8n-integration-test.md +4 -27
- package/.claude/agents/n8n/n8n-monitoring-validator.md +4 -26
- package/.claude/agents/n8n/n8n-node-validator.md +4 -25
- package/.claude/agents/n8n/n8n-performance-tester.md +4 -29
- package/.claude/agents/n8n/n8n-security-auditor.md +4 -26
- package/.claude/agents/n8n/n8n-trigger-test.md +4 -27
- package/.claude/agents/n8n/n8n-unit-tester.md +4 -25
- package/.claude/agents/n8n/n8n-version-comparator.md +4 -26
- package/.claude/agents/n8n/n8n-workflow-executor.md +4 -26
- package/.claude/agents/v3/qe-accessibility-auditor.md +21 -55
- package/.claude/agents/v3/qe-bdd-generator.md +23 -58
- package/.claude/agents/v3/qe-chaos-engineer.md +21 -54
- package/.claude/agents/v3/qe-code-complexity.md +21 -54
- package/.claude/agents/v3/qe-code-intelligence.md +21 -54
- package/.claude/agents/v3/qe-contract-validator.md +21 -53
- package/.claude/agents/v3/qe-coverage-specialist.md +23 -79
- package/.claude/agents/v3/qe-defect-predictor.md +23 -76
- package/.claude/agents/v3/qe-dependency-mapper.md +21 -53
- package/.claude/agents/v3/qe-deployment-advisor.md +21 -54
- package/.claude/agents/v3/qe-devils-advocate.md +212 -238
- package/.claude/agents/v3/qe-flaky-hunter.md +21 -53
- package/.claude/agents/v3/qe-fleet-commander.md +21 -54
- package/.claude/agents/v3/qe-gap-detector.md +23 -79
- package/.claude/agents/v3/qe-graphql-tester.md +21 -54
- package/.claude/agents/v3/qe-impact-analyzer.md +21 -53
- package/.claude/agents/v3/qe-integration-architect.md +2 -2
- package/.claude/agents/v3/qe-integration-tester.md +15 -36
- package/.claude/agents/v3/qe-kg-builder.md +21 -53
- package/.claude/agents/v3/qe-learning-coordinator.md +21 -51
- package/.claude/agents/v3/qe-load-tester.md +21 -55
- package/.claude/agents/v3/qe-message-broker-tester.md +345 -385
- package/.claude/agents/v3/qe-metrics-optimizer.md +21 -54
- package/.claude/agents/v3/qe-middleware-validator.md +389 -428
- package/.claude/agents/v3/qe-mutation-tester.md +21 -54
- package/.claude/agents/v3/qe-odata-contract-tester.md +443 -489
- package/.claude/agents/v3/qe-parallel-executor.md +21 -52
- package/.claude/agents/v3/qe-pattern-learner.md +23 -70
- package/.claude/agents/v3/qe-pentest-validator.md +322 -359
- package/.claude/agents/v3/qe-performance-tester.md +21 -54
- package/.claude/agents/v3/qe-product-factors-assessor.md +339 -376
- package/.claude/agents/v3/qe-property-tester.md +21 -53
- package/.claude/agents/v3/qe-quality-criteria-recommender.md +379 -410
- package/.claude/agents/v3/qe-quality-gate.md +17 -64
- package/.claude/agents/v3/qe-queen-coordinator.md +71 -121
- package/.claude/agents/v3/qe-qx-partner.md +23 -64
- package/.claude/agents/v3/qe-regression-analyzer.md +21 -54
- package/.claude/agents/v3/qe-requirements-validator.md +23 -66
- package/.claude/agents/v3/qe-responsive-tester.md +21 -54
- package/.claude/agents/v3/qe-retry-handler.md +21 -53
- package/.claude/agents/v3/qe-risk-assessor.md +23 -58
- package/.claude/agents/v3/qe-root-cause-analyzer.md +21 -53
- package/.claude/agents/v3/qe-sap-idoc-tester.md +371 -412
- package/.claude/agents/v3/qe-sap-rfc-tester.md +323 -362
- package/.claude/agents/v3/qe-security-auditor.md +21 -54
- package/.claude/agents/v3/qe-security-scanner.md +21 -58
- package/.claude/agents/v3/qe-soap-tester.md +307 -345
- package/.claude/agents/v3/qe-sod-analyzer.md +486 -533
- package/.claude/agents/v3/qe-tdd-specialist.md +17 -42
- package/.claude/agents/v3/qe-test-architect.md +23 -58
- package/.claude/agents/v3/qe-test-idea-rewriter.md +351 -375
- package/.claude/agents/v3/qe-transfer-specialist.md +21 -55
- package/.claude/agents/v3/qe-visual-tester.md +15 -37
- package/.claude/agents/v3/subagents/qe-code-reviewer.md +21 -54
- package/.claude/agents/v3/subagents/qe-integration-reviewer.md +21 -54
- package/.claude/agents/v3/subagents/qe-performance-reviewer.md +21 -54
- package/.claude/agents/v3/subagents/qe-security-reviewer.md +21 -54
- package/.claude/agents/v3/subagents/qe-tdd-green.md +21 -53
- package/.claude/agents/v3/subagents/qe-tdd-red.md +21 -53
- package/.claude/agents/v3/subagents/qe-tdd-refactor.md +21 -53
- package/.claude/skills/.validation/schemas/skill-eval.schema.json +5 -5
- package/.claude/skills/.validation/skill-validation-mcp-integration.md +32 -81
- package/.claude/skills/agentic-quality-engineering/SKILL.md +31 -60
- package/.claude/skills/iterative-loop/SKILL.md +2 -2
- package/.claude/skills/pair-programming/SKILL.md +2 -2
- package/.claude/skills/performance-testing/SKILL.md +1 -1
- package/.claude/skills/qcsd-cicd-swarm/steps/01-flag-detection.md +2 -2
- package/.claude/skills/qcsd-cicd-swarm/steps/07-learning-persistence.md +6 -6
- package/.claude/skills/qcsd-development-swarm/steps/01-flag-detection.md +2 -2
- package/.claude/skills/qcsd-development-swarm/steps/07-learning-persistence.md +6 -6
- package/.claude/skills/qcsd-ideation-swarm/steps/07-learning-persistence.md +6 -6
- package/.claude/skills/qcsd-production-swarm/steps/01-flag-detection.md +202 -206
- package/.claude/skills/qcsd-production-swarm/steps/07-learning-persistence.md +157 -185
- package/.claude/skills/qcsd-refinement-swarm/steps/01-flag-detection.md +87 -91
- package/.claude/skills/qcsd-refinement-swarm/steps/07-learning-persistence.md +49 -53
- package/.claude/skills/qe-chaos-resilience/SKILL.md +2 -2
- package/.claude/skills/qe-code-intelligence/SKILL.md +2 -2
- package/.claude/skills/qe-coverage-analysis/SKILL.md +2 -2
- package/.claude/skills/qe-defect-intelligence/SKILL.md +2 -2
- package/.claude/skills/qe-iterative-loop/SKILL.md +12 -12
- package/.claude/skills/qe-learning-optimization/SKILL.md +2 -2
- package/.claude/skills/qe-quality-assessment/SKILL.md +2 -2
- package/.claude/skills/qe-requirements-validation/SKILL.md +2 -2
- package/.claude/skills/qe-test-execution/SKILL.md +2 -2
- package/.claude/skills/qe-test-generation/SKILL.md +2 -2
- package/.claude/skills/qe-visual-accessibility/SKILL.md +2 -2
- package/.claude/skills/quality-metrics/SKILL.md +1 -1
- package/.claude/skills/security-testing/SKILL.md +1 -1
- package/.claude/skills/skills-manifest.json +1 -1
- package/.claude/skills/validation-pipeline/SKILL.md +2 -2
- package/.claude/skills/verification-quality/SKILL.md +2 -2
- package/CHANGELOG.md +41 -0
- package/assets/agents/v3/qe-accessibility-auditor.md +21 -55
- package/assets/agents/v3/qe-bdd-generator.md +23 -58
- package/assets/agents/v3/qe-chaos-engineer.md +21 -54
- package/assets/agents/v3/qe-code-complexity.md +21 -54
- package/assets/agents/v3/qe-code-intelligence.md +21 -54
- package/assets/agents/v3/qe-contract-validator.md +21 -53
- package/assets/agents/v3/qe-coverage-specialist.md +23 -79
- package/assets/agents/v3/qe-defect-predictor.md +23 -76
- package/assets/agents/v3/qe-dependency-mapper.md +21 -53
- package/assets/agents/v3/qe-deployment-advisor.md +21 -54
- package/assets/agents/v3/qe-devils-advocate.md +212 -238
- package/assets/agents/v3/qe-flaky-hunter.md +21 -53
- package/assets/agents/v3/qe-fleet-commander.md +21 -54
- package/assets/agents/v3/qe-gap-detector.md +23 -79
- package/assets/agents/v3/qe-graphql-tester.md +21 -54
- package/assets/agents/v3/qe-impact-analyzer.md +21 -53
- package/assets/agents/v3/qe-integration-architect.md +2 -2
- package/assets/agents/v3/qe-integration-tester.md +15 -36
- package/assets/agents/v3/qe-kg-builder.md +21 -53
- package/assets/agents/v3/qe-learning-coordinator.md +21 -51
- package/assets/agents/v3/qe-load-tester.md +21 -55
- package/assets/agents/v3/qe-message-broker-tester.md +345 -385
- package/assets/agents/v3/qe-metrics-optimizer.md +21 -54
- package/assets/agents/v3/qe-middleware-validator.md +389 -428
- package/assets/agents/v3/qe-mutation-tester.md +21 -54
- package/assets/agents/v3/qe-odata-contract-tester.md +443 -489
- package/assets/agents/v3/qe-parallel-executor.md +21 -52
- package/assets/agents/v3/qe-pattern-learner.md +23 -70
- package/assets/agents/v3/qe-pentest-validator.md +322 -359
- package/assets/agents/v3/qe-performance-tester.md +21 -54
- package/assets/agents/v3/qe-product-factors-assessor.md +339 -376
- package/assets/agents/v3/qe-property-tester.md +21 -53
- package/assets/agents/v3/qe-quality-criteria-recommender.md +379 -410
- package/assets/agents/v3/qe-quality-gate.md +17 -64
- package/assets/agents/v3/qe-queen-coordinator.md +71 -121
- package/assets/agents/v3/qe-qx-partner.md +23 -64
- package/assets/agents/v3/qe-regression-analyzer.md +21 -54
- package/assets/agents/v3/qe-requirements-validator.md +23 -66
- package/assets/agents/v3/qe-responsive-tester.md +21 -54
- package/assets/agents/v3/qe-retry-handler.md +21 -53
- package/assets/agents/v3/qe-risk-assessor.md +23 -58
- package/assets/agents/v3/qe-root-cause-analyzer.md +21 -53
- package/assets/agents/v3/qe-sap-idoc-tester.md +371 -412
- package/assets/agents/v3/qe-sap-rfc-tester.md +323 -362
- package/assets/agents/v3/qe-security-auditor.md +21 -54
- package/assets/agents/v3/qe-security-scanner.md +21 -58
- package/assets/agents/v3/qe-soap-tester.md +307 -345
- package/assets/agents/v3/qe-sod-analyzer.md +486 -533
- package/assets/agents/v3/qe-tdd-specialist.md +17 -42
- package/assets/agents/v3/qe-test-architect.md +23 -58
- package/assets/agents/v3/qe-test-idea-rewriter.md +351 -375
- package/assets/agents/v3/qe-transfer-specialist.md +21 -55
- package/assets/agents/v3/qe-visual-tester.md +15 -37
- package/assets/agents/v3/subagents/qe-code-reviewer.md +21 -54
- package/assets/agents/v3/subagents/qe-integration-reviewer.md +21 -54
- package/assets/agents/v3/subagents/qe-performance-reviewer.md +21 -54
- package/assets/agents/v3/subagents/qe-security-reviewer.md +21 -54
- package/assets/agents/v3/subagents/qe-tdd-green.md +21 -53
- package/assets/agents/v3/subagents/qe-tdd-red.md +21 -53
- package/assets/agents/v3/subagents/qe-tdd-refactor.md +21 -53
- package/assets/governance/constitution.md +1 -1
- package/assets/governance/shards/chaos-resilience.shard.md +1 -1
- package/assets/governance/shards/code-intelligence.shard.md +1 -1
- package/assets/governance/shards/contract-testing.shard.md +1 -1
- package/assets/governance/shards/coverage-analysis.shard.md +1 -1
- package/assets/governance/shards/defect-intelligence.shard.md +1 -1
- package/assets/governance/shards/learning-optimization.shard.md +1 -1
- package/assets/governance/shards/quality-assessment.shard.md +1 -1
- package/assets/governance/shards/requirements-validation.shard.md +1 -1
- package/assets/governance/shards/security-compliance.shard.md +1 -1
- package/assets/governance/shards/test-execution.shard.md +1 -1
- package/assets/governance/shards/test-generation.shard.md +1 -1
- package/assets/governance/shards/visual-accessibility.shard.md +1 -1
- package/assets/grammars/tree-sitter-c_sharp.wasm +0 -0
- package/assets/grammars/tree-sitter-java.wasm +0 -0
- package/assets/grammars/tree-sitter-python.wasm +0 -0
- package/assets/grammars/tree-sitter-rust.wasm +0 -0
- package/assets/grammars/tree-sitter-swift.wasm +0 -0
- package/assets/skills/.validation/schemas/skill-eval.schema.json +5 -5
- package/assets/skills/.validation/skill-validation-mcp-integration.md +32 -81
- package/assets/skills/agentic-quality-engineering/SKILL.md +31 -60
- package/assets/skills/pair-programming/SKILL.md +2 -2
- package/assets/skills/performance-testing/SKILL.md +1 -1
- package/assets/skills/qcsd-cicd-swarm/steps/01-flag-detection.md +2 -2
- package/assets/skills/qcsd-cicd-swarm/steps/07-learning-persistence.md +6 -6
- package/assets/skills/qcsd-development-swarm/steps/01-flag-detection.md +2 -2
- package/assets/skills/qcsd-development-swarm/steps/07-learning-persistence.md +6 -6
- package/assets/skills/qcsd-ideation-swarm/steps/07-learning-persistence.md +6 -6
- package/assets/skills/qcsd-production-swarm/steps/01-flag-detection.md +202 -206
- package/assets/skills/qcsd-production-swarm/steps/07-learning-persistence.md +157 -185
- package/assets/skills/qcsd-refinement-swarm/steps/01-flag-detection.md +87 -91
- package/assets/skills/qcsd-refinement-swarm/steps/07-learning-persistence.md +49 -53
- package/assets/skills/qe-chaos-resilience/SKILL.md +2 -2
- package/assets/skills/qe-code-intelligence/SKILL.md +2 -2
- package/assets/skills/qe-coverage-analysis/SKILL.md +2 -2
- package/assets/skills/qe-defect-intelligence/SKILL.md +2 -2
- package/assets/skills/qe-iterative-loop/SKILL.md +12 -12
- package/assets/skills/qe-learning-optimization/SKILL.md +2 -2
- package/assets/skills/qe-quality-assessment/SKILL.md +2 -2
- package/assets/skills/qe-requirements-validation/SKILL.md +2 -2
- package/assets/skills/qe-test-execution/SKILL.md +2 -2
- package/assets/skills/qe-test-generation/SKILL.md +2 -2
- package/assets/skills/qe-visual-accessibility/SKILL.md +2 -2
- package/assets/skills/quality-metrics/SKILL.md +1 -1
- package/assets/skills/security-testing/SKILL.md +1 -1
- package/assets/skills/validation-pipeline/SKILL.md +2 -2
- package/assets/skills/verification-quality/SKILL.md +2 -2
- package/dist/cli/bundle.js +5240 -4631
- package/dist/cli/command-registry.js +3 -1
- package/dist/cli/commands/init.js +2 -0
- package/dist/cli/commands/memory.d.ts +11 -0
- package/dist/cli/commands/memory.js +333 -0
- package/dist/cli/completions/index.d.ts +17 -0
- package/dist/cli/completions/index.js +49 -1
- package/dist/cli/handlers/hypergraph-handler.d.ts +27 -0
- package/dist/cli/handlers/hypergraph-handler.js +248 -0
- package/dist/cli/handlers/index.d.ts +1 -0
- package/dist/cli/handlers/index.js +1 -0
- package/dist/cli/handlers/init-handler.d.ts +1 -0
- package/dist/cli/handlers/init-handler.js +18 -6
- package/dist/cli/index.js +2 -0
- package/dist/coordination/protocols/code-intelligence-index.js +2 -11
- package/dist/domains/code-intelligence/coordinator-hypergraph.js +1 -1
- package/dist/domains/code-intelligence/coordinator.d.ts +5 -0
- package/dist/domains/code-intelligence/coordinator.js +35 -3
- package/dist/init/phases/06-code-intelligence.d.ts +8 -3
- package/dist/init/phases/06-code-intelligence.js +70 -32
- package/dist/init/phases/08-mcp.js +10 -0
- package/dist/init/phases/phase-interface.d.ts +2 -0
- package/dist/mcp/bundle.js +1507 -1506
- package/dist/mcp/handlers/hypergraph-handler.d.ts +27 -0
- package/dist/mcp/handlers/hypergraph-handler.js +140 -0
- package/dist/mcp/handlers/index.d.ts +1 -0
- package/dist/mcp/handlers/index.js +2 -0
- package/dist/mcp/server.js +19 -0
- package/dist/mcp/tool-scoping.js +5 -0
- package/dist/shared/code-index-extractor.d.ts +23 -0
- package/dist/shared/code-index-extractor.js +101 -0
- package/dist/shared/parsers/multi-language-parser.d.ts +4 -1
- package/dist/shared/parsers/multi-language-parser.js +73 -1
- package/dist/shared/parsers/tree-sitter-wasm-parser.d.ts +32 -0
- package/dist/shared/parsers/tree-sitter-wasm-parser.js +1034 -0
- package/package.json +2 -1
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Hypergraph Query MCP Handler
|
|
3
|
+
*
|
|
4
|
+
* Exposes hypergraph queries as an MCP tool:
|
|
5
|
+
* - stats: node/edge counts
|
|
6
|
+
* - untested: functions without test coverage
|
|
7
|
+
* - impacted: tests impacted by changed files
|
|
8
|
+
* - gaps: functions with low coverage
|
|
9
|
+
*/
|
|
10
|
+
import type { ToolResult } from '../types.js';
|
|
11
|
+
export interface HypergraphQueryParams {
|
|
12
|
+
/** Query type */
|
|
13
|
+
query: 'stats' | 'untested' | 'impacted' | 'gaps';
|
|
14
|
+
/** Changed files (for 'impacted' query) */
|
|
15
|
+
files?: string[];
|
|
16
|
+
/** Max coverage threshold (for 'gaps' query, default 50) */
|
|
17
|
+
maxCoverage?: number;
|
|
18
|
+
/** Max results (default 20) */
|
|
19
|
+
limit?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface HypergraphQueryResult {
|
|
22
|
+
query: string;
|
|
23
|
+
data: Record<string, unknown>;
|
|
24
|
+
totalResults: number;
|
|
25
|
+
}
|
|
26
|
+
export declare function handleHypergraphQuery(params: HypergraphQueryParams): Promise<ToolResult<HypergraphQueryResult>>;
|
|
27
|
+
//# sourceMappingURL=hypergraph-handler.d.ts.map
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Hypergraph Query MCP Handler
|
|
3
|
+
*
|
|
4
|
+
* Exposes hypergraph queries as an MCP tool:
|
|
5
|
+
* - stats: node/edge counts
|
|
6
|
+
* - untested: functions without test coverage
|
|
7
|
+
* - impacted: tests impacted by changed files
|
|
8
|
+
* - gaps: functions with low coverage
|
|
9
|
+
*/
|
|
10
|
+
import { join, resolve } from 'path';
|
|
11
|
+
import { existsSync } from 'fs';
|
|
12
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
13
|
+
import { findProjectRoot } from '../../kernel/unified-memory.js';
|
|
14
|
+
import { openDatabase } from '../../shared/safe-db.js';
|
|
15
|
+
import { createHypergraphEngine } from '../../integrations/ruvector/hypergraph-engine.js';
|
|
16
|
+
import { toErrorMessage } from '../../shared/error-utils.js';
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Helpers
|
|
19
|
+
// ============================================================================
|
|
20
|
+
function makeResult(success, startTime, data, error) {
|
|
21
|
+
return {
|
|
22
|
+
success,
|
|
23
|
+
data,
|
|
24
|
+
error,
|
|
25
|
+
metadata: {
|
|
26
|
+
executionTime: Date.now() - startTime,
|
|
27
|
+
timestamp: new Date().toISOString(),
|
|
28
|
+
requestId: uuidv4(),
|
|
29
|
+
domain: 'code-intelligence',
|
|
30
|
+
toolName: 'hypergraph_query',
|
|
31
|
+
dataSource: 'real',
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// Handler
|
|
37
|
+
// ============================================================================
|
|
38
|
+
export async function handleHypergraphQuery(params) {
|
|
39
|
+
const startTime = Date.now();
|
|
40
|
+
try {
|
|
41
|
+
const projectRoot = findProjectRoot();
|
|
42
|
+
const dbPath = join(projectRoot, '.agentic-qe', 'memory.db');
|
|
43
|
+
if (!existsSync(dbPath)) {
|
|
44
|
+
return makeResult(false, startTime, undefined, `Database not found: ${dbPath}. Run "aqe init --auto" first.`);
|
|
45
|
+
}
|
|
46
|
+
const db = openDatabase(dbPath);
|
|
47
|
+
try {
|
|
48
|
+
const engine = await createHypergraphEngine({
|
|
49
|
+
db,
|
|
50
|
+
maxTraversalDepth: 10,
|
|
51
|
+
maxQueryResults: 1000,
|
|
52
|
+
enableVectorSearch: false,
|
|
53
|
+
});
|
|
54
|
+
const limit = params.limit || 20;
|
|
55
|
+
switch (params.query) {
|
|
56
|
+
case 'stats': {
|
|
57
|
+
const stats = await engine.getStats();
|
|
58
|
+
return makeResult(true, startTime, {
|
|
59
|
+
query: 'stats',
|
|
60
|
+
data: {
|
|
61
|
+
totalNodes: stats.totalNodes,
|
|
62
|
+
totalEdges: stats.totalEdges,
|
|
63
|
+
nodesByType: stats.nodesByType,
|
|
64
|
+
edgesByType: stats.edgesByType,
|
|
65
|
+
avgComplexity: stats.avgComplexity,
|
|
66
|
+
avgCoverage: stats.avgCoverage,
|
|
67
|
+
nodesWithEmbeddings: stats.nodesWithEmbeddings,
|
|
68
|
+
},
|
|
69
|
+
totalResults: stats.totalNodes + stats.totalEdges,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
case 'untested': {
|
|
73
|
+
const untested = await engine.findUntestedFunctions();
|
|
74
|
+
const results = untested.slice(0, limit);
|
|
75
|
+
return makeResult(true, startTime, {
|
|
76
|
+
query: 'untested',
|
|
77
|
+
data: {
|
|
78
|
+
functions: results.map(fn => ({
|
|
79
|
+
name: fn.name,
|
|
80
|
+
filePath: fn.filePath,
|
|
81
|
+
lineStart: fn.lineStart,
|
|
82
|
+
complexity: fn.complexity,
|
|
83
|
+
})),
|
|
84
|
+
},
|
|
85
|
+
totalResults: untested.length,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
case 'impacted': {
|
|
89
|
+
if (!params.files || params.files.length === 0) {
|
|
90
|
+
return makeResult(false, startTime, undefined, 'The "files" parameter is required for the "impacted" query.');
|
|
91
|
+
}
|
|
92
|
+
// Resolve relative paths to absolute so they match hypergraph entries
|
|
93
|
+
const absoluteFiles = params.files.map(f => resolve(f));
|
|
94
|
+
const tests = await engine.findImpactedTests(absoluteFiles);
|
|
95
|
+
return makeResult(true, startTime, {
|
|
96
|
+
query: 'impacted',
|
|
97
|
+
data: {
|
|
98
|
+
changedFiles: params.files,
|
|
99
|
+
impactedTests: tests.map(t => ({
|
|
100
|
+
name: t.name,
|
|
101
|
+
filePath: t.filePath,
|
|
102
|
+
})),
|
|
103
|
+
},
|
|
104
|
+
totalResults: tests.length,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
case 'gaps': {
|
|
108
|
+
const maxCov = params.maxCoverage ?? 50;
|
|
109
|
+
const gaps = await engine.findCoverageGaps(maxCov);
|
|
110
|
+
const results = gaps.slice(0, limit);
|
|
111
|
+
return makeResult(true, startTime, {
|
|
112
|
+
query: 'gaps',
|
|
113
|
+
data: {
|
|
114
|
+
maxCoverage: maxCov,
|
|
115
|
+
functions: results.map(fn => ({
|
|
116
|
+
name: fn.name,
|
|
117
|
+
filePath: fn.filePath,
|
|
118
|
+
coverage: fn.coverage,
|
|
119
|
+
complexity: fn.complexity,
|
|
120
|
+
})),
|
|
121
|
+
},
|
|
122
|
+
totalResults: gaps.length,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
default:
|
|
126
|
+
return makeResult(false, startTime, undefined, `Unknown query type: "${params.query}". Use: stats, untested, impacted, gaps`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
try {
|
|
131
|
+
db.close();
|
|
132
|
+
}
|
|
133
|
+
catch { /* ignore */ }
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
return makeResult(false, startTime, undefined, toErrorMessage(error));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=hypergraph-handler.js.map
|
|
@@ -11,5 +11,6 @@ export { handleTeamList, handleTeamHealth, handleTeamMessage, handleTeamBroadcas
|
|
|
11
11
|
export { handleMemoryStore, handleMemoryRetrieve, handleMemoryQuery, handleMemoryDelete, handleMemoryUsage, handleMemoryShare, } from './memory-handlers';
|
|
12
12
|
export { handlePipelineLoad, handlePipelineRun, handlePipelineList, handlePipelineValidate, getPipelineRegistry, getPipelineLoader, type PipelineLoadParams, type PipelineLoadResult, type PipelineRunParams, type PipelineRunResult, type PipelineListParams, type PipelineListResult, type PipelineValidateParams, type PipelineValidateResult, } from './pipeline-handlers.js';
|
|
13
13
|
export { handleValidationPipeline, type ValidationPipelineParams, type ValidationPipelineResult, } from './validation-pipeline-handler.js';
|
|
14
|
+
export { handleHypergraphQuery, type HypergraphQueryParams, type HypergraphQueryResult, } from './hypergraph-handler.js';
|
|
14
15
|
export { handleCrossPhaseStore, handleCrossPhaseQuery, handleAgentComplete, handlePhaseStart, handlePhaseEnd, handleCrossPhaseStats, handleFormatSignals, handleCrossPhaseCleanup, resetCrossPhaseHandlers, type StoreSignalParams, type StoreSignalResult, type QuerySignalsParams, type QuerySignalsResult, type AgentCompleteParams, type AgentCompleteResult, type PhaseEventParams, type PhaseStartResult, type PhaseEndResult, type CrossPhaseStatsResult, type FormatSignalsParams, type FormatSignalsResult, } from './cross-phase-handlers';
|
|
15
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -22,6 +22,8 @@ export { handleMemoryStore, handleMemoryRetrieve, handleMemoryQuery, handleMemor
|
|
|
22
22
|
export { handlePipelineLoad, handlePipelineRun, handlePipelineList, handlePipelineValidate, getPipelineRegistry, getPipelineLoader, } from './pipeline-handlers.js';
|
|
23
23
|
// Validation pipeline handler (BMAD-003)
|
|
24
24
|
export { handleValidationPipeline, } from './validation-pipeline-handler.js';
|
|
25
|
+
// Hypergraph query handler
|
|
26
|
+
export { handleHypergraphQuery, } from './hypergraph-handler.js';
|
|
25
27
|
// Cross-phase handlers
|
|
26
28
|
export { handleCrossPhaseStore, handleCrossPhaseQuery, handleAgentComplete, handlePhaseStart, handlePhaseEnd, handleCrossPhaseStats, handleFormatSignals, handleCrossPhaseCleanup, resetCrossPhaseHandlers, } from './cross-phase-handlers';
|
|
27
29
|
//# sourceMappingURL=index.js.map
|
package/dist/mcp/server.js
CHANGED
|
@@ -12,6 +12,8 @@ handleTaskSubmit, handleTaskList, handleTaskStatus, handleTaskCancel, handleTask
|
|
|
12
12
|
handleAgentList, handleAgentSpawn, handleAgentMetrics, handleAgentStatus,
|
|
13
13
|
// Domain handlers
|
|
14
14
|
handleTestGenerate, handleTestExecute, handleCoverageAnalyze, handleQualityAssess, handleSecurityScan, handleContractValidate, handleAccessibilityTest, handleChaosTest, handleDefectPredict, handleRequirementsValidate, handleCodeIndex,
|
|
15
|
+
// Hypergraph query handler
|
|
16
|
+
handleHypergraphQuery,
|
|
15
17
|
// Memory handlers
|
|
16
18
|
handleMemoryStore, handleMemoryRetrieve, handleMemoryQuery, handleMemoryDelete, handleMemoryUsage, handleMemoryShare,
|
|
17
19
|
// Cross-phase handlers
|
|
@@ -394,6 +396,23 @@ const DOMAIN_TOOLS = [
|
|
|
394
396
|
},
|
|
395
397
|
handler: handleCodeIndex,
|
|
396
398
|
},
|
|
399
|
+
// Hypergraph Query
|
|
400
|
+
{
|
|
401
|
+
definition: {
|
|
402
|
+
name: 'mcp__agentic_qe__hypergraph_query',
|
|
403
|
+
description: 'Query the code knowledge hypergraph for untested functions, impacted tests, coverage gaps, and stats',
|
|
404
|
+
category: 'domain',
|
|
405
|
+
domain: 'code-intelligence',
|
|
406
|
+
lazyLoad: true,
|
|
407
|
+
parameters: [
|
|
408
|
+
{ name: 'query', type: 'string', description: 'Query type: stats, untested, impacted, gaps', required: true },
|
|
409
|
+
{ name: 'files', type: 'array', description: 'Changed files (required for "impacted" query)' },
|
|
410
|
+
{ name: 'maxCoverage', type: 'number', description: 'Max coverage threshold for "gaps" query (default: 50)' },
|
|
411
|
+
{ name: 'limit', type: 'number', description: 'Max results (default: 20)' },
|
|
412
|
+
],
|
|
413
|
+
},
|
|
414
|
+
handler: handleHypergraphQuery,
|
|
415
|
+
},
|
|
397
416
|
// Validation Pipeline (BMAD-003)
|
|
398
417
|
{
|
|
399
418
|
definition: {
|
package/dist/mcp/tool-scoping.js
CHANGED
|
@@ -14,6 +14,7 @@ const DEFAULT_SCOPES = {
|
|
|
14
14
|
'test_execute_parallel',
|
|
15
15
|
'coverage_analyze_sublinear',
|
|
16
16
|
'code_index',
|
|
17
|
+
'hypergraph_query',
|
|
17
18
|
'memory_query',
|
|
18
19
|
'memory_retrieve',
|
|
19
20
|
'model_route',
|
|
@@ -23,6 +24,7 @@ const DEFAULT_SCOPES = {
|
|
|
23
24
|
allowed: [
|
|
24
25
|
'coverage_analyze_sublinear',
|
|
25
26
|
'code_index',
|
|
27
|
+
'hypergraph_query',
|
|
26
28
|
'quality_assess',
|
|
27
29
|
'memory_query',
|
|
28
30
|
'memory_retrieve',
|
|
@@ -32,6 +34,7 @@ const DEFAULT_SCOPES = {
|
|
|
32
34
|
allowed: [
|
|
33
35
|
'security_scan_comprehensive',
|
|
34
36
|
'code_index',
|
|
37
|
+
'hypergraph_query',
|
|
35
38
|
'memory_query',
|
|
36
39
|
'memory_retrieve',
|
|
37
40
|
],
|
|
@@ -41,6 +44,7 @@ const DEFAULT_SCOPES = {
|
|
|
41
44
|
'quality_assess',
|
|
42
45
|
'coverage_analyze_sublinear',
|
|
43
46
|
'defect_predict',
|
|
47
|
+
'hypergraph_query',
|
|
44
48
|
'memory_query',
|
|
45
49
|
'memory_retrieve',
|
|
46
50
|
],
|
|
@@ -49,6 +53,7 @@ const DEFAULT_SCOPES = {
|
|
|
49
53
|
allowed: [
|
|
50
54
|
'defect_predict',
|
|
51
55
|
'code_index',
|
|
56
|
+
'hypergraph_query',
|
|
52
57
|
'memory_query',
|
|
53
58
|
'memory_retrieve',
|
|
54
59
|
],
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight regex-based code entity extractor.
|
|
3
|
+
*
|
|
4
|
+
* Builds a CodeIndexResult from file paths by scanning for
|
|
5
|
+
* function/class/interface declarations, arrow function exports,
|
|
6
|
+
* class method definitions, and import statements.
|
|
7
|
+
*
|
|
8
|
+
* Uses async file I/O to avoid blocking the event loop on large codebases.
|
|
9
|
+
*
|
|
10
|
+
* Used by both init phase 06 and the code-intelligence coordinator
|
|
11
|
+
* to populate hypergraph tables.
|
|
12
|
+
*/
|
|
13
|
+
import type { CodeIndexResult } from '../integrations/ruvector/hypergraph-engine.js';
|
|
14
|
+
export type { CodeIndexResult };
|
|
15
|
+
/**
|
|
16
|
+
* Extract code entities and imports from a list of file paths.
|
|
17
|
+
* Returns a CodeIndexResult compatible with HypergraphEngine.buildFromIndexResult().
|
|
18
|
+
*
|
|
19
|
+
* Uses async I/O in batches to avoid blocking the event loop and
|
|
20
|
+
* exhausting file descriptors on large codebases.
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractCodeIndex(paths: string[]): Promise<CodeIndexResult>;
|
|
23
|
+
//# sourceMappingURL=code-index-extractor.d.ts.map
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight regex-based code entity extractor.
|
|
3
|
+
*
|
|
4
|
+
* Builds a CodeIndexResult from file paths by scanning for
|
|
5
|
+
* function/class/interface declarations, arrow function exports,
|
|
6
|
+
* class method definitions, and import statements.
|
|
7
|
+
*
|
|
8
|
+
* Uses async file I/O to avoid blocking the event loop on large codebases.
|
|
9
|
+
*
|
|
10
|
+
* Used by both init phase 06 and the code-intelligence coordinator
|
|
11
|
+
* to populate hypergraph tables.
|
|
12
|
+
*/
|
|
13
|
+
import { readFile } from 'fs/promises';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Constants
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/** Keywords that look like method definitions but are control flow */
|
|
18
|
+
const CONTROL_FLOW_KEYWORDS = new Set([
|
|
19
|
+
'if', 'for', 'while', 'switch', 'catch', 'return',
|
|
20
|
+
'new', 'throw', 'import', 'export', 'constructor',
|
|
21
|
+
]);
|
|
22
|
+
/** Batch size for concurrent file reads to avoid fd exhaustion */
|
|
23
|
+
const READ_BATCH_SIZE = 50;
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Extractor
|
|
26
|
+
// ============================================================================
|
|
27
|
+
/**
|
|
28
|
+
* Parse a single file's content into entities and imports.
|
|
29
|
+
* Pure function — no I/O.
|
|
30
|
+
*/
|
|
31
|
+
function parseFileContent(filePath, content) {
|
|
32
|
+
const lines = content.split('\n');
|
|
33
|
+
const entities = [];
|
|
34
|
+
const imports = [];
|
|
35
|
+
for (let i = 0; i < lines.length; i++) {
|
|
36
|
+
const line = lines[i];
|
|
37
|
+
// Named function declarations: function foo() / export async function foo()
|
|
38
|
+
const funcMatch = line.match(/(?:export\s+)?(?:default\s+)?(?:async\s+)?function\s+(\w+)/);
|
|
39
|
+
if (funcMatch) {
|
|
40
|
+
entities.push({ type: 'function', name: funcMatch[1], lineStart: i + 1 });
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
// Arrow function exports: export const foo = (...) => / export const foo = async (
|
|
44
|
+
const arrowMatch = line.match(/(?:export\s+)?(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s+)?(?:\([^)]*\)|[a-zA-Z_]\w*)\s*(?::\s*[^=]+)?\s*=>/);
|
|
45
|
+
if (arrowMatch) {
|
|
46
|
+
entities.push({ type: 'function', name: arrowMatch[1], lineStart: i + 1 });
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// Class declarations: class Foo / export abstract class Foo
|
|
50
|
+
const classMatch = line.match(/(?:export\s+)?(?:default\s+)?(?:abstract\s+)?class\s+(\w+)/);
|
|
51
|
+
if (classMatch) {
|
|
52
|
+
entities.push({ type: 'class', name: classMatch[1], lineStart: i + 1 });
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// Interface declarations: interface Foo / export interface Foo
|
|
56
|
+
const interfaceMatch = line.match(/(?:export\s+)?interface\s+(\w+)/);
|
|
57
|
+
if (interfaceMatch) {
|
|
58
|
+
entities.push({ type: 'interface', name: interfaceMatch[1], lineStart: i + 1 });
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// Class method definitions: async doThing(...) / public static foo(
|
|
62
|
+
// Must be indented (inside a class body) and not a control flow keyword
|
|
63
|
+
const methodMatch = line.match(/^\s+(?:(?:public|private|protected|static|readonly|override|abstract|async)\s+)*(\w+)\s*(?:<[^>]*>)?\s*\([^)]*\)\s*(?::\s*[^{]+)?\s*\{?\s*$/);
|
|
64
|
+
if (methodMatch && !CONTROL_FLOW_KEYWORDS.has(methodMatch[1])) {
|
|
65
|
+
entities.push({ type: 'function', name: methodMatch[1], lineStart: i + 1 });
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
// Relative imports: import ... from './foo' / from '../bar'
|
|
69
|
+
const importMatch = line.match(/(?:import|from)\s+['"](\.[^'"]+)['"]/);
|
|
70
|
+
if (importMatch) {
|
|
71
|
+
imports.push(importMatch[1]);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { path: filePath, entities, imports };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Extract code entities and imports from a list of file paths.
|
|
78
|
+
* Returns a CodeIndexResult compatible with HypergraphEngine.buildFromIndexResult().
|
|
79
|
+
*
|
|
80
|
+
* Uses async I/O in batches to avoid blocking the event loop and
|
|
81
|
+
* exhausting file descriptors on large codebases.
|
|
82
|
+
*/
|
|
83
|
+
export async function extractCodeIndex(paths) {
|
|
84
|
+
const files = [];
|
|
85
|
+
// Process files in batches to limit concurrency
|
|
86
|
+
for (let offset = 0; offset < paths.length; offset += READ_BATCH_SIZE) {
|
|
87
|
+
const batch = paths.slice(offset, offset + READ_BATCH_SIZE);
|
|
88
|
+
const results = await Promise.allSettled(batch.map(async (filePath) => {
|
|
89
|
+
const content = await readFile(filePath, 'utf-8');
|
|
90
|
+
return parseFileContent(filePath, content);
|
|
91
|
+
}));
|
|
92
|
+
for (const result of results) {
|
|
93
|
+
if (result.status === 'fulfilled') {
|
|
94
|
+
files.push(result.value);
|
|
95
|
+
}
|
|
96
|
+
// Skip rejected (unreadable files) silently
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return { files };
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=code-index-extractor.js.map
|
|
@@ -128,11 +128,14 @@ declare class DartParser implements ILanguageParser {
|
|
|
128
128
|
}
|
|
129
129
|
/**
|
|
130
130
|
* Registry of all language parsers.
|
|
131
|
-
*
|
|
131
|
+
* For Python, Java, C#, Rust, Swift: tries WASM parser first, falls back to regex.
|
|
132
|
+
* For Go, Kotlin, Dart: uses regex parser directly.
|
|
132
133
|
*/
|
|
133
134
|
export declare class TreeSitterParserRegistry {
|
|
134
135
|
private parsers;
|
|
136
|
+
private _wasmInitPromise;
|
|
135
137
|
constructor();
|
|
138
|
+
private _tryLoadWasmParsers;
|
|
136
139
|
register(parser: ILanguageParser): void;
|
|
137
140
|
getParser(language: SupportedLanguage): ILanguageParser | undefined;
|
|
138
141
|
parseFile(content: string, filePath: string, language: SupportedLanguage): Promise<ParsedFile | undefined>;
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* 1. joinMultiLineSignatures — collapses multi-line function/class declarations into single logical lines
|
|
8
8
|
* 2. matchBalancedBrackets — handles nested generics like Map<String, List<Foo>> correctly
|
|
9
9
|
*/
|
|
10
|
+
import { createLogger } from '../../logging/logger-factory.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// Shared Parsing Utilities
|
|
12
13
|
// ============================================================================
|
|
@@ -1230,13 +1231,53 @@ class DartParser {
|
|
|
1230
1231
|
// ============================================================================
|
|
1231
1232
|
// Parser Registry
|
|
1232
1233
|
// ============================================================================
|
|
1234
|
+
const registryLogger = createLogger('ParserRegistry');
|
|
1235
|
+
/** Languages that have WASM parser support */
|
|
1236
|
+
const WASM_SUPPORTED_LANGUAGES = ['python', 'java', 'csharp', 'rust', 'swift'];
|
|
1237
|
+
/**
|
|
1238
|
+
* Wraps a WASM parser with automatic fallback to a regex parser.
|
|
1239
|
+
* Logs a user-facing warning when fallback occurs.
|
|
1240
|
+
*/
|
|
1241
|
+
class FallbackParser {
|
|
1242
|
+
language;
|
|
1243
|
+
supportedExtensions;
|
|
1244
|
+
wasmParser;
|
|
1245
|
+
regexParser;
|
|
1246
|
+
wasmFailCount = 0;
|
|
1247
|
+
static MAX_WASM_RETRIES = 3;
|
|
1248
|
+
constructor(wasmParser, regexParser) {
|
|
1249
|
+
this.wasmParser = wasmParser;
|
|
1250
|
+
this.regexParser = regexParser;
|
|
1251
|
+
this.language = wasmParser.language;
|
|
1252
|
+
this.supportedExtensions = wasmParser.supportedExtensions;
|
|
1253
|
+
}
|
|
1254
|
+
async parseFile(content, filePath) {
|
|
1255
|
+
if (this.wasmFailCount < FallbackParser.MAX_WASM_RETRIES) {
|
|
1256
|
+
try {
|
|
1257
|
+
return await this.wasmParser.parseFile(content, filePath);
|
|
1258
|
+
}
|
|
1259
|
+
catch (err) {
|
|
1260
|
+
this.wasmFailCount++;
|
|
1261
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1262
|
+
const permanent = this.wasmFailCount >= FallbackParser.MAX_WASM_RETRIES;
|
|
1263
|
+
registryLogger.warn(`[${this.language}] tree-sitter WASM parser failed (attempt ${this.wasmFailCount}/${FallbackParser.MAX_WASM_RETRIES}): ${msg}. ` +
|
|
1264
|
+
`Falling back to regex parser (~97-98% accuracy). ` +
|
|
1265
|
+
(permanent ? 'Set AQE_PARSER_REGEX_ONLY=1 to silence this warning.' : 'Will retry WASM on next parse.'));
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
return this.regexParser.parseFile(content, filePath);
|
|
1269
|
+
}
|
|
1270
|
+
}
|
|
1233
1271
|
/**
|
|
1234
1272
|
* Registry of all language parsers.
|
|
1235
|
-
*
|
|
1273
|
+
* For Python, Java, C#, Rust, Swift: tries WASM parser first, falls back to regex.
|
|
1274
|
+
* For Go, Kotlin, Dart: uses regex parser directly.
|
|
1236
1275
|
*/
|
|
1237
1276
|
export class TreeSitterParserRegistry {
|
|
1238
1277
|
parsers = new Map();
|
|
1278
|
+
_wasmInitPromise = null;
|
|
1239
1279
|
constructor() {
|
|
1280
|
+
// Register regex parsers for all 8 languages immediately
|
|
1240
1281
|
this.register(new PythonParser());
|
|
1241
1282
|
this.register(new JavaParser());
|
|
1242
1283
|
this.register(new CSharpParser());
|
|
@@ -1245,6 +1286,31 @@ export class TreeSitterParserRegistry {
|
|
|
1245
1286
|
this.register(new SwiftParser());
|
|
1246
1287
|
this.register(new KotlinParser());
|
|
1247
1288
|
this.register(new DartParser());
|
|
1289
|
+
// Kick off async WASM parser loading (non-blocking)
|
|
1290
|
+
this._wasmInitPromise = this._tryLoadWasmParsers();
|
|
1291
|
+
}
|
|
1292
|
+
async _tryLoadWasmParsers() {
|
|
1293
|
+
try {
|
|
1294
|
+
const mod = await import('./tree-sitter-wasm-parser.js');
|
|
1295
|
+
if (!mod.isWasmAvailable()) {
|
|
1296
|
+
registryLogger.info('tree-sitter WASM parsers disabled or unavailable. Using regex parsers (~97-98% accuracy). ' +
|
|
1297
|
+
'Set AQE_PARSER_REGEX_ONLY=0 or ensure web-tree-sitter is installed to enable WASM.');
|
|
1298
|
+
return;
|
|
1299
|
+
}
|
|
1300
|
+
const wasmParsers = mod.createWasmParsers();
|
|
1301
|
+
// Wrap each WASM parser with fallback to the existing regex parser
|
|
1302
|
+
for (const lang of WASM_SUPPORTED_LANGUAGES) {
|
|
1303
|
+
const wasmParser = wasmParsers.get(lang);
|
|
1304
|
+
const regexParser = this.parsers.get(lang);
|
|
1305
|
+
if (wasmParser && regexParser) {
|
|
1306
|
+
this.parsers.set(lang, new FallbackParser(wasmParser, regexParser));
|
|
1307
|
+
}
|
|
1308
|
+
}
|
|
1309
|
+
registryLogger.info('tree-sitter WASM parsers available for: ' + WASM_SUPPORTED_LANGUAGES.join(', '));
|
|
1310
|
+
}
|
|
1311
|
+
catch {
|
|
1312
|
+
registryLogger.info('tree-sitter WASM parser module not available. Using regex parsers for all languages.');
|
|
1313
|
+
}
|
|
1248
1314
|
}
|
|
1249
1315
|
register(parser) {
|
|
1250
1316
|
this.parsers.set(parser.language, parser);
|
|
@@ -1253,6 +1319,12 @@ export class TreeSitterParserRegistry {
|
|
|
1253
1319
|
return this.parsers.get(language);
|
|
1254
1320
|
}
|
|
1255
1321
|
async parseFile(content, filePath, language) {
|
|
1322
|
+
// Ensure WASM init has completed (or failed) before first parse.
|
|
1323
|
+
// After the first call, the promise is already resolved so this is a no-op.
|
|
1324
|
+
if (this._wasmInitPromise) {
|
|
1325
|
+
await this._wasmInitPromise;
|
|
1326
|
+
this._wasmInitPromise = null;
|
|
1327
|
+
}
|
|
1256
1328
|
const parser = this.parsers.get(language);
|
|
1257
1329
|
if (!parser)
|
|
1258
1330
|
return undefined;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-sitter WASM Parser (ADR-076 Amendment 2026-03-24)
|
|
3
|
+
*
|
|
4
|
+
* Provides AST-based parsing for Python, Java, C#, Rust, Swift using
|
|
5
|
+
* web-tree-sitter WASM grammars. Achieves ~100% accuracy for identifying
|
|
6
|
+
* functions, classes, imports, properties, and complexity — eliminating
|
|
7
|
+
* the ~2-3% edge cases (code in strings, complex generics) that regex misses.
|
|
8
|
+
*
|
|
9
|
+
* Lazy-loads WASM grammars on first parse per language.
|
|
10
|
+
* Falls back to regex parsers with user-facing log warnings when WASM
|
|
11
|
+
* initialization fails (missing dependency, incompatible Node version, etc.).
|
|
12
|
+
*/
|
|
13
|
+
import type { SupportedLanguage } from '../types/test-frameworks.js';
|
|
14
|
+
import type { ILanguageParser, ParsedFile } from './interfaces.js';
|
|
15
|
+
export declare class TreeSitterWASMParser implements ILanguageParser {
|
|
16
|
+
readonly language: SupportedLanguage;
|
|
17
|
+
readonly supportedExtensions: string[];
|
|
18
|
+
constructor(language: SupportedLanguage, extensions: string[]);
|
|
19
|
+
parseFile(content: string, filePath: string): Promise<ParsedFile>;
|
|
20
|
+
private extractFromAST;
|
|
21
|
+
}
|
|
22
|
+
export declare function createWasmParsers(): Map<SupportedLanguage, ILanguageParser>;
|
|
23
|
+
/**
|
|
24
|
+
* Check if web-tree-sitter WASM is available in this environment.
|
|
25
|
+
* Returns true if the dependency is installed; does NOT initialize WASM.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isWasmAvailable(): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Reset internal state — for testing only.
|
|
30
|
+
*/
|
|
31
|
+
export declare function _resetWasmState(): void;
|
|
32
|
+
//# sourceMappingURL=tree-sitter-wasm-parser.d.ts.map
|