torusguard 1.3.4 → 1.3.6
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 +66 -63
- package/.torusguard/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md +30 -14
- package/.torusguard/rules/business-logic/TG-BIZ-002-replayable-one-time-operation.md +33 -16
- package/.torusguard/rules/business-logic/TG-BIZ-003-missing-workflow-state-validation.md +31 -15
- package/.torusguard/rules/business-logic/TG-BIZ-004-unrestricted-sensitive-business-flow.md +26 -16
- package/.torusguard/rules/cache/TG-CACHE-001-sensitive-response-publicly-cacheable.md +24 -16
- package/.torusguard/rules/cache/TG-CACHE-002-missing-user-cache-isolation.md +32 -18
- package/.torusguard/rules/cache/TG-CACHE-003-sensitive-data-in-url.md +24 -17
- package/.torusguard/rules/csrf/TG-CSRF-001-missing-csrf-protection.md +31 -18
- package/.torusguard/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md +28 -17
- package/.torusguard/rules/graphql/TG-GQL-002-resolver-missing-authorization.md +33 -17
- package/.torusguard/rules/graphql/TG-GQL-003-unbounded-graphql-pagination-or-batching.md +31 -16
- package/.torusguard/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md +25 -16
- package/.torusguard/rules/secrets/TG-SEC-005-secret-in-git-history.md +24 -19
- package/.torusguard/rules/secrets/TG-SEC-006-secret-in-build-artifact.md +36 -19
- package/.torusguard/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md +21 -16
- package/.torusguard/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md +45 -18
- package/.torusguard/rules/ssrf/TG-SSRF-003-unsafe-redirect-following.md +20 -16
- package/.torusguard/rules/ssrf/TG-SSRF-004-unbounded-outbound-request.md +28 -19
- package/.torusguard/rules/supply-chain/TG-SUPPLY-001-missing-or-ignored-dependency-lockfile.md +25 -18
- package/.torusguard/rules/supply-chain/TG-SUPPLY-003-unsafe-ci-cd-secret-exposure.md +29 -19
- package/.torusguard/rules/supply-chain/TG-SUPPLY-004-unpinned-ci-action.md +23 -18
- package/.torusguard/rules/supply-chain/TG-SUPPLY-005-unsafe-dependency-install-script.md +23 -18
- package/.torusguard/rules/webhook/TG-WEBHOOK-001-missing-webhook-signature-verification.md +36 -16
- package/.torusguard/rules/webhook/TG-WEBHOOK-002-replayable-webhook.md +26 -17
- package/.torusguard/rules/webhook/TG-WEBHOOK-003-missing-webhook-idempotency.md +30 -16
- package/.torusguard/rules/webhook/TG-WEBHOOK-004-unvalidated-webhook-event-type.md +25 -16
- package/.torusguard/rules/websocket/TG-WS-002-missing-channel-level-authorization.md +28 -17
- package/.torusguard/rules/websocket/TG-WS-003-unvalidated-websocket-message.md +31 -17
- package/.torusguard/rules/websocket/TG-WS-004-unbounded-websocket-connections.md +31 -17
- package/.torusguard/rules_catalog.json +520 -0
- package/.torusguard/runs/report-latest.html +2700 -232
- package/.torusguard/runs/results-latest.sarif +20 -0
- package/.torusguard/runs/run-20260912-214110-audit/findings.json +1256 -0
- package/.torusguard/runs/run-20260912-214110-audit/findings.md +534 -0
- package/.torusguard/runs/run-20260912-214110-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260912-214110-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-214813-audit/findings.json +992 -0
- package/.torusguard/runs/run-20260912-214813-audit/findings.md +422 -0
- package/.torusguard/runs/run-20260912-214813-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260912-214813-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-auth-003-49-7c96f3/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-auth-003-49-7c96f3/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-auth-003-49-7c96f3/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-platform-001-12-cf8156/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-platform-001-12-cf8156/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-platform-001-12-cf8156/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-rate-001-26-affcfa/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-rate-001-26-affcfa/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-rate-001-26-affcfa/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-sec-001-9-e22e50/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-sec-001-9-e22e50/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-sec-001-9-e22e50/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-ssrf-004-9-9803ad/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-ssrf-004-9-9803ad/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-ssrf-004-9-9803ad/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215555-audit/findings.json +530 -0
- package/.torusguard/runs/run-20260912-215555-audit/findings.md +232 -0
- package/.torusguard/runs/run-20260912-215555-audit/manifest.json +13 -0
- package/.torusguard/runs/run-20260912-215555-audit/remediation.md +102 -0
- package/.torusguard/runs/run-20260912-215555-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-215731-audit/apply_plan.md +6 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-client-001-7-587129/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-client-001-7-587129/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-client-001-7-587129/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-db-002-9-5f7850/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-db-002-9-5f7850/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-db-002-9-5f7850/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-001-27-2486f1/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-001-27-2486f1/minimal_patch_plan.md +22 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-001-27-2486f1/patch.diff +10 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-001-12-cf8156/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-001-12-cf8156/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-001-12-cf8156/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-17-876973/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-17-876973/minimal_patch_plan.md +23 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-17-876973/patch.diff +11 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-5-40c794/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-5-40c794/minimal_patch_plan.md +23 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-5-40c794/patch.diff +11 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-001-26-affcfa/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-001-26-affcfa/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-001-26-affcfa/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-002-54-0b38d2/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-002-54-0b38d2/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-002-54-0b38d2/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-18-a3c1e8/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-18-a3c1e8/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-18-a3c1e8/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-9-e22e50/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-9-e22e50/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-9-e22e50/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-28-a1a0a1/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-28-a1a0a1/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-28-a1a0a1/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-30-00569e/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-30-00569e/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-30-00569e/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-ssrf-004-9-9803ad/metadata.json +17 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-ssrf-004-9-9803ad/minimal_patch_plan.md +21 -0
- package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-ssrf-004-9-9803ad/patch.diff +9 -0
- package/.torusguard/runs/run-20260912-215731-audit/diff_summary.md +186 -0
- package/.torusguard/runs/run-20260912-215731-audit/findings.json +497 -0
- package/.torusguard/runs/run-20260912-215731-audit/findings.md +218 -0
- package/.torusguard/runs/run-20260912-215731-audit/manifest.json +14 -0
- package/.torusguard/runs/run-20260912-215731-audit/recheck.md +76 -0
- package/.torusguard/runs/run-20260912-215731-audit/remediation.md +234 -0
- package/.torusguard/runs/run-20260912-215731-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-220134-audit/findings.json +68 -0
- package/.torusguard/runs/run-20260912-220134-audit/findings.md +36 -0
- package/.torusguard/runs/run-20260912-220134-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260912-220134-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-220200-audit/findings.json +1 -0
- package/.torusguard/runs/run-20260912-220200-audit/findings.md +8 -0
- package/.torusguard/runs/run-20260912-220200-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260912-220200-audit/recheck.md +6 -0
- package/.torusguard/runs/run-20260912-220200-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260912-220227-audit/findings.json +1 -0
- package/.torusguard/runs/run-20260912-220227-audit/findings.md +8 -0
- package/.torusguard/runs/run-20260912-220227-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260912-220227-audit/recheck.md +6 -0
- package/.torusguard/runs/run-20260912-220227-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260918-104221-audit/findings.json +1 -0
- package/.torusguard/runs/run-20260918-104221-audit/findings.md +8 -0
- package/.torusguard/runs/run-20260918-104221-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260918-104221-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260918-104236-audit/findings.json +2314 -0
- package/.torusguard/runs/run-20260918-104236-audit/findings.md +960 -0
- package/.torusguard/runs/run-20260918-104236-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260918-104236-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260918-105723-audit/findings.json +2382 -0
- package/.torusguard/runs/run-20260918-105723-audit/findings.md +960 -0
- package/.torusguard/runs/run-20260918-105723-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260918-105723-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260918-105731-audit/findings.json +1 -0
- package/.torusguard/runs/run-20260918-105731-audit/findings.md +8 -0
- package/.torusguard/runs/run-20260918-105731-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260918-105731-audit/summary.md +5 -0
- package/.torusguard/runs/run-20260918-105940-audit/findings.json +1 -0
- package/.torusguard/runs/run-20260918-105940-audit/findings.md +8 -0
- package/.torusguard/runs/run-20260918-105940-audit/manifest.json +12 -0
- package/.torusguard/runs/run-20260918-105940-audit/summary.md +5 -0
- package/.torusguard/scripts/__pycache__/apply_runner.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/audit_runner.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/audit_runner.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/diff_guard.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/finding_scorer.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/finding_scorer.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/harden_runner.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/html_reporter.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/manifest_builder.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/memory_engine.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/monorepo_detector.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/recheck_runner.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/report_sync.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/report_sync.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/run_manager.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/sarif_exporter.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/stack_detect.cpython-314.pyc +0 -0
- package/.torusguard/scripts/__pycache__/term_ui.cpython-311.pyc +0 -0
- package/.torusguard/scripts/__pycache__/term_ui.cpython-314.pyc +0 -0
- package/.torusguard/scripts/apply_runner.py +389 -377
- package/.torusguard/scripts/audit_runner.py +1513 -653
- package/.torusguard/scripts/finding_scorer.py +14 -2
- package/.torusguard/scripts/harden_runner.py +628 -455
- package/.torusguard/scripts/html_reporter.py +2668 -648
- package/.torusguard/scripts/recheck_runner.py +248 -238
- package/.torusguard/scripts/recipes_runner.py +137 -137
- package/.torusguard/scripts/report_sync.py +719 -0
- package/.torusguard/scripts/sarif_exporter.py +156 -116
- package/.torusguard/scripts/stack_detect.py +44 -2
- package/.torusguard/scripts/term_ui.py +162 -162
- package/.torusguard/skills/torusguard/SKILL.md +75 -72
- package/.torusguard/skills/torusguard-apply/SKILL.md +84 -80
- package/.torusguard/skills/torusguard-audit/SKILL.md +87 -83
- package/.torusguard/skills/torusguard-authorize/SKILL.md +7 -2
- package/.torusguard/skills/torusguard-exploit-check/SKILL.md +7 -2
- package/.torusguard/skills/torusguard-full/SKILL.md +7 -2
- package/.torusguard/skills/torusguard-harden/SKILL.md +98 -94
- package/.torusguard/skills/torusguard-init/SKILL.md +68 -64
- package/.torusguard/skills/torusguard-recheck/SKILL.md +81 -77
- package/.torusguard/skills/torusguard-report/SKILL.md +93 -72
- package/.torusguard/skills/torusguard-status/SKILL.md +62 -58
- package/.torusguard/skills/torusguard-verify/SKILL.md +7 -2
- package/.torusguard/skills/torusguard-web-validate/SKILL.md +7 -2
- package/.torusguard/snapshots/run-20260912-215731-audit/demo/playground/vulnerable_nextjs/actions.ts.bak +24 -0
- package/.torusguard/snapshots/run-20260912-215731-audit/examples/hardened-react-express/server/index.js.bak +121 -0
- package/.torusguard/snapshots/run-20260912-215731-audit/examples/python/fastapi-vuln/main.py.bak +20 -0
- package/.torusguard/snapshots/run-20260912-215731-audit/examples/vulnerable-react-express/client/src/App.jsx.bak +63 -0
- package/.torusguard/snapshots/run-20260912-215731-audit/examples/vulnerable-react-express/client/vite.config.js.bak +12 -0
- package/.torusguard/snapshots/run-20260912-215731-audit/examples/vulnerable-react-express/server/index.js.bak +82 -0
- package/.torusguard/workflows/apply.md +11 -4
- package/.torusguard/workflows/audit.md +7 -1
- package/.torusguard/workflows/authorize.md +2 -1
- package/.torusguard/workflows/exploit-check.md +2 -1
- package/.torusguard/workflows/harden.md +7 -1
- package/.torusguard/workflows/init.md +6 -1
- package/.torusguard/workflows/memory.md +2 -1
- package/.torusguard/workflows/recheck.md +7 -1
- package/.torusguard/workflows/report.md +7 -1
- package/.torusguard/workflows/status.md +6 -1
- package/.torusguard/workflows/verify.md +6 -1
- package/.torusguard/workflows/web-validate.md +2 -1
- package/README.md +476 -345
- package/bin/torusguard.js +586 -545
- package/package.json +1 -1
- package/skills/torusguard/SKILL.md +73 -72
- package/skills/torusguard/bootstrap.py +7 -2
- package/skills/torusguard/payload/.manifest.json +66 -63
- package/skills/torusguard/payload/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md +30 -14
- package/skills/torusguard/payload/rules/business-logic/TG-BIZ-002-replayable-one-time-operation.md +33 -16
- package/skills/torusguard/payload/rules/business-logic/TG-BIZ-003-missing-workflow-state-validation.md +31 -15
- package/skills/torusguard/payload/rules/business-logic/TG-BIZ-004-unrestricted-sensitive-business-flow.md +26 -16
- package/skills/torusguard/payload/rules/cache/TG-CACHE-001-sensitive-response-publicly-cacheable.md +24 -16
- package/skills/torusguard/payload/rules/cache/TG-CACHE-002-missing-user-cache-isolation.md +32 -18
- package/skills/torusguard/payload/rules/cache/TG-CACHE-003-sensitive-data-in-url.md +24 -17
- package/skills/torusguard/payload/rules/csrf/TG-CSRF-001-missing-csrf-protection.md +31 -18
- package/skills/torusguard/payload/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md +28 -17
- package/skills/torusguard/payload/rules/graphql/TG-GQL-002-resolver-missing-authorization.md +33 -17
- package/skills/torusguard/payload/rules/graphql/TG-GQL-003-unbounded-graphql-pagination-or-batching.md +31 -16
- package/skills/torusguard/payload/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md +25 -16
- package/skills/torusguard/payload/rules/secrets/TG-SEC-005-secret-in-git-history.md +24 -19
- package/skills/torusguard/payload/rules/secrets/TG-SEC-006-secret-in-build-artifact.md +36 -19
- package/skills/torusguard/payload/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md +21 -16
- package/skills/torusguard/payload/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md +45 -18
- package/skills/torusguard/payload/rules/ssrf/TG-SSRF-003-unsafe-redirect-following.md +20 -16
- package/skills/torusguard/payload/rules/ssrf/TG-SSRF-004-unbounded-outbound-request.md +28 -19
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-001-missing-or-ignored-dependency-lockfile.md +25 -18
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-003-unsafe-ci-cd-secret-exposure.md +29 -19
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-004-unpinned-ci-action.md +23 -18
- package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-005-unsafe-dependency-install-script.md +23 -18
- package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-001-missing-webhook-signature-verification.md +36 -16
- package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-002-replayable-webhook.md +26 -17
- package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-003-missing-webhook-idempotency.md +30 -16
- package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-004-unvalidated-webhook-event-type.md +25 -16
- package/skills/torusguard/payload/rules/websocket/TG-WS-002-missing-channel-level-authorization.md +28 -17
- package/skills/torusguard/payload/rules/websocket/TG-WS-003-unvalidated-websocket-message.md +31 -17
- package/skills/torusguard/payload/rules/websocket/TG-WS-004-unbounded-websocket-connections.md +31 -17
- package/skills/torusguard/payload/rules_catalog.json +520 -0
- package/skills/torusguard/payload/scripts/__pycache__/apply_runner.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/audit_runner.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/audit_runner.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/diff_guard.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/diff_guard.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/finding_scorer.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/finding_scorer.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/harden_runner.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/html_reporter.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/html_reporter.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/manifest_builder.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/memory_engine.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/memory_engine.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/monorepo_detector.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/monorepo_detector.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/recheck_runner.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/report_sync.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/report_sync.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/rules_sync.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/run_manager.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/run_manager.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/sarif_exporter.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/stack_detect.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/stack_detect.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/term_ui.cpython-311.pyc +0 -0
- package/skills/torusguard/payload/scripts/__pycache__/term_ui.cpython-314.pyc +0 -0
- package/skills/torusguard/payload/scripts/apply_runner.py +389 -377
- package/skills/torusguard/payload/scripts/audit_runner.py +1513 -653
- package/skills/torusguard/payload/scripts/finding_scorer.py +14 -2
- package/skills/torusguard/payload/scripts/harden_runner.py +628 -455
- package/skills/torusguard/payload/scripts/html_reporter.py +2668 -648
- package/skills/torusguard/payload/scripts/recheck_runner.py +248 -238
- package/skills/torusguard/payload/scripts/recipes_runner.py +137 -137
- package/skills/torusguard/payload/scripts/report_sync.py +719 -0
- package/skills/torusguard/payload/scripts/sarif_exporter.py +156 -116
- package/skills/torusguard/payload/scripts/stack_detect.py +44 -2
- package/skills/torusguard/payload/scripts/term_ui.py +162 -162
- package/skills/torusguard/payload/skills/torusguard/SKILL.md +75 -72
- package/skills/torusguard/payload/skills/torusguard-apply/SKILL.md +84 -80
- package/skills/torusguard/payload/skills/torusguard-audit/SKILL.md +87 -83
- package/skills/torusguard/payload/skills/torusguard-authorize/SKILL.md +7 -2
- package/skills/torusguard/payload/skills/torusguard-exploit-check/SKILL.md +7 -2
- package/skills/torusguard/payload/skills/torusguard-full/SKILL.md +7 -2
- package/skills/torusguard/payload/skills/torusguard-harden/SKILL.md +98 -94
- package/skills/torusguard/payload/skills/torusguard-init/SKILL.md +68 -64
- package/skills/torusguard/payload/skills/torusguard-recheck/SKILL.md +81 -77
- package/skills/torusguard/payload/skills/torusguard-report/SKILL.md +93 -72
- package/skills/torusguard/payload/skills/torusguard-status/SKILL.md +62 -58
- package/skills/torusguard/payload/skills/torusguard-verify/SKILL.md +7 -2
- package/skills/torusguard/payload/skills/torusguard-web-validate/SKILL.md +7 -2
- package/skills/torusguard/payload/workflows/apply.md +11 -4
- package/skills/torusguard/payload/workflows/audit.md +7 -1
- package/skills/torusguard/payload/workflows/authorize.md +2 -1
- package/skills/torusguard/payload/workflows/exploit-check.md +2 -1
- package/skills/torusguard/payload/workflows/harden.md +7 -1
- package/skills/torusguard/payload/workflows/init.md +6 -1
- package/skills/torusguard/payload/workflows/memory.md +2 -1
- package/skills/torusguard/payload/workflows/recheck.md +7 -1
- package/skills/torusguard/payload/workflows/report.md +7 -1
- package/skills/torusguard/payload/workflows/status.md +6 -1
- package/skills/torusguard/payload/workflows/verify.md +6 -1
- package/skills/torusguard/payload/workflows/web-validate.md +2 -1
- package/skills/torusguard-apply/SKILL.md +84 -80
- package/skills/torusguard-audit/SKILL.md +87 -83
- package/skills/torusguard-authorize/SKILL.md +7 -2
- package/skills/torusguard-exploit-check/SKILL.md +7 -2
- package/skills/torusguard-full/SKILL.md +7 -2
- package/skills/torusguard-harden/SKILL.md +98 -94
- package/skills/torusguard-init/SKILL.md +68 -64
- package/skills/torusguard-recheck/SKILL.md +81 -77
- package/skills/torusguard-report/SKILL.md +93 -72
- package/skills/torusguard-status/SKILL.md +62 -58
- package/skills/torusguard-verify/SKILL.md +7 -2
- package/skills/torusguard-web-validate/SKILL.md +7 -2
|
@@ -1,162 +1,162 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
TorusGuard Unified Terminal UI Engine (v1.3.
|
|
4
|
-
Provides mathematically exact 75-column card formatting, ANSI-stripping,
|
|
5
|
-
Unicode/emoji visual width calculation, and visual truncation with ellipsis.
|
|
6
|
-
Pure Python 3.10+ standard library (zero external dependencies).
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import sys
|
|
10
|
-
import os
|
|
11
|
-
import re
|
|
12
|
-
import unicodedata
|
|
13
|
-
from typing import Optional
|
|
14
|
-
|
|
15
|
-
# Ensure UTF-8 stdout/stderr on Windows consoles
|
|
16
|
-
if sys.stdout and hasattr(sys.stdout, "reconfigure"):
|
|
17
|
-
try:
|
|
18
|
-
getattr(sys.stdout, "reconfigure")(encoding="utf-8", errors="replace")
|
|
19
|
-
except Exception:
|
|
20
|
-
pass
|
|
21
|
-
if sys.stderr and hasattr(sys.stderr, "reconfigure"):
|
|
22
|
-
try:
|
|
23
|
-
getattr(sys.stderr, "reconfigure")(encoding="utf-8", errors="replace")
|
|
24
|
-
except Exception:
|
|
25
|
-
pass
|
|
26
|
-
|
|
27
|
-
# ─── ANSI Colors & Styles ─────────────────────────────────────────────────────
|
|
28
|
-
BOLD = "\033[1m"
|
|
29
|
-
DIM = "\033[2m"
|
|
30
|
-
RESET = "\033[0m"
|
|
31
|
-
CYAN = "\033[36m"
|
|
32
|
-
GREEN = "\033[32m"
|
|
33
|
-
YELLOW = "\033[33m"
|
|
34
|
-
WHITE = "\033[97m"
|
|
35
|
-
GRAY = "\033[90m"
|
|
36
|
-
RED = "\033[31m"
|
|
37
|
-
MAGENTA = "\033[35m"
|
|
38
|
-
BG_GREEN = "\033[42m"
|
|
39
|
-
BG_CYAN = "\033[46m"
|
|
40
|
-
|
|
41
|
-
ANSI_REGEX = re.compile(r'\x1b\[[0-9;]*m|\033\[[0-9;]*m')
|
|
42
|
-
|
|
43
|
-
def strip_ansi(text: str) -> str:
|
|
44
|
-
"""Remove all ANSI color and style escape sequences."""
|
|
45
|
-
return ANSI_REGEX.sub('', text)
|
|
46
|
-
|
|
47
|
-
def get_visual_width(text: str) -> int:
|
|
48
|
-
"""
|
|
49
|
-
Calculate the printable display width of a string in terminal columns.
|
|
50
|
-
Accounts for ANSI escapes, Unicode variation selectors, emojis, and fullwidth chars.
|
|
51
|
-
"""
|
|
52
|
-
clean = strip_ansi(text)
|
|
53
|
-
width = 0
|
|
54
|
-
for ch in clean:
|
|
55
|
-
cp = ord(ch)
|
|
56
|
-
# Variation selectors (VS1-16, VS17-256) occupy 0 terminal columns
|
|
57
|
-
if (0xFE00 <= cp <= 0xFE0F) or (0xE0100 <= cp <= 0xE01EF):
|
|
58
|
-
continue
|
|
59
|
-
# Zero-width spaces, joiners, soft hyphens
|
|
60
|
-
if cp in (0x200B, 0x200C, 0x200D, 0x00AD):
|
|
61
|
-
continue
|
|
62
|
-
ea = unicodedata.east_asian_width(ch)
|
|
63
|
-
if ea in ('W', 'F'):
|
|
64
|
-
width += 2
|
|
65
|
-
elif cp >= 0x1F300: # Emojis and miscellaneous pictographs
|
|
66
|
-
width += 2
|
|
67
|
-
elif cp in (0x26A0, 0x2714, 0x2716, 0x2139): # ⚠, ✔, ✖, ℹ
|
|
68
|
-
width += 1
|
|
69
|
-
else:
|
|
70
|
-
width += 1
|
|
71
|
-
return width
|
|
72
|
-
|
|
73
|
-
def truncate_visual(text: str, max_w: int = 67) -> str:
|
|
74
|
-
"""Truncate text visually to max_w columns without breaking ANSI escape codes."""
|
|
75
|
-
if get_visual_width(text) <= max_w:
|
|
76
|
-
return text
|
|
77
|
-
out = []
|
|
78
|
-
curr_w = 0
|
|
79
|
-
in_ansi = False
|
|
80
|
-
ansi_buf = ''
|
|
81
|
-
for ch in text:
|
|
82
|
-
if ch in ('\033', '\x1b'):
|
|
83
|
-
in_ansi = True
|
|
84
|
-
ansi_buf = ch
|
|
85
|
-
continue
|
|
86
|
-
if in_ansi:
|
|
87
|
-
ansi_buf += ch
|
|
88
|
-
if ch == 'm':
|
|
89
|
-
in_ansi = False
|
|
90
|
-
out.append(ansi_buf)
|
|
91
|
-
continue
|
|
92
|
-
cp = ord(ch)
|
|
93
|
-
if (0xFE00 <= cp <= 0xFE0F) or (0xE0100 <= cp <= 0xE01EF) or cp in (0x200B, 0x200C, 0x200D, 0x00AD):
|
|
94
|
-
out.append(ch)
|
|
95
|
-
continue
|
|
96
|
-
ea = unicodedata.east_asian_width(ch)
|
|
97
|
-
cw = 2 if (ea in ('W', 'F') or cp >= 0x1F300) else 1
|
|
98
|
-
if curr_w + cw > max_w - 3:
|
|
99
|
-
out.append(RESET + '...')
|
|
100
|
-
curr_w += 3
|
|
101
|
-
break
|
|
102
|
-
out.append(ch)
|
|
103
|
-
curr_w += cw
|
|
104
|
-
out.append(RESET)
|
|
105
|
-
return ''.join(out)
|
|
106
|
-
|
|
107
|
-
def format_box_line(content: str, width: int = 67, border: str = "│", border_color: str = CYAN) -> str:
|
|
108
|
-
"""
|
|
109
|
-
Pad content so the card line is strictly 75 visual columns total width.
|
|
110
|
-
Layout: ' ' (2) + border (1) + ' ' (2) + content/pad (width=67) + ' ' (2) + border (1) = 75 cols.
|
|
111
|
-
"""
|
|
112
|
-
trunc = truncate_visual(content, width)
|
|
113
|
-
vis = get_visual_width(trunc)
|
|
114
|
-
pad = " " * max(0, width - vis)
|
|
115
|
-
return f" {border_color}{border}{RESET} {trunc}{pad} {border_color}{border}{RESET}"
|
|
116
|
-
|
|
117
|
-
def card_border_top(title: str = "", border_color: str = CYAN, double: bool = False) -> str:
|
|
118
|
-
"""Generate 75-column top border (single ┌ or double ╔) with optional title."""
|
|
119
|
-
left = "╔" if double else "┌"
|
|
120
|
-
right = "╗" if double else "┐"
|
|
121
|
-
h = "═" if double else "─"
|
|
122
|
-
if title:
|
|
123
|
-
vis = get_visual_width(title)
|
|
124
|
-
rem = max(0, 68 - vis)
|
|
125
|
-
return f" {border_color}{left}{h} {BOLD}{WHITE}{title}{RESET}{border_color} {h * rem}{right}{RESET}"
|
|
126
|
-
return f" {border_color}{left}{h * 71}{right}{RESET}"
|
|
127
|
-
|
|
128
|
-
def card_border_bottom(border_color: str = CYAN, double: bool = False) -> str:
|
|
129
|
-
"""Generate 75-column bottom border (single └ or double ╚)."""
|
|
130
|
-
left = "╚" if double else "└"
|
|
131
|
-
right = "╝" if double else "┘"
|
|
132
|
-
h = "═" if double else "─"
|
|
133
|
-
return f" {border_color}{left}{h * 71}{right}{RESET}"
|
|
134
|
-
|
|
135
|
-
def card_divider(title: str = "", border_color: str = CYAN, double: bool = False) -> str:
|
|
136
|
-
"""Generate 75-column divider (single ├ or double ╠) with optional title."""
|
|
137
|
-
left = "╠" if double else "├"
|
|
138
|
-
right = "╣" if double else "┤"
|
|
139
|
-
h = "═" if double else "─"
|
|
140
|
-
if title:
|
|
141
|
-
vis = get_visual_width(title)
|
|
142
|
-
rem = max(0, 68 - vis)
|
|
143
|
-
return f" {border_color}{left}{h} {BOLD}{WHITE}{title}{RESET}{border_color} {h * rem}{right}{RESET}"
|
|
144
|
-
return f" {border_color}{left}{h * 71}{right}{RESET}"
|
|
145
|
-
|
|
146
|
-
def card_header(title: str, subtitle: str = "", version: str = "v1.3.4", border_color: str = CYAN) -> str:
|
|
147
|
-
"""Generate standardized 75-column curved header box."""
|
|
148
|
-
top = f" {border_color}╭{'─' * 71}╮{RESET}"
|
|
149
|
-
bottom = f" {border_color}╰{'─' * 71}╯{RESET}"
|
|
150
|
-
empty = f" {border_color}│{' ' * 71}│{RESET}"
|
|
151
|
-
|
|
152
|
-
# Calculate padding between title and version
|
|
153
|
-
title_vis = get_visual_width(title)
|
|
154
|
-
ver_vis = get_visual_width(version)
|
|
155
|
-
space_count = max(1, 67 - title_vis - ver_vis)
|
|
156
|
-
title_str = f"{BOLD}{WHITE}{title}{RESET}{' ' * space_count}{GRAY}{version}{RESET}"
|
|
157
|
-
|
|
158
|
-
lines = [top, empty, format_box_line(title_str, width=67, border_color=border_color)]
|
|
159
|
-
if subtitle:
|
|
160
|
-
lines.append(format_box_line(f"{DIM}{subtitle}{RESET}", width=67, border_color=border_color))
|
|
161
|
-
lines.extend([empty, bottom])
|
|
162
|
-
return "\n".join(lines)
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
TorusGuard Unified Terminal UI Engine (v1.3.6)
|
|
4
|
+
Provides mathematically exact 75-column card formatting, ANSI-stripping,
|
|
5
|
+
Unicode/emoji visual width calculation, and visual truncation with ellipsis.
|
|
6
|
+
Pure Python 3.10+ standard library (zero external dependencies).
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sys
|
|
10
|
+
import os
|
|
11
|
+
import re
|
|
12
|
+
import unicodedata
|
|
13
|
+
from typing import Optional
|
|
14
|
+
|
|
15
|
+
# Ensure UTF-8 stdout/stderr on Windows consoles
|
|
16
|
+
if sys.stdout and hasattr(sys.stdout, "reconfigure"):
|
|
17
|
+
try:
|
|
18
|
+
getattr(sys.stdout, "reconfigure")(encoding="utf-8", errors="replace")
|
|
19
|
+
except Exception:
|
|
20
|
+
pass
|
|
21
|
+
if sys.stderr and hasattr(sys.stderr, "reconfigure"):
|
|
22
|
+
try:
|
|
23
|
+
getattr(sys.stderr, "reconfigure")(encoding="utf-8", errors="replace")
|
|
24
|
+
except Exception:
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
# ─── ANSI Colors & Styles ─────────────────────────────────────────────────────
|
|
28
|
+
BOLD = "\033[1m"
|
|
29
|
+
DIM = "\033[2m"
|
|
30
|
+
RESET = "\033[0m"
|
|
31
|
+
CYAN = "\033[36m"
|
|
32
|
+
GREEN = "\033[32m"
|
|
33
|
+
YELLOW = "\033[33m"
|
|
34
|
+
WHITE = "\033[97m"
|
|
35
|
+
GRAY = "\033[90m"
|
|
36
|
+
RED = "\033[31m"
|
|
37
|
+
MAGENTA = "\033[35m"
|
|
38
|
+
BG_GREEN = "\033[42m"
|
|
39
|
+
BG_CYAN = "\033[46m"
|
|
40
|
+
|
|
41
|
+
ANSI_REGEX = re.compile(r'\x1b\[[0-9;]*m|\033\[[0-9;]*m')
|
|
42
|
+
|
|
43
|
+
def strip_ansi(text: str) -> str:
|
|
44
|
+
"""Remove all ANSI color and style escape sequences."""
|
|
45
|
+
return ANSI_REGEX.sub('', text)
|
|
46
|
+
|
|
47
|
+
def get_visual_width(text: str) -> int:
|
|
48
|
+
"""
|
|
49
|
+
Calculate the printable display width of a string in terminal columns.
|
|
50
|
+
Accounts for ANSI escapes, Unicode variation selectors, emojis, and fullwidth chars.
|
|
51
|
+
"""
|
|
52
|
+
clean = strip_ansi(text)
|
|
53
|
+
width = 0
|
|
54
|
+
for ch in clean:
|
|
55
|
+
cp = ord(ch)
|
|
56
|
+
# Variation selectors (VS1-16, VS17-256) occupy 0 terminal columns
|
|
57
|
+
if (0xFE00 <= cp <= 0xFE0F) or (0xE0100 <= cp <= 0xE01EF):
|
|
58
|
+
continue
|
|
59
|
+
# Zero-width spaces, joiners, soft hyphens
|
|
60
|
+
if cp in (0x200B, 0x200C, 0x200D, 0x00AD):
|
|
61
|
+
continue
|
|
62
|
+
ea = unicodedata.east_asian_width(ch)
|
|
63
|
+
if ea in ('W', 'F'):
|
|
64
|
+
width += 2
|
|
65
|
+
elif cp >= 0x1F300: # Emojis and miscellaneous pictographs
|
|
66
|
+
width += 2
|
|
67
|
+
elif cp in (0x26A0, 0x2714, 0x2716, 0x2139): # ⚠, ✔, ✖, ℹ
|
|
68
|
+
width += 1
|
|
69
|
+
else:
|
|
70
|
+
width += 1
|
|
71
|
+
return width
|
|
72
|
+
|
|
73
|
+
def truncate_visual(text: str, max_w: int = 67) -> str:
|
|
74
|
+
"""Truncate text visually to max_w columns without breaking ANSI escape codes."""
|
|
75
|
+
if get_visual_width(text) <= max_w:
|
|
76
|
+
return text
|
|
77
|
+
out = []
|
|
78
|
+
curr_w = 0
|
|
79
|
+
in_ansi = False
|
|
80
|
+
ansi_buf = ''
|
|
81
|
+
for ch in text:
|
|
82
|
+
if ch in ('\033', '\x1b'):
|
|
83
|
+
in_ansi = True
|
|
84
|
+
ansi_buf = ch
|
|
85
|
+
continue
|
|
86
|
+
if in_ansi:
|
|
87
|
+
ansi_buf += ch
|
|
88
|
+
if ch == 'm':
|
|
89
|
+
in_ansi = False
|
|
90
|
+
out.append(ansi_buf)
|
|
91
|
+
continue
|
|
92
|
+
cp = ord(ch)
|
|
93
|
+
if (0xFE00 <= cp <= 0xFE0F) or (0xE0100 <= cp <= 0xE01EF) or cp in (0x200B, 0x200C, 0x200D, 0x00AD):
|
|
94
|
+
out.append(ch)
|
|
95
|
+
continue
|
|
96
|
+
ea = unicodedata.east_asian_width(ch)
|
|
97
|
+
cw = 2 if (ea in ('W', 'F') or cp >= 0x1F300) else 1
|
|
98
|
+
if curr_w + cw > max_w - 3:
|
|
99
|
+
out.append(RESET + '...')
|
|
100
|
+
curr_w += 3
|
|
101
|
+
break
|
|
102
|
+
out.append(ch)
|
|
103
|
+
curr_w += cw
|
|
104
|
+
out.append(RESET)
|
|
105
|
+
return ''.join(out)
|
|
106
|
+
|
|
107
|
+
def format_box_line(content: str, width: int = 67, border: str = "│", border_color: str = CYAN) -> str:
|
|
108
|
+
"""
|
|
109
|
+
Pad content so the card line is strictly 75 visual columns total width.
|
|
110
|
+
Layout: ' ' (2) + border (1) + ' ' (2) + content/pad (width=67) + ' ' (2) + border (1) = 75 cols.
|
|
111
|
+
"""
|
|
112
|
+
trunc = truncate_visual(content, width)
|
|
113
|
+
vis = get_visual_width(trunc)
|
|
114
|
+
pad = " " * max(0, width - vis)
|
|
115
|
+
return f" {border_color}{border}{RESET} {trunc}{pad} {border_color}{border}{RESET}"
|
|
116
|
+
|
|
117
|
+
def card_border_top(title: str = "", border_color: str = CYAN, double: bool = False) -> str:
|
|
118
|
+
"""Generate 75-column top border (single ┌ or double ╔) with optional title."""
|
|
119
|
+
left = "╔" if double else "┌"
|
|
120
|
+
right = "╗" if double else "┐"
|
|
121
|
+
h = "═" if double else "─"
|
|
122
|
+
if title:
|
|
123
|
+
vis = get_visual_width(title)
|
|
124
|
+
rem = max(0, 68 - vis)
|
|
125
|
+
return f" {border_color}{left}{h} {BOLD}{WHITE}{title}{RESET}{border_color} {h * rem}{right}{RESET}"
|
|
126
|
+
return f" {border_color}{left}{h * 71}{right}{RESET}"
|
|
127
|
+
|
|
128
|
+
def card_border_bottom(border_color: str = CYAN, double: bool = False) -> str:
|
|
129
|
+
"""Generate 75-column bottom border (single └ or double ╚)."""
|
|
130
|
+
left = "╚" if double else "└"
|
|
131
|
+
right = "╝" if double else "┘"
|
|
132
|
+
h = "═" if double else "─"
|
|
133
|
+
return f" {border_color}{left}{h * 71}{right}{RESET}"
|
|
134
|
+
|
|
135
|
+
def card_divider(title: str = "", border_color: str = CYAN, double: bool = False) -> str:
|
|
136
|
+
"""Generate 75-column divider (single ├ or double ╠) with optional title."""
|
|
137
|
+
left = "╠" if double else "├"
|
|
138
|
+
right = "╣" if double else "┤"
|
|
139
|
+
h = "═" if double else "─"
|
|
140
|
+
if title:
|
|
141
|
+
vis = get_visual_width(title)
|
|
142
|
+
rem = max(0, 68 - vis)
|
|
143
|
+
return f" {border_color}{left}{h} {BOLD}{WHITE}{title}{RESET}{border_color} {h * rem}{right}{RESET}"
|
|
144
|
+
return f" {border_color}{left}{h * 71}{right}{RESET}"
|
|
145
|
+
|
|
146
|
+
def card_header(title: str, subtitle: str = "", version: str = "v1.3.4", border_color: str = CYAN) -> str:
|
|
147
|
+
"""Generate standardized 75-column curved header box."""
|
|
148
|
+
top = f" {border_color}╭{'─' * 71}╮{RESET}"
|
|
149
|
+
bottom = f" {border_color}╰{'─' * 71}╯{RESET}"
|
|
150
|
+
empty = f" {border_color}│{' ' * 71}│{RESET}"
|
|
151
|
+
|
|
152
|
+
# Calculate padding between title and version
|
|
153
|
+
title_vis = get_visual_width(title)
|
|
154
|
+
ver_vis = get_visual_width(version)
|
|
155
|
+
space_count = max(1, 67 - title_vis - ver_vis)
|
|
156
|
+
title_str = f"{BOLD}{WHITE}{title}{RESET}{' ' * space_count}{GRAY}{version}{RESET}"
|
|
157
|
+
|
|
158
|
+
lines = [top, empty, format_box_line(title_str, width=67, border_color=border_color)]
|
|
159
|
+
if subtitle:
|
|
160
|
+
lines.append(format_box_line(f"{DIM}{subtitle}{RESET}", width=67, border_color=border_color))
|
|
161
|
+
lines.extend([empty, bottom])
|
|
162
|
+
return "\n".join(lines)
|
|
@@ -1,72 +1,75 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: torusguard
|
|
3
|
-
description: Universal autonomous security engine:
|
|
4
|
-
version: 1.3.
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# TorusGuard Master Security Engine & Command Router
|
|
8
|
-
|
|
9
|
-
**Core Invariant:** If the browser or client receives it, users can inspect it. Never expose database credentials, master keys, or private API secrets in client bundles. Always isolate multi-tenant database queries.
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Command Catalog: Terminal CLI & AI Chat Parity
|
|
14
|
-
|
|
15
|
-
TorusGuard operates with 100% feature parity across both the terminal CLI and AI chat slash commands:
|
|
16
|
-
|
|
17
|
-
| Capability | Terminal CLI Command | AI Chat Slash Command | Specialist Skill | Purpose |
|
|
18
|
-
| :--- | :--- | :--- | :--- | :--- |
|
|
19
|
-
| **Init** | `npx torusguard init` | `/torusguard init` | `skills/torusguard-init` | Stack discovery, rule activation, workspace scaffolding |
|
|
20
|
-
| **Status** | `npx torusguard status` | `/torusguard status` | `skills/torusguard-status` | Posture score, active rules, run history, scope check |
|
|
21
|
-
| **Audit** | `npx torusguard audit` | `/torusguard audit` | `skills/torusguard-audit` | Static AST scan, invariant fingerprinting, confidence scoring |
|
|
22
|
-
| **Verify** | `npx torusguard verify` | `/torusguard verify` | `skills/torusguard-verify` | Evidence sufficiency audit & line match calibration |
|
|
23
|
-
| **Harden** | `npx torusguard harden` | `/torusguard harden` | `skills/torusguard-harden` | Ponytail patch formulation ($\le 35$ add, $\le 25$ del) |
|
|
24
|
-
| **Apply** | `npx torusguard apply [--yes]` | `/torusguard apply` | `skills/torusguard-apply` | Human Gate review, `.bak` snapshots, patch application |
|
|
25
|
-
| **Rollback** | `npx torusguard rollback` | `/torusguard rollback` | `skills/torusguard-apply` | Instant 1-step rollback from pre-apply snapshots |
|
|
26
|
-
| **Recheck** | `npx torusguard recheck` | `/torusguard recheck` | `skills/torusguard-recheck` | Targeted differential AST scan, fix closure verification |
|
|
27
|
-
| **Recipes** | `npx torusguard recipes` | `/torusguard recipes` | `skills/torusguard-harden` | Explore verified Golden Fix Recipes from persistent memory |
|
|
28
|
-
| **Report** | `npx torusguard report --html` | `/torusguard report` | `skills/torusguard-report` | Executive posture reporting, SARIF v2.1.0 & visual HTML |
|
|
29
|
-
| **Authorize** | `npx torusguard authorize` | `/torusguard authorize` | `skills/torusguard-authorize`| Legal scope definition & safety boundaries |
|
|
30
|
-
| **Validate** | `npx torusguard web-validate` | `/torusguard web-validate` | `skills/torusguard-web-validate`| Authorized non-destructive HTTP probing |
|
|
31
|
-
| **Exploit** | `npx torusguard exploit-check` | `/torusguard exploit-check`| `skills/torusguard-exploit-check`| Bounded single-step exploitability confirmation |
|
|
32
|
-
| **Full** | `npx torusguard full` | `/torusguard full` | `skills/torusguard-full` | End-to-end 7-stage closed-loop execution |
|
|
33
|
-
| **Sync** | `npx torusguard rules sync` | `/torusguard rules sync` | `skills/torusguard-init` | Synchronize rules across AI editors (Cursor, Claude, Antigravity) |
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## Non-Negotiable Invariants
|
|
38
|
-
|
|
39
|
-
1. **Browser-Code Truth:** If the client receives it, it is public. Zero hardcoded secrets (`SUPABASE_SERVICE_ROLE_KEY`, private tokens, live API keys) in frontend code.
|
|
40
|
-
2. **Multi-Tenant Isolation:** All database lookups must be scoped by organization or user ownership (`tenant_id`, `organization_id`, `where: { tenantId }`).
|
|
41
|
-
3. **Ponytail Churn Bounds:** Patches must be minimal and surgical ($\le 35$ additions, $\le 25$ deletions). Never perform full-file rewrites.
|
|
42
|
-
4. **Standardized 75-Column Terminal:** All CLI terminal output is strictly normalized to 75 visual columns with Unicode emoji width calculation, ANSI escape handling, and visual truncation with ellipsis (`...`).
|
|
43
|
-
5. **Zero Security Bypasses:** Never insert `# nosec`, `verify=False`, `InsecureSkipVerify: true`, `[AllowAnonymous]`, or `csrf().disable()`.
|
|
44
|
-
6. **Snapshots Before Edits:** Every code modification must capture a byte-for-byte pre-apply backup in `.torusguard/snapshots/<run_id>/` before touching disk code.
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## Workspace Layout Structure
|
|
49
|
-
```
|
|
50
|
-
.torusguard/
|
|
51
|
-
├── config/
|
|
52
|
-
│ ├── torusguard.json # Detected stack, settings, and rule counts
|
|
53
|
-
│ └── scope.json # Authorized runtime validation targets & TTL
|
|
54
|
-
├── memory/
|
|
55
|
-
│ ├── context.json # Aggregated security memory context
|
|
56
|
-
│ ├── patterns.json # Distilled Golden Fix Recipes
|
|
57
|
-
│ └── events.json # Historical audit, apply, and recheck events
|
|
58
|
-
├── rules/
|
|
59
|
-
│ └── active/ # Active TG-* rule definitions
|
|
60
|
-
├── runs/
|
|
61
|
-
│ └── run-YYYYMMDD-HHMMSS-audit/
|
|
62
|
-
│ ├── findings.json # Machine-readable AST findings
|
|
63
|
-
│ ├── findings.md # Actionable markdown finding cards
|
|
64
|
-
│ ├── remediation.md # Formulated candidate patch catalog
|
|
65
|
-
│ ├── diff_summary.md # Summary of applied diffs
|
|
66
|
-
│ ├── recheck.md # Differential recheck status transitions
|
|
67
|
-
│ ├── report.html # Single-file visual dark-mode HTML report
|
|
68
|
-
│ ├── results.sarif # OASIS SARIF v2.1.0 log
|
|
69
|
-
│ └── bundles/ # Formulated Ponytail remediation bundles
|
|
70
|
-
└── snapshots/
|
|
71
|
-
└── run-YYYYMMDD-HHMMSS-audit/ # Pre-apply .bak files for instant rollback
|
|
72
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: torusguard
|
|
3
|
+
description: Universal autonomous security engine: 74 canonical rules across 18 families, polyglot stack detection across 16+ languages, Ponytail remediation bounds (<=35 add, <=25 del), standardized 75-column terminal UI, SARIF v2.1.0 exports, and persistent security memory context.
|
|
4
|
+
version: 1.3.6
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# TorusGuard Master Security Engine & Command Router
|
|
8
|
+
|
|
9
|
+
**Core Invariant:** If the browser or client receives it, users can inspect it. Never expose database credentials, master keys, or private API secrets in client bundles. Always isolate multi-tenant database queries.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Command Catalog: Terminal CLI & AI Chat Parity
|
|
14
|
+
|
|
15
|
+
TorusGuard operates with 100% feature parity across both the terminal CLI and AI chat slash commands:
|
|
16
|
+
|
|
17
|
+
| Capability | Terminal CLI Command | AI Chat Slash Command | Specialist Skill | Purpose |
|
|
18
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
19
|
+
| **Init** | `npx torusguard init` | `/torusguard init` | `skills/torusguard-init` | Stack discovery, rule activation, workspace scaffolding |
|
|
20
|
+
| **Status** | `npx torusguard status` | `/torusguard status` | `skills/torusguard-status` | Posture score, active rules, run history, scope check |
|
|
21
|
+
| **Audit** | `npx torusguard audit` | `/torusguard audit` | `skills/torusguard-audit` | Static AST scan, invariant fingerprinting, confidence scoring |
|
|
22
|
+
| **Verify** | `npx torusguard verify` | `/torusguard verify` | `skills/torusguard-verify` | Evidence sufficiency audit & line match calibration |
|
|
23
|
+
| **Harden** | `npx torusguard harden` | `/torusguard harden` | `skills/torusguard-harden` | Ponytail patch formulation ($\le 35$ add, $\le 25$ del) |
|
|
24
|
+
| **Apply** | `npx torusguard apply [--yes]` | `/torusguard apply` | `skills/torusguard-apply` | Human Gate review, `.bak` snapshots, patch application |
|
|
25
|
+
| **Rollback** | `npx torusguard rollback` | `/torusguard rollback` | `skills/torusguard-apply` | Instant 1-step rollback from pre-apply snapshots |
|
|
26
|
+
| **Recheck** | `npx torusguard recheck` | `/torusguard recheck` | `skills/torusguard-recheck` | Targeted differential AST scan, fix closure verification |
|
|
27
|
+
| **Recipes** | `npx torusguard recipes` | `/torusguard recipes` | `skills/torusguard-harden` | Explore verified Golden Fix Recipes from persistent memory |
|
|
28
|
+
| **Report** | `npx torusguard report --html` | `/torusguard report` | `skills/torusguard-report` | Executive posture reporting, SARIF v2.1.0 & visual HTML |
|
|
29
|
+
| **Authorize** | `npx torusguard authorize` | `/torusguard authorize` | `skills/torusguard-authorize`| Legal scope definition & safety boundaries |
|
|
30
|
+
| **Validate** | `npx torusguard web-validate` | `/torusguard web-validate` | `skills/torusguard-web-validate`| Authorized non-destructive HTTP probing |
|
|
31
|
+
| **Exploit** | `npx torusguard exploit-check` | `/torusguard exploit-check`| `skills/torusguard-exploit-check`| Bounded single-step exploitability confirmation |
|
|
32
|
+
| **Full** | `npx torusguard full` | `/torusguard full` | `skills/torusguard-full` | End-to-end 7-stage closed-loop execution |
|
|
33
|
+
| **Sync** | `npx torusguard rules sync` | `/torusguard rules sync` | `skills/torusguard-init` | Synchronize rules across AI editors (Cursor, Claude, Antigravity) |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Non-Negotiable Invariants
|
|
38
|
+
|
|
39
|
+
1. **Browser-Code Truth:** If the client receives it, it is public. Zero hardcoded secrets (`SUPABASE_SERVICE_ROLE_KEY`, private tokens, live API keys) in frontend code.
|
|
40
|
+
2. **Multi-Tenant Isolation:** All database lookups must be scoped by organization or user ownership (`tenant_id`, `organization_id`, `where: { tenantId }`).
|
|
41
|
+
3. **Ponytail Churn Bounds:** Patches must be minimal and surgical ($\le 35$ additions, $\le 25$ deletions). Never perform full-file rewrites.
|
|
42
|
+
4. **Standardized 75-Column Terminal:** All CLI terminal output is strictly normalized to 75 visual columns with Unicode emoji width calculation, ANSI escape handling, and visual truncation with ellipsis (`...`).
|
|
43
|
+
5. **Zero Security Bypasses:** Never insert `# nosec`, `verify=False`, `InsecureSkipVerify: true`, `[AllowAnonymous]`, or `csrf().disable()`.
|
|
44
|
+
6. **Snapshots Before Edits:** Every code modification must capture a byte-for-byte pre-apply backup in `.torusguard/snapshots/<run_id>/` before touching disk code.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Workspace Layout Structure
|
|
49
|
+
```
|
|
50
|
+
.torusguard/
|
|
51
|
+
├── config/
|
|
52
|
+
│ ├── torusguard.json # Detected stack, settings, and rule counts
|
|
53
|
+
│ └── scope.json # Authorized runtime validation targets & TTL
|
|
54
|
+
├── memory/
|
|
55
|
+
│ ├── context.json # Aggregated security memory context
|
|
56
|
+
│ ├── patterns.json # Distilled Golden Fix Recipes
|
|
57
|
+
│ └── events.json # Historical audit, apply, and recheck events
|
|
58
|
+
├── rules/
|
|
59
|
+
│ └── active/ # Active TG-* rule definitions
|
|
60
|
+
├── runs/
|
|
61
|
+
│ └── run-YYYYMMDD-HHMMSS-audit/
|
|
62
|
+
│ ├── findings.json # Machine-readable AST findings
|
|
63
|
+
│ ├── findings.md # Actionable markdown finding cards
|
|
64
|
+
│ ├── remediation.md # Formulated candidate patch catalog
|
|
65
|
+
│ ├── diff_summary.md # Summary of applied diffs
|
|
66
|
+
│ ├── recheck.md # Differential recheck status transitions
|
|
67
|
+
│ ├── report.html # Single-file visual dark-mode HTML report
|
|
68
|
+
│ ├── results.sarif # OASIS SARIF v2.1.0 log
|
|
69
|
+
│ └── bundles/ # Formulated Ponytail remediation bundles
|
|
70
|
+
└── snapshots/
|
|
71
|
+
└── run-YYYYMMDD-HHMMSS-audit/ # Pre-apply .bak files for instant rollback
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Living Report Ground Truth
|
|
75
|
+
- Read `security_report.md` in the workspace root before taking any action. Update the relevant finding card after completing remediation.
|