Main Site โ†—

skill-generator

by catlog221.7k0GitHub

A meta-skill that generates new Claude Code skills with configurable execution modes (sequential or autonomous). It creates complete directory structures, phase files, specifications, and templates based on user requirements. The skill follows established design patterns and includes quality control mechanisms.

Unlock Deep Analysis

Use AI to visualize the workflow and generate a realistic output preview for this skill.

Powered by Fastest LLM

Target Audience

Claude Code developers creating new skills, workflow designers, and teams establishing standardized development practices

7/10Security

Low security risk, safe to use

9
Clarity
8
Practicality
8
Quality
9
Maintainability
9
Innovation
Meta
skill-scaffoldingworkflow-automationcode-generationdeveloper-tools
Compatible Agents
Claude Code
Claude Code
~/.claude/skills/
Codex CLI
Codex CLI
~/.codex/skills/
Gemini CLI
Gemini CLI
~/.gemini/skills/
O
OpenCode
~/.opencode/skills/
O
OpenClaw
~/.openclaw/skills/
GitHub Copilot
GitHub Copilot
~/.copilot/skills/
Cursor
Cursor
~/.cursor/skills/
W
Windsurf
~/.codeium/windsurf/skills/
C
Cline
~/.cline/skills/
R
Roo Code
~/.roo/skills/
K
Kiro
~/.kiro/skills/
J
Junie
~/.junie/skills/
A
Augment Code
~/.augment/skills/
W
Warp
~/.warp/skills/
G
Goose
~/.config/goose/skills/
SKILL.md

Skill Generator

Meta-skill for creating new Claude Code skills with configurable execution modes.

