@oh-my-pi/cli 0.3.0 → 0.4.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 (48) hide show
  1. package/.editorconfig +14 -0
  2. package/.prettierrc +6 -0
  3. package/README.md +65 -71
  4. package/bun.lock +13 -10
  5. package/dist/cli.js +114 -34
  6. package/dist/commands/config.d.ts.map +1 -1
  7. package/dist/commands/features.d.ts.map +1 -1
  8. package/dist/commands/install.d.ts.map +1 -1
  9. package/dist/commands/list.d.ts.map +1 -1
  10. package/dist/commands/uninstall.d.ts.map +1 -1
  11. package/dist/commands/update.d.ts.map +1 -1
  12. package/dist/runtime.d.ts.map +1 -1
  13. package/dist/symlinks.d.ts +1 -0
  14. package/dist/symlinks.d.ts.map +1 -1
  15. package/package.json +11 -4
  16. package/plugins/exa/README.md +44 -38
  17. package/plugins/exa/package.json +44 -11
  18. package/plugins/exa/tools/exa/company.ts +24 -13
  19. package/plugins/exa/tools/exa/index.ts +43 -34
  20. package/plugins/exa/tools/exa/linkedin.ts +24 -13
  21. package/plugins/exa/tools/exa/researcher.ts +26 -18
  22. package/plugins/exa/tools/exa/search.ts +31 -20
  23. package/plugins/exa/tools/exa/shared.ts +182 -156
  24. package/plugins/exa/tools/exa/websets.ts +39 -28
  25. package/plugins/metal-theme/package.json +13 -4
  26. package/plugins/subagents/README.md +3 -0
  27. package/plugins/subagents/agents/explore.md +11 -0
  28. package/plugins/subagents/agents/planner.md +3 -0
  29. package/plugins/subagents/agents/reviewer.md +6 -0
  30. package/plugins/subagents/agents/task.md +8 -1
  31. package/plugins/subagents/commands/architect-plan.md +1 -0
  32. package/plugins/subagents/commands/implement-with-critic.md +1 -0
  33. package/plugins/subagents/commands/implement.md +1 -0
  34. package/plugins/subagents/package.json +43 -11
  35. package/plugins/subagents/tools/task/index.ts +1089 -861
  36. package/plugins/user-prompt/README.md +22 -66
  37. package/plugins/user-prompt/package.json +15 -4
  38. package/plugins/user-prompt/tools/user-prompt/index.ts +185 -157
  39. package/scripts/bump-version.sh +10 -13
  40. package/src/cli.ts +1 -1
  41. package/src/commands/config.ts +21 -6
  42. package/src/commands/features.ts +49 -12
  43. package/src/commands/install.ts +91 -24
  44. package/src/commands/list.ts +14 -3
  45. package/src/commands/uninstall.ts +4 -1
  46. package/src/commands/update.ts +6 -1
  47. package/src/runtime.ts +3 -10
  48. package/src/symlinks.ts +12 -7
package/.editorconfig ADDED
@@ -0,0 +1,14 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ indent_style = tab
8
+ indent_size = 3
9
+ tab_width = 3
10
+ max_line_length = 120
11
+ trim_trailing_whitespace = true
12
+
13
+ [*.md]
14
+ trim_trailing_whitespace = false
package/.prettierrc ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "useTabs": true,
3
+ "tabWidth": 3,
4
+ "printWidth": 120,
5
+ "proseWrap": "preserve"
6
+ }
package/README.md CHANGED
@@ -74,10 +74,10 @@ Plugins declare which files to install via the `omp.install` field in their `pac
74
74
 
75
75
  omp supports both global and project-local plugin configurations:
76
76
 
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 |
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 |
81
81
 
82
82
  ```bash
83
83
  # Explicit scope
@@ -92,25 +92,25 @@ Initialize a project-local config with `omp init`.
92
92
 
93
93
  ## Commands
94
94
 
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 |
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
114
 
115
115
  Most commands accept `-g`/`--global` or `-l`/`--local` flags to override scope auto-detection.
116
116
 
@@ -190,16 +190,16 @@ Plugins are npm packages with an `omp` field in `package.json`:
190
190
 
