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.
Files changed (319) hide show
  1. package/.torusguard/.manifest.json +66 -63
  2. package/.torusguard/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md +30 -14
  3. package/.torusguard/rules/business-logic/TG-BIZ-002-replayable-one-time-operation.md +33 -16
  4. package/.torusguard/rules/business-logic/TG-BIZ-003-missing-workflow-state-validation.md +31 -15
  5. package/.torusguard/rules/business-logic/TG-BIZ-004-unrestricted-sensitive-business-flow.md +26 -16
  6. package/.torusguard/rules/cache/TG-CACHE-001-sensitive-response-publicly-cacheable.md +24 -16
  7. package/.torusguard/rules/cache/TG-CACHE-002-missing-user-cache-isolation.md +32 -18
  8. package/.torusguard/rules/cache/TG-CACHE-003-sensitive-data-in-url.md +24 -17
  9. package/.torusguard/rules/csrf/TG-CSRF-001-missing-csrf-protection.md +31 -18
  10. package/.torusguard/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md +28 -17
  11. package/.torusguard/rules/graphql/TG-GQL-002-resolver-missing-authorization.md +33 -17
  12. package/.torusguard/rules/graphql/TG-GQL-003-unbounded-graphql-pagination-or-batching.md +31 -16
  13. package/.torusguard/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md +25 -16
  14. package/.torusguard/rules/secrets/TG-SEC-005-secret-in-git-history.md +24 -19
  15. package/.torusguard/rules/secrets/TG-SEC-006-secret-in-build-artifact.md +36 -19
  16. package/.torusguard/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md +21 -16
  17. package/.torusguard/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md +45 -18
  18. package/.torusguard/rules/ssrf/TG-SSRF-003-unsafe-redirect-following.md +20 -16
  19. package/.torusguard/rules/ssrf/TG-SSRF-004-unbounded-outbound-request.md +28 -19
  20. package/.torusguard/rules/supply-chain/TG-SUPPLY-001-missing-or-ignored-dependency-lockfile.md +25 -18
  21. package/.torusguard/rules/supply-chain/TG-SUPPLY-003-unsafe-ci-cd-secret-exposure.md +29 -19
  22. package/.torusguard/rules/supply-chain/TG-SUPPLY-004-unpinned-ci-action.md +23 -18
  23. package/.torusguard/rules/supply-chain/TG-SUPPLY-005-unsafe-dependency-install-script.md +23 -18
  24. package/.torusguard/rules/webhook/TG-WEBHOOK-001-missing-webhook-signature-verification.md +36 -16
  25. package/.torusguard/rules/webhook/TG-WEBHOOK-002-replayable-webhook.md +26 -17
  26. package/.torusguard/rules/webhook/TG-WEBHOOK-003-missing-webhook-idempotency.md +30 -16
  27. package/.torusguard/rules/webhook/TG-WEBHOOK-004-unvalidated-webhook-event-type.md +25 -16
  28. package/.torusguard/rules/websocket/TG-WS-002-missing-channel-level-authorization.md +28 -17
  29. package/.torusguard/rules/websocket/TG-WS-003-unvalidated-websocket-message.md +31 -17
  30. package/.torusguard/rules/websocket/TG-WS-004-unbounded-websocket-connections.md +31 -17
  31. package/.torusguard/rules_catalog.json +520 -0
  32. package/.torusguard/runs/report-latest.html +2700 -232
  33. package/.torusguard/runs/results-latest.sarif +20 -0
  34. package/.torusguard/runs/run-20260912-214110-audit/findings.json +1256 -0
  35. package/.torusguard/runs/run-20260912-214110-audit/findings.md +534 -0
  36. package/.torusguard/runs/run-20260912-214110-audit/manifest.json +12 -0
  37. package/.torusguard/runs/run-20260912-214110-audit/summary.md +5 -0
  38. package/.torusguard/runs/run-20260912-214813-audit/findings.json +992 -0
  39. package/.torusguard/runs/run-20260912-214813-audit/findings.md +422 -0
  40. package/.torusguard/runs/run-20260912-214813-audit/manifest.json +12 -0
  41. package/.torusguard/runs/run-20260912-214813-audit/summary.md +5 -0
  42. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-auth-003-49-7c96f3/metadata.json +17 -0
  43. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-auth-003-49-7c96f3/minimal_patch_plan.md +21 -0
  44. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-auth-003-49-7c96f3/patch.diff +9 -0
  45. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +17 -0
  46. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
  47. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
  48. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-platform-001-12-cf8156/metadata.json +17 -0
  49. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-platform-001-12-cf8156/minimal_patch_plan.md +21 -0
  50. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-platform-001-12-cf8156/patch.diff +9 -0
  51. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-rate-001-26-affcfa/metadata.json +17 -0
  52. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-rate-001-26-affcfa/minimal_patch_plan.md +21 -0
  53. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-rate-001-26-affcfa/patch.diff +9 -0
  54. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-sec-001-9-e22e50/metadata.json +17 -0
  55. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-sec-001-9-e22e50/minimal_patch_plan.md +21 -0
  56. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-sec-001-9-e22e50/patch.diff +9 -0
  57. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-ssrf-004-9-9803ad/metadata.json +17 -0
  58. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-ssrf-004-9-9803ad/minimal_patch_plan.md +21 -0
  59. package/.torusguard/runs/run-20260912-215555-audit/bundles/bnd-tg-ssrf-004-9-9803ad/patch.diff +9 -0
  60. package/.torusguard/runs/run-20260912-215555-audit/findings.json +530 -0
  61. package/.torusguard/runs/run-20260912-215555-audit/findings.md +232 -0
  62. package/.torusguard/runs/run-20260912-215555-audit/manifest.json +13 -0
  63. package/.torusguard/runs/run-20260912-215555-audit/remediation.md +102 -0
  64. package/.torusguard/runs/run-20260912-215555-audit/summary.md +5 -0
  65. package/.torusguard/runs/run-20260912-215731-audit/apply_plan.md +6 -0
  66. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-client-001-7-587129/metadata.json +17 -0
  67. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-client-001-7-587129/minimal_patch_plan.md +21 -0
  68. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-client-001-7-587129/patch.diff +9 -0
  69. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-db-002-9-5f7850/metadata.json +17 -0
  70. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-db-002-9-5f7850/minimal_patch_plan.md +21 -0
  71. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-db-002-9-5f7850/patch.diff +9 -0
  72. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-001-27-2486f1/metadata.json +17 -0
  73. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-001-27-2486f1/minimal_patch_plan.md +22 -0
  74. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-001-27-2486f1/patch.diff +10 -0
  75. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-003-53-d167b4/metadata.json +17 -0
  76. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-003-53-d167b4/minimal_patch_plan.md +21 -0
  77. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-input-003-53-d167b4/patch.diff +9 -0
  78. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-001-12-cf8156/metadata.json +17 -0
  79. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-001-12-cf8156/minimal_patch_plan.md +21 -0
  80. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-001-12-cf8156/patch.diff +9 -0
  81. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-17-876973/metadata.json +17 -0
  82. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-17-876973/minimal_patch_plan.md +23 -0
  83. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-17-876973/patch.diff +11 -0
  84. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-5-40c794/metadata.json +17 -0
  85. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-5-40c794/minimal_patch_plan.md +23 -0
  86. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-platform-002-5-40c794/patch.diff +11 -0
  87. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-001-26-affcfa/metadata.json +17 -0
  88. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-001-26-affcfa/minimal_patch_plan.md +21 -0
  89. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-001-26-affcfa/patch.diff +9 -0
  90. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-002-54-0b38d2/metadata.json +17 -0
  91. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-002-54-0b38d2/minimal_patch_plan.md +21 -0
  92. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-rate-002-54-0b38d2/patch.diff +9 -0
  93. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-18-a3c1e8/metadata.json +17 -0
  94. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-18-a3c1e8/minimal_patch_plan.md +21 -0
  95. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-18-a3c1e8/patch.diff +9 -0
  96. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-9-e22e50/metadata.json +17 -0
  97. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-9-e22e50/minimal_patch_plan.md +21 -0
  98. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-001-9-e22e50/patch.diff +9 -0
  99. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-28-a1a0a1/metadata.json +17 -0
  100. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-28-a1a0a1/minimal_patch_plan.md +21 -0
  101. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-28-a1a0a1/patch.diff +9 -0
  102. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-30-00569e/metadata.json +17 -0
  103. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-30-00569e/minimal_patch_plan.md +21 -0
  104. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-sec-004-30-00569e/patch.diff +9 -0
  105. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-ssrf-004-9-9803ad/metadata.json +17 -0
  106. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-ssrf-004-9-9803ad/minimal_patch_plan.md +21 -0
  107. package/.torusguard/runs/run-20260912-215731-audit/bundles/bnd-tg-ssrf-004-9-9803ad/patch.diff +9 -0
  108. package/.torusguard/runs/run-20260912-215731-audit/diff_summary.md +186 -0
  109. package/.torusguard/runs/run-20260912-215731-audit/findings.json +497 -0
  110. package/.torusguard/runs/run-20260912-215731-audit/findings.md +218 -0
  111. package/.torusguard/runs/run-20260912-215731-audit/manifest.json +14 -0
  112. package/.torusguard/runs/run-20260912-215731-audit/recheck.md +76 -0
  113. package/.torusguard/runs/run-20260912-215731-audit/remediation.md +234 -0
  114. package/.torusguard/runs/run-20260912-215731-audit/summary.md +5 -0
  115. package/.torusguard/runs/run-20260912-220134-audit/findings.json +68 -0
  116. package/.torusguard/runs/run-20260912-220134-audit/findings.md +36 -0
  117. package/.torusguard/runs/run-20260912-220134-audit/manifest.json +12 -0
  118. package/.torusguard/runs/run-20260912-220134-audit/summary.md +5 -0
  119. package/.torusguard/runs/run-20260912-220200-audit/findings.json +1 -0
  120. package/.torusguard/runs/run-20260912-220200-audit/findings.md +8 -0
  121. package/.torusguard/runs/run-20260912-220200-audit/manifest.json +12 -0
  122. package/.torusguard/runs/run-20260912-220200-audit/recheck.md +6 -0
  123. package/.torusguard/runs/run-20260912-220200-audit/summary.md +5 -0
  124. package/.torusguard/runs/run-20260912-220227-audit/findings.json +1 -0
  125. package/.torusguard/runs/run-20260912-220227-audit/findings.md +8 -0
  126. package/.torusguard/runs/run-20260912-220227-audit/manifest.json +12 -0
  127. package/.torusguard/runs/run-20260912-220227-audit/recheck.md +6 -0
  128. package/.torusguard/runs/run-20260912-220227-audit/summary.md +5 -0
  129. package/.torusguard/runs/run-20260918-104221-audit/findings.json +1 -0
  130. package/.torusguard/runs/run-20260918-104221-audit/findings.md +8 -0
  131. package/.torusguard/runs/run-20260918-104221-audit/manifest.json +12 -0
  132. package/.torusguard/runs/run-20260918-104221-audit/summary.md +5 -0
  133. package/.torusguard/runs/run-20260918-104236-audit/findings.json +2314 -0
  134. package/.torusguard/runs/run-20260918-104236-audit/findings.md +960 -0
  135. package/.torusguard/runs/run-20260918-104236-audit/manifest.json +12 -0
  136. package/.torusguard/runs/run-20260918-104236-audit/summary.md +5 -0
  137. package/.torusguard/runs/run-20260918-105723-audit/findings.json +2382 -0
  138. package/.torusguard/runs/run-20260918-105723-audit/findings.md +960 -0
  139. package/.torusguard/runs/run-20260918-105723-audit/manifest.json +12 -0
  140. package/.torusguard/runs/run-20260918-105723-audit/summary.md +5 -0
  141. package/.torusguard/runs/run-20260918-105731-audit/findings.json +1 -0
  142. package/.torusguard/runs/run-20260918-105731-audit/findings.md +8 -0
  143. package/.torusguard/runs/run-20260918-105731-audit/manifest.json +12 -0
  144. package/.torusguard/runs/run-20260918-105731-audit/summary.md +5 -0
  145. package/.torusguard/runs/run-20260918-105940-audit/findings.json +1 -0
  146. package/.torusguard/runs/run-20260918-105940-audit/findings.md +8 -0
  147. package/.torusguard/runs/run-20260918-105940-audit/manifest.json +12 -0
  148. package/.torusguard/runs/run-20260918-105940-audit/summary.md +5 -0
  149. package/.torusguard/scripts/__pycache__/apply_runner.cpython-314.pyc +0 -0
  150. package/.torusguard/scripts/__pycache__/audit_runner.cpython-311.pyc +0 -0
  151. package/.torusguard/scripts/__pycache__/audit_runner.cpython-314.pyc +0 -0
  152. package/.torusguard/scripts/__pycache__/diff_guard.cpython-314.pyc +0 -0
  153. package/.torusguard/scripts/__pycache__/finding_scorer.cpython-311.pyc +0 -0
  154. package/.torusguard/scripts/__pycache__/finding_scorer.cpython-314.pyc +0 -0
  155. package/.torusguard/scripts/__pycache__/harden_runner.cpython-314.pyc +0 -0
  156. package/.torusguard/scripts/__pycache__/html_reporter.cpython-314.pyc +0 -0
  157. package/.torusguard/scripts/__pycache__/manifest_builder.cpython-314.pyc +0 -0
  158. package/.torusguard/scripts/__pycache__/memory_engine.cpython-314.pyc +0 -0
  159. package/.torusguard/scripts/__pycache__/monorepo_detector.cpython-314.pyc +0 -0
  160. package/.torusguard/scripts/__pycache__/recheck_runner.cpython-314.pyc +0 -0
  161. package/.torusguard/scripts/__pycache__/report_sync.cpython-311.pyc +0 -0
  162. package/.torusguard/scripts/__pycache__/report_sync.cpython-314.pyc +0 -0
  163. package/.torusguard/scripts/__pycache__/run_manager.cpython-314.pyc +0 -0
  164. package/.torusguard/scripts/__pycache__/sarif_exporter.cpython-314.pyc +0 -0
  165. package/.torusguard/scripts/__pycache__/stack_detect.cpython-314.pyc +0 -0
  166. package/.torusguard/scripts/__pycache__/term_ui.cpython-311.pyc +0 -0
  167. package/.torusguard/scripts/__pycache__/term_ui.cpython-314.pyc +0 -0
  168. package/.torusguard/scripts/apply_runner.py +389 -377
  169. package/.torusguard/scripts/audit_runner.py +1513 -653
  170. package/.torusguard/scripts/finding_scorer.py +14 -2
  171. package/.torusguard/scripts/harden_runner.py +628 -455
  172. package/.torusguard/scripts/html_reporter.py +2668 -648
  173. package/.torusguard/scripts/recheck_runner.py +248 -238
  174. package/.torusguard/scripts/recipes_runner.py +137 -137
  175. package/.torusguard/scripts/report_sync.py +719 -0
  176. package/.torusguard/scripts/sarif_exporter.py +156 -116
  177. package/.torusguard/scripts/stack_detect.py +44 -2
  178. package/.torusguard/scripts/term_ui.py +162 -162
  179. package/.torusguard/skills/torusguard/SKILL.md +75 -72
  180. package/.torusguard/skills/torusguard-apply/SKILL.md +84 -80
  181. package/.torusguard/skills/torusguard-audit/SKILL.md +87 -83
  182. package/.torusguard/skills/torusguard-authorize/SKILL.md +7 -2
  183. package/.torusguard/skills/torusguard-exploit-check/SKILL.md +7 -2
  184. package/.torusguard/skills/torusguard-full/SKILL.md +7 -2
  185. package/.torusguard/skills/torusguard-harden/SKILL.md +98 -94
  186. package/.torusguard/skills/torusguard-init/SKILL.md +68 -64
  187. package/.torusguard/skills/torusguard-recheck/SKILL.md +81 -77
  188. package/.torusguard/skills/torusguard-report/SKILL.md +93 -72
  189. package/.torusguard/skills/torusguard-status/SKILL.md +62 -58
  190. package/.torusguard/skills/torusguard-verify/SKILL.md +7 -2
  191. package/.torusguard/skills/torusguard-web-validate/SKILL.md +7 -2
  192. package/.torusguard/snapshots/run-20260912-215731-audit/demo/playground/vulnerable_nextjs/actions.ts.bak +24 -0
  193. package/.torusguard/snapshots/run-20260912-215731-audit/examples/hardened-react-express/server/index.js.bak +121 -0
  194. package/.torusguard/snapshots/run-20260912-215731-audit/examples/python/fastapi-vuln/main.py.bak +20 -0
  195. package/.torusguard/snapshots/run-20260912-215731-audit/examples/vulnerable-react-express/client/src/App.jsx.bak +63 -0
  196. package/.torusguard/snapshots/run-20260912-215731-audit/examples/vulnerable-react-express/client/vite.config.js.bak +12 -0
  197. package/.torusguard/snapshots/run-20260912-215731-audit/examples/vulnerable-react-express/server/index.js.bak +82 -0
  198. package/.torusguard/workflows/apply.md +11 -4
  199. package/.torusguard/workflows/audit.md +7 -1
  200. package/.torusguard/workflows/authorize.md +2 -1
  201. package/.torusguard/workflows/exploit-check.md +2 -1
  202. package/.torusguard/workflows/harden.md +7 -1
  203. package/.torusguard/workflows/init.md +6 -1
  204. package/.torusguard/workflows/memory.md +2 -1
  205. package/.torusguard/workflows/recheck.md +7 -1
  206. package/.torusguard/workflows/report.md +7 -1
  207. package/.torusguard/workflows/status.md +6 -1
  208. package/.torusguard/workflows/verify.md +6 -1
  209. package/.torusguard/workflows/web-validate.md +2 -1
  210. package/README.md +476 -345
  211. package/bin/torusguard.js +586 -545
  212. package/package.json +1 -1
  213. package/skills/torusguard/SKILL.md +73 -72
  214. package/skills/torusguard/bootstrap.py +7 -2
  215. package/skills/torusguard/payload/.manifest.json +66 -63
  216. package/skills/torusguard/payload/rules/business-logic/TG-BIZ-001-client-controlled-sensitive-business-value.md +30 -14
  217. package/skills/torusguard/payload/rules/business-logic/TG-BIZ-002-replayable-one-time-operation.md +33 -16
  218. package/skills/torusguard/payload/rules/business-logic/TG-BIZ-003-missing-workflow-state-validation.md +31 -15
  219. package/skills/torusguard/payload/rules/business-logic/TG-BIZ-004-unrestricted-sensitive-business-flow.md +26 -16
  220. package/skills/torusguard/payload/rules/cache/TG-CACHE-001-sensitive-response-publicly-cacheable.md +24 -16
  221. package/skills/torusguard/payload/rules/cache/TG-CACHE-002-missing-user-cache-isolation.md +32 -18
  222. package/skills/torusguard/payload/rules/cache/TG-CACHE-003-sensitive-data-in-url.md +24 -17
  223. package/skills/torusguard/payload/rules/csrf/TG-CSRF-001-missing-csrf-protection.md +31 -18
  224. package/skills/torusguard/payload/rules/csrf/TG-CSRF-002-unsafe-credentialed-cross-origin-request.md +28 -17
  225. package/skills/torusguard/payload/rules/graphql/TG-GQL-002-resolver-missing-authorization.md +33 -17
  226. package/skills/torusguard/payload/rules/graphql/TG-GQL-003-unbounded-graphql-pagination-or-batching.md +31 -16
  227. package/skills/torusguard/payload/rules/graphql/TG-GQL-004-unnecessary-production-introspection.md +25 -16
  228. package/skills/torusguard/payload/rules/secrets/TG-SEC-005-secret-in-git-history.md +24 -19
  229. package/skills/torusguard/payload/rules/secrets/TG-SEC-006-secret-in-build-artifact.md +36 -19
  230. package/skills/torusguard/payload/rules/secrets/TG-SEC-007-secret-in-test-or-example-fixture.md +21 -16
  231. package/skills/torusguard/payload/rules/ssrf/TG-SSRF-002-missing-internal-network-protection.md +45 -18
  232. package/skills/torusguard/payload/rules/ssrf/TG-SSRF-003-unsafe-redirect-following.md +20 -16
  233. package/skills/torusguard/payload/rules/ssrf/TG-SSRF-004-unbounded-outbound-request.md +28 -19
  234. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-001-missing-or-ignored-dependency-lockfile.md +25 -18
  235. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-003-unsafe-ci-cd-secret-exposure.md +29 -19
  236. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-004-unpinned-ci-action.md +23 -18
  237. package/skills/torusguard/payload/rules/supply-chain/TG-SUPPLY-005-unsafe-dependency-install-script.md +23 -18
  238. package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-001-missing-webhook-signature-verification.md +36 -16
  239. package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-002-replayable-webhook.md +26 -17
  240. package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-003-missing-webhook-idempotency.md +30 -16
  241. package/skills/torusguard/payload/rules/webhook/TG-WEBHOOK-004-unvalidated-webhook-event-type.md +25 -16
  242. package/skills/torusguard/payload/rules/websocket/TG-WS-002-missing-channel-level-authorization.md +28 -17
  243. package/skills/torusguard/payload/rules/websocket/TG-WS-003-unvalidated-websocket-message.md +31 -17
  244. package/skills/torusguard/payload/rules/websocket/TG-WS-004-unbounded-websocket-connections.md +31 -17
  245. package/skills/torusguard/payload/rules_catalog.json +520 -0
  246. package/skills/torusguard/payload/scripts/__pycache__/apply_runner.cpython-314.pyc +0 -0
  247. package/skills/torusguard/payload/scripts/__pycache__/audit_runner.cpython-311.pyc +0 -0
  248. package/skills/torusguard/payload/scripts/__pycache__/audit_runner.cpython-314.pyc +0 -0
  249. package/skills/torusguard/payload/scripts/__pycache__/diff_guard.cpython-311.pyc +0 -0
  250. package/skills/torusguard/payload/scripts/__pycache__/diff_guard.cpython-314.pyc +0 -0
  251. package/skills/torusguard/payload/scripts/__pycache__/finding_scorer.cpython-311.pyc +0 -0
  252. package/skills/torusguard/payload/scripts/__pycache__/finding_scorer.cpython-314.pyc +0 -0
  253. package/skills/torusguard/payload/scripts/__pycache__/harden_runner.cpython-314.pyc +0 -0
  254. package/skills/torusguard/payload/scripts/__pycache__/html_reporter.cpython-311.pyc +0 -0
  255. package/skills/torusguard/payload/scripts/__pycache__/html_reporter.cpython-314.pyc +0 -0
  256. package/skills/torusguard/payload/scripts/__pycache__/manifest_builder.cpython-314.pyc +0 -0
  257. package/skills/torusguard/payload/scripts/__pycache__/memory_engine.cpython-311.pyc +0 -0
  258. package/skills/torusguard/payload/scripts/__pycache__/memory_engine.cpython-314.pyc +0 -0
  259. package/skills/torusguard/payload/scripts/__pycache__/monorepo_detector.cpython-311.pyc +0 -0
  260. package/skills/torusguard/payload/scripts/__pycache__/monorepo_detector.cpython-314.pyc +0 -0
  261. package/skills/torusguard/payload/scripts/__pycache__/recheck_runner.cpython-314.pyc +0 -0
  262. package/skills/torusguard/payload/scripts/__pycache__/report_sync.cpython-311.pyc +0 -0
  263. package/skills/torusguard/payload/scripts/__pycache__/report_sync.cpython-314.pyc +0 -0
  264. package/skills/torusguard/payload/scripts/__pycache__/rules_sync.cpython-311.pyc +0 -0
  265. package/skills/torusguard/payload/scripts/__pycache__/run_manager.cpython-311.pyc +0 -0
  266. package/skills/torusguard/payload/scripts/__pycache__/run_manager.cpython-314.pyc +0 -0
  267. package/skills/torusguard/payload/scripts/__pycache__/sarif_exporter.cpython-314.pyc +0 -0
  268. package/skills/torusguard/payload/scripts/__pycache__/stack_detect.cpython-311.pyc +0 -0
  269. package/skills/torusguard/payload/scripts/__pycache__/stack_detect.cpython-314.pyc +0 -0
  270. package/skills/torusguard/payload/scripts/__pycache__/term_ui.cpython-311.pyc +0 -0
  271. package/skills/torusguard/payload/scripts/__pycache__/term_ui.cpython-314.pyc +0 -0
  272. package/skills/torusguard/payload/scripts/apply_runner.py +389 -377
  273. package/skills/torusguard/payload/scripts/audit_runner.py +1513 -653
  274. package/skills/torusguard/payload/scripts/finding_scorer.py +14 -2
  275. package/skills/torusguard/payload/scripts/harden_runner.py +628 -455
  276. package/skills/torusguard/payload/scripts/html_reporter.py +2668 -648
  277. package/skills/torusguard/payload/scripts/recheck_runner.py +248 -238
  278. package/skills/torusguard/payload/scripts/recipes_runner.py +137 -137
  279. package/skills/torusguard/payload/scripts/report_sync.py +719 -0
  280. package/skills/torusguard/payload/scripts/sarif_exporter.py +156 -116
  281. package/skills/torusguard/payload/scripts/stack_detect.py +44 -2
  282. package/skills/torusguard/payload/scripts/term_ui.py +162 -162
  283. package/skills/torusguard/payload/skills/torusguard/SKILL.md +75 -72
  284. package/skills/torusguard/payload/skills/torusguard-apply/SKILL.md +84 -80
  285. package/skills/torusguard/payload/skills/torusguard-audit/SKILL.md +87 -83
  286. package/skills/torusguard/payload/skills/torusguard-authorize/SKILL.md +7 -2
  287. package/skills/torusguard/payload/skills/torusguard-exploit-check/SKILL.md +7 -2
  288. package/skills/torusguard/payload/skills/torusguard-full/SKILL.md +7 -2
  289. package/skills/torusguard/payload/skills/torusguard-harden/SKILL.md +98 -94
  290. package/skills/torusguard/payload/skills/torusguard-init/SKILL.md +68 -64
  291. package/skills/torusguard/payload/skills/torusguard-recheck/SKILL.md +81 -77
  292. package/skills/torusguard/payload/skills/torusguard-report/SKILL.md +93 -72
  293. package/skills/torusguard/payload/skills/torusguard-status/SKILL.md +62 -58
  294. package/skills/torusguard/payload/skills/torusguard-verify/SKILL.md +7 -2
  295. package/skills/torusguard/payload/skills/torusguard-web-validate/SKILL.md +7 -2
  296. package/skills/torusguard/payload/workflows/apply.md +11 -4
  297. package/skills/torusguard/payload/workflows/audit.md +7 -1
  298. package/skills/torusguard/payload/workflows/authorize.md +2 -1
  299. package/skills/torusguard/payload/workflows/exploit-check.md +2 -1
  300. package/skills/torusguard/payload/workflows/harden.md +7 -1
  301. package/skills/torusguard/payload/workflows/init.md +6 -1
  302. package/skills/torusguard/payload/workflows/memory.md +2 -1
  303. package/skills/torusguard/payload/workflows/recheck.md +7 -1
  304. package/skills/torusguard/payload/workflows/report.md +7 -1
  305. package/skills/torusguard/payload/workflows/status.md +6 -1
  306. package/skills/torusguard/payload/workflows/verify.md +6 -1
  307. package/skills/torusguard/payload/workflows/web-validate.md +2 -1
  308. package/skills/torusguard-apply/SKILL.md +84 -80
  309. package/skills/torusguard-audit/SKILL.md +87 -83
  310. package/skills/torusguard-authorize/SKILL.md +7 -2
  311. package/skills/torusguard-exploit-check/SKILL.md +7 -2
  312. package/skills/torusguard-full/SKILL.md +7 -2
  313. package/skills/torusguard-harden/SKILL.md +98 -94
  314. package/skills/torusguard-init/SKILL.md +68 -64
  315. package/skills/torusguard-recheck/SKILL.md +81 -77
  316. package/skills/torusguard-report/SKILL.md +93 -72
  317. package/skills/torusguard-status/SKILL.md +62 -58
  318. package/skills/torusguard-verify/SKILL.md +7 -2
  319. package/skills/torusguard-web-validate/SKILL.md +7 -2
