← 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
M internal/generator/generator.goM internal/generator/templates/store.go.tmpl
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 →