@triedotdev/mcp 1.0.169 → 1.0.171

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 (145) hide show
  1. package/README.md +62 -540
  2. package/dist/chunk-2YXOBNKW.js +619 -0
  3. package/dist/chunk-2YXOBNKW.js.map +1 -0
  4. package/dist/chunk-QR64Y5TI.js +363 -0
  5. package/dist/chunk-QR64Y5TI.js.map +1 -0
  6. package/dist/cli/main.d.ts +0 -15
  7. package/dist/cli/main.js +356 -3098
  8. package/dist/cli/main.js.map +1 -1
  9. package/dist/index.js +2 -34
  10. package/dist/index.js.map +1 -1
  11. package/dist/server/mcp-server.js +2 -34
  12. package/package.json +8 -31
  13. package/dist/autonomy-config-FSERX3O3.js +0 -30
  14. package/dist/autonomy-config-FSERX3O3.js.map +0 -1
  15. package/dist/chat-store-JNGNTDSN.js +0 -15
  16. package/dist/chat-store-JNGNTDSN.js.map +0 -1
  17. package/dist/chunk-2HF65EHQ.js +0 -311
  18. package/dist/chunk-2HF65EHQ.js.map +0 -1
  19. package/dist/chunk-3XR6WVAW.js +0 -4011
  20. package/dist/chunk-3XR6WVAW.js.map +0 -1
  21. package/dist/chunk-43X6JBEM.js +0 -36
  22. package/dist/chunk-43X6JBEM.js.map +0 -1
  23. package/dist/chunk-6NLHFIYA.js +0 -344
  24. package/dist/chunk-6NLHFIYA.js.map +0 -1
  25. package/dist/chunk-7IO4YUI3.js +0 -1827
  26. package/dist/chunk-7IO4YUI3.js.map +0 -1
  27. package/dist/chunk-AHD2CBQ7.js +0 -846
  28. package/dist/chunk-AHD2CBQ7.js.map +0 -1
  29. package/dist/chunk-BUTOP5EB.js +0 -931
  30. package/dist/chunk-BUTOP5EB.js.map +0 -1
  31. package/dist/chunk-DGUM43GV.js +0 -11
  32. package/dist/chunk-DGUM43GV.js.map +0 -1
  33. package/dist/chunk-EFWVF6TI.js +0 -267
  34. package/dist/chunk-EFWVF6TI.js.map +0 -1
  35. package/dist/chunk-F6WFNUAY.js +0 -216
  36. package/dist/chunk-F6WFNUAY.js.map +0 -1
  37. package/dist/chunk-FBNURWRY.js +0 -662
  38. package/dist/chunk-FBNURWRY.js.map +0 -1
  39. package/dist/chunk-FQ45QP5A.js +0 -361
  40. package/dist/chunk-FQ45QP5A.js.map +0 -1
  41. package/dist/chunk-FVRO5RN3.js +0 -1306
  42. package/dist/chunk-FVRO5RN3.js.map +0 -1
  43. package/dist/chunk-G2TGF6TR.js +0 -573
  44. package/dist/chunk-G2TGF6TR.js.map +0 -1
  45. package/dist/chunk-G3I7SZLW.js +0 -354
  46. package/dist/chunk-G3I7SZLW.js.map +0 -1
  47. package/dist/chunk-GTKYBOXL.js +0 -700
  48. package/dist/chunk-GTKYBOXL.js.map +0 -1
  49. package/dist/chunk-HVCDY3AK.js +0 -850
  50. package/dist/chunk-HVCDY3AK.js.map +0 -1
  51. package/dist/chunk-I2O5OYQT.js +0 -727
  52. package/dist/chunk-I2O5OYQT.js.map +0 -1
  53. package/dist/chunk-JVMBCWKS.js +0 -348
  54. package/dist/chunk-JVMBCWKS.js.map +0 -1
  55. package/dist/chunk-KCUOWRPX.js +0 -816
  56. package/dist/chunk-KCUOWRPX.js.map +0 -1
  57. package/dist/chunk-KDHN2ZQE.js +0 -313
  58. package/dist/chunk-KDHN2ZQE.js.map +0 -1
  59. package/dist/chunk-ME2OERF5.js +0 -345
  60. package/dist/chunk-ME2OERF5.js.map +0 -1
  61. package/dist/chunk-OBQ74FOU.js +0 -27
  62. package/dist/chunk-OBQ74FOU.js.map +0 -1
  63. package/dist/chunk-Q5EKA5YA.js +0 -254
  64. package/dist/chunk-Q5EKA5YA.js.map +0 -1
  65. package/dist/chunk-Q63FFI6D.js +0 -132
  66. package/dist/chunk-Q63FFI6D.js.map +0 -1
  67. package/dist/chunk-SASNMSB5.js +0 -12597
  68. package/dist/chunk-SASNMSB5.js.map +0 -1
  69. package/dist/chunk-T63OHG4Q.js +0 -440
  70. package/dist/chunk-T63OHG4Q.js.map +0 -1
  71. package/dist/chunk-TN5WEKWI.js +0 -173
  72. package/dist/chunk-TN5WEKWI.js.map +0 -1
  73. package/dist/chunk-VUL52BQL.js +0 -402
  74. package/dist/chunk-VUL52BQL.js.map +0 -1
  75. package/dist/chunk-VVITXIHN.js +0 -189
  76. package/dist/chunk-VVITXIHN.js.map +0 -1
  77. package/dist/chunk-WCN7S3EI.js +0 -14
  78. package/dist/chunk-WCN7S3EI.js.map +0 -1
  79. package/dist/chunk-XPZZFPBZ.js +0 -491
  80. package/dist/chunk-XPZZFPBZ.js.map +0 -1
  81. package/dist/chunk-ZJF5FTBX.js +0 -1396
  82. package/dist/chunk-ZJF5FTBX.js.map +0 -1
  83. package/dist/chunk-ZV2K6M7T.js +0 -74
  84. package/dist/chunk-ZV2K6M7T.js.map +0 -1
  85. package/dist/cli/create-agent.d.ts +0 -1
  86. package/dist/cli/create-agent.js +0 -1050
  87. package/dist/cli/create-agent.js.map +0 -1
  88. package/dist/cli/yolo-daemon.d.ts +0 -1
  89. package/dist/cli/yolo-daemon.js +0 -421
  90. package/dist/cli/yolo-daemon.js.map +0 -1
  91. package/dist/client-NJPZE5JT.js +0 -28
  92. package/dist/client-NJPZE5JT.js.map +0 -1
  93. package/dist/codebase-index-VAPF32XX.js +0 -12
  94. package/dist/codebase-index-VAPF32XX.js.map +0 -1
  95. package/dist/fast-analyzer-3GCCZMLK.js +0 -216
  96. package/dist/fast-analyzer-3GCCZMLK.js.map +0 -1
  97. package/dist/git-EO5SRFMN.js +0 -28
  98. package/dist/git-EO5SRFMN.js.map +0 -1
  99. package/dist/github-ingester-ZOKK6GRS.js +0 -11
  100. package/dist/github-ingester-ZOKK6GRS.js.map +0 -1
  101. package/dist/goal-manager-QUKX2W6C.js +0 -25
  102. package/dist/goal-manager-QUKX2W6C.js.map +0 -1
  103. package/dist/goal-validator-2SFSKKVU.js +0 -24
  104. package/dist/goal-validator-2SFSKKVU.js.map +0 -1
  105. package/dist/graph-B3NA4S7I.js +0 -10
  106. package/dist/graph-B3NA4S7I.js.map +0 -1
  107. package/dist/hypothesis-KCPBR652.js +0 -23
  108. package/dist/hypothesis-KCPBR652.js.map +0 -1
  109. package/dist/incident-index-EFNUSGWL.js +0 -11
  110. package/dist/incident-index-EFNUSGWL.js.map +0 -1
  111. package/dist/insight-store-EC4PLSAW.js +0 -22
  112. package/dist/insight-store-EC4PLSAW.js.map +0 -1
  113. package/dist/issue-store-YAXTNRRY.js +0 -36
  114. package/dist/issue-store-YAXTNRRY.js.map +0 -1
  115. package/dist/ledger-TWZTGDFA.js +0 -58
  116. package/dist/ledger-TWZTGDFA.js.map +0 -1
  117. package/dist/linear-ingester-XXPAZZRW.js +0 -11
  118. package/dist/linear-ingester-XXPAZZRW.js.map +0 -1
  119. package/dist/output-manager-RVJ37XKA.js +0 -13
  120. package/dist/output-manager-RVJ37XKA.js.map +0 -1
  121. package/dist/parse-goal-violation-SACGFG3C.js +0 -8
  122. package/dist/parse-goal-violation-SACGFG3C.js.map +0 -1
  123. package/dist/pattern-discovery-F7LU5K6E.js +0 -8
  124. package/dist/pattern-discovery-F7LU5K6E.js.map +0 -1
  125. package/dist/progress-SRQ2V3BP.js +0 -18
  126. package/dist/progress-SRQ2V3BP.js.map +0 -1
  127. package/dist/project-state-AHPA77SM.js +0 -28
  128. package/dist/project-state-AHPA77SM.js.map +0 -1
  129. package/dist/sync-M2FSWPBC.js +0 -12
  130. package/dist/sync-M2FSWPBC.js.map +0 -1
  131. package/dist/terminal-spawn-5YXDMUCF.js +0 -157
  132. package/dist/terminal-spawn-5YXDMUCF.js.map +0 -1
  133. package/dist/tiered-storage-DYNC5CQ6.js +0 -13
  134. package/dist/tiered-storage-DYNC5CQ6.js.map +0 -1
  135. package/dist/trie-agent-I3HAHY2G.js +0 -26
  136. package/dist/trie-agent-I3HAHY2G.js.map +0 -1
  137. package/dist/ui/chat.html +0 -1014
  138. package/dist/ui/goals.html +0 -967
  139. package/dist/ui/hypotheses.html +0 -1011
  140. package/dist/ui/ledger.html +0 -954
  141. package/dist/ui/nudges.html +0 -995
  142. package/dist/vibe-code-signatures-5ZULYP3D.js +0 -987
  143. package/dist/vibe-code-signatures-5ZULYP3D.js.map +0 -1
  144. package/dist/vulnerability-signatures-2URZSXAQ.js +0 -983
  145. package/dist/vulnerability-signatures-2URZSXAQ.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/workspace.ts"],"sourcesContent":["/**\n * Workspace detection utilities\n * \n * MCP servers run as separate processes where process.cwd() may not be\n * the user's workspace. These utilities detect the actual project root\n * by looking for common project indicators.\n */\n\nimport { execSync } from 'node:child_process';\nimport { existsSync, readFileSync } from 'fs';\nimport { basename, dirname, join, resolve } from 'path';\nimport { isInteractiveMode } from './progress.js';\n\n// Project root indicators - files/directories that indicate a project root\n// Ordered by strength: primary indicators first\nconst PROJECT_ROOT_INDICATORS = [\n 'package.json', // Node.js/npm projects\n '.git', // Git repository root\n 'Cargo.toml', // Rust projects\n 'go.mod', // Go modules\n 'pyproject.toml', // Python projects (modern)\n 'pom.xml', // Maven (Java)\n 'build.gradle', // Gradle (Java/Kotlin)\n 'deno.json', // Deno projects\n // Note: .trie/config.json would be a better indicator, but empty .trie dirs exist\n // tsconfig.json is secondary as it can exist in subdirectories\n];\n\n// Directories that indicate we're in an npm package, not a user workspace\nconst NPM_PACKAGE_INDICATORS = [\n 'node_modules/@', // Scoped packages\n 'node_modules/', // Regular packages\n '.npm/', // npm cache\n '.nvm/', // nvm\n 'lib/node_modules/', // Global npm\n];\n\nfunction getGitCommonDir(startDir: string): string | null {\n try {\n const output = execSync('git rev-parse --git-common-dir', {\n cwd: startDir,\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .toString()\n .trim();\n if (!output) return null;\n return resolve(startDir, output);\n } catch {\n return null;\n }\n}\n\nfunction getSharedWorktreeRoot(startDir: string): string | null {\n const commonDir = getGitCommonDir(startDir);\n if (!commonDir) return null;\n if (basename(commonDir) !== '.git') return null;\n return dirname(commonDir);\n}\n\nexport function getTrieDirectory(workDir: string): string {\n const mode = process.env.TRIE_WORKTREE_MODE?.toLowerCase();\n if (mode === 'isolated') {\n return join(workDir, '.trie');\n }\n const sharedRoot = getSharedWorktreeRoot(workDir);\n if (sharedRoot) {\n return join(sharedRoot, '.trie');\n }\n return join(workDir, '.trie');\n}\n\n/**\n * Find the nearest project root by walking up from a starting directory\n * Returns the directory containing a project root indicator, or null if none found\n */\nexport function findProjectRoot(startDir: string, maxLevels: number = 10): string | null {\n let currentDir = resolve(startDir);\n let levels = 0;\n \n while (levels < maxLevels) {\n // Check if any project root indicator exists in this directory\n for (const indicator of PROJECT_ROOT_INDICATORS) {\n const indicatorPath = join(currentDir, indicator);\n if (existsSync(indicatorPath)) {\n return currentDir;\n }\n }\n \n // Move up one directory\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n // Reached filesystem root\n break;\n }\n currentDir = parentDir;\n levels++;\n }\n \n return null;\n}\n\n/**\n * Check if a path looks like it's inside an npm package installation\n */\nfunction isInsideNpmPackage(dir: string): boolean {\n const normalizedPath = dir.replace(/\\\\/g, '/');\n return NPM_PACKAGE_INDICATORS.some(indicator => normalizedPath.includes(indicator));\n}\n\n/**\n * Try to get workspace from environment variables\n * Various tools set these when invoking MCP servers\n */\nfunction getWorkspaceFromEnv(): string | null {\n // Common environment variables that might contain workspace path\n const envVars = [\n 'CURSOR_WORKSPACE', // Cursor IDE\n 'CURSOR_WORKSPACE_ROOT', // Alternative Cursor env var\n 'VSCODE_WORKSPACE', // VS Code\n 'VSCODE_CWD', // VS Code working directory\n 'WORKSPACE_FOLDER', // Generic workspace\n 'PROJECT_ROOT', // Generic project root\n 'INIT_CWD', // npm's original directory\n 'PWD', // Original shell directory\n ];\n \n for (const envVar of envVars) {\n const value = process.env[envVar];\n if (value && existsSync(value)) {\n // Verify it looks like a project\n const hasProjectIndicator = PROJECT_ROOT_INDICATORS.some(\n indicator => existsSync(join(value, indicator))\n );\n if (hasProjectIndicator) {\n return value;\n }\n }\n }\n \n return null;\n}\n\n/**\n * Get the best working directory for scanning/operations\n * Priority: \n * 1. Explicit directory arg\n * 2. Environment variable (CURSOR_WORKSPACE, etc.)\n * 3. Detected project root from cwd (if not inside npm package)\n * 4. process.cwd() with warning\n * \n * @param explicitDir - Optional explicit directory from user\n * @param silent - If true, don't log warnings when falling back to cwd\n */\nexport function getWorkingDirectory(explicitDir?: string, silent: boolean = false): string {\n // If explicitly provided, use it\n if (explicitDir) {\n return resolve(explicitDir);\n }\n\n // Suppress all logs in interactive mode (TUI handles its own display)\n const shouldLog = !silent && !isInteractiveMode();\n\n // Debug: Log all relevant environment variables\n if (shouldLog && process.env.DEBUG_TRIE_WORKSPACE) {\n console.error('Debug: Environment variables:');\n console.error(` CURSOR_WORKSPACE: ${process.env.CURSOR_WORKSPACE || 'not set'}`);\n console.error(` CURSOR_WORKSPACE_ROOT: ${process.env.CURSOR_WORKSPACE_ROOT || 'not set'}`);\n console.error(` VSCODE_CWD: ${process.env.VSCODE_CWD || 'not set'}`);\n console.error(` INIT_CWD: ${process.env.INIT_CWD || 'not set'}`);\n console.error(` PWD: ${process.env.PWD || 'not set'}`);\n console.error(` process.cwd(): ${process.cwd()}`);\n }\n\n // Try environment variables first\n const envWorkspace = getWorkspaceFromEnv();\n if (envWorkspace) {\n if (shouldLog) {\n console.error(`Using workspace from environment: ${envWorkspace}`);\n }\n return envWorkspace;\n }\n \n // Try to find a project root from cwd\n const cwd = process.cwd();\n \n // Check if we're running from inside an npm package (common for MCP servers)\n if (isInsideNpmPackage(cwd)) {\n if (shouldLog) {\n console.error('Warning: MCP server running from npm package directory.');\n console.error(' Please pass the \"directory\" parameter with your project path.');\n console.error(` Current directory: ${cwd}`);\n }\n // Still return cwd, but we've warned\n return cwd;\n }\n \n const projectRoot = findProjectRoot(cwd);\n \n if (projectRoot) {\n // Extra check: make sure we're not returning the Trie package itself\n const packageJsonPath = join(projectRoot, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n if (pkg.name === '@triedotdev/mcp' || pkg.name === 'trie-mcp-agent') {\n if (shouldLog) {\n console.error('Warning: Detected Trie package directory, not user workspace.');\n console.error(' Please pass the \"directory\" parameter with your project path.');\n }\n return cwd;\n }\n } catch {\n // Ignore parse errors\n }\n }\n return projectRoot;\n }\n \n // Fallback to cwd, but warn\n if (shouldLog) {\n console.error('Warning: Could not detect project root. Operating from:', cwd);\n console.error(' Tip: Pass directory parameter or run from a directory with package.json/.git');\n console.error(' Or set DEBUG_TRIE_WORKSPACE=1 to debug workspace detection');\n console.error(` Current working directory: ${cwd}`);\n\n // Show how to properly call with directory\n console.error(' Examples:');\n console.error(' Use trie_fix with directory: \"/path/to/your/project\"');\n console.error(' Use trie watch with directory: \"./your-project\"');\n }\n\n return cwd;\n}\n"],"mappings":"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","names":[]}
