From 1c7291e17de3f5788fce6159a4c9b7527db6ccae Mon Sep 17 00:00:00 2001 From: Eric Rakestraw Date: Wed, 5 Aug 2026 00:43:39 +0000 Subject: [PATCH] Centralize spell and combat-turn assets --- .../prompts/dnd.combat_turns.yaml | 0 .../dnd/combat-turns}/prompts/instructions.md | 0 .../dnd/combat-turns}/prompts/task.md | 0 .../schemas/dnd_combat_turns_llm.v1.json | 0 .../dnd/spells}/prompts/catalog.md | 0 .../dnd/spells}/prompts/dnd.spells.yaml | 0 .../dnd/spells}/prompts/instructions.md | 0 .../dnd/spells}/prompts/task.md | 0 .../spells}/schemas/dnd_spells_llm.v1.json | 0 .../modules/dnd/extract/combatturns/assets.go | 6 --- .../dnd/extract/combatturns/prompt_assets.go | 35 +++++++++++++++--- .../modules/dnd/extract/combatturns/schema.go | 8 +++- internal/modules/dnd/extract/spells/assets.go | 6 --- .../dnd/extract/spells/prompt_assets.go | 37 +++++++++++++++---- internal/modules/dnd/extract/spells/schema.go | 8 +++- 15 files changed, 71 insertions(+), 29 deletions(-) rename {internal/modules/dnd/extract/combatturns/assets => assets/dnd/combat-turns}/prompts/dnd.combat_turns.yaml (100%) rename {internal/modules/dnd/extract/combatturns/assets => assets/dnd/combat-turns}/prompts/instructions.md (100%) rename {internal/modules/dnd/extract/combatturns/assets => assets/dnd/combat-turns}/prompts/task.md (100%) rename {internal/modules/dnd/extract/combatturns/assets => assets/dnd/combat-turns}/schemas/dnd_combat_turns_llm.v1.json (100%) rename {internal/modules/dnd/extract/spells/assets => assets/dnd/spells}/prompts/catalog.md (100%) rename {internal/modules/dnd/extract/spells/assets => assets/dnd/spells}/prompts/dnd.spells.yaml (100%) rename {internal/modules/dnd/extract/spells/assets => assets/dnd/spells}/prompts/instructions.md (100%) rename {internal/modules/dnd/extract/spells/assets => assets/dnd/spells}/prompts/task.md (100%) rename {internal/modules/dnd/extract/spells/assets => assets/dnd/spells}/schemas/dnd_spells_llm.v1.json (100%) delete mode 100644 internal/modules/dnd/extract/combatturns/assets.go delete mode 100644 internal/modules/dnd/extract/spells/assets.go diff --git a/internal/modules/dnd/extract/combatturns/assets/prompts/dnd.combat_turns.yaml b/assets/dnd/combat-turns/prompts/dnd.combat_turns.yaml similarity index 100% rename from internal/modules/dnd/extract/combatturns/assets/prompts/dnd.combat_turns.yaml rename to assets/dnd/combat-turns/prompts/dnd.combat_turns.yaml diff --git a/internal/modules/dnd/extract/combatturns/assets/prompts/instructions.md b/assets/dnd/combat-turns/prompts/instructions.md similarity index 100% rename from internal/modules/dnd/extract/combatturns/assets/prompts/instructions.md rename to assets/dnd/combat-turns/prompts/instructions.md diff --git a/internal/modules/dnd/extract/combatturns/assets/prompts/task.md b/assets/dnd/combat-turns/prompts/task.md similarity index 100% rename from internal/modules/dnd/extract/combatturns/assets/prompts/task.md rename to assets/dnd/combat-turns/prompts/task.md diff --git a/internal/modules/dnd/extract/combatturns/assets/schemas/dnd_combat_turns_llm.v1.json b/assets/dnd/combat-turns/schemas/dnd_combat_turns_llm.v1.json similarity index 100% rename from internal/modules/dnd/extract/combatturns/assets/schemas/dnd_combat_turns_llm.v1.json rename to assets/dnd/combat-turns/schemas/dnd_combat_turns_llm.v1.json diff --git a/internal/modules/dnd/extract/spells/assets/prompts/catalog.md b/assets/dnd/spells/prompts/catalog.md similarity index 100% rename from internal/modules/dnd/extract/spells/assets/prompts/catalog.md rename to assets/dnd/spells/prompts/catalog.md diff --git a/internal/modules/dnd/extract/spells/assets/prompts/dnd.spells.yaml b/assets/dnd/spells/prompts/dnd.spells.yaml similarity index 100% rename from internal/modules/dnd/extract/spells/assets/prompts/dnd.spells.yaml rename to assets/dnd/spells/prompts/dnd.spells.yaml diff --git a/internal/modules/dnd/extract/spells/assets/prompts/instructions.md b/assets/dnd/spells/prompts/instructions.md similarity index 100% rename from internal/modules/dnd/extract/spells/assets/prompts/instructions.md rename to assets/dnd/spells/prompts/instructions.md diff --git a/internal/modules/dnd/extract/spells/assets/prompts/task.md b/assets/dnd/spells/prompts/task.md similarity index 100% rename from internal/modules/dnd/extract/spells/assets/prompts/task.md rename to assets/dnd/spells/prompts/task.md diff --git a/internal/modules/dnd/extract/spells/assets/schemas/dnd_spells_llm.v1.json b/assets/dnd/spells/schemas/dnd_spells_llm.v1.json similarity index 100% rename from internal/modules/dnd/extract/spells/assets/schemas/dnd_spells_llm.v1.json rename to assets/dnd/spells/schemas/dnd_spells_llm.v1.json diff --git a/internal/modules/dnd/extract/combatturns/assets.go b/internal/modules/dnd/extract/combatturns/assets.go deleted file mode 100644 index ca856cf..0000000 --- a/internal/modules/dnd/extract/combatturns/assets.go +++ /dev/null @@ -1,6 +0,0 @@ -package combatturns - -import "embed" - -//go:embed assets/schemas/dnd_combat_turns_llm.v1.json assets/prompts/*.yaml assets/prompts/*.md -var embeddedAssets embed.FS diff --git a/internal/modules/dnd/extract/combatturns/prompt_assets.go b/internal/modules/dnd/extract/combatturns/prompt_assets.go index 9d64335..09926d4 100644 --- a/internal/modules/dnd/extract/combatturns/prompt_assets.go +++ b/internal/modules/dnd/extract/combatturns/prompt_assets.go @@ -2,8 +2,10 @@ package combatturns import ( "fmt" + "io/fs" "sync" + rootassets "gitea.maximumdirect.net/eric/notarius/assets" "gitea.maximumdirect.net/eric/notarius/internal/framework/llm" "gitea.maximumdirect.net/eric/notarius/internal/framework/promptfs" "gitea.maximumdirect.net/eric/notarius/internal/modules/dnd/shared" @@ -14,9 +16,9 @@ const promptAssetRoot = "assets/prompts" var promptAssetManifest = shared.PromptAssetManifest{ ModuleDir: "dnd.combat_turns", ModuleFiles: []promptfs.ModulePromptFile{ - {Name: "dnd.combat_turns.yaml", Path: "assets/prompts/dnd.combat_turns.yaml"}, - {Name: "task.md", Path: "assets/prompts/task.md"}, - {Name: "instructions.md", Path: "assets/prompts/instructions.md"}, + {Name: "dnd.combat_turns.yaml", Path: "prompts/dnd.combat_turns.yaml"}, + {Name: "task.md", Path: "prompts/task.md"}, + {Name: "instructions.md", Path: "prompts/instructions.md"}, }, SharedFiles: []string{ "common-dnd-system.md", @@ -28,20 +30,41 @@ var promptAssetManifest = shared.PromptAssetManifest{ }, } +func moduleAssetFS() (fs.FS, error) { + assets, err := fs.Sub(rootassets.FS(), "dnd/combat-turns") + if err != nil { + return nil, fmt.Errorf("scope combat-turn assets: %w", err) + } + return assets, nil +} + func RegisterPromptAssets(registry *llm.AssetRegistry) error { - promptFS, err := promptAssetManifest.PromptFS(embeddedAssets) + assets, err := moduleAssetFS() + if err != nil { + return err + } + promptFS, err := promptAssetManifest.PromptFS(assets) if err != nil { return fmt.Errorf("prepare combat-turn prompt assets: %w", err) } if err := registry.RegisterPromptFS(promptFS, promptAssetRoot); err != nil { return err } - return registry.RegisterSchemaFS(embeddedAssets, "assets/schemas") + schemas, err := fs.Sub(assets, "schemas") + if err != nil { + return fmt.Errorf("scope combat-turn schemas: %w", err) + } + return registry.RegisterSchemaFS(schemas, ".") } func promptAssetMetadata() (string, error) { promptAssetHashOnce.Do(func() { - promptAssetHash, promptAssetHashErr = promptAssetManifest.Hash(embeddedAssets) + assets, err := moduleAssetFS() + if err != nil { + promptAssetHashErr = err + return + } + promptAssetHash, promptAssetHashErr = promptAssetManifest.Hash(assets) }) return promptAssetHash, promptAssetHashErr } diff --git a/internal/modules/dnd/extract/combatturns/schema.go b/internal/modules/dnd/extract/combatturns/schema.go index a1c7410..5021c86 100644 --- a/internal/modules/dnd/extract/combatturns/schema.go +++ b/internal/modules/dnd/extract/combatturns/schema.go @@ -11,11 +11,15 @@ const ( ) func loadResponseSchema() (llm.ResponseSchema, error) { - return llm.LoadResponseSchema(embeddedAssets, llm.ResponseSchemaDefinition{ + assets, err := moduleAssetFS() + if err != nil { + return llm.ResponseSchema{}, err + } + return llm.LoadResponseSchema(assets, llm.ResponseSchemaDefinition{ Key: ResponseSchemaKey, ID: ResponseSchemaID, Version: SchemaVersion, Name: ResponseSchemaName, - AssetPath: "assets/schemas/dnd_combat_turns_llm.v1.json", + AssetPath: "schemas/dnd_combat_turns_llm.v1.json", }) } diff --git a/internal/modules/dnd/extract/spells/assets.go b/internal/modules/dnd/extract/spells/assets.go deleted file mode 100644 index 3baa086..0000000 --- a/internal/modules/dnd/extract/spells/assets.go +++ /dev/null @@ -1,6 +0,0 @@ -package spells - -import "embed" - -//go:embed assets/schemas/dnd_spells_llm.v1.json assets/prompts/*.yaml assets/prompts/*.md -var embeddedAssets embed.FS diff --git a/internal/modules/dnd/extract/spells/prompt_assets.go b/internal/modules/dnd/extract/spells/prompt_assets.go index f5d9ae3..b5939dd 100644 --- a/internal/modules/dnd/extract/spells/prompt_assets.go +++ b/internal/modules/dnd/extract/spells/prompt_assets.go @@ -2,8 +2,10 @@ package spells import ( "fmt" + "io/fs" "sync" + rootassets "gitea.maximumdirect.net/eric/notarius/assets" "gitea.maximumdirect.net/eric/notarius/internal/framework/llm" "gitea.maximumdirect.net/eric/notarius/internal/framework/promptfs" "gitea.maximumdirect.net/eric/notarius/internal/modules/dnd/shared" @@ -14,10 +16,10 @@ const promptAssetRoot = "assets/prompts" var promptAssetManifest = shared.PromptAssetManifest{ ModuleDir: "dnd.spells", ModuleFiles: []promptfs.ModulePromptFile{ - {Name: "dnd.spells.yaml", Path: "assets/prompts/dnd.spells.yaml"}, - {Name: "catalog.md", Path: "assets/prompts/catalog.md"}, - {Name: "task.md", Path: "assets/prompts/task.md"}, - {Name: "instructions.md", Path: "assets/prompts/instructions.md"}, + {Name: "dnd.spells.yaml", Path: "prompts/dnd.spells.yaml"}, + {Name: "catalog.md", Path: "prompts/catalog.md"}, + {Name: "task.md", Path: "prompts/task.md"}, + {Name: "instructions.md", Path: "prompts/instructions.md"}, }, SharedFiles: []string{ "common-dnd-system.md", @@ -29,20 +31,41 @@ var promptAssetManifest = shared.PromptAssetManifest{ }, } +func moduleAssetFS() (fs.FS, error) { + assets, err := fs.Sub(rootassets.FS(), "dnd/spells") + if err != nil { + return nil, fmt.Errorf("scope spell assets: %w", err) + } + return assets, nil +} + func RegisterPromptAssets(registry *llm.AssetRegistry) error { - promptFS, err := promptAssetManifest.PromptFS(embeddedAssets) + assets, err := moduleAssetFS() + if err != nil { + return err + } + promptFS, err := promptAssetManifest.PromptFS(assets) if err != nil { return fmt.Errorf("prepare spell prompt assets: %w", err) } if err := registry.RegisterPromptFS(promptFS, promptAssetRoot); err != nil { return err } - return registry.RegisterSchemaFS(embeddedAssets, "assets/schemas") + schemas, err := fs.Sub(assets, "schemas") + if err != nil { + return fmt.Errorf("scope spell schemas: %w", err) + } + return registry.RegisterSchemaFS(schemas, ".") } func promptAssetMetadata() (string, error) { promptAssetHashOnce.Do(func() { - promptAssetHash, promptAssetHashErr = promptAssetManifest.Hash(embeddedAssets) + assets, err := moduleAssetFS() + if err != nil { + promptAssetHashErr = err + return + } + promptAssetHash, promptAssetHashErr = promptAssetManifest.Hash(assets) }) return promptAssetHash, promptAssetHashErr } diff --git a/internal/modules/dnd/extract/spells/schema.go b/internal/modules/dnd/extract/spells/schema.go index f16f129..40aca30 100644 --- a/internal/modules/dnd/extract/spells/schema.go +++ b/internal/modules/dnd/extract/spells/schema.go @@ -10,11 +10,15 @@ const ( ) func loadResponseSchema() (llm.ResponseSchema, error) { - return llm.LoadResponseSchema(embeddedAssets, llm.ResponseSchemaDefinition{ + assets, err := moduleAssetFS() + if err != nil { + return llm.ResponseSchema{}, err + } + return llm.LoadResponseSchema(assets, llm.ResponseSchemaDefinition{ Key: ResponseSchemaKey, ID: ResponseSchemaID, Version: SchemaVersion, Name: ResponseSchemaName, - AssetPath: "assets/schemas/dnd_spells_llm.v1.json", + AssetPath: "schemas/dnd_spells_llm.v1.json", }) }