Thank you for your interest in contributing to this project!
- Fork and Clone: Fork this repository and clone your fork locally
- Install Dependencies: Run
npm installto set up validation tools - Open in VS Code: Install recommended extensions when prompted
- Create a Branch: Create a feature branch for your work
- Make Changes: Implement your changes following our guidelines
- Validate: Run
npm run validatebefore committing - Submit PR: Create a pull request with a clear description
| Branch | Purpose | Protection |
|---|---|---|
main |
Production-ready drafts | PR required, no direct pushes |
draft/v{N} |
Major versions (e.g., draft/v1, draft/v2) |
PR required |
draft/v{N}-{qualifier} |
Named variants (e.g., draft/v2-polish) |
PR required |
Pattern: type/kebab-case-description
| Type | Purpose | Examples |
|---|---|---|
scene/{slug} |
Single scene or sequence | scene/opening, scene/midpoint-reveal |
revision/{type} |
Full-script revision pass | revision/dialogue, revision/action |
character/{name} |
Character-focused work | character/protagonist-arc |
structure/{change} |
Structural reorganization | structure/reorder-act2 |
fix/{issue} |
Targeted fixes | fix/continuity-sc15, fix/format |
export/{format} |
Export preparation | export/table-read, export/competition |
docs/{topic} |
Documentation updates | docs/workflow, docs/readme |
Naming rules: Type prefix + 2-5 words in kebab-case. No special characters except hyphens.
-
Create working branch:
git checkout main # or draft/v{N} git pull origin main git checkout -b scene/your-scene-name -
Make changes and commit:
git add . git commit -m "scene(act1): add opening sequence"
-
Push and create PR:
git push -u origin scene/your-scene-name gh pr create --base main --title "scene: add opening sequence" -
Merge strategy:
- Squash merge:
scene/*,fix/*,export/*(clean history) - Regular merge:
revision/*,structure/*,character/*(preserve history)
- Squash merge:
-
Cleanup after merge:
git branch -d scene/your-scene-name git push origin --delete scene/your-scene-name
When you open this project in VS Code, you'll be prompted to install recommended extensions. These are essential for a smooth workflow:
| Extension | Purpose |
|---|---|
| Better Fountain | Syntax highlighting, scene navigation, and preview for .fountain screenplay files |
| Code Spell Checker | Catches typos in your content with project-specific dictionary support |
| markdownlint | Ensures consistent Markdown formatting across documentation |
| Markdown All in One | Enhanced Markdown editing with shortcuts, TOC generation, and preview |
| Prettier | Automatic code/config file formatting |
| GitLens | Enhanced Git integration showing blame, history, and comparisons |
| GitHub Pull Requests | Manage PRs directly from VS Code |
To manually install all extensions:
code --install-extension piersdeseilligny.betterfountain
code --install-extension streetsidesoftware.code-spell-checker
code --install-extension davidanson.vscode-markdownlint
code --install-extension yzhang.markdown-all-in-one
code --install-extension esbenp.prettier-vscode
code --install-extension eamodio.gitlens
code --install-extension github.vscode-pull-request-githubPattern: type(scope): description
| Type | Purpose |
|---|---|
scene |
New or modified scene content |
dialogue |
Dialogue improvements |
action |
Action line changes |
structure |
Structural reorganization |
revision |
Revision pass changes |
character |
Character development |
notes |
Notes and annotations |
format |
Formatting fixes |
docs |
Documentation updates |
chore |
Maintenance tasks |
Additional types for template contributions:
skill- New or modified skillcommand- New or modified commandci- CI/CD changes
Examples:
scene(act1): add opening coffee shop sequencedialogue(protagonist): polish voice in apartment scenesfix(continuity): correct timeline in scenes 15-18docs(readme): update cast listskill(story-structure): add midpoint beat analysiscommand(export-pdf): fix output path handling
PR titles must match: type(scope): description
This is enforced by CI. Examples:
feat(skill): add advanced-structure skillfix(command): correct export-pdf output pathdocs(contributing): add spoke author rules
When contributing skills or commands to this template repository:
- Frontmatter Required: All skills must have YAML frontmatter
- wtfbId Format: Use
wtfb:{name}(e.g.,wtfb:story-structure) - Name Matching:
namefield must match directory name exactly - Description Format: Include "Use when:" trigger conditions
Example skill frontmatter:
---
name: my-skill
wtfbId: wtfb:my-skill
description: |
This skill provides...
Use when: you need to...
---When contributing to marketplace plugins:
- Unique Namespace: Use
{your-plugin}:{name}(NOTwtfb:) - Relationship Declared: Use
provides,extends, orreplaces - Compatibility: Include
compat.templateversion range
Reserved namespaces (do not use):
wtfb:- Template hub onlywtfb-screenwriting:- Official WTFB pluginwtfb-novel-writing:- Official WTFB pluginwtfb-film-production:- Official WTFB plugin
See Capability Contract for full specification.
Before submitting a PR, ensure:
-
npm run validatepasses (format, continuity, spelling) - Self-review completed
- Scene has clear purpose (for
scene/*branches) - Character voice is consistent (for
character/*branches) - Issue is demonstrably fixed (for
fix/*branches)
- Be respectful and constructive
- Focus on the work, not the person
- Welcome diverse perspectives
- Maintain creative integrity
Before submitting, run validation to catch issues:
npm run validate # Full validation (runs all linters + capability check)
npm run validate:capabilities # Skill/command compliance only
npm run lint:fountain # Fountain syntax (screenplays only)
npm run lint:md # Markdown linting
npm run lint:spell # Spell checkCI will automatically run validation on all pull requests to main and draft/* branches.
For skill/command contributions, validate:capabilities checks:
Skills (hard errors):
- Frontmatter exists (file starts with
---) namematches directory namewtfbIdfollows correct namespace format- Valid YAML syntax
Skills (warnings):
descriptionincludes "Use when:" clausedescriptionunder 1024 characters
Commands (hard errors):
- H1 heading matches filename (
# /command-name)
Commands (warnings):
- Frontmatter recommended
descriptionunder 100 charactersdescriptionstarts with imperative verb
Markdown files are linted using markdownlint-cli2. The configuration in .markdownlint-cli2.yaml is relaxed for creative/documentation projects:
- Line length: No limit (prose has long paragraphs)
- Inline HTML: Allowed for special formatting
- Duplicate headings: Allowed (templates repeat section names)
- Blank lines: Flexible requirements for readability
If you get markdown errors, check if the issue is stylistic (can be ignored) or structural (should be fixed).
Spell checking uses cSpell with a project-specific dictionary at .cspell/project-words.txt.
Adding project-specific words:
- Open
.cspell/project-words.txt - Add the word on a new line (one word per line)
- Use comments (
#) to organize sections
Common additions:
- Character names
- Location names
- Industry terms (e.g.,
logline,beatsheet) - Made-up words in your story
For screenplay projects, Fountain files are validated for:
- Proper scene heading format (
INT./EXT.) - Character name consistency
- Parenthetical formatting
- Page break placement
When syncing from the upstream template, these paths are protected and won't be overwritten:
*.fountain- Your screenplay contentmanuscript/**- Novel contentsourcematerials/**- Research and referencesdocs/v*/**- Versioned documentationREADME.md- Your project READMEmarketing/wtfb-marketing.json- Your marketing config
See .wtfb/project.json for the full list of protected and sync paths.
Open an issue or reach out to the project maintainers.