driftdetect-core 0.4.0 → 0.4.2

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 (237) hide show
  1. package/dist/boundaries/boundary-scanner.d.ts +76 -0
  2. package/dist/boundaries/boundary-scanner.d.ts.map +1 -0
  3. package/dist/boundaries/boundary-scanner.js +801 -0
  4. package/dist/boundaries/boundary-scanner.js.map +1 -0
  5. package/dist/boundaries/data-access-learner.d.ts +126 -0
  6. package/dist/boundaries/data-access-learner.d.ts.map +1 -0
  7. package/dist/boundaries/data-access-learner.js +486 -0
  8. package/dist/boundaries/data-access-learner.js.map +1 -0
  9. package/dist/boundaries/index.d.ts +6 -0
  10. package/dist/boundaries/index.d.ts.map +1 -1
  11. package/dist/boundaries/index.js +6 -0
  12. package/dist/boundaries/index.js.map +1 -1
  13. package/dist/boundaries/security-prioritizer.d.ts +118 -0
  14. package/dist/boundaries/security-prioritizer.d.ts.map +1 -0
  15. package/dist/boundaries/security-prioritizer.js +316 -0
  16. package/dist/boundaries/security-prioritizer.js.map +1 -0
  17. package/dist/call-graph/analysis/coverage-analyzer.d.ts +201 -0
  18. package/dist/call-graph/analysis/coverage-analyzer.d.ts.map +1 -0
  19. package/dist/call-graph/analysis/coverage-analyzer.js +553 -0
  20. package/dist/call-graph/analysis/coverage-analyzer.js.map +1 -0
  21. package/dist/call-graph/analysis/dead-code-detector.d.ts +145 -0
  22. package/dist/call-graph/analysis/dead-code-detector.d.ts.map +1 -0
  23. package/dist/call-graph/analysis/dead-code-detector.js +391 -0
  24. package/dist/call-graph/analysis/dead-code-detector.js.map +1 -0
  25. package/dist/call-graph/analysis/graph-builder.d.ts +142 -0
  26. package/dist/call-graph/analysis/graph-builder.d.ts.map +1 -0
  27. package/dist/call-graph/analysis/graph-builder.js +624 -0
  28. package/dist/call-graph/analysis/graph-builder.js.map +1 -0
  29. package/dist/call-graph/analysis/impact-analyzer.d.ts +150 -0
  30. package/dist/call-graph/analysis/impact-analyzer.d.ts.map +1 -0
  31. package/dist/call-graph/analysis/impact-analyzer.js +329 -0
  32. package/dist/call-graph/analysis/impact-analyzer.js.map +1 -0
  33. package/dist/call-graph/analysis/index.d.ts +11 -0
  34. package/dist/call-graph/analysis/index.d.ts.map +1 -0
  35. package/dist/call-graph/analysis/index.js +9 -0
  36. package/dist/call-graph/analysis/index.js.map +1 -0
  37. package/dist/call-graph/analysis/path-finder.d.ts +117 -0
  38. package/dist/call-graph/analysis/path-finder.d.ts.map +1 -0
  39. package/dist/call-graph/analysis/path-finder.js +360 -0
  40. package/dist/call-graph/analysis/path-finder.js.map +1 -0
  41. package/dist/call-graph/analysis/reachability.d.ts +56 -0
  42. package/dist/call-graph/analysis/reachability.d.ts.map +1 -0
  43. package/dist/call-graph/analysis/reachability.js +357 -0
  44. package/dist/call-graph/analysis/reachability.js.map +1 -0
  45. package/dist/call-graph/demo.d.ts +11 -0
  46. package/dist/call-graph/demo.d.ts.map +1 -0
  47. package/dist/call-graph/demo.js +339 -0
  48. package/dist/call-graph/demo.js.map +1 -0
  49. package/dist/call-graph/enrichment/enrichment-engine.d.ts +126 -0
  50. package/dist/call-graph/enrichment/enrichment-engine.d.ts.map +1 -0
  51. package/dist/call-graph/enrichment/enrichment-engine.js +760 -0
  52. package/dist/call-graph/enrichment/enrichment-engine.js.map +1 -0
  53. package/dist/call-graph/enrichment/impact-scorer.d.ts +59 -0
  54. package/dist/call-graph/enrichment/impact-scorer.d.ts.map +1 -0
  55. package/dist/call-graph/enrichment/impact-scorer.js +328 -0
  56. package/dist/call-graph/enrichment/impact-scorer.js.map +1 -0
  57. package/dist/call-graph/enrichment/index.d.ts +12 -0
  58. package/dist/call-graph/enrichment/index.d.ts.map +1 -0
  59. package/dist/call-graph/enrichment/index.js +15 -0
  60. package/dist/call-graph/enrichment/index.js.map +1 -0
  61. package/dist/call-graph/enrichment/remediation-generator.d.ts +41 -0
  62. package/dist/call-graph/enrichment/remediation-generator.d.ts.map +1 -0
  63. package/dist/call-graph/enrichment/remediation-generator.js +609 -0
  64. package/dist/call-graph/enrichment/remediation-generator.js.map +1 -0
  65. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts +71 -0
  66. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts.map +1 -0
  67. package/dist/call-graph/enrichment/sensitivity-classifier.js +454 -0
  68. package/dist/call-graph/enrichment/sensitivity-classifier.js.map +1 -0
  69. package/dist/call-graph/enrichment/types.d.ts +402 -0
  70. package/dist/call-graph/enrichment/types.d.ts.map +1 -0
  71. package/dist/call-graph/enrichment/types.js +9 -0
  72. package/dist/call-graph/enrichment/types.js.map +1 -0
  73. package/dist/call-graph/extractors/base-extractor.d.ts +112 -0
  74. package/dist/call-graph/extractors/base-extractor.d.ts.map +1 -0
  75. package/dist/call-graph/extractors/base-extractor.js +140 -0
  76. package/dist/call-graph/extractors/base-extractor.js.map +1 -0
  77. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts +76 -0
  78. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -0
  79. package/dist/call-graph/extractors/csharp-data-access-extractor.js +387 -0
  80. package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -0
  81. package/dist/call-graph/extractors/csharp-extractor.d.ts +87 -0
  82. package/dist/call-graph/extractors/csharp-extractor.d.ts.map +1 -0
  83. package/dist/call-graph/extractors/csharp-extractor.js +470 -0
  84. package/dist/call-graph/extractors/csharp-extractor.js.map +1 -0
  85. package/dist/call-graph/extractors/data-access-extractor.d.ts +76 -0
  86. package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -0
  87. package/dist/call-graph/extractors/data-access-extractor.js +234 -0
  88. package/dist/call-graph/extractors/data-access-extractor.js.map +1 -0
  89. package/dist/call-graph/extractors/index.d.ts +26 -0
  90. package/dist/call-graph/extractors/index.d.ts.map +1 -0
  91. package/dist/call-graph/extractors/index.js +36 -0
  92. package/dist/call-graph/extractors/index.js.map +1 -0
  93. package/dist/call-graph/extractors/java-data-access-extractor.d.ts +101 -0
  94. package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -0
  95. package/dist/call-graph/extractors/java-data-access-extractor.js +611 -0
  96. package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -0
  97. package/dist/call-graph/extractors/java-extractor.d.ts +87 -0
  98. package/dist/call-graph/extractors/java-extractor.d.ts.map +1 -0
  99. package/dist/call-graph/extractors/java-extractor.js +510 -0
  100. package/dist/call-graph/extractors/java-extractor.js.map +1 -0
  101. package/dist/call-graph/extractors/php-data-access-extractor.d.ts +93 -0
  102. package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -0
  103. package/dist/call-graph/extractors/php-data-access-extractor.js +589 -0
  104. package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -0
  105. package/dist/call-graph/extractors/php-extractor.d.ts +104 -0
  106. package/dist/call-graph/extractors/php-extractor.d.ts.map +1 -0
  107. package/dist/call-graph/extractors/php-extractor.js +619 -0
  108. package/dist/call-graph/extractors/php-extractor.js.map +1 -0
  109. package/dist/call-graph/extractors/python-data-access-extractor.d.ts +90 -0
  110. package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -0
  111. package/dist/call-graph/extractors/python-data-access-extractor.js +537 -0
  112. package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -0
  113. package/dist/call-graph/extractors/python-extractor.d.ts +98 -0
  114. package/dist/call-graph/extractors/python-extractor.d.ts.map +1 -0
  115. package/dist/call-graph/extractors/python-extractor.js +681 -0
  116. package/dist/call-graph/extractors/python-extractor.js.map +1 -0
  117. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +91 -0
  118. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -0
  119. package/dist/call-graph/extractors/semantic-data-access-scanner.js +498 -0
  120. package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -0
  121. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts +122 -0
  122. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -0
  123. package/dist/call-graph/extractors/typescript-data-access-extractor.js +788 -0
  124. package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -0
  125. package/dist/call-graph/extractors/typescript-extractor.d.ts +145 -0
  126. package/dist/call-graph/extractors/typescript-extractor.d.ts.map +1 -0
  127. package/dist/call-graph/extractors/typescript-extractor.js +904 -0
  128. package/dist/call-graph/extractors/typescript-extractor.js.map +1 -0
  129. package/dist/call-graph/index.d.ts +127 -0
  130. package/dist/call-graph/index.d.ts.map +1 -0
  131. package/dist/call-graph/index.js +247 -0
  132. package/dist/call-graph/index.js.map +1 -0
  133. package/dist/call-graph/store/call-graph-store.d.ts +70 -0
  134. package/dist/call-graph/store/call-graph-store.d.ts.map +1 -0
  135. package/dist/call-graph/store/call-graph-store.js +210 -0
  136. package/dist/call-graph/store/call-graph-store.js.map +1 -0
  137. package/dist/call-graph/store/index.d.ts +7 -0
  138. package/dist/call-graph/store/index.d.ts.map +1 -0
  139. package/dist/call-graph/store/index.js +7 -0
  140. package/dist/call-graph/store/index.js.map +1 -0
  141. package/dist/call-graph/types.d.ts +376 -0
  142. package/dist/call-graph/types.d.ts.map +1 -0
  143. package/dist/call-graph/types.js +8 -0
  144. package/dist/call-graph/types.js.map +1 -0
  145. package/dist/index.d.ts +8 -0
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +12 -0
  148. package/dist/index.js.map +1 -1
  149. package/dist/lake/callgraph-shard-store.d.ts +168 -0
  150. package/dist/lake/callgraph-shard-store.d.ts.map +1 -0
  151. package/dist/lake/callgraph-shard-store.js +466 -0
  152. package/dist/lake/callgraph-shard-store.js.map +1 -0
  153. package/dist/lake/examples-store.d.ts +127 -0
  154. package/dist/lake/examples-store.d.ts.map +1 -0
  155. package/dist/lake/examples-store.js +389 -0
  156. package/dist/lake/examples-store.js.map +1 -0
  157. package/dist/lake/index-store.d.ts +82 -0
  158. package/dist/lake/index-store.d.ts.map +1 -0
  159. package/dist/lake/index-store.js +359 -0
  160. package/dist/lake/index-store.js.map +1 -0
  161. package/dist/lake/index.d.ts +93 -0
  162. package/dist/lake/index.d.ts.map +1 -0
  163. package/dist/lake/index.js +138 -0
  164. package/dist/lake/index.js.map +1 -0
  165. package/dist/lake/lake.bak/index-store.d.ts +82 -0
  166. package/dist/lake/lake.bak/index-store.d.ts.map +1 -0
  167. package/dist/lake/lake.bak/index-store.js +357 -0
  168. package/dist/lake/lake.bak/index-store.js.map +1 -0
  169. package/dist/lake/lake.bak/index.d.ts +81 -0
  170. package/dist/lake/lake.bak/index.d.ts.map +1 -0
  171. package/dist/lake/lake.bak/index.js +114 -0
  172. package/dist/lake/lake.bak/index.js.map +1 -0
  173. package/dist/lake/lake.bak/manifest-store.d.ts +51 -0
  174. package/dist/lake/lake.bak/manifest-store.d.ts.map +1 -0
  175. package/dist/lake/lake.bak/manifest-store.js +347 -0
  176. package/dist/lake/lake.bak/manifest-store.js.map +1 -0
  177. package/dist/lake/lake.bak/query-engine.d.ts +112 -0
  178. package/dist/lake/lake.bak/query-engine.d.ts.map +1 -0
  179. package/dist/lake/lake.bak/query-engine.js +370 -0
  180. package/dist/lake/lake.bak/query-engine.js.map +1 -0
  181. package/dist/lake/lake.bak/types.d.ts +428 -0
  182. package/dist/lake/lake.bak/types.d.ts.map +1 -0
  183. package/dist/lake/lake.bak/types.js +46 -0
  184. package/dist/lake/lake.bak/types.js.map +1 -0
  185. package/dist/lake/lake.bak/view-materializer.d.ts +70 -0
  186. package/dist/lake/lake.bak/view-materializer.d.ts.map +1 -0
  187. package/dist/lake/lake.bak/view-materializer.js +314 -0
  188. package/dist/lake/lake.bak/view-materializer.js.map +1 -0
  189. package/dist/lake/lake.bak/view-store.d.ts +57 -0
  190. package/dist/lake/lake.bak/view-store.d.ts.map +1 -0
  191. package/dist/lake/lake.bak/view-store.js +348 -0
  192. package/dist/lake/lake.bak/view-store.js.map +1 -0
  193. package/dist/lake/manifest-store.d.ts +51 -0
  194. package/dist/lake/manifest-store.d.ts.map +1 -0
  195. package/dist/lake/manifest-store.js +348 -0
  196. package/dist/lake/manifest-store.js.map +1 -0
  197. package/dist/lake/pattern-shard-store.d.ts +87 -0
  198. package/dist/lake/pattern-shard-store.d.ts.map +1 -0
  199. package/dist/lake/pattern-shard-store.js +347 -0
  200. package/dist/lake/pattern-shard-store.js.map +1 -0
  201. package/dist/lake/query-engine.d.ts +124 -0
  202. package/dist/lake/query-engine.d.ts.map +1 -0
  203. package/dist/lake/query-engine.js +453 -0
  204. package/dist/lake/query-engine.js.map +1 -0
  205. package/dist/lake/security-shard-store.d.ts +156 -0
  206. package/dist/lake/security-shard-store.d.ts.map +1 -0
  207. package/dist/lake/security-shard-store.js +498 -0
  208. package/dist/lake/security-shard-store.js.map +1 -0
  209. package/dist/lake/types.d.ts +428 -0
  210. package/dist/lake/types.d.ts.map +1 -0
  211. package/dist/lake/types.js +46 -0
  212. package/dist/lake/types.js.map +1 -0
  213. package/dist/lake/view-materializer.d.ts +70 -0
  214. package/dist/lake/view-materializer.d.ts.map +1 -0
  215. package/dist/lake/view-materializer.js +314 -0
  216. package/dist/lake/view-materializer.js.map +1 -0
  217. package/dist/lake/view-store.d.ts +57 -0
  218. package/dist/lake/view-store.d.ts.map +1 -0
  219. package/dist/lake/view-store.js +348 -0
  220. package/dist/lake/view-store.js.map +1 -0
  221. package/dist/parsers/tree-sitter/index.d.ts +1 -0
  222. package/dist/parsers/tree-sitter/index.d.ts.map +1 -1
  223. package/dist/parsers/tree-sitter/index.js +4 -0
  224. package/dist/parsers/tree-sitter/index.js.map +1 -1
  225. package/dist/parsers/tree-sitter/typescript-loader.d.ts +58 -0
  226. package/dist/parsers/tree-sitter/typescript-loader.d.ts.map +1 -0
  227. package/dist/parsers/tree-sitter/typescript-loader.js +250 -0
  228. package/dist/parsers/tree-sitter/typescript-loader.js.map +1 -0
  229. package/dist/store/project-config.d.ts +154 -0
  230. package/dist/store/project-config.d.ts.map +1 -0
  231. package/dist/store/project-config.js +235 -0
  232. package/dist/store/project-config.js.map +1 -0
  233. package/dist/store/project-registry.d.ts +241 -0
  234. package/dist/store/project-registry.d.ts.map +1 -0
  235. package/dist/store/project-registry.js +557 -0
  236. package/dist/store/project-registry.js.map +1 -0
  237. package/package.json +7 -7
