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.
- package/dist/context/store.d.ts.map +1 -1
- package/dist/context/store.js +1 -0
- package/dist/context/store.js.map +1 -1
- package/dist/generators/claude.d.ts.map +1 -1
- package/dist/generators/claude.js +2 -1
- package/dist/generators/claude.js.map +1 -1
- package/dist/generators/codex.d.ts.map +1 -1
- package/dist/generators/codex.js +2 -1
- package/dist/generators/codex.js.map +1 -1
- package/dist/generators/copilot.d.ts.map +1 -1
- package/dist/generators/copilot.js +2 -1
- package/dist/generators/copilot.js.map +1 -1
- package/dist/generators/cursor.d.ts.map +1 -1
- package/dist/generators/cursor.js +2 -1
- package/dist/generators/cursor.js.map +1 -1
- package/dist/generators/gemini.d.ts.map +1 -1
- package/dist/generators/gemini.js +2 -1
- package/dist/generators/gemini.js.map +1 -1
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +58 -3
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/template.d.ts +1 -0
- package/dist/generators/template.d.ts.map +1 -1
- package/dist/generators/template.js +94 -4
- package/dist/generators/template.js.map +1 -1
- package/dist/generators/trae.d.ts.map +1 -1
- package/dist/generators/trae.js +2 -1
- package/dist/generators/trae.js.map +1 -1
- package/dist/generators/windsurf.d.ts.map +1 -1
- package/dist/generators/windsurf.js +2 -1
- package/dist/generators/windsurf.js.map +1 -1
- package/dist/scanner/business.d.ts.map +1 -1
- package/dist/scanner/business.js +234 -64
- package/dist/scanner/business.js.map +1 -1
- package/dist/scanner/conventions.js +31 -3
- package/dist/scanner/conventions.js.map +1 -1
- package/dist/scanner/index.d.ts.map +1 -1
- package/dist/scanner/index.js +6 -3
- package/dist/scanner/index.js.map +1 -1
- package/dist/scanner/patterns.d.ts +28 -0
- package/dist/scanner/patterns.d.ts.map +1 -0
- package/dist/scanner/patterns.js +329 -0
- package/dist/scanner/patterns.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- 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;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,YAAY,EAAE,cAAc,CAAC;IAC7B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,WAAW,EAAE,cAAc,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,eAAe,CAAC;
|
|
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.
|
|
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",
|