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.
Files changed (324) hide show
  1. package/README.md +394 -0
  2. package/bin/anycode.js +2 -0
  3. package/bin/crowcoder.js +19 -0
  4. package/bin/ecc-hooks.cjs +138 -0
  5. package/dist/agents.d.ts +17 -0
  6. package/dist/agents.js +1603 -0
  7. package/dist/agents.js.map +1 -0
  8. package/dist/api.d.ts +16 -0
  9. package/dist/api.js +115 -0
  10. package/dist/api.js.map +1 -0
  11. package/dist/autonomous-loops.d.ts +108 -0
  12. package/dist/autonomous-loops.js +526 -0
  13. package/dist/autonomous-loops.js.map +1 -0
  14. package/dist/codemaps.d.ts +53 -0
  15. package/dist/codemaps.js +325 -0
  16. package/dist/codemaps.js.map +1 -0
  17. package/dist/compaction.d.ts +30 -0
  18. package/dist/compaction.js +125 -0
  19. package/dist/compaction.js.map +1 -0
  20. package/dist/config.d.ts +5 -0
  21. package/dist/config.js +79 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/content-engine.d.ts +97 -0
  24. package/dist/content-engine.js +721 -0
  25. package/dist/content-engine.js.map +1 -0
  26. package/dist/cost-tracker.d.ts +49 -0
  27. package/dist/cost-tracker.js +150 -0
  28. package/dist/cost-tracker.js.map +1 -0
  29. package/dist/counter-button.d.ts +35 -0
  30. package/dist/counter-button.js +48 -0
  31. package/dist/counter-button.js.map +1 -0
  32. package/dist/counter.d.ts +21 -0
  33. package/dist/counter.js +31 -0
  34. package/dist/counter.js.map +1 -0
  35. package/dist/coverage.d.ts +23 -0
  36. package/dist/coverage.js +215 -0
  37. package/dist/coverage.js.map +1 -0
  38. package/dist/docs-sync.d.ts +23 -0
  39. package/dist/docs-sync.js +266 -0
  40. package/dist/docs-sync.js.map +1 -0
  41. package/dist/ecc.d.ts +41 -0
  42. package/dist/ecc.js +644 -0
  43. package/dist/ecc.js.map +1 -0
  44. package/dist/evaluation.d.ts +24 -0
  45. package/dist/evaluation.js +412 -0
  46. package/dist/evaluation.js.map +1 -0
  47. package/dist/export.d.ts +22 -0
  48. package/dist/export.js +109 -0
  49. package/dist/export.js.map +1 -0
  50. package/dist/git-workflow.d.ts +22 -0
  51. package/dist/git-workflow.js +197 -0
  52. package/dist/git-workflow.js.map +1 -0
  53. package/dist/hook-controls.d.ts +34 -0
  54. package/dist/hook-controls.js +90 -0
  55. package/dist/hook-controls.js.map +1 -0
  56. package/dist/hooks.d.ts +30 -0
  57. package/dist/hooks.js +130 -0
  58. package/dist/hooks.js.map +1 -0
  59. package/dist/html-parser.d.ts +18 -0
  60. package/dist/html-parser.js +101 -0
  61. package/dist/html-parser.js.map +1 -0
  62. package/dist/index.d.ts +12 -0
  63. package/dist/index.js +1230 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/learning.d.ts +35 -0
  66. package/dist/learning.js +238 -0
  67. package/dist/learning.js.map +1 -0
  68. package/dist/login.d.ts +37 -0
  69. package/dist/login.js +191 -0
  70. package/dist/login.js.map +1 -0
  71. package/dist/memory.d.ts +39 -0
  72. package/dist/memory.js +183 -0
  73. package/dist/memory.js.map +1 -0
  74. package/dist/model-router.d.ts +23 -0
  75. package/dist/model-router.js +145 -0
  76. package/dist/model-router.js.map +1 -0
  77. package/dist/modes.d.ts +17 -0
  78. package/dist/modes.js +217 -0
  79. package/dist/modes.js.map +1 -0
  80. package/dist/orchestration.d.ts +37 -0
  81. package/dist/orchestration.js +139 -0
  82. package/dist/orchestration.js.map +1 -0
  83. package/dist/package-detect.d.ts +36 -0
  84. package/dist/package-detect.js +529 -0
  85. package/dist/package-detect.js.map +1 -0
  86. package/dist/permissions.d.ts +25 -0
  87. package/dist/permissions.js +50 -0
  88. package/dist/permissions.js.map +1 -0
  89. package/dist/pm2-manager.d.ts +40 -0
  90. package/dist/pm2-manager.js +127 -0
  91. package/dist/pm2-manager.js.map +1 -0
  92. package/dist/query.d.ts +15 -0
  93. package/dist/query.js +278 -0
  94. package/dist/query.js.map +1 -0
  95. package/dist/refactor.d.ts +22 -0
  96. package/dist/refactor.js +226 -0
  97. package/dist/refactor.js.map +1 -0
  98. package/dist/retry.d.ts +20 -0
  99. package/dist/retry.js +88 -0
  100. package/dist/retry.js.map +1 -0
  101. package/dist/rules.d.ts +34 -0
  102. package/dist/rules.js +942 -0
  103. package/dist/rules.js.map +1 -0
  104. package/dist/schema.d.ts +23 -0
  105. package/dist/schema.js +12 -0
  106. package/dist/schema.js.map +1 -0
  107. package/dist/search-first.d.ts +17 -0
  108. package/dist/search-first.js +301 -0
  109. package/dist/search-first.js.map +1 -0
  110. package/dist/security.d.ts +10 -0
  111. package/dist/security.js +145 -0
  112. package/dist/security.js.map +1 -0
  113. package/dist/sessions.d.ts +21 -0
  114. package/dist/sessions.js +112 -0
  115. package/dist/sessions.js.map +1 -0
  116. package/dist/skill-create.d.ts +38 -0
  117. package/dist/skill-create.js +389 -0
  118. package/dist/skill-create.js.map +1 -0
  119. package/dist/skills.d.ts +34 -0
  120. package/dist/skills.js +161 -0
  121. package/dist/skills.js.map +1 -0
  122. package/dist/strategic-compaction.d.ts +24 -0
  123. package/dist/strategic-compaction.js +144 -0
  124. package/dist/strategic-compaction.js.map +1 -0
  125. package/dist/system-prompt.d.ts +3 -0
  126. package/dist/system-prompt.js +101 -0
  127. package/dist/system-prompt.js.map +1 -0
  128. package/dist/theme.d.ts +60 -0
  129. package/dist/theme.js +220 -0
  130. package/dist/theme.js.map +1 -0
  131. package/dist/tools/bash.d.ts +2 -0
  132. package/dist/tools/bash.js +49 -0
  133. package/dist/tools/bash.js.map +1 -0
  134. package/dist/tools/edit.d.ts +2 -0
  135. package/dist/tools/edit.js +76 -0
  136. package/dist/tools/edit.js.map +1 -0
  137. package/dist/tools/glob.d.ts +2 -0
  138. package/dist/tools/glob.js +54 -0
  139. package/dist/tools/glob.js.map +1 -0
  140. package/dist/tools/grep.d.ts +2 -0
  141. package/dist/tools/grep.js +64 -0
  142. package/dist/tools/grep.js.map +1 -0
  143. package/dist/tools/index.d.ts +5 -0
  144. package/dist/tools/index.js +27 -0
  145. package/dist/tools/index.js.map +1 -0
  146. package/dist/tools/list-dir.d.ts +2 -0
  147. package/dist/tools/list-dir.js +51 -0
  148. package/dist/tools/list-dir.js.map +1 -0
  149. package/dist/tools/read.d.ts +2 -0
  150. package/dist/tools/read.js +56 -0
  151. package/dist/tools/read.js.map +1 -0
  152. package/dist/tools/types.d.ts +45 -0
  153. package/dist/tools/types.js +2 -0
  154. package/dist/tools/types.js.map +1 -0
  155. package/dist/tools/web-fetch.d.ts +2 -0
  156. package/dist/tools/web-fetch.js +41 -0
  157. package/dist/tools/web-fetch.js.map +1 -0
  158. package/dist/tools/web-search.d.ts +27 -0
  159. package/dist/tools/web-search.js +139 -0
  160. package/dist/tools/web-search.js.map +1 -0
  161. package/dist/tools/write.d.ts +2 -0
  162. package/dist/tools/write.js +36 -0
  163. package/dist/tools/write.js.map +1 -0
  164. package/dist/types.d.ts +28 -0
  165. package/dist/types.js +57 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/users.d.ts +51 -0
  168. package/dist/users.js +193 -0
  169. package/dist/users.js.map +1 -0
  170. package/dist/verification.d.ts +73 -0
  171. package/dist/verification.js +269 -0
  172. package/dist/verification.js.map +1 -0
  173. package/dist/walkthrough.d.ts +10 -0
  174. package/dist/walkthrough.js +121 -0
  175. package/dist/walkthrough.js.map +1 -0
  176. package/package.json +58 -0
  177. package/resources/ecc/agents/architect.json +16 -0
  178. package/resources/ecc/agents/architect.md +212 -0
  179. package/resources/ecc/agents/build-error-resolver.json +17 -0
  180. package/resources/ecc/agents/build-error-resolver.md +116 -0
  181. package/resources/ecc/agents/chief-of-staff.json +17 -0
  182. package/resources/ecc/agents/chief-of-staff.md +153 -0
  183. package/resources/ecc/agents/code-reviewer.json +16 -0
  184. package/resources/ecc/agents/code-reviewer.md +238 -0
  185. package/resources/ecc/agents/database-reviewer.json +16 -0
  186. package/resources/ecc/agents/database-reviewer.md +92 -0
  187. package/resources/ecc/agents/doc-updater.json +16 -0
  188. package/resources/ecc/agents/doc-updater.md +108 -0
  189. package/resources/ecc/agents/e2e-runner.json +17 -0
  190. package/resources/ecc/agents/e2e-runner.md +109 -0
  191. package/resources/ecc/agents/go-build-resolver.json +17 -0
  192. package/resources/ecc/agents/go-build-resolver.md +96 -0
  193. package/resources/ecc/agents/go-reviewer.json +16 -0
  194. package/resources/ecc/agents/go-reviewer.md +77 -0
  195. package/resources/ecc/agents/harness-optimizer.json +15 -0
  196. package/resources/ecc/agents/harness-optimizer.md +34 -0
  197. package/resources/ecc/agents/loop-operator.json +16 -0
  198. package/resources/ecc/agents/loop-operator.md +36 -0
  199. package/resources/ecc/agents/planner.json +15 -0
  200. package/resources/ecc/agents/planner.md +212 -0
  201. package/resources/ecc/agents/python-reviewer.json +16 -0
  202. package/resources/ecc/agents/python-reviewer.md +99 -0
  203. package/resources/ecc/agents/refactor-cleaner.json +17 -0
  204. package/resources/ecc/agents/refactor-cleaner.md +87 -0
  205. package/resources/ecc/agents/security-reviewer.json +16 -0
  206. package/resources/ecc/agents/security-reviewer.md +109 -0
  207. package/resources/ecc/agents/tdd-guide.json +17 -0
  208. package/resources/ecc/agents/tdd-guide.md +93 -0
  209. package/resources/ecc/commands/add-language-rules.md +39 -0
  210. package/resources/ecc/commands/database-migration.md +36 -0
  211. package/resources/ecc/commands/feature-development.md +38 -0
  212. package/resources/ecc/prompts/build-fix.prompt.md +47 -0
  213. package/resources/ecc/prompts/code-review.prompt.md +56 -0
  214. package/resources/ecc/prompts/plan.prompt.md +52 -0
  215. package/resources/ecc/prompts/refactor.prompt.md +50 -0
  216. package/resources/ecc/prompts/security-review.prompt.md +70 -0
  217. package/resources/ecc/prompts/tdd.prompt.md +47 -0
  218. package/resources/ecc/rules/common-agents.md +53 -0
  219. package/resources/ecc/rules/common-coding-style.md +52 -0
  220. package/resources/ecc/rules/common-development-workflow.md +33 -0
  221. package/resources/ecc/rules/common-git-workflow.md +28 -0
  222. package/resources/ecc/rules/common-hooks.md +34 -0
  223. package/resources/ecc/rules/common-patterns.md +35 -0
  224. package/resources/ecc/rules/common-performance.md +59 -0
  225. package/resources/ecc/rules/common-security.md +33 -0
  226. package/resources/ecc/rules/common-testing.md +33 -0
  227. package/resources/ecc/rules/golang-coding-style.md +31 -0
  228. package/resources/ecc/rules/golang-hooks.md +16 -0
  229. package/resources/ecc/rules/golang-patterns.md +44 -0
  230. package/resources/ecc/rules/golang-security.md +33 -0
  231. package/resources/ecc/rules/golang-testing.md +30 -0
  232. package/resources/ecc/rules/kotlin-coding-style.md +39 -0
  233. package/resources/ecc/rules/kotlin-hooks.md +16 -0
  234. package/resources/ecc/rules/kotlin-patterns.md +50 -0
  235. package/resources/ecc/rules/kotlin-security.md +58 -0
  236. package/resources/ecc/rules/kotlin-testing.md +38 -0
  237. package/resources/ecc/rules/php-coding-style.md +25 -0
  238. package/resources/ecc/rules/php-hooks.md +21 -0
  239. package/resources/ecc/rules/php-patterns.md +23 -0
  240. package/resources/ecc/rules/php-security.md +24 -0
  241. package/resources/ecc/rules/php-testing.md +26 -0
  242. package/resources/ecc/rules/python-coding-style.md +42 -0
  243. package/resources/ecc/rules/python-hooks.md +19 -0
  244. package/resources/ecc/rules/python-patterns.md +39 -0
  245. package/resources/ecc/rules/python-security.md +30 -0
  246. package/resources/ecc/rules/python-testing.md +38 -0
  247. package/resources/ecc/rules/swift-coding-style.md +47 -0
  248. package/resources/ecc/rules/swift-hooks.md +20 -0
  249. package/resources/ecc/rules/swift-patterns.md +66 -0
  250. package/resources/ecc/rules/swift-security.md +33 -0
  251. package/resources/ecc/rules/swift-testing.md +45 -0
  252. package/resources/ecc/rules/typescript-coding-style.md +63 -0
  253. package/resources/ecc/rules/typescript-hooks.md +20 -0
  254. package/resources/ecc/rules/typescript-patterns.md +50 -0
  255. package/resources/ecc/rules/typescript-security.md +26 -0
  256. package/resources/ecc/rules/typescript-testing.md +16 -0
  257. package/resources/ecc/skills/agent-introspection-debugging/SKILL.md +152 -0
  258. package/resources/ecc/skills/agent-introspection-debugging/agents/openai.yaml +7 -0
  259. package/resources/ecc/skills/agent-sort/SKILL.md +214 -0
  260. package/resources/ecc/skills/agent-sort/agents/openai.yaml +7 -0
  261. package/resources/ecc/skills/api-design/SKILL.md +522 -0
  262. package/resources/ecc/skills/api-design/agents/openai.yaml +7 -0
  263. package/resources/ecc/skills/article-writing/SKILL.md +78 -0
  264. package/resources/ecc/skills/article-writing/agents/openai.yaml +7 -0
  265. package/resources/ecc/skills/backend-patterns/SKILL.md +597 -0
  266. package/resources/ecc/skills/backend-patterns/agents/openai.yaml +7 -0
  267. package/resources/ecc/skills/brand-voice/SKILL.md +96 -0
  268. package/resources/ecc/skills/brand-voice/agents/openai.yaml +7 -0
  269. package/resources/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
  270. package/resources/ecc/skills/bun-runtime/SKILL.md +83 -0
  271. package/resources/ecc/skills/bun-runtime/agents/openai.yaml +7 -0
  272. package/resources/ecc/skills/coding-standards/SKILL.md +548 -0
  273. package/resources/ecc/skills/coding-standards/agents/openai.yaml +7 -0
  274. package/resources/ecc/skills/content-engine/SKILL.md +130 -0
  275. package/resources/ecc/skills/content-engine/agents/openai.yaml +7 -0
  276. package/resources/ecc/skills/crosspost/SKILL.md +110 -0
  277. package/resources/ecc/skills/crosspost/agents/openai.yaml +7 -0
  278. package/resources/ecc/skills/deep-research/SKILL.md +154 -0
  279. package/resources/ecc/skills/deep-research/agents/openai.yaml +7 -0
  280. package/resources/ecc/skills/dmux-workflows/SKILL.md +143 -0
  281. package/resources/ecc/skills/dmux-workflows/agents/openai.yaml +7 -0
  282. package/resources/ecc/skills/documentation-lookup/SKILL.md +89 -0
  283. package/resources/ecc/skills/documentation-lookup/agents/openai.yaml +7 -0
  284. package/resources/ecc/skills/e2e-testing/SKILL.md +325 -0
  285. package/resources/ecc/skills/e2e-testing/agents/openai.yaml +7 -0
  286. package/resources/ecc/skills/eval-harness/SKILL.md +235 -0
  287. package/resources/ecc/skills/eval-harness/agents/openai.yaml +7 -0
  288. package/resources/ecc/skills/everything-claude-code/SKILL.md +442 -0
  289. package/resources/ecc/skills/everything-claude-code/agents/openai.yaml +7 -0
  290. package/resources/ecc/skills/exa-search/SKILL.md +169 -0
  291. package/resources/ecc/skills/exa-search/agents/openai.yaml +7 -0
  292. package/resources/ecc/skills/fal-ai-media/SKILL.md +276 -0
  293. package/resources/ecc/skills/fal-ai-media/agents/openai.yaml +7 -0
  294. package/resources/ecc/skills/frontend-patterns/SKILL.md +647 -0
  295. package/resources/ecc/skills/frontend-patterns/agents/openai.yaml +7 -0
  296. package/resources/ecc/skills/frontend-slides/SKILL.md +183 -0
  297. package/resources/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  298. package/resources/ecc/skills/frontend-slides/agents/openai.yaml +7 -0
  299. package/resources/ecc/skills/investor-materials/SKILL.md +95 -0
  300. package/resources/ecc/skills/investor-materials/agents/openai.yaml +7 -0
  301. package/resources/ecc/skills/investor-outreach/SKILL.md +90 -0
  302. package/resources/ecc/skills/investor-outreach/agents/openai.yaml +7 -0
  303. package/resources/ecc/skills/market-research/SKILL.md +74 -0
  304. package/resources/ecc/skills/market-research/agents/openai.yaml +7 -0
  305. package/resources/ecc/skills/mcp-server-patterns/SKILL.md +66 -0
  306. package/resources/ecc/skills/mcp-server-patterns/agents/openai.yaml +7 -0
  307. package/resources/ecc/skills/mle-workflow/SKILL.md +346 -0
  308. package/resources/ecc/skills/mle-workflow/agents/openai.yaml +7 -0
  309. package/resources/ecc/skills/nextjs-turbopack/SKILL.md +43 -0
  310. package/resources/ecc/skills/nextjs-turbopack/agents/openai.yaml +7 -0
  311. package/resources/ecc/skills/product-capability/SKILL.md +140 -0
  312. package/resources/ecc/skills/product-capability/agents/openai.yaml +7 -0
  313. package/resources/ecc/skills/security-review/SKILL.md +494 -0
  314. package/resources/ecc/skills/security-review/agents/openai.yaml +7 -0
  315. package/resources/ecc/skills/strategic-compact/SKILL.md +102 -0
  316. package/resources/ecc/skills/strategic-compact/agents/openai.yaml +7 -0
  317. package/resources/ecc/skills/tdd-workflow/SKILL.md +409 -0
  318. package/resources/ecc/skills/tdd-workflow/agents/openai.yaml +7 -0
  319. package/resources/ecc/skills/verification-loop/SKILL.md +125 -0
  320. package/resources/ecc/skills/verification-loop/agents/openai.yaml +7 -0
  321. package/resources/ecc/skills/video-editing/SKILL.md +307 -0
  322. package/resources/ecc/skills/video-editing/agents/openai.yaml +7 -0
  323. package/resources/ecc/skills/x-api/SKILL.md +229 -0
  324. 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;
@@ -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 {};
@@ -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;