@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.
Files changed (105) hide show
  1. package/.github/icon.png +0 -0
  2. package/.github/logo.png +0 -0
  3. package/.github/workflows/publish.yml +1 -1
  4. package/LICENSE +21 -0
  5. package/README.md +243 -138
  6. package/biome.json +1 -1
  7. package/bun.lock +59 -0
  8. package/dist/cli.js +6311 -2900
  9. package/dist/commands/config.d.ts +32 -0
  10. package/dist/commands/config.d.ts.map +1 -0
  11. package/dist/commands/create.d.ts.map +1 -1
  12. package/dist/commands/doctor.d.ts +1 -0
  13. package/dist/commands/doctor.d.ts.map +1 -1
  14. package/dist/commands/enable.d.ts +1 -0
  15. package/dist/commands/enable.d.ts.map +1 -1
  16. package/dist/commands/env.d.ts +14 -0
  17. package/dist/commands/env.d.ts.map +1 -0
  18. package/dist/commands/features.d.ts +25 -0
  19. package/dist/commands/features.d.ts.map +1 -0
  20. package/dist/commands/info.d.ts +1 -0
  21. package/dist/commands/info.d.ts.map +1 -1
  22. package/dist/commands/init.d.ts.map +1 -1
  23. package/dist/commands/install.d.ts +37 -0
  24. package/dist/commands/install.d.ts.map +1 -1
  25. package/dist/commands/link.d.ts +2 -0
  26. package/dist/commands/link.d.ts.map +1 -1
  27. package/dist/commands/list.d.ts +1 -0
  28. package/dist/commands/list.d.ts.map +1 -1
  29. package/dist/commands/outdated.d.ts +1 -0
  30. package/dist/commands/outdated.d.ts.map +1 -1
  31. package/dist/commands/search.d.ts.map +1 -1
  32. package/dist/commands/uninstall.d.ts +1 -0
  33. package/dist/commands/uninstall.d.ts.map +1 -1
  34. package/dist/commands/update.d.ts +1 -0
  35. package/dist/commands/update.d.ts.map +1 -1
  36. package/dist/commands/why.d.ts +1 -0
  37. package/dist/commands/why.d.ts.map +1 -1
  38. package/dist/conflicts.d.ts +9 -1
  39. package/dist/conflicts.d.ts.map +1 -1
  40. package/dist/errors.d.ts +8 -0
  41. package/dist/errors.d.ts.map +1 -0
  42. package/dist/index.d.ts +18 -19
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/lock.d.ts +3 -0
  45. package/dist/lock.d.ts.map +1 -0
  46. package/dist/lockfile.d.ts +52 -0
  47. package/dist/lockfile.d.ts.map +1 -0
  48. package/dist/manifest.d.ts +60 -25
  49. package/dist/manifest.d.ts.map +1 -1
  50. package/dist/npm.d.ts +14 -2
  51. package/dist/npm.d.ts.map +1 -1
  52. package/dist/paths.d.ts +34 -3
  53. package/dist/paths.d.ts.map +1 -1
  54. package/dist/runtime.d.ts +14 -0
  55. package/dist/runtime.d.ts.map +1 -0
  56. package/dist/symlinks.d.ts +43 -7
  57. package/dist/symlinks.d.ts.map +1 -1
  58. package/package.json +11 -5
  59. package/plugins/exa/README.md +153 -0
  60. package/plugins/exa/package.json +56 -0
  61. package/plugins/exa/tools/exa/company.ts +35 -0
  62. package/plugins/exa/tools/exa/index.ts +66 -0
  63. package/plugins/exa/tools/exa/linkedin.ts +35 -0
  64. package/plugins/exa/tools/exa/researcher.ts +40 -0
  65. package/plugins/exa/tools/exa/runtime.json +4 -0
  66. package/plugins/exa/tools/exa/search.ts +46 -0
  67. package/plugins/exa/tools/exa/shared.ts +230 -0
  68. package/plugins/exa/tools/exa/websets.ts +62 -0
  69. package/plugins/metal-theme/package.json +7 -2
  70. package/plugins/subagents/package.json +7 -2
  71. package/plugins/user-prompt/README.md +130 -0
  72. package/plugins/user-prompt/package.json +19 -0
  73. package/plugins/user-prompt/tools/user-prompt/index.ts +235 -0
  74. package/src/cli.ts +133 -58
  75. package/src/commands/config.ts +384 -0
  76. package/src/commands/create.ts +51 -1
  77. package/src/commands/doctor.ts +95 -7
  78. package/src/commands/enable.ts +25 -8
  79. package/src/commands/env.ts +38 -0
  80. package/src/commands/features.ts +295 -0
  81. package/src/commands/info.ts +41 -5
  82. package/src/commands/init.ts +20 -2
  83. package/src/commands/install.ts +453 -80
  84. package/src/commands/link.ts +60 -9
  85. package/src/commands/list.ts +122 -7
  86. package/src/commands/outdated.ts +17 -6
  87. package/src/commands/search.ts +20 -3
  88. package/src/commands/uninstall.ts +57 -6
  89. package/src/commands/update.ts +67 -9
  90. package/src/commands/why.ts +47 -16
  91. package/src/conflicts.ts +33 -1
  92. package/src/errors.ts +22 -0
  93. package/src/index.ts +18 -25
  94. package/src/lock.ts +46 -0
  95. package/src/lockfile.ts +132 -0
  96. package/src/manifest.ts +219 -71
  97. package/src/npm.ts +74 -18
  98. package/src/paths.ts +77 -12
  99. package/src/runtime.ts +116 -0
  100. package/src/symlinks.ts +291 -35
  101. package/tsconfig.json +7 -3
  102. package/CHECK.md +0 -352
  103. package/dist/migrate.d.ts +0 -9
  104. package/dist/migrate.d.ts.map +0 -1
  105. package/src/migrate.ts +0 -181
