ระบบคำสั่ง (Commands System)
ภาพรวม
ระบบคำสั่งให้ ~85 คำสั่ง slash สำหรับการโต้ตอบของผู้ใช้ คำสั่งถูกเรียกใช้ด้วยไวยากรณ์ /command ในอินเทอร์เฟซ terminal
โครงสร้างคำสั่ง
src/commands/
├── commitCommand.ts - การอัตโนมัติ commit ของ Git
├── mcpCommand.ts - การจัดการเซิร์ฟเวอร์ MCP
├── memoryCommand.ts - การจัดการหน่วยความจำ
├── reviewCommand.ts - การอัตโนมัติ review โค้ด
├── [85+ ไฟล์คำสั่ง]
└── index.ts - การลงทะเบียนคำสั่ง
รูปแบบการลงทะเบียนคำสั่ง
ทุกคำสั่งใช้รูปแบบการลงทะเบียนที่สม่ำเสมอ:
// ตัวอย่าง: commitCommand.ts
import { buildCommand } from '../commands.js';
export const commitCommand = buildCommand({
name: 'commit',
description: 'สร้าง commit ของ Git ด้วยความช่วยเหลือของ AI',
parameters: z.object({
message: z.string().optional(),
amend: z.boolean().optional(),
}),
async handler(args, context) {
// ตรรกะการดำเนินการของคำสั่ง
await performCommit(args, context);
},
});
หมวดหมู่คำสั่ง
คำสั่งสำหรับควบคุมเวอร์ชัน
/commit- สร้าง commit ของ Git/diff- แสดงความแตกต่างของไฟล์/status- ภาพรวมสถานะ Git
คำสั่ง MCP
/mcp add- เพิ่มเซิร์ฟเวอร์ MCP/mcp list- แสดงรายการเซิร์ฟเวอร์ MCP/mcp remove- ลบเซิร์ฟเวอร์ MCP
คำสั่งหน่วยความจำ
/memory add- เพิ่มในหน่วยความจำ/memory list- แสดงรายการในหน่วยความจำ/memory clear- ล้างหน่วยความจำ
คำสั่งการดีบัก
/debug- เปิดโหมดดีบัก/profile- การโปรไฟล์ประสิทธิภาพ
คำสั่งระบบ
/help- แสดงความช่วยเหลือ/tips- แสดงเคล็ดลับการใช้งาน/version- แสดงข้อมูลเวอร์ชัน
การไหลของการดำเนินการคำสั่ง
1. ผู้ใช้พิมพ์ /command [args]
2. ระบบคำสั่งวิเคราะห์ input
3. พารามิเตอร์ถูกตรวจสอบตาม schema
4. handler() ดำเนินการตรรกะของคำสั่ง
5. ผลลัพธ์แสดงแก่ผู้ใช้
6. สถานะถูกอัปเดต (ถ้ามี)
การค้นหาคำสั่ง
คำสั่งถูกค้นหาและลงทะเบียนผ่าน:
// src/commands.ts
export function getCommands(): Command[] {
const commands: Command[] = [];
commands.push(commitCommand);
commands.push(mcpCommand);
commands.push(memoryCommand);
// ... คำสั่งอื่นๆ ทั้งหมด
return commands;
}
แนวปฏิบัติที่ดีของคำสั่ง
- การออกแบบโมดูลาร์: แต่ละคำสั่งแยกออกมาเป็นอิสระ
- การตรวจสอบพารามิเตอร์: การบังคับใช้ schema ที่เข้มงวด
- การอัปเดตสถานะ: คำสั่งสามารถอัปเดตสถานะของแอป
- การจัดการข้อผิดพลาด: การลดผลกระทบจากข้อผิดพลาดอย่างนุ่มนวล
- การผสานรวมกับ UI: คำสั่งสามารถเรียกใช้ส่วนประกอบ UI
ตัวอย่างคำสั่ง
คำสั่ง Git Commit
export const commitCommand = buildCommand({
name: 'commit',
description: 'สร้าง commit ของ Git ด้วยความช่วยเหลือของ AI',
parameters: z.object({
message: z.string().optional().describe('ข้อความ commit'),
amend: z.boolean().optional().describe('แก้ไข commit ก่อนหน้า'),
}),
async handler(args, context) {
// Stage การเปลี่ยนแปลง
await execGitCommand('git add .');
// สร้าง commit
const msg = args.message || 'Auto-commit';
const flag = args.amend ? '--amend' : '';
await execGitCommand(`git commit -m "${msg}" ${flag}`);
// อัปเดตสถานะ
context.setAppState(prev => ({
...prev,
lastCommitMessage: msg,
}));
},
});
คำสั่ง MCP Add
export const mcpAddCommand = buildCommand({
name: 'mcp add',
description: 'เพิ่มการตั้งค่าเซิร์ฟเวอร์ MCP',
parameters: z.object({
name: z.string().describe('ชื่อเซิร์ฟเวอร์'),
command: z.string().describe('คำสั่งของเซิร์ฟเวอร์'),
}),
async handler(args, context) {
const serverConfig = {
name: args.name,
command: args.command,
};
// เพิ่มในค่าการตั้งค่า MCP
await addMcpServer(serverConfig);
// รีเฟรช clients ของ MCP
await refreshMcpClients();
},
});
การกรองคำสั่ง
คำสั่งสามารถถูกกรองตามบริบทเฉพาะ:
// กรองคำสั่งสำหรับโหมด remote
export function filterCommandsForRemoteMode(commands: Command[]): Command[] {
return commands.filter(cmd =>
!cmd.name.startsWith('local-')
);
}
แนวปฏิบัติที่ดีของคำสั่ง
- การออกแบบโมดูลาร์: แต่ละคำสั่งแยกออกมาเป็นอิสระ
- การตรวจสอบพารามิเตอร์: การบังคับใช้ schema ที่เข้มงวด
- การอัปเดตสถานะ: คำสั่งสามารถแก้ไขสถานะของแอป
- การลดผลกระทบจากข้อผิดพลาด: การจัดการข้อผิดพลาดอย่างนุ่มนวล
- การตอบกลับของ UI: คำสั่งให้การตอบกลับแบบภาพ
ข้อควรพิจารณาด้านความปลอดภัย
- การตรวจสอบ Permission: คำสั่งเคารพโหมด permission
- ไดเรกทอรีการทำงาน: คำสั่งเคารพข้อจำกัดของ cwd
- Feature Flags: ความพร้อมใช้งานของคำสั่งตามเงื่อนไข
- Lazy Loading: โหลดคำสั่งหนักเมื่อต้องการ
- ขอบเขตข้อผิดพลาด: การจัดการข้อผิดพลาดแบบแยกออกมา
กลไกการค้นหาคำสั่ง
คำสั่งถูกค้นหาอัตโนมัติจากไดเรกทอรี commands:
// การโหลดคำสั่งอัตโนมัติ
const commandFiles = glob('src/commands/*.ts');
for (const file of commandFiles) {
const command = require(file).default;
commands.push(command);
}
การผสานรวมคำสั่งกับเครื่องมือ
คำสั่งสามารถเรียกใช้เครื่องมือ:
async handler(args, context) {
// เรียกใช้เครื่องมือจากในคำสั่ง
const result = await context.tools.find(t => t.name === 'BashTool')
.call({ command: 'git status' }, context);
// แสดงผลลัพธ์
context.setAppState(prev => ({
...prev,
commandOutput: result,
}));
}