@eldrforge/kodrdriv 0.0.15 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +1 -9
  2. package/dist/arguments.js +38 -63
  3. package/dist/arguments.js.map +1 -1
  4. package/dist/audio/devices.js +284 -0
  5. package/dist/audio/devices.js.map +1 -0
  6. package/dist/audio/index.js +31 -0
  7. package/dist/audio/index.js.map +1 -0
  8. package/dist/audio/processor.js +766 -0
  9. package/dist/audio/processor.js.map +1 -0
  10. package/dist/audio/types.js +16 -0
  11. package/dist/audio/types.js.map +1 -0
  12. package/dist/audio/validation.js +35 -0
  13. package/dist/audio/validation.js.map +1 -0
  14. package/dist/commands/audio-commit.js +59 -634
  15. package/dist/commands/audio-commit.js.map +1 -1
  16. package/dist/commands/audio-review.js +68 -632
  17. package/dist/commands/audio-review.js.map +1 -1
  18. package/dist/commands/select-audio.js +265 -0
  19. package/dist/commands/select-audio.js.map +1 -0
  20. package/dist/constants.js +15 -6
  21. package/dist/constants.js.map +1 -1
  22. package/dist/content/issues.js +16 -0
  23. package/dist/content/issues.js.map +1 -1
  24. package/dist/main.js +6 -2
  25. package/dist/main.js.map +1 -1
  26. package/dist/types.js +5 -3
  27. package/dist/types.js.map +1 -1
  28. package/dist/util/openai.js +34 -3
  29. package/dist/util/openai.js.map +1 -1
  30. package/package.json +2 -2
  31. package/.kodrdriv/config.yaml +0 -20
  32. package/.kodrdriv/context/content.md +0 -7
  33. package/RELEASE_NOTES.md +0 -14
  34. package/docs/index.html +0 -17
  35. package/docs/package.json +0 -36
  36. package/docs/pnpm-lock.yaml +0 -3441
  37. package/docs/public/README.md +0 -132
  38. package/docs/public/advanced-usage.md +0 -188
  39. package/docs/public/code-icon.svg +0 -4
  40. package/docs/public/commands.md +0 -136
  41. package/docs/public/configuration.md +0 -274
  42. package/docs/public/examples.md +0 -352
  43. package/docs/public/kodrdriv-logo.svg +0 -62
  44. package/docs/src/App.css +0 -387
  45. package/docs/src/App.tsx +0 -60
  46. package/docs/src/components/DocumentPage.tsx +0 -56
  47. package/docs/src/components/ErrorMessage.tsx +0 -15
  48. package/docs/src/components/LoadingSpinner.tsx +0 -14
  49. package/docs/src/components/MarkdownRenderer.tsx +0 -56
  50. package/docs/src/components/Navigation.css +0 -73
  51. package/docs/src/components/Navigation.tsx +0 -36
  52. package/docs/src/index.css +0 -61
  53. package/docs/src/main.tsx +0 -10
  54. package/docs/src/test/setup.ts +0 -1
  55. package/docs/src/vite-env.d.ts +0 -10
  56. package/docs/tsconfig.node.json +0 -13
  57. package/docs/vite.config.ts +0 -15
  58. package/docs/vitest.config.ts +0 -15
  59. package/eslint.config.mjs +0 -83
  60. package/nodemon.json +0 -14
  61. package/output/kodrdriv/250702-0552-release-notes.md +0 -3
  62. package/pnpm-workspace.yaml +0 -5
  63. package/tsconfig.tsbuildinfo +0 -1
  64. package/vite.config.ts +0 -90
  65. package/vitest.config.ts +0 -24
