Skip to main content

skill-deck-plan

Pitch deck planning with interactive template, content, and ordering selection

الانتقال إلى التثبيت

معلومات المصدر

المستودع
benbrastmckie/nvim
آخر نشاط في المصدر
١٠ أغسطس ٢٠٢٦ في ٠٦:٣٥
لغة SKILL.md المكتشفة
الإنجليزية
النجوم
٤٤٤
التفرعات
٤٥٩

خيارات التثبيت

يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.

مراجعة ملفات المصدر

اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.

عرض SKILL.md

SKILL.md
تعليمات المصدر · معاينة للقراءة فقط
name
skill-deck-plan
description
Pitch deck planning with interactive template, content, and ordering selection
allowed-tools
Agent, Bash, Edit, Read, Write, Glob, AskUserQuestion
# Deck Plan Skill Interactive pitch deck planning skill that gathers user preferences (pattern, theme, content, ordering) via AskUserQuestion pickers before delegating plan generation to `deck-planner-agent`. Handles preflight/postflight status management and all interactive selection. **IMPORTANT**: This skill implements the skill-internal postflight pattern. After the subagent returns, this skill handles all postflight operations (status update, artifact linking, git commit) before returning. ## Context Pointers Reference (do not load eagerly): - Path: `.claude/context/formats/subagent-return.md` - Purpose: Return validation - Load at: Subagent execution only - Path: `.context/deck/index.json` - Purpose: Library index for building AskUserQuestion options - Load at: Stage 4.1 (Library Initialization) ## Trigger Conditions This skill activates when: ### Direct Invocation - `/plan` command on a task with `language: founder` and `task_type: deck` - Extension routing lookup finds `routing.plan["founder:deck"]` ### Task-Type-Based Routing - Task type is "founder" AND task_type is "deck" - `/plan {N}` where task {N} has language="founder" and task_type="deck" ### When NOT to trigger Do not invoke for: - Non-deck founder tasks (use skill-founder-plan) - Tasks with other language types (general, meta, neovim, etc.) - Tasks already in [PLANNED] or [COMPLETED] status **Note**: The `--quick` flag is handled inside this skill (skips pattern and theme questions, uses defaults). It is NOT a reason to skip this skill. --- ## Execution ### Stage 1: Input Validation Validate inputs from delegation context: - `task_number` - Required, integer - `session_id` - Required, string ```bash # Validate task_number is present if [ -z "$task_number" ]; then return error "task_number is required" fi # Validate session_id is present if [ -z "$session_id" ]; then return error "session_id is required" fi ``` ### Stage 2 + Stage 3: Preflight Status Update and Postflight Marker Source `skill-base.sh` once, then follow `@.claude/context/patterns/skill-preflight-flow.md` in full for Stage 2 (preflight status update) and Stage 3 (marker creation): ```bash source .claude/scripts/skill-base.sh padded_num=$(printf "%03d" "$task_number") project_name=$(jq -r --argjson num "$task_number" \ '.active_projects[] | select(.project_number == $num) | .project_name' \ specs/state.json) task_dir="specs/${padded_num}_${project_name}" mkdir -p "$task_dir" skill_name="skill-deck-plan" operation="plan" ``` ### Stage 4: Context Preparation Extract task_type and research_path from state.json: ```bash # Extract task_type from state.json (null-safe) task_type=$(jq -r --argjson num "$task_number" \ '.active_projects[] | select(.project_number == $num) | .task_type // null' \ specs/state.json) # Find research report path research_path=$(jq -r --argjson num "$task_number" \ '.active_projects[] | select(.project_number == $num) | .artifacts[] | select(.type == "research") | .path' \ specs/state.json 2>/dev/null | head -1) ``` Prepare base delegation context (enhanced in Stage 4.4): ```json { "task_context": { "task_number": 234, "project_name": "{project_name}", "description": "{description}", "task_type": "founder", "task_type": "deck" }, "research_path": "specs/{NNN}_{SLUG}/reports/01_{short-slug}.md", "metadata_file_path": "specs/{NNN}_{SLUG}/.return-meta.json", "metadata": { "session_id": "sess_{timestamp}_{random}", "delegation_depth": 2, "delegation_path": ["orchestrator", "plan", "skill-deck-plan"] } } ``` ### Stage 4.1: Library Initialization If `.context/deck/index.json` does not exist, initialize the deck library from the extension seed: ```bash if [ ! -f .context/deck/index.json ]; then mkdir -p .context/deck cp -r .claude/extensions/founder/context/project/founder/deck/* .context/deck/ echo "Initialized deck library from extension seed" fi ``` This ensures the reusable deck library is available for building AskUserQuestion options. ### Stage 4.2: Load Research Report Read the research report at `research_path`. Extract: 1. **Slide Content Analysis**: For each slide, whether content is populated or MISSING 2. **Appendix Content**: Any content listed under "Additional Content for Appendix" 3. **Information Gaps**: Critical vs nice-to-have gaps 4. **Purpose**: Deck purpose (INVESTOR, UPDATE, INTERNAL, PARTNERSHIP) If no research report exists, return with status "failed" and message: "No research report found. Run /research {N} first." ### Stage 4.3: Interactive Questions Execute 4 sequential AskUserQuestion calls to gather user preferences. Each question uses the structured JSON format. **`--quick` flag handling**: If `--quick` flag is set in the command arguments, skip questions 1 and 2 (pattern and theme). Use defaults: `pattern = "yc-10-slide"`, `theme = "dark-blue"`. Still execute questions 3 and 4 (content and ordering). #### Question 1: Pattern Selection (single select) Query the library index for available patterns: ```bash jq -r '.entries[] | select(.category == "pattern") | "\(.id)|\(.name)|\(.description)"' .context/deck/index.json ``` Present via AskUserQuestion: ```json { "question": "Select a deck pattern for your pitch deck:", "header": "Deck Pattern", "multiSelect": false, "options": [ { "label": "YC 10-Slide Investor Pitch", "description": "Standard Y Combinator format (10 slides) [yc-10-slide]" }, { "label": "Lightning Talk", "description": "5-minute format (5 slides) [lightning-talk]" }, { "label": "Product Demo", "description": "Screenshots, code, demo (8-12 slides) [product-demo]" }, { "label": "Investor Update", "description": "Quarterly update (8 slides) [investor-update]" }, { "label": "Partnership Proposal", "description": "Business partnership (8 slides) [partnership-proposal]" } ] } ``` Build options dynamically from `index.json` entries where `category == "pattern"`. Store `selected_pattern` with the pattern id and slide sequence from the pattern JSON. #### Question 2: Theme Selection (single select) Query the library index for available themes: ```bash jq -r '.entries[] | select(.category == "theme") | "\(.id)|\(.name)|\(.description)|\(.tags.color_schema)"' .context/deck/index.json ``` Present via AskUserQuestion: ```json { "question": "Select a visual theme:", "header": "Visual Theme", "multiSelect": false, "options": [ { "label": "Dark Blue (AI Startup)", "description": "Deep navy + blue accents [dark] [dark-blue]" }, { "label": "Minimal Light", "description": "Clean white + blue accent [light] [minimal-light]" }, { "label": "Premium Dark (Gold)", "description": "Near-black + gold accents [dark] [premium-dark]" }, { "label": "Growth Green", "description": "Mint/white + green accents [light] [growth-green]" }, { "label": "Professional Blue", "description": "White + navy/blue [light] [professional-blue]" } ] } ``` Build options dynamically from `index.json` entries where `category == "theme"`. Store `selected_theme` with theme id and config path. #### Question 3: Content Selection (multi select per slide position) For each slide position in the selected pattern: 1. Query content library for matching `slide_type` entries 2. Check research report for available content 3. Present existing library content + option to create NEW Present via AskUserQuestion: ```json { "question": "Assign content for each slide position. Select library content or mark as NEW.\n\nSlide 1 (cover): cover-standard, cover-hero, NEW\nSlide 2 (problem): problem-statement, problem-story, NEW\n...", "header": "Slide Content Assignment", "multiSelect": true, "options": [ { "label": "Slide 1 (cover): cover-standard", "description": "Standard title + tagline + round" }, { "label": "Slide 1 (cover): NEW", "description": "Create new cover content from research" }, { "label": "Slide 2 (problem): problem-statement", "description": "Bold single-sentence + 3 evidence points" }, { "label": "Slide 2 (problem): NEW", "description": "Create new problem content from research" } ] } ``` Build options dynamically per slide position from index.json content entries + NEW option. Also ask which slides should be MAIN vs APPENDIX. If the pattern defines default main/appendix split, present that as the default selection. **Validation**: If fewer than 3 main slides selected, present a confirmation question: ```json { "question": "You selected fewer than 3 main slides. A deck needs at least 3 slides to be useful. Would you like to restart slide selection?", "header": "Slide Count Warning", "multiSelect": false, "options": [ {"label": "Yes, let me select slides again", "description": "Return to content selection"}, {"label": "No, continue with current selection", "description": "Proceed with fewer slides"} ] } ``` If "Yes": Repeat Question 3. Store: - `content_manifest`: Mapping of slide positions to content IDs or `NEW` markers - `main_slides`: Slide positions for the main deck - `appendix_slides`: Slide positions for appendix #### Question 4: Slide Ordering (single select) Present ordering strategies from the selected pattern: ```json { "question": "Select slide ordering strategy:", "header": "Slide Ordering", "multiSelect": false, "options": [ { "label": "YC Standard", "description": "Title, Problem, Solution, Traction, Why Us/Now, Business Model, Market, Team, Ask, Closing" }, { "label": "Story-First", "description": "Title, Problem, Solution, Why Us/Now, Traction, Business Model, Market, Team, Ask, Closing" }, { "label": "Traction-Led", "description": "Title, Traction, Problem, Solution, Why Us/Now, Market, Business Model, Team, Ask, Closing" } ] } ``` Build options from selected pattern's `ordering_strategies`. Filter to only include slides in `main_slides`. Store `ordering_strategy` and final `slide_order`. **User Abandonment**: If the user cancels any AskUserQuestion interaction (empty response or explicit cancel), return with partial status: ``` Deck planning interrupted by user. No plan created. Status remains [PLANNING]. Run /plan {N} again to restart. ``` ### Stage 4.4: Prepare Enhanced Delegation Context Bundle all user selections into the delegation context for the agent: ```json { "task_context": { "task_number": 234, "project_name": "{project_name}", "description": "{description}", "task_type": "founder", "task_type": "deck" }, "research_path": "specs/{NNN}_{SLUG}/reports/01_{short-slug}.md", "metadata_file_path": "specs/{NNN}_{SLUG}/.return-meta.json", "metadata": { "session_id": "sess_{timestamp}_{random}", "delegation_depth": 2, "delegation_path": ["orchestrator", "plan", "skill-deck-plan"] }, "user_selections": { "pattern": {"id": "yc-10-slide", "name": "YC 10-Slide Investor Pitch"},
عرض على GitHub
ملف SKILL.md هذا كبير جدا، لذلك يعرض SkillsMP القسم الاول فقط هنا. عرض على GitHub