@akiojin/gwt 2.11.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/claude.d.ts +4 -1
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +51 -7
- package/dist/claude.js.map +1 -1
- package/dist/cli/ui/components/App.d.ts +7 -0
- package/dist/cli/ui/components/App.d.ts.map +1 -1
- package/dist/cli/ui/components/App.js +307 -18
- package/dist/cli/ui/components/App.js.map +1 -1
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts +21 -0
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +1 -0
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +145 -0
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +1 -0
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +2 -1
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +4 -2
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +1 -1
- package/dist/cli/ui/components/screens/ModelSelectorScreen.js +1 -1
- package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +10 -2
- package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/SessionSelectorScreen.js +18 -7
- package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +1 -1
- package/dist/cli/ui/types.d.ts +1 -1
- package/dist/cli/ui/types.d.ts.map +1 -1
- package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -1
- package/dist/cli/ui/utils/branchFormatter.js +0 -13
- package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
- package/dist/cli/ui/utils/continueSession.d.ts +18 -0
- package/dist/cli/ui/utils/continueSession.d.ts.map +1 -0
- package/dist/cli/ui/utils/continueSession.js +67 -0
- package/dist/cli/ui/utils/continueSession.js.map +1 -0
- package/dist/codex.d.ts +4 -1
- package/dist/codex.d.ts.map +1 -1
- package/dist/codex.js +70 -5
- package/dist/codex.js.map +1 -1
- package/dist/config/index.d.ts +9 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +11 -2
- package/dist/config/index.js.map +1 -1
- package/dist/gemini.d.ts +4 -1
- package/dist/gemini.d.ts.map +1 -1
- package/dist/gemini.js +146 -32
- package/dist/gemini.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +118 -8
- package/dist/index.js.map +1 -1
- package/dist/qwen.d.ts +4 -1
- package/dist/qwen.d.ts.map +1 -1
- package/dist/qwen.js +45 -4
- package/dist/qwen.js.map +1 -1
- package/dist/utils/session.d.ts +82 -0
- package/dist/utils/session.d.ts.map +1 -0
- package/dist/utils/session.js +579 -0
- package/dist/utils/session.js.map +1 -0
- package/package.json +1 -1
- package/src/claude.ts +69 -8
- package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +12 -2
- package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +2 -2
- package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +142 -0
- package/src/cli/ui/__tests__/components/screens/ExecutionModeSelectorScreen.test.tsx +14 -0
- package/src/cli/ui/__tests__/components/screens/SessionSelectorScreen.test.tsx +29 -10
- package/src/cli/ui/__tests__/integration/edgeCases.test.tsx +4 -1
- package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +0 -1
- package/src/cli/ui/components/App.tsx +403 -23
- package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +237 -0
- package/src/cli/ui/components/screens/ExecutionModeSelectorScreen.tsx +5 -1
- package/src/cli/ui/components/screens/ModelSelectorScreen.tsx +1 -1
- package/src/cli/ui/components/screens/SessionSelectorScreen.tsx +34 -6
- package/src/cli/ui/types.ts +1 -0
- package/src/cli/ui/utils/branchFormatter.ts +0 -13
- package/src/cli/ui/utils/continueSession.ts +106 -0
- package/src/codex.ts +91 -6
- package/src/config/index.ts +22 -2
- package/src/gemini.ts +179 -41
- package/src/index.ts +144 -16
- package/src/qwen.ts +56 -5
- package/src/utils/session.ts +704 -0
package/src/qwen.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { execa } from "execa";
|
|
|
2
2
|
import chalk from "chalk";
|
|
3
3
|
import { existsSync } from "fs";
|
|
4
4
|
import { createChildStdio, getTerminalStreams } from "./utils/terminal.js";
|
|
5
|
+
import { findLatestQwenSessionId } from "./utils/session.js";
|
|
5
6
|
|
|
6
7
|
const QWEN_CLI_PACKAGE = "@qwen-code/qwen-code@latest";
|
|
7
8
|
|
|
@@ -23,8 +24,9 @@ export async function launchQwenCLI(
|
|
|
23
24
|
extraArgs?: string[];
|
|
24
25
|
envOverrides?: Record<string, string>;
|
|
25
26
|
model?: string;
|
|
27
|
+
sessionId?: string | null;
|
|
26
28
|
} = {},
|
|
27
|
-
): Promise<
|
|
29
|
+
): Promise<{ sessionId?: string | null }> {
|
|
28
30
|
const terminal = getTerminalStreams();
|
|
29
31
|
|
|
30
32
|
try {
|
|
@@ -46,18 +48,26 @@ export async function launchQwenCLI(
|
|
|
46
48
|
// Handle execution mode
|
|
47
49
|
// Note: Qwen CLI doesn't have explicit continue/resume CLI options at startup.
|
|
48
50
|
// Session management is done via /chat commands during interactive sessions.
|
|
51
|
+
const resumeSessionId =
|
|
52
|
+
options.sessionId && options.sessionId.trim().length > 0
|
|
53
|
+
? options.sessionId.trim()
|
|
54
|
+
: null;
|
|
49
55
|
switch (options.mode) {
|
|
50
56
|
case "continue":
|
|
51
57
|
console.log(
|
|
52
58
|
chalk.cyan(
|
|
53
|
-
|
|
59
|
+
resumeSessionId
|
|
60
|
+
? ` ⏭️ Starting session (then /chat resume ${resumeSessionId})`
|
|
61
|
+
: " ⏭️ Starting session (use /chat resume in the CLI to continue)",
|
|
54
62
|
),
|
|
55
63
|
);
|
|
56
64
|
break;
|
|
57
65
|
case "resume":
|
|
58
66
|
console.log(
|
|
59
67
|
chalk.cyan(
|
|
60
|
-
|
|
68
|
+
resumeSessionId
|
|
69
|
+
? ` 🔄 Starting session (then /chat resume ${resumeSessionId})`
|
|
70
|
+
: " 🔄 Starting session (use /chat resume in the CLI to continue)",
|
|
61
71
|
),
|
|
62
72
|
);
|
|
63
73
|
break;
|
|
@@ -80,6 +90,8 @@ export async function launchQwenCLI(
|
|
|
80
90
|
args.push(...options.extraArgs);
|
|
81
91
|
}
|
|
82
92
|
|
|
93
|
+
console.log(chalk.gray(` 📋 Args: ${args.join(" ")}`));
|
|
94
|
+
|
|
83
95
|
terminal.exitRawMode();
|
|
84
96
|
|
|
85
97
|
const baseEnv = {
|
|
@@ -93,10 +105,22 @@ export async function launchQwenCLI(
|
|
|
93
105
|
const hasLocalQwen = await isQwenCommandAvailable();
|
|
94
106
|
|
|
95
107
|
try {
|
|
108
|
+
const execChild = async (child: any) => {
|
|
109
|
+
try {
|
|
110
|
+
await child;
|
|
111
|
+
} catch (execError: any) {
|
|
112
|
+
// Treat SIGINT/SIGTERM as normal exit (user pressed Ctrl+C)
|
|
113
|
+
if (execError.signal === "SIGINT" || execError.signal === "SIGTERM") {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
throw execError;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
96
120
|
if (hasLocalQwen) {
|
|
97
121
|
// Use locally installed qwen command
|
|
98
122
|
console.log(chalk.green(" ✨ Using locally installed qwen command"));
|
|
99
|
-
|
|
123
|
+
const child = execa("qwen", args, {
|
|
100
124
|
cwd: worktreePath,
|
|
101
125
|
shell: true,
|
|
102
126
|
stdin: childStdio.stdin,
|
|
@@ -104,6 +128,7 @@ export async function launchQwenCLI(
|
|
|
104
128
|
stderr: childStdio.stderr,
|
|
105
129
|
env: baseEnv,
|
|
106
130
|
} as any);
|
|
131
|
+
await execChild(child);
|
|
107
132
|
} else {
|
|
108
133
|
// Fallback to bunx
|
|
109
134
|
console.log(
|
|
@@ -118,7 +143,7 @@ export async function launchQwenCLI(
|
|
|
118
143
|
console.log("");
|
|
119
144
|
// Wait 2 seconds to let user read the message
|
|
120
145
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
121
|
-
|
|
146
|
+
const child = execa("bunx", [QWEN_CLI_PACKAGE, ...args], {
|
|
122
147
|
cwd: worktreePath,
|
|
123
148
|
shell: true,
|
|
124
149
|
stdin: childStdio.stdin,
|
|
@@ -126,10 +151,36 @@ export async function launchQwenCLI(
|
|
|
126
151
|
stderr: childStdio.stderr,
|
|
127
152
|
env: baseEnv,
|
|
128
153
|
} as any);
|
|
154
|
+
await execChild(child);
|
|
129
155
|
}
|
|
130
156
|
} finally {
|
|
131
157
|
childStdio.cleanup();
|
|
132
158
|
}
|
|
159
|
+
|
|
160
|
+
let capturedSessionId: string | null = null;
|
|
161
|
+
try {
|
|
162
|
+
capturedSessionId =
|
|
163
|
+
(await findLatestQwenSessionId(worktreePath)) ??
|
|
164
|
+
resumeSessionId ??
|
|
165
|
+
null;
|
|
166
|
+
} catch {
|
|
167
|
+
capturedSessionId = resumeSessionId ?? null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (capturedSessionId) {
|
|
171
|
+
console.log(chalk.cyan(`\n 🆔 Session tag: ${capturedSessionId}`));
|
|
172
|
+
console.log(
|
|
173
|
+
chalk.gray(` Resume in Qwen CLI: /chat resume ${capturedSessionId}`),
|
|
174
|
+
);
|
|
175
|
+
} else {
|
|
176
|
+
console.log(
|
|
177
|
+
chalk.yellow(
|
|
178
|
+
"\n ℹ️ Could not determine Qwen session tag automatically.",
|
|
179
|
+
),
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return capturedSessionId ? { sessionId: capturedSessionId } : {};
|
|
133
184
|
} catch (error: any) {
|
|
134
185
|
const hasLocalQwen = await isQwenCommandAvailable();
|
|
135
186
|
let errorMessage: string;
|