@code-yeongyu/senpi 2026.6.10 → 2026.6.12-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.
Files changed (197) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/README.md +18 -18
  3. package/dist/cli/startup-ui.d.ts +10 -0
  4. package/dist/cli/startup-ui.d.ts.map +1 -1
  5. package/dist/cli/startup-ui.js +72 -1
  6. package/dist/cli/startup-ui.js.map +1 -1
  7. package/dist/core/bash-executor.d.ts.map +1 -1
  8. package/dist/core/bash-executor.js +31 -7
  9. package/dist/core/bash-executor.js.map +1 -1
  10. package/dist/core/extensions/builtin/compaction/degradation-monitor.d.ts +0 -1
  11. package/dist/core/extensions/builtin/compaction/degradation-monitor.d.ts.map +1 -1
  12. package/dist/core/extensions/builtin/compaction/degradation-monitor.js +0 -1
  13. package/dist/core/extensions/builtin/compaction/degradation-monitor.js.map +1 -1
  14. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  15. package/dist/core/extensions/builtin/compaction/index.js +4 -4
  16. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  17. package/dist/core/extensions/builtin/compaction/policy.d.ts +0 -5
  18. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  19. package/dist/core/extensions/builtin/compaction/policy.js +0 -4
  20. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  21. package/dist/core/extensions/builtin/compaction/speculative.d.ts +0 -6
  22. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  23. package/dist/core/extensions/builtin/compaction/speculative.js +0 -3
  24. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  25. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts +1 -1
  26. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  27. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js +10 -2
  28. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  29. package/dist/core/extensions/builtin/permission-system/cli.d.ts +0 -3
  30. package/dist/core/extensions/builtin/permission-system/cli.d.ts.map +1 -1
  31. package/dist/core/extensions/builtin/permission-system/cli.js +0 -13
  32. package/dist/core/extensions/builtin/permission-system/cli.js.map +1 -1
  33. package/dist/core/extensions/types.d.ts +1 -0
  34. package/dist/core/extensions/types.d.ts.map +1 -1
  35. package/dist/core/extensions/types.js.map +1 -1
  36. package/dist/core/model-registry.d.ts +0 -3
  37. package/dist/core/model-registry.d.ts.map +1 -1
  38. package/dist/core/model-registry.js +1 -3
  39. package/dist/core/model-registry.js.map +1 -1
  40. package/dist/core/model-resolver.d.ts +1 -0
  41. package/dist/core/model-resolver.d.ts.map +1 -1
  42. package/dist/core/model-resolver.js +20 -5
  43. package/dist/core/model-resolver.js.map +1 -1
  44. package/dist/core/resolve-config-value.d.ts +0 -4
  45. package/dist/core/resolve-config-value.d.ts.map +1 -1
  46. package/dist/core/resolve-config-value.js +0 -15
  47. package/dist/core/resolve-config-value.js.map +1 -1
  48. package/dist/core/settings-manager.d.ts +6 -0
  49. package/dist/core/settings-manager.d.ts.map +1 -1
  50. package/dist/core/settings-manager.js +17 -0
  51. package/dist/core/settings-manager.js.map +1 -1
  52. package/dist/core/tools/edit-diff.d.ts +0 -5
  53. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  54. package/dist/core/tools/edit-diff.js +0 -7
  55. package/dist/core/tools/edit-diff.js.map +1 -1
  56. package/dist/core/tools/index.d.ts +0 -5
  57. package/dist/core/tools/index.d.ts.map +1 -1
  58. package/dist/core/tools/index.js +0 -67
  59. package/dist/core/tools/index.js.map +1 -1
  60. package/dist/core/tools/output-accumulator.d.ts +3 -5
  61. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  62. package/dist/core/tools/output-accumulator.js +38 -34
  63. package/dist/core/tools/output-accumulator.js.map +1 -1
  64. package/dist/core/tools/tail-window.d.ts +15 -0
  65. package/dist/core/tools/tail-window.d.ts.map +1 -0
  66. package/dist/core/tools/tail-window.js +75 -0
  67. package/dist/core/tools/tail-window.js.map +1 -0
  68. package/dist/main.d.ts.map +1 -1
  69. package/dist/main.js +8 -1
  70. package/dist/main.js.map +1 -1
  71. package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  72. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  73. package/dist/modes/interactive/components/first-time-setup.js +101 -0
  74. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  75. package/dist/modes/interactive/components/index.d.ts +1 -0
  76. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  77. package/dist/modes/interactive/components/index.js +1 -0
  78. package/dist/modes/interactive/components/index.js.map +1 -1
  79. package/dist/modes/interactive/components/tool-execution.d.ts +6 -0
  80. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  81. package/dist/modes/interactive/components/tool-execution.js +45 -0
  82. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  83. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  84. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  85. package/dist/modes/interactive/interactive-mode.js +12 -5
  86. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  87. package/dist/modes/interactive/theme/theme.d.ts +0 -4
  88. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  89. package/dist/modes/interactive/theme/theme.js +0 -7
  90. package/dist/modes/interactive/theme/theme.js.map +1 -1
  91. package/dist/modes/rpc/rpc-types.d.ts +0 -1
  92. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  93. package/dist/modes/rpc/rpc-types.js.map +1 -1
  94. package/docs/compaction-guide.md +9 -9
  95. package/docs/compaction.md +2 -2
  96. package/docs/containerization.md +22 -22
  97. package/docs/custom-provider.md +13 -13
  98. package/docs/development.md +4 -2
  99. package/docs/extensions.md +18 -19
  100. package/docs/index.md +4 -4
  101. package/docs/json.md +21 -15
  102. package/docs/keybindings.md +6 -3
  103. package/docs/models.md +6 -6
  104. package/docs/packages.md +11 -11
  105. package/docs/prompt-templates.md +2 -2
  106. package/docs/providers.md +9 -9
  107. package/docs/rpc.md +14 -13
  108. package/docs/sdk.md +13 -9
  109. package/docs/security.md +7 -7
  110. package/docs/session-format.md +4 -4
  111. package/docs/sessions.md +14 -14
  112. package/docs/settings.md +13 -11
  113. package/docs/skills.md +8 -8
  114. package/docs/terminal-setup.md +2 -2
  115. package/docs/termux.md +3 -3
  116. package/docs/tui.md +4 -4
  117. package/docs/usage.md +51 -58
  118. package/node_modules/@earendil-works/pi-agent-core/README.md +4 -3
  119. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts +0 -2
  120. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  121. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js +0 -4
  122. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  123. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +1 -1
  124. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  125. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  126. package/node_modules/@earendil-works/pi-ai/README.md +2 -4
  127. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts +0 -1
  128. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts.map +1 -1
  129. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js +0 -3
  130. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js.map +1 -1
  131. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  132. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +104 -454
  133. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  134. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +162 -475
  135. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  136. package/node_modules/@earendil-works/pi-ai/dist/models.js +12 -5
  137. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  138. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  139. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +11 -2
  140. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  141. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.d.ts +0 -4
  142. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  143. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.js +0 -13
  144. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.js.map +1 -1
  145. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts +0 -6
  146. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  147. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js +0 -14
  148. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js.map +1 -1
  149. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.d.ts +4 -1
  150. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  151. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js +54 -8
  152. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js.map +1 -1
  153. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts +0 -4
  154. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  155. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +0 -6
  156. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  157. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  158. package/node_modules/@earendil-works/pi-tui/README.md +1 -2
  159. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +2 -0
  160. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  161. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +80 -7
  162. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  163. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts +1 -0
  164. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
  165. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +72 -1
  166. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
  167. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +2 -2
  168. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  169. package/node_modules/@earendil-works/pi-tui/dist/index.js +2 -2
  170. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  171. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts +0 -1
  172. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
  173. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +4 -7
  174. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
  175. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts +1 -4
  176. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +1 -1
  177. package/node_modules/@earendil-works/pi-tui/dist/utils.js +1 -7
  178. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  179. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  180. package/npm-shrinkwrap.json +12 -12
  181. package/package.json +4 -4
  182. package/dist/core/experimental.d.ts +0 -2
  183. package/dist/core/experimental.d.ts.map +0 -1
  184. package/dist/core/experimental.js +0 -4
  185. package/dist/core/experimental.js.map +0 -1
  186. package/dist/core/extensions/builtin/compaction/overflow-detection.d.ts +0 -11
  187. package/dist/core/extensions/builtin/compaction/overflow-detection.d.ts.map +0 -1
  188. package/dist/core/extensions/builtin/compaction/overflow-detection.js +0 -40
  189. package/dist/core/extensions/builtin/compaction/overflow-detection.js.map +0 -1
  190. package/dist/core/extensions/builtin/system-messages.d.ts +0 -47
  191. package/dist/core/extensions/builtin/system-messages.d.ts.map +0 -1
  192. package/dist/core/extensions/builtin/system-messages.js +0 -117
  193. package/dist/core/extensions/builtin/system-messages.js.map +0 -1
  194. package/dist/core/index.d.ts +0 -13
  195. package/dist/core/index.d.ts.map +0 -1
  196. package/dist/core/index.js +0 -13
  197. package/dist/core/index.js.map +0 -1
