prelude-context 1.6.0 → 1.7.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 +63 -4
- package/dist/bin/prelude.js +2 -0
- package/dist/bin/prelude.js.map +1 -1
- package/dist/src/commands/export.d.ts.map +1 -1
- package/dist/src/commands/export.js +5 -3
- package/dist/src/commands/export.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +151 -0
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/validate.d.ts +3 -0
- package/dist/src/commands/validate.d.ts.map +1 -0
- package/dist/src/commands/validate.js +203 -0
- package/dist/src/commands/validate.js.map +1 -0
- package/dist/src/constants.d.ts +1 -1
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +4 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/core/claude-md-parser.d.ts +33 -0
- package/dist/src/core/claude-md-parser.d.ts.map +1 -0
- package/dist/src/core/claude-md-parser.js +410 -0
- package/dist/src/core/claude-md-parser.js.map +1 -0
- package/dist/src/core/exporter.d.ts +2 -1
- package/dist/src/core/exporter.d.ts.map +1 -1
- package/dist/src/core/exporter.js +159 -1
- package/dist/src/core/exporter.js.map +1 -1
- package/dist/src/core/infer.d.ts.map +1 -1
- package/dist/src/core/infer.js +403 -21
- package/dist/src/core/infer.js.map +1 -1
- package/dist/src/core/source-scanner.d.ts.map +1 -1
- package/dist/src/core/source-scanner.js +58 -1
- package/dist/src/core/source-scanner.js.map +1 -1
- package/dist/src/utils/fs.d.ts.map +1 -1
- package/dist/src/utils/fs.js +2 -1
- package/dist/src/utils/fs.js.map +1 -1
- package/package.json +1 -1
package/dist/src/constants.d.ts
CHANGED
|
@@ -12,5 +12,5 @@ export declare const CONTEXT_FILES: {
|
|
|
12
12
|
readonly WATCHLOG: ".watchlog.json";
|
|
13
13
|
};
|
|
14
14
|
export declare const WATCH_PATTERNS: readonly ["package.json", "package-lock.json", "pnpm-lock.yaml", "yarn.lock", "bun.lockb", "tsconfig.json", "tailwind.config.js", "tailwind.config.ts", ".eslintrc.json", ".eslintrc.js", "eslint.config.js", ".prettierrc", ".prettierrc.json", "prettier.config.js", "src/**/*", "lib/**/*", "app/**/*", "pages/**/*", "components/**/*", "requirements.txt", "pyproject.toml", "Cargo.toml", "go.mod"];
|
|
15
|
-
export declare const IGNORE_PATTERNS: readonly ["**/node_modules/**", "**/.git/**", "**/dist/**", "**/build/**", "**/.next/**", "**/.context/**", "**/*.test.*", "**/*.spec.*", "**/__pycache__/**", "**/*.egg-info/**", "**/.venv/**", "**/venv/**", "**/.mypy_cache/**", "**/.ruff_cache/**", "**/.pytest_cache/**"];
|
|
15
|
+
export declare const IGNORE_PATTERNS: readonly ["**/node_modules/**", "**/.git/**", "**/dist/**", "**/build/**", "**/.next/**", "**/.context/**", "**/*.test.*", "**/*.spec.*", "**/__pycache__/**", "**/*.egg-info/**", "**/.venv/**", "**/venv/**", "**/.mypy_cache/**", "**/.ruff_cache/**", "**/.pytest_cache/**", "**/target/debug/**", "**/target/release/**", "**/vendor/**"];
|
|
16
16
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,aAAa,CAAC;AAEtC,eAAO,MAAM,aAAa;;;;;;;;;;;CAWhB,CAAC;AAEX,eAAO,MAAM,cAAc,2YAwBjB,CAAC;AAEX,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,aAAa,CAAC;AAEtC,eAAO,MAAM,aAAa;;;;;;;;;;;CAWhB,CAAC;AAEX,eAAO,MAAM,cAAc,2YAwBjB,CAAC;AAEX,eAAO,MAAM,eAAe,gVAmBlB,CAAC"}
|
package/dist/src/constants.js
CHANGED
|
@@ -51,6 +51,9 @@ export const IGNORE_PATTERNS = [
|
|
|
51
51
|
'**/venv/**',
|
|
52
52
|
'**/.mypy_cache/**',
|
|
53
53
|
'**/.ruff_cache/**',
|
|
54
|
-
'**/.pytest_cache/**'
|
|
54
|
+
'**/.pytest_cache/**',
|
|
55
|
+
'**/target/debug/**',
|
|
56
|
+
'**/target/release/**',
|
|
57
|
+
'**/vendor/**'
|
|
55
58
|
];
|
|
56
59
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,YAAY;IACnB,YAAY,EAAE,mBAAmB;IACjC,WAAW,EAAE,kBAAkB;IAC/B,SAAS,EAAE,gBAAgB;IAC3B,OAAO,EAAE,cAAc;IACvB,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,gBAAgB;CAClB,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc;IACd,mBAAmB;IACnB,gBAAgB;IAChB,WAAW;IACX,WAAW;IACX,eAAe;IACf,oBAAoB;IACpB,oBAAoB;IACpB,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,oBAAoB;IACpB,UAAU;IACV,UAAU;IACV,UAAU;IACV,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,gBAAgB;IAChB,YAAY;IACZ,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,oBAAoB;IACpB,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,aAAa;IACb,aAAa;IACb,mBAAmB;IACnB,kBAAkB;IAClB,aAAa;IACb,YAAY;IACZ,mBAAmB;IACnB,mBAAmB;IACnB,qBAAqB;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,YAAY;IACnB,YAAY,EAAE,mBAAmB;IACjC,WAAW,EAAE,kBAAkB;IAC/B,SAAS,EAAE,gBAAgB;IAC3B,OAAO,EAAE,cAAc;IACvB,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,gBAAgB;CAClB,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc;IACd,mBAAmB;IACnB,gBAAgB;IAChB,WAAW;IACX,WAAW;IACX,eAAe;IACf,oBAAoB;IACpB,oBAAoB;IACpB,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,oBAAoB;IACpB,UAAU;IACV,UAAU;IACV,UAAU;IACV,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,gBAAgB;IAChB,YAAY;IACZ,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,oBAAoB;IACpB,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,aAAa;IACb,aAAa;IACb,mBAAmB;IACnB,kBAAkB;IAClB,aAAa;IACb,YAAY;IACZ,mBAAmB;IACnB,mBAAmB;IACnB,qBAAqB;IACrB,oBAAoB;IACpB,sBAAsB;IACtB,cAAc;CACN,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface ClaudeMdData {
|
|
2
|
+
projectName?: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
commands?: {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
}[];
|
|
8
|
+
architecture?: {
|
|
9
|
+
type?: string;
|
|
10
|
+
patterns?: string[];
|
|
11
|
+
directories?: {
|
|
12
|
+
path: string;
|
|
13
|
+
purpose?: string;
|
|
14
|
+
}[];
|
|
15
|
+
};
|
|
16
|
+
constraints?: {
|
|
17
|
+
mustUse?: string[];
|
|
18
|
+
mustNotUse?: string[];
|
|
19
|
+
};
|
|
20
|
+
conventions?: string[];
|
|
21
|
+
stack?: {
|
|
22
|
+
language?: string;
|
|
23
|
+
frameworks?: string[];
|
|
24
|
+
database?: string;
|
|
25
|
+
testing?: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse a CLAUDE.md file and extract structured data.
|
|
30
|
+
* Best-effort — never throws on malformed input.
|
|
31
|
+
*/
|
|
32
|
+
export declare function parseClaudeMd(filePath: string): Promise<ClaudeMdData>;
|
|
33
|
+
//# sourceMappingURL=claude-md-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-md-parser.d.ts","sourceRoot":"","sources":["../../../src/core/claude-md-parser.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnD,YAAY,CAAC,EAAE;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,WAAW,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACpD,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAQD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA8F3E"}
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
/**
|
|
3
|
+
* Parse a CLAUDE.md file and extract structured data.
|
|
4
|
+
* Best-effort — never throws on malformed input.
|
|
5
|
+
*/
|
|
6
|
+
export async function parseClaudeMd(filePath) {
|
|
7
|
+
let content;
|
|
8
|
+
try {
|
|
9
|
+
content = await readFile(filePath, 'utf-8');
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
const sections = splitSections(content);
|
|
15
|
+
const data = {};
|
|
16
|
+
// Extract project name from first heading
|
|
17
|
+
const firstH1 = sections.find(s => s.level === 1);
|
|
18
|
+
if (firstH1) {
|
|
19
|
+
data.projectName = cleanProjectName(firstH1.heading);
|
|
20
|
+
// Description is the first paragraph after the first heading
|
|
21
|
+
const desc = extractFirstParagraph(firstH1.body);
|
|
22
|
+
if (desc) {
|
|
23
|
+
data.description = desc;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// If no H1, try the first H2
|
|
27
|
+
if (!data.projectName) {
|
|
28
|
+
const firstH2 = sections.find(s => s.level === 2);
|
|
29
|
+
if (firstH2) {
|
|
30
|
+
// Check if there's text before first section that describes the project
|
|
31
|
+
const preamble = content.split(/^#{1,2}\s/m)[0].trim();
|
|
32
|
+
if (preamble) {
|
|
33
|
+
data.description = extractFirstParagraph(preamble);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// If no description yet, look for sections with descriptive headings
|
|
38
|
+
if (!data.description) {
|
|
39
|
+
const descSection = findSection(sections, ['what is', 'about', 'overview', 'identity', 'description']);
|
|
40
|
+
if (descSection) {
|
|
41
|
+
const desc = extractFirstParagraph(descSection.body);
|
|
42
|
+
if (desc)
|
|
43
|
+
data.description = desc;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Extract commands
|
|
47
|
+
const cmdSection = findSection(sections, ['commands', 'scripts', 'usage', 'cli commands', 'cli']);
|
|
48
|
+
if (cmdSection) {
|
|
49
|
+
data.commands = extractCommands(cmdSection.body);
|
|
50
|
+
}
|
|
51
|
+
// Extract architecture
|
|
52
|
+
const archSection = findSection(sections, ['architecture', 'structure', 'project structure', 'file structure', 'directory structure']);
|
|
53
|
+
if (archSection) {
|
|
54
|
+
data.architecture = extractArchitecture(archSection.body);
|
|
55
|
+
}
|
|
56
|
+
// If no architecture section, try to extract directory info from any code block with paths
|
|
57
|
+
if (!data.architecture?.directories?.length) {
|
|
58
|
+
for (const section of sections) {
|
|
59
|
+
const dirs = extractDirectoryList(section.body);
|
|
60
|
+
if (dirs.length > 0) {
|
|
61
|
+
if (!data.architecture)
|
|
62
|
+
data.architecture = {};
|
|
63
|
+
data.architecture.directories = dirs;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Extract constraints and conventions
|
|
69
|
+
const constraintSection = findSection(sections, ['rules', 'constraints', 'important', 'critical rules', 'things to be careful about']);
|
|
70
|
+
const conventionSection = findSection(sections, ['conventions', 'style', 'code style', 'coding standards']);
|
|
71
|
+
if (constraintSection) {
|
|
72
|
+
data.constraints = extractConstraints(constraintSection.body);
|
|
73
|
+
// Also pull conventions from constraint sections
|
|
74
|
+
const convs = extractConventions(constraintSection.body);
|
|
75
|
+
if (convs.length > 0) {
|
|
76
|
+
data.conventions = convs;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (conventionSection) {
|
|
80
|
+
const convs = extractConventions(conventionSection.body);
|
|
81
|
+
if (convs.length > 0) {
|
|
82
|
+
data.conventions = [...(data.conventions || []), ...convs];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Extract stack info from various sections
|
|
86
|
+
data.stack = extractStackInfo(content, sections);
|
|
87
|
+
if (data.stack && !data.stack.language && !data.stack.frameworks?.length && !data.stack.database && !data.stack.testing) {
|
|
88
|
+
delete data.stack;
|
|
89
|
+
}
|
|
90
|
+
return data;
|
|
91
|
+
}
|
|
92
|
+
function splitSections(content) {
|
|
93
|
+
const sections = [];
|
|
94
|
+
const lines = content.split('\n');
|
|
95
|
+
let currentHeading = '';
|
|
96
|
+
let currentLevel = 0;
|
|
97
|
+
let bodyLines = [];
|
|
98
|
+
for (const line of lines) {
|
|
99
|
+
const headingMatch = line.match(/^(#{1,6})\s+(.+)$/);
|
|
100
|
+
if (headingMatch) {
|
|
101
|
+
// Save previous section
|
|
102
|
+
if (currentHeading || bodyLines.length > 0) {
|
|
103
|
+
sections.push({
|
|
104
|
+
heading: currentHeading,
|
|
105
|
+
level: currentLevel,
|
|
106
|
+
body: bodyLines.join('\n').trim()
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
currentLevel = headingMatch[1].length;
|
|
110
|
+
currentHeading = headingMatch[2].trim();
|
|
111
|
+
bodyLines = [];
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
bodyLines.push(line);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Save last section
|
|
118
|
+
if (currentHeading || bodyLines.length > 0) {
|
|
119
|
+
sections.push({
|
|
120
|
+
heading: currentHeading,
|
|
121
|
+
level: currentLevel,
|
|
122
|
+
body: bodyLines.join('\n').trim()
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return sections;
|
|
126
|
+
}
|
|
127
|
+
function findSection(sections, keywords) {
|
|
128
|
+
return sections.find(s => {
|
|
129
|
+
const lower = s.heading.toLowerCase();
|
|
130
|
+
return keywords.some(kw => lower.includes(kw));
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function cleanProjectName(heading) {
|
|
134
|
+
// Remove common prefixes/suffixes like "CLAUDE.md —", "# ", version info
|
|
135
|
+
let name = heading
|
|
136
|
+
.replace(/^CLAUDE\.md\s*[—–-]\s*/i, '')
|
|
137
|
+
.replace(/\s*v\d+\.\d+(\.\d+)?$/i, '')
|
|
138
|
+
.replace(/\s*[—–-]\s*.*$/, '') // Remove everything after em-dash
|
|
139
|
+
.trim();
|
|
140
|
+
// If the heading is just "CLAUDE.md", skip it
|
|
141
|
+
if (/^CLAUDE\.md$/i.test(name)) {
|
|
142
|
+
return '';
|
|
143
|
+
}
|
|
144
|
+
return name;
|
|
145
|
+
}
|
|
146
|
+
function extractFirstParagraph(text) {
|
|
147
|
+
const lines = text.split('\n');
|
|
148
|
+
const paragraphLines = [];
|
|
149
|
+
for (const line of lines) {
|
|
150
|
+
const trimmed = line.trim();
|
|
151
|
+
// Skip empty lines at the start
|
|
152
|
+
if (paragraphLines.length === 0 && !trimmed)
|
|
153
|
+
continue;
|
|
154
|
+
// Skip headings, code fences, lists at the start
|
|
155
|
+
if (paragraphLines.length === 0 && (trimmed.startsWith('#') || trimmed.startsWith('```') || trimmed.startsWith('- ') || trimmed.startsWith('* ')))
|
|
156
|
+
continue;
|
|
157
|
+
// End paragraph at empty line or heading
|
|
158
|
+
if (trimmed === '' && paragraphLines.length > 0)
|
|
159
|
+
break;
|
|
160
|
+
if (trimmed.startsWith('#'))
|
|
161
|
+
break;
|
|
162
|
+
if (trimmed.startsWith('```'))
|
|
163
|
+
break;
|
|
164
|
+
paragraphLines.push(trimmed);
|
|
165
|
+
}
|
|
166
|
+
const result = paragraphLines.join(' ').trim();
|
|
167
|
+
return result.length > 0 ? result : undefined;
|
|
168
|
+
}
|
|
169
|
+
function extractCommands(body) {
|
|
170
|
+
const commands = [];
|
|
171
|
+
// Match code blocks with shell commands
|
|
172
|
+
const codeBlockRegex = /```(?:bash|sh|shell|zsh)?\n([\s\S]*?)```/g;
|
|
173
|
+
let match;
|
|
174
|
+
while ((match = codeBlockRegex.exec(body)) !== null) {
|
|
175
|
+
const block = match[1];
|
|
176
|
+
for (const line of block.split('\n')) {
|
|
177
|
+
const trimmed = line.trim();
|
|
178
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
179
|
+
continue;
|
|
180
|
+
// Extract command and inline comment
|
|
181
|
+
const commentMatch = trimmed.match(/^(.+?)\s+#\s+(.+)$/);
|
|
182
|
+
if (commentMatch) {
|
|
183
|
+
commands.push({ name: commentMatch[1].trim(), description: commentMatch[2].trim() });
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
commands.push({ name: trimmed, description: '' });
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Also check for table-style commands: | command | description |
|
|
191
|
+
const tableRows = body.match(/\|\s*`([^`]+)`\s*\|\s*([^|]+)\|/g);
|
|
192
|
+
if (tableRows) {
|
|
193
|
+
for (const row of tableRows) {
|
|
194
|
+
const cells = row.match(/\|\s*`([^`]+)`\s*\|\s*([^|]+)\|/);
|
|
195
|
+
if (cells) {
|
|
196
|
+
commands.push({ name: cells[1].trim(), description: cells[2].trim() });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Check for list-style: - `command` — description
|
|
201
|
+
const listRegex = /^[-*]\s+`([^`]+)`\s*[—–-]\s*(.+)$/gm;
|
|
202
|
+
while ((match = listRegex.exec(body)) !== null) {
|
|
203
|
+
commands.push({ name: match[1].trim(), description: match[2].trim() });
|
|
204
|
+
}
|
|
205
|
+
return commands;
|
|
206
|
+
}
|
|
207
|
+
function extractArchitecture(body) {
|
|
208
|
+
const arch = {};
|
|
209
|
+
// Detect architecture type from keywords
|
|
210
|
+
const lower = body.toLowerCase();
|
|
211
|
+
if (lower.includes('monorepo'))
|
|
212
|
+
arch.type = 'monorepo';
|
|
213
|
+
else if (lower.includes('microservice'))
|
|
214
|
+
arch.type = 'microservices';
|
|
215
|
+
else if (lower.includes('monolith'))
|
|
216
|
+
arch.type = 'monolith';
|
|
217
|
+
else if (lower.includes('cli') && lower.includes('tool'))
|
|
218
|
+
arch.type = 'cli';
|
|
219
|
+
else if (lower.includes('library') || lower.includes('sdk'))
|
|
220
|
+
arch.type = 'library';
|
|
221
|
+
else if (lower.includes('fullstack') || lower.includes('full-stack'))
|
|
222
|
+
arch.type = 'fullstack';
|
|
223
|
+
else if (lower.includes('backend') && lower.includes('frontend'))
|
|
224
|
+
arch.type = 'fullstack';
|
|
225
|
+
else if (lower.includes('api') && !lower.includes('frontend'))
|
|
226
|
+
arch.type = 'backend';
|
|
227
|
+
// Extract patterns
|
|
228
|
+
const patterns = [];
|
|
229
|
+
const patternKeywords = [
|
|
230
|
+
'mvc', 'mvvm', 'event-driven', 'event driven', 'cqrs', 'pub/sub', 'pubsub',
|
|
231
|
+
'repository pattern', 'factory pattern', 'singleton', 'observer',
|
|
232
|
+
'pipe and filter', 'pipeline', 'layered', 'hexagonal', 'clean architecture',
|
|
233
|
+
'domain-driven', 'ddd', 'serverless', 'microkernel'
|
|
234
|
+
];
|
|
235
|
+
for (const kw of patternKeywords) {
|
|
236
|
+
if (lower.includes(kw)) {
|
|
237
|
+
patterns.push(kw);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (patterns.length > 0)
|
|
241
|
+
arch.patterns = patterns;
|
|
242
|
+
// Extract directories
|
|
243
|
+
const dirs = extractDirectoryList(body);
|
|
244
|
+
if (dirs.length > 0)
|
|
245
|
+
arch.directories = dirs;
|
|
246
|
+
return arch;
|
|
247
|
+
}
|
|
248
|
+
function extractDirectoryList(body) {
|
|
249
|
+
const dirs = [];
|
|
250
|
+
// Code block with directory tree (path followed by description)
|
|
251
|
+
const codeBlockRegex = /```[^\n]*\n([\s\S]*?)```/g;
|
|
252
|
+
let match;
|
|
253
|
+
while ((match = codeBlockRegex.exec(body)) !== null) {
|
|
254
|
+
const block = match[1];
|
|
255
|
+
for (const line of block.split('\n')) {
|
|
256
|
+
const trimmed = line.trim();
|
|
257
|
+
// Match lines like: src/core/ Business logic
|
|
258
|
+
// or: src/core/ — Business logic
|
|
259
|
+
const dirMatch = trimmed.match(/^(\S+\/\S*)\s+[—–-]?\s*(.+)$/);
|
|
260
|
+
if (dirMatch && !dirMatch[1].startsWith('#') && !dirMatch[1].startsWith('$')) {
|
|
261
|
+
dirs.push({ path: dirMatch[1], purpose: dirMatch[2].trim() });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Markdown list with paths: - `src/core/` — Business logic
|
|
266
|
+
// or: - src/core/ — Business logic
|
|
267
|
+
const listRegex = /^[-*]\s+`?([^\s`]+\/[^\s`]*)`?\s*[—–-]+\s*(.+)$/gm;
|
|
268
|
+
while ((match = listRegex.exec(body)) !== null) {
|
|
269
|
+
// Avoid duplicates
|
|
270
|
+
const path = match[1];
|
|
271
|
+
if (!dirs.some(d => d.path === path)) {
|
|
272
|
+
dirs.push({ path, purpose: match[2].trim() });
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return dirs;
|
|
276
|
+
}
|
|
277
|
+
function extractConstraints(body) {
|
|
278
|
+
const mustUse = [];
|
|
279
|
+
const mustNotUse = [];
|
|
280
|
+
const lines = body.split('\n');
|
|
281
|
+
for (const line of lines) {
|
|
282
|
+
const lower = line.toLowerCase();
|
|
283
|
+
const trimmed = line.replace(/^[-*\d.)\s]+/, '').replace(/\*\*/g, '').trim();
|
|
284
|
+
if (!trimmed)
|
|
285
|
+
continue;
|
|
286
|
+
// "must use", "always use", "required"
|
|
287
|
+
if (lower.includes('must use') || lower.includes('always use') || lower.includes('required:')) {
|
|
288
|
+
mustUse.push(trimmed);
|
|
289
|
+
}
|
|
290
|
+
// "must not", "never", "do not", "don't", "avoid"
|
|
291
|
+
else if (lower.includes('must not') || lower.includes('never ') || lower.includes('do not ') ||
|
|
292
|
+
lower.includes("don't") || lower.includes('avoid ') || lower.includes('no ') && lower.includes('use')) {
|
|
293
|
+
mustNotUse.push(trimmed);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
const result = {};
|
|
297
|
+
if (mustUse.length > 0)
|
|
298
|
+
result.mustUse = mustUse;
|
|
299
|
+
if (mustNotUse.length > 0)
|
|
300
|
+
result.mustNotUse = mustNotUse;
|
|
301
|
+
return Object.keys(result).length > 0 ? result : undefined;
|
|
302
|
+
}
|
|
303
|
+
function extractConventions(body) {
|
|
304
|
+
const conventions = [];
|
|
305
|
+
// Extract bullet points as conventions
|
|
306
|
+
const listRegex = /^[-*]\s+\*?\*?(.+?)\*?\*?\s*$/gm;
|
|
307
|
+
let match;
|
|
308
|
+
while ((match = listRegex.exec(body)) !== null) {
|
|
309
|
+
const item = match[1].replace(/\*\*/g, '').trim();
|
|
310
|
+
if (item.length > 10 && item.length < 200) {
|
|
311
|
+
conventions.push(item);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Extract numbered list items
|
|
315
|
+
const numberedRegex = /^\d+\.\s+\*?\*?(.+?)\*?\*?\s*$/gm;
|
|
316
|
+
while ((match = numberedRegex.exec(body)) !== null) {
|
|
317
|
+
const item = match[1].replace(/\*\*/g, '').trim();
|
|
318
|
+
if (item.length > 10 && item.length < 200) {
|
|
319
|
+
conventions.push(item);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return conventions;
|
|
323
|
+
}
|
|
324
|
+
function extractStackInfo(content, sections) {
|
|
325
|
+
const stack = {};
|
|
326
|
+
const lower = content.toLowerCase();
|
|
327
|
+
// Detect language
|
|
328
|
+
const languagePatterns = [
|
|
329
|
+
[/\btypescript\b/i, 'TypeScript'],
|
|
330
|
+
[/\bpython\s*3?\b/i, 'Python'],
|
|
331
|
+
[/\brust\b/i, 'Rust'],
|
|
332
|
+
[/\bgo\b(?:lang)?/i, 'Go'],
|
|
333
|
+
[/\bruby\b/i, 'Ruby'],
|
|
334
|
+
[/\bjava\b(?!script)/i, 'Java'],
|
|
335
|
+
[/\bkotlin\b/i, 'Kotlin'],
|
|
336
|
+
[/\bswift\b/i, 'Swift'],
|
|
337
|
+
[/\bc#\b|csharp/i, 'C#'],
|
|
338
|
+
[/\bjavascript\b/i, 'JavaScript'],
|
|
339
|
+
];
|
|
340
|
+
for (const [pattern, lang] of languagePatterns) {
|
|
341
|
+
if (pattern.test(content)) {
|
|
342
|
+
stack.language = lang;
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Detect frameworks
|
|
347
|
+
const frameworks = [];
|
|
348
|
+
const frameworkPatterns = [
|
|
349
|
+
[/\bnext\.?js\b/i, 'Next.js'],
|
|
350
|
+
[/\breact\b/i, 'React'],
|
|
351
|
+
[/\bvue\b/i, 'Vue'],
|
|
352
|
+
[/\bangular\b/i, 'Angular'],
|
|
353
|
+
[/\bsvelte\b/i, 'Svelte'],
|
|
354
|
+
[/\bexpress\b/i, 'Express'],
|
|
355
|
+
[/\bfastapi\b/i, 'FastAPI'],
|
|
356
|
+
[/\bflask\b/i, 'Flask'],
|
|
357
|
+
[/\bdjango\b/i, 'Django'],
|
|
358
|
+
[/\brails\b/i, 'Rails'],
|
|
359
|
+
[/\bspring\b/i, 'Spring'],
|
|
360
|
+
[/\bactix\b/i, 'Actix'],
|
|
361
|
+
[/\brocket\b/i, 'Rocket'],
|
|
362
|
+
[/\bnuxt\b/i, 'Nuxt'],
|
|
363
|
+
[/\bastro\b/i, 'Astro'],
|
|
364
|
+
[/\bremix\b/i, 'Remix'],
|
|
365
|
+
[/\btailwind\b/i, 'Tailwind CSS'],
|
|
366
|
+
];
|
|
367
|
+
for (const [pattern, name] of frameworkPatterns) {
|
|
368
|
+
if (pattern.test(content)) {
|
|
369
|
+
frameworks.push(name);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (frameworks.length > 0)
|
|
373
|
+
stack.frameworks = frameworks;
|
|
374
|
+
// Detect database
|
|
375
|
+
const dbPatterns = [
|
|
376
|
+
[/\bpostgres(?:ql)?\b/i, 'PostgreSQL'],
|
|
377
|
+
[/\bsupabase\b/i, 'Supabase (PostgreSQL)'],
|
|
378
|
+
[/\bmysql\b/i, 'MySQL'],
|
|
379
|
+
[/\bmongodb\b/i, 'MongoDB'],
|
|
380
|
+
[/\bredis\b/i, 'Redis'],
|
|
381
|
+
[/\bsqlite\b/i, 'SQLite'],
|
|
382
|
+
[/\bfirestore\b/i, 'Firestore'],
|
|
383
|
+
[/\bdynamodb\b/i, 'DynamoDB'],
|
|
384
|
+
];
|
|
385
|
+
for (const [pattern, db] of dbPatterns) {
|
|
386
|
+
if (pattern.test(content)) {
|
|
387
|
+
stack.database = db;
|
|
388
|
+
break;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
// Detect testing framework
|
|
392
|
+
const testPatterns = [
|
|
393
|
+
[/\bvitest\b/i, 'Vitest'],
|
|
394
|
+
[/\bjest\b/i, 'Jest'],
|
|
395
|
+
[/\bmocha\b/i, 'Mocha'],
|
|
396
|
+
[/\bpytest\b/i, 'pytest'],
|
|
397
|
+
[/\bunittest\b/i, 'unittest'],
|
|
398
|
+
[/\brspec\b/i, 'RSpec'],
|
|
399
|
+
[/\bcypress\b/i, 'Cypress'],
|
|
400
|
+
[/\bplaywright\b/i, 'Playwright'],
|
|
401
|
+
];
|
|
402
|
+
for (const [pattern, test] of testPatterns) {
|
|
403
|
+
if (pattern.test(content)) {
|
|
404
|
+
stack.testing = test;
|
|
405
|
+
break;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return (stack.language || stack.frameworks?.length || stack.database || stack.testing) ? stack : undefined;
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=claude-md-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-md-parser.js","sourceRoot":"","sources":["../../../src/core/claude-md-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare function exportToMarkdown(rootDir: string): Promise<string>;
|
|
2
2
|
export declare function exportToJSON(rootDir: string): Promise<object>;
|
|
3
|
-
export declare function
|
|
3
|
+
export declare function exportToClaudeMd(rootDir: string): Promise<string>;
|
|
4
|
+
export declare function saveExport(rootDir: string, format?: 'md' | 'json' | 'claude-md' | 'cursorrules'): Promise<string>;
|
|
4
5
|
//# sourceMappingURL=exporter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../../src/core/exporter.ts"],"names":[],"mappings":"AAKA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqOvE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBnE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../../src/core/exporter.ts"],"names":[],"mappings":"AAKA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqOvE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBnE;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkJvE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,aAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB7H"}
|