@@ -1,10 +1,11 @@
1
1
  ---
2
2
  name: torusguard-web-validate
3
3
  description: Execute authorized HTTP probing against local/staging web applications — session capture, transparent audit headers, and secret redaction.
4
- version: 1.3.4
4
+ version: 1.3.6
5
5
  workflow: .torusguard/workflows/web-validate.md
6
- tools: Read, Grep, Glob, Bash, Write
6
+ tools: Read, Grep, Glob, Bash, Write, run_command
7
7
  scripts-binding:
8
+ - .torusguard/scripts/report_sync.py
8
9
  - .torusguard/scripts/safety_gate.py
9
10
  ---
10
11
 
@@ -48,6 +49,10 @@ All Bearer tokens, cookies, passwords, and API keys are redacted prior to disk s
48
49
 
49
50
  ---
50
51
 
52
+ ## Living Report Ground Truth
53
+ - Always inspect `security_report.md` at workspace root before acting.
54
+ - Update finding statuses after completion to eliminate hallucination.
55
+
51
56
  ## Safety Constraints
52
57
  - Max 50 requests per validation session.
53
58
  - Never test unauthorized domains or third-party APIs.
@@ -0,0 +1,24 @@
1
+ /**
2
+ * TorusGuard Playground: Vulnerable Next.js Server Action Fixture
3
+ * Contains 2 intentional security findings for demonstration purposes:
4
+ * - TG-CLIENT-001 (Leaked Service Role Key)
5
+ * - TG-AUTH-003 (Unauthenticated Server Action Mutation)
6
+ */
7
+
8
+ // Finding 1: TG-CLIENT-001 - Backend admin key exposed in client-accessible code
9
+ export const SUPABASE_SERVICE_ROLE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.demo_secret_token_1234567890";
10
+
11
+ interface UserRecord {
12
+ id: string;
13
+ role: string;
14
+ }
15
+
16
+ // Finding 2: TG-AUTH-003 - Server Action performing state change without session check
17
+ export async function updateUserRole(userId: string, newRole: string): Promise<{ success: boolean }> {
18
+ "use server";
19
+
20
+ // VULNERABLE: Lacks auth session check e.g. const session = await auth(); if (!session?.user?.isAdmin) throw ...
21
+ console.log(`[VULNERABLE] Updating user ${userId} to role ${newRole} without authentication check`);
22
+
23
+ return { success: true };
24
+ }
@@ -0,0 +1,121 @@
1
+ require('dotenv').config();
2
+ const express = require('express');
3
+ const helmet = require('helmet');
4
+ const cors = require('cors');
5
+ const cookieParser = require('cookie-parser');
6
+ const rateLimit = require('express-rate-limit');
7
+ const bcrypt = require('bcrypt');
8
+ const jwt = require('jsonwebtoken');
9
+ const crypto = require('crypto');
10
+ const { z } = require('zod');
11
+
12
+ if (!process.env.JWT_SECRET) {
13
+ console.error('Missing JWT_SECRET');
14
+ process.exit(1);
15
+ }
16
+
17
+ const app = express();
18
+ const PORT = 3001;
19
+ const isProd = process.env.NODE_ENV === 'production';
20
+
21
+ app.use(helmet());
22
+ app.use(cors({ origin: process.env.CLIENT_ORIGIN, credentials: true }));
23
+ app.use(express.json({ limit: '100kb' }));
24
+ app.use(cookieParser());
25
+
26
+ const loginLimiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 5 });
27
+ const resetLimiter = rateLimit({ windowMs: 60 * 60 * 1000, max: 3 });
28
+ const publicWriteLimiter = rateLimit({ windowMs: 60 * 60 * 1000, max: 10 });
29
+
30
+ const users = [];
31
+ const resetTokens = new Map();
32
+
33
+ async function seed() {
34
+ if (users.length) return;
35
+ const hash = await bcrypt.hash('DemoPass123!', 12);
36
+ users.push({ id: '1', email: 'alice@demo.local', passwordHash: hash, name: 'Alice', role: 'user' });
37
+ users.push({ id: '2', email: 'bob@demo.local', passwordHash: hash, name: 'Bob', role: 'user' });
38
+ }
39
+
40
+ const loginSchema = z.object({
41
+ email: z.string().email().max(255),
42
+ password: z.string().min(8).max(128),
43
+ });
44
+
45
+ function auth(req, res, next) {
46
+ const token = req.cookies.token;
47
+ if (!token) return res.status(401).json({ error: 'Unauthorized' });
48
+ try {
49
+ req.user = jwt.verify(token, process.env.JWT_SECRET, { algorithms: ['HS256'] });
50
+ next();
51
+ } catch {
52
+ return res.status(401).json({ error: 'Unauthorized' });
53
+ }
54
+ }
55
+
56
+ app.post('/api/login', loginLimiter, async (req, res) => {
57
+ const parsed = loginSchema.safeParse(req.body);
58
+ if (!parsed.success) return res.status(400).json({ error: 'Invalid input' });
59
+ const { email, password } = parsed.data;
60
+ const user = users.find((u) => u.email === email);
61
+ if (!user || !(await bcrypt.compare(password, user.passwordHash))) {
62
+ return res.status(401).json({ error: 'Invalid email or password' });
63
+ }
64
+ const token = jwt.sign({ id: user.id, role: user.role }, process.env.JWT_SECRET, { expiresIn: '1h' });
65
+ res.cookie('token', token, {
66
+ httpOnly: true,
67
+ secure: isProd,
68
+ sameSite: 'lax',
69
+ maxAge: 3600000,
70
+ });
71
+ res.json({ message: 'Login successful' });
72
+ });
73
+
74
+ app.get('/api/users/me', auth, (req, res) => {
75
+ const user = users.find((u) => u.id === req.user.id);
76
+ if (!user) return res.status(404).json({ error: 'Not found' });
77
+ res.json({ id: user.id, email: user.email, name: user.name });
78
+ });
79
+
80
+ app.get('/api/search', auth, (req, res) => {
81
+ const q = String(req.query.q || '').slice(0, 100);
82
+ const results = users
83
+ .filter((u) => u.email.includes(q))
84
+ .slice(0, 20)
85
+ .map(({ id, email, name }) => ({ id, email, name }));
86
+ res.json({ results });
87
+ });
88
+
89
+ const contactSchema = z.object({ message: z.string().min(1).max(2000) });
90
+ app.post('/api/contact', publicWriteLimiter, (req, res) => {
91
+ const parsed = contactSchema.safeParse(req.body);
92
+ if (!parsed.success) return res.status(400).json({ error: 'Invalid input' });
93
+ res.json({ ok: true });
94
+ });
95
+
96
+ app.post('/api/ai', auth, publicWriteLimiter, (req, res) => {
97
+ const prompt = String(req.body.prompt || '').slice(0, 4000);
98
+ res.json({ reply: 'demo response', length: prompt.length });
99
+ });
100
+
101
+ app.post('/api/reset', resetLimiter, (req, res) => {
102
+ const email = String(req.body.email || '');
103
+ const user = users.find((u) => u.email === email);
104
+ if (user) {
105
+ const token = crypto.randomBytes(32).toString('hex');
106
+ resetTokens.set(token, { userId: user.id, expires: Date.now() + 900000 });
107
+ }
108
+ res.json({ message: 'If an account exists, a reset link was sent.' });
109
+ });
110
+
111
+ app.get('/api/admin/stats', auth, (req, res) => {
112
+ if (req.user.role !== 'admin') return res.status(403).json({ error: 'Forbidden' });
113
+ res.json({ users: users.length });
114
+ });
115
+
116
+ app.use((err, req, res, next) => {
117
+ console.error('Error', { message: err.message });
118
+ res.status(500).json({ error: isProd ? 'Internal server error' : err.message });
119
+ });
120
+
121
+ seed().then(() => app.listen(PORT, () => console.log(`Hardened demo http://localhost:${PORT}`)));
@@ -0,0 +1,20 @@
1
+ from fastapi import FastAPI
2
+ import requests
3
+
4
+ app = FastAPI()
5
+
6
+ # ❌ TG-SSRF-001: Unvalidated outbound URL fetching
7
+ @app.get("/fetch")
8
+ def fetch_url(url: str):
9
+ response = requests.get(url)
10
+ return {"status": response.status_code, "content": response.text}
11
+
12
+ # ❌ TG-WEBHOOK-001: Unverified webhook payload
13
+ @app.post("/webhook")
14
+ def receive_webhook(payload: dict):
15
+ return {"status": "success", "data": payload}
16
+
17
+ # ❌ TG-AUTH-006: Unfiltered dict mass assignment
18
+ @app.post("/update_profile")
19
+ def update_profile(user_id: int, updates: dict):
20
+ return {"status": "updated", "user_id": user_id, "updates": updates}
@@ -0,0 +1,63 @@
1
+ import { useState } from 'react';
2
+ import { clientConfig } from './config';
3
+
4
+ // TG-DB-001: SQL query construction in frontend (never do this)
5
+ function buildSearchQuery(email) {
6
+ return `SELECT id, email FROM users WHERE email LIKE '%${email}%'`;
7
+ }
8
+
9
+ // TG-DB-003: Documented anti-pattern — Prisma must never run in browser
10
+ // import { PrismaClient } from '@prisma/client'; // FORBIDDEN in client
11
+
12
+ export default function App() {
13
+ const [email, setEmail] = useState('');
14
+ const [password, setPassword] = useState('');
15
+ const [bio, setBio] = useState('<img src=x onerror=alert(1)>');
16
+ const [userId, setUserId] = useState('1');
17
+ const [isAdmin] = useState(localStorage.getItem('role') === 'admin'); // TG-AUTH-002
18
+ const [message, setMessage] = useState('');
19
+
20
+ async function login(e) {
21
+ e.preventDefault();
22
+ const res = await fetch('/api/login', {
23
+ method: 'POST',
24
+ headers: { 'Content-Type': 'application/json' },
25
+ credentials: 'include',
26
+ body: JSON.stringify({ email, password }),
27
+ });
28
+ const data = await res.json();
29
+ // TG-CLIENT-002: Sensitive console logging
30
+ console.log('Login token:', data.token, 'config:', clientConfig);
31
+ setMessage(JSON.stringify(data));
32
+ }
33
+
34
+ async function fetchUser() {
35
+ const res = await fetch(`/api/users/${userId}`);
36
+ setMessage(await res.text());
37
+ }
38
+
39
+ return (
40
+ <div style={{ maxWidth: 560, margin: '2rem auto', fontFamily: 'sans-serif' }}>
41
+ <h1>Vulnerable Demo</h1>
42
+ <p style={{ color: 'crimson' }}>Intentionally insecure — localhost lab only</p>
43
+
44
+ <form onSubmit={login}>
45
+ <input value={email} onChange={(e) => setEmail(e.target.value)} placeholder="email" />
46
+ <input value={password} onChange={(e) => setPassword(e.target.value)} placeholder="password" type="password" />
47
+ <button type="submit">Login</button>
48
+ </form>
49
+
50
+ <p>Frontend SQL preview: {buildSearchQuery(email)}</p>
51
+
52
+ {/* TG-INPUT-003: Unsafe HTML rendering */}
53
+ <div dangerouslySetInnerHTML={{ __html: bio }} />
54
+
55
+ <button onClick={fetchUser}>Fetch user (IDOR demo)</button>
56
+
57
+ {/* TG-AUTH-002: Client-only admin gate */}
58
+ {isAdmin && <section><h2>Admin Panel</h2><p>Visible if localStorage role=admin — not real security</p></section>}
59
+
60
+ {message && <pre>{message}</pre>}
61
+ </div>
62
+ );
63
+ }
@@ -0,0 +1,12 @@
1
+ import { defineConfig } from 'vite';
2
+ import react from '@vitejs/plugin-react';
3
+
4
+ // TG-CLIENT-001: Public production source maps enabled
5
+ export default defineConfig({
6
+ plugins: [react()],
7
+ build: { sourcemap: true },
8
+ server: {
9
+ port: 5173,
10
+ proxy: { '/api': 'http://localhost:3001' },
11
+ },
12
+ });
@@ -0,0 +1,82 @@
1
+ const express = require('express');
2
+ const cors = require('cors');
3
+ const jwt = require('jsonwebtoken');
4
+
5
+ const app = express();
6
+ const PORT = 3001;
7
+
8
+ // TG-SEC-001: Hardcoded JWT secret
9
+ const JWT_SECRET = 'FAKE_DEMO_JWT_SECRET_NOT_FOR_PRODUCTION';
10
+
11
+ // TG-PLATFORM-001: Wildcard CORS with credentials
12
+ app.use(cors({ origin: '*', credentials: true }));
13
+
14
+ // TG-PLATFORM-004: No explicit JSON body size limit
15
+ app.use(express.json());
16
+
17
+ const users = [
18
+ { id: '1', email: 'alice@demo.local', password: 'password123', name: 'Alice' },
19
+ { id: '2', email: 'bob@demo.local', password: 'secret456', name: 'Bob' },
20
+ ];
21
+
22
+ // TG-RATE-001: No rate limit on login
23
+ // TG-AUTH-001: Plaintext password comparison
24
+ // TG-SEC-004: Logs sensitive data
25
+ // TG-AUTH-004: Insecure cookie (no httpOnly/Secure/SameSite)
26
+ app.post('/api/login', (req, res) => {
27
+ const { email, password } = req.body;
28
+ console.log('Login attempt:', { email, password }); // TG-SEC-004
29
+ const user = users.find((u) => u.email === email && u.password === password);
30
+ if (!user) return res.status(401).json({ error: 'User not found' }); // enumeration
31
+ const token = jwt.sign({ id: user.id }, JWT_SECRET);
32
+ res.cookie('token', token);
33
+ res.json({ message: 'ok', token, user });
34
+ });
35
+
36
+ // TG-AUTH-003: IDOR — no ownership check
37
+ app.get('/api/users/:id', (req, res) => {
38
+ const user = users.find((u) => u.id === req.params.id);
39
+ if (!user) return res.status(404).json({ error: 'Not found' });
40
+ res.json(user);
41
+ });
42
+
43
+ // TG-INPUT-002: SQL concatenation (simulated query string)
44
+ // TG-RATE-003: Unbounded results
45
+ app.get('/api/search', (req, res) => {
46
+ const q = req.query.q || '';
47
+ const fakeSql = `SELECT * FROM users WHERE email LIKE '%${q}%'`;
48
+ const results = users.filter((u) => u.email.includes(q));
49
+ res.json({ query: fakeSql, results });
50
+ });
51
+
52
+ // TG-INPUT-001: No validation
53
+ // TG-RATE-002: Unlimited contact endpoint
54
+ app.post('/api/contact', (req, res) => {
55
+ res.json({ received: req.body });
56
+ });
57
+
58
+ // TG-RATE-002: Unlimited AI endpoint
59
+ app.post('/api/ai', (req, res) => {
60
+ res.json({ reply: 'demo', prompt: req.body.prompt });
61
+ });
62
+
63
+ // TG-INPUT-004: Unrestricted upload (stub)
64
+ app.post('/api/upload', (req, res) => {
65
+ res.json({ saved: req.body.filename });
66
+ });
67
+
68
+ // TG-AUTH-005: Unsafe password reset
69
+ app.post('/api/reset', (req, res) => {
70
+ const { email } = req.body;
71
+ const user = users.find((u) => u.email === email);
72
+ if (!user) return res.status(404).json({ error: 'Email not registered' }); // enumeration
73
+ const token = `reset-${user.id}-12345`; // predictable
74
+ res.json({ resetToken: token });
75
+ });
76
+
77
+ app.use((err, req, res, next) => {
78
+ // TG-PLATFORM-003: Stack trace exposed
79
+ res.status(500).json({ error: err.message, stack: err.stack });
80
+ });
81
+
82
+ app.listen(PORT, () => console.log(`Vulnerable demo server http://localhost:${PORT}`));
@@ -1,12 +1,14 @@
1
1
  ---
