mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-14 02:42:04 +08:00
- Convert all markdown files from Chinese to English - Remove all emoji/icon decorations (🔧📋⚙️✅🏁🔍📚⛔⭐) - Update all section headers, descriptions, and documentation - Keep all content logic, structure, code examples unchanged - Maintain template variables and file paths as-is Files converted (9 files total): - SKILL.md: Output structure comments - templates/skill-md.md: All Chinese descriptions and comments - specs/reference-docs-spec.md: All section headers and explanations - phases/01-requirements-discovery.md through 05-validation.md (5 files) - specs/execution-modes.md, skill-requirements.md, cli-integration.md, scripting-integration.md (4 files) - templates/sequential-phase.md, autonomous-orchestrator.md, autonomous-action.md, code-analysis-action.md, llm-action.md, script-template.md (6 files) All 16 files in skill-generator are now fully in English.
262 lines
8.5 KiB
Markdown
262 lines
8.5 KiB
Markdown
# Phase 2: Structure Generation
|
|
|
|
Create Skill directory structure and entry file based on configuration.
|
|
|
|
## Objective
|
|
|
|
- Create standard directory structure
|
|
- Generate SKILL.md entry file
|
|
- Create corresponding subdirectories based on execution mode
|
|
|
|
|
|
## Execution Steps
|
|
|
|
### Step 1: Read Configuration
|
|
|
|
```javascript
|
|
const config = JSON.parse(Read(`${workDir}/skill-config.json`));
|
|
const skillDir = `.claude/skills/${config.skill_name}`;
|
|
```
|
|
|
|
### Step 2: Create Directory Structure
|
|
|
|
#### Base Directories (All Modes)
|
|
|
|
```javascript
|
|
// Base infrastructure
|
|
Bash(`mkdir -p "${skillDir}/{phases,specs,templates,scripts}"`);
|
|
```
|
|
|
|
#### Execution Mode-Specific Directories
|
|
|
|
```
|
|
config.execution_mode
|
|
↓
|
|
├─ "sequential"
|
|
│ ↓ Creates:
|
|
│ └─ phases/ (base directory already included)
|
|
│ ├─ _orchestrator.md
|
|
│ └─ workflow.json
|
|
│
|
|
└─ "autonomous" | "hybrid"
|
|
↓ Creates:
|
|
└─ phases/actions/
|
|
├─ state-schema.md
|
|
└─ *.md (action files)
|
|
```
|
|
|
|
```javascript
|
|
// Additional directories for Autonomous/Hybrid mode
|
|
if (config.execution_mode === 'autonomous' || config.execution_mode === 'hybrid') {
|
|
Bash(`mkdir -p "${skillDir}/phases/actions"`);
|
|
}
|
|
```
|
|
|
|
#### Context Strategy-Specific Directories (P0 Enhancement)
|
|
|
|
```javascript
|
|
// ========== P0: Create directories based on context strategy ==========
|
|
const contextStrategy = config.context_strategy || 'file';
|
|
|
|
if (contextStrategy === 'file') {
|
|
// File strategy: Create persistent context directory
|
|
Bash(`mkdir -p "${skillDir}/.scratchpad-template/context"`);
|
|
|
|
// Create context template file
|
|
Write(
|
|
`${skillDir}/.scratchpad-template/context/.gitkeep`,
|
|
"# Runtime context storage for file-based strategy"
|
|
);
|
|
}
|
|
// Memory strategy does not require directory creation (in-memory only)
|
|
```
|
|
|
|
**Directory Tree View**:
|
|
|
|
```
|
|
Sequential + File Strategy:
|
|
.claude/skills/{skill-name}/
|
|
├── phases/
|
|
│ ├── _orchestrator.md
|
|
│ ├── workflow.json
|
|
│ ├── 01-*.md
|
|
│ └── 02-*.md
|
|
├── .scratchpad-template/
|
|
│ └── context/ <- File strategy persistent storage
|
|
└── specs/
|
|
|
|
Autonomous + Memory Strategy:
|
|
.claude/skills/{skill-name}/
|
|
├── phases/
|
|
│ ├── orchestrator.md
|
|
│ ├── state-schema.md
|
|
│ └── actions/
|
|
│ └── *.md
|
|
└── specs/
|
|
```
|
|
|
|
### Step 3: Generate SKILL.md
|
|
|
|
```javascript
|
|
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: Architecture Diagram Generation Functions
|
|
|
|
```javascript
|
|
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 (State-driven decision-making) │
|
|
└───────────────┬─────────────────────────────────────────────────┘
|
|
│
|
|
┌───────────┼───────────┐
|
|
↓ ↓ ↓
|
|
${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. **Specification Compliance**: Strictly follow `_shared/SKILL-DESIGN-SPEC.md`",
|
|
"2. **Brief Return**: Agent returns path+summary, avoiding context overflow"
|
|
];
|
|
|
|
if (config.execution_mode === 'sequential') {
|
|
return [...common,
|
|
"3. **Phase Isolation**: Each phase is independently testable",
|
|
"4. **Chained Output**: Phase output becomes next phase input"
|
|
].join('\n');
|
|
} else {
|
|
return [...common,
|
|
"3. **State-driven**: Explicit state management, dynamic decision-making",
|
|
"4. **Action Independence**: Each action has no side-effect dependencies"
|
|
].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) | Orchestrator |`);
|
|
rows.push(`| [phases/state-schema.md](phases/state-schema.md) | State Definition |`);
|
|
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) | Domain Requirements |`);
|
|
rows.push(`| [specs/quality-standards.md](specs/quality-standards.md) | Quality Standards |`);
|
|
|
|
return `| Document | Purpose |\n|----------|---------||\n` + rows.join('\n');
|
|
}
|
|
```
|
|
|
|
|
|
|
|
## Next Phase
|
|
|
|
→ [Phase 3: Phase Generation](03-phase-generation.md)
|
|
|
|
**Data Flow to Phase 3**:
|
|
- Complete directory structure in .claude/skills/{skill-name}/
|
|
- SKILL.md entry file ready for phase/action generation
|
|
- skill-config.json for template population
|