project-context-ai 1.2.0 → 1.3.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 (46) 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 +94 -4
  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.d.ts.map +1 -1
  33. package/dist/scanner/business.js +234 -64
  34. package/dist/scanner/business.js.map +1 -1
  35. package/dist/scanner/conventions.js +31 -3
  36. package/dist/scanner/conventions.js.map +1 -1
  37. package/dist/scanner/index.d.ts.map +1 -1
  38. package/dist/scanner/index.js +6 -3
  39. package/dist/scanner/index.js.map +1 -1
  40. package/dist/scanner/patterns.d.ts +28 -0
  41. package/dist/scanner/patterns.d.ts.map +1 -0
  42. package/dist/scanner/patterns.js +329 -0
  43. package/dist/scanner/patterns.js.map +1 -0
  44. package/dist/types.d.ts +13 -0
  45. package/dist/types.d.ts.map +1 -1
  46. package/package.json +1 -1
@@ -0,0 +1,329 @@
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] = await Promise.all([
5
+ detectDI(rootPath, allFiles, deps),
6
+ detectImportPatterns(rootPath, allFiles),
7
+ detectNaming(allFiles),
8
+ detectWorkflows(rootPath, allFiles, deps, frameworks),
9
+ detectCodeConventions(rootPath, allFiles),
10
+ scanIDESkills(rootPath, allFiles),
11
+ scanIDECommands(rootPath, allFiles),
12
+ ]);
13
+ return { di, imports, naming, workflows, codeConventions, ideSkills, ideCommands };
14
+ }
15
+ // ─── Dependency Injection ─────────────────────────────────
16
+ async function detectDI(rootPath, allFiles, deps) {
17
+ const depNames = deps.map((d) => d.name);
18
+ // Known DI frameworks
19
+ if (depNames.includes("@nestjs/core"))
20
+ return "NestJS built-in DI (@Injectable, @Inject)";
21
+ if (depNames.includes("tsyringe"))
22
+ return "TSyringe (@injectable, @inject, container.resolve)";
23
+ if (depNames.includes("inversify"))
24
+ return "Inversify (@injectable, @inject, Container)";
25
+ if (depNames.includes("@cubos/inject"))
26
+ return "@cubos/inject (use() function for DI resolution)";
27
+ if (depNames.includes("typedi"))
28
+ return "TypeDI (Container.get, @Service)";
29
+ if (depNames.includes("awilix"))
30
+ return "Awilix (createContainer, asClass, asFunction)";
31
+ // Detect custom DI patterns from code
32
+ const sourceFiles = await readFilesMatching(rootPath, allFiles, {
33
+ extensions: [".ts", ".js"],
34
+ maxFiles: 50,
35
+ maxFileSize: 5120,
36
+ pathPatterns: [/(container|inject|provider|ioc|di)\./i],
37
+ });
38
+ for (const { content } of sourceFiles) {
39
+ if (content.includes("container.resolve") || content.includes("Container.get")) {
40
+ return "Custom container-based DI";
41
+ }
42
+ }
43
+ return null;
44
+ }
45
+ // ─── Import Patterns ──────────────────────────────────────
46
+ async function detectImportPatterns(rootPath, allFiles) {
47
+ const patterns = [];
48
+ const sourceFiles = await readFilesMatching(rootPath, allFiles, {
49
+ extensions: [".ts", ".tsx", ".js", ".jsx"],
50
+ maxFiles: 30,
51
+ maxFileSize: 5120,
52
+ });
53
+ let hasRelativeImports = false;
54
+ let hasAbsoluteImports = false;
55
+ let hasAliasImports = false;
56
+ let hasBarrelImports = false;
57
+ for (const { content } of sourceFiles) {
58
+ const imports = content.match(/from\s+['"]([^'"]+)['"]/g) || [];
59
+ for (const imp of imports) {
60
+ const path = imp.match(/from\s+['"]([^'"]+)['"]/)?.[1] || "";
61
+ if (path.startsWith("."))
62
+ hasRelativeImports = true;
63
+ else if (path.startsWith("@/") || path.startsWith("~/") || path.startsWith("src/"))
64
+ hasAbsoluteImports = true;
65
+ else if (path.startsWith("@") && !path.includes("/node_modules"))
66
+ hasAliasImports = true;
67
+ }
68
+ if (content.match(/export\s*\{[\s\S]*?\}\s*from/))
69
+ hasBarrelImports = true;
70
+ }
71
+ if (hasRelativeImports && !hasAbsoluteImports)
72
+ patterns.push("Relative imports only (no absolute paths)");
73
+ if (hasAbsoluteImports)
74
+ patterns.push("Absolute imports with path aliases");
75
+ if (hasAliasImports)
76
+ patterns.push("Scoped package aliases (@/)");
77
+ if (hasBarrelImports)
78
+ patterns.push("Barrel exports (index.ts re-exports)");
79
+ // Check tsconfig for path aliases
80
+ const tsconfig = await readTextFile(join(rootPath, "tsconfig.json"));
81
+ if (tsconfig) {
82
+ if (tsconfig.includes('"paths"')) {
83
+ const pathsMatch = tsconfig.match(/"paths"\s*:\s*\{([^}]+)\}/);
84
+ if (pathsMatch) {
85
+ const aliases = pathsMatch[1].match(/"(@?\w[^"]*)":/g);
86
+ if (aliases) {
87
+ patterns.push(`Path aliases: ${aliases.map((a) => a.replace(/"/g, "").replace(":", "")).join(", ")}`);
88
+ }
89
+ }
90
+ }
91
+ }
92
+ return patterns;
93
+ }
94
+ // ─── Naming Conventions ───────────────────────────────────
95
+ async function detectNaming(allFiles) {
96
+ const tsFiles = allFiles.filter((f) => f.match(/\.(ts|tsx|js|jsx)$/) && !f.includes("node_modules"));
97
+ // File naming
98
+ const fileNames = tsFiles.map((f) => f.split("/").pop() || "").filter(Boolean);
99
+ let kebabCount = 0;
100
+ let camelCount = 0;
101
+ let pascalCount = 0;
102
+ for (const name of fileNames) {
103
+ const baseName = name.replace(/\.(ts|tsx|js|jsx)$/, "");
104
+ if (baseName.includes("-"))
105
+ kebabCount++;
106
+ else if (baseName[0] === baseName[0].toUpperCase() && baseName.includes(baseName[0].toLowerCase()))
107
+ pascalCount++;
108
+ else if (baseName.includes(baseName[0].toLowerCase()))
109
+ camelCount++;
110
+ }
111
+ const maxCount = Math.max(kebabCount, camelCount, pascalCount);
112
+ let fileNaming = "mixed";
113
+ if (kebabCount === maxCount && kebabCount > camelCount + pascalCount)
114
+ fileNaming = "kebab-case (my-component.ts)";
115
+ else if (pascalCount === maxCount && pascalCount > kebabCount + camelCount)
116
+ fileNaming = "PascalCase (MyComponent.ts)";
117
+ else if (camelCount === maxCount && camelCount > kebabCount + pascalCount)
118
+ fileNaming = "camelCase (myComponent.ts)";
119
+ // DB column naming — check for knex/prisma patterns
120
+ let dbColumns = "unknown";
121
+ const hasSnakeCase = allFiles.some((f) => f.includes("migration") || f.includes("knexfile"));
122
+ const hasCamelCase = allFiles.some((f) => f.includes("prisma/schema.prisma"));
123
+ if (hasSnakeCase && !hasCamelCase)
124
+ dbColumns = "snake_case";
125
+ else if (hasCamelCase)
126
+ dbColumns = "camelCase";
127
+ return {
128
+ files: fileNaming,
129
+ variables: "camelCase",
130
+ dbColumns,
131
+ };
132
+ }
133
+ // ─── Workflows ────────────────────────────────────────────
134
+ async function detectWorkflows(rootPath, allFiles, deps, frameworks) {
135
+ const workflows = [];
136
+ const depNames = deps.map((d) => d.name);
137
+ // SDKGEN
138
+ if (allFiles.some((f) => f.endsWith(".sdkgen"))) {
139
+ workflows.push("SDKGEN: .sdkgen files define API schemas → run codegen → implement controllers");
140
+ }
141
+ // GraphQL codegen
142
+ if (depNames.includes("@graphql-codegen/cli") || allFiles.some((f) => f.includes("codegen"))) {
143
+ workflows.push("GraphQL Codegen: .graphql schema → generated types/resolvers");
144
+ }
145
+ // Prisma workflow
146
+ if (allFiles.some((f) => f.endsWith("schema.prisma"))) {
147
+ workflows.push("Prisma: schema.prisma → prisma generate → prisma migrate");
148
+ }
149
+ // Drizzle
150
+ if (depNames.includes("drizzle-kit")) {
151
+ workflows.push("Drizzle: schema files → drizzle-kit generate → drizzle-kit migrate");
152
+ }
153
+ // Knex migrations
154
+ if (allFiles.some((f) => f.includes("knexfile"))) {
155
+ workflows.push("Knex: migration files → knex migrate:latest");
156
+ }
157
+ // OpenAPI / Swagger
158
+ if (allFiles.some((f) => f.match(/openapi|swagger/i) && f.match(/\.(json|yaml|yml)$/))) {
159
+ workflows.push("OpenAPI/Swagger: spec file → generated client/types");
160
+ }
161
+ // Monorepo
162
+ if (depNames.includes("turbo"))
163
+ workflows.push("Turborepo: turbo run <task> across packages");
164
+ if (depNames.includes("lerna"))
165
+ workflows.push("Lerna: lerna run <task> across packages");
166
+ if (allFiles.includes("nx.json"))
167
+ workflows.push("Nx: nx run <project>:<task>");
168
+ // CI/CD
169
+ if (allFiles.some((f) => f.includes(".github/workflows/")))
170
+ workflows.push("GitHub Actions CI/CD");
171
+ if (allFiles.some((f) => f.includes(".gitlab-ci")))
172
+ workflows.push("GitLab CI/CD");
173
+ if (allFiles.includes("Jenkinsfile"))
174
+ workflows.push("Jenkins CI/CD");
175
+ // Husky / commitizen
176
+ if (depNames.includes("husky"))
177
+ workflows.push("Husky: pre-commit hooks for linting/formatting");
178
+ if (depNames.includes("commitizen") || depNames.includes("git-cz"))
179
+ workflows.push("Commitizen: standardized commit messages");
180
+ // Docker
181
+ if (allFiles.includes("Dockerfile"))
182
+ workflows.push("Docker: containerized deployment");
183
+ if (allFiles.some((f) => f.match(/docker-compose\.(yml|yaml)$/)))
184
+ workflows.push("Docker Compose: multi-service local development");
185
+ // Electron
186
+ if (depNames.includes("electron") || depNames.includes("electron-builder")) {
187
+ workflows.push("Electron: build desktop app from web frontend");
188
+ }
189
+ return workflows;
190
+ }
191
+ // ─── Code Conventions ─────────────────────────────────────
192
+ async function detectCodeConventions(rootPath, allFiles) {
193
+ const conventions = [];
194
+ // Check for strict mode / noAny
195
+ const tsconfig = await readTextFile(join(rootPath, "tsconfig.json"));
196
+ if (tsconfig) {
197
+ if (tsconfig.includes('"strict": true') || tsconfig.includes('"strict":true')) {
198
+ conventions.push("TypeScript strict mode enabled");
199
+ }
200
+ if (tsconfig.includes('"noImplicitAny"')) {
201
+ conventions.push("No implicit any types");
202
+ }
203
+ }
204
+ // ESLint config
205
+ const eslintFiles = allFiles.filter((f) => f.match(/eslint/i) && !f.includes("node_modules"));
206
+ if (eslintFiles.length > 0) {
207
+ const content = await readTextFile(join(rootPath, eslintFiles[0]));
208
+ if (content) {
209
+ if (content.includes("no-any") || content.includes("@typescript-eslint/no-explicit-any")) {
210
+ conventions.push("No `any` type allowed (ESLint enforced)");
211
+ }
212
+ if (content.includes("no-console")) {
213
+ conventions.push("No console.log (use logger instead)");
214
+ }
215
+ }
216
+ }
217
+ // Error handling patterns
218
+ const sourceFiles = await readFilesMatching(rootPath, allFiles, {
219
+ extensions: [".ts", ".js"],
220
+ maxFiles: 30,
221
+ maxFileSize: 5120,
222
+ pathPatterns: [/(errors|exceptions|shared|utils)/],
223
+ });
224
+ for (const { content } of sourceFiles) {
225
+ if (content.match(/class\s+\w+\s+extends\s+(Error|BaseError|DomainError|AppError)/)) {
226
+ conventions.push("Custom error classes extending base errors");
227
+ break;
228
+ }
229
+ }
230
+ // Check for isDeleted / soft delete pattern
231
+ const repoFiles = await readFilesMatching(rootPath, allFiles, {
232
+ extensions: [".ts", ".js"],
233
+ maxFiles: 20,
234
+ maxFileSize: 5120,
235
+ pathPatterns: [/repositor/i],
236
+ });
237
+ for (const { content } of repoFiles) {
238
+ if (content.includes("isDeleted") || content.includes("is_deleted") || content.includes("deletedAt")) {
239
+ conventions.push("Soft delete pattern (isDeleted/deletedAt filter)");
240
+ break;
241
+ }
242
+ }
243
+ // Base repository pattern
244
+ for (const { content } of repoFiles) {
245
+ if (content.match(/class\s+\w+\s+extends\s+Base(Repository|Repo)/)) {
246
+ conventions.push("BaseRepository pattern for data access");
247
+ break;
248
+ }
249
+ }
250
+ // Test coverage config
251
+ const jestConfigs = allFiles.filter((f) => f.match(/jest\..*config/));
252
+ for (const configFile of jestConfigs.slice(0, 3)) {
253
+ const content = await readTextFile(join(rootPath, configFile));
254
+ if (content) {
255
+ const thresholdMatch = content.match(/branches.*?(\d+)/);
256
+ if (thresholdMatch) {
257
+ conventions.push(`Test coverage threshold: ${thresholdMatch[1]}%`);
258
+ break;
259
+ }
260
+ }
261
+ }
262
+ return conventions;
263
+ }
264
+ // ─── IDE Skills (.claude/skills/, .cursor/rules/, etc.) ───
265
+ async function scanIDESkills(rootPath, allFiles) {
266
+ const skills = [];
267
+ // .claude/skills/*.mdc or *.md
268
+ const skillFiles = allFiles.filter((f) => f.match(/\.claude\/skills\/.*\.(mdc|md)$/) ||
269
+ f.match(/\.cursor\/rules\/.*\.(md|mdc)$/) ||
270
+ f.match(/\.trae\/rules\/.*\.(md|mdc)$/));
271
+ for (const file of skillFiles.slice(0, 20)) {
272
+ const content = await readTextFile(join(rootPath, file));
273
+ if (!content)
274
+ continue;
275
+ const name = file.split("/").pop()?.replace(/\.(mdc|md)$/, "") || file;
276
+ // Try to extract frontmatter info
277
+ let activatesOn = "";
278
+ let description = "";
279
+ // YAML frontmatter
280
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
281
+ if (frontmatterMatch) {
282
+ const fm = frontmatterMatch[1];
283
+ const globMatch = fm.match(/globs?:\s*(.+)/i);
284
+ if (globMatch)
285
+ activatesOn = globMatch[1].trim();
286
+ const descMatch = fm.match(/description:\s*(.+)/i);
287
+ if (descMatch)
288
+ description = descMatch[1].trim().replace(/^["']|["']$/g, "");
289
+ }
290
+ // Fallback: first heading or first paragraph
291
+ if (!description) {
292
+ const headingMatch = content.match(/^#\s+(.+)$/m);
293
+ if (headingMatch)
294
+ description = headingMatch[1].trim();
295
+ else {
296
+ const firstLine = content.split("\n").find((l) => l.trim() && !l.startsWith("---") && !l.startsWith("#"));
297
+ if (firstLine)
298
+ description = firstLine.trim().slice(0, 100);
299
+ }
300
+ }
301
+ skills.push({ name, file, activatesOn, description });
302
+ }
303
+ return skills;
304
+ }
305
+ // ─── IDE Commands (.claude/commands/) ─────────────────────
306
+ async function scanIDECommands(rootPath, allFiles) {
307
+ const commands = [];
308
+ const cmdFiles = allFiles.filter((f) => f.match(/\.claude\/commands\/.*\.(md|mdc|txt)$/));
309
+ for (const file of cmdFiles.slice(0, 20)) {
310
+ const content = await readTextFile(join(rootPath, file));
311
+ if (!content)
312
+ continue;
313
+ const name = file.split("/").pop()?.replace(/\.(md|mdc|txt)$/, "") || file;
314
+ // Extract description from first line or heading
315
+ let description = "";
316
+ const headingMatch = content.match(/^#\s+(.+)$/m);
317
+ if (headingMatch) {
318
+ description = headingMatch[1].trim();
319
+ }
320
+ else {
321
+ const firstLine = content.split("\n").find((l) => l.trim() && !l.startsWith("---"));
322
+ if (firstLine)
323
+ description = firstLine.trim().slice(0, 100);
324
+ }
325
+ commands.push({ name, file, description });
326
+ }
327
+ return commands;
328
+ }
329
+ //# 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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"}
package/dist/types.d.ts CHANGED
@@ -13,6 +13,7 @@ export interface ProjectContext {
13
13
  services?: ExternalService[];
14
14
  modules?: ModuleInfo[];
15
15
  business?: BusinessContext;
16
+ patterns?: import("./scanner/patterns.js").CodePatterns;
16
17
  }
17
18
  export interface ProjectMeta {
18
19
  name: string;
@@ -122,10 +123,22 @@ export interface ModuleInfo {
122
123
  export interface BusinessContext {
123
124
  description: string;
124
125
  features: string[];
126
+ skills: SkillInfo[];
127
+ documentation: DocSummary[];
125
128
  validationRules: ValidationRule[];
126
129
  authPatterns: string[];
127
130
  domainEntities: string[];
128
131
  }
132
+ export interface SkillInfo {
133
+ name: string;
134
+ file: string;
135
+ interface?: string;
136
+ }
137
+ export interface DocSummary {
138
+ file: string;
139
+ title: string;
140
+ summary: string;
141
+ }
129
142
  export interface ValidationRule {
130
143
  schema: string;
131
144
  file: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "project-context-ai",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Automatically maps your project and generates AI context files for Claude, Trae, Cursor, Copilot, Codex, Gemini, and Windsurf",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",