@snapback/cli 1.1.12 → 1.6.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/README.md +9 -9
- package/dist/SkippedTestDetector-5WJZKZQ3.js +5 -0
- package/dist/{SkippedTestDetector-B3JZUE5G.js.map → SkippedTestDetector-5WJZKZQ3.js.map} +1 -1
- package/dist/{analysis-Z53F5FT2.js → analysis-YI4UNUCM.js} +6 -6
- package/dist/{analysis-Z53F5FT2.js.map → analysis-YI4UNUCM.js.map} +1 -1
- package/dist/{chunk-NKBZIXCN.js → chunk-7JX6Y4TL.js} +135 -15
- package/dist/chunk-7JX6Y4TL.js.map +1 -0
- package/dist/{chunk-G7QXHNGB.js → chunk-ARVV3F4K.js} +44 -18
- package/dist/chunk-ARVV3F4K.js.map +1 -0
- package/dist/{chunk-YOVA65PS.js → chunk-EU2IZPOK.js} +322 -65
- package/dist/chunk-EU2IZPOK.js.map +1 -0
- package/dist/{chunk-QAKFE3NE.js → chunk-FVIYXFCL.js} +4 -4
- package/dist/{chunk-QAKFE3NE.js.map → chunk-FVIYXFCL.js.map} +1 -1
- package/dist/{chunk-KPETDXQO.js → chunk-R7CUQ7CU.js} +298 -35
- package/dist/chunk-R7CUQ7CU.js.map +1 -0
- package/dist/{chunk-BW7RALUZ.js → chunk-RB7H4UQJ.js} +3 -3
- package/dist/{chunk-BW7RALUZ.js.map → chunk-RB7H4UQJ.js.map} +1 -1
- package/dist/chunk-SOABQWAU.js +385 -0
- package/dist/chunk-SOABQWAU.js.map +1 -0
- package/dist/dist-O6EBXLN6.js +5 -0
- package/dist/{dist-7UKXVKH3.js.map → dist-O6EBXLN6.js.map} +1 -1
- package/dist/{dist-7UKXVKH3.js → dist-PJVBBZTF.js} +5 -5
- package/dist/{dist-VDK7WEF4.js.map → dist-PJVBBZTF.js.map} +1 -1
- package/dist/index.js +38334 -24021
- package/dist/index.js.map +1 -1
- package/dist/learning-pruner-QC4CTJDX.js +5 -0
- package/dist/learning-pruner-QC4CTJDX.js.map +1 -0
- package/dist/{secure-credentials-6UMEU22H.js → secure-credentials-IWQB6KU4.js} +16 -8
- package/dist/secure-credentials-IWQB6KU4.js.map +1 -0
- package/dist/snapback-dir-V6MWXIW4.js +5 -0
- package/dist/{snapback-dir-T3CRQRY6.js.map → snapback-dir-V6MWXIW4.js.map} +1 -1
- package/package.json +6 -41
- package/dist/SkippedTestDetector-B3JZUE5G.js +0 -5
- package/dist/chunk-6MR2TINI.js +0 -27
- package/dist/chunk-6MR2TINI.js.map +0 -1
- package/dist/chunk-G7QXHNGB.js.map +0 -1
- package/dist/chunk-ISVRGBWT.js +0 -16223
- package/dist/chunk-ISVRGBWT.js.map +0 -1
- package/dist/chunk-KPETDXQO.js.map +0 -1
- package/dist/chunk-NKBZIXCN.js.map +0 -1
- package/dist/chunk-YOVA65PS.js.map +0 -1
- package/dist/dist-VDK7WEF4.js +0 -5
- package/dist/dist-WKLJSPJT.js +0 -8
- package/dist/dist-WKLJSPJT.js.map +0 -1
- package/dist/secure-credentials-6UMEU22H.js.map +0 -1
- package/dist/snapback-dir-T3CRQRY6.js +0 -6
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="./assets/github-cli.png" alt="SnapBack CLI - The command-line interface for effortless restores and snapshots" />
|
|
3
|
+
</p>
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@snapback/cli)
|
|
6
6
|
[](https://www.npmjs.com/package/@snapback/cli)
|
|
7
|
-
[](https://github.com/snapback-dev/snapback/blob/main/LICENSE)
|
|
7
|
+
[](https://github.com/snapback-dev/snapback-cli/blob/main/LICENSE)
|
|
8
8
|
|
|
9
9
|
AI coding assistants like **Cursor**, **GitHub Copilot**, and **Claude** are incredible—until they're not. One wrong autocomplete can cascade into hours of debugging. Git doesn't help because you haven't committed yet.
|
|
10
10
|
|
|
@@ -38,12 +38,12 @@ SnapBack has two primary interfaces:
|
|
|
38
38
|
The extension provides the best experience with automatic snapshots, visual recovery UI, and real-time risk indicators.
|
|
39
39
|
|
|
40
40
|
```
|
|
41
|
-
ext install snapback-vscode
|
|
41
|
+
ext install MarcelleLabs.snapback-vscode
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
Or search "SnapBack" in the VS Code Extensions marketplace.
|
|
45
45
|
|
|
46
|
-
[](https://marketplace.visualstudio.com/items?itemName=MarcelleLabs.snapback-vscode)
|
|
47
47
|
|
|
48
48
|
### 💻 CLI Tool
|
|
49
49
|
|
|
@@ -572,7 +572,7 @@ $ snap doctor
|
|
|
572
572
|
|
|
573
573
|
| Package | Description |
|
|
574
574
|
|---------|-------------|
|
|
575
|
-
| [snapback-vscode](https://marketplace.visualstudio.com/items?itemName=
|
|
575
|
+
| [MarcelleLabs.snapback-vscode](https://marketplace.visualstudio.com/items?itemName=MarcelleLabs.snapback-vscode) | VS Code extension with visual UI |
|
|
576
576
|
|
|
577
577
|
---
|
|
578
578
|
|
|
@@ -586,7 +586,7 @@ Unlock Pro features like checkpoint creation and restoration:
|
|
|
586
586
|
|
|
587
587
|
## License
|
|
588
588
|
|
|
589
|
-
[Apache-2.0](https://github.com/snapback-dev/snapback/blob/main/LICENSE)
|
|
589
|
+
[Apache-2.0](https://github.com/snapback-dev/snapback-cli/blob/main/LICENSE)
|
|
590
590
|
|
|
591
591
|
---
|
|
592
592
|
|
|
@@ -595,5 +595,5 @@ Unlock Pro features like checkpoint creation and restoration:
|
|
|
595
595
|
<a href="https://snapback.dev">Website</a> ·
|
|
596
596
|
<a href="https://docs.snapback.dev">Docs</a> ·
|
|
597
597
|
<a href="https://console.snapback.dev">Dashboard</a> ·
|
|
598
|
-
<a href="https://discord.gg/
|
|
598
|
+
<a href="https://discord.gg/B4BXeYkE2F">Discord</a>
|
|
599
599
|
</p>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env node --no-warnings=ExperimentalWarning
|
|
2
|
+
export { analyzeSkippedTests, detectSkippedTests, getSkippedTestSummary } from './chunk-FVIYXFCL.js';
|
|
3
|
+
import './chunk-RB7H4UQJ.js';
|
|
4
|
+
//# sourceMappingURL=SkippedTestDetector-5WJZKZQ3.js.map
|
|
5
|
+
//# sourceMappingURL=SkippedTestDetector-5WJZKZQ3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"SkippedTestDetector-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"SkippedTestDetector-5WJZKZQ3.js"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
export { ChangeImpactAnalyzer, CompletenessAnalyzer, SecurityAnalyzer, SyntaxAnalyzer, checkFilesForOrphanStatus, createChangeImpactAnalyzer, detectOrphans, filterOrphansToFiles, runStaticAnalysis } from './chunk-
|
|
3
|
-
export { analyzeSkippedTests, detectSkippedTests, getSkippedTestSummary } from './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
//# sourceMappingURL=analysis-
|
|
6
|
-
//# sourceMappingURL=analysis-
|
|
1
|
+
#!/usr/bin/env node --no-warnings=ExperimentalWarning
|
|
2
|
+
export { ChangeImpactAnalyzer, CompletenessAnalyzer, SecurityAnalyzer, SyntaxAnalyzer, checkFilesForOrphanStatus, createChangeImpactAnalyzer, detectOrphans, filterOrphansToFiles, runStaticAnalysis } from './chunk-ARVV3F4K.js';
|
|
3
|
+
export { analyzeSkippedTests, detectSkippedTests, getSkippedTestSummary } from './chunk-FVIYXFCL.js';
|
|
4
|
+
import './chunk-RB7H4UQJ.js';
|
|
5
|
+
//# sourceMappingURL=analysis-YI4UNUCM.js.map
|
|
6
|
+
//# sourceMappingURL=analysis-YI4UNUCM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"analysis-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"analysis-YI4UNUCM.js"}
|
|
@@ -1,11 +1,114 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { __name } from './chunk-
|
|
1
|
+
#!/usr/bin/env node --no-warnings=ExperimentalWarning
|
|
2
|
+
import { __name } from './chunk-RB7H4UQJ.js';
|
|
3
3
|
import { mkdir, writeFile, access, constants, readFile, appendFile, stat } from 'fs/promises';
|
|
4
4
|
import { homedir } from 'os';
|
|
5
5
|
import { join, dirname } from 'path';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { nanoid } from 'nanoid';
|
|
6
8
|
|
|
9
|
+
function generateId(prefix) {
|
|
10
|
+
const id = nanoid();
|
|
11
|
+
return prefix ? `${prefix}-${id}` : id;
|
|
12
|
+
}
|
|
13
|
+
__name(generateId, "generateId");
|
|
14
|
+
function slugify(description, maxLength = 30) {
|
|
15
|
+
return description.toLowerCase().trim().replace(/[^a-z0-9\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, maxLength);
|
|
16
|
+
}
|
|
17
|
+
__name(slugify, "slugify");
|
|
18
|
+
function generateSnapshotId(description) {
|
|
19
|
+
if (description && description.length > 0) {
|
|
20
|
+
const slug = slugify(description);
|
|
21
|
+
if (slug.length > 0) {
|
|
22
|
+
return `snapshot-${slug}-${Date.now()}-${nanoid(9)}`;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return `snapshot-${Date.now()}-${nanoid(9)}`;
|
|
26
|
+
}
|
|
27
|
+
__name(generateSnapshotId, "generateSnapshotId");
|
|
28
|
+
|
|
29
|
+
// src/services/snapback-dir.ts
|
|
7
30
|
var SNAPBACK_DIR = ".snapback";
|
|
8
31
|
var GLOBAL_SNAPBACK_DIR = ".snapback";
|
|
32
|
+
var WorkspaceConfigSchema = z.object({
|
|
33
|
+
workspaceId: z.string().optional(),
|
|
34
|
+
tier: z.enum([
|
|
35
|
+
"free",
|
|
36
|
+
"pro"
|
|
37
|
+
]).optional(),
|
|
38
|
+
protectionLevel: z.enum([
|
|
39
|
+
"standard",
|
|
40
|
+
"strict"
|
|
41
|
+
]).optional(),
|
|
42
|
+
syncEnabled: z.boolean().optional(),
|
|
43
|
+
createdAt: z.string(),
|
|
44
|
+
updatedAt: z.string()
|
|
45
|
+
});
|
|
46
|
+
var WorkspaceVitalsSchema = z.object({
|
|
47
|
+
framework: z.string().optional(),
|
|
48
|
+
frameworkConfidence: z.number().optional(),
|
|
49
|
+
packageManager: z.enum([
|
|
50
|
+
"npm",
|
|
51
|
+
"pnpm",
|
|
52
|
+
"yarn",
|
|
53
|
+
"bun"
|
|
54
|
+
]).optional(),
|
|
55
|
+
typescript: z.object({
|
|
56
|
+
enabled: z.boolean(),
|
|
57
|
+
strict: z.boolean().optional(),
|
|
58
|
+
version: z.string().optional()
|
|
59
|
+
}).optional(),
|
|
60
|
+
criticalFiles: z.array(z.string()).optional(),
|
|
61
|
+
detectedAt: z.string()
|
|
62
|
+
});
|
|
63
|
+
var ProtectedFileSchema = z.object({
|
|
64
|
+
pattern: z.string(),
|
|
65
|
+
addedAt: z.string(),
|
|
66
|
+
reason: z.string().optional()
|
|
67
|
+
});
|
|
68
|
+
var SessionStateSchema = z.object({
|
|
69
|
+
id: z.string(),
|
|
70
|
+
task: z.string().optional(),
|
|
71
|
+
startedAt: z.string(),
|
|
72
|
+
snapshotCount: z.number(),
|
|
73
|
+
filesModified: z.number().optional()
|
|
74
|
+
});
|
|
75
|
+
var LearningEntrySchema = z.object({
|
|
76
|
+
id: z.string(),
|
|
77
|
+
type: z.enum([
|
|
78
|
+
"pattern",
|
|
79
|
+
"pitfall",
|
|
80
|
+
"efficiency",
|
|
81
|
+
"discovery",
|
|
82
|
+
"workflow"
|
|
83
|
+
]),
|
|
84
|
+
trigger: z.string(),
|
|
85
|
+
action: z.string(),
|
|
86
|
+
source: z.string(),
|
|
87
|
+
createdAt: z.string()
|
|
88
|
+
});
|
|
89
|
+
var ViolationEntrySchema = z.object({
|
|
90
|
+
type: z.string(),
|
|
91
|
+
file: z.string(),
|
|
92
|
+
message: z.string(),
|
|
93
|
+
count: z.number().optional(),
|
|
94
|
+
date: z.string(),
|
|
95
|
+
prevention: z.string().optional()
|
|
96
|
+
});
|
|
97
|
+
var GlobalCredentialsSchema = z.object({
|
|
98
|
+
accessToken: z.string(),
|
|
99
|
+
refreshToken: z.string().optional(),
|
|
100
|
+
email: z.string(),
|
|
101
|
+
tier: z.enum([
|
|
102
|
+
"free",
|
|
103
|
+
"pro"
|
|
104
|
+
]),
|
|
105
|
+
expiresAt: z.string().optional()
|
|
106
|
+
});
|
|
107
|
+
var GlobalConfigSchema = z.object({
|
|
108
|
+
apiUrl: z.string().optional(),
|
|
109
|
+
defaultWorkspace: z.string().optional(),
|
|
110
|
+
analytics: z.boolean().optional()
|
|
111
|
+
});
|
|
9
112
|
function getGlobalDir() {
|
|
10
113
|
return join(homedir(), GLOBAL_SNAPBACK_DIR);
|
|
11
114
|
}
|
|
@@ -155,7 +258,10 @@ async function deleteGlobalJson(relativePath) {
|
|
|
155
258
|
}
|
|
156
259
|
__name(deleteGlobalJson, "deleteGlobalJson");
|
|
157
260
|
async function getWorkspaceConfig(workspaceRoot) {
|
|
158
|
-
|
|
261
|
+
const data = await readSnapbackJson("config.json", workspaceRoot);
|
|
262
|
+
if (!data) return null;
|
|
263
|
+
const result = WorkspaceConfigSchema.safeParse(data);
|
|
264
|
+
return result.success ? result.data : null;
|
|
159
265
|
}
|
|
160
266
|
__name(getWorkspaceConfig, "getWorkspaceConfig");
|
|
161
267
|
async function saveWorkspaceConfig(config, workspaceRoot) {
|
|
@@ -163,7 +269,10 @@ async function saveWorkspaceConfig(config, workspaceRoot) {
|
|
|
163
269
|
}
|
|
164
270
|
__name(saveWorkspaceConfig, "saveWorkspaceConfig");
|
|
165
271
|
async function getWorkspaceVitals(workspaceRoot) {
|
|
166
|
-
|
|
272
|
+
const data = await readSnapbackJson("vitals.json", workspaceRoot);
|
|
273
|
+
if (!data) return null;
|
|
274
|
+
const result = WorkspaceVitalsSchema.safeParse(data);
|
|
275
|
+
return result.success ? result.data : null;
|
|
167
276
|
}
|
|
168
277
|
__name(getWorkspaceVitals, "getWorkspaceVitals");
|
|
169
278
|
async function saveWorkspaceVitals(vitals, workspaceRoot) {
|
|
@@ -171,7 +280,10 @@ async function saveWorkspaceVitals(vitals, workspaceRoot) {
|
|
|
171
280
|
}
|
|
172
281
|
__name(saveWorkspaceVitals, "saveWorkspaceVitals");
|
|
173
282
|
async function getProtectedFiles(workspaceRoot) {
|
|
174
|
-
|
|
283
|
+
const data = await readSnapbackJson("protected.json", workspaceRoot);
|
|
284
|
+
if (!data) return [];
|
|
285
|
+
const result = z.array(ProtectedFileSchema).safeParse(data);
|
|
286
|
+
return result.success ? result.data : [];
|
|
175
287
|
}
|
|
176
288
|
__name(getProtectedFiles, "getProtectedFiles");
|
|
177
289
|
async function saveProtectedFiles(files, workspaceRoot) {
|
|
@@ -179,7 +291,10 @@ async function saveProtectedFiles(files, workspaceRoot) {
|
|
|
179
291
|
}
|
|
180
292
|
__name(saveProtectedFiles, "saveProtectedFiles");
|
|
181
293
|
async function getCurrentSession(workspaceRoot) {
|
|
182
|
-
|
|
294
|
+
const data = await readSnapbackJson("session/current.json", workspaceRoot);
|
|
295
|
+
if (!data) return null;
|
|
296
|
+
const result = SessionStateSchema.safeParse(data);
|
|
297
|
+
return result.success ? result.data : null;
|
|
183
298
|
}
|
|
184
299
|
__name(getCurrentSession, "getCurrentSession");
|
|
185
300
|
async function saveCurrentSession(session, workspaceRoot) {
|
|
@@ -200,7 +315,8 @@ async function recordLearning(learning, workspaceRoot) {
|
|
|
200
315
|
}
|
|
201
316
|
__name(recordLearning, "recordLearning");
|
|
202
317
|
async function getLearnings(workspaceRoot) {
|
|
203
|
-
|
|
318
|
+
const data = await loadSnapbackJsonl("learnings/user-learnings.jsonl", workspaceRoot);
|
|
319
|
+
return data.filter((item) => LearningEntrySchema.safeParse(item).success);
|
|
204
320
|
}
|
|
205
321
|
__name(getLearnings, "getLearnings");
|
|
206
322
|
async function recordViolation(violation, workspaceRoot) {
|
|
@@ -208,12 +324,13 @@ async function recordViolation(violation, workspaceRoot) {
|
|
|
208
324
|
}
|
|
209
325
|
__name(recordViolation, "recordViolation");
|
|
210
326
|
async function getViolations(workspaceRoot) {
|
|
211
|
-
|
|
327
|
+
const data = await loadSnapbackJsonl("patterns/violations.jsonl", workspaceRoot);
|
|
328
|
+
return data.filter((item) => ViolationEntrySchema.safeParse(item).success);
|
|
212
329
|
}
|
|
213
330
|
__name(getViolations, "getViolations");
|
|
214
331
|
async function getCredentials() {
|
|
215
332
|
try {
|
|
216
|
-
const { getCredentialsSecure } = await import('./secure-credentials-
|
|
333
|
+
const { getCredentialsSecure } = await import('./secure-credentials-IWQB6KU4.js');
|
|
217
334
|
return await getCredentialsSecure();
|
|
218
335
|
} catch {
|
|
219
336
|
return readGlobalJson("credentials.json");
|
|
@@ -222,7 +339,7 @@ async function getCredentials() {
|
|
|
222
339
|
__name(getCredentials, "getCredentials");
|
|
223
340
|
async function saveCredentials(credentials) {
|
|
224
341
|
try {
|
|
225
|
-
const { saveCredentialsSecure } = await import('./secure-credentials-
|
|
342
|
+
const { saveCredentialsSecure } = await import('./secure-credentials-IWQB6KU4.js');
|
|
226
343
|
return await saveCredentialsSecure(credentials);
|
|
227
344
|
} catch {
|
|
228
345
|
await createGlobalDirectory();
|
|
@@ -232,7 +349,7 @@ async function saveCredentials(credentials) {
|
|
|
232
349
|
__name(saveCredentials, "saveCredentials");
|
|
233
350
|
async function clearCredentials() {
|
|
234
351
|
try {
|
|
235
|
-
const { clearCredentialsSecure } = await import('./secure-credentials-
|
|
352
|
+
const { clearCredentialsSecure } = await import('./secure-credentials-IWQB6KU4.js');
|
|
236
353
|
return await clearCredentialsSecure();
|
|
237
354
|
} catch {
|
|
238
355
|
await deleteGlobalJson("credentials.json");
|
|
@@ -240,7 +357,10 @@ async function clearCredentials() {
|
|
|
240
357
|
}
|
|
241
358
|
__name(clearCredentials, "clearCredentials");
|
|
242
359
|
async function getGlobalConfig() {
|
|
243
|
-
|
|
360
|
+
const data = await readGlobalJson("config.json");
|
|
361
|
+
if (!data) return null;
|
|
362
|
+
const result = GlobalConfigSchema.safeParse(data);
|
|
363
|
+
return result.success ? result.data : null;
|
|
244
364
|
}
|
|
245
365
|
__name(getGlobalConfig, "getGlobalConfig");
|
|
246
366
|
async function saveGlobalConfig(config) {
|
|
@@ -295,6 +415,6 @@ async function getStats(path) {
|
|
|
295
415
|
}
|
|
296
416
|
__name(getStats, "getStats");
|
|
297
417
|
|
|
298
|
-
export { appendSnapbackJsonl, clearCredentials, createGlobalDirectory, createSnapbackDirectory, deleteGlobalJson, endCurrentSession, findWorkspaceRoot, getCredentials, getCurrentSession, getGlobalConfig, getGlobalDir, getGlobalPath, getLearnings, getProtectedFiles, getStats, getViolations, getWorkspaceConfig, getWorkspaceDir, getWorkspacePath, getWorkspaceVitals, isLoggedIn, isSnapbackInitialized, loadSnapbackJsonl, pathExists, readGlobalJson, readSnapbackJson, recordLearning, recordViolation, saveCredentials, saveCurrentSession, saveGlobalConfig, saveProtectedFiles, saveWorkspaceConfig, saveWorkspaceVitals, writeGlobalJson, writeSnapbackJson };
|
|
299
|
-
//# sourceMappingURL=chunk-
|
|
300
|
-
//# sourceMappingURL=chunk-
|
|
418
|
+
export { GlobalConfigSchema, GlobalCredentialsSchema, LearningEntrySchema, ProtectedFileSchema, SessionStateSchema, ViolationEntrySchema, WorkspaceConfigSchema, WorkspaceVitalsSchema, appendSnapbackJsonl, clearCredentials, createGlobalDirectory, createSnapbackDirectory, deleteGlobalJson, endCurrentSession, findWorkspaceRoot, generateId, generateSnapshotId, getCredentials, getCurrentSession, getGlobalConfig, getGlobalDir, getGlobalPath, getLearnings, getProtectedFiles, getStats, getViolations, getWorkspaceConfig, getWorkspaceDir, getWorkspacePath, getWorkspaceVitals, isLoggedIn, isSnapbackInitialized, loadSnapbackJsonl, pathExists, readGlobalJson, readSnapbackJson, recordLearning, recordViolation, saveCredentials, saveCurrentSession, saveGlobalConfig, saveProtectedFiles, saveWorkspaceConfig, saveWorkspaceVitals, writeGlobalJson, writeSnapbackJson };
|
|
419
|
+
//# sourceMappingURL=chunk-7JX6Y4TL.js.map
|
|
420
|
+
//# sourceMappingURL=chunk-7JX6Y4TL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../packages/contracts/dist/id-generator.js","../src/services/snapback-dir.ts"],"names":["generateId","prefix","id","nanoid","slugify","description","maxLength","toLowerCase","trim","replace","slice","generateSnapshotId","length","slug","Date","now","SNAPBACK_DIR","GLOBAL_SNAPBACK_DIR","WorkspaceConfigSchema","z","object","workspaceId","string","optional","tier","enum","protectionLevel","syncEnabled","boolean","createdAt","updatedAt","WorkspaceVitalsSchema","framework","frameworkConfidence","number","packageManager","typescript","enabled","strict","version","criticalFiles","array","detectedAt","ProtectedFileSchema","pattern","addedAt","reason","SessionStateSchema","task","startedAt","snapshotCount","filesModified","LearningEntrySchema","type","trigger","action","source","ViolationEntrySchema","file","message","count","date","prevention","GlobalCredentialsSchema","accessToken","refreshToken","email","expiresAt","GlobalConfigSchema","apiUrl","defaultWorkspace","analytics","getGlobalDir","join","homedir","getWorkspaceDir","workspaceRoot","process","cwd","getGlobalPath","relativePath","getWorkspacePath","createSnapbackDirectory","baseDir","dirs","dir","mkdir","recursive","gitignore","writeFile","createGlobalDirectory","isSnapbackInitialized","configPath","access","constants","F_OK","isLoggedIn","credentials","readGlobalJson","readSnapbackJson","content","readFile","JSON","parse","writeSnapbackJson","data","fullPath","dirname","stringify","appendSnapbackJsonl","appendFile","loadSnapbackJsonl","split","filter","line","map","writeGlobalJson","deleteGlobalJson","unlink","getWorkspaceConfig","result","safeParse","success","saveWorkspaceConfig","config","getWorkspaceVitals","saveWorkspaceVitals","vitals","getProtectedFiles","saveProtectedFiles","files","getCurrentSession","saveCurrentSession","session","endCurrentSession","recordLearning","learning","getLearnings","item","recordViolation","violation","getViolations","getCredentials","getCredentialsSecure","saveCredentials","saveCredentialsSecure","clearCredentials","clearCredentialsSecure","getGlobalConfig","saveGlobalConfig","findWorkspaceRoot","startDir","currentDir","maxDepth","depth","parentDir","pathExists","path","getStats","stats","stat","size","modifiedAt","mtime"],"mappings":"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","file":"chunk-7JX6Y4TL.js","sourcesContent":["import { nanoid } from \"nanoid\";\n/**\n * Generate a unique ID with optional prefix\n * @param prefix Optional prefix for the ID (e.g., 'user', 'session')\n * @returns Unique ID string\n */\nexport function generateId(prefix) {\n const id = nanoid();\n return prefix ? `${prefix}-${id}` : id;\n}\n/**\n * Slugify a description for use in snapshot IDs\n * Converts \"Before fixing auth flow\" to \"before-fixing-auth-flow\"\n */\nfunction slugify(description, maxLength = 30) {\n return description\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, \"\") // Remove non-alphanumeric\n .replace(/\\s+/g, \"-\") // Spaces to hyphens\n .replace(/-+/g, \"-\") // Collapse hyphens\n .replace(/^-|-$/g, \"\") // Trim hyphens\n .slice(0, maxLength);\n}\n/**\n * Generate a snapshot ID in the standard format\n * Format with description: snapshot-<slug>-<timestamp>-<random>\n * Format without: snapshot-<timestamp>-<random>\n * @param description Optional human-readable description\n * @returns Snapshot ID string\n */\nexport function generateSnapshotId(description) {\n if (description && description.length > 0) {\n const slug = slugify(description);\n if (slug.length > 0) {\n return `snapshot-${slug}-${Date.now()}-${nanoid(9)}`;\n }\n }\n return `snapshot-${Date.now()}-${nanoid(9)}`;\n}\n","/**\n * SnapBack Directory Service\n *\n * Manages .snapback/ workspace directory and ~/.snapback/ global directory.\n * This is the foundation for CLI commands that need persistent storage.\n *\n * Storage Architecture:\n * - ~/.snapback/ (GLOBAL) - credentials, user config, MCP configs\n * - .snapback/ (WORKSPACE) - patterns, learnings, session, snapshots\n *\n * @see implementation_plan.md Section 1.3\n */\n\nimport { access, appendFile, constants, mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { z } from \"zod\";\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst SNAPBACK_DIR = \".snapback\";\nconst GLOBAL_SNAPBACK_DIR = \".snapback\";\n\n// =============================================================================\n// ZOD SCHEMAS (Runtime validation)\n// =============================================================================\n\nexport const WorkspaceConfigSchema = z.object({\n\tworkspaceId: z.string().optional(),\n\ttier: z.enum([\"free\", \"pro\"]).optional(),\n\tprotectionLevel: z.enum([\"standard\", \"strict\"]).optional(),\n\tsyncEnabled: z.boolean().optional(),\n\tcreatedAt: z.string(),\n\tupdatedAt: z.string(),\n});\n\nexport const WorkspaceVitalsSchema = z.object({\n\tframework: z.string().optional(),\n\tframeworkConfidence: z.number().optional(),\n\tpackageManager: z.enum([\"npm\", \"pnpm\", \"yarn\", \"bun\"]).optional(),\n\ttypescript: z\n\t\t.object({\n\t\t\tenabled: z.boolean(),\n\t\t\tstrict: z.boolean().optional(),\n\t\t\tversion: z.string().optional(),\n\t\t})\n\t\t.optional(),\n\tcriticalFiles: z.array(z.string()).optional(),\n\tdetectedAt: z.string(),\n});\n\nexport const ProtectedFileSchema = z.object({\n\tpattern: z.string(),\n\taddedAt: z.string(),\n\treason: z.string().optional(),\n});\n\nexport const SessionStateSchema = z.object({\n\tid: z.string(),\n\ttask: z.string().optional(),\n\tstartedAt: z.string(),\n\tsnapshotCount: z.number(),\n\tfilesModified: z.number().optional(),\n});\n\nexport const LearningEntrySchema = z.object({\n\tid: z.string(),\n\ttype: z.enum([\"pattern\", \"pitfall\", \"efficiency\", \"discovery\", \"workflow\"]),\n\ttrigger: z.string(),\n\taction: z.string(),\n\tsource: z.string(),\n\tcreatedAt: z.string(),\n});\n\nexport const ViolationEntrySchema = z.object({\n\ttype: z.string(),\n\tfile: z.string(),\n\tmessage: z.string(),\n\tcount: z.number().optional(),\n\tdate: z.string(),\n\tprevention: z.string().optional(),\n});\n\nexport const GlobalCredentialsSchema = z.object({\n\taccessToken: z.string(),\n\trefreshToken: z.string().optional(),\n\temail: z.string(),\n\ttier: z.enum([\"free\", \"pro\"]),\n\texpiresAt: z.string().optional(),\n});\n\nexport const GlobalConfigSchema = z.object({\n\tapiUrl: z.string().optional(),\n\tdefaultWorkspace: z.string().optional(),\n\tanalytics: z.boolean().optional(),\n});\n\n// =============================================================================\n// TYPE DEFINITIONS (derived from schemas)\n// =============================================================================\n\nexport interface WorkspaceConfig {\n\tworkspaceId?: string;\n\ttier?: \"free\" | \"pro\";\n\t/**\n\t * CLI protection preset - user-friendly abstraction layer.\n\t *\n\t * Maps to canonical ProtectionLevel values (@snapback/contracts):\n\t * - \"standard\" → \"watch\" (auto-snapshot, warn on risky changes)\n\t * - \"strict\" → \"block\" (confirmation required, block high-risk)\n\t *\n\t * The CLI uses presets for better UX, while internal operations\n\t * use the canonical \"watch\" | \"warn\" | \"block\" values.\n\t */\n\tprotectionLevel?: \"standard\" | \"strict\";\n\tsyncEnabled?: boolean;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface WorkspaceVitals {\n\tframework?: string;\n\tframeworkConfidence?: number;\n\tpackageManager?: \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\ttypescript?: {\n\t\tenabled: boolean;\n\t\tstrict?: boolean;\n\t\tversion?: string;\n\t};\n\tcriticalFiles?: string[];\n\tdetectedAt: string;\n}\n\nexport interface ProtectedFile {\n\tpattern: string;\n\taddedAt: string;\n\treason?: string;\n}\n\nexport interface SessionState {\n\tid: string;\n\ttask?: string;\n\tstartedAt: string;\n\tsnapshotCount: number;\n\tfilesModified?: number;\n}\n\nexport interface LearningEntry {\n\tid: string;\n\ttype: \"pattern\" | \"pitfall\" | \"efficiency\" | \"discovery\" | \"workflow\";\n\ttrigger: string;\n\taction: string;\n\tsource: string;\n\tcreatedAt: string;\n}\n\nexport interface ViolationEntry {\n\ttype: string;\n\tfile: string;\n\tmessage: string;\n\tcount?: number;\n\tdate: string;\n\tprevention?: string;\n}\n\nexport interface GlobalCredentials {\n\taccessToken: string;\n\trefreshToken?: string;\n\temail: string;\n\ttier: \"free\" | \"pro\";\n\texpiresAt?: string;\n}\n\nexport interface GlobalConfig {\n\tapiUrl?: string;\n\tdefaultWorkspace?: string;\n\tanalytics?: boolean;\n}\n\n// =============================================================================\n// PATH HELPERS\n// =============================================================================\n\n/**\n * Get global snapback directory path (~/.snapback/)\n */\nexport function getGlobalDir(): string {\n\treturn join(homedir(), GLOBAL_SNAPBACK_DIR);\n}\n\n/**\n * Get workspace snapback directory path\n */\nexport function getWorkspaceDir(workspaceRoot?: string): string {\n\treturn join(workspaceRoot || process.cwd(), SNAPBACK_DIR);\n}\n\n/**\n * Get path to a file in the global directory\n */\nexport function getGlobalPath(relativePath: string): string {\n\treturn join(getGlobalDir(), relativePath);\n}\n\n/**\n * Get path to a file in the workspace directory\n */\nexport function getWorkspacePath(relativePath: string, workspaceRoot?: string): string {\n\treturn join(getWorkspaceDir(workspaceRoot), relativePath);\n}\n\n// =============================================================================\n// DIRECTORY MANAGEMENT\n// =============================================================================\n\n/**\n * Create the .snapback/ directory structure in a workspace\n * Mirrors the structure expected by MCP server (context-tools.ts)\n */\nexport async function createSnapbackDirectory(workspaceRoot?: string): Promise<void> {\n\tconst baseDir = getWorkspaceDir(workspaceRoot);\n\n\tconst dirs = [\"\", \"patterns\", \"learnings\", \"session\", \"snapshots\"];\n\n\tfor (const dir of dirs) {\n\t\tawait mkdir(join(baseDir, dir), { recursive: true });\n\t}\n\n\t// Create .gitignore to exclude snapshots but keep patterns\n\tconst gitignore = `# SnapBack Directory\n# Ignore snapshot content (large binary data)\nsnapshots/\nembeddings.db\n\n# Keep these for team sharing\n!patterns/\n!learnings/\n!vitals.json\n!config.json\n!protected.json\n`.trim();\n\n\tawait writeFile(join(baseDir, \".gitignore\"), gitignore);\n}\n\n/**\n * Create the global ~/.snapback/ directory structure\n */\nexport async function createGlobalDirectory(): Promise<void> {\n\tconst baseDir = getGlobalDir();\n\n\tconst dirs = [\"\", \"cache\", \"mcp-configs\"];\n\n\tfor (const dir of dirs) {\n\t\tawait mkdir(join(baseDir, dir), { recursive: true });\n\t}\n}\n\n/**\n * Check if .snapback/ directory exists in workspace\n */\nexport async function isSnapbackInitialized(workspaceRoot?: string): Promise<boolean> {\n\ttry {\n\t\tconst configPath = getWorkspacePath(\"config.json\", workspaceRoot);\n\t\tawait access(configPath, constants.F_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Check if user is logged in (has credentials)\n */\nexport async function isLoggedIn(): Promise<boolean> {\n\ttry {\n\t\tconst credentials = await readGlobalJson<GlobalCredentials>(\"credentials.json\");\n\t\tif (!credentials?.accessToken) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if token is expired\n\t\tif (credentials.expiresAt) {\n\t\t\tconst expiresAt = new Date(credentials.expiresAt);\n\t\t\tif (expiresAt < new Date()) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n// =============================================================================\n// JSON FILE OPERATIONS - WORKSPACE\n// =============================================================================\n\n/**\n * Read JSON file from .snapback/\n */\nexport async function readSnapbackJson<T>(relativePath: string, workspaceRoot?: string): Promise<T | null> {\n\ttry {\n\t\tconst content = await readFile(getWorkspacePath(relativePath, workspaceRoot), \"utf-8\");\n\t\treturn JSON.parse(content) as T;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write JSON file to .snapback/\n */\nexport async function writeSnapbackJson<T>(relativePath: string, data: T, workspaceRoot?: string): Promise<void> {\n\tconst fullPath = getWorkspacePath(relativePath, workspaceRoot);\n\tawait mkdir(dirname(fullPath), { recursive: true });\n\tawait writeFile(fullPath, JSON.stringify(data, null, 2));\n}\n\n/**\n * Append to JSONL file in .snapback/\n */\nexport async function appendSnapbackJsonl<T extends object>(\n\trelativePath: string,\n\tdata: T,\n\tworkspaceRoot?: string,\n): Promise<void> {\n\tconst fullPath = getWorkspacePath(relativePath, workspaceRoot);\n\tawait mkdir(dirname(fullPath), { recursive: true });\n\tawait appendFile(fullPath, `${JSON.stringify(data)}\\n`);\n}\n\n/**\n * Load JSONL file from .snapback/\n */\nexport async function loadSnapbackJsonl<T>(relativePath: string, workspaceRoot?: string): Promise<T[]> {\n\ttry {\n\t\tconst content = await readFile(getWorkspacePath(relativePath, workspaceRoot), \"utf-8\");\n\t\treturn content\n\t\t\t.split(\"\\n\")\n\t\t\t.filter((line) => line.trim())\n\t\t\t.map((line) => JSON.parse(line) as T);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\n// =============================================================================\n// JSON FILE OPERATIONS - GLOBAL\n// =============================================================================\n\n/**\n * Read JSON file from ~/.snapback/\n */\nexport async function readGlobalJson<T>(relativePath: string): Promise<T | null> {\n\ttry {\n\t\tconst content = await readFile(getGlobalPath(relativePath), \"utf-8\");\n\t\treturn JSON.parse(content) as T;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write JSON file to ~/.snapback/\n */\nexport async function writeGlobalJson<T>(relativePath: string, data: T): Promise<void> {\n\tconst fullPath = getGlobalPath(relativePath);\n\tawait mkdir(dirname(fullPath), { recursive: true });\n\tawait writeFile(fullPath, JSON.stringify(data, null, 2));\n}\n\n/**\n * Delete JSON file from ~/.snapback/\n */\nexport async function deleteGlobalJson(relativePath: string): Promise<void> {\n\tconst fullPath = getGlobalPath(relativePath);\n\ttry {\n\t\tconst { unlink } = await import(\"node:fs/promises\");\n\t\tawait unlink(fullPath);\n\t} catch {\n\t\t// File doesn't exist, that's fine\n\t}\n}\n\n// =============================================================================\n// TYPED ACCESSORS\n// =============================================================================\n\n/**\n * Get workspace configuration with Zod validation\n */\nexport async function getWorkspaceConfig(workspaceRoot?: string): Promise<WorkspaceConfig | null> {\n\tconst data = await readSnapbackJson<unknown>(\"config.json\", workspaceRoot);\n\tif (!data) return null;\n\tconst result = WorkspaceConfigSchema.safeParse(data);\n\treturn result.success ? result.data : null;\n}\n\n/**\n * Save workspace configuration\n */\nexport async function saveWorkspaceConfig(config: WorkspaceConfig, workspaceRoot?: string): Promise<void> {\n\tawait writeSnapbackJson(\"config.json\", config, workspaceRoot);\n}\n\n/**\n * Get workspace vitals with Zod validation\n */\nexport async function getWorkspaceVitals(workspaceRoot?: string): Promise<WorkspaceVitals | null> {\n\tconst data = await readSnapbackJson<unknown>(\"vitals.json\", workspaceRoot);\n\tif (!data) return null;\n\tconst result = WorkspaceVitalsSchema.safeParse(data);\n\treturn result.success ? result.data : null;\n}\n\n/**\n * Save workspace vitals\n */\nexport async function saveWorkspaceVitals(vitals: WorkspaceVitals, workspaceRoot?: string): Promise<void> {\n\tawait writeSnapbackJson(\"vitals.json\", vitals, workspaceRoot);\n}\n\n/**\n * Get protected files list with Zod validation\n */\nexport async function getProtectedFiles(workspaceRoot?: string): Promise<ProtectedFile[]> {\n\tconst data = await readSnapbackJson<unknown[]>(\"protected.json\", workspaceRoot);\n\tif (!data) return [];\n\tconst result = z.array(ProtectedFileSchema).safeParse(data);\n\treturn result.success ? result.data : [];\n}\n\n/**\n * Save protected files list\n */\nexport async function saveProtectedFiles(files: ProtectedFile[], workspaceRoot?: string): Promise<void> {\n\tawait writeSnapbackJson(\"protected.json\", files, workspaceRoot);\n}\n\n/**\n * Get current session state with Zod validation\n */\nexport async function getCurrentSession(workspaceRoot?: string): Promise<SessionState | null> {\n\tconst data = await readSnapbackJson<unknown>(\"session/current.json\", workspaceRoot);\n\tif (!data) return null;\n\tconst result = SessionStateSchema.safeParse(data);\n\treturn result.success ? result.data : null;\n}\n\n/**\n * Save current session state\n */\nexport async function saveCurrentSession(session: SessionState, workspaceRoot?: string): Promise<void> {\n\tawait writeSnapbackJson(\"session/current.json\", session, workspaceRoot);\n}\n\n/**\n * End current session (delete current.json)\n */\nexport async function endCurrentSession(workspaceRoot?: string): Promise<void> {\n\tconst fullPath = getWorkspacePath(\"session/current.json\", workspaceRoot);\n\ttry {\n\t\tconst { unlink } = await import(\"node:fs/promises\");\n\t\tawait unlink(fullPath);\n\t} catch {\n\t\t// File doesn't exist, that's fine\n\t}\n}\n\n/**\n * Record a learning\n */\nexport async function recordLearning(learning: LearningEntry, workspaceRoot?: string): Promise<void> {\n\tawait appendSnapbackJsonl(\"learnings/user-learnings.jsonl\", learning, workspaceRoot);\n}\n\n/**\n * Get all learnings with Zod validation\n */\nexport async function getLearnings(workspaceRoot?: string): Promise<LearningEntry[]> {\n\tconst data = await loadSnapbackJsonl<unknown>(\"learnings/user-learnings.jsonl\", workspaceRoot);\n\treturn data.filter((item): item is LearningEntry => LearningEntrySchema.safeParse(item).success);\n}\n\n/**\n * Record a violation\n */\nexport async function recordViolation(violation: ViolationEntry, workspaceRoot?: string): Promise<void> {\n\tawait appendSnapbackJsonl(\"patterns/violations.jsonl\", violation, workspaceRoot);\n}\n\n/**\n * Get all violations with Zod validation\n */\nexport async function getViolations(workspaceRoot?: string): Promise<ViolationEntry[]> {\n\tconst data = await loadSnapbackJsonl<unknown>(\"patterns/violations.jsonl\", workspaceRoot);\n\treturn data.filter((item): item is ViolationEntry => ViolationEntrySchema.safeParse(item).success);\n}\n\n/**\n * Get credentials\n * @deprecated Use getCredentialsSecure from secure-credentials.ts for production\n */\nexport async function getCredentials(): Promise<GlobalCredentials | null> {\n\t// Try secure credentials first, fall back to legacy\n\ttry {\n\t\tconst { getCredentialsSecure } = await import(\"./secure-credentials\");\n\t\treturn await getCredentialsSecure();\n\t} catch {\n\t\t// Fallback to legacy plain text (development mode)\n\t\treturn readGlobalJson<GlobalCredentials>(\"credentials.json\");\n\t}\n}\n\n/**\n * Save credentials\n * @deprecated Use saveCredentialsSecure from secure-credentials.ts for production\n */\nexport async function saveCredentials(credentials: GlobalCredentials): Promise<void> {\n\t// Try secure credentials first, fall back to legacy\n\ttry {\n\t\tconst { saveCredentialsSecure } = await import(\"./secure-credentials\");\n\t\treturn await saveCredentialsSecure(credentials);\n\t} catch {\n\t\t// Fallback to legacy plain text (development mode)\n\t\tawait createGlobalDirectory();\n\t\tawait writeGlobalJson(\"credentials.json\", credentials);\n\t}\n}\n\n/**\n * Clear credentials (logout)\n * @deprecated Use clearCredentialsSecure from secure-credentials.ts for production\n */\nexport async function clearCredentials(): Promise<void> {\n\t// Try secure credentials first, fall back to legacy\n\ttry {\n\t\tconst { clearCredentialsSecure } = await import(\"./secure-credentials\");\n\t\treturn await clearCredentialsSecure();\n\t} catch {\n\t\t// Fallback to legacy plain text (development mode)\n\t\tawait deleteGlobalJson(\"credentials.json\");\n\t}\n}\n\n/**\n * Get global config with Zod validation\n */\nexport async function getGlobalConfig(): Promise<GlobalConfig | null> {\n\tconst data = await readGlobalJson<unknown>(\"config.json\");\n\tif (!data) return null;\n\tconst result = GlobalConfigSchema.safeParse(data);\n\treturn result.success ? result.data : null;\n}\n\n/**\n * Save global config\n */\nexport async function saveGlobalConfig(config: GlobalConfig): Promise<void> {\n\tawait createGlobalDirectory();\n\tawait writeGlobalJson(\"config.json\", config);\n}\n\n// =============================================================================\n// UTILITY FUNCTIONS\n// =============================================================================\n\n// Re-export generateId from @snapback/contracts for backwards compatibility\nexport { generateId } from \"@snapback/contracts/id-generator\";\n\n/**\n * Get workspace root by searching for .snapback/ or package.json\n */\nexport async function findWorkspaceRoot(startDir?: string): Promise<string | null> {\n\tlet currentDir = startDir || process.cwd();\n\n\t// Limit search depth to prevent infinite loops\n\tconst maxDepth = 10;\n\tlet depth = 0;\n\n\twhile (depth < maxDepth) {\n\t\t// Check for .snapback directory\n\t\ttry {\n\t\t\tawait access(join(currentDir, SNAPBACK_DIR), constants.F_OK);\n\t\t\treturn currentDir;\n\t\t} catch {\n\t\t\t// Not found, continue\n\t\t}\n\n\t\t// Check for package.json (workspace root indicator)\n\t\ttry {\n\t\t\tawait access(join(currentDir, \"package.json\"), constants.F_OK);\n\t\t\treturn currentDir;\n\t\t} catch {\n\t\t\t// Not found, continue\n\t\t}\n\n\t\t// Move up one directory\n\t\tconst parentDir = dirname(currentDir);\n\t\tif (parentDir === currentDir) {\n\t\t\t// Reached root\n\t\t\tbreak;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t\tdepth++;\n\t}\n\n\treturn null;\n}\n\n/**\n * Check if a path exists\n */\nexport async function pathExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get file stats\n */\nexport async function getStats(path: string): Promise<{ size: number; modifiedAt: Date } | null> {\n\ttry {\n\t\tconst stats = await stat(path);\n\t\treturn {\n\t\t\tsize: stats.size,\n\t\t\tmodifiedAt: stats.mtime,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { __name } from './chunk-
|
|
1
|
+
#!/usr/bin/env node --no-warnings=ExperimentalWarning
|
|
2
|
+
import { __name } from './chunk-RB7H4UQJ.js';
|
|
3
3
|
import * as eslintParser from '@typescript-eslint/parser';
|
|
4
4
|
import { parse } from '@babel/parser';
|
|
5
5
|
import traverse from '@babel/traverse';
|
|
@@ -24,7 +24,9 @@ var SyntaxAnalyzer = class {
|
|
|
24
24
|
let nodesVisited = 0;
|
|
25
25
|
const parseErrors = [];
|
|
26
26
|
for (const [file, content] of context.contents) {
|
|
27
|
-
if (!this.shouldAnalyzeFile(file))
|
|
27
|
+
if (!this.shouldAnalyzeFile(file)) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
28
30
|
filesAnalyzed++;
|
|
29
31
|
try {
|
|
30
32
|
const ast = eslintParser.parse(content, {
|
|
@@ -107,7 +109,9 @@ var SyntaxAnalyzer = class {
|
|
|
107
109
|
* Count AST nodes for coverage metrics
|
|
108
110
|
*/
|
|
109
111
|
countNodes(node) {
|
|
110
|
-
if (!node || typeof node !== "object")
|
|
112
|
+
if (!node || typeof node !== "object") {
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
111
115
|
let count = 1;
|
|
112
116
|
for (const key of Object.keys(node)) {
|
|
113
117
|
const value = node[key];
|
|
@@ -213,7 +217,9 @@ var CompletenessAnalyzer = class {
|
|
|
213
217
|
let nodesVisited = 0;
|
|
214
218
|
const parseErrors = [];
|
|
215
219
|
for (const [file, content] of context.contents) {
|
|
216
|
-
if (!this.shouldAnalyzeFile(file))
|
|
220
|
+
if (!this.shouldAnalyzeFile(file)) {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
217
223
|
filesAnalyzed++;
|
|
218
224
|
this.checkTodoComments(content, file, issues);
|
|
219
225
|
this.checkPlaceholderPatterns(content, file, issues);
|
|
@@ -380,12 +386,18 @@ var CompletenessAnalyzer = class {
|
|
|
380
386
|
}, "FunctionDeclaration"),
|
|
381
387
|
// Empty method bodies
|
|
382
388
|
ClassMethod: /* @__PURE__ */ __name((path) => {
|
|
383
|
-
if (path.node.abstract)
|
|
384
|
-
|
|
389
|
+
if (path.node.abstract) {
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
if (path.node.kind === "get" || path.node.kind === "set") {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
385
395
|
const body = path.node.body;
|
|
386
396
|
if (body && body.body.length === 0) {
|
|
387
397
|
const methodName = path.node.key.type === "Identifier" ? path.node.key.name : "anonymous";
|
|
388
|
-
if (methodName === "constructor")
|
|
398
|
+
if (methodName === "constructor") {
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
389
401
|
issues.push({
|
|
390
402
|
id: `completeness/empty-method/${file}/${path.node.loc?.start.line}`,
|
|
391
403
|
severity: "medium",
|
|
@@ -931,7 +943,9 @@ var SecurityAnalyzer = class {
|
|
|
931
943
|
let nodesVisited = 0;
|
|
932
944
|
const parseErrors = [];
|
|
933
945
|
for (const [file, content] of context.contents) {
|
|
934
|
-
if (!this.shouldAnalyzeFile(file))
|
|
946
|
+
if (!this.shouldAnalyzeFile(file)) {
|
|
947
|
+
continue;
|
|
948
|
+
}
|
|
935
949
|
filesAnalyzed++;
|
|
936
950
|
try {
|
|
937
951
|
const ast = parse(content, {
|
|
@@ -1189,22 +1203,34 @@ var SecurityAnalyzer = class {
|
|
|
1189
1203
|
* Check if expression is a static string (safe)
|
|
1190
1204
|
*/
|
|
1191
1205
|
isStaticString(node) {
|
|
1192
|
-
if (node.type === "StringLiteral")
|
|
1193
|
-
|
|
1206
|
+
if (node.type === "StringLiteral") {
|
|
1207
|
+
return true;
|
|
1208
|
+
}
|
|
1209
|
+
if (node.type === "TemplateLiteral" && node.expressions.length === 0) {
|
|
1210
|
+
return true;
|
|
1211
|
+
}
|
|
1194
1212
|
return false;
|
|
1195
1213
|
}
|
|
1196
1214
|
/**
|
|
1197
1215
|
* Check if expression is a static path (safe)
|
|
1198
1216
|
*/
|
|
1199
1217
|
isStaticPath(node) {
|
|
1200
|
-
if (node.type === "StringLiteral")
|
|
1201
|
-
|
|
1218
|
+
if (node.type === "StringLiteral") {
|
|
1219
|
+
return true;
|
|
1220
|
+
}
|
|
1221
|
+
if (node.type === "TemplateLiteral" && node.expressions.length === 0) {
|
|
1222
|
+
return true;
|
|
1223
|
+
}
|
|
1202
1224
|
if (node.type === "CallExpression") {
|
|
1203
1225
|
const callee = node.callee;
|
|
1204
1226
|
if (callee.type === "MemberExpression" && callee.object.type === "Identifier" && callee.object.name === "path" && callee.property.type === "Identifier" && callee.property.name === "join") {
|
|
1205
1227
|
return node.arguments.every((arg) => {
|
|
1206
|
-
if (arg.type === "StringLiteral")
|
|
1207
|
-
|
|
1228
|
+
if (arg.type === "StringLiteral") {
|
|
1229
|
+
return true;
|
|
1230
|
+
}
|
|
1231
|
+
if (arg.type === "Identifier" && (arg.name === "__dirname" || arg.name === "__filename")) {
|
|
1232
|
+
return true;
|
|
1233
|
+
}
|
|
1208
1234
|
return false;
|
|
1209
1235
|
});
|
|
1210
1236
|
}
|
|
@@ -1350,7 +1376,7 @@ async function runStaticAnalysis(files, _workspaceRoot, options = {}) {
|
|
|
1350
1376
|
};
|
|
1351
1377
|
if (!options.skipTestDetection) {
|
|
1352
1378
|
try {
|
|
1353
|
-
const { analyzeSkippedTests: analyzeSkippedTests2 } = await import('./SkippedTestDetector-
|
|
1379
|
+
const { analyzeSkippedTests: analyzeSkippedTests2 } = await import('./SkippedTestDetector-5WJZKZQ3.js');
|
|
1354
1380
|
const testResults = analyzeSkippedTests2(files);
|
|
1355
1381
|
for (const testResult of testResults) {
|
|
1356
1382
|
if (!testResult.parsed && testResult.error) {
|
|
@@ -1377,5 +1403,5 @@ async function runStaticAnalysis(files, _workspaceRoot, options = {}) {
|
|
|
1377
1403
|
__name(runStaticAnalysis, "runStaticAnalysis");
|
|
1378
1404
|
|
|
1379
1405
|
export { ChangeImpactAnalyzer, CompletenessAnalyzer, SecurityAnalyzer, SyntaxAnalyzer, checkFilesForOrphanStatus, createChangeImpactAnalyzer, detectOrphans, filterOrphansToFiles, runStaticAnalysis };
|
|
1380
|
-
//# sourceMappingURL=chunk-
|
|
1381
|
-
//# sourceMappingURL=chunk-
|
|
1406
|
+
//# sourceMappingURL=chunk-ARVV3F4K.js.map
|
|
1407
|
+
//# sourceMappingURL=chunk-ARVV3F4K.js.map
|