midas-mcp 5.16.0 → 5.18.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 (51) hide show
  1. package/README.md +4 -4
  2. package/dist/ai.d.ts.map +1 -1
  3. package/dist/ai.js +21 -84
  4. package/dist/ai.js.map +1 -1
  5. package/dist/analyzer.d.ts.map +1 -1
  6. package/dist/analyzer.js +95 -57
  7. package/dist/analyzer.js.map +1 -1
  8. package/dist/cli.js +3 -3
  9. package/dist/cli.js.map +1 -1
  10. package/dist/code-discovery.d.ts +75 -0
  11. package/dist/code-discovery.d.ts.map +1 -0
  12. package/dist/code-discovery.js +606 -0
  13. package/dist/code-discovery.js.map +1 -0
  14. package/dist/docs/CHEATSHEET.md +1 -1
  15. package/dist/docs/CURSORRULES_TEMPLATE.md +2 -2
  16. package/dist/docs/METHODOLOGY.md +1 -1
  17. package/dist/docs/SPEC.md +6 -6
  18. package/dist/docs/USER_RULES.md +2 -2
  19. package/dist/docs/WHY.md +1 -1
  20. package/dist/docs-discovery.d.ts +59 -0
  21. package/dist/docs-discovery.d.ts.map +1 -0
  22. package/dist/docs-discovery.js +361 -0
  23. package/dist/docs-discovery.js.map +1 -0
  24. package/dist/reality.d.ts.map +1 -1
  25. package/dist/reality.js +14 -37
  26. package/dist/reality.js.map +1 -1
  27. package/dist/state/phase.d.ts +5 -4
  28. package/dist/state/phase.d.ts.map +1 -1
  29. package/dist/state/phase.js +18 -18
  30. package/dist/state/phase.js.map +1 -1
  31. package/dist/tools/analyze.js +3 -3
  32. package/dist/tools/analyze.js.map +1 -1
  33. package/dist/tools/grow.js +1 -1
  34. package/dist/tools/grow.js.map +1 -1
  35. package/dist/tools/phase.d.ts +3 -3
  36. package/dist/tools/phase.js +7 -7
  37. package/dist/tools/phase.js.map +1 -1
  38. package/dist/tools/validate.js +2 -2
  39. package/dist/tools/validate.js.map +1 -1
  40. package/dist/tracker.d.ts.map +1 -1
  41. package/dist/tracker.js +25 -14
  42. package/dist/tracker.js.map +1 -1
  43. package/dist/tui.js +3 -3
  44. package/dist/tui.js.map +1 -1
  45. package/docs/CHEATSHEET.md +1 -1
  46. package/docs/CURSORRULES_TEMPLATE.md +2 -2
  47. package/docs/METHODOLOGY.md +1 -1
  48. package/docs/SPEC.md +6 -6
  49. package/docs/USER_RULES.md +2 -2
  50. package/docs/WHY.md +1 -1
  51. package/package.json +1 -1
package/dist/docs/SPEC.md CHANGED
@@ -48,7 +48,7 @@ midas-mcp/
48
48
  ## Phase State Machine
49
49
 
50
50
  ```typescript
51
- type EagleSightStep =
51
+ type PlanStep =
52
52
  | 'IDEA'
53
53
  | 'RESEARCH'
54
54
  | 'BRAINLIFT'
@@ -66,7 +66,7 @@ type BuildStep =
66
66
 
67
67
  type Phase =
68
68
  | { phase: 'IDLE' }
69
- | { phase: 'EAGLE_SIGHT'; step: EagleSightStep }
69
+ | { phase: 'PLAN'; step: PlanStep }
70
70
  | { phase: 'BUILD'; step: BuildStep }
71
71
  | { phase: 'SHIPPED' };
72
72
 
@@ -88,7 +88,7 @@ interface PhaseState {
88
88
 
89
89
  ### midas_start_project
90
90
 
91
- Initializes a new project with Eagle Sight.
91
+ Initializes a new project with Plan.
92
92
 
93
93
  **Input:**
94
94
  ```typescript
@@ -103,7 +103,7 @@ Initializes a new project with Eagle Sight.
103
103
  2. Creates `docs/brainlift.md` with template
104
104
  3. Creates `docs/prd.md` with template
105
105
  4. Creates `docs/gameplan.md` with template