Binary file
Binary file
@@ -21,7 +21,7 @@ jobs:
21
21
 
22
22
  - uses: actions/setup-node@v4
23
23
  with:
24
- node-version: '20'
24
+ node-version: '24'
25
25
  registry-url: 'https://registry.npmjs.org'
26
26
 
27
27
  - name: Install dependencies
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
- # Oh My Pi (omp)
1
+ <p align="center">
2
+ <img src=".github/logo.png?raw=true" alt="Oh My Pi" height="300">
3
+ </p>
2
4
 
3
- Plugin manager for pi configuration. Like oh-my-zsh, but for pi.
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
- **v1.0 - npm-Native Architecture**
9
+ <p align="center">
10
+ Like oh-my-zsh, but for your AI coding assistant.
11
+ </p>
6
12
 
7
- Plugins are npm packages with an `omp` field in package.json. Discover plugins via npm, install with semver, and enjoy a familiar package management experience.
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
- # List installed plugins
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 all plugins
51
+ # Update everything
31
52
  omp update
32
53
  ```
33
54
 
34
- ## Commands
55
+ ## How It Works
35
56
 
36
- ### Core Commands
57
+ omp installs plugins via npm and symlinks their files into your pi configuration directory:
37
58
 
38
- | Command | Description |
39
- |----------------------|--------------------------------------------------------|
40
- | `omp install [pkg...]` | Install plugin(s). No args = install from plugins.json |
41
- | `omp uninstall <pkg>` | Remove plugin and its symlinks |
42
- | `omp update [pkg]` | Update to latest within semver range |
43
- | `omp list` | Show installed plugins |
44
- | `omp link <path>` | Symlink local plugin (dev mode) |
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
- ### Discovery & Info
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
- | Command | Description |
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
- ### Maintenance
75
+ omp supports both global and project-local plugin configurations:
55
76
 
56
- | Command | Description |
57
- |--------------------------|------------------------------------------|
58
- | `omp init` | Create .pi/plugins.json in current project |
59
- | `omp doctor` | Check for broken symlinks, conflicts |
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
- ### Plugin Development
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
- | Command | Description |
66
- |--------------------|--------------------------------|
67
- | `omp create <name>`| Scaffold new plugin from template |
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
- ### Flags
91
+ Initialize a project-local config with `omp init`.
71
92
 
72
- - `--global / -g`: Install to ~/.pi (default)
73
- - `--save / -S`: Add to plugins.json
74
- - `--json`: Machine-readable output
75
- - `--force`: Overwrite conflicts
93
+ ## Commands
76
94
 
77
- ## Plugin Format
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
- Plugins are npm packages with an `omp` field in package.json:
121
+ ```bash
122
+ # Install with default features (plugin decides which are on by default)
123
+ omp install @oh-my-pi/exa
80
124
 