Architecture Overview

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Skill Generator Architecture                                    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                  โ”‚
โ”‚  Phase 1: Requirements    โ†’ skill-config.json                   โ”‚
โ”‚           Discovery           (name, type, mode, agents)        โ”‚
โ”‚           โ†“                                                      โ”‚
โ”‚  Phase 2: Structure       โ†’ ็›ฎๅฝ•็ป“ๆž„ + ๆ ธๅฟƒๆ–‡ไปถ้ชจๆžถ              โ”‚
โ”‚           Generation                                             โ”‚
โ”‚           โ†“                                                      โ”‚
โ”‚  Phase 3: Phase           โ†’ phases/*.md (ๆ นๆฎ mode ็”Ÿๆˆ)         โ”‚
โ”‚           Generation          Sequential | Autonomous            โ”‚
โ”‚           โ†“                                                      โ”‚
โ”‚  Phase 4: Specs &         โ†’ specs/*.md + templates/*.md         โ”‚
โ”‚           Templates                                              โ”‚
โ”‚           โ†“                                                      โ”‚
โ”‚  Phase 5: Validation      โ†’ ้ชŒ่ฏๅฎŒๆ•ดๆ€ง + ็”Ÿๆˆไฝฟ็”จ่ฏดๆ˜Ž            โ”‚
โ”‚           & Documentation                                        โ”‚
โ”‚                                                                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Execution Modes

Mode 1: Sequential (ๅ›บๅฎš้กบๅบ)

ไผ ็ปŸ็บฟๆ€งๆ‰ง่กŒๆจกๅผ๏ผŒ้˜ถๆฎตๆŒ‰ๆ•ฐๅญ—ๅ‰็ผ€้กบๅบๆ‰ง่กŒใ€‚

Phase 01 โ†’ Phase 02 โ†’ Phase 03 โ†’ ... โ†’ Phase N

้€‚็”จๅœบๆ™ฏ:

  • ๆตๆฐด็บฟๅผไปปๅŠก๏ผˆๆ”ถ้›† โ†’ ๅˆ†ๆž โ†’ ็”Ÿๆˆ๏ผ‰
  • ้˜ถๆฎต้—ดๆœ‰ๅผบไพ่ต–ๅ…ณ็ณป
  • ่พ“ๅ‡บ็ป“ๆž„ๅ›บๅฎš

็คบไพ‹: software-manual, copyright-docs

Mode 2: Autonomous (ๆ— ็Šถๆ€่‡ชไธป้€‰ๆ‹ฉ)

ๆ™บ่ƒฝ่ทฏ็”ฑๆจกๅผ๏ผŒๆ นๆฎไธŠไธ‹ๆ–‡ๅŠจๆ€้€‰ๆ‹ฉๆ‰ง่กŒ่ทฏๅพ„ใ€‚

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚           Orchestrator Agent            โ”‚
โ”‚  (่ฏปๅ–็Šถๆ€ โ†’ ้€‰ๆ‹ฉ Phase โ†’ ๆ‰ง่กŒ โ†’ ๆ›ดๆ–ฐ)  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ†“           โ†“           โ†“
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚Phase Aโ”‚  โ”‚Phase Bโ”‚  โ”‚Phase Cโ”‚
โ”‚(็‹ฌ็ซ‹) โ”‚  โ”‚(็‹ฌ็ซ‹) โ”‚  โ”‚(็‹ฌ็ซ‹) โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

้€‚็”จๅœบๆ™ฏ:

  • ไบคไบ’ๅผไปปๅŠก๏ผˆๅฏน่ฏใ€้—ฎ็ญ”๏ผ‰
  • ้˜ถๆฎต้—ดๆ— ๅผบไพ่ต–
  • ้œ€่ฆๅŠจๆ€ๅ“ๅบ”็”จๆˆทๆ„ๅ›พ

็คบไพ‹: issue-manage, workflow-debug

Key Design Principles

  1. ๆจกๅผๆ„Ÿ็Ÿฅ: ๆ นๆฎไปปๅŠก็‰นๆ€ง่‡ชๅŠจๆŽจ่ๆ‰ง่กŒๆจกๅผ
  2. ้ชจๆžถ็”Ÿๆˆ: ็”ŸๆˆๅฎŒๆ•ด็›ฎๅฝ•็ป“ๆž„ๅ’Œๆ–‡ไปถ้ชจๆžถ
  3. ่ง„่Œƒ้ตๅพช: ไธฅๆ ผ้ตๅพช _shared/SKILL-DESIGN-SPEC.md
  4. ๅฏๆ‰ฉๅฑ•ๆ€ง: ็”Ÿๆˆ็š„ Skill ๆ˜“ไบŽๆ‰ฉๅฑ•ๅ’Œไฟฎๆ”น

Execution Flow

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Phase 1: Requirements Discovery                                 โ”‚
โ”‚  โ†’ AskUserQuestion: Skill ๅ็งฐใ€็›ฎๆ ‡ใ€ๆ‰ง่กŒๆจกๅผ                   โ”‚
โ”‚  โ†’ Output: skill-config.json                                    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Phase 2: Structure Generation                                   โ”‚
โ”‚  โ†’ ๅˆ›ๅปบ็›ฎๅฝ•็ป“ๆž„: phases/, specs/, templates/, scripts/          โ”‚
โ”‚  โ†’ ็”Ÿๆˆ SKILL.md ๅ…ฅๅฃๆ–‡ไปถ                                        โ”‚
โ”‚  โ†’ Output: ๅฎŒๆ•ด็›ฎๅฝ•็ป“ๆž„                                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Phase 3: Phase Generation                                       โ”‚
โ”‚  โ†’ Sequential: ็”Ÿๆˆ 01-xx.md, 02-xx.md, ...                     โ”‚
โ”‚  โ†’ Autonomous: ็”Ÿๆˆ orchestrator.md + actions/*.md              โ”‚
โ”‚  โ†’ Output: phases/*.md                                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Phase 4: Specs & Templates                                      โ”‚
โ”‚  โ†’ ็”Ÿๆˆ้ข†ๅŸŸ่ง„่Œƒ: specs/{domain}-requirements.md                  โ”‚
โ”‚  โ†’ ็”Ÿๆˆ่ดจ้‡ๆ ‡ๅ‡†: specs/quality-standards.md                      โ”‚
โ”‚  โ†’ ็”Ÿๆˆๆจกๆฟ: templates/agent-base.md                             โ”‚
โ”‚  โ†’ Output: specs/*.md, templates/*.md                           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Phase 5: Validation & Documentation                             โ”‚
โ”‚  โ†’ ้ชŒ่ฏๆ–‡ไปถๅฎŒๆ•ดๆ€ง                                                 โ”‚
โ”‚  โ†’ ็”Ÿๆˆ README.md ไฝฟ็”จ่ฏดๆ˜Ž                                       โ”‚
โ”‚  โ†’ Output: ้ชŒ่ฏๆŠฅๅ‘Š + README.md                                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Directory Setup

const skillName = config.skill_name;
const skillDir = `.claude/skills/${skillName}`;

// ๅˆ›ๅปบ็›ฎๅฝ•็ป“ๆž„
Bash(`mkdir -p "${skillDir}/phases"`);
Bash(`mkdir -p "${skillDir}/specs"`);
Bash(`mkdir -p "${skillDir}/templates"`);

// Autonomous ๆจกๅผ้ขๅค–็›ฎๅฝ•
if (config.execution_mode === 'autonomous') {
  Bash(`mkdir -p "${skillDir}/phases/actions"`);
}

Output Structure

Sequential Mode

.claude/skills/{skill-name}/
โ”œโ”€โ”€ SKILL.md
โ”œโ”€โ”€ phases/
โ”‚   โ”œโ”€โ”€ 01-{step-one}.md
โ”‚   โ”œโ”€โ”€ 02-{step-two}.md
โ”‚   โ””โ”€โ”€ 03-{step-three}.md
โ”œโ”€โ”€ specs/
โ”‚   โ”œโ”€โ”€ {domain}-requirements.md
โ”‚   โ””โ”€โ”€ quality-standards.md
โ””โ”€โ”€ templates/
    โ””โ”€โ”€ agent-base.md

Autonomous Mode

.claude/skills/{skill-name}/
โ”œโ”€โ”€ SKILL.md
โ”œโ”€โ”€ phases/
โ”‚   โ”œโ”€โ”€ orchestrator.md          # ็ผ–ๆŽ’ๅ™จ๏ผš่ฏปๅ–็Šถๆ€ โ†’ ้€‰ๆ‹ฉๅŠจไฝœ
โ”‚   โ”œโ”€โ”€ state-schema.md          # ็Šถๆ€็ป“ๆž„ๅฎšไน‰
โ”‚   โ””โ”€โ”€ actions/                 # ็‹ฌ็ซ‹ๅŠจไฝœ๏ผˆๆ— ้กบๅบ๏ผ‰
โ”‚       โ”œโ”€โ”€ action-{a}.md
โ”‚       โ”œโ”€โ”€ action-{b}.md
โ”‚       โ””โ”€โ”€ action-{c}.md
โ”œโ”€โ”€ specs/
โ”‚   โ”œโ”€โ”€ {domain}-requirements.md
โ”‚   โ”œโ”€โ”€ action-catalog.md        # ๅŠจไฝœ็›ฎๅฝ•๏ผˆๆ่ฟฐใ€ๅ‰็ฝฎๆกไปถใ€ๆ•ˆๆžœ๏ผ‰
โ”‚   โ””โ”€โ”€ quality-standards.md
โ””โ”€โ”€ templates/
    โ”œโ”€โ”€ orchestrator-base.md     # ็ผ–ๆŽ’ๅ™จๆจกๆฟ
    โ””โ”€โ”€ action-base.md           # ๅŠจไฝœๆจกๆฟ

Reference Documents

DocumentPurpose
phases/01-requirements-discovery.mdๆ”ถ้›† Skill ้œ€ๆฑ‚
phases/02-structure-generation.md็”Ÿๆˆ็›ฎๅฝ•็ป“ๆž„
phases/03-phase-generation.md็”Ÿๆˆ Phase ๆ–‡ไปถ
phases/04-specs-templates.md็”Ÿๆˆ่ง„่Œƒๅ’Œๆจกๆฟ
phases/05-validation.md้ชŒ่ฏๅ’Œๆ–‡ๆกฃ
specs/execution-modes.mdๆ‰ง่กŒๆจกๅผ่ง„่Œƒ
specs/skill-requirements.mdSkill ้œ€ๆฑ‚่ง„่Œƒ
templates/skill-md.mdSKILL.md ๆจกๆฟ
templates/sequential-phase.mdSequential Phase ๆจกๆฟ
templates/autonomous-orchestrator.mdAutonomous ็ผ–ๆŽ’ๅ™จๆจกๆฟ
templates/autonomous-action.mdAutonomous Action ๆจกๆฟ
../_shared/SKILL-DESIGN-SPEC.md้€š็”จ่ฎพ่ฎก่ง„่Œƒ

Referenced Files

The following files are referenced in this skill and included for context.

phases/01-requirements-discovery.md

# Phase 1: Requirements Discovery

ๆ”ถ้›†ๆ–ฐ Skill ็š„้œ€ๆฑ‚ไฟกๆฏ๏ผŒ็”Ÿๆˆ้…็ฝฎๆ–‡ไปถใ€‚

## Objective

- ๆ”ถ้›† Skill ๅŸบๆœฌไฟกๆฏ๏ผˆๅ็งฐใ€ๆ่ฟฐใ€่งฆๅ‘่ฏ๏ผ‰
- ็กฎๅฎšๆ‰ง่กŒๆจกๅผ๏ผˆSequential / Autonomous๏ผ‰
- ๅฎšไน‰้˜ถๆฎต/ๅŠจไฝœ
- ้…็ฝฎๅทฅๅ…ทไพ่ต–ๅ’Œ่พ“ๅ‡บๆ ผๅผ

## Execution Steps

### Step 1: ๅŸบๆœฌไฟกๆฏๆ”ถ้›†

```javascript
const basicInfo = await AskUserQuestion({
  questions: [
    {
      question: "ๆ–ฐ Skill ็š„ๅ็งฐๆ˜ฏไป€ไนˆ๏ผŸ๏ผˆ่‹ฑๆ–‡๏ผŒๅฐๅ†™-่ฟžๅญ—็ฌฆๆ ผๅผ๏ผŒๅฆ‚ 'api-docs'๏ผ‰",
      header: "Skill ๅ็งฐ",
      multiSelect: false,
      options: [
        { label: "่‡ชๅŠจ็”Ÿๆˆ", description: "ๆ นๆฎๅŽ็ปญๆ่ฟฐ่‡ชๅŠจ็”Ÿๆˆๅ็งฐ" },
        { label: "ๆ‰‹ๅŠจ่พ“ๅ…ฅ", description: "็Žฐๅœจ่พ“ๅ…ฅ่‡ชๅฎšไน‰ๅ็งฐ" }
      ]
    },
    {
      question: "Skill ็š„ไธป่ฆ็”จ้€”ๆ˜ฏไป€ไนˆ๏ผŸ",
      header: "็”จ้€”็ฑปๅž‹",
      multiSelect: false,
      options: [
        { label: "ๆ–‡ๆกฃ็”Ÿๆˆ", description: "็”Ÿๆˆ Markdown/HTML ๆ–‡ๆกฃ๏ผˆๅฆ‚ๆ‰‹ๅ†Œใ€ๆŠฅๅ‘Š๏ผ‰" },
        { label: "ไปฃ็ ๅˆ†ๆž", description: "ๅˆ†ๆžไปฃ็ ็ป“ๆž„ใ€่ดจ้‡ใ€ๅฎ‰ๅ…จๆ€ง" },
        { label: "ไบคไบ’็ฎก็†", description: "็ฎก็† Issueใ€ไปปๅŠกใ€ๅทฅไฝœๆต๏ผˆCRUD ๆ“ไฝœ๏ผ‰" },
        { label: "ๆ•ฐๆฎๅค„็†", description: "ETLใ€ๆ ผๅผ่ฝฌๆขใ€ๆŠฅๅ‘Š็”Ÿๆˆ" }
      ]
    }
  ]
});

// ๅฆ‚ๆžœ้€‰ๆ‹ฉๆ‰‹ๅŠจ่พ“ๅ…ฅ๏ผŒ่ฟ›ไธ€ๆญฅ่ฏข้—ฎ
if (basicInfo["Skill ๅ็งฐ"] === "ๆ‰‹ๅŠจ่พ“ๅ…ฅ") {
  // ็”จๆˆทไผšๅœจ "Other" ไธญ่พ“ๅ…ฅ
}

// ๆ นๆฎ็”จ้€”็ฑปๅž‹ๆŽจๆ–ญๆ่ฟฐๆจกๆฟ
const purposeTemplates = {
  "ๆ–‡ๆกฃ็”Ÿๆˆ": "Generate {type} documents from {source}",
  "ไปฃ็ ๅˆ†ๆž": "Analyze {target} for {purpose}",
  "ไบคไบ’็ฎก็†": "Manage {entity} with interactive operations",
  "ๆ•ฐๆฎๅค„็†": "Process {data} and generate {output}"
};

Step 2: ๆ‰ง่กŒๆจกๅผ้€‰ๆ‹ฉ

const modeInfo = await AskUserQuestion({
  questions: [
    {
      question: "้€‰ๆ‹ฉๆ‰ง่กŒๆจกๅผ๏ผš",
      header: "ๆ‰ง่กŒๆจกๅผ",
      multiSelect: false,
      options: [
        { 
          label: "Sequential (้กบๅบๆจกๅผ)", 
          description: "้˜ถๆฎตๆŒ‰ๅ›บๅฎš้กบๅบๆ‰ง่กŒ๏ผˆๆ”ถ้›†โ†’ๅˆ†ๆžโ†’็”Ÿๆˆ๏ผ‰๏ผŒ้€‚ๅˆๆตๆฐด็บฟไปปๅŠก๏ผˆๆŽจ่๏ผ‰" 
        },
        { 
          label: "Autonomous (่‡ชไธปๆจกๅผ)", 
          description: "ๅŠจๆ€้€‰ๆ‹ฉๆ‰ง่กŒ่ทฏๅพ„๏ผŒ้€‚ๅˆไบคไบ’ๅผไปปๅŠก๏ผˆๅฆ‚ Issue ็ฎก็†๏ผ‰" 
        },
        { 
          label: "Hybrid (ๆททๅˆๆจกๅผ)", 
          description: "ๅˆๅง‹ๅŒ–ๅ’Œๆ”ถๅฐพๅ›บๅฎš๏ผŒไธญ้—ดไบคไบ’็ตๆดป" 
        }
      ]
    }
  ]
});

const executionMode = modeInfo["ๆ‰ง่กŒๆจกๅผ"].includes("Sequential") ? "sequential" :
                      modeInfo["ๆ‰ง่กŒๆจกๅผ"].includes("Autonomous") ? "autonomous" : "hybrid";

Step 3: ้˜ถๆฎต/ๅŠจไฝœๅฎšไน‰

Sequential ๆจกๅผ

if (executionMode === "sequential") {
  const phaseInfo = await AskUserQuestion({
    questions: [
      {
        question: "้œ€่ฆๅคšๅฐ‘ไธชๆ‰ง่กŒ้˜ถๆฎต๏ผŸ",
        header: "้˜ถๆฎตๆ•ฐ้‡",
        multiSelect: false,
        options: [
          { label: "3 ้˜ถๆฎต๏ผˆ็ฎ€ๅ•๏ผ‰", description: "ๆ”ถ้›† โ†’ ๅค„็† โ†’ ่พ“ๅ‡บ" },
          { label: "5 ้˜ถๆฎต๏ผˆๆ ‡ๅ‡†๏ผ‰", description: "ๆ”ถ้›† โ†’ ๆŽข็ดข โ†’ ๅˆ†ๆž โ†’ ็ป„่ฃ… โ†’ ้ชŒ่ฏ" },
          { label: "7 ้˜ถๆฎต๏ผˆๅฎŒๆ•ด๏ผ‰", description: "ๅซๅนถ่กŒๅค„็†ใ€ๆฑ‡ๆ€ปใ€่ฟญไปฃไผ˜ๅŒ–" }
        ]
      }
    ]
  });
  
  // ๆ นๆฎ้€‰ๆ‹ฉ็”Ÿๆˆ้˜ถๆฎตๅฎšไน‰
  const phaseTemplates = {
    "3 ้˜ถๆฎต": [
      { id: "01-collection", name: "Data Collection" },
      { id: "02-processing", name: "Processing" },
      { id: "03-output", name: "Output Generation" }
    ],
    "5 ้˜ถๆฎต": [
      { id: "01-collection", name: "Requirements Collection" },
      { id: "02-exploration", name: "Project Exploration" },
      { id: "03-analysis", name: "Deep Analysis" },
      { id: "04-assembly", name: "Document Assembly" },
      { id: "05-validation", name: "Validation" }
    ],
    "7 ้˜ถๆฎต": [
      { id: "01-collection", name: "Requirements Collection" },
      { id: "02-exploration", name: "Project Exploration" },
      { id: "03-parallel", name: "Parallel Analysis" },
      { id: "03.5-consolidation", name: "Consolidation" },
      { id: "04-assembly", name: "Document Assembly" },
      { id: "05-refinement", name: "Iterative Refinement" },
      { id: "06-output", name: "Final Output" }
    ]
  };
}

Autonomous ๆจกๅผ

if (executionMode === "autonomous") {
  const actionInfo = await AskUserQuestion({
    questions: [
      {
        question: "ๆ ธๅฟƒๅŠจไฝœๆœ‰ๅ“ชไบ›๏ผŸ๏ผˆๅฏๅคš้€‰๏ผ‰",
        header: "ๅŠจไฝœๅฎšไน‰",
        multiSelect: true,
        options: [
          { label: "ๅˆๅง‹ๅŒ– (init)", description: "่ฎพ็ฝฎๅˆๅง‹็Šถๆ€" },
          { label: "ๅˆ—่กจ (list)", description: "ๆ˜พ็คบๅฝ“ๅ‰้กน็›ฎๅˆ—่กจ" },
          { label: "ๅˆ›ๅปบ (create)", description: "ๅˆ›ๅปบๆ–ฐ้กน็›ฎ" },
          { label: "็ผ–่พ‘ (edit)", description: "ไฟฎๆ”น็Žฐๆœ‰้กน็›ฎ" },
          { label: "ๅˆ ้™ค (delete)", description: "ๅˆ ้™ค้กน็›ฎ" },
          { label: "ๆœ็ดข (search)", description: "ๆœ็ดข/่ฟ‡ๆปค้กน็›ฎ" }
        ]
      }
    ]
  });
}

Step 4: ๅทฅๅ…ทๅ’Œ่พ“ๅ‡บ้…็ฝฎ

const toolsInfo = await AskUserQuestion({
  questions: [
    {
      question: "้œ€่ฆๅ“ชไบ›็‰นๆฎŠๅทฅๅ…ท๏ผŸ๏ผˆๅŸบ็ก€ๅทฅๅ…ทๅทฒ้ป˜่ฎคๅŒ…ๅซ๏ผ‰",
      header: "ๅทฅๅ…ท้€‰ๆ‹ฉ",
      multiSelect: true,
      options: [
        { label: "็”จๆˆทไบคไบ’ (AskUserQuestion)", description: "้œ€่ฆไธŽ็”จๆˆทๅฏน่ฏ" },
        { label: "Chrome ๆˆชๅ›พ (mcp__chrome__*)", description: "้œ€่ฆ็ฝ‘้กตๆˆชๅ›พ" },
        { label: "ๅค–้ƒจๆœ็ดข (mcp__exa__search)", description: "้œ€่ฆๆœ็ดขๅค–้ƒจไฟกๆฏ" },
        { label: "ๆ— ็‰นๆฎŠ้œ€ๆฑ‚", description: "ไป…ไฝฟ็”จๅŸบ็ก€ๅทฅๅ…ท" }
      ]
    },
    {
      question: "่พ“ๅ‡บๆ ผๅผๆ˜ฏไป€ไนˆ๏ผŸ",
      header: "่พ“ๅ‡บๆ ผๅผ",
      multiSelect: false,
      options: [
        { label: "Markdown", description: "้€‚ๅˆๆ–‡ๆกฃๅ’ŒๆŠฅๅ‘Š" },
        { label: "HTML", description: "้€‚ๅˆไบคไบ’ๅผๆ–‡ๆกฃ" },
        { label: "JSON", description: "้€‚ๅˆๆ•ฐๆฎๅ’Œ้…็ฝฎ" }
      ]
    }
  ]
});

Step 5: ็”Ÿๆˆ้…็ฝฎๆ–‡ไปถ

const config = {
  skill_name: skillName,
  display_name: displayName,
  description: description,
  triggers: triggers,
  execution_mode: executionMode,
  
  // ๆจกๅผ็‰นๅฎš้…็ฝฎ
  ...(executionMode === "sequential" ? {
    sequential_config: { phases: phases }
  } : {
    autonomous_config: { 
      state_schema: stateSchema,
      actions: actions,
      termination_conditions: ["user_exit", "error_limit", "task_completed"]
    }
  }),
  
  allowed_tools: [
    "Task", "Read", "Write", "Glob", "Grep", "Bash",
    ...selectedTools
  ],
  
  output: {
    format: outputFormat.toLowerCase(),
    location: `.workflow/.scratchpad/${skillName}-{timestamp}`,
    filename_pattern: `{name}-output.${outputFormat === "HTML" ? "html" : outputFormat === "JSON" ? "json" : "md"}`
  },
  
  created_at: new Date().toISOString(),
  version: "1.0.0"
};

// ๅ†™ๅ…ฅ้…็ฝฎๆ–‡ไปถ
const workDir = `.workflow/.scratchpad/skill-gen-${timestamp}`;
Bash(`mkdir -p "${workDir}"`);
Write(`${workDir}/skill-config.json`, JSON.stringify(config, null, 2));

Output

  • File: skill-config.json
  • Location: .workflow/.scratchpad/skill-gen-{timestamp}/
  • Format: JSON

Next Phase

โ†’ Phase 2: Structure Generation


### phases/02-structure-generation.md

```markdown
# Phase 2: Structure Generation

ๆ นๆฎ้…็ฝฎๅˆ›ๅปบ Skill ็›ฎๅฝ•็ป“ๆž„ๅ’Œๅ…ฅๅฃๆ–‡ไปถใ€‚

## Objective

- ๅˆ›ๅปบๆ ‡ๅ‡†็›ฎๅฝ•็ป“ๆž„
- ็”Ÿๆˆ SKILL.md ๅ…ฅๅฃๆ–‡ไปถ
- ๆ นๆฎๆ‰ง่กŒๆจกๅผๅˆ›ๅปบๅฏนๅบ”็š„ๅญ็›ฎๅฝ•

## Input

- ไพ่ต–: `skill-config.json` (Phase 1 ไบงๅ‡บ)

## Execution Steps

### Step 1: ่ฏปๅ–้…็ฝฎ

```javascript
const config = JSON.parse(Read(`${workDir}/skill-config.json`));
const skillDir = `.claude/skills/${config.skill_name}`;

Step 2: ๅˆ›ๅปบ็›ฎๅฝ•็ป“ๆž„

// ๅŸบ็ก€็›ฎๅฝ•
Bash(`mkdir -p "${skillDir}/phases"`);
Bash(`mkdir -p "${skillDir}/specs"`);
Bash(`mkdir -p "${skillDir}/templates"`);

// Autonomous ๆจกๅผ้ขๅค–็›ฎๅฝ•
if (config.execution_mode === 'autonomous' || config.execution_mode === 'hybrid') {
  Bash(`mkdir -p "${skillDir}/phases/actions"`);
}

// ๅฏ้€‰: scripts ็›ฎๅฝ•
if (config.needs_scripts) {
  Bash(`mkdir -p "${skillDir}/scripts"`);
}

Step 3: ็”Ÿๆˆ SKILL.md

const skillMdTemplate = `---
name: ${config.skill_name}
description: ${config.description}. Triggers on ${config.triggers.map(t => `"${t}"`).join(", ")}.
allowed-tools: ${config.allowed_tools.join(", ")}
---

# ${config.display_name}

${config.description}

## Architecture Overview

\`\`\`
${generateArchitectureDiagram(config)}
\`\`\`

## Key Design Principles

${generateDesignPrinciples(config)}

## Execution Flow

${generateExecutionFlow(config)}

## Directory Setup

\`\`\`javascript
const timestamp = new Date().toISOString().slice(0,19).replace(/[-:T]/g, '');
const workDir = \`${config.output.location.replace('{timestamp}', '${timestamp}')}\`;

Bash(\`mkdir -p "\${workDir}"\`);
${config.execution_mode === 'sequential' ? 
  `Bash(\`mkdir -p "\${workDir}/sections"\`);` : 
  `Bash(\`mkdir -p "\${workDir}/state"\`);`}
\`\`\`

## Output Structure

\`\`\`
${generateOutputStructure(config)}
\`\`\`

## Reference Documents

${generateReferenceTable(config)}
`;

Write(`${skillDir}/SKILL.md`, skillMdTemplate);

Step 4: ๆžถๆž„ๅ›พ็”Ÿๆˆๅ‡ฝๆ•ฐ

function generateArchitectureDiagram(config) {
  if (config.execution_mode === 'sequential') {
    return config.sequential_config.phases.map((p, i) => 
      `โ”‚  Phase ${i+1}: ${p.name.padEnd(15)} โ†’ ${p.output || 'output-' + (i+1) + '.json'}${' '.repeat(10)}โ”‚`
    ).join('\nโ”‚           โ†“' + ' '.repeat(45) + 'โ”‚\n');
  } else {
    return `
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚           Orchestrator (็Šถๆ€้ฉฑๅŠจๅ†ณ็ญ–)                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ†“           โ†“           โ†“
${config.autonomous_config.actions.slice(0, 3).map(a => 
  `โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  `).join('')}
${config.autonomous_config.actions.slice(0, 3).map(a => 
  `โ”‚${a.name.slice(0, 7).padEnd(7)}โ”‚  `).join('')}
${config.autonomous_config.actions.slice(0, 3).map(a => 
  `โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  `).join('')}`;
  }
}

function generateDesignPrinciples(config) {
  const common = [
    "1. **่ง„่Œƒ้ตๅพช**: ไธฅๆ ผ้ตๅพช `_shared/SKILL-DESIGN-SPEC.md`",
    "2. **็ฎ€่ฆ่ฟ”ๅ›ž**: Agent ่ฟ”ๅ›ž่ทฏๅพ„+ๆ‘˜่ฆ๏ผŒ้ฟๅ…ไธŠไธ‹ๆ–‡ๆบขๅ‡บ"
  ];
  
  if (config.execution_mode === 'sequential') {
    return [...common,
      "3. **้˜ถๆฎต้š”็ฆป**: ๆฏไธช้˜ถๆฎต็‹ฌ็ซ‹ๅฏๆต‹",
      "4. **้“พๅผ่พ“ๅ‡บ**: ้˜ถๆฎตไบงๅ‡บไฝœไธบไธ‹้˜ถๆฎต่พ“ๅ…ฅ"
    ].join('\n');
  } else {
    return [...common,
      "3. **็Šถๆ€้ฉฑๅŠจ**: ๆ˜พๅผ็Šถๆ€็ฎก็†๏ผŒๅŠจๆ€ๅ†ณ็ญ–",
      "4. **ๅŠจไฝœ็‹ฌ็ซ‹**: ๆฏไธชๅŠจไฝœๆ— ๅ‰ฏไฝœ็”จไพ่ต–"
    ].join('\n');
  }
}

function generateExecutionFlow(config) {
  if (config.execution_mode === 'sequential') {
    return '```\n' + config.sequential_config.phases.map((p, i) => 
      `โ”œโ”€ Phase ${i+1}: ${p.name}\nโ”‚  โ†’ Output: ${p.output || 'output.json'}`
    ).join('\n') + '\n```';
  } else {
    return `\`\`\`
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Orchestrator Loop                                               โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                 โ”‚
โ”‚  โ”‚ Read     โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚ Select   โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚ Execute  โ”‚                 โ”‚
โ”‚  โ”‚ State    โ”‚     โ”‚ Action   โ”‚     โ”‚ Action   โ”‚                 โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                 โ”‚
โ”‚       โ–ฒ                                  โ”‚                       โ”‚
โ”‚       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Update State โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
\`\`\``;
  }
}

function generateOutputStructure(config) {
  const base = `${config.output.location}/
โ”œโ”€โ”€ ${config.execution_mode === 'sequential' ? 'sections/' : 'state.json'}`;
  
  if (config.execution_mode === 'sequential') {
    return base + '\n' + config.sequential_config.phases.map(p => 
      `โ”‚   โ””โ”€โ”€ ${p.output || 'section-' + p.id + '.md'}`
    ).join('\n') + `\nโ””โ”€โ”€ ${config.output.filename_pattern}`;
  } else {
    return base + `
โ”œโ”€โ”€ actions-log.json
โ””โ”€โ”€ ${config.output.filename_pattern}`;
  }
}

function generateReferenceTable(config) {
  const rows = [];
  
  if (config.execution_mode === 'sequential') {
    config.sequential_config.phases.forEach(p => {
      rows.push(`| [phases/${p.id}.md](phases/${p.id}.md) | ${p.name} |`);
    });
  } else {
    rows.push(`| [phases/orchestrator.md](phases/orchestrator.md) | ็ผ–ๆŽ’ๅ™จ |`);
    rows.push(`| [phases/state-schema.md](phases/state-schema.md) | ็Šถๆ€ๅฎšไน‰ |`);
    config.autonomous_config.actions.forEach(a => {
      rows.push(`| [phases/actions/${a.id}.md](phases/actions/${a.id}.md) | ${a.name} |`);
    });
  }
  
  rows.push(`| [specs/${config.skill_name}-requirements.md](specs/${config.skill_name}-requirements.md) | ้ข†ๅŸŸ่ง„่Œƒ |`);
  rows.push(`| [specs/quality-standards.md](specs/quality-standards.md) | ่ดจ้‡ๆ ‡ๅ‡† |`);
  
  return `| Document | Purpose |\n|----------|---------||\n` + rows.join('\n');
}

Output

  • Directory: .claude/skills/{skill-name}/
  • Files:
    • SKILL.md (ๅ…ฅๅฃๆ–‡ไปถ)
    • phases/ (็ฉบ็›ฎๅฝ•)
    • specs/ (็ฉบ็›ฎๅฝ•)
    • templates/ (็ฉบ็›ฎๅฝ•)

Next Phase

โ†’ Phase 3: Phase Generation


### phases/03-phase-generation.md

```markdown
# Phase 3: Phase Generation

ๆ นๆฎๆ‰ง่กŒๆจกๅผ็”Ÿๆˆ Phase ๆ–‡ไปถ๏ผŒๅŒ…ๅซๅฃฐๆ˜Žๅผๅทฅไฝœๆต็ผ–ๆŽ’ๅ’ŒไธŠไธ‹ๆ–‡็ญ–็•ฅๆ”ฏๆŒใ€‚

## Objective

- Sequential ๆจกๅผ๏ผš็”Ÿๆˆ้กบๅบ Phase ๆ–‡ไปถ + **ๅฃฐๆ˜Žๅผ็ผ–ๆŽ’ๅ™จ**
- Autonomous ๆจกๅผ๏ผš็”Ÿๆˆ็ผ–ๆŽ’ๅ™จๅ’ŒๅŠจไฝœๆ–‡ไปถ
- ๆ”ฏๆŒ **ๆ–‡ไปถไธŠไธ‹ๆ–‡** ๅ’Œ **ๅ†…ๅญ˜ไธŠไธ‹ๆ–‡** ไธค็ง็ญ–็•ฅ

## Input

- ไพ่ต–: `skill-config.json`, SKILL.md (Phase 1-2 ไบงๅ‡บ)
- ๆจกๆฟ: `templates/sequential-phase.md`, `templates/autonomous-*.md`

## ไธŠไธ‹ๆ–‡็ญ–็•ฅ (P0 ๅขžๅผบ)

ๆ นๆฎ `config.context_strategy` ็”ŸๆˆไธๅŒ็š„ไธŠไธ‹ๆ–‡็ฎก็†ไปฃ็ ๏ผš

| ็ญ–็•ฅ | ้€‚็”จๅœบๆ™ฏ | ไผ˜็‚น | ็ผบ็‚น |
|------|----------|------|------|
| `file` | ๅคๆ‚ๅคš้˜ถๆฎตไปปๅŠก | ๆŒไน…ๅŒ–ใ€ๅฏ่ฐƒ่ฏ•ใ€ๅฏๆขๅค | IO ๅผ€้”€ |
| `memory` | ็ฎ€ๅ•็บฟๆ€งไปปๅŠก | ้€Ÿๅบฆๅฟซ | ๆ— ๆณ•ๆขๅคใ€่ฐƒ่ฏ•ๅ›ฐ้šพ |

```javascript
const CONTEXT_STRATEGIES = {
  file: {
    read: (key) => `JSON.parse(Read(\`\${workDir}/context/${key}.json\`))`,
    write: (key, data) => `Write(\`\${workDir}/context/${key}.json\`, JSON.stringify(${data}, null, 2))`,
    init: `Bash(\`mkdir -p "\${workDir}/context"\`)`
  },
  memory: {
    read: (key) => `state.context.${key}`,
    write: (key, data) => `state.context.${key} = ${data}`,
    init: `state.context = {}`
  }
};

Execution Steps

Step 1: ่ฏปๅ–้…็ฝฎๅ’Œๆจกๆฟ

const config = JSON.parse(Read(`${workDir}/skill-config.json`));
const skillDir = `.claude/skills/${config.skill_name}`;
const contextStrategy = config.context_strategy || 'file'; // ้ป˜่ฎคๆ–‡ไปถ็ญ–็•ฅ

// ่ฏปๅ–ๆจกๆฟ
const skillRoot = '.claude/skills/skill-generator';

Step 2: Sequential ๆจกๅผ - ็”Ÿๆˆ้˜ถๆฎตๆ–‡ไปถ + ๅฃฐๆ˜Žๅผ็ผ–ๆŽ’ๅ™จ

if (config.execution_mode === 'sequential') {
  const phases = config.sequential_config.phases;
  
  // ========== P0 ๅขžๅผบ: ็”Ÿๆˆๅฃฐๆ˜Žๅผ็ผ–ๆŽ’ๅ™จ ==========
  const workflowOrchestrator = generateSequentialOrchestrator(config, phases);
  Write(`${skillDir}/phases/_orchestrator.md`, workflowOrchestrator);
  
  // ========== P0 ๅขžๅผบ: ็”Ÿๆˆๅทฅไฝœๆตๅฎšไน‰ ==========
  const workflowDef = generateWorkflowDefinition(config, phases);
  Write(`${skillDir}/workflow.json`, JSON.stringify(workflowDef, null, 2));
  
  // ็”Ÿๆˆๅ„้˜ถๆฎตๆ–‡ไปถ
  for (let i = 0; i < phases.length; i++) {
    const phase = phases[i];
    const prevPhase = i > 0 ? phases[i-1] : null;
    const nextPhase = i < phases.length - 1 ? phases[i+1] : null;
    
    const content = generateSequentialPhase({
      phaseNumber: i + 1,
      phaseId: phase.id,
      phaseName: phase.name,
      phaseDescription: phase.description || `Execute ${phase.name}`,
      input: prevPhase ? prevPhase.output : "user input",
      output: phase.output,
      nextPhase: nextPhase ? nextPhase.id : null,
      config: config,
      contextStrategy: contextStrategy
    });
    
    Write(`${skillDir}/phases/${phase.id}.md`, content);
  }
}

// ========== P0 ๅขžๅผบ: ๅฃฐๆ˜Žๅผๅทฅไฝœๆตๅฎšไน‰ ==========
function generateWorkflowDefinition(config, phases) {
  return {
    skill_name: config.skill_name,
    version: "1.0.0",
    execution_mode: "sequential",
    context_strategy: config.context_strategy || "file",
    
    // ๅฃฐๆ˜Žๅผ้˜ถๆฎตๅˆ—่กจ (็ฑปไผผ software-manual ็š„ agents_to_run)
    phases_to_run: phases.map(p => p.id),
    
    // ้˜ถๆฎต้…็ฝฎ
    phases: phases.map((p, i) => ({
      id: p.id,
      name: p.name,
      order: i + 1,
      input: i > 0 ? phases[i-1].output : null,
      output: p.output,
      // ๅฏ้€‰็š„ๅนถ่กŒ้…็ฝฎ
      parallel: p.parallel || false,
      // ๅฏ้€‰็š„ๆกไปถๆ‰ง่กŒ
      condition: p.condition || null,
      // Agent ้…็ฝฎ
      agent: p.agent || {
        type: "universal-executor",
        run_in_background: false
      }
    })),
    
    // ็ปˆๆญขๆกไปถ
    termination: {
      on_success: "all_phases_completed",
      on_error: "stop_and_report",
      max_retries: 3
    }
  };
}

// ========== P0 ๅขžๅผบ: ๅฃฐๆ˜Žๅผ็ผ–ๆŽ’ๅ™จ ==========
function generateSequentialOrchestrator(config, phases) {
  return `# Sequential Orchestrator

ๅฃฐๆ˜Žๅผๅทฅไฝœๆต็ผ–ๆŽ’ๅ™จ๏ผŒๆŒ‰ \`workflow.json\` ๅฎšไน‰้กบๅบๆ‰ง่กŒ้˜ถๆฎตใ€‚

## ๅทฅไฝœๆตๅฎšไน‰

\`\`\`javascript
const workflow = JSON.parse(Read(\`\${skillDir}/workflow.json\`));
\`\`\`

## ็ผ–ๆŽ’้€ป่พ‘

\`\`\`javascript
async function runSequentialWorkflow(workDir) {
  const workflow = JSON.parse(Read(\`\${skillDir}/workflow.json\`));
  const contextStrategy = workflow.context_strategy;
  
  // ๅˆๅง‹ๅŒ–ไธŠไธ‹ๆ–‡
  ${config.context_strategy === 'file' ? 
    `Bash(\`mkdir -p "\${workDir}/context"\`);` :
    `const state = { context: {} };`}
  
  // ๆ‰ง่กŒ็Šถๆ€่ฟฝ่ธช
  const execution = {
    started_at: new Date().toISOString(),
    phases_completed: [],
    current_phase: null,
    errors: []
  };
  
  Write(\`\${workDir}/execution-state.json\`, JSON.stringify(execution, null, 2));
  
  // ๆŒ‰ๅฃฐๆ˜Ž้กบๅบๆ‰ง่กŒ้˜ถๆฎต
  for (const phaseId of workflow.phases_to_run) {
    const phaseConfig = workflow.phases.find(p => p.id === phaseId);
    
    // ๆ›ดๆ–ฐๆ‰ง่กŒ็Šถๆ€
    execution.current_phase = phaseId;
    Write(\`\${workDir}/execution-state.json\`, JSON.stringify(execution, null, 2));
    
    console.log(\`[Orchestrator] Executing: \${phaseId}\`);
    
    try {
      // ๆฃ€ๆŸฅๆกไปถๆ‰ง่กŒ
      if (phaseConfig.condition) {
        const shouldRun = evaluateCondition(phaseConfig.condition, execution);
        if (!shouldRun) {
          console.log(\`[Orchestrator] Skipping \${phaseId} (condition not met)\`);
          continue;
        }
      }
      
      // ๆ‰ง่กŒ้˜ถๆฎต
      const result = await executePhase(phaseId, phaseConfig, workDir);
      
      // ่ฎฐๅฝ•ๅฎŒๆˆ
      execution.phases_completed.push({
        id: phaseId,
        completed_at: new Date().toISOString(),
        output: phaseConfig.output
      });
      
    } catch (error) {
      execution.errors.push({
        phase: phaseId,
        message: error.message,
        timestamp: new Date().toISOString()
      });
      
      // ้”™่ฏฏๅค„็†็ญ–็•ฅ
      if (workflow.termination.on_error === 'stop_and_report') {
        console.error(\`[Orchestrator] Failed at \${phaseId}: \${error.message}\`);
        break;
      }
    }
    
    Write(\`\${workDir}/execution-state.json\`, JSON.stringify(execution, null, 2));
  }
  
  // ๅฎŒๆˆ
  execution.current_phase = null;
  execution.completed_at = new Date().toISOString();
  Write(\`\${workDir}/execution-state.json\`, JSON.stringify(execution, null, 2));
  
  return execution;
}

async function executePhase(phaseId, phaseConfig, workDir) {
  const phasePrompt = Read(\`\${skillDir}/phases/\${phaseId}.md\`);
  
  // ไฝฟ็”จ Task ่ฐƒ็”จ Agent
  const result = await Task({
    subagent_type: phaseConfig.agent?.type || 'universal-executor',
    run_in_background: phaseConfig.agent?.run_in_background || false,
    prompt: \`
[PHASE] \${phaseId}
[WORK_DIR] \${workDir}
[INPUT] \${phaseConfig.input ? \`\${workDir}/\${phaseConfig.input}\` : 'None'}
[OUTPUT] \${workDir}/\${phaseConfig.output}

\${phasePrompt}
\`
  });
  
  return JSON.parse(result);
}
\`\`\`

## ้˜ถๆฎตๆ‰ง่กŒ่ฎกๅˆ’

| Order | Phase | Input | Output | Agent |
|-------|-------|-------|--------|-------|
${phases.map((p, i) => 
  `| ${i+1} | ${p.id} | ${i > 0 ? phases[i-1].output : '-'} | ${p.output} | ${p.agent?.type || 'universal-executor'} |`
).join('\n')}

## ้”™่ฏฏๆขๅค

\`\`\`javascript
// ไปŽๆŒ‡ๅฎš้˜ถๆฎตๆขๅคๆ‰ง่กŒ
async function resumeFromPhase(phaseId, workDir) {
  const workflow = JSON.parse(Read(\`\${skillDir}/workflow.json\`));
  const startIndex = workflow.phases_to_run.indexOf(phaseId);
  
  if (startIndex === -1) {
    throw new Error(\`Phase not found: \${phaseId}\`);
  }
  
  // ไปŽๆŒ‡ๅฎš้˜ถๆฎตๅผ€ๅง‹ๆ‰ง่กŒ
  const remainingPhases = workflow.phases_to_run.slice(startIndex);
  // ...็ปง็ปญๆ‰ง่กŒ
}
\`\`\`
`;
}

// ็”Ÿๆˆ้˜ถๆฎตๆ–‡ไปถ๏ผˆๅขžๅผบไธŠไธ‹ๆ–‡็ญ–็•ฅๆ”ฏๆŒ๏ผ‰
function generateSequentialPhase(params) {
  const contextCode = params.contextStrategy === 'file' ? {
    readPrev: `const prevOutput = JSON.parse(Read(\`\${workDir}/${params.input}\`));`,
    writeResult: `Write(\`\${workDir}/${params.output}\`, JSON.stringify(result, null, 2));`,
    readContext: (key) => `JSON.parse(Read(\`\${workDir}/context/${key}.json\`))`,
    writeContext: (key) => `Write(\`\${workDir}/context/${key}.json\`, JSON.stringify(data, null, 2))`
  } : {
    readPrev: `const prevOutput = state.context.prevPhaseOutput;`,
    writeResult: `state.context.${params.phaseId.replace(/-/g, '_')}_output = result;`,
    readContext: (key) => `state.context.${key}`,
    writeContext: (key) => `state.context.${key} = data`
  };

  return `# Phase ${params.phaseNumber}: ${params.phaseName}

${params.phaseDescription}

## Objective

- ไธป่ฆ็›ฎๆ ‡ๆ่ฟฐ
- ๅ…ทไฝ“ไปปๅŠกๅˆ—่กจ

## Input

- ไพ่ต–: \`${params.input}\`
- ้…็ฝฎ: \`{workDir}/skill-config.json\`
- ไธŠไธ‹ๆ–‡็ญ–็•ฅ: \`${params.contextStrategy}\`

## Execution Steps

### Step 1: ่ฏปๅ–่พ“ๅ…ฅ

\`\`\`javascript
// ไธŠไธ‹ๆ–‡็ญ–็•ฅ: ${params.contextStrategy}
${params.phaseNumber > 1 ? contextCode.readPrev : '// ้ฆ–้˜ถๆฎต๏ผŒ็›ดๆŽฅไปŽ้…็ฝฎๅผ€ๅง‹'}
\`\`\`

### Step 2: ๆ ธๅฟƒๅค„็†

\`\`\`javascript
// TODO: ๅฎž็Žฐๆ ธๅฟƒ้€ป่พ‘
const result = {
  status: 'completed',
  data: {
    // ๅค„็†็ป“ๆžœ
  },
  metadata: {
    phase: '${params.phaseId}',
    timestamp: new Date().toISOString()
  }
};
\`\`\`

### Step 3: ่พ“ๅ‡บ็ป“ๆžœ

\`\`\`javascript
// ๅ†™ๅ…ฅ้˜ถๆฎตไบงๅ‡บ (ไธŠไธ‹ๆ–‡็ญ–็•ฅ: ${params.contextStrategy})
${contextCode.writeResult}

// ่ฟ”ๅ›ž็ฎ€่ฆไฟกๆฏ็ป™็ผ–ๆŽ’ๅ™จ
return {
  status: 'completed',
  output_file: '${params.output}',
  summary: '้˜ถๆฎต ${params.phaseNumber} ๅฎŒๆˆ'
};
\`\`\`

## Output

- **File**: \`${params.output}\`
- **Format**: ${params.output.endsWith('.json') ? 'JSON' : 'Markdown'}
- **Context Strategy**: ${params.contextStrategy}

## Quality Checklist

- [ ] ่พ“ๅ…ฅๆ•ฐๆฎ้ชŒ่ฏ้€š่ฟ‡
- [ ] ๆ ธๅฟƒ้€ป่พ‘ๆ‰ง่กŒๆˆๅŠŸ
- [ ] ่พ“ๅ‡บๆ ผๅผๆญฃ็กฎ
- [ ] ไธŠไธ‹ๆ–‡ๆญฃ็กฎไฟๅญ˜

${params.nextPhase ? 
  `## Next Phase\n\nโ†’ [Phase ${params.phaseNumber + 1}: ${params.nextPhase}](${params.nextPhase}.md)` : 
  `## Completion\n\nๆญคไธบๆœ€ๅŽ้˜ถๆฎต๏ผŒ่พ“ๅ‡บๆœ€็ปˆไบง็‰ฉใ€‚`}
`;
}

Step 3: Autonomous ๆจกๅผ - ็”Ÿๆˆ็ผ–ๆŽ’ๅ™จ (ๅขžๅผบ็‰ˆ)

if (config.execution_mode === 'autonomous' || config.execution_mode === 'hybrid') {
  const contextStrategy = config.context_strategy || 'file';
  
  // ็”Ÿๆˆ็Šถๆ€ Schema (ๅขžๅผบๆ–‡ไปถ็ญ–็•ฅๆ”ฏๆŒ)
  const stateSchema = generateStateSchema(config, contextStrategy);
  Write(`${skillDir}/phases/state-schema.md`, stateSchema);
  
  // ็”Ÿๆˆ็ผ–ๆŽ’ๅ™จ (ๅขžๅผบ็‰ˆ)
  const orchestrator = generateEnhancedOrchestrator(config, contextStrategy);
  Write(`${skillDir}/phases/orchestrator.md`, orchestrator);
  
  // ็”ŸๆˆๅŠจไฝœ็›ฎๅฝ•
  const actionCatalog = generateActionCatalog(config);
  Write(`${skillDir}/specs/action-catalog.md`, actionCatalog);
  
  // ็”ŸๆˆๅŠจไฝœๆ–‡ไปถ
  for (const action of config.autonomous_config.actions) {
    const actionContent = generateEnhancedAction(action, config, contextStrategy);
    Write(`${skillDir}/phases/actions/${action.id}.md`, actionContent);
  }
}

// ๅขžๅผบ็‰ˆ็ผ–ๆŽ’ๅ™จ็”Ÿๆˆ
function generateEnhancedOrchestrator(config, contextStrategy) {
  const actions = config.autonomous_config.actions;
  
  return `# Orchestrator (Enhanced)

ๅขžๅผบ็‰ˆ็ผ–ๆŽ’ๅ™จ๏ผŒๆ”ฏๆŒๅฃฐๆ˜ŽๅผๅŠจไฝœ่ฐƒๅบฆๅ’Œๆ–‡ไปถไธŠไธ‹ๆ–‡็ญ–็•ฅใ€‚

## ้…็ฝฎ

- **ไธŠไธ‹ๆ–‡็ญ–็•ฅ**: ${contextStrategy}
- **็ปˆๆญขๆกไปถ**: ${config.autonomous_config.termination_conditions?.join(', ') || 'task_completed'}

## ๅฃฐๆ˜ŽๅผๅŠจไฝœ็›ฎๅฝ•

\`\`\`javascript
const ACTION_CATALOG = ${JSON.stringify(actions.map(a => ({
  id: a.id,
  name: a.name,
  preconditions: a.preconditions || [],
  effects: a.effects || [],
  priority: a.priority || 0
})), null, 2)};
\`\`\`

## ไธŠไธ‹ๆ–‡็ฎก็† (${contextStrategy} ็ญ–็•ฅ)

\`\`\`javascript
const ContextManager = {
  ${contextStrategy === 'file' ? `
  // ๆ–‡ไปถ็ญ–็•ฅ: ๆŒไน…ๅŒ–ๅˆฐ .scratchpad
  init: (workDir) => {
    Bash(\`mkdir -p "\${workDir}/context"\`);
    Write(\`\${workDir}/state.json\`, JSON.stringify(initialState, null, 2));
  },
  
  readState: (workDir) => JSON.parse(Read(\`\${workDir}/state.json\`)),
  
  writeState: (workDir, state) => {
    state.updated_at = new Date().toISOString();
    Write(\`\${workDir}/state.json\`, JSON.stringify(state, null, 2));
  },
  
  readContext: (workDir, key) => {
    try {
      return JSON.parse(Read(\`\${workDir}/context/\${key}.json\`));
    } catch { return null; }
  },
  
  writeContext: (workDir, key, data) => {
    Write(\`\${workDir}/context/\${key}.json\`, JSON.stringify(data, null, 2));
  }` : `
  // ๅ†…ๅญ˜็ญ–็•ฅ: ไป…ๅœจ่ฟ่กŒๆ—ถไฟๆŒ
  state: null,
  context: {},
  
  init: (workDir) => {
    ContextManager.state = { ...initialState };
    ContextManager.context = {};
  },
  
  readState: () => ContextManager.state,
  
  writeState: (workDir, state) => {
    state.updated_at = new Date().toISOString();
    ContextManager.state = state;
  },
  
  readContext: (workDir, key) => ContextManager.context[key],
  
  writeContext: (workDir, key, data) => {
    ContextManager.context[key] = data;
  }`}
};
\`\`\`

## ๅ†ณ็ญ–้€ป่พ‘

\`\`\`javascript
function selectNextAction(state) {
  // 1. ็ปˆๆญขๆกไปถๆฃ€ๆŸฅ
${config.autonomous_config.termination_conditions?.map(c => 
  `  if (${getTerminationCheck(c)}) return null;`
).join('\n') || '  if (state.status === "completed") return null;'}
  
  // 2. ้”™่ฏฏ้™ๅˆถๆฃ€ๆŸฅ
  if (state.error_count >= 3) return 'action-abort';
  
  // 3. ๆŒ‰ไผ˜ๅ…ˆ็บง้€‰ๆ‹ฉๆปก่ถณๅ‰็ฝฎๆกไปถ็š„ๅŠจไฝœ
  const availableActions = ACTION_CATALOG
    .filter(a => checkPreconditions(a.preconditions, state))
    .filter(a => !state.completed_actions.includes(a.id))
    .sort((a, b) => b.priority - a.priority);
  
  if (availableActions.length > 0) {
    return availableActions[0].id;
  }
  
  // 4. ้ป˜่ฎคๅฎŒๆˆ
  return 'action-complete';
}

function checkPreconditions(conditions, state) {
  if (!conditions || conditions.length === 0) return true;
  return conditions.every(cond => {
    // ๆ”ฏๆŒๅคš็งๆกไปถๆ ผๅผ
    if (cond.includes('===')) {
      const [left, right] = cond.split('===').map(s => s.trim());
      return eval(\`state.\${left}\`) === eval(right);
    }
    return state[cond] === true;
  });
}
\`\`\`

## ๆ‰ง่กŒๅพช็Žฏ (ๅขžๅผบ็‰ˆ)

\`\`\`javascript
async function runOrchestrator(workDir) {
  console.log('=== Orchestrator Started ===');
  console.log(\`Context Strategy: ${contextStrategy}\`);
  
  // ๅˆๅง‹ๅŒ–
  ContextManager.init(workDir);
  
  let iteration = 0;
  const MAX_ITERATIONS = 100;
  
  while (iteration < MAX_ITERATIONS) {
    iteration++;
    
    // 1. ่ฏปๅ–็Šถๆ€
    const state = ContextManager.readState(workDir);
    console.log(\`[Iteration \${iteration}] Status: \${state.status}, Completed: \${state.completed_actions.length}\`);
    
    // 2. ้€‰ๆ‹ฉๅŠจไฝœ
    const actionId = selectNextAction(state);
    
    if (!actionId) {
      console.log('=== All actions completed ===');
      state.status = 'completed';
      ContextManager.writeState(workDir, state);
      break;
    }
    
    console.log(\`[Iteration \${iteration}] Executing: \${actionId}\`);
    
    // 3. ๆ›ดๆ–ฐๅฝ“ๅ‰ๅŠจไฝœ
    state.current_action = actionId;
    ContextManager.writeState(workDir, state);
    
    // 4. ๆ‰ง่กŒๅŠจไฝœ
    try {
      const actionPrompt = Read(\`\${skillDir}/phases/actions/\${actionId}.md\`);
      
      const result = await Task({
        subagent_type: 'universal-executor',
        run_in_background: false,
        prompt: \`
[STATE]
\${JSON.stringify(state, null, 2)}

[WORK_DIR]
\${workDir}

[CONTEXT_STRATEGY]
${contextStrategy}

[ACTION]
\${actionPrompt}

[RETURN FORMAT]
Return JSON: { "status": "completed"|"failed", "stateUpdates": {...}, "summary": "..." }
\`
      });
      
      const actionResult = JSON.parse(result);
      
      // 5. ๆ›ดๆ–ฐ็Šถๆ€
      state.completed_actions.push(actionId);
      state.current_action = null;
      Object.assign(state, actionResult.stateUpdates || {});
      
      console.log(\`[Iteration \${iteration}] Completed: \${actionResult.summary || actionId}\`);
      
    } catch (error) {
      console.error(\`[Iteration \${iteration}] Error: \${error.message}\`);
      state.errors.push({
        action: actionId,
        message: error.message,
        timestamp: new Date().toISOString()
      });
      state.error_count++;
      state.current_action = null;
    }
    
    ContextManager.writeState(workDir, state);
  }
  
  console.log('=== Orchestrator Finished ===');
  return ContextManager.readState(workDir);
}
\`\`\`

## ๅŠจไฝœ็›ฎๅฝ•

| Action | Priority | Preconditions | Effects |
|--------|----------|---------------|---------|
${actions.map(a => 
  `| [${a.id}](actions/${a.id}.md) | ${a.priority || 0} | ${a.preconditions?.join(', ') || '-'} | ${a.effects?.join(', ') || '-'} |`
).join('\n')}

## ่ฐƒ่ฏ•ไธŽๆขๅค

\`\`\`javascript
// ไปŽ็‰นๅฎš็Šถๆ€ๆขๅค
async function resumeFromState(workDir) {
  const state = ContextManager.readState(workDir);
  console.log(\`Resuming from: \${state.current_action || 'start'}\`);
  console.log(\`Completed actions: \${state.completed_actions.join(', ')}\`);
  return runOrchestrator(workDir);
}

// ้‡่ฏ•ๅคฑ่ดฅ็š„ๅŠจไฝœ
async function retryFailedAction(workDir) {
  const state = ContextManager.readState(workDir);
  if (state.errors.length > 0) {
    const lastError = state.errors[state.errors.length - 1];
    console.log(\`Retrying: \${lastError.action}\`);
    state.error_count = Math.max(0, state.error_count - 1);
    ContextManager.writeState(workDir, state);
    return runOrchestrator(workDir);
  }
}
\`\`\`
`;
}

// ๅขžๅผบ็‰ˆๅŠจไฝœ็”Ÿๆˆ
function generateEnhancedAction(action, config, contextStrategy) {
  return `# Action: ${action.name}

${action.description || 'ๆ‰ง่กŒ ' + action.name + ' ๆ“ไฝœ'}

## Purpose

${action.description || 'TODO: ๆ่ฟฐๆญคๅŠจไฝœ็š„็›ฎ็š„'}

## Preconditions

${action.preconditions?.map(p => `- [ ] \`${p}\``).join('\n') || '- [ ] ๆ— ็‰นๆฎŠๅ‰็ฝฎๆกไปถ'}

## Context Access (${contextStrategy} ็ญ–็•ฅ)

\`\`\`javascript
// ่ฏปๅ–ๅ…ฑไบซไธŠไธ‹ๆ–‡
${contextStrategy === 'file' ?
  `const sharedData = JSON.parse(Read(\`\${workDir}/context/shared.json\`));` :
  `const sharedData = state.context.shared || {};`}

// ๅ†™ๅ…ฅๅ…ฑไบซไธŠไธ‹ๆ–‡
${contextStrategy === 'file' ?
  `Write(\`\${workDir}/context/shared.json\`, JSON.stringify(updatedData, null, 2));` :
  `state.context.shared = updatedData;`}
\`\`\`

## Execution

\`\`\`javascript
async function execute(state, workDir) {
  // 1. ่ฏปๅ–ๅฟ…่ฆๆ•ฐๆฎ
  ${contextStrategy === 'file' ?
    `const input = JSON.parse(Read(\`\${workDir}/context/input.json\`));` :
    `const input = state.context.input || {};`}
  
  // 2. ๆ‰ง่กŒๆ ธๅฟƒ้€ป่พ‘
  // TODO: ๅฎž็ŽฐๅŠจไฝœ้€ป่พ‘
  const result = {
    // ๅค„็†็ป“ๆžœ
  };
  
  // 3. ไฟๅญ˜็ป“ๆžœ (${contextStrategy} ็ญ–็•ฅ)
  ${contextStrategy === 'file' ?
    `Write(\`\${workDir}/context/${action.id.replace(/-/g, '_')}_result.json\`, JSON.stringify(result, null, 2));` :
    `// ็ป“ๆžœ้€š่ฟ‡ stateUpdates ่ฟ”ๅ›ž`}
  
  // 4. ่ฟ”ๅ›ž็Šถๆ€ๆ›ดๆ–ฐ
  return {
    status: 'completed',
    stateUpdates: {
      completed_actions: [...state.completed_actions, '${action.id}'],
      ${contextStrategy === 'memory' ? `context: { ...state.context, ${action.id.replace(/-/g, '_')}_result: result }` : '// ๆ–‡ไปถ็ญ–็•ฅ๏ผš็ป“ๆžœๅทฒไฟๅญ˜ๅˆฐๆ–‡ไปถ'}
    },
    summary: '${action.name} ๅฎŒๆˆ'
  };
}
\`\`\`

## State Updates

\`\`\`javascript
return {
  status: 'completed',
  stateUpdates: {
    completed_actions: [...state.completed_actions, '${action.id}'],
${action.effects?.map(e => `    // Effect: ${e}`).join('\n') || '    // ๆ— ้ขๅค–ๆ•ˆๆžœ'}
  }
};
\`\`\`

## Error Handling

| ้”™่ฏฏ็ฑปๅž‹ | ๅค„็†ๆ–นๅผ |
|----------|----------|
| ๆ•ฐๆฎ้ชŒ่ฏๅคฑ่ดฅ | ่ฟ”ๅ›ž้”™่ฏฏ๏ผŒไธๆ›ดๆ–ฐ็Šถๆ€ |
| ๆ‰ง่กŒๅผ‚ๅธธ | ่ฎฐๅฝ•้”™่ฏฏ๏ผŒๅขžๅŠ  error_count |
| ไธŠไธ‹ๆ–‡่ฏปๅ–ๅคฑ่ดฅ | ไฝฟ็”จ้ป˜่ฎคๅ€ผๆˆ–่ทณ่ฟ‡ |

## Next Actions (Hints)

- ๆˆๅŠŸ: ็”ฑ็ผ–ๆŽ’ๅ™จๆ นๆฎ \`ACTION_CATALOG\` ไผ˜ๅ…ˆ็บงๅ†ณๅฎš
- ๅคฑ่ดฅ: ้‡่ฏ•ๆˆ– \`action-abort\`
`;
}

// ็”ŸๆˆๅŠจไฝœ็›ฎๅฝ•
function generateActionCatalog(config) {
  const actions = config.autonomous_config.actions;
  
  return `# Action Catalog

${config.display_name} ็š„ๅฏ็”จๅŠจไฝœ็›ฎๅฝ•๏ผˆๅฃฐๆ˜Žๅผ๏ผ‰ใ€‚

## ๅŠจไฝœๅฎšไน‰

\`\`\`json
${JSON.stringify(actions.map(a => ({
  id: a.id,
  name: a.name,
  description: a.description,
  preconditions: a.preconditions || [],
  effects: a.effects || [],
  priority: a.priority || 0
})), null, 2)}
\`\`\`

## ๅŠจไฝœไพ่ต–ๅ›พ

\`\`\`mermaid
graph TD
${actions.map((a, i) => {
  const deps = a.preconditions?.filter(p => p.startsWith('completed_actions.includes'))
    .map(p => p.match(/'([^']+)'/)?.[1])
    .filter(Boolean) || [];
  
  if (deps.length === 0 && i === 0) {
    return `    START((Start)) --> ${a.id.replace(/-/g, '_')}[${a.name}]`;
  } else if (deps.length > 0) {
    return deps.map(d => `    ${d.replace(/-/g, '_')} --> ${a.id.replace(/-/g, '_')}[${a.name}]`).join('\n');
  }
  return '';
}).filter(Boolean).join('\n')}
    ${actions[actions.length-1]?.id.replace(/-/g, '_') || 'last'} --> END((End))
\`\`\`

## ้€‰ๆ‹ฉไผ˜ๅ…ˆ็บง

| Priority | Action | Description |
|----------|--------|-------------|
${actions.sort((a, b) => (b.priority || 0) - (a.priority || 0)).map(a => 
  `| ${a.priority || 0} | ${a.id} | ${a.description || a.name} |`
).join('\n')}
`;
}

Step 4: ่พ…ๅŠฉๅ‡ฝๆ•ฐ

function toPascalCase(str) {
  return str.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('');
}

function getDefaultValue(type) {
  if (type.endsWith('[]')) return '[]';
  if (type === 'number') return '0';
  if (type === 'boolean') return 'false';
  if (type === 'string') return '""';
  return '{}';
}

function getTerminationCheck(condition) {
  const checks = {
    'user_exit': 'state.status === "user_exit"',
    'error_limit': 'state.error_count >= 3',
    'task_completed': 'state.status === "completed"',
    'max_iterations': 'iteration >= MAX_ITERATIONS'
  };
  return checks[condition] || `state.${condition}`;
}

function getPreconditionCheck(action) {
  if (!action.preconditions?.length) return 'true';
  return action.preconditions.map(p => `state.${p}`).join(' && ');
}

Output

Sequential ๆจกๅผ

  • phases/_orchestrator.md (ๅฃฐๆ˜Žๅผ็ผ–ๆŽ’ๅ™จ)
  • workflow.json (ๅทฅไฝœๆตๅฎšไน‰)
  • phases/01-{step}.md, 02-{step}.md, ...

Autonomous ๆจกๅผ

  • phases/orchestrator.md (ๅขžๅผบ็‰ˆ็ผ–ๆŽ’ๅ™จ)
  • phases/state-schema.md
  • specs/action-catalog.md (ๅฃฐๆ˜ŽๅผๅŠจไฝœ็›ฎๅฝ•)
  • phases/actions/action-{name}.md (ๅคšไธช)

Next Phase

โ†’ Phase 4: Specs & Templates


### phases/04-specs-templates.md

```markdown
# Phase 4: Specs & Templates Generation

็”Ÿๆˆ่ง„่Œƒๆ–‡ไปถๅ’Œๆจกๆฟๆ–‡ไปถใ€‚

## Objective

- ็”Ÿๆˆ้ข†ๅŸŸ่ง„่Œƒ (`specs/{domain}-requirements.md`)
- ็”Ÿๆˆ่ดจ้‡ๆ ‡ๅ‡† (`specs/quality-standards.md`)
- ็”Ÿๆˆ Agent ๆจกๆฟ (`templates/agent-base.md`)
- Autonomous ๆจกๅผ้ขๅค–็”ŸๆˆๅŠจไฝœ็›ฎๅฝ• (`specs/action-catalog.md`)

## Input

- ไพ่ต–: `skill-config.json`, SKILL.md, phases/*.md

## Execution Steps

### Step 1: ็”Ÿๆˆ้ข†ๅŸŸ่ง„่Œƒ

```javascript
const config = JSON.parse(Read(`${workDir}/skill-config.json`));
const skillDir = `.claude/skills/${config.skill_name}`;

const domainRequirements = `# ${config.display_name} Requirements

${config.description}

## When to Use

| Phase | Usage | Reference |
|-------|-------|-----------|
${config.execution_mode === 'sequential' ? 
  config.sequential_config.phases.map((p, i) => 
    `| Phase ${i+1} | ${p.name} | ${p.id}.md |`
  ).join('\n') :
  `| Orchestrator | ๅŠจไฝœ้€‰ๆ‹ฉ | orchestrator.md |
| Actions | ๅŠจไฝœๆ‰ง่กŒ | actions/*.md |`}

---

## Domain Requirements

### ๅŠŸ่ƒฝ่ฆๆฑ‚

- [ ] ่ฆๆฑ‚1: TODO
- [ ] ่ฆๆฑ‚2: TODO
- [ ] ่ฆๆฑ‚3: TODO

### ่พ“ๅ‡บ่ฆๆฑ‚

- [ ] ๆ ผๅผ: ${config.output.format}
- [ ] ไฝ็ฝฎ: ${config.output.location}
- [ ] ๅ‘ฝๅ: ${config.output.filename_pattern}

### ่ดจ้‡่ฆๆฑ‚

- [ ] ๅฎŒๆ•ดๆ€ง: ๆ‰€ๆœ‰ๅฟ…้œ€ๅ†…ๅฎนๅญ˜ๅœจ
- [ ] ไธ€่‡ดๆ€ง: ๆœฏ่ฏญๅ’Œๆ ผๅผ็ปŸไธ€
- [ ] ๅ‡†็กฎๆ€ง: ๅ†…ๅฎนๅŸบไบŽๅฎž้™…ๅˆ†ๆž

## Validation Function

\`\`\`javascript
function validate${toPascalCase(config.skill_name)}(output) {
  const checks = [
    // TODO: ๆทปๅŠ ้ชŒ่ฏ่ง„ๅˆ™
    { name: "ๆ ผๅผๆญฃ็กฎ", pass: output.format === "${config.output.format}" },
    { name: "ๅ†…ๅฎนๅฎŒๆ•ด", pass: output.content?.length > 0 }
  ];
  
  return {
    passed: checks.filter(c => c.pass).length,
    total: checks.length,
    details: checks
  };
}
\`\`\`

## Error Handling

| Error | Recovery |
|-------|----------|
| ่พ“ๅ…ฅๆ•ฐๆฎ็ผบๅคฑ | ่ฟ”ๅ›žๆ˜Ž็กฎ้”™่ฏฏไฟกๆฏ |
| ๅค„็†่ถ…ๆ—ถ | ็ผฉๅฐ่Œƒๅ›ด๏ผŒ้‡่ฏ• |
| ่พ“ๅ‡บ้ชŒ่ฏๅคฑ่ดฅ | ่ฎฐๅฝ•้—ฎ้ข˜๏ผŒไบบๅทฅๅฎกๆ ธ |
`;

Write(`${skillDir}/specs/${config.skill_name}-requirements.md`, domainRequirements);

Step 2: ็”Ÿๆˆ่ดจ้‡ๆ ‡ๅ‡†

const qualityStandards = `# Quality Standards

${config.display_name} ็š„่ดจ้‡่ฏ„ไผฐๆ ‡ๅ‡†ใ€‚

## Quality Dimensions

### 1. Completeness (ๅฎŒๆ•ดๆ€ง) - 25%

| ่ฆๆฑ‚ | ๆƒ้‡ | ๆฃ€ๆŸฅๆ–นๅผ |
|------|------|----------|
| ๆ‰€ๆœ‰ๅฟ…้œ€่พ“ๅ‡บๅญ˜ๅœจ | 10 | ๆ–‡ไปถๆฃ€ๆŸฅ |
| ๅ†…ๅฎน่ฆ†็›–ๅฎŒๆ•ด | 10 | ๅ†…ๅฎนๅˆ†ๆž |
| ๆ— ๅ ไฝ็ฌฆๆฎ‹็•™ | 5 | ๆ–‡ๆœฌๆœ็ดข |

### 2. Consistency (ไธ€่‡ดๆ€ง) - 25%

| ๆ–น้ข | ๆฃ€ๆŸฅ |
|------|------|
| ๆœฏ่ฏญ | ๅŒไธ€ๆฆ‚ๅฟตไฝฟ็”จ็›ธๅŒๆœฏ่ฏญ |
| ๆ ผๅผ | ๆ ‡้ข˜ๅฑ‚็บงใ€ไปฃ็ ๅ—ๆ ผๅผไธ€่‡ด |
| ้ฃŽๆ ผ | ่ฏญๆฐ”ๅ’Œ่กจ่พพๆ–นๅผ็ปŸไธ€ |

### 3. Accuracy (ๅ‡†็กฎๆ€ง) - 25%

| ่ฆๆฑ‚ | ่ฏดๆ˜Ž |
|------|------|
| ๆ•ฐๆฎๆญฃ็กฎ | ๅผ•็”จๅ’Œๆ•ฐๆฎๆ— ้”™่ฏฏ |
| ้€ป่พ‘ๆญฃ็กฎ | ๆต็จ‹ๅ’Œๅ…ณ็ณปๆ่ฟฐๅ‡†็กฎ |
| ไปฃ็ ๆญฃ็กฎ | ไปฃ็ ็คบไพ‹ๅฏ่ฟ่กŒ |

### 4. Usability (ๅฏ็”จๆ€ง) - 25%

| ๆŒ‡ๆ ‡ | ็›ฎๆ ‡ |
|------|------|
| ๅฏ่ฏปๆ€ง | ็ป“ๆž„ๆธ…ๆ™ฐ๏ผŒๆ˜“ไบŽ็†่งฃ |
| ๅฏๅฏผ่ˆช | ็›ฎๅฝ•ๅ’Œ้“พๆŽฅๆญฃ็กฎ |
| ๅฏๆ“ไฝœ | ๆญฅ้ชคๆ˜Ž็กฎ๏ผŒๅฏๆ‰ง่กŒ |

## Quality Gates

| Gate | Threshold | Action |
|------|-----------|--------|
| Pass | โ‰ฅ 80% | ่พ“ๅ‡บๆœ€็ปˆไบง็‰ฉ |
| Review | 60-79% | ๅค„็†่ญฆๅ‘ŠๅŽ็ปง็ปญ |
| Fail | < 60% | ๅฟ…้กปไฟฎๅค |

## Issue Classification

### Errors (Must Fix)

- ๅฟ…้œ€่พ“ๅ‡บ็ผบๅคฑ
- ๆ•ฐๆฎ้”™่ฏฏ
- ไปฃ็ ไธๅฏ่ฟ่กŒ

### Warnings (Should Fix)

- ๆ ผๅผไธไธ€่‡ด
- ๅ†…ๅฎนๆทฑๅบฆไธ่ถณ
- ็ผบๅฐ‘็คบไพ‹

### Info (Nice to Have)

- ไผ˜ๅŒ–ๅปบ่ฎฎ
- ๅขžๅผบๆœบไผš

## Automated Checks

\`\`\`javascript
function runQualityChecks(workDir) {
  const results = {
    completeness: checkCompleteness(workDir),
    consistency: checkConsistency(workDir),
    accuracy: checkAccuracy(workDir),
    usability: checkUsability(workDir)
  };

  results.overall = (
    results.completeness * 0.25 +
    results.consistency * 0.25 +
    results.accuracy * 0.25 +
    results.usability * 0.25
  );

  return {
    score: results.overall,
    gate: results.overall >= 80 ? 'pass' : 
          results.overall >= 60 ? 'review' : 'fail',
    details: results
  };
}
\`\`\`
`;

Write(`${skillDir}/specs/quality-standards.md`, qualityStandards);

Step 3: ็”Ÿๆˆ Agent ๆจกๆฟ

const agentBase = `# Agent Base Template

${config.display_name} ็š„ Agent ๅŸบ็ก€ๆจกๆฟใ€‚

## ้€š็”จ Prompt ็ป“ๆž„

\`\`\`
[ROLE] ไฝ ๆ˜ฏ{่ง’่‰ฒ}๏ผŒไธ“ๆณจไบŽ{่Œ่ดฃ}ใ€‚

[PROJECT CONTEXT]
Skill: ${config.skill_name}
็›ฎๆ ‡: ${config.description}

[TASK]
{ไปปๅŠกๆ่ฟฐ}
- ่พ“ๅ‡บ: {output_path}
- ๆ ผๅผ: ${config.output.format}

[CONSTRAINTS]
- ็บฆๆŸ1
- ็บฆๆŸ2

[OUTPUT_FORMAT]
1. ๆ‰ง่กŒไปปๅŠก
2. ่ฟ”ๅ›ž JSON ็ฎ€่ฆไฟกๆฏ

[QUALITY_CHECKLIST]
- [ ] ่พ“ๅ‡บๆ ผๅผๆญฃ็กฎ
- [ ] ๅ†…ๅฎนๅฎŒๆ•ดๆ— ้—ๆผ
- [ ] ๆ— ๅ ไฝ็ฌฆๆฎ‹็•™
\`\`\`

## ๅ˜้‡่ฏดๆ˜Ž

| ๅ˜้‡ | ๆฅๆบ | ็คบไพ‹ |
|------|------|------|
| {workDir} | ่ฟ่กŒๆ—ถ | .workflow/.scratchpad/${config.skill_name}-xxx |
| {output_path} | ้…็ฝฎ | ${config.output.location}/${config.output.filename_pattern} |

## ่ฟ”ๅ›žๆ ผๅผ

\`\`\`typescript
interface AgentReturn {
  status: "completed" | "partial" | "failed";
  output_file: string;
  summary: string;  // Max 50 chars
  stats?: {
    items_processed?: number;
    errors?: number;
  };
}
\`\`\`

## ่ง’่‰ฒๅฎšไน‰ๅ‚่€ƒ

${config.execution_mode === 'sequential' ?
  config.sequential_config.phases.map((p, i) => 
    `- **Phase ${i+1} Agent**: ${p.name} ไธ“ๅฎถ`
  ).join('\n') :
  config.autonomous_config.actions.map(a => 
    `- **${a.name} Agent**: ${a.description || a.name + ' ๆ‰ง่กŒ่€…'}`
  ).join('\n')}
`;

Write(`${skillDir}/templates/agent-base.md`, agentBase);

Step 4: Autonomous ๆจกๅผ - ๅŠจไฝœ็›ฎๅฝ•

if (config.execution_mode === 'autonomous' || config.execution_mode === 'hybrid') {
  const actionCatalog = `# Action Catalog

${config.display_name} ็š„ๅฏ็”จๅŠจไฝœ็›ฎๅฝ•ใ€‚

## Available Actions

| Action | Purpose | Preconditions | Effects |
|--------|---------|---------------|---------|
${config.autonomous_config.actions.map(a => 
  `| [${a.id}](../phases/actions/${a.id}.md) | ${a.description || a.name} | ${a.preconditions?.join(', ') || '-'} | ${a.effects?.join(', ') || '-'} |`
).join('\n')}

## Action Dependencies

\`\`\`mermaid
graph TD
${config.autonomous_config.actions.map((a, i, arr) => {
  if (i === 0) return `    ${a.id.replace(/-/g, '_')}[${a.name}]`;
  const prev = arr[i-1];
  return `    ${prev.id.replace(/-/g, '_')} --> ${a.id.replace(/-/g, '_')}[${a.name}]`;
}).join('\n')}
\`\`\`

## State Transitions

| From State | Action | To State |
|------------|--------|----------|
| pending | action-init | running |
${config.autonomous_config.actions.slice(1).map(a => 
  `| running | ${a.id} | running |`
).join('\n')}
| running | action-complete | completed |
| running | action-abort | failed |

## Selection Priority

ๅฝ“ๅคšไธชๅŠจไฝœ็š„ๅ‰็ฝฎๆกไปถ้ƒฝๆปก่ถณๆ—ถ๏ผŒๆŒ‰ไปฅไธ‹ไผ˜ๅ…ˆ็บง้€‰ๆ‹ฉ๏ผš

${config.autonomous_config.actions.map((a, i) => 
  `${i + 1}. \`${a.id}\` - ${a.name}`
).join('\n')}
`;

  Write(`${skillDir}/specs/action-catalog.md`, actionCatalog);
}

Step 5: ่พ…ๅŠฉๅ‡ฝๆ•ฐ

function toPascalCase(str) {
  return str.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('');
}

Output

  • specs/{skill-name}-requirements.md - ้ข†ๅŸŸ่ง„่Œƒ
  • specs/quality-standards.md - ่ดจ้‡ๆ ‡ๅ‡†
  • specs/action-catalog.md - ๅŠจไฝœ็›ฎๅฝ• (Autonomous ๆจกๅผ)
  • templates/agent-base.md - Agent ๆจกๆฟ

Next Phase

โ†’ Phase 5: Validation


### phases/05-validation.md

```markdown
# Phase 5: Validation & Documentation

้ชŒ่ฏ็”Ÿๆˆ็š„ Skill ๅฎŒๆ•ดๆ€งๅนถ็”Ÿๆˆไฝฟ็”จ่ฏดๆ˜Žใ€‚

## Objective

- ้ชŒ่ฏๆ‰€ๆœ‰ๅฟ…้œ€ๆ–‡ไปถๅญ˜ๅœจ
- ๆฃ€ๆŸฅๆ–‡ไปถๅ†…ๅฎนๅฎŒๆ•ดๆ€ง
- ็”Ÿๆˆ README.md ไฝฟ็”จ่ฏดๆ˜Ž
- ่พ“ๅ‡บ้ชŒ่ฏๆŠฅๅ‘Š

## Input

- ไพ่ต–: ๆ‰€ๆœ‰ๅ‰ๅบ้˜ถๆฎตไบงๅ‡บ
- ็”Ÿๆˆ็š„ Skill ็›ฎๅฝ•

## Execution Steps

### Step 1: ๆ–‡ไปถๅฎŒๆ•ดๆ€งๆฃ€ๆŸฅ

```javascript
const config = JSON.parse(Read(`${workDir}/skill-config.json`));
const skillDir = `.claude/skills/${config.skill_name}`;

const requiredFiles = {
  common: [
    'SKILL.md',
    `specs/${config.skill_name}-requirements.md`,
    'specs/quality-standards.md',
    'templates/agent-base.md'
  ],
  sequential: config.sequential_config?.phases?.map(p => `phases/${p.id}.md`) || [],
  autonomous: [
    'phases/orchestrator.md',
    'phases/state-schema.md',
    'specs/action-catalog.md',
    ...(config.autonomous_config?.actions?.map(a => `phases/actions/${a.id}.md`) || [])
  ]
};

const filesToCheck = [
  ...requiredFiles.common,
  ...(config.execution_mode === 'sequential' ? requiredFiles.sequential : requiredFiles.autonomous)
];

const fileCheckResults = filesToCheck.map(file => {
  const fullPath = `${skillDir}/${file}`;
  try {
    const content = Read(fullPath);
    return {
      file: file,
      exists: true,
      size: content.length,
      hasContent: content.length > 100,
      hasTodo: content.includes('TODO')
    };
  } catch (e) {
    return {
      file: file,
      exists: false,
      size: 0,
      hasContent: false,
      hasTodo: false
    };
  }
});

Step 2: ๅ†…ๅฎน่ดจ้‡ๆฃ€ๆŸฅ

const contentChecks = [];

// ๆฃ€ๆŸฅ SKILL.md
const skillMd = Read(`${skillDir}/SKILL.md`);
contentChecks.push({
  file: 'SKILL.md',
  checks: [
    { name: 'Front Matter', pass: skillMd.startsWith('---') },
    { name: 'Architecture', pass: skillMd.includes('## Architecture') },
    { name: 'Execution Flow', pass: skillMd.includes('## Execution Flow') },
    { name: 'References', pass: skillMd.includes('## Reference Documents') }
  ]
});

// ๆฃ€ๆŸฅ Phase ๆ–‡ไปถ
const phaseFiles = Glob(`${skillDir}/phases/*.md`);
for (const phaseFile of phaseFiles) {
  if (phaseFile.includes('/actions/')) continue; // ๅ•็‹ฌๆฃ€ๆŸฅ
  
  const content = Read(phaseFile);
  contentChecks.push({
    file: phaseFile.replace(skillDir + '/', ''),
    checks: [
      { name: 'Objective', pass: content.includes('## Objective') },
      { name: 'Execution', pass: content.includes('## Execution') || content.includes('## Execution Steps') },
      { name: 'Output', pass: content.includes('## Output') },
      { name: 'Code Blocks', pass: content.includes('```') }
    ]
  });
}

// ๆฃ€ๆŸฅ Specs ๆ–‡ไปถ
const specFiles = Glob(`${skillDir}/specs/*.md`);
for (const specFile of specFiles) {
  const content = Read(specFile);
  contentChecks.push({
    file: specFile.replace(skillDir + '/', ''),
    checks: [
      { name: 'Has Content', pass: content.length > 200 },
      { name: 'Has Structure', pass: content.includes('##') },
      { name: 'No Empty Sections', pass: !content.match(/##[^#]+\n\n##/) }
    ]
  });
}

Step 3: ็”Ÿๆˆ้ชŒ่ฏๆŠฅๅ‘Š

const report = {
  skill_name: config.skill_name,
  execution_mode: config.execution_mode,
  generated_at: new Date().toISOString(),
  
  file_checks: {
    total: fileCheckResults.length,
    existing: fileCheckResults.filter(f => f.exists).length,
    with_content: fileCheckResults.filter(f => f.hasContent).length,
    with_todos: fileCheckResults.filter(f => f.hasTodo).length,
    details: fileCheckResults
  },
  
  content_checks: {
    files_checked: contentChecks.length,
    all_passed: contentChecks.every(c => c.checks.every(ch => ch.pass)),
    details: contentChecks
  },
  
  summary: {
    status: calculateOverallStatus(fileCheckResults, contentChecks),
    issues: collectIssues(fileCheckResults, contentChecks),
    recommendations: generateRecommendations(fileCheckResults, contentChecks)
  }
};

Write(`${workDir}/validation-report.json`, JSON.stringify(report, null, 2));

function calculateOverallStatus(fileResults, contentResults) {
  const allFilesExist = fileResults.every(f => f.exists);
  const allContentPassed = contentResults.every(c => c.checks.every(ch => ch.pass));
  
  if (allFilesExist && allContentPassed) return 'PASS';
  if (allFilesExist) return 'REVIEW';
  return 'FAIL';
}

function collectIssues(fileResults, contentResults) {
  const issues = [];
  
  fileResults.filter(f => !f.exists).forEach(f => {
    issues.push({ type: 'ERROR', message: `ๆ–‡ไปถ็ผบๅคฑ: ${f.file}` });
  });
  
  fileResults.filter(f => f.hasTodo).forEach(f => {
    issues.push({ type: 'WARNING', message: `ๅŒ…ๅซ TODO: ${f.file}` });
  });
  
  contentResults.forEach(c => {
    c.checks.filter(ch => !ch.pass).forEach(ch => {
      issues.push({ type: 'WARNING', message: `${c.file}: ็ผบๅฐ‘ ${ch.name}` });
    });
  });
  
  return issues;
}

function generateRecommendations(fileResults, contentResults) {
  const recommendations = [];
  
  if (fileResults.some(f => f.hasTodo)) {
    recommendations.push('ๆ›ฟๆขๆ‰€ๆœ‰ TODO ๅ ไฝ็ฌฆไธบๅฎž้™…ๅ†…ๅฎน');
  }
  
  contentResults.forEach(c => {
    if (c.checks.some(ch => !ch.pass)) {
      recommendations.push(`ๅฎŒๅ–„ ${c.file} ็š„็ป“ๆž„`);
    }
  });
  
  return recommendations;
}

Step 4: ็”Ÿๆˆ README.md

const readme = `# ${config.display_name}

${config.description}

## Quick Start

### ่งฆๅ‘่ฏ

${config.triggers.map(t => `- "${t}"`).join('\n')}

### ๆ‰ง่กŒๆจกๅผ

**${config.execution_mode === 'sequential' ? 'Sequential (้กบๅบ)' : 'Autonomous (่‡ชไธป)'}**

${config.execution_mode === 'sequential' ?
  `้˜ถๆฎตๆŒ‰ๅ›บๅฎš้กบๅบๆ‰ง่กŒ๏ผš\n${config.sequential_config.phases.map((p, i) => 
    `${i + 1}. ${p.name}`
  ).join('\n')}` :
  `ๅŠจไฝœ็”ฑ็ผ–ๆŽ’ๅ™จๅŠจๆ€้€‰ๆ‹ฉ๏ผš\n${config.autonomous_config.actions.map(a => 
    `- ${a.name}: ${a.description || ''}`
  ).join('\n')}`}

## Usage

\`\`\`
# ็›ดๆŽฅ่งฆๅ‘
็”จๆˆท: ${config.triggers[0]}

# ๆˆ–ไฝฟ็”จ Skill ๅ็งฐ
็”จๆˆท: /skill ${config.skill_name}
\`\`\`

## Output

- **ๆ ผๅผ**: ${config.output.format}
- **ไฝ็ฝฎ**: \`${config.output.location}\`
- **ๆ–‡ไปถๅ**: \`${config.output.filename_pattern}\`

## Directory Structure

\`\`\`
.claude/skills/${config.skill_name}/
โ”œโ”€โ”€ SKILL.md                    # ๅ…ฅๅฃๆ–‡ไปถ
โ”œโ”€โ”€ phases/                     # ๆ‰ง่กŒ้˜ถๆฎต
${config.execution_mode === 'sequential' ?
  config.sequential_config.phases.map(p => `โ”‚   โ”œโ”€โ”€ ${p.id}.md`).join('\n') :
  `โ”‚   โ”œโ”€โ”€ orchestrator.md
โ”‚   โ”œโ”€โ”€ state-schema.md
โ”‚   โ””โ”€โ”€ actions/
${config.autonomous_config.actions.map(a => `โ”‚       โ”œโ”€โ”€ ${a.id}.md`).join('\n')}`}
โ”œโ”€โ”€ specs/                      # ่ง„่Œƒๆ–‡ไปถ
โ”‚   โ”œโ”€โ”€ ${config.skill_name}-requirements.md
โ”‚   โ”œโ”€โ”€ quality-standards.md
${config.execution_mode === 'autonomous' ? 'โ”‚   โ””โ”€โ”€ action-catalog.md' : ''}
โ””โ”€โ”€ templates/                  # ๆจกๆฟๆ–‡ไปถ
    โ””โ”€โ”€ agent-base.md
\`\`\`

## Customization

### ไฟฎๆ”นๆ‰ง่กŒ้€ป่พ‘

็ผ–่พ‘ \`phases/\` ็›ฎๅฝ•ไธ‹็š„้˜ถๆฎตๆ–‡ไปถใ€‚

### ่ฐƒๆ•ด่ดจ้‡ๆ ‡ๅ‡†

็ผ–่พ‘ \`specs/quality-standards.md\`ใ€‚

### ๆทปๅŠ ๆ–ฐ${config.execution_mode === 'sequential' ? '้˜ถๆฎต' : 'ๅŠจไฝœ'}

${config.execution_mode === 'sequential' ?
  `1. ๅœจ \`phases/\` ๅˆ›ๅปบๆ–ฐ็š„้˜ถๆฎตๆ–‡ไปถ (ๅฆ‚ \`03.5-new-step.md\`)
2. ๆ›ดๆ–ฐ SKILL.md ็š„ๆ‰ง่กŒๆต็จ‹` :
  `1. ๅœจ \`phases/actions/\` ๅˆ›ๅปบๆ–ฐ็š„ๅŠจไฝœๆ–‡ไปถ
2. ๆ›ดๆ–ฐ \`specs/action-catalog.md\`
3. ๅœจ \`phases/orchestrator.md\` ๆทปๅŠ ้€‰ๆ‹ฉ้€ป่พ‘`}

## Related Documents

- [่ฎพ่ฎก่ง„่Œƒ](../_shared/SKILL-DESIGN-SPEC.md)
- [ๆ‰ง่กŒๆจกๅผ่ง„่Œƒ](specs/../../../skill-generator/specs/execution-modes.md)

---

*Generated by skill-generator v1.0*
`;

Write(`${skillDir}/README.md`, readme);

Step 5: ่พ“ๅ‡บๆœ€็ปˆ็ป“ๆžœ

const finalResult = {
  skill_name: config.skill_name,
  skill_path: skillDir,
  execution_mode: config.execution_mode,
  
  generated_files: [
    'SKILL.md',
    'README.md',
    ...filesToCheck
  ],
  
  validation: report.summary,
  
  next_steps: [
    '1. ๅฎก้˜…็”Ÿๆˆ็š„ๆ–‡ไปถ็ป“ๆž„',
    '2. ๆ›ฟๆข TODO ๅ ไฝ็ฌฆ',
    '3. ๆ นๆฎๅฎž้™…้œ€ๆฑ‚่ฐƒๆ•ด้˜ถๆฎต้€ป่พ‘',
    '4. ๆต‹่ฏ• Skill ๆ‰ง่กŒๆต็จ‹',
    '5. ๆ›ดๆ–ฐ่งฆๅ‘่ฏๅ’Œๆ่ฟฐ'
  ]
};

console.log('=== Skill ็”ŸๆˆๅฎŒๆˆ ===');
console.log(`่ทฏๅพ„: ${skillDir}`);
console.log(`ๆจกๅผ: ${config.execution_mode}`);
console.log(`็Šถๆ€: ${report.summary.status}`);
console.log('');
console.log('ไธ‹ไธ€ๆญฅ:');
finalResult.next_steps.forEach(s => console.log(s));

Output

  • {workDir}/validation-report.json - ้ชŒ่ฏๆŠฅๅ‘Š
  • {skillDir}/README.md - ไฝฟ็”จ่ฏดๆ˜Ž

Completion

Skill ็”Ÿๆˆๆต็จ‹ๅฎŒๆˆใ€‚็”จๆˆทๅฏไปฅ๏ผš

  1. ๆŸฅ็œ‹็”Ÿๆˆ็š„ Skill ็›ฎๅฝ•
  2. ๆ นๆฎ้ชŒ่ฏๆŠฅๅ‘Šไฟฎๅค้—ฎ้ข˜
  3. ่‡ชๅฎšไน‰ๆ‰ง่กŒ้€ป่พ‘
  4. ๆต‹่ฏ• Skill ๅŠŸ่ƒฝ

### specs/execution-modes.md

```markdown
# Execution Modes Specification

ไธค็ง Skill ๆ‰ง่กŒๆจกๅผ็š„่ฏฆ็ป†่ง„่Œƒๅฎšไน‰ใ€‚

---

## ๆจกๅผๆฆ‚่งˆ

| ็‰นๆ€ง | Sequential (้กบๅบ) | Autonomous (่‡ชไธป) |
|------|-------------------|-------------------|
| ๆ‰ง่กŒ้กบๅบ | ๅ›บๅฎš๏ผˆๆ•ฐๅญ—ๅ‰็ผ€๏ผ‰ | ๅŠจๆ€๏ผˆ็ผ–ๆŽ’ๅ™จๅ†ณ็ญ–๏ผ‰ |
| ้˜ถๆฎตไพ่ต– | ๅผบไพ่ต– | ๅผฑไพ่ต–/ๆ— ไพ่ต– |
| ็Šถๆ€็ฎก็† | ้šๅผ๏ผˆ้˜ถๆฎตไบงๅ‡บ๏ผ‰ | ๆ˜พๅผ๏ผˆ็Šถๆ€ๆ–‡ไปถ๏ผ‰ |
| ้€‚็”จๅœบๆ™ฏ | ๆตๆฐด็บฟไปปๅŠก | ไบคไบ’ๅผไปปๅŠก |
| ๅคๆ‚ๅบฆ | ไฝŽ | ไธญ-้ซ˜ |
| ๅฏๆ‰ฉๅฑ•ๆ€ง | ๆ’ๅ…ฅๅญ้˜ถๆฎต | ๆทปๅŠ ๆ–ฐๅŠจไฝœ |

---

## Mode 1: Sequential (้กบๅบๆจกๅผ)

### ๅฎšไน‰

้˜ถๆฎตๆŒ‰ๅ›บๅฎš้กบๅบ็บฟๆ€งๆ‰ง่กŒ๏ผŒๆฏไธช้˜ถๆฎต็š„่พ“ๅ‡บไฝœไธบไธ‹ไธ€้˜ถๆฎต็š„่พ“ๅ…ฅใ€‚

### ็›ฎๅฝ•็ป“ๆž„

phases/ โ”œโ”€โ”€ 01-{first-step}.md โ”œโ”€โ”€ 02-{second-step}.md โ”œโ”€โ”€ 02.5-{sub-step}.md # ๅฏ้€‰๏ผšๅญ้˜ถๆฎต โ”œโ”€โ”€ 03-{third-step}.md โ””โ”€โ”€ ...


### ๆ‰ง่กŒๆต็จ‹

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚Phase 01 โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚Phase 02 โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚Phase 03 โ”‚โ”€โ”€โ”€โ”€โ–ถ ... โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ–ผ โ–ผ โ–ผ output1.json output2.md output3.md


### Phase ๆ–‡ไปถ่ง„่Œƒ

```markdown
# Phase N: {้˜ถๆฎตๅ็งฐ}

{ไธ€ๅฅ่ฏๆ่ฟฐ}

## Objective

{่ฏฆ็ป†็›ฎๆ ‡}

## Input

- ไพ่ต–: {ไธŠไธ€้˜ถๆฎตไบงๅ‡บ}
- ้…็ฝฎ: {้…็ฝฎๆ–‡ไปถ}

## Execution Steps

### Step 1: {ๆญฅ้ชค}
{ๆ‰ง่กŒไปฃ็ ๆˆ–่ฏดๆ˜Ž}

### Step 2: {ๆญฅ้ชค}
{ๆ‰ง่กŒไปฃ็ ๆˆ–่ฏดๆ˜Ž}

## Output

- **File**: `{่พ“ๅ‡บๆ–‡ไปถ}`
- **Format**: {JSON/Markdown}

## Next Phase

โ†’ [Phase N+1: xxx](0N+1-xxx.md)

้€‚็”จๅœบๆ™ฏ

  • ๆ–‡ๆกฃ็”Ÿๆˆ: ๆ”ถ้›† โ†’ ๅˆ†ๆž โ†’ ็ป„่ฃ… โ†’ ไผ˜ๅŒ–
  • ไปฃ็ ๅˆ†ๆž: ๆ‰ซๆ โ†’ ่งฃๆž โ†’ ๆŠฅๅ‘Š
  • ๆ•ฐๆฎๅค„็†: ๆๅ– โ†’ ่ฝฌๆข โ†’ ๅŠ ่ฝฝ

ไผ˜็‚น

  • ้€ป่พ‘ๆธ…ๆ™ฐ๏ผŒๆ˜“ไบŽ็†่งฃ
  • ่ฐƒ่ฏ•็ฎ€ๅ•๏ผŒๅฏ้€้˜ถๆฎต้ชŒ่ฏ
  • ่พ“ๅ‡บๅฏ้ข„ๆต‹

็ผบ็‚น

  • ็ตๆดปๆ€งไฝŽ
  • ้šพไปฅๅค„็†ๅˆ†ๆ”ฏ้€ป่พ‘
  • ็”จๆˆทไบคไบ’ๅ—้™

Mode 2: Autonomous (่‡ชไธปๆจกๅผ)

ๅฎšไน‰

ๆ— ๅ›บๅฎšๆ‰ง่กŒ้กบๅบ๏ผŒ็”ฑ็ผ–ๆŽ’ๅ™จ (Orchestrator) ๆ นๆฎๅฝ“ๅ‰็Šถๆ€ๅŠจๆ€้€‰ๆ‹ฉไธ‹ไธ€ไธชๅŠจไฝœใ€‚

็›ฎๅฝ•็ป“ๆž„

phases/
โ”œโ”€โ”€ orchestrator.md          # ็ผ–ๆŽ’ๅ™จ๏ผšๆ ธๅฟƒๅ†ณ็ญ–้€ป่พ‘
โ”œโ”€โ”€ state-schema.md          # ็Šถๆ€็ป“ๆž„ๅฎšไน‰
โ””โ”€โ”€ actions/                 # ็‹ฌ็ซ‹ๅŠจไฝœ๏ผˆๆ— ้กบๅบ๏ผ‰
    โ”œโ”€โ”€ action-{a}.md
    โ”œโ”€โ”€ action-{b}.md
    โ”œโ”€โ”€ action-{c}.md
    โ””โ”€โ”€ ...

ๆ ธๅฟƒ็ป„ไปถ

1. Orchestrator (็ผ–ๆŽ’ๅ™จ)

# Orchestrator

## Role

ๆ นๆฎๅฝ“ๅ‰็Šถๆ€้€‰ๆ‹ฉๅนถๆ‰ง่กŒไธ‹ไธ€ไธชๅŠจไฝœใ€‚

## State Reading

่ฏปๅ–็Šถๆ€ๆ–‡ไปถ: `{workDir}/state.json`

## Decision Logic

```javascript
function selectNextAction(state) {
  // 1. ๆฃ€ๆŸฅ็ปˆๆญขๆกไปถ
  if (state.status === 'completed') return null;
  if (state.error_count > MAX_RETRIES) return 'action-abort';
  
  // 2. ๆ นๆฎ็Šถๆ€้€‰ๆ‹ฉๅŠจไฝœ
  if (!state.initialized) return 'action-init';
  if (state.pending_items.length > 0) return 'action-process';
  if (state.needs_review) return 'action-review';
  
  // 3. ้ป˜่ฎคๅŠจไฝœ
  return 'action-complete';
}

Execution Loop

while (true) {
  state = readState();
  action = selectNextAction(state);
  if (!action) break;
  
  result = executeAction(action, state);
  updateState(result);
}

#### 2. State Schema (็Šถๆ€็ป“ๆž„)

```markdown
# State Schema

## ็Šถๆ€ๆ–‡ไปถ

ไฝ็ฝฎ: `{workDir}/state.json`

## ็ป“ๆž„ๅฎšไน‰

```typescript
interface SkillState {
  // ๅ…ƒไฟกๆฏ
  skill_name: string;
  started_at: string;
  updated_at: string;
  
  // ๆ‰ง่กŒ็Šถๆ€
  status: 'pending' | 'running' | 'completed' | 'failed';
  current_action: string | null;
  completed_actions: string[];
  
  // ไธšๅŠกๆ•ฐๆฎ
  context: Record<string, any>;
  pending_items: any[];
  results: Record<string, any>;
  
  // ้”™่ฏฏ่ฟฝ่ธช
  errors: Array<{
    action: string;
    message: string;
    timestamp: string;
  }>;
  error_count: number;
}

ๅˆๅง‹็Šถๆ€

{
  "skill_name": "{skill-name}",
  "started_at": "{ISO8601}",
  "updated_at": "{ISO8601}",
  "status": "pending",
  "current_action": null,
  "completed_actions": [],
  "context": {},
  "pending_items": [],
  "results": {},
  "errors": [],
  "error_count": 0
}

#### 3. Action (ๅŠจไฝœ)

```markdown
# Action: {action-name}

## Purpose

{ๅŠจไฝœ็›ฎ็š„}

## Preconditions

- [ ] ๆกไปถ1
- [ ] ๆกไปถ2

## Execution

{ๆ‰ง่กŒ้€ป่พ‘}

## State Updates

```javascript
return {
  completed_actions: [...state.completed_actions, 'action-name'],
  results: {
    ...state.results,
    action_name: { /* ็ป“ๆžœ */ }
  },
  // ๅ…ถไป–็Šถๆ€ๆ›ดๆ–ฐ
};

