kabanos 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../src/core.ts","../src/errors.ts","../src/scanner.ts","../src/storage.ts"],"sourcesContent":["import path from 'node:path';\nimport { z } from 'zod';\nimport type { KanbanConfig, ResolvedKanbanConfig } from './types.js';\n\nconst schema = z.object({\n projectRoot: z.string().optional(), mountPath: z.string().regex(/^\\/[\\w/-]*$/).optional(), boardName: z.string().min(1).optional(),\n columns: z.array(z.union([z.string().min(1), z.object({ id: z.string().min(1), name: z.string().min(1), completion: z.boolean().optional(), colorToken: z.string().optional() })])).optional(),\n scan: z.object({ include: z.array(z.string()).optional(), exclude: z.array(z.string()).optional(), tags: z.record(z.string(), z.object({ column: z.string(), priority: z.enum(['low','normal','high']).optional(), label: z.string().optional() })).optional(), watch: z.boolean().optional(), intervalMs: z.number().int().nonnegative().optional(), maxFileSize: z.number().int().positive().optional(), parsers: z.array(z.custom<{extensions:string[];parse:Function}>(value=>Boolean(value)&&typeof value==='object'&&typeof (value as {parse?:unknown}).parse==='function')).optional() }).optional(),\n storage: z.object({ adapter: z.enum(['sqlite','postgres','mysql']).optional(), connectionString: z.string().optional(), filename: z.string().optional() }).optional(),\n theme: z.object({ default: z.enum(['light','dark','system']).optional(), overrides: z.record(z.string(), z.string()).optional() }).optional(),\n auth: z.object({ enabled: z.boolean().optional(), guard: z.function().optional(), actor: z.function().optional() }).optional(),\n});\n\nexport function defineConfig<T = any>(config: KanbanConfig<T>): KanbanConfig<T> { return config; }\n\nexport function resolveConfig(input: KanbanConfig = {}): ResolvedKanbanConfig {\n const value = schema.parse(input) as KanbanConfig;\n const root = path.resolve(value.projectRoot ?? process.cwd());\n const columns = (value.columns ?? ['Backlog', 'In Progress', 'Done']).map((column, index, all) => typeof column === 'string'\n ? { id: column.toLowerCase().replace(/[^a-z0-9]+/g, '-'), name: column, completion: index === all.length - 1 }\n : column);\n if (columns.filter((column) => column.completion).length !== 1) throw new Error('Kabanos requires exactly one completion column.');\n const enabled = value.auth?.enabled ?? true;\n if (enabled && !value.auth?.guard) throw new Error('Kabanos requires auth.guard, or auth.enabled: false as an explicit public opt-out.');\n return {\n projectRoot: root, mountPath: value.mountPath ?? '/admin/kb', boardName: value.boardName ?? 'Code board', columns,\n scan: {\n include: value.scan?.include ?? ['**/*.{ts,tsx,js,jsx,mjs,cjs,py,go,rs,css,scss,html}'],\n exclude: value.scan?.exclude ?? ['node_modules/**','dist/**','build/**','.git/**','.kanban/**','**/*.min.*'],\n tags: value.scan?.tags ?? { TODO: { column: 'backlog', priority: 'normal' }, FIXME: { column: 'in-progress', priority: 'high' } },\n watch: value.scan?.watch ?? process.env.NODE_ENV === 'development', intervalMs: value.scan?.intervalMs ?? 0, maxFileSize: value.scan?.maxFileSize ?? 1_000_000, parsers: value.scan?.parsers ?? [],\n },\n storage: { adapter: value.storage?.adapter ?? 'sqlite', connectionString: value.storage?.connectionString ?? '', filename: path.resolve(root, value.storage?.filename ?? '.kanban/board.db') },\n theme: { default: value.theme?.default ?? 'system', overrides: value.theme?.overrides ?? {} }, auth: { enabled, ...value.auth },\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport chokidar, { type FSWatcher } from 'chokidar';\nimport { z } from 'zod';\nimport { resolveConfig } from './config.js';\nimport { KabanosError } from './errors.js';\nimport { isWithin, ProjectScanner } from './scanner.js';\nimport { createStorage } from './storage.js';\nimport type { KanbanConfig, StorageAdapter } from './types.js';\n\nexport interface KabanosInstance {\n config: ReturnType<typeof resolveConfig>;\n storage: StorageAdapter;\n handler(request: Request, nativeRequest?: unknown): Promise<Response>;\n scan(): Promise<{ created: number; updated: number; archived: number }>;\n close(): Promise<void>;\n}\n\nexport async function createKabanos<TRequest = any>(input: KanbanConfig<TRequest>): Promise<KabanosInstance> {\n const config = resolveConfig(input as KanbanConfig);\n const storage = await createStorage(config);\n await storage.initialize(config);\n let watcher: FSWatcher | undefined;\n let timer: NodeJS.Timeout | undefined;\n let scanning: Promise<{created:number;updated:number;archived:number}> | undefined;\n const scanner = new ProjectScanner();\n const scan = () => scanning ??= storage.getBoard().then(board => {\n const overrides = (board.settings.scan ?? {}) as Partial<typeof config.scan>;\n return scanner.scan({ ...config, scan: { ...config.scan, ...overrides } });\n }).then(comments=>storage.reconcile(comments)).finally(()=>{scanning=undefined;});\n await scan();\n if(config.scan.watch){watcher=chokidar.watch(config.scan.include,{cwd:config.projectRoot,ignored:config.scan.exclude,ignoreInitial:true}).on('all',()=>{void scan();});}\n if(config.scan.intervalMs>0) timer=setInterval(()=>{void scan();},config.scan.intervalMs).unref();\n\n return {\n config, storage, scan,\n handler: (request,nativeRequest=request)=>handleRequest(request,nativeRequest,config,storage,scan),\n async close(){if(timer)clearInterval(timer);await watcher?.close();await storage.close();},\n };\n}\n\nasync function handleRequest(request:Request,nativeRequest:unknown,config:ReturnType<typeof resolveConfig>,storage:StorageAdapter,scan:KabanosInstance['scan']):Promise<Response>{\n if(config.auth.enabled && !(await config.auth.guard?.(nativeRequest))) return json({error:{code:'UNAUTHORIZED',message:'Access denied.'}},401);\n const url=new URL(request.url); const mount=config.mountPath.replace(/\\/$/,'');\n if(url.pathname===mount) return Response.redirect(`${url.origin}${mount}/`,308);\n if(!url.pathname.startsWith(`${mount}/`)) return json({error:{code:'NOT_FOUND',message:'Route not found.'}},404);\n const route=url.pathname.slice(mount.length);\n try{\n if(route==='/api/v1/board'&&request.method==='GET')return json(await storage.getBoard());\n if(route==='/api/v1/scan'&&request.method==='POST'){assertMutation(request);return json(await scan());}\n const move=route.match(/^\\/api\\/v1\\/cards\\/([^/]+)\\/move$/);\n if(move&&request.method==='PATCH'){assertMutation(request);const body=moveSchema.parse(await request.json());await storage.moveCard(move[1]!,body.columnId,body.position,await config.auth.actor?.(nativeRequest));return json({ok:true});}\n const card=route.match(/^\\/api\\/v1\\/cards\\/([^/]+)$/);\n if(card&&request.method==='PATCH'){assertMutation(request);const body=cardSchema.parse(await request.json());await storage.updateCard(card[1]!,body,await config.auth.actor?.(nativeRequest));return json({ok:true});}\n const activity=route.match(/^\\/api\\/v1\\/cards\\/([^/]+)\\/activity$/);\n if(activity&&request.method==='GET')return json(await storage.getActivity(activity[1]!));\n const context=route.match(/^\\/api\\/v1\\/cards\\/([^/]+)\\/context$/);\n if(context&&request.method==='GET'){const board=await storage.getBoard();const selected=board.cards.find(c=>c.id===context[1]);if(!selected)return json({error:{code:'NOT_FOUND',message:'Card not found.'}},404);const absolute=path.resolve(config.projectRoot,selected.sourceFilePath);if(!isWithin(config.projectRoot,absolute))throw new Error('Unsafe source path.');const lines=(await readFile(absolute,'utf8')).split('\\n');return json({filePath:selected.sourceFilePath,line:selected.sourceLine,lines:lines.slice(Math.max(0,selected.sourceLine-4),selected.sourceLine+3),startLine:Math.max(1,selected.sourceLine-3)});}\n if(route==='/api/v1/settings'&&request.method==='PATCH'){assertMutation(request);const body=settingsSchema.parse(await request.json());await storage.updateSettings(body);return json({ok:true});}\n if(route==='/api/v1/settings/columns'&&request.method==='PUT'){assertMutation(request);const body=columnsSchema.parse(await request.json());await storage.replaceColumns(body.columns,body.destinationColumnId);return json({ok:true});}\n if(request.method==='GET')return serveUi(route);\n return json({error:{code:'NOT_FOUND',message:'Route not found.'}},404);\n }catch(error){if(error instanceof z.ZodError)return json({error:{code:'INVALID_REQUEST',message:'Request validation failed.',issues:error.issues}},400);if(error instanceof KabanosError)return json({error:{code:error.code,message:error.message}},error.status);console.error('[kabanos]',error);return json({error:{code:'INTERNAL_ERROR',message:'Kabanos could not complete the request.'}},500);}\n}\n\nconst moveSchema=z.object({columnId:z.string().min(1),position:z.number().int().nonnegative()});\nconst cardSchema=z.object({notes:z.string().max(20_000).optional(),assignee:z.string().max(255).nullable().optional(),labels:z.array(z.string().max(64)).max(20).optional()});\nconst settingsSchema=z.object({theme:z.enum(['light','dark','system']).optional(),tokenOverrides:z.record(z.string(),z.string()).optional(),scan:z.object({include:z.array(z.string()).optional(),exclude:z.array(z.string()).optional()}).optional()}).strict();\nconst columnsSchema=z.object({columns:z.array(z.object({id:z.string().regex(/^[a-z0-9-]+$/),name:z.string().min(1).max(80),completion:z.boolean().optional(),colorToken:z.string().max(64).optional()})).min(1),destinationColumnId:z.string().optional()}).refine(value=>value.columns.filter(column=>column.completion).length===1,{message:'Exactly one completion column is required.'});\nfunction assertMutation(request:Request){const content=request.headers.get('content-type')??'';if(!content.toLowerCase().startsWith('application/json'))throw new z.ZodError([{code:'custom',path:['content-type'],message:'Mutations require application/json.'}]);const origin=request.headers.get('origin');if(origin&&origin!==new URL(request.url).origin)throw new z.ZodError([{code:'custom',path:['origin'],message:'Cross-origin mutation rejected.'}]);}\nfunction json(value:unknown,status=200){return Response.json(value,{status,headers:{'cache-control':'no-store','x-content-type-options':'nosniff'}});}\nasync function serveUi(route:string):Promise<Response>{\n const moduleRoot=path.dirname(fileURLToPath(import.meta.url));\n const uiRoot=moduleRoot.endsWith(`${path.sep}src`)?path.resolve(moduleRoot,'../dist/ui'):path.resolve(moduleRoot,'ui');\n const requested=route==='/'?'index.html':route.replace(/^\\//,'');\n let target=path.resolve(uiRoot,requested);if(!isWithin(uiRoot,target))return new Response('Not found',{status:404});\n try{const body=await readFile(target);return new Response(body,{headers:{'content-type':contentType(target),'cache-control':target.endsWith('index.html')?'no-cache':'public, max-age=31536000, immutable','x-content-type-options':'nosniff'}});}catch{target=path.join(uiRoot,'index.html');try{return new Response(await readFile(target),{headers:{'content-type':'text/html; charset=utf-8','cache-control':'no-cache'}});}catch{return new Response('Kabanos UI has not been built.',{status:503});}}\n}\nfunction contentType(file:string){if(file.endsWith('.html'))return'text/html; charset=utf-8';if(file.endsWith('.js'))return'text/javascript; charset=utf-8';if(file.endsWith('.css'))return'text/css; charset=utf-8';if(file.endsWith('.svg'))return'image/svg+xml';return'application/octet-stream';}\n","export class KabanosError extends Error {\n constructor(public readonly code:string,message:string,public readonly status=400){super(message);this.name='KabanosError';}\n}\n","import { createHash } from 'node:crypto';\nimport { readFile, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport fg from 'fast-glob';\nimport ignore from 'ignore';\nimport type { ResolvedKanbanConfig, SourceComment } from './types.js';\n\nconst COMMENT_PATTERNS: Record<string, RegExp[]> = {\n js: [/\\/\\/([^\\n]*)/g, /\\/\\*([\\s\\S]*?)\\*\\//g], ts: [/\\/\\/([^\\n]*)/g, /\\/\\*([\\s\\S]*?)\\*\\//g], jsx: [/\\/\\/([^\\n]*)/g, /\\/\\*([\\s\\S]*?)\\*\\//g], tsx: [/\\/\\/([^\\n]*)/g, /\\/\\*([\\s\\S]*?)\\*\\//g],\n py: [/#([^\\n]*)/g], go: [/\\/\\/([^\\n]*)/g, /\\/\\*([\\s\\S]*?)\\*\\//g], rs: [/\\/\\/([^\\n]*)/g, /\\/\\*([\\s\\S]*?)\\*\\//g],\n css: [/\\/\\*([\\s\\S]*?)\\*\\//g], scss: [/\\/\\/([^\\n]*)/g, /\\/\\*([\\s\\S]*?)\\*\\//g], html: [/<!--([\\s\\S]*?)-->/g],\n mjs: [/\\/\\/([^\\n]*)/g, /\\/\\*([\\s\\S]*?)\\*\\//g], cjs: [/\\/\\/([^\\n]*)/g, /\\/\\*([\\s\\S]*?)\\*\\//g],\n};\n\nconst hash = (value: string) => createHash('sha256').update(value).digest('hex');\nconst normalize = (value: string) => value.replace(/^\\s*[*#/-]+\\s?/gm, '').replace(/\\s+/g, ' ').trim();\n\nexport function extractComments(filePath: string, source: string, tags: string[]): SourceComment[] {\n const extension = path.extname(filePath).slice(1).toLowerCase();\n const patterns = COMMENT_PATTERNS[extension] ?? [];\n const tagPattern = new RegExp(`\\\\b(${tags.map(escapeRegExp).join('|')})\\\\b(?:\\\\s*[:(-]?\\\\s*)?([\\\\s\\\\S]*)`, 'i');\n const candidates: Omit<SourceComment, 'occurrence'>[] = [];\n for (const pattern of patterns) {\n pattern.lastIndex = 0;\n for (const match of source.matchAll(pattern)) {\n const raw = match[1] ?? match[0];\n const normalized = normalize(raw);\n const tagged = normalized.match(tagPattern);\n if (!tagged || match.index === undefined) continue;\n const before = source.slice(0, match.index);\n const line = before.split('\\n').length;\n const endLine = line + match[0].split('\\n').length - 1;\n const tag = tagged[1]!.toUpperCase();\n const text = (tagged[2] ?? '').trim() || tag;\n const lines = source.split('\\n');\n const context = lines.slice(Math.max(0, line - 3), Math.min(lines.length, endLine + 2)).join('\\n');\n candidates.push({ filePath, line, endLine, tag, text, rawText: match[0], contentHash: hash(`${tag}:${text}`), contextHash: hash(context) });\n }\n }\n candidates.sort((a, b) => a.line - b.line);\n const occurrences = new Map<string, number>();\n return candidates.map((comment) => {\n const occurrence = occurrences.get(comment.contentHash) ?? 0;\n occurrences.set(comment.contentHash, occurrence + 1);\n return { ...comment, occurrence };\n });\n}\n\nexport function parseComments(config: ResolvedKanbanConfig, filePath: string, source: string): SourceComment[] {\n const extension = path.extname(filePath).slice(1).toLowerCase();\n const parser = config.scan.parsers.find(candidate => candidate.extensions.map(value=>value.replace(/^\\./,'').toLowerCase()).includes(extension));\n return parser ? parser.parse(filePath, source, Object.keys(config.scan.tags)) : extractComments(filePath, source, Object.keys(config.scan.tags));\n}\n\nexport class ProjectScanner {\n private cache = new Map<string,{mtimeMs:number;size:number;comments:SourceComment[]}>();\n async scan(config:ResolvedKanbanConfig):Promise<SourceComment[]>{\n const gitignore = ignore();\n try { gitignore.add(await readFile(path.join(config.projectRoot, '.gitignore'), 'utf8')); } catch { /* optional */ }\n gitignore.add(config.scan.exclude);\n const files = await fg(config.scan.include, { cwd: config.projectRoot, onlyFiles: true, followSymbolicLinks: false, dot: true, unique: true });\n const active=new Set<string>();const comments:SourceComment[]=[];\n for (const relative of files.sort()) {\n const safeRelative = relative.replaceAll('\\\\', '/');\n if (gitignore.ignores(safeRelative)) continue;\n const absolute = path.resolve(config.projectRoot, relative);\n if (!isWithin(config.projectRoot, absolute)) continue;\n const info = await stat(absolute);\n if (!info.isFile() || info.size > config.scan.maxFileSize) continue;\n active.add(safeRelative);const cached=this.cache.get(safeRelative);\n if(cached&&cached.mtimeMs===info.mtimeMs&&cached.size===info.size){comments.push(...cached.comments);continue;}\n const parsed=parseComments(config,safeRelative,await readFile(absolute,'utf8'));this.cache.set(safeRelative,{mtimeMs:info.mtimeMs,size:info.size,comments:parsed});comments.push(...parsed);\n }\n for(const key of this.cache.keys())if(!active.has(key))this.cache.delete(key);\n return comments;\n }\n}\n\nexport async function scanProject(config: ResolvedKanbanConfig): Promise<SourceComment[]> { return new ProjectScanner().scan(config); }\n\nexport function isWithin(root: string, candidate: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(candidate));\n return relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);\n}\n\nfunction escapeRegExp(value: string): string { return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); }\n","import { randomUUID } from 'node:crypto';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport Database from 'better-sqlite3';\nimport { Kysely, MysqlDialect, PostgresDialect, SqliteDialect, sql } from 'kysely';\nimport { KabanosError } from './errors.js';\nimport type { Actor, BoardState, Card, ColumnConfig, ResolvedKanbanConfig, SourceComment, StorageAdapter } from './types.js';\n\ninterface DB {\n schema_migrations: { version: number; applied_at: string };\n boards: { id: string; name: string; created_at: string };\n columns: { id: string; board_id: string; name: string; position: number; completion: number; color_token: string | null };\n cards: { id: string; board_id: string; column_id: string; position: number; tag: string; title: string; body: string; notes: string; assignee: string | null; labels: string; priority: string; source_file_path: string; source_line: number; source_content_hash: string; source_context_hash: string; source_occurrence: number; status: string; created_at: string; updated_at: string };\n resolved_fingerprints: { id: string; board_id: string; card_id: string; file_path: string; content_hash: string; context_hash: string; occurrence: number; resolved_at: string; resolved_by: string | null };\n settings: { board_id: string; value: string };\n activity_log: { id: string; card_id: string; action: string; from_status: string | null; to_status: string | null; actor: string | null; created_at: string };\n}\n\nexport class SqlStorage implements StorageAdapter {\n constructor(private readonly db: Kysely<DB>, private readonly config: ResolvedKanbanConfig) {}\n\n async migrate(): Promise<void> {\n await this.db.schema.createTable('schema_migrations').ifNotExists().addColumn('version','integer',c=>c.primaryKey()).addColumn('applied_at','varchar(32)',c=>c.notNull()).execute();\n const applied = new Set((await this.db.selectFrom('schema_migrations').select('version').execute()).map(r=>r.version));\n const migrations: Array<{version:number;up:(db:Kysely<DB>)=>Promise<void>}> = [\n { version: 1, up: async db => {\n await db.schema.createTable('boards').ifNotExists().addColumn('id','varchar(64)',c=>c.primaryKey()).addColumn('name','varchar(255)',c=>c.notNull()).addColumn('created_at','varchar(32)',c=>c.notNull()).execute();\n await db.schema.createTable('columns').ifNotExists().addColumn('id','varchar(64)',c=>c.primaryKey()).addColumn('board_id','varchar(64)',c=>c.notNull()).addColumn('name','varchar(255)',c=>c.notNull()).addColumn('position','integer',c=>c.notNull()).addColumn('completion','integer',c=>c.notNull()).addColumn('color_token','varchar(64)').execute();\n await db.schema.createTable('cards').ifNotExists().addColumn('id','varchar(64)',c=>c.primaryKey()).addColumn('board_id','varchar(64)',c=>c.notNull()).addColumn('column_id','varchar(64)',c=>c.notNull()).addColumn('position','integer',c=>c.notNull()).addColumn('tag','varchar(64)',c=>c.notNull()).addColumn('title','text',c=>c.notNull()).addColumn('body','text',c=>c.notNull()).addColumn('notes','text',c=>c.notNull()).addColumn('assignee','varchar(255)').addColumn('labels','text',c=>c.notNull()).addColumn('priority','varchar(32)',c=>c.notNull()).addColumn('source_file_path','text',c=>c.notNull()).addColumn('source_line','integer',c=>c.notNull()).addColumn('source_content_hash','varchar(64)',c=>c.notNull()).addColumn('source_context_hash','varchar(64)',c=>c.notNull()).addColumn('source_occurrence','integer',c=>c.notNull()).addColumn('status','varchar(32)',c=>c.notNull()).addColumn('created_at','varchar(32)',c=>c.notNull()).addColumn('updated_at','varchar(32)',c=>c.notNull()).execute();\n await db.schema.createTable('resolved_fingerprints').ifNotExists().addColumn('id','varchar(64)',c=>c.primaryKey()).addColumn('board_id','varchar(64)',c=>c.notNull()).addColumn('card_id','varchar(64)',c=>c.notNull()).addColumn('file_path','text',c=>c.notNull()).addColumn('content_hash','varchar(64)',c=>c.notNull()).addColumn('context_hash','varchar(64)',c=>c.notNull()).addColumn('occurrence','integer',c=>c.notNull()).addColumn('resolved_at','varchar(32)',c=>c.notNull()).addColumn('resolved_by','varchar(255)').execute();\n await db.schema.createTable('settings').ifNotExists().addColumn('board_id','varchar(64)',c=>c.primaryKey()).addColumn('value','text',c=>c.notNull()).execute();\n await db.schema.createTable('activity_log').ifNotExists().addColumn('id','varchar(64)',c=>c.primaryKey()).addColumn('card_id','varchar(64)',c=>c.notNull()).addColumn('action','varchar(64)',c=>c.notNull()).addColumn('from_status','varchar(32)').addColumn('to_status','varchar(32)').addColumn('actor','varchar(255)').addColumn('created_at','varchar(32)',c=>c.notNull()).execute();\n }},\n ];\n for (const migration of migrations) {\n if (applied.has(migration.version)) continue;\n await migration.up(this.db);\n await this.db.insertInto('schema_migrations').values({version:migration.version,applied_at:new Date().toISOString()}).execute();\n }\n }\n\n async initialize(config: ResolvedKanbanConfig): Promise<void> {\n await this.migrate();\n const board = await this.db.selectFrom('boards').selectAll().where('id','=','default').executeTakeFirst();\n if (board) return;\n const now = new Date().toISOString();\n await this.db.transaction().execute(async trx => {\n await trx.insertInto('boards').values({ id:'default', name:config.boardName, created_at:now }).execute();\n await trx.insertInto('columns').values(config.columns.map((column, position) => ({ id:column.id, board_id:'default', name:column.name, position, completion:column.completion ? 1 : 0, color_token:column.colorToken ?? null }))).execute();\n await trx.insertInto('settings').values({ board_id:'default', value:JSON.stringify({ theme:config.theme.default, tokenOverrides:config.theme.overrides, scan:{include:config.scan.include,exclude:config.scan.exclude} }) }).execute();\n });\n }\n\n async getBoard(): Promise<BoardState> {\n const [board, columns, cards, settings] = await Promise.all([\n this.db.selectFrom('boards').selectAll().where('id','=','default').executeTakeFirstOrThrow(),\n this.db.selectFrom('columns').selectAll().where('board_id','=','default').orderBy('position').execute(),\n this.db.selectFrom('cards').selectAll().where('board_id','=','default').where('status','!=','archived').orderBy('position').execute(),\n this.db.selectFrom('settings').selectAll().where('board_id','=','default').executeTakeFirst(),\n ]);\n return { id:board.id, name:board.name, columns:columns.map(c=>({ id:c.id,name:c.name,position:c.position,completion:Boolean(c.completion),...(c.color_token ? {colorToken:c.color_token}: {}) })), cards:cards.map(toCard), settings:JSON.parse(settings?.value ?? '{}') as Record<string,unknown> };\n }\n\n async reconcile(comments: SourceComment[]): Promise<{created:number;updated:number;archived:number}> {\n return this.db.transaction().execute(async trx => {\n const [cards, resolved, columns] = await Promise.all([\n trx.selectFrom('cards').selectAll().where('board_id','=','default').execute(),\n trx.selectFrom('resolved_fingerprints').selectAll().where('board_id','=','default').execute(),\n trx.selectFrom('columns').selectAll().where('board_id','=','default').execute(),\n ]);\n const seen = new Set<string>(); const createdPerColumn = new Map<string,number>(); let updated=0, archived=0;\n for (const comment of comments) {\n const exact = cards.find(c=>c.source_file_path===comment.filePath && c.source_content_hash===comment.contentHash && c.source_occurrence===comment.occurrence && c.status!=='archived');\n if (exact) { seen.add(exact.id); if (exact.source_line!==comment.line || exact.source_context_hash!==comment.contextHash) { await trx.updateTable('cards').set({source_line:comment.line,source_context_hash:comment.contextHash,updated_at:new Date().toISOString()}).where('id','=',exact.id).execute(); updated++; } continue; }\n const suppressed = resolved.some(r=>r.file_path===comment.filePath && r.content_hash===comment.contentHash && r.occurrence===comment.occurrence);\n if (suppressed) continue;\n const changed = cards.filter(c=>c.source_file_path===comment.filePath && !seen.has(c.id) && c.status!=='resolved' && c.status!=='archived').sort((a,b)=>Number(b.source_context_hash===comment.contextHash)-Number(a.source_context_hash===comment.contextHash)||Math.abs(a.source_line-comment.line)-Math.abs(b.source_line-comment.line))[0];\n if (changed) { seen.add(changed.id); await trx.updateTable('cards').set({tag:comment.tag,title:comment.text,body:comment.rawText,source_line:comment.line,source_content_hash:comment.contentHash,source_context_hash:comment.contextHash,status:'changed',updated_at:new Date().toISOString()}).where('id','=',changed.id).execute(); updated++; continue; }\n const tag = this.config.scan.tags[comment.tag];\n const column = columns.find(c=>c.id===tag?.column) ?? columns[0];\n if (!column) throw new Error('Board has no columns.');\n const colCreated = createdPerColumn.get(column.id) ?? 0;\n const id=randomUUID(), now=new Date().toISOString();\n await trx.insertInto('cards').values({id,board_id:'default',column_id:column.id,position:cards.filter(c=>c.column_id===column.id).length+colCreated,tag:comment.tag,title:comment.text,body:comment.rawText,notes:'',assignee:null,labels:JSON.stringify(tag?.label?[tag.label]:[]),priority:tag?.priority??'normal',source_file_path:comment.filePath,source_line:comment.line,source_content_hash:comment.contentHash,source_context_hash:comment.contextHash,source_occurrence:comment.occurrence,status:'open',created_at:now,updated_at:now}).execute();\n await log(trx,id,'created',null,'open',undefined); seen.add(id); createdPerColumn.set(column.id,colCreated+1);\n }\n for (const card of cards.filter(c=>c.status!=='archived' && !seen.has(c.id))) { await trx.updateTable('cards').set({status:'archived',updated_at:new Date().toISOString()}).where('id','=',card.id).execute(); await log(trx,card.id,'archived',card.status,'archived',undefined); archived++; }\n const created = [...createdPerColumn.values()].reduce((a,b)=>a+b,0);\n return {created,updated,archived};\n });\n }\n\n async moveCard(id:string,columnId:string,position:number,actor?:Actor):Promise<void> {\n await this.db.transaction().execute(async trx=>{\n const [card,column]=await Promise.all([trx.selectFrom('cards').selectAll().where('id','=',id).executeTakeFirst(),trx.selectFrom('columns').selectAll().where('id','=',columnId).executeTakeFirst()]);\n if(!card)throw new KabanosError('CARD_NOT_FOUND','Card not found.',404);if(!column)throw new KabanosError('COLUMN_NOT_FOUND','Column not found.',404);\n const status=column.completion?'resolved':'open', now=new Date().toISOString();\n const target=await trx.selectFrom('cards').selectAll().where('column_id','=',columnId).where('status','!=','archived').orderBy('position').execute();\n const ordered=target.filter(item=>item.id!==id);ordered.splice(Math.min(position,ordered.length),0,{...card,column_id:columnId});\n for(const [index,item] of ordered.entries())await trx.updateTable('cards').set({column_id:columnId,position:index,...(item.id===id?{status,updated_at:now}:{})}).where('id','=',item.id).execute();\n if(card.column_id!==columnId){const source=await trx.selectFrom('cards').selectAll().where('column_id','=',card.column_id).where('id','!=',id).where('status','!=','archived').orderBy('position').execute();for(const [index,item]of source.entries())await trx.updateTable('cards').set({position:index}).where('id','=',item.id).execute();}\n await trx.deleteFrom('resolved_fingerprints').where('card_id','=',id).execute();\n if (status==='resolved') await trx.insertInto('resolved_fingerprints').values({id:randomUUID(),board_id:'default',card_id:id,file_path:card.source_file_path,content_hash:card.source_content_hash,context_hash:card.source_context_hash,occurrence:card.source_occurrence,resolved_at:now,resolved_by:actor?.id??null}).execute();\n await log(trx,id,status==='resolved'?'resolved':'moved',card.status,status,actor);\n });\n }\n async updateCard(id:string,patch:{notes?:string;assignee?:string|null;labels?:string[]},actor?:Actor):Promise<void>{ const values:Record<string,unknown>={updated_at:new Date().toISOString()}; if(patch.notes!==undefined)values.notes=patch.notes;if(patch.assignee!==undefined)values.assignee=patch.assignee;if(patch.labels!==undefined)values.labels=JSON.stringify(patch.labels);const result=await this.db.updateTable('cards').set(values).where('id','=',id).executeTakeFirst();if(Number(result.numUpdatedRows)===0)throw new KabanosError('CARD_NOT_FOUND','Card not found.',404);await log(this.db,id,'updated',null,null,actor); }\n async getActivity(cardId:string):Promise<unknown[]>{return this.db.selectFrom('activity_log').selectAll().where('card_id','=',cardId).orderBy('created_at','desc').execute();}\n async updateSettings(patch:Record<string,unknown>):Promise<void>{const current=await this.db.selectFrom('settings').select('value').where('board_id','=','default').executeTakeFirst();await this.db.updateTable('settings').set({value:JSON.stringify({...JSON.parse(current?.value??'{}'),...patch})}).where('board_id','=','default').execute();}\n async replaceColumns(columns:ColumnConfig[],destinationColumnId?:string):Promise<void>{\n if(columns.length===0||columns.filter(column=>column.completion).length!==1)throw new KabanosError('INVALID_COLUMNS','Exactly one completion column is required.');\n if(new Set(columns.map(column=>column.id)).size!==columns.length)throw new KabanosError('INVALID_COLUMNS','Column IDs must be unique.');\n await this.db.transaction().execute(async trx=>{\n const existing=await trx.selectFrom('columns').selectAll().where('board_id','=','default').execute();\n const removed=existing.filter(column=>!columns.some(next=>next.id===column.id));\n if(removed.length){const count=await trx.selectFrom('cards').select(sql<number>`count(*)`.as('count')).where('column_id','in',removed.map(column=>column.id)).where('status','!=','archived').executeTakeFirst();if(Number(count?.count??0)>0){if(!destinationColumnId||!columns.some(column=>column.id===destinationColumnId))throw new KabanosError('COLUMN_DESTINATION_REQUIRED','A valid destination column is required when deleting a populated column.',409);await trx.updateTable('cards').set({column_id:destinationColumnId,updated_at:new Date().toISOString()}).where('column_id','in',removed.map(column=>column.id)).execute();}}\n await trx.deleteFrom('columns').where('board_id','=','default').execute();\n await trx.insertInto('columns').values(columns.map((column,position)=>({id:column.id,board_id:'default',name:column.name,position,completion:column.completion?1:0,color_token:column.colorToken??null}))).execute();\n });\n }\n async close():Promise<void>{await this.db.destroy();}\n}\n\nexport async function createStorage(config:ResolvedKanbanConfig):Promise<SqlStorage>{\n let dialect;\n if(config.storage.adapter==='sqlite'){await mkdir(path.dirname(config.storage.filename),{recursive:true});dialect=new SqliteDialect({database:new Database(config.storage.filename)});}\n else if(config.storage.adapter==='postgres'){const {Pool}=await import('pg');dialect=new PostgresDialect({pool:new Pool({connectionString:config.storage.connectionString})});}\n else {const mysql=await import('mysql2');dialect=new MysqlDialect({pool:mysql.createPool(config.storage.connectionString)});}\n return new SqlStorage(new Kysely<DB>({dialect}),config);\n}\n\nfunction toCard(row:DB['cards']):Card{return{id:row.id,columnId:row.column_id,position:row.position,tag:row.tag,title:row.title,body:row.body,notes:row.notes,...(row.assignee?{assignee:row.assignee}:{}),labels:JSON.parse(row.labels) as string[],priority:row.priority,sourceFilePath:row.source_file_path,sourceLine:row.source_line,sourceContentHash:row.source_content_hash,sourceContextHash:row.source_context_hash,sourceOccurrence:row.source_occurrence,status:row.status as Card['status'],createdAt:row.created_at,updatedAt:row.updated_at};}\nasync function log(db:Kysely<DB>|any,cardId:string,action:string,from:string|null,to:string|null,actor?:Actor){await db.insertInto('activity_log').values({id:randomUUID(),card_id:cardId,action,from_status:from,to_status:to,actor:actor?.id??null,created_at:new Date().toISOString()}).execute();}\n"],"mappings":"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","names":["readFile","path","z","path","path","path","path","readFile","z"]}