@@ -0,0 +1,265 @@
1
+ #!/usr/bin/env node
2
+ import path from 'path';
3
+ import yaml from 'js-yaml';
4
+ import { getLogger } from '../logging.js';
5
+ import { run } from '../util/child.js';
6
+ import { create } from '../util/storage.js';
7
+ import { getAudioDeviceInfo } from '../audio/devices.js';
8
+
9
+ const parseAudioDevices = async ()=>{
10
+ try {
11
+ try {
12
+ await run('ffmpeg -f avfoundation -list_devices true -i ""');
13
+ } catch (result) {
14
+ const output = result.stderr || result.stdout || '';
15
+ const audioDevicesSection = output.split('AVFoundation audio devices:')[1];
16
+ if (audioDevicesSection) {
17
+ const deviceLines = audioDevicesSection.split('\n').filter((line)=>line.includes('[') && line.includes(']')).map((line)=>line.trim());
18
+ return deviceLines.map((line)=>{
19
+ const match = line.match(/\[(\d+)\]\s+(.+)/);
20
+ if (match) {
21
+ return {
22
+ index: match[1],
23
+ name: match[2]
24
+ };
25
+ }
26
+ return null;
27
+ }).filter(Boolean);
28
+ }
29
+ }
30
+ return [];
31
+ } catch {
32
+ return [];
33
+ }
34
+ };
35
+ const selectAudioDeviceInteractively = async ()=>{
36
+ const logger = getLogger();
37
+ logger.info('🎙️ Available audio devices:');
38
+ const devices = await parseAudioDevices();
39
+ if (devices.length === 0) {
40
+ logger.error('❌ No audio devices found. Make sure ffmpeg is installed and audio devices are available.');
41
+ return null;
42
+ }
43
+ // Test devices and show status
44
+ logger.info('🔍 Testing audio devices...');
45
+ const deviceStatuses = await Promise.all(devices.map(async (device)=>{
46
+ const { testAudioDevice } = await import('../audio/devices.js');
47
+ const isWorking = await testAudioDevice(device.index);
48
+ return {
49
+ ...device,
50
+ isWorking
51
+ };
52
+ }));
53
+ // Display devices with status
54
+ deviceStatuses.forEach((device, i)=>{
55
+ const status = device.isWorking ? '✅' : '❌';
56
+ logger.info(` ${i + 1}. ${status} ${device.name}`);
57
+ });
58
+ const workingDevices = deviceStatuses.filter((d)=>d.isWorking);
59
+ if (workingDevices.length === 0) {
60
+ logger.error('❌ No working audio devices found. This may be due to:');
61
+ logger.error(' • Microphone permission not granted to Terminal/iTerm');
62
+ logger.error(' • Audio devices in use by other applications');
63
+ logger.error(' • ffmpeg configuration issues');
64
+ logger.error('');
65
+ logger.error('💡 Try:');
66
+ logger.error(' • Go to System Preferences → Security & Privacy → Privacy → Microphone');
67
+ logger.error(' • Make sure Terminal (or your terminal app) has microphone access');
68
+ logger.error(' • Close other audio applications and try again');
69
+ return null;
70
+ }
71
+ logger.info('');
72
+ logger.info('📋 Select an audio device by entering its number (1-' + devices.length + '):');
73
+ return new Promise((resolve)=>{
74
+ // Set up keyboard input
75
+ process.stdin.setRawMode(true);
76
+ process.stdin.resume();
77
+ process.stdin.setEncoding('utf8');
78
+ let inputBuffer = '';
79
+ const keyHandler = (key)=>{
80
+ const keyCode = key.charCodeAt(0);
81
+ if (keyCode === 13) {
82
+ const selectedIndex = parseInt(inputBuffer) - 1;
83
+ if (selectedIndex >= 0 && selectedIndex < devices.length) {
84
+ const selectedDevice = deviceStatuses[selectedIndex];
85
+ process.stdout.write('\n\n');
86
+ if (!selectedDevice.isWorking) {
87
+ logger.warn(`⚠️ Warning: Selected device "${selectedDevice.name}" failed testing`);
88
+ logger.warn(' This device may not work properly for recording');
89
+ logger.warn(' Consider selecting a device marked with ✅');
90
+ } else {
91
+ logger.info(`✅ Selected: ${selectedDevice.name}`);
92
+ }
93
+ // Cleanup and resolve
94
+ process.stdin.setRawMode(false);
95
+ process.stdin.pause();
96
+ process.stdin.removeListener('data', keyHandler);
97
+ resolve(selectedDevice);
98
+ } else {
99
+ logger.error('❌ Invalid selection. Please enter a number between 1 and ' + devices.length);
100
+ inputBuffer = '';
101
+ process.stdout.write('📋 Select an audio device: ');
102
+ }
103
+ } else if (keyCode === 3) {
104
+ logger.info('\n❌ Selection cancelled');
105
+ process.stdin.setRawMode(false);
106
+ process.stdin.pause();
107
+ process.stdin.removeListener('data', keyHandler);
108
+ resolve(null);
109
+ } else if (keyCode >= 48 && keyCode <= 57) {
110
+ inputBuffer += key;
111
+ process.stdout.write(key);
112
+ } else if (keyCode === 127) {
113
+ if (inputBuffer.length > 0) {
114
+ inputBuffer = inputBuffer.slice(0, -1);
115
+ process.stdout.write('\b \b');
116
+ }
117
+ }
118
+ };
119
+ process.stdin.on('data', keyHandler);
120
+ process.stdout.write('📋 Select an audio device: ');
121
+ });
122
+ };
123
+ const getAudioDeviceConfigPath = (preferencesDirectory)=>{
124
+ return path.join(preferencesDirectory, 'audio-device.yaml');
125
+ };
126
+ const ensurePreferencesDirectory = async (preferencesDirectory)=>{
127
+ const logger = getLogger();
128
+ const storage = create({
129
+ log: logger.info
130
+ });
131
+ try {
132
+ await storage.ensureDirectory(preferencesDirectory);
133
+ logger.debug('Ensured preferences directory exists: %s', preferencesDirectory);
134
+ } catch (error) {
135
+ logger.error('Failed to create preferences directory: %s', error.message);
136
+ throw error;
137
+ }
138
+ };
139
+ const saveAudioDeviceToHomeConfig = async (deviceIndex, deviceName, capabilities, preferencesDirectory)=>{
140
+ const logger = getLogger();
141
+ const storage = create({
142
+ log: logger.info
143
+ });
144
+ try {
145
+ await ensurePreferencesDirectory(preferencesDirectory);
146
+ const configPath = getAudioDeviceConfigPath(preferencesDirectory);
147
+ const audioConfig = {
148
+ audioDevice: deviceIndex,
149
+ audioDeviceName: deviceName,
150
+ sampleRate: capabilities.sampleRate,
151
+ channels: capabilities.channels,
152
+ channelLayout: capabilities.channelLayout,
153
+ lastUpdated: new Date().toISOString()
154
+ };
155
+ // Save as YAML
156
+ const yamlContent = yaml.dump(audioConfig, {
157
+ indent: 2,
158
+ lineWidth: 120,
159
+ noRefs: true
160
+ });
161
+ await storage.writeFile(configPath, yamlContent, 'utf-8');
162
+ logger.debug('Saved audio configuration to: %s', configPath);
163
+ } catch (error) {
164
+ logger.error('Failed to save audio configuration: %s', error.message);
165
+ throw error;
166
+ }
167
+ };
168
+ const loadAudioDeviceFromHomeConfig = async (preferencesDirectory)=>{
169
+ const logger = getLogger();
170
+ const storage = create({
171
+ log: logger.info
172
+ });
173
+ try {
174
+ const configPath = getAudioDeviceConfigPath(preferencesDirectory);
175
+ const configContent = await storage.readFile(configPath, 'utf-8');
176
+ const audioConfig = yaml.load(configContent);
177
+ if (audioConfig === null || audioConfig === void 0 ? void 0 : audioConfig.audioDevice) {
178
+ logger.debug('Loaded audio device from preferences config: [%s] %s', audioConfig.audioDevice, audioConfig.audioDeviceName || 'Unknown');
179
+ return {
180
+ audioDevice: audioConfig.audioDevice,
181
+ audioDeviceName: audioConfig.audioDeviceName || 'Unknown',
182
+ sampleRate: audioConfig.sampleRate,
183
+ channels: audioConfig.channels,
184
+ channelLayout: audioConfig.channelLayout
185
+ };
186
+ }
187
+ return null;
188
+ } catch {
189
+ // Config file doesn't exist or is invalid
190
+ logger.debug('No saved audio device configuration found in preferences directory');
191
+ return null;
192
+ }
193
+ };
194
+ const audioDeviceConfigExists = async (preferencesDirectory)=>{
195
+ const storage = create({
196
+ log: ()=>{}
197
+ });
198
+ const configPath = getAudioDeviceConfigPath(preferencesDirectory);
199
+ try {
200
+ await storage.readFile(configPath, 'utf-8');
201
+ return true;
202
+ } catch {
203
+ return false;
204
+ }
205
+ };
206
+ const listAudioDevices = async ()=>{
207
+ const logger = getLogger();
208
+ try {
209
+ try {
210
+ await run('ffmpeg -f avfoundation -list_devices true -i ""');
211
+ } catch (result) {
212
+ const output = result.stderr || result.stdout || '';
213
+ const audioDevicesSection = output.split('AVFoundation audio devices:')[1];
214
+ if (audioDevicesSection) {
215
+ logger.info('🎙️ Available audio devices:');
216
+ const deviceLines = audioDevicesSection.split('\n').filter((line)=>line.includes('[') && line.includes(']')).map((line)=>line.trim());
217
+ deviceLines.forEach((line, i)=>{
218
+ const match = line.match(/\[(\d+)\]\s+(.+)/);
219
+ if (match) {
220
+ logger.info(` ${i + 1}. ${match[2]}`);
221
+ }
222
+ });
223
+ }
224
+ }
225
+ } catch {
226
+ logger.debug('Could not list audio devices');
227
+ }
228
+ };
229
+ const execute = async (runConfig)=>{
230
+ const logger = getLogger();
231
+ const isDryRun = runConfig.dryRun || false;
232
+ if (isDryRun) {
233
+ logger.info('DRY RUN: Would start audio device selection process');
234
+ logger.info('DRY RUN: Would save selected device to %s/audio-device.yaml', runConfig.preferencesDirectory);
235
+ return 'Audio device selection completed (dry run)';
236
+ }
237
+ logger.info('🎛️ Starting audio device selection...');
238
+ logger.info('');
239
+ logger.info('This device will be used to capture audio for:');
240
+ logger.info(' • Audio commit messages (audio-commit command)');
241
+ logger.info(' • Audio code reviews (audio-review command)');
242
+ logger.info('');
243
+ // List available devices in debug mode
244
+ if (runConfig.debug) {
245
+ await listAudioDevices();
246
+ }
247
+ const selectedDevice = await selectAudioDeviceInteractively();
248
+ if (selectedDevice === null) {
249
+ logger.error('❌ Audio device selection cancelled or failed');
250
+ process.exit(1);
251
+ }
252
+ // Probe device capabilities (sample rate / channels)
253
+ const capabilities = await getAudioDeviceInfo(selectedDevice.index);
254
+ // Save to preferences directory configuration
255
+ await saveAudioDeviceToHomeConfig(selectedDevice.index, selectedDevice.name, capabilities, runConfig.preferencesDirectory);
256
+ logger.info('💾 Audio device saved to %s/audio-device.yaml', runConfig.preferencesDirectory);
257
+ logger.info('✅ Audio device selection complete');
258
+ logger.info('');
259
+ logger.info('You can now run audio-commit or audio-review commands to use your selected device');
260
+ logger.info('To change your audio device in the future, run the select-audio command again');
261
+ return `Audio device configured successfully: ${selectedDevice.name}`;
262
+ };
263
+
264
+ export { audioDeviceConfigExists, execute, loadAudioDeviceFromHomeConfig, saveAudioDeviceToHomeConfig };
265
+ //# sourceMappingURL=select-audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-audio.js","sources":["../../src/commands/select-audio.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from 'path';\nimport yaml from 'js-yaml';\nimport { getLogger } from '../logging';\nimport { Config } from '../types';\nimport { run } from '../util/child';\nimport { create as createStorage } from '../util/storage';\nimport { getAudioDeviceInfo } from '../audio/devices';\n\nconst parseAudioDevices = async (): Promise<Array<{ index: string; name: string }>> => {\n try {\n try {\n await run('ffmpeg -f avfoundation -list_devices true -i \"\"');\n } catch (result: any) {\n const output = result.stderr || result.stdout || '';\n const audioDevicesSection = output.split('AVFoundation audio devices:')[1];\n\n if (audioDevicesSection) {\n const deviceLines = audioDevicesSection.split('\\n')\n .filter((line: string) => line.includes('[') && line.includes(']'))\n .map((line: string) => line.trim());\n\n return deviceLines.map((line: string) => {\n const match = line.match(/\\[(\\d+)\\]\\s+(.+)/);\n if (match) {\n return { index: match[1], name: match[2] };\n }\n return null;\n }).filter(Boolean) as Array<{ index: string; name: string }>;\n }\n }\n return [];\n } catch {\n return [];\n }\n};\n\nconst selectAudioDeviceInteractively = async (): Promise<{ index: string; name: string } | null> => {\n const logger = getLogger();\n\n logger.info('🎙️ Available audio devices:');\n const devices = await parseAudioDevices();\n\n if (devices.length === 0) {\n logger.error('❌ No audio devices found. Make sure ffmpeg is installed and audio devices are available.');\n return null;\n }\n\n // Test devices and show status\n logger.info('🔍 Testing audio devices...');\n const deviceStatuses = await Promise.all(\n devices.map(async (device) => {\n const { testAudioDevice } = await import('../audio/devices');\n const isWorking = await testAudioDevice(device.index);\n return { ...device, isWorking };\n })\n );\n\n // Display devices with status\n deviceStatuses.forEach((device, i) => {\n const status = device.isWorking ? '✅' : '❌';\n logger.info(` ${i + 1}. ${status} ${device.name}`);\n });\n\n const workingDevices = deviceStatuses.filter(d => d.isWorking);\n if (workingDevices.length === 0) {\n logger.error('❌ No working audio devices found. This may be due to:');\n logger.error(' • Microphone permission not granted to Terminal/iTerm');\n logger.error(' • Audio devices in use by other applications');\n logger.error(' • ffmpeg configuration issues');\n logger.error('');\n logger.error('💡 Try:');\n logger.error(' • Go to System Preferences → Security & Privacy → Privacy → Microphone');\n logger.error(' • Make sure Terminal (or your terminal app) has microphone access');\n logger.error(' • Close other audio applications and try again');\n return null;\n }\n\n logger.info('');\n logger.info('📋 Select an audio device by entering its number (1-' + devices.length + '):');\n\n return new Promise((resolve) => {\n // Set up keyboard input\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding('utf8');\n\n let inputBuffer = '';\n\n const keyHandler = (key: string) => {\n const keyCode = key.charCodeAt(0);\n\n if (keyCode === 13) { // ENTER key\n const selectedIndex = parseInt(inputBuffer) - 1;\n\n if (selectedIndex >= 0 && selectedIndex < devices.length) {\n const selectedDevice = deviceStatuses[selectedIndex];\n process.stdout.write('\\n\\n');\n\n if (!selectedDevice.isWorking) {\n logger.warn(`⚠️ Warning: Selected device \"${selectedDevice.name}\" failed testing`);\n logger.warn(' This device may not work properly for recording');\n logger.warn(' Consider selecting a device marked with ✅');\n } else {\n logger.info(`✅ Selected: ${selectedDevice.name}`);\n }\n\n // Cleanup and resolve\n process.stdin.setRawMode(false);\n process.stdin.pause();\n process.stdin.removeListener('data', keyHandler);\n resolve(selectedDevice);\n } else {\n logger.error('❌ Invalid selection. Please enter a number between 1 and ' + devices.length);\n inputBuffer = '';\n process.stdout.write('📋 Select an audio device: ');\n }\n } else if (keyCode === 3) { // Ctrl+C\n logger.info('\\n❌ Selection cancelled');\n process.stdin.setRawMode(false);\n process.stdin.pause();\n process.stdin.removeListener('data', keyHandler);\n resolve(null);\n } else if (keyCode >= 48 && keyCode <= 57) { // Numbers 0-9\n inputBuffer += key;\n process.stdout.write(key);\n } else if (keyCode === 127) { // Backspace\n if (inputBuffer.length > 0) {\n inputBuffer = inputBuffer.slice(0, -1);\n process.stdout.write('\\b \\b');\n }\n }\n };\n\n process.stdin.on('data', keyHandler);\n process.stdout.write('📋 Select an audio device: ');\n });\n};\n\nconst getAudioDeviceConfigPath = (preferencesDirectory: string): string => {\n return path.join(preferencesDirectory, 'audio-device.yaml');\n};\n\nconst ensurePreferencesDirectory = async (preferencesDirectory: string): Promise<void> => {\n const logger = getLogger();\n const storage = createStorage({ log: logger.info });\n\n try {\n await storage.ensureDirectory(preferencesDirectory);\n logger.debug('Ensured preferences directory exists: %s', preferencesDirectory);\n } catch (error: any) {\n logger.error('Failed to create preferences directory: %s', error.message);\n throw error;\n }\n};\n\nexport const saveAudioDeviceToHomeConfig = async (\n deviceIndex: string,\n deviceName: string,\n capabilities: { sampleRate?: number; channels?: number; channelLayout?: string },\n preferencesDirectory: string\n): Promise<void> => {\n const logger = getLogger();\n const storage = createStorage({ log: logger.info });\n\n try {\n await ensurePreferencesDirectory(preferencesDirectory);\n const configPath = getAudioDeviceConfigPath(preferencesDirectory);\n\n const audioConfig = {\n audioDevice: deviceIndex,\n audioDeviceName: deviceName,\n sampleRate: capabilities.sampleRate,\n channels: capabilities.channels,\n channelLayout: capabilities.channelLayout,\n lastUpdated: new Date().toISOString()\n };\n\n // Save as YAML\n const yamlContent = yaml.dump(audioConfig, {\n indent: 2,\n lineWidth: 120,\n noRefs: true\n });\n\n await storage.writeFile(configPath, yamlContent, 'utf-8');\n logger.debug('Saved audio configuration to: %s', configPath);\n\n } catch (error: any) {\n logger.error('Failed to save audio configuration: %s', error.message);\n throw error;\n }\n};\n\nexport const loadAudioDeviceFromHomeConfig = async (preferencesDirectory: string): Promise<{ audioDevice: string; audioDeviceName: string; sampleRate?: number; channels?: number; channelLayout?: string } | null> => {\n const logger = getLogger();\n const storage = createStorage({ log: logger.info });\n\n try {\n const configPath = getAudioDeviceConfigPath(preferencesDirectory);\n const configContent = await storage.readFile(configPath, 'utf-8');\n const audioConfig = yaml.load(configContent) as any;\n\n if (audioConfig?.audioDevice) {\n logger.debug('Loaded audio device from preferences config: [%s] %s', audioConfig.audioDevice, audioConfig.audioDeviceName || 'Unknown');\n return {\n audioDevice: audioConfig.audioDevice,\n audioDeviceName: audioConfig.audioDeviceName || 'Unknown',\n sampleRate: audioConfig.sampleRate,\n channels: audioConfig.channels,\n channelLayout: audioConfig.channelLayout\n };\n }\n\n return null;\n } catch {\n // Config file doesn't exist or is invalid\n logger.debug('No saved audio device configuration found in preferences directory');\n return null;\n }\n};\n\nexport const audioDeviceConfigExists = async (preferencesDirectory: string): Promise<boolean> => {\n const storage = createStorage({ log: () => { } });\n const configPath = getAudioDeviceConfigPath(preferencesDirectory);\n\n try {\n await storage.readFile(configPath, 'utf-8');\n return true;\n } catch {\n return false;\n }\n};\n\nconst listAudioDevices = async (): Promise<void> => {\n const logger = getLogger();\n try {\n try {\n await run('ffmpeg -f avfoundation -list_devices true -i \"\"');\n } catch (result: any) {\n const output = result.stderr || result.stdout || '';\n const audioDevicesSection = output.split('AVFoundation audio devices:')[1];\n\n if (audioDevicesSection) {\n logger.info('🎙️ Available audio devices:');\n const deviceLines = audioDevicesSection.split('\\n')\n .filter((line: string) => line.includes('[') && line.includes(']'))\n .map((line: string) => line.trim());\n\n deviceLines.forEach((line: string, i: number) => {\n const match = line.match(/\\[(\\d+)\\]\\s+(.+)/);\n if (match) {\n logger.info(` ${i + 1}. ${match[2]}`);\n }\n });\n }\n }\n } catch {\n logger.debug('Could not list audio devices');\n }\n};\n\nexport const execute = async (runConfig: Config): Promise<string> => {\n const logger = getLogger();\n const isDryRun = runConfig.dryRun || false;\n\n if (isDryRun) {\n logger.info('DRY RUN: Would start audio device selection process');\n logger.info('DRY RUN: Would save selected device to %s/audio-device.yaml', runConfig.preferencesDirectory);\n return 'Audio device selection completed (dry run)';\n }\n\n logger.info('🎛️ Starting audio device selection...');\n logger.info('');\n logger.info('This device will be used to capture audio for:');\n logger.info(' • Audio commit messages (audio-commit command)');\n logger.info(' • Audio code reviews (audio-review command)');\n logger.info('');\n\n // List available devices in debug mode\n if (runConfig.debug) {\n await listAudioDevices();\n }\n\n const selectedDevice = await selectAudioDeviceInteractively();\n\n if (selectedDevice === null) {\n logger.error('❌ Audio device selection cancelled or failed');\n process.exit(1);\n }\n\n // Probe device capabilities (sample rate / channels)\n const capabilities = await getAudioDeviceInfo(selectedDevice.index);\n\n // Save to preferences directory configuration\n await saveAudioDeviceToHomeConfig(selectedDevice.index, selectedDevice.name, capabilities, runConfig.preferencesDirectory!);\n logger.info('💾 Audio device saved to %s/audio-device.yaml', runConfig.preferencesDirectory);\n\n logger.info('✅ Audio device selection complete');\n logger.info('');\n logger.info('You can now run audio-commit or audio-review commands to use your selected device');\n logger.info('To change your audio device in the future, run the select-audio command again');\n\n return `Audio device configured successfully: ${selectedDevice.name}`;\n}; "],"names":["parseAudioDevices","run","result","output","stderr","stdout","audioDevicesSection","split","deviceLines","filter","line","includes","map","trim","match","index","name","Boolean","selectAudioDeviceInteractively","logger","getLogger","info","devices","length","error","deviceStatuses","Promise","all","device","testAudioDevice","isWorking","forEach","i","status","workingDevices","d","resolve","process","stdin","setRawMode","resume","setEncoding","inputBuffer","keyHandler","key","keyCode","charCodeAt","selectedIndex","parseInt","selectedDevice","write","warn","pause","removeListener","slice","on","getAudioDeviceConfigPath","preferencesDirectory","path","join","ensurePreferencesDirectory","storage","createStorage","log","ensureDirectory","debug","message","saveAudioDeviceToHomeConfig","deviceIndex","deviceName","capabilities","configPath","audioConfig","audioDevice","audioDeviceName","sampleRate","channels","channelLayout","lastUpdated","Date","toISOString","yamlContent","yaml","dump","indent","lineWidth","noRefs","writeFile","loadAudioDeviceFromHomeConfig","configContent","readFile","load","audioDeviceConfigExists","listAudioDevices","execute","runConfig","isDryRun","dryRun","exit","getAudioDeviceInfo"],"mappings":"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"}
package/dist/constants.js CHANGED
@@ -1,6 +1,8 @@
1
- const VERSION = '0.0.15 (HEAD/16994fd T:v0.0.15 2025-07-02 02:49:07 -0700) linux x64 v22.16.0';
1
+ import os from 'os';
2
+ import path from 'path';
3
+
4
+ const VERSION = '0.0.17 (HEAD/11fb779 T:v0.0.17 2025-07-02 16:08:40 -0700) linux x64 v22.16.0';
2
5
  const PROGRAM_NAME = 'kodrdriv';