106
- 5. Sets phase to `EAGLE_SIGHT.IDEA`
106
+ 5. Sets phase to `PLAN.IDEA`
107
107
  6. Returns guidance for next step
108
108
 
109
109
  ---
@@ -132,7 +132,7 @@ Manually set the current phase.
132
132
  **Input:**
133
133
  ```typescript
134
134
  {
135
- phase: 'EAGLE_SIGHT' | 'BUILD' | 'SHIPPED';
135
+ phase: 'PLAN' | 'BUILD' | 'SHIPPED';
136
136
  step?: string;
137
137
  }
138
138
  ```
@@ -170,7 +170,7 @@ Audit project against 12 ingredients.
170
170
 
171
171
  ### midas_check_docs
172
172
 
173
- Verify Eagle Sight docs exist and are complete.
173
+ Verify Plan docs exist and are complete.
174
174
 
175
175
  **Input:**
176
176
  ```typescript
@@ -38,10 +38,10 @@ RULES → INDEX → READ → RESEARCH → IMPLEMENT → TEST → DEBUG
38
38
  Always complete earlier steps before jumping to implementation.
39
39
 
40
40
  ## The 4 Phases:
41
- 1. EAGLE_SIGHT: Plan before coding (brainlift, PRD, gameplan)
41
+ 1. PLAN: Plan before coding (brainlift, PRD, gameplan)
42
42
  2. BUILD: The 7-step cycle above
43
43
  3. SHIP: Review, deploy, monitor
44
- 4. GROW: Feedback, analyze, iterate back to EAGLE_SIGHT
44
+ 4. GROW: Feedback, analyze, iterate back to PLAN
45
45
  ```
46
46
 
47
47
  ## How to Add
package/dist/docs/WHY.md CHANGED
@@ -4,7 +4,7 @@ The Golden Code methodology isn't arbitrary. Each phase and step exists because
4
4
 
5
5
  ---
6
6
 
7
- ## PLAN Phase (formerly Eagle Sight)
7
+ ## Plan Phase
8
8
 
9
9
  **Why plan before building?** Because code without context is just syntax. The AI doesn't know your domain, your constraints, or your users. You do.
