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.
Files changed (141) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +148 -0
  3. package/dist/cli.d.ts +6 -0
  4. package/dist/cli.js +232 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/codebase/generators/architecture.d.ts +4 -0
  7. package/dist/codebase/generators/architecture.js +33 -0
  8. package/dist/codebase/generators/architecture.js.map +1 -0
  9. package/dist/codebase/generators/modules.d.ts +9 -0
  10. package/dist/codebase/generators/modules.js +46 -0
  11. package/dist/codebase/generators/modules.js.map +1 -0
  12. package/dist/codebase/generators/overview.d.ts +5 -0
  13. package/dist/codebase/generators/overview.js +34 -0
  14. package/dist/codebase/generators/overview.js.map +1 -0
  15. package/dist/codebase/generators/skeleton.d.ts +8 -0
  16. package/dist/codebase/generators/skeleton.js +57 -0
  17. package/dist/codebase/generators/skeleton.js.map +1 -0
  18. package/dist/codebase/index.d.ts +24 -0
  19. package/dist/codebase/index.js +50 -0
  20. package/dist/codebase/index.js.map +1 -0
  21. package/dist/codebase/parsers/typescript.d.ts +14 -0
  22. package/dist/codebase/parsers/typescript.js +145 -0
  23. package/dist/codebase/parsers/typescript.js.map +1 -0
  24. package/dist/codebase/scanners/filesystem.d.ts +17 -0
  25. package/dist/codebase/scanners/filesystem.js +152 -0
  26. package/dist/codebase/scanners/filesystem.js.map +1 -0
  27. package/dist/codebase/utils/hashing.d.ts +15 -0
  28. package/dist/codebase/utils/hashing.js +50 -0
  29. package/dist/codebase/utils/hashing.js.map +1 -0
  30. package/dist/codebase/utils/stats.d.ts +12 -0
  31. package/dist/codebase/utils/stats.js +55 -0
  32. package/dist/codebase/utils/stats.js.map +1 -0
  33. package/dist/codebase/utils/tree.d.ts +10 -0
  34. package/dist/codebase/utils/tree.js +22 -0
  35. package/dist/codebase/utils/tree.js.map +1 -0
  36. package/dist/commands/analyze.d.ts +6 -0
  37. package/dist/commands/analyze.js +97 -0
  38. package/dist/commands/analyze.js.map +1 -0
  39. package/dist/commands/context.d.ts +4 -0
  40. package/dist/commands/context.js +54 -0
  41. package/dist/commands/context.js.map +1 -0
  42. package/dist/core/config.d.ts +20 -0
  43. package/dist/core/config.js +40 -0
  44. package/dist/core/config.js.map +1 -0
  45. package/dist/core/errors.d.ts +18 -0
  46. package/dist/core/errors.js +53 -0
  47. package/dist/core/errors.js.map +1 -0
  48. package/dist/core/fileio.d.ts +10 -0
  49. package/dist/core/fileio.js +57 -0
  50. package/dist/core/fileio.js.map +1 -0
  51. package/dist/core/index.d.ts +8 -0
  52. package/dist/core/index.js +9 -0
  53. package/dist/core/index.js.map +1 -0
  54. package/dist/core/logger.d.ts +15 -0
  55. package/dist/core/logger.js +40 -0
  56. package/dist/core/logger.js.map +1 -0
  57. package/dist/core/types.d.ts +106 -0
  58. package/dist/core/types.js +5 -0
  59. package/dist/core/types.js.map +1 -0
  60. package/dist/database/cli.d.ts +7 -0
  61. package/dist/database/cli.js +132 -0
  62. package/dist/database/cli.js.map +1 -0
  63. package/dist/database/commands/checkpoint.d.ts +13 -0
  64. package/dist/database/commands/checkpoint.js +136 -0
  65. package/dist/database/commands/checkpoint.js.map +1 -0
  66. package/dist/database/commands/generate.d.ts +21 -0
  67. package/dist/database/commands/generate.js +269 -0
  68. package/dist/database/commands/generate.js.map +1 -0
  69. package/dist/database/commands/handoff.d.ts +15 -0
  70. package/dist/database/commands/handoff.js +332 -0
  71. package/dist/database/commands/handoff.js.map +1 -0
  72. package/dist/database/commands/history.d.ts +13 -0
  73. package/dist/database/commands/history.js +148 -0
  74. package/dist/database/commands/history.js.map +1 -0
  75. package/dist/database/commands/init.d.ts +10 -0
  76. package/dist/database/commands/init.js +28 -0
  77. package/dist/database/commands/init.js.map +1 -0
  78. package/dist/database/commands/learn.d.ts +12 -0
  79. package/dist/database/commands/learn.js +93 -0
  80. package/dist/database/commands/learn.js.map +1 -0
  81. package/dist/database/commands/memory.d.ts +90 -0
  82. package/dist/database/commands/memory.js +353 -0
  83. package/dist/database/commands/memory.js.map +1 -0
  84. package/dist/database/commands/show.d.ts +9 -0
  85. package/dist/database/commands/show.js +136 -0
  86. package/dist/database/commands/show.js.map +1 -0
  87. package/dist/database/commands/validate.d.ts +9 -0
  88. package/dist/database/commands/validate.js +200 -0
  89. package/dist/database/commands/validate.js.map +1 -0
  90. package/dist/database/commands/watch.d.ts +9 -0
  91. package/dist/database/commands/watch.js +77 -0
  92. package/dist/database/commands/watch.js.map +1 -0
  93. package/dist/database/extractors/drizzle.d.ts +62 -0
  94. package/dist/database/extractors/drizzle.js +251 -0
  95. package/dist/database/extractors/drizzle.js.map +1 -0
  96. package/dist/database/extractors/firebase.d.ts +39 -0
  97. package/dist/database/extractors/firebase.js +192 -0
  98. package/dist/database/extractors/firebase.js.map +1 -0
  99. package/dist/database/extractors/index.d.ts +69 -0
  100. package/dist/database/extractors/index.js +345 -0
  101. package/dist/database/extractors/index.js.map +1 -0
  102. package/dist/database/extractors/mongodb.d.ts +44 -0
  103. package/dist/database/extractors/mongodb.js +198 -0
  104. package/dist/database/extractors/mongodb.js.map +1 -0
  105. package/dist/database/extractors/mysql.d.ts +61 -0
  106. package/dist/database/extractors/mysql.js +173 -0
  107. package/dist/database/extractors/mysql.js.map +1 -0
  108. package/dist/database/extractors/postgres.d.ts +47 -0
  109. package/dist/database/extractors/postgres.js +141 -0
  110. package/dist/database/extractors/postgres.js.map +1 -0
  111. package/dist/database/extractors/prisma.d.ts +71 -0
  112. package/dist/database/extractors/prisma.js +270 -0
  113. package/dist/database/extractors/prisma.js.map +1 -0
  114. package/dist/database/extractors/sqlite.d.ts +50 -0
  115. package/dist/database/extractors/sqlite.js +148 -0
  116. package/dist/database/extractors/sqlite.js.map +1 -0
  117. package/dist/database/generators/learning-generator.d.ts +48 -0
  118. package/dist/database/generators/learning-generator.js +221 -0
  119. package/dist/database/generators/learning-generator.js.map +1 -0
  120. package/dist/database/generators/templates.d.ts +103 -0
  121. package/dist/database/generators/templates.js +1557 -0
  122. package/dist/database/generators/templates.js.map +1 -0
  123. package/dist/database/index.d.ts +15 -0
  124. package/dist/database/index.js +16 -0
  125. package/dist/database/index.js.map +1 -0
  126. package/dist/database/utils/json-output.d.ts +26 -0
  127. package/dist/database/utils/json-output.js +37 -0
  128. package/dist/database/utils/json-output.js.map +1 -0
  129. package/dist/generators/unified.d.ts +1 -0
  130. package/dist/generators/unified.js +173 -0
  131. package/dist/generators/unified.js.map +1 -0
  132. package/dist/index.d.ts +4 -0
  133. package/dist/index.js +5 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/utils/config-detector.d.ts +1 -0
  136. package/dist/utils/config-detector.js +40 -0
  137. package/dist/utils/config-detector.js.map +1 -0
  138. package/dist/utils/config-loader.d.ts +16 -0
  139. package/dist/utils/config-loader.js +20 -0
  140. package/dist/utils/config-loader.js.map +1 -0
  141. 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,5 @@
1
+ /**
2
+ * Generate project overview documentation
3
+ */
4
+ import { FileNode } from '../scanners/filesystem.js';
5
+ export declare function generateOverview(structure: FileNode, projectRoot: string): string;
@@ -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
+ };