midas-mcp 5.15.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.
- package/README.md +4 -4
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +21 -84
- package/dist/ai.js.map +1 -1
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +95 -57
- package/dist/analyzer.js.map +1 -1
- package/dist/cli.js +3 -3
- package/dist/cli.js.map +1 -1
- package/dist/code-discovery.d.ts +75 -0
- package/dist/code-discovery.d.ts.map +1 -0
- package/dist/code-discovery.js +606 -0
- package/dist/code-discovery.js.map +1 -0
- package/dist/docs/CHEATSHEET.md +1 -1
- package/dist/docs/CURSORRULES_TEMPLATE.md +2 -2
- package/dist/docs/METHODOLOGY.md +1 -1
- package/dist/docs/SPEC.md +6 -6
- package/dist/docs/USER_RULES.md +2 -2
- package/dist/docs/WHY.md +1 -1
- package/dist/docs-discovery.d.ts +59 -0
- package/dist/docs-discovery.d.ts.map +1 -0
- package/dist/docs-discovery.js +361 -0
- package/dist/docs-discovery.js.map +1 -0
- package/dist/reality.d.ts.map +1 -1
- package/dist/reality.js +14 -37
- package/dist/reality.js.map +1 -1
- package/dist/state/phase.d.ts +5 -4
- package/dist/state/phase.d.ts.map +1 -1
- package/dist/state/phase.js +18 -18
- package/dist/state/phase.js.map +1 -1
- package/dist/tools/analyze.js +3 -3
- package/dist/tools/analyze.js.map +1 -1
- package/dist/tools/grow.js +1 -1
- package/dist/tools/grow.js.map +1 -1
- package/dist/tools/phase.d.ts +3 -3
- package/dist/tools/phase.js +7 -7
- package/dist/tools/phase.js.map +1 -1
- package/dist/tools/validate.js +2 -2
- package/dist/tools/validate.js.map +1 -1
- package/dist/tracker.d.ts.map +1 -1
- package/dist/tracker.js +25 -14
- package/dist/tracker.js.map +1 -1
- package/dist/tui.js +3 -3
- package/dist/tui.js.map +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/CURSORRULES_TEMPLATE.md +2 -2
- package/docs/METHODOLOGY.md +1 -1
- package/docs/SPEC.md +6 -6
- package/docs/USER_RULES.md +2 -2
- package/docs/WHY.md +1 -1
- 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
|
|
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: '
|
|
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
|
|
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 `
|
|
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: '
|
|
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
|
|
173
|
+
Verify Plan docs exist and are complete.
|
|
174
174
|
|
|
175
175
|
**Input:**
|
|
176
176
|
```typescript
|
package/dist/docs/USER_RULES.md
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
-
##
|
|
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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"}
|
package/dist/reality.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reality.d.ts","sourceRoot":"","sources":["../src/reality.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
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
|
-
//
|
|
704
|
-
const
|
|
705
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
const
|
|
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
|
-
//
|
|
955
|
-
|
|
956
|
-
const
|
|
957
|
-
|
|
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
|
}
|