context-tracker-mcp1.0 1.0.6

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 (40) hide show
  1. package/bin/context-tracker-mcp.cmd +2 -0
  2. package/bin/context-tracker-mcp.js +4 -0
  3. package/dist/config-manager.d.ts +32 -0
  4. package/dist/config-manager.d.ts.map +1 -0
  5. package/dist/config-manager.js +103 -0
  6. package/dist/config-manager.js.map +1 -0
  7. package/dist/context-tracker.d.ts +73 -0
  8. package/dist/context-tracker.d.ts.map +1 -0
  9. package/dist/context-tracker.js +375 -0
  10. package/dist/context-tracker.js.map +1 -0
  11. package/dist/documentation-generator.d.ts +13 -0
  12. package/dist/documentation-generator.d.ts.map +1 -0
  13. package/dist/documentation-generator.js +308 -0
  14. package/dist/documentation-generator.js.map +1 -0
  15. package/dist/error-analyzer.d.ts +21 -0
  16. package/dist/error-analyzer.d.ts.map +1 -0
  17. package/dist/error-analyzer.js +69 -0
  18. package/dist/error-analyzer.js.map +1 -0
  19. package/dist/file-watcher.d.ts +36 -0
  20. package/dist/file-watcher.d.ts.map +1 -0
  21. package/dist/file-watcher.js +225 -0
  22. package/dist/file-watcher.js.map +1 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +476 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/mutex.d.ts +137 -0
  28. package/dist/mutex.d.ts.map +1 -0
  29. package/dist/mutex.js +276 -0
  30. package/dist/mutex.js.map +1 -0
  31. package/dist/project-intelligence.d.ts +24 -0
  32. package/dist/project-intelligence.d.ts.map +1 -0
  33. package/dist/project-intelligence.js +101 -0
  34. package/dist/project-intelligence.js.map +1 -0
  35. package/dist/resource-manager.d.ts +33 -0
  36. package/dist/resource-manager.d.ts.map +1 -0
  37. package/dist/resource-manager.js +188 -0
  38. package/dist/resource-manager.js.map +1 -0
  39. package/mcp-config.json +125 -0
  40. package/package.json +56 -0
