@oh-my-pi/cli 0.1.0 → 0.3.0
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/.github/icon.png +0 -0
- package/.github/logo.png +0 -0
- package/.github/workflows/publish.yml +1 -1
- package/LICENSE +21 -0
- package/README.md +243 -138
- package/biome.json +1 -1
- package/bun.lock +59 -0
- package/dist/cli.js +6311 -2900
- package/dist/commands/config.d.ts +32 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/enable.d.ts +1 -0
- package/dist/commands/enable.d.ts.map +1 -1
- package/dist/commands/env.d.ts +14 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/features.d.ts +25 -0
- package/dist/commands/features.d.ts.map +1 -0
- package/dist/commands/info.d.ts +1 -0
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/install.d.ts +37 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/link.d.ts +2 -0
- package/dist/commands/link.d.ts.map +1 -1
- package/dist/commands/list.d.ts +1 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/outdated.d.ts +1 -0
- package/dist/commands/outdated.d.ts.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/uninstall.d.ts +1 -0
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/update.d.ts +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/why.d.ts +1 -0
- package/dist/commands/why.d.ts.map +1 -1
- package/dist/conflicts.d.ts +9 -1
- package/dist/conflicts.d.ts.map +1 -1
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/index.d.ts +18 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/lock.d.ts +3 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lockfile.d.ts +52 -0
- package/dist/lockfile.d.ts.map +1 -0
- package/dist/manifest.d.ts +60 -25
- package/dist/manifest.d.ts.map +1 -1
- package/dist/npm.d.ts +14 -2
- package/dist/npm.d.ts.map +1 -1
- package/dist/paths.d.ts +34 -3
- package/dist/paths.d.ts.map +1 -1
- package/dist/runtime.d.ts +14 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/symlinks.d.ts +43 -7
- package/dist/symlinks.d.ts.map +1 -1
- package/package.json +11 -5
- package/plugins/exa/README.md +153 -0
- package/plugins/exa/package.json +56 -0
- package/plugins/exa/tools/exa/company.ts +35 -0
- package/plugins/exa/tools/exa/index.ts +66 -0
- package/plugins/exa/tools/exa/linkedin.ts +35 -0
- package/plugins/exa/tools/exa/researcher.ts +40 -0
- package/plugins/exa/tools/exa/runtime.json +4 -0
- package/plugins/exa/tools/exa/search.ts +46 -0
- package/plugins/exa/tools/exa/shared.ts +230 -0
- package/plugins/exa/tools/exa/websets.ts +62 -0
- package/plugins/metal-theme/package.json +7 -2
- package/plugins/subagents/package.json +7 -2
- package/plugins/user-prompt/README.md +130 -0
- package/plugins/user-prompt/package.json +19 -0
- package/plugins/user-prompt/tools/user-prompt/index.ts +235 -0
- package/src/cli.ts +133 -58
- package/src/commands/config.ts +384 -0
- package/src/commands/create.ts +51 -1
- package/src/commands/doctor.ts +95 -7
- package/src/commands/enable.ts +25 -8
- package/src/commands/env.ts +38 -0
- package/src/commands/features.ts +295 -0
- package/src/commands/info.ts +41 -5
- package/src/commands/init.ts +20 -2
- package/src/commands/install.ts +453 -80
- package/src/commands/link.ts +60 -9
- package/src/commands/list.ts +122 -7
- package/src/commands/outdated.ts +17 -6
- package/src/commands/search.ts +20 -3
- package/src/commands/uninstall.ts +57 -6
- package/src/commands/update.ts +67 -9
- package/src/commands/why.ts +47 -16
- package/src/conflicts.ts +33 -1
- package/src/errors.ts +22 -0
- package/src/index.ts +18 -25
- package/src/lock.ts +46 -0
- package/src/lockfile.ts +132 -0
- package/src/manifest.ts +219 -71
- package/src/npm.ts +74 -18
- package/src/paths.ts +77 -12
- package/src/runtime.ts +116 -0
- package/src/symlinks.ts +291 -35
- package/tsconfig.json +7 -3
- package/CHECK.md +0 -352
- package/dist/migrate.d.ts +0 -9
- package/dist/migrate.d.ts.map +0 -1
- package/src/migrate.ts +0 -181
package/.github/icon.png
ADDED
|
Binary file
|
package/.github/logo.png
ADDED
|
Binary file
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025
|
|
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.
|
package/README.md
CHANGED
|
@@ -1,10 +1,28 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src=".github/logo.png?raw=true" alt="Oh My Pi" height="300">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
<p align="center">
|
|
6
|
+
<strong>Plugin manager for <a href="https://github.com/badlogic/pi-mono">pi</a>.</strong>
|
|
7
|
+
</p>
|
|
4
8
|
|
|
5
|
-
|
|
9
|
+
<p align="center">
|
|
10
|
+
Like oh-my-zsh, but for your AI coding assistant.
|
|
11
|
+
</p>
|
|
6
12
|
|
|
7
|
-
|
|
13
|
+
<p align="center">
|
|
14
|
+
<a href="https://www.npmjs.com/package/@oh-my-pi/cli"><img src="https://img.shields.io/npm/v/@oh-my-pi/cli?style=flat&colorA=18181B&colorB=F0DB4F" alt="npm version"></a>
|
|
15
|
+
<a href="https://github.com/can1357/oh-my-pi/actions"><img src="https://img.shields.io/github/actions/workflow/status/can1357/oh-my-pi/ci.yml?style=flat&colorA=18181B" alt="CI"></a>
|
|
16
|
+
<a href="https://github.com/can1357/oh-my-pi/blob/main/LICENSE"><img src="https://img.shields.io/github/license/can1357/oh-my-pi?style=flat&colorA=18181B" alt="License"></a>
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
**Oh My Pi won't make Claude write better code...** but it might make _you_ feel like it does.
|
|
22
|
+
|
|
23
|
+
Install community plugins with a single command. Themes, custom agents, slash commands, tools — all managed through npm, all a `omp install` away.
|
|
24
|
+
|
|
25
|
+
No more copy-pasting prompt files. No more manually symlinking configs. Just vibes.
|
|
8
26
|
|
|
9
27
|
## Installation
|
|
10
28
|
|
|
@@ -15,210 +33,297 @@ npm install -g @oh-my-pi/cli
|
|
|
15
33
|
## Quick Start
|
|
16
34
|
|
|
17
35
|
```bash
|
|
36
|
+
# Initialize a project-local plugin config (optional)
|
|
37
|
+
omp init
|
|
38
|
+
|
|
18
39
|
# Search for plugins
|
|
19
40
|
omp search agents
|
|
20
41
|
|
|
21
42
|
# Install a plugin
|
|
22
43
|
omp install @oh-my-pi/subagents
|
|
23
44
|
|
|
24
|
-
#
|
|
45
|
+
# See what you've got
|
|
25
46
|
omp list
|
|
26
47
|
|
|
27
48
|
# Check for updates
|
|
28
49
|
omp outdated
|
|
29
50
|
|
|
30
|
-
# Update
|
|
51
|
+
# Update everything
|
|
31
52
|
omp update
|
|
32
53
|
```
|
|
33
54
|
|
|
34
|
-
##
|
|
55
|
+
## How It Works
|
|
35
56
|
|
|
36
|
-
|
|
57
|
+
omp installs plugins via npm and symlinks their files into your pi configuration directory:
|
|
37
58
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
59
|
+
```
|
|
60
|
+
~/.pi/
|
|
61
|
+
├── agent/ # Where plugin files get symlinked
|
|
62
|
+
│ ├── agents/ # Agent definitions (.md)
|
|
63
|
+
│ ├── commands/ # Slash commands (.md)
|
|
64
|
+
│ ├── tools/ # Custom tools (.ts)
|
|
65
|
+
│ └── themes/ # Theme files (.json)
|
|
66
|
+
└── plugins/ # Plugin storage
|
|
67
|
+
├── package.json # Installed plugins manifest
|
|
68
|
+
└── node_modules/ # Actual plugin packages
|
|
69
|
+
```
|
|
45
70
|
|
|
46
|
-
|
|
71
|
+
Plugins declare which files to install via the `omp.install` field in their `package.json`. omp creates symlinks from the plugin's files into the appropriate `~/.pi/agent/` subdirectories.
|
|
47
72
|
|
|
48
|
-
|
|
49
|
-
|------------------------|--------------------------------------------|
|
|
50
|
-
| `omp search <query>` | Search npm for omp-plugin keyword |
|
|
51
|
-
| `omp info <pkg>` | Show plugin details before install |
|
|
52
|
-
| `omp outdated` | List plugins with newer versions |
|
|
73
|
+
## Global vs Local Plugins
|
|
53
74
|
|
|
54
|
-
|
|
75
|
+
omp supports both global and project-local plugin configurations:
|
|
55
76
|
|
|
56
|
-
|
|
|
57
|
-
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
| `omp why <file>` | Show which plugin installed a file |
|
|
61
|
-
| `omp enable/disable <pkg>` | Toggle plugin without uninstall |
|
|
77
|
+
| Scope | Config Location | Agent Directory | Use Case |
|
|
78
|
+
|-------|-----------------|-----------------|----------|
|
|
79
|
+
| Global | `~/.pi/plugins/` | `~/.pi/agent/` | Personal defaults |
|
|
80
|
+
| Local | `.pi/` | `.pi/agent/` | Project-specific plugins |
|
|
62
81
|
|
|
63
|
-
|
|
82
|
+
```bash
|
|
83
|
+
# Explicit scope
|
|
84
|
+
omp install -g @oh-my-pi/subagents # Global
|
|
85
|
+
omp install -l @oh-my-pi/subagents # Local
|
|
64
86
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
| `omp link <path>` | Symlink local plugin for dev |
|
|
87
|
+
# Auto-detect: uses local if .pi/plugins.json exists, otherwise global
|
|
88
|
+
omp install @oh-my-pi/subagents
|
|
89
|
+
```
|
|
69
90
|
|
|
70
|
-
|
|
91
|
+
Initialize a project-local config with `omp init`.
|
|
71
92
|
|
|
72
|
-
|
|
73
|
-
- `--save / -S`: Add to plugins.json
|
|
74
|
-
- `--json`: Machine-readable output
|
|
75
|
-
- `--force`: Overwrite conflicts
|
|
93
|
+
## Commands
|
|
76
94
|
|
|
77
|
-
|
|
95
|
+
| Command | Alias | Description |
|
|
96
|
+
|---------|-------|-------------|
|
|
97
|
+
| `omp install [pkg...]` | `i` | Install plugin(s). No args = install from plugins.json |
|
|
98
|
+
| `omp uninstall <pkg>` | `rm` | Remove plugin and its symlinks |
|
|
99
|
+
| `omp update [pkg]` | `up` | Update to latest within semver range |
|
|
100
|
+
| `omp list` | `ls` | Show installed plugins |
|
|
101
|
+
| `omp search <query>` | | Search npm for plugins |
|
|
102
|
+
| `omp info <pkg>` | | Show plugin details before install |
|
|
103
|
+
| `omp outdated` | | List plugins with newer versions |
|
|
104
|
+
| `omp doctor` | | Check for broken symlinks, conflicts |
|
|
105
|
+
| `omp link <path>` | | Symlink local plugin (dev mode) |
|
|
106
|
+
| `omp create <name>` | | Scaffold new plugin from template |
|
|
107
|
+
| `omp init` | | Create .pi/plugins.json in current project |
|
|
108
|
+
| `omp why <file>` | | Show which plugin installed a file |
|
|
109
|
+
| `omp enable <name>` | | Enable a disabled plugin |
|
|
110
|
+
| `omp disable <name>` | | Disable plugin without uninstalling |
|
|
111
|
+
| `omp features <name>` | | List or configure plugin features |
|
|
112
|
+
| `omp config <name>` | | Get or set plugin configuration variables |
|
|
113
|
+
| `omp env` | | Print environment variables for shell eval |
|
|
114
|
+
|
|
115
|
+
Most commands accept `-g`/`--global` or `-l`/`--local` flags to override scope auto-detection.
|
|
116
|
+
|
|
117
|
+
## Feature Selection
|
|
118
|
+
|
|
119
|
+
Plugins can expose optional features that you can selectively enable. Use pip-style bracket syntax during install:
|
|
78
120
|
|
|
79
|
-
|
|
121
|
+
```bash
|
|
122
|
+
# Install with default features (plugin decides which are on by default)
|
|
123
|
+
omp install @oh-my-pi/exa
|
|
80
124
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
125
|
+
# Install with specific features only
|
|
126
|
+
omp install @oh-my-pi/exa[search]
|
|
127
|
+
omp install @oh-my-pi/exa[search,websets]
|
|
128
|
+
|
|
129
|
+
# Explicitly all features
|
|
130
|
+
omp install @oh-my-pi/exa[*]
|
|
131
|
+
|
|
132
|
+
# No optional features (core only)
|
|
133
|
+
omp install @oh-my-pi/exa[]
|
|
134
|
+
|
|
135
|
+
# Reinstall preserves feature selection unless you specify new ones
|
|
136
|
+
omp install @oh-my-pi/exa # Keeps existing features
|
|
137
|
+
omp install @oh-my-pi/exa[search] # Reconfigures to search only
|
|
95
138
|
```
|
|
96
139
|
|
|
97
|
-
|
|
140
|
+
Plugins define which features are enabled by default via `default: true` in their manifest. Features with `default: false` are opt-in.
|
|
98
141
|
|
|
99
|
-
|
|
100
|
-
- No namespace required (but `omp-` prefix is recommended)
|
|
101
|
-
- Use semver for versioning
|
|
142
|
+
Manage features after install with `omp features`:
|
|
102
143
|
|
|
103
|
-
|
|
144
|
+
```bash
|
|
145
|
+
# List available features and their current state
|
|
146
|
+
omp features @oh-my-pi/exa
|
|
104
147
|
|
|
105
|
-
|
|
148
|
+
# Enable/disable specific features
|
|
149
|
+
omp features @oh-my-pi/exa --enable websets
|
|
150
|
+
omp features @oh-my-pi/exa --disable search
|
|
106
151
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
├── plugins/
|
|
110
|
-
│ ├── node_modules/ # npm-managed
|
|
111
|
-
│ │ ├── @oh-my-pi/subagents/
|
|
112
|
-
│ │ └── @oh-my-pi/metal-theme/
|
|
113
|
-
│ ├── package.json # Global plugin manifest
|
|
114
|
-
│ └── package-lock.json # Lock file
|
|
115
|
-
├── agent/ # Symlink targets
|
|
116
|
-
│ ├── agents/
|
|
117
|
-
│ ├── tools/
|
|
118
|
-
│ ├── themes/
|
|
119
|
-
│ └── commands/
|
|
152
|
+
# Set exact feature list
|
|
153
|
+
omp features @oh-my-pi/exa --set search,websets
|
|
120
154
|
```
|
|
121
155
|
|
|
122
|
-
|
|
156
|
+
## Plugin Configuration
|
|
123
157
|
|
|
124
|
-
|
|
125
|
-
.pi/
|
|
126
|
-
├── plugins.json # Project plugin config
|
|
127
|
-
├── plugins-lock.json # Lock file
|
|
128
|
-
└── node_modules/ # Project-scoped installs
|
|
129
|
-
└── omp-my-plugin/
|
|
130
|
-
```
|
|
158
|
+
Plugins can define configurable variables. Manage them with `omp config`:
|
|
131
159
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
160
|
+
```bash
|
|
161
|
+
# List all variables for a plugin
|
|
162
|
+
omp config @oh-my-pi/exa
|
|
163
|
+
|
|
164
|
+
# Get a specific value
|
|
165
|
+
omp config @oh-my-pi/exa apiKey
|
|
166
|
+
|
|
167
|
+
# Set a value
|
|
168
|
+
omp config @oh-my-pi/exa apiKey sk-xxx
|
|
169
|
+
|
|
170
|
+
# Reset to default
|
|
171
|
+
omp config @oh-my-pi/exa apiKey --delete
|
|
140
172
|
```
|
|
141
173
|
|
|
142
|
-
|
|
174
|
+
Variables with `env` mappings can be exported as environment variables:
|
|
143
175
|
|
|
144
176
|
```bash
|
|
145
|
-
|
|
177
|
+
# Print shell exports
|
|
178
|
+
eval "$(omp env)"
|
|
179
|
+
|
|
180
|
+
# Fish shell
|
|
181
|
+
omp env --fish | source
|
|
182
|
+
|
|
183
|
+
# Persist in your shell config
|
|
184
|
+
omp env >> ~/.bashrc
|
|
146
185
|
```
|
|
147
186
|
|
|
148
|
-
|
|
149
|
-
2. Check for conflicts (same dest from different plugins)
|
|
150
|
-
3. `npm install --prefix ~/.pi/plugins omp-subagents`
|
|
151
|
-
4. Read package.json → omp.install
|
|
152
|
-
5. For each {src, dest}: symlink to ~/.pi/{dest}
|
|
153
|
-
6. Recursively process dependencies with omp field
|
|
154
|
-
7. Update package.json
|
|
187
|
+
## Creating Plugins
|
|
155
188
|
|
|
156
|
-
|
|
189
|
+
Plugins are npm packages with an `omp` field in `package.json`:
|
|
157
190
|
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
|
|
191
|
+
```json
|
|
192
|
+
{
|
|
193
|
+
"name": "my-cool-plugin",
|
|
194
|
+
"version": "1.0.0",
|
|
195
|
+
"keywords": ["omp-plugin"],
|
|
196
|
+
"omp": {
|
|
197
|
+
"install": [
|
|
198
|
+
{ "src": "agents/researcher.md", "dest": "agent/agents/researcher.md" },
|
|
199
|
+
{ "src": "commands/research.md", "dest": "agent/commands/research.md" }
|
|
200
|
+
]
|
|
201
|
+
},
|
|
202
|
+
"files": ["agents", "commands", "tools", "themes"]
|
|
203
|
+
}
|
|
161
204
|
```
|
|
162
205
|
|
|
163
|
-
|
|
206
|
+
### Features and Variables
|
|
164
207
|
|
|
165
|
-
|
|
166
|
-
|
|
208
|
+
Plugins can define optional features and configurable variables:
|
|
209
|
+
|
|
210
|
+
```json
|
|
211
|
+
{
|
|
212
|
+
"name": "@oh-my-pi/exa",
|
|
213
|
+
"version": "1.0.0",
|
|
214
|
+
"keywords": ["omp-plugin"],
|
|
215
|
+
"omp": {
|
|
216
|
+
"install": [
|
|
217
|
+
{ "src": "tools/core.ts", "dest": "agent/tools/exa/core.ts" }
|
|
218
|
+
],
|
|
219
|
+
"variables": {
|
|
220
|
+
"apiKey": {
|
|
221
|
+
"type": "string",
|
|
222
|
+
"env": "EXA_API_KEY",
|
|
223
|
+
"description": "Exa API key",
|
|
224
|
+
"required": true
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
"features": {
|
|
228
|
+
"search": {
|
|
229
|
+
"description": "Web search capabilities",
|
|
230
|
+
"default": true,
|
|
231
|
+
"install": [
|
|
232
|
+
{ "src": "tools/search.ts", "dest": "agent/tools/exa/search.ts" }
|
|
233
|
+
]
|
|
234
|
+
},
|
|
235
|
+
"websets": {
|
|
236
|
+
"description": "Curated content collections",
|
|
237
|
+
"default": false,
|
|
238
|
+
"install": [
|
|
239
|
+
{ "src": "tools/websets.ts", "dest": "agent/tools/exa/websets.ts" }
|
|
240
|
+
],
|
|
241
|
+
"variables": {
|
|
242
|
+
"defaultCollection": {
|
|
243
|
+
"type": "string",
|
|
244
|
+
"default": "general"
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
167
251
|
```
|
|
168
252
|
|
|
169
|
-
|
|
253
|
+
### Plugin Structure
|
|
254
|
+
|
|
170
255
|
```
|
|
171
|
-
|
|
256
|
+
my-cool-plugin/
|
|
172
257
|
├── package.json
|
|
173
|
-
├──
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
├──
|
|
178
|
-
└──
|
|
258
|
+
├── agents/ # Agent definitions
|
|
259
|
+
│ └── researcher.md
|
|
260
|
+
├── commands/ # Slash commands
|
|
261
|
+
│ └── research.md
|
|
262
|
+
├── tools/ # Custom tools
|
|
263
|
+
│ └── search/
|
|
264
|
+
│ └── index.ts
|
|
265
|
+
└── themes/ # Theme files
|
|
266
|
+
└── dark.json
|
|
179
267
|
```
|
|
180
268
|
|
|
269
|
+
### Install Mappings
|
|
270
|
+
|
|
271
|
+
The `omp.install` array maps source files to their destination in the agent directory:
|
|
272
|
+
|
|
273
|
+
- `src`: Path relative to the plugin root
|
|
274
|
+
- `dest`: Path relative to the pi config dir (usually starts with `agent/`)
|
|
275
|
+
|
|
181
276
|
### Publishing
|
|
182
277
|
|
|
183
|
-
1.
|
|
184
|
-
2.
|
|
278
|
+
1. Add `omp-plugin` to your `keywords` array (required for `omp search` discovery)
|
|
279
|
+
2. Include source directories in the `files` array
|
|
185
280
|
3. Publish to npm: `npm publish`
|
|
186
|
-
4. Users install with: `omp install your-package-name`
|
|
187
281
|
|
|
188
|
-
|
|
282
|
+
Your plugin is now discoverable via `omp search`.
|
|
189
283
|
|
|
190
|
-
|
|
284
|
+
### Development Workflow
|
|
191
285
|
|
|
192
286
|
```bash
|
|
193
|
-
|
|
194
|
-
|
|
287
|
+
# Scaffold a new plugin
|
|
288
|
+
omp create my-plugin
|
|
195
289
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
2. Move plugins to node_modules structure
|
|
199
|
-
3. Re-create symlinks
|
|
200
|
-
4. Archive old manifest.json
|
|
290
|
+
# Link for local development (changes reflect immediately)
|
|
291
|
+
omp link ./my-plugin
|
|
201
292
|
|
|
202
|
-
|
|
293
|
+
# Test your plugin
|
|
294
|
+
omp list
|
|
203
295
|
|
|
204
|
-
|
|
296
|
+
# When ready, publish
|
|
297
|
+
cd my-plugin && npm publish
|
|
298
|
+
```
|
|
205
299
|
|
|
206
|
-
|
|
207
|
-
- **@oh-my-pi/metal-theme** - Metal theme for pi
|
|
300
|
+
## Bundled Plugins
|
|
208
301
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
302
|
+
- **[@oh-my-pi/subagents](https://npmjs.com/package/@oh-my-pi/subagents)**: Task delegation with specialized sub-agents (task, planner, explore, reviewer)
|
|
303
|
+
- **[@oh-my-pi/metal-theme](https://npmjs.com/package/@oh-my-pi/metal-theme)**: A metal theme
|
|
304
|
+
- **[@oh-my-pi/exa](https://npmjs.com/package/@oh-my-pi/exa)**: Exa AI-powered web search and websets tools
|
|
305
|
+
- **[@oh-my-pi/user-prompt](https://npmjs.com/package/@oh-my-pi/user-prompt)**: Interactive user prompting for gathering input during agent execution
|
|
306
|
+
|
|
307
|
+
## Troubleshooting
|
|
215
308
|
|
|
216
|
-
Or link for development:
|
|
217
309
|
```bash
|
|
218
|
-
|
|
219
|
-
omp
|
|
310
|
+
# Check for broken symlinks and conflicts
|
|
311
|
+
omp doctor
|
|
312
|
+
|
|
313
|
+
# See which plugin installed a specific file
|
|
314
|
+
omp why ~/.pi/agent/agents/researcher.md
|
|
315
|
+
|
|
316
|
+
# Temporarily disable a plugin
|
|
317
|
+
omp disable @oh-my-pi/subagents
|
|
318
|
+
|
|
319
|
+
# Re-enable it later
|
|
320
|
+
omp enable @oh-my-pi/subagents
|
|
220
321
|
```
|
|
221
322
|
|
|
323
|
+
## Credits
|
|
324
|
+
|
|
325
|
+
Built for [pi](https://github.com/badlogic/pi-mono) by [@badlogic](https://github.com/badlogic).
|
|
326
|
+
|
|
222
327
|
## License
|
|
223
328
|
|
|
224
329
|
MIT
|
package/biome.json
CHANGED
package/bun.lock
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"": {
|
|
6
6
|
"name": "oh-my-pi",
|
|
7
7
|
"dependencies": {
|
|
8
|
+
"@inquirer/prompts": "^8.1.0",
|
|
8
9
|
"chalk": "^5.3.0",
|
|
9
10
|
"commander": "^12.0.0",
|
|
10
11
|
},
|
|
@@ -35,16 +36,74 @@
|
|
|
35
36
|
|
|
36
37
|
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.5", "", { "os": "win32", "cpu": "x64" }, "sha512-nUmR8gb6yvrKhtRgzwo/gDimPwnO5a4sCydf8ZS2kHIJhEmSmk+STsusr1LHTuM//wXppBawvSQi2xFXJCdgKQ=="],
|
|
37
38
|
|
|
39
|
+
"@inquirer/ansi": ["@inquirer/ansi@2.0.2", "", {}, "sha512-SYLX05PwJVnW+WVegZt1T4Ip1qba1ik+pNJPDiqvk6zS5Y/i8PhRzLpGEtVd7sW0G8cMtkD8t4AZYhQwm8vnww=="],
|
|
40
|
+
|
|
41
|
+
"@inquirer/checkbox": ["@inquirer/checkbox@5.0.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.2", "@inquirer/core": "^11.1.0", "@inquirer/figures": "^2.0.2", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-xtQP2eXMFlOcAhZ4ReKP2KZvDIBb1AnCfZ81wWXG3DXLVH0f0g4obE0XDPH+ukAEMRcZT0kdX2AS1jrWGXbpxw=="],
|
|
42
|
+
|
|
43
|
+
"@inquirer/confirm": ["@inquirer/confirm@6.0.3", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-lyEvibDFL+NA5R4xl8FUmNhmu81B+LDL9L/MpKkZlQDJZXzG8InxiqYxiAlQYa9cqLLhYqKLQwZqXmSTqCLjyw=="],
|
|
44
|
+
|
|
45
|
+
"@inquirer/core": ["@inquirer/core@11.1.0", "", { "dependencies": { "@inquirer/ansi": "^2.0.2", "@inquirer/figures": "^2.0.2", "@inquirer/type": "^4.0.2", "cli-width": "^4.1.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^9.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-+jD/34T1pK8M5QmZD/ENhOfXdl9Zr+BrQAUc5h2anWgi7gggRq15ZbiBeLoObj0TLbdgW7TAIQRU2boMc9uOKQ=="],
|
|
46
|
+
|
|
47
|
+
"@inquirer/editor": ["@inquirer/editor@5.0.3", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/external-editor": "^2.0.2", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-wYyQo96TsAqIciP/r5D3cFeV8h4WqKQ/YOvTg5yOfP2sqEbVVpbxPpfV3LM5D0EP4zUI3EZVHyIUIllnoIa8OQ=="],
|
|
48
|
+
|
|
49
|
+
"@inquirer/expand": ["@inquirer/expand@5.0.3", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-2oINvuL27ujjxd95f6K2K909uZOU2x1WiAl7Wb1X/xOtL8CgQ1kSxzykIr7u4xTkXkXOAkCuF45T588/YKee7w=="],
|
|
50
|
+
|
|
51
|
+
"@inquirer/external-editor": ["@inquirer/external-editor@2.0.2", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-X/fMXK7vXomRWEex1j8mnj7s1mpnTeP4CO/h2gysJhHLT2WjBnLv4ZQEGpm/kcYI8QfLZ2fgW+9kTKD+jeopLg=="],
|
|
52
|
+
|
|
53
|
+
"@inquirer/figures": ["@inquirer/figures@2.0.2", "", {}, "sha512-qXm6EVvQx/FmnSrCWCIGtMHwqeLgxABP8XgcaAoywsL0NFga9gD5kfG0gXiv80GjK9Hsoz4pgGwF/+CjygyV9A=="],
|
|
54
|
+
|
|
55
|
+
"@inquirer/input": ["@inquirer/input@5.0.3", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-4R0TdWl53dtp79Vs6Df2OHAtA2FVNqya1hND1f5wjHWxZJxwDMSNB1X5ADZJSsQKYAJ5JHCTO+GpJZ42mK0Otw=="],
|
|
56
|
+
|
|
57
|
+
"@inquirer/number": ["@inquirer/number@4.0.3", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-TjQLe93GGo5snRlu83JxE38ZPqj5ZVggL+QqqAF2oBA5JOJoxx25GG3EGH/XN/Os5WOmKfO8iLVdCXQxXRZIMQ=="],
|
|
58
|
+
|
|
59
|
+
"@inquirer/password": ["@inquirer/password@5.0.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.2", "@inquirer/core": "^11.1.0", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-rCozGbUMAHedTeYWEN8sgZH4lRCdgG/WinFkit6ZPsp8JaNg2T0g3QslPBS5XbpORyKP/I+xyBO81kFEvhBmjA=="],
|
|
60
|
+
|
|
61
|
+
"@inquirer/prompts": ["@inquirer/prompts@8.1.0", "", { "dependencies": { "@inquirer/checkbox": "^5.0.3", "@inquirer/confirm": "^6.0.3", "@inquirer/editor": "^5.0.3", "@inquirer/expand": "^5.0.3", "@inquirer/input": "^5.0.3", "@inquirer/number": "^4.0.3", "@inquirer/password": "^5.0.3", "@inquirer/rawlist": "^5.1.0", "@inquirer/search": "^4.0.3", "@inquirer/select": "^5.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-LsZMdKcmRNF5LyTRuZE5nWeOjganzmN3zwbtNfcs6GPh3I2TsTtF1UYZlbxVfhxd+EuUqLGs/Lm3Xt4v6Az1wA=="],
|
|
62
|
+
|
|
63
|
+
"@inquirer/rawlist": ["@inquirer/rawlist@5.1.0", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-yUCuVh0jW026Gr2tZlG3kHignxcrLKDR3KBp+eUgNz+BAdSeZk0e18yt2gyBr+giYhj/WSIHCmPDOgp1mT2niQ=="],
|
|
64
|
+
|
|
65
|
+
"@inquirer/search": ["@inquirer/search@4.0.3", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/figures": "^2.0.2", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-lzqVw0YwuKYetk5VwJ81Ba+dyVlhseHPx9YnRKQgwXdFS0kEavCz2gngnNhnMIxg8+j1N/rUl1t5s1npwa7bqg=="],
|
|
66
|
+
|
|
67
|
+
"@inquirer/select": ["@inquirer/select@5.0.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.2", "@inquirer/core": "^11.1.0", "@inquirer/figures": "^2.0.2", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-M+ynbwS0ecQFDYMFrQrybA0qL8DV0snpc4kKevCCNaTpfghsRowRY7SlQBeIYNzHqXtiiz4RG9vTOeb/udew7w=="],
|
|
68
|
+
|
|
69
|
+
"@inquirer/type": ["@inquirer/type@4.0.2", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cae7mzluplsjSdgFA6ACLygb5jC8alO0UUnFPyu0E7tNRPrL+q/f8VcSXp+cjZQ7l5CMpDpi2G1+IQvkOiL1Lw=="],
|
|
70
|
+
|
|
38
71
|
"@types/node": ["@types/node@22.19.3", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="],
|
|
39
72
|
|
|
73
|
+
"ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
|
|
74
|
+
|
|
75
|
+
"ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
|
|
76
|
+
|
|
40
77
|
"bun-types": ["bun-types@1.3.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="],
|
|
41
78
|
|
|
42
79
|
"chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
|
|
43
80
|
|
|
81
|
+
"chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="],
|
|
82
|
+
|
|
83
|
+
"cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="],
|
|
84
|
+
|
|
44
85
|
"commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
|
|
45
86
|
|
|
87
|
+
"emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
|
|
88
|
+
|
|
89
|
+
"get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
|
|
90
|
+
|
|
91
|
+
"iconv-lite": ["iconv-lite@0.7.1", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw=="],
|
|
92
|
+
|
|
93
|
+
"mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="],
|
|
94
|
+
|
|
95
|
+
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
|
|
96
|
+
|
|
97
|
+
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
|
98
|
+
|
|
99
|
+
"string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
|
100
|
+
|
|
101
|
+
"strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
|
|
102
|
+
|
|
46
103
|
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
|
47
104
|
|
|
48
105
|
"undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
|
|
106
|
+
|
|
107
|
+
"wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
|
|
49
108
|
}
|
|
50
109
|
}
|