package/docs/packages.md CHANGED
@@ -26,14 +26,14 @@ senpi install https://github.com/user/repo # raw URLs work too
26
26
  senpi install /absolute/path/to/package
27
27
  senpi install ./relative/path/to/package
28
28
 
29
- pi remove npm:@foo/bar
30
- pi list # show installed packages from settings
31
- pi update # update pi, update packages, and reconcile pinned git refs
32
- pi update --extensions # update packages and reconcile pinned git refs only
33
- pi update --self # update pi only
34
- pi update --self --force # reinstall pi even if current
35
- pi update npm:@foo/bar # update one package
36
- pi update --extension npm:@foo/bar
29
+ senpi remove npm:@foo/bar
30
+ senpi list # show installed packages from settings
31
+ senpi update # update senpi, update packages, and reconcile pinned git refs
32
+ senpi update --extensions # update packages and reconcile pinned git refs only
33
+ senpi update --self # update senpi only
34
+ senpi update --self --force # reinstall senpi even if current
35
+ senpi update npm:@foo/bar # update one package
36
+ senpi update --extension npm:@foo/bar
37
37
  ```
38
38
 
39
39
  These commands manage senpi packages, not the senpi CLI installation. To uninstall senpi itself, see [Quickstart](quickstart.md#uninstall).
@@ -43,8 +43,8 @@ By default, `install` and `remove` write to global settings (`~/.senpi/agent/set
43
43
  To try a package without installing it, use `--extension` or `-e`. This installs to a temporary directory for the current run only:
44
44
 
45
45
  ```bash
46
- pi -e npm:@foo/bar
47
- pi -e git:github.com/user/repo
46
+ senpi -e npm:@foo/bar
47
+ senpi -e git:github.com/user/repo
48
48
  ```
49
49
 
50
50
  ## Package Sources
@@ -58,7 +58,7 @@ npm:@scope/pkg@1.2.3
58
58
  npm:pkg
59
59
  ```
60
60
 
61
- - Versioned specs are pinned and skipped by package updates (`pi update`, `pi update --extensions`).
61
+ - Versioned specs are pinned and skipped by package updates (`senpi update`, `senpi update --extensions`).
62
62
  - Global installs use `npm install -g`.
63
63
  - Project installs go under `.senpi/npm/`.
64
64
  - Set `npmCommand` in `settings.json` to pin npm package lookup and install operations to a specific wrapper command such as `mise` or `asdf`.
@@ -1,4 +1,4 @@
1
- > pi can create prompt templates. Ask it to build one for your workflow.
1
+ > senpi can create prompt templates. Ask it to build one for your workflow.
2
2
 
3
3
  # Prompt Templates
4
4
 
@@ -6,7 +6,7 @@ Prompt templates are Markdown snippets that expand into full prompts. Type `/nam
6
6
 
7
7
  ## Locations
8
8
 
9
- Pi loads prompt templates from:
9
+ Senpi loads prompt templates from:
10
10
 
11
11
  - Global: `~/.senpi/agent/prompts/*.md`
12
12
  - Project: `.senpi/prompts/*.md` (only after the project is trusted)
package/docs/providers.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Providers
2
2
 
3
- Pi supports subscription-based providers via OAuth and API key providers via environment variables or auth file. For each provider, pi knows all available models. The list is updated with every pi release.
3
+ Senpi supports subscription-based providers via OAuth and API key providers via environment variables or auth file. For each provider, senpi knows all available models. The list is updated with every senpi release.
4
4
 
5
5
  ## Table of Contents
6
6
 
@@ -43,7 +43,7 @@ Use `/login` in interactive mode and select a provider to store an API key in `a
43
43
 
44
44
  ```bash
