@aporthq/aport-agent-guardrails 1.0.8

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 (237) hide show
  1. package/LICENSE +217 -0
  2. package/README.md +481 -0
  3. package/bin/agent-guardrails +133 -0
  4. package/bin/aport-create-passport.sh +444 -0
  5. package/bin/aport-cursor-hook.sh +90 -0
  6. package/bin/aport-guardrail-api.sh +108 -0
  7. package/bin/aport-guardrail-bash.sh +394 -0
  8. package/bin/aport-guardrail-v2.sh +5 -0
  9. package/bin/aport-guardrail.sh +5 -0
  10. package/bin/aport-resolve-paths.sh +71 -0
  11. package/bin/aport-status.sh +276 -0
  12. package/bin/frameworks/crewai.sh +49 -0
  13. package/bin/frameworks/cursor.sh +95 -0
  14. package/bin/frameworks/langchain.sh +48 -0
  15. package/bin/frameworks/n8n.sh +36 -0
  16. package/bin/frameworks/openclaw.sh +19 -0
  17. package/bin/lib/allowlist.sh +18 -0
  18. package/bin/lib/common.sh +28 -0
  19. package/bin/lib/config.sh +46 -0
  20. package/bin/lib/constants.sh +232 -0
  21. package/bin/lib/detect.sh +65 -0
  22. package/bin/lib/error.sh +269 -0
  23. package/bin/lib/passport.sh +19 -0
  24. package/bin/lib/templates/.gitkeep +1 -0
  25. package/bin/lib/templates/config.yaml +6 -0
  26. package/bin/lib/validation.sh +206 -0
  27. package/bin/openclaw +660 -0
  28. package/docs/ADDING_A_FRAMEWORK.md +87 -0
  29. package/docs/AGENTS.md.example +40 -0
  30. package/docs/CODE_REVIEW.md +192 -0
  31. package/docs/DEPLOYMENT_READINESS.md +81 -0
  32. package/docs/FAQ_SECURITY_SCANNERS.md +373 -0
  33. package/docs/FRAMEWORK_ROADMAP.md +41 -0
  34. package/docs/HOSTED_PASSPORT_SETUP.md +362 -0
  35. package/docs/IMPLEMENTING_YOUR_OWN_EVALUATOR.md +433 -0
  36. package/docs/OPENCLAW_COMPATIBILITY.md +73 -0
  37. package/docs/OPENCLAW_LOCAL_INTEGRATION.md +596 -0
  38. package/docs/OPENCLAW_TOOLS_AND_POLICIES.md +54 -0
  39. package/docs/QUICKSTART.md +470 -0
  40. package/docs/QUICKSTART_OPENCLAW_PLUGIN.md +470 -0
  41. package/docs/README.md +28 -0
  42. package/docs/RELEASE.md +87 -0
  43. package/docs/REPO_LAYOUT.md +47 -0
  44. package/docs/SKILLS_ECOSYSTEM_ANALYSIS_FEB17.md +1260 -0
  45. package/docs/TOOL_POLICY_MAPPING.md +46 -0
  46. package/docs/UPGRADE.md +46 -0
  47. package/docs/VERIFICATION_METHODS.md +97 -0
  48. package/docs/assets/README.md +8 -0
  49. package/docs/assets/porter.svg +54 -0
  50. package/docs/development/ERROR_CODES.md +616 -0
  51. package/docs/frameworks/GITHUB_ISSUE_PROPOSALS.md +1105 -0
  52. package/docs/frameworks/crewai.md +114 -0
  53. package/docs/frameworks/cursor.md +159 -0
  54. package/docs/frameworks/langchain.md +72 -0
  55. package/docs/frameworks/n8n.md +40 -0
  56. package/docs/frameworks/openclaw.md +40 -0
  57. package/docs/launch/ADD_APORT_AWESOME_LISTS_INSTRUCTIONS.md +146 -0
  58. package/docs/launch/ANNOUNCEMENT_GUIDE.md +266 -0
  59. package/docs/launch/AWESOME_REPOS.md +53 -0
  60. package/docs/launch/CURSOR_VSCODE_HOOKS_RESEARCH.md +77 -0
  61. package/docs/launch/DEMO_TERMINAL_OUTPUT.txt +48 -0
  62. package/docs/launch/DRY_AND_PLAN_CHECKLIST.md +47 -0
  63. package/docs/launch/EVIDENCE_README.md +61 -0
  64. package/docs/launch/EVIDENCE_TERMINAL_CAPTURE.txt +10 -0
  65. package/docs/launch/FRAMEWORK_SUPPORT_PLAN.md +1640 -0
  66. package/docs/launch/LAUNCH_READINESS_CHECKLIST.md +237 -0
  67. package/docs/launch/LAUNCH_STRATEGY_SUMMARY.md +464 -0
  68. package/docs/launch/OPENCLAW_FEEDBACK_AND_FIXES.md +85 -0
  69. package/docs/launch/POST_1_VALENTINE_IMPROVED.md +233 -0
  70. package/docs/launch/POST_2_GUARDRAIL_IMPROVED.md +369 -0
  71. package/docs/launch/PRE_LAUNCH_FIXES.md +766 -0
  72. package/docs/launch/QUICK_LAUNCH_CHECKLIST.md +400 -0
  73. package/docs/launch/READINESS_SUMMARY.md +262 -0
  74. package/docs/launch/README.md +68 -0
  75. package/docs/launch/USER_STORIES.md +327 -0
  76. package/docs/launch/scripts/add-aport-awesome-pr.sh +69 -0
  77. package/docs/operations/MONITORING.md +588 -0
  78. package/docs/reviews/2026-02-18-staff-review.md +268 -0
  79. package/extensions/openclaw-aport/README.md +415 -0
  80. package/extensions/openclaw-aport/index.js +625 -0
  81. package/extensions/openclaw-aport/openclaw-aport.js +7 -0
  82. package/extensions/openclaw-aport/openclaw.plugin.json +46 -0
  83. package/extensions/openclaw-aport/package.json +36 -0
  84. package/extensions/openclaw-aport/test.js +307 -0
  85. package/external/aport-policies/README.md +363 -0
  86. package/external/aport-policies/agent.session.create.v1/README.md +345 -0
  87. package/external/aport-policies/agent.session.create.v1/policy.json +162 -0
  88. package/external/aport-policies/agent.tool.register.v1/README.md +361 -0
  89. package/external/aport-policies/agent.tool.register.v1/policy.json +172 -0
  90. package/external/aport-policies/code.release.publish.v1/README.md +51 -0
  91. package/external/aport-policies/code.release.publish.v1/policy.json +121 -0
  92. package/external/aport-policies/code.repository.merge.v1/README.md +287 -0
  93. package/external/aport-policies/code.repository.merge.v1/express.example.js +332 -0
  94. package/external/aport-policies/code.repository.merge.v1/fastapi.example.py +370 -0
  95. package/external/aport-policies/code.repository.merge.v1/policy.json +162 -0
  96. package/external/aport-policies/data.export.create.v1/README.md +226 -0
  97. package/external/aport-policies/data.export.create.v1/express.example.js +172 -0
  98. package/external/aport-policies/data.export.create.v1/fastapi.example.py +165 -0
  99. package/external/aport-policies/data.export.create.v1/policy.json +133 -0
  100. package/external/aport-policies/data.report.ingest.v1/README.md +134 -0
  101. package/external/aport-policies/data.report.ingest.v1/express.example.js +105 -0
  102. package/external/aport-policies/data.report.ingest.v1/minimal-example.js +68 -0
  103. package/external/aport-policies/data.report.ingest.v1/policy.json +174 -0
  104. package/external/aport-policies/finance.crypto.trade.v1/README.md +146 -0
  105. package/external/aport-policies/finance.crypto.trade.v1/express.example.js +109 -0
  106. package/external/aport-policies/finance.crypto.trade.v1/minimal-example.js +65 -0
  107. package/external/aport-policies/finance.crypto.trade.v1/policy.json +176 -0
  108. package/external/aport-policies/finance.payment.charge.v1/README.md +326 -0
  109. package/external/aport-policies/finance.payment.charge.v1/express.example.js +250 -0
  110. package/external/aport-policies/finance.payment.charge.v1/fastapi.example.py +227 -0
  111. package/external/aport-policies/finance.payment.charge.v1/minimal-example.js +64 -0
  112. package/external/aport-policies/finance.payment.charge.v1/policy.json +224 -0
  113. package/external/aport-policies/finance.payment.charge.v1/tests/contexts.jsonl +12 -0
  114. package/external/aport-policies/finance.payment.charge.v1/tests/expected.jsonl +12 -0
  115. package/external/aport-policies/finance.payment.charge.v1/tests/passport.instance.json +42 -0
  116. package/external/aport-policies/finance.payment.charge.v1/tests/passport.template.json +40 -0
  117. package/external/aport-policies/finance.payment.charge.v1/tests/payments-charge-policy.test.js +817 -0
  118. package/external/aport-policies/finance.payment.charge.v1/tests/test_payments_charge_policy.py +486 -0
  119. package/external/aport-policies/finance.payment.payout.v1/README.md +78 -0
  120. package/external/aport-policies/finance.payment.payout.v1/policy.json +181 -0
  121. package/external/aport-policies/finance.payment.refund.v1/README.md +275 -0
  122. package/external/aport-policies/finance.payment.refund.v1/express.example.js +167 -0
  123. package/external/aport-policies/finance.payment.refund.v1/fastapi.example.py +136 -0
  124. package/external/aport-policies/finance.payment.refund.v1/minimal-example.js +183 -0
  125. package/external/aport-policies/finance.payment.refund.v1/policy.json +216 -0
  126. package/external/aport-policies/finance.payment.refund.v1/tests/refunds-policy.test.js +924 -0
  127. package/external/aport-policies/finance.payment.refund.v1/tests/test_refunds_policy.py +778 -0
  128. package/external/aport-policies/finance.transaction.execute.v1/README.md +309 -0
  129. package/external/aport-policies/finance.transaction.execute.v1/express.example.js +261 -0
  130. package/external/aport-policies/finance.transaction.execute.v1/fastapi.example.py +231 -0
  131. package/external/aport-policies/finance.transaction.execute.v1/minimal-example.js +78 -0
  132. package/external/aport-policies/finance.transaction.execute.v1/policy.json +189 -0
  133. package/external/aport-policies/finance.transaction.execute.v1/tests/contexts.jsonl +12 -0
  134. package/external/aport-policies/finance.transaction.execute.v1/tests/expected.jsonl +12 -0
  135. package/external/aport-policies/finance.transaction.execute.v1/tests/passport.instance.json +42 -0
  136. package/external/aport-policies/finance.transaction.execute.v1/tests/passport.template.json +42 -0
  137. package/external/aport-policies/finance.transaction.execute.v1/tests/test_transactions_policy.py +214 -0
  138. package/external/aport-policies/finance.transaction.execute.v1/tests/transactions-policy.test.js +306 -0
  139. package/external/aport-policies/governance.data.access.v1/README.md +292 -0
  140. package/external/aport-policies/governance.data.access.v1/express.example.js +321 -0
  141. package/external/aport-policies/governance.data.access.v1/fastapi.example.py +279 -0
  142. package/external/aport-policies/governance.data.access.v1/minimal-example.js +65 -0
  143. package/external/aport-policies/governance.data.access.v1/policy.json +208 -0
  144. package/external/aport-policies/governance.data.access.v1/tests/contexts.jsonl +12 -0
  145. package/external/aport-policies/governance.data.access.v1/tests/data-access-policy.test.js +308 -0
  146. package/external/aport-policies/governance.data.access.v1/tests/expected.jsonl +12 -0
  147. package/external/aport-policies/governance.data.access.v1/tests/passport.instance.json +56 -0
  148. package/external/aport-policies/governance.data.access.v1/tests/passport.template.json +56 -0
  149. package/external/aport-policies/governance.data.access.v1/tests/test_data_access_policy.py +214 -0
  150. package/external/aport-policies/legal.contract.review.v1/README.md +109 -0
  151. package/external/aport-policies/legal.contract.review.v1/policy.json +378 -0
  152. package/external/aport-policies/legal.contract.review.v1/tests/legal-contract-review-policy.test.js +609 -0
  153. package/external/aport-policies/legal.contract.review.v1/tests/passport.template.json +49 -0
  154. package/external/aport-policies/mcp.tool.execute.v1/README.md +301 -0
  155. package/external/aport-policies/mcp.tool.execute.v1/policy.json +141 -0
  156. package/external/aport-policies/messaging.message.send.v1/README.md +230 -0
  157. package/external/aport-policies/messaging.message.send.v1/express.example.js +183 -0
  158. package/external/aport-policies/messaging.message.send.v1/fastapi.example.py +193 -0
  159. package/external/aport-policies/messaging.message.send.v1/policy.json +144 -0
  160. package/external/aport-policies/policy-template.json +107 -0
  161. package/external/aport-policies/system.command.execute.v1/README.md +275 -0
  162. package/external/aport-policies/system.command.execute.v1/policy.json +146 -0
  163. package/external/aport-spec/CONTRIBUTING.md +273 -0
  164. package/external/aport-spec/LICENSE +21 -0
  165. package/external/aport-spec/README.md +168 -0
  166. package/external/aport-spec/conformance/README.md +294 -0
  167. package/external/aport-spec/conformance/cases/data.export.v1/contexts/allow_users.json +6 -0
  168. package/external/aport-spec/conformance/cases/data.export.v1/contexts/deny_pii.json +6 -0
  169. package/external/aport-spec/conformance/cases/data.export.v1/expected/allow_users.decision.json +19 -0
  170. package/external/aport-spec/conformance/cases/data.export.v1/expected/deny_pii.decision.json +19 -0
  171. package/external/aport-spec/conformance/cases/data.export.v1/passports/template.json +29 -0
  172. package/external/aport-spec/conformance/cases/payments.refunds.v1/contexts/allow_50usd.json +9 -0
  173. package/external/aport-spec/conformance/cases/payments.refunds.v1/contexts/deny_150usd.json +9 -0
  174. package/external/aport-spec/conformance/cases/payments.refunds.v1/contexts/deny_currency.json +9 -0
  175. package/external/aport-spec/conformance/cases/payments.refunds.v1/expected/allow_50usd.decision.json +19 -0
  176. package/external/aport-spec/conformance/cases/payments.refunds.v1/expected/deny_150usd.decision.json +19 -0
  177. package/external/aport-spec/conformance/cases/payments.refunds.v1/expected/deny_currency.decision.json +19 -0
  178. package/external/aport-spec/conformance/cases/payments.refunds.v1/passports/template.json +42 -0
  179. package/external/aport-spec/conformance/package.json +44 -0
  180. package/external/aport-spec/conformance/pnpm-lock.yaml +642 -0
  181. package/external/aport-spec/conformance/src/cases.ts +371 -0
  182. package/external/aport-spec/conformance/src/ed25519.ts +167 -0
  183. package/external/aport-spec/conformance/src/jcs.ts +85 -0
  184. package/external/aport-spec/conformance/src/runner.ts +533 -0
  185. package/external/aport-spec/conformance/src/validators.ts +185 -0
  186. package/external/aport-spec/conformance/test-runner.js +315 -0
  187. package/external/aport-spec/conformance/tsconfig.json +21 -0
  188. package/external/aport-spec/error-schema.json +192 -0
  189. package/external/aport-spec/index.json +12 -0
  190. package/external/aport-spec/integrations/clawmoat/README.md +12 -0
  191. package/external/aport-spec/integrations/shield/README.md +245 -0
  192. package/external/aport-spec/integrations/shield/adapters/index.js +116 -0
  193. package/external/aport-spec/integrations/shield/adapters/system-command-execute.js +133 -0
  194. package/external/aport-spec/integrations/shield/test/README.md +58 -0
  195. package/external/aport-spec/integrations/shield/test/shield.md +40 -0
  196. package/external/aport-spec/integrations/shield/test/test-shield-to-verify.js +274 -0
  197. package/external/aport-spec/metrics-schema.json +504 -0
  198. package/external/aport-spec/oap/CHANGELOG.md +54 -0
  199. package/external/aport-spec/oap/VERSION.md +40 -0
  200. package/external/aport-spec/oap/capability-registry.md +229 -0
  201. package/external/aport-spec/oap/conformance.md +257 -0
  202. package/external/aport-spec/oap/decision-schema.json +114 -0
  203. package/external/aport-spec/oap/examples/context.refund.usd.50.json +9 -0
  204. package/external/aport-spec/oap/examples/decision.allow.sample.json +20 -0
  205. package/external/aport-spec/oap/examples/decision.deny.sample.json +23 -0
  206. package/external/aport-spec/oap/examples/passport.instance.v1.json +50 -0
  207. package/external/aport-spec/oap/examples/passport.template.v1.json +71 -0
  208. package/external/aport-spec/oap/oap-spec.md +426 -0
  209. package/external/aport-spec/oap/passport-schema.json +396 -0
  210. package/external/aport-spec/oap/security.md +213 -0
  211. package/external/aport-spec/oap/vc/context-oap-v1.jsonld +137 -0
  212. package/external/aport-spec/oap/vc/examples/oap-decision-vc.json +37 -0
  213. package/external/aport-spec/oap/vc/examples/oap-passport-vc.json +68 -0
  214. package/external/aport-spec/oap/vc/tools/INTEGRATION.md +375 -0
  215. package/external/aport-spec/oap/vc/tools/README.md +278 -0
  216. package/external/aport-spec/oap/vc/tools/examples/decision-to-vc.js +66 -0
  217. package/external/aport-spec/oap/vc/tools/examples/passport-to-vc.js +83 -0
  218. package/external/aport-spec/oap/vc/tools/examples/vc-to-decision.js +77 -0
  219. package/external/aport-spec/oap/vc/tools/examples/vc-to-passport.js +94 -0
  220. package/external/aport-spec/oap/vc/tools/package.json +38 -0
  221. package/external/aport-spec/oap/vc/tools/pnpm-lock.yaml +472 -0
  222. package/external/aport-spec/oap/vc/tools/src/cli.ts +226 -0
  223. package/external/aport-spec/oap/vc/tools/src/crypto-utils.ts +427 -0
  224. package/external/aport-spec/oap/vc/tools/src/index.ts +653 -0
  225. package/external/aport-spec/oap/vc/tools/src/test.ts +148 -0
  226. package/external/aport-spec/oap/vc/tools/src/vp.ts +382 -0
  227. package/external/aport-spec/oap/vc/tools/test-simple.js +214 -0
  228. package/external/aport-spec/oap/vc/tools/tsconfig.json +19 -0
  229. package/external/aport-spec/oap/vc/vc-mapping.md +443 -0
  230. package/external/aport-spec/passport-schema.json +586 -0
  231. package/external/aport-spec/rate-limiting.md +136 -0
  232. package/external/aport-spec/transport-profile.md +325 -0
  233. package/external/aport-spec/webhook-spec.md +314 -0
  234. package/package.json +70 -0
  235. package/skills/aport-agent-guardrail/SKILL.md +314 -0
  236. package/src/evaluator.js +252 -0
  237. package/src/server/index.js +72 -0
