step 2: init command + SQLite storage + migrations + config
- storage.go: DB wrapper, migration runner (in-code SQL strings) - migrations.go: 001_init (nodes + node_meta + indexes) - vault.go: Init() creates .verstak/ dirs, config.yml, index.db - config.go: YAML config read/write - util/uuid.go: UUIDv7 generator - cmd/verstak/main.go: init --vault PATH command - main_test.go: TestInitCreatesVault, TestInitConfigYAML Acceptance: go build ./... pass, go test ./... pass Init creates test-vault with .verstak/index.db + config.yml Repeat Init is safe.
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
// Config lives at .verstak/config.yml inside the vault.
|
||||
type Config struct {
|
||||
Engine EngineConfig `yaml:"engine"`
|
||||
Sync SyncConfig `yaml:"sync"`
|
||||
Browser BrowserConfig `yaml:"browser"`
|
||||
}
|
||||
|
||||
type EngineConfig struct {
|
||||
Version int `yaml:"version"`
|
||||
VaultID string `yaml:"vault_id"`
|
||||
CreatedAt string `yaml:"created_at"`
|
||||
VaultRoot string `yaml:"vault_root"`
|
||||
}
|
||||
|
||||
type SyncConfig struct {
|
||||
ServerURL string `yaml:"server_url"`
|
||||
APIKey string `yaml:"api_key"`
|
||||
DeviceID string `yaml:"device_id"`
|
||||
AutoSync bool `yaml:"auto_sync"`
|
||||
}
|
||||
|
||||
type BrowserConfig struct {
|
||||
Enabled bool `yaml:"enabled"`
|
||||
LocalPort int `yaml:"local_port"`
|
||||
}
|
||||
|
||||
// Load reads .verstak/config.yml from the vault root.
|
||||
func Load(vaultRoot string) (*Config, error) {
|
||||
path := filepath.Join(vaultRoot, ".verstak", "config.yml")
|
||||
data, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("read config: %w", err)
|
||||
}
|
||||
var cfg Config
|
||||
if err := yaml.Unmarshal(data, &cfg); err != nil {
|
||||
return nil, fmt.Errorf("parse config: %w", err)
|
||||
}
|
||||
return &cfg, nil
|
||||
}
|
||||
|
||||
// Save writes the config file.
|
||||
func Save(vaultRoot string, cfg *Config) error {
|
||||
path := filepath.Join(vaultRoot, ".verstak", "config.yml")
|
||||
dir := filepath.Dir(path)
|
||||
if err := os.MkdirAll(dir, 0o750); err != nil {
|
||||
return err
|
||||
}
|
||||
data, err := yaml.Marshal(cfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return os.WriteFile(path, data, 0o640)
|
||||
}
|
||||
|
||||
// MetaPath returns the path inside the vault for sqlite db etc.
|
||||
func MetaDir(vaultRoot string) string {
|
||||
return filepath.Join(vaultRoot, ".verstak")
|
||||
}
|
||||
Reference in New Issue
Block a user