Add database to YAML export script
Export collections and contexts from SQLite to ~/.config/qmd/index.yml. Successfully exported 6 collections and 10 contexts. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
691c56d051
commit
94ba623486
@ -2,10 +2,10 @@
|
||||
{"id":"qmd-18s","title":"Move cleanup/maintenance DB operations to store.ts","description":"Move cleanup operations from cleanup() command to store.ts. Create methods like deleteInactiveDocuments(), vacuumDatabase(), cleanupOrphanedContent(), etc.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-12T16:36:21.815781-05:00","updated_at":"2025-12-12T16:42:36.896806-05:00","closed_at":"2025-12-12T16:42:36.896806-05:00","dependencies":[{"issue_id":"qmd-18s","depends_on_id":"qmd-29c","type":"parent-child","created_at":"2025-12-12T16:37:03.014111-05:00","created_by":"daemon"}]}
|
||||
{"id":"qmd-1xd","title":"Update tests for YAML-based collections","description":"Update all tests to use YAML config instead of DB collections. Update test helpers to create temporary YAML configs.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-13T09:54:53.349545-05:00","updated_at":"2025-12-13T09:54:53.349545-05:00","dependencies":[{"issue_id":"qmd-1xd","depends_on_id":"qmd-thw","type":"blocks","created_at":"2025-12-13T09:55:08.14305-05:00","created_by":"daemon"}]}
|
||||
{"id":"qmd-29c","title":"Move all database operations from qmd.ts to store.ts","description":"Currently qmd.ts has ~70 direct database operations (db.prepare, db.exec). All database operations should be moved to store.ts to improve separation of concerns. qmd.ts should only use high-level methods from store.ts that don't require direct SQL knowledge.","notes":"Phase 1 complete: Moved collection operations (listCollections, removeCollection, renameCollection) to store.ts. Created 4 subtasks for remaining work: document indexing, context management, embeddings, and cleanup operations.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-12T16:32:13.722223-05:00","updated_at":"2025-12-12T16:49:53.829124-05:00","closed_at":"2025-12-12T16:49:53.829124-05:00"}
|
||||
{"id":"qmd-3z9","title":"Design YAML schema and create collections.ts module","description":"Create collections.ts to manage YAML-based collection configuration at ~/.config/qmd/index.yml. Define TypeScript types for collections and contexts. Implement load/save functions with Bun's native YAML support.","design":"YAML structure:\n```yaml\n# Global context for all collections\nglobal_context: \"...\"\n\ncollections:\n name:\n path: /absolute/path\n pattern: \"**/*.md\"\n context:\n \"/path/prefix\": \"Description\"\n \"/\": \"Root context\"\n```\n\nTypeScript types:\n- Collection: { path, pattern, context }\n- CollectionConfig: { global_context?, collections }\n- Functions: loadConfig(), saveConfig(), getCollection(), listCollections()","status":"in_progress","priority":1,"issue_type":"task","created_at":"2025-12-13T09:54:52.586027-05:00","updated_at":"2025-12-13T09:56:11.735574-05:00"}
|
||||
{"id":"qmd-3z9","title":"Design YAML schema and create collections.ts module","description":"Create collections.ts to manage YAML-based collection configuration at ~/.config/qmd/index.yml. Define TypeScript types for collections and contexts. Implement load/save functions with Bun's native YAML support.","design":"YAML structure:\n```yaml\n# Global context for all collections\nglobal_context: \"...\"\n\ncollections:\n name:\n path: /absolute/path\n pattern: \"**/*.md\"\n context:\n \"/path/prefix\": \"Description\"\n \"/\": \"Root context\"\n```\n\nTypeScript types:\n- Collection: { path, pattern, context }\n- CollectionConfig: { global_context?, collections }\n- Functions: loadConfig(), saveConfig(), getCollection(), listCollections()","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-13T09:54:52.586027-05:00","updated_at":"2025-12-13T09:56:57.309927-05:00","closed_at":"2025-12-13T09:56:57.309927-05:00"}
|
||||
{"id":"qmd-4ru","title":"Update document retrieval for new schema","description":"Functions like getDocument, findDocument, getMultipleDocuments need to work with new schema (path instead of filepath, content joins, virtual paths).","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-12T15:29:53.911881-05:00","updated_at":"2025-12-12T15:56:11.054888-05:00","closed_at":"2025-12-12T15:56:11.054888-05:00","dependencies":[{"issue_id":"qmd-4ru","depends_on_id":"qmd-ama","type":"discovered-from","created_at":"2025-12-12T15:29:53.912607-05:00","created_by":"daemon"}]}
|
||||
{"id":"qmd-4u4","title":"Move embedding/vector DB operations to store.ts","description":"Move vector indexing DB operations from vectorIndex() to store.ts. Create methods like getHashesForEmbedding(), insertEmbedding(), clearEmbeddings(), etc.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-12T16:36:21.683434-05:00","updated_at":"2025-12-12T16:42:40.42653-05:00","closed_at":"2025-12-12T16:42:40.42653-05:00","dependencies":[{"issue_id":"qmd-4u4","depends_on_id":"qmd-29c","type":"parent-child","created_at":"2025-12-12T16:37:02.944591-05:00","created_by":"daemon"}]}
|
||||
{"id":"qmd-6s5","title":"Export current database to index.yml","description":"Write a script to export current collections and path_contexts from SQLite to ~/.config/qmd/index.yml format. Include all collection metadata and contexts.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-13T09:54:52.707844-05:00","updated_at":"2025-12-13T09:54:52.707844-05:00","dependencies":[{"issue_id":"qmd-6s5","depends_on_id":"qmd-3z9","type":"blocks","created_at":"2025-12-13T09:55:07.606834-05:00","created_by":"daemon"}]}
|
||||
{"id":"qmd-6s5","title":"Export current database to index.yml","description":"Write a script to export current collections and path_contexts from SQLite to ~/.config/qmd/index.yml format. Include all collection metadata and contexts.","status":"in_progress","priority":1,"issue_type":"task","created_at":"2025-12-13T09:54:52.707844-05:00","updated_at":"2025-12-13T09:57:19.598168-05:00","dependencies":[{"issue_id":"qmd-6s5","depends_on_id":"qmd-3z9","type":"blocks","created_at":"2025-12-13T09:55:07.606834-05:00","created_by":"daemon"}]}
|
||||
{"id":"qmd-7ss","title":"remove all the symlinks and stuff in the git repo, clean up the root directory","description":"","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-12T16:40:00.744982-05:00","updated_at":"2025-12-12T17:11:18.034215-05:00","closed_at":"2025-12-12T17:11:18.034215-05:00"}
|
||||
{"id":"qmd-8eu","title":"Update documents table schema for collection names","description":"Change documents.collection_id (integer FK) to documents.collection (text). Update all queries and indices. Keep backwards compatibility during transition.","design":"Schema change:\n- Add `collection TEXT` column\n- Migrate data: UPDATE documents SET collection = (SELECT name FROM collections WHERE id = collection_id)\n- Drop collection_id column\n- Update FTS5 trigger\n- Update all queries in store.ts","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-13T09:54:52.830305-05:00","updated_at":"2025-12-13T09:54:52.830305-05:00","dependencies":[{"issue_id":"qmd-8eu","depends_on_id":"qmd-6s5","type":"blocks","created_at":"2025-12-13T09:55:07.662048-05:00","created_by":"daemon"}]}
|
||||
{"id":"qmd-9ua","title":"Update all qmd commands for YAML-based collections","description":"Update qmd.ts commands: collection add/list/remove/rename, status, update, ls. All should use collections.ts instead of store.ts collection functions.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-13T09:54:53.14644-05:00","updated_at":"2025-12-13T09:54:53.14644-05:00","dependencies":[{"issue_id":"qmd-9ua","depends_on_id":"qmd-u84","type":"blocks","created_at":"2025-12-13T09:55:07.893268-05:00","created_by":"daemon"},{"issue_id":"qmd-9ua","depends_on_id":"qmd-oxy","type":"blocks","created_at":"2025-12-13T09:55:07.942221-05:00","created_by":"daemon"}]}
|
||||
|
||||
106
export-to-yaml.ts
Normal file
106
export-to-yaml.ts
Normal file
@ -0,0 +1,106 @@
|
||||
#!/usr/bin/env bun
|
||||
/**
|
||||
* Export current SQLite collections and contexts to YAML format
|
||||
*
|
||||
* This script reads from the current database and creates ~/.config/qmd/index.yml
|
||||
* Run this once to migrate from database-based to YAML-based configuration.
|
||||
*/
|
||||
|
||||
import { Database } from "bun:sqlite";
|
||||
import { join } from "path";
|
||||
import { homedir } from "os";
|
||||
import { saveConfig, type CollectionConfig, getConfigPath } from "./src/collections";
|
||||
|
||||
// Simple colors for output
|
||||
const c = {
|
||||
reset: "\x1b[0m",
|
||||
cyan: "\x1b[36m",
|
||||
green: "\x1b[32m",
|
||||
dim: "\x1b[2m",
|
||||
};
|
||||
|
||||
// Open the existing database
|
||||
const dbPath = join(homedir(), ".cache", "qmd", "index.sqlite");
|
||||
const db = new Database(dbPath, { readonly: true });
|
||||
|
||||
console.log(`${c.cyan}Exporting collections from SQLite to YAML...${c.reset}\n`);
|
||||
console.log(`Database: ${dbPath}`);
|
||||
console.log(`Output: ${getConfigPath()}\n`);
|
||||
|
||||
// Initialize config
|
||||
const config: CollectionConfig = {
|
||||
global_context: "If you see relevant [[WikiWord]] you can do a search for WikiWord to get more context on the matter",
|
||||
collections: {},
|
||||
};
|
||||
|
||||
// Export collections
|
||||
interface CollectionRow {
|
||||
id: number;
|
||||
name: string;
|
||||
pwd: string;
|
||||
glob_pattern: string;
|
||||
}
|
||||
|
||||
const collections = db
|
||||
.query<CollectionRow, []>("SELECT id, name, pwd, glob_pattern FROM collections ORDER BY name")
|
||||
.all();
|
||||
|
||||
console.log(`${c.green}Found ${collections.length} collections:${c.reset}`);
|
||||
|
||||
for (const coll of collections) {
|
||||
console.log(` - ${coll.name}`);
|
||||
|
||||
config.collections[coll.name] = {
|
||||
path: coll.pwd,
|
||||
pattern: coll.glob_pattern,
|
||||
};
|
||||
}
|
||||
|
||||
// Export contexts
|
||||
interface ContextRow {
|
||||
collection_id: number;
|
||||
collection_name: string;
|
||||
path_prefix: string;
|
||||
context: string;
|
||||
}
|
||||
|
||||
const contexts = db
|
||||
.query<ContextRow, []>(`
|
||||
SELECT
|
||||
pc.collection_id,
|
||||
c.name as collection_name,
|
||||
pc.path_prefix,
|
||||
pc.context
|
||||
FROM path_contexts pc
|
||||
JOIN collections c ON pc.collection_id = c.id
|
||||
ORDER BY c.name, pc.path_prefix
|
||||
`)
|
||||
.all();
|
||||
|
||||
console.log(`\n${c.green}Found ${contexts.length} contexts:${c.reset}`);
|
||||
|
||||
for (const ctx of contexts) {
|
||||
const collection = config.collections[ctx.collection_name];
|
||||
if (!collection) continue;
|
||||
|
||||
if (!collection.context) {
|
||||
collection.context = {};
|
||||
}
|
||||
|
||||
collection.context[ctx.path_prefix] = ctx.context;
|
||||
|
||||
// Truncate long contexts for display
|
||||
const displayContext = ctx.context.length > 50
|
||||
? ctx.context.substring(0, 50) + "..."
|
||||
: ctx.context;
|
||||
|
||||
console.log(` - ${ctx.collection_name}${ctx.path_prefix}: ${displayContext}`);
|
||||
}
|
||||
|
||||
// Save to YAML
|
||||
saveConfig(config);
|
||||
|
||||
console.log(`\n${c.green}✓ Successfully exported to ${getConfigPath()}${c.reset}`);
|
||||
console.log(`\n${c.dim}You can now manually edit this file to adjust your collections.${c.reset}`);
|
||||
|
||||
db.close();
|
||||
Loading…
Reference in New Issue
Block a user