@@ -1,14 +0,0 @@
1
- // src/cli/dashboard/parse-goal-violation.ts
2
- function parseGoalViolation(message) {
3
- const match = message.match(/Goal "([^"]+)" violated in ([^:]+): (.+)/);
4
- if (!match) return null;
5
- const [, goal, file, violation] = match;
6
- if (!goal || !file || !violation) return null;
7
- const cleanViolation = violation.replace(/\s*\[\d+%\s*confidence\]\s*$/i, "").trim();
8
- return { file: file.trim(), goal: goal.trim(), violation: cleanViolation };
9
- }
10
-
11
- export {
12
- parseGoalViolation
13
- };
14
- //# sourceMappingURL=chunk-WCN7S3EI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/dashboard/parse-goal-violation.ts"],"sourcesContent":["/**\n * Parse goal violation from nudge message format:\n * Goal \"X\" violated in FILE: VIOLATION [X% confidence]\n */\nexport function parseGoalViolation(message: string): { file: string; goal: string; violation: string } | null {\n const match = message.match(/Goal \"([^\"]+)\" violated in ([^:]+): (.+)/);\n if (!match) return null;\n const [, goal, file, violation] = match;\n if (!goal || !file || !violation) return null;\n // Strip trailing [X% confidence] from violation if present\n const cleanViolation = violation.replace(/\\s*\\[\\d+%\\s*confidence\\]\\s*$/i, '').trim();\n return { file: file.trim(), goal: goal.trim(), violation: cleanViolation };\n}\n"],"mappings":";AAIO,SAAS,mBAAmB,SAA2E;AAC5G,QAAM,QAAQ,QAAQ,MAAM,0CAA0C;AACtE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,CAAC,EAAE,MAAM,MAAM,SAAS,IAAI;AAClC,MAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAW,QAAO;AAEzC,QAAM,iBAAiB,UAAU,QAAQ,iCAAiC,EAAE,EAAE,KAAK;AACnF,SAAO,EAAE,MAAM,KAAK,KAAK,GAAG,MAAM,KAAK,KAAK,GAAG,WAAW,eAAe;AAC3E;","names":[]}
@@ -1,491 +0,0 @@
1
- import {
2
- getTrieDirectory,
3
- getWorkingDirectory
4
- } from "./chunk-VVITXIHN.js";
5
- import {
6
- isInteractiveMode
7
- } from "./chunk-KDHN2ZQE.js";
8
-
9
- // src/config/loader.ts
10
- import { readFile, writeFile, mkdir } from "fs/promises";
11
- import { existsSync as existsSync2 } from "fs";
12
- import { join as join2, dirname } from "path";
13
-
14
- // src/config/validation.ts
15
- import { z } from "zod";
16
- import { existsSync, readFileSync, mkdirSync } from "fs";
17
- import { resolve, join } from "path";
18
- var API_KEY_PATTERNS = {
19
- anthropic: /^sk-ant-api\d{2}-[\w-]{95}$/,
20
- openai: /^sk-[\w]{48}$/,
21
- github: /^ghp_[\w]{36}$/,
22
- vercel: /^[\w]{24}$/,
23
- linear: /^lin_api_[\w]{40,60}$/
24
- };
25
- var ApiKeysSchema = z.object({
26
- anthropic: z.string().regex(API_KEY_PATTERNS.anthropic, "Invalid Anthropic API key format").optional(),
27
- openai: z.string().regex(API_KEY_PATTERNS.openai, "Invalid OpenAI API key format").optional(),
28
- // Lenient: accept GitHub classic (ghp_*), fine-grained (github_pat_*), or any string 10+ chars
29
- github: z.string().min(10).optional(),
30
- vercel: z.string().regex(API_KEY_PATTERNS.vercel, "Invalid Vercel token format").optional(),
31
- linear: z.string().optional(),
32
- cursor: z.string().optional()
33
- });
34
- var AgentConfigSchema = z.object({
35
- enabled: z.array(z.string()).optional().default([]),
36
- disabled: z.array(z.string()).optional().default([]),
37
- parallel: z.boolean().optional().default(true),
38
- maxConcurrency: z.number().int().min(1).max(20).optional().default(4),
39
- timeout: z.number().int().min(1e3).max(3e5).optional().default(12e4),
40
- // 2 minutes
41
- cache: z.boolean().optional().default(true)
42
- });
43
- var ComplianceSchema = z.object({
44
- standards: z.array(z.enum(["SOC2", "GDPR", "HIPAA", "CCPA", "PCI-DSS", "ISO27001", "FDA21CFR11", "SOX", "ICFR", "GLBA", "FFIEC", "FINRA"])).optional().default(["SOC2"]),
45
- enforceCompliance: z.boolean().optional().default(false),
46
- reportFormat: z.enum(["json", "sarif", "csv", "html"]).optional().default("json"),
47
- // Enhanced validation to prevent false negatives
48
- continuousValidation: z.boolean().optional().default(true),
49
- mandatoryAuditTrail: z.boolean().optional().default(true),
50
- falseNegativeDetection: z.object({
51
- enabled: z.boolean().optional().default(true),
52
- crossValidation: z.boolean().optional().default(true),
53
- humanReviewRequired: z.boolean().optional().default(false),
54
- samplingRate: z.number().min(0).max(1).optional().default(0.1)
55
- // 10% sampling
56
- }).optional().default({
57
- enabled: true,
58
- crossValidation: true,
59
- humanReviewRequired: false,
60
- samplingRate: 0.1
61
- })
62
- });
63
- var OutputSchema = z.object({
64
- format: z.enum(["console", "json", "sarif", "junit"]).optional().default("console"),
65
- level: z.enum(["critical", "serious", "moderate", "low", "all"]).optional().default("all"),
66
- interactive: z.boolean().optional().default(false),
67
- streaming: z.boolean().optional().default(true),
68
- colors: z.boolean().optional().default(true)
69
- });
70
- var PathsSchema = z.object({
71
- include: z.array(z.string()).optional().default([]),
72
- exclude: z.array(z.string()).optional().default(["node_modules", "dist", "build", ".git"]),
73
- configDir: z.string().optional().default(".trie"),
74
- outputDir: z.string().optional().default("trie-reports")
75
- });
76
- var IntegrationsSchema = z.object({
77
- github: z.object({
78
- enabled: z.boolean().optional().default(false),
79
- token: z.string().optional(),
80
- webhook: z.string().url().optional()
81
- }).optional(),
82
- slack: z.object({
83
- enabled: z.boolean().optional().default(false),
84
- webhook: z.string().url().optional(),
85
- channel: z.string().optional()
86
- }).optional(),
87
- jira: z.object({
88
- enabled: z.boolean().optional().default(false),
89
- url: z.string().url().optional(),
90
- token: z.string().optional(),
91
- project: z.string().optional()
92
- }).optional()
93
- });
94
- var UserSchema = z.object({
95
- name: z.string().min(1).optional(),
96
- email: z.string().email().optional(),
97
- role: z.enum([
98
- "developer",
99
- "designer",
100
- "qa",
101
- "devops",
102
- "security",
103
- "architect",
104
- "manager",
105
- "contributor"
106
- ]).optional().default("developer"),
107
- github: z.string().optional(),
108
- // GitHub username
109
- url: z.string().url().optional()
110
- // Personal/portfolio URL
111
- });
112
- var TrieConfigSchema = z.object({
113
- version: z.string().optional().default("1.0.0"),
114
- apiKeys: ApiKeysSchema.optional(),
115
- agents: AgentConfigSchema.optional(),
116
- compliance: ComplianceSchema.optional(),
117
- output: OutputSchema.optional(),
118
- paths: PathsSchema.optional(),
119
- integrations: IntegrationsSchema.optional(),
120
- user: UserSchema.optional()
121
- // User identity for attribution
122
- });
123
- var ConfigValidator = class {
124
- /**
125
- * Validate configuration object
126
- */
127
- validateConfig(config) {
128
- try {
129
- const validated = TrieConfigSchema.parse(config);
130
- const businessErrors = this.validateBusinessLogic(validated);
131
- if (businessErrors.length > 0) {
132
- return { success: false, errors: businessErrors };
133
- }
134
- return { success: true, data: validated };
135
- } catch (error) {
136
- if (error instanceof z.ZodError) {
137
- const errors = error.errors.map(
138
- (err) => `${err.path.join(".")}: ${err.message}`
139
- );
140
- return { success: false, errors };
141
- }
142
- return {
143
- success: false,
144
- errors: [`Configuration validation failed: ${error instanceof Error ? error.message : "Unknown error"}`]
145
- };
146
- }
147
- }
148
- /**
149
- * Validate environment variables for API keys
150
- */
151
- validateEnvironment() {
152
- const warnings = [];
153
- const errors = [];
154
- const exposedPatterns = [
155
- "NEXT_PUBLIC_ANTHROPIC",
156
- "REACT_APP_ANTHROPIC",
157
- "VITE_ANTHROPIC",
158
- "PUBLIC_ANTHROPIC"
159
- ];
160
- for (const pattern of exposedPatterns) {
161
- const envVars = Object.keys(process.env).filter((key) => key.includes(pattern));
162
- for (const envVar of envVars) {
163
- errors.push(`[!] Security risk: API key in client-side environment variable: ${envVar}`);
164
- }
165
- }
166
- let anthropicKey = process.env.ANTHROPIC_API_KEY;
167
- if (!anthropicKey) {
168
- try {
169
- const configPath = join(getTrieDirectory(getWorkingDirectory(void 0, true)), "config.json");
170
- if (existsSync(configPath)) {
171
- const config = JSON.parse(readFileSync(configPath, "utf-8"));
172
- anthropicKey = config.apiKeys?.anthropic;
173
- }
174
- } catch {
175
- }
176
- }
177
- if (anthropicKey && !API_KEY_PATTERNS.anthropic.test(anthropicKey)) {
178
- errors.push("ANTHROPIC_API_KEY does not match expected format");
179
- }
180
- if (!anthropicKey) {
181
- warnings.push("ANTHROPIC_API_KEY not set - AI features will be disabled. Set in environment, .trie/config.json, or .env file");
182
- }
183
- if (!process.env.GITHUB_TOKEN && process.env.CI) {
184
- warnings.push("GITHUB_TOKEN not set - GitHub integration disabled");
185
- }
186
- return {
187
- valid: errors.length === 0,
188
- warnings,
189
- errors
190
- };
191
- }
192
- /**
193
- * Validate file paths in configuration
194
- */
195
- validatePaths(paths) {
196
- const errors = [];
197
- if (paths?.include) {
198
- for (const path of paths.include) {
199
- const resolvedPath = resolve(path);
200
- if (!existsSync(resolvedPath)) {
201
- errors.push(`Include path does not exist: ${path}`);
202
- }
203
- }
204
- }
205
- if (paths?.configDir) {
206
- const configPath = resolve(paths.configDir);
207
- if (!existsSync(configPath)) {
208
- try {
209
- mkdirSync(configPath, { recursive: true });
210
- } catch {
211
- errors.push(`Cannot create config directory: ${paths.configDir}`);
212
- }
213
- }
214
- }
215
- return {
216
- valid: errors.length === 0,
217
- errors
218
- };
219
- }
220
- /**
221
- * Validate integration configurations
222
- */
223
- validateIntegrations(integrations) {
224
- const errors = [];
225
- if (integrations?.github?.enabled) {
226
- if (!integrations.github.token) {
227
- errors.push("GitHub integration enabled but no token provided");
228
- }
229
- }
230
- if (integrations?.slack?.enabled) {
231
- if (!integrations.slack.webhook) {
232
- errors.push("Slack integration enabled but no webhook URL provided");
233
- }
234
- }
235
- if (integrations?.jira?.enabled) {
236
- if (!integrations.jira.url || !integrations.jira.token || !integrations.jira.project) {
237
- errors.push("JIRA integration enabled but missing required fields (url, token, project)");
238
- }
239
- }
240
- return {
241
- valid: errors.length === 0,
242
- errors
243
- };
244
- }
245
- /**
246
- * Business logic validation
247
- */
248
- validateBusinessLogic(config) {
249
- const errors = [];
250
- if (config.agents?.enabled && config.agents?.disabled) {
251
- const overlap = config.agents.enabled.filter(
252
- (agent) => config.agents?.disabled?.includes(agent)
253
- );
254
- if (overlap.length > 0) {
255
- errors.push(`Agents cannot be both enabled and disabled: ${overlap.join(", ")}`);
256
- }
257
- }
258
- if (config.agents?.maxConcurrency && config.agents.maxConcurrency > 10) {
259
- errors.push("maxConcurrency should not exceed 10 for optimal performance");
260
- }
261
- if (config.compliance?.standards) {
262
- const validStandards = ["SOC2", "GDPR", "HIPAA", "CCPA", "PCI-DSS", "ISO27001", "FDA21CFR11", "SOX", "ICFR", "GLBA", "FFIEC", "FINRA"];
263
- const invalidStandards = config.compliance.standards.filter(
264
- (standard) => !validStandards.includes(standard)
265
- );
266
- if (invalidStandards.length > 0) {
267
- errors.push(`Invalid compliance standards: ${invalidStandards.join(", ")}. Valid standards: ${validStandards.join(", ")}`);
268
- }
269
- }
270
- if (config.paths) {
271
- const pathValidation = this.validatePaths(config.paths);
272
- errors.push(...pathValidation.errors);
273
- }
274
- if (config.integrations) {
275
- const integrationValidation = this.validateIntegrations(config.integrations);
276
- errors.push(...integrationValidation.errors);
277
- }
278
- return errors;
279
- }
280
- /**
281
- * Generate configuration template
282
- */
283
- generateTemplate() {
284
- return {
285
- version: "1.0.0",
286
- agents: {
287
- enabled: ["security", "bugs", "types"],
288
- disabled: [],
289
- parallel: true,
290
- maxConcurrency: 4,
291
- timeout: 12e4,
292
- cache: true
293
- },
294
- compliance: {
295
- standards: ["SOC2"],
296
- enforceCompliance: false,
297
- reportFormat: "json"
298
- },
299
- output: {
300
- format: "console",
301
- level: "all",
302
- interactive: false,
303
- streaming: true,
304
- colors: true
305
- },
306
- paths: {
307
- include: [],
308
- exclude: ["node_modules", "dist", "build", ".git"],
309
- configDir: ".trie",
310
- outputDir: "trie-reports"
311
- }
312
- };
313
- }
314
- /**
315
- * Validate and provide suggestions for improvement
316
- */
317
- analyze(config) {
318
- const suggestions = [];
319
- const securityIssues = [];
320
- const optimizations = [];
321
- let score = 100;
322
- let hasApiKey = Boolean(config.apiKeys?.anthropic || process.env.ANTHROPIC_API_KEY);
323
- if (!hasApiKey) {
324
- try {
325
- const workDir = getWorkingDirectory(void 0, true);
326
- const envFiles = [".env", ".env.local", ".env.production"];
327
- for (const envFile of envFiles) {
328
- const envPath = join(workDir, envFile);
329
- if (existsSync(envPath)) {
330
- const envContent = readFileSync(envPath, "utf-8");
331
- if (envContent.includes("ANTHROPIC_API_KEY=")) {
332
- hasApiKey = true;
333
- break;
334
- }
335
- }
336
- }
337
- } catch {
338
- }
339
- }
340
- if (!hasApiKey) {
341
- suggestions.push("Add ANTHROPIC_API_KEY to enable AI-powered analysis for better issue detection. Set in environment, .trie/config.json, or .env file");
342
- score -= 10;
343
- }
344
- if (config.agents?.parallel === false) {
345
- optimizations.push("Enable parallel agent execution for 3-5x faster scans");
346
- score -= 15;
347
- }
348
- if (config.agents?.cache === false) {
349
- optimizations.push("Enable result caching to speed up repeated scans");
350
- score -= 10;
351
- }
352
- if (!config.compliance?.standards || config.compliance.standards.length === 0) {
353
- suggestions.push("Configure compliance standards (SOC2, GDPR, HIPAA, ISO27001, PCI-DSS, SOX, ICFR, etc.) for regulatory requirements");
354
- score -= 5;
355
- }
356
- if (!config.compliance?.falseNegativeDetection?.enabled) {
357
- suggestions.push("Enable false negative detection to prevent compliance gaps");
358
- score -= 3;
359
- }
360
- if (!config.compliance?.continuousValidation) {
361
- suggestions.push("Enable continuous validation for ongoing compliance monitoring");
362
- score -= 2;
363
- }
364
- const hasIntegrations = config.integrations && (config.integrations.github?.enabled || config.integrations.slack?.enabled || config.integrations.jira?.enabled);
365
- if (!hasIntegrations) {
366
- suggestions.push("Consider enabling GitHub/Slack/JIRA integrations for better team collaboration");
367
- score -= 5;
368
- }
369
- if (config.apiKeys) {
370
- securityIssues.push("API keys in config file - consider using environment variables instead");
371
- score -= 20;
372
- }
373
- return {
374
- score: Math.max(0, score),
375
- suggestions,
376
- securityIssues,
377
- optimizations
378
- };
379
- }
380
- };
381
- var DEFAULT_CONFIG = {
382
- version: "1.0.0",
383
- agents: {
384
- enabled: [],
385
- disabled: [],
386
- parallel: true,
387
- maxConcurrency: 4,
388
- timeout: 12e4,
389
- cache: true
390
- },
391
- compliance: {
392
- standards: ["SOC2"],
393
- enforceCompliance: false,
394
- reportFormat: "json"
395
- },
396
- output: {
397
- format: "console",
398
- level: "all",
399
- interactive: false,
400
- streaming: true,
401
- colors: true
402
- },
403
- paths: {
404
- include: [],
405
- exclude: ["node_modules", "dist", "build", ".git", ".next", ".nuxt", "coverage"],
406
- configDir: ".trie",
407
- outputDir: "trie-reports"
408
- }
409
- };
410
-
411
- // src/config/loader.ts
412
- async function loadConfig() {
413
- const validator = new ConfigValidator();
414
- const configPath = join2(getTrieDirectory(getWorkingDirectory(void 0, true)), "config.json");
415
- try {
416
- if (!existsSync2(configPath)) {
417
- return DEFAULT_CONFIG;
418
- }
419
- const configFile = await readFile(configPath, "utf-8");
420
- const userConfig = JSON.parse(configFile);
421
- const merged = mergeConfig(DEFAULT_CONFIG, userConfig);
422
- const result = validator.validateConfig(merged);
423
- if (!result.success) {
424
- if (!isInteractiveMode()) {
425
- console.error("Configuration validation failed:");
426
- for (const error of result.errors) {
427
- console.error(` - ${error}`);
428
- }
429
- }
430
- return DEFAULT_CONFIG;
431
- }
432
- if (!isInteractiveMode()) {
433
- const envValidation = validator.validateEnvironment();
434
- for (const warning of envValidation.warnings) {
435
- console.warn(warning);
436
- }
437
- for (const error of envValidation.errors) {
438
- console.error(error);
439
- }
440
- }
441
- return result.data;
442
- } catch (error) {
443
- if (!isInteractiveMode()) {
444
- console.error("Failed to load config, using defaults:", error);
445
- }
446
- return DEFAULT_CONFIG;
447
- }
448
- }
449
- async function saveConfig(config) {
450
- const configPath = join2(getTrieDirectory(getWorkingDirectory(void 0, true)), "config.json");
451
- const dir = dirname(configPath);
452
- if (!existsSync2(dir)) {
453
- await mkdir(dir, { recursive: true });
454
- }
455
- let existing = {};
456
- if (existsSync2(configPath)) {
457
- try {
458
- const content = await readFile(configPath, "utf-8");
459
- existing = JSON.parse(content);
460
- } catch {
461
- }
462
- }
463
- const toWrite = {
464
- ...existing,
465
- ...config,
466
- // Preserve autonomy block (used by Cursor key, etc.) - TrieConfig doesn't include it
467
- autonomy: existing.autonomy ?? void 0
468
- };
469
- await writeFile(configPath, JSON.stringify(toWrite, null, 2), "utf-8");
470
- }
471
- function mergeConfig(defaults, user) {
472
- if (typeof user !== "object" || user === null || Array.isArray(user)) {
473
- return { ...defaults };
474
- }
475
- const result = { ...defaults };
476
- for (const [key, value] of Object.entries(user)) {
477
- const defaultValue = defaults[key];
478
- if (typeof value === "object" && value !== null && !Array.isArray(value) && typeof defaultValue === "object" && defaultValue !== null) {
479
- result[key] = mergeConfig(defaultValue, value);
480
- } else {
481
- result[key] = value;
482
- }
483
- }
484
- return result;
485
- }
486
-
487
- export {
488
- loadConfig,
489
- saveConfig
490
- };
491
- //# sourceMappingURL=chunk-XPZZFPBZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/loader.ts","../src/config/validation.ts"],"sourcesContent":["import { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { ConfigValidator, DEFAULT_CONFIG, type TrieConfig } from './validation.js';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\nimport { isInteractiveMode } from '../utils/progress.js';\n\nexport async function loadConfig(): Promise<TrieConfig> {\n const validator = new ConfigValidator();\n const configPath = join(getTrieDirectory(getWorkingDirectory(undefined, true)), 'config.json');\n\n try {\n // Look for config in .trie/config.json\n if (!existsSync(configPath)) {\n return DEFAULT_CONFIG;\n }\n\n const configFile = await readFile(configPath, 'utf-8');\n const userConfig = JSON.parse(configFile) as Record<string, unknown>;\n\n // Deep merge with defaults\n const merged = mergeConfig(DEFAULT_CONFIG, userConfig);\n\n // Validate merged config\n const result = validator.validateConfig(merged);\n if (!result.success) {\n // Suppress console output in interactive mode (TUI handles display)\n if (!isInteractiveMode()) {\n console.error('Configuration validation failed:');\n for (const error of result.errors) {\n console.error(` - ${error}`);\n }\n }\n return DEFAULT_CONFIG;\n }\n\n // Environment validation warnings (skip in interactive mode)\n if (!isInteractiveMode()) {\n const envValidation = validator.validateEnvironment();\n for (const warning of envValidation.warnings) {\n console.warn(warning);\n }\n for (const error of envValidation.errors) {\n console.error(error);\n }\n }\n\n return result.data;\n } catch (error) {\n // If no config found, return defaults (suppress in interactive mode)\n if (!isInteractiveMode()) {\n console.error('Failed to load config, using defaults:', error);\n }\n return DEFAULT_CONFIG;\n }\n}\n\nexport async function saveConfig(config: TrieConfig): Promise<void> {\n const configPath = join(getTrieDirectory(getWorkingDirectory(undefined, true)), 'config.json');\n const dir = dirname(configPath);\n\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n // Preserve autonomy and other top-level keys (e.g. cursorApiKey) when saving TrieConfig\n let existing: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n const content = await readFile(configPath, 'utf-8');\n existing = JSON.parse(content) as Record<string, unknown>;\n } catch {\n // Ignore parse errors, overwrite\n }\n }\n\n const toWrite = {\n ...existing,\n ...config,\n // Preserve autonomy block (used by Cursor key, etc.) - TrieConfig doesn't include it\n autonomy: existing.autonomy ?? undefined,\n };\n\n await writeFile(configPath, JSON.stringify(toWrite, null, 2), 'utf-8');\n}\n\nfunction mergeConfig<T extends Record<string, unknown>>(defaults: T, user: Record<string, unknown>): T {\n if (typeof user !== 'object' || user === null || Array.isArray(user)) {\n return { ...defaults };\n }\n\n const result = { ...defaults } as T;\n\n for (const [key, value] of Object.entries(user)) {\n const defaultValue = defaults[key as keyof T];\n if (typeof value === 'object' && value !== null && !Array.isArray(value) && typeof defaultValue === 'object' && defaultValue !== null) {\n result[key as keyof T] = mergeConfig(defaultValue as Record<string, unknown>, value as Record<string, unknown>) as T[keyof T];\n } else {\n result[key as keyof T] = value as T[keyof T];\n }\n }\n\n return result;\n}","import { z } from 'zod';\nimport { existsSync, readFileSync, mkdirSync } from 'fs';\nimport { resolve, join } from 'path';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\n\n// API key validation patterns (strict for Anthropic/OpenAI; lenient for integrations)\nconst API_KEY_PATTERNS = {\n anthropic: /^sk-ant-api\\d{2}-[\\w-]{95}$/,\n openai: /^sk-[\\w]{48}$/,\n github: /^ghp_[\\w]{36}$/,\n vercel: /^[\\w]{24}$/,\n linear: /^lin_api_[\\w]{40,60}$/,\n} as const;\n\n// Configuration schemas\nconst ApiKeysSchema = z.object({\n anthropic: z.string().regex(API_KEY_PATTERNS.anthropic, 'Invalid Anthropic API key format').optional(),\n openai: z.string().regex(API_KEY_PATTERNS.openai, 'Invalid OpenAI API key format').optional(),\n // Lenient: accept GitHub classic (ghp_*), fine-grained (github_pat_*), or any string 10+ chars\n github: z.string().min(10).optional(),\n vercel: z.string().regex(API_KEY_PATTERNS.vercel, 'Invalid Vercel token format').optional(),\n linear: z.string().optional(),\n cursor: z.string().optional(),\n});\n\nconst AgentConfigSchema = z.object({\n enabled: z.array(z.string()).optional().default([]),\n disabled: z.array(z.string()).optional().default([]),\n parallel: z.boolean().optional().default(true),\n maxConcurrency: z.number().int().min(1).max(20).optional().default(4),\n timeout: z.number().int().min(1000).max(300000).optional().default(120000), // 2 minutes\n cache: z.boolean().optional().default(true),\n});\n\nconst ComplianceSchema = z.object({\n standards: z.array(z.enum(['SOC2', 'GDPR', 'HIPAA', 'CCPA', 'PCI-DSS', 'ISO27001', 'FDA21CFR11', 'SOX', 'ICFR', 'GLBA', 'FFIEC', 'FINRA'])).optional().default(['SOC2']),\n enforceCompliance: z.boolean().optional().default(false),\n reportFormat: z.enum(['json', 'sarif', 'csv', 'html']).optional().default('json'),\n // Enhanced validation to prevent false negatives\n continuousValidation: z.boolean().optional().default(true),\n mandatoryAuditTrail: z.boolean().optional().default(true),\n falseNegativeDetection: z.object({\n enabled: z.boolean().optional().default(true),\n crossValidation: z.boolean().optional().default(true),\n humanReviewRequired: z.boolean().optional().default(false),\n samplingRate: z.number().min(0).max(1).optional().default(0.1), // 10% sampling\n }).optional().default({\n enabled: true,\n crossValidation: true,\n humanReviewRequired: false,\n samplingRate: 0.1,\n }),\n});\n\nconst OutputSchema = z.object({\n format: z.enum(['console', 'json', 'sarif', 'junit']).optional().default('console'),\n level: z.enum(['critical', 'serious', 'moderate', 'low', 'all']).optional().default('all'),\n interactive: z.boolean().optional().default(false),\n streaming: z.boolean().optional().default(true),\n colors: z.boolean().optional().default(true),\n});\n\nconst PathsSchema = z.object({\n include: z.array(z.string()).optional().default([]),\n exclude: z.array(z.string()).optional().default(['node_modules', 'dist', 'build', '.git']),\n configDir: z.string().optional().default('.trie'),\n outputDir: z.string().optional().default('trie-reports'),\n});\n\nconst IntegrationsSchema = z.object({\n github: z.object({\n enabled: z.boolean().optional().default(false),\n token: z.string().optional(),\n webhook: z.string().url().optional(),\n }).optional(),\n slack: z.object({\n enabled: z.boolean().optional().default(false),\n webhook: z.string().url().optional(),\n channel: z.string().optional(),\n }).optional(),\n jira: z.object({\n enabled: z.boolean().optional().default(false),\n url: z.string().url().optional(),\n token: z.string().optional(),\n project: z.string().optional(),\n }).optional(),\n});\n\n// User identity for attribution tracking\nconst UserSchema = z.object({\n name: z.string().min(1).optional(),\n email: z.string().email().optional(),\n role: z.enum([\n 'developer',\n 'designer', \n 'qa',\n 'devops',\n 'security',\n 'architect',\n 'manager',\n 'contributor'\n ]).optional().default('developer'),\n github: z.string().optional(), // GitHub username\n url: z.string().url().optional(), // Personal/portfolio URL\n});\n\nexport const TrieConfigSchema = z.object({\n version: z.string().optional().default('1.0.0'),\n apiKeys: ApiKeysSchema.optional(),\n agents: AgentConfigSchema.optional(),\n compliance: ComplianceSchema.optional(),\n output: OutputSchema.optional(),\n paths: PathsSchema.optional(),\n integrations: IntegrationsSchema.optional(),\n user: UserSchema.optional(), // User identity for attribution\n});\n\nexport type TrieConfig = z.infer<typeof TrieConfigSchema>;\nexport type ApiKeys = z.infer<typeof ApiKeysSchema>;\nexport type AgentConfig = z.infer<typeof AgentConfigSchema>;\n\n/**\n * Configuration validator with detailed error reporting\n */\nexport class ConfigValidator {\n /**\n * Validate configuration object\n */\n validateConfig(config: unknown): { success: true; data: TrieConfig } | { success: false; errors: string[] } {\n try {\n const validated = TrieConfigSchema.parse(config);\n\n // Additional business logic validation\n const businessErrors = this.validateBusinessLogic(validated);\n if (businessErrors.length > 0) {\n return { success: false, errors: businessErrors };\n }\n\n return { success: true, data: validated };\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errors = error.errors.map(err =>\n `${err.path.join('.')}: ${err.message}`\n );\n return { success: false, errors };\n }\n\n return {\n success: false,\n errors: [`Configuration validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`]\n };\n }\n }\n\n /**\n * Validate environment variables for API keys\n */\n validateEnvironment(): { valid: boolean; warnings: string[]; errors: string[] } {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n // Check for potentially exposed secrets\n const exposedPatterns = [\n 'NEXT_PUBLIC_ANTHROPIC',\n 'REACT_APP_ANTHROPIC',\n 'VITE_ANTHROPIC',\n 'PUBLIC_ANTHROPIC'\n ];\n\n for (const pattern of exposedPatterns) {\n const envVars = Object.keys(process.env).filter(key => key.includes(pattern));\n for (const envVar of envVars) {\n errors.push(`[!] Security risk: API key in client-side environment variable: ${envVar}`);\n }\n }\n\n // Check API key format if present (check env var first, then config)\n let anthropicKey = process.env.ANTHROPIC_API_KEY;\n \n // Also check config file if available (for validation purposes)\n // Note: This is a read-only check for validation, actual usage goes through isAIAvailable()\n if (!anthropicKey) {\n try {\n const configPath = join(getTrieDirectory(getWorkingDirectory(undefined, true)), 'config.json');\n if (existsSync(configPath)) {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n anthropicKey = config.apiKeys?.anthropic;\n }\n } catch {\n // Config file check failed, continue with env var only\n }\n }\n \n if (anthropicKey && !API_KEY_PATTERNS.anthropic.test(anthropicKey)) {\n errors.push('ANTHROPIC_API_KEY does not match expected format');\n }\n\n // Warnings for missing optional keys\n if (!anthropicKey) {\n warnings.push('ANTHROPIC_API_KEY not set - AI features will be disabled. Set in environment, .trie/config.json, or .env file');\n }\n\n if (!process.env.GITHUB_TOKEN && process.env.CI) {\n warnings.push('GITHUB_TOKEN not set - GitHub integration disabled');\n }\n\n return {\n valid: errors.length === 0,\n warnings,\n errors\n };\n }\n\n /**\n * Validate file paths in configuration\n */\n validatePaths(paths: z.infer<typeof PathsSchema>): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (paths?.include) {\n for (const path of paths.include) {\n const resolvedPath = resolve(path);\n if (!existsSync(resolvedPath)) {\n errors.push(`Include path does not exist: ${path}`);\n }\n }\n }\n\n if (paths?.configDir) {\n const configPath = resolve(paths.configDir);\n if (!existsSync(configPath)) {\n try {\n // Try to create the directory\n mkdirSync(configPath, { recursive: true });\n } catch {\n errors.push(`Cannot create config directory: ${paths.configDir}`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n }\n\n /**\n * Validate integration configurations\n */\n validateIntegrations(integrations: z.infer<typeof IntegrationsSchema>): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // GitHub integration\n if (integrations?.github?.enabled) {\n if (!integrations.github.token) {\n errors.push('GitHub integration enabled but no token provided');\n }\n }\n\n // Slack integration\n if (integrations?.slack?.enabled) {\n if (!integrations.slack.webhook) {\n errors.push('Slack integration enabled but no webhook URL provided');\n }\n }\n\n // JIRA integration\n if (integrations?.jira?.enabled) {\n if (!integrations.jira.url || !integrations.jira.token || !integrations.jira.project) {\n errors.push('JIRA integration enabled but missing required fields (url, token, project)');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n }\n\n /**\n * Business logic validation\n */\n private validateBusinessLogic(config: TrieConfig): string[] {\n const errors: string[] = [];\n\n // Agent configuration validation\n if (config.agents?.enabled && config.agents?.disabled) {\n const overlap = config.agents.enabled.filter(agent =>\n config.agents?.disabled?.includes(agent)\n );\n if (overlap.length > 0) {\n errors.push(`Agents cannot be both enabled and disabled: ${overlap.join(', ')}`);\n }\n }\n\n // Concurrency validation\n if (config.agents?.maxConcurrency && config.agents.maxConcurrency > 10) {\n errors.push('maxConcurrency should not exceed 10 for optimal performance');\n }\n\n // Compliance standards validation\n if (config.compliance?.standards) {\n const validStandards = ['SOC2', 'GDPR', 'HIPAA', 'CCPA', 'PCI-DSS', 'ISO27001', 'FDA21CFR11', 'SOX', 'ICFR', 'GLBA', 'FFIEC', 'FINRA'];\n const invalidStandards = config.compliance.standards.filter(standard =>\n !validStandards.includes(standard)\n );\n if (invalidStandards.length > 0) {\n errors.push(`Invalid compliance standards: ${invalidStandards.join(', ')}. Valid standards: ${validStandards.join(', ')}`);\n }\n }\n\n // Path validation\n if (config.paths) {\n const pathValidation = this.validatePaths(config.paths);\n errors.push(...pathValidation.errors);\n }\n\n // Integration validation\n if (config.integrations) {\n const integrationValidation = this.validateIntegrations(config.integrations);\n errors.push(...integrationValidation.errors);\n }\n\n return errors;\n }\n\n /**\n * Generate configuration template\n */\n generateTemplate(): TrieConfig {\n return {\n version: '1.0.0',\n agents: {\n enabled: ['security', 'bugs', 'types'],\n disabled: [],\n parallel: true,\n maxConcurrency: 4,\n timeout: 120000,\n cache: true\n },\n compliance: {\n standards: ['SOC2'],\n enforceCompliance: false,\n reportFormat: 'json'\n },\n output: {\n format: 'console',\n level: 'all',\n interactive: false,\n streaming: true,\n colors: true\n },\n paths: {\n include: [],\n exclude: ['node_modules', 'dist', 'build', '.git'],\n configDir: '.trie',\n outputDir: 'trie-reports'\n }\n };\n }\n\n /**\n * Validate and provide suggestions for improvement\n */\n analyze(config: TrieConfig): {\n score: number;\n suggestions: string[];\n securityIssues: string[];\n optimizations: string[];\n } {\n const suggestions: string[] = [];\n const securityIssues: string[] = [];\n const optimizations: string[] = [];\n let score = 100;\n\n // Check for AI enhancement (check config, env var, and .env files)\n let hasApiKey = Boolean(config.apiKeys?.anthropic || process.env.ANTHROPIC_API_KEY);\n if (!hasApiKey) {\n // Check .env files as well\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const envFiles = ['.env', '.env.local', '.env.production'];\n for (const envFile of envFiles) {\n const envPath = join(workDir, envFile);\n if (existsSync(envPath)) {\n const envContent = readFileSync(envPath, 'utf-8');\n if (envContent.includes('ANTHROPIC_API_KEY=')) {\n hasApiKey = true;\n break;\n }\n }\n }\n } catch {\n // .env check failed, continue\n }\n }\n \n if (!hasApiKey) {\n suggestions.push('Add ANTHROPIC_API_KEY to enable AI-powered analysis for better issue detection. Set in environment, .trie/config.json, or .env file');\n score -= 10;\n }\n\n // Check parallel execution\n if (config.agents?.parallel === false) {\n optimizations.push('Enable parallel agent execution for 3-5x faster scans');\n score -= 15;\n }\n\n // Check caching\n if (config.agents?.cache === false) {\n optimizations.push('Enable result caching to speed up repeated scans');\n score -= 10;\n }\n\n // Check compliance standards\n if (!config.compliance?.standards || config.compliance.standards.length === 0) {\n suggestions.push('Configure compliance standards (SOC2, GDPR, HIPAA, ISO27001, PCI-DSS, SOX, ICFR, etc.) for regulatory requirements');\n score -= 5;\n }\n\n // Check false negative detection\n if (!config.compliance?.falseNegativeDetection?.enabled) {\n suggestions.push('Enable false negative detection to prevent compliance gaps');\n score -= 3;\n }\n\n // Check continuous validation\n if (!config.compliance?.continuousValidation) {\n suggestions.push('Enable continuous validation for ongoing compliance monitoring');\n score -= 2;\n }\n\n // Check integrations for team collaboration\n const hasIntegrations = config.integrations && (\n config.integrations.github?.enabled ||\n config.integrations.slack?.enabled ||\n config.integrations.jira?.enabled\n );\n if (!hasIntegrations) {\n suggestions.push('Consider enabling GitHub/Slack/JIRA integrations for better team collaboration');\n score -= 5;\n }\n\n // Security checks\n if (config.apiKeys) {\n securityIssues.push('API keys in config file - consider using environment variables instead');\n score -= 20;\n }\n\n return {\n score: Math.max(0, score),\n suggestions,\n securityIssues,\n optimizations\n };\n }\n}\n\n/**\n * Default configuration with security best practices\n */\nexport const DEFAULT_CONFIG: TrieConfig = {\n version: '1.0.0',\n agents: {\n enabled: [],\n disabled: [],\n parallel: true,\n maxConcurrency: 4,\n timeout: 120000,\n cache: true,\n },\n compliance: {\n standards: ['SOC2'],\n enforceCompliance: false,\n reportFormat: 'json',\n },\n output: {\n format: 'console',\n level: 'all',\n interactive: false,\n streaming: true,\n colors: true,\n },\n paths: {\n include: [],\n exclude: ['node_modules', 'dist', 'build', '.git', '.next', '.nuxt', 'coverage'],\n configDir: '.trie',\n outputDir: 'trie-reports',\n },\n};\n\n/**\n * Validate startup configuration\n */\nexport function validateStartupConfig(): {\n valid: boolean;\n config: TrieConfig;\n warnings: string[];\n errors: string[];\n} {\n const validator = new ConfigValidator();\n\n // Validate environment\n const envValidation = validator.validateEnvironment();\n\n // Use default config as base\n const configResult = validator.validateConfig(DEFAULT_CONFIG);\n\n if (!configResult.success) {\n return {\n valid: false,\n config: DEFAULT_CONFIG,\n warnings: envValidation.warnings,\n errors: [...envValidation.errors, ...configResult.errors]\n };\n }\n\n return {\n valid: envValidation.valid,\n config: configResult.data,\n warnings: envValidation.warnings,\n errors: envValidation.errors\n };\n}"],"mappings":"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","names":["existsSync","join","join","existsSync"]}