191
191
  ```json
192
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"]
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
203
  }
204
204
  ```
205
205
 
@@ -209,44 +209,38 @@ Plugins can define optional features and configurable variables:
209
209
 
210
210
  ```json
211
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
- }
212
+ "name": "@oh-my-pi/exa",
213
+ "version": "1.0.0",
214
+ "keywords": ["omp-plugin"],
215
+ "omp": {
216
+ "install": [{ "src": "tools/core.ts", "dest": "agent/tools/exa/core.ts" }],
217
+ "variables": {
218
+ "apiKey": {
219
+ "type": "string",
220
+ "env": "EXA_API_KEY",
221
+ "description": "Exa API key",
222
+ "required": true
223
+ }
224
+ },
225
+ "features": {
226
+ "search": {
227
+ "description": "Web search capabilities",
228
+ "default": true,
229
+ "install": [{ "src": "tools/search.ts", "dest": "agent/tools/exa/search.ts" }]
230
+ },
231
+ "websets": {
232
+ "description": "Curated content collections",
233
+ "default": false,
234
+ "install": [{ "src": "tools/websets.ts", "dest": "agent/tools/exa/websets.ts" }],
235
+ "variables": {
236
+ "defaultCollection": {
237
+ "type": "string",
238
+ "default": "general"
239
+ }
240
+ }
241
+ }
242
+ }
243
+ }
250
244
  }
251
245
  ```
252
246
 
package/bun.lock CHANGED
@@ -10,31 +10,32 @@
10
10
  "commander": "^12.0.0",
11
11
  },
12
12
  "devDependencies": {
13
- "@biomejs/biome": "2.3.5",
13
+ "@biomejs/biome": "2.3.10",
14
14
  "@types/node": "^22.10.5",
15
15
  "bun-types": "^1.2.17",
16
+ "prettier": "^3.7.4",
16
17
  "typescript": "^5.9.2",
17
18
  },
18
19
  },
19
20
  },
20
21
  "packages": {
21
- "@biomejs/biome": ["@biomejs/biome@2.3.5", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.5", "@biomejs/cli-darwin-x64": "2.3.5", "@biomejs/cli-linux-arm64": "2.3.5", "@biomejs/cli-linux-arm64-musl": "2.3.5", "@biomejs/cli-linux-x64": "2.3.5", "@biomejs/cli-linux-x64-musl": "2.3.5", "@biomejs/cli-win32-arm64": "2.3.5", "@biomejs/cli-win32-x64": "2.3.5" }, "bin": { "biome": "bin/biome" } }, "sha512-HvLhNlIlBIbAV77VysRIBEwp55oM/QAjQEin74QQX9Xb259/XP/D5AGGnZMOyF1el4zcvlNYYR3AyTMUV3ILhg=="],
22
+ "@biomejs/biome": ["@biomejs/biome@2.3.10", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.10", "@biomejs/cli-darwin-x64": "2.3.10", "@biomejs/cli-linux-arm64": "2.3.10", "@biomejs/cli-linux-arm64-musl": "2.3.10", "@biomejs/cli-linux-x64": "2.3.10", "@biomejs/cli-linux-x64-musl": "2.3.10", "@biomejs/cli-win32-arm64": "2.3.10", "@biomejs/cli-win32-x64": "2.3.10" }, "bin": { "biome": "bin/biome" } }, "sha512-/uWSUd1MHX2fjqNLHNL6zLYWBbrJeG412/8H7ESuK8ewoRoMPUgHDebqKrPTx/5n6f17Xzqc9hdg3MEqA5hXnQ=="],
22
23
 
23
- "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-fLdTur8cJU33HxHUUsii3GLx/TR0BsfQx8FkeqIiW33cGMtUD56fAtrh+2Fx1uhiCsVZlFh6iLKUU3pniZREQw=="],
24
+ "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-M6xUjtCVnNGFfK7HMNKa593nb7fwNm43fq1Mt71kpLpb+4mE7odO8W/oWVDyBVO4ackhresy1ZYO7OJcVo/B7w=="],
24
25
 
25
- "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-qpT8XDqeUlzrOW8zb4k3tjhT7rmvVRumhi2657I2aGcY4B+Ft5fNwDdZGACzn8zj7/K1fdWjgwYE3i2mSZ+vOA=="],
26
+ "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-Vae7+V6t/Avr8tVbFNjnFSTKZogZHFYl7MMH62P/J1kZtr0tyRQ9Fe0onjqjS2Ek9lmNLmZc/VR5uSekh+p1fg=="],
26
27
 
