mycontext-cli 4.2.5 → 4.2.7
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/README.md +531 -144
- package/dist/README.md +531 -144
- package/dist/cli.js +14 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +2 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +17 -4
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init-interactive.d.ts +127 -0
- package/dist/commands/init-interactive.d.ts.map +1 -0
- package/dist/commands/init-interactive.js +754 -0
- package/dist/commands/init-interactive.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +22 -31
- package/dist/commands/init.js.map +1 -1
- package/dist/doctor/DoctorEngine.d.ts.map +1 -1
- package/dist/doctor/DoctorEngine.js +9 -3
- package/dist/doctor/DoctorEngine.js.map +1 -1
- package/dist/doctor/rules/dead-code-rules.d.ts.map +1 -1
- package/dist/doctor/rules/dead-code-rules.js +29 -3
- package/dist/doctor/rules/dead-code-rules.js.map +1 -1
- package/dist/doctor/rules/index.d.ts +3 -1
- package/dist/doctor/rules/index.d.ts.map +1 -1
- package/dist/doctor/rules/index.js +7 -1
- package/dist/doctor/rules/index.js.map +1 -1
- package/dist/doctor/rules/instantdb-rules.d.ts +3 -0
- package/dist/doctor/rules/instantdb-rules.d.ts.map +1 -0
- package/dist/doctor/rules/instantdb-rules.js +335 -0
- package/dist/doctor/rules/instantdb-rules.js.map +1 -0
- package/dist/doctor/rules/typescript-rules.d.ts +3 -0
- package/dist/doctor/rules/typescript-rules.d.ts.map +1 -0
- package/dist/doctor/rules/typescript-rules.js +177 -0
- package/dist/doctor/rules/typescript-rules.js.map +1 -0
- package/dist/doctor/types.d.ts +1 -0
- package/dist/doctor/types.d.ts.map +1 -1
- package/dist/package.json +1 -1
- package/dist/services/InferenceEngine.d.ts +41 -0
- package/dist/services/InferenceEngine.d.ts.map +1 -0
- package/dist/services/InferenceEngine.js +307 -0
- package/dist/services/InferenceEngine.js.map +1 -0
- package/dist/services/Planner.d.ts +77 -0
- package/dist/services/Planner.d.ts.map +1 -0
- package/dist/services/Planner.js +828 -0
- package/dist/services/Planner.js.map +1 -0
- package/dist/services/ProjectScanner.d.ts.map +1 -1
- package/dist/services/ProjectScanner.js +7 -3
- package/dist/services/ProjectScanner.js.map +1 -1
- package/dist/types/asl.d.ts +387 -0
- package/dist/types/asl.d.ts.map +1 -0
- package/dist/types/asl.js +139 -0
- package/dist/types/asl.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.instantdbRules = void 0;
|
|
37
|
+
/**
|
|
38
|
+
* InstantDB Rules — Schema validation and drift detection for InstantDB projects
|
|
39
|
+
*/
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
// ─── Helper ───────────────────────────────────────────────────────
|
|
42
|
+
function diag(rule, filePath, message, opts = {}) {
|
|
43
|
+
return {
|
|
44
|
+
ruleId: rule.id,
|
|
45
|
+
filePath,
|
|
46
|
+
line: opts.line,
|
|
47
|
+
severity: rule.severity,
|
|
48
|
+
message,
|
|
49
|
+
help: opts.help || rule.help,
|
|
50
|
+
autoFixable: opts.autoFixable ?? false,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse InstantDB schema file and extract entity definitions
|
|
55
|
+
*/
|
|
56
|
+
async function parseInstantDBSchema(ctx) {
|
|
57
|
+
// Try multiple possible schema locations
|
|
58
|
+
const schemaPaths = [
|
|
59
|
+
"instant.schema.ts",
|
|
60
|
+
"src/instant.schema.ts",
|
|
61
|
+
".mycontext/schema.ts",
|
|
62
|
+
"instant.schema.js",
|
|
63
|
+
];
|
|
64
|
+
let schemaContent = null;
|
|
65
|
+
let schemaPath = null;
|
|
66
|
+
for (const sp of schemaPaths) {
|
|
67
|
+
const content = await ctx.readFile(sp);
|
|
68
|
+
if (content) {
|
|
69
|
+
schemaContent = content;
|
|
70
|
+
schemaPath = sp;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!schemaContent) {
|
|
75
|
+
return null; // No schema file found
|
|
76
|
+
}
|
|
77
|
+
const entities = new Map();
|
|
78
|
+
try {
|
|
79
|
+
// Extract the entities object from the schema
|
|
80
|
+
// Pattern: entities: { EntityName: { fields: { ... } } }
|
|
81
|
+
const entitiesMatch = schemaContent.match(/entities:\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}/s);
|
|
82
|
+
if (!entitiesMatch || !entitiesMatch[1]) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
const entitiesSection = entitiesMatch[1];
|
|
86
|
+
// Extract each entity definition
|
|
87
|
+
// Pattern: EntityName: { fields: { fieldName: { type: "string", required: true }, ... } }
|
|
88
|
+
const entityPattern = /(\w+):\s*\{[^}]*fields:\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}/gs;
|
|
89
|
+
let entityMatch;
|
|
90
|
+
while ((entityMatch = entityPattern.exec(entitiesSection)) !== null) {
|
|
91
|
+
const entityName = entityMatch[1];
|
|
92
|
+
const fieldsSection = entityMatch[2];
|
|
93
|
+
if (!entityName || !fieldsSection)
|
|
94
|
+
continue;
|
|
95
|
+
const fields = {};
|
|
96
|
+
// Extract field definitions
|
|
97
|
+
// Pattern: fieldName: { type: "string", required: true }
|
|
98
|
+
const fieldPattern = /(\w+):\s*\{[^}]*type:\s*["'](\w+)["'][^}]*\}/g;
|
|
99
|
+
let fieldMatch;
|
|
100
|
+
while ((fieldMatch = fieldPattern.exec(fieldsSection)) !== null) {
|
|
101
|
+
const fieldName = fieldMatch[1];
|
|
102
|
+
const fieldType = fieldMatch[2];
|
|
103
|
+
const fieldDef = fieldMatch[0];
|
|
104
|
+
if (!fieldName || !fieldType)
|
|
105
|
+
continue;
|
|
106
|
+
fields[fieldName] = {
|
|
107
|
+
type: fieldType,
|
|
108
|
+
required: fieldDef.includes("required") || fieldDef.includes("optional: false"),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
entities.set(entityName, {
|
|
112
|
+
name: entityName,
|
|
113
|
+
fields,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
// Failed to parse schema
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
return entities;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Extract field accesses from TypeScript code
|
|
125
|
+
* Returns map of entity.field accesses with their locations
|
|
126
|
+
*/
|
|
127
|
+
function extractFieldAccesses(content, schemaEntities) {
|
|
128
|
+
const accesses = [];
|
|
129
|
+
const lines = content.split("\n");
|
|
130
|
+
// Build pattern to match potential entity names (convert to lowercase for case-insensitive matching)
|
|
131
|
+
const entityNames = Array.from(schemaEntities.keys());
|
|
132
|
+
const entityNamesLower = entityNames.map(name => name.toLowerCase());
|
|
133
|
+
lines.forEach((line, index) => {
|
|
134
|
+
// Pattern: variableName.fieldName where variableName might be a schema entity
|
|
135
|
+
// We look for patterns like: payment.payment_method, customer.delivery_zone_id, etc.
|
|
136
|
+
const accessPattern = /(\w+)\.(\w+)/g;
|
|
137
|
+
let match;
|
|
138
|
+
while ((match = accessPattern.exec(line)) !== null) {
|
|
139
|
+
const varName = match[1];
|
|
140
|
+
const fieldName = match[2];
|
|
141
|
+
if (!varName || !fieldName)
|
|
142
|
+
continue;
|
|
143
|
+
// Check if this could be an entity access
|
|
144
|
+
// We do fuzzy matching: if varName is singular/plural of an entity name
|
|
145
|
+
const varLower = varName.toLowerCase();
|
|
146
|
+
for (let i = 0; i < entityNamesLower.length; i++) {
|
|
147
|
+
const entityNameLower = entityNamesLower[i];
|
|
148
|
+
const entityName = entityNames[i];
|
|
149
|
+
if (!entityNameLower || !entityName)
|
|
150
|
+
continue;
|
|
151
|
+
// Match if:
|
|
152
|
+
// 1. Exact match (case-insensitive)
|
|
153
|
+
// 2. Variable is plural and entity is singular (users -> User)
|
|
154
|
+
// 3. Variable matches entity without case sensitivity
|
|
155
|
+
if (varLower === entityNameLower ||
|
|
156
|
+
varLower === entityNameLower + 's' ||
|
|
157
|
+
varLower === entityNameLower.slice(0, -1) || // Handle entity ending in 's'
|
|
158
|
+
entityNameLower.startsWith(varLower) ||
|
|
159
|
+
varLower.startsWith(entityNameLower)) {
|
|
160
|
+
accesses.push({
|
|
161
|
+
entity: entityName,
|
|
162
|
+
field: fieldName,
|
|
163
|
+
line: index + 1,
|
|
164
|
+
match: match[0],
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
return accesses;
|
|
171
|
+
}
|
|
172
|
+
// ─── Rules ────────────────────────────────────────────────────────
|
|
173
|
+
const schemaFieldDrift = {
|
|
174
|
+
id: "instantdb/schema-field-drift",
|
|
175
|
+
name: "Schema Field Drift Detection",
|
|
176
|
+
category: "node",
|
|
177
|
+
severity: "error",
|
|
178
|
+
description: "Detects code accessing fields that don't exist in the InstantDB schema",
|
|
179
|
+
help: "Update field names in code to match the schema, or add missing fields to instant.schema.ts",
|
|
180
|
+
appliesTo: ["nextjs", "node"],
|
|
181
|
+
async check(ctx) {
|
|
182
|
+
const results = [];
|
|
183
|
+
// Parse the schema
|
|
184
|
+
const schemaEntities = await parseInstantDBSchema(ctx);
|
|
185
|
+
if (!schemaEntities || schemaEntities.size === 0) {
|
|
186
|
+
return results; // No schema found or no entities, skip check
|
|
187
|
+
}
|
|
188
|
+
// Find all TypeScript/JavaScript files (exclude schema file itself)
|
|
189
|
+
const files = await ctx.findFiles(/\.(tsx?|jsx?)$/);
|
|
190
|
+
for (const file of files) {
|
|
191
|
+
// Skip schema files and node_modules
|
|
192
|
+
if (file.includes("schema.") || file.includes("node_modules")) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const content = await ctx.readFile(file);
|
|
196
|
+
if (!content)
|
|
197
|
+
continue;
|
|
198
|
+
// Extract field accesses
|
|
199
|
+
const accesses = extractFieldAccesses(content, schemaEntities);
|
|
200
|
+
// Check each access against the schema
|
|
201
|
+
for (const access of accesses) {
|
|
202
|
+
const entity = schemaEntities.get(access.entity);
|
|
203
|
+
if (!entity)
|
|
204
|
+
continue;
|
|
205
|
+
// Check if the field exists in the schema
|
|
206
|
+
if (!entity.fields[access.field]) {
|
|
207
|
+
// Field doesn't exist in schema - this is drift!
|
|
208
|
+
// Try to find a similar field name (common mistake: payment_method vs method)
|
|
209
|
+
const availableFields = Object.keys(entity.fields);
|
|
210
|
+
const similarField = findSimilarField(access.field, availableFields);
|
|
211
|
+
let helpMessage = `Field '${access.field}' does not exist in ${access.entity} schema. `;
|
|
212
|
+
if (similarField) {
|
|
213
|
+
helpMessage += `Did you mean '${similarField}'? Available fields: ${availableFields.join(", ")}`;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
helpMessage += `Available fields: ${availableFields.join(", ")}`;
|
|
217
|
+
}
|
|
218
|
+
results.push(diag(this, file, `${access.entity}.${access.field} - field '${access.field}' not in schema`, {
|
|
219
|
+
line: access.line,
|
|
220
|
+
help: helpMessage,
|
|
221
|
+
autoFixable: similarField !== null, // Can auto-fix if we found a similar field
|
|
222
|
+
}));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return results;
|
|
227
|
+
},
|
|
228
|
+
async fix(ctx, diagnostic) {
|
|
229
|
+
// Auto-fix by replacing the incorrect field name with the suggested one
|
|
230
|
+
const match = diagnostic.message.match(/(\w+)\.(\w+) - field '(\w+)' not in schema/);
|
|
231
|
+
if (!match)
|
|
232
|
+
return false;
|
|
233
|
+
const [, entity, , wrongField] = match;
|
|
234
|
+
// Extract the suggestion from the help message
|
|
235
|
+
const suggestionMatch = diagnostic.help.match(/Did you mean '(\w+)'\?/);
|
|
236
|
+
if (!suggestionMatch)
|
|
237
|
+
return false;
|
|
238
|
+
const correctField = suggestionMatch[1];
|
|
239
|
+
// Read the file
|
|
240
|
+
const content = await ctx.readFile(diagnostic.filePath);
|
|
241
|
+
if (!content)
|
|
242
|
+
return false;
|
|
243
|
+
const lines = content.split("\n");
|
|
244
|
+
if (!diagnostic.line || diagnostic.line > lines.length)
|
|
245
|
+
return false;
|
|
246
|
+
// Replace the field name on the specific line
|
|
247
|
+
const lineIndex = diagnostic.line - 1;
|
|
248
|
+
const originalLine = lines[lineIndex];
|
|
249
|
+
if (!originalLine)
|
|
250
|
+
return false;
|
|
251
|
+
// Replace entity.wrongField with entity.correctField
|
|
252
|
+
const pattern = new RegExp(`(\\w+)\\.${wrongField}\\b`, 'g');
|
|
253
|
+
const newLine = originalLine.replace(pattern, `$1.${correctField}`);
|
|
254
|
+
if (newLine === originalLine)
|
|
255
|
+
return false; // Nothing changed
|
|
256
|
+
lines[lineIndex] = newLine;
|
|
257
|
+
// Write the file back
|
|
258
|
+
const fs = await Promise.resolve().then(() => __importStar(require("fs/promises")));
|
|
259
|
+
const absolutePath = path.join(ctx.root, diagnostic.filePath);
|
|
260
|
+
await fs.writeFile(absolutePath, lines.join("\n"), "utf-8");
|
|
261
|
+
return true;
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
/**
|
|
265
|
+
* Find a similar field name using simple heuristics
|
|
266
|
+
* Common patterns:
|
|
267
|
+
* - payment_method -> method (remove entity prefix)
|
|
268
|
+
* - delivery_zone_id -> zone_id (remove prefix)
|
|
269
|
+
* - user_email -> email (remove entity prefix)
|
|
270
|
+
*/
|
|
271
|
+
function findSimilarField(wrongField, availableFields) {
|
|
272
|
+
const wrongLower = wrongField.toLowerCase();
|
|
273
|
+
// 1. Exact match (shouldn't happen, but just in case)
|
|
274
|
+
for (const field of availableFields) {
|
|
275
|
+
if (field.toLowerCase() === wrongLower) {
|
|
276
|
+
return field;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// 2. Check if wrongField ends with one of the available fields
|
|
280
|
+
// e.g., payment_method ends with method
|
|
281
|
+
for (const field of availableFields) {
|
|
282
|
+
if (wrongLower.endsWith(field.toLowerCase()) || wrongLower.endsWith('_' + field.toLowerCase())) {
|
|
283
|
+
return field;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// 3. Check if wrongField contains one of the available fields
|
|
287
|
+
// e.g., delivery_zone_id contains zone_id
|
|
288
|
+
for (const field of availableFields) {
|
|
289
|
+
if (wrongLower.includes(field.toLowerCase())) {
|
|
290
|
+
return field;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// 4. Levenshtein distance for typos (simple version)
|
|
294
|
+
let closest = null;
|
|
295
|
+
let minDistance = Infinity;
|
|
296
|
+
for (const field of availableFields) {
|
|
297
|
+
const distance = levenshteinDistance(wrongLower, field.toLowerCase());
|
|
298
|
+
if (distance < minDistance && distance <= 3) { // Allow up to 3 character differences
|
|
299
|
+
minDistance = distance;
|
|
300
|
+
closest = field;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return closest;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Calculate Levenshtein distance between two strings
|
|
307
|
+
*/
|
|
308
|
+
function levenshteinDistance(str1, str2) {
|
|
309
|
+
const matrix = Array.from({ length: str2.length + 1 }, () => Array(str1.length + 1).fill(0));
|
|
310
|
+
for (let i = 0; i <= str2.length; i++) {
|
|
311
|
+
matrix[i][0] = i;
|
|
312
|
+
}
|
|
313
|
+
for (let j = 0; j <= str1.length; j++) {
|
|
314
|
+
matrix[0][j] = j;
|
|
315
|
+
}
|
|
316
|
+
for (let i = 1; i <= str2.length; i++) {
|
|
317
|
+
for (let j = 1; j <= str1.length; j++) {
|
|
318
|
+
if (str2.charAt(i - 1) === str1.charAt(j - 1)) {
|
|
319
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
|
|
323
|
+
matrix[i][j - 1] + 1, // insertion
|
|
324
|
+
matrix[i - 1][j] + 1 // deletion
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return matrix[str2.length][str1.length];
|
|
330
|
+
}
|
|
331
|
+
// ─── Export ───────────────────────────────────────────────────────
|
|
332
|
+
exports.instantdbRules = [
|
|
333
|
+
schemaFieldDrift,
|
|
334
|
+
];
|
|
335
|
+
//# sourceMappingURL=instantdb-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instantdb-rules.js","sourceRoot":"","sources":["../../../src/doctor/rules/instantdb-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-rules.d.ts","sourceRoot":"","sources":["../../../src/doctor/rules/typescript-rules.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,UAAU,CAAC;AAsOpE,eAAO,MAAM,eAAe,EAAE,UAAU,EAIvC,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.typescriptRules = void 0;
|
|
4
|
+
// ─── Helper ───────────────────────────────────────────────────────
|
|
5
|
+
function diag(rule, filePath, message, opts = {}) {
|
|
6
|
+
return {
|
|
7
|
+
ruleId: rule.id,
|
|
8
|
+
filePath,
|
|
9
|
+
line: opts.line,
|
|
10
|
+
severity: rule.severity,
|
|
11
|
+
message,
|
|
12
|
+
help: opts.help || rule.help,
|
|
13
|
+
autoFixable: opts.autoFixable ?? false,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Find all occurrences of a pattern in content with line numbers
|
|
18
|
+
*/
|
|
19
|
+
function findOccurrences(content, pattern) {
|
|
20
|
+
const lines = content.split("\n");
|
|
21
|
+
const occurrences = [];
|
|
22
|
+
lines.forEach((line, index) => {
|
|
23
|
+
const matches = line.match(pattern);
|
|
24
|
+
if (matches) {
|
|
25
|
+
occurrences.push({ line: index + 1, match: matches[0] });
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return occurrences;
|
|
29
|
+
}
|
|
30
|
+
// ─── Rules ────────────────────────────────────────────────────────
|
|
31
|
+
const asAnyCasts = {
|
|
32
|
+
id: "typescript/as-any-casts",
|
|
33
|
+
name: "Avoid 'as any' Type Casts",
|
|
34
|
+
category: "node",
|
|
35
|
+
severity: "warning",
|
|
36
|
+
description: "Detects usage of 'as any' type casts which bypass TypeScript's type checking",
|
|
37
|
+
help: "Replace 'as any' with proper type annotations or type guards. Use Record<string, unknown> for dynamic objects.",
|
|
38
|
+
appliesTo: ["nextjs", "node"],
|
|
39
|
+
async check(ctx) {
|
|
40
|
+
const results = [];
|
|
41
|
+
// Find all TypeScript/JavaScript files
|
|
42
|
+
const files = await ctx.findFiles(/\.(tsx?|jsx?)$/);
|
|
43
|
+
// Pattern to match 'as any' (with word boundaries)
|
|
44
|
+
const asAnyPattern = /\s+as\s+any[\s\)\;\,\}\]\.]/g;
|
|
45
|
+
// Track files with most casts for summary
|
|
46
|
+
const fileStats = [];
|
|
47
|
+
for (const file of files) {
|
|
48
|
+
const content = await ctx.readFile(file);
|
|
49
|
+
if (!content)
|
|
50
|
+
continue;
|
|
51
|
+
const occurrences = findOccurrences(content, asAnyPattern);
|
|
52
|
+
if (occurrences.length > 0) {
|
|
53
|
+
fileStats.push({
|
|
54
|
+
file,
|
|
55
|
+
count: occurrences.length,
|
|
56
|
+
lines: occurrences.map(o => o.line)
|
|
57
|
+
});
|
|
58
|
+
const firstOccurrence = occurrences[0];
|
|
59
|
+
if (firstOccurrence) {
|
|
60
|
+
results.push(diag(this, file, `Found ${occurrences.length} 'as any' cast${occurrences.length > 1 ? 's' : ''}`, {
|
|
61
|
+
line: firstOccurrence.line,
|
|
62
|
+
help: `Replace 'as any' with proper type annotations. Consider using 'Record<string, unknown>' for dynamic objects or type guards for runtime checks.`
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return results;
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
const unknownTransactionArray = {
|
|
71
|
+
id: "typescript/instantdb-transaction-typing",
|
|
72
|
+
name: "InstantDB Transaction Array Typing",
|
|
73
|
+
category: "node",
|
|
74
|
+
severity: "error",
|
|
75
|
+
description: "Detects unknown[] arrays passed to adminDb.transact() which cause type errors",
|
|
76
|
+
help: "Change 'unknown[]' to 'TransactionChunk<any, any>[]' and import from '@instantdb/admin'",
|
|
77
|
+
appliesTo: ["nextjs", "node"],
|
|
78
|
+
async check(ctx) {
|
|
79
|
+
const results = [];
|
|
80
|
+
// Find all TypeScript files
|
|
81
|
+
const files = await ctx.findFiles(/\.tsx?$/);
|
|
82
|
+
for (const file of files) {
|
|
83
|
+
const content = await ctx.readFile(file);
|
|
84
|
+
if (!content)
|
|
85
|
+
continue;
|
|
86
|
+
// Check if file uses adminDb.transact
|
|
87
|
+
if (!content.includes("adminDb.transact") && !content.includes("db.transact")) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// Look for unknown[] array declarations
|
|
91
|
+
const unknownArrayPattern = /const\s+(\w+):\s*unknown\[\]/g;
|
|
92
|
+
const matches = Array.from(content.matchAll(unknownArrayPattern));
|
|
93
|
+
for (const match of matches) {
|
|
94
|
+
const varName = match[1];
|
|
95
|
+
// Check if this array is passed to transact
|
|
96
|
+
const transactPattern = new RegExp(`\\.transact\\s*\\(\\s*${varName}`, "g");
|
|
97
|
+
if (transactPattern.test(content)) {
|
|
98
|
+
const lines = content.split("\n");
|
|
99
|
+
const lineNum = lines.findIndex(line => line.includes(match[0])) + 1;
|
|
100
|
+
results.push(diag(this, file, `'${varName}' is typed as 'unknown[]' but passed to transact()`, {
|
|
101
|
+
line: lineNum,
|
|
102
|
+
help: `Change 'const ${varName}: unknown[]' to 'const ${varName}: TransactionChunk<any, any>[]' and import { TransactionChunk } from '@instantdb/admin'`,
|
|
103
|
+
}));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return results;
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
const duplicateTypeDeclarations = {
|
|
111
|
+
id: "typescript/duplicate-type-declarations",
|
|
112
|
+
name: "Duplicate Type Declarations",
|
|
113
|
+
category: "node",
|
|
114
|
+
severity: "warning",
|
|
115
|
+
description: "Detects type/interface declarations that duplicate schema-derived types",
|
|
116
|
+
help: "Remove hand-written type declarations that duplicate schema types. Import from schema.ts instead.",
|
|
117
|
+
appliesTo: ["nextjs", "node"],
|
|
118
|
+
async check(ctx) {
|
|
119
|
+
const results = [];
|
|
120
|
+
// Find schema.ts file (could be in types/ or src/types/)
|
|
121
|
+
const schemaFiles = await ctx.findFiles(/types\/schema\.tsx?$/);
|
|
122
|
+
if (schemaFiles.length === 0) {
|
|
123
|
+
return results; // No schema file, skip check
|
|
124
|
+
}
|
|
125
|
+
const schemaFile = schemaFiles[0];
|
|
126
|
+
if (!schemaFile)
|
|
127
|
+
return results;
|
|
128
|
+
const schemaContent = await ctx.readFile(schemaFile);
|
|
129
|
+
if (!schemaContent)
|
|
130
|
+
return results;
|
|
131
|
+
// Extract exported types from schema (looking for InstaQLEntity pattern or interface/type declarations)
|
|
132
|
+
const schemaTypePattern = /export\s+(?:type|interface)\s+(\w+)/g;
|
|
133
|
+
const schemaTypes = new Set();
|
|
134
|
+
let match;
|
|
135
|
+
while ((match = schemaTypePattern.exec(schemaContent)) !== null) {
|
|
136
|
+
const typeName = match[1];
|
|
137
|
+
if (typeName) {
|
|
138
|
+
schemaTypes.add(typeName);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (schemaTypes.size === 0) {
|
|
142
|
+
return results; // No types in schema, skip
|
|
143
|
+
}
|
|
144
|
+
// Check other files in types/ directory
|
|
145
|
+
const typeFiles = await ctx.findFiles(/types\/.*\.tsx?$/);
|
|
146
|
+
for (const file of typeFiles) {
|
|
147
|
+
if (file === schemaFile)
|
|
148
|
+
continue; // Skip the schema file itself
|
|
149
|
+
const content = await ctx.readFile(file);
|
|
150
|
+
if (!content)
|
|
151
|
+
continue;
|
|
152
|
+
// Find exported types/interfaces in this file
|
|
153
|
+
const fileTypePattern = /export\s+(?:type|interface)\s+(\w+)/g;
|
|
154
|
+
let typeMatch;
|
|
155
|
+
while ((typeMatch = fileTypePattern.exec(content)) !== null) {
|
|
156
|
+
const typeName = typeMatch[1];
|
|
157
|
+
if (typeName && schemaTypes.has(typeName)) {
|
|
158
|
+
const lines = content.split("\n");
|
|
159
|
+
const matchText = typeMatch[0];
|
|
160
|
+
const lineNum = lines.findIndex(line => line.includes(matchText)) + 1;
|
|
161
|
+
results.push(diag(this, file, `Type '${typeName}' duplicates schema type in ${schemaFile}`, {
|
|
162
|
+
line: lineNum,
|
|
163
|
+
help: `Remove this type declaration and import ${typeName} from '${schemaFile}' instead. The schema-derived type is canonical.`,
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return results;
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
// ─── Export ───────────────────────────────────────────────────────
|
|
172
|
+
exports.typescriptRules = [
|
|
173
|
+
asAnyCasts,
|
|
174
|
+
unknownTransactionArray,
|
|
175
|
+
duplicateTypeDeclarations,
|
|
176
|
+
];
|
|
177
|
+
//# sourceMappingURL=typescript-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-rules.js","sourceRoot":"","sources":["../../../src/doctor/rules/typescript-rules.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor/types.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;IAC5D,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,WAAW,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;CACzB;AAID,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAID,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvD,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/C,GAAG,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5D;AAID,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAID,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":"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"}
|
package/dist/package.json
CHANGED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InferenceEngine
|
|
3
|
+
*
|
|
4
|
+
* LLM-powered inference system that auto-completes high-confidence tasks,
|
|
5
|
+
* self-critiques its own work, and learns from user corrections.
|
|
6
|
+
*/
|
|
7
|
+
import type { ASL, InferenceTask, InferenceResult, SelfCritique } from "../types/asl";
|
|
8
|
+
export declare class InferenceEngine {
|
|
9
|
+
private learningContext;
|
|
10
|
+
private aiCore;
|
|
11
|
+
constructor();
|
|
12
|
+
/**
|
|
13
|
+
* Run LLM-based inference for a task
|
|
14
|
+
*/
|
|
15
|
+
infer(task: InferenceTask, currentASL: Partial<ASL>, completedTasks: InferenceTask[]): Promise<InferenceResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Self-critique: LLM validates its own inference
|
|
18
|
+
*/
|
|
19
|
+
selfCritique(inference: InferenceResult, currentASL: Partial<ASL>): Promise<SelfCritique>;
|
|
20
|
+
/**
|
|
21
|
+
* Feed inference results to downstream tasks
|
|
22
|
+
* Updates confidence and dependencies
|
|
23
|
+
*/
|
|
24
|
+
feedToNextTasks(completedTask: InferenceTask, pendingTasks: InferenceTask[]): InferenceTask[];
|
|
25
|
+
/**
|
|
26
|
+
* Learn from user correction
|
|
27
|
+
*/
|
|
28
|
+
learnFromCorrection(taskId: string, inferredValue: any, correctedValue: any, reason?: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Detect patterns from user corrections
|
|
31
|
+
*/
|
|
32
|
+
private detectPatterns;
|
|
33
|
+
/**
|
|
34
|
+
* Get learning context for prompt injection
|
|
35
|
+
*/
|
|
36
|
+
getLearningContext(): string;
|
|
37
|
+
private buildInferencePrompt;
|
|
38
|
+
private buildCritiquePrompt;
|
|
39
|
+
private buildPatternDetectionPrompt;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=InferenceEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InferenceEngine.d.ts","sourceRoot":"","sources":["../../src/services/InferenceEngine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,GAAG,EACH,aAAa,EACb,eAAe,EACf,YAAY,EAIb,MAAM,cAAc,CAAC;AAGtB,qBAAa,eAAe;IAC1B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,MAAM,CAAS;;IAgBvB;;OAEG;IACG,KAAK,CACT,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,EACxB,cAAc,EAAE,aAAa,EAAE,GAC9B,OAAO,CAAC,eAAe,CAAC;IA8B3B;;OAEG;IACG,YAAY,CAChB,SAAS,EAAE,eAAe,EAC1B,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,GACvB,OAAO,CAAC,YAAY,CAAC;IA8BxB;;;OAGG;IACH,eAAe,CACb,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,aAAa,EAAE,GAC5B,aAAa,EAAE;IAqBlB;;OAEG;IACG,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,GAAG,EAClB,cAAc,EAAE,GAAG,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAehB;;OAEG;YACW,cAAc;IA6B5B;;OAEG;IACH,kBAAkB,IAAI,MAAM;IA6B5B,OAAO,CAAC,oBAAoB;IAyD5B,OAAO,CAAC,mBAAmB;IA0D3B,OAAO,CAAC,2BAA2B;CAmCpC"}
|