@oh-my-pi/pi-coding-agent 13.1.2 → 13.2.1

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 (235) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/package.json +7 -7
  3. package/scripts/format-prompts.ts +33 -14
  4. package/src/async/job-manager.ts +43 -1
  5. package/src/capability/index.ts +1 -2
  6. package/src/capability/tool.ts +1 -1
  7. package/src/cli/args.ts +1 -2
  8. package/src/cli/config-cli.ts +1 -1
  9. package/src/cli/file-processor.ts +1 -2
  10. package/src/cli/grep-cli.ts +1 -1
  11. package/src/cli/jupyter-cli.ts +1 -1
  12. package/src/cli/plugin-cli.ts +1 -1
  13. package/src/cli/setup-cli.ts +1 -1
  14. package/src/cli/shell-cli.ts +1 -1
  15. package/src/cli/ssh-cli.ts +1 -1
  16. package/src/cli/stats-cli.ts +1 -2
  17. package/src/cli/update-cli.ts +1 -2
  18. package/src/cli/web-search-cli.ts +1 -1
  19. package/src/cli.ts +1 -1
  20. package/src/commands/launch.ts +2 -1
  21. package/src/commit/agentic/agent.ts +2 -1
  22. package/src/commit/agentic/index.ts +1 -2
  23. package/src/commit/agentic/prompts/system.md +3 -3
  24. package/src/commit/agentic/tools/propose-changelog.ts +30 -19
  25. package/src/commit/changelog/generate.ts +16 -6
  26. package/src/commit/changelog/index.ts +2 -1
  27. package/src/commit/pipeline.ts +1 -2
  28. package/src/commit/prompts/reduce-system.md +1 -1
  29. package/src/commit/types.ts +10 -1
  30. package/src/config/keybindings.ts +1 -2
  31. package/src/config/model-registry.ts +1 -1
  32. package/src/config/prompt-templates.ts +14 -2
  33. package/src/config/settings-schema.ts +10 -0
  34. package/src/config/settings.ts +25 -2
  35. package/src/config.ts +1 -2
  36. package/src/debug/index.ts +1 -1
  37. package/src/debug/report-bundle.ts +1 -2
  38. package/src/debug/system-info.ts +1 -2
  39. package/src/discovery/agents.ts +2 -2
  40. package/src/discovery/builtin.ts +24 -14
  41. package/src/discovery/claude-plugins.ts +3 -2
  42. package/src/discovery/claude.ts +9 -9
  43. package/src/discovery/codex.ts +3 -3
  44. package/src/discovery/cursor.ts +5 -4
  45. package/src/discovery/gemini.ts +5 -5
  46. package/src/discovery/helpers.ts +47 -69
  47. package/src/discovery/mcp-json.ts +3 -3
  48. package/src/discovery/opencode.ts +7 -8
  49. package/src/discovery/ssh.ts +3 -3
  50. package/src/discovery/vscode.ts +3 -2
  51. package/src/discovery/windsurf.ts +3 -2
  52. package/src/exa/company.ts +1 -1
  53. package/src/exa/factory.ts +1 -6
  54. package/src/exa/linkedin.ts +1 -1
  55. package/src/exa/mcp-client.ts +19 -8
  56. package/src/exa/search.ts +2 -2
  57. package/src/exa/types.ts +3 -3
  58. package/src/exec/bash-executor.ts +2 -1
  59. package/src/exec/non-interactive-env.ts +43 -0
  60. package/src/export/custom-share.ts +1 -1
  61. package/src/export/html/index.ts +1 -2
  62. package/src/extensibility/custom-commands/loader.ts +1 -2
  63. package/src/extensibility/plugins/installer.ts +1 -2
  64. package/src/extensibility/plugins/loader.ts +1 -2
  65. package/src/extensibility/plugins/manager.ts +3 -2
  66. package/src/extensibility/skills.ts +59 -115
  67. package/src/index.ts +1 -3
  68. package/src/internal-urls/docs-index.generated.ts +1 -1
  69. package/src/ipy/executor.ts +1 -2
  70. package/src/ipy/gateway-coordinator.ts +1 -2
  71. package/src/ipy/modules.ts +1 -1
  72. package/src/ipy/runtime.ts +1 -3
  73. package/src/main.ts +1 -2
  74. package/src/mcp/config.ts +1 -1
  75. package/src/mcp/transports/stdio.ts +1 -2
  76. package/src/memories/index.ts +1 -2
  77. package/src/modes/components/diff.ts +49 -19
  78. package/src/modes/components/extensions/extension-dashboard.ts +1 -1
  79. package/src/modes/components/extensions/inspector-panel.ts +8 -2
  80. package/src/modes/components/footer.ts +1 -2
  81. package/src/modes/components/status-line/segments.ts +1 -2
  82. package/src/modes/components/tool-execution.ts +3 -10
  83. package/src/modes/components/welcome.ts +1 -1
  84. package/src/modes/controllers/command-controller.ts +1 -2
  85. package/src/modes/controllers/mcp-command-controller.ts +1 -1
  86. package/src/modes/controllers/selector-controller.ts +1 -1
  87. package/src/modes/controllers/ssh-command-controller.ts +1 -1
  88. package/src/modes/interactive-mode.ts +2 -3
  89. package/src/modes/shared.ts +1 -2
  90. package/src/modes/theme/theme.ts +1 -2
  91. package/src/patch/index.ts +1 -25
  92. package/src/prompts/agents/designer.md +7 -10
  93. package/src/prompts/agents/explore.md +15 -23
  94. package/src/prompts/agents/init.md +23 -23
  95. package/src/prompts/agents/plan.md +14 -77
  96. package/src/prompts/agents/reviewer.md +6 -5
  97. package/src/prompts/agents/task.md +13 -11
  98. package/src/prompts/compaction/branch-summary.md +3 -3
  99. package/src/prompts/compaction/compaction-short-summary.md +7 -7
  100. package/src/prompts/compaction/compaction-summary-context.md +1 -1
  101. package/src/prompts/compaction/compaction-summary.md +5 -5
  102. package/src/prompts/compaction/compaction-turn-prefix.md +3 -3
  103. package/src/prompts/compaction/compaction-update-summary.md +11 -11
  104. package/src/prompts/memories/consolidation.md +5 -5
  105. package/src/prompts/memories/read-path.md +6 -6
  106. package/src/prompts/memories/stage_one_input.md +1 -1
  107. package/src/prompts/memories/stage_one_system.md +5 -5
  108. package/src/prompts/review-request.md +4 -4
  109. package/src/prompts/system/agent-creation-architect.md +17 -17
  110. package/src/prompts/system/agent-creation-user.md +2 -2
  111. package/src/prompts/system/custom-system-prompt.md +4 -4
  112. package/src/prompts/system/plan-mode-active.md +20 -20
  113. package/src/prompts/system/plan-mode-approved.md +7 -7
  114. package/src/prompts/system/plan-mode-reference.md +2 -2
  115. package/src/prompts/system/plan-mode-subagent.md +8 -8
  116. package/src/prompts/system/subagent-submit-reminder.md +5 -5
  117. package/src/prompts/system/subagent-system-prompt.md +29 -22
  118. package/src/prompts/system/subagent-user-prompt.md +7 -3
  119. package/src/prompts/system/summarization-system.md +1 -1
  120. package/src/prompts/system/system-prompt.md +201 -226
  121. package/src/prompts/system/title-system.md +2 -2
  122. package/src/prompts/system/ttsr-interrupt.md +1 -1
  123. package/src/prompts/system/web-search.md +16 -16
  124. package/src/prompts/tools/ask.md +1 -3
  125. package/src/prompts/tools/await.md +2 -4
  126. package/src/prompts/tools/bash.md +5 -7
  127. package/src/prompts/tools/browser.md +4 -6
  128. package/src/prompts/tools/calculator.md +1 -3
  129. package/src/prompts/tools/cancel-job.md +2 -4
  130. package/src/prompts/tools/exit-plan-mode.md +7 -7
  131. package/src/prompts/tools/fetch.md +0 -2
  132. package/src/prompts/tools/find.md +3 -5
  133. package/src/prompts/tools/gemini-image.md +6 -22
  134. package/src/prompts/tools/grep.md +4 -6
  135. package/src/prompts/tools/hashline.md +12 -15
  136. package/src/prompts/tools/lsp.md +1 -3
  137. package/src/prompts/tools/patch.md +7 -9
  138. package/src/prompts/tools/python.md +10 -14
  139. package/src/prompts/tools/read.md +0 -2
  140. package/src/prompts/tools/replace.md +5 -7
  141. package/src/prompts/tools/ssh.md +3 -5
  142. package/src/prompts/tools/task.md +6 -8
  143. package/src/prompts/tools/todo-write.md +7 -9
  144. package/src/prompts/tools/web-search.md +3 -5
  145. package/src/prompts/tools/write.md +3 -5
  146. package/src/sdk.ts +1 -2
  147. package/src/session/agent-session.ts +10 -26
  148. package/src/session/agent-storage.ts +1 -2
  149. package/src/session/history-storage.ts +1 -2
  150. package/src/session/session-manager.ts +10 -2
  151. package/src/ssh/connection-manager.ts +11 -2
  152. package/src/ssh/sshfs-mount.ts +7 -1
  153. package/src/system-prompt.ts +25 -103
  154. package/src/task/agents.ts +1 -1
  155. package/src/task/worktree.ts +1 -2
  156. package/src/tools/ask.ts +0 -1
  157. package/src/tools/await-tool.ts +6 -3
  158. package/src/tools/bash-interactive.ts +2 -45
  159. package/src/tools/bash.ts +5 -5
  160. package/src/tools/browser.ts +1 -2
  161. package/src/tools/gemini-image.ts +8 -28
  162. package/src/tools/json-tree.ts +2 -1
  163. package/src/tools/python.ts +1 -1
  164. package/src/tools/read.ts +1 -2
  165. package/src/tools/render-utils.ts +5 -2
  166. package/src/tools/todo-write.ts +11 -9
  167. package/src/utils/tools-manager.ts +1 -2
  168. package/src/web/scrapers/artifacthub.ts +2 -1
  169. package/src/web/scrapers/aur.ts +2 -1
  170. package/src/web/scrapers/biorxiv.ts +2 -1
  171. package/src/web/scrapers/bluesky.ts +2 -1
  172. package/src/web/scrapers/chocolatey.ts +2 -1
  173. package/src/web/scrapers/cisa-kev.ts +2 -1
  174. package/src/web/scrapers/clojars.ts +2 -1
  175. package/src/web/scrapers/coingecko.ts +2 -1
  176. package/src/web/scrapers/crates-io.ts +2 -1
  177. package/src/web/scrapers/crossref.ts +2 -1
  178. package/src/web/scrapers/discogs.ts +3 -1
  179. package/src/web/scrapers/discourse.ts +2 -1
  180. package/src/web/scrapers/dockerhub.ts +2 -1
  181. package/src/web/scrapers/fdroid.ts +2 -1
  182. package/src/web/scrapers/firefox-addons.ts +2 -1
  183. package/src/web/scrapers/flathub.ts +2 -1
  184. package/src/web/scrapers/gitlab.ts +1 -1
  185. package/src/web/scrapers/go-pkg.ts +2 -1
  186. package/src/web/scrapers/hackage.ts +2 -1
  187. package/src/web/scrapers/hackernews.ts +2 -1
  188. package/src/web/scrapers/hex.ts +2 -1
  189. package/src/web/scrapers/huggingface.ts +2 -1
  190. package/src/web/scrapers/jetbrains-marketplace.ts +2 -1
  191. package/src/web/scrapers/lemmy.ts +2 -1
  192. package/src/web/scrapers/lobsters.ts +2 -1
  193. package/src/web/scrapers/mastodon.ts +2 -1
  194. package/src/web/scrapers/maven.ts +2 -1
  195. package/src/web/scrapers/mdn.ts +2 -1
  196. package/src/web/scrapers/metacpan.ts +2 -1
  197. package/src/web/scrapers/musicbrainz.ts +3 -1
  198. package/src/web/scrapers/npm.ts +2 -1
  199. package/src/web/scrapers/nuget.ts +2 -1
  200. package/src/web/scrapers/nvd.ts +2 -1
  201. package/src/web/scrapers/ollama.ts +2 -1
  202. package/src/web/scrapers/open-vsx.ts +2 -1
  203. package/src/web/scrapers/opencorporates.ts +2 -1
  204. package/src/web/scrapers/openlibrary.ts +2 -1
  205. package/src/web/scrapers/orcid.ts +3 -1
  206. package/src/web/scrapers/osv.ts +2 -1
  207. package/src/web/scrapers/packagist.ts +2 -1
  208. package/src/web/scrapers/pub-dev.ts +2 -1
  209. package/src/web/scrapers/pubmed.ts +2 -1
  210. package/src/web/scrapers/pypi.ts +2 -1
  211. package/src/web/scrapers/rawg.ts +2 -8
  212. package/src/web/scrapers/reddit.ts +2 -1
  213. package/src/web/scrapers/repology.ts +2 -1
  214. package/src/web/scrapers/rfc.ts +2 -1
  215. package/src/web/scrapers/rubygems.ts +2 -1
  216. package/src/web/scrapers/searchcode.ts +2 -1
  217. package/src/web/scrapers/sec-edgar.ts +2 -1
  218. package/src/web/scrapers/semantic-scholar.ts +2 -1
  219. package/src/web/scrapers/snapcraft.ts +2 -1
  220. package/src/web/scrapers/sourcegraph.ts +2 -1
  221. package/src/web/scrapers/spdx.ts +2 -1
  222. package/src/web/scrapers/stackoverflow.ts +2 -1
  223. package/src/web/scrapers/terraform.ts +2 -1
  224. package/src/web/scrapers/types.ts +0 -11
  225. package/src/web/scrapers/vimeo.ts +2 -1
  226. package/src/web/scrapers/vscode-marketplace.ts +2 -1
  227. package/src/web/scrapers/w3c.ts +2 -1
  228. package/src/web/scrapers/wikidata.ts +2 -1
  229. package/src/web/search/index.ts +10 -14
  230. package/src/web/search/provider.ts +2 -2
  231. package/src/web/search/providers/codex.ts +1 -2
  232. package/src/web/search/providers/exa.ts +1 -6
  233. package/src/web/search/providers/gemini.ts +1 -1
  234. package/src/web/search/providers/perplexity.ts +1 -2
  235. package/src/web/search/providers/utils.ts +1 -1
