{"_id":"@biratkk/pi-trust-policy","_rev":"3-77a93af9b376f9822e7e7c7bf34040cb","name":"@biratkk/pi-trust-policy","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.0":{"name":"@biratkk/pi-trust-policy","version":"0.1.0","keywords":["pi-package","trust-policy","permissions","bash","allowlist","security"],"author":{"name":"biratkk"},"license":"MIT","_id":"@biratkk/pi-trust-policy@0.1.0","maintainers":[{"name":"biratkk","email":"koiralabirat@gmail.com"}],"homepage":"https://github.com/biratkk/pi-trust-policy#readme","bugs":{"url":"https://github.com/biratkk/pi-trust-policy/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"fcdcfd6977b0ddb4198d624adf9461b8412c69cf","tarball":"https://registry.npmjs.org/@biratkk/pi-trust-policy/-/pi-trust-policy-0.1.0.tgz","fileCount":61,"integrity":"sha512-2b1JtUtKMkBGYbtay9KSyVDKwq4gYOZ1jKgnpIXqaKXFHy0RgeYdhnCuX38EO9jigiVVEM1i6xGac7wb/OGgBQ==","signatures":[{"sig":"MEQCIHZOWRswMnSYy4NUs6LJpXjG7aOut1/IN5wDqVx9ztXyAiBnaMNGJoDfRfpFMcAFmh+aFrWRs8Qutf/G5ABqLARGJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112239},"main":"src/index.ts","type":"module","gitHead":"1fa90fc46f5b041a5dccd558f3824f36b27e9e12","scripts":{"test":"vitest run","test:watch":"vitest"},"_npmUser":{"name":"biratkk","email":"koiralabirat@gmail.com"},"repository":{"url":"git+https://github.com/biratkk/pi-trust-policy.git","type":"git"},"_npmVersion":"11.12.1","description":"Bash command allowlist system for pi — grouped trust policies with glob matching, recursive parsing, and an interactive TUI manager","directories":{"doc":"docs","test":"tests"},"_nodeVersion":"25.9.0","dependencies":{"yaml":"^2.7.0","unbash":"^3.0.0","minimatch":"^10.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.7","typescript":"^6.0.3","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"^0.75.4"},"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-trust-policy_0.1.0_1779444449037_0.2842204245117901","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@biratkk/pi-trust-policy","version":"0.1.5","keywords":["pi-package","trust-policy","permissions","bash","allowlist","security"],"author":{"name":"biratkk"},"license":"MIT","_id":"@biratkk/pi-trust-policy@0.1.5","maintainers":[{"name":"biratkk","email":"koiralabirat@gmail.com"}],"homepage":"https://github.com/biratkk/pi-trust-policy#readme","bugs":{"url":"https://github.com/biratkk/pi-trust-policy/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"99c26b826750bf758bf106f0cd779099f8f0ceb0","tarball":"https://registry.npmjs.org/@biratkk/pi-trust-policy/-/pi-trust-policy-0.1.5.tgz","fileCount":73,"integrity":"sha512-rIXMYy3Bp+W+l8XNTtZq6WN17XjS3TM0a9VM7OKaVhj47Vpw1nhIVyjcmoSW3FSly1H6BHlhnhD62ZkmVoolTg==","signatures":[{"sig":"MEUCIQCEcrABUZxZ3WsY5U3PTOyHXlm4QoGECd0tr1hMbqxamAIgCSxCmjkJSup2192uIZjh7N1fEzr18Dj3viqcKgWcsv4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@biratkk%2fpi-trust-policy@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":120771},"type":"module","gitHead":"68749c3b42bf9d1619591c01c3b41cf1079d8a00","scripts":{"test":"vitest run","test:watch":"vitest"},"_npmUser":{"name":"biratkk","email":"koiralabirat@gmail.com"},"repository":{"url":"git+https://github.com/biratkk/pi-trust-policy.git","type":"git"},"_npmVersion":"10.8.2","description":"Bash command allowlist system for pi — grouped trust policies with glob matching, recursive parsing, and an interactive TUI manager","directories":{},"_nodeVersion":"20.20.2","dependencies":{"yaml":"^2.7.0","unbash":"^3.0.0","minimatch":"^10.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.7","typescript":"^6.0.3","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"^0.75.4"},"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-trust-policy_0.1.5_1779789790389_0.3143922051118997","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@biratkk/pi-trust-policy","version":"0.1.6","description":"Bash command allowlist system for pi — grouped trust policies with glob matching, recursive parsing, and an interactive TUI manager","keywords":["pi-package","trust-policy","permissions","bash","allowlist","security"],"type":"module","license":"MIT","repository":{"type":"git","url":"git+https://github.com/biratkk/pi-trust-policy.git"},"author":{"name":"biratkk"},"scripts":{"test":"vitest run","test:watch":"vitest"},"pi":{"extensions":["./src/index.ts"]},"peerDependencies":{"@earendil-works/pi-coding-agent":"*","@earendil-works/pi-tui":"*"},"dependencies":{"minimatch":"^10.2.5","unbash":"^3.0.0","yaml":"^2.7.0"},"devDependencies":{"@earendil-works/pi-coding-agent":"^0.75.4","@types/node":"^22.0.0","typescript":"^6.0.3","vitest":"^4.1.7"},"_id":"@biratkk/pi-trust-policy@0.1.6","gitHead":"09352e4187a29085764b12cf6adadbab2d48c951","bugs":{"url":"https://github.com/biratkk/pi-trust-policy/issues"},"homepage":"https://github.com/biratkk/pi-trust-policy#readme","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-CT4v1C23UZwR9fijoiru5Usg06LrLKsIMZ+ZaCbR3zU6iIjoBJvs3GvtVcALLjbJOpp5G+Dw+OUyy9OMPVqu/A==","shasum":"5806b648391d2af4e788a8315943821728532b20","tarball":"https://registry.npmjs.org/@biratkk/pi-trust-policy/-/pi-trust-policy-0.1.6.tgz","fileCount":76,"unpackedSize":127336,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@biratkk%2fpi-trust-policy@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAmtrCW24Q8KGh/TC8bNKW/ESKV+56H8v6qHGZyL4a+yAiBlv1rXIcmHv185GbmuRBIE9kxN0vN/1gfhdVo0L/CVEw=="}]},"_npmUser":{"name":"biratkk","email":"koiralabirat@gmail.com"},"directories":{},"maintainers":[{"name":"biratkk","email":"koiralabirat@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-trust-policy_0.1.6_1779790910235_0.4361437831904129"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-22T10:07:28.536Z","modified":"2026-05-26T10:21:50.671Z","0.1.0":"2026-05-22T10:07:29.201Z","0.1.5":"2026-05-26T10:03:10.555Z","0.1.6":"2026-05-26T10:21:50.373Z"},"bugs":{"url":"https://github.com/biratkk/pi-trust-policy/issues"},"author":{"name":"biratkk"},"license":"MIT","homepage":"https://github.com/biratkk/pi-trust-policy#readme","keywords":["pi-package","trust-policy","permissions","bash","allowlist","security"],"repository":{"type":"git","url":"git+https://github.com/biratkk/pi-trust-policy.git"},"description":"Bash command allowlist system for pi — grouped trust policies with glob matching, recursive parsing, and an interactive TUI manager","maintainers":[{"name":"biratkk","email":"koiralabirat@gmail.com"}],"readme":"# pi-trust-policy\n\nBash command allowlist system for [pi](https://github.com/earendil-works/pi). Group trusted commands into policies, toggle them on/off, and get prompted for anything not covered.\n\n## Install\n\n```bash\npi install git:github.com/biratkk/pi-trust-policy\n```\n\nOr for a quick test:\n\n```bash\npi -e git:github.com/biratkk/pi-trust-policy\n```\n\n## Getting Started\n\nAfter installing, open pi and run:\n\n```\n/trust-policy\n```\n\nThat's it. Type to search, Enter to cycle activation states.\n\n## Usage\n\n### 1. Write a policy YAML file\n\nCreate `~/.pi/agent/trust-policy/my-dev-tools.yaml`:\n\n```yaml\nname: my-dev-tools\ndescription: Development commands for my project\n\nincludes:\n  - unix-read\n\ncommands:\n  - glob: \"npm run *\"\n    description: \"Run package scripts\"\n    pipe: true\n  - glob: \"docker build {*,*/**}\"\n    description: \"Build Docker images\"\n    redirect: append\n```\n\n### 2. Activate it\n\nRun `/trust-policy` in pi to open the TUI manager. Type to fuzzy-search, Enter/Space to cycle through activation states:\n\n| State | Meaning |\n|-------|--------|\n| `inactive` | Not active anywhere |\n| `local` | Active in project `.pi/trust-policy/` only |\n| `global` | Active in `~/.pi/agent/trust-policy/` (all projects) |\n| `global & local` | Active in both scopes |\n\nOr manually create `~/.pi/agent/trust-policy/policy.json`:\n\n```json\n{\n  \"active\": [\"unix-read\"]\n}\n```\n\n### 3. Work normally\n\nTrusted commands run without interruption. Untrusted commands prompt you with options to allow once, deny, or persist to a group.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `/trust-policy` | Open TUI manager — toggle policies active/inactive |\n\n## Policy Format\n\n```yaml\nname: my-policy\ndescription: What this policy covers\n\nincludes:                    # optional: inherit from other groups\n  - grep-read\n  - cat-read\n\ncommands:\n  - glob: \"docker build *\"\n    description: \"Build images\"  # optional\n    pipe: false                  # allow in pipelines (default: false)\n    embedded: false              # allow in $() substitutions (default: false)\n    redirect: none               # none | append | overwrite | both (default: none)\n```\n\n### Redirect Modes\n\n| Value | Allows |\n|-------|--------|\n| `none` | No redirects — command must run without `>` or `>>` |\n| `append` | `>>` only |\n| `overwrite` | `>` only |\n| `both` | Both `>` and `>>` |\n\n## Starters\n\nBuilt-in starter policies are organized by risk level and can be activated from the TUI:\n\n| Policy | Category | Includes |\n|--------|----------|----------|\n| **unix-read** | Safe | grep, cat, ls, head, tail, wc, find, cut, sort |\n| **unix-write** | Modifying | sed, awk, tee, cp, curl -o, sort -o |\n| **unix-dangerous** | Destructive | rm, shred, truncate, mv |\n\nEach aggregate policy composes per-tool policies (e.g., `unix-read` includes `grep-read`, `cat-read`, etc.). Per-tool policies live in subdirectories under `~/.pi/agent/trust-policy/policies/` and can also be activated individually for granular control.\n\nOn first session start, starters are migrated to `~/.pi/agent/trust-policy/policies/`. You own the copies and can freely edit them.\n\n## How It Works\n\n1. At session start, migrates bundled starter policies to `~/.pi/agent/trust-policy/policies/` (only new files, preserves edits)\n2. Loads `policy.json` from global (`~/.pi/agent/trust-policy/`) and local (`.pi/trust-policy/`) directories\n3. Resolves all active groups and their `includes` recursively (with cycle detection)\n4. Intercepts every `bash` tool call and validates against the merged allowlist\n5. Recursively parses compound commands (pipelines, `&&`/`||`/`;`, `$()`, `bash -c`) using [unbash](https://github.com/webpro-nl/unbash)\n6. Validates redirect operators (`>`, `>>`) against each entry's `redirect` permission\n7. Commands with env vars, `eval`, or unparseable elements always prompt\n\n## Security Model\n\n- **Pure allowlist** — only explicitly permitted commands run without confirmation\n- **Fail-safe defaults** — `pipe: false`, `embedded: false`, `redirect: none`\n- **Redirect enforcement** — `>` and `>>` require explicit `redirect` permission on the matching entry\n- **Env vars always prompt** — `VAR=val cmd` and `export` trigger confirmation\n- **Recursive validation** — every segment of a compound command is checked independently\n\n## File Structure\n\n```\n~/.pi/agent/trust-policy/              # global\n├── policy.json                        # {\"active\": [\"unix-read\", \"unix-write\"]}\n├── policies/                          # migrated starters (source of truth)\n│   ├── unix-read.yaml                 # aggregate: includes per-tool policies\n│   ├── unix-write.yaml\n│   ├── unix-dangerous.yaml\n│   ├── grep/\n│   │   └── grep-read.yaml             # per-tool policy\n│   ├── sed/\n│   │   └── sed-write.yaml\n│   └── rm/\n│       └── rm-destructive.yaml\n└── my-custom-policy.yaml              # user-created policies\n\n<project>/.pi/trust-policy/            # local (project-scoped)\n├── policy.json\n└── project-scripts.yaml\n```\n\nBoth scopes merge additively. Local policies apply only within that project tree.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}