27
- "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-u/pybjTBPGBHB66ku4pK1gj+Dxgx7/+Z0jAriZISPX1ocTO8aHh8x8e7Kb1rB4Ms0nA/SzjtNOVJ4exVavQBCw=="],
28
+ "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-hhPw2V3/EpHKsileVOFynuWiKRgFEV48cLe0eA+G2wO4SzlwEhLEB9LhlSrVeu2mtSn205W283LkX7Fh48CaxA=="],
28
29
 
29
- "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-eGUG7+hcLgGnMNl1KHVZUYxahYAhC462jF/wQolqu4qso2MSk32Q+QrpN7eN4jAHAg7FUMIo897muIhK4hXhqg=="],
30
+ "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-B9DszIHkuKtOH2IFeeVkQmSMVUjss9KtHaNXquYYWCjH8IstNgXgx5B0aSBQNr6mn4RcKKRQZXn9Zu1rM3O0/A=="],
30
31
 
31
- "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.5", "", { "os": "linux", "cpu": "x64" }, "sha512-XrIVi9YAW6ye0CGQ+yax0gLfx+BFOtKaNX74n+xHWla6Cl6huUmcKNO7HPx7BiKnJUzrxXY1qYlm7xMvi08X4g=="],
32
+ "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-wwAkWD1MR95u+J4LkWP74/vGz+tRrIQvr8kfMMJY8KOQ8+HMVleREOcPYsQX82S7uueco60L58Wc6M1I9WA9Dw=="],
32
33
 
33
- "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.5", "", { "os": "linux", "cpu": "x64" }, "sha512-awVuycTPpVTH/+WDVnEEYSf6nbCBHf/4wB3lquwT7puhNg8R4XvonWNZzUsfHZrCkjkLhFH/vCZK5jHatD9FEg=="],
34
+ "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-QTfHZQh62SDFdYc2nfmZFuTm5yYb4eO1zwfB+90YxUumRCR171tS1GoTX5OD0wrv4UsziMPmrePMtkTnNyYG3g=="],
34
35
 
35
- "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-DlBiMlBZZ9eIq4H7RimDSGsYcOtfOIfZOaI5CqsWiSlbTfqbPVfWtCf92wNzx8GNMbu1s7/g3ZZESr6+GwM/SA=="],
36
+ "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-o7lYc9n+CfRbHvkjPhm8s9FgbKdYZu5HCcGVMItLjz93EhgJ8AM44W+QckDqLA9MKDNFrR8nPbO4b73VC5kGGQ=="],
36
37
 
37
- "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.5", "", { "os": "win32", "cpu": "x64" }, "sha512-nUmR8gb6yvrKhtRgzwo/gDimPwnO5a4sCydf8ZS2kHIJhEmSmk+STsusr1LHTuM//wXppBawvSQi2xFXJCdgKQ=="],
38
+ "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.10", "", { "os": "win32", "cpu": "x64" }, "sha512-pHEFgq7dUEsKnqG9mx9bXihxGI49X+ar+UBrEIj3Wqj3UCZp1rNgV+OoyjFgcXsjCWpuEAF4VJdkZr3TrWdCbQ=="],
38
39
 
39
40
  "@inquirer/ansi": ["@inquirer/ansi@2.0.2", "", {}, "sha512-SYLX05PwJVnW+WVegZt1T4Ip1qba1ik+pNJPDiqvk6zS5Y/i8PhRzLpGEtVd7sW0G8cMtkD8t4AZYhQwm8vnww=="],
40
41
 
@@ -92,6 +93,8 @@
92
93
 
93
94
  "mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="],
94
95
 
96
+ "prettier": ["prettier@3.7.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA=="],
97
+
95
98
  "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
96
99
 
97
100
  "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
package/dist/cli.js CHANGED
@@ -2858,12 +2858,13 @@ function collectVariables(pkgJson, enabledFeatures) {
2858
2858
  }
