SecretBoundary is a narrow local TypeScript CLI that decides whether one outbound webhook-style payload crosses a configured secret boundary before execution.
v0.1.0 is intentionally small:
- local CLI only
- TypeScript on Node.js 20+
- deterministic evaluation only
- request JSON + policy JSON in, allow/deny decision out
- readable terminal output plus a machine-readable JSON artifact
It is intentionally not:
- enterprise DLP
- a network proxy or server
- a repo scanner
- a prompt scanner
- a sandbox
- a GitHub integration
- an MCP integration
- an AgentGate integration
- an LLM-based evaluator
The first proof surface is one outbound tool action only:
send_webhook
Request shape stays narrow:
actortoolmethodurlheadersbodypurpose
Policy shape stays narrow and deterministic:
allowedToolsallowedHostnamesblockedHostnamesblockedHeaderNamesblockedBodyPatternsblockedExactValuessecretDetectorsallowedPurposesdefaultDecision
npm installnpm run buildnode dist/cli.js \
--request fixtures/requests/allow.json \
--policy fixtures/policies/default.jsonOptional artifact path:
node dist/cli.js \
--request fixtures/requests/allow.json \
--policy fixtures/policies/default.json \
--artifact ./tmp/decision.jsonExit codes:
0allow1deny2usage, validation, or runtime error
Evaluation is deterministic and ordered:
- blocked hostname
- blocked header name
- blocked exact value in the outbound payload
- configured secret detector hit in the outbound payload
- blocked body pattern hit against the canonical JSON body
- missing allow coverage for tool
- missing allow coverage for purpose
- missing allow coverage for hostname
- allow
Blocked rules win before allow rules. If no allow rule covers the request, the decision falls back to defaultDecision, which is deny in this version.
blockedBodyPatterns are JavaScript regular expression sources compiled with the Unicode flag only. secretDetectors currently support:
aws_access_key_idgithub_patopenai_api_keypem_private_keyslack_webhook
Sample fixtures live in fixtures/:
- allow path
- blocked header deny path
- detected secret deny path
- default deny for an unlisted hostname
npm run test
npm run typecheck
npm run build