trace-sec 2.1.6 → 2.1.7

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 (125) hide show
  1. package/bin/postinstall.js +121 -0
  2. package/bin/trace.js +82 -17
  3. package/package.json +12 -5
  4. package/requirements.txt +15 -0
  5. package/src/trace_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  6. package/src/trace_engine/__pycache__/cli.cpython-311.pyc +0 -0
  7. package/src/trace_engine/__pycache__/doctor.cpython-311.pyc +0 -0
  8. package/src/trace_engine/__pycache__/interactive.cpython-311.pyc +0 -0
  9. package/src/trace_engine/__pycache__/verify.cpython-311.pyc +0 -0
  10. package/src/trace_engine/ai/__pycache__/__init__.cpython-311.pyc +0 -0
  11. package/src/trace_engine/ai/__pycache__/base.cpython-311.pyc +0 -0
  12. package/src/trace_engine/ai/__pycache__/ollama.cpython-311.pyc +0 -0
  13. package/src/trace_engine/ai/__pycache__/planner.cpython-311.pyc +0 -0
  14. package/src/trace_engine/apm/__pycache__/__init__.cpython-311.pyc +0 -0
  15. package/src/trace_engine/apm/__pycache__/builder.cpython-311.pyc +0 -0
  16. package/src/trace_engine/apm/__pycache__/edges.cpython-311.pyc +0 -0
  17. package/src/trace_engine/apm/__pycache__/model.cpython-311.pyc +0 -0
  18. package/src/trace_engine/apm/__pycache__/nodes.cpython-311.pyc +0 -0
  19. package/src/trace_engine/apm/__pycache__/serialization.cpython-311.pyc +0 -0
  20. package/src/trace_engine/benchmark/__pycache__/__init__.cpython-311.pyc +0 -0
  21. package/src/trace_engine/benchmark/__pycache__/owasp.cpython-311.pyc +0 -0
  22. package/src/trace_engine/config/__pycache__/__init__.cpython-311.pyc +0 -0
  23. package/src/trace_engine/config/__pycache__/defaults.cpython-311.pyc +0 -0
  24. package/src/trace_engine/config/__pycache__/loader.cpython-311.pyc +0 -0
  25. package/src/trace_engine/config/__pycache__/settings.cpython-311.pyc +0 -0
  26. package/src/trace_engine/findings/__pycache__/__init__.cpython-311.pyc +0 -0
  27. package/src/trace_engine/findings/__pycache__/correlate.cpython-311.pyc +0 -0
  28. package/src/trace_engine/findings/__pycache__/model.cpython-311.pyc +0 -0
  29. package/src/trace_engine/findings/__pycache__/recommendations.cpython-311.pyc +0 -0
  30. package/src/trace_engine/findings/__pycache__/store.cpython-311.pyc +0 -0
  31. package/src/trace_engine/framework/__pycache__/__init__.cpython-311.pyc +0 -0
  32. package/src/trace_engine/framework/__pycache__/base.cpython-311.pyc +0 -0
  33. package/src/trace_engine/framework/__pycache__/csharp.cpython-311.pyc +0 -0
  34. package/src/trace_engine/framework/__pycache__/dart.cpython-311.pyc +0 -0
  35. package/src/trace_engine/framework/__pycache__/django.cpython-311.pyc +0 -0
  36. package/src/trace_engine/framework/__pycache__/express.cpython-311.pyc +0 -0
  37. package/src/trace_engine/framework/__pycache__/fastapi.cpython-311.pyc +0 -0
  38. package/src/trace_engine/framework/__pycache__/flask.cpython-311.pyc +0 -0
  39. package/src/trace_engine/framework/__pycache__/go.cpython-311.pyc +0 -0
  40. package/src/trace_engine/framework/__pycache__/nextjs.cpython-311.pyc +0 -0
  41. package/src/trace_engine/framework/__pycache__/php.cpython-311.pyc +0 -0
  42. package/src/trace_engine/framework/__pycache__/react_router.cpython-311.pyc +0 -0
  43. package/src/trace_engine/framework/__pycache__/ruby.cpython-311.pyc +0 -0
  44. package/src/trace_engine/framework/__pycache__/rust.cpython-311.pyc +0 -0
  45. package/src/trace_engine/framework/__pycache__/springboot.cpython-311.pyc +0 -0
  46. package/src/trace_engine/harness/__pycache__/__init__.cpython-311.pyc +0 -0
  47. package/src/trace_engine/harness/__pycache__/benchmark.cpython-311.pyc +0 -0
  48. package/src/trace_engine/harness/__pycache__/context.cpython-311.pyc +0 -0
  49. package/src/trace_engine/harness/__pycache__/engine.cpython-311.pyc +0 -0
  50. package/src/trace_engine/harness/__pycache__/patcher.cpython-311.pyc +0 -0
  51. package/src/trace_engine/harness/__pycache__/remediators.cpython-311.pyc +0 -0
  52. package/src/trace_engine/ingest/__pycache__/__init__.cpython-311.pyc +0 -0
  53. package/src/trace_engine/ingest/__pycache__/files.cpython-311.pyc +0 -0
  54. package/src/trace_engine/ingest/__pycache__/hashing.cpython-311.pyc +0 -0
  55. package/src/trace_engine/ingest/__pycache__/ignore.cpython-311.pyc +0 -0
  56. package/src/trace_engine/ingest/__pycache__/repository.cpython-311.pyc +0 -0
  57. package/src/trace_engine/intelligence/__pycache__/__init__.cpython-311.pyc +0 -0
  58. package/src/trace_engine/intelligence/__pycache__/downloader.cpython-311.pyc +0 -0
  59. package/src/trace_engine/intelligence/__pycache__/evaluation.cpython-311.pyc +0 -0
  60. package/src/trace_engine/intelligence/__pycache__/orchestrator.cpython-311.pyc +0 -0
  61. package/src/trace_engine/intelligence/__pycache__/tracebench.cpython-311.pyc +0 -0
  62. package/src/trace_engine/intelligence/laya/__pycache__/__init__.cpython-311.pyc +0 -0
  63. package/src/trace_engine/intelligence/laya/__pycache__/prompts.cpython-311.pyc +0 -0
  64. package/src/trace_engine/intelligence/laya/__pycache__/router.cpython-311.pyc +0 -0
  65. package/src/trace_engine/intelligence/laya/__pycache__/schemas.cpython-311.pyc +0 -0
  66. package/src/trace_engine/intelligence/laya/__pycache__/telemetry.cpython-311.pyc +0 -0
  67. package/src/trace_engine/intelligence/laya/__pycache__/thresholds.cpython-311.pyc +0 -0
  68. package/src/trace_engine/intelligence/securebert/__pycache__/__init__.cpython-311.pyc +0 -0
  69. package/src/trace_engine/intelligence/securebert/__pycache__/cache.cpython-311.pyc +0 -0
  70. package/src/trace_engine/intelligence/securebert/__pycache__/classifier.cpython-311.pyc +0 -0
  71. package/src/trace_engine/intelligence/training/__pycache__/__init__.cpython-311.pyc +0 -0
  72. package/src/trace_engine/intelligence/training/__pycache__/dataset.cpython-311.pyc +0 -0
  73. package/src/trace_engine/intelligence/training/__pycache__/dataset_importers.cpython-311.pyc +0 -0
  74. package/src/trace_engine/intelligence/training/__pycache__/laya_trainer.cpython-311.pyc +0 -0
  75. package/src/trace_engine/intelligence/training/__pycache__/lora_system2.cpython-311.pyc +0 -0
  76. package/src/trace_engine/intelligence/training/__pycache__/morefixes_pipeline.cpython-311.pyc +0 -0
  77. package/src/trace_engine/intelligence/training/__pycache__/slicer.cpython-311.pyc +0 -0
  78. package/src/trace_engine/intelligence/training/__pycache__/train_all.cpython-311.pyc +0 -0
  79. package/src/trace_engine/intelligence/training/__pycache__/trainer.cpython-311.pyc +0 -0
  80. package/src/trace_engine/mcp/__pycache__/__init__.cpython-311.pyc +0 -0
  81. package/src/trace_engine/mcp/__pycache__/config.cpython-311.pyc +0 -0
  82. package/src/trace_engine/mcp/__pycache__/server.cpython-311.pyc +0 -0
  83. package/src/trace_engine/output/__pycache__/__init__.cpython-311.pyc +0 -0
  84. package/src/trace_engine/output/__pycache__/html.cpython-311.pyc +0 -0
  85. package/src/trace_engine/output/__pycache__/markdown.cpython-311.pyc +0 -0
  86. package/src/trace_engine/output/__pycache__/sarif.cpython-311.pyc +0 -0
  87. package/src/trace_engine/output/__pycache__/terminal.cpython-311.pyc +0 -0
  88. package/src/trace_engine/parsing/__pycache__/__init__.cpython-311.pyc +0 -0
  89. package/src/trace_engine/parsing/__pycache__/calls.cpython-311.pyc +0 -0
  90. package/src/trace_engine/parsing/__pycache__/language.cpython-311.pyc +0 -0
  91. package/src/trace_engine/parsing/__pycache__/locations.cpython-311.pyc +0 -0
  92. package/src/trace_engine/parsing/__pycache__/parser.cpython-311.pyc +0 -0
  93. package/src/trace_engine/parsing/__pycache__/symbols.cpython-311.pyc +0 -0
  94. package/src/trace_engine/plugin/__pycache__/__init__.cpython-311.pyc +0 -0
  95. package/src/trace_engine/plugin/__pycache__/evaluator.cpython-311.pyc +0 -0
  96. package/src/trace_engine/plugin/__pycache__/swebench_adapter.cpython-311.pyc +0 -0
  97. package/src/trace_engine/plugin/__pycache__/task.cpython-311.pyc +0 -0
  98. package/src/trace_engine/policy/__pycache__/__init__.cpython-311.pyc +0 -0
  99. package/src/trace_engine/policy/__pycache__/scope.cpython-311.pyc +0 -0
  100. package/src/trace_engine/runtime/__pycache__/__init__.cpython-311.pyc +0 -0
  101. package/src/trace_engine/runtime/__pycache__/client.cpython-311.pyc +0 -0
  102. package/src/trace_engine/runtime/__pycache__/observations.cpython-311.pyc +0 -0
  103. package/src/trace_engine/runtime/__pycache__/target.cpython-311.pyc +0 -0
  104. package/src/trace_engine/security/__pycache__/__init__.cpython-311.pyc +0 -0
  105. package/src/trace_engine/security/__pycache__/fusion.cpython-311.pyc +0 -0
  106. package/src/trace_engine/security/__pycache__/hypotheses.cpython-311.pyc +0 -0
  107. package/src/trace_engine/security/__pycache__/signals.cpython-311.pyc +0 -0
  108. package/src/trace_engine/security/__pycache__/timing.cpython-311.pyc +0 -0
  109. package/src/trace_engine/testpacks/__pycache__/__init__.cpython-311.pyc +0 -0
  110. package/src/trace_engine/testpacks/__pycache__/authentication.cpython-311.pyc +0 -0
  111. package/src/trace_engine/testpacks/__pycache__/base.cpython-311.pyc +0 -0
  112. package/src/trace_engine/testpacks/__pycache__/bfla.cpython-311.pyc +0 -0
  113. package/src/trace_engine/testpacks/__pycache__/bola.cpython-311.pyc +0 -0
  114. package/src/trace_engine/testpacks/__pycache__/cors.cpython-311.pyc +0 -0
  115. package/src/trace_engine/testpacks/__pycache__/deserialization.cpython-311.pyc +0 -0
  116. package/src/trace_engine/testpacks/__pycache__/injection.cpython-311.pyc +0 -0
  117. package/src/trace_engine/testpacks/__pycache__/mass_assignment.cpython-311.pyc +0 -0
  118. package/src/trace_engine/testpacks/__pycache__/path_traversal.cpython-311.pyc +0 -0
  119. package/src/trace_engine/testpacks/__pycache__/registry.cpython-311.pyc +0 -0
  120. package/src/trace_engine/testpacks/__pycache__/ssrf.cpython-311.pyc +0 -0
  121. package/src/trace_engine/testpacks/__pycache__/ssti.cpython-311.pyc +0 -0
  122. package/src/trace_engine/tools/__pycache__/__init__.cpython-311.pyc +0 -0
  123. package/src/trace_engine/tools/__pycache__/adapters.cpython-311.pyc +0 -0
  124. package/src/trace_engine/tools/__pycache__/base.cpython-311.pyc +0 -0
  125. package/src/trace_engine/tools/__pycache__/registry.cpython-311.pyc +0 -0