2859
2859
  function parseValue(value, varDef) {
2860
2860
  switch (varDef.type) {
2861
- case "number":
2861
+ case "number": {
2862
2862
  const num = Number(value);
2863
- if (isNaN(num)) {
2863
+ if (Number.isNaN(num)) {
2864
2864
  throw new Error(`Invalid number: ${value}`);
2865
2865
  }
2866
2866
  return num;
2867
+ }
2867
2868
  case "boolean":
2868
2869
  if (value === "true" || value === "1" || value === "yes")
2869
2870
  return true;
@@ -2891,8 +2892,6 @@ function formatValue(value, varDef) {
2891
2892
  return String(value);
2892
2893
  }
2893
2894
  function resolveEnabledFeatures(allFeatureNames, storedFeatures, pluginFeatures) {
2894
- if (storedFeatures === null)
2895
- return allFeatureNames;
2896
2895
  if (Array.isArray(storedFeatures) && storedFeatures.includes("*"))
2897
2896
  return allFeatureNames;
2898
2897
  if (Array.isArray(storedFeatures))
@@ -3058,7 +3057,7 @@ async function deleteConfig(name, key, options = {}) {
3058
3057
  return;
3059
3058
  }
3060
3059
  const config = pluginsJson.config?.[name];
3061
- if (!config?.variables?.[key]) {
3060
+ if (!config?.variables || !Object.hasOwn(config.variables, key)) {
3062
3061
  console.log(source_default.yellow(`Variable "${key}" is not set for ${name}.`));
3063
3062
  return;
3064
3063
  }
@@ -3480,7 +3479,7 @@ function readRuntimeConfig(runtimePath) {
3480
3479
  const content = readFileSync(runtimePath, "utf-8");
3481
3480
  return JSON.parse(content);
3482
3481
  } catch {
3483
- return { features: [], options: {} };
3482
+ return {};
3484
3483
  }
3485
3484
  }
3486
3485
  async function writeRuntimeConfig(runtimePath, config, verbose = false) {
@@ -3490,7 +3489,7 @@ async function writeRuntimeConfig(runtimePath, config, verbose = false) {
3490
3489
  features: config.features ?? existing.features ?? [],
3491
3490
  options: { ...existing.options, ...config.options }
3492
3491
  };
3493
- writeFileSync(runtimePath, JSON.stringify(merged, null, 2) + `
3492
+ writeFileSync(runtimePath, `${JSON.stringify(merged, null, 2)}
3494
3493
  `);
3495
3494
  if (verbose) {
3496
3495
  console.log(source_default.dim(` Updated: ${runtimePath}`));
@@ -3509,7 +3508,11 @@ function getRuntimeConfigPath(pkgJson, global = true) {
3509
3508
  return join4(getBaseDir(global), runtimeEntry.dest);
3510
3509
  }
3511
3510
  async function removePluginSymlinks(_pluginName, pkgJson, global = true, verbose = true) {
3512
- const result = { removed: [], errors: [], skippedNonSymlinks: [] };
3511
+ const result = {
3512
+ removed: [],
3513
+ errors: [],
3514
+ skippedNonSymlinks: []
3515
+ };
3513
3516
  const installEntries = getInstallEntries(pkgJson);
3514
3517
  if (installEntries.length === 0) {
3515
3518
  return result;
@@ -3564,7 +3567,11 @@ async function removePluginSymlinks(_pluginName, pkgJson, global = true, verbose
3564
3567
  return result;
3565
3568
  }
3566
3569
  async function checkPluginSymlinks(pluginName, pkgJson, global = true) {
3567
- const result = { valid: [], broken: [], missing: [] };
3570
+ const result = {
3571
+ valid: [],
3572
+ broken: [],
3573
+ missing: []
3574
+ };
3568
3575
  const sourceDir = getPluginSourceDir(pluginName, global);
3569
3576
  const baseDir = getBaseDir(global);
3570
3577
  const installEntries = getInstallEntries(pkgJson);
@@ -3965,8 +3972,6 @@ function collectVariables2(pkgJson, enabledFeatures) {
3965
3972
  return vars;
3966
3973
  }
3967
3974
  function resolveEnabledFeatures2(allFeatureNames, storedFeatures, pluginFeatures) {
3968
- if (storedFeatures === null)
3969
- return allFeatureNames;
3970
3975
  if (Array.isArray(storedFeatures) && storedFeatures.includes("*"))
3971
3976
  return allFeatureNames;
3972
3977
  if (Array.isArray(storedFeatures))
@@ -5730,8 +5735,14 @@ async function interactiveFeatures(name, options = {}) {
5730
5735
  console.log(source_default.yellow(`Plugin "${name}" does not have a runtime.json config file.`));
5731
5736
  return;
5732
5737
  }
5733
- const runtimeConfig = readRuntimeConfig(runtimePath);
5734
- const enabledFeatures = runtimeConfig.features ?? getDefaultFeatures(features);
5738
+ const pluginConfig = pluginsJson.config?.[name];
5739
+ let enabledFeatures;
5740
+ if (Array.isArray(pluginConfig?.features)) {
5741
+ enabledFeatures = pluginConfig.features;
5742
+ } else {
5743
+ const runtimeConfig = readRuntimeConfig(runtimePath);
5744
+ enabledFeatures = runtimeConfig.features ?? getDefaultFeatures(features);
5745
+ }
5735
5746
  if (options.json) {
5736
5747
  console.log(JSON.stringify({
5737
5748
  plugin: name,
@@ -5767,8 +5778,8 @@ Configure features for ${name}:
5767
5778
  choices,
5768
5779
  pageSize: 15
5769
5780
  });
5770
- await applyFeatureChanges(name, runtimePath, features, enabledFeatures, selected);
5771
- } catch (err) {
5781
+ await applyFeatureChanges(name, runtimePath, features, enabledFeatures, selected, isGlobal);
5782
+ } catch (_err) {
5772
5783
  console.log(source_default.dim(`
5773
5784
  Cancelled.`));
5774
5785
  }
@@ -5793,7 +5804,7 @@ Features for ${name}:
5793
5804
  console.log(source_default.dim(`Configure with: omp features ${name} --enable <feature> --disable <feature>`));
5794
5805
  console.log(source_default.dim(`Or set exactly: omp features ${name} --set feature1,feature2`));
5795
5806
  }
5796
- async function applyFeatureChanges(name, runtimePath, features, currentlyEnabled, newEnabled) {
5807
+ async function applyFeatureChanges(name, runtimePath, _features, currentlyEnabled, newEnabled, isGlobal) {
5797
5808
  const toDisable = currentlyEnabled.filter((f) => !newEnabled.includes(f));
5798
5809
  const toEnable = newEnabled.filter((f) => !currentlyEnabled.includes(f));
5799
5810
  if (toDisable.length === 0 && toEnable.length === 0) {
@@ -5809,6 +5820,13 @@ Applying changes...`));
5809
5820
  if (toEnable.length > 0) {
5810
5821
  console.log(source_default.dim(` Enabling: ${toEnable.join(", ")}`));
5811
5822
  }
5823
+ const pluginsJson = await loadPluginsJson(isGlobal);
5824
+ if (!pluginsJson.config)
5825
+ pluginsJson.config = {};
5826
+ if (!pluginsJson.config[name])
5827
+ pluginsJson.config[name] = {};
5828
+ pluginsJson.config[name].features = newEnabled;
5829
+ await savePluginsJson(pluginsJson, isGlobal);
5812
5830
  await writeRuntimeConfig(runtimePath, { features: newEnabled });
5813
5831
  console.log(source_default.green(`
5814
5832
  \u2713 Features updated`));
@@ -5845,8 +5863,14 @@ async function configureFeatures(name, options = {}) {
5845
5863
  process.exitCode = 1;
5846
5864
  return;
5847
5865
  }
5848
- const runtimeConfig = readRuntimeConfig(runtimePath);
5849
- const currentlyEnabled = runtimeConfig.features ?? getDefaultFeatures(features);
5866
+ const pluginConfig = pluginsJson.config?.[name];
5867
+ let currentlyEnabled;
5868
+ if (Array.isArray(pluginConfig?.features)) {
5869
+ currentlyEnabled = pluginConfig.features;
5870
+ } else {
5871
+ const runtimeConfig = readRuntimeConfig(runtimePath);
5872
+ currentlyEnabled = runtimeConfig.features ?? getDefaultFeatures(features);
5873
+ }
5850
5874
  let newEnabled;
5851
5875
  if (options.set !== undefined) {
5852
5876
  if (options.set === "*") {
@@ -5888,7 +5912,7 @@ async function configureFeatures(name, options = {}) {
5888
5912
  }
5889
5913
  }
5890
5914
  }
5891
- await applyFeatureChanges(name, runtimePath, features, currentlyEnabled, newEnabled);
5915
+ await applyFeatureChanges(name, runtimePath, features, currentlyEnabled, newEnabled, isGlobal);
5892
5916
  if (options.json) {
5893
5917
  console.log(JSON.stringify({ plugin: name, enabled: newEnabled }, null, 2));
5894
5918
  }
@@ -6151,7 +6175,12 @@ init_source();
6151
6175
  function parsePackageSpecWithFeatures(spec) {
6152
6176
  const match = spec.match(/^(@?[^@[\]]+)(?:\[([^\]]*)\])?(?:@(.+))?$/);
6153
6177
  if (!match) {
6154
- return { name: spec, version: "latest", features: null, allFeatures: false };
6178
+ return {
6179
+ name: spec,
6180
+ version: "latest",
6181
+ features: null,
6182
+ allFeatures: false
6183
+ };
6155
6184
  }
6156
6185
  const [, name, featuresStr, version = "latest"] = match;
6157
6186
  if (featuresStr === undefined) {
@@ -6311,7 +6340,12 @@ Installing ${pkgSpec}...`));
6311
6340
  if (!info) {
6312
6341
  console.log(source_default.red(` \u2717 Package not found: ${name}`));
6313
6342
  process.exitCode = 1;
6314
- results.push({ name, version, success: false, error: "Package not found" });
6343
+ results.push({
6344
+ name,
6345
+ version,
6346
+ success: false,
6347
+ error: "Package not found"
6348
+ });
6315
6349
  continue;
6316
6350
  }
6317
6351
  resolvedVersion = info.version;
@@ -6325,7 +6359,12 @@ Installing ${pkgSpec}...`));
6325
6359
  console.log(source_default.red(` ${dupe.dest} \u2190 ${dupe.sources.join(", ")}`));
6326
6360
  }
6327
6361
  process.exitCode = 1;
6328
- results.push({ name, version: info.version, success: false, error: "Duplicate destinations in plugin" });
6362
+ results.push({
6363
+ name,
6364
+ version: info.version,
6365
+ success: false,
6366
+ error: "Duplicate destinations in plugin"
6367
+ });
6329
6368
  continue;
6330
6369
  }
6331
6370
  const preInstallConflicts = detectConflicts(name, preInstallPkgJson, existingPlugins);
@@ -6359,7 +6398,12 @@ Installing ${pkgSpec}...`));
6359
6398
  if (abort) {
6360
6399
  console.log(source_default.yellow(` Aborted due to conflicts (before download)`));
6361
6400
  process.exitCode = 1;
6362
- results.push({ name, version: info.version, success: false, error: "Conflicts" });
6401
+ results.push({
6402
+ name,
6403
+ version: info.version,
6404
+ success: false,
6405
+ error: "Conflicts"
6406
+ });
6363
6407
  continue;
6364
6408
  }
6365
6409
  }
@@ -6380,9 +6424,16 @@ Installing ${pkgSpec}...`));
6380
6424
  for (const dupe of intraDupes) {
6381
6425
  console.log(source_default.red(` ${dupe.dest} \u2190 ${dupe.sources.join(", ")}`));
6382
6426
  }
