@eldrforge/kodrdriv 1.2.137 → 1.2.138

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
@@ -14,6 +14,19 @@ Writing good commit messages and release notes is time-consuming and often done
14
14
 
15
15
  KodrDriv reads your code changes and Git history to automatically generate contextual, meaningful documentation that reflects your actual work.
16
16
 
17
+ ## Requirements
18
+
19
+ - **Node.js 24.0.0 or higher** - KodrDriv uses Vite 7+ which requires Node.js 24+
20
+ - Git installed and configured
21
+ - OpenAI API key (for AI-powered content generation)
22
+
23
+ To check your Node.js version:
24
+ ```bash
25
+ node --version
26
+ ```
27
+
28
+ If you need to upgrade Node.js, visit [nodejs.org](https://nodejs.org/) or use a version manager like [nvm](https://github.com/nvm-sh/nvm).
29
+
17
30
  ## Installation
18
31
 
19
32
  ```bash
@@ -78,8 +91,13 @@ Set up your environment variables:
78
91
  ```bash
79
92
  export OPENAI_API_KEY="your-openai-api-key"
80
93
  export GITHUB_TOKEN="your-github-token" # Required for publish command
94
+
95
+ # If using a project-scoped API key (starts with sk-proj-):
96
+ export OPENAI_PROJECT_ID="proj-your-project-id"
81
97
  ```
82
98
 
99
+ **Note:** If your OpenAI API key starts with `sk-proj-`, you must also set `OPENAI_PROJECT_ID`. You can find your project ID in the [OpenAI dashboard](https://platform.openai.com/settings/organization/projects). Alternatively, create a legacy API key (starts with just `sk-`) to avoid needing the project ID.
100
+
83
101
  Initialize configuration files:
84
102
  ```bash
85
103
  kodrdriv --init-config
@@ -1,5 +1,5 @@
1
+ import { config } from 'dotenv';
1
2
  import * as Cardigantime from '@theunwalked/cardigantime';
2
- import 'dotenv/config';
3
3
  import { setLogger } from '@eldrforge/git-tools';
4
4
  import { setLogger as setLogger$1, setPromptFunction } from '@eldrforge/github-tools';
5
5
  import { promptConfirmation, UserCancellationError } from '@eldrforge/shared';
@@ -13,6 +13,30 @@ import { DEFAULT_CONFIG_DIR, VERSION, COMMAND_CHECK_CONFIG, COMMAND_INIT_CONFIG,
13
13
  import { getLogger, setLogLevel } from './logging.js';
14
14
  import { ConfigSchema } from './types.js';
15
15
 
16
+ // Load .env file if it exists, but NEVER override existing environment variables
17
+ // This MUST be the first thing we do, before any other imports that might load dotenv
18
+ // This ensures that shell-exported variables like OPENAI_API_KEY take precedence
19
+ config({
20
+ override: false
21
+ });
22
+ /**
23
+ * Check Node.js version and exit with clear error message if version is too old.
24
+ */ function checkNodeVersion() {
25
+ const requiredMajorVersion = 24;
26
+ const currentVersion = process.version;
27
+ const majorVersion = parseInt(currentVersion.slice(1).split('.')[0], 10);
28
+ if (majorVersion < requiredMajorVersion) {
29
+ // eslint-disable-next-line no-console
30
+ console.error(`\n❌ ERROR: Node.js version ${requiredMajorVersion}.0.0 or higher is required.`);
31
+ // eslint-disable-next-line no-console
32
+ console.error(` Current version: ${currentVersion}`);
33
+ // eslint-disable-next-line no-console
34
+ console.error(` Please upgrade your Node.js version to continue.\n`);
35
+ // eslint-disable-next-line no-console
36
+ console.error(` This project uses Vite 7+ which requires Node.js ${requiredMajorVersion}+.\n`);
37
+ process.exit(1);
38
+ }
39
+ }
16
40
  /**
17
41
  * Print debug information about the command being executed when debug flag is enabled.
18
42
  */ function printDebugCommandInfo(commandName, runConfig) {
@@ -21,6 +45,21 @@ import { ConfigSchema } from './types.js';
21
45
  logger.info('DEBUG_INFO_HEADER: KodrDriv debug information');
22
46
  logger.info('DEBUG_INFO_COMMAND: Command being executed | Command: %s', commandName);
23
47
  logger.info('DEBUG_INFO_VERSION: KodrDriv version | Version: %s', VERSION);
48
+ // Log last 4 characters of tokens for debugging permissions issues
49
+ const openaiToken = process.env.OPENAI_API_KEY;
50
+ const githubToken = process.env.GITHUB_TOKEN;
51
+ if (openaiToken) {
52
+ const tokenSuffix = openaiToken.slice(-4);
53
+ logger.info('DEBUG_INFO_TOKEN: OpenAI API Key | Suffix: ...%s', tokenSuffix);
54
+ } else {
55
+ logger.info('DEBUG_INFO_TOKEN: OpenAI API Key | Status: not set');
56
+ }
57
+ if (githubToken) {
58
+ const tokenSuffix = githubToken.slice(-4);
59
+ logger.info('DEBUG_INFO_TOKEN: GitHub Token | Suffix: ...%s', tokenSuffix);
60
+ } else {
61
+ logger.info('DEBUG_INFO_TOKEN: GitHub Token | Status: not set');
62
+ }
24
63
  logger.info('DEBUG_INFO_FOOTER: End of debug information');
25
64
  }
26
65
  }
@@ -42,6 +81,8 @@ import { ConfigSchema } from './types.js';
42
81
  }
43
82
  }
44
83
  async function runApplication() {
84
+ // Check Node.js version first, before doing anything else
85
+ checkNodeVersion();
45
86
  // Configure logging early, before CardiganTime initialization
46
87
  configureEarlyLogging();
47
88
  // Initialize RiotPrompt templates for ai-service
@@ -1 +1 @@
1
- {"version":3,"file":"application.js","sources":["../src/application.ts"],"sourcesContent":["import * as Cardigantime from '@theunwalked/cardigantime';\nimport 'dotenv/config';\nimport { setLogger as setGitLogger } from '@eldrforge/git-tools';\nimport { setLogger as setGitHubLogger, setPromptFunction } from '@eldrforge/github-tools';\nimport { promptConfirmation } from '@eldrforge/shared';\nimport { initializeTemplates } from '@eldrforge/ai-service';\nimport { CommandConfig } from 'types';\nimport * as Arguments from './arguments';\n\n// Import commands from extracted packages\nimport * as CommandsGit from '@eldrforge/commands-git';\nimport * as CommandsTree from '@eldrforge/commands-tree';\nimport * as CommandsPublish from '@eldrforge/commands-publish';\nimport * as CommandsAudio from '@eldrforge/commands-audio';\nimport { COMMAND_AUDIO_COMMIT, COMMAND_AUDIO_REVIEW, COMMAND_CHECK_CONFIG, COMMAND_CLEAN, COMMAND_COMMIT, COMMAND_DEVELOPMENT, COMMAND_INIT_CONFIG, COMMAND_LINK, COMMAND_PRECOMMIT, COMMAND_PUBLISH, COMMAND_RELEASE, COMMAND_REVIEW, COMMAND_SELECT_AUDIO, COMMAND_TREE, COMMAND_UNLINK, COMMAND_UPDATES, COMMAND_VERSIONS, DEFAULT_CONFIG_DIR, VERSION } from './constants';\nimport { UserCancellationError } from '@eldrforge/shared';\nimport { getLogger, setLogLevel } from './logging';\nimport { Config, SecureConfig, ConfigSchema } from './types';\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('DEBUG_INFO_HEADER: KodrDriv debug information');\n logger.info('DEBUG_INFO_COMMAND: Command being executed | Command: %s', commandName);\n logger.info('DEBUG_INFO_VERSION: KodrDriv version | Version: %s', VERSION);\n logger.info('DEBUG_INFO_FOOTER: End of debug information');\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 // Initialize RiotPrompt templates for ai-service\n initializeTemplates();\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 },\n configShape: ConfigSchema.shape,\n features: ['config', 'hierarchical'],\n logger: getLogger(),\n });\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 // Configure external packages to use our logger and prompt\n setGitLogger(logger);\n setGitHubLogger(logger);\n setPromptFunction(promptConfirmation);\n\n // Display version information\n logger.info('APPLICATION_STARTING: KodrDriv application initializing | Version: %s | Status: starting', 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', 'updates'];\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 === 'precommit' || command === 'review' || command === 'select-audio' || command === 'development' || command === 'versions' || command === 'updates') {\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 // Git commands (from @eldrforge/commands-git)\n if (commandName === COMMAND_COMMIT) {\n summary = await CommandsGit.commit(runConfig);\n } else if (commandName === COMMAND_PRECOMMIT) {\n summary = await CommandsGit.precommit(runConfig);\n } else if (commandName === COMMAND_CLEAN) {\n await CommandsGit.clean(runConfig);\n summary = 'Output directory cleaned successfully.';\n } else if (commandName === COMMAND_REVIEW) {\n summary = await CommandsGit.review(runConfig);\n }\n // Tree commands (from @eldrforge/commands-tree)\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?.exclude) {\n runConfig.tree = runConfig.tree || {};\n runConfig.tree.exclude = runConfig.excludedPatterns;\n }\n summary = await CommandsTree.tree(runConfig);\n } else if (commandName === COMMAND_LINK) {\n summary = await CommandsTree.link(runConfig);\n } else if (commandName === COMMAND_UNLINK) {\n summary = await CommandsTree.unlink(runConfig);\n } else if (commandName === COMMAND_UPDATES) {\n summary = await CommandsTree.updates(runConfig);\n } else if (commandName === COMMAND_VERSIONS) {\n summary = await CommandsTree.versions(runConfig);\n }\n // Publish commands (from @eldrforge/commands-publish)\n else if (commandName === COMMAND_RELEASE) {\n const releaseSummary = await CommandsPublish.release(runConfig);\n summary = `${releaseSummary.title}\\n\\n${releaseSummary.body}`;\n } else if (commandName === COMMAND_PUBLISH) {\n await CommandsPublish.publish(runConfig);\n } else if (commandName === COMMAND_DEVELOPMENT) {\n summary = await CommandsPublish.development(runConfig);\n }\n // Audio commands (from @eldrforge/commands-audio)\n else if (commandName === COMMAND_AUDIO_COMMIT) {\n summary = await CommandsAudio.audioCommit(runConfig);\n } else if (commandName === COMMAND_AUDIO_REVIEW) {\n summary = await CommandsAudio.audioReview(runConfig);\n } else if (commandName === COMMAND_SELECT_AUDIO) {\n await CommandsAudio.selectAudio(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('APPLICATION_ERROR: Application error occurred | Error: ' + 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","initializeTemplates","cardigantimeModule","Cardigantime","createCardigantime","create","cardigantime","defaults","configDirectory","DEFAULT_CONFIG_DIR","configShape","ConfigSchema","shape","features","secureConfig","commandConfig","Arguments","verbose","setLogger","setGitLogger","setGitHubLogger","setPromptFunction","promptConfirmation","COMMAND_CHECK_CONFIG","COMMAND_INIT_CONFIG","command","treeBuiltInCommand","supportedBuiltInCommands","summary","COMMAND_COMMIT","CommandsGit","commit","COMMAND_PRECOMMIT","precommit","COMMAND_CLEAN","clean","COMMAND_REVIEW","review","COMMAND_TREE","audioReview","directory","tree","directories","excludedPatterns","exclude","CommandsTree","COMMAND_LINK","link","COMMAND_UNLINK","unlink","COMMAND_UPDATES","updates","COMMAND_VERSIONS","versions","COMMAND_RELEASE","releaseSummary","CommandsPublish","release","title","body","COMMAND_PUBLISH","publish","COMMAND_DEVELOPMENT","development","COMMAND_AUDIO_COMMIT","CommandsAudio","audioCommit","COMMAND_AUDIO_REVIEW","COMMAND_SELECT_AUDIO","selectAudio","console","log","error","UserCancellationError","message","exit"],"mappings":"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"}
1
+ {"version":3,"file":"application.js","sources":["../src/application.ts"],"sourcesContent":["// Load .env file if it exists, but NEVER override existing environment variables\n// This MUST be the first thing we do, before any other imports that might load dotenv\n// This ensures that shell-exported variables like OPENAI_API_KEY take precedence\nimport { config as dotenvConfig } from 'dotenv';\ndotenvConfig({ override: false });\n\nimport * as Cardigantime from '@theunwalked/cardigantime';\nimport { setLogger as setGitLogger } from '@eldrforge/git-tools';\nimport { setLogger as setGitHubLogger, setPromptFunction } from '@eldrforge/github-tools';\nimport { promptConfirmation } from '@eldrforge/shared';\nimport { initializeTemplates } from '@eldrforge/ai-service';\nimport { CommandConfig } from 'types';\nimport * as Arguments from './arguments';\n\n// Import commands from extracted packages\nimport * as CommandsGit from '@eldrforge/commands-git';\nimport * as CommandsTree from '@eldrforge/commands-tree';\nimport * as CommandsPublish from '@eldrforge/commands-publish';\nimport * as CommandsAudio from '@eldrforge/commands-audio';\nimport { COMMAND_AUDIO_COMMIT, COMMAND_AUDIO_REVIEW, COMMAND_CHECK_CONFIG, COMMAND_CLEAN, COMMAND_COMMIT, COMMAND_DEVELOPMENT, COMMAND_INIT_CONFIG, COMMAND_LINK, COMMAND_PRECOMMIT, COMMAND_PUBLISH, COMMAND_RELEASE, COMMAND_REVIEW, COMMAND_SELECT_AUDIO, COMMAND_TREE, COMMAND_UNLINK, COMMAND_UPDATES, COMMAND_VERSIONS, DEFAULT_CONFIG_DIR, VERSION } from './constants';\nimport { UserCancellationError } from '@eldrforge/shared';\nimport { getLogger, setLogLevel } from './logging';\nimport { Config, SecureConfig, ConfigSchema } from './types';\n\n/**\n * Check Node.js version and exit with clear error message if version is too old.\n */\nfunction checkNodeVersion(): void {\n const requiredMajorVersion = 24;\n const currentVersion = process.version;\n const majorVersion = parseInt(currentVersion.slice(1).split('.')[0], 10);\n \n if (majorVersion < requiredMajorVersion) {\n // eslint-disable-next-line no-console\n console.error(`\\n❌ ERROR: Node.js version ${requiredMajorVersion}.0.0 or higher is required.`);\n // eslint-disable-next-line no-console\n console.error(` Current version: ${currentVersion}`);\n // eslint-disable-next-line no-console\n console.error(` Please upgrade your Node.js version to continue.\\n`);\n // eslint-disable-next-line no-console\n console.error(` This project uses Vite 7+ which requires Node.js ${requiredMajorVersion}+.\\n`);\n process.exit(1);\n }\n}\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('DEBUG_INFO_HEADER: KodrDriv debug information');\n logger.info('DEBUG_INFO_COMMAND: Command being executed | Command: %s', commandName);\n logger.info('DEBUG_INFO_VERSION: KodrDriv version | Version: %s', VERSION);\n \n // Log last 4 characters of tokens for debugging permissions issues\n const openaiToken = process.env.OPENAI_API_KEY;\n const githubToken = process.env.GITHUB_TOKEN;\n \n if (openaiToken) {\n const tokenSuffix = openaiToken.slice(-4);\n logger.info('DEBUG_INFO_TOKEN: OpenAI API Key | Suffix: ...%s', tokenSuffix);\n } else {\n logger.info('DEBUG_INFO_TOKEN: OpenAI API Key | Status: not set');\n }\n \n if (githubToken) {\n const tokenSuffix = githubToken.slice(-4);\n logger.info('DEBUG_INFO_TOKEN: GitHub Token | Suffix: ...%s', tokenSuffix);\n } else {\n logger.info('DEBUG_INFO_TOKEN: GitHub Token | Status: not set');\n }\n \n logger.info('DEBUG_INFO_FOOTER: End of debug information');\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 // Check Node.js version first, before doing anything else\n checkNodeVersion();\n \n // Configure logging early, before CardiganTime initialization\n configureEarlyLogging();\n\n // Initialize RiotPrompt templates for ai-service\n initializeTemplates();\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 },\n configShape: ConfigSchema.shape,\n features: ['config', 'hierarchical'],\n logger: getLogger(),\n });\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 // Configure external packages to use our logger and prompt\n setGitLogger(logger);\n setGitHubLogger(logger);\n setPromptFunction(promptConfirmation);\n\n // Display version information\n logger.info('APPLICATION_STARTING: KodrDriv application initializing | Version: %s | Status: starting', 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', 'updates'];\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 === 'precommit' || command === 'review' || command === 'select-audio' || command === 'development' || command === 'versions' || command === 'updates') {\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 // Git commands (from @eldrforge/commands-git)\n if (commandName === COMMAND_COMMIT) {\n summary = await CommandsGit.commit(runConfig);\n } else if (commandName === COMMAND_PRECOMMIT) {\n summary = await CommandsGit.precommit(runConfig);\n } else if (commandName === COMMAND_CLEAN) {\n await CommandsGit.clean(runConfig);\n summary = 'Output directory cleaned successfully.';\n } else if (commandName === COMMAND_REVIEW) {\n summary = await CommandsGit.review(runConfig);\n }\n // Tree commands (from @eldrforge/commands-tree)\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?.exclude) {\n runConfig.tree = runConfig.tree || {};\n runConfig.tree.exclude = runConfig.excludedPatterns;\n }\n summary = await CommandsTree.tree(runConfig);\n } else if (commandName === COMMAND_LINK) {\n summary = await CommandsTree.link(runConfig);\n } else if (commandName === COMMAND_UNLINK) {\n summary = await CommandsTree.unlink(runConfig);\n } else if (commandName === COMMAND_UPDATES) {\n summary = await CommandsTree.updates(runConfig);\n } else if (commandName === COMMAND_VERSIONS) {\n summary = await CommandsTree.versions(runConfig);\n }\n // Publish commands (from @eldrforge/commands-publish)\n else if (commandName === COMMAND_RELEASE) {\n const releaseSummary = await CommandsPublish.release(runConfig);\n summary = `${releaseSummary.title}\\n\\n${releaseSummary.body}`;\n } else if (commandName === COMMAND_PUBLISH) {\n await CommandsPublish.publish(runConfig);\n } else if (commandName === COMMAND_DEVELOPMENT) {\n summary = await CommandsPublish.development(runConfig);\n }\n // Audio commands (from @eldrforge/commands-audio)\n else if (commandName === COMMAND_AUDIO_COMMIT) {\n summary = await CommandsAudio.audioCommit(runConfig);\n } else if (commandName === COMMAND_AUDIO_REVIEW) {\n summary = await CommandsAudio.audioReview(runConfig);\n } else if (commandName === COMMAND_SELECT_AUDIO) {\n await CommandsAudio.selectAudio(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('APPLICATION_ERROR: Application error occurred | Error: ' + 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":["dotenvConfig","override","checkNodeVersion","requiredMajorVersion","currentVersion","process","version","majorVersion","parseInt","slice","split","console","error","exit","printDebugCommandInfo","commandName","runConfig","debug","logger","getLogger","info","VERSION","openaiToken","env","OPENAI_API_KEY","githubToken","GITHUB_TOKEN","tokenSuffix","configureEarlyLogging","hasVerbose","argv","includes","hasDebug","setLogLevel","runApplication","initializeTemplates","cardigantimeModule","Cardigantime","createCardigantime","create","cardigantime","defaults","configDirectory","DEFAULT_CONFIG_DIR","configShape","ConfigSchema","shape","features","secureConfig","commandConfig","Arguments","verbose","setLogger","setGitLogger","setGitHubLogger","setPromptFunction","promptConfirmation","COMMAND_CHECK_CONFIG","COMMAND_INIT_CONFIG","command","treeBuiltInCommand","supportedBuiltInCommands","summary","COMMAND_COMMIT","CommandsGit","commit","COMMAND_PRECOMMIT","precommit","COMMAND_CLEAN","clean","COMMAND_REVIEW","review","COMMAND_TREE","audioReview","directory","tree","directories","excludedPatterns","exclude","CommandsTree","COMMAND_LINK","link","COMMAND_UNLINK","unlink","COMMAND_UPDATES","updates","COMMAND_VERSIONS","versions","COMMAND_RELEASE","releaseSummary","CommandsPublish","release","title","body","COMMAND_PUBLISH","publish","COMMAND_DEVELOPMENT","development","COMMAND_AUDIO_COMMIT","CommandsAudio","audioCommit","COMMAND_AUDIO_REVIEW","COMMAND_SELECT_AUDIO","selectAudio","log","UserCancellationError","message"],"mappings":"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"}
package/dist/constants.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import os from 'os';
2
2
  import path from 'path';
3
3
 
4
- const VERSION = '1.2.137 (HEAD/1a2e5be T:v1.2.137 2026-01-10 23:25:09 -0800) linux x64 v22.21.1';
4
+ const VERSION = '1.2.138 (HEAD/53315d9 T:v1.2.138 2026-01-13 07:03:54 -0800) linux x64 v24.12.0';
5
5
  const PROGRAM_NAME = 'kodrdriv';
6
6
  const DEFAULT_OVERRIDES = false;
7
7
  const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';
@@ -22,8 +22,13 @@ npm install -g @eldrforge/kodrdriv
22
22
  ```bash
23
23
  export OPENAI_API_KEY="sk-your-openai-key-here"
24
24
  export GITHUB_TOKEN="ghp-your-github-token-here" # Optional, for publish
25
+
26
+ # If your API key starts with sk-proj-, you must also set:
27
+ export OPENAI_PROJECT_ID="proj-your-project-id"
25
28
  ```
26
29
 
30
+ **Important:** Project-scoped API keys (starting with `sk-proj-`) require the `OPENAI_PROJECT_ID` environment variable. You can find your project ID at https://platform.openai.com/settings/organization/projects
31
+
27
32
  Add to your shell profile (~/.zshrc, ~/.bashrc) to persist.
28
33
 
29
34
  ### 2. Initialize Configuration
@@ -181,6 +186,24 @@ echo $OPENAI_API_KEY
181
186
 
182
187
  # Set it
183
188
  export OPENAI_API_KEY="your-key"
189
+
190
+ # If using project-scoped key (sk-proj-*), also set:
191
+ export OPENAI_PROJECT_ID="proj-your-project-id"
192
+ ```
193
+
194
+ ### "401 You do not have access to the project tied to the API key"
195
+
196
+ This error occurs when using a project-scoped API key without setting `OPENAI_PROJECT_ID`:
197
+
198
+ ```bash
199
+ # Check if your key is project-scoped
200
+ echo $OPENAI_API_KEY | grep "sk-proj"
201
+
202
+ # If it is, set the project ID:
203
+ export OPENAI_PROJECT_ID="proj-your-project-id"
204
+
205
+ # Find your project ID at:
206
+ # https://platform.openai.com/settings/organization/projects
184
207
  ```
185
208
 
186
209
  ### "No changes to commit"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eldrforge/kodrdriv",
3
- "version": "1.2.137",
3
+ "version": "1.2.138",
4
4
  "description": "Create Intelligent Release Notes or Change Logs from Git",
5
5
  "main": "dist/main.js",
6
6
  "type": "module",
@@ -37,19 +37,22 @@
37
37
  ],
38
38
  "author": "Tim O'Brien <tobrien@discursive.com>",
39
39
  "license": "Apache-2.0",
40
+ "engines": {
41
+ "node": ">=24.0.0"
42
+ },
40
43
  "dependencies": {
41
- "@eldrforge/core": "^0.1.2",
42
- "@eldrforge/commands-git": "^0.1.3",
43
- "@eldrforge/commands-tree": "^0.1.2",
44
- "@eldrforge/commands-publish": "^0.1.3",
45
- "@eldrforge/commands-audio": "^0.1.2",
46
- "@eldrforge/ai-service": "^0.1.19",
47
- "@eldrforge/audio-tools": "^0.1.13",
48
- "@eldrforge/git-tools": "^0.1.18",
49
- "@eldrforge/github-tools": "^0.1.20",
50
- "@eldrforge/shared": "^0.1.8",
51
- "@eldrforge/tree-core": "^0.1.7",
52
- "@eldrforge/tree-execution": "^0.1.7",
44
+ "@eldrforge/core": "^0.1.3",
45
+ "@eldrforge/commands-git": "^0.1.4",
46
+ "@eldrforge/commands-tree": "^0.1.3",
47
+ "@eldrforge/commands-publish": "^0.1.4",
48
+ "@eldrforge/commands-audio": "^0.1.3",
49
+ "@eldrforge/ai-service": "^0.1.21",
50
+ "@eldrforge/audio-tools": "^0.1.15",
51
+ "@eldrforge/git-tools": "^0.1.22",
52
+ "@eldrforge/github-tools": "^0.1.21",
53
+ "@eldrforge/shared": "^0.1.10",
54
+ "@eldrforge/tree-core": "^0.1.8",
55
+ "@eldrforge/tree-execution": "^0.1.8",
53
56
  "@octokit/rest": "^22.0.0",
54
57
  "@riotprompt/riotprompt": "^0.0.10",
55
58
  "@theunwalked/cardigantime": "^0.0.16",