Skip to content

Commit 14b3093

Browse files
dormsternclaude
andcommitted
rebrand: declawed → leashed, Shield → Harness
Full rename across all source, tests, docs, examples, and config: - Package: declawed → leashed - API: createShield → createLeash, shield.yaml → leash.yaml, shield.task → leash.task, shield.kill → leash.yank - Types: ShieldConfig → LeashConfig, ShieldResult → LeashResult, ShieldStatus → LeashStatus - Files: .shield-session → .leash-session, shield-audit.jsonl → leash-audit.jsonl - CLI: npx declawed → npx leashed - README: new "AI got hands" branding with be-half puns - Why This Exists: Behalf credibility angle (human delegation → agent) All 61 tests pass. TypeScript compiles clean. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e38c7bc commit 14b3093

21 files changed

Lines changed: 218 additions & 214 deletions

.github/ISSUE_TEMPLATE/bug_report.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ assignees: ''
1010

1111
**What did you expect?**
1212

13-
**Policy config (shield.yaml or inline)**
13+
**Policy config (leash.yaml or inline)**
1414

1515
```yaml
1616

1717
```
1818

1919
**Environment**
2020
- Node version:
21-
- declawed version:
21+
- leashed version:
2222
- OS:

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
node_modules/
22
dist/
33
*.jsonl
4-
.shield-session
4+
.leash-session
55
.tmp-*

README.md

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
# declawed
1+
# leashed
22

3-
> Your AI agent has your credentials. This gives it rules.
3+
> AI got hands. This is the leash.
44
5-
Policy, audit, kill switch for any AI agent with access to your accounts.
5+
Your agent gets be-half the access. The safe half. Policy, audit, kill switch for any AI agent with access to your accounts.
66