6383
- execFileSync2("npm", ["uninstall", "--prefix", prefix, name], { stdio: "pipe" });
6427
+ execFileSync2("npm", ["uninstall", "--prefix", prefix, name], {
6428
+ stdio: "pipe"
6429
+ });
6384
6430
  process.exitCode = 1;
6385
- results.push({ name, version: info.version, success: false, error: "Duplicate destinations in plugin" });
6431
+ results.push({
6432
+ name,
6433
+ version: info.version,
6434
+ success: false,
6435
+ error: "Duplicate destinations in plugin"
6436
+ });
6386
6437
  continue;
6387
6438
  }
6388
6439
  const conflicts = detectConflicts(name, pkgJson, existingPlugins);
@@ -6392,7 +6443,9 @@ Installing ${pkgSpec}...`));
6392
6443
  for (const conflict of conflicts) {
6393
6444
  console.log(source_default.yellow(` \u26A0 ${formatConflicts([conflict])[0]}`));
6394
6445
  }
6395
- execFileSync2("npm", ["uninstall", "--prefix", prefix, name], { stdio: "pipe" });
6446
+ execFileSync2("npm", ["uninstall", "--prefix", prefix, name], {
6447
+ stdio: "pipe"
6448
+ });
6396
6449
  process.exitCode = 1;
6397
6450
  results.push({
6398
6451
  name,
@@ -6416,9 +6469,16 @@ Installing ${pkgSpec}...`));
6416
6469
  }