@@ -0,0 +1,373 @@
1
+ # FAQ: Security Scanner False Positives
2
+
3
+ **Last updated:** 2026-02-18
4
+
5
+ ---
6
+
7
+ ## Is APort malware?
8
+
9
+ **No.** APort is security infrastructure (like antivirus or firewall), not malware.
10
+
11
+ **Evidence:**
12
+ - ✅ Open-source: Full code review available on [GitHub](https://github.com/aporthq/aport-agent-guardrails)
13
+ - ✅ VirusTotal: 0 out of 70+ antivirus engines detected threats ([scan results](https://www.virustotal.com/gui/file/0fe9918f47fc191d31dfe9a58faedca16e7cedbfef9271520d05feb711699c06))
14
+ - ✅ npm verified: SHA-512 integrity checks pass
15
+ - ✅ No malware characteristics: No obfuscation, no credential theft, no backdoors, no privilege escalation
16
+ - ✅ 300+ installs from real users, design partners in fintech/healthcare/legal
17
+
18
+ ---
19
+
20
+ ## Why is it flagged as "suspicious"?
21
+
22
+ **Automated scanners flag ALL security tools because they need deep system access to protect the system.**
23
+
24
+ **What gets flagged:**
25
+ 1. **Remote code execution** — npm install runs setup code
26
+ 2. **System modifications** — Writes config to ~/.openclaw/
27
+ 3. **Network communication** — Optional API mode
28
+
29
+ **This is the SAME pattern as every security tool:**
30
+
31
+ | Security Tool | Remote Code | System Mods | Network |
32
+ |---------------|-------------|-------------|---------|
33
+ | Antivirus | ✅ Virus definitions | ✅ OS hooks | ✅ Telemetry |
34
+ | Firewall | ✅ Rule updates | ✅ Kernel modules | ✅ Traffic logs |
35
+ | Password Manager | ✅ Auto-updates | ✅ Browser extensions | ✅ Vault sync |
36
+ | VPN | ✅ Config updates | ✅ Network drivers | ✅ Server connection |
37
+ | **APort** | ✅ npm install | ✅ Plugin registration | ✅ API (opt-in) |
38
+
39
+ **All security infrastructure gets flagged. It doesn't mean they're malware.**
40
+
41
+ ---
42
+
43
+ ## How can I verify APort is safe?
44
+
45
+ ### Option 1: Review the source code
46
+
47
+ ```bash
48
+ git clone https://github.com/aporthq/aport-agent-guardrails
49
+ cd aport-agent-guardrails
50
+ # Review all code before running
51
+ ```
52
+
53
+ **What to look for:**
54
+ - ❌ Obfuscated code → APort: All code is readable JavaScript/Bash
55
+ - ❌ Hidden network requests → APort: API calls documented in SKILL.md
56
+ - ❌ Credential access → APort: Never touches credentials, API keys, or passwords
57
+ - ❌ Privilege escalation → APort: Runs as user, never requires sudo
58
+
59
+ ### Option 2: Use local mode (no network)
60
+
61
+ ```bash
62
+ # Install with local-only passport
63
+ npx @aporthq/aport-agent-guardrails
64
+ # Choose "local passport" in wizard
65
+
66
+ # All verification happens locally
67
+ # Zero network communication
68
+ # Full transparency
69
+ ```
70
+
71
+ **What gets installed:**
72
+ - `~/.openclaw/config.yaml` — OpenClaw plugin registration
73
+ - `~/.openclaw/aport/passport.json` — Agent identity (like SSH keys)
74
+ - `~/.openclaw/.skills/aport-guardrail.sh` — Wrapper script
75
+
76
+ **That's it.** No hidden files, no system modifications, no backdoors.
77
+
78
+ ### Option 3: Check VirusTotal
79
+
80
+ [VirusTotal scan results](https://www.virustotal.com/gui/file/0fe9918f47fc191d31dfe9a58faedca16e7cedbfef9271520d05feb711699c06):
81
+ - **Detections:** 0 out of 70+ antivirus engines
82
+ - **Status:** "Suspicious" (behavioral heuristics, NOT malware detection)
83
+
84
+ **"Suspicious" ≠ malicious.** It means automated heuristics found patterns common to both security tools AND malware (network calls, file writes, etc.). But no actual threats were detected.
85
+
86
+ ### Option 4: Run in sandbox
87
+
88
+ ```bash
89
+ # Test in Docker container first
90
+ docker run -it node:18 bash
91
+ npx @aporthq/aport-agent-guardrails
92
+ # Inspect what gets installed
93
+ ```
94
+
95
+ ---
96
+
97
+ ## What data does APort send over the network?
98
+
99
+ **Local mode (default):** ZERO data sent. Everything runs on your machine.
100
+
101
+ **API mode (opt-in):** Only authorization context:
102
+ - Tool name (e.g., `system.command.execute`)
103
+ - Context (e.g., `{"command":"ls"}`)
104
+ - Agent ID (passport identifier)
105
+
106
+ **What is NOT sent:**
107
+ - ❌ LLM prompts or conversation history
108
+ - ❌ API keys or credentials
109
+ - ❌ File contents
110
+ - ❌ Personal data (beyond what's in passport)
111
+
112
+ **Why API mode exists:**
113
+ - Hosted passports (enterprise use case)
114
+ - Centralized compliance dashboards
115
+ - Instant policy updates without local file changes
116
+
117
+ **Comparison to other SaaS security tools:**
118
+ - Okta sends auth requests to okta.com
119
+ - Auth0 sends login data to auth0.com
120
+ - LastPass sends encrypted vault to lastpass.com
121
+ - **APort sends authorization context to api.aport.io**
122
+
123
+ This is standard SaaS security architecture.
124
+
125
+ ---
126
+
127
+ ## Why does it need to modify my system?
128
+
129
+ **APort is an OpenClaw plugin. Plugins MUST register in config files.**
130
+
131
+ **What gets written:**
132
+
133
+ ```
134
+ ~/.openclaw/
135
+ ├── config.yaml # Plugin registration (documented OpenClaw API)
136
+ ├── aport/
137
+ │ ├── passport.json # Agent identity (like SSH keys in ~/.ssh/)
138
+ │ ├── decision.json # Latest authorization decision
139
+ │ └── audit.log # Audit trail
140
+ └── .skills/
141
+ └── aport-guardrail.sh # Wrapper script (called by plugin)
142
+ ```
143
+
144
+ **This is the SAME pattern as every user-installed tool:**
145
+ - SSH writes to `~/.ssh/` (keys, config, known_hosts)
146
+ - Git writes to `~/.gitconfig`
147
+ - Docker writes to `~/.docker/`
148
+ - npm writes to `~/.npm/`
149
+ - **APort writes to `~/.openclaw/aport/`**
150
+
151
+ **Standard user-config pattern. Not malware.**
152
+
153
+ ---
154
+
155
+ ## Why does it execute remote code?
156
+
157
+ **Because npm install runs setup code. This is how ALL npm packages work.**
158
+
159
+ **What happens during install:**
160
+
161
+ ```bash
162
+ # User runs
163
+ npx @aporthq/aport-agent-guardrails
164
+
165
+ # npm downloads package and executes
166
+ node_modules/.bin/agent-guardrails
167
+
168
+ # Which runs
169
+ ./bin/openclaw
170
+
171
+ # Which registers plugin
172
+ openclaw plugins install -l <path>
173
+ ```
174
+
175
+ **This is standard npm lifecycle.** Every package with a bin script does this.
176
+
177
+ **What makes it safe:**
178
+ - npm verifies package integrity (SHA-512 hash)
179
+ - Code is open-source (auditable on GitHub)
180
+ - No obfuscation or hidden behavior
181
+ - No additional downloads after install
182
+
183
+ **Malware characteristics APort does NOT have:**
184
+ - ❌ Downloads additional payloads
185
+ - ❌ Obfuscated code
186
+ - ❌ Connects to unknown servers
187
+ - ❌ Attempts to hide presence
188
+
189
+ ---
190
+
191
+ ## Can APort access my credentials or API keys?
192
+
193
+ **No.** APort never reads, accesses, or transmits:
194
+ - API keys
195
+ - Passwords
196
+ - Auth tokens
197
+ - Environment variables (except APORT_* for configuration)
198
+ - Files outside ~/.openclaw/aport/
199
+
200
+ **File access is limited to:**
201
+ - Read: `~/.openclaw/aport/passport.json` (agent identity)
202
+ - Write: `~/.openclaw/aport/decision.json` (authorization decisions)
203
+ - Write: `~/.openclaw/aport/audit.log` (audit trail)
204
+
205
+ **That's it.**
206
+
207
+ **Verification:** Review the code. No credential access anywhere.
208
+
209
+ ---
210
+
211
+ ## Why should I trust this more than automated scanners?
212
+
213
+ **Because automated scanners cannot distinguish "security tool doing security things" from "malware doing malicious things."**
214
+
215
+ **Example:** Airport security flags you as "suspicious" if you:
216
+ - Carry a laptop (technical device)
217
+ - Travel frequently (anomalous pattern)
218
+ - Have cables in your bag (could be modified)
219
+
220
+ **But you're not a terrorist. You're a software engineer.**
221
+
222
+ **Same with APort:**
223
+ - Has network calls (security tool behavior)
224
+ - Modifies config files (plugin installation)
225
+ - Executes code (npm package)
226
+
227
+ **But it's not malware. It's security infrastructure.**
228
+
229
+ **How to know the difference:**
230
+
231
+ | Malware | APort |
232
+ |---------|-------|
233
+ | Obfuscated code | Open-source, readable code |
234
+ | Hidden network requests | Documented API in SKILL.md |
235
+ | Credential theft | Never accesses credentials |
236
+ | File exfiltration | Only reads ~/.openclaw/aport/ |
237
+ | Backdoors / C2 | No remote command execution |
238
+ | Persistence mechanisms | No cron jobs, no startup scripts |
239
+ | Privilege escalation | Runs as user, no sudo |
240
+
241
+ **Zero malware characteristics. All security infrastructure characteristics.**
242
+
243
+ ---
244
+
245
+ ## What's APort's security track record?
246
+
247
+ **Public since:** January 2026 (npm package published)
248
+
249
+ **Security incidents:** 0
250
+
251
+ **Vulnerabilities reported:** 0
252
+
253
+ **npm downloads:** 300+ in first 2 weeks
254
+
255
+ **Design partners:** Fintech, healthcare, and legal firms using in production
256
+
257
+ **Bug bounty:** Planned (launching Q1 2026)
258
+
259
+ **Third-party audit:** Available upon request for enterprise customers
260
+
261
+ **Community:** [GitHub Discussions](https://github.com/aporthq/aport-agent-guardrails/discussions)
262
+
263
+ ---
264
+
265
+ ## Why does OpenClaw scan show "benign" but VirusTotal shows "suspicious"?
266
+
267
+ **OpenClaw's scanner:** Context-aware analysis of OpenClaw skills. Recognizes plugin installation patterns.
268
+
269
+ **VirusTotal's scanner:** Generic behavioral analysis. Flags anything with network + file writes + code execution.
270
+
271
+ **VirusTotal "suspicious" does NOT mean malicious.** It means:
272
+ - Behavioral heuristics found "anomalous" patterns
273
+ - BUT: 0 out of 70+ antivirus engines detected actual threats
274
+
275
+ **Analogy:**
276
+ - OpenClaw scanner: TSA Pre-Check (recognizes trusted traveler)
277
+ - VirusTotal scanner: Basic TSA (flags everyone with a laptop as "suspicious")
278
+
279
+ **Neither is wrong.** They have different thresholds and context.
280
+
281
+ **Result:** OpenClaw says "benign" (correct), VirusTotal says "suspicious" (false positive).
282
+
283
+ ---
284
+
285
+ ## What if I'm still concerned?
286
+
287
+ **We understand.** Security is important. Here are your options:
288
+
289
+ ### 1. Review the code yourself
290
+
291
+ ```bash
292
+ git clone https://github.com/aporthq/aport-agent-guardrails
293
+ # Review every line before installing
294
+ ```
295
+
296
+ ### 2. Use local mode (zero network)
297
+
298
+ ```bash
299
+ npx @aporthq/aport-agent-guardrails
300
+ # Choose "local passport" in wizard
301
+ # All verification happens locally
302
+ # No data sent anywhere
303
+ ```
304
+
305
+ ### 3. Run in isolated environment first
306
+
307
+ ```bash
308
+ # Test in Docker container
309
+ docker run -it node:18 bash
310
+ npx @aporthq/aport-agent-guardrails
311
+ # Inspect behavior before using in production
312
+ ```
313
+
314
+ ### 4. Wait for third-party audit
315
+
316
+ We're planning a security audit by a reputable firm (Trail of Bits, NCC Group, or Cure53). Results will be published publicly.
317
+
318
+ ### 5. Reach out directly
319
+
320
+ - GitHub Issues: [Report concerns](https://github.com/aporthq/aport-agent-guardrails/issues)
321
+ - GitHub Discussions: [Ask questions](https://github.com/aporthq/aport-agent-guardrails/discussions)
322
+ - Email: security@aport.io
323
+
324
+ **We welcome scrutiny. That's how you know it's legitimate.**
325
+
326
+ ---
327
+
328
+ ## Who builds APort?
329
+
330
+ **Team:** [APort](https://aport.io) — Agent authorization infrastructure
331
+
332
+ **Mission:** Prevent unauthorized agent actions (data exfiltration, unauthorized commands, prompt injection)
333
+
334
+ **Approach:** Pre-action authorization using [Open Agent Passport (OAP)](https://github.com/aporthq/aport-spec/tree/main) standard
335
+
336
+ **Why it exists:** [Cisco research](https://github.com/aporthq/aport-agent-guardrails/blob/main/docs/SKILLS_ECOSYSTEM_ANALYSIS_FEB17.md) found 7.1% of ClawHub skills are malicious. APort blocks them BEFORE they execute.
337
+
338
+ **Open-source:** Apache 2.0 license
339
+
340
+ **Community-driven:** Contributions welcome
341
+
342
+ ---
343
+
344
+ ## Why does this matter?
345
+
346
+ **Without APort:**
347
+ - Malicious skills can exfiltrate your data
348
+ - Unauthorized commands can run without your knowledge
349
+ - Prompt injection can bypass your safety measures
350
+ - No audit trail for compliance
351
+
352
+ **With APort:**
353
+ - ✅ Every tool call is authorized BEFORE it runs
354
+ - ✅ Malicious actions are blocked deterministically
355
+ - ✅ Cryptographically signed audit logs
356
+ - ✅ Compliance-ready (SOC 2, GDPR, HIPAA)
357
+
358
+ **APort is the enforcement layer. Nothing runs without authorization.**
359
+
360
+ ---
361
+
362
+ ## Additional Resources
363
+
364
+ - **GitHub:** https://github.com/aporthq/aport-agent-guardrails
365
+ - **npm package:** https://www.npmjs.com/package/@aporthq/aport-agent-guardrails
366
+ - **ClawHub:** https://clawhub.ai/uchibeke/aport-agent-guardrail
367
+ - **OAP Spec:** https://github.com/aporthq/aport-spec/tree/main
368
+ - **Security analysis:** [SKILLS_ECOSYSTEM_ANALYSIS_FEB17.md](https://github.com/aporthq/aport-agent-guardrails/blob/main/docs/SKILLS_ECOSYSTEM_ANALYSIS_FEB17.md)
369
+ - **Issue tracker:** https://github.com/aporthq/aport-agent-guardrails/issues
370
+
371
+ ---
372
+
373
+ **Still have questions? [Open an issue](https://github.com/aporthq/aport-agent-guardrails/issues) or [start a discussion](https://github.com/aporthq/aport-agent-guardrails/discussions).**
@@ -0,0 +1,41 @@
1
+ # Framework support roadmap
2
+
3
+ Public developer view of supported frameworks and roadmap. Details per framework: [docs/frameworks/](frameworks/). **What’s production-ready:** [DEPLOYMENT_READINESS.md](DEPLOYMENT_READINESS.md).
4
+
5
+ ## Supported frameworks
6
+
7
+ | Framework | Status | Implementation | Doc | Install |
8
+ |------------|----------|----------------|-----|--------|
9
+ | **OpenClaw** | Shipped | Full: plugin, wizard, local/API | [openclaw.md](frameworks/openclaw.md) | `npx @aporthq/aport-agent-guardrails openclaw` |
10
+ | **Cursor** | Shipped | Full: hooks installer + script | [cursor.md](frameworks/cursor.md) | `npx @aporthq/aport-agent-guardrails cursor` |
11
+ | **LangChain / LangGraph** | Shipped | **Python only:** callback, `aport-langchain setup` | [langchain.md](frameworks/langchain.md) | `npx @aporthq/aport-agent-guardrails langchain` then `pip install aport-agent-guardrails-langchain` + `aport-langchain setup` |
12
+ | **CrewAI** | Shipped | **Python only:** hook, decorator, `aport-crewai setup` | [crewai.md](frameworks/crewai.md) | `npx @aporthq/aport-agent-guardrails crewai` then `pip install aport-agent-guardrails-crewai` + `aport-crewai setup` |
13
+
14
+ **Coming soon:** n8n — custom node and runtime in progress ([n8n.md](frameworks/n8n.md)). Not listed in CLI options until shipped.
15
+
16
+ All supported frameworks above use the same passport wizard and policy packs; each has a framework-specific installer. OpenClaw and Cursor have full runtime integration; LangChain/CrewAI have full integration **via Python packages**.
17
+
18
+ ## Completion
19
+
20
+ - **CLI:** One entry point `npx @aporthq/aport-agent-guardrails` with detection or `--framework=<name>`.
21
+ - **Shared:** Passport wizard, guardrail scripts (local + API), policy packs, config/path helpers (`bin/lib/`).
22
+ - **Per framework:** Installer in `bin/frameworks/<name>.sh`, config written to framework-specific path, doc in `docs/frameworks/<name>.md`, integration tests in `tests/frameworks/<name>/`.
23
+
24
+ ## Node/TypeScript packages (this repo)
25
+
26
+ | Package | Status | Notes |
27
+ |---------|--------|--------|
28
+ | **@aporthq/aport-agent-guardrails-core** | Implemented | Evaluator (API + local bash script), config, passport. Not yet published to npm. |
29
+ | **@aporthq/aport-agent-guardrails-langchain** | Implemented | Callback handler using core; `GuardrailViolationError` on deny. Not yet published. |
30
+ | **@aporthq/aport-agent-guardrails-crewai** | Implemented | `beforeToolCall`, `registerAPortGuardrail`, `withAPortGuardrail` (parity with Python). |
31
+ | **@aporthq/aport-agent-guardrails-n8n** | Coming soon | Placeholder for future n8n custom node. **Not published to npm** until the custom node is ready. |
32
+ | **@aporthq/aport-agent-guardrails-cursor** | Implemented | `Evaluator`, `getHookPath()`; runtime is bash hook from CLI. |
33
+
34
+ Production integration for LangChain: **Python** (pip, published) and **Node** (workspace implemented, publish when ready). See [DEPLOYMENT_READINESS.md](DEPLOYMENT_READINESS.md).
35
+
36
+ ## Proposals / next
37
+
38
+ - **Python local-only verification** — Use passport + policy JSON files without calling the API (Story F in [USER_STORIES.md](launch/USER_STORIES.md)).
39
+ - **Node core + adapters** — Implement evaluator/config/passport in `packages/core` and real middleware in framework packages before publishing.
40
+ - **n8n custom node** — Implement node and credentials so n8n workflows can branch on allow/deny.
41
+ - **Additional frameworks** — Add new ones by following [ADDING_A_FRAMEWORK.md](ADDING_A_FRAMEWORK.md); each is &lt;50 lines of bash plus config template.