Next Actions (Hints)

  • ๆˆๅŠŸๆ—ถ: action-{next}
  • ๅคฑ่ดฅๆ—ถ: action-retry ๆˆ– action-abort

### ๆ‰ง่กŒๆต็จ‹

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Orchestrator Loop โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Read โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚ Select โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚ Execute โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ State โ”‚ โ”‚ Action โ”‚ โ”‚ Action โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ–ฒ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ Update โ”‚โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ State โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Termination? โ”‚ โ”‚ โ”‚ โ”‚ - completed โ”‚ โ”‚ โ”‚ โ”‚ - max_retries โ”‚ โ”‚ โ”‚ โ”‚ - user_abort โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜


### ๅŠจไฝœ็›ฎๅฝ• (Action Catalog)

ๅœจ `specs/action-catalog.md` ไธญๅฎšไน‰๏ผš

```markdown
# Action Catalog

## Available Actions

| Action | Purpose | Preconditions | Effects |
|--------|---------|---------------|---------|
| action-init | ๅˆๅง‹ๅŒ–็Šถๆ€ | status=pending | status=running |
| action-process | ๅค„็†ๅพ…ๅŠž้กน | pending_items.length>0 | pending_items-- |
| action-review | ็”จๆˆทๅฎกๆ ธ | needs_review=true | needs_review=false |
| action-complete | ๅฎŒๆˆไปปๅŠก | pending_items.length=0 | status=completed |
| action-abort | ไธญๆญขไปปๅŠก | error_count>MAX | status=failed |

## Action Dependencies Graph

```mermaid
graph TD
    INIT[action-init] --> PROCESS[action-process]
    PROCESS --> PROCESS
    PROCESS --> REVIEW[action-review]
    REVIEW --> PROCESS
    REVIEW --> COMPLETE[action-complete]
    PROCESS --> ABORT[action-abort]

