codehere 0.2.2 → 0.3.0-rc.2
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/README.md +88 -68
- package/dist/domain/entities/task.js +4 -4
- package/dist/error-handler.js +4 -9
- package/dist/index.js +253 -1219
- package/dist/infrastructure/config/product-context.js +7 -6
- package/dist/infrastructure/hooks/claude-sdk-hook.js +348 -72
- package/dist/infrastructure/observability/execution-tracer.js +11 -6
- package/dist/infrastructure/orchestration/agent-adapter.js +13 -0
- package/dist/infrastructure/orchestration/agent-installer.js +101 -0
- package/dist/infrastructure/orchestration/agents-config-seed.js +56 -0
- package/dist/infrastructure/orchestration/aider-adapter.js +319 -0
- package/dist/infrastructure/orchestration/artifacts-extractor.js +175 -0
- package/dist/infrastructure/orchestration/claude-code-adapter.js +352 -0
- package/dist/infrastructure/orchestration/codex-adapter.js +310 -0
- package/dist/infrastructure/orchestration/generic-cli-adapter.js +553 -0
- package/dist/infrastructure/orchestration/opencode-adapter.js +275 -0
- package/dist/infrastructure/orchestration/progress-aggregator.js +189 -0
- package/dist/infrastructure/orchestration/readiness.js +106 -0
- package/dist/infrastructure/orchestration/session-manager.js +272 -0
- package/dist/infrastructure/orchestration/session-persistence.js +109 -0
- package/dist/infrastructure/protocols/mcp-helpers.js +10 -30
- package/dist/infrastructure/protocols/mcp-server-impl.js +359 -21
- package/dist/infrastructure/protocols/ui-page.js +1827 -0
- package/dist/infrastructure/security/file-collection.js +115 -0
- package/dist/infrastructure/security/trust-scorer.js +301 -56
- package/dist/infrastructure/storage/task-repository.js +8 -7
- package/dist/monitoring.js +9 -38
- package/dist/presentation/cli/commands/help-command.js +96 -139
- package/dist/presentation/cli/commands/hook-command.js +17 -24
- package/dist/presentation/cli/commands/report-command.js +59 -72
- package/dist/presentation/cli/commands/setup-command.js +4 -4
- package/dist/presentation/cli/commands/status-command.js +321 -30
- package/dist/presentation/cli/commands/trust-command.js +84 -72
- package/dist/presentation/cli/error-display.js +17 -21
- package/dist/ui.js +11 -11
- package/package.json +24 -62
- package/dist/agents/base.js +0 -101
- package/dist/agents/orchestrator-model-driven.js +0 -141
- package/dist/agents/react-orchestrator-agent.js +0 -54
- package/dist/application/agents/execution-agent.js +0 -508
- package/dist/application/agents/multi-agent-orchestrator.js +0 -295
- package/dist/application/agents/planning-agent.js +0 -433
- package/dist/application/agents/validation-agent.js +0 -317
- package/dist/application/architectures/plan-and-act.js +0 -242
- package/dist/application/index.js +0 -12
- package/dist/application/services/agent-factory.js +0 -28
- package/dist/application/services/dependency-container.js +0 -596
- package/dist/application/services/git-context-service.js +0 -83
- package/dist/application/services/intelligent-router.js +0 -934
- package/dist/application/services/tool-executor-service.js +0 -94
- package/dist/application/use-cases/ask-question-use-case.js +0 -338
- package/dist/application/use-cases/edit-file-use-case.js +0 -830
- package/dist/application/use-cases/explain-file-use-case.js +0 -50
- package/dist/application/use-cases/index-codebase-use-case.js +0 -113
- package/dist/application/use-cases/planning-use-case.js +0 -276
- package/dist/application/use-cases/react-orchestration-use-case.js +0 -329
- package/dist/application/use-cases/reflexion-use-case.js +0 -30
- package/dist/application/workflows/deterministic-workflows.js +0 -189
- package/dist/ast-parser.js +0 -331
- package/dist/cache.js +0 -180
- package/dist/chat.js +0 -251
- package/dist/code-analysis.js +0 -327
- package/dist/context.js +0 -187
- package/dist/docs.js +0 -146
- package/dist/domain/entities/code-chunk.js +0 -6
- package/dist/domain/entities/decision.js +0 -9
- package/dist/domain/entities/edit.js +0 -6
- package/dist/domain/entities/knowledge-node.js +0 -9
- package/dist/domain/entities/knowledge-preservation.js +0 -10
- package/dist/domain/entities/memory.js +0 -6
- package/dist/domain/entities/pattern.js +0 -7
- package/dist/domain/entities/plan.js +0 -6
- package/dist/domain/entities/query.js +0 -6
- package/dist/domain/errors/embeddings-not-found-error.js +0 -13
- package/dist/domain/index.js +0 -19
- package/dist/domain/interfaces/ai-service.interface.js +0 -6
- package/dist/domain/interfaces/code-analyzer.interface.js +0 -6
- package/dist/domain/interfaces/decision-repository.interface.js +0 -9
- package/dist/domain/interfaces/embedding-repository.interface.js +0 -6
- package/dist/domain/interfaces/knowledge-graph-repository.interface.js +0 -9
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.js +0 -8
- package/dist/domain/interfaces/memory-repository.interface.js +0 -6
- package/dist/domain/interfaces/pattern-repository.interface.js +0 -6
- package/dist/domain/interfaces/verification-service.interface.js +0 -6
- package/dist/domain/services/cross-team-pattern-sharing.js +0 -125
- package/dist/domain/services/decision-recorder.js +0 -223
- package/dist/domain/services/decision-retriever.js +0 -133
- package/dist/domain/services/environment-mode-manager.js +0 -22
- package/dist/domain/services/graded-memory-activation.js +0 -69
- package/dist/domain/services/knowledge-access.js +0 -132
- package/dist/domain/services/knowledge-extractor.js +0 -247
- package/dist/domain/services/knowledge-graph-builder.js +0 -268
- package/dist/domain/services/knowledge-graph-query.js +0 -187
- package/dist/domain/services/memory-retriever.js +0 -82
- package/dist/domain/services/memory-synthesizer.js +0 -91
- package/dist/domain/services/pattern-extractor.js +0 -442
- package/dist/domain/services/query-intent-classifier.js +0 -140
- package/dist/domain/services/react-loop.js +0 -186
- package/dist/domain/services/risk-tier-detector.js +0 -78
- package/dist/edit.js +0 -319
- package/dist/embed.js +0 -459
- package/dist/formatter.js +0 -168
- package/dist/git.js +0 -198
- package/dist/infrastructure/ai/cohere-ai-service.js +0 -607
- package/dist/infrastructure/ai/command-r-evaluation.js +0 -206
- package/dist/infrastructure/ai/model-config.js +0 -84
- package/dist/infrastructure/ai/provider-ai-service.js +0 -477
- package/dist/infrastructure/cache/embedding-cache.js +0 -175
- package/dist/infrastructure/cache/query-result-cache.js +0 -66
- package/dist/infrastructure/cache/response-cache.js +0 -48
- package/dist/infrastructure/cache/security-scan-cache.js +0 -47
- package/dist/infrastructure/chunking/ast-code-chunker.js +0 -19
- package/dist/infrastructure/chunking/code-aware-chunker.js +0 -397
- package/dist/infrastructure/context/context-compressor.js +0 -329
- package/dist/infrastructure/context/conversation-context.js +0 -128
- package/dist/infrastructure/context/session-manager.js +0 -94
- package/dist/infrastructure/cost/cost-tracker.js +0 -360
- package/dist/infrastructure/file-scanner/file-scanner.js +0 -106
- package/dist/infrastructure/governance/nist-ai-rmf.js +0 -292
- package/dist/infrastructure/governance/policy-as-code.js +0 -258
- package/dist/infrastructure/governance/prompt-to-code-lineage.js +0 -239
- package/dist/infrastructure/index.js +0 -7
- package/dist/infrastructure/observability/prompt-versioner.js +0 -145
- package/dist/infrastructure/protocols/a2a-metadata.js +0 -137
- package/dist/infrastructure/protocols/a2a-protocol.js +0 -314
- package/dist/infrastructure/protocols/mcp-oauth.js +0 -184
- package/dist/infrastructure/protocols/mcp-server.js +0 -333
- package/dist/infrastructure/protocols/streaming-handler.js +0 -103
- package/dist/infrastructure/providers/cohere-provider.js +0 -444
- package/dist/infrastructure/providers/fake-provider.js +0 -130
- package/dist/infrastructure/providers/local-llm-provider.js +0 -330
- package/dist/infrastructure/providers/model-config.types.js +0 -9
- package/dist/infrastructure/providers/model-provider.interface.js +0 -8
- package/dist/infrastructure/providers/openai-provider.js +0 -413
- package/dist/infrastructure/providers/openrouter-provider.js +0 -399
- package/dist/infrastructure/providers/operation-provider-resolver.js +0 -105
- package/dist/infrastructure/providers/provider-config-loader.js +0 -120
- package/dist/infrastructure/providers/provider-registry.js +0 -88
- package/dist/infrastructure/safety/pattern-detector.js +0 -133
- package/dist/infrastructure/security/ai-sast-scanner.js +0 -290
- package/dist/infrastructure/security/docker-sandbox.js +0 -178
- package/dist/infrastructure/security/enhanced-security-gate.js +0 -151
- package/dist/infrastructure/security/license-scanner.js +0 -167
- package/dist/infrastructure/security/provider-bias-detector.js +0 -164
- package/dist/infrastructure/security/sandbox-executor.js +0 -64
- package/dist/infrastructure/serialization/toon-serializer.js +0 -119
- package/dist/infrastructure/storage/memory-stream-service.js +0 -204
- package/dist/infrastructure/storage/plan-repository.js +0 -96
- package/dist/infrastructure/storage/sqlite-decision-repository.js +0 -232
- package/dist/infrastructure/storage/sqlite-embedding-repository.js +0 -311
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.js +0 -417
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.js +0 -230
- package/dist/infrastructure/storage/sqlite-memory-repository.js +0 -229
- package/dist/infrastructure/storage/sqlite-pattern-repository.js +0 -249
- package/dist/infrastructure/storage/task-helpers.js +0 -197
- package/dist/infrastructure/telemetry/telemetry-service.js +0 -167
- package/dist/infrastructure/ux/appropriate-friction.js +0 -213
- package/dist/infrastructure/ux/bi-directional-learning.js +0 -337
- package/dist/infrastructure/ux/capability-boundaries.js +0 -42
- package/dist/infrastructure/ux/comprehensive-formatter.js +0 -117
- package/dist/infrastructure/ux/contextual-feature-discovery.js +0 -10
- package/dist/infrastructure/ux/expectation-management.js +0 -327
- package/dist/infrastructure/ux/feature-discovery.js +0 -14
- package/dist/infrastructure/ux/feedback-prompt.js +0 -45
- package/dist/infrastructure/ux/hitl-validation.js +0 -297
- package/dist/infrastructure/ux/progress-indicator.js +0 -116
- package/dist/infrastructure/ux/progressive-disclosure.js +0 -236
- package/dist/infrastructure/ux/review-checkpoint.js +0 -72
- package/dist/infrastructure/ux/staged-feature-intro.js +0 -24
- package/dist/infrastructure/ux/stream-markdown.js +0 -151
- package/dist/infrastructure/ux/syntax-highlighter.js +0 -91
- package/dist/infrastructure/ux/team-standards.js +0 -196
- package/dist/infrastructure/ux/transparency.js +0 -71
- package/dist/infrastructure/validation/agent-feedback.js +0 -55
- package/dist/infrastructure/validation/agent-validation-helper.js +0 -137
- package/dist/infrastructure/validation/review-handler.js +0 -40
- package/dist/infrastructure/validation/summary-aggregator.js +0 -70
- package/dist/infrastructure/validation/summary-extractor.js +0 -45
- package/dist/infrastructure/validation/trace-summary.js +0 -52
- package/dist/infrastructure/verification/verification-service.js +0 -47
- package/dist/infrastructure/xai/attention-visualizer.js +0 -172
- package/dist/infrastructure/xai/cot-visualizer.js +0 -283
- package/dist/infrastructure/xai/decision-tree-log.js +0 -212
- package/dist/infrastructure/xai/interactive-xai.js +0 -260
- package/dist/infrastructure/xai/uncertainty-quantifier.js +0 -198
- package/dist/intelligent-retrieval.js +0 -272
- package/dist/intent/classifier.js +0 -2
- package/dist/intent/context.js +0 -2
- package/dist/iterative-refinement.js +0 -189
- package/dist/learning.js +0 -232
- package/dist/log.js +0 -31
- package/dist/migrate.js +0 -133
- package/dist/parallel-processor.js +0 -534
- package/dist/planner.js +0 -198
- package/dist/policy.js +0 -26
- package/dist/presentation/cli/commands/ask-command.js +0 -314
- package/dist/presentation/cli/commands/cost-command.js +0 -191
- package/dist/presentation/cli/commands/decision-command.js +0 -207
- package/dist/presentation/cli/commands/docs-command.js +0 -25
- package/dist/presentation/cli/commands/fix-command.js +0 -53
- package/dist/presentation/cli/commands/knowledge-command.js +0 -129
- package/dist/presentation/cli/commands/learning-dashboard-command.js +0 -183
- package/dist/presentation/cli/commands/models-command.js +0 -194
- package/dist/presentation/cli/commands/orchestrate-command.js +0 -207
- package/dist/presentation/cli/commands/plan-command.js +0 -246
- package/dist/presentation/cli/commands/product-command.js +0 -199
- package/dist/presentation/cli/commands/react-command.js +0 -181
- package/dist/presentation/cli/commands/review-command.js +0 -154
- package/dist/presentation/cli/commands/run-command.js +0 -188
- package/dist/presentation/cli/commands/smart-command.js +0 -395
- package/dist/presentation/cli/commands/suggest-command.js +0 -138
- package/dist/presentation/cli/commands/trace-command.js +0 -129
- package/dist/presentation/cli/commands/undo-command.js +0 -150
- package/dist/query-optimizer.js +0 -205
- package/dist/refactor.js +0 -116
- package/dist/review.js +0 -206
- package/dist/search.js +0 -163
- package/dist/session.js +0 -704
- package/dist/task-verification.js +0 -336
- package/dist/testgen.js +0 -166
- package/dist/token-optimizer.js +0 -277
- package/dist/tools/bash.js +0 -213
- package/dist/tools/edit.js +0 -235
- package/dist/tools/executor.js +0 -153
- package/dist/tools/git-tool.js +0 -292
- package/dist/tools/parser.js +0 -158
- package/dist/tools/registry.js +0 -302
- package/dist/tools/search.js +0 -100
- package/dist/types.js +0 -2
- package/dist/utils/check-api-status.js +0 -100
- package/dist/utils/diff-parser.js +0 -162
- package/dist/verification/backup.js +0 -259
- package/dist/verification/compiler.js +0 -264
- package/dist/verification/index.js +0 -273
- package/dist/verification/test-runner.js +0 -379
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Task Completion Verification System
|
|
3
|
-
* Verify code compiles, runs, meets requirements, rollback on failure
|
|
4
|
-
*/
|
|
5
|
-
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
6
|
-
import { join, dirname } from 'path';
|
|
7
|
-
import { execSync } from 'child_process';
|
|
8
|
-
import { applyUnifiedDiff } from './edit.js';
|
|
9
|
-
/**
|
|
10
|
-
* Verify task completion
|
|
11
|
-
*/
|
|
12
|
-
export async function verifyTask(context) {
|
|
13
|
-
const result = {
|
|
14
|
-
success: false,
|
|
15
|
-
compiled: false,
|
|
16
|
-
testsPassed: false,
|
|
17
|
-
requirementsMet: false,
|
|
18
|
-
errors: [],
|
|
19
|
-
warnings: [],
|
|
20
|
-
rollbackRequired: false,
|
|
21
|
-
};
|
|
22
|
-
// Step 1: Check if code compiles
|
|
23
|
-
const compileResult = await verifyCompilation(context);
|
|
24
|
-
result.compiled = compileResult.success;
|
|
25
|
-
result.errors.push(...compileResult.errors);
|
|
26
|
-
result.warnings.push(...compileResult.warnings);
|
|
27
|
-
if (!result.compiled) {
|
|
28
|
-
result.rollbackRequired = true;
|
|
29
|
-
return result;
|
|
30
|
-
}
|
|
31
|
-
// Step 2: Check if tests pass
|
|
32
|
-
const testResult = await verifyTests(context);
|
|
33
|
-
result.testsPassed = testResult.success;
|
|
34
|
-
result.errors.push(...testResult.errors);
|
|
35
|
-
result.warnings.push(...testResult.warnings);
|
|
36
|
-
// Step 3: Check if requirements are met
|
|
37
|
-
if (context.requirements && context.requirements.length > 0) {
|
|
38
|
-
const reqResult = await verifyRequirements(context);
|
|
39
|
-
result.requirementsMet = reqResult.success;
|
|
40
|
-
result.errors.push(...reqResult.errors);
|
|
41
|
-
result.warnings.push(...reqResult.warnings);
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
result.requirementsMet = true; // No requirements specified
|
|
45
|
-
}
|
|
46
|
-
// Overall success
|
|
47
|
-
result.success = result.compiled &&
|
|
48
|
-
(result.testsPassed || !testResult.ran) && // Tests optional if not run
|
|
49
|
-
result.requirementsMet;
|
|
50
|
-
if (!result.success) {
|
|
51
|
-
result.rollbackRequired = true;
|
|
52
|
-
}
|
|
53
|
-
return result;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Verify code compiles
|
|
57
|
-
*/
|
|
58
|
-
async function verifyCompilation(context) {
|
|
59
|
-
const errors = [];
|
|
60
|
-
const warnings = [];
|
|
61
|
-
try {
|
|
62
|
-
const ext = context.filepath.split('.').pop()?.toLowerCase();
|
|
63
|
-
if (ext === 'ts' || ext === 'tsx') {
|
|
64
|
-
// TypeScript compilation check
|
|
65
|
-
const result = checkTypeScript(context.filepath);
|
|
66
|
-
if (!result.success) {
|
|
67
|
-
errors.push(...result.errors);
|
|
68
|
-
warnings.push(...result.warnings);
|
|
69
|
-
return { success: false, errors, warnings };
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
else if (ext === 'js' || ext === 'jsx') {
|
|
73
|
-
// JavaScript syntax check
|
|
74
|
-
const result = checkJavaScript(context.filepath);
|
|
75
|
-
if (!result.success) {
|
|
76
|
-
errors.push(...result.errors);
|
|
77
|
-
warnings.push(...result.warnings);
|
|
78
|
-
return { success: false, errors, warnings };
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return { success: true, errors, warnings };
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
errors.push(`Compilation check failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
85
|
-
return { success: false, errors, warnings };
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Check TypeScript compilation
|
|
90
|
-
*/
|
|
91
|
-
function checkTypeScript(filepath) {
|
|
92
|
-
const errors = [];
|
|
93
|
-
const warnings = [];
|
|
94
|
-
try {
|
|
95
|
-
// Try to run tsc --noEmit on the file
|
|
96
|
-
const dir = dirname(filepath);
|
|
97
|
-
const result = execSync(`npx tsc --noEmit --skipLibCheck "${filepath}" 2>&1`, { cwd: dir, encoding: 'utf-8', stdio: 'pipe' });
|
|
98
|
-
// If there's output, there are errors
|
|
99
|
-
if (result.trim().length > 0) {
|
|
100
|
-
const lines = result.split('\n');
|
|
101
|
-
for (const line of lines) {
|
|
102
|
-
if (line.includes('error TS')) {
|
|
103
|
-
errors.push(line);
|
|
104
|
-
}
|
|
105
|
-
else if (line.includes('warning TS')) {
|
|
106
|
-
warnings.push(line);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return {
|
|
111
|
-
success: errors.length === 0,
|
|
112
|
-
errors,
|
|
113
|
-
warnings,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
catch (error) {
|
|
117
|
-
// execSync throws on non-zero exit
|
|
118
|
-
const output = error.stdout || error.stderr || error.message || '';
|
|
119
|
-
const lines = output.split('\n');
|
|
120
|
-
for (const line of lines) {
|
|
121
|
-
if (line.includes('error TS')) {
|
|
122
|
-
errors.push(line);
|
|
123
|
-
}
|
|
124
|
-
else if (line.includes('warning TS')) {
|
|
125
|
-
warnings.push(line);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return {
|
|
129
|
-
success: false,
|
|
130
|
-
errors: errors.length > 0 ? errors : [output],
|
|
131
|
-
warnings,
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Check JavaScript syntax
|
|
137
|
-
*/
|
|
138
|
-
function checkJavaScript(filepath) {
|
|
139
|
-
const errors = [];
|
|
140
|
-
const warnings = [];
|
|
141
|
-
try {
|
|
142
|
-
// Try to parse with node
|
|
143
|
-
const content = readFileSync(filepath, 'utf-8');
|
|
144
|
-
// Basic syntax check: use node --check (parse-only, no execution)
|
|
145
|
-
try {
|
|
146
|
-
execSync(`node --check "${filepath}"`, { stdio: 'pipe' });
|
|
147
|
-
}
|
|
148
|
-
catch (parseError) {
|
|
149
|
-
const msg = parseError instanceof Error ? parseError.message : String(parseError);
|
|
150
|
-
errors.push(`Syntax error: ${msg}`);
|
|
151
|
-
return { success: false, errors, warnings };
|
|
152
|
-
}
|
|
153
|
-
return { success: true, errors, warnings };
|
|
154
|
-
}
|
|
155
|
-
catch (error) {
|
|
156
|
-
errors.push(`JavaScript check failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
157
|
-
return { success: false, errors, warnings };
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Verify tests pass
|
|
162
|
-
*/
|
|
163
|
-
async function verifyTests(context) {
|
|
164
|
-
const errors = [];
|
|
165
|
-
const warnings = [];
|
|
166
|
-
try {
|
|
167
|
-
// Look for test files
|
|
168
|
-
const testFiles = findTestFiles(context.filepath);
|
|
169
|
-
if (testFiles.length === 0) {
|
|
170
|
-
return { success: true, ran: false, errors, warnings }; // No tests to run
|
|
171
|
-
}
|
|
172
|
-
// Try to run tests
|
|
173
|
-
const dir = dirname(context.filepath);
|
|
174
|
-
let testCommand = '';
|
|
175
|
-
// Detect test framework
|
|
176
|
-
if (existsSync(join(dir, 'package.json'))) {
|
|
177
|
-
const packageJson = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8'));
|
|
178
|
-
const scripts = packageJson.scripts || {};
|
|
179
|
-
if (scripts.test) {
|
|
180
|
-
testCommand = scripts.test;
|
|
181
|
-
}
|
|
182
|
-
else if (scripts['test:unit']) {
|
|
183
|
-
testCommand = scripts['test:unit'];
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
if (!testCommand) {
|
|
187
|
-
// Try common test commands
|
|
188
|
-
if (existsSync(join(dir, 'jest.config.js')) || existsSync(join(dir, 'jest.config.ts'))) {
|
|
189
|
-
testCommand = 'npx jest';
|
|
190
|
-
}
|
|
191
|
-
else if (existsSync(join(dir, 'vitest.config.ts'))) {
|
|
192
|
-
testCommand = 'npx vitest run';
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
return { success: true, ran: false, errors, warnings }; // Can't determine test framework
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
try {
|
|
199
|
-
const result = execSync(testCommand, {
|
|
200
|
-
cwd: dir,
|
|
201
|
-
encoding: 'utf-8',
|
|
202
|
-
stdio: 'pipe',
|
|
203
|
-
timeout: 30000, // 30 second timeout
|
|
204
|
-
});
|
|
205
|
-
// Check if tests passed (look for "PASS" or "✓" in output)
|
|
206
|
-
const passed = result.includes('PASS') ||
|
|
207
|
-
result.includes('✓') ||
|
|
208
|
-
(result.includes('passed') && !result.includes('failed'));
|
|
209
|
-
if (!passed) {
|
|
210
|
-
errors.push('Tests failed');
|
|
211
|
-
errors.push(result);
|
|
212
|
-
}
|
|
213
|
-
return {
|
|
214
|
-
success: passed,
|
|
215
|
-
ran: true,
|
|
216
|
-
errors,
|
|
217
|
-
warnings,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
catch (error) {
|
|
221
|
-
const output = error.stdout || error.stderr || error.message || '';
|
|
222
|
-
errors.push(`Test execution failed: ${output}`);
|
|
223
|
-
return { success: false, ran: true, errors, warnings };
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
catch (error) {
|
|
227
|
-
warnings.push(`Could not verify tests: ${error instanceof Error ? error.message : String(error)}`);
|
|
228
|
-
return { success: true, ran: false, errors, warnings }; // Don't fail if we can't run tests
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Find test files for a given file
|
|
233
|
-
*/
|
|
234
|
-
function findTestFiles(filepath) {
|
|
235
|
-
const dir = dirname(filepath);
|
|
236
|
-
const basename = filepath.split('/').pop()?.replace(/\.[^.]+$/, '') || '';
|
|
237
|
-
const testPatterns = [
|
|
238
|
-
`${basename}.test.ts`,
|
|
239
|
-
`${basename}.test.js`,
|
|
240
|
-
`${basename}.spec.ts`,
|
|
241
|
-
`${basename}.spec.js`,
|
|
242
|
-
`__tests__/${basename}.ts`,
|
|
243
|
-
`__tests__/${basename}.js`,
|
|
244
|
-
];
|
|
245
|
-
const testFiles = [];
|
|
246
|
-
for (const pattern of testPatterns) {
|
|
247
|
-
const testPath = join(dir, pattern);
|
|
248
|
-
if (existsSync(testPath)) {
|
|
249
|
-
testFiles.push(testPath);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
return testFiles;
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Verify requirements are met
|
|
256
|
-
*/
|
|
257
|
-
async function verifyRequirements(context) {
|
|
258
|
-
const errors = [];
|
|
259
|
-
const warnings = [];
|
|
260
|
-
if (!context.requirements || context.requirements.length === 0) {
|
|
261
|
-
return { success: true, errors, warnings };
|
|
262
|
-
}
|
|
263
|
-
const content = context.modifiedContent.toLowerCase();
|
|
264
|
-
for (const requirement of context.requirements) {
|
|
265
|
-
const reqLower = requirement.toLowerCase();
|
|
266
|
-
// Simple keyword matching (can be enhanced with AI)
|
|
267
|
-
const keywords = reqLower.split(/\s+/).filter(w => w.length > 3);
|
|
268
|
-
const matches = keywords.filter(kw => content.includes(kw));
|
|
269
|
-
if (matches.length < keywords.length * 0.5) {
|
|
270
|
-
// Less than 50% of keywords found
|
|
271
|
-
warnings.push(`Requirement may not be met: ${requirement}`);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
return {
|
|
275
|
-
success: warnings.length === 0,
|
|
276
|
-
errors,
|
|
277
|
-
warnings,
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Rollback changes
|
|
282
|
-
*/
|
|
283
|
-
export function rollbackChanges(context) {
|
|
284
|
-
try {
|
|
285
|
-
writeFileSync(context.filepath, context.originalContent, 'utf-8');
|
|
286
|
-
}
|
|
287
|
-
catch (error) {
|
|
288
|
-
throw new Error(`Failed to rollback: ${error instanceof Error ? error.message : String(error)}`);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* Apply changes with verification and rollback on failure
|
|
293
|
-
*/
|
|
294
|
-
export async function applyWithVerification(filepath, diff, instruction, requirements) {
|
|
295
|
-
// Read original content
|
|
296
|
-
const originalContent = readFileSync(filepath, 'utf-8');
|
|
297
|
-
// Apply diff
|
|
298
|
-
const modifiedContent = applyUnifiedDiff(originalContent, diff);
|
|
299
|
-
// Create context
|
|
300
|
-
const context = {
|
|
301
|
-
filepath,
|
|
302
|
-
originalContent,
|
|
303
|
-
modifiedContent,
|
|
304
|
-
diff,
|
|
305
|
-
instruction,
|
|
306
|
-
requirements,
|
|
307
|
-
};
|
|
308
|
-
// Write modified content temporarily
|
|
309
|
-
writeFileSync(filepath, modifiedContent, 'utf-8');
|
|
310
|
-
try {
|
|
311
|
-
// Verify
|
|
312
|
-
const result = await verifyTask(context);
|
|
313
|
-
if (!result.success || result.rollbackRequired) {
|
|
314
|
-
// Rollback
|
|
315
|
-
rollbackChanges(context);
|
|
316
|
-
return {
|
|
317
|
-
success: false,
|
|
318
|
-
verified: false,
|
|
319
|
-
result,
|
|
320
|
-
rolledBack: true,
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
return {
|
|
324
|
-
success: true,
|
|
325
|
-
verified: true,
|
|
326
|
-
result,
|
|
327
|
-
rolledBack: false,
|
|
328
|
-
};
|
|
329
|
-
}
|
|
330
|
-
catch (error) {
|
|
331
|
-
// Rollback on error
|
|
332
|
-
rollbackChanges(context);
|
|
333
|
-
throw error;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
//# sourceMappingURL=task-verification.js.map
|
package/dist/testgen.js
DELETED
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test Generation System
|
|
3
|
-
* Generate comprehensive tests for code
|
|
4
|
-
*/
|
|
5
|
-
import { readFileSync, existsSync, writeFileSync, mkdirSync } from 'fs';
|
|
6
|
-
import { join, dirname, basename } from 'path';
|
|
7
|
-
import { chatWithContext } from './chat.js';
|
|
8
|
-
import { getEnhancedContext } from './context.js';
|
|
9
|
-
/**
|
|
10
|
-
* Generate tests for a file
|
|
11
|
-
*/
|
|
12
|
-
export async function generateTests(filepath, options = {}) {
|
|
13
|
-
const fullPath = join(process.cwd(), filepath);
|
|
14
|
-
if (!existsSync(fullPath)) {
|
|
15
|
-
throw new Error(`File not found: ${filepath}`);
|
|
16
|
-
}
|
|
17
|
-
const content = readFileSync(fullPath, 'utf-8');
|
|
18
|
-
const ext = filepath.split('.').pop()?.toLowerCase() || '';
|
|
19
|
-
// Detect test framework
|
|
20
|
-
const framework = options.framework || detectTestFramework(filepath, ext);
|
|
21
|
-
const coverage = options.coverage || 'unit';
|
|
22
|
-
// Get context
|
|
23
|
-
const context = await getEnhancedContext(`Generate ${coverage} tests for ${filepath}`, {
|
|
24
|
-
primaryChunks: 15,
|
|
25
|
-
includeRelationships: true,
|
|
26
|
-
});
|
|
27
|
-
// Create test generation prompt
|
|
28
|
-
const testPrompt = `Generate comprehensive ${coverage} tests for this code file:
|
|
29
|
-
|
|
30
|
-
File: ${filepath}
|
|
31
|
-
Test Framework: ${framework}
|
|
32
|
-
Code:
|
|
33
|
-
\`\`\`${ext}
|
|
34
|
-
${content}
|
|
35
|
-
\`\`\`
|
|
36
|
-
|
|
37
|
-
Generate:
|
|
38
|
-
1. Test file structure
|
|
39
|
-
2. Test cases for all functions/methods
|
|
40
|
-
3. Edge cases and error handling
|
|
41
|
-
4. Mock setup if needed
|
|
42
|
-
5. Assertions for expected behavior
|
|
43
|
-
|
|
44
|
-
Use ${framework} testing framework. Format as complete test file.`;
|
|
45
|
-
const contextResults = [{
|
|
46
|
-
filepath,
|
|
47
|
-
content,
|
|
48
|
-
score: 1.0,
|
|
49
|
-
}, ...context.primaryChunks];
|
|
50
|
-
const tests = await chatWithContext(testPrompt, contextResults);
|
|
51
|
-
return tests;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Detect test framework from file extension and content
|
|
55
|
-
*/
|
|
56
|
-
function detectTestFramework(filepath, ext) {
|
|
57
|
-
// Check for existing test files
|
|
58
|
-
const testPatterns = [
|
|
59
|
-
{ pattern: /\.test\./i, framework: 'jest' },
|
|
60
|
-
{ pattern: /\.spec\./i, framework: 'jest' },
|
|
61
|
-
{ pattern: /test_/i, framework: 'pytest' },
|
|
62
|
-
{ pattern: /_test\./i, framework: 'go test' },
|
|
63
|
-
];
|
|
64
|
-
for (const { pattern, framework } of testPatterns) {
|
|
65
|
-
if (pattern.test(filepath)) {
|
|
66
|
-
return framework;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
// Default by extension
|
|
70
|
-
const frameworkMap = {
|
|
71
|
-
'ts': 'jest',
|
|
72
|
-
'tsx': 'jest',
|
|
73
|
-
'js': 'jest',
|
|
74
|
-
'jsx': 'jest',
|
|
75
|
-
'py': 'pytest',
|
|
76
|
-
'go': 'go test',
|
|
77
|
-
'java': 'junit',
|
|
78
|
-
'rb': 'rspec',
|
|
79
|
-
};
|
|
80
|
-
return frameworkMap[ext] || 'jest';
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Generate test file path
|
|
84
|
-
*/
|
|
85
|
-
export function getTestFilePath(filepath, framework) {
|
|
86
|
-
const ext = filepath.split('.').pop() || '';
|
|
87
|
-
const baseName = filepath.replace(/\.[^/.]+$/, '');
|
|
88
|
-
const dir = dirname(filepath);
|
|
89
|
-
// Framework-specific naming
|
|
90
|
-
if (framework === 'pytest' || ext === 'py') {
|
|
91
|
-
return join(dir, `test_${basename(filepath)}`);
|
|
92
|
-
}
|
|
93
|
-
else if (framework === 'go test' || ext === 'go') {
|
|
94
|
-
return join(dir, `${baseName}_test.${ext}`);
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
// Jest/Mocha style
|
|
98
|
-
return join(dir, `${baseName}.test.${ext}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Save generated tests to file
|
|
103
|
-
*/
|
|
104
|
-
export function saveTests(filepath, testContent) {
|
|
105
|
-
const fullPath = join(process.cwd(), filepath);
|
|
106
|
-
const dir = dirname(fullPath);
|
|
107
|
-
if (!existsSync(dir)) {
|
|
108
|
-
mkdirSync(dir, { recursive: true });
|
|
109
|
-
}
|
|
110
|
-
writeFileSync(fullPath, testContent, 'utf-8');
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Improve existing tests
|
|
114
|
-
*/
|
|
115
|
-
export async function improveTests(testFilepath) {
|
|
116
|
-
const fullPath = join(process.cwd(), testFilepath);
|
|
117
|
-
if (!existsSync(fullPath)) {
|
|
118
|
-
throw new Error(`Test file not found: ${testFilepath}`);
|
|
119
|
-
}
|
|
120
|
-
const testContent = readFileSync(fullPath, 'utf-8');
|
|
121
|
-
// Find corresponding source file
|
|
122
|
-
const sourceFile = testFilepath
|
|
123
|
-
.replace(/\.test\./, '.')
|
|
124
|
-
.replace(/\.spec\./, '.')
|
|
125
|
-
.replace(/test_/, '')
|
|
126
|
-
.replace(/_test\./, '.');
|
|
127
|
-
let sourceContent = '';
|
|
128
|
-
try {
|
|
129
|
-
const sourcePath = join(process.cwd(), sourceFile);
|
|
130
|
-
if (existsSync(sourcePath)) {
|
|
131
|
-
sourceContent = readFileSync(sourcePath, 'utf-8');
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
catch {
|
|
135
|
-
// Source file might not exist
|
|
136
|
-
}
|
|
137
|
-
const improvePrompt = `Improve this test file with better coverage and edge cases:
|
|
138
|
-
|
|
139
|
-
Test file: ${testFilepath}
|
|
140
|
-
Current tests:
|
|
141
|
-
\`\`\`
|
|
142
|
-
${testContent}
|
|
143
|
-
\`\`\`
|
|
144
|
-
|
|
145
|
-
Source code:
|
|
146
|
-
\`\`\`
|
|
147
|
-
${sourceContent.substring(0, 1000)}
|
|
148
|
-
\`\`\`
|
|
149
|
-
|
|
150
|
-
Improve by:
|
|
151
|
-
1. Adding missing test cases
|
|
152
|
-
2. Adding edge case tests
|
|
153
|
-
3. Improving assertions
|
|
154
|
-
4. Adding error handling tests
|
|
155
|
-
5. Improving test organization
|
|
156
|
-
|
|
157
|
-
Provide the improved test file.`;
|
|
158
|
-
const contextResults = [{
|
|
159
|
-
filepath: testFilepath,
|
|
160
|
-
content: testContent,
|
|
161
|
-
score: 1.0,
|
|
162
|
-
}];
|
|
163
|
-
const improvedTests = await chatWithContext(improvePrompt, contextResults);
|
|
164
|
-
return improvedTests;
|
|
165
|
-
}
|
|
166
|
-
//# sourceMappingURL=testgen.js.map
|