Thank you for your interest in contributing to VibeFrame! This document provides guidelines and instructions for contributing.
Please be respectful and considerate of others. We want to foster an inclusive and welcoming community.
- Node.js >= 20
- pnpm 9.15.4 (
corepack enable && corepack prepare pnpm@9.15.4 --activate) - FFmpeg (required for video/audio commands):
brew install ffmpeg(macOS) or see ffmpeg.org - API keys (optional, only for AI features you're working on): Copy
.env.exampleto.envand fill in relevant keys. See MODELS.md for which commands need which keys.
- Fork the repository
- Clone your fork:
git clone https://github.com/YOUR_USERNAME/vibeframe.git - Install dependencies:
pnpm install - Build all packages:
pnpm build - Run tests to verify:
pnpm -F @vibeframe/cli exec vitest run - Create a new branch:
git checkout -b feature/your-feature-name
| Package | Path | Description |
|---|---|---|
@vibeframe/cli |
packages/cli |
Main CLI interface (Commander.js + Agent) |
@vibeframe/core |
packages/core |
Timeline data structures, effects, FFmpeg export |
@vibeframe/ai-providers |
packages/ai-providers |
Pluggable AI provider integrations |
@vibeframe/mcp-server |
packages/mcp-server |
MCP server for Claude Desktop/Cursor |
@vibeframe/ui |
packages/ui |
Shared React components (Radix UI + Tailwind) |
@vibeframe/web |
apps/web |
Next.js preview UI |
# All tests (note: default vitest runs in watch mode)
pnpm -F @vibeframe/cli exec vitest run # CLI tests (~232 tests, ~58s)
pnpm -F @vibeframe/core exec vitest run # Core tests (~8 tests, <1s)
# With coverage
pnpm -F @vibeframe/cli exec vitest run --coverage
# Specific test file
pnpm -F @vibeframe/cli exec vitest run src/commands/__tests__/ai.test.ts
# All packages via turbo (runs in watch mode - press q to exit)
pnpm test- Make your changes in a feature branch off
main, namedfeat/<topic>,fix/<topic>, orchore/<topic>. Keep one PR to one coherent scope — don't stack unrelated commits onto an open PR branch. - Write tests for new functionality
- Ensure all tests pass:
pnpm -F @vibeframe/cli exec vitest run - Ensure code is properly formatted:
pnpm format - Ensure linting passes:
pnpm lint - Build to check TypeScript:
pnpm build - Commit your changes with a conventional commit message
- Push to your fork and submit a Pull Request
Version bumps default to patch; minor/major are rare and gated (see the
"Conventions" and versioning notes in AGENTS.md).
Post-v0.68 (Plan G Phase 1) the provider plugin pattern collapses what used to be 8 file edits into 1–2 declarations. The CLI's provider-resolver, config schema, doctor, setup wizard, and .env.example all derive from a single registry, so adding a provider auto-propagates.
pnpm scaffold:provider <name> # e.g. pnpm scaffold:provider stabilityThis creates packages/ai-providers/src/<name>/ with a stub <Name>Provider.ts (implements AIProvider interface) + index.ts (calls defineProvider({...})), and adds the re-export line to packages/ai-providers/src/index.ts.
-
packages/ai-providers/src/<name>/<Name>Provider.ts— implement the methods you need from theAIProviderinterface. The base contract is inpackages/ai-providers/src/interface/types.ts. Common methods:initialize,isConfigured,generateImage,generateVideo,transcribe. -
packages/ai-providers/src/<name>/index.ts— fill in thedefineProvider({...})block:apiKey: reference an existing configKey fromapi-keys.ts(e.g."openai","google"), or set tonullif your provider runs locally.kinds: array of"image" | "video" | "speech" | "llm" | "transcription" | "music".commandsUnlocked: list of CLI command strings shown invibe doctor.resolverPriority(optional):{ image: 4 }— lower = higher priority.
-
(If new credential) Add a
defineApiKey({...})block topackages/ai-providers/src/api-keys.tswith the configKey, envVar, label, setup wizard description, and.env.examplecomment/URL. Skip this step if your provider shares an existing apiKey (e.g. another OpenAI service uses the existing"openai"configKey).
pnpm -F @vibeframe/ai-providers build # compile the new provider class
pnpm -r exec tsc --noEmit # 0 errors
pnpm -F @vibeframe/cli test # snapshot tests catch resolver drift
bash scripts/sync-counts.sh --check # verifies .env.example regenvibe doctor --json should show your new provider under result.providers. The setup wizard (vibe setup --full) prompts for the apiKey if showInSetup: true.
That's it. No need to edit provider-resolver.ts, schema.ts, doctor.ts, setup.ts, or .env.example — the registry derives them all.
Each vibe <group> <name> command is a self-contained file. Post-v0.69 (Plan G Phase 2/3), generate.ts and ai-edit.ts are barrels that call register functions from per-subcommand files.
pnpm scaffold:command <group> <name> # e.g. pnpm scaffold:command generate my-featureSupported groups: generate, edit.
For generate: creates packages/cli/src/commands/generate/<name>.ts and adds the register*Command(generateCommand) call to commands/generate.ts.
For edit: creates packages/cli/src/commands/_shared/edit/<name>.ts and adds re-exports to the ai-edit.ts barrel.
Each scaffolded file contains:
XxxOptionsandXxxResultinterfaces — define the shape of inputs/outputs.executeXxx(options)— pure function returning{ success, ... }. Used by the manifest layer (MCP/Agent) and the CLI handler.registerXxxCommand(parent)— wrapsexecuteXxxin a Commander chain with options, action handler, JSON-mode output, etc.
The split makes new contributions a single file edit. The CLI surface auto-updates because the parent group file already registers the new command.
If the command should be available as an MCP tool or agent tool, add a defineTool({...}) entry to the appropriate packages/cli/src/tools/manifest/<group>.ts. The manifest is the single source of truth for both surfaces — see packages/cli/src/tools/define-tool.ts for the schema.
pnpm -F @vibeframe/cli build
node packages/cli/dist/index.js <group> <name> --help
pnpm -F @vibeframe/cli testCLAUDE.md— tool counts and tablesROADMAP.md— only when public product direction changesMODELS.md— if adding a new AI model/provider
We follow conventional commits:
feat:New featurefix:Bug fixdocs:Documentation changesstyle:Code style changes (formatting, etc.)refactor:Code refactoringtest:Adding or updating testschore:Maintenance tasks
Example: feat: add fade in effect to timeline clips
- Provide a clear description of the changes
- Reference any related issues
- Include screenshots for UI changes
- Ensure CI passes
- Request review from maintainers
- Monorepo: Turborepo + pnpm workspaces. Use
workspace:*for internal deps. - ESM: All packages use ES modules.
- TypeScript: Strict mode. Run
pnpm buildto compile. - Time units: All times in seconds (floats allowed).
- IDs:
source-{id},clip-{id},track-{id},effect-{id}. - Project files:
.vibe.jsonstores project state.
Feel free to open an issue for any questions or discussions.