@snapback/cli 1.0.11 → 1.1.14

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 (41) hide show
  1. package/README.md +9 -9
  2. package/dist/{analysis-Z53F5FT2.js → analysis-C6XVLBAL.js} +3 -3
  3. package/dist/{analysis-Z53F5FT2.js.map → analysis-C6XVLBAL.js.map} +1 -1
  4. package/dist/{chunk-SVJ67PPQ.js → chunk-2TOJVUVJ.js} +296 -33
  5. package/dist/chunk-2TOJVUVJ.js.map +1 -0
  6. package/dist/chunk-5EQLSU5B.js +385 -0
  7. package/dist/chunk-5EQLSU5B.js.map +1 -0
  8. package/dist/{chunk-YOVA65PS.js → chunk-A3TUM7U4.js} +320 -63
  9. package/dist/chunk-A3TUM7U4.js.map +1 -0
  10. package/dist/{chunk-ISVRGBWT.js → chunk-LEXNOXPV.js} +6030 -632
  11. package/dist/chunk-LEXNOXPV.js.map +1 -0
  12. package/dist/{chunk-G7QXHNGB.js → chunk-OJNDAPC2.js} +41 -15
  13. package/dist/chunk-OJNDAPC2.js.map +1 -0
  14. package/dist/{chunk-NKBZIXCN.js → chunk-Q5XZ3DCB.js} +5 -5
  15. package/dist/{chunk-NKBZIXCN.js.map → chunk-Q5XZ3DCB.js.map} +1 -1
  16. package/dist/chunk-QLCHTUT5.js +1067 -0
  17. package/dist/chunk-QLCHTUT5.js.map +1 -0
  18. package/dist/dist-D2SHOZMS.js +8 -0
  19. package/dist/{dist-7UKXVKH3.js.map → dist-D2SHOZMS.js.map} +1 -1
  20. package/dist/{dist-7UKXVKH3.js → dist-L76VXYJ5.js} +3 -3
  21. package/dist/{dist-QFS5YG5L.js.map → dist-L76VXYJ5.js.map} +1 -1
  22. package/dist/dist-RPM72FHJ.js +5 -0
  23. package/dist/{dist-WKLJSPJT.js.map → dist-RPM72FHJ.js.map} +1 -1
  24. package/dist/index.js +30953 -15593
  25. package/dist/index.js.map +1 -1
  26. package/dist/learning-pruner-YSZSOOOC.js +7 -0
  27. package/dist/learning-pruner-YSZSOOOC.js.map +1 -0
  28. package/dist/{secure-credentials-6UMEU22H.js → secure-credentials-A4QHHOE2.js} +14 -6
  29. package/dist/secure-credentials-A4QHHOE2.js.map +1 -0
  30. package/dist/{snapback-dir-T3CRQRY6.js → snapback-dir-6QUSO6Y3.js} +3 -3
  31. package/dist/{snapback-dir-T3CRQRY6.js.map → snapback-dir-6QUSO6Y3.js.map} +1 -1
  32. package/dist/storage-H366UNAR.js +6 -0
  33. package/dist/storage-H366UNAR.js.map +1 -0
  34. package/package.json +8 -9
  35. package/dist/chunk-G7QXHNGB.js.map +0 -1
  36. package/dist/chunk-ISVRGBWT.js.map +0 -1
  37. package/dist/chunk-SVJ67PPQ.js.map +0 -1
  38. package/dist/chunk-YOVA65PS.js.map +0 -1
  39. package/dist/dist-QFS5YG5L.js +0 -5
  40. package/dist/dist-WKLJSPJT.js +0 -8
  41. package/dist/secure-credentials-6UMEU22H.js.map +0 -1
@@ -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)) continue;
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") return 0;
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)) continue;
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) return;
384
- if (path.node.kind === "get" || path.node.kind === "set") return;
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") return;
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)) continue;
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") return true;
1193
- if (node.type === "TemplateLiteral" && node.expressions.length === 0) return true;
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") return true;
1201
- if (node.type === "TemplateLiteral" && node.expressions.length === 0) return true;
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") return true;
1207
- if (arg.type === "Identifier" && (arg.name === "__dirname" || arg.name === "__filename")) return true;
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
  }
