spec-gen-cli 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 (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1078 -0
  3. package/dist/api/analyze.d.ts +17 -0
  4. package/dist/api/analyze.d.ts.map +1 -0
  5. package/dist/api/analyze.js +109 -0
  6. package/dist/api/analyze.js.map +1 -0
  7. package/dist/api/drift.d.ts +21 -0
  8. package/dist/api/drift.d.ts.map +1 -0
  9. package/dist/api/drift.js +145 -0
  10. package/dist/api/drift.js.map +1 -0
  11. package/dist/api/generate.d.ts +18 -0
  12. package/dist/api/generate.d.ts.map +1 -0
  13. package/dist/api/generate.js +251 -0
  14. package/dist/api/generate.js.map +1 -0
  15. package/dist/api/index.d.ts +39 -0
  16. package/dist/api/index.d.ts.map +1 -0
  17. package/dist/api/index.js +32 -0
  18. package/dist/api/index.js.map +1 -0
  19. package/dist/api/init.d.ts +18 -0
  20. package/dist/api/init.d.ts.map +1 -0
  21. package/dist/api/init.js +82 -0
  22. package/dist/api/init.js.map +1 -0
  23. package/dist/api/run.d.ts +19 -0
  24. package/dist/api/run.d.ts.map +1 -0
  25. package/dist/api/run.js +291 -0
  26. package/dist/api/run.js.map +1 -0
  27. package/dist/api/specs.d.ts +49 -0
  28. package/dist/api/specs.d.ts.map +1 -0
  29. package/dist/api/specs.js +136 -0
  30. package/dist/api/specs.js.map +1 -0
  31. package/dist/api/types.d.ts +176 -0
  32. package/dist/api/types.d.ts.map +1 -0
  33. package/dist/api/types.js +9 -0
  34. package/dist/api/types.js.map +1 -0
  35. package/dist/api/verify.d.ts +20 -0
  36. package/dist/api/verify.d.ts.map +1 -0
  37. package/dist/api/verify.js +117 -0
  38. package/dist/api/verify.js.map +1 -0
  39. package/dist/cli/commands/analyze.d.ts +27 -0
  40. package/dist/cli/commands/analyze.d.ts.map +1 -0
  41. package/dist/cli/commands/analyze.js +485 -0
  42. package/dist/cli/commands/analyze.js.map +1 -0
  43. package/dist/cli/commands/drift.d.ts +9 -0
  44. package/dist/cli/commands/drift.d.ts.map +1 -0
  45. package/dist/cli/commands/drift.js +540 -0
  46. package/dist/cli/commands/drift.js.map +1 -0
  47. package/dist/cli/commands/generate.d.ts +9 -0
  48. package/dist/cli/commands/generate.d.ts.map +1 -0
  49. package/dist/cli/commands/generate.js +633 -0
  50. package/dist/cli/commands/generate.js.map +1 -0
  51. package/dist/cli/commands/init.d.ts +9 -0
  52. package/dist/cli/commands/init.d.ts.map +1 -0
  53. package/dist/cli/commands/init.js +171 -0
  54. package/dist/cli/commands/init.js.map +1 -0
  55. package/dist/cli/commands/mcp.d.ts +638 -0
  56. package/dist/cli/commands/mcp.d.ts.map +1 -0
  57. package/dist/cli/commands/mcp.js +574 -0
  58. package/dist/cli/commands/mcp.js.map +1 -0
  59. package/dist/cli/commands/run.d.ts +24 -0
  60. package/dist/cli/commands/run.d.ts.map +1 -0
  61. package/dist/cli/commands/run.js +546 -0
  62. package/dist/cli/commands/run.js.map +1 -0
  63. package/dist/cli/commands/verify.d.ts +9 -0
  64. package/dist/cli/commands/verify.d.ts.map +1 -0
  65. package/dist/cli/commands/verify.js +417 -0
  66. package/dist/cli/commands/verify.js.map +1 -0
  67. package/dist/cli/commands/view.d.ts +9 -0
  68. package/dist/cli/commands/view.d.ts.map +1 -0
  69. package/dist/cli/commands/view.js +511 -0
  70. package/dist/cli/commands/view.js.map +1 -0
  71. package/dist/cli/index.d.ts +9 -0
  72. package/dist/cli/index.d.ts.map +1 -0
  73. package/dist/cli/index.js +83 -0
  74. package/dist/cli/index.js.map +1 -0
  75. package/dist/core/analyzer/architecture-writer.d.ts +67 -0
  76. package/dist/core/analyzer/architecture-writer.d.ts.map +1 -0
  77. package/dist/core/analyzer/architecture-writer.js +209 -0
  78. package/dist/core/analyzer/architecture-writer.js.map +1 -0
  79. package/dist/core/analyzer/artifact-generator.d.ts +222 -0
  80. package/dist/core/analyzer/artifact-generator.d.ts.map +1 -0
  81. package/dist/core/analyzer/artifact-generator.js +726 -0
  82. package/dist/core/analyzer/artifact-generator.js.map +1 -0
  83. package/dist/core/analyzer/call-graph.d.ts +83 -0
  84. package/dist/core/analyzer/call-graph.d.ts.map +1 -0
  85. package/dist/core/analyzer/call-graph.js +827 -0
  86. package/dist/core/analyzer/call-graph.js.map +1 -0
  87. package/dist/core/analyzer/code-shaper.d.ts +33 -0
  88. package/dist/core/analyzer/code-shaper.d.ts.map +1 -0
  89. package/dist/core/analyzer/code-shaper.js +149 -0
  90. package/dist/core/analyzer/code-shaper.js.map +1 -0
  91. package/dist/core/analyzer/dependency-graph.d.ts +179 -0
  92. package/dist/core/analyzer/dependency-graph.d.ts.map +1 -0
  93. package/dist/core/analyzer/dependency-graph.js +574 -0
  94. package/dist/core/analyzer/dependency-graph.js.map +1 -0
  95. package/dist/core/analyzer/duplicate-detector.d.ts +52 -0
  96. package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -0
  97. package/dist/core/analyzer/duplicate-detector.js +279 -0
  98. package/dist/core/analyzer/duplicate-detector.js.map +1 -0
  99. package/dist/core/analyzer/embedding-service.d.ts +50 -0
  100. package/dist/core/analyzer/embedding-service.d.ts.map +1 -0
  101. package/dist/core/analyzer/embedding-service.js +104 -0
  102. package/dist/core/analyzer/embedding-service.js.map +1 -0
  103. package/dist/core/analyzer/file-walker.d.ts +78 -0
  104. package/dist/core/analyzer/file-walker.d.ts.map +1 -0
  105. package/dist/core/analyzer/file-walker.js +531 -0
  106. package/dist/core/analyzer/file-walker.js.map +1 -0
  107. package/dist/core/analyzer/import-parser.d.ts +91 -0
  108. package/dist/core/analyzer/import-parser.d.ts.map +1 -0
  109. package/dist/core/analyzer/import-parser.js +720 -0
  110. package/dist/core/analyzer/import-parser.js.map +1 -0
  111. package/dist/core/analyzer/index.d.ts +10 -0
  112. package/dist/core/analyzer/index.d.ts.map +1 -0
  113. package/dist/core/analyzer/index.js +10 -0
  114. package/dist/core/analyzer/index.js.map +1 -0
  115. package/dist/core/analyzer/refactor-analyzer.d.ts +80 -0
  116. package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -0
  117. package/dist/core/analyzer/refactor-analyzer.js +339 -0
  118. package/dist/core/analyzer/refactor-analyzer.js.map +1 -0
  119. package/dist/core/analyzer/repository-mapper.d.ts +150 -0
  120. package/dist/core/analyzer/repository-mapper.d.ts.map +1 -0
  121. package/dist/core/analyzer/repository-mapper.js +731 -0
  122. package/dist/core/analyzer/repository-mapper.js.map +1 -0
  123. package/dist/core/analyzer/signature-extractor.d.ts +31 -0
  124. package/dist/core/analyzer/signature-extractor.d.ts.map +1 -0
  125. package/dist/core/analyzer/signature-extractor.js +387 -0
  126. package/dist/core/analyzer/signature-extractor.js.map +1 -0
  127. package/dist/core/analyzer/significance-scorer.d.ts +79 -0
  128. package/dist/core/analyzer/significance-scorer.d.ts.map +1 -0
  129. package/dist/core/analyzer/significance-scorer.js +407 -0
  130. package/dist/core/analyzer/significance-scorer.js.map +1 -0
  131. package/dist/core/analyzer/subgraph-extractor.d.ts +43 -0
  132. package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -0
  133. package/dist/core/analyzer/subgraph-extractor.js +129 -0
  134. package/dist/core/analyzer/subgraph-extractor.js.map +1 -0
  135. package/dist/core/analyzer/vector-index.d.ts +63 -0
  136. package/dist/core/analyzer/vector-index.d.ts.map +1 -0
  137. package/dist/core/analyzer/vector-index.js +169 -0
  138. package/dist/core/analyzer/vector-index.js.map +1 -0
  139. package/dist/core/drift/drift-detector.d.ts +102 -0
  140. package/dist/core/drift/drift-detector.d.ts.map +1 -0
  141. package/dist/core/drift/drift-detector.js +597 -0
  142. package/dist/core/drift/drift-detector.js.map +1 -0
  143. package/dist/core/drift/git-diff.d.ts +55 -0
  144. package/dist/core/drift/git-diff.d.ts.map +1 -0
  145. package/dist/core/drift/git-diff.js +356 -0
  146. package/dist/core/drift/git-diff.js.map +1 -0
  147. package/dist/core/drift/index.d.ts +12 -0
  148. package/dist/core/drift/index.d.ts.map +1 -0
  149. package/dist/core/drift/index.js +9 -0
  150. package/dist/core/drift/index.js.map +1 -0
  151. package/dist/core/drift/spec-mapper.d.ts +73 -0
  152. package/dist/core/drift/spec-mapper.d.ts.map +1 -0
  153. package/dist/core/drift/spec-mapper.js +353 -0
  154. package/dist/core/drift/spec-mapper.js.map +1 -0
  155. package/dist/core/generator/adr-generator.d.ts +32 -0
  156. package/dist/core/generator/adr-generator.d.ts.map +1 -0
  157. package/dist/core/generator/adr-generator.js +192 -0
  158. package/dist/core/generator/adr-generator.js.map +1 -0
  159. package/dist/core/generator/index.d.ts +9 -0
  160. package/dist/core/generator/index.d.ts.map +1 -0
  161. package/dist/core/generator/index.js +12 -0
  162. package/dist/core/generator/index.js.map +1 -0
  163. package/dist/core/generator/mapping-generator.d.ts +54 -0
  164. package/dist/core/generator/mapping-generator.d.ts.map +1 -0
  165. package/dist/core/generator/mapping-generator.js +239 -0
  166. package/dist/core/generator/mapping-generator.js.map +1 -0
  167. package/dist/core/generator/openspec-compat.d.ts +160 -0
  168. package/dist/core/generator/openspec-compat.d.ts.map +1 -0
  169. package/dist/core/generator/openspec-compat.js +523 -0
  170. package/dist/core/generator/openspec-compat.js.map +1 -0
  171. package/dist/core/generator/openspec-format-generator.d.ts +111 -0
  172. package/dist/core/generator/openspec-format-generator.d.ts.map +1 -0
  173. package/dist/core/generator/openspec-format-generator.js +817 -0
  174. package/dist/core/generator/openspec-format-generator.js.map +1 -0
  175. package/dist/core/generator/openspec-writer.d.ts +131 -0
  176. package/dist/core/generator/openspec-writer.d.ts.map +1 -0
  177. package/dist/core/generator/openspec-writer.js +379 -0
  178. package/dist/core/generator/openspec-writer.js.map +1 -0
  179. package/dist/core/generator/prompts.d.ts +35 -0
  180. package/dist/core/generator/prompts.d.ts.map +1 -0
  181. package/dist/core/generator/prompts.js +212 -0
  182. package/dist/core/generator/prompts.js.map +1 -0
  183. package/dist/core/generator/spec-pipeline.d.ts +94 -0
  184. package/dist/core/generator/spec-pipeline.d.ts.map +1 -0
  185. package/dist/core/generator/spec-pipeline.js +474 -0
  186. package/dist/core/generator/spec-pipeline.js.map +1 -0
  187. package/dist/core/generator/stages/stage1-survey.d.ts +19 -0
  188. package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -0
  189. package/dist/core/generator/stages/stage1-survey.js +105 -0
  190. package/dist/core/generator/stages/stage1-survey.js.map +1 -0
  191. package/dist/core/generator/stages/stage2-entities.d.ts +11 -0
  192. package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -0
  193. package/dist/core/generator/stages/stage2-entities.js +67 -0
  194. package/dist/core/generator/stages/stage2-entities.js.map +1 -0
  195. package/dist/core/generator/stages/stage3-services.d.ts +11 -0
  196. package/dist/core/generator/stages/stage3-services.d.ts.map +1 -0
  197. package/dist/core/generator/stages/stage3-services.js +75 -0
  198. package/dist/core/generator/stages/stage3-services.js.map +1 -0
  199. package/dist/core/generator/stages/stage4-api.d.ts +11 -0
  200. package/dist/core/generator/stages/stage4-api.d.ts.map +1 -0
  201. package/dist/core/generator/stages/stage4-api.js +65 -0
  202. package/dist/core/generator/stages/stage4-api.js.map +1 -0
  203. package/dist/core/generator/stages/stage5-architecture.d.ts +10 -0
  204. package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -0
  205. package/dist/core/generator/stages/stage5-architecture.js +62 -0
  206. package/dist/core/generator/stages/stage5-architecture.js.map +1 -0
  207. package/dist/core/generator/stages/stage6-adr.d.ts +8 -0
  208. package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -0
  209. package/dist/core/generator/stages/stage6-adr.js +41 -0
  210. package/dist/core/generator/stages/stage6-adr.js.map +1 -0
  211. package/dist/core/services/chat-agent.d.ts +45 -0
  212. package/dist/core/services/chat-agent.d.ts.map +1 -0
  213. package/dist/core/services/chat-agent.js +310 -0
  214. package/dist/core/services/chat-agent.js.map +1 -0
  215. package/dist/core/services/chat-tools.d.ts +32 -0
  216. package/dist/core/services/chat-tools.d.ts.map +1 -0
  217. package/dist/core/services/chat-tools.js +270 -0
  218. package/dist/core/services/chat-tools.js.map +1 -0
  219. package/dist/core/services/config-manager.d.ts +61 -0
  220. package/dist/core/services/config-manager.d.ts.map +1 -0
  221. package/dist/core/services/config-manager.js +143 -0
  222. package/dist/core/services/config-manager.js.map +1 -0
  223. package/dist/core/services/gitignore-manager.d.ts +29 -0
  224. package/dist/core/services/gitignore-manager.d.ts.map +1 -0
  225. package/dist/core/services/gitignore-manager.js +106 -0
  226. package/dist/core/services/gitignore-manager.js.map +1 -0
  227. package/dist/core/services/index.d.ts +8 -0
  228. package/dist/core/services/index.d.ts.map +1 -0
  229. package/dist/core/services/index.js +8 -0
  230. package/dist/core/services/index.js.map +1 -0
  231. package/dist/core/services/llm-service.d.ts +336 -0
  232. package/dist/core/services/llm-service.d.ts.map +1 -0
  233. package/dist/core/services/llm-service.js +1155 -0
  234. package/dist/core/services/llm-service.js.map +1 -0
  235. package/dist/core/services/mcp-handlers/analysis.d.ts +42 -0
  236. package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -0
  237. package/dist/core/services/mcp-handlers/analysis.js +300 -0
  238. package/dist/core/services/mcp-handlers/analysis.js.map +1 -0
  239. package/dist/core/services/mcp-handlers/graph.d.ts +65 -0
  240. package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -0
  241. package/dist/core/services/mcp-handlers/graph.js +509 -0
  242. package/dist/core/services/mcp-handlers/graph.js.map +1 -0
  243. package/dist/core/services/mcp-handlers/semantic.d.ts +38 -0
  244. package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -0
  245. package/dist/core/services/mcp-handlers/semantic.js +172 -0
  246. package/dist/core/services/mcp-handlers/semantic.js.map +1 -0
  247. package/dist/core/services/mcp-handlers/utils.d.ts +21 -0
  248. package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -0
  249. package/dist/core/services/mcp-handlers/utils.js +62 -0
  250. package/dist/core/services/mcp-handlers/utils.js.map +1 -0
  251. package/dist/core/services/project-detector.d.ts +32 -0
  252. package/dist/core/services/project-detector.d.ts.map +1 -0
  253. package/dist/core/services/project-detector.js +111 -0
  254. package/dist/core/services/project-detector.js.map +1 -0
  255. package/dist/core/verifier/index.d.ts +5 -0
  256. package/dist/core/verifier/index.d.ts.map +1 -0
  257. package/dist/core/verifier/index.js +5 -0
  258. package/dist/core/verifier/index.js.map +1 -0
  259. package/dist/core/verifier/verification-engine.d.ts +226 -0
  260. package/dist/core/verifier/verification-engine.d.ts.map +1 -0
  261. package/dist/core/verifier/verification-engine.js +681 -0
  262. package/dist/core/verifier/verification-engine.js.map +1 -0
  263. package/dist/types/index.d.ts +252 -0
  264. package/dist/types/index.d.ts.map +1 -0
  265. package/dist/types/index.js +5 -0
  266. package/dist/types/index.js.map +1 -0
  267. package/dist/types/pipeline.d.ts +148 -0
  268. package/dist/types/pipeline.d.ts.map +1 -0
  269. package/dist/types/pipeline.js +5 -0
  270. package/dist/types/pipeline.js.map +1 -0
  271. package/dist/utils/errors.d.ts +51 -0
  272. package/dist/utils/errors.d.ts.map +1 -0
  273. package/dist/utils/errors.js +128 -0
  274. package/dist/utils/errors.js.map +1 -0
  275. package/dist/utils/logger.d.ts +149 -0
  276. package/dist/utils/logger.d.ts.map +1 -0
  277. package/dist/utils/logger.js +331 -0
  278. package/dist/utils/logger.js.map +1 -0
  279. package/dist/utils/progress.d.ts +142 -0
  280. package/dist/utils/progress.d.ts.map +1 -0
  281. package/dist/utils/progress.js +280 -0
  282. package/dist/utils/progress.js.map +1 -0
  283. package/dist/utils/prompts.d.ts +53 -0
  284. package/dist/utils/prompts.d.ts.map +1 -0
  285. package/dist/utils/prompts.js +199 -0
  286. package/dist/utils/prompts.js.map +1 -0
  287. package/dist/utils/shutdown.d.ts +89 -0
  288. package/dist/utils/shutdown.d.ts.map +1 -0
  289. package/dist/utils/shutdown.js +237 -0
  290. package/dist/utils/shutdown.js.map +1 -0
  291. package/package.json +114 -0
  292. package/src/viewer/InteractiveGraphViewer.jsx +1486 -0
  293. package/src/viewer/app/index.html +17 -0
  294. package/src/viewer/app/main.jsx +13 -0
  295. package/src/viewer/components/ArchitectureView.jsx +177 -0
  296. package/src/viewer/components/ChatPanel.jsx +448 -0
  297. package/src/viewer/components/ClusterGraph.jsx +441 -0
  298. package/src/viewer/components/FilterBar.jsx +179 -0
  299. package/src/viewer/components/FlatGraph.jsx +275 -0
  300. package/src/viewer/components/MicroComponents.jsx +83 -0
  301. package/src/viewer/hooks/usePanZoom.js +79 -0
  302. package/src/viewer/utils/constants.js +47 -0
  303. package/src/viewer/utils/graph-helpers.js +291 -0
@@ -0,0 +1,531 @@
1
+ /**
2
+ * FileWalker Service
3
+ *
4
+ * Traverses the codebase intelligently, filtering noise and respecting ignore patterns.
5
+ * Collects metadata about each file for significance scoring and analysis.
6
+ */
7
+ import { opendir, readFile, stat } from 'node:fs/promises';
8
+ import { join, relative, basename, extname, dirname } from 'node:path';
9
+ import ignoreModule from 'ignore';
10
+ const ignore = ignoreModule.default ?? ignoreModule;
11
+ /**
12
+ * Built-in directories to always skip
13
+ */
14
+ const SKIP_DIRECTORIES = new Set([
15
+ 'node_modules',
16
+ '.git',
17
+ '.svn',
18
+ '.hg',
19
+ 'dist',
20
+ 'build',
21
+ 'out',
22
+ 'target',
23
+ 'bin',
24
+ 'obj',
25
+ '.cache',
26
+ '.tmp',
27
+ '.temp',
28
+ '__pycache__',
29
+ '.pytest_cache',
30
+ 'coverage',
31
+ '.nyc_output',
32
+ '.coverage',
33
+ '.idea',
34
+ '.vscode',
35
+ '.vs',
36
+ 'openspec',
37
+ '.spec-gen',
38
+ ]);
39
+ /**
40
+ * Directories to skip only when not at root level
41
+ */
42
+ const SKIP_DIRECTORIES_NOT_ROOT = new Set([
43
+ 'vendor',
44
+ 'deps',
45
+ 'packages',
46
+ ]);
47
+ /**
48
+ * File extensions to always skip (binary/generated files)
49
+ */
50
+ const SKIP_EXTENSIONS = new Set([
51
+ // Lock files
52
+ '.lock',
53
+ '.lockb',
54
+ // Minified/bundled
55
+ '.min.js',
56
+ '.min.css',
57
+ '.bundle.js',
58
+ '.chunk.js',
59
+ // Source maps
60
+ '.map',
61
+ // Images
62
+ '.png',
63
+ '.jpg',
64
+ '.jpeg',
65
+ '.gif',
66
+ '.svg',
67
+ '.ico',
68
+ '.webp',
69
+ '.bmp',
70
+ // Fonts
71
+ '.woff',
72
+ '.woff2',
73
+ '.ttf',
74
+ '.eot',
75
+ '.otf',
76
+ // Media
77
+ '.mp3',
78
+ '.mp4',
79
+ '.wav',
80
+ '.avi',
81
+ '.mov',
82
+ '.webm',
83
+ // Documents
84
+ '.pdf',
85
+ '.doc',
86
+ '.docx',
87
+ '.xls',
88
+ '.xlsx',
89
+ // Archives
90
+ '.zip',
91
+ '.tar',
92
+ '.gz',
93
+ '.rar',
94
+ '.7z',
95
+ // Compiled
96
+ '.pyc',
97
+ '.pyo',
98
+ '.class',
99
+ '.o',
100
+ '.so',
101
+ '.dll',
102
+ '.exe',
103
+ ]);
104
+ /**
105
+ * Specific filenames to always skip
106
+ */
107
+ const SKIP_FILENAMES = new Set([
108
+ 'package-lock.json',
109
+ 'pnpm-lock.yaml',
110
+ 'yarn.lock',
111
+ '.DS_Store',
112
+ 'Thumbs.db',
113
+ ]);
114
+ /**
115
+ * Entry point file name patterns (without extension)
116
+ */
117
+ const ENTRY_POINT_NAMES = new Set([
118
+ 'index',
119
+ 'main',
120
+ 'app',
121
+ 'server',
122
+ 'cli',
123
+ 'entry',
124
+ ]);
125
+ /**
126
+ * Configuration file name patterns
127
+ */
128
+ const CONFIG_PATTERNS = [
129
+ /^\..*rc$/,
130
+ /^\..*rc\.js$/,
131
+ /^\..*rc\.json$/,
132
+ /^\..*rc\.yaml$/,
133
+ /^\..*rc\.yml$/,
134
+ /config\./,
135
+ /\.config\./,
136
+ /settings\./,
137
+ /^tsconfig.*\.json$/,
138
+ /^package\.json$/,
139
+ /^pyproject\.toml$/,
140
+ /^Cargo\.toml$/,
141
+ /^go\.mod$/,
142
+ /^Gemfile$/,
143
+ /^composer\.json$/,
144
+ ];
145
+ /**
146
+ * Test file/directory patterns
147
+ */
148
+ const TEST_DIR_PATTERNS = [
149
+ /\/test\//,
150
+ /\/tests\//,
151
+ /\/__tests__\//,
152
+ /\/spec\//,
153
+ /\/specs\//,
154
+ /^test\//,
155
+ /^tests\//,
156
+ /^__tests__\//,
157
+ /^spec\//,
158
+ /^specs\//,
159
+ ];
160
+ const TEST_FILE_PATTERNS = [
161
+ /\.test\.[^.]+$/,
162
+ /\.spec\.[^.]+$/,
163
+ /_test\.[^.]+$/,
164
+ /_spec\.[^.]+$/,
165
+ /^test_.*\.[^.]+$/,
166
+ /^spec_.*\.[^.]+$/,
167
+ ];
168
+ /** Maximum file size to read for line counting / shebang detection (10 MB). */
169
+ const MAX_READ_SIZE = 10_000_000;
170
+ /**
171
+ * Check if a file has a shebang line
172
+ */
173
+ async function hasShebang(filePath) {
174
+ try {
175
+ const s = await stat(filePath);
176
+ if (s.size > MAX_READ_SIZE)
177
+ return false;
178
+ const content = await readFile(filePath, { encoding: 'utf-8', flag: 'r' });
179
+ return content.startsWith('#!');
180
+ }
181
+ catch {
182
+ return false;
183
+ }
184
+ }
185
+ /**
186
+ * Count lines in a file. Returns -1 for files larger than MAX_READ_SIZE.
187
+ */
188
+ async function countLines(filePath) {
189
+ try {
190
+ const s = await stat(filePath);
191
+ if (s.size > MAX_READ_SIZE)
192
+ return -1;
193
+ const content = await readFile(filePath, 'utf-8');
194
+ return content.split('\n').length;
195
+ }
196
+ catch {
197
+ return 0;
198
+ }
199
+ }
200
+ /**
201
+ * Check if file path matches test patterns
202
+ */
203
+ function isTestFile(relativePath, fileName) {
204
+ // Check directory patterns
205
+ for (const pattern of TEST_DIR_PATTERNS) {
206
+ if (pattern.test(relativePath)) {
207
+ return true;
208
+ }
209
+ }
210
+ // Check file name patterns
211
+ for (const pattern of TEST_FILE_PATTERNS) {
212
+ if (pattern.test(fileName)) {
213
+ return true;
214
+ }
215
+ }
216
+ return false;
217
+ }
218
+ /**
219
+ * Check if file is a configuration file
220
+ */
221
+ function isConfigFile(fileName) {
222
+ for (const pattern of CONFIG_PATTERNS) {
223
+ if (pattern.test(fileName)) {
224
+ return true;
225
+ }
226
+ }
227
+ return false;
228
+ }
229
+ /**
230
+ * Check if file is likely generated
231
+ */
232
+ function isGeneratedFile(fileName, relativePath) {
233
+ // Check common generated file patterns
234
+ if (fileName.endsWith('.d.ts'))
235
+ return true;
236
+ if (fileName.endsWith('.generated.ts'))
237
+ return true;
238
+ if (fileName.endsWith('.generated.js'))
239
+ return true;
240
+ if (relativePath.includes('/generated/'))
241
+ return true;
242
+ if (relativePath.includes('/__generated__/'))
243
+ return true;
244
+ return false;
245
+ }
246
+ /**
247
+ * Check if file might be an entry point
248
+ */
249
+ async function isEntryPoint(fileName, relativePath, absolutePath, depth) {
250
+ const nameWithoutExt = basename(fileName, extname(fileName));
251
+ // Check if name matches entry point patterns
252
+ if (ENTRY_POINT_NAMES.has(nameWithoutExt.toLowerCase())) {
253
+ return true;
254
+ }
255
+ // Files in src/, lib/, bin/ at depth 1 might be entry points
256
+ if (depth === 1) {
257
+ const dir = dirname(relativePath);
258
+ if (['src', 'lib', 'bin'].includes(dir)) {
259
+ return true;
260
+ }
261
+ }
262
+ // Check for shebang
263
+ if (await hasShebang(absolutePath)) {
264
+ return true;
265
+ }
266
+ return false;
267
+ }
268
+ /**
269
+ * Load and combine ignore patterns
270
+ */
271
+ async function loadIgnorePatterns(rootPath) {
272
+ const ig = ignore();
273
+ // Add built-in patterns for directories
274
+ for (const dir of SKIP_DIRECTORIES) {
275
+ ig.add(`${dir}/`);
276
+ }
277
+ // Add built-in patterns for files
278
+ for (const ext of SKIP_EXTENSIONS) {
279
+ ig.add(`*${ext}`);
280
+ }
281
+ for (const filename of SKIP_FILENAMES) {
282
+ ig.add(filename);
283
+ }
284
+ // Load .gitignore
285
+ try {
286
+ const gitignorePath = join(rootPath, '.gitignore');
287
+ const gitignoreContent = await readFile(gitignorePath, 'utf-8');
288
+ ig.add(gitignoreContent);
289
+ }
290
+ catch {
291
+ // .gitignore not found, continue without it
292
+ }
293
+ // Load .spec-gen-ignore (optional)
294
+ try {
295
+ const specGenIgnorePath = join(rootPath, '.spec-gen-ignore');
296
+ const specGenIgnoreContent = await readFile(specGenIgnorePath, 'utf-8');
297
+ ig.add(specGenIgnoreContent);
298
+ }
299
+ catch {
300
+ // .spec-gen-ignore not found, continue without it
301
+ }
302
+ return ig;
303
+ }
304
+ /**
305
+ * FileWalker class for traversing codebases
306
+ */
307
+ export class FileWalker {
308
+ rootPath;
309
+ options;
310
+ ig = null;
311
+ /** Separate ignore instance used to check if a file matches includePatterns. */
312
+ igInclude = null;
313
+ files = [];
314
+ skippedCount = 0;
315
+ skippedReasons = {};
316
+ directoriesScanned = 0;
317
+ extensionCounts = {};
318
+ directoryCounts = {};
319
+ constructor(rootPath, options = {}) {
320
+ this.rootPath = rootPath;
321
+ this.options = {
322
+ maxFiles: options.maxFiles ?? 500,
323
+ includePatterns: options.includePatterns ?? [],
324
+ excludePatterns: options.excludePatterns ?? [],
325
+ onProgress: options.onProgress ?? (() => { }),
326
+ signal: options.signal ?? new AbortController().signal,
327
+ concurrency: options.concurrency ?? 10,
328
+ };
329
+ }
330
+ /**
331
+ * Record a skipped file with reason
332
+ */
333
+ recordSkip(reason) {
334
+ this.skippedCount++;
335
+ this.skippedReasons[reason] = (this.skippedReasons[reason] ?? 0) + 1;
336
+ }
337
+ /**
338
+ * Check if we should skip a directory
339
+ */
340
+ shouldSkipDirectory(dirName, depth, relativeDir) {
341
+ // Always skip these directories
342
+ if (SKIP_DIRECTORIES.has(dirName)) {
343
+ return true;
344
+ }
345
+ // Skip these only when not at root
346
+ if (depth > 0 && SKIP_DIRECTORIES_NOT_ROOT.has(dirName)) {
347
+ return true;
348
+ }
349
+ // Check exclude patterns against relative path
350
+ if (relativeDir) {
351
+ for (const pattern of this.options.excludePatterns) {
352
+ const normalized = pattern.replace(/\/\*\*$/, '').replace(/\/$/, '');
353
+ if (relativeDir === normalized || relativeDir.startsWith(normalized + '/')) {
354
+ return true;
355
+ }
356
+ }
357
+ }
358
+ return false;
359
+ }
360
+ /**
361
+ * Check if we should skip a file
362
+ */
363
+ shouldSkipFile(relativePath, _fileName) {
364
+ // includePatterns override all exclusions — check first
365
+ if (this.igInclude && this.igInclude.ignores(relativePath)) {
366
+ return false;
367
+ }
368
+ // Check against ignore patterns (gitignore + excludePatterns)
369
+ if (this.ig && this.ig.ignores(relativePath)) {
370
+ return true;
371
+ }
372
+ // Check exclude patterns against relative path (direct prefix match)
373
+ for (const pattern of this.options.excludePatterns) {
374
+ const normalized = pattern.replace(/\/\*\*$/, '').replace(/\/$/, '');
375
+ if (relativePath === normalized || relativePath.startsWith(normalized + '/')) {
376
+ return true;
377
+ }
378
+ }
379
+ return false;
380
+ }
381
+ /**
382
+ * Walk a directory recursively
383
+ */
384
+ async walkDirectory(dirPath, depth) {
385
+ // Check for cancellation
386
+ if (this.options.signal.aborted) {
387
+ return;
388
+ }
389
+ // Check if we've reached max files
390
+ if (this.files.length >= this.options.maxFiles) {
391
+ return;
392
+ }
393
+ this.directoriesScanned++;
394
+ const relativeDirPath = relative(this.rootPath, dirPath);
395
+ // Report progress
396
+ this.options.onProgress({
397
+ filesFound: this.files.length,
398
+ directoriesScanned: this.directoriesScanned,
399
+ currentPath: relativeDirPath || '.',
400
+ });
401
+ try {
402
+ const dir = await opendir(dirPath);
403
+ const entries = [];
404
+ for await (const entry of dir) {
405
+ entries.push({
406
+ name: entry.name,
407
+ isDirectory: entry.isDirectory(),
408
+ isFile: entry.isFile(),
409
+ });
410
+ }
411
+ // Process directories first, then files
412
+ const directories = entries.filter((e) => e.isDirectory);
413
+ const files = entries.filter((e) => e.isFile);
414
+ // Process subdirectories
415
+ for (const entry of directories) {
416
+ if (this.options.signal.aborted)
417
+ break;
418
+ if (this.files.length >= this.options.maxFiles)
419
+ break;
420
+ const subPath = join(dirPath, entry.name);
421
+ const relativeSubPath = relative(this.rootPath, subPath);
422
+ if (this.shouldSkipDirectory(entry.name, depth, relativeSubPath)) {
423
+ this.recordSkip(`directory:${entry.name}`);
424
+ continue;
425
+ }
426
+ // Check against ignore patterns
427
+ if (this.ig && this.ig.ignores(relativeSubPath + '/')) {
428
+ this.recordSkip('gitignore');
429
+ continue;
430
+ }
431
+ await this.walkDirectory(subPath, depth + 1);
432
+ }
433
+ // Process files sequentially to respect maxFiles limit accurately
434
+ for (const entry of files) {
435
+ if (this.options.signal.aborted)
436
+ break;
437
+ if (this.files.length >= this.options.maxFiles)
438
+ break;
439
+ const filePath = join(dirPath, entry.name);
440
+ const relativePath = relative(this.rootPath, filePath);
441
+ if (this.shouldSkipFile(relativePath, entry.name)) {
442
+ this.recordSkip('pattern');
443
+ continue;
444
+ }
445
+ await this.processFile(filePath, relativePath, entry.name, depth);
446
+ }
447
+ }
448
+ catch {
449
+ // Permission denied or other read error, skip this directory
450
+ this.recordSkip('error');
451
+ }
452
+ }
453
+ /**
454
+ * Process a single file and collect metadata
455
+ */
456
+ async processFile(absolutePath, relativePath, fileName, depth) {
457
+ try {
458
+ const fileStat = await stat(absolutePath);
459
+ const extension = extname(fileName);
460
+ const directory = dirname(relativePath);
461
+ const lines = await countLines(absolutePath);
462
+ const metadata = {
463
+ path: relativePath,
464
+ absolutePath,
465
+ name: fileName,
466
+ extension,
467
+ size: fileStat.size,
468
+ lines,
469
+ depth,
470
+ directory: directory === '.' ? '' : directory,
471
+ isEntryPoint: await isEntryPoint(fileName, relativePath, absolutePath, depth),
472
+ isConfig: isConfigFile(fileName),
473
+ isTest: isTestFile(relativePath, fileName),
474
+ isGenerated: isGeneratedFile(fileName, relativePath),
475
+ };
476
+ this.files.push(metadata);
477
+ // Update counts
478
+ const ext = extension || '(no extension)';
479
+ this.extensionCounts[ext] = (this.extensionCounts[ext] ?? 0) + 1;
480
+ const dir = directory === '' || directory === '.' ? '(root)' : directory;
481
+ this.directoryCounts[dir] = (this.directoryCounts[dir] ?? 0) + 1;
482
+ }
483
+ catch {
484
+ this.recordSkip('error');
485
+ }
486
+ }
487
+ /**
488
+ * Walk the codebase and collect file metadata
489
+ */
490
+ async walk() {
491
+ // Load ignore patterns
492
+ this.ig = await loadIgnorePatterns(this.rootPath);
493
+ // Add user-specified exclude patterns
494
+ for (const pattern of this.options.excludePatterns) {
495
+ this.ig.add(pattern);
496
+ }
497
+ // includePatterns override gitignore/excludePatterns at file level.
498
+ // Add them as negated patterns so this.ig lets them through, and
499
+ // build a separate igInclude instance for the direct excludePatterns check.
500
+ if (this.options.includePatterns.length > 0) {
501
+ this.igInclude = ignore();
502
+ for (const pattern of this.options.includePatterns) {
503
+ this.ig.add('!' + pattern);
504
+ this.igInclude.add(pattern);
505
+ }
506
+ }
507
+ // Start walking from root
508
+ await this.walkDirectory(this.rootPath, 0);
509
+ return {
510
+ files: this.files,
511
+ summary: {
512
+ totalFiles: this.files.length,
513
+ totalDirectories: this.directoriesScanned,
514
+ byExtension: this.extensionCounts,
515
+ byDirectory: this.directoryCounts,
516
+ skippedCount: this.skippedCount,
517
+ skippedReasons: this.skippedReasons,
518
+ },
519
+ rootPath: this.rootPath,
520
+ timestamp: new Date().toISOString(),
521
+ };
522
+ }
523
+ }
524
+ /**
525
+ * Convenience function to walk a directory
526
+ */
527
+ export async function walkDirectory(rootPath, options) {
528
+ const walker = new FileWalker(rootPath, options);
529
+ return walker.walk();
530
+ }
531
+ //# sourceMappingURL=file-walker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-walker.js","sourceRoot":"","sources":["../../../src/core/analyzer/file-walker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Import/Export Parser
3
+ *
4
+ * Parses source files to extract imports and exports.
5
+ * Uses regex-based parsing for speed and simplicity.
6
+ * Supports JavaScript/TypeScript and Python.
7
+ */
8
+ /**
9
+ * Information about an import statement
10
+ */
11
+ export interface ImportInfo {
12
+ source: string;
13
+ isRelative: boolean;
14
+ isPackage: boolean;
15
+ isBuiltin: boolean;
16
+ importedNames: string[];
17
+ hasDefault: boolean;
18
+ hasNamespace: boolean;
19
+ isTypeOnly: boolean;
20
+ isDynamic: boolean;
21
+ line: number;
22
+ }
23
+ /**
24
+ * Information about an export statement
25
+ */
26
+ export interface ExportInfo {
27
+ name: string;
28
+ isDefault: boolean;
29
+ isType: boolean;
30
+ isReExport: boolean;
31
+ reExportSource?: string;
32
+ kind: 'function' | 'class' | 'variable' | 'type' | 'interface' | 'enum' | 'unknown';
33
+ line: number;
34
+ }
35
+ /**
36
+ * Complete analysis of a file's imports and exports
37
+ */
38
+ export interface FileAnalysis {
39
+ filePath: string;
40
+ imports: ImportInfo[];
41
+ exports: ExportInfo[];
42
+ localImports: string[];
43
+ externalImports: string[];
44
+ parseErrors: string[];
45
+ }
46
+ /**
47
+ * Options for import resolution
48
+ */
49
+ export interface ResolveOptions {
50
+ /** Base directory for resolving relative imports */
51
+ baseDir: string;
52
+ /** TypeScript paths aliases (from tsconfig) */
53
+ pathAliases?: Record<string, string[]>;
54
+ /** File extensions to try when resolving */
55
+ extensions?: string[];
56
+ }
57
+ /**
58
+ * Resolve a relative import to an absolute file path
59
+ */
60
+ export declare function resolveImport(importSource: string, fromFile: string, options: ResolveOptions): Promise<string | null>;
61
+ /**
62
+ * Import/Export Parser
63
+ */
64
+ export declare class ImportExportParser {
65
+ private cache;
66
+ /**
67
+ * Clear the parse cache
68
+ */
69
+ clearCache(): void;
70
+ /**
71
+ * Get file extension type
72
+ */
73
+ private getFileType;
74
+ /**
75
+ * Parse a file and extract imports/exports
76
+ */
77
+ parseFile(filePath: string): Promise<FileAnalysis>;
78
+ /**
79
+ * Parse multiple files
80
+ */
81
+ parseFiles(filePaths: string[]): Promise<Map<string, FileAnalysis>>;
82
+ }
83
+ /**
84
+ * Convenience function to parse a single file
85
+ */
86
+ export declare function parseFile(filePath: string): Promise<FileAnalysis>;
87
+ /**
88
+ * Convenience function to parse multiple files
89
+ */
90
+ export declare function parseFiles(filePaths: string[]): Promise<Map<string, FileAnalysis>>;
91
+ //# sourceMappingURL=import-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-parser.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/import-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;IACpF,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AA8kBD;;GAEG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsExB;AAMD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAwC;IAErD;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAsDxD;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAU1E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAGvE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAGxF"}