@fathippo/fathippo-context-engine 0.1.4 → 0.1.6

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 (39) hide show
  1. package/dist/engine.d.ts +4 -0
  2. package/dist/engine.d.ts.map +1 -1
  3. package/dist/engine.js +60 -2
  4. package/dist/engine.js.map +1 -1
  5. package/dist/profiler/framework-detection.d.ts +6 -0
  6. package/dist/profiler/framework-detection.d.ts.map +1 -0
  7. package/dist/profiler/framework-detection.js +452 -0
  8. package/dist/profiler/framework-detection.js.map +1 -0
  9. package/dist/profiler/git-analysis.d.ts +7 -0
  10. package/dist/profiler/git-analysis.d.ts.map +1 -0
  11. package/dist/profiler/git-analysis.js +125 -0
  12. package/dist/profiler/git-analysis.js.map +1 -0
  13. package/dist/profiler/import-analysis.d.ts +7 -0
  14. package/dist/profiler/import-analysis.d.ts.map +1 -0
  15. package/dist/profiler/import-analysis.js +160 -0
  16. package/dist/profiler/import-analysis.js.map +1 -0
  17. package/dist/profiler/index.d.ts +30 -0
  18. package/dist/profiler/index.d.ts.map +1 -0
  19. package/dist/profiler/index.js +198 -0
  20. package/dist/profiler/index.js.map +1 -0
  21. package/dist/profiler/scanner.d.ts +6 -0
  22. package/dist/profiler/scanner.d.ts.map +1 -0
  23. package/dist/profiler/scanner.js +360 -0
  24. package/dist/profiler/scanner.js.map +1 -0
  25. package/dist/profiler/serializer.d.ts +7 -0
  26. package/dist/profiler/serializer.d.ts.map +1 -0
  27. package/dist/profiler/serializer.js +112 -0
  28. package/dist/profiler/serializer.js.map +1 -0
  29. package/dist/profiler/types.d.ts +104 -0
  30. package/dist/profiler/types.d.ts.map +1 -0
  31. package/dist/profiler/types.js +8 -0
  32. package/dist/profiler/types.js.map +1 -0
  33. package/dist/profiler/workspace-id.d.ts +5 -0
  34. package/dist/profiler/workspace-id.d.ts.map +1 -0
  35. package/dist/profiler/workspace-id.js +65 -0
  36. package/dist/profiler/workspace-id.js.map +1 -0
  37. package/dist/types.d.ts +4 -0
  38. package/dist/types.d.ts.map +1 -1
  39. package/package.json +1 -1