45
45
  export ANTHROPIC_API_KEY=sk-ant-...
46
- pi
46
+ senpi
47
47
  ```
48
48
 
49
49
  | Provider | Environment Variable | `auth.json` key |
@@ -78,7 +78,7 @@ pi
78
78
  | Xiaomi MiMo Token Plan (Amsterdam) | `XIAOMI_TOKEN_PLAN_AMS_API_KEY` | `xiaomi-token-plan-ams` |
79
79
  | Xiaomi MiMo Token Plan (Singapore) | `XIAOMI_TOKEN_PLAN_SGP_API_KEY` | `xiaomi-token-plan-sgp` |
80
80
 
81
- Reference for environment variables and `auth.json` keys: [`const envMap`](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/env-api-keys.ts) in [`packages/ai/src/env-api-keys.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/env-api-keys.ts).
81
+ Reference for environment variables and `auth.json` keys: [`const envMap`](https://github.com/code-yeongyu/senpi/blob/main/packages/ai/src/env-api-keys.ts) in [`packages/ai/src/env-api-keys.ts`](https://github.com/code-yeongyu/senpi/blob/main/packages/ai/src/env-api-keys.ts).
82
82
 
83
83
  #### Auth File
84
84
 
@@ -169,14 +169,14 @@ export AWS_REGION=us-west-2
169
169
  Also supports ECS task roles (`AWS_CONTAINER_CREDENTIALS_*`) and IRSA (`AWS_WEB_IDENTITY_TOKEN_FILE`).
170
170
 
171
171
  ```bash
172
- pi --provider amazon-bedrock --model us.anthropic.claude-sonnet-4-20250514-v1:0
172
+ senpi --provider amazon-bedrock --model us.anthropic.claude-sonnet-4-20250514-v1:0
173
173
  ```
174
174
 
175
175
  Prompt caching is enabled automatically for Claude models whose ID contains a recognizable model name (base models and system-defined inference profiles). For application inference profiles (whose ARNs don't contain the model name), set `AWS_BEDROCK_FORCE_CACHE=1` to enable cache points:
176
176
 
177
177
  ```bash
178
178
  export AWS_BEDROCK_FORCE_CACHE=1
179
- pi --provider amazon-bedrock --model arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123
179
+ senpi --provider amazon-bedrock --model arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123
180
180
  ```
181
181
 
182
182
  If you are connecting to a Bedrock API proxy, the following environment variables can be used:
@@ -200,7 +200,7 @@ export AWS_BEDROCK_FORCE_HTTP1=1
200
200
  export CLOUDFLARE_API_KEY=... # or use /login
201
201
  export CLOUDFLARE_ACCOUNT_ID=...
202
202
  export CLOUDFLARE_GATEWAY_ID=... # create at dash.cloudflare.com → AI → AI Gateway
203
- pi --provider cloudflare-ai-gateway --model "claude-sonnet-4-5"
203
+ senpi --provider cloudflare-ai-gateway --model "claude-sonnet-4-5"
204
204
  ```
205
205
 
206
206
  Routes to OpenAI, Anthropic, and Workers AI through Cloudflare AI Gateway. Workers AI uses the Unified API (`/compat`) and prefixed model IDs (`workers-ai/@cf/...`). OpenAI uses the OpenAI passthrough route (`/openai`) with native OpenAI model IDs such as `gpt-5.1`. Anthropic uses the Anthropic passthrough route (`/anthropic`) with native Anthropic model IDs such as `claude-sonnet-4-5`.
@@ -214,7 +214,7 @@ AI Gateway authentication uses `CLOUDFLARE_API_KEY` as `cf-aig-authorization`. U
214
214
  | Stored BYOK | Cloudflare token only | Cloudflare injects provider keys stored in the AI Gateway dashboard |
215
215
  | Inline BYOK | Cloudflare token plus upstream `Authorization` header | The request supplies the upstream provider key |
216
216
 
217
- For normal pi usage, prefer unified billing or stored BYOK. Inline BYOK requires configuring an additional upstream `Authorization` header for the Cloudflare AI Gateway provider, for example via a `models.json` provider/model override.
217
+ For normal senpi usage, prefer unified billing or stored BYOK. Inline BYOK requires configuring an additional upstream `Authorization` header for the Cloudflare AI Gateway provider, for example via a `models.json` provider/model override.
218
218
 
219
219
  ### Cloudflare Workers AI
220
220
 
@@ -223,10 +223,10 @@ For normal pi usage, prefer unified billing or stored BYOK. Inline BYOK requires
223
223
  ```bash
224
224
  export CLOUDFLARE_API_KEY=... # or use /login
225
225
  export CLOUDFLARE_ACCOUNT_ID=...
226
- pi --provider cloudflare-workers-ai --model "@cf/moonshotai/kimi-k2.6"
226
+ senpi --provider cloudflare-workers-ai --model "@cf/moonshotai/kimi-k2.6"
227
227
  ```
228
228
 
229
- Pi automatically sets `x-session-affinity` for [prefix caching](https://developers.cloudflare.com/workers-ai/features/prompt-caching/) discounts.
229
+ Senpi automatically sets `x-session-affinity` for [prefix caching](https://developers.cloudflare.com/workers-ai/features/prompt-caching/) discounts.
230
230
 
231
231
  ### Google Vertex AI
232
232
 
package/docs/rpc.md CHANGED
@@ -7,7 +7,7 @@ RPC mode enables headless operation of the coding agent via a JSON protocol over
7
7
  ## Starting RPC Mode
8
8
 
9
9
  ```bash
10
- pi --mode rpc [options]
10
+ senpi --mode rpc [options]
11
11
  ```
12
12
 
13
13
  Common options:
@@ -695,7 +695,7 @@ Response:
695
695
  }
696
696
  ```
697
697
 
698
- The current session name is available via `get_state` in the `sessionName` field. To set the initial name when starting RPC mode, pass `--name <name>` or `-n <name>` to the `pi --mode rpc` process.
698
+ The current session name is available via `get_state` in the `sessionName` field. To set the initial name when starting RPC mode, pass `--name <name>` or `-n <name>` to the `senpi --mode rpc` process.
699
699
 
700
700
  ### Commands
701
701
 
@@ -715,9 +715,9 @@ Response:
715
715
  "success": true,
716
716
  "data": {
717
717
  "commands": [
718
- {"name": "session-name", "description": "Set or clear session name", "source": "extension", "path": "/home/user/.senpi/agent/extensions/session.ts"},
719
- {"name": "fix-tests", "description": "Fix failing tests", "source": "prompt", "location": "project", "path": "/home/user/myproject/.senpi/agent/prompts/fix-tests.md"},
720
- {"name": "skill:brave-search", "description": "Web search via Brave API", "source": "skill", "location": "user", "path": "/home/user/.senpi/agent/skills/brave-search/SKILL.md"}
718
+ {"name": "session-name", "description": "Set or clear session name", "source": "extension", "sourceInfo": {"path": "/home/user/.senpi/agent/extensions/session.ts", "source": "auto", "scope": "user", "origin": "top-level"}},
719
+ {"name": "fix-tests", "description": "Fix failing tests", "source": "prompt", "sourceInfo": {"path": "/home/user/myproject/.senpi/prompts/fix-tests.md", "source": "auto", "scope": "project", "origin": "top-level"}},
720
+ {"name": "skill:brave-search", "description": "Web search via Brave API", "source": "skill", "sourceInfo": {"path": "/home/user/.senpi/agent/skills/brave-search/SKILL.md", "source": "auto", "scope": "user", "origin": "top-level"}}
721
721
  ]
722
722
  }
723
723
  }
@@ -730,11 +730,12 @@ Each command has:
730
730
  - `"extension"`: Registered via `pi.registerCommand()` in an extension
731
731
  - `"prompt"`: Loaded from a prompt template `.md` file
732
732
  - `"skill"`: Loaded from a skill directory (name is prefixed with `skill:`)
733
- - `location`: Where it was loaded from (optional, not present for extensions):
734
- - `"user"`: User-level (`~/.senpi/agent/`)
735
- - `"project"`: Project-level (`./.senpi/agent/`)
736
- - `"path"`: Explicit path via CLI or settings
737
- - `path`: Absolute file path to the command source (optional)
733
+ - `sourceInfo`: Provenance metadata for the owning resource (present for all sources, including extensions):
734
+ - `path`: Absolute file path to the command source
735
+ - `source`: Source identifier string (for example `"auto"` for auto-discovered locations, `"local"` for settings entries, `"cli"` for CLI paths, `"builtin"`, `"sdk"`, or a package source)
736
+ - `scope`: `"user"`, `"project"`, or `"temporary"`
737
+ - `origin`: `"package"` or `"top-level"`
738
+ - `baseDir`: Base directory of the owning resource (optional)
738
739
 
739
740
  **Note**: Built-in TUI commands (`/settings`, `/hotkeys`, etc.) are not included. They are handled only in interactive mode and would not execute if sent via `prompt`.
740
741
 
@@ -1133,7 +1134,7 @@ Set the terminal window/tab title. Fire-and-forget.
1133
1134
  "type": "extension_ui_request",
1134
1135
  "id": "uuid-8",
1135
1136
  "method": "setTitle",
1136
- "title": "pi - my project"
1137
+ "title": "senpi - my project"
1137
1138
  }
