@xcanwin/manyoyo 4.0.0 → 4.0.2
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 +9 -5
- package/bin/manyoyo.js +22 -9
- package/config.example.json +1 -1
- package/lib/web/frontend/app.html +1 -1
- package/lib/web/server.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -46,8 +46,9 @@
|
|
|
46
46
|
```bash
|
|
47
47
|
npm install -g @xcanwin/manyoyo # 安装
|
|
48
48
|
podman pull ubuntu:24.04 # 仅 Podman 需要
|
|
49
|
-
manyoyo --ib --iv 1.7.
|
|
50
|
-
manyoyo -
|
|
49
|
+
manyoyo --ib --iv 1.7.4 # 构建镜像
|
|
50
|
+
manyoyo --init-config all # 从本机 Agent 配置迁移到 ~/.manyoyo
|
|
51
|
+
manyoyo -r claude # 使用迁移后的运行配置启动
|
|
51
52
|
```
|
|
52
53
|
|
|
53
54
|
注意:YOLO/SOLO 会跳过权限确认,请确保在可控环境中使用。
|
|
@@ -96,7 +97,7 @@ npm install -g @xcanwin/manyoyo
|
|
|
96
97
|
|
|
97
98
|
```bash
|
|
98
99
|
# 构建完整版本(推荐)
|
|
99
|
-
manyoyo --ib --iv 1.7.
|
|
100
|
+
manyoyo --ib --iv 1.7.4
|
|
100
101
|
|
|
101
102
|
# 构建精简版本
|
|
102
103
|
manyoyo --ib --iba TOOL=common
|
|
@@ -110,6 +111,9 @@ manyoyo --ib --iba TOOL=go,codex,java,gemini
|
|
|
110
111
|
## 常用命令
|
|
111
112
|
|
|
112
113
|
```bash
|
|
114
|
+
# 配置迁移(推荐首步)
|
|
115
|
+
manyoyo --init-config all
|
|
116
|
+
|
|
113
117
|
# 启动常见智能体
|
|
114
118
|
manyoyo -y c # Claude Code(或 claude / cc)
|
|
115
119
|
manyoyo -y gm # Gemini(或 gemini / g)
|
|
@@ -118,8 +122,8 @@ manyoyo -y oc # OpenCode(或 opencode)
|
|
|
118
122
|
|
|
119
123
|
# 容器管理
|
|
120
124
|
manyoyo -l
|
|
121
|
-
manyoyo -n
|
|
122
|
-
manyoyo -n
|
|
125
|
+
manyoyo -n my-dev -x /bin/bash
|
|
126
|
+
manyoyo -n my-dev --crm
|
|
123
127
|
manyoyo --server 3000
|
|
124
128
|
manyoyo --server 3000 --server-user admin --server-pass 123456
|
|
125
129
|
|
package/bin/manyoyo.js
CHANGED
|
@@ -26,6 +26,18 @@ function formatDate() {
|
|
|
26
26
|
return `${month}${day}-${hour}${minute}`;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
function detectCommandName() {
|
|
30
|
+
const rawArgv1 = process.argv[1] || '';
|
|
31
|
+
const baseName = path.basename(rawArgv1).replace(/\.(cjs|mjs|js)$/i, '');
|
|
32
|
+
|
|
33
|
+
if (baseName === 'docker-manyoyo') {
|
|
34
|
+
const pluginCommand = String(process.argv[2] || '').trim();
|
|
35
|
+
return pluginCommand || 'manyoyo';
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return baseName || 'manyoyo';
|
|
39
|
+
}
|
|
40
|
+
|
|
29
41
|
// ==============================================================================
|
|
30
42
|
// Configuration Constants
|
|
31
43
|
// ==============================================================================
|
|
@@ -38,7 +50,7 @@ const CONFIG = {
|
|
|
38
50
|
};
|
|
39
51
|
|
|
40
52
|
// Default configuration
|
|
41
|
-
let CONTAINER_NAME = `
|
|
53
|
+
let CONTAINER_NAME = `my-${formatDate()}`;
|
|
42
54
|
let HOST_PATH = process.cwd();
|
|
43
55
|
let CONTAINER_PATH = HOST_PATH;
|
|
44
56
|
let IMAGE_NAME = "localhost/xcanwin/manyoyo";
|
|
@@ -52,7 +64,7 @@ let IMAGE_BUILD_NEED = false;
|
|
|
52
64
|
let IMAGE_BUILD_ARGS = [];
|
|
53
65
|
let CONTAINER_ENVS = [];
|
|
54
66
|
let CONTAINER_VOLUMES = [];
|
|
55
|
-
let MANYOYO_NAME =
|
|
67
|
+
let MANYOYO_NAME = detectCommandName();
|
|
56
68
|
let CONT_MODE = "";
|
|
57
69
|
let CONT_MODE_ARGS = [];
|
|
58
70
|
let QUIET = {};
|
|
@@ -630,7 +642,7 @@ function collectOpenCodeInitData(homeDir) {
|
|
|
630
642
|
|
|
631
643
|
function writeInitEnvFile(filePath, keys, values) {
|
|
632
644
|
const lines = [
|
|
633
|
-
|
|
645
|
+
`# Auto-generated by ${MANYOYO_NAME} --init-config`,
|
|
634
646
|
'# Remove leading # and fill values if missing.',
|
|
635
647
|
''
|
|
636
648
|
];
|
|
@@ -993,7 +1005,7 @@ function showImagePullHint(err) {
|
|
|
993
1005
|
}
|
|
994
1006
|
const image = `${IMAGE_NAME}:${IMAGE_VERSION}`;
|
|
995
1007
|
console.log(`${YELLOW}💡 提示: 本地未找到镜像 ${image},并且从 localhost 注册表拉取失败。${NC}`);
|
|
996
|
-
console.log(`${YELLOW} 你可以: (1) 更新 ~/.manyoyo/manyoyo.json 的 imageVersion。 (2) 或先执行
|
|
1008
|
+
console.log(`${YELLOW} 你可以: (1) 更新 ~/.manyoyo/manyoyo.json 的 imageVersion。 (2) 或先执行 ${MANYOYO_NAME} --ib --iv <version> 构建镜像。${NC}`);
|
|
997
1009
|
}
|
|
998
1010
|
|
|
999
1011
|
function runCmd(cmd, args, options = {}) {
|
|
@@ -1354,7 +1366,7 @@ async function buildImage(IMAGE_BUILD_ARGS, imageName, imageVersion) {
|
|
|
1354
1366
|
execSync(buildCmd, { stdio: 'inherit' });
|
|
1355
1367
|
console.log(`\n${GREEN}✅ 镜像构建成功: ${fullImageTag}${NC}`);
|
|
1356
1368
|
console.log(`${BLUE}使用镜像:${NC}`);
|
|
1357
|
-
console.log(`
|
|
1369
|
+
console.log(` ${MANYOYO_NAME} -n test --in ${imageName} --iv ${version}-${imageTool} -y c`);
|
|
1358
1370
|
|
|
1359
1371
|
// Prune dangling images
|
|
1360
1372
|
pruneDanglingImages();
|
|
@@ -1393,17 +1405,18 @@ async function setupCommander() {
|
|
|
1393
1405
|
|
|
1394
1406
|
示例:
|
|
1395
1407
|
${MANYOYO_NAME} --ib --iv ${IMAGE_VERSION_BASE || "1.0.0"} 构建镜像
|
|
1408
|
+
${MANYOYO_NAME} --init-config all 从本机 Agent 配置初始化 ~/.manyoyo
|
|
1409
|
+
${MANYOYO_NAME} -r claude 使用初始化后的运行配置快速启动
|
|
1396
1410
|
${MANYOYO_NAME} -r c 使用 ~/.manyoyo/run/c.json 配置
|
|
1397
1411
|
${MANYOYO_NAME} -r codex --ss "resume --last" 使用命令后缀
|
|
1398
1412
|
${MANYOYO_NAME} -r ./myconfig.json 使用当前目录 ./myconfig.json 配置
|
|
1399
1413
|
${MANYOYO_NAME} -n test --ef claude -y c 使用 ~/.manyoyo/env/claude.env 环境变量文件
|
|
1400
1414
|
${MANYOYO_NAME} -n test --ef ./myenv.env -y c 使用当前目录 ./myenv.env 环境变量文件
|
|
1401
|
-
${MANYOYO_NAME} --init-config all 从本机 Agent 配置初始化 ~/.manyoyo
|
|
1402
1415
|
${MANYOYO_NAME} -n test -- -c 恢复之前会话
|
|
1403
1416
|
${MANYOYO_NAME} -x echo 123 指定命令执行
|
|
1404
1417
|
${MANYOYO_NAME} --server --server-user admin --server-pass 123456 启动带登录认证的网页服务
|
|
1405
1418
|
${MANYOYO_NAME} --server 3000 启动网页交互服务
|
|
1406
|
-
${MANYOYO_NAME} --server 0.0.0.0:3000
|
|
1419
|
+
${MANYOYO_NAME} --server 0.0.0.0:3000 监听全部网卡,便于局域网访问
|
|
1407
1420
|
${MANYOYO_NAME} -n test -q tip -q cmd 多次使用静默选项
|
|
1408
1421
|
`);
|
|
1409
1422
|
|
|
@@ -1420,6 +1433,7 @@ async function setupCommander() {
|
|
|
1420
1433
|
.option('--iv, --image-ver <version>', '指定镜像版本')
|
|
1421
1434
|
.option('--ib, --image-build', '构建镜像')
|
|
1422
1435
|
.option('--iba, --image-build-arg <arg>', '构建镜像时传参给dockerfile (可多次使用)', (value, previous) => [...(previous || []), value], [])
|
|
1436
|
+
.option('--init-config [agents]', '初始化 Agent 配置到 ~/.manyoyo (all 或逗号分隔: claude,codex,gemini,opencode)')
|
|
1423
1437
|
.option('--irm, --image-remove', '清理悬空镜像和 <none> 镜像')
|
|
1424
1438
|
.option('-e, --env <env>', '设置环境变量 XXX=YYY (可多次使用)', (value, previous) => [...(previous || []), value], [])
|
|
1425
1439
|
.option('--ef, --env-file <file>', '设置环境变量通过文件 (name → ~/.manyoyo/env/name.env, ./file.env → 当前目录文件)', (value, previous) => [...(previous || []), value], [])
|
|
@@ -1429,8 +1443,7 @@ async function setupCommander() {
|
|
|
1429
1443
|
.option('--ss, --shell-suffix <command>', '指定命令后缀 (追加到-s之后,等价于 -- <args>)')
|
|
1430
1444
|
.option('-x, --shell-full <command...>', '指定完整命令执行 (代替--sp和-s和--命令)')
|
|
1431
1445
|
.option('-y, --yolo <cli>', '使AGENT无需确认 (claude/c, gemini/gm, codex/cx, opencode/oc)')
|
|
1432
|
-
.option('--
|
|
1433
|
-
.option('--install <name>', '安装manyoyo命令 (docker-cli-plugin)')
|
|
1446
|
+
.option('--install <name>', `安装${MANYOYO_NAME}命令 (docker-cli-plugin)`)
|
|
1434
1447
|
.option('--show-config', '显示最终生效配置并退出')
|
|
1435
1448
|
.option('--show-command', '显示将执行的 docker run 命令并退出')
|
|
1436
1449
|
.option('--server [port]', '启动网页交互服务 (默认 127.0.0.1:3000,支持 host:port)')
|
package/config.example.json
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
>关闭</button>
|
|
26
26
|
</div>
|
|
27
27
|
<form class="new-session" id="newSessionForm">
|
|
28
|
-
<input id="newSessionName" placeholder="容器名 (例如
|
|
28
|
+
<input id="newSessionName" placeholder="容器名 (例如 my-dev)" />
|
|
29
29
|
<button type="submit">新建</button>
|
|
30
30
|
</form>
|
|
31
31
|
<div class="session-head">
|
package/lib/web/server.js
CHANGED
|
@@ -471,7 +471,7 @@ async function handleWebApi(req, res, pathname, ctx, state) {
|
|
|
471
471
|
const payload = await readJsonBody(req);
|
|
472
472
|
let containerName = (payload.name || '').trim();
|
|
473
473
|
if (!containerName) {
|
|
474
|
-
containerName = `
|
|
474
|
+
containerName = `my-${ctx.formatDate()}`;
|
|
475
475
|
}
|
|
476
476
|
if (!ctx.isValidContainerName(containerName)) {
|
|
477
477
|
sendJson(res, 400, { error: `containerName 非法: ${containerName}` });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xcanwin/manyoyo",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.2",
|
|
4
4
|
"imageVersion": "1.7.4",
|
|
5
5
|
"description": "AI Agent CLI Security Sandbox for Docker and Podman",
|
|
6
6
|
"keywords": [
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"main": "bin/manyoyo.js",
|
|
27
27
|
"bin": {
|
|
28
28
|
"manyoyo": "bin/manyoyo.js",
|
|
29
|
-
"
|
|
29
|
+
"my": "bin/manyoyo.js"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"install-link": "npm link",
|