@pedroaugusto04/kb-cli 1.1.19 → 1.2.1

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.
@@ -10,6 +10,7 @@ const COMMANDS = [
10
10
  '/save ',
11
11
  '/ask ',
12
12
  '/sync ',
13
+ '/sync-ai',
13
14
  '/logout',
14
15
  '/exit',
15
16
  'projects',
@@ -235,6 +236,10 @@ export async function runRepl() {
235
236
  console.log(` ${pc.yellow('--dry-run')} Analyze changes without uploading`);
236
237
  console.log(` ${pc.yellow('-w, --watch')} Watch directory/file for real-time changes`);
237
238
  console.log(` ${pc.gray('Example:')} /sync ./README.md -p platform --dry-run\n`);
239
+ console.log(` ${pc.bold('/sync-ai')} - Sync/import recent local AI sessions (Claude Code, Codex, Antigravity, OpenCode)`);
240
+ console.log(` ${pc.gray('Options:')}`);
241
+ console.log(` ${pc.yellow('-p, --project <slug>')} Specify project context`);
242
+ console.log(` ${pc.gray('Example:')} /sync-ai -p platform\n`);
238
243
  console.log(` ${pc.bold('projects')} - List all projects in active workspace`);
239
244
  console.log(` ${pc.bold('workspaces')} - List available workspaces`);
240
245
  console.log(` ${pc.bold('config list')} - List all CLI config values`);
@@ -319,6 +324,18 @@ export async function runRepl() {
319
324
  }
320
325
  continue;
321
326
  }
327
+ if (trimmed === '/sync-ai' || trimmed.startsWith('/sync-ai ')) {
328
+ const rawSync = trimmed.startsWith('/sync-ai ') ? trimmed.substring(9).trim() : '';
329
+ const { options } = parseReplOptions(rawSync);
330
+ const { runSyncAi } = await import('./sync-ai.js');
331
+ try {
332
+ await runSyncAi({ project: options.project });
333
+ }
334
+ catch (err) {
335
+ console.error(pc.red(`Sync-AI failed: ${err.message}`));
336
+ }
337
+ continue;
338
+ }
322
339
  if (trimmed.startsWith('/')) {
323
340
  console.log(pc.red(`Unknown command: ${trimmed}. Type 'help' for available commands.`));
324
341
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/commands/repl.ts"],"names":[],"mappings":"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","sourcesContent":["import readline from 'node:readline';\nimport pc from 'picocolors';\nimport { runAsk } from './ask.js';\nimport { runNote } from './note.js';\nimport { runListProjects, runListWorkspaces } from './list.js';\nimport { runLogout } from './logout.js';\nimport { runConfigGet, runConfigSet, runConfigList } from './config.js';\nimport { loadConfig } from '../config.js';\n\nconst COMMANDS = [\n '/save ',\n '/ask ',\n '/sync ',\n '/logout',\n '/exit',\n 'projects',\n 'workspaces',\n 'config list',\n 'config get ',\n 'config set ',\n 'help'\n];\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');\n}\n\nfunction readlineAutocompletePrompt(promptText: string, commands: string[]): Promise<string> {\n return new Promise((resolve) => {\n let input = '';\n let cursor = 0;\n let selectedIndex = 0;\n\n function getMatches(currentInput: string): string[] {\n const trimmed = currentInput.trim();\n if (!trimmed) return [];\n return commands.filter((c) => c.startsWith(trimmed));\n }\n\n function cleanupOverlay(matches: string[]) {\n if (matches.length > 0) {\n readline.cursorTo(process.stdout, 0);\n readline.clearLine(process.stdout, 0);\n // Move cursor down to clear each suggestion line\n for (let i = 0; i < matches.length; i++) {\n process.stdout.write('\\n');\n readline.clearLine(process.stdout, 0);\n }\n // Return cursor to prompt line\n readline.moveCursor(process.stdout, 0, -matches.length);\n readline.clearScreenDown(process.stdout);\n }\n }\n\n function render() {\n const matches = getMatches(input);\n\n // Clean prompt line\n readline.cursorTo(process.stdout, 0);\n readline.clearLine(process.stdout, 0);\n\n // Write prompt and user input\n process.stdout.write(promptText + input);\n\n // Clear any remaining lines below\n readline.clearScreenDown(process.stdout);\n\n if (matches.length > 0) {\n process.stdout.write('\\n');\n matches.forEach((match, index) => {\n if (index === selectedIndex) {\n // Glow blue selection bar\n process.stdout.write(` ${pc.bgBlue(pc.white(pc.bold(` ❯ ${match.padEnd(16)} `)))}\\n`);\n } else {\n process.stdout.write(` ${pc.cyan(match)}\\n`);\n }\n });\n\n // Return cursor back to prompt line\n readline.moveCursor(process.stdout, 0, -(matches.length + 1));\n }\n\n // Restore cursor position inside input buffer\n readline.cursorTo(process.stdout, stripAnsi(promptText).length + cursor);\n }\n\n function onKeypress(str: string, key: any) {\n const matches = getMatches(input);\n\n if (key && key.ctrl && key.name === 'c') {\n cleanupOverlay(matches);\n process.stdin.removeListener('keypress', onKeypress);\n process.stdin.setRawMode(false);\n console.log();\n process.exit(0);\n }\n\n if (key && (key.name === 'return' || key.name === 'enter')) {\n if (matches.length > 0) {\n const selectedMatch = matches[selectedIndex];\n \n if (selectedMatch === '/save ' || selectedMatch === '/ask ') {\n // Autofill command and let user continue typing note/question\n cleanupOverlay(matches);\n input = selectedMatch;\n cursor = input.length;\n selectedIndex = 0;\n render();\n return;\n }\n\n // Self-executing commands\n cleanupOverlay(matches);\n process.stdin.removeListener('keypress', onKeypress);\n process.stdin.setRawMode(false);\n console.log();\n resolve(selectedMatch);\n return;\n }\n\n // Normal text submission\n cleanupOverlay(matches);\n process.stdin.removeListener('keypress', onKeypress);\n process.stdin.setRawMode(false);\n console.log();\n resolve(input);\n return;\n }\n\n if (key && key.name === 'up') {\n if (matches.length > 0) {\n selectedIndex = (selectedIndex - 1 + matches.length) % matches.length;\n }\n render();\n return;\n }\n\n if (key && key.name === 'down') {\n if (matches.length > 0) {\n selectedIndex = (selectedIndex + 1) % matches.length;\n }\n render();\n return;\n }\n\n if (key && key.name === 'tab') {\n if (matches.length > 0) {\n const selectedMatch = matches[selectedIndex];\n input = selectedMatch;\n cursor = input.length;\n selectedIndex = 0;\n }\n render();\n return;\n }\n\n if (key && (key.name === 'backspace' || key.name === 'delete' || str === '\\u007f' || str === '\\b')) {\n if (cursor > 0) {\n // Clear current overlay matches before modifying input\n cleanupOverlay(matches);\n input = input.slice(0, cursor - 1) + input.slice(cursor);\n cursor--;\n selectedIndex = 0;\n }\n render();\n return;\n }\n\n if (key && key.name === 'left') {\n if (cursor > 0) cursor--;\n render();\n return;\n }\n\n if (key && key.name === 'right') {\n if (cursor < input.length) cursor++;\n render();\n return;\n }\n\n // Handle normal printable characters\n if (str && str.length === 1 && (!key || (!key.meta && !key.ctrl && key.name !== 'escape'))) {\n cleanupOverlay(matches);\n input = input.slice(0, cursor) + str + input.slice(cursor);\n cursor += str.length;\n selectedIndex = 0;\n render();\n }\n }\n\n process.stdin.resume();\n readline.emitKeypressEvents(process.stdin);\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.on('keypress', onKeypress);\n render();\n });\n}\n\nfunction parseReplOptions(argsString: string): { text: string; options: { project?: string; file?: string } } {\n const options: { project?: string; file?: string } = {};\n let text = argsString;\n\n // Match -p/--project option\n const projectRegex = /(?:-p|--project)(?:\\s+|=)(?:'([^']+)'|\"([^\"]+)\"|([^\\s]+))/i;\n let match;\n while ((match = projectRegex.exec(text))) {\n options.project = match[1] || match[2] || match[3];\n text = text.replace(match[0], '').trim();\n }\n\n // Match -f/--file option\n const fileRegex = /(?:-f|--file)(?:\\s+|=)(?:'([^']+)'|\"([^\"]+)\"|([^\\s]+))/i;\n while ((match = fileRegex.exec(text))) {\n options.file = match[1] || match[2] || match[3];\n text = text.replace(match[0], '').trim();\n }\n\n // Clean up multiple spaces\n text = text.replace(/\\s+/g, ' ').trim();\n\n return { text, options };\n}\n\nexport async function runRepl(): Promise<void> {\n const config = loadConfig();\n console.log(pc.cyan('================================================'));\n console.log(pc.cyan(` Knowledge Base Interactive Session `));\n console.log(pc.cyan(` Active Workspace: ${pc.bold(config.workspaceSlug)}`));\n console.log(pc.cyan(` Type ${pc.bold('/exit')} to quit, ${pc.bold('help')} for command list.`));\n console.log(pc.cyan(` [TAB] or [UP/DOWN] to select autocomplete commands.`));\n console.log(pc.cyan('================================================\\n'));\n\n while (true) {\n const promptLabel = pc.magenta('kb> ');\n const line = await readlineAutocompletePrompt(promptLabel, COMMANDS);\n const trimmed = line.trim();\n\n if (!trimmed) {\n continue;\n }\n\n if (trimmed === '/exit' || trimmed === 'exit' || trimmed === 'quit') {\n console.log(pc.gray('Goodbye!'));\n process.exit(0);\n }\n\n if (trimmed === 'help') {\n console.log(pc.cyan('\\nInteractive Command List & Options:'));\n console.log(` ${pc.bold('/ask <question>')} - Query the knowledge base`);\n console.log(` ${pc.gray('Options:')}`);\n console.log(` ${pc.yellow('-p, --project <slug>')} Specify project context for the query`);\n console.log(` ${pc.gray('Example:')} /ask -p platform How to deploy?\\n`);\n\n console.log(` ${pc.bold('/save <note>')} - Send a note to the agent`);\n console.log(` ${pc.gray('Options:')}`);\n console.log(` ${pc.yellow('-p, --project <slug>')} Specify project context`);\n console.log(` ${pc.yellow('-f, --file <path>')} Attach a file to the note`);\n console.log(` ${pc.gray('Example:')} /save -p inbox -f ./todo.txt review this file\\n`);\n\n console.log(` ${pc.bold('<any text>')} - Sends text directly to the agent (shortcut for /save)`);\n console.log(` ${pc.gray('Options:')} Supports same -p and -f options as /save`);\n console.log(` ${pc.gray('Example:')} My note text -p platform\\n`);\n\n console.log(` ${pc.bold('/sync <path>')} - Sync a local directory or single markdown file`);\n console.log(` ${pc.gray('Options:')}`);\n console.log(` ${pc.yellow('-p, --project <slug>')} Specify default project context`);\n console.log(` ${pc.yellow('--dry-run')} Analyze changes without uploading`);\n console.log(` ${pc.yellow('-w, --watch')} Watch directory/file for real-time changes`);\n console.log(` ${pc.gray('Example:')} /sync ./README.md -p platform --dry-run\\n`);\n\n console.log(` ${pc.bold('projects')} - List all projects in active workspace`);\n console.log(` ${pc.bold('workspaces')} - List available workspaces`);\n console.log(` ${pc.bold('config list')} - List all CLI config values`);\n console.log(` ${pc.bold('config get <key>')} - Get a CLI config value`);\n console.log(` ${pc.bold('config set <key> <val>')} - Set a CLI config value`);\n console.log(` ${pc.bold('/logout')} - Log out of session`);\n console.log(` ${pc.bold('/exit')} - Exit session\\n`);\n continue;\n }\n\n if (trimmed === 'projects') {\n await runListProjects();\n continue;\n }\n\n if (trimmed === 'workspaces') {\n await runListWorkspaces();\n continue;\n }\n\n if (trimmed === 'config' || trimmed === 'config list') {\n runConfigList();\n continue;\n }\n\n if (trimmed.startsWith('config get ')) {\n const key = trimmed.substring(11).trim();\n runConfigGet(key, true);\n continue;\n }\n\n if (trimmed.startsWith('config set ')) {\n const parts = trimmed.substring(11).trim().split(/\\s+/);\n const key = parts[0] || '';\n const value = parts.slice(1).join(' ');\n if (!key || !value) {\n console.log(pc.yellow('Usage: config set <key> <value>'));\n } else {\n runConfigSet(key, value, true);\n }\n continue;\n }\n\n if (trimmed === '/logout') {\n await runLogout();\n console.log(pc.yellow('Exiting REPL session.'));\n process.exit(0);\n }\n\n // Process Slash Commands\n if (trimmed.startsWith('/ask ')) {\n const rawQuestion = trimmed.substring(5).trim();\n const { text: question, options } = parseReplOptions(rawQuestion);\n await runAsk(question, options);\n continue;\n }\n\n if (trimmed === '/save' || trimmed.startsWith('/save ')) {\n const rawNote = trimmed.startsWith('/save ') ? trimmed.substring(6).trim() : '';\n if (!rawNote) {\n console.log(pc.yellow('Please provide note text (e.g. /save My new note)'));\n continue;\n }\n const { text: note, options } = parseReplOptions(rawNote);\n await runNote(note, options);\n continue;\n }\n\n if (trimmed.startsWith('/sync ')) {\n const rawSync = trimmed.substring(6).trim();\n const dryRun = rawSync.includes('--dry-run');\n const watch = rawSync.includes('--watch') || rawSync.includes(' -w');\n let cleaned = rawSync.replace('--dry-run', '').replace('--watch', '').replace(' -w', '').trim();\n const { text: dirPath, options } = parseReplOptions(cleaned);\n\n if (!dirPath) {\n console.log(pc.yellow('Usage: /sync <path> [options]'));\n continue;\n }\n\n const { runSync } = await import('./sync.js');\n try {\n await runSync({\n dir: dirPath,\n project: options.project,\n dryRun,\n watch,\n });\n } catch (err: any) {\n console.error(pc.red(`Sync failed: ${err.message}`));\n }\n continue;\n }\n\n if (trimmed.startsWith('/')) {\n console.log(pc.red(`Unknown command: ${trimmed}. Type 'help' for available commands.`));\n continue;\n }\n\n // Default note creation shortcut\n const { text: noteText, options } = parseReplOptions(trimmed);\n await runNote(noteText, options);\n }\n}\n"]}
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/commands/repl.ts"],"names":[],"mappings":"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","sourcesContent":["import readline from 'node:readline';\nimport pc from 'picocolors';\nimport { runAsk } from './ask.js';\nimport { runNote } from './note.js';\nimport { runListProjects, runListWorkspaces } from './list.js';\nimport { runLogout } from './logout.js';\nimport { runConfigGet, runConfigSet, runConfigList } from './config.js';\nimport { loadConfig } from '../config.js';\n\nconst COMMANDS = [\n '/save ',\n '/ask ',\n '/sync ',\n '/sync-ai',\n '/logout',\n '/exit',\n 'projects',\n 'workspaces',\n 'config list',\n 'config get ',\n 'config set ',\n 'help'\n];\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');\n}\n\nfunction readlineAutocompletePrompt(promptText: string, commands: string[]): Promise<string> {\n return new Promise((resolve) => {\n let input = '';\n let cursor = 0;\n let selectedIndex = 0;\n\n function getMatches(currentInput: string): string[] {\n const trimmed = currentInput.trim();\n if (!trimmed) return [];\n return commands.filter((c) => c.startsWith(trimmed));\n }\n\n function cleanupOverlay(matches: string[]) {\n if (matches.length > 0) {\n readline.cursorTo(process.stdout, 0);\n readline.clearLine(process.stdout, 0);\n // Move cursor down to clear each suggestion line\n for (let i = 0; i < matches.length; i++) {\n process.stdout.write('\\n');\n readline.clearLine(process.stdout, 0);\n }\n // Return cursor to prompt line\n readline.moveCursor(process.stdout, 0, -matches.length);\n readline.clearScreenDown(process.stdout);\n }\n }\n\n function render() {\n const matches = getMatches(input);\n\n // Clean prompt line\n readline.cursorTo(process.stdout, 0);\n readline.clearLine(process.stdout, 0);\n\n // Write prompt and user input\n process.stdout.write(promptText + input);\n\n // Clear any remaining lines below\n readline.clearScreenDown(process.stdout);\n\n if (matches.length > 0) {\n process.stdout.write('\\n');\n matches.forEach((match, index) => {\n if (index === selectedIndex) {\n // Glow blue selection bar\n process.stdout.write(` ${pc.bgBlue(pc.white(pc.bold(` ❯ ${match.padEnd(16)} `)))}\\n`);\n } else {\n process.stdout.write(` ${pc.cyan(match)}\\n`);\n }\n });\n\n // Return cursor back to prompt line\n readline.moveCursor(process.stdout, 0, -(matches.length + 1));\n }\n\n // Restore cursor position inside input buffer\n readline.cursorTo(process.stdout, stripAnsi(promptText).length + cursor);\n }\n\n function onKeypress(str: string, key: any) {\n const matches = getMatches(input);\n\n if (key && key.ctrl && key.name === 'c') {\n cleanupOverlay(matches);\n process.stdin.removeListener('keypress', onKeypress);\n process.stdin.setRawMode(false);\n console.log();\n process.exit(0);\n }\n\n if (key && (key.name === 'return' || key.name === 'enter')) {\n if (matches.length > 0) {\n const selectedMatch = matches[selectedIndex];\n \n if (selectedMatch === '/save ' || selectedMatch === '/ask ') {\n // Autofill command and let user continue typing note/question\n cleanupOverlay(matches);\n input = selectedMatch;\n cursor = input.length;\n selectedIndex = 0;\n render();\n return;\n }\n\n // Self-executing commands\n cleanupOverlay(matches);\n process.stdin.removeListener('keypress', onKeypress);\n process.stdin.setRawMode(false);\n console.log();\n resolve(selectedMatch);\n return;\n }\n\n // Normal text submission\n cleanupOverlay(matches);\n process.stdin.removeListener('keypress', onKeypress);\n process.stdin.setRawMode(false);\n console.log();\n resolve(input);\n return;\n }\n\n if (key && key.name === 'up') {\n if (matches.length > 0) {\n selectedIndex = (selectedIndex - 1 + matches.length) % matches.length;\n }\n render();\n return;\n }\n\n if (key && key.name === 'down') {\n if (matches.length > 0) {\n selectedIndex = (selectedIndex + 1) % matches.length;\n }\n render();\n return;\n }\n\n if (key && key.name === 'tab') {\n if (matches.length > 0) {\n const selectedMatch = matches[selectedIndex];\n input = selectedMatch;\n cursor = input.length;\n selectedIndex = 0;\n }\n render();\n return;\n }\n\n if (key && (key.name === 'backspace' || key.name === 'delete' || str === '\\u007f' || str === '\\b')) {\n if (cursor > 0) {\n // Clear current overlay matches before modifying input\n cleanupOverlay(matches);\n input = input.slice(0, cursor - 1) + input.slice(cursor);\n cursor--;\n selectedIndex = 0;\n }\n render();\n return;\n }\n\n if (key && key.name === 'left') {\n if (cursor > 0) cursor--;\n render();\n return;\n }\n\n if (key && key.name === 'right') {\n if (cursor < input.length) cursor++;\n render();\n return;\n }\n\n // Handle normal printable characters\n if (str && str.length === 1 && (!key || (!key.meta && !key.ctrl && key.name !== 'escape'))) {\n cleanupOverlay(matches);\n input = input.slice(0, cursor) + str + input.slice(cursor);\n cursor += str.length;\n selectedIndex = 0;\n render();\n }\n }\n\n process.stdin.resume();\n readline.emitKeypressEvents(process.stdin);\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.on('keypress', onKeypress);\n render();\n });\n}\n\nfunction parseReplOptions(argsString: string): { text: string; options: { project?: string; file?: string } } {\n const options: { project?: string; file?: string } = {};\n let text = argsString;\n\n // Match -p/--project option\n const projectRegex = /(?:-p|--project)(?:\\s+|=)(?:'([^']+)'|\"([^\"]+)\"|([^\\s]+))/i;\n let match;\n while ((match = projectRegex.exec(text))) {\n options.project = match[1] || match[2] || match[3];\n text = text.replace(match[0], '').trim();\n }\n\n // Match -f/--file option\n const fileRegex = /(?:-f|--file)(?:\\s+|=)(?:'([^']+)'|\"([^\"]+)\"|([^\\s]+))/i;\n while ((match = fileRegex.exec(text))) {\n options.file = match[1] || match[2] || match[3];\n text = text.replace(match[0], '').trim();\n }\n\n // Clean up multiple spaces\n text = text.replace(/\\s+/g, ' ').trim();\n\n return { text, options };\n}\n\nexport async function runRepl(): Promise<void> {\n const config = loadConfig();\n console.log(pc.cyan('================================================'));\n console.log(pc.cyan(` Knowledge Base Interactive Session `));\n console.log(pc.cyan(` Active Workspace: ${pc.bold(config.workspaceSlug)}`));\n console.log(pc.cyan(` Type ${pc.bold('/exit')} to quit, ${pc.bold('help')} for command list.`));\n console.log(pc.cyan(` [TAB] or [UP/DOWN] to select autocomplete commands.`));\n console.log(pc.cyan('================================================\\n'));\n\n while (true) {\n const promptLabel = pc.magenta('kb> ');\n const line = await readlineAutocompletePrompt(promptLabel, COMMANDS);\n const trimmed = line.trim();\n\n if (!trimmed) {\n continue;\n }\n\n if (trimmed === '/exit' || trimmed === 'exit' || trimmed === 'quit') {\n console.log(pc.gray('Goodbye!'));\n process.exit(0);\n }\n\n if (trimmed === 'help') {\n console.log(pc.cyan('\\nInteractive Command List & Options:'));\n console.log(` ${pc.bold('/ask <question>')} - Query the knowledge base`);\n console.log(` ${pc.gray('Options:')}`);\n console.log(` ${pc.yellow('-p, --project <slug>')} Specify project context for the query`);\n console.log(` ${pc.gray('Example:')} /ask -p platform How to deploy?\\n`);\n\n console.log(` ${pc.bold('/save <note>')} - Send a note to the agent`);\n console.log(` ${pc.gray('Options:')}`);\n console.log(` ${pc.yellow('-p, --project <slug>')} Specify project context`);\n console.log(` ${pc.yellow('-f, --file <path>')} Attach a file to the note`);\n console.log(` ${pc.gray('Example:')} /save -p inbox -f ./todo.txt review this file\\n`);\n\n console.log(` ${pc.bold('<any text>')} - Sends text directly to the agent (shortcut for /save)`);\n console.log(` ${pc.gray('Options:')} Supports same -p and -f options as /save`);\n console.log(` ${pc.gray('Example:')} My note text -p platform\\n`);\n\n console.log(` ${pc.bold('/sync <path>')} - Sync a local directory or single markdown file`);\n console.log(` ${pc.gray('Options:')}`);\n console.log(` ${pc.yellow('-p, --project <slug>')} Specify default project context`);\n console.log(` ${pc.yellow('--dry-run')} Analyze changes without uploading`);\n console.log(` ${pc.yellow('-w, --watch')} Watch directory/file for real-time changes`);\n console.log(` ${pc.gray('Example:')} /sync ./README.md -p platform --dry-run\\n`);\n\n console.log(` ${pc.bold('/sync-ai')} - Sync/import recent local AI sessions (Claude Code, Codex, Antigravity, OpenCode)`);\n console.log(` ${pc.gray('Options:')}`);\n console.log(` ${pc.yellow('-p, --project <slug>')} Specify project context`);\n console.log(` ${pc.gray('Example:')} /sync-ai -p platform\\n`);\n\n console.log(` ${pc.bold('projects')} - List all projects in active workspace`);\n console.log(` ${pc.bold('workspaces')} - List available workspaces`);\n console.log(` ${pc.bold('config list')} - List all CLI config values`);\n console.log(` ${pc.bold('config get <key>')} - Get a CLI config value`);\n console.log(` ${pc.bold('config set <key> <val>')} - Set a CLI config value`);\n console.log(` ${pc.bold('/logout')} - Log out of session`);\n console.log(` ${pc.bold('/exit')} - Exit session\\n`);\n continue;\n }\n\n if (trimmed === 'projects') {\n await runListProjects();\n continue;\n }\n\n if (trimmed === 'workspaces') {\n await runListWorkspaces();\n continue;\n }\n\n if (trimmed === 'config' || trimmed === 'config list') {\n runConfigList();\n continue;\n }\n\n if (trimmed.startsWith('config get ')) {\n const key = trimmed.substring(11).trim();\n runConfigGet(key, true);\n continue;\n }\n\n if (trimmed.startsWith('config set ')) {\n const parts = trimmed.substring(11).trim().split(/\\s+/);\n const key = parts[0] || '';\n const value = parts.slice(1).join(' ');\n if (!key || !value) {\n console.log(pc.yellow('Usage: config set <key> <value>'));\n } else {\n runConfigSet(key, value, true);\n }\n continue;\n }\n\n if (trimmed === '/logout') {\n await runLogout();\n console.log(pc.yellow('Exiting REPL session.'));\n process.exit(0);\n }\n\n // Process Slash Commands\n if (trimmed.startsWith('/ask ')) {\n const rawQuestion = trimmed.substring(5).trim();\n const { text: question, options } = parseReplOptions(rawQuestion);\n await runAsk(question, options);\n continue;\n }\n\n if (trimmed === '/save' || trimmed.startsWith('/save ')) {\n const rawNote = trimmed.startsWith('/save ') ? trimmed.substring(6).trim() : '';\n if (!rawNote) {\n console.log(pc.yellow('Please provide note text (e.g. /save My new note)'));\n continue;\n }\n const { text: note, options } = parseReplOptions(rawNote);\n await runNote(note, options);\n continue;\n }\n\n if (trimmed.startsWith('/sync ')) {\n const rawSync = trimmed.substring(6).trim();\n const dryRun = rawSync.includes('--dry-run');\n const watch = rawSync.includes('--watch') || rawSync.includes(' -w');\n let cleaned = rawSync.replace('--dry-run', '').replace('--watch', '').replace(' -w', '').trim();\n const { text: dirPath, options } = parseReplOptions(cleaned);\n\n if (!dirPath) {\n console.log(pc.yellow('Usage: /sync <path> [options]'));\n continue;\n }\n\n const { runSync } = await import('./sync.js');\n try {\n await runSync({\n dir: dirPath,\n project: options.project,\n dryRun,\n watch,\n });\n } catch (err: any) {\n console.error(pc.red(`Sync failed: ${err.message}`));\n }\n continue;\n }\n\n if (trimmed === '/sync-ai' || trimmed.startsWith('/sync-ai ')) {\n const rawSync = trimmed.startsWith('/sync-ai ') ? trimmed.substring(9).trim() : '';\n const { options } = parseReplOptions(rawSync);\n\n const { runSyncAi } = await import('./sync-ai.js');\n try {\n await runSyncAi({ project: options.project });\n } catch (err: any) {\n console.error(pc.red(`Sync-AI failed: ${err.message}`));\n }\n continue;\n }\n\n if (trimmed.startsWith('/')) {\n console.log(pc.red(`Unknown command: ${trimmed}. Type 'help' for available commands.`));\n continue;\n }\n\n // Default note creation shortcut\n const { text: noteText, options } = parseReplOptions(trimmed);\n await runNote(noteText, options);\n }\n}\n"]}
@@ -0,0 +1,482 @@
1
+ import pc from 'picocolors';
2
+ import * as clackPrompts from '@clack/prompts';
3
+ import { client, ApiClientError } from '../client.js';
4
+ export const clack = {
5
+ select: clackPrompts.select,
6
+ isCancel: clackPrompts.isCancel,
7
+ spinner: clackPrompts.spinner,
8
+ };
9
+ import fs from 'node:fs';
10
+ import path from 'node:path';
11
+ import os from 'node:os';
12
+ function getAllFiles(dir) {
13
+ let results = [];
14
+ try {
15
+ const list = fs.readdirSync(dir);
16
+ for (const file of list) {
17
+ const filePath = path.join(dir, file);
18
+ const stat = fs.statSync(filePath);
19
+ if (stat && stat.isDirectory()) {
20
+ results = results.concat(getAllFiles(filePath));
21
+ }
22
+ else {
23
+ results.push(filePath);
24
+ }
25
+ }
26
+ }
27
+ catch {
28
+ // Ignore errors
29
+ }
30
+ return results;
31
+ }
32
+ // -------------------------------------------------------------------------
33
+ // Provider Ingestion Functions
34
+ // -------------------------------------------------------------------------
35
+ function getClaudeCodeSessions() {
36
+ const dir = path.join(os.homedir(), '.claude', 'projects');
37
+ if (!fs.existsSync(dir))
38
+ return [];
39
+ const sessions = [];
40
+ try {
41
+ const allFiles = getAllFiles(dir);
42
+ for (const filePath of allFiles) {
43
+ if (filePath.endsWith('.jsonl')) {
44
+ const session = parseClaudeFile(filePath);
45
+ if (session)
46
+ sessions.push(session);
47
+ }
48
+ }
49
+ }
50
+ catch (err) {
51
+ // Ignore
52
+ }
53
+ return sessions;
54
+ }
55
+ function parseClaudeFile(filePath) {
56
+ try {
57
+ const content = fs.readFileSync(filePath, 'utf-8');
58
+ const lines = content.trim().split('\n');
59
+ const turns = [];
60
+ for (const line of lines) {
61
+ if (!line.trim())
62
+ continue;
63
+ try {
64
+ const record = JSON.parse(line);
65
+ const role = record.role || (record.type === 'prompt' ? 'user' : record.type === 'response' ? 'assistant' : null);
66
+ const text = record.content || record.text || '';
67
+ if (role === 'user' && text) {
68
+ turns.push({ role: 'user', content: text });
69
+ }
70
+ else if (role === 'assistant' && text) {
71
+ turns.push({ role: 'assistant', content: text });
72
+ }
73
+ }
74
+ catch { }
75
+ }
76
+ if (turns.length === 0)
77
+ return null;
78
+ let title = 'Claude Session';
79
+ const firstUserTurn = turns.find(t => t.role === 'user');
80
+ if (firstUserTurn && firstUserTurn.content) {
81
+ const cleanPrompt = firstUserTurn.content.replace(/[\r\n]+/g, ' ').replace(/\s+/g, ' ').trim();
82
+ if (cleanPrompt) {
83
+ title = `Claude: ${cleanPrompt.slice(0, 60)}${cleanPrompt.length > 60 ? '...' : ''}`;
84
+ }
85
+ }
86
+ const parentDir = path.basename(path.dirname(filePath));
87
+ return {
88
+ providerId: 'claude-code',
89
+ providerName: 'Claude Code',
90
+ sessionId: path.basename(filePath, '.jsonl'),
91
+ title,
92
+ turns,
93
+ timestamp: fs.statSync(filePath).mtimeMs,
94
+ projectSlug: parentDir ? parentDir.toLowerCase().replace(/[^a-z0-9-]/g, '-') : undefined,
95
+ };
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ }
101
+ function getCodexSessions() {
102
+ const dir = path.join(os.homedir(), '.codex', 'sessions');
103
+ if (!fs.existsSync(dir))
104
+ return [];
105
+ const sessions = [];
106
+ try {
107
+ const allFiles = getAllFiles(dir);
108
+ for (const filePath of allFiles) {
109
+ if (filePath.endsWith('.json') || filePath.endsWith('.jsonl')) {
110
+ const session = parseCodexFile(filePath);
111
+ if (session)
112
+ sessions.push(session);
113
+ }
114
+ }
115
+ }
116
+ catch { }
117
+ return sessions;
118
+ }
119
+ function parseCodexFile(filePath) {
120
+ try {
121
+ const content = fs.readFileSync(filePath, 'utf-8').trim();
122
+ if (!content)
123
+ return null;
124
+ const turns = [];
125
+ if (filePath.endsWith('.jsonl')) {
126
+ const lines = content.split('\n');
127
+ for (const line of lines) {
128
+ if (!line.trim())
129
+ continue;
130
+ try {
131
+ const record = JSON.parse(line);
132
+ if (record.type === 'response_item' && record.payload) {
133
+ const payload = record.payload;
134
+ if (payload.type === 'message') {
135
+ const role = payload.role;
136
+ if (role === 'user' || role === 'assistant') {
137
+ const contentArray = payload.content || [];
138
+ let textContent = '';
139
+ for (const block of contentArray) {
140
+ if (block.text) {
141
+ const txt = block.text.trim();
142
+ if (txt.startsWith('<environment_context>') ||
143
+ txt.startsWith('# AGENTS.md instructions') ||
144
+ txt.includes('<permissions instructions>') ||
145
+ txt.includes('<skills_instructions>') ||
146
+ txt.includes('<apps_instructions>')) {
147
+ continue;
148
+ }
149
+ if (txt) {
150
+ if (textContent)
151
+ textContent += '\n\n';
152
+ textContent += txt;
153
+ }
154
+ }
155
+ }
156
+ if (textContent) {
157
+ turns.push({ role: role === 'user' ? 'user' : 'assistant', content: textContent });
158
+ }
159
+ }
160
+ }
161
+ }
162
+ else {
163
+ const role = record.role || (record.type === 'prompt' ? 'user' : record.type === 'response' ? 'assistant' : null);
164
+ const text = record.content || record.text || '';
165
+ if (role === 'user' && text) {
166
+ turns.push({ role: 'user', content: text });
167
+ }
168
+ else if (role === 'assistant' && text) {
169
+ turns.push({ role: 'assistant', content: text });
170
+ }
171
+ }
172
+ }
173
+ catch { }
174
+ }
175
+ }
176
+ else {
177
+ const data = JSON.parse(content);
178
+ const messages = data.messages || data.turns || [];
179
+ for (const msg of messages) {
180
+ const role = msg.role || (msg.type === 'prompt' ? 'user' : 'assistant');
181
+ const text = msg.content || msg.text || '';
182
+ if (role === 'user' && text) {
183
+ turns.push({ role: 'user', content: text });
184
+ }
185
+ else if (text) {
186
+ turns.push({ role: 'assistant', content: text });
187
+ }
188
+ }
189
+ }
190
+ if (turns.length === 0)
191
+ return null;
192
+ let title = 'Codex Session';
193
+ const firstUserTurn = turns.find(t => t.role === 'user');
194
+ if (firstUserTurn && firstUserTurn.content) {
195
+ const cleanPrompt = firstUserTurn.content.replace(/[\r\n]+/g, ' ').replace(/\s+/g, ' ').trim();
196
+ if (cleanPrompt) {
197
+ title = `Codex: ${cleanPrompt.slice(0, 60)}${cleanPrompt.length > 60 ? '...' : ''}`;
198
+ }
199
+ }
200
+ return {
201
+ providerId: 'codex-cli',
202
+ providerName: 'Codex CLI',
203
+ sessionId: path.basename(filePath),
204
+ title,
205
+ turns,
206
+ timestamp: fs.statSync(filePath).mtimeMs,
207
+ };
208
+ }
209
+ catch {
210
+ return null;
211
+ }
212
+ }
213
+ function getAntigravitySessions() {
214
+ const dir = path.join(os.homedir(), '.gemini', 'antigravity', 'brain');
215
+ if (!fs.existsSync(dir))
216
+ return [];
217
+ const sessions = [];
218
+ try {
219
+ const folders = fs.readdirSync(dir);
220
+ for (const folder of folders) {
221
+ const folderPath = path.join(dir, folder);
222
+ const stat = fs.statSync(folderPath);
223
+ if (stat.isDirectory()) {
224
+ const logFilePath = path.join(folderPath, '.system_generated', 'logs', 'overview.txt');
225
+ if (fs.existsSync(logFilePath)) {
226
+ const session = parseAntigravityFile(logFilePath, folder);
227
+ if (session)
228
+ sessions.push(session);
229
+ }
230
+ }
231
+ }
232
+ }
233
+ catch { }
234
+ return sessions;
235
+ }
236
+ function parseAntigravityFile(filePath, sessionId) {
237
+ try {
238
+ const content = fs.readFileSync(filePath, 'utf-8');
239
+ const lines = content.trim().split('\n');
240
+ const turns = [];
241
+ for (const line of lines) {
242
+ if (!line.trim())
243
+ continue;
244
+ try {
245
+ const record = JSON.parse(line);
246
+ if (record.source === 'USER_EXPLICIT' && record.type === 'USER_INPUT') {
247
+ const rawContent = record.content || '';
248
+ const userRequestRegex = /<USER_REQUEST>([\s\S]*?)<\/USER_REQUEST>/;
249
+ const match = rawContent.match(userRequestRegex);
250
+ const text = match ? match[1].trim() : rawContent.trim();
251
+ if (text) {
252
+ turns.push({ role: 'user', content: text });
253
+ }
254
+ }
255
+ else if (record.source === 'MODEL' && record.type === 'PLANNER_RESPONSE') {
256
+ const text = record.content || '';
257
+ const hasToolCalls = Array.isArray(record.tool_calls) && record.tool_calls.length > 0;
258
+ if (text && !hasToolCalls) {
259
+ turns.push({ role: 'assistant', content: text.trim() });
260
+ }
261
+ }
262
+ }
263
+ catch { }
264
+ }
265
+ if (turns.length === 0)
266
+ return null;
267
+ let title = 'Antigravity Session';
268
+ const firstUserTurn = turns.find(t => t.role === 'user');
269
+ if (firstUserTurn && firstUserTurn.content) {
270
+ const cleanPrompt = firstUserTurn.content.replace(/[\r\n]+/g, ' ').replace(/\s+/g, ' ').trim();
271
+ if (cleanPrompt) {
272
+ title = `Antigravity: ${cleanPrompt.slice(0, 60)}${cleanPrompt.length > 60 ? '...' : ''}`;
273
+ }
274
+ }
275
+ return {
276
+ providerId: 'antigravity',
277
+ providerName: 'Antigravity',
278
+ sessionId,
279
+ title,
280
+ turns,
281
+ timestamp: fs.statSync(filePath).mtimeMs,
282
+ };
283
+ }
284
+ catch {
285
+ return null;
286
+ }
287
+ }
288
+ async function getOpenCodeSessions() {
289
+ const dbPath = path.join(os.homedir(), '.local', 'share', 'opencode', 'opencode.db');
290
+ if (!fs.existsSync(dbPath))
291
+ return [];
292
+ try {
293
+ const sqliteModule = await import('node:sqlite');
294
+ const DatabaseSync = sqliteModule.DatabaseSync;
295
+ if (!DatabaseSync)
296
+ return [];
297
+ const db = new DatabaseSync(dbPath, { readOnly: true });
298
+ const query = `
299
+ SELECT
300
+ s.id as sessionId,
301
+ s.title,
302
+ s.time_updated as timestamp,
303
+ s.slug as projectSlug,
304
+ m.id as messageId,
305
+ m.data as messageData,
306
+ p.data as partData
307
+ FROM session s
308
+ JOIN message m ON m.session_id = s.id
309
+ LEFT JOIN part p ON p.message_id = m.id
310
+ ORDER BY s.time_updated DESC, m.time_created ASC, p.time_created ASC
311
+ `;
312
+ const rows = db.prepare(query).all();
313
+ db.close();
314
+ const sessionsMap = new Map();
315
+ for (const row of rows) {
316
+ const { sessionId, title, timestamp, projectSlug, messageId, messageData, partData } = row;
317
+ let entry = sessionsMap.get(sessionId);
318
+ if (!entry) {
319
+ entry = {
320
+ session: {
321
+ providerId: 'open-code',
322
+ providerName: 'OpenCode',
323
+ sessionId,
324
+ title: title || 'OpenCode Session',
325
+ turns: [],
326
+ timestamp: Number(timestamp),
327
+ projectSlug: projectSlug || undefined,
328
+ },
329
+ messagesMap: new Map(),
330
+ };
331
+ sessionsMap.set(sessionId, entry);
332
+ }
333
+ if (messageId && messageData) {
334
+ let msgRole = null;
335
+ try {
336
+ const mData = JSON.parse(messageData);
337
+ if (mData.role === 'user')
338
+ msgRole = 'user';
339
+ else if (mData.role === 'assistant')
340
+ msgRole = 'assistant';
341
+ }
342
+ catch { }
343
+ if (msgRole) {
344
+ let msgEntry = entry.messagesMap.get(messageId);
345
+ if (!msgEntry) {
346
+ msgEntry = { role: msgRole, textParts: [] };
347
+ entry.messagesMap.set(messageId, msgEntry);
348
+ }
349
+ if (partData) {
350
+ try {
351
+ const pData = JSON.parse(partData);
352
+ if (pData.type === 'text' && pData.text) {
353
+ msgEntry.textParts.push(pData.text);
354
+ }
355
+ }
356
+ catch { }
357
+ }
358
+ }
359
+ }
360
+ }
361
+ const sessions = [];
362
+ for (const entry of sessionsMap.values()) {
363
+ const turns = [];
364
+ for (const msgEntry of entry.messagesMap.values()) {
365
+ const content = msgEntry.textParts.join('\n\n').trim();
366
+ if (content) {
367
+ turns.push({ role: msgEntry.role, content });
368
+ }
369
+ }
370
+ if (turns.length > 0) {
371
+ entry.session.turns = turns;
372
+ sessions.push(entry.session);
373
+ }
374
+ }
375
+ return sessions;
376
+ }
377
+ catch {
378
+ return [];
379
+ }
380
+ }
381
+ function getTitleWithDate(session) {
382
+ const dateObj = new Date(session.timestamp);
383
+ const year = dateObj.getFullYear();
384
+ const month = String(dateObj.getMonth() + 1).padStart(2, '0');
385
+ const day = String(dateObj.getDate()).padStart(2, '0');
386
+ const formattedDate = `${year}-${month}-${day}`;
387
+ return `${session.title} (${formattedDate})`;
388
+ }
389
+ function getMarkdownText(session) {
390
+ const titleWithDate = getTitleWithDate(session);
391
+ let rawText = `# ${titleWithDate}\n\n`;
392
+ rawText += `Source: ${session.providerName}\n`;
393
+ if (session.projectSlug) {
394
+ rawText += `Project: ${session.projectSlug}\n`;
395
+ }
396
+ rawText += `\n---\n\n`;
397
+ for (const turn of session.turns) {
398
+ const roleHeader = turn.role === 'user' ? '👤 User' : '🤖 Assistant';
399
+ rawText += `### ${roleHeader}\n${turn.content}\n\n`;
400
+ }
401
+ return rawText;
402
+ }
403
+ // -------------------------------------------------------------------------
404
+ // Main Command Handler
405
+ // -------------------------------------------------------------------------
406
+ export async function runSyncAi(options) {
407
+ const s = clack.spinner();
408
+ s.start('Scanning local AI history logs...');
409
+ const allSessions = [];
410
+ // Gather sessions from all providers
411
+ try {
412
+ const claudeSessions = getClaudeCodeSessions();
413
+ allSessions.push(...claudeSessions);
414
+ }
415
+ catch { }
416
+ try {
417
+ const codexSessions = getCodexSessions();
418
+ allSessions.push(...codexSessions);
419
+ }
420
+ catch { }
421
+ try {
422
+ const antigravitySessions = getAntigravitySessions();
423
+ allSessions.push(...antigravitySessions);
424
+ }
425
+ catch { }
426
+ try {
427
+ const openCodeSessions = await getOpenCodeSessions();
428
+ allSessions.push(...openCodeSessions);
429
+ }
430
+ catch { }
431
+ // Sort: newest sessions first
432
+ allSessions.sort((a, b) => b.timestamp - a.timestamp);
433
+ s.stop(pc.green('Scan complete!'));
434
+ if (allSessions.length === 0) {
435
+ console.log(pc.yellow('\nNo local AI sessions found from Claude Code, Codex, Antigravity, or OpenCode.'));
436
+ return;
437
+ }
438
+ // Display select prompt to choose a session
439
+ const selectOptions = allSessions.slice(0, 25).map(session => {
440
+ const dateStr = new Date(session.timestamp).toISOString().split('T')[0];
441
+ return {
442
+ value: session,
443
+ label: `[${session.providerName}] ${session.title}`,
444
+ hint: `${dateStr} (${session.turns.length} turns)`
445
+ };
446
+ });
447
+ const selected = await clack.select({
448
+ message: 'Select an AI session to import/sync to Knowledge Vault:',
449
+ options: selectOptions,
450
+ });
451
+ if (clack.isCancel(selected)) {
452
+ console.log(pc.yellow('Cancelled.'));
453
+ return;
454
+ }
455
+ const session = selected;
456
+ const titleWithDate = getTitleWithDate(session);
457
+ const rawText = getMarkdownText(session);
458
+ s.start(`Saving "${titleWithDate}" as note to Knowledge Vault...`);
459
+ try {
460
+ const targetProject = options.project || session.projectSlug || 'inbox';
461
+ const note = await client.createNote({
462
+ title: titleWithDate,
463
+ rawText,
464
+ projectSlug: targetProject,
465
+ sourceChannel: 'ai-chat',
466
+ });
467
+ s.stop(pc.green('Import complete!'));
468
+ console.log(pc.cyan(`\nNote saved successfully to project "${targetProject}"!`));
469
+ console.log(pc.gray(`Note ID: ${note.id}`));
470
+ }
471
+ catch (error) {
472
+ s.stop(pc.red('Save failed'));
473
+ if (error instanceof ApiClientError) {
474
+ console.error(pc.red(`Error (${error.status}): ${error.body?.message || error.message}`));
475
+ }
476
+ else {
477
+ console.error(pc.red(`Error: ${error.message || 'Failed to save note'}`));
478
+ }
479
+ process.exit(1);
480
+ }
481
+ }
482
+ //# sourceMappingURL=sync-ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-ai.js","sourceRoot":"","sources":["../../src/commands/sync-ai.ts"],"names":[],"mappings":"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","sourcesContent":["import pc from 'picocolors';\nimport * as clackPrompts from '@clack/prompts';\nimport { client, ApiClientError } from '../client.js';\n\nexport const clack = {\n select: clackPrompts.select,\n isCancel: clackPrompts.isCancel,\n spinner: clackPrompts.spinner,\n};\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\ninterface CliAiTurn {\n role: 'user' | 'assistant';\n content: string;\n}\n\ninterface CliAiSession {\n providerId: string;\n providerName: string;\n sessionId: string;\n title: string;\n turns: CliAiTurn[];\n timestamp: number;\n projectSlug?: string;\n}\n\nfunction getAllFiles(dir: string): string[] {\n let results: string[] = [];\n try {\n const list = fs.readdirSync(dir);\n for (const file of list) {\n const filePath = path.join(dir, file);\n const stat = fs.statSync(filePath);\n if (stat && stat.isDirectory()) {\n results = results.concat(getAllFiles(filePath));\n } else {\n results.push(filePath);\n }\n }\n } catch {\n // Ignore errors\n }\n return results;\n}\n\n// -------------------------------------------------------------------------\n// Provider Ingestion Functions\n// -------------------------------------------------------------------------\n\nfunction getClaudeCodeSessions(): CliAiSession[] {\n const dir = path.join(os.homedir(), '.claude', 'projects');\n if (!fs.existsSync(dir)) return [];\n\n const sessions: CliAiSession[] = [];\n try {\n const allFiles = getAllFiles(dir);\n for (const filePath of allFiles) {\n if (filePath.endsWith('.jsonl')) {\n const session = parseClaudeFile(filePath);\n if (session) sessions.push(session);\n }\n }\n } catch (err) {\n // Ignore\n }\n return sessions;\n}\n\nfunction parseClaudeFile(filePath: string): CliAiSession | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const lines = content.trim().split('\\n');\n const turns: CliAiTurn[] = [];\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const record = JSON.parse(line);\n const role = record.role || (record.type === 'prompt' ? 'user' : record.type === 'response' ? 'assistant' : null);\n const text = record.content || record.text || '';\n\n if (role === 'user' && text) {\n turns.push({ role: 'user', content: text });\n } else if (role === 'assistant' && text) {\n turns.push({ role: 'assistant', content: text });\n }\n } catch {}\n }\n\n if (turns.length === 0) return null;\n\n let title = 'Claude Session';\n const firstUserTurn = turns.find(t => t.role === 'user');\n if (firstUserTurn && firstUserTurn.content) {\n const cleanPrompt = firstUserTurn.content.replace(/[\\r\\n]+/g, ' ').replace(/\\s+/g, ' ').trim();\n if (cleanPrompt) {\n title = `Claude: ${cleanPrompt.slice(0, 60)}${cleanPrompt.length > 60 ? '...' : ''}`;\n }\n }\n\n const parentDir = path.basename(path.dirname(filePath));\n\n return {\n providerId: 'claude-code',\n providerName: 'Claude Code',\n sessionId: path.basename(filePath, '.jsonl'),\n title,\n turns,\n timestamp: fs.statSync(filePath).mtimeMs,\n projectSlug: parentDir ? parentDir.toLowerCase().replace(/[^a-z0-9-]/g, '-') : undefined,\n };\n } catch {\n return null;\n }\n}\n\nfunction getCodexSessions(): CliAiSession[] {\n const dir = path.join(os.homedir(), '.codex', 'sessions');\n if (!fs.existsSync(dir)) return [];\n\n const sessions: CliAiSession[] = [];\n try {\n const allFiles = getAllFiles(dir);\n for (const filePath of allFiles) {\n if (filePath.endsWith('.json') || filePath.endsWith('.jsonl')) {\n const session = parseCodexFile(filePath);\n if (session) sessions.push(session);\n }\n }\n } catch {}\n return sessions;\n}\n\nfunction parseCodexFile(filePath: string): CliAiSession | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8').trim();\n if (!content) return null;\n const turns: CliAiTurn[] = [];\n\n if (filePath.endsWith('.jsonl')) {\n const lines = content.split('\\n');\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const record = JSON.parse(line);\n if (record.type === 'response_item' && record.payload) {\n const payload = record.payload;\n if (payload.type === 'message') {\n const role = payload.role;\n if (role === 'user' || role === 'assistant') {\n const contentArray = payload.content || [];\n let textContent = '';\n for (const block of contentArray) {\n if (block.text) {\n const txt = block.text.trim();\n if (txt.startsWith('<environment_context>') || \n txt.startsWith('# AGENTS.md instructions') || \n txt.includes('<permissions instructions>') ||\n txt.includes('<skills_instructions>') ||\n txt.includes('<apps_instructions>')) {\n continue;\n }\n if (txt) {\n if (textContent) textContent += '\\n\\n';\n textContent += txt;\n }\n }\n }\n if (textContent) {\n turns.push({ role: role === 'user' ? 'user' : 'assistant', content: textContent });\n }\n }\n }\n } else {\n const role = record.role || (record.type === 'prompt' ? 'user' : record.type === 'response' ? 'assistant' : null);\n const text = record.content || record.text || '';\n if (role === 'user' && text) {\n turns.push({ role: 'user', content: text });\n } else if (role === 'assistant' && text) {\n turns.push({ role: 'assistant', content: text });\n }\n }\n } catch {}\n }\n } else {\n const data = JSON.parse(content);\n const messages = data.messages || data.turns || [];\n for (const msg of messages) {\n const role = msg.role || (msg.type === 'prompt' ? 'user' : 'assistant');\n const text = msg.content || msg.text || '';\n if (role === 'user' && text) {\n turns.push({ role: 'user', content: text });\n } else if (text) {\n turns.push({ role: 'assistant', content: text });\n }\n }\n }\n\n if (turns.length === 0) return null;\n\n let title = 'Codex Session';\n const firstUserTurn = turns.find(t => t.role === 'user');\n if (firstUserTurn && firstUserTurn.content) {\n const cleanPrompt = firstUserTurn.content.replace(/[\\r\\n]+/g, ' ').replace(/\\s+/g, ' ').trim();\n if (cleanPrompt) {\n title = `Codex: ${cleanPrompt.slice(0, 60)}${cleanPrompt.length > 60 ? '...' : ''}`;\n }\n }\n\n return {\n providerId: 'codex-cli',\n providerName: 'Codex CLI',\n sessionId: path.basename(filePath),\n title,\n turns,\n timestamp: fs.statSync(filePath).mtimeMs,\n };\n } catch {\n return null;\n }\n}\n\nfunction getAntigravitySessions(): CliAiSession[] {\n const dir = path.join(os.homedir(), '.gemini', 'antigravity', 'brain');\n if (!fs.existsSync(dir)) return [];\n\n const sessions: CliAiSession[] = [];\n try {\n const folders = fs.readdirSync(dir);\n for (const folder of folders) {\n const folderPath = path.join(dir, folder);\n const stat = fs.statSync(folderPath);\n if (stat.isDirectory()) {\n const logFilePath = path.join(folderPath, '.system_generated', 'logs', 'overview.txt');\n if (fs.existsSync(logFilePath)) {\n const session = parseAntigravityFile(logFilePath, folder);\n if (session) sessions.push(session);\n }\n }\n }\n } catch {}\n return sessions;\n}\n\nfunction parseAntigravityFile(filePath: string, sessionId: string): CliAiSession | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const lines = content.trim().split('\\n');\n const turns: CliAiTurn[] = [];\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const record = JSON.parse(line);\n if (record.source === 'USER_EXPLICIT' && record.type === 'USER_INPUT') {\n const rawContent = record.content || '';\n const userRequestRegex = /<USER_REQUEST>([\\s\\S]*?)<\\/USER_REQUEST>/;\n const match = rawContent.match(userRequestRegex);\n const text = match ? match[1].trim() : rawContent.trim();\n if (text) {\n turns.push({ role: 'user', content: text });\n }\n } else if (record.source === 'MODEL' && record.type === 'PLANNER_RESPONSE') {\n const text = record.content || '';\n const hasToolCalls = Array.isArray(record.tool_calls) && record.tool_calls.length > 0;\n if (text && !hasToolCalls) {\n turns.push({ role: 'assistant', content: text.trim() });\n }\n }\n } catch {}\n }\n\n if (turns.length === 0) return null;\n\n let title = 'Antigravity Session';\n const firstUserTurn = turns.find(t => t.role === 'user');\n if (firstUserTurn && firstUserTurn.content) {\n const cleanPrompt = firstUserTurn.content.replace(/[\\r\\n]+/g, ' ').replace(/\\s+/g, ' ').trim();\n if (cleanPrompt) {\n title = `Antigravity: ${cleanPrompt.slice(0, 60)}${cleanPrompt.length > 60 ? '...' : ''}`;\n }\n }\n\n return {\n providerId: 'antigravity',\n providerName: 'Antigravity',\n sessionId,\n title,\n turns,\n timestamp: fs.statSync(filePath).mtimeMs,\n };\n } catch {\n return null;\n }\n}\n\nasync function getOpenCodeSessions(): Promise<CliAiSession[]> {\n const dbPath = path.join(os.homedir(), '.local', 'share', 'opencode', 'opencode.db');\n if (!fs.existsSync(dbPath)) return [];\n\n try {\n const sqliteModule = await import('node:sqlite');\n const DatabaseSync = sqliteModule.DatabaseSync;\n if (!DatabaseSync) return [];\n\n const db = new DatabaseSync(dbPath, { readOnly: true });\n const query = `\n SELECT \n s.id as sessionId,\n s.title,\n s.time_updated as timestamp,\n s.slug as projectSlug,\n m.id as messageId,\n m.data as messageData,\n p.data as partData\n FROM session s\n JOIN message m ON m.session_id = s.id\n LEFT JOIN part p ON p.message_id = m.id\n ORDER BY s.time_updated DESC, m.time_created ASC, p.time_created ASC\n `;\n\n const rows = db.prepare(query).all() as any[];\n db.close();\n\n const sessionsMap = new Map<string, {\n session: CliAiSession;\n messagesMap: Map<string, { role: 'user' | 'assistant'; textParts: string[] }>;\n }>();\n\n for (const row of rows) {\n const { sessionId, title, timestamp, projectSlug, messageId, messageData, partData } = row;\n \n let entry = sessionsMap.get(sessionId);\n if (!entry) {\n entry = {\n session: {\n providerId: 'open-code',\n providerName: 'OpenCode',\n sessionId,\n title: title || 'OpenCode Session',\n turns: [],\n timestamp: Number(timestamp),\n projectSlug: projectSlug || undefined,\n },\n messagesMap: new Map(),\n };\n sessionsMap.set(sessionId, entry);\n }\n\n if (messageId && messageData) {\n let msgRole: 'user' | 'assistant' | null = null;\n try {\n const mData = JSON.parse(messageData);\n if (mData.role === 'user') msgRole = 'user';\n else if (mData.role === 'assistant') msgRole = 'assistant';\n } catch {}\n\n if (msgRole) {\n let msgEntry = entry.messagesMap.get(messageId);\n if (!msgEntry) {\n msgEntry = { role: msgRole, textParts: [] };\n entry.messagesMap.set(messageId, msgEntry);\n }\n\n if (partData) {\n try {\n const pData = JSON.parse(partData);\n if (pData.type === 'text' && pData.text) {\n msgEntry.textParts.push(pData.text);\n }\n } catch {}\n }\n }\n }\n }\n\n const sessions: CliAiSession[] = [];\n for (const entry of sessionsMap.values()) {\n const turns: CliAiTurn[] = [];\n for (const msgEntry of entry.messagesMap.values()) {\n const content = msgEntry.textParts.join('\\n\\n').trim();\n if (content) {\n turns.push({ role: msgEntry.role, content });\n }\n }\n if (turns.length > 0) {\n entry.session.turns = turns;\n sessions.push(entry.session);\n }\n }\n\n return sessions;\n } catch {\n return [];\n }\n}\n\nfunction getTitleWithDate(session: CliAiSession): string {\n const dateObj = new Date(session.timestamp);\n const year = dateObj.getFullYear();\n const month = String(dateObj.getMonth() + 1).padStart(2, '0');\n const day = String(dateObj.getDate()).padStart(2, '0');\n const formattedDate = `${year}-${month}-${day}`;\n return `${session.title} (${formattedDate})`;\n}\n\nfunction getMarkdownText(session: CliAiSession): string {\n const titleWithDate = getTitleWithDate(session);\n let rawText = `# ${titleWithDate}\\n\\n`;\n rawText += `Source: ${session.providerName}\\n`;\n if (session.projectSlug) {\n rawText += `Project: ${session.projectSlug}\\n`;\n }\n rawText += `\\n---\\n\\n`;\n \n for (const turn of session.turns) {\n const roleHeader = turn.role === 'user' ? '👤 User' : '🤖 Assistant';\n rawText += `### ${roleHeader}\\n${turn.content}\\n\\n`;\n }\n return rawText;\n}\n\n// -------------------------------------------------------------------------\n// Main Command Handler\n// -------------------------------------------------------------------------\n\nexport async function runSyncAi(options: { project?: string }): Promise<void> {\n const s = clack.spinner();\n s.start('Scanning local AI history logs...');\n\n const allSessions: CliAiSession[] = [];\n\n // Gather sessions from all providers\n try {\n const claudeSessions = getClaudeCodeSessions();\n allSessions.push(...claudeSessions);\n } catch {}\n\n try {\n const codexSessions = getCodexSessions();\n allSessions.push(...codexSessions);\n } catch {}\n\n try {\n const antigravitySessions = getAntigravitySessions();\n allSessions.push(...antigravitySessions);\n } catch {}\n\n try {\n const openCodeSessions = await getOpenCodeSessions();\n allSessions.push(...openCodeSessions);\n } catch {}\n\n // Sort: newest sessions first\n allSessions.sort((a, b) => b.timestamp - a.timestamp);\n\n s.stop(pc.green('Scan complete!'));\n\n if (allSessions.length === 0) {\n console.log(pc.yellow('\\nNo local AI sessions found from Claude Code, Codex, Antigravity, or OpenCode.'));\n return;\n }\n\n // Display select prompt to choose a session\n const selectOptions = allSessions.slice(0, 25).map(session => {\n const dateStr = new Date(session.timestamp).toISOString().split('T')[0];\n return {\n value: session,\n label: `[${session.providerName}] ${session.title}`,\n hint: `${dateStr} (${session.turns.length} turns)`\n };\n });\n\n const selected = await clack.select({\n message: 'Select an AI session to import/sync to Knowledge Vault:',\n options: selectOptions,\n });\n\n if (clack.isCancel(selected)) {\n console.log(pc.yellow('Cancelled.'));\n return;\n }\n\n const session = selected as CliAiSession;\n const titleWithDate = getTitleWithDate(session);\n const rawText = getMarkdownText(session);\n s.start(`Saving \"${titleWithDate}\" as note to Knowledge Vault...`);\n\n try {\n const targetProject = options.project || session.projectSlug || 'inbox';\n const note = await client.createNote({\n title: titleWithDate,\n rawText,\n projectSlug: targetProject,\n sourceChannel: 'ai-chat',\n });\n\n s.stop(pc.green('Import complete!'));\n console.log(pc.cyan(`\\nNote saved successfully to project \"${targetProject}\"!`));\n console.log(pc.gray(`Note ID: ${note.id}`));\n } catch (error: any) {\n s.stop(pc.red('Save failed'));\n if (error instanceof ApiClientError) {\n console.error(pc.red(`Error (${error.status}): ${(error.body as any)?.message || error.message}`));\n } else {\n console.error(pc.red(`Error: ${error.message || 'Failed to save note'}`));\n }\n process.exit(1);\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -9,6 +9,7 @@ import { runListProjects, runListWorkspaces } from './commands/list.js';
9
9
  import { runRepl } from './commands/repl.js';
10
10
  import { runLogout } from './commands/logout.js';
11
11
  import { runSync } from './commands/sync.js';
12
+ import { runSyncAi } from './commands/sync-ai.js';
12
13
  import { loadConfig } from './config.js';
13
14
  const program = new Command();
14
15
  program
@@ -84,6 +85,14 @@ program
84
85
  .action(async (options) => {
85
86
  await runSync(options);
86
87
  });
88
+ // sync-ai command
89
+ program
90
+ .command('sync-ai')
91
+ .description('Sync/import recent local AI sessions (Claude Code, Codex, Antigravity, OpenCode)')
92
+ .option('-p, --project <slug>', 'Specify project context')
93
+ .action(async (options) => {
94
+ await runSyncAi(options);
95
+ });
87
96
  // catch-all text action for note creation
88
97
  program
89
98
  .argument('[note-text...]', 'Create a new note with the specified text')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,8BAA8B,CAAC;KAC3C,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,OAAO,EAAE,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,SAAS,EAAE,CAAC;AACpB,CAAC,CAAC,CAAC;AAEL,iBAAiB;AACjB,MAAM,SAAS,GAAG,OAAO;KACtB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC,CAAC;AAEnD,SAAS;KACN,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;IACd,YAAY,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC;AAEL,SAAS;KACN,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;IACrB,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEL,SAAS;KACN,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,GAAG,EAAE;IACX,aAAa,EAAE,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,cAAc;AACd,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAClC,MAAM,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEL,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,eAAe,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEL,qBAAqB;AACrB,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,iBAAiB,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEL,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kEAAkE,CAAC;KAC/E,cAAc,CAAC,kBAAkB,EAAE,iDAAiD,CAAC;KACrF,MAAM,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;KACtD,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;KACxD,MAAM,CAAC,aAAa,EAAE,+CAA+C,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAGL,0CAA0C;AAC1C,OAAO;KACJ,QAAQ,CAAC,gBAAgB,EAAE,2CAA2C,CAAC;KACvE,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;KACxD,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7E,gCAAgC;IAChC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAErC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAElC,kBAAkB;QAClB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,SAAS,IAAI,KAAK,CAAC;QACrB,CAAC;QAED,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAE7B,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,YAAY,GAAG,QAAQ;gBAC3B,CAAC,CAAC,GAAG,QAAQ,OAAO,SAAS,EAAE;gBAC/B,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,mCAAmC;QACnC,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,gEAAgE,CAAC,CAAC,CAAC;QACzF,MAAM,OAAO,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,0BAA0B;AAC1B,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjC,sEAAsE;IACtE,IACE,QAAQ,KAAK,MAAM;QACnB,QAAQ,KAAK,QAAQ;QACrB,QAAQ,KAAK,QAAQ;QACrB,QAAQ,KAAK,QAAQ;QACrB,QAAQ,KAAK,IAAI;QACjB,QAAQ,KAAK,MAAM;QACnB,QAAQ,KAAK,WAAW;QACxB,QAAQ,KAAK,IAAI,EACjB,CAAC;QACD,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;IAED,2EAA2E;IAC3E,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACpD,MAAM,OAAO,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport { runInit } from './commands/init.js';\nimport { runConfigGet, runConfigSet, runConfigList } from './commands/config.js';\nimport { runAsk } from './commands/ask.js';\nimport { runNote } from './commands/note.js';\nimport { runListProjects, runListWorkspaces } from './commands/list.js';\nimport { runRepl } from './commands/repl.js';\nimport { runLogout } from './commands/logout.js';\nimport { runSync } from './commands/sync.js';\nimport { loadConfig } from './config.js';\n\nconst program = new Command();\n\nprogram\n .name('kb')\n .description('Knowledge Base (kb) CLI tool')\n .version('1.0.0');\n\n// init command\nprogram\n .command('init')\n .description('Setup and authenticate the CLI with your Knowledge Base server')\n .action(async () => {\n await runInit();\n });\n\n// logout command\nprogram\n .command('logout')\n .description('Log out of your Knowledge Base account and clear local session')\n .action(async () => {\n await runLogout();\n });\n\n// config command\nconst configCmd = program\n .command('config')\n .description('View or modify CLI configuration');\n\nconfigCmd\n .command('get <key>')\n .description('Get a config value (apiUrl, workspaceSlug, defaultProjectSlug)')\n .action((key) => {\n runConfigGet(key);\n });\n\nconfigCmd\n .command('set <key> <value>')\n .description('Set a config value')\n .action((key, value) => {\n runConfigSet(key, value);\n });\n\nconfigCmd\n .command('list')\n .description('List current config values')\n .action(() => {\n runConfigList();\n });\n\n// ask command\nprogram\n .command('ask <question>')\n .description('Query your knowledge base with a question')\n .option('-p, --project <slug>', 'Specify project context')\n .action(async (question, options) => {\n await runAsk(question, options);\n });\n\n// projects command\nprogram\n .command('projects')\n .description('List all projects in the active workspace')\n .action(async () => {\n await runListProjects();\n });\n\n// workspaces command\nprogram\n .command('workspaces')\n .description('List all workspaces available')\n .action(async () => {\n await runListWorkspaces();\n });\n\n// sync command\nprogram\n .command('sync')\n .description('Sync local markdown files or directories with the knowledge base')\n .requiredOption('-d, --dir <path>', 'Path to local directory or single markdown file')\n .option('-p, --project <slug>', 'Default project slug')\n .option('--dry-run', 'Analyze changes without uploading')\n .option('-w, --watch', 'Watch directory or file for real-time changes')\n .action(async (options) => {\n await runSync(options);\n });\n\n\n// catch-all text action for note creation\nprogram\n .argument('[note-text...]', 'Create a new note with the specified text')\n .option('-f, --file <path>', 'Attach a file to the note')\n .option('-p, --project <slug>', 'Specify project context')\n .action(async (noteTextParts, options) => {\n const noteText = Array.isArray(noteTextParts) ? noteTextParts.join(' ') : '';\n \n // Check if stdin has piped data\n const isPiped = !process.stdin.isTTY;\n\n if (isPiped) {\n let pipedData = '';\n process.stdin.setEncoding('utf8');\n \n // Read piped data\n for await (const chunk of process.stdin) {\n pipedData += chunk;\n }\n\n pipedData = pipedData.trim();\n\n if (pipedData) {\n const combinedText = noteText \n ? `${noteText}\\n\\n${pipedData}`\n : pipedData;\n await runNote(combinedText, options);\n return;\n }\n }\n\n if (noteText) {\n await runNote(noteText, options);\n } else {\n // No text and not piped: open REPL\n await runRepl();\n }\n });\n\nasync function checkAuth() {\n const config = loadConfig();\n if (!config.cookies?.kb_access_token) {\n console.log(pc.yellow('No active session found. You must log in first to use the CLI.'));\n await runInit();\n const newConfig = loadConfig();\n if (!newConfig.cookies?.kb_access_token) {\n console.error(pc.red('Authentication required. Exiting.'));\n process.exit(1);\n }\n }\n}\n\n// Handle argument parsing\nasync function main() {\n const firstArg = process.argv[2];\n \n // Skip auth check for init, logout, config, help, or version requests\n if (\n firstArg !== 'init' && \n firstArg !== 'logout' && \n firstArg !== 'config' && \n firstArg !== '--help' && \n firstArg !== '-h' && \n firstArg !== 'help' && \n firstArg !== '--version' && \n firstArg !== '-V'\n ) {\n await checkAuth();\n }\n\n // If run with no arguments at all, default to REPL (unless stdin is piped)\n if (process.argv.length <= 2 && process.stdin.isTTY) {\n await runRepl();\n return;\n }\n \n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => {\n console.error(pc.red(`Fatal Error: ${err.message}`));\n process.exit(1);\n});\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport { runInit } from './commands/init.js';\nimport { runConfigGet, runConfigSet, runConfigList } from './commands/config.js';\nimport { runAsk } from './commands/ask.js';\nimport { runNote } from './commands/note.js';\nimport { runListProjects, runListWorkspaces } from './commands/list.js';\nimport { runRepl } from './commands/repl.js';\nimport { runLogout } from './commands/logout.js';\nimport { runSync } from './commands/sync.js';\nimport { runSyncAi } from './commands/sync-ai.js';\nimport { loadConfig } from './config.js';\n\nconst program = new Command();\n\nprogram\n .name('kb')\n .description('Knowledge Base (kb) CLI tool')\n .version('1.0.0');\n\n// init command\nprogram\n .command('init')\n .description('Setup and authenticate the CLI with your Knowledge Base server')\n .action(async () => {\n await runInit();\n });\n\n// logout command\nprogram\n .command('logout')\n .description('Log out of your Knowledge Base account and clear local session')\n .action(async () => {\n await runLogout();\n });\n\n// config command\nconst configCmd = program\n .command('config')\n .description('View or modify CLI configuration');\n\nconfigCmd\n .command('get <key>')\n .description('Get a config value (apiUrl, workspaceSlug, defaultProjectSlug)')\n .action((key) => {\n runConfigGet(key);\n });\n\nconfigCmd\n .command('set <key> <value>')\n .description('Set a config value')\n .action((key, value) => {\n runConfigSet(key, value);\n });\n\nconfigCmd\n .command('list')\n .description('List current config values')\n .action(() => {\n runConfigList();\n });\n\n// ask command\nprogram\n .command('ask <question>')\n .description('Query your knowledge base with a question')\n .option('-p, --project <slug>', 'Specify project context')\n .action(async (question, options) => {\n await runAsk(question, options);\n });\n\n// projects command\nprogram\n .command('projects')\n .description('List all projects in the active workspace')\n .action(async () => {\n await runListProjects();\n });\n\n// workspaces command\nprogram\n .command('workspaces')\n .description('List all workspaces available')\n .action(async () => {\n await runListWorkspaces();\n });\n\n// sync command\nprogram\n .command('sync')\n .description('Sync local markdown files or directories with the knowledge base')\n .requiredOption('-d, --dir <path>', 'Path to local directory or single markdown file')\n .option('-p, --project <slug>', 'Default project slug')\n .option('--dry-run', 'Analyze changes without uploading')\n .option('-w, --watch', 'Watch directory or file for real-time changes')\n .action(async (options) => {\n await runSync(options);\n });\n\n// sync-ai command\nprogram\n .command('sync-ai')\n .description('Sync/import recent local AI sessions (Claude Code, Codex, Antigravity, OpenCode)')\n .option('-p, --project <slug>', 'Specify project context')\n .action(async (options) => {\n await runSyncAi(options);\n });\n\n\n\n// catch-all text action for note creation\nprogram\n .argument('[note-text...]', 'Create a new note with the specified text')\n .option('-f, --file <path>', 'Attach a file to the note')\n .option('-p, --project <slug>', 'Specify project context')\n .action(async (noteTextParts, options) => {\n const noteText = Array.isArray(noteTextParts) ? noteTextParts.join(' ') : '';\n \n // Check if stdin has piped data\n const isPiped = !process.stdin.isTTY;\n\n if (isPiped) {\n let pipedData = '';\n process.stdin.setEncoding('utf8');\n \n // Read piped data\n for await (const chunk of process.stdin) {\n pipedData += chunk;\n }\n\n pipedData = pipedData.trim();\n\n if (pipedData) {\n const combinedText = noteText \n ? `${noteText}\\n\\n${pipedData}`\n : pipedData;\n await runNote(combinedText, options);\n return;\n }\n }\n\n if (noteText) {\n await runNote(noteText, options);\n } else {\n // No text and not piped: open REPL\n await runRepl();\n }\n });\n\nasync function checkAuth() {\n const config = loadConfig();\n if (!config.cookies?.kb_access_token) {\n console.log(pc.yellow('No active session found. You must log in first to use the CLI.'));\n await runInit();\n const newConfig = loadConfig();\n if (!newConfig.cookies?.kb_access_token) {\n console.error(pc.red('Authentication required. Exiting.'));\n process.exit(1);\n }\n }\n}\n\n// Handle argument parsing\nasync function main() {\n const firstArg = process.argv[2];\n \n // Skip auth check for init, logout, config, help, or version requests\n if (\n firstArg !== 'init' && \n firstArg !== 'logout' && \n firstArg !== 'config' && \n firstArg !== '--help' && \n firstArg !== '-h' && \n firstArg !== 'help' && \n firstArg !== '--version' && \n firstArg !== '-V'\n ) {\n await checkAuth();\n }\n\n // If run with no arguments at all, default to REPL (unless stdin is piped)\n if (process.argv.length <= 2 && process.stdin.isTTY) {\n await runRepl();\n return;\n }\n \n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => {\n console.error(pc.red(`Fatal Error: ${err.message}`));\n process.exit(1);\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pedroaugusto04/kb-cli",
3
- "version": "1.1.19",
3
+ "version": "1.2.1",
4
4
  "description": "CLI client for the Knowledge Base AI system",
5
5
  "type": "module",
6
6
  "bin": {