@@ -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-G7QXHNGB.js.map
1381
- //# sourceMappingURL=chunk-G7QXHNGB.js.map
1406
+ //# sourceMappingURL=chunk-OJNDAPC2.js.map
1407
+ //# sourceMappingURL=chunk-OJNDAPC2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/core/dist/analysis/ast/SyntaxAnalyzer.js","../../../packages/core/dist/analysis/completeness/CompletenessAnalyzer.js","../../../packages/core/dist/analysis/impact/ChangeImpactAnalyzer.js","../../../packages/core/dist/analysis/security/SecurityAnalyzer.js","../../../packages/core/dist/analysis/static/OrphanDetector.js","../../../packages/core/dist/analysis/static/index.js"],"names":["SyntaxAnalyzer","id","name","filePatterns","analyze","context","startTime","performance","now","issues","filesAnalyzed","nodesVisited","parseErrors","file","content","contents","shouldAnalyzeFile","ast","parse","sourceType","ecmaFeatures","jsx","endsWith","ecmaVersion","errorOnUnknownASTType","countNodes","checkSyntaxPatterns","error","parseError","extractParseError","push","message","line","severity","type","column","fix","analyzer","success","coverage","Math","max","files","length","duration","metadata","shouldRun","some","f","ext","split","pop","toLowerCase","includes","Error","match","Number","parseInt","String","node","count","key","Object","keys","value","Array","isArray","item","lines","i","lineNum","indexOf","snippet","trim","test","assignMatch","CompletenessAnalyzer","todoPatterns","placeholderPatterns","parserOptions","plugins","errorRecovery","checkTodoComments","checkPlaceholderPatterns","getPluginsForFile","result","analyzeAST","patternsChecked","pattern","lastIndex","todoContent","slice","_content","traverse","enter","CatchClause","path","body","loc","start","stmt","FunctionDeclaration","funcName","ClassMethod","abstract","kind","methodName","ArrowFunctionExpression","parent","varName","CallExpression","callee","object","property","firstArg","arguments","msg","EXPORT_PATTERNS","PERFORMANCE_PATTERNS","risk","TEST_FILE_PATTERNS","ChangeImpactAnalyzer","workspaceRoot","dependencyGraph","Map","reverseDependencyGraph","p","RegExp","replace","Date","buildDependencyGraph","get","breakingChanges","detectBreakingChanges","bc","symbol","toUpperCase","description","migration","perfImpacts","detectPerformanceImpacts","pi","component","recommendation","affectedTests","findAffectedTests","getFullImpact","performanceImpacts","dependentFiles","recommendations","tests","breaks","perfs","deps","findDependentFiles","impactScore","calculateImpactScore","dedupeItems","clear","imports","extractImports","set","imp","existing","fromFile","importRegex","requireRegex","exec","importPath","resolveImportPath","startsWith","dir","dirname","extensions","resolved","relPath","relative","fileName","basename","directTestPatterns","reason","level","importers","importer","isTestFile","regex","source","flags","symbolName","interfaceRegex","interfaceName","impacts","getPerformanceRecommendation","dependents","visited","Set","current","depth","has","add","score","min","filter","items","seen","createChangeImpactAnalyzer","SecurityAnalyzer","fileIssues","fileContext","isDaemon","hasSignalHandler","isStaticString","MemberExpression","parentPath","isCallExpression","pathMethods","isStaticPath","NewExpression","JSXAttribute","VariableDeclarator","init","checkForHardcodedSecret","ClassProperty","Program","exit","expressions","every","arg","secretIndicators","s","valueStr","DEFAULT_OPTIONS","fileExtensions","excludePatterns","detectOrphans","entryPoint","options","mergedOptions","madgeModule","madge","default","excludeRegExp","map","regexPattern","tsConfig","tsConfigPath","detectiveOptions","ts","skipTypeImports","orphans","allFiles","obj","totalFiles","filterOrphansToFiles","orphanResult","targetFiles","targetSet","orphan","normalizedOrphan","t","checkFilesForOrphanStatus","baseDir","runStaticAnalysis","_workspaceRoot","skippedTests","orphanedFiles","errors","skipTestDetection","analyzeSkippedTests","testResults","testResult","parsed","skipped","skipOrphanDetection"],"mappings":"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","file":"chunk-OJNDAPC2.js","sourcesContent":["/**\n * Syntax Analyzer\n *\n * Uses @typescript-eslint/parser for real AST-based syntax validation.\n * Replaces bracket counting with proper parsing.\n *\n * @module analysis/ast/SyntaxAnalyzer\n */\nimport * as eslintParser from \"@typescript-eslint/parser\";\n/**\n * AST-based syntax analyzer using @typescript-eslint/parser\n */\nexport class SyntaxAnalyzer {\n id = \"syntax\";\n name = \"Syntax Analysis\";\n filePatterns = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\n async analyze(context) {\n const startTime = performance.now();\n const issues = [];\n let filesAnalyzed = 0;\n let nodesVisited = 0;\n const parseErrors = [];\n for (const [file, content] of context.contents) {\n if (!this.shouldAnalyzeFile(file)) {\n continue;\n }\n filesAnalyzed++;\n try {\n // Parse with @typescript-eslint/parser\n const ast = eslintParser.parse(content, {\n sourceType: \"module\",\n ecmaFeatures: {\n jsx: file.endsWith(\".tsx\") || file.endsWith(\".jsx\"),\n },\n ecmaVersion: \"latest\",\n // Error recovery mode to get partial AST even with errors\n errorOnUnknownASTType: false,\n });\n // Count nodes for coverage metric\n nodesVisited += this.countNodes(ast);\n // Check for syntax issues that the parser didn't catch but still parsed\n this.checkSyntaxPatterns(content, file, issues);\n }\n catch (error) {\n // Parse error - this is a real syntax issue\n const parseError = this.extractParseError(error);\n parseErrors.push(`${file}: ${parseError.message}`);\n issues.push({\n id: `syntax/parse-error/${file}/${parseError.line}`,\n severity: \"critical\",\n type: \"SYNTAX_ERROR\",\n message: parseError.message,\n file,\n line: parseError.line,\n column: parseError.column,\n fix: \"Fix the syntax error to allow parsing\",\n });\n }\n }\n return {\n analyzer: this.id,\n success: true,\n issues,\n coverage: filesAnalyzed / Math.max(context.files.length, 1),\n duration: performance.now() - startTime,\n metadata: {\n filesAnalyzed,\n nodesVisited,\n parseErrors,\n },\n };\n }\n shouldRun(context) {\n return context.files.some((f) => this.shouldAnalyzeFile(f));\n }\n shouldAnalyzeFile(file) {\n const ext = file.split(\".\").pop()?.toLowerCase();\n return [\"ts\", \"tsx\", \"js\", \"jsx\"].includes(ext || \"\");\n }\n /**\n * Extract parse error information from parser exception\n */\n extractParseError(error) {\n if (error instanceof Error) {\n // @typescript-eslint/parser errors have line/column info\n const match = error.message.match(/\\((\\d+):(\\d+)\\)/);\n if (match) {\n return {\n message: error.message,\n line: Number.parseInt(match[1], 10),\n column: Number.parseInt(match[2], 10),\n };\n }\n return {\n message: error.message,\n line: 1,\n column: 1,\n };\n }\n return {\n message: String(error),\n line: 1,\n column: 1,\n };\n }\n /**\n * Count AST nodes for coverage metrics\n */\n countNodes(node) {\n if (!node || typeof node !== \"object\") {\n return 0;\n }\n let count = 1;\n for (const key of Object.keys(node)) {\n const value = node[key];\n if (Array.isArray(value)) {\n for (const item of value) {\n count += this.countNodes(item);\n }\n }\n else if (value && typeof value === \"object\" && \"type\" in value) {\n count += this.countNodes(value);\n }\n }\n return count;\n }\n /**\n * Check for additional syntax patterns that may indicate issues\n */\n checkSyntaxPatterns(content, file, issues) {\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + 1;\n // Check for double semicolons\n if (line.includes(\";;\")) {\n issues.push({\n id: `syntax/double-semicolon/${file}/${lineNum}`,\n severity: \"low\",\n type: \"SYNTAX_WARNING\",\n message: \"Double semicolon detected\",\n file,\n line: lineNum,\n column: line.indexOf(\";;\") + 1,\n fix: \"Remove extra semicolon\",\n snippet: line.trim(),\n });\n }\n // Check for console.assert with empty second argument\n if (/console\\.assert\\([^,]+,\\s*\\)/.test(line)) {\n issues.push({\n id: `syntax/empty-assert/${file}/${lineNum}`,\n severity: \"medium\",\n type: \"SYNTAX_WARNING\",\n message: \"console.assert with empty message\",\n file,\n line: lineNum,\n fix: \"Add assertion message for debugging\",\n snippet: line.trim(),\n });\n }\n // Check for likely typos: = instead of === in conditions\n if (/if\\s*\\([^=]*=\\s*[^=]/.test(line) && !/if\\s*\\([^=]*[=!]==/.test(line)) {\n // Only warn if it looks like an assignment in a condition\n const assignMatch = line.match(/if\\s*\\(\\s*(\\w+)\\s*=\\s*[^=]/);\n if (assignMatch) {\n issues.push({\n id: `syntax/assignment-in-condition/${file}/${lineNum}`,\n severity: \"medium\",\n type: \"SYNTAX_WARNING\",\n message: \"Possible assignment in condition (did you mean ===?)\",\n file,\n line: lineNum,\n fix: \"Use === for comparison, or wrap in extra parentheses if intentional\",\n snippet: line.trim(),\n });\n }\n }\n }\n }\n}\n","/**\n * Completeness Analyzer\n *\n * Detects incomplete implementations: TODO comments, empty catch blocks,\n * NotImplementedError, empty function bodies, placeholder code.\n *\n * Uses @babel/parser + @babel/traverse for AST-based detection.\n *\n * @module analysis/completeness/CompletenessAnalyzer\n */\nimport { parse } from \"@babel/parser\";\nimport traverse from \"@babel/traverse\";\n/**\n * AST-based completeness analyzer\n */\nexport class CompletenessAnalyzer {\n id = \"completeness\";\n name = \"Completeness Detection\";\n filePatterns = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\n todoPatterns = [\n /\\/\\/\\s*TODO\\b/gi,\n /\\/\\/\\s*FIXME\\b/gi,\n /\\/\\/\\s*XXX\\b/gi,\n /\\/\\/\\s*HACK\\b/gi,\n /\\/\\*\\s*TODO\\b/gi,\n /\\/\\*\\s*FIXME\\b/gi,\n ];\n placeholderPatterns = [\n /throw\\s+new\\s+Error\\s*\\(\\s*['\"`].*not\\s*implemented.*['\"`]\\s*\\)/gi,\n /throw\\s+new\\s+Error\\s*\\(\\s*['\"`]TODO.*['\"`]\\s*\\)/gi,\n /NotImplementedError/gi,\n /throw\\s+new\\s+Error\\s*\\(\\s*['\"`]STUB['\"`]\\s*\\)/gi,\n ];\n parserOptions = {\n sourceType: \"module\",\n plugins: [\"typescript\", \"jsx\"],\n errorRecovery: true,\n };\n async analyze(context) {\n const startTime = performance.now();\n const issues = [];\n let filesAnalyzed = 0;\n let nodesVisited = 0;\n const parseErrors = [];\n for (const [file, content] of context.contents) {\n if (!this.shouldAnalyzeFile(file)) {\n continue;\n }\n filesAnalyzed++;\n // Line-based detection for comments\n this.checkTodoComments(content, file, issues);\n this.checkPlaceholderPatterns(content, file, issues);\n // AST-based detection for structural issues\n try {\n const ast = parse(content, {\n ...this.parserOptions,\n plugins: this.getPluginsForFile(file),\n });\n const result = this.analyzeAST(ast, content, file);\n issues.push(...result.issues);\n nodesVisited += result.nodesVisited;\n }\n catch (error) {\n parseErrors.push(`${file}: ${error instanceof Error ? error.message : String(error)}`);\n // Parsing errors are handled by SyntaxAnalyzer, don't duplicate\n }\n }\n return {\n analyzer: this.id,\n success: true,\n issues,\n coverage: filesAnalyzed / Math.max(context.files.length, 1),\n duration: performance.now() - startTime,\n metadata: {\n filesAnalyzed,\n nodesVisited,\n patternsChecked: [\"TODO\", \"FIXME\", \"EMPTY_CATCH\", \"EMPTY_FUNCTION\", \"NOT_IMPLEMENTED\", \"PLACEHOLDER\"],\n parseErrors,\n },\n };\n }\n shouldRun(context) {\n return context.files.some((f) => this.shouldAnalyzeFile(f));\n }\n shouldAnalyzeFile(file) {\n const ext = file.split(\".\").pop()?.toLowerCase();\n return [\"ts\", \"tsx\", \"js\", \"jsx\"].includes(ext || \"\");\n }\n getPluginsForFile(file) {\n const plugins = [\"typescript\"];\n if (file.endsWith(\".tsx\") || file.endsWith(\".jsx\")) {\n plugins.push(\"jsx\");\n }\n return plugins;\n }\n /**\n * Check for TODO/FIXME comments\n */\n checkTodoComments(content, file, issues) {\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + 1;\n for (const pattern of this.todoPatterns) {\n // Reset lastIndex for global patterns\n pattern.lastIndex = 0;\n if (pattern.test(line)) {\n // Extract the TODO content\n const todoContent = line.trim().slice(0, 100);\n issues.push({\n id: `completeness/todo/${file}/${lineNum}`,\n severity: \"medium\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: `TODO/FIXME: ${todoContent}`,\n file,\n line: lineNum,\n snippet: todoContent,\n });\n break; // Only report once per line\n }\n }\n }\n }\n /**\n * Check for placeholder/stub patterns\n */\n checkPlaceholderPatterns(content, file, issues) {\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + 1;\n for (const pattern of this.placeholderPatterns) {\n pattern.lastIndex = 0;\n if (pattern.test(line)) {\n issues.push({\n id: `completeness/placeholder/${file}/${lineNum}`,\n severity: \"high\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: 'Placeholder implementation: \"not implemented\" or similar',\n file,\n line: lineNum,\n fix: \"Implement the functionality or remove the placeholder\",\n snippet: line.trim().slice(0, 100),\n });\n break;\n }\n }\n }\n }\n /**\n * AST-based detection of empty/incomplete code\n */\n analyzeAST(ast, _content, file) {\n const issues = [];\n let nodesVisited = 0;\n traverse(ast, {\n enter() {\n nodesVisited++;\n },\n // Empty catch blocks\n CatchClause: (path) => {\n const body = path.node.body;\n if (body.body.length === 0) {\n issues.push({\n id: `completeness/empty-catch/${file}/${path.node.loc?.start.line}`,\n severity: \"medium\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: \"Empty catch block - errors silently swallowed\",\n file,\n line: path.node.loc?.start.line,\n fix: \"Add error handling, rethrow, or log the error\",\n });\n }\n else if (body.body.length === 1) {\n // Check for comment-only catch blocks\n const stmt = body.body[0];\n if (stmt.type === \"EmptyStatement\") {\n issues.push({\n id: `completeness/empty-catch/${file}/${path.node.loc?.start.line}`,\n severity: \"medium\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: \"Catch block contains only empty statement\",\n file,\n line: path.node.loc?.start.line,\n fix: \"Add proper error handling\",\n });\n }\n }\n },\n // Empty function bodies (excluding type declarations and interface methods)\n FunctionDeclaration: (path) => {\n if (path.node.body.body.length === 0) {\n const funcName = path.node.id?.name || \"anonymous\";\n // Skip if it's likely a stub for interface implementation\n const hasOverrideDecorator = false; // Would need to check decorators\n if (!hasOverrideDecorator) {\n issues.push({\n id: `completeness/empty-fn/${file}/${path.node.loc?.start.line}`,\n severity: \"medium\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: `Empty function body: ${funcName}()`,\n file,\n line: path.node.loc?.start.line,\n fix: \"Implement the function or mark as abstract/stub if intentional\",\n });\n }\n }\n },\n // Empty method bodies\n ClassMethod: (path) => {\n // Skip abstract methods, getters with explicit return, etc.\n if (path.node.abstract) {\n return;\n }\n if (path.node.kind === \"get\" || path.node.kind === \"set\") {\n return;\n }\n const body = path.node.body;\n if (body && body.body.length === 0) {\n const methodName = path.node.key.type === \"Identifier\" ? path.node.key.name : \"anonymous\";\n // Skip constructor with only super() call\n if (methodName === \"constructor\") {\n return;\n }\n issues.push({\n id: `completeness/empty-method/${file}/${path.node.loc?.start.line}`,\n severity: \"medium\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: `Empty method body: ${methodName}()`,\n file,\n line: path.node.loc?.start.line,\n fix: \"Implement the method or mark as abstract if intentional\",\n });\n }\n },\n // Arrow functions that just throw or are empty (might be intentional)\n ArrowFunctionExpression: (path) => {\n const body = path.node.body;\n // Check if it's a block body that's empty\n if (body.type === \"BlockStatement\" && body.body.length === 0) {\n // Only warn if it's assigned to a variable (likely meant to be implemented)\n const parent = path.parent;\n if (parent.type === \"VariableDeclarator\") {\n const varName = parent.id.type === \"Identifier\" ? parent.id.name : \"anonymous\";\n issues.push({\n id: `completeness/empty-arrow/${file}/${path.node.loc?.start.line}`,\n severity: \"low\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: `Empty arrow function: ${varName}`,\n file,\n line: path.node.loc?.start.line,\n fix: \"Implement the function or use () => {} if intentionally empty\",\n });\n }\n }\n },\n // Check for console.log that might be debug code\n CallExpression: (path) => {\n const callee = path.node.callee;\n if (callee.type === \"MemberExpression\" &&\n callee.object.type === \"Identifier\" &&\n callee.object.name === \"console\" &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === \"log\") {\n // Check if it looks like debug code\n const firstArg = path.node.arguments[0];\n if (firstArg && firstArg.type === \"StringLiteral\") {\n const msg = firstArg.value.toLowerCase();\n if (msg.includes(\"debug\") ||\n msg.includes(\"test\") ||\n msg.includes(\"todo\") ||\n msg.includes(\"remove\")) {\n issues.push({\n id: `completeness/debug-log/${file}/${path.node.loc?.start.line}`,\n severity: \"low\",\n type: \"DEBUG_CODE\",\n message: `Debug console.log left in code: \"${firstArg.value.slice(0, 50)}\"`,\n file,\n line: path.node.loc?.start.line,\n fix: \"Remove debug logging before commit\",\n });\n }\n }\n }\n },\n });\n return { issues, nodesVisited };\n }\n}\n","/**\n * ChangeImpactAnalyzer\n *\n * Predicts the impact of code changes across the codebase:\n * - Affected tests (which tests might fail)\n * - Breaking changes (API/interface changes)\n * - Performance implications (hot path modifications)\n * - Dependency ripple effects\n *\n * @module analysis/impact/ChangeImpactAnalyzer\n */\nimport { basename, dirname, relative } from \"node:path\";\n// =============================================================================\n// Pattern Matchers\n// =============================================================================\n/**\n * Patterns that indicate exported API\n */\nconst EXPORT_PATTERNS = [\n /export\\s+(const|function|class|interface|type|enum)\\s+(\\w+)/g,\n /export\\s+default\\s+(function|class)?\\s*(\\w+)?/g,\n /export\\s+\\{([^}]+)\\}/g,\n];\n/**\n * Patterns that indicate function signatures\n */\nconst _SIGNATURE_PATTERNS = [\n // Function with parameters\n /(?:async\\s+)?function\\s+(\\w+)\\s*\\(([^)]*)\\)/g,\n // Arrow function\n /(?:const|let)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(([^)]*)\\)\\s*(?::\\s*\\w+)?\\s*=>/g,\n // Method in class\n /(?:public|private|protected)?\\s*(?:async\\s+)?(\\w+)\\s*\\(([^)]*)\\)/g,\n];\n/**\n * Patterns indicating performance-sensitive code\n */\nconst PERFORMANCE_PATTERNS = [\n { pattern: /\\.forEach\\s*\\(/g, type: \"computation\", risk: \"low\" },\n { pattern: /for\\s*\\(\\s*let\\s+\\w+\\s*=\\s*0/g, type: \"computation\", risk: \"low\" },\n { pattern: /while\\s*\\(/g, type: \"computation\", risk: \"medium\" },\n { pattern: /async\\s+function|await\\s+/g, type: \"io\", risk: \"medium\" },\n { pattern: /new\\s+(Map|Set|Array)\\s*\\(/g, type: \"memory\", risk: \"low\" },\n { pattern: /JSON\\.(parse|stringify)/g, type: \"computation\", risk: \"medium\" },\n { pattern: /readFileSync|writeFileSync/g, type: \"io\", risk: \"high\" },\n { pattern: /spawn|exec\\s*\\(/g, type: \"io\", risk: \"high\" },\n { pattern: /import\\s*\\(/g, type: \"bundle\", risk: \"low\" },\n { pattern: /require\\s*\\(/g, type: \"bundle\", risk: \"medium\" },\n];\n/**\n * File patterns that indicate test files\n */\nconst TEST_FILE_PATTERNS = [/\\.test\\.[tj]sx?$/, /\\.spec\\.[tj]sx?$/, /__tests__\\//, /test\\//, /tests\\//];\n// =============================================================================\n// ChangeImpactAnalyzer\n// =============================================================================\nexport class ChangeImpactAnalyzer {\n id = \"change-impact\";\n name = \"Change Impact Analyzer\";\n filePatterns = [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"];\n workspaceRoot;\n dependencyGraph = new Map();\n reverseDependencyGraph = new Map();\n constructor(workspaceRoot) {\n this.workspaceRoot = workspaceRoot;\n }\n /**\n * Check if this analyzer should run\n */\n shouldRun(context) {\n return context.files.some((f) => this.filePatterns.some((p) => new RegExp(p.replace(/\\*/g, \".*\")).test(f)));\n }\n /**\n * Run impact analysis\n */\n async analyze(context) {\n const start = Date.now();\n const issues = [];\n try {\n // Build dependency graph from context\n await this.buildDependencyGraph(context);\n // Analyze each file\n for (const file of context.files) {\n const content = context.contents.get(file);\n if (!content) {\n continue;\n }\n // Detect breaking changes\n const breakingChanges = this.detectBreakingChanges(content, file);\n for (const bc of breakingChanges) {\n issues.push({\n id: `impact/breaking/${bc.type}/${file}/${bc.symbol}`,\n severity: bc.severity,\n type: `BREAKING_${bc.type.toUpperCase()}`,\n message: bc.description,\n file,\n fix: bc.migration,\n });\n }\n // Detect performance impacts\n const perfImpacts = this.detectPerformanceImpacts(content, file);\n for (const pi of perfImpacts) {\n if (pi.risk === \"high\" || pi.risk === \"critical\") {\n issues.push({\n id: `impact/perf/${pi.type}/${file}/${pi.component}`,\n severity: pi.risk === \"critical\" ? \"critical\" : \"high\",\n type: `PERF_${pi.type.toUpperCase()}`,\n message: pi.description,\n file,\n fix: pi.recommendation,\n });\n }\n }\n // Check for affected tests\n const affectedTests = this.findAffectedTests(file);\n if (affectedTests.length > 5) {\n issues.push({\n id: `impact/tests/${file}`,\n severity: \"medium\",\n type: \"HIGH_TEST_IMPACT\",\n message: `Change affects ${affectedTests.length} test files - consider running full test suite`,\n file,\n });\n }\n }\n return {\n analyzer: this.id,\n success: true,\n issues,\n coverage: 1,\n duration: Date.now() - start,\n metadata: {\n filesAnalyzed: context.files.length,\n },\n };\n }\n catch (error) {\n return {\n analyzer: this.id,\n success: false,\n issues: [\n {\n id: \"impact/error\",\n severity: \"high\",\n type: \"ANALYSIS_ERROR\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n coverage: 0,\n duration: Date.now() - start,\n };\n }\n }\n /**\n * Get full impact analysis (more detailed than standard analyze)\n */\n async getFullImpact(files, contents) {\n const start = Date.now();\n // Build context\n const context = {\n workspaceRoot: this.workspaceRoot,\n files,\n contents,\n };\n await this.buildDependencyGraph(context);\n const affectedTests = [];\n const breakingChanges = [];\n const performanceImpacts = [];\n const dependentFiles = [];\n const recommendations = [];\n for (const file of files) {\n const content = contents.get(file) || \"\";\n // Find affected tests\n const tests = this.findAffectedTests(file);\n affectedTests.push(...tests);\n // Detect breaking changes\n const breaks = this.detectBreakingChanges(content, file);\n breakingChanges.push(...breaks);\n // Detect performance impacts\n const perfs = this.detectPerformanceImpacts(content, file);\n performanceImpacts.push(...perfs);\n // Find dependent files\n const deps = this.findDependentFiles(file);\n dependentFiles.push(...deps);\n }\n // Calculate impact score\n const impactScore = this.calculateImpactScore(affectedTests, breakingChanges, performanceImpacts, dependentFiles);\n // Generate recommendations\n if (breakingChanges.length > 0) {\n recommendations.push(`⚠️ ${breakingChanges.length} breaking change(s) detected - update dependent code`);\n }\n if (affectedTests.length > 10) {\n recommendations.push(`🧪 Run full test suite - ${affectedTests.length} tests potentially affected`);\n }\n if (performanceImpacts.some((p) => p.risk === \"high\" || p.risk === \"critical\")) {\n recommendations.push(\"⚡ Performance-sensitive code modified - run benchmarks\");\n }\n if (dependentFiles.length > 20) {\n recommendations.push(\"🔗 High ripple effect - consider incremental rollout\");\n }\n return {\n filesAnalyzed: files.length,\n affectedTests: this.dedupeItems(affectedTests),\n breakingChanges,\n performanceImpacts,\n dependentFiles: this.dedupeItems(dependentFiles),\n impactScore,\n recommendations,\n duration: Date.now() - start,\n };\n }\n // =========================================================================\n // Private Methods\n // =========================================================================\n /**\n * Build dependency graph from file contents\n */\n async buildDependencyGraph(context) {\n this.dependencyGraph.clear();\n this.reverseDependencyGraph.clear();\n for (const file of context.files) {\n const content = context.contents.get(file);\n if (!content) {\n continue;\n }\n const imports = this.extractImports(content, file);\n this.dependencyGraph.set(file, imports);\n // Build reverse graph\n for (const imp of imports) {\n const existing = this.reverseDependencyGraph.get(imp) || [];\n existing.push(file);\n this.reverseDependencyGraph.set(imp, existing);\n }\n }\n }\n /**\n * Extract import statements from file content\n */\n extractImports(content, fromFile) {\n const imports = [];\n const importRegex = /import\\s+(?:.*?\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n const requireRegex = /require\\s*\\(['\"]([^'\"]+)['\"]\\)/g;\n let match;\n while ((match = importRegex.exec(content)) !== null) {\n const importPath = this.resolveImportPath(match[1], fromFile);\n if (importPath) {\n imports.push(importPath);\n }\n }\n while ((match = requireRegex.exec(content)) !== null) {\n const importPath = this.resolveImportPath(match[1], fromFile);\n if (importPath) {\n imports.push(importPath);\n }\n }\n return imports;\n }\n /**\n * Resolve import path to absolute file path\n */\n resolveImportPath(importPath, fromFile) {\n // Skip external packages\n if (!importPath.startsWith(\".\") && !importPath.startsWith(\"/\")) {\n return null;\n }\n const dir = dirname(fromFile);\n const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \"/index.ts\", \"/index.tsx\", \"/index.js\"];\n for (const ext of extensions) {\n const resolved = `${dir}/${importPath}${ext}`.replace(/\\/\\.\\//g, \"/\");\n return resolved;\n }\n return null;\n }\n /**\n * Find test files that might be affected by a change\n */\n findAffectedTests(file) {\n const tests = [];\n const relPath = relative(this.workspaceRoot, file);\n const fileName = basename(file).replace(/\\.[tj]sx?$/, \"\");\n // Direct test files for this source\n const directTestPatterns = [\n `${fileName}.test.ts`,\n `${fileName}.test.tsx`,\n `${fileName}.spec.ts`,\n `${fileName}.spec.tsx`,\n `__tests__/${fileName}.test.ts`,\n `__tests__/${fileName}.test.tsx`,\n ];\n for (const pattern of directTestPatterns) {\n tests.push({\n path: pattern,\n reason: \"Direct test file for changed source\",\n level: \"high\",\n });\n }\n // Files that import this file might have tests\n const importers = this.reverseDependencyGraph.get(file) || [];\n for (const importer of importers) {\n if (this.isTestFile(importer)) {\n tests.push({\n path: relative(this.workspaceRoot, importer),\n reason: \"Test file imports changed module\",\n level: \"medium\",\n });\n }\n }\n // Integration tests if this is a core module\n if (relPath.includes(\"/core/\") || relPath.includes(\"/services/\")) {\n tests.push({\n path: \"**/*.integration.test.ts\",\n reason: \"Core module change may affect integration tests\",\n level: \"low\",\n });\n }\n return tests;\n }\n /**\n * Check if a file is a test file\n */\n isTestFile(file) {\n return TEST_FILE_PATTERNS.some((p) => p.test(file));\n }\n /**\n * Detect breaking changes in content\n */\n detectBreakingChanges(content, file) {\n const breaks = [];\n // Check for exported symbols\n for (const pattern of EXPORT_PATTERNS) {\n const regex = new RegExp(pattern.source, pattern.flags);\n let match;\n while ((match = regex.exec(content)) !== null) {\n const symbolName = match[2] || match[1];\n if (symbolName) {\n // Check if this is a potential breaking change\n // (In a real implementation, we'd compare with previous version)\n breaks.push({\n type: \"export\",\n symbol: symbolName,\n file,\n description: `Exported symbol '${symbolName}' may have changed`,\n severity: \"medium\",\n migration: `Verify consumers of '${symbolName}' are updated`,\n });\n }\n }\n }\n // Check for interface/type changes\n const interfaceRegex = /(?:export\\s+)?interface\\s+(\\w+)\\s*\\{([^}]+)\\}/g;\n let match;\n while ((match = interfaceRegex.exec(content)) !== null) {\n const interfaceName = match[1];\n const body = match[2];\n // Check for optional vs required changes (simplified)\n if (body.includes(\"?:\") || body.includes(\": \")) {\n breaks.push({\n type: \"type\",\n symbol: interfaceName,\n file,\n description: `Interface '${interfaceName}' definition changed`,\n severity: \"medium\",\n });\n }\n }\n return breaks;\n }\n /**\n * Detect performance-sensitive code changes\n */\n detectPerformanceImpacts(content, file) {\n const impacts = [];\n for (const { pattern, type, risk } of PERFORMANCE_PATTERNS) {\n const regex = new RegExp(pattern.source, pattern.flags);\n let match;\n while ((match = regex.exec(content)) !== null) {\n impacts.push({\n type,\n description: `${type} operation detected: ${match[0]}`,\n risk,\n component: basename(file),\n recommendation: this.getPerformanceRecommendation(type),\n });\n }\n }\n return impacts;\n }\n /**\n * Get recommendation for performance issue type\n */\n getPerformanceRecommendation(type) {\n switch (type) {\n case \"hotpath\":\n return \"Consider memoization or caching for hot paths\";\n case \"memory\":\n return \"Monitor memory usage, consider object pooling\";\n case \"io\":\n return \"Use async operations, consider batching\";\n case \"computation\":\n return \"Profile for bottlenecks, consider Web Workers\";\n case \"bundle\":\n return \"Use dynamic imports for code splitting\";\n default:\n return \"Profile before optimizing\";\n }\n }\n /**\n * Find files that depend on changed file\n */\n findDependentFiles(file) {\n const dependents = [];\n const visited = new Set();\n const traverse = (current, depth) => {\n if (visited.has(current) || depth > 3) {\n return;\n }\n visited.add(current);\n const importers = this.reverseDependencyGraph.get(current) || [];\n for (const importer of importers) {\n dependents.push({\n path: relative(this.workspaceRoot, importer),\n reason: depth === 0 ? \"Directly imports changed file\" : `Transitive dependency (depth ${depth})`,\n level: depth === 0 ? \"high\" : depth === 1 ? \"medium\" : \"low\",\n });\n traverse(importer, depth + 1);\n }\n };\n traverse(file, 0);\n return dependents;\n }\n /**\n * Calculate overall impact score\n */\n calculateImpactScore(tests, breaks, perfs, deps) {\n let score = 0;\n // Weight by category\n score += Math.min(tests.length * 0.05, 0.25);\n score += Math.min(breaks.length * 0.15, 0.35);\n score += Math.min(perfs.filter((p) => p.risk === \"high\").length * 0.1, 0.2);\n score += Math.min(deps.length * 0.02, 0.2);\n return Math.min(score, 1);\n }\n /**\n * Deduplicate impact items\n */\n dedupeItems(items) {\n const seen = new Set();\n return items.filter((item) => {\n if (seen.has(item.path)) {\n return false;\n }\n seen.add(item.path);\n return true;\n });\n }\n}\n// =============================================================================\n// Factory\n// =============================================================================\n/**\n * Create ChangeImpactAnalyzer instance\n */\nexport function createChangeImpactAnalyzer(workspaceRoot) {\n return new ChangeImpactAnalyzer(workspaceRoot);\n}\n","/**\n * Security Analyzer\n *\n * Uses @babel/parser + @babel/traverse for AST-based security analysis.\n * Detects eval, path traversal, missing signal handlers, and other security issues.\n *\n * @module analysis/security/SecurityAnalyzer\n */\nimport { parse } from \"@babel/parser\";\nimport traverse from \"@babel/traverse\";\n/**\n * AST-based security analyzer using Babel\n */\nexport class SecurityAnalyzer {\n id = \"security\";\n name = \"Security Analysis\";\n filePatterns = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\n parserOptions = {\n sourceType: \"module\",\n plugins: [\"typescript\", \"jsx\"],\n errorRecovery: true,\n };\n async analyze(context) {\n const startTime = performance.now();\n const issues = [];\n let filesAnalyzed = 0;\n let nodesVisited = 0;\n const parseErrors = [];\n for (const [file, content] of context.contents) {\n if (!this.shouldAnalyzeFile(file)) {\n continue;\n }\n filesAnalyzed++;\n try {\n const ast = parse(content, {\n ...this.parserOptions,\n plugins: this.getPluginsForFile(file),\n });\n const fileIssues = this.analyzeAST(ast, content, file);\n issues.push(...fileIssues.issues);\n nodesVisited += fileIssues.nodesVisited;\n }\n catch (error) {\n parseErrors.push(`${file}: ${error instanceof Error ? error.message : String(error)}`);\n issues.push({\n id: `security/parse-error/${file}`,\n severity: \"info\",\n type: \"PARSE_ERROR\",\n message: `Could not parse for security analysis: ${error instanceof Error ? error.message : String(error)}`,\n file,\n });\n }\n }\n return {\n analyzer: this.id,\n success: true,\n issues,\n coverage: filesAnalyzed / Math.max(context.files.length, 1),\n duration: performance.now() - startTime,\n metadata: {\n filesAnalyzed,\n nodesVisited,\n patternsChecked: [\n \"UNSAFE_EVAL\",\n \"PATH_TRAVERSAL\",\n \"MISSING_SIGNAL_HANDLER\",\n \"COMMAND_INJECTION\",\n \"SQL_INJECTION\",\n \"XSS_RISK\",\n \"HARDCODED_SECRET\",\n \"UNSAFE_REGEX\",\n ],\n parseErrors,\n },\n };\n }\n shouldRun(context) {\n return context.files.some((f) => this.shouldAnalyzeFile(f));\n }\n shouldAnalyzeFile(file) {\n const ext = file.split(\".\").pop()?.toLowerCase();\n return [\"ts\", \"tsx\", \"js\", \"jsx\"].includes(ext || \"\");\n }\n getPluginsForFile(file) {\n const plugins = [\"typescript\"];\n if (file.endsWith(\".tsx\") || file.endsWith(\".jsx\")) {\n plugins.push(\"jsx\");\n }\n return plugins;\n }\n /**\n * Analyze AST for security issues\n */\n analyzeAST(ast, content, file) {\n const issues = [];\n let nodesVisited = 0;\n // Track context for daemon/server detection\n const fileContext = {\n isDaemon: false,\n hasSignalHandler: false,\n hasSocketPermissions: false,\n hasBufferLimits: false,\n };\n // Pre-scan content for daemon indicators\n fileContext.isDaemon =\n content.includes(\".listen(\") ||\n file.includes(\"daemon\") ||\n file.includes(\"server\") ||\n file.includes(\"worker\");\n traverse(ast, {\n enter() {\n nodesVisited++;\n },\n // Detect eval()\n CallExpression: (path) => {\n const callee = path.node.callee;\n // eval() detection\n if (callee.type === \"Identifier\" && callee.name === \"eval\") {\n issues.push({\n id: `security/eval/${file}/${path.node.loc?.start.line}`,\n severity: \"critical\",\n type: \"UNSAFE_EVAL\",\n message: \"eval() allows arbitrary code execution\",\n file,\n line: path.node.loc?.start.line,\n column: path.node.loc?.start.column,\n fix: \"Use JSON.parse() for data or refactor logic to avoid eval\",\n });\n }\n // new Function() detection\n if (callee.type === \"Identifier\" && callee.name === \"Function\") {\n issues.push({\n id: `security/function-constructor/${file}/${path.node.loc?.start.line}`,\n severity: \"critical\",\n type: \"UNSAFE_EVAL\",\n message: \"new Function() is equivalent to eval() and allows arbitrary code execution\",\n file,\n line: path.node.loc?.start.line,\n column: path.node.loc?.start.column,\n fix: \"Refactor to avoid dynamic code generation\",\n });\n }\n // setTimeout/setInterval with string (like eval)\n if (callee.type === \"Identifier\" && (callee.name === \"setTimeout\" || callee.name === \"setInterval\")) {\n const firstArg = path.node.arguments[0];\n if (firstArg && firstArg.type === \"StringLiteral\") {\n issues.push({\n id: `security/string-timer/${file}/${path.node.loc?.start.line}`,\n severity: \"high\",\n type: \"UNSAFE_EVAL\",\n message: `${callee.name} with string argument executes code like eval()`,\n file,\n line: path.node.loc?.start.line,\n fix: \"Pass a function instead of a string\",\n });\n }\n }\n // exec/execSync (command injection risk)\n if (callee.type === \"Identifier\" && (callee.name === \"exec\" || callee.name === \"execSync\")) {\n const firstArg = path.node.arguments[0];\n if (firstArg && !this.isStaticString(firstArg)) {\n issues.push({\n id: `security/command-injection/${file}/${path.node.loc?.start.line}`,\n severity: \"high\",\n type: \"COMMAND_INJECTION\",\n message: \"exec with dynamic command - potential command injection\",\n file,\n line: path.node.loc?.start.line,\n fix: \"Validate/sanitize input or use execFile with explicit arguments\",\n });\n }\n }\n // Signal handler detection for daemons\n if (callee.type === \"MemberExpression\" &&\n callee.object.type === \"Identifier\" &&\n callee.object.name === \"process\" &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === \"on\") {\n const firstArg = path.node.arguments[0];\n if (firstArg && firstArg.type === \"StringLiteral\") {\n if (firstArg.value === \"SIGTERM\" || firstArg.value === \"SIGINT\") {\n fileContext.hasSignalHandler = true;\n }\n }\n }\n },\n // Detect fs operations with dynamic paths\n MemberExpression: (path) => {\n const node = path.node;\n if (node.object.type === \"Identifier\" && (node.object.name === \"fs\" || node.object.name === \"fsp\")) {\n const parent = path.parentPath;\n if (parent.isCallExpression()) {\n const methodName = node.property.type === \"Identifier\"\n ? node.property.name\n : node.property.value;\n // fs operations that take paths\n const pathMethods = [\n \"readFile\",\n \"readFileSync\",\n \"writeFile\",\n \"writeFileSync\",\n \"readdir\",\n \"readdirSync\",\n \"stat\",\n \"statSync\",\n \"unlink\",\n \"unlinkSync\",\n \"mkdir\",\n \"mkdirSync\",\n \"rmdir\",\n \"rmdirSync\",\n \"access\",\n \"accessSync\",\n ];\n if (pathMethods.includes(methodName)) {\n const firstArg = parent.node.arguments[0];\n if (firstArg && !this.isStaticPath(firstArg)) {\n issues.push({\n id: `security/path-traversal/${file}/${path.node.loc?.start.line}`,\n severity: \"high\",\n type: \"PATH_TRAVERSAL\",\n message: `fs.${methodName} with dynamic path - potential path traversal`,\n file,\n line: path.node.loc?.start.line,\n fix: \"Validate paths against workspace root before use\",\n });\n }\n }\n }\n }\n },\n // Check for dangerous regex patterns\n NewExpression: (path) => {\n if (path.node.callee.type === \"Identifier\" && path.node.callee.name === \"RegExp\") {\n const firstArg = path.node.arguments[0];\n if (firstArg && !this.isStaticString(firstArg)) {\n issues.push({\n id: `security/unsafe-regex/${file}/${path.node.loc?.start.line}`,\n severity: \"medium\",\n type: \"UNSAFE_REGEX\",\n message: \"Dynamic RegExp - potential ReDoS or injection vulnerability\",\n file,\n line: path.node.loc?.start.line,\n fix: \"Use static regex patterns or validate input\",\n });\n }\n }\n },\n // Check for innerHTML/dangerouslySetInnerHTML (XSS)\n JSXAttribute: (path) => {\n const name = path.node.name;\n if (name.type === \"JSXIdentifier\" && name.name === \"dangerouslySetInnerHTML\") {\n issues.push({\n id: `security/xss-risk/${file}/${path.node.loc?.start.line}`,\n severity: \"high\",\n type: \"XSS_RISK\",\n message: \"dangerouslySetInnerHTML can lead to XSS if content is not sanitized\",\n file,\n line: path.node.loc?.start.line,\n fix: \"Sanitize HTML content before rendering or avoid using dangerouslySetInnerHTML\",\n });\n }\n },\n // Check for hardcoded secrets in variable declarations\n VariableDeclarator: (path) => {\n const id = path.node.id;\n const init = path.node.init;\n if (id.type === \"Identifier\" && init) {\n this.checkForHardcodedSecret(id.name, init, file, path.node.loc?.start.line, issues);\n }\n },\n // Check for hardcoded secrets in class properties\n ClassProperty: (path) => {\n const key = path.node.key;\n const value = path.node.value;\n if (key.type === \"Identifier\" && value) {\n this.checkForHardcodedSecret(key.name, value, file, path.node.loc?.start.line, issues);\n }\n },\n // After traversal is complete, check daemon-specific patterns\n Program: {\n exit: () => {\n if (fileContext.isDaemon && !fileContext.hasSignalHandler) {\n issues.push({\n id: `security/signal-handler/${file}`,\n severity: \"high\",\n type: \"MISSING_SIGNAL_HANDLER\",\n message: \"Daemon/server missing signal handlers (SIGTERM/SIGINT)\",\n file,\n fix: \"Add process.on('SIGTERM', gracefulShutdown) for clean shutdown\",\n });\n }\n },\n },\n });\n return { issues, nodesVisited };\n }\n /**\n * Check if expression is a static string (safe)\n */\n isStaticString(node) {\n if (node.type === \"StringLiteral\") {\n return true;\n }\n if (node.type === \"TemplateLiteral\" && node.expressions.length === 0) {\n return true;\n }\n return false;\n }\n /**\n * Check if expression is a static path (safe)\n */\n isStaticPath(node) {\n // Static string literal\n if (node.type === \"StringLiteral\") {\n return true;\n }\n // Template literal with no interpolation\n if (node.type === \"TemplateLiteral\" && node.expressions.length === 0) {\n return true;\n }\n // path.join(__dirname, 'static') is somewhat safe\n if (node.type === \"CallExpression\") {\n const callee = node.callee;\n if (callee.type === \"MemberExpression\" &&\n callee.object.type === \"Identifier\" &&\n callee.object.name === \"path\" &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === \"join\") {\n // Check if all arguments are static or __dirname\n return node.arguments.every((arg) => {\n if (arg.type === \"StringLiteral\") {\n return true;\n }\n if (arg.type === \"Identifier\" && (arg.name === \"__dirname\" || arg.name === \"__filename\")) {\n return true;\n }\n return false;\n });\n }\n }\n return false;\n }\n /**\n * Check if a value looks like a hardcoded secret\n */\n checkForHardcodedSecret(name, value, file, line, issues) {\n if (!value) {\n return;\n }\n const varName = name.toLowerCase();\n const secretIndicators = [\"apikey\", \"api_key\", \"secret\", \"password\", \"token\", \"credential\", \"auth\", \"key\"];\n if (secretIndicators.some((s) => varName.includes(s))) {\n if (value.type === \"StringLiteral\" && value.value.length > 8) {\n // Skip obvious placeholders\n const valueStr = value.value.toLowerCase();\n if (!valueStr.includes(\"placeholder\") &&\n !valueStr.includes(\"example\") &&\n !valueStr.includes(\"xxx\") &&\n !valueStr.includes(\"todo\") &&\n !valueStr.includes(\"your_\") &&\n !valueStr.includes(\"env.\")) {\n issues.push({\n id: `security/hardcoded-secret/${file}/${line}`,\n severity: \"critical\",\n type: \"HARDCODED_SECRET\",\n message: `Possible hardcoded secret in \"${name}\"`,\n file,\n line,\n fix: \"Use environment variables for secrets\",\n });\n }\n }\n }\n }\n}\n","/**\n * Orphan File Detector\n *\n * Uses madge to detect orphaned files (files with no dependents).\n * These are potential dead code that may be safe to delete.\n *\n * Note: madge is a dev dependency, so this module handles the case\n * where it's not available gracefully.\n *\n * @module analysis/static/OrphanDetector\n */\nconst DEFAULT_OPTIONS = {\n fileExtensions: [\"ts\", \"tsx\", \"js\", \"jsx\"],\n excludePatterns: [\n \"node_modules\",\n \"dist\",\n \".next\",\n \"coverage\",\n \"**/*.test.*\",\n \"**/*.spec.*\",\n \"**/__tests__/**\",\n \"**/__mocks__/**\",\n ],\n};\n/**\n * Detect orphaned files in a directory\n *\n * @param entryPoint - Entry file or directory to analyze\n * @param options - Detection options\n * @returns Detection result with orphan list\n *\n * @example\n * ```typescript\n * const result = await detectOrphans(\"src/index.ts\", {\n * fileExtensions: [\"ts\", \"tsx\"],\n * excludePatterns: [\"node_modules\", \"dist\"]\n * });\n *\n * if (result.success && result.orphans.length > 0) {\n * console.log(\"Potential dead code:\", result.orphans);\n * }\n * ```\n */\nexport async function detectOrphans(entryPoint, options = {}) {\n const startTime = Date.now();\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n try {\n // Dynamic import madge - it's a dev dependency\n const madgeModule = await import(\"madge\");\n const madge = madgeModule.default || madgeModule;\n const result = await madge(entryPoint, {\n fileExtensions: mergedOptions.fileExtensions,\n excludeRegExp: mergedOptions.excludePatterns.map((p) => {\n // Convert glob patterns to regex\n const regexPattern = p.replace(/\\*\\*/g, \".*\").replace(/\\*/g, \"[^/]*\").replace(/\\./g, \"\\\\.\");\n return new RegExp(regexPattern);\n }),\n tsConfig: mergedOptions.tsConfigPath,\n detectiveOptions: {\n ts: {\n skipTypeImports: true,\n },\n },\n });\n const orphans = result.orphans();\n const allFiles = Object.keys(result.obj());\n return {\n orphans,\n totalFiles: allFiles.length,\n success: true,\n duration: Date.now() - startTime,\n };\n }\n catch (error) {\n return {\n orphans: [],\n totalFiles: 0,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n/**\n * Filter orphans to only include files from a specific list\n *\n * Useful for focusing on files the AI agent plans to modify.\n *\n * @param orphanResult - Result from detectOrphans\n * @param targetFiles - Files to filter to\n * @returns Filtered orphan list\n */\nexport function filterOrphansToFiles(orphanResult, targetFiles) {\n if (!orphanResult.success) {\n return [];\n }\n const targetSet = new Set(targetFiles.map((f) => f.replace(/\\\\/g, \"/\")));\n return orphanResult.orphans.filter((orphan) => {\n const normalizedOrphan = orphan.replace(/\\\\/g, \"/\");\n return targetSet.has(normalizedOrphan) || targetFiles.some((t) => normalizedOrphan.endsWith(t));\n });\n}\n/**\n * Check if specific files are orphans\n *\n * More efficient than full orphan detection when you only care\n * about specific files.\n *\n * @param files - Files to check\n * @param workspaceRoot - Workspace root directory\n * @returns Which of the provided files are orphans\n */\nexport async function checkFilesForOrphanStatus(files, workspaceRoot) {\n // For efficiency, we analyze the whole workspace once\n // then filter to the requested files\n const result = await detectOrphans(workspaceRoot, {\n baseDir: workspaceRoot,\n });\n if (!result.success) {\n return { orphans: [], success: false, error: result.error };\n }\n const orphans = filterOrphansToFiles(result, files);\n return { orphans, success: true };\n}\n","/**\n * Static Analysis Module\n *\n * Lightweight static analysis tools for AI agent assistance.\n * These tools help agents identify issues upfront, saving exploration tokens.\n *\n * Features:\n * - Skipped test detection (describe.skip, it.skip, test.skip)\n * - Orphaned file detection (dead code candidates)\n *\n * @module analysis/static\n */\n// Circular Dependency Detection\nexport { detectCircular, detectCircularInMonorepo, formatCycles, summarizeCircular, } from \"./CircularDetector.js\";\n// Orphan Detection\nexport { checkFilesForOrphanStatus, detectOrphans, filterOrphansToFiles, } from \"./OrphanDetector.js\";\n// Skipped Test Detection\nexport { analyzeSkippedTests, detectSkippedTests, getSkippedTestSummary, } from \"./SkippedTestDetector.js\";\n/**\n * Run lightweight static analysis on target files\n *\n * This is designed to be fast enough to run in begin_task\n * without significantly impacting latency.\n *\n * @param files - Files to analyze (map of path to content)\n * @param workspaceRoot - Workspace root for orphan detection\n * @param options - Analysis options\n * @returns Combined analysis result\n */\nexport async function runStaticAnalysis(files, _workspaceRoot, options = {}) {\n const startTime = Date.now();\n const result = {\n skippedTests: [],\n orphanedFiles: [],\n duration: 0,\n success: true,\n errors: [],\n };\n // 1. Detect skipped tests (fast - just AST parsing)\n if (!options.skipTestDetection) {\n try {\n const { analyzeSkippedTests } = await import(\"./SkippedTestDetector.js\");\n const testResults = analyzeSkippedTests(files);\n for (const testResult of testResults) {\n if (!testResult.parsed && testResult.error) {\n result.errors.push(`Parse error in ${testResult.file}: ${testResult.error}`);\n }\n for (const skipped of testResult.skipped) {\n result.skippedTests.push({\n file: skipped.file,\n type: skipped.type,\n name: skipped.name,\n line: skipped.line,\n });\n }\n }\n }\n catch (error) {\n result.errors.push(`Skipped test detection failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n // 2. Orphan detection is disabled by default in begin_task\n // because it requires analyzing the full dependency graph\n // which can be slow for large codebases (500ms+)\n // Enable with options.skipOrphanDetection = false\n if (!options.skipOrphanDetection) {\n // Orphan detection is expensive - skip by default\n // Will be enabled in a future version with caching\n }\n result.duration = Date.now() - startTime;\n result.success = result.errors.length === 0;\n return result;\n}\n"]}
@@ -213,7 +213,7 @@ async function getViolations(workspaceRoot) {
213
213
  __name(getViolations, "getViolations");
214
214
  async function getCredentials() {
215
215
  try {
216
- const { getCredentialsSecure } = await import('./secure-credentials-6UMEU22H.js');
216
+ const { getCredentialsSecure } = await import('./secure-credentials-A4QHHOE2.js');
217
217
  return await getCredentialsSecure();
218
218
  } catch {
219
219
  return readGlobalJson("credentials.json");
@@ -222,7 +222,7 @@ async function getCredentials() {
222
222
  __name(getCredentials, "getCredentials");
223
223
  async function saveCredentials(credentials) {
224
224
  try {
225
- const { saveCredentialsSecure } = await import('./secure-credentials-6UMEU22H.js');
225
+ const { saveCredentialsSecure } = await import('./secure-credentials-A4QHHOE2.js');
226
226
  return await saveCredentialsSecure(credentials);
227
227
  } catch {
228
228
  await createGlobalDirectory();
@@ -232,7 +232,7 @@ async function saveCredentials(credentials) {
232
232
  __name(saveCredentials, "saveCredentials");
233
233
  async function clearCredentials() {
234
234
  try {
235
- const { clearCredentialsSecure } = await import('./secure-credentials-6UMEU22H.js');
235
+ const { clearCredentialsSecure } = await import('./secure-credentials-A4QHHOE2.js');
236
236
  return await clearCredentialsSecure();
237
237
  } catch {
238
238
  await deleteGlobalJson("credentials.json");
@@ -296,5 +296,5 @@ async function getStats(path) {
296
296
  __name(getStats, "getStats");
297
297
 
298
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-NKBZIXCN.js.map
300
- //# sourceMappingURL=chunk-NKBZIXCN.js.map
299
+ //# sourceMappingURL=chunk-Q5XZ3DCB.js.map
300
+ //# sourceMappingURL=chunk-Q5XZ3DCB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/services/snapback-dir.ts"],"names":["SNAPBACK_DIR","GLOBAL_SNAPBACK_DIR","getGlobalDir","join","homedir","getWorkspaceDir","workspaceRoot","process","cwd","getGlobalPath","relativePath","getWorkspacePath","createSnapbackDirectory","baseDir","dirs","dir","mkdir","recursive","gitignore","trim","writeFile","createGlobalDirectory","isSnapbackInitialized","configPath","access","constants","F_OK","isLoggedIn","credentials","readGlobalJson","accessToken","expiresAt","Date","readSnapbackJson","content","readFile","JSON","parse","writeSnapbackJson","data","fullPath","dirname","stringify","appendSnapbackJsonl","appendFile","loadSnapbackJsonl","split","filter","line","map","writeGlobalJson","deleteGlobalJson","unlink","getWorkspaceConfig","saveWorkspaceConfig","config","getWorkspaceVitals","saveWorkspaceVitals","vitals","getProtectedFiles","saveProtectedFiles","files","getCurrentSession","saveCurrentSession","session","endCurrentSession","recordLearning","learning","getLearnings","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-NKBZIXCN.js","sourcesContent":["/**\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\";\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst SNAPBACK_DIR = \".snapback\";\nconst GLOBAL_SNAPBACK_DIR = \".snapback\";\n\n// =============================================================================\n// TYPE DEFINITIONS\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\n */\nexport async function getWorkspaceConfig(workspaceRoot?: string): Promise<WorkspaceConfig | null> {\n\treturn readSnapbackJson<WorkspaceConfig>(\"config.json\", workspaceRoot);\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\n */\nexport async function getWorkspaceVitals(workspaceRoot?: string): Promise<WorkspaceVitals | null> {\n\treturn readSnapbackJson<WorkspaceVitals>(\"vitals.json\", workspaceRoot);\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\n */\nexport async function getProtectedFiles(workspaceRoot?: string): Promise<ProtectedFile[]> {\n\treturn (await readSnapbackJson<ProtectedFile[]>(\"protected.json\", workspaceRoot)) ?? [];\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\n */\nexport async function getCurrentSession(workspaceRoot?: string): Promise<SessionState | null> {\n\treturn readSnapbackJson<SessionState>(\"session/current.json\", workspaceRoot);\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\n */\nexport async function getLearnings(workspaceRoot?: string): Promise<LearningEntry[]> {\n\treturn loadSnapbackJsonl<LearningEntry>(\"learnings/user-learnings.jsonl\", workspaceRoot);\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\n */\nexport async function getViolations(workspaceRoot?: string): Promise<ViolationEntry[]> {\n\treturn loadSnapbackJsonl<ViolationEntry>(\"patterns/violations.jsonl\", workspaceRoot);\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\n */\nexport async function getGlobalConfig(): Promise<GlobalConfig | null> {\n\treturn readGlobalJson<GlobalConfig>(\"config.json\");\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
+ {"version":3,"sources":["../src/services/snapback-dir.ts"],"names":["SNAPBACK_DIR","GLOBAL_SNAPBACK_DIR","getGlobalDir","join","homedir","getWorkspaceDir","workspaceRoot","process","cwd","getGlobalPath","relativePath","getWorkspacePath","createSnapbackDirectory","baseDir","dirs","dir","mkdir","recursive","gitignore","trim","writeFile","createGlobalDirectory","isSnapbackInitialized","configPath","access","constants","F_OK","isLoggedIn","credentials","readGlobalJson","accessToken","expiresAt","Date","readSnapbackJson","content","readFile","JSON","parse","writeSnapbackJson","data","fullPath","dirname","stringify","appendSnapbackJsonl","appendFile","loadSnapbackJsonl","split","filter","line","map","writeGlobalJson","deleteGlobalJson","unlink","getWorkspaceConfig","saveWorkspaceConfig","config","getWorkspaceVitals","saveWorkspaceVitals","vitals","getProtectedFiles","saveProtectedFiles","files","getCurrentSession","saveCurrentSession","session","endCurrentSession","recordLearning","learning","getLearnings","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-Q5XZ3DCB.js","sourcesContent":["/**\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\";\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst SNAPBACK_DIR = \".snapback\";\nconst GLOBAL_SNAPBACK_DIR = \".snapback\";\n\n// =============================================================================\n// TYPE DEFINITIONS\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\n */\nexport async function getWorkspaceConfig(workspaceRoot?: string): Promise<WorkspaceConfig | null> {\n\treturn readSnapbackJson<WorkspaceConfig>(\"config.json\", workspaceRoot);\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\n */\nexport async function getWorkspaceVitals(workspaceRoot?: string): Promise<WorkspaceVitals | null> {\n\treturn readSnapbackJson<WorkspaceVitals>(\"vitals.json\", workspaceRoot);\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\n */\nexport async function getProtectedFiles(workspaceRoot?: string): Promise<ProtectedFile[]> {\n\treturn (await readSnapbackJson<ProtectedFile[]>(\"protected.json\", workspaceRoot)) ?? [];\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\n */\nexport async function getCurrentSession(workspaceRoot?: string): Promise<SessionState | null> {\n\treturn readSnapbackJson<SessionState>(\"session/current.json\", workspaceRoot);\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\n */\nexport async function getLearnings(workspaceRoot?: string): Promise<LearningEntry[]> {\n\treturn loadSnapbackJsonl<LearningEntry>(\"learnings/user-learnings.jsonl\", workspaceRoot);\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\n */\nexport async function getViolations(workspaceRoot?: string): Promise<ViolationEntry[]> {\n\treturn loadSnapbackJsonl<ViolationEntry>(\"patterns/violations.jsonl\", workspaceRoot);\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\n */\nexport async function getGlobalConfig(): Promise<GlobalConfig | null> {\n\treturn readGlobalJson<GlobalConfig>(\"config.json\");\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"]}