@@ -0,0 +1,557 @@
1
+ /**
2
+ * Project Registry - Central index of all drift-initialized projects
3
+ *
4
+ * Maintains a global registry at ~/.drift/registry.json that tracks
5
+ * all projects where drift has been initialized. Enables multi-project
6
+ * workflows, project switching, and cross-project analysis.
7
+ *
8
+ * @requirements
9
+ * - Store project metadata in user home directory
10
+ * - Auto-register projects on drift init
11
+ * - Support project listing, switching, and removal
12
+ * - Track last accessed timestamps for MRU ordering
13
+ */
14
+ import * as fs from 'node:fs/promises';
15
+ import * as path from 'node:path';
16
+ import * as os from 'node:os';
17
+ import * as crypto from 'node:crypto';
18
+ import { EventEmitter } from 'node:events';
19
+ // ============================================================================
20
+ // Constants
21
+ // ============================================================================
22
+ const REGISTRY_VERSION = '1.0.0';
23
+ const DRIFT_HOME_DIR = '.drift';
24
+ const REGISTRY_FILE = 'registry.json';
25
+ const DEFAULT_CONFIG = {
26
+ registryPath: path.join(os.homedir(), DRIFT_HOME_DIR, REGISTRY_FILE),
27
+ validateOnLoad: true,
28
+ autoCleanup: false,
29
+ };
30
+ // ============================================================================
31
+ // Detection Helpers
32
+ // ============================================================================
33
+ /**
34
+ * Detect project language from files
35
+ */
36
+ async function detectLanguage(projectPath) {
37
+ const indicators = [
38
+ { file: 'tsconfig.json', language: 'typescript' },
39
+ { file: 'package.json', language: 'javascript' }, // Will be overridden by tsconfig
40
+ { file: 'requirements.txt', language: 'python' },
41
+ { file: 'pyproject.toml', language: 'python' },
42
+ { file: 'pom.xml', language: 'java' },
43
+ { file: 'build.gradle', language: 'java' },
44
+ { file: '*.csproj', language: 'csharp' },
45
+ { file: '*.sln', language: 'csharp' },
46
+ { file: 'composer.json', language: 'php' },
47
+ { file: 'Gemfile', language: 'ruby' },
48
+ { file: 'go.mod', language: 'go' },
49
+ { file: 'Cargo.toml', language: 'rust' },
50
+ ];
51
+ const detected = [];
52
+ for (const { file, language } of indicators) {
53
+ try {
54
+ if (file.includes('*')) {
55
+ // Glob pattern - check directory
56
+ const files = await fs.readdir(projectPath);
57
+ const ext = file.replace('*', '');
58
+ if (files.some(f => f.endsWith(ext))) {
59
+ detected.push(language);
60
+ }
61
+ }
62
+ else {
63
+ await fs.access(path.join(projectPath, file));
64
+ detected.push(language);
65
+ }
66
+ }
67
+ catch {
68
+ // File doesn't exist
69
+ }
70
+ }
71
+ // TypeScript takes precedence over JavaScript
72
+ if (detected.includes('typescript')) {
73
+ return 'typescript';
74
+ }
75
+ if (detected.length === 0) {
76
+ return 'unknown';
77
+ }
78
+ if (detected.length === 1) {
79
+ return detected[0];
80
+ }
81
+ return 'mixed';
82
+ }
83
+ /**
84
+ * Detect project framework from files and dependencies
85
+ */
86
+ async function detectFramework(projectPath) {
87
+ // Check package.json for JS frameworks
88
+ try {
89
+ const pkgPath = path.join(projectPath, 'package.json');
90
+ const content = await fs.readFile(pkgPath, 'utf-8');
91
+ const pkg = JSON.parse(content);
92
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
93
+ if (deps['next'])
94
+ return 'nextjs';
95
+ if (deps['react'])
96
+ return 'react';
97
+ if (deps['vue'])
98
+ return 'vue';
99
+ if (deps['@angular/core'])
100
+ return 'angular';
101
+ if (deps['express'])
102
+ return 'express';
103
+ }
104
+ catch {
105
+ // No package.json
106
+ }
107
+ // Check Python frameworks
108
+ try {
109
+ const reqPath = path.join(projectPath, 'requirements.txt');
110
+ const content = await fs.readFile(reqPath, 'utf-8');
111
+ if (content.includes('fastapi'))
112
+ return 'fastapi';
113
+ if (content.includes('django'))
114
+ return 'django';
115
+ if (content.includes('flask'))
116
+ return 'flask';
117
+ }
118
+ catch {
119
+ // No requirements.txt
120
+ }
121
+ // Check for Spring (Java)
122
+ try {
123
+ const pomPath = path.join(projectPath, 'pom.xml');
124
+ const content = await fs.readFile(pomPath, 'utf-8');
125
+ if (content.includes('spring-boot'))
126
+ return 'spring';
127
+ }
128
+ catch {
129
+ // No pom.xml
130
+ }
131
+ // Check for ASP.NET
132
+ try {
133
+ const files = await fs.readdir(projectPath);
134
+ for (const file of files) {
135
+ if (file.endsWith('.csproj')) {
136
+ const content = await fs.readFile(path.join(projectPath, file), 'utf-8');
137
+ if (content.includes('Microsoft.AspNetCore'))
138
+ return 'aspnet';
139
+ }
140
+ }
141
+ }
142
+ catch {
143
+ // No csproj
144
+ }
145
+ // Check for Laravel
146
+ try {
147
+ await fs.access(path.join(projectPath, 'artisan'));
148
+ return 'laravel';
149
+ }
150
+ catch {
151
+ // No artisan
152
+ }
153
+ // Check for Rails
154
+ try {
155
+ await fs.access(path.join(projectPath, 'config', 'routes.rb'));
156
+ return 'rails';
157
+ }
158
+ catch {
159
+ // No routes.rb
160
+ }
161
+ return 'unknown';
162
+ }
163
+ /**
164
+ * Get git remote URL if available
165
+ */
166
+ async function getGitRemote(projectPath) {
167
+ try {
168
+ const configPath = path.join(projectPath, '.git', 'config');
169
+ const content = await fs.readFile(configPath, 'utf-8');
170
+ const match = content.match(/url\s*=\s*(.+)/);
171
+ return match?.[1]?.trim();
172
+ }
173
+ catch {
174
+ return undefined;
175
+ }
176
+ }
177
+ // ============================================================================
178
+ // Project Registry Class
179
+ // ============================================================================
180
+ /**
181
+ * Project Registry - Manages multi-project drift installations
182
+ */
183
+ export class ProjectRegistry extends EventEmitter {
184
+ config;
185
+ projects = new Map();
186
+ activeProjectId;
187
+ constructor(config = {}) {
188
+ super();
189
+ this.config = { ...DEFAULT_CONFIG, ...config };
190
+ }
191
+ // ==========================================================================
192
+ // Initialization
193
+ // ==========================================================================
194
+ /**
195
+ * Initialize the registry (load from disk)
196
+ */
197
+ async initialize() {
198
+ await this.ensureRegistryDir();
199
+ await this.load();
200
+ }
201
+ /**
202
+ * Ensure ~/.drift directory exists
203
+ */
204
+ async ensureRegistryDir() {
205
+ const dir = path.dirname(this.config.registryPath);
206
+ await fs.mkdir(dir, { recursive: true });
207
+ }
208
+ // ==========================================================================
209
+ // Loading & Saving
210
+ // ==========================================================================
211
+ /**
212
+ * Load registry from disk
213
+ */
214
+ async load() {
215
+ try {
216
+ const content = await fs.readFile(this.config.registryPath, 'utf-8');
217
+ const data = JSON.parse(content);
218
+ this.projects.clear();
219
+ for (const project of data.projects) {
220
+ // Validate path if enabled
221
+ if (this.config.validateOnLoad) {
222
+ project.isValid = await this.validateProjectPath(project.path);
223
+ }
224
+ this.projects.set(project.id, project);
225
+ }
226
+ this.activeProjectId = data.activeProjectId;
227
+ // Auto-cleanup invalid projects
228
+ if (this.config.autoCleanup) {
229
+ const invalid = Array.from(this.projects.values()).filter(p => !p.isValid);
230
+ for (const project of invalid) {
231
+ this.projects.delete(project.id);
232
+ }
233
+ if (invalid.length > 0) {
234
+ await this.save();
235
+ }
236
+ }
237
+ this.emitEvent('registry:loaded');
238
+ }
239
+ catch (error) {
240
+ if (error.code === 'ENOENT') {
241
+ // Registry doesn't exist yet - that's fine
242
+ return;
243
+ }
244
+ throw error;
245
+ }
246
+ }
247
+ /**
248
+ * Save registry to disk
249
+ */
250
+ async save() {
251
+ const data = {
252
+ version: REGISTRY_VERSION,
253
+ lastUpdated: new Date().toISOString(),
254
+ projects: Array.from(this.projects.values()),
255
+ };
256
+ // Only include activeProjectId if it's set
257
+ if (this.activeProjectId) {
258
+ data.activeProjectId = this.activeProjectId;
259
+ }
260
+ await fs.writeFile(this.config.registryPath, JSON.stringify(data, null, 2));
261
+ this.emitEvent('registry:saved');
262
+ }
263
+ /**
264
+ * Validate that a project path exists and has .drift folder
265
+ */
266
+ async validateProjectPath(projectPath) {
267
+ try {
268
+ await fs.access(path.join(projectPath, '.drift'));
269
+ return true;
270
+ }
271
+ catch {
272
+ return false;
273
+ }
274
+ }
275
+ // ==========================================================================
276
+ // Project Registration
277
+ // ==========================================================================
278
+ /**
279
+ * Register a new project
280
+ */
281
+ async register(projectPath, options = {}) {
282
+ const absolutePath = path.resolve(projectPath);
283
+ // Check if already registered
284
+ const existing = this.findByPath(absolutePath);
285
+ if (existing) {
286
+ // Update last accessed and return
287
+ return this.updateLastAccessed(existing.id);
288
+ }
289
+ // Detect project info
290
+ const [detectedLanguage, detectedFramework, gitRemote] = await Promise.all([
291
+ detectLanguage(absolutePath),
292
+ detectFramework(absolutePath),
293
+ getGitRemote(absolutePath),
294
+ ]);
295
+ const language = options.language ?? detectedLanguage;
296
+ const framework = options.framework ?? detectedFramework;
297
+ const now = new Date().toISOString();
298
+ const project = {
299
+ id: crypto.randomUUID(),
300
+ name: options.name ?? path.basename(absolutePath),
301
+ path: absolutePath,
302
+ language,
303
+ framework,
304
+ registeredAt: now,
305
+ lastAccessedAt: now,
306
+ tags: options.tags,
307
+ description: options.description,
308
+ gitRemote,
309
+ isValid: true,
310
+ };
311
+ this.projects.set(project.id, project);
312
+ await this.save();
313
+ this.emitEvent('project:registered', project.id, project.name);
314
+ return project;
315
+ }
316
+ /**
317
+ * Update project metadata
318
+ */
319
+ async update(projectId, updates) {
320
+ const project = this.projects.get(projectId);
321
+ if (!project) {
322
+ throw new Error(`Project not found: ${projectId}`);
323
+ }
324
+ const updated = {
325
+ ...project,
326
+ ...updates,
327
+ id: project.id,
328
+ registeredAt: project.registeredAt,
329
+ };
330
+ this.projects.set(projectId, updated);
331
+ await this.save();
332
+ this.emitEvent('project:updated', projectId, updated.name);
333
+ return updated;
334
+ }
335
+ /**
336
+ * Update last accessed timestamp
337
+ */
338
+ async updateLastAccessed(projectId) {
339
+ return this.update(projectId, {
340
+ lastAccessedAt: new Date().toISOString(),
341
+ });
342
+ }
343
+ /**
344
+ * Update pattern counts for a project
345
+ */
346
+ async updatePatternCounts(projectId, counts) {
347
+ return this.update(projectId, { patternCounts: counts });
348
+ }
349
+ /**
350
+ * Update health score for a project
351
+ */
352
+ async updateHealth(projectId, healthScore) {
353
+ let health = 'unknown';
354
+ if (healthScore >= 80)
355
+ health = 'healthy';
356
+ else if (healthScore >= 50)
357
+ health = 'warning';
358
+ else if (healthScore >= 0)
359
+ health = 'critical';
360
+ return this.update(projectId, { healthScore, health });
361
+ }
362
+ /**
363
+ * Remove a project from registry
364
+ */
365
+ async remove(projectId) {
366
+ const project = this.projects.get(projectId);
367
+ if (!project) {
368
+ return false;
369
+ }
370
+ this.projects.delete(projectId);
371
+ // Clear active if it was this project
372
+ if (this.activeProjectId === projectId) {
373
+ this.activeProjectId = undefined;
374
+ }
375
+ await this.save();
376
+ this.emitEvent('project:removed', projectId, project.name);
377
+ return true;
378
+ }
379
+ // ==========================================================================
380
+ // Project Activation
381
+ // ==========================================================================
382
+ /**
383
+ * Set the active project
384
+ */
385
+ async setActive(projectId) {
386
+ const project = this.projects.get(projectId);
387
+ if (!project) {
388
+ throw new Error(`Project not found: ${projectId}`);
389
+ }
390
+ this.activeProjectId = projectId;
391
+ await this.updateLastAccessed(projectId);
392
+ this.emitEvent('project:activated', projectId, project.name);
393
+ return project;
394
+ }
395
+ /**
396
+ * Get the active project
397
+ */
398
+ getActive() {
399
+ if (!this.activeProjectId)
400
+ return undefined;
401
+ return this.projects.get(this.activeProjectId);
402
+ }
403
+ /**
404
+ * Clear active project
405
+ */
406
+ async clearActive() {
407
+ this.activeProjectId = undefined;
408
+ await this.save();
409
+ }
410
+ // ==========================================================================
411
+ // Querying
412
+ // ==========================================================================
413
+ /**
414
+ * Get a project by ID
415
+ */
416
+ get(projectId) {
417
+ return this.projects.get(projectId);
418
+ }
419
+ /**
420
+ * Find project by path
421
+ */
422
+ findByPath(projectPath) {
423
+ const absolutePath = path.resolve(projectPath);
424
+ return Array.from(this.projects.values()).find(p => p.path === absolutePath);
425
+ }
426
+ /**
427
+ * Find project by name
428
+ */
429
+ findByName(name) {
430
+ const nameLower = name.toLowerCase();
431
+ return Array.from(this.projects.values()).find(p => p.name.toLowerCase() === nameLower);
432
+ }
433
+ /**
434
+ * Get all projects
435
+ */
436
+ getAll() {
437
+ return Array.from(this.projects.values());
438
+ }
439
+ /**
440
+ * Get projects sorted by last accessed (MRU)
441
+ */
442
+ getRecent(limit) {
443
+ const sorted = Array.from(this.projects.values()).sort((a, b) => new Date(b.lastAccessedAt).getTime() -
444
+ new Date(a.lastAccessedAt).getTime());
445
+ return limit ? sorted.slice(0, limit) : sorted;
446
+ }
447
+ /**
448
+ * Get projects by language
449
+ */
450
+ getByLanguage(language) {
451
+ return Array.from(this.projects.values()).filter(p => p.language === language);
452
+ }
453
+ /**
454
+ * Get projects by framework
455
+ */
456
+ getByFramework(framework) {
457
+ return Array.from(this.projects.values()).filter(p => p.framework === framework);
458
+ }
459
+ /**
460
+ * Get projects by tag
461
+ */
462
+ getByTag(tag) {
463
+ return Array.from(this.projects.values()).filter(p => p.tags?.includes(tag));
464
+ }
465
+ /**
466
+ * Get valid projects only
467
+ */
468
+ getValid() {
469
+ return Array.from(this.projects.values()).filter(p => p.isValid !== false);
470
+ }
471
+ /**
472
+ * Search projects by name or path
473
+ */
474
+ search(query) {
475
+ const queryLower = query.toLowerCase();
476
+ return Array.from(this.projects.values()).filter(p => p.name.toLowerCase().includes(queryLower) ||
477
+ p.path.toLowerCase().includes(queryLower) ||
478
+ p.description?.toLowerCase().includes(queryLower));
479
+ }
480
+ /**
481
+ * Get project count
482
+ */
483
+ get count() {
484
+ return this.projects.size;
485
+ }
486
+ // ==========================================================================
487
+ // Validation
488
+ // ==========================================================================
489
+ /**
490
+ * Validate all project paths
491
+ */
492
+ async validateAll() {
493
+ const results = new Map();
494
+ for (const [id, project] of this.projects) {
495
+ const isValid = await this.validateProjectPath(project.path);
496
+ results.set(id, isValid);
497
+ project.isValid = isValid;
498
+ }
499
+ await this.save();
500
+ return results;
501
+ }
502
+ /**
503
+ * Remove all invalid projects
504
+ */
505
+ async cleanup() {
506
+ await this.validateAll();
507
+ const removed = [];
508
+ for (const [id, project] of this.projects) {
509
+ if (!project.isValid) {
510
+ this.projects.delete(id);
511
+ removed.push(project.name);
512
+ }
513
+ }
514
+ if (removed.length > 0) {
515
+ await this.save();
516
+ }
517
+ return removed;
518
+ }
519
+ // ==========================================================================
520
+ // Events
521
+ // ==========================================================================
522
+ emitEvent(type, projectId, projectName) {
523
+ const event = {
524
+ type,
525
+ timestamp: new Date().toISOString(),
526
+ };
527
+ if (projectId !== undefined) {
528
+ event.projectId = projectId;
529
+ }
530
+ if (projectName !== undefined) {
531
+ event.projectName = projectName;
532
+ }
533
+ this.emit(type, event);
534
+ this.emit('*', event);
535
+ }
536
+ }
537
+ // ============================================================================
538
+ // Factory & Singleton
539
+ // ============================================================================
540
+ let globalRegistry = null;
541
+ /**
542
+ * Get the global project registry instance
543
+ */
544
+ export async function getProjectRegistry(config) {
545
+ if (!globalRegistry) {
546
+ globalRegistry = new ProjectRegistry(config);
547
+ await globalRegistry.initialize();
548
+ }
549
+ return globalRegistry;
550
+ }
551
+ /**
552
+ * Create a new project registry instance
553
+ */
554
+ export function createProjectRegistry(config) {
555
+ return new ProjectRegistry(config);
556
+ }
557
+ //# sourceMappingURL=project-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-registry.js","sourceRoot":"","sources":["../../src/store/project-registry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "driftdetect-core",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Core pattern detection and analysis engine for Drift",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -40,20 +40,20 @@
40
40
  "dependencies": {
41
41
  "ignore": "^5.3.1",
42
42
  "minimatch": "^9.0.3",
43
- "typescript": "^5.3.0"
44
- },
45
- "optionalDependencies": {
43
+ "typescript": "^5.3.0",
44
+ "tree-sitter": "^0.21.1",
46
45
  "tree-sitter-python": "^0.21.0",
47
46
  "tree-sitter-java": "^0.21.0",
48
- "tree-sitter-php": "^0.22.0"
47
+ "tree-sitter-php": "^0.22.0",
48
+ "tree-sitter-c-sharp": "^0.21.3",
49
+ "tree-sitter-typescript": "^0.21.2",
50
+ "tree-sitter-javascript": "^0.21.4"
49
51
  },
50
52
  "devDependencies": {
51
53
  "@types/minimatch": "^5.1.2",
52
54
  "@types/node": "^20.10.0",
53
55
  "@vitest/coverage-v8": "^1.0.0",
54
56
  "fast-check": "^3.15.0",
55
- "tree-sitter": "^0.21.1",
56
- "tree-sitter-c-sharp": "^0.21.3",
57
57
  "typescript": "^5.3.0",
58
58
  "vitest": "^1.0.0"
59
59
  }