midas-mcp 5.18.0 → 5.41.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 (40) hide show
  1. package/dist/atomic-state.d.ts +81 -0
  2. package/dist/atomic-state.d.ts.map +1 -0
  3. package/dist/atomic-state.js +278 -0
  4. package/dist/atomic-state.js.map +1 -0
  5. package/dist/gameplan-tracker.d.ts +63 -0
  6. package/dist/gameplan-tracker.d.ts.map +1 -0
  7. package/dist/gameplan-tracker.js +330 -0
  8. package/dist/gameplan-tracker.js.map +1 -0
  9. package/dist/reality.d.ts.map +1 -1
  10. package/dist/reality.js +4 -2
  11. package/dist/reality.js.map +1 -1
  12. package/dist/security.d.ts.map +1 -1
  13. package/dist/security.js +22 -2
  14. package/dist/security.js.map +1 -1
  15. package/dist/server.d.ts.map +1 -1
  16. package/dist/server.js +6 -1
  17. package/dist/server.js.map +1 -1
  18. package/dist/state/phase.d.ts +24 -2
  19. package/dist/state/phase.d.ts.map +1 -1
  20. package/dist/state/phase.js +99 -19
  21. package/dist/state/phase.js.map +1 -1
  22. package/dist/tools/gameplan.d.ts +49 -0
  23. package/dist/tools/gameplan.d.ts.map +1 -0
  24. package/dist/tools/gameplan.js +79 -0
  25. package/dist/tools/gameplan.js.map +1 -0
  26. package/dist/tools/grow.js +2 -2
  27. package/dist/tools/grow.js.map +1 -1
  28. package/dist/tools/hotfix.js +2 -2
  29. package/dist/tools/hotfix.js.map +1 -1
  30. package/dist/tools/index.d.ts +1 -0
  31. package/dist/tools/index.d.ts.map +1 -1
  32. package/dist/tools/index.js +2 -0
  33. package/dist/tools/index.js.map +1 -1
  34. package/dist/tools/validate.d.ts.map +1 -1
  35. package/dist/tools/validate.js +2 -2
  36. package/dist/tools/validate.js.map +1 -1
  37. package/dist/tracker.d.ts.map +1 -1
  38. package/dist/tracker.js +44 -6
  39. package/dist/tracker.js.map +1 -1
  40. package/package.json +4 -1
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Atomic State Management
3
+ *
4
+ * Solves race conditions with:
5
+ * 1. Atomic writes (temp file → rename) - prevents corruption
6
+ * 2. Version detection - knows when conflicts occur
7
+ * 3. Smart merge - arrays union, scalars last-write-wins
8
+ * 4. Zero blocking - no locks, no waits, no deadlocks
9
+ *
10
+ * This approach guarantees:
11
+ * - No data corruption (atomic rename is OS-level atomic)
12
+ * - No lost array entries (union merge)
13
+ * - No blocking (optimistic, non-locking)
14
+ * - No deadlocks (nothing to deadlock on)
15
+ */
16
+ export interface VersionedState {
17
+ _version: number;
18
+ _lastModified: string;
19
+ _processId: string;
20
+ [key: string]: unknown;
21
+ }
22
+ export interface MergeStrategy<T> {
23
+ /**
24
+ * Merge two states when a conflict is detected.
25
+ * @param local - The state we're trying to write
26
+ * @param remote - The state currently on disk (written by another process)
27
+ * @returns Merged state
28
+ */
29
+ merge: (local: T, remote: T) => T;
30
+ }
31
+ export interface AtomicWriteResult {
32
+ success: boolean;
33
+ conflictDetected: boolean;
34
+ conflictResolved: boolean;
35
+ finalVersion: number;
36
+ }
37
+ /**
38
+ * Default merge: arrays union by unique key, scalars last-write-wins
39
+ */
40
+ export declare function defaultMerge<T extends VersionedState>(local: T, remote: T, arrayKeys?: string[], uniqueKeyField?: string): T;
41
+ /**
42
+ * Read state from file with version info
43
+ */
44
+ export declare function readStateAtomic<T extends VersionedState>(filePath: string, defaultState: () => T): T;
45
+ /**
46
+ * Write state atomically with conflict detection and merge
47
+ */
48
+ export declare function writeStateAtomic<T extends VersionedState>(filePath: string, state: T, options?: {
49
+ expectedVersion?: number;
50
+ merge?: MergeStrategy<T>;
51
+ arrayKeys?: string[];
52
+ }): Promise<AtomicWriteResult>;
53
+ /**
54
+ * Synchronous atomic write (for compatibility with existing sync APIs)
55
+ * Uses writeFileAtomic.sync under the hood
56
+ */
57
+ export declare function writeStateAtomicSync<T extends VersionedState>(filePath: string, state: T, options?: {
58
+ expectedVersion?: number;
59
+ arrayKeys?: string[];
60
+ }): AtomicWriteResult;
61
+ /**
62
+ * Perform a read-modify-write operation atomically with automatic conflict resolution.
63
+ * This is the recommended API for most use cases.
64
+ */
65
+ export declare function atomicUpdate<T extends VersionedState>(filePath: string, defaultState: () => T, modifier: (state: T) => T, options?: {
66
+ arrayKeys?: string[];
67
+ maxRetries?: number;
68
+ }): Promise<{
69
+ state: T;
70
+ result: AtomicWriteResult;
71
+ }>;
72
+ /**
73
+ * Synchronous version of atomicUpdate
74
+ */
75
+ export declare function atomicUpdateSync<T extends VersionedState>(filePath: string, defaultState: () => T, modifier: (state: T) => T, options?: {
76
+ arrayKeys?: string[];
77
+ }): {
78
+ state: T;
79
+ result: AtomicWriteResult;
80
+ };
81
+ //# sourceMappingURL=atomic-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-state.d.ts","sourceRoot":"","sources":["../src/atomic-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B;;;;;OAKG;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,cAAc,EACnD,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC,EACT,SAAS,GAAE,MAAM,EAAO,EACxB,cAAc,GAAE,MAAa,GAC5B,CAAC,CAoBH;AA8BD;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,cAAc,EACtD,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,CAAC,GACpB,CAAC,CA2BH;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,cAAc,EAC7D,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,EACR,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,GACL,OAAO,CAAC,iBAAiB,CAAC,CA0E5B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,cAAc,EAC3D,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,EACR,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,GACL,iBAAiB,CA4DnB;AAMD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,cAAc,EACzD,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,CAAC,EACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EACzB,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CAChB,GACL,OAAO,CAAC;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAkClD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,cAAc,EACvD,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,CAAC,EACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EACzB,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,GACL;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAezC"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Atomic State Management
3
+ *
4
+ * Solves race conditions with:
5
+ * 1. Atomic writes (temp file → rename) - prevents corruption
6
+ * 2. Version detection - knows when conflicts occur
7
+ * 3. Smart merge - arrays union, scalars last-write-wins
8
+ * 4. Zero blocking - no locks, no waits, no deadlocks
9
+ *
10
+ * This approach guarantees:
11
+ * - No data corruption (atomic rename is OS-level atomic)
12
+ * - No lost array entries (union merge)
13
+ * - No blocking (optimistic, non-locking)
14
+ * - No deadlocks (nothing to deadlock on)
15
+ */
16
+ import { readFileSync, existsSync, mkdirSync } from 'fs';
17
+ import { dirname } from 'path';
18
+ import writeFileAtomic from 'write-file-atomic';
19
+ import { logger } from './logger.js';
20
+ // ============================================================================
21
+ // MERGE STRATEGIES
22
+ // ============================================================================
23
+ /**
24
+ * Default merge: arrays union by unique key, scalars last-write-wins
25
+ */
26
+ export function defaultMerge(local, remote, arrayKeys = [], uniqueKeyField = 'id') {
27
+ const result = { ...remote }; // Start with remote (it's newer on disk)
28
+ for (const key of Object.keys(local)) {
29
+ const localVal = local[key];
30
+ const remoteVal = remote[key];
31
+ if (arrayKeys.includes(key) && Array.isArray(localVal) && Array.isArray(remoteVal)) {
32
+ // Union merge for arrays - never lose entries
33
+ result[key] = unionArrays(localVal, remoteVal, uniqueKeyField);
34
+ }
35
+ else if (key === '_version' || key === '_lastModified' || key === '_processId') {
36
+ // Version fields handled separately
37
+ continue;
38
+ }
39
+ else if (localVal !== undefined) {
40
+ // Scalar: local wins (we're the latest intent)
41
+ result[key] = localVal;
42
+ }
43
+ }
44
+ return result;
45
+ }
46
+ /**
47
+ * Union two arrays, deduplicating by a unique key field
48
+ */
49
+ function unionArrays(arr1, arr2, uniqueKey) {
50
+ const seen = new Map();
51
+ // Add all from arr2 first (older)
52
+ for (const item of arr2) {
53
+ const key = item[uniqueKey] ?? JSON.stringify(item);
54
+ seen.set(key, item);
55
+ }
56
+ // Add/overwrite with arr1 (newer)
57
+ for (const item of arr1) {
58
+ const key = item[uniqueKey] ?? JSON.stringify(item);
59
+ seen.set(key, item);
60
+ }
61
+ return Array.from(seen.values());
62
+ }
63
+ // ============================================================================
64
+ // CORE FUNCTIONS
65
+ // ============================================================================
66
+ // Process ID for conflict detection
67
+ const PROCESS_ID = `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
68
+ /**
69
+ * Read state from file with version info
70
+ */
71
+ export function readStateAtomic(filePath, defaultState) {
72
+ if (!existsSync(filePath)) {
73
+ const state = defaultState();
74
+ state._version = 0;
75
+ state._lastModified = new Date().toISOString();
76
+ state._processId = PROCESS_ID;
77
+ return state;
78
+ }
79
+ try {
80
+ const raw = readFileSync(filePath, 'utf-8');
81
+ if (!raw || raw.trim() === '') {
82
+ return defaultState();
83
+ }
84
+ const parsed = JSON.parse(raw);
85
+ // Validate it has version info
86
+ if (typeof parsed._version !== 'number') {
87
+ parsed._version = 0;
88
+ }
89
+ return parsed;
90
+ }
91
+ catch (error) {
92
+ logger.warn(`Failed to read ${filePath}, using default`, { error });
93
+ return defaultState();
94
+ }
95
+ }
96
+ /**
97
+ * Write state atomically with conflict detection and merge
98
+ */
99
+ export async function writeStateAtomic(filePath, state, options = {}) {
100
+ // Ensure directory exists
101
+ const dir = dirname(filePath);
102
+ if (!existsSync(dir)) {
103
+ mkdirSync(dir, { recursive: true });
104
+ }
105
+ // Read current state on disk
106
+ const currentOnDisk = existsSync(filePath)
107
+ ? (() => {
108
+ try {
109
+ return JSON.parse(readFileSync(filePath, 'utf-8'));
110
+ }
111
+ catch {
112
+ return null;
113
+ }
114
+ })()
115
+ : null;
116
+ let finalState = state;
117
+ let conflictDetected = false;
118
+ let conflictResolved = false;
119
+ // Check for conflict
120
+ if (currentOnDisk && options.expectedVersion !== undefined) {
121
+ const diskVersion = currentOnDisk._version ?? 0;
122
+ if (diskVersion > options.expectedVersion) {
123
+ // Conflict! Another process wrote while we were modifying
124
+ conflictDetected = true;
125
+ if (options.merge) {
126
+ // Use custom merge
127
+ finalState = options.merge.merge(state, currentOnDisk);
128
+ conflictResolved = true;
129
+ }
130
+ else if (options.arrayKeys && options.arrayKeys.length > 0) {
131
+ // Use default merge with array union
132
+ finalState = defaultMerge(state, currentOnDisk, options.arrayKeys);
133
+ conflictResolved = true;
134
+ }
135
+ // Else: last-write-wins (state overwrites disk)
136
+ logger.debug('Conflict detected and resolved', {
137
+ expectedVersion: options.expectedVersion,
138
+ diskVersion,
139
+ resolved: conflictResolved,
140
+ });
141
+ }
142
+ }
143
+ // Increment version
144
+ const newVersion = (currentOnDisk?._version ?? state._version ?? 0) + 1;
145
+ finalState._version = newVersion;
146
+ finalState._lastModified = new Date().toISOString();
147
+ finalState._processId = PROCESS_ID;
148
+ // Atomic write (temp file → rename)
149
+ try {
150
+ await writeFileAtomic(filePath, JSON.stringify(finalState, null, 2));
151
+ return {
152
+ success: true,
153
+ conflictDetected,
154
+ conflictResolved,
155
+ finalVersion: newVersion,
156
+ };
157
+ }
158
+ catch (error) {
159
+ logger.error('Atomic write failed', error);
160
+ return {
161
+ success: false,
162
+ conflictDetected,
163
+ conflictResolved: false,
164
+ finalVersion: state._version ?? 0,
165
+ };
166
+ }
167
+ }
168
+ /**
169
+ * Synchronous atomic write (for compatibility with existing sync APIs)
170
+ * Uses writeFileAtomic.sync under the hood
171
+ */
172
+ export function writeStateAtomicSync(filePath, state, options = {}) {
173
+ // Ensure directory exists
174
+ const dir = dirname(filePath);
175
+ if (!existsSync(dir)) {
176
+ mkdirSync(dir, { recursive: true });
177
+ }
178
+ // Read current state on disk
179
+ let currentOnDisk = null;
180
+ if (existsSync(filePath)) {
181
+ try {
182
+ currentOnDisk = JSON.parse(readFileSync(filePath, 'utf-8'));
183
+ }
184
+ catch {
185
+ currentOnDisk = null;
186
+ }
187
+ }
188
+ let finalState = state;
189
+ let conflictDetected = false;
190
+ let conflictResolved = false;
191
+ // Check for conflict
192
+ if (currentOnDisk && options.expectedVersion !== undefined) {
193
+ const diskVersion = currentOnDisk._version ?? 0;
194
+ if (diskVersion > options.expectedVersion) {
195
+ conflictDetected = true;
196
+ if (options.arrayKeys && options.arrayKeys.length > 0) {
197
+ finalState = defaultMerge(state, currentOnDisk, options.arrayKeys);
198
+ conflictResolved = true;
199
+ }
200
+ }
201
+ }
202
+ // Increment version
203
+ const newVersion = (currentOnDisk?._version ?? state._version ?? 0) + 1;
204
+ finalState._version = newVersion;
205
+ finalState._lastModified = new Date().toISOString();
206
+ finalState._processId = PROCESS_ID;
207
+ // Atomic write
208
+ try {
209
+ writeFileAtomic.sync(filePath, JSON.stringify(finalState, null, 2));
210
+ return {
211
+ success: true,
212
+ conflictDetected,
213
+ conflictResolved,
214
+ finalVersion: newVersion,
215
+ };
216
+ }
217
+ catch (error) {
218
+ logger.error('Atomic write failed', error);
219
+ return {
220
+ success: false,
221
+ conflictDetected,
222
+ conflictResolved: false,
223
+ finalVersion: state._version ?? 0,
224
+ };
225
+ }
226
+ }
227
+ // ============================================================================
228
+ // HIGH-LEVEL API: Read-Modify-Write with Automatic Merge
229
+ // ============================================================================
230
+ /**
231
+ * Perform a read-modify-write operation atomically with automatic conflict resolution.
232
+ * This is the recommended API for most use cases.
233
+ */
234
+ export async function atomicUpdate(filePath, defaultState, modifier, options = {}) {
235
+ const maxRetries = options.maxRetries ?? 3;
236
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
237
+ // Read current state
238
+ const current = readStateAtomic(filePath, defaultState);
239
+ const expectedVersion = current._version;
240
+ // Modify
241
+ const modified = modifier(current);
242
+ // Write with conflict detection
243
+ const result = await writeStateAtomic(filePath, modified, {
244
+ expectedVersion,
245
+ arrayKeys: options.arrayKeys,
246
+ });
247
+ if (result.success) {
248
+ return { state: modified, result };
249
+ }
250
+ // If failed, retry (conflict will be auto-merged)
251
+ if (attempt < maxRetries) {
252
+ logger.debug(`Atomic update retry ${attempt + 1}/${maxRetries}`);
253
+ }
254
+ }
255
+ // Final attempt with force write
256
+ const final = modifier(readStateAtomic(filePath, defaultState));
257
+ const result = await writeStateAtomic(filePath, final, {
258
+ arrayKeys: options.arrayKeys,
259
+ });
260
+ return { state: final, result };
261
+ }
262
+ /**
263
+ * Synchronous version of atomicUpdate
264
+ */
265
+ export function atomicUpdateSync(filePath, defaultState, modifier, options = {}) {
266
+ // Read current state
267
+ const current = readStateAtomic(filePath, defaultState);
268
+ const expectedVersion = current._version;
269
+ // Modify
270
+ const modified = modifier(current);
271
+ // Write with conflict detection
272
+ const result = writeStateAtomicSync(filePath, modified, {
273
+ expectedVersion,
274
+ arrayKeys: options.arrayKeys,
275
+ });
276
+ return { state: modified, result };
277
+ }
278
+ //# sourceMappingURL=atomic-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-state.js","sourceRoot":"","sources":["../src/atomic-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAQ,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AA8BrC,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAQ,EACR,MAAS,EACT,YAAsB,EAAE,EACxB,iBAAyB,IAAI;IAE7B,MAAM,MAAM,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,yCAAyC;IAEhG,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9B,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACnF,8CAA8C;YAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,eAAe,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACjF,oCAAoC;YACpC,SAAS;QACX,CAAC;aAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClC,+CAA+C;YAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,MAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAI,IAAS,EAAE,IAAS,EAAE,SAAiB;IAC7D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAc,CAAC;IAEnC,kCAAkC;IAClC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,GAAG,GAAI,IAAgC,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjF,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,kCAAkC;IAClC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,GAAG,GAAI,IAAgC,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjF,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,oCAAoC;AACpC,MAAM,UAAU,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAE5F;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,YAAqB;IAErB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;QAC7B,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;QACnB,KAAK,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/C,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9B,OAAO,YAAY,EAAE,CAAC;QACxB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;QAEpC,+BAA+B;QAC/B,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,kBAAkB,QAAQ,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,KAAQ,EACR,UAII,EAAE;IAEN,0BAA0B;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,6BAA6B;IAC7B,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC;QACxC,CAAC,CAAC,CAAC,GAAG,EAAE;YACJ,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAM,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,qBAAqB;IACrB,IAAI,aAAa,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC3D,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,IAAI,CAAC,CAAC;QAEhD,IAAI,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;YAC1C,0DAA0D;YAC1D,gBAAgB,GAAG,IAAI,CAAC;YAExB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,mBAAmB;gBACnB,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;gBACvD,gBAAgB,GAAG,IAAI,CAAC;YAC1B,CAAC;iBAAM,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7D,qCAAqC;gBACrC,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,SAAS,CAAM,CAAC;gBACxE,gBAAgB,GAAG,IAAI,CAAC;YAC1B,CAAC;YACD,gDAAgD;YAEhD,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;gBAC7C,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,WAAW;gBACX,QAAQ,EAAE,gBAAgB;aAC3B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,UAAU,GAAG,CAAC,aAAa,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACxE,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC;IACjC,UAAU,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpD,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC;IAEnC,oCAAoC;IACpC,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAErE,OAAO;YACL,OAAO,EAAE,IAAI;YACb,gBAAgB;YAChB,gBAAgB;YAChB,YAAY,EAAE,UAAU;SACzB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO;YACL,OAAO,EAAE,KAAK;YACd,gBAAgB;YAChB,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;SAClC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,KAAQ,EACR,UAGI,EAAE;IAEN,0BAA0B;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,6BAA6B;IAC7B,IAAI,aAAa,GAAa,IAAI,CAAC;IACnC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAM,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,qBAAqB;IACrB,IAAI,aAAa,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC3D,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,IAAI,CAAC,CAAC;QAEhD,IAAI,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;YAC1C,gBAAgB,GAAG,IAAI,CAAC;YAExB,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,SAAS,CAAM,CAAC;gBACxE,gBAAgB,GAAG,IAAI,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,UAAU,GAAG,CAAC,aAAa,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACxE,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC;IACjC,UAAU,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpD,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC;IAEnC,eAAe;IACf,IAAI,CAAC;QACH,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEpE,OAAO;YACL,OAAO,EAAE,IAAI;YACb,gBAAgB;YAChB,gBAAgB;YAChB,YAAY,EAAE,UAAU;SACzB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO;YACL,OAAO,EAAE,KAAK;YACd,gBAAgB;YAChB,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;SAClC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,yDAAyD;AACzD,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,YAAqB,EACrB,QAAyB,EACzB,UAGI,EAAE;IAEN,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;IAE3C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,qBAAqB;QACrB,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;QAEzC,SAAS;QACT,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAEnC,gCAAgC;QAChC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE;YACxD,eAAe;YACf,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACrC,CAAC;QAED,kDAAkD;QAClD,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,uBAAuB,OAAO,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE;QACrD,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,YAAqB,EACrB,QAAyB,EACzB,UAEI,EAAE;IAEN,qBAAqB;IACrB,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAEzC,SAAS;IACT,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEnC,gCAAgC;IAChC,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE;QACtD,eAAe;QACf,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Gameplan Tracker
3
+ *
4
+ * Intelligently tracks progress through the gameplan by:
5
+ * 1. Parsing tasks from gameplan.md (checkbox items)
6
+ * 2. Cross-referencing tasks against actual code
7
+ * 3. Detecting what's done vs what's missing
8
+ * 4. Detecting scope creep (code not in plan)
9
+ */
10
+ export interface GameplanTask {
11
+ id: string;
12
+ text: string;
13
+ completed: boolean;
14
+ phase?: string;
15
+ priority?: 'high' | 'medium' | 'low';
16
+ relatedFiles?: string[];
17
+ confidence: number;
18
+ implementationStatus: 'not_started' | 'partial' | 'complete' | 'unknown';
19
+ }
20
+ export interface GameplanAnalysis {
21
+ totalTasks: number;
22
+ completedTasks: number;
23
+ implementedTasks: number;
24
+ tasks: GameplanTask[];
25
+ documentProgress: number;
26
+ actualProgress: number;
27
+ progressMatch: boolean;
28
+ missingImplementation: GameplanTask[];
29
+ scopeCreep: string[];
30
+ summary: string;
31
+ nextTask?: GameplanTask;
32
+ }
33
+ /**
34
+ * Parse tasks from gameplan content.
35
+ * Supports multiple formats:
36
+ * - [ ] Task description
37
+ * - [x] Completed task
38
+ * - 1. Task description (numbered)
39
+ * - - Task description (bullet)
40
+ */
41
+ export declare function parseGameplanTasks(content: string): GameplanTask[];
42
+ /**
43
+ * Analyze gameplan and cross-reference with codebase
44
+ */
45
+ export declare function analyzeGameplan(projectPath: string): GameplanAnalysis;
46
+ /**
47
+ * Get a simple progress summary
48
+ */
49
+ export declare function getGameplanProgress(projectPath: string): {
50
+ documented: number;
51
+ actual: number;
52
+ discrepancy: boolean;
53
+ nextSuggested?: string;
54
+ };
55
+ /**
56
+ * Check if gameplan tasks align with code
57
+ */
58
+ export declare function validateGameplanProgress(projectPath: string): {
59
+ valid: boolean;
60
+ warnings: string[];
61
+ suggestions: string[];
62
+ };
63
+ //# sourceMappingURL=gameplan-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gameplan-tracker.d.ts","sourceRoot":"","sources":["../src/gameplan-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAGrC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;CAC1E;AAED,MAAM,WAAW,gBAAgB;IAE/B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IAGzB,KAAK,EAAE,YAAY,EAAE,CAAC;IAGtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IAGvB,qBAAqB,EAAE,YAAY,EAAE,CAAC;IACtC,UAAU,EAAE,MAAM,EAAE,CAAC;IAGrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAMD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAqDlE;AAuHD;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAqIrE;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAQA;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG;IAC7D,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAiCA"}