@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,48 +0,0 @@
1
- /**
2
- * Exa Deep Researcher Tools
3
- *
4
- * Tools:
5
- * - web_search_researcher_start: Start comprehensive AI research tasks
6
- * - web_search_researcher_check: Check research task status
7
- */
8
-
9
- import type { TSchema } from "@sinclair/typebox";
10
- import type {
11
- CustomAgentTool,
12
- CustomToolFactory,
13
- ToolAPI,
14
- } from "@mariozechner/pi-coding-agent";
15
- import {
16
- callExaTool,
17
- createToolWrapper,
18
- fetchExaTools,
19
- findApiKey,
20
- } from "./shared";
21
-
22
- // MCP tool names for this feature
23
- const TOOL_NAMES = ["deep_researcher_start", "deep_researcher_check"];
24
-
25
- // Tool name mapping: MCP name -> exposed name
26
- const NAME_MAP: Record<string, string> = {
27
- deep_researcher_start: "web_search_researcher_start",
28
- deep_researcher_check: "web_search_researcher_check",
29
- };
30
-
31
- const factory: CustomToolFactory = async (
32
- _toolApi: ToolAPI,
33
- ): Promise<CustomAgentTool<TSchema, unknown>[] | null> => {
34
- const apiKey = findApiKey();
35
- if (!apiKey) return null;
36
-
37
- const mcpTools = await fetchExaTools(apiKey, TOOL_NAMES);
38
- if (mcpTools.length === 0) return null;
39
-
40
- const callFn = (toolName: string, args: Record<string, unknown>) =>
41
- callExaTool(apiKey, TOOL_NAMES, toolName, args);
42
-
43
- return mcpTools.map((tool) =>
44
- createToolWrapper(tool, NAME_MAP[tool.name] ?? tool.name, callFn),
45
- );
46
- };
47
-
48
- export default factory;
@@ -1,4 +0,0 @@
1
- {
2
- "features": ["search"],
3
- "options": {}
4
- }
@@ -1,57 +0,0 @@
1
- /**
2
- * Exa Search Tools - Core web search capabilities
3
- *
4
- * Tools:
5
- * - web_search_general: Real-time web searches
6
- * - web_search_deep: Natural language web search with synthesis
7
- * - web_search_code_context: Code search for libraries, docs, examples
8
- * - web_search_crawl_url: Extract content from specific URLs
9
- */
10
-
11
- import type { TSchema } from "@sinclair/typebox";
12
- import type {
13
- CustomAgentTool,
14
- CustomToolFactory,
15
- ToolAPI,
16
- } from "@mariozechner/pi-coding-agent";
17
- import {
18
- callExaTool,
19
- createToolWrapper,
20
- fetchExaTools,
21
- findApiKey,
22
- } from "./shared";
23
-
24
- // MCP tool names for this feature
25
- const TOOL_NAMES = [
26
- "web_search_exa",
27
- "deep_search_exa",
28
- "get_code_context_exa",
29
- "crawling_exa",
30
- ];
31
-
32
- // Tool name mapping: MCP name -> exposed name
33
- const NAME_MAP: Record<string, string> = {
34
- web_search_exa: "web_search_general",
35
- deep_search_exa: "web_search_deep",
36
- get_code_context_exa: "web_search_code_context",
37
- crawling_exa: "web_search_crawl_url",
38
- };
39
-
40
- const factory: CustomToolFactory = async (
41
- _toolApi: ToolAPI,
42
- ): Promise<CustomAgentTool<TSchema, unknown>[] | null> => {
43
- const apiKey = findApiKey();
44
- if (!apiKey) return null;
45
-
46
- const mcpTools = await fetchExaTools(apiKey, TOOL_NAMES);
47
- if (mcpTools.length === 0) return null;
48
-
49
- const callFn = (toolName: string, args: Record<string, unknown>) =>
50
- callExaTool(apiKey, TOOL_NAMES, toolName, args);
51
-
52
- return mcpTools.map((tool) =>
53
- createToolWrapper(tool, NAME_MAP[tool.name] ?? tool.name, callFn),
54
- );
55
- };
56
-
57
- export default factory;
@@ -1,256 +0,0 @@
1
- /**
2
- * Shared utilities for Exa MCP tools
3
- */
4
-
5
- import * as fs from "node:fs";
6
- import * as os from "node:os";
7
- import * as path from "node:path";
8
- import type { TSchema } from "@sinclair/typebox";
9
- import type { CustomAgentTool } from "@mariozechner/pi-coding-agent";
10
-
11
- // MCP endpoints
12
- export const EXA_MCP_URL = "https://mcp.exa.ai/mcp";
13
- export const WEBSETS_MCP_URL = "https://websetsmcp.exa.ai/mcp";
14
-
15
- export interface MCPTool {
16
- name: string;
17
- description: string;
18
- inputSchema: TSchema;
19
- }
20
-
21
- interface MCPToolsResponse {
22
- result?: {
23
- tools: MCPTool[];
24
- };
25
- error?: {
26
- code: number;
27
- message: string;
28
- };
29
- }
30
-
31
- /**
32
- * Parse a .env file and return key-value pairs
33
- */
34
- function parseEnvFile(filePath: string): Record<string, string> {
35
- const result: Record<string, string> = {};
36
- if (!fs.existsSync(filePath)) return result;
37
-
38
- try {
39
- const content = fs.readFileSync(filePath, "utf-8");
40
- for (const line of content.split("\n")) {
41
- const trimmed = line.trim();
42
- if (!trimmed || trimmed.startsWith("#")) continue;
43
-
44
- const eqIndex = trimmed.indexOf("=");
45
- if (eqIndex === -1) continue;
46
-
47
- const key = trimmed.slice(0, eqIndex).trim();
48
- let value = trimmed.slice(eqIndex + 1).trim();
49
-
50
- // Remove surrounding quotes
51
- if (
52
- (value.startsWith('"') && value.endsWith('"')) ||
53
- (value.startsWith("'") && value.endsWith("'"))
54
- ) {
55
- value = value.slice(1, -1);
56
- }
57
-
58
- result[key] = value;
59
- }
60
- } catch {
61
- // Ignore read errors
62
- }
63
-
64
- return result;
65
- }
66
-
67
- /**
68
- * Find EXA_API_KEY from environment or .env files
69
- */
70
- export function findApiKey(): string | null {
71
- // 1. Check environment variable
72
- if (process.env.EXA_API_KEY) {
73
- return process.env.EXA_API_KEY;
74
- }
75
-
76
- // 2. Check .env in current directory
77
- const localEnv = parseEnvFile(path.join(process.cwd(), ".env"));
78
- if (localEnv.EXA_API_KEY) {
79
- return localEnv.EXA_API_KEY;
80
- }
81
-
82
- // 3. Check ~/.env
83
- const homeEnv = parseEnvFile(path.join(os.homedir(), ".env"));
84
- if (homeEnv.EXA_API_KEY) {
85
- return homeEnv.EXA_API_KEY;
86
- }
87
-
88
- return null;
89
- }
90
-
91
- /**
92
- * Call an MCP server endpoint
93
- */
94
- async function callMCP(
95
- url: string,
96
- method: string,
97
- params?: Record<string, unknown>,
98
- ): Promise<unknown> {
99
- const body = {
100
- jsonrpc: "2.0",
101
- method,
102
- params: params ?? {},
103
- id: 1,
104
- };
105
-
106
- const response = await fetch(url, {
107
- method: "POST",
108
- headers: {
109
- "Content-Type": "application/json",
110
- Accept: "application/json, text/event-stream",
111
- },
112
- body: JSON.stringify(body),
113
- });
114
-
115
- const text = await response.text();
116
-
117
- // Parse SSE response format
118
- let jsonData: string | null = null;
119
- for (const line of text.split("\n")) {
120
- if (line.startsWith("data: ")) {
121
- jsonData = line.slice(6);
122
- break;
123
- }
124
- }
125
-
126
- if (!jsonData) {
127
- // Try parsing as plain JSON
128
- try {
129
- return JSON.parse(text);
130
- } catch {
131
- throw new Error(`Failed to parse MCP response: ${text.slice(0, 500)}`);
132
- }
133
- }
134
-
135
- return JSON.parse(jsonData);
136
- }
137
-
138
- /**
139
- * Fetch available tools from Exa MCP server
140
- */
141
- export async function fetchExaTools(
142
- apiKey: string,
143
- toolNames: string[],
144
- ): Promise<MCPTool[]> {
145
- const url = `${EXA_MCP_URL}?exaApiKey=${apiKey}&tools=${toolNames.join(",")}`;
146
-
147
- try {
148
- const response = (await callMCP(url, "tools/list")) as MCPToolsResponse;
149
- if (response.error) {
150
- throw new Error(response.error.message);
151
- }
152
- return response.result?.tools ?? [];
153
- } catch (error) {
154
- console.error(`Failed to fetch Exa tools:`, error);
155
- return [];
156
- }
157
- }
158
-
159
- /**
160
- * Fetch available tools from Websets MCP server
161
- */
162
- export async function fetchWebsetsTools(apiKey: string): Promise<MCPTool[]> {
163
- const url = `${WEBSETS_MCP_URL}?exaApiKey=${apiKey}`;
164
-
165
- try {
166
- const response = (await callMCP(url, "tools/list")) as MCPToolsResponse;
167
- if (response.error) {
168
- throw new Error(response.error.message);
169
- }
170
- return response.result?.tools ?? [];
171
- } catch (error) {
172
- console.error(`Failed to fetch Websets tools:`, error);
173
- return [];
174
- }
175
- }
176
-
177
- /**
178
- * Call a tool on Exa MCP server
179
- */
180
- export async function callExaTool(
181
- apiKey: string,
182
- toolNames: string[],
183
- toolName: string,
184
- args: Record<string, unknown>,
185
- ): Promise<unknown> {
186
- const url = `${EXA_MCP_URL}?exaApiKey=${apiKey}&tools=${toolNames.join(",")}`;
187
- return callMCPTool(url, toolName, args);
188
- }
189
-
190
- /**
191
- * Call a tool on Websets MCP server
192
- */
193
- export async function callWebsetsTool(
194
- apiKey: string,
195
- toolName: string,
196
- args: Record<string, unknown>,
197
- ): Promise<unknown> {
198
- const url = `${WEBSETS_MCP_URL}?exaApiKey=${apiKey}`;
199
- return callMCPTool(url, toolName, args);
200
- }
201
-
202
- /**
203
- * Call a tool on an MCP server
204
- */
205
- async function callMCPTool(
206
- url: string,
207
- toolName: string,
208
- args: Record<string, unknown>,
209
- ): Promise<unknown> {
210
- const response = (await callMCP(url, "tools/call", {
211
- name: toolName,
212
- arguments: args,
213
- })) as {
214
- result?: { content?: Array<{ text?: string }> };
215
- error?: { message: string };
216
- };
217
-
218
- if (response.error) {
219
- throw new Error(response.error.message);
220
- }
221
-
222
- // Extract text content from MCP response
223
- const content = response.result?.content;
224
- if (Array.isArray(content)) {
225
- const texts = content.filter((c) => c.text).map((c) => c.text);
226
- if (texts.length === 1) {
227
- // Try to parse as JSON
228
- try {
229
- return JSON.parse(texts[0]!);
230
- } catch {
231
- return texts[0];
232
- }
233
- }
234
- return texts.join("\n\n");
235
- }
236
-
237
- return response.result;
238
- }
239
-
240
- /**
241
- * Create a tool wrapper for an MCP tool
242
- */
243
- export function createToolWrapper(
244
- mcpTool: MCPTool,
245
- renamedName: string,
246
- callFn: (toolName: string, args: Record<string, unknown>) => Promise<unknown>,
247
- ): CustomAgentTool<TSchema, unknown> {
248
- return {
249
- name: renamedName,
250
- description: mcpTool.description,
251
- parameters: mcpTool.inputSchema,
252
- async execute(args) {
253
- return callFn(mcpTool.name, args as Record<string, unknown>);
254
- },
255
- };
256
- }
@@ -1,73 +0,0 @@
1
- /**
2
- * Exa Websets Tools - Entity collection management
3
- *
4
- * Tools:
5
- * - webset_create: Create entity collections with search/enrichments
6
- * - webset_list: List all websets
7
- * - webset_get: Get webset details
8
- * - webset_update: Update webset metadata
9
- * - webset_delete: Delete a webset
10
- * - webset_items_list: List items in a webset
11
- * - webset_item_get: Get item details
12
- * - webset_search_create: Add search to webset
13
- * - webset_search_get: Check search status
14
- * - webset_search_cancel: Cancel running search
15
- * - webset_enrichment_create: Extract custom data from items
16
- * - webset_enrichment_get: Get enrichment details
17
- * - webset_enrichment_update: Update enrichment metadata
18
- * - webset_enrichment_delete: Delete enrichment
19
- * - webset_enrichment_cancel: Cancel running enrichment
20
- * - webset_monitor_create: Auto-update webset on schedule
21
- */
22
-
23
- import type { TSchema } from "@sinclair/typebox";
24
- import type {
25
- CustomAgentTool,
26
- CustomToolFactory,
27
- ToolAPI,
28
- } from "@mariozechner/pi-coding-agent";
29
- import {
30
- callWebsetsTool,
31
- createToolWrapper,
32
- fetchWebsetsTools,
33
- findApiKey,
34
- } from "./shared";
35
-
36
- // Tool name mapping: MCP name -> exposed name
37
- const NAME_MAP: Record<string, string> = {
38
- create_webset: "webset_create",
39
- list_websets: "webset_list",
40
- get_webset: "webset_get",
41
- update_webset: "webset_update",
42
- delete_webset: "webset_delete",
43
- list_webset_items: "webset_items_list",
44
- get_item: "webset_item_get",
45
- create_search: "webset_search_create",
46
- get_search: "webset_search_get",
47
- cancel_search: "webset_search_cancel",
48
- create_enrichment: "webset_enrichment_create",
49
- get_enrichment: "webset_enrichment_get",
50
- update_enrichment: "webset_enrichment_update",
51
- delete_enrichment: "webset_enrichment_delete",
52
- cancel_enrichment: "webset_enrichment_cancel",
53
- create_monitor: "webset_monitor_create",
54
- };
55
-
56
- const factory: CustomToolFactory = async (
57
- _toolApi: ToolAPI,
58
- ): Promise<CustomAgentTool<TSchema, unknown>[] | null> => {
59
- const apiKey = findApiKey();
60
- if (!apiKey) return null;
61
-
62
- const mcpTools = await fetchWebsetsTools(apiKey);
63
- if (mcpTools.length === 0) return null;
64
-
65
- const callFn = (toolName: string, args: Record<string, unknown>) =>
66
- callWebsetsTool(apiKey, toolName, args);
67
-
68
- return mcpTools.map((tool) =>
69
- createToolWrapper(tool, NAME_MAP[tool.name] ?? tool.name, callFn),
70
- );
71
- };
72
-
73
- export default factory;
@@ -1,13 +0,0 @@
1
- # Metal Theme
2
-
3
- A metal theme for pi.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- omp install oh-my-pi/plugins/metal-theme
9
- ```
10
-
11
- ## Contents
12
-
13
- - `themes/metal.json` - Metal theme configuration
@@ -1,8 +0,0 @@
1
- {
2
- "name": "metal-theme",
3
- "version": "0.1.0",
4
- "description": "Metal theme for pi",
5
- "install": [
6
- { "src": "themes/metal.json", "dest": "agent/themes/metal.json" }
7
- ]
8
- }
@@ -1,28 +0,0 @@
1
- {
2
- "name": "@oh-my-pi/metal-theme",
3
- "version": "0.4.0",
4
- "description": "Metal theme for pi",
5
- "keywords": [
6
- "omp-plugin",
7
- "theme",
8
- "metal"
9
- ],
10
- "author": "Can Bölük <me@can.ac>",
11
- "license": "MIT",
12
- "repository": {
13
- "type": "git",
14
- "url": "https://github.com/can1357/oh-my-pi.git",
15
- "directory": "plugins/metal-theme"
16
- },
17
- "omp": {
18
- "install": [
19
- {
20
- "src": "themes/metal.json",
21
- "dest": "agent/themes/metal.json"
22
- }
23
- ]
24
- },
25
- "files": [
26
- "themes"
27
- ]
28
- }
@@ -1,79 +0,0 @@
1
- {
2
- "$schema": "https://raw.githubusercontent.com/badlogic/pi-mono/main/packages/coding-agent/theme-schema.json",
3
- "name": "claude",
4
- "vars": {
5
- "cyan": "#0088fa",
6
- "blue": "#178fb9",
7
- "green": "#89d281",
8
- "red": "#fc3a4b",
9
- "yellow": "#e4c00f",
10
- "gray": "#777d88",
11
- "dimGray": "#5f6673",
12
- "darkGray": "#3d424a",
13
- "accent": "#febc38",
14
- "selectedBg": "#31363f",
15
- "userMsgBg": "#221d1a",
16
- "toolPendingBg": "#1d2129",
17
- "toolSuccessBg": "#161a1f",
18
- "toolErrorBg": "#291d1d",
19
- "customMsgBg": "#2a2530"
20
- },
21
- "colors": {
22
- "accent": "accent",
23
- "border": "blue",
24
- "borderAccent": "cyan",
25
- "borderMuted": "darkGray",
26
- "success": "green",
27
- "error": "red",
28
- "warning": "yellow",
29
- "muted": "gray",
30
- "dim": "dimGray",
31
- "text": "",
32
-
33
- "selectedBg": "selectedBg",
34
- "userMessageBg": "userMsgBg",
35
- "userMessageText": "",
36
- "customMessageBg": "customMsgBg",
37
- "customMessageText": "",
38
- "customMessageLabel": "#b281d6",
39
- "toolPendingBg": "toolPendingBg",
40
- "toolSuccessBg": "toolSuccessBg",
41
- "toolErrorBg": "toolErrorBg",
42
- "toolTitle": "",
43
- "toolOutput": "gray",
44
-
45
- "mdHeading": "#febc38",
46
- "mdLink": "#0088fa",
47
- "mdLinkUrl": "dimGray",
48
- "mdCode": "#e5c1ff",
49
- "mdCodeBlock": "#9CDCFE",
50
- "mdCodeBlockBorder": "darkGray",
51
- "mdQuote": "gray",
52
- "mdQuoteBorder": "darkGray",
53
- "mdHr": "darkGray",
54
- "mdListBullet": "accent",
55
-
56
- "toolDiffAdded": "green",
57
- "toolDiffRemoved": "red",
58
- "toolDiffContext": "gray",
59
-
60
- "syntaxComment": "#6A9955",
61
- "syntaxKeyword": "#569CD6",
62
- "syntaxFunction": "#DCDCAA",
63
- "syntaxVariable": "#9CDCFE",
64
- "syntaxString": "#CE9178",
65
- "syntaxNumber": "#B5CEA8",
66
- "syntaxType": "#4EC9B0",
67
- "syntaxOperator": "#D4D4D4",
68
- "syntaxPunctuation": "#D4D4D4",
69
-
70
- "thinkingOff": "darkGray",
71
- "thinkingMinimal": "dimGray",
72
- "thinkingLow": "#178fb9",
73
- "thinkingMedium": "#0088fa",
74
- "thinkingHigh": "#b281d6",
75
- "thinkingXhigh": "#e5c1ff",
76
-
77
- "bashMode": "cyan"
78
- }
79
- }
@@ -1,28 +0,0 @@
1
- # Subagents Plugin
2
-
3
- Task delegation system with specialized subagents for pi.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- omp install oh-my-pi/plugins/subagents
9
- ```
10
-
11
- ## Contents
12
-
13
- ### Tool
14
-
15
- - `tools/task/index.ts` - The Task tool for launching subagents
16
-
17
- ### Agents
18
-
19
- - `agents/task.md` - General-purpose subagent for delegated tasks
20
- - `agents/planner.md` - Software architect for designing implementation plans
21
- - `agents/explore.md` - Fast read-only codebase scout
22
- - `agents/reviewer.md` - Expert code reviewer
23
-
24
- ### Commands
25
-
26
- - `commands/implement.md` - Implement a feature
27
- - `commands/implement-with-critic.md` - Implement with critic review loop
28
- - `commands/architect-plan.md` - Create an architecture plan
@@ -1,82 +0,0 @@
1
- ---
2
- name: explore
3
- description: Fast read-only codebase scout that returns compressed context for handoff
4
- tools: read, grep, glob, ls, bash
5
- model: claude-opus-4-5
6
- ---
7
-
8
- You are a file search specialist and codebase scout. Quickly investigate a codebase and return structured findings that another agent can use without re-reading everything.
9
-
10
- === CRITICAL: READ-ONLY MODE ===
11
- This is a READ-ONLY exploration task. You are STRICTLY PROHIBITED from:
12
-
13
- - Creating or modifying files (no Write, Edit, touch, rm, mv, cp)
14
- - Creating temporary files anywhere, including /tmp
15
- - Using redirect operators (>, >>, |) or heredocs to write files
16
- - Running commands that change system state (git add, git commit, npm install, pip install)
17
-
18
- Your role is EXCLUSIVELY to search and analyze existing code.
19
-
20
- Your strengths:
21
-
22
- - Rapidly finding files using glob patterns
23
- - Searching code with powerful regex patterns
24
- - Reading and analyzing file contents
25
- - Tracing imports and dependencies
26
-
27
- Guidelines:
28
-
29
- - Use glob for broad file pattern matching
30
- - Use grep for searching file contents with regex
31
- - Use read when you know the specific file path
32
- - Use bash ONLY for read-only operations (ls, git status, git log, git diff, find, cat, head, tail)
33
- - Spawn multiple parallel tool calls wherever possible—you are meant to be fast
34
- - Return file paths as absolute paths in your final response
35
- - Communicate findings directly as a message—do NOT create output files
36
-
37
- Thoroughness (infer from task, default medium):
38
-
39
- - Quick: Targeted lookups, key files only
40
- - Medium: Follow imports, read critical sections
41
- - Thorough: Trace all dependencies, check tests/types
42
-
43
- Strategy:
44
-
45
- 1. grep/glob to locate relevant code
46
- 2. Read key sections (not entire files unless small)
47
- 3. Identify types, interfaces, key functions
48
- 4. Note dependencies between files
49
-
50
- Your output will be passed to an agent who has NOT seen the files you explored.
51
-
52
- Output format:
53
-
54
- ## Query
55
-
56
- One line summary of what was searched.
57
-
58
- ## Files Retrieved
59
-
60
- List with exact line ranges:
61
-
62
- 1. `path/to/file.ts` (lines 10-50) - Description of what's here
63
- 2. `path/to/other.ts` (lines 100-150) - Description
64
- 3. ...
65
-
66
- ## Key Code
67
-
68
- Critical types, interfaces, or functions (actual code excerpts):
69
-
70
- ```language
71
- interface Example {
72
- // actual code from the files
73
- }
74
- ```
75
-
76
- ## Architecture
77
-
78
- Brief explanation of how the pieces connect.
79
-
80
- ## Start Here
81
-
82
- Which file to look at first and why.