7-
[![npm version](https://img.shields.io/npm/v/declawed)](https://www.npmjs.com/package/declawed)
8-
[![license](https://img.shields.io/npm/l/declawed)](./LICENSE)
7+
[![npm version](https://img.shields.io/npm/v/leashed)](https://www.npmjs.com/package/leashed)
8+
[![license](https://img.shields.io/npm/l/leashed)](./LICENSE)
99
[![tests](https://img.shields.io/badge/tests-67%20passing-brightgreen)](#)
1010

11-
**[See the full showcase →](https://behalf-gray.vercel.app/shield/)**
11+
**[See the full showcase →](https://behalf-gray.vercel.app/harness/)**
1212

13-
### OpenClaw sales bot — declawed
13+
### OpenClaw sales bot — leashed
1414

1515
![OpenClaw demo](docs/demos/openclaw-demo.gif)
1616

17-
### Work assistant (Claude, Devin, etc.) — declawed
17+
### Work assistant (Claude, Devin, etc.) — leashed
1818

1919
![Work assistant demo](docs/demos/work-assistant-demo.gif)
2020

2121
## The Problem
2222

23-
[42,000 live credentials leaked](https://www.wired.com/story/ai-agent-credential-leaks/) from AI agent workflows. The community's response? Buy a separate Mac Mini. **declawed replaces the Mac Mini** — software governance instead of hardware isolation.
23+
[42,000 live credentials leaked](https://www.wired.com/story/ai-agent-credential-leaks/) from AI agent workflows. The community's response? Buy a separate Mac Mini. **leashed replaces the Mac Mini** — software governance instead of hardware isolation.
2424

2525
## Quick Start
2626

@@ -29,12 +29,12 @@ You need an [AnchorBrowser](https://anchorbrowser.io) API key: `export ANCHOR_AP
2929
### 1. Install
3030

3131
```bash
32-
npm install declawed
32+
npm install leashed
3333
```
3434

3535
### 2. Write a policy
3636

37-
Create `shield.yaml`:
37+
Create `leash.yaml`:
3838

3939
```yaml
4040
agent: my-openclaw-sales-bot
@@ -57,28 +57,28 @@ max_actions: 50
5757
### 3. Wrap your agent
5858
5959
```typescript
60-
import { createShield } from 'declawed'
60+
import { createLeash } from 'leashed'
6161

62-
const shield = createShield('./shield.yaml')
62+
const leash = createLeash('./leash.yaml')
6363

64-
const result = await shield.task('check linkedin inbox')
64+
const result = await leash.task('check linkedin inbox')
6565
// → { allowed: true, output: '...' }
6666

67-
const result2 = await shield.task('export all contacts to CSV')
67+
const result2 = await leash.task('export all contacts to CSV')
6868
// → { allowed: false, reason: 'blocked by deny pattern: *export*' }
6969
```
7070
71-
That's it. Every `shield.task()` call is policy-checked, audited, and budgeted.
71+
That's it. Every `leash.task()` call is policy-checked, audited, and budgeted.
7272

7373
## Common Use Cases
7474

75-
People give agents their passwords every day. Here's what they're afraid of — and how `declawed` fixes it.
75+
People give agents their passwords every day. Here's what they're afraid of — and how `leashed` fixes it.
7676

7777
### 1. LinkedIn Sales Agent (OpenClaw)
7878

7979
**The fear:** Your bot has your LinkedIn password. It's supposed to read your inbox and check messages. But what if it starts mass-connecting, exporting contacts, or changing your profile?
8080

81-
**With declawed:**
81+
**With leashed:**
8282

8383
```yaml
8484
agent: linkedin-sales-bot
@@ -105,7 +105,7 @@ Read inbox, check messages — allowed. Mass-connect, export contacts — blocke
105105

106106
**The fear:** Your assistant has your Gmail. It reads your calendar and summarizes emails. But what if it deletes messages, forwards sensitive emails externally, or changes your billing settings?
107107

108-
**With declawed:**
108+
**With leashed:**
109109

110110
```yaml
111111
agent: daily-briefing
@@ -132,7 +132,7 @@ Read calendar, list emails, summarize threads — allowed. Delete, forward, chan
132132

133133
**The fear:** Your bot updates Salesforce records from your email threads. But what if it bulk-deletes contacts, exports your pipeline, or modifies deal values?
134134

135-
**With declawed:**
135+
**With leashed:**
136136

137137
```yaml
138138
agent: crm-updater
@@ -159,9 +159,9 @@ Read records, update fields, search contacts — allowed. Bulk-delete, export pi
159159

160160
## AI got hands. We control the grip.
161161

162-
Think of a crane operator. The brain decides what to move — but the joystick decides how far the arm can reach. **declawed is the joystick between the AI agent and your accounts.**
162+
Think of a crane operator. The brain decides what to move — but the joystick decides how far the arm can reach. **leashed is the joystick between the AI agent and your accounts.**
163163

164-
### Without declawed
164+
### Without leashed
165165

166166
```mermaid
167167
flowchart LR
@@ -176,12 +176,12 @@ flowchart LR
176176

177177
> **The agent IS you.** Full access. No limits. No off switch.
178178

179-
### With declawed
179+
### With leashed
180180

181181
```mermaid
182182
flowchart LR
183183
A["🤖 AI Agent<br/><i>the brain</i>"]
184-
S["🛡️ declawed<br/><i>the joystick</i>"]
184+
S["🛡️ leashed<br/><i>the joystick</i>"]
185185
B["📧 Your Accounts<br/><i>LinkedIn, Gmail, CRM</i>"]
186186
187187
A -- "requests action" --> S
@@ -200,7 +200,7 @@ flowchart LR
200200
| ❌ delete data | ❌ export contacts |
201201
| ⏱️ 60 min limit | 🔢 50 actions max |
202202

203-
> *A crane operator doesn't carry the steel himself. He moves joysticks that control arms — limited to a work zone, every movement tracked, with an emergency stop within reach. That's what declawed does for AI agents.*
203+
> *A crane operator doesn't carry the steel himself. He moves joysticks that control arms — limited to a work zone, every movement tracked, with an emergency stop within reach. That's what leashed does for AI agents.*
204204

205205
### Three layers of protection
206206

@@ -211,26 +211,30 @@ flowchart LR
211211
## CLI
212212

213213
```bash
214-
npx declawed status # Agent: my-openclaw-sales-bot | Allowed: 23 | Blocked: 3
215-
npx declawed audit # Full audit trail
216-
npx declawed kill # Kill switch — destroy session immediately
214+
npx leashed status # Agent: my-openclaw-sales-bot | Allowed: 23 | Blocked: 3
215+
npx leashed audit # Full audit trail
216+
npx leashed yank # Kill switch — destroy session immediately
217217
```
218218

219219
[Full API reference & policy examples →](./docs/API.md)
220220

221221
## Empowered by AnchorBrowser
222222

223-
declawed runs on [AnchorBrowser](https://anchorbrowser.io) — ephemeral, hardened cloud browser sessions purpose-built for AI agents. Each session is isolated, auto-expires, and leaves no trace. [Cloudflare](https://cloudflare.com) verified bot partner. SOC2 Type 2 and ISO27001 certified. Trusted by [Google](https://google.com), [Coinbase](https://coinbase.com), and [Composio](https://composio.dev). Stealth proxies, CAPTCHA solving, anti-fingerprinting, and full session isolation out of the box.
223+
leashed runs on [AnchorBrowser](https://anchorbrowser.io) — ephemeral, hardened cloud browser sessions purpose-built for AI agents. Each session is isolated, auto-expires, and leaves no trace. [Cloudflare](https://cloudflare.com) verified bot partner. SOC2 Type 2 and ISO27001 certified. Trusted by [Google](https://google.com), [Coinbase](https://coinbase.com), and [Composio](https://composio.dev). Stealth proxies, CAPTCHA solving, anti-fingerprinting, and full session isolation out of the box.
224224

225-
AnchorBrowser handles the browser. declawed handles the rules.
225+
AnchorBrowser handles the browser. leashed handles the rules.
226226

227227
[Get an API key →](https://anchorbrowser.io)
228228

229229
## Why This Exists
230230

231-
AI agents are getting credential access with zero governance — 42,000 live credentials exposed, and the best workaround is buying separate hardware. `declawed` gives agents what they should have had from the start: **a policy file, an audit log, and a kill switch.**
231+
[Behalf](https://behalf-gray.vercel.app) already powers safe delegation for humans — scoped sessions, audit trails, and instant revocation for people who delegate work through their accounts. We built the trust infrastructure, battle-tested it, and realized: **agents need the exact same thing.**
232232

233-
Built by [Behalf](https://behalf-gray.vercel.app) — delegation governance for the agent era.
233+
42,000 live credentials leaked from AI agent workflows. The community's best workaround is buying a separate Mac Mini. That's not security — that's surrender.
234+
235+
So we open-sourced the engine. `leashed` gives agents what they should have had from the start: **a policy file, an audit log, and a kill switch.** The same trust model that protects human delegation — now available for every agent operator.
236+
237+
Half the access. All the work done.
234238

235239
## License
236240

SECURITY.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Reporting a Vulnerability
44

5-
If you discover a security vulnerability in `declawed`, **please do not file a public issue.**
5+
If you discover a security vulnerability in `leashed`, **please do not file a public issue.**
66

77
Email: **dormstern@gmail.com**
88

@@ -15,13 +15,13 @@ We will acknowledge receipt within 48 hours and aim to release a fix within 7 da
1515

1616
## Scope
1717

18-
`declawed` is responsible for:
18+
`leashed` is responsible for:
1919
- Policy evaluation (deny/allow pattern matching)
2020
- Audit log integrity (append-only JSONL)
2121
- Session lifecycle (create, kill, budget enforcement)
2222
- Input sanitization (Unicode bypass protection)
2323

24-
`declawed` is **not** responsible for:
24+
`leashed` is **not** responsible for:
2525
- AnchorBrowser SDK security (report to [AnchorBrowser](https://anchorbrowser.io))
2626
- Semantic prompt injection (glob patterns are a coarse filter, not a semantic security boundary)
2727
- Credential storage (API keys are your responsibility)

agent-work.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/usr/bin/env node
2-
// Demo: a knowledge worker assistant — governed by declawed
2+
// Demo: a knowledge worker assistant — governed by leashed
33
// Think Claude Computer Use, Devin, or any AI work assistant.
44

55
import { loadPolicy, evaluatePolicy } from './dist/policy.js'
@@ -28,7 +28,7 @@ const tasks = [
2828
'share document with billing admin',
2929
]
3030

31-
console.log(`${BOLD}declawed${RESET} ${DIM}v0.1.0${RESET}`)
31+
console.log(`${BOLD}leashed${RESET} ${DIM}v0.1.0${RESET}`)
3232
console.log(`${DIM}agent: work-assistant | policy: deny-first | budget: 200 actions | expires: 8h${RESET}`)
3333
console.log()
3434

@@ -47,4 +47,4 @@ for (const task of tasks) {
4747
}
4848

4949
console.log()
50-
console.log(`${DIM}${allowed} allowed · ${blocked} blocked · audit: shield-audit.jsonl${RESET}`)
50+
console.log(`${DIM}${allowed} allowed · ${blocked} blocked · audit: leash-audit.jsonl${RESET}`)

agent.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/usr/bin/env node
2-
// Demo: an OpenClaw sales bot — governed by declawed
2+
// Demo: an OpenClaw sales bot — governed by leashed
33
// This is what it looks like when your agent has rules.
44

55
import { loadPolicy, evaluatePolicy } from './dist/policy.js'
@@ -28,7 +28,7 @@ const tasks = [
2828
'send bulk connection requests',
2929
]
3030

31-
console.log(`${BOLD}declawed${RESET} ${DIM}v0.1.0${RESET}`)
31+
console.log(`${BOLD}leashed${RESET} ${DIM}v0.1.0${RESET}`)
3232
console.log(`${DIM}agent: my-openclaw-sales-bot | policy: deny-first | budget: 50 actions | expires: 60min${RESET}`)
3333
console.log()
3434

@@ -47,4 +47,4 @@ for (const task of tasks) {
4747
}
4848

4949
console.log()
50-
console.log(`${DIM}${allowed} allowed · ${blocked} blocked · audit: shield-audit.jsonl${RESET}`)
50+
console.log(`${DIM}${allowed} allowed · ${blocked} blocked · audit: leash-audit.jsonl${RESET}`)

0 commit comments

Comments
 (0)