1138
1139
  ```
1139
1140
 
@@ -1320,7 +1321,7 @@ import subprocess
1320
1321
  import json
1321
1322
 
1322
1323
  proc = subprocess.Popen(
1323
- ["pi", "--mode", "rpc", "--no-session"],
1324
+ ["senpi", "--mode", "rpc", "--no-session"],
1324
1325
  stdin=subprocess.PIPE,
1325
1326
  stdout=subprocess.PIPE,
1326
1327
  text=True
@@ -1359,7 +1360,7 @@ For a complete example of handling the extension UI protocol, see [`examples/rpc
1359
1360
  const { spawn } = require("child_process");
1360
1361
  const { StringDecoder } = require("string_decoder");
1361
1362
 
1362
- const agent = spawn("pi", ["--mode", "rpc", "--no-session"]);
1363
+ const agent = spawn("senpi", ["--mode", "rpc", "--no-session"]);
1363
1364
 
1364
1365
  function attachJsonlReader(stream, onLine) {
1365
1366
  const decoder = new StringDecoder("utf8");
package/docs/sdk.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # SDK
4
4
 
5
- The SDK provides programmatic access to pi's agent capabilities. Use it to embed senpi in other applications, build custom interfaces, or integrate with automated workflows.
5
+ The SDK provides programmatic access to senpi's agent capabilities. Use it to embed senpi in other applications, build custom interfaces, or integrate with automated workflows.
6
6
 
7
7
  **Example use cases:**
8
8
  - Build a custom UI (web, desktop, mobile)
@@ -209,7 +209,7 @@ await session.prompt("What files are here?");
209
209
 
210
210
  // With images
211
211
  await session.prompt("What's in this image?", {
212
- images: [{ type: "image", source: { type: "base64", mediaType: "image/png", data: "..." } }]
212
+ images: [{ type: "image", data: "base64-encoded-data", mimeType: "image/png" }]
213
213
  });
214
214
 
215
215
  // During streaming: must specify how to queue the message
@@ -473,7 +473,7 @@ Specify which built-in tools to enable:
473
473
  - `noTools: "builtin"` disables default built-ins while keeping extension and custom tools enabled
474
474
  - `excludeTools` disables specific built-in, extension, or custom tool names after any `tools` allowlist is applied
475
475
 
476
- The `edit` tool returns `details.diff` for Pi's TUI display and `details.patch` as a standard unified patch for SDK consumers.
476
+ The `edit` tool returns `details.diff` for senpi's TUI display and `details.patch` as a standard unified patch for SDK consumers.
477
477
 
478
478
  ```typescript
479
479
  import { createAgentSession } from "@code-yeongyu/senpi";
@@ -600,6 +600,7 @@ eventBus.on("my-extension:status", (data) => console.log(data));
600
600
  ```typescript
601
601
  import {
602
602
  createAgentSession,
603
+ createSyntheticSourceInfo,
603
604
  DefaultResourceLoader,
604
605
  type Skill,
605
606
  } from "@code-yeongyu/senpi";
@@ -609,7 +610,8 @@ const customSkill: Skill = {
609
610
  description: "Custom instructions",
610
611
  filePath: "/path/to/SKILL.md",
611
612
  baseDir: "/path/to",
612
- source: "custom",
613
+ sourceInfo: createSyntheticSourceInfo("/path/to/SKILL.md", { source: "sdk" }),
614
+ disableModelInvocation: false,
613
615
  };
614
616
 
615
617
  const loader = new DefaultResourceLoader({
@@ -650,6 +652,7 @@ const { session } = await createAgentSession({ resourceLoader: loader });
650
652
  ```typescript
651
653
  import {
652
654
  createAgentSession,
655
+ createSyntheticSourceInfo,
653
656
  DefaultResourceLoader,
654
657
  type PromptTemplate,
655
658
  } from "@code-yeongyu/senpi";
@@ -657,7 +660,8 @@ import {
657
660
  const customCommand: PromptTemplate = {
658
661
  name: "deploy",
659
662
  description: "Deploy the application",
660
- source: "(custom)",
663
+ filePath: "/virtual/prompts/deploy.md",
664
+ sourceInfo: createSyntheticSourceInfo("/virtual/prompts/deploy.md", { source: "sdk" }),
661
665
  content: "# Deploy\n\n1. Build\n2. Test\n3. Deploy",
662
666
  };
663
667
 
@@ -714,7 +718,7 @@ const { session: opened } = await createAgentSession({
714
718
 
715
719
  // List sessions
716
720
  const currentProjectSessions = await SessionManager.list(process.cwd());
717
- const allSessions = await SessionManager.listAll(process.cwd());
721
+ const allSessions = await SessionManager.listAll(); // All sessions across all projects
718
722
 
719
723
  // Session replacement API for /new, /resume, /fork, /clone, and import flows.
720
724
  const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
@@ -756,12 +760,12 @@ const sm = SessionManager.open("/path/to/session.jsonl");
756
760
 
757
761
  // Session listing
758
762
  const currentProjectSessions = await SessionManager.list(process.cwd());
759
- const allSessions = await SessionManager.listAll(process.cwd());
763
+ const allSessions = await SessionManager.listAll(); // All sessions across all projects
760
764
 
761
765
  // Tree traversal
762
766
  const entries = sm.getEntries(); // All entries (excludes header)
763
767
  const tree = sm.getTree(); // Full tree structure
764
- const path = sm.getPath(); // Path from root to current leaf
768
+ const branch = sm.getBranch(); // Entries from root to current leaf
765
769
  const leaf = sm.getLeafEntry(); // Current leaf entry
766
770
  const entry = sm.getEntry(id); // Get entry by ID
767
771
  const children = sm.getChildren(id); // Direct children of entry
@@ -1076,7 +1080,7 @@ See [RPC documentation](rpc.md) for the JSON protocol.
1076
1080
  For subprocess-based integration without building with the SDK, use the CLI directly:
1077
1081
 
1078
1082
  ```bash
1079
- pi --mode rpc --no-session
1083
+ senpi --mode rpc --no-session
1080
1084
  ```
1081
1085
 
1082
1086
  See [RPC documentation](rpc.md) for the JSON protocol.
package/docs/security.md CHANGED
@@ -8,15 +8,15 @@ Project trust controls whether pi loads project-local settings, resources, packa
8
8
 
9
9
  Pi considers a project to have trust inputs when it finds any of these from the current working directory:
10
10
 
11
- - `.pi/` in the current directory
11
+ - `.senpi/` in the current directory
12
12
  - `.agents/skills` in the current directory or an ancestor directory
13
13
 
14
- When an interactive session starts in a project with configs in `.pi` or `.agents/skills` and no saved decision for the current directory or a parent directory, pi follows `defaultProjectTrust` from global settings. The default value is `"ask"`, which asks whether to trust the project when UI is available. Saved decisions are stored by canonical directory in `~/.pi/agent/trust.json`, and the closest saved decision on the current or parent path applies before the global default.
14
+ When an interactive session starts in a project with configs in `.senpi` or `.agents/skills` and no saved decision for the current directory or a parent directory, pi follows `defaultProjectTrust` from global settings. The default value is `"ask"`, which asks whether to trust the project when UI is available. Saved decisions are stored by canonical directory in `~/.senpi/agent/trust.json`, and the closest saved decision on the current or parent path applies before the global default.
15
15
 
16
16
  Trusting a project allows pi to load trust-gated project inputs, including:
17
17
 
18
- - `.pi/settings.json`
19
- - `.pi` resources such as extensions, skills, prompt templates, themes, and system prompt files
18
+ - `.senpi/settings.json`
19
+ - `.senpi` resources such as extensions, skills, prompt templates, themes, and system prompt files
20
20
  - missing project packages configured through project settings
21
21
  - project-local extensions and project package-managed extensions
22
22
 
@@ -38,10 +38,10 @@ For untrusted repositories, generated code you do not intend to monitor closely,
38
38
 
39
39
  Common patterns are documented in [Containerization](containerization.md):
40
40
 
41
- - run the whole `pi` process inside OpenShell or Docker
42
- - run host pi while routing built-in tool execution into a Gondolin micro-VM
41
+ - run the whole `senpi` process inside OpenShell or Docker
42
+ - run host senpi while routing built-in tool execution into a Gondolin micro-VM
43
43
  - mount only the workspace paths the agent should access
44
- - avoid mounting host `~/.pi/agent` unless the container should access host sessions, settings, and credentials
44
+ - avoid mounting host `~/.senpi/agent` unless the container should access host sessions, settings, and credentials
45
45
  - pass the minimum required API keys or use short-lived credentials
46
46
  - restrict network access when the task does not need it
47
47
  - review diffs and outputs before copying results back to trusted systems
@@ -14,7 +14,7 @@ Where `<path>` is the working directory with `/` replaced by `-`.
14
14
 
15
15
  Sessions can be removed by deleting their `.jsonl` files under `~/.senpi/agent/sessions/`.
16
16
 
17
- Pi also supports deleting sessions interactively from `/resume` (select a session and press `Ctrl+D`, then confirm). When available, senpi uses the `trash` CLI to avoid permanent deletion.
17
+ Senpi also supports deleting sessions interactively from `/resume` (select a session and press `Ctrl+D`, then confirm). When available, senpi uses the `trash` CLI to avoid permanent deletion.
18
18
 
19
19
  ## Session Version
20
20
 
@@ -116,7 +116,7 @@ interface Usage {
116
116
  }
117
117
  ```
118
118
 
119
- ### Extended Message Types (from pi-coding-agent)
119
+ ### Extended Message Types (from @code-yeongyu/senpi)
120
120
 
121
121
  ```typescript
122
122
  interface BashExecutionMessage {
@@ -233,7 +233,7 @@ Created when context is compacted. Stores a summary of earlier messages.
233
233
 
234
234
  Optional fields:
235
235
  - `details`: Implementation-specific data (e.g., `{ readFiles: string[], modifiedFiles: string[] }` for default, or custom data for extensions)
236
- - `fromHook`: `true` if generated by an extension, `false`/`undefined` if pi-generated (legacy field name)
236
+ - `fromHook`: `true` if generated by an extension, `false`/`undefined` if senpi-generated (legacy field name)
237
237
 
238
238
  ### BranchSummaryEntry
239
239
 
@@ -245,7 +245,7 @@ Created when switching branches via `/tree` with an LLM generated summary of the
245
245
 
246
246
  Optional fields:
247
247
  - `details`: File tracking data (`{ readFiles: string[], modifiedFiles: string[] }`) for default, or custom data for extensions
248
- - `fromHook`: `true` if generated by an extension, `false`/`undefined` if pi-generated (legacy field name)
248
+ - `fromHook`: `true` if generated by an extension, `false`/`undefined` if senpi-generated (legacy field name)
249
249
 
250
250
  ### CustomEntry
251
251
 
package/docs/sessions.md CHANGED
@@ -1,18 +1,18 @@
1
1
  # Sessions
2
2
 
3
- Pi saves conversations as sessions so you can continue work, branch from earlier turns, and revisit previous paths.
3
+ Senpi saves conversations as sessions so you can continue work, branch from earlier turns, and revisit previous paths.
4
4
 
5
5
  ## Session Storage
6
6
 
7
- Sessions auto-save to `~/.pi/agent/sessions/`, organized by working directory. Each session is a JSONL file with a tree structure.
7
+ Sessions auto-save to `~/.senpi/agent/sessions/`, organized by working directory. Each session is a JSONL file with a tree structure.
8
8
 
9
9
  ```bash
10
- pi -c # Continue most recent session
11
- pi -r # Browse and select from past sessions
12
- pi --no-session # Ephemeral mode; do not save
13
- pi --name "my task" # Set session display name at startup
14
- pi --session <path|id> # Use a specific session file or partial session ID
15
- pi --fork <path|id> # Fork a session file or partial session ID into a new session
10
+ senpi -c # Continue most recent session
11
+ senpi -r # Browse and select from past sessions
12
+ senpi --no-session # Ephemeral mode; do not save
13
+ senpi --name "my task" # Set session display name at startup
14
+ senpi --session <path|id> # Use a specific session file or partial session ID
15
+ senpi --fork <path|id> # Fork a session file or partial session ID into a new session
16
16
  ```
17
17
 
18
18
  Use `/session` in interactive mode to see the current session file, session ID, message count, tokens, and cost.
@@ -36,7 +36,7 @@ For the JSONL file format and SessionManager API, see [Session Format](session-f
36
36
 
37
37
  ## Resuming and Deleting Sessions
38
38
 
39
- `/resume` opens an interactive session picker for the current project. `pi -r` opens the same picker at startup.
39
+ `/resume` opens an interactive session picker for the current project. `senpi -r` opens the same picker at startup.
40
40
 
41
41
  In the picker you can:
42
42
 
@@ -47,7 +47,7 @@ In the picker you can:
47
47
  - rename with Ctrl+R
48
48
  - delete with Ctrl+D, then confirm
49
49
 
50
- When available, pi uses the `trash` CLI for deletion instead of permanently removing files.
50
+ When available, senpi uses the `trash` CLI for deletion instead of permanently removing files.
51
51
 
52
52
  ## Naming Sessions
53
53
 
@@ -60,11 +60,11 @@ Use `/name <name>` to set a human-readable session name:
60
60
  Set the name at startup with `--name` or `-n`:
61
61
 
62
62
  ```bash
63
- pi --name "Refactor auth module"
64
- pi --name "CI audit" -p "Review this build failure"
63
+ senpi --name "Refactor auth module"
64
+ senpi --name "CI audit" -p "Review this build failure"
65
65
  ```
66
66
 
67
- Named sessions are easier to find in `/resume` and `pi -r`.
67
+ Named sessions are easier to find in `/resume` and `senpi -r`.
68
68
 
69
69
  ## Branching with `/tree`
70
70
 
@@ -128,7 +128,7 @@ Use `/tree` when you want to keep alternatives together. Use `/fork` or `/clone`
128
128
 
129
129
  ## Branch Summaries
130
130
 
131
- When `/tree` switches away from one branch to another, pi can summarize the abandoned branch and attach that summary at the new position. This preserves important context from the path you left without replaying the whole branch.
131
+ When `/tree` switches away from one branch to another, senpi can summarize the abandoned branch and attach that summary at the new position. This preserves important context from the path you left without replaying the whole branch.
132
132
 
133
133
  When prompted, choose one of:
134
134
 
package/docs/settings.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Settings
2
2
 
3
- Pi uses JSON settings files with project settings overriding global settings.
3
+ Senpi uses JSON settings files with project settings overriding global settings.
4
4
 
5
5
  | Location | Scope |
6
6
  |----------|-------|
@@ -11,15 +11,15 @@ Edit directly or use `/settings` for common options.
11
11
 
12
12
  ## Project Trust
13
13
 
14
- On interactive startup, pi asks before trusting a project folder that contains trust-gated project inputs and has no saved decision for the folder or a parent folder in `~/.pi/agent/trust.json`. Trusting a project allows pi to load `.pi/settings.json` and `.pi` resources, install missing project packages, and execute project extensions.
14
+ On interactive startup, senpi asks before trusting a project folder that contains trust-gated project inputs and has no saved decision for the folder or a parent folder in `~/.senpi/agent/trust.json`. Trusting a project allows senpi to load `.senpi/settings.json` and `.senpi` resources, install missing project packages, and execute project extensions.
15
15
 
16
16
  Non-interactive modes (`-p`, `--mode json`, and `--mode rpc`) do not show a trust prompt. Without an applicable saved trust decision, they use `defaultProjectTrust` from global settings: `ask` (default) and `never` ignore trust-gated project inputs, while `always` trusts them. Pass `--approve`/`-a` or `--no-approve`/`-na` to override project trust for one run.
17
17
 
18
- If no extension or saved decision applies, `defaultProjectTrust` controls the fallback behavior. Set it to `"ask"`, `"always"`, or `"never"` in `~/.pi/agent/settings.json`, or change it with `/settings`.
18
+ If no extension or saved decision applies, `defaultProjectTrust` controls the fallback behavior. Set it to `"ask"`, `"always"`, or `"never"` in `~/.senpi/agent/settings.json`, or change it with `/settings`.
19
19
 
20
- `pi config` and package commands use the same project trust flow. Pass `--approve` to trust project-local settings for one command or `--no-approve` to ignore them.
20
+ `senpi config` and package commands use the same project trust flow. Pass `--approve` to trust project-local settings for one command or `--no-approve` to ignore them.
21
21
 
22
- Use `/trust` in interactive mode to save a project trust decision for future sessions, including trust for the immediate parent folder. It writes `~/.pi/agent/trust.json` only; the current session is not reloaded, so restart pi for changes to take effect.
22
+ Use `/trust` in interactive mode to save a project trust decision for future sessions, including trust for the immediate parent folder. It writes `~/.senpi/agent/trust.json` only; the current session is not reloaded, so restart senpi for changes to take effect.
23
23
 
24
24
  ## All Settings
25
25
 
@@ -69,6 +69,8 @@ When this value is anything other than `"auto"`, it overrides any model-level `p
69
69
  | `defaultProjectTrust` | string | `"ask"` | Fallback project trust behavior: `"ask"`, `"always"`, or `"never"`. Global setting only |
70
70
  | `collapseChangelog` | boolean | `false` | Show condensed changelog after updates |
71
71
  | `enableInstallTelemetry` | boolean | `true` | Send an anonymous install/update version ping after first install or changelog-detected updates. This does not control update checks |
72
+ | `enableAnalytics` | boolean | `false` | Opt-in analytics data sharing. Currently only asked for during the experimental first-time setup (`PI_EXPERIMENTAL=1`) |
73
+ | `trackingId` | string | - | Analytics tracking identifier, generated when `enableAnalytics` is turned on |
72
74
  | `doubleEscapeAction` | string | `"tree"` | Action for double-escape: `"tree"`, `"fork"`, or `"none"` |
73
75
  | `treeFilterMode` | string | `"default"` | Default filter for `/tree`: `"default"`, `"no-tools"`, `"user-only"`, `"labeled-only"`, `"all"` |
74
76
  | `editorPaddingX` | number | `0` | Horizontal padding for input editor (0-3) |
@@ -77,9 +79,9 @@ When this value is anything other than `"auto"`, it overrides any model-level `p
77
79
 
78
80
  ### Telemetry and update checks
79
81
 
80
- `enableInstallTelemetry` only controls the anonymous install/update ping to `https://pi.dev/api/report-install`. Opting out of telemetry does not disable update checks; Pi can still fetch `https://pi.dev/api/latest-version` to look for the latest version.
82
+ `enableInstallTelemetry` only controls the anonymous install/update ping to `https://pi.dev/api/report-install`. Opting out of telemetry does not disable update checks; senpi can still fetch the latest published `@code-yeongyu/senpi` version from the npm registry (`registry.npmjs.org`).
81
83
 
82
- Set `PI_SKIP_VERSION_CHECK=1` to disable the Pi version update check. Use `--offline` or `PI_OFFLINE=1` to disable all startup network operations described here, including update checks, package update checks, and install/update telemetry.
84
+ Set `PI_SKIP_VERSION_CHECK=1` to disable the senpi version update check. Use `--offline` or `PI_OFFLINE=1` to disable all startup network operations described here, including update checks, package update checks, and install/update telemetry.
83
85
 
84
86
  ### Warnings
85
87
 
@@ -133,7 +135,7 @@ Set `PI_SKIP_VERSION_CHECK=1` to disable the Pi version update check. Use `--off
133
135
 
134
136
  When a provider requests a retry delay longer than `retry.provider.maxRetryDelayMs` (e.g., Google's "quota will reset after 5h"), the request fails immediately with an informative error instead of waiting silently. Set to `0` to disable the cap.
135
137
 
136
- Keep `retry.provider.maxRetries` at `0` unless provider-level retries are explicitly needed. Setting it above `0` can make SDK/provider retries handle out-of-usage-limit errors before Pi sees them, which may block the agent until the provider quota resets in some circumstances.
138
+ Keep `retry.provider.maxRetries` at `0` unless provider-level retries are explicitly needed. Setting it above `0` can make SDK/provider retries handle out-of-usage-limit errors before senpi sees them, which may block the agent until the provider quota resets in some circumstances.
137
139
 
138
140
  ```json
139
141
  {
@@ -200,7 +202,7 @@ When unset, senpi leaves provider payloads unchanged. This setting currently app
200
202
  }
201
203
  ```
202
204
 
203
- `npmCommand` is used for all npm package-manager operations, including installs, uninstalls, and dependency installs inside git packages. User-scoped npm packages install under `~/.pi/agent/npm/`; project-scoped npm packages install under `.pi/npm/`. Use argv-style entries exactly as the process should be launched. When `npmCommand` is configured, git package dependency installs use plain `install` to avoid npm-specific flags in wrappers or alternate package managers.
205
+ `npmCommand` is used for all npm package-manager operations, including installs, uninstalls, and dependency installs inside git packages. User-scoped npm packages install under `~/.senpi/agent/npm/`; project-scoped npm packages install under `.senpi/npm/`. Use argv-style entries exactly as the process should be launched. When `npmCommand` is configured, git package dependency installs use plain `install` to avoid npm-specific flags in wrappers or alternate package managers.
204
206
 
205
207
  ### Sessions
206
208
 
@@ -209,10 +211,10 @@ When unset, senpi leaves provider payloads unchanged. This setting currently app
209
211
  | `sessionDir` | string | - | Directory where session files are stored. Accepts absolute or relative paths, plus `~`. |
210
212
 
211
213
  ```json
212
- { "sessionDir": ".pi/sessions" }
214
+ { "sessionDir": ".senpi/sessions" }
213
215
  ```
214
216
 
215
- When multiple sources specify a session directory, precedence is `--session-dir`, `PI_CODING_AGENT_SESSION_DIR`, then `sessionDir` in settings.json.
217
+ When multiple sources specify a session directory, precedence is `--session-dir`, `SENPI_CODING_AGENT_SESSION_DIR`, then `sessionDir` in settings.json.
216
218
 
217
219
  ### Model Cycling
218
220
 
package/docs/skills.md CHANGED
@@ -1,10 +1,10 @@
1
- > pi can create skills. Ask it to build one for your use case.
1
+ > senpi can create skills. Ask it to build one for your use case.
2
2
 
3
3
  # Skills
4
4
 
5
5
  Skills are self-contained capability packages that the agent loads on-demand. A skill provides specialized workflows, setup instructions, helper scripts, and reference documentation for specific tasks.
6
6
 
7
- Pi implements the [Agent Skills standard](https://agentskills.io/specification), warning about most violations but remaining lenient. Pi allows skill names to differ from their parent directory even though the standard disallows it; that rule is suboptimal for shared skill directories used across multiple agent harnesses.
7
+ Senpi implements the [Agent Skills standard](https://agentskills.io/specification), warning about most violations but remaining lenient. Senpi allows skill names to differ from their parent directory even though the standard disallows it; that rule is suboptimal for shared skill directories used across multiple agent harnesses.
8
8
 
9
9
  ## Table of Contents
10
10
 
@@ -21,7 +21,7 @@ Pi implements the [Agent Skills standard](https://agentskills.io/specification),
21
21
 
22
22
  > **Security:** Skills can instruct the model to perform any action and may include executable code the model invokes. Review skill content before use.
23
23
 
24
- Pi loads skills from:
24
+ Senpi loads skills from:
25
25
 
26
26
  - Global:
27
27
  - `~/.senpi/agent/skills/`
@@ -63,7 +63,7 @@ For project-level Claude Code skills, add to `.senpi/settings.json`:
63
63
 
64
64
  ## How Skills Work
65
65
 
66
- 1. At startup, pi scans skill locations and extracts names and descriptions
66
+ 1. At startup, senpi scans skill locations and extracts names and descriptions
67
67
  2. The system prompt includes available skills in XML format per the [specification](https://agentskills.io/integrate-skills)
68
68
  3. When a task matches, the agent uses `read` to load the full SKILL.md (models don't always do this; use prompting or `/skill:name` to force it)
69
69
  4. The agent follows the instructions, using relative paths to reference scripts and assets
@@ -140,12 +140,12 @@ Per the [Agent Skills specification](https://agentskills.io/specification#frontm
140
140
 
141
141
  | Field | Required | Description |
142
142
  |-------|----------|-------------|
143
- | `name` | Yes | Max 64 chars. Lowercase a-z, 0-9, hyphens. Unlike the standard, Pi does not require this to match the parent directory because that standard requirement is suboptimal for shared skill directories. |
143
+ | `name` | Yes | Max 64 chars. Lowercase a-z, 0-9, hyphens. Unlike the standard, Senpi does not require this to match the parent directory because that standard requirement is suboptimal for shared skill directories. |
144
144
  | `description` | Yes | Max 1024 chars. What the skill does and when to use it. |
145
145
  | `license` | No | License name or reference to bundled file. |
146
146
  | `compatibility` | No | Max 500 chars. Environment requirements. |
147
147
  | `metadata` | No | Arbitrary key-value mapping. |
148
- | `allowed-tools` | No | Space-delimited list of pre-approved tools (experimental). |
148
+ | `allowed-tools` | No | Spec field for pre-approved tools. Senpi does not implement it; the field is ignored. |
149
149
  | `disable-model-invocation` | No | When `true`, skill is hidden from system prompt. Users must use `/skill:name`. |
150
150
 
151
151
  ### Name Rules
@@ -154,7 +154,7 @@ Per the [Agent Skills specification](https://agentskills.io/specification#frontm
154
154
  - Lowercase letters, numbers, hyphens only
155
155
  - No leading/trailing hyphens
156
156
  - No consecutive hyphens
157
- Pi does not require the name to match the parent directory. The Agent Skills standard does, but that requirement is suboptimal for shared skill directories used by multiple tools.
157
+ Senpi does not require the name to match the parent directory. The Agent Skills standard does, but that requirement is suboptimal for shared skill directories used by multiple tools.
158
158
 
159
159
  Valid: `pdf-processing`, `data-analysis`, `code-review`
160
160
  Invalid: `PDF-Processing`, `-pdf`, `pdf--processing`
@@ -175,7 +175,7 @@ description: Helps with PDFs.
175
175
 
176
176
  ## Validation
177
177
 
178
- Pi validates skills against the Agent Skills standard. Most issues produce warnings but still load the skill:
178
+ Senpi validates skills against the Agent Skills standard. Most issues produce warnings but still load the skill:
179
179
 
180
180
  - Name exceeds 64 characters or contains invalid characters
181
181
  - Name starts/ends with hyphen or has consecutive hyphens
@@ -66,7 +66,7 @@ return config
66
66
 
67
67
  If you already have a `config.keys` table, add the entry to it.
68
68
 
69
- On WSL, WezTerm may require a visible hardware cursor for IME candidate window positioning. If CJK IME candidates do not follow the text cursor, set `PI_HARDWARE_CURSOR=1` before running pi or set `showHardwareCursor` to `true` in settings.
69
+ On WSL, WezTerm may require a visible hardware cursor for IME candidate window positioning. If CJK IME candidates do not follow the text cursor, set `PI_HARDWARE_CURSOR=1` before running senpi or set `showHardwareCursor` to `true` in settings.
70
70
 
71
71
  ## Alacritty
72
72
 
@@ -143,6 +143,6 @@ For the best experience, use a terminal that supports the Kitty keyboard protoco
143
143
 
144
144
  The built-in terminal has limited escape sequence support. Shift+Enter cannot be distinguished from Enter in IntelliJ's terminal.
145
145
 
146
- If you want the hardware cursor visible, set `PI_HARDWARE_CURSOR=1` before running pi (disabled by default for compatibility).
146
+ If you want the hardware cursor visible, set `PI_HARDWARE_CURSOR=1` before running senpi (disabled by default for compatibility).
147
147
 
148
148
  Consider using a dedicated terminal emulator for the best experience.
package/docs/termux.md CHANGED
@@ -16,14 +16,14 @@ pkg update && pkg upgrade
16
16
  # Install dependencies
17
17
  pkg install nodejs termux-api git
18
18
 
19
- # Install pi
19
+ # Install senpi
20
20
  npm install -g @code-yeongyu/senpi
21
21
 
22
22
  # Create config directory
23
23
  mkdir -p ~/.senpi/agent
24
24
 
25
- # Run pi
26
- pi
25
+ # Run senpi
26
+ senpi
27
27
  ```
28
28
 
29
29
  ## Clipboard Support