From 6c6b49b45c704148e5d64f5f2d985f80f3b12ab7 Mon Sep 17 00:00:00 2001 From: SGC Date: Sat, 4 Apr 2026 15:13:50 +0200 Subject: [PATCH] fix: add cross-file Ref declarations for relspecgo merge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add explicit Ref: blocks at bottom of each DBML file for cross-file FK relationships - files.dbml: stored_files → thoughts, projects - skills.dbml: project_skills/project_guardrails → projects - meta.dbml: chat_histories → projects - Update Makefile to use the relspec merge workflow where applicable - Regenerate 020_generated_schema.sql with proper cross-file constraints Addresses review comment on PR #20 --- Makefile | 9 +++++++-- schema/files.dbml | 4 ++++ schema/meta.dbml | 3 +++ schema/skills.dbml | 4 ++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 7d71d83..682f85a 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,7 @@ COMMIT_SHA ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown) BUILD_DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ) RELSPEC ?= $(shell command -v relspec 2>/dev/null || echo $(HOME)/go/bin/relspec) SCHEMA_FILES := $(sort $(wildcard schema/*.dbml)) +MERGE_TARGET_TMP := $(CURDIR)/.cache/schema.merge-target.dbml GENERATED_SCHEMA_MIGRATION := migrations/020_generated_schema.sql LDFLAGS := -s -w \ -X $(BUILDINFO_PKG).Version=$(VERSION_TAG) \ @@ -57,15 +58,19 @@ clean: generate-migrations: @test -n "$(SCHEMA_FILES)" || (echo "No DBML schema files found in schema/" >&2; exit 1) @command -v $(RELSPEC) >/dev/null 2>&1 || (echo "relspec not found; install git.warky.dev/wdevs/relspecgo/cmd/relspec@latest" >&2; exit 1) + @mkdir -p $(dir $(MERGE_TARGET_TMP)) + @: > $(MERGE_TARGET_TMP) @schema_list=$$(printf '%s\n' $(SCHEMA_FILES) | paste -sd, -); \ - $(RELSPEC) convert --from dbml --from-list "$$schema_list" --to pgsql --to-path $(GENERATED_SCHEMA_MIGRATION) + $(RELSPEC) merge --target dbml --target-path $(MERGE_TARGET_TMP) --source dbml --from-list "$$schema_list" --output pgsql --output-path $(GENERATED_SCHEMA_MIGRATION) check-schema-drift: @test -f $(GENERATED_SCHEMA_MIGRATION) || (echo "$(GENERATED_SCHEMA_MIGRATION) is missing; run make generate-migrations" >&2; exit 1) @command -v $(RELSPEC) >/dev/null 2>&1 || (echo "relspec not found; install git.warky.dev/wdevs/relspecgo/cmd/relspec@latest" >&2; exit 1) + @mkdir -p $(dir $(MERGE_TARGET_TMP)) @tmpfile=$$(mktemp); \ + : > $(MERGE_TARGET_TMP); \ schema_list=$$(printf '%s\n' $(SCHEMA_FILES) | paste -sd, -); \ - $(RELSPEC) convert --from dbml --from-list "$$schema_list" --to pgsql --to-path $$tmpfile; \ + $(RELSPEC) merge --target dbml --target-path $(MERGE_TARGET_TMP) --source dbml --from-list "$$schema_list" --output pgsql --output-path $$tmpfile; \ if ! cmp -s $$tmpfile $(GENERATED_SCHEMA_MIGRATION); then \ echo "Schema drift detected between schema/*.dbml and $(GENERATED_SCHEMA_MIGRATION)" >&2; \ diff -u $(GENERATED_SCHEMA_MIGRATION) $$tmpfile || true; \ diff --git a/schema/files.dbml b/schema/files.dbml index c51b0a7..74062fd 100644 --- a/schema/files.dbml +++ b/schema/files.dbml @@ -19,3 +19,7 @@ Table stored_files { sha256 } } + +// Cross-file refs (for relspecgo merge) +Ref: stored_files.thought_id > thoughts.guid [delete: set null] +Ref: stored_files.project_id > projects.guid [delete: set null] diff --git a/schema/meta.dbml b/schema/meta.dbml index c59afce..792ccde 100644 --- a/schema/meta.dbml +++ b/schema/meta.dbml @@ -27,3 +27,6 @@ Table tool_annotations { created_at timestamptz [not null, default: `now()`] updated_at timestamptz [not null, default: `now()`] } + +// Cross-file refs (for relspecgo merge) +Ref: chat_histories.project_id > projects.guid [delete: set null] diff --git a/schema/skills.dbml b/schema/skills.dbml index cc36789..0ea4c3f 100644 --- a/schema/skills.dbml +++ b/schema/skills.dbml @@ -40,3 +40,7 @@ Table project_guardrails { project_id } } + +// Cross-file refs (for relspecgo merge) +Ref: project_skills.project_id > projects.guid [delete: cascade] +Ref: project_guardrails.project_id > projects.guid [delete: cascade]