@eminent337/aery 0.1.27 → 0.1.29
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 +2 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +2 -2
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/compaction.md +10 -10
- package/docs/custom-provider.md +18 -18
- package/docs/development.md +3 -3
- package/docs/extensions.md +163 -163
- package/docs/json.md +3 -3
- package/docs/keybindings.md +5 -5
- package/docs/models.md +1 -1
- package/docs/packages.md +9 -9
- package/docs/prompt-templates.md +3 -3
- package/docs/providers.md +2 -2
- package/docs/rpc.md +8 -8
- package/docs/sdk.md +15 -15
- package/docs/session.md +3 -3
- package/docs/settings.md +7 -7
- package/docs/shell-aliases.md +1 -1
- package/docs/skills.md +5 -5
- package/docs/terminal-setup.md +1 -1
- package/docs/termux.md +2 -2
- package/docs/themes.md +5 -5
- package/docs/tree.md +1 -1
- package/docs/tui.md +9 -9
- package/docs/windows.md +1 -1
- package/package.json +3 -2
package/docs/json.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# JSON Event Stream Mode
|
|
2
2
|
|
|
3
3
|
```bash
|
|
4
|
-
|
|
4
|
+
aery --mode json "Your prompt"
|
|
5
5
|
```
|
|
6
6
|
|
|
7
|
-
Outputs all session events as JSON lines to stdout. Useful for integrating
|
|
7
|
+
Outputs all session events as JSON lines to stdout. Useful for integrating Aery into other tools or custom UIs.
|
|
8
8
|
|
|
9
9
|
## Event Types
|
|
10
10
|
|
|
@@ -78,5 +78,5 @@ Followed by events as they occur:
|
|
|
78
78
|
## Example
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
|
-
|
|
81
|
+
aery --mode json "List files" 2>/dev/null | jq -c 'select(.type == "message_end")'
|
|
82
82
|
```
|
package/docs/keybindings.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Keybindings
|
|
2
2
|
|
|
3
|
-
All keyboard shortcuts can be customized via `~/.
|
|
3
|
+
All keyboard shortcuts can be customized via `~/.aery/agent/keybindings.json`. Each action can be bound to one or more keys.
|
|
4
4
|
|
|
5
|
-
The config file uses the same namespaced keybinding ids that
|
|
5
|
+
The config file uses the same namespaced keybinding ids that Aery uses internally and that extension authors use in `keyHint()` and injected `keybindings` managers.
|
|
6
6
|
|
|
7
7
|
Older configs using pre-namespaced ids such as `cursorUp` or `expandTools` are migrated automatically to the namespaced ids on startup.
|
|
8
8
|
|
|
9
|
-
After editing `keybindings.json`, run `/reload` in
|
|
9
|
+
After editing `keybindings.json`, run `/reload` in Aery to apply the changes without restarting the session.
|
|
10
10
|
|
|
11
11
|
## Key Format
|
|
12
12
|
|
|
@@ -153,7 +153,7 @@ Used inside the scoped models selector (opened via `/scoped-models`).
|
|
|
153
153
|
|
|
154
154
|
## Custom Configuration
|
|
155
155
|
|
|
156
|
-
Create `~/.
|
|
156
|
+
Create `~/.aery/agent/keybindings.json`:
|
|
157
157
|
|
|
158
158
|
```json
|
|
159
159
|
{
|
|
@@ -165,7 +165,7 @@ Create `~/.pi/agent/keybindings.json`:
|
|
|
165
165
|
|
|
166
166
|
Each action can have a single key or an array of keys. User config overrides defaults.
|
|
167
167
|
|
|
168
|
-
On native Windows, `app.suspend` has no default binding because Windows terminals do not support Unix job control. If you bind it manually,
|
|
168
|
+
On native Windows, `app.suspend` has no default binding because Windows terminals do not support Unix job control. If you bind it manually, Aery shows a status message instead of suspending. In WSL, the normal Linux `ctrl+z`/`fg` behavior still applies.
|
|
169
169
|
|
|
170
170
|
### Emacs Example
|
|
171
171
|
|
package/docs/models.md
CHANGED
package/docs/packages.md
CHANGED
|
@@ -31,13 +31,13 @@ pi list # show installed packages from settings
|
|
|
31
31
|
pi update # update all non-pinned packages
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
By default, `install` and `remove` write to global settings (`~/.
|
|
34
|
+
By default, `install` and `remove` write to global settings (`~/.aery/agent/settings.json`). Use `-l` to write to project settings (`.aery/settings.json`) instead. Project settings can be shared with your team, and pi installs any missing packages automatically on startup.
|
|
35
35
|
|
|
36
36
|
To try a package without installing it, use `--extension` or `-e`. This installs to a temporary directory for the current run only:
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
aery -e npm:@foo/bar
|
|
40
|
+
aery -e git:github.com/user/repo
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
## Package Sources
|
|
@@ -53,7 +53,7 @@ npm:pkg
|
|
|
53
53
|
|
|
54
54
|
- Versioned specs are pinned and skipped by `pi update`.
|
|
55
55
|
- Global installs use `npm install -g`.
|
|
56
|
-
- Project installs go under `.
|
|
56
|
+
- Project installs go under `.aery/npm/`.
|
|
57
57
|
- Set `npmCommand` in `settings.json` to pin npm package lookup and install operations to a specific wrapper command such as `mise` or `asdf`.
|
|
58
58
|
|
|
59
59
|
Example:
|
|
@@ -79,7 +79,7 @@ ssh://git@github.com/user/repo@v1
|
|
|
79
79
|
- SSH URLs use your configured SSH keys automatically (respects `~/.ssh/config`).
|
|
80
80
|
- For non-interactive runs (for example CI), you can set `GIT_TERMINAL_PROMPT=0` to disable credential prompts and set `GIT_SSH_COMMAND` (for example `ssh -o BatchMode=yes -o ConnectTimeout=5`) to fail fast.
|
|
81
81
|
- Refs pin the package and skip `pi update`.
|
|
82
|
-
- Cloned to `~/.
|
|
82
|
+
- Cloned to `~/.aery/agent/git/<host>/<path>` (global) or `.aery/git/<host>/<path>` (project).
|
|
83
83
|
- Runs `npm install` after clone or pull if `package.json` exists.
|
|
84
84
|
|
|
85
85
|
**SSH examples:**
|
|
@@ -111,7 +111,7 @@ Add a `pi` manifest to `package.json` or use conventional directories. Include t
|
|
|
111
111
|
{
|
|
112
112
|
"name": "my-package",
|
|
113
113
|
"keywords": ["pi-package"],
|
|
114
|
-
"
|
|
114
|
+
"aery": {
|
|
115
115
|
"extensions": ["./extensions"],
|
|
116
116
|
"skills": ["./skills"],
|
|
117
117
|
"prompts": ["./prompts"],
|
|
@@ -130,7 +130,7 @@ The [package gallery](https://aery.dev/packages) displays packages tagged with `
|
|
|
130
130
|
{
|
|
131
131
|
"name": "my-package",
|
|
132
132
|
"keywords": ["pi-package"],
|
|
133
|
-
"
|
|
133
|
+
"aery": {
|
|
134
134
|
"extensions": ["./extensions"],
|
|
135
135
|
"video": "https://example.com/demo.mp4",
|
|
136
136
|
"image": "https://example.com/screenshot.png"
|
|
@@ -170,7 +170,7 @@ Example:
|
|
|
170
170
|
"shitty-extensions": "^1.0.1"
|
|
171
171
|
},
|
|
172
172
|
"bundledDependencies": ["shitty-extensions"],
|
|
173
|
-
"
|
|
173
|
+
"aery": {
|
|
174
174
|
"extensions": ["extensions", "node_modules/shitty-extensions/extensions"],
|
|
175
175
|
"skills": ["skills", "node_modules/shitty-extensions/skills"]
|
|
176
176
|
}
|
|
@@ -207,7 +207,7 @@ Filter what a package loads using the object form in settings:
|
|
|
207
207
|
|
|
208
208
|
## Enable and Disable Resources
|
|
209
209
|
|
|
210
|
-
Use `pi config` to enable or disable extensions, skills, prompt templates, and themes from installed packages and local directories. Works for both global (`~/.
|
|
210
|
+
Use `pi config` to enable or disable extensions, skills, prompt templates, and themes from installed packages and local directories. Works for both global (`~/.aery/agent`) and project (`.aery/`) scopes.
|
|
211
211
|
|
|
212
212
|
## Scope and Deduplication
|
|
213
213
|
|
package/docs/prompt-templates.md
CHANGED
|
@@ -8,9 +8,9 @@ Prompt templates are Markdown snippets that expand into full prompts. Type `/nam
|
|
|
8
8
|
|
|
9
9
|
Pi loads prompt templates from:
|
|
10
10
|
|
|
11
|
-
- Global: `~/.
|
|
12
|
-
- Project: `.
|
|
13
|
-
- Packages: `prompts/` directories or `
|
|
11
|
+
- Global: `~/.aery/agent/prompts/*.md`
|
|
12
|
+
- Project: `.aery/prompts/*.md`
|
|
13
|
+
- Packages: `prompts/` directories or `aery.prompts` entries in `package.json`
|
|
14
14
|
- Settings: `prompts` array with files or directories
|
|
15
15
|
- CLI: `--prompt-template <path>` (repeatable)
|
|
16
16
|
|
package/docs/providers.md
CHANGED
|
@@ -21,7 +21,7 @@ Use `/login` in interactive mode, then select a provider:
|
|
|
21
21
|
- Google Gemini CLI
|
|
22
22
|
- Google Antigravity
|
|
23
23
|
|
|
24
|
-
Use `/logout` to clear credentials. Tokens are stored in `~/.
|
|
24
|
+
Use `/logout` to clear credentials. Tokens are stored in `~/.aery/agent/auth.json` and auto-refresh when expired.
|
|
25
25
|
|
|
26
26
|
### GitHub Copilot
|
|
27
27
|
|
|
@@ -75,7 +75,7 @@ Reference for environment variables and `auth.json` keys: [`const envMap`](https
|
|
|
75
75
|
|
|
76
76
|
#### Auth File
|
|
77
77
|
|
|
78
|
-
Store credentials in `~/.
|
|
78
|
+
Store credentials in `~/.aery/agent/auth.json`:
|
|
79
79
|
|
|
80
80
|
```json
|
|
81
81
|
{
|
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
|
-
|
|
10
|
+
aery --mode rpc [options]
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
Common options:
|
|
@@ -63,7 +63,7 @@ With images:
|
|
|
63
63
|
|
|
64
64
|
If the agent is streaming and no `streamingBehavior` is specified, the command returns an error.
|
|
65
65
|
|
|
66
|
-
**Extension commands**: If the message is an extension command (e.g., `/mycommand`), it executes immediately even during streaming. Extension commands manage their own LLM interaction via `
|
|
66
|
+
**Extension commands**: If the message is an extension command (e.g., `/mycommand`), it executes immediately even during streaming. Extension commands manage their own LLM interaction via `aery.sendMessage()`.
|
|
67
67
|
|
|
68
68
|
**Input expansion**: Skill commands (`/skill:name`) and prompt templates (`/template`) are expanded before sending/queueing.
|
|
69
69
|
|
|
@@ -714,9 +714,9 @@ Response:
|
|
|
714
714
|
"success": true,
|
|
715
715
|
"data": {
|
|
716
716
|
"commands": [
|
|
717
|
-
{"name": "session-name", "description": "Set or clear session name", "source": "extension", "path": "/home/user/.
|
|
718
|
-
{"name": "fix-tests", "description": "Fix failing tests", "source": "prompt", "location": "project", "path": "/home/user/myproject/.
|
|
719
|
-
{"name": "skill:brave-search", "description": "Web search via Brave API", "source": "skill", "location": "user", "path": "/home/user/.
|
|
717
|
+
{"name": "session-name", "description": "Set or clear session name", "source": "extension", "path": "/home/user/.aery/agent/extensions/session.ts"},
|
|
718
|
+
{"name": "fix-tests", "description": "Fix failing tests", "source": "prompt", "location": "project", "path": "/home/user/myproject/.aery/agent/prompts/fix-tests.md"},
|
|
719
|
+
{"name": "skill:brave-search", "description": "Web search via Brave API", "source": "skill", "location": "user", "path": "/home/user/.aery/agent/skills/brave-search/SKILL.md"}
|
|
720
720
|
]
|
|
721
721
|
}
|
|
722
722
|
}
|
|
@@ -726,12 +726,12 @@ Each command has:
|
|
|
726
726
|
- `name`: Command name (invoke with `/name`)
|
|
727
727
|
- `description`: Human-readable description (optional for extension commands)
|
|
728
728
|
- `source`: What kind of command:
|
|
729
|
-
- `"extension"`: Registered via `
|
|
729
|
+
- `"extension"`: Registered via `aery.registerCommand()` in an extension
|
|
730
730
|
- `"prompt"`: Loaded from a prompt template `.md` file
|
|
731
731
|
- `"skill"`: Loaded from a skill directory (name is prefixed with `skill:`)
|
|
732
732
|
- `location`: Where it was loaded from (optional, not present for extensions):
|
|
733
|
-
- `"user"`: User-level (`~/.
|
|
734
|
-
- `"project"`: Project-level (`./.
|
|
733
|
+
- `"user"`: User-level (`~/.aery/agent/`)
|
|
734
|
+
- `"project"`: Project-level (`./.aery/agent/`)
|
|
735
735
|
- `"path"`: Explicit path via CLI or settings
|
|
736
736
|
- `path`: Absolute file path to the command source (optional)
|
|
737
737
|
|
package/docs/sdk.md
CHANGED
|
@@ -219,7 +219,7 @@ await session.prompt("After you're done, also check X", { streamingBehavior: "fo
|
|
|
219
219
|
```
|
|
220
220
|
|
|
221
221
|
**Behavior:**
|
|
222
|
-
- **Extension commands** (e.g., `/mycommand`): Execute immediately, even during streaming. They manage their own LLM interaction via `
|
|
222
|
+
- **Extension commands** (e.g., `/mycommand`): Execute immediately, even during streaming. They manage their own LLM interaction via `aery.sendMessage()`.
|
|
223
223
|
- **File-based prompt templates** (from `.md` files): Expanded to their content before sending or queueing.
|
|
224
224
|
- **During streaming without `streamingBehavior`**: Throws an error. Use `steer()` or `followUp()` directly, or specify the option.
|
|
225
225
|
- **`preflightResult(true)`**: Means the prompt was accepted, queued, or handled immediately.
|
|
@@ -338,23 +338,23 @@ const { session } = await createAgentSession({
|
|
|
338
338
|
cwd: process.cwd(), // default
|
|
339
339
|
|
|
340
340
|
// Global config directory
|
|
341
|
-
agentDir: "~/.
|
|
341
|
+
agentDir: "~/.aery/agent", // default (expands ~)
|
|
342
342
|
});
|
|
343
343
|
```
|
|
344
344
|
|
|
345
345
|
`cwd` is used by `DefaultResourceLoader` for:
|
|
346
|
-
- Project extensions (`.
|
|
346
|
+
- Project extensions (`.aery/extensions/`)
|
|
347
347
|
- Project skills:
|
|
348
|
-
- `.
|
|
348
|
+
- `.aery/skills/`
|
|
349
349
|
- `.agents/skills/` in `cwd` and ancestor directories (up to git repo root, or filesystem root when not in a repo)
|
|
350
|
-
- Project prompts (`.
|
|
350
|
+
- Project prompts (`.aery/prompts/`)
|
|
351
351
|
- Context files (`AGENTS.md` walking up from cwd)
|
|
352
352
|
- Session directory naming
|
|
353
353
|
|
|
354
354
|
`agentDir` is used by `DefaultResourceLoader` for:
|
|
355
355
|
- Global extensions (`extensions/`)
|
|
356
356
|
- Global skills:
|
|
357
|
-
- `skills/` under `agentDir` (for example `~/.
|
|
357
|
+
- `skills/` under `agentDir` (for example `~/.aery/agent/skills/`)
|
|
358
358
|
- `~/.agents/skills/`
|
|
359
359
|
- Global prompts (`prompts/`)
|
|
360
360
|
- Global context file (`AGENTS.md`)
|
|
@@ -418,7 +418,7 @@ API key resolution priority (handled by AuthStorage):
|
|
|
418
418
|
```typescript
|
|
419
419
|
import { AuthStorage, ModelRegistry } from "@eminent337/aery";
|
|
420
420
|
|
|
421
|
-
// Default: uses ~/.
|
|
421
|
+
// Default: uses ~/.aery/agent/auth.json and ~/.aery/agent/models.json
|
|
422
422
|
const authStorage = AuthStorage.create();
|
|
423
423
|
const modelRegistry = ModelRegistry.create(authStorage);
|
|
424
424
|
|
|
@@ -552,15 +552,15 @@ const { session } = await createAgentSession({
|
|
|
552
552
|
});
|
|
553
553
|
```
|
|
554
554
|
|
|
555
|
-
Use `defineTool()` for standalone definitions and arrays like `customTools: [myTool]`. Inline `
|
|
555
|
+
Use `defineTool()` for standalone definitions and arrays like `customTools: [myTool]`. Inline `aery.registerTool({ ... })` already infers parameter types correctly.
|
|
556
556
|
|
|
557
|
-
Custom tools passed via `customTools` are combined with extension-registered tools. Extensions loaded by the ResourceLoader can also register tools via `
|
|
557
|
+
Custom tools passed via `customTools` are combined with extension-registered tools. Extensions loaded by the ResourceLoader can also register tools via `aery.registerTool()`.
|
|
558
558
|
|
|
559
559
|
> See [examples/sdk/05-tools.ts](../examples/sdk/05-tools.ts)
|
|
560
560
|
|
|
561
561
|
### Extensions
|
|
562
562
|
|
|
563
|
-
Extensions are loaded by the `ResourceLoader`. `DefaultResourceLoader` discovers extensions from `~/.
|
|
563
|
+
Extensions are loaded by the `ResourceLoader`. `DefaultResourceLoader` discovers extensions from `~/.aery/agent/extensions/`, `.aery/extensions/`, and settings.json extension sources.
|
|
564
564
|
|
|
565
565
|
```typescript
|
|
566
566
|
import { createAgentSession, DefaultResourceLoader } from "@eminent337/aery";
|
|
@@ -569,7 +569,7 @@ const loader = new DefaultResourceLoader({
|
|
|
569
569
|
additionalExtensionPaths: ["/path/to/my-extension.ts"],
|
|
570
570
|
extensionFactories: [
|
|
571
571
|
(pi) => {
|
|
572
|
-
|
|
572
|
+
aery.on("agent_start", () => {
|
|
573
573
|
console.log("[Inline Extension] Agent starting");
|
|
574
574
|
});
|
|
575
575
|
},
|
|
@@ -582,7 +582,7 @@ const { session } = await createAgentSession({ resourceLoader: loader });
|
|
|
582
582
|
|
|
583
583
|
Extensions can register tools, subscribe to events, add commands, and more. See [extensions.md](extensions.md) for the full API.
|
|
584
584
|
|
|
585
|
-
**Event Bus:** Extensions can communicate via `
|
|
585
|
+
**Event Bus:** Extensions can communicate via `aery.events`. Pass a shared `eventBus` to `DefaultResourceLoader` if you need to emit or listen from outside:
|
|
586
586
|
|
|
587
587
|
```typescript
|
|
588
588
|
import { createEventBus, DefaultResourceLoader } from "@eminent337/aery";
|
|
@@ -818,8 +818,8 @@ const { session } = await createAgentSession({
|
|
|
818
818
|
**Project-specific settings:**
|
|
819
819
|
|
|
820
820
|
Settings load from two locations and merge:
|
|
821
|
-
1. Global: `~/.
|
|
822
|
-
2. Project: `<cwd>/.
|
|
821
|
+
1. Global: `~/.aery/agent/settings.json`
|
|
822
|
+
2. Project: `<cwd>/.aery/settings.json`
|
|
823
823
|
|
|
824
824
|
Project overrides global. Nested objects merge keys. Setters modify global settings by default.
|
|
825
825
|
|
|
@@ -1081,7 +1081,7 @@ See [RPC documentation](rpc.md) for the JSON protocol.
|
|
|
1081
1081
|
For subprocess-based integration without building with the SDK, use the CLI directly:
|
|
1082
1082
|
|
|
1083
1083
|
```bash
|
|
1084
|
-
|
|
1084
|
+
aery --mode rpc --no-session
|
|
1085
1085
|
```
|
|
1086
1086
|
|
|
1087
1087
|
See [RPC documentation](rpc.md) for the JSON protocol.
|
package/docs/session.md
CHANGED
|
@@ -5,14 +5,14 @@ Sessions are stored as JSONL (JSON Lines) files. Each line is a JSON object with
|
|
|
5
5
|
## File Location
|
|
6
6
|
|
|
7
7
|
```
|
|
8
|
-
~/.
|
|
8
|
+
~/.aery/agent/sessions/--<path>--/<timestamp>_<uuid>.jsonl
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
Where `<path>` is the working directory with `/` replaced by `-`.
|
|
12
12
|
|
|
13
13
|
## Deleting Sessions
|
|
14
14
|
|
|
15
|
-
Sessions can be removed by deleting their `.jsonl` files under `~/.
|
|
15
|
+
Sessions can be removed by deleting their `.jsonl` files under `~/.aery/agent/sessions/`.
|
|
16
16
|
|
|
17
17
|
Pi also supports deleting sessions interactively from `/resume` (select a session and press `Ctrl+D`, then confirm). When available, pi uses the `trash` CLI to avoid permanent deletion.
|
|
18
18
|
|
|
@@ -282,7 +282,7 @@ Set `label` to `undefined` to clear a label.
|
|
|
282
282
|
|
|
283
283
|
### SessionInfoEntry
|
|
284
284
|
|
|
285
|
-
Session metadata (e.g., user-defined display name). Set via `/name` command or `
|
|
285
|
+
Session metadata (e.g., user-defined display name). Set via `/name` command or `aery.setSessionName()` in extensions.
|
|
286
286
|
|
|
287
287
|
```json
|
|
288
288
|
{"type":"session_info","id":"k1l2m3n4","parentId":"j0k1l2m3","timestamp":"2024-12-03T14:35:00.000Z","name":"Refactor auth module"}
|
package/docs/settings.md
CHANGED
|
@@ -4,8 +4,8 @@ Pi uses JSON settings files with project settings overriding global settings.
|
|
|
4
4
|
|
|
5
5
|
| Location | Scope |
|
|
6
6
|
|----------|-------|
|
|
7
|
-
| `~/.
|
|
8
|
-
| `.
|
|
7
|
+
| `~/.aery/agent/settings.json` | Global (all projects) |
|
|
8
|
+
| `.aery/settings.json` | Project (current directory) |
|
|
9
9
|
|
|
10
10
|
Edit directly or use `/settings` for common options.
|
|
11
11
|
|
|
@@ -135,7 +135,7 @@ When a provider requests a retry delay longer than `maxDelayMs` (e.g., Google's
|
|
|
135
135
|
| `sessionDir` | string | - | Directory where session files are stored. Accepts absolute or relative paths. |
|
|
136
136
|
|
|
137
137
|
```json
|
|
138
|
-
{ "sessionDir": ".
|
|
138
|
+
{ "sessionDir": ".aery/sessions" }
|
|
139
139
|
```
|
|
140
140
|
|
|
141
141
|
When multiple sources specify a session directory, `--session-dir` CLI flag takes precedence over `sessionDir` in settings.json.
|
|
@@ -162,7 +162,7 @@ When multiple sources specify a session directory, `--session-dir` CLI flag take
|
|
|
162
162
|
|
|
163
163
|
These settings define where to load extensions, skills, prompts, and themes from.
|
|
164
164
|
|
|
165
|
-
Paths in `~/.
|
|
165
|
+
Paths in `~/.aery/agent/settings.json` resolve relative to `~/.aery/agent`. Paths in `.aery/settings.json` resolve relative to `.pi`. Absolute paths and `~` are supported.
|
|
166
166
|
|
|
167
167
|
| Setting | Type | Default | Description |
|
|
168
168
|
|---------|------|---------|-------------|
|
|
@@ -225,16 +225,16 @@ See [packages.md](packages.md) for package management details.
|
|
|
225
225
|
|
|
226
226
|
## Project Overrides
|
|
227
227
|
|
|
228
|
-
Project settings (`.
|
|
228
|
+
Project settings (`.aery/settings.json`) override global settings. Nested objects are merged:
|
|
229
229
|
|
|
230
230
|
```json
|
|
231
|
-
// ~/.
|
|
231
|
+
// ~/.aery/agent/settings.json (global)
|
|
232
232
|
{
|
|
233
233
|
"theme": "dark",
|
|
234
234
|
"compaction": { "enabled": true, "reserveTokens": 16384 }
|
|
235
235
|
}
|
|
236
236
|
|
|
237
|
-
// .
|
|
237
|
+
// .aery/settings.json (project)
|
|
238
238
|
{
|
|
239
239
|
"compaction": { "reserveTokens": 8192 }
|
|
240
240
|
}
|
package/docs/shell-aliases.md
CHANGED
package/docs/skills.md
CHANGED
|
@@ -24,17 +24,17 @@ Pi implements the [Agent Skills standard](https://agentskills.io/specification),
|
|
|
24
24
|
Pi loads skills from:
|
|
25
25
|
|
|
26
26
|
- Global:
|
|
27
|
-
- `~/.
|
|
27
|
+
- `~/.aery/agent/skills/`
|
|
28
28
|
- `~/.agents/skills/`
|
|
29
29
|
- Project:
|
|
30
|
-
- `.
|
|
30
|
+
- `.aery/skills/`
|
|
31
31
|
- `.agents/skills/` in `cwd` and ancestor directories (up to git repo root, or filesystem root when not in a repo)
|
|
32
|
-
- Packages: `skills/` directories or `
|
|
32
|
+
- Packages: `skills/` directories or `aery.skills` entries in `package.json`
|
|
33
33
|
- Settings: `skills` array with files or directories
|
|
34
34
|
- CLI: `--skill <path>` (repeatable, additive even with `--no-skills`)
|
|
35
35
|
|
|
36
36
|
Discovery rules:
|
|
37
|
-
- In `~/.
|
|
37
|
+
- In `~/.aery/agent/skills/` and `.aery/skills/`, direct root `.md` files are discovered as individual skills
|
|
38
38
|
- In all skill locations, directories containing `SKILL.md` are discovered recursively
|
|
39
39
|
- In `~/.agents/skills/` and project `.agents/skills/`, root `.md` files are ignored
|
|
40
40
|
|
|
@@ -53,7 +53,7 @@ To use skills from Claude Code or OpenAI Codex, add their directories to setting
|
|
|
53
53
|
}
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
For project-level Claude Code skills, add to `.
|
|
56
|
+
For project-level Claude Code skills, add to `.aery/settings.json`:
|
|
57
57
|
|
|
58
58
|
```json
|
|
59
59
|
{
|
package/docs/terminal-setup.md
CHANGED
|
@@ -24,7 +24,7 @@ That mapping sends a raw linefeed byte. Inside pi, that is indistinguishable fro
|
|
|
24
24
|
|
|
25
25
|
If Claude Code 2.x or newer is the only reason you added that mapping, you can remove it, unless you want to use Claude Code in tmux, where it still requires that Ghostty mapping.
|
|
26
26
|
|
|
27
|
-
If you want `Shift+Enter` to keep working in tmux via that remap, add `ctrl+j` to your pi `newLine` keybinding in `~/.
|
|
27
|
+
If you want `Shift+Enter` to keep working in tmux via that remap, add `ctrl+j` to your pi `newLine` keybinding in `~/.aery/agent/keybindings.json`:
|
|
28
28
|
|
|
29
29
|
```json
|
|
30
30
|
{
|
package/docs/termux.md
CHANGED
|
@@ -20,7 +20,7 @@ pkg install nodejs termux-api git
|
|
|
20
20
|
npm install -g @eminent337/aery
|
|
21
21
|
|
|
22
22
|
# Create config directory
|
|
23
|
-
mkdir -p ~/.
|
|
23
|
+
mkdir -p ~/.aery/agent
|
|
24
24
|
|
|
25
25
|
# Run pi
|
|
26
26
|
pi
|
|
@@ -34,7 +34,7 @@ Image clipboard is not supported on Termux (the `ctrl+v` image paste feature wil
|
|
|
34
34
|
|
|
35
35
|
## Example AGENTS.md for Termux
|
|
36
36
|
|
|
37
|
-
Create `~/.
|
|
37
|
+
Create `~/.aery/agent/AGENTS.md` to help the agent understand the Termux environment:
|
|
38
38
|
|
|
39
39
|
```markdown
|
|
40
40
|
# Agent Environment: Termux on Android
|
package/docs/themes.md
CHANGED
|
@@ -19,9 +19,9 @@ Themes are JSON files that define colors for the TUI.
|
|
|
19
19
|
Pi loads themes from:
|
|
20
20
|
|
|
21
21
|
- Built-in: `dark`, `light`
|
|
22
|
-
- Global: `~/.
|
|
23
|
-
- Project: `.
|
|
24
|
-
- Packages: `themes/` directories or `
|
|
22
|
+
- Global: `~/.aery/agent/themes/*.json`
|
|
23
|
+
- Project: `.aery/themes/*.json`
|
|
24
|
+
- Packages: `themes/` directories or `aery.themes` entries in `package.json`
|
|
25
25
|
- Settings: `themes` array with files or directories
|
|
26
26
|
- CLI: `--theme <path>` (repeatable)
|
|
27
27
|
|
|
@@ -44,8 +44,8 @@ On first run, pi detects your terminal background and defaults to `dark` or `lig
|
|
|
44
44
|
1. Create a theme file:
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
|
-
mkdir -p ~/.
|
|
48
|
-
vim ~/.
|
|
47
|
+
mkdir -p ~/.aery/agent/themes
|
|
48
|
+
vim ~/.aery/agent/themes/my-theme.json
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
2. Define the theme with all required colors (see [Color Tokens](#color-tokens)):
|
package/docs/tree.md
CHANGED
|
@@ -216,7 +216,7 @@ interface SessionTreeEvent {
|
|
|
216
216
|
|
|
217
217
|
```typescript
|
|
218
218
|
export default function(pi: HookAPI) {
|
|
219
|
-
|
|
219
|
+
aery.on("session_before_tree", async (event, ctx) => {
|
|
220
220
|
if (!event.preparation.userWantsSummary) return;
|
|
221
221
|
if (event.preparation.entriesToSummarize.length === 0) return;
|
|
222
222
|
|
package/docs/tui.md
CHANGED
|
@@ -89,18 +89,18 @@ Without this propagation, typing with an IME (Chinese, Japanese, Korean, etc.) w
|
|
|
89
89
|
**In extensions** via `ctx.ui.custom()`:
|
|
90
90
|
|
|
91
91
|
```typescript
|
|
92
|
-
|
|
92
|
+
aery.on("session_start", async (_event, ctx) => {
|
|
93
93
|
const handle = ctx.ui.custom(myComponent);
|
|
94
94
|
// handle.requestRender() - trigger re-render
|
|
95
95
|
// handle.close() - restore normal UI
|
|
96
96
|
});
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
**In custom tools** via `
|
|
99
|
+
**In custom tools** via `aery.ui.custom()`:
|
|
100
100
|
|
|
101
101
|
```typescript
|
|
102
102
|
async execute(toolCallId, params, onUpdate, ctx, signal) {
|
|
103
|
-
const handle =
|
|
103
|
+
const handle = aery.ui.custom(myComponent);
|
|
104
104
|
// ...
|
|
105
105
|
handle.close();
|
|
106
106
|
}
|
|
@@ -363,7 +363,7 @@ class MySelector {
|
|
|
363
363
|
Usage in an extension:
|
|
364
364
|
|
|
365
365
|
```typescript
|
|
366
|
-
|
|
366
|
+
aery.registerCommand("pick", {
|
|
367
367
|
description: "Pick an item",
|
|
368
368
|
handler: async (args, ctx) => {
|
|
369
369
|
const items = ["Option A", "Option B", "Option C"];
|
|
@@ -594,7 +594,7 @@ import type { ExtensionAPI } from "@eminent337/aery";
|
|
|
594
594
|
import { DynamicBorder } from "@eminent337/aery";
|
|
595
595
|
import { Container, type SelectItem, SelectList, Text } from "@eminent337/aery-tui";
|
|
596
596
|
|
|
597
|
-
|
|
597
|
+
aery.registerCommand("pick", {
|
|
598
598
|
handler: async (_args, ctx) => {
|
|
599
599
|
const items: SelectItem[] = [
|
|
600
600
|
{ value: "opt1", label: "Option 1", description: "First option" },
|
|
@@ -652,7 +652,7 @@ For operations that take time and should be cancellable. `BorderedLoader` shows
|
|
|
652
652
|
```typescript
|
|
653
653
|
import { BorderedLoader } from "@eminent337/aery";
|
|
654
654
|
|
|
655
|
-
|
|
655
|
+
aery.registerCommand("fetch", {
|
|
656
656
|
handler: async (_args, ctx) => {
|
|
657
657
|
const result = await ctx.ui.custom<string | null>((tui, theme, _kb, done) => {
|
|
658
658
|
const loader = new BorderedLoader(tui, theme, "Fetching data...");
|
|
@@ -685,7 +685,7 @@ For toggling multiple settings. Use `SettingsList` from `@eminent337/aery-tui` w
|
|
|
685
685
|
import { getSettingsListTheme } from "@eminent337/aery";
|
|
686
686
|
import { Container, type SettingItem, SettingsList, Text } from "@eminent337/aery-tui";
|
|
687
687
|
|
|
688
|
-
|
|
688
|
+
aery.registerCommand("settings", {
|
|
689
689
|
handler: async (_args, ctx) => {
|
|
690
690
|
const items: SettingItem[] = [
|
|
691
691
|
{ id: "verbose", label: "Verbose mode", currentValue: "off", values: ["on", "off"] },
|
|
@@ -874,8 +874,8 @@ class VimEditor extends CustomEditor {
|
|
|
874
874
|
}
|
|
875
875
|
}
|
|
876
876
|
|
|
877
|
-
export default function (
|
|
878
|
-
|
|
877
|
+
export default function (aery: ExtensionAPI) {
|
|
878
|
+
aery.on("session_start", (_event, ctx) => {
|
|
879
879
|
// Factory receives theme and keybindings from the app
|
|
880
880
|
ctx.ui.setEditorComponent((tui, theme, keybindings) =>
|
|
881
881
|
new VimEditor(theme, keybindings)
|
package/docs/windows.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Pi requires a bash shell on Windows. Checked locations (in order):
|
|
4
4
|
|
|
5
|
-
1. Custom path from `~/.
|
|
5
|
+
1. Custom path from `~/.aery/agent/settings.json`
|
|
6
6
|
2. Git Bash (`C:\Program Files\Git\bin\bash.exe`)
|
|
7
7
|
3. `bash.exe` on PATH (Cygwin, MSYS2, WSL)
|
|
8
8
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eminent337/aery",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.29",
|
|
4
4
|
"description": "Aery \u2014 AI coding agent by Aryee",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"aeryConfig": {
|
|
@@ -98,5 +98,6 @@
|
|
|
98
98
|
},
|
|
99
99
|
"engines": {
|
|
100
100
|
"node": ">=20.6.0"
|
|
101
|
-
}
|
|
101
|
+
},
|
|
102
|
+
"homepage": "https://eminent337.github.io"
|
|
102
103
|
}
|