@eldrforge/kodrdriv 1.2.132 → 1.2.133

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
@@ -2,6 +2,12 @@
2
2
 
3
3
  KodrDriv is an AI-powered Git workflow automation tool that generates intelligent commit messages and release notes from your code changes. It analyzes your repository to create meaningful documentation while automating the entire release process.
4
4
 
5
+ ## 🤖 For AI Assistants
6
+
7
+ **Complete AI Guide**: [`AI-GUIDE.md`](AI-GUIDE.md) - Comprehensive documentation for AI assistants helping with kodrdriv
8
+
9
+ **Quick Start**: [`guide/index.md`](guide/index.md) - Navigation hub for all guides
10
+
5
11
  ## Why KodrDriv?
6
12
 
7
13
  Writing good commit messages and release notes is time-consuming and often done when you're least in the mood for reflection. **KodrDriv was created specifically to solve the "context switch" problem** that happens when you've been deep in code and Git asks you to summarize what you've done.
@@ -22,16 +28,19 @@ npm install -g @eldrforge/kodrdriv
22
28
  git add .
23
29
  kodrdriv commit
24
30
 
25
- # Or use agentic mode for deep analysis
26
- kodrdriv commit --agentic --self-reflection
31
+ # With detailed analysis report
32
+ kodrdriv commit --self-reflection
33
+
34
+ # With context files
35
+ kodrdriv commit --context-files IMPLEMENTATION.md --sendit
27
36
  ```
28
37
 
29
38
  ### Generate Release Notes
30
39
  ```bash
31
40
  kodrdriv release
32
41
 
33
- # Or use agentic mode for comprehensive analysis
34
- kodrdriv release --agentic --self-reflection
42
+ # With context and analysis
43
+ kodrdriv release --context-files CHANGELOG.md --self-reflection
35
44
  ```
36
45
 
37
46
  ### Automate Your Release Process
@@ -47,12 +56,14 @@ kodrdriv audio-commit # Record audio to generate commit messages
47
56
 
48
57
  ## Key Features
49
58
 
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
59
+ - **AI-Powered Analysis** - Uses OpenAI models with tool-calling for deep investigation
60
+ - Always-on agentic mode for intelligent analysis
52
61
  - 13 specialized tools for release notes generation
53
62
  - 8 tools for commit message generation
54
63
  - Self-reflection reports with tool effectiveness metrics
55
64
  - Configurable iteration limits for complex releases
65
+ - **Context Files (NEW)** - Pass documentation files as context for better AI understanding
66
+ - **Human-Readable Output** - Professional tone without AI slop, emojis, or marketing speak
56
67
  - **GitHub Issues Integration** - Automatically analyzes recently closed issues to provide context for commit messages, prioritizing milestone-relevant issues
57
68
  - **Stop-Context Filtering** - Automatically filters sensitive information from AI-generated content to maintain privacy across projects
58
69
  - **Adaptive Diff Management** - Automatically handles large diffs with intelligent truncation and retry logic to ensure reliable LLM processing
@@ -79,6 +90,24 @@ kodrdriv --check-config
79
90
 
80
91
  📚 **Comprehensive Documentation**
81
92
 
93
+ ### 🤖 AI-Friendly Guides
94
+
95
+ **NEW**: Complete guide system designed for AI assistants and developers:
96
+ - **[AI Guide (Master)](AI-GUIDE.md)** - Complete reference for AI assistants
97
+ - **[Guide Directory](guide/)** - 13 focused guides covering everything
98
+ - [Quick Start](guide/quickstart.md) - 5-minute setup
99
+ - [Integration](guide/integration.md) - Add to your project
100
+ - [Usage](guide/usage.md) - Common workflows
101
+ - [Commands](guide/commands.md) - Quick reference
102
+ - [Configuration](guide/configuration.md) - All options
103
+ - [AI System](guide/ai-system.md) - How AI works
104
+ - [Debugging](guide/debugging.md) - Troubleshooting
105
+ - [Architecture](guide/architecture.md) - System design
106
+ - [Development](guide/development.md) - Extend kodrdriv
107
+ - [Testing](guide/testing.md) - Test suite
108
+ - [Tree Operations](guide/tree-operations.md) - Multi-package
109
+ - [Monorepo](guide/monorepo.md) - Monorepo workflows
110
+
82
111
  ### Commands
83
112
  - **[All Commands Overview](docs/public/commands.md)** - Complete command reference with examples
84
113
  - **[commit](docs/public/commands/commit.md)** - Generate intelligent commit messages
package/dist/arguments.js CHANGED
@@ -38,6 +38,7 @@ z.object({
38
38
  excludedPaths: z.array(z.string()).optional(),
39
39
  exclude: z.array(z.string()).optional(),
40
40
  context: z.string().optional(),
41
+ contextFiles: z.array(z.string()).optional(),
41
42
  note: z.string().optional(),
42
43
  direction: z.string().optional(),
43
44
  messageLimit: z.number().optional(),
@@ -82,7 +83,6 @@ z.object({
82
83
  workingTagPrefix: z.string().optional(),
83
84
  updateDeps: z.string().optional(),
84
85
  interProject: z.boolean().optional(),
85
- agentic: z.boolean().optional(),
86
86
  selfReflection: z.boolean().optional(),
87
87
  maxAgenticIterations: z.number().optional()
88
88
  });
@@ -128,7 +128,7 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
128
128
  }
129
129
  // Nested mappings for 'release' options (only when it's NOT a publish command)
130
130
  if (commandName !== 'publish') {
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) {
131
+ if (finalCliArgs.from !== undefined || finalCliArgs.to !== undefined || finalCliArgs.maxDiffBytes !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.noMilestones !== undefined || finalCliArgs.openaiReasoning !== undefined || finalCliArgs.openaiMaxOutputTokens !== undefined || finalCliArgs.selfReflection !== undefined || finalCliArgs.maxAgenticIterations !== undefined) {
132
132
  transformedCliArgs.release = {};
133
133
  if (finalCliArgs.from !== undefined) transformedCliArgs.release.from = finalCliArgs.from;
134
134
  if (finalCliArgs.to !== undefined) transformedCliArgs.release.to = finalCliArgs.to;
@@ -139,13 +139,12 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
139
139
  if (finalCliArgs.noMilestones !== undefined) transformedCliArgs.release.noMilestones = finalCliArgs.noMilestones;
140
140
  if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.release.openaiReasoning = finalCliArgs.openaiReasoning;
141
141
  if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.release.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
142
- if (finalCliArgs.agentic !== undefined) transformedCliArgs.release.agentic = finalCliArgs.agentic;
143
142
  if (finalCliArgs.selfReflection !== undefined) transformedCliArgs.release.selfReflection = finalCliArgs.selfReflection;
144
143
  if (finalCliArgs.maxAgenticIterations !== undefined) transformedCliArgs.release.maxAgenticIterations = finalCliArgs.maxAgenticIterations;
145
144
  }
146
145
  }
147
146
  // Nested mappings for 'publish' options – map whenever publish-specific options are provided
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)) {
147
+ 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.selfReflection !== undefined || finalCliArgs.maxAgenticIterations !== undefined)) {
149
148
  transformedCliArgs.publish = {};
150
149
  if (finalCliArgs.mergeMethod !== undefined) transformedCliArgs.publish.mergeMethod = finalCliArgs.mergeMethod;
151
150
  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;
@@ -157,12 +156,9 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
157
156
  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;
158
157
  if (finalCliArgs.updateDeps !== undefined) transformedCliArgs.publish.updateDeps = finalCliArgs.updateDeps;
159
158
  // 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)) {
159
+ if (commandName === 'publish' && (finalCliArgs.selfReflection !== undefined || finalCliArgs.maxAgenticIterations !== undefined)) {
161
160
  transformedCliArgs.release = {
162
161
  ...transformedCliArgs.release || {},
163
- ...finalCliArgs.agentic !== undefined ? {
164
- agentic: finalCliArgs.agentic
165
- } : {},
166
162
  ...finalCliArgs.selfReflection !== undefined ? {
167
163
  selfReflection: finalCliArgs.selfReflection
168
164
  } : {},
@@ -273,6 +269,32 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
273
269
  if (commandName === 'tree') {
274
270
  const builtInCommand = finalCliArgs.builtInCommand;
275
271
  const packageArgument = finalCliArgs.packageArgument;
272
+ // Map command-specific options to nested configs for tree operations
273
+ // When tree commit/release/publish is run, these options get forwarded
274
+ if (builtInCommand === 'commit' && finalCliArgs.contextFiles !== undefined) {
275
+ if (!transformedCliArgs.commit) transformedCliArgs.commit = {};
276
+ transformedCliArgs.commit.contextFiles = finalCliArgs.contextFiles;
277
+ }
278
+ if (builtInCommand === 'commit' && finalCliArgs.selfReflection !== undefined) {
279
+ if (!transformedCliArgs.commit) transformedCliArgs.commit = {};
280
+ transformedCliArgs.commit.selfReflection = finalCliArgs.selfReflection;
281
+ }
282
+ if (builtInCommand === 'commit' && finalCliArgs.maxAgenticIterations !== undefined) {
283
+ if (!transformedCliArgs.commit) transformedCliArgs.commit = {};
284
+ transformedCliArgs.commit.maxAgenticIterations = finalCliArgs.maxAgenticIterations;
285
+ }
286
+ if ((builtInCommand === 'release' || builtInCommand === 'publish') && finalCliArgs.contextFiles !== undefined) {
287
+ if (!transformedCliArgs.release) transformedCliArgs.release = {};
288
+ transformedCliArgs.release.contextFiles = finalCliArgs.contextFiles;
289
+ }
290
+ if ((builtInCommand === 'release' || builtInCommand === 'publish') && finalCliArgs.selfReflection !== undefined) {
291
+ if (!transformedCliArgs.release) transformedCliArgs.release = {};
292
+ transformedCliArgs.release.selfReflection = finalCliArgs.selfReflection;
293
+ }
294
+ if ((builtInCommand === 'release' || builtInCommand === 'publish') && finalCliArgs.maxAgenticIterations !== undefined) {
295
+ if (!transformedCliArgs.release) transformedCliArgs.release = {};
296
+ transformedCliArgs.release.maxAgenticIterations = finalCliArgs.maxAgenticIterations;
297
+ }
276
298
  // Only create tree object if there are actual tree-specific options
277
299
  const cliArgs = finalCliArgs;
278
300
  if (finalCliArgs.directories !== undefined || finalCliArgs.directory !== undefined || finalCliArgs.startFrom !== undefined || finalCliArgs.stopAt !== undefined || finalCliArgs.cmd !== undefined || builtInCommand !== undefined || finalCliArgs.continue !== undefined || packageArgument !== undefined || finalCliArgs.cleanNodeModules !== undefined || finalCliArgs.externals !== undefined || cliArgs.statusParallel !== undefined || cliArgs.auditBranches !== undefined || cliArgs.parallel !== undefined || cliArgs.markCompleted !== undefined || cliArgs.skip !== undefined || cliArgs.retryFailed !== undefined || cliArgs.skipFailed !== undefined || cliArgs.validateState !== undefined) {
@@ -548,7 +570,7 @@ async function getCliConfig(program, commands) {
548
570
  // Add global options to the main program
549
571
  // (cardigantime already adds most global options like --verbose, --debug, --config-dir)
550
572
  // Add subcommands
551
- const commitCommand = program.command('commit').argument('[direction]', 'direction or guidance for the commit message').description('Generate commit notes').option('--context <context>', 'context for the commit message').option('--cached', 'use cached diff').option('--add', 'add all changes before committing').option('--sendit', 'Commit with the message generated. No review.').option('--interactive', 'Present commit message for interactive review and editing').option('--amend', 'Amend the last commit with the generated message').option('--push [remote]', 'push to remote after committing (default: origin)').option('--message-limit <messageLimit>', 'limit the number of messages to generate').option('--skip-file-check', 'skip check for file: dependencies before committing').option('--max-diff-bytes <maxDiffBytes>', 'maximum bytes per file in diff (default: 2048)').option('--agentic', 'use agentic mode with tool-calling for commit message generation').option('--self-reflection', 'generate self-reflection report with tool effectiveness analysis').option('--max-agentic-iterations <iterations>', 'maximum iterations for agentic mode (default: 10)', parseInt).option('--allow-commit-splitting', 'allow agentic mode to suggest splitting commits').option('--tool-timeout <timeout>', 'timeout for tool execution in milliseconds', parseInt);
573
+ const commitCommand = program.command('commit').argument('[direction]', 'direction or guidance for the commit message').description('Generate commit notes').option('--context <context>', 'context for the commit message').option('--context-files [contextFiles...]', 'files containing additional context for the commit message').option('--cached', 'use cached diff').option('--add', 'add all changes before committing').option('--sendit', 'Commit with the message generated. No review.').option('--interactive', 'Present commit message for interactive review and editing').option('--amend', 'Amend the last commit with the generated message').option('--push [remote]', 'push to remote after committing (default: origin)').option('--message-limit <messageLimit>', 'limit the number of messages to generate').option('--skip-file-check', 'skip check for file: dependencies before committing').option('--max-diff-bytes <maxDiffBytes>', 'maximum bytes per file in diff (default: 2048)').option('--self-reflection', 'generate self-reflection report with tool effectiveness analysis').option('--max-agentic-iterations <iterations>', 'maximum iterations for analysis (default: 10)', parseInt).option('--allow-commit-splitting', 'allow AI to suggest splitting commits').option('--tool-timeout <timeout>', 'timeout for tool execution in milliseconds', parseInt);
552
574
  // Add shared options to commit command
553
575
  addSharedOptions(commitCommand);
554
576
  // Customize help output for commit command
@@ -559,6 +581,10 @@ async function getCliConfig(program, commands) {
559
581
  [
560
582
  '--context <context>',
561
583
  'context for the commit message'
584
+ ],
585
+ [
586
+ '--context-files [contextFiles...]',
587
+ 'files containing additional context'
562
588
  ]
563
589
  ];
564
590
  const behavioralOptions = [
@@ -599,22 +625,18 @@ async function getCliConfig(program, commands) {
599
625
  'maximum bytes per file in diff (default: 20480)'
600
626
  ]
601
627
  ];
602
- const agenticOptions = [
603
- [
604
- '--agentic',
605
- 'use agentic mode with tool-calling for commit generation'
606
- ],
628
+ const aiOptions = [
607
629
  [
608
630
  '--self-reflection',
609
631
  'generate self-reflection report with tool effectiveness analysis'
610
632
  ],
611
633
  [
612
634
  '--max-agentic-iterations <iterations>',
613
- 'maximum iterations for agentic mode (default: 10)'
635
+ 'maximum iterations for AI analysis (default: 10)'
614
636
  ],
615
637
  [
616
638
  '--allow-commit-splitting',
617
- 'allow agentic mode to suggest splitting commits'
639
+ 'allow AI to suggest splitting commits'
618
640
  ],
619
641
  [
620
642
  '--tool-timeout <timeout>',
@@ -671,20 +693,21 @@ async function getCliConfig(program, commands) {
671
693
  const maxWidth = Math.max(...options.map(([flag])=>flag.length));
672
694
  return `${title}:\n` + options.map(([flag, desc])=>` ${flag.padEnd(maxWidth + 2)} ${desc}`).join('\n') + '\n';
673
695
  };
674
- return nameAndVersion + '\n' + formatOptionsSection('Commit Message Options', commitOptions) + '\n' + formatOptionsSection('Behavioral Options', behavioralOptions) + '\n' + formatOptionsSection('Agentic Mode Options', agenticOptions) + '\n' + formatOptionsSection('Global Options', globalOptions) + '\n' + 'Environment Variables:\n' + ' OPENAI_API_KEY OpenAI API key (required)\n';
696
+ return nameAndVersion + '\n' + formatOptionsSection('Commit Message Options', commitOptions) + '\n' + formatOptionsSection('Behavioral Options', behavioralOptions) + '\n' + formatOptionsSection('AI Options', aiOptions) + '\n' + formatOptionsSection('Global Options', globalOptions) + '\n' + 'Environment Variables:\n' + ' OPENAI_API_KEY OpenAI API key (required)\n';
675
697
  }
676
698
  });
677
699
  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');
678
700
  addSharedOptions(audioCommitCommand);
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');
701
+ 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('--context-files [contextFiles...]', 'files containing additional context for release notes').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('--self-reflection', 'generate self-reflection report with tool effectiveness analysis').option('--max-agentic-iterations <maxAgenticIterations>', 'maximum iterations for analysis (default: 30)', parseInt).description('Generate release notes');
680
702
  addSharedOptions(releaseCommand);
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).option('--agentic-publish', 'use AI agent to automatically diagnose and fix publish issues').option('--agentic-publish-max-iterations <agenticPublishMaxIterations>', 'maximum iterations for agentic publish (default: 10)', parseInt).description('Publish a release');
703
+ 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('--context-files [contextFiles...]', 'files containing additional context for release notes').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('--self-reflection', 'generate self-reflection report with tool effectiveness analysis').option('--max-agentic-iterations <maxAgenticIterations>', 'maximum iterations for analysis (default: 30)', parseInt).option('--agentic-publish', 'use AI agent to automatically diagnose and fix publish issues').option('--agentic-publish-max-iterations <agenticPublishMaxIterations>', 'maximum iterations for agentic publish (default: 10)', parseInt).description('Publish a release');
682
704
  addSharedOptions(publishCommand);
683
705
  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
684
706
  .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
685
707
  .option('--continue', 'continue from previous tree publish execution using saved checkpoint state').option('--status', 'check status of running tree publish processes').option('--status-parallel', 'show detailed parallel execution status with package states, timing, and errors').option('--audit-branches', 'audit git branch state across all packages (checks branch consistency, merge conflicts with target, existing PRs, sync status, unpushed commits)').option('--promote <packageName>', 'mark a package as completed in the execution context (useful for recovery after timeouts)').option('--mark-completed <packages>', 'mark packages as completed using directory names (comma-separated, for recovery)').option('--skip <packages>', 'skip packages and their dependents (comma-separated)').option('--retry-failed', 'retry all previously failed packages from checkpoint').option('--skip-failed', 'skip failed packages and continue with remaining packages').option('--validate-state', 'validate checkpoint state integrity before continuing')// Package Filtering
686
708
  .option('--excluded-patterns [excludedPatterns...]', 'patterns to exclude packages from processing (e.g., "**/node_modules/**", "dist/*")')// Link/Unlink Options
687
- .option('--clean-node-modules', 'for unlink command: remove node_modules and package-lock.json, then reinstall dependencies').description(`Analyze package dependencies in workspace and execute commands in dependency order.
709
+ .option('--clean-node-modules', 'for unlink command: remove node_modules and package-lock.json, then reinstall dependencies')// Command-specific options (forwarded to commit/release/publish)
710
+ .option('--context-files [contextFiles...]', 'files containing additional context (forwarded to commit/release/publish)').option('--self-reflection', 'generate self-reflection report (forwarded to commit/release/publish)').option('--max-agentic-iterations <iterations>', 'maximum iterations for AI analysis (forwarded to commit/release/publish)', parseInt).description(`Analyze package dependencies in workspace and execute commands in dependency order.
688
711
 
689
712
  Built-in commands:
690
713
  commit - Run 'kodrdriv commit' in each package
@@ -697,8 +720,18 @@ Built-in commands:
697
720
  run - Execute custom shell command (use --cmd)
698
721
  checkout - Checkout specified branch in all packages
699
722
 
723
+ Command-specific options:
724
+ You can pass any commit, release, or publish options and they will be forwarded.
725
+ Examples: --context-files, --sendit, --interactive, --self-reflection
726
+
727
+ For commit options: kodrdriv commit --help
728
+ For release options: kodrdriv release --help
729
+ For publish options: kodrdriv publish --help
730
+
700
731
  Examples:
701
- kodrdriv tree publish --parallel --model "gpt-5-mini"
732
+ kodrdriv tree commit --context-files IMPL.md --sendit
733
+ kodrdriv tree publish --parallel --context-files RELEASE.md
734
+ kodrdriv tree publish --parallel --model "gpt-4o" --self-reflection
702
735
  kodrdriv tree --cmd "npm test"
703
736
  kodrdriv tree publish --continue --retry-failed
704
737
  kodrdriv tree publish --audit-branches