3
- const DEFAULT_CHARACTER_ENCODING = 'utf-8';
4
6
  const DEFAULT_OVERRIDES = false;
5
7
  const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-MM-DD-HHmmss';
6
8
  const DEFAULT_VERBOSE = false;
@@ -10,6 +12,7 @@ const DEFAULT_MODEL = 'gpt-4o-mini';
10
12
  const DEFAULT_OUTPUT_DIRECTORY = 'output/kodrdriv';
11
13
  const DEFAULT_CONTEXT_DIRECTORIES = [];
12
14
  const DEFAULT_CONFIG_DIR = '.kodrdriv';
15
+ const DEFAULT_PREFERENCES_DIRECTORY = path.join(os.homedir(), '.kodrdriv');
13
16
  const DEFAULT_FROM_COMMIT_ALIAS = 'origin/HEAD';
14
17
  const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';
15
18
  const DEFAULT_ADD = false;
@@ -56,6 +59,7 @@ const DEFAULT_EXCLUDED_PATTERNS = [
56
59
  ];
57
60
  const COMMAND_COMMIT = 'commit';
58
61
  const COMMAND_AUDIO_COMMIT = 'audio-commit';
62
+ const COMMAND_SELECT_AUDIO = 'select-audio';
59
63
  const COMMAND_RELEASE = 'release';
