@prestyj/cli 4.2.46 → 4.2.56
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/dist/cli.js +126 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/compaction/compactor.d.ts +8 -4
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +181 -25
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +6 -4
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +54 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/telegram.d.ts +19 -0
- package/dist/core/telegram.d.ts.map +1 -1
- package/dist/core/telegram.js +22 -0
- package/dist/core/telegram.js.map +1 -1
- package/dist/core/voice-transcriber.d.ts +33 -0
- package/dist/core/voice-transcriber.d.ts.map +1 -0
- package/dist/core/voice-transcriber.js +113 -0
- package/dist/core/voice-transcriber.js.map +1 -0
- package/dist/core/voice-transcriber.test.d.ts +2 -0
- package/dist/core/voice-transcriber.test.d.ts.map +1 -0
- package/dist/core/voice-transcriber.test.js +88 -0
- package/dist/core/voice-transcriber.test.js.map +1 -0
- package/dist/modes/serve-mode.d.ts.map +1 -1
- package/dist/modes/serve-mode.js +37 -0
- package/dist/modes/serve-mode.js.map +1 -1
- package/dist/tools/edit-diff.test.d.ts +2 -0
- package/dist/tools/edit-diff.test.d.ts.map +1 -0
- package/dist/tools/edit-diff.test.js +67 -0
- package/dist/tools/edit-diff.test.js.map +1 -0
- package/dist/tools/edit.test.d.ts +2 -0
- package/dist/tools/edit.test.d.ts.map +1 -0
- package/dist/tools/edit.test.js +93 -0
- package/dist/tools/edit.test.js.map +1 -0
- package/dist/tools/path-utils.test.d.ts +2 -0
- package/dist/tools/path-utils.test.d.ts.map +1 -0
- package/dist/tools/path-utils.test.js +49 -0
- package/dist/tools/path-utils.test.js.map +1 -0
- package/dist/tools/plan-mode.test.js.map +1 -1
- package/dist/tools/read.test.d.ts +2 -0
- package/dist/tools/read.test.d.ts.map +1 -0
- package/dist/tools/read.test.js +81 -0
- package/dist/tools/read.test.js.map +1 -0
- package/dist/tools/truncate-utils.test.d.ts +2 -0
- package/dist/tools/truncate-utils.test.d.ts.map +1 -0
- package/dist/tools/truncate-utils.test.js +93 -0
- package/dist/tools/truncate-utils.test.js.map +1 -0
- package/dist/tools/write.test.js +65 -52
- package/dist/tools/write.test.js.map +1 -1
- package/dist/ui/App.d.ts +7 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +48 -12
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/activity-phrases.d.ts +10 -0
- package/dist/ui/activity-phrases.d.ts.map +1 -0
- package/dist/ui/activity-phrases.js +227 -0
- package/dist/ui/activity-phrases.js.map +1 -0
- package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
- package/dist/ui/components/ActivityIndicator.js +1 -225
- package/dist/ui/components/ActivityIndicator.js.map +1 -1
- package/dist/ui/components/Banner.d.ts.map +1 -1
- package/dist/ui/components/Banner.js +10 -1
- package/dist/ui/components/Banner.js.map +1 -1
- package/dist/ui/components/Footer.d.ts.map +1 -1
- package/dist/ui/components/Footer.js +27 -17
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/ui/components/InputArea.d.ts.map +1 -1
- package/dist/ui/components/InputArea.js +583 -59
- package/dist/ui/components/InputArea.js.map +1 -1
- package/dist/ui/components/Markdown.d.ts +5 -1
- package/dist/ui/components/Markdown.d.ts.map +1 -1
- package/dist/ui/components/Markdown.js +14 -6
- package/dist/ui/components/Markdown.js.map +1 -1
- package/dist/ui/components/PlanApproval.d.ts.map +1 -1
- package/dist/ui/components/PlanApproval.js +17 -1
- package/dist/ui/components/PlanApproval.js.map +1 -1
- package/dist/ui/components/PlanBanner.d.ts.map +1 -1
- package/dist/ui/components/PlanBanner.js +18 -1
- package/dist/ui/components/PlanBanner.js.map +1 -1
- package/dist/ui/components/PlanOverlay.d.ts.map +1 -1
- package/dist/ui/components/PlanOverlay.js +43 -12
- package/dist/ui/components/PlanOverlay.js.map +1 -1
- package/dist/ui/components/SkillsOverlay.d.ts.map +1 -1
- package/dist/ui/components/SkillsOverlay.js +5 -1
- package/dist/ui/components/SkillsOverlay.js.map +1 -1
- package/dist/ui/components/TaskOverlay.d.ts.map +1 -1
- package/dist/ui/components/TaskOverlay.js +5 -1
- package/dist/ui/components/TaskOverlay.js.map +1 -1
- package/dist/ui/components/ToolExecution.js +1 -1
- package/dist/ui/components/ToolExecution.js.map +1 -1
- package/dist/ui/hooks/useTerminalSize.d.ts +7 -7
- package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
- package/dist/ui/hooks/useTerminalSize.js +25 -12
- package/dist/ui/hooks/useTerminalSize.js.map +1 -1
- package/dist/ui/hooks/useTerminalTitle.d.ts +8 -1
- package/dist/ui/hooks/useTerminalTitle.d.ts.map +1 -1
- package/dist/ui/hooks/useTerminalTitle.js +19 -22
- package/dist/ui/hooks/useTerminalTitle.js.map +1 -1
- package/dist/ui/plan-overlay.test.d.ts +2 -0
- package/dist/ui/plan-overlay.test.d.ts.map +1 -0
- package/dist/ui/plan-overlay.test.js +327 -0
- package/dist/ui/plan-overlay.test.js.map +1 -0
- package/package.json +6 -4
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
async function loadPlanEntries(cwd) {
|
|
6
|
+
const plansDir = path.join(cwd, ".ezcoder", "plans");
|
|
7
|
+
let files;
|
|
8
|
+
try {
|
|
9
|
+
files = await fs.readdir(plansDir);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
const entries = [];
|
|
15
|
+
for (const file of files) {
|
|
16
|
+
if (!file.endsWith(".md"))
|
|
17
|
+
continue;
|
|
18
|
+
const filePath = path.join(plansDir, file);
|
|
19
|
+
try {
|
|
20
|
+
const stat = await fs.stat(filePath);
|
|
21
|
+
entries.push({
|
|
22
|
+
name: file.replace(/\.md$/, ""),
|
|
23
|
+
path: filePath,
|
|
24
|
+
modifiedMs: stat.mtimeMs,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
entries.push({ name: file.replace(/\.md$/, ""), path: filePath, modifiedMs: 0 });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Sort newest first
|
|
32
|
+
entries.sort((a, b) => b.modifiedMs - a.modifiedMs);
|
|
33
|
+
return entries;
|
|
34
|
+
}
|
|
35
|
+
function createAppState(overrides) {
|
|
36
|
+
return {
|
|
37
|
+
overlay: null,
|
|
38
|
+
planAutoExpand: false,
|
|
39
|
+
planMode: false,
|
|
40
|
+
pending: false,
|
|
41
|
+
doneStatus: null,
|
|
42
|
+
...overrides,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function simulateOnDone(state, durationMs, toolsUsed) {
|
|
46
|
+
// Mirrors App.tsx line 1071
|
|
47
|
+
if (state.pending)
|
|
48
|
+
return;
|
|
49
|
+
state.doneStatus = { durationMs, toolsUsed, verb: "done" };
|
|
50
|
+
}
|
|
51
|
+
// ── Auto-expand helper (mirrors PlanOverlay.tsx lines 168-173) ──
|
|
52
|
+
function tryAutoExpand(autoExpandNewest, loaded, plans, alreadyExpanded) {
|
|
53
|
+
if (autoExpandNewest && loaded && plans.length > 0 && !alreadyExpanded) {
|
|
54
|
+
return { expanded: true, plan: plans[0] };
|
|
55
|
+
}
|
|
56
|
+
return { expanded: alreadyExpanded, plan: null };
|
|
57
|
+
}
|
|
58
|
+
// ── Index clamping (mirrors PlanOverlay.tsx lines 176-182) ──
|
|
59
|
+
function clampIndex(selectedIndex, plansLength) {
|
|
60
|
+
if (plansLength === 0)
|
|
61
|
+
return 0;
|
|
62
|
+
if (selectedIndex >= plansLength)
|
|
63
|
+
return plansLength - 1;
|
|
64
|
+
return selectedIndex;
|
|
65
|
+
}
|
|
66
|
+
// ── Tests ────────────────────────────────────────────────────
|
|
67
|
+
let tmpDir;
|
|
68
|
+
beforeEach(async () => {
|
|
69
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "plan-overlay-test-"));
|
|
70
|
+
});
|
|
71
|
+
afterEach(async () => {
|
|
72
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
73
|
+
});
|
|
74
|
+
// ── loadPlanEntries ──────────────────────────────────────────
|
|
75
|
+
describe("loadPlanEntries", () => {
|
|
76
|
+
it("returns empty array when .ezcoder/plans/ does not exist", async () => {
|
|
77
|
+
const entries = await loadPlanEntries(tmpDir);
|
|
78
|
+
expect(entries).toEqual([]);
|
|
79
|
+
});
|
|
80
|
+
it("returns empty array when .ezcoder/plans/ exists but is empty", async () => {
|
|
81
|
+
await fs.mkdir(path.join(tmpDir, ".ezcoder", "plans"), { recursive: true });
|
|
82
|
+
const entries = await loadPlanEntries(tmpDir);
|
|
83
|
+
expect(entries).toEqual([]);
|
|
84
|
+
});
|
|
85
|
+
it("ignores non-.md files", async () => {
|
|
86
|
+
const plansDir = path.join(tmpDir, ".ezcoder", "plans");
|
|
87
|
+
await fs.mkdir(plansDir, { recursive: true });
|
|
88
|
+
await fs.writeFile(path.join(plansDir, "notes.txt"), "not a plan");
|
|
89
|
+
await fs.writeFile(path.join(plansDir, "data.json"), "{}");
|
|
90
|
+
await fs.writeFile(path.join(plansDir, "real-plan.md"), "# Plan");
|
|
91
|
+
const entries = await loadPlanEntries(tmpDir);
|
|
92
|
+
expect(entries).toHaveLength(1);
|
|
93
|
+
expect(entries[0].name).toBe("real-plan");
|
|
94
|
+
});
|
|
95
|
+
it("loads multiple plans and strips .md extension", async () => {
|
|
96
|
+
const plansDir = path.join(tmpDir, ".ezcoder", "plans");
|
|
97
|
+
await fs.mkdir(plansDir, { recursive: true });
|
|
98
|
+
await fs.writeFile(path.join(plansDir, "alpha.md"), "# Alpha");
|
|
99
|
+
await fs.writeFile(path.join(plansDir, "beta.md"), "# Beta");
|
|
100
|
+
await fs.writeFile(path.join(plansDir, "gamma.md"), "# Gamma");
|
|
101
|
+
const entries = await loadPlanEntries(tmpDir);
|
|
102
|
+
expect(entries).toHaveLength(3);
|
|
103
|
+
const names = entries.map((e) => e.name);
|
|
104
|
+
expect(names).toContain("alpha");
|
|
105
|
+
expect(names).toContain("beta");
|
|
106
|
+
expect(names).toContain("gamma");
|
|
107
|
+
});
|
|
108
|
+
it("sorts plans by modification time (newest first)", async () => {
|
|
109
|
+
const plansDir = path.join(tmpDir, ".ezcoder", "plans");
|
|
110
|
+
await fs.mkdir(plansDir, { recursive: true });
|
|
111
|
+
const oldPath = path.join(plansDir, "old.md");
|
|
112
|
+
const newPath = path.join(plansDir, "new.md");
|
|
113
|
+
await fs.writeFile(oldPath, "# Old");
|
|
114
|
+
const pastTime = new Date(Date.now() - 60_000);
|
|
115
|
+
await fs.utimes(oldPath, pastTime, pastTime);
|
|
116
|
+
await fs.writeFile(newPath, "# New");
|
|
117
|
+
const entries = await loadPlanEntries(tmpDir);
|
|
118
|
+
expect(entries).toHaveLength(2);
|
|
119
|
+
expect(entries[0].name).toBe("new");
|
|
120
|
+
expect(entries[1].name).toBe("old");
|
|
121
|
+
expect(entries[0].modifiedMs).toBeGreaterThan(entries[1].modifiedMs);
|
|
122
|
+
});
|
|
123
|
+
it("sets modifiedMs to 0 when stat fails (e.g., broken symlink)", async () => {
|
|
124
|
+
const plansDir = path.join(tmpDir, ".ezcoder", "plans");
|
|
125
|
+
await fs.mkdir(plansDir, { recursive: true });
|
|
126
|
+
const brokenLink = path.join(plansDir, "broken.md");
|
|
127
|
+
await fs.symlink("/nonexistent/path/file.md", brokenLink);
|
|
128
|
+
const entries = await loadPlanEntries(tmpDir);
|
|
129
|
+
expect(entries).toHaveLength(1);
|
|
130
|
+
expect(entries[0].name).toBe("broken");
|
|
131
|
+
expect(entries[0].modifiedMs).toBe(0);
|
|
132
|
+
});
|
|
133
|
+
it("includes correct absolute paths", async () => {
|
|
134
|
+
const plansDir = path.join(tmpDir, ".ezcoder", "plans");
|
|
135
|
+
await fs.mkdir(plansDir, { recursive: true });
|
|
136
|
+
await fs.writeFile(path.join(plansDir, "my-plan.md"), "# Plan");
|
|
137
|
+
const entries = await loadPlanEntries(tmpDir);
|
|
138
|
+
expect(entries[0].path).toBe(path.join(plansDir, "my-plan.md"));
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
// ── Plan overlay pending guard ──────────────────────────────
|
|
142
|
+
describe("planOverlayPending guard (onDone suppression)", () => {
|
|
143
|
+
it("returns done status when overlay is NOT pending", () => {
|
|
144
|
+
const state = createAppState({ pending: false });
|
|
145
|
+
simulateOnDone(state, 1500, ["read", "write"]);
|
|
146
|
+
expect(state.doneStatus).toEqual({
|
|
147
|
+
durationMs: 1500,
|
|
148
|
+
toolsUsed: ["read", "write"],
|
|
149
|
+
verb: "done",
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
it("returns null (suppresses done) when overlay IS pending", () => {
|
|
153
|
+
const state = createAppState({ pending: true });
|
|
154
|
+
simulateOnDone(state, 1500, ["read", "write"]);
|
|
155
|
+
expect(state.doneStatus).toBeNull();
|
|
156
|
+
});
|
|
157
|
+
it("suppresses done status even with empty tool list", () => {
|
|
158
|
+
const state = createAppState({ pending: true });
|
|
159
|
+
simulateOnDone(state, 500, []);
|
|
160
|
+
expect(state.doneStatus).toBeNull();
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
// ── Plan overlay pending race condition simulation ──────────
|
|
164
|
+
describe("planOverlayPending race condition", () => {
|
|
165
|
+
it("onDone fires BEFORE setTimeout — done status suppressed", () => {
|
|
166
|
+
// Step 1: exit_plan tool finishes → pending = true
|
|
167
|
+
const state = createAppState({ pending: true });
|
|
168
|
+
// Step 2: onDone fires immediately (agent loop finishes)
|
|
169
|
+
simulateOnDone(state, 2000, ["write"]);
|
|
170
|
+
expect(state.doneStatus).toBeNull(); // correctly suppressed
|
|
171
|
+
// Step 3: setTimeout fires (300ms later)
|
|
172
|
+
state.overlay = "plan";
|
|
173
|
+
state.pending = false;
|
|
174
|
+
expect(state.overlay).toBe("plan");
|
|
175
|
+
expect(state.pending).toBe(false);
|
|
176
|
+
});
|
|
177
|
+
it("onDone fires AFTER setTimeout — done status shows (edge case)", () => {
|
|
178
|
+
// Step 1: exit_plan → pending = true
|
|
179
|
+
const state = createAppState({ pending: true });
|
|
180
|
+
// Step 2: setTimeout fires first
|
|
181
|
+
state.overlay = "plan";
|
|
182
|
+
state.pending = false;
|
|
183
|
+
// Step 3: onDone fires after timeout — NOT suppressed
|
|
184
|
+
simulateOnDone(state, 2000, ["write"]);
|
|
185
|
+
expect(state.doneStatus).not.toBeNull();
|
|
186
|
+
// This is the race condition: done status leaks through while overlay is open
|
|
187
|
+
expect(state.overlay).toBe("plan");
|
|
188
|
+
expect(state.doneStatus).toEqual({ durationMs: 2000, toolsUsed: ["write"], verb: "done" });
|
|
189
|
+
});
|
|
190
|
+
it("multiple rapid plan mode toggles don't cause inconsistent state", () => {
|
|
191
|
+
const state = createAppState();
|
|
192
|
+
const stateLog = [];
|
|
193
|
+
for (let i = 0; i < 10; i++) {
|
|
194
|
+
state.planMode = !state.planMode;
|
|
195
|
+
stateLog.push(state.planMode);
|
|
196
|
+
}
|
|
197
|
+
// After even number of toggles, should be back to false
|
|
198
|
+
expect(state.planMode).toBe(false);
|
|
199
|
+
expect(stateLog).toHaveLength(10);
|
|
200
|
+
expect(stateLog.filter(Boolean)).toHaveLength(5);
|
|
201
|
+
expect(stateLog.filter((v) => !v)).toHaveLength(5);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
// ── Auto-expand logic ──────────────────────────────────────
|
|
205
|
+
describe("auto-expand newest plan", () => {
|
|
206
|
+
const testPlan = { name: "test", path: "/tmp/test.md", modifiedMs: Date.now() };
|
|
207
|
+
it("auto-expands when autoExpandNewest=true, loaded=true, plans exist, not yet expanded", () => {
|
|
208
|
+
const result = tryAutoExpand(true, true, [testPlan], false);
|
|
209
|
+
expect(result.expanded).toBe(true);
|
|
210
|
+
expect(result.plan).toBe(testPlan);
|
|
211
|
+
});
|
|
212
|
+
it("does NOT auto-expand when already expanded once", () => {
|
|
213
|
+
const result = tryAutoExpand(true, true, [testPlan], true);
|
|
214
|
+
expect(result.plan).toBeNull();
|
|
215
|
+
});
|
|
216
|
+
it("does NOT auto-expand when plans array is empty", () => {
|
|
217
|
+
const result = tryAutoExpand(true, true, [], false);
|
|
218
|
+
expect(result.expanded).toBe(false);
|
|
219
|
+
expect(result.plan).toBeNull();
|
|
220
|
+
});
|
|
221
|
+
it("does NOT auto-expand when autoExpandNewest is false", () => {
|
|
222
|
+
const result = tryAutoExpand(false, true, [testPlan], false);
|
|
223
|
+
expect(result.expanded).toBe(false);
|
|
224
|
+
expect(result.plan).toBeNull();
|
|
225
|
+
});
|
|
226
|
+
it("does NOT auto-expand when not yet loaded", () => {
|
|
227
|
+
const result = tryAutoExpand(true, false, [testPlan], false);
|
|
228
|
+
expect(result.expanded).toBe(false);
|
|
229
|
+
expect(result.plan).toBeNull();
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
// ── Plan file readability ──────────────────────────────────
|
|
233
|
+
describe("plan file reading edge cases", () => {
|
|
234
|
+
it("handles plan file that exists during listing but is deleted before reading", async () => {
|
|
235
|
+
const plansDir = path.join(tmpDir, ".ezcoder", "plans");
|
|
236
|
+
await fs.mkdir(plansDir, { recursive: true });
|
|
237
|
+
const planPath = path.join(plansDir, "ephemeral.md");
|
|
238
|
+
await fs.writeFile(planPath, "# Short-lived plan");
|
|
239
|
+
const entries = await loadPlanEntries(tmpDir);
|
|
240
|
+
expect(entries).toHaveLength(1);
|
|
241
|
+
await fs.unlink(planPath);
|
|
242
|
+
let content;
|
|
243
|
+
try {
|
|
244
|
+
content = await fs.readFile(planPath, "utf-8");
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
content = "(could not read plan)";
|
|
248
|
+
}
|
|
249
|
+
expect(content).toBe("(could not read plan)");
|
|
250
|
+
});
|
|
251
|
+
it("handles plan file with empty content", async () => {
|
|
252
|
+
const plansDir = path.join(tmpDir, ".ezcoder", "plans");
|
|
253
|
+
await fs.mkdir(plansDir, { recursive: true });
|
|
254
|
+
await fs.writeFile(path.join(plansDir, "empty.md"), "");
|
|
255
|
+
const entries = await loadPlanEntries(tmpDir);
|
|
256
|
+
expect(entries).toHaveLength(1);
|
|
257
|
+
const content = await fs.readFile(entries[0].path, "utf-8");
|
|
258
|
+
expect(content).toBe("");
|
|
259
|
+
});
|
|
260
|
+
it("handles plan file with very large content", async () => {
|
|
261
|
+
const plansDir = path.join(tmpDir, ".ezcoder", "plans");
|
|
262
|
+
await fs.mkdir(plansDir, { recursive: true });
|
|
263
|
+
const largeContent = "# Plan\n\n" + "Step ".repeat(100_000);
|
|
264
|
+
await fs.writeFile(path.join(plansDir, "large.md"), largeContent);
|
|
265
|
+
const entries = await loadPlanEntries(tmpDir);
|
|
266
|
+
expect(entries).toHaveLength(1);
|
|
267
|
+
const content = await fs.readFile(entries[0].path, "utf-8");
|
|
268
|
+
expect(content.length).toBeGreaterThan(400_000);
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
// ── Overlay state machine ──────────────────────────────────
|
|
272
|
+
describe("overlay state transitions", () => {
|
|
273
|
+
it("opening plan overlay replaces any existing overlay", () => {
|
|
274
|
+
const state = createAppState({ overlay: "tasks" });
|
|
275
|
+
state.overlay = "plan";
|
|
276
|
+
expect(state.overlay).toBe("plan");
|
|
277
|
+
});
|
|
278
|
+
it("closing plan overlay returns to null", () => {
|
|
279
|
+
const state = createAppState({ overlay: "plan" });
|
|
280
|
+
state.overlay = null;
|
|
281
|
+
expect(state.overlay).toBeNull();
|
|
282
|
+
});
|
|
283
|
+
it("approving a plan closes the overlay and resets autoExpand", () => {
|
|
284
|
+
const state = createAppState({ overlay: "plan", planAutoExpand: true });
|
|
285
|
+
// onApprove handler
|
|
286
|
+
state.planAutoExpand = false;
|
|
287
|
+
state.overlay = null;
|
|
288
|
+
expect(state.overlay).toBeNull();
|
|
289
|
+
expect(state.planAutoExpand).toBe(false);
|
|
290
|
+
});
|
|
291
|
+
it("plan overlay from exit_plan uses autoExpand", () => {
|
|
292
|
+
const state = createAppState();
|
|
293
|
+
// Simulates the setTimeout in onExitPlan
|
|
294
|
+
state.planAutoExpand = true;
|
|
295
|
+
state.overlay = "plan";
|
|
296
|
+
expect(state.overlay).toBe("plan");
|
|
297
|
+
expect(state.planAutoExpand).toBe(true);
|
|
298
|
+
});
|
|
299
|
+
it("/plans command does NOT set autoExpand", () => {
|
|
300
|
+
const state = createAppState({ planAutoExpand: true });
|
|
301
|
+
// Simulates /plans handler
|
|
302
|
+
state.planAutoExpand = false;
|
|
303
|
+
state.overlay = "plan";
|
|
304
|
+
expect(state.overlay).toBe("plan");
|
|
305
|
+
expect(state.planAutoExpand).toBe(false);
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
// ── Index clamping ──────────────────────────────────────────
|
|
309
|
+
describe("selectedIndex clamping", () => {
|
|
310
|
+
it("returns 0 when plans list is empty", () => {
|
|
311
|
+
expect(clampIndex(5, 0)).toBe(0);
|
|
312
|
+
});
|
|
313
|
+
it("returns last index when selectedIndex exceeds plans length", () => {
|
|
314
|
+
expect(clampIndex(10, 3)).toBe(2);
|
|
315
|
+
});
|
|
316
|
+
it("returns selectedIndex unchanged when within bounds", () => {
|
|
317
|
+
expect(clampIndex(1, 5)).toBe(1);
|
|
318
|
+
});
|
|
319
|
+
it("handles edge case: selectedIndex equals plans length", () => {
|
|
320
|
+
expect(clampIndex(3, 3)).toBe(2);
|
|
321
|
+
});
|
|
322
|
+
it("handles single plan", () => {
|
|
323
|
+
expect(clampIndex(0, 1)).toBe(0);
|
|
324
|
+
expect(clampIndex(5, 1)).toBe(0);
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
//# sourceMappingURL=plan-overlay.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-overlay.test.js","sourceRoot":"","sources":["../../src/ui/plan-overlay.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prestyj/cli",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.56",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "CLI coding agent with OAuth authentication for Anthropic and OpenAI",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
9
|
"url": "git+https://github.com/Gahroot/ezcoder.git",
|
|
10
|
-
"directory": "packages/
|
|
10
|
+
"directory": "packages/cli"
|
|
11
11
|
},
|
|
12
12
|
"bin": {
|
|
13
13
|
"ezcoder": "./dist/cli.js"
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"dist"
|
|
23
23
|
],
|
|
24
24
|
"dependencies": {
|
|
25
|
+
"@huggingface/transformers": "^3.6.0",
|
|
25
26
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
26
27
|
"chalk": "^5.6.2",
|
|
27
28
|
"cli-highlight": "^2.1.11",
|
|
@@ -30,14 +31,15 @@
|
|
|
30
31
|
"ignore": "^7.0.5",
|
|
31
32
|
"ink": "^6.8.0",
|
|
32
33
|
"marked": "^15.0.12",
|
|
34
|
+
"ogg-opus-decoder": "^1.6.13",
|
|
33
35
|
"marked-terminal": "^7.3.0",
|
|
34
36
|
"react": "^19.2.4",
|
|
35
37
|
"sharp": "^0.34.5",
|
|
36
38
|
"string-width": "^8.2.0",
|
|
37
39
|
"wrap-ansi": "^10.0.0",
|
|
38
40
|
"zod": "^4.3.6",
|
|
39
|
-
"@prestyj/agent": "4.2.
|
|
40
|
-
"@prestyj/ai": "4.2.
|
|
41
|
+
"@prestyj/agent": "4.2.56",
|
|
42
|
+
"@prestyj/ai": "4.2.56"
|
|
41
43
|
},
|
|
42
44
|
"devDependencies": {
|
|
43
45
|
"@types/node": "^25.5.0",
|