@pedroaugusto04/kb-cli 1.1.15 → 1.1.17

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.
@@ -108,12 +108,21 @@ async function syncDirectory(targetDir, defaultProject, ledgerPath, dryRun, file
108
108
  projectSlug: targetProject,
109
109
  tags: parsed.tags || [],
110
110
  status: parsed.status || 'active',
111
- canonicalType: parsed.canonicalType || 'note',
111
+ canonicalType: parsed.canonicalType || 'event',
112
112
  };
113
113
  if (noteId) {
114
114
  // Update existing note
115
115
  try {
116
- await client.updateNote(noteId, notePayload);
116
+ const updatePayload = {
117
+ title: notePayload.title,
118
+ rawText: notePayload.rawText,
119
+ tags: notePayload.tags,
120
+ canonicalType: notePayload.canonicalType,
121
+ };
122
+ if (notePayload.status === 'resolved' || notePayload.status === 'archived') {
123
+ updatePayload.status = notePayload.status;
124
+ }
125
+ await client.updateNote(noteId, updatePayload);
117
126
  stats.updated++;
118
127
  console.log(pc.cyan(`Updated: ${relativePath}`));
119
128
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport pc from 'picocolors';\nimport { spinner, outro } from '@clack/prompts';\nimport { client, ApiClientError } from '../client.js';\nimport { loadConfig } from '../config.js';\n\nexport interface SyncOptions {\n dir: string;\n project?: string;\n dryRun?: boolean;\n watch?: boolean;\n}\n\ninterface LedgerEntry {\n noteId: string;\n sha256: string;\n lastModified: string;\n}\n\ninterface SyncLedger {\n lastSyncedAt: string;\n files: Record<string, LedgerEntry>;\n}\n\nexport async function runSync(options: SyncOptions): Promise<void> {\n const targetPath = path.resolve(options.dir);\n if (!fs.existsSync(targetPath)) {\n console.error(pc.red(`Error: Path not found at ${options.dir}`));\n process.exit(1);\n }\n\n const isFile = fs.statSync(targetPath).isFile();\n const targetDir = isFile ? path.dirname(targetPath) : targetPath;\n const ledgerPath = path.join(targetDir, '.kb-sync.json');\n const filesList = isFile ? [targetPath] : undefined;\n\n const config = loadConfig();\n const defaultProject = options.project || config.defaultProjectSlug || 'inbox';\n\n if (options.dryRun) {\n console.log(pc.yellow('Running in DRY-RUN mode. No changes will be written or sent to the server.'));\n }\n\n if (options.watch) {\n console.log(pc.cyan(`Starting sync in WATCH mode for: ${targetPath}`));\n await syncDirectory(targetDir, defaultProject, ledgerPath, options.dryRun || false, filesList);\n \n // Watch logic\n let debounceTimer: NodeJS.Timeout | null = null;\n fs.watch(targetPath, { recursive: !isFile }, (eventType, filename) => {\n if (!isFile) {\n if (!filename || filename.endsWith('.kb-sync.json') || !filename.endsWith('.md')) return;\n }\n \n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(async () => {\n console.log(pc.blue(`\\nChange detected in ${filename || path.basename(targetPath)}. Syncing...`));\n try {\n await syncDirectory(targetDir, defaultProject, ledgerPath, options.dryRun || false, filesList);\n } catch (err: any) {\n console.error(pc.red(`Watch sync failed: ${err.message}`));\n }\n }, 500);\n });\n \n // Keep process alive in watch mode\n await new Promise(() => {});\n return;\n }\n\n const s = spinner();\n s.start('Synchronizing files...');\n\n try {\n const stats = await syncDirectory(targetDir, defaultProject, ledgerPath, options.dryRun || false, filesList);\n s.stop(pc.green('Sync complete!'));\n \n console.log('\\n' + pc.bold('Sync Summary:'));\n console.log(` - Created: ${pc.green(stats.created)}`);\n console.log(` - Updated: ${pc.cyan(stats.updated)}`);\n console.log(` - Skipped: ${pc.gray(stats.skipped)}`);\n console.log(` - Failed: ${pc.red(stats.failed)}\\n`);\n \n outro(pc.green('Files synced successfully.'));\n } catch (error: any) {\n s.stop(pc.red('Sync failed'));\n console.error(pc.red(`Error: ${error.message || 'Failed to sync folder.'}`));\n process.exit(1);\n }\n}\n\nasync function syncDirectory(\n targetDir: string,\n defaultProject: string,\n ledgerPath: string,\n dryRun: boolean,\n filesList?: string[]\n) {\n const ledger = loadLedger(ledgerPath);\n const files = filesList || getMarkdownFiles(targetDir);\n \n const stats = { created: 0, updated: 0, skipped: 0, failed: 0 };\n const updatedLedgerFiles: Record<string, LedgerEntry> = {};\n\n for (const filePath of files) {\n // Relative path to use as key in ledger\n const relativePath = path.relative(targetDir, filePath).replace(/\\\\/g, '/');\n if (relativePath === '.kb-sync.json') continue;\n\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n const sha256 = calculateSha256(content);\n const mtime = fs.statSync(filePath).mtime.toISOString();\n const filename = path.basename(filePath, '.md');\n\n const parsed = parseMarkdown(content, filename);\n const targetProject = parsed.projectSlug || defaultProject;\n\n // Determine Note ID\n let noteId: string | undefined = parsed.id || ledger.files[relativePath]?.noteId;\n\n // Check if we need to sync\n const ledgerEntry = ledger.files[relativePath];\n if (ledgerEntry && ledgerEntry.sha256 === sha256 && noteId === ledgerEntry.noteId) {\n stats.skipped++;\n updatedLedgerFiles[relativePath] = ledgerEntry;\n continue;\n }\n\n if (dryRun) {\n if (noteId) {\n console.log(pc.cyan(`[Dry-run] Would UPDATE note ${noteId} (${relativePath})`));\n stats.updated++;\n } else {\n console.log(pc.green(`[Dry-run] Would CREATE note for ${relativePath}`));\n stats.created++;\n }\n continue;\n }\n\n // Sync payload\n const notePayload = {\n title: parsed.title,\n rawText: parsed.body,\n projectSlug: targetProject,\n tags: parsed.tags || [],\n status: parsed.status || 'active',\n canonicalType: parsed.canonicalType || 'note',\n };\n\n if (noteId) {\n // Update existing note\n try {\n await client.updateNote(noteId, notePayload);\n stats.updated++;\n console.log(pc.cyan(`Updated: ${relativePath}`));\n } catch (err: any) {\n if (err instanceof ApiClientError && err.status === 404) {\n // Note was deleted remotely, treat as new creation\n console.log(pc.yellow(`Note ${noteId} not found on server. Re-creating: ${relativePath}`));\n noteId = undefined;\n } else {\n throw err;\n }\n }\n }\n\n if (!noteId) {\n // Create new note\n const res = await client.createNote(notePayload);\n const createdId = res.noteId || res.id;\n if (!createdId) {\n throw new Error('Failed to retrieve note ID from server response');\n }\n noteId = createdId;\n stats.created++;\n console.log(pc.green(`Created: ${relativePath}`));\n \n // Inject ID back to frontmatter\n injectIdIntoFrontmatter(filePath, content, noteId as string);\n }\n\n // Record in ledger\n updatedLedgerFiles[relativePath] = {\n noteId: noteId as string,\n sha256: calculateSha256(fs.readFileSync(filePath, 'utf8')), // recalculate in case we injected id\n lastModified: mtime,\n };\n\n } catch (err: any) {\n stats.failed++;\n console.error(pc.red(`Failed to sync ${relativePath}: ${err.message}`));\n }\n }\n\n if (!dryRun) {\n saveLedger(ledgerPath, {\n lastSyncedAt: new Date().toISOString(),\n files: {\n ...ledger.files,\n ...updatedLedgerFiles,\n },\n });\n }\n\n return stats;\n}\n\nconst IGNORED_DIRS = new Set([\n 'node_modules',\n 'dist',\n 'build',\n 'out',\n 'coverage',\n '.git',\n '.next',\n]);\n\nfunction getMarkdownFiles(dir: string): string[] {\n let results: string[] = [];\n const list = fs.readdirSync(dir);\n for (const file of list) {\n if (file.startsWith('.')) continue; // skip hidden dirs/files\n const filePath = path.join(dir, file);\n const stat = fs.statSync(filePath);\n if (stat && stat.isDirectory()) {\n if (IGNORED_DIRS.has(file)) continue;\n results = results.concat(getMarkdownFiles(filePath));\n } else if (file.endsWith('.md')) {\n results.push(filePath);\n }\n }\n return results;\n}\n\nfunction calculateSha256(content: string): string {\n return crypto.createHash('sha256').update(content, 'utf8').digest('hex');\n}\n\nfunction loadLedger(ledgerPath: string): SyncLedger {\n const defaults: SyncLedger = {\n lastSyncedAt: '',\n files: {},\n };\n try {\n if (!fs.existsSync(ledgerPath)) return defaults;\n const data = fs.readFileSync(ledgerPath, 'utf8');\n return JSON.parse(data) as SyncLedger;\n } catch {\n return defaults;\n }\n}\n\nfunction saveLedger(ledgerPath: string, ledger: SyncLedger): void {\n try {\n fs.writeFileSync(ledgerPath, JSON.stringify(ledger, null, 2), 'utf8');\n } catch (err: any) {\n console.error(pc.red(`Error saving sync ledger: ${err.message}`));\n }\n}\n\ninterface ParsedMarkdown {\n id?: string;\n title?: string;\n projectSlug?: string;\n tags?: string[];\n canonicalType?: string;\n status?: string;\n body: string;\n}\n\nfunction parseMarkdown(content: string, fallbackTitle: string): ParsedMarkdown {\n const frontmatterRegex = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n const match = content.match(frontmatterRegex);\n if (!match) {\n return { body: content.trim(), title: fallbackTitle };\n }\n const yaml = match[1];\n const body = content.replace(frontmatterRegex, '').trim();\n const metadata: Record<string, string> = {};\n for (const line of yaml.split('\\n')) {\n const colonIdx = line.indexOf(':');\n if (colonIdx > 0) {\n const key = line.substring(0, colonIdx).trim();\n const val = line.substring(colonIdx + 1).trim();\n metadata[key] = val.replace(/^['\"]|['\"]$/g, '');\n }\n }\n return {\n id: metadata.id || undefined,\n title: metadata.title || fallbackTitle,\n projectSlug: metadata.project || undefined,\n tags: metadata.tags ? metadata.tags.split(',').map(t => t.trim()).filter(Boolean) : undefined,\n canonicalType: metadata.canonicalType || undefined,\n status: metadata.status || undefined,\n body,\n };\n}\n\nfunction injectIdIntoFrontmatter(filePath: string, content: string, id: string): void {\n const frontmatterRegex = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n const match = content.match(frontmatterRegex);\n if (match) {\n const yaml = match[1];\n if (yaml.includes('id:')) {\n const updatedYaml = yaml.replace(/id:\\s*[^\\r\\n]*/, `id: ${id}`);\n const updatedContent = content.replace(frontmatterRegex, `---\\n${updatedYaml}\\n---`);\n fs.writeFileSync(filePath, updatedContent, 'utf8');\n } else {\n const updatedYaml = `id: ${id}\\n${yaml}`;\n const updatedContent = content.replace(frontmatterRegex, `---\\n${updatedYaml}\\n---`);\n fs.writeFileSync(filePath, updatedContent, 'utf8');\n }\n } else {\n const updatedContent = `---\\nid: ${id}\\n---\\n${content}`;\n fs.writeFileSync(filePath, updatedContent, 'utf8');\n }\n}\n"]}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport pc from 'picocolors';\nimport { spinner, outro } from '@clack/prompts';\nimport { client, ApiClientError } from '../client.js';\nimport { loadConfig } from '../config.js';\n\nexport interface SyncOptions {\n dir: string;\n project?: string;\n dryRun?: boolean;\n watch?: boolean;\n}\n\ninterface LedgerEntry {\n noteId: string;\n sha256: string;\n lastModified: string;\n}\n\ninterface SyncLedger {\n lastSyncedAt: string;\n files: Record<string, LedgerEntry>;\n}\n\nexport async function runSync(options: SyncOptions): Promise<void> {\n const targetPath = path.resolve(options.dir);\n if (!fs.existsSync(targetPath)) {\n console.error(pc.red(`Error: Path not found at ${options.dir}`));\n process.exit(1);\n }\n\n const isFile = fs.statSync(targetPath).isFile();\n const targetDir = isFile ? path.dirname(targetPath) : targetPath;\n const ledgerPath = path.join(targetDir, '.kb-sync.json');\n const filesList = isFile ? [targetPath] : undefined;\n\n const config = loadConfig();\n const defaultProject = options.project || config.defaultProjectSlug || 'inbox';\n\n if (options.dryRun) {\n console.log(pc.yellow('Running in DRY-RUN mode. No changes will be written or sent to the server.'));\n }\n\n if (options.watch) {\n console.log(pc.cyan(`Starting sync in WATCH mode for: ${targetPath}`));\n await syncDirectory(targetDir, defaultProject, ledgerPath, options.dryRun || false, filesList);\n\n // Watch logic\n let debounceTimer: NodeJS.Timeout | null = null;\n fs.watch(targetPath, { recursive: !isFile }, (eventType, filename) => {\n if (!isFile) {\n if (!filename || filename.endsWith('.kb-sync.json') || !filename.endsWith('.md')) return;\n }\n\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(async () => {\n console.log(pc.blue(`\\nChange detected in ${filename || path.basename(targetPath)}. Syncing...`));\n try {\n await syncDirectory(targetDir, defaultProject, ledgerPath, options.dryRun || false, filesList);\n } catch (err: any) {\n console.error(pc.red(`Watch sync failed: ${err.message}`));\n }\n }, 500);\n });\n\n // Keep process alive in watch mode\n await new Promise(() => { });\n return;\n }\n\n const s = spinner();\n s.start('Synchronizing files...');\n\n try {\n const stats = await syncDirectory(targetDir, defaultProject, ledgerPath, options.dryRun || false, filesList);\n s.stop(pc.green('Sync complete!'));\n\n console.log('\\n' + pc.bold('Sync Summary:'));\n console.log(` - Created: ${pc.green(stats.created)}`);\n console.log(` - Updated: ${pc.cyan(stats.updated)}`);\n console.log(` - Skipped: ${pc.gray(stats.skipped)}`);\n console.log(` - Failed: ${pc.red(stats.failed)}\\n`);\n\n outro(pc.green('Files synced successfully.'));\n } catch (error: any) {\n s.stop(pc.red('Sync failed'));\n console.error(pc.red(`Error: ${error.message || 'Failed to sync folder.'}`));\n process.exit(1);\n }\n}\n\nasync function syncDirectory(\n targetDir: string,\n defaultProject: string,\n ledgerPath: string,\n dryRun: boolean,\n filesList?: string[]\n) {\n const ledger = loadLedger(ledgerPath);\n const files = filesList || getMarkdownFiles(targetDir);\n\n const stats = { created: 0, updated: 0, skipped: 0, failed: 0 };\n const updatedLedgerFiles: Record<string, LedgerEntry> = {};\n\n for (const filePath of files) {\n // Relative path to use as key in ledger\n const relativePath = path.relative(targetDir, filePath).replace(/\\\\/g, '/');\n if (relativePath === '.kb-sync.json') continue;\n\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n const sha256 = calculateSha256(content);\n const mtime = fs.statSync(filePath).mtime.toISOString();\n const filename = path.basename(filePath, '.md');\n\n const parsed = parseMarkdown(content, filename);\n const targetProject = parsed.projectSlug || defaultProject;\n\n // Determine Note ID\n let noteId: string | undefined = parsed.id || ledger.files[relativePath]?.noteId;\n\n // Check if we need to sync\n const ledgerEntry = ledger.files[relativePath];\n if (ledgerEntry && ledgerEntry.sha256 === sha256 && noteId === ledgerEntry.noteId) {\n stats.skipped++;\n updatedLedgerFiles[relativePath] = ledgerEntry;\n continue;\n }\n\n if (dryRun) {\n if (noteId) {\n console.log(pc.cyan(`[Dry-run] Would UPDATE note ${noteId} (${relativePath})`));\n stats.updated++;\n } else {\n console.log(pc.green(`[Dry-run] Would CREATE note for ${relativePath}`));\n stats.created++;\n }\n continue;\n }\n\n // Sync payload\n const notePayload = {\n title: parsed.title,\n rawText: parsed.body,\n projectSlug: targetProject,\n tags: parsed.tags || [],\n status: parsed.status || 'active',\n canonicalType: parsed.canonicalType || 'event',\n };\n\n if (noteId) {\n // Update existing note\n try {\n const updatePayload: any = {\n title: notePayload.title,\n rawText: notePayload.rawText,\n tags: notePayload.tags,\n canonicalType: notePayload.canonicalType,\n };\n if (notePayload.status === 'resolved' || notePayload.status === 'archived') {\n updatePayload.status = notePayload.status;\n }\n await client.updateNote(noteId, updatePayload);\n stats.updated++;\n console.log(pc.cyan(`Updated: ${relativePath}`));\n } catch (err: any) {\n if (err instanceof ApiClientError && err.status === 404) {\n // Note was deleted remotely, treat as new creation\n console.log(pc.yellow(`Note ${noteId} not found on server. Re-creating: ${relativePath}`));\n noteId = undefined;\n } else {\n throw err;\n }\n }\n }\n\n if (!noteId) {\n // Create new note\n const res = await client.createNote(notePayload);\n const createdId = res.noteId || res.id;\n if (!createdId) {\n throw new Error('Failed to retrieve note ID from server response');\n }\n noteId = createdId;\n stats.created++;\n console.log(pc.green(`Created: ${relativePath}`));\n\n // Inject ID back to frontmatter\n injectIdIntoFrontmatter(filePath, content, noteId as string);\n }\n\n // Record in ledger\n updatedLedgerFiles[relativePath] = {\n noteId: noteId as string,\n sha256: calculateSha256(fs.readFileSync(filePath, 'utf8')), // recalculate in case we injected id\n lastModified: mtime,\n };\n\n } catch (err: any) {\n stats.failed++;\n console.error(pc.red(`Failed to sync ${relativePath}: ${err.message}`));\n }\n }\n\n if (!dryRun) {\n saveLedger(ledgerPath, {\n lastSyncedAt: new Date().toISOString(),\n files: {\n ...ledger.files,\n ...updatedLedgerFiles,\n },\n });\n }\n\n return stats;\n}\n\nconst IGNORED_DIRS = new Set([\n 'node_modules',\n 'dist',\n 'build',\n 'out',\n 'coverage',\n '.git',\n '.next',\n]);\n\nfunction getMarkdownFiles(dir: string): string[] {\n let results: string[] = [];\n const list = fs.readdirSync(dir);\n for (const file of list) {\n if (file.startsWith('.')) continue; // skip hidden dirs/files\n const filePath = path.join(dir, file);\n const stat = fs.statSync(filePath);\n if (stat && stat.isDirectory()) {\n if (IGNORED_DIRS.has(file)) continue;\n results = results.concat(getMarkdownFiles(filePath));\n } else if (file.endsWith('.md')) {\n results.push(filePath);\n }\n }\n return results;\n}\n\nfunction calculateSha256(content: string): string {\n return crypto.createHash('sha256').update(content, 'utf8').digest('hex');\n}\n\nfunction loadLedger(ledgerPath: string): SyncLedger {\n const defaults: SyncLedger = {\n lastSyncedAt: '',\n files: {},\n };\n try {\n if (!fs.existsSync(ledgerPath)) return defaults;\n const data = fs.readFileSync(ledgerPath, 'utf8');\n return JSON.parse(data) as SyncLedger;\n } catch {\n return defaults;\n }\n}\n\nfunction saveLedger(ledgerPath: string, ledger: SyncLedger): void {\n try {\n fs.writeFileSync(ledgerPath, JSON.stringify(ledger, null, 2), 'utf8');\n } catch (err: any) {\n console.error(pc.red(`Error saving sync ledger: ${err.message}`));\n }\n}\n\ninterface ParsedMarkdown {\n id?: string;\n title?: string;\n projectSlug?: string;\n tags?: string[];\n canonicalType?: string;\n status?: string;\n body: string;\n}\n\nfunction parseMarkdown(content: string, fallbackTitle: string): ParsedMarkdown {\n const frontmatterRegex = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n const match = content.match(frontmatterRegex);\n if (!match) {\n return { body: content.trim(), title: fallbackTitle };\n }\n const yaml = match[1];\n const body = content.replace(frontmatterRegex, '').trim();\n const metadata: Record<string, string> = {};\n for (const line of yaml.split('\\n')) {\n const colonIdx = line.indexOf(':');\n if (colonIdx > 0) {\n const key = line.substring(0, colonIdx).trim();\n const val = line.substring(colonIdx + 1).trim();\n metadata[key] = val.replace(/^['\"]|['\"]$/g, '');\n }\n }\n return {\n id: metadata.id || undefined,\n title: metadata.title || fallbackTitle,\n projectSlug: metadata.project || undefined,\n tags: metadata.tags ? metadata.tags.split(',').map(t => t.trim()).filter(Boolean) : undefined,\n canonicalType: metadata.canonicalType || undefined,\n status: metadata.status || undefined,\n body,\n };\n}\n\nfunction injectIdIntoFrontmatter(filePath: string, content: string, id: string): void {\n const frontmatterRegex = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n const match = content.match(frontmatterRegex);\n if (match) {\n const yaml = match[1];\n if (yaml.includes('id:')) {\n const updatedYaml = yaml.replace(/id:\\s*[^\\r\\n]*/, `id: ${id}`);\n const updatedContent = content.replace(frontmatterRegex, `---\\n${updatedYaml}\\n---`);\n fs.writeFileSync(filePath, updatedContent, 'utf8');\n } else {\n const updatedYaml = `id: ${id}\\n${yaml}`;\n const updatedContent = content.replace(frontmatterRegex, `---\\n${updatedYaml}\\n---`);\n fs.writeFileSync(filePath, updatedContent, 'utf8');\n }\n } else {\n const updatedContent = `---\\nid: ${id}\\n---\\n${content}`;\n fs.writeFileSync(filePath, updatedContent, 'utf8');\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pedroaugusto04/kb-cli",
3
- "version": "1.1.15",
3
+ "version": "1.1.17",
4
4
  "description": "CLI client for the Knowledge Base AI system",
5
5
  "type": "module",
6
6
  "bin": {