@eldrforge/kodrdriv 0.0.51 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +3 -1
  2. package/dist/application.js +29 -5
  3. package/dist/application.js.map +1 -1
  4. package/dist/arguments.js +187 -75
  5. package/dist/arguments.js.map +1 -1
  6. package/dist/commands/audio-commit.js +35 -14
  7. package/dist/commands/audio-commit.js.map +1 -1
  8. package/dist/commands/audio-review.js +41 -20
  9. package/dist/commands/audio-review.js.map +1 -1
  10. package/dist/commands/clean.js +2 -2
  11. package/dist/commands/clean.js.map +1 -1
  12. package/dist/commands/commit.js +369 -47
  13. package/dist/commands/commit.js.map +1 -1
  14. package/dist/commands/development.js +264 -0
  15. package/dist/commands/development.js.map +1 -0
  16. package/dist/commands/link.js +357 -182
  17. package/dist/commands/link.js.map +1 -1
  18. package/dist/commands/publish.js +419 -306
  19. package/dist/commands/publish.js.map +1 -1
  20. package/dist/commands/release.js +240 -18
  21. package/dist/commands/release.js.map +1 -1
  22. package/dist/commands/review.js +56 -40
  23. package/dist/commands/review.js.map +1 -1
  24. package/dist/commands/select-audio.js +4 -4
  25. package/dist/commands/select-audio.js.map +1 -1
  26. package/dist/commands/tree.js +779 -40
  27. package/dist/commands/tree.js.map +1 -1
  28. package/dist/commands/unlink.js +267 -372
  29. package/dist/commands/unlink.js.map +1 -1
  30. package/dist/commands/versions.js +224 -0
  31. package/dist/commands/versions.js.map +1 -0
  32. package/dist/constants.js +50 -12
  33. package/dist/constants.js.map +1 -1
  34. package/dist/content/diff.js +122 -1
  35. package/dist/content/diff.js.map +1 -1
  36. package/dist/content/files.js +192 -0
  37. package/dist/content/files.js.map +1 -0
  38. package/dist/content/issues.js +17 -46
  39. package/dist/content/issues.js.map +1 -1
  40. package/dist/content/log.js +16 -0
  41. package/dist/content/log.js.map +1 -1
  42. package/dist/logging.js +3 -3
  43. package/dist/logging.js.map +1 -1
  44. package/dist/main.js +0 -0
  45. package/dist/prompt/commit.js +11 -4
  46. package/dist/prompt/commit.js.map +1 -1
  47. package/dist/prompt/instructions/commit.md +20 -2
  48. package/dist/prompt/instructions/release.md +27 -10
  49. package/dist/prompt/instructions/review.md +75 -8
  50. package/dist/prompt/release.js +15 -7
  51. package/dist/prompt/release.js.map +1 -1
  52. package/dist/prompt/review.js +2 -2
  53. package/dist/prompt/review.js.map +1 -1
  54. package/dist/types.js +36 -7
  55. package/dist/types.js.map +1 -1
  56. package/dist/util/child.js +146 -4
  57. package/dist/util/child.js.map +1 -1
  58. package/dist/util/countdown.js +215 -0
  59. package/dist/util/countdown.js.map +1 -0
  60. package/dist/util/general.js +157 -13
  61. package/dist/util/general.js.map +1 -1
  62. package/dist/util/git.js +587 -0
  63. package/dist/util/git.js.map +1 -0
  64. package/dist/util/github.js +531 -11
  65. package/dist/util/github.js.map +1 -1
  66. package/dist/util/interactive.js +463 -0
  67. package/dist/util/interactive.js.map +1 -0
  68. package/dist/util/openai.js +152 -25
  69. package/dist/util/openai.js.map +1 -1
  70. package/dist/util/performance.js +5 -73
  71. package/dist/util/performance.js.map +1 -1
  72. package/dist/util/safety.js +4 -4
  73. package/dist/util/safety.js.map +1 -1
  74. package/dist/util/storage.js +30 -3
  75. package/dist/util/storage.js.map +1 -1
  76. package/dist/util/validation.js +1 -25
  77. package/dist/util/validation.js.map +1 -1
  78. package/package.json +12 -10
  79. package/test-increment.js +0 -0
  80. package/test-multiline/cli/package.json +8 -0
  81. package/test-multiline/core/package.json +5 -0
  82. package/test-multiline/mobile/package.json +8 -0
  83. package/test-multiline/web/package.json +8 -0
  84. package/dist/util/npmOptimizations.js +0 -174
  85. package/dist/util/npmOptimizations.js.map +0 -1
package/README.md CHANGED
@@ -42,9 +42,11 @@ kodrdriv audio-commit # Record audio to generate commit messages
42
42
  ## Key Features
43
43
 
44
44
  - **AI-Powered Analysis** - Uses OpenAI models to understand your code changes
45
+ - **GitHub Issues Integration** - Automatically analyzes recently closed issues to provide context for commit messages, prioritizing milestone-relevant issues
46
+ - **Adaptive Diff Management** - Automatically handles large diffs with intelligent truncation and retry logic to ensure reliable LLM processing
45
47
  - **Comprehensive Release Automation** - Handles dependency updates, version bumping, PR creation, and GitHub releases
46
48
  - **Audio-Driven Workflows** - Record audio to provide context for commits and reviews
47
- - **Intelligent Workspace Management** - Automatically discovers and links related packages in monorepos
49
+ - **Intelligent Workspace Management** - Provides tools for linking and managing related packages in monorepos
48
50
  - **Flexible Configuration** - Hierarchical configuration with command-line overrides
49
51
 
50
52
  ## Configuration
@@ -12,11 +12,24 @@ import { execute as execute$2 } from './commands/release.js';
12
12
  import { execute as execute$9 } from './commands/review.js';
13
13
  import { execute as execute$a } from './commands/select-audio.js';
14
14
  import { execute as execute$6 } from './commands/unlink.js';
15
- import { DEFAULT_CONFIG_DIR, COMMAND_CHECK_CONFIG, COMMAND_INIT_CONFIG, COMMAND_COMMIT, COMMAND_AUDIO_COMMIT, COMMAND_RELEASE, COMMAND_PUBLISH, COMMAND_TREE, COMMAND_LINK, COMMAND_UNLINK, COMMAND_AUDIO_REVIEW, COMMAND_CLEAN, COMMAND_REVIEW, COMMAND_SELECT_AUDIO } from './constants.js';
15
+ import { execute as execute$b } from './commands/development.js';
16
+ import { execute as execute$c } from './commands/versions.js';
17
+ import { DEFAULT_CONFIG_DIR, VERSION, COMMAND_CHECK_CONFIG, COMMAND_INIT_CONFIG, COMMAND_COMMIT, COMMAND_AUDIO_COMMIT, COMMAND_RELEASE, COMMAND_PUBLISH, COMMAND_TREE, COMMAND_LINK, COMMAND_UNLINK, COMMAND_AUDIO_REVIEW, COMMAND_CLEAN, COMMAND_REVIEW, COMMAND_SELECT_AUDIO, COMMAND_DEVELOPMENT, COMMAND_VERSIONS } from './constants.js';
16
18
  import { getLogger, setLogLevel } from './logging.js';
17
19
  import { ConfigSchema } from './types.js';
18
20
  import { UserCancellationError } from './error/CommandErrors.js';
19
21
 
22
+ /**
23
+ * Print debug information about the command being executed when debug flag is enabled.
24
+ */ function printDebugCommandInfo(commandName, runConfig) {
25
+ if (runConfig.debug) {
26
+ const logger = getLogger();
27
+ logger.info('=== KODRDRIV DEBUG INFO ===');
28
+ logger.info('Command: %s', commandName);
29
+ logger.info('Version: %s', VERSION);
30
+ logger.info('===========================');
31
+ }
32
+ }
20
33
  /**
21
34
  * Configure early logging based on command line flags.
22
35
  *
@@ -37,8 +50,8 @@ import { UserCancellationError } from './error/CommandErrors.js';
37
50
  async function runApplication() {
38
51
  // Configure logging early, before CardiganTime initialization
39
52
  configureEarlyLogging();
40
- // Cast create to `any` to avoid excessive type instantiation issues in TS compiler
41
- const createCardigantime = Cardigantime.create;
53
+ const cardigantimeModule = Cardigantime;
54
+ const createCardigantime = cardigantimeModule.create;
42
55
  const cardigantime = createCardigantime({
43
56
  defaults: {
44
57
  configDirectory: DEFAULT_CONFIG_DIR,
@@ -71,6 +84,8 @@ async function runApplication() {
71
84
  }
72
85
  const logger = getLogger();
73
86
  cardigantime.setLogger(logger);
87
+ // Display version information
88
+ logger.info('🚀 kodrdriv %s', VERSION);
74
89
  // Handle check-config command first
75
90
  if (commandConfig.commandName === COMMAND_CHECK_CONFIG) {
76
91
  // CardiganTime's checkConfig has already been called in Arguments.configure()
@@ -93,7 +108,8 @@ async function runApplication() {
93
108
  'commit',
94
109
  'publish',
95
110
  'link',
96
- 'unlink'
111
+ 'unlink',
112
+ 'development'
97
113
  ];
98
114
  if (supportedBuiltInCommands.includes(treeBuiltInCommand)) {
99
115
  // This is a tree command with built-in command, keep commandName as 'tree'
@@ -102,11 +118,15 @@ async function runApplication() {
102
118
  // Unknown tree argument, let it fail naturally in tree.ts
103
119
  commandName = 'tree';
104
120
  }
105
- } else if (command === 'commit' || command === 'audio-commit' || command === 'release' || command === 'publish' || command === 'tree' || command === 'link' || command === 'unlink' || command === 'audio-review' || command === 'clean' || command === 'review' || command === 'select-audio') {
121
+ } else if (command === 'commit' || command === 'audio-commit' || command === 'release' || command === 'publish' || command === 'tree' || command === 'link' || command === 'unlink' || command === 'audio-review' || command === 'clean' || command === 'review' || command === 'select-audio' || command === 'development' || command === 'versions') {
106
122
  commandName = command;
107
123
  }
108
124
  let summary = '';
109
125
  try {
126
+ // Print debug info at the start of command execution
127
+ if (commandName) {
128
+ printDebugCommandInfo(commandName, runConfig);
129
+ }
110
130
  if (commandName === COMMAND_COMMIT) {
111
131
  summary = await execute(runConfig);
112
132
  } else if (commandName === COMMAND_AUDIO_COMMIT) {
@@ -145,6 +165,10 @@ async function runApplication() {
145
165
  } else if (commandName === COMMAND_SELECT_AUDIO) {
146
166
  await execute$a(runConfig);
147
167
  summary = 'Audio selection completed successfully.';
168
+ } else if (commandName === COMMAND_DEVELOPMENT) {
169
+ summary = await execute$b(runConfig);
170
+ } else if (commandName === COMMAND_VERSIONS) {
171
+ summary = await execute$c(runConfig);
148
172
  }
149
173
  // eslint-disable-next-line no-console
150
174
  console.log(`\n\n${summary}\n\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"application.js","sources":["../src/application.ts"],"sourcesContent":["import * as Cardigantime from '@theunwalked/cardigantime';\nimport 'dotenv/config';\nimport { CommandConfig } from 'types';\nimport * as Arguments from './arguments';\nimport * as AudioCommit from './commands/audio-commit';\nimport * as AudioReview from './commands/audio-review';\nimport * as Clean from './commands/clean';\nimport * as Commit from './commands/commit';\nimport * as Link from './commands/link';\nimport * as Publish from './commands/publish';\nimport * as Tree from './commands/tree';\nimport * as Release from './commands/release';\nimport * as Review from './commands/review';\nimport * as SelectAudio from './commands/select-audio';\nimport * as Unlink from './commands/unlink';\nimport { COMMAND_AUDIO_COMMIT, COMMAND_AUDIO_REVIEW, COMMAND_CHECK_CONFIG, COMMAND_CLEAN, COMMAND_COMMIT, COMMAND_INIT_CONFIG, COMMAND_LINK, COMMAND_PUBLISH, COMMAND_TREE, COMMAND_RELEASE, COMMAND_REVIEW, COMMAND_SELECT_AUDIO, COMMAND_UNLINK, DEFAULT_CONFIG_DIR } from './constants';\nimport { getLogger, setLogLevel } from './logging';\nimport { Config, ConfigSchema, SecureConfig } from './types';\nimport { UserCancellationError } from './error/CommandErrors';\n\n/**\n * Configure early logging based on command line flags.\n *\n * Hey we need this because we need to be able to debug CardiganTime.\n * This method checks for --verbose and --debug flags early in the process\n * before CardiganTime is configured, allowing us to capture debug output\n * from the CardiganTime initialization itself.\n */\nexport function configureEarlyLogging(): void {\n const hasVerbose = process.argv.includes('--verbose');\n const hasDebug = process.argv.includes('--debug');\n\n // Set log level based on early flag detection\n if (hasDebug) {\n setLogLevel('debug');\n } else if (hasVerbose) {\n setLogLevel('verbose');\n }\n}\n\nexport async function runApplication(): Promise<void> {\n // Configure logging early, before CardiganTime initialization\n configureEarlyLogging();\n\n // Cast create to `any` to avoid excessive type instantiation issues in TS compiler\n const createCardigantime: any = (Cardigantime as unknown as { create: unknown }).create as any;\n\n const cardigantime = createCardigantime({\n defaults: {\n configDirectory: DEFAULT_CONFIG_DIR,\n // Move pathResolution INSIDE defaults\n pathResolution: {\n resolvePathArray: ['contextDirectories'], // Resolve contextDirectories array elements as paths\n },\n // Use fieldOverlaps instead of mergeStrategy, INSIDE defaults\n fieldOverlaps: {\n 'contextDirectories': 'prepend', // Use prepend strategy for contextDirectories array\n // Add other field overlap configurations as needed\n },\n },\n features: ['config', 'hierarchical'],\n configShape: ConfigSchema.shape, // No need for 'as any' now\n logger: getLogger(),\n }); // No need for 'as any' at the end\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [runConfig, secureConfig, commandConfig]: [Config, SecureConfig, CommandConfig] = await Arguments.configure(cardigantime); // Pass cardigantime instance\n\n // Set log level based on verbose flag\n if (runConfig.verbose) {\n setLogLevel('verbose');\n }\n if (runConfig.debug) {\n setLogLevel('debug');\n }\n\n const logger = getLogger();\n cardigantime.setLogger(logger);\n\n // Handle check-config command first\n if (commandConfig.commandName === COMMAND_CHECK_CONFIG) {\n // CardiganTime's checkConfig has already been called in Arguments.configure()\n // No additional processing needed here\n return;\n }\n\n // Handle init-config command\n if (commandConfig.commandName === COMMAND_INIT_CONFIG) {\n // CardiganTime's initConfig has already been called in Arguments.configure()\n // No additional processing needed here\n return;\n }\n\n // Get the command from Commander\n const command = process.argv[2];\n let commandName = commandConfig.commandName;\n\n // Handle special case for tree command with built-in command argument\n if (command === 'tree' && process.argv[3]) {\n const treeBuiltInCommand = process.argv[3];\n const supportedBuiltInCommands = ['commit', 'publish', 'link', 'unlink'];\n if (supportedBuiltInCommands.includes(treeBuiltInCommand)) {\n // This is a tree command with built-in command, keep commandName as 'tree'\n commandName = 'tree';\n } else {\n // Unknown tree argument, let it fail naturally in tree.ts\n commandName = 'tree';\n }\n }\n // If we have a specific command argument, use that\n else if (command === 'commit' || command === 'audio-commit' || command === 'release' || command === 'publish' || command === 'tree' || command === 'link' || command === 'unlink' || command === 'audio-review' || command === 'clean' || command === 'review' || command === 'select-audio') {\n commandName = command;\n }\n\n let summary: string = '';\n\n try {\n if (commandName === COMMAND_COMMIT) {\n summary = await Commit.execute(runConfig);\n } else if (commandName === COMMAND_AUDIO_COMMIT) {\n summary = await AudioCommit.execute(runConfig);\n } else if (commandName === COMMAND_RELEASE) {\n const releaseSummary = await Release.execute(runConfig);\n summary = `${releaseSummary.title}\\n\\n${releaseSummary.body}`;\n } else if (commandName === COMMAND_PUBLISH) {\n await Publish.execute(runConfig);\n } else if (commandName === COMMAND_TREE) {\n // Handle tree directories mapping from command-specific arguments\n if (runConfig.audioReview?.directory && !runConfig.tree?.directories) {\n runConfig.tree = runConfig.tree || {};\n runConfig.tree.directories = [runConfig.audioReview.directory];\n }\n // Handle tree exclusion patterns - use global excludedPatterns for tree\n if (runConfig.excludedPatterns && !runConfig.tree?.excludedPatterns) {\n runConfig.tree = runConfig.tree || {};\n runConfig.tree.excludedPatterns = runConfig.excludedPatterns;\n }\n summary = await Tree.execute(runConfig);\n } else if (commandName === COMMAND_LINK) {\n summary = await Link.execute(runConfig);\n } else if (commandName === COMMAND_UNLINK) {\n summary = await Unlink.execute(runConfig);\n } else if (commandName === COMMAND_AUDIO_REVIEW) {\n summary = await AudioReview.execute(runConfig);\n } else if (commandName === COMMAND_CLEAN) {\n await Clean.execute(runConfig);\n summary = 'Output directory cleaned successfully.';\n } else if (commandName === COMMAND_REVIEW) {\n summary = await Review.execute(runConfig);\n } else if (commandName === COMMAND_SELECT_AUDIO) {\n await SelectAudio.execute(runConfig);\n summary = 'Audio selection completed successfully.';\n }\n\n // eslint-disable-next-line no-console\n console.log(`\\n\\n${summary}\\n\\n`);\n } catch (error: any) {\n // Handle user cancellation gracefully\n if (error instanceof UserCancellationError) {\n logger.info(error.message);\n process.exit(0);\n }\n\n // Re-throw other errors to be handled by main.ts\n throw error;\n }\n}\n"],"names":["configureEarlyLogging","hasVerbose","process","argv","includes","hasDebug","setLogLevel","runApplication","createCardigantime","Cardigantime","create","cardigantime","defaults","configDirectory","DEFAULT_CONFIG_DIR","pathResolution","resolvePathArray","fieldOverlaps","features","configShape","ConfigSchema","shape","logger","getLogger","runConfig","secureConfig","commandConfig","Arguments","verbose","debug","setLogger","commandName","COMMAND_CHECK_CONFIG","COMMAND_INIT_CONFIG","command","treeBuiltInCommand","supportedBuiltInCommands","summary","COMMAND_COMMIT","Commit","COMMAND_AUDIO_COMMIT","AudioCommit","COMMAND_RELEASE","releaseSummary","Release","title","body","COMMAND_PUBLISH","Publish","COMMAND_TREE","audioReview","directory","tree","directories","excludedPatterns","Tree","COMMAND_LINK","Link","COMMAND_UNLINK","Unlink","COMMAND_AUDIO_REVIEW","AudioReview","COMMAND_CLEAN","Clean","COMMAND_REVIEW","Review","COMMAND_SELECT_AUDIO","SelectAudio","console","log","error","UserCancellationError","info","message","exit"],"mappings":"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"}
1
+ {"version":3,"file":"application.js","sources":["../src/application.ts"],"sourcesContent":["import * as Cardigantime from '@theunwalked/cardigantime';\nimport 'dotenv/config';\nimport { CommandConfig } from 'types';\nimport * as Arguments from './arguments';\nimport * as AudioCommit from './commands/audio-commit';\nimport * as AudioReview from './commands/audio-review';\nimport * as Clean from './commands/clean';\nimport * as Commit from './commands/commit';\nimport * as Link from './commands/link';\nimport * as Publish from './commands/publish';\nimport * as Tree from './commands/tree';\nimport * as Release from './commands/release';\nimport * as Review from './commands/review';\nimport * as SelectAudio from './commands/select-audio';\nimport * as Unlink from './commands/unlink';\nimport * as Development from './commands/development';\nimport * as Versions from './commands/versions';\nimport { COMMAND_AUDIO_COMMIT, COMMAND_AUDIO_REVIEW, COMMAND_CHECK_CONFIG, COMMAND_CLEAN, COMMAND_COMMIT, COMMAND_DEVELOPMENT, COMMAND_INIT_CONFIG, COMMAND_LINK, COMMAND_PUBLISH, COMMAND_TREE, COMMAND_RELEASE, COMMAND_REVIEW, COMMAND_SELECT_AUDIO, COMMAND_UNLINK, COMMAND_VERSIONS, DEFAULT_CONFIG_DIR } from './constants';\nimport { getLogger, setLogLevel } from './logging';\nimport { Config, ConfigSchema, SecureConfig } from './types';\nimport { UserCancellationError } from './error/CommandErrors';\nimport { VERSION } from './constants';\n\n/**\n * Print debug information about the command being executed when debug flag is enabled.\n */\nfunction printDebugCommandInfo(commandName: string, runConfig: Config): void {\n if (runConfig.debug) {\n const logger = getLogger();\n logger.info('=== KODRDRIV DEBUG INFO ===');\n logger.info('Command: %s', commandName);\n logger.info('Version: %s', VERSION);\n logger.info('===========================');\n }\n}\n\n/**\n * Configure early logging based on command line flags.\n *\n * Hey we need this because we need to be able to debug CardiganTime.\n * This method checks for --verbose and --debug flags early in the process\n * before CardiganTime is configured, allowing us to capture debug output\n * from the CardiganTime initialization itself.\n */\nexport function configureEarlyLogging(): void {\n const hasVerbose = process.argv.includes('--verbose');\n const hasDebug = process.argv.includes('--debug');\n\n // Set log level based on early flag detection\n if (hasDebug) {\n setLogLevel('debug');\n } else if (hasVerbose) {\n setLogLevel('verbose');\n }\n}\n\nexport async function runApplication(): Promise<void> {\n // Configure logging early, before CardiganTime initialization\n configureEarlyLogging();\n\n // Use proper typing for CardiganTime create function\n interface CardigantimeCreateParams {\n defaults?: any;\n features?: string[];\n configShape?: any;\n logger?: any;\n }\n\n interface CardigantimeInstance {\n read: (args: any) => Promise<any>;\n checkConfig: () => Promise<void>;\n generateConfig: (dir: string) => Promise<void>;\n setLogger: (logger: any) => void;\n }\n\n const cardigantimeModule = Cardigantime as any;\n const createCardigantime = cardigantimeModule.create as (params: CardigantimeCreateParams) => CardigantimeInstance;\n\n const cardigantime = createCardigantime({\n defaults: {\n configDirectory: DEFAULT_CONFIG_DIR,\n // Move pathResolution INSIDE defaults\n pathResolution: {\n resolvePathArray: ['contextDirectories'], // Resolve contextDirectories array elements as paths\n },\n // Use fieldOverlaps instead of mergeStrategy, INSIDE defaults\n fieldOverlaps: {\n 'contextDirectories': 'prepend', // Use prepend strategy for contextDirectories array\n // Add other field overlap configurations as needed\n },\n },\n features: ['config', 'hierarchical'],\n configShape: ConfigSchema.shape, // No need for 'as any' now\n logger: getLogger(),\n }); // No need for 'as any' at the end\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [runConfig, secureConfig, commandConfig]: [Config, SecureConfig, CommandConfig] = await Arguments.configure(cardigantime); // Pass cardigantime instance\n\n // Set log level based on verbose flag\n if (runConfig.verbose) {\n setLogLevel('verbose');\n }\n if (runConfig.debug) {\n setLogLevel('debug');\n }\n\n const logger = getLogger();\n cardigantime.setLogger(logger);\n\n // Display version information\n logger.info('🚀 kodrdriv %s', VERSION);\n\n // Handle check-config command first\n if (commandConfig.commandName === COMMAND_CHECK_CONFIG) {\n // CardiganTime's checkConfig has already been called in Arguments.configure()\n // No additional processing needed here\n return;\n }\n\n // Handle init-config command\n if (commandConfig.commandName === COMMAND_INIT_CONFIG) {\n // CardiganTime's initConfig has already been called in Arguments.configure()\n // No additional processing needed here\n return;\n }\n\n // Get the command from Commander\n const command = process.argv[2];\n let commandName = commandConfig.commandName;\n\n // Handle special case for tree command with built-in command argument\n if (command === 'tree' && process.argv[3]) {\n const treeBuiltInCommand = process.argv[3];\n const supportedBuiltInCommands = ['commit', 'publish', 'link', 'unlink', 'development'];\n if (supportedBuiltInCommands.includes(treeBuiltInCommand)) {\n // This is a tree command with built-in command, keep commandName as 'tree'\n commandName = 'tree';\n } else {\n // Unknown tree argument, let it fail naturally in tree.ts\n commandName = 'tree';\n }\n }\n // If we have a specific command argument, use that\n else if (command === 'commit' || command === 'audio-commit' || command === 'release' || command === 'publish' || command === 'tree' || command === 'link' || command === 'unlink' || command === 'audio-review' || command === 'clean' || command === 'review' || command === 'select-audio' || command === 'development' || command === 'versions') {\n commandName = command;\n }\n\n let summary: string = '';\n\n try {\n // Print debug info at the start of command execution\n if (commandName) {\n printDebugCommandInfo(commandName, runConfig);\n }\n\n if (commandName === COMMAND_COMMIT) {\n summary = await Commit.execute(runConfig);\n } else if (commandName === COMMAND_AUDIO_COMMIT) {\n summary = await AudioCommit.execute(runConfig);\n } else if (commandName === COMMAND_RELEASE) {\n const releaseSummary = await Release.execute(runConfig);\n summary = `${releaseSummary.title}\\n\\n${releaseSummary.body}`;\n } else if (commandName === COMMAND_PUBLISH) {\n await Publish.execute(runConfig);\n } else if (commandName === COMMAND_TREE) {\n // Handle tree directories mapping from command-specific arguments\n if (runConfig.audioReview?.directory && !runConfig.tree?.directories) {\n runConfig.tree = runConfig.tree || {};\n runConfig.tree.directories = [runConfig.audioReview.directory];\n }\n // Handle tree exclusion patterns - use global excludedPatterns for tree\n if (runConfig.excludedPatterns && !runConfig.tree?.excludedPatterns) {\n runConfig.tree = runConfig.tree || {};\n runConfig.tree.excludedPatterns = runConfig.excludedPatterns;\n }\n summary = await Tree.execute(runConfig);\n } else if (commandName === COMMAND_LINK) {\n summary = await Link.execute(runConfig);\n } else if (commandName === COMMAND_UNLINK) {\n summary = await Unlink.execute(runConfig);\n } else if (commandName === COMMAND_AUDIO_REVIEW) {\n summary = await AudioReview.execute(runConfig);\n } else if (commandName === COMMAND_CLEAN) {\n await Clean.execute(runConfig);\n summary = 'Output directory cleaned successfully.';\n } else if (commandName === COMMAND_REVIEW) {\n summary = await Review.execute(runConfig);\n } else if (commandName === COMMAND_SELECT_AUDIO) {\n await SelectAudio.execute(runConfig);\n summary = 'Audio selection completed successfully.';\n } else if (commandName === COMMAND_DEVELOPMENT) {\n summary = await Development.execute(runConfig);\n } else if (commandName === COMMAND_VERSIONS) {\n summary = await Versions.execute(runConfig);\n }\n\n // eslint-disable-next-line no-console\n console.log(`\\n\\n${summary}\\n\\n`);\n } catch (error: any) {\n // Handle user cancellation gracefully\n if (error instanceof UserCancellationError) {\n logger.info(error.message);\n process.exit(0);\n }\n\n // Re-throw other errors to be handled by main.ts\n throw error;\n }\n}\n"],"names":["printDebugCommandInfo","commandName","runConfig","debug","logger","getLogger","info","VERSION","configureEarlyLogging","hasVerbose","process","argv","includes","hasDebug","setLogLevel","runApplication","cardigantimeModule","Cardigantime","createCardigantime","create","cardigantime","defaults","configDirectory","DEFAULT_CONFIG_DIR","pathResolution","resolvePathArray","fieldOverlaps","features","configShape","ConfigSchema","shape","secureConfig","commandConfig","Arguments","verbose","setLogger","COMMAND_CHECK_CONFIG","COMMAND_INIT_CONFIG","command","treeBuiltInCommand","supportedBuiltInCommands","summary","COMMAND_COMMIT","Commit","COMMAND_AUDIO_COMMIT","AudioCommit","COMMAND_RELEASE","releaseSummary","Release","title","body","COMMAND_PUBLISH","Publish","COMMAND_TREE","audioReview","directory","tree","directories","excludedPatterns","Tree","COMMAND_LINK","Link","COMMAND_UNLINK","Unlink","COMMAND_AUDIO_REVIEW","AudioReview","COMMAND_CLEAN","Clean","COMMAND_REVIEW","Review","COMMAND_SELECT_AUDIO","SelectAudio","COMMAND_DEVELOPMENT","Development","COMMAND_VERSIONS","Versions","console","log","error","UserCancellationError","message","exit"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAuBA;;AAEC,IACD,SAASA,qBAAAA,CAAsBC,WAAmB,EAAEC,SAAiB,EAAA;IACjE,IAAIA,SAAAA,CAAUC,KAAK,EAAE;AACjB,QAAA,MAAMC,MAAAA,GAASC,SAAAA,EAAAA;AACfD,QAAAA,MAAAA,CAAOE,IAAI,CAAC,6BAAA,CAAA;QACZF,MAAAA,CAAOE,IAAI,CAAC,aAAA,EAAeL,WAAAA,CAAAA;QAC3BG,MAAAA,CAAOE,IAAI,CAAC,aAAA,EAAeC,OAAAA,CAAAA;AAC3BH,QAAAA,MAAAA,CAAOE,IAAI,CAAC,6BAAA,CAAA;AAChB,IAAA;AACJ;AAEA;;;;;;;AAOC,IACM,SAASE,qBAAAA,GAAAA;AACZ,IAAA,MAAMC,UAAAA,GAAaC,OAAAA,CAAQC,IAAI,CAACC,QAAQ,CAAC,WAAA,CAAA;AACzC,IAAA,MAAMC,QAAAA,GAAWH,OAAAA,CAAQC,IAAI,CAACC,QAAQ,CAAC,SAAA,CAAA;;AAGvC,IAAA,IAAIC,QAAAA,EAAU;QACVC,WAAAA,CAAY,OAAA,CAAA;AAChB,IAAA,CAAA,MAAO,IAAIL,UAAAA,EAAY;QACnBK,WAAAA,CAAY,SAAA,CAAA;AAChB,IAAA;AACJ;AAEO,eAAeC,cAAAA,GAAAA;;AAElBP,IAAAA,qBAAAA,EAAAA;AAiBA,IAAA,MAAMQ,kBAAAA,GAAqBC,YAAAA;IAC3B,MAAMC,kBAAAA,GAAqBF,mBAAmBG,MAAM;AAEpD,IAAA,MAAMC,eAAeF,kBAAAA,CAAmB;QACpCG,QAAAA,EAAU;YACNC,eAAAA,EAAiBC,kBAAAA;;YAEjBC,cAAAA,EAAgB;gBACZC,gBAAAA,EAAkB;AAAC,oBAAA;AAAqB;AAC5C,aAAA;;YAEAC,aAAAA,EAAe;gBACX,oBAAA,EAAsB;AAE1B;AACJ,SAAA;QACAC,QAAAA,EAAU;AAAC,YAAA,QAAA;AAAU,YAAA;AAAe,SAAA;AACpCC,QAAAA,WAAAA,EAAaC,aAAaC,KAAK;QAC/B1B,MAAAA,EAAQC,SAAAA;AACZ,KAAA,CAAA,CAAA;;IAGA,MAAM,CAACH,SAAAA,EAAW6B,YAAAA,EAAcC,aAAAA,CAAc,GAA0C,MAAMC,SAAmB,CAACb,YAAAA,CAAAA,CAAAA;;IAGlH,IAAIlB,SAAAA,CAAUgC,OAAO,EAAE;QACnBpB,WAAAA,CAAY,SAAA,CAAA;AAChB,IAAA;IACA,IAAIZ,SAAAA,CAAUC,KAAK,EAAE;QACjBW,WAAAA,CAAY,OAAA,CAAA;AAChB,IAAA;AAEA,IAAA,MAAMV,MAAAA,GAASC,SAAAA,EAAAA;AACfe,IAAAA,YAAAA,CAAae,SAAS,CAAC/B,MAAAA,CAAAA;;IAGvBA,MAAAA,CAAOE,IAAI,CAAC,gBAAA,EAAkBC,OAAAA,CAAAA;;IAG9B,IAAIyB,aAAAA,CAAc/B,WAAW,KAAKmC,oBAAAA,EAAsB;;;AAGpD,QAAA;AACJ,IAAA;;IAGA,IAAIJ,aAAAA,CAAc/B,WAAW,KAAKoC,mBAAAA,EAAqB;;;AAGnD,QAAA;AACJ,IAAA;;AAGA,IAAA,MAAMC,OAAAA,GAAU5B,OAAAA,CAAQC,IAAI,CAAC,CAAA,CAAE;IAC/B,IAAIV,WAAAA,GAAc+B,cAAc/B,WAAW;;AAG3C,IAAA,IAAIqC,YAAY,MAAA,IAAU5B,OAAAA,CAAQC,IAAI,CAAC,EAAE,EAAE;AACvC,QAAA,MAAM4B,kBAAAA,GAAqB7B,OAAAA,CAAQC,IAAI,CAAC,CAAA,CAAE;AAC1C,QAAA,MAAM6B,wBAAAA,GAA2B;AAAC,YAAA,QAAA;AAAU,YAAA,SAAA;AAAW,YAAA,MAAA;AAAQ,YAAA,QAAA;AAAU,YAAA;AAAc,SAAA;QACvF,IAAIA,wBAAAA,CAAyB5B,QAAQ,CAAC2B,kBAAAA,CAAAA,EAAqB;;YAEvDtC,WAAAA,GAAc,MAAA;QAClB,CAAA,MAAO;;YAEHA,WAAAA,GAAc,MAAA;AAClB,QAAA;IACJ,CAAA,MAEK,IAAIqC,OAAAA,KAAY,QAAA,IAAYA,OAAAA,KAAY,cAAA,IAAkBA,OAAAA,KAAY,SAAA,IAAaA,OAAAA,KAAY,SAAA,IAAaA,OAAAA,KAAY,MAAA,IAAUA,OAAAA,KAAY,MAAA,IAAUA,YAAY,QAAA,IAAYA,OAAAA,KAAY,cAAA,IAAkBA,OAAAA,KAAY,OAAA,IAAWA,OAAAA,KAAY,QAAA,IAAYA,OAAAA,KAAY,cAAA,IAAkBA,OAAAA,KAAY,aAAA,IAAiBA,OAAAA,KAAY,UAAA,EAAY;QACjVrC,WAAAA,GAAcqC,OAAAA;AAClB,IAAA;AAEA,IAAA,IAAIG,OAAAA,GAAkB,EAAA;IAEtB,IAAI;;AAEA,QAAA,IAAIxC,WAAAA,EAAa;AACbD,YAAAA,qBAAAA,CAAsBC,WAAAA,EAAaC,SAAAA,CAAAA;AACvC,QAAA;AAEA,QAAA,IAAID,gBAAgByC,cAAAA,EAAgB;YAChCD,OAAAA,GAAU,MAAME,OAAc,CAACzC,SAAAA,CAAAA;QACnC,CAAA,MAAO,IAAID,gBAAgB2C,oBAAAA,EAAsB;YAC7CH,OAAAA,GAAU,MAAMI,SAAmB,CAAC3C,SAAAA,CAAAA;QACxC,CAAA,MAAO,IAAID,gBAAgB6C,eAAAA,EAAiB;AACxC,YAAA,MAAMC,cAAAA,GAAiB,MAAMC,SAAe,CAAC9C,SAAAA,CAAAA;YAC7CuC,OAAAA,GAAU,CAAA,EAAGM,eAAeE,KAAK,CAAC,IAAI,EAAEF,cAAAA,CAAeG,IAAI,CAAA,CAAE;QACjE,CAAA,MAAO,IAAIjD,gBAAgBkD,eAAAA,EAAiB;YACxC,MAAMC,SAAe,CAAClD,SAAAA,CAAAA;QAC1B,CAAA,MAAO,IAAID,gBAAgBoD,YAAAA,EAAc;AAEjCnD,YAAAA,IAAAA,sBAAAA,EAAqCA,eAAAA,EAKNA,gBAAAA;;AALnC,YAAA,IAAIA,EAAAA,sBAAAA,GAAAA,SAAAA,CAAUoD,WAAW,MAAA,IAAA,IAArBpD,6CAAAA,sBAAAA,CAAuBqD,SAAS,KAAI,EAAA,CAACrD,kBAAAA,SAAAA,CAAUsD,IAAI,cAAdtD,eAAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,eAAAA,CAAgBuD,WAAW,CAAA,EAAE;AAClEvD,gBAAAA,SAAAA,CAAUsD,IAAI,GAAGtD,SAAAA,CAAUsD,IAAI,IAAI,EAAC;gBACpCtD,SAAAA,CAAUsD,IAAI,CAACC,WAAW,GAAG;oBAACvD,SAAAA,CAAUoD,WAAW,CAACC;AAAU,iBAAA;AAClE,YAAA;;YAEA,IAAIrD,SAAAA,CAAUwD,gBAAgB,IAAI,EAAA,CAACxD,gBAAAA,GAAAA,SAAAA,CAAUsD,IAAI,MAAA,IAAA,IAAdtD,gBAAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,gBAAAA,CAAgBwD,gBAAgB,CAAA,EAAE;AACjExD,gBAAAA,SAAAA,CAAUsD,IAAI,GAAGtD,SAAAA,CAAUsD,IAAI,IAAI,EAAC;AACpCtD,gBAAAA,SAAAA,CAAUsD,IAAI,CAACE,gBAAgB,GAAGxD,UAAUwD,gBAAgB;AAChE,YAAA;YACAjB,OAAAA,GAAU,MAAMkB,SAAY,CAACzD,SAAAA,CAAAA;QACjC,CAAA,MAAO,IAAID,gBAAgB2D,YAAAA,EAAc;YACrCnB,OAAAA,GAAU,MAAMoB,SAAY,CAAC3D,SAAAA,CAAAA;QACjC,CAAA,MAAO,IAAID,gBAAgB6D,cAAAA,EAAgB;YACvCrB,OAAAA,GAAU,MAAMsB,SAAc,CAAC7D,SAAAA,CAAAA;QACnC,CAAA,MAAO,IAAID,gBAAgB+D,oBAAAA,EAAsB;YAC7CvB,OAAAA,GAAU,MAAMwB,SAAmB,CAAC/D,SAAAA,CAAAA;QACxC,CAAA,MAAO,IAAID,gBAAgBiE,aAAAA,EAAe;YACtC,MAAMC,SAAa,CAACjE,SAAAA,CAAAA;YACpBuC,OAAAA,GAAU,wCAAA;QACd,CAAA,MAAO,IAAIxC,gBAAgBmE,cAAAA,EAAgB;YACvC3B,OAAAA,GAAU,MAAM4B,SAAc,CAACnE,SAAAA,CAAAA;QACnC,CAAA,MAAO,IAAID,gBAAgBqE,oBAAAA,EAAsB;YAC7C,MAAMC,SAAmB,CAACrE,SAAAA,CAAAA;YAC1BuC,OAAAA,GAAU,yCAAA;QACd,CAAA,MAAO,IAAIxC,gBAAgBuE,mBAAAA,EAAqB;YAC5C/B,OAAAA,GAAU,MAAMgC,SAAmB,CAACvE,SAAAA,CAAAA;QACxC,CAAA,MAAO,IAAID,gBAAgByE,gBAAAA,EAAkB;YACzCjC,OAAAA,GAAU,MAAMkC,SAAgB,CAACzE,SAAAA,CAAAA;AACrC,QAAA;;AAGA0E,QAAAA,OAAAA,CAAQC,GAAG,CAAC,CAAC,IAAI,EAAEpC,OAAAA,CAAQ,IAAI,CAAC,CAAA;AACpC,IAAA,CAAA,CAAE,OAAOqC,KAAAA,EAAY;;AAEjB,QAAA,IAAIA,iBAAiBC,qBAAAA,EAAuB;YACxC3E,MAAAA,CAAOE,IAAI,CAACwE,KAAAA,CAAME,OAAO,CAAA;AACzBtE,YAAAA,OAAAA,CAAQuE,IAAI,CAAC,CAAA,CAAA;AACjB,QAAA;;QAGA,MAAMH,KAAAA;AACV,IAAA;AACJ;;;;"}