6417
6470
  if (abort) {
6418
6471
  console.log(source_default.yellow(` Aborted due to conflicts`));
6419
- execFileSync2("npm", ["uninstall", "--prefix", prefix, name], { stdio: "pipe" });
6472
+ execFileSync2("npm", ["uninstall", "--prefix", prefix, name], {
6473
+ stdio: "pipe"
6474
+ });
6420
6475
  process.exitCode = 1;
6421
- results.push({ name, version: info.version, success: false, error: "Conflicts" });
6476
+ results.push({
6477
+ name,
6478
+ version: info.version,
6479
+ success: false,
6480
+ error: "Conflicts"
6481
+ });
6422
6482
  continue;
6423
6483
  }
6424
6484
  }
@@ -6478,11 +6538,18 @@ Installing ${pkgSpec}...`));
6478
6538
  if (npmInstallSucceeded) {
6479
6539
  console.log(source_default.dim(" Rolling back npm install..."));
6480
6540
  try {
6481
- execFileSync2("npm", ["uninstall", "--prefix", prefix, name], { stdio: "pipe" });
6541
+ execFileSync2("npm", ["uninstall", "--prefix", prefix, name], {
6542
+ stdio: "pipe"
6543
+ });
6482
6544
  } catch {}
6483
6545
  }
6484
6546
  process.exitCode = 1;
6485
- results.push({ name, version: resolvedVersion, success: false, error: errorMsg });
6547
+ results.push({
6548
+ name,
6549
+ version: resolvedVersion,
6550
+ success: false,
6551
+ error: errorMsg
6552
+ });
6486
6553
  }
6487
6554
  }
6488
6555
  const successful = results.filter((r) => r.success);
@@ -6507,7 +6574,12 @@ async function installLocalPlugin(localPath, isGlobal, _options) {
6507
6574
  if (!existsSync8(localPath)) {
6508
6575
  console.log(source_default.red(`Error: Path does not exist: ${localPath}`));
6509
6576
  process.exitCode = 1;
6510
- return { name: basename(localPath), version: "local", success: false, error: "Path not found" };
6577
+ return {
6578
+ name: basename(localPath),
6579
+ version: "local",
6580
+ success: false,
6581
+ error: "Path not found"
6582
+ };
6511
6583
  }
6512
6584
  const _prefix = isGlobal ? PLUGINS_DIR : ".pi";
6513
6585
  const nodeModules = isGlobal ? NODE_MODULES_DIR : PROJECT_NODE_MODULES;
@@ -6581,7 +6653,12 @@ Installing ${pluginName} from ${localPath}...`));
6581
6653
  const errorMsg = err.message;
