santree 0.5.5 → 0.5.6

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.
@@ -629,21 +629,21 @@ export default function Dashboard() {
629
629
  }
630
630
  }, [state.reviewSelectedIndex, state.flatReviews, contentHeight, state.reviewListScrollOffset]);
631
631
  // ── Mouse tracking pause ─────────────────────────────────────────
632
- // The MultilineTextArea captures ESC for cancel. With SGR mouse tracking on,
633
- // every click emits `\x1b[<btn;col;rowM` Ink reads the leading ESC and fires
634
- // key.escape, dismissing the overlay. Disable tracking while any overlay
635
- // phase mounts a MultilineTextArea (context-input editing OR pr-create
636
- // review); restore when that phase ends.
632
+ // With SGR mouse tracking on, every click emits `\x1b[<btn;col;rowM` —
633
+ // these escape sequences leak into text inputs as garbage characters
634
+ // (and into MultilineTextArea, the leading ESC fires key.escape).
635
+ // Disable tracking while any text-input overlay is mounted; restore on exit.
637
636
  useEffect(() => {
638
- const needsMouseOff = (state.overlay === "context-input" && state.contextInputPhase === "editing") ||
639
- (state.overlay === "pr-create" && state.prCreatePhase === "review");
637
+ const needsMouseOff = state.overlay === "context-input" ||
638
+ (state.overlay === "pr-create" && state.prCreatePhase === "review") ||
639
+ (state.overlay === "commit" && state.commitPhase === "awaiting-message");
640
640
  if (!needsMouseOff)
641
641
  return;
642
642
  process.stdout.write("\x1b[?1002l\x1b[?1006l");
643
643
  return () => {
644
644
  process.stdout.write("\x1b[?1002h\x1b[?1006h");
645
645
  };
646
- }, [state.overlay, state.contextInputPhase, state.prCreatePhase]);
646
+ }, [state.overlay, state.prCreatePhase, state.commitPhase]);
647
647
  // ── Diff overlay: load file list when opened ──────────────────────
648
648
  // Resolves merge-base against the configured base branch so upstream-only
649
649
  // changes (commits on master we haven't pulled) are excluded — same semantics
@@ -1396,29 +1396,10 @@ export default function Dashboard() {
1396
1396
  }
1397
1397
  return;
1398
1398
  }
1399
- // Context-input overlay.
1400
- // Editing phase: MultilineTextArea owns useInput (outer is disabled
1401
- // via isActive below).
1402
- // Review phase: outer handles y/n/e/ESC.
1399
+ // Context-input overlay: MultilineTextArea owns useInput (outer is
1400
+ // disabled via isActive below). Submit launches directly; cancel
1401
+ // closes the overlay.
1403
1402
  if (state.overlay === "context-input") {
1404
- if (state.contextInputPhase === "review") {
1405
- if (input === "y" || key.return) {
1406
- const mode = state.contextInputMode;
1407
- const ctx = state.contextInputValue;
1408
- dispatch({ type: "CONTEXT_INPUT_DONE" });
1409
- if (mode)
1410
- doWork(mode, ctx);
1411
- return;
1412
- }
1413
- if (input === "n" || input === "e") {
1414
- dispatch({ type: "CONTEXT_INPUT_EDIT" });
1415
- return;
1416
- }
1417
- if (key.escape) {
1418
- dispatch({ type: "CONTEXT_INPUT_DONE" });
1419
- return;
1420
- }
1421
- }
1422
1403
  return;
1423
1404
  }
1424
1405
  // Diff overlay
@@ -2107,7 +2088,7 @@ export default function Dashboard() {
2107
2088
  return;
2108
2089
  }
2109
2090
  }, {
2110
- isActive: (state.overlay !== "context-input" || state.contextInputPhase === "review") &&
2091
+ isActive: state.overlay !== "context-input" &&
2111
2092
  (state.overlay !== "pr-create" || state.prCreatePhase !== "review") &&
2112
2093
  (state.overlay !== "commit" || state.commitPhase !== "awaiting-message"),
2113
2094
  });
@@ -2120,10 +2101,13 @@ export default function Dashboard() {
2120
2101
  }
2121
2102
  const selectedIssue = state.flatIssues[state.selectedIndex] ?? null;
2122
2103
  const selectedReview = state.flatReviews[state.reviewSelectedIndex] ?? null;