### ้€‚็”จๅœบๆ™ฏ

- **ไบคไบ’ๅผไปปๅŠก**: ้—ฎ็ญ”ใ€ๅฏน่ฏใ€่กจๅ•ๅกซๅ†™
- **็Šถๆ€ๆœบไปปๅŠก**: Issue ็ฎก็†ใ€ๅทฅไฝœๆตๅฎกๆ‰น
- **ๆŽข็ดขๅผไปปๅŠก**: ่ฐƒ่ฏ•ใ€่ฏŠๆ–ญใ€ๆœ็ดข

### ไผ˜็‚น

- ้ซ˜ๅบฆ็ตๆดป๏ผŒ้€‚ๅบ”ๅŠจๆ€้œ€ๆฑ‚
- ๆ”ฏๆŒๅคๆ‚ๅˆ†ๆ”ฏ้€ป่พ‘
- ๆ˜“ไบŽๆ‰ฉๅฑ•ๆ–ฐๅŠจไฝœ

### ็ผบ็‚น

- ๅคๆ‚ๅบฆ้ซ˜
- ็Šถๆ€็ฎก็†ๅผ€้”€
- ่ฐƒ่ฏ•้šพๅบฆๅคง

---

## ๆจกๅผ้€‰ๆ‹ฉๆŒ‡ๅ—