6582
6654
  console.log(source_default.red(` \u2717 Failed: ${errorMsg}`));
6583
6655
  process.exitCode = 1;
6584
- return { name: basename(localPath), version: "local", success: false, error: errorMsg };
6656
+ return {
6657
+ name: basename(localPath),
6658
+ version: "local",
6659
+ success: false,
6660
+ error: errorMsg
6661
+ };
6585
6662
  }
6586
6663
  }
6587
6664
 
@@ -7007,7 +7084,10 @@ The following files are not symlinks and were not removed:`));
7007
7084
  console.log(source_default.dim(` - ${file}`));
7008
7085
  }
7009
7086
  if (process.stdin.isTTY && process.stdout.isTTY) {
7010
- const rl = createInterface4({ input: process.stdin, output: process.stdout });
7087
+ const rl = createInterface4({
7088
+ input: process.stdin,
7089
+ output: process.stdout
7090
+ });
7011
7091
  const answer = await new Promise((resolve5) => {
7012
7092
  rl.question(source_default.yellow("Delete these files anyway? [y/N] "), (ans) => {
7013
7093
  rl.close();
@@ -7298,7 +7378,7 @@ if (!npmCheck.available) {
7298
7378
  console.log(source_default.red(npmCheck.error));
7299
7379
  process.exit(1);
7300
7380
  }
7301
- program.name("omp").description("Oh My Pi - Plugin manager for pi configuration").version("0.2.0");
7381
+ program.name("omp").description("Oh My Pi - Plugin manager for pi configuration").version("0.4.0");
7302
7382
  program.command("install [packages...]").alias("i").description("Install plugin(s). No args = install from plugins.json").addHelpText("after", `
