@oh-my-pi/pi-coding-agent 13.3.1 → 13.3.3

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [13.3.3] - 2026-02-26
6
+ ### Added
7
+
8
+ - Support for `move` parameter in `computeHashlineDiff` to enable file move operations alongside content edits
9
+
10
+ ### Changed
11
+
12
+ - Modified no-op detection logic to allow move-only operations when file content remains unchanged
13
+
5
14
  ## [13.3.1] - 2026-02-26
6
15
 
7
16
  ### Added
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@oh-my-pi/pi-coding-agent",
4
- "version": "13.3.1",
4
+ "version": "13.3.3",
5
5
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://github.com/can1357/oh-my-pi",
7
7
  "author": "Can Boluk",
@@ -41,12 +41,12 @@
41
41
  },
42
42
  "dependencies": {
43
43
  "@mozilla/readability": "^0.6",
44
- "@oh-my-pi/omp-stats": "13.3.1",
45
- "@oh-my-pi/pi-agent-core": "13.3.1",
46
- "@oh-my-pi/pi-ai": "13.3.1",
47
- "@oh-my-pi/pi-natives": "13.3.1",
48
- "@oh-my-pi/pi-tui": "13.3.1",
49
- "@oh-my-pi/pi-utils": "13.3.1",
44
+ "@oh-my-pi/omp-stats": "13.3.3",
45
+ "@oh-my-pi/pi-agent-core": "13.3.3",
46
+ "@oh-my-pi/pi-ai": "13.3.3",
47
+ "@oh-my-pi/pi-natives": "13.3.3",
48
+ "@oh-my-pi/pi-tui": "13.3.3",
49
+ "@oh-my-pi/pi-utils": "13.3.3",
50
50
  "@sinclair/typebox": "^0.34",
51
51
  "@xterm/headless": "^6.0",
52
52
  "ajv": "^8.18",
package/src/cursor.ts CHANGED
@@ -198,7 +198,7 @@ export class CursorExecHandlers implements ICursorExecHandlers {
198
198
  const timeoutSeconds = args.timeout && args.timeout > 0 ? args.timeout : undefined;
199
199
  const toolResultMessage = await executeTool(this.options, "bash", toolCallId, {
200
200
  command: args.command,
201
- workdir: args.workingDirectory || undefined,
201
+ cwd: args.workingDirectory || undefined,
202
202
  timeout: timeoutSeconds,
203
203
  });
204
204
  return toolResultMessage;
@@ -204,12 +204,13 @@ export class ToolExecutionComponent extends Container {
204
204
  return;
205
205
  }
206
206
  const edits = this.#args?.edits;
207
+ const move = this.#args?.move;
207
208
  if (path && Array.isArray(edits)) {
208
- const argsKey = JSON.stringify({ path, edits });
209
+ const argsKey = JSON.stringify({ path, edits, move });
209
210
  if (this.#editDiffArgsKey === argsKey) return;
210
211
  this.#editDiffArgsKey = argsKey;
211
212
 
212
- computeHashlineDiff({ path, edits }, this.#cwd).then(result => {
213
+ computeHashlineDiff({ path, edits, move }, this.#cwd).then(result => {
213
214
  if (this.#editDiffArgsKey === argsKey) {
214
215
  this.#editDiffPreview = result;
215
216
  this.#updateDisplay();
@@ -0,0 +1,138 @@
1
+ {
2
+ "name": "dark-poimandres",
3
+ "vars": {
4
+ "poimandresBg": "#1b1e28",
5
+ "poimandresFocus": "#303340",
6
+ "poimandresGray": "#a6accd",
7
+ "poimandresDarkerGray": "#767c9d",
8
+ "poimandresBluishGray": "#506477",
9
+ "poimandresOffWhite": "#e4f0fb",
10
+ "poimandresBrightMint": "#5DE4c7",
11
+ "poimandresStrongTurquoise": "#00CED1",
12
+ "poimandresLowerMint": "#5fb3a1",
13
+ "poimandresLightBlue": "#ADD7FF",
14
+ "poimandresLowerBlue": "#89ddff",
15
+ "poimandresDesaturatedGreen": "#7AC6B6",
16
+ "poimandresHotRed": "#d0679d",
17
+ "poimandresPink": "#f087bd",
18
+ "poimandresBrightYellow": "#fffac2",
19
+ "poimandresBluishGrayBrighter": "#7390AA",
20
+ "poimandresSelection": "#717cb425",
21
+ "poimandresWhite": "#ffffff",
22
+ "poimandresBlack": "#000000",
23
+ "poimandresBg256": 235,
24
+ "poimandresFocus256": 238,
25
+ "poimandresGray256": 109,
26
+ "poimandresDarkerGray256": 103,
27
+ "poimandresBluishGray256": 66,
28
+ "poimandresBrightMint256": 86,
29
+ "poimandresStrongTurquoise256": 44,
30
+ "poimandresLowerMint256": 79,
31
+ "poimandresLightBlue256": 153,
32
+ "poimandresLowerBlue256": 117,
33
+ "poimandresDesaturatedGreen256": 79,
34
+ "poimandresHotRed256": 169,
35
+ "poimandresPink256": 211,
36
+ "poimandresBrightYellow256": 229,
37
+ "poimandresBluishGrayBrighter256": 110,
38
+ "poimandresSubtleBg": "#1b1e28",
39
+ "poimandresMediumBg": "#23273a",
40
+ "poimandresBrightBg": "#303340"
41
+ },
42
+ "colors": {
43
+ "accent": "poimandresStrongTurquoise",
44
+ "border": "poimandresBluishGray",
45
+ "borderAccent": "poimandresDarkerGray",
46
+ "borderMuted": "poimandresBluishGray",
47
+ "success": "poimandresStrongTurquoise",
48
+ "error": "poimandresHotRed",
49
+ "warning": "poimandresBrightYellow",
50
+ "muted": "poimandresDarkerGray",
51
+ "dim": "poimandresBluishGray",
52
+ "text": "poimandresGray",
53
+ "thinkingText": "poimandresDarkerGray",
54
+ "selectedBg": "poimandresSelection",
55
+ "userMessageBg": "poimandresFocus",
56
+ "userMessageText": "poimandresWhite",
57
+ "customMessageBg": "poimandresFocus",
58
+ "customMessageText": "poimandresWhite",
59
+ "customMessageLabel": "poimandresStrongTurquoise",
60
+ "toolPendingBg": "poimandresFocus",
61
+ "toolSuccessBg": "poimandresMediumBg",
62
+ "toolErrorBg": "poimandresFocus",
63
+ "toolTitle": "poimandresBrightMint",
64
+ "toolOutput": "poimandresDarkerGray",
65
+ "mdHeading": "poimandresBrightMint",
66
+ "mdLink": "poimandresDesaturatedGreen",
67
+ "mdLinkUrl": "poimandresStrongTurquoise",
68
+ "mdCode": "poimandresStrongTurquoise",
69
+ "mdCodeBlock": "poimandresGray",
70
+ "mdCodeBlockBorder": "poimandresBluishGray",
71
+ "mdQuote": "poimandresDarkerGray",
72
+ "mdQuoteBorder": "poimandresBluishGray",
73
+ "mdHr": "poimandresDarkerGray",
74
+ "mdListBullet": "poimandresBrightMint",
75
+ "toolDiffAdded": "poimandresStrongTurquoise",
76
+ "toolDiffRemoved": "poimandresHotRed",
77
+ "toolDiffContext": "poimandresDarkerGray",
78
+ "syntaxComment": "poimandresDarkerGray",
79
+ "syntaxKeyword": "poimandresDesaturatedGreen",
80
+ "syntaxFunction": "poimandresBrightMint",
81
+ "syntaxVariable": "poimandresStrongTurquoise",
82
+ "syntaxString": "poimandresStrongTurquoise",
83
+ "syntaxNumber": "poimandresPink",
84
+ "syntaxType": "poimandresStrongTurquoise",
85
+ "syntaxOperator": "poimandresDesaturatedGreen",
86
+ "syntaxPunctuation": "poimandresGray",
87
+ "thinkingOff": "poimandresBluishGray",
88
+ "thinkingMinimal": "poimandresDarkerGray",
89
+ "thinkingLow": "poimandresBrightMint",
90
+ "thinkingMedium": "poimandresStrongTurquoise",
91
+ "thinkingHigh": "poimandresPink",
92
+ "thinkingXhigh": "poimandresHotRed",
93
+ "bashMode": "poimandresDesaturatedGreen",
94
+ "pythonMode": "poimandresStrongTurquoise",
95
+ "statusLineBg": "poimandresFocus",
96
+ "statusLineSep": 66,
97
+ "statusLineModel": "poimandresBrightMint",
98
+ "statusLinePath": "poimandresGray",
99
+ "statusLineGitClean": "poimandresStrongTurquoise",
100
+ "statusLineGitDirty": "poimandresHotRed",
101
+ "statusLineContext": "poimandresDarkerGray",
102
+ "statusLineSpend": "poimandresLowerMint",
103
+ "statusLineStaged": 44,
104
+ "statusLineDirty": 169,
105
+ "statusLineUntracked": 229,
106
+ "statusLineOutput": "poimandresLowerBlue",
107
+ "statusLineCost": "poimandresPink",
108
+ "statusLineSubagents": "poimandresDesaturatedGreen"
109
+ },
110
+ "export": {
111
+ "pageBg": "poimandresBg",
112
+ "cardBg": "poimandresFocus",
113
+ "infoBg": "poimandresFocus"
114
+ },
115
+ "symbols": {
116
+ "preset": "nerd",
117
+ "overrides": {
118
+ "status.success": "●",
119
+ "status.error": "✖",
120
+ "status.warning": "◆",
121
+ "status.info": "○",
122
+ "status.pending": "◌",
123
+ "nav.cursor": "▸",
124
+ "nav.selected": "▴",
125
+ "thinking.minimal": "◌",
126
+ "thinking.low": "◍",
127
+ "thinking.medium": "◎",
128
+ "thinking.high": "◉",
129
+ "thinking.xhigh": "●",
130
+ "icon.model": "◇",
131
+ "icon.plan": "◈",
132
+ "icon.folder": "▸",
133
+ "icon.pi": "π",
134
+ "format.bullet": "◦",
135
+ "md.bullet": "◦"
136
+ }
137
+ }
138
+ }
@@ -27,6 +27,7 @@ import dark_nebula from "./dark-nebula.json" with { type: "json" };
27
27
  import dark_nord from "./dark-nord.json" with { type: "json" };
28
28
  import dark_ocean from "./dark-ocean.json" with { type: "json" };
29
29
  import dark_one from "./dark-one.json" with { type: "json" };
30
+ import dark_poimandres from "./dark-poimandres.json" with { type: "json" };
30
31
  import dark_rainforest from "./dark-rainforest.json" with { type: "json" };
31
32
  import dark_reef from "./dark-reef.json" with { type: "json" };
32
33
  import dark_retro from "./dark-retro.json" with { type: "json" };
@@ -73,6 +74,7 @@ import light_one from "./light-one.json" with { type: "json" };
73
74
  import light_opal from "./light-opal.json" with { type: "json" };
74
75
  import light_orchard from "./light-orchard.json" with { type: "json" };
75
76
  import light_paper from "./light-paper.json" with { type: "json" };
77
+ import light_poimandres from "./light-poimandres.json" with { type: "json" };
76
78
  import light_prism from "./light-prism.json" with { type: "json" };
77
79
  import light_retro from "./light-retro.json" with { type: "json" };
78
80
  import light_sand from "./light-sand.json" with { type: "json" };
@@ -125,6 +127,7 @@ export const defaultThemes = {
125
127
  "dark-nord": dark_nord,
126
128
  "dark-ocean": dark_ocean,
127
129
  "dark-one": dark_one,
130
+ "dark-poimandres": dark_poimandres,
128
131
  "dark-rainforest": dark_rainforest,
129
132
  "dark-reef": dark_reef,
130
133
  "dark-retro": dark_retro,
@@ -171,6 +174,7 @@ export const defaultThemes = {
171
174
  "light-opal": light_opal,
172
175
  "light-orchard": light_orchard,
173
176
  "light-paper": light_paper,
177
+ "light-poimandres": light_poimandres,
174
178
  "light-prism": light_prism,
175
179
  "light-retro": light_retro,
176
180
  "light-sand": light_sand,
@@ -0,0 +1,138 @@
1
+ {
2
+ "name": "light-poimandres",
3
+ "vars": {
4
+ "poimandresBg": "#e4f0fb",
5
+ "poimandresFocus": "#303340",
6
+ "poimandresGray": "#a6accd",
7
+ "poimandresDarkerGray": "#767c9d",
8
+ "poimandresBluishGray": "#506477",
9
+ "poimandresOffWhite": "#e4f0fb",
10
+ "poimandresBrightMint": "#5DE4c7",
11
+ "poimandresStrongTurquoise": "#00CED1",
12
+ "poimandresLowerMint": "#5fb3a1",
13
+ "poimandresLightBlue": "#ADD7FF",
14
+ "poimandresLowerBlue": "#89ddff",
15
+ "poimandresDesaturatedGreen": "#7AC6B6",
16
+ "poimandresHotRed": "#d0679d",
17
+ "poimandresPink": "#f087bd",
18
+ "poimandresBrightYellow": "#fffac2",
19
+ "poimandresBluishGrayBrighter": "#7390AA",
20
+ "poimandresSelection": "#717cb425",
21
+ "poimandresWhite": "#ffffff",
22
+ "poimandresBlack": "#000000",
23
+ "poimandresBg256": 235,
24
+ "poimandresFocus256": 238,
25
+ "poimandresGray256": 109,
26
+ "poimandresDarkerGray256": 103,
27
+ "poimandresBluishGray256": 66,
28
+ "poimandresBrightMint256": 86,
29
+ "poimandresStrongTurquoise256": 44,
30
+ "poimandresLowerMint256": 79,
31
+ "poimandresLightBlue256": 153,
32
+ "poimandresLowerBlue256": 117,
33
+ "poimandresDesaturatedGreen256": 79,
34
+ "poimandresHotRed256": 169,
35
+ "poimandresPink256": 211,
36
+ "poimandresBrightYellow256": 229,
37
+ "poimandresBluishGrayBrighter256": 110,
38
+ "poimandresSubtleBg": "#e4f0fb",
39
+ "poimandresMediumBg": "#d0d7e5",
40
+ "poimandresBrightBg": "#7390AA"
41
+ },
42
+ "colors": {
43
+ "accent": "poimandresStrongTurquoise",
44
+ "border": "poimandresDarkerGray",
45
+ "borderAccent": "poimandresBluishGray",
46
+ "borderMuted": "poimandresDarkerGray",
47
+ "success": "poimandresStrongTurquoise",
48
+ "error": "poimandresHotRed",
49
+ "warning": "poimandresBrightYellow",
50
+ "muted": "poimandresBluishGray",
51
+ "dim": "poimandresDarkerGray",
52
+ "text": "poimandresBluishGray",
53
+ "thinkingText": "poimandresBluishGray",
54
+ "selectedBg": "poimandresSelection",
55
+ "userMessageBg": "poimandresBluishGrayBrighter",
56
+ "userMessageText": "poimandresWhite",
57
+ "customMessageBg": "poimandresGray",
58
+ "customMessageText": "poimandresWhite",
59
+ "customMessageLabel": "poimandresStrongTurquoise",
60
+ "toolPendingBg": "poimandresBluishGrayBrighter",
61
+ "toolSuccessBg": "poimandresBluishGrayBrighter",
62
+ "toolErrorBg": "poimandresBluishGrayBrighter",
63
+ "toolTitle": "poimandresBrightMint",
64
+ "toolOutput": "poimandresBluishGray",
65
+ "mdHeading": "poimandresBrightMint",
66
+ "mdLink": "poimandresDesaturatedGreen",
67
+ "mdLinkUrl": "poimandresStrongTurquoise",
68
+ "mdCode": "poimandresStrongTurquoise",
69
+ "mdCodeBlock": "poimandresBluishGray",
70
+ "mdCodeBlockBorder": "poimandresGray",
71
+ "mdQuote": "poimandresDarkerGray",
72
+ "mdQuoteBorder": "poimandresBluishGray",
73
+ "mdHr": "poimandresDarkerGray",
74
+ "mdListBullet": "poimandresBrightMint",
75
+ "toolDiffAdded": "poimandresStrongTurquoise",
76
+ "toolDiffRemoved": "poimandresHotRed",
77
+ "toolDiffContext": "poimandresDarkerGray",
78
+ "syntaxComment": "poimandresDarkerGray",
79
+ "syntaxKeyword": "poimandresDesaturatedGreen",
80
+ "syntaxFunction": "poimandresBrightMint",
81
+ "syntaxVariable": "poimandresStrongTurquoise",
82
+ "syntaxString": "poimandresStrongTurquoise",
83
+ "syntaxNumber": "poimandresPink",
84
+ "syntaxType": "poimandresStrongTurquoise",
85
+ "syntaxOperator": "poimandresDesaturatedGreen",
86
+ "syntaxPunctuation": "poimandresBluishGray",
87
+ "thinkingOff": "poimandresDarkerGray",
88
+ "thinkingMinimal": "poimandresBluishGray",
89
+ "thinkingLow": "poimandresBrightMint",
90
+ "thinkingMedium": "poimandresStrongTurquoise",
91
+ "thinkingHigh": "poimandresPink",
92
+ "thinkingXhigh": "poimandresHotRed",
93
+ "bashMode": "poimandresDesaturatedGreen",
94
+ "pythonMode": "poimandresStrongTurquoise",
95
+ "statusLineBg": "poimandresBluishGrayBrighter",
96
+ "statusLineSep": 103,
97
+ "statusLineModel": "poimandresBrightMint",
98
+ "statusLinePath": "poimandresBluishGray",
99
+ "statusLineGitClean": "poimandresStrongTurquoise",
100
+ "statusLineGitDirty": "poimandresHotRed",
101
+ "statusLineContext": "poimandresBluishGray",
102
+ "statusLineSpend": "poimandresLowerMint",
103
+ "statusLineStaged": 44,
104
+ "statusLineDirty": 169,
105
+ "statusLineUntracked": 229,
106
+ "statusLineOutput": "poimandresLowerBlue",
107
+ "statusLineCost": "poimandresPink",
108
+ "statusLineSubagents": "poimandresDesaturatedGreen"
109
+ },
110
+ "export": {
111
+ "pageBg": "poimandresOffWhite",
112
+ "cardBg": "poimandresBluishGrayBrighter",
113
+ "infoBg": "poimandresFocus"
114
+ },
115
+ "symbols": {
116
+ "preset": "nerd",
117
+ "overrides": {
118
+ "status.success": "●",
119
+ "status.error": "✖",
120
+ "status.warning": "◆",
121
+ "status.info": "○",
122
+ "status.pending": "◌",
123
+ "nav.cursor": "▸",
124
+ "nav.selected": "▴",
125
+ "thinking.minimal": "◌",
126
+ "thinking.low": "◍",
127
+ "thinking.medium": "◎",
128
+ "thinking.high": "◉",
129
+ "thinking.xhigh": "●",
130
+ "icon.model": "◇",
131
+ "icon.plan": "◈",
132
+ "icon.folder": "▸",
133
+ "icon.pi": "π",
134
+ "format.bullet": "◦",
135
+ "md.bullet": "◦"
136
+ }
137
+ }
138
+ }
package/src/patch/diff.ts CHANGED
@@ -386,10 +386,10 @@ export async function computePatchDiff(
386
386
  * Used for preview rendering in the TUI before hashline-mode edits execute.
387
387
  */
388
388
  export async function computeHashlineDiff(
389
- input: { path: string; edits: HashlineEdit[] },
389
+ input: { path: string; edits: HashlineEdit[]; move?: string },
390
390
  cwd: string,
391
391
  ): Promise<DiffResult | DiffError> {
392
- const { path, edits } = input;
392
+ const { path, edits, move } = input;
393
393
  const absolutePath = resolveToCwd(path, cwd);
394
394
 
395
395
  try {
@@ -414,7 +414,7 @@ export async function computeHashlineDiff(
414
414
  const normalizedContent = normalizeToLF(content);
415
415
 
416
416
  const result = applyHashlineEdits(normalizedContent, edits);
417
- if (normalizedContent === result.lines) {
417
+ if (normalizedContent === result.lines && !move) {
418
418
  return { error: `No changes would be made to ${path}. The edits produce identical content.` };
419
419
  }
420
420