# Multi-Tool Collaborative Sub-Agent Experiment Report
Generated on: 7/4/2026, 6:33:12 PM

This report compiles the outputs from 3 independent virtual sub-agents executed concurrently with staggered start delays using different CLI tools.

## Summary Table

| Agent | Tool / CLI | Status | Execution Time |
|---|---|---|---|
| **Agent Alpha (Agy)** | `agy` | ✅ Success | 39.7s |
| **Agent Beta (Qwen)** | `qwen` | ✅ Success | 33.9s |
| **Agent Gamma (Codex)** | `codex` | ✅ Success | 24.3s |

---

## Agent Alpha (Agy)
**Command:** `agy --print "Bạn là Agent Alpha (chạy trên agy CLI). Dựa trên thông tin của project này, hãy tóm tắt ngắn gọn 3 tiêu chuẩn code (coding standards) của project này trong file .project-identity." < /dev/null`

### Response:
```text
3 tiêu chuẩn code (coding standards) được quy định trong file [.project-identity](file:///Users/trungkientn/Dev/NodeJS/flowkit/.project-identity) gồm:

1. **Quy tắc đặt tên**: `camelCase`
2. **Thụt lề**: 4 khoảng trắng (`spaces-4`)
3. **Độ dài dòng tối đa**: 120 ký tự (`lineLength: 120`)
```

---

## Agent Beta (Qwen)
**Command:** `qwen -p "Bạn là Agent Beta (chạy trên qwen CLI). Hãy đề xuất 3 quy chuẩn đặt tên biến/hàm/file (naming conventions) tốt nhất cho một CLI Node.js." --max-session-turns 1 -y < /dev/null`

### Response:
```text
Dưới đây là 3 quy chuẩn đặt tên thiết thực nhất cho CLI Node.js:

---

### 1. **kebab-case cho file và CLI commands**

File, thư mục, và tên command dùng dấu gạch ngang. Đây là chuẩn của npm, Node.js ecosystem, và hầu hết CLI framework.

```
src/
  commands/
    init-project.ts
    generate-component.ts
    migrate-database.ts
  utils/
    parse-args.ts
    format-output.ts
```

Command được gọi: `my-cli init-project`, `my-cli generate-component`

---

### 2. **camelCase cho biến, hàm, method; PascalCase cho class/type**

- **Biến, hàm**: `lowerCamelCase` — chuẩn JS/TS.
- **Class, interface, type, React component**: `PascalCase`.
- **Hàm action/handler nên có prefix động từ** rõ ràng.

```ts
// ✅ Biến, hàm
const configPath = resolveHomeDir(argv.config);
function parseInput(raw: string): ParsedArgs { ... }

// ✅ Class, type
class CommandRunner { ... }
interface CliConfig { ... }
type FlagType = 'string' | 'boolean' | 'number';
```

Prefix động từ gợi ý cho hàm:
| Prefix   | Ngữ nghĩa                           |
|----------|-------------------------------------|
| `get*`   | Trả về giá trị (không side-effect)  |
| `set*`   | Gán giá trị                         |
| `parse*` | Parse/transform input               |
| `run*`   | Thực thi command (có side-effect)   |
| `resolve*`| Resolve path/config                |
| `format*`| Format output cho terminal          |
| `prompt*`| Tương tác người dùng (inquirer)    |

---

### 3. **UPPER_SNAKE_CASE cho constants; env-like prefix cho CLI options biến**

- **Hằng số true-constant** (không bao giờ thay đổi): `UPPER_SNAKE_CASE`.
- **CLI flags/options**: camelCase nhưng giữ consistency với parser (yargs/commander).
- **Biến môi trường**: `UPPER_SNAKE_CASE` có prefix project.

```ts
// Constants
const DEFAULT_TIMEOUT_MS = 30_000;
const MAX_RETRY_COUNT = 3;
const EXIT_CODES = { SUCCESS: 0, ERROR: 1 } as const;

// CLI options — camelCase (khớp với yargs dest)
const { dryRun, outputDir, verbose } = argv;

// Env vars — UPPER_SNAKE_CASE với scope
// MYCLI_CONFIG_PATH, MYCLI_LOG_LEVEL, MYCLI_TOKEN
```

---

**Tóm tắt**: `kebab-case` cho file/command, `camelCase`/`PascalCase` cho code, `UPPER_SNAKE_CASE` cho constants + env. Bộ ba này bao phủ toàn bộ surface area của một CLI Node.js và không xung đột với hệ sinh thái.
```

---

## Agent Gamma (Codex)
**Command:** `codex exec "Bạn là Agent Gamma (chạy trên codex CLI). Hãy viết một hàm Node.js sử dụng exec của child_process để chạy một command shell bất kỳ một cách an toàn và trả về output/error, viết code ngắn gọn dưới 15 dòng." --skip-git-repo-check < /dev/null`

### Response:
```text
`exec` luôn có rủi ro shell injection nếu command chứa input từ user. Dùng được cho command nội bộ/tin cậy, thêm timeout, maxBuffer, shell cố định:

```js
const { exec } = require("child_process");

function runShell(command, opts = {}) {
  return new Promise((resolve) => {
    exec(command, {
      cwd: opts.cwd || process.cwd(),
      timeout: opts.timeout || 10_000,
      maxBuffer: opts.maxBuffer || 1024 * 1024,
      shell: "/bin/sh",
      env: { PATH: process.env.PATH },
    }, (error, stdout, stderr) => {
      resolve({ ok: !error, code: error?.code ?? 0, stdout, stderr });
    });
  });
}
```

Nếu command có tham số từ user, nên dùng `execFile` hoặc `spawn` với args array thay vì `exec`.
```

---

