@xcanwin/manyoyo 3.5.2 → 3.5.7

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 CHANGED
@@ -97,6 +97,9 @@ manyoyo -n test --crm
97
97
 
98
98
  # 清理悬空镜像和 <none> 镜像
99
99
  manyoyo --irm
100
+
101
+ # 静默显示执行命令
102
+ manyoyo -q full -x echo "hello world"
100
103
  ```
101
104
 
102
105
  ### 环境变量
@@ -197,10 +200,10 @@ docker ps -a # 现在可以在容器内使用 docker 命令
197
200
 
198
201
  | 选项 | 别名 | 描述 |
199
202
  |------|------|------|
200
- | `-l` | `--ls`, `--list` | 列出所有 manyoyo 容器 |
201
203
  | `--hp PATH` | `--host-path` | 设置宿主机工作目录(默认:当前路径) |
202
204
  | `-n NAME` | `--cn`, `--cont-name` | 设置容器名称 |
203
205
  | `--cp PATH` | `--cont-path` | 设置容器工作目录 |
206
+ | `-l` | `--cl`, `--cont-list` | 列出所有 manyoyo 容器 |
204
207
  | `--crm` | `--cont-remove` | 删除容器 |
205
208
  | `-m MODE` | `--cm`, `--cont-mode` | 设置容器模式(common, dind, sock) |
206
209
  | `--in NAME` | `--image-name` | 指定镜像名称 |
@@ -217,6 +220,7 @@ docker ps -a # 现在可以在容器内使用 docker 命令
217
220
  | `-x CMD` | `--sf`, `--shell-full` | 完整命令(替代 --sp, -s 和 --) |
218
221
  | `-y CLI` | `--yolo` | 无需确认运行 AI 智能体 |
219
222
  | `--install NAME` | | 安装 manyoyo 命令 |
223
+ | `-q LIST` | `--quiet` | 静默显示 |
220
224
  | `-V` | `--version` | 显示版本 |
221
225
  | `-h` | `--help` | 显示帮助 |
222
226
 
package/bin/manyoyo.js CHANGED
@@ -37,6 +37,7 @@ let CONTAINER_ENVS = [];
37
37
  let CONTAINER_VOLUMES = [];
38
38
  let MANYOYO_NAME = "manyoyo";
39
39
  let CONT_MODE = "";
40
+ let QUIET = {};
40
41
 
41
42
  // Color definitions using ANSI codes
42
43
  const RED = '\x1b[0;31m';
@@ -70,10 +71,10 @@ function showHelp() {
70
71
  console.log(` ${MANYOYO_NAME} [--hp HOST_PATH] [-n CONTAINER_NAME] [--cp CONTAINER_PATH] [--ef ENV_FILE] [--sp COMMAND] [-s COMMAND] [-- COMMAND]`);
71
72
  console.log("");
72
73
  console.log(`${BLUE}Options:${NC}`);
73
- console.log(" -l|--ls|--list 列举容器");
74
74
  console.log(" --hp|--host-path PATH 设置宿主机工作目录 (默认当前路径)");
75
75
  console.log(" -n|--cn|--cont-name NAME 设置容器名称");
76
76
  console.log(" --cp|--cont-path PATH 设置容器工作目录");
77
+ console.log(" -l|--cl|--cont-list 列举容器");
77
78
  console.log(" --crm|--cont-remove 删除-n指定容器");
78
79
  console.log(" -m|--cm|--cont-mode STRING 设置容器嵌套容器模式");
79
80
  console.log(" 例如 common, dind, sock");
@@ -93,6 +94,8 @@ function showHelp() {
93
94
  console.log(" 例如 claude / c, gemini / gm, codex / cx, opencode / oc");
94
95
  console.log(" --install NAME 安装manyoyo命令");
95
96
  console.log(" 例如 docker-cli-plugin");
97
+ console.log(" -q|--quiet LIST 静默显示");
98
+ console.log(" 例如 cnew,crm,tip,cmd,full");
96
99
  console.log(" -V|--version 显示版本");
97
100
  console.log(" -h|--help 显示帮助");
98
101
  console.log("");
@@ -110,14 +113,43 @@ function showVersion() {
110
113
  }
111
114
 
112
115
  function getHelloTip(containerName, defaultCommand) {
113
- console.log(`${BLUE}----------------------------------------${NC}`);
114
- console.log(`📦 首次命令 : ${defaultCommand}`);
115
- console.log(`⚫ 恢复首次命令会话: ${CYAN}${MANYOYO_NAME} -n ${containerName} -- -c${NC}`);
116
- console.log(`⚫ 执行首次命令 : ${GREEN}${MANYOYO_NAME} -n ${containerName}${NC}`);
117
- console.log(`⚫ 执行指定命令 : ${GREEN}${MANYOYO_NAME} -n ${containerName} -x /bin/bash${NC}`);
118
- console.log(`⚫ 执行指定命令 : ${GREEN}docker exec -it ${containerName} /bin/bash${NC}`);
119
- console.log(`⚫ 删除容器 : ${MANYOYO_NAME} -n ${containerName} --crm`);
120
- console.log("");
116
+ if ( !(QUIET.tip || QUIET.full) ) {
117
+ console.log("");
118
+ console.log(`${BLUE}----------------------------------------${NC}`);
119
+ console.log(`📦 首次命令 : ${defaultCommand}`);
120
+ console.log(`⚫ 恢复首次命令会话: ${CYAN}${MANYOYO_NAME} -n ${containerName} -- -c${NC}`);
121
+ console.log(`⚫ 执行首次命令 : ${GREEN}${MANYOYO_NAME} -n ${containerName}${NC}`);
122
+ console.log(`⚫ 执行指定命令 : ${GREEN}${MANYOYO_NAME} -n ${containerName} -x /bin/bash${NC}`);
123
+ console.log(`⚫ 执行指定命令 : ${GREEN}docker exec -it ${containerName} /bin/bash${NC}`);
124
+ console.log(`⚫ 删除容器 : ${MANYOYO_NAME} -n ${containerName} --crm`);
125
+ console.log("");
126
+ }
127
+ }
128
+
129
+ function setQuiet(action) {
130
+ action.split(',').forEach(ac => {
131
+ switch (ac) {
132
+ case 'cnew':
133
+ QUIET.cnew = 1;
134
+ break;
135
+ case 'crm':
136
+ QUIET.crm = 1;
137
+ break;
138
+ case 'tip':
139
+ QUIET.tip = 1;
140
+ break;
141
+ case 'askkeep':
142
+ QUIET.askkeep = 1;
143
+ break;
144
+ case 'cmd':
145
+ QUIET.cmd = 1;
146
+ break;
147
+ case 'full':
148
+ QUIET.full = 1;
149
+ break;
150
+ }
151
+ });
152
+ // process.exit(0);
121
153
  }
122
154
 
123
155
  async function askQuestion(prompt) {
@@ -252,9 +284,9 @@ function getContainerStatus(name) {
252
284
  }
253
285
 
254
286
  function removeContainer(name) {
255
- console.log(`${YELLOW}🗑️ 正在删除容器: ${name}...${NC}`);
287
+ if ( !(QUIET.crm || QUIET.full) ) console.log(`${YELLOW}🗑️ 正在删除容器: ${name}...${NC}`);
256
288
  dockerExec(`${DOCKER_CMD} rm -f "${name}"`, { stdio: 'pipe' });
257
- console.log(`${GREEN}✅ 已彻底删除。${NC}`);
289
+ if ( !(QUIET.crm || QUIET.full) ) console.log(`${GREEN}✅ 已彻底删除。${NC}`);
258
290
  }
259
291
 
260
292
  // ==============================================================================
@@ -572,11 +604,11 @@ function parseArguments(argv) {
572
604
  const arg = args[i];
573
605
 
574
606
  switch (arg) {
575
- case '-l':
576
- case '--ls':
577
- case '--list':
578
- getContList();
579
- process.exit(0);
607
+ case '-q':
608
+ case '--quiet':
609
+ setQuiet(args[i + 1]);
610
+ i += 2;
611
+ break;
580
612
 
581
613
  case '--hp':
582
614
  case '--host-path':
@@ -597,6 +629,12 @@ function parseArguments(argv) {
597
629
  i += 2;
598
630
  break;
599
631
 
632
+ case '-l':
633
+ case '--cl':
634
+ case '--cont-list':
635
+ getContList();
636
+ process.exit(0);
637
+
600
638
  case '--crm':
601
639
  case '--cont-remove':
602
640
  SHOULD_REMOVE = true;
@@ -772,7 +810,7 @@ async function waitForContainerReady(containerName) {
772
810
  }
773
811
 
774
812
  async function createNewContainer() {
775
- console.log(`${CYAN}📦 manyoyo by xcanwin 正在创建新容器: ${YELLOW}${CONTAINER_NAME}${NC}\n`);
813
+ if ( !(QUIET.cnew || QUIET.full) ) console.log(`${CYAN}📦 manyoyo by xcanwin 正在创建新容器: ${YELLOW}${CONTAINER_NAME}${NC}`);
776
814
 
777
815
  EXEC_COMMAND = `${EXEC_COMMAND_PREFIX}${EXEC_COMMAND}${EXEC_COMMAND_SUFFIX}`;
778
816
  const defaultCommand = EXEC_COMMAND;
@@ -794,7 +832,7 @@ async function createNewContainer() {
794
832
  }
795
833
 
796
834
  async function connectExistingContainer() {
797
- console.log(`${CYAN}🔄 manyoyo by xcanwin 正在连接到现有容器: ${YELLOW}${CONTAINER_NAME}${NC}`);
835
+ if ( !(QUIET.cnew || QUIET.full) ) console.log(`${CYAN}🔄 manyoyo by xcanwin 正在连接到现有容器: ${YELLOW}${CONTAINER_NAME}${NC}`);
798
836
 
799
837
  // Start container if stopped
800
838
  const status = getContainerStatus(CONTAINER_NAME);
@@ -824,8 +862,10 @@ async function setupContainer() {
824
862
 
825
863
  function executeInContainer(defaultCommand) {
826
864
  getHelloTip(CONTAINER_NAME, defaultCommand);
827
- console.log(`${BLUE}----------------------------------------${NC}`);
828
- console.log(`💻 执行命令: ${YELLOW}${EXEC_COMMAND || '交互式 Shell'}${NC}`);
865
+ if ( !(QUIET.cmd || QUIET.full) ) {
866
+ console.log(`${BLUE}----------------------------------------${NC}`);
867
+ console.log(`💻 执行命令: ${YELLOW}${EXEC_COMMAND || '交互式 Shell'}${NC}`);
868
+ }
829
869
 
830
870
  // Execute command in container
831
871
  if (EXEC_COMMAND) {
@@ -836,18 +876,18 @@ function executeInContainer(defaultCommand) {
836
876
  }
837
877
 
838
878
  async function handlePostExit(defaultCommand) {
839
- console.log("");
840
879
  getHelloTip(CONTAINER_NAME, defaultCommand);
841
880
 
842
- const reply = await askQuestion(`❔ 会话已结束。是否保留此后台容器 ${CONTAINER_NAME}? [ y=默认保留, n=删除, 1=首次命令进入, x=执行命令, i=交互式SHELL ]: `);
843
- console.log("");
881
+ let tipAskKeep = `❔ 会话已结束。是否保留此后台容器 ${CONTAINER_NAME}? [ y=默认保留, n=删除, 1=首次命令进入, x=执行命令, i=交互式SHELL ]: `;
882
+ if ( QUIET.askkeep || QUIET.full ) tipAskKeep = `保留容器吗? [y n 1 x i] `;
883
+ const reply = await askQuestion(tipAskKeep);
844
884
 
845
885
  const firstChar = reply.trim().toLowerCase()[0];
846
886
 
847
887
  if (firstChar === 'n') {
848
888
  removeContainer(CONTAINER_NAME);
849
889
  } else if (firstChar === '1') {
850
- console.log(`${GREEN}✅ 离开当前连接,用首次命令进入。${NC}`);
890
+ if ( !(QUIET.full) ) console.log(`${GREEN}✅ 离开当前连接,用首次命令进入。${NC}`);
851
891
  // Reset command variables to use default command
852
892
  EXEC_COMMAND = "";
853
893
  EXEC_COMMAND_PREFIX = "";
@@ -857,12 +897,12 @@ async function handlePostExit(defaultCommand) {
857
897
  await main();
858
898
  } else if (firstChar === 'x') {
859
899
  const command = await askQuestion('❔ 输入要执行的命令: ');
860
- console.log(`${GREEN}✅ 离开当前连接,执行命令。${NC}`);
900
+ if ( !(QUIET.cmd || QUIET.full) ) console.log(`${GREEN}✅ 离开当前连接,执行命令。${NC}`);
861
901
  const newArgs = ['-n', CONTAINER_NAME, '-x', command];
862
902
  process.argv = [process.argv[0], process.argv[1], ...newArgs];
863
903
  await main();
864
904
  } else if (firstChar === 'i') {
865
- console.log(`${GREEN}✅ 离开当前连接,进入容器交互式SHELL。${NC}`);
905
+ if ( !(QUIET.full) ) console.log(`${GREEN}✅ 离开当前连接,进入容器交互式SHELL。${NC}`);
866
906
  const newArgs = ['-n', CONTAINER_NAME, '-x', '/bin/bash'];
867
907
  process.argv = [process.argv[0], process.argv[1], ...newArgs];
868
908
  await main();
package/docs/README_EN.md CHANGED
@@ -97,6 +97,9 @@ manyoyo -n test --crm
97
97
 
98
98
  # Clean dangling images and <none> images
99
99
  manyoyo --irm
100
+
101
+ # Execute custom command with quiet output
102
+ manyoyo -q full -x echo "hello world"
100
103
  ```
101
104
 
102
105
  ### Environment Variables
@@ -197,10 +200,10 @@ docker ps -a # Now you can use docker commands inside the container
197
200
 
198
201
  | Option | Aliases | Description |
199
202
  |--------|---------|-------------|
200
- | `-l` | `--ls`, `--list` | List all manyoyo containers |
201
203
  | `--hp PATH` | `--host-path` | Set host working directory (default: current path) |
202
204
  | `-n NAME` | `--cn`, `--cont-name` | Set container name |
203
205
  | `--cp PATH` | `--cont-path` | Set container working directory |
206
+ | `-l` | `--cl`, `--cont-list` | List all manyoyo containers |
204
207
  | `--crm` | `--cont-remove` | Remove container |
205
208
  | `-m MODE` | `--cm`, `--cont-mode` | Set container mode (common, dind, sock) |
206
209
  | `--in NAME` | `--image-name` | Specify image name |
@@ -217,6 +220,7 @@ docker ps -a # Now you can use docker commands inside the container
217
220
  | `-x CMD` | `--sf`, `--shell-full` | Full command (replaces --sp, -s, and --) |
218
221
  | `-y CLI` | `--yolo` | Run AI agent without confirmation |
219
222
  | `--install NAME` | | Install manyoyo command |
223
+ | `-q LIST` | `--quiet` | Quiet output |
220
224
  | `-V` | `--version` | Show version |
221
225
  | `-h` | `--help` | Show help |
222
226
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xcanwin/manyoyo",
3
- "version": "3.5.2",
3
+ "version": "3.5.7",
4
4
  "imageVersion": "1.6.3",
5
5
  "description": "AI Agent CLI Security Sandbox",
6
6
  "keywords": [