### ๅ†ณ็ญ–ๆต็จ‹

็”จๆˆท้œ€ๆฑ‚ๅˆ†ๆž โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ้˜ถๆฎต้—ดๆ˜ฏๅฆๆœ‰ๅผบไพ่ต–ๅ…ณ็ณป๏ผŸ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”œโ”€โ”€ ๆ˜ฏ โ†’ Sequential โ”‚ โ””โ”€โ”€ ๅฆ โ†’ ็ปง็ปญๅˆคๆ–ญ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๆ˜ฏๅฆ้œ€่ฆๅŠจๆ€ๅ“ๅบ”็”จๆˆทๆ„ๅ›พ๏ผŸ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”œโ”€โ”€ ๆ˜ฏ โ†’ Autonomous โ”‚ โ””โ”€โ”€ ๅฆ โ†’ Sequential


### ๅฟซ้€Ÿๅˆคๆ–ญ่กจ

| ้—ฎ้ข˜ | Sequential | Autonomous |
|------|------------|------------|
| ่พ“ๅ‡บ็ป“ๆž„ๆ˜ฏๅฆๅ›บๅฎš๏ผŸ | โœ“ | โœ— |
| ๆ˜ฏๅฆ้œ€่ฆ็”จๆˆทๅคš่ฝฎไบคไบ’๏ผŸ | โœ— | โœ“ |
| ้˜ถๆฎตๆ˜ฏๅฆๅฏไปฅ่ทณ่ฟ‡/้‡ๅค๏ผŸ | โœ— | โœ“ |
| ๆ˜ฏๅฆๆœ‰ๅคๆ‚ๅˆ†ๆ”ฏ้€ป่พ‘๏ผŸ | โœ— | โœ“ |
| ่ฐƒ่ฏ•ๆ˜ฏๅฆ้œ€่ฆ็ฎ€ๅ•๏ผŸ | โœ“ | โœ— |

---

## ๆททๅˆๆจกๅผ

ๆŸไบ›ๅคๆ‚ Skill ๅฏ่ƒฝ้œ€่ฆๆททๅˆไฝฟ็”จไธค็งๆจกๅผ๏ผš

phases/ โ”œโ”€โ”€ 01-init.md # Sequential: ๅˆๅง‹ๅŒ– โ”œโ”€โ”€ 02-orchestrator.md # Autonomous: ๆ ธๅฟƒไบคไบ’ๅพช็Žฏ โ”‚ โ””โ”€โ”€ actions/ โ”‚ โ”œโ”€โ”€ action-a.md โ”‚ โ””โ”€โ”€ action-b.md โ””โ”€โ”€ 03-finalize.md # Sequential: ๆ”ถๅฐพ


**้€‚็”จๅœบๆ™ฏ**:
- ๅˆๅง‹ๅŒ–ๅ’Œๆ”ถๅฐพๅ›บๅฎš๏ผŒไธญ้—ดไบคไบ’็ตๆดป
- ๅคš้˜ถๆฎตไปปๅŠก๏ผŒๆŸ้˜ถๆฎต้œ€่ฆๅŠจๆ€ๅ†ณ็ญ–

specs/skill-requirements.md

# Skill Requirements Specification

ๆ–ฐ Skill ๅˆ›ๅปบ็š„้œ€ๆฑ‚ๆ”ถ้›†่ง„่Œƒใ€‚

---

## ๅฟ…้œ€ไฟกๆฏ

### 1. ๅŸบๆœฌไฟกๆฏ

| ๅญ—ๆฎต | ็ฑปๅž‹ | ๅฟ…้œ€ | ่ฏดๆ˜Ž |
|------|------|------|------|
| `skill_name` | string | โœ“ | Skill ๆ ‡่ฏ†็ฌฆ๏ผˆๅฐๅ†™-่ฟžๅญ—็ฌฆ๏ผ‰ |
| `display_name` | string | โœ“ | ๆ˜พ็คบๅ็งฐ |
| `description` | string | โœ“ | ไธ€ๅฅ่ฏๆ่ฟฐ |
| `triggers` | string[] | โœ“ | ่งฆๅ‘ๅ…ณ้”ฎ่ฏๅˆ—่กจ |

### 2. ๆ‰ง่กŒๆจกๅผ

| ๅญ—ๆฎต | ็ฑปๅž‹ | ๅฟ…้œ€ | ่ฏดๆ˜Ž |
|------|------|------|------|
| `execution_mode` | enum | โœ“ | `sequential` \| `autonomous` \| `hybrid` |
| `phase_count` | number | ๆกไปถ | Sequential ๆจกๅผไธ‹็š„้˜ถๆฎตๆ•ฐ |
| `action_count` | number | ๆกไปถ | Autonomous ๆจกๅผไธ‹็š„ๅŠจไฝœๆ•ฐ |

### 2.5 ไธŠไธ‹ๆ–‡็ญ–็•ฅ (P0 ๅขžๅผบ)

| ๅญ—ๆฎต | ็ฑปๅž‹ | ๅฟ…้œ€ | ่ฏดๆ˜Ž |
|------|------|------|------|
| `context_strategy` | enum | โœ“ | `file` \| `memory` |

**็ญ–็•ฅๅฏนๆฏ”**:

| ็ญ–็•ฅ | ๆŒไน…ๅŒ– | ๅฏ่ฐƒ่ฏ• | ๅฏๆขๅค | ้€‚็”จๅœบๆ™ฏ |
|------|--------|--------|--------|----------|
| `file` | โœ“ | โœ“ | โœ“ | ๅคๆ‚ๅคš้˜ถๆฎตไปปๅŠก๏ผˆๆŽจ่๏ผ‰ |
| `memory` | โœ— | โœ— | โœ— | ็ฎ€ๅ•็บฟๆ€งไปปๅŠก |

### 2.6 LLM ้›†ๆˆ้…็ฝฎ (P1 ๅขžๅผบ)

| ๅญ—ๆฎต | ็ฑปๅž‹ | ๅฟ…้œ€ | ่ฏดๆ˜Ž |
|------|------|------|------|
| `llm_integration` | object | ๅฏ้€‰ | LLM ่ฐƒ็”จ้…็ฝฎ |
| `llm_integration.enabled` | boolean | - | ๆ˜ฏๅฆๅฏ็”จ LLM ่ฐƒ็”จ |
| `llm_integration.default_tool` | enum | - | `gemini` \| `qwen` \| `codex` |
| `llm_integration.fallback_chain` | string[] | - | ๅคฑ่ดฅๆ—ถ็š„ๅค‡้€‰ๅทฅๅ…ท้“พ |

### 3. ๅทฅๅ…ทไพ่ต–

| ๅญ—ๆฎต | ็ฑปๅž‹ | ๅฟ…้œ€ | ่ฏดๆ˜Ž |
|------|------|------|------|
| `allowed_tools` | string[] | โœ“ | ๅ…่ฎธไฝฟ็”จ็š„ๅทฅๅ…ทๅˆ—่กจ |
| `mcp_tools` | string[] | ๅฏ้€‰ | ้œ€่ฆ็š„ MCP ๅทฅๅ…ท |

### 4. ่พ“ๅ‡บ้…็ฝฎ

| ๅญ—ๆฎต | ็ฑปๅž‹ | ๅฟ…้œ€ | ่ฏดๆ˜Ž |
|------|------|------|------|
| `output_format` | enum | โœ“ | `markdown` \| `html` \| `json` |
| `output_location` | string | โœ“ | ่พ“ๅ‡บ็›ฎๅฝ•ๆจกๅผ |

---

## ้…็ฝฎๆ–‡ไปถ็ป“ๆž„

```typescript
interface SkillConfig {
  // ๅŸบๆœฌไฟกๆฏ
  skill_name: string;           // "my-skill"
  display_name: string;         // "My Skill"
  description: string;          // "ไธ€ๅฅ่ฏๆ่ฟฐ"
  triggers: string[];           // ["keyword1", "keyword2"]
  
  // ๆ‰ง่กŒๆจกๅผ
  execution_mode: 'sequential' | 'autonomous' | 'hybrid';

  // ไธŠไธ‹ๆ–‡็ญ–็•ฅ (P0 ๅขžๅผบ)
  context_strategy: 'file' | 'memory';  // ้ป˜่ฎค: 'file'

  // LLM ้›†ๆˆ้…็ฝฎ (P1 ๅขžๅผบ)
  llm_integration?: {
    enabled: boolean;                    // ๆ˜ฏๅฆๅฏ็”จ LLM ่ฐƒ็”จ
    default_tool: 'gemini' | 'qwen' | 'codex';
    fallback_chain: string[];            // ['gemini', 'qwen', 'codex']
    mode: 'analysis' | 'write';          // ้ป˜่ฎค mode
  };

  // Sequential ๆจกๅผ้…็ฝฎ
  sequential_config?: {
    phases: Array<{
      id: string;               // "01-init"
      name: string;             // "Initialization"
      description: string;      // "ๆ”ถ้›†ๅˆๅง‹้…็ฝฎ"
      input: string[];          // ่พ“ๅ…ฅไพ่ต–
      output: string;           // ่พ“ๅ‡บๆ–‡ไปถ
    }>;
  };
  
  // Autonomous ๆจกๅผ้…็ฝฎ
  autonomous_config?: {
    state_schema: {
      fields: Array<{
        name: string;
        type: string;
        description: string;
      }>;
    };
    actions: Array<{
      id: string;               // "action-init"
      name: string;             // "Initialize"
      description: string;      // "ๅˆๅง‹ๅŒ–็Šถๆ€"
      preconditions: string[];  // ๅ‰็ฝฎๆกไปถ
      effects: string[];        // ๆ‰ง่กŒๆ•ˆๆžœ
    }>;
    termination_conditions: string[];
  };
  
  // ๅทฅๅ…ทไพ่ต–
  allowed_tools: string[];      // ["Task", "Read", "Write", ...]
  mcp_tools?: string[];         // ["mcp__chrome__*"]
  
  // ่พ“ๅ‡บ้…็ฝฎ
  output: {
    format: 'markdown' | 'html' | 'json';
    location: string;           // ".workflow/.scratchpad/{skill}-{timestamp}"
    filename_pattern: string;   // "{name}-output.{ext}"
  };
  
  // ่ดจ้‡้…็ฝฎ
  quality?: {
    dimensions: string[];       // ["completeness", "consistency", ...]
    pass_threshold: number;     // 80
  };
  
  // ๅ…ƒๆ•ฐๆฎ
  created_at: string;
  version: string;
}

้œ€ๆฑ‚ๆ”ถ้›†้—ฎ้ข˜

Phase 1: ๅŸบๆœฌไฟกๆฏ

AskUserQuestion({
  questions: [
    {
      question: "Skill ็š„ๅ็งฐๆ˜ฏไป€ไนˆ๏ผŸ๏ผˆ่‹ฑๆ–‡๏ผŒๅฐๅ†™-่ฟžๅญ—็ฌฆๆ ผๅผ๏ผ‰",
      header: "Skill ๅ็งฐ",
      multiSelect: false,
      options: [
        { label: "่‡ชๅŠจ็”Ÿๆˆ", description: "ๆ นๆฎๆ่ฟฐ่‡ชๅŠจ็”Ÿๆˆๅ็งฐ" },
        { label: "ๆ‰‹ๅŠจ่พ“ๅ…ฅ", description: "่พ“ๅ…ฅ่‡ชๅฎšไน‰ๅ็งฐ" }
      ]
    },
    {
      question: "Skill ็š„ไธป่ฆ็”จ้€”ๆ˜ฏไป€ไนˆ๏ผŸ",
      header: "็”จ้€”็ฑปๅž‹",
      multiSelect: false,
      options: [
        { label: "ๆ–‡ๆกฃ็”Ÿๆˆ", description: "็”Ÿๆˆ Markdown/HTML ๆ–‡ๆกฃ" },
        { label: "ไปฃ็ ๅˆ†ๆž", description: "ๅˆ†ๆžไปฃ็ ็ป“ๆž„ใ€่ดจ้‡ใ€ๅฎ‰ๅ…จ" },
        { label: "ไบคไบ’็ฎก็†", description: "็ฎก็† Issueใ€ไปปๅŠกใ€ๅทฅไฝœๆต" },
        { label: "ๆ•ฐๆฎๅค„็†", description: "ETLใ€่ฝฌๆขใ€ๆŠฅๅ‘Š็”Ÿๆˆ" },
        { label: "่‡ชๅฎšไน‰", description: "ๅ…ถไป–็”จ้€”" }
      ]
    }
  ]
});

Phase 2: ๆ‰ง่กŒๆจกๅผ

AskUserQuestion({
  questions: [
    {
      question: "้€‰ๆ‹ฉๆ‰ง่กŒๆจกๅผ๏ผš",
      header: "ๆ‰ง่กŒๆจกๅผ",
      multiSelect: false,
      options: [
        { 
          label: "Sequential (้กบๅบ)", 
          description: "้˜ถๆฎตๆŒ‰ๅ›บๅฎš้กบๅบๆ‰ง่กŒ๏ผŒ้€‚ๅˆๆตๆฐด็บฟไปปๅŠก๏ผˆๆŽจ่๏ผ‰" 
        },
        { 
          label: "Autonomous (่‡ชไธป)", 
          description: "ๅŠจๆ€้€‰ๆ‹ฉๆ‰ง่กŒ่ทฏๅพ„๏ผŒ้€‚ๅˆไบคไบ’ๅผไปปๅŠก" 
        },
        { 
          label: "Hybrid (ๆททๅˆ)", 
          description: "ๅˆๅง‹ๅŒ–ๅ’Œๆ”ถๅฐพๅ›บๅฎš๏ผŒไธญ้—ดไบคไบ’็ตๆดป" 
        }
      ]
    }
  ]
});

Phase 3: ้˜ถๆฎต/ๅŠจไฝœๅฎšไน‰

Sequential ๆจกๅผ

AskUserQuestion({
  questions: [
    {
      question: "้œ€่ฆๅคšๅฐ‘ไธชๆ‰ง่กŒ้˜ถๆฎต๏ผŸ",
      header: "้˜ถๆฎตๆ•ฐ้‡",
      multiSelect: false,
      options: [
        { label: "3 ้˜ถๆฎต", description: "็ฎ€ๅ•: ๆ”ถ้›† โ†’ ๅค„็† โ†’ ่พ“ๅ‡บ" },
        { label: "5 ้˜ถๆฎต", description: "ๆ ‡ๅ‡†: ๆ”ถ้›† โ†’ ๆŽข็ดข โ†’ ๅˆ†ๆž โ†’ ็ป„่ฃ… โ†’ ้ชŒ่ฏ" },
        { label: "7 ้˜ถๆฎต", description: "ๅฎŒๆ•ด: ๅŒ…ๅซๅนถ่กŒๅค„็†ๅ’Œ่ฟญไปฃไผ˜ๅŒ–" },
        { label: "่‡ชๅฎšไน‰", description: "ๆ‰‹ๅŠจๆŒ‡ๅฎš้˜ถๆฎต" }
      ]
    }
  ]
});

Autonomous ๆจกๅผ

AskUserQuestion({
  questions: [
    {
      question: "ๆ ธๅฟƒๅŠจไฝœๆœ‰ๅ“ชไบ›๏ผŸ",
      header: "ๅŠจไฝœๅฎšไน‰",
      multiSelect: true,
      options: [
        { label: "ๅˆๅง‹ๅŒ– (init)", description: "่ฎพ็ฝฎๅˆๅง‹็Šถๆ€" },
        { label: "ๅˆ—่กจ (list)", description: "ๆ˜พ็คบๅฝ“ๅ‰้กน็›ฎ" },
        { label: "ๅˆ›ๅปบ (create)", description: "ๅˆ›ๅปบๆ–ฐ้กน็›ฎ" },
        { label: "็ผ–่พ‘ (edit)", description: "ไฟฎๆ”น็Žฐๆœ‰้กน็›ฎ" },
        { label: "ๅˆ ้™ค (delete)", description: "ๅˆ ้™ค้กน็›ฎ" },
        { label: "ๅฎŒๆˆ (complete)", description: "ๅฎŒๆˆไปปๅŠก" }
      ]
    }
  ]
});

Phase 4: ไธŠไธ‹ๆ–‡็ญ–็•ฅ (P0 ๅขžๅผบ)

AskUserQuestion({
  questions: [
    {
      question: "้€‰ๆ‹ฉไธŠไธ‹ๆ–‡็ฎก็†็ญ–็•ฅ๏ผš",
      header: "ไธŠไธ‹ๆ–‡็ญ–็•ฅ",
      multiSelect: false,
      options: [
        {
          label: "ๆ–‡ไปถ็ญ–็•ฅ (file)",
          description: "ๆŒไน…ๅŒ–ๅˆฐ .scratchpad๏ผŒๆ”ฏๆŒ่ฐƒ่ฏ•ๅ’Œๆขๅค๏ผˆๆŽจ่๏ผ‰"
        },
        {
          label: "ๅ†…ๅญ˜็ญ–็•ฅ (memory)",
          description: "ไป…ๅœจ่ฟ่กŒๆ—ถไฟๆŒ๏ผŒ้€Ÿๅบฆๅฟซไฝ†ๆ— ๆณ•ๆขๅค"
        }
      ]
    }
  ]
});

Phase 5: LLM ้›†ๆˆ (P1 ๅขžๅผบ)

AskUserQuestion({
  questions: [
    {
      question: "ๆ˜ฏๅฆ้œ€่ฆ LLM ่ฐƒ็”จ่ƒฝๅŠ›๏ผŸ",
      header: "LLM ้›†ๆˆ",
      multiSelect: false,
      options: [
        {
          label: "ๅฏ็”จ LLM ่ฐƒ็”จ",
          description: "ไฝฟ็”จ gemini/qwen/codex ่ฟ›่กŒๅˆ†ๆžๆˆ–็”Ÿๆˆ"
        },
        {
          label: "ไธ้œ€่ฆ",
          description: "ไป…ไฝฟ็”จๆœฌๅœฐๅทฅๅ…ท"
        }
      ]
    }
  ]
});

// ๅฆ‚ๆžœๅฏ็”จ LLM
if (llmEnabled) {
  AskUserQuestion({
    questions: [
      {
        question: "้€‰ๆ‹ฉ้ป˜่ฎค LLM ๅทฅๅ…ท๏ผš",
        header: "LLM ๅทฅๅ…ท",
        multiSelect: false,
        options: [
          { label: "Gemini", description: "ๅคงไธŠไธ‹ๆ–‡๏ผŒ้€‚ๅˆๅˆ†ๆžไปปๅŠก๏ผˆๆŽจ่๏ผ‰" },
          { label: "Qwen", description: "ไปฃ็ ็”Ÿๆˆ่ƒฝๅŠ›ๅผบ" },
          { label: "Codex", description: "่‡ชไธปๆ‰ง่กŒ่ƒฝๅŠ›ๅผบ๏ผŒ้€‚ๅˆๅฎž็ŽฐไปปๅŠก" }
        ]
      }
    ]
  });
}

Phase 6: ๅทฅๅ…ทไพ่ต–

AskUserQuestion({
  questions: [
    {
      question: "้œ€่ฆๅ“ชไบ›ๅทฅๅ…ท๏ผŸ",
      header: "ๅทฅๅ…ท้€‰ๆ‹ฉ",
      multiSelect: true,
      options: [
        { label: "ๅŸบ็ก€ๅทฅๅ…ท", description: "Task, Read, Write, Glob, Grep, Bash" },
        { label: "็”จๆˆทไบคไบ’", description: "AskUserQuestion" },
        { label: "Chrome ๆˆชๅ›พ", description: "mcp__chrome__*" },
        { label: "ๅค–้ƒจๆœ็ดข", description: "mcp__exa__search" },
        { label: "CCW CLI ่ฐƒ็”จ", description: "ccw cli (gemini/qwen/codex)" }
      ]
    }
  ]
});

้ชŒ่ฏ่ง„ๅˆ™

ๅ็งฐ้ชŒ่ฏ

function validateSkillName(name) {
  const rules = [
    { test: /^[a-z][a-z0-9-]*$/, msg: "ๅฟ…้กปไปฅๅฐๅ†™ๅญ—ๆฏๅผ€ๅคด๏ผŒๅชๅŒ…ๅซๅฐๅ†™ๅญ—ๆฏใ€ๆ•ฐๅญ—ใ€่ฟžๅญ—็ฌฆ" },
    { test: /^.{3,30}$/, msg: "้•ฟๅบฆ 3-30 ๅญ—็ฌฆ" },
    { test: /^(?!.*--)/, msg: "ไธ่ƒฝๆœ‰่ฟž็ปญ่ฟžๅญ—็ฌฆ" },
    { test: /[^-]$/, msg: "ไธ่ƒฝไปฅ่ฟžๅญ—็ฌฆ็ป“ๅฐพ" }
  ];
  
  for (const rule of rules) {
    if (!rule.test.test(name)) {
      return { valid: false, error: rule.msg };
    }
  }
  return { valid: true };
}

้…็ฝฎ้ชŒ่ฏ

function validateSkillConfig(config) {
  const errors = [];
  
  // ๅฟ…้œ€ๅญ—ๆฎต
  if (!config.skill_name) errors.push("็ผบๅฐ‘ skill_name");
  if (!config.description) errors.push("็ผบๅฐ‘ description");
  if (!config.execution_mode) errors.push("็ผบๅฐ‘ execution_mode");
  
  // ๆจกๅผ็‰นๅฎš้ชŒ่ฏ
  if (config.execution_mode === 'sequential') {
    if (!config.sequential_config?.phases?.length) {
      errors.push("Sequential ๆจกๅผ้œ€่ฆๅฎšไน‰ phases");
    }
  } else if (config.execution_mode === 'autonomous') {
    if (!config.autonomous_config?.actions?.length) {
      errors.push("Autonomous ๆจกๅผ้œ€่ฆๅฎšไน‰ actions");
    }
  }
  
  return { valid: errors.length === 0, errors };
}

็คบไพ‹้…็ฝฎ

Sequential ๆจกๅผ็คบไพ‹ (ๅขžๅผบ็‰ˆ)

{
  "skill_name": "api-docs-generator",
  "display_name": "API Docs Generator",
  "description": "Generate API documentation from source code",
  "triggers": ["generate api docs", "api documentation"],
  "execution_mode": "sequential",
  "context_strategy": "file",
  "llm_integration": {
    "enabled": true,
    "default_tool": "gemini",
    "fallback_chain": ["gemini", "qwen"],
    "mode": "analysis"
  },
  "sequential_config": {
    "phases": [
      {
        "id": "01-scan",
        "name": "Code Scanning",
        "output": "endpoints.json",
        "agent": { "type": "universal-executor", "run_in_background": false }
      },
      {
        "id": "02-analyze",
        "name": "LLM Analysis",
        "output": "analysis.json",
        "agent": { "type": "llm", "tool": "gemini", "mode": "analysis" }
      },
      {
        "id": "03-generate",
        "name": "Doc Generation",
        "output": "api-docs.md",
        "agent": { "type": "universal-executor", "run_in_background": false }
      }
    ]
  },
  "allowed_tools": ["Task", "Read", "Write", "Glob", "Grep", "Bash"],
  "output": {
    "format": "markdown",
    "location": ".workflow/.scratchpad/api-docs-{timestamp}",
    "filename_pattern": "{name}-api-docs.md"
  }
}

Autonomous ๆจกๅผ็คบไพ‹

{
  "skill_name": "task-manager",
  "display_name": "Task Manager",
  "description": "Interactive task management with CRUD operations",
  "triggers": ["manage tasks", "task list", "create task"],
  "execution_mode": "autonomous",
  "autonomous_config": {
    "state_schema": {
      "fields": [
        { "name": "tasks", "type": "Task[]", "description": "ไปปๅŠกๅˆ—่กจ" },
        { "name": "current_view", "type": "string", "description": "ๅฝ“ๅ‰่ง†ๅ›พ" }
      ]
    },
    "actions": [
      { "id": "action-list", "name": "List Tasks", "preconditions": [], "effects": ["ๆ˜พ็คบไปปๅŠกๅˆ—่กจ"] },
      { "id": "action-create", "name": "Create Task", "preconditions": [], "effects": ["ๆทปๅŠ ๆ–ฐไปปๅŠก"] },
      { "id": "action-edit", "name": "Edit Task", "preconditions": ["task_selected"], "effects": ["ๆ›ดๆ–ฐไปปๅŠก"] },
      { "id": "action-delete", "name": "Delete Task", "preconditions": ["task_selected"], "effects": ["ๅˆ ้™คไปปๅŠก"] }
    ],
    "termination_conditions": ["user_exit", "error_limit"]
  },
  "allowed_tools": ["Task", "AskUserQuestion", "Read", "Write"],
  "output": {
    "format": "json",
    "location": ".workflow/.scratchpad/tasks",
    "filename_pattern": "tasks.json"
  }
}

### templates/skill-md.md

```markdown
# SKILL.md Template

