torusguard 0.9.5 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/.torusguard/.manifest.json +98 -79
  2. package/.torusguard/config/torusguard.json +1 -1
  3. package/.torusguard/references/csharp-security.md +41 -0
  4. package/.torusguard/references/go-security.md +41 -0
  5. package/.torusguard/references/java-security.md +40 -0
  6. package/.torusguard/references/polyglot-security-matrix.md +25 -0
  7. package/.torusguard/references/rust-security.md +40 -0
  8. package/.torusguard/rules/custom/.gitkeep +1 -0
  9. package/.torusguard/rules/custom/README.md +30 -0
  10. package/.torusguard/runs/report-latest.html +328 -0
  11. package/.torusguard/schemas/golden-recipe.schema.json +75 -0
  12. package/.torusguard/schemas/memory-context.schema.json +95 -0
  13. package/.torusguard/schemas/memory-event.schema.json +70 -0
  14. package/.torusguard/schemas/memory-pattern.schema.json +65 -0
  15. package/.torusguard/scripts/diff_guard.py +202 -15
  16. package/.torusguard/scripts/finding_scorer.py +199 -86
  17. package/.torusguard/scripts/html_reporter.py +628 -0
  18. package/.torusguard/scripts/manifest_builder.py +7 -5
  19. package/.torusguard/scripts/memory_engine.py +1334 -0
  20. package/.torusguard/scripts/monorepo_detector.py +123 -10
  21. package/.torusguard/scripts/rules_sync.py +321 -0
  22. package/.torusguard/scripts/run_manager.py +171 -89
  23. package/.torusguard/scripts/stack_detect.py +458 -26
  24. package/.torusguard/skills/torusguard/SKILL.md +4 -3
  25. package/.torusguard/skills/torusguard/bootstrap.py +344 -56
  26. package/.torusguard/skills/torusguard/references/csharp-security.md +41 -0
  27. package/.torusguard/skills/torusguard/references/go-security.md +41 -0
  28. package/.torusguard/skills/torusguard/references/java-security.md +40 -0
  29. package/.torusguard/skills/torusguard/references/polyglot-security-matrix.md +25 -0
  30. package/.torusguard/skills/torusguard/references/rust-security.md +40 -0
  31. package/.torusguard/skills/torusguard-audit/SKILL.md +25 -25
  32. package/.torusguard/skills/torusguard-harden/SKILL.md +3 -3
  33. package/.torusguard/skills/torusguard-recheck/SKILL.md +3 -3
  34. package/.torusguard/workflows/memory.md +53 -0
  35. package/README.md +307 -401
  36. package/bin/torusguard.js +204 -6
  37. package/package.json +1 -1
  38. package/skills/torusguard/SKILL.md +4 -3
  39. package/skills/torusguard/bootstrap.py +68 -4
  40. package/skills/torusguard/payload/.manifest.json +98 -79
  41. package/skills/torusguard/payload/config/torusguard.json +1 -1
  42. package/skills/torusguard/payload/references/csharp-security.md +41 -0
  43. package/skills/torusguard/payload/references/go-security.md +41 -0
  44. package/skills/torusguard/payload/references/java-security.md +40 -0
  45. package/skills/torusguard/payload/references/polyglot-security-matrix.md +25 -0
  46. package/skills/torusguard/payload/references/rust-security.md +40 -0
  47. package/skills/torusguard/payload/rules/custom/.gitkeep +1 -0
  48. package/skills/torusguard/payload/rules/custom/README.md +30 -0
  49. package/skills/torusguard/payload/schemas/golden-recipe.schema.json +75 -0
  50. package/skills/torusguard/payload/schemas/memory-context.schema.json +95 -0
  51. package/skills/torusguard/payload/schemas/memory-event.schema.json +70 -0
  52. package/skills/torusguard/payload/schemas/memory-pattern.schema.json +65 -0
  53. package/skills/torusguard/payload/scripts/diff_guard.py +202 -15
  54. package/skills/torusguard/payload/scripts/finding_scorer.py +199 -86
  55. package/skills/torusguard/payload/scripts/html_reporter.py +628 -0
  56. package/skills/torusguard/payload/scripts/manifest_builder.py +7 -5
  57. package/skills/torusguard/payload/scripts/memory_engine.py +1334 -0
  58. package/skills/torusguard/payload/scripts/monorepo_detector.py +123 -10
  59. package/skills/torusguard/payload/scripts/rules_sync.py +321 -0
  60. package/skills/torusguard/payload/scripts/run_manager.py +171 -89
  61. package/skills/torusguard/payload/scripts/stack_detect.py +458 -26
  62. package/skills/torusguard/payload/skills/torusguard/SKILL.md +4 -3
  63. package/skills/torusguard/payload/skills/torusguard/bootstrap.py +344 -56
  64. package/skills/torusguard/payload/skills/torusguard/references/csharp-security.md +41 -0
  65. package/skills/torusguard/payload/skills/torusguard/references/go-security.md +41 -0
  66. package/skills/torusguard/payload/skills/torusguard/references/java-security.md +40 -0
  67. package/skills/torusguard/payload/skills/torusguard/references/polyglot-security-matrix.md +25 -0
  68. package/skills/torusguard/payload/skills/torusguard/references/rust-security.md +40 -0
  69. package/skills/torusguard/payload/skills/torusguard-audit/SKILL.md +25 -25
  70. package/skills/torusguard/payload/skills/torusguard-harden/SKILL.md +3 -3
  71. package/skills/torusguard/payload/skills/torusguard-recheck/SKILL.md +3 -3
  72. package/skills/torusguard/payload/workflows/memory.md +53 -0
  73. package/skills/torusguard-audit/SKILL.md +25 -25
  74. package/skills/torusguard-harden/SKILL.md +3 -3
  75. package/skills/torusguard-recheck/SKILL.md +3 -3
  76. package/.torusguard/scripts/__pycache__/diff_guard.cpython-311.pyc +0 -0
  77. package/.torusguard/scripts/__pycache__/monorepo_detector.cpython-311.pyc +0 -0
  78. package/skills/torusguard/__pycache__/bootstrap.cpython-311.pyc +0 -0
  79. package/skills/torusguard/payload/scripts/__pycache__/diff_guard.cpython-311.pyc +0 -0
  80. package/skills/torusguard/payload/scripts/__pycache__/monorepo_detector.cpython-311.pyc +0 -0
