Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .clojure-skills/config.edn
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{:database {:path "~/dev/clojure-skills/clojure-skills.db",
:auto-migrate true},
:project {:root nil,
:skills-dir "skills",
:prompts-dir "prompts",
:build-dir "_build"},

:permissions
{:prompt true}

:search {:max-results 50, :context-lines 3},
:output {:format :table, :color true}}
Binary file modified clojure-skills.db
Binary file not shown.
3 changes: 2 additions & 1 deletion deps.edn
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
org.clj-commons/pretty {:mvn/version "3.6.7"}
dev.weavejester/hashp {:mvn/version "0.5.1"}
io.github.paintparty/bling {:mvn/version "0.8.8"}
dev.glossa/metazoa {:mvn/version "0.2.298"}

mvxcvi/puget {:mvn/version "1.3.4"}

;; SQL database dependencies
Expand All @@ -26,6 +26,7 @@

:aliases {:dev {:extra-deps
{vvvvalvalval/scope-capture {:mvn/version "0.3.3"}
dev.glossa/metazoa {:mvn/version "0.2.298"}
org.clojure/tools.nrepl {:mvn/version "0.2.11"}
nubank/matcher-combinators {:mvn/version "3.9.1"}
com.stuartsierra/component.repl {:mvn/version "0.2.0"}
Expand Down
2 changes: 1 addition & 1 deletion prompt_configs/clojure_build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ fragments:
- skills/libraries/metadata/metazoa.md
- skills/tooling/hashp.md
- skills/libraries/logging/pretty.md
- skills/tooling/clojure_lsp_api
- skills/tooling/clojure_lsp_api.md
- skills/tooling/clj_paren_repair.md
references: []
6 changes: 2 additions & 4 deletions prompt_configs/clojure_skill_builder.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@ fragments:
- skills/libraries/metadata/metazoa.md
- skills/tooling/hashp.md
- skills/libraries/logging/pretty.md
- skills/tooling/clojure_lsp_api
- skills/tooling/clojure_lsp_api.md
- skills/tooling/clj_paren_repair.md
- skills/tooling/clojure_mcp_light.md
- skills/libraries/data_formats/pretty.md

references: []
references: []
74 changes: 63 additions & 11 deletions resources/migrations/001-initial-schema.edn
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
:up
["PRAGMA foreign_keys = ON"

;; Skills table
"CREATE TABLE IF NOT EXISTS skills (
id INTEGER PRIMARY KEY AUTOINCREMENT,
path TEXT NOT NULL UNIQUE,
Expand All @@ -22,6 +23,7 @@
"CREATE INDEX IF NOT EXISTS idx_skills_name ON skills(name)"
"CREATE INDEX IF NOT EXISTS idx_skills_hash ON skills(file_hash)"

;; Prompts table (includes fragment_refs column from migration 006)
"CREATE TABLE IF NOT EXISTS prompts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
path TEXT NOT NULL UNIQUE,
Expand All @@ -33,25 +35,65 @@
file_hash TEXT NOT NULL,
size_bytes INTEGER NOT NULL,
token_count INTEGER,
fragment_refs TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
)"

"CREATE INDEX IF NOT EXISTS idx_prompts_name ON prompts(name)"
"CREATE INDEX IF NOT EXISTS idx_prompts_hash ON prompts(file_hash)"
;; Unique index on name (from migration 008)
"CREATE UNIQUE INDEX IF NOT EXISTS idx_prompts_name ON prompts(name)"

"CREATE TABLE IF NOT EXISTS prompt_skills (
prompt_id INTEGER NOT NULL,
;; Prompt fragments table (from migration 006)
"CREATE TABLE IF NOT EXISTS prompt_fragments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
title TEXT,
description TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
)"

"CREATE INDEX IF NOT EXISTS idx_prompt_fragments_name ON prompt_fragments(name)"

;; Prompt fragment skills join table (from migration 006)
"CREATE TABLE IF NOT EXISTS prompt_fragment_skills (
fragment_id INTEGER NOT NULL,
skill_id INTEGER NOT NULL,
position INTEGER NOT NULL,
PRIMARY KEY (prompt_id, skill_id),
FOREIGN KEY (prompt_id) REFERENCES prompts(id) ON DELETE CASCADE,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
PRIMARY KEY (fragment_id, skill_id),
FOREIGN KEY (fragment_id) REFERENCES prompt_fragments(id) ON DELETE CASCADE,
FOREIGN KEY (skill_id) REFERENCES skills(id) ON DELETE CASCADE
)"

"CREATE INDEX IF NOT EXISTS idx_prompt_skills_prompt ON prompt_skills(prompt_id)"
"CREATE INDEX IF NOT EXISTS idx_prompt_skills_skill ON prompt_skills(skill_id)"
"CREATE INDEX IF NOT EXISTS idx_prompt_fragment_skills_fragment ON prompt_fragment_skills(fragment_id)"
"CREATE INDEX IF NOT EXISTS idx_prompt_fragment_skills_skill ON prompt_fragment_skills(skill_id)"

;; Prompt references table (from migration 006, with FIXED nullable target_prompt_id)
"CREATE TABLE IF NOT EXISTS prompt_references (
id INTEGER PRIMARY KEY AUTOINCREMENT,
source_prompt_id INTEGER NOT NULL,
target_prompt_id INTEGER,
target_fragment_id INTEGER,
reference_type TEXT NOT NULL CHECK(reference_type IN ('prompt', 'fragment')),
position INTEGER NOT NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
FOREIGN KEY (source_prompt_id) REFERENCES prompts(id) ON DELETE CASCADE,
FOREIGN KEY (target_prompt_id) REFERENCES prompts(id) ON DELETE CASCADE,
FOREIGN KEY (target_fragment_id) REFERENCES prompt_fragments(id) ON DELETE CASCADE,
CONSTRAINT chk_target_reference CHECK (
(target_prompt_id IS NOT NULL AND target_fragment_id IS NULL) OR
(target_prompt_id IS NULL AND target_fragment_id IS NOT NULL)
)
)"