็”จไบŽ็”Ÿๆˆๆ–ฐ Skill ๅ…ฅๅฃๆ–‡ไปถ็š„ๆจกๆฟใ€‚

## โš ๏ธ ้‡่ฆ๏ผšYAML Front Matter ่ง„่Œƒ

> **CRITICAL**: SKILL.md ๆ–‡ไปถๅฟ…้กปไปฅ YAML front matter ๅผ€ๅคด๏ผŒๅณไปฅ `---` ไฝœไธบๆ–‡ไปถ็ฌฌไธ€่กŒใ€‚
>
> **็ฆๆญข**ไฝฟ็”จไปฅไธ‹ๆ ผๅผ๏ผš
> - `# Title` ็„ถๅŽ `## Metadata` + yaml ไปฃ็ ๅ— โŒ
> - ไปปไฝ•ๅœจ `---` ไน‹ๅ‰็š„ๅ†…ๅฎน โŒ
>
> **ๆญฃ็กฎๆ ผๅผ**๏ผšๆ–‡ไปถ็ฌฌไธ€่กŒๅฟ…้กปๆ˜ฏ `---`

## ๅฏ็›ดๆŽฅๅบ”็”จ็š„ๆจกๆฟ

ไปฅไธ‹ๆ˜ฏๅฎŒๆ•ด็š„ SKILL.md ๆจกๆฟใ€‚็”Ÿๆˆๆ—ถ**็›ดๆŽฅๅคๅˆถๅบ”็”จ**๏ผŒๅฐ† `{{ๅ˜้‡}}` ๆ›ฟๆขไธบๅฎž้™…ๅ€ผ๏ผš

---
name: {{skill_name}}
description: {{description}}. Triggers on {{triggers}}.
allowed-tools: {{allowed_tools}}
---

# {{display_name}}

{{description}}

## Architecture Overview

\`\`\`
{{architecture_diagram}}
\`\`\`

## Key Design Principles

{{design_principles}}

## Execution Flow

{{execution_flow}}

## Directory Setup

\`\`\`javascript
const timestamp = new Date().toISOString().slice(0,19).replace(/[-:T]/g, '');
const workDir = \`{{output_location}}\`;

Bash(\`mkdir -p "\${workDir}"\`);
{{additional_dirs}}
\`\`\`

## Output Structure

\`\`\`
{{output_structure}}
\`\`\`

## Reference Documents

{{reference_table}}

---

## ๅ˜้‡่ฏดๆ˜Ž

| ๅ˜้‡ | ็ฑปๅž‹ | ๆฅๆบ |
|------|------|------|
| `{{skill_name}}` | string | config.skill_name |
| `{{display_name}}` | string | config.display_name |
| `{{description}}` | string | config.description |
| `{{triggers}}` | string | config.triggers.join(", ") |
| `{{allowed_tools}}` | string | config.allowed_tools.join(", ") |
| `{{architecture_diagram}}` | string | ๆ นๆฎ execution_mode ็”Ÿๆˆ |
| `{{design_principles}}` | string | ๆ นๆฎ execution_mode ็”Ÿๆˆ |
| `{{execution_flow}}` | string | ๆ นๆฎ phases/actions ็”Ÿๆˆ |
| `{{output_location}}` | string | config.output.location |
| `{{additional_dirs}}` | string | ๆ นๆฎ execution_mode ็”Ÿๆˆ |
| `{{output_structure}}` | string | ๆ นๆฎ้…็ฝฎ็”Ÿๆˆ |
| `{{reference_table}}` | string | ๆ นๆฎๆ–‡ไปถๅˆ—่กจ็”Ÿๆˆ |

## ็”Ÿๆˆๅ‡ฝๆ•ฐ

```javascript
function generateSkillMd(config) {
  const template = Read('templates/skill-md.md');
  
  return template
    .replace(/\{\{skill_name\}\}/g, config.skill_name)
    .replace(/\{\{display_name\}\}/g, config.display_name)
    .replace(/\{\{description\}\}/g, config.description)
    .replace(/\{\{triggers\}\}/g, config.triggers.map(t => `"${t}"`).join(", "))
    .replace(/\{\{allowed_tools\}\}/g, config.allowed_tools.join(", "))
    .replace(/\{\{architecture_diagram\}\}/g, generateArchitecture(config))
    .replace(/\{\{design_principles\}\}/g, generatePrinciples(config))
    .replace(/\{\{execution_flow\}\}/g, generateFlow(config))
    .replace(/\{\{output_location\}\}/g, config.output.location)
    .replace(/\{\{additional_dirs\}\}/g, generateAdditionalDirs(config))
    .replace(/\{\{output_structure\}\}/g, generateOutputStructure(config))
    .replace(/\{\{reference_table\}\}/g, generateReferenceTable(config));
}

Sequential ๆจกๅผ็คบไพ‹

---
name: api-docs-generator
description: Generate API documentation from source code. Triggers on "generate api docs", "api documentation".
allowed-tools: Task, Read, Write, Glob, Grep, Bash
---

# API Docs Generator

Generate API documentation from source code.

## Architecture Overview

\`\`\`
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Phase 1: Scanning        โ†’ endpoints.json                      โ”‚
โ”‚           โ†“                                                      โ”‚
โ”‚  Phase 2: Parsing         โ†’ schemas.json                        โ”‚
โ”‚           โ†“                                                      โ”‚
โ”‚  Phase 3: Generation      โ†’ api-docs.md                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
\`\`\`

Autonomous ๆจกๅผ็คบไพ‹

---
name: task-manager
description: Interactive task management with CRUD operations. Triggers on "manage tasks", "task list".
allowed-tools: Task, AskUserQuestion, Read, Write
---

# Task Manager

Interactive task management with CRUD operations.

## Architecture Overview

\`\`\`
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚           Orchestrator (็Šถๆ€้ฉฑๅŠจๅ†ณ็ญ–)                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ†“           โ†“           โ†“           โ†“
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ List  โ”‚  โ”‚Create โ”‚  โ”‚ Edit  โ”‚  โ”‚Delete โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
\`\`\`

### templates/sequential-phase.md

```markdown
# Sequential Phase Template

้กบๅบๆจกๅผ Phase ๆ–‡ไปถ็š„ๆจกๆฟใ€‚

## ๆจกๆฟ็ป“ๆž„

```markdown
# Phase {{phase_number}}: {{phase_name}}

{{phase_description}}

## Objective

{{objectives}}

## Input

- ไพ่ต–: `{{input_dependency}}`
- ้…็ฝฎ: `{workDir}/skill-config.json`

## Execution Steps

### Step 1: {{step_1_name}}

\`\`\`javascript
{{step_1_code}}
\`\`\`

### Step 2: {{step_2_name}}

\`\`\`javascript
{{step_2_code}}
\`\`\`

### Step 3: {{step_3_name}}

\`\`\`javascript
{{step_3_code}}
\`\`\`

## Output

- **File**: `{{output_file}}`
- **Format**: {{output_format}}

## Quality Checklist

{{quality_checklist}}

## Next Phase

{{next_phase_link}}

ๅ˜้‡่ฏดๆ˜Ž

ๅ˜้‡่ฏดๆ˜Ž
{{phase_number}}้˜ถๆฎตๅบๅท (1, 2, 3...)
{{phase_name}}้˜ถๆฎตๅ็งฐ
{{phase_description}}ไธ€ๅฅ่ฏๆ่ฟฐ
{{objectives}}็›ฎๆ ‡ๅˆ—่กจ
{{input_dependency}}่พ“ๅ…ฅไพ่ต–ๆ–‡ไปถ
{{step_N_name}}ๆญฅ้ชคๅ็งฐ
{{step_N_code}}ๆญฅ้ชคไปฃ็ 
{{output_file}}่พ“ๅ‡บๆ–‡ไปถๅ
{{output_format}}่พ“ๅ‡บๆ ผๅผ
{{quality_checklist}}่ดจ้‡ๆฃ€ๆŸฅ้กน
{{next_phase_link}}ไธ‹ไธ€้˜ถๆฎต้“พๆŽฅ

Phase ็ฑปๅž‹ๆจกๆฟ

1. ๆ”ถ้›†ๅž‹ Phase (Collection)

# Phase 1: Requirements Collection

ๆ”ถ้›†็”จๆˆท้œ€ๆฑ‚ๅ’Œ้กน็›ฎ้…็ฝฎใ€‚

## Objective

- ๆ”ถ้›†็”จๆˆท่พ“ๅ…ฅ
- ่‡ชๅŠจๆฃ€ๆต‹้กน็›ฎไฟกๆฏ
- ็”Ÿๆˆ้…็ฝฎๆ–‡ไปถ

## Execution Steps

### Step 1: ็”จๆˆทไบคไบ’

\`\`\`javascript
const userInput = await AskUserQuestion({
  questions: [
    {
      question: "่ฏท้€‰ๆ‹ฉ...",
      header: "้€‰้กน",
      multiSelect: false,
      options: [
        { label: "้€‰้กนA", description: "..." },
        { label: "้€‰้กนB", description: "..." }
      ]
    }
  ]
});
\`\`\`

### Step 2: ่‡ชๅŠจๆฃ€ๆต‹

\`\`\`javascript
// ๆฃ€ๆต‹้กน็›ฎไฟกๆฏ
const packageJson = JSON.parse(Read('package.json'));
const projectName = packageJson.name;
\`\`\`

### Step 3: ็”Ÿๆˆ้…็ฝฎ

\`\`\`javascript
const config = {
  name: projectName,
  userChoice: userInput["้€‰้กน"],
  // ...
};

Write(`${workDir}/config.json`, JSON.stringify(config, null, 2));
\`\`\`

## Output

- **File**: `config.json`
- **Format**: JSON

2. ๅˆ†ๆžๅž‹ Phase (Analysis)

# Phase 2: Deep Analysis

ๆทฑๅบฆๅˆ†ๆžไปฃ็ ็ป“ๆž„ใ€‚

## Objective

- ๆ‰ซๆไปฃ็ ๆ–‡ไปถ
- ๆๅ–ๅ…ณ้”ฎไฟกๆฏ
- ็”Ÿๆˆๅˆ†ๆžๆŠฅๅ‘Š

## Execution Steps

### Step 1: ๆ–‡ไปถๆ‰ซๆ

\`\`\`javascript
const files = Glob('src/**/*.ts');
\`\`\`

### Step 2: ๅ†…ๅฎนๅˆ†ๆž

\`\`\`javascript
const analysisResults = [];
for (const file of files) {
  const content = Read(file);
  // ๅˆ†ๆž้€ป่พ‘
  analysisResults.push({ file, /* ๅˆ†ๆž็ป“ๆžœ */ });
}
\`\`\`

### Step 3: ็”ŸๆˆๆŠฅๅ‘Š

\`\`\`javascript
Write(`${workDir}/analysis.json`, JSON.stringify(analysisResults, null, 2));
\`\`\`

## Output

- **File**: `analysis.json`
- **Format**: JSON

3. ๅนถ่กŒๅž‹ Phase (Parallel)

# Phase 3: Parallel Processing

ๅนถ่กŒๅค„็†ๅคšไธชๅญไปปๅŠกใ€‚

## Objective

- ๅฏๅŠจๅคšไธช Agent ๅนถ่กŒๆ‰ง่กŒ
- ๆ”ถ้›†ๅ„ Agent ็ป“ๆžœ
- ๅˆๅนถ่พ“ๅ‡บ

## Execution Steps

### Step 1: ๅ‡†ๅค‡ไปปๅŠก

\`\`\`javascript
const tasks = [
  { id: 'task-a', prompt: '...' },
  { id: 'task-b', prompt: '...' },
  { id: 'task-c', prompt: '...' }
];
\`\`\`

### Step 2: ๅนถ่กŒๆ‰ง่กŒ

\`\`\`javascript
const results = await Promise.all(
  tasks.map(task => 
    Task({
      subagent_type: 'universal-executor',
      run_in_background: false,
      prompt: task.prompt
    })
  )
);
\`\`\`

### Step 3: ๅˆๅนถ็ป“ๆžœ

\`\`\`javascript
const merged = results.map((r, i) => ({
  task_id: tasks[i].id,
  result: JSON.parse(r)
}));

Write(`${workDir}/parallel-results.json`, JSON.stringify(merged, null, 2));
\`\`\`

## Output

- **File**: `parallel-results.json`
- **Format**: JSON

4. ็ป„่ฃ…ๅž‹ Phase (Assembly)

# Phase 4: Document Assembly

็ป„่ฃ…ๆœ€็ปˆ่พ“ๅ‡บๆ–‡ๆกฃใ€‚

## Objective

- ่ฏปๅ–ๅ„้˜ถๆฎตไบงๅ‡บ
- ๅˆๅนถๅ†…ๅฎน
- ็”Ÿๆˆๆœ€็ปˆๆ–‡ๆกฃ

## Execution Steps

### Step 1: ่ฏปๅ–ไบงๅ‡บ

\`\`\`javascript
const config = JSON.parse(Read(`${workDir}/config.json`));
const analysis = JSON.parse(Read(`${workDir}/analysis.json`));
const sections = Glob(`${workDir}/sections/*.md`).map(f => Read(f));
\`\`\`

### Step 2: ็ป„่ฃ…ๅ†…ๅฎน

\`\`\`javascript
const document = \`
# \${config.name}

## ๆฆ‚่ฟฐ
\${config.description}

## ่ฏฆ็ป†ๅ†…ๅฎน
\${sections.join('\\n\\n')}
\`;
\`\`\`

### Step 3: ๅ†™ๅ…ฅๆ–‡ไปถ

\`\`\`javascript
Write(`${workDir}/${config.name}-output.md`, document);
\`\`\`

## Output

- **File**: `{name}-output.md`
- **Format**: Markdown

5. ้ชŒ่ฏๅž‹ Phase (Validation)

# Phase 5: Validation

้ชŒ่ฏ่พ“ๅ‡บ่ดจ้‡ใ€‚

## Objective

- ๆฃ€ๆŸฅ่พ“ๅ‡บๅฎŒๆ•ดๆ€ง
- ้ชŒ่ฏๅ†…ๅฎน่ดจ้‡
- ็”Ÿๆˆ้ชŒ่ฏๆŠฅๅ‘Š

## Execution Steps

### Step 1: ๅฎŒๆ•ดๆ€งๆฃ€ๆŸฅ

\`\`\`javascript
const outputFile = `${workDir}/${config.name}-output.md`;
const content = Read(outputFile);
const completeness = {
  hasTitle: content.includes('# '),
  hasSections: content.match(/## /g)?.length >= 3,
  hasContent: content.length > 500
};
\`\`\`

### Step 2: ่ดจ้‡่ฏ„ไผฐ

\`\`\`javascript
const quality = {
  completeness: Object.values(completeness).filter(v => v).length / 3 * 100,
  // ๅ…ถไป–็ปดๅบฆ...
};
\`\`\`

### Step 3: ็”ŸๆˆๆŠฅๅ‘Š

\`\`\`javascript
const report = {
  status: quality.completeness >= 80 ? 'PASS' : 'REVIEW',
  scores: quality,
  issues: []
};

Write(`${workDir}/validation-report.json`, JSON.stringify(report, null, 2));
\`\`\`

## Output

- **File**: `validation-report.json`
- **Format**: JSON

็”Ÿๆˆๅ‡ฝๆ•ฐ

function generateSequentialPhase(phaseConfig, index, phases, skillConfig) {
  const prevPhase = index > 0 ? phases[index - 1] : null;
  const nextPhase = index < phases.length - 1 ? phases[index + 1] : null;
  
  return `# Phase ${index + 1}: ${phaseConfig.name}

${phaseConfig.description || `ๆ‰ง่กŒ ${phaseConfig.name}`}

## Objective

- ${phaseConfig.objectives?.join('\n- ') || 'TODO: ๅฎšไน‰็›ฎๆ ‡'}

## Input

- ไพ่ต–: \`${prevPhase ? prevPhase.output : 'user input'}\`
- ้…็ฝฎ: \`{workDir}/skill-config.json\`

## Execution Steps

### Step 1: ๅ‡†ๅค‡

\`\`\`javascript
${prevPhase ? 
  `const prevOutput = JSON.parse(Read(\`\${workDir}/${prevPhase.output}\`));` :
  '// ้ฆ–้˜ถๆฎต๏ผŒไปŽ้…็ฝฎๅผ€ๅง‹'}
\`\`\`

### Step 2: ๅค„็†

\`\`\`javascript
// TODO: ๅฎž็Žฐๆ ธๅฟƒ้€ป่พ‘
\`\`\`

### Step 3: ่พ“ๅ‡บ

\`\`\`javascript
Write(\`\${workDir}/${phaseConfig.output}\`, JSON.stringify(result, null, 2));
\`\`\`

## Output

- **File**: \`${phaseConfig.output}\`
- **Format**: ${phaseConfig.output.endsWith('.json') ? 'JSON' : 'Markdown'}

## Quality Checklist

- [ ] ่พ“ๅ…ฅ้ชŒ่ฏ้€š่ฟ‡
- [ ] ๆ ธๅฟƒ้€ป่พ‘ๆ‰ง่กŒๆˆๅŠŸ
- [ ] ่พ“ๅ‡บๆ ผๅผๆญฃ็กฎ

${nextPhase ? 
  `## Next Phase\n\nโ†’ [Phase ${index + 2}: ${nextPhase.name}](${nextPhase.id}.md)` :
  '## Completion\n\nๆญคไธบๆœ€ๅŽ้˜ถๆฎตใ€‚'}
`;
}

### templates/autonomous-orchestrator.md

```markdown
# Autonomous Orchestrator Template

่‡ชไธปๆจกๅผ็ผ–ๆŽ’ๅ™จ็š„ๆจกๆฟใ€‚

## ๆจกๆฟ็ป“ๆž„

```markdown
# Orchestrator

## Role

ๆ นๆฎๅฝ“ๅ‰็Šถๆ€้€‰ๆ‹ฉๅนถๆ‰ง่กŒไธ‹ไธ€ไธชๅŠจไฝœใ€‚

## State Management

### ่ฏปๅ–็Šถๆ€

\`\`\`javascript
const state = JSON.parse(Read(`${workDir}/state.json`));
\`\`\`

### ๆ›ดๆ–ฐ็Šถๆ€

\`\`\`javascript
function updateState(updates) {
  const state = JSON.parse(Read(`${workDir}/state.json`));
  const newState = {
    ...state,
    ...updates,
    updated_at: new Date().toISOString()
  };
  Write(`${workDir}/state.json`, JSON.stringify(newState, null, 2));
  return newState;
}
\`\`\`

## Decision Logic

\`\`\`javascript
function selectNextAction(state) {
  // 1. ็ปˆๆญขๆกไปถๆฃ€ๆŸฅ
  {{termination_checks}}
  
  // 2. ้”™่ฏฏ้™ๅˆถๆฃ€ๆŸฅ
  if (state.error_count >= 3) {
    return 'action-abort';
  }
  
  // 3. ๅŠจไฝœ้€‰ๆ‹ฉ้€ป่พ‘
  {{action_selection_logic}}
  
  // 4. ้ป˜่ฎคๅฎŒๆˆ
  return 'action-complete';
}
\`\`\`

## Execution Loop

\`\`\`javascript
async function runOrchestrator() {
  console.log('=== Orchestrator Started ===');
  
  let iteration = 0;
  const MAX_ITERATIONS = 100;
  
  while (iteration < MAX_ITERATIONS) {
    iteration++;
    
    // 1. ่ฏปๅ–ๅฝ“ๅ‰็Šถๆ€
    const state = JSON.parse(Read(`${workDir}/state.json`));
    console.log(`[Iteration ${iteration}] Status: ${state.status}`);
    
    // 2. ้€‰ๆ‹ฉไธ‹ไธ€ไธชๅŠจไฝœ
    const actionId = selectNextAction(state);
    
    if (!actionId) {
      console.log('No action selected, terminating.');
      break;
    }
    
    console.log(`[Iteration ${iteration}] Executing: ${actionId}`);
    
    // 3. ๆ›ดๆ–ฐ็Šถๆ€๏ผšๅฝ“ๅ‰ๅŠจไฝœ
    updateState({ current_action: actionId });
    
    // 4. ๆ‰ง่กŒๅŠจไฝœ
    try {
      const actionPrompt = Read(`phases/actions/${actionId}.md`);
      
      const result = await Task({
        subagent_type: 'universal-executor',
        run_in_background: false,
        prompt: \`
[STATE]
\${JSON.stringify(state, null, 2)}

[ACTION]
\${actionPrompt}

[RETURN]
Return JSON with stateUpdates field.
\`
      });
      
      const actionResult = JSON.parse(result);
      
      // 5. ๆ›ดๆ–ฐ็Šถๆ€๏ผšๅŠจไฝœๅฎŒๆˆ
      updateState({
        current_action: null,
        completed_actions: [...state.completed_actions, actionId],
        ...actionResult.stateUpdates
      });
      
    } catch (error) {
      // ้”™่ฏฏๅค„็†
      updateState({
        current_action: null,
        errors: [...state.errors, {
          action: actionId,
          message: error.message,
          timestamp: new Date().toISOString()
        }],
        error_count: state.error_count + 1
      });
    }
  }
  
  console.log('=== Orchestrator Finished ===');
}
\`\`\`

## Action Catalog

| Action | Purpose | Preconditions |
|--------|---------|---------------|
{{action_catalog_table}}

## Termination Conditions

{{termination_conditions_list}}

## Error Recovery

| Error Type | Recovery Strategy |
|------------|-------------------|
| ๅŠจไฝœๆ‰ง่กŒๅคฑ่ดฅ | ้‡่ฏ•ๆœ€ๅคš 3 ๆฌก |
| ็Šถๆ€ไธไธ€่‡ด | ๅ›žๆปšๅˆฐไธŠไธ€ไธช็จณๅฎš็Šถๆ€ |
| ็”จๆˆทไธญๆญข | ไฟๅญ˜ๅฝ“ๅ‰็Šถๆ€๏ผŒๅ…่ฎธๆขๅค |

ๅ˜้‡่ฏดๆ˜Ž

ๅ˜้‡่ฏดๆ˜Ž
{{termination_checks}}็ปˆๆญขๆกไปถๆฃ€ๆŸฅไปฃ็ 
{{action_selection_logic}}ๅŠจไฝœ้€‰ๆ‹ฉ้€ป่พ‘ไปฃ็ 
{{action_catalog_table}}ๅŠจไฝœ็›ฎๅฝ•่กจๆ ผ
{{termination_conditions_list}}็ปˆๆญขๆกไปถๅˆ—่กจ

็”Ÿๆˆๅ‡ฝๆ•ฐ

function generateOrchestrator(config) {
  const actions = config.autonomous_config.actions;
  const terminations = config.autonomous_config.termination_conditions || [];
  
  // ็”Ÿๆˆ็ปˆๆญขๆกไปถๆฃ€ๆŸฅ
  const terminationChecks = terminations.map(t => {
    const checks = {
      'user_exit': 'if (state.status === "user_exit") return null;',
      'error_limit': 'if (state.error_count >= 3) return "action-abort";',
      'task_completed': 'if (state.status === "completed") return null;',
      'max_iterations': 'if (state.iteration_count >= 100) return "action-abort";'
    };
    return checks[t] || `if (state.${t}) return null;`;
  }).join('\n  ');
  
  // ็”ŸๆˆๅŠจไฝœ้€‰ๆ‹ฉ้€ป่พ‘
  const actionSelectionLogic = actions.map(action => {
    if (!action.preconditions?.length) {
      return `// ${action.name}: ๆ— ๅ‰็ฝฎๆกไปถ๏ผŒ้œ€่ฆๆ‰‹ๅŠจๆทปๅŠ ้€‰ๆ‹ฉ้€ป่พ‘`;
    }
    const conditions = action.preconditions.map(p => `state.${p}`).join(' && ');
    return `if (${conditions}) return '${action.id}';`;
  }).join('\n  ');
  
  // ็”ŸๆˆๅŠจไฝœ็›ฎๅฝ•่กจๆ ผ
  const actionCatalogTable = actions.map(a => 
    `| [${a.id}](actions/${a.id}.md) | ${a.description || a.name} | ${a.preconditions?.join(', ') || '-'} |`
  ).join('\n');
  
  // ็”Ÿๆˆ็ปˆๆญขๆกไปถๅˆ—่กจ
  const terminationConditionsList = terminations.map(t => `- ${t}`).join('\n');
  
  return template
    .replace('{{termination_checks}}', terminationChecks)
    .replace('{{action_selection_logic}}', actionSelectionLogic)
    .replace('{{action_catalog_table}}', actionCatalogTable)
    .replace('{{termination_conditions_list}}', terminationConditionsList);
}

็ผ–ๆŽ’็ญ–็•ฅ

1. ไผ˜ๅ…ˆ็บง็ญ–็•ฅ

ๆŒ‰้ข„ๅฎšไน‰ไผ˜ๅ…ˆ็บง้€‰ๆ‹ฉๅŠจไฝœ๏ผš

const PRIORITY = ['action-init', 'action-process', 'action-review', 'action-complete'];

function selectByPriority(state, availableActions) {
  for (const actionId of PRIORITY) {
    if (availableActions.includes(actionId) && checkPreconditions(actionId, state)) {
      return actionId;
    }
  }
  return null;
}

2. ็”จๆˆท้ฉฑๅŠจ็ญ–็•ฅ

่ฏข้—ฎ็”จๆˆท้€‰ๆ‹ฉไธ‹ไธ€ไธชๅŠจไฝœ๏ผš

async function selectByUser(state, availableActions) {
  const response = await AskUserQuestion({
    questions: [{
      question: "้€‰ๆ‹ฉไธ‹ไธ€ไธชๆ“ไฝœ๏ผš",
      header: "ๆ“ไฝœ",
      multiSelect: false,
      options: availableActions.map(a => ({
        label: a.name,
        description: a.description
      }))
    }]
  });
  
  return availableActions.find(a => a.name === response["ๆ“ไฝœ"])?.id;
}

3. ็Šถๆ€้ฉฑๅŠจ็ญ–็•ฅ

ๅฎŒๅ…จๅŸบไบŽ็Šถๆ€่‡ชๅŠจๅ†ณ็ญ–๏ผš

function selectByState(state) {
  // ๅˆๅง‹ๅŒ–
  if (state.status === 'pending') return 'action-init';
  
  // ๆœ‰ๅพ…ๅค„็†้กน
  if (state.pending_items?.length > 0) return 'action-process';
  
  // ้œ€่ฆๅฎกๆ ธ
  if (state.needs_review) return 'action-review';
  
  // ๅฎŒๆˆ
  return 'action-complete';
}

็Šถๆ€ๆœบ็คบไพ‹

stateDiagram-v2
    [*] --> pending
    pending --> running: action-init
    running --> running: action-process
    running --> running: action-review
    running --> completed: action-complete
    running --> failed: action-abort
    completed --> [*]
    failed --> [*]

### templates/autonomous-action.md

```markdown
# Autonomous Action Template

่‡ชไธปๆจกๅผๅŠจไฝœๆ–‡ไปถ็š„ๆจกๆฟใ€‚

## ๆจกๆฟ็ป“ๆž„

```markdown
# Action: {{action_name}}

{{action_description}}

## Purpose

{{purpose}}

## Preconditions

{{preconditions_list}}

## Execution

\`\`\`javascript
async function execute(state) {
  {{execution_code}}
}
\`\`\`

## State Updates

\`\`\`javascript
return {
  stateUpdates: {
    {{state_updates}}
  }
};
\`\`\`

## Error Handling

| Error Type | Recovery |
|------------|----------|
{{error_handling_table}}

## Next Actions (Hints)

{{next_actions_hints}}

ๅ˜้‡่ฏดๆ˜Ž

ๅ˜้‡่ฏดๆ˜Ž
{{action_name}}ๅŠจไฝœๅ็งฐ
{{action_description}}ๅŠจไฝœๆ่ฟฐ
{{purpose}}่ฏฆ็ป†็›ฎ็š„
{{preconditions_list}}ๅ‰็ฝฎๆกไปถๅˆ—่กจ
{{execution_code}}ๆ‰ง่กŒไปฃ็ 
{{state_updates}}็Šถๆ€ๆ›ดๆ–ฐ
{{error_handling_table}}้”™่ฏฏๅค„็†่กจๆ ผ
{{next_actions_hints}}ๅŽ็ปญๅŠจไฝœๆ็คบ

ๅŠจไฝœ็ฑปๅž‹ๆจกๆฟ

1. ๅˆๅง‹ๅŒ–ๅŠจไฝœ (Init)

# Action: Initialize

ๅˆๅง‹ๅŒ– Skill ๆ‰ง่กŒ็Šถๆ€ใ€‚

## Purpose

่ฎพ็ฝฎๅˆๅง‹็Šถๆ€๏ผŒๅ‡†ๅค‡ๆ‰ง่กŒ็Žฏๅขƒใ€‚

## Preconditions

- [ ] state.status === 'pending'

## Execution

\`\`\`javascript
async function execute(state) {
  // 1. ๅˆ›ๅปบๅทฅไฝœ็›ฎๅฝ•
  Bash(\`mkdir -p "\${workDir}"\`);
  
  // 2. ๅˆๅง‹ๅŒ–ๆ•ฐๆฎ
  const initialData = {
    items: [],
    metadata: {}
  };
  
  // 3. ่ฟ”ๅ›ž็Šถๆ€ๆ›ดๆ–ฐ
  return {
    stateUpdates: {
      status: 'running',
      context: initialData
    }
  };
}
\`\`\`

## State Updates

\`\`\`javascript
return {
  stateUpdates: {
    status: 'running',
    started_at: new Date().toISOString(),
    context: { /* ๅˆๅง‹ๆ•ฐๆฎ */ }
  }
};
\`\`\`

## Next Actions

- ๆˆๅŠŸ: ่ฟ›ๅ…ฅไธปๅค„็†ๅพช็Žฏ
- ๅคฑ่ดฅ: action-abort

2. ๅˆ—่กจๅŠจไฝœ (List)

# Action: List Items

ๆ˜พ็คบๅฝ“ๅ‰้กน็›ฎๅˆ—่กจใ€‚

## Purpose

ๅฑ•็คบๆ‰€ๆœ‰้กน็›ฎไพ›็”จๆˆทๆŸฅ็œ‹ๅ’Œ้€‰ๆ‹ฉใ€‚

## Preconditions

- [ ] state.status === 'running'

## Execution

\`\`\`javascript
async function execute(state) {
  const items = state.context.items || [];
  
  if (items.length === 0) {
    console.log('ๆš‚ๆ— ้กน็›ฎ');
  } else {
    console.log('้กน็›ฎๅˆ—่กจ:');
    items.forEach((item, i) => {
      console.log(\`\${i + 1}. \${item.name} - \${item.status}\`);
    });
  }
  
  return {
    stateUpdates: {
      last_action: 'list',
      current_view: 'list'
    }
  };
}
\`\`\`

## State Updates

\`\`\`javascript
return {
  stateUpdates: {
    current_view: 'list',
    last_viewed_at: new Date().toISOString()
  }
};
\`\`\`

## Next Actions

- ็”จๆˆท้€‰ๆ‹ฉๅˆ›ๅปบ: action-create
- ็”จๆˆท้€‰ๆ‹ฉ็ผ–่พ‘: action-edit
- ็”จๆˆท้€€ๅ‡บ: action-complete

3. ๅˆ›ๅปบๅŠจไฝœ (Create)

# Action: Create Item

ๅˆ›ๅปบๆ–ฐ้กน็›ฎใ€‚

## Purpose

ๅผ•ๅฏผ็”จๆˆทๅˆ›ๅปบๆ–ฐ้กน็›ฎใ€‚

## Preconditions

- [ ] state.status === 'running'

## Execution

\`\`\`javascript
async function execute(state) {
  // 1. ๆ”ถ้›†ไฟกๆฏ
  const input = await AskUserQuestion({
    questions: [{
      question: "่ฏท่พ“ๅ…ฅ้กน็›ฎๅ็งฐ๏ผš",
      header: "ๅ็งฐ",
      multiSelect: false,
      options: [
        { label: "ๆ‰‹ๅŠจ่พ“ๅ…ฅ", description: "่พ“ๅ…ฅ่‡ชๅฎšไน‰ๅ็งฐ" }
      ]
    }]
  });
  
  // 2. ๅˆ›ๅปบ้กน็›ฎ
  const newItem = {
    id: Date.now().toString(),
    name: input["ๅ็งฐ"],
    status: 'pending',
    created_at: new Date().toISOString()
  };
  
  // 3. ่ฟ”ๅ›ž็Šถๆ€ๆ›ดๆ–ฐ
  return {
    stateUpdates: {
      context: {
        ...state.context,
        items: [...(state.context.items || []), newItem]
      },
      last_created_id: newItem.id
    }
  };
}
\`\`\`

## State Updates

\`\`\`javascript
return {
  stateUpdates: {
    'context.items': [...items, newItem],
    last_action: 'create',
    last_created_id: newItem.id
  }
};
\`\`\`

## Next Actions

- ็ปง็ปญๅˆ›ๅปบ: action-create
- ่ฟ”ๅ›žๅˆ—่กจ: action-list

4. ็ผ–่พ‘ๅŠจไฝœ (Edit)

# Action: Edit Item

็ผ–่พ‘็Žฐๆœ‰้กน็›ฎใ€‚

## Purpose

ไฟฎๆ”นๅทฒๅญ˜ๅœจ็š„้กน็›ฎใ€‚

## Preconditions

- [ ] state.status === 'running'
- [ ] state.selected_item_id !== null

## Execution

\`\`\`javascript
async function execute(state) {
  const itemId = state.selected_item_id;
  const items = state.context.items || [];
  const item = items.find(i => i.id === itemId);
  
  if (!item) {
    throw new Error(\`Item not found: \${itemId}\`);
  }
  
  // 1. ๆ˜พ็คบๅฝ“ๅ‰ๅ€ผ
  console.log(\`ๅฝ“ๅ‰ๅ็งฐ: \${item.name}\`);
  
  // 2. ๆ”ถ้›†ๆ–ฐๅ€ผ
  const input = await AskUserQuestion({
    questions: [{
      question: "่ฏท่พ“ๅ…ฅๆ–ฐๅ็งฐ๏ผˆ็•™็ฉบไฟๆŒไธๅ˜๏ผ‰๏ผš",
      header: "ๆ–ฐๅ็งฐ",
      multiSelect: false,
      options: [
        { label: "ไฟๆŒไธๅ˜", description: \`ๅฝ“ๅ‰: \${item.name}\` },
        { label: "ๆ‰‹ๅŠจ่พ“ๅ…ฅ", description: "่พ“ๅ…ฅๆ–ฐๅ็งฐ" }
      ]
    }]
  });
  
  // 3. ๆ›ดๆ–ฐ้กน็›ฎ
  const updatedItems = items.map(i => 
    i.id === itemId 
      ? { ...i, name: input["ๆ–ฐๅ็งฐ"] || i.name, updated_at: new Date().toISOString() }
      : i
  );
  
  return {
    stateUpdates: {
      context: { ...state.context, items: updatedItems },
      selected_item_id: null
    }
  };
}
\`\`\`

## State Updates

\`\`\`javascript
return {
  stateUpdates: {
    'context.items': updatedItems,
    selected_item_id: null,
    last_action: 'edit'
  }
};
\`\`\`

## Next Actions

- ่ฟ”ๅ›žๅˆ—่กจ: action-list

5. ๅˆ ้™คๅŠจไฝœ (Delete)

# Action: Delete Item

ๅˆ ้™ค้กน็›ฎใ€‚

## Purpose

ไปŽๅˆ—่กจไธญ็งป้™ค้กน็›ฎใ€‚

## Preconditions

- [ ] state.status === 'running'
- [ ] state.selected_item_id !== null

## Execution

\`\`\`javascript
async function execute(state) {
  const itemId = state.selected_item_id;
  const items = state.context.items || [];
  
  // 1. ็กฎ่ฎคๅˆ ้™ค
  const confirm = await AskUserQuestion({
    questions: [{
      question: "็กฎ่ฎคๅˆ ้™คๆญค้กน็›ฎ๏ผŸ",
      header: "็กฎ่ฎค",
      multiSelect: false,
      options: [
        { label: "็กฎ่ฎคๅˆ ้™ค", description: "ไธๅฏๆขๅค" },
        { label: "ๅ–ๆถˆ", description: "่ฟ”ๅ›žๅˆ—่กจ" }
      ]
    }]
  });
  
  if (confirm["็กฎ่ฎค"] === "ๅ–ๆถˆ") {
    return { stateUpdates: { selected_item_id: null } };
  }
  
  // 2. ๆ‰ง่กŒๅˆ ้™ค
  const updatedItems = items.filter(i => i.id !== itemId);
  
  return {
    stateUpdates: {
      context: { ...state.context, items: updatedItems },
      selected_item_id: null
    }
  };
}
\`\`\`

## State Updates

\`\`\`javascript
return {
  stateUpdates: {
    'context.items': filteredItems,
    selected_item_id: null,
    last_action: 'delete'
  }
};
\`\`\`

## Next Actions

- ่ฟ”ๅ›žๅˆ—่กจ: action-list

6. ๅฎŒๆˆๅŠจไฝœ (Complete)

# Action: Complete

ๅฎŒๆˆไปปๅŠกๅนถ้€€ๅ‡บใ€‚

## Purpose

ไฟๅญ˜ๆœ€็ปˆ็Šถๆ€๏ผŒ็ป“ๆŸ Skill ๆ‰ง่กŒใ€‚

## Preconditions

- [ ] state.status === 'running'

## Execution

\`\`\`javascript
async function execute(state) {
  // 1. ไฟๅญ˜ๆœ€็ปˆๆ•ฐๆฎ
  Write(\`\${workDir}/final-output.json\`, JSON.stringify(state.context, null, 2));
  
  // 2. ็”Ÿๆˆๆ‘˜่ฆ
  const summary = {
    total_items: state.context.items?.length || 0,
    duration: Date.now() - new Date(state.started_at).getTime(),
    actions_executed: state.completed_actions.length
  };
  
  console.log('ไปปๅŠกๅฎŒๆˆ๏ผ');
  console.log(\`ๅค„็†้กน็›ฎ: \${summary.total_items}\`);
  console.log(\`ๆ‰ง่กŒๅŠจไฝœ: \${summary.actions_executed}\`);
  
  return {
    stateUpdates: {
      status: 'completed',
      summary: summary
    }
  };
}
\`\`\`

## State Updates

\`\`\`javascript
return {
  stateUpdates: {
    status: 'completed',
    completed_at: new Date().toISOString(),
    summary: { /* ็ปŸ่ฎกไฟกๆฏ */ }
  }
};
\`\`\`

## Next Actions

- ๆ— ๏ผˆ็ปˆๆญข็Šถๆ€๏ผ‰

็”Ÿๆˆๅ‡ฝๆ•ฐ

function generateAction(actionConfig, skillConfig) {
  return `# Action: ${actionConfig.name}