package/bin/torusguard.js CHANGED
@@ -49,7 +49,7 @@ function printHelp() {
49
49
  console.log(`
50
50
  ${CYAN}╭─────────────────────────────────────────────────────────────────────────╮${RESET}
51
51
  ${CYAN}│${RESET} ${CYAN}│${RESET}
52
- ${CYAN}│${RESET} ${BOLD}${WHITE}🛡️ T O R U S G U A R D C L I${RESET} ${GRAY}v0.9.5${RESET} ${CYAN}│${RESET}
52
+ ${CYAN}│${RESET} ${BOLD}${WHITE}🛡️ T O R U S G U A R D C L I${RESET} ${GRAY}v1.3.0${RESET} ${CYAN}│${RESET}
53
53
  ${CYAN}│${RESET} ${DIM}Autonomous Security Engine for AI-Built Applications${RESET} ${CYAN}│${RESET}
54
54
  ${CYAN}│${RESET} ${CYAN}│${RESET}
55
55
  ${CYAN}╰─────────────────────────────────────────────────────────────────────────╯${RESET}
@@ -59,12 +59,24 @@ function printHelp() {
59
59
  ${CYAN}┌─────────────────────────────────────────────────────────────────────────┐${RESET}
60
60
  ${CYAN}│${RESET} ${BOLD}Commands${RESET} ${CYAN}│${RESET}
61
61
  ${CYAN}├─────────────────────────────────────────────────────────────────────────┤${RESET}
62
- ${CYAN}│${RESET} ${GREEN}init${RESET} Scaffold ${BOLD}.torusguard/${RESET} workspace + unlock 11 slash commands ${CYAN}│${RESET}
63
- ${CYAN}│${RESET} ${GREEN}status${RESET} Display active security posture, rules, and stack info ${CYAN}│${RESET}
62
+ ${CYAN}│${RESET} ${GREEN}init${RESET} Scaffold ${BOLD}.torusguard/${RESET} workspace + unlock 12 slash commands ${CYAN}│${RESET}
63
+ ${CYAN}│${RESET} ${GREEN}status${RESET} Display active security posture, memory, rules, and stack ${CYAN}│${RESET}
64
+ ${CYAN}│${RESET} ${GREEN}rules${RESET} Auto-sync memory to AI IDE rules (.cursorrules, CLAUDE.md) ${CYAN}│${RESET}
65
+ ${CYAN}│${RESET} ${GREEN}memory${RESET} Manage persistent security memory (export, hook, learn) ${CYAN}│${RESET}
64
66
  ${CYAN}│${RESET} ${GREEN}audit${RESET} Run static AST security scan on the target project ${CYAN}│${RESET}
65
- ${CYAN}│${RESET} ${GREEN}report${RESET} Export OASIS SARIF v2.1.0 structured telemetry ${CYAN}│${RESET}
67
+ ${CYAN}│${RESET} ${GREEN}report${RESET} Export OASIS SARIF v2.1.0 or single-file visual HTML report ${CYAN}│${RESET}
68
+ ${CYAN}│${RESET} ${GREEN}diff-guard${RESET} Scan diffs or wire pre-commit hook (--install-hook) ${CYAN}│${RESET}
66
69
  ${CYAN}│${RESET} ${GREEN}help${RESET} Show this interactive command guide ${CYAN}│${RESET}
67
70
  ${CYAN}├─────────────────────────────────────────────────────────────────────────┤${RESET}
71
+ ${CYAN}│${RESET} ${BOLD}AI & Memory Subcommands${RESET} ${CYAN}│${RESET}
72
+ ${CYAN}├─────────────────────────────────────────────────────────────────────────┤${RESET}
73
+ ${CYAN}│${RESET} ${WHITE}rules sync${RESET} ${DIM}[--format all|cursor|claude|agent|windsurf]${RESET} ${CYAN}│${RESET}
74
+ ${CYAN}│${RESET} ${WHITE}report --html${RESET} ${DIM}[--out <path>] Self-contained visual HTML dashboard${RESET} ${CYAN}│${RESET}
75
+ ${CYAN}│${RESET} ${WHITE}memory context${RESET} ${DIM}[--role auditor|remediator|reviewer] [--file <f>]${RESET} ${CYAN}│${RESET}
76
+ ${CYAN}│${RESET} ${WHITE}memory hook${RESET} ${DIM}[install|uninstall] Git pre-commit regression hook${RESET} ${CYAN}│${RESET}
77
+ ${CYAN}│${RESET} ${WHITE}memory learn${RESET} ${DIM}[--commits <range>] Ingest security commit fixes${RESET} ${CYAN}│${RESET}
78
+ ${CYAN}│${RESET} ${WHITE}memory export${RESET} ${DIM}[--path <file>] [--sanitized] Safe team sharing${RESET} ${CYAN}│${RESET}
79
+ ${CYAN}├─────────────────────────────────────────────────────────────────────────┤${RESET}
68
80
  ${CYAN}│${RESET} ${BOLD}Options${RESET} ${CYAN}│${RESET}
69
81
  ${CYAN}├─────────────────────────────────────────────────────────────────────────┤${RESET}
70
82
  ${CYAN}│${RESET} ${GRAY}--target <dir>${RESET} Target directory to analyze or scaffold ${DIM}(default: .)${RESET} ${CYAN}│${RESET}
@@ -73,7 +85,7 @@ function printHelp() {
73
85
 
74
86
  ${BOLD}AI Chat Commands:${RESET}
75
87
  ${DIM}In your AI IDE chat, use any of these slash commands:${RESET}
76
- ${CYAN}/torusguard${RESET} Main orchestrator (status, audit, harden, etc.)
88
+ ${CYAN}/torusguard${RESET} Main orchestrator (status, audit, harden, memory)
77
89
  ${CYAN}/torusguard-audit${RESET} Static AST security scan
78
90
  ${CYAN}/torusguard-harden${RESET} Generate governed fix patches
79
91
  ${CYAN}/torusguard-apply${RESET} Apply patches with rollback snapshots
@@ -100,10 +112,32 @@ if (command === 'status') {
100
112
  const stackDb = cfg.detected_stack?.data_layer || 'Not yet detected';
101
113
  const stackStatus = cfg.detected_stack ? `${GREEN}Detected${RESET}` : `${YELLOW}Pending first audit${RESET}`;
102
114
 
115
+ // Memory telemetry
116
+ const memProfilePath = path.join(cwd, '.torusguard', 'memory', 'profile.json');
117
+ const memContextPath = path.join(cwd, '.torusguard', 'memory', 'context.json');
118
+ let memPatterns = 0;
119
+ let memEvents = 0;
120
+ let memTokens = 0;
121
+ let memFixRate = 'N/A';
122
+ if (fs.existsSync(memProfilePath)) {
123
+ try {
124
+ const prof = JSON.parse(fs.readFileSync(memProfilePath, 'utf-8'));
125
+ memPatterns = prof.active_patterns_count || 0;
126
+ memEvents = prof.total_events || 0;
127
+ memFixRate = prof.fix_rate_percentage !== null && prof.fix_rate_percentage !== undefined ? `${prof.fix_rate_percentage}%` : 'N/A';
128
+ } catch (e) {}
129
+ }
130
+ if (fs.existsSync(memContextPath)) {
131
+ try {
132
+ const ctx = JSON.parse(fs.readFileSync(memContextPath, 'utf-8'));
133
+ memTokens = ctx.token_estimate || 0;
134
+ } catch (e) {}
135
+ }
136
+
103
137
  console.log(`
104
138
  ${CYAN}╭─────────────────────────────────────────────────────────────────────────╮${RESET}
105
139
  ${CYAN}│${RESET} ${CYAN}│${RESET}
106
- ${CYAN}│${RESET} ${BOLD}${WHITE}🛡️ TORUSGUARD SECURITY POSTURE${RESET} ${GRAY}v0.9.5${RESET} ${CYAN}│${RESET}
140
+ ${CYAN}│${RESET} ${BOLD}${WHITE}🛡️ TORUSGUARD SECURITY POSTURE${RESET} ${GRAY}v1.3.0${RESET} ${CYAN}│${RESET}
107
141
  ${CYAN}│${RESET} ${CYAN}│${RESET}
108
142
  ${CYAN}╰─────────────────────────────────────────────────────────────────────────╯${RESET}
109
143
 
@@ -117,6 +151,13 @@ if (command === 'status') {
117
151
  ${CYAN}│${RESET} Stack Detection: ${stackStatus}
118
152
  ${CYAN}└─────────────────────────────────────────────────────────────────────────┘${RESET}
119
153
 
154
+ ${CYAN}┌── Security Memory Engine ───────────────────────────────────────────────┐${RESET}
155
+ ${CYAN}│${RESET} Patterns Learned: ${GREEN}${memPatterns} active patterns${RESET}
156
+ ${CYAN}│${RESET} Events Recorded: ${WHITE}${memEvents} events (local-first log)${RESET}
157
+ ${CYAN}│${RESET} Context Window: ${CYAN}${memTokens} / 2,000 tokens${RESET} (${Math.round((memTokens / 2000) * 100)}% utilized)
158
+ ${CYAN}│${RESET} Fix Velocity Rate: ${YELLOW}${memFixRate}${RESET}
159
+ ${CYAN}└─────────────────────────────────────────────────────────────────────────┘${RESET}
160
+
120
161
  ${CYAN}┌── Governance Telemetry ─────────────────────────────────────────────────┐${RESET}
121
162
  ${CYAN}│${RESET} Rules Catalog: ${GREEN}71 Canonical Security Rules${RESET} (11 families)
122
163
  ${CYAN}│${RESET} Severity Floor: ${YELLOW}${cfg.severity_threshold || 'medium'}${RESET}
@@ -148,6 +189,163 @@ if (command === 'status') {
148
189
  }
149
190
  }
150
191
 
192
+ // Subcommand: memory
193
+ if (command === 'memory') {
194
+ const sub = args[1] || 'status';
195
+ const memScript = path.join(cwd, '.torusguard', 'scripts', 'memory_engine.py');
196
+ const fallbackMemScript = path.join(rootDir, '.torusguard', 'scripts', 'memory_engine.py');
197
+ const actualMemScript = fs.existsSync(memScript) ? memScript : fallbackMemScript;
198
+
199
+ let pyArgs = [actualMemScript];
200
+ if (sub === 'status') {
201
+ pyArgs.push('--action', 'status');
202
+ } else if (sub === 'context') {
203
+ pyArgs.push('--action', 'context');
204
+ const roleIdx = args.indexOf('--role');
205
+ if (roleIdx !== -1 && args[roleIdx + 1]) {
206
+ pyArgs.push('--role', args[roleIdx + 1]);
207
+ }
208
+ const fileIdx = args.indexOf('--file') !== -1 ? args.indexOf('--file') : args.indexOf('-f');
209
+ if (fileIdx !== -1 && args[fileIdx + 1]) {
210
+ pyArgs.push('--file', args[fileIdx + 1]);
211
+ }
212
+ const ruleIdx = args.indexOf('--rule') !== -1 ? args.indexOf('--rule') : args.indexOf('-r');
213
+ if (ruleIdx !== -1 && args[ruleIdx + 1]) {
214
+ pyArgs.push('--rule-id', args[ruleIdx + 1]);
215
+ }
216
+ } else if (sub === 'distill') {
217
+ pyArgs.push('--action', 'distill');
218
+ } else if (sub === 'decay') {
219
+ pyArgs.push('--action', 'decay');
220
+ const ttlIdx = args.indexOf('--ttl');
221
+ if (ttlIdx !== -1 && args[ttlIdx + 1]) {
222
+ pyArgs.push('--ttl', args[ttlIdx + 1]);
223
+ }
224
+ } else if (sub === 'compact') {
225
+ pyArgs.push('--action', 'compact');
226
+ const ageIdx = args.indexOf('--older-than');
227
+ if (ageIdx !== -1 && args[ageIdx + 1]) {
228
+ pyArgs.push('--older-than', args[ageIdx + 1]);
229
+ }
230
+ } else if (sub === 'export') {
231
+ pyArgs.push('--action', 'export');
232
+ const pathIdx = args.indexOf('--path') !== -1 ? args.indexOf('--path') : args.indexOf('-p');
233
+ if (pathIdx !== -1 && args[pathIdx + 1]) {
234
+ pyArgs.push('--target', args[pathIdx + 1]);
235
+ } else {
236
+ pyArgs.push('--target', 'torusguard-memory-export.json');
237
+ }
238
+ if (args.includes('--sanitized')) {
239
+ pyArgs.push('--sanitized');
240
+ }
241
+ } else if (sub === 'import') {
242
+ pyArgs.push('--action', 'import');
243
+ const pathIdx = args.indexOf('--path') !== -1 ? args.indexOf('--path') : args.indexOf('-p');
244
+ if (pathIdx !== -1 && args[pathIdx + 1]) {
245
+ pyArgs.push('--source', args[pathIdx + 1]);
246
+ } else {
247
+ console.error(`${RED}Error: --path <file> is required for memory import${RESET}`);
248
+ process.exit(1);
249
+ }
250
+ } else if (sub === 'hook') {
251
+ const hookAction = args[2] === 'uninstall' ? 'hook-uninstall' : 'hook-install';
252
+ pyArgs.push('--action', hookAction);
253
+ } else if (sub === 'learn') {
254
+ pyArgs.push('--action', 'learn');
255
+ const commitsIdx = args.indexOf('--commits');
256
+ if (commitsIdx !== -1 && args[commitsIdx + 1]) {
257
+ pyArgs.push('--commits', args[commitsIdx + 1]);
258
+ }
259
+ const daysIdx = args.indexOf('--days');
260
+ if (daysIdx !== -1 && args[daysIdx + 1]) {
261
+ pyArgs.push('--days', args[daysIdx + 1]);
262
+ }
263
+ } else if (sub === 'recipe') {
264
+ pyArgs.push('--action', 'recipe', ...args.slice(2));
265
+ } else if (sub === 'fp') {
266
+ pyArgs.push('--action', 'fp');
267
+ const ruleIdx = args.indexOf('--rule') !== -1 ? args.indexOf('--rule') : args.indexOf('-r');
268
+ if (ruleIdx !== -1 && args[ruleIdx + 1]) {
269
+ pyArgs.push('--rule-id', args[ruleIdx + 1]);
270
+ } else {
271
+ console.error(`${RED}Error: --rule <rule_id> is required for fp suppression${RESET}`);
272
+ process.exit(1);
273
+ }
274
+ const reasonIdx = args.indexOf('--reason');
275
+ if (reasonIdx !== -1 && args[reasonIdx + 1]) {
276
+ pyArgs.push('--reason', args[reasonIdx + 1]);
277
+ }
278
+ } else {
279
+ pyArgs.push('--action', sub, ...args.slice(2));
280
+ }
281
+
282
+ const proc = spawnSync(pythonCmd, pyArgs, { stdio: 'inherit', cwd });
283
+ process.exit(proc.status !== null ? proc.status : 0);
284
+ }
285
+
286
+ // Subcommand: diff-guard
287
+ if (command === 'diff-guard') {
288
+ const diffScript = path.join(cwd, '.torusguard', 'scripts', 'diff_guard.py');
289
+ const fallbackDiffScript = path.join(rootDir, '.torusguard', 'scripts', 'diff_guard.py');
290
+ const actualDiffScript = fs.existsSync(diffScript) ? diffScript : fallbackDiffScript;
291
+
292
+ const proc = spawnSync(pythonCmd, [actualDiffScript, ...args.slice(1)], { stdio: 'inherit', cwd });
293
+ process.exit(proc.status !== null ? proc.status : 0);
294
+ }
295
+
296
+ // Subcommand: rules
297
+ if (command === 'rules') {
298
+ const sub = args[1] || 'sync';
299
+ const rulesScript = path.join(cwd, '.torusguard', 'scripts', 'rules_sync.py');
300
+ const fallbackRulesScript = path.join(rootDir, '.torusguard', 'scripts', 'rules_sync.py');
301
+ const actualRulesScript = fs.existsSync(rulesScript) ? rulesScript : fallbackRulesScript;
302
+
303
+ let pyArgs = [actualRulesScript];
304
+ if (sub === 'sync') {
305
+ const fmtIdx = args.indexOf('--format');
306
+ if (fmtIdx !== -1 && args[fmtIdx + 1]) {
307
+ pyArgs.push('--format', args[fmtIdx + 1]);
308
+ }
309
+ const rootIdx = args.indexOf('--root') !== -1 ? args.indexOf('--root') : args.indexOf('--target');
310
+ if (rootIdx !== -1 && args[rootIdx + 1]) {
311
+ pyArgs.push('--root', args[rootIdx + 1]);
312
+ }
313
+ if (args.includes('--json')) {
314
+ pyArgs.push('--json');
315
+ }
316
+ } else {
317
+ pyArgs.push(...args.slice(1));
318
+ }
319
+
320
+ const proc = spawnSync(pythonCmd, pyArgs, { stdio: 'inherit', cwd });
321
+ process.exit(proc.status !== null ? proc.status : 0);
322
+ }
323
+
324
+ // Subcommand: report
325
+ if (command === 'report') {
326
+ if (args.includes('--html') || args[1] === 'html') {
327
+ const htmlScript = path.join(cwd, '.torusguard', 'scripts', 'html_reporter.py');
328
+ const fallbackHtmlScript = path.join(rootDir, '.torusguard', 'scripts', 'html_reporter.py');
329
+ const actualHtmlScript = fs.existsSync(htmlScript) ? htmlScript : fallbackHtmlScript;
330
+
331
+ let pyArgs = [actualHtmlScript];
332
+ const outIdx = args.indexOf('--out');
333
+ if (outIdx !== -1 && args[outIdx + 1]) {
334
+ pyArgs.push('--out', args[outIdx + 1]);
335
+ }
336
+ const rootIdx = args.indexOf('--root') !== -1 ? args.indexOf('--root') : args.indexOf('--target');
337
+ if (rootIdx !== -1 && args[rootIdx + 1]) {
338
+ pyArgs.push('--root', args[rootIdx + 1]);
339
+ }
340
+ if (args.includes('--json')) {
341
+ pyArgs.push('--json');
342
+ }
343
+
344
+ const proc = spawnSync(pythonCmd, pyArgs, { stdio: 'inherit', cwd });
345
+ process.exit(proc.status !== null ? proc.status : 0);
346
+ }
347
+ }
348
+
151
349
  // Locate bootstrap / runner scripts
152
350
  const localBootstrap = path.join(rootDir, 'skills', 'torusguard', 'bootstrap.py');
153
351
  const localInstall = path.join(rootDir, 'install.py');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "torusguard",
3
- "version": "0.9.5",
3
+ "version": "1.3.0",
4
4
  "description": "Security guardrails, governed remediation, and authorized runtime validation for AI-built web applications.",
5
5
  "main": "bin/torusguard.js",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: torusguard
3
- description: "Autonomous security engine: 71 rules across 11 families, governed remediation (Ponytail Protocol), SARIF v2.1.0 exports, and 5-agent authority separation for Python & TypeScript web applications."
4
- version: 0.9.5
3
+ description: "Autonomous security engine: 71 rules across 11 families, governed remediation (Ponytail Protocol), SARIF v2.1.0 exports, and persistent security memory context for Python & TypeScript web applications."
4
+ version: 1.0.0
5
5
  ---
6
6
 
7
7
  # TorusGuard Master Security Router
@@ -11,7 +11,7 @@ version: 0.9.5
11
11
  ---
12
12
 
13
13
  ## ⚡ Workspace Bootstrap Check
14
- 1. **If `.torusguard/` exists on disk:** Full governance active. Route slash commands to local specialist workflows below.
14
+ 1. **If `.torusguard/` exists on disk:** Full governance active. Load `.torusguard/memory/context.json` into prompt context for local-first intelligence. Route commands to specialist workflows below.
15
15
  2. **If `.torusguard/` is absent (Autonomous AI Mode):** Operates standalone in any AI agent (Kimi, Antigravity, VS Code, Cursor). Apply in-memory security invariants:
16
16
  - Server-side auth & tenant scoping (`.filter(tenant=...)`).
17
17
  - Zero client-side secrets (`SUPABASE_SERVICE_ROLE_KEY`, live API keys).
@@ -36,6 +36,7 @@ Load **only** the designated sub-skill on demand to preserve the 1,000–1,500 t
36
36
  | `/torusguard recheck` | `skills/torusguard-recheck/SKILL.md` | `reviewer` |
37
37
  | `/torusguard report` | `skills/torusguard-report/SKILL.md` | `reviewer` |
38
38
  | `/torusguard status` | `skills/torusguard-status/SKILL.md` | `reviewer` |
39
+ | `/torusguard memory` | `skills/torusguard/SKILL.md` | `reviewer` |
39
40
  | `/torusguard full` | `skills/torusguard-full/SKILL.md` | *All* |
40
41
 
41
42
  *Note: Never load all skills simultaneously. Lazy-load strictly on demand.*
@@ -15,12 +15,12 @@ from pathlib import Path
15
15
  # Ensure UTF-8 stdout/stderr on Windows consoles
16
16
  if sys.stdout and hasattr(sys.stdout, "reconfigure"):
17
17
  try:
18
- sys.stdout.reconfigure(encoding="utf-8", errors="replace")
18
+ getattr(sys.stdout, "reconfigure")(encoding="utf-8", errors="replace")
19
19
  except Exception:
20
20
  pass
21
21
  if sys.stderr and hasattr(sys.stderr, "reconfigure"):
22
22
  try:
23
- sys.stderr.reconfigure(encoding="utf-8", errors="replace")
23
+ getattr(sys.stderr, "reconfigure")(encoding="utf-8", errors="replace")
24
24
  except Exception:
25
25
  pass
26
26
 
@@ -157,7 +157,7 @@ def print_already_initialized(target_root, cfg):
157
157
 
158
158
  {BOLD}▸ Project Root:{RESET} {GREEN}{target_root}{RESET}
159
159
  {BOLD}▸ Workspace:{RESET} {GREEN}.torusguard/{RESET} {DIM}(Already Initialized){RESET}
160
- {BOLD}▸ Version:{RESET} {CYAN}{cfg.get('version', '0.9.5')}{RESET}
160
+ {BOLD}▸ Version:{RESET} {CYAN}{cfg.get('version', '1.0.0')}{RESET}
161
161
  {BOLD}▸ Severity Floor:{RESET} {YELLOW}{cfg.get('severity_threshold', 'medium')}{RESET}
162
162
 
163
163
  {DIM}To refresh templates or re-scaffold, run:{RESET}
@@ -231,6 +231,70 @@ def scaffold_workspace(target_root=None, force=False, full_commands=False):
231
231
  if not gitkeep_rules.exists():
232
232
  gitkeep_rules.write_text("", encoding="utf-8")
233
233
 
234
+ # ── Ensure memory subsystem is initialized (v1.0.0) ────────────────────
235
+ memory_dir = torusguard_target / "memory"
236
+ memory_dir.mkdir(parents=True, exist_ok=True)
237
+ events_dir = memory_dir / "events"
238
+ events_dir.mkdir(parents=True, exist_ok=True)
239
+
240
+ gitkeep_events = events_dir / ".gitkeep"
241
+ if not gitkeep_events.exists():
242
+ gitkeep_events.write_text("", encoding="utf-8")
243
+
244
+ mem_gitignore = memory_dir / ".gitignore"
245
+ if not mem_gitignore.exists():
246
+ mem_gitignore.write_text("*\n", encoding="utf-8")
247
+
248
+ decay_file = memory_dir / "decay.json"
249
+ if not decay_file.exists():
250
+ decay_file.write_text(json.dumps({
251
+ "default_ttl_days": 90,
252
+ "decay_rate": 0.15,
253
+ "last_decay_run": None
254
+ }, indent=2), encoding="utf-8")
255
+
256
+ patterns_file = memory_dir / "patterns.json"
257
+ if not patterns_file.exists():
258
+ patterns_file.write_text("[]", encoding="utf-8")
259
+
260
+ profile_file = memory_dir / "profile.json"
261
+ if not profile_file.exists():
262
+ profile_file.write_text(json.dumps({
263
+ "stack": [],
264
+ "total_events": 0,
265
+ "active_patterns_count": 0,
266
+ "fix_rate_percentage": None,
267
+ "top_vulnerabilities": [],
268
+ "last_updated": None
269
+ }, indent=2), encoding="utf-8")
270
+
271
+ context_file = memory_dir / "context.json"
272
+ if not context_file.exists():
273
+ context_file.write_text(json.dumps({
274
+ "version": "1.0.0",
275
+ "generated_at": None,
276
+ "token_estimate": 0,
277
+ "max_token_budget": 2000,
278
+ "project_profile": {
279
+ "stack": [],
280
+ "total_events": 0,
281
+ "active_patterns_count": 0,
282
+ "fix_rate_percentage": None,
283
+ "top_vulnerabilities": []
284
+ },
285
+ "cards": []
286
+ }, indent=2), encoding="utf-8")
287
+
288
+ # Ensure target project root .gitignore excludes .torusguard/memory/
289
+ root_gitignore = target_root / ".gitignore"
290
+ if root_gitignore.exists():
291
+ try:
292
+ gi_content = root_gitignore.read_text(encoding="utf-8")
293
+ if ".torusguard/memory" not in gi_content:
294
+ root_gitignore.write_text(gi_content.rstrip() + "\n\n# TorusGuard security memory (local only)\n.torusguard/memory/\n", encoding="utf-8")
295
+ except Exception:
296
+ pass
297
+
234
298
  # ── Step 2: Security Profile & Coverage (In-Process, Zero Subprocess) ──
235
299
  # Execute stack detection in-process without spawning child processes (Socket.dev safe)
236
300
  detected_stack = None
@@ -275,7 +339,7 @@ def scaffold_workspace(target_root=None, force=False, full_commands=False):
275
339
  registered_ides = []
276
340
  tg_workflow_content = """---
277
341
  description: TorusGuard Autonomous Security Command Engine — run static security audits, authorized runtime web validation, governed remediation, and SARIF exports.
278
- version: 0.9.5
342
+ version: 1.0.0
279
343
  tools: Read, Grep, Glob, Bash, Edit, Write
280
344
  agent: auditor
281
345
  ---
@@ -1,5 +1,5 @@
1
1
  {
2
- "ARCHITECTURE.md": "0ecacc797932daaf95ccf5032c47f11550c9b6fe07cdfece5c075e11ec5e9cf7",
2
+ "ARCHITECTURE.md": "cdc690a856e82574a6574ab6b1ad8a2d8b3b8264c36931c6212321066eed82e4",
3
3
  "TORUSGUARD.md": "c980b0ddd3778d5981f6c16c64015c60dc713b6f151fc531bc5681ecd770fb50",
4
4
  "agents/auditor.md": "4ba2c92982823d0886c7ae369126cd5ddd322085a85d3b7e7fa23154f8753314",
5
5
  "agents/profiler.md": "0ee9ebbddf4ebd557d454dda8472fffea471e263abeccf40298163084b7ce9a9",
@@ -7,89 +7,108 @@
7
7
  "agents/reviewer.md": "69b280bb8a7b2fe425644d01a6f9cb454f9629f348782cd14968657076977c28",
8
8
  "agents/validator.md": "79fc4431de5c5507f8730aee6c5c3e61fd238cbf8cf8c7c6aac462eee9761ed6",
9
9
  "config/scope.json": "b198a86186b4c6d5e1af516bf4e3a6afa8878e622ca1d57a5bf72d294f8c6f25",
10
- "config/slash-commands.json": "5390f0d26f8117a62e56c58147d3a0d2deab1a20956302b212703281d13fa84e",
11
- "config/torusguard.json": "077bc6a948f9420aded8dba248577ff3ebf054cab64cf538a7a6d05223fe27bc",
12
- "references/django-security.md": "a15b7eb11b51dd1970d3d65544cf79ebea91fb99dc0e085e58a56532a718dce7",
13
- "references/drf-security.md": "c7a7af3acaef895bf4798590acc88b3a2e9831a49eb2d23b4d8f31540ab264cc",
14
- "references/express-security.md": "dff1db15e614d29d8c272f9da345b418077e62dc883fe210c7a50c552c76493f",
15
- "references/fastapi-security.md": "933a08a3f096f70cb75c6a1e6d887c96a1613bb9f9def3904bb76e8c21cc7668",
16
- "references/firebase-security.md": "11b1c51d530ff70230e2419475fceb9382f05c4334145366c66bb1304448f5b5",
17
- "references/flask-security.md": "96d438980272f6fa95c825ef01baae55989c19618470b044dde1458a421a92f4",
18
- "references/nextjs-security.md": "57f17d00ce24bf06d2826ab9d774177342ff892f6c9bc4193d6b65345d6c7661",
19
- "references/react-vite-security.md": "d6468a6f623f02e58250a43327e27825b5dc7df34edf6ee27da2398bab94d6a4",
20
- "references/sqlalchemy-security.md": "50421be1fba477721f9f1f5a877d4359420cf61ee9bda136e21998a3c1338e1c",
21
- "references/supabase-security.md": "52a53aff66b3d94e5d07484f458252015ad3d713fa07162f59db89581ee597b6",
10
+ "config/slash-commands.json": "305c1dc5b556e8d64ad9dd585dafac1a9955cf1bd5321429955b19b7a62736b6",
11
+ "config/torusguard.json": "55dbde335997421a01c97709fd1672ad70fa921bfe8346dd57552b799db2419e",
12
+ "references/csharp-security.md": "d6e267855b08ed4fdff26f3b876f089ae1f90a7ec6546cba7e8173380d9daa9d",
13
+ "references/django-security.md": "26ea5535ac435e61489df1e381ac62b19e81702edfe095e78c937be93fa15ea7",
14
+ "references/drf-security.md": "c6796398317b0f264d89fff598404e126d819e69e1ea0a5129924a5eb2a7af9d",
15
+ "references/express-security.md": "3b9896c4c9cfac3199c830db07c661bad1d4529863cab77605db760550def98e",
16
+ "references/fastapi-security.md": "45136325e7cc65aa78af848636f6e18fc0e871978599505cff3ac95c5823d3d4",
17
+ "references/firebase-security.md": "c49eaf58e28b7aa37234ea09f13716fe78357521cdd260d5e536d920e9f406b7",
18
+ "references/flask-security.md": "f359ffdb6ca8c60eaccde2767c8177ed1e2d4fd1391d869405026262fda79f25",
19
+ "references/go-security.md": "a008606e7698c372140c2c5f5e0ec3c11ac34ae760847650a99c0aee102e6138",
20
+ "references/java-security.md": "6f27483e271be9d73af0d00fee280a74aeafb08f584cd3313ca349936f779ee6",
21
+ "references/nextjs-security.md": "4cfa06225a31bc415501ca7d58adc8c12078cc263b78770ae398c7dadcb1e7a2",
22
+ "references/polyglot-security-matrix.md": "d69453814969b5fd33800baa77433b7ae9564264153cddfd45aa0b87756ed919",
23
+ "references/react-vite-security.md": "bcc6c38644ff6c939059f12d0f4fc34d3abd338a6c1a0e8406addcd3e50fae45",
24
+ "references/rust-security.md": "3975f69bb0d983171b521766ca9e0022632acff83439d2f0406599a551702a64",
25
+ "references/sqlalchemy-security.md": "a3671325d4d0dfac95c2f9ef41fa7fccb440400e35dd53bcd0c1984e48626cb2",
26
+ "references/supabase-security.md": "4f057d247c9b35a29105ed5e9f74c61b378b33cbc674cbcfa82dbb8174f98ac5",
22
27
  "rules/README.md": "a1b80344b0ca199a4917bdbd00463a8ae1459187f65467dbd627ce93a103042e",
23
- "rules/TORUSGUARD.md": "fc7e0852ae0a92c45017f11dbc83c562b94ab957e7816d9903b95fb6849a9e5b",
24
- "rules/active/TG-DIFF-001.md": "f67be0f2725eb23c3d11a8a7a4c29dcee648d3f9743e122a2197e8892f4da4de",
25
- "rules/active/TG-DIFF-002.md": "1058cf5ba4e700176cf74eb55fb6304d320d3be5fdd011c5c61780d2a99c1a0e",
26
- "rules/active/TG-DIFF-003.md": "0ffc0872ba4e0db9d087d5f2764d5d178401d2fab3cb1d129b387452ca489741",
27
- "schemas/authorization.schema.json": "59af3c6038270e0bc3541a353b2a4a53b7f5d11a37e0012875d6a69c0f1d0bab",
28
- "schemas/confidence.schema.json": "08b3a564d7370e123dd5bfadde9fb077d2954e36b523685b9e1d7bdd2aa4b8cb",
29
- "schemas/evidence.schema.json": "d3dcaa10fd2420a4046ea68836fb836a55d003ada4cdc6682229f232881182bf",
30
- "schemas/finding.schema.json": "e0a7c28fa4a5f84bdedb5cf5223da26348250d633479d2dbf7ce3ebd6790a852",
31
- "schemas/provenance.schema.json": "781215801249532414643638b6608dc8f52febc9bca43ae03827b90aecc03256",
32
- "schemas/remediation.schema.json": "217cb2743ae1a912dc074382e9f05634da93f2e30a880c03f6020600ef7e43d3",
33
- "schemas/retest.schema.json": "773b764082f6d2e8c3656ea105e0ce09febd1020520bf262bbcd17f5924da11e",
34
- "schemas/runtime-evidence.schema.json": "dbe13741a7fb68cca2a044d47a644ee0bdaacb83a28621dc2a98bffdd59989a6",
35
- "scripts/diff_guard.py": "227bf56d2e6c9aef293a51ad1a3209782e6d9204dc1775956d372c3a6851a736",
36
- "scripts/finding_scorer.py": "b78c6315f22000fb64f5d4e6ff1f3467439769d3d5507aaa99380453df4eb464",
37
- "scripts/manifest_builder.py": "b759131592966053db17ef710dc5f313127a9583295cb867a39ab22a7c996580",
38
- "scripts/monorepo_detector.py": "38f1eb948ee2856f175e1212956bce211effdd1327d3a31f7303d32ba9478ebe",
39
- "scripts/run_manager.py": "e853874e4fb0cb697596ea338f71ba7e955f2b41a6fc649733b45fa755e94768",
28
+ "rules/TORUSGUARD.md": "c980b0ddd3778d5981f6c16c64015c60dc713b6f151fc531bc5681ecd770fb50",
29
+ "rules/active/TG-DIFF-001.md": "9633466d6aa787ddb0d9df40a18b1bc31c1e12d59d2e11e7ceac4ad8e042770c",
30
+ "rules/active/TG-DIFF-002.md": "330f5200eb93da0b7a25515d3cc0f37839e0d91cc8ee0b870663f70c554211a3",
31
+ "rules/active/TG-DIFF-003.md": "f87730a95446f685f80ac859740883013d832a3c681355fe34ddab0b45e377b8",
32
+ "rules/custom/README.md": "f2128661ad3bc4085a69ddfbabbb2211930215fc42a25e2ab2d3e7a4b749a639",
33
+ "schemas/authorization.schema.json": "84885c9edc930a22c777d8685219f1f25b5320c0c6062722e3ba09f1fe417ad4",
34
+ "schemas/confidence.schema.json": "09c5098f55f3936e9231ba417ace4fa7aa9ebc49233b4bfa88a4103ef6f1202c",
35
+ "schemas/evidence.schema.json": "7dff029c34965e9aeee932028d11bf30d4f3ff76f8137af382bf3d3dc2c0df10",
36
+ "schemas/finding.schema.json": "2cf5f7e29b2544e9dc92069394f5eb2b77bc06e8e3daaccfeea5021d177758a8",
37
+ "schemas/golden-recipe.schema.json": "027d7216e3d000b742ee53d8a5653586aca6a25c69e7b35de4321075ab0206d4",
38
+ "schemas/memory-context.schema.json": "6b9e032c55ba87b2517dd1e7ca0043b8e2439e85fa4a6eac6fc6041f3091e571",
39
+ "schemas/memory-event.schema.json": "4f653610e04fd480325d0ec77a4339bea4690f85e1d2fa0bd4f6b654c813c905",
40
+ "schemas/memory-pattern.schema.json": "df4aae2a3034a7c64ec50b3ae27b6ee9296aac7371c2a1938508834e5f778afe",
41
+ "schemas/provenance.schema.json": "8b8e8ddb5c2ca643ae2d5ef6503eceddad3bd4ebe7ae8dd2449090c2ad24e818",
42
+ "schemas/remediation.schema.json": "544904239f871dec9552973e01e09dc1f40dbb8330f20d98c319f3b24031d630",
43
+ "schemas/retest.schema.json": "97c0407ca4365a524020c430912f686f698cc0de90043194621071e9fc681cc7",
44
+ "schemas/runtime-evidence.schema.json": "929d2b094c1cd1f7f9db07be1eba5994e8002477eab3fd24140e1e973fd18cc1",
45
+ "scripts/diff_guard.py": "c2bb88f6e958063c16c06d35eba747ee259bbe79077c7194c3e2eb427195bf70",
46
+ "scripts/finding_scorer.py": "54c574019b31065dd8fe3bd61676657c2db0f0cf7275e308b7bf933536d422b9",
47
+ "scripts/html_reporter.py": "540929c9c79369bc8b6fae58857bb80b6fd492041168f5f1e4ea69ab6d324d84",
48
+ "scripts/manifest_builder.py": "ce351a18ed5092099019d4f469a8cf9c4ae186a426ff9c711ee2c0402755abb9",
49
+ "scripts/memory_engine.py": "05ae1f17e7b4dc9a79aab429427c2cf401846d9e710dd6c3fe317d834b157529",
50
+ "scripts/monorepo_detector.py": "5603674136a5294ebfff89efeca0a546dd4a7deb1d184a2592ff21aff2131f73",
51
+ "scripts/rules_sync.py": "4101b2ca8036ff4f468800b32a8d08898e8640a74d14124af53d454706a62d3a",
52
+ "scripts/run_manager.py": "b576fc3be9929ee6a52e67662e67f801e4e9317c158243582911e10c94a07619",
40
53
  "scripts/safety_gate.py": "3379b7534b2590cf563717a448983ad8ed7e8f174f0ad65683d33e8a10f51558",
41
54
  "scripts/sarif_exporter.py": "35c66637413afc4b72d5bd426638447c77231d2a8594dce5addceffd4803a20d",
42
- "scripts/stack_detect.py": "99b7bdf9829d58ff5b8c59afd6e8b6429bbb11d830ac73dec491101cbbc41574",
43
- "skills/torusguard/SKILL.md": "31a115886ffb115f2b975c4d0670e780e11ea68201559b24b20d0d0ef456058f",
44
- "skills/torusguard/bootstrap.py": "7e348065a622089ab1d51e9bf4864e5b0022aaee1ccb2ecbf7057c14e792e2c7",
45
- "skills/torusguard/references/auth-and-sessions.md": "34c2843f8c0dbe3574e54f00a39a92a1f431527ec5f69b2d64c84240d424a39e",
46
- "skills/torusguard/references/business-logic-and-abuse.md": "0d6088936bc1a01023070332fccef0f2e0734358a5119379055f3d2895c22567",
47
- "skills/torusguard/references/cache-and-sensitive-responses.md": "8f920cacde29c50b1f5f98de341a60db0bc607fe8c212a7e618ef7af08c86511",
48
- "skills/torusguard/references/client-code-exposure.md": "1810b18c3b89a25d3f5ef9bc53a721b9d05179bcd2086d6679ad1f29f5403bb9",
49
- "skills/torusguard/references/csrf-and-cross-origin.md": "1bab49feee1f31fa6b280ddba893fe5ffa0c3c9ac0a46fc4d6c96c1206b32204",
50
- "skills/torusguard/references/dependency-and-supply-chain.md": "3b429214af8d1271f5e6dc24ac5ecc9a7bdaff6116a96dc60a89a2057d8d1d2a",
51
- "skills/torusguard/references/django-security.md": "a15b7eb11b51dd1970d3d65544cf79ebea91fb99dc0e085e58a56532a718dce7",
52
- "skills/torusguard/references/drf-security.md": "c7a7af3acaef895bf4798590acc88b3a2e9831a49eb2d23b4d8f31540ab264cc",
53
- "skills/torusguard/references/fastapi-security.md": "933a08a3f096f70cb75c6a1e6d887c96a1613bb9f9def3904bb76e8c21cc7668",
54
- "skills/torusguard/references/flask-security.md": "96d438980272f6fa95c825ef01baae55989c19618470b044dde1458a421a92f4",
55
- "skills/torusguard/references/frontend-no-db.md": "a543c8107605777a16a0abfd5ebbaca6f216ac50f078a8c3ef485a5afe6bfdca",
56
- "skills/torusguard/references/graphql-security.md": "486e7a54e9ad677ff6d08016f0d4e1f173ccbba5c89e7e806a7097e3265442cd",
57
- "skills/torusguard/references/input-and-injection.md": "e632ab3031088f3f13be826886430ea7f0abf02922e29c26507f3c234c00f00d",
58
- "skills/torusguard/references/mass-assignment-and-property-auth.md": "fcddd881573c1bc8fc703a796b1ddc9ba9bd8e0cc0d51d8e9a59e79cc9a5ebd9",
59
- "skills/torusguard/references/platform-hardening.md": "c58d1a86536cbaeb548d8cfeaa298e3662a4367854512858bbf594735dc6f717",
60
- "skills/torusguard/references/python-dependencies.md": "34969226665d60d22e658a1801cb6857a56ea669859abcf617a8b985a26f952d",
61
- "skills/torusguard/references/python-security-overview.md": "2165747d64b86b12a744ee4f21ea918678bd6a179793a37bd02b2c0953190a9b",
62
- "skills/torusguard/references/rate-limit-and-abuse.md": "77c5c982d9e28d7e3c1871172bdbfe76542e356d97f2197f5df0a4f56405bc21",
63
- "skills/torusguard/references/secrets-and-config.md": "9abe5fe9e6556a2ffc1460876e9c98f6eacf683cd0d8a7dba82eaeef825133c6",
64
- "skills/torusguard/references/sqlalchemy-security.md": "50421be1fba477721f9f1f5a877d4359420cf61ee9bda136e21998a3c1338e1c",
65
- "skills/torusguard/references/ssrf-and-outbound-requests.md": "31c6c69ba14ca4a1fb866654f6c89a5c8edd636724c9d349be94c160c976749c",
66
- "skills/torusguard/references/webhook-security.md": "a0c7efb663c664dd840ba99b689cb67d4688643106f8b6e80d18a424c6add386",
67
- "skills/torusguard/references/websocket-security.md": "5624a84abd75bbb4eed029cd217e0c794ee452cbecc0730a8ab4d0f371537cd7",
68
- "skills/torusguard-apply/SKILL.md": "9436fa5cdefa661677ada22936a3949de06aca276e4f4bb27e0ef5b7ea34edc3",
69
- "skills/torusguard-audit/SKILL.md": "d0e0c21d6c36d9d128ccce6ad628b978ff771d27552ba80e0a4981e18b9f5a51",
70
- "skills/torusguard-authorize/SKILL.md": "da849585f2e46c08ef528b89737be14647f1109fd365fd27f3f6da57a396724b",
71
- "skills/torusguard-exploit-check/SKILL.md": "e9a173e154a88cc9cb929c59d79a65ab13d5cf9567b4112bd7f272746cf9c3f9",
72
- "skills/torusguard-full/SKILL.md": "cc97684d37de378e51fefd12f6f9a7cd15cc469ce46079a0599440aa7b073f7b",
73
- "skills/torusguard-harden/SKILL.md": "86a8dee6c614477e2122287752f5c16e3688c0451d0e7ae9bfd2a23802bcdde3",
74
- "skills/torusguard-init/SKILL.md": "1f7844d66219955581fdb266029eefdc355dbebb5741b848daf0062e606202a2",
75
- "skills/torusguard-recheck/SKILL.md": "4725a9be6a6ddedb3d389d1957c7ce3e0f9ce288107816fce85b5953951e13e5",
76
- "skills/torusguard-report/SKILL.md": "bde44d114bdc85c04472644a644a7796ed2f182a23e0c057838a3251e4910a09",
77
- "skills/torusguard-status/SKILL.md": "4e71d03c71b240afd7f6108569530b7da3702634c512a74ca8dc3174f3c6b0fb",
78
- "skills/torusguard-verify/SKILL.md": "10c19e0926255686351e3b75ae774880cf35562d42bd30b87a877bb8f284fc1f",
79
- "skills/torusguard-web-validate/SKILL.md": "0d159f0d75f06ca97f64a52f3e414c873f8bb84b87a8230693237cde302e76ac",
55
+ "scripts/stack_detect.py": "7848006e3cd6e828f7dbe189a8c9728abd58e021ff02efbc4230ef8ca3444596",
56
+ "skills/torusguard/SKILL.md": "e772e348716aee26e424ec96be5bd6750dbebcefc248bc4dab0df1e6c0e24fcf",
57
+ "skills/torusguard/bootstrap.py": "01aaf2d627eeff27b5b7343125cb0a7de09371b157d44e622eae59082b2b8e41",
58
+ "skills/torusguard/references/auth-and-sessions.md": "c3e4b9600cb53fc28c993922dc880accbec5783ac90d5ee98d63b52762d19525",
59
+ "skills/torusguard/references/business-logic-and-abuse.md": "58e87df2864d468af70c1ff39f5d540c687fa846b671457f85046ab2065fe99c",
60
+ "skills/torusguard/references/cache-and-sensitive-responses.md": "81b4a7a08e11dafa4ec58d868c4a35f1f891d0dcdcfbcefaef81e1b9ba94f5a1",
61
+ "skills/torusguard/references/client-code-exposure.md": "b1628410e3dc51990a1653d6d3e3aaefbc2b5f43477b4424b46da6141bfe6984",
62
+ "skills/torusguard/references/csharp-security.md": "d6e267855b08ed4fdff26f3b876f089ae1f90a7ec6546cba7e8173380d9daa9d",
63
+ "skills/torusguard/references/csrf-and-cross-origin.md": "2e5001f9e5668beea29985be59dd7272f85640877b55af49c877f5fb8aa70320",
64
+ "skills/torusguard/references/dependency-and-supply-chain.md": "f54cc745217a8c49b86673794e58fd12e91774e7a2fd66d7e9d27f1a7fde16a8",
65
+ "skills/torusguard/references/django-security.md": "26ea5535ac435e61489df1e381ac62b19e81702edfe095e78c937be93fa15ea7",
66
+ "skills/torusguard/references/drf-security.md": "c6796398317b0f264d89fff598404e126d819e69e1ea0a5129924a5eb2a7af9d",
67
+ "skills/torusguard/references/fastapi-security.md": "45136325e7cc65aa78af848636f6e18fc0e871978599505cff3ac95c5823d3d4",
68
+ "skills/torusguard/references/flask-security.md": "f359ffdb6ca8c60eaccde2767c8177ed1e2d4fd1391d869405026262fda79f25",
69
+ "skills/torusguard/references/frontend-no-db.md": "f0aa4e25c8a144b8a05b0c4c27a4d779e49ba63c4ca6b1cc591ab5a15e7762ba",
70
+ "skills/torusguard/references/go-security.md": "a008606e7698c372140c2c5f5e0ec3c11ac34ae760847650a99c0aee102e6138",
71
+ "skills/torusguard/references/graphql-security.md": "081135fd7709fcbd2ed7bd63452454153e8e42d6b0e1118edac4155b21e180d2",
72
+ "skills/torusguard/references/input-and-injection.md": "dfef3af6162eb5ad9b9f516e25f69827f065b36f238facc51554eeecab4d2038",
73
+ "skills/torusguard/references/java-security.md": "6f27483e271be9d73af0d00fee280a74aeafb08f584cd3313ca349936f779ee6",
74
+ "skills/torusguard/references/mass-assignment-and-property-auth.md": "124c697286476990591d43d5a11a1a65db8b0fa72e2e6cd37c60796d2b2ccf5e",
75
+ "skills/torusguard/references/platform-hardening.md": "b21a2cf735711890982e86ff5c385e7574febcd7011637f35997c6dc203ccc63",
76
+ "skills/torusguard/references/polyglot-security-matrix.md": "d69453814969b5fd33800baa77433b7ae9564264153cddfd45aa0b87756ed919",
77
+ "skills/torusguard/references/python-dependencies.md": "1fc00572c52583ecf38e561add0818298085e7f9bdfb329532a6d78b9ec6ca83",
78
+ "skills/torusguard/references/python-security-overview.md": "a234646fc8ccf77fb84decd2fbb18b057a196807796603d0d453ece8c18397f7",
79
+ "skills/torusguard/references/rate-limit-and-abuse.md": "cbf5776f0ef57a54e76ab3d0d6d5b24d77c1cd4efbc6a24e4c827d8623ea98de",
80
+ "skills/torusguard/references/rust-security.md": "3975f69bb0d983171b521766ca9e0022632acff83439d2f0406599a551702a64",
81
+ "skills/torusguard/references/secrets-and-config.md": "21dac9bb94d1b08f2eef938afa073270f8be54b454dbfaf454347a1503ef8e8e",
82
+ "skills/torusguard/references/sqlalchemy-security.md": "a3671325d4d0dfac95c2f9ef41fa7fccb440400e35dd53bcd0c1984e48626cb2",
83
+ "skills/torusguard/references/ssrf-and-outbound-requests.md": "5ce59ebada2f227b3e0a27f612b59a47801c152d24d2d4d533bee435f32b1b05",
84
+ "skills/torusguard/references/webhook-security.md": "8fd27cce1562a3dfda8d4fae29bef7cfd47a65c1e89c6868cdbcac161ccd2be8",
85
+ "skills/torusguard/references/websocket-security.md": "b5315e49432184c006664436d689d426b7322fc6fbbba2899a9ea5e5bab74c92",
86
+ "skills/torusguard-apply/SKILL.md": "09ddf90b436eae0fd54264dbf3c34f564a4481ec4806e2dcf311bfee5ce44d6b",
87
+ "skills/torusguard-audit/SKILL.md": "f879e280d357ea7f124c647ce39af2b24b79db608c9edd018f26e5312625a8b5",
88
+ "skills/torusguard-authorize/SKILL.md": "689729cfebbf6880869ef4ab1b43657f35c873a782f87a03f26727550f7964d4",
89
+ "skills/torusguard-exploit-check/SKILL.md": "c674040a917d95190e198b5fe386a0f08b00424e2037b814a133fa8bf1449f73",
90
+ "skills/torusguard-full/SKILL.md": "f7da4dbd708b31710bddeb5a1f30e1273b134fee1daae89399a17b596ff0128b",
91
+ "skills/torusguard-harden/SKILL.md": "326fa84bda4832f96b19d73824c3472dfe185247ed3e3db9715dd943d46d9874",
92
+ "skills/torusguard-init/SKILL.md": "534a1a4aff2510dbf7924fe74d7d338ed352f757a23b1c5427b9f758019cd911",
93
+ "skills/torusguard-recheck/SKILL.md": "457b2a1cce064a738fbe43f0dba6b4393f1630a82f60698ea5ebe655ec017e50",
94
+ "skills/torusguard-report/SKILL.md": "f6f6de3a8b56c4538d02307c5afaf99c508561140cccfe8ea16c2ae87768b64d",
95
+ "skills/torusguard-status/SKILL.md": "23afc632b70b80304952e2559a109d5877f97a048039a818a65b378dc604e19e",
96
+ "skills/torusguard-verify/SKILL.md": "842ca8ca3ad194886605a7fafb98d4309cba695b86a627b24206b5b139eef5c6",
97
+ "skills/torusguard-web-validate/SKILL.md": "b3cd9952601cfe89dbe98765bd61be22b434e5aaf5700751348591919e595ad4",
80
98
  "templates/audit-report.template.md": "71149dd05b01a74287a47781fdc71fd2d1b4b70337da303bf78767d0410a6c90",
81
99
  "templates/authorization.template.md": "81ef843d42a19412c369f383b787465ac24173c0b14c1f5f211786eab3d10e8b",
82
100
  "templates/finding-card.template.md": "8f756edbd3e4139d3da2fb96f35bd2d2b267b33b754f187b590a89584265c1e6",
83
101
  "templates/remediation-bundle.template.md": "4d85a540e3a2e74f9b21fc8a2a1072e27ca03e97cd67ca482f529cfe722acc4d",
84
- "workflows/apply.md": "ca7fe662f5af462d036d17ecc7e82ab8a08e1989325e9e037df6364af96e2706",
85
- "workflows/audit.md": "d924b7c02d7a380c68e5c8faa69103194b098119e34c5b427585eec66f8081ca",
86
- "workflows/authorize.md": "a797addf98eb0cf29acbc9dc8f21f0d61ea93cc83255379d4722ab5ce86a4c29",
87
- "workflows/exploit-check.md": "9684009b835a61d5aca8827a971ee686a24c800425d86ef96f963dd27de845b8",
88
- "workflows/harden.md": "509484f844c9dcd10dd14c8bb6e3456021928e6cf6abd374faaf34be8fc34ce2",
89
- "workflows/init.md": "3d1668a9f6b87417c31f47c887c495f863595ed4a29074e0c5a8ee1ece1d4a35",
90
- "workflows/recheck.md": "7d374c29a5585c31b81f84fb32d6a466f2e9cb339726dc0523dba25e57bc5d13",
91
- "workflows/report.md": "56b3449cff362172c63093ee6150446d11bf05e3c8143661966dad9d42df1470",
92
- "workflows/status.md": "921129646518c592cb47ad8e8ccf3d703e8d11ea6eb89bd21a206f545e022dba",
93
- "workflows/verify.md": "e1041c38e8ada59788f66ac1bc754313a4c966c36f4c13aa6d9d9a2b90d9e06c",
94
- "workflows/web-validate.md": "d3db1fea264cd89addffbc227d8452987b050e533993c394d537f50c177224d4"
102
+ "workflows/apply.md": "dc66ef6c59ecf1996d45921ac83ba5dd2503a9f3624c8e6f24568745a072b871",
103
+ "workflows/audit.md": "969df4767b311f6468fb10ad4c98c302feb7112bafa86c14c59c8b9f5d481c89",
104
+ "workflows/authorize.md": "1ac2e3adb367a04bd20b2b6a062f6a65703e4aa6a815fe0affc0697faa433588",
105
+ "workflows/exploit-check.md": "67073930ea86219a4efd54dac4206dfc37775a660ff1b6960ed2bfea0528b4a0",
106
+ "workflows/harden.md": "56d7f8098f19c34bc581a49b5e4bacc42858606ebf1cc35c848bdfaca8744409",
107
+ "workflows/init.md": "d1e6ae9a98c30b2c3b46081c8195f524bcd8d3bc9004562d230b56c704fec02b",
108
+ "workflows/memory.md": "c034f9266380db3c05e9ffed943c2bb4ba73c060507e3508e47b543a035a5873",
109
+ "workflows/recheck.md": "106442712bfb87c6c1c9bc0ed660c6c291d4d6a0a6b860f4f93397440dba08d5",
110
+ "workflows/report.md": "35c7cc44d94ee49d8fea6b75ae7ea524790fd0e6208b5f27b84bc4fdab469b0c",
111
+ "workflows/status.md": "a14a92b8b4c30fdf9e9c073c51de4d0057f43519df03e9661117e62e65ac1d08",
112
+ "workflows/verify.md": "f96e8db92f067395d82f7ef8fd32c7c00e6c41ea1731347aadba2fbaed118cdf",
113
+ "workflows/web-validate.md": "5ef05154671582d95b2d05358f0a4f7ea52fe6ff3d3f238b732b3490925bc7f7"
95
114
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "../schemas/torusguard-config.schema.json",
3
- "version": "0.9.5",
3
+ "version": "1.0.0",
4
4
  "product": "TorusGuard Security Skill Kit",
5
5
  "severity_threshold": "medium",
6
6
  "auto_detect_stack": true,