compact-agent 1.1.0
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 +394 -0
- package/bin/anycode.js +2 -0
- package/bin/crowcoder.js +19 -0
- package/bin/ecc-hooks.cjs +138 -0
- package/dist/agents.d.ts +17 -0
- package/dist/agents.js +1603 -0
- package/dist/agents.js.map +1 -0
- package/dist/api.d.ts +16 -0
- package/dist/api.js +115 -0
- package/dist/api.js.map +1 -0
- package/dist/autonomous-loops.d.ts +108 -0
- package/dist/autonomous-loops.js +526 -0
- package/dist/autonomous-loops.js.map +1 -0
- package/dist/codemaps.d.ts +53 -0
- package/dist/codemaps.js +325 -0
- package/dist/codemaps.js.map +1 -0
- package/dist/compaction.d.ts +30 -0
- package/dist/compaction.js +125 -0
- package/dist/compaction.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -0
- package/dist/content-engine.d.ts +97 -0
- package/dist/content-engine.js +721 -0
- package/dist/content-engine.js.map +1 -0
- package/dist/cost-tracker.d.ts +49 -0
- package/dist/cost-tracker.js +150 -0
- package/dist/cost-tracker.js.map +1 -0
- package/dist/counter-button.d.ts +35 -0
- package/dist/counter-button.js +48 -0
- package/dist/counter-button.js.map +1 -0
- package/dist/counter.d.ts +21 -0
- package/dist/counter.js +31 -0
- package/dist/counter.js.map +1 -0
- package/dist/coverage.d.ts +23 -0
- package/dist/coverage.js +215 -0
- package/dist/coverage.js.map +1 -0
- package/dist/docs-sync.d.ts +23 -0
- package/dist/docs-sync.js +266 -0
- package/dist/docs-sync.js.map +1 -0
- package/dist/ecc.d.ts +41 -0
- package/dist/ecc.js +644 -0
- package/dist/ecc.js.map +1 -0
- package/dist/evaluation.d.ts +24 -0
- package/dist/evaluation.js +412 -0
- package/dist/evaluation.js.map +1 -0
- package/dist/export.d.ts +22 -0
- package/dist/export.js +109 -0
- package/dist/export.js.map +1 -0
- package/dist/git-workflow.d.ts +22 -0
- package/dist/git-workflow.js +197 -0
- package/dist/git-workflow.js.map +1 -0
- package/dist/hook-controls.d.ts +34 -0
- package/dist/hook-controls.js +90 -0
- package/dist/hook-controls.js.map +1 -0
- package/dist/hooks.d.ts +30 -0
- package/dist/hooks.js +130 -0
- package/dist/hooks.js.map +1 -0
- package/dist/html-parser.d.ts +18 -0
- package/dist/html-parser.js +101 -0
- package/dist/html-parser.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +1230 -0
- package/dist/index.js.map +1 -0
- package/dist/learning.d.ts +35 -0
- package/dist/learning.js +238 -0
- package/dist/learning.js.map +1 -0
- package/dist/login.d.ts +37 -0
- package/dist/login.js +191 -0
- package/dist/login.js.map +1 -0
- package/dist/memory.d.ts +39 -0
- package/dist/memory.js +183 -0
- package/dist/memory.js.map +1 -0
- package/dist/model-router.d.ts +23 -0
- package/dist/model-router.js +145 -0
- package/dist/model-router.js.map +1 -0
- package/dist/modes.d.ts +17 -0
- package/dist/modes.js +217 -0
- package/dist/modes.js.map +1 -0
- package/dist/orchestration.d.ts +37 -0
- package/dist/orchestration.js +139 -0
- package/dist/orchestration.js.map +1 -0
- package/dist/package-detect.d.ts +36 -0
- package/dist/package-detect.js +529 -0
- package/dist/package-detect.js.map +1 -0
- package/dist/permissions.d.ts +25 -0
- package/dist/permissions.js +50 -0
- package/dist/permissions.js.map +1 -0
- package/dist/pm2-manager.d.ts +40 -0
- package/dist/pm2-manager.js +127 -0
- package/dist/pm2-manager.js.map +1 -0
- package/dist/query.d.ts +15 -0
- package/dist/query.js +278 -0
- package/dist/query.js.map +1 -0
- package/dist/refactor.d.ts +22 -0
- package/dist/refactor.js +226 -0
- package/dist/refactor.js.map +1 -0
- package/dist/retry.d.ts +20 -0
- package/dist/retry.js +88 -0
- package/dist/retry.js.map +1 -0
- package/dist/rules.d.ts +34 -0
- package/dist/rules.js +942 -0
- package/dist/rules.js.map +1 -0
- package/dist/schema.d.ts +23 -0
- package/dist/schema.js +12 -0
- package/dist/schema.js.map +1 -0
- package/dist/search-first.d.ts +17 -0
- package/dist/search-first.js +301 -0
- package/dist/search-first.js.map +1 -0
- package/dist/security.d.ts +10 -0
- package/dist/security.js +145 -0
- package/dist/security.js.map +1 -0
- package/dist/sessions.d.ts +21 -0
- package/dist/sessions.js +112 -0
- package/dist/sessions.js.map +1 -0
- package/dist/skill-create.d.ts +38 -0
- package/dist/skill-create.js +389 -0
- package/dist/skill-create.js.map +1 -0
- package/dist/skills.d.ts +34 -0
- package/dist/skills.js +161 -0
- package/dist/skills.js.map +1 -0
- package/dist/strategic-compaction.d.ts +24 -0
- package/dist/strategic-compaction.js +144 -0
- package/dist/strategic-compaction.js.map +1 -0
- package/dist/system-prompt.d.ts +3 -0
- package/dist/system-prompt.js +101 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/theme.d.ts +60 -0
- package/dist/theme.js +220 -0
- package/dist/theme.js.map +1 -0
- package/dist/tools/bash.d.ts +2 -0
- package/dist/tools/bash.js +49 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.js +76 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/glob.d.ts +2 -0
- package/dist/tools/glob.js +54 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +2 -0
- package/dist/tools/grep.js +64 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-dir.d.ts +2 -0
- package/dist/tools/list-dir.js +51 -0
- package/dist/tools/list-dir.js.map +1 -0
- package/dist/tools/read.d.ts +2 -0
- package/dist/tools/read.js +56 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/types.d.ts +45 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +2 -0
- package/dist/tools/web-fetch.js +41 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +27 -0
- package/dist/tools/web-search.js +139 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/write.d.ts +2 -0
- package/dist/tools/write.js +36 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.js +57 -0
- package/dist/types.js.map +1 -0
- package/dist/users.d.ts +51 -0
- package/dist/users.js +193 -0
- package/dist/users.js.map +1 -0
- package/dist/verification.d.ts +73 -0
- package/dist/verification.js +269 -0
- package/dist/verification.js.map +1 -0
- package/dist/walkthrough.d.ts +10 -0
- package/dist/walkthrough.js +121 -0
- package/dist/walkthrough.js.map +1 -0
- package/package.json +58 -0
- package/resources/ecc/agents/architect.json +16 -0
- package/resources/ecc/agents/architect.md +212 -0
- package/resources/ecc/agents/build-error-resolver.json +17 -0
- package/resources/ecc/agents/build-error-resolver.md +116 -0
- package/resources/ecc/agents/chief-of-staff.json +17 -0
- package/resources/ecc/agents/chief-of-staff.md +153 -0
- package/resources/ecc/agents/code-reviewer.json +16 -0
- package/resources/ecc/agents/code-reviewer.md +238 -0
- package/resources/ecc/agents/database-reviewer.json +16 -0
- package/resources/ecc/agents/database-reviewer.md +92 -0
- package/resources/ecc/agents/doc-updater.json +16 -0
- package/resources/ecc/agents/doc-updater.md +108 -0
- package/resources/ecc/agents/e2e-runner.json +17 -0
- package/resources/ecc/agents/e2e-runner.md +109 -0
- package/resources/ecc/agents/go-build-resolver.json +17 -0
- package/resources/ecc/agents/go-build-resolver.md +96 -0
- package/resources/ecc/agents/go-reviewer.json +16 -0
- package/resources/ecc/agents/go-reviewer.md +77 -0
- package/resources/ecc/agents/harness-optimizer.json +15 -0
- package/resources/ecc/agents/harness-optimizer.md +34 -0
- package/resources/ecc/agents/loop-operator.json +16 -0
- package/resources/ecc/agents/loop-operator.md +36 -0
- package/resources/ecc/agents/planner.json +15 -0
- package/resources/ecc/agents/planner.md +212 -0
- package/resources/ecc/agents/python-reviewer.json +16 -0
- package/resources/ecc/agents/python-reviewer.md +99 -0
- package/resources/ecc/agents/refactor-cleaner.json +17 -0
- package/resources/ecc/agents/refactor-cleaner.md +87 -0
- package/resources/ecc/agents/security-reviewer.json +16 -0
- package/resources/ecc/agents/security-reviewer.md +109 -0
- package/resources/ecc/agents/tdd-guide.json +17 -0
- package/resources/ecc/agents/tdd-guide.md +93 -0
- package/resources/ecc/commands/add-language-rules.md +39 -0
- package/resources/ecc/commands/database-migration.md +36 -0
- package/resources/ecc/commands/feature-development.md +38 -0
- package/resources/ecc/prompts/build-fix.prompt.md +47 -0
- package/resources/ecc/prompts/code-review.prompt.md +56 -0
- package/resources/ecc/prompts/plan.prompt.md +52 -0
- package/resources/ecc/prompts/refactor.prompt.md +50 -0
- package/resources/ecc/prompts/security-review.prompt.md +70 -0
- package/resources/ecc/prompts/tdd.prompt.md +47 -0
- package/resources/ecc/rules/common-agents.md +53 -0
- package/resources/ecc/rules/common-coding-style.md +52 -0
- package/resources/ecc/rules/common-development-workflow.md +33 -0
- package/resources/ecc/rules/common-git-workflow.md +28 -0
- package/resources/ecc/rules/common-hooks.md +34 -0
- package/resources/ecc/rules/common-patterns.md +35 -0
- package/resources/ecc/rules/common-performance.md +59 -0
- package/resources/ecc/rules/common-security.md +33 -0
- package/resources/ecc/rules/common-testing.md +33 -0
- package/resources/ecc/rules/golang-coding-style.md +31 -0
- package/resources/ecc/rules/golang-hooks.md +16 -0
- package/resources/ecc/rules/golang-patterns.md +44 -0
- package/resources/ecc/rules/golang-security.md +33 -0
- package/resources/ecc/rules/golang-testing.md +30 -0
- package/resources/ecc/rules/kotlin-coding-style.md +39 -0
- package/resources/ecc/rules/kotlin-hooks.md +16 -0
- package/resources/ecc/rules/kotlin-patterns.md +50 -0
- package/resources/ecc/rules/kotlin-security.md +58 -0
- package/resources/ecc/rules/kotlin-testing.md +38 -0
- package/resources/ecc/rules/php-coding-style.md +25 -0
- package/resources/ecc/rules/php-hooks.md +21 -0
- package/resources/ecc/rules/php-patterns.md +23 -0
- package/resources/ecc/rules/php-security.md +24 -0
- package/resources/ecc/rules/php-testing.md +26 -0
- package/resources/ecc/rules/python-coding-style.md +42 -0
- package/resources/ecc/rules/python-hooks.md +19 -0
- package/resources/ecc/rules/python-patterns.md +39 -0
- package/resources/ecc/rules/python-security.md +30 -0
- package/resources/ecc/rules/python-testing.md +38 -0
- package/resources/ecc/rules/swift-coding-style.md +47 -0
- package/resources/ecc/rules/swift-hooks.md +20 -0
- package/resources/ecc/rules/swift-patterns.md +66 -0
- package/resources/ecc/rules/swift-security.md +33 -0
- package/resources/ecc/rules/swift-testing.md +45 -0
- package/resources/ecc/rules/typescript-coding-style.md +63 -0
- package/resources/ecc/rules/typescript-hooks.md +20 -0
- package/resources/ecc/rules/typescript-patterns.md +50 -0
- package/resources/ecc/rules/typescript-security.md +26 -0
- package/resources/ecc/rules/typescript-testing.md +16 -0
- package/resources/ecc/skills/agent-introspection-debugging/SKILL.md +152 -0
- package/resources/ecc/skills/agent-introspection-debugging/agents/openai.yaml +7 -0
- package/resources/ecc/skills/agent-sort/SKILL.md +214 -0
- package/resources/ecc/skills/agent-sort/agents/openai.yaml +7 -0
- package/resources/ecc/skills/api-design/SKILL.md +522 -0
- package/resources/ecc/skills/api-design/agents/openai.yaml +7 -0
- package/resources/ecc/skills/article-writing/SKILL.md +78 -0
- package/resources/ecc/skills/article-writing/agents/openai.yaml +7 -0
- package/resources/ecc/skills/backend-patterns/SKILL.md +597 -0
- package/resources/ecc/skills/backend-patterns/agents/openai.yaml +7 -0
- package/resources/ecc/skills/brand-voice/SKILL.md +96 -0
- package/resources/ecc/skills/brand-voice/agents/openai.yaml +7 -0
- package/resources/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/resources/ecc/skills/bun-runtime/SKILL.md +83 -0
- package/resources/ecc/skills/bun-runtime/agents/openai.yaml +7 -0
- package/resources/ecc/skills/coding-standards/SKILL.md +548 -0
- package/resources/ecc/skills/coding-standards/agents/openai.yaml +7 -0
- package/resources/ecc/skills/content-engine/SKILL.md +130 -0
- package/resources/ecc/skills/content-engine/agents/openai.yaml +7 -0
- package/resources/ecc/skills/crosspost/SKILL.md +110 -0
- package/resources/ecc/skills/crosspost/agents/openai.yaml +7 -0
- package/resources/ecc/skills/deep-research/SKILL.md +154 -0
- package/resources/ecc/skills/deep-research/agents/openai.yaml +7 -0
- package/resources/ecc/skills/dmux-workflows/SKILL.md +143 -0
- package/resources/ecc/skills/dmux-workflows/agents/openai.yaml +7 -0
- package/resources/ecc/skills/documentation-lookup/SKILL.md +89 -0
- package/resources/ecc/skills/documentation-lookup/agents/openai.yaml +7 -0
- package/resources/ecc/skills/e2e-testing/SKILL.md +325 -0
- package/resources/ecc/skills/e2e-testing/agents/openai.yaml +7 -0
- package/resources/ecc/skills/eval-harness/SKILL.md +235 -0
- package/resources/ecc/skills/eval-harness/agents/openai.yaml +7 -0
- package/resources/ecc/skills/everything-claude-code/SKILL.md +442 -0
- package/resources/ecc/skills/everything-claude-code/agents/openai.yaml +7 -0
- package/resources/ecc/skills/exa-search/SKILL.md +169 -0
- package/resources/ecc/skills/exa-search/agents/openai.yaml +7 -0
- package/resources/ecc/skills/fal-ai-media/SKILL.md +276 -0
- package/resources/ecc/skills/fal-ai-media/agents/openai.yaml +7 -0
- package/resources/ecc/skills/frontend-patterns/SKILL.md +647 -0
- package/resources/ecc/skills/frontend-patterns/agents/openai.yaml +7 -0
- package/resources/ecc/skills/frontend-slides/SKILL.md +183 -0
- package/resources/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/resources/ecc/skills/frontend-slides/agents/openai.yaml +7 -0
- package/resources/ecc/skills/investor-materials/SKILL.md +95 -0
- package/resources/ecc/skills/investor-materials/agents/openai.yaml +7 -0
- package/resources/ecc/skills/investor-outreach/SKILL.md +90 -0
- package/resources/ecc/skills/investor-outreach/agents/openai.yaml +7 -0
- package/resources/ecc/skills/market-research/SKILL.md +74 -0
- package/resources/ecc/skills/market-research/agents/openai.yaml +7 -0
- package/resources/ecc/skills/mcp-server-patterns/SKILL.md +66 -0
- package/resources/ecc/skills/mcp-server-patterns/agents/openai.yaml +7 -0
- package/resources/ecc/skills/mle-workflow/SKILL.md +346 -0
- package/resources/ecc/skills/mle-workflow/agents/openai.yaml +7 -0
- package/resources/ecc/skills/nextjs-turbopack/SKILL.md +43 -0
- package/resources/ecc/skills/nextjs-turbopack/agents/openai.yaml +7 -0
- package/resources/ecc/skills/product-capability/SKILL.md +140 -0
- package/resources/ecc/skills/product-capability/agents/openai.yaml +7 -0
- package/resources/ecc/skills/security-review/SKILL.md +494 -0
- package/resources/ecc/skills/security-review/agents/openai.yaml +7 -0
- package/resources/ecc/skills/strategic-compact/SKILL.md +102 -0
- package/resources/ecc/skills/strategic-compact/agents/openai.yaml +7 -0
- package/resources/ecc/skills/tdd-workflow/SKILL.md +409 -0
- package/resources/ecc/skills/tdd-workflow/agents/openai.yaml +7 -0
- package/resources/ecc/skills/verification-loop/SKILL.md +125 -0
- package/resources/ecc/skills/verification-loop/agents/openai.yaml +7 -0
- package/resources/ecc/skills/video-editing/SKILL.md +307 -0
- package/resources/ecc/skills/video-editing/agents/openai.yaml +7 -0
- package/resources/ecc/skills/x-api/SKILL.md +229 -0
- package/resources/ecc/skills/x-api/agents/openai.yaml +7 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-engine.js","sourceRoot":"","sources":["../src/content-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface UsageEntry {
|
|
2
|
+
timestamp: string;
|
|
3
|
+
sessionId: string;
|
|
4
|
+
model: string;
|
|
5
|
+
promptTokens: number;
|
|
6
|
+
completionTokens: number;
|
|
7
|
+
totalTokens: number;
|
|
8
|
+
estimatedCost: number;
|
|
9
|
+
}
|
|
10
|
+
export interface UsageData {
|
|
11
|
+
entries: UsageEntry[];
|
|
12
|
+
budget: {
|
|
13
|
+
dailyLimit: number;
|
|
14
|
+
monthlyLimit: number;
|
|
15
|
+
alertThreshold: number;
|
|
16
|
+
};
|
|
17
|
+
totals: {
|
|
18
|
+
allTimeTokens: number;
|
|
19
|
+
allTimeCost: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export declare function getModelCost(model: string): {
|
|
23
|
+
input: number;
|
|
24
|
+
output: number;
|
|
25
|
+
};
|
|
26
|
+
export declare function estimateCost(model: string, promptTokens: number, completionTokens: number): number;
|
|
27
|
+
export declare function trackUsage(sessionId: string, model: string, promptTokens: number, completionTokens: number): {
|
|
28
|
+
cost: number;
|
|
29
|
+
warning?: string;
|
|
30
|
+
};
|
|
31
|
+
export declare function getUsageSummary(): {
|
|
32
|
+
today: {
|
|
33
|
+
tokens: number;
|
|
34
|
+
cost: number;
|
|
35
|
+
calls: number;
|
|
36
|
+
};
|
|
37
|
+
month: {
|
|
38
|
+
tokens: number;
|
|
39
|
+
cost: number;
|
|
40
|
+
calls: number;
|
|
41
|
+
};
|
|
42
|
+
allTime: {
|
|
43
|
+
tokens: number;
|
|
44
|
+
cost: number;
|
|
45
|
+
};
|
|
46
|
+
budget: UsageData['budget'];
|
|
47
|
+
};
|
|
48
|
+
export declare function setBudget(daily: number, monthly: number, threshold?: number): void;
|
|
49
|
+
export declare function printUsageSummary(): void;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost/token tracker — tracks usage per session and cumulative.
|
|
3
|
+
* Stores data in ~/.crowcoder/usage.json
|
|
4
|
+
* Supports budget limits and alerts.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import { getConfigDir } from './config.js';
|
|
10
|
+
const USAGE_FILE = join(getConfigDir(), 'usage.json');
|
|
11
|
+
// Cost per 1M tokens (input/output) for common models via OpenRouter
|
|
12
|
+
const MODEL_COSTS = {
|
|
13
|
+
// Anthropic
|
|
14
|
+
'anthropic/claude-sonnet-4': { input: 3.0, output: 15.0 },
|
|
15
|
+
'anthropic/claude-opus-4': { input: 15.0, output: 75.0 },
|
|
16
|
+
'anthropic/claude-haiku-4': { input: 0.8, output: 4.0 },
|
|
17
|
+
// OpenAI
|
|
18
|
+
'openai/gpt-4o': { input: 2.5, output: 10.0 },
|
|
19
|
+
'openai/gpt-4o-mini': { input: 0.15, output: 0.6 },
|
|
20
|
+
'openai/o3-mini': { input: 1.1, output: 4.4 },
|
|
21
|
+
// Google
|
|
22
|
+
'google/gemini-2.5-pro': { input: 1.25, output: 10.0 },
|
|
23
|
+
'google/gemini-2.5-flash': { input: 0.15, output: 0.6 },
|
|
24
|
+
// DeepSeek
|
|
25
|
+
'deepseek/deepseek-chat': { input: 0.14, output: 0.28 },
|
|
26
|
+
'deepseek/deepseek-reasoner': { input: 0.55, output: 2.19 },
|
|
27
|
+
// Meta
|
|
28
|
+
'meta-llama/llama-4-maverick': { input: 0.2, output: 0.6 },
|
|
29
|
+
// GLM
|
|
30
|
+
'glm-4-plus': { input: 1.0, output: 1.0 },
|
|
31
|
+
// Defaults for unknown models
|
|
32
|
+
_default: { input: 1.0, output: 3.0 },
|
|
33
|
+
};
|
|
34
|
+
function loadUsage() {
|
|
35
|
+
if (!existsSync(USAGE_FILE)) {
|
|
36
|
+
return {
|
|
37
|
+
entries: [],
|
|
38
|
+
budget: { dailyLimit: 0, monthlyLimit: 0, alertThreshold: 0.8 },
|
|
39
|
+
totals: { allTimeTokens: 0, allTimeCost: 0 },
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(readFileSync(USAGE_FILE, 'utf-8'));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return {
|
|
47
|
+
entries: [],
|
|
48
|
+
budget: { dailyLimit: 0, monthlyLimit: 0, alertThreshold: 0.8 },
|
|
49
|
+
totals: { allTimeTokens: 0, allTimeCost: 0 },
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function saveUsage(data) {
|
|
54
|
+
mkdirSync(getConfigDir(), { recursive: true });
|
|
55
|
+
writeFileSync(USAGE_FILE, JSON.stringify(data, null, 2), 'utf-8');
|
|
56
|
+
}
|
|
57
|
+
export function getModelCost(model) {
|
|
58
|
+
// Try exact match first, then partial
|
|
59
|
+
if (MODEL_COSTS[model])
|
|
60
|
+
return MODEL_COSTS[model];
|
|
61
|
+
for (const [key, cost] of Object.entries(MODEL_COSTS)) {
|
|
62
|
+
if (model.includes(key) || key.includes(model))
|
|
63
|
+
return cost;
|
|
64
|
+
}
|
|
65
|
+
return MODEL_COSTS._default;
|
|
66
|
+
}
|
|
67
|
+
export function estimateCost(model, promptTokens, completionTokens) {
|
|
68
|
+
const costs = getModelCost(model);
|
|
69
|
+
return (promptTokens * costs.input + completionTokens * costs.output) / 1_000_000;
|
|
70
|
+
}
|
|
71
|
+
export function trackUsage(sessionId, model, promptTokens, completionTokens) {
|
|
72
|
+
const data = loadUsage();
|
|
73
|
+
const cost = estimateCost(model, promptTokens, completionTokens);
|
|
74
|
+
const entry = {
|
|
75
|
+
timestamp: new Date().toISOString(),
|
|
76
|
+
sessionId,
|
|
77
|
+
model,
|
|
78
|
+
promptTokens,
|
|
79
|
+
completionTokens,
|
|
80
|
+
totalTokens: promptTokens + completionTokens,
|
|
81
|
+
estimatedCost: cost,
|
|
82
|
+
};
|
|
83
|
+
data.entries.push(entry);
|
|
84
|
+
data.totals.allTimeTokens += entry.totalTokens;
|
|
85
|
+
data.totals.allTimeCost += cost;
|
|
86
|
+
// Prune entries older than 90 days
|
|
87
|
+
const cutoff = new Date();
|
|
88
|
+
cutoff.setDate(cutoff.getDate() - 90);
|
|
89
|
+
data.entries = data.entries.filter((e) => new Date(e.timestamp) > cutoff);
|
|
90
|
+
saveUsage(data);
|
|
91
|
+
// Check budget
|
|
92
|
+
let warning;
|
|
93
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
94
|
+
const todayCost = data.entries
|
|
95
|
+
.filter((e) => e.timestamp.startsWith(today))
|
|
96
|
+
.reduce((sum, e) => sum + e.estimatedCost, 0);
|
|
97
|
+
const month = new Date().toISOString().slice(0, 7);
|
|
98
|
+
const monthCost = data.entries
|
|
99
|
+
.filter((e) => e.timestamp.startsWith(month))
|
|
100
|
+
.reduce((sum, e) => sum + e.estimatedCost, 0);
|
|
101
|
+
if (data.budget.dailyLimit > 0 && todayCost >= data.budget.dailyLimit) {
|
|
102
|
+
warning = `Daily budget exceeded: $${todayCost.toFixed(4)} / $${data.budget.dailyLimit}`;
|
|
103
|
+
}
|
|
104
|
+
else if (data.budget.monthlyLimit > 0 && monthCost >= data.budget.monthlyLimit) {
|
|
105
|
+
warning = `Monthly budget exceeded: $${monthCost.toFixed(4)} / $${data.budget.monthlyLimit}`;
|
|
106
|
+
}
|
|
107
|
+
else if (data.budget.dailyLimit > 0 &&
|
|
108
|
+
todayCost >= data.budget.dailyLimit * data.budget.alertThreshold) {
|
|
109
|
+
warning = `Approaching daily limit: $${todayCost.toFixed(4)} / $${data.budget.dailyLimit}`;
|
|
110
|
+
}
|
|
111
|
+
return { cost, warning };
|
|
112
|
+
}
|
|
113
|
+
export function getUsageSummary() {
|
|
114
|
+
const data = loadUsage();
|
|
115
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
116
|
+
const month = new Date().toISOString().slice(0, 7);
|
|
117
|
+
const todayEntries = data.entries.filter((e) => e.timestamp.startsWith(today));
|
|
118
|
+
const monthEntries = data.entries.filter((e) => e.timestamp.startsWith(month));
|
|
119
|
+
return {
|
|
120
|
+
today: {
|
|
121
|
+
tokens: todayEntries.reduce((s, e) => s + e.totalTokens, 0),
|
|
122
|
+
cost: todayEntries.reduce((s, e) => s + e.estimatedCost, 0),
|
|
123
|
+
calls: todayEntries.length,
|
|
124
|
+
},
|
|
125
|
+
month: {
|
|
126
|
+
tokens: monthEntries.reduce((s, e) => s + e.totalTokens, 0),
|
|
127
|
+
cost: monthEntries.reduce((s, e) => s + e.estimatedCost, 0),
|
|
128
|
+
calls: monthEntries.length,
|
|
129
|
+
},
|
|
130
|
+
allTime: { tokens: data.totals.allTimeTokens, cost: data.totals.allTimeCost },
|
|
131
|
+
budget: data.budget,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export function setBudget(daily, monthly, threshold = 0.8) {
|
|
135
|
+
const data = loadUsage();
|
|
136
|
+
data.budget = { dailyLimit: daily, monthlyLimit: monthly, alertThreshold: threshold };
|
|
137
|
+
saveUsage(data);
|
|
138
|
+
}
|
|
139
|
+
export function printUsageSummary() {
|
|
140
|
+
const s = getUsageSummary();
|
|
141
|
+
console.log(chalk.cyan('\n Usage Summary'));
|
|
142
|
+
console.log(chalk.dim(` Today: ${s.today.tokens.toLocaleString()} tokens | $${s.today.cost.toFixed(4)} | ${s.today.calls} calls`));
|
|
143
|
+
console.log(chalk.dim(` Month: ${s.month.tokens.toLocaleString()} tokens | $${s.month.cost.toFixed(4)} | ${s.month.calls} calls`));
|
|
144
|
+
console.log(chalk.dim(` All-time: ${s.allTime.tokens.toLocaleString()} tokens | $${s.allTime.cost.toFixed(4)}`));
|
|
145
|
+
if (s.budget.dailyLimit > 0) {
|
|
146
|
+
console.log(chalk.dim(` Budget: $${s.budget.dailyLimit}/day, $${s.budget.monthlyLimit}/month`));
|
|
147
|
+
}
|
|
148
|
+
console.log();
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=cost-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../src/cost-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A UI counter button component.
|
|
3
|
+
* Tracks a count that can be incremented, decremented, and reset.
|
|
4
|
+
*/
|
|
5
|
+
export declare class CounterButton {
|
|
6
|
+
count: number;
|
|
7
|
+
label: string;
|
|
8
|
+
/**
|
|
9
|
+
* Create a new CounterButton.
|
|
10
|
+
* @param label - Display label for the button (default: "Counter")
|
|
11
|
+
*/
|
|
12
|
+
constructor(label?: string);
|
|
13
|
+
/**
|
|
14
|
+
* Increment the counter by 1.
|
|
15
|
+
*/
|
|
16
|
+
press(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Decrement the counter by 1.
|
|
19
|
+
*/
|
|
20
|
+
unpress(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Reset the counter to 0.
|
|
23
|
+
*/
|
|
24
|
+
reset(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Render the button as a string.
|
|
27
|
+
* @returns Formatted string like `[ Counter: 5 ]`
|
|
28
|
+
*/
|
|
29
|
+
render(): string;
|
|
30
|
+
/**
|
|
31
|
+
* String representation (alias for render).
|
|
32
|
+
* @returns Formatted string like `[ Counter: 5 ]`
|
|
33
|
+
*/
|
|
34
|
+
toString(): string;
|
|
35
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A UI counter button component.
|
|
3
|
+
* Tracks a count that can be incremented, decremented, and reset.
|
|
4
|
+
*/
|
|
5
|
+
export class CounterButton {
|
|
6
|
+
count = 0;
|
|
7
|
+
label;
|
|
8
|
+
/**
|
|
9
|
+
* Create a new CounterButton.
|
|
10
|
+
* @param label - Display label for the button (default: "Counter")
|
|
11
|
+
*/
|
|
12
|
+
constructor(label = 'Counter') {
|
|
13
|
+
this.label = label;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Increment the counter by 1.
|
|
17
|
+
*/
|
|
18
|
+
press() {
|
|
19
|
+
this.count++;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Decrement the counter by 1.
|
|
23
|
+
*/
|
|
24
|
+
unpress() {
|
|
25
|
+
this.count--;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Reset the counter to 0.
|
|
29
|
+
*/
|
|
30
|
+
reset() {
|
|
31
|
+
this.count = 0;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Render the button as a string.
|
|
35
|
+
* @returns Formatted string like `[ Counter: 5 ]`
|
|
36
|
+
*/
|
|
37
|
+
render() {
|
|
38
|
+
return `[ ${this.label}: ${this.count} ]`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* String representation (alias for render).
|
|
42
|
+
* @returns Formatted string like `[ Counter: 5 ]`
|
|
43
|
+
*/
|
|
44
|
+
toString() {
|
|
45
|
+
return this.render();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=counter-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counter-button.js","sourceRoot":"","sources":["../src/counter-button.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,aAAa;IACxB,KAAK,GAAW,CAAC,CAAC;IAClB,KAAK,CAAS;IAEd;;;OAGG;IACH,YAAY,QAAgB,SAAS;QACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,MAAM;QACJ,OAAO,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple in-memory counter utility.
|
|
3
|
+
* Used by the `/count` slash command for basic increment/decrement/reset operations.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Increment the counter by 1.
|
|
7
|
+
*/
|
|
8
|
+
export declare function incrementCounter(): void;
|
|
9
|
+
/**
|
|
10
|
+
* Decrement the counter by 1.
|
|
11
|
+
*/
|
|
12
|
+
export declare function decrementCounter(): void;
|
|
13
|
+
/**
|
|
14
|
+
* Reset the counter to 0.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resetCounter(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Get the current counter value.
|
|
19
|
+
* @returns The current count
|
|
20
|
+
*/
|
|
21
|
+
export declare function getCounter(): number;
|
package/dist/counter.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple in-memory counter utility.
|
|
3
|
+
* Used by the `/count` slash command for basic increment/decrement/reset operations.
|
|
4
|
+
*/
|
|
5
|
+
let count = 0;
|
|
6
|
+
/**
|
|
7
|
+
* Increment the counter by 1.
|
|
8
|
+
*/
|
|
9
|
+
export function incrementCounter() {
|
|
10
|
+
count++;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Decrement the counter by 1.
|
|
14
|
+
*/
|
|
15
|
+
export function decrementCounter() {
|
|
16
|
+
count--;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Reset the counter to 0.
|
|
20
|
+
*/
|
|
21
|
+
export function resetCounter() {
|
|
22
|
+
count = 0;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get the current counter value.
|
|
26
|
+
* @returns The current count
|
|
27
|
+
*/
|
|
28
|
+
export function getCounter() {
|
|
29
|
+
return count;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=counter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counter.js","sourceRoot":"","sources":["../src/counter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,IAAI,KAAK,GAAG,CAAC,CAAC;AAEd;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,KAAK,EAAE,CAAC;AACV,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,KAAK,EAAE,CAAC;AACV,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,KAAK,GAAG,CAAC,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface CoverageSummary {
|
|
2
|
+
totalLines: number;
|
|
3
|
+
coveredLines: number;
|
|
4
|
+
percentage: number;
|
|
5
|
+
uncoveredFiles: string[];
|
|
6
|
+
}
|
|
7
|
+
type TestFramework = 'jest' | 'pytest' | 'cargo' | 'mocha' | 'vitest' | 'unknown';
|
|
8
|
+
/**
|
|
9
|
+
* Build a prompt that tells the AI to run coverage and suggest test improvements.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildCoveragePrompt(cwd: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Parse typical coverage output formats (Istanbul/Jest, pytest-cov, cargo-tarpaulin, lcov).
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseCoverageSummary(output: string): CoverageSummary;
|
|
16
|
+
/**
|
|
17
|
+
* Pretty-print coverage summary with color-coded thresholds.
|
|
18
|
+
* Green ≥80%, Yellow ≥60%, Red <60%
|
|
19
|
+
*/
|
|
20
|
+
export declare function printCoverageSummary(summary: CoverageSummary): void;
|
|
21
|
+
export declare function getCoverageFramework(cwd: string): TestFramework;
|
|
22
|
+
export declare function getCoverageCommandForFramework(cwd: string): string;
|
|
23
|
+
export {};
|
package/dist/coverage.js
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Coverage Analysis — auto-detect test framework and build coverage prompts.
|
|
3
|
+
* Parses coverage reports and suggests uncovered areas.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
// ── Auto-detection ──────────────────────────────────────────────
|
|
9
|
+
function detectTestFramework(cwd) {
|
|
10
|
+
// Check package.json for test framework dependencies
|
|
11
|
+
const pkgPath = join(cwd, 'package.json');
|
|
12
|
+
if (existsSync(pkgPath)) {
|
|
13
|
+
try {
|
|
14
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
15
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
16
|
+
if (deps.jest)
|
|
17
|
+
return 'jest';
|
|
18
|
+
if (deps.vitest)
|
|
19
|
+
return 'vitest';
|
|
20
|
+
if (deps.mocha)
|
|
21
|
+
return 'mocha';
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Continue to next check
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Check for Rust Cargo.toml
|
|
28
|
+
if (existsSync(join(cwd, 'Cargo.toml'))) {
|
|
29
|
+
return 'cargo';
|
|
30
|
+
}
|
|
31
|
+
// Check for Python pytest
|
|
32
|
+
if (existsSync(join(cwd, 'pytest.ini')) || existsSync(join(cwd, 'pyproject.toml'))) {
|
|
33
|
+
return 'pytest';
|
|
34
|
+
}
|
|
35
|
+
// Check for test files
|
|
36
|
+
const srcDir = join(cwd, 'src');
|
|
37
|
+
const testsDir = join(cwd, 'tests');
|
|
38
|
+
if (existsSync(srcDir)) {
|
|
39
|
+
const files = readdirSync(srcDir, { recursive: true });
|
|
40
|
+
if (files.some((f) => f.toString().includes('.test.') || f.toString().includes('.spec.'))) {
|
|
41
|
+
return 'jest'; // Likely Jest/Vitest
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (existsSync(testsDir)) {
|
|
45
|
+
const files = readdirSync(testsDir);
|
|
46
|
+
if (files.some((f) => f.includes('test_') || f.includes('_test.'))) {
|
|
47
|
+
return 'pytest';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return 'unknown';
|
|
51
|
+
}
|
|
52
|
+
// ── Coverage Command Building ──────────────────────────────────────
|
|
53
|
+
function getCoverageCommand(framework) {
|
|
54
|
+
switch (framework) {
|
|
55
|
+
case 'jest':
|
|
56
|
+
return 'npx jest --coverage';
|
|
57
|
+
case 'vitest':
|
|
58
|
+
return 'npx vitest --coverage';
|
|
59
|
+
case 'mocha':
|
|
60
|
+
return 'npx nyc mocha';
|
|
61
|
+
case 'pytest':
|
|
62
|
+
return 'pytest --cov --cov-report=term-missing';
|
|
63
|
+
case 'cargo':
|
|
64
|
+
return 'cargo tarpaulin --out Stdout';
|
|
65
|
+
default:
|
|
66
|
+
return '# Unable to detect test framework; manually specify coverage command';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// ── Main Functions ──────────────────────────────────────────────
|
|
70
|
+
/**
|
|
71
|
+
* Build a prompt that tells the AI to run coverage and suggest test improvements.
|
|
72
|
+
*/
|
|
73
|
+
export function buildCoveragePrompt(cwd) {
|
|
74
|
+
const framework = detectTestFramework(cwd);
|
|
75
|
+
const coverageCmd = getCoverageCommand(framework);
|
|
76
|
+
return `Analyze test coverage for this project and suggest improvements.
|
|
77
|
+
|
|
78
|
+
## Current Working Directory
|
|
79
|
+
\`\`\`
|
|
80
|
+
${cwd}
|
|
81
|
+
\`\`\`
|
|
82
|
+
|
|
83
|
+
## Detected Test Framework
|
|
84
|
+
${framework !== 'unknown' ? chalk.green(framework) : chalk.yellow('unknown (manually specify)')}
|
|
85
|
+
|
|
86
|
+
## Instructions
|
|
87
|
+
1. Run the coverage command: \`${coverageCmd}\`
|
|
88
|
+
2. Parse the coverage report and extract:
|
|
89
|
+
- Total lines of code
|
|
90
|
+
- Lines covered
|
|
91
|
+
- Coverage percentage
|
|
92
|
+
- List of uncovered or poorly-covered files
|
|
93
|
+
3. Analyze the results:
|
|
94
|
+
- Identify the top 3-5 uncovered functions or code paths
|
|
95
|
+
- Prioritize by impact (critical paths first)
|
|
96
|
+
4. Suggest specific tests to write:
|
|
97
|
+
- For each uncovered area, describe what test cases would improve coverage
|
|
98
|
+
- Focus on edge cases and error handling
|
|
99
|
+
5. Set a target of 80% coverage minimum
|
|
100
|
+
|
|
101
|
+
## Expected Output Format
|
|
102
|
+
Provide:
|
|
103
|
+
1. Current coverage summary (percentage and line counts)
|
|
104
|
+
2. List of uncovered files
|
|
105
|
+
3. For each top uncovered function:
|
|
106
|
+
- Function name and location
|
|
107
|
+
- What it does
|
|
108
|
+
- Suggested test cases to cover it
|
|
109
|
+
4. Estimated effort to reach 80% coverage
|
|
110
|
+
5. Commands to run the suggested tests
|
|
111
|
+
|
|
112
|
+
## Notes
|
|
113
|
+
- If coverage is already ≥80%, suggest areas for improvement beyond line coverage
|
|
114
|
+
- Consider mutation testing or branch coverage for deeper insights
|
|
115
|
+
- Ensure all new tests have clear assertions`;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Parse typical coverage output formats (Istanbul/Jest, pytest-cov, cargo-tarpaulin, lcov).
|
|
119
|
+
*/
|
|
120
|
+
export function parseCoverageSummary(output) {
|
|
121
|
+
let totalLines = 0;
|
|
122
|
+
let coveredLines = 0;
|
|
123
|
+
let percentage = 0;
|
|
124
|
+
const uncoveredFiles = [];
|
|
125
|
+
// Try Jest/Istanbul format: "statements : 75.5% ( 150/200 )"
|
|
126
|
+
const istanbulMatch = output.match(/statements\s*:\s*([\d.]+)%\s*\(\s*(\d+)\/(\d+)\s*\)/);
|
|
127
|
+
if (istanbulMatch) {
|
|
128
|
+
percentage = parseFloat(istanbulMatch[1]);
|
|
129
|
+
coveredLines = parseInt(istanbulMatch[2], 10);
|
|
130
|
+
totalLines = parseInt(istanbulMatch[3], 10);
|
|
131
|
+
}
|
|
132
|
+
// Try pytest format: "TOTAL 150 30 80%"
|
|
133
|
+
const pytestMatch = output.match(/TOTAL\s+(\d+)\s+(\d+)\s+([\d.]+)%/);
|
|
134
|
+
if (pytestMatch) {
|
|
135
|
+
totalLines = parseInt(pytestMatch[1], 10);
|
|
136
|
+
const uncovered = parseInt(pytestMatch[2], 10);
|
|
137
|
+
coveredLines = totalLines - uncovered;
|
|
138
|
+
percentage = parseFloat(pytestMatch[3]);
|
|
139
|
+
}
|
|
140
|
+
// Try cargo-tarpaulin format: "Region coverage: 75.5%"
|
|
141
|
+
const cargoMatch = output.match(/Region coverage:\s*([\d.]+)%/);
|
|
142
|
+
if (cargoMatch) {
|
|
143
|
+
percentage = parseFloat(cargoMatch[1]);
|
|
144
|
+
// Estimate total lines from percentage if we have some baseline
|
|
145
|
+
if (totalLines === 0)
|
|
146
|
+
totalLines = 200; // Conservative estimate
|
|
147
|
+
coveredLines = Math.round((percentage / 100) * totalLines);
|
|
148
|
+
}
|
|
149
|
+
// Try lcov format: "LF:<total lines> LH:<covered lines>"
|
|
150
|
+
const lcovMatch = output.match(/LF:(\d+)\s+LH:(\d+)/);
|
|
151
|
+
if (lcovMatch) {
|
|
152
|
+
totalLines = parseInt(lcovMatch[1], 10);
|
|
153
|
+
coveredLines = parseInt(lcovMatch[2], 10);
|
|
154
|
+
percentage = totalLines > 0 ? (coveredLines / totalLines) * 100 : 0;
|
|
155
|
+
}
|
|
156
|
+
// Extract uncovered files (common patterns)
|
|
157
|
+
const fileMatches = Array.from(output.matchAll(/file:\s*([^\s]+)|coverage.*?([a-zA-Z0-9/._-]+\.(?:ts|js|py|rs))/g));
|
|
158
|
+
for (const match of fileMatches) {
|
|
159
|
+
const file = match[1] || match[2];
|
|
160
|
+
if (file && !uncoveredFiles.includes(file)) {
|
|
161
|
+
uncoveredFiles.push(file);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
totalLines: totalLines || 200,
|
|
166
|
+
coveredLines: coveredLines || 0,
|
|
167
|
+
percentage: percentage || 0,
|
|
168
|
+
uncoveredFiles,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Pretty-print coverage summary with color-coded thresholds.
|
|
173
|
+
* Green ≥80%, Yellow ≥60%, Red <60%
|
|
174
|
+
*/
|
|
175
|
+
export function printCoverageSummary(summary) {
|
|
176
|
+
const { totalLines, coveredLines, percentage, uncoveredFiles } = summary;
|
|
177
|
+
let color;
|
|
178
|
+
if (percentage >= 80) {
|
|
179
|
+
color = chalk.green;
|
|
180
|
+
}
|
|
181
|
+
else if (percentage >= 60) {
|
|
182
|
+
color = chalk.yellow;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
color = chalk.red;
|
|
186
|
+
}
|
|
187
|
+
console.log(chalk.cyan('\n Coverage Summary:'));
|
|
188
|
+
console.log(` ${color(` ${percentage.toFixed(1)}%`)} (${coveredLines} / ${totalLines} lines)`);
|
|
189
|
+
if (uncoveredFiles.length > 0) {
|
|
190
|
+
console.log(chalk.yellow('\n Uncovered Files:'));
|
|
191
|
+
uncoveredFiles.slice(0, 10).forEach((file) => {
|
|
192
|
+
console.log(chalk.dim(` - ${file}`));
|
|
193
|
+
});
|
|
194
|
+
if (uncoveredFiles.length > 10) {
|
|
195
|
+
console.log(chalk.dim(` ... and ${uncoveredFiles.length - 10} more`));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const targetGap = 80 - percentage;
|
|
199
|
+
if (targetGap > 0) {
|
|
200
|
+
console.log(chalk.yellow(`\n Gap to 80% target: ${targetGap.toFixed(1)}%`));
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
console.log(chalk.green('\n ✓ Target 80% coverage achieved!'));
|
|
204
|
+
}
|
|
205
|
+
console.log();
|
|
206
|
+
}
|
|
207
|
+
// ── Exports ──────────────────────────────────────────────
|
|
208
|
+
export function getCoverageFramework(cwd) {
|
|
209
|
+
return detectTestFramework(cwd);
|
|
210
|
+
}
|
|
211
|
+
export function getCoverageCommandForFramework(cwd) {
|
|
212
|
+
const framework = detectTestFramework(cwd);
|
|
213
|
+
return getCoverageCommand(framework);
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface DocFile {
|
|
2
|
+
path: string;
|
|
3
|
+
type: 'readme' | 'changelog' | 'api' | 'guide' | 'markdown' | 'jsdoc';
|
|
4
|
+
lastModified?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Detect all documentation files in the project.
|
|
8
|
+
* Returns: README.md, CHANGELOG.md, docs/, JSDoc comments, docstrings, API docs
|
|
9
|
+
*/
|
|
10
|
+
export declare function detectDocFiles(cwd: string): DocFile[];
|
|
11
|
+
/**
|
|
12
|
+
* Build a prompt that tells the AI to sync documentation with code.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildDocsUpdatePrompt(cwd: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Print documentation status summary.
|
|
17
|
+
*/
|
|
18
|
+
export declare function printDocsSyncStatus(docFiles: DocFile[], coveredExports?: number, totalExports?: number): void;
|
|
19
|
+
export declare function getProjectLanguage(cwd: string): 'typescript' | 'javascript' | 'python' | 'rust' | 'unknown';
|
|
20
|
+
export declare function getDocumentationFiles(cwd: string): DocFile[];
|
|
21
|
+
export declare function hasReadme(cwd: string): boolean;
|
|
22
|
+
export declare function hasChangelog(cwd: string): boolean;
|
|
23
|
+
export declare function hasDocsDirectory(cwd: string): boolean;
|