devmind 1.0.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/LICENSE +191 -0
- package/README.md +148 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +232 -0
- package/dist/cli.js.map +1 -0
- package/dist/codebase/generators/architecture.d.ts +4 -0
- package/dist/codebase/generators/architecture.js +33 -0
- package/dist/codebase/generators/architecture.js.map +1 -0
- package/dist/codebase/generators/modules.d.ts +9 -0
- package/dist/codebase/generators/modules.js +46 -0
- package/dist/codebase/generators/modules.js.map +1 -0
- package/dist/codebase/generators/overview.d.ts +5 -0
- package/dist/codebase/generators/overview.js +34 -0
- package/dist/codebase/generators/overview.js.map +1 -0
- package/dist/codebase/generators/skeleton.d.ts +8 -0
- package/dist/codebase/generators/skeleton.js +57 -0
- package/dist/codebase/generators/skeleton.js.map +1 -0
- package/dist/codebase/index.d.ts +24 -0
- package/dist/codebase/index.js +50 -0
- package/dist/codebase/index.js.map +1 -0
- package/dist/codebase/parsers/typescript.d.ts +14 -0
- package/dist/codebase/parsers/typescript.js +145 -0
- package/dist/codebase/parsers/typescript.js.map +1 -0
- package/dist/codebase/scanners/filesystem.d.ts +17 -0
- package/dist/codebase/scanners/filesystem.js +152 -0
- package/dist/codebase/scanners/filesystem.js.map +1 -0
- package/dist/codebase/utils/hashing.d.ts +15 -0
- package/dist/codebase/utils/hashing.js +50 -0
- package/dist/codebase/utils/hashing.js.map +1 -0
- package/dist/codebase/utils/stats.d.ts +12 -0
- package/dist/codebase/utils/stats.js +55 -0
- package/dist/codebase/utils/stats.js.map +1 -0
- package/dist/codebase/utils/tree.d.ts +10 -0
- package/dist/codebase/utils/tree.js +22 -0
- package/dist/codebase/utils/tree.js.map +1 -0
- package/dist/commands/analyze.d.ts +6 -0
- package/dist/commands/analyze.js +97 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/context.d.ts +4 -0
- package/dist/commands/context.js +54 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/core/config.d.ts +20 -0
- package/dist/core/config.js +40 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.d.ts +18 -0
- package/dist/core/errors.js +53 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/fileio.d.ts +10 -0
- package/dist/core/fileio.js +57 -0
- package/dist/core/fileio.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +15 -0
- package/dist/core/logger.js +40 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/types.d.ts +106 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/database/cli.d.ts +7 -0
- package/dist/database/cli.js +132 -0
- package/dist/database/cli.js.map +1 -0
- package/dist/database/commands/checkpoint.d.ts +13 -0
- package/dist/database/commands/checkpoint.js +136 -0
- package/dist/database/commands/checkpoint.js.map +1 -0
- package/dist/database/commands/generate.d.ts +21 -0
- package/dist/database/commands/generate.js +269 -0
- package/dist/database/commands/generate.js.map +1 -0
- package/dist/database/commands/handoff.d.ts +15 -0
- package/dist/database/commands/handoff.js +332 -0
- package/dist/database/commands/handoff.js.map +1 -0
- package/dist/database/commands/history.d.ts +13 -0
- package/dist/database/commands/history.js +148 -0
- package/dist/database/commands/history.js.map +1 -0
- package/dist/database/commands/init.d.ts +10 -0
- package/dist/database/commands/init.js +28 -0
- package/dist/database/commands/init.js.map +1 -0
- package/dist/database/commands/learn.d.ts +12 -0
- package/dist/database/commands/learn.js +93 -0
- package/dist/database/commands/learn.js.map +1 -0
- package/dist/database/commands/memory.d.ts +90 -0
- package/dist/database/commands/memory.js +353 -0
- package/dist/database/commands/memory.js.map +1 -0
- package/dist/database/commands/show.d.ts +9 -0
- package/dist/database/commands/show.js +136 -0
- package/dist/database/commands/show.js.map +1 -0
- package/dist/database/commands/validate.d.ts +9 -0
- package/dist/database/commands/validate.js +200 -0
- package/dist/database/commands/validate.js.map +1 -0
- package/dist/database/commands/watch.d.ts +9 -0
- package/dist/database/commands/watch.js +77 -0
- package/dist/database/commands/watch.js.map +1 -0
- package/dist/database/extractors/drizzle.d.ts +62 -0
- package/dist/database/extractors/drizzle.js +251 -0
- package/dist/database/extractors/drizzle.js.map +1 -0
- package/dist/database/extractors/firebase.d.ts +39 -0
- package/dist/database/extractors/firebase.js +192 -0
- package/dist/database/extractors/firebase.js.map +1 -0
- package/dist/database/extractors/index.d.ts +69 -0
- package/dist/database/extractors/index.js +345 -0
- package/dist/database/extractors/index.js.map +1 -0
- package/dist/database/extractors/mongodb.d.ts +44 -0
- package/dist/database/extractors/mongodb.js +198 -0
- package/dist/database/extractors/mongodb.js.map +1 -0
- package/dist/database/extractors/mysql.d.ts +61 -0
- package/dist/database/extractors/mysql.js +173 -0
- package/dist/database/extractors/mysql.js.map +1 -0
- package/dist/database/extractors/postgres.d.ts +47 -0
- package/dist/database/extractors/postgres.js +141 -0
- package/dist/database/extractors/postgres.js.map +1 -0
- package/dist/database/extractors/prisma.d.ts +71 -0
- package/dist/database/extractors/prisma.js +270 -0
- package/dist/database/extractors/prisma.js.map +1 -0
- package/dist/database/extractors/sqlite.d.ts +50 -0
- package/dist/database/extractors/sqlite.js +148 -0
- package/dist/database/extractors/sqlite.js.map +1 -0
- package/dist/database/generators/learning-generator.d.ts +48 -0
- package/dist/database/generators/learning-generator.js +221 -0
- package/dist/database/generators/learning-generator.js.map +1 -0
- package/dist/database/generators/templates.d.ts +103 -0
- package/dist/database/generators/templates.js +1557 -0
- package/dist/database/generators/templates.js.map +1 -0
- package/dist/database/index.d.ts +15 -0
- package/dist/database/index.js +16 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/utils/json-output.d.ts +26 -0
- package/dist/database/utils/json-output.js +37 -0
- package/dist/database/utils/json-output.js.map +1 -0
- package/dist/generators/unified.d.ts +1 -0
- package/dist/generators/unified.js +173 -0
- package/dist/generators/unified.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/config-detector.d.ts +1 -0
- package/dist/utils/config-detector.js +40 -0
- package/dist/utils/config-detector.js.map +1 -0
- package/dist/utils/config-loader.d.ts +16 -0
- package/dist/utils/config-loader.js +20 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate module documentation
|
|
3
|
+
*/
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { generateSkeleton } from './skeleton.js';
|
|
6
|
+
export function generateModuleDocs(structure, outputDir) {
|
|
7
|
+
const docs = [];
|
|
8
|
+
function processNode(node, currentPath = '') {
|
|
9
|
+
if (node.type === 'directory') {
|
|
10
|
+
const hasFiles = node.children && node.children.some((c) => c.type === 'file');
|
|
11
|
+
if (hasFiles && node.children) {
|
|
12
|
+
const fileContent = node.children
|
|
13
|
+
.filter((c) => c.type === 'file' && c.exports && c.exports.length > 0)
|
|
14
|
+
.map((child) => generateSkeleton(child))
|
|
15
|
+
.join('\n\n');
|
|
16
|
+
if (fileContent) {
|
|
17
|
+
const dirReadme = `# Module: ${node.name}
|
|
18
|
+
|
|
19
|
+
## Contents
|
|
20
|
+
${node.children.map((child) => `- \`${child.name}\``).join('\n')}
|
|
21
|
+
|
|
22
|
+
## Interface (Skeleton View)
|
|
23
|
+
|
|
24
|
+
${fileContent}
|
|
25
|
+
`;
|
|
26
|
+
const relativePath = path.join('03-modules', currentPath, node.name);
|
|
27
|
+
const fullPath = path.join(outputDir, relativePath, 'README.md');
|
|
28
|
+
docs.push({ path: fullPath, content: dirReadme });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (node.children) {
|
|
32
|
+
node.children.forEach((child) => processNode(child, path.join(currentPath, node.name)));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Start processing from children to avoid creating a module doc for the root folder itself if it's just a container
|
|
37
|
+
if (structure.children) {
|
|
38
|
+
structure.children.forEach((child) => {
|
|
39
|
+
if (child.type === 'directory' && !child.name.startsWith('.')) {
|
|
40
|
+
processNode(child, '');
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return docs;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=modules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules.js","sourceRoot":"","sources":["../../../src/codebase/generators/modules.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAQjD,MAAM,UAAU,kBAAkB,CAAC,SAAmB,EAAE,SAAiB;IACvE,MAAM,IAAI,GAAgB,EAAE,CAAC;IAE7B,SAAS,WAAW,CAAC,IAAc,EAAE,cAAsB,EAAE;QAC3D,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YAE/E,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ;qBAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;qBACrE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;qBACvC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAEhB,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,SAAS,GAAG,aAAa,IAAI,CAAC,IAAI;;;EAGhD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;EAI9D,WAAW;CACZ,CAAC;oBAEQ,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;oBACjE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;YAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;IACH,CAAC;IAED,oHAAoH;IACpH,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;QACvB,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACnC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9D,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate project overview documentation
|
|
3
|
+
*/
|
|
4
|
+
import { generateTree } from '../utils/tree.js';
|
|
5
|
+
import { countFilesAndLines } from '../utils/stats.js';
|
|
6
|
+
export function generateOverview(structure, projectRoot) {
|
|
7
|
+
const stats = countFilesAndLines(structure);
|
|
8
|
+
return `# Project Overview
|
|
9
|
+
|
|
10
|
+
## Summary
|
|
11
|
+
- **Root**: ${projectRoot}
|
|
12
|
+
- **Generated**: ${new Date().toISOString()}
|
|
13
|
+
- **Languages**: ${stats.languages.join(', ') || 'Unknown'}
|
|
14
|
+
- **Total Files**: ${stats.files}
|
|
15
|
+
- **Total Directories**: ${stats.dirs}
|
|
16
|
+
- **Estimated Lines**: ${stats.lines}
|
|
17
|
+
|
|
18
|
+
## Project Structure (Tree View)
|
|
19
|
+
|
|
20
|
+
\`\`\`
|
|
21
|
+
${generateTree(structure)}
|
|
22
|
+
\`\`\`
|
|
23
|
+
|
|
24
|
+
## Key Entry Points
|
|
25
|
+
${stats.entryPoints.length > 0 ? stats.entryPoints.map((ep) => `- \`${ep}\``).join('\n') : '_No entry points detected_'}
|
|
26
|
+
|
|
27
|
+
## Technology Stack
|
|
28
|
+
${stats.languages.map((lang) => `- ${lang}`).join('\n')}
|
|
29
|
+
|
|
30
|
+
## Purpose
|
|
31
|
+
_Edit this file to describe your project's purpose and goals._
|
|
32
|
+
`;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview.js","sourceRoot":"","sources":["../../../src/codebase/generators/overview.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,MAAM,UAAU,gBAAgB,CAAC,SAAmB,EAAE,WAAmB;IACvE,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAE5C,OAAO;;;cAGK,WAAW;mBACN,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;mBACxB,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS;qBACrC,KAAK,CAAC,KAAK;2BACL,KAAK,CAAC,IAAI;yBACZ,KAAK,CAAC,KAAK;;;;;EAKlC,YAAY,CAAC,SAAS,CAAC;;;;EAIvB,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,4BAA4B;;;EAGrH,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;CAItD,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a token-efficient "Skeleton" view of code modules
|
|
3
|
+
*/
|
|
4
|
+
import { FileNode } from '../scanners/filesystem.js';
|
|
5
|
+
/**
|
|
6
|
+
* Generate a token-efficient "Skeleton" view of the module
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateSkeleton(node: FileNode): string;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a token-efficient "Skeleton" view of code modules
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Generate a token-efficient "Skeleton" view of the module
|
|
6
|
+
*/
|
|
7
|
+
export function generateSkeleton(node) {
|
|
8
|
+
if (!node.exports || node.exports.length === 0)
|
|
9
|
+
return '';
|
|
10
|
+
const lang = getLangId(node.language || '');
|
|
11
|
+
// Handle legacy string exports or simple string array
|
|
12
|
+
if (typeof node.exports[0] === 'string') {
|
|
13
|
+
const exportsList = node.exports.map((e) => 'export ' + e).join('\n');
|
|
14
|
+
return '```' + lang + '\n// ' + node.name + '\n' + exportsList + '\n```';
|
|
15
|
+
}
|
|
16
|
+
// Handle AST exports (objects)
|
|
17
|
+
const lines = ['// ' + node.name];
|
|
18
|
+
const typedExports = node.exports;
|
|
19
|
+
typedExports.forEach((exp) => {
|
|
20
|
+
if (exp.doc) {
|
|
21
|
+
lines.push('/** ' + exp.doc + ' */');
|
|
22
|
+
}
|
|
23
|
+
if (exp.type === 'function') {
|
|
24
|
+
lines.push('export ' + exp.signature + ';');
|
|
25
|
+
}
|
|
26
|
+
else if (exp.type === 'class') {
|
|
27
|
+
lines.push('export class ' + exp.name + ' {');
|
|
28
|
+
if (exp.methods) {
|
|
29
|
+
exp.methods.forEach((m) => lines.push(' ' + m + ';'));
|
|
30
|
+
}
|
|
31
|
+
lines.push('}');
|
|
32
|
+
}
|
|
33
|
+
else if (exp.type === 'interface') {
|
|
34
|
+
lines.push('export ' + (exp.signature || `interface ${exp.name}`) + ' { ... }');
|
|
35
|
+
}
|
|
36
|
+
else if (exp.type === 'variable') {
|
|
37
|
+
lines.push('export ' + exp.signature + ';');
|
|
38
|
+
}
|
|
39
|
+
else if (exp.type === 'type') {
|
|
40
|
+
lines.push('export ' + (exp.signature || `type ${exp.name}`) + ';');
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return '```' + lang + '\n' + lines.join('\n') + '\n```';
|
|
44
|
+
}
|
|
45
|
+
function getLangId(lang) {
|
|
46
|
+
const map = {
|
|
47
|
+
TypeScript: 'ts',
|
|
48
|
+
'TypeScript React': 'tsx',
|
|
49
|
+
JavaScript: 'js',
|
|
50
|
+
'JavaScript React': 'jsx',
|
|
51
|
+
Python: 'py',
|
|
52
|
+
Go: 'go',
|
|
53
|
+
Rust: 'rs',
|
|
54
|
+
};
|
|
55
|
+
return map[lang] || '';
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton.js","sourceRoot":"","sources":["../../../src/codebase/generators/skeleton.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevMind Codebase Scanner Package
|
|
3
|
+
*/
|
|
4
|
+
export * from './scanners/filesystem.js';
|
|
5
|
+
export * from './parsers/typescript.js';
|
|
6
|
+
export * from './generators/overview.js';
|
|
7
|
+
export * from './generators/architecture.js';
|
|
8
|
+
export * from './generators/modules.js';
|
|
9
|
+
export * from './generators/skeleton.js';
|
|
10
|
+
export * from './utils/tree.js';
|
|
11
|
+
export * from './utils/stats.js';
|
|
12
|
+
export * from './utils/hashing.js';
|
|
13
|
+
export interface ScanResult {
|
|
14
|
+
overview: string;
|
|
15
|
+
architecture: string;
|
|
16
|
+
modules: {
|
|
17
|
+
path: string;
|
|
18
|
+
content: string;
|
|
19
|
+
}[];
|
|
20
|
+
tree: string;
|
|
21
|
+
structure: any;
|
|
22
|
+
}
|
|
23
|
+
export declare function scanCodebase(rootPath: string, outputDir: string): Promise<ScanResult>;
|
|
24
|
+
export declare function saveScanResult(result: ScanResult, outputDir: string): Promise<void>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevMind Codebase Scanner Package
|
|
3
|
+
*/
|
|
4
|
+
export * from './scanners/filesystem.js';
|
|
5
|
+
export * from './parsers/typescript.js';
|
|
6
|
+
export * from './generators/overview.js';
|
|
7
|
+
export * from './generators/architecture.js';
|
|
8
|
+
export * from './generators/modules.js';
|
|
9
|
+
export * from './generators/skeleton.js';
|
|
10
|
+
export * from './utils/tree.js';
|
|
11
|
+
export * from './utils/stats.js';
|
|
12
|
+
export * from './utils/hashing.js';
|
|
13
|
+
import { scanDirectory } from './scanners/filesystem.js';
|
|
14
|
+
import { generateOverview } from './generators/overview.js';
|
|
15
|
+
import { generateArchitecture } from './generators/architecture.js';
|
|
16
|
+
import { generateModuleDocs } from './generators/modules.js';
|
|
17
|
+
import { generateTree } from './utils/tree.js';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
import { logger } from '../core/index.js';
|
|
20
|
+
export async function scanCodebase(rootPath, outputDir) {
|
|
21
|
+
logger.info(`Scanning codebase at: ${rootPath}`);
|
|
22
|
+
const structure = scanDirectory(rootPath);
|
|
23
|
+
logger.info('Generating documentation...');
|
|
24
|
+
const overview = generateOverview(structure, rootPath);
|
|
25
|
+
const architecture = generateArchitecture();
|
|
26
|
+
const modules = generateModuleDocs(structure, outputDir);
|
|
27
|
+
const tree = generateTree(structure);
|
|
28
|
+
return {
|
|
29
|
+
overview,
|
|
30
|
+
architecture,
|
|
31
|
+
modules,
|
|
32
|
+
tree,
|
|
33
|
+
structure,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export async function saveScanResult(result, outputDir) {
|
|
37
|
+
const { ensureDir, writeFileSafe } = await import('../core/index.js');
|
|
38
|
+
// Ensure output directory exists
|
|
39
|
+
await ensureDir(outputDir);
|
|
40
|
+
// Write top-level documentation
|
|
41
|
+
await writeFileSafe(path.join(outputDir, 'codebase-overview.md'), result.overview);
|
|
42
|
+
await writeFileSafe(path.join(outputDir, 'architecture.md'), result.architecture);
|
|
43
|
+
await writeFileSafe(path.join(outputDir, 'tree.md'), result.tree);
|
|
44
|
+
// Write module documentation
|
|
45
|
+
for (const doc of result.modules) {
|
|
46
|
+
await ensureDir(path.dirname(doc.path));
|
|
47
|
+
await writeFileSafe(doc.path, doc.content);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codebase/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAW1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,SAAiB;IACpE,MAAM,CAAC,IAAI,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;IAEjD,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE1C,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAErC,OAAO;QACL,QAAQ;QACR,YAAY;QACZ,OAAO;QACP,IAAI;QACJ,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAkB,EAAE,SAAiB;IACxE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAEtE,iCAAiC;IACjC,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAE3B,gCAAgC;IAChC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnF,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAClF,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAElE,6BAA6B;IAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,MAAM,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript/JavaScript parser utility
|
|
3
|
+
*/
|
|
4
|
+
export interface CodeExport {
|
|
5
|
+
type: 'function' | 'class' | 'interface' | 'type' | 'variable';
|
|
6
|
+
name: string;
|
|
7
|
+
signature?: string;
|
|
8
|
+
doc?: string;
|
|
9
|
+
methods?: string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parse a TypeScript/JavaScript file and extract exported symbols with signatures
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseFile(filePath: string): CodeExport[];
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript/JavaScript parser utility
|
|
3
|
+
*/
|
|
4
|
+
import ts from 'typescript';
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
/**
|
|
7
|
+
* Parse a TypeScript/JavaScript file and extract exported symbols with signatures
|
|
8
|
+
*/
|
|
9
|
+
export function parseFile(filePath) {
|
|
10
|
+
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
11
|
+
const sourceFile = ts.createSourceFile(filePath, fileContent, ts.ScriptTarget.Latest, true);
|
|
12
|
+
const exports = [];
|
|
13
|
+
ts.forEachChild(sourceFile, (node) => {
|
|
14
|
+
if (isExported(node)) {
|
|
15
|
+
const details = extractDetails(node, sourceFile);
|
|
16
|
+
if (details) {
|
|
17
|
+
if (Array.isArray(details)) {
|
|
18
|
+
exports.push(...details);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
exports.push(details);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return exports;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if a node is exported
|
|
30
|
+
*/
|
|
31
|
+
function isExported(node) {
|
|
32
|
+
return ((ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Export) !== 0 ||
|
|
33
|
+
(!!node.parent && node.parent.kind === ts.SyntaxKind.SourceFile));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Extract details from an exported node
|
|
37
|
+
*/
|
|
38
|
+
function extractDetails(node, sourceFile) {
|
|
39
|
+
// printer is not strictly needed if we just use getText() but keeping for compatibility with original logic if strictly needed
|
|
40
|
+
// Original logic used printer for some things but mostly getText.
|
|
41
|
+
switch (node.kind) {
|
|
42
|
+
case ts.SyntaxKind.FunctionDeclaration: {
|
|
43
|
+
const funcNode = node;
|
|
44
|
+
return {
|
|
45
|
+
type: 'function',
|
|
46
|
+
name: funcNode.name?.text || 'default',
|
|
47
|
+
signature: getFunctionSignature(funcNode, sourceFile),
|
|
48
|
+
doc: getJSDoc(funcNode),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
case ts.SyntaxKind.ClassDeclaration: {
|
|
52
|
+
const classNode = node;
|
|
53
|
+
return {
|
|
54
|
+
type: 'class',
|
|
55
|
+
name: classNode.name?.text || 'default',
|
|
56
|
+
methods: getClassMembers(classNode, sourceFile),
|
|
57
|
+
doc: getJSDoc(classNode),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
case ts.SyntaxKind.InterfaceDeclaration: {
|
|
61
|
+
const interfaceNode = node;
|
|
62
|
+
return {
|
|
63
|
+
type: 'interface',
|
|
64
|
+
name: interfaceNode.name.text,
|
|
65
|
+
signature: `interface ${interfaceNode.name.text}`,
|
|
66
|
+
doc: getJSDoc(interfaceNode),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
case ts.SyntaxKind.TypeAliasDeclaration: {
|
|
70
|
+
const typeNode = node;
|
|
71
|
+
return {
|
|
72
|
+
type: 'type',
|
|
73
|
+
name: typeNode.name.text,
|
|
74
|
+
signature: `type ${typeNode.name.text}`,
|
|
75
|
+
doc: getJSDoc(typeNode),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
case ts.SyntaxKind.VariableStatement: {
|
|
79
|
+
const varNode = node;
|
|
80
|
+
const declarations = [];
|
|
81
|
+
varNode.declarationList.declarations.forEach((decl) => {
|
|
82
|
+
if (ts.isIdentifier(decl.name)) {
|
|
83
|
+
declarations.push({
|
|
84
|
+
type: 'variable',
|
|
85
|
+
name: decl.name.getText(sourceFile),
|
|
86
|
+
signature: `const ${decl.name.getText(sourceFile)}`,
|
|
87
|
+
doc: getJSDoc(varNode), // JSDoc is on the statement, not declaration usually
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
return declarations;
|
|
92
|
+
}
|
|
93
|
+
default:
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get clean function signature
|
|
99
|
+
*/
|
|
100
|
+
function getFunctionSignature(node, sourceFile) {
|
|
101
|
+
const params = node.parameters.map((p) => p.getText(sourceFile)).join(', ');
|
|
102
|
+
const returnType = node.type ? `: ${node.type.getText(sourceFile)}` : '';
|
|
103
|
+
const name = node.name?.text || 'default';
|
|
104
|
+
return `function ${name}(${params})${returnType}`;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get public members of a class
|
|
108
|
+
*/
|
|
109
|
+
function getClassMembers(node, sourceFile) {
|
|
110
|
+
const members = [];
|
|
111
|
+
node.members.forEach((member) => {
|
|
112
|
+
// Only public members (default is public)
|
|
113
|
+
const isPrivate = (ts.getCombinedModifierFlags(member) & ts.ModifierFlags.Private) !== 0;
|
|
114
|
+
const isProtected = (ts.getCombinedModifierFlags(member) & ts.ModifierFlags.Protected) !== 0;
|
|
115
|
+
if (!isPrivate && !isProtected) {
|
|
116
|
+
if (member.kind === ts.SyntaxKind.MethodDeclaration ||
|
|
117
|
+
member.kind === ts.SyntaxKind.Constructor) {
|
|
118
|
+
const method = member;
|
|
119
|
+
// Constructor doesn't have a name property in the same way, handle explicitly
|
|
120
|
+
let name = 'constructor';
|
|
121
|
+
if (ts.isMethodDeclaration(method) && method.name) {
|
|
122
|
+
name = method.name.getText(sourceFile);
|
|
123
|
+
}
|
|
124
|
+
const params = method.parameters.map((p) => p.getText(sourceFile)).join(', ');
|
|
125
|
+
const returnType = method.type ? `: ${method.type.getText(sourceFile)}` : '';
|
|
126
|
+
members.push(`${name}(${params})${returnType}`);
|
|
127
|
+
}
|
|
128
|
+
else if (member.kind === ts.SyntaxKind.PropertyDeclaration) {
|
|
129
|
+
members.push(member.getText(sourceFile));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
return members;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Extract JSDoc comments
|
|
137
|
+
*/
|
|
138
|
+
function getJSDoc(node) {
|
|
139
|
+
const jsDoc = node.jsDoc; // jsDoc property exists on JSDocContainer nodes but not base interface
|
|
140
|
+
if (jsDoc && jsDoc.length > 0) {
|
|
141
|
+
return jsDoc[0].comment && typeof jsDoc[0].comment === 'string' ? jsDoc[0].comment : '';
|
|
142
|
+
}
|
|
143
|
+
return '';
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=typescript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/codebase/parsers/typescript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem scanner
|
|
3
|
+
*/
|
|
4
|
+
import { CodeExport } from '../parsers/typescript.js';
|
|
5
|
+
export interface FileNode {
|
|
6
|
+
name: string;
|
|
7
|
+
type: 'file' | 'directory';
|
|
8
|
+
path?: string;
|
|
9
|
+
children?: FileNode[];
|
|
10
|
+
language?: string;
|
|
11
|
+
size?: number;
|
|
12
|
+
exports?: (CodeExport | string)[];
|
|
13
|
+
}
|
|
14
|
+
export declare function detectLanguage(file: string): string;
|
|
15
|
+
export declare function getFileSize(filePath: string): number;
|
|
16
|
+
export declare function scanDirectory(dir: string, depth?: number, maxDepth?: number): FileNode;
|
|
17
|
+
export declare function extractExports(content: string): string[];
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem scanner
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { parseFile } from '../parsers/typescript.js';
|
|
7
|
+
import { logger } from '../../core/index.js';
|
|
8
|
+
const IGNORED_DIRS = [
|
|
9
|
+
'node_modules',
|
|
10
|
+
'.git',
|
|
11
|
+
'dist',
|
|
12
|
+
'build',
|
|
13
|
+
'cohere-scan',
|
|
14
|
+
'__pycache__',
|
|
15
|
+
'.devmind',
|
|
16
|
+
'.ai',
|
|
17
|
+
];
|
|
18
|
+
const IGNORED_FILES = [
|
|
19
|
+
'.DS_Store',
|
|
20
|
+
'.gitignore',
|
|
21
|
+
'package-lock.json',
|
|
22
|
+
'pnpm-lock.yaml',
|
|
23
|
+
'yarn.lock',
|
|
24
|
+
];
|
|
25
|
+
export function detectLanguage(file) {
|
|
26
|
+
const ext = path.extname(file).toLowerCase();
|
|
27
|
+
const langMap = {
|
|
28
|
+
'.ts': 'TypeScript',
|
|
29
|
+
'.tsx': 'TypeScript React',
|
|
30
|
+
'.js': 'JavaScript',
|
|
31
|
+
'.jsx': 'JavaScript React',
|
|
32
|
+
'.py': 'Python',
|
|
33
|
+
'.go': 'Go',
|
|
34
|
+
'.rs': 'Rust',
|
|
35
|
+
'.java': 'Java',
|
|
36
|
+
'.c': 'C',
|
|
37
|
+
'.cpp': 'C++',
|
|
38
|
+
'.cs': 'C#',
|
|
39
|
+
'.rb': 'Ruby',
|
|
40
|
+
'.php': 'PHP',
|
|
41
|
+
'.swift': 'Swift',
|
|
42
|
+
'.vue': 'Vue',
|
|
43
|
+
'.svelte': 'Svelte',
|
|
44
|
+
'.md': 'Markdown',
|
|
45
|
+
'.json': 'JSON',
|
|
46
|
+
'.yaml': 'YAML',
|
|
47
|
+
'.yml': 'YAML',
|
|
48
|
+
};
|
|
49
|
+
return langMap[ext] || 'Unknown';
|
|
50
|
+
}
|
|
51
|
+
export function getFileSize(filePath) {
|
|
52
|
+
try {
|
|
53
|
+
const stats = fs.statSync(filePath);
|
|
54
|
+
return stats.size;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function scanDirectory(dir, depth = 0, maxDepth = 4) {
|
|
61
|
+
if (depth > maxDepth) {
|
|
62
|
+
return { name: path.basename(dir), type: 'directory', children: [] };
|
|
63
|
+
}
|
|
64
|
+
const items = [];
|
|
65
|
+
try {
|
|
66
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
67
|
+
for (const entry of entries) {
|
|
68
|
+
if (IGNORED_DIRS.includes(entry.name))
|
|
69
|
+
continue;
|
|
70
|
+
const fullPath = path.join(dir, entry.name);
|
|
71
|
+
if (entry.isDirectory()) {
|
|
72
|
+
items.push(scanDirectory(fullPath, depth + 1, maxDepth));
|
|
73
|
+
}
|
|
74
|
+
else if (entry.isFile()) {
|
|
75
|
+
if (IGNORED_FILES.includes(entry.name))
|
|
76
|
+
continue;
|
|
77
|
+
const lang = detectLanguage(entry.name);
|
|
78
|
+
let exports = [];
|
|
79
|
+
// Use AST parser for JS/TS
|
|
80
|
+
if (['TypeScript', 'TypeScript React', 'JavaScript', 'JavaScript React'].includes(lang)) {
|
|
81
|
+
try {
|
|
82
|
+
exports = parseFile(fullPath);
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
logger.debug(`Failed to parse ${entry.name}: ${e.message}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else if (lang !== 'Unknown' &&
|
|
89
|
+
lang !== 'JSON' &&
|
|
90
|
+
lang !== 'YAML' &&
|
|
91
|
+
lang !== 'Markdown') {
|
|
92
|
+
try {
|
|
93
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
94
|
+
exports = extractExports(content);
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
// Skip unreadable files
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
items.push({
|
|
101
|
+
name: entry.name,
|
|
102
|
+
type: 'file',
|
|
103
|
+
language: lang,
|
|
104
|
+
size: getFileSize(fullPath),
|
|
105
|
+
exports: exports,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
logger.error(`Error scanning ${dir}: ${e.message}`);
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
name: path.basename(dir),
|
|
115
|
+
type: 'directory',
|
|
116
|
+
path: path.relative(process.cwd(), dir).replace(/\\/g, '/'),
|
|
117
|
+
children: items,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// Simple regex-based export extractor for non-JS/TS files or fallback
|
|
121
|
+
export function extractExports(content) {
|
|
122
|
+
const exports = [];
|
|
123
|
+
const lines = content.split('\n');
|
|
124
|
+
// Simple regex patterns for common languages
|
|
125
|
+
const patterns = [
|
|
126
|
+
/export\s+(?:const|function|class|interface|type)\s+(\w+)/g,
|
|
127
|
+
/export\s+\{\s*([^}]+)\s*\}/g,
|
|
128
|
+
/export\s+default\s+(?:function|class)?\s*(\w+)/g,
|
|
129
|
+
// Add patterns for Python, Go, etc. if needed later
|
|
130
|
+
/def\s+(\w+)/g, // Python function
|
|
131
|
+
/class\s+(\w+)/g, // Python/Ruby class
|
|
132
|
+
];
|
|
133
|
+
for (const line of lines) {
|
|
134
|
+
for (const pattern of patterns) {
|
|
135
|
+
const matches = line.matchAll(pattern);
|
|
136
|
+
for (const match of matches) {
|
|
137
|
+
if (match[1]) {
|
|
138
|
+
// Handle comma-separated exports in { }
|
|
139
|
+
if (match[0].includes('{')) {
|
|
140
|
+
const names = match[1].split(',').map((n) => n.trim());
|
|
141
|
+
exports.push(...names);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
exports.push(match[1]);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return [...new Set(exports)].slice(0, 10);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../src/codebase/scanners/filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codebase Hashing Utilities
|
|
3
|
+
*/
|
|
4
|
+
import { FileNode } from '../scanners/filesystem.js';
|
|
5
|
+
/**
|
|
6
|
+
* Calculate a hash of the codebase structure and content (proxied by exports/size)
|
|
7
|
+
*/
|
|
8
|
+
export declare function calculateCodebaseHash(node: FileNode): string;
|
|
9
|
+
/**
|
|
10
|
+
* Get codebase statistics
|
|
11
|
+
*/
|
|
12
|
+
export declare function getCodebaseStats(node: FileNode): {
|
|
13
|
+
files: number;
|
|
14
|
+
loc: number;
|
|
15
|
+
};
|