${actionConfig.description || `ๆ‰ง่กŒ ${actionConfig.name} ๆ“ไฝœ`}

## Purpose

${actionConfig.purpose || 'TODO: ๆ่ฟฐๆญคๅŠจไฝœ็š„่ฏฆ็ป†็›ฎ็š„'}

## Preconditions

${actionConfig.preconditions?.map(p => `- [ ] ${p}`).join('\n') || '- [ ] ๆ— ็‰นๆฎŠๅ‰็ฝฎๆกไปถ'}

## Execution

\`\`\`javascript
async function execute(state) {
  // TODO: ๅฎž็ŽฐๅŠจไฝœ้€ป่พ‘
  
  return {
    stateUpdates: {
      completed_actions: [...state.completed_actions, '${actionConfig.id}']
    }
  };
}
\`\`\`

## State Updates

\`\`\`javascript
return {
  stateUpdates: {
    // TODO: ๅฎšไน‰็Šถๆ€ๆ›ดๆ–ฐ
${actionConfig.effects?.map(e => `    // Effect: ${e}`).join('\n') || ''}
  }
};
\`\`\`

## Error Handling

| Error Type | Recovery |
|------------|----------|
| ๆ•ฐๆฎ้ชŒ่ฏๅคฑ่ดฅ | ่ฟ”ๅ›ž้”™่ฏฏ๏ผŒไธๆ›ดๆ–ฐ็Šถๆ€ |
| ๆ‰ง่กŒๅผ‚ๅธธ | ่ฎฐๅฝ•้”™่ฏฏ๏ผŒๅขžๅŠ  error_count |

## Next Actions (Hints)

- ๆˆๅŠŸ: ็”ฑ็ผ–ๆŽ’ๅ™จๆ นๆฎ็Šถๆ€ๅ†ณๅฎš
- ๅคฑ่ดฅ: ้‡่ฏ•ๆˆ– action-abort
`;
}

### ../_shared/SKILL-DESIGN-SPEC.md

```markdown
# Skill ่ฎพ่ฎก่ง„่Œƒ v1.0

> ๅŸบไบŽ `software-manual` ๅ’Œ `copyright-docs` ไธคไธชๆˆ็†Ÿ Skill ็š„่ฎพ่ฎกๆจกๅผๆ็‚ผ

---

## ็›ฎๅฝ•

1. [่ฎพ่ฎก็†ๅฟต](#1-่ฎพ่ฎก็†ๅฟต)
2. [็›ฎๅฝ•็ป“ๆž„่ง„่Œƒ](#2-็›ฎๅฝ•็ป“ๆž„่ง„่Œƒ)
3. [ๆ ธๅฟƒ็ป„ไปถๅฎšไน‰](#3-ๆ ธๅฟƒ็ป„ไปถๅฎšไน‰)
4. [SKILL.md ๅ…ฅๅฃ่ง„่Œƒ](#4-skillmd-ๅ…ฅๅฃ่ง„่Œƒ)
5. [Phase ้˜ถๆฎต่ฎพ่ฎก่ง„่Œƒ](#5-phase-้˜ถๆฎต่ฎพ่ฎก่ง„่Œƒ)
6. [Specs ่ง„่Œƒๆ–‡ไปถ่ฎพ่ฎก](#6-specs-่ง„่Œƒๆ–‡ไปถ่ฎพ่ฎก)
7. [Templates ๆจกๆฟ่ฎพ่ฎก](#7-templates-ๆจกๆฟ่ฎพ่ฎก)
8. [Scripts ่„šๆœฌ่ง„่Œƒ](#8-scripts-่„šๆœฌ่ง„่Œƒ)
9. [Prompt ๅทฅ็จ‹่ง„่Œƒ](#9-prompt-ๅทฅ็จ‹่ง„่Œƒ)
10. [่ดจ้‡ๆŽงๅˆถ่ง„่Œƒ](#10-่ดจ้‡ๆŽงๅˆถ่ง„่Œƒ)
11. [ๆœ€ไฝณๅฎž่ทตๆธ…ๅ•](#11-ๆœ€ไฝณๅฎž่ทตๆธ…ๅ•)
12. [็คบไพ‹ๆจกๆฟ](#12-็คบไพ‹ๆจกๆฟ)

---

## 1. ่ฎพ่ฎก็†ๅฟต

### 1.1 ๆ ธๅฟƒๅŽŸๅˆ™

| ๅŽŸๅˆ™ | ่ฏดๆ˜Ž | ๅฎž่ทต |
|------|------|------|
| **้˜ถๆฎตๅŒ–ๆ‰ง่กŒ** | ๅคๆ‚ไปปๅŠกๅˆ†่งฃไธบๆœ‰ๅบ้˜ถๆฎต | ไฝฟ็”จ `phases/` ็›ฎๅฝ•๏ผŒๆ•ฐๅญ—ๅ‰็ผ€ๆŽงๅˆถ้กบๅบ |
| **ๅ…ณๆณจ็‚นๅˆ†็ฆป** | ้€ป่พ‘ใ€้…็ฝฎใ€่ง†ๅ›พๅˆ†็ฆป | `phases/`(้€ป่พ‘) + `specs/`(้…็ฝฎ) + `templates/`(่ง†ๅ›พ) |
| **็ฎ€่ฆ่ฟ”ๅ›ž** | Agent ่ฟ”ๅ›ž่ทฏๅพ„+ๆ‘˜่ฆ๏ผŒ้ฟๅ…ไธŠไธ‹ๆ–‡ๆบขๅ‡บ | ่ฟ”ๅ›ž JSON ็ฎ€่ฆไฟกๆฏ๏ผŒๆ–‡ไปถๅญ˜ๅ‚จๅฎŒๆ•ดๅ†…ๅฎน |
| **้…็ฝฎ้ฉฑๅŠจ** | ่ง„่Œƒไฝœไธบ"้…็ฝฎๆ–‡ไปถ"๏ผŒๆ˜“ไบŽ่ฐƒๆ•ด่กŒไธบ | ไฟฎๆ”น `specs/` ๆ— ้œ€่งฆๅŠ `phases/` |
| **ๆจกๆฟๅค็”จ** | ๆๅ–้€š็”จ็‰‡ๆฎต๏ผŒ็กฎไฟไธ€่‡ดๆ€ง | `templates/` ๅญ˜ๆ”พๅฏๅค็”จๅ†…ๅฎน |

### 1.2 ๆžถๆž„ๆจกๅผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Context-Optimized Architecture โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ SKILL.md (ๅ…ฅๅฃ) โ†’ ๆ่ฟฐ็›ฎๆ ‡ใ€ๅฎšไน‰้˜ถๆฎตใ€้“พๆŽฅ่ต„ๆบ โ”‚ โ”‚ โ†“ โ”‚ โ”‚ Phase 1: ๆ”ถ้›† โ†’ ็”จๆˆท่พ“ๅ…ฅ + ่‡ชๅŠจๆฃ€ๆต‹ โ†’ config.json โ”‚ โ”‚ โ†“ โ”‚ โ”‚ Phase 2: ๅˆ†ๆž โ†’ ๅนถ่กŒ Agent โ†’ sections/*.md โ”‚ โ”‚ โ†“ โ”‚ โ”‚ Phase N: ๆฑ‡ๆ€ป โ†’ ไบคๅ‰ๆฃ€ๆŸฅ โ†’ summary.md โ”‚ โ”‚ โ†“ โ”‚ โ”‚ Phase N+1: ็ป„่ฃ… โ†’ ๅˆๅนถๆ–‡ไปถ โ†’ ๆœ€็ปˆไบง็‰ฉ โ”‚ โ”‚ โ†“ โ”‚ โ”‚ Phase N+2: ่ฟญไปฃ โ†’ ็”จๆˆทๅ้ฆˆ โ†’ ไผ˜ๅŒ– โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜


---

## 2. ็›ฎๅฝ•็ป“ๆž„่ง„่Œƒ

### 2.1 ๆ ‡ๅ‡†็›ฎๅฝ•็ป“ๆž„

[skill-name]/ โ”œโ”€โ”€ SKILL.md # ใ€ๅฟ…้œ€ใ€‘ๆŠ€่ƒฝๅ…ฅๅฃ๏ผšๅ…ƒๆ•ฐๆฎ + ๆžถๆž„ + ๆ‰ง่กŒๆต็จ‹ โ”œโ”€โ”€ phases/ # ใ€ๅฟ…้œ€ใ€‘ๆ‰ง่กŒ้˜ถๆฎต Prompt โ”‚ โ”œโ”€โ”€ 01-{first-step}.md # ๆ•ฐๅญ—ๅ‰็ผ€ๅฎšไน‰้กบๅบ โ”‚ โ”œโ”€โ”€ 02-{second-step}.md โ”‚ โ”œโ”€โ”€ 02.5-{sub-step}.md # ๅฐๆ•ฐ็‚น็”จไบŽๆ’ๅ…ฅๅญๆญฅ้ชค โ”‚ โ””โ”€โ”€ ... โ”œโ”€โ”€ specs/ # ใ€ๅฟ…้œ€ใ€‘่ง„่ŒƒไธŽ็บฆๆŸ โ”‚ โ”œโ”€โ”€ {domain}-requirements.md # ้ข†ๅŸŸ็‰นๅฎš่ฆๆฑ‚ โ”‚ โ”œโ”€โ”€ quality-standards.md # ่ดจ้‡ๆ ‡ๅ‡† โ”‚ โ””โ”€โ”€ writing-style.md # ๅ†™ไฝœ้ฃŽๆ ผ๏ผˆๅฆ‚้€‚็”จ๏ผ‰ โ”œโ”€โ”€ templates/ # ใ€ๆŽจ่ใ€‘ๅฏๅค็”จๆจกๆฟ โ”‚ โ”œโ”€โ”€ agent-base.md # Agent ๅŸบ็ก€ Prompt ๆจกๆฟ โ”‚ โ”œโ”€โ”€ output-shell.{ext} # ่พ“ๅ‡บๅค–ๅฃณๆจกๆฟ๏ผˆhtml/md๏ผ‰ โ”‚ โ””โ”€โ”€ css/ # ๆ ทๅผๆ–‡ไปถ๏ผˆๅฆ‚้€‚็”จ๏ผ‰ โ”œโ”€โ”€ scripts/ # ใ€ๅฏ้€‰ใ€‘่พ…ๅŠฉ่„šๆœฌ โ”‚ โ”œโ”€โ”€ {tool}.py # Python ่„šๆœฌ โ”‚ โ””โ”€โ”€ {tool}-runner.md # ่„šๆœฌไฝฟ็”จ่ฏดๆ˜Ž โ””โ”€โ”€ outputs/ # ใ€่ฟ่กŒๆ—ถใ€‘ๆ‰ง่กŒไบง็‰ฉ๏ผˆไธ็บณๅ…ฅ็‰ˆๆœฌๆŽงๅˆถ๏ผ‰


### 2.2 ๅ‘ฝๅ็บฆๅฎš

| ็ฑปๅž‹ | ่ง„ๅˆ™ | ็คบไพ‹ |
|------|------|------|
| Skill ็›ฎๅฝ• | ๅฐๅ†™-่ฟžๅญ—็ฌฆ | `software-manual`, `copyright-docs` |
| Phase ๆ–‡ไปถ | `NN-{ๅŠจไฝœ}.md` | `01-metadata-collection.md` |
| Spec ๆ–‡ไปถ | `{้ข†ๅŸŸ}-{็ฑปๅž‹}.md` | `cpcc-requirements.md` |
| Template ๆ–‡ไปถ | `{็”จ้€”}-{็ฑปๅž‹}.{ext}` | `agent-base.md`, `tiddlywiki-shell.html` |
| ่พ“ๅ‡บๆ–‡ไปถ | `section-{N}-{ๅ็งฐ}.md` | `section-2-architecture.md` |

---

## 3. ๆ ธๅฟƒ็ป„ไปถๅฎšไน‰

### 3.1 ็ป„ไปถ่Œ่ดฃ็Ÿฉ้˜ต

| ็ป„ไปถ | ่Œ่ดฃ | ๅ†…ๅฎน็ฑปๅž‹ | ไฟฎๆ”น้ข‘็އ |
|------|------|----------|----------|
| `SKILL.md` | ๅ…ฅๅฃ + ็ผ–ๆŽ’ | ๅ…ƒๆ•ฐๆฎใ€ๆžถๆž„ๅ›พใ€ๆ‰ง่กŒๆต็จ‹ | ไฝŽ๏ผˆ็ป“ๆž„็จณๅฎš๏ผ‰ |
| `phases/*.md` | ๆ‰ง่กŒ้€ป่พ‘ | ๆญฅ้ชค่ฏดๆ˜Žใ€Promptใ€ไปฃ็ ็คบไพ‹ | ไธญ๏ผˆไผ˜ๅŒ–่ฟญไปฃ๏ผ‰ |
| `specs/*.md` | ็บฆๆŸ้…็ฝฎ | ่ง„ๅˆ™ใ€ๆ ‡ๅ‡†ใ€ๆฃ€ๆŸฅๆธ…ๅ• | ไธญ๏ผˆ้œ€ๆฑ‚ๅ˜ๆ›ด๏ผ‰ |
| `templates/*` | ๅฏๅค็”จ็‰‡ๆฎต | Prompt ๆจกๆฟใ€่พ“ๅ‡บๆ ผๅผ | ไฝŽ๏ผˆ้€š็”จ็จณๅฎš๏ผ‰ |
| `scripts/*` | ่‡ชๅŠจๅŒ– | Python/JS ่„šๆœฌ | ้ซ˜๏ผˆๅŠŸ่ƒฝๅขžๅผบ๏ผ‰ |

### 3.2 ็ป„ไปถไพ่ต–ๅ…ณ็ณป

```mermaid
graph TD
    SKILL[SKILL.md] --> P1[phases/01-*]
    P1 --> P2[phases/02-*]
    P2 --> PN[phases/N-*]
    
    P1 -.->|ๅผ•็”จ| SPEC[specs/*]
    P2 -.->|ๅผ•็”จ| SPEC
    PN -.->|ๅผ•็”จ| SPEC
    
    P1 -.->|ไฝฟ็”จ| TPL[templates/*]
    PN -.->|ไฝฟ็”จ| TPL
    
    P2 -->|่ฐƒ็”จ| SCR[scripts/*]
    
    style SKILL fill:#e1f5fe
    style SPEC fill:#fff3e0
    style TPL fill:#e8f5e9
    style SCR fill:#fce4ec

4. SKILL.md ๅ…ฅๅฃ่ง„่Œƒ

4.1 ๅฟ…้œ€็ป“ๆž„

---
name: {skill-name}
description: {ไธ€ๅฅ่ฏๆ่ฟฐ}. {่งฆๅ‘ๅ…ณ้”ฎ่ฏ}. Triggers on "{ๅ…ณ้”ฎ่ฏ1}", "{ๅ…ณ้”ฎ่ฏ2}".
allowed-tools: Task, AskUserQuestion, Read, Bash, Glob, Grep, Write, {ๅ…ถไป–MCPๅทฅๅ…ท}
---

# {Skill ๆ ‡้ข˜}

{ไธ€ๆฎต่ฏๆ่ฟฐ Skill ็š„็”จ้€”ๅ’Œไบงๅ‡บ}

## Architecture Overview

{ASCII ๆˆ– Mermaid ๆžถๆž„ๅ›พ}

## Key Design Principles

1. **ๅŽŸๅˆ™1**: ่ฏดๆ˜Ž
2. **ๅŽŸๅˆ™2**: ่ฏดๆ˜Ž
...

## Execution Flow

{้˜ถๆฎตๆ‰ง่กŒๆต็จ‹ๅ›พ}

## Agent Configuration (ๅฆ‚้€‚็”จ)

| Agent | Role | Output File | Focus Areas |
|-------|------|-------------|-------------|
| ... | ... | ... | ... |

## Directory Setup

{ๅทฅไฝœ็›ฎๅฝ•ๅˆ›ๅปบไปฃ็ }

## Output Structure

{่พ“ๅ‡บ็›ฎๅฝ•็ป“ๆž„}

## Reference Documents

| Document | Purpose |
|----------|---------|
| [phases/01-xxx.md](phases/01-xxx.md) | ... |
| ... | ... |

4.2 Front Matter ่ง„่Œƒ

---
name: skill-name              # ๅฟ…้œ€๏ผšSkill ๅ”ฏไธ€ๆ ‡่ฏ†
description: |                # ๅฟ…้œ€๏ผšๆ่ฟฐ + ่งฆๅ‘่ฏ
  Generate XXX documents. 
  Triggers on "keyword1", "keyword2".
allowed-tools: |              # ๅฟ…้œ€๏ผšๅ…่ฎธไฝฟ็”จ็š„ๅทฅๅ…ท
  Task, AskUserQuestion, Read, Bash, 
  Glob, Grep, Write, mcp__chrome__*
---

5. Phase ้˜ถๆฎต่ฎพ่ฎก่ง„่Œƒ

5.1 Phase ๆ–‡ไปถ็ป“ๆž„

# Phase N: {้˜ถๆฎตๅ็งฐ}

{ไธ€ๅฅ่ฏๆ่ฟฐๆญค้˜ถๆฎต็›ฎๆ ‡}

## Objective

{่ฏฆ็ป†็›ฎๆ ‡่ฏดๆ˜Ž}
- ็›ฎๆ ‡1
- ็›ฎๆ ‡2

## Execution Steps

### Step 1: {ๆญฅ้ชคๅ็งฐ}

{ไปฃ็ ๆˆ–่ฏดๆ˜Ž}

### Step 2: {ๆญฅ้ชคๅ็งฐ}

{ไปฃ็ ๆˆ–่ฏดๆ˜Ž}

## Output

- **File**: `{่พ“ๅ‡บๆ–‡ไปถๅ}`
- **Location**: `{่พ“ๅ‡บ่ทฏๅพ„}`
- **Format**: {JSON/Markdown/HTML}

## Next Phase

Proceed to [Phase N+1: xxx](0N+1-xxx.md) with the generated {ไบงๅ‡บ}.

5.2 Phase ็ฑปๅž‹

็ฑปๅž‹็‰น็‚น็คบไพ‹
ๆ”ถ้›†ๅž‹็”จๆˆทไบคไบ’ + ่‡ชๅŠจๆฃ€ๆต‹01-requirements-discovery.md
ๆŽข็ดขๅž‹ไปฃ็ ๅˆ†ๆž + ็ป“ๆž„่ฏ†ๅˆซ02-project-exploration.md
ๅนถ่กŒๅž‹ๅคš Agent ๅนถ่กŒๆ‰ง่กŒ03-parallel-analysis.md
ๆฑ‡ๆ€ปๅž‹ไบคๅ‰ๆฃ€ๆŸฅ + ่ดจ้‡้ชŒ่ฏ03.5-consolidation.md
็ป„่ฃ…ๅž‹ๅˆๅนถไบงๅ‡บ + ๆ ผๅผๅŒ–04-document-assembly.md
่ฟญไปฃๅž‹็”จๆˆทๅ้ฆˆ + ไผ˜ๅŒ–05-iterative-refinement.md

5.3 Phase ็ผ–ๅท่ง„ๅˆ™

01-xxx.md      # ไธป้˜ถๆฎต
02-xxx.md      # ไธป้˜ถๆฎต
02.5-xxx.md    # ๅญ้˜ถๆฎต๏ผˆๆ’ๅ…ฅ 02 ๅ’Œ 03 ไน‹้—ด๏ผ‰
03-xxx.md      # ไธป้˜ถๆฎต

6. Specs ่ง„่Œƒๆ–‡ไปถ่ฎพ่ฎก

6.1 Specs ็ฑปๅž‹

็ฑปๅž‹็”จ้€”็คบไพ‹
้ข†ๅŸŸ่ฆๆฑ‚้ข†ๅŸŸ็‰นๅฎšๅˆ่ง„ๆ€งcpcc-requirements.md
่ดจ้‡ๆ ‡ๅ‡†่พ“ๅ‡บ่ดจ้‡่ฏ„ไผฐquality-standards.md
ๅ†™ไฝœ้ฃŽๆ ผๅ†…ๅฎน้ฃŽๆ ผๆŒ‡ๅ—writing-style.md
ๆจกๆฟ่ง„่Œƒ่พ“ๅ‡บๆ ผๅผๅฎšไน‰html-template.md

6.2 Specs ็ป“ๆž„ๆจกๆฟ

# {่ง„่Œƒๅ็งฐ}

{่ง„่Œƒ็”จ้€”่ฏดๆ˜Ž}

## When to Use

| Phase | Usage | Section |
|-------|-------|---------|
| Phase N | {ไฝฟ็”จๅœบๆ™ฏ} | {ๅผ•็”จ็ซ ่Š‚} |
| ... | ... | ... |

---

## Requirements

### Category 1

- [ ] ๆฃ€ๆŸฅ้กน1
- [ ] ๆฃ€ๆŸฅ้กน2

### Category 2

| ้กน็›ฎ | ่ฆๆฑ‚ | ๆฃ€ๆŸฅๆ–นๅผ |
|------|------|----------|
| ... | ... | ... |

## Validation Function

{้ชŒ่ฏๅ‡ฝๆ•ฐไปฃ็ }

## Error Handling

| Error | Recovery |
|-------|----------|
| ... | ... |

6.3 ่ดจ้‡ๆ ‡ๅ‡†็คบไพ‹็ป“ๆž„

# Quality Standards

## Quality Dimensions

### 1. Completeness (25%)
{่ฏ„ๅˆ†ๆ ‡ๅ‡†}

### 2. Consistency (25%)
{่ฏ„ๅˆ†ๆ ‡ๅ‡†}

### 3. Depth (25%)
{่ฏ„ๅˆ†ๆ ‡ๅ‡†}

### 4. Readability (25%)
{่ฏ„ๅˆ†ๆ ‡ๅ‡†}

## Quality Gates

| Gate | Threshold | Action |
|------|-----------|--------|
| Pass | โ‰ฅ 80% | ็ปง็ปญๆ‰ง่กŒ |
| Review | 60-79% | ๅค„็†่ญฆๅ‘ŠๅŽ็ปง็ปญ |
| Fail | < 60% | ๅฟ…้กปไฟฎๅค |

## Issue Classification

### Errors (Must Fix)
- ...

### Warnings (Should Fix)
- ...

### Info (Nice to Have)
- ...

7. Templates ๆจกๆฟ่ฎพ่ฎก

7.1 Agent ๅŸบ็ก€ๆจกๆฟ

# Agent Base Template

## ้€š็”จๆ็คบ่ฏ็ป“ๆž„

[ROLE] ไฝ ๆ˜ฏ{่ง’่‰ฒ}๏ผŒไธ“ๆณจไบŽ{่Œ่ดฃ}ใ€‚

[TASK]
{ไปปๅŠกๆ่ฟฐ}
- ่พ“ๅ‡บ: {output_path}
- ๆ ผๅผ: {format}
- ่Œƒๅ›ด: {scope}

[CONSTRAINTS]
- ็บฆๆŸ1
- ็บฆๆŸ2

[OUTPUT_FORMAT]
1. ็›ดๆŽฅๅ†™ๅ…ฅๆ–‡ไปถ
2. ่ฟ”ๅ›ž JSON ็ฎ€่ฆไฟกๆฏ

[QUALITY_CHECKLIST]
- [ ] ๆฃ€ๆŸฅ้กน1
- [ ] ๆฃ€ๆŸฅ้กน2

## ๅ˜้‡่ฏดๆ˜Ž

| ๅ˜้‡ | ๆฅๆบ | ็คบไพ‹ |
|------|------|------|
| {output_dir} | Phase 1 | .workflow/.scratchpad/xxx |
| ... | ... | ... |

## Agent ้…็ฝฎๆ˜ ๅฐ„

{AGENT_ROLES, AGENT_SECTIONS, AGENT_FILES, AGENT_FOCUS}

7.2 ่พ“ๅ‡บๆจกๆฟ่ง„่Œƒ

<!-- output-shell.html ็คบไพ‹ -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{title}}</title>
    <style>
        /* ๅ†…ๅตŒ CSS */
        {{styles}}
    </style>
