@pcircle/claude-code-buddy-mcp 2.3.10 → 2.4.1

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 (58) hide show
  1. package/dist/core/HookIntegration.d.ts +5 -1
  2. package/dist/core/HookIntegration.d.ts.map +1 -1
  3. package/dist/core/HookIntegration.js +73 -46
  4. package/dist/core/HookIntegration.js.map +1 -1
  5. package/dist/core/TestOutputParser.d.ts +20 -0
  6. package/dist/core/TestOutputParser.d.ts.map +1 -0
  7. package/dist/core/TestOutputParser.js +144 -0
  8. package/dist/core/TestOutputParser.js.map +1 -0
  9. package/dist/mcp/resources/best-practices.md +67 -0
  10. package/dist/mcp/resources/examples.md +56 -0
  11. package/dist/mcp/resources/quick-reference.md +73 -0
  12. package/dist/mcp/resources/usage-guide.md +92 -0
  13. package/dist/memory/ProjectAutoTracker.d.ts +13 -0
  14. package/dist/memory/ProjectAutoTracker.d.ts.map +1 -1
  15. package/dist/memory/ProjectAutoTracker.js +89 -5
  16. package/dist/memory/ProjectAutoTracker.js.map +1 -1
  17. package/package.json +3 -2
  18. package/plugin.json +1 -1
  19. package/dist/__benchmarks__/performance-fixes.bench.d.ts +0 -8
  20. package/dist/__benchmarks__/performance-fixes.bench.d.ts.map +0 -1
  21. package/dist/__benchmarks__/performance-fixes.bench.js +0 -213
  22. package/dist/__benchmarks__/performance-fixes.bench.js.map +0 -1
  23. package/dist/core/BackgroundExecutorConstants.d.ts +0 -8
  24. package/dist/core/BackgroundExecutorConstants.d.ts.map +0 -1
  25. package/dist/core/BackgroundExecutorConstants.js +0 -8
  26. package/dist/core/BackgroundExecutorConstants.js.map +0 -1
  27. package/dist/evolution/LearningManagerConstants.d.ts +0 -55
  28. package/dist/evolution/LearningManagerConstants.d.ts.map +0 -1
  29. package/dist/evolution/LearningManagerConstants.js +0 -55
  30. package/dist/evolution/LearningManagerConstants.js.map +0 -1
  31. package/dist/evolution/PerformanceTrackerConstants.d.ts +0 -5
  32. package/dist/evolution/PerformanceTrackerConstants.d.ts.map +0 -1
  33. package/dist/evolution/PerformanceTrackerConstants.js +0 -5
  34. package/dist/evolution/PerformanceTrackerConstants.js.map +0 -1
  35. package/dist/orchestrator/GlobalResourcePoolConstants.d.ts +0 -22
  36. package/dist/orchestrator/GlobalResourcePoolConstants.d.ts.map +0 -1
  37. package/dist/orchestrator/GlobalResourcePoolConstants.js +0 -22
  38. package/dist/orchestrator/GlobalResourcePoolConstants.js.map +0 -1
  39. package/dist/orchestrator/TaskAnalyzerConstants.d.ts +0 -16
  40. package/dist/orchestrator/TaskAnalyzerConstants.d.ts.map +0 -1
  41. package/dist/orchestrator/TaskAnalyzerConstants.js +0 -16
  42. package/dist/orchestrator/TaskAnalyzerConstants.js.map +0 -1
  43. package/dist/templates/git-education-templates.d.ts +0 -26
  44. package/dist/templates/git-education-templates.d.ts.map +0 -1
  45. package/dist/templates/git-education-templates.js +0 -455
  46. package/dist/templates/git-education-templates.js.map +0 -1
  47. package/dist/utils/SecureKeyStore.d.ts +0 -10
  48. package/dist/utils/SecureKeyStore.d.ts.map +0 -1
  49. package/dist/utils/SecureKeyStore.js +0 -32
  50. package/dist/utils/SecureKeyStore.js.map +0 -1
  51. package/dist/utils/cost-tracker.d.ts +0 -34
  52. package/dist/utils/cost-tracker.d.ts.map +0 -1
  53. package/dist/utils/cost-tracker.js +0 -92
  54. package/dist/utils/cost-tracker.js.map +0 -1
  55. package/dist/utils/validation.d.ts +0 -7
  56. package/dist/utils/validation.d.ts.map +0 -1
  57. package/dist/utils/validation.js +0 -62
  58. package/dist/utils/validation.js.map +0 -1
