@herbertgao/pi-extensions 2026.9.5 → 2026.9.6
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 +3 -15
- package/node_modules/@herbertgao/sol-pi/docs/compatibility.md +1 -1
- package/node_modules/@herbertgao/sol-pi/package.json +1 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/index.ts +0 -5
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/state.ts +3 -1
- package/package.json +2 -7
- package/examples/pi-footer.json +0 -275
- package/node_modules/@czottmann/pi-automode/CHANGELOG.md +0 -70
- package/node_modules/@czottmann/pi-automode/LICENSE.md +0 -21
- package/node_modules/@czottmann/pi-automode/README.md +0 -215
- package/node_modules/@czottmann/pi-automode/docs/GLOSSARY.md +0 -39
- package/node_modules/@czottmann/pi-automode/docs/adr/ADR-001-permission-precedence-and-trust-boundaries.md +0 -46
- package/node_modules/@czottmann/pi-automode/docs/adr/ADR-002-global-config-in-extension-data-directory.md +0 -60
- package/node_modules/@czottmann/pi-automode/docs/adr/INDEX.md +0 -6
- package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +0 -428
- package/node_modules/@czottmann/pi-automode/docs/configuration.md +0 -171
- package/node_modules/@czottmann/pi-automode/docs/defaults.md +0 -178
- package/node_modules/@czottmann/pi-automode/docs/diagnostics.md +0 -90
- package/node_modules/@czottmann/pi-automode/docs/observability-logging.md +0 -160
- package/node_modules/@czottmann/pi-automode/examples/automode.local.json +0 -44
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/bash.ts +0 -692
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/classifier.ts +0 -852
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/config.ts +0 -904
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +0 -228
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +0 -954
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/hard-deny.ts +0 -429
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/log.ts +0 -173
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/model-selector.ts +0 -113
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/model.ts +0 -13
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/paths.ts +0 -297
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/permissions.ts +0 -623
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/state.ts +0 -102
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/transcript.ts +0 -236
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/types.ts +0 -205
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/utils.ts +0 -54
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode.ts +0 -26
- package/node_modules/@czottmann/pi-automode/package.json +0 -61
- package/node_modules/@czottmann/pi-automode/skills/automode-diagnostics/SKILL.md +0 -63
package/README.md
CHANGED
|
@@ -32,7 +32,6 @@ The package bundles 6 active `@herbertgao/*` child packages—`pi-bark`, `pi-cc-
|
|
|
32
32
|
- `pi-lens@4.1.3`
|
|
33
33
|
- `pi-web-access@0.27.0`
|
|
34
34
|
- `remote-pi@0.7.0`
|
|
35
|
-
- `@czottmann/pi-automode@1.15.0`
|
|
36
35
|
|
|
37
36
|
Pi loads their extensions and skills through `node_modules/` paths inside one package root. The upstream companions are pinned and bundled, not forked or renamed.
|
|
38
37
|
|
|
@@ -42,7 +41,7 @@ Pi loads their extensions and skills through `node_modules/` paths inside one pa
|
|
|
42
41
|
|
|
43
42
|
`@narumitw/pi-caffeinate@0.49.7` uses the host platform's sleep inhibitor during each Pi agent run. On macOS, `/caffeinate sleep` keeps the system awake while allowing the display to sleep; `/caffeinate display` also keeps the display awake. It releases the inhibitor when the run or session ends.
|
|
44
43
|
|
|
45
|
-
`@herbertgao/resume-from@0.2.0` keeps Claude Code sessions associated with their original repository when the active transcript later moves into a nested cwd. `@herbertgao/sol-pi@0.1.0` adds opt-in Action Fusion, ObservationPack, Evidence-Preserving Reducer, and Online Context Compact; see its [configuration guide](../sol-pi/docs/configuration.md). `pi-lens@4.1.3` expands language routing and bounds retained diagnostic facts across multi-root sessions. `pi-
|
|
44
|
+
`@herbertgao/resume-from@0.2.0` keeps Claude Code sessions associated with their original repository when the active transcript later moves into a nested cwd. `@herbertgao/sol-pi@0.1.0` adds opt-in Action Fusion, ObservationPack, Evidence-Preserving Reducer, and Online Context Compact; see its [configuration guide](../sol-pi/docs/configuration.md). `pi-lens@4.1.3` expands language routing and bounds retained diagnostic facts across multi-root sessions. `pi-web-access@0.27.0` adds configurable fetch deadlines and answer models plus isolated GitHub clone runtimes. Preferred Thinking 1.0.1 preserves an explicit subagent `--thinking` choice. Deprecated `@tifan/pi-titlebar-spinner` is no longer bundled; Rename remains the single owner of Herdr tab naming.
|
|
46
45
|
|
|
47
46
|
`pi-stash` is no longer bundled: `/btw` already preserves the main editor draft while handling side questions outside the main conversation. Prior `@herbertgao/pi-stash` releases remain available but are no longer maintained here.
|
|
48
47
|
|
|
@@ -52,18 +51,9 @@ If `pi-footer` was installed separately before upgrading to an aggregate release
|
|
|
52
51
|
pi remove npm:pi-footer@0.5.1
|
|
53
52
|
```
|
|
54
53
|
|
|
55
|
-
###
|
|
54
|
+
### Footer
|
|
56
55
|
|
|
57
|
-
`pi-footer` is enabled by the aggregate.
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
agent_dir="${PI_CODING_AGENT_DIR:-$HOME/.pi/agent}"
|
|
61
|
-
mkdir -p "$agent_dir/extensions"
|
|
62
|
-
cp "$agent_dir/npm/node_modules/@herbertgao/pi-extensions/examples/pi-footer.json" \
|
|
63
|
-
"$agent_dir/extensions/pi-footer.json"
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
The same copy is linked here as [`examples/pi-footer.json`](examples/pi-footer.json). The example preserves the native path, Git branch, session, token/context, model, and thinking information. It uses a gray `•` separator and shows Remote Pi/Subagents only when those extensions publish status. Restart Pi or run `/reload` after copying. Existing config is intentionally never overwritten automatically.
|
|
56
|
+
`pi-footer` is enabled by the aggregate. It preserves the native path, Git branch, session, token/context, model, and thinking information. Configure it in `$PI_CODING_AGENT_DIR/extensions/pi-footer.json`; use `/footer` for interactive changes. Only one footer-replacement extension should be enabled at a time.
|
|
67
57
|
|
|
68
58
|
For the intended compact status text, merge these optional companion settings into existing files rather than replacing the files:
|
|
69
59
|
|
|
@@ -84,8 +74,6 @@ For the intended compact status text, merge these optional companion settings in
|
|
|
84
74
|
}
|
|
85
75
|
```
|
|
86
76
|
|
|
87
|
-
The copy command replaces an existing `pi-footer.json`; review or back it up first. Only one footer-replacement extension should be enabled at a time. Use `/footer` for interactive changes.
|
|
88
|
-
|
|
89
77
|
Pi 0.84.1 or newer should use native `fullscreen` TUI mode.
|
|
90
78
|
|
|
91
79
|
### Hindsight memory server
|
|
@@ -21,7 +21,7 @@ Action Fusion decodes `file://` targets with Node's `fileURLToPath()` before res
|
|
|
21
21
|
|
|
22
22
|
The queue covers only fused operations registered by this SoL-Pi instance. External processes, direct built-in-tool calls outside the replacement, and unrelated extensions are not globally locked. SoL-Pi hashes the target immediately before launching `then_run` and skips the command if it observes an intervening content change.
|
|
23
23
|
|
|
24
|
-
When another extension already owns `write`, Action Fusion leaves that tool in place and only registers its `edit` replacement.
|
|
24
|
+
When another extension already owns `write`, Action Fusion leaves that tool in place and only registers its `edit` replacement.
|
|
25
25
|
|
|
26
26
|
## ObservationPack
|
|
27
27
|
|
|
@@ -80,11 +80,6 @@ export function createActionFusionExtension(options: ActionFusionOptions = {}):
|
|
|
80
80
|
const baseWrite = memoizeByCwd((cwd: string) => createWriteToolDefinition(cwd, options.writeOptions));
|
|
81
81
|
|
|
82
82
|
return (pi: ExtensionAPI) => {
|
|
83
|
-
// then_run executes Bash inside the mutation tool, so it cannot pass through
|
|
84
|
-
// Pi's public tool_call permission handlers. Leave it to automode instead of
|
|
85
|
-
// creating a nested shell escape hatch.
|
|
86
|
-
if (hasExternalToolOwner(pi, "automode_inspect")) return;
|
|
87
|
-
|
|
88
83
|
const editTemplate = baseEdit(process.cwd());
|
|
89
84
|
const writeTemplate = baseWrite(process.cwd());
|
|
90
85
|
|
package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/state.ts
CHANGED
|
@@ -180,7 +180,9 @@ export function recordCompaction(
|
|
|
180
180
|
return {
|
|
181
181
|
...state,
|
|
182
182
|
epoch: state.epoch + 1,
|
|
183
|
-
plan
|
|
183
|
+
// Keep the plan so the post-compaction rebuild does not reclassify
|
|
184
|
+
// already-completed steps as a new boundary.
|
|
185
|
+
plan: [...state.plan],
|
|
184
186
|
pendingProgress: [],
|
|
185
187
|
lastContextTokens: null,
|
|
186
188
|
positiveContextDeltaTotal: 0,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@herbertgao/pi-extensions",
|
|
3
|
-
"version": "2026.9.
|
|
3
|
+
"version": "2026.9.6",
|
|
4
4
|
"description": "Aggregate installer for HerbertGao-maintained Pi extensions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"extensions",
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
"directory": "packages/pi-extensions"
|
|
21
21
|
},
|
|
22
22
|
"files": [
|
|
23
|
-
"examples/pi-footer.json",
|
|
24
23
|
"README.md",
|
|
25
24
|
"LICENSE",
|
|
26
25
|
"THIRD_PARTY_NOTICES.md"
|
|
@@ -37,7 +36,6 @@
|
|
|
37
36
|
"dependencies": {
|
|
38
37
|
"@ast-grep/cli": "^0.45.0",
|
|
39
38
|
"@ast-grep/napi": "^0.45.0",
|
|
40
|
-
"@czottmann/pi-automode": "1.16.0",
|
|
41
39
|
"@dietrichgebert/ponytail": "4.10.0",
|
|
42
40
|
"@earendil-works/pi-coding-agent": "^0.84.4",
|
|
43
41
|
"@earendil-works/pi-tui": "^0.84.4",
|
|
@@ -45,7 +43,7 @@
|
|
|
45
43
|
"@herbertgao/pi-cc-extensions": "0.9.2",
|
|
46
44
|
"@herbertgao/pi-subagents": "0.17.1",
|
|
47
45
|
"@herbertgao/resume-from": "0.2.0",
|
|
48
|
-
"@herbertgao/sol-pi": "0.
|
|
46
|
+
"@herbertgao/sol-pi": "0.3.0",
|
|
49
47
|
"@juicesharp/rpiv-ask-user-question": "2.10.1",
|
|
50
48
|
"@juicesharp/rpiv-config": "^2.10.1",
|
|
51
49
|
"@luxusai/pi-hindsight": "0.12.0",
|
|
@@ -112,7 +110,6 @@
|
|
|
112
110
|
"web-tree-sitter": "0.25.10"
|
|
113
111
|
},
|
|
114
112
|
"bundledDependencies": [
|
|
115
|
-
"@czottmann/pi-automode",
|
|
116
113
|
"@dietrichgebert/ponytail",
|
|
117
114
|
"@herbertgao/pi-bark",
|
|
118
115
|
"@herbertgao/pi-cc-extensions",
|
|
@@ -167,7 +164,6 @@
|
|
|
167
164
|
"./node_modules/pi-web-access/index.ts",
|
|
168
165
|
"./node_modules/pi-antigravity/src/index.ts",
|
|
169
166
|
"./node_modules/remote-pi/dist/index.js",
|
|
170
|
-
"./node_modules/@czottmann/pi-automode/extensions/auto-mode.ts",
|
|
171
167
|
"./node_modules/pi-footer/src/index.ts"
|
|
172
168
|
],
|
|
173
169
|
"themes": [
|
|
@@ -175,7 +171,6 @@
|
|
|
175
171
|
"./node_modules/@herbertgao/pi-cc-extensions/themes/cc-light.json"
|
|
176
172
|
],
|
|
177
173
|
"skills": [
|
|
178
|
-
"./node_modules/@czottmann/pi-automode/skills",
|
|
179
174
|
"./node_modules/@dietrichgebert/ponytail/skills",
|
|
180
175
|
"./node_modules/@luxusai/pi-hindsight/skills",
|
|
181
176
|
"./node_modules/pi-mcp-adapter/skills",
|
package/examples/pi-footer.json
DELETED
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 1,
|
|
3
|
-
"enabled": true,
|
|
4
|
-
"preset": "pi-footer",
|
|
5
|
-
"lines": [
|
|
6
|
-
[
|
|
7
|
-
{
|
|
8
|
-
"id": "core-cwd",
|
|
9
|
-
"type": "cwd",
|
|
10
|
-
"enabled": true,
|
|
11
|
-
"options": {
|
|
12
|
-
"raw": true,
|
|
13
|
-
"fg": "pi:dim",
|
|
14
|
-
"cwdDisplayStyle": "full-home"
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"id": "core-branch",
|
|
19
|
-
"type": "git-branch",
|
|
20
|
-
"enabled": true,
|
|
21
|
-
"options": {
|
|
22
|
-
"raw": true,
|
|
23
|
-
"fg": "pi:dim",
|
|
24
|
-
"hideWhenEmpty": true,
|
|
25
|
-
"gitBranchDisplayStyle": "round-brackets"
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"id": "core-session",
|
|
30
|
-
"type": "session-name",
|
|
31
|
-
"enabled": true,
|
|
32
|
-
"options": {
|
|
33
|
-
"raw": true,
|
|
34
|
-
"fg": "pi:dim",
|
|
35
|
-
"hideWhenEmpty": true
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
],
|
|
39
|
-
[
|
|
40
|
-
{
|
|
41
|
-
"id": "core-tokens",
|
|
42
|
-
"type": "tokens",
|
|
43
|
-
"enabled": true,
|
|
44
|
-
"options": {
|
|
45
|
-
"raw": true,
|
|
46
|
-
"fg": "pi:dim",
|
|
47
|
-
"tokenFormatStyle": "compact"
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"id": "core-cache-read",
|
|
52
|
-
"type": "cache-read",
|
|
53
|
-
"enabled": true,
|
|
54
|
-
"options": {
|
|
55
|
-
"icon": "R",
|
|
56
|
-
"fg": "pi:dim",
|
|
57
|
-
"tokenFormatStyle": "compact",
|
|
58
|
-
"hideWhenZero": true
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
"id": "core-cache-write",
|
|
63
|
-
"type": "cache-write",
|
|
64
|
-
"enabled": true,
|
|
65
|
-
"options": {
|
|
66
|
-
"icon": "W",
|
|
67
|
-
"fg": "pi:dim",
|
|
68
|
-
"tokenFormatStyle": "compact",
|
|
69
|
-
"hideWhenZero": true
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
"id": "core-cache-hit",
|
|
74
|
-
"type": "cache-hit-rate",
|
|
75
|
-
"enabled": true,
|
|
76
|
-
"options": {
|
|
77
|
-
"icon": "CH",
|
|
78
|
-
"fg": "pi:dim",
|
|
79
|
-
"hideWhenZero": true,
|
|
80
|
-
"cacheHitSource": "turn"
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
"id": "core-cost",
|
|
85
|
-
"type": "cost",
|
|
86
|
-
"enabled": true,
|
|
87
|
-
"options": {
|
|
88
|
-
"raw": true,
|
|
89
|
-
"fg": "pi:dim",
|
|
90
|
-
"costFormatStyle": "compact",
|
|
91
|
-
"showSubscription": true
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
"id": "core-context",
|
|
96
|
-
"type": "context",
|
|
97
|
-
"enabled": true,
|
|
98
|
-
"options": {
|
|
99
|
-
"raw": true,
|
|
100
|
-
"fg": "pi:dim",
|
|
101
|
-
"contextConditionalColors": true,
|
|
102
|
-
"warningFg": "pi:warning",
|
|
103
|
-
"dangerFg": "pi:error"
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
"id": "core-context-slash",
|
|
108
|
-
"type": "separator",
|
|
109
|
-
"enabled": true,
|
|
110
|
-
"options": {
|
|
111
|
-
"separator": "custom",
|
|
112
|
-
"text": "/",
|
|
113
|
-
"fg": "pi:dim"
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
"id": "core-context-window",
|
|
118
|
-
"type": "context-window",
|
|
119
|
-
"enabled": true,
|
|
120
|
-
"options": {
|
|
121
|
-
"raw": true,
|
|
122
|
-
"fg": "pi:dim",
|
|
123
|
-
"contextConditionalColors": true,
|
|
124
|
-
"warningFg": "pi:warning",
|
|
125
|
-
"dangerFg": "pi:error",
|
|
126
|
-
"tokenFormatStyle": "compact"
|
|
127
|
-
}
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
"id": "core-flex",
|
|
131
|
-
"type": "flex-separator",
|
|
132
|
-
"enabled": true,
|
|
133
|
-
"options": {}
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
"id": "core-model",
|
|
137
|
-
"type": "model",
|
|
138
|
-
"enabled": true,
|
|
139
|
-
"options": {
|
|
140
|
-
"raw": true,
|
|
141
|
-
"fg": "pi:dim"
|
|
142
|
-
}
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
"id": "core-thinking",
|
|
146
|
-
"type": "thinking-level",
|
|
147
|
-
"enabled": true,
|
|
148
|
-
"options": {
|
|
149
|
-
"raw": true,
|
|
150
|
-
"fg": "pi:dim",
|
|
151
|
-
"hideWhenEmpty": true
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
],
|
|
155
|
-
[
|
|
156
|
-
{
|
|
157
|
-
"id": "status-mcp",
|
|
158
|
-
"type": "external-status",
|
|
159
|
-
"enabled": true,
|
|
160
|
-
"options": {
|
|
161
|
-
"externalStatusKey": "mcp",
|
|
162
|
-
"icon": "🔌 ",
|
|
163
|
-
"hideWhenEmpty": true
|
|
164
|
-
}
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
"id": "status-auto",
|
|
168
|
-
"type": "external-status",
|
|
169
|
-
"enabled": true,
|
|
170
|
-
"options": {
|
|
171
|
-
"externalStatusKey": "pi-automode",
|
|
172
|
-
"icon": "🤖 Auto ",
|
|
173
|
-
"trimValue": 2,
|
|
174
|
-
"preserveTrimStyles": true,
|
|
175
|
-
"hideWhenEmpty": true
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
],
|
|
179
|
-
[
|
|
180
|
-
{
|
|
181
|
-
"id": "status-lsp",
|
|
182
|
-
"type": "external-status",
|
|
183
|
-
"enabled": true,
|
|
184
|
-
"options": {
|
|
185
|
-
"externalStatusKey": "pi-lens-lsp",
|
|
186
|
-
"icon": "🧩 LSP ",
|
|
187
|
-
"trimValue": 4,
|
|
188
|
-
"preserveTrimStyles": true,
|
|
189
|
-
"hideWhenEmpty": true
|
|
190
|
-
}
|
|
191
|
-
},
|
|
192
|
-
{
|
|
193
|
-
"id": "status-ponytail",
|
|
194
|
-
"type": "external-status",
|
|
195
|
-
"enabled": true,
|
|
196
|
-
"options": {
|
|
197
|
-
"externalStatusKey": "ponytail",
|
|
198
|
-
"trimValue": 2,
|
|
199
|
-
"preserveTrimStyles": false,
|
|
200
|
-
"hideWhenEmpty": true
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
],
|
|
204
|
-
[
|
|
205
|
-
{
|
|
206
|
-
"id": "status-remote-session",
|
|
207
|
-
"type": "external-status",
|
|
208
|
-
"enabled": true,
|
|
209
|
-
"options": {
|
|
210
|
-
"externalStatusKey": "remote-pi:session",
|
|
211
|
-
"hideWhenEmpty": true
|
|
212
|
-
}
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
"id": "status-remote-relay",
|
|
216
|
-
"type": "external-status",
|
|
217
|
-
"enabled": true,
|
|
218
|
-
"options": {
|
|
219
|
-
"externalStatusKey": "remote-pi:relay",
|
|
220
|
-
"hideWhenEmpty": true
|
|
221
|
-
}
|
|
222
|
-
},
|
|
223
|
-
{
|
|
224
|
-
"id": "status-remote-peer",
|
|
225
|
-
"type": "external-status",
|
|
226
|
-
"enabled": true,
|
|
227
|
-
"options": {
|
|
228
|
-
"externalStatusKey": "remote-pi:peer-active",
|
|
229
|
-
"hideWhenEmpty": true
|
|
230
|
-
}
|
|
231
|
-
},
|
|
232
|
-
{
|
|
233
|
-
"id": "status-subagents",
|
|
234
|
-
"type": "external-status",
|
|
235
|
-
"enabled": true,
|
|
236
|
-
"options": {
|
|
237
|
-
"externalStatusKey": "subagents",
|
|
238
|
-
"icon": "👥 ",
|
|
239
|
-
"hideWhenEmpty": true
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
]
|
|
243
|
-
],
|
|
244
|
-
"separator": "dot",
|
|
245
|
-
"separatorFg": "brightBlack",
|
|
246
|
-
"separatorBg": "default",
|
|
247
|
-
"iconMode": "text",
|
|
248
|
-
"minimalist": false,
|
|
249
|
-
"terminal": {
|
|
250
|
-
"widthMode": "full",
|
|
251
|
-
"colorLevel": "ansi256"
|
|
252
|
-
},
|
|
253
|
-
"extensionStatusRow": {
|
|
254
|
-
"hiddenKeys": [
|
|
255
|
-
"mcp",
|
|
256
|
-
"pi-automode",
|
|
257
|
-
"pi-lens-lsp",
|
|
258
|
-
"ponytail",
|
|
259
|
-
"remote-pi:peer-active",
|
|
260
|
-
"remote-pi:relay",
|
|
261
|
-
"remote-pi:session",
|
|
262
|
-
"subagents"
|
|
263
|
-
],
|
|
264
|
-
"knownKeys": [
|
|
265
|
-
"mcp",
|
|
266
|
-
"pi-automode",
|
|
267
|
-
"pi-lens-lsp",
|
|
268
|
-
"ponytail",
|
|
269
|
-
"remote-pi:peer-active",
|
|
270
|
-
"remote-pi:relay",
|
|
271
|
-
"remote-pi:session",
|
|
272
|
-
"subagents"
|
|
273
|
-
]
|
|
274
|
-
}
|
|
275
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project are documented in this file.
|
|
4
|
-
|
|
5
|
-
## [Unreleased]
|
|
6
|
-
|
|
7
|
-
## [1.16.0] - 2026-09-07
|
|
8
|
-
|
|
9
|
-
## New features
|
|
10
|
-
|
|
11
|
-
- **[Bounded existing-file authorization](docs/defaults.md#soft_deny)** — Allow user authorization for pre-existing local-file changes that names task, worktree, path scope, and allowed operation. (#32)
|
|
12
|
-
|
|
13
|
-
## Bug fixes
|
|
14
|
-
|
|
15
|
-
- **OpenCode classifier routing** — Add OpenCode session headers to every classifier completion path. Preserve Pi's header precedence and exact host matching. (#35)
|
|
16
|
-
- **OMP 18 project trust compatibility** — Treat runtimes without `isProjectTrusted()` as untrusted. Prevent startup and configuration commands from throwing. (#34)
|
|
17
|
-
|
|
18
|
-
## [1.15.0] - 2026-08-28
|
|
19
|
-
|
|
20
|
-
## Bug fixes
|
|
21
|
-
|
|
22
|
-
- **OMP 18 classifier compatibility** — Support OMP 18 model registries that lack `complete()` and `getProvider()`. Load the legacy completion API only for these registries. Keep current Pi on its runtime registry path so extension-registered providers remain available. Thanks, @NarryG! (#29)
|
|
23
|
-
|
|
24
|
-
## [1.14.0] - 2026-08-27
|
|
25
|
-
|
|
26
|
-
## Bug fixes
|
|
27
|
-
|
|
28
|
-
- **Classifier stream timeout** — Apply `classifierTimeoutMs` to the full response stream. Provider behavior cannot keep classifier calls pending after the deadline. Parent cancellation remains active. Reject values above the Node.js timer limit. (#30)
|
|
29
|
-
- **OS temp-directory deletes** — Stop hard-denying recursive-delete subtrees under `os.tmpdir()` and `/tmp`. On macOS these resolve into `/private/tmp` and `/private/var/folders`, which matched the `/private` system root and blocked every temp cleanup. Deleting a temp root itself stays blocked. (#31)
|
|
30
|
-
- **Validated temp-root declarations** — Derive the exempt temp roots only from launcher-declared values that stay safe: reject values such as `/`, empty strings, aliases of `HOME`, `/`, or a system root, and ancestors of `HOME`. Without validation, a malformed `TMPDIR` could disable deterministic denials for protected targets, and a broad `permissions.allow` rule could then allow the action without classifier review. Recompute candidates when the effective tmpdir changes. (#31)
|
|
31
|
-
|
|
32
|
-
## [1.13.0] - 2026-08-25
|
|
33
|
-
|
|
34
|
-
## New features
|
|
35
|
-
|
|
36
|
-
- **Bash AST analysis** — Replace handwritten shell parsing with `unbash`. Permission and hard-deny checks now inspect command structure, nested commands, wrappers, redirects, and malformed input. Bash allow rules require complete structural coverage and fail closed when analysis is unsafe. (#26)
|
|
37
|
-
- **Extension-owned global config** — Store global settings at `~/.pi/agent/extensions/pi-automode/config.json`. Migrate the legacy file automatically, preserve a safe fallback after migration errors, and report conflicts through notifications and diagnostics. (#27)
|
|
38
|
-
|
|
39
|
-
## Bug fixes
|
|
40
|
-
|
|
41
|
-
- **Conservative permission rules** — Malformed deny and ask patterns block actions. Malformed patterns do not expand allow rules. Permission checks examine each Bash subcommand and normalize whitespace. Path checks resolve symlinks and normalize `file://` and Windows paths. (#22)
|
|
42
|
-
- **Recursive deletion hard-deny** — Detect uppercase flags and GNU abbreviations for recursive `rm`, including commands behind `command`, `exec`, and `env`. Parse the `--` delimiter and shell tilde expansion. Protect Linux and macOS system roots without blocking active-home subdirectories, `/opt`, or `/srv`. (#23)
|
|
43
|
-
- **Global Pi safety-control paths** — Hard-deny direct writes and edits to `~/.pi/agent/extensions/`, `~/.pi/agent/settings.json`, and `~/.pi/agent/settings/`. Resolve case variants and symlink targets before matching. (#24)
|
|
44
|
-
- **Case-insensitive protected paths** — Match protected paths without case distinctions and normalize Unicode spellings. This closes path bypasses on case-insensitive filesystems. (#25)
|
|
45
|
-
|
|
46
|
-
## [1.12.0] - 2026-08-23
|
|
47
|
-
|
|
48
|
-
## New features
|
|
49
|
-
|
|
50
|
-
- **Deterministic permission allows** — Add user-owned `permissions.allow` patterns that skip classifier review after deterministic checks pass. Accepted ask rules still require classifier review. Thank you, @sergeykonkin! (#14)
|
|
51
|
-
- **Configurable classifier request timeout** — new `autoMode.classifierTimeoutMs` setting. The default is 20000 ms. The timeout applies to each classifier request. The fast stage and the detailed stage each have their own budget. A request that exceeds the timeout is aborted. Auto mode fails closed and blocks the action.
|
|
52
|
-
- **Read-only agent diagnostics** — Add `automode_inspect` tool for status, configuration, defaults, and recent denial metadata. Thank you, @blalor! (#11)
|
|
53
|
-
|
|
54
|
-
## Bug fixes
|
|
55
|
-
|
|
56
|
-
- **Reject invalid config values** — Invalid boolean and log config values (e.g. `enabled: 0`, `log.enabled: 1`) are now rejected at merge time instead of being applied with diagnostics only. (#20)
|
|
57
|
-
- **Preserve defaults for malformed rule lists** — A malformed `hard_deny` entry like `[42]` no longer strips all built-in hard-deny rules. Malformed entries are rejected and defaults preserved conservatively. (#21)
|
|
58
|
-
- **Runtime classifier providers** — Dispatch classifier calls through Pi's runtime model registry so providers registered with `pi.registerProvider()` work immediately. Preserve normalized reasoning and header-only authentication on the temporary simple-completion bridge. (#15)
|
|
59
|
-
- **Bounded wildcard matching** — Replace regex-based permission and denied-path globs with a linear-time matcher. Reject oversized patterns and fail closed for oversized runtime inputs. (#19)
|
|
60
|
-
- **Complete classifier action input** — Send the exact current tool input to both classifier stages in a dedicated message. Block the action if it cannot fit without truncation. (#17)
|
|
61
|
-
- **Path policy normalization** — Use Pi-compatible resolution for file-tool paths, including file URLs, `@` and tilde aliases, and read fallback names. Enforce denied paths across omitted and recursive search scopes and both sides of symlink aliases. (#18)
|
|
62
|
-
- **Project config trust gate** — Ignore `.pi/automode.local.json` and `.pi/automode.json` until Pi trusts the project. Apply the trust gate during startup and config reloads. (#16)
|
|
63
|
-
- **In-memory observability logs** — Write logs to an extension-owned directory (`~/.pi/agent/extensions/pi-automode/logs/`) instead of the launching project directory. Thanks, @HerbertGao! (#13)
|
|
64
|
-
|
|
65
|
-
[Unreleased]: https://github.com/czottmann/pi-automode/compare/v1.16.0...HEAD
|
|
66
|
-
[1.16.0]: https://github.com/czottmann/pi-automode/compare/v1.15.0...v1.16.0
|
|
67
|
-
[1.15.0]: https://github.com/czottmann/pi-automode/compare/v1.14.0...v1.15.0
|
|
68
|
-
[1.14.0]: https://github.com/czottmann/pi-automode/compare/v1.13.0...v1.14.0
|
|
69
|
-
[1.13.0]: https://github.com/czottmann/pi-automode/compare/v1.12.0...v1.13.0
|
|
70
|
-
[1.12.0]: https://github.com/czottmann/pi-automode/compare/v1.11.0...v1.12.0
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Carlo Zottmann
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|