@akiojin/gwt 4.0.0 → 4.0.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.
- package/README.ja.md +0 -1
- package/README.md +0 -1
- package/dist/claude.d.ts +21 -0
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +73 -30
- package/dist/claude.js.map +1 -1
- package/dist/cli/ui/components/common/Select.d.ts +6 -0
- package/dist/cli/ui/components/common/Select.d.ts.map +1 -1
- package/dist/cli/ui/components/common/Select.js +3 -2
- package/dist/cli/ui/components/common/Select.js.map +1 -1
- package/dist/cli/ui/components/screens/AIToolSelectorScreen.d.ts +6 -0
- package/dist/cli/ui/components/screens/AIToolSelectorScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/AIToolSelectorScreen.js +3 -2
- package/dist/cli/ui/components/screens/AIToolSelectorScreen.js.map +1 -1
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +3 -0
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +3 -2
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +1 -1
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +3 -0
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +3 -2
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +1 -1
- package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +3 -0
- package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/BranchCreatorScreen.js +3 -2
- package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +1 -1
- package/dist/cli/ui/components/screens/BranchListScreen.d.ts +3 -0
- package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/BranchListScreen.js +3 -4
- package/dist/cli/ui/components/screens/BranchListScreen.js.map +1 -1
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts +10 -1
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +7 -22
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +1 -1
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts +3 -0
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js +3 -2
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js.map +1 -1
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +15 -0
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +3 -2
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +1 -1
- package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts +6 -0
- package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/ModelSelectorScreen.js +3 -2
- package/dist/cli/ui/components/screens/ModelSelectorScreen.js.map +1 -1
- package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +6 -0
- package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/PRCleanupScreen.js +3 -2
- package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +1 -1
- package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +6 -0
- package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/SessionSelectorScreen.js +3 -2
- package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +1 -1
- package/dist/cli/ui/hooks/useAppInput.d.ts +20 -0
- package/dist/cli/ui/hooks/useAppInput.d.ts.map +1 -0
- package/dist/cli/ui/hooks/useAppInput.js +137 -0
- package/dist/cli/ui/hooks/useAppInput.js.map +1 -0
- package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +3 -0
- package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +1 -1
- package/dist/cli/ui/screens/BranchActionSelectorScreen.js +3 -2
- package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +1 -1
- package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -1
- package/dist/cli/ui/utils/branchFormatter.js +0 -2
- package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
- package/dist/client/assets/{index-f5D2XwDh.js → index-v8smkNOL.js} +16 -16
- package/dist/client/index.html +1 -1
- package/dist/codex.d.ts +32 -0
- package/dist/codex.d.ts.map +1 -1
- package/dist/codex.js +32 -1
- package/dist/codex.js.map +1 -1
- package/dist/config/builtin-tools.d.ts +1 -7
- package/dist/config/builtin-tools.d.ts.map +1 -1
- package/dist/config/builtin-tools.js +1 -20
- package/dist/config/builtin-tools.js.map +1 -1
- package/dist/config/tools.d.ts.map +1 -1
- package/dist/config/tools.js +1 -4
- package/dist/config/tools.js.map +1 -1
- package/dist/gemini.d.ts +17 -0
- package/dist/gemini.d.ts.map +1 -1
- package/dist/gemini.js +21 -21
- package/dist/gemini.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -5
- package/dist/index.js.map +1 -1
- package/dist/utils/command.d.ts +10 -0
- package/dist/utils/command.d.ts.map +1 -0
- package/dist/utils/command.js +25 -0
- package/dist/utils/command.js.map +1 -0
- package/dist/utils/session/index.d.ts +0 -2
- package/dist/utils/session/index.d.ts.map +1 -1
- package/dist/utils/session/index.js +0 -3
- package/dist/utils/session/index.js.map +1 -1
- package/dist/utils/session/parsers/index.d.ts +0 -1
- package/dist/utils/session/parsers/index.d.ts.map +1 -1
- package/dist/utils/session/parsers/index.js +0 -2
- package/dist/utils/session/parsers/index.js.map +1 -1
- package/dist/utils/session.d.ts +0 -1
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +0 -1
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/terminal.d.ts +34 -0
- package/dist/utils/terminal.d.ts.map +1 -1
- package/dist/utils/terminal.js +51 -4
- package/dist/utils/terminal.js.map +1 -1
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -1
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +0 -2
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -1
- package/package.json +1 -1
- package/src/claude.ts +92 -34
- package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +3 -1
- package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +8 -5
- package/src/cli/ui/components/common/Select.tsx +9 -2
- package/src/cli/ui/components/screens/AIToolSelectorScreen.tsx +9 -2
- package/src/cli/ui/components/screens/BatchMergeProgressScreen.tsx +6 -2
- package/src/cli/ui/components/screens/BatchMergeResultScreen.tsx +6 -2
- package/src/cli/ui/components/screens/BranchCreatorScreen.tsx +6 -2
- package/src/cli/ui/components/screens/BranchListScreen.tsx +6 -4
- package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +17 -26
- package/src/cli/ui/components/screens/EnvironmentProfileScreen.tsx +6 -2
- package/src/cli/ui/components/screens/ExecutionModeSelectorScreen.tsx +18 -2
- package/src/cli/ui/components/screens/ModelSelectorScreen.tsx +9 -2
- package/src/cli/ui/components/screens/PRCleanupScreen.tsx +9 -2
- package/src/cli/ui/components/screens/SessionSelectorScreen.tsx +9 -2
- package/src/cli/ui/hooks/useAppInput.ts +171 -0
- package/src/cli/ui/screens/BranchActionSelectorScreen.tsx +6 -2
- package/src/cli/ui/screens/__tests__/BranchActionSelectorScreen.test.tsx +68 -1
- package/src/cli/ui/utils/branchFormatter.ts +0 -1
- package/src/cli/ui/utils/modelOptions.test.ts +1 -1
- package/src/codex.ts +40 -1
- package/src/config/builtin-tools.ts +1 -21
- package/src/config/tools.ts +1 -5
- package/src/gemini.ts +25 -21
- package/src/index.ts +0 -6
- package/src/utils/command.ts +26 -0
- package/src/utils/session/index.ts +0 -4
- package/src/utils/session/parsers/index.ts +0 -3
- package/src/utils/session.ts +0 -1
- package/src/utils/terminal.ts +65 -4
- package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +0 -1
- package/dist/qwen.d.ts +0 -16
- package/dist/qwen.d.ts.map +0 -1
- package/dist/qwen.js +0 -202
- package/dist/qwen.js.map +0 -1
- package/dist/utils/session/parsers/qwen.d.ts +0 -21
- package/dist/utils/session/parsers/qwen.d.ts.map +0 -1
- package/dist/utils/session/parsers/qwen.js +0 -36
- package/dist/utils/session/parsers/qwen.js.map +0 -1
- package/src/qwen.ts +0 -273
- package/src/utils/session/parsers/qwen.ts +0 -54
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { execa } from "execa";
|
|
2
|
+
/**
|
|
3
|
+
* Checks whether a command is available in the current PATH.
|
|
4
|
+
*
|
|
5
|
+
* Uses `where` on Windows and `which` on other platforms.
|
|
6
|
+
*
|
|
7
|
+
* @param commandName - Command name to look up (e.g. `claude`, `npx`, `gemini`)
|
|
8
|
+
* @returns true if the command exists in PATH
|
|
9
|
+
*/
|
|
10
|
+
export async function isCommandAvailable(commandName) {
|
|
11
|
+
try {
|
|
12
|
+
const command = process.platform === "win32" ? "where" : "which";
|
|
13
|
+
await execa(command, [commandName], {
|
|
14
|
+
shell: true,
|
|
15
|
+
stdin: "ignore",
|
|
16
|
+
stdout: "ignore",
|
|
17
|
+
stderr: "ignore",
|
|
18
|
+
});
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/utils/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACjE,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE;YAClC,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -5,12 +5,10 @@
|
|
|
5
5
|
* - Claude Code
|
|
6
6
|
* - Codex CLI
|
|
7
7
|
* - Gemini CLI
|
|
8
|
-
* - Qwen CLI
|
|
9
8
|
*/
|
|
10
9
|
export type { SessionSearchOptions, SessionInfo, ClaudeSessionInfo, CodexSessionInfo, GeminiSessionInfo, } from "./types.js";
|
|
11
10
|
export { isValidUuidSessionId } from "./common.js";
|
|
12
11
|
export { encodeClaudeProjectPath, findLatestClaudeSession, findLatestClaudeSessionId, waitForClaudeSessionId, claudeSessionFileExists, } from "./parsers/claude.js";
|
|
13
12
|
export { findLatestCodexSession, findLatestCodexSessionId, waitForCodexSessionId, } from "./parsers/codex.js";
|
|
14
13
|
export { findLatestGeminiSession, findLatestGeminiSessionId, } from "./parsers/gemini.js";
|
|
15
|
-
export { findLatestQwenSessionId } from "./parsers/qwen.js";
|
|
16
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/session/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/session/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,YAAY,EACV,oBAAoB,EACpB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC"}
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* - Claude Code
|
|
6
6
|
* - Codex CLI
|
|
7
7
|
* - Gemini CLI
|
|
8
|
-
* - Qwen CLI
|
|
9
8
|
*/
|
|
10
9
|
// Common utilities
|
|
11
10
|
export { isValidUuidSessionId } from "./common.js";
|
|
@@ -15,6 +14,4 @@ export { encodeClaudeProjectPath, findLatestClaudeSession, findLatestClaudeSessi
|
|
|
15
14
|
export { findLatestCodexSession, findLatestCodexSessionId, waitForCodexSessionId, } from "./parsers/codex.js";
|
|
16
15
|
// Gemini CLI parser
|
|
17
16
|
export { findLatestGeminiSession, findLatestGeminiSessionId, } from "./parsers/gemini.js";
|
|
18
|
-
// Qwen CLI parser
|
|
19
|
-
export { findLatestQwenSessionId } from "./parsers/qwen.js";
|
|
20
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/session/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/session/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,mBAAmB;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,qBAAqB;AACrB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,mBAAmB;AACnB,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,oBAAoB;AACpB,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC"}
|
|
@@ -4,5 +4,4 @@
|
|
|
4
4
|
export { encodeClaudeProjectPath, findLatestClaudeSession, findLatestClaudeSessionId, waitForClaudeSessionId, claudeSessionFileExists, } from "./claude.js";
|
|
5
5
|
export { findLatestCodexSession, findLatestCodexSessionId, waitForCodexSessionId, } from "./codex.js";
|
|
6
6
|
export { findLatestGeminiSession, findLatestGeminiSessionId, } from "./gemini.js";
|
|
7
|
-
export { findLatestQwenSessionId } from "./qwen.js";
|
|
8
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/session/parsers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/session/parsers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC"}
|
|
@@ -7,6 +7,4 @@ export { encodeClaudeProjectPath, findLatestClaudeSession, findLatestClaudeSessi
|
|
|
7
7
|
export { findLatestCodexSession, findLatestCodexSessionId, waitForCodexSessionId, } from "./codex.js";
|
|
8
8
|
// Gemini CLI
|
|
9
9
|
export { findLatestGeminiSession, findLatestGeminiSessionId, } from "./gemini.js";
|
|
10
|
-
// Qwen CLI
|
|
11
|
-
export { findLatestQwenSessionId } from "./qwen.js";
|
|
12
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/session/parsers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc;AACd,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,YAAY;AACZ,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,aAAa;AACb,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/session/parsers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc;AACd,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,YAAY;AACZ,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,aAAa;AACb,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC"}
|
package/dist/utils/session.d.ts
CHANGED
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
* - ./session/parsers/claude.js - Claude-specific functions
|
|
12
12
|
* - ./session/parsers/codex.js - Codex-specific functions
|
|
13
13
|
* - ./session/parsers/gemini.js - Gemini-specific functions
|
|
14
|
-
* - ./session/parsers/qwen.js - Qwen-specific functions
|
|
15
14
|
*/
|
|
16
15
|
export * from "./session/index.js";
|
|
17
16
|
//# sourceMappingURL=session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,cAAc,oBAAoB,CAAC"}
|
package/dist/utils/session.js
CHANGED
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
* - ./session/parsers/claude.js - Claude-specific functions
|
|
12
12
|
* - ./session/parsers/codex.js - Codex-specific functions
|
|
13
13
|
* - ./session/parsers/gemini.js - Gemini-specific functions
|
|
14
|
-
* - ./session/parsers/qwen.js - Qwen-specific functions
|
|
15
14
|
*/
|
|
16
15
|
export * from "./session/index.js";
|
|
17
16
|
//# sourceMappingURL=session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,cAAc,oBAAoB,CAAC"}
|
package/dist/utils/terminal.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal streams used by the CLI (stdin/stdout/stderr) and their raw-mode
|
|
3
|
+
* teardown helper.
|
|
4
|
+
*
|
|
5
|
+
* When the current process is not a TTY, this may fall back to `/dev/tty` so
|
|
6
|
+
* interactive child processes can still read/write correctly.
|
|
7
|
+
*/
|
|
1
8
|
export interface TerminalStreams {
|
|
2
9
|
stdin: NodeJS.ReadStream;
|
|
3
10
|
stdout: NodeJS.WriteStream;
|
|
@@ -8,6 +15,10 @@ export interface TerminalStreams {
|
|
|
8
15
|
usingFallback: boolean;
|
|
9
16
|
exitRawMode: () => void;
|
|
10
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Stdio configuration for launching an interactive child process (via `execa`),
|
|
20
|
+
* plus a cleanup hook to be called after the child exits.
|
|
21
|
+
*/
|
|
11
22
|
export interface ChildStdio {
|
|
12
23
|
stdin: "inherit" | {
|
|
13
24
|
file: string;
|
|
@@ -23,7 +34,30 @@ export interface ChildStdio {
|
|
|
23
34
|
};
|
|
24
35
|
cleanup: () => void;
|
|
25
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Returns cached terminal streams and falls back to `/dev/tty` when needed.
|
|
39
|
+
*/
|
|
26
40
|
export declare function getTerminalStreams(): TerminalStreams;
|
|
41
|
+
/**
|
|
42
|
+
* Best-effort terminal mode reset for interactive sessions.
|
|
43
|
+
*
|
|
44
|
+
* This writes a small ANSI sequence to restore cursor-key/keypad modes, which
|
|
45
|
+
* helps prevent broken arrow-key behavior on some Windows/WSL2 terminals after
|
|
46
|
+
* interactive CLIs exit.
|
|
47
|
+
*/
|
|
48
|
+
export declare function resetTerminalModes(stdout: NodeJS.WriteStream | undefined): void;
|
|
49
|
+
/**
|
|
50
|
+
* Creates stdio settings for launching a child process.
|
|
51
|
+
*
|
|
52
|
+
* When terminal streams are backed by `/dev/tty`, forwards those file
|
|
53
|
+
* descriptors to the child so it remains interactive.
|
|
54
|
+
*/
|
|
27
55
|
export declare function createChildStdio(): ChildStdio;
|
|
56
|
+
/**
|
|
57
|
+
* Prints a message and waits for the user to press Enter when running in an
|
|
58
|
+
* interactive terminal.
|
|
59
|
+
*
|
|
60
|
+
* Useful for pausing on errors while ensuring raw mode is disabled.
|
|
61
|
+
*/
|
|
28
62
|
export declare function waitForUserAcknowledgement(message?: string): Promise<void>;
|
|
29
63
|
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/utils/terminal.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/utils/terminal.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAWD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACtD,MAAM,EAAE,SAAS,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACvD,MAAM,EAAE,SAAS,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACvD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA+ID;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,GACrC,IAAI,CAYN;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAkB7C;AAMD;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,MAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAgDf"}
|
package/dist/utils/terminal.js
CHANGED
|
@@ -2,6 +2,11 @@ import fs from "node:fs";
|
|
|
2
2
|
import { platform } from "node:os";
|
|
3
3
|
import { ReadStream, WriteStream } from "node:tty";
|
|
4
4
|
const DEV_TTY_PATH = "/dev/tty";
|
|
5
|
+
// 端末モードのリセット:
|
|
6
|
+
// - ESC[?1l: application cursor keys (DECCKM) を無効化
|
|
7
|
+
// - ESC>: keypad mode を normal/numeric に戻す
|
|
8
|
+
// WSL2/Windowsの矢印キー入力が壊れるケースを抑止する。
|
|
9
|
+
const TERMINAL_RESET_SEQUENCE = "\u001b[?1l\u001b>";
|
|
5
10
|
let cachedStreams = null;
|
|
6
11
|
const DEFAULT_ACK_MESSAGE = "Review the error details, then press Enter to continue...";
|
|
7
12
|
function isProcessTTY() {
|
|
@@ -140,12 +145,42 @@ function createTerminalStreams() {
|
|
|
140
145
|
};
|
|
141
146
|
}
|
|
142
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Returns cached terminal streams and falls back to `/dev/tty` when needed.
|
|
150
|
+
*/
|
|
143
151
|
export function getTerminalStreams() {
|
|
144
152
|
if (!cachedStreams) {
|
|
145
153
|
cachedStreams = createTerminalStreams();
|
|
146
154
|
}
|
|
147
155
|
return cachedStreams;
|
|
148
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Best-effort terminal mode reset for interactive sessions.
|
|
159
|
+
*
|
|
160
|
+
* This writes a small ANSI sequence to restore cursor-key/keypad modes, which
|
|
161
|
+
* helps prevent broken arrow-key behavior on some Windows/WSL2 terminals after
|
|
162
|
+
* interactive CLIs exit.
|
|
163
|
+
*/
|
|
164
|
+
export function resetTerminalModes(stdout) {
|
|
165
|
+
if (!stdout || typeof stdout.write !== "function") {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (!("isTTY" in stdout) || !stdout.isTTY) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
stdout.write(TERMINAL_RESET_SEQUENCE);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// Ignore terminal reset errors.
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Creates stdio settings for launching a child process.
|
|
180
|
+
*
|
|
181
|
+
* When terminal streams are backed by `/dev/tty`, forwards those file
|
|
182
|
+
* descriptors to the child so it remains interactive.
|
|
183
|
+
*/
|
|
149
184
|
export function createChildStdio() {
|
|
150
185
|
const terminal = getTerminalStreams();
|
|
151
186
|
if (!terminal.usingFallback) {
|
|
@@ -166,6 +201,12 @@ export function createChildStdio() {
|
|
|
166
201
|
function isInteractive(stream) {
|
|
167
202
|
return Boolean(stream.isTTY);
|
|
168
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* Prints a message and waits for the user to press Enter when running in an
|
|
206
|
+
* interactive terminal.
|
|
207
|
+
*
|
|
208
|
+
* Useful for pausing on errors while ensuring raw mode is disabled.
|
|
209
|
+
*/
|
|
169
210
|
export async function waitForUserAcknowledgement(message = DEFAULT_ACK_MESSAGE) {
|
|
170
211
|
const terminal = getTerminalStreams();
|
|
171
212
|
const stdin = terminal.stdin;
|
|
@@ -178,19 +219,24 @@ export async function waitForUserAcknowledgement(message = DEFAULT_ACK_MESSAGE)
|
|
|
178
219
|
}
|
|
179
220
|
terminal.exitRawMode();
|
|
180
221
|
await new Promise((resolve) => {
|
|
181
|
-
|
|
222
|
+
let finished = false;
|
|
223
|
+
function cleanup() {
|
|
224
|
+
if (finished) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
finished = true;
|
|
182
228
|
stdin.removeListener("data", onData);
|
|
183
229
|
if (typeof stdin.pause === "function") {
|
|
184
230
|
stdin.pause();
|
|
185
231
|
}
|
|
186
|
-
}
|
|
187
|
-
|
|
232
|
+
}
|
|
233
|
+
function onData(chunk) {
|
|
188
234
|
const data = typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
189
235
|
if (data.includes("\n") || data.includes("\r")) {
|
|
190
236
|
cleanup();
|
|
191
237
|
resolve();
|
|
192
238
|
}
|
|
193
|
-
}
|
|
239
|
+
}
|
|
194
240
|
if (typeof stdout?.write === "function") {
|
|
195
241
|
stdout.write(`\n${message}\n`);
|
|
196
242
|
}
|
|
@@ -198,6 +244,7 @@ export async function waitForUserAcknowledgement(message = DEFAULT_ACK_MESSAGE)
|
|
|
198
244
|
stdin.resume();
|
|
199
245
|
}
|
|
200
246
|
stdin.on("data", onData);
|
|
247
|
+
process.once("exit", cleanup);
|
|
201
248
|
});
|
|
202
249
|
}
|
|
203
250
|
//# sourceMappingURL=terminal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/utils/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/utils/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BranchInfoCards.d.ts","sourceRoot":"","sources":["../../../../../../src/web/client/src/components/branch-detail/BranchInfoCards.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEzE,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,aAAa,GAAG,IAAI,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"BranchInfoCards.d.ts","sourceRoot":"","sources":["../../../../../../src/web/client/src/components/branch-detail/BranchInfoCards.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEzE,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,aAAa,GAAG,IAAI,CAAC;CACvC;AAoCD,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,mBAAmB,EACnB,eAAe,GAChB,EAAE,oBAAoB,qBAgItB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BranchInfoCards.js","sourceRoot":"","sources":["../../../../../../src/web/client/src/components/branch-detail/BranchInfoCards.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAS9C,SAAS,YAAY,CAAC,MAAc,EAAE,SAAyB;IAC7D,IAAI,MAAM,KAAK,aAAa;QAAE,OAAO,QAAQ,CAAC;IAC9C,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC;IAC3C,IAAI,MAAM,KAAK,YAAY;QAAE,OAAO,QAAQ,CAAC;IAC7C,IAAI,
|
|
1
|
+
{"version":3,"file":"BranchInfoCards.js","sourceRoot":"","sources":["../../../../../../src/web/client/src/components/branch-detail/BranchInfoCards.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/claude.ts
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
|
-
import { execa } from "execa";
|
|
1
|
+
import { execa, type Options as ExecaOptions } from "execa";
|
|
2
2
|
import chalk from "chalk";
|
|
3
3
|
import { existsSync } from "fs";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
createChildStdio,
|
|
6
|
+
getTerminalStreams,
|
|
7
|
+
resetTerminalModes,
|
|
8
|
+
} from "./utils/terminal.js";
|
|
9
|
+
import { isCommandAvailable } from "./utils/command.js";
|
|
5
10
|
import { findLatestClaudeSession } from "./utils/session.js";
|
|
6
11
|
|
|
7
12
|
const CLAUDE_CLI_PACKAGE = "@anthropic-ai/claude-code@latest";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Error wrapper used by `launchClaudeCode` to preserve the original failure
|
|
16
|
+
* while providing a user-friendly message.
|
|
17
|
+
*/
|
|
8
18
|
export class ClaudeError extends Error {
|
|
9
19
|
constructor(
|
|
10
20
|
message: string,
|
|
@@ -15,6 +25,20 @@ export class ClaudeError extends Error {
|
|
|
15
25
|
}
|
|
16
26
|
}
|
|
17
27
|
|
|
28
|
+
/**
|
|
29
|
+
* Launches Claude Code in the given worktree path.
|
|
30
|
+
*
|
|
31
|
+
* This function:
|
|
32
|
+
* - validates the worktree path
|
|
33
|
+
* - normalizes launch arguments (mode/model/session/extra args)
|
|
34
|
+
* - resets terminal modes before and after the child process
|
|
35
|
+
* - auto-detects a local `claude` command and falls back to `npx` (Windows) or
|
|
36
|
+
* `bunx` when needed
|
|
37
|
+
*
|
|
38
|
+
* @param worktreePath - Worktree directory to run Claude Code in
|
|
39
|
+
* @param options - Launch options (mode/session/model/permissions/env)
|
|
40
|
+
* @returns Captured session id when available
|
|
41
|
+
*/
|
|
18
42
|
export async function launchClaudeCode(
|
|
19
43
|
worktreePath: string,
|
|
20
44
|
options: {
|
|
@@ -175,6 +199,7 @@ export async function launchClaudeCode(
|
|
|
175
199
|
console.log(chalk.gray(` 📋 Args: ${args.join(" ")}`));
|
|
176
200
|
|
|
177
201
|
terminal.exitRawMode();
|
|
202
|
+
resetTerminalModes(terminal.stdout);
|
|
178
203
|
|
|
179
204
|
const baseEnv = { ...process.env, ...(options.envOverrides ?? {}) };
|
|
180
205
|
const launchEnvSource =
|
|
@@ -191,26 +216,58 @@ export async function launchClaudeCode(
|
|
|
191
216
|
|
|
192
217
|
// Auto-detect locally installed claude command
|
|
193
218
|
const hasLocalClaude = await isClaudeCommandAvailable();
|
|
219
|
+
const hasNpx =
|
|
220
|
+
process.platform === "win32" ? await isNpxCommandAvailable() : false;
|
|
221
|
+
|
|
222
|
+
const execInteractive = async (
|
|
223
|
+
file: string,
|
|
224
|
+
fileArgs: string[],
|
|
225
|
+
execOptions: Omit<ExecaOptions, "shell">,
|
|
226
|
+
) => {
|
|
227
|
+
if (process.platform !== "win32") {
|
|
228
|
+
await execa(file, fileArgs, { ...execOptions, shell: true });
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
try {
|
|
233
|
+
await execa(file, fileArgs, { ...execOptions, shell: false });
|
|
234
|
+
return;
|
|
235
|
+
} catch (error: unknown) {
|
|
236
|
+
const err = error as NodeJS.ErrnoException;
|
|
237
|
+
if (err?.code === "ENOENT" || err?.code === "EINVAL") {
|
|
238
|
+
await execa(file, fileArgs, { ...execOptions, shell: true });
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
throw error;
|
|
242
|
+
}
|
|
243
|
+
};
|
|
194
244
|
|
|
195
245
|
try {
|
|
196
246
|
if (hasLocalClaude) {
|
|
197
247
|
console.log(
|
|
198
248
|
chalk.green(" ✨ Using locally installed claude command"),
|
|
199
249
|
);
|
|
200
|
-
await
|
|
250
|
+
await execInteractive("claude", args, {
|
|
201
251
|
cwd: worktreePath,
|
|
202
|
-
shell: true,
|
|
203
252
|
stdin: childStdio.stdin,
|
|
204
253
|
stdout: childStdio.stdout,
|
|
205
254
|
stderr: childStdio.stderr,
|
|
206
255
|
env: launchEnv,
|
|
207
256
|
});
|
|
208
257
|
} else {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
258
|
+
if (hasNpx) {
|
|
259
|
+
console.log(
|
|
260
|
+
chalk.cyan(
|
|
261
|
+
" 🔄 Falling back to npx @anthropic-ai/claude-code@latest",
|
|
262
|
+
),
|
|
263
|
+
);
|
|
264
|
+
} else {
|
|
265
|
+
console.log(
|
|
266
|
+
chalk.cyan(
|
|
267
|
+
" 🔄 Falling back to bunx @anthropic-ai/claude-code@latest",
|
|
268
|
+
),
|
|
269
|
+
);
|
|
270
|
+
}
|
|
214
271
|
console.log(
|
|
215
272
|
chalk.yellow(
|
|
216
273
|
" 💡 Recommended: Install Claude Code via official method for faster startup",
|
|
@@ -231,14 +288,23 @@ export async function launchClaudeCode(
|
|
|
231
288
|
);
|
|
232
289
|
console.log("");
|
|
233
290
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
291
|
+
if (hasNpx) {
|
|
292
|
+
await execInteractive("npx", ["-y", CLAUDE_CLI_PACKAGE, ...args], {
|
|
293
|
+
cwd: worktreePath,
|
|
294
|
+
stdin: childStdio.stdin,
|
|
295
|
+
stdout: childStdio.stdout,
|
|
296
|
+
stderr: childStdio.stderr,
|
|
297
|
+
env: launchEnv,
|
|
298
|
+
});
|
|
299
|
+
} else {
|
|
300
|
+
await execInteractive("bunx", [CLAUDE_CLI_PACKAGE, ...args], {
|
|
301
|
+
cwd: worktreePath,
|
|
302
|
+
stdin: childStdio.stdin,
|
|
303
|
+
stdout: childStdio.stdout,
|
|
304
|
+
stderr: childStdio.stderr,
|
|
305
|
+
env: launchEnv,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
242
308
|
}
|
|
243
309
|
} finally {
|
|
244
310
|
childStdio.cleanup();
|
|
@@ -327,29 +393,21 @@ export async function launchClaudeCode(
|
|
|
327
393
|
throw new ClaudeError(errorMessage, error);
|
|
328
394
|
} finally {
|
|
329
395
|
terminal.exitRawMode();
|
|
396
|
+
resetTerminalModes(terminal.stdout);
|
|
330
397
|
}
|
|
331
398
|
}
|
|
332
399
|
|
|
333
|
-
/**
|
|
334
|
-
* Check if locally installed `claude` command is available
|
|
335
|
-
* @returns true if `claude` command exists in PATH, false otherwise
|
|
336
|
-
*/
|
|
337
400
|
async function isClaudeCommandAvailable(): Promise<boolean> {
|
|
338
|
-
|
|
339
|
-
const command = process.platform === "win32" ? "where" : "which";
|
|
340
|
-
await execa(command, ["claude"], {
|
|
341
|
-
shell: true,
|
|
342
|
-
stdin: "ignore",
|
|
343
|
-
stdout: "ignore",
|
|
344
|
-
stderr: "ignore",
|
|
345
|
-
});
|
|
346
|
-
return true;
|
|
347
|
-
} catch {
|
|
348
|
-
// claude command not found in PATH
|
|
349
|
-
return false;
|
|
350
|
-
}
|
|
401
|
+
return isCommandAvailable("claude");
|
|
351
402
|
}
|
|
352
403
|
|
|
404
|
+
async function isNpxCommandAvailable(): Promise<boolean> {
|
|
405
|
+
return isCommandAvailable("npx");
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Checks whether Claude Code is available via `bunx` in the current environment.
|
|
410
|
+
*/
|
|
353
411
|
export async function isClaudeCodeAvailable(): Promise<boolean> {
|
|
354
412
|
try {
|
|
355
413
|
await execa("bunx", [CLAUDE_CLI_PACKAGE, "--version"], { shell: true });
|
|
@@ -204,6 +204,8 @@ describe("App protected branch handling", () => {
|
|
|
204
204
|
});
|
|
205
205
|
|
|
206
206
|
expect(navigateToMock).toHaveBeenCalledWith("branch-action-selector");
|
|
207
|
-
|
|
207
|
+
// When branchQuickStart is empty, navigates to ai-tool-selector instead of branch-quick-start
|
|
208
|
+
// So AIToolSelectorScreen should be rendered, not BranchQuickStartScreen
|
|
209
|
+
expect(aiToolProps).not.toHaveLength(0);
|
|
208
210
|
});
|
|
209
211
|
});
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import React from "react";
|
|
5
5
|
import { describe, it, expect, beforeEach, vi } from "vitest";
|
|
6
|
-
import { render, waitFor
|
|
6
|
+
import { render, waitFor } from "@testing-library/react";
|
|
7
7
|
import { ModelSelectorScreen } from "../../components/screens/ModelSelectorScreen.js";
|
|
8
8
|
import type { ModelSelectionResult } from "../../components/screens/ModelSelectorScreen.js";
|
|
9
9
|
import { Window } from "happy-dom";
|
|
@@ -55,8 +55,9 @@ describe("ModelSelectorScreen initial selection", () => {
|
|
|
55
55
|
await waitFor(() => expect(selectMocks.length).toBeGreaterThan(0));
|
|
56
56
|
const modelSelect = selectMocks.at(-1);
|
|
57
57
|
const index = modelSelect.initialIndex as number;
|
|
58
|
-
// codex-cli models: [gpt-5.1-codex, gpt-5.2, gpt-5.1-codex-max, gpt-5.1-codex-mini, gpt-5.1]
|
|
59
|
-
|
|
58
|
+
// codex-cli models: ["", gpt-5.1-codex, gpt-5.2, gpt-5.1-codex-max, gpt-5.1-codex-mini, gpt-5.1]
|
|
59
|
+
// (index 0 = Default/Auto, index 3 = gpt-5.1-codex-max)
|
|
60
|
+
expect(index).toBe(3);
|
|
60
61
|
});
|
|
61
62
|
|
|
62
63
|
it("includes gpt-5.2 in model options and preserves ordering", async () => {
|
|
@@ -75,9 +76,11 @@ describe("ModelSelectorScreen initial selection", () => {
|
|
|
75
76
|
);
|
|
76
77
|
|
|
77
78
|
await waitFor(() => expect(selectMocks.length).toBeGreaterThan(1));
|
|
78
|
-
const modelSelect = selectMocks.at(-1)
|
|
79
|
-
|
|
79
|
+
const modelSelect = selectMocks.at(-1);
|
|
80
|
+
expect(modelSelect).toBeDefined();
|
|
81
|
+
const ids = modelSelect?.items.map((item) => item.value);
|
|
80
82
|
expect(ids).toEqual([
|
|
83
|
+
"", // Default (Auto)
|
|
81
84
|
"gpt-5.1-codex",
|
|
82
85
|
"gpt-5.2",
|
|
83
86
|
"gpt-5.1-codex-max",
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
import React, { useEffect, useState } from "react";
|
|
2
|
-
import { Box, Text,
|
|
2
|
+
import { Box, Text, useStdout } from "ink";
|
|
3
|
+
import { useAppInput } from "../../hooks/useAppInput.js";
|
|
3
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Item descriptor for the `Select` component.
|
|
7
|
+
*/
|
|
4
8
|
export interface SelectItem {
|
|
5
9
|
label: string;
|
|
6
10
|
value: string;
|
|
7
11
|
}
|
|
8
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Props for the `Select` component.
|
|
15
|
+
*/
|
|
9
16
|
export interface SelectProps<T extends SelectItem = SelectItem> {
|
|
10
17
|
items: T[];
|
|
11
18
|
onSelect: (item: T) => void;
|
|
@@ -133,7 +140,7 @@ const SelectComponent = <T extends SelectItem = SelectItem>({
|
|
|
133
140
|
}
|
|
134
141
|
}, [items, limit]);
|
|
135
142
|
|
|
136
|
-
|
|
143
|
+
useAppInput((input, key) => {
|
|
137
144
|
if (disabled) {
|
|
138
145
|
return;
|
|
139
146
|
}
|