2
2
  description: Governed patch application with pre-apply rollback snapshots and Human Gate authorization.
3
3
  tools: Read, Grep, Glob, Bash, Edit, Write
4
- version: 0.9.2
4
+ version: 1.3.6
5
5
  agent: remediator
6
6
  lifecycle-phase: Phase 5 (Patch Application)
7
7
  required-skills:
8
8
  - torusguard-apply
9
9
  scripts-binding:
10
+ - .torusguard/scripts/apply_runner.py
11
+ - .torusguard/scripts/report_sync.py
10
12
  - .torusguard/scripts/run_manager.py
11
13
  - .torusguard/scripts/diff_guard.py
12
14
  ---
@@ -26,7 +28,7 @@ Governed patch application with pre-apply rollback snapshots and Human Gate auth
26
28
 
27
29
  Inspect bundle validity and file safety before modifying disk code:
28
30
  1. **Bundle Verification:** Assert `patch.diff` exists in active run's remediation folder.
29
- 2. **Pre-Apply Snapshot:** Save a byte-for-byte backup copy (`.bak` or `pre_apply/`) prior to editing.
31
+ 2. **Pre-Apply Snapshot:** Save a byte-for-byte backup copy (`.bak` or `.torusguard/snapshots/<run_id>/`) prior to editing.
30
32
  3. **Uncommitted Changes:** Check git status; ensure target file has clean baseline.
