@dedesfr/prompter 0.3.6 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/.github/prompts/skill-creator.prompt.md +173 -0
  2. package/dist/cli/index.js +9 -1
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/commands/skill-creator.d.ts +11 -0
  5. package/dist/commands/skill-creator.d.ts.map +1 -0
  6. package/dist/commands/skill-creator.js +101 -0
  7. package/dist/commands/skill-creator.js.map +1 -0
  8. package/dist/core/configurators/slash/antigravity.d.ts.map +1 -1
  9. package/dist/core/configurators/slash/antigravity.js +4 -2
  10. package/dist/core/configurators/slash/antigravity.js.map +1 -1
  11. package/dist/core/configurators/slash/base.js +1 -1
  12. package/dist/core/configurators/slash/base.js.map +1 -1
  13. package/dist/core/configurators/slash/claude.d.ts.map +1 -1
  14. package/dist/core/configurators/slash/claude.js +4 -2
  15. package/dist/core/configurators/slash/claude.js.map +1 -1
  16. package/dist/core/configurators/slash/codex.d.ts.map +1 -1
  17. package/dist/core/configurators/slash/codex.js +4 -2
  18. package/dist/core/configurators/slash/codex.js.map +1 -1
  19. package/dist/core/configurators/slash/github-copilot.d.ts.map +1 -1
  20. package/dist/core/configurators/slash/github-copilot.js +4 -2
  21. package/dist/core/configurators/slash/github-copilot.js.map +1 -1
  22. package/dist/core/configurators/slash/kilocode.d.ts.map +1 -1
  23. package/dist/core/configurators/slash/kilocode.js +4 -2
  24. package/dist/core/configurators/slash/kilocode.js.map +1 -1
  25. package/dist/core/configurators/slash/opencode.d.ts.map +1 -1
  26. package/dist/core/configurators/slash/opencode.js +4 -2
  27. package/dist/core/configurators/slash/opencode.js.map +1 -1
  28. package/dist/core/templates/slash-command-templates.d.ts +1 -1
  29. package/dist/core/templates/slash-command-templates.d.ts.map +1 -1
  30. package/dist/core/templates/slash-command-templates.js +170 -1
  31. package/dist/core/templates/slash-command-templates.js.map +1 -1
  32. package/package.json +2 -2
  33. package/prompt/skill-creator.md +350 -0
  34. package/src/cli/index.ts +10 -1
  35. package/src/commands/skill-creator.ts +123 -0
  36. package/src/core/configurators/slash/antigravity.ts +4 -2
  37. package/src/core/configurators/slash/base.ts +1 -1
  38. package/src/core/configurators/slash/claude.ts +4 -2
  39. package/src/core/configurators/slash/codex.ts +4 -2
  40. package/src/core/configurators/slash/github-copilot.ts +4 -2
  41. package/src/core/configurators/slash/kilocode.ts +4 -2
  42. package/src/core/configurators/slash/opencode.ts +4 -2
  43. package/src/core/templates/slash-command-templates.ts +172 -2
