pi-lens 3.6.2 → 3.6.4
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/CHANGELOG.md +10 -2
- package/package.json +4 -4
- package/tsconfig.json +1 -1
- package/clients/__tests__/file-time.test.js +0 -216
- package/clients/__tests__/file-time.test.ts +0 -276
- package/clients/__tests__/format-service.test.js +0 -245
- package/clients/__tests__/format-service.test.ts +0 -339
- package/clients/__tests__/formatters.test.js +0 -271
- package/clients/__tests__/formatters.test.ts +0 -401
- package/clients/agent-behavior-client.js +0 -110
- package/clients/agent-behavior-client.test.js +0 -94
- package/clients/agent-behavior-client.test.ts +0 -116
- package/clients/amain-types.js +0 -164
- package/clients/architect-client.js +0 -291
- package/clients/ast-grep-client.js +0 -253
- package/clients/ast-grep-parser.js +0 -84
- package/clients/ast-grep-rule-manager.js +0 -89
- package/clients/ast-grep-types.js +0 -9
- package/clients/auto-loop.js +0 -131
- package/clients/biome-client.js +0 -420
- package/clients/biome-client.test.js +0 -144
- package/clients/biome-client.test.ts +0 -163
- package/clients/cache/rule-cache.js +0 -72
- package/clients/cache-manager.js +0 -245
- package/clients/cache-manager.test.js +0 -197
- package/clients/cache-manager.test.ts +0 -299
- package/clients/complexity-client.js +0 -675
- package/clients/complexity-client.test.js +0 -234
- package/clients/complexity-client.test.ts +0 -255
- package/clients/config-validator.js +0 -465
- package/clients/dependency-checker.js +0 -325
- package/clients/dependency-checker.test.js +0 -60
- package/clients/dependency-checker.test.ts +0 -71
- package/clients/dispatch/__tests__/autofix-integration.test.js +0 -245
- package/clients/dispatch/__tests__/autofix-integration.test.ts +0 -300
- package/clients/dispatch/__tests__/runner-registration.test.js +0 -234
- package/clients/dispatch/__tests__/runner-registration.test.ts +0 -286
- package/clients/dispatch/debug.log +0 -1
- package/clients/dispatch/dispatcher.edge.test.js +0 -82
- package/clients/dispatch/dispatcher.edge.test.ts +0 -100
- package/clients/dispatch/dispatcher.format.test.js +0 -46
- package/clients/dispatch/dispatcher.format.test.ts +0 -58
- package/clients/dispatch/dispatcher.inline.test.js +0 -74
- package/clients/dispatch/dispatcher.inline.test.ts +0 -93
- package/clients/dispatch/dispatcher.js +0 -381
- package/clients/dispatch/dispatcher.test.js +0 -116
- package/clients/dispatch/dispatcher.test.ts +0 -149
- package/clients/dispatch/integration.js +0 -108
- package/clients/dispatch/plan.js +0 -183
- package/clients/dispatch/runners/architect.js +0 -83
- package/clients/dispatch/runners/architect.test.js +0 -138
- package/clients/dispatch/runners/architect.test.ts +0 -162
- package/clients/dispatch/runners/ast-grep-napi.js +0 -405
- package/clients/dispatch/runners/ast-grep-napi.test.js +0 -107
- package/clients/dispatch/runners/ast-grep-napi.test.ts +0 -129
- package/clients/dispatch/runners/ast-grep.js +0 -157
- package/clients/dispatch/runners/biome.js +0 -55
- package/clients/dispatch/runners/config-validation.js +0 -67
- package/clients/dispatch/runners/go-vet.js +0 -48
- package/clients/dispatch/runners/index.js +0 -47
- package/clients/dispatch/runners/lsp.js +0 -102
- package/clients/dispatch/runners/oxlint.js +0 -67
- package/clients/dispatch/runners/oxlint.test.js +0 -230
- package/clients/dispatch/runners/oxlint.test.ts +0 -303
- package/clients/dispatch/runners/pyright.js +0 -100
- package/clients/dispatch/runners/pyright.test.js +0 -98
- package/clients/dispatch/runners/pyright.test.ts +0 -121
- package/clients/dispatch/runners/python-slop.js +0 -97
- package/clients/dispatch/runners/python-slop.test.js +0 -203
- package/clients/dispatch/runners/python-slop.test.ts +0 -298
- package/clients/dispatch/runners/ruff.js +0 -48
- package/clients/dispatch/runners/rust-clippy.js +0 -102
- package/clients/dispatch/runners/scan_codebase.test.js +0 -89
- package/clients/dispatch/runners/scan_codebase.test.ts +0 -105
- package/clients/dispatch/runners/shellcheck.js +0 -147
- package/clients/dispatch/runners/shellcheck.test.js +0 -98
- package/clients/dispatch/runners/shellcheck.test.ts +0 -129
- package/clients/dispatch/runners/similarity.js +0 -230
- package/clients/dispatch/runners/spellcheck.js +0 -106
- package/clients/dispatch/runners/spellcheck.test.js +0 -158
- package/clients/dispatch/runners/spellcheck.test.ts +0 -214
- package/clients/dispatch/runners/tree-sitter.js +0 -246
- package/clients/dispatch/runners/ts-lsp.js +0 -125
- package/clients/dispatch/runners/ts-slop.js +0 -113
- package/clients/dispatch/runners/type-safety.js +0 -142
- package/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -134
- package/clients/dispatch/runners/utils/runner-helpers.js +0 -115
- package/clients/dispatch/runners/utils.js +0 -51
- package/clients/dispatch/runners/yaml-rule-parser.js +0 -360
- package/clients/dispatch/types.js +0 -16
- package/clients/dispatch/utils/format-utils.js +0 -44
- package/clients/dogfood.test.js +0 -201
- package/clients/dogfood.test.ts +0 -269
- package/clients/file-kinds.js +0 -177
- package/clients/file-kinds.test.js +0 -169
- package/clients/file-kinds.test.ts +0 -210
- package/clients/file-time.js +0 -152
- package/clients/file-utils.js +0 -40
- package/clients/fix-scanners.js +0 -204
- package/clients/format-service.js +0 -184
- package/clients/formatters.js +0 -488
- package/clients/go-client.js +0 -203
- package/clients/go-client.test.js +0 -127
- package/clients/go-client.test.ts +0 -143
- package/clients/installer/index.js +0 -403
- package/clients/interviewer-templates.js +0 -75
- package/clients/interviewer.js +0 -173
- package/clients/jscpd-client.js +0 -196
- package/clients/jscpd-client.test.js +0 -127
- package/clients/jscpd-client.test.ts +0 -145
- package/clients/knip-client.js +0 -239
- package/clients/knip-client.test.js +0 -112
- package/clients/knip-client.test.ts +0 -128
- package/clients/latency-logger.js +0 -40
- package/clients/lsp/__tests__/client.test.js +0 -310
- package/clients/lsp/__tests__/client.test.ts +0 -412
- package/clients/lsp/__tests__/config.test.js +0 -167
- package/clients/lsp/__tests__/config.test.ts +0 -217
- package/clients/lsp/__tests__/error-recovery.test.js +0 -213
- package/clients/lsp/__tests__/error-recovery.test.ts +0 -279
- package/clients/lsp/__tests__/integration.test.js +0 -127
- package/clients/lsp/__tests__/integration.test.ts +0 -160
- package/clients/lsp/__tests__/launch.test.js +0 -313
- package/clients/lsp/__tests__/launch.test.ts +0 -394
- package/clients/lsp/__tests__/server.test.js +0 -259
- package/clients/lsp/__tests__/server.test.ts +0 -332
- package/clients/lsp/__tests__/service.test.js +0 -438
- package/clients/lsp/__tests__/service.test.ts +0 -530
- package/clients/lsp/client.js +0 -350
- package/clients/lsp/config.js +0 -112
- package/clients/lsp/index.js +0 -318
- package/clients/lsp/installer/index.js +0 -391
- package/clients/lsp/interactive-install.js +0 -221
- package/clients/lsp/language.js +0 -170
- package/clients/lsp/launch.js +0 -329
- package/clients/lsp/lsp/launch.js +0 -116
- package/clients/lsp/lsp/server.js +0 -532
- package/clients/lsp/lsp-index.js +0 -10
- package/clients/lsp/path-utils.js +0 -5
- package/clients/lsp/server.js +0 -725
- package/clients/lsp/test-py-spawn/requirements.txt +0 -1
- package/clients/lsp/test-py-spawn/test.py +0 -3
- package/clients/lsp/test-py-svc/requirements.txt +0 -1
- package/clients/lsp/test-py-svc/test.py +0 -3
- package/clients/lsp/test-python-project/requirements.txt +0 -1
- package/clients/lsp/test-python-project/test.py +0 -5
- package/clients/metrics-client.js +0 -107
- package/clients/metrics-client.test.js +0 -128
- package/clients/metrics-client.test.ts +0 -163
- package/clients/metrics-history.js +0 -367
- package/clients/path-utils.js +0 -142
- package/clients/pipeline.js +0 -272
- package/clients/production-readiness.js +0 -522
- package/clients/project-index.js +0 -255
- package/clients/project-metadata.js +0 -531
- package/clients/ruff-client.js +0 -325
- package/clients/ruff-client.test.js +0 -132
- package/clients/ruff-client.test.ts +0 -153
- package/clients/rules-scanner.js +0 -97
- package/clients/runner-tracker.js +0 -152
- package/clients/rust-client.js +0 -205
- package/clients/rust-client.test.js +0 -108
- package/clients/rust-client.test.ts +0 -130
- package/clients/safe-spawn-async.js +0 -163
- package/clients/safe-spawn.js +0 -241
- package/clients/sanitize.js +0 -291
- package/clients/sanitize.test.js +0 -177
- package/clients/sanitize.test.ts +0 -223
- package/clients/scan-architectural-debt.js +0 -167
- package/clients/scan-utils.js +0 -83
- package/clients/secrets-scanner.js +0 -119
- package/clients/secrets-scanner.test.js +0 -100
- package/clients/secrets-scanner.test.ts +0 -113
- package/clients/sg-runner.js +0 -292
- package/clients/state-matrix.js +0 -160
- package/clients/subprocess-client.js +0 -65
- package/clients/symbol-types.js +0 -5
- package/clients/test-runner-client.js +0 -523
- package/clients/test-runner-client.test.js +0 -192
- package/clients/test-runner-client.test.ts +0 -253
- package/clients/test-utils.js +0 -27
- package/clients/test-utils.ts +0 -36
- package/clients/todo-scanner.js +0 -200
- package/clients/todo-scanner.test.js +0 -301
- package/clients/todo-scanner.test.ts +0 -352
- package/clients/tool-availability.js +0 -207
- package/clients/tree-sitter-client.js +0 -601
- package/clients/tree-sitter-query-loader.js +0 -355
- package/clients/tree-sitter-symbol-extractor.js +0 -289
- package/clients/ts-service.js +0 -129
- package/clients/type-coverage-client.js +0 -127
- package/clients/type-coverage-client.test.js +0 -105
- package/clients/type-coverage-client.test.ts +0 -125
- package/clients/type-safety-client.js +0 -138
- package/clients/types.js +0 -11
- package/clients/typescript-client.codefix.test.js +0 -157
- package/clients/typescript-client.codefix.test.ts +0 -186
- package/clients/typescript-client.js +0 -509
- package/clients/typescript-client.test.js +0 -105
- package/clients/typescript-client.test.ts +0 -126
- package/commands/booboo.js +0 -1007
- package/commands/fix-from-booboo.js +0 -398
- package/commands/fix-simplified.js +0 -618
- package/commands/rate.js +0 -281
- package/commands/rate.test.js +0 -119
- package/commands/rate.test.ts +0 -131
- package/commands/refactor.js +0 -130
package/clients/project-index.js
DELETED
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Project Index: Cache of state matrices for all utilities in the project
|
|
3
|
-
*
|
|
4
|
-
* Builds and maintains an index of exported functions for similarity detection.
|
|
5
|
-
* Stores 57×72 state matrices keyed by function location.
|
|
6
|
-
*/
|
|
7
|
-
import * as fs from "node:fs/promises";
|
|
8
|
-
import * as path from "node:path";
|
|
9
|
-
import * as ts from "typescript";
|
|
10
|
-
import { buildStateMatrixFromFile, calculateSimilarity, countTransitions, } from "./state-matrix.js";
|
|
11
|
-
// ============================================================================
|
|
12
|
-
// Index Builder
|
|
13
|
-
// ============================================================================
|
|
14
|
-
/**
|
|
15
|
-
* Build project index by scanning TypeScript files
|
|
16
|
-
*/
|
|
17
|
-
export async function buildProjectIndex(projectRoot, filePaths) {
|
|
18
|
-
const entries = new Map();
|
|
19
|
-
for (const filePath of filePaths) {
|
|
20
|
-
if (!filePath.endsWith(".ts") && !filePath.endsWith(".tsx")) {
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
try {
|
|
24
|
-
const fileEntries = await indexFile(projectRoot, filePath);
|
|
25
|
-
for (const entry of fileEntries) {
|
|
26
|
-
entries.set(entry.id, entry);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
catch (error) {
|
|
30
|
-
// Skip files that can't be parsed
|
|
31
|
-
console.error(`Failed to index ${filePath}:`, error);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return {
|
|
35
|
-
version: "1.0",
|
|
36
|
-
createdAt: new Date().toISOString(),
|
|
37
|
-
entries,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Index a single TypeScript file
|
|
42
|
-
*/
|
|
43
|
-
async function indexFile(projectRoot, filePath) {
|
|
44
|
-
const entries = [];
|
|
45
|
-
const content = await fs.readFile(filePath, "utf-8");
|
|
46
|
-
const stats = await fs.stat(filePath);
|
|
47
|
-
const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
48
|
-
const relativePath = path.relative(projectRoot, filePath);
|
|
49
|
-
const exports = [];
|
|
50
|
-
// Find all exported functions
|
|
51
|
-
function visit(node) {
|
|
52
|
-
// Track all exports for reference
|
|
53
|
-
if (ts.isExportDeclaration(node) || hasExportModifier(node)) {
|
|
54
|
-
const name = getExportName(node);
|
|
55
|
-
if (name)
|
|
56
|
-
exports.push(name);
|
|
57
|
-
}
|
|
58
|
-
// Extract function declarations
|
|
59
|
-
if (ts.isFunctionDeclaration(node) && node.name) {
|
|
60
|
-
const functionName = node.name.text;
|
|
61
|
-
const _isExported = hasExportModifier(node);
|
|
62
|
-
// For now, index all named functions (we can filter to exports only later)
|
|
63
|
-
const id = `${relativePath}:${functionName}`;
|
|
64
|
-
// Build matrix just for this function's AST subtree
|
|
65
|
-
const matrix = buildFunctionMatrix(node, sourceFile);
|
|
66
|
-
const transitionCount = countTransitions(matrix);
|
|
67
|
-
// Skip trivial functions (<20 transitions)
|
|
68
|
-
if (transitionCount >= 20) {
|
|
69
|
-
entries.push({
|
|
70
|
-
id,
|
|
71
|
-
filePath: relativePath,
|
|
72
|
-
functionName,
|
|
73
|
-
signature: getFunctionSignature(node),
|
|
74
|
-
matrix,
|
|
75
|
-
transitionCount,
|
|
76
|
-
lastModified: stats.mtimeMs,
|
|
77
|
-
exports,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
// Arrow functions assigned to variables (const fn = () => {})
|
|
82
|
-
if (ts.isVariableStatement(node)) {
|
|
83
|
-
extractArrowFunctions(node, entries, relativePath, sourceFile, stats, exports);
|
|
84
|
-
}
|
|
85
|
-
ts.forEachChild(node, visit);
|
|
86
|
-
}
|
|
87
|
-
visit(sourceFile);
|
|
88
|
-
return entries;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Extract arrow functions and function expressions from variable declarations
|
|
92
|
-
*/
|
|
93
|
-
function extractArrowFunctions(node, entries, relativePath, sourceFile, stats, exports) {
|
|
94
|
-
for (const decl of node.declarationList.declarations) {
|
|
95
|
-
if (!ts.isIdentifier(decl.name) || !decl.initializer) {
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
const func = decl.initializer;
|
|
99
|
-
if (!ts.isArrowFunction(func) && !ts.isFunctionExpression(func)) {
|
|
100
|
-
continue;
|
|
101
|
-
}
|
|
102
|
-
const functionName = decl.name.text;
|
|
103
|
-
const id = `${relativePath}:${functionName}`;
|
|
104
|
-
const matrix = buildFunctionMatrix(func, sourceFile);
|
|
105
|
-
const transitionCount = countTransitions(matrix);
|
|
106
|
-
// Skip trivial functions (<20 transitions)
|
|
107
|
-
if (transitionCount < 20) {
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
entries.push({
|
|
111
|
-
id,
|
|
112
|
-
filePath: relativePath,
|
|
113
|
-
functionName,
|
|
114
|
-
signature: getArrowFunctionSignature(func),
|
|
115
|
-
matrix,
|
|
116
|
-
transitionCount,
|
|
117
|
-
lastModified: stats.mtimeMs,
|
|
118
|
-
exports,
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Build state matrix for a specific function node
|
|
124
|
-
*/
|
|
125
|
-
function buildFunctionMatrix(functionNode, sourceFile) {
|
|
126
|
-
// Extract just the function's code as text
|
|
127
|
-
const start = functionNode.getStart(sourceFile);
|
|
128
|
-
const end = functionNode.getEnd();
|
|
129
|
-
const functionCode = sourceFile.text.substring(start, end);
|
|
130
|
-
// Build matrix for just this function
|
|
131
|
-
const funcSourceFile = ts.createSourceFile("func.ts", functionCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
132
|
-
return buildStateMatrixFromFile(funcSourceFile);
|
|
133
|
-
}
|
|
134
|
-
// ============================================================================
|
|
135
|
-
// Utilities
|
|
136
|
-
// ============================================================================
|
|
137
|
-
function hasExportModifier(node) {
|
|
138
|
-
const modifiers = node.modifiers;
|
|
139
|
-
if (!modifiers)
|
|
140
|
-
return false;
|
|
141
|
-
return modifiers.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
|
|
142
|
-
}
|
|
143
|
-
function getExportName(node) {
|
|
144
|
-
if (ts.isFunctionDeclaration(node) && node.name) {
|
|
145
|
-
return node.name.text;
|
|
146
|
-
}
|
|
147
|
-
if (ts.isVariableStatement(node)) {
|
|
148
|
-
const decl = node.declarationList.declarations[0];
|
|
149
|
-
if (ts.isIdentifier(decl.name)) {
|
|
150
|
-
return decl.name.text;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
function getFunctionSignature(node) {
|
|
156
|
-
const params = node.parameters
|
|
157
|
-
.map((p) => {
|
|
158
|
-
const name = ts.isIdentifier(p.name) ? p.name.text : "param";
|
|
159
|
-
const type = p.type ? `:${sourceFileToString(p.type)}` : "";
|
|
160
|
-
return `${name}${type}`;
|
|
161
|
-
})
|
|
162
|
-
.join(", ");
|
|
163
|
-
const returnType = node.type ? ` => ${sourceFileToString(node.type)}` : "";
|
|
164
|
-
return `(${params})${returnType}`;
|
|
165
|
-
}
|
|
166
|
-
function getArrowFunctionSignature(node) {
|
|
167
|
-
const params = node.parameters
|
|
168
|
-
.map((p) => {
|
|
169
|
-
const name = ts.isIdentifier(p.name) ? p.name.text : "param";
|
|
170
|
-
const type = p.type ? `:${sourceFileToString(p.type)}` : "";
|
|
171
|
-
return `${name}${type}`;
|
|
172
|
-
})
|
|
173
|
-
.join(", ");
|
|
174
|
-
const returnType = node.type ? ` => ${sourceFileToString(node.type)}` : "";
|
|
175
|
-
return `(${params})${returnType}`;
|
|
176
|
-
}
|
|
177
|
-
function sourceFileToString(node) {
|
|
178
|
-
// Simple stringify - just get the text
|
|
179
|
-
const tempFile = ts.createSourceFile("temp.ts", "", ts.ScriptTarget.Latest);
|
|
180
|
-
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
|
|
181
|
-
return printer.printNode(ts.EmitHint.Unspecified, node, tempFile).trim();
|
|
182
|
-
}
|
|
183
|
-
// ============================================================================
|
|
184
|
-
// Similarity Queries
|
|
185
|
-
// ============================================================================
|
|
186
|
-
/**
|
|
187
|
-
* Find similar functions in the index
|
|
188
|
-
*/
|
|
189
|
-
export function findSimilarFunctions(matrix, index, threshold = 0.75, maxResults = 3) {
|
|
190
|
-
const matches = [];
|
|
191
|
-
for (const entry of index.entries.values()) {
|
|
192
|
-
const similarity = calculateSimilarity(matrix, entry.matrix);
|
|
193
|
-
if (similarity >= threshold) {
|
|
194
|
-
matches.push({
|
|
195
|
-
targetId: entry.id,
|
|
196
|
-
targetName: entry.functionName,
|
|
197
|
-
targetLocation: `${entry.filePath}:1`, // TODO: get actual line
|
|
198
|
-
similarity,
|
|
199
|
-
signature: entry.signature,
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
// Sort by similarity descending, take top N
|
|
204
|
-
return matches
|
|
205
|
-
.sort((a, b) => b.similarity - a.similarity)
|
|
206
|
-
.slice(0, maxResults);
|
|
207
|
-
}
|
|
208
|
-
// ============================================================================
|
|
209
|
-
// Persistence
|
|
210
|
-
// ============================================================================
|
|
211
|
-
const INDEX_FILE = ".pi-lens/index.json";
|
|
212
|
-
/**
|
|
213
|
-
* Save index to disk
|
|
214
|
-
*/
|
|
215
|
-
export async function saveIndex(index, projectRoot) {
|
|
216
|
-
const indexPath = path.join(projectRoot, INDEX_FILE);
|
|
217
|
-
await fs.mkdir(path.dirname(indexPath), { recursive: true });
|
|
218
|
-
// Convert Map to array for JSON serialization
|
|
219
|
-
const serialized = {
|
|
220
|
-
version: index.version,
|
|
221
|
-
createdAt: index.createdAt,
|
|
222
|
-
entries: Array.from(index.entries.entries()),
|
|
223
|
-
};
|
|
224
|
-
await fs.writeFile(indexPath, JSON.stringify(serialized, null, 2));
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Load index from disk
|
|
228
|
-
*/
|
|
229
|
-
export async function loadIndex(projectRoot) {
|
|
230
|
-
const indexPath = path.join(projectRoot, INDEX_FILE);
|
|
231
|
-
try {
|
|
232
|
-
const data = await fs.readFile(indexPath, "utf-8");
|
|
233
|
-
const parsed = JSON.parse(data);
|
|
234
|
-
return {
|
|
235
|
-
version: parsed.version,
|
|
236
|
-
createdAt: parsed.createdAt,
|
|
237
|
-
entries: new Map(parsed.entries),
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
catch {
|
|
241
|
-
return null;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Check if index exists and is fresh (<24 hours old)
|
|
246
|
-
*/
|
|
247
|
-
export async function isIndexFresh(projectRoot) {
|
|
248
|
-
const index = await loadIndex(projectRoot);
|
|
249
|
-
if (!index)
|
|
250
|
-
return false;
|
|
251
|
-
const createdAt = new Date(index.createdAt).getTime();
|
|
252
|
-
const age = Date.now() - createdAt;
|
|
253
|
-
const maxAge = 24 * 60 * 60 * 1000; // 24 hours
|
|
254
|
-
return age < maxAge;
|
|
255
|
-
}
|