@oh-my-pi/cli 0.4.0 → 0.5.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 (108) hide show
  1. package/README.md +14 -13
  2. package/dist/cli.js +4787 -858
  3. package/dist/commands/config.d.ts +27 -0
  4. package/dist/commands/config.d.ts.map +1 -1
  5. package/dist/commands/create.d.ts.map +1 -1
  6. package/dist/commands/doctor.d.ts +2 -0
  7. package/dist/commands/doctor.d.ts.map +1 -1
  8. package/dist/commands/env.d.ts.map +1 -1
  9. package/dist/commands/features.d.ts.map +1 -1
  10. package/dist/commands/info.d.ts.map +1 -1
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/install.d.ts +6 -0
  13. package/dist/commands/install.d.ts.map +1 -1
  14. package/dist/commands/link.d.ts +1 -0
  15. package/dist/commands/link.d.ts.map +1 -1
  16. package/dist/commands/list.d.ts.map +1 -1
  17. package/dist/commands/outdated.d.ts.map +1 -1
  18. package/dist/commands/search.d.ts.map +1 -1
  19. package/dist/commands/uninstall.d.ts +3 -0
  20. package/dist/commands/uninstall.d.ts.map +1 -1
  21. package/dist/commands/update.d.ts +1 -0
  22. package/dist/commands/update.d.ts.map +1 -1
  23. package/dist/commands/why.d.ts.map +1 -1
  24. package/dist/conflicts.d.ts +7 -2
  25. package/dist/conflicts.d.ts.map +1 -1
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/lock.d.ts.map +1 -1
  29. package/dist/lockfile.d.ts +24 -3
  30. package/dist/lockfile.d.ts.map +1 -1
  31. package/dist/manifest.d.ts +12 -1
  32. package/dist/manifest.d.ts.map +1 -1
  33. package/dist/npm.d.ts +11 -0
  34. package/dist/npm.d.ts.map +1 -1
  35. package/dist/output.d.ts +51 -0
  36. package/dist/output.d.ts.map +1 -0
  37. package/dist/paths.d.ts +5 -0
  38. package/dist/paths.d.ts.map +1 -1
  39. package/dist/progress.d.ts +78 -0
  40. package/dist/progress.d.ts.map +1 -0
  41. package/dist/symlinks.d.ts.map +1 -1
  42. package/package.json +14 -7
  43. package/.editorconfig +0 -14
  44. package/.github/icon.png +0 -0
  45. package/.github/logo.png +0 -0
  46. package/.github/workflows/ci.yml +0 -32
  47. package/.github/workflows/publish.yml +0 -42
  48. package/.prettierrc +0 -6
  49. package/biome.json +0 -29
  50. package/bun.lock +0 -112
  51. package/plugins/exa/README.md +0 -159
  52. package/plugins/exa/package.json +0 -89
  53. package/plugins/exa/tools/exa/company.ts +0 -46
  54. package/plugins/exa/tools/exa/index.ts +0 -75
  55. package/plugins/exa/tools/exa/linkedin.ts +0 -46
  56. package/plugins/exa/tools/exa/researcher.ts +0 -48
  57. package/plugins/exa/tools/exa/runtime.json +0 -4
  58. package/plugins/exa/tools/exa/search.ts +0 -57
  59. package/plugins/exa/tools/exa/shared.ts +0 -256
  60. package/plugins/exa/tools/exa/websets.ts +0 -73
  61. package/plugins/metal-theme/README.md +0 -13
  62. package/plugins/metal-theme/omp.json +0 -8
  63. package/plugins/metal-theme/package.json +0 -28
  64. package/plugins/metal-theme/themes/metal.json +0 -79
  65. package/plugins/subagents/README.md +0 -28
  66. package/plugins/subagents/agents/explore.md +0 -82
  67. package/plugins/subagents/agents/planner.md +0 -54
  68. package/plugins/subagents/agents/reviewer.md +0 -59
  69. package/plugins/subagents/agents/task.md +0 -53
  70. package/plugins/subagents/commands/architect-plan.md +0 -10
  71. package/plugins/subagents/commands/implement-with-critic.md +0 -11
  72. package/plugins/subagents/commands/implement.md +0 -11
  73. package/plugins/subagents/omp.json +0 -15
  74. package/plugins/subagents/package.json +0 -58
  75. package/plugins/subagents/tools/task/index.ts +0 -1247
  76. package/plugins/user-prompt/README.md +0 -86
  77. package/plugins/user-prompt/package.json +0 -30
  78. package/plugins/user-prompt/tools/user-prompt/index.ts +0 -263
  79. package/scripts/bump-version.sh +0 -49
  80. package/scripts/publish.sh +0 -35
  81. package/src/cli.ts +0 -242
  82. package/src/commands/config.ts +0 -399
  83. package/src/commands/create.ts +0 -203
  84. package/src/commands/doctor.ts +0 -305
  85. package/src/commands/enable.ts +0 -122
  86. package/src/commands/env.ts +0 -38
  87. package/src/commands/features.ts +0 -332
  88. package/src/commands/info.ts +0 -120
  89. package/src/commands/init.ts +0 -60
  90. package/src/commands/install.ts +0 -767
  91. package/src/commands/link.ts +0 -159
  92. package/src/commands/list.ts +0 -197
  93. package/src/commands/outdated.ts +0 -87
  94. package/src/commands/search.ts +0 -77
  95. package/src/commands/uninstall.ts +0 -127
  96. package/src/commands/update.ts +0 -175
  97. package/src/commands/why.ts +0 -136
  98. package/src/conflicts.ts +0 -116
  99. package/src/errors.ts +0 -22
  100. package/src/index.ts +0 -46
  101. package/src/lock.ts +0 -46
  102. package/src/lockfile.ts +0 -132
  103. package/src/manifest.ts +0 -360
  104. package/src/npm.ts +0 -206
  105. package/src/paths.ts +0 -137
  106. package/src/runtime.ts +0 -109
  107. package/src/symlinks.ts +0 -460
  108. package/tsconfig.json +0 -28