81
- ```json
82
- {
83
- "name": "@oh-my-pi/subagents",
84
- "version": "1.0.0",
85
- "description": "Task delegation agents for pi-agent",
86
- "keywords": ["omp-plugin", "agents"],
87
- "omp": {
88
- "install": [
89
- { "src": "agents/task.md", "dest": "agent/agents/task.md" },
90
- { "src": "tools/task/", "dest": "agent/tools/task/" }
91
- ]
92
- },
93
- "files": ["agents", "tools"]
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
- ### Convention
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
- - Include `omp-plugin` keyword for discoverability
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
- ## Directory Structure
144
+ ```bash
145
+ # List available features and their current state
146
+ omp features @oh-my-pi/exa
104
147
 
105
- ### Global (default)
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
- ~/.pi/
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
- ### Project-Local
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
- Project plugins.json:
133
- ```json
134
- {
135
- "plugins": {
136
- "@oh-my-pi/subagents": "^2.0.0",
137
- "@oh-my-pi/metal-theme": "^1.0.0"
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
- ## Install Flow
174
+ Variables with `env` mappings can be exported as environment variables:
143
175
 
144
176
  ```bash
145
- omp install @oh-my-pi/subagents
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
- 1. Resolve version from npm registry
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
- ### Conflict Detection
189
+ Plugins are npm packages with an `omp` field in `package.json`:
157
190
 
158
- ```
159
- ⚠ Conflict: omp-dark-theme and omp-nord-theme both install agent/themes/dark.json
160
- Choose: [1] dark-theme [2] nord-theme [3] abort
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
- ## Creating Plugins
206
+ ### Features and Variables
164
207
 
165
- ```bash
166
- omp create my-plugin
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
- Creates:
253
+ ### Plugin Structure
254
+
170
255
  ```
171
- omp-my-plugin/
256
+ my-cool-plugin/
172
257
  ├── package.json
173
- ├── README.md
174
- ├── agents/
175
- │ └── example.md
176
- ├── tools/
177
- ├── themes/
178
- └── commands/
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. Create a package with an `omp` field in package.json
184
- 2. Add `omp-plugin` to keywords
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
- ## Migration from v0.x
282
+ Your plugin is now discoverable via `omp search`.
189
283
 
190
- If you have plugins installed with the old manifest.json format:
284
+ ### Development Workflow
191
285
 
192
286
  ```bash
193
- omp migrate
194
- ```
287
+ # Scaffold a new plugin
288
+ omp create my-plugin
195
289
 
196
- This will:
197
- 1. Convert manifest.json → package.json format
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
- ## Bundled Example Plugins
293
+ # Test your plugin
294
+ omp list
203
295
 
204
- This package includes example plugins in the `plugins/` directory:
296
+ # When ready, publish
297
+ cd my-plugin && npm publish
298
+ ```
205
299
 
206
- - **@oh-my-pi/subagents** - Task delegation system with specialized subagents
207
- - **@oh-my-pi/metal-theme** - Metal theme for pi
300
+ ## Bundled Plugins
208
301
 
209
- Install bundled plugins:
210
- ```bash
211
- # After npm install -g @oh-my-pi/cli
212
- omp install $(npm root -g)/@oh-my-pi/cli/plugins/subagents
213
- omp install $(npm root -g)/@oh-my-pi/cli/plugins/metal-theme
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
- omp link ./plugins/subagents
219
- omp link ./plugins/metal-theme
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
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://biomejs.dev/schemas/2.3.5/schema.json",
2
+ "$schema": "https://biomejs.dev/schemas/2.3.10/schema.json",
3
3
  "linter": {
4
4
  "enabled": true,
5
5
  "rules": {
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
  }