@@ -0,0 +1,123 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import chalk from 'chalk';
4
+ import { PrompterConfig, PROMPTER_DIR, PROMPTER_MARKERS } from '../core/config.js';
5
+ import { registry } from '../core/configurators/slash/index.js';
6
+
7
+ interface SkillCreatorOptions {
8
+ tools?: string[];
9
+ noInteractive?: boolean;
10
+ }
11
+
12
+ export class SkillCreatorCommand {
13
+ async execute(options: SkillCreatorOptions = {}): Promise<void> {
14
+ const projectPath = process.cwd();
15
+
16
+ // Check if initialized
17
+ if (!await PrompterConfig.prompterDirExists(projectPath)) {
18
+ console.log(chalk.red('\nāŒ Prompter is not initialized in this project.\n'));
19
+ console.log(chalk.gray(' Run `prompter init` first.\n'));
20
+ process.exitCode = 1;
21
+ return;
22
+ }
23
+
24
+ console.log(chalk.blue('\nšŸ› ļø Generating skill-creator workflow files...\n'));
25
+
26
+ // Ensure skills directory exists
27
+ const skillsPath = path.join(projectPath, PROMPTER_DIR, 'skills');
28
+ await fs.mkdir(skillsPath, { recursive: true });
29
+ console.log(chalk.green('āœ“') + ` Ensured ${chalk.cyan(PROMPTER_DIR + '/skills/')} directory exists`);
30
+
31
+ // Detect currently configured tools
32
+ const configuredTools = await this.detectConfiguredTools(projectPath);
33
+
34
+ if (configuredTools.length === 0) {
35
+ console.log(chalk.yellow('\nāš ļø No tools configured yet.\n'));
36
+ console.log(chalk.gray(' Run `prompter init` to configure AI tools first.\n'));
37
+ process.exitCode = 1;
38
+ return;
39
+ }
40
+
41
+ // Generate skill-creator workflow files for all configured tools
42
+ let successCount = 0;
43
+ let failCount = 0;
44
+
45
+ for (const toolId of configuredTools) {
46
+ const configurator = registry.get(toolId);
47
+ if (configurator) {
48
+ try {
49
+ // Generate only the skill-creator workflow file
50
+ const body = configurator['getBody']('skill-creator');
51
+ const relativePath = configurator['getRelativePath']('skill-creator');
52
+ const filePath = path.join(projectPath, relativePath);
53
+
54
+ // Ensure directory exists
55
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
56
+
57
+ // Check if file exists
58
+ const fileExists = await this.fileExists(filePath);
59
+
60
+ if (fileExists) {
61
+ console.log(chalk.yellow('āš ļø') + ` ${chalk.cyan(relativePath)} already exists, skipping`);
62
+ continue;
63
+ }
64
+
65
+ // Get frontmatter if needed
66
+ const frontmatter = configurator['getFrontmatter']('skill-creator');
67
+ const sections: string[] = [];
68
+ if (frontmatter) {
69
+ sections.push(frontmatter.trim());
70
+ }
71
+ sections.push(`${PROMPTER_MARKERS.start}\n${body}\n${PROMPTER_MARKERS.end}`);
72
+ const content = sections.join('\n') + '\n';
73
+
74
+ await fs.writeFile(filePath, content, 'utf-8');
75
+ console.log(chalk.green('āœ“') + ` Created ${chalk.cyan(relativePath)}`);
76
+ successCount++;
77
+ } catch (error) {
78
+ console.log(chalk.red('āœ—') + ` Failed to create files for ${toolId}: ${error}`);
79
+ failCount++;
80
+ }
81
+ }
82
+ }
83
+
84
+ // Success message
85
+ console.log(chalk.green(`\nāœ… Skill creator workflow files created successfully!\n`));
86
+ console.log(chalk.blue('Next steps:'));
87
+ console.log(chalk.gray(' 1. Use /skill-creator in your AI tool to create skills'));
88
+ console.log(chalk.gray(' 2. Skills will be saved to prompter/skills/<skill-name>/\n'));
89
+ }
90
+
91
+ private async fileExists(filePath: string): Promise<boolean> {
92
+ try {
93
+ await fs.access(filePath);
94
+ return true;
95
+ } catch {
96
+ return false;
97
+ }
98
+ }
99
+
100
+ private async detectConfiguredTools(projectPath: string): Promise<string[]> {
101
+ const configuredTools: string[] = [];
102
+ const allConfigurators = registry.getAll();
103
+
104
+ for (const configurator of allConfigurators) {
105
+ const targets = configurator.getTargets();
106
+ let hasFiles = false;
107
+
108
+ for (const target of targets) {
109
+ const filePath = path.join(projectPath, target.path);
110
+ if (await this.fileExists(filePath)) {
111
+ hasFiles = true;
112
+ break;
113
+ }
114
+ }
115
+
116
+ if (hasFiles) {
117
+ configuredTools.push(configurator.toolId);
118
+ }
119
+ }
120
+
121
+ return configuredTools;
122
+ }
123
+ }
@@ -6,7 +6,8 @@ const FILE_PATHS: Record<SlashCommandId, string> = {
6
6
  'prd-generator': '.agent/workflows/prd-generator.md',
7
7
  'epic-single': '.agent/workflows/epic-single.md',
8
8
  'story-single': '.agent/workflows/story-single.md',
9
- 'qa-test-scenario': '.agent/workflows/qa-test-scenario.md'
9
+ 'qa-test-scenario': '.agent/workflows/qa-test-scenario.md',
10
+ 'skill-creator': '.agent/workflows/skill-creator.md'
10
11
  };
11
12
 