31
33
  4. **Ponytail Check:** Re-verify that patch additions $\le 35$ and deletions $\le 25$.
32
34
  5. **Human Gate:** Confirm operator approval before committing edits to disk.
@@ -47,11 +49,16 @@ Inspect bundle validity and file safety before modifying disk code:
47
49
 
48
50
  ---
49
51
 
52
+ ## Living Report Invariant
53
+ - Applied patches create pre-apply `.bak` snapshots in `.torusguard/snapshots/<run_id>/`.
54
+ - Finding statuses transition in `security_report.md` to `APPLIED 🔵`.
55
+ - Instant rollback available via `npx torusguard rollback`.
56
+
50
57
  ## Execution Steps
51
58
 
52
59
  1. **Load Remediation Bundle:** Read `patch.diff` and metadata from active run directory.
53
60
  2. **Audit Patch Invariants:** Run `python .torusguard/scripts/diff_guard.py <patch.diff>`.
54
- 3. **Create Rollback Backup:** Copy target file to `.torusguard/runs/<run_id>/pre_apply/<filename>.bak`.
61
+ 3. **Create Rollback Backup:** Copy target file to `.torusguard/runs/<run_id>/.torusguard/snapshots/<run_id>/<filename>.bak`.
55
62
  4. **Apply Minimal Diff:** Execute precise surgical edit using `replace_file_content` or `patch`.