10
10
 
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Intelligent documentation discovery and classification.
3
+ *
4
+ * Instead of looking for specific filenames (brainlift.md, prd.md, gameplan.md),
5
+ * this module:
6
+ * 1. Discovers ALL documentation files in the project
7
+ * 2. Reads them in full
8
+ * 3. Uses AI to classify which ones fulfill planning requirements
9
+ * 4. Returns structured results with confidence scores
10
+ */
11
+ export type DocCategory = 'brainlift' | 'prd' | 'gameplan' | 'readme' | 'other';
12
+ export interface DiscoveredDoc {
13
+ path: string;
14
+ filename: string;
15
+ content: string;
16
+ sizeBytes: number;
17
+ category?: DocCategory;
18
+ confidence?: number;
19
+ summary?: string;
20
+ }
21
+ export interface DocsDiscoveryResult {
22
+ allDocs: DiscoveredDoc[];
23
+ brainlift: DiscoveredDoc | null;
24
+ prd: DiscoveredDoc | null;
25
+ gameplan: DiscoveredDoc | null;
26
+ readme: DiscoveredDoc | null;
27
+ hasPlanningDocs: boolean;
28
+ hasAllPlanningDocs: boolean;
29
+ totalDocsFound: number;
30
+ totalBytesRead: number;
31
+ planningStatus: {
32
+ brainlift: 'found' | 'missing';
33
+ prd: 'found' | 'missing';
34
+ gameplan: 'found' | 'missing';
35
+ };
36
+ }
37
+ /**
38
+ * Discover all documentation files in a project
39
+ */
40
+ export declare function discoverDocs(projectPath: string): DiscoveredDoc[];
41
+ /**
42
+ * Use AI to classify which docs fulfill planning requirements
43
+ */
44
+ export declare function classifyDocs(docs: DiscoveredDoc[]): Promise<DocsDiscoveryResult>;
45
+ /**
46
+ * Quick sync check - just discovers docs and uses heuristics
47
+ * For when you don't want to call AI
48
+ */
49
+ export declare function discoverDocsSync(projectPath: string): DocsDiscoveryResult;
50
+ /**
51
+ * Full discovery with AI classification
52
+ */
53
+ export declare function discoverAndClassifyDocs(projectPath: string): Promise<DocsDiscoveryResult>;
54
+ /**
55
+ * Get combined planning context from all discovered docs
56
+ * Use this to feed into analyzer instead of reading specific files
57
+ */
58
+ export declare function getPlanningContext(result: DocsDiscoveryResult): string;
59
+ //# sourceMappingURL=docs-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-discovery.d.ts","sourceRoot":"","sources":["../src/docs-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,aAAa,EAAE,CAAC;IAGzB,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAChC,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAG7B,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IAGvB,cAAc,EAAE;QACd,SAAS,EAAE,OAAO,GAAG,SAAS,CAAC;QAC/B,GAAG,EAAE,OAAO,GAAG,SAAS,CAAC;QACzB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;KAC/B,CAAC;CACH;AA2BD;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,EAAE,CAiFjE;AAsBD;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuCtF;AAoKD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,CAIzE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAG/F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAqBtE"}
@@ -0,0 +1,361 @@
1
+ /**
2
+ * Intelligent documentation discovery and classification.
3
+ *
4
+ * Instead of looking for specific filenames (brainlift.md, prd.md, gameplan.md),
5
+ * this module:
6
+ * 1. Discovers ALL documentation files in the project
7
+ * 2. Reads them in full
8
+ * 3. Uses AI to classify which ones fulfill planning requirements
9
+ * 4. Returns structured results with confidence scores
10
+ */
11
+ import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
12
+ import { join, extname, basename } from 'path';
13
+ import { sanitizePath } from './security.js';
14
+ import { chat } from './providers.js';
15
+ import { logger } from './logger.js';
16
+ // File extensions that are documentation
17
+ const DOC_EXTENSIONS = new Set([
18
+ '.md', '.markdown', '.txt', '.rst', '.adoc', '.asciidoc'
19
+ ]);
20
+ // Patterns that indicate documentation files
21
+ const DOC_PATTERNS = [
22
+ /readme/i, /spec/i, /requirement/i, /prd/i, /design/i, /architecture/i,
23
+ /plan/i, /roadmap/i, /vision/i, /brainlift/i, /gameplan/i, /todo/i,
24
+ /changelog/i, /contributing/i, /guide/i, /overview/i, /summary/i,
25
+ /proposal/i, /rfc/i, /adr/i, /decision/i
26
+ ];
27
+ // Directories to search for docs
28
+ const DOC_DIRECTORIES = ['docs', 'doc', 'documentation', '.', 'design', 'specs', 'rfcs'];
29
+ // Directories to skip
30
+ const SKIP_DIRECTORIES = new Set([
31
+ 'node_modules', '.git', 'dist', 'build', 'coverage', '.next', '.nuxt',
32
+ '__pycache__', '.pytest_cache', 'vendor', 'target', '.midas'
33
+ ]);
34
+ // Max file size to read (1MB)
35
+ const MAX_FILE_SIZE = 1024 * 1024;
36
+ /**
37
+ * Discover all documentation files in a project
38
+ */
39
+ export function discoverDocs(projectPath) {
40
+ const safePath = sanitizePath(projectPath);
41
+ const docs = [];
42
+ function scanDir(dir, depth = 0) {
43
+ if (depth > 3)
44
+ return; // Don't go too deep
45
+ if (!existsSync(dir))
46
+ return;
47
+ try {
48
+ const entries = readdirSync(dir);
49
+ for (const entry of entries) {
50
+ const fullPath = join(dir, entry);
51
+ const relativePath = fullPath.replace(safePath + '/', '');
52
+ try {
53
+ const stat = statSync(fullPath);
54
+ if (stat.isDirectory()) {
55
+ // Check if this is a docs directory or we're still shallow
56
+ const dirName = basename(entry).toLowerCase();
57
+ if (SKIP_DIRECTORIES.has(dirName))
58
+ continue;
59
+ // Prioritize doc directories
60
+ if (DOC_DIRECTORIES.includes(dirName) || depth < 2) {
61
+ scanDir(fullPath, depth + 1);
62
+ }
63
+ }
64
+ else if (stat.isFile()) {
65
+ // Check if this is a documentation file
66
+ const ext = extname(entry).toLowerCase();
67
+ const name = basename(entry).toLowerCase();
68
+ const isDocExtension = DOC_EXTENSIONS.has(ext);
69
+ const isDocPattern = DOC_PATTERNS.some(p => p.test(name));
70
+ // Include if it's a markdown file or matches doc patterns
71
+ if (isDocExtension || isDocPattern) {
72
+ // Skip if too large
73
+ if (stat.size > MAX_FILE_SIZE) {
74
+ logger.debug(`Skipping large doc: ${relativePath} (${stat.size} bytes)`);
75
+ continue;
76
+ }
77
+ try {
78
+ const content = readFileSync(fullPath, 'utf-8');
79
+ docs.push({
80
+ path: relativePath,
81
+ filename: entry,
82
+ content,
83
+ sizeBytes: stat.size,
84
+ });
85
+ }
86
+ catch (readErr) {
87
+ logger.debug(`Could not read ${relativePath}: ${readErr}`);
88
+ }
89
+ }
90
+ }
91
+ }
92
+ catch (statErr) {
93
+ // Skip files we can't stat
94
+ }
95
+ }
96
+ }
97
+ catch (readDirErr) {
98
+ // Skip directories we can't read
99
+ }
100
+ }
101
+ scanDir(safePath);
102
+ // Sort by relevance: docs/ directory first, then by pattern match strength
103
+ docs.sort((a, b) => {
104
+ const aInDocs = a.path.startsWith('docs/') ? 0 : 1;
105
+ const bInDocs = b.path.startsWith('docs/') ? 0 : 1;
106
+ if (aInDocs !== bInDocs)
107
+ return aInDocs - bInDocs;
108
+ // Then by filename relevance
109
+ const aRelevance = getFilenameRelevance(a.filename);
110
+ const bRelevance = getFilenameRelevance(b.filename);
111
+ return bRelevance - aRelevance;
112
+ });
113
+ return docs;
114
+ }
115
+ function getFilenameRelevance(filename) {
116
+ const lower = filename.toLowerCase();
117
+ let score = 0;
118
+ // High-value names
119
+ if (lower.includes('brainlift'))
120
+ score += 10;
121
+ if (lower.includes('prd'))
122
+ score += 10;
123
+ if (lower.includes('gameplan'))
124
+ score += 10;
125
+ if (lower.includes('readme'))
126
+ score += 8;
127
+ if (lower.includes('spec'))
128
+ score += 7;
129
+ if (lower.includes('requirement'))
130
+ score += 7;
131
+ if (lower.includes('design'))
132
+ score += 6;
133
+ if (lower.includes('architecture'))
134
+ score += 6;
135
+ if (lower.includes('plan'))
136
+ score += 5;
137
+ if (lower.includes('roadmap'))
138
+ score += 5;
139
+ if (lower.includes('vision'))
140
+ score += 5;
141
+ return score;
142
+ }
143
+ /**
144
+ * Use AI to classify which docs fulfill planning requirements
145
+ */
146
+ export async function classifyDocs(docs) {
147
+ // If no docs found, return empty result
148
+ if (docs.length === 0) {
149
+ return {
150
+ allDocs: [],
151
+ brainlift: null,
152
+ prd: null,
153
+ gameplan: null,
154
+ readme: null,
155
+ hasPlanningDocs: false,
156
+ hasAllPlanningDocs: false,
157
+ totalDocsFound: 0,
158
+ totalBytesRead: 0,
159
+ planningStatus: {
160
+ brainlift: 'missing',
161
+ prd: 'missing',
162
+ gameplan: 'missing',
163
+ },
164
+ };
165
+ }
166
+ // First, try heuristic classification for obvious cases
167
+ const heuristicResult = classifyByHeuristics(docs);
168
+ // If we found all three with high confidence, skip AI
169
+ if (heuristicResult.brainlift?.confidence === 100 &&
170
+ heuristicResult.prd?.confidence === 100 &&
171
+ heuristicResult.gameplan?.confidence === 100) {
172
+ return buildResult(docs, heuristicResult);
173
+ }
174
+ // Use AI to classify remaining docs
175
+ try {
176
+ const aiResult = await classifyWithAI(docs, heuristicResult);
177
+ return buildResult(docs, aiResult);
178
+ }
179
+ catch (error) {
180
+ logger.error('AI classification failed, using heuristics only', error);
181
+ return buildResult(docs, heuristicResult);
182
+ }
183
+ }
184
+ function classifyByHeuristics(docs) {
185
+ const result = {
186
+ brainlift: null,
187
+ prd: null,
188
+ gameplan: null,
189
+ readme: null,
190
+ };
191
+ for (const doc of docs) {
192
+ const lower = doc.filename.toLowerCase();
193
+ const pathLower = doc.path.toLowerCase();
194
+ // Exact matches get 100% confidence
195
+ if (lower === 'brainlift.md' || pathLower.includes('brainlift')) {
196
+ if (!result.brainlift || doc.confidence === undefined || doc.confidence < 100) {
197
+ doc.category = 'brainlift';
198
+ doc.confidence = 100;
199
+ doc.summary = 'Domain knowledge and unique insights';
200
+ result.brainlift = doc;
201
+ }
202
+ }
203
+ else if (lower === 'prd.md' || lower === 'requirements.md' || lower === 'spec.md') {
204
+ if (!result.prd || (result.prd.confidence ?? 0) < 100) {
205
+ doc.category = 'prd';
206
+ doc.confidence = lower === 'prd.md' ? 100 : 80;
207
+ doc.summary = 'Product requirements and specifications';
208
+ result.prd = doc;
209
+ }
210
+ }
211
+ else if (lower === 'gameplan.md' || lower === 'roadmap.md' || lower === 'plan.md') {
212
+ if (!result.gameplan || (result.gameplan.confidence ?? 0) < 100) {
213
+ doc.category = 'gameplan';
214
+ doc.confidence = lower === 'gameplan.md' ? 100 : 80;
215
+ doc.summary = 'Implementation plan and roadmap';
216
+ result.gameplan = doc;
217
+ }
218
+ }
219
+ else if (lower === 'readme.md' || lower === 'readme') {
220
+ if (!result.readme) {
221
+ doc.category = 'readme';
222
+ doc.confidence = 100;
223
+ doc.summary = 'Project overview';
224
+ result.readme = doc;
225
+ }
226
+ }
227
+ }
228
+ return result;
229
+ }
230
+ async function classifyWithAI(docs, heuristicResult) {
231
+ // Build a summary of each doc for AI classification
232
+ const docSummaries = docs.slice(0, 20).map((doc, i) => {
233
+ // Truncate content for the prompt but keep enough for context
234
+ const preview = doc.content.slice(0, 2000);
235
+ return `[${i}] ${doc.path}\n${preview}${doc.content.length > 2000 ? '\n...(truncated)' : ''}`;
236
+ }).join('\n\n---\n\n');
237
+ const prompt = `Analyze these project documentation files and classify which ones serve as:
238
+
239
+ 1. BRAINLIFT: Domain knowledge, unique insights, "what YOU know that AI doesn't", mental models, key decisions. Think "second brain" - knowledge transfer from human to AI.
240
+
241
+ 2. PRD: Product Requirements Document - goals, non-goals, user stories, specs, success criteria, features, constraints.
242
+
243
+ 3. GAMEPLAN: Implementation plan, roadmap, tech stack decisions, task breakdown, phases, milestones.
244
+
245
+ Files to analyze:
246
+
247
+ ${docSummaries}
248
+
249
+ Respond in JSON:
250
+ {
251
+ "brainlift": { "index": <number or null>, "confidence": <0-100>, "reason": "..." },
252
+ "prd": { "index": <number or null>, "confidence": <0-100>, "reason": "..." },
253
+ "gameplan": { "index": <number or null>, "confidence": <0-100>, "reason": "..." }
254
+ }
255
+
256
+ Rules:
257
+ - A README can partially fulfill PRD if it contains requirements
258
+ - One doc can fulfill multiple categories if it covers all topics
259
+ - Return null index if no doc matches that category
260
+ - Be generous - partial matches are better than missing`;
261
+ const response = await chat(prompt, {
262
+ systemPrompt: 'You are a documentation analyst. Classify docs concisely. Return only valid JSON.',
263
+ maxTokens: 500,
264
+ useThinking: false,
265
+ });
266
+ // Parse response
267
+ let jsonStr = response.content;
268
+ if (jsonStr.includes('```')) {
269
+ const match = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
270
+ if (match)
271
+ jsonStr = match[1];
272
+ }
273
+ const classification = JSON.parse(jsonStr.trim());
274
+ // Build result from AI classification
275
+ const result = { ...heuristicResult };
276
+ if (classification.brainlift?.index !== null && classification.brainlift?.index !== undefined) {
277
+ const doc = docs[classification.brainlift.index];
278
+ if (doc && (!result.brainlift || classification.brainlift.confidence > (result.brainlift.confidence ?? 0))) {
279
+ doc.category = 'brainlift';
280
+ doc.confidence = classification.brainlift.confidence;
281
+ doc.summary = classification.brainlift.reason;
282
+ result.brainlift = doc;
283
+ }
284
+ }
285
+ if (classification.prd?.index !== null && classification.prd?.index !== undefined) {
286
+ const doc = docs[classification.prd.index];
287
+ if (doc && (!result.prd || classification.prd.confidence > (result.prd.confidence ?? 0))) {
288
+ doc.category = 'prd';
289
+ doc.confidence = classification.prd.confidence;
290
+ doc.summary = classification.prd.reason;
291
+ result.prd = doc;
292
+ }
293
+ }
294
+ if (classification.gameplan?.index !== null && classification.gameplan?.index !== undefined) {
295
+ const doc = docs[classification.gameplan.index];
296
+ if (doc && (!result.gameplan || classification.gameplan.confidence > (result.gameplan.confidence ?? 0))) {
297
+ doc.category = 'gameplan';
298
+ doc.confidence = classification.gameplan.confidence;
299
+ doc.summary = classification.gameplan.reason;
300
+ result.gameplan = doc;
301
+ }
302
+ }
303
+ return result;
304
+ }
305
+ function buildResult(docs, classification) {
306
+ const totalBytesRead = docs.reduce((sum, d) => sum + d.sizeBytes, 0);
307
+ return {
308
+ allDocs: docs,
309
+ brainlift: classification.brainlift,
310
+ prd: classification.prd,
311
+ gameplan: classification.gameplan,
312
+ readme: classification.readme,
313
+ hasPlanningDocs: !!(classification.brainlift || classification.prd),
314
+ hasAllPlanningDocs: !!(classification.brainlift && classification.prd && classification.gameplan),
315
+ totalDocsFound: docs.length,
316
+ totalBytesRead,
317
+ planningStatus: {
318
+ brainlift: classification.brainlift ? 'found' : 'missing',
319
+ prd: classification.prd ? 'found' : 'missing',
320
+ gameplan: classification.gameplan ? 'found' : 'missing',
321
+ },
322
+ };
323
+ }
324
+ /**
325
+ * Quick sync check - just discovers docs and uses heuristics
326
+ * For when you don't want to call AI
327
+ */
328
+ export function discoverDocsSync(projectPath) {
329
+ const docs = discoverDocs(projectPath);
330
+ const heuristicResult = classifyByHeuristics(docs);
331
+ return buildResult(docs, heuristicResult);
332
+ }
333
+ /**
334
+ * Full discovery with AI classification
335
+ */
336
+ export async function discoverAndClassifyDocs(projectPath) {
337
+ const docs = discoverDocs(projectPath);
338
+ return classifyDocs(docs);
339
+ }
340
+ /**
341
+ * Get combined planning context from all discovered docs
342
+ * Use this to feed into analyzer instead of reading specific files
343
+ */
344
+ export function getPlanningContext(result) {
345
+ const sections = [];
346
+ if (result.brainlift) {
347
+ sections.push(`## Brainlift (Domain Knowledge)\nSource: ${result.brainlift.path}\n\n${result.brainlift.content}`);
348
+ }
349
+ if (result.prd) {
350
+ sections.push(`## PRD (Requirements)\nSource: ${result.prd.path}\n\n${result.prd.content}`);
351
+ }
352
+ if (result.gameplan) {
353
+ sections.push(`## Gameplan (Implementation Plan)\nSource: ${result.gameplan.path}\n\n${result.gameplan.content}`);
354
+ }
355
+ if (result.readme && !result.brainlift && !result.prd) {
356
+ // Only include README if we don't have brainlift or prd
357
+ sections.push(`## README\nSource: ${result.readme.path}\n\n${result.readme.content}`);
358
+ }
359
+ return sections.join('\n\n---\n\n');
360
+ }
361
+ //# sourceMappingURL=docs-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-discovery.js","sourceRoot":"","sources":["../src/docs-discovery.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reality.d.ts","sourceRoot":"","sources":["../src/reality.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reality.d.ts","sourceRoot":"","sources":["../src/reality.ts"],"names":[],"mappings":"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"}
package/dist/reality.js CHANGED
@@ -8,6 +8,7 @@
8
8
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
9
9
  import { join } from 'path';