@@ -0,0 +1,2 @@
1
+ @echo off
2
+ node "%~dp0..\dist\index.js" %*
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ // This wrapper ensures the MCP runs with Node.js on all platforms
4
+ import '../dist/index.js';
@@ -0,0 +1,32 @@
1
+ export interface MCPConfig {
2
+ watchPaths: string[];
3
+ dataDirectory: string;
4
+ autoTrack: boolean;
5
+ logLevel: 'debug' | 'info' | 'warn' | 'error';
6
+ maxHistoryEntries: number;
7
+ enableProjectIntelligence: boolean;
8
+ enableErrorAnalysis: boolean;
9
+ notifications: {
10
+ enabled: boolean;
11
+ email?: string;
12
+ webhook?: string;
13
+ };
14
+ }
15
+ export declare class ConfigManager {
16
+ private configPath;
17
+ private defaultConfig;
18
+ constructor(configPath?: string);
19
+ loadConfig(): Promise<MCPConfig>;
20
+ saveConfig(config: MCPConfig): Promise<void>;
21
+ updateConfig(updates: Partial<MCPConfig>): Promise<MCPConfig>;
22
+ private mergeConfigs;
23
+ validateConfig(config: MCPConfig): Promise<{
24
+ isValid: boolean;
25
+ errors: string[];
26
+ }>;
27
+ createDefaultConfig(): Promise<void>;
28
+ getConfigPath(): string;
29
+ getDataDirectory(): Promise<string>;
30
+ getWatchPaths(): Promise<string[]>;
31
+ }
32
+ //# sourceMappingURL=config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../src/config-manager.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB,EAAE,OAAO,CAAC;IACnC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAWnB;gBAEU,UAAU,CAAC,EAAE,MAAM;IAIzB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAahC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5C,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAOnE,OAAO,CAAC,YAAY;IAiBd,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/C,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IA8BI,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAK1C,aAAa,IAAI,MAAM;IAIjB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKnC,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAIzC"}
@@ -0,0 +1,103 @@
1
+ import { promises as fs } from 'fs';
2
+ export class ConfigManager {
3
+ configPath;
4
+ defaultConfig = {
5
+ watchPaths: ['./src', './components', './styles'],
6
+ dataDirectory: './context-data',
7
+ autoTrack: true,
8
+ logLevel: 'info',
9
+ maxHistoryEntries: 1000,
10
+ enableProjectIntelligence: true,
11
+ enableErrorAnalysis: true,
12
+ notifications: {
13
+ enabled: false
14
+ }
15
+ };
16
+ constructor(configPath) {
17
+ this.configPath = configPath || './mcp-config.json';
18
+ }
19
+ async loadConfig() {
20
+ try {
21
+ const configData = await fs.readFile(this.configPath, 'utf-8');
22
+ const config = JSON.parse(configData);
23
+ // Merge with defaults
24
+ return this.mergeConfigs(this.defaultConfig, config);
25
+ }
26
+ catch (error) {
27
+ console.log('Config file not found, using defaults:', error);
28
+ return this.defaultConfig;
29
+ }
30
+ }
31
+ async saveConfig(config) {
32
+ try {
33
+ await fs.writeFile(this.configPath, JSON.stringify(config, null, 2));
34
+ console.log('Configuration saved to:', this.configPath);
35
+ }
36
+ catch (error) {
37
+ console.error('Failed to save config:', error);
38
+ throw new Error(`Configuration save failed: ${error}`);
39
+ }
40
+ }
41
+ async updateConfig(updates) {
42
+ const currentConfig = await this.loadConfig();
43
+ const newConfig = this.mergeConfigs(currentConfig, updates);
44
+ await this.saveConfig(newConfig);
45
+ return newConfig;
46
+ }
47
+ mergeConfigs(base, override) {
48
+ return {
49
+ watchPaths: override.watchPaths || base.watchPaths,
50
+ dataDirectory: override.dataDirectory || base.dataDirectory,
51
+ autoTrack: override.autoTrack !== undefined ? override.autoTrack : base.autoTrack,
52
+ logLevel: override.logLevel || base.logLevel,
53
+ maxHistoryEntries: override.maxHistoryEntries ?? base.maxHistoryEntries,
54
+ enableProjectIntelligence: override.enableProjectIntelligence !== undefined ? override.enableProjectIntelligence : base.enableProjectIntelligence,
55
+ enableErrorAnalysis: override.enableErrorAnalysis !== undefined ? override.enableErrorAnalysis : base.enableErrorAnalysis,
56
+ notifications: {
57
+ enabled: override.notifications?.enabled !== undefined ? override.notifications.enabled : base.notifications.enabled,
58
+ email: override.notifications?.email || base.notifications.email,
59
+ webhook: override.notifications?.webhook || base.notifications.webhook
60
+ }
61
+ };
62
+ }
63
+ async validateConfig(config) {
64
+ const errors = [];
65
+ // Validate watch paths
66
+ if (!config.watchPaths || config.watchPaths.length === 0) {
67
+ errors.push('At least one watch path must be specified');
68
+ }
69
+ // Validate data directory
70
+ if (!config.dataDirectory) {
71
+ errors.push('Data directory must be specified');
72
+ }
73
+ // Validate log level
74
+ const validLogLevels = ['debug', 'info', 'warn', 'error'];
75
+ if (!validLogLevels.includes(config.logLevel)) {
76
+ errors.push(`Invalid log level: ${config.logLevel}`);
77
+ }
78
+ // Validate max history entries
79
+ if (config.maxHistoryEntries < 1 || config.maxHistoryEntries > 10000) {
80
+ errors.push('Max history entries must be between 1 and 10000');
81
+ }
82
+ return {
83
+ isValid: errors.length === 0,
84
+ errors
85
+ };
86
+ }
87
+ async createDefaultConfig() {
88
+ await this.saveConfig(this.defaultConfig);
89
+ console.log('Default configuration created at:', this.configPath);
90
+ }
91
+ getConfigPath() {
92
+ return this.configPath;
93
+ }
94
+ async getDataDirectory() {
95
+ const config = await this.loadConfig();
96
+ return config.dataDirectory;
97
+ }
98
+ async getWatchPaths() {
99
+ const config = await this.loadConfig();
100
+ return config.watchPaths;
101
+ }
102
+ }
103
+ //# sourceMappingURL=config-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../src/config-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ interface ContextEntry {
2
+ id: string;
3
+ timestamp: string;
4
+ action: 'start' | 'update' | 'complete';
5
+ description: string;
6
+ files: string[];
7
+ code?: string;
8
+ status: 'active' | 'completed' | 'paused';
9
+ }
10
+ interface ErrorEntry {
11
+ id: string;
12
+ timestamp: string;
13
+ error: string;
14
+ solution: string;
15
+ context: string;
16
+ resolved: boolean;
17
+ }
18
+ interface StylingEntry {
19
+ id: string;
20
+ timestamp: string;
21
+ element: string;
22
+ styles: Record<string, any>;
23
+ location: string;
24
+ component?: string;
25
+ }
26
+ export declare class ContextTracker {
27
+ private dataDir;
28
+ private contextFile;
29
+ private errorsFile;
30
+ private stylingFile;
31
+ private currentContext;
32
+ private errors;
33
+ private styling;
34
+ private lock;
35
+ private initialized;
36
+ private rateLimits;
37
+ private readonly RATE_LIMIT_WINDOW;
38
+ private readonly RATE_LIMIT_MAX;
39
+ private readonly MAX_AGE_DAYS;
40
+ private cleanupInterval;
41
+ private cleanupRunning;
42
+ constructor(dataDir?: string);
43
+ private startCleanupInterval;
44
+ private cleanupOldData;
45
+ destroy(): Promise<void>;
46
+ private checkRateLimit;
47
+ private ensureInitialized;
48
+ private loadData;
49
+ private saveData;
50
+ trackContext(action: 'start' | 'update' | 'complete', data: any): Promise<ContextEntry>;
51
+ private enforceHistoryLimit;
52
+ getHistory(limit?: number): Promise<ContextEntry[]>;
53
+ getActiveContext(): Promise<ContextEntry[]>;
54
+ logError(error: string, solution: string, context?: string): Promise<void>;
55
+ getErrorLog(): Promise<ErrorEntry[]>;
56
+ trackStyling(element: string, styles: Record<string, any>, location?: string, component?: string): Promise<void>;
57
+ getStylingHistory(): Promise<StylingEntry[]>;
58
+ getStylingByElement(element: string): Promise<StylingEntry[]>;
59
+ getStylingByLocation(location?: string): Promise<StylingEntry[]>;
60
+ exportData(format?: 'json' | 'csv'): Promise<string>;
61
+ private convertToCSV;
62
+ clearHistory(type?: 'context' | 'errors' | 'styling'): Promise<void>;
63
+ getStatistics(): Promise<{
64
+ totalContextEntries: number;
65
+ activeContexts: number;
66
+ totalErrors: number;
67
+ totalStylingEntries: number;
68
+ uniqueFiles: number;
69
+ uniqueElements: number;
70
+ }>;
71
+ }
72
+ export {};
73
+ //# sourceMappingURL=context-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-tracker.d.ts","sourceRoot":"","sources":["../src/context-tracker.ts"],"names":[],"mappings":"AAKA,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;CAC3C;AAED,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,UAAU,CAIhB;IACF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;IAEtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAM;IACnC,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,GAAE,MAAyB;IAS9C,OAAO,CAAC,oBAAoB;YAed,cAAc;IAwCtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,OAAO,CAAC,cAAc;YAgBR,iBAAiB;YAajB,QAAQ;YAmCR,QAAQ;IAYhB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,EAAE,IAAI,EAAE,GAAG;YA6DvD,mBAAmB;IAMjC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM;IAOzB,gBAAgB;IAMV,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAsBhE,WAAW;IAML,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAsBtG,iBAAiB;IAMjB,mBAAmB,CAAC,OAAO,EAAE,MAAM;IAMnC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM;IAOhC,UAAU,CAAC,MAAM,GAAE,MAAM,GAAG,KAAc;IAgBhD,OAAO,CAAC,YAAY;IA2Bd,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS;IAepD,aAAa;;;;;;;;CAYpB"}
@@ -0,0 +1,375 @@
1
+ import { promises as fs } from 'fs';
2
+ import { join } from 'path';
3
+ import { v4 as uuidv4 } from 'uuid';
4
+ import { ReadWriteLock } from './mutex.js';
5
+ export class ContextTracker {
6
+ dataDir;
7
+ contextFile;
8
+ errorsFile;
9
+ stylingFile;
10
+ currentContext = [];
11
+ errors = [];
12
+ styling = [];
13
+ lock;
14
+ initialized = false;
15
+ // Rate limiting - separate counters for each method to prevent starvation
16
+ rateLimits = {
17
+ context: { lastTime: 0, count: 0 },
18
+ error: { lastTime: 0, count: 0 },
19
+ styling: { lastTime: 0, count: 0 }
20
+ };
21
+ RATE_LIMIT_WINDOW = 1000; // 1 second
22
+ RATE_LIMIT_MAX = 100; // max 100 calls per second (per method)
23
+ // Data retention
24
+ MAX_AGE_DAYS = 30; // Keep data for 30 days max
25
+ cleanupInterval = null;
26
+ cleanupRunning = false;
27
+ constructor(dataDir = './context-data') {
28
+ this.dataDir = dataDir;
29
+ this.contextFile = join(dataDir, 'context.json');
30
+ this.errorsFile = join(dataDir, 'errors.json');
31
+ this.stylingFile = join(dataDir, 'styling.json');
32
+ this.lock = new ReadWriteLock('context-tracker');
33
+ this.startCleanupInterval();
34
+ }
35
+ startCleanupInterval() {
36
+ // Run cleanup once per day
37
+ this.cleanupInterval = setInterval(async () => {
38
+ if (this.cleanupRunning)
39
+ return; // Skip if still running
40
+ this.cleanupRunning = true;
41
+ try {
42
+ await this.cleanupOldData();
43
+ }
44
+ catch (error) {
45
+ console.error('Cleanup error:', error);
46
+ }
47
+ finally {
48
+ this.cleanupRunning = false;
49
+ }
50
+ }, 24 * 60 * 60 * 1000);
51
+ }
52
+ async cleanupOldData() {
53
+ const cutoffDate = new Date();
54
+ cutoffDate.setDate(cutoffDate.getDate() - this.MAX_AGE_DAYS);
55
+ const cutoffISO = cutoffDate.toISOString();
56
+ return this.lock.withWriteLock(async () => {
57
+ // Calculate new filtered arrays first (don't modify yet)
58
+ const newContext = this.currentContext.filter(entry => entry.timestamp >= cutoffISO);
59
+ const newErrors = this.errors.filter(entry => entry.timestamp >= cutoffISO);
60
+ const newStyling = this.styling.filter(entry => entry.timestamp >= cutoffISO);
61
+ const removedContext = this.currentContext.length - newContext.length;
62
+ const removedErrors = this.errors.length - newErrors.length;
63
+ const removedStyling = this.styling.length - newStyling.length;
64
+ if (removedContext > 0 || removedErrors > 0 || removedStyling > 0) {
65
+ // Save first with new data
66
+ const oldContext = this.currentContext;
67
+ const oldErrors = this.errors;
68
+ const oldStyling = this.styling;
69
+ // Apply changes
70
+ this.currentContext = newContext;
71
+ this.errors = newErrors;
72
+ this.styling = newStyling;
73
+ try {
74
+ await this.saveData();
75
+ console.log(`Data cleanup: removed ${removedContext} context, ${removedErrors} errors, ${removedStyling} styling entries older than ${this.MAX_AGE_DAYS} days`);
76
+ }
77
+ catch (error) {
78
+ // Rollback on save failure
79
+ this.currentContext = oldContext;
80
+ this.errors = oldErrors;
81
+ this.styling = oldStyling;
82
+ throw error;
83
+ }
84
+ }
85
+ });
86
+ }
87
+ async destroy() {
88
+ if (this.cleanupInterval) {
89
+ clearInterval(this.cleanupInterval);
90
+ this.cleanupInterval = null;
91
+ }
92
+ }
93
+ checkRateLimit(type) {
94
+ const limit = this.rateLimits[type];
95
+ const now = Date.now();
96
+ if (now - limit.lastTime > this.RATE_LIMIT_WINDOW) {
97
+ // Reset window
98
+ limit.lastTime = now;
99
+ limit.count = 1;
100
+ return true;
101
+ }
102
+ if (limit.count >= this.RATE_LIMIT_MAX) {
103
+ return false; // Rate limit exceeded
104
+ }
105
+ limit.count++;
106
+ return true;
107
+ }
108
+ async ensureInitialized() {
109
+ if (!this.initialized) {
110
+ try {
111
+ await fs.mkdir(this.dataDir, { recursive: true });
112
+ await this.loadData();
113
+ this.initialized = true;
114
+ }
115
+ catch (error) {
116
+ console.error('Failed to initialize ContextTracker:', error);
117
+ throw error; // Re-throw to prevent system from running in broken state
118
+ }
119
+ }
120
+ }
121
+ async loadData() {
122
+ try {
123
+ const contextData = await fs.readFile(this.contextFile, 'utf-8');
124
+ this.currentContext = JSON.parse(contextData);
125
+ }
126
+ catch (err) {
127
+ if (err.code === 'ENOENT') {
128
+ this.currentContext = [];
129
+ }
130
+ else {
131
+ throw err; // Re-throw JSON parse errors or other unexpected errors
132
+ }
133
+ }
134
+ try {
135
+ const errorsData = await fs.readFile(this.errorsFile, 'utf-8');
136
+ this.errors = JSON.parse(errorsData);
137
+ }
138
+ catch (err) {
139
+ if (err.code === 'ENOENT') {
140
+ this.errors = [];
141
+ }
142
+ else {
143
+ throw err;
144
+ }
145
+ }
146
+ try {
147
+ const stylingData = await fs.readFile(this.stylingFile, 'utf-8');
148
+ this.styling = JSON.parse(stylingData);
149
+ }
150
+ catch (err) {
151
+ if (err.code === 'ENOENT') {
152
+ this.styling = [];
153
+ }
154
+ else {
155
+ throw err;
156
+ }
157
+ }
158
+ }
159
+ async saveData() {
160
+ try {
161
+ await Promise.all([
162
+ fs.writeFile(this.contextFile, JSON.stringify(this.currentContext, null, 2)),
163
+ fs.writeFile(this.errorsFile, JSON.stringify(this.errors, null, 2)),
164
+ fs.writeFile(this.stylingFile, JSON.stringify(this.styling, null, 2))
165
+ ]);
166
+ }
167
+ catch (error) {
168
+ console.error('Failed to save data:', error);
169
+ }
170
+ }
171
+ async trackContext(action, data) {
172
+ // Check rate limit - skip only if exceeded, don't return null
173
+ if (!this.checkRateLimit('context')) {
174
+ console.warn('Rate limit exceeded for trackContext, processing anyway');
175
+ }
176
+ return this.lock.withWriteLock(async () => {
177
+ await this.ensureInitialized();
178
+ const entry = {
179
+ id: uuidv4(),
180
+ timestamp: new Date().toISOString(),
181
+ action,
182
+ description: data.description || '',
183
+ files: data.files || [],
184
+ code: data.code,
185
+ status: action === 'complete' ? 'completed' : 'active'
186
+ };
187
+ if (action === 'start') {
188
+ // Mark previous active contexts as paused
189
+ this.currentContext.forEach(ctx => {
190
+ if (ctx.status === 'active') {
191
+ ctx.status = 'paused';
192
+ }
193
+ });
194
+ }
195
+ else if (action === 'update' && this.currentContext.length > 0) {
196
+ // Update the most recent active context
197
+ const lastContext = this.currentContext[this.currentContext.length - 1];
198
+ if (lastContext.status === 'active') {
199
+ lastContext.description = data.description || lastContext.description;
200
+ lastContext.files = [...new Set([...lastContext.files, ...(data.files || [])])];
201
+ lastContext.code = data.code || lastContext.code;
202
+ await this.saveData();
203
+ return lastContext;
204
+ }
205
+ }
206
+ else if (action === 'complete' && this.currentContext.length > 0) {
207
+ // Mark the most recent active context as completed
208
+ const lastContext = this.currentContext[this.currentContext.length - 1];
209
+ if (lastContext.status === 'active' || lastContext.status === 'paused') {
210
+ lastContext.status = 'completed';
211
+ lastContext.action = action; // Update action to 'complete'
212
+ lastContext.description = data.description || lastContext.description;
213
+ lastContext.files = [...new Set([...lastContext.files, ...(data.files || [])])];
214
+ lastContext.code = data.code || lastContext.code;
215
+ await this.saveData();
216
+ return lastContext;
217
+ }
218
+ else {
219
+ // Last context is already completed - nothing to complete
220
+ return lastContext;
221
+ }
222
+ }
223
+ else if (action === 'complete') {
224
+ // No context exists to complete - return without creating orphaned entry
225
+ return entry;
226
+ }
227
+ this.currentContext.push(entry);
228
+ await this.enforceHistoryLimit();
229
+ await this.saveData();
230
+ return entry;
231
+ });
232
+ }
233
+ async enforceHistoryLimit() {
234
+ if (this.currentContext.length > 1000) {
235
+ this.currentContext = this.currentContext.slice(-1000);
236
+ }
237
+ }
238
+ getHistory(limit) {
239
+ return this.lock.withReadLock(() => {
240
+ const history = [...this.currentContext].reverse();
241
+ return limit ? history.slice(0, limit) : history;
242
+ });
243
+ }
244
+ getActiveContext() {
245
+ return this.lock.withReadLock(() => {
246
+ return this.currentContext.filter(ctx => ctx.status === 'active');
247
+ });
248
+ }
249
+ async logError(error, solution, context) {
250
+ // Check rate limit
251
+ if (!this.checkRateLimit('error')) {
252
+ console.warn('Rate limit exceeded for logError, skipping');
253
+ return;
254
+ }
255
+ return this.lock.withWriteLock(async () => {
256
+ await this.ensureInitialized();
257
+ const errorEntry = {
258
+ id: uuidv4(),
259
+ timestamp: new Date().toISOString(),
260
+ error,
261
+ solution,
262
+ context: context || '',
263
+ resolved: true
264
+ };
265
+ this.errors.push(errorEntry);
266
+ await this.saveData();
267
+ });
268
+ }
269
+ getErrorLog() {
270
+ return this.lock.withReadLock(() => {
271
+ return [...this.errors].reverse();
272
+ });
273
+ }
274
+ async trackStyling(element, styles, location, component) {
275
+ // Check rate limit
276
+ if (!this.checkRateLimit('styling')) {
277
+ console.warn('Rate limit exceeded for trackStyling, skipping');
278
+ return;
279
+ }
280
+ return this.lock.withWriteLock(async () => {
281
+ await this.ensureInitialized();
282
+ const stylingEntry = {
283
+ id: uuidv4(),
284
+ timestamp: new Date().toISOString(),
285
+ element,
286
+ styles,
287
+ location: location || '',
288
+ component
289
+ };
290
+ this.styling.push(stylingEntry);
291
+ await this.saveData();
292
+ });
293
+ }
294
+ getStylingHistory() {
295
+ return this.lock.withReadLock(() => {
296
+ return [...this.styling].reverse();
297
+ });
298
+ }
299
+ getStylingByElement(element) {
300
+ return this.lock.withReadLock(() => {
301
+ return this.styling.filter(entry => entry.element === element);
302
+ });
303
+ }
304
+ getStylingByLocation(location) {
305
+ return this.lock.withReadLock(() => {
306
+ if (!location)
307
+ return [];
308
+ return this.styling.filter(entry => entry.location.includes(location));
309
+ });
310
+ }
311
+ async exportData(format = 'json') {
312
+ const data = {
313
+ context: this.currentContext,
314
+ errors: this.errors,
315
+ styling: this.styling,
316
+ exportedAt: new Date().toISOString()
317
+ };
318
+ if (format === 'json') {
319
+ return JSON.stringify(data, null, 2);
320
+ }
321
+ else {
322
+ // CSV export logic
323
+ return this.convertToCSV(data);
324
+ }
325
+ }
326
+ convertToCSV(data) {
327
+ const csvLines = [];
328
+ // Context CSV
329
+ csvLines.push('CONTEXT HISTORY');
330
+ csvLines.push('ID,Timestamp,Action,Description,Files,Status');
331
+ data.context.forEach((entry) => {
332
+ csvLines.push(`${entry.id},${entry.timestamp},${entry.action},"${entry.description}","${entry.files.join(';')}",${entry.status}`);
333
+ });
334
+ csvLines.push('');
335
+ csvLines.push('ERROR LOG');
336
+ csvLines.push('ID,Timestamp,Error,Solution,Context,Resolved');
337
+ data.errors.forEach((entry) => {
338
+ csvLines.push(`${entry.id},${entry.timestamp},"${entry.error}","${entry.solution}","${entry.context}",${entry.resolved}`);
339
+ });
340
+ csvLines.push('');
341
+ csvLines.push('STYLING HISTORY');
342
+ csvLines.push('ID,Timestamp,Element,Location,Component,Styles');
343
+ data.styling.forEach((entry) => {
344
+ csvLines.push(`${entry.id},${entry.timestamp},${entry.element},${entry.location},${entry.component || ''},"${JSON.stringify(entry.styles)}"`);
345
+ });
346
+ return csvLines.join('\n');
347
+ }
348
+ async clearHistory(type) {
349
+ return this.lock.withWriteLock(async () => {
350
+ if (type === 'context' || !type) {
351
+ this.currentContext = [];
352
+ }
353
+ if (type === 'errors' || !type) {
354
+ this.errors = [];
355
+ }
356
+ if (type === 'styling' || !type) {
357
+ this.styling = [];
358
+ }
359
+ await this.saveData();
360
+ });
361
+ }
362
+ async getStatistics() {
363
+ return this.lock.withReadLock(() => {
364
+ return {
365
+ totalContextEntries: this.currentContext.length,
366
+ activeContexts: this.currentContext.filter(ctx => ctx.status === 'active').length,
367
+ totalErrors: this.errors.length,
368
+ totalStylingEntries: this.styling.length,
369
+ uniqueFiles: [...new Set(this.currentContext.flatMap(ctx => ctx.files))].length,
370
+ uniqueElements: [...new Set(this.styling.map(s => s.element))].length
371
+ };
372
+ });
373
+ }
374
+ }
375
+ //# sourceMappingURL=context-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-tracker.js","sourceRoot":"","sources":["../src/context-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { ContextTracker } from './context-tracker.js';
2
+ export declare class DocumentationGenerator {
3
+ private contextTracker;
4
+ constructor(contextTracker: ContextTracker);
5
+ generate(type: 'features' | 'errors' | 'styling' | 'complete', format?: 'markdown' | 'json'): Promise<string>;
6
+ private generateFeaturesDocumentation;
7
+ private generateErrorsDocumentation;
8
+ private generateStylingDocumentation;
9
+ private generateCompleteDocumentation;
10
+ private getMostModifiedFiles;
11
+ private getRecentActivity;
12
+ }
13
+ //# sourceMappingURL=documentation-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentation-generator.d.ts","sourceRoot":"","sources":["../src/documentation-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAkBtD,qBAAa,sBAAsB;IACrB,OAAO,CAAC,cAAc;gBAAd,cAAc,EAAE,cAAc;IAE5C,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,EAAE,MAAM,GAAE,UAAU,GAAG,MAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;YAejH,6BAA6B;YA8C7B,2BAA2B;YA0C3B,4BAA4B;YAiE5B,6BAA6B;IAiH3C,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,iBAAiB;CAkB1B"}