@akiojin/gwt 4.1.1 → 4.3.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/README.md +28 -3
- package/dist/claude.d.ts +4 -0
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +13 -1
- package/dist/claude.js.map +1 -1
- package/dist/cli/ui/components/App.d.ts.map +1 -1
- package/dist/cli/ui/components/App.js +68 -68
- package/dist/cli/ui/components/App.js.map +1 -1
- package/dist/cli/ui/components/common/Select.d.ts +3 -1
- package/dist/cli/ui/components/common/Select.d.ts.map +1 -1
- package/dist/cli/ui/components/common/Select.js +13 -2
- package/dist/cli/ui/components/common/Select.js.map +1 -1
- package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/BranchListScreen.js +6 -1
- package/dist/cli/ui/components/screens/BranchListScreen.js.map +1 -1
- package/dist/client/assets/index-ChHC-Puh.css +1 -0
- package/dist/client/assets/index-PqK9jkug.js +78 -0
- package/dist/client/index.html +2 -2
- package/dist/config/builtin-tools.d.ts.map +1 -1
- package/dist/config/builtin-tools.js +3 -0
- package/dist/config/builtin-tools.js.map +1 -1
- package/dist/config/tools.d.ts.map +1 -1
- package/dist/config/tools.js +10 -1
- package/dist/config/tools.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -4
- package/dist/index.js.map +1 -1
- package/dist/launcher.d.ts.map +1 -1
- package/dist/launcher.js +15 -0
- package/dist/launcher.js.map +1 -1
- package/dist/services/aiToolResolver.d.ts.map +1 -1
- package/dist/services/aiToolResolver.js +55 -8
- package/dist/services/aiToolResolver.js.map +1 -1
- package/dist/services/customToolResolver.d.ts.map +1 -1
- package/dist/services/customToolResolver.js +22 -17
- package/dist/services/customToolResolver.js.map +1 -1
- package/dist/utils/prompt.d.ts +12 -0
- package/dist/utils/prompt.d.ts.map +1 -1
- package/dist/utils/prompt.js +60 -10
- package/dist/utils/prompt.js.map +1 -1
- package/dist/utils/webui.js +1 -1
- package/dist/web/client/src/components/BranchGraph.d.ts +5 -0
- package/dist/web/client/src/components/BranchGraph.d.ts.map +1 -1
- package/dist/web/client/src/components/BranchGraph.js +35 -108
- package/dist/web/client/src/components/BranchGraph.js.map +1 -1
- package/dist/web/client/src/components/graph/BranchDetailPanel.d.ts +15 -0
- package/dist/web/client/src/components/graph/BranchDetailPanel.d.ts.map +1 -0
- package/dist/web/client/src/components/graph/BranchDetailPanel.js +57 -0
- package/dist/web/client/src/components/graph/BranchDetailPanel.js.map +1 -0
- package/dist/web/client/src/components/graph/BranchNode.d.ts +13 -0
- package/dist/web/client/src/components/graph/BranchNode.d.ts.map +1 -0
- package/dist/web/client/src/components/graph/BranchNode.js +103 -0
- package/dist/web/client/src/components/graph/BranchNode.js.map +1 -0
- package/dist/web/client/src/components/graph/ClusterNode.d.ts +13 -0
- package/dist/web/client/src/components/graph/ClusterNode.d.ts.map +1 -0
- package/dist/web/client/src/components/graph/ClusterNode.js +109 -0
- package/dist/web/client/src/components/graph/ClusterNode.js.map +1 -0
- package/dist/web/client/src/components/graph/SynapticCanvas.d.ts +17 -0
- package/dist/web/client/src/components/graph/SynapticCanvas.d.ts.map +1 -0
- package/dist/web/client/src/components/graph/SynapticCanvas.js +94 -0
- package/dist/web/client/src/components/graph/SynapticCanvas.js.map +1 -0
- package/dist/web/client/src/components/graph/SynapticEdge.d.ts +13 -0
- package/dist/web/client/src/components/graph/SynapticEdge.d.ts.map +1 -0
- package/dist/web/client/src/components/graph/SynapticEdge.js +113 -0
- package/dist/web/client/src/components/graph/SynapticEdge.js.map +1 -0
- package/dist/web/client/src/components/graph/graphUtils.d.ts +67 -0
- package/dist/web/client/src/components/graph/graphUtils.d.ts.map +1 -0
- package/dist/web/client/src/components/graph/graphUtils.js +175 -0
- package/dist/web/client/src/components/graph/graphUtils.js.map +1 -0
- package/dist/web/client/src/components/graph/index.d.ts +10 -0
- package/dist/web/client/src/components/graph/index.d.ts.map +1 -0
- package/dist/web/client/src/components/graph/index.js +10 -0
- package/dist/web/client/src/components/graph/index.js.map +1 -0
- package/dist/web/client/src/lib/websocket.d.ts.map +1 -1
- package/dist/web/client/src/lib/websocket.js +2 -1
- package/dist/web/client/src/lib/websocket.js.map +1 -1
- package/dist/web/client/vite.config.js +1 -1
- package/dist/web/server/env/importer.d.ts.map +1 -1
- package/dist/web/server/env/importer.js +4 -0
- package/dist/web/server/env/importer.js.map +1 -1
- package/dist/web/server/index.d.ts.map +1 -1
- package/dist/web/server/index.js +9 -0
- package/dist/web/server/index.js.map +1 -1
- package/dist/web/server/pty/manager.d.ts.map +1 -1
- package/dist/web/server/pty/manager.js +24 -1
- package/dist/web/server/pty/manager.js.map +1 -1
- package/dist/web/server/routes/sessions.d.ts.map +1 -1
- package/dist/web/server/routes/sessions.js +7 -0
- package/dist/web/server/routes/sessions.js.map +1 -1
- package/dist/web/server/tray.d.ts +1 -1
- package/dist/web/server/tray.d.ts.map +1 -1
- package/dist/web/server/tray.js +52 -34
- package/dist/web/server/tray.js.map +1 -1
- package/dist/web/server/websocket/handler.d.ts.map +1 -1
- package/dist/web/server/websocket/handler.js +4 -0
- package/dist/web/server/websocket/handler.js.map +1 -1
- package/package.json +6 -3
- package/src/claude.ts +15 -1
- package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +2 -1
- package/src/cli/ui/__tests__/components/App.shortcuts.test.tsx +142 -8
- package/src/cli/ui/__tests__/components/App.test.tsx +4 -3
- package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +1 -0
- package/src/cli/ui/__tests__/components/common/Select.test.tsx +45 -0
- package/src/cli/ui/components/App.tsx +91 -81
- package/src/cli/ui/components/common/Select.tsx +14 -1
- package/src/cli/ui/components/screens/BranchListScreen.tsx +6 -1
- package/src/cli/ui/types.ts +1 -1
- package/src/config/builtin-tools.ts +3 -0
- package/src/config/tools.ts +24 -1
- package/src/index.ts +50 -3
- package/src/launcher.ts +26 -0
- package/src/services/aiToolResolver.ts +75 -9
- package/src/services/customToolResolver.ts +32 -17
- package/src/utils/__tests__/prompt.test.ts +72 -35
- package/src/utils/prompt.ts +79 -10
- package/src/utils/webui.ts +1 -1
- package/src/web/client/src/components/BranchGraph.tsx +51 -208
- package/src/web/client/src/components/graph/BranchDetailPanel.tsx +152 -0
- package/src/web/client/src/components/graph/BranchNode.tsx +200 -0
- package/src/web/client/src/components/graph/ClusterNode.tsx +211 -0
- package/src/web/client/src/components/graph/SynapticCanvas.tsx +171 -0
- package/src/web/client/src/components/graph/SynapticEdge.tsx +311 -0
- package/src/web/client/src/components/graph/graphUtils.ts +265 -0
- package/src/web/client/src/components/graph/index.ts +10 -0
- package/src/web/client/src/index.css +314 -29
- package/src/web/client/src/lib/websocket.ts +2 -1
- package/src/web/client/vite.config.ts +1 -1
- package/src/web/server/env/importer.ts +5 -0
- package/src/web/server/index.ts +10 -0
- package/src/web/server/pty/manager.ts +43 -1
- package/src/web/server/routes/sessions.ts +15 -0
- package/src/web/server/tray.ts +62 -46
- package/src/web/server/websocket/handler.ts +13 -0
- package/dist/client/assets/index-DsDNCy5f.css +0 -1
- package/dist/client/assets/index-v8smkNOL.js +0 -72
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { execa } from "execa";
|
|
2
|
+
import { createLogger } from "../logging/logger.js";
|
|
3
|
+
const logger = createLogger({ category: "custom-resolver" });
|
|
2
4
|
const WHICH_COMMAND = process.platform === "win32" ? "where" : "which";
|
|
3
5
|
export async function resolveCommandPath(commandName) {
|
|
4
6
|
try {
|
|
@@ -8,6 +10,7 @@ export async function resolveCommandPath(commandName) {
|
|
|
8
10
|
throw new Error(`Command "${commandName}" not found in PATH.\n` +
|
|
9
11
|
"Please ensure it is installed and available in your PATH.");
|
|
10
12
|
}
|
|
13
|
+
logger.debug({ commandName, resolvedPath }, "Command path resolved");
|
|
11
14
|
return resolvedPath;
|
|
12
15
|
}
|
|
13
16
|
catch (error) {
|
|
@@ -32,40 +35,42 @@ export function buildCustomToolArgs(tool, options = {}) {
|
|
|
32
35
|
if (options.extraArgs?.length) {
|
|
33
36
|
args.push(...options.extraArgs);
|
|
34
37
|
}
|
|
38
|
+
logger.debug({ toolId: tool.id, argsCount: args.length }, "Custom tool args built");
|
|
35
39
|
return args;
|
|
36
40
|
}
|
|
37
41
|
export async function prepareCustomToolExecution(tool, options = {}) {
|
|
38
|
-
const
|
|
42
|
+
const baseArgs = buildCustomToolArgs(tool, options);
|
|
39
43
|
const envOverrides = tool.env
|
|
40
44
|
? { ...tool.env }
|
|
41
45
|
: undefined;
|
|
46
|
+
let command;
|
|
47
|
+
let args;
|
|
42
48
|
switch (tool.type) {
|
|
43
49
|
case "path": {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
...(envOverrides ? { env: envOverrides } : {}),
|
|
48
|
-
};
|
|
50
|
+
command = tool.command;
|
|
51
|
+
args = baseArgs;
|
|
52
|
+
break;
|
|
49
53
|
}
|
|
50
54
|
case "bunx": {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
...(envOverrides ? { env: envOverrides } : {}),
|
|
55
|
-
};
|
|
55
|
+
command = "bunx";
|
|
56
|
+
args = [tool.command, ...baseArgs];
|
|
57
|
+
break;
|
|
56
58
|
}
|
|
57
59
|
case "command": {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
args,
|
|
62
|
-
...(envOverrides ? { env: envOverrides } : {}),
|
|
63
|
-
};
|
|
60
|
+
command = await resolveCommandPath(tool.command);
|
|
61
|
+
args = baseArgs;
|
|
62
|
+
break;
|
|
64
63
|
}
|
|
65
64
|
default: {
|
|
66
65
|
const exhaustive = tool.type;
|
|
67
66
|
throw new Error(`Unknown custom tool type: ${exhaustive}`);
|
|
68
67
|
}
|
|
69
68
|
}
|
|
69
|
+
logger.debug({ toolId: tool.id, toolType: tool.type, command, hasEnv: !!envOverrides }, "Custom tool execution prepared");
|
|
70
|
+
return {
|
|
71
|
+
command,
|
|
72
|
+
args,
|
|
73
|
+
...(envOverrides ? { env: envOverrides } : {}),
|
|
74
|
+
};
|
|
70
75
|
}
|
|
71
76
|
//# sourceMappingURL=customToolResolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customToolResolver.js","sourceRoot":"","sources":["../../src/services/customToolResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"customToolResolver.js","sourceRoot":"","sources":["../../src/services/customToolResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAQ7D,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IAC1D,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAE1D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,YAAY,WAAW,wBAAwB;gBAC7C,2DAA2D,CAC9D,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACrE,OAAO,YAAY,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,KAAK,CACb,8BAA8B,WAAW,OAAO,MAAM,IAAI;YACxD,oEAAoE,CACvE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAkB,EAClB,UAAyB,EAAE;IAE3B,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,QAAQ,EAAE,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,KAAK,CACV,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,EAC3C,wBAAwB,CACzB,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAkB,EAClB,UAAyB,EAAE;IAE3B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,YAAY,GAAkC,IAAI,CAAC,GAAG;QAC1D,CAAC,CAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAwB;QACxC,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,OAAe,CAAC;IACpB,IAAI,IAAc,CAAC;IAEnB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,IAAI,GAAG,QAAQ,CAAC;YAChB,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,OAAO,GAAG,MAAM,CAAC;YACjB,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;YACnC,MAAM;QACR,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,GAAG,QAAQ,CAAC;YAChB,MAAM;QACR,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,UAAU,GAAU,IAAI,CAAC,IAAI,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAoB,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CACV,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,YAAY,EAAE,EACzE,gCAAgC,CACjC,CAAC;IAEF,OAAO;QACL,OAAO;QACP,IAAI;QACJ,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAC;AACJ,CAAC"}
|
package/dist/utils/prompt.d.ts
CHANGED
|
@@ -3,4 +3,16 @@
|
|
|
3
3
|
* Falls back to no-op on non-interactive stdin to avoid blocking pipelines.
|
|
4
4
|
*/
|
|
5
5
|
export declare function waitForEnter(promptMessage: string): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Prompts the user for a yes/no confirmation in the terminal.
|
|
8
|
+
* Falls back to the default value on non-interactive stdin or fallback terminals.
|
|
9
|
+
*
|
|
10
|
+
* @param promptMessage - The message to display to the user
|
|
11
|
+
* @param options - Configuration options
|
|
12
|
+
* @param options.defaultValue - The default value when input is empty or stdin is non-interactive
|
|
13
|
+
* @returns A promise that resolves to true for yes, false for no
|
|
14
|
+
*/
|
|
15
|
+
export declare function confirmYesNo(promptMessage: string, options?: {
|
|
16
|
+
defaultValue?: boolean;
|
|
17
|
+
}): Promise<boolean>;
|
|
6
18
|
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAgGA;;;GAGG;AACH,wBAAsB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvE;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,OAAO,CAAC,OAAO,CAAC,CA6BlB"}
|
package/dist/utils/prompt.js
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import readline from "node:readline";
|
|
2
2
|
import { getTerminalStreams } from "./terminal.js";
|
|
3
|
-
|
|
4
|
-
* Wait for Enter using the same terminal streams as Ink.
|
|
5
|
-
* Falls back to no-op on non-interactive stdin to avoid blocking pipelines.
|
|
6
|
-
*/
|
|
7
|
-
export async function waitForEnter(promptMessage) {
|
|
3
|
+
async function runReadlinePrompt(promptText, { fallback, onAnswer, shouldSkip }) {
|
|
8
4
|
const terminal = getTerminalStreams();
|
|
9
5
|
const stdin = terminal.stdin;
|
|
10
6
|
const stdout = terminal.stdout;
|
|
11
7
|
if (!stdin || typeof stdin.on !== "function" || !stdin.isTTY) {
|
|
12
|
-
return;
|
|
8
|
+
return fallback;
|
|
9
|
+
}
|
|
10
|
+
if (shouldSkip?.(terminal)) {
|
|
11
|
+
return fallback;
|
|
13
12
|
}
|
|
14
13
|
terminal.exitRawMode?.();
|
|
15
14
|
if (typeof stdin.resume === "function") {
|
|
@@ -23,9 +22,14 @@ export async function waitForEnter(promptMessage) {
|
|
|
23
22
|
// Ignore raw mode errors
|
|
24
23
|
}
|
|
25
24
|
}
|
|
26
|
-
|
|
25
|
+
return new Promise((resolve) => {
|
|
27
26
|
const rl = readline.createInterface({ input: stdin, output: stdout });
|
|
27
|
+
let finished = false;
|
|
28
28
|
const cleanup = () => {
|
|
29
|
+
if (finished) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
finished = true;
|
|
29
33
|
rl.removeAllListeners();
|
|
30
34
|
rl.close();
|
|
31
35
|
const remover = (method) => stdin[method]?.("end", onEnd);
|
|
@@ -40,18 +44,64 @@ export async function waitForEnter(promptMessage) {
|
|
|
40
44
|
};
|
|
41
45
|
const onEnd = () => {
|
|
42
46
|
cleanup();
|
|
43
|
-
resolve();
|
|
47
|
+
resolve(fallback);
|
|
44
48
|
};
|
|
45
49
|
rl.on("SIGINT", () => {
|
|
46
50
|
cleanup();
|
|
47
51
|
process.exit(0);
|
|
48
52
|
});
|
|
49
|
-
rl.question(`${
|
|
53
|
+
rl.question(`${promptText}\n`, (answer) => {
|
|
54
|
+
const result = onAnswer(answer);
|
|
50
55
|
cleanup();
|
|
51
|
-
resolve();
|
|
56
|
+
resolve(result !== undefined ? result : fallback);
|
|
52
57
|
});
|
|
53
58
|
stdin.once("end", onEnd);
|
|
54
59
|
stdin.once("error", onEnd);
|
|
55
60
|
});
|
|
56
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Wait for Enter using the same terminal streams as Ink.
|
|
64
|
+
* Falls back to no-op on non-interactive stdin to avoid blocking pipelines.
|
|
65
|
+
*/
|
|
66
|
+
export async function waitForEnter(promptMessage) {
|
|
67
|
+
await runReadlinePrompt(promptMessage, {
|
|
68
|
+
fallback: undefined,
|
|
69
|
+
onAnswer: () => undefined,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Prompts the user for a yes/no confirmation in the terminal.
|
|
74
|
+
* Falls back to the default value on non-interactive stdin or fallback terminals.
|
|
75
|
+
*
|
|
76
|
+
* @param promptMessage - The message to display to the user
|
|
77
|
+
* @param options - Configuration options
|
|
78
|
+
* @param options.defaultValue - The default value when input is empty or stdin is non-interactive
|
|
79
|
+
* @returns A promise that resolves to true for yes, false for no
|
|
80
|
+
*/
|
|
81
|
+
export async function confirmYesNo(promptMessage, options = {}) {
|
|
82
|
+
const fallback = options.defaultValue ?? false;
|
|
83
|
+
const suffix = options.defaultValue === undefined
|
|
84
|
+
? "[y/n]"
|
|
85
|
+
: options.defaultValue
|
|
86
|
+
? "[Y/n]"
|
|
87
|
+
: "[y/N]";
|
|
88
|
+
const promptText = `${promptMessage} ${suffix}`.trim();
|
|
89
|
+
return runReadlinePrompt(promptText, {
|
|
90
|
+
fallback,
|
|
91
|
+
shouldSkip: (terminal) => terminal.usingFallback,
|
|
92
|
+
onAnswer: (answer) => {
|
|
93
|
+
const normalized = answer.trim().toLowerCase();
|
|
94
|
+
if (normalized === "y" || normalized === "yes") {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
if (normalized === "n" || normalized === "no") {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
if (normalized.length === 0 && options.defaultValue !== undefined) {
|
|
101
|
+
return options.defaultValue;
|
|
102
|
+
}
|
|
103
|
+
return undefined;
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
}
|
|
57
107
|
//# sourceMappingURL=prompt.js.map
|
package/dist/utils/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/webui.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BranchGraph.d.ts","sourceRoot":"","sources":["../../../../../src/web/client/src/components/BranchGraph.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"BranchGraph.d.ts","sourceRoot":"","sources":["../../../../../src/web/client/src/components/BranchGraph.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAgC,MAAM,OAAO,CAAC;AAGrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGvD,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,gBAAgB,qBA8EzD"}
|
|
@@ -1,122 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* ブランチグラフ - シナプス風ビジュアライゼーション
|
|
3
|
+
*
|
|
4
|
+
* React Flow + D3-forceによるインタラクティブなブランチ関係図
|
|
5
|
+
*/
|
|
6
|
+
import React, { useState, useCallback } from "react";
|
|
3
7
|
import { Card, CardHeader, CardContent } from "@/components/ui/card";
|
|
4
8
|
import { Badge } from "@/components/ui/badge";
|
|
5
|
-
import {
|
|
6
|
-
const UNKNOWN_BASE = "__unknown__";
|
|
7
|
-
function formatBranchLabel(branch) {
|
|
8
|
-
return branch.name.length > 32
|
|
9
|
-
? `${branch.name.slice(0, 29)}...`
|
|
10
|
-
: branch.name;
|
|
11
|
-
}
|
|
12
|
-
function getDivergenceLabel(branch) {
|
|
13
|
-
if (!branch.divergence) {
|
|
14
|
-
return "divergence: n/a";
|
|
15
|
-
}
|
|
16
|
-
const { ahead, behind, upToDate } = branch.divergence;
|
|
17
|
-
if (upToDate) {
|
|
18
|
-
return "divergence: up-to-date";
|
|
19
|
-
}
|
|
20
|
-
return `divergence: +${ahead} / -${behind}`;
|
|
21
|
-
}
|
|
9
|
+
import { SynapticCanvas, BranchDetailPanel } from "./graph";
|
|
22
10
|
export function BranchGraph({ branches }) {
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
return baseSet;
|
|
34
|
-
}, [branches]);
|
|
35
|
-
const lanes = useMemo(() => {
|
|
36
|
-
const laneMap = new Map();
|
|
37
|
-
branches.forEach((branch) => {
|
|
38
|
-
const base = branch.baseBranch ?? UNKNOWN_BASE;
|
|
39
|
-
if (!branch.baseBranch && referencedBases.has(branch.name)) {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
if (!laneMap.has(base)) {
|
|
43
|
-
const baseNode = base !== UNKNOWN_BASE ? (branchMap.get(base) ?? null) : null;
|
|
44
|
-
laneMap.set(base, {
|
|
45
|
-
id: base,
|
|
46
|
-
baseLabel: base === UNKNOWN_BASE ? "ベース不明" : base,
|
|
47
|
-
baseNode,
|
|
48
|
-
nodes: [],
|
|
49
|
-
isSyntheticBase: baseNode === null,
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
laneMap.get(base)?.nodes.push(branch);
|
|
53
|
-
});
|
|
54
|
-
return Array.from(laneMap.values()).sort((a, b) => {
|
|
55
|
-
if (a.id === UNKNOWN_BASE)
|
|
56
|
-
return 1;
|
|
57
|
-
if (b.id === UNKNOWN_BASE)
|
|
58
|
-
return -1;
|
|
59
|
-
return a.baseLabel.localeCompare(b.baseLabel, "ja");
|
|
60
|
-
});
|
|
61
|
-
}, [branches, branchMap, referencedBases]);
|
|
62
|
-
if (!lanes.length) {
|
|
11
|
+
const [selectedBranch, setSelectedBranch] = useState(null);
|
|
12
|
+
const handleNodeClick = useCallback((branch) => {
|
|
13
|
+
setSelectedBranch(branch);
|
|
14
|
+
}, []);
|
|
15
|
+
const handlePanelClose = useCallback(() => {
|
|
16
|
+
setSelectedBranch(null);
|
|
17
|
+
}, []);
|
|
18
|
+
if (!branches.length) {
|
|
63
19
|
return (React.createElement(Card, { className: "border-dashed" },
|
|
64
20
|
React.createElement(CardContent, { className: "flex flex-col items-center justify-center py-12 text-center" },
|
|
65
21
|
React.createElement("p", { className: "text-muted-foreground" }, "\u30B0\u30E9\u30D5\u8868\u793A\u3067\u304D\u308B\u30D6\u30E9\u30F3\u30C1\u304C\u3042\u308A\u307E\u305B\u3093\u3002"),
|
|
66
22
|
React.createElement("p", { className: "text-sm text-muted-foreground" }, "fetch\u6E08\u307F\u306E\u30D6\u30E9\u30F3\u30C1\u3084Worktree\u3092\u8FFD\u52A0\u3059\u308B\u3068\u95A2\u4FC2\u56F3\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002"))));
|
|
67
23
|
}
|
|
68
|
-
return (React.createElement(Card,
|
|
24
|
+
return (React.createElement(Card, { className: "relative overflow-hidden" },
|
|
69
25
|
React.createElement(CardHeader, { className: "pb-4" },
|
|
70
26
|
React.createElement("div", { className: "flex flex-wrap items-start justify-between gap-4" },
|
|
71
27
|
React.createElement("div", null,
|
|
72
|
-
React.createElement("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground" }, "
|
|
73
|
-
React.createElement("h2", { className: "mt-1 text-lg font-semibold" }, "\
|
|
74
|
-
React.createElement("p", { className: "mt-1 text-sm text-muted-foreground" }, "
|
|
28
|
+
React.createElement("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground" }, "SYNAPTIC GRAPH"),
|
|
29
|
+
React.createElement("h2", { className: "mt-1 text-lg font-semibold" }, "\u30D6\u30E9\u30F3\u30C1\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF"),
|
|
30
|
+
React.createElement("p", { className: "mt-1 text-sm text-muted-foreground" }, "\u30AF\u30EA\u30C3\u30AF\u3067\u30CE\u30FC\u30C9\u3092\u5C55\u958B\u30FB\u8A73\u7D30\u8868\u793A\u3002\u30C9\u30E9\u30C3\u30B0\u3067\u79FB\u52D5\u3001\u30B9\u30AF\u30ED\u30FC\u30EB\u3067\u30BA\u30FC\u30E0\u3002")),
|
|
75
31
|
React.createElement("div", { className: "flex flex-wrap gap-2" },
|
|
76
|
-
React.createElement(Badge, { variant: "outline"
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
React.createElement(Badge, { variant: "
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
lane.nodes.map((branch) => (React.createElement(BranchNode, { key: branch.name, branch: branch }))))))))));
|
|
93
|
-
}
|
|
94
|
-
function renderBaseNode(lane) {
|
|
95
|
-
const label = lane.baseLabel === "ベース不明" ? "Unknown base" : lane.baseLabel;
|
|
96
|
-
const content = (React.createElement("div", { className: cn("group relative rounded-md border bg-card px-3 py-2 transition-colors hover:border-muted-foreground/50", lane.baseNode?.type === "local" && "border-l-2 border-l-local", lane.baseNode?.type === "remote" && "border-l-2 border-l-remote") },
|
|
97
|
-
React.createElement("span", { className: "block truncate text-sm font-medium" }, label),
|
|
98
|
-
React.createElement("span", { className: "text-xs text-muted-foreground" }, "BASE"),
|
|
99
|
-
React.createElement("div", { className: "invisible absolute bottom-full left-0 z-10 mb-2 w-48 rounded-md border bg-popover p-2 text-xs shadow-md group-hover:visible" },
|
|
100
|
-
React.createElement("p", { className: "font-medium" }, label),
|
|
101
|
-
React.createElement("p", { className: "text-muted-foreground" }, lane.baseNode
|
|
102
|
-
? `type: ${lane.baseNode.type}`
|
|
103
|
-
: "推定されたベースブランチ"))));
|
|
104
|
-
if (lane.baseNode) {
|
|
105
|
-
return (React.createElement(Link, { key: `base-${lane.id}`, to: `/${encodeURIComponent(lane.baseNode.name)}`, className: "block", "aria-label": `ベースブランチ ${lane.baseNode.name} を開く` }, content));
|
|
106
|
-
}
|
|
107
|
-
return React.createElement("div", { key: `base-${lane.id}` }, content);
|
|
108
|
-
}
|
|
109
|
-
function BranchNode({ branch }) {
|
|
110
|
-
const node = (React.createElement("div", { className: cn("group relative rounded-md border bg-card px-3 py-2 transition-colors hover:border-muted-foreground/50", branch.type === "local" && "border-l-2 border-l-local", branch.type === "remote" && "border-l-2 border-l-remote", branch.mergeStatus === "merged" && "opacity-60") },
|
|
111
|
-
React.createElement("span", { className: "block truncate text-sm font-medium" }, formatBranchLabel(branch)),
|
|
112
|
-
React.createElement("span", { className: "text-xs text-muted-foreground" }, branch.worktreePath ? "Worktree" : "No Worktree"),
|
|
113
|
-
React.createElement("div", { className: "invisible absolute bottom-full left-0 z-10 mb-2 w-56 rounded-md border bg-popover p-2 text-xs shadow-md group-hover:visible" },
|
|
114
|
-
React.createElement("p", { className: "font-medium" }, branch.name),
|
|
115
|
-
React.createElement("p", { className: "text-muted-foreground" },
|
|
116
|
-
"base: ",
|
|
117
|
-
branch.baseBranch ?? "unknown"),
|
|
118
|
-
React.createElement("p", { className: "text-muted-foreground" }, getDivergenceLabel(branch)),
|
|
119
|
-
React.createElement("p", { className: "text-muted-foreground" }, branch.worktreePath ?? "Worktree未作成"))));
|
|
120
|
-
return (React.createElement(Link, { to: `/${encodeURIComponent(branch.name)}`, className: "block", "aria-label": `${branch.name} の詳細を開く` }, node));
|
|
32
|
+
React.createElement(Badge, { variant: "outline", className: "flex items-center gap-1" },
|
|
33
|
+
React.createElement("span", { className: "h-2 w-2 rounded-full bg-muted-foreground/30" }),
|
|
34
|
+
"Cluster"),
|
|
35
|
+
React.createElement(Badge, { variant: "local", className: "flex items-center gap-1" },
|
|
36
|
+
React.createElement("span", { className: "h-2 w-2 rounded-full bg-local" }),
|
|
37
|
+
"Local"),
|
|
38
|
+
React.createElement(Badge, { variant: "remote", className: "flex items-center gap-1" },
|
|
39
|
+
React.createElement("span", { className: "h-2 w-2 rounded-full bg-remote" }),
|
|
40
|
+
"Remote"),
|
|
41
|
+
React.createElement(Badge, { variant: "success", className: "flex items-center gap-1" },
|
|
42
|
+
React.createElement("span", { className: "h-2 w-2 rounded-full bg-success" }),
|
|
43
|
+
"Worktree")))),
|
|
44
|
+
React.createElement(CardContent, { className: "relative p-0" },
|
|
45
|
+
React.createElement("div", { className: "relative h-[500px] w-full" },
|
|
46
|
+
React.createElement(SynapticCanvas, { branches: branches, onNodeClick: handleNodeClick, className: "h-full w-full" }),
|
|
47
|
+
React.createElement(BranchDetailPanel, { branch: selectedBranch, onClose: handlePanelClose })))));
|
|
121
48
|
}
|
|
122
49
|
//# sourceMappingURL=BranchGraph.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BranchGraph.js","sourceRoot":"","sources":["../../../../../src/web/client/src/components/BranchGraph.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"BranchGraph.js","sourceRoot":"","sources":["../../../../../src/web/client/src/components/BranchGraph.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAM5D,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAoB;IACxD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE1E,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,MAAqB,EAAE,EAAE;QAC5D,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,CACL,oBAAC,IAAI,IAAC,SAAS,EAAC,eAAe;YAC7B,oBAAC,WAAW,IAAC,SAAS,EAAC,6DAA6D;gBAClF,2BAAG,SAAS,EAAC,uBAAuB,yHAEhC;gBACJ,2BAAG,SAAS,EAAC,+BAA+B,0KAExC,CACQ,CACT,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,oBAAC,IAAI,IAAC,SAAS,EAAC,0BAA0B;QACxC,oBAAC,UAAU,IAAC,SAAS,EAAC,MAAM;YAC1B,6BAAK,SAAS,EAAC,kDAAkD;gBAC/D;oBACE,2BAAG,SAAS,EAAC,oEAAoE,qBAE7E;oBACJ,4BAAI,SAAS,EAAC,4BAA4B,mEAAgB;oBAC1D,2BAAG,SAAS,EAAC,oCAAoC,yNAE7C,CACA;gBACN,6BAAK,SAAS,EAAC,sBAAsB;oBACnC,oBAAC,KAAK,IAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,yBAAyB;wBAC1D,8BAAM,SAAS,EAAC,6CAA6C,GAAG;kCAE1D;oBACR,oBAAC,KAAK,IAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,yBAAyB;wBACxD,8BAAM,SAAS,EAAC,+BAA+B,GAAG;gCAE5C;oBACR,oBAAC,KAAK,IAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,EAAC,yBAAyB;wBACzD,8BAAM,SAAS,EAAC,gCAAgC,GAAG;iCAE7C;oBACR,oBAAC,KAAK,IAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,yBAAyB;wBAC1D,8BAAM,SAAS,EAAC,iCAAiC,GAAG;mCAE9C,CACJ,CACF,CACK;QAEb,oBAAC,WAAW,IAAC,SAAS,EAAC,cAAc;YAEnC,6BAAK,SAAS,EAAC,2BAA2B;gBACxC,oBAAC,cAAc,IACb,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAC,eAAe,GACzB;gBAGF,oBAAC,iBAAiB,IAChB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,gBAAgB,GACzB,CACE,CACM,CACT,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ブランチ詳細パネル
|
|
3
|
+
*
|
|
4
|
+
* ノードクリック時に右側に表示されるサイドパネル
|
|
5
|
+
*/
|
|
6
|
+
import React from "react";
|
|
7
|
+
import type { Branch } from "../../../../../types/api.js";
|
|
8
|
+
interface BranchDetailPanelProps {
|
|
9
|
+
branch: Branch | null;
|
|
10
|
+
onClose: () => void;
|
|
11
|
+
className?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function BranchDetailPanel({ branch, onClose, className, }: BranchDetailPanelProps): React.JSX.Element | null;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=BranchDetailPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BranchDetailPanel.d.ts","sourceRoot":"","sources":["../../../../../../src/web/client/src/components/graph/BranchDetailPanel.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAE1D,UAAU,sBAAsB;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,OAAO,EACP,SAAS,GACV,EAAE,sBAAsB,4BAyHxB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ブランチ詳細パネル
|
|
3
|
+
*
|
|
4
|
+
* ノードクリック時に右側に表示されるサイドパネル
|
|
5
|
+
*/
|
|
6
|
+
import React from "react";
|
|
7
|
+
import { Link } from "react-router-dom";
|
|
8
|
+
import { X } from "lucide-react";
|
|
9
|
+
import { Badge } from "@/components/ui/badge";
|
|
10
|
+
import { Button } from "@/components/ui/button";
|
|
11
|
+
import { Card, CardHeader, CardContent, CardFooter, } from "@/components/ui/card";
|
|
12
|
+
import { cn } from "@/lib/utils";
|
|
13
|
+
export function BranchDetailPanel({ branch, onClose, className, }) {
|
|
14
|
+
if (!branch)
|
|
15
|
+
return null;
|
|
16
|
+
const hasWorktree = Boolean(branch.worktreePath);
|
|
17
|
+
return (React.createElement("div", { className: cn("absolute right-0 top-0 h-full w-80 border-l bg-card/95 backdrop-blur-sm", "animate-in slide-in-from-right duration-300", className) },
|
|
18
|
+
React.createElement(Card, { className: "h-full rounded-none border-0" },
|
|
19
|
+
React.createElement(CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-4" },
|
|
20
|
+
React.createElement("div", { className: "flex items-center gap-2" },
|
|
21
|
+
React.createElement(Badge, { variant: branch.type === "local" ? "local" : "remote" }, branch.type === "local" ? "Local" : "Remote"),
|
|
22
|
+
hasWorktree && React.createElement(Badge, { variant: "success" }, "Worktree")),
|
|
23
|
+
React.createElement(Button, { variant: "ghost", size: "icon", onClick: onClose, className: "h-8 w-8" },
|
|
24
|
+
React.createElement(X, { className: "h-4 w-4" }))),
|
|
25
|
+
React.createElement(CardContent, { className: "space-y-4" },
|
|
26
|
+
React.createElement("div", null,
|
|
27
|
+
React.createElement("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground" }, "Branch Name"),
|
|
28
|
+
React.createElement("p", { className: "mt-1 break-all font-mono text-sm" }, branch.name)),
|
|
29
|
+
React.createElement("div", null,
|
|
30
|
+
React.createElement("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground" }, "Base Branch"),
|
|
31
|
+
React.createElement("p", { className: "mt-1 font-mono text-sm" }, branch.baseBranch ?? "Unknown")),
|
|
32
|
+
React.createElement("div", null,
|
|
33
|
+
React.createElement("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground" }, "Last Commit"),
|
|
34
|
+
React.createElement("p", { className: "mt-1 text-sm text-muted-foreground" }, branch.commitMessage ?? "No commit message")),
|
|
35
|
+
branch.divergence && (React.createElement("div", null,
|
|
36
|
+
React.createElement("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground" }, "Divergence"),
|
|
37
|
+
React.createElement("div", { className: "mt-2 flex flex-wrap gap-2" },
|
|
38
|
+
React.createElement(Badge, { variant: "outline", className: "text-xs" },
|
|
39
|
+
"\u2191 ",
|
|
40
|
+
branch.divergence.ahead,
|
|
41
|
+
" ahead"),
|
|
42
|
+
React.createElement(Badge, { variant: "outline", className: "text-xs" },
|
|
43
|
+
"\u2193 ",
|
|
44
|
+
branch.divergence.behind,
|
|
45
|
+
" behind"),
|
|
46
|
+
React.createElement(Badge, { variant: branch.divergence.upToDate ? "success" : "warning", className: "text-xs" }, branch.divergence.upToDate ? "Up to date" : "Needs sync")))),
|
|
47
|
+
hasWorktree && (React.createElement("div", null,
|
|
48
|
+
React.createElement("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground" }, "Worktree Path"),
|
|
49
|
+
React.createElement("p", { className: "mt-1 break-all font-mono text-xs text-muted-foreground" }, branch.worktreePath))),
|
|
50
|
+
branch.mergeStatus && (React.createElement("div", null,
|
|
51
|
+
React.createElement("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground" }, "Merge Status"),
|
|
52
|
+
React.createElement(Badge, { variant: branch.mergeStatus === "merged" ? "success" : "outline", className: "mt-1" }, branch.mergeStatus)))),
|
|
53
|
+
React.createElement(CardFooter, { className: "flex flex-col gap-2" },
|
|
54
|
+
React.createElement(Button, { asChild: true, className: "w-full" },
|
|
55
|
+
React.createElement(Link, { to: `/${encodeURIComponent(branch.name)}` }, "View Details"))))));
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=BranchDetailPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BranchDetailPanel.js","sourceRoot":"","sources":["../../../../../../src/web/client/src/components/graph/BranchDetailPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ブランチノードコンポーネント
|
|
3
|
+
*
|
|
4
|
+
* ソーマ(神経細胞体)をイメージした生物発光ノード
|
|
5
|
+
* 多層グロー効果と有機的なアニメーションで生命感を表現
|
|
6
|
+
*/
|
|
7
|
+
import React from "react";
|
|
8
|
+
import { type NodeProps } from "@xyflow/react";
|
|
9
|
+
import { type GraphNode } from "./graphUtils";
|
|
10
|
+
type BranchNodeProps = NodeProps<GraphNode>;
|
|
11
|
+
export declare const BranchNode: React.NamedExoticComponent<BranchNodeProps>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=BranchNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BranchNode.d.ts","sourceRoot":"","sources":["../../../../../../src/web/client/src/components/graph/BranchNode.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzE,KAAK,eAAe,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;AAE5C,eAAO,MAAM,UAAU,6CAyLrB,CAAC"}
|