@@ -1,92 +0,0 @@
1
- import { MODEL_COSTS } from '../config/models.js';
2
- import { appConfig } from '../config/index.js';
3
- import { logger } from './logger.js';
4
- class CostTracker {
5
- records = [];
6
- monthlyBudget;
7
- alertThreshold;
8
- constructor() {
9
- this.monthlyBudget = appConfig.costs.monthlyBudget;
10
- this.alertThreshold = appConfig.costs.alertThreshold;
11
- }
12
- trackClaude(model, inputTokens, outputTokens) {
13
- const costs = MODEL_COSTS[model];
14
- const cost = (inputTokens / 1_000_000) * costs.input + (outputTokens / 1_000_000) * costs.output;
15
- this.addRecord({
16
- timestamp: new Date(),
17
- service: 'claude',
18
- model,
19
- inputTokens,
20
- outputTokens,
21
- cost,
22
- });
23
- return cost;
24
- }
25
- trackWhisper(minutes) {
26
- const cost = minutes * MODEL_COSTS['whisper-1'].perMinute;
27
- this.addRecord({
28
- timestamp: new Date(),
29
- service: 'whisper',
30
- model: 'whisper-1',
31
- minutes,
32
- cost,
33
- });
34
- return cost;
35
- }
36
- trackTTS(characters) {
37
- const cost = (characters / 1000) * MODEL_COSTS['tts-1'].per1KChars;
38
- this.addRecord({
39
- timestamp: new Date(),
40
- service: 'tts',
41
- model: 'tts-1',
42
- characters,
43
- cost,
44
- });
45
- return cost;
46
- }
47
- trackEmbeddings(tokens) {
48
- const cost = (tokens / 1_000_000) * MODEL_COSTS['text-embedding-3-small'].input;
49
- this.addRecord({
50
- timestamp: new Date(),
51
- service: 'embeddings',
52
- model: 'text-embedding-3-small',
53
- inputTokens: tokens,
54
- cost,
55
- });
56
- return cost;
57
- }
58
- addRecord(record) {
59
- this.records.push(record);
60
- const monthlyTotal = this.getMonthlyTotal();
61
- if (monthlyTotal > this.monthlyBudget * this.alertThreshold) {
62
- logger.warn(`⚠️ Cost alert: $${monthlyTotal.toFixed(2)} / $${this.monthlyBudget.toFixed(2)} (${((monthlyTotal / this.monthlyBudget) * 100).toFixed(1)}%)`);
63
- }
64
- if (monthlyTotal > this.monthlyBudget) {
65
- logger.error(`🚨 Budget exceeded! $${monthlyTotal.toFixed(2)} / $${this.monthlyBudget.toFixed(2)}`);
66
- }
67
- }
68
- getMonthlyTotal() {
69
- const now = new Date();
70
- const monthStart = new Date(now.getFullYear(), now.getMonth(), 1);
71
- return this.records
72
- .filter((r) => r.timestamp >= monthStart)
73
- .reduce((total, r) => total + r.cost, 0);
74
- }
75
- getReport() {
76
- const monthlyTotal = this.getMonthlyTotal();
77
- const breakdown = this.records.reduce((acc, r) => {
78
- acc[r.service] = (acc[r.service] || 0) + r.cost;
79
- return acc;
80
- }, {});
81
- return {
82
- monthlyTotal,
83
- budget: this.monthlyBudget,
84
- remaining: this.monthlyBudget - monthlyTotal,
85
- percentUsed: (monthlyTotal / this.monthlyBudget) * 100,
86
- breakdown,
87
- records: this.records,
88
- };
89
- }
90
- }
91
- export const costTracker = new CostTracker();
92
- //# sourceMappingURL=cost-tracker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../../src/utils/cost-tracker.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- export declare function validateNonEmptyString(value: unknown, fieldName: string, context?: Record<string, unknown>): asserts value is string;
2
- export declare function validateNonNegativeNumber(value: unknown, fieldName: string, context?: Record<string, unknown>): asserts value is number;
3
- export declare function validateNumberInRange(value: unknown, fieldName: string, min: number, max: number, context?: Record<string, unknown>): asserts value is number;
4
- export declare function validateBoolean(value: unknown, fieldName: string, context?: Record<string, unknown>): asserts value is boolean;
5
- export declare function validateDefined<T>(value: T | null | undefined, fieldName: string, context?: Record<string, unknown>): asserts value is T;
6
- export declare function validateNonEmptyArray<T>(value: unknown, fieldName: string, context?: Record<string, unknown>): asserts value is T[];
7
- //# sourceMappingURL=validation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAiBA,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,KAAK,IAAI,MAAM,CASzB;AAUD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,KAAK,IAAI,MAAM,CASzB;AAYD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,KAAK,IAAI,MAAM,CAYzB;AAUD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,KAAK,IAAI,OAAO,CAS1B;AAUD,wBAAgB,eAAe,CAAC,CAAC,EAC/B,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,KAAK,IAAI,CAAC,CASpB;AAUD,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,CAStB"}
@@ -1,62 +0,0 @@
1
- import { ValidationError } from '../errors/index.js';
2
- export function validateNonEmptyString(value, fieldName, context) {
3
- if (!value || typeof value !== 'string' || value.trim() === '') {
4
- throw new ValidationError(`${fieldName} must be a non-empty string`, {
5
- field: fieldName,
6
- providedValue: value,
7
- constraint: 'non-empty string',
8
- ...context,
9
- });
10
- }
11
- }
12
- export function validateNonNegativeNumber(value, fieldName, context) {
13
- if (typeof value !== 'number' || value < 0 || !Number.isFinite(value)) {
14
- throw new ValidationError(`${fieldName} must be a non-negative number`, {
15
- field: fieldName,
16
- providedValue: value,
17
- constraint: 'non-negative number',
18
- ...context,
19
- });
20
- }
21
- }
22
- export function validateNumberInRange(value, fieldName, min, max, context) {
23
- if (typeof value !== 'number' || value < min || value > max || !Number.isFinite(value)) {
24
- throw new ValidationError(`${fieldName} must be a number between ${min} and ${max}`, {
25
- field: fieldName,
26
- providedValue: value,
27
- constraint: `${min} <= value <= ${max}`,
28
- ...context,
29
- });
30
- }
31
- }
32
- export function validateBoolean(value, fieldName, context) {
33
- if (typeof value !== 'boolean') {
34
- throw new ValidationError(`${fieldName} must be a boolean`, {
35
- field: fieldName,
36
- providedValue: value,
37
- constraint: 'boolean type',
38
- ...context,
39
- });
40
- }
41
- }
42
- export function validateDefined(value, fieldName, context) {
43
- if (value === null || value === undefined) {
44
- throw new ValidationError(`${fieldName} must be defined`, {
45
- field: fieldName,
46
- providedValue: value,
47
- constraint: 'defined (not null or undefined)',
48
- ...context,
49
- });
50
- }
51
- }
52
- export function validateNonEmptyArray(value, fieldName, context) {
53
- if (!Array.isArray(value) || value.length === 0) {
54
- throw new ValidationError(`${fieldName} must be a non-empty array`, {
55
- field: fieldName,
56
- providedValue: value,
57
- constraint: 'non-empty array',
58
- ...context,
59
- });
60
- }
61
- }
62
- //# sourceMappingURL=validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAUrD,MAAM,UAAU,sBAAsB,CACpC,KAAc,EACd,SAAiB,EACjB,OAAiC;IAEjC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/D,MAAM,IAAI,eAAe,CAAC,GAAG,SAAS,6BAA6B,EAAE;YACnE,KAAK,EAAE,SAAS;YAChB,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,kBAAkB;YAC9B,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAUD,MAAM,UAAU,yBAAyB,CACvC,KAAc,EACd,SAAiB,EACjB,OAAiC;IAEjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,eAAe,CAAC,GAAG,SAAS,gCAAgC,EAAE;YACtE,KAAK,EAAE,SAAS;YAChB,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,qBAAqB;YACjC,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAYD,MAAM,UAAU,qBAAqB,CACnC,KAAc,EACd,SAAiB,EACjB,GAAW,EACX,GAAW,EACX,OAAiC;IAEjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,eAAe,CACvB,GAAG,SAAS,6BAA6B,GAAG,QAAQ,GAAG,EAAE,EACzD;YACE,KAAK,EAAE,SAAS;YAChB,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,GAAG,GAAG,gBAAgB,GAAG,EAAE;YACvC,GAAG,OAAO;SACX,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAUD,MAAM,UAAU,eAAe,CAC7B,KAAc,EACd,SAAiB,EACjB,OAAiC;IAEjC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,eAAe,CAAC,GAAG,SAAS,oBAAoB,EAAE;YAC1D,KAAK,EAAE,SAAS;YAChB,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,cAAc;YAC1B,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAUD,MAAM,UAAU,eAAe,CAC7B,KAA2B,EAC3B,SAAiB,EACjB,OAAiC;IAEjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,MAAM,IAAI,eAAe,CAAC,GAAG,SAAS,kBAAkB,EAAE;YACxD,KAAK,EAAE,SAAS;YAChB,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,iCAAiC;YAC7C,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAUD,MAAM,UAAU,qBAAqB,CACnC,KAAc,EACd,SAAiB,EACjB,OAAiC;IAEjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,eAAe,CAAC,GAAG,SAAS,4BAA4B,EAAE;YAClE,KAAK,EAAE,SAAS;YAChB,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,iBAAiB;YAC7B,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}