@@ -0,0 +1,121 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * TRACE Post-Install Script
5
+ * Automatically provisions Python runtime and core dependencies during `npm install`.
6
+ */
7
+
8
+ import { execSync } from 'child_process';
9
+ import { existsSync, mkdirSync } from 'fs';
10
+ import { resolve, join, dirname } from 'path';
11
+ import { fileURLToPath } from 'url';
12
+
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = dirname(__filename);
15
+ const projectRoot = resolve(__dirname, '..');
16
+
17
+ const isWin = process.platform === 'win32';
18
+ const userHome = process.env.USERPROFILE || process.env.HOME || '';
19
+ const dedicatedDir = join(userHome, '.trace');
20
+ const dedicatedVenv = join(dedicatedDir, 'venv');
21
+ const venvPython = join(dedicatedVenv, isWin ? 'Scripts' : 'bin', isWin ? 'python.exe' : 'python');
22
+ const venvPip = join(dedicatedVenv, isWin ? 'Scripts' : 'bin', isWin ? 'pip.exe' : 'pip');
23
+ const reqFile = join(projectRoot, 'requirements.txt');
24
+
25
+ function findSystemPython() {
26
+ const candidates = isWin
27
+ ? [
28
+ 'python',
29
+ 'py -3',
30
+ 'py',
31
+ 'python3',
32
+ join(process.env.LOCALAPPDATA || '', 'Programs', 'Python', 'Python312', 'python.exe'),
33
+ join(process.env.LOCALAPPDATA || '', 'Programs', 'Python', 'Python311', 'python.exe'),
34
+ join(process.env.LOCALAPPDATA || '', 'Programs', 'Python', 'Python310', 'python.exe'),
35
+ join(process.env.PROGRAMFILES || '', 'Python312', 'python.exe'),
36
+ join(process.env.PROGRAMFILES || '', 'Python311', 'python.exe'),
37
+ join(process.env.PROGRAMFILES || '', 'Python310', 'python.exe'),
38
+ ]
39
+ : [
40
+ 'python3',
41
+ 'python',
42
+ '/usr/bin/python3',
43
+ '/usr/local/bin/python3',
44
+ '/opt/homebrew/bin/python3',
45
+ ];
46
+
47
+ for (const cmd of candidates) {
48
+ if (!cmd || !cmd.trim()) continue;
49
+ try {
50
+ const execCmd = cmd.includes(' ') && !cmd.startsWith('py ') ? `"${cmd}"` : cmd;
51
+ const ver = execSync(`${execCmd} -c "import sys; print(sys.version_info[0], sys.version_info[1])"`, {
52
+ stdio: ['ignore', 'pipe', 'ignore'],
53
+ encoding: 'utf-8',
54
+ }).trim();
55
+ const parts = ver.split(/\s+/).map(Number);
56
+ if (parts[0] === 3 && parts[1] >= 9) {
57
+ return execCmd;
58
+ }
59
+ } catch {
60
+ // try next candidate
61
+ }
62
+ }
63
+ return null;
64
+ }
65
+
66
+ try {
67
+ console.log('\n\x1b[32m\x1b[1m[TRACE]\x1b[0m Configuring environment for autonomous security verification...');
68
+
69
+ mkdirSync(dedicatedDir, { recursive: true });
70
+
71
+ const sysPython = findSystemPython();
72
+ if (!sysPython) {
73
+ console.log(' \x1b[38;2;255;158;59m•\x1b[0m Python 3.10+ not detected on PATH yet.');
74
+ console.log(' \x1b[38;2;255;158;59m•\x1b[0m Quick install:');
75
+ if (isWin) {
76
+ console.log(' \x1b[36mwinget install Python.Python.3.11\x1b[0m');
77
+ } else if (process.platform === 'darwin') {
78
+ console.log(' \x1b[36mbrew install python\x1b[0m');
79
+ } else {
80
+ console.log(' \x1b[36msudo apt install -y python3 python3-pip python3-venv\x1b[0m');
81
+ }
82
+ console.log(' Once installed, dependencies will configure automatically on first run.\n');
83
+ process.exit(0);
84
+ }
85
+
86
+ // Create virtualenv if not already created
87
+ if (!existsSync(venvPython)) {
88
+ console.log(` \x1b[38;2;255;158;59m›\x1b[0m Initializing isolated Python environment in ${dedicatedVenv}...`);
89
+ execSync(`${sysPython} -m venv "${dedicatedVenv}"`, { stdio: 'inherit' });
90
+ }
91
+
92
+ // Check if dependencies are already satisfied
93
+ let depsOk = false;
94
+ try {
95
+ execSync(`"${venvPython}" -c "import typer, rich, pydantic, tree_sitter"`, {
96
+ stdio: 'ignore',
97
+ });
98
+ depsOk = true;
99
+ } catch {
100
+ depsOk = false;
101
+ }
102
+
103
+ if (!depsOk) {
104
+ console.log(' \x1b[38;2;255;158;59m›\x1b[0m Installing core Python dependencies into dedicated environment...');
105
+ if (existsSync(reqFile)) {
106
+ execSync(`"${venvPython}" -m pip install -r "${reqFile}"`, { stdio: 'inherit' });
107
+ } else {
108
+ execSync(`"${venvPython}" -m pip install typer rich pydantic pydantic-settings networkx httpx orjson tomli-w tree-sitter tree-sitter-language-pack onnxruntime transformers safetensors numpy`, { stdio: 'inherit' });
109
+ }
110
+ console.log(' \x1b[32m✓\x1b[0m Dependencies successfully attached and verified.');
111
+ } else {
112
+ console.log(' \x1b[32m✓\x1b[0m Dedicated runtime dependencies already up to date.');
113
+ }
114
+
115
+ console.log('\x1b[32m\x1b[1m✓ TRACE ready to run!\x1b[0m Type \x1b[36mtrace\x1b[0m or \x1b[36mnpx trace-sec\x1b[0m to launch.\n');
116
+ } catch (err) {
117
+ // Never fail npm install completely on postinstall warning
118
+ console.log(` \x1b[38;2;255;158;59m[TRACE]\x1b[0m Background setup notice: ${err.message}`);
119
+ console.log(' Dependencies will be verified when you run \x1b[36mtrace\x1b[0m.\n');
120
+ }
121
+
package/bin/trace.js CHANGED
@@ -84,17 +84,60 @@ if (args[0] === 'install-skill' || args[0] === 'setup-agent' || args[0] === 'ins
84
84
  // Find virtual environment python or system python
85
85
  const isWin = process.platform === 'win32';
86
86
  const userHome = process.env.USERPROFILE || process.env.HOME || '';
87
+ const dedicatedVenv = join(userHome, '.trace', 'venv');
88
+ const dedicatedPython = join(dedicatedVenv, isWin ? 'Scripts' : 'bin', isWin ? 'python.exe' : 'python');
89
+ const dedicatedPip = join(dedicatedVenv, isWin ? 'Scripts' : 'bin', isWin ? 'pip.exe' : 'pip');
90
+ const reqFile = join(projectRoot, 'requirements.txt');
91
+
92
+ function findSystemPython() {
93
+ const candidates = isWin
94
+ ? [
95
+ 'python',
96
+ 'py -3',
97
+ 'py',
98
+ 'python3',
99
+ join(process.env.LOCALAPPDATA || '', 'Programs', 'Python', 'Python312', 'python.exe'),
100
+ join(process.env.LOCALAPPDATA || '', 'Programs', 'Python', 'Python311', 'python.exe'),
101
+ join(process.env.LOCALAPPDATA || '', 'Programs', 'Python', 'Python310', 'python.exe'),
102
+ join(process.env.PROGRAMFILES || '', 'Python312', 'python.exe'),
103
+ join(process.env.PROGRAMFILES || '', 'Python311', 'python.exe'),
104
+ join(process.env.PROGRAMFILES || '', 'Python310', 'python.exe'),
105
+ ]
106
+ : [
107
+ 'python3',
108
+ 'python',
109
+ '/usr/bin/python3',
110
+ '/usr/local/bin/python3',
111
+ '/opt/homebrew/bin/python3',
112
+ ];
113
+
114
+ for (const cmd of candidates) {
115
+ if (!cmd || !cmd.trim()) continue;
116
+ try {
117
+ const execCmd = cmd.includes(' ') && !cmd.startsWith('py ') ? `"${cmd}"` : cmd;
118
+ const ver = execSync(`${execCmd} -c "import sys; print(sys.version_info[0], sys.version_info[1])"`, {
119
+ stdio: ['ignore', 'pipe', 'ignore'],
120
+ encoding: 'utf-8',
121
+ }).trim();
122
+ const parts = ver.split(/\s+/).map(Number);
123
+ if (parts[0] === 3 && parts[1] >= 9) {
124
+ return execCmd;
125
+ }
126
+ } catch {
127
+ // try next
128
+ }
129
+ }
130
+ return null;
131
+ }
132
+
87
133
  const candidatePythons = [
88
134
  process.env.TRACE_PYTHON,
135
+ dedicatedPython,
89
136
  join(process.cwd(), '.venv', isWin ? 'Scripts' : 'bin', isWin ? 'python.exe' : 'python'),
90
137
  join(projectRoot, '.venv', isWin ? 'Scripts' : 'bin', isWin ? 'python.exe' : 'python'),
91
- isWin ? 'D:\\Startup\\TRACE\\.venv\\Scripts\\python.exe' : null,
92
- join(userHome, '.trace', 'venv', isWin ? 'Scripts' : 'bin', isWin ? 'python.exe' : 'python'),
93
- join(userHome, '.trace', 'models', 'venv', isWin ? 'Scripts' : 'bin', isWin ? 'python.exe' : 'python'),
94
- isWin ? 'python' : 'python3',
95
138
  ];
96
139
 
97
- let pythonBin = isWin ? 'python' : 'python3';
140
+ let pythonBin = null;
98
141
  for (const cand of candidatePythons) {
99
142
  if (cand && existsSync(cand)) {
100
143
  pythonBin = cand;
@@ -102,23 +145,37 @@ for (const cand of candidatePythons) {
102
145
  }
103
146
  }
104
147
 
148
+ if (!pythonBin) {
149
+ pythonBin = findSystemPython();
150
+ }
151
+
152
+ if (!pythonBin) {
153
+ console.error('\n\x1b[31m\x1b[1m[TRACE ERROR]\x1b[0m Python 3.10+ is required to execute TRACE.');
154
+ console.error('Please install Python to proceed:');
155
+ if (isWin) {
156
+ console.error(' \x1b[36mwinget install Python.Python.3.11\x1b[0m (or from https://www.python.org/)\n');
157
+ } else if (process.platform === 'darwin') {
158
+ console.error(' \x1b[36mbrew install python\x1b[0m\n');
159
+ } else {
160
+ console.error(' \x1b[36msudo apt install -y python3 python3-pip python3-venv\x1b[0m\n');
161
+ }
162
+ process.exit(1);
163
+ }
164
+
105
165
  // Verify that the resolved Python environment has required TRACE dependencies
106
166
  let depsOk = false;
107
167
  try {
108
- execSync(`"${pythonBin}" -c "import typer, rich, pydantic"`, { stdio: 'ignore' });
168
+ execSync(`"${pythonBin}" -c "import typer, rich, pydantic, tree_sitter"`, { stdio: 'ignore' });
109
169
  depsOk = true;
110
170
  } catch (e) {
111
171
  depsOk = false;
112
172
  }
113
173
 
114
174
  if (!depsOk) {
115
- const dedicatedVenv = join(userHome, '.trace', 'venv');
116
- const venvPython = join(dedicatedVenv, isWin ? 'Scripts' : 'bin', isWin ? 'python.exe' : 'python');
117
-
118
- if (existsSync(venvPython)) {
175
+ if (existsSync(dedicatedPython)) {
119
176
  try {
120
- execSync(`"${venvPython}" -c "import typer, rich, pydantic"`, { stdio: 'ignore' });
121
- pythonBin = venvPython;
177
+ execSync(`"${dedicatedPython}" -c "import typer, rich, pydantic, tree_sitter"`, { stdio: 'ignore' });
178
+ pythonBin = dedicatedPython;
122
179
  depsOk = true;
123
180
  } catch (e) {
124
181
  depsOk = false;
@@ -129,13 +186,21 @@ if (!depsOk) {
129
186
  console.log('\n\x1b[32m\x1b[1m[TRACE]\x1b[0m Initializing TRACE runtime dependencies in dedicated environment (~/.trace/venv)...');
130
187
  try {
131
188
  mkdirSync(join(userHome, '.trace'), { recursive: true });
132
- if (!existsSync(venvPython)) {
189
+ if (!existsSync(dedicatedPython)) {
133
190
  console.log(' \x1b[38;2;255;158;59m›\x1b[0m Creating Python virtual environment in ~/.trace/venv...');
134
- execSync(`"${pythonBin}" -m venv "${dedicatedVenv}"`, { stdio: 'inherit' });
191
+ const sysPy = findSystemPython();
192
+ if (!sysPy) {
193
+ throw new Error('System Python 3.10+ not found. Please install Python from https://www.python.org/');
194
+ }
195
+ execSync(`${sysPy} -m venv "${dedicatedVenv}"`, { stdio: 'inherit' });
196
+ }
197
+ console.log(' \x1b[38;2;255;158;59m›\x1b[0m Installing core dependencies via pip...');
198
+ if (existsSync(reqFile)) {
199
+ execSync(`"${dedicatedPython}" -m pip install -r "${reqFile}"`, { stdio: 'inherit' });
200
+ } else {
201
+ execSync(`"${dedicatedPython}" -m pip install typer rich pydantic pydantic-settings networkx httpx orjson tomli-w tree-sitter tree-sitter-language-pack onnxruntime transformers safetensors numpy`, { stdio: 'inherit' });
135
202
  }
136
- console.log(' \x1b[38;2;255;158;59m›\x1b[0m Installing core dependencies (typer, rich, pydantic, tree-sitter, torch, transformers)...');
137
- execSync(`"${venvPython}" -m pip install typer rich pydantic pydantic-settings networkx httpx orjson tomli-w tree-sitter tree-sitter-language-pack torch transformers safetensors onnxruntime numpy`, { stdio: 'inherit' });
138
- pythonBin = venvPython;
203
+ pythonBin = dedicatedPython;
139
204
  console.log('\x1b[32m✓ Runtime dependencies provisioned successfully.\x1b[0m\n');
140
205
  } catch (e) {
141
206
  console.warn(`[TRACE] Automatic environment setup warning: ${e.message}`);
package/package.json CHANGED
@@ -1,19 +1,26 @@
1
1
  {
2
2
  "name": "trace-sec",
3
- "version": "2.1.6",
3
+ "version": "2.1.7",
4
4
  "description": "Threat Reconnaissance & Attack-path Correlation Engine — Security Verification Layer for Coding Agents with Fine-Tuned SecureBERT 2.0 & Laya AI",
5
5
  "type": "module",
6
6
  "main": "bin/trace.js",
7
+ "scripts": {
8
+ "postinstall": "node bin/postinstall.js"
9
+ },
7
10
  "bin": {
8
- "trace": "./bin/trace.js",
9
- "trace-sec": "./bin/trace.js",
10
- "trace-security": "./bin/trace.js"
11
+ "trace": "bin/trace.js",
12
+ "trace-sec": "bin/trace.js",
13
+ "trace-security": "bin/trace.js"
11
14
  },
12
15
  "files": [
13
16
  "bin",
14
17
  "src",
15
18
  "README.md",
16
- "pyproject.toml"
19
+ "pyproject.toml",
20
+ "requirements.txt",
21
+ "!**/__pycache__",
22
+ "!**/*.pyc",
23
+ "!**/*.pyo"
17
24
  ],
18
25
  "repository": {
19
26
  "type": "git",
@@ -0,0 +1,15 @@
1
+ typer>=0.12.0
2
+ rich>=13.7.0
3
+ pydantic>=2.7.0
4
+ pydantic-settings>=2.2.0
5
+ networkx>=3.2.0
6
+ httpx>=0.27.0
7
+ orjson>=3.9.0
8
+ tomli-w>=1.0.0
9
+ tree-sitter>=0.21.0
10
+ tree-sitter-language-pack>=0.2.0
11
+ transformers>=4.40.0
12
+ safetensors>=0.4.0
13
+ onnxruntime>=1.17.0
14
+ numpy>=1.24.0
15
+ torch>=2.0.0