devmind 1.0.2 → 1.1.1

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 (134) hide show
  1. package/README.md +138 -162
  2. package/dist/cli/handlers.d.ts +2 -0
  3. package/dist/cli/handlers.js +140 -0
  4. package/dist/cli/handlers.js.map +1 -0
  5. package/dist/cli/register-all.d.ts +2 -0
  6. package/dist/cli/register-all.js +11 -0
  7. package/dist/cli/register-all.js.map +1 -0
  8. package/dist/cli/register-analysis.d.ts +2 -0
  9. package/dist/cli/register-analysis.js +137 -0
  10. package/dist/cli/register-analysis.js.map +1 -0
  11. package/dist/cli/register-codebase.d.ts +2 -0
  12. package/dist/cli/register-codebase.js +22 -0
  13. package/dist/cli/register-codebase.js.map +1 -0
  14. package/dist/cli/register-database.d.ts +2 -0
  15. package/dist/cli/register-database.js +48 -0
  16. package/dist/cli/register-database.js.map +1 -0
  17. package/dist/cli/register-memory.d.ts +2 -0
  18. package/dist/cli/register-memory.js +58 -0
  19. package/dist/cli/register-memory.js.map +1 -0
  20. package/dist/cli.js +9 -316
  21. package/dist/cli.js.map +1 -1
  22. package/dist/codebase/generators/architecture-extractor.d.ts +41 -0
  23. package/dist/codebase/generators/architecture-extractor.js +388 -0
  24. package/dist/codebase/generators/architecture-extractor.js.map +1 -0
  25. package/dist/codebase/generators/architecture.d.ts +2 -4
  26. package/dist/codebase/generators/architecture.js +123 -30
  27. package/dist/codebase/generators/architecture.js.map +1 -1
  28. package/dist/codebase/generators/modules.js +8 -8
  29. package/dist/codebase/generators/overview.js +24 -24
  30. package/dist/codebase/index.js +3 -3
  31. package/dist/codebase/index.js.map +1 -1
  32. package/dist/codebase/parsers/typescript.d.ts +1 -0
  33. package/dist/codebase/parsers/typescript.js +12 -0
  34. package/dist/codebase/parsers/typescript.js.map +1 -1
  35. package/dist/codebase/scanners/filesystem.d.ts +1 -0
  36. package/dist/codebase/scanners/filesystem.js +128 -4
  37. package/dist/codebase/scanners/filesystem.js.map +1 -1
  38. package/dist/commands/analyze.d.ts +1 -0
  39. package/dist/commands/analyze.js +172 -24
  40. package/dist/commands/analyze.js.map +1 -1
  41. package/dist/commands/audit-design.d.ts +8 -0
  42. package/dist/commands/audit-design.js +158 -0
  43. package/dist/commands/audit-design.js.map +1 -0
  44. package/dist/commands/audit-report.d.ts +18 -0
  45. package/dist/commands/audit-report.js +30 -0
  46. package/dist/commands/audit-report.js.map +1 -0
  47. package/dist/commands/audit-source.d.ts +21 -0
  48. package/dist/commands/audit-source.js +59 -0
  49. package/dist/commands/audit-source.js.map +1 -0
  50. package/dist/commands/audit.d.ts +1 -0
  51. package/dist/commands/audit.js +174 -73
  52. package/dist/commands/audit.js.map +1 -1
  53. package/dist/commands/claude-plugin.d.ts +8 -0
  54. package/dist/commands/claude-plugin.js +123 -0
  55. package/dist/commands/claude-plugin.js.map +1 -0
  56. package/dist/commands/codex-plugin.d.ts +9 -0
  57. package/dist/commands/codex-plugin.js +145 -0
  58. package/dist/commands/codex-plugin.js.map +1 -0
  59. package/dist/commands/context.js +66 -5
  60. package/dist/commands/context.js.map +1 -1
  61. package/dist/commands/design-system.d.ts +8 -0
  62. package/dist/commands/design-system.js +95 -0
  63. package/dist/commands/design-system.js.map +1 -0
  64. package/dist/commands/extract.d.ts +13 -0
  65. package/dist/commands/extract.js +83 -17
  66. package/dist/commands/extract.js.map +1 -1
  67. package/dist/commands/openclaw-plugin.d.ts +8 -0
  68. package/dist/commands/openclaw-plugin.js +103 -0
  69. package/dist/commands/openclaw-plugin.js.map +1 -0
  70. package/dist/commands/retrieve.d.ts +12 -0
  71. package/dist/commands/retrieve.js +234 -0
  72. package/dist/commands/retrieve.js.map +1 -0
  73. package/dist/commands/status.d.ts +1 -0
  74. package/dist/commands/status.js +54 -18
  75. package/dist/commands/status.js.map +1 -1
  76. package/dist/core/cache-json.d.ts +7 -0
  77. package/dist/core/cache-json.js +60 -0
  78. package/dist/core/cache-json.js.map +1 -0
  79. package/dist/core/errors.d.ts +2 -0
  80. package/dist/core/errors.js +49 -1
  81. package/dist/core/errors.js.map +1 -1
  82. package/dist/core/index.d.ts +4 -0
  83. package/dist/core/index.js +4 -0
  84. package/dist/core/index.js.map +1 -1
  85. package/dist/core/learning-parser.d.ts +6 -0
  86. package/dist/core/learning-parser.js +23 -0
  87. package/dist/core/learning-parser.js.map +1 -0
  88. package/dist/core/profile.d.ts +18 -0
  89. package/dist/core/profile.js +37 -0
  90. package/dist/core/profile.js.map +1 -0
  91. package/dist/core/source-file-cache.d.ts +13 -0
  92. package/dist/core/source-file-cache.js +88 -0
  93. package/dist/core/source-file-cache.js.map +1 -0
  94. package/dist/database/cli/register-all.d.ts +2 -0
  95. package/dist/database/cli/register-all.js +9 -0
  96. package/dist/database/cli/register-all.js.map +1 -0
  97. package/dist/database/cli/register-database.d.ts +2 -0
  98. package/dist/database/cli/register-database.js +48 -0
  99. package/dist/database/cli/register-database.js.map +1 -0
  100. package/dist/database/cli/register-interactive.d.ts +2 -0
  101. package/dist/database/cli/register-interactive.js +29 -0
  102. package/dist/database/cli/register-interactive.js.map +1 -0
  103. package/dist/database/cli/register-memory.d.ts +2 -0
  104. package/dist/database/cli/register-memory.js +47 -0
  105. package/dist/database/cli/register-memory.js.map +1 -0
  106. package/dist/database/cli.js +5 -112
  107. package/dist/database/cli.js.map +1 -1
  108. package/dist/database/commands/checkpoint.js +8 -10
  109. package/dist/database/commands/checkpoint.js.map +1 -1
  110. package/dist/database/commands/generate.d.ts +1 -0
  111. package/dist/database/commands/generate.js +28 -20
  112. package/dist/database/commands/generate.js.map +1 -1
  113. package/dist/database/commands/handoff.js +126 -125
  114. package/dist/database/commands/handoff.js.map +1 -1
  115. package/dist/database/commands/learn.d.ts +4 -0
  116. package/dist/database/commands/learn.js +249 -43
  117. package/dist/database/commands/learn.js.map +1 -1
  118. package/dist/database/commands/memory.js +114 -114
  119. package/dist/database/commands/validate.js +6 -4
  120. package/dist/database/commands/validate.js.map +1 -1
  121. package/dist/database/commands/watch.js +2 -2
  122. package/dist/database/commands/watch.js.map +1 -1
  123. package/dist/database/extractors/mysql.js +45 -45
  124. package/dist/database/extractors/postgres.js +54 -54
  125. package/dist/database/extractors/sqlite.js +8 -8
  126. package/dist/database/generators/templates.js +534 -534
  127. package/dist/database/generators/templates.js.map +1 -1
  128. package/dist/database/utils/json-output.d.ts +4 -0
  129. package/dist/database/utils/json-output.js +7 -0
  130. package/dist/database/utils/json-output.js.map +1 -1
  131. package/dist/generators/unified.d.ts +13 -0
  132. package/dist/generators/unified.js +391 -46
  133. package/dist/generators/unified.js.map +1 -1
  134. package/package.json +86 -78
@@ -5,30 +5,30 @@ import { generateTree } from '../utils/tree.js';
5
5
  import { countFilesAndLines } from '../utils/stats.js';
6
6
  export function generateOverview(structure, projectRoot) {
7
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._
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
32
  `;
33
33
  }
34
34
  //# sourceMappingURL=overview.js.map
@@ -10,7 +10,7 @@ export * from './generators/skeleton.js';
10
10
  export * from './utils/tree.js';
11
11
  export * from './utils/stats.js';
12
12
  export * from './utils/hashing.js';
13
- import { scanDirectory } from './scanners/filesystem.js';
13
+ import { scanDirectoryAsync } from './scanners/filesystem.js';
14
14
  import { generateOverview } from './generators/overview.js';
15
15
  import { generateArchitecture } from './generators/architecture.js';
16
16
  import { generateModuleDocs } from './generators/modules.js';
@@ -19,10 +19,10 @@ import * as path from 'path';
19
19
  import { logger } from '../core/index.js';
20
20
  export async function scanCodebase(rootPath, outputDir) {
21
21
  logger.info(`Scanning codebase at: ${rootPath}`);
22
- const structure = scanDirectory(rootPath);
22
+ const structure = await scanDirectoryAsync(rootPath);
23
23
  logger.info('Generating documentation...');
24
24
  const overview = generateOverview(structure, rootPath);
25
- const architecture = generateArchitecture();
25
+ const architecture = generateArchitecture(structure, rootPath);
26
26
  const modules = generateModuleDocs(structure, outputDir);
27
27
  const tree = generateTree(structure);
28
28
  return {
@@ -1 +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"}
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,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,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,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAErD,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,oBAAoB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/D,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"}
@@ -12,3 +12,4 @@ export interface CodeExport {
12
12
  * Parse a TypeScript/JavaScript file and extract exported symbols with signatures
13
13
  */
14
14
  export declare function parseFile(filePath: string): CodeExport[];
15
+ export declare function parseSourceFile(filePath: string, fileContent: string): CodeExport[];
@@ -8,6 +8,9 @@ import * as fs from 'fs';
8
8
  */
9
9
  export function parseFile(filePath) {
10
10
  const fileContent = fs.readFileSync(filePath, 'utf-8');
11
+ return parseSourceFile(filePath, fileContent);
12
+ }
13
+ export function parseSourceFile(filePath, fileContent) {
11
14
  const sourceFile = ts.createSourceFile(filePath, fileContent, ts.ScriptTarget.Latest, true);
12
15
  const exports = [];
13
16
  ts.forEachChild(sourceFile, (node) => {
@@ -95,6 +98,15 @@ function extractDetails(node, sourceFile) {
95
98
  });
96
99
  return declarations;
97
100
  }
101
+ case ts.SyntaxKind.ExportAssignment: {
102
+ const exportNode = node;
103
+ return {
104
+ type: 'variable',
105
+ name: 'default',
106
+ signature: exportNode.getText(sourceFile),
107
+ doc: getJSDoc(exportNode),
108
+ };
109
+ }
98
110
  default:
99
111
  return null;
100
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/codebase/parsers/typescript.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/codebase/parsers/typescript.ts"],"names":[],"mappings":"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"}
@@ -14,4 +14,5 @@ export interface FileNode {
14
14
  export declare function detectLanguage(file: string): string;
15
15
  export declare function getFileSize(filePath: string): number;
16
16
  export declare function scanDirectory(dir: string, depth?: number, maxDepth?: number): FileNode;
17
+ export declare function scanDirectoryAsync(dir: string, depth?: number, maxDepth?: number, maxConcurrency?: number): Promise<FileNode>;
17
18
  export declare function extractExports(content: string): string[];
@@ -3,7 +3,8 @@
3
3
  */
4
4
  import * as fs from 'fs';
5
5
  import * as path from 'path';
6
- import { parseFile } from '../parsers/typescript.js';
6
+ import * as fsPromises from 'fs/promises';
7
+ import { parseSourceFile } from '../parsers/typescript.js';
7
8
  import { logger } from '../../core/index.js';
8
9
  const IGNORED_DIRS = [
9
10
  'node_modules',
@@ -22,6 +23,21 @@ const IGNORED_FILES = [
22
23
  'pnpm-lock.yaml',
23
24
  'yarn.lock',
24
25
  ];
26
+ const JS_TS_LANGUAGES = new Set([
27
+ 'TypeScript',
28
+ 'TypeScript React',
29
+ 'JavaScript',
30
+ 'JavaScript React',
31
+ ]);
32
+ const MAX_PARSE_BYTES = 256 * 1024;
33
+ function shouldSkipAstParse(fileName, size) {
34
+ const lower = fileName.toLowerCase();
35
+ if (size > MAX_PARSE_BYTES)
36
+ return true;
37
+ if (lower.includes('.min.'))
38
+ return true;
39
+ return false;
40
+ }
25
41
  export function detectLanguage(file) {
26
42
  const ext = path.extname(file).toLowerCase();
27
43
  const langMap = {
@@ -57,6 +73,72 @@ export function getFileSize(filePath) {
57
73
  return 0;
58
74
  }
59
75
  }
76
+ async function getFileSizeAsync(filePath) {
77
+ try {
78
+ const stats = await fsPromises.stat(filePath);
79
+ return stats.size;
80
+ }
81
+ catch {
82
+ return 0;
83
+ }
84
+ }
85
+ function createLimiter(maxConcurrency) {
86
+ let active = 0;
87
+ const queue = [];
88
+ const runNext = () => {
89
+ if (active >= maxConcurrency)
90
+ return;
91
+ const next = queue.shift();
92
+ if (!next)
93
+ return;
94
+ next();
95
+ };
96
+ return async function limit(task) {
97
+ if (active >= maxConcurrency) {
98
+ await new Promise((resolve) => queue.push(resolve));
99
+ }
100
+ active += 1;
101
+ try {
102
+ return await task();
103
+ }
104
+ finally {
105
+ active -= 1;
106
+ runNext();
107
+ }
108
+ };
109
+ }
110
+ async function scanFileAsync(fullPath, entryName) {
111
+ if (IGNORED_FILES.includes(entryName))
112
+ return null;
113
+ const lang = detectLanguage(entryName);
114
+ let exports = [];
115
+ let size = await getFileSizeAsync(fullPath);
116
+ if (JS_TS_LANGUAGES.has(lang) && !shouldSkipAstParse(entryName, size)) {
117
+ try {
118
+ const content = await fsPromises.readFile(fullPath, 'utf-8');
119
+ exports = parseSourceFile(fullPath, content);
120
+ }
121
+ catch (e) {
122
+ logger.debug(`Failed to parse ${entryName}: ${e.message}`);
123
+ }
124
+ }
125
+ else if (lang !== 'Unknown' && lang !== 'JSON' && lang !== 'YAML' && lang !== 'Markdown') {
126
+ try {
127
+ const content = await fsPromises.readFile(fullPath, 'utf-8');
128
+ exports = extractExports(content);
129
+ }
130
+ catch {
131
+ // Skip unreadable files
132
+ }
133
+ }
134
+ return {
135
+ name: entryName,
136
+ type: 'file',
137
+ language: lang,
138
+ size,
139
+ exports,
140
+ };
141
+ }
60
142
  export function scanDirectory(dir, depth = 0, maxDepth = 4) {
61
143
  if (depth > maxDepth) {
62
144
  return { name: path.basename(dir), type: 'directory', children: [] };
@@ -76,10 +158,12 @@ export function scanDirectory(dir, depth = 0, maxDepth = 4) {
76
158
  continue;
77
159
  const lang = detectLanguage(entry.name);
78
160
  let exports = [];
161
+ const size = getFileSize(fullPath);
79
162
  // Use AST parser for JS/TS
80
- if (['TypeScript', 'TypeScript React', 'JavaScript', 'JavaScript React'].includes(lang)) {
163
+ if (JS_TS_LANGUAGES.has(lang) && !shouldSkipAstParse(entry.name, size)) {
81
164
  try {
82
- exports = parseFile(fullPath);
165
+ const content = fs.readFileSync(fullPath, 'utf-8');
166
+ exports = parseSourceFile(fullPath, content);
83
167
  }
84
168
  catch (e) {
85
169
  logger.debug(`Failed to parse ${entry.name}: ${e.message}`);
@@ -101,7 +185,7 @@ export function scanDirectory(dir, depth = 0, maxDepth = 4) {
101
185
  name: entry.name,
102
186
  type: 'file',
103
187
  language: lang,
104
- size: getFileSize(fullPath),
188
+ size,
105
189
  exports: exports,
106
190
  });
107
191
  }
@@ -117,6 +201,46 @@ export function scanDirectory(dir, depth = 0, maxDepth = 4) {
117
201
  children: items,
118
202
  };
119
203
  }
204
+ export async function scanDirectoryAsync(dir, depth = 0, maxDepth = 4, maxConcurrency = 24) {
205
+ const limit = createLimiter(maxConcurrency);
206
+ async function walk(currentDir, currentDepth) {
207
+ if (currentDepth > maxDepth) {
208
+ return { name: path.basename(currentDir), type: 'directory', children: [] };
209
+ }
210
+ let entries = [];
211
+ try {
212
+ entries = await fsPromises.readdir(currentDir, { withFileTypes: true });
213
+ }
214
+ catch (e) {
215
+ logger.error(`Error scanning ${currentDir}: ${e.message}`);
216
+ return {
217
+ name: path.basename(currentDir),
218
+ type: 'directory',
219
+ path: path.relative(process.cwd(), currentDir).replace(/\\/g, '/'),
220
+ children: [],
221
+ };
222
+ }
223
+ const itemPromises = entries
224
+ .filter((entry) => !IGNORED_DIRS.includes(entry.name))
225
+ .map((entry) => limit(async () => {
226
+ const fullPath = path.join(currentDir, entry.name);
227
+ if (entry.isDirectory()) {
228
+ return walk(fullPath, currentDepth + 1);
229
+ }
230
+ if (!entry.isFile())
231
+ return null;
232
+ return scanFileAsync(fullPath, entry.name);
233
+ }));
234
+ const items = (await Promise.all(itemPromises)).filter((item) => !!item);
235
+ return {
236
+ name: path.basename(currentDir),
237
+ type: 'directory',
238
+ path: path.relative(process.cwd(), currentDir).replace(/\\/g, '/'),
239
+ children: items,
240
+ };
241
+ }
242
+ return walk(dir, depth);
243
+ }
120
244
  // Simple regex-based export extractor for non-JS/TS files or fallback
121
245
  export function extractExports(content) {
122
246
  const exports = [];
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../src/codebase/scanners/filesystem.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../src/codebase/scanners/filesystem.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  interface AnalyzeOptions {
2
2
  output?: string;
3
3
  path?: string;
4
+ profile?: boolean;
4
5
  }
5
6
  export declare function analyze(options: AnalyzeOptions): Promise<void>;
6
7
  export {};
@@ -1,16 +1,20 @@
1
1
  import * as path from 'path';
2
- import { logger, readFileSafe, writeFileSafe, ensureDir } from '../core/index.js';
3
- import { glob } from 'glob';
4
- import * as fs from 'fs';
2
+ import { createHash } from 'crypto';
3
+ import { logger, readFileSafe, writeFileSafe, ensureDir, createProfiler, readCacheJson, writeCacheJson, getSourceFilesWithCache, } from '../core/index.js';
4
+ import * as fsPromises from 'fs/promises';
5
+ const CACHEABLE_CONTENT_MAX_BYTES = 24 * 1024;
6
+ const CACHE_CONTENT_BUDGET_BYTES = 8 * 1024 * 1024;
7
+ const FILE_BATCH_SIZE = 48;
5
8
  export async function analyze(options) {
9
+ const profiler = createProfiler(!!options.profile);
6
10
  const outputDir = options.output || '.devmind';
7
- const rootPath = options.path || '.';
11
+ const rootPath = path.resolve(options.path || '.');
8
12
  logger.info('Starting Cross-Context Analysis...');
9
13
  // 1. Load Schema
10
14
  const schemaPath = path.join(outputDir, 'database', 'schema.json');
11
15
  let schema;
12
16
  try {
13
- const schemaContent = await readFileSafe(schemaPath);
17
+ const schemaContent = await profiler.section('analyze.loadSchema', async () => readFileSafe(schemaPath));
14
18
  schema = JSON.parse(schemaContent);
15
19
  logger.info(`Loaded schema: ${schema.tables.length} tables found.`);
16
20
  }
@@ -21,35 +25,143 @@ export async function analyze(options) {
21
25
  // 2. Scan Codebase Files
22
26
  // We scan actual files instead of relying on structure.json to ensure fresh content
23
27
  logger.info(`Scanning files in: ${rootPath}`);
24
- const files = await glob('**/*.{ts,js,tsx,jsx,py,go,java,rb,php}', {
25
- cwd: rootPath,
28
+ const sourceList = await profiler.section('analyze.listSources', async () => getSourceFilesWithCache({
29
+ outputDir,
30
+ rootPath,
31
+ includeGlob: '**/*.{ts,tsx,js,jsx,py,go,java,rb,php,rs}',
26
32
  ignore: ['node_modules/**', '.devmind/**', 'dist/**', 'build/**'],
27
- });
33
+ }));
34
+ const files = sourceList.files;
28
35
  logger.info(`Analyzing ${files.length} source files...`);
29
36
  // 3. Analyze Usage
30
37
  const usage = [];
31
38
  const unusedTables = [];
32
- for (const table of schema.tables) {
33
- const tableName = table.name;
39
+ const tableInfos = schema.tables
40
+ .map((table) => {
41
+ const tableName = String(table.name);
34
42
  const variations = [tableName, toPascalCase(tableName), toCamelCase(tableName)];
35
- // Remove duplicates
36
- const searchTerms = [...new Set(variations)];
37
- const matchedFiles = [];
38
- for (const file of files) {
39
- const content = fs.readFileSync(path.join(rootPath, file), 'utf-8');
40
- if (searchTerms.some((term) => content.includes(term))) {
41
- matchedFiles.push(file);
43
+ const terms = [...new Set(variations.map((value) => value.toLowerCase()))];
44
+ return { tableName, terms };
45
+ })
46
+ .sort((a, b) => a.tableName.localeCompare(b.tableName));
47
+ const schemaSignature = buildSchemaSignature(tableInfos);
48
+ const cachePath = path.join(outputDir, 'cache', 'analyze-cache.json');
49
+ let cache = {
50
+ version: 1,
51
+ schemaSignature,
52
+ files: {},
53
+ };
54
+ cache = await profiler.section('analyze.loadCache', async () => {
55
+ try {
56
+ const parsed = await readCacheJson(cachePath);
57
+ if (!parsed)
58
+ return cache;
59
+ if (parsed.version !== 1 || typeof parsed.files !== 'object') {
60
+ return cache;
61
+ }
62
+ if (parsed.schemaSignature !== schemaSignature) {
63
+ return {
64
+ version: 1,
65
+ schemaSignature,
66
+ files: {},
67
+ };
68
+ }
69
+ return parsed;
70
+ }
71
+ catch {
72
+ return cache;
73
+ }
74
+ });
75
+ const activeFiles = new Set(files);
76
+ const matchedByTable = new Map();
77
+ let cacheHits = 0;
78
+ let cacheMisses = 0;
79
+ await profiler.section('analyze.matchFiles', async () => {
80
+ for (let i = 0; i < files.length; i += FILE_BATCH_SIZE) {
81
+ const batch = files.slice(i, i + FILE_BATCH_SIZE);
82
+ const results = await Promise.all(batch.map(async (file) => {
83
+ const fullPath = path.join(rootPath, file);
84
+ let stat;
85
+ try {
86
+ stat = await fsPromises.stat(fullPath);
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ const cached = cache.files[file];
92
+ if (cached && cached.mtimeMs === stat.mtimeMs && cached.size === stat.size) {
93
+ return {
94
+ file,
95
+ stat,
96
+ matchedTables: cached.matches,
97
+ content: null,
98
+ cacheHit: true,
99
+ };
100
+ }
101
+ let content = null;
102
+ let matchedTables = [];
103
+ try {
104
+ content = await fsPromises.readFile(fullPath, 'utf-8');
105
+ const contentLower = content.toLowerCase();
106
+ for (const tableInfo of tableInfos) {
107
+ if (tableInfo.terms.some((term) => contentLower.includes(term))) {
108
+ matchedTables.push(tableInfo.tableName);
109
+ }
110
+ }
111
+ }
112
+ catch {
113
+ matchedTables = [];
114
+ }
115
+ return { file, stat, matchedTables, content, cacheHit: false };
116
+ }));
117
+ for (const result of results) {
118
+ if (!result)
119
+ continue;
120
+ if (result.cacheHit) {
121
+ cacheHits += 1;
122
+ }
123
+ else {
124
+ cacheMisses += 1;
125
+ cache.files[result.file] = {
126
+ mtimeMs: result.stat.mtimeMs,
127
+ size: result.stat.size,
128
+ matches: result.matchedTables,
129
+ content: result.content !== null && result.stat.size <= CACHEABLE_CONTENT_MAX_BYTES
130
+ ? result.content
131
+ : undefined,
132
+ };
133
+ }
134
+ for (const tableName of result.matchedTables) {
135
+ const existing = matchedByTable.get(tableName);
136
+ if (existing) {
137
+ existing.push(result.file);
138
+ }
139
+ else {
140
+ matchedByTable.set(tableName, [result.file]);
141
+ }
142
+ }
143
+ }
144
+ }
145
+ });
146
+ await profiler.section('analyze.pruneCache', async () => {
147
+ for (const relPath of Object.keys(cache.files)) {
148
+ if (!activeFiles.has(relPath)) {
149
+ delete cache.files[relPath];
42
150
  }
43
151
  }
152
+ enforceContentBudget(cache.files, CACHE_CONTENT_BUDGET_BYTES);
153
+ });
154
+ for (const tableInfo of tableInfos) {
155
+ const matchedFiles = [...(matchedByTable.get(tableInfo.tableName) || [])].sort((a, b) => a.localeCompare(b));
44
156
  if (matchedFiles.length > 0) {
45
157
  usage.push({
46
- tableName,
158
+ tableName: tableInfo.tableName,
47
159
  files: matchedFiles,
48
160
  count: matchedFiles.length,
49
161
  });
50
162
  }
51
163
  else {
52
- unusedTables.push(tableName);
164
+ unusedTables.push(tableInfo.tableName);
53
165
  }
54
166
  }
55
167
  // 4. Generate Reports
@@ -59,7 +171,7 @@ export async function analyze(options) {
59
171
  let mappingContent = '# Code-to-Database Mapping\n\n';
60
172
  mappingContent += `**Generated:** ${new Date().toISOString()}\n\n`;
61
173
  // Most used tables first
62
- usage.sort((a, b) => b.count - a.count);
174
+ usage.sort((a, b) => b.count - a.count || a.tableName.localeCompare(b.tableName));
63
175
  for (const item of usage) {
64
176
  mappingContent += `### ${item.tableName} (${item.count} files)\n`;
65
177
  for (const file of item.files) {
@@ -67,22 +179,36 @@ export async function analyze(options) {
67
179
  }
68
180
  mappingContent += '\n';
69
181
  }
70
- await writeFileSafe(path.join(analysisDir, 'CODE_DB_MAPPING.md'), mappingContent);
182
+ await profiler.section('analyze.writeMapping', async () => writeFileSafe(path.join(analysisDir, 'CODE_DB_MAPPING.md'), mappingContent));
183
+ await profiler.section('analyze.writeCache', async () => {
184
+ await ensureDir(path.dirname(cachePath));
185
+ await writeCacheJson(cachePath, cache, { compressAboveBytes: 512 * 1024, pretty: false });
186
+ });
71
187
  // UNUSED_TABLES.md
72
188
  if (unusedTables.length > 0) {
73
189
  let unusedContent = '# Unused Tables Report\n\n';
74
190
  unusedContent +=
75
- '> ⚠️ **Warning:** These tables were not found in the codebase. Verify manually before deleting.\n\n';
76
- for (const table of unusedTables) {
191
+ '> **Warning:** These tables were not found in the codebase. Verify manually before deleting.\n\n';
192
+ for (const table of [...unusedTables].sort((a, b) => a.localeCompare(b))) {
77
193
  unusedContent += `- [ ] ${table}\n`;
78
194
  }
79
- await writeFileSafe(path.join(analysisDir, 'UNUSED_TABLES.md'), unusedContent);
195
+ await profiler.section('analyze.writeUnused', async () => writeFileSafe(path.join(analysisDir, 'UNUSED_TABLES.md'), unusedContent));
80
196
  }
81
197
  logger.success('Analysis Complete!');
82
198
  logger.info(` - ${path.join(analysisDir, 'CODE_DB_MAPPING.md')}`);
83
199
  if (unusedTables.length > 0) {
84
200
  logger.info(` - ${path.join(analysisDir, 'UNUSED_TABLES.md')}`);
85
201
  }
202
+ logger.info(`Analyze cache: ${cacheHits} reused, ${cacheMisses} refreshed`);
203
+ logger.info(`Source list cache: ${sourceList.cacheHit ? 'hit' : 'miss'}`);
204
+ const profile = profiler.report();
205
+ if (profile) {
206
+ logger.info('Performance Profile');
207
+ logger.info(`Total: ${profile.totalMs.toFixed(1)}ms`);
208
+ for (const step of profile.steps) {
209
+ logger.info(`- ${step.name}: ${step.ms.toFixed(1)}ms`);
210
+ }
211
+ }
86
212
  }
87
213
  // Helpers
88
214
  function toPascalCase(str) {
@@ -94,4 +220,26 @@ function toCamelCase(str) {
94
220
  const pascal = toPascalCase(str);
95
221
  return pascal.charAt(0).toLowerCase() + pascal.slice(1);
96
222
  }
223
+ function buildSchemaSignature(tableInfos) {
224
+ const stable = tableInfos
225
+ .map((item) => `${item.tableName}:${item.terms.join(',')}`)
226
+ .sort()
227
+ .join('|');
228
+ return createHash('sha256').update(stable, 'utf8').digest('hex').slice(0, 16);
229
+ }
230
+ function enforceContentBudget(files, budgetBytes) {
231
+ let used = 0;
232
+ const keys = Object.keys(files).sort();
233
+ for (const key of keys) {
234
+ const entry = files[key];
235
+ if (!entry.content)
236
+ continue;
237
+ const bytes = Buffer.byteLength(entry.content, 'utf-8');
238
+ if (used + bytes <= budgetBytes) {
239
+ used += bytes;
240
+ continue;
241
+ }
242
+ delete entry.content;
243
+ }
244
+ }
97
245
  //# sourceMappingURL=analyze.js.map