"CREATE INDEX IF NOT EXISTS idx_prompt_references_source ON prompt_references(source_prompt_id)"
"CREATE INDEX IF NOT EXISTS idx_prompt_references_target_prompt ON prompt_references(target_prompt_id)"
"CREATE INDEX IF NOT EXISTS idx_prompt_references_target_fragment ON prompt_references(target_fragment_id)"
"CREATE INDEX IF NOT EXISTS idx_prompt_references_type ON prompt_references(reference_type)"

;; Skills FTS table
"CREATE VIRTUAL TABLE IF NOT EXISTS skills_fts USING fts5(
path,
category,
Expand All @@ -63,6 +105,7 @@
content_rowid='id'
)"

;; Skills FTS triggers
"CREATE TRIGGER IF NOT EXISTS skills_ai AFTER INSERT ON skills BEGIN
INSERT INTO skills_fts(rowid, path, category, name, title, description, content)
VALUES (new.id, new.path, new.category, new.name, new.title, new.description, new.content);
Expand All @@ -80,6 +123,7 @@
VALUES (new.id, new.path, new.category, new.name, new.title, new.description, new.content);
END"

;; Prompts FTS table
"CREATE VIRTUAL TABLE IF NOT EXISTS prompts_fts USING fts5(
path,
name,
Expand All @@ -91,6 +135,7 @@
content_rowid='id'
)"