@@ -0,0 +1,452 @@
1
+ /**
2
+ * Framework and tech stack detection from marker files and dependency manifests.
3
+ */
4
+ import { readFile } from "node:fs/promises";
5
+ import { existsSync } from "node:fs";
6
+ import path from "node:path";
7
+ const FRAMEWORK_RULES = [
8
+ // JS/TS frameworks
9
+ { name: "next.js", files: ["next.config.js", "next.config.mjs", "next.config.ts"], deps: ["next"] },
10
+ { name: "react", deps: ["react"] },
11
+ { name: "vue", deps: ["vue"], files: ["vue.config.js"] },
12
+ { name: "nuxt", deps: ["nuxt"], files: ["nuxt.config.ts", "nuxt.config.js"] },
13
+ { name: "angular", deps: ["@angular/core"], files: ["angular.json"] },
14
+ { name: "svelte", deps: ["svelte"], files: ["svelte.config.js"] },
15
+ { name: "sveltekit", deps: ["@sveltejs/kit"] },
16
+ { name: "solid", deps: ["solid-js"] },
17
+ { name: "astro", deps: ["astro"], files: ["astro.config.mjs", "astro.config.ts"] },
18
+ { name: "remix", deps: ["@remix-run/react", "@remix-run/node"] },
19
+ { name: "gatsby", deps: ["gatsby"] },
20
+ { name: "express", deps: ["express"] },
21
+ { name: "fastify", deps: ["fastify"] },
22
+ { name: "hono", deps: ["hono"] },
23
+ { name: "koa", deps: ["koa"] },
24
+ { name: "nest.js", deps: ["@nestjs/core"] },
25
+ { name: "electron", deps: ["electron"] },
26
+ { name: "tailwind", deps: ["tailwindcss"], files: ["tailwind.config.js", "tailwind.config.ts", "tailwind.config.cjs", "tailwind.config.mjs"] },
27
+ { name: "shadcn/ui", files: ["components.json"] },
28
+ // Python frameworks
29
+ { name: "django", deps: ["django"], files: ["manage.py"] },
30
+ { name: "flask", deps: ["flask"] },
31
+ { name: "fastapi", deps: ["fastapi"] },
32
+ { name: "pytorch", deps: ["torch"] },
33
+ { name: "tensorflow", deps: ["tensorflow"] },
34
+ { name: "langchain", deps: ["langchain"] },
35
+ { name: "streamlit", deps: ["streamlit"] },
36
+ // Rust frameworks
37
+ { name: "actix-web", deps: ["actix-web"] },
38
+ { name: "tokio", deps: ["tokio"] },
39
+ { name: "rocket", deps: ["rocket"] },
40
+ { name: "axum", deps: ["axum"] },
41
+ { name: "bevy", deps: ["bevy"] },
42
+ // Go frameworks
43
+ { name: "gin", deps: ["github.com/gin-gonic/gin"] },
44
+ { name: "echo", deps: ["github.com/labstack/echo"] },
45
+ { name: "fiber", deps: ["github.com/gofiber/fiber"] },
46
+ { name: "cobra", deps: ["github.com/spf13/cobra"] },
47
+ ];
48
+ const BUILD_TOOL_RULES = [
49
+ { name: "turbo", files: ["turbo.json"], deps: ["turbo"] },
50
+ { name: "vite", files: ["vite.config.ts", "vite.config.js", "vite.config.mjs"], deps: ["vite"] },
51
+ { name: "webpack", files: ["webpack.config.js", "webpack.config.ts"], deps: ["webpack"] },
52
+ { name: "esbuild", deps: ["esbuild"] },
53
+ { name: "rollup", files: ["rollup.config.js", "rollup.config.mjs"], deps: ["rollup"] },
54
+ { name: "tsup", deps: ["tsup"] },
55
+ { name: "swc", deps: ["@swc/core"] },
56
+ { name: "babel", files: [".babelrc", "babel.config.js", "babel.config.json"], deps: ["@babel/core"] },
57
+ { name: "nx", files: ["nx.json"], deps: ["nx"] },
58
+ { name: "gradle", files: ["build.gradle", "build.gradle.kts"] },
59
+ { name: "maven", files: ["pom.xml"] },
60
+ { name: "cmake", files: ["CMakeLists.txt"] },
61
+ { name: "make", files: ["Makefile"] },
62
+ ];
63
+ const TESTING_RULES = [
64
+ { name: "vitest", files: ["vitest.config.ts", "vitest.config.js", "vitest.config.mjs"], deps: ["vitest"] },
65
+ { name: "jest", files: ["jest.config.js", "jest.config.ts", "jest.config.json"], deps: ["jest"] },
66
+ { name: "mocha", deps: ["mocha"] },
67
+ { name: "playwright", deps: ["@playwright/test", "playwright"] },
68
+ { name: "cypress", files: ["cypress.config.js", "cypress.config.ts"], deps: ["cypress"] },
69
+ { name: "pytest", deps: ["pytest"], files: ["pytest.ini", "pyproject.toml"] },
70
+ { name: "go-test", files: ["*_test.go"] },
71
+ { name: "cargo-test", files: ["Cargo.toml"] },
72
+ { name: "rspec", deps: ["rspec"] },
73
+ { name: "junit", deps: ["junit"] },
74
+ ];
75
+ const DATABASE_DEPS = {
76
+ "@libsql/client": "turso/libsql",
77
+ "libsql": "turso/libsql",
78
+ "pg": "postgres",
79
+ "postgres": "postgres",
80
+ "@prisma/client": "prisma",
81
+ "prisma": "prisma",
82
+ "drizzle-orm": "drizzle",
83
+ "mongoose": "mongodb",
84
+ "mongodb": "mongodb",
85
+ "mysql2": "mysql",
86
+ "better-sqlite3": "sqlite",
87
+ "sqlite3": "sqlite",
88
+ "redis": "redis",
89
+ "ioredis": "redis",
90
+ "@supabase/supabase-js": "supabase",
91
+ "firebase": "firebase",
92
+ "typeorm": "typeorm",
93
+ "sequelize": "sequelize",
94
+ "sqlalchemy": "postgres",
95
+ "psycopg2": "postgres",
96
+ "pymongo": "mongodb",
97
+ "diesel": "postgres",
98
+ "sqlx": "postgres",
99
+ "sea-orm": "postgres",
100
+ };
101
+ const DEPLOYMENT_RULES = [
102
+ { name: "vercel", files: ["vercel.json", ".vercel"] },
103
+ { name: "docker", files: ["Dockerfile", "docker-compose.yml", "docker-compose.yaml", ".dockerignore"] },
104
+ { name: "railway", files: ["railway.json", "railway.toml"] },
105
+ { name: "fly.io", files: ["fly.toml"] },
106
+ { name: "netlify", files: ["netlify.toml"] },
107
+ { name: "cloudflare", files: ["wrangler.toml", "wrangler.json"] },
108
+ { name: "aws", files: ["serverless.yml", "serverless.yaml", "cdk.json", "sam.json", "template.yaml"] },
109
+ { name: "gcp", files: ["app.yaml", "cloudbuild.yaml"] },
110
+ { name: "kubernetes", files: ["k8s/", "kubernetes/", "kustomization.yaml"] },
111
+ { name: "github-actions", files: [".github/workflows"] },
112
+ { name: "terraform", files: ["main.tf", "terraform.tf"] },
113
+ { name: "heroku", files: ["Procfile"] },
114
+ ];
115
+ export async function detectTechStack(workspaceRoot) {
116
+ const allDeps = await gatherAllDependencies(workspaceRoot);
117
+ const frameworks = [];
118
+ const buildTools = [];
119
+ const testing = [];
120
+ const database = [];
121
+ const deployment = [];
122
+ // Detect frameworks
123
+ for (const rule of FRAMEWORK_RULES) {
124
+ if (matchesRule(workspaceRoot, rule, allDeps)) {
125
+ frameworks.push(rule.name);
126
+ }
127
+ }
128
+ // Detect build tools
129
+ for (const rule of BUILD_TOOL_RULES) {
130
+ if (matchesRule(workspaceRoot, rule, allDeps)) {
131
+ buildTools.push(rule.name);
132
+ }
133
+ }
134
+ // Detect testing
135
+ for (const rule of TESTING_RULES) {
136
+ if (rule.name === "go-test" || rule.name === "cargo-test") {
137
+ // Special handling: check file existence
138
+ if (rule.name === "cargo-test" && existsSync(path.join(workspaceRoot, "Cargo.toml"))) {
139
+ testing.push("cargo test");
140
+ }
141
+ continue;
142
+ }
143
+ if (matchesRule(workspaceRoot, rule, allDeps)) {
144
+ testing.push(rule.name);
145
+ }
146
+ }
147
+ // Detect databases
148
+ for (const [dep, db] of Object.entries(DATABASE_DEPS)) {
149
+ if (allDeps.has(dep) && !database.includes(db)) {
150
+ database.push(db);
151
+ }
152
+ }
153
+ // Detect deployment
154
+ for (const rule of DEPLOYMENT_RULES) {
155
+ if (matchesRule(workspaceRoot, rule, allDeps)) {
156
+ deployment.push(rule.name);
157
+ }
158
+ }
159
+ // Detect package manager
160
+ const packageManager = detectPackageManager(workspaceRoot);
161
+ // Detect runtime
162
+ const runtime = await detectRuntime(workspaceRoot);
163
+ return {
164
+ languages: [], // Filled in by scanner
165
+ frameworks,
166
+ runtime,
167
+ packageManager,
168
+ buildTools,
169
+ testing,
170
+ database,
171
+ deployment,
172
+ };
173
+ }
174
+ function matchesRule(workspaceRoot, rule, allDeps) {
175
+ // Check deps first (cheaper)
176
+ if (rule.deps) {
177
+ for (const dep of rule.deps) {
178
+ if (allDeps.has(dep))
179
+ return true;
180
+ }
181
+ }
182
+ if (rule.devDeps) {
183
+ for (const dep of rule.devDeps) {
184
+ if (allDeps.has(dep))
185
+ return true;
186
+ }
187
+ }
188
+ // Check marker files
189
+ if (rule.files) {
190
+ for (const file of rule.files) {
191
+ if (file.includes("*"))
192
+ continue; // Skip glob patterns
193
+ if (existsSync(path.join(workspaceRoot, file)))
194
+ return true;
195
+ }
196
+ }
197
+ return false;
198
+ }
199
+ async function gatherAllDependencies(workspaceRoot) {
200
+ const deps = new Set();
201
+ // package.json (JS/TS)
202
+ await parsePackageJsonDeps(path.join(workspaceRoot, "package.json"), deps);
203
+ // Also check workspace package.json files
204
+ for (const dir of ["packages", "apps"]) {
205
+ const dirPath = path.join(workspaceRoot, dir);
206
+ if (existsSync(dirPath)) {
207
+ try {
208
+ const { readdir } = await import("node:fs/promises");
209
+ const entries = await readdir(dirPath, { withFileTypes: true });
210
+ for (const entry of entries) {
211
+ if (entry.isDirectory()) {
212
+ await parsePackageJsonDeps(path.join(dirPath, entry.name, "package.json"), deps);
213
+ }
214
+ }
215
+ }
216
+ catch {
217
+ // Skip
218
+ }
219
+ }
220
+ }
221
+ // requirements.txt (Python)
222
+ await parsePythonDeps(path.join(workspaceRoot, "requirements.txt"), deps);
223
+ await parsePyprojectDeps(path.join(workspaceRoot, "pyproject.toml"), deps);
224
+ // Cargo.toml (Rust)
225
+ await parseCargoDeps(path.join(workspaceRoot, "Cargo.toml"), deps);
226
+ // go.mod (Go)
227
+ await parseGoModDeps(path.join(workspaceRoot, "go.mod"), deps);
228
+ // Gemfile (Ruby)
229
+ await parseGemfileDeps(path.join(workspaceRoot, "Gemfile"), deps);
230
+ return deps;
231
+ }
232
+ async function parsePackageJsonDeps(filePath, deps) {
233
+ if (!existsSync(filePath))
234
+ return;
235
+ try {
236
+ const content = await readFile(filePath, "utf-8");
237
+ const pkg = JSON.parse(content);
238
+ for (const key of ["dependencies", "devDependencies", "peerDependencies"]) {
239
+ if (pkg[key] && typeof pkg[key] === "object") {
240
+ for (const dep of Object.keys(pkg[key])) {
241
+ deps.add(dep);
242
+ }
243
+ }
244
+ }
245
+ }
246
+ catch {
247
+ // Skip malformed package.json
248
+ }
249
+ }
250
+ async function parsePythonDeps(filePath, deps) {
251
+ if (!existsSync(filePath))
252
+ return;
253
+ try {
254
+ const content = await readFile(filePath, "utf-8");
255
+ for (const line of content.split("\n")) {
256
+ const trimmed = line.trim();
257
+ if (!trimmed || trimmed.startsWith("#") || trimmed.startsWith("-"))
258
+ continue;
259
+ const name = trimmed.split(/[>=<!\[;]/)[0]?.trim();
260
+ if (name)
261
+ deps.add(name.toLowerCase());
262
+ }
263
+ }
264
+ catch {
265
+ // Skip
266
+ }
267
+ }
268
+ async function parsePyprojectDeps(filePath, deps) {
269
+ if (!existsSync(filePath))
270
+ return;
271
+ try {
272
+ const content = await readFile(filePath, "utf-8");
273
+ // Simple TOML parsing for dependencies
274
+ const depSection = content.match(/\[(?:project\.)?dependencies\]([\s\S]*?)(?:\[|$)/);
275
+ if (depSection) {
276
+ for (const line of depSection[1].split("\n")) {
277
+ const trimmed = line.trim();
278
+ if (!trimmed || trimmed.startsWith("#"))
279
+ continue;
280
+ // Handle both "name = ..." and "name" formats
281
+ const name = trimmed.split(/[=,\[]/)[0]?.trim().replace(/^["']|["']$/g, "");
282
+ if (name && name.length > 0 && !name.includes(" ")) {
283
+ deps.add(name.toLowerCase());
284
+ }
285
+ }
286
+ }
287
+ }
288
+ catch {
289
+ // Skip
290
+ }
291
+ }
292
+ async function parseCargoDeps(filePath, deps) {
293
+ if (!existsSync(filePath))
294
+ return;
295
+ try {
296
+ const content = await readFile(filePath, "utf-8");
297
+ const sections = content.match(/\[(?:dev-)?dependencies\]([\s\S]*?)(?:\[|$)/g);
298
+ if (sections) {
299
+ for (const section of sections) {
300
+ for (const line of section.split("\n")) {
301
+ const match = line.match(/^(\w[\w-]*)\s*=/);
302
+ if (match)
303
+ deps.add(match[1]);
304
+ }
305
+ }
306
+ }
307
+ }
308
+ catch {
309
+ // Skip
310
+ }
311
+ }
312
+ async function parseGoModDeps(filePath, deps) {
313
+ if (!existsSync(filePath))
314
+ return;
315
+ try {
316
+ const content = await readFile(filePath, "utf-8");
317
+ const requireBlock = content.match(/require\s*\(([\s\S]*?)\)/);
318
+ if (requireBlock) {
319
+ for (const line of requireBlock[1].split("\n")) {
320
+ const trimmed = line.trim();
321
+ if (!trimmed || trimmed.startsWith("//"))
322
+ continue;
323
+ const parts = trimmed.split(/\s+/);
324
+ if (parts[0])
325
+ deps.add(parts[0]);
326
+ }
327
+ }
328
+ // Single require lines
329
+ const singleRequires = content.matchAll(/^require\s+(\S+)/gm);
330
+ for (const match of singleRequires) {
331
+ if (match[1])
332
+ deps.add(match[1]);
333
+ }
334
+ }
335
+ catch {
336
+ // Skip
337
+ }
338
+ }
339
+ async function parseGemfileDeps(filePath, deps) {
340
+ if (!existsSync(filePath))
341
+ return;
342
+ try {
343
+ const content = await readFile(filePath, "utf-8");
344
+ for (const line of content.split("\n")) {
345
+ const match = line.match(/gem\s+['"](\w[\w-]*)['"]/);
346
+ if (match)
347
+ deps.add(match[1]);
348
+ }
349
+ }
350
+ catch {
351
+ // Skip
352
+ }
353
+ }
354
+ function detectPackageManager(workspaceRoot) {
355
+ if (existsSync(path.join(workspaceRoot, "pnpm-lock.yaml")))
356
+ return "pnpm";
357
+ if (existsSync(path.join(workspaceRoot, "bun.lockb")) || existsSync(path.join(workspaceRoot, "bun.lock")))
358
+ return "bun";
359
+ if (existsSync(path.join(workspaceRoot, "yarn.lock")))
360
+ return "yarn";
361
+ if (existsSync(path.join(workspaceRoot, "package-lock.json")))
362
+ return "npm";
363
+ if (existsSync(path.join(workspaceRoot, "Cargo.toml")))
364
+ return "cargo";
365
+ if (existsSync(path.join(workspaceRoot, "go.mod")))
366
+ return "go";
367
+ if (existsSync(path.join(workspaceRoot, "Pipfile")))
368
+ return "pipenv";
369
+ if (existsSync(path.join(workspaceRoot, "poetry.lock")))
370
+ return "poetry";
371
+ if (existsSync(path.join(workspaceRoot, "requirements.txt")))
372
+ return "pip";
373
+ if (existsSync(path.join(workspaceRoot, "Gemfile")))
374
+ return "bundler";
375
+ if (existsSync(path.join(workspaceRoot, "deno.json")) || existsSync(path.join(workspaceRoot, "deno.lock")))
376
+ return "deno";
377
+ return "unknown";
378
+ }
379
+ async function detectRuntime(workspaceRoot) {
380
+ // Check .node-version, .nvmrc
381
+ for (const file of [".node-version", ".nvmrc"]) {
382
+ const filePath = path.join(workspaceRoot, file);
383
+ if (existsSync(filePath)) {
384
+ try {
385
+ const version = (await readFile(filePath, "utf-8")).trim();
386
+ return `node ${version}`;
387
+ }
388
+ catch {
389
+ // Skip
390
+ }
391
+ }
392
+ }
393
+ // Check package.json engines
394
+ const pkgPath = path.join(workspaceRoot, "package.json");
395
+ if (existsSync(pkgPath)) {
396
+ try {
397
+ const pkg = JSON.parse(await readFile(pkgPath, "utf-8"));
398
+ if (pkg.engines?.node)
399
+ return `node ${pkg.engines.node}`;
400
+ }
401
+ catch {
402
+ // Skip
403
+ }
404
+ }
405
+ // Check runtime.txt (Python on Heroku etc.)
406
+ const runtimeTxt = path.join(workspaceRoot, "runtime.txt");
407
+ if (existsSync(runtimeTxt)) {
408
+ try {
409
+ return (await readFile(runtimeTxt, "utf-8")).trim();
410
+ }
411
+ catch {
412
+ // Skip
413
+ }
414
+ }
415
+ // Check go.mod for Go version
416
+ const goMod = path.join(workspaceRoot, "go.mod");
417
+ if (existsSync(goMod)) {
418
+ try {
419
+ const content = await readFile(goMod, "utf-8");
420
+ const match = content.match(/^go\s+([\d.]+)/m);
421
+ if (match)
422
+ return `go ${match[1]}`;
423
+ }
424
+ catch {
425
+ // Skip
426
+ }
427
+ }
428
+ // Check Cargo.toml for Rust edition
429
+ const cargoToml = path.join(workspaceRoot, "Cargo.toml");
430
+ if (existsSync(cargoToml)) {
431
+ try {
432
+ const content = await readFile(cargoToml, "utf-8");
433
+ const match = content.match(/edition\s*=\s*"(\d+)"/);
434
+ if (match)
435
+ return `rust edition ${match[1]}`;
436
+ }
437
+ catch {
438
+ // Skip
439
+ }
440
+ }
441
+ // Infer from package manager
442
+ if (existsSync(pkgPath))
443
+ return "node";
444
+ if (existsSync(path.join(workspaceRoot, "requirements.txt")) || existsSync(path.join(workspaceRoot, "pyproject.toml")))
445
+ return "python";
446
+ if (existsSync(goMod))
447
+ return "go";
448
+ if (existsSync(cargoToml))
449
+ return "rust";
450
+ return "unknown";
451
+ }
452
+ //# sourceMappingURL=framework-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework-detection.js","sourceRoot":"","sources":["../../src/profiler/framework-detection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Git history analysis: commit stats, hotspots, branching model.
3
+ */
4
+ import type { GitAnalysisResult } from "./types.js";
5
+ export declare function analyzeGitHistory(workspaceRoot: string): Promise<GitAnalysisResult>;
6
+ export declare function getHeadCommit(workspaceRoot: string): string | undefined;
7
+ //# sourceMappingURL=git-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-analysis.d.ts","sourceRoot":"","sources":["../../src/profiler/git-analysis.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAgBpD,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkDzF;AAED,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIvE"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Git history analysis: commit stats, hotspots, branching model.
3
+ */
4
+ import { execSync } from "node:child_process";
5
+ import { existsSync } from "node:fs";
6
+ import path from "node:path";
7
+ const GIT_TIMEOUT = 10_000; // 10 seconds max per git command
8
+ function git(workspaceRoot, args) {
9
+ try {
10
+ return execSync(`git -C "${workspaceRoot}" ${args}`, {
11
+ encoding: "utf-8",
12
+ timeout: GIT_TIMEOUT,
13
+ stdio: ["pipe", "pipe", "pipe"],
14
+ }).trim();
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ export async function analyzeGitHistory(workspaceRoot) {
21
+ const emptyResult = {
22
+ totalCommits: 0,
23
+ activeContributors: 0,
24
+ mostActiveDirectories: [],
25
+ branchingModel: "unknown",
26
+ hotspots: [],
27
+ };
28
+ // Check if it's a git repo
29
+ if (!existsSync(path.join(workspaceRoot, ".git"))) {
30
+ return emptyResult;
31
+ }
32
+ // Total commits
33
+ const commitCountStr = git(workspaceRoot, "rev-list --count HEAD");
34
+ const totalCommits = commitCountStr ? parseInt(commitCountStr, 10) : 0;
35
+ if (!totalCommits || isNaN(totalCommits)) {
36
+ return emptyResult;
37
+ }
38
+ // Active contributors (last 90 days)
39
+ const contributorsStr = git(workspaceRoot, 'shortlog -sn --since="90 days ago" HEAD');
40
+ const activeContributors = contributorsStr
41
+ ? contributorsStr.split("\n").filter((line) => line.trim()).length
42
+ : 0;
43
+ // Most changed files (hotspots)
44
+ const hotspotStr = git(workspaceRoot, "log --format= --name-only --diff-filter=ACMR -n 500 HEAD");
45
+ const hotspots = computeHotspots(hotspotStr);
46
+ // Most active directories
47
+ const mostActiveDirectories = computeActiveDirectories(hotspotStr);
48
+ // Branching model
49
+ const branchingModel = detectBranchingModel(workspaceRoot);
50
+ // HEAD SHA
51
+ const headSha = git(workspaceRoot, "rev-parse HEAD");
52
+ return {
53
+ totalCommits,
54
+ activeContributors,
55
+ mostActiveDirectories,
56
+ branchingModel,
57
+ hotspots,
58
+ };
59
+ }
60
+ export function getHeadCommit(workspaceRoot) {
61
+ if (!existsSync(path.join(workspaceRoot, ".git")))
62
+ return undefined;
63
+ const sha = git(workspaceRoot, "rev-parse HEAD");
64
+ return sha ?? undefined;
65
+ }
66
+ function computeHotspots(logOutput) {
67
+ if (!logOutput)
68
+ return [];
69
+ const fileCounts = new Map();
70
+ for (const line of logOutput.split("\n")) {
71
+ const trimmed = line.trim();
72
+ if (!trimmed)
73
+ continue;
74
+ // Skip binary files and node_modules
75
+ if (trimmed.includes("node_modules/") || trimmed.includes(".git/"))
76
+ continue;
77
+ fileCounts.set(trimmed, (fileCounts.get(trimmed) ?? 0) + 1);
78
+ }
79
+ return [...fileCounts.entries()]
80
+ .sort((a, b) => b[1] - a[1])
81
+ .slice(0, 20)
82
+ .map(([filePath, commits]) => ({ path: filePath, commits }));
83
+ }
84
+ function computeActiveDirectories(logOutput) {
85
+ if (!logOutput)
86
+ return [];
87
+ const dirCounts = new Map();
88
+ for (const line of logOutput.split("\n")) {
89
+ const trimmed = line.trim();
90
+ if (!trimmed)
91
+ continue;
92
+ if (trimmed.includes("node_modules/") || trimmed.includes(".git/"))
93
+ continue;
94
+ const dir = path.dirname(trimmed);
95
+ if (dir === ".")
96
+ continue;
97
+ // Use top-level directory grouping
98
+ const topDir = trimmed.split("/").slice(0, 2).join("/");
99
+ if (topDir) {
100
+ dirCounts.set(topDir + "/", (dirCounts.get(topDir + "/") ?? 0) + 1);
101
+ }
102
+ }
103
+ return [...dirCounts.entries()]
104
+ .sort((a, b) => b[1] - a[1])
105
+ .slice(0, 5)
106
+ .map(([dir]) => dir);
107
+ }
108
+ function detectBranchingModel(workspaceRoot) {
109
+ const branchesStr = git(workspaceRoot, "branch -a --format='%(refname:short)'");
110
+ if (!branchesStr)
111
+ return "unknown";
112
+ const branches = branchesStr.split("\n").map((b) => b.trim().replace(/^'|'$/g, ""));
113
+ const hasMain = branches.some((b) => b === "main" || b === "master" || b.endsWith("/main") || b.endsWith("/master"));
114
+ const hasDevelop = branches.some((b) => b === "develop" || b === "dev" || b.endsWith("/develop") || b.endsWith("/dev"));
115
+ const hasRelease = branches.some((b) => b.startsWith("release/") || b.includes("/release/"));
116
+ const hasFeature = branches.some((b) => b.startsWith("feature/") || b.includes("/feature/"));
117
+ if (hasDevelop && (hasRelease || hasFeature)) {
118
+ return "gitflow";
119
+ }
120
+ if (hasMain) {
121
+ return "trunk";
122
+ }
123
+ return "unknown";
124
+ }
125
+ //# sourceMappingURL=git-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-analysis.js","sourceRoot":"","sources":["../../src/profiler/git-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Import/require statement scanning across multiple languages.
3
+ * Counts import frequency per module to identify actual dependency usage.
4
+ */
5
+ import type { ImportAnalysis } from "./types.js";
6
+ export declare function analyzeImports(workspaceRoot: string, files: string[]): Promise<ImportAnalysis>;
7
+ //# sourceMappingURL=import-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-analysis.d.ts","sourceRoot":"","sources":["../../src/profiler/import-analysis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAqBjD,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,cAAc,CAAC,CAoEzB"}