56
63
  5. **Assert Syntax & Integrity:** Check that modified file compiles cleanly without syntax errors.
57
64
  6. **Log Application Ledger:** Record timestamp, original SHA-256, and patched SHA-256 in `apply-log.json`.
@@ -81,7 +88,7 @@ Inspect bundle validity and file safety before modifying disk code:
81
88
  ### 🚀 TorusGuard Patch Application
82
89
  - **Finding Addressed:** `TG-XXX-HASH`
83
90
  - **File Patched:** `src/path/to/file.py`
84
- - **Rollback Backup:** `.torusguard/runs/<run_id>/pre_apply/<file>.bak`
91
+ - **Rollback Backup:** `.torusguard/runs/<run_id>/.torusguard/snapshots/<run_id>/<file>.bak`
85
92
  - **Churn Applied:** +[Additions] / -[Deletions] lines
86
93
  - **Syntax Check:** PASSED (clean compile)
87
94
  - **Status:** APPLIED — run `/torusguard recheck` to verify fix
@@ -1,12 +1,14 @@
1
1
  ---
2
2
  description: Static security AST scanning, stable line-shift invariant fingerprinting, root-cause clustering, and 0-100 confidence scoring.
3
3
  tools: Read, Grep, Glob, Bash, Write
4
- version: 0.9.2
4
+ version: 1.3.6
5
5
  agent: auditor
