project-context-ai 1.2.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/context/store.d.ts.map +1 -1
  2. package/dist/context/store.js +1 -0
  3. package/dist/context/store.js.map +1 -1
  4. package/dist/generators/claude.d.ts.map +1 -1
  5. package/dist/generators/claude.js +2 -1
  6. package/dist/generators/claude.js.map +1 -1
  7. package/dist/generators/codex.d.ts.map +1 -1
  8. package/dist/generators/codex.js +2 -1
  9. package/dist/generators/codex.js.map +1 -1
  10. package/dist/generators/copilot.d.ts.map +1 -1
  11. package/dist/generators/copilot.js +2 -1
  12. package/dist/generators/copilot.js.map +1 -1
  13. package/dist/generators/cursor.d.ts.map +1 -1
  14. package/dist/generators/cursor.js +2 -1
  15. package/dist/generators/cursor.js.map +1 -1
  16. package/dist/generators/gemini.d.ts.map +1 -1
  17. package/dist/generators/gemini.js +2 -1
  18. package/dist/generators/gemini.js.map +1 -1
  19. package/dist/generators/index.d.ts.map +1 -1
  20. package/dist/generators/index.js +58 -3
  21. package/dist/generators/index.js.map +1 -1
  22. package/dist/generators/template.d.ts +1 -0
  23. package/dist/generators/template.d.ts.map +1 -1
  24. package/dist/generators/template.js +168 -5
  25. package/dist/generators/template.js.map +1 -1
  26. package/dist/generators/trae.d.ts.map +1 -1
  27. package/dist/generators/trae.js +2 -1
  28. package/dist/generators/trae.js.map +1 -1
  29. package/dist/generators/windsurf.d.ts.map +1 -1
  30. package/dist/generators/windsurf.js +2 -1
  31. package/dist/generators/windsurf.js.map +1 -1
  32. package/dist/scanner/business.js +99 -6
  33. package/dist/scanner/business.js.map +1 -1
  34. package/dist/scanner/database.js +31 -1
  35. package/dist/scanner/database.js.map +1 -1
  36. package/dist/scanner/index.d.ts.map +1 -1
  37. package/dist/scanner/index.js +4 -1
  38. package/dist/scanner/index.js.map +1 -1
  39. package/dist/scanner/patterns.d.ts +51 -0
  40. package/dist/scanner/patterns.d.ts.map +1 -0
  41. package/dist/scanner/patterns.js +500 -0
  42. package/dist/scanner/patterns.js.map +1 -0
  43. package/dist/scanner/routes.js +16 -2
  44. package/dist/scanner/routes.js.map +1 -1
  45. package/dist/types.d.ts +17 -0
  46. package/dist/types.d.ts.map +1 -1
  47. package/package.json +1 -1
