@redaksjon/protokoll 0.0.12 → 0.0.13
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.
- package/.cursor/rules/definition-of-done.md +1 -0
- package/.cursor/rules/no-emoticons.md +26 -12
- package/README.md +483 -69
- package/dist/agentic/executor.js +473 -41
- package/dist/agentic/executor.js.map +1 -1
- package/dist/agentic/index.js.map +1 -1
- package/dist/agentic/tools/lookup-person.js +123 -4
- package/dist/agentic/tools/lookup-person.js.map +1 -1
- package/dist/agentic/tools/lookup-project.js +139 -22
- package/dist/agentic/tools/lookup-project.js.map +1 -1
- package/dist/agentic/tools/route-note.js +5 -1
- package/dist/agentic/tools/route-note.js.map +1 -1
- package/dist/arguments.js +6 -3
- package/dist/arguments.js.map +1 -1
- package/dist/cli/action.js +704 -0
- package/dist/cli/action.js.map +1 -0
- package/dist/cli/config.js +482 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/context.js +466 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/feedback.js +858 -0
- package/dist/cli/feedback.js.map +1 -0
- package/dist/cli/index.js +103 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install.js +572 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/transcript.js +199 -0
- package/dist/cli/transcript.js.map +1 -0
- package/dist/constants.js +11 -4
- package/dist/constants.js.map +1 -1
- package/dist/context/index.js +25 -1
- package/dist/context/index.js.map +1 -1
- package/dist/context/storage.js +56 -3
- package/dist/context/storage.js.map +1 -1
- package/dist/interactive/handler.js +310 -9
- package/dist/interactive/handler.js.map +1 -1
- package/dist/main.js +11 -1
- package/dist/main.js.map +1 -1
- package/dist/output/index.js.map +1 -1
- package/dist/output/manager.js +46 -1
- package/dist/output/manager.js.map +1 -1
- package/dist/phases/complete.js +37 -2
- package/dist/phases/complete.js.map +1 -1
- package/dist/pipeline/orchestrator.js +104 -31
- package/dist/pipeline/orchestrator.js.map +1 -1
- package/dist/protokoll.js +68 -2
- package/dist/protokoll.js.map +1 -1
- package/dist/reasoning/client.js +83 -0
- package/dist/reasoning/client.js.map +1 -1
- package/dist/reasoning/index.js +1 -0
- package/dist/reasoning/index.js.map +1 -1
- package/dist/util/metadata.js.map +1 -1
- package/dist/util/sound.js +116 -0
- package/dist/util/sound.js.map +1 -0
- package/docs/duplicate-question-prevention.md +117 -0
- package/docs/examples.md +152 -0
- package/docs/interactive-context-example.md +92 -0
- package/docs/package-lock.json +6 -0
- package/docs/package.json +3 -1
- package/guide/action.md +375 -0
- package/guide/config.md +207 -0
- package/guide/configuration.md +82 -67
- package/guide/context-commands.md +574 -0
- package/guide/context-system.md +20 -7
- package/guide/development.md +106 -4
- package/guide/feedback.md +335 -0
- package/guide/index.md +100 -4
- package/guide/interactive.md +15 -14
- package/guide/quickstart.md +21 -7
- package/guide/reasoning.md +18 -4
- package/guide/routing.md +192 -97
- package/package.json +1 -1
- package/scripts/coverage-priority.mjs +323 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../src/cli/config.ts"],"sourcesContent":["/**\n * Configuration CLI Command\n * \n * Provides interactive and direct configuration management for Protokoll.\n * \n * Usage:\n * protokoll config Interactive configuration editor\n * protokoll config <key> View a specific setting\n * protokoll config <key> <value> Set a specific setting\n * protokoll config --list List all settings\n * protokoll config --path Show config file path\n */\n\nimport { Command } from 'commander';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport * as readline from 'readline';\nimport {\n PROTOKOLL_DEFAULTS,\n DEFAULT_CONTEXT_DIR_NAME,\n DEFAULT_CONTEXT_CONFIG_FILE_NAME,\n ALLOWED_OUTPUT_STRUCTURES,\n ALLOWED_OUTPUT_FILENAME_OPTIONS,\n} from '../constants';\n\n// Configuration schema with descriptions and allowed values\nexport const CONFIG_SCHEMA: Record<string, ConfigOption> = {\n model: {\n description: 'AI model for transcription enhancement',\n type: 'string',\n default: PROTOKOLL_DEFAULTS.model,\n examples: ['gpt-5.2', 'gpt-4o', 'gpt-4o-mini', 'claude-3-5-sonnet'],\n },\n transcriptionModel: {\n description: 'Model for audio transcription',\n type: 'string',\n default: PROTOKOLL_DEFAULTS.transcriptionModel,\n examples: ['whisper-1'],\n },\n reasoningLevel: {\n description: 'How much reasoning effort to use',\n type: 'string',\n default: PROTOKOLL_DEFAULTS.reasoningLevel,\n allowed: ['low', 'medium', 'high'],\n },\n inputDirectory: {\n description: 'Directory to read audio files from',\n type: 'path',\n default: './',\n },\n outputDirectory: {\n description: 'Directory to write transcripts to',\n type: 'path',\n default: '~/notes',\n },\n outputStructure: {\n description: 'Directory structure for output files',\n type: 'string',\n default: 'month',\n allowed: ALLOWED_OUTPUT_STRUCTURES as unknown as string[],\n },\n outputFilenameOptions: {\n description: 'Components to include in output filenames',\n type: 'array',\n default: ['date', 'time', 'subject'],\n allowed: ALLOWED_OUTPUT_FILENAME_OPTIONS as unknown as string[],\n },\n processedDirectory: {\n description: 'Directory to move processed audio files to',\n type: 'path',\n default: './processed',\n },\n timezone: {\n description: 'Timezone for date/time operations',\n type: 'string',\n default: 'Etc/UTC',\n examples: ['America/New_York', 'Europe/London', 'Asia/Tokyo'],\n },\n interactive: {\n description: 'Enable interactive prompts during transcription',\n type: 'boolean',\n default: true,\n },\n selfReflection: {\n description: 'Generate self-reflection reports after processing',\n type: 'boolean',\n default: true,\n },\n silent: {\n description: 'Disable sound notifications',\n type: 'boolean',\n default: false,\n },\n verbose: {\n description: 'Enable verbose logging output',\n type: 'boolean',\n default: false,\n },\n debug: {\n description: 'Enable debug mode with detailed logs',\n type: 'boolean',\n default: false,\n },\n dryRun: {\n description: 'Show what would happen without making changes',\n type: 'boolean',\n default: false,\n },\n maxAudioSize: {\n description: 'Maximum audio file size in bytes (default: 25MB)',\n type: 'number',\n default: 26214400,\n },\n tempDirectory: {\n description: 'Temporary directory for processing',\n type: 'path',\n default: '/tmp',\n },\n};\n\ninterface ConfigOption {\n description: string;\n type: 'string' | 'boolean' | 'number' | 'path' | 'array';\n default: unknown;\n allowed?: string[];\n examples?: string[];\n}\n\n// ANSI color codes for terminal output\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n cyan: '\\x1b[36m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n red: '\\x1b[31m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n};\n\n// eslint-disable-next-line no-console\nconst print = (msg: string) => console.log(msg);\n\n// Export internal functions for testing\nexport const _internal = {\n get findConfigPath() { return findConfigPath; },\n get loadConfig() { return loadConfig; },\n get saveConfig() { return saveConfig; },\n get parseValue() { return parseValue; },\n get formatValue() { return formatValue; },\n get listConfig() { return listConfig; },\n get getConfigValue() { return getConfigValue; },\n get setConfigValue() { return setConfigValue; },\n get showConfigPath() { return showConfigPath; },\n print,\n colors,\n};\n\n/**\n * Find the config file path\n */\nconst findConfigPath = async (): Promise<{ configPath: string; exists: boolean }> => {\n // Check current directory first, then home directory\n const cwd = process.cwd();\n const home = process.env.HOME || process.env.USERPROFILE || '';\n \n const locations = [\n path.join(cwd, DEFAULT_CONTEXT_DIR_NAME, DEFAULT_CONTEXT_CONFIG_FILE_NAME),\n path.join(home, DEFAULT_CONTEXT_DIR_NAME, DEFAULT_CONTEXT_CONFIG_FILE_NAME),\n ];\n \n for (const loc of locations) {\n try {\n await fs.access(loc);\n return { configPath: loc, exists: true };\n } catch {\n // Continue checking\n }\n }\n \n // Default to home directory if no config exists\n return {\n configPath: path.join(home, DEFAULT_CONTEXT_DIR_NAME, DEFAULT_CONTEXT_CONFIG_FILE_NAME),\n exists: false,\n };\n};\n\n/**\n * Load current configuration\n */\nconst loadConfig = async (): Promise<Record<string, unknown>> => {\n const { configPath, exists } = await findConfigPath();\n \n if (!exists) {\n return {};\n }\n \n try {\n const content = await fs.readFile(configPath, 'utf-8');\n const parsed = yaml.load(content);\n return (parsed as Record<string, unknown>) || {};\n } catch {\n return {};\n }\n};\n\n/**\n * Save configuration\n */\nconst saveConfig = async (config: Record<string, unknown>): Promise<string> => {\n const { configPath } = await findConfigPath();\n \n // Ensure directory exists\n const configDir = path.dirname(configPath);\n await fs.mkdir(configDir, { recursive: true });\n \n // Write YAML with nice formatting\n const yamlContent = yaml.dump(config, {\n indent: 2,\n lineWidth: 80,\n quotingType: '\"',\n forceQuotes: false,\n });\n \n await fs.writeFile(configPath, yamlContent, 'utf-8');\n return configPath;\n};\n\n/**\n * Parse a value according to its type\n */\nconst parseValue = (value: string, type: string): unknown => {\n switch (type) {\n case 'boolean':\n return value.toLowerCase() === 'true' || value === '1' || value === 'yes';\n case 'number':\n return parseInt(value, 10);\n case 'array':\n // Support comma-separated or space-separated values\n return value.split(/[,\\s]+/).filter(v => v.length > 0);\n default:\n return value;\n }\n};\n\n/**\n * Format a value for display\n */\nconst formatValue = (value: unknown, type: string): string => {\n if (value === undefined || value === null) {\n return `${colors.dim}(not set)${colors.reset}`;\n }\n \n switch (type) {\n case 'boolean':\n return value ? `${colors.green}true${colors.reset}` : `${colors.red}false${colors.reset}`;\n case 'array':\n return Array.isArray(value) ? value.join(', ') : String(value);\n default:\n return String(value);\n }\n};\n\n/**\n * Interactive configuration editor\n */\nconst runInteractiveConfig = async (): Promise<void> => {\n const config = await loadConfig();\n const { configPath, exists } = await findConfigPath();\n \n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n \n const question = (prompt: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n resolve(answer);\n });\n });\n };\n \n print('');\n print(`${colors.bold}${colors.cyan}╔════════════════════════════════════════════════════════════════╗${colors.reset}`);\n print(`${colors.bold}${colors.cyan}║ PROTOKOLL CONFIGURATION EDITOR ║${colors.reset}`);\n print(`${colors.bold}${colors.cyan}╚════════════════════════════════════════════════════════════════╝${colors.reset}`);\n print('');\n print(`${colors.dim}Config file: ${configPath}${exists ? '' : ' (will be created)'}${colors.reset}`);\n print('');\n print(`${colors.dim}Press Enter to keep current value, or type a new value.${colors.reset}`);\n print(`${colors.dim}Type 'q' to quit, 's' to save and exit.${colors.reset}`);\n print('');\n \n const updatedConfig = { ...config };\n const keys = Object.keys(CONFIG_SCHEMA);\n \n // Group settings by category\n const categories: Record<string, string[]> = {\n 'AI Models': ['model', 'transcriptionModel', 'reasoningLevel'],\n 'Directories': ['inputDirectory', 'outputDirectory', 'processedDirectory', 'tempDirectory'],\n 'Output Format': ['outputStructure', 'outputFilenameOptions', 'timezone'],\n 'Behavior': ['interactive', 'selfReflection', 'silent', 'verbose', 'debug', 'dryRun'],\n 'Limits': ['maxAudioSize'],\n };\n \n for (const [category, categoryKeys] of Object.entries(categories)) {\n print(`${colors.bold}${colors.blue}── ${category} ──${colors.reset}`);\n print('');\n \n for (const key of categoryKeys) {\n if (!keys.includes(key)) continue;\n \n const schema = CONFIG_SCHEMA[key];\n const currentValue = config[key];\n const defaultValue = schema.default;\n \n // Show setting info\n print(` ${colors.bold}${key}${colors.reset}`);\n print(` ${colors.dim}${schema.description}${colors.reset}`);\n \n if (schema.allowed) {\n print(` ${colors.dim}Allowed: ${schema.allowed.join(', ')}${colors.reset}`);\n }\n if (schema.examples) {\n print(` ${colors.dim}Examples: ${schema.examples.join(', ')}${colors.reset}`);\n }\n \n const displayCurrent = currentValue !== undefined \n ? formatValue(currentValue, schema.type)\n : `${colors.dim}default: ${formatValue(defaultValue, schema.type)}${colors.reset}`;\n \n print(` Current: ${displayCurrent}`);\n \n const input = await question(` ${colors.yellow}New value${colors.reset} (Enter to skip): `);\n \n if (input.toLowerCase() === 'q') {\n print('\\nConfiguration cancelled.');\n rl.close();\n return;\n }\n \n if (input.toLowerCase() === 's') {\n break;\n }\n \n if (input.trim()) {\n const parsedValue = parseValue(input.trim(), schema.type);\n \n // Validate against allowed values\n if (schema.allowed) {\n const valueToCheck = Array.isArray(parsedValue) ? parsedValue : [parsedValue];\n const invalid = valueToCheck.filter(v => !schema.allowed!.includes(String(v)));\n if (invalid.length > 0) {\n print(` ${colors.red}Invalid value(s): ${invalid.join(', ')}${colors.reset}`);\n print(` ${colors.dim}Allowed: ${schema.allowed.join(', ')}${colors.reset}`);\n continue;\n }\n }\n \n updatedConfig[key] = parsedValue;\n print(` ${colors.green}✓ Set to: ${formatValue(parsedValue, schema.type)}${colors.reset}`);\n }\n \n print('');\n }\n }\n \n rl.close();\n \n // Show summary and ask to save\n print(`${colors.bold}${colors.cyan}── Summary of Changes ──${colors.reset}`);\n print('');\n \n let hasChanges = false;\n for (const key of Object.keys(updatedConfig)) {\n if (JSON.stringify(updatedConfig[key]) !== JSON.stringify(config[key])) {\n print(` ${colors.green}${key}${colors.reset}: ${formatValue(config[key], CONFIG_SCHEMA[key]?.type || 'string')} → ${formatValue(updatedConfig[key], CONFIG_SCHEMA[key]?.type || 'string')}`);\n hasChanges = true;\n }\n }\n \n if (!hasChanges) {\n print(` ${colors.dim}No changes made.${colors.reset}`);\n return;\n }\n \n print('');\n \n const rl2 = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n \n const confirm = await new Promise<string>((resolve) => {\n rl2.question(`${colors.yellow}Save changes?${colors.reset} (Y/n): `, resolve);\n });\n rl2.close();\n \n if (confirm.toLowerCase() !== 'n') {\n const savedPath = await saveConfig(updatedConfig);\n print(`${colors.green}✓ Configuration saved to: ${savedPath}${colors.reset}`);\n } else {\n print('Changes discarded.');\n }\n};\n\n/**\n * List all configuration options\n */\nconst listConfig = async (): Promise<void> => {\n const config = await loadConfig();\n const { configPath, exists } = await findConfigPath();\n \n print('');\n print(`${colors.bold}${colors.cyan}Protokoll Configuration${colors.reset}`);\n print(`${colors.dim}Config file: ${configPath}${exists ? '' : ' (not found)'}${colors.reset}`);\n print('');\n \n // Calculate max key length for alignment\n const maxKeyLen = Math.max(...Object.keys(CONFIG_SCHEMA).map(k => k.length));\n \n for (const [key, schema] of Object.entries(CONFIG_SCHEMA)) {\n const currentValue = config[key];\n const isDefault = currentValue === undefined;\n const displayValue = isDefault\n ? `${colors.dim}${formatValue(schema.default, schema.type)} (default)${colors.reset}`\n : formatValue(currentValue, schema.type);\n \n const paddedKey = key.padEnd(maxKeyLen);\n print(` ${colors.bold}${paddedKey}${colors.reset} ${displayValue}`);\n }\n \n print('');\n print(`${colors.dim}Run 'protokoll config' for interactive editor${colors.reset}`);\n print(`${colors.dim}Run 'protokoll config <key> <value>' to set a value${colors.reset}`);\n};\n\n/**\n * Get a specific configuration value\n */\nconst getConfigValue = async (key: string): Promise<void> => {\n const config = await loadConfig();\n const schema = CONFIG_SCHEMA[key];\n \n if (!schema) {\n print(`${colors.red}Unknown configuration key: ${key}${colors.reset}`);\n print('');\n print('Available keys:');\n for (const k of Object.keys(CONFIG_SCHEMA)) {\n print(` ${k}`);\n }\n process.exit(1);\n }\n \n const currentValue = config[key];\n const isDefault = currentValue === undefined;\n \n print('');\n print(`${colors.bold}${key}${colors.reset}`);\n print(`${colors.dim}${schema.description}${colors.reset}`);\n print('');\n \n if (isDefault) {\n print(`Value: ${colors.dim}${formatValue(schema.default, schema.type)} (default)${colors.reset}`);\n } else {\n print(`Value: ${formatValue(currentValue, schema.type)}`);\n }\n \n if (schema.allowed) {\n print(`${colors.dim}Allowed: ${schema.allowed.join(', ')}${colors.reset}`);\n }\n if (schema.examples) {\n print(`${colors.dim}Examples: ${schema.examples.join(', ')}${colors.reset}`);\n }\n};\n\n/**\n * Set a configuration value\n */\nconst setConfigValue = async (key: string, value: string): Promise<void> => {\n const config = await loadConfig();\n const schema = CONFIG_SCHEMA[key];\n \n if (!schema) {\n print(`${colors.red}Unknown configuration key: ${key}${colors.reset}`);\n print('');\n print('Available keys:');\n for (const k of Object.keys(CONFIG_SCHEMA)) {\n print(` ${k}`);\n }\n process.exit(1);\n }\n \n const parsedValue = parseValue(value, schema.type);\n \n // Validate against allowed values\n if (schema.allowed) {\n const valueToCheck = Array.isArray(parsedValue) ? parsedValue : [parsedValue];\n const invalid = valueToCheck.filter(v => !schema.allowed!.includes(String(v)));\n if (invalid.length > 0) {\n print(`${colors.red}Invalid value: ${value}${colors.reset}`);\n print(`${colors.dim}Allowed: ${schema.allowed.join(', ')}${colors.reset}`);\n process.exit(1);\n }\n }\n \n config[key] = parsedValue;\n const savedPath = await saveConfig(config);\n \n print(`${colors.green}✓${colors.reset} ${key} = ${formatValue(parsedValue, schema.type)}`);\n print(`${colors.dim}Saved to: ${savedPath}${colors.reset}`);\n};\n\n/**\n * Show config file path\n */\nconst showConfigPath = async (): Promise<void> => {\n const { configPath, exists } = await findConfigPath();\n print(configPath);\n if (!exists) {\n print(`${colors.dim}(file does not exist yet)${colors.reset}`);\n }\n};\n\n/**\n * Register the config command\n */\nexport const registerConfigCommands = (program: Command): void => {\n program\n .command('config')\n .description('View and edit Protokoll configuration')\n .argument('[key]', 'Configuration key to view or set')\n .argument('[value]', 'Value to set (if provided)')\n .option('-l, --list', 'List all configuration options')\n .option('-p, --path', 'Show configuration file path')\n .action(async (key: string | undefined, value: string | undefined, options: { list?: boolean; path?: boolean }) => {\n try {\n if (options.path) {\n await showConfigPath();\n } else if (options.list) {\n await listConfig();\n } else if (key && value) {\n await setConfigValue(key, value);\n } else if (key) {\n await getConfigValue(key);\n } else {\n await runInteractiveConfig();\n }\n } catch (error) {\n print(`${colors.red}Error: ${error instanceof Error ? error.message : 'Unknown error'}${colors.reset}`);\n process.exit(1);\n }\n });\n};\n"],"names":["CONFIG_SCHEMA","model","description","type","default","PROTOKOLL_DEFAULTS","examples","transcriptionModel","reasoningLevel","allowed","inputDirectory","outputDirectory","outputStructure","ALLOWED_OUTPUT_STRUCTURES","outputFilenameOptions","ALLOWED_OUTPUT_FILENAME_OPTIONS","processedDirectory","timezone","interactive","selfReflection","silent","verbose","debug","dryRun","maxAudioSize","tempDirectory","colors","reset","bold","dim","cyan","green","yellow","red","blue","print","msg","console","log","findConfigPath","cwd","process","home","env","HOME","USERPROFILE","locations","path","join","DEFAULT_CONTEXT_DIR_NAME","DEFAULT_CONTEXT_CONFIG_FILE_NAME","loc","fs","access","configPath","exists","loadConfig","content","readFile","parsed","yaml","load","saveConfig","config","configDir","dirname","mkdir","recursive","yamlContent","dump","indent","lineWidth","quotingType","forceQuotes","writeFile","parseValue","value","toLowerCase","parseInt","split","filter","v","length","formatValue","undefined","Array","isArray","String","runInteractiveConfig","rl","readline","createInterface","input","stdin","output","stdout","question","prompt","Promise","resolve","answer","updatedConfig","keys","Object","categories","category","categoryKeys","entries","key","includes","schema","currentValue","defaultValue","displayCurrent","close","trim","parsedValue","valueToCheck","invalid","hasChanges","JSON","stringify","rl2","confirm","savedPath","listConfig","maxKeyLen","Math","max","map","k","isDefault","displayValue","paddedKey","padEnd","getConfigValue","exit","setConfigValue","showConfigPath","registerConfigCommands","program","command","argument","option","action","options","list","error","Error","message"],"mappings":"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"}
|
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as readline from 'readline';
|
|
3
|
+
import * as yaml from 'js-yaml';
|
|
4
|
+
import { create } from '../context/index.js';
|
|
5
|
+
|
|
6
|
+
// Helper to print to stdout
|
|
7
|
+
const print = (text)=>process.stdout.write(text + '\n');
|
|
8
|
+
// Helper for interactive prompts
|
|
9
|
+
const askQuestion = (rl, question)=>{
|
|
10
|
+
return new Promise((resolve)=>{
|
|
11
|
+
rl.question(question, (answer)=>{
|
|
12
|
+
resolve(answer.trim());
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
const createReadline = ()=>readline.createInterface({
|
|
17
|
+
input: process.stdin,
|
|
18
|
+
output: process.stdout
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Format an entity for display
|
|
22
|
+
*/ const formatEntity = (entity, verbose = false)=>{
|
|
23
|
+
if (verbose) {
|
|
24
|
+
return yaml.dump(entity, {
|
|
25
|
+
lineWidth: -1
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const parts = [
|
|
29
|
+
entity.id,
|
|
30
|
+
entity.name
|
|
31
|
+
];
|
|
32
|
+
if (entity.type === 'person') {
|
|
33
|
+
const person = entity;
|
|
34
|
+
if (person.company) parts.push(`(${person.company})`);
|
|
35
|
+
if (person.role) parts.push(`- ${person.role}`);
|
|
36
|
+
} else if (entity.type === 'project') {
|
|
37
|
+
var _project_routing;
|
|
38
|
+
const project = entity;
|
|
39
|
+
if ((_project_routing = project.routing) === null || _project_routing === void 0 ? void 0 : _project_routing.destination) parts.push(`-> ${project.routing.destination}`);
|
|
40
|
+
if (project.active === false) parts.push('[inactive]');
|
|
41
|
+
} else if (entity.type === 'term') {
|
|
42
|
+
const term = entity;
|
|
43
|
+
if (term.expansion) parts.push(`(${term.expansion})`);
|
|
44
|
+
} else if (entity.type === 'company') {
|
|
45
|
+
const company = entity;
|
|
46
|
+
if (company.industry) parts.push(`[${company.industry}]`);
|
|
47
|
+
} else if (entity.type === 'ignored') {
|
|
48
|
+
const ignored = entity;
|
|
49
|
+
if (ignored.ignoredAt) {
|
|
50
|
+
const date = new Date(ignored.ignoredAt).toLocaleDateString();
|
|
51
|
+
parts.push(`[ignored ${date}]`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return parts.join(' ');
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* List entities of a given type
|
|
58
|
+
*/ const listEntities = async (context, type, options)=>{
|
|
59
|
+
let entities;
|
|
60
|
+
if (type === 'person') {
|
|
61
|
+
entities = context.getAllPeople();
|
|
62
|
+
} else if (type === 'project') {
|
|
63
|
+
entities = context.getAllProjects();
|
|
64
|
+
} else if (type === 'company') {
|
|
65
|
+
entities = context.getAllCompanies();
|
|
66
|
+
} else if (type === 'ignored') {
|
|
67
|
+
entities = context.getAllIgnored();
|
|
68
|
+
} else {
|
|
69
|
+
entities = context.getAllTerms();
|
|
70
|
+
}
|
|
71
|
+
if (entities.length === 0) {
|
|
72
|
+
print(`No ${type}s found.`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
print(`\n${type.charAt(0).toUpperCase() + type.slice(1)}s (${entities.length}):\n`);
|
|
76
|
+
for (const entity of entities.sort((a, b)=>a.name.localeCompare(b.name))){
|
|
77
|
+
if (options.verbose) {
|
|
78
|
+
print('─'.repeat(60));
|
|
79
|
+
print(formatEntity(entity, true));
|
|
80
|
+
} else {
|
|
81
|
+
print(` ${formatEntity(entity)}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
print('');
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Show a specific entity
|
|
88
|
+
*/ const showEntity = async (context, type, id)=>{
|
|
89
|
+
let entity;
|
|
90
|
+
if (type === 'person') {
|
|
91
|
+
entity = context.getPerson(id);
|
|
92
|
+
} else if (type === 'project') {
|
|
93
|
+
entity = context.getProject(id);
|
|
94
|
+
} else if (type === 'company') {
|
|
95
|
+
entity = context.getCompany(id);
|
|
96
|
+
} else if (type === 'ignored') {
|
|
97
|
+
entity = context.getIgnored(id);
|
|
98
|
+
} else {
|
|
99
|
+
entity = context.getTerm(id);
|
|
100
|
+
}
|
|
101
|
+
if (!entity) {
|
|
102
|
+
print(`Error: ${type} "${id}" not found.`);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
print(`\n${type.charAt(0).toUpperCase() + type.slice(1)}: ${entity.name}\n`);
|
|
106
|
+
print(yaml.dump(entity, {
|
|
107
|
+
lineWidth: -1
|
|
108
|
+
}));
|
|
109
|
+
const filePath = context.getEntityFilePath(entity);
|
|
110
|
+
if (filePath) {
|
|
111
|
+
print(`File: ${filePath}`);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Interactive prompts for adding a person
|
|
116
|
+
*/ const addPerson = async (context)=>{
|
|
117
|
+
const rl = createReadline();
|
|
118
|
+
try {
|
|
119
|
+
print('\n[Add New Person]\n');
|
|
120
|
+
const name = await askQuestion(rl, 'Full name: ');
|
|
121
|
+
if (!name) {
|
|
122
|
+
print('Name is required. Aborting.');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const id = await askQuestion(rl, `ID (Enter for "${name.toLowerCase().replace(/\s+/g, '-')}"): `);
|
|
126
|
+
const finalId = id || name.toLowerCase().replace(/\s+/g, '-');
|
|
127
|
+
// Check if ID already exists
|
|
128
|
+
if (context.getPerson(finalId)) {
|
|
129
|
+
print(`Error: Person with ID "${finalId}" already exists.`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const firstName = await askQuestion(rl, 'First name (Enter to skip): ');
|
|
133
|
+
const lastName = await askQuestion(rl, 'Last name (Enter to skip): ');
|
|
134
|
+
const company = await askQuestion(rl, 'Company ID (Enter to skip): ');
|
|
135
|
+
const role = await askQuestion(rl, 'Role (Enter to skip): ');
|
|
136
|
+
const soundsLikeStr = await askQuestion(rl, 'Sounds like (comma-separated, Enter to skip): ');
|
|
137
|
+
const contextNote = await askQuestion(rl, 'Context notes (Enter to skip): ');
|
|
138
|
+
const person = {
|
|
139
|
+
id: finalId,
|
|
140
|
+
name,
|
|
141
|
+
type: 'person',
|
|
142
|
+
...firstName && {
|
|
143
|
+
firstName
|
|
144
|
+
},
|
|
145
|
+
...lastName && {
|
|
146
|
+
lastName
|
|
147
|
+
},
|
|
148
|
+
...company && {
|
|
149
|
+
company
|
|
150
|
+
},
|
|
151
|
+
...role && {
|
|
152
|
+
role
|
|
153
|
+
},
|
|
154
|
+
...soundsLikeStr && {
|
|
155
|
+
sounds_like: soundsLikeStr.split(',').map((s)=>s.trim())
|
|
156
|
+
},
|
|
157
|
+
...contextNote && {
|
|
158
|
+
context: contextNote
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
await context.saveEntity(person);
|
|
162
|
+
print(`\nPerson "${name}" saved successfully.`);
|
|
163
|
+
} finally{
|
|
164
|
+
rl.close();
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* Interactive prompts for adding a project
|
|
169
|
+
*/ const addProject = async (context)=>{
|
|
170
|
+
const rl = createReadline();
|
|
171
|
+
try {
|
|
172
|
+
print('\n[Add New Project]\n');
|
|
173
|
+
const name = await askQuestion(rl, 'Project name: ');
|
|
174
|
+
if (!name) {
|
|
175
|
+
print('Name is required. Aborting.');
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const suggestedId = name.toLowerCase().replace(/\s+/g, '-');
|
|
179
|
+
print(` (ID is used for the filename to store project info, e.g., "${suggestedId}.yaml")`);
|
|
180
|
+
const id = await askQuestion(rl, `ID (Enter for "${suggestedId}"): `);
|
|
181
|
+
const finalId = id || suggestedId;
|
|
182
|
+
if (context.getProject(finalId)) {
|
|
183
|
+
print(`Error: Project with ID "${finalId}" already exists.`);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
// Get default output directory from config (if available)
|
|
187
|
+
const config = context.getConfig();
|
|
188
|
+
const defaultOutputDir = config.outputDirectory || '(configured default)';
|
|
189
|
+
print(` (Leave blank to use the configured default: ${defaultOutputDir})`);
|
|
190
|
+
const destination = await askQuestion(rl, 'Output destination path (Enter for default): ');
|
|
191
|
+
// Structure examples
|
|
192
|
+
print(' Examples:');
|
|
193
|
+
print(' none: output/transcript.md');
|
|
194
|
+
print(' year: output/2025/transcript.md');
|
|
195
|
+
print(' month: output/2025/01/transcript.md');
|
|
196
|
+
print(' day: output/2025/01/15/transcript.md');
|
|
197
|
+
const structure = await askQuestion(rl, 'Directory structure (none/year/month/day, Enter for month): ');
|
|
198
|
+
const contextType = await askQuestion(rl, 'Context type (work/personal/mixed, Enter for work): ');
|
|
199
|
+
const phrasesStr = await askQuestion(rl, 'Trigger phrases (comma-separated): ');
|
|
200
|
+
const topicsStr = await askQuestion(rl, 'Topic keywords (comma-separated, Enter to skip): ');
|
|
201
|
+
const description = await askQuestion(rl, 'Description (Enter to skip): ');
|
|
202
|
+
const project = {
|
|
203
|
+
id: finalId,
|
|
204
|
+
name,
|
|
205
|
+
type: 'project',
|
|
206
|
+
classification: {
|
|
207
|
+
context_type: contextType || 'work',
|
|
208
|
+
explicit_phrases: phrasesStr ? phrasesStr.split(',').map((s)=>s.trim()) : [],
|
|
209
|
+
...topicsStr && {
|
|
210
|
+
topics: topicsStr.split(',').map((s)=>s.trim())
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
routing: {
|
|
214
|
+
// Only include destination if explicitly provided - otherwise uses global default
|
|
215
|
+
...destination && {
|
|
216
|
+
destination
|
|
217
|
+
},
|
|
218
|
+
structure: structure || 'month',
|
|
219
|
+
filename_options: [
|
|
220
|
+
'date',
|
|
221
|
+
'time',
|
|
222
|
+
'subject'
|
|
223
|
+
]
|
|
224
|
+
},
|
|
225
|
+
...description && {
|
|
226
|
+
description
|
|
227
|
+
},
|
|
228
|
+
active: true
|
|
229
|
+
};
|
|
230
|
+
await context.saveEntity(project);
|
|
231
|
+
print(`\nProject "${name}" saved successfully.`);
|
|
232
|
+
} finally{
|
|
233
|
+
rl.close();
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* Interactive prompts for adding a term
|
|
238
|
+
*/ const addTerm = async (context)=>{
|
|
239
|
+
const rl = createReadline();
|
|
240
|
+
try {
|
|
241
|
+
print('\n[Add New Term]\n');
|
|
242
|
+
const name = await askQuestion(rl, 'Term: ');
|
|
243
|
+
if (!name) {
|
|
244
|
+
print('Term is required. Aborting.');
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const id = await askQuestion(rl, `ID (Enter for "${name.toLowerCase().replace(/\s+/g, '-')}"): `);
|
|
248
|
+
const finalId = id || name.toLowerCase().replace(/\s+/g, '-');
|
|
249
|
+
if (context.getTerm(finalId)) {
|
|
250
|
+
print(`Error: Term with ID "${finalId}" already exists.`);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const expansion = await askQuestion(rl, 'Expansion (if acronym, Enter to skip): ');
|
|
254
|
+
const domain = await askQuestion(rl, 'Domain (e.g., engineering, finance, Enter to skip): ');
|
|
255
|
+
const soundsLikeStr = await askQuestion(rl, 'Sounds like (comma-separated, Enter to skip): ');
|
|
256
|
+
const projectsStr = await askQuestion(rl, 'Associated project IDs (comma-separated, Enter to skip): ');
|
|
257
|
+
const term = {
|
|
258
|
+
id: finalId,
|
|
259
|
+
name,
|
|
260
|
+
type: 'term',
|
|
261
|
+
...expansion && {
|
|
262
|
+
expansion
|
|
263
|
+
},
|
|
264
|
+
...domain && {
|
|
265
|
+
domain
|
|
266
|
+
},
|
|
267
|
+
...soundsLikeStr && {
|
|
268
|
+
sounds_like: soundsLikeStr.split(',').map((s)=>s.trim())
|
|
269
|
+
},
|
|
270
|
+
...projectsStr && {
|
|
271
|
+
projects: projectsStr.split(',').map((s)=>s.trim())
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
await context.saveEntity(term);
|
|
275
|
+
print(`\nTerm "${name}" saved successfully.`);
|
|
276
|
+
} finally{
|
|
277
|
+
rl.close();
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
/**
|
|
281
|
+
* Interactive prompts for adding a company
|
|
282
|
+
*/ const addCompany = async (context)=>{
|
|
283
|
+
const rl = createReadline();
|
|
284
|
+
try {
|
|
285
|
+
print('\n[Add New Company]\n');
|
|
286
|
+
const name = await askQuestion(rl, 'Company name: ');
|
|
287
|
+
if (!name) {
|
|
288
|
+
print('Name is required. Aborting.');
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const id = await askQuestion(rl, `ID (Enter for "${name.toLowerCase().replace(/\s+/g, '-')}"): `);
|
|
292
|
+
const finalId = id || name.toLowerCase().replace(/\s+/g, '-');
|
|
293
|
+
if (context.getCompany(finalId)) {
|
|
294
|
+
print(`Error: Company with ID "${finalId}" already exists.`);
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const fullName = await askQuestion(rl, 'Full legal name (Enter to skip): ');
|
|
298
|
+
const industry = await askQuestion(rl, 'Industry (Enter to skip): ');
|
|
299
|
+
const soundsLikeStr = await askQuestion(rl, 'Sounds like (comma-separated, Enter to skip): ');
|
|
300
|
+
const company = {
|
|
301
|
+
id: finalId,
|
|
302
|
+
name,
|
|
303
|
+
type: 'company',
|
|
304
|
+
...fullName && {
|
|
305
|
+
fullName
|
|
306
|
+
},
|
|
307
|
+
...industry && {
|
|
308
|
+
industry
|
|
309
|
+
},
|
|
310
|
+
...soundsLikeStr && {
|
|
311
|
+
sounds_like: soundsLikeStr.split(',').map((s)=>s.trim())
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
await context.saveEntity(company);
|
|
315
|
+
print(`\nCompany "${name}" saved successfully.`);
|
|
316
|
+
} finally{
|
|
317
|
+
rl.close();
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
/**
|
|
321
|
+
* Interactive prompts for adding an ignored term
|
|
322
|
+
*/ const addIgnored = async (context)=>{
|
|
323
|
+
const rl = createReadline();
|
|
324
|
+
try {
|
|
325
|
+
print('\n[Add Ignored Term]\n');
|
|
326
|
+
const name = await askQuestion(rl, 'Term to ignore: ');
|
|
327
|
+
if (!name) {
|
|
328
|
+
print('Term is required. Aborting.');
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const id = name.toLowerCase().replace(/[^a-z0-9]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
|
|
332
|
+
if (context.getIgnored(id)) {
|
|
333
|
+
print(`"${name}" is already on the ignore list.`);
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const reason = await askQuestion(rl, 'Reason for ignoring (Enter to skip): ');
|
|
337
|
+
const ignored = {
|
|
338
|
+
id,
|
|
339
|
+
name,
|
|
340
|
+
type: 'ignored',
|
|
341
|
+
ignoredAt: new Date().toISOString(),
|
|
342
|
+
...reason && {
|
|
343
|
+
reason
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
await context.saveEntity(ignored);
|
|
347
|
+
print(`\n"${name}" added to ignore list.`);
|
|
348
|
+
} finally{
|
|
349
|
+
rl.close();
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
/**
|
|
353
|
+
* Delete an entity
|
|
354
|
+
*/ const deleteEntity = async (context, type, id, options)=>{
|
|
355
|
+
let entity;
|
|
356
|
+
if (type === 'person') {
|
|
357
|
+
entity = context.getPerson(id);
|
|
358
|
+
} else if (type === 'project') {
|
|
359
|
+
entity = context.getProject(id);
|
|
360
|
+
} else if (type === 'company') {
|
|
361
|
+
entity = context.getCompany(id);
|
|
362
|
+
} else if (type === 'ignored') {
|
|
363
|
+
entity = context.getIgnored(id);
|
|
364
|
+
} else {
|
|
365
|
+
entity = context.getTerm(id);
|
|
366
|
+
}
|
|
367
|
+
if (!entity) {
|
|
368
|
+
print(`Error: ${type} "${id}" not found.`);
|
|
369
|
+
process.exit(1);
|
|
370
|
+
}
|
|
371
|
+
if (!options.force) {
|
|
372
|
+
const rl = createReadline();
|
|
373
|
+
try {
|
|
374
|
+
print(`\nAbout to delete ${type}: ${entity.name} (${entity.id})`);
|
|
375
|
+
const confirm = await askQuestion(rl, 'Are you sure? (y/N): ');
|
|
376
|
+
if (confirm.toLowerCase() !== 'y') {
|
|
377
|
+
print('Cancelled.');
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
} finally{
|
|
381
|
+
rl.close();
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
const deleted = await context.deleteEntity(entity);
|
|
385
|
+
if (deleted) {
|
|
386
|
+
print(`${type.charAt(0).toUpperCase() + type.slice(1)} "${id}" deleted.`);
|
|
387
|
+
} else {
|
|
388
|
+
print(`Error: Failed to delete ${type} "${id}".`);
|
|
389
|
+
process.exit(1);
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
/**
|
|
393
|
+
* Create a subcommand for a specific entity type
|
|
394
|
+
*/ const createEntityCommand = (type, typePlural, addHandler)=>{
|
|
395
|
+
const cmd = new Command(type).description(`Manage ${typePlural}`);
|
|
396
|
+
cmd.command('list').description(`List all ${typePlural}`).option('-v, --verbose', 'Show full details').action(async (options)=>{
|
|
397
|
+
const context = await create();
|
|
398
|
+
await listEntities(context, type, options);
|
|
399
|
+
});
|
|
400
|
+
cmd.command('show <id>').description(`Show details of a ${type}`).action(async (id)=>{
|
|
401
|
+
const context = await create();
|
|
402
|
+
await showEntity(context, type, id);
|
|
403
|
+
});
|
|
404
|
+
cmd.command('add').description(`Add a new ${type}`).action(async ()=>{
|
|
405
|
+
const context = await create();
|
|
406
|
+
if (!context.hasContext()) {
|
|
407
|
+
print('Error: No .protokoll directory found. Run "protokoll --init-config" first.');
|
|
408
|
+
process.exit(1);
|
|
409
|
+
}
|
|
410
|
+
await addHandler(context);
|
|
411
|
+
});
|
|
412
|
+
cmd.command('delete <id>').description(`Delete a ${type}`).option('-f, --force', 'Skip confirmation').action(async (id, options)=>{
|
|
413
|
+
const context = await create();
|
|
414
|
+
await deleteEntity(context, type, id, options);
|
|
415
|
+
});
|
|
416
|
+
return cmd;
|
|
417
|
+
};
|
|
418
|
+
/**
|
|
419
|
+
* Register all context management subcommands
|
|
420
|
+
*/ const registerContextCommands = (program)=>{
|
|
421
|
+
program.addCommand(createEntityCommand('project', 'projects', addProject));
|
|
422
|
+
program.addCommand(createEntityCommand('person', 'people', addPerson));
|
|
423
|
+
program.addCommand(createEntityCommand('term', 'terms', addTerm));
|
|
424
|
+
program.addCommand(createEntityCommand('company', 'companies', addCompany));
|
|
425
|
+
program.addCommand(createEntityCommand('ignored', 'ignored terms', addIgnored));
|
|
426
|
+
// Add a general 'context' command for overview
|
|
427
|
+
const contextCmd = new Command('context').description('Show context system overview');
|
|
428
|
+
contextCmd.command('status').description('Show context system status').action(async ()=>{
|
|
429
|
+
const context = await create();
|
|
430
|
+
const dirs = context.getDiscoveredDirs();
|
|
431
|
+
print('\n[Context System Status]\n');
|
|
432
|
+
if (dirs.length === 0) {
|
|
433
|
+
print('No .protokoll directories found.');
|
|
434
|
+
print('Run "protokoll --init-config" to create one.');
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
print('Discovered context directories:');
|
|
438
|
+
for (const dir of dirs){
|
|
439
|
+
print(` ${dir.level === 0 ? '→' : ' '} ${dir.path} (level ${dir.level})`);
|
|
440
|
+
}
|
|
441
|
+
print('\nLoaded entities:');
|
|
442
|
+
print(` Projects: ${context.getAllProjects().length}`);
|
|
443
|
+
print(` People: ${context.getAllPeople().length}`);
|
|
444
|
+
print(` Terms: ${context.getAllTerms().length}`);
|
|
445
|
+
print(` Companies: ${context.getAllCompanies().length}`);
|
|
446
|
+
print(` Ignored: ${context.getAllIgnored().length}`);
|
|
447
|
+
print('');
|
|
448
|
+
});
|
|
449
|
+
contextCmd.command('search <query>').description('Search across all entity types').action(async (query)=>{
|
|
450
|
+
const context = await create();
|
|
451
|
+
const results = context.search(query);
|
|
452
|
+
if (results.length === 0) {
|
|
453
|
+
print(`No results found for "${query}".`);
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
print(`\nResults for "${query}" (${results.length}):\n`);
|
|
457
|
+
for (const entity of results){
|
|
458
|
+
print(` [${entity.type}] ${formatEntity(entity)}`);
|
|
459
|
+
}
|
|
460
|
+
print('');
|
|
461
|
+
});
|
|
462
|
+
program.addCommand(contextCmd);
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
export { registerContextCommands };
|
|
466
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sources":["../../src/cli/context.ts"],"sourcesContent":["/**\n * Context Management CLI\n * \n * Provides commands for listing, viewing, adding, editing, and deleting\n * context entities (projects, people, terms, companies).\n */\n\nimport { Command } from 'commander';\nimport * as readline from 'readline';\nimport * as yaml from 'js-yaml';\nimport * as Context from '../context';\nimport { Entity, Person, Project, Company, Term, IgnoredTerm, EntityType } from '../context/types';\n\n// Helper to print to stdout\nconst print = (text: string) => process.stdout.write(text + '\\n');\n\n// Helper for interactive prompts\nconst askQuestion = (rl: readline.Interface, question: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n};\n\nconst createReadline = () => readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n});\n\n/**\n * Format an entity for display\n */\nconst formatEntity = (entity: Entity, verbose = false): string => {\n if (verbose) {\n return yaml.dump(entity, { lineWidth: -1 });\n }\n \n const parts = [entity.id, entity.name];\n \n if (entity.type === 'person') {\n const person = entity as Person;\n if (person.company) parts.push(`(${person.company})`);\n if (person.role) parts.push(`- ${person.role}`);\n } else if (entity.type === 'project') {\n const project = entity as Project;\n if (project.routing?.destination) parts.push(`-> ${project.routing.destination}`);\n if (project.active === false) parts.push('[inactive]');\n } else if (entity.type === 'term') {\n const term = entity as Term;\n if (term.expansion) parts.push(`(${term.expansion})`);\n } else if (entity.type === 'company') {\n const company = entity as Company;\n if (company.industry) parts.push(`[${company.industry}]`);\n } else if (entity.type === 'ignored') {\n const ignored = entity as IgnoredTerm;\n if (ignored.ignoredAt) {\n const date = new Date(ignored.ignoredAt).toLocaleDateString();\n parts.push(`[ignored ${date}]`);\n }\n }\n \n return parts.join(' ');\n};\n\n/**\n * List entities of a given type\n */\nconst listEntities = async (\n context: Context.ContextInstance, \n type: EntityType,\n options: { verbose?: boolean }\n) => {\n let entities: Entity[];\n if (type === 'person') {\n entities = context.getAllPeople();\n } else if (type === 'project') {\n entities = context.getAllProjects();\n } else if (type === 'company') {\n entities = context.getAllCompanies();\n } else if (type === 'ignored') {\n entities = context.getAllIgnored();\n } else {\n entities = context.getAllTerms();\n }\n \n if (entities.length === 0) {\n print(`No ${type}s found.`);\n return;\n }\n \n print(`\\n${type.charAt(0).toUpperCase() + type.slice(1)}s (${entities.length}):\\n`);\n \n for (const entity of entities.sort((a, b) => a.name.localeCompare(b.name))) {\n if (options.verbose) {\n print('─'.repeat(60));\n print(formatEntity(entity, true));\n } else {\n print(` ${formatEntity(entity)}`);\n }\n }\n print('');\n};\n\n/**\n * Show a specific entity\n */\nconst showEntity = async (\n context: Context.ContextInstance,\n type: EntityType,\n id: string\n) => {\n let entity: Entity | undefined;\n if (type === 'person') {\n entity = context.getPerson(id);\n } else if (type === 'project') {\n entity = context.getProject(id);\n } else if (type === 'company') {\n entity = context.getCompany(id);\n } else if (type === 'ignored') {\n entity = context.getIgnored(id);\n } else {\n entity = context.getTerm(id);\n }\n \n if (!entity) {\n print(`Error: ${type} \"${id}\" not found.`);\n process.exit(1);\n }\n \n print(`\\n${type.charAt(0).toUpperCase() + type.slice(1)}: ${entity.name}\\n`);\n print(yaml.dump(entity, { lineWidth: -1 }));\n \n const filePath = context.getEntityFilePath(entity);\n if (filePath) {\n print(`File: ${filePath}`);\n }\n};\n\n/**\n * Interactive prompts for adding a person\n */\nconst addPerson = async (context: Context.ContextInstance): Promise<void> => {\n const rl = createReadline();\n \n try {\n print('\\n[Add New Person]\\n');\n \n const name = await askQuestion(rl, 'Full name: ');\n if (!name) {\n print('Name is required. Aborting.');\n return;\n }\n \n const id = await askQuestion(rl, `ID (Enter for \"${name.toLowerCase().replace(/\\s+/g, '-')}\"): `);\n const finalId = id || name.toLowerCase().replace(/\\s+/g, '-');\n \n // Check if ID already exists\n if (context.getPerson(finalId)) {\n print(`Error: Person with ID \"${finalId}\" already exists.`);\n return;\n }\n \n const firstName = await askQuestion(rl, 'First name (Enter to skip): ');\n const lastName = await askQuestion(rl, 'Last name (Enter to skip): ');\n const company = await askQuestion(rl, 'Company ID (Enter to skip): ');\n const role = await askQuestion(rl, 'Role (Enter to skip): ');\n const soundsLikeStr = await askQuestion(rl, 'Sounds like (comma-separated, Enter to skip): ');\n const contextNote = await askQuestion(rl, 'Context notes (Enter to skip): ');\n \n const person: Person = {\n id: finalId,\n name,\n type: 'person',\n ...(firstName && { firstName }),\n ...(lastName && { lastName }),\n ...(company && { company }),\n ...(role && { role }),\n ...(soundsLikeStr && { sounds_like: soundsLikeStr.split(',').map(s => s.trim()) }),\n ...(contextNote && { context: contextNote }),\n };\n \n await context.saveEntity(person);\n print(`\\nPerson \"${name}\" saved successfully.`);\n \n } finally {\n rl.close();\n }\n};\n\n/**\n * Interactive prompts for adding a project\n */\nconst addProject = async (context: Context.ContextInstance): Promise<void> => {\n const rl = createReadline();\n \n try {\n print('\\n[Add New Project]\\n');\n \n const name = await askQuestion(rl, 'Project name: ');\n if (!name) {\n print('Name is required. Aborting.');\n return;\n }\n \n const suggestedId = name.toLowerCase().replace(/\\s+/g, '-');\n print(` (ID is used for the filename to store project info, e.g., \"${suggestedId}.yaml\")`);\n const id = await askQuestion(rl, `ID (Enter for \"${suggestedId}\"): `);\n const finalId = id || suggestedId;\n \n if (context.getProject(finalId)) {\n print(`Error: Project with ID \"${finalId}\" already exists.`);\n return;\n }\n \n // Get default output directory from config (if available)\n const config = context.getConfig();\n const defaultOutputDir = (config.outputDirectory as string) || '(configured default)';\n print(` (Leave blank to use the configured default: ${defaultOutputDir})`);\n const destination = await askQuestion(rl, 'Output destination path (Enter for default): ');\n \n // Structure examples\n print(' Examples:');\n print(' none: output/transcript.md');\n print(' year: output/2025/transcript.md');\n print(' month: output/2025/01/transcript.md');\n print(' day: output/2025/01/15/transcript.md');\n const structure = await askQuestion(rl, 'Directory structure (none/year/month/day, Enter for month): ');\n \n const contextType = await askQuestion(rl, 'Context type (work/personal/mixed, Enter for work): ');\n const phrasesStr = await askQuestion(rl, 'Trigger phrases (comma-separated): ');\n const topicsStr = await askQuestion(rl, 'Topic keywords (comma-separated, Enter to skip): ');\n const description = await askQuestion(rl, 'Description (Enter to skip): ');\n \n const project: Project = {\n id: finalId,\n name,\n type: 'project',\n classification: {\n context_type: (contextType || 'work') as 'work' | 'personal' | 'mixed',\n explicit_phrases: phrasesStr ? phrasesStr.split(',').map(s => s.trim()) : [],\n ...(topicsStr && { topics: topicsStr.split(',').map(s => s.trim()) }),\n },\n routing: {\n // Only include destination if explicitly provided - otherwise uses global default\n ...(destination && { destination }),\n structure: (structure || 'month') as 'none' | 'year' | 'month' | 'day',\n filename_options: ['date', 'time', 'subject'],\n },\n ...(description && { description }),\n active: true,\n };\n \n await context.saveEntity(project);\n print(`\\nProject \"${name}\" saved successfully.`);\n \n } finally {\n rl.close();\n }\n};\n\n/**\n * Interactive prompts for adding a term\n */\nconst addTerm = async (context: Context.ContextInstance): Promise<void> => {\n const rl = createReadline();\n \n try {\n print('\\n[Add New Term]\\n');\n \n const name = await askQuestion(rl, 'Term: ');\n if (!name) {\n print('Term is required. Aborting.');\n return;\n }\n \n const id = await askQuestion(rl, `ID (Enter for \"${name.toLowerCase().replace(/\\s+/g, '-')}\"): `);\n const finalId = id || name.toLowerCase().replace(/\\s+/g, '-');\n \n if (context.getTerm(finalId)) {\n print(`Error: Term with ID \"${finalId}\" already exists.`);\n return;\n }\n \n const expansion = await askQuestion(rl, 'Expansion (if acronym, Enter to skip): ');\n const domain = await askQuestion(rl, 'Domain (e.g., engineering, finance, Enter to skip): ');\n const soundsLikeStr = await askQuestion(rl, 'Sounds like (comma-separated, Enter to skip): ');\n const projectsStr = await askQuestion(rl, 'Associated project IDs (comma-separated, Enter to skip): ');\n \n const term: Term = {\n id: finalId,\n name,\n type: 'term',\n ...(expansion && { expansion }),\n ...(domain && { domain }),\n ...(soundsLikeStr && { sounds_like: soundsLikeStr.split(',').map(s => s.trim()) }),\n ...(projectsStr && { projects: projectsStr.split(',').map(s => s.trim()) }),\n };\n \n await context.saveEntity(term);\n print(`\\nTerm \"${name}\" saved successfully.`);\n \n } finally {\n rl.close();\n }\n};\n\n/**\n * Interactive prompts for adding a company\n */\nconst addCompany = async (context: Context.ContextInstance): Promise<void> => {\n const rl = createReadline();\n \n try {\n print('\\n[Add New Company]\\n');\n \n const name = await askQuestion(rl, 'Company name: ');\n if (!name) {\n print('Name is required. Aborting.');\n return;\n }\n \n const id = await askQuestion(rl, `ID (Enter for \"${name.toLowerCase().replace(/\\s+/g, '-')}\"): `);\n const finalId = id || name.toLowerCase().replace(/\\s+/g, '-');\n \n if (context.getCompany(finalId)) {\n print(`Error: Company with ID \"${finalId}\" already exists.`);\n return;\n }\n \n const fullName = await askQuestion(rl, 'Full legal name (Enter to skip): ');\n const industry = await askQuestion(rl, 'Industry (Enter to skip): ');\n const soundsLikeStr = await askQuestion(rl, 'Sounds like (comma-separated, Enter to skip): ');\n \n const company: Company = {\n id: finalId,\n name,\n type: 'company',\n ...(fullName && { fullName }),\n ...(industry && { industry }),\n ...(soundsLikeStr && { sounds_like: soundsLikeStr.split(',').map(s => s.trim()) }),\n };\n \n await context.saveEntity(company);\n print(`\\nCompany \"${name}\" saved successfully.`);\n \n } finally {\n rl.close();\n }\n};\n\n/**\n * Interactive prompts for adding an ignored term\n */\nconst addIgnored = async (context: Context.ContextInstance): Promise<void> => {\n const rl = createReadline();\n \n try {\n print('\\n[Add Ignored Term]\\n');\n \n const name = await askQuestion(rl, 'Term to ignore: ');\n if (!name) {\n print('Term is required. Aborting.');\n return;\n }\n \n const id = name.toLowerCase()\n .replace(/[^a-z0-9]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n \n if (context.getIgnored(id)) {\n print(`\"${name}\" is already on the ignore list.`);\n return;\n }\n \n const reason = await askQuestion(rl, 'Reason for ignoring (Enter to skip): ');\n \n const ignored: IgnoredTerm = {\n id,\n name,\n type: 'ignored',\n ignoredAt: new Date().toISOString(),\n ...(reason && { reason }),\n };\n \n await context.saveEntity(ignored);\n print(`\\n\"${name}\" added to ignore list.`);\n \n } finally {\n rl.close();\n }\n};\n\n/**\n * Delete an entity\n */\nconst deleteEntity = async (\n context: Context.ContextInstance,\n type: EntityType,\n id: string,\n options: { force?: boolean }\n) => {\n let entity: Entity | undefined;\n if (type === 'person') {\n entity = context.getPerson(id);\n } else if (type === 'project') {\n entity = context.getProject(id);\n } else if (type === 'company') {\n entity = context.getCompany(id);\n } else if (type === 'ignored') {\n entity = context.getIgnored(id);\n } else {\n entity = context.getTerm(id);\n }\n \n if (!entity) {\n print(`Error: ${type} \"${id}\" not found.`);\n process.exit(1);\n }\n \n if (!options.force) {\n const rl = createReadline();\n try {\n print(`\\nAbout to delete ${type}: ${entity.name} (${entity.id})`);\n const confirm = await askQuestion(rl, 'Are you sure? (y/N): ');\n if (confirm.toLowerCase() !== 'y') {\n print('Cancelled.');\n return;\n }\n } finally {\n rl.close();\n }\n }\n \n const deleted = await context.deleteEntity(entity);\n if (deleted) {\n print(`${type.charAt(0).toUpperCase() + type.slice(1)} \"${id}\" deleted.`);\n } else {\n print(`Error: Failed to delete ${type} \"${id}\".`);\n process.exit(1);\n }\n};\n\n/**\n * Create a subcommand for a specific entity type\n */\nconst createEntityCommand = (\n type: EntityType,\n typePlural: string,\n addHandler: (context: Context.ContextInstance) => Promise<void>\n): Command => {\n const cmd = new Command(type)\n .description(`Manage ${typePlural}`);\n \n cmd\n .command('list')\n .description(`List all ${typePlural}`)\n .option('-v, --verbose', 'Show full details')\n .action(async (options) => {\n const context = await Context.create();\n await listEntities(context, type, options);\n });\n \n cmd\n .command('show <id>')\n .description(`Show details of a ${type}`)\n .action(async (id) => {\n const context = await Context.create();\n await showEntity(context, type, id);\n });\n \n cmd\n .command('add')\n .description(`Add a new ${type}`)\n .action(async () => {\n const context = await Context.create();\n if (!context.hasContext()) {\n print('Error: No .protokoll directory found. Run \"protokoll --init-config\" first.');\n process.exit(1);\n }\n await addHandler(context);\n });\n \n cmd\n .command('delete <id>')\n .description(`Delete a ${type}`)\n .option('-f, --force', 'Skip confirmation')\n .action(async (id, options) => {\n const context = await Context.create();\n await deleteEntity(context, type, id, options);\n });\n \n return cmd;\n};\n\n/**\n * Register all context management subcommands\n */\nexport const registerContextCommands = (program: Command): void => {\n program.addCommand(createEntityCommand('project', 'projects', addProject));\n program.addCommand(createEntityCommand('person', 'people', addPerson));\n program.addCommand(createEntityCommand('term', 'terms', addTerm));\n program.addCommand(createEntityCommand('company', 'companies', addCompany));\n program.addCommand(createEntityCommand('ignored', 'ignored terms', addIgnored));\n \n // Add a general 'context' command for overview\n const contextCmd = new Command('context')\n .description('Show context system overview');\n \n contextCmd\n .command('status')\n .description('Show context system status')\n .action(async () => {\n const context = await Context.create();\n const dirs = context.getDiscoveredDirs();\n \n print('\\n[Context System Status]\\n');\n \n if (dirs.length === 0) {\n print('No .protokoll directories found.');\n print('Run \"protokoll --init-config\" to create one.');\n return;\n }\n \n print('Discovered context directories:');\n for (const dir of dirs) {\n print(` ${dir.level === 0 ? '→' : ' '} ${dir.path} (level ${dir.level})`);\n }\n \n print('\\nLoaded entities:');\n print(` Projects: ${context.getAllProjects().length}`);\n print(` People: ${context.getAllPeople().length}`);\n print(` Terms: ${context.getAllTerms().length}`);\n print(` Companies: ${context.getAllCompanies().length}`);\n print(` Ignored: ${context.getAllIgnored().length}`);\n print('');\n });\n \n contextCmd\n .command('search <query>')\n .description('Search across all entity types')\n .action(async (query) => {\n const context = await Context.create();\n const results = context.search(query);\n \n if (results.length === 0) {\n print(`No results found for \"${query}\".`);\n return;\n }\n \n print(`\\nResults for \"${query}\" (${results.length}):\\n`);\n for (const entity of results) {\n print(` [${entity.type}] ${formatEntity(entity)}`);\n }\n print('');\n });\n \n program.addCommand(contextCmd);\n};\n"],"names":["print","text","process","stdout","write","askQuestion","rl","question","Promise","resolve","answer","trim","createReadline","readline","createInterface","input","stdin","output","formatEntity","entity","verbose","yaml","dump","lineWidth","parts","id","name","type","person","company","push","role","project","routing","destination","active","term","expansion","industry","ignored","ignoredAt","date","Date","toLocaleDateString","join","listEntities","context","options","entities","getAllPeople","getAllProjects","getAllCompanies","getAllIgnored","getAllTerms","length","charAt","toUpperCase","slice","sort","a","b","localeCompare","repeat","showEntity","getPerson","getProject","getCompany","getIgnored","getTerm","exit","filePath","getEntityFilePath","addPerson","toLowerCase","replace","finalId","firstName","lastName","soundsLikeStr","contextNote","sounds_like","split","map","s","saveEntity","close","addProject","suggestedId","config","getConfig","defaultOutputDir","outputDirectory","structure","contextType","phrasesStr","topicsStr","description","classification","context_type","explicit_phrases","topics","filename_options","addTerm","domain","projectsStr","projects","addCompany","fullName","addIgnored","reason","toISOString","deleteEntity","force","confirm","deleted","createEntityCommand","typePlural","addHandler","cmd","Command","command","option","action","Context","hasContext","registerContextCommands","program","addCommand","contextCmd","dirs","getDiscoveredDirs","dir","level","path","query","results","search"],"mappings":"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"}
|