10
10
  import { sanitizePath } from './security.js';
11
+ import { discoverDocsSync, getPlanningContext } from './docs-discovery.js';
11
12
  // ============================================================================
12
13
  // PERSISTENCE
13
14
  // ============================================================================
@@ -700,19 +701,13 @@ export function inferProjectProfile(projectPath) {
700
701
  businessModel: 'free',
701
702
  industry: [],
702
703
  };
703
- // Read docs
704
- const brainliftPath = join(safePath, 'docs', 'brainlift.md');
705
- const prdPath = join(safePath, 'docs', 'prd.md');
704
+ // Discover and read all planning docs (intelligent detection)
705
+ const docsResult = discoverDocsSync(safePath);
706
+ let content = getPlanningContext(docsResult).toLowerCase();
707
+ // Also check README if not already included
706
708
  const readmePath = join(safePath, 'README.md');
707
709
  const packagePath = join(safePath, 'package.json');
708
- let content = '';
709
- if (existsSync(brainliftPath)) {
710
- content += readFileSync(brainliftPath, 'utf-8').toLowerCase() + '\n';
711
- }
712
- if (existsSync(prdPath)) {
713
- content += readFileSync(prdPath, 'utf-8').toLowerCase() + '\n';
714
- }
715
- if (existsSync(readmePath)) {
710
+ if (existsSync(readmePath) && !docsResult.readme) {
716
711
  content += readFileSync(readmePath, 'utf-8').toLowerCase() + '\n';
717
712
  }
718
713
  // Package.json analysis
@@ -811,17 +806,10 @@ export function inferProjectProfile(projectPath) {
811
806
  */
812
807
  function fillPromptTemplate(template, profile, projectPath) {
813
808
  const safePath = sanitizePath(projectPath);
814
- // Read docs for context
815
- let brainliftContent = '';
816
- let prdContent = '';
817
- const brainliftPath = join(safePath, 'docs', 'brainlift.md');
818
- const prdPath = join(safePath, 'docs', 'prd.md');
819
- if (existsSync(brainliftPath)) {
820
- brainliftContent = readFileSync(brainliftPath, 'utf-8'); // Read full doc for accurate inference
821
- }
822
- if (existsSync(prdPath)) {
823
- prdContent = readFileSync(prdPath, 'utf-8'); // Read full doc for accurate inference
824
- }
809
+ // Use intelligent docs discovery
810
+ const docsResult = discoverDocsSync(safePath);
811
+ const brainliftContent = docsResult.brainlift?.content || '';
812
+ const prdContent = docsResult.prd?.content || '';
825
813
  // Build replacements
826
814
  const replacements = {
827
815
  '{{dataCollected}}': profile.collectsSensitiveData
@@ -951,21 +939,10 @@ export async function filterChecksWithAI(profile, checks, projectPath) {
951
939
  return { filtered: checks, additions: [], removals: [] };
952
940
  }
953
941
  const safePath = sanitizePath(projectPath);
954
- // Read full docs for context
955
- let docsContent = '';
956
- const brainliftPath = join(safePath, 'docs', 'brainlift.md');
957
- const prdPath = join(safePath, 'docs', 'prd.md');
958
- const readmePath = join(safePath, 'README.md');
959
- if (existsSync(brainliftPath)) {
960
- docsContent += `## Brainlift:\n${readFileSync(brainliftPath, 'utf-8').slice(0, 4000)}\n\n`;
961
- }
962
- if (existsSync(prdPath)) {
963
- docsContent += `## PRD:\n${readFileSync(prdPath, 'utf-8').slice(0, 4000)}\n\n`;
964
- }
965
- if (existsSync(readmePath)) {
966
- docsContent += `## README:\n${readFileSync(readmePath, 'utf-8').slice(0, 2000)}\n`;
967
- }
968
- if (!docsContent) {
942
+ // Use intelligent docs discovery
943
+ const docsResult = discoverDocsSync(safePath);
944
+ const docsContent = getPlanningContext(docsResult);
945
+ if (!docsContent || docsResult.totalDocsFound === 0) {
969
946
  // No docs to analyze - return checks as-is
970
947
  return { filtered: checks, additions: [], removals: [] };
971
948
  }