@@ -1,3 +1,4 @@
1
+ import { getIndentation } from "@oh-my-pi/pi-utils";
1
2
  import * as Diff from "diff";
2
3
  import { theme } from "../../modes/theme/theme";
3
4
  import { replaceTabs } from "../../tools/render-utils";
@@ -12,26 +13,30 @@ const DIM_OFF = "\x1b[22m";
12
13
  * before the first non-whitespace character; remaining tabs in code
13
14
  * content are replaced with spaces (like replaceTabs).
14
15
  */
15
- function visualizeIndent(text: string): string {
16
+ function visualizeIndent(text: string, filePath?: string): string {
16
17
  const match = text.match(/^([ \t]+)/);
17
- if (!match) return replaceTabs(text);
18
+ if (!match) return replaceTabs(text, filePath);
18
19
  const indent = match[1];
19
20
  const rest = text.slice(indent.length);
20
- // Normalize: collapse 3-space groups (tab-width) into tab arrows,
21
- // then handle remaining tabs and lone spaces.
22
- const normalized = indent.replaceAll("\t", " ");
21
+ const indentation = getIndentation(filePath);
22
+ const tabWidth = indentation.length;
23
+ const leftPadding = Math.floor(tabWidth / 2);
24
+ const rightPadding = Math.max(0, tabWidth - leftPadding - 1);
25
+ const tabMarker = `${DIM}${" ".repeat(leftPadding)}→${" ".repeat(rightPadding)}${DIM_OFF}`;
26
+ // Normalize: collapse configured tab-width groups into tab markers, then handle remaining spaces.
27
+ const normalized = indent.replaceAll("\t", indentation);
23
28
  let visible = "";
24
29
  let pos = 0;
25
30
  while (pos < normalized.length) {
26
- if (pos + 3 <= normalized.length && normalized.slice(pos, pos + 3) === " ") {
27
- visible += `${DIM} → ${DIM_OFF}`;
28
- pos += 3;
31
+ if (pos + tabWidth <= normalized.length && normalized.slice(pos, pos + tabWidth) === indentation) {
32
+ visible += tabMarker;
33
+ pos += tabWidth;
29
34
  } else {
30
35
  visible += `${DIM}·${DIM_OFF}`;
31
36
  pos++;
32
37
  }
33
38
  }
34
- return `${visible}${replaceTabs(rest)}`;
39
+ return `${visible}${replaceTabs(rest, filePath)}`;
35
40
  }
36
41
 
37
42
  /**
@@ -96,7 +101,7 @@ function renderIntraLineDiff(oldContent: string, newContent: string): { removedL
96
101
  }
97
102
 
98
103
  export interface RenderDiffOptions {
99
- /** File path (unused, kept for API compatibility) */
104
+ /** File path used to resolve indentation (.editorconfig + defaults) */
100
105
  filePath?: string;
101
106
  }
102
107
 
@@ -106,7 +111,7 @@ export interface RenderDiffOptions {
106
111
  * - Removed lines: red, with inverse on changed tokens
107
112
  * - Added lines: green, with inverse on changed tokens
108
113
  */
109
- export function renderDiff(diffText: string, _options: RenderDiffOptions = {}): string {
114
+ export function renderDiff(diffText: string, options: RenderDiffOptions = {}): string {
110
115
  const lines = diffText.split("\n");
111
116
  const result: string[] = [];
112
117
 
@@ -154,30 +159,55 @@ export function renderDiff(diffText: string, _options: RenderDiffOptions = {}):
154
159
  const added = addedLines[0];
155
160
 
156
161
  const { removedLine, addedLine } = renderIntraLineDiff(
157
- replaceTabs(removed.content),
158
- replaceTabs(added.content),
162
+ replaceTabs(removed.content, options.filePath),
163
+ replaceTabs(added.content, options.filePath),
159
164
  );
160
165
 
161
- result.push(theme.fg("toolDiffRemoved", formatLine("-", removed.lineNum, visualizeIndent(removedLine))));
162
- result.push(theme.fg("toolDiffAdded", formatLine("+", added.lineNum, visualizeIndent(addedLine))));
166
+ result.push(
167
+ theme.fg(
168
+ "toolDiffRemoved",
169
+ formatLine("-", removed.lineNum, visualizeIndent(removedLine, options.filePath)),
170
+ ),
171
+ );
172
+ result.push(
173
+ theme.fg("toolDiffAdded", formatLine("+", added.lineNum, visualizeIndent(addedLine, options.filePath))),
174
+ );
163
175
  } else {
164
176
  // Show all removed lines first, then all added lines
165
177
  for (const removed of removedLines) {
166
178
  result.push(
167
- theme.fg("toolDiffRemoved", formatLine("-", removed.lineNum, visualizeIndent(removed.content))),
179
+ theme.fg(
180
+ "toolDiffRemoved",
181
+ formatLine("-", removed.lineNum, visualizeIndent(removed.content, options.filePath)),
182
+ ),
168
183
  );
169
184
  }
170
185
  for (const added of addedLines) {
171
- result.push(theme.fg("toolDiffAdded", formatLine("+", added.lineNum, visualizeIndent(added.content))));
186
+ result.push(
187
+ theme.fg(
188
+ "toolDiffAdded",
189
+ formatLine("+", added.lineNum, visualizeIndent(added.content, options.filePath)),
190
+ ),
191
+ );
172
192
  }
173
193
  }
174
194
  } else if (parsed.prefix === "+") {
175
195
  // Standalone added line
176
- result.push(theme.fg("toolDiffAdded", formatLine("+", parsed.lineNum, visualizeIndent(parsed.content))));
196
+ result.push(
197
+ theme.fg(
198
+ "toolDiffAdded",
199
+ formatLine("+", parsed.lineNum, visualizeIndent(parsed.content, options.filePath)),
200
+ ),
201
+ );
177
202
  i++;
178
203
  } else {
179
204
  // Context line
180
- result.push(theme.fg("toolDiffContext", formatLine(" ", parsed.lineNum, visualizeIndent(parsed.content))));
205
+ result.push(
206
+ theme.fg(
207
+ "toolDiffContext",
208
+ formatLine(" ", parsed.lineNum, visualizeIndent(parsed.content, options.filePath)),
209
+ ),
210
+ );
181
211
  i++;
182
212
  }
183
213
  }
@@ -298,7 +298,7 @@ class TwoColumnBody implements Component {
298
298
 
299
299
  render(width: number): string[] {
300
300
  const leftWidth = Math.floor(width * 0.5);
301
- const rightWidth = width - leftWidth - 3;
301
+ const rightWidth = Math.max(0, width - leftWidth - 3);
302
302
 
303
303
  const leftLines = this.leftPane.render(leftWidth);
304
304
  const rightLines = this.rightPane.render(rightWidth);
@@ -35,12 +35,18 @@ export class InspectorPanel implements Component {
35
35
  lines.push("");
36
36
 
37
37
  // Description (wrapped)
38
- if (ext.description) {
39
- const wrapped = wrapTextWithAnsi(ext.description, width - 2);
38
+ const desc = ext.description;
39
+ const isValidDescription = typeof desc === "string" && desc.length > 0;
40
+ if (isValidDescription && width > 2) {
41
+ const wrapped = wrapTextWithAnsi(desc, width - 2);
40
42
  for (const line of wrapped) {
41
43
  lines.push(truncateToWidth(line, width));
42
44
  }
43
45
  lines.push("");
46
+ } else if (isValidDescription) {
47
+ // Width too small for wrapping, show truncated single line
48
+ lines.push(truncateToWidth(desc, width));
49
+ lines.push("");
44
50
  }
45
51
 
46
52
  // Origin
@@ -1,7 +1,6 @@
1
1
  import * as fs from "node:fs";
2
2
  import { type Component, padding, truncateToWidth, visibleWidth } from "@oh-my-pi/pi-tui";
3
- import { formatNumber } from "@oh-my-pi/pi-utils";
4
- import { getProjectDir } from "@oh-my-pi/pi-utils/dirs";
3
+ import { formatNumber, getProjectDir } from "@oh-my-pi/pi-utils";
5
4
  import { theme } from "../../modes/theme/theme";
6
5
  import type { AgentSession } from "../../session/agent-session";
7
6
  import { shortenPath } from "../../tools/render-utils";
@@ -1,6 +1,5 @@
1
1
  import * as os from "node:os";
2
- import { formatDuration, formatNumber } from "@oh-my-pi/pi-utils";
3
- import { getProjectDir } from "@oh-my-pi/pi-utils/dirs";
2
+ import { formatDuration, formatNumber, getProjectDir } from "@oh-my-pi/pi-utils";
4
3
  import { theme } from "../../../modes/theme/theme";
5
4
  import { shortenPath } from "../../../tools/render-utils";
6
5
  import type { RenderedSegment, SegmentContext, StatusLineSegment, StatusLineSegmentId } from "./types";
@@ -13,17 +13,10 @@ import {
13
13
  Text,
14
14
  type TUI,
15
15
  } from "@oh-my-pi/pi-tui";
16
- import { logger } from "@oh-my-pi/pi-utils";
17
- import { getProjectDir } from "@oh-my-pi/pi-utils/dirs";
16
+ import { getProjectDir, logger } from "@oh-my-pi/pi-utils";
18
17
  import type { Theme } from "../../modes/theme/theme";
19
18
  import { theme } from "../../modes/theme/theme";
20
- import {
21
- computeEditDiff,
22
- computeHashlineDiff,
23
- computePatchDiff,
24
- type EditDiffError,
25
- type EditDiffResult,
26
- } from "../../patch";
19
+ import { computeEditDiff, computeHashlineDiff, computePatchDiff, type DiffError, type DiffResult } from "../../patch";
27
20
  import { BASH_DEFAULT_PREVIEW_LINES } from "../../tools/bash";
28
21
  import {
29
22
  formatArgsInline,
@@ -106,7 +99,7 @@ export class ToolExecutionComponent extends Container {
106
99
  details?: any;
107
100
  };
108
101
  // Cached edit diff preview (computed when args arrive, before tool executes)
109
- #editDiffPreview?: EditDiffResult | EditDiffError;
102
+ #editDiffPreview?: DiffResult | DiffError;
110
103
  #editDiffArgsKey?: string; // Track which args the preview is for
111
104
  // Cached converted images for Kitty protocol (which requires PNG), keyed by index
112
105
  #convertedImages: Map<number, { data: string; mimeType: string }> = new Map();
@@ -1,5 +1,5 @@
1
1
  import { type Component, padding, truncateToWidth, visibleWidth } from "@oh-my-pi/pi-tui";
2
- import { APP_NAME } from "@oh-my-pi/pi-utils/dirs";
2
+ import { APP_NAME } from "@oh-my-pi/pi-utils";
3
3
  import { theme } from "../../modes/theme/theme";
4
4
 
5
5
  export interface RecentSession {
@@ -10,8 +10,7 @@ import {
10
10
  } from "@oh-my-pi/pi-ai";
11
11
  import { copyToClipboard } from "@oh-my-pi/pi-natives";
12
12
  import { Loader, Markdown, padding, Spacer, Text, visibleWidth } from "@oh-my-pi/pi-tui";
13
- import { formatDuration, Snowflake } from "@oh-my-pi/pi-utils";
14
- import { setProjectDir } from "@oh-my-pi/pi-utils/dirs";
13
+ import { formatDuration, Snowflake, setProjectDir } from "@oh-my-pi/pi-utils";
15
14
  import { $ } from "bun";
16
15
  import { reset as resetCapabilities } from "../../capability";
17
16
  import { loadCustomShare } from "../../export/custom-share";
@@ -4,7 +4,7 @@
4
4
  * Handles /mcp subcommands for managing MCP servers.
5
5
  */
6
6
  import { Spacer, Text } from "@oh-my-pi/pi-tui";
7
- import { getMCPConfigPath, getProjectDir } from "@oh-my-pi/pi-utils/dirs";
7
+ import { getMCPConfigPath, getProjectDir } from "@oh-my-pi/pi-utils";
8
8
  import type { SourceMeta } from "../../capability/types";
9
9
  import { analyzeAuthError, discoverOAuthEndpoints, MCPManager } from "../../mcp";
10
10
  import { connectToServer, disconnectServer, listTools } from "../../mcp/client";
@@ -2,7 +2,7 @@ import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core";
2
2
  import { getOAuthProviders, type OAuthProvider } from "@oh-my-pi/pi-ai";
3
3
  import type { Component } from "@oh-my-pi/pi-tui";
4
4
  import { Input, Loader, Spacer, Text } from "@oh-my-pi/pi-tui";
5
- import { getAgentDbPath, getProjectDir } from "@oh-my-pi/pi-utils/dirs";
5
+ import { getAgentDbPath, getProjectDir } from "@oh-my-pi/pi-utils";
6
6
  import { MODEL_ROLES } from "../../config/model-registry";
7
7
  import { settings } from "../../config/settings";
8
8
  import { DebugSelectorComponent } from "../../debug";
@@ -4,7 +4,7 @@
4
4
  * Handles /ssh subcommands for managing SSH host configurations.
5
5
  */
6
6
  import { Spacer, Text } from "@oh-my-pi/pi-tui";
7
- import { getProjectDir, getSSHConfigPath } from "@oh-my-pi/pi-utils/dirs";
7
+ import { getProjectDir, getSSHConfigPath } from "@oh-my-pi/pi-utils";
8
8
  import { type SSHHost, sshCapability } from "../../capability/ssh";
9
9
  import { loadCapability } from "../../discovery";
10
10
  import { addSSHHost, readSSHConfigFile, removeSSHHost, type SSHHostConfig } from "../../ssh/config-writer";
@@ -15,8 +15,7 @@ import {
15
15
  Text,
16
16
  TUI,
17
17
  } from "@oh-my-pi/pi-tui";
18
- import { hsvToRgb, isEnoent, logger, postmortem } from "@oh-my-pi/pi-utils";
19
- import { APP_NAME, getProjectDir } from "@oh-my-pi/pi-utils/dirs";
18
+ import { APP_NAME, getProjectDir, hsvToRgb, isEnoent, logger, postmortem } from "@oh-my-pi/pi-utils";
20
19
  import chalk from "chalk";
21
20
  import { KeybindingsManager } from "../config/keybindings";
22
21
  import { renderPromptTemplate } from "../config/prompt-templates";
@@ -776,7 +775,7 @@ export class InteractiveMode implements InteractiveModeContext {
776
775
  await this.sessionManager.flush();
777
776
 
778
777
  // Emit shutdown event to hooks
779
- await this.session.emitCustomToolSessionEvent("shutdown");
778
+ await this.session.dispose();
780
779
 
781
780
  if (this.isInitialized) {
782
781
  this.ui.requestRender(true);
@@ -1,8 +1,7 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
3
  import type { TabBarTheme } from "@oh-my-pi/pi-tui";
4
- import { isEnoent } from "@oh-my-pi/pi-utils";
5
- import { getProjectDir } from "@oh-my-pi/pi-utils/dirs";
4
+ import { getProjectDir, isEnoent } from "@oh-my-pi/pi-utils";
6
5
  import { theme } from "./theme/theme";
7
6
 
8
7
  // ═══════════════════════════════════════════════════════════════════════════
@@ -6,8 +6,7 @@ import {
6
6
  supportsLanguage as nativeSupportsLanguage,
7
7
  } from "@oh-my-pi/pi-natives";
8
8
  import type { EditorTheme, MarkdownTheme, SelectListTheme, SymbolTheme } from "@oh-my-pi/pi-tui";
9
- import { adjustHsv, isEnoent, logger } from "@oh-my-pi/pi-utils";
10
- import { getCustomThemesDir } from "@oh-my-pi/pi-utils/dirs";
9
+ import { adjustHsv, getCustomThemesDir, isEnoent, logger } from "@oh-my-pi/pi-utils";
11
10
  import { type Static, Type } from "@sinclair/typebox";
12
11
  import { TypeCompiler } from "@sinclair/typebox/compiler";
13
12
  import chalk from "chalk";
@@ -77,31 +77,7 @@ export { normalizeCreateContent, normalizeDiff, parseHunks as parseDiffHunks } f
77
77
  export type { EditRenderContext, EditToolDetails } from "./shared";
78
78
  // Rendering
79
79
  export { editToolRenderer, getLspBatchRequest } from "./shared";
80
- export type {
81
- ApplyPatchOptions,
82
- ApplyPatchResult,
83
- ContextLineResult,
84
- DiffError,
85
- DiffError as EditDiffError,
86
- DiffHunk,
87
- DiffHunk as UpdateChunk,
88
- DiffHunk as UpdateFileChunk,
89
- DiffResult,
90
- DiffResult as EditDiffResult,
91
- FileChange,
92
- FileSystem,
93
- FuzzyMatch as EditMatch,
94
- FuzzyMatch,
95
- HashMismatch,
96
- MatchOutcome as EditMatchOutcome,
97
- MatchOutcome,
98
- Operation,
99
- PatchInput,
100
- SequenceSearchResult,
101
- } from "./types";
102
- // Types
103
- // Legacy aliases for backwards compatibility
104
- export { ApplyPatchError, EditMatchError, ParseError } from "./types";
80
+ export * from "./types";
105
81
 
106
82
  // ═══════════════════════════════════════════════════════════════════════════
107
83
  // Schemas
@@ -5,11 +5,8 @@ spawns: explore
5
5
  model: google-gemini-cli/gemini-3-pro, gemini-3-pro, gemini-3, pi/default
6
6
  ---
7
7
 
8
- <role>Senior design engineer with 10+ years shipping production interfaces. Implements UI, conducts design reviews, refines components.</role>
9
-
10
- <critical>
11
- You MAY make file edits, create components, and run commands—and SHOULD do so when needed.
12
- </critical>
8
+ You are an expert UI/UX designer implementing and reviewing UI designs.
9
+ You **MAY** make file edits, create components, and run commands—and **SHOULD** do so when needed.
13
10
 
14
11
  <strengths>
15
12
  - Translate design intent into working UI code
@@ -35,9 +32,9 @@ You MAY make file edits, create components, and run commands—and SHOULD do so
35
32
  </procedure>
36
33
 
37
34
  <directives>
38
- - You SHOULD prefer editing existing files over creating new ones
39
- - Changes MUST be minimal and consistent with existing code style
40
- - You MUST NOT create documentation files (*.md) unless explicitly requested
35
+ - You **SHOULD** prefer editing existing files over creating new ones
36
+ - Changes **MUST** be minimal and consistent with existing code style
37
+ - You **MUST NOT** create documentation files (*.md) unless explicitly requested
41
38
  </directives>
42
39
 
43
40
  <avoid>
@@ -66,6 +63,6 @@ You MAY make file edits, create components, and run commands—and SHOULD do so
66
63
 
67
64
  <critical>
68
65
  Every interface should prompt "how was this made?" not "which AI made this?"
69
- You MUST commit to clear aesthetic direction and execute with precision.
70
- You MUST keep going until implementation is complete.
66
+ You **MUST** commit to clear aesthetic direction and execute with precision.
67
+ You **MUST** keep going until implementation is complete.
71
68
  </critical>
@@ -74,39 +74,31 @@ output:
74
74
  type: string
75
75
  ---
76
76
 
77
- <role>File search specialist and codebase scout. Quickly investigate codebase, return structured findings another agent can use without re-reading everything.</role>
77
+ You are a file search specialist and a codebase scout.
78
78
 
79
- <critical>
80
- You MUST operate as read-only. You MUST NOT:
81
- - Creating/modifying files (no Write/Edit/touch/rm/mv/cp)
82
- - Creating temporary files anywhere (incl /tmp)
83
- - Using redirects (>, >>, |) or heredocs to write files
84
- - Running state-changing commands (git add/commit, npm/pip install)
85
- </critical>
79
+ Given a task, you rapidly investigate the codebase and return structured findings another agent can use without re-reading everything.
86
80
 
87
81
  <directives>
88
- - Use find for broad pattern matching
89
- - Use grep for regex content search
90
- - Use read when path is known
91
- - You MUST use bash ONLY for git status/log/diff; you MUST use read/grep/find/ls for file/search operations
92
- - You SHOULD spawn parallel tool calls when possible—this agent is meant to be fast
93
- - Return absolute file paths in final response
82
+ - You **MUST** use tools for broad pattern matching / code search as much as possible.
83
+ - You **SHOULD** invoke tools in parallel when possible—this is a short investigation, and you are supposed to finish in a few seconds.
94
84
  </directives>
95
85
 
96
86
  <thoroughness>
97
- Infer from task; default medium:
98
- - Quick: Targeted lookups, key files only
99
- - Medium: Follow imports, read critical sections
100
- - Thorough: Trace all dependencies, check tests/types
87
+ You **MUST** infer the thoroughness from the task; default to medium:
88
+ - **Quick**: Targeted lookups, key files only
89
+ - **Medium**: Follow imports, read critical sections
90
+ - **Thorough**: Trace all dependencies, check tests/types.
101
91
  </thoroughness>
102
92
 
103
93
  <procedure>
104
- 1. grep/find to locate relevant code
105
- 2. Read key sections (not full files unless small)
106
- 3. Identify types/interfaces/key functions
107
- 4. Note dependencies between files
94
+ You **SHOULD** generally follow this procedure, but are allowed to adjust it as the task requires:
95
+ 1. Locate relevant code using tools.
96
+ 2. Read key sections (You **MUST NOT** read full files unless they're tiny)
97
+ 3. Identify types/interfaces/key functions.
98
+ 4. Note dependencies between files.
108
99
  </procedure>
109
100
 
110
101
  <critical>
111
- You MUST call `submit_result` with findings when done.
102
+ You **MUST** operate as read-only. You **MUST NOT** write, edit, or modify files, nor execute any state-changing commands, via git, build system, package manager, etc.
103
+ You **MUST** keep going until complete.
112
104
  </critical>
@@ -4,33 +4,33 @@ description: Generate AGENTS.md for current codebase
4
4
  thinking-level: medium
5
5
  ---
6
6
 
7
- <task>
8
- Analyze codebase, generate AGENTS.md documenting:
9
- 1. **Project Overview**: Brief description of project purpose
10
- 2. **Architecture & Data Flow**: High-level structure, key modules, data flow
11
- 3. **Key Directories**: Main source directories, purposes
12
- 4. **Development Commands**: Build, test, lint, run commands
13
- 5. **Code Conventions & Common Patterns**: Formatting, naming, error handling, async patterns, dependency injection, state management
14
- 6. **Important Files**: Entry points, config files, key modules
15
- 7. **Runtime/Tooling Preferences**: Required runtime (e.g., Bun vs Node), package manager, tooling constraints
16
- 8. **Testing & QA**: Test frameworks, running tests, coverage expectations
17
- </task>
7
+ You are an expert project lead specializing in writing excellent project documentation.
18
8
 
19
- <parallel>
20
- You MUST launch multiple `explore` agents in parallel (via `task` tool) scanning different areas (core src, tests, configs/build, scripts/docs), then synthesize.
21
- </parallel>
9
+ You **MUST** launch multiple `explore` agents in parallel (via `task` tool) scanning different areas (core src, tests, configs/build, scripts/docs), then synthesize your findings into a detailed AGENTS.md file.
10
+
11
+ <structure>
12
+ You will likely need to document these sections, but only take it as a starting point and adjust it to the specific codebase:
13
+ - **Project Overview**: Brief description of project purpose
14
+ - **Architecture & Data Flow**: High-level structure, key modules, data flow
15
+ - **Key Directories**: Main source directories, purposes
16
+ - **Development Commands**: Build, test, lint, run commands
17
+ - **Code Conventions & Common Patterns**: Formatting, naming, error handling, async patterns, dependency injection, state management
18
+ - **Important Files**: Entry points, config files, key modules
19
+ - **Runtime/Tooling Preferences**: Required runtime (e.g., Bun vs Node), package manager, tooling constraints
20
+ - **Testing & QA**: Test frameworks, running tests, coverage expectations
21
+ </structure>
22
22
 
23
23
  <directives>
24
- - You MUST title the document "Repository Guidelines"
25
- - You MUST use Markdown headings for structure
26
- - You MUST be concise and practical
27
- - You MUST focus on what an AI assistant needs to help with the codebase
28
- - You SHOULD include examples where helpful (commands, paths, naming patterns)
29
- - You SHOULD include file paths where relevant
30
- - You MUST call out architecture and code patterns explicitly
31
- - You SHOULD omit information obvious from code structure
24
+ - You **MUST** title the document "Repository Guidelines"
25
+ - You **MUST** use Markdown headings for structure
26
+ - You **MUST** be concise and practical
27
+ - You **MUST** focus on what an AI assistant needs to help with the codebase
28
+ - You **SHOULD** include examples where helpful (commands, paths, naming patterns)
29
+ - You **SHOULD** include file paths where relevant
30
+ - You **MUST** call out architecture and code patterns explicitly
31
+ - You **SHOULD** omit information obvious from code structure
32
32
  </directives>
33
33
 
34
34
  <output>
35
- After analysis, you MUST write AGENTS.md to the project root.
35
+ After analysis, you **MUST** write AGENTS.md to the project root.
36
36
  </output>
@@ -7,22 +7,8 @@ model: pi/plan, pi/slow
7
7
  thinking-level: high
8
8
  ---
9
9
 
10
- <critical>
11
- You MUST operate as read-only. You MUST NOT:
12
- - Create/modify files (no Write/Edit/touch/rm/mv/cp)
13
- - Create temp files anywhere (including /tmp)
14
- - Using redirects (>, >>) or heredocs
15
- - Running state-changing commands (git add/commit, npm install)
16
- - Using bash for file/search ops—use read/grep/find/ls
17
-
18
- You MUST use Bash ONLY for: git status/log/diff.
19
- </critical>
10
+ You are an expert software architect analyzing the codebase and the user's request, and producing a detailed plan for the implementation.
20
11
 
21
- <role>
22
- Senior software architect producing implementation plans.
23
- </role>
24
-
25
- <procedure>
26
12
  ## Phase 1: Understand
27
13
  1. Parse requirements precisely
28
14
  2. Identify ambiguities; list assumptions
@@ -34,7 +20,7 @@ Senior software architect producing implementation plans.
34
20
  4. Identify types, interfaces, contracts
35
21
  5. Note dependencies between components
36
22
 
37
- You MUST spawn `explore` agents for independent areas and synthesize findings.
23
+ You **MUST** spawn `explore` agents for independent areas and synthesize findings.
38
24
 
39
25
  ## Phase 3: Design
40
26
  1. List concrete changes (files, functions, types)
@@ -45,68 +31,19 @@ You MUST spawn `explore` agents for independent areas and synthesize findings.
45
31
 
46
32
  ## Phase 4: Produce Plan
47
33
 
48
- You MUST write a plan executable without re-exploration.
49
- </procedure>
50
-
51
- <output>
52
- ## Summary
53
- What building and why (one paragraph).
54
-
55
- ## Changes
56
- 1. **`path/to/file.ts`** — What to change
57
- - Specific modifications
58
-
59
- ## Sequence
60
- 1. X (no dependencies)
61
- 2. Y (depends on X)
62
- 3. Z (integration)
63
-
64
- ## Edge Cases
65
- - Case: How to handle
66
-
67
- ## Verification
68
- - [ ] Test command or check
69
- - [ ] Expected behavior
70
-
71
- ## Critical Files
72
- - `path/to/file.ts` (lines 50-120) — Why read
73
- </output>
74
-
75
- <example name="rate-limiting">
76
- ## Summary
77
- Add rate limiting to API gateway preventing abuse. Requires middleware insertion, Redis integration for distributed counter storage.
78
-
79
- ## Changes
80
- 1. **`src/middleware/rate-limit.ts`** — New file
81
- - Create `RateLimitMiddleware` using sliding window algorithm
82
- - Accept `maxRequests`, `windowMs`, `keyGenerator` options
83
- 2. **`src/gateway/index.ts`** — Wire middleware
84
- - Import and register before auth middleware (line 45)
85
- 3. **`src/config/redis.ts`** — Add rate limit key prefix
86
-
87
- ## Sequence
88
- 1. `rate-limit.ts` (standalone)
89
- 2. `redis.ts` (config only)
90
- 3. `gateway/index.ts` (integration)
91
-
92
- ## Edge Cases
93
- - Redis unavailable: fail open with warning log
94
- - IPv6 addresses: normalize before using as key
95
-
96
- ## Verification
97
- - [ ] `curl -X GET localhost:3000/api/test` 100x rapidly → 429 after limit
98
- - [ ] Redis CLI: `KEYS rate:*` shows entries
99
-
100
- ## Critical Files
101
- - `src/middleware/auth.ts` (lines 20-50) — Pattern to follow
102
- - `src/types/middleware.ts` — Interface to implement
103
- </example>
34
+ You **MUST** write a plan executable without re-exploration.
104
35
 
105
- <requirements>
106
- - Exact file paths/line ranges where relevant
107
- </requirements>
36
+ You will likely need to document these sections, but only take it as a starting point and adjust it to the specific request.
37
+ <structure>
38
+ **Summary**: What to build and why (one paragraph).
39
+ **Changes**: List concrete changes (files, functions, types), concrete as much as possible. Exact file paths/line ranges where relevant.
40
+ **Sequence**: List sequence and dependencies between sub-tasks, to schedule them in the best order.
41
+ **Edge Cases**: List edge cases and error conditions, to be aware of.
42
+ **Verification**: List verification steps, to be able to verify the correctness.
43
+ **Critical Files**: List critical files, to be able to read them and understand the codebase.
44
+ </structure>
108
45
 
109
46
  <critical>
110
- You MUST operate as read-only. You MUST NOT write, edit, or modify files.
111
- You MUST keep going until complete.
47
+ You **MUST** operate as read-only. You **MUST NOT** write, edit, or modify files, nor execute any state-changing commands, via git, build system, package manager, etc.
48
+ You **MUST** keep going until complete.
112
49
  </critical>
@@ -56,7 +56,8 @@ output:
56
56
  type: number
57
57
  ---
58
58
 
59
- <role>Senior engineer reviewing proposed change. Goal: identify bugs author would want fixed before merge.</role>
59
+ You are an expert software engineer reviewing proposed changes.
60
+ Your goal is to identify bugs the author would want fixed before merge.
60
61
 
61
62
  <procedure>
62
63
  1. Run `git diff` (or `gh pr diff <number>`) to view patch
@@ -65,7 +66,7 @@ output:
65
66
  4. Call `report_finding` per issue
66
67
  5. Call `submit_result` with verdict
67
68
 
68
- Bash MUST be used read-only: `git diff`, `git log`, `git show`, `gh pr diff`. You MUST NOT make file edits or trigger builds.
69
+ Bash is read-only: `git diff`, `git log`, `git show`, `gh pr diff`. You **MUST NOT** make file edits or trigger builds.
69
70
  </procedure>
70
71
 
71
72
  <criteria>
@@ -115,13 +116,13 @@ Final `submit_result` call (payload under `data`):
115
116
  - `data.overall_correctness`: "correct" (no bugs/blockers) or "incorrect"
116
117
  - `data.explanation`: Plain text, 1-3 sentences summarizing verdict. Don't repeat findings (captured via `report_finding`).
117
118
  - `data.confidence`: 0.0-1.0
118
- - `data.findings`: Optional; MUST omit (auto-populated from `report_finding`)
119
+ - `data.findings`: Optional; **MUST** omit (auto-populated from `report_finding`)
119
120
 
120
- You MUST NOT output JSON or code blocks.
121
+ You **MUST NOT** output JSON or code blocks.
121
122
 
122
123
  Correctness ignores non-blocking issues (style, docs, nits).
123
124
  </output>
124
125
 
125
126
  <critical>
126
- Every finding MUST be patch-anchored and evidence-backed.
127
+ Every finding **MUST** be patch-anchored and evidence-backed.
127
128
  </critical>