@@ -0,0 +1,500 @@
1
+ import { join } from "node:path";
2
+ import { readTextFile, readFilesMatching } from "../utils/files.js";
3
+ export async function scanCodePatterns(rootPath, allFiles, deps, frameworks) {
4
+ const [di, imports, naming, workflows, codeConventions, ideSkills, ideCommands, errorHandling, testPatterns, architecturalRules, codeExamples] = await Promise.all([
5
+ detectDI(rootPath, allFiles, deps),
6
+ detectImportPatterns(rootPath, allFiles),
7
+ detectNaming(rootPath, allFiles),
8
+ detectWorkflows(rootPath, allFiles, deps, frameworks),
9
+ detectCodeConventions(rootPath, allFiles),
10
+ scanIDESkills(rootPath, allFiles),
11
+ scanIDECommands(rootPath, allFiles),
12
+ detectErrorHandling(rootPath, allFiles),
13
+ detectTestPatterns(rootPath, allFiles, deps, frameworks),
14
+ detectArchitecturalRules(rootPath, allFiles),
15
+ extractCodeExamples(rootPath, allFiles, deps),
16
+ ]);
17
+ return {
18
+ di, imports, naming, workflows, codeConventions, ideSkills, ideCommands,
19
+ errorHandling, testPatterns, architecturalRules, codeExamples,
20
+ };
21
+ }
22
+ // ─── Dependency Injection ─────────────────────────────────
23
+ async function detectDI(rootPath, allFiles, deps) {
24
+ const depNames = deps.map((d) => d.name);
25
+ if (depNames.includes("@nestjs/core"))
26
+ return "NestJS built-in DI (@Injectable, @Inject)";
27
+ if (depNames.includes("tsyringe"))
28
+ return "TSyringe (@injectable, @inject, container.resolve)";
29
+ if (depNames.includes("inversify"))
30
+ return "Inversify (@injectable, @inject, Container)";
31
+ if (depNames.includes("@cubos/inject"))
32
+ return "@cubos/inject (use() function for DI resolution)";
33
+ if (depNames.includes("typedi"))
34
+ return "TypeDI (Container.get, @Service)";
35
+ if (depNames.includes("awilix"))
36
+ return "Awilix (createContainer, asClass, asFunction)";
37
+ const sourceFiles = await readFilesMatching(rootPath, allFiles, {
38
+ extensions: [".ts", ".js"],
39
+ maxFiles: 50,
40
+ maxFileSize: 5120,
41
+ pathPatterns: [/(container|inject|provider|ioc|di)\./i],
42
+ });
43
+ for (const { content } of sourceFiles) {
44
+ if (content.includes("container.resolve") || content.includes("Container.get")) {
45
+ return "Custom container-based DI";
46
+ }
47
+ }
48
+ return null;
49
+ }
50
+ // ─── Import Patterns ──────────────────────────────────────
51
+ async function detectImportPatterns(rootPath, allFiles) {
52
+ const patterns = [];
53
+ const sourceFiles = await readFilesMatching(rootPath, allFiles, {
54
+ extensions: [".ts", ".tsx", ".js", ".jsx"],
55
+ maxFiles: 30,
56
+ maxFileSize: 5120,
57
+ });
58
+ let hasRelativeImports = false;
59
+ let hasAbsoluteImports = false;
60
+ let hasAliasImports = false;
61
+ let hasBarrelImports = false;
62
+ for (const { content } of sourceFiles) {
63
+ const imports = content.match(/from\s+['"]([^'"]+)['"]/g) || [];
64
+ for (const imp of imports) {
65
+ const path = imp.match(/from\s+['"]([^'"]+)['"]/)?.[1] || "";
66
+ if (path.startsWith("."))
67
+ hasRelativeImports = true;
68
+ else if (path.startsWith("@/") || path.startsWith("~/") || path.startsWith("src/"))
69
+ hasAbsoluteImports = true;
70
+ else if (path.startsWith("@") && !path.includes("/node_modules"))
71
+ hasAliasImports = true;
72
+ }
73
+ if (content.match(/export\s*\{[\s\S]*?\}\s*from/))
74
+ hasBarrelImports = true;
75
+ }
76
+ if (hasRelativeImports && !hasAbsoluteImports)
77
+ patterns.push("Relative imports only (no absolute paths)");
78
+ if (hasAbsoluteImports)
79
+ patterns.push("Absolute imports with path aliases");
80
+ if (hasAliasImports)
81
+ patterns.push("Scoped package aliases (@/)");
82
+ if (hasBarrelImports)
83
+ patterns.push("Barrel exports (index.ts re-exports)");
84
+ const tsconfig = await readTextFile(join(rootPath, "tsconfig.json"));
85
+ if (tsconfig?.includes('"paths"')) {
86
+ const pathsMatch = tsconfig.match(/"paths"\s*:\s*\{([^}]+)\}/);
87
+ if (pathsMatch) {
88
+ const aliases = pathsMatch[1].match(/"(@?\w[^"]*)":/g);
89
+ if (aliases) {
90
+ patterns.push(`Path aliases: ${aliases.map((a) => a.replace(/"/g, "").replace(":", "")).join(", ")}`);
91
+ }
92
+ }
93
+ }
94
+ return patterns;
95
+ }
96
+ // ─── Naming Conventions ───────────────────────────────────
97
+ async function detectNaming(rootPath, allFiles) {
98
+ const tsFiles = allFiles.filter((f) => f.match(/\.(ts|tsx|js|jsx)$/) && !f.includes("node_modules"));
99
+ const fileNames = tsFiles.map((f) => f.split("/").pop() || "").filter(Boolean);
100
+ let kebabCount = 0;
101
+ let camelCount = 0;
102
+ let pascalCount = 0;
103
+ for (const name of fileNames) {
104
+ const baseName = name.replace(/\.(ts|tsx|js|jsx)$/, "");
105
+ if (baseName.includes("-"))
106
+ kebabCount++;
107
+ else if (baseName[0] === baseName[0].toUpperCase() && /[a-z]/.test(baseName))
108
+ pascalCount++;
109
+ else if (/[a-z]/.test(baseName))
110
+ camelCount++;
111
+ }
112
+ const maxCount = Math.max(kebabCount, camelCount, pascalCount);
113
+ let fileNaming = "mixed";
114
+ if (kebabCount === maxCount && kebabCount > camelCount + pascalCount)
115
+ fileNaming = "kebab-case (my-component.ts)";
116
+ else if (pascalCount === maxCount && pascalCount > kebabCount + camelCount)
117
+ fileNaming = "PascalCase (MyComponent.ts)";
118
+ else if (camelCount === maxCount && camelCount > kebabCount + pascalCount)
119
+ fileNaming = "camelCase (myComponent.ts)";
120
+ // DB column naming — read actual schema/migrations
121
+ let dbColumns = "unknown";
122
+ const prismaFile = allFiles.find((f) => f.endsWith("schema.prisma"));
123
+ if (prismaFile) {
124
+ const content = await readTextFile(join(rootPath, prismaFile));
125
+ if (content) {
126
+ const fieldNames = [];
127
+ const fieldRegex = /^\s+(\w+)\s+\w+/gm;
128
+ let match;
129
+ while ((match = fieldRegex.exec(content)) !== null) {
130
+ const name = match[1];
131
+ if (!["model", "enum", "datasource", "generator"].includes(name))
132
+ fieldNames.push(name);
133
+ }
134
+ const snakeCount = fieldNames.filter((n) => n.includes("_")).length;
135
+ const camelFieldCount = fieldNames.filter((n) => !n.includes("_") && n !== n.toLowerCase()).length;
136
+ if (snakeCount > camelFieldCount)
137
+ dbColumns = "snake_case";
138
+ else if (fieldNames.length > 0)
139
+ dbColumns = "camelCase";
140
+ }
141
+ }
142
+ if (dbColumns === "unknown") {
143
+ const migrationFiles = allFiles.filter((f) => f.includes("migration") && f.match(/\.(ts|js|sql)$/));
144
+ if (migrationFiles.length > 0) {
145
+ const content = await readTextFile(join(rootPath, migrationFiles[0]));
146
+ if (content) {
147
+ const snakeMatches = content.match(/["'`]\w+_\w+["'`]/g);
148
+ if (snakeMatches && snakeMatches.length > 3)
149
+ dbColumns = "snake_case";
150
+ const camelMatches = content.match(/["'`][a-z]+[A-Z]\w+["'`]/g);
151
+ if (camelMatches && camelMatches.length > 3)
152
+ dbColumns = "camelCase (quote in raw SQL)";
153
+ }
154
+ }
155
+ }
156
+ return { files: fileNaming, variables: "camelCase", dbColumns };
157
+ }
158
+ // ─── Error Handling ───────────────────────────────────────
159
+ async function detectErrorHandling(rootPath, allFiles) {
160
+ const patterns = [];
161
+ const sourceFiles = await readFilesMatching(rootPath, allFiles, {
162
+ extensions: [".ts", ".js"],
163
+ maxFiles: 100,
164
+ maxFileSize: 10240,
165
+ });
166
+ for (const { file, content } of sourceFiles) {
167
+ const regex = /class\s+(\w+)\s+extends\s+(Error|BaseError|DomainError|AppError|HttpException|CustomError|BusinessError|NotFound|BadRequest|Unauthorized|Forbidden)\b/g;
168
+ let match;
169
+ while ((match = regex.exec(content)) !== null) {
170
+ patterns.push({ className: match[1], extendsFrom: match[2], file });
171
+ }
172
+ if (patterns.length >= 30)
173
+ break;
174
+ }
175
+ // Dedupe by className
176
+ const seen = new Set();
177
+ return patterns.filter((p) => {
178
+ if (seen.has(p.className))
179
+ return false;
180
+ seen.add(p.className);
181
+ return true;
182
+ });
183
+ }
184
+ // ─── Test Patterns ────────────────────────────────────────
185
+ async function detectTestPatterns(rootPath, allFiles, deps, frameworks) {
186
+ const depNames = deps.map((d) => d.name);
187
+ const fwNames = frameworks.map((f) => f.name);
188
+ let framework = "";
189
+ if (depNames.includes("vitest") || fwNames.includes("Vitest"))
190
+ framework = "Vitest";
191
+ else if (depNames.includes("jest") || depNames.includes("ts-jest") || fwNames.includes("Jest"))
192
+ framework = "Jest";
193
+ else if (depNames.includes("mocha"))
194
+ framework = "Mocha";
195
+ if (!framework)
196
+ return null;
197
+ // Coverage threshold
198
+ let coverageThreshold = null;
199
+ const configFiles = allFiles.filter((f) => f.match(/(jest|vitest)\..*config\.(ts|js|mjs|cjs|json)$/));
200
+ for (const cf of configFiles.slice(0, 3)) {
201
+ const content = await readTextFile(join(rootPath, cf));
202
+ if (!content)
203
+ continue;
204
+ const thresholdMatch = content.match(/(?:branches|lines|functions|statements)\s*:\s*(\d+)/);
205
+ if (thresholdMatch) {
206
+ coverageThreshold = parseInt(thresholdMatch[1], 10);
207
+ break;
208
+ }
209
+ }
210
+ // File patterns
211
+ const testFiles = allFiles.filter((f) => f.match(/\.(test|spec)\.(ts|tsx|js|jsx)$/));
212
+ const specCount = testFiles.filter((f) => f.includes(".spec.")).length;
213
+ const testCount = testFiles.filter((f) => f.includes(".test.")).length;
214
+ const unitFilePattern = specCount > testCount ? "*.spec.ts" : "*.test.ts";
215
+ let integrationFilePattern = null;
216
+ if (allFiles.some((f) => f.includes("__tests__/")))
217
+ integrationFilePattern = "__tests__/**/*.test.ts";
218
+ else if (allFiles.some((f) => f.includes("e2e/")))
219
+ integrationFilePattern = "e2e/**/*.test.ts";
220
+ let testDir = "src/";
221
+ if (allFiles.some((f) => f.includes("__tests__/")))
222
+ testDir = "__tests__/";
223
+ else if (allFiles.some((f) => f.match(/^tests?\//)))
224
+ testDir = "tests/";
225
+ // Assertion style
226
+ let assertionStyle = null;
227
+ if (testFiles.length > 0) {
228
+ const content = await readTextFile(join(rootPath, testFiles[0]));
229
+ if (content) {
230
+ if (content.includes("expect("))
231
+ assertionStyle = "expect() (Jest/Vitest)";
232
+ else if (content.includes("assert."))
233
+ assertionStyle = "assert (Node.js/Chai)";
234
+ }
235
+ }
236
+ return { framework, coverageThreshold, unitFilePattern, integrationFilePattern, testDir, assertionStyle };
237
+ }
238
+ // ─── Architectural Rules ──────────────────────────────────
239
+ async function detectArchitecturalRules(rootPath, allFiles) {
240
+ const rules = [];
241
+ // 1. dependency-cruiser config
242
+ const dcFile = allFiles.find((f) => f.match(/\.dependency-cruiser\.(cjs|js|json)$/));
243
+ if (dcFile) {
244
+ const content = await readTextFile(join(rootPath, dcFile));
245
+ if (content) {
246
+ const nameRegex = /name\s*:\s*['"`]([^'"`]+)['"`]/g;
247
+ let match;
248
+ while ((match = nameRegex.exec(content)) !== null) {
249
+ rules.push(`Dependency rule: ${match[1]}`);
250
+ if (rules.length >= 10)
251
+ break;
252
+ }
253
+ }
254
+ }
255
+ // 2. ESLint boundary rules
256
+ const eslintFiles = allFiles.filter((f) => f.match(/eslint/i) && !f.includes("node_modules"));
257
+ for (const ef of eslintFiles.slice(0, 2)) {
258
+ const content = await readTextFile(join(rootPath, ef));
259
+ if (!content)
260
+ continue;
261
+ if (content.includes("import/no-restricted-paths") || content.includes("boundaries/element-types")) {
262
+ rules.push("ESLint enforced import boundaries between layers");
263
+ }
264
+ }
265
+ // 3. Infer from structure — check if domain doesn't import from infra
266
+ const hasDomain = allFiles.some((f) => f.match(/src\/(domain|core)\//));
267
+ const hasInfra = allFiles.some((f) => f.match(/src\/(infra|infrastructure)\//));
268
+ const hasApp = allFiles.some((f) => f.match(/src\/(application|use-?cases)\//));
269
+ if (hasDomain && hasInfra) {
270
+ const domainFiles = await readFilesMatching(rootPath, allFiles, {
271
+ extensions: [".ts", ".js"],
272
+ maxFiles: 20,
273
+ maxFileSize: 5120,
274
+ pathPatterns: [/src\/(domain|core)\//],
275
+ });
276
+ let domainImportsInfra = false;
277
+ for (const { content } of domainFiles) {
278
+ if (content.match(/from\s+['"].*\/(infra|infrastructure)\//)) {
279
+ domainImportsInfra = true;
280
+ break;
281
+ }
282
+ }
283
+ if (!domainImportsInfra) {
284
+ rules.push("Domain/Core layer does NOT import from Infrastructure (Clean Architecture)");
285
+ }
286
+ if (hasApp) {
287
+ rules.push("Layers: Domain → Application → Infrastructure");
288
+ }
289
+ }
290
+ return rules;
291
+ }
292
+ // ─── Code Examples ────────────────────────────────────────
293
+ async function extractCodeExamples(rootPath, allFiles, deps) {
294
+ const examples = [];
295
+ const depNames = deps.map((d) => d.name);
296
+ const categories = [
297
+ { category: "service", patterns: [/services?\//i], label: "Service pattern" },
298
+ { category: "controller", patterns: [/controllers?\//i], label: "Controller pattern" },
299
+ { category: "repository", patterns: [/repositor/i], label: "Repository pattern" },
300
+ { category: "middleware", patterns: [/middleware/i], label: "Middleware pattern" },
301
+ { category: "error-handling", patterns: [/(errors|exceptions)\//i], label: "Error handling" },
302
+ ];
303
+ for (const cat of categories) {
304
+ const candidates = allFiles.filter((f) => f.match(/\.(ts|js)$/) &&
305
+ cat.patterns.some((p) => p.test(f)) &&
306
+ !f.includes(".test.") && !f.includes(".spec.") &&
307
+ !f.includes("index.") && !f.includes("generated/"));
308
+ if (candidates.length === 0)
309
+ continue;
310
+ const content = await readTextFile(join(rootPath, candidates[0]));
311
+ if (!content)
312
+ continue;
313
+ const lines = content.split("\n").slice(0, 40);
314
+ // Extract meaningful code: class definition or function
315
+ const snippet = lines.join("\n");
316
+ const classMatch = snippet.match(/((?:export\s+)?(?:abstract\s+)?class\s+\w+[^{]*\{[^}]*(?:\n[^}]*){0,8})/);
317
+ const fnMatch = snippet.match(/((?:export\s+)?(?:async\s+)?function\s+\w+[^{]*\{[^}]*(?:\n[^}]*){0,5})/);
318
+ const code = classMatch?.[1] || fnMatch?.[1] || lines.slice(0, 15).join("\n");
319
+ if (code.trim().length > 30) {
320
+ examples.push({
321
+ file: candidates[0],
322
+ label: cat.label,
323
+ code: code.trim().slice(0, 500),
324
+ category: cat.category,
325
+ });
326
+ }
327
+ if (examples.length >= 6)
328
+ break;
329
+ }
330
+ // DI example
331
+ if (depNames.includes("@cubos/inject") || depNames.includes("tsyringe") || depNames.includes("inversify")) {
332
+ const diFiles = await readFilesMatching(rootPath, allFiles, {
333
+ extensions: [".ts"],
334
+ maxFiles: 10,
335
+ maxFileSize: 5120,
336
+ pathPatterns: [/(services?|controllers?|use-?cases?)\//],
337
+ });
338
+ for (const { file, content } of diFiles) {
339
+ const useMatch = content.match(/.*use\(\w+\).*/);
340
+ const injectMatch = content.match(/.*@Inject.*|.*@injectable.*/i);
341
+ const line = useMatch?.[0] || injectMatch?.[0];
342
+ if (line) {
343
+ examples.push({ file, label: "DI usage", code: line.trim(), category: "di" });
344
+ break;
345
+ }
346
+ }
347
+ }
348
+ return examples;
349
+ }
350
+ // ─── Workflows ────────────────────────────────────────────
351
+ async function detectWorkflows(rootPath, allFiles, deps, frameworks) {
352
+ const workflows = [];
353
+ const depNames = deps.map((d) => d.name);
354
+ if (allFiles.some((f) => f.endsWith(".sdkgen"))) {
355
+ workflows.push("SDKGEN: define .sdkgen schema → `pnpm run sdkgen` → implement controllers");
356
+ }
357
+ if (depNames.includes("@graphql-codegen/cli") || allFiles.some((f) => f.includes("codegen"))) {
358
+ workflows.push("GraphQL Codegen: .graphql schema → generated types/resolvers");
359
+ }
360
+ if (allFiles.some((f) => f.endsWith("schema.prisma"))) {
361
+ workflows.push("Prisma: edit schema.prisma → `prisma generate` → `prisma migrate dev`");
362
+ }
363
+ if (depNames.includes("drizzle-kit")) {
364
+ workflows.push("Drizzle: edit schema → `drizzle-kit generate` → `drizzle-kit migrate`");
365
+ }
366
+ if (allFiles.some((f) => f.includes("knexfile"))) {
367
+ workflows.push("Knex migrations: `knex migrate:make <name>` → edit → `knex migrate:latest`");
368
+ }
369
+ if (allFiles.some((f) => f.match(/openapi|swagger/i) && f.match(/\.(json|yaml|yml)$/))) {
370
+ workflows.push("OpenAPI/Swagger spec → generated client/types");
371
+ }
372
+ if (depNames.includes("turbo"))
373
+ workflows.push("Turborepo: `turbo run <task>` across packages");
374
+ if (depNames.includes("lerna"))
375
+ workflows.push("Lerna: `lerna run <task>` across packages");
376
+ if (allFiles.includes("nx.json"))
377
+ workflows.push("Nx: `nx run <project>:<task>`");
378
+ if (allFiles.some((f) => f.includes(".github/workflows/")))
379
+ workflows.push("GitHub Actions CI/CD");
380
+ if (allFiles.some((f) => f.includes(".gitlab-ci")))
381
+ workflows.push("GitLab CI/CD");
382
+ if (allFiles.includes("Jenkinsfile"))
383
+ workflows.push("Jenkins CI/CD");
384
+ if (depNames.includes("husky"))
385
+ workflows.push("Husky: pre-commit hooks for linting/formatting");
386
+ if (depNames.includes("commitizen") || depNames.includes("git-cz"))
387
+ workflows.push("Commitizen: standardized commit messages (`git cz`)");
388
+ if (allFiles.includes("Dockerfile"))
389
+ workflows.push("Docker: containerized deployment");
390
+ if (allFiles.some((f) => f.match(/(docker-)?compose\.(yml|yaml)$/)))
391
+ workflows.push("Docker Compose: multi-service local dev");
392
+ if (depNames.includes("electron") || depNames.includes("electron-builder")) {
393
+ workflows.push("Electron: build → bundle → `electron-builder` dist");
394
+ }
395
+ return workflows;
396
+ }
397
+ // ─── Code Conventions ─────────────────────────────────────
398
+ async function detectCodeConventions(rootPath, allFiles) {
399
+ const conventions = [];
400
+ const tsconfig = await readTextFile(join(rootPath, "tsconfig.json"));
401
+ if (tsconfig) {
402
+ if (tsconfig.includes('"strict": true') || tsconfig.includes('"strict":true')) {
403
+ conventions.push("TypeScript strict mode enabled");
404
+ }
405
+ if (tsconfig.includes('"noImplicitAny"')) {
406
+ conventions.push("No implicit any types");
407
+ }
408
+ }
409
+ const eslintFiles = allFiles.filter((f) => f.match(/eslint/i) && !f.includes("node_modules"));
410
+ if (eslintFiles.length > 0) {
411
+ const content = await readTextFile(join(rootPath, eslintFiles[0]));
412
+ if (content) {
413
+ if (content.includes("no-any") || content.includes("@typescript-eslint/no-explicit-any")) {
414
+ conventions.push("No `any` type allowed (ESLint enforced)");
415
+ }
416
+ if (content.includes("no-console")) {
417
+ conventions.push("No console.log (use logger instead)");
418
+ }
419
+ }
420
+ }
421
+ const repoFiles = await readFilesMatching(rootPath, allFiles, {
422
+ extensions: [".ts", ".js"],
423
+ maxFiles: 20,
424
+ maxFileSize: 5120,
425
+ pathPatterns: [/repositor/i],
426
+ });
427
+ for (const { content } of repoFiles) {
428
+ if (content.includes("isDeleted") || content.includes("is_deleted") || content.includes("deletedAt")) {
429
+ conventions.push("Soft delete pattern (filter `isDeleted`/`deletedAt`)");
430
+ break;
431
+ }
432
+ }
433
+ for (const { content } of repoFiles) {
434
+ if (content.match(/class\s+\w+\s+extends\s+Base(Repository|Repo)/)) {
435
+ conventions.push("BaseRepository pattern for data access");
436
+ break;
437
+ }
438
+ }
439
+ return conventions;
440
+ }
441
+ // ─── IDE Skills ───────────────────────────────────────────
442
+ async function scanIDESkills(rootPath, allFiles) {
443
+ const skills = [];
444
+ const skillFiles = allFiles.filter((f) => f.match(/\.claude\/skills\/.*\.(mdc|md)$/) ||
445
+ f.match(/\.cursor\/rules\/.*\.(md|mdc)$/) ||
446
+ f.match(/\.trae\/rules\/.*\.(md|mdc)$/));
447
+ for (const file of skillFiles.slice(0, 20)) {
448
+ const content = await readTextFile(join(rootPath, file));
449
+ if (!content)
450
+ continue;
451
+ const name = file.split("/").pop()?.replace(/\.(mdc|md)$/, "") || file;
452
+ let activatesOn = "";
453
+ let description = "";
454
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
455
+ if (frontmatterMatch) {
456
+ const fm = frontmatterMatch[1];
457
+ const globMatch = fm.match(/globs?:\s*(.+)/i);
458
+ if (globMatch)
459
+ activatesOn = globMatch[1].trim();
460
+ const descMatch = fm.match(/description:\s*(.+)/i);
461
+ if (descMatch)
462
+ description = descMatch[1].trim().replace(/^["']|["']$/g, "");
463
+ }
464
+ if (!description) {
465
+ const headingMatch = content.match(/^#\s+(.+)$/m);
466
+ if (headingMatch)
467
+ description = headingMatch[1].trim();
468
+ else {
469
+ const firstLine = content.split("\n").find((l) => l.trim() && !l.startsWith("---") && !l.startsWith("#"));
470
+ if (firstLine)
471
+ description = firstLine.trim().slice(0, 100);
472
+ }
473
+ }
474
+ skills.push({ name, file, activatesOn, description });
475
+ }
476
+ return skills;
477
+ }
478
+ // ─── IDE Commands ─────────────────────────────────────────
479
+ async function scanIDECommands(rootPath, allFiles) {
480
+ const commands = [];
481
+ const cmdFiles = allFiles.filter((f) => f.match(/\.claude\/commands\/.*\.(md|mdc|txt)$/));
482
+ for (const file of cmdFiles.slice(0, 20)) {
483
+ const content = await readTextFile(join(rootPath, file));
484
+ if (!content)
485
+ continue;
486
+ const name = file.split("/").pop()?.replace(/\.(md|mdc|txt)$/, "") || file;
487
+ let description = "";
488
+ const headingMatch = content.match(/^#\s+(.+)$/m);
489
+ if (headingMatch)
490
+ description = headingMatch[1].trim();
491
+ else {
492
+ const firstLine = content.split("\n").find((l) => l.trim() && !l.startsWith("---"));
493
+ if (firstLine)
494
+ description = firstLine.trim().slice(0, 100);
495
+ }
496
+ commands.push({ name, file, description });
497
+ }
498
+ return commands;
499
+ }
500
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/scanner/patterns.ts"],"names":[],"mappings":"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"}
@@ -93,7 +93,18 @@ async function scanExpressLikeRoutes(rootPath, allFiles) {
93
93
  const lineEnd = content.indexOf("\n", match.index + match[0].length);
94
94
  const surroundingContext = content.slice(Math.max(0, lineStart - 200), lineEnd + 200);
95
95
  const hasAuth = AUTH_KEYWORDS.test(surroundingContext);
96
- routes.push({ method, path, file, auth: hasAuth });
96
+ // Extract handler name from route definition
97
+ const fullLine = content.slice(match.index, Math.min(content.length, match.index + match[0].length + 300));
98
+ const handlerMatch2 = fullLine.match(/,\s*(\w+)\s*\)?\s*$/m);
99
+ const handler = handlerMatch2?.[1];
100
+ // Extract JSDoc comment above route
101
+ const beforeRoute = content.slice(Math.max(0, match.index - 300), match.index);
102
+ const jsdocMatch = beforeRoute.match(/\/\*\*\s*([\s\S]*?)\*\/\s*$/);
103
+ let description;
104
+ if (jsdocMatch) {
105
+ description = jsdocMatch[1].replace(/\s*\*\s*/g, " ").replace(/@\w+.*/g, "").trim().slice(0, 100);
106
+ }
107
+ routes.push({ method, path, file, auth: hasAuth, handler, description });
97
108
  }
98
109
  }
99
110
  return routes;
@@ -114,7 +125,10 @@ async function scanNestJSRoutes(rootPath, allFiles) {
114
125
  const method = match[1].toUpperCase();
115
126
  const subPath = match[2] || "";
116
127
  const fullPath = `${basePath}${subPath}`;
117
- routes.push({ method, path: fullPath || "/", file, auth: hasAuth });
128
+ // Extract handler method name
129
+ const afterDecorator = content.slice(methodRegex.lastIndex);
130
+ const handlerNameMatch = afterDecorator.match(/^\s*(?:async\s+)?(\w+)\s*\(/);
131
+ routes.push({ method, path: fullPath || "/", file, auth: hasAuth, handler: handlerNameMatch?.[1] });
118
132
  }
119
133
  }
120
134
  return routes;
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/scanner/routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/scanner/routes.ts"],"names":[],"mappings":"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"}