6
6
  lifecycle-phase: Phase 2 (Static Audit & Clustering)
7
7
  required-skills:
8
8
  - torusguard-audit
9
9
  scripts-binding:
10
+ - .torusguard/scripts/audit_runner.py
11
+ - .torusguard/scripts/report_sync.py
10
12
  - .torusguard/scripts/run_manager.py
11
13
  - .torusguard/scripts/finding_scorer.py
12
14
  ---
@@ -45,6 +47,10 @@ Inspect workspace prerequisites before launching static audit:
45
47
 
46
48
  ---
47
49
 
50
+ ## Living Report Invariant
51
+ - Audit discoveries automatically synchronize to `security_report.md` at workspace root.
52
+ - Findings transition into `OPEN 🔴` status with stable invariant fingerprints.
53
+
48
54
  ## Execution Steps
49
55
 
50
56
  1. **Allocate Run Folder:** Run `python .torusguard/scripts/run_manager.py create audit`.
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  description: Legal scope definition, target ownership proof verification, and safety boundary enforcement for runtime validation.
3
3
  tools: Read, Grep, Glob, Bash, Write
4
- version: 0.9.2
4
+ version: 1.3.6
5
5
  agent: reviewer
6
6
  lifecycle-phase: Phase 1 (Authorization Gate)