60
64
  const COMMAND_REVIEW = 'review';
61
65
  const COMMAND_AUDIO_REVIEW = 'audio-review';
@@ -68,6 +72,7 @@ const COMMAND_INIT_CONFIG = 'init-config';
68
72
  const ALLOWED_COMMANDS = [
69
73
  COMMAND_COMMIT,
70
74
  COMMAND_AUDIO_COMMIT,
75
+ COMMAND_SELECT_AUDIO,
71
76
  COMMAND_RELEASE,
72
77
  COMMAND_REVIEW,
73
78
  COMMAND_AUDIO_REVIEW,
@@ -92,11 +97,11 @@ const KODRDRIV_DEFAULTS = {
92
97
  debug: DEFAULT_DEBUG,
93
98
  overrides: DEFAULT_OVERRIDES,
94
99
  model: DEFAULT_MODEL,
95
- instructions: DEFAULT_INSTRUCTIONS_DIR,
96
100
  contextDirectories: DEFAULT_CONTEXT_DIRECTORIES,
97
101
  commandName: DEFAULT_COMMAND,
98
102
  configDirectory: DEFAULT_CONFIG_DIR,
99
103
  outputDirectory: DEFAULT_OUTPUT_DIRECTORY,
104
+ preferencesDirectory: DEFAULT_PREFERENCES_DIRECTORY,
100
105
  commit: {
101
106
  add: DEFAULT_ADD,
102
107
  cached: DEFAULT_CACHED,
@@ -132,14 +137,18 @@ const KODRDRIV_DEFAULTS = {
132
137
  diffHistoryLimit: 5,
133
138
  releaseNotesLimit: 3,
134
139
  githubIssuesLimit: 20,
135
- sendit: DEFAULT_SENDIT_MODE
140
+ sendit: DEFAULT_SENDIT_MODE,
141
+ maxRecordingTime: 300,
142
+ audioDevice: undefined
136
143
  },
137
144
  publish: {
138
145
  mergeMethod: DEFAULT_MERGE_METHOD,
139
146
  requiredEnvVars: [
140
147
  'GITHUB_TOKEN',
141
148
  'OPENAI_API_KEY'
142
- ]
149
+ ],
150
+ linkWorkspacePackages: true,
151
+ unlinkWorkspacePackages: true
143
152
  },
144
153
  link: {
145
154
  scopeRoots: {},
@@ -149,5 +158,5 @@ const KODRDRIV_DEFAULTS = {
149
158
  excludedPatterns: DEFAULT_EXCLUDED_PATTERNS
150
159
  };
151
160
 
152
- export { ALLOWED_COMMANDS, COMMAND_AUDIO_COMMIT, COMMAND_AUDIO_REVIEW, COMMAND_CHECK_CONFIG, COMMAND_CLEAN, COMMAND_COMMIT, COMMAND_INIT_CONFIG, COMMAND_LINK, COMMAND_PUBLISH, COMMAND_RELEASE, COMMAND_REVIEW, COMMAND_UNLINK, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, DEFAULT_ADD, DEFAULT_CACHED, DEFAULT_CHARACTER_ENCODING, DEFAULT_COMMAND, DEFAULT_CONFIG_DIR, DEFAULT_CONTEXT_DIRECTORIES, DEFAULT_DEBUG, DEFAULT_DRY_RUN, DEFAULT_EXCLUDED_PATTERNS, DEFAULT_FROM_COMMIT_ALIAS, DEFAULT_INSTRUCTIONS_AUDIO_REVIEW_FILE, DEFAULT_INSTRUCTIONS_COMMIT_FILE, DEFAULT_INSTRUCTIONS_DIR, DEFAULT_INSTRUCTIONS_RELEASE_FILE, DEFAULT_MERGE_METHOD, DEFAULT_MESSAGE_LIMIT, DEFAULT_MODEL, DEFAULT_OUTPUT_DIRECTORY, DEFAULT_OVERRIDES, DEFAULT_PERSONA_COMMITTER_FILE, DEFAULT_PERSONA_DIR, DEFAULT_PERSONA_RELEASER_FILE, DEFAULT_PERSONA_REVIEWER_FILE, DEFAULT_SENDIT_MODE, DEFAULT_TO_COMMIT_ALIAS, DEFAULT_VERBOSE, KODRDRIV_DEFAULTS, PROGRAM_NAME, VERSION };
161
+ export { ALLOWED_COMMANDS, COMMAND_AUDIO_COMMIT, COMMAND_AUDIO_REVIEW, COMMAND_CHECK_CONFIG, COMMAND_CLEAN, COMMAND_COMMIT, COMMAND_INIT_CONFIG, COMMAND_LINK, COMMAND_PUBLISH, COMMAND_RELEASE, COMMAND_REVIEW, COMMAND_SELECT_AUDIO, COMMAND_UNLINK, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, DEFAULT_ADD, DEFAULT_CACHED, DEFAULT_COMMAND, DEFAULT_CONFIG_DIR, DEFAULT_CONTEXT_DIRECTORIES, DEFAULT_DEBUG, DEFAULT_DRY_RUN, DEFAULT_EXCLUDED_PATTERNS, DEFAULT_FROM_COMMIT_ALIAS, DEFAULT_INSTRUCTIONS_AUDIO_REVIEW_FILE, DEFAULT_INSTRUCTIONS_COMMIT_FILE, DEFAULT_INSTRUCTIONS_DIR, DEFAULT_INSTRUCTIONS_RELEASE_FILE, DEFAULT_MERGE_METHOD, DEFAULT_MESSAGE_LIMIT, DEFAULT_MODEL, DEFAULT_OUTPUT_DIRECTORY, DEFAULT_OVERRIDES, DEFAULT_PERSONA_COMMITTER_FILE, DEFAULT_PERSONA_DIR, DEFAULT_PERSONA_RELEASER_FILE, DEFAULT_PERSONA_REVIEWER_FILE, DEFAULT_PREFERENCES_DIRECTORY, DEFAULT_SENDIT_MODE, DEFAULT_TO_COMMIT_ALIAS, DEFAULT_VERBOSE, KODRDRIV_DEFAULTS, PROGRAM_NAME, VERSION };
153
162
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["import { MergeMethod } from './types';\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'kodrdriv';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_OVERRIDES = false;\nexport const DATE_FORMAT_MONTH_DAY = 'MM-DD';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-MM';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-MM-DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/MM/DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-MM-DD-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-MM-DD-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';\nexport const DATE_FORMAT_SHORT_TIMESTAMP = 'YYMMdd-HHmm';\nexport const DATE_FORMAT_MONTH = 'MM';\nexport const DATE_FORMAT_DAY = 'DD';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_MODEL = 'gpt-4o-mini';\nexport const DEFAULT_MODEL_STRONG = 'gpt-4o';\nexport const DEFAULT_OUTPUT_DIRECTORY = 'output/kodrdriv';\n\nexport const DEFAULT_CONTEXT_DIRECTORIES: string[] = [];\n\nexport const DEFAULT_CONFIG_DIR = '.kodrdriv';\n\nexport const DEFAULT_FROM_COMMIT_ALIAS = 'origin/HEAD';\nexport const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';\n\nexport const DEFAULT_ADD = false;\nexport const DEFAULT_CACHED = false;\nexport const DEFAULT_SENDIT_MODE = false;\nexport const DEFAULT_MESSAGE_LIMIT = 50;\n\nexport const DEFAULT_MERGE_METHOD: MergeMethod = 'squash';\n\nexport const DEFAULT_EXCLUDED_PATTERNS = [\n 'node_modules', 'pnpm-lock.yaml', 'package-lock.json', 'yarn.lock', 'bun.lockb',\n 'composer.lock', 'Cargo.lock', 'Gemfile.lock',\n 'dist', 'build', 'out', '.next', '.nuxt', 'coverage',\n '.vscode', '.idea', '.DS_Store', '.git', '.gitignore',\n 'logs', 'tmp', '.cache', '*.log', '.env', '.env.*',\n '*.pem', '*.crt', '*.key', '*.sqlite', '*.db',\n '*.zip', '*.tar', '*.gz', '*.exe', '*.bin'\n];\n\nexport const COMMAND_COMMIT = 'commit';\nexport const COMMAND_AUDIO_COMMIT = 'audio-commit';\nexport const COMMAND_RELEASE = 'release';\nexport const COMMAND_REVIEW = 'review';\nexport const COMMAND_AUDIO_REVIEW = 'audio-review';\nexport const COMMAND_PUBLISH = 'publish';\nexport const COMMAND_LINK = 'link';\nexport const COMMAND_UNLINK = 'unlink';\nexport const COMMAND_CLEAN = 'clean';\nexport const COMMAND_CHECK_CONFIG = 'check-config';\nexport const COMMAND_INIT_CONFIG = 'init-config';\n\nexport const ALLOWED_COMMANDS = [\n COMMAND_COMMIT,\n COMMAND_AUDIO_COMMIT,\n COMMAND_RELEASE,\n COMMAND_REVIEW,\n COMMAND_AUDIO_REVIEW,\n COMMAND_PUBLISH,\n COMMAND_LINK,\n COMMAND_UNLINK,\n COMMAND_CLEAN\n];\n\nexport const DEFAULT_COMMAND = COMMAND_COMMIT;\n\nexport const DEFAULT_INSTRUCTIONS_DIR = `instructions`;\n\nexport const DEFAULT_PERSONA_DIR = `personas`;\n\nexport const DEFAULT_INSTRUCTIONS_COMMIT_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/commit.md`;\nexport const DEFAULT_INSTRUCTIONS_RELEASE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/release.md`;\nexport const DEFAULT_INSTRUCTIONS_AUDIO_REVIEW_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/review.md`;\n\nexport const DEFAULT_PERSONA_COMMITTER_FILE = `${DEFAULT_PERSONA_DIR}/committer.md`;\nexport const DEFAULT_PERSONA_RELEASER_FILE = `${DEFAULT_PERSONA_DIR}/releaser.md`;\nexport const DEFAULT_PERSONA_REVIEWER_FILE = `${DEFAULT_PERSONA_DIR}/reviewer.md`;\nexport const DEFAULT_PERSONA_YOU_FILE = `${DEFAULT_PERSONA_DIR}/you.md`;\n\n// Default instructions for each persona\nexport const DEFAULT_INSTRUCTIONS_MAP = {\n [COMMAND_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE, // Reuse commit instructions\n [COMMAND_RELEASE]: DEFAULT_INSTRUCTIONS_RELEASE_FILE,\n [COMMAND_REVIEW]: DEFAULT_INSTRUCTIONS_AUDIO_REVIEW_FILE, // Reuse audio-review instructions for now\n [COMMAND_AUDIO_REVIEW]: DEFAULT_INSTRUCTIONS_AUDIO_REVIEW_FILE,\n};\n\n// Default personas for each command\nexport const DEFAULT_PERSONA_MAP = {\n [COMMAND_COMMIT]: DEFAULT_PERSONA_COMMITTER_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_PERSONA_COMMITTER_FILE, // Reuse committer persona\n [COMMAND_RELEASE]: DEFAULT_PERSONA_RELEASER_FILE,\n [COMMAND_REVIEW]: DEFAULT_PERSONA_REVIEWER_FILE, // Reuse reviewer persona\n [COMMAND_AUDIO_REVIEW]: DEFAULT_PERSONA_REVIEWER_FILE,\n};\n\n// Used by child process to create paths\nexport const DEFAULT_PATH_SEPARATOR = '/';\n\n// Used by util/general for file filtering\nexport const DEFAULT_IGNORE_PATTERNS = [\n 'node_modules/**',\n '**/*.log',\n '.git/**',\n 'dist/**',\n 'build/**',\n 'coverage/**',\n '.DS_Store',\n '*.tmp',\n '*.cache',\n];\n\n// Used by util/storage for directory names\nexport const DEFAULT_DIRECTORY_PREFIX = '.kodrdriv';\n\n// Used by other commands but not exposed in CLI\nexport const INTERNAL_DEFAULT_OUTPUT_FILE = 'output.txt';\n\nexport const INTERNAL_DATETIME_FORMAT = 'YYYY-MM-DD_HH-mm-ss';\n\n// Define defaults in one place\nexport const KODRDRIV_DEFAULTS = {\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n overrides: DEFAULT_OVERRIDES,\n model: DEFAULT_MODEL,\n instructions: DEFAULT_INSTRUCTIONS_DIR,\n contextDirectories: DEFAULT_CONTEXT_DIRECTORIES,\n commandName: DEFAULT_COMMAND,\n configDirectory: DEFAULT_CONFIG_DIR,\n outputDirectory: DEFAULT_OUTPUT_DIRECTORY,\n commit: {\n add: DEFAULT_ADD,\n cached: DEFAULT_CACHED,\n sendit: DEFAULT_SENDIT_MODE,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n },\n release: {\n from: DEFAULT_FROM_COMMIT_ALIAS,\n to: DEFAULT_TO_COMMIT_ALIAS,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n },\n audioCommit: {\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n },\n review: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n },\n audioReview: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n },\n publish: {\n mergeMethod: DEFAULT_MERGE_METHOD,\n requiredEnvVars: ['GITHUB_TOKEN', 'OPENAI_API_KEY'],\n },\n link: {\n scopeRoots: {},\n workspaceFile: 'pnpm-workspace.yaml',\n dryRun: false,\n },\n excludedPatterns: DEFAULT_EXCLUDED_PATTERNS,\n};"],"names":["VERSION","PROGRAM_NAME","DEFAULT_CHARACTER_ENCODING","DEFAULT_OVERRIDES","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS","DEFAULT_VERBOSE","DEFAULT_DRY_RUN","DEFAULT_DEBUG","DEFAULT_MODEL","DEFAULT_OUTPUT_DIRECTORY","DEFAULT_CONTEXT_DIRECTORIES","DEFAULT_CONFIG_DIR","DEFAULT_FROM_COMMIT_ALIAS","DEFAULT_TO_COMMIT_ALIAS","DEFAULT_ADD","DEFAULT_CACHED","DEFAULT_SENDIT_MODE","DEFAULT_MESSAGE_LIMIT","DEFAULT_MERGE_METHOD","DEFAULT_EXCLUDED_PATTERNS","COMMAND_COMMIT","COMMAND_AUDIO_COMMIT","COMMAND_RELEASE","COMMAND_REVIEW","COMMAND_AUDIO_REVIEW","COMMAND_PUBLISH","COMMAND_LINK","COMMAND_UNLINK","COMMAND_CLEAN","COMMAND_CHECK_CONFIG","COMMAND_INIT_CONFIG","ALLOWED_COMMANDS","DEFAULT_COMMAND","DEFAULT_INSTRUCTIONS_DIR","DEFAULT_PERSONA_DIR","DEFAULT_INSTRUCTIONS_COMMIT_FILE","DEFAULT_INSTRUCTIONS_RELEASE_FILE","DEFAULT_INSTRUCTIONS_AUDIO_REVIEW_FILE","DEFAULT_PERSONA_COMMITTER_FILE","DEFAULT_PERSONA_RELEASER_FILE","DEFAULT_PERSONA_REVIEWER_FILE","KODRDRIV_DEFAULTS","dryRun","verbose","debug","overrides","model","instructions","contextDirectories","commandName","configDirectory","outputDirectory","commit","add","cached","sendit","messageLimit","release","from","to","audioCommit","maxRecordingTime","audioDevice","undefined","review","includeCommitHistory","includeRecentDiffs","includeReleaseNotes","includeGithubIssues","commitHistoryLimit","diffHistoryLimit","releaseNotesLimit","githubIssuesLimit","audioReview","publish","mergeMethod","requiredEnvVars","link","scopeRoots","workspaceFile","excludedPatterns"],"mappings":"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"}
1
+ {"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["import { MergeMethod } from './types';\nimport os from 'os';\nimport path from 'path';\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'kodrdriv';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_OVERRIDES = false;\nexport const DATE_FORMAT_MONTH_DAY = 'MM-DD';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-MM';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-MM-DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/MM/DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-MM-DD-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-MM-DD-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';\nexport const DATE_FORMAT_SHORT_TIMESTAMP = 'YYMMdd-HHmm';\nexport const DATE_FORMAT_MONTH = 'MM';\nexport const DATE_FORMAT_DAY = 'DD';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_MODEL = 'gpt-4o-mini';\nexport const DEFAULT_MODEL_STRONG = 'gpt-4o';\nexport const DEFAULT_OUTPUT_DIRECTORY = 'output/kodrdriv';\n\nexport const DEFAULT_CONTEXT_DIRECTORIES: string[] = [];\n\nexport const DEFAULT_CONFIG_DIR = '.kodrdriv';\nexport const DEFAULT_PREFERENCES_DIRECTORY = path.join(os.homedir(), '.kodrdriv');\n\nexport const DEFAULT_FROM_COMMIT_ALIAS = 'origin/HEAD';\nexport const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';\n\nexport const DEFAULT_ADD = false;\nexport const DEFAULT_CACHED = false;\nexport const DEFAULT_SENDIT_MODE = false;\nexport const DEFAULT_MESSAGE_LIMIT = 50;\n\nexport const DEFAULT_MERGE_METHOD: MergeMethod = 'squash';\n\nexport const DEFAULT_EXCLUDED_PATTERNS = [\n 'node_modules', 'pnpm-lock.yaml', 'package-lock.json', 'yarn.lock', 'bun.lockb',\n 'composer.lock', 'Cargo.lock', 'Gemfile.lock',\n 'dist', 'build', 'out', '.next', '.nuxt', 'coverage',\n '.vscode', '.idea', '.DS_Store', '.git', '.gitignore',\n 'logs', 'tmp', '.cache', '*.log', '.env', '.env.*',\n '*.pem', '*.crt', '*.key', '*.sqlite', '*.db',\n '*.zip', '*.tar', '*.gz', '*.exe', '*.bin'\n];\n\nexport const COMMAND_COMMIT = 'commit';\nexport const COMMAND_AUDIO_COMMIT = 'audio-commit';\nexport const COMMAND_SELECT_AUDIO = 'select-audio';\nexport const COMMAND_RELEASE = 'release';\nexport const COMMAND_REVIEW = 'review';\nexport const COMMAND_AUDIO_REVIEW = 'audio-review';\nexport const COMMAND_PUBLISH = 'publish';\nexport const COMMAND_LINK = 'link';\nexport const COMMAND_UNLINK = 'unlink';\nexport const COMMAND_CLEAN = 'clean';\nexport const COMMAND_CHECK_CONFIG = 'check-config';\nexport const COMMAND_INIT_CONFIG = 'init-config';\n\nexport const ALLOWED_COMMANDS = [\n COMMAND_COMMIT,\n COMMAND_AUDIO_COMMIT,\n COMMAND_SELECT_AUDIO,\n COMMAND_RELEASE,\n COMMAND_REVIEW,\n COMMAND_AUDIO_REVIEW,\n COMMAND_PUBLISH,\n COMMAND_LINK,\n COMMAND_UNLINK,\n COMMAND_CLEAN\n];\n\nexport const DEFAULT_COMMAND = COMMAND_COMMIT;\n\nexport const DEFAULT_INSTRUCTIONS_DIR = `instructions`;\n\nexport const DEFAULT_PERSONA_DIR = `personas`;\n\nexport const DEFAULT_INSTRUCTIONS_COMMIT_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/commit.md`;\nexport const DEFAULT_INSTRUCTIONS_RELEASE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/release.md`;\nexport const DEFAULT_INSTRUCTIONS_AUDIO_REVIEW_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/review.md`;\n\nexport const DEFAULT_PERSONA_COMMITTER_FILE = `${DEFAULT_PERSONA_DIR}/committer.md`;\nexport const DEFAULT_PERSONA_RELEASER_FILE = `${DEFAULT_PERSONA_DIR}/releaser.md`;\nexport const DEFAULT_PERSONA_REVIEWER_FILE = `${DEFAULT_PERSONA_DIR}/reviewer.md`;\nexport const DEFAULT_PERSONA_YOU_FILE = `${DEFAULT_PERSONA_DIR}/you.md`;\n\n// Default instructions for each persona\nexport const DEFAULT_INSTRUCTIONS_MAP = {\n [COMMAND_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_INSTRUCTIONS_COMMIT_FILE, // Reuse commit instructions\n [COMMAND_RELEASE]: DEFAULT_INSTRUCTIONS_RELEASE_FILE,\n [COMMAND_REVIEW]: DEFAULT_INSTRUCTIONS_AUDIO_REVIEW_FILE, // Reuse audio-review instructions for now\n [COMMAND_AUDIO_REVIEW]: DEFAULT_INSTRUCTIONS_AUDIO_REVIEW_FILE,\n};\n\n// Default personas for each command\nexport const DEFAULT_PERSONA_MAP = {\n [COMMAND_COMMIT]: DEFAULT_PERSONA_COMMITTER_FILE,\n [COMMAND_AUDIO_COMMIT]: DEFAULT_PERSONA_COMMITTER_FILE, // Reuse committer persona\n [COMMAND_RELEASE]: DEFAULT_PERSONA_RELEASER_FILE,\n [COMMAND_REVIEW]: DEFAULT_PERSONA_REVIEWER_FILE, // Reuse reviewer persona\n [COMMAND_AUDIO_REVIEW]: DEFAULT_PERSONA_REVIEWER_FILE,\n};\n\n// Used by child process to create paths\nexport const DEFAULT_PATH_SEPARATOR = '/';\n\n// Used by util/general for file filtering\nexport const DEFAULT_IGNORE_PATTERNS = [\n 'node_modules/**',\n '**/*.log',\n '.git/**',\n 'dist/**',\n 'build/**',\n 'coverage/**',\n '.DS_Store',\n '*.tmp',\n '*.cache',\n];\n\n// Used by util/storage for directory names\nexport const DEFAULT_DIRECTORY_PREFIX = '.kodrdriv';\n\n// Used by other commands but not exposed in CLI\nexport const INTERNAL_DEFAULT_OUTPUT_FILE = 'output.txt';\n\nexport const INTERNAL_DATETIME_FORMAT = 'YYYY-MM-DD_HH-mm-ss';\n\n// Define defaults in one place\nexport const KODRDRIV_DEFAULTS = {\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n overrides: DEFAULT_OVERRIDES,\n model: DEFAULT_MODEL,\n contextDirectories: DEFAULT_CONTEXT_DIRECTORIES,\n commandName: DEFAULT_COMMAND,\n configDirectory: DEFAULT_CONFIG_DIR,\n outputDirectory: DEFAULT_OUTPUT_DIRECTORY,\n preferencesDirectory: DEFAULT_PREFERENCES_DIRECTORY,\n commit: {\n add: DEFAULT_ADD,\n cached: DEFAULT_CACHED,\n sendit: DEFAULT_SENDIT_MODE,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n },\n release: {\n from: DEFAULT_FROM_COMMIT_ALIAS,\n to: DEFAULT_TO_COMMIT_ALIAS,\n messageLimit: DEFAULT_MESSAGE_LIMIT,\n },\n audioCommit: {\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n },\n review: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n },\n audioReview: {\n includeCommitHistory: true,\n includeRecentDiffs: true,\n includeReleaseNotes: false,\n includeGithubIssues: true,\n commitHistoryLimit: 10,\n diffHistoryLimit: 5,\n releaseNotesLimit: 3,\n githubIssuesLimit: 20,\n sendit: DEFAULT_SENDIT_MODE,\n maxRecordingTime: 300, // 5 minutes default\n audioDevice: undefined, // Auto-detect by default\n },\n publish: {\n mergeMethod: DEFAULT_MERGE_METHOD,\n requiredEnvVars: ['GITHUB_TOKEN', 'OPENAI_API_KEY'],\n linkWorkspacePackages: true,\n unlinkWorkspacePackages: true,\n },\n link: {\n scopeRoots: {},\n workspaceFile: 'pnpm-workspace.yaml',\n dryRun: false,\n },\n excludedPatterns: DEFAULT_EXCLUDED_PATTERNS,\n};"],"names":["VERSION","PROGRAM_NAME","DEFAULT_OVERRIDES","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS","DEFAULT_VERBOSE","DEFAULT_DRY_RUN","DEFAULT_DEBUG","DEFAULT_MODEL","DEFAULT_OUTPUT_DIRECTORY","DEFAULT_CONTEXT_DIRECTORIES","DEFAULT_CONFIG_DIR","DEFAULT_PREFERENCES_DIRECTORY","path","join","os","homedir","DEFAULT_FROM_COMMIT_ALIAS","DEFAULT_TO_COMMIT_ALIAS","DEFAULT_ADD","DEFAULT_CACHED","DEFAULT_SENDIT_MODE","DEFAULT_MESSAGE_LIMIT","DEFAULT_MERGE_METHOD","DEFAULT_EXCLUDED_PATTERNS","COMMAND_COMMIT","COMMAND_AUDIO_COMMIT","COMMAND_SELECT_AUDIO","COMMAND_RELEASE","COMMAND_REVIEW","COMMAND_AUDIO_REVIEW","COMMAND_PUBLISH","COMMAND_LINK","COMMAND_UNLINK","COMMAND_CLEAN","COMMAND_CHECK_CONFIG","COMMAND_INIT_CONFIG","ALLOWED_COMMANDS","DEFAULT_COMMAND","DEFAULT_INSTRUCTIONS_DIR","DEFAULT_PERSONA_DIR","DEFAULT_INSTRUCTIONS_COMMIT_FILE","DEFAULT_INSTRUCTIONS_RELEASE_FILE","DEFAULT_INSTRUCTIONS_AUDIO_REVIEW_FILE","DEFAULT_PERSONA_COMMITTER_FILE","DEFAULT_PERSONA_RELEASER_FILE","DEFAULT_PERSONA_REVIEWER_FILE","KODRDRIV_DEFAULTS","dryRun","verbose","debug","overrides","model","contextDirectories","commandName","configDirectory","outputDirectory","preferencesDirectory","commit","add","cached","sendit","messageLimit","release","from","to","audioCommit","maxRecordingTime","audioDevice","undefined","review","includeCommitHistory","includeRecentDiffs","includeReleaseNotes","includeGithubIssues","commitHistoryLimit","diffHistoryLimit","releaseNotesLimit","githubIssuesLimit","audioReview","publish","mergeMethod","requiredEnvVars","linkWorkspacePackages","unlinkWorkspacePackages","link","scopeRoots","workspaceFile","excludedPatterns"],"mappings":"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"}
@@ -30,6 +30,10 @@ async function getUserChoice(prompt, choices) {
30
30
  });
31
31
  logger.info('');
32
32
  return new Promise((resolve)=>{
33
+ // Ensure stdin is referenced so the process doesn't exit while waiting for input
34
+ if (typeof process.stdin.ref === 'function') {
35
+ process.stdin.ref();
36
+ }
33
37
  process.stdin.setRawMode(true);
34
38
  process.stdin.resume();
35
39
  process.stdin.on('data', (key)=>{
@@ -38,6 +42,10 @@ async function getUserChoice(prompt, choices) {
38
42
  if (choice) {
39
43
  process.stdin.setRawMode(false);
40
44
  process.stdin.pause();
45
+ // Detach stdin again now that we're done
46
+ if (typeof process.stdin.unref === 'function') {
47
+ process.stdin.unref();
48
+ }
41
49
  logger.info(`Selected: ${choice.label}\n`);
42
50
  resolve(choice.key);
43
51
  }
@@ -48,6 +56,10 @@ async function getUserChoice(prompt, choices) {
48
56
  async function editIssueInteractively(issue) {
49
57
  const logger = getLogger();
50
58
  const readline = await import('readline');
59
+ // Ensure stdin is referenced during readline interaction
60
+ if (typeof process.stdin.ref === 'function') {
61
+ process.stdin.ref();
62
+ }
51
63
  const rl = readline.createInterface({
52
64
  input: process.stdin,
53
65
  output: process.stdout
@@ -74,6 +86,10 @@ async function editIssueInteractively(issue) {
74
86
  return updatedIssue;
75
87
  } finally{
76
88
  rl.close();
89
+ // Detach stdin after interactive edit completes
90
+ if (typeof process.stdin.unref === 'function') {
91
+ process.stdin.unref();
92
+ }
77
93
  }
78
94
  }
79
95
  // Helper function to format issue body for GitHub