[object Object]

← back to Cli Printing Press

feat(store): generate per-resource SQLite tables from profiler output

bbd0a47c69619509395da5cf016ec59ef6d09041 · 2026-03-25 21:38:13 -0700 · Matt Van Horn

store.go.tmpl now receives SyncableResources from the profiler and
generates per-resource named tables alongside the generic resources
table. For Discord, this creates tables for messages, members,
channels, etc. All existing methods remain unchanged (use generic
table). Per-resource tables provide domain-specific schema scaffolding.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Files touched

Diff

commit bbd0a47c69619509395da5cf016ec59ef6d09041
Author: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Date:   Wed Mar 25 21:38:13 2026 -0700

    feat(store): generate per-resource SQLite tables from profiler output
    
    store.go.tmpl now receives SyncableResources from the profiler and
    generates per-resource named tables alongside the generic resources
    table. For Discord, this creates tables for messages, members,
    channels, etc. All existing methods remain unchanged (use generic
    table). Per-resource tables provide domain-specific schema scaffolding.
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---
 internal/generator/generator.go            | 19 ++++++++++++++++---
 internal/generator/templates/store.go.tmpl |  7 +++++++
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/internal/generator/generator.go b/internal/generator/generator.go
index db86dd19..01d13ad9 100644
--- a/internal/generator/generator.go
+++ b/internal/generator/generator.go
@@ -20,6 +20,7 @@ type Generator struct {
 	Spec      *spec.APISpec
 	OutputDir string
 	VisionSet VisionTemplateSet
+	profile   *profiler.APIProfile
 	funcs     template.FuncMap
 }
 
@@ -192,17 +193,29 @@ func (g *Generator) Generate() error {
 	// Vision features: profile the API and render selected templates
 	if g.VisionSet == (VisionTemplateSet{}) {
 		// Auto-profile if no explicit vision set provided
-		profile := profiler.Profile(g.Spec)
-		plan := profile.ToVisionaryPlan(g.Spec.Name)
+		g.profile = profiler.Profile(g.Spec)
+		plan := g.profile.ToVisionaryPlan(g.Spec.Name)
 		g.VisionSet = SelectVisionTemplates(plan)
 	}
+	if g.profile == nil {
+		g.profile = profiler.Profile(g.Spec)
+	}
 
 	// Create store directory if needed
 	if g.VisionSet.Store {
 		if err := os.MkdirAll(filepath.Join(g.OutputDir, "internal", "store"), 0755); err != nil {
 			return fmt.Errorf("creating store dir: %w", err)
 		}
-		if err := g.renderTemplate("store.go.tmpl", filepath.Join("internal", "store", "store.go"), g.Spec); err != nil {
+		storeData := struct {
+			*spec.APISpec
+			SyncableResources []string
+			SearchableFields  map[string][]string
+		}{
+			APISpec:           g.Spec,
+			SyncableResources: g.profile.SyncableResources,
+			SearchableFields:  g.profile.SearchableFields,
+		}
+		if err := g.renderTemplate("store.go.tmpl", filepath.Join("internal", "store", "store.go"), storeData); err != nil {
 			return fmt.Errorf("rendering store: %w", err)
 		}
 	}
diff --git a/internal/generator/templates/store.go.tmpl b/internal/generator/templates/store.go.tmpl
index 16d3a48c..31f91933 100644
--- a/internal/generator/templates/store.go.tmpl
+++ b/internal/generator/templates/store.go.tmpl
@@ -66,6 +66,13 @@ func (s *Store) migrate() error {
 		`CREATE VIRTUAL TABLE IF NOT EXISTS resources_fts USING fts5(
 			id, resource_type, content, tokenize='porter unicode61'
 		)`,
+{{- range .SyncableResources}}
+		`CREATE TABLE IF NOT EXISTS {{snake .}} (
+			id TEXT PRIMARY KEY,
+			data JSON NOT NULL,
+			synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+		)`,
+{{- end}}
 	}
 
 	for _, m := range migrations {

← 611f4b67 feat(llmpolish): add LLM Vision Synthesis for domain-aware c  ·  back to Cli Printing Press  ·  feat(generator): add compound workflow template with archive d51d1e89 →