7303
7383
  Examples:
7304
7384
  $ omp install @oh-my-pi/subagents # Install from npm (all features)
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAsFD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFzF;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CrG;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DpH;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCxG;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAClC,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,EACrC,cAAc,CAAC,EAAE,MAAM,GAAG,aAAa,EACvC,OAAO,GAAE,aAAkB,GACzB,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAsGD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsFzF;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CrG;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DpH;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCxG;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAClC,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,EACrC,cAAc,CAAC,EAAE,MAAM,GAAG,aAAa,EACvC,OAAO,GAAE,aAAkB,GACzB,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -1 +1 @@
1
- {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../src/commands/features.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuFpG;AAsED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2FlG;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhG"}
1
+ {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../src/commands/features.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiGpG;AA4FD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwGlG;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhG"}
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAOA,OAAO,EAKN,KAAK,YAAY,EACjB,KAAK,iBAAiB,EAItB,MAAM,eAAe,CAAC;AAavB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1B,2BAA2B;IAC3B,WAAW,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAgC5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,cAAc,EAAE,YAAY,GAAG,SAAS,EACxC,WAAW,EAAE,OAAO,GAClB;IAAE,eAAe,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,YAAY,GAAG,SAAS,CAAA;CAAE,CAwExE;AA0BD,MAAM,WAAW,cAAc;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAqCD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgVpG"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAOA,OAAO,EAKN,KAAK,YAAY,EACjB,KAAK,iBAAiB,EAGtB,MAAM,eAAe,CAAC;AAavB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1B,2BAA2B;IAC3B,WAAW,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAwC5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,cAAc,EAAE,YAAY,GAAG,SAAS,EACxC,WAAW,EAAE,OAAO,GAClB;IAAE,eAAe,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,YAAY,GAAG,SAAS,CAAA;CAAE,CAwExE;AA0BD,MAAM,WAAW,cAAc;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAqCD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6XpG"}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AA6GD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiE1E"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAwHD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiE1E"}
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwGjG"}
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2GjG"}
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,aAAa;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiJ5F"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,aAAa;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsJ5F"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AA8CA;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAiCrF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,UAAO,EAAE,KAAK,GAAE,IAAI,GAAG,MAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAanG;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAE/E"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAkDA;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA6BrF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,UAAO,EAAE,KAAK,GAAE,IAAI,GAAG,MAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAanG;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAE/E"}
@@ -33,6 +33,7 @@ export interface SymlinkRemovalResult {
33
33
  export declare function createPluginSymlinks(pluginName: string, pkgJson: PluginPackageJson, global?: boolean, verbose?: boolean, skipDestinations?: Set<string>, enabledFeatures?: string[]): Promise<SymlinkResult>;
34
34
  /**
35
35
  * Read runtime.json config from a plugin's installed location
36
+ * Returns {} on failure so callers can detect missing/corrupt config and fall back to defaults
36
37
  */
37
38
  export declare function readRuntimeConfig(runtimePath: string): PluginRuntimeConfig;
38
39
  /**