@snapback/cli 1.1.14 → 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.
Files changed (45) hide show
  1. package/dist/SkippedTestDetector-5WJZKZQ3.js +5 -0
  2. package/dist/{SkippedTestDetector-B3JZUE5G.js.map → SkippedTestDetector-5WJZKZQ3.js.map} +1 -1
  3. package/dist/{analysis-C6XVLBAL.js → analysis-YI4UNUCM.js} +6 -6
  4. package/dist/{analysis-C6XVLBAL.js.map → analysis-YI4UNUCM.js.map} +1 -1
  5. package/dist/{chunk-Q5XZ3DCB.js → chunk-7JX6Y4TL.js} +135 -15
  6. package/dist/chunk-7JX6Y4TL.js.map +1 -0
  7. package/dist/{chunk-OJNDAPC2.js → chunk-ARVV3F4K.js} +5 -5
  8. package/dist/{chunk-OJNDAPC2.js.map → chunk-ARVV3F4K.js.map} +1 -1
  9. package/dist/{chunk-A3TUM7U4.js → chunk-EU2IZPOK.js} +4 -4
  10. package/dist/{chunk-A3TUM7U4.js.map → chunk-EU2IZPOK.js.map} +1 -1
  11. package/dist/{chunk-QAKFE3NE.js → chunk-FVIYXFCL.js} +4 -4
  12. package/dist/{chunk-QAKFE3NE.js.map → chunk-FVIYXFCL.js.map} +1 -1
  13. package/dist/{chunk-2TOJVUVJ.js → chunk-R7CUQ7CU.js} +4 -4
  14. package/dist/{chunk-2TOJVUVJ.js.map → chunk-R7CUQ7CU.js.map} +1 -1
  15. package/dist/{chunk-BW7RALUZ.js → chunk-RB7H4UQJ.js} +3 -3
  16. package/dist/{chunk-BW7RALUZ.js.map → chunk-RB7H4UQJ.js.map} +1 -1
  17. package/dist/{chunk-5EQLSU5B.js → chunk-SOABQWAU.js} +5 -5
  18. package/dist/{chunk-5EQLSU5B.js.map → chunk-SOABQWAU.js.map} +1 -1
  19. package/dist/{dist-RPM72FHJ.js → dist-O6EBXLN6.js} +5 -5
  20. package/dist/{dist-D2SHOZMS.js.map → dist-O6EBXLN6.js.map} +1 -1
  21. package/dist/{dist-L76VXYJ5.js → dist-PJVBBZTF.js} +5 -5
  22. package/dist/{dist-L76VXYJ5.js.map → dist-PJVBBZTF.js.map} +1 -1
  23. package/dist/index.js +7737 -7966
  24. package/dist/index.js.map +1 -1
  25. package/dist/learning-pruner-QC4CTJDX.js +5 -0
  26. package/dist/{learning-pruner-YSZSOOOC.js.map → learning-pruner-QC4CTJDX.js.map} +1 -1
  27. package/dist/{secure-credentials-A4QHHOE2.js → secure-credentials-IWQB6KU4.js} +4 -4
  28. package/dist/{secure-credentials-A4QHHOE2.js.map → secure-credentials-IWQB6KU4.js.map} +1 -1
  29. package/dist/snapback-dir-V6MWXIW4.js +5 -0
  30. package/dist/{snapback-dir-6QUSO6Y3.js.map → snapback-dir-V6MWXIW4.js.map} +1 -1
  31. package/package.json +6 -40
  32. package/dist/SkippedTestDetector-B3JZUE5G.js +0 -5
  33. package/dist/chunk-6MR2TINI.js +0 -27
  34. package/dist/chunk-6MR2TINI.js.map +0 -1
  35. package/dist/chunk-LEXNOXPV.js +0 -21621
  36. package/dist/chunk-LEXNOXPV.js.map +0 -1
  37. package/dist/chunk-Q5XZ3DCB.js.map +0 -1
  38. package/dist/chunk-QLCHTUT5.js +0 -1067
  39. package/dist/chunk-QLCHTUT5.js.map +0 -1
  40. package/dist/dist-D2SHOZMS.js +0 -8
  41. package/dist/dist-RPM72FHJ.js.map +0 -1
  42. package/dist/learning-pruner-YSZSOOOC.js +0 -7
  43. package/dist/snapback-dir-6QUSO6Y3.js +0 -6
  44. package/dist/storage-H366UNAR.js +0 -6
  45. package/dist/storage-H366UNAR.js.map +0 -1
@@ -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-B3JZUE5G.js"}
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-OJNDAPC2.js';
3
- export { analyzeSkippedTests, detectSkippedTests, getSkippedTestSummary } from './chunk-QAKFE3NE.js';
4
- import './chunk-BW7RALUZ.js';
5
- //# sourceMappingURL=analysis-C6XVLBAL.js.map
6
- //# sourceMappingURL=analysis-C6XVLBAL.js.map
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-C6XVLBAL.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"analysis-YI4UNUCM.js"}
@@ -1,11 +1,114 @@
1
- #!/usr/bin/env node
2
- import { __name } from './chunk-BW7RALUZ.js';
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
- return readSnapbackJson("config.json", workspaceRoot);
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
- return readSnapbackJson("vitals.json", workspaceRoot);
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
- return await readSnapbackJson("protected.json", workspaceRoot) ?? [];
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
- return readSnapbackJson("session/current.json", workspaceRoot);
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
- return loadSnapbackJsonl("learnings/user-learnings.jsonl", workspaceRoot);
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
- return loadSnapbackJsonl("patterns/violations.jsonl", workspaceRoot);
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-A4QHHOE2.js');
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-A4QHHOE2.js');
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-A4QHHOE2.js');
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
- return readGlobalJson("config.json");
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-Q5XZ3DCB.js.map
300
- //# sourceMappingURL=chunk-Q5XZ3DCB.js.map
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-BW7RALUZ.js';
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';
@@ -1376,7 +1376,7 @@ async function runStaticAnalysis(files, _workspaceRoot, options = {}) {
1376
1376
  };
1377
1377
  if (!options.skipTestDetection) {
1378
1378
  try {
1379
- const { analyzeSkippedTests: analyzeSkippedTests2 } = await import('./SkippedTestDetector-B3JZUE5G.js');
1379
+ const { analyzeSkippedTests: analyzeSkippedTests2 } = await import('./SkippedTestDetector-5WJZKZQ3.js');
1380
1380
  const testResults = analyzeSkippedTests2(files);
1381
1381
  for (const testResult of testResults) {
1382
1382
  if (!testResult.parsed && testResult.error) {
@@ -1403,5 +1403,5 @@ async function runStaticAnalysis(files, _workspaceRoot, options = {}) {
1403
1403
  __name(runStaticAnalysis, "runStaticAnalysis");
1404
1404
 
1405
1405
  export { ChangeImpactAnalyzer, CompletenessAnalyzer, SecurityAnalyzer, SyntaxAnalyzer, checkFilesForOrphanStatus, createChangeImpactAnalyzer, detectOrphans, filterOrphansToFiles, runStaticAnalysis };
1406
- //# sourceMappingURL=chunk-OJNDAPC2.js.map
1407
- //# sourceMappingURL=chunk-OJNDAPC2.js.map
1406
+ //# sourceMappingURL=chunk-ARVV3F4K.js.map
1407
+ //# sourceMappingURL=chunk-ARVV3F4K.js.map