;; Prompts FTS triggers
"CREATE TRIGGER IF NOT EXISTS prompts_ai AFTER INSERT ON prompts BEGIN
INSERT INTO prompts_fts(rowid, path, name, title, author, description, content)
VALUES (new.id, new.path, new.name, new.title, new.author, new.description, new.content);
Expand All @@ -117,11 +162,18 @@
"DROP TRIGGER IF EXISTS skills_ad"
"DROP TRIGGER IF EXISTS skills_ai"
"DROP TABLE IF EXISTS skills_fts"
"DROP INDEX IF EXISTS idx_prompt_skills_skill"
"DROP INDEX IF EXISTS idx_prompt_skills_prompt"
"DROP TABLE IF EXISTS prompt_skills"
"DROP INDEX IF EXISTS idx_prompts_hash"
"DROP INDEX IF EXISTS idx_prompt_references_type"
"DROP INDEX IF EXISTS idx_prompt_references_target_fragment"
"DROP INDEX IF EXISTS idx_prompt_references_target_prompt"
"DROP INDEX IF EXISTS idx_prompt_references_source"
"DROP TABLE IF EXISTS prompt_references"
"DROP INDEX IF EXISTS idx_prompt_fragment_skills_skill"
"DROP INDEX IF EXISTS idx_prompt_fragment_skills_fragment"
"DROP TABLE IF EXISTS prompt_fragment_skills"
"DROP INDEX IF EXISTS idx_prompt_fragments_name"
"DROP TABLE IF EXISTS prompt_fragments"
"DROP INDEX IF EXISTS idx_prompts_name"
"DROP INDEX IF EXISTS idx_prompts_hash"
"DROP TABLE IF EXISTS prompts"
"DROP INDEX IF EXISTS idx_skills_hash"
"DROP INDEX IF EXISTS idx_skills_name"
Expand Down
62 changes: 0 additions & 62 deletions resources/migrations/006-prompt-fragments.edn

This file was deleted.

17 changes: 0 additions & 17 deletions resources/migrations/007-drop-prompt-skills.edn

This file was deleted.

9 changes: 0 additions & 9 deletions resources/migrations/008-unique-prompt-name.edn

This file was deleted.

5 changes: 1 addition & 4 deletions src/clojure_skills/config.clj
Original file line number Diff line number Diff line change
Expand Up @@ -106,10 +106,7 @@
:color true}

:permissions
{:plan false
:task false
:task-list false
:prompt false}})
{:prompt false}})

(defn get-config-file-path
"Get path to config.edn file."
Expand Down
30 changes: 19 additions & 11 deletions src/clojure_skills/db/prompt_fragments.clj
Original file line number Diff line number Diff line change
Expand Up @@ -183,17 +183,25 @@

;; Note: Using raw SQL for INSERT...RETURNING because HoneySQL has issues
;; with SQLite's RETURNING clause
(jdbc/execute-one!
db
["INSERT INTO prompt_references
(source_prompt_id, target_prompt_id, target_fragment_id, reference_type, position)
VALUES (?, ?, ?, ?, ?)
RETURNING *"
(:source_prompt_id reference-map)
(:target_prompt_id reference-map)
(:target_fragment_id reference-map)
(:reference_type reference-map)
(:position reference-map)])))
;; Build SQL dynamically based on which target is provided
(let [has-target-prompt (some? (:target_prompt_id reference-map))
columns (if has-target-prompt
"source_prompt_id, target_prompt_id, reference_type, position"
"source_prompt_id, target_fragment_id, reference_type, position")
placeholders (if has-target-prompt "?, ?, ?, ?" "?, ?, ?, ?")
values (if has-target-prompt
[(:source_prompt_id reference-map)
(:target_prompt_id reference-map)
(:reference_type reference-map)
(:position reference-map)]
[(:source_prompt_id reference-map)
(:target_fragment_id reference-map)
(:reference_type reference-map)
(:position reference-map)])]
(jdbc/execute-one!
db
(into [(str "INSERT INTO prompt_references (" columns ") VALUES (" placeholders ") RETURNING *")]
values)))))

(defn get-references-for-prompt
"Get all references for a specific prompt, ordered by position."
Expand Down
9 changes: 9 additions & 0 deletions tests.edn
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#kaocha/v1
{:tests [{:id :unit
:test-paths ["test"]
:source-paths ["src"]}]
:plugins [:kaocha.plugin/profiling
:kaocha.plugin/junit-xml]
:reporter [kaocha.report/documentation]
:color? false
:fail-fast? false}