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.
- package/.torusguard/.manifest.json +98 -79
- package/.torusguard/config/torusguard.json +1 -1
- package/.torusguard/references/csharp-security.md +41 -0
- package/.torusguard/references/go-security.md +41 -0
- package/.torusguard/references/java-security.md +40 -0
- package/.torusguard/references/polyglot-security-matrix.md +25 -0
- package/.torusguard/references/rust-security.md +40 -0
- package/.torusguard/rules/custom/.gitkeep +1 -0
- package/.torusguard/rules/custom/README.md +30 -0
- package/.torusguard/runs/report-latest.html +328 -0
- package/.torusguard/schemas/golden-recipe.schema.json +75 -0
- package/.torusguard/schemas/memory-context.schema.json +95 -0
- package/.torusguard/schemas/memory-event.schema.json +70 -0
- package/.torusguard/schemas/memory-pattern.schema.json +65 -0
- package/.torusguard/scripts/diff_guard.py +202 -15
- package/.torusguard/scripts/finding_scorer.py +199 -86
- package/.torusguard/scripts/html_reporter.py +628 -0
- package/.torusguard/scripts/manifest_builder.py +7 -5
- package/.torusguard/scripts/memory_engine.py +1334 -0
- package/.torusguard/scripts/monorepo_detector.py +123 -10
- package/.torusguard/scripts/rules_sync.py +321 -0
- package/.torusguard/scripts/run_manager.py +171 -89
- package/.torusguard/scripts/stack_detect.py +458 -26
- package/.torusguard/skills/torusguard/SKILL.md +4 -3
- package/.torusguard/skills/torusguard/bootstrap.py +344 -56
- package/.torusguard/skills/torusguard/references/csharp-security.md +41 -0
- package/.torusguard/skills/torusguard/references/go-security.md +41 -0
- package/.torusguard/skills/torusguard/references/java-security.md +40 -0
- package/.torusguard/skills/torusguard/references/polyglot-security-matrix.md +25 -0
- package/.torusguard/skills/torusguard/references/rust-security.md +40 -0
- package/.torusguard/skills/torusguard-audit/SKILL.md +25 -25
- package/.torusguard/skills/torusguard-harden/SKILL.md +3 -3
- package/.torusguard/skills/torusguard-recheck/SKILL.md +3 -3
- package/.torusguard/workflows/memory.md +53 -0
- package/README.md +307 -401
- package/bin/torusguard.js +204 -6
- package/package.json +1 -1
- package/skills/torusguard/SKILL.md +4 -3
- package/skills/torusguard/bootstrap.py +68 -4
- package/skills/torusguard/payload/.manifest.json +98 -79
- package/skills/torusguard/payload/config/torusguard.json +1 -1
- package/skills/torusguard/payload/references/csharp-security.md +41 -0
- package/skills/torusguard/payload/references/go-security.md +41 -0
- package/skills/torusguard/payload/references/java-security.md +40 -0
- package/skills/torusguard/payload/references/polyglot-security-matrix.md +25 -0
- package/skills/torusguard/payload/references/rust-security.md +40 -0
- package/skills/torusguard/payload/rules/custom/.gitkeep +1 -0
- package/skills/torusguard/payload/rules/custom/README.md +30 -0
- package/skills/torusguard/payload/schemas/golden-recipe.schema.json +75 -0
- package/skills/torusguard/payload/schemas/memory-context.schema.json +95 -0
- package/skills/torusguard/payload/schemas/memory-event.schema.json +70 -0
- package/skills/torusguard/payload/schemas/memory-pattern.schema.json +65 -0
- package/skills/torusguard/payload/scripts/diff_guard.py +202 -15
- package/skills/torusguard/payload/scripts/finding_scorer.py +199 -86
- package/skills/torusguard/payload/scripts/html_reporter.py +628 -0
- package/skills/torusguard/payload/scripts/manifest_builder.py +7 -5
- package/skills/torusguard/payload/scripts/memory_engine.py +1334 -0
- package/skills/torusguard/payload/scripts/monorepo_detector.py +123 -10
- package/skills/torusguard/payload/scripts/rules_sync.py +321 -0
- package/skills/torusguard/payload/scripts/run_manager.py +171 -89
- package/skills/torusguard/payload/scripts/stack_detect.py +458 -26
- package/skills/torusguard/payload/skills/torusguard/SKILL.md +4 -3
- package/skills/torusguard/payload/skills/torusguard/bootstrap.py +344 -56
- package/skills/torusguard/payload/skills/torusguard/references/csharp-security.md +41 -0
- package/skills/torusguard/payload/skills/torusguard/references/go-security.md +41 -0
- package/skills/torusguard/payload/skills/torusguard/references/java-security.md +40 -0
- package/skills/torusguard/payload/skills/torusguard/references/polyglot-security-matrix.md +25 -0
- package/skills/torusguard/payload/skills/torusguard/references/rust-security.md +40 -0
- package/skills/torusguard/payload/skills/torusguard-audit/SKILL.md +25 -25
- package/skills/torusguard/payload/skills/torusguard-harden/SKILL.md +3 -3
- package/skills/torusguard/payload/skills/torusguard-recheck/SKILL.md +3 -3
- package/skills/torusguard/payload/workflows/memory.md +53 -0
- package/skills/torusguard-audit/SKILL.md +25 -25
- package/skills/torusguard-harden/SKILL.md +3 -3
- package/skills/torusguard-recheck/SKILL.md +3 -3
- package/.torusguard/scripts/__pycache__/diff_guard.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/monorepo_detector.cpython-311.pyc +0 -0
- package/skills/torusguard/__pycache__/bootstrap.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/diff_guard.cpython-311.pyc +0 -0
- 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}
|
|
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
|
|
63
|
-
${CYAN}│${RESET} ${GREEN}status${RESET} Display active security posture, rules, and stack
|
|
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
|
|
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,
|
|
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}
|
|
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,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
|
|
4
|
-
version: 0.
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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": "
|
|
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": "
|
|
11
|
-
"config/torusguard.json": "
|
|
12
|
-
"references/
|
|
13
|
-
"references/
|
|
14
|
-
"references/
|
|
15
|
-
"references/
|
|
16
|
-
"references/
|
|
17
|
-
"references/
|
|
18
|
-
"references/
|
|
19
|
-
"references/
|
|
20
|
-
"references/
|
|
21
|
-
"references/
|
|
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": "
|
|
24
|
-
"rules/active/TG-DIFF-001.md": "
|
|
25
|
-
"rules/active/TG-DIFF-002.md": "
|
|
26
|
-
"rules/active/TG-DIFF-003.md": "
|
|
27
|
-
"
|
|
28
|
-
"schemas/
|
|
29
|
-
"schemas/
|
|
30
|
-
"schemas/
|
|
31
|
-
"schemas/
|
|
32
|
-
"schemas/
|
|
33
|
-
"schemas/
|
|
34
|
-
"schemas/
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
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": "
|
|
43
|
-
"skills/torusguard/SKILL.md": "
|
|
44
|
-
"skills/torusguard/bootstrap.py": "
|
|
45
|
-
"skills/torusguard/references/auth-and-sessions.md": "
|
|
46
|
-
"skills/torusguard/references/business-logic-and-abuse.md": "
|
|
47
|
-
"skills/torusguard/references/cache-and-sensitive-responses.md": "
|
|
48
|
-
"skills/torusguard/references/client-code-exposure.md": "
|
|
49
|
-
"skills/torusguard/references/
|
|
50
|
-
"skills/torusguard/references/
|
|
51
|
-
"skills/torusguard/references/
|
|
52
|
-
"skills/torusguard/references/
|
|
53
|
-
"skills/torusguard/references/
|
|
54
|
-
"skills/torusguard/references/
|
|
55
|
-
"skills/torusguard/references/
|
|
56
|
-
"skills/torusguard/references/
|
|
57
|
-
"skills/torusguard/references/
|
|
58
|
-
"skills/torusguard/references/
|
|
59
|
-
"skills/torusguard/references/
|
|
60
|
-
"skills/torusguard/references/
|
|
61
|
-
"skills/torusguard/references/
|
|
62
|
-
"skills/torusguard/references/
|
|
63
|
-
"skills/torusguard/references/
|
|
64
|
-
"skills/torusguard/references/
|
|
65
|
-
"skills/torusguard/references/
|
|
66
|
-
"skills/torusguard/references/
|
|
67
|
-
"skills/torusguard/references/
|
|
68
|
-
"skills/torusguard-
|
|
69
|
-
"skills/torusguard-
|
|
70
|
-
"skills/torusguard-
|
|
71
|
-
"skills/torusguard-
|
|
72
|
-
"skills/torusguard-
|
|
73
|
-
"skills/torusguard-
|
|
74
|
-
"skills/torusguard-
|
|
75
|
-
"skills/torusguard-
|
|
76
|
-
"skills/torusguard-
|
|
77
|
-
"skills/torusguard-
|
|
78
|
-
"skills/torusguard-
|
|
79
|
-
"skills/torusguard-
|
|
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": "
|
|
85
|
-
"workflows/audit.md": "
|
|
86
|
-
"workflows/authorize.md": "
|
|
87
|
-
"workflows/exploit-check.md": "
|
|
88
|
-
"workflows/harden.md": "
|
|
89
|
-
"workflows/init.md": "
|
|
90
|
-
"workflows/
|
|
91
|
-
"workflows/
|
|
92
|
-
"workflows/
|
|
93
|
-
"workflows/
|
|
94
|
-
"workflows/
|
|
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
|
}
|