Refactor: Use store functions for context operations in qmd.ts

Update context management commands to use store.ts functions instead
of inline SQL queries. This change is part of the larger refactoring
effort to move all DB operations into store.ts.

Changes:
- contextAdd: Use insertContext() and getAllCollections()
- contextList: Use listPathContexts()
- contextRemove: Use deleteContext() and deleteGlobalContexts()

This simplifies the CLI code and centralizes database logic.

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Tobi Lutke 2025-12-12 16:43:59 -05:00
parent 24fee4d312
commit 4f5dd77564
No known key found for this signature in database

46
qmd.ts
View File

@ -575,18 +575,13 @@ function detectCollectionFromPath(db: Database, fsPath: string): { collectionId:
async function contextAdd(pathArg: string | undefined, contextText: string): Promise<void> {
const db = getDb();
const now = new Date().toISOString();
// Handle "/" as global/root context (applies to all collections)
if (pathArg === '/') {
// Find all collections and add context to each
const collections = db.prepare(`SELECT id, name FROM collections`).all() as { id: number; name: string }[];
const collections = getAllCollections(db);
for (const coll of collections) {
db.prepare(`
INSERT INTO path_contexts (collection_id, path_prefix, context, created_at)
VALUES (?, '', ?, ?)
ON CONFLICT(collection_id, path_prefix) DO UPDATE SET context = excluded.context
`).run(coll.id, contextText, now);
insertContext(db, coll.id, \'\', contextText);
}
console.log(`${c.green}${c.reset} Added global context to ${collections.length} collection(s)`);
console.log(`${c.dim}Context: ${contextText}${c.reset}`);
@ -618,11 +613,7 @@ async function contextAdd(pathArg: string | undefined, contextText: string): Pro
process.exit(1);
}
db.prepare(`
INSERT INTO path_contexts (collection_id, path_prefix, context, created_at)
VALUES (?, ?, ?, ?)
ON CONFLICT(collection_id, path_prefix) DO UPDATE SET context = excluded.context
`).run(coll.id, parsed.path, contextText, now);
insertContext(db, coll.id, parsed.path, contextText);
console.log(`${c.green}${c.reset} Added context for: qmd://${parsed.collectionName}/${parsed.path || ''}`);
console.log(`${c.dim}Context: ${contextText}${c.reset}`);
@ -638,11 +629,7 @@ async function contextAdd(pathArg: string | undefined, contextText: string): Pro
process.exit(1);
}
db.prepare(`
INSERT INTO path_contexts (collection_id, path_prefix, context, created_at)
VALUES (?, ?, ?, ?)
ON CONFLICT(collection_id, path_prefix) DO UPDATE SET context = excluded.context
`).run(detected.collectionId, detected.relativePath, contextText, now);
insertContext(db, detected.collectionId, detected.relativePath, contextText);
const displayPath = detected.relativePath ? `qmd://${detected.collectionName}/${detected.relativePath}` : `qmd://${detected.collectionName}/`;
console.log(`${c.green}${c.reset} Added context for: ${displayPath}`);
@ -653,12 +640,7 @@ async function contextAdd(pathArg: string | undefined, contextText: string): Pro
function contextList(): void {
const db = getDb();
const contexts = db.prepare(`
SELECT c.name as collection_name, pc.path_prefix, pc.context
FROM path_contexts pc
JOIN collections c ON c.id = pc.collection_id
ORDER BY c.name, LENGTH(pc.path_prefix) DESC, pc.path_prefix
`).all() as { collection_name: string; path_prefix: string; context: string }[];
const contexts = listPathContexts(db);
if (contexts.length === 0) {
console.log(`${c.dim}No contexts configured. Use 'qmd context add' to add one.${c.reset}`);
@ -689,8 +671,8 @@ function contextRemove(pathArg: string): void {
if (pathArg === '/') {
// Remove all root contexts
const result = db.prepare(`DELETE FROM path_contexts WHERE path_prefix = ''`).run();
console.log(`${c.green}${c.reset} Removed ${result.changes} global context(s)`);
const changes = deleteGlobalContexts(db);
console.log(`${c.green}${c.reset} Removed ${changes} global context(s)`);
closeDb();
return;
}
@ -709,12 +691,9 @@ function contextRemove(pathArg: string): void {
process.exit(1);
}
const result = db.prepare(`
DELETE FROM path_contexts
WHERE collection_id = ? AND path_prefix = ?
`).run(coll.id, parsed.path);
const changes = deleteContext(db, coll.id, parsed.path);
if (result.changes === 0) {
if (changes === 0) {
console.error(`${c.yellow}No context found for: ${pathArg}${c.reset}`);
process.exit(1);
}
@ -740,12 +719,9 @@ function contextRemove(pathArg: string): void {
process.exit(1);
}
const result = db.prepare(`
DELETE FROM path_contexts
WHERE collection_id = ? AND path_prefix = ?
`).run(detected.collectionId, detected.relativePath);
const changes = deleteContext(db, detected.collectionId, detected.relativePath);
if (result.changes === 0) {
if (changes === 0) {
console.error(`${c.yellow}No context found for: qmd://${detected.collectionName}/${detected.relativePath}${c.reset}`);
process.exit(1);
}