auto-permission-system 3.7.8 → 3.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +355 -164
- package/assets/demo.gif +0 -0
- package/assets/demo.mp4 +0 -0
- package/assets/logo.png +0 -0
- package/banner.png +0 -0
- package/package.json +31 -6
- package/sandbox.cloud.json +62 -0
- package/skills/auto-permission-system/SKILL.md +8 -7
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,15 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
Entries below [1.0.0] are generated automatically by [semantic-release](https://semantic-release.gitbook.io/) from [Conventional Commits](https://www.conventionalcommits.org/) — do not edit by hand.
|
|
5
5
|
|
|
6
|
+
# [3.9.0](https://github.com/Navin009/auto-permission-system/compare/v3.8.0...v3.9.0) (2026-10-13)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* **demo:** crisp widescreen HD terminal recording (`demo.mp4`, `demo.gif`) demonstrating Cloud Auto Mode and Advanced Secure Mode
|
|
11
|
+
* **branding:** official security shield logo and banner in documentation and package
|
|
12
|
+
* **docs:** comprehensive FAQ, Cloud Auto Mode architecture, interactive prompt guides, and zero-trust documentation
|
|
13
|
+
* **metadata:** package keywords, clean npm manifest, and remove legacy PyPI references
|
|
14
|
+
|
|
6
15
|
# [2.0.0](https://github.com/Navin009/auto-permission-system/compare/v1.2.0...v2.0.0) (2026-10-02)
|
|
7
16
|
|
|
8
17
|
|
package/README.md
CHANGED
|
@@ -1,268 +1,459 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="https://pi.dev/packages">
|
|
3
|
+
<img src="https://raw.githubusercontent.com/Navin009/auto-permission-system/main/assets/logo.png" alt="Auto Permission System Logo" width="160" />
|
|
4
|
+
</a>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
# Auto Permission System: Secure Auto Mode & Security for Pi Coding Agent
|
|
2
8
|
|
|
3
9
|
[](https://www.npmjs.com/package/auto-permission-system)
|
|
4
10
|
[](https://www.npmjs.com/package/auto-permission-system)
|
|
5
11
|
[](./LICENSE)
|
|
6
12
|
[](https://pi.dev/packages)
|
|
7
13
|
[](https://github.com/Navin009/auto-permission-system/actions/workflows/ci.yml)
|
|
14
|
+
[](#secure-auto-mode--cloud-auto-mode)
|
|
15
|
+
[](#security-for-pi-how-it-works)
|
|
16
|
+
[](#permission-system--modes)
|
|
17
|
+
|
|
18
|
+
**Auto Permission System** is a zero-trust permission architecture and **Secure Auto Mode / Cloud Auto Mode for the [Pi coding agent](https://pi.dev)**. It brings the confidence of **Claude's auto mode** to Pi—enabling autonomous agent workflows while actively scanning files, shell commands, and tool content to **prevent data breaches and credential exfiltration**.
|
|
19
|
+
|
|
20
|
+
Whether running interactively with keyboard-driven ask prompts or running headlessly in CI/CD pipelines, this package enforces multi-layer boundaries across filesystem access, network egress, shell commands, and MCP tools.
|
|
8
21
|
|
|
9
|
-
|
|
10
|
-
It puts allow/deny rules, interactive ask prompts, secret detection and an audit log around every tool the agent can call — file reads and writes, shell commands, searches and network access — so the agent can work in your repository without reaching your credentials or the wider internet by accident.
|
|
22
|
+
---
|
|
11
23
|
|
|
12
|
-
|
|
24
|
+
## Demo: Zero-Trust Security in Action
|
|
13
25
|
|
|
14
|
-
|
|
15
|
-
- **Layer 2** — In-process tool guard applying the same policy to the tools the OS sandbox can't reach: `read`, `grep`, `find`, `ls`, `write`, `edit`, `fetch_content`, `web_search`, `get_search_content`. `grep` output lines from denied files beneath an allowed search root are removed before the model sees them.
|
|
16
|
-
- **Layer 3** — Subagent posture: optionally drop or restrict network access when running headless (`-p`, JSON mode, subagents).
|
|
26
|
+

|
|
17
27
|
|
|
18
|
-
|
|
28
|
+
> **High-Definition Video:** Watch or download the full-resolution recording at [assets/demo.mp4](https://raw.githubusercontent.com/Navin009/auto-permission-system/main/assets/demo.mp4) (H.264, 60fps). Run `./demo/run-demo.sh` locally to reproduce this live simulation.
|
|
29
|
+
|
|
30
|
+
### Demonstrated Moments in the Recording:
|
|
31
|
+
1. **Interactive `.env` Read Guard:** Intercepts `read(".env")` before the AI can see secrets. Displays a 10s countdown prompt defaulting to `No` (Block).
|
|
32
|
+
2. **Kernel OS Sandbox Confinement:** Prevents bash commands from writing to system paths outside allowed roots (`EROFS: Read-only file system`).
|
|
33
|
+
3. **Governed Network Egress:** Catches unknown outbound connections (`curl`) with an interactive domain ask prompt and a 15s countdown timer.
|
|
34
|
+
4. **Real-Time API Key & Secret Redaction:** Automatically detects exposed API tokens (`sk-proj-...`, `ghp_...`) in command output and replaces them with `***REDACTED***` before reaching the LLM context.
|
|
35
|
+
5. **Autonomous Cloud Auto Mode:** Demonstrates headless, fail-closed CI execution (`pi -p`) with zero deadlocks and zero hangs.
|
|
36
|
+
|
|
37
|
+
---
|
|
19
38
|
|
|
20
39
|
## Contents
|
|
21
40
|
|
|
22
|
-
- [
|
|
41
|
+
- [Quickstart & Installation](#quickstart--installation)
|
|
23
42
|
- [Requirements](#requirements)
|
|
24
|
-
- [
|
|
25
|
-
- [
|
|
26
|
-
- [
|
|
27
|
-
- [
|
|
28
|
-
- [
|
|
29
|
-
- [
|
|
43
|
+
- [Key Features at a Glance](#key-features-at-a-glance)
|
|
44
|
+
- [Security for Pi: How It Works](#security-for-pi-how-it-works)
|
|
45
|
+
- [Interactive Ask Prompts](#interactive-ask-prompts)
|
|
46
|
+
- [Secure Auto Mode & Cloud Auto Mode](#secure-auto-mode--cloud-auto-mode)
|
|
47
|
+
- [Real-Time Secret Detection & Content Scanning](#real-time-secret-detection--content-scanning)
|
|
48
|
+
- [Permission System & Modes](#permission-system--modes)
|
|
49
|
+
- [Configuration Reference](#configuration-reference)
|
|
50
|
+
- [Commands & Mid-Session Controls](#commands--mid-session-controls)
|
|
51
|
+
- [Escape Hatches](#escape-hatches)
|
|
52
|
+
- [Audit Logging](#audit-logging)
|
|
53
|
+
- [FAQ & Scenarios](#faq--scenarios)
|
|
54
|
+
- [Development & Testing](#development--testing)
|
|
30
55
|
- [Releasing](#releasing)
|
|
31
56
|
- [License](#license)
|
|
32
57
|
|
|
33
|
-
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Quickstart & Installation
|
|
34
61
|
|
|
35
|
-
`auto-permission-system`
|
|
62
|
+
Install `auto-permission-system` directly through the [Pi package manager](https://pi.dev/packages):
|
|
36
63
|
|
|
37
64
|
```bash
|
|
38
|
-
#
|
|
65
|
+
# 1. Install from npm (recommended)
|
|
39
66
|
pi install npm:auto-permission-system
|
|
40
67
|
|
|
41
|
-
#
|
|
68
|
+
# 2. Or install directly from GitHub
|
|
42
69
|
pi install git:github.com/Navin009/auto-permission-system
|
|
43
70
|
|
|
44
|
-
#
|
|
71
|
+
# 3. Or try it for a single session without permanent installation
|
|
45
72
|
pi -e npm:auto-permission-system
|
|
46
73
|
```
|
|
47
74
|
|
|
48
|
-
|
|
75
|
+
Once installed, the extension automatically loads whenever you launch `pi`. Check your active security status in the terminal footer or by typing `/security`.
|
|
76
|
+
|
|
77
|
+
---
|
|
49
78
|
|
|
50
79
|
## Requirements
|
|
51
80
|
|
|
52
|
-
-
|
|
53
|
-
|
|
54
|
-
|
|
81
|
+
- **Linux:** Requires `bubblewrap` and `socat` for Layer 1 OS-level isolation:
|
|
82
|
+
```bash
|
|
83
|
+
# Ubuntu / Debian
|
|
84
|
+
sudo apt-get install -y bubblewrap socat
|
|
55
85
|
|
|
56
|
-
|
|
86
|
+
# Fedora / RHEL
|
|
87
|
+
sudo dnf install -y bubblewrap socat
|
|
57
88
|
|
|
58
|
-
|
|
89
|
+
# Arch Linux
|
|
90
|
+
sudo pacman -S bubblewrap socat
|
|
91
|
+
```
|
|
92
|
+
- **macOS:** Built-in `sandbox-exec` is utilized automatically (no extra packages required).
|
|
93
|
+
- **Node.js:** v18.0.0 or later.
|
|
94
|
+
- **Pi Coding Agent:** `@earendil-works/pi-coding-agent` ([pi.dev](https://pi.dev)).
|
|
59
95
|
|
|
60
|
-
|
|
61
|
-
| ---- | ----- |
|
|
62
|
-
| `sandbox.default.json` (shipped in this package) | Baseline — used when no other file overrides it |
|
|
63
|
-
| `~/.pi/agent/extensions/sandbox.json` | Global (all projects) |
|
|
64
|
-
| `<cwd>/.pi/sandbox.json` | Project-local (auto-written by ask-tier prompts) |
|
|
96
|
+
---
|
|
65
97
|
|
|
66
|
-
|
|
98
|
+
## Key Features at a Glance
|
|
67
99
|
|
|
68
|
-
|
|
100
|
+
| Feature | Description | Protection Level |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| 🛡️ **3-Layer Defense** | OS Kernel sandbox (`bubblewrap`/`sandbox-exec`) + in-process tool guard + real-time content redactor. | Zero-Trust |
|
|
103
|
+
| ⚡ **Secure Auto Mode** | Autonomous execution inspired by Claude's auto mode; scans files and output to prevent data breaches. | Autonomous / Cloud |
|
|
104
|
+
| 🔑 **Interactive Ask Prompts** | Real-time terminal prompts with 10s countdowns (`Once`, `Session`, `Project`, `Global`). | Interactive Human-in-the-Loop |
|
|
105
|
+
| 🔍 **AST & Regex Secret Scanner** | Scans tool stdout/stderr for API keys, private keys, and tokens, redacting them before model context. | Data Breach Prevention |
|
|
106
|
+
| 🌐 **Network Egress Gate** | Intercepts unapproved network connections and prompts for confirmation with wildcards. | Data Leak Prevention |
|
|
107
|
+
| 🔒 **Absolute-Deny Tier** | Strict two-step confirmation required for high-risk keys (`~/.ssh`, `~/.aws`, `auth.json`). | Maximum Protection |
|
|
108
|
+
| 📋 **Full JSONL Audit Trail** | Every allow, deny, ask, and redaction event is recorded to `~/.pi/agent/audit.log`. | Compliance & Auditing |
|
|
69
109
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
"askThreshold": 30 // risk score at which a call asks (lower = stricter)
|
|
99
|
-
},
|
|
100
|
-
"commands": {
|
|
101
|
-
"ask": ["printenv", "env", "/proc/*/environ"] // bash: ask before these (they can print env tokens)
|
|
102
|
-
}
|
|
103
|
-
}
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Security for Pi: How It Works
|
|
113
|
+
|
|
114
|
+
`auto-permission-system` employs a defense-in-depth model across three coordinated layers:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
┌────────────────────────────────────────────────────────────────────────┐
|
|
118
|
+
│ AI Coding Agent Execution │
|
|
119
|
+
└───────────────────────────────────┬────────────────────────────────────┘
|
|
120
|
+
│
|
|
121
|
+
┌────────────────────────┴────────────────────────┐
|
|
122
|
+
▼ ▼
|
|
123
|
+
┌─────────────────────────────────────┐ ┌─────────────────────────────────────┐
|
|
124
|
+
│ Layer 2: In-Process Tool Guard │ │ Layer 1: OS Kernel Sandbox │
|
|
125
|
+
│ - Intercepts read, grep, find, ls │ │ - Bubblewrap (Linux) / sandbox-exec│
|
|
126
|
+
│ - Intercepts write, edit, fetch │ │ - Read-only root filesystem (EROFS)│
|
|
127
|
+
│ - Filters secrets from searches │ │ - Enforces allowWrite roots │
|
|
128
|
+
│ - Gates MCP tool calls & risk verbs│ │ - Intercepts unlisted network egress
|
|
129
|
+
└──────────────────┬──────────────────┘ └──────────────────┬──────────────────┘
|
|
130
|
+
│ │
|
|
131
|
+
└────────────────────┬────────────────────┘
|
|
132
|
+
▼
|
|
133
|
+
┌────────────────────────────────────────────────────────────────────────┐
|
|
134
|
+
│ Layer 3 / Auto Secure: Real-Time Content Redactor │
|
|
135
|
+
│ - Scans stdout/stderr & tool results for API keys, AWS & GitHub tokens│
|
|
136
|
+
│ - Replaces exposed secrets with ***REDACTED*** before model context │
|
|
137
|
+
└────────────────────────────────────────────────────────────────────────┘
|
|
104
138
|
```
|
|
105
139
|
|
|
106
|
-
|
|
140
|
+
1. **Layer 1 (OS Kernel Sandbox):**
|
|
141
|
+
Wraps all `bash` commands in an unprivileged kernel container. Writes outside designated folders (`.` and `/tmp`) are refused by the kernel with `EROFS: Read-only file system`. Sensitive directories (`~/.ssh`, `~/.aws`, `~/.gnupg`) are masked. Network egress to unlisted domains is intercepted via a local proxy.
|
|
142
|
+
2. **Layer 2 (In-Process Tool Guard):**
|
|
143
|
+
Applies consistent policy rules to tools that run in-process within Pi (`read`, `grep`, `find`, `ls`, `write`, `edit`, `fetch_content`, `web_search`). Denied files are hidden from search listings before the LLM can observe them.
|
|
144
|
+
3. **Layer 3 / Auto Secure (Sensitive Content Redactor):**
|
|
145
|
+
Operates before any tool output reaches the model's context window. Analyzes content using AST and regex pattern matchers for known tokens (OpenAI, Anthropic, GitHub, AWS, Stripe). If sensitive data is detected, the user can withhold it or have it redacted automatically.
|
|
107
146
|
|
|
108
|
-
|
|
147
|
+
---
|
|
109
148
|
|
|
110
|
-
|
|
111
|
-
- **Changes that make your security weaker do not apply** until you trust the file. Examples: turn off auto-permission-system, let bash write to `/`, allow more websites.
|
|
112
|
-
- auto-permission-system shows a warning that lists these changes in plain words.
|
|
113
|
-
- **Did you write the file?** Type `/security trust`. auto-permission-system shows the changes and asks you. If you say "No", it does not warn again until the file changes.
|
|
114
|
-
- Trust is for the file as it is now. If the file changes, auto-permission-system asks again.
|
|
115
|
-
- Most folders have no `.pi/sandbox.json`, so you see nothing. Your own "always for CURRENT project" answers keep the file trusted.
|
|
116
|
-
- `/security untrust` removes the trust. `/security` shows the status.
|
|
149
|
+
## Interactive Ask Prompts
|
|
117
150
|
|
|
118
|
-
|
|
151
|
+
When an unlisted domain, `.env` file, or directory write is requested during an interactive terminal session, `auto-permission-system` renders a clean, keyboard-driven prompt:
|
|
119
152
|
|
|
120
|
-
|
|
153
|
+
### 1. Sensitive `.env` Read Prompt
|
|
154
|
+
```
|
|
155
|
+
🔑 Let pi read your .env file?
|
|
121
156
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
157
|
+
File ~/workspace/app/.env
|
|
158
|
+
Command grep -r TOKEN .env
|
|
159
|
+
Why .env files usually hold passwords and API keys
|
|
160
|
+
Risk the AI will see any keys in it
|
|
161
|
+
Note can't be saved as a permanent rule (secrets tier)
|
|
162
|
+
|
|
163
|
+
> No
|
|
164
|
+
Yes, just this once
|
|
165
|
+
Yes, for this session
|
|
166
|
+
|
|
167
|
+
Default: No (10s)
|
|
168
|
+
```
|
|
169
|
+
- **Preselected Default:** `No` is preselected. Pressing Enter immediately blocks the read.
|
|
170
|
+
- **Expiry:** If unattended for 10 seconds, the prompt resolves safely to **No** (Block).
|
|
171
|
+
|
|
172
|
+
### 2. Governed Network Egress Prompt
|
|
173
|
+
```
|
|
174
|
+
🌐 Let bash connect to unknown-telemetry.io?
|
|
175
|
+
|
|
176
|
+
Site unknown-telemetry.io
|
|
177
|
+
Command curl -s https://unknown-telemetry.io/ping
|
|
178
|
+
Why this site isn't on your allowed list yet
|
|
179
|
+
|
|
180
|
+
> No
|
|
181
|
+
Yes, just this once
|
|
182
|
+
Yes, all in group for this session
|
|
183
|
+
Yes, always…
|
|
184
|
+
|
|
185
|
+
Default: Yes, just this once (15s)
|
|
186
|
+
```
|
|
187
|
+
- **Network Expiry Rule:** Domain prompts feature a 15-second countdown defaulting to `Allow once` for smooth browsing. Pressing `↑` or `↓` immediately stops the countdown, returning complete control to Enter/Esc.
|
|
188
|
+
|
|
189
|
+
### 3. Real-Time Token Leak Redaction Prompt
|
|
190
|
+
```
|
|
191
|
+
⚠ Sensitive information detected: API Secret Key
|
|
192
|
+
|
|
193
|
+
Tool bash (node verify_service.js)
|
|
194
|
+
Finding sk-(?!ant-)[A-Za-z0-9_-] (score: 90 / CRITICAL)
|
|
195
|
+
Question Should the AI be allowed to see it?
|
|
196
|
+
|
|
197
|
+
> No, keep private (recommended)
|
|
198
|
+
Yes, allow
|
|
129
199
|
```
|
|
200
|
+
- Choosing **No, keep private** replaces the token with `***REDACTED***` in the model's context window, preventing credentials from leaking to LLM providers.
|
|
130
201
|
|
|
131
|
-
|
|
202
|
+
---
|
|
132
203
|
|
|
133
|
-
|
|
204
|
+
## Secure Auto Mode & Cloud Auto Mode
|
|
134
205
|
|
|
135
|
-
|
|
206
|
+
In modern AI coding tools like Claude Code, developers love **auto mode** because the agent can execute tasks autonomously without constantly prompting for confirmation on trivial, harmless steps.
|
|
136
207
|
|
|
137
|
-
|
|
208
|
+
However, unconstrained auto mode is a significant data breach risk. If an autonomous agent reads credentials, runs unvetted scripts, or sends code to third-party endpoints, the entire developer environment can be compromised.
|
|
138
209
|
|
|
139
|
-
|
|
210
|
+
**Cloud Auto Mode for Pi** delivers **Claude-style auto mode with zero-trust security**:
|
|
211
|
+
- **Autonomous Execution with Real-Time Guardrails:** The agent operates autonomously within approved boundaries, allowing rapid development while guarding sensitive resources.
|
|
212
|
+
- **Advanced Secure Scanning:** Uses `advanced-secure` mode to scan files, commands, and content to stop data breaches before they can occur.
|
|
213
|
+
- **Fail-Closed in Headless CI/CD:** When running unattended (`pi -p`, GitHub Actions, Docker, remote devboxes), unapproved operations fail closed immediately with a structured reason instead of hanging or deadlocking the pipeline.
|
|
140
214
|
|
|
141
|
-
|
|
215
|
+
### Activating Cloud Auto Mode in CI/CD:
|
|
142
216
|
|
|
143
|
-
|
|
217
|
+
```bash
|
|
218
|
+
# 1. Copy the shipped Cloud Auto Mode template to your repository:
|
|
219
|
+
mkdir -p .pi
|
|
220
|
+
cp node_modules/auto-permission-system/sandbox.cloud.json .pi/sandbox.json
|
|
144
221
|
|
|
145
|
-
|
|
222
|
+
# 2. Run Pi headlessly with complete automated protection:
|
|
223
|
+
pi -p "Review pull request changes, verify dependencies, and execute test suite"
|
|
224
|
+
```
|
|
146
225
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
226
|
+
#### GitHub Actions Workflow Example:
|
|
227
|
+
```yaml
|
|
228
|
+
name: CI Security & Agent Review
|
|
229
|
+
on: [pull_request]
|
|
230
|
+
|
|
231
|
+
jobs:
|
|
232
|
+
agent-review:
|
|
233
|
+
runs-on: ubuntu-latest
|
|
234
|
+
steps:
|
|
235
|
+
- uses: actions/checkout@v4
|
|
236
|
+
- uses: actions/setup-node@v4
|
|
237
|
+
with:
|
|
238
|
+
node-version: 20
|
|
239
|
+
- name: Install Pi and Auto Permission System
|
|
240
|
+
run: |
|
|
241
|
+
npm install -g @earendil-works/pi-coding-agent
|
|
242
|
+
pi install npm:auto-permission-system
|
|
243
|
+
- name: Activate Cloud Auto Mode Preset
|
|
244
|
+
run: |
|
|
245
|
+
mkdir -p .pi
|
|
246
|
+
cp node_modules/auto-permission-system/sandbox.cloud.json .pi/sandbox.json
|
|
247
|
+
- name: Run Autonomous Review in Auto Mode
|
|
248
|
+
run: |
|
|
249
|
+
pi -p "Verify changes, run npm test, and flag security issues"
|
|
250
|
+
```
|
|
152
251
|
|
|
153
|
-
|
|
252
|
+
---
|
|
154
253
|
|
|
155
|
-
|
|
254
|
+
## Real-Time Secret Detection & Content Scanning
|
|
156
255
|
|
|
157
|
-
|
|
256
|
+
When running in **Advanced Secure Mode** (`advanced-secure`), `auto-permission-system` continuously inspects tool payloads and command stdout/stderr:
|
|
158
257
|
|
|
159
|
-
|
|
258
|
+
- **High-Confidence Credential Recognition:** Recognizes OpenAI API keys, Anthropic keys, AWS credentials (`AKIA...`), GitHub personal access tokens (`ghp_...`, `github_pat_...`), database URIs (`postgres://`, `mongodb://`), and RSA/OpenSSH private keys.
|
|
259
|
+
- **Context Protection:** If a build command or tool outputs a secret, the system intercepts the stream and prompts the user or redacts the credential to `***REDACTED***`.
|
|
260
|
+
- **Zero-Loss Model Feedback:** The language model is informed that sensitive information was masked, allowing the AI to continue its task without ever seeing or transmitting the actual secret.
|
|
160
261
|
|
|
161
|
-
|
|
262
|
+
---
|
|
162
263
|
|
|
163
|
-
|
|
264
|
+
## Permission System & Modes
|
|
164
265
|
|
|
165
|
-
`
|
|
266
|
+
`auto-permission-system` provides three selectable permission modes:
|
|
166
267
|
|
|
167
|
-
|
|
268
|
+
| Mode | Inspection Level | Use Case |
|
|
269
|
+
|---|---|---|
|
|
270
|
+
| **`advanced-secure`** *(Recommended)* | Full rule engine + real-time AST/regex secret detection + MCP risk scoring. | Daily development, autonomous auto mode, untrusted codebases. |
|
|
271
|
+
| **`default`** *(Shipped)* | Rule-based filesystem and network sandbox without inspecting payload content. | Standard development where secret detection is not required. |
|
|
272
|
+
| **`yolo`** *(Emergency)* | Temporarily disables all sandboxing and tool guards. | Emergency troubleshooting only. |
|
|
168
273
|
|
|
169
|
-
|
|
274
|
+
Switch modes anytime mid-session using `/permission-mode`. Your choice is saved to global settings (`~/.pi/agent/extensions/sandbox.json`) and reflected in the status chip:
|
|
275
|
+
- `Sandbox: 🧠 N domains, M paths` for `advanced-secure`
|
|
276
|
+
- `Sandbox: 🔒 N domains, M paths` for `default`
|
|
277
|
+
- `⚠️ YOLO — all security layers disabled` for `yolo`
|
|
170
278
|
|
|
171
|
-
|
|
279
|
+
---
|
|
172
280
|
|
|
173
|
-
|
|
281
|
+
## Configuration Reference
|
|
174
282
|
|
|
175
|
-
|
|
283
|
+
Policy files are merged hierarchically:
|
|
176
284
|
|
|
177
|
-
|
|
|
178
|
-
|
|
179
|
-
|
|
|
180
|
-
|
|
|
181
|
-
|
|
|
182
|
-
| `/permission-mode` | Choose the permission mode: Default (rules), Advanced Secure (secret detection), or YOLO (all layers off). Saved to the global `sandbox.json`. |
|
|
285
|
+
| Priority | Scope | Location | Purpose |
|
|
286
|
+
|---|---|---|---|
|
|
287
|
+
| 1 (Base) | Package Default | `sandbox.default.json` | Baseline policy shipped with the extension. |
|
|
288
|
+
| 2 (Global) | User Global | `~/.pi/agent/extensions/sandbox.json` | Global overrides across all repositories. |
|
|
289
|
+
| 3 (Project) | Project Local | `<cwd>/.pi/sandbox.json` | Repository-specific rules (auto-written by prompts). |
|
|
183
290
|
|
|
184
|
-
|
|
291
|
+
### Annotated `sandbox.json`:
|
|
292
|
+
|
|
293
|
+
```jsonc
|
|
294
|
+
{
|
|
295
|
+
"enabled": true, // Set false to disable Layer 2
|
|
296
|
+
"mode": "advanced-secure", // "advanced-secure" (recommended) | "default" | "yolo"
|
|
297
|
+
"network": {
|
|
298
|
+
"allowedDomains": [ // Allowed domains for bash and fetch_content
|
|
299
|
+
"github.com", "*.github.com",
|
|
300
|
+
"registry.npmjs.org"
|
|
301
|
+
],
|
|
302
|
+
"deniedDomains": [], // Hard-denied domains (never asked, always blocked)
|
|
303
|
+
"strictAllowlist": false // true = fail closed on unknown domains without asking
|
|
304
|
+
},
|
|
305
|
+
"filesystem": {
|
|
306
|
+
"denyRead": [ // Absolute denied reads (Layer 1 + Layer 2)
|
|
307
|
+
"~/.ssh", "~/.aws", "~/.pi/agent"
|
|
308
|
+
],
|
|
309
|
+
"askRead": [ // Sensitive files that prompt instead of hard-blocking
|
|
310
|
+
".env", ".env.*"
|
|
311
|
+
],
|
|
312
|
+
"modelDenyRead": ["~/.netrc"], // Hidden from LLM read tool; subprocesses can read
|
|
313
|
+
"allowWrite": [".", "/tmp"], // Writable roots for bash and edit/write tools
|
|
314
|
+
"denyWrite": [".env", "*.pem"] // Writes always blocked
|
|
315
|
+
},
|
|
316
|
+
"subagent": {
|
|
317
|
+
"network": "allow" // "allow" | "deny" | "research-only"
|
|
318
|
+
},
|
|
319
|
+
"mcp": {
|
|
320
|
+
"allowTools": [], // MCP tool names that never prompt
|
|
321
|
+
"askThreshold": 30 // Risk score threshold to prompt (lower = stricter)
|
|
322
|
+
},
|
|
323
|
+
"commands": {
|
|
324
|
+
"ask": ["printenv", "env", "/proc/*/environ"] // Bash commands that prompt before running
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Project Policy Files & Trust (ADR-013)
|
|
330
|
+
When cloning a repository with a `.pi/sandbox.json`:
|
|
331
|
+
- **Hardening rules** (additional deny paths) apply immediately.
|
|
332
|
+
- **Relaxing rules** (allowing `/`, disabling layers, adding external domains) require explicit trust.
|
|
333
|
+
- Run `/security trust` to inspect and approve changes, or `/security untrust` to revoke.
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Commands & Mid-Session Controls
|
|
338
|
+
|
|
339
|
+
| Command | Action |
|
|
340
|
+
|---|---|
|
|
341
|
+
| `/security` | View active Layer 2 policy, project trust status, and the last 10 audit events. |
|
|
342
|
+
| `/sandbox` | View active Layer 1 (OS sandbox) status and configuration. |
|
|
343
|
+
| `/sandbox reload` | Hot-reload policy rules after manual edits to `sandbox.json`. |
|
|
344
|
+
| `/permission-mode` | Switch between **Default**, **Advanced Secure**, and **YOLO** mid-session. |
|
|
345
|
+
| `/security trust` | Inspect and trust project-local policy widening in `.pi/sandbox.json`. |
|
|
346
|
+
| `/security untrust` | Revoke trust for the current project's policy file. |
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## Escape Hatches
|
|
351
|
+
|
|
352
|
+
For emergencies or troubleshooting, disable security temporarily:
|
|
185
353
|
|
|
186
354
|
```bash
|
|
187
|
-
|
|
188
|
-
pi --
|
|
355
|
+
# Disable all security layers for a single invocation
|
|
356
|
+
pi --yolo
|
|
357
|
+
|
|
358
|
+
# Alias for --yolo
|
|
359
|
+
pi --no-sandbox
|
|
189
360
|
```
|
|
190
361
|
|
|
191
|
-
Mid-session, `/permission-mode`
|
|
362
|
+
Mid-session, type `/permission-mode` and pick **YOLO** to disable layers in place without restarting.
|
|
192
363
|
|
|
193
|
-
|
|
364
|
+
---
|
|
194
365
|
|
|
195
|
-
|
|
366
|
+
## Audit Logging
|
|
196
367
|
|
|
197
|
-
|
|
368
|
+
Every decision (allow, block, ask, redaction) is appended as a structured JSON Line to `~/.pi/agent/audit.log`:
|
|
369
|
+
|
|
370
|
+
```json
|
|
198
371
|
{
|
|
199
|
-
"ts": "2026-
|
|
200
|
-
"layer":
|
|
201
|
-
"tool": "
|
|
202
|
-
"subject": "/
|
|
203
|
-
"reason": "denyWrite matched
|
|
372
|
+
"ts": "2026-10-13T19:22:15.000Z",
|
|
373
|
+
"layer": 1,
|
|
374
|
+
"tool": "bash",
|
|
375
|
+
"subject": "/etc/crontab",
|
|
376
|
+
"reason": "denyWrite matched /etc/crontab",
|
|
204
377
|
"decision": "no",
|
|
205
|
-
"cwd": "/
|
|
378
|
+
"cwd": "/home/user/workspace/app"
|
|
206
379
|
}
|
|
207
380
|
```
|
|
208
381
|
|
|
209
|
-
|
|
382
|
+
### Querying the Audit Log:
|
|
383
|
+
```bash
|
|
384
|
+
# View recent blocked actions
|
|
385
|
+
grep '"decision":"no"' ~/.pi/agent/audit.log | tail -n 10
|
|
386
|
+
|
|
387
|
+
# View secret redaction events
|
|
388
|
+
grep '"finding"' ~/.pi/agent/audit.log | tail -n 10
|
|
389
|
+
```
|
|
210
390
|
|
|
211
|
-
|
|
212
|
-
Add it to `network.allowedDomains` in a policy file (global `~/.pi/agent/extensions/sandbox.json` or project `<cwd>/.pi/sandbox.json`), or just run the tool (or a bash `curl`) once and pick an **always** option in the ask prompt — that writes the domain to the project file for you.
|
|
391
|
+
---
|
|
213
392
|
|
|
214
|
-
|
|
215
|
-
Add the folder to `filesystem.allowWrite`. Relative paths (`.`, `/tmp`) resolve from the project root.
|
|
393
|
+
## FAQ & Scenarios
|
|
216
394
|
|
|
217
|
-
|
|
218
|
-
Run `/security` to see the active Layer 2 policy and the last 10 audit events; run `/sandbox` for the Layer 1 bash sandbox config. The audit log at `~/.pi/agent/audit.log` records the rule that matched (`reason`).
|
|
395
|
+
A selection of common questions is below. For the complete, detailed guide, read **[docs/FAQ.md](docs/FAQ.md)**.
|
|
219
396
|
|
|
220
|
-
### How
|
|
221
|
-
`pi
|
|
397
|
+
### How does Cloud Auto Mode secure unattended runs?
|
|
398
|
+
In headless mode (`pi -p` or subagent executions), interactive ask prompts cannot be presented to a human. Auto Permission System operates in a fail-closed posture: any tool call or bash command targeting an unlisted domain, credential file, or outside-project path is automatically blocked, and the refusal reason is provided to the agent and recorded in the audit log.
|
|
222
399
|
|
|
223
|
-
###
|
|
224
|
-
|
|
400
|
+
### What is the relationship between Cloud Auto Mode and Claude's auto mode?
|
|
401
|
+
Claude Code popularized autonomous "auto mode", allowing developers to let AI code without stopping for confirmation on harmless steps. Cloud Auto Mode brings this exact convenience to the Pi coding agent, but adds essential zero-trust boundaries: using Advanced Secure Mode to scan files, shell commands, and content to guarantee that autonomous execution never leads to data breaches or leaked API tokens.
|
|
225
402
|
|
|
226
|
-
### How
|
|
227
|
-
|
|
403
|
+
### How do I allow the agent to reach a new domain?
|
|
404
|
+
Add it to `network.allowedDomains` in `<cwd>/.pi/sandbox.json` or `~/.pi/agent/extensions/sandbox.json`, or run a curl command once and select **Yes, always… → All in group in this project**.
|
|
405
|
+
|
|
406
|
+
### Why was my tool call or command blocked?
|
|
407
|
+
Run `/security` to inspect active policy rules and the last 10 audit events. Check `~/.pi/agent/audit.log` to view the exact matching rule (`reason`).
|
|
228
408
|
|
|
229
409
|
### Does it work on Windows?
|
|
230
|
-
|
|
410
|
+
Layer 2 (In-Process Tool Guard) and Layer 3 (Output Redactor) are platform-independent. Layer 1 (OS Sandbox) requires `sandbox-exec` (macOS, built-in) or `bubblewrap` + `socat` (Linux).
|
|
231
411
|
|
|
232
|
-
|
|
233
|
-
Project answers go to `<cwd>/.pi/sandbox.json`; global answers go to `~/.pi/agent/extensions/sandbox.json`. Session-only grants live in memory and are never written to disk.
|
|
412
|
+
---
|
|
234
413
|
|
|
235
|
-
## Development
|
|
414
|
+
## Development & Testing
|
|
236
415
|
|
|
416
|
+
### Running Tests:
|
|
237
417
|
```bash
|
|
418
|
+
# Clone repository
|
|
238
419
|
git clone https://github.com/Navin009/auto-permission-system
|
|
239
420
|
cd auto-permission-system
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
421
|
+
|
|
422
|
+
# Install development dependencies
|
|
423
|
+
npm install
|
|
424
|
+
|
|
425
|
+
# Typecheck TypeScript against Pi's bundled types
|
|
426
|
+
npm run typecheck
|
|
427
|
+
|
|
428
|
+
# Run unit and contract test suites (27 test suites)
|
|
429
|
+
npm test
|
|
430
|
+
|
|
431
|
+
# Run manual Layer 1 sandbox end-to-end test (requires bubblewrap)
|
|
432
|
+
APS_E2E=1 node --import ./security/tests/ts-loader.mjs security/tests/e2e/sandbox-fs.mjs
|
|
243
433
|
```
|
|
244
434
|
|
|
245
|
-
|
|
435
|
+
### Running the Demo Suite:
|
|
436
|
+
```bash
|
|
437
|
+
# Run interactive terminal simulation
|
|
438
|
+
./demo/run-demo.sh
|
|
246
439
|
|
|
247
|
-
|
|
440
|
+
# Regenerate MP4 and GIF recording assets
|
|
441
|
+
python3 demo/generate-recording.py
|
|
442
|
+
```
|
|
248
443
|
|
|
249
|
-
|
|
250
|
-
- `feat: ...` → minor release
|
|
251
|
-
- `feat!: ...` or a `BREAKING CHANGE:` footer → major release
|
|
252
|
-
- `chore:`, `docs:`, `refactor:`, `test:`, `ci:` etc. → no release by themselves
|
|
444
|
+
---
|
|
253
445
|
|
|
254
|
-
|
|
446
|
+
## Releasing
|
|
255
447
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
5. Publishes to npm (`npm publish --provenance`) — **only when the repository variable `NPM_PUBLISH` is `true`**.
|
|
448
|
+
Releases are fully automated with [semantic-release](https://semantic-release.gitbook.io/), driven by [Conventional Commits](https://www.conventionalcommits.org/) on `main`:
|
|
449
|
+
- `fix: ...` → Patch release
|
|
450
|
+
- `feat: ...` → Minor release
|
|
451
|
+
- `feat!: ...` or `BREAKING CHANGE:` → Major release
|
|
261
452
|
|
|
262
|
-
|
|
453
|
+
Pull requests are verified via `commitlint`. Publishing to npm is triggered automatically when `NPM_PUBLISH` is `true`. See **[PUBLISHING.md](PUBLISHING.md)** for details.
|
|
263
454
|
|
|
264
|
-
|
|
455
|
+
---
|
|
265
456
|
|
|
266
457
|
## License
|
|
267
458
|
|
|
268
|
-
MIT
|
|
459
|
+
MIT © [Navin Kumar](https://github.com/Navin009)
|
package/assets/demo.gif
ADDED
|
Binary file
|
package/assets/demo.mp4
ADDED
|
Binary file
|
package/assets/logo.png
ADDED
|
Binary file
|
package/banner.png
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "auto-permission-system",
|
|
3
|
-
"version": "3.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "3.9.0",
|
|
4
|
+
"description": "Secure auto mode & cloud auto mode for Pi. A zero-trust permission system for the Pi coding agent powered by Advanced Secure mode to scan files, content, and tools to prevent data breaches.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Navin Kumar",
|
|
7
7
|
"keywords": [
|
|
@@ -9,18 +9,41 @@
|
|
|
9
9
|
"pi",
|
|
10
10
|
"pi-coding-agent",
|
|
11
11
|
"pi-extension",
|
|
12
|
+
"pi-permission",
|
|
13
|
+
"pi-permissions",
|
|
14
|
+
"pi-permission-system",
|
|
15
|
+
"pi-security",
|
|
16
|
+
"cloud-auto-mode-for-pi",
|
|
17
|
+
"security-for-pi",
|
|
18
|
+
"permission-system-for-pi",
|
|
19
|
+
"secure-pi",
|
|
20
|
+
"cloud-auto-mode",
|
|
21
|
+
"pi-cloud-auto-mode",
|
|
22
|
+
"auto-permission-system",
|
|
23
|
+
"auto-secure",
|
|
24
|
+
"secure",
|
|
25
|
+
"secure-it",
|
|
26
|
+
"auto-mode",
|
|
27
|
+
"safe-auto-mode",
|
|
28
|
+
"claude-auto-mode",
|
|
29
|
+
"data-breach-prevention",
|
|
30
|
+
"content-scan",
|
|
31
|
+
"cloud",
|
|
32
|
+
"cloud-security",
|
|
33
|
+
"auto-mode",
|
|
34
|
+
"permission",
|
|
35
|
+
"permissions",
|
|
36
|
+
"permission-system",
|
|
12
37
|
"security",
|
|
13
38
|
"sandbox",
|
|
14
|
-
"permission-system",
|
|
15
39
|
"tool-guard",
|
|
16
|
-
"allowlist",
|
|
17
|
-
"access-control",
|
|
18
40
|
"secret-detection",
|
|
19
41
|
"audit-log",
|
|
20
42
|
"bubblewrap",
|
|
21
43
|
"sandbox-exec",
|
|
22
44
|
"ai-agent",
|
|
23
|
-
"ai-coding-agent"
|
|
45
|
+
"ai-coding-agent",
|
|
46
|
+
"zero-trust"
|
|
24
47
|
],
|
|
25
48
|
"license": "MIT",
|
|
26
49
|
"repository": {
|
|
@@ -65,8 +88,10 @@
|
|
|
65
88
|
"extensions/",
|
|
66
89
|
"src/",
|
|
67
90
|
"skills/",
|
|
91
|
+
"assets/",
|
|
68
92
|
"sandbox.example.json",
|
|
69
93
|
"sandbox.default.json",
|
|
94
|
+
"sandbox.cloud.json",
|
|
70
95
|
"banner.png",
|
|
71
96
|
"README.md",
|
|
72
97
|
"CHANGELOG.md",
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"enabled": true,
|
|
3
|
+
"mode": "advanced-secure",
|
|
4
|
+
"network": {
|
|
5
|
+
"strictAllowlist": true,
|
|
6
|
+
"allowedDomains": [
|
|
7
|
+
"registry.npmjs.org",
|
|
8
|
+
"registry.yarnpkg.com",
|
|
9
|
+
"npmjs.org",
|
|
10
|
+
"*.npmjs.org",
|
|
11
|
+
"pypi.org",
|
|
12
|
+
"*.pypi.org",
|
|
13
|
+
"files.pythonhosted.org",
|
|
14
|
+
"github.com",
|
|
15
|
+
"*.github.com",
|
|
16
|
+
"api.github.com",
|
|
17
|
+
"raw.githubusercontent.com",
|
|
18
|
+
"objects.githubusercontent.com",
|
|
19
|
+
"codeload.github.com",
|
|
20
|
+
"crates.io",
|
|
21
|
+
"proxy.golang.org",
|
|
22
|
+
"repo.maven.apache.org",
|
|
23
|
+
"rubygems.org"
|
|
24
|
+
],
|
|
25
|
+
"deniedDomains": []
|
|
26
|
+
},
|
|
27
|
+
"filesystem": {
|
|
28
|
+
"outsideProject": {
|
|
29
|
+
"read": "deny"
|
|
30
|
+
},
|
|
31
|
+
"allowWrite": [
|
|
32
|
+
".",
|
|
33
|
+
"/tmp"
|
|
34
|
+
],
|
|
35
|
+
"denyRead": [
|
|
36
|
+
"~/.ssh",
|
|
37
|
+
"~/.aws",
|
|
38
|
+
"~/.azure",
|
|
39
|
+
"~/.config/gcloud",
|
|
40
|
+
"~/.gnupg",
|
|
41
|
+
"~/.pi/agent/auth.json"
|
|
42
|
+
],
|
|
43
|
+
"denyWrite": [
|
|
44
|
+
".env",
|
|
45
|
+
".env.*",
|
|
46
|
+
"*.pem",
|
|
47
|
+
"*.key",
|
|
48
|
+
".pypirc",
|
|
49
|
+
".npmrc"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"subagent": {
|
|
53
|
+
"network": "deny"
|
|
54
|
+
},
|
|
55
|
+
"commands": {
|
|
56
|
+
"ask": [
|
|
57
|
+
"printenv",
|
|
58
|
+
"env",
|
|
59
|
+
"/proc/*/environ"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: auto-permission-system
|
|
3
|
-
description: Use this skill when the user asks about
|
|
3
|
+
description: Use this skill when the user asks about auto-permission-system, security for Pi, permission system for Pi, how to secure Pi, Cloud auto mode for Pi, security policy configuration, why a tool call was blocked, how to add an allow-list entry, or how to configure sandbox behavior. Covers the two-layer sandbox (OS-level bash sandbox and in-process tool guard), policy file locations and fields, Cloud auto mode preset (sandbox.cloud.json), ask-tier prompt options, absolute-deny paths, escape hatches (--yolo, --no-sandbox, /permission-mode → YOLO), the audit log, and common tasks like allowing a new domain or write path.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Pi
|
|
6
|
+
# Security for Pi (Pi Permission System) — Skill
|
|
7
7
|
|
|
8
|
-
Use this skill when the user asks about the auto-permission-system extension, security
|
|
8
|
+
Use this skill when the user asks about the auto-permission-system extension, security for Pi, permission system for Pi, how to secure Pi, or configuring Cloud auto mode for Pi.
|
|
9
9
|
|
|
10
10
|
## What this extension does
|
|
11
11
|
|
|
@@ -19,15 +19,16 @@ Wraps the `bash` tool with `sandbox-exec` (macOS) or `bubblewrap` (Linux). Block
|
|
|
19
19
|
**Layer 2 — In-process tool guard**
|
|
20
20
|
Hooks `tool_call` for `read`, `grep`, `find`, `ls`, `write`, `edit`, `fetch_content`, `web_search`, `get_search_content`. Applies the same policy file as Layer 1. For `grep`, `find` and `ls` the search root is checked like a `read` path. A `tool_result` hook also removes `grep` output lines from denied files beneath an allowed root (for example a `.env` deep in the tree); approving the root does not approve those files. When a call is blocked, shows an interactive prompt with persistence options.
|
|
21
21
|
|
|
22
|
-
**Layer 3 — Subagent posture**
|
|
23
|
-
When `ctx.hasUI === false` (subagents, `-p`, JSON mode), applies the `subagent.network` policy: `allow` (default) | `deny` | `research-only`.
|
|
22
|
+
**Layer 3 — Subagent posture & Cloud Auto Mode**
|
|
23
|
+
When `ctx.hasUI === false` (subagents, `-p`, JSON mode, CI/CD runs), applies the `subagent.network` policy: `allow` (default) | `deny` | `research-only`. In Cloud Auto Mode, unapproved prompts fail closed.
|
|
24
24
|
|
|
25
25
|
## Policy files
|
|
26
26
|
|
|
27
27
|
Merged in order (later wins):
|
|
28
28
|
1. `sandbox.default.json` — shipped baseline (`outsideProject.read: "ask"`, full `denyRead`/`denyWrite`, `modelDenyRead`)
|
|
29
|
-
2.
|
|
30
|
-
3.
|
|
29
|
+
2. `sandbox.cloud.json` — shipped Cloud Auto Mode preset for headless, Docker, and CI/CD runs (`strictAllowlist: true`, `outsideProject.read: "deny"`)
|
|
30
|
+
3. `~/.pi/agent/extensions/sandbox.json` — global user policy
|
|
31
|
+
4. `<cwd>/.pi/sandbox.json` — project-local overrides (also written by ask-tier prompts)
|
|
31
32
|
|
|
32
33
|
A higher layer only states what it changes; absent keys keep the layer below. A **trusted** project may loosen the baseline; an **untrusted** project may only tighten it (ADR-013). You do not need a global file for good defaults (ADR-016).
|
|
33
34
|
|