7
7
  required-skills:
8
8
  - torusguard-authorize
9
9
  scripts-binding:
10
+ - .torusguard/scripts/report_sync.py
10
11
  - .torusguard/scripts/safety_gate.py
11
12
  ---
12
13
 
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  description: Safe, bounded, single-step exploitability confirmation across 5 standard verification statuses.
3
3
  tools: Read, Grep, Glob, Bash, Write
4
- version: 0.9.2
4
+ version: 1.3.6
5
5
  agent: validator
6
6
  lifecycle-phase: Phase 3c (Exploitability Check)
7
7
  required-skills:
8
8
  - torusguard-exploit-check
9
9
  scripts-binding:
10
+ - .torusguard/scripts/report_sync.py
10
11
  - .torusguard/scripts/safety_gate.py
11
12
  - .torusguard/scripts/finding_scorer.py
12
13
  ---
@@ -1,12 +1,14 @@
1
1
  ---
2
2
  description: Governed remediation formulation under strict Ponytail Protocol bounds (<= 35 additions, <= 25 deletions) and bundle packaging.
3
3
  tools: Read, Grep, Glob, Bash, Write
4
- version: 0.9.2
4
+ version: 1.3.6
5
5
  agent: remediator
6
6
  lifecycle-phase: Phase 4 (Remediation Formulation)
7
7
  required-skills:
8
8
  - torusguard-harden
9
9
  scripts-binding:
10
+ - .torusguard/scripts/harden_runner.py
11
+ - .torusguard/scripts/report_sync.py
10
12
  - .torusguard/scripts/run_manager.py
11
13
  - .torusguard/scripts/diff_guard.py
12
14
  ---
@@ -46,6 +48,10 @@ Inspect finding targets and patch constraints before generating diffs:
46
48
 
