@asterxsk/kiln 0.4.0 → 0.4.2
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/README.md +155 -155
- package/agent/AGENTS.md +67 -67
- package/agent/README.md +5 -5
- package/agent/extensions/ask-user/index.ts +418 -418
- package/agent/extensions/ask-user/install.ps1 +27 -27
- package/agent/extensions/ask-user/install.sh +24 -24
- package/agent/extensions/ask-user/package-lock.json +769 -769
- package/agent/extensions/ask-user/package.json +19 -19
- package/agent/extensions/ask-user/prompt.ts +45 -45
- package/agent/extensions/ask-user/tsconfig.json +7 -7
- package/agent/extensions/background-terminals/docs/implementation-guide.md +942 -942
- package/agent/extensions/background-terminals/index.ts +627 -627
- package/agent/extensions/background-terminals/install.ps1 +27 -27
- package/agent/extensions/background-terminals/install.sh +24 -24
- package/agent/extensions/background-terminals/manager.test.ts +735 -735
- package/agent/extensions/background-terminals/output.test.ts +109 -109
- package/agent/extensions/background-terminals/package-lock.json +769 -769
- package/agent/extensions/background-terminals/package.json +17 -17
- package/agent/extensions/background-terminals/prompt.test.ts +125 -125
- package/agent/extensions/background-terminals/ps.test.ts +82 -82
- package/agent/extensions/background-terminals/result-delivery.test.ts +44 -44
- package/agent/extensions/background-terminals/src/domain.ts +87 -87
- package/agent/extensions/background-terminals/src/manager.ts +907 -907
- package/agent/extensions/background-terminals/src/output.ts +84 -84
- package/agent/extensions/background-terminals/src/prompt.ts +142 -142
- package/agent/extensions/background-terminals/src/result-delivery.ts +27 -27
- package/agent/extensions/background-terminals/src/runtime.ts +36 -36
- package/agent/extensions/background-terminals/src/ui/output-view.ts +79 -79
- package/agent/extensions/background-terminals/src/ui/ps.ts +621 -621
- package/agent/extensions/background-terminals/tsconfig.json +7 -7
- package/agent/extensions/destructive/README.md +31 -31
- package/agent/extensions/destructive/index.ts +88 -88
- package/agent/extensions/destructive/install.ps1 +27 -27
- package/agent/extensions/destructive/install.sh +24 -24
- package/agent/extensions/file-search/index.spec.ts +443 -443
- package/agent/extensions/file-search/index.ts +459 -459
- package/agent/extensions/file-search/install.ps1 +27 -27
- package/agent/extensions/file-search/install.sh +24 -24
- package/agent/extensions/file-search/package-lock.json +2253 -2253
- package/agent/extensions/file-search/package.json +23 -23
- package/agent/extensions/file-search/src/args.ts +122 -122
- package/agent/extensions/file-search/src/binaries.ts +422 -422
- package/agent/extensions/file-search/src/output.ts +126 -126
- package/agent/extensions/file-search/src/process.ts +146 -146
- package/agent/extensions/file-search/src/prompt.ts +52 -52
- package/agent/extensions/file-search/tsconfig.json +7 -7
- package/agent/extensions/goal/README.md +50 -50
- package/agent/extensions/goal/index.ts +155 -155
- package/agent/extensions/goal/install.ps1 +27 -27
- package/agent/extensions/goal/install.sh +24 -24
- package/agent/extensions/kiln-update/README.md +38 -25
- package/agent/extensions/kiln-update/index.ts +177 -99
- package/agent/extensions/modelconf/PLAN.md +915 -915
- package/agent/extensions/modelconf/README.md +66 -66
- package/agent/extensions/modelconf/index.ts +296 -296
- package/agent/extensions/modelconf/install.ps1 +27 -27
- package/agent/extensions/modelconf/install.sh +24 -24
- package/agent/extensions/modelconf/package-lock.json +1809 -1809
- package/agent/extensions/modelconf/package.json +13 -13
- package/agent/extensions/modelconf/src/fuzzy.ts +26 -26
- package/agent/extensions/modelconf/src/glob.ts +13 -13
- package/agent/extensions/modelconf/src/persistence.test.ts +46 -46
- package/agent/extensions/modelconf/src/persistence.ts +164 -164
- package/agent/extensions/modelconf/src/ui/ModelConfView.test.ts +75 -75
- package/agent/extensions/modelconf/src/ui/ModelConfView.ts +1101 -1101
- package/agent/extensions/modelconf/tsconfig.json +15 -15
- package/agent/extensions/pi-web-access/CHANGELOG.md +690 -690
- package/agent/extensions/pi-web-access/LICENSE +21 -21
- package/agent/extensions/pi-web-access/README.md +470 -470
- package/agent/extensions/pi-web-access/SECURITY.md +5 -5
- package/agent/extensions/pi-web-access/activity.ts +101 -101
- package/agent/extensions/pi-web-access/auth-fetch.ts +148 -148
- package/agent/extensions/pi-web-access/brightdata-unlocker.ts +272 -272
- package/agent/extensions/pi-web-access/chrome-cookies.ts +669 -669
- package/agent/extensions/pi-web-access/content-find.ts +139 -139
- package/agent/extensions/pi-web-access/credential-source.ts +191 -191
- package/agent/extensions/pi-web-access/data-uri-sanitize.ts +406 -406
- package/agent/extensions/pi-web-access/datalab-pdf-extract.ts +568 -568
- package/agent/extensions/pi-web-access/declared-web-links.ts +173 -173
- package/agent/extensions/pi-web-access/evidence/CONTRACT-EVIDENCE.md +496 -496
- package/agent/extensions/pi-web-access/evidence/contract-probe.mjs +140 -140
- package/agent/extensions/pi-web-access/exa.ts +526 -526
- package/agent/extensions/pi-web-access/extract.ts +1196 -1196
- package/agent/extensions/pi-web-access/feature-config.ts +29 -29
- package/agent/extensions/pi-web-access/fetch-params.ts +111 -111
- package/agent/extensions/pi-web-access/gemini-adc.ts +298 -298
- package/agent/extensions/pi-web-access/gemini-api.ts +353 -353
- package/agent/extensions/pi-web-access/gemini-pdf-extract.ts +108 -108
- package/agent/extensions/pi-web-access/gemini-search.ts +21 -21
- package/agent/extensions/pi-web-access/gemini-url-context.ts +128 -128
- package/agent/extensions/pi-web-access/gemini-web-config.ts +101 -101
- package/agent/extensions/pi-web-access/gemini-web.ts +487 -487
- package/agent/extensions/pi-web-access/github-api.ts +197 -197
- package/agent/extensions/pi-web-access/github-extract.ts +746 -746
- package/agent/extensions/pi-web-access/github-issue-pr.ts +700 -700
- package/agent/extensions/pi-web-access/index.ts +1737 -1737
- package/agent/extensions/pi-web-access/package-lock.json +5808 -5808
- package/agent/extensions/pi-web-access/package.json +64 -64
- package/agent/extensions/pi-web-access/page-query.ts +96 -96
- package/agent/extensions/pi-web-access/pdf-extract.ts +409 -409
- package/agent/extensions/pi-web-access/promise-try.d.ts +7 -7
- package/agent/extensions/pi-web-access/query-rewrite.ts +51 -51
- package/agent/extensions/pi-web-access/render-search-error.ts +170 -170
- package/agent/extensions/pi-web-access/rsc-extract.ts +338 -338
- package/agent/extensions/pi-web-access/search-types.ts +20 -20
- package/agent/extensions/pi-web-access/source-check.ts +282 -282
- package/agent/extensions/pi-web-access/ssrf-protection.ts +526 -526
- package/agent/extensions/pi-web-access/storage.ts +521 -521
- package/agent/extensions/pi-web-access/summary-model-scope.ts +125 -125
- package/agent/extensions/pi-web-access/test/auth-fetch.test.mjs +208 -208
- package/agent/extensions/pi-web-access/test/brightdata-unlocker.test.mjs +840 -840
- package/agent/extensions/pi-web-access/test/chrome-cookie-extraction.test.mjs +441 -441
- package/agent/extensions/pi-web-access/test/config-path.test.mjs +283 -283
- package/agent/extensions/pi-web-access/test/content-find.test.mjs +25 -25
- package/agent/extensions/pi-web-access/test/credential-source.test.mjs +118 -118
- package/agent/extensions/pi-web-access/test/data-uri-sanitize.test.mjs +210 -210
- package/agent/extensions/pi-web-access/test/datalab-pdf-extract.test.mjs +552 -552
- package/agent/extensions/pi-web-access/test/declared-web-links.test.mjs +212 -212
- package/agent/extensions/pi-web-access/test/fetch-answer-storage.test.mjs +40 -40
- package/agent/extensions/pi-web-access/test/fetch-cache-storage.test.mjs +334 -334
- package/agent/extensions/pi-web-access/test/fetch-content-domain-policy.test.mjs +95 -95
- package/agent/extensions/pi-web-access/test/fetch-modes.test.mjs +53 -53
- package/agent/extensions/pi-web-access/test/fetch-not-found-guidance.test.mjs +92 -92
- package/agent/extensions/pi-web-access/test/fetch-params.test.mjs +86 -86
- package/agent/extensions/pi-web-access/test/fetch-render-call.test.mjs +34 -34
- package/agent/extensions/pi-web-access/test/fetch-routing.test.mjs +173 -173
- package/agent/extensions/pi-web-access/test/gemini-adc-auth.test.mjs +257 -257
- package/agent/extensions/pi-web-access/test/gemini-api-transport.test.mjs +170 -170
- package/agent/extensions/pi-web-access/test/gemini-pdf-extract.test.mjs +133 -133
- package/agent/extensions/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +178 -178
- package/agent/extensions/pi-web-access/test/gemini-web-header-overflow.test.mjs +148 -148
- package/agent/extensions/pi-web-access/test/get-search-content.test.mjs +223 -223
- package/agent/extensions/pi-web-access/test/github-extract.test.mjs +378 -378
- package/agent/extensions/pi-web-access/test/github-issue-pr.test.mjs +565 -565
- package/agent/extensions/pi-web-access/test/inline-content-config.test.mjs +99 -99
- package/agent/extensions/pi-web-access/test/lazy-extract-load.test.mjs +118 -118
- package/agent/extensions/pi-web-access/test/local-video-oversize.test.mjs +52 -52
- package/agent/extensions/pi-web-access/test/package-typebox-dependency.test.mjs +50 -50
- package/agent/extensions/pi-web-access/test/page-query.test.mjs +51 -51
- package/agent/extensions/pi-web-access/test/pdf-config.test.mjs +140 -140
- package/agent/extensions/pi-web-access/test/pdf-extract.test.mjs +500 -500
- package/agent/extensions/pi-web-access/test/proxy-transport.test.mjs +286 -286
- package/agent/extensions/pi-web-access/test/query-rewrite.test.mjs +52 -52
- package/agent/extensions/pi-web-access/test/rsc-fallback.test.mjs +102 -102
- package/agent/extensions/pi-web-access/test/search-error-render.test.mjs +152 -152
- package/agent/extensions/pi-web-access/test/search-providers.test.mjs +274 -274
- package/agent/extensions/pi-web-access/test/source-check.test.mjs +179 -179
- package/agent/extensions/pi-web-access/test/ssrf-allow-ranges-config.test.mjs +205 -205
- package/agent/extensions/pi-web-access/test/ssrf-protection.test.mjs +456 -456
- package/agent/extensions/pi-web-access/test/summary-model-scope.test.mjs +106 -106
- package/agent/extensions/pi-web-access/test/tool-registration-config.test.mjs +182 -182
- package/agent/extensions/pi-web-access/test/web-search-answer-render.test.mjs +66 -66
- package/agent/extensions/pi-web-access/test/youtube-extract-errors.test.mjs +64 -64
- package/agent/extensions/pi-web-access/tsconfig.json +11 -11
- package/agent/extensions/pi-web-access/utils.ts +451 -451
- package/agent/extensions/pi-web-access/video-extract.ts +392 -392
- package/agent/extensions/pi-web-access/youtube-extract.ts +328 -328
- package/agent/extensions/shared/activity-status.ts +31 -31
- package/agent/extensions/shared/child-session.test.ts +270 -270
- package/agent/extensions/shared/child-session.ts +148 -148
- package/agent/extensions/shared/context-utilization.test.ts +48 -48
- package/agent/extensions/shared/context-utilization.ts +47 -47
- package/agent/extensions/shared/dashboard-state.ts +99 -99
- package/agent/extensions/shared/install.ps1 +27 -27
- package/agent/extensions/shared/install.sh +24 -24
- package/agent/extensions/shared/tool-call-timeout.test.ts +117 -117
- package/agent/extensions/shared/tool-call-timeout.ts +104 -104
- package/agent/extensions/skillsconf/README.md +74 -74
- package/agent/extensions/skillsconf/index.ts +92 -92
- package/agent/extensions/skillsconf/install.ps1 +27 -27
- package/agent/extensions/skillsconf/install.sh +24 -24
- package/agent/extensions/skillsconf/package-lock.json +1809 -1809
- package/agent/extensions/skillsconf/package.json +18 -18
- package/agent/extensions/skillsconf/src/delete-skill.test.ts +64 -64
- package/agent/extensions/skillsconf/src/delete-skill.ts +45 -45
- package/agent/extensions/skillsconf/src/filter.test.ts +80 -80
- package/agent/extensions/skillsconf/src/filter.ts +74 -74
- package/agent/extensions/skillsconf/src/fuzzy.ts +26 -26
- package/agent/extensions/skillsconf/src/persistence.test.ts +72 -72
- package/agent/extensions/skillsconf/src/persistence.ts +169 -169
- package/agent/extensions/skillsconf/src/ui/SkillConfView.test.ts +337 -337
- package/agent/extensions/skillsconf/src/ui/SkillConfView.ts +758 -758
- package/agent/extensions/skillsconf/src/ui/text-input.ts +91 -91
- package/agent/extensions/skillsconf/src/ui/tui-helpers.ts +144 -144
- package/agent/extensions/skillsconf/tsconfig.json +15 -15
- package/agent/extensions/statusline/index.ts +273 -282
- package/agent/extensions/statusline/install.ps1 +27 -27
- package/agent/extensions/statusline/install.sh +24 -24
- package/agent/extensions/subagents/by-the-way.test.ts +29 -29
- package/agent/extensions/subagents/claude.test.ts +119 -119
- package/agent/extensions/subagents/codex.test.ts +102 -102
- package/agent/extensions/subagents/context-usage.test.ts +107 -107
- package/agent/extensions/subagents/docs/design-plan.md +568 -568
- package/agent/extensions/subagents/docs/effect-v4-extension-guide.md +354 -354
- package/agent/extensions/subagents/docs/effect-v4-notes.md +571 -571
- package/agent/extensions/subagents/index.ts +779 -779
- package/agent/extensions/subagents/install.ps1 +27 -27
- package/agent/extensions/subagents/install.sh +24 -24
- package/agent/extensions/subagents/manager.test.ts +276 -276
- package/agent/extensions/subagents/package-lock.json +2244 -2244
- package/agent/extensions/subagents/package.json +19 -19
- package/agent/extensions/subagents/result-delivery.test.ts +27 -27
- package/agent/extensions/subagents/src/backend.ts +73 -73
- package/agent/extensions/subagents/src/backends/claude.ts +701 -701
- package/agent/extensions/subagents/src/backends/codex.ts +1060 -1060
- package/agent/extensions/subagents/src/backends/pi.ts +575 -575
- package/agent/extensions/subagents/src/backends/stub.ts +300 -300
- package/agent/extensions/subagents/src/by-the-way.ts +21 -21
- package/agent/extensions/subagents/src/domain.ts +253 -253
- package/agent/extensions/subagents/src/format.ts +74 -74
- package/agent/extensions/subagents/src/manager.ts +736 -736
- package/agent/extensions/subagents/src/prompt.ts +92 -92
- package/agent/extensions/subagents/src/result-delivery.ts +20 -20
- package/agent/extensions/subagents/src/runtime.ts +53 -53
- package/agent/extensions/subagents/src/ui/takeover.ts +583 -583
- package/agent/extensions/subagents/src/ui/transcript.ts +201 -201
- package/agent/extensions/subagents/takeover.test.ts +29 -29
- package/agent/extensions/subagents/tsconfig.json +7 -7
- package/agent/extensions/todo/AGENTS.md +38 -38
- package/agent/extensions/todo/LICENSE +21 -21
- package/agent/extensions/todo/config.ts +55 -55
- package/agent/extensions/todo/index.ts +151 -151
- package/agent/extensions/todo/install.ps1 +27 -27
- package/agent/extensions/todo/install.sh +24 -24
- package/agent/extensions/todo/locales/de.json +17 -17
- package/agent/extensions/todo/locales/en.json +15 -15
- package/agent/extensions/todo/locales/es.json +17 -17
- package/agent/extensions/todo/locales/fr.json +17 -17
- package/agent/extensions/todo/locales/pt-BR.json +17 -17
- package/agent/extensions/todo/locales/pt.json +17 -17
- package/agent/extensions/todo/locales/ru.json +17 -17
- package/agent/extensions/todo/locales/uk.json +17 -17
- package/agent/extensions/todo/locales/zh.json +17 -17
- package/agent/extensions/todo/package-lock.json +3358 -3358
- package/agent/extensions/todo/package.json +67 -67
- package/agent/extensions/todo/state/i18n-bridge.ts +64 -64
- package/agent/extensions/todo/state/invariants.ts +20 -20
- package/agent/extensions/todo/state/replay.ts +38 -38
- package/agent/extensions/todo/state/selectors.ts +107 -107
- package/agent/extensions/todo/state/state-reducer.ts +326 -326
- package/agent/extensions/todo/state/state.ts +18 -18
- package/agent/extensions/todo/state/store.ts +82 -82
- package/agent/extensions/todo/state/task-graph.ts +57 -57
- package/agent/extensions/todo/todo-overlay.ts +200 -200
- package/agent/extensions/todo/todo.ts +155 -155
- package/agent/extensions/todo/tool/response-envelope.ts +109 -109
- package/agent/extensions/todo/tool/types.ts +206 -206
- package/agent/extensions/todo/view/format.ts +177 -177
- package/agent/extensions/trim-context/README.md +54 -54
- package/agent/extensions/trim-context/index.ts +487 -487
- package/agent/extensions/trim-context/install.ps1 +27 -27
- package/agent/extensions/trim-context/install.sh +24 -24
- package/agent/keybindings.json +7 -7
- package/agent/version.txt +1 -1
- package/bin/kiln.js +20 -13
- package/package.json +1 -1
- package/agent/extensions/taste/index.ts +0 -443
- package/agent/extensions/taste/install.ps1 +0 -27
- package/agent/extensions/taste/install.sh +0 -24
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"plugins": [{ "name": "@effect/language-service" }]
|
|
5
|
-
},
|
|
6
|
-
"include": ["index.ts", "src/**/*.ts", "*.test.ts"]
|
|
7
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"plugins": [{ "name": "@effect/language-service" }]
|
|
5
|
+
},
|
|
6
|
+
"include": ["index.ts", "src/**/*.ts", "*.test.ts"]
|
|
7
|
+
}
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
# destructive
|
|
2
|
-
|
|
3
|
-
Asks before running destructive (deletion) commands.
|
|
4
|
-
|
|
5
|
-
## What it does
|
|
6
|
-
|
|
7
|
-
Intercepts `bash` / `powershell` tool calls and prompts:
|
|
8
|
-
|
|
9
|
-
```text
|
|
10
|
-
Do you want to allow pi to run:
|
|
11
|
-
{full-command}
|
|
12
|
-
|
|
13
|
-
1. Allow
|
|
14
|
-
2. Deny
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
Anything other than **Allow** — including Deny or dismissing with Esc —
|
|
18
|
-
blocks the command. In non-interactive mode (no UI) deletion commands are
|
|
19
|
-
blocked by default.
|
|
20
|
-
|
|
21
|
-
## Blocked commands
|
|
22
|
-
|
|
23
|
-
| Group | Matches |
|
|
24
|
-
|---|---|
|
|
25
|
-
| File deleters | `rm`, `rmdir`, `unlink`, `shred`, `del`, `erase`, `rd`, `remove-item`, `ri` (plus `sudo`/`doas` prefixes, full paths, compound commands split on `&&`, `\|\|`, `;`, `\|`, newlines) |
|
|
26
|
-
| Destructive git | `git rm`, `git branch -d/-D/--delete`, `git tag -d/--delete`, `git push -d/-D/--delete`, `git push <remote> :<branch>`, `git stash drop/clear`, `git clean` with `-f`, `git worktree remove`, `git notes remove/prune` |
|
|
27
|
-
|
|
28
|
-
## Files
|
|
29
|
-
|
|
30
|
-
- `index.ts` — `tool_call` hook, command matching (`isDestructiveCommand`), confirm prompt
|
|
31
|
-
- `README.md` — this file
|
|
1
|
+
# destructive
|
|
2
|
+
|
|
3
|
+
Asks before running destructive (deletion) commands.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
Intercepts `bash` / `powershell` tool calls and prompts:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
Do you want to allow pi to run:
|
|
11
|
+
{full-command}
|
|
12
|
+
|
|
13
|
+
1. Allow
|
|
14
|
+
2. Deny
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Anything other than **Allow** — including Deny or dismissing with Esc —
|
|
18
|
+
blocks the command. In non-interactive mode (no UI) deletion commands are
|
|
19
|
+
blocked by default.
|
|
20
|
+
|
|
21
|
+
## Blocked commands
|
|
22
|
+
|
|
23
|
+
| Group | Matches |
|
|
24
|
+
|---|---|
|
|
25
|
+
| File deleters | `rm`, `rmdir`, `unlink`, `shred`, `del`, `erase`, `rd`, `remove-item`, `ri` (plus `sudo`/`doas` prefixes, full paths, compound commands split on `&&`, `\|\|`, `;`, `\|`, newlines) |
|
|
26
|
+
| Destructive git | `git rm`, `git branch -d/-D/--delete`, `git tag -d/--delete`, `git push -d/-D/--delete`, `git push <remote> :<branch>`, `git stash drop/clear`, `git clean` with `-f`, `git worktree remove`, `git notes remove/prune` |
|
|
27
|
+
|
|
28
|
+
## Files
|
|
29
|
+
|
|
30
|
+
- `index.ts` — `tool_call` hook, command matching (`isDestructiveCommand`), confirm prompt
|
|
31
|
+
- `README.md` — this file
|
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* destructive - Asks before running destructive (deletion) commands.
|
|
3
|
-
*
|
|
4
|
-
* Intercepts `bash` / `powershell` tool calls and prompts:
|
|
5
|
-
*
|
|
6
|
-
* Do you want to allow pi to run:
|
|
7
|
-
* {full-command}
|
|
8
|
-
*
|
|
9
|
-
* 1. Allow
|
|
10
|
-
* 2. Deny
|
|
11
|
-
*
|
|
12
|
-
* Anything else (including Deny, or dismissing with Esc) blocks the command.
|
|
13
|
-
* In non-interactive mode (no UI) deletion commands are blocked by default.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
17
|
-
|
|
18
|
-
const FILE_DELETERS = new Set([
|
|
19
|
-
"rm",
|
|
20
|
-
"rmdir",
|
|
21
|
-
"unlink",
|
|
22
|
-
"shred",
|
|
23
|
-
"del",
|
|
24
|
-
"erase",
|
|
25
|
-
"rd",
|
|
26
|
-
"remove-item",
|
|
27
|
-
"ri",
|
|
28
|
-
]);
|
|
29
|
-
|
|
30
|
-
function isDestructiveGit(rest: string): boolean {
|
|
31
|
-
const args = rest.trim();
|
|
32
|
-
if (/^rm\b/.test(args)) return true;
|
|
33
|
-
if (/^branch\b.*(^|\s)(-[dD]|--delete)\b/.test(args)) return true;
|
|
34
|
-
if (/^tag\b.*(^|\s)(-d|--delete)\b/.test(args)) return true;
|
|
35
|
-
if (/^push\b.*(^|\s)(-[dD]|--delete)\b/.test(args)) return true;
|
|
36
|
-
if (/^push\b.*(^|\s)\S+:\S*(\s|$)/.test(args)) return true; // `git push origin :branch`
|
|
37
|
-
if (/^stash\b\s+(drop|clear)\b/.test(args)) return true;
|
|
38
|
-
if (/^clean\b/.test(args) && /(^|\s)-[a-zA-Z]*f/.test(args)) return true;
|
|
39
|
-
if (/^worktree\b\s+remove\b/.test(args)) return true;
|
|
40
|
-
if (/^notes\b.*\b(remove|prune)\b/.test(args)) return true;
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function isDestructiveSegment(segment: string): boolean {
|
|
45
|
-
let s = segment.trim().replace(/^[({]+|[)}]+$/g, "").trim();
|
|
46
|
-
if (!s) return false;
|
|
47
|
-
s = s.replace(/^(sudo|doas)\s+/i, "");
|
|
48
|
-
const m = s.match(/^([^\s]+)\s*(.*)$/s);
|
|
49
|
-
if (!m) return false;
|
|
50
|
-
const bin = m[1].split("/").pop()!.toLowerCase();
|
|
51
|
-
const rest = m[2] ?? "";
|
|
52
|
-
if (FILE_DELETERS.has(bin)) return true;
|
|
53
|
-
if (bin === "git") return isDestructiveGit(rest);
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function isDestructiveCommand(command: string): boolean {
|
|
58
|
-
return command.split(/&&|\|\||;|\||\n/).some(isDestructiveSegment);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export default function (pi: ExtensionAPI) {
|
|
62
|
-
pi.on("tool_call", async (event, ctx) => {
|
|
63
|
-
if (event.toolName !== "bash" && event.toolName !== "powershell") {
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const command = event.input.command as string | undefined;
|
|
68
|
-
if (!command || !isDestructiveCommand(command)) return undefined;
|
|
69
|
-
|
|
70
|
-
if (!ctx.hasUI) {
|
|
71
|
-
return {
|
|
72
|
-
block: true,
|
|
73
|
-
reason: `Blocked deletion command (no UI to confirm): ${command}`,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const choice = await ctx.ui.select(
|
|
78
|
-
`Do you want to allow pi to run:\n${command}`,
|
|
79
|
-
["1. Allow", "2. Deny"],
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
if (choice !== "1. Allow") {
|
|
83
|
-
return { block: true, reason: `User denied deletion command: ${command}` };
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return undefined;
|
|
87
|
-
});
|
|
88
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* destructive - Asks before running destructive (deletion) commands.
|
|
3
|
+
*
|
|
4
|
+
* Intercepts `bash` / `powershell` tool calls and prompts:
|
|
5
|
+
*
|
|
6
|
+
* Do you want to allow pi to run:
|
|
7
|
+
* {full-command}
|
|
8
|
+
*
|
|
9
|
+
* 1. Allow
|
|
10
|
+
* 2. Deny
|
|
11
|
+
*
|
|
12
|
+
* Anything else (including Deny, or dismissing with Esc) blocks the command.
|
|
13
|
+
* In non-interactive mode (no UI) deletion commands are blocked by default.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
17
|
+
|
|
18
|
+
const FILE_DELETERS = new Set([
|
|
19
|
+
"rm",
|
|
20
|
+
"rmdir",
|
|
21
|
+
"unlink",
|
|
22
|
+
"shred",
|
|
23
|
+
"del",
|
|
24
|
+
"erase",
|
|
25
|
+
"rd",
|
|
26
|
+
"remove-item",
|
|
27
|
+
"ri",
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
function isDestructiveGit(rest: string): boolean {
|
|
31
|
+
const args = rest.trim();
|
|
32
|
+
if (/^rm\b/.test(args)) return true;
|
|
33
|
+
if (/^branch\b.*(^|\s)(-[dD]|--delete)\b/.test(args)) return true;
|
|
34
|
+
if (/^tag\b.*(^|\s)(-d|--delete)\b/.test(args)) return true;
|
|
35
|
+
if (/^push\b.*(^|\s)(-[dD]|--delete)\b/.test(args)) return true;
|
|
36
|
+
if (/^push\b.*(^|\s)\S+:\S*(\s|$)/.test(args)) return true; // `git push origin :branch`
|
|
37
|
+
if (/^stash\b\s+(drop|clear)\b/.test(args)) return true;
|
|
38
|
+
if (/^clean\b/.test(args) && /(^|\s)-[a-zA-Z]*f/.test(args)) return true;
|
|
39
|
+
if (/^worktree\b\s+remove\b/.test(args)) return true;
|
|
40
|
+
if (/^notes\b.*\b(remove|prune)\b/.test(args)) return true;
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function isDestructiveSegment(segment: string): boolean {
|
|
45
|
+
let s = segment.trim().replace(/^[({]+|[)}]+$/g, "").trim();
|
|
46
|
+
if (!s) return false;
|
|
47
|
+
s = s.replace(/^(sudo|doas)\s+/i, "");
|
|
48
|
+
const m = s.match(/^([^\s]+)\s*(.*)$/s);
|
|
49
|
+
if (!m) return false;
|
|
50
|
+
const bin = m[1].split("/").pop()!.toLowerCase();
|
|
51
|
+
const rest = m[2] ?? "";
|
|
52
|
+
if (FILE_DELETERS.has(bin)) return true;
|
|
53
|
+
if (bin === "git") return isDestructiveGit(rest);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function isDestructiveCommand(command: string): boolean {
|
|
58
|
+
return command.split(/&&|\|\||;|\||\n/).some(isDestructiveSegment);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export default function (pi: ExtensionAPI) {
|
|
62
|
+
pi.on("tool_call", async (event, ctx) => {
|
|
63
|
+
if (event.toolName !== "bash" && event.toolName !== "powershell") {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const command = event.input.command as string | undefined;
|
|
68
|
+
if (!command || !isDestructiveCommand(command)) return undefined;
|
|
69
|
+
|
|
70
|
+
if (!ctx.hasUI) {
|
|
71
|
+
return {
|
|
72
|
+
block: true,
|
|
73
|
+
reason: `Blocked deletion command (no UI to confirm): ${command}`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const choice = await ctx.ui.select(
|
|
78
|
+
`Do you want to allow pi to run:\n${command}`,
|
|
79
|
+
["1. Allow", "2. Deny"],
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
if (choice !== "1. Allow") {
|
|
83
|
+
return { block: true, reason: `User denied deletion command: ${command}` };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return undefined;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
#!/usr/bin/env pwsh
|
|
2
|
-
# Per-extension installer — Windows / PowerShell
|
|
3
|
-
# Installs npm dependencies for this extension. No-op if no package.json.
|
|
4
|
-
$ErrorActionPreference = "Stop"
|
|
5
|
-
# Drop npm_config_allow_scripts inherited from a parent npm/npx process:
|
|
6
|
-
# npm >=11 rejects it for project installs (EALLOWSCRIPTS). File config still applies.
|
|
7
|
-
Remove-Item Env:\npm_config_allow_scripts -ErrorAction SilentlyContinue
|
|
8
|
-
Remove-Item Env:\NPM_CONFIG_ALLOW_SCRIPTS -ErrorAction SilentlyContinue
|
|
9
|
-
$extDir = $PSScriptRoot
|
|
10
|
-
if (-not $extDir) { $extDir = Split-Path -Parent $MyInvocation.MyCommand.Path }
|
|
11
|
-
if (-not (Test-Path "$extDir/package.json")) {
|
|
12
|
-
Write-Host " - no package.json — skipping" -ForegroundColor DarkGray
|
|
13
|
-
exit 0
|
|
14
|
-
}
|
|
15
|
-
if (-not (Get-Command npm -ErrorAction SilentlyContinue)) {
|
|
16
|
-
Write-Host " x npm not found — install Node.js 22+" -ForegroundColor Red
|
|
17
|
-
exit 1
|
|
18
|
-
}
|
|
19
|
-
if (Test-Path "$extDir/package-lock.json") {
|
|
20
|
-
Write-Host " - npm ci" -ForegroundColor DarkGray
|
|
21
|
-
npm --prefix $extDir ci --no-audit --no-fund
|
|
22
|
-
} else {
|
|
23
|
-
Write-Host " - npm install" -ForegroundColor DarkGray
|
|
24
|
-
npm --prefix $extDir install --no-audit --no-fund
|
|
25
|
-
}
|
|
26
|
-
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
27
|
-
Write-Host " + done" -ForegroundColor Green
|
|
1
|
+
#!/usr/bin/env pwsh
|
|
2
|
+
# Per-extension installer — Windows / PowerShell
|
|
3
|
+
# Installs npm dependencies for this extension. No-op if no package.json.
|
|
4
|
+
$ErrorActionPreference = "Stop"
|
|
5
|
+
# Drop npm_config_allow_scripts inherited from a parent npm/npx process:
|
|
6
|
+
# npm >=11 rejects it for project installs (EALLOWSCRIPTS). File config still applies.
|
|
7
|
+
Remove-Item Env:\npm_config_allow_scripts -ErrorAction SilentlyContinue
|
|
8
|
+
Remove-Item Env:\NPM_CONFIG_ALLOW_SCRIPTS -ErrorAction SilentlyContinue
|
|
9
|
+
$extDir = $PSScriptRoot
|
|
10
|
+
if (-not $extDir) { $extDir = Split-Path -Parent $MyInvocation.MyCommand.Path }
|
|
11
|
+
if (-not (Test-Path "$extDir/package.json")) {
|
|
12
|
+
Write-Host " - no package.json — skipping" -ForegroundColor DarkGray
|
|
13
|
+
exit 0
|
|
14
|
+
}
|
|
15
|
+
if (-not (Get-Command npm -ErrorAction SilentlyContinue)) {
|
|
16
|
+
Write-Host " x npm not found — install Node.js 22+" -ForegroundColor Red
|
|
17
|
+
exit 1
|
|
18
|
+
}
|
|
19
|
+
if (Test-Path "$extDir/package-lock.json") {
|
|
20
|
+
Write-Host " - npm ci" -ForegroundColor DarkGray
|
|
21
|
+
npm --prefix $extDir ci --no-audit --no-fund
|
|
22
|
+
} else {
|
|
23
|
+
Write-Host " - npm install" -ForegroundColor DarkGray
|
|
24
|
+
npm --prefix $extDir install --no-audit --no-fund
|
|
25
|
+
}
|
|
26
|
+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
27
|
+
Write-Host " + done" -ForegroundColor Green
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
#!/bin/sh
|
|
2
|
-
# Per-extension installer — macOS / Linux
|
|
3
|
-
# Installs npm dependencies for this extension. No-op if no package.json.
|
|
4
|
-
set -eu
|
|
5
|
-
# Drop npm_config_allow_scripts inherited from a parent npm/npx process:
|
|
6
|
-
# npm >=11 rejects it for project installs (EALLOWSCRIPTS). File config still applies.
|
|
7
|
-
unset npm_config_allow_scripts NPM_CONFIG_ALLOW_SCRIPTS 2>/dev/null || true
|
|
8
|
-
EXT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
9
|
-
if [ ! -f "$EXT_DIR/package.json" ]; then
|
|
10
|
-
echo " · no package.json — skipping"
|
|
11
|
-
exit 0
|
|
12
|
-
fi
|
|
13
|
-
if ! command -v npm >/dev/null 2>&1; then
|
|
14
|
-
echo " ✖ npm not found — install Node.js 22+" >&2
|
|
15
|
-
exit 1
|
|
16
|
-
fi
|
|
17
|
-
if [ -f "$EXT_DIR/package-lock.json" ]; then
|
|
18
|
-
echo " · npm ci"
|
|
19
|
-
npm --prefix "$EXT_DIR" ci --no-audit --no-fund
|
|
20
|
-
else
|
|
21
|
-
echo " · npm install"
|
|
22
|
-
npm --prefix "$EXT_DIR" install --no-audit --no-fund
|
|
23
|
-
fi
|
|
24
|
-
echo " ✓ done"
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Per-extension installer — macOS / Linux
|
|
3
|
+
# Installs npm dependencies for this extension. No-op if no package.json.
|
|
4
|
+
set -eu
|
|
5
|
+
# Drop npm_config_allow_scripts inherited from a parent npm/npx process:
|
|
6
|
+
# npm >=11 rejects it for project installs (EALLOWSCRIPTS). File config still applies.
|
|
7
|
+
unset npm_config_allow_scripts NPM_CONFIG_ALLOW_SCRIPTS 2>/dev/null || true
|
|
8
|
+
EXT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
9
|
+
if [ ! -f "$EXT_DIR/package.json" ]; then
|
|
10
|
+
echo " · no package.json — skipping"
|
|
11
|
+
exit 0
|
|
12
|
+
fi
|
|
13
|
+
if ! command -v npm >/dev/null 2>&1; then
|
|
14
|
+
echo " ✖ npm not found — install Node.js 22+" >&2
|
|
15
|
+
exit 1
|
|
16
|
+
fi
|
|
17
|
+
if [ -f "$EXT_DIR/package-lock.json" ]; then
|
|
18
|
+
echo " · npm ci"
|
|
19
|
+
npm --prefix "$EXT_DIR" ci --no-audit --no-fund
|
|
20
|
+
else
|
|
21
|
+
echo " · npm install"
|
|
22
|
+
npm --prefix "$EXT_DIR" install --no-audit --no-fund
|
|
23
|
+
fi
|
|
24
|
+
echo " ✓ done"
|