Database-driven FP enforcement and project management for AI-maintained codebases
A language-agnostic programming paradigm designed for AI-generated and AI-maintained codebases
AIFP (AI Functional Procedural) is a programming paradigm that combines:
Use Case 1: Regular Software Development
Use Case 2: Custom Directive Automation
Key Principle: One AIFP instance per project directory. You would NOT mix a web app with home automation directives. Run separate instances for separate purposes.
Traditional programming paradigms were designed for humans. AIFP is optimized for AI-human collaboration:
| Challenge | Traditional Approach | AIFP Solution |
|---|---|---|
| Context Loss | AI forgets between sessions | Database-driven persistent state |
| OOP Complexity | Classes, inheritance, polymorphism | Pure functions, explicit data structures |
| Infinite Development | Projects never "complete" | Finite completion paths with milestones |
| Code Reasoning | Parse source code repeatedly | Pre-indexed functions, dependencies, interactions |
| Inconsistent Standards | Style guides, linters, reviews | Immutable directives enforcing compliance |
# ✅ AIFP-Compliant
def calculate_total(items: List[Item]) -> float:
"""Pure function: deterministic, no side effects"""
return reduce(lambda acc, item: acc + item.price, items, 0.0)
# ❌ Not AIFP-Compliant
class Calculator:
def __init__(self):
self.total = 0 # Hidden state
def add_item(self, item):
self.total += item.price # MutationEvery function, file, and dependency is tracked in SQLite. AI accesses this data through helper tools — not raw SQL:
AI calls: get_functions_by_file(file_id)
→ Returns: all functions in that file with name, purpose, parameters, returnsNo source code reparsing required. Instant context retrieval across sessions.
Project: MatrixCalculator
├── Completion Path (3 stages)
│ ├── 1. Setup (completed)
│ ├── 2. Core Development (in progress)
│ │ ├── Milestone: Matrix Operations
│ │ │ ├── Task: Implement multiply
│ │ │ ├── Task: Implement transpose
│ │ │ └── Task: Add validation
│ │ └── Milestone: Vector Operations
│ └── 3. Finalization (pending)AIFP works with Python, JavaScript, TypeScript, Rust, Go, and more. FP directives adapt to language-specific syntax while maintaining universal standards.
┌─────────────────────────────────────────────────────┐
│ AI Assistant (Claude, GPT-4, etc.) │
│ - Receives natural language commands │
│ - Follows directives (FP baseline + project mgmt) │
│ - Calls MCP tools to read/write databases │
│ - Generates FP-compliant code │
└────────────────────┬────────────────────────────────┘
│ MCP Protocol (JSON-RPC over stdio)
┌────────────────────▼────────────────────────────────┐
│ MCP Server │
│ - Exposes helper tools via JSON-RPC │
│ - Manages four-database connections │
│ - Provides CRUD helpers for all databases │
│ - No business logic — AI makes all decisions │
└───┬────────────────────┬─────────────────────────┬──┘
│ │ │
┌───▼──────────────┐ ┌───▼────────────────┐ ┌─────▼─────────────────┐ ┌──────▼────────────────┐
│ aifp_core.db │ │ project.db │ │ user_preferences.db │ │ user_directives.db │
│ (Global, │ │ (Per-Project, │ │ (Per-Project, │ │ (Per-Project, │
│ Read-Only) │ │ Mutable) │ │ Mutable) │ │ Optional) │
│ │ │ │ │ │ │ │
│ - FP directives │ │ - Project metadata │ │ - Directive prefs │ │ - User directives │
│ - Project mgmt │ │ - Files & funcs │ │ - User settings │ │ - Execution stats │
│ - User prefs │ │ - Task hierarchy │ │ - AI learning log │ │ - Dependencies │
│ - User systems │ │ - Themes & flows │ │ - Tracking features │ │ - Generated code refs │
│ - Helper defs │ │ - Completion path │ │ (All opt-in) │ │ - Source file tracking│
│ - Directive flow │ │ - Runtime notes │ │ │ │ (Logs in files) │
└──────────────────┘ └────────────────────┘ └───────────────────────┘ └───────────────────────┘Location: Within MCP server installation directory (user-defined location, configured in AI client)
Purpose: Immutable knowledge base containing all AIFP standards, directives, and helper definitions.
Key Tables:
directives: All FP, project, and user preference directives (workflows, keywords, thresholds)helper_functions: Database, file, Git, and FP utilities organized across multiple registry filesdirective_helpers: Many-to-many junction table mapping directives to their helper functions with execution metadatacategories: Directive groupings (purity, immutability, task management, etc.)directive_flow: Status-driven directive navigation and routingHelper-Directive Relationship (New in v1.4):
directive_helpers junction table in aifp_core.dbHelper Classification:
is_sub_helper = TRUE): Internal utility called by other helpers only (not exposed to AI)Helper Registry (Development Staging):
dev/helpers-json/*.json during developmentused_by_directives field for relationship mappingaifp_core.db from JSON files before releaseaifp_core.db (pre-populated), NOT JSON filesRead-Only Philosophy: This database is version-controlled and immutable once deployed. AI reads from it but never modifies it.
Location: <project-root>/.aifp-project/project.db
Purpose: Persistent state for a single AIFP project. Tracks code structure, tasks, and runtime notes.
Key Tables:
project: High-level metadata (name, purpose, goals, status, user_directives_status, last_known_git_hash)files, functions, interactions: Code structure trackingthemes, flows: Organizational groupingscompletion_path, milestones, tasks, subtasks, sidequests: Hierarchical roadmapnotes: Runtime logging with optional directive context (source, severity, directive_name)types: Algebraic data types (ADTs)infrastructure: Project setup (language, packages, testing)work_branches: Git collaboration metadata (user, purpose, merge strategy)merge_history: FP-powered merge conflict resolution audit trailUser Directives Integration: The project.user_directives_status field tracks whether user directives are initialized (NULL/in_progress/active/disabled), allowing aifp_run and aifp_status directives to include user directive context when active.
Enhanced Notes: The notes table now includes source (user/ai/directive), directive_name (optional context), and severity (info/warning/error) for better traceability.
Location: <project-root>/.aifp-project/user_preferences.db
Purpose: User-specific AI behavior customizations and opt-in tracking features.
Key Tables:
directive_preferences: Per-directive behavior overrides (atomic key-value structure)user_settings: Project-wide AI behavior settingstracking_settings: Feature flags for opt-in tracking (all disabled by default)ai_interaction_log: User corrections and learning data (opt-in)fp_flow_tracking: FP compliance history (opt-in)issue_reports: Contextual bug reports (opt-in)Cost Management Philosophy: All tracking features disabled by default to minimize API token usage. Project work should be cost-efficient; debugging and analytics are opt-in.
User Customization Example:
-- User says: "Always add docstrings"
INSERT INTO directive_preferences (directive_name, preference_key, preference_value)
VALUES ('project_file_write', 'always_add_docstrings', 'true');
-- Next file write automatically includes docstringsLocation: <project-root>/.aifp-project/user_directives.db
Purpose: Store user-defined domain-specific directives for automation (home automation, cloud infrastructure, etc.). When this database exists, the AIFP project IS dedicated to building and managing the automation code generated from these directives.
This database only exists in Use Case 2: Custom Directive Automation projects. In regular software development projects, this database is not created.
Key Tables:
user_directives: Directive definitions (triggers, actions, status, validated configuration)directive_executions: Execution statistics (summary only, detailed logs in files)directive_dependencies: Required packages, APIs, environment variablesdirective_implementations: Links directives to generated code fileshelper_functions: AI-generated helper functions (project-specific implementation utilities)directive_helpers: Many-to-many junction table mapping user directives to their helperssource_files: Tracks user directive source files (YAML/JSON/TXT)logging_config: File-based logging configurationHelper Functions (New in v1.0):
File-Based Logging Philosophy: Database stores state and statistics only. Detailed execution logs (30-day retention) and error logs (90-day retention) are stored in rotating files at .aifp-project/logs/.
Directory Structure Comparison:
# Use Case 1: Regular Software Development
my-web-app/
├── src/ # Your application code
├── tests/ # Your tests
└── .aifp-project/ # AIFP tracks your application
├── project.db
└── user_preferences.db
# Use Case 2: Custom Directive Automation
home-automation/
├── directives/ # ← User writes directive files here
│ ├── lights.yaml
│ └── security.yaml
├── src/ # ← AIFP GENERATES this code
│ ├── lights_controller.py
│ └── security_monitor.py
├── tests/ # ← AIFP GENERATES tests
└── .aifp-project/ # ← AI-managed only, user never touches
├── project.db # Tracks generated src/ code
├── user_preferences.db
├── user_directives.db # References ../directives/ files
└── logs/ # 30/90-day execution logsExample Workflow (Automation Project):
directives/lights.yaml in their projectsrc/project.db (files, functions, tasks).aifp-project/logs/, statistics to databaseNote: User directive files stay in the user's project. .aifp-project/ is AI-managed metadata.
The aifp_run command serves as a gateway and reminder, not an executor. It tells the AI that AIFP directives should be applied.
Every aifp_run call returns:
{
"success": true,
"message": "AIFP MCP available",
"guidance": {
"directive_access": "Directive names cached from session bundle. Query specific directives by name when needed.",
"when_to_use": "Use AIFP directives when coding or when project management action/reaction is needed.",
"assumption": "Always assume AIFP applies unless user explicitly rejects it."
}
}The MCP server exposes CRUD helper functions for all database operations — tracking files, functions, tasks, project state, user preferences, and (for Use Case 2) automation directives. AI discovers available helpers from the database at runtime.
AI Decision Flow:
aifp run (or AI assumes it)aifp_run tool → receives guidanceUser: "Help me build a calculator"
AI Processing:
aifp_run(is_new_session=true) → receives session bundle (directive names, project status, settings, supportive context).aifp-project/ missing → project not initializedaifp_init helper (Phase 1: mechanical setup)
.aifp-project/ directory, databases, blueprint templateproject_discovery: collaborates with user on blueprint, themes, flows, completion path, milestonesaifp_status → project_progression → first task createdBefore acting, AI performs self-assessment using questions provided with directives:
Core Questions:
Does this involve coding or project state changes?
Do I have directives in memory?
aifp_run(is_new_session=true)Which directives apply?
Action-reaction needed?
Example Flow (Coding Task):
User: "Write multiply_matrices function"
AI thinks:
✓ FP baseline applies (write pure, immutable, no OOP)
✓ Project tracking applies (project_file_write directive)
✓ I have directives in memory
AI executes:
1. Write function following FP baseline naturally
2. Apply project_file_write directive
3. Update project.db (files, functions, interactions)Directives follow a trunk → branches → fallback pattern:
{
"trunk": "analyze_function",
"branches": [
{"if": "pure_function", "then": "mark_compliant"},
{"if": "mutation_detected", "then": "refactor_to_pure"},
{"if": "low_confidence", "then": "prompt_user"},
{"fallback": "prompt_user"}
]
}pip install aifpThis installs the MCP server and makes the aifp command available. AIFP requires only one external dependency (watchdog for filesystem monitoring) — the JSON-RPC server itself is pure Python stdlib.
git clone)src/aifp/ folder — this is the complete MCP server packageaifp/ folder to wherever you keep MCP servers:
# Example: copy to your MCP servers directory
cp -r src/aifp/ ~/mcp-servers/aifp/The only runtime dependency (watchdog) is installed automatically. The aifp/ folder contains everything else the server needs: helper functions, directives, database schemas, and the pre-populated aifp_core.db.
This step is required. The system prompt is what tells the AI to use AIFP tools proactively. Without it, the MCP server is just a collection of passive tools that never get called.
Print the system prompt to your terminal, then copy-paste it into your AI client:
python3 -m aifp --system-promptThe system prompt is shipped with the package — no separate file or download needed. This works for all install methods (pip, venv, manual).
Where to paste it (depends on your AI client):
| AI Client | Where to Add System Prompt |
|---|---|
| Claude Desktop | Settings → Custom Instructions |
| Claude Code | Add to CLAUDE.md in your project root |
| Other MCP clients | System prompt / custom instructions field |
Register the AIFP MCP server in your AI client's configuration. The server uses stdio transport — it reads JSON-RPC messages from stdin and writes responses to stdout.
Edit claude_desktop_config.json:
{
"mcpServers": {
"aifp": {
"command": "python3",
"args": ["-m", "aifp"],
"env": {}
}
}
}If you used Method 2 (manual install), add the parent directory of your aifp/ folder to PYTHONPATH so Python can find it:
{
"mcpServers": {
"aifp": {
"command": "python3",
"args": ["-m", "aifp"],
"env": {
"PYTHONPATH": "/path/to/parent-of-aifp-folder"
}
}
}
}For example, if you copied aifp/ to ~/mcp-servers/aifp/, set PYTHONPATH to ~/mcp-servers.
If you installed into a virtual environment, use the full path to the venv's Python so Claude Desktop uses the correct interpreter:
{
"mcpServers": {
"aifp": {
"command": "/path/to/venv/bin/python3",
"args": ["-m", "aifp"],
"env": {}
}
}
}Use claude mcp add to register the server. Run the command from within the project folder you want AIFP to manage.
Choose a scope first. AIFP enforces strict functional programming and actively rejects OOP codebases. If you work on other projects that use OOP or don't need AIFP, avoid --scope user — it enables the server in every project you open.
| Scope | Effect | Best for |
|---|---|---|
--scope project (Recommended) | Creates .mcp.json in the current directory. Shareable via git. | Teams and per-project control |
--scope local | Stored in ~/.claude.json keyed to the current directory. Private. | Personal per-project use |
--scope user | Available in every project you open. | Developers who use AIFP for all projects |
pip install (system-wide):
claude mcp add --transport stdio --scope project aifp -- python3 -m aifppip install (virtual environment) — use the venv's Python path:
claude mcp add --transport stdio --scope project aifp -- /path/to/venv/bin/python3 -m aifpA bare python3 resolves to the system Python, which won't have the package. Use the full path to the venv's interpreter so the MCP server subprocess finds the installed package.
Manual install or running from source — set PYTHONPATH to the parent of the aifp/ folder:
claude mcp add --transport stdio --scope project --env PYTHONPATH=/path/to/parent-of-aifp aifp -- python3 -m aifpQuick reference:
| Install Method | Claude Code Command |
|---|---|
pip install aifp (system) | -- python3 -m aifp |
pip install aifp (venv) | -- /path/to/venv/bin/python3 -m aifp |
| Manual folder / from source | --env PYTHONPATH=/parent/of/aifp -- python3 -m aifp |
Note: All flags (
--transport,--scope,--env) must come before the server name. The--separates the name from the command. Verify the server is connected with/mcpinside Claude Code.
Claude Code prompts you to approve each new MCP tool the first time it's called. With 228 tools, this means 228 approval prompts. To skip this, copy the pre-built permissions file into your project's .claude/ folder:
# Create the .claude/ folder in your project root if it doesn't exist
mkdir -p /path/to/your/project/.claude
# Copy the permissions file
cp documentation/settings.local.json /path/to/your/project/.claude/This places a settings.local.json in your project's .claude/ folder that pre-allows every AIFP tool. Claude Code will read it automatically — no approval prompts needed.
Note: The file also includes
enableAllProjectMcpServersandenabledMcpjsonServerssettings so the AIFP server starts automatically if you have a.mcp.jsonin the project.
The server uses stdio transport. Point your client at python3 -m aifp (or the full path to your venv's Python). For manual installs, ensure PYTHONPATH includes the parent directory of the aifp/ folder. No API keys or authentication required.
The server communicates over stdio using the Model Context Protocol. It resolves aifp_core.db (the directive database) relative to its own installation — no environment variables needed.
Once connected, the AI calls aifp_run() on every interaction (guided by the system prompt). Project state is stored in .aifp-project/ in your working directory, created automatically when you initialize a project.
Tell your AI assistant:
"Initialize AIFP for my project"
The AI calls aifp_init which creates an .aifp-project/ folder in your project root containing databases for project state tracking, user preferences, and a ProjectBlueprint document. You don't need to interact with these files — the MCP server manages them automatically.
FP Baseline (Always Active):
FP Directives (Reference Documentation):
fp_purity, fp_monadic_composition, fp_result_types, fp_wrapper_generationManage project lifecycle:
| Level | Directives | Purpose |
|---|---|---|
| Level 0 | aifp_run | Gateway orchestration (every interaction) |
| Level 1 | aifp_status, aifp_init, project_task_decomposition | Status, initialization, high-level coordination |
| Level 2 | project_file_write, project_update_db, project_task_update | Operational execution |
| Level 3 | project_compliance_check, project_evolution | State management |
| Level 4 | project_completion_check, project_archive | Validation & completion |
Manage AI behavior customization and learning:
| Directive | Purpose |
|---|---|
| user_preferences_sync | Loads preferences before directive execution |
| user_preferences_update | Maps user requests to directives, updates preferences |
| user_preferences_learn | Learns from user corrections (requires confirmation) |
| user_preferences_export | Exports preferences to JSON for backup/sharing |
| user_preferences_import | Imports preferences from JSON file |
| project_notes_log | Handles logging to project.db with directive context |
| tracking_toggle | Enables/disables tracking features with token cost warnings |
FOR USE CASE 2 ONLY: Automation projects where AIFP generates and manages the codebase:
| Directive | Purpose |
|---|---|
| user_directive_parse | Parse YAML/JSON/TXT directive files and extract structured directives |
| user_directive_validate | Validate directives through interactive Q&A to resolve ambiguities |
| user_directive_implement | Generate FP-compliant implementation code in src/ |
| user_directive_approve | User testing and approval workflow before activation |
| user_directive_activate | Deploy and activate directives for real-time execution |
| user_directive_monitor | Track execution statistics and handle errors |
| user_directive_update | Handle changes to directive source files (re-parse, re-validate) |
| user_directive_deactivate | Stop execution and clean up resources |
| user_directive_status | Comprehensive status reporting for all user directives |
Use Cases (Automation Projects):
Key Architecture:
src/, tests/, etc.)Key Features:
src/Example Directive Definition:
# directives/home_automation.yaml (user creates this in their project)
directives:
- name: turn_off_lights_5pm
trigger:
type: time
time: "17:00"
timezone: America/New_York
action:
type: api_call
api: homeassistant
endpoint: /services/light/turn_off
params:
entity_id: group.living_room_lightsUser tells AI: "Parse my directive file at directives/home_automation.yaml"
AI Generates (in src/lights_controller.py):
# Auto-generated from home_automation.yaml
from typing import Result
from homeassistant_client import HomeAssistant
def turn_off_living_room_lights(ha_client: HomeAssistant) -> Result[None, str]:
"""Turn off all lights in living room group."""
# FP-compliant implementation
...See the directive MD files in src/aifp/reference/directives/ for complete workflow documentation.
FP-powered Git collaboration for multi-user and multi-AI development:
| Directive | Purpose |
|---|---|
| git_init | Initialize or integrate with Git repository for version control |
| git_detect_external_changes | Detect code modifications made outside AIFP sessions |
| git_create_branch | Create user/AI work branches (aifp-{user}-{number}) |
| git_detect_conflicts | FP-powered conflict analysis before merging |
| git_merge_branch | Merge branches with AI-assisted conflict resolution |
| git_sync_state | Synchronize Git hash with project.db for external change detection |
Key Features:
aifp-alice-001, aifp-bob-002, aifp-ai-claude-001Why AIFP + Git is Superior to OOP + Git:
| OOP Merge Problem | AIFP FP Solution |
|---|---|
| Class hierarchies conflict | ✅ No classes → No hierarchy conflicts |
| Hidden state changes | ✅ Pure functions → Explicit inputs/outputs |
| Side effects everywhere | ✅ Side effects isolated → Easy to identify conflicts |
| Hard to test both versions | ✅ Pure functions → Easy to test and compare |
Example Conflict Resolution:
Alice and Bob both modify calculate_total():
Alice's version:
- Purity: ✅ Pure function
- Tests: 10/10 passing
Bob's version:
- Purity: ✅ Pure function
- Tests: 12/12 passing (includes edge cases)
AI Recommendation: Keep Bob's version (confidence: 85%)
Reason: More comprehensive tests, still pureSee the Git directive MD files in src/aifp/reference/directives/ for complete multi-user collaboration workflows.
graph TD
A[aifp_init] --> B[project_discovery]
B --> C[project_progression]
C --> D[project_file_write]
D --> E[project_update_db]
E --> F{All Items Done?}
F -->|No| D
F -->|Yes| G[project_task_complete]
G --> H{All Tasks Done?}
H -->|No| C
H -->|Yes| I[project_milestone_complete]
I --> J{All Milestones Done?}
J -->|No| C
J -->|Yes| K[project_completion_check]
K --> L[project_archive]User: "Help me build a matrix calculator"
AI → aifp_run(is_new_session=true)
→ Receives: session bundle (directive names, status, settings, supportive context)
→ Checks project state: .aifp-project/ missing → not initialized
→ Calls aifp_init helper (Phase 1: mechanical setup)
→ Creates .aifp-project/ directory
→ Creates project.db, user_preferences.db
→ Copies ProjectBlueprint template
→ Enters Phase 2 (intelligent population)
→ Detects language, build tool, source directory
→ Discusses with user: project name, purpose, goals
→ Updates infrastructure table and blueprint
→ Routes to project_discovery
→ Collaborates with user on themes, flows, completion path, milestones
AI: ✅ Project initialized: MatrixCalculator
Next: Let's define the project shape — themes, completion path, and first milestones.User: "Write multiply_matrices function"
AI → aifp_run() (continuation — lightweight guidance)
→ Evaluates: coding task + project tracking needed
→ Has directives cached from session bundle
→ Writes FP-compliant function naturally (pure, immutable, no OOP)
→ Follows project_file_write directive workflow:
→ Reserves file and function IDs in project.db
→ Writes src/matrix.py with embedded IDs
→ Finalizes file and function entries
→ Updates project.db:
• files table (new entry)
• functions table (multiply_matrices)
• interactions table (dependencies)
AI: ✅ Function written: multiply_matrices
File: src/matrix.py:15
DB Updated: ✓ files, functions, interactions
Dependencies: validate_dimensionsUser: "Check project compliance"
AI → aifp_run() (continuation — lightweight guidance)
→ project_compliance_check directive (opt-in tracking feature)
→ Queries all functions from project.db
→ Reviews each function against FP baseline
→ Generates analytics report
AI: 📊 Compliance Report:
Total functions: 12
Compliant: 10
Violations: 2
- calculate_discount (uses global config)
- process_order (hidden mutation)User: "Always add docstrings to functions"
AI → aifp_run() (continuation — lightweight guidance)
→ user_preferences_update directive
→ Calls find_directive_by_intent helper
→ Searches directives by name/description/keywords
→ Finds match: project_file_write
→ Confirms with user: "Apply to file writing?"
→ Updates user_preferences.db
AI: ✅ Preference saved: project_file_write
Key: always_add_docstrings
Value: true
Next file write will include docstrings automatically.User: "Actually, use guard clauses instead of nested if statements"
AI → user_preferences_learn directive (detects correction)
→ Logs interaction to ai_interaction_log
→ Infers preference: prefer_guard_clauses = true
→ Prompts user: "Should I remember this preference?"
User: "Yes"
AI: ✅ Preference learned: project_file_write
Key: prefer_guard_clauses
Value: true
I'll use guard clauses in future functions.All directive documentation is shipped with the package at src/aifp/reference/directives/ — 129 MD files covering every directive. Each file includes: purpose, when to apply, complete workflows (trunk → branches), compliant/non-compliant examples, edge cases, related directives, helper functions used, and database operations.
Schema SQL files are in the package at src/aifp/database/schemas/:
aifp_core.sql — Global read-only database (directives, helpers, flows)project.sql — Per-project mutable database (files, functions, tasks, milestones)user_preferences.sql — Per-project user customization databaseuser_directives.sql — Per-project automation directives (Use Case 2 only)dev/)The dev/ directory contains the source of truth for directive and helper function definitions. These JSON files are the canonical definitions that get imported into aifp_core.db before release.
dev/
├── directives-json/ # Directive definitions (source of truth)
│ ├── directives-fp-core.json # Core FP directives
│ ├── directives-fp-aux.json # Auxiliary FP directives
│ ├── directives-project.json # Project lifecycle directives
│ ├── directives-user-pref.json # User preference directives
│ ├── directives-user-system.json # User automation directives
│ ├── directives-git.json # Git collaboration directives
│ ├── directive_flow_fp.json # FP directive flow transitions
│ ├── directive_flow_project.json # Project directive flow transitions
│ └── directive_flow_user_preferences.json # User pref flow transitions
├── helpers-json/ # Helper function definitions (source of truth)
│ ├── helpers-core.json # Core/directive helpers
│ ├── helpers-orchestrators.json # Entry point and status helpers
│ ├── helpers-project-*.json # Project management helpers (9 files)
│ ├── helpers-settings.json # User preference helpers
│ ├── helpers-user-custom.json # User directive helpers
│ ├── helpers-git.json # Git operation helpers
│ └── helpers-index.json # Shared/global helpers
├── sync-directives.py # Imports JSON → aifp_core.db
└── logs/ # Development logsDev workflow: Modify JSON files in dev/ → run sync-directives.py to rebuild aifp_core.db → test → release. End users only interact with the pre-populated aifp_core.db, never the JSON files directly.
All three must be kept in sync when bumping versions:
| File | Variable | Purpose |
|---|---|---|
pyproject.toml | version = "X.Y.Z" | Package version (PyPI, pip install) |
src/aifp/__init__.py | __version__ = "X.Y.Z" | Runtime version (import aifp; aifp.__version__) |
src/aifp/mcp_server/server.py | SERVER_VERSION = "X.Y.Z" | MCP initialize handshake response (serverInfo.version) |
aifp_core.db is the rulebook (read-only, global, version-controlled)project.db is the workspace (read-write, per-project, runtime state)user_preferences.db is the customization layer (read-write, per-project, AI behavior)Traditional AI assistants lack persistent memory. AIFP solves this:
-- AI remembers everything across sessions via helper tools
AI calls: get_project_status("detailed")
→ Returns: project metadata, active milestone, current task, recent notes, tracked files and functions
-- No source code reparsing required. Instant context retrieval.Every AIFP project has a completion path:
Setup → Core Development → Testing → Documentation → Finalization
Once project_completion_check passes, the project is done. No endless feature creep.
watchdog), custom JSON-RPC server uses stdlib onlyAIFP's project management adds token overhead to each session. Database operations (tracking files, updating tasks, managing milestones) consume tokens beyond the code-writing itself. We work to minimize this — continuation calls are lightweight (~2k tokens), batch helpers reduce round-trips, and all optional tracking is off by default.
The payoff comes with project scale. Without AIFP, every new session requires the AI to re-scan directories, re-read source files, and rebuild context from scratch — costs that grow with codebase size. With AIFP, the database provides instant structured context: the AI knows exactly which files exist, what functions they contain, where work left off, and what comes next. For projects beyond a handful of files, the up-front tracking cost is recovered many times over through eliminated re-discovery work.
User prompt: "Help me build a calculator"
Tool calls:
1. aifp_run(is_new_session=true)
→ Returns: session bundle (directive names, settings, project status, supportive context)
→ Status shows: .aifp-project/ missing — not initialized
2. aifp_init(project_root="/home/user/calculator")
→ Returns: { success: true, message: "Project initialized" }What happens:
aifp_init helper.aifp-project/ directory with project.db, user_preferences.db, and ProjectBlueprint.mdproject_discovery for collaborative planning (themes, flows, completion path, milestones)User prompt: "Write a multiply_matrices function"
Tool calls:
1. aifp_run(is_new_session=false)
→ Returns: lightweight guidance
2. reserve_file(name="matrix_operations", path="src/matrix_operations.py", language="Python")
→ Returns: { success: true, id: 42 }
3. reserve_function(name="multiply_matrices", file_id=42, purpose="Multiply two matrices")
→ Returns: { success: true, id: 99 }
(AI writes FP-compliant code to src/matrix_operations_id_42.py)
4. finalize_file(file_id=42, path="src/matrix_operations_id_42.py", ...)
→ Returns: { success: true }
5. finalize_function(function_id=99, name="multiply_matrices_id_99", file_id=42, purpose="...", parameters=[...], returns={...})
→ Returns: { success: true }What happens:
project.db before writing (IDs embedded in names)User prompt: "Where are we?" or "Continue working"
Tool calls:
1. aifp_run(is_new_session=false)
→ Returns: guidance + common starting points
(AI answers from cached context — no additional DB calls needed
unless context is stale, in which case:)
2. aifp_status(type="detailed")
→ Returns: project metadata, active milestone, current task, recent notes, warningsWhat happens:
project_continue_on_start=true, AI automatically picks up the next taskproject.dbAIFP runs entirely on your local machine. No data ever leaves your computer.
.aifp-project/ directory. You own and control all data.If you have questions about data handling, please open an issue on our GitHub repository.
AIFP is an open standard for AI-optimized programming. Contributions welcome:
MIT License - See LICENSE for details.
AIFP transforms AI from a "code generator" into a structured, customizable project collaborator.
It combines:
The result: AI-maintained codebases that are predictable, traceable, customizable, and maintainable across sessions, teams, and even different AI assistants.
Built for the age of AI-native development.