</head>
<body>
    <div id="app">
        {{content}}
    </div>
    <script>
        /* ๅ†…ๅตŒ JS */
        {{scripts}}
    </script>
</body>
</html>

7.3 ๅ ไฝ็ฌฆ่ง„่Œƒ

ๅ ไฝ็ฌฆๆ ผๅผ็”จ้€”็คบไพ‹
{{variable}}็ฎ€ๅ•ๅ˜้‡ๆ›ฟๆข{{title}}
${variable}JavaScript ๆจกๆฟๅญ—็ฌฆไธฒ${workDir}
{placeholder}Prompt ๅ ไฝ{intro}, {diagram}

8. Scripts ่„šๆœฌ่ง„่Œƒ

8.1 ่„šๆœฌ็ฑปๅž‹

็ฑปๅž‹็”จ้€”ๅ‘ฝๅ
ๆๅ–ๅ™จไปŽไปฃ็ ๆๅ–ไฟกๆฏextract_*.py
็ป„่ฃ…ๅ™จๅˆๅนถ/่ฝฌๆขๆ–‡ไปถassemble_*.py
้ชŒ่ฏๅ™จๆฃ€ๆŸฅๅˆ่ง„ๆ€งvalidate_*.py
่พ…ๅŠฉๅ™จๅทฅๅ…ทๅ‡ฝๆ•ฐ*_helper.py

8.2 ่„šๆœฌไฝฟ็”จ่ฏดๆ˜Žๆ–‡ไปถ

ๆฏไธช่„šๆœฌๅบ”ๆœ‰ๅฏนๅบ”็š„ .md ่ฏดๆ˜Žๆ–‡ไปถ๏ผš

# {Script Name} Runner

## Purpose

{่„šๆœฌ็”จ้€”}

## Usage

{ๅ‘ฝไปค่กŒไฝฟ็”จๆ–นๅผ}

## Parameters

| ๅ‚ๆ•ฐ | ่ฏดๆ˜Ž | ้ป˜่ฎคๅ€ผ |
|------|------|--------|
| ... | ... | ... |

## Output

{่พ“ๅ‡บ่ฏดๆ˜Ž}

## Example

{ไฝฟ็”จ็คบไพ‹}

9. Prompt ๅทฅ็จ‹่ง„่Œƒ

9.1 Prompt ็ป“ๆž„ๆ ‡ๅ‡†

[ROLE] {่ง’่‰ฒๅฎšไน‰}

[PROJECT CONTEXT]
้กน็›ฎ็ฑปๅž‹: {type}
่ฏญ่จ€: {language}
ๅ็งฐ: {name}

[TASK]
{ไปปๅŠกๆ่ฟฐ}
่พ“ๅ‡บ: {output_path}

[INPUT]
- ้…็ฝฎ: {config_path}
- ๆ‰ซๆ่ทฏๅพ„: {scan_paths}

[CONTENT REQUIREMENTS]
- ๆ ‡้ข˜ๅฑ‚็บง: # ## ### (ๆœ€ๅคš3็บง)
- ไปฃ็ ๅ—: ```language ... ``` (ๅฟ…้กปๆ ‡ๆณจ่ฏญ่จ€)
- ่กจๆ ผ: | col1 | col2 | ๆ ผๅผ
- ๅˆ—่กจ: ๆœ‰ๅบ 1. 2. 3. / ๆ— ๅบ - - -

[FOCUS]
{้‡็‚นๅ…ณๆณจ้กน}

[OUTPUT FORMAT]
{่พ“ๅ‡บๆ ผๅผ่ฏดๆ˜Ž}

[RETURN JSON]
{่ฟ”ๅ›ž็ป“ๆž„}

9.2 ๆ•ˆ็އไผ˜ๅŒ–ๅŽŸๅˆ™

ๅŽŸๅˆ™Before (ๅ†—ไฝ™)After (็ฒพ็ฎ€)
่ง’่‰ฒ็ฎ€ๅŒ–"ไฝ ๆ˜ฏไธ€ไธชไธ“ไธš็š„็ณป็ปŸๆžถๆž„ๅธˆ๏ผŒๅ…ทๆœ‰ไธฐๅฏŒ็š„่ฝฏไปถ่ฎพ่ฎก็ป้ชŒ..."[ROLE] ็ณป็ปŸๆžถๆž„ๅธˆ๏ผŒไธ“ๆณจไบŽๅˆ†ๅฑ‚่ฎพ่ฎกๅ’Œๆจกๅ—ไพ่ต–
ๆจกๆฟ้ฉฑๅŠจ"่ฏทๆŒ‰็…งไปฅไธ‹ๆ ผๅผ่พ“ๅ‡บ: ้ฆ–ๅ…ˆๅ†™ไธ€ไธชไบŒ็บงๆ ‡้ข˜..."[TEMPLATE] ## 2. ๆ ‡้ข˜ {content}
็„ฆ็‚นๆ˜Ž็กฎ"ๅˆ†ๆž้กน็›ฎ็š„ๅ„ไธชๆ–น้ข๏ผŒๅŒ…ๆ‹ฌๆžถๆž„ใ€ๆจกๅ—ใ€ไพ่ต–็ญ‰"[FOCUS] 1. ๅˆ†ๅฑ‚ 2. ๆจกๅ— 3. ไพ่ต– 4. ๆ•ฐๆฎๆต
่ฟ”ๅ›ž็ฎ€ๆด"่ฏท่ฟ”ๅ›ž่ฏฆ็ป†็š„ๅˆ†ๆž็ป“ๆžœ๏ผŒๅŒ…ๆ‹ฌๆ‰€ๆœ‰ๅ‘็Žฐ็š„้—ฎ้ข˜..."[RETURN] {"status":"completed","output_file":"xxx.md","summary":"<50ๅญ—"}

9.3 Agent ่ฟ”ๅ›žๆ ผๅผๆ ‡ๅ‡†

interface AgentReturn {
  status: "completed" | "partial" | "failed";
  output_file: string;           // ่พ“ๅ‡บๆ–‡ไปถ่ทฏๅพ„
  summary: string;               // ๆœ€ๅคš 50 ๅญ—ๆ‘˜่ฆ
  cross_module_notes?: string[]; // ่ทจๆจกๅ—ๅค‡ๆณจ
  stats?: {                      // ็ปŸ่ฎกไฟกๆฏ
    diagrams?: number;
    words?: number;
  };
  screenshots_needed?: Array<{   // ๆˆชๅ›พ้œ€ๆฑ‚๏ผˆๅฆ‚้€‚็”จ๏ผ‰
    id: string;
    url: string;
    description: string;
  }>;
}

10. ่ดจ้‡ๆŽงๅˆถ่ง„่Œƒ

10.1 ่ดจ้‡็ปดๅบฆ

็ปดๅบฆๆƒ้‡ๆฃ€ๆŸฅ้กน
ๅฎŒๆ•ดๆ€ง25%ๆ‰€ๆœ‰ๅฟ…้œ€็ซ ่Š‚ๅญ˜ๅœจไธ”ๆœ‰ๅฎž่ดจๅ†…ๅฎน
ไธ€่‡ดๆ€ง25%ๆœฏ่ฏญใ€ๆ ผๅผใ€้ฃŽๆ ผ็ปŸไธ€
ๆทฑๅบฆ25%ๅ†…ๅฎน่ฏฆๅฐฝใ€็คบไพ‹ๅ……ๅˆ†
ๅฏ่ฏปๆ€ง25%็ป“ๆž„ๆธ…ๆ™ฐใ€่ฏญ่จ€็ฎ€ๆด

10.2 ่ดจ้‡้—จๆŽง

const QUALITY_GATES = {
  pass: { threshold: 80, action: "็ปง็ปญๆ‰ง่กŒ" },
  review: { threshold: 60, action: "ๅค„็†่ญฆๅ‘ŠๅŽ็ปง็ปญ" },
  fail: { threshold: 0, action: "ๅฟ…้กปไฟฎๅคๅŽ้‡่ฏ•" }
};

10.3 ้—ฎ้ข˜ๅˆ†็ฑป

็บงๅˆซๅ‰็ผ€ๅซไน‰ๅค„็†ๆ–นๅผ
ErrorE้˜ปๅกžๆ€ง้—ฎ้ข˜ๅฟ…้กปไฟฎๅค
WarningWๅฝฑๅ“่ดจ้‡ๅปบ่ฎฎไฟฎๅค
InfoIๅฏๆ”น่ฟ›้กนๅฏ้€‰ไฟฎๅค

10.4 ่‡ชๅŠจๅŒ–ๆฃ€ๆŸฅๅ‡ฝๆ•ฐๆจกๆฟ

function runQualityChecks(workDir) {
  const results = {
    completeness: checkCompleteness(workDir),
    consistency: checkConsistency(workDir),
    depth: checkDepth(workDir),
    readability: checkReadability(workDir)
  };

  results.overall = Object.values(results).reduce((a, b) => a + b) / 4;
  
  return {
    score: results.overall,
    gate: results.overall >= 80 ? 'pass' : 
          results.overall >= 60 ? 'review' : 'fail',
    details: results
  };
}

11. ๆœ€ไฝณๅฎž่ทตๆธ…ๅ•

11.1 Skill ่ฎพ่ฎก

  • ๅ•ไธ€่Œ่ดฃ: ๆฏไธช Skill ไธ“ๆณจไธ€ไธช้ข†ๅŸŸ
  • ๆธ…ๆ™ฐๅ…ฅๅฃ: SKILL.md ๅฎŒๆ•ดๆ่ฟฐ็›ฎๆ ‡ๅ’Œๆต็จ‹
  • ้˜ถๆฎตๅˆ†่งฃ: ๅคๆ‚ไปปๅŠกๆ‹†ๅˆ†ไธบ 3-7 ไธช้˜ถๆฎต
  • ้กบๅบๅ‘ฝๅ: ไฝฟ็”จๆ•ฐๅญ—ๅ‰็ผ€ๆŽงๅˆถๆ‰ง่กŒ้กบๅบ

11.2 Phase ่ฎพ่ฎก

  • ๆ˜Ž็กฎ็›ฎๆ ‡: ๆฏไธช Phase ๆœ‰ๆธ…ๆ™ฐ็š„่พ“ๅ…ฅ่พ“ๅ‡บ
  • ็‹ฌ็ซ‹ๅฏๆต‹: ๆฏไธช Phase ๅฏๅ•็‹ฌ่ฐƒ่ฏ•
  • ้“พๆŽฅไธ‹ไธ€ๆญฅ: ๆ˜Ž็กฎ่ฏดๆ˜ŽๅŽ็ปญ้˜ถๆฎต

11.3 Prompt ่ฎพ่ฎก

  • ่ง’่‰ฒๆ˜Ž็กฎ: ไฝฟ็”จ [ROLE] ๅฎšไน‰ Agent ่บซไปฝ
  • ไปปๅŠกๅ…ทไฝ“: ไฝฟ็”จ [TASK] ๆ˜Ž็กฎๆ‰ง่กŒ็›ฎๆ ‡
  • ็บฆๆŸๆธ…ๆ™ฐ: ไฝฟ็”จ [CONSTRAINTS] ๅฎšไน‰่พน็•Œ
  • ่ฟ”ๅ›ž็ฎ€ๆด: Agent ่ฟ”ๅ›ž่ทฏๅพ„+ๆ‘˜่ฆ๏ผŒ้žๅฎŒๆ•ดๅ†…ๅฎน

11.4 ่ดจ้‡ๆŽงๅˆถ

  • ่ง„่Œƒ้ฉฑๅŠจ: ไฝฟ็”จ specs/ ๅฎšไน‰ๅฏ้ชŒ่ฏ็š„ๆ ‡ๅ‡†
  • ๆฑ‡ๆ€ปๆฃ€ๆŸฅ: ่ฎพ็ฝฎ Consolidation ้˜ถๆฎตไบคๅ‰้ชŒ่ฏ
  • ้—ฎ้ข˜ๅˆ†็บง: ๅŒบๅˆ† Error/Warning/Info
  • ่ฟญไปฃไผ˜ๅŒ–: ๆ”ฏๆŒ็”จๆˆทๅ้ฆˆๅพช็Žฏ

12. ็คบไพ‹ๆจกๆฟ

12.1 ๆ–ฐ Skill ๅฟซ้€ŸๅฏๅŠจๆจกๆฟ

# ๅˆ›ๅปบ Skill ็›ฎๅฝ•็ป“ๆž„
mkdir -p my-skill/{phases,specs,templates,scripts}

# ๅˆ›ๅปบๆ ธๅฟƒๆ–‡ไปถ
touch my-skill/SKILL.md
touch my-skill/phases/{01-collection,02-analysis,03-assembly}.md
touch my-skill/specs/{requirements,quality-standards}.md
touch my-skill/templates/agent-base.md

12.2 SKILL.md ๆœ€ๅฐๆจกๆฟ

---
name: my-skill
description: Generate XXX. Triggers on "keyword1", "keyword2".
allowed-tools: Task, AskUserQuestion, Read, Bash, Glob, Grep, Write
---

# My Skill

Generate XXX through multi-phase analysis.

## Execution Flow

1. Phase 1: Collection โ†’ config.json
2. Phase 2: Analysis โ†’ sections/*.md
3. Phase 3: Assembly โ†’ output.md

## Reference Documents

| Document | Purpose |
|----------|---------|
| [phases/01-collection.md](phases/01-collection.md) | ไฟกๆฏๆ”ถ้›† |
| [phases/02-analysis.md](phases/02-analysis.md) | ไปฃ็ ๅˆ†ๆž |
| [phases/03-assembly.md](phases/03-assembly.md) | ๆ–‡ๆกฃ็ป„่ฃ… |

้™„ๅฝ• A: ่ฎพ่ฎกๅฏนๆฏ”

่ฎพ่ฎก็‚นsoftware-manualcopyright-docs
้˜ถๆฎตๆ•ฐ65
ๅนถ่กŒ Agent66
่พ“ๅ‡บๆ ผๅผHTMLMarkdown
่ดจ้‡ๆฃ€ๆŸฅ4 ็ปดๅบฆ่ฏ„ๅˆ†CPCC ๅˆ่ง„ๆฃ€ๆŸฅ
ๆˆชๅ›พๆ”ฏๆŒChrome MCPๆ— 
่ฟญไปฃไผ˜ๅŒ–็”จๆˆทๅ้ฆˆๅพช็Žฏๅˆ่ง„้ชŒ่ฏๅพช็Žฏ

้™„ๅฝ• B: ๅทฅๅ…ทไพ่ต–

ๅทฅๅ…ท็”จ้€”้€‚็”จ Skill
TaskๅฏๅŠจๅญ Agentๆ‰€ๆœ‰
AskUserQuestion็”จๆˆทไบคไบ’ๆ‰€ๆœ‰
Read/Write/Glob/Grepๆ–‡ไปถๆ“ไฝœๆ‰€ๆœ‰
Bash่„šๆœฌๆ‰ง่กŒ้œ€่ฆ่‡ชๅŠจๅŒ–
mcp__chrome__*ๆต่งˆๅ™จๆˆชๅ›พUI ็›ธๅ…ณ

่ง„่Œƒ็‰ˆๆœฌ: 1.0
ๅŸบไบŽ: software-manual, copyright-docs
ๆœ€ๅŽๆ›ดๆ–ฐ: 2026-01-03

Source: https://github.com/catlog22/Claude-Code-Workflow#.claude~skills~skill-generator

Content curated from original sources, copyright belongs to authors

Grade A
8.3AI Score
Best Practices
Checking...
Try this Skill

User Rating

USER RATING

0UP
0DOWN
Loading files...

WORKS WITH

Claude Code
Claude
Codex CLI
Codex
Gemini CLI
Gemini
O
OpenCode
O
OpenClaw
GitHub Copilot
Copilot
Cursor
Cursor
W
Windsurf
C
Cline
R
Roo
K
Kiro
J
Junie
A
Augment
W
Warp
G
Goose