@eldrforge/kodrdriv 1.2.125 → 1.2.127

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 CHANGED
@@ -21,11 +21,17 @@ npm install -g @eldrforge/kodrdriv
21
21
  ```bash
22
22
  git add .
23
23
  kodrdriv commit
24
+
25
+ # Or use agentic mode for deep analysis
26
+ kodrdriv commit --agentic --self-reflection
24
27
  ```
25
28
 
26
29
  ### Generate Release Notes
27
30
  ```bash
28
31
  kodrdriv release
32
+
33
+ # Or use agentic mode for comprehensive analysis
34
+ kodrdriv release --agentic --self-reflection
29
35
  ```
30
36
 
31
37
  ### Automate Your Release Process
@@ -42,6 +48,11 @@ kodrdriv audio-commit # Record audio to generate commit messages
42
48
  ## Key Features
43
49
 
44
50
  - **AI-Powered Analysis** - Uses OpenAI models to understand your code changes
51
+ - **Agentic Mode (NEW)** - AI-powered tool-calling for deep investigation and analysis
52
+ - 13 specialized tools for release notes generation
53
+ - 8 tools for commit message generation
54
+ - Self-reflection reports with tool effectiveness metrics
55
+ - Configurable iteration limits for complex releases
45
56
  - **GitHub Issues Integration** - Automatically analyzes recently closed issues to provide context for commit messages, prioritizing milestone-relevant issues
46
57
  - **Stop-Context Filtering** - Automatically filters sensitive information from AI-generated content to maintain privacy across projects
47
58
  - **Adaptive Diff Management** - Automatically handles large diffs with intelligent truncation and retry logic to ensure reliable LLM processing
package/dist/arguments.js CHANGED
@@ -81,7 +81,10 @@ z.object({
81
81
  createRetroactiveTags: z.boolean().optional(),
82
82
  workingTagPrefix: z.string().optional(),
83
83
  updateDeps: z.string().optional(),
84
- interProject: z.boolean().optional()
84
+ interProject: z.boolean().optional(),
85
+ agentic: z.boolean().optional(),
86
+ selfReflection: z.boolean().optional(),
87
+ maxAgenticIterations: z.number().optional()
85
88
  });
86
89
  // Function to transform flat CLI args into nested Config structure
87
90
  const transformCliArgs = (finalCliArgs, commandName)=>{
@@ -125,7 +128,7 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
125
128
  }
126
129
  // Nested mappings for 'release' options (only when it's NOT a publish command)
127
130
  if (commandName !== 'publish') {
128
- if (finalCliArgs.from !== undefined || finalCliArgs.to !== undefined || finalCliArgs.maxDiffBytes !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.noMilestones !== undefined || finalCliArgs.openaiReasoning !== undefined || finalCliArgs.openaiMaxOutputTokens !== undefined) {
131
+ if (finalCliArgs.from !== undefined || finalCliArgs.to !== undefined || finalCliArgs.maxDiffBytes !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.noMilestones !== undefined || finalCliArgs.openaiReasoning !== undefined || finalCliArgs.openaiMaxOutputTokens !== undefined || finalCliArgs.agentic !== undefined || finalCliArgs.selfReflection !== undefined || finalCliArgs.maxAgenticIterations !== undefined) {
129
132
  transformedCliArgs.release = {};
130
133
  if (finalCliArgs.from !== undefined) transformedCliArgs.release.from = finalCliArgs.from;
131
134
  if (finalCliArgs.to !== undefined) transformedCliArgs.release.to = finalCliArgs.to;
@@ -136,10 +139,13 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
136
139
  if (finalCliArgs.noMilestones !== undefined) transformedCliArgs.release.noMilestones = finalCliArgs.noMilestones;
137
140
  if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.release.openaiReasoning = finalCliArgs.openaiReasoning;
138
141
  if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.release.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
142
+ if (finalCliArgs.agentic !== undefined) transformedCliArgs.release.agentic = finalCliArgs.agentic;
143
+ if (finalCliArgs.selfReflection !== undefined) transformedCliArgs.release.selfReflection = finalCliArgs.selfReflection;
144
+ if (finalCliArgs.maxAgenticIterations !== undefined) transformedCliArgs.release.maxAgenticIterations = finalCliArgs.maxAgenticIterations;
139
145
  }
140
146
  }
141
147
  // Nested mappings for 'publish' options – map whenever publish-specific options are provided
142
- if (finalCliArgs.mergeMethod !== undefined || finalCliArgs.targetVersion !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.syncTarget !== undefined || finalCliArgs.skipAlreadyPublished !== undefined || finalCliArgs.forceRepublish !== undefined || commandName === 'publish' && (finalCliArgs.from !== undefined || finalCliArgs.noMilestones !== undefined)) {
148
+ if (finalCliArgs.mergeMethod !== undefined || finalCliArgs.targetVersion !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.syncTarget !== undefined || finalCliArgs.skipAlreadyPublished !== undefined || finalCliArgs.forceRepublish !== undefined || commandName === 'publish' && (finalCliArgs.from !== undefined || finalCliArgs.noMilestones !== undefined || finalCliArgs.agentic !== undefined || finalCliArgs.selfReflection !== undefined || finalCliArgs.maxAgenticIterations !== undefined)) {
143
149
  transformedCliArgs.publish = {};
144
150
  if (finalCliArgs.mergeMethod !== undefined) transformedCliArgs.publish.mergeMethod = finalCliArgs.mergeMethod;
145
151
  if ((commandName === 'publish' || finalCliArgs.mergeMethod !== undefined || finalCliArgs.targetVersion !== undefined || finalCliArgs.syncTarget !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.skipAlreadyPublished !== undefined || finalCliArgs.forceRepublish !== undefined) && finalCliArgs.from !== undefined) transformedCliArgs.publish.from = finalCliArgs.from;
@@ -150,6 +156,21 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
150
156
  if (finalCliArgs.forceRepublish !== undefined) transformedCliArgs.publish.forceRepublish = finalCliArgs.forceRepublish;
151
157
  if ((commandName === 'publish' || finalCliArgs.mergeMethod !== undefined || finalCliArgs.targetVersion !== undefined || finalCliArgs.syncTarget !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.skipAlreadyPublished !== undefined || finalCliArgs.forceRepublish !== undefined) && finalCliArgs.noMilestones !== undefined) transformedCliArgs.publish.noMilestones = finalCliArgs.noMilestones;
152
158
  if (finalCliArgs.updateDeps !== undefined) transformedCliArgs.publish.updateDeps = finalCliArgs.updateDeps;
159
+ // Map release-related flags from publish command into release config (only if any are set)
160
+ if (commandName === 'publish' && (finalCliArgs.agentic !== undefined || finalCliArgs.selfReflection !== undefined || finalCliArgs.maxAgenticIterations !== undefined)) {
161
+ transformedCliArgs.release = {
162
+ ...transformedCliArgs.release || {},
163
+ ...finalCliArgs.agentic !== undefined ? {
164
+ agentic: finalCliArgs.agentic
165
+ } : {},
166
+ ...finalCliArgs.selfReflection !== undefined ? {
167
+ selfReflection: finalCliArgs.selfReflection
168
+ } : {},
169
+ ...finalCliArgs.maxAgenticIterations !== undefined ? {
170
+ maxAgenticIterations: finalCliArgs.maxAgenticIterations
171
+ } : {}
172
+ };
173
+ }
153
174
  }
154
175
  // Nested mappings for 'development' options
155
176
  if (commandName === 'development' && (finalCliArgs.targetVersion !== undefined || finalCliArgs.noMilestones !== undefined || finalCliArgs.tagWorkingBranch !== undefined || finalCliArgs.createRetroactiveTags !== undefined || finalCliArgs.workingTagPrefix !== undefined)) {
@@ -655,9 +676,9 @@ async function getCliConfig(program, commands) {
655
676
  });
656
677
  const audioCommitCommand = program.command('audio-commit').option('--cached', 'use cached diff').option('--add', 'add all changes before committing').option('--sendit', 'Commit with the message generated. No review.').option('--direction <direction>', 'direction or guidance for the commit message').option('--message-limit <messageLimit>', 'limit the number of messages to generate').option('--file <file>', 'audio file path').description('Record audio to provide context, then generate and optionally commit with AI-generated message');
657
678
  addSharedOptions(audioCommitCommand);
658
- const releaseCommand = program.command('release').option('--from <from>', 'branch to generate release notes from').option('--to <to>', 'branch to generate release notes to').option('--context <context>', 'context for the commit message').option('--interactive', 'Present release notes for interactive review and editing').option('--max-diff-bytes <maxDiffBytes>', 'maximum bytes per file in diff (default: 2048)').option('--no-milestones', 'disable GitHub milestone integration').option('--from-main', 'force comparison against main branch instead of previous release tag').description('Generate release notes');
679
+ const releaseCommand = program.command('release').option('--from <from>', 'branch to generate release notes from').option('--to <to>', 'branch to generate release notes to').option('--context <context>', 'context for the commit message').option('--interactive', 'Present release notes for interactive review and editing').option('--max-diff-bytes <maxDiffBytes>', 'maximum bytes per file in diff (default: 2048)').option('--no-milestones', 'disable GitHub milestone integration').option('--from-main', 'force comparison against main branch instead of previous release tag').option('--agentic', 'use agentic mode with tool-calling for release notes generation').option('--self-reflection', 'generate self-reflection report with tool effectiveness analysis').option('--max-agentic-iterations <maxAgenticIterations>', 'maximum iterations for agentic mode (default: 30)', parseInt).description('Generate release notes');
659
680
  addSharedOptions(releaseCommand);
660
- const publishCommand = program.command('publish').option('--merge-method <method>', 'method to merge PR (merge, squash, rebase)', 'squash').option('--from <from>', 'branch/tag to generate release notes from (default: previous release tag)').option('--target-version <targetVersion>', 'target version for release (explicit version like "4.30.0" or semantic bump: "patch", "minor", "major")').option('--interactive', 'present release notes for interactive review and editing').option('--sendit', 'skip all confirmation prompts and proceed automatically').option('--sync-target', 'attempt to automatically sync target branch with remote before publishing').option('--skip-already-published', 'skip packages that are already published at target version on npm').option('--force-republish', 'delete existing tags and force republish even if tag exists').option('--no-milestones', 'disable GitHub milestone integration').option('--from-main', 'force comparison against main branch instead of previous release tag').option('--update-deps <scope>', 'update inter-project dependencies before publish (e.g., --update-deps @fjell)').description('Publish a release');
681
+ const publishCommand = program.command('publish').option('--merge-method <method>', 'method to merge PR (merge, squash, rebase)', 'squash').option('--from <from>', 'branch/tag to generate release notes from (default: previous release tag)').option('--target-version <targetVersion>', 'target version for release (explicit version like "4.30.0" or semantic bump: "patch", "minor", "major")').option('--interactive', 'present release notes for interactive review and editing').option('--sendit', 'skip all confirmation prompts and proceed automatically').option('--sync-target', 'attempt to automatically sync target branch with remote before publishing').option('--skip-already-published', 'skip packages that are already published at target version on npm').option('--force-republish', 'delete existing tags and force republish even if tag exists').option('--no-milestones', 'disable GitHub milestone integration').option('--from-main', 'force comparison against main branch instead of previous release tag').option('--update-deps <scope>', 'update inter-project dependencies before publish (e.g., --update-deps @fjell)').option('--agentic', 'use agentic mode with tool-calling for release notes generation').option('--self-reflection', 'generate self-reflection report with tool effectiveness analysis').option('--max-agentic-iterations <maxAgenticIterations>', 'maximum iterations for agentic mode (default: 30)', parseInt).description('Publish a release');
661
682
  addSharedOptions(publishCommand);
662
683
  const treeCommand = program.command('tree [command] [packageArgument]').option('--directory <directory>', 'target directory containing multiple packages (defaults to current directory)').option('--directories [directories...]', 'target directories containing multiple packages (defaults to current directory)').option('--start-from <startFrom>', 'resume execution from this package directory name (useful for restarting failed builds)').option('--stop-at <stopAt>', 'stop execution at this package directory name (the specified package will not be executed)').option('--cmd <cmd>', 'shell command to execute in each package directory (e.g., "npm install", "git status")')// Parallel Execution Options
663
684
  .option('--parallel', 'execute packages in parallel when dependencies allow (packages with no interdependencies run simultaneously)').option('--max-concurrency <number>', 'maximum number of packages to execute concurrently (default: number of CPU cores)', parseInt).option('--max-retries <number>', 'maximum retry attempts for failed packages (default: 3)', parseInt).option('--retry-delay <ms>', 'initial retry delay in milliseconds (default: 5000)', parseInt)// Recovery & Status Options