Files
Maven/internal/store/migrations.go
T
kami 6b80fd0c0f tools: add scope column for capability model
Add a 'scope' TEXT column (default 'homelab') to the tools table so tools
can be namespaced by scope (e.g. "homelab:restart", "datacenter:reboot").
Backward-compat: bare name defaults to "homelab" scope.

Changes:
- Migration #1: ALTER TABLE tools ADD COLUMN scope
- store.Tool: add Scope field, update all SQL and scanTool()
- ipc.Tool DTO and request types: add Scope field
- CoreAPI interface: pass scope in ProposeTool/EnableTool
- storeAPI adapters: forward scope
- cmd/mavend/voice: pass scope (empty → homelab)
- cmd/mavweb/tools: show scope column in UI tables, hidden fields
- All tests updated for scope field
- Migration test made dynamic (startVer = len(migrations))
2026-07-05 11:40:15 +04:00

52 lines
1.8 KiB
Go

package store
import (
"context"
"database/sql"
"fmt"
)
// migrations are ordered, forward-only schema steps applied after schema.sql.
// Index i (1-based) is the user_version the step at migrations[i-1] brings the
// DB TO; there is no step 0 — schema.sql is the idempotent baseline (version 0).
// An empty slice is a clean no-op that leaves user_version at 0.
//
// To add migration #1 (e.g. the sqlcipher rekey), append its SQL:
//
// var migrations = []string{
// `ALTER TABLE ...;`, // #1
// }
var migrations = []string{
`ALTER TABLE tools ADD COLUMN scope TEXT NOT NULL DEFAULT 'homelab';`,
}
// migrate applies every migration with a number greater than the DB's current
// user_version, each in its own transaction that also bumps user_version. Fails
// closed: the first erroring step aborts and leaves prior steps committed.
func migrate(ctx context.Context, db *sql.DB) error {
var current int
if err := db.QueryRowContext(ctx, "PRAGMA user_version").Scan(&current); err != nil {
return fmt.Errorf("read user_version: %w", err)
}
for i := current; i < len(migrations); i++ {
version := i + 1 // 1-based: migrations[i] brings DB to `version`
tx, err := db.BeginTx(ctx, nil)
if err != nil {
return fmt.Errorf("migration %d begin: %w", version, err)
}
if _, err := tx.ExecContext(ctx, migrations[i]); err != nil {
_ = tx.Rollback()
return fmt.Errorf("migration %d: %w", version, err)
}
// PRAGMA user_version can't be parameterized; version is our own int.
if _, err := tx.ExecContext(ctx, fmt.Sprintf("PRAGMA user_version = %d", version)); err != nil {
_ = tx.Rollback()
return fmt.Errorf("migration %d bump: %w", version, err)
}
if err := tx.Commit(); err != nil {
return fmt.Errorf("migration %d commit: %w", version, err)
}
}
return nil
}