@@ -1,32 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
- branches: [main]
8
-
9
- jobs:
10
- build:
11
- runs-on: ubuntu-latest
12
-
13
- steps:
14
- - uses: actions/checkout@v4
15
-
16
- - uses: oven-sh/setup-bun@v2
17
- with:
18
- bun-version: latest
19
-
20
- - name: Install dependencies
21
- run: bun install
22
-
23
- - name: Check (lint + typecheck)
24
- run: bun run check
25
-
26
- - name: Build
27
- run: bun run build
28
-
29
- - name: Test CLI
30
- run: |
31
- bun dist/cli.js --version
32
- bun dist/cli.js --help
@@ -1,42 +0,0 @@
1
- name: Publish
2
-
3
- on:
4
- push:
5
- tags:
6
- - 'v*'
7
-
8
- jobs:
9
- publish:
10
- runs-on: ubuntu-latest
11
- permissions:
12
- contents: read
13
- id-token: write
14
-
15
- steps:
16
- - uses: actions/checkout@v4
17
-
18
- - uses: oven-sh/setup-bun@v2
19
- with:
20
- bun-version: latest
21
-
22
- - uses: actions/setup-node@v4
23
- with:
24
- node-version: '24'
25
- registry-url: 'https://registry.npmjs.org'
26
-
27
- - name: Install dependencies
28
- run: bun install
29
-
30
- - name: Build
31
- run: bun run build
32
-
33
- - name: Publish @oh-my-pi/cli
34
- run: npm publish --access public --provenance
35
-
36
- - name: Publish @oh-my-pi/subagents
37
- working-directory: plugins/subagents
38
- run: npm publish --access public --provenance
39
-
40
- - name: Publish @oh-my-pi/metal-theme
41
- working-directory: plugins/metal-theme
42
- run: npm publish --access public --provenance
package/.prettierrc DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "useTabs": true,
3
- "tabWidth": 3,
4
- "printWidth": 120,
5
- "proseWrap": "preserve"
6
- }
package/biome.json DELETED
@@ -1,29 +0,0 @@
1
- {
2
- "$schema": "https://biomejs.dev/schemas/2.3.10/schema.json",
3
- "linter": {
4
- "enabled": true,
5
- "rules": {
6
- "recommended": true,
7
- "style": {
8
- "noNonNullAssertion": "off",
9
- "useConst": "error",
10
- "useNodejsImportProtocol": "off"
11
- },
12
- "suspicious": {
13
- "noExplicitAny": "off",
14
- "noControlCharactersInRegex": "off",
15
- "noEmptyInterface": "off"
16
- }
17
- }
18
- },
19
- "formatter": {
20
- "enabled": true,
21
- "formatWithErrors": false,
22
- "indentStyle": "tab",
23
- "indentWidth": 3,
24
- "lineWidth": 120
25
- },
26
- "files": {
27
- "includes": ["src/**/*.ts", "!**/node_modules/**/*"]
28
- }
29
- }
package/bun.lock DELETED
@@ -1,112 +0,0 @@
1
- {
2
- "lockfileVersion": 1,
3
- "configVersion": 1,
4
- "workspaces": {
5
- "": {
6
- "name": "oh-my-pi",
7
- "dependencies": {
8
- "@inquirer/prompts": "^8.1.0",
9
- "chalk": "^5.3.0",
10
- "commander": "^12.0.0",
11
- },
12
- "devDependencies": {
13
- "@biomejs/biome": "2.3.10",
14
- "@types/node": "^22.10.5",
15
- "bun-types": "^1.2.17",
16
- "prettier": "^3.7.4",
17
- "typescript": "^5.9.2",
18
- },
19
- },
20
- },
21
- "packages": {
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=="],
23
-
24
- "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-M6xUjtCVnNGFfK7HMNKa593nb7fwNm43fq1Mt71kpLpb+4mE7odO8W/oWVDyBVO4ackhresy1ZYO7OJcVo/B7w=="],
25
-
26
- "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-Vae7+V6t/Avr8tVbFNjnFSTKZogZHFYl7MMH62P/J1kZtr0tyRQ9Fe0onjqjS2Ek9lmNLmZc/VR5uSekh+p1fg=="],
27
-
28
- "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-hhPw2V3/EpHKsileVOFynuWiKRgFEV48cLe0eA+G2wO4SzlwEhLEB9LhlSrVeu2mtSn205W283LkX7Fh48CaxA=="],
29
-
30
- "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-B9DszIHkuKtOH2IFeeVkQmSMVUjss9KtHaNXquYYWCjH8IstNgXgx5B0aSBQNr6mn4RcKKRQZXn9Zu1rM3O0/A=="],
31
-
32
- "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-wwAkWD1MR95u+J4LkWP74/vGz+tRrIQvr8kfMMJY8KOQ8+HMVleREOcPYsQX82S7uueco60L58Wc6M1I9WA9Dw=="],
33
-
34
- "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-QTfHZQh62SDFdYc2nfmZFuTm5yYb4eO1zwfB+90YxUumRCR171tS1GoTX5OD0wrv4UsziMPmrePMtkTnNyYG3g=="],
35
-
36
- "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-o7lYc9n+CfRbHvkjPhm8s9FgbKdYZu5HCcGVMItLjz93EhgJ8AM44W+QckDqLA9MKDNFrR8nPbO4b73VC5kGGQ=="],
37
-
38
- "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.10", "", { "os": "win32", "cpu": "x64" }, "sha512-pHEFgq7dUEsKnqG9mx9bXihxGI49X+ar+UBrEIj3Wqj3UCZp1rNgV+OoyjFgcXsjCWpuEAF4VJdkZr3TrWdCbQ=="],
39
-
40
- "@inquirer/ansi": ["@inquirer/ansi@2.0.2", "", {}, "sha512-SYLX05PwJVnW+WVegZt1T4Ip1qba1ik+pNJPDiqvk6zS5Y/i8PhRzLpGEtVd7sW0G8cMtkD8t4AZYhQwm8vnww=="],
41
-
42
- "@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=="],
43
-
44
- "@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=="],
45
-
46
- "@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=="],
47
-
48
- "@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=="],
49
-
50
- "@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=="],
51
-
52
- "@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=="],
53
-
54
- "@inquirer/figures": ["@inquirer/figures@2.0.2", "", {}, "sha512-qXm6EVvQx/FmnSrCWCIGtMHwqeLgxABP8XgcaAoywsL0NFga9gD5kfG0gXiv80GjK9Hsoz4pgGwF/+CjygyV9A=="],
55
-
56
- "@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=="],
57
-
58
- "@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=="],
59
-
60
- "@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=="],
61
-
62
- "@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=="],
63
-
64
- "@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=="],
65
-
66
- "@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=="],
67
-
68
- "@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=="],
69
-
70
- "@inquirer/type": ["@inquirer/type@4.0.2", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cae7mzluplsjSdgFA6ACLygb5jC8alO0UUnFPyu0E7tNRPrL+q/f8VcSXp+cjZQ7l5CMpDpi2G1+IQvkOiL1Lw=="],
71
-
72
- "@types/node": ["@types/node@22.19.3", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="],
73
-
74
- "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
75
-
76
- "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
77
-
78
- "bun-types": ["bun-types@1.3.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="],
79
-
80
- "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
81
-
82
- "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="],
83
-
84
- "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="],
85
-
86
- "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
87
-
88
- "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
89
-
90
- "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
91
-
92
- "iconv-lite": ["iconv-lite@0.7.1", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw=="],
93
-
94
- "mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="],
95
-
96
- "prettier": ["prettier@3.7.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA=="],
97
-
98
- "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
99
-
100
- "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
101
-
102
- "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=="],
103
-
104
- "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
105
-
106
- "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
107
-
108
- "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
109
-
110
- "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=="],
111
- }
112
- }
@@ -1,159 +0,0 @@
1
- # Exa Plugin
2
-
3
- Exa AI web search and websets tools for pi.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- # Install with default features (search only)
9
- omp install @oh-my-pi/exa
10
-
11
- # Install with all features
12
- omp install @oh-my-pi/exa[*]
13
-
14
- # Install with specific features
15
- omp install @oh-my-pi/exa[search,linkedin,websets]
16
- ```
17
-
18
- ## Features
19
-
20
- | Feature | Default | Description | Tools |
21
- | ------------ | ------- | ----------------------------------- | -------- |
22
- | `search` | ✓ | Core web search capabilities | 4 tools |
23
- | `linkedin` | | LinkedIn profile and company search | 1 tool |
24
- | `company` | | Comprehensive company research | 1 tool |
25
- | `researcher` | | Long-running AI research tasks | 2 tools |
26
- | `websets` | | Entity collection management | 14 tools |
27
-
28
- Manage features after install:
29
-
30
- ```bash
31
- omp features @oh-my-pi/exa # Interactive UI or list features
32
- omp features @oh-my-pi/exa --enable websets # Enable websets
33
- omp features @oh-my-pi/exa --disable search # Disable search
34
- omp features @oh-my-pi/exa --set search,linkedin,websets # Set exact features
35
- ```
36
-
37
- Feature state is stored in `runtime.json` which is copied (not symlinked) to the install location. You can also edit it directly:
38
-
39
- ```bash
40
- cat ~/.pi/agent/tools/exa/runtime.json
41
- # {"features": ["search"], "options": {}}
42
- ```
43
-
44
- ## Setup
45
-
46
- Set your Exa API key:
47
-
48
- ```bash
49
- # Option 1: Use omp config
50
- omp config @oh-my-pi/exa apiKey YOUR_API_KEY
51
-
52
- # Option 2: Environment variable
53
- export EXA_API_KEY=YOUR_API_KEY
54
-
55
- # Option 3: .env file in current directory or ~/.env
56
- echo "EXA_API_KEY=YOUR_API_KEY" >> ~/.env
57
- ```
58
-
59
- Get your API key from: https://dashboard.exa.ai/api-keys
60
-
61
- ## Tools
62
-
63
- ### search (default)
64
-
65
- | Tool | Description |
66
- | ------------------------- | ---------------------------------------------------- |
67
- | `web_search_general` | Real-time web searches with content extraction |
68
- | `web_search_deep` | Natural language web search with synthesized results |
69
- | `web_search_code_context` | Search code snippets, docs, and examples |
70
- | `web_search_crawl_url` | Extract content from specific URLs |
71
-
72
- ### linkedin
73
-
74
- | Tool | Description |
75
- | --------------------- | -------------------------------------- |
76
- | `web_search_linkedin` | Search LinkedIn profiles and companies |
77
-
78
- ### company
79
-
80
- | Tool | Description |
81
- | ----------------------------- | ------------------------------ |
82
- | `web_search_company_research` | Comprehensive company research |
83
-
84
- ### researcher
85
-
86
- | Tool | Description |
87
- | ----------------------------- | -------------------------------------------- |
88
- | `web_search_researcher_start` | Start comprehensive AI-powered research task |
89
- | `web_search_researcher_check` | Check research task status and get results |
90
-
91
- ### websets
92
-
93
- | Tool | Description |
94
- | -------------------------- | ----------------------------------------------------- |
95
- | `webset_create` | Create entity collections with search and enrichments |
96
- | `webset_list` | List all websets in your account |
97
- | `webset_get` | Get detailed webset information |
98
- | `webset_update` | Update webset metadata |
99
- | `webset_delete` | Delete a webset |
100
- | `webset_items_list` | List items in a webset |
101
- | `webset_item_get` | Get item details |
102
- | `webset_search_create` | Add search to find entities for a webset |
103
- | `webset_search_get` | Check search status |
104
- | `webset_search_cancel` | Cancel running search |
105
- | `webset_enrichment_create` | Extract custom data from webset items |
106
- | `webset_enrichment_get` | Get enrichment details |
107
- | `webset_enrichment_update` | Update enrichment metadata |
108
- | `webset_enrichment_delete` | Delete enrichment |
109
- | `webset_enrichment_cancel` | Cancel running enrichment |
110
- | `webset_monitor_create` | Auto-update webset on schedule |
111
-
112
- ## Usage Examples
113
-
114
- ### Code Search
115
-
116
- ```
117
- Find examples of how to use React hooks with TypeScript
118
- ```
119
-
120
- ### Web Search
121
-
122
- ```
123
- Search for the latest news about AI regulation in the EU
124
- ```
125
-
126
- ### Company Research (requires company feature)
127
-
128
- ```
129
- Research the company OpenAI and find information about their products
130
- ```
131
-
132
- ### Deep Research (requires researcher feature)
133
-
134
- ```
135
- Start a deep research project on the impact of large language models on software development
136
- ```
137
-
138
- ### Websets (requires websets feature)
139
-
140
- ```
141
- Create a webset of AI startups in San Francisco founded after 2020,
142
- find 10 companies and enrich with CEO name and funding amount
143
- ```
144
-
145
- ## How It Works
146
-
147
- The plugin connects to Exa's hosted MCP (Model Context Protocol) servers:
148
-
149
- - `https://mcp.exa.ai/mcp` - Search tools
150
- - `https://websetsmcp.exa.ai/mcp` - Websets tools
151
-
152
- Tools are dynamically fetched from these servers, so you always get the latest available tools.
153
-
154
- ## Resources
155
-
156
- - [Exa Dashboard](https://dashboard.exa.ai/)
157
- - [Exa MCP Documentation](https://docs.exa.ai/reference/exa-mcp)
158
- - [Websets MCP Documentation](https://docs.exa.ai/reference/websets-mcp)
159
- - [Exa API Documentation](https://docs.exa.ai/)
@@ -1,89 +0,0 @@
1
- {
2
- "name": "@oh-my-pi/exa",
3
- "version": "0.4.0",
4
- "description": "Exa AI web search and websets tools for pi",
5
- "keywords": [
6
- "omp-plugin",
7
- "exa",
8
- "web-search",
9
- "websets",
10
- "ai-search"
11
- ],
12
- "author": "Can Bölük <me@can.ac>",
13
- "license": "MIT",
14
- "repository": {
15
- "type": "git",
16
- "url": "https://github.com/can1357/oh-my-pi.git",
17
- "directory": "plugins/exa"
18
- },
19
- "omp": {
20
- "install": [
21
- {
22
- "src": "tools/exa/runtime.json",
23
- "dest": "agent/tools/exa/runtime.json",
24
- "copy": true
25
- },
26
- {
27
- "src": "tools/exa/index.ts",
28
- "dest": "agent/tools/exa/index.ts"
29
- },
30
- {
31
- "src": "tools/exa/shared.ts",
32
- "dest": "agent/tools/exa/shared.ts"
33
- },
34
- {
35
- "src": "tools/exa/search.ts",
36
- "dest": "agent/tools/exa/search.ts"
37
- },
38
- {
39
- "src": "tools/exa/linkedin.ts",
40
- "dest": "agent/tools/exa/linkedin.ts"
41
- },
42
- {
43
- "src": "tools/exa/company.ts",
44
- "dest": "agent/tools/exa/company.ts"
45
- },
46
- {
47
- "src": "tools/exa/researcher.ts",
48
- "dest": "agent/tools/exa/researcher.ts"
49
- },
50
- {
51
- "src": "tools/exa/websets.ts",
52
- "dest": "agent/tools/exa/websets.ts"
53
- }
54
- ],
55
- "variables": {
56
- "apiKey": {
57
- "type": "string",
58
- "env": "EXA_API_KEY",
59
- "description": "Exa API key for authentication",
60
- "required": true
61
- }
62
- },
63
- "features": {
64
- "search": {
65
- "description": "Core web search (general, deep, code context, URL crawling)",
66
- "default": true
67
- },
68
- "linkedin": {
69
- "description": "LinkedIn profile and company search",
70
- "default": false
71
- },
72
- "company": {
73
- "description": "Comprehensive company research",
74
- "default": false
75
- },
76
- "researcher": {
77
- "description": "Long-running AI research tasks",
78
- "default": false
79
- },
80
- "websets": {
81
- "description": "Entity collection management (14 tools)",
82
- "default": false
83
- }
84
- }
85
- },
86
- "files": [
87
- "tools"
88
- ]
89
- }
@@ -1,46 +0,0 @@
1
- /**
2
- * Exa Company Research Tool
3
- *
4
- * Tools:
5
- * - web_search_company_research: Comprehensive company research
6
- */
7
-
8
- import type { TSchema } from "@sinclair/typebox";
9
- import type {
10
- CustomAgentTool,
11
- CustomToolFactory,
12
- ToolAPI,
13
- } from "@mariozechner/pi-coding-agent";
14
- import {
15
- callExaTool,
16
- createToolWrapper,
17
- fetchExaTools,
18
- findApiKey,
19
- } from "./shared";
20
-
21
- // MCP tool names for this feature
22
- const TOOL_NAMES = ["company_research_exa"];
23
-
24
- // Tool name mapping: MCP name -> exposed name
25
- const NAME_MAP: Record<string, string> = {
26
- company_research_exa: "web_search_company_research",
27
- };
28
-
29
- const factory: CustomToolFactory = async (
30
- _toolApi: ToolAPI,
31
- ): Promise<CustomAgentTool<TSchema, unknown>[] | null> => {
32
- const apiKey = findApiKey();
33
- if (!apiKey) return null;
34
-
35
- const mcpTools = await fetchExaTools(apiKey, TOOL_NAMES);
36
- if (mcpTools.length === 0) return null;
37
-
38
- const callFn = (toolName: string, args: Record<string, unknown>) =>
39
- callExaTool(apiKey, TOOL_NAMES, toolName, args);
40
-
41
- return mcpTools.map((tool) =>
42
- createToolWrapper(tool, NAME_MAP[tool.name] ?? tool.name, callFn),
43
- );
44
- };
45
-
46
- export default factory;
@@ -1,75 +0,0 @@
1
- /**
2
- * Exa Tools - Dynamic loader for feature modules
3
- *
4
- * Reads runtime.json to determine which features are enabled,
5
- * then loads and initializes those feature modules.
6
- *
7
- * Available features:
8
- * - search: Core web search (general, deep, code context, URL crawling)
9
- * - linkedin: LinkedIn profile and company search
10
- * - company: Comprehensive company research
11
- * - researcher: Long-running AI research tasks
12
- * - websets: Entity collection management
13
- */
14
-
15
- import type { TSchema } from "@sinclair/typebox";
16
- import type {
17
- CustomAgentTool,
18
- CustomToolFactory,
19
- ToolAPI,
20
- } from "@mariozechner/pi-coding-agent";
21
- import runtime from "./runtime.json";
22
-
23
- // Map feature names to their module imports
24
- const FEATURE_LOADERS: Record<
25
- string,
26
- () => Promise<{ default: CustomToolFactory }>
27
- > = {
28
- search: () => import("./search"),
29
- linkedin: () => import("./linkedin"),
30
- company: () => import("./company"),
31
- researcher: () => import("./researcher"),
32
- websets: () => import("./websets"),
33
- };
34
-
35
- /**
36
- * Factory function that loads enabled features from runtime.json
37
- */
38
- const factory: CustomToolFactory = async (
39
- toolApi: ToolAPI,
40
- ): Promise<CustomAgentTool<TSchema, unknown>[] | null> => {
41
- const allTools: CustomAgentTool<TSchema, unknown>[] = [];
42
- const enabledFeatures = runtime.features ?? [];
43
-
44
- for (const feature of enabledFeatures) {
45
- const loader = FEATURE_LOADERS[feature];
46
- if (!loader) {
47
- console.error(`Unknown exa feature: "${feature}"`);
48
- continue;
49
- }
50
-
51
- try {
52
- const module = await loader();
53
- const featureFactory = module.default;
54
-
55
- if (typeof featureFactory === "function") {
56
- const result = await featureFactory(toolApi);
57
- // Handle both single tool and array of tools
58
- if (result) {
59
- const tools = Array.isArray(result) ? result : [result];
60
- for (const tool of tools) {
61
- if (tool && typeof tool === "object" && "name" in tool) {
62
- allTools.push(tool);
63
- }
64
- }
65
- }
66
- }
67
- } catch (error) {
68
- console.error(`Failed to load exa feature "${feature}":`, error);
69
- }
70
- }
71
-
72
- return allTools.length > 0 ? allTools : null;
73
- };
74
-
75
- export default factory;
@@ -1,46 +0,0 @@
1
- /**
2
- * Exa LinkedIn Search Tool
3
- *
4
- * Tools:
5
- * - web_search_linkedin: Search LinkedIn profiles and companies
6
- */
7
-
8
- import type { TSchema } from "@sinclair/typebox";
9
- import type {
10
- CustomAgentTool,
11
- CustomToolFactory,
12
- ToolAPI,
13
- } from "@mariozechner/pi-coding-agent";
14
- import {
15
- callExaTool,
16
- createToolWrapper,
17
- fetchExaTools,
18
- findApiKey,
19
- } from "./shared";
20
-
21
- // MCP tool names for this feature
22
- const TOOL_NAMES = ["linkedin_search_exa"];
23
-
24
- // Tool name mapping: MCP name -> exposed name
25
- const NAME_MAP: Record<string, string> = {
26
- linkedin_search_exa: "web_search_linkedin",
27
- };
28
-
29
- const factory: CustomToolFactory = async (
30
- _toolApi: ToolAPI,
31
- ): Promise<CustomAgentTool<TSchema, unknown>[] | null> => {
32
- const apiKey = findApiKey();
33
- if (!apiKey) return null;
34
-
35
- const mcpTools = await fetchExaTools(apiKey, TOOL_NAMES);
36
- if (mcpTools.length === 0) return null;
37
-
38
- const callFn = (toolName: string, args: Record<string, unknown>) =>
39
- callExaTool(apiKey, TOOL_NAMES, toolName, args);
40
-
41
- return mcpTools.map((tool) =>
42
- createToolWrapper(tool, NAME_MAP[tool.name] ?? tool.name, callFn),
43
- );
44
- };
45
-
46
- export default factory;