@eldrforge/kodrdriv 1.2.1 → 1.2.2

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/dist/arguments.js CHANGED
@@ -14,6 +14,12 @@ z.object({
14
14
  checkConfig: z.boolean().optional(),
15
15
  initConfig: z.boolean().optional(),
16
16
  model: z.string().optional(),
17
+ openaiReasoning: z.enum([
18
+ 'low',
19
+ 'medium',
20
+ 'high'
21
+ ]).optional(),
22
+ openaiMaxOutputTokens: z.number().optional(),
17
23
  contextDirectories: z.array(z.string()).optional(),
18
24
  configDir: z.string().optional(),
19
25
  outputDir: z.string().optional(),
@@ -75,6 +81,8 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
75
81
  if (finalCliArgs.debug !== undefined) transformedCliArgs.debug = finalCliArgs.debug;
76
82
  if (finalCliArgs.overrides !== undefined) transformedCliArgs.overrides = finalCliArgs.overrides;
77
83
  if (finalCliArgs.model !== undefined) transformedCliArgs.model = finalCliArgs.model;
84
+ if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.openaiReasoning = finalCliArgs.openaiReasoning;
85
+ if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
78
86
  if (finalCliArgs.contextDirectories !== undefined) transformedCliArgs.contextDirectories = finalCliArgs.contextDirectories;
79
87
  // Map configDir (CLI) to configDirectory (Cardigantime standard)
80
88
  if (finalCliArgs.configDir !== undefined) transformedCliArgs.configDirectory = finalCliArgs.configDir;
@@ -83,7 +91,7 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
83
91
  // Map preferencesDir (CLI) to preferencesDirectory (Config standard)
84
92
  if (finalCliArgs.preferencesDir !== undefined) transformedCliArgs.preferencesDirectory = finalCliArgs.preferencesDir;
85
93
  // Nested mappings for 'commit' options
86
- if (finalCliArgs.cached !== undefined || finalCliArgs.sendit !== undefined || finalCliArgs.add !== undefined || finalCliArgs.skipFileCheck !== undefined || finalCliArgs.maxDiffBytes !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.amend !== undefined) {
94
+ if (finalCliArgs.cached !== undefined || finalCliArgs.sendit !== undefined || finalCliArgs.add !== undefined || finalCliArgs.skipFileCheck !== undefined || finalCliArgs.maxDiffBytes !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.amend !== undefined || finalCliArgs.openaiReasoning !== undefined || finalCliArgs.openaiMaxOutputTokens !== undefined || finalCliArgs.direction !== undefined) {
87
95
  transformedCliArgs.commit = {};
88
96
  if (finalCliArgs.add !== undefined) transformedCliArgs.commit.add = finalCliArgs.add;
89
97
  if (finalCliArgs.cached !== undefined) transformedCliArgs.commit.cached = finalCliArgs.cached;
@@ -95,15 +103,19 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
95
103
  if (finalCliArgs.direction !== undefined) transformedCliArgs.commit.direction = finalCliArgs.direction;
96
104
  if (finalCliArgs.skipFileCheck !== undefined) transformedCliArgs.commit.skipFileCheck = finalCliArgs.skipFileCheck;
97
105
  if (finalCliArgs.maxDiffBytes !== undefined) transformedCliArgs.commit.maxDiffBytes = finalCliArgs.maxDiffBytes;
106
+ if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.commit.openaiReasoning = finalCliArgs.openaiReasoning;
107
+ if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.commit.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
98
108
  }
99
109
  // Nested mappings for 'audioCommit' options
100
- if (finalCliArgs.file !== undefined || finalCliArgs.keepTemp !== undefined) {
110
+ if (finalCliArgs.file !== undefined || finalCliArgs.keepTemp !== undefined || finalCliArgs.openaiReasoning !== undefined || finalCliArgs.openaiMaxOutputTokens !== undefined) {
101
111
  transformedCliArgs.audioCommit = {};
102
112
  if (finalCliArgs.file !== undefined) transformedCliArgs.audioCommit.file = finalCliArgs.file;
103
113
  if (finalCliArgs.keepTemp !== undefined) transformedCliArgs.audioCommit.keepTemp = finalCliArgs.keepTemp;
114
+ if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.audioCommit.openaiReasoning = finalCliArgs.openaiReasoning;
115
+ if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.audioCommit.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
104
116
  }
105
117
  // Nested mappings for 'release' options
106
- if (finalCliArgs.from !== undefined || finalCliArgs.to !== undefined || finalCliArgs.maxDiffBytes !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.noMilestones !== undefined) {
118
+ if (finalCliArgs.from !== undefined || finalCliArgs.to !== undefined || finalCliArgs.maxDiffBytes !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.noMilestones !== undefined || finalCliArgs.openaiReasoning !== undefined || finalCliArgs.openaiMaxOutputTokens !== undefined) {
107
119
  transformedCliArgs.release = {};
108
120
  if (finalCliArgs.from !== undefined) transformedCliArgs.release.from = finalCliArgs.from;
109
121
  if (finalCliArgs.to !== undefined) transformedCliArgs.release.to = finalCliArgs.to;
@@ -112,6 +124,8 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
112
124
  if (finalCliArgs.messageLimit !== undefined) transformedCliArgs.release.messageLimit = finalCliArgs.messageLimit;
113
125
  if (finalCliArgs.maxDiffBytes !== undefined) transformedCliArgs.release.maxDiffBytes = finalCliArgs.maxDiffBytes;
114
126
  if (finalCliArgs.noMilestones !== undefined) transformedCliArgs.release.noMilestones = finalCliArgs.noMilestones;
127
+ if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.release.openaiReasoning = finalCliArgs.openaiReasoning;
128
+ if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.release.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
115
129
  }
116
130
  // Nested mappings for 'publish' options (only when it's actually a publish command or has publish-specific options)
117
131
  if (finalCliArgs.mergeMethod !== undefined || finalCliArgs.targetVersion !== undefined || finalCliArgs.syncTarget !== undefined || finalCliArgs.noMilestones !== undefined || commandName === 'publish' && (finalCliArgs.from !== undefined || finalCliArgs.interactive !== undefined)) {
@@ -156,7 +170,7 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
156
170
  }
157
171
  }
158
172
  // Nested mappings for 'audio-review' options (only when it's not a tree command)
159
- if (commandName !== 'tree' && (finalCliArgs.includeCommitHistory !== undefined || finalCliArgs.includeRecentDiffs !== undefined || finalCliArgs.includeReleaseNotes !== undefined || finalCliArgs.includeGithubIssues !== undefined || finalCliArgs.commitHistoryLimit !== undefined || finalCliArgs.diffHistoryLimit !== undefined || finalCliArgs.releaseNotesLimit !== undefined || finalCliArgs.githubIssuesLimit !== undefined || finalCliArgs.file !== undefined || finalCliArgs.directories !== undefined || finalCliArgs.keepTemp !== undefined)) {
173
+ if (commandName !== 'tree' && (finalCliArgs.includeCommitHistory !== undefined || finalCliArgs.includeRecentDiffs !== undefined || finalCliArgs.includeReleaseNotes !== undefined || finalCliArgs.includeGithubIssues !== undefined || finalCliArgs.commitHistoryLimit !== undefined || finalCliArgs.diffHistoryLimit !== undefined || finalCliArgs.releaseNotesLimit !== undefined || finalCliArgs.githubIssuesLimit !== undefined || finalCliArgs.file !== undefined || finalCliArgs.directories !== undefined || finalCliArgs.keepTemp !== undefined || finalCliArgs.openaiReasoning !== undefined || finalCliArgs.openaiMaxOutputTokens !== undefined)) {
160
174
  transformedCliArgs.audioReview = {};
161
175
  if (finalCliArgs.includeCommitHistory !== undefined) transformedCliArgs.audioReview.includeCommitHistory = finalCliArgs.includeCommitHistory;
162
176
  if (finalCliArgs.includeRecentDiffs !== undefined) transformedCliArgs.audioReview.includeRecentDiffs = finalCliArgs.includeRecentDiffs;
@@ -171,11 +185,15 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
171
185
  if (finalCliArgs.file !== undefined) transformedCliArgs.audioReview.file = finalCliArgs.file;
172
186
  if (finalCliArgs.directory !== undefined) transformedCliArgs.audioReview.directory = finalCliArgs.directory;
173
187
  if (finalCliArgs.keepTemp !== undefined) transformedCliArgs.audioReview.keepTemp = finalCliArgs.keepTemp;
188
+ if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.audioReview.openaiReasoning = finalCliArgs.openaiReasoning;
189
+ if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.audioReview.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
174
190
  }
175
191
  // Nested mappings for 'review' options
176
- if (finalCliArgs.includeCommitHistory !== undefined || finalCliArgs.includeRecentDiffs !== undefined || finalCliArgs.includeReleaseNotes !== undefined || finalCliArgs.includeGithubIssues !== undefined || finalCliArgs.commitHistoryLimit !== undefined || finalCliArgs.diffHistoryLimit !== undefined || finalCliArgs.releaseNotesLimit !== undefined || finalCliArgs.githubIssuesLimit !== undefined || finalCliArgs.context !== undefined || finalCliArgs.sendit !== undefined || finalCliArgs.note !== undefined) {
192
+ if (finalCliArgs.includeCommitHistory !== undefined || finalCliArgs.includeRecentDiffs !== undefined || finalCliArgs.includeReleaseNotes !== undefined || finalCliArgs.includeGithubIssues !== undefined || finalCliArgs.commitHistoryLimit !== undefined || finalCliArgs.diffHistoryLimit !== undefined || finalCliArgs.releaseNotesLimit !== undefined || finalCliArgs.githubIssuesLimit !== undefined || finalCliArgs.context !== undefined || finalCliArgs.sendit !== undefined || finalCliArgs.note !== undefined || finalCliArgs.openaiReasoning !== undefined || finalCliArgs.openaiMaxOutputTokens !== undefined || commandName === 'review' && (finalCliArgs.file !== undefined || finalCliArgs.directory !== undefined)) {
177
193
  transformedCliArgs.review = {};
178
194
  if (finalCliArgs.note !== undefined) transformedCliArgs.review.note = finalCliArgs.note;
195
+ if (commandName === 'review' && finalCliArgs.file !== undefined) transformedCliArgs.review.file = finalCliArgs.file;
196
+ if (commandName === 'review' && finalCliArgs.directory !== undefined) transformedCliArgs.review.directory = finalCliArgs.directory;
179
197
  // Include optional review configuration options if specified
180
198
  if (finalCliArgs.includeCommitHistory !== undefined) transformedCliArgs.review.includeCommitHistory = finalCliArgs.includeCommitHistory;
181
199
  if (finalCliArgs.includeRecentDiffs !== undefined) transformedCliArgs.review.includeRecentDiffs = finalCliArgs.includeRecentDiffs;
@@ -188,6 +206,8 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
188
206
  if (finalCliArgs.context !== undefined) transformedCliArgs.review.context = finalCliArgs.context;
189
207
  if (finalCliArgs.sendit !== undefined) transformedCliArgs.review.sendit = finalCliArgs.sendit;
190
208
  if (finalCliArgs.editorTimeout !== undefined) transformedCliArgs.review.editorTimeout = finalCliArgs.editorTimeout;
209
+ if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.review.openaiReasoning = finalCliArgs.openaiReasoning;
210
+ if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.review.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
191
211
  }
192
212
  // Nested mappings for 'tree' options (add when relevant args present)
193
213
  if (commandName === 'tree') {
@@ -375,7 +395,7 @@ const configure = async (cardigantime)=>{
375
395
  async function getCliConfig(program) {
376
396
  const addSharedOptions = (command)=>{
377
397
  command.option('--dry-run', 'perform a dry run without saving files') // Removed default, will be handled by merging
378
- .option('--verbose', 'enable verbose logging').option('--debug', 'enable debug logging').option('--overrides', 'enable overrides').option('--model <model>', 'OpenAI model to use').option('-d, --context-directories [contextDirectories...]', 'directories to scan for context').option('--config-dir <configDir>', 'configuration directory') // Keep config-dir for specifying location
398
+ .option('--verbose', 'enable verbose logging').option('--debug', 'enable debug logging').option('--overrides', 'enable overrides').option('--model <model>', 'OpenAI model to use').option('--openai-reasoning <level>', 'OpenAI reasoning level (low, medium, high)').option('--openai-max-output-tokens <tokens>', 'OpenAI maximum output tokens', parseInt).option('-d, --context-directories [contextDirectories...]', 'directories to scan for context').option('--config-dir <configDir>', 'configuration directory') // Keep config-dir for specifying location
379
399
  .option('--output-dir <outputDir>', 'output directory for generated files').option('--preferences-dir <preferencesDir>', 'preferences directory for personal settings').option('--excluded-paths [excludedPatterns...]', 'paths to exclude from the diff').option('--keep-temp', 'keep temporary recording files');
380
400
  };
381
401
  // Add global options to the main program
@@ -441,6 +461,14 @@ async function getCliConfig(program) {
441
461
  '--model <model>',
442
462
  'OpenAI model to use'
443
463
  ],
464
+ [
465
+ '--openai-reasoning <level>',
466
+ 'OpenAI reasoning level (low, medium, high)'
467
+ ],
468
+ [
469
+ '--openai-max-output-tokens <tokens>',
470
+ 'OpenAI maximum output tokens'
471
+ ],
444
472
  [
445
473
  '-d, --context-directories [contextDirectories...]',
446
474
  'directories to scan for context'
@@ -479,7 +507,7 @@ async function getCliConfig(program) {
479
507
  addSharedOptions(unlinkCommand);
480
508
  const audioReviewCommand = program.command('audio-review').option('--include-commit-history', 'include recent commit log messages in context (default: true)').option('--no-include-commit-history', 'exclude commit log messages from context').option('--include-recent-diffs', 'include recent commit diffs in context (default: true)').option('--no-include-recent-diffs', 'exclude recent diffs from context').option('--include-release-notes', 'include recent release notes in context (default: false)').option('--no-include-release-notes', 'exclude release notes from context').option('--include-github-issues', 'include open GitHub issues in context (default: true)').option('--no-include-github-issues', 'exclude GitHub issues from context').option('--commit-history-limit <limit>', 'number of recent commits to include', parseInt).option('--diff-history-limit <limit>', 'number of recent commit diffs to include', parseInt).option('--release-notes-limit <limit>', 'number of recent release notes to include', parseInt).option('--github-issues-limit <limit>', 'number of open GitHub issues to include (max 20)', parseInt).option('--context <context>', 'additional context for the audio review').option('--file <file>', 'audio file path').option('--directory <directory>', 'directory containing audio files to process').option('--max-recording-time <time>', 'maximum recording time in seconds', parseInt).option('--sendit', 'Create GitHub issues automatically without confirmation').description('Record audio, transcribe with Whisper, and analyze for project issues using AI');
481
509
  addSharedOptions(audioReviewCommand);
482
- const reviewCommand = program.command('review').argument('[note]', 'review note to analyze for project issues').option('--include-commit-history', 'include recent commit log messages in context (default: true)').option('--no-include-commit-history', 'exclude commit log messages from context').option('--include-recent-diffs', 'include recent commit diffs in context (default: true)').option('--no-include-recent-diffs', 'exclude recent diffs from context').option('--include-release-notes', 'include recent release notes in context (default: false)').option('--no-include-release-notes', 'exclude release notes from context').option('--include-github-issues', 'include open GitHub issues in context (default: true)').option('--no-include-github-issues', 'exclude GitHub issues from context').option('--commit-history-limit <limit>', 'number of recent commits to include', parseInt).option('--diff-history-limit <limit>', 'number of recent commit diffs to include', parseInt).option('--release-notes-limit <limit>', 'number of recent release notes to include', parseInt).option('--github-issues-limit <limit>', 'number of open GitHub issues to include (max 20)', parseInt).option('--context <context>', 'additional context for the review').option('--sendit', 'Create GitHub issues automatically without confirmation').option('--editor-timeout <timeout>', 'timeout for editor in milliseconds (default: no timeout)', parseInt).description('Analyze review note for project issues using AI');
510
+ const reviewCommand = program.command('review').argument('[note]', 'review note to analyze for project issues').option('--include-commit-history', 'include recent commit log messages in context (default: true)').option('--no-include-commit-history', 'exclude commit log messages from context').option('--include-recent-diffs', 'include recent commit diffs in context (default: true)').option('--no-include-recent-diffs', 'exclude recent diffs from context').option('--include-release-notes', 'include recent release notes in context (default: false)').option('--no-include-release-notes', 'exclude release notes from context').option('--include-github-issues', 'include open GitHub issues in context (default: true)').option('--no-include-github-issues', 'exclude GitHub issues from context').option('--commit-history-limit <limit>', 'number of recent commits to include', parseInt).option('--diff-history-limit <limit>', 'number of recent commit diffs to include', parseInt).option('--release-notes-limit <limit>', 'number of recent release notes to include', parseInt).option('--github-issues-limit <limit>', 'number of open GitHub issues to include (max 20)', parseInt).option('--context <context>', 'additional context for the review').option('--file <file>', 'read review note from a file').option('--directory <directory>', 'process all review files in a directory').option('--sendit', 'Create GitHub issues automatically without confirmation').option('--editor-timeout <timeout>', 'timeout for editor in milliseconds (default: no timeout)', parseInt).description('Analyze review note for project issues using AI');
483
511
  addSharedOptions(reviewCommand);
484
512
  // Customize help output for review command
485
513
  reviewCommand.configureHelp({
@@ -495,6 +523,14 @@ async function getCliConfig(program) {
495
523
  [
496
524
  '--context <context>',
497
525
  'additional context for the review'
526
+ ],
527
+ [
528
+ '--file <file>',
529
+ 'read review note from a file'
530
+ ],
531
+ [
532
+ '--directory <directory>',
533
+ 'process all review files in a directory'
498
534
  ]
499
535
  ];
500
536
  const gitContextOptions = [
@@ -574,6 +610,14 @@ async function getCliConfig(program) {
574
610
  '--model <model>',
575
611
  'OpenAI model to use'
576
612
  ],
613
+ [
614
+ '--openai-reasoning <level>',
615
+ 'OpenAI reasoning level (low, medium, high)'
616
+ ],
617
+ [
618
+ '--openai-max-output-tokens <tokens>',
619
+ 'OpenAI maximum output tokens'
620
+ ],
577
621
  [
578
622
  '-d, --context-directories [contextDirectories...]',
579
623
  'directories to scan for context'
@@ -621,9 +665,14 @@ async function getCliConfig(program) {
621
665
  }
622
666
  // Only proceed with command-specific options if validation passed
623
667
  if (ALLOWED_COMMANDS.includes(commandName)) {
624
- if (commandName === 'commit' && commitCommand.opts) {
668
+ if (commandName === 'commit') {
625
669
  commandOptions = commitCommand.opts();
626
670
  // Handle positional argument for direction
671
+ // Try to get direction from program.args (after the command name)
672
+ if (program.args.length > 1) {
673
+ commandOptions.direction = program.args[1];
674
+ }
675
+ // Also try commitCommand.args as fallback
627
676
  const args = commitCommand.args;
628
677
  if (args && args.length > 0 && args[0]) {
629
678
  commandOptions.direction = args[0];
@@ -725,7 +774,7 @@ async function validateAndProcessSecureOptions() {
725
774
  async function validateAndProcessOptions(options) {
726
775
  const contextDirectories = await validateContextDirectories(options.contextDirectories || KODRDRIV_DEFAULTS.contextDirectories);
727
776
  const configDir = options.configDirectory || KODRDRIV_DEFAULTS.configDirectory;
728
- var _options_dryRun, _options_verbose, _options_debug, _options_overrides, _options_model, _options_outputDirectory, _options_preferencesDirectory, _options_discoveredConfigDirs, _options_resolvedConfigDirs, _options_excludedPatterns;
777
+ var _options_dryRun, _options_verbose, _options_debug, _options_overrides, _options_model, _options_openaiReasoning, _options_openaiMaxOutputTokens, _options_outputDirectory, _options_preferencesDirectory, _options_discoveredConfigDirs, _options_resolvedConfigDirs, _options_excludedPatterns;
729
778
  // Skip config directory validation since Cardigantime handles hierarchical lookup
730
779
  // Ensure all required fields are present and have correct types after merging
731
780
  const finalConfig = {
@@ -734,6 +783,8 @@ async function validateAndProcessOptions(options) {
734
783
  debug: (_options_debug = options.debug) !== null && _options_debug !== void 0 ? _options_debug : KODRDRIV_DEFAULTS.debug,
735
784
  overrides: (_options_overrides = options.overrides) !== null && _options_overrides !== void 0 ? _options_overrides : KODRDRIV_DEFAULTS.overrides,
736
785
  model: (_options_model = options.model) !== null && _options_model !== void 0 ? _options_model : KODRDRIV_DEFAULTS.model,
786
+ openaiReasoning: (_options_openaiReasoning = options.openaiReasoning) !== null && _options_openaiReasoning !== void 0 ? _options_openaiReasoning : KODRDRIV_DEFAULTS.openaiReasoning,
787
+ openaiMaxOutputTokens: (_options_openaiMaxOutputTokens = options.openaiMaxOutputTokens) !== null && _options_openaiMaxOutputTokens !== void 0 ? _options_openaiMaxOutputTokens : KODRDRIV_DEFAULTS.openaiMaxOutputTokens,
737
788
  contextDirectories: contextDirectories,
738
789
  configDirectory: configDir,
739
790
  outputDirectory: (_options_outputDirectory = options.outputDirectory) !== null && _options_outputDirectory !== void 0 ? _options_outputDirectory : KODRDRIV_DEFAULTS.outputDirectory,