@caoruhua/open-claude-remote 0.1.7 → 0.2.4
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 +534 -11
- package/dist/backend/src/api/config-routes.d.ts +2 -2
- package/dist/backend/src/api/config-routes.d.ts.map +1 -1
- package/dist/backend/src/api/config-routes.js +24 -6
- package/dist/backend/src/api/config-routes.js.map +1 -1
- package/dist/backend/src/api/health-routes.d.ts +4 -1
- package/dist/backend/src/api/health-routes.d.ts.map +1 -1
- package/dist/backend/src/api/health-routes.js +20 -2
- package/dist/backend/src/api/health-routes.js.map +1 -1
- package/dist/backend/src/api/hook-routes.d.ts +2 -2
- package/dist/backend/src/api/hook-routes.d.ts.map +1 -1
- package/dist/backend/src/api/hook-routes.js +10 -3
- package/dist/backend/src/api/hook-routes.js.map +1 -1
- package/dist/backend/src/api/instance-routes.d.ts +5 -3
- package/dist/backend/src/api/instance-routes.d.ts.map +1 -1
- package/dist/backend/src/api/instance-routes.js +48 -45
- package/dist/backend/src/api/instance-routes.js.map +1 -1
- package/dist/backend/src/api/router.d.ts +4 -12
- package/dist/backend/src/api/router.d.ts.map +1 -1
- package/dist/backend/src/api/router.js +28 -20
- package/dist/backend/src/api/router.js.map +1 -1
- package/dist/backend/src/api/status-routes.d.ts +2 -2
- package/dist/backend/src/api/status-routes.d.ts.map +1 -1
- package/dist/backend/src/api/status-routes.js +11 -6
- package/dist/backend/src/api/status-routes.js.map +1 -1
- package/dist/backend/src/attach.d.ts +1 -1
- package/dist/backend/src/attach.d.ts.map +1 -1
- package/dist/backend/src/attach.js +25 -71
- package/dist/backend/src/attach.js.map +1 -1
- package/dist/backend/src/cli-utils.d.ts +24 -1
- package/dist/backend/src/cli-utils.d.ts.map +1 -1
- package/dist/backend/src/cli-utils.js +73 -37
- package/dist/backend/src/cli-utils.js.map +1 -1
- package/dist/backend/src/cli.d.ts +23 -2
- package/dist/backend/src/cli.d.ts.map +1 -1
- package/dist/backend/src/cli.js +359 -22
- package/dist/backend/src/cli.js.map +1 -1
- package/dist/backend/src/config.d.ts +48 -15
- package/dist/backend/src/config.d.ts.map +1 -1
- package/dist/backend/src/config.js +124 -24
- package/dist/backend/src/config.js.map +1 -1
- package/dist/backend/src/daemon/daemon-client.d.ts +91 -0
- package/dist/backend/src/daemon/daemon-client.d.ts.map +1 -0
- package/dist/backend/src/daemon/daemon-client.js +258 -0
- package/dist/backend/src/daemon/daemon-client.js.map +1 -0
- package/dist/backend/src/daemon/daemon-entry.d.ts +8 -0
- package/dist/backend/src/daemon/daemon-entry.d.ts.map +1 -0
- package/dist/backend/src/daemon/daemon-entry.js +37 -0
- package/dist/backend/src/daemon/daemon-entry.js.map +1 -0
- package/dist/backend/src/daemon/daemon-launcher.d.ts +13 -0
- package/dist/backend/src/daemon/daemon-launcher.d.ts.map +1 -0
- package/dist/backend/src/daemon/daemon-launcher.js +62 -0
- package/dist/backend/src/daemon/daemon-launcher.js.map +1 -0
- package/dist/backend/src/index.d.ts.map +1 -1
- package/dist/backend/src/index.js +115 -251
- package/dist/backend/src/index.js.map +1 -1
- package/dist/backend/src/instance/index.d.ts +4 -0
- package/dist/backend/src/instance/index.d.ts.map +1 -0
- package/dist/backend/src/instance/index.js +3 -0
- package/dist/backend/src/instance/index.js.map +1 -0
- package/dist/backend/src/instance/instance-manager.d.ts +62 -0
- package/dist/backend/src/instance/instance-manager.d.ts.map +1 -0
- package/dist/backend/src/instance/instance-manager.js +194 -0
- package/dist/backend/src/instance/instance-manager.js.map +1 -0
- package/dist/backend/src/instance/instance-session.d.ts +87 -0
- package/dist/backend/src/instance/instance-session.d.ts.map +1 -0
- package/dist/backend/src/instance/instance-session.js +359 -0
- package/dist/backend/src/instance/instance-session.js.map +1 -0
- package/dist/backend/src/instance/types.d.ts +39 -0
- package/dist/backend/src/instance/types.d.ts.map +1 -0
- package/dist/backend/src/instance/types.js +2 -0
- package/dist/backend/src/instance/types.js.map +1 -0
- package/dist/backend/src/notification/notification-manager.js +1 -1
- package/dist/backend/src/notification/notification-manager.js.map +1 -1
- package/dist/backend/src/notification/notification-service-factory.js +1 -1
- package/dist/backend/src/notification/notification-service-factory.js.map +1 -1
- package/dist/backend/src/pty/virtual-pty.d.ts.map +1 -1
- package/dist/backend/src/pty/virtual-pty.js +6 -0
- package/dist/backend/src/pty/virtual-pty.js.map +1 -1
- package/dist/backend/src/registry/shared-token.d.ts +2 -2
- package/dist/backend/src/registry/shared-token.js +11 -11
- package/dist/backend/src/registry/shared-token.js.map +1 -1
- package/dist/backend/src/registry/stop-instances.d.ts +0 -25
- package/dist/backend/src/registry/stop-instances.d.ts.map +1 -1
- package/dist/backend/src/registry/stop-instances.js +6 -206
- package/dist/backend/src/registry/stop-instances.js.map +1 -1
- package/dist/backend/src/skills/index.d.ts +4 -0
- package/dist/backend/src/skills/index.d.ts.map +1 -0
- package/dist/backend/src/skills/index.js +4 -0
- package/dist/backend/src/skills/index.js.map +1 -0
- package/dist/backend/src/skills/skill-command-merger.d.ts +32 -0
- package/dist/backend/src/skills/skill-command-merger.d.ts.map +1 -0
- package/dist/backend/src/skills/skill-command-merger.js +76 -0
- package/dist/backend/src/skills/skill-command-merger.js.map +1 -0
- package/dist/backend/src/skills/skill-commands.d.ts +20 -0
- package/dist/backend/src/skills/skill-commands.d.ts.map +1 -0
- package/dist/backend/src/skills/skill-commands.js +34 -0
- package/dist/backend/src/skills/skill-commands.js.map +1 -0
- package/dist/backend/src/skills/skill-scanner.d.ts +40 -0
- package/dist/backend/src/skills/skill-scanner.d.ts.map +1 -0
- package/dist/backend/src/skills/skill-scanner.js +160 -0
- package/dist/backend/src/skills/skill-scanner.js.map +1 -0
- package/dist/backend/src/terminal/terminal-relay.d.ts +1 -0
- package/dist/backend/src/terminal/terminal-relay.d.ts.map +1 -1
- package/dist/backend/src/terminal/terminal-relay.js +6 -0
- package/dist/backend/src/terminal/terminal-relay.js.map +1 -1
- package/dist/backend/src/update.d.ts.map +1 -1
- package/dist/backend/src/update.js +46 -1
- package/dist/backend/src/update.js.map +1 -1
- package/dist/backend/src/utils/banner.d.ts +15 -0
- package/dist/backend/src/utils/banner.d.ts.map +1 -0
- package/dist/backend/src/utils/banner.js +95 -0
- package/dist/backend/src/utils/banner.js.map +1 -0
- package/dist/backend/src/ws/ws-server.d.ts +13 -54
- package/dist/backend/src/ws/ws-server.d.ts.map +1 -1
- package/dist/backend/src/ws/ws-server.js +57 -155
- package/dist/backend/src/ws/ws-server.js.map +1 -1
- package/dist/shared/constants.d.ts +2 -1
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +2 -1
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/defaults.d.ts +1 -0
- package/dist/shared/defaults.d.ts.map +1 -1
- package/dist/shared/defaults.js +1 -5
- package/dist/shared/defaults.js.map +1 -1
- package/dist/shared/instance.d.ts +4 -9
- package/dist/shared/instance.d.ts.map +1 -1
- package/dist/shared/instance.js +0 -2
- package/dist/shared/instance.js.map +1 -1
- package/frontend-dist/assets/index-CM2xfmS8.js +152 -0
- package/frontend-dist/index.html +1 -1
- package/package.json +2 -2
- package/frontend-dist/assets/index-Cfhr3h3e.js +0 -152
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { isSkillCommand } from './skill-commands.js';
|
|
2
|
+
/**
|
|
3
|
+
* 智能合并 Skill Commands
|
|
4
|
+
*
|
|
5
|
+
* 合并策略:
|
|
6
|
+
* 1. 保留所有非 Skill commands(系统默认 + 用户自定义)
|
|
7
|
+
* 2. 对于 Skill commands:
|
|
8
|
+
* - 新增 Skill → 添加到列表
|
|
9
|
+
* - 删除 Skill → 从列表移除
|
|
10
|
+
* - 保留的 Skill → 保留用户的 enabled、autoSend、desc 修改
|
|
11
|
+
*
|
|
12
|
+
* @param existingCommands 现有命令列表(可能包含用户的修改)
|
|
13
|
+
* @param newSkillCommands 新扫描出的 Skill Commands
|
|
14
|
+
* @returns 合并结果
|
|
15
|
+
*/
|
|
16
|
+
export function mergeSkillCommands(existingCommands, newSkillCommands) {
|
|
17
|
+
// 1. 分离现有命令:非 Skill commands 和 Skill commands
|
|
18
|
+
const nonSkillCommands = [];
|
|
19
|
+
const existingSkillCommands = new Map();
|
|
20
|
+
for (const cmd of existingCommands) {
|
|
21
|
+
if (isSkillCommand(cmd)) {
|
|
22
|
+
existingSkillCommands.set(cmd.label, cmd);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
nonSkillCommands.push(cmd);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// 2. 构建新 Skill 命令映射
|
|
29
|
+
const newSkillMap = new Map();
|
|
30
|
+
for (const cmd of newSkillCommands) {
|
|
31
|
+
newSkillMap.set(cmd.label, cmd);
|
|
32
|
+
}
|
|
33
|
+
// 3. 合并 Skill commands
|
|
34
|
+
const mergedSkillCommands = [];
|
|
35
|
+
let added = 0;
|
|
36
|
+
let removed = 0;
|
|
37
|
+
let preserved = 0;
|
|
38
|
+
// 处理新 Skill
|
|
39
|
+
for (const [label, newCmd] of newSkillMap) {
|
|
40
|
+
const existingCmd = existingSkillCommands.get(label);
|
|
41
|
+
if (existingCmd) {
|
|
42
|
+
// Skill 存在,保留用户的交互设置,desc 始终从 Skill 源更新
|
|
43
|
+
mergedSkillCommands.push({
|
|
44
|
+
...newCmd,
|
|
45
|
+
// 保留用户的 enabled 设置
|
|
46
|
+
enabled: existingCmd.enabled,
|
|
47
|
+
// 保留用户的 autoSend 设置
|
|
48
|
+
autoSend: existingCmd.autoSend ?? newCmd.autoSend,
|
|
49
|
+
});
|
|
50
|
+
preserved++;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// 新 Skill,直接添加
|
|
54
|
+
mergedSkillCommands.push(newCmd);
|
|
55
|
+
added++;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// 统计移除的 Skill
|
|
59
|
+
for (const [label] of existingSkillCommands) {
|
|
60
|
+
if (!newSkillMap.has(label)) {
|
|
61
|
+
removed++;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// 4. 组合最终结果:非 Skill commands + 合并后的 Skill commands
|
|
65
|
+
// 按 label 排序 Skill commands
|
|
66
|
+
mergedSkillCommands.sort((a, b) => a.label.localeCompare(b.label));
|
|
67
|
+
const finalCommands = [...nonSkillCommands, ...mergedSkillCommands];
|
|
68
|
+
return {
|
|
69
|
+
commands: finalCommands,
|
|
70
|
+
added,
|
|
71
|
+
removed,
|
|
72
|
+
preserved,
|
|
73
|
+
total: mergedSkillCommands.length,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=skill-command-merger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-command-merger.js","sourceRoot":"","sources":["../../../../backend/src/skills/skill-command-merger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAkBrD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAChC,gBAAuC,EACvC,gBAAuC;IAEvC,8CAA8C;IAC9C,MAAM,gBAAgB,GAA0B,EAAE,CAAC;IACnD,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAA+B,CAAC;IAErE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,WAAW,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC3D,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,uBAAuB;IACvB,MAAM,mBAAmB,GAA0B,EAAE,CAAC;IACtD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,YAAY;IACZ,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAErD,IAAI,WAAW,EAAE,CAAC;YAChB,wCAAwC;YACxC,mBAAmB,CAAC,IAAI,CAAC;gBACvB,GAAG,MAAM;gBACT,mBAAmB;gBACnB,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,oBAAoB;gBACpB,QAAQ,EAAE,WAAW,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ;aAClD,CAAC,CAAC;YACH,SAAS,EAAE,CAAC;QACd,CAAC;aAAM,CAAC;YACN,eAAe;YACf,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAED,cAAc;IACd,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,qBAAqB,EAAE,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,4BAA4B;IAC5B,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnE,MAAM,aAAa,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,mBAAmB,CAAC,CAAC;IAEpE,OAAO;QACL,QAAQ,EAAE,aAAa;QACvB,KAAK;QACL,OAAO;QACP,SAAS;QACT,KAAK,EAAE,mBAAmB,CAAC,MAAM;KAClC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ConfigurableCommand } from '../../../shared/index.js';
|
|
2
|
+
import type { SkillInfo } from './skill-scanner.js';
|
|
3
|
+
/**
|
|
4
|
+
* 将 Skill 信息转换为 ConfigurableCommand
|
|
5
|
+
* @param skill Skill 信息
|
|
6
|
+
* @returns ConfigurableCommand 对象
|
|
7
|
+
*/
|
|
8
|
+
export declare function skillToCommand(skill: SkillInfo): ConfigurableCommand;
|
|
9
|
+
/**
|
|
10
|
+
* 批量将 Skills 转换为 Commands
|
|
11
|
+
* @param skills Skill 信息数组
|
|
12
|
+
* @returns ConfigurableCommand 数组
|
|
13
|
+
*/
|
|
14
|
+
export declare function convertSkillsToCommands(skills: SkillInfo[]): ConfigurableCommand[];
|
|
15
|
+
/**
|
|
16
|
+
* 判断一个 Command 是否为 Skill Command
|
|
17
|
+
* 基于 fromSkill 标记判断,避免误将用户自定义斜杠命令识别为 Skill Command
|
|
18
|
+
*/
|
|
19
|
+
export declare function isSkillCommand(command: ConfigurableCommand): boolean;
|
|
20
|
+
//# sourceMappingURL=skill-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-commands.d.ts","sourceRoot":"","sources":["../../../../backend/src/skills/skill-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,mBAAmB,CAYpE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,mBAAmB,EAAE,CAElF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAEpE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 将 Skill 信息转换为 ConfigurableCommand
|
|
3
|
+
* @param skill Skill 信息
|
|
4
|
+
* @returns ConfigurableCommand 对象
|
|
5
|
+
*/
|
|
6
|
+
export function skillToCommand(skill) {
|
|
7
|
+
return {
|
|
8
|
+
label: `/${skill.name}`,
|
|
9
|
+
command: `/${skill.name}`,
|
|
10
|
+
enabled: true,
|
|
11
|
+
// 描述截断到 50 字符
|
|
12
|
+
desc: skill.description?.slice(0, 50),
|
|
13
|
+
// 默认直接发送
|
|
14
|
+
autoSend: true,
|
|
15
|
+
// 标记为 Skill 来源,用于合并时区分用户自定义命令
|
|
16
|
+
fromSkill: true,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 批量将 Skills 转换为 Commands
|
|
21
|
+
* @param skills Skill 信息数组
|
|
22
|
+
* @returns ConfigurableCommand 数组
|
|
23
|
+
*/
|
|
24
|
+
export function convertSkillsToCommands(skills) {
|
|
25
|
+
return skills.map(skillToCommand);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 判断一个 Command 是否为 Skill Command
|
|
29
|
+
* 基于 fromSkill 标记判断,避免误将用户自定义斜杠命令识别为 Skill Command
|
|
30
|
+
*/
|
|
31
|
+
export function isSkillCommand(command) {
|
|
32
|
+
return command.fromSkill === true;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=skill-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-commands.js","sourceRoot":"","sources":["../../../../backend/src/skills/skill-commands.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAgB;IAC7C,OAAO;QACL,KAAK,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE;QACvB,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE;QACzB,OAAO,EAAE,IAAI;QACb,cAAc;QACd,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACrC,SAAS;QACT,QAAQ,EAAE,IAAI;QACd,8BAA8B;QAC9B,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAmB;IACzD,OAAO,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAA4B;IACzD,OAAO,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill 信息结构
|
|
3
|
+
*/
|
|
4
|
+
export interface SkillInfo {
|
|
5
|
+
/** Skill 名称(从 YAML frontmatter 提取) */
|
|
6
|
+
name: string;
|
|
7
|
+
/** Skill 描述(可选) */
|
|
8
|
+
description?: string;
|
|
9
|
+
/** SKILL.md 文件完整路径 */
|
|
10
|
+
path: string;
|
|
11
|
+
/** Skill 来源:全局或项目级 */
|
|
12
|
+
source: 'global' | 'project';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 解析 Skill 文件的 YAML frontmatter
|
|
16
|
+
* @param content SKILL.md 文件内容
|
|
17
|
+
* @returns 解析出的 name 和 description,解析失败返回空对象
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseSkillFrontmatter(content: string): {
|
|
20
|
+
name?: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* 扫描单个 Skill 目录
|
|
25
|
+
* @param dir Skill 目录路径
|
|
26
|
+
* @param source Skill 来源
|
|
27
|
+
* @returns Skill 信息数组
|
|
28
|
+
*/
|
|
29
|
+
export declare function scanSkillDirectory(dir: string, source: 'global' | 'project'): SkillInfo[];
|
|
30
|
+
/**
|
|
31
|
+
* 扫描全局和项目级 Skill 目录(带 5 秒 TTL 缓存)
|
|
32
|
+
* @param projectDir 项目工作目录
|
|
33
|
+
* @returns 合并后的 Skill 信息数组(项目级优先覆盖全局同名 Skill)
|
|
34
|
+
*/
|
|
35
|
+
export declare function scanSkills(projectDir: string): SkillInfo[];
|
|
36
|
+
/**
|
|
37
|
+
* 清除扫描缓存(用于测试)
|
|
38
|
+
*/
|
|
39
|
+
export declare function clearScanCache(): void;
|
|
40
|
+
//# sourceMappingURL=skill-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-scanner.d.ts","sourceRoot":"","sources":["../../../../backend/src/skills/skill-scanner.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAuD9F;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,EAAE,CAgDzF;AAcD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,CA6C1D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { resolve, join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { logger } from '../logger/logger.js';
|
|
5
|
+
/**
|
|
6
|
+
* 解析 Skill 文件的 YAML frontmatter
|
|
7
|
+
* @param content SKILL.md 文件内容
|
|
8
|
+
* @returns 解析出的 name 和 description,解析失败返回空对象
|
|
9
|
+
*/
|
|
10
|
+
export function parseSkillFrontmatter(content) {
|
|
11
|
+
// 匹配 YAML frontmatter: ---\n...\n---
|
|
12
|
+
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
13
|
+
if (!frontmatterMatch) {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
const frontmatter = frontmatterMatch[1];
|
|
17
|
+
const result = {};
|
|
18
|
+
// 解析 name 字段
|
|
19
|
+
const nameMatch = frontmatter.match(/^name:\s*(.+)$/m);
|
|
20
|
+
if (nameMatch) {
|
|
21
|
+
result.name = nameMatch[1].trim();
|
|
22
|
+
}
|
|
23
|
+
// 解析 description 字段(支持多行 YAML 字符串)
|
|
24
|
+
const descMatch = frontmatter.match(/^description:\s*([>\|]?)\s*$/m);
|
|
25
|
+
if (descMatch) {
|
|
26
|
+
if (descMatch[1] === '>' || descMatch[1] === '|') {
|
|
27
|
+
// 多行字符串:取后续缩进行,直到遇到非缩进行
|
|
28
|
+
const lines = frontmatter.split('\n');
|
|
29
|
+
let inDesc = false;
|
|
30
|
+
const descLines = [];
|
|
31
|
+
for (const line of lines) {
|
|
32
|
+
if (inDesc) {
|
|
33
|
+
if (line.startsWith(' ') || line.startsWith('\t')) {
|
|
34
|
+
descLines.push(line.trim());
|
|
35
|
+
}
|
|
36
|
+
else if (line.trim() === '') {
|
|
37
|
+
// 空行结束多行字符串
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (line.startsWith('description:')) {
|
|
45
|
+
inDesc = true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (descLines.length > 0) {
|
|
49
|
+
result.description = descLines.join(' ').trim();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// 尝试单行 description
|
|
54
|
+
if (!result.description) {
|
|
55
|
+
const singleLineMatch = frontmatter.match(/^description:\s*(.+)$/m);
|
|
56
|
+
if (singleLineMatch) {
|
|
57
|
+
result.description = singleLineMatch[1].trim();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 扫描单个 Skill 目录
|
|
64
|
+
* @param dir Skill 目录路径
|
|
65
|
+
* @param source Skill 来源
|
|
66
|
+
* @returns Skill 信息数组
|
|
67
|
+
*/
|
|
68
|
+
export function scanSkillDirectory(dir, source) {
|
|
69
|
+
const skills = [];
|
|
70
|
+
// 目录不存在则返回空数组
|
|
71
|
+
if (!existsSync(dir)) {
|
|
72
|
+
return skills;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
76
|
+
for (const entry of entries) {
|
|
77
|
+
// 只处理目录
|
|
78
|
+
if (!entry.isDirectory())
|
|
79
|
+
continue;
|
|
80
|
+
const skillDir = join(dir, entry.name);
|
|
81
|
+
const skillFilePath = join(skillDir, 'SKILL.md');
|
|
82
|
+
// SKILL.md 不存在则跳过
|
|
83
|
+
if (!existsSync(skillFilePath)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const content = readFileSync(skillFilePath, 'utf-8');
|
|
88
|
+
const frontmatter = parseSkillFrontmatter(content);
|
|
89
|
+
// 缺少 name 字段则跳过
|
|
90
|
+
if (!frontmatter.name) {
|
|
91
|
+
logger.warn({ skillFilePath, source }, 'Skill missing name field in frontmatter, skipping');
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
skills.push({
|
|
95
|
+
name: frontmatter.name,
|
|
96
|
+
description: frontmatter.description,
|
|
97
|
+
path: skillFilePath,
|
|
98
|
+
source,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
logger.warn({ skillFilePath, source, err }, 'Failed to parse SKILL.md, skipping');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
logger.warn({ dir, source, err }, 'Failed to scan skill directory');
|
|
108
|
+
}
|
|
109
|
+
return skills;
|
|
110
|
+
}
|
|
111
|
+
/** 缓存 TTL(毫秒) */
|
|
112
|
+
const CACHE_TTL_MS = 5000;
|
|
113
|
+
let scanCache = null;
|
|
114
|
+
/**
|
|
115
|
+
* 扫描全局和项目级 Skill 目录(带 5 秒 TTL 缓存)
|
|
116
|
+
* @param projectDir 项目工作目录
|
|
117
|
+
* @returns 合并后的 Skill 信息数组(项目级优先覆盖全局同名 Skill)
|
|
118
|
+
*/
|
|
119
|
+
export function scanSkills(projectDir) {
|
|
120
|
+
const home = homedir();
|
|
121
|
+
// 全局 Skill 目录: ~/.claude/skills/
|
|
122
|
+
const globalSkillDir = resolve(home, '.claude', 'skills');
|
|
123
|
+
// 项目级 Skill 目录: <projectDir>/.claude/skills/
|
|
124
|
+
const projectSkillDir = resolve(projectDir, '.claude', 'skills');
|
|
125
|
+
// 检查缓存
|
|
126
|
+
const cacheKey = `${globalSkillDir}|${projectSkillDir}`;
|
|
127
|
+
const now = Date.now();
|
|
128
|
+
if (scanCache && scanCache.key === cacheKey && now - scanCache.timestamp < CACHE_TTL_MS) {
|
|
129
|
+
return scanCache.skills;
|
|
130
|
+
}
|
|
131
|
+
// 扫描两个目录
|
|
132
|
+
const globalSkills = scanSkillDirectory(globalSkillDir, 'global');
|
|
133
|
+
const projectSkills = scanSkillDirectory(projectSkillDir, 'project');
|
|
134
|
+
// 合并:项目级优先覆盖全局同名 Skill
|
|
135
|
+
const skillMap = new Map();
|
|
136
|
+
// 先添加全局 Skills
|
|
137
|
+
for (const skill of globalSkills) {
|
|
138
|
+
skillMap.set(skill.name, skill);
|
|
139
|
+
}
|
|
140
|
+
// 再添加项目级 Skills(覆盖同名)
|
|
141
|
+
for (const skill of projectSkills) {
|
|
142
|
+
skillMap.set(skill.name, skill);
|
|
143
|
+
}
|
|
144
|
+
const result = Array.from(skillMap.values());
|
|
145
|
+
// 更新缓存
|
|
146
|
+
scanCache = { skills: result, timestamp: now, key: cacheKey };
|
|
147
|
+
logger.debug({
|
|
148
|
+
globalCount: globalSkills.length,
|
|
149
|
+
projectCount: projectSkills.length,
|
|
150
|
+
totalCount: result.length,
|
|
151
|
+
}, 'Skills scanned');
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 清除扫描缓存(用于测试)
|
|
156
|
+
*/
|
|
157
|
+
export function clearScanCache() {
|
|
158
|
+
scanCache = null;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=skill-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-scanner.js","sourceRoot":"","sources":["../../../../backend/src/skills/skill-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-relay.d.ts","sourceRoot":"","sources":["../../../../backend/src/terminal/terminal-relay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAcnD,qBAAa,aAAa;IAOZ,OAAO,CAAC,UAAU;IAN9B,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAAkB;gBAElB,UAAU,EAAE,WAAW;IAE3C;;OAEG;IACH,KAAK,IAAI,IAAI;IA8Cb;;;OAGG;IACH,WAAW,IAAI,IAAI;IAKnB;;;OAGG;IACH,YAAY,IAAI,IAAI;IAUpB
|
|
1
|
+
{"version":3,"file":"terminal-relay.d.ts","sourceRoot":"","sources":["../../../../backend/src/terminal/terminal-relay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAcnD,qBAAa,aAAa;IAOZ,OAAO,CAAC,UAAU;IAN9B,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAAkB;gBAElB,UAAU,EAAE,WAAW;IAE3C;;OAEG;IACH,KAAK,IAAI,IAAI;IA8Cb;;;OAGG;IACH,WAAW,IAAI,IAAI;IAKnB;;;OAGG;IACH,YAAY,IAAI,IAAI;IAUpB;;;OAGG;IACH,IAAI,IAAI,IAAI;CAsBb"}
|
|
@@ -86,6 +86,7 @@ export class TerminalRelay {
|
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
88
|
* Stop relaying and restore terminal state.
|
|
89
|
+
* Order: setRawMode(false) → resume() → pause() to ensure terminal state is fully restored.
|
|
89
90
|
*/
|
|
90
91
|
stop() {
|
|
91
92
|
if (this.stdinHandler) {
|
|
@@ -97,7 +98,12 @@ export class TerminalRelay {
|
|
|
97
98
|
this.resizeHandler = null;
|
|
98
99
|
}
|
|
99
100
|
if (process.stdin.isTTY) {
|
|
101
|
+
// Restore terminal state in correct order:
|
|
102
|
+
// 1. Disable raw mode first (so terminal processes special chars again)
|
|
103
|
+
// 2. Resume to allow any pending data to flow
|
|
104
|
+
// 3. Pause to clean up the stream
|
|
100
105
|
process.stdin.setRawMode(this.wasRaw);
|
|
106
|
+
process.stdin.resume();
|
|
101
107
|
process.stdin.pause();
|
|
102
108
|
}
|
|
103
109
|
logger.info('Terminal relay stopped');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-relay.js","sourceRoot":"","sources":["../../../../backend/src/terminal/terminal-relay.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"terminal-relay.js","sourceRoot":"","sources":["../../../../backend/src/terminal/terminal-relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../backend/src/update.ts"],"names":[],"mappings":"AAcA,2BAA2B;AAC3B,wBAAgB,oBAAoB,IAAI,KAAK,GAAG,MAAM,CAUrD;AAED,6BAA6B;AAC7B,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAyBpD;
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../backend/src/update.ts"],"names":[],"mappings":"AAcA,2BAA2B;AAC3B,wBAAgB,oBAAoB,IAAI,KAAK,GAAG,MAAM,CAUrD;AAED,6BAA6B;AAC7B,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAyBpD;AAKD,mDAAmD;AACnD,wBAAgB,iBAAiB,IAAI,MAAM,CAmB1C;AAED,yCAAyC;AACzC,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAOvE;AAED,eAAe;AACf,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgFnD"}
|
|
@@ -49,8 +49,12 @@ export function fetchLatestVersion() {
|
|
|
49
49
|
});
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
|
+
/** 进程级版本缓存 — 版本在进程生命周期内不会变化 */
|
|
53
|
+
let cachedVersion = null;
|
|
52
54
|
/** 从 import.meta.url 向上查找项目 package.json 获取当前版本 */
|
|
53
55
|
export function getCurrentVersion() {
|
|
56
|
+
if (cachedVersion)
|
|
57
|
+
return cachedVersion;
|
|
54
58
|
// 从当前文件向上逐级查找 package.json
|
|
55
59
|
let dir = dirname(fileURLToPath(import.meta.url));
|
|
56
60
|
for (let i = 0; i < 10; i++) {
|
|
@@ -58,6 +62,7 @@ export function getCurrentVersion() {
|
|
|
58
62
|
if (existsSync(pkgPath)) {
|
|
59
63
|
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
60
64
|
if (pkg.name === PKG_NAME && pkg.version) {
|
|
65
|
+
cachedVersion = pkg.version;
|
|
61
66
|
return pkg.version;
|
|
62
67
|
}
|
|
63
68
|
}
|
|
@@ -130,7 +135,10 @@ export async function updatePackage() {
|
|
|
130
135
|
if (code === 0) {
|
|
131
136
|
process.stdout.write(`\nSuccessfully updated to ${latestVersion}!\n`);
|
|
132
137
|
logger.info({ latestVersion }, 'Package updated successfully');
|
|
133
|
-
|
|
138
|
+
// 检查 daemon 是否需要重启
|
|
139
|
+
handlePostUpdateRestart().then(() => {
|
|
140
|
+
promiseResolve();
|
|
141
|
+
});
|
|
134
142
|
}
|
|
135
143
|
else {
|
|
136
144
|
const manualCmd = `${pm} ${args.join(' ')}`;
|
|
@@ -150,4 +158,41 @@ export async function updatePackage() {
|
|
|
150
158
|
});
|
|
151
159
|
});
|
|
152
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* 更新完成后检查并重启 daemon
|
|
163
|
+
*/
|
|
164
|
+
async function handlePostUpdateRestart() {
|
|
165
|
+
try {
|
|
166
|
+
const { checkDaemonVersion, smartRestartDaemon, listInstances, isDaemonRunning } = await import('./daemon/daemon-client.js');
|
|
167
|
+
// 检查 daemon 是否运行
|
|
168
|
+
if (!(await isDaemonRunning())) {
|
|
169
|
+
return; // daemon 未运行,无需重启
|
|
170
|
+
}
|
|
171
|
+
// 检查版本
|
|
172
|
+
const versionCheck = await checkDaemonVersion();
|
|
173
|
+
if (!versionCheck.needsRestart) {
|
|
174
|
+
return; // 版本匹配,无需重启
|
|
175
|
+
}
|
|
176
|
+
// 版本不匹配,尝试重启
|
|
177
|
+
const instances = await listInstances().catch(() => []);
|
|
178
|
+
if (instances.length === 0) {
|
|
179
|
+
process.stdout.write('\nRestarting daemon with new version...\n');
|
|
180
|
+
const result = await smartRestartDaemon();
|
|
181
|
+
if (result.restarted) {
|
|
182
|
+
process.stdout.write('✅ Daemon restarted.\n');
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
process.stdout.write('⚠️ Failed to restart daemon. Run manually: claude-remote stop && claude-remote\n');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
process.stdout.write('\n⚠️ Daemon is still running old version.\n');
|
|
190
|
+
process.stdout.write(' Restart manually: claude-remote stop && claude-remote\n');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
// 不影响更新流程,静默失败
|
|
195
|
+
logger.debug({ err }, 'Post-update daemon restart check failed');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
153
198
|
//# sourceMappingURL=update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../backend/src/update.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../backend/src/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface BannerOptions {
|
|
2
|
+
url: string;
|
|
3
|
+
token: string;
|
|
4
|
+
instanceName: string;
|
|
5
|
+
logDir: string;
|
|
6
|
+
pid: number;
|
|
7
|
+
instanceId?: string;
|
|
8
|
+
warnings?: string[];
|
|
9
|
+
showExitHint?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 将 banner 打印到 stderr(CLI 使用)
|
|
13
|
+
*/
|
|
14
|
+
export declare function printBanner(options: BannerOptions): void;
|
|
15
|
+
//# sourceMappingURL=banner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../../../backend/src/utils/banner.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CA0FxD"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Banner 打印模块
|
|
3
|
+
*
|
|
4
|
+
* 从 index.ts 提取出来,供 CLI 和 daemon 共用。
|
|
5
|
+
*/
|
|
6
|
+
import { generateQRCodeLines } from './qrcode-banner.js';
|
|
7
|
+
import { getCurrentVersion } from '../update.js';
|
|
8
|
+
/**
|
|
9
|
+
* 将 banner 打印到 stderr(CLI 使用)
|
|
10
|
+
*/
|
|
11
|
+
export function printBanner(options) {
|
|
12
|
+
const { url, token, instanceName, logDir, pid, instanceId, warnings = [], showExitHint = true } = options;
|
|
13
|
+
const qrUrl = `${url}?token=${token}`;
|
|
14
|
+
const qrLines = generateQRCodeLines(qrUrl);
|
|
15
|
+
let version = '';
|
|
16
|
+
try {
|
|
17
|
+
version = getCurrentVersion();
|
|
18
|
+
}
|
|
19
|
+
catch { /* ignore */ }
|
|
20
|
+
// Format instance line with optional ID
|
|
21
|
+
const shortId = instanceId ? instanceId.substring(0, 8) : null;
|
|
22
|
+
const instanceLine = shortId
|
|
23
|
+
? `Instance: ${instanceName} (${shortId})`
|
|
24
|
+
: `Instance: ${instanceName}`;
|
|
25
|
+
const leftLines = [];
|
|
26
|
+
leftLines.push(instanceLine);
|
|
27
|
+
leftLines.push(`URL: ${url}`);
|
|
28
|
+
leftLines.push(`PID: ${pid}`);
|
|
29
|
+
leftLines.push(`Logs: ${logDir}`);
|
|
30
|
+
leftLines.push('');
|
|
31
|
+
leftLines.push('Commands:');
|
|
32
|
+
leftLines.push(` attach: claude-remote attach ${instanceName}`);
|
|
33
|
+
leftLines.push(' list: claude-remote list');
|
|
34
|
+
leftLines.push(' status: claude-remote status');
|
|
35
|
+
leftLines.push(' stop: claude-remote stop');
|
|
36
|
+
leftLines.push(' update: claude-remote update');
|
|
37
|
+
const qrLabel = 'Scan QR to connect';
|
|
38
|
+
const rightLines = [...qrLines, ''];
|
|
39
|
+
const targetHeight = Math.max(leftLines.length, rightLines.length + 1);
|
|
40
|
+
while (rightLines.length < targetHeight - 1) {
|
|
41
|
+
rightLines.push('');
|
|
42
|
+
}
|
|
43
|
+
rightLines.push(qrLabel);
|
|
44
|
+
const qrWidth = Math.max(qrLines[0]?.length || 0, qrLabel.length);
|
|
45
|
+
const leftWidth = Math.max(...leftLines.map(l => l.length), 35);
|
|
46
|
+
const totalWidth = leftWidth + qrWidth + 6;
|
|
47
|
+
const topBorder = '╔' + '═'.repeat(totalWidth - 2) + '╗';
|
|
48
|
+
const title = version ? `Claude Code Remote v${version}` : 'Claude Code Remote';
|
|
49
|
+
const titleLine = '║' + title.padStart(Math.floor((totalWidth - 2 + title.length) / 2)).padEnd(totalWidth - 2) + '║';
|
|
50
|
+
const sepLine = '╠' + '═'.repeat(leftWidth + 1) + '╤' + '═'.repeat(qrWidth + 2) + '╣';
|
|
51
|
+
const midSep = '╠' + '═'.repeat(leftWidth + 1) + '╧' + '═'.repeat(qrWidth + 2) + '╣';
|
|
52
|
+
const tokenLine = '║ ' + `Token: ${token}`.padEnd(totalWidth - 4) + ' ║';
|
|
53
|
+
const bottomBorder = '╚' + '═'.repeat(totalWidth - 2) + '╝';
|
|
54
|
+
process.stderr.write('\n');
|
|
55
|
+
process.stderr.write(topBorder + '\n');
|
|
56
|
+
process.stderr.write(titleLine + '\n');
|
|
57
|
+
process.stderr.write(sepLine + '\n');
|
|
58
|
+
const maxLines = Math.max(leftLines.length, rightLines.length);
|
|
59
|
+
for (let i = 0; i < maxLines; i++) {
|
|
60
|
+
const left = (leftLines[i] || '').padEnd(leftWidth);
|
|
61
|
+
let right;
|
|
62
|
+
if (i < qrLines.length && rightLines[i]) {
|
|
63
|
+
right = ` ${rightLines[i]} `.padEnd(qrWidth + 2);
|
|
64
|
+
}
|
|
65
|
+
else if (rightLines[i]) {
|
|
66
|
+
const centered = rightLines[i].padStart(Math.floor((qrWidth + rightLines[i].length) / 2)).padEnd(qrWidth);
|
|
67
|
+
right = ` ${centered} `;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
right = ' '.repeat(qrWidth + 2);
|
|
71
|
+
}
|
|
72
|
+
process.stderr.write(`║ ${left}│${right}║\n`);
|
|
73
|
+
}
|
|
74
|
+
process.stderr.write(midSep + '\n');
|
|
75
|
+
process.stderr.write(tokenLine + '\n');
|
|
76
|
+
// Warning section
|
|
77
|
+
if (warnings.length > 0) {
|
|
78
|
+
const warningSep = '╠' + '═'.repeat(totalWidth - 2) + '╣';
|
|
79
|
+
process.stderr.write(warningSep + '\n');
|
|
80
|
+
for (const warning of warnings) {
|
|
81
|
+
const warningLine = '║ ' + `⚠️ ${warning}`.padEnd(totalWidth - 4) + ' ║';
|
|
82
|
+
process.stderr.write(warningLine + '\n');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Exit hint
|
|
86
|
+
if (showExitHint) {
|
|
87
|
+
const exitSep = '╠' + '═'.repeat(totalWidth - 2) + '╣';
|
|
88
|
+
process.stderr.write(exitSep + '\n');
|
|
89
|
+
const exitLine = '║ ' + '💡 Press Ctrl+C twice to exit'.padEnd(totalWidth - 4) + ' ║';
|
|
90
|
+
process.stderr.write(exitLine + '\n');
|
|
91
|
+
}
|
|
92
|
+
process.stderr.write(bottomBorder + '\n');
|
|
93
|
+
process.stderr.write('\n');
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=banner.js.map
|