12
13
  const DESCRIPTIONS: Record<SlashCommandId, string> = {
@@ -14,7 +15,8 @@ const DESCRIPTIONS: Record<SlashCommandId, string> = {
14
15
  'prd-generator': 'Generate a comprehensive Product Requirements Document (PRD)',
15
16
  'epic-single': 'Generate a single well-defined Jira Epic',
16
17
  'story-single': 'Generate a single Jira User Story from requirements',
17
- 'qa-test-scenario': 'Generate focused QA test scenarios from PRD'
18
+ 'qa-test-scenario': 'Generate focused QA test scenarios from PRD',
19
+ 'skill-creator': 'Create a modular skill package that extends AI agent capabilities'
18
20
  };
19
21
 
20
22
  export class AntigravityConfigurator extends SlashCommandConfigurator {
@@ -9,7 +9,7 @@ export interface SlashCommandTarget {
9
9
  kind: 'slash';
10
10
  }
11
11
 
12
- const ALL_COMMANDS: SlashCommandId[] = ['enhance', 'prd-generator', 'epic-single', 'story-single', 'qa-test-scenario'];
12
+ const ALL_COMMANDS: SlashCommandId[] = ['enhance', 'prd-generator', 'epic-single', 'story-single', 'qa-test-scenario', 'skill-creator'];
13
13
 
14
14
  export abstract class SlashCommandConfigurator {
15
15
  abstract readonly toolId: string;
@@ -6,7 +6,8 @@ const FILE_PATHS: Record<SlashCommandId, string> = {
6
6
  'prd-generator': '.claude/commands/prompter/prd-generator.md',
7
7
  'epic-single': '.claude/commands/prompter/epic-single.md',
8
8
  'story-single': '.claude/commands/prompter/story-single.md',
9
- 'qa-test-scenario': '.claude/commands/prompter/qa-test-scenario.md'
9
+ 'qa-test-scenario': '.claude/commands/prompter/qa-test-scenario.md',
10
+ 'skill-creator': '.claude/commands/prompter/skill-creator.md'
10
11
  };
11
12
 
12
13
  const DESCRIPTIONS: Record<SlashCommandId, string> = {
@@ -14,7 +15,8 @@ const DESCRIPTIONS: Record<SlashCommandId, string> = {
14
15
  'prd-generator': 'Generate a comprehensive Product Requirements Document (PRD)',
15
16
  'epic-single': 'Generate a single well-defined Jira Epic',
16
17
  'story-single': 'Generate a single Jira User Story from requirements',
17
- 'qa-test-scenario': 'Generate focused QA test scenarios from PRD'
18
+ 'qa-test-scenario': 'Generate focused QA test scenarios from PRD',
19
+ 'skill-creator': 'Create a modular skill package that extends AI agent capabilities'
18
20
  };
19
21
 
20
22
  export class ClaudeConfigurator extends SlashCommandConfigurator {
@@ -6,7 +6,8 @@ const FILE_PATHS: Record<SlashCommandId, string> = {
6
6
  'prd-generator': '.codex/prompts/prd-generator.md',
7
7
  'epic-single': '.codex/prompts/epic-single.md',
8
8
  'story-single': '.codex/prompts/story-single.md',
9
- 'qa-test-scenario': '.codex/prompts/qa-test-scenario.md'
9
+ 'qa-test-scenario': '.codex/prompts/qa-test-scenario.md',
10
+ 'skill-creator': '.codex/prompts/skill-creator.md'
10
11
  };
11
12
 
12
13
  const DESCRIPTIONS: Record<SlashCommandId, string> = {
@@ -14,7 +15,8 @@ const DESCRIPTIONS: Record<SlashCommandId, string> = {
14
15
  'prd-generator': 'Generate a comprehensive Product Requirements Document (PRD)',
15
16
  'epic-single': 'Generate a single well-defined Jira Epic',
16
17
  'story-single': 'Generate a single Jira User Story from requirements',
17
- 'qa-test-scenario': 'Generate focused QA test scenarios from PRD'
18
+ 'qa-test-scenario': 'Generate focused QA test scenarios from PRD',
19
+ 'skill-creator': 'Create a modular skill package that extends AI agent capabilities'
18
20
  };
19
21
 
20
22
  export class CodexConfigurator extends SlashCommandConfigurator {
@@ -9,7 +9,8 @@ const FILE_PATHS: Record<SlashCommandId, string> = {
9
9
  'prd-generator': '.github/prompts/prd-generator.prompt.md',
10
10
  'epic-single': '.github/prompts/epic-single.prompt.md',
11
11
  'story-single': '.github/prompts/story-single.prompt.md',
12
- 'qa-test-scenario': '.github/prompts/qa-test-scenario.prompt.md'
12
+ 'qa-test-scenario': '.github/prompts/qa-test-scenario.prompt.md',
13
+ 'skill-creator': '.github/prompts/skill-creator.prompt.md'
13
14
  };
14
15
 
15
16
  const DESCRIPTIONS: Record<SlashCommandId, string> = {
@@ -17,7 +18,8 @@ const DESCRIPTIONS: Record<SlashCommandId, string> = {
17
18
  'prd-generator': 'Generate a comprehensive Product Requirements Document (PRD)',
18
19
  'epic-single': 'Generate a single well-defined Jira Epic',
19
20
  'story-single': 'Generate a single Jira User Story from requirements',
20
- 'qa-test-scenario': 'Generate focused QA test scenarios from PRD'
21
+ 'qa-test-scenario': 'Generate focused QA test scenarios from PRD',
22
+ 'skill-creator': 'Create a modular skill package that extends AI agent capabilities'
21
23
  };
22
24
 
23
25
  export class GithubCopilotConfigurator extends SlashCommandConfigurator {
@@ -6,7 +6,8 @@ const FILE_PATHS: Record<SlashCommandId, string> = {
6
6
  'prd-generator': '.kilocode/workflows/prd-generator.md',
7
7
  'epic-single': '.kilocode/workflows/epic-single.md',
8
8
  'story-single': '.kilocode/workflows/story-single.md',
9
- 'qa-test-scenario': '.kilocode/workflows/qa-test-scenario.md'
9
+ 'qa-test-scenario': '.kilocode/workflows/qa-test-scenario.md',
10
+ 'skill-creator': '.kilocode/workflows/skill-creator.md'
10
11
  };
11
12
 
12
13
  const DESCRIPTIONS: Record<SlashCommandId, string> = {
@@ -14,7 +15,8 @@ const DESCRIPTIONS: Record<SlashCommandId, string> = {
14
15
  'prd-generator': 'Generate a comprehensive Product Requirements Document (PRD)',
15
16
  'epic-single': 'Generate a single well-defined Jira Epic',
16
17
  'story-single': 'Generate a single Jira User Story from requirements',
17
- 'qa-test-scenario': 'Generate focused QA test scenarios from PRD'
18
+ 'qa-test-scenario': 'Generate focused QA test scenarios from PRD',
19
+ 'skill-creator': 'Create a modular skill package that extends AI agent capabilities'
18
20
  };
19
21
 
20
22
  export class KiloCodeConfigurator extends SlashCommandConfigurator {
@@ -6,7 +6,8 @@ const FILE_PATHS: Record<SlashCommandId, string> = {
6
6
  'prd-generator': '.opencode/prompts/prd-generator.md',
7
7
  'epic-single': '.opencode/prompts/epic-single.md',
8
8
  'story-single': '.opencode/prompts/story-single.md',
9
- 'qa-test-scenario': '.opencode/prompts/qa-test-scenario.md'
9
+ 'qa-test-scenario': '.opencode/prompts/qa-test-scenario.md',
10
+ 'skill-creator': '.opencode/prompts/skill-creator.md'
10
11
  };
11
12
 
12
13
  const DESCRIPTIONS: Record<SlashCommandId, string> = {
@@ -14,7 +15,8 @@ const DESCRIPTIONS: Record<SlashCommandId, string> = {
14
15
  'prd-generator': 'Generate a comprehensive Product Requirements Document (PRD)',
15
16
  'epic-single': 'Generate a single well-defined Jira Epic',
16
17
  'story-single': 'Generate a single Jira User Story from requirements',
17
- 'qa-test-scenario': 'Generate focused QA test scenarios from PRD'
18
+ 'qa-test-scenario': 'Generate focused QA test scenarios from PRD',
19
+ 'skill-creator': 'Create a modular skill package that extends AI agent capabilities'
18
20
  };
19
21
 
20
22
  export class OpenCodeConfigurator extends SlashCommandConfigurator {
@@ -1,4 +1,4 @@
1
- export type SlashCommandId = 'enhance' | 'prd-generator' | 'epic-single' | 'story-single' | 'qa-test-scenario';
1
+ export type SlashCommandId = 'enhance' | 'prd-generator' | 'epic-single' | 'story-single' | 'qa-test-scenario' | 'skill-creator';
2
2
 
3
3
  const enhanceWorkflow = `## MUST FOLLOW
4
4
  - Response Language: {User Request Language}
@@ -536,12 +536,182 @@ Generate a **concise** testing document (targeting 50-150 lines for simple featu
536
536
  ## REFERENCE
537
537
  - Read \`prompter/project.md\` for project context if needed`;
538
538
 
539
+ const skillCreatorWorkflow = `# Role & Expertise
540
+ You are an expert Skill Creator specializing in designing modular, self-contained packages that extend AI agent capabilities. You have deep expertise in procedural knowledge extraction, workflow design, and context-efficient documentation.
541
+
542
+ ---
543
+
544
+ # Primary Objective
545
+ Create a complete, professional Skill package that transforms a general-purpose AI agent into a specialized agent equipped with domain-specific knowledge, workflows, and tools. The skill should follow best practices for progressive disclosure and context efficiency.
546
+
547
+ # Context
548
+ Skills are "onboarding guides" for specific domains or tasks. They provide:
549
+ 1. Specialized workflows - Multi-step procedures for specific domains
550
+ 2. Tool integrations - Instructions for working with specific file formats or APIs
551
+ 3. Domain expertise - Company-specific knowledge, schemas, business logic
552
+ 4. Bundled resources - Scripts, references, and assets for complex and repetitive tasks
553
+
554
+ # Core Principles to Follow
555
+
556
+ ## Concise is Key
557
+ - Context window is a public good shared with system prompts, history, and other skills
558
+ - Only add context the AI doesn't already have
559
+ - Challenge each piece: "Does this justify its token cost?"
560
+ - Prefer concise examples over verbose explanations
561
+
562
+ ## Set Appropriate Degrees of Freedom
563
+ - **High freedom (text-based)**: Multiple valid approaches, context-dependent decisions
564
+ - **Medium freedom (pseudocode/scripts with params)**: Preferred pattern exists, some variation ok
565
+ - **Low freedom (specific scripts)**: Fragile operations, consistency critical, specific sequence required
566
+
567
+ ## Progressive Disclosure
568
+ 1. **Metadata (name + description)** - Always in context (~100 words)
569
+ 2. **SKILL.md body** - When skill triggers (<5k words, <500 lines)
570
+ 3. **Bundled resources** - As needed (scripts, references, assets)
571
+
572
+ # Process
573
+
574
+ ## Step 1: Gather Requirements
575
+ Ask clarifying questions to understand:
576
+ - What functionality should the skill support?
577
+ - Concrete examples of how the skill would be used
578
+ - What would a user say that should trigger this skill?
579
+ - Any existing resources, scripts, or documentation to include
580
+
581
+ ## Step 2: Plan Skill Contents
582
+ Analyze each example to identify:
583
+ - **Scripts** (\`scripts/\`): Reusable code for repetitive or fragile tasks
584
+ - **References** (\`references/\`): Documentation loaded as needed
585
+ - **Assets** (\`assets/\`): Files used in output (templates, images, etc.)
586
+
587
+ ## Step 3: Create Skill Structure
588
+ Create the skill directory in \`prompter/skills/<skill-name>/\`:
589
+
590
+ \`\`\`
591
+ prompter/skills/<skill-name>/
592
+ ā”œā”€ā”€ SKILL.md (required)
593
+ └── [optional bundled resources]
594
+ ā”œā”€ā”€ scripts/
595
+ ā”œā”€ā”€ references/
596
+ └── assets/
597
+ \`\`\`
598
+
599
+ ## Step 4: Write SKILL.md
600
+
601
+ ### Frontmatter (YAML)
602
+ \`\`\`yaml
603
+ ---
604
+ name: <skill-name>
605
+ description: <comprehensive description of what the skill does AND when to use it>
606
+ ---
607
+ \`\`\`
608
+
609
+ ### Body (Markdown)
610
+ - Instructions for using the skill and its bundled resources
611
+ - Keep under 500 lines
612
+ - Use progressive disclosure patterns for large content
613
+ - Reference bundled files with clear "when to read" guidance
614
+
615
+ ### Writing Guidelines
616
+ - Always use imperative/infinitive form
617
+ - Include only information beneficial and non-obvious to Claude
618
+ - Focus on procedural knowledge, domain-specific details, reusable assets
619
+
620
+ ## Step 5: Create Bundled Resources (if needed)
621
+
622
+ ### Scripts
623
+ - Executable code for deterministic reliability
624
+ - Test scripts before including
625
+ - Example: \`scripts/rotate_pdf.py\` for PDF rotation
626
+
627
+ ### References
628
+ - Documentation loaded into context as needed
629
+ - For files >10k words, include grep search patterns in SKILL.md
630
+ - Examples: schemas, API docs, policies, detailed guides
631
+
632
+ ### Assets
633
+ - Files NOT loaded into context, used in output
634
+ - Examples: templates, images, fonts, boilerplate
635
+
636
+ ## Step 6: Validate Skill
637
+
638
+ Verify:
639
+ - [ ] SKILL.md has valid YAML frontmatter with name and description
640
+ - [ ] Description clearly states what skill does AND when to use it
641
+ - [ ] Body is under 500 lines
642
+ - [ ] No extraneous files (README, CHANGELOG, etc.)
643
+ - [ ] All bundled resources are referenced in SKILL.md
644
+ - [ ] Scripts are tested and working
645
+
646
+ # Output Requirements
647
+
648
+ **Structure:**
649
+ \`\`\`
650
+ prompter/skills/<skill-name>/
651
+ ā”œā”€ā”€ SKILL.md
652
+ └── [optional: scripts/, references/, assets/]
653
+ \`\`\`
654
+
655
+ **SKILL.md Format:**
656
+ \`\`\`markdown
657
+ ---
658
+ name: skill-name
659
+ description: Comprehensive description including what it does and when to use it
660
+ ---
661
+
662
+ # Skill Title
663
+
664
+ ## Quick Start
665
+ [Essential usage instructions]
666
+
667
+ ## Workflows
668
+ [Multi-step procedures]
669
+
670
+ ## Resources
671
+ [References to bundled files with usage guidance]
672
+ \`\`\`
673
+
674
+ # What NOT to Include
675
+ - README.md, INSTALLATION_GUIDE.md, QUICK_REFERENCE.md, CHANGELOG.md
676
+ - Auxiliary context about creation process
677
+ - Setup and testing procedures
678
+ - User-facing documentation separate from SKILL.md
679
+
680
+ # Progressive Disclosure Patterns
681
+
682
+ **Pattern 1: High-level guide with references**
683
+ \`\`\`markdown
684
+ ## Advanced features
685
+ - **Forms**: See [FORMS.md](references/forms.md) for complete guide
686
+ - **API**: See [REFERENCE.md](references/reference.md) for all methods
687
+ \`\`\`
688
+
689
+ **Pattern 2: Domain-specific organization**
690
+ Organize by domain to avoid loading irrelevant context.
691
+
692
+ **Pattern 3: Conditional details**
693
+ Show basic content, link to advanced content only when needed.
694
+
695
+ ## WORKFLOW STEPS
696
+ 1. Read the user's input and requirements
697
+ 2. Ask clarifying questions if needed
698
+ 3. Generate a URL-friendly skill name (lowercase, hyphen-separated)
699
+ 4. Create the directory \`prompter/skills/<skill-name>/\`
700
+ 5. Generate SKILL.md with proper frontmatter and body
701
+ 6. Create any needed bundled resources (scripts, references, assets)
702
+ 7. Report the created skill structure and next steps
703
+
704
+ ## REFERENCE
705
+ - Skills are saved to \`prompter/skills/<skill-name>/\`
706
+ - Read \`prompter/project.md\` for project context if needed`;
707
+
539
708
  export const slashCommandBodies: Record<SlashCommandId, string> = {
540
709
  enhance: enhanceWorkflow,
541
710
  'prd-generator': prdGeneratorWorkflow,
542
711
  'epic-single': epicSingleWorkflow,
543
712
  'story-single': storySingleWorkflow,
544
- 'qa-test-scenario': qaTestScenarioWorkflow
713
+ 'qa-test-scenario': qaTestScenarioWorkflow,
714
+ 'skill-creator': skillCreatorWorkflow
545
715
  };
546
716
 
547
717
  export function getSlashCommandBody(id: SlashCommandId): string {