@planvokter/riotplan
v1.1.3
Published
Framework for long-lived, stateful AI workflows (plans)
Maintainers
Readme
RiotPlan
A plan is bigger than a list of tasks.
RiotPlan treats plans as constructs—full lifecycles from idea exploration through execution. Think before you execute. Support complex, multi-session workflows. Make your plans truly yours.
Part of Kjerneverk - structured formats for working with generative AI.
Now available as an MCP server! Integrate with Cursor and other AI assistants - see MCP Integration below.
✨ MCP Sampling Support - No duplicate API keys needed when using RiotPlan via MCP! Learn more →
Storage model: RiotPlan now uses SQLite-backed
.planfiles as the only supported runtime format. Legacy directory-based plan workflows are deprecated and should be migrated.
Why RiotPlan?
Before: Inadequate Planning
- Tool-generated inadequacy: Depending on AI tools to generate simplistic task lists
- Markdown chaos: Plans are markdown files that pile up without structure or lifecycle
- Issue trackers without thinking: Systems like Beads (Steve Yegge's git-backed tracker) address markdown problems but don't support deep, thoughtful planning
- No analysis phase: Jumping straight to execution without exploring ideas or comparing approaches
After: Plans as Lifecycle
- Standard lifecycle: Idea exploration → Shaping approaches → Building detailed plan → Execution → Completion
- Thinking before execution: You can't just create a plan and execute it. RiotPlan supports analysis, elaboration, research.
- Standard infrastructure: MCP resources, tools, and prompts that know how to work with plans. Not just a format, but a system.
- Tool independence: Works from CLI with API keys, via MCP with any model, or through future GUI applications.
What is a RiotPlan?
A plan is a construct that manages multi-step AI-assisted tasks:
- Spans multiple sessions - Work on a task over days or weeks
- Has persistent state - Track progress in STATUS.md
- Organized into steps - Numbered files (01-STEP.md, 02-STEP.md)
- Can be interrupted and resumed - Pick up where you left off
- Supports deep thinking - Idea exploration, approach comparison, analysis before action
Plan Structure
my-plan/
├── my-plan-prompt.md # Meta-prompt (prompt-of-prompts)
├── SUMMARY.md # Overview of the approach
├── EXECUTION_PLAN.md # Step-by-step strategy
├── STATUS.md # Current state (auto-updated)
├── plan/ # Step files
│ ├── 01-first-step.md
│ ├── 02-second-step.md
│ └── ...
└── analysis/ # Analysis output (optional)Key Files
| File | Purpose |
|------|---------|
| {code}-prompt.md | Initial meta-prompt that creates the plan |
| SUMMARY.md | High-level overview of the approach |
| EXECUTION_PLAN.md | Detailed execution strategy |
| STATUS.md | Current state, progress tracking |
| 01-*.md, 02-*.md | Individual step prompts |
Real-World Examples
Plans in the wild:
grunnverk/prompts/
├── big-splitup/ # Codebase restructuring
├── commit-splitting/ # Feature implementation
├── parallel-execution/ # Complex feature with phases
├── shared-utils/ # Package extraction
└── ai-service/ # Service extractionInstallation
npm install -g @riotprompt/riotplanOr as a development dependency:
npm install --save-dev @riotprompt/riotplanAI-Powered Generation (Optional)
riotplan can use AI to generate detailed, actionable plans from your descriptions. Install an execution provider:
# For Anthropic Claude (recommended)
npm install @riotprompt/execution-anthropic
# For OpenAI GPT
npm install @riotprompt/execution-openai
# For Google Gemini
npm install @riotprompt/execution-geminiSet your API key:
export ANTHROPIC_API_KEY="sk-ant-..."
export OPENAI_API_KEY="sk-..."
export GOOGLE_API_KEY="..."Without an AI provider, riotplan falls back to template-based generation.
Command-Line Interface
Creating a Plan
Create a new plan with AI generation:
riotplan create my-featureThis will:
- Prompt for your plan description (opens editor)
- Ask if you want analysis first or direct generation
- Use AI to generate detailed plan content
- Create all plan files with actionable steps
Options:
riotplan create my-feature --direct # Skip analysis, generate directly
riotplan create my-feature --steps 7 # Specify number of steps
riotplan create my-feature --provider anthropic # Choose AI provider
riotplan create my-feature --model claude-sonnet-4-5 # Specify model
riotplan create my-feature --no-ai # Use templates onlyCreates:
my-feature/
├── my-feature-prompt.md # Your original description
├── SUMMARY.md # AI-generated overview and approach
├── EXECUTION_PLAN.md # Step-by-step strategy
├── STATUS.md # Current state tracking
└── plan/
├── 01-analysis.md # Detailed step with specific tasks
├── 02-design.md # Concrete acceptance criteria
├── 03-implementation.md # Testing strategies
└── ...AI vs Templates: With AI, you get specific, actionable content tailored to your project. Without AI, you get template files with placeholders to fill in manually.
Checking Status
Show current plan status:
riotplan status # Current directory
riotplan status ./my-plan # Specific path
riotplan status -v # Verbose output
riotplan status --json # JSON outputExample output:
Plan: my-feature
Status: 🔄 in_progress
Progress: 45% (5/11 steps)
Current Step: 06-testing
Last Updated: 2026-01-10
Blockers: None
Issues: 1 (low priority)Managing Steps
List steps in a plan:
riotplan step list # All steps
riotplan step list --pending # Only pending
riotplan step list --all # Include completedExample output:
✅ 01 analysis
✅ 02 design
✅ 03 architecture
✅ 04 implementation-core
🔄 05 implementation-api
⬜ 06 testing
⬜ 07 documentation
⬜ 08 releaseAdd a new step:
riotplan step add "Integration Testing"
riotplan step add "Security Audit" --number 07
riotplan step add "Review" --after 05Mark steps as started or completed:
riotplan step start 05
riotplan step complete 05Managing Feedback
Create and list feedback records:
riotplan feedback create # Create feedback record
riotplan feedback list # List feedback recordsValidating Plans
Validate plan structure:
riotplan plan validate # Current directory
riotplan plan validate ./my-plan # Specific path
riotplan plan validate --fix # Attempt to fix issuesChecks:
- Required files exist (STATUS.md, EXECUTION_PLAN.md, etc.)
- STATUS.md is parseable
- Step files have valid numbering (01-, 02-, etc.)
- Step dependencies are valid
- No circular dependencies
Archive a completed plan:
riotplan plan archive # Current directory
riotplan plan archive ./my-plan # Specific pathStatus Indicators
| Symbol | Meaning | |--------|---------| | ⬜ | Pending | | 🔄 | In Progress | | ✅ | Completed | | ❌ | Failed | | ⏸️ | Blocked | | ⏭️ | Skipped |
Generate from Existing Prompt
If you already have a plan directory with a prompt file:
riotplan generate ./my-plan --steps 5
riotplan generate ./my-plan --provider anthropic --model claude-sonnet-4-5Configuration
RiotPlan uses a flexible four-tier configuration system to determine where plans are stored:
- Environment Variable (
RIOTPLAN_PLAN_DIRECTORY) - Highest priority - Config File (
riotplan.config.*,.riotplan/config.*, etc.) - Project-level - Auto-Detection - Automatically finds
plans/directory by walking up the tree - Fallback - Uses
./plansin current directory (zero-config experience)
Quick Start:
# Most users: Just start using RiotPlan - it finds plans/ automatically!
riotplan create my-feature
# Create a config file (optional)
riotplan --init-config
# Check current configuration
riotplan check-configExample: riotplan.config.yaml
planDirectory: ./plans
defaultProvider: anthropic
defaultModel: claude-3-5-sonnet-20241022MCP Server Configuration:
{
"mcpServers": {
"riotplan": {
"command": "npx",
"args": ["-y", "@riotprompt/riotplan"],
"env": {
"RIOTPLAN_PLAN_DIRECTORY": "/path/to/plans"
}
}
}
}See Configuration Guide for complete documentation.
Catalysts: Composable Planning Intelligence
Catalysts are composable, layerable bundles of planning guidance that influence how plans are created. They contain questions, constraints, domain knowledge, and process guidance that help shape plans for specific technologies, organizations, or project types.
What Catalysts Provide
A catalyst can include any combination of:
- Questions: Guiding questions for idea exploration (e.g., "What Node.js version will you target?")
- Constraints: Rules plans must satisfy (e.g., "All projects must have 80% test coverage")
- Output Templates: Expected deliverables (e.g., Amazon-style press releases, 6-page narratives)
- Domain Knowledge: Context about an organization, project, or technology
- Process Guidance: How to approach the planning process (tactical vs strategic)
- Validation Rules: Post-creation checks
Catalyst Structure
A catalyst is a directory containing:
my-catalyst/
├── catalyst.yml # Manifest (id, name, version, facets)
├── questions/ # Guiding questions
│ └── *.md
├── constraints/ # Rules and requirements
│ └── *.md
├── domain-knowledge/ # Contextual information
│ └── *.md
├── process-guidance/ # Process recommendations
│ └── *.md
├── output-templates/ # Expected deliverables
│ └── *.md
└── validation-rules/ # Post-creation checks
└── *.mdExample catalyst.yml:
id: '@kjerneverk/catalyst-project'
name: Kjerneverk Project Standards
version: 1.0.0
description: Standard constraints and guidance for all Kjerneverk projects
facets:
questions: true
constraints: true
domainKnowledge: true
processGuidance: trueUsing Catalysts
Via Configuration (riotplan.config.yaml):
planDirectory: ./plans
catalysts:
- ./catalysts/kjerneverk-project
- ./catalysts/nodejs
catalystDirectory: ./catalystsVia Command Line:
riotplan create my-feature --catalysts ./catalysts/nodejs,./catalysts/testingVia MCP Tools:
// List configured catalysts
riotplan_catalyst({ action: 'list' })
// Show catalyst details
riotplan_catalyst({ action: 'show', catalyst: '@kjerneverk/catalyst-project' })
// Associate catalysts with a plan
riotplan_catalyst({
path: './my-plan',
action: 'add',
catalysts: ['@kjerneverk/catalyst-project']
})Catalyst Layering
Catalysts can be layered to combine guidance from multiple sources:
catalysts:
- ./catalysts/software # Base software practices
- ./catalysts/nodejs # Node.js specific guidance
- ./catalysts/company # Company-specific standardsContent from multiple catalysts is merged in order (first = base, last = top layer), with source attribution maintained for traceability.
Catalyst Traceability
When catalysts are used, plans record which catalysts influenced their creation:
plan.yaml: Records catalyst IDs in the plan manifestSUMMARY.md: Lists applied catalysts in the plan summary- AI Generation: Catalyst content is injected into the AI prompt, influencing plan generation
Example Catalyst
See examples/catalysts/kjerneverk-project/ for a complete working example demonstrating all facets.
Future: NPM Distribution
In a future release, catalysts will be distributable as NPM packages, allowing you to:
npm install @kjerneverk/catalyst-nodejscatalysts:
- '@kjerneverk/catalyst-nodejs' # Resolves from node_modulesFor now, catalysts are loaded from local directories.
Programmatic Usage
import { loadPlan, resumePlan } from '@riotprompt/riotplan';
// Load an existing plan
const plan = await loadPlan('./prompts/my-feature');
console.log(plan.metadata.code); // 'my-feature'
console.log(plan.state.status); // 'in_progress'
console.log(plan.state.currentStep); // 3
// Resume execution
const result = await resumePlan(plan);Creating a Plan
import { createPlan } from 'riotplan';
const plan = await createPlan({
code: 'my-feature',
name: 'My Feature Implementation',
path: './prompts/my-feature',
description: 'Implement the new feature with proper testing',
steps: [
{ title: 'Analysis', description: 'Analyze requirements' },
{ title: 'Design', description: 'Design the solution' },
{ title: 'Implementation', description: 'Build it' },
{ title: 'Testing', description: 'Verify it works' },
{ title: 'Documentation', description: 'Document it' },
]
});STATUS.md Format
# My Feature - Execution Status
## Current State
| Field | Value |
|-------|-------|
| **Status** | `in_progress` |
| **Current Step** | 03-implementation |
| **Last Completed** | 02-design |
| **Started At** | 2026-01-08 |
| **Last Updated** | 2026-01-10 |
## Step Progress
| Step | Name | Status | Started | Completed | Notes |
|------|------|--------|---------|-----------|-------|
| 01 | Analysis | ✅ Completed | 2026-01-08 | 2026-01-08 | - |
| 02 | Design | ✅ Completed | 2026-01-08 | 2026-01-09 | - |
| 03 | Implementation | 🔄 In Progress | 2026-01-09 | - | 50% done |
| 04 | Testing | ⬜ Pending | - | - | - |
| 05 | Documentation | ⬜ Pending | - | - | - |
## Blockers
_No blockers currently._
## Issues
_No issues encountered._Roadmap
v0.1.0 - Core Functionality
- [ ] Load plans from directories
- [ ] Parse STATUS.md
- [ ] Generate STATUS.md
- [ ] Step file discovery
v0.2.0 - Execution
- [ ] Execute individual steps
- [ ] Resume from checkpoint
- [ ] Update state automatically
v0.3.0 - Integration
- [ ] CLI (riotplan-cli)
- [ ] Agentic execution
- [ ] Riotprompt integration
Related Packages
@riotprompt/riotprompt- Prompt modeling for single interactions@riotprompt/agentic- Multi-turn conversation framework@riotprompt/execution- LLM provider interfaces@riotprompt/riotplan-commands-*- Command packages (plan, status, step, feedback)
MCP Integration
RiotPlan is available as an MCP (Model Context Protocol) server, allowing AI assistants like Cursor to manage plans directly.
Setup
Add to your Cursor MCP settings (~/.cursor/mcp.json):
{
"mcpServers": {
"riotplan": {
"command": "npx",
"args": ["-y", "@riotprompt/riotplan"],
"env": {
"RIOTPLAN_PLAN_DIRECTORY": "/path/to/plans"
}
}
}
}If Cursor should connect to a remote HTTP deployment (riotplan-mcp-http) instead of launching a local process:
{
"mcpServers": {
"riotplan-http": {
"url": "https://your-host.example.com/mcp",
"headers": {
"Authorization": "Bearer <raw_key_secret>"
}
}
}
}riotplan-mcp-http also accepts X-API-Key: <raw_key_secret>.
Zero-Config Experience: If you don't set RIOTPLAN_PLAN_DIRECTORY, RiotPlan will automatically find your plans/ directory by walking up from your workspace root. No configuration needed!
The MCP server includes enhanced error handling and logging for better reliability and debugging.
HTTP MCP Startup (riotplan-mcp-http)
For the HTTP server variant you can configure both plan storage and context discovery roots:
riotplan-mcp-http --plans-dir /path/to/plans --context-dir /path/to/context--plans-diris required and controls where.planfiles are discovered.--context-diris optional and controls whereriotplan_contextresolves project entities.- If
--context-diris omitted, RiotPlan uses a deterministic fallback:contextDir = plansDir.
Recommended: point contextDir at your shared context root when plans are portable across machines.
MCP Tools
Lifecycle Management:
riotplan_idea- Start exploring an idea (Idea stage)riotplan_shaping- Begin shaping approaches (Shaping stage)riotplan_build- Prepare caller-side generation instructions from idea/shaping artifactsriotplan_build_validate_plan- Validate caller-generated plan JSON against full plan context and issue write stampriotplan_build_write_artifact- Persist caller-generated SUMMARY/EXECUTION_PLAN/STATUS/PROVENANCEriotplan_build_write_step- Persist caller-generated step markdown filesriotplan_transition- Move between lifecycle stages manually
Plan Management:
riotplan_plan- Unified plan tool withaction: "create" | "switch" | "move"riotplan_status- Show plan status and progressriotplan_validate- Validate plan structureriotplan_generate- Generate plan content with AI
Step Management:
riotplan_step- Unified step tool withaction: "start" | "complete" | "add" | "remove" | "move"
Idea Stage:
riotplan_idea- Add notes during explorationriotplan_idea- Document constraintsriotplan_idea- Raise questionsriotplan_idea- Attach supporting materialsriotplan_evidence- Unified structured evidence tool withaction: "add" | "edit" | "delete"riotplan_idea- Abandon idea with reason
Shaping Stage:
riotplan_shaping- Propose solution approachesriotplan_shaping- Add feedback on approachesriotplan_shaping- Compare all approachesriotplan_shaping- Select best approach
History & Checkpoints:
riotplan_checkpoint- Save state snapshotsriotplan_checkpoint- Restore previous stateriotplan_history_show- View timeline of events
Project Binding & Workspace Filtering:
riotplan_bind_project- Persist one explicit project binding per plan.riotplan_get_project_binding- Resolve binding source (explicit→inferred→none).riotplan_resolve_project_context- Resolve local project roots from bindings.riotplan_list_planssupportsprojectIdand optionalworkspaceIdfilters.
Binding model notes:
- Each plan has at most one bound project.
- SQLite plans persist binding metadata inside the
.planfile (other/project-binding.json) for portability. - Unresolved plans remain listable and safe for clients (shown as unassigned until mapped).
MCP Resources
Read-only access to plan data:
riotplan://plan/{path}- Plan metadata and structureriotplan://status/{path}- Current status and progressriotplan://steps/{path}- List of all stepsriotplan://step/{path}?number={n}- Specific step content
MCP Prompts
Workflow templates for common tasks:
create_plan- Guided plan creation workflowexecute_step- Step execution workflow with status trackingtrack_progress- Progress monitoring and status updates
Example MCP Usage
// AI assistant creates a plan
riotplan_plan({
action: "create",
code: "user-auth",
description: "Implement JWT-based authentication",
steps: 6
})
// Check status
riotplan_status({ path: "./user-auth" })
// Start and complete steps
riotplan_step({ planId: "./user-auth", action: "start", step: 1 })
// ... do the work ...
riotplan_step({ planId: "./user-auth", action: "complete", step: 1 })For AI Assistants: Executing Plans with Tracking
When executing a RiotPlan, you MUST use RiotPlan's tracking infrastructure:
Check if step files exist in
plan/directory- If
EXECUTION_PLAN.mdexists but step files don't, create them first - Step files (e.g.,
01-step.md,02-step.md) are required for tracking
- If
For each step you execute:
- Call
riotplan_step({ planId: path, action: "start", step: N })BEFORE doing any work - Do the actual work (implement, test, document)
- Call
riotplan_step({ planId: path, action: "complete", step: N })AFTER completing the work - Let RiotPlan update STATUS.md automatically
- Call
Use the
execute_planprompt for guided execution:/riotplan/execute_planThis provides the complete workflow for executing with tracking.
Key Principle: If you're working on a RiotPlan, RiotPlan should manage the execution, not just the planning. Don't just do the work - use the tracking tools!
Common Mistake: Executing steps without using riotplan_step start/complete actions. This bypasses RiotPlan's execution management and breaks progress tracking.
See guide/mcp.md for detailed MCP documentation.
Philosophy
Plans bridge the gap between:
- Prompts (single interactions)
- Agentic conversations (multi-turn sessions)
- Long-running workflows (days/weeks of work)
A plan provides structure for complex, iterative AI-assisted work where:
- The work can't be done in one session
- Progress needs to be tracked
- Humans need to review and provide feedback
- The approach may evolve based on findings
Package Architecture
RiotPlan is being split into three packages. During the migration, riotplan
remains the single published package and source of truth. The sibling packages
contain real extracted code with proper package imports, but don't have
standalone builds or test suites yet.
What's in @planvokter/riotplan (this package)
Everything. This is still the monolith. Here's why each module exists here:
| Module | Purpose | Extraction status |
|---|---|---|
| src/mcp/ | HTTP MCP server, tools, resources, prompts, session, RBAC | Copied to riotplan-mcp-http. Both copies exist; this one is tested. |
| src/core/ | Domain contracts, services, adapters, composition root | Copied to riotplan-core. Both copies exist; this one is tested. |
| src/ai/ | Artifact loading, plan generation prompts, provider loading | Stays here. MCP-HTTP imports via @planvokter/riotplan/ai/*. |
| src/plan/ | Plan loader, creator, validator, category | Stays here. Core library functionality. |
| src/cli/ | CLI commands, agent tools, explore command | Stays here. CLI is not being extracted. |
| src/cloud/ | GCS cloud sync runtime | Stays here. Server infrastructure. |
| src/config/ | Configuration loading, schema, catalyst loader | Stays here. Shared config infrastructure. |
| src/steps/ | Step mutation operations (insert, remove, move, start, complete) | Stays here. Core library exports. |
| src/status/ | Status parsing and generation | Stays here. Core library exports. |
| src/reflections/ | Step reflection reader/writer | Stays here. Core library exports. |
| src/history/ | Revision and milestone management | Stays here. Core library functionality. |
| src/verification/ | Acceptance criteria checking, completion verification | Stays here. Core library functionality. |
| src/templates/ | Plan templates (basic, feature, refactoring, etc.) | Stays here. Core library functionality. |
| src/renderer/ | Plan rendering (markdown, JSON, HTML) | Stays here. Core library functionality. |
| src/registry/ | Multi-plan registry, scan, search | Stays here. Core library functionality. |
| src/relationships/ | Cross-plan relationship management | Stays here. Core library functionality. |
| src/dependencies/ | Step dependency graph, critical path | Stays here. Core library functionality. |
| src/analysis/ | Analysis directory management | Stays here. Core library functionality. |
| src/feedback/ | Feedback record management | Stays here. Core library functionality. |
| src/retrospective/ | Retrospective generation and reference | Stays here. Core library functionality. |
| src/execution/ | Step executor framework | Stays here. Core library functionality. |
| src/types.ts | All shared TypeScript types | Stays here. Root type definitions. |
| src/mcp-http/ | Transitional barrel (forwards to src/mcp/*) | Will be removed once riotplan-mcp-http is standalone. |
| src/compat/ | Compatibility shims | Will be removed after migration. |
| src/migration/ | Migration utilities | Will be removed after migration. |
Sibling packages
| Package | What it owns | Dependencies |
|---|---|---|
| @planvokter/riotplan-core | Domain contracts, services, adapters, composition | @planvokter/riotplan (types + plan ops), @planvokter/riotplan-format |
| @planvokter/riotplan-mcp-http | HTTP server, MCP tools/resources/prompts, RBAC, sessions | @planvokter/riotplan (ai, config, plan, types), @planvokter/riotplan-core, @planvokter/riotplan-format |
| @planvokter/riotplan-format | SQLite schema, provider, plan file format | (independent) |
Why duplicated code?
src/mcp/ and src/core/ still exist in this package because:
- All tests run here against the original source
- The build produces a single bundle from this tree
- The npm-published
@planvokter/riotplanpackage ships from here - The sibling packages aren't published yet
Once riotplan-core and riotplan-mcp-http have their own builds, test
suites, and are published to npm, the duplicated modules will be removed from
this package and replaced with dependency imports.
License
Apache-2.0