47
49
  ---
48
50
 
51
+ ## Living Report Invariant
52
+ - Candidate patches transition findings in `security_report.md` into `CANDIDATE 🟡` status.
53
+ - Every patch strictly conforms to Ponytail bounds (<= 35 additions, <= 25 deletions).
54
+
49
55
  ## Execution Steps
50
56
 
51
57
  1. **Select Target Finding:** Choose verified flaw from active run directory.
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  description: Baseline project discovery, workspace scaffolding, stack detection, and framework-tailored security rule activation.
3
3
  tools: Read, Grep, Glob, Bash, Write
4
- version: 0.9.2
4
+ version: 1.3.6
5
5
  agent: profiler
6
6
  lifecycle-phase: Phase 0 (Baseline Setup)
7
7
  required-skills:
8
8
  - torusguard-init
9
9
  scripts-binding:
10
+ - .torusguard/scripts/report_sync.py
10
11
  - .torusguard/scripts/stack_detect.py
11
12
  ---
12
13
 
@@ -44,6 +45,10 @@ Inspect workspace state before running initialization:
44
45
 
45
46
  ---
46
47
 
48
+ ## Living Report Invariant
49
+ - Provisions baseline `security_report.md` single-source-of-truth ledger.
50
+ - Activates tailored rules across 18 families based on detected stack.
51
+
47
52
  ## Execution Steps
48
53
 
49
54
  1. **Scaffold Directory Topology:** Verify `.torusguard/` structure (`config/`, `rules/active/`, `runs/`, `scripts/`, `workflows/`, `templates/`, `schemas/`).
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  description: TorusGuard Adaptive Security Memory Engine — view memory stats, export/import intelligence, apply TTL decay, and manage false positives.
3
3
  tools: Read, Grep, Glob, Bash
4
- version: 1.0.0
4
+ version: 1.3.6
5
5
  agent: reviewer
6
6
  lifecycle-phase: Intelligence / Memory
7
7
  required-skills:
8
8
  - torusguard
9
9
  scripts-binding:
10
+ - .torusguard/scripts/report_sync.py
10
11
  - .torusguard/scripts/memory_engine.py
11
12
  ---
12
13
 
@@ -1,12 +1,14 @@
1
1
  ---
2
2
  description: Targeted differential AST re-scan, fix closure verification, and regression state machine transitions.
3
3
  tools: Read, Grep, Glob, Bash, Write
4
- version: 0.9.2
4
+ version: 1.3.6
5
5
  agent: reviewer
6
6
  lifecycle-phase: Phase 6 (Targeted Recheck & Verification)
7
7
  required-skills:
8
8
  - torusguard-recheck
9
9
  scripts-binding:
10
+ - .torusguard/scripts/recheck_runner.py
11
+ - .torusguard/scripts/report_sync.py
10
12
  - .torusguard/scripts/run_manager.py
11
13
  - .torusguard/scripts/finding_scorer.py
12
14
  ---
@@ -46,6 +48,10 @@ Inspect applied patch history and target file scope before re-checking:
46
48
 
47
49
  ---
48
50
 
51
+ ## Living Report Invariant
52
+ - Verified fix closures transition findings in `security_report.md` to `RESOLVED 🟢`.
53
+ - Regressions transition findings to `REGRESSED ❌`.
54
+
49
55
  ## Execution Steps
50
56
 
51
57
  1. **Identify Modified Files:** Extract list of altered files from latest apply step.
@@ -1,12 +1,14 @@
1
1
  ---
2
2
  description: Executive posture reporting, cluster analysis, signed compliance audit, and OASIS SARIF v2.1.0 structured export.
3
3
  tools: Read, Grep, Glob, Bash, Write
4
- version: 0.9.2
4
+ version: 1.3.6
5
5
  agent: reviewer
6
6
  lifecycle-phase: Phase 7 (Reporting & SARIF Export)
7
7
  required-skills:
8
8
  - torusguard-report
9
9
  scripts-binding:
10
+ - .torusguard/scripts/html_reporter.py
11
+ - .torusguard/scripts/report_sync.py
10
12
  - .torusguard/scripts/sarif_exporter.py
11
13
  - .torusguard/scripts/run_manager.py
12
14
  ---
@@ -45,6 +47,10 @@ Inspect run records and reporting parameters before generating release artifacts
45
47
 
46
48
  ---
47
49
 
50
+ ## Living Report Invariant
51
+ - Executive posture reports incorporate health scoring and metrics from `security_report.md`.
52
+ - Emits visual dark-mode HTML (`--html`) and OASIS SARIF v2.1.0 (`--sarif`).
53
+
48
54
  ## Execution Steps
49
55
 
50
56
  1. **Aggregate Lifecycle Data:** Load all finding cards, verification traces, and recheck logs.
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  description: Read-only diagnostic overview of workspace security posture, active configuration, rules catalog, and run history.
3
3
  tools: Read, Grep, Glob, Bash
4
- version: 0.9.2
4
+ version: 1.3.6
5
5
  agent: reviewer
6
6
  lifecycle-phase: System / Diagnostics
7
7
  required-skills:
8
8
  - torusguard-status
9
9
  scripts-binding:
10
+ - .torusguard/scripts/report_sync.py
10
11
  - .torusguard/scripts/run_manager.py
11
12
  ---
12
13
 
@@ -44,6 +45,10 @@ Inspect workspace state and configuration records prior to status display:
44
45
 
45
46
  ---
46
47
 
48
+ ## Living Report Invariant
49
+ - Reads current health score and status breakdown directly from `security_report.md`.
50
+ - Displays 18 rule families and 74 rules in standardized 75-column terminal cards.
51
+
47
52
  ## Execution Steps
48
53
 
49
54
  1. **Read Configuration:** Load `.torusguard/config/torusguard.json`; extract stack, version, and enabled rule count.
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  description: Evidence sufficiency verification, live disk line match audit, and finding score refinement.
3
3
  tools: Read, Grep, Glob, Bash, Write
4
- version: 0.9.2
4
+ version: 1.3.6
5
5
  agent: validator
6
6
  lifecycle-phase: Phase 3a (Evidence Verification)
7
7
  required-skills:
8
8
  - torusguard-verify
9
9
  scripts-binding:
10
+ - .torusguard/scripts/report_sync.py
10
11
  - .torusguard/scripts/finding_scorer.py
11
12
  ---
12
13
 
@@ -44,6 +45,10 @@ Inspect finding records and evidence integrity before verification:
44
45
 
45
46
  ---
46
47
 
48
+ ## Living Report Invariant
49
+ - Confirmed evidence sufficiency transitions findings in `security_report.md` to `VERIFIED 🟠`.
50
+ - False positives transition to `FALSE POSITIVE ⚪`.
51
+
47
52
  ## Execution Steps
48
53
 
49
54
  1. **Locate Target Findings:** Load active findings from latest run directory.
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  description: Authorized HTTP probing, token redaction, transparent audit header injection, and replay trace capture.
3
3
  tools: Read, Grep, Glob, Bash, Write
4
- version: 0.9.2
4
+ version: 1.3.6
5
5
  agent: validator
6
6
  lifecycle-phase: Phase 3b (Runtime Web Validation)
7
7
  required-skills:
8
8
  - torusguard-web-validate
9
9
  scripts-binding:
10
+ - .torusguard/scripts/report_sync.py
10
11
  - .torusguard/scripts/safety_gate.py
11
12
  ---
12
13