@eldrforge/kodrdriv 0.0.14 → 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.
- package/README.md +1 -9
- package/dist/arguments.js +306 -55
- package/dist/arguments.js.map +1 -1
- package/dist/audio/devices.js +284 -0
- package/dist/audio/devices.js.map +1 -0
- package/dist/audio/index.js +31 -0
- package/dist/audio/index.js.map +1 -0
- package/dist/audio/processor.js +766 -0
- package/dist/audio/processor.js.map +1 -0
- package/dist/audio/types.js +16 -0
- package/dist/audio/types.js.map +1 -0
- package/dist/audio/validation.js +35 -0
- package/dist/audio/validation.js.map +1 -0
- package/dist/commands/audio-commit.js +64 -248
- package/dist/commands/audio-commit.js.map +1 -1
- package/dist/commands/audio-review.js +90 -701
- package/dist/commands/audio-review.js.map +1 -1
- package/dist/commands/commit.js +18 -18
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/release.js +14 -15
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/review.js +152 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/select-audio.js +265 -0
- package/dist/commands/select-audio.js.map +1 -0
- package/dist/constants.js +86 -68
- package/dist/constants.js.map +1 -1
- package/dist/content/diff.js +155 -1
- package/dist/content/diff.js.map +1 -1
- package/dist/content/issues.js +256 -0
- package/dist/content/issues.js.map +1 -0
- package/dist/content/releaseNotes.js +90 -0
- package/dist/content/releaseNotes.js.map +1 -0
- package/dist/main.js +9 -2
- package/dist/main.js.map +1 -1
- package/dist/prompt/instructions/commit.md +18 -15
- package/dist/prompt/instructions/release.md +6 -5
- package/dist/prompt/instructions/{audio-review.md → review.md} +24 -18
- package/dist/prompt/prompts.js +87 -19
- package/dist/prompt/prompts.js.map +1 -1
- package/dist/types.js +27 -3
- package/dist/types.js.map +1 -1
- package/dist/util/general.js +7 -1
- package/dist/util/general.js.map +1 -1
- package/dist/util/openai.js +34 -3
- package/dist/util/openai.js.map +1 -1
- package/dist/util/stdin.js +61 -0
- package/dist/util/stdin.js.map +1 -0
- package/package.json +6 -6
- package/.kodrdriv/config.yaml +0 -20
- package/.kodrdriv/context/content.md +0 -7
- package/RELEASE_NOTES.md +0 -14
- package/docs/index.html +0 -17
- package/docs/package.json +0 -36
- package/docs/pnpm-lock.yaml +0 -3441
- package/docs/public/README.md +0 -132
- package/docs/public/advanced-usage.md +0 -188
- package/docs/public/code-icon.svg +0 -4
- package/docs/public/commands.md +0 -116
- package/docs/public/configuration.md +0 -274
- package/docs/public/examples.md +0 -352
- package/docs/public/kodrdriv-logo.svg +0 -62
- package/docs/src/App.css +0 -387
- package/docs/src/App.tsx +0 -60
- package/docs/src/components/DocumentPage.tsx +0 -56
- package/docs/src/components/ErrorMessage.tsx +0 -15
- package/docs/src/components/LoadingSpinner.tsx +0 -14
- package/docs/src/components/MarkdownRenderer.tsx +0 -56
- package/docs/src/components/Navigation.css +0 -73
- package/docs/src/components/Navigation.tsx +0 -36
- package/docs/src/index.css +0 -61
- package/docs/src/main.tsx +0 -10
- package/docs/src/test/setup.ts +0 -1
- package/docs/src/vite-env.d.ts +0 -10
- package/docs/tsconfig.node.json +0 -13
- package/docs/vite.config.ts +0 -15
- package/docs/vitest.config.ts +0 -15
- package/eslint.config.mjs +0 -83
- package/nodemon.json +0 -14
- package/output/kodrdriv/250701-1442-release-notes.md +0 -3
- package/pnpm-workspace.yaml +0 -5
- package/tsconfig.tsbuildinfo +0 -1
- package/vite.config.ts +0 -90
- 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,96 +1,95 @@
|
|
|
1
|
-
|
|
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;
|
|
7
9
|
const DEFAULT_DRY_RUN = false;
|
|
8
10
|
const DEFAULT_DEBUG = false;
|
|
9
11
|
const DEFAULT_MODEL = 'gpt-4o-mini';
|
|
12
|
+
const DEFAULT_OUTPUT_DIRECTORY = 'output/kodrdriv';
|
|
10
13
|
const DEFAULT_CONTEXT_DIRECTORIES = [];
|
|
14
|
+
const DEFAULT_CONFIG_DIR = '.kodrdriv';
|
|
15
|
+
const DEFAULT_PREFERENCES_DIRECTORY = path.join(os.homedir(), '.kodrdriv');
|
|
16
|
+
const DEFAULT_FROM_COMMIT_ALIAS = 'origin/HEAD';
|
|
17
|
+
const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';
|
|
18
|
+
const DEFAULT_ADD = false;
|
|
19
|
+
const DEFAULT_CACHED = false;
|
|
20
|
+
const DEFAULT_SENDIT_MODE = false;
|
|
21
|
+
const DEFAULT_MESSAGE_LIMIT = 50;
|
|
22
|
+
const DEFAULT_MERGE_METHOD = 'squash';
|
|
23
|
+
const DEFAULT_EXCLUDED_PATTERNS = [
|
|
24
|
+
'node_modules',
|
|
25
|
+
'pnpm-lock.yaml',
|
|
26
|
+
'package-lock.json',
|
|
27
|
+
'yarn.lock',
|
|
28
|
+
'bun.lockb',
|
|
29
|
+
'composer.lock',
|
|
30
|
+
'Cargo.lock',
|
|
31
|
+
'Gemfile.lock',
|
|
32
|
+
'dist',
|
|
33
|
+
'build',
|
|
34
|
+
'out',
|
|
35
|
+
'.next',
|
|
36
|
+
'.nuxt',
|
|
37
|
+
'coverage',
|
|
38
|
+
'.vscode',
|
|
39
|
+
'.idea',
|
|
40
|
+
'.DS_Store',
|
|
41
|
+
'.git',
|
|
42
|
+
'.gitignore',
|
|
43
|
+
'logs',
|
|
44
|
+
'tmp',
|
|
45
|
+
'.cache',
|
|
46
|
+
'*.log',
|
|
47
|
+
'.env',
|
|
48
|
+
'.env.*',
|
|
49
|
+
'*.pem',
|
|
50
|
+
'*.crt',
|
|
51
|
+
'*.key',
|
|
52
|
+
'*.sqlite',
|
|
53
|
+
'*.db',
|
|
54
|
+
'*.zip',
|
|
55
|
+
'*.tar',
|
|
56
|
+
'*.gz',
|
|
57
|
+
'*.exe',
|
|
58
|
+
'*.bin'
|
|
59
|
+
];
|
|
11
60
|
const COMMAND_COMMIT = 'commit';
|
|
12
61
|
const COMMAND_AUDIO_COMMIT = 'audio-commit';
|
|
62
|
+
const COMMAND_SELECT_AUDIO = 'select-audio';
|
|
13
63
|
const COMMAND_RELEASE = 'release';
|
|
64
|
+
const COMMAND_REVIEW = 'review';
|
|
65
|
+
const COMMAND_AUDIO_REVIEW = 'audio-review';
|
|
14
66
|
const COMMAND_PUBLISH = 'publish';
|
|
15
67
|
const COMMAND_LINK = 'link';
|
|
16
68
|
const COMMAND_UNLINK = 'unlink';
|
|
17
|
-
const COMMAND_AUDIO_REVIEW = 'audio-review';
|
|
18
69
|
const COMMAND_CLEAN = 'clean';
|
|
19
70
|
const COMMAND_CHECK_CONFIG = 'check-config';
|
|
20
71
|
const COMMAND_INIT_CONFIG = 'init-config';
|
|
21
72
|
const ALLOWED_COMMANDS = [
|
|
22
73
|
COMMAND_COMMIT,
|
|
23
74
|
COMMAND_AUDIO_COMMIT,
|
|
75
|
+
COMMAND_SELECT_AUDIO,
|
|
24
76
|
COMMAND_RELEASE,
|
|
77
|
+
COMMAND_REVIEW,
|
|
78
|
+
COMMAND_AUDIO_REVIEW,
|
|
25
79
|
COMMAND_PUBLISH,
|
|
26
80
|
COMMAND_LINK,
|
|
27
81
|
COMMAND_UNLINK,
|
|
28
|
-
COMMAND_AUDIO_REVIEW,
|
|
29
82
|
COMMAND_CLEAN
|
|
30
83
|
];
|
|
31
84
|
const DEFAULT_COMMAND = COMMAND_COMMIT;
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const DEFAULT_PERSONA_COMMITTER_FILE = `${DEFAULT_PERSONAS_DIR}/committer.md`;
|
|
35
|
-
const DEFAULT_PERSONA_RELEASER_FILE = `${DEFAULT_PERSONAS_DIR}/releaser.md`;
|
|
36
|
-
const DEFAULT_PERSONA_REVIEWER_FILE = `${DEFAULT_PERSONAS_DIR}/reviewer.md`;
|
|
37
|
-
const DEFAULT_INSTRUCTIONS_DIR = `/instructions`;
|
|
85
|
+
const DEFAULT_INSTRUCTIONS_DIR = `instructions`;
|
|
86
|
+
const DEFAULT_PERSONA_DIR = `personas`;
|
|
38
87
|
const DEFAULT_INSTRUCTIONS_COMMIT_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/commit.md`;
|
|
39
88
|
const DEFAULT_INSTRUCTIONS_RELEASE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/release.md`;
|
|
40
|
-
const DEFAULT_INSTRUCTIONS_AUDIO_REVIEW_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
const DEFAULT_FROM_COMMIT_ALIAS = 'main';
|
|
45
|
-
const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';
|
|
46
|
-
const DEFAULT_MESSAGE_LIMIT = 10;
|
|
47
|
-
const DEFAULT_MERGE_METHOD = 'squash';
|
|
48
|
-
// Output directory for generated files
|
|
49
|
-
const DEFAULT_OUTPUT_DIRECTORY = 'output/kodrdriv';
|
|
50
|
-
const DEFAULT_EXCLUDED_PATTERNS = [
|
|
51
|
-
// Node modules & dependency files
|
|
52
|
-
"node_modules",
|
|
53
|
-
"pnpm-lock.yaml",
|
|
54
|
-
"package-lock.json",
|
|
55
|
-
"yarn.lock",
|
|
56
|
-
"bun.lockb",
|
|
57
|
-
"composer.lock",
|
|
58
|
-
"Cargo.lock",
|
|
59
|
-
"Gemfile.lock",
|
|
60
|
-
// Build output
|
|
61
|
-
"dist",
|
|
62
|
-
"build",
|
|
63
|
-
"out",
|
|
64
|
-
".next",
|
|
65
|
-
".nuxt",
|
|
66
|
-
"coverage",
|
|
67
|
-
// IDE & OS files
|
|
68
|
-
".vscode",
|
|
69
|
-
".idea",
|
|
70
|
-
".DS_Store",
|
|
71
|
-
// Version control
|
|
72
|
-
".git",
|
|
73
|
-
".gitignore",
|
|
74
|
-
// Logs, caches, and temp
|
|
75
|
-
"logs",
|
|
76
|
-
"tmp",
|
|
77
|
-
".cache",
|
|
78
|
-
"*.log",
|
|
79
|
-
// Sensitive data
|
|
80
|
-
".env",
|
|
81
|
-
".env.*",
|
|
82
|
-
"*.pem",
|
|
83
|
-
"*.crt",
|
|
84
|
-
"*.key",
|
|
85
|
-
// Binary and database files
|
|
86
|
-
"*.sqlite",
|
|
87
|
-
"*.db",
|
|
88
|
-
"*.zip",
|
|
89
|
-
"*.tar",
|
|
90
|
-
"*.gz",
|
|
91
|
-
"*.exe",
|
|
92
|
-
"*.bin"
|
|
93
|
-
];
|
|
89
|
+
const DEFAULT_INSTRUCTIONS_AUDIO_REVIEW_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/review.md`;
|
|
90
|
+
const DEFAULT_PERSONA_COMMITTER_FILE = `${DEFAULT_PERSONA_DIR}/committer.md`;
|
|
91
|
+
const DEFAULT_PERSONA_RELEASER_FILE = `${DEFAULT_PERSONA_DIR}/releaser.md`;
|
|
92
|
+
const DEFAULT_PERSONA_REVIEWER_FILE = `${DEFAULT_PERSONA_DIR}/reviewer.md`;
|
|
94
93
|
// Define defaults in one place
|
|
95
94
|
const KODRDRIV_DEFAULTS = {
|
|
96
95
|
dryRun: DEFAULT_DRY_RUN,
|
|
@@ -98,11 +97,11 @@ const KODRDRIV_DEFAULTS = {
|
|
|
98
97
|
debug: DEFAULT_DEBUG,
|
|
99
98
|
overrides: DEFAULT_OVERRIDES,
|
|
100
99
|
model: DEFAULT_MODEL,
|
|
101
|
-
instructions: DEFAULT_INSTRUCTIONS_DIR,
|
|
102
100
|
contextDirectories: DEFAULT_CONTEXT_DIRECTORIES,
|
|
103
101
|
commandName: DEFAULT_COMMAND,
|
|
104
102
|
configDirectory: DEFAULT_CONFIG_DIR,
|
|
105
103
|
outputDirectory: DEFAULT_OUTPUT_DIRECTORY,
|
|
104
|
+
preferencesDirectory: DEFAULT_PREFERENCES_DIRECTORY,
|
|
106
105
|
commit: {
|
|
107
106
|
add: DEFAULT_ADD,
|
|
108
107
|
cached: DEFAULT_CACHED,
|
|
@@ -114,7 +113,11 @@ const KODRDRIV_DEFAULTS = {
|
|
|
114
113
|
to: DEFAULT_TO_COMMIT_ALIAS,
|
|
115
114
|
messageLimit: DEFAULT_MESSAGE_LIMIT
|
|
116
115
|
},
|
|
117
|
-
|
|
116
|
+
audioCommit: {
|
|
117
|
+
maxRecordingTime: 300,
|
|
118
|
+
audioDevice: undefined
|
|
119
|
+
},
|
|
120
|
+
review: {
|
|
118
121
|
includeCommitHistory: true,
|
|
119
122
|
includeRecentDiffs: true,
|
|
120
123
|
includeReleaseNotes: false,
|
|
@@ -125,12 +128,27 @@ const KODRDRIV_DEFAULTS = {
|
|
|
125
128
|
githubIssuesLimit: 20,
|
|
126
129
|
sendit: DEFAULT_SENDIT_MODE
|
|
127
130
|
},
|
|
131
|
+
audioReview: {
|
|
132
|
+
includeCommitHistory: true,
|
|
133
|
+
includeRecentDiffs: true,
|
|
134
|
+
includeReleaseNotes: false,
|
|
135
|
+
includeGithubIssues: true,
|
|
136
|
+
commitHistoryLimit: 10,
|
|
137
|
+
diffHistoryLimit: 5,
|
|
138
|
+
releaseNotesLimit: 3,
|
|
139
|
+
githubIssuesLimit: 20,
|
|
140
|
+
sendit: DEFAULT_SENDIT_MODE,
|
|
141
|
+
maxRecordingTime: 300,
|
|
142
|
+
audioDevice: undefined
|
|
143
|
+
},
|
|
128
144
|
publish: {
|
|
129
145
|
mergeMethod: DEFAULT_MERGE_METHOD,
|
|
130
146
|
requiredEnvVars: [
|
|
131
147
|
'GITHUB_TOKEN',
|
|
132
148
|
'OPENAI_API_KEY'
|
|
133
|
-
]
|
|
149
|
+
],
|
|
150
|
+
linkWorkspacePackages: true,
|
|
151
|
+
unlinkWorkspacePackages: true
|
|
134
152
|
},
|
|
135
153
|
link: {
|
|
136
154
|
scopeRoots: {},
|
|
@@ -140,5 +158,5 @@ const KODRDRIV_DEFAULTS = {
|
|
|
140
158
|
excludedPatterns: DEFAULT_EXCLUDED_PATTERNS
|
|
141
159
|
};
|
|
142
160
|
|
|
143
|
-
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_UNLINK, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, DEFAULT_ADD, DEFAULT_CACHED,
|
|
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 };
|
|
144
162
|
//# sourceMappingURL=constants.js.map
|