This skill should be used when the user asks to "generate annual schedule", "update annual schedule", "create year schedule", "rebuild schedule", "refresh schedule from spreadsheet", "create full-year view", "build annual camp plan", "consolidate all camp days", "combine summer and PA days", or needs to produce a consolidated annual schedule covering summer, PA days, winter break, and March break from spreadsheet data and school calendar. Generates both markdown and Excel output.
Resources
1Install
npx skillscat add reggiechan74/cc-plugins/generate-annual-schedule Install via the SkillsCat registry.
Generate Annual Schedule
Overview
Locate research directory: Read .claude/kids-camp-planner.local.md to get the research_dir path (default: camp-research). All user data paths below are relative to this directory. The family profile is at <research_dir>/family-profile.md.
Generate a consolidated annual camp schedule that combines all school-break periods into a single view. Reads summer assignments from the spreadsheet's Daily Schedule tab, looks up non-summer dates from the school calendar, applies provider assignments for PA days and breaks, and produces both a markdown schedule and an updated spreadsheet with an "Annual Schedule" tab.
When to Use
- After the summer schedule is built (Daily Schedule tab populated)
- When PA day, winter break, or March break plans are finalized
- To refresh the annual view after any schedule changes
- To produce a full-year cost summary
Workflow
Step 1: Gather Inputs
Read the family profile from <research_dir>/family-profile.md for:
- Children's names
- School board
Locate the required files:
- Spreadsheet: The budget xlsx (e.g.,
examples/sample-budget.xlsx) with Provider Comparison and Daily Schedule tabs - School calendar: The school board's calendar file in
${CLAUDE_PLUGIN_ROOT}/skills/camp-planning/references/school-calendars/
Step 2: Confirm Non-Summer Assignments
The summer schedule comes from the spreadsheet. For non-summer periods, confirm or accept defaults:
| Period | Default Provider | Override? |
|---|---|---|
| PA Days | City of Toronto | Ask user if different |
| Winter Break | YMCA Cedar Glen | Ask user if different |
| March Break | YMCA Cedar Glen | Ask user if different |
| Fall Break | Same as --break-provider | Ask user if different |
Ask the user: "For PA days I'll use City of Toronto ($62/day) and for winter/March/fall breaks I'll use YMCA Cedar Glen ($87/day). Want to change any of these?"
If children need different providers on specific days (e.g., Emma does Science Camp for a PA day while Liam does YMCA), create an overrides JSON file. Every day can have a different provider per child — see the --overrides argument below.
Step 3: Run the Generator Script
python3 ${CLAUDE_PLUGIN_ROOT}/skills/generate-annual-schedule/scripts/generate_annual_schedule.py \
--xlsx examples/sample-budget.xlsx \
--calendar ${CLAUDE_PLUGIN_ROOT}/skills/camp-planning/references/school-calendars/public-boards/tcdsb.md \
--children "Emma,Liam" \
--pa-day-provider "City of Toronto" \
--break-provider "YMCA Cedar Glen" \
--output-md <research_dir>/annual-schedule-2025-2026.md \
--update-xlsxFor per-child, per-day provider assignments, add an overrides file:
python3 ${CLAUDE_PLUGIN_ROOT}/skills/generate-annual-schedule/scripts/generate_annual_schedule.py \
--xlsx examples/sample-budget.xlsx \
--calendar ${CLAUDE_PLUGIN_ROOT}/skills/camp-planning/references/school-calendars/public-boards/tcdsb.md \
--children "Emma,Liam" \
--pa-day-provider "City of Toronto" \
--break-provider "YMCA Cedar Glen" \
--overrides <research_dir>/schedule-overrides.json \
--output-md <research_dir>/annual-schedule-2025-2026.md \
--update-xlsxArguments:
--xlsx: Path to the budget spreadsheet (reads Provider Comparison + Daily Schedule tabs)--calendar: Path to the school calendar markdown file--children: Comma-separated children's names (must match spreadsheet column headers)--pa-day-provider: Default provider for PA day coverage (must exist in Provider Comparison tab)--break-provider: Default provider for winter break and March break (must exist in Provider Comparison tab)--fall-break-provider: Default provider for fall break coverage (defaults to same as--break-provider; must exist in Provider Comparison tab)--overrides: Optional JSON file with per-child, per-date provider overrides (see below)--output-md: Path for the generated markdown file--update-xlsx: Flag to add/replace "Annual Schedule" tab in the spreadsheet
Overrides JSON format:
The overrides file lets you assign different providers to each child on any date. Children not listed for a date fall back to the period default (--pa-day-provider or --break-provider). Summer dates can also be overridden (replacing the spreadsheet assignment for that child).
{
"2025-09-26": {"Emma": "Science Camp Toronto", "Liam": "YMCA Cedar Glen"},
"2025-10-10": {"Liam": "YMCA Cedar Glen"},
"2025-12-22": {"Emma": "City of Toronto"},
"2026-03-16": {"Emma": "Science Camp Toronto", "Liam": "City of Toronto"}
}All provider names in the overrides file must exist in the Provider Comparison tab.
Multi-school families: If children attend different schools, pass per-child calendars:
python3 ${CLAUDE_PLUGIN_ROOT}/skills/generate-annual-schedule/scripts/generate_annual_schedule.py \
--xlsx examples/sample-budget.xlsx \
--calendar "Emma:${CLAUDE_PLUGIN_ROOT}/.../tdsb.md" \
--calendar "Liam:${CLAUDE_PLUGIN_ROOT}/.../gist.md" \
--children "Emma,Liam" \
--pa-day-provider "City of Toronto" \
--break-provider "YMCA Cedar Glen" \
--output-md <research_dir>/annual-schedule-2025-2026.md \
--update-xlsxOn days where only some children are off school, the others show "In school" with $0 cost.
Step 4: Review Output
The script produces:
Markdown file with:
- Period-by-period sections (Summer, each PA Day, School Holidays, Fall Break, Winter Break, March Break)
- Day-by-day tables with per-child camp assignments and costs
- Period subtotals
- Annual summary table with total days and costs
Updated spreadsheet with:
- New "Annual Schedule" tab covering all ~64 days
- Dynamic column layout matching Daily Schedule: 3 prefix + (N x 6 child block) + 1 daily total (supports 1-4 children)
- VLOOKUP formulas referencing Provider Comparison tab for costs
- SUM formulas for totals
- Existing 4 tabs preserved untouched
Step 5: Present Summary
Show the user the annual summary:
Annual Schedule Generated:
- Summer 2025: 40 days
- PA Days: 7 days
- School Holidays: 5 days
- Winter Break: 7 days
- March Break: 5 days
- Total: 64 days
Files updated:
- <research_dir>/annual-schedule-2025-2026.md
- examples/sample-budget.xlsx (Annual Schedule tab added)What the Script Reads
From Provider Comparison tab (cols A-M, rows 4+):
- Provider names and daily rates (camp fee, before care, after care, lunch, total)
- Supports up to 3 rate sections: Summer, PA Day, and Break (Winter/March/Fall)
- PA Day and Break columns are optional; when empty, summer rates are used as fallback
From Daily Schedule tab (dynamic columns, rows 4-43):
- Date, week number, and camp name per child (up to 4 children)
- Column layout: 3 prefix cols (Date, Day, Week#) + 6 cols per child + 1 Daily Total
- For 2 children: cols A-P (16 cols); for 3: cols A-V (22 cols); for 4: cols A-AB (28 cols)
- These are the summer assignments (40 rows)
From school calendar markdown:
- PA day dates and purposes (from
### PA Days - Elementarytable) - School holidays — single-day holidays like Thanksgiving, Family Day, Good Friday, Easter Monday, Victoria Day (from
### Holidays & Breaks) - Fall break dates, if applicable (from
Fall Breakrow in### Holidays & Breaks) - Winter break dates (from
Christmas Breakrow in### Holidays & Breaks) - March break dates (from
Mid-Winter Break (March Break)row)
Output Format
See ${CLAUDE_PLUGIN_ROOT}/examples/sample-annual-schedule.md for the complete output format.
Additional Resources
Scripts
scripts/generate_annual_schedule.py- Read spreadsheet + calendar, generate annual schedule markdown and xlsx tab. Supports--update-xlsxto add Annual Schedule tab to existing spreadsheet.
Related Skills
- Plan Summer: Build the summer daily schedule that feeds into the annual view
- Plan PA Days: Look up PA day dates and find coverage programs
- Plan March Break: Plan March break camp coverage
- Budget Optimization: Calculate costs and apply discounts