2123
- return (_jsxs(Box, { width: columns, height: rows, flexDirection: "column", children: [_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "santree" }), _jsxs(Text, { dimColor: true, children: [" ", "v", version] }), updateAvailable && latestVersion ? (_jsxs(Text, { color: "yellow", children: [" ⬆ v", latestVersion, " available — `santree update`"] })) : null, CLAUDE_VERSION ? (_jsxs(Text, { dimColor: true, children: [" · claude ", CLAUDE_VERSION] })) : null, claudeUpdateAvailable && latestClaudeVersion ? (_jsxs(Text, { color: "yellow", children: [" ⬆ ", latestClaudeVersion] })) : null, state.refreshing ? _jsx(Text, { dimColor: true, children: " · refreshing…" }) : null, state.actionMessage ? (_jsxs(Text, { color: "yellow", children: [" · ", state.actionMessage] })) : null] }), _jsxs(Box, { paddingX: 1, children: [_jsx(Tab, { active: state.activeTab === "issues", label: `1 Issues (${state.flatIssues.length})`, mode: theme.mode }), _jsx(Text, { children: " " }), _jsx(Tab, { active: state.activeTab === "reviews", label: `2 Reviews (${state.flatReviews.length})`, mode: theme.mode })] }), _jsxs(Box, { flexGrow: 1, borderStyle: "round", borderColor: "cyan", flexDirection: "column", children: [state.overlay === "mode-select" ? (_jsx(Box, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: _jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 3, paddingY: 1, children: [_jsx(Text, { bold: true, children: "Select mode:" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { color: "cyan", bold: true, children: "p" }), " Plan"] }), _jsxs(Text, { children: [_jsx(Text, { color: "cyan", bold: true, children: "i" }), " Implement"] }), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "ESC to cancel" })] }) })) : state.overlay === "context-input" ? (_jsx(Box, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: _jsxs(Box, { flexDirection: "column", paddingX: 2, width: Math.min(columns - 8, 100), children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Extra context for ", state.contextInputMode] }), _jsx(Text, { dimColor: true, children: "Optional \u2014 appended to the prompt before launching Claude" }), _jsx(Text, { children: " " }), state.contextInputPhase === "editing" ? (_jsxs(_Fragment, { children: [_jsx(MultilineTextArea, { value: state.contextInputValue, onChange: (v) => dispatch({ type: "CONTEXT_INPUT_CHANGE", value: v }), onSubmit: () => dispatch({ type: "CONTEXT_INPUT_REVIEW" }), onCancel: () => dispatch({ type: "CONTEXT_INPUT_DONE" }), width: Math.min(columns - 8, 100), height: 10, placeholder: "Type or paste extra context\u2026" }), _jsx(Text, { children: " " }), _jsxs(Text, { dimColor: true, children: [_jsx(Text, { color: "cyan", bold: true, children: "Ctrl+D" }), " send · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+O" }), " editor · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+C" }), " cancel"] })] })) : (_jsxs(_Fragment, { children: [_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "green", paddingX: 1, minHeight: 6, children: [(state.contextInputValue || "(no extra context)")
2124
- .split("\n")
2125
- .slice(0, 12)
2126
- .map((line, i) => (_jsx(Text, { children: line || " " }, i))), state.contextInputValue.split("\n").length > 12 && (_jsxs(Text, { dimColor: true, children: ["\u2026+", state.contextInputValue.split("\n").length - 12, " more lines"] }))] }), _jsx(Text, { children: " " }), _jsx(Text, { bold: true, children: "Anything else to add?" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { color: "green", bold: true, children: "y" }), " / ", _jsx(Text, { color: "green", bold: true, children: "Enter" }), " launch ", _jsx(Text, { color: "yellow", bold: true, children: "n" }), " / ", _jsx(Text, { color: "yellow", bold: true, children: "e" }), " keep editing ", _jsx(Text, { color: "red", bold: true, children: "ESC" }), " cancel"] })] }))] }) })) : state.overlay === "base-select" ? (_jsx(Box, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: _jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 3, paddingY: 1, children: [_jsx(Text, { bold: true, children: "Select base branch:" }), _jsx(Text, { children: " " }), state.baseSelectOptions.map((branch, idx) => {
2104
+ return (_jsxs(Box, { width: columns, height: rows, flexDirection: "column", children: [_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "santree" }), _jsxs(Text, { dimColor: true, children: [" ", "v", version] }), updateAvailable && latestVersion ? (_jsxs(Text, { color: "yellow", children: [" ⬆ v", latestVersion, " available — `santree update`"] })) : null, CLAUDE_VERSION ? (_jsxs(Text, { dimColor: true, children: [" · claude ", CLAUDE_VERSION] })) : null, claudeUpdateAvailable && latestClaudeVersion ? (_jsxs(Text, { color: "yellow", children: [" ⬆ ", latestClaudeVersion] })) : null, state.refreshing ? _jsx(Text, { dimColor: true, children: " · refreshing…" }) : null, state.actionMessage ? (_jsxs(Text, { color: "yellow", children: [" · ", state.actionMessage] })) : null] }), _jsxs(Box, { paddingX: 1, children: [_jsx(Tab, { active: state.activeTab === "issues", label: `1 Issues (${state.flatIssues.length})`, mode: theme.mode }), _jsx(Text, { children: " " }), _jsx(Tab, { active: state.activeTab === "reviews", label: `2 Reviews (${state.flatReviews.length})`, mode: theme.mode })] }), _jsxs(Box, { flexGrow: 1, borderStyle: "round", borderColor: "cyan", flexDirection: "column", children: [state.overlay === "mode-select" ? (_jsx(Box, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: _jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 3, paddingY: 1, children: [_jsx(Text, { bold: true, children: "Select mode:" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { color: "cyan", bold: true, children: "p" }), " Plan"] }), _jsxs(Text, { children: [_jsx(Text, { color: "cyan", bold: true, children: "i" }), " Implement"] }), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "ESC to cancel" })] }) })) : state.overlay === "context-input" ? (_jsx(Box, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: _jsxs(Box, { flexDirection: "column", paddingX: 2, width: Math.min(columns - 8, 100), children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Extra context for ", state.contextInputMode] }), _jsx(Text, { dimColor: true, children: "Optional \u2014 appended to the prompt before launching Claude" }), _jsx(Text, { children: " " }), _jsx(MultilineTextArea, { value: state.contextInputValue, onChange: (v) => dispatch({ type: "CONTEXT_INPUT_CHANGE", value: v }), onSubmit: () => {
2105
+ const mode = state.contextInputMode;
2106
+ const ctx = state.contextInputValue;
2107
+ dispatch({ type: "CONTEXT_INPUT_DONE" });
2108
+ if (mode)
2109
+ doWork(mode, ctx);
2110
+ }, onCancel: () => dispatch({ type: "CONTEXT_INPUT_DONE" }), width: Math.min(columns - 8, 100), height: 10, placeholder: "Type or paste extra context\u2026" }), _jsx(Text, { children: " " }), _jsxs(Text, { dimColor: true, children: [_jsx(Text, { color: "cyan", bold: true, children: "Ctrl+D" }), " launch · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+O" }), " editor · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+G" }), " cancel"] })] }) })) : state.overlay === "base-select" ? (_jsx(Box, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: _jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 3, paddingY: 1, children: [_jsx(Text, { bold: true, children: "Select base branch:" }), _jsx(Text, { children: " " }), state.baseSelectOptions.map((branch, idx) => {
2127
2111
  const selected = idx === state.baseSelectIndex;
2128
2112
  const defaultBranch = getDefaultBranch();
2129
2113
  const label = branch === defaultBranch ? `${branch} (default)` : branch;
@@ -162,24 +162,17 @@ export function MultilineTextArea({ value, onChange, onSubmit, onCancel, placeho
162
162
  onSubmit();
163
163
  return;
164
164
  }
165
- // Ctrl+C: cancel (preferred over Esc — vim users rely on Esc muscle memory)
166
- if (key.ctrl && input === "c") {
167
- onCancel();
168
- return;
169
- }
170
165
  // Ctrl+O: escalate to $SANTREE_EDITOR / $VISUAL / $EDITOR. On save+close
171
- // the buffer is replaced and the form is auto-submitted (matches git commit).
166
+ // the buffer is replaced and control returns to the textbox so the
167
+ // user can keep editing or submit with Ctrl+D.
172
168
  if (key.ctrl && input === "o") {
173
169
  const result = editExternally(value, "md");
174
170
  if (!result.ok)
175
171
  return;
176
- if (result.cancelled) {
177
- onCancel();
172
+ if (result.cancelled)
178
173
  return;
179
- }
180
174
  onChange(result.content);
181
175
  setCursor(result.content.length);
182
- onSubmit();
183
176
  return;
184
177
  }
185
178
  // Ctrl+V: paste clipboard image as a temp file reference.
@@ -189,6 +182,13 @@ export function MultilineTextArea({ value, onChange, onSubmit, onCancel, placeho
189
182
  insertAt(cursor, `![pasted image](${imagePath})`);
190
183
  return;
191
184
  }
185
+ // Ctrl+G: cancel (Emacs abort). Ctrl+C can't be used because Ink's
186
+ // exitOnCtrlC fires at the app level before useInput sees it, exiting
187
+ // the dashboard. Esc is reserved for vim muscle memory (swallowed).
188
+ if (key.ctrl && input === "g") {
189
+ onCancel();
190
+ return;
191
+ }
192
192
  // Esc: swallow without cancelling (vim users hit it constantly).
193
193
  if (key.escape)
194
194
  return;
@@ -22,7 +22,7 @@ export function CommitOverlay({ width, height, branch, ticketId, gitStatus, phas
22
22
  }), gitStatus.split("\n").length > 8 && (_jsxs(Text, { dimColor: true, children: [" +", gitStatus.split("\n").length - 8, " more"] }))] })) : null, _jsx(Text, { children: " " }), phase === "confirm-stage" && (_jsxs(Text, { children: ["Stage all changes?", " ", _jsx(Text, { color: "cyan", bold: true, children: "y" }), "/", _jsx(Text, { color: "cyan", bold: true, children: "n" })] })), phase === "awaiting-message" && (_jsxs(Box, { children: [_jsx(Text, { children: "Message: " }), _jsx(TextInput, { value: message, onChange: (v) => dispatch({ type: "COMMIT_MESSAGE", message: v }), onSubmit: onSubmit })] })), phase === "committing" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Committing..."] })), phase === "pushing" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Pushing..."] })), phase === "done" && (_jsx(Text, { color: "green", bold: true, children: "Committed and pushed!" })), phase === "error" && _jsx(Text, { color: "red", children: error }), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "ESC to cancel" })] }));
23
23
  }
24
24
  export function PrCreateOverlay({ width, height, branch, ticketId, phase, error, url, body, title, dispatch, }) {
25
- return (_jsxs(Box, { flexDirection: "column", width: width, height: height, children: [_jsx(Text, { bold: true, color: "cyan", children: "Create Pull Request" }), _jsx(Text, { dimColor: true, children: "─".repeat(Math.min(width, 50)) }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "branch: " }), _jsx(Text, { children: branch })] }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "ticket: " }), _jsx(Text, { children: ticketId })] }), _jsx(Text, { children: " " }), phase === "choose-mode" && (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: "How do you want to create this PR?" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "cyan", bold: true, children: "f" }), " ", "Fill \u2014 use AI to fill the PR template"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "cyan", bold: true, children: "w" }), " ", "Web \u2014 open in browser to edit manually"] })] })), phase === "pushing" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Pushing branch..."] })), phase === "filling" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Filling PR template with AI..."] })), phase === "review" && (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: "Edit PR description" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "title: " }), _jsx(Text, { children: title })] }), _jsx(Text, { children: " " }), _jsx(MultilineTextArea, { value: body ?? "", onChange: (v) => dispatch({ type: "PR_CREATE_BODY_CHANGE", body: v }), onSubmit: () => dispatch({ type: "PR_CREATE_CONFIRM" }), onCancel: () => dispatch({ type: "PR_CREATE_CANCEL" }), width: width, height: Math.max(6, height - 10), placeholder: "(empty PR body)" }), _jsx(Text, { children: " " }), _jsxs(Text, { dimColor: true, children: [_jsx(Text, { color: "cyan", bold: true, children: "Ctrl+D" }), " send · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+O" }), " editor · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+C" }), " cancel"] })] })), phase === "confirm" && (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: "Create this PR?" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "title: " }), _jsx(Text, { children: title })] }), _jsx(Text, { children: " " }), _jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "green", paddingX: 1, children: [(body ?? "")
25
+ return (_jsxs(Box, { flexDirection: "column", width: width, height: height, children: [_jsx(Text, { bold: true, color: "cyan", children: "Create Pull Request" }), _jsx(Text, { dimColor: true, children: "─".repeat(Math.min(width, 50)) }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "branch: " }), _jsx(Text, { children: branch })] }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "ticket: " }), _jsx(Text, { children: ticketId })] }), _jsx(Text, { children: " " }), phase === "choose-mode" && (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: "How do you want to create this PR?" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "cyan", bold: true, children: "f" }), " ", "Fill \u2014 use AI to fill the PR template"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "cyan", bold: true, children: "w" }), " ", "Web \u2014 open in browser to edit manually"] })] })), phase === "pushing" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Pushing branch..."] })), phase === "filling" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Filling PR template with AI..."] })), phase === "review" && (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: "Edit PR description" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "title: " }), _jsx(Text, { children: title })] }), _jsx(Text, { children: " " }), _jsx(MultilineTextArea, { value: body ?? "", onChange: (v) => dispatch({ type: "PR_CREATE_BODY_CHANGE", body: v }), onSubmit: () => dispatch({ type: "PR_CREATE_CONFIRM" }), onCancel: () => dispatch({ type: "PR_CREATE_CANCEL" }), width: width, height: Math.max(6, height - 10), placeholder: "(empty PR body)" }), _jsx(Text, { children: " " }), _jsxs(Text, { dimColor: true, children: [_jsx(Text, { color: "cyan", bold: true, children: "Ctrl+D" }), " send · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+O" }), " editor · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+G" }), " cancel"] })] })), phase === "confirm" && (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: "Create this PR?" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "title: " }), _jsx(Text, { children: title })] }), _jsx(Text, { children: " " }), _jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "green", paddingX: 1, children: [(body ?? "")
26
26
  .split("\n")
27
27
  .slice(0, Math.max(4, height - 12))
28
28
  .map((line, i) => (_jsx(Text, { wrap: "truncate", children: line || " " }, i))), (body ?? "").split("\n").length > Math.max(4, height - 12) && (_jsxs(Text, { dimColor: true, children: ["\u2026+", (body ?? "").split("\n").length - Math.max(4, height - 12), " more lines"] }))] }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { color: "green", bold: true, children: "y" }), " / ", _jsx(Text, { color: "green", bold: true, children: "Enter" }), " create ", _jsx(Text, { color: "yellow", bold: true, children: "e" }), " keep editing ", _jsx(Text, { color: "cyan", bold: true, children: "w" }), " open in browser ", _jsx(Text, { color: "red", bold: true, children: "ESC" }), " cancel"] })] })), phase === "creating" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Creating PR..."] })), phase === "done" && (_jsxs(_Fragment, { children: [_jsx(Text, { color: "green", bold: true, children: "PR created!" }), url ? _jsx(Text, { dimColor: true, children: url }) : null] })), phase === "error" && (_jsxs(_Fragment, { children: [_jsx(Text, { color: "red", children: error }), _jsx(Text, { children: " " }), _jsxs(Text, { dimColor: true, children: [_jsx(Text, { color: "cyan", bold: true, children: "w" }), " ", "open in browser ESC cancel"] })] })), phase !== "review" && phase !== "confirm" && phase !== "error" && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "ESC to cancel" })] }))] }));
@@ -103,7 +103,6 @@ export interface DashboardState {
103
103
  baseSelectChosen: string | null;
104
104
  contextInputValue: string;
105
105
  contextInputMode: "plan" | "implement" | null;
106
- contextInputPhase: "editing" | "review";
107
106
  diffTicketId: string | null;
108
107
  diffWorktreePath: string | null;
109
108
  diffBaseBranch: string | null;
@@ -249,10 +248,6 @@ export type DashboardAction = {
249
248
  } | {
250
249
  type: "CONTEXT_INPUT_CHANGE";
251
250
  value: string;
252
- } | {
253
- type: "CONTEXT_INPUT_REVIEW";
254
- } | {
255
- type: "CONTEXT_INPUT_EDIT";
256
251
  } | {
257
252
  type: "CONTEXT_INPUT_DONE";
258
253
  } | {
@@ -40,7 +40,6 @@ export const initialState = {
40
40
  baseSelectChosen: null,
41
41
  contextInputValue: "",
42
42
  contextInputMode: null,
43
- contextInputPhase: "editing",
44
43
  diffTicketId: null,
45
44
  diffWorktreePath: null,
46
45
  diffBaseBranch: null,
@@ -271,21 +270,15 @@ export function reducer(state, action) {
271
270
  overlay: "context-input",
272
271
  contextInputMode: action.mode,
273
272
  contextInputValue: "",
274
- contextInputPhase: "editing",
275
273
  };
276
274
  case "CONTEXT_INPUT_CHANGE":
277
275
  return { ...state, contextInputValue: action.value };
278
- case "CONTEXT_INPUT_REVIEW":
279
- return { ...state, contextInputPhase: "review" };
280
- case "CONTEXT_INPUT_EDIT":
281
- return { ...state, contextInputPhase: "editing" };
282
276
  case "CONTEXT_INPUT_DONE":
283
277
  return {
284
278
  ...state,
285
279
  overlay: null,
286
280
  contextInputMode: null,
287
281
  contextInputValue: "",
288
- contextInputPhase: "editing",
289
282
  };
290
283
  case "DIFF_OPEN":
291
284
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "santree",
3
- "version": "0.5.5",
3
+ "version": "0.5.6",
4
4
  "description": "Git worktree manager",
5
5
  "license": "MIT",
6
6
  "author": "Santiago Toscanini",