一键导入
add-tool
새로운 빌트인 도구를 추가하는 전체 워크플로우를 안내합니다. Zod 스키마 정의, 도구 구현, 레지스트리 등록, display 설정, 테스트 작성까지 포함합니다. "새 도구 추가", "tool 만들어줘", "빌트인 도구 구현" 등의 요청에 사용하세요.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
새로운 빌트인 도구를 추가하는 전체 워크플로우를 안내합니다. Zod 스키마 정의, 도구 구현, 레지스트리 등록, display 설정, 테스트 작성까지 포함합니다. "새 도구 추가", "tool 만들어줘", "빌트인 도구 구현" 등의 요청에 사용하세요.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
E2E validation skill for the dhelix CLI AI coding assistant. Two test modes: (1) Project E2E — multi-turn tests creating real projects across 5+ tech stacks, validating builds, 80% coverage, and DHELIX.md compliance. (2) Conversation Quality — multi-turn tests verifying context retention, tool call coherence, error recovery, instruction adherence, progressive complexity, and contradiction handling. Use this skill when: running E2E tests for dhelix, validating coding ability across tech stacks, testing multi-turn conversation quality, verifying /init and DHELIX.md system, benchmarking dhelix against real-world project creation, or evaluating conversation quality after model/prompt changes.
Create, improve, and test dhelix skills through a structured interview and scaffold. Use when the user says things like 'make a skill', '스킬 만들어줘', 'turn this workflow into a reusable /command', 'add a slash command that does X', or when the user wants to refine an existing skill's triggering behavior. Benchmarked against Claude Code skill-creator v2.0.
개선 계획(improvement plan)으로부터 스프린트를 실행합니다. Claude Agent Teams를 사용하여 병렬 개발팀을 구성하고 파일 충돌 분석, 태스크 분배, worktree 격리 실행, 결과 검증, 머지/커밋까지 자동 오케스트레이션합니다. 사용자가 "스프린트 실행", "개선 계획 구현", "팀으로 개발", "병렬로 구현해줘", "revolution 실행", "Phase 1 시작", "v0.3 구현" 등을 요청할 때 사용하세요. docs/revolution/ 의 개선 문서, 마일스톤 문서, 또는 사용자가 지정하는 임의의 계획 문서를 입력으로 받습니다.
새로운 슬래시 명령어를 추가하는 전체 워크플로우를 안내합니다. 명령어 파일 생성, 레지스트리 등록, 테스트 작성, CLAUDE.md 업데이트까지 포함합니다. "새 명령어 만들어줘", "슬래시 커맨드 추가", "/xxx 명령어 구현" 등의 요청에 사용하세요.
DB Inc. 브랜드 디자인 시스템(DB제목 B/M/L 폰트, 네이비 블루 테마)을 적용하여 전문적인 PPTX 프레젠테이션을 생성합니다. PPT, 프레젠테이션, 발표자료, 제안서, PoC 문서, 보고서 등을 만들어달라는 요청에 사용하세요. "PPT 만들어줘", "발표자료 작성", "프레젠테이션 생성", "pptx 제안서" 등의 요청에도 반드시 사용하세요.
테스트 실패를 체계적으로 진단하고 수정합니다. 에러 메시지 분석, 관련 소스 추적, mock 설정 검증, 수정 적용까지의 워크플로우를 제공합니다. "테스트 실패", "test 깨졌어", "왜 테스트가 안 돼", "vitest 에러" 등의 상황에 사용하세요.
| name | add-tool |
| description | 새로운 빌트인 도구를 추가하는 전체 워크플로우를 안내합니다. Zod 스키마 정의, 도구 구현, 레지스트리 등록, display 설정, 테스트 작성까지 포함합니다. "새 도구 추가", "tool 만들어줘", "빌트인 도구 구현" 등의 요청에 사용하세요. |
| argument-hint | <tool_name> [description] |
dhelix의 도구 시스템은 정의(Zod 스키마) → 레지스트리 등록 → executor 실행 → 이벤트 발행 → UI 표시라는 파이프라인을 따릅니다. 이 파이프라인의 어느 한 단계라도 누락되면 도구가 동작하지 않거나 UI에 "Running X / Completed X"라는 generic 텍스트가 표시됩니다. 이 스킬은 파이프라인 전체를 빠짐없이 연결합니다.
| 파일 | 역할 |
|---|---|
src/tools/definitions/<name>.ts | 도구 정의 + 실행 로직 (새 파일 생성) |
src/tools/types.ts | ToolDefinition, ToolResult 타입 참조 |
src/index.ts | import + 레지스트리 등록 |
src/cli/renderer/tool-display.ts | toolDisplayMap에 display 설정 추가 |
test/unit/tools/<name>.test.ts | 단위 테스트 (새 파일 생성) |
$ARGUMENTS에서 도구 이름과 설명을 추출합니다.
AskUserQuestion으로 확인file_read, glob_search, bash_exec)grep -r "name:" src/tools/definitions/*.ts | grep '"<tool_name>"'
추가 확인 사항:
safe / confirm / dangerous)src/tools/definitions/<name>.ts 파일을 생성합니다.
필수 패턴:
import { z } from "zod";
import { type ToolDefinition, type ToolContext, type ToolResult } from "../types.js";
// 1. Zod 스키마 정의 — 각 필드에 .describe()로 LLM 힌트 제공
const paramSchema = z.object({
input: z.string().describe("The input to process"),
option: z.boolean().optional().describe("Optional flag"),
});
type Params = z.infer<typeof paramSchema>;
// 2. 실행 함수 정의
async function execute(params: Params, context: ToolContext): Promise<ToolResult> {
try {
const { input, option } = params;
const { workingDirectory, abortSignal } = context;
// 구현 로직
return {
output: "결과 텍스트",
isError: false,
metadata: { /* UI에 필요한 추가 정보 */ },
};
} catch (error) {
return {
output: `Error: ${error instanceof Error ? error.message : String(error)}`,
isError: true,
};
}
}
// 3. 도구 정의 export
export const <camelName>Tool: ToolDefinition<Params> = {
name: "<snake_name>",
description: "LLM이 이 도구를 언제 사용할지 판단하는 설명. 구체적이고 명확하게 작성.",
parameterSchema: paramSchema,
permissionLevel: "safe", // "safe" | "confirm" | "dangerous"
timeoutMs: 30_000, // 선택: 기본값은 executor의 전역 타임아웃
execute,
};
체크리스트:
.describe() 사용 — LLM이 파라미터를 정확히 전달하려면 설명이 필수type import 사용 (ToolDefinition, ToolContext, ToolResult)<camelName>Tool 형식 (예: globSearchTool, mkdirTool).js 확장자 필수context.abortSignal을 장시간 작업에 전달하여 취소 지원isError: true + 사용자 친화적 메시지 반환권한 수준 가이드:
| 수준 | 설명 | 예시 |
|---|---|---|
safe | 읽기 전용, 부작용 없음 | glob_search, grep_search, list_dir |
confirm | 파일 수정, 외부 통신 | file_write, file_edit, web_fetch |
dangerous | 시스템 명령 실행, 삭제 | bash_exec |
src/index.ts에서 다음 2곳을 수정합니다:
3a. Dynamic import 추가:
# 도구 import 위치 확인
grep -n "tools/definitions" src/index.ts | head -20
Promise.all 블록에 import 추가:
import("./tools/definitions/<name>.js"),
destructuring에 대응 항목 추가:
{ <camelName>Tool },
3b. registerAll 배열에 추가:
# registerAll 위치 확인
grep -n "registerAll" src/index.ts
toolRegistry.registerAll([...]) 배열에 <camelName>Tool을 추가합니다.
src/cli/renderer/tool-display.ts의 toolDisplayMap에 엔트리를 추가합니다. 이 설정이 없으면 UI에 "Running / Completed "이라는 generic 텍스트가 표시됩니다.
# toolDisplayMap 위치 확인
grep -n "toolDisplayMap" src/cli/renderer/tool-display.ts | head -5
추가할 엔트리:
<snake_name>: {
running: (args) => `동작 중 텍스트 (${extractDetail(args, "input")})`,
complete: (args, result, metadata) => `완료 텍스트`,
icon: "🔧", // 도구 성격에 맞는 이모지
},
extractDetail 사용법:
// args에서 특정 파라미터 추출
extractDetail(args, "paramName"); // string 반환
extractDetail(args, "paramName", metadata); // metadata 우선, 없으면 args에서
test/unit/tools/<name>.test.ts 파일을 생성합니다.
필수 테스트 패턴:
import { describe, it, expect } from "vitest";
import { <camelName>Tool } from "../../../src/tools/definitions/<name>.js";
const baseContext = {
workingDirectory: process.cwd(),
abortSignal: new AbortController().signal,
timeoutMs: 30_000,
platform: process.platform as "win32" | "darwin" | "linux",
};
describe("<snake_name> tool", () => {
it("should have correct definition", () => {
expect(<camelName>Tool.name).toBe("<snake_name>");
expect(<camelName>Tool.description).toBeTypeOf("string");
expect(<camelName>Tool.permissionLevel).toBe("safe"); // 또는 confirm/dangerous
expect(<camelName>Tool.execute).toBeTypeOf("function");
});
it("should validate parameter schema", () => {
const valid = <camelName>Tool.parameterSchema.safeParse({ input: "test" });
expect(valid.success).toBe(true);
const invalid = <camelName>Tool.parameterSchema.safeParse({});
expect(invalid.success).toBe(false);
});
it("should execute successfully with valid input", async () => {
const result = await <camelName>Tool.execute(
{ input: "test" },
baseContext,
);
expect(result.isError).toBe(false);
expect(result.output).toBeTypeOf("string");
});
it("should handle errors gracefully", async () => {
const result = await <camelName>Tool.execute(
{ input: "invalid/path/that/does/not/exist" },
baseContext,
);
expect(result.isError).toBe(true);
expect(result.output).toContain("Error");
});
});
테스트 체크리스트:
# 타입 체크
npx tsc --noEmit
# 해당 테스트만 실행
npx vitest run test/unit/tools/<name>.test.ts
# 빌드 확인
npm run build
도구 추가 후 metadata 파이프라인이 올바르게 연결되었는지 /verify-tool-metadata-pipeline 스킬을 실행하여 확인합니다.
file_read, file_write, file_edit, bash_exec, glob_search, grep_search는 Hot Tool로 분류되어 매 LLM 요청에 항상 포함됩니다. 새 도구를 Hot Tool로 추가하려면 src/tools/registry.ts의 hotTools Set을 수정해야 합니다.mcp__로 시작하는 도구는 MCP 도구로 취급됩니다. 빌트인 도구는 이 접두사를 사용하지 마세요.src/tools/adaptive-schema.ts가 모델 능력에 따라 스키마를 단순화합니다. 복잡한 스키마는 LOW tier 모델에서 파라미터가 줄어들 수 있습니다.createAgentTool()은 client, model, strategy, registry 의존성이 필요하여 특수 등록 패턴을 사용합니다. 이 워크플로우로는 처리할 수 없습니다.src/mcp/tool-bridge.ts를 통해 동적으로 등록되므로 이 워크플로우와 무관합니다.src/tools/lazy-tool-loader.ts를 통해 지연 로딩되는 도구는 별도의 로딩 로직이 필요합니다.