87e0b9359e
Add 4 new custom modes with BigMind guidance: - rules-bigmind/: Introspective Patrick mode (BigMind development) - rules-homelab/: Tinkerer Patrick mode (TrueNAS, Docker, infra) - rules-mcp-builder/: Craftsman Patrick mode (pi_mcps MCP servers) - rules-paisy/: Professional Patrick mode (ADP Germany payroll) Add reusable skills: - skills/assessment-first/: structured assessment.md before implementation - skills/bigmind-session-ritual/: mandatory session start/end ritual - skills/gitea-push/: conventional commit + Gitea push workflow - skills/new-mcp-server/: FastMCP scaffold procedure - skills-bigmind/, skills-homelab/, skills-mcp-builder/, skills-paisy/: mode-specific skill dirs Update existing rules: - rules-architect, rules-ask, rules-code, rules-debug, rules-orchestrator: add BigMind session guidance (search before task, announce focus, hypotheses) Add plans/MODES_AND_SKILLS_PLAN.md: full architecture document
3.3 KiB
3.3 KiB
name, description
| name | description |
|---|---|
| bigmind-migration | Scaffolds a new BigMind database schema migration (v_n to v_{n+1}), including the migration function, SCHEMA_VERSION bump, and test stubs. Use this skill when adding new tables or columns to the BigMind SQLite database. |
BigMind Migration
When to use
- Adding a new table to BigMind
- Adding columns to an existing table
- Creating a new FTS5 virtual table
When NOT to use
- Non-schema changes (just code, no DB structure changes)
- Dropping or renaming columns (requires extra deprecation care — discuss first)
Inputs required
- Current schema version — check
SCHEMA_VERSIONindb.py - New version —
current + 1 - Changes — what tables/columns are being added
Workflow
Step 1 — Read current schema
grep -n "SCHEMA_VERSION" ~/.mcp/bigmind/bigmind/db.py
grep -n "_migrate_v" ~/.mcp/bigmind/bigmind/db.py
Know what version you're migrating FROM.
Step 2 — Write migration function in db.py
Add after the last existing migration function:
def _migrate_v{N}_to_v{N+1}(conn):
"""Add {description of change}."""
cursor = conn.cursor()
# Example: new table
cursor.execute("""
CREATE TABLE IF NOT EXISTS {table_name} (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
-- other columns
FOREIGN KEY (user_id) REFERENCES users(id)
)
""")
# Example: FTS5 virtual table
cursor.execute("""
CREATE VIRTUAL TABLE IF NOT EXISTS {table_name}_fts
USING fts5(content, tokenize='porter')
""")
conn.commit()
Step 3 — Wire into init_db()
In the migration chain inside init_db():
SCHEMA_VERSION = {N+1} # bump this
# In the migration section:
if current_version < {N+1}:
_migrate_v{N}_to_v{N+1}(conn)
current_version = {N+1}
Step 4 — Write tests
In tests/test_memory_store.py (or a new test file):
class TestMigration_v{N}_to_v{N+1}:
def test_fresh_db_has_new_table(self, tmp_path):
db_path = tmp_path / "test.db"
conn = get_connection(str(db_path))
init_db(conn)
# Assert new table exists
cursor = conn.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}'")
assert cursor.fetchone() is not None
def test_existing_db_migrates_cleanly(self, tmp_path):
# Create a v{N} db, then run init_db() and check migration ran
...
Step 5 — Run full test suite
cd ~/.mcp/bigmind
uv run pytest tests/ -v
All tests must pass.
Step 6 — Store migration fact
memory_store_fact("codebase", "BigMind schema migrated v{N}→v{N+1}: added {description}. Migration function: _migrate_v{N}_to_v{N+1}.")
Troubleshooting
IF NOT EXISTSis your friend: Always use it so the migration is idempotent- FTS5 table ordering: Create the base table before the FTS5 virtual table that references it
- Migration not running: Check the
if current_version < X:guard — verifycurrent_versionis read correctly fromPRAGMA user_version - Test DB state: Use
tmp_pathfixture for isolated test databases — never test against the realmemory.db