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
@@ -0,0 +1,388 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ const SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']);
4
+ const IGNORED_DIRS = new Set([
5
+ 'node_modules',
6
+ '.git',
7
+ '.devmind',
8
+ 'dist',
9
+ 'build',
10
+ 'coverage',
11
+ '.pnpm-store',
12
+ '.npm-cache',
13
+ 'tests',
14
+ 'memory',
15
+ ]);
16
+ function normalizeRelPath(filePath) {
17
+ return filePath.replace(/\\/g, '/');
18
+ }
19
+ function lineFromIndex(content, index) {
20
+ if (index <= 0)
21
+ return 1;
22
+ let line = 1;
23
+ for (let i = 0; i < index; i += 1) {
24
+ if (content.charCodeAt(i) === 10)
25
+ line += 1;
26
+ }
27
+ return line;
28
+ }
29
+ function collectSourceFiles(rootPath) {
30
+ const files = [];
31
+ const stack = [rootPath];
32
+ while (stack.length > 0) {
33
+ const current = stack.pop();
34
+ if (!current)
35
+ break;
36
+ let entries;
37
+ try {
38
+ entries = fs.readdirSync(current, { withFileTypes: true });
39
+ }
40
+ catch {
41
+ continue;
42
+ }
43
+ for (const entry of entries) {
44
+ if (entry.name.startsWith('.') && entry.name !== '.github') {
45
+ if (entry.isDirectory())
46
+ continue;
47
+ }
48
+ const fullPath = path.join(current, entry.name);
49
+ if (entry.isDirectory()) {
50
+ if (IGNORED_DIRS.has(entry.name))
51
+ continue;
52
+ stack.push(fullPath);
53
+ continue;
54
+ }
55
+ if (!entry.isFile())
56
+ continue;
57
+ if (!SOURCE_EXTENSIONS.has(path.extname(entry.name).toLowerCase()))
58
+ continue;
59
+ files.push(fullPath);
60
+ }
61
+ }
62
+ files.sort((a, b) => a.localeCompare(b));
63
+ return files;
64
+ }
65
+ function addUnique(target, seen, key, value) {
66
+ if (seen.has(key))
67
+ return;
68
+ seen.add(key);
69
+ target.push(value);
70
+ }
71
+ function cleanNextSegment(segment) {
72
+ if (segment.startsWith('(') && segment.endsWith(')'))
73
+ return '';
74
+ if (segment.startsWith('[') && segment.endsWith(']'))
75
+ return `:${segment.slice(1, -1)}`;
76
+ return segment;
77
+ }
78
+ function toRoutePathFromNextFile(relPath) {
79
+ const noExt = relPath.replace(/\.[^.]+$/, '');
80
+ const normalized = normalizeRelPath(noExt);
81
+ if (normalized.startsWith('pages/')) {
82
+ const routePart = normalized.slice('pages'.length);
83
+ const apiAdjusted = routePart.replace(/^\/index$/, '/');
84
+ return apiAdjusted.replace(/\/index$/g, '') || '/';
85
+ }
86
+ if (normalized.startsWith('app/') && /\/route$/.test(normalized)) {
87
+ const withoutPrefix = normalized.slice('app/'.length);
88
+ const dir = withoutPrefix.replace(/\/route$/, '');
89
+ const segments = dir.split('/').map(cleanNextSegment).filter(Boolean);
90
+ return `/${segments.join('/')}`.replace(/\/+/g, '/') || '/';
91
+ }
92
+ return null;
93
+ }
94
+ function extractRoutes(relPath, content, routes, seen) {
95
+ const expressRegex = /\b(?:app|router)\.(get|post|put|patch|delete|options|head|all)\(\s*['"`]([^'"`]+)['"`]/g;
96
+ let match;
97
+ while ((match = expressRegex.exec(content)) !== null) {
98
+ const method = match[1].toUpperCase();
99
+ const routePath = match[2];
100
+ const line = lineFromIndex(content, match.index);
101
+ addUnique(routes, seen, `${method}|${routePath}|${relPath}|${line}|express`, {
102
+ method,
103
+ path: routePath,
104
+ file: relPath,
105
+ line,
106
+ source: 'express',
107
+ });
108
+ }
109
+ const nextRoutePath = toRoutePathFromNextFile(relPath);
110
+ if (nextRoutePath) {
111
+ if (normalizeRelPath(relPath).startsWith('app/') &&
112
+ /\/route\.[^.]+$/.test(normalizeRelPath(relPath))) {
113
+ const methodRegex = /\bexport\s+(?:async\s+)?function\s+(GET|POST|PUT|PATCH|DELETE|OPTIONS|HEAD)\b/g;
114
+ const methods = [];
115
+ while ((match = methodRegex.exec(content)) !== null) {
116
+ methods.push({ method: match[1], index: match.index });
117
+ }
118
+ if (methods.length === 0) {
119
+ addUnique(routes, seen, `ANY|${nextRoutePath}|${relPath}|1|next`, {
120
+ method: 'ANY',
121
+ path: nextRoutePath,
122
+ file: relPath,
123
+ line: 1,
124
+ source: 'next',
125
+ });
126
+ }
127
+ else {
128
+ for (const entry of methods) {
129
+ const line = lineFromIndex(content, entry.index);
130
+ addUnique(routes, seen, `${entry.method}|${nextRoutePath}|${relPath}|${line}|next`, {
131
+ method: entry.method,
132
+ path: nextRoutePath,
133
+ file: relPath,
134
+ line,
135
+ source: 'next',
136
+ });
137
+ }
138
+ }
139
+ }
140
+ else {
141
+ addUnique(routes, seen, `ANY|${nextRoutePath}|${relPath}|1|next`, {
142
+ method: 'ANY',
143
+ path: nextRoutePath,
144
+ file: relPath,
145
+ line: 1,
146
+ source: 'next',
147
+ });
148
+ }
149
+ }
150
+ const jsxRouteRegex = /<Route\b[^>]*\bpath\s*=\s*["'`]([^"'`]+)["'`][^>]*>/g;
151
+ while ((match = jsxRouteRegex.exec(content)) !== null) {
152
+ const line = lineFromIndex(content, match.index);
153
+ addUnique(routes, seen, `ROUTE|${match[1]}|${relPath}|${line}|react-router`, {
154
+ method: 'ROUTE',
155
+ path: match[1],
156
+ file: relPath,
157
+ line,
158
+ source: 'react-router',
159
+ });
160
+ }
161
+ if (content.includes('createBrowserRouter') || content.includes('createRoutesFromElements')) {
162
+ const objPathRegex = /\bpath\s*:\s*['"`]([^'"`]+)['"`]/g;
163
+ while ((match = objPathRegex.exec(content)) !== null) {
164
+ const line = lineFromIndex(content, match.index);
165
+ addUnique(routes, seen, `ROUTE|${match[1]}|${relPath}|${line}|react-router`, {
166
+ method: 'ROUTE',
167
+ path: match[1],
168
+ file: relPath,
169
+ line,
170
+ source: 'react-router',
171
+ });
172
+ }
173
+ }
174
+ }
175
+ function extractApiCalls(relPath, content, apiCalls, seen) {
176
+ let match;
177
+ const fetchRegex = /\bfetch\(\s*(['"`])([^'"`]+)\1/g;
178
+ while ((match = fetchRegex.exec(content)) !== null) {
179
+ const line = lineFromIndex(content, match.index);
180
+ addUnique(apiCalls, seen, `fetch|${match[2]}|${relPath}|${line}`, {
181
+ client: 'fetch',
182
+ url: match[2],
183
+ file: relPath,
184
+ line,
185
+ });
186
+ }
187
+ const axiosMethodRegex = /\baxios\.(get|post|put|patch|delete|request)\(\s*(['"`])([^'"`]+)\2/g;
188
+ while ((match = axiosMethodRegex.exec(content)) !== null) {
189
+ const line = lineFromIndex(content, match.index);
190
+ addUnique(apiCalls, seen, `axios|${match[3]}|${relPath}|${line}|${match[1]}`, {
191
+ client: 'axios',
192
+ method: match[1].toUpperCase(),
193
+ url: match[3],
194
+ file: relPath,
195
+ line,
196
+ });
197
+ }
198
+ const axiosConfigRegex = /\baxios\s*\(\s*\{[\s\S]{0,300}?\burl\s*:\s*(['"`])([^'"`]+)\1[\s\S]{0,300}?\}\s*\)/g;
199
+ while ((match = axiosConfigRegex.exec(content)) !== null) {
200
+ const line = lineFromIndex(content, match.index);
201
+ addUnique(apiCalls, seen, `axios|${match[2]}|${relPath}|${line}|config`, {
202
+ client: 'axios',
203
+ url: match[2],
204
+ file: relPath,
205
+ line,
206
+ });
207
+ }
208
+ const customClientRegex = /\b([A-Za-z_$][\w$]*(?:Client|Api|API|http|request|sdk))\.(get|post|put|patch|delete|request)\(\s*(['"`])([^'"`]+)\3/g;
209
+ while ((match = customClientRegex.exec(content)) !== null) {
210
+ const client = match[1];
211
+ const method = match[2].toUpperCase();
212
+ const line = lineFromIndex(content, match.index);
213
+ addUnique(apiCalls, seen, `${client}|${match[4]}|${relPath}|${line}|${method}`, {
214
+ client,
215
+ method,
216
+ url: match[4],
217
+ file: relPath,
218
+ line,
219
+ });
220
+ }
221
+ }
222
+ function extractWebSockets(relPath, content, websockets, seen) {
223
+ let match;
224
+ const wsCtorRegex = /\bnew\s+WebSocket\s*\(/g;
225
+ while ((match = wsCtorRegex.exec(content)) !== null) {
226
+ const line = lineFromIndex(content, match.index);
227
+ addUnique(websockets, seen, `WebSocket|${relPath}|${line}`, {
228
+ library: 'WebSocket',
229
+ file: relPath,
230
+ line,
231
+ detail: 'new WebSocket(...)',
232
+ });
233
+ }
234
+ if (/from\s+['"]socket\.io(?:-client)?['"]/.test(content) ||
235
+ /require\(['"]socket\.io(?:-client)?['"]\)/.test(content)) {
236
+ const ioRegex = /\bio\s*\(/g;
237
+ while ((match = ioRegex.exec(content)) !== null) {
238
+ const line = lineFromIndex(content, match.index);
239
+ addUnique(websockets, seen, `socket.io|${relPath}|${line}`, {
240
+ library: 'socket.io',
241
+ file: relPath,
242
+ line,
243
+ detail: 'io(...)',
244
+ });
245
+ }
246
+ }
247
+ if (/from\s+['"]ws['"]/.test(content) || /require\(['"]ws['"]\)/.test(content)) {
248
+ const wsServerRegex = /\bnew\s+(?:WebSocketServer|Server)\s*\(/g;
249
+ while ((match = wsServerRegex.exec(content)) !== null) {
250
+ const line = lineFromIndex(content, match.index);
251
+ addUnique(websockets, seen, `ws|${relPath}|${line}`, {
252
+ library: 'ws',
253
+ file: relPath,
254
+ line,
255
+ detail: 'ws server initialization',
256
+ });
257
+ }
258
+ }
259
+ }
260
+ function extractSocketEvents(relPath, content, socketEvents, seen) {
261
+ const eventRegex = /\.(emit|on)\(\s*(['"`])([^'"`]+)\2/g;
262
+ let match;
263
+ while ((match = eventRegex.exec(content)) !== null) {
264
+ const action = match[1];
265
+ const event = match[3];
266
+ const line = lineFromIndex(content, match.index);
267
+ addUnique(socketEvents, seen, `${action}|${event}|${relPath}|${line}`, {
268
+ action,
269
+ event,
270
+ file: relPath,
271
+ line,
272
+ });
273
+ }
274
+ }
275
+ function extractHooks(relPath, content, hooks, seen) {
276
+ const reactHookRegex = /\b(useState|useEffect|useMemo|useCallback|useReducer|useRef|useContext|useLayoutEffect|useImperativeHandle|useDeferredValue|useTransition|useId|useSyncExternalStore|useInsertionEffect)\b/g;
277
+ let match;
278
+ while ((match = reactHookRegex.exec(content)) !== null) {
279
+ const line = lineFromIndex(content, match.index);
280
+ addUnique(hooks, seen, `react|${match[1]}|${relPath}|${line}`, {
281
+ name: match[1],
282
+ kind: 'react',
283
+ file: relPath,
284
+ line,
285
+ });
286
+ }
287
+ const customHookRegex = /\b(?:export\s+)?function\s+(use[A-Z][A-Za-z0-9_]*)\s*\(|\b(?:export\s+)?const\s+(use[A-Z][A-Za-z0-9_]*)\s*=\s*\(/g;
288
+ while ((match = customHookRegex.exec(content)) !== null) {
289
+ const name = match[1] || match[2];
290
+ if (!name)
291
+ continue;
292
+ const line = lineFromIndex(content, match.index);
293
+ addUnique(hooks, seen, `custom|${name}|${relPath}|${line}`, {
294
+ name,
295
+ kind: 'custom',
296
+ file: relPath,
297
+ line,
298
+ });
299
+ }
300
+ }
301
+ function parseFileSignals(rootPath, absPath, target) {
302
+ let content = '';
303
+ try {
304
+ content = fs.readFileSync(absPath, 'utf-8');
305
+ }
306
+ catch {
307
+ return;
308
+ }
309
+ const relPath = normalizeRelPath(path.relative(rootPath, absPath));
310
+ if (/(^|\/)(architecture-extractor|devmind-arch-extractor)\.ts$/.test(relPath)) {
311
+ return;
312
+ }
313
+ extractRoutes(relPath, content, target.routes, target.__routesSeen);
314
+ extractApiCalls(relPath, content, target.apiCalls, target.__apiSeen);
315
+ extractWebSockets(relPath, content, target.websockets, target.__wsSeen);
316
+ extractSocketEvents(relPath, content, target.socketEvents, target.__socketSeen);
317
+ extractHooks(relPath, content, target.hooks, target.__hooksSeen);
318
+ }
319
+ function sorted(items) {
320
+ return items.sort((a, b) => a.file.localeCompare(b.file) || a.line - b.line);
321
+ }
322
+ export function extractArchitectureSignals(rootPath) {
323
+ const target = {
324
+ routes: [],
325
+ apiCalls: [],
326
+ websockets: [],
327
+ socketEvents: [],
328
+ hooks: [],
329
+ __routesSeen: new Set(),
330
+ __apiSeen: new Set(),
331
+ __wsSeen: new Set(),
332
+ __socketSeen: new Set(),
333
+ __hooksSeen: new Set(),
334
+ };
335
+ const files = collectSourceFiles(rootPath);
336
+ for (const file of files) {
337
+ parseFileSignals(rootPath, file, target);
338
+ }
339
+ const result = {
340
+ routes: sorted(target.routes),
341
+ apiCalls: sorted(target.apiCalls),
342
+ websockets: sorted(target.websockets),
343
+ socketEvents: sorted(target.socketEvents),
344
+ hooks: sorted(target.hooks),
345
+ };
346
+ return result;
347
+ }
348
+ function tableOrFallback(header, columns, rows) {
349
+ if (rows.length === 0)
350
+ return `${header}\n\n_No items detected._\n`;
351
+ const head = `| ${columns.join(' | ')} |`;
352
+ const sep = `| ${columns.map(() => '---').join(' | ')} |`;
353
+ const body = rows.map((row) => `| ${row.join(' | ')} |`).join('\n');
354
+ return `${header}\n\n${head}\n${sep}\n${body}\n`;
355
+ }
356
+ export function renderArchitectureSignalsMarkdown(signals) {
357
+ const routeRows = signals.routes.map((route) => [
358
+ route.method,
359
+ route.path,
360
+ `${route.file}:${route.line}`,
361
+ route.source,
362
+ ]);
363
+ const apiRows = signals.apiCalls.map((call) => [
364
+ call.client,
365
+ call.method || 'N/A',
366
+ call.url,
367
+ `${call.file}:${call.line}`,
368
+ ]);
369
+ const wsRows = signals.websockets.map((item) => [
370
+ item.library,
371
+ item.detail,
372
+ `${item.file}:${item.line}`,
373
+ ]);
374
+ const socketRows = signals.socketEvents.map((event) => [
375
+ event.action,
376
+ event.event,
377
+ `${event.file}:${event.line}`,
378
+ ]);
379
+ const hookRows = signals.hooks.map((hook) => [hook.kind, hook.name, `${hook.file}:${hook.line}`]);
380
+ return [
381
+ tableOrFallback('## Routes', ['Method', 'Path', 'File', 'Source'], routeRows),
382
+ tableOrFallback('## API Calls', ['Client', 'Method', 'URL', 'File'], apiRows),
383
+ tableOrFallback('## WebSockets', ['Library', 'Detail', 'File'], wsRows),
384
+ tableOrFallback('## Socket Events', ['Action', 'Event', 'File'], socketRows),
385
+ tableOrFallback('## Hooks', ['Kind', 'Name', 'File'], hookRows),
386
+ ].join('\n');
387
+ }
388
+ //# sourceMappingURL=architecture-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture-extractor.js","sourceRoot":"","sources":["../../../src/codebase/generators/architecture-extractor.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,2 @@
1
- /**
2
- * Generate architecture documentation template
3
- */
4
- export declare function generateArchitecture(): string;
1
+ import type { FileNode } from '../scanners/filesystem.js';
2
+ export declare function generateArchitecture(structure: FileNode, projectRoot: string): string;
@@ -1,33 +1,126 @@
1
- /**
2
- * Generate architecture documentation template
3
- */
4
- export function generateArchitecture() {
5
- return `# Architecture
6
-
7
- ## Directory Structure
8
-
9
- | Layer | Description |
10
- |-------|-------------|
11
- | \`src/\` | Main source code |
12
- | \`components/\` | Reusable UI components |
13
- | \`hooks/\` | Custom React hooks |
14
- | \`utils/\` | Utility functions |
15
- | \`services/\` | API services |
16
- | \`types/\` | TypeScript definitions |
17
-
18
- ## Data Flow
19
-
20
- _Describe how data flows through your application._
21
-
22
- ## Key Patterns
23
-
24
- - **Component Pattern**: Presentational + Container components
25
- - **State Management**: _Describe your approach_
26
- - **API Layer**: _Describe your API patterns_
27
-
28
- ## Dependencies
29
-
30
- _Describe key dependencies and their purposes._
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { extractArchitectureSignals, renderArchitectureSignalsMarkdown, } from './architecture-extractor.js';
4
+ function describeLayer(name) {
5
+ const key = name.toLowerCase();
6
+ if (key === 'src')
7
+ return 'Primary application and CLI source code';
8
+ if (key === 'tests')
9
+ return 'Automated tests and fixtures';
10
+ if (key === 'docs')
11
+ return 'Project documentation';
12
+ if (key === 'integrations')
13
+ return 'Tool and ecosystem integrations';
14
+ if (key === 'scripts')
15
+ return 'Operational and helper scripts';
16
+ if (key === 'memory')
17
+ return 'Manual memory/context assets';
18
+ if (key === '.devmind')
19
+ return 'Generated context artifacts';
20
+ if (key === 'dist')
21
+ return 'Build output';
22
+ return 'Project module/directory';
23
+ }
24
+ function topLevelDirectoryTable(structure) {
25
+ const directories = (structure.children || [])
26
+ .filter((node) => node.type === 'directory')
27
+ .map((node) => node.name)
28
+ .sort((a, b) => a.localeCompare(b));
29
+ if (directories.length === 0)
30
+ return '_No top-level directories detected._';
31
+ const rows = directories.map((name) => `| \`${name}/\` | ${describeLayer(name)} |`);
32
+ return ['| Layer | Description |', '|---|---|', ...rows].join('\n');
33
+ }
34
+ function summarizeDataFlow(signals) {
35
+ const parts = [];
36
+ if (signals.routes.length > 0)
37
+ parts.push(`${signals.routes.length} route signal(s)`);
38
+ if (signals.apiCalls.length > 0)
39
+ parts.push(`${signals.apiCalls.length} API call site(s)`);
40
+ if (signals.websockets.length > 0)
41
+ parts.push(`${signals.websockets.length} websocket setup(s)`);
42
+ if (signals.socketEvents.length > 0)
43
+ parts.push(`${signals.socketEvents.length} socket event usage(s)`);
44
+ if (signals.hooks.length > 0)
45
+ parts.push(`${signals.hooks.length} hook usage(s)`);
46
+ if (parts.length === 0) {
47
+ return 'No major runtime interaction signals were detected in source files.';
48
+ }
49
+ return `Detected ${parts.join(', ')}.`;
50
+ }
51
+ function summarizePatterns(signals) {
52
+ const lines = [];
53
+ if (signals.routes.some((route) => route.source === 'express')) {
54
+ lines.push('- HTTP route handlers via Express/router method declarations');
55
+ }
56
+ if (signals.routes.some((route) => route.source === 'next')) {
57
+ lines.push('- File-based or handler-based routing patterns consistent with Next.js');
58
+ }
59
+ if (signals.routes.some((route) => route.source === 'react-router')) {
60
+ lines.push('- Client-side route declarations consistent with React Router');
61
+ }
62
+ if (signals.apiCalls.length > 0) {
63
+ lines.push('- External/internal API integrations via `fetch`, `axios`, or client wrappers');
64
+ }
65
+ if (signals.websockets.length > 0 || signals.socketEvents.length > 0) {
66
+ lines.push('- Realtime communication patterns via WebSocket/socket events');
67
+ }
68
+ if (signals.hooks.some((hook) => hook.kind === 'custom')) {
69
+ lines.push('- Custom hook abstractions used in React code');
70
+ }
71
+ if (lines.length === 0) {
72
+ return '- No strong architectural patterns auto-detected from code signals.';
73
+ }
74
+ return lines.join('\n');
75
+ }
76
+ function dependencySummary(rootPath) {
77
+ const packagePath = path.join(rootPath, 'package.json');
78
+ if (!fs.existsSync(packagePath))
79
+ return '_No package.json found._';
80
+ try {
81
+ const parsed = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));
82
+ const dependencies = Object.keys(parsed.dependencies || {});
83
+ const devDependencies = Object.keys(parsed.devDependencies || {});
84
+ const topDependencies = dependencies.slice(0, 12);
85
+ const topDevDependencies = devDependencies.slice(0, 12);
86
+ const lines = [];
87
+ lines.push(`- Runtime dependencies: ${dependencies.length}`);
88
+ if (topDependencies.length > 0) {
89
+ lines.push(`- Key runtime packages: ${topDependencies.map((name) => `\`${name}\``).join(', ')}`);
90
+ }
91
+ lines.push(`- Dev dependencies: ${devDependencies.length}`);
92
+ if (topDevDependencies.length > 0) {
93
+ lines.push(`- Key dev packages: ${topDevDependencies.map((name) => `\`${name}\``).join(', ')}`);
94
+ }
95
+ return lines.join('\n');
96
+ }
97
+ catch {
98
+ return '_Failed to parse package.json dependencies._';
99
+ }
100
+ }
101
+ export function generateArchitecture(structure, projectRoot) {
102
+ const signals = extractArchitectureSignals(projectRoot);
103
+ return `# Architecture
104
+
105
+ ## Directory Structure
106
+
107
+ ${topLevelDirectoryTable(structure)}
108
+
109
+ ## Data Flow
110
+
111
+ ${summarizeDataFlow(signals)}
112
+
113
+ ## Key Patterns
114
+
115
+ ${summarizePatterns(signals)}
116
+
117
+ ## Runtime Interaction Signals
118
+
119
+ ${renderArchitectureSignalsMarkdown(signals)}
120
+
121
+ ## Dependencies
122
+
123
+ ${dependencySummary(projectRoot)}
31
124
  `;
32
125
  }
33
126
  //# sourceMappingURL=architecture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"architecture.js","sourceRoot":"","sources":["../../../src/codebase/generators/architecture.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"architecture.js","sourceRoot":"","sources":["../../../src/codebase/generators/architecture.ts"],"names":[],"mappings":"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"}
@@ -14,14 +14,14 @@ export function generateModuleDocs(structure, outputDir) {
14
14
  .map((child) => generateSkeleton(child))
15
15
  .join('\n\n');
16
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}
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
25
  `;
26
26
  const relativePath = path.join('03-modules', currentPath, node.name);
27
27
  const fullPath = path.join(outputDir, relativePath, 'README.md');