@gird/ccli 2.18.0 → 2.20.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 +53 -2
- package/dist/agent/model-catalog.js +100 -0
- package/dist/agent/model-catalog.js.map +1 -0
- package/dist/agent/os.js +358 -0
- package/dist/agent/os.js.map +1 -0
- package/dist/cli/args/index.js +58 -0
- package/dist/cli/args/index.js.map +1 -1
- package/dist/cli/repl/index.js +5 -3
- package/dist/cli/repl/index.js.map +1 -1
- package/dist/cli/run/index.js +24 -15
- package/dist/cli/run/index.js.map +1 -1
- package/dist/cli/run/task.js +20 -1
- package/dist/cli/run/task.js.map +1 -1
- package/dist/cli/session/checkpoint.js +51 -34
- package/dist/cli/session/checkpoint.js.map +1 -1
- package/dist/cli/slash/config/account.js +82 -0
- package/dist/cli/slash/config/account.js.map +1 -0
- package/dist/cli/slash/config/alias.js +96 -0
- package/dist/cli/slash/config/alias.js.map +1 -0
- package/dist/cli/slash/config/login.js +80 -0
- package/dist/cli/slash/config/login.js.map +1 -0
- package/dist/cli/slash/config/model.js +74 -9
- package/dist/cli/slash/config/model.js.map +1 -1
- package/dist/cli/slash/config/models.js +45 -0
- package/dist/cli/slash/config/models.js.map +1 -0
- package/dist/cli/slash/index.js +17 -1
- package/dist/cli/slash/index.js.map +1 -1
- package/dist/cli/slash/system/agent.js +1 -1
- package/dist/cli/slash/system/agent.js.map +1 -1
- package/dist/cli/slash/system/compact.js +1 -1
- package/dist/cli/slash/system/compact.js.map +1 -1
- package/dist/cli/slash/system/goal.js +1 -1
- package/dist/cli/slash/system/goal.js.map +1 -1
- package/dist/cli/slash/system/help.js +4 -0
- package/dist/cli/slash/system/help.js.map +1 -1
- package/dist/cli/slash/system/plan.js +1 -1
- package/dist/cli/slash/system/plan.js.map +1 -1
- package/dist/cli/slash/system/revert.js +7 -5
- package/dist/cli/slash/system/revert.js.map +1 -1
- package/dist/cli/stats/index.js +6 -1
- package/dist/cli/stats/index.js.map +1 -1
- package/dist/cli/stats/usage.js +215 -0
- package/dist/cli/stats/usage.js.map +1 -0
- package/dist/config/config.js +223 -1
- package/dist/config/config.js.map +1 -1
- package/dist/config/credentials.js +104 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/harness/index.js +9 -1
- package/dist/harness/index.js.map +1 -1
- package/dist/index.js +41 -2
- package/dist/index.js.map +1 -1
- package/dist/server/index.js +338 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/sessions.js +181 -0
- package/dist/server/sessions.js.map +1 -0
- package/dist/server/webui.html +1341 -0
- package/dist/server/webui.js +12 -0
- package/dist/server/webui.js.map +1 -0
- package/dist/tools/{skill-tool.js → agent/skill-tool.js} +1 -1
- package/dist/tools/agent/skill-tool.js.map +1 -0
- package/dist/tools/{todo.js → agent/todo.js} +1 -1
- package/dist/tools/agent/todo.js.map +1 -0
- package/dist/tools/agent/web-fetch.js.map +1 -0
- package/dist/tools/{edit-file.js → fs/edit-file.js} +8 -8
- package/dist/tools/fs/edit-file.js.map +1 -0
- package/dist/tools/{glob.js → fs/glob.js} +40 -6
- package/dist/tools/fs/glob.js.map +1 -0
- package/dist/tools/{grep.js → fs/grep.js} +49 -9
- package/dist/tools/fs/grep.js.map +1 -0
- package/dist/tools/{list-dir.js → fs/list-dir.js} +13 -2
- package/dist/tools/fs/list-dir.js.map +1 -0
- package/dist/tools/{read-file.js → fs/read-file.js} +5 -3
- package/dist/tools/fs/read-file.js.map +1 -0
- package/dist/tools/{write-file.js → fs/write-file.js} +8 -8
- package/dist/tools/fs/write-file.js.map +1 -0
- package/dist/tools/index.js +11 -11
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/shared.js.map +1 -1
- package/dist/tools/{bash-background.js → shell/bash-background.js} +5 -6
- package/dist/tools/shell/bash-background.js.map +1 -0
- package/dist/tools/shell/bash-output.js.map +1 -0
- package/dist/tools/{bash.js → shell/bash.js} +6 -7
- package/dist/tools/shell/bash.js.map +1 -0
- package/dist/tools/shell/kill-bash.js.map +1 -0
- package/package.json +2 -2
- package/dist/tools/bash-background.js.map +0 -1
- package/dist/tools/bash-output.js.map +0 -1
- package/dist/tools/bash.js.map +0 -1
- package/dist/tools/edit-file.js.map +0 -1
- package/dist/tools/glob.js.map +0 -1
- package/dist/tools/grep.js.map +0 -1
- package/dist/tools/kill-bash.js.map +0 -1
- package/dist/tools/list-dir.js.map +0 -1
- package/dist/tools/read-file.js.map +0 -1
- package/dist/tools/skill-tool.js.map +0 -1
- package/dist/tools/todo.js.map +0 -1
- package/dist/tools/web-fetch.js.map +0 -1
- package/dist/tools/write-file.js.map +0 -1
- /package/dist/tools/{web-fetch.js → agent/web-fetch.js} +0 -0
- /package/dist/tools/{bash-output.js → shell/bash-output.js} +0 -0
- /package/dist/tools/{kill-bash.js → shell/kill-bash.js} +0 -0
package/README.md
CHANGED
|
@@ -24,6 +24,10 @@ ccli "用一句话介绍 CCLI" # 非交互式单次调用
|
|
|
24
24
|
cat file.ts | ccli "给这段代码加注释" # 从 stdin 读取内容作为上下文
|
|
25
25
|
ccli --yes "在当前目录创建 test.txt" # 自动确认破坏性工具调用
|
|
26
26
|
ccli --role coder "review 这段代码" # 使用 coding 角色单次调用
|
|
27
|
+
ccli serve # 启动本地 HTTP server + Web UI(默认 127.0.0.1:4000)
|
|
28
|
+
ccli plugin # 列出已安装的插件包
|
|
29
|
+
ccli --docker my-sandbox # 使用指定的 Docker 容器作为隔离运行沙箱
|
|
30
|
+
ccli --remote ssh://user@host # 使用指定的 SSH 远程连接进行开发
|
|
27
31
|
```
|
|
28
32
|
|
|
29
33
|
> ⚠️ `--yes` 会自动批准本次调用内**所有**需确认的工具调用(写文件、编辑文件、bash、MCP 工具),包括 `rm`、`git push` 这类高风险操作。请只在任务范围明确、且目录可丢弃或改动已提交时使用;拿不准就不加,逐项确认。
|
|
@@ -38,6 +42,51 @@ ccli --role coder "review 这段代码" # 使用 coding 角色单次调用
|
|
|
38
42
|
|
|
39
43
|
**技能(自定义提示词模板)**:在 `.ccli/skills/`(项目)或 `~/.ccli/skills/`(用户)放置 `*.md` 文件即可定义一个「技能」——一段可复用的提示词,支持 `$ARGUMENTS` 参数占位。用 `/skills` 列出、`/skill <名称> [参数]` 调用(会展开成一条消息交给 AI)。md 可带 `name` / `description` 的 YAML frontmatter;同名时项目技能覆盖用户技能。技能也可以是**目录技能包** `<名>/SKILL.md` + 附属文件(脚本/模板/资料,调用时告知模型路径供 `read_file`),嵌套 `SKILL.md` 成为**子技能**。除了手动 `/skill`,**模型也会在意图匹配时自动调用技能**(frontmatter 加 `disableModelInvocation: true` 可只保留手动调用)。
|
|
40
44
|
|
|
45
|
+
除了手动 `/skill`,**模型也会在意图匹配时自动调用技能**(frontmatter 加 `disableModelInvocation: true` 可只保留手动调用)。
|
|
46
|
+
|
|
47
|
+
## 插件包
|
|
48
|
+
|
|
49
|
+
比 skill 更大的扩展单元是**插件包**:一个目录 + `plugin.json`,把技能、MCP server、hooks 打包成一个可分发、可启停的整体。适合团队把「内部代码规范 + 文档 MCP + 审计 hook」一次分发。
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"name": "company-dev",
|
|
54
|
+
"version": "0.1.0",
|
|
55
|
+
"skills": ["skills/review.md"],
|
|
56
|
+
"mcpServers": {
|
|
57
|
+
"docs": { "command": "node", "args": ["server.js"] }
|
|
58
|
+
},
|
|
59
|
+
"hooks": [
|
|
60
|
+
{ "event": "PreToolUse", "matcher": "bash", "command": "echo 'audit'" }
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
ccli plugin list # 查看已安装插件
|
|
67
|
+
ccli plugin install ./plugins/company-dev # 安装到 ~/.ccli/plugins/
|
|
68
|
+
ccli plugin install ./p --project # 安装到项目级 .ccli/plugins/
|
|
69
|
+
ccli plugin enable company-dev # 重新启用
|
|
70
|
+
ccli plugin disable company-dev # 临时停用
|
|
71
|
+
ccli plugin uninstall company-dev # 卸载
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
安装后,插件里的技能以 `plugin` 来源混入技能列表,MCP server 与 hooks 自动折叠进当前会话配置,无需手动改 `config.json`。
|
|
75
|
+
|
|
76
|
+
## 本地 Server 与 Web UI
|
|
77
|
+
|
|
78
|
+
CCLI 可以作为一个本地服务运行,把交互式 Agent 能力通过 HTTP + SSE 暴露给浏览器或其他客户端:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
ccli serve # 默认 127.0.0.1:4000
|
|
82
|
+
ccli serve --port 8080 --token my-token
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- `POST /sessions` 创建会话,`GET /sessions/:id/stream` 通过 SSE 实时推送 `text_delta`、`tool_call`、`tool_result` 等事件。
|
|
86
|
+
- 破坏性工具(写文件、bash 等)会通过 `POST /sessions/:id/approvals` 等待客户端确认,安全阻塞。
|
|
87
|
+
- 内置轻量 Web UI,打开 `http://127.0.0.1:4000` 即可在浏览器里多轮对话、查看 Markdown 渲染与代码高亮、切换日/夜间主题、进行工具审批。
|
|
88
|
+
- 默认自动生成随机 16 位 token,所有 API 需要 `Authorization: Bearer <token>`。
|
|
89
|
+
|
|
41
90
|
进入对话后:
|
|
42
91
|
|
|
43
92
|
- 直接输入即与 AI 对话,模型会记住上文(多轮对话)。
|
|
@@ -48,9 +97,10 @@ ccli --role coder "review 这段代码" # 使用 coding 角色单次调用
|
|
|
48
97
|
- `write_file` 的内容会随模型生成**逐行实时流式**显示(`⚙ write_file …(生成中…)` 后一行行长出来,像看着模型写代码),不再等参数到齐才一次性铺出;`edit_file` 等工具仍走「摘要 + 折叠」。流式超过 40 行也会**自动停打**并显示「…(后续内容已折叠,按 ctrl+o 展开)」,在空闲提示符下按 `ctrl+o` 同样进入全屏可滚动查看器查看被隐藏的剩余行(主 / 子代理共用同一套,阈值与第 57 步折叠一致)。
|
|
49
98
|
- 多步骤任务时模型可用 `todo` 工具把任务拆成**待办清单**(`[x]` 完成 / `[>]` 进行中 / `[ ]` 待办,按状态上色),一眼看到总共几步、走到哪;无副作用、不需确认。待办面板**常驻在终端底部**(滚动区域法固定,不进全屏、保留 scrollback),todo 一更新立即重绘;非 TTY 时回退为回合末打印;子代理的待办与主会话隔离,各自展示;全部完成时回合结束自动清空,模型多轮不更新会收到系统提醒(引导重写或清空过时清单);不传 items 可只读查询当前清单,/compact 压缩后待办快照保留在摘要里。
|
|
50
99
|
- 模型可调用 `task` 工具把**独立子任务委派给子代理**:子代理用独立上下文 + 全套工具(读/写/编辑/搜索/bash)自行完成,完成后只把结论返回主代理,避免中间过程污染主对话;子代理共享主会话的确认/「始终允许」/token 统计,且**不可再调用 task 继续委派**(防递归);子代理的 `write_file` 同样**逐行实时流式**展示,与主代理观感一致;可用 `subagent_type` 选 `explore`(只读探索,仅 `read_file`/`list_dir`/`grep`/`bash_output`,执行层硬边界保证不能改文件)或 `code`(编码,除 `task` 外全套工具),省略则为通用子代理;子代理运行时的工具调用 / 结果 / 流式写入 / 结论都会**缩进成 ` │ ` 嵌套块**(开始 / 结束横幅顶格作边界),与主代理输出区分开,折叠块按 `ctrl+o` 展开时同样带缩进。
|
|
51
|
-
- `/
|
|
100
|
+
- `/undo [n]` 撤销最近 n 轮对话;写入/编辑文件前会自动建立**文件系统快照**,反悔时 `/revert` 可 diff 预览并选择按文件回滚(撤回 Agent 的文件改动,而不只是撤对话消息)。
|
|
101
|
+
- `/help` 查看可用命令,`/clear` 清空历史。
|
|
52
102
|
- `/compact` 把对话历史压缩成一段摘要,释放上下文(长对话逼近上限时用;仅在确有收益时替换)。上下文占比达到约 80% 时也会**自动压缩**。
|
|
53
|
-
- `/model [id]`
|
|
103
|
+
- `/model [id|alias]` 查看当前模型或切换到新模型(也支持 `/model vision` 这类别名,输入空参数只查看)。
|
|
54
104
|
- `/save [name]` 保存当前会话,`/load <name>` 加载会话(`Tab` 子串补全;多个候选时列出序号,输入数字即可加载),`/sessions` 列出已保存会话,`/delete <name>` 删除指定会话(需确认)。
|
|
55
105
|
- `/agent <任务描述>` 进入自动任务执行模式:AI 先制定计划,经你确认后自动调用工具逐步完成;待办清单未完成时,模型只输出过渡文字也不会提前收工,会被提醒继续执行(连续空转 3 次兜底放弃)。
|
|
56
106
|
- `/goal <任务> [| <完成条件>]` 进入目标执行模式:在 `/agent` 基础上,执行结束后再按完成条件做一次达成判定;完成条件可省略,省略时由规划阶段先补一条可检查条件。
|
|
@@ -64,6 +114,7 @@ ccli --role coder "review 这段代码" # 使用 coding 角色单次调用
|
|
|
64
114
|
- 粘贴多行文本时会自动合并成一条消息发送,不会被截断。
|
|
65
115
|
- 终端输出使用统一的语义化颜色(标签、警告、错误、Agent/Goal 进度等);设置 `NO_COLOR=1` 可关闭颜色,设置 `FORCE_COLOR=1` 可强制上色。
|
|
66
116
|
- 支持 MCP (Model Context Protocol) 扩展:在 `~/.ccli/config.json` 配置 `mcpServers` 即可接入外部 server 的工具。
|
|
117
|
+
- 支持**多模态图片输入**:在 prompt 里引用 `@图片.png`(相对/绝对路径),macOS 下也可直接按 `Ctrl-V` 粘贴剪贴板图片;模型不支持视觉时会自动降级为文字说明,避免浪费 token;发送前过大的图片会自动降分辨率(最长边 1024)。
|
|
67
118
|
- 退出时自动保存 `last` 恢复点;下次启动会询问是否恢复上次会话。
|
|
68
119
|
- 每个回合的执行过程(用户消息、模型回答、工具调用与结果、token 统计)会**自动记录**到 `~/.ccli/records/<sessionId>.jsonl`(本地只追加文件,可安全删除),用于复盘 agent 到底做了什么;task 子代理的内部过程也会记入同一文件(带 `subagent` 标记);启动时自动清理 30 天前或超出最近 50 个会话的旧记录。
|
|
69
120
|
- `/exit` 或 `/quit` 退出,也可按 Ctrl-C / Ctrl-D。
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模型目录缓存。
|
|
3
|
+
*
|
|
4
|
+
* 把当前 provider 的可用模型列表缓存到 `~/.ccli/model-cache.json`,
|
|
5
|
+
* 避免每次 `/model` / `/models` 都联网拉取。
|
|
6
|
+
*
|
|
7
|
+
* 缓存键为 `${provider}:${baseURL}`,区分同一个 provider 的不同兼容端点。
|
|
8
|
+
* 默认 TTL 24 小时;缓存缺失/过期/损坏时自动降级为实时拉取。
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, } from 'node:fs';
|
|
11
|
+
import { homedir } from 'node:os';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
/** 缓存文件路径:~/.ccli/model-cache.json(懒计算,方便测试注入 HOME)。 */
|
|
14
|
+
function cacheFile() {
|
|
15
|
+
return join(homedir(), '.ccli', 'model-cache.json');
|
|
16
|
+
}
|
|
17
|
+
/** 默认缓存有效期:24 小时。 */
|
|
18
|
+
export const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;
|
|
19
|
+
/**
|
|
20
|
+
* 计算缓存键。
|
|
21
|
+
* 同一个 provider 不同 baseURL(如 OpenAI 兼容服务)会分成不同桶,避免互相污染。
|
|
22
|
+
*/
|
|
23
|
+
export function cacheKey(provider, baseURL) {
|
|
24
|
+
return baseURL ? `${provider}:${baseURL}` : provider;
|
|
25
|
+
}
|
|
26
|
+
/** 读取缓存文件;不存在或损坏返回空对象。 */
|
|
27
|
+
function readCache() {
|
|
28
|
+
const path = cacheFile();
|
|
29
|
+
if (!existsSync(path))
|
|
30
|
+
return {};
|
|
31
|
+
try {
|
|
32
|
+
const raw = readFileSync(path, 'utf8');
|
|
33
|
+
if (!raw.trim())
|
|
34
|
+
return {};
|
|
35
|
+
const parsed = JSON.parse(raw);
|
|
36
|
+
return parsed && typeof parsed === 'object' ? parsed : {};
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** 写入缓存文件;失败静默(不阻断会话)。 */
|
|
43
|
+
function writeCache(cache) {
|
|
44
|
+
try {
|
|
45
|
+
mkdirSync(join(homedir(), '.ccli'), { recursive: true });
|
|
46
|
+
writeFileSync(cacheFile(), JSON.stringify(cache, null, 2) + '\n', 'utf8');
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// 缓存写入失败不抛错,下次直接联网拉取即可
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** 判断缓存条目是否在有效期内。 */
|
|
53
|
+
function isFresh(entry, ttlMs) {
|
|
54
|
+
if (!entry || !entry.cachedAt || !Array.isArray(entry.models)) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const cachedAt = new Date(entry.cachedAt).getTime();
|
|
59
|
+
return Number.isFinite(cachedAt) && Date.now() - cachedAt <= ttlMs;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 获取模型列表:优先读缓存,未命中/过期/刷新时调 AIClient.listModels() 并落盘。
|
|
67
|
+
*
|
|
68
|
+
* @param ai 当前 AI 客户端
|
|
69
|
+
* @param config provider 与 baseURL(来自 config)
|
|
70
|
+
* @param options refresh 强制刷新;ttlMs 自定义有效期
|
|
71
|
+
* @returns 模型 ID 列表
|
|
72
|
+
*/
|
|
73
|
+
export async function getCachedModels(ai, config, options = {}) {
|
|
74
|
+
const key = cacheKey(config.provider, config.baseURL);
|
|
75
|
+
const ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
|
|
76
|
+
const cache = readCache();
|
|
77
|
+
const entry = cache[key];
|
|
78
|
+
if (!options.refresh && isFresh(entry, ttlMs)) {
|
|
79
|
+
return entry.models;
|
|
80
|
+
}
|
|
81
|
+
const models = await ai.listModels();
|
|
82
|
+
cache[key] = { cachedAt: new Date().toISOString(), models };
|
|
83
|
+
writeCache(cache);
|
|
84
|
+
return models;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 强制清空模型缓存。
|
|
88
|
+
* - 不传参数:清空全部 provider。
|
|
89
|
+
* - 传 provider(和可选 baseURL):只清空对应桶。
|
|
90
|
+
*/
|
|
91
|
+
export function clearModelCache(provider, baseURL) {
|
|
92
|
+
if (!provider) {
|
|
93
|
+
writeCache({});
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const cache = readCache();
|
|
97
|
+
delete cache[cacheKey(provider, baseURL)];
|
|
98
|
+
writeCache(cache);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=model-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../../src/agent/model-catalog.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/os.js
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import childProcess from 'node:child_process';
|
|
2
|
+
import { promises as fsPromises, existsSync } from 'node:fs';
|
|
3
|
+
import { resolve as pathResolve, dirname as pathDirname, relative as pathRelative, join as pathJoin, sep as pathSep } from 'node:path';
|
|
4
|
+
export class LocalOS {
|
|
5
|
+
async exists(path) {
|
|
6
|
+
return existsSync(path);
|
|
7
|
+
}
|
|
8
|
+
async isDirectory(path) {
|
|
9
|
+
try {
|
|
10
|
+
const st = await fsPromises.stat(path);
|
|
11
|
+
return st.isDirectory();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async readFile(path, encoding = 'utf8') {
|
|
18
|
+
return fsPromises.readFile(path, encoding);
|
|
19
|
+
}
|
|
20
|
+
async writeFile(path, content, encoding = 'utf8') {
|
|
21
|
+
await fsPromises.writeFile(path, content, encoding);
|
|
22
|
+
}
|
|
23
|
+
async mkdir(path, options) {
|
|
24
|
+
await fsPromises.mkdir(path, { recursive: options?.recursive ?? true });
|
|
25
|
+
}
|
|
26
|
+
async readdir(path) {
|
|
27
|
+
const list = await fsPromises.readdir(path, { withFileTypes: true });
|
|
28
|
+
return list.map(entry => ({
|
|
29
|
+
name: entry.name,
|
|
30
|
+
isDirectory: () => entry.isDirectory()
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
async stat(path) {
|
|
34
|
+
const st = await fsPromises.stat(path);
|
|
35
|
+
return {
|
|
36
|
+
size: st.size,
|
|
37
|
+
isDirectory: () => st.isDirectory()
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async unlink(path) {
|
|
41
|
+
await fsPromises.unlink(path);
|
|
42
|
+
}
|
|
43
|
+
resolve(...paths) {
|
|
44
|
+
return pathResolve(...paths);
|
|
45
|
+
}
|
|
46
|
+
dirname(path) {
|
|
47
|
+
return pathDirname(path);
|
|
48
|
+
}
|
|
49
|
+
relative(from, to) {
|
|
50
|
+
return pathRelative(from, to);
|
|
51
|
+
}
|
|
52
|
+
join(...paths) {
|
|
53
|
+
return pathJoin(...paths);
|
|
54
|
+
}
|
|
55
|
+
get sep() {
|
|
56
|
+
return pathSep;
|
|
57
|
+
}
|
|
58
|
+
get defaultShell() {
|
|
59
|
+
return process.env.SHELL || '/bin/bash';
|
|
60
|
+
}
|
|
61
|
+
async spawn(command, args, options) {
|
|
62
|
+
const proc = childProcess.spawn(command, args, {
|
|
63
|
+
cwd: options?.cwd,
|
|
64
|
+
env: options?.env ?? process.env
|
|
65
|
+
});
|
|
66
|
+
return proc;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
import { posix } from 'node:path';
|
|
70
|
+
function runDockerCmd(args, stdinInput) {
|
|
71
|
+
return new Promise((resolve) => {
|
|
72
|
+
const proc = childProcess.spawn('docker', ['exec', ...args]);
|
|
73
|
+
let stdout = '';
|
|
74
|
+
let stderr = '';
|
|
75
|
+
proc.stdout.on('data', (data) => {
|
|
76
|
+
stdout += data.toString('utf8');
|
|
77
|
+
});
|
|
78
|
+
proc.stderr.on('data', (data) => {
|
|
79
|
+
stderr += data.toString('utf8');
|
|
80
|
+
});
|
|
81
|
+
proc.on('close', (code) => {
|
|
82
|
+
resolve({ stdout, stderr, code: code ?? 0 });
|
|
83
|
+
});
|
|
84
|
+
proc.on('error', (err) => {
|
|
85
|
+
resolve({ stdout, stderr: stderr + err.message, code: -1 });
|
|
86
|
+
});
|
|
87
|
+
if (stdinInput !== undefined) {
|
|
88
|
+
proc.stdin.write(stdinInput);
|
|
89
|
+
proc.stdin.end();
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export class DockerOS {
|
|
94
|
+
container;
|
|
95
|
+
constructor(container) {
|
|
96
|
+
this.container = container;
|
|
97
|
+
}
|
|
98
|
+
async exists(path) {
|
|
99
|
+
const { code } = await runDockerCmd([this.container, 'test', '-e', path]);
|
|
100
|
+
return code === 0;
|
|
101
|
+
}
|
|
102
|
+
async isDirectory(path) {
|
|
103
|
+
const { code } = await runDockerCmd([this.container, 'test', '-d', path]);
|
|
104
|
+
return code === 0;
|
|
105
|
+
}
|
|
106
|
+
async readFile(path, _encoding = 'utf8') {
|
|
107
|
+
const { stdout, code, stderr } = await runDockerCmd([this.container, 'cat', path]);
|
|
108
|
+
if (code !== 0) {
|
|
109
|
+
throw new Error(`Failed to read file ${path} inside docker: ${stderr}`);
|
|
110
|
+
}
|
|
111
|
+
return stdout;
|
|
112
|
+
}
|
|
113
|
+
async writeFile(path, content, _encoding = 'utf8') {
|
|
114
|
+
const { code, stderr } = await runDockerCmd(['-i', this.container, 'dd', `of=${path}`], content);
|
|
115
|
+
if (code !== 0) {
|
|
116
|
+
throw new Error(`Failed to write file ${path} inside docker: ${stderr}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async mkdir(path, options) {
|
|
120
|
+
const args = [this.container, 'mkdir'];
|
|
121
|
+
if (options?.recursive ?? true) {
|
|
122
|
+
args.push('-p');
|
|
123
|
+
}
|
|
124
|
+
args.push(path);
|
|
125
|
+
const { code, stderr } = await runDockerCmd(args);
|
|
126
|
+
if (code !== 0) {
|
|
127
|
+
throw new Error(`Failed to mkdir ${path} inside docker: ${stderr}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async readdir(path) {
|
|
131
|
+
const { stdout, code, stderr } = await runDockerCmd([this.container, 'ls', '-A', '-1', '-p', path]);
|
|
132
|
+
if (code !== 0) {
|
|
133
|
+
throw new Error(`Failed to readdir ${path} inside docker: ${stderr}`);
|
|
134
|
+
}
|
|
135
|
+
const lines = stdout.split('\n').map(l => l.trim()).filter(Boolean);
|
|
136
|
+
return lines.map(line => {
|
|
137
|
+
const isDir = line.endsWith('/');
|
|
138
|
+
const name = isDir ? line.slice(0, -1) : line;
|
|
139
|
+
return {
|
|
140
|
+
name,
|
|
141
|
+
isDirectory: () => isDir
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async stat(path) {
|
|
146
|
+
const sizeRes = await runDockerCmd([this.container, 'stat', '-c', '%s', path]);
|
|
147
|
+
if (sizeRes.code !== 0) {
|
|
148
|
+
throw new Error(`Failed to stat ${path} inside docker: ${sizeRes.stderr}`);
|
|
149
|
+
}
|
|
150
|
+
const size = parseInt(sizeRes.stdout.trim(), 10);
|
|
151
|
+
const isDir = await this.isDirectory(path);
|
|
152
|
+
return {
|
|
153
|
+
size: isNaN(size) ? 0 : size,
|
|
154
|
+
isDirectory: () => isDir
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
async unlink(path) {
|
|
158
|
+
const { code, stderr } = await runDockerCmd([this.container, 'rm', '-f', path]);
|
|
159
|
+
if (code !== 0) {
|
|
160
|
+
throw new Error(`Failed to unlink ${path} inside docker: ${stderr}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
resolve(...paths) {
|
|
164
|
+
return posix.resolve(...paths);
|
|
165
|
+
}
|
|
166
|
+
dirname(path) {
|
|
167
|
+
return posix.dirname(path);
|
|
168
|
+
}
|
|
169
|
+
relative(from, to) {
|
|
170
|
+
return posix.relative(from, to);
|
|
171
|
+
}
|
|
172
|
+
join(...paths) {
|
|
173
|
+
return posix.join(...paths);
|
|
174
|
+
}
|
|
175
|
+
get sep() {
|
|
176
|
+
return '/';
|
|
177
|
+
}
|
|
178
|
+
get defaultShell() {
|
|
179
|
+
return '/bin/sh';
|
|
180
|
+
}
|
|
181
|
+
async spawn(command, args, options) {
|
|
182
|
+
const dockerArgs = ['exec'];
|
|
183
|
+
if (options?.cwd) {
|
|
184
|
+
dockerArgs.push('-w', options.cwd);
|
|
185
|
+
}
|
|
186
|
+
if (options?.env) {
|
|
187
|
+
for (const [k, v] of Object.entries(options.env)) {
|
|
188
|
+
if (v !== undefined) {
|
|
189
|
+
dockerArgs.push('-e', `${k}=${v}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
dockerArgs.push(this.container, command, ...args);
|
|
194
|
+
const proc = childProcess.spawn('docker', dockerArgs);
|
|
195
|
+
return proc;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
export function parseSshUrl(url) {
|
|
199
|
+
const cleaned = url.startsWith('ssh://') ? url.slice(6) : url;
|
|
200
|
+
const atIdx = cleaned.indexOf('@');
|
|
201
|
+
if (atIdx === -1) {
|
|
202
|
+
throw new Error(`Invalid SSH URL: ${url}. Missing 'user@host' format.`);
|
|
203
|
+
}
|
|
204
|
+
const user = cleaned.slice(0, atIdx);
|
|
205
|
+
const remaining = cleaned.slice(atIdx + 1);
|
|
206
|
+
const colonIdx = remaining.lastIndexOf(':');
|
|
207
|
+
if (colonIdx === -1) {
|
|
208
|
+
return { user, host: remaining };
|
|
209
|
+
}
|
|
210
|
+
const host = remaining.slice(0, colonIdx);
|
|
211
|
+
const portStr = remaining.slice(colonIdx + 1);
|
|
212
|
+
const port = parseInt(portStr, 10);
|
|
213
|
+
if (isNaN(port)) {
|
|
214
|
+
return { user, host };
|
|
215
|
+
}
|
|
216
|
+
return { user, host, port };
|
|
217
|
+
}
|
|
218
|
+
function escapeShellArg(arg) {
|
|
219
|
+
return `'` + arg.replace(/'/g, `'"'"`) + `'`;
|
|
220
|
+
}
|
|
221
|
+
function runSshCmd(sshConfig, remoteCmd, stdinInput) {
|
|
222
|
+
return new Promise((resolve) => {
|
|
223
|
+
const sshArgs = [];
|
|
224
|
+
if (sshConfig.port !== undefined) {
|
|
225
|
+
sshArgs.push('-p', String(sshConfig.port));
|
|
226
|
+
}
|
|
227
|
+
sshArgs.push('-T', `${sshConfig.user}@${sshConfig.host}`, remoteCmd);
|
|
228
|
+
const proc = childProcess.spawn('ssh', sshArgs);
|
|
229
|
+
let stdout = '';
|
|
230
|
+
let stderr = '';
|
|
231
|
+
proc.stdout.on('data', (data) => {
|
|
232
|
+
stdout += data.toString('utf8');
|
|
233
|
+
});
|
|
234
|
+
proc.stderr.on('data', (data) => {
|
|
235
|
+
stderr += data.toString('utf8');
|
|
236
|
+
});
|
|
237
|
+
proc.on('close', (code) => {
|
|
238
|
+
resolve({ stdout, stderr, code: code ?? 0 });
|
|
239
|
+
});
|
|
240
|
+
proc.on('error', (err) => {
|
|
241
|
+
resolve({ stdout, stderr: stderr + err.message, code: -1 });
|
|
242
|
+
});
|
|
243
|
+
if (stdinInput !== undefined) {
|
|
244
|
+
proc.stdin.write(stdinInput);
|
|
245
|
+
proc.stdin.end();
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
export class SshOS {
|
|
250
|
+
url;
|
|
251
|
+
sshConfig;
|
|
252
|
+
constructor(url) {
|
|
253
|
+
this.url = url;
|
|
254
|
+
this.sshConfig = parseSshUrl(url);
|
|
255
|
+
}
|
|
256
|
+
async exists(path) {
|
|
257
|
+
const { code } = await runSshCmd(this.sshConfig, `test -e ${escapeShellArg(path)}`);
|
|
258
|
+
return code === 0;
|
|
259
|
+
}
|
|
260
|
+
async isDirectory(path) {
|
|
261
|
+
const { code } = await runSshCmd(this.sshConfig, `test -d ${escapeShellArg(path)}`);
|
|
262
|
+
return code === 0;
|
|
263
|
+
}
|
|
264
|
+
async readFile(path, _encoding = 'utf8') {
|
|
265
|
+
const { stdout, code, stderr } = await runSshCmd(this.sshConfig, `cat ${escapeShellArg(path)}`);
|
|
266
|
+
if (code !== 0) {
|
|
267
|
+
throw new Error(`Failed to read file ${path} via SSH: ${stderr}`);
|
|
268
|
+
}
|
|
269
|
+
return stdout;
|
|
270
|
+
}
|
|
271
|
+
async writeFile(path, content, _encoding = 'utf8') {
|
|
272
|
+
const { code, stderr } = await runSshCmd(this.sshConfig, `dd of=${escapeShellArg(path)}`, content);
|
|
273
|
+
if (code !== 0) {
|
|
274
|
+
throw new Error(`Failed to write file ${path} via SSH: ${stderr}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
async mkdir(path, options) {
|
|
278
|
+
const { code, stderr } = await runSshCmd(this.sshConfig, `mkdir ${options?.recursive ?? true ? '-p' : ''} ${escapeShellArg(path)}`);
|
|
279
|
+
if (code !== 0) {
|
|
280
|
+
throw new Error(`Failed to mkdir ${path} via SSH: ${stderr}`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
async readdir(path) {
|
|
284
|
+
const { stdout, code, stderr } = await runSshCmd(this.sshConfig, `ls -A -1 -p ${escapeShellArg(path)}`);
|
|
285
|
+
if (code !== 0) {
|
|
286
|
+
throw new Error(`Failed to readdir ${path} via SSH: ${stderr}`);
|
|
287
|
+
}
|
|
288
|
+
const lines = stdout.split('\n').map(l => l.trim()).filter(Boolean);
|
|
289
|
+
return lines.map(line => {
|
|
290
|
+
const isDir = line.endsWith('/');
|
|
291
|
+
const name = isDir ? line.slice(0, -1) : line;
|
|
292
|
+
return {
|
|
293
|
+
name,
|
|
294
|
+
isDirectory: () => isDir
|
|
295
|
+
};
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
async stat(path) {
|
|
299
|
+
const sizeRes = await runSshCmd(this.sshConfig, `stat -c "%s" ${escapeShellArg(path)}`);
|
|
300
|
+
if (sizeRes.code !== 0) {
|
|
301
|
+
throw new Error(`Failed to stat ${path} via SSH: ${sizeRes.stderr}`);
|
|
302
|
+
}
|
|
303
|
+
const size = parseInt(sizeRes.stdout.trim(), 10);
|
|
304
|
+
const isDir = await this.isDirectory(path);
|
|
305
|
+
return {
|
|
306
|
+
size: isNaN(size) ? 0 : size,
|
|
307
|
+
isDirectory: () => isDir
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
async unlink(path) {
|
|
311
|
+
const { code, stderr } = await runSshCmd(this.sshConfig, `rm -f ${escapeShellArg(path)}`);
|
|
312
|
+
if (code !== 0) {
|
|
313
|
+
throw new Error(`Failed to unlink ${path} via SSH: ${stderr}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
resolve(...paths) {
|
|
317
|
+
return posix.resolve(...paths);
|
|
318
|
+
}
|
|
319
|
+
dirname(path) {
|
|
320
|
+
return posix.dirname(path);
|
|
321
|
+
}
|
|
322
|
+
relative(from, to) {
|
|
323
|
+
return posix.relative(from, to);
|
|
324
|
+
}
|
|
325
|
+
join(...paths) {
|
|
326
|
+
return posix.join(...paths);
|
|
327
|
+
}
|
|
328
|
+
get sep() {
|
|
329
|
+
return '/';
|
|
330
|
+
}
|
|
331
|
+
get defaultShell() {
|
|
332
|
+
return '/bin/sh';
|
|
333
|
+
}
|
|
334
|
+
async spawn(command, args, options) {
|
|
335
|
+
const sshArgs = [];
|
|
336
|
+
if (this.sshConfig.port !== undefined) {
|
|
337
|
+
sshArgs.push('-p', String(this.sshConfig.port));
|
|
338
|
+
}
|
|
339
|
+
sshArgs.push('-t', `${this.sshConfig.user}@${this.sshConfig.host}`);
|
|
340
|
+
let envPrefix = '';
|
|
341
|
+
if (options?.env) {
|
|
342
|
+
for (const [k, v] of Object.entries(options.env)) {
|
|
343
|
+
if (v !== undefined) {
|
|
344
|
+
envPrefix += `export ${k}=${escapeShellArg(v)} && `;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
let remoteCmd = '';
|
|
349
|
+
if (options?.cwd) {
|
|
350
|
+
remoteCmd += `cd ${escapeShellArg(options.cwd)} && `;
|
|
351
|
+
}
|
|
352
|
+
remoteCmd += `${command} ${args.map(escapeShellArg).join(' ')}`;
|
|
353
|
+
sshArgs.push(envPrefix + remoteCmd);
|
|
354
|
+
const proc = childProcess.spawn('ssh', sshArgs);
|
|
355
|
+
return proc;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=os.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"os.js","sourceRoot":"","sources":["../../src/agent/os.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/args/index.js
CHANGED
|
@@ -35,6 +35,64 @@ export function parseArgs(argv) {
|
|
|
35
35
|
case '--project':
|
|
36
36
|
result.project = true;
|
|
37
37
|
break;
|
|
38
|
+
case '--docker': {
|
|
39
|
+
const next = argv[i + 1];
|
|
40
|
+
if (next && !next.startsWith('-')) {
|
|
41
|
+
result.docker = next;
|
|
42
|
+
i++;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
result.unknown.push(arg);
|
|
46
|
+
}
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case '--remote': {
|
|
50
|
+
const next = argv[i + 1];
|
|
51
|
+
if (next && !next.startsWith('-')) {
|
|
52
|
+
result.remote = next;
|
|
53
|
+
i++;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
result.unknown.push(arg);
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case '--port': {
|
|
61
|
+
const next = argv[i + 1];
|
|
62
|
+
const n = Number(next);
|
|
63
|
+
if (next && Number.isInteger(n) && n >= 0 && n <= 65535) {
|
|
64
|
+
result.port = n;
|
|
65
|
+
i++;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
result.unknown.push(arg);
|
|
69
|
+
}
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
case '-t':
|
|
73
|
+
case '--token': {
|
|
74
|
+
const next = argv[i + 1];
|
|
75
|
+
if (next && !next.startsWith('-')) {
|
|
76
|
+
result.token = next;
|
|
77
|
+
i++;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
result.unknown.push(arg);
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
case '-H':
|
|
85
|
+
case '--host': {
|
|
86
|
+
const next = argv[i + 1];
|
|
87
|
+
if (next && !next.startsWith('-')) {
|
|
88
|
+
result.host = next;
|
|
89
|
+
i++;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
result.unknown.push(arg);
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
38
96
|
case '-r':
|
|
39
97
|
case '--role': {
|
|
40
98
|
const next = argv[i + 1];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/args/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/args/index.ts"],"names":[],"mappings":"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"}
|