@eldrforge/kodrdriv 1.2.20 → 1.2.22

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 (77) hide show
  1. package/WORKFLOW-PRECHECK-IMPLEMENTATION.md +239 -0
  2. package/WORKFLOW-SKIP-SUMMARY.md +121 -0
  3. package/dist/application.js +6 -2
  4. package/dist/application.js.map +1 -1
  5. package/dist/arguments.js +2 -2
  6. package/dist/arguments.js.map +1 -1
  7. package/dist/commands/audio-commit.js +15 -6
  8. package/dist/commands/audio-commit.js.map +1 -1
  9. package/dist/commands/audio-review.js +31 -15
  10. package/dist/commands/audio-review.js.map +1 -1
  11. package/dist/commands/commit.js +31 -20
  12. package/dist/commands/commit.js.map +1 -1
  13. package/dist/commands/link.js +27 -27
  14. package/dist/commands/link.js.map +1 -1
  15. package/dist/commands/publish.js +87 -34
  16. package/dist/commands/publish.js.map +1 -1
  17. package/dist/commands/release.js +32 -19
  18. package/dist/commands/release.js.map +1 -1
  19. package/dist/commands/review.js +36 -30
  20. package/dist/commands/review.js.map +1 -1
  21. package/dist/commands/select-audio.js +4 -4
  22. package/dist/commands/select-audio.js.map +1 -1
  23. package/dist/commands/tree.js +154 -38
  24. package/dist/commands/tree.js.map +1 -1
  25. package/dist/commands/unlink.js +13 -13
  26. package/dist/commands/unlink.js.map +1 -1
  27. package/dist/commands/updates.js +21 -0
  28. package/dist/commands/updates.js.map +1 -1
  29. package/dist/commands/versions.js +5 -5
  30. package/dist/commands/versions.js.map +1 -1
  31. package/dist/constants.js +4 -4
  32. package/dist/constants.js.map +1 -1
  33. package/dist/content/files.js +4 -4
  34. package/dist/content/files.js.map +1 -1
  35. package/dist/error/CommandErrors.js +1 -65
  36. package/dist/error/CommandErrors.js.map +1 -1
  37. package/dist/logging.js +3 -3
  38. package/dist/logging.js.map +1 -1
  39. package/dist/util/aiAdapter.js +28 -0
  40. package/dist/util/aiAdapter.js.map +1 -0
  41. package/dist/util/general.js +5 -5
  42. package/dist/util/general.js.map +1 -1
  43. package/dist/util/interactive.js +6 -437
  44. package/dist/util/interactive.js.map +1 -1
  45. package/dist/util/loggerAdapter.js +24 -0
  46. package/dist/util/loggerAdapter.js.map +1 -0
  47. package/dist/util/performance.js +4 -4
  48. package/dist/util/performance.js.map +1 -1
  49. package/dist/util/safety.js +4 -4
  50. package/dist/util/safety.js.map +1 -1
  51. package/dist/util/storage.js +2 -2
  52. package/dist/util/storage.js.map +1 -1
  53. package/dist/util/storageAdapter.js +25 -0
  54. package/dist/util/storageAdapter.js.map +1 -0
  55. package/package.json +6 -4
  56. package/test_output.txt +3 -3
  57. package/INTEGRATION-SUMMARY.md +0 -232
  58. package/TEST-STATUS.md +0 -168
  59. package/dist/content/issues.js +0 -331
  60. package/dist/content/issues.js.map +0 -1
  61. package/dist/content/releaseNotes.js +0 -90
  62. package/dist/content/releaseNotes.js.map +0 -1
  63. package/dist/prompt/commit.js +0 -76
  64. package/dist/prompt/commit.js.map +0 -1
  65. package/dist/prompt/instructions/commit.md +0 -133
  66. package/dist/prompt/instructions/release.md +0 -188
  67. package/dist/prompt/instructions/review.md +0 -169
  68. package/dist/prompt/personas/releaser.md +0 -24
  69. package/dist/prompt/personas/you.md +0 -55
  70. package/dist/prompt/release.js +0 -100
  71. package/dist/prompt/release.js.map +0 -1
  72. package/dist/prompt/review.js +0 -64
  73. package/dist/prompt/review.js.map +0 -1
  74. package/dist/util/github.js +0 -1071
  75. package/dist/util/github.js.map +0 -1
  76. package/dist/util/openai.js +0 -365
  77. package/dist/util/openai.js.map +0 -1
@@ -58,70 +58,6 @@ class CommandError extends Error {
58
58
  this.name = 'FileOperationError';
59
59
  }
60
60
  }
61
- /**
62
- * Pull request check failures with detailed information
63
- */ class PullRequestCheckError extends CommandError {
64
- /**
65
- * Get specific instructions based on the type of failures
66
- */ getRecoveryInstructions() {
67
- const instructions = [];
68
- const branchName = this.currentBranch || 'your current branch';
69
- // Analyze failure types for specific guidance
70
- const testFailures = this.failedChecks.filter((check)=>{
71
- var _check_output_title, _check_output;
72
- return check.name.toLowerCase().includes('test') || check.name.toLowerCase().includes('ci') || ((_check_output = check.output) === null || _check_output === void 0 ? void 0 : (_check_output_title = _check_output.title) === null || _check_output_title === void 0 ? void 0 : _check_output_title.toLowerCase().includes('test'));
73
- });
74
- const lintFailures = this.failedChecks.filter((check)=>{
75
- var _check_output_title, _check_output;
76
- return check.name.toLowerCase().includes('lint') || check.name.toLowerCase().includes('style') || ((_check_output = check.output) === null || _check_output === void 0 ? void 0 : (_check_output_title = _check_output.title) === null || _check_output_title === void 0 ? void 0 : _check_output_title.toLowerCase().includes('lint'));
77
- });
78
- const buildFailures = this.failedChecks.filter((check)=>{
79
- var _check_output_title, _check_output;
80
- return check.name.toLowerCase().includes('build') || check.name.toLowerCase().includes('compile') || ((_check_output = check.output) === null || _check_output === void 0 ? void 0 : (_check_output_title = _check_output.title) === null || _check_output_title === void 0 ? void 0 : _check_output_title.toLowerCase().includes('build'));
81
- });
82
- instructions.push('šŸ”§ To fix these failures:');
83
- instructions.push('');
84
- // Specific instructions based on failure types
85
- if (testFailures.length > 0) {
86
- instructions.push('šŸ“‹ Test Failures:');
87
- instructions.push(' • Run tests locally: `npm test` or `yarn test`');
88
- instructions.push(' • Fix failing tests or update test expectations');
89
- instructions.push(' • Consider running specific test files if identified in the failure details');
90
- instructions.push('');
91
- }
92
- if (lintFailures.length > 0) {
93
- instructions.push('šŸŽØ Linting/Style Failures:');
94
- instructions.push(' • Run linter locally: `npm run lint` or `yarn lint`');
95
- instructions.push(' • Auto-fix where possible: `npm run lint:fix` or `yarn lint:fix`');
96
- instructions.push(' • Check code formatting: `npm run format` or `yarn format`');
97
- instructions.push('');
98
- }
99
- if (buildFailures.length > 0) {
100
- instructions.push('šŸ—ļø Build Failures:');
101
- instructions.push(' • Run build locally: `npm run build` or `yarn build`');
102
- instructions.push(' • Check for TypeScript errors: `npx tsc --noEmit`');
103
- instructions.push(' • Review dependency issues and import paths');
104
- instructions.push('');
105
- }
106
- // General workflow instructions
107
- instructions.push('šŸ“¤ After fixing the issues:');
108
- instructions.push(` 1. Stage your changes: \`git add .\``);
109
- instructions.push(` 2. Commit your fixes: \`git commit -m "fix: resolve PR check failures"\``);
110
- instructions.push(` 3. Push to ${branchName}: \`git push origin ${branchName}\``);
111
- instructions.push(` 4. The PR checks will automatically re-run`);
112
- instructions.push('');
113
- instructions.push('šŸ”„ Re-running this command:');
114
- instructions.push(' • The kodrdriv publish command will automatically detect the existing PR');
115
- instructions.push(' • Simply run the same command again after pushing your fixes');
116
- instructions.push(' • You can also manually trigger checks by pushing an empty commit:');
117
- instructions.push(` \`git commit --allow-empty -m "trigger checks" && git push origin ${branchName}\``);
118
- return instructions;
119
- }
120
- constructor(message, prNumber, failedChecks, prUrl, currentBranch){
121
- super(message, 'PR_CHECK_FAILED', true), _define_property(this, "prNumber", void 0), _define_property(this, "failedChecks", void 0), _define_property(this, "prUrl", void 0), _define_property(this, "currentBranch", void 0), this.prNumber = prNumber, this.failedChecks = failedChecks, this.prUrl = prUrl, this.currentBranch = currentBranch;
122
- this.name = 'PullRequestCheckError';
123
- }
124
- }
125
61
 
126
- export { CommandError, ExternalDependencyError, FileOperationError, PullRequestCheckError, UserCancellationError, ValidationError };
62
+ export { CommandError, ExternalDependencyError, FileOperationError, UserCancellationError, ValidationError };
127
63
  //# sourceMappingURL=CommandErrors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommandErrors.js","sources":["../../src/error/CommandErrors.ts"],"sourcesContent":["/**\n * Base class for all command-related errors\n */\nexport class CommandError extends Error {\n public readonly code: string;\n public readonly recoverable: boolean;\n public readonly originalCause?: Error;\n\n constructor(\n message: string,\n code: string,\n recoverable: boolean = false,\n cause?: Error\n ) {\n super(message);\n this.name = 'CommandError';\n this.code = code;\n this.recoverable = recoverable;\n this.originalCause = cause;\n // Also set the standard cause property for compatibility\n if (cause) {\n (this as any).cause = cause;\n }\n }\n}\n\n/**\n * Configuration-related errors (missing config, invalid settings, etc.)\n */\nexport class ConfigurationError extends CommandError {\n constructor(message: string, cause?: Error) {\n super(message, 'CONFIG_ERROR', false, cause);\n this.name = 'ConfigurationError';\n }\n}\n\n/**\n * Validation errors (invalid arguments, missing required data, etc.)\n */\nexport class ValidationError extends CommandError {\n constructor(message: string, cause?: Error) {\n super(message, 'VALIDATION_ERROR', false, cause);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * User cancellation errors (user cancelled operation)\n */\nexport class UserCancellationError extends CommandError {\n constructor(message: string = 'Operation cancelled by user') {\n super(message, 'USER_CANCELLED', true);\n this.name = 'UserCancellationError';\n }\n}\n\n/**\n * External dependency errors (Git, NPM, file system, etc.)\n */\nexport class ExternalDependencyError extends CommandError {\n constructor(message: string, dependency: string, cause?: Error) {\n super(`${dependency}: ${message}`, 'EXTERNAL_DEPENDENCY_ERROR', false, cause);\n this.name = 'ExternalDependencyError';\n }\n}\n\n/**\n * File operation errors (read, write, permissions, etc.)\n */\nexport class FileOperationError extends CommandError {\n constructor(message: string, filePath: string, cause?: Error) {\n super(`File operation failed on ${filePath}: ${message}`, 'FILE_OPERATION_ERROR', false, cause);\n this.name = 'FileOperationError';\n }\n}\n\n/**\n * Pull request check failures with detailed information\n */\nexport class PullRequestCheckError extends CommandError {\n constructor(\n message: string,\n public readonly prNumber: number,\n public readonly failedChecks: Array<{\n name: string;\n conclusion: string;\n detailsUrl?: string;\n summary?: string;\n output?: {\n title?: string;\n summary?: string;\n text?: string;\n };\n }>,\n public readonly prUrl: string,\n public readonly currentBranch?: string\n ) {\n super(message, 'PR_CHECK_FAILED', true);\n this.name = 'PullRequestCheckError';\n }\n\n /**\n * Get specific instructions based on the type of failures\n */\n getRecoveryInstructions(): string[] {\n const instructions: string[] = [];\n const branchName = this.currentBranch || 'your current branch';\n\n // Analyze failure types for specific guidance\n const testFailures = this.failedChecks.filter(check =>\n check.name.toLowerCase().includes('test') ||\n check.name.toLowerCase().includes('ci') ||\n check.output?.title?.toLowerCase().includes('test')\n );\n\n const lintFailures = this.failedChecks.filter(check =>\n check.name.toLowerCase().includes('lint') ||\n check.name.toLowerCase().includes('style') ||\n check.output?.title?.toLowerCase().includes('lint')\n );\n\n const buildFailures = this.failedChecks.filter(check =>\n check.name.toLowerCase().includes('build') ||\n check.name.toLowerCase().includes('compile') ||\n check.output?.title?.toLowerCase().includes('build')\n );\n\n instructions.push('šŸ”§ To fix these failures:');\n instructions.push('');\n\n // Specific instructions based on failure types\n if (testFailures.length > 0) {\n instructions.push('šŸ“‹ Test Failures:');\n instructions.push(' • Run tests locally: `npm test` or `yarn test`');\n instructions.push(' • Fix failing tests or update test expectations');\n instructions.push(' • Consider running specific test files if identified in the failure details');\n instructions.push('');\n }\n\n if (lintFailures.length > 0) {\n instructions.push('šŸŽØ Linting/Style Failures:');\n instructions.push(' • Run linter locally: `npm run lint` or `yarn lint`');\n instructions.push(' • Auto-fix where possible: `npm run lint:fix` or `yarn lint:fix`');\n instructions.push(' • Check code formatting: `npm run format` or `yarn format`');\n instructions.push('');\n }\n\n if (buildFailures.length > 0) {\n instructions.push('šŸ—ļø Build Failures:');\n instructions.push(' • Run build locally: `npm run build` or `yarn build`');\n instructions.push(' • Check for TypeScript errors: `npx tsc --noEmit`');\n instructions.push(' • Review dependency issues and import paths');\n instructions.push('');\n }\n\n // General workflow instructions\n instructions.push('šŸ“¤ After fixing the issues:');\n instructions.push(` 1. Stage your changes: \\`git add .\\``);\n instructions.push(` 2. Commit your fixes: \\`git commit -m \"fix: resolve PR check failures\"\\``);\n instructions.push(` 3. Push to ${branchName}: \\`git push origin ${branchName}\\``);\n instructions.push(` 4. The PR checks will automatically re-run`);\n instructions.push('');\n\n instructions.push('šŸ”„ Re-running this command:');\n instructions.push(' • The kodrdriv publish command will automatically detect the existing PR');\n instructions.push(' • Simply run the same command again after pushing your fixes');\n instructions.push(' • You can also manually trigger checks by pushing an empty commit:');\n instructions.push(` \\`git commit --allow-empty -m \"trigger checks\" && git push origin ${branchName}\\``);\n\n return instructions;\n }\n}\n"],"names":["CommandError","Error","message","code","recoverable","cause","originalCause","name","ValidationError","UserCancellationError","ExternalDependencyError","dependency","FileOperationError","filePath","PullRequestCheckError","getRecoveryInstructions","instructions","branchName","currentBranch","testFailures","failedChecks","filter","check","toLowerCase","includes","output","title","lintFailures","buildFailures","push","length","prNumber","prUrl"],"mappings":"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"}
1
+ {"version":3,"file":"CommandErrors.js","sources":["../../src/error/CommandErrors.ts"],"sourcesContent":["/**\n * Base class for all command-related errors\n */\nexport class CommandError extends Error {\n public readonly code: string;\n public readonly recoverable: boolean;\n public readonly originalCause?: Error;\n\n constructor(\n message: string,\n code: string,\n recoverable: boolean = false,\n cause?: Error\n ) {\n super(message);\n this.name = 'CommandError';\n this.code = code;\n this.recoverable = recoverable;\n this.originalCause = cause;\n // Also set the standard cause property for compatibility\n if (cause) {\n (this as any).cause = cause;\n }\n }\n}\n\n/**\n * Configuration-related errors (missing config, invalid settings, etc.)\n */\nexport class ConfigurationError extends CommandError {\n constructor(message: string, cause?: Error) {\n super(message, 'CONFIG_ERROR', false, cause);\n this.name = 'ConfigurationError';\n }\n}\n\n/**\n * Validation errors (invalid arguments, missing required data, etc.)\n */\nexport class ValidationError extends CommandError {\n constructor(message: string, cause?: Error) {\n super(message, 'VALIDATION_ERROR', false, cause);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * User cancellation errors (user cancelled operation)\n */\nexport class UserCancellationError extends CommandError {\n constructor(message: string = 'Operation cancelled by user') {\n super(message, 'USER_CANCELLED', true);\n this.name = 'UserCancellationError';\n }\n}\n\n/**\n * External dependency errors (Git, NPM, file system, etc.)\n */\nexport class ExternalDependencyError extends CommandError {\n constructor(message: string, dependency: string, cause?: Error) {\n super(`${dependency}: ${message}`, 'EXTERNAL_DEPENDENCY_ERROR', false, cause);\n this.name = 'ExternalDependencyError';\n }\n}\n\n/**\n * File operation errors (read, write, permissions, etc.)\n */\nexport class FileOperationError extends CommandError {\n constructor(message: string, filePath: string, cause?: Error) {\n super(`File operation failed on ${filePath}: ${message}`, 'FILE_OPERATION_ERROR', false, cause);\n this.name = 'FileOperationError';\n }\n}\n\n/**\n * Pull request check failures with detailed information\n */\nexport class PullRequestCheckError extends CommandError {\n constructor(\n message: string,\n public readonly prNumber: number,\n public readonly failedChecks: Array<{\n name: string;\n conclusion: string;\n detailsUrl?: string;\n summary?: string;\n output?: {\n title?: string;\n summary?: string;\n text?: string;\n };\n }>,\n public readonly prUrl: string,\n public readonly currentBranch?: string\n ) {\n super(message, 'PR_CHECK_FAILED', true);\n this.name = 'PullRequestCheckError';\n }\n\n /**\n * Get specific instructions based on the type of failures\n */\n getRecoveryInstructions(): string[] {\n const instructions: string[] = [];\n const branchName = this.currentBranch || 'your current branch';\n\n // Analyze failure types for specific guidance\n const testFailures = this.failedChecks.filter(check =>\n check.name.toLowerCase().includes('test') ||\n check.name.toLowerCase().includes('ci') ||\n check.output?.title?.toLowerCase().includes('test')\n );\n\n const lintFailures = this.failedChecks.filter(check =>\n check.name.toLowerCase().includes('lint') ||\n check.name.toLowerCase().includes('style') ||\n check.output?.title?.toLowerCase().includes('lint')\n );\n\n const buildFailures = this.failedChecks.filter(check =>\n check.name.toLowerCase().includes('build') ||\n check.name.toLowerCase().includes('compile') ||\n check.output?.title?.toLowerCase().includes('build')\n );\n\n instructions.push('šŸ”§ To fix these failures:');\n instructions.push('');\n\n // Specific instructions based on failure types\n if (testFailures.length > 0) {\n instructions.push('šŸ“‹ Test Failures:');\n instructions.push(' • Run tests locally: `npm test` or `yarn test`');\n instructions.push(' • Fix failing tests or update test expectations');\n instructions.push(' • Consider running specific test files if identified in the failure details');\n instructions.push('');\n }\n\n if (lintFailures.length > 0) {\n instructions.push('šŸŽØ Linting/Style Failures:');\n instructions.push(' • Run linter locally: `npm run lint` or `yarn lint`');\n instructions.push(' • Auto-fix where possible: `npm run lint:fix` or `yarn lint:fix`');\n instructions.push(' • Check code formatting: `npm run format` or `yarn format`');\n instructions.push('');\n }\n\n if (buildFailures.length > 0) {\n instructions.push('šŸ—ļø Build Failures:');\n instructions.push(' • Run build locally: `npm run build` or `yarn build`');\n instructions.push(' • Check for TypeScript errors: `npx tsc --noEmit`');\n instructions.push(' • Review dependency issues and import paths');\n instructions.push('');\n }\n\n // General workflow instructions\n instructions.push('šŸ“¤ After fixing the issues:');\n instructions.push(` 1. Stage your changes: \\`git add .\\``);\n instructions.push(` 2. Commit your fixes: \\`git commit -m \"fix: resolve PR check failures\"\\``);\n instructions.push(` 3. Push to ${branchName}: \\`git push origin ${branchName}\\``);\n instructions.push(` 4. The PR checks will automatically re-run`);\n instructions.push('');\n\n instructions.push('šŸ”„ Re-running this command:');\n instructions.push(' • The kodrdriv publish command will automatically detect the existing PR');\n instructions.push(' • Simply run the same command again after pushing your fixes');\n instructions.push(' • You can also manually trigger checks by pushing an empty commit:');\n instructions.push(` \\`git commit --allow-empty -m \"trigger checks\" && git push origin ${branchName}\\``);\n\n return instructions;\n }\n}\n"],"names":["CommandError","Error","message","code","recoverable","cause","originalCause","name","ValidationError","UserCancellationError","ExternalDependencyError","dependency","FileOperationError","filePath"],"mappings":"AAAA;;AAEC,IAAA,SAAA,gBAAA,CAAA,GAAA,EAAA,GAAA,EAAA,KAAA,EAAA;;;;;;;;;;;;;AACM,MAAMA,YAAAA,SAAqBC,KAAAA,CAAAA;IAK9B,WAAA,CACIC,OAAe,EACfC,IAAY,EACZC,cAAuB,KAAK,EAC5BC,KAAa,CACf;AACE,QAAA,KAAK,CAACH,OAAAA,CAAAA,EAVV,gBAAA,CAAA,IAAA,EAAgBC,MAAAA,EAAhB,MAAA,CAAA,EACA,gBAAA,CAAA,IAAA,EAAgBC,aAAAA,EAAhB,MAAA,CAAA,EACA,gBAAA,CAAA,IAAA,EAAgBE,eAAAA,EAAhB,MAAA,CAAA;QASI,IAAI,CAACC,IAAI,GAAG,cAAA;QACZ,IAAI,CAACJ,IAAI,GAAGA,IAAAA;QACZ,IAAI,CAACC,WAAW,GAAGA,WAAAA;QACnB,IAAI,CAACE,aAAa,GAAGD,KAAAA;;AAErB,QAAA,IAAIA,KAAAA,EAAO;YACP,IAAK,CAASA,KAAK,GAAGA,KAAAA;AAC1B,QAAA;AACJ,IAAA;AACJ;AAYA;;IAGO,MAAMG,eAAAA,SAAwBR,YAAAA,CAAAA;IACjC,WAAA,CAAYE,OAAe,EAAEG,KAAa,CAAE;QACxC,KAAK,CAACH,OAAAA,EAAS,kBAAA,EAAoB,KAAA,EAAOG,KAAAA,CAAAA;QAC1C,IAAI,CAACE,IAAI,GAAG,iBAAA;AAChB,IAAA;AACJ;AAEA;;IAGO,MAAME,qBAAAA,SAA8BT,YAAAA,CAAAA;IACvC,WAAA,CAAYE,OAAAA,GAAkB,6BAA6B,CAAE;QACzD,KAAK,CAACA,SAAS,gBAAA,EAAkB,IAAA,CAAA;QACjC,IAAI,CAACK,IAAI,GAAG,uBAAA;AAChB,IAAA;AACJ;AAEA;;IAGO,MAAMG,uBAAAA,SAAgCV,YAAAA,CAAAA;AACzC,IAAA,WAAA,CAAYE,OAAe,EAAES,UAAkB,EAAEN,KAAa,CAAE;QAC5D,KAAK,CAAC,GAAGM,UAAAA,CAAW,EAAE,EAAET,OAAAA,CAAAA,CAAS,EAAE,6BAA6B,KAAA,EAAOG,KAAAA,CAAAA;QACvE,IAAI,CAACE,IAAI,GAAG,yBAAA;AAChB,IAAA;AACJ;AAEA;;IAGO,MAAMK,kBAAAA,SAA2BZ,YAAAA,CAAAA;AACpC,IAAA,WAAA,CAAYE,OAAe,EAAEW,QAAgB,EAAER,KAAa,CAAE;QAC1D,KAAK,CAAC,CAAC,yBAAyB,EAAEQ,QAAAA,CAAS,EAAE,EAAEX,OAAAA,CAAAA,CAAS,EAAE,sBAAA,EAAwB,KAAA,EAAOG,KAAAA,CAAAA;QACzF,IAAI,CAACE,IAAI,GAAG,oBAAA;AAChB,IAAA;AACJ;;;;"}
package/dist/logging.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import winston from 'winston';
2
2
  import * as fs from 'fs';
3
- import path__default from 'path';
3
+ import path from 'path';
4
4
  import { PROGRAM_NAME, DEFAULT_OUTPUT_DIRECTORY, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS } from './constants.js';
5
5
 
6
6
  // Track if debug directory has been ensured for this session
7
7
  let debugDirectoryEnsured = false;
8
8
  const ensureDebugDirectory = ()=>{
9
9
  if (debugDirectoryEnsured) return;
10
- const debugDir = path__default.join(DEFAULT_OUTPUT_DIRECTORY, 'debug');
10
+ const debugDir = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug');
11
11
  try {
12
12
  fs.mkdirSync(debugDir, {
13
13
  recursive: true
@@ -56,7 +56,7 @@ const createTransports = (level)=>{
56
56
  // Add file transport for debug levels (debug and silly)
57
57
  if (level === 'debug' || level === 'silly') {
58
58
  ensureDebugDirectory();
59
- const debugLogPath = path__default.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());
59
+ const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());
60
60
  transports.push(new winston.transports.File({
61
61
  filename: debugLogPath,
62
62
  level: 'debug',
@@ -1 +1 @@
1
- {"version":3,"file":"logging.js","sources":["../src/logging.ts"],"sourcesContent":["import winston from 'winston';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\nimport path from 'path';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, PROGRAM_NAME, DEFAULT_OUTPUT_DIRECTORY } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\n// Track if debug directory has been ensured for this session\nlet debugDirectoryEnsured = false;\n\nconst ensureDebugDirectory = () => {\n if (debugDirectoryEnsured) return;\n\n const debugDir = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug');\n\n try {\n fs.mkdirSync(debugDir, { recursive: true });\n debugDirectoryEnsured = true;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Failed to create debug directory ${debugDir}:`, error);\n }\n};\n\nconst generateDebugLogFilename = () => {\n const now = new Date();\n const timestamp = now.toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\./g, '')\n .replace('T', '-')\n .replace('Z', '');\n\n return `${timestamp}-debug.log`;\n};\n\nconst createTransports = (level: string) => {\n const transports: winston.transport[] = [];\n\n // Always add console transport for info level and above\n if (level === 'info') {\n transports.push(\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ level, message, dryRun }): string => {\n const dryRunPrefix = dryRun ? 'šŸ” DRY RUN: ' : '';\n // For info level messages, don't show the level prefix\n if (level.includes('info')) {\n return `${dryRunPrefix}${String(message)}`;\n }\n // For warn, error, etc., show the level prefix\n return `${level}: ${dryRunPrefix}${String(message)}`;\n })\n )\n })\n );\n } else {\n // For debug/verbose levels, add console transport that shows info and above\n transports.push(\n new winston.transports.Console({\n level: 'info', // Show info, warn, and error on console\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, dryRun, ...meta }): string => {\n // For info level messages, use simpler format without timestamp\n if (level.includes('info')) {\n const dryRunPrefix = dryRun ? 'šŸ” DRY RUN: ' : '';\n return `${dryRunPrefix}${String(message)}`;\n }\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n const dryRunPrefix = dryRun ? 'šŸ” DRY RUN: ' : '';\n return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;\n })\n )\n })\n );\n\n // Add file transport for debug levels (debug and silly)\n if (level === 'debug' || level === 'silly') {\n ensureDebugDirectory();\n\n const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());\n\n transports.push(\n new winston.transports.File({\n filename: debugLogPath,\n level: 'debug', // Capture debug and above in the file\n format: winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${level}: ${message}${metaStr}`;\n })\n )\n })\n );\n }\n }\n\n return transports;\n};\n\nconst createFormat = (level: string) => {\n const baseFormats = [\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n ];\n\n if (level === 'info') {\n return winston.format.combine(\n ...baseFormats,\n winston.format.printf(({ message, dryRun, ..._meta }): string => {\n // Auto-format dry-run messages\n if (dryRun) {\n return `šŸ” DRY RUN: ${message}`;\n }\n return String(message);\n })\n );\n }\n\n return winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n ...baseFormats,\n winston.format.printf(({ timestamp, level, message, dryRun, ...meta }): string => {\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n const dryRunPrefix = dryRun ? 'šŸ” DRY RUN: ' : '';\n return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;\n })\n );\n};\n\n// Create the logger instance once\nconst logger = winston.createLogger({\n level: 'info',\n format: createFormat('info'),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports('info'),\n});\n\nexport const setLogLevel = (level: string) => {\n // Reconfigure the existing logger instead of creating a new one\n logger.configure({\n level,\n format: createFormat(level),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports(level),\n });\n};\n\nexport const getLogger = () => logger;\n\n/**\n * Get a logger that automatically formats messages for dry-run mode\n */\nexport const getDryRunLogger = (isDryRun: boolean) => {\n if (!isDryRun) {\n return logger;\n }\n\n // Return a wrapper that adds dry-run context to all log calls\n return {\n info: (message: string, ...args: any[]) => logger.info(message, { dryRun: true }, ...args),\n warn: (message: string, ...args: any[]) => logger.warn(message, { dryRun: true }, ...args),\n error: (message: string, ...args: any[]) => logger.error(message, { dryRun: true }, ...args),\n debug: (message: string, ...args: any[]) => logger.debug(message, { dryRun: true }, ...args),\n verbose: (message: string, ...args: any[]) => logger.verbose(message, { dryRun: true }, ...args),\n silly: (message: string, ...args: any[]) => logger.silly(message, { dryRun: true }, ...args),\n };\n};\n"],"names":["debugDirectoryEnsured","ensureDebugDirectory","debugDir","path","join","DEFAULT_OUTPUT_DIRECTORY","fs","mkdirSync","recursive","error","console","generateDebugLogFilename","now","Date","timestamp","toISOString","replace","createTransports","level","transports","push","winston","Console","format","combine","colorize","printf","message","dryRun","dryRunPrefix","includes","String","meta","metaStr","Object","keys","length","JSON","stringify","debugLogPath","File","filename","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","errors","stack","splat","createFormat","baseFormats","_meta","logger","createLogger","defaultMeta","service","PROGRAM_NAME","setLogLevel","configure","getLogger","getDryRunLogger","isDryRun","info","args","warn","debug","verbose","silly"],"mappings":"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"}
1
+ {"version":3,"file":"logging.js","sources":["../src/logging.ts"],"sourcesContent":["import winston from 'winston';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\nimport path from 'path';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, PROGRAM_NAME, DEFAULT_OUTPUT_DIRECTORY } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\n// Track if debug directory has been ensured for this session\nlet debugDirectoryEnsured = false;\n\nconst ensureDebugDirectory = () => {\n if (debugDirectoryEnsured) return;\n\n const debugDir = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug');\n\n try {\n fs.mkdirSync(debugDir, { recursive: true });\n debugDirectoryEnsured = true;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Failed to create debug directory ${debugDir}:`, error);\n }\n};\n\nconst generateDebugLogFilename = () => {\n const now = new Date();\n const timestamp = now.toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\./g, '')\n .replace('T', '-')\n .replace('Z', '');\n\n return `${timestamp}-debug.log`;\n};\n\nconst createTransports = (level: string) => {\n const transports: winston.transport[] = [];\n\n // Always add console transport for info level and above\n if (level === 'info') {\n transports.push(\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ level, message, dryRun }): string => {\n const dryRunPrefix = dryRun ? 'šŸ” DRY RUN: ' : '';\n // For info level messages, don't show the level prefix\n if (level.includes('info')) {\n return `${dryRunPrefix}${String(message)}`;\n }\n // For warn, error, etc., show the level prefix\n return `${level}: ${dryRunPrefix}${String(message)}`;\n })\n )\n })\n );\n } else {\n // For debug/verbose levels, add console transport that shows info and above\n transports.push(\n new winston.transports.Console({\n level: 'info', // Show info, warn, and error on console\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, dryRun, ...meta }): string => {\n // For info level messages, use simpler format without timestamp\n if (level.includes('info')) {\n const dryRunPrefix = dryRun ? 'šŸ” DRY RUN: ' : '';\n return `${dryRunPrefix}${String(message)}`;\n }\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n const dryRunPrefix = dryRun ? 'šŸ” DRY RUN: ' : '';\n return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;\n })\n )\n })\n );\n\n // Add file transport for debug levels (debug and silly)\n if (level === 'debug' || level === 'silly') {\n ensureDebugDirectory();\n\n const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());\n\n transports.push(\n new winston.transports.File({\n filename: debugLogPath,\n level: 'debug', // Capture debug and above in the file\n format: winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${level}: ${message}${metaStr}`;\n })\n )\n })\n );\n }\n }\n\n return transports;\n};\n\nconst createFormat = (level: string) => {\n const baseFormats = [\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n ];\n\n if (level === 'info') {\n return winston.format.combine(\n ...baseFormats,\n winston.format.printf(({ message, dryRun, ..._meta }): string => {\n // Auto-format dry-run messages\n if (dryRun) {\n return `šŸ” DRY RUN: ${message}`;\n }\n return String(message);\n })\n );\n }\n\n return winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n ...baseFormats,\n winston.format.printf(({ timestamp, level, message, dryRun, ...meta }): string => {\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n const dryRunPrefix = dryRun ? 'šŸ” DRY RUN: ' : '';\n return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;\n })\n );\n};\n\n// Create the logger instance once\nconst logger = winston.createLogger({\n level: 'info',\n format: createFormat('info'),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports('info'),\n});\n\nexport const setLogLevel = (level: string) => {\n // Reconfigure the existing logger instead of creating a new one\n logger.configure({\n level,\n format: createFormat(level),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports(level),\n });\n};\n\nexport const getLogger = () => logger;\n\n/**\n * Get a logger that automatically formats messages for dry-run mode\n */\nexport const getDryRunLogger = (isDryRun: boolean) => {\n if (!isDryRun) {\n return logger;\n }\n\n // Return a wrapper that adds dry-run context to all log calls\n return {\n info: (message: string, ...args: any[]) => logger.info(message, { dryRun: true }, ...args),\n warn: (message: string, ...args: any[]) => logger.warn(message, { dryRun: true }, ...args),\n error: (message: string, ...args: any[]) => logger.error(message, { dryRun: true }, ...args),\n debug: (message: string, ...args: any[]) => logger.debug(message, { dryRun: true }, ...args),\n verbose: (message: string, ...args: any[]) => logger.verbose(message, { dryRun: true }, ...args),\n silly: (message: string, ...args: any[]) => logger.silly(message, { dryRun: true }, ...args),\n };\n};\n"],"names":["debugDirectoryEnsured","ensureDebugDirectory","debugDir","path","join","DEFAULT_OUTPUT_DIRECTORY","fs","mkdirSync","recursive","error","console","generateDebugLogFilename","now","Date","timestamp","toISOString","replace","createTransports","level","transports","push","winston","Console","format","combine","colorize","printf","message","dryRun","dryRunPrefix","includes","String","meta","metaStr","Object","keys","length","JSON","stringify","debugLogPath","File","filename","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","errors","stack","splat","createFormat","baseFormats","_meta","logger","createLogger","defaultMeta","service","PROGRAM_NAME","setLogLevel","configure","getLogger","getDryRunLogger","isDryRun","info","args","warn","debug","verbose","silly"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Adapter for converting kodrdriv Config to ai-service AIConfig
3
+ */ /**
4
+ * Convert kodrdriv Config to AIConfig
5
+ */ function toAIConfig(config) {
6
+ return {
7
+ apiKey: config.openaiApiKey || process.env.OPENAI_API_KEY,
8
+ model: config.model,
9
+ reasoning: config.openaiReasoning,
10
+ commands: {
11
+ commit: config.commit ? {
12
+ model: config.commit.model,
13
+ reasoning: config.commit.openaiReasoning
14
+ } : undefined,
15
+ release: config.release ? {
16
+ model: config.release.model,
17
+ reasoning: config.release.openaiReasoning
18
+ } : undefined,
19
+ review: config.review ? {
20
+ model: config.review.model,
21
+ reasoning: config.review.openaiReasoning
22
+ } : undefined
23
+ }
24
+ };
25
+ }
26
+
27
+ export { toAIConfig };
28
+ //# sourceMappingURL=aiAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiAdapter.js","sources":["../../src/util/aiAdapter.ts"],"sourcesContent":["/**\n * Adapter for converting kodrdriv Config to ai-service AIConfig\n */\n\nimport type { Config } from '../types';\nimport type { AIConfig } from '@eldrforge/ai-service';\n\n/**\n * Convert kodrdriv Config to AIConfig\n */\nexport function toAIConfig(config: Config): AIConfig {\n return {\n apiKey: (config as any).openaiApiKey || process.env.OPENAI_API_KEY,\n model: config.model,\n reasoning: config.openaiReasoning,\n commands: {\n commit: config.commit ? {\n model: config.commit.model,\n reasoning: config.commit.openaiReasoning,\n } : undefined,\n release: config.release ? {\n model: config.release.model,\n reasoning: config.release.openaiReasoning,\n } : undefined,\n review: config.review ? {\n model: config.review.model,\n reasoning: config.review.openaiReasoning,\n } : undefined,\n },\n };\n}\n\n"],"names":["toAIConfig","config","apiKey","openaiApiKey","process","env","OPENAI_API_KEY","model","reasoning","openaiReasoning","commands","commit","undefined","release","review"],"mappings":"AAAA;;;;IAUO,SAASA,UAAAA,CAAWC,MAAc,EAAA;IACrC,OAAO;AACHC,QAAAA,MAAAA,EAAQ,MAACD,CAAeE,YAAY,IAAIC,OAAAA,CAAQC,GAAG,CAACC,cAAc;AAClEC,QAAAA,KAAAA,EAAON,OAAOM,KAAK;AACnBC,QAAAA,SAAAA,EAAWP,OAAOQ,eAAe;QACjCC,QAAAA,EAAU;YACNC,MAAAA,EAAQV,MAAAA,CAAOU,MAAM,GAAG;gBACpBJ,KAAAA,EAAON,MAAAA,CAAOU,MAAM,CAACJ,KAAK;gBAC1BC,SAAAA,EAAWP,MAAAA,CAAOU,MAAM,CAACF;aAC7B,GAAIG,SAAAA;YACJC,OAAAA,EAASZ,MAAAA,CAAOY,OAAO,GAAG;gBACtBN,KAAAA,EAAON,MAAAA,CAAOY,OAAO,CAACN,KAAK;gBAC3BC,SAAAA,EAAWP,MAAAA,CAAOY,OAAO,CAACJ;aAC9B,GAAIG,SAAAA;YACJE,MAAAA,EAAQb,MAAAA,CAAOa,MAAM,GAAG;gBACpBP,KAAAA,EAAON,MAAAA,CAAOa,MAAM,CAACP,KAAK;gBAC1BC,SAAAA,EAAWP,MAAAA,CAAOa,MAAM,CAACL;aAC7B,GAAIG;AACR;AACJ,KAAA;AACJ;;;;"}
@@ -1,4 +1,4 @@
1
- import path__default from 'path';
1
+ import path from 'path';
2
2
  import { create } from './storage.js';
3
3
  import { getLogger } from '../logging.js';
4
4
  import * as fs from 'fs';
@@ -416,7 +416,7 @@ const confirmVersionInteractively = async (currentVersion, proposedVersion, targ
416
416
  }
417
417
  };
418
418
  const getOutputPath = (outputDirectory, filename)=>{
419
- return path__default.join(outputDirectory, filename);
419
+ return path.join(outputDirectory, filename);
420
420
  };
421
421
  const getTimestampedFilename = (baseName, extension = '.json')=>{
422
422
  const now = new Date();
@@ -471,13 +471,13 @@ const getTimestampedArchivedTranscriptFilename = ()=>{
471
471
  // Ensure the output directory exists (should already be output/kodrdriv)
472
472
  await storage.ensureDirectory(outputDirectory);
473
473
  // Get file extension from original audio file
474
- const originalExtension = path__default.extname(originalAudioPath);
474
+ const originalExtension = path.extname(originalAudioPath);
475
475
  // Generate timestamped filenames
476
476
  const archivedAudioFilename = getTimestampedArchivedAudioFilename(originalExtension);
477
477
  const archivedTranscriptFilename = getTimestampedArchivedTranscriptFilename();
478
478
  // Full paths for archived files - directly in the output directory
479
- const archivedAudioPath = path__default.join(outputDirectory, archivedAudioFilename);
480
- const archivedTranscriptPath = path__default.join(outputDirectory, archivedTranscriptFilename);
479
+ const archivedAudioPath = path.join(outputDirectory, archivedAudioFilename);
480
+ const archivedTranscriptPath = path.join(outputDirectory, archivedTranscriptFilename);
481
481
  // Copy audio file if it exists
482
482
  if (await storage.isFileReadable(originalAudioPath)) {
483
483
  // Read original audio file as buffer using fs directly for binary files
@@ -1 +1 @@
1
- {"version":3,"file":"general.js","sources":["../../src/util/general.ts"],"sourcesContent":["import path from 'path';\nimport * as Storage from './storage';\nimport { getLogger } from '../logging';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\n\n// Utility function for deep merging two objects.\nexport function deepMerge(target: any, source: any): any {\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n if (key === \"__proto__\" || key === \"constructor\") {\n continue; // Skip prototype-polluting keys\n }\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n if (!target[key]) {\n target[key] = {};\n }\n deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n }\n return target;\n}\n\n//Recursive implementation of jSON.stringify;\nexport const stringifyJSON = function (obj: any, options: { depth: number } = { depth: 0 }): string {\n\n if (options.depth > 10) {\n return '{\"error\": \"Maximum depth reached\"}';\n }\n\n const arrOfKeyVals: string[] = [];\n const arrVals: string[] = [];\n let objKeys: string[] = [];\n\n /*********CHECK FOR PRIMITIVE TYPES**********/\n if (typeof obj === 'number' || typeof obj === 'boolean' || obj === null)\n return '' + obj;\n else if (typeof obj === 'string')\n return '\"' + obj + '\"';\n\n /*********CHECK FOR ARRAY**********/\n else if (Array.isArray(obj)) {\n //check for empty array\n if (obj[0] === undefined)\n return '[]';\n else {\n obj.forEach(function (el) {\n arrVals.push(stringifyJSON(el, { depth: options.depth + 1 }));\n });\n return '[' + arrVals + ']';\n }\n }\n /*********CHECK FOR OBJECT**********/\n else if (obj instanceof Object) {\n //get object keys\n objKeys = Object.keys(obj);\n //set key output;\n objKeys.forEach(function (key) {\n const keyOut = '\"' + key + '\":';\n const keyValOut = obj[key];\n //skip functions and undefined properties\n if (keyValOut instanceof Function || keyValOut === undefined)\n arrOfKeyVals.push('');\n else if (typeof keyValOut === 'string')\n arrOfKeyVals.push(keyOut + '\"' + keyValOut + '\"');\n else if (typeof keyValOut === 'boolean' || typeof keyValOut === 'number' || keyValOut === null)\n arrOfKeyVals.push(keyOut + keyValOut);\n //check for nested objects, call recursively until no more objects\n else if (keyValOut instanceof Object) {\n arrOfKeyVals.push(keyOut + stringifyJSON(keyValOut, { depth: options.depth + 1 }));\n }\n });\n return '{' + arrOfKeyVals + '}';\n }\n return '';\n};\n\nexport const incrementPatchVersion = (version: string): string => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split into major.minor.patch and handle pre-release identifiers\n const parts = cleanVersion.split('.');\n if (parts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n // Handle pre-release versions like \"4.6.24-dev.0\"\n // Split the patch part on '-' to separate patch number from pre-release\n const patchPart = parts[2];\n let patchNumber: number;\n let originalPatchString: string;\n let hasPrerelease = false;\n\n if (patchPart.startsWith('-')) {\n // Handle negative patch numbers like \"-1\" or \"-5\" or \"-1-dev.0\"\n const negativeComponents = patchPart.split('-');\n // For \"-1-dev.0\", negativeComponents will be ['', '1', 'dev.0']\n if (negativeComponents.length > 2) {\n // This is a negative number with pre-release like \"-1-dev.0\"\n originalPatchString = `-${negativeComponents[1]}`;\n patchNumber = parseInt(`-${negativeComponents[1]}`, 10);\n hasPrerelease = true;\n } else {\n // This is just a negative number like \"-1\"\n patchNumber = parseInt(patchPart, 10);\n originalPatchString = patchPart;\n }\n } else {\n // Handle normal patch numbers with possible pre-release like \"24-dev.0\"\n const patchComponents = patchPart.split('-');\n originalPatchString = patchComponents[0];\n patchNumber = parseInt(patchComponents[0], 10);\n hasPrerelease = patchComponents.length > 1;\n }\n\n if (isNaN(patchNumber)) {\n throw new Error(`Invalid patch version: ${patchPart}`);\n }\n\n // For pre-release versions, graduate to the base version (drop pre-release identifier)\n // For stable versions, increment the patch number\n const newPatchNumber = hasPrerelease ? originalPatchString : (patchNumber + 1).toString();\n\n // Create clean release version\n const newVersion = `${parts[0]}.${parts[1]}.${newPatchNumber}`;\n\n return newVersion;\n};\n\nexport const incrementMinorVersion = (version: string): string => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split into major.minor.patch and handle pre-release identifiers\n const parts = cleanVersion.split('.');\n if (parts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const majorNumber = parseInt(parts[0], 10);\n const minorPart = parts[1];\n\n // Handle pre-release versions on minor like \"23-dev.0\"\n const minorComponents = minorPart.split('-');\n const minorNumber = parseInt(minorComponents[0], 10);\n\n if (isNaN(majorNumber) || isNaN(minorNumber)) {\n throw new Error(`Invalid version numbers in: ${version}`);\n }\n\n // Increment the minor number and reset patch to 0\n const newMinorNumber = minorNumber + 1;\n const newVersion = `${majorNumber}.${newMinorNumber}.0`;\n\n return newVersion;\n};\n\nexport const incrementMajorVersion = (version: string): string => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split into major.minor.patch and handle pre-release identifiers\n const parts = cleanVersion.split('.');\n if (parts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const majorPart = parts[0];\n\n // Handle pre-release versions on major like \"4-dev.0\"\n const majorComponents = majorPart.split('-');\n const majorNumber = parseInt(majorComponents[0], 10);\n\n if (isNaN(majorNumber)) {\n throw new Error(`Invalid major version number in: ${version}`);\n }\n\n // Increment the major number and reset minor and patch to 0\n const newMajorNumber = majorNumber + 1;\n const newVersion = `${newMajorNumber}.0.0`;\n\n return newVersion;\n};\n\nexport const validateVersionString = (version: string): boolean => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Basic semver regex pattern\n const semverPattern = /^\\d+\\.\\d+\\.\\d+$/;\n return semverPattern.test(cleanVersion);\n};\n\nexport const calculateTargetVersion = (currentVersion: string, targetVersion: string): string => {\n switch (targetVersion.toLowerCase()) {\n case 'patch':\n return incrementPatchVersion(currentVersion);\n case 'minor':\n return incrementMinorVersion(currentVersion);\n case 'major':\n return incrementMajorVersion(currentVersion);\n default:\n // Explicit version provided\n if (!validateVersionString(targetVersion)) {\n throw new Error(`Invalid version format: ${targetVersion}. Expected format: \"x.y.z\" or one of: \"patch\", \"minor\", \"major\"`);\n }\n return targetVersion.startsWith('v') ? targetVersion.slice(1) : targetVersion;\n }\n};\n\n/**\n * Increment prerelease version with a specific tag\n * Examples:\n * - incrementPrereleaseVersion(\"1.2.3-dev.0\", \"dev\") => \"1.2.3-dev.1\"\n * - incrementPrereleaseVersion(\"1.2.3\", \"dev\") => \"1.2.3-dev.0\"\n * - incrementPrereleaseVersion(\"1.2.3-dev.5\", \"test\") => \"1.2.3-test.0\"\n */\nexport const incrementPrereleaseVersion = (version: string, tag: string): string => {\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split on dots but only use first 3 parts for major.minor.patch\n // This handles cases like \"1.2.3-dev.5\" correctly\n const dotParts = cleanVersion.split('.');\n if (dotParts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const major = dotParts[0];\n const minor = dotParts[1];\n\n // Reconstruct the patch part - everything after the second dot\n const patchAndPrerelease = dotParts.slice(2).join('.');\n const patchComponents = patchAndPrerelease.split('-');\n const patchNumber = patchComponents[0];\n\n if (patchComponents.length > 1) {\n // Already has prerelease (e.g., \"3-dev.0\" or \"3-test.2\")\n const prereleaseString = patchComponents.slice(1).join('-'); // Handle multiple dashes\n const prereleaseComponents = prereleaseString.split('.');\n const existingTag = prereleaseComponents[0];\n const existingPrereleaseVersion = prereleaseComponents[1];\n\n if (existingTag === tag) {\n // Same tag, increment the prerelease version\n const prereleaseNumber = parseInt(existingPrereleaseVersion) || 0;\n return `${major}.${minor}.${patchNumber}-${tag}.${prereleaseNumber + 1}`;\n } else {\n // Different tag, start at 0\n return `${major}.${minor}.${patchNumber}-${tag}.0`;\n }\n } else {\n // No prerelease yet, add it\n return `${major}.${minor}.${patchNumber}-${tag}.0`;\n }\n};\n\n/**\n * Convert prerelease version to release version\n * Examples:\n * - convertToReleaseVersion(\"1.2.3-dev.5\") => \"1.2.3\"\n * - convertToReleaseVersion(\"1.2.3-test.2\") => \"1.2.3\"\n * - convertToReleaseVersion(\"1.2.3\") => \"1.2.3\"\n */\nexport const convertToReleaseVersion = (version: string): string => {\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split on dots but only use first 3 parts for major.minor.patch\n const dotParts = cleanVersion.split('.');\n if (dotParts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const major = dotParts[0];\n const minor = dotParts[1];\n\n // Reconstruct the patch part - everything after the second dot\n const patchAndPrerelease = dotParts.slice(2).join('.');\n const patchComponents = patchAndPrerelease.split('-');\n const patchNumber = patchComponents[0];\n\n return `${major}.${minor}.${patchNumber}`;\n};\n\n/**\n * Get version from a specific branch's package.json\n */\nexport const getVersionFromBranch = async (branchName: string): Promise<string | null> => {\n const { runSecure, validateGitRef, safeJsonParse, validatePackageJson } = await import('@eldrforge/git-tools');\n\n try {\n // Validate branch name to prevent injection\n if (!validateGitRef(branchName)) {\n throw new Error(`Invalid branch name: ${branchName}`);\n }\n const { stdout } = await runSecure('git', ['show', `${branchName}:package.json`]);\n const packageJson = safeJsonParse(stdout, 'package.json');\n const validated = validatePackageJson(packageJson, 'package.json');\n return validated.version;\n } catch {\n // Return null if we can't get the version (branch may not exist or no package.json)\n return null;\n }\n};\n\n/**\n * Calculate target version based on branch configuration\n * SEMANTICS: The version config specifies what version should be ON the target branch\n */\nexport const calculateBranchDependentVersion = async (\n currentVersion: string,\n currentBranch: string,\n branchesConfig: any,\n targetBranch?: string\n): Promise<{ version: string; targetBranch: string }> => {\n const { getLogger } = await import('../logging');\n const logger = getLogger();\n\n // Look up the source branch to find the target branch\n if (!branchesConfig || !branchesConfig[currentBranch]) {\n // Use default configuration from constants\n const { KODRDRIV_DEFAULTS } = await import('../constants');\n const defaultConfig = KODRDRIV_DEFAULTS.branches as any;\n\n if (defaultConfig && defaultConfig[currentBranch]) {\n const sourceConfig = defaultConfig[currentBranch];\n const finalTargetBranch = sourceConfig.targetBranch || targetBranch || 'main';\n\n // Look at target branch's version config to determine what version it should have\n const targetConfig = defaultConfig[finalTargetBranch];\n\n logger.info(`šŸŽÆ Using default branch configuration: ${currentBranch} → ${finalTargetBranch}`);\n\n if (!targetConfig?.version) {\n const defaultVersion = incrementPatchVersion(currentVersion);\n logger.debug(`No version config for target branch '${finalTargetBranch}', using default increment`);\n return { version: defaultVersion, targetBranch: finalTargetBranch };\n }\n\n return calculateVersionFromTargetConfig(currentVersion, finalTargetBranch, targetConfig.version, logger);\n }\n\n // No config at all, use traditional defaults\n const defaultTargetBranch = targetBranch || 'main';\n const defaultVersion = incrementPatchVersion(currentVersion);\n logger.debug(`No branch-specific config found for '${currentBranch}', using defaults`);\n return { version: defaultVersion, targetBranch: defaultTargetBranch };\n }\n\n const sourceConfig = branchesConfig[currentBranch];\n const finalTargetBranch = sourceConfig.targetBranch || targetBranch || 'main';\n\n // Look at target branch's version config to determine what version it should have\n const targetConfig = branchesConfig[finalTargetBranch];\n\n logger.info(`šŸŽÆ Using branch-dependent targeting: ${currentBranch} → ${finalTargetBranch}`);\n\n if (!targetConfig?.version) {\n // No version config for target, use default increment\n const defaultVersion = incrementPatchVersion(currentVersion);\n logger.debug(`No version config for target branch '${finalTargetBranch}', using default increment`);\n return { version: defaultVersion, targetBranch: finalTargetBranch };\n }\n\n return calculateVersionFromTargetConfig(currentVersion, finalTargetBranch, targetConfig.version, logger);\n};\n\n/**\n * Calculate version based on target branch configuration\n */\nconst calculateVersionFromTargetConfig = async (\n currentVersion: string,\n targetBranch: string,\n versionConfig: any,\n logger: any\n): Promise<{ version: string; targetBranch: string }> => {\n if (versionConfig.type === 'release') {\n // Convert to release version (remove prerelease tags)\n const releaseVersion = convertToReleaseVersion(currentVersion);\n logger.info(`šŸ“¦ Converting to release version: ${currentVersion} → ${releaseVersion}`);\n return { version: releaseVersion, targetBranch };\n } else if (versionConfig.type === 'prerelease') {\n if (!versionConfig.tag) {\n throw new Error(`Prerelease version type requires a tag in branch configuration`);\n }\n\n const tag = versionConfig.tag;\n\n if (versionConfig.increment) {\n // Check if there's already a version with this tag in the target branch\n const targetBranchVersion = await getVersionFromBranch(targetBranch);\n\n if (targetBranchVersion) {\n // Use the target branch version as the base and increment\n const newVersion = incrementPrereleaseVersion(targetBranchVersion, tag);\n logger.info(`šŸ“¦ Incrementing prerelease in target branch: ${targetBranchVersion} → ${newVersion}`);\n return { version: newVersion, targetBranch };\n } else {\n // No version in target branch, use current version as base\n const newVersion = incrementPrereleaseVersion(currentVersion, tag);\n logger.info(`šŸ“¦ Creating new prerelease version: ${currentVersion} → ${newVersion}`);\n return { version: newVersion, targetBranch };\n }\n } else {\n // Just add/change the prerelease tag without incrementing\n const baseVersion = convertToReleaseVersion(currentVersion);\n const newVersion = `${baseVersion}-${tag}.0`;\n logger.info(`šŸ“¦ Setting prerelease tag: ${currentVersion} → ${newVersion}`);\n return { version: newVersion, targetBranch };\n }\n }\n\n throw new Error(`Invalid version type: ${versionConfig.type}`);\n};\n\n\n/**\n * Find the development branch from branches configuration\n * Returns the branch marked with developmentBranch: true\n */\nexport const findDevelopmentBranch = (branchesConfig: any): string | null => {\n if (!branchesConfig || typeof branchesConfig !== 'object') {\n return null;\n }\n\n for (const [branchName, branchConfig] of Object.entries(branchesConfig)) {\n if (branchConfig && typeof branchConfig === 'object' && (branchConfig as any).developmentBranch === true) {\n return branchName;\n }\n }\n\n return null;\n};\n\n/**\n * Check if two prerelease versions have the same tag\n * Examples:\n * - haveSamePrereleaseTag(\"1.2.3-dev.0\", \"1.2.3-dev.5\") => true\n * - haveSamePrereleaseTag(\"1.2.3-dev.0\", \"1.2.3-test.0\") => false\n * - haveSamePrereleaseTag(\"1.2.3\", \"1.2.3-dev.0\") => false\n */\nexport const haveSamePrereleaseTag = (version1: string, version2: string): boolean => {\n const extractTag = (version: string): string | null => {\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n const parts = cleanVersion.split('.');\n if (parts.length < 3) return null;\n\n const patchAndPrerelease = parts.slice(2).join('.');\n const patchComponents = patchAndPrerelease.split('-');\n\n if (patchComponents.length > 1) {\n const prereleaseString = patchComponents.slice(1).join('-');\n const prereleaseComponents = prereleaseString.split('.');\n return prereleaseComponents[0] || null;\n }\n\n return null;\n };\n\n const tag1 = extractTag(version1);\n const tag2 = extractTag(version2);\n\n return tag1 !== null && tag2 !== null && tag1 === tag2;\n};\n\nexport const checkIfTagExists = async (tagName: string): Promise<boolean> => {\n const { runSecure, validateGitRef } = await import('@eldrforge/git-tools');\n try {\n // Validate tag name to prevent injection\n if (!validateGitRef(tagName)) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\n const { stdout } = await runSecure('git', ['tag', '-l', tagName]);\n return stdout.trim() === tagName;\n } catch {\n // If git command fails, assume tag doesn't exist\n return false;\n }\n};\n\nexport const confirmVersionInteractively = async (currentVersion: string, proposedVersion: string, targetVersionInput?: string): Promise<string> => {\n const { getUserChoice, getUserTextInput, requireTTY } = await import('./interactive');\n const { getLogger } = await import('../logging');\n\n requireTTY('Interactive version confirmation requires a terminal.');\n\n const logger = getLogger();\n logger.info(`\\nšŸ“¦ Version Confirmation:`);\n logger.info(` Current version: ${currentVersion}`);\n logger.info(` Proposed version: ${proposedVersion}`);\n if (targetVersionInput) {\n logger.info(` Target input: ${targetVersionInput}`);\n }\n\n const choices = [\n { key: 'c', label: `Confirm ${proposedVersion}` },\n { key: 'e', label: 'Enter custom version' },\n { key: 'a', label: 'Abort publish' }\n ];\n\n const choice = await getUserChoice('\\nšŸ¤” Confirm the version for this release:', choices);\n\n switch (choice) {\n case 'c':\n return proposedVersion;\n case 'e': {\n const customVersion = await getUserTextInput('\\nšŸ“ Enter the version number (e.g., \"4.30.0\"):');\n if (!validateVersionString(customVersion)) {\n throw new Error(`Invalid version format: ${customVersion}. Expected format: \"x.y.z\"`);\n }\n const cleanCustomVersion = customVersion.startsWith('v') ? customVersion.slice(1) : customVersion;\n logger.info(`āœ… Using custom version: ${cleanCustomVersion}`);\n return cleanCustomVersion;\n }\n case 'a':\n throw new Error('Release aborted by user');\n default:\n throw new Error(`Unexpected choice: ${choice}`);\n }\n};\n\nexport const getOutputPath = (outputDirectory: string, filename: string): string => {\n return path.join(outputDirectory, filename);\n};\n\nexport const getTimestampedFilename = (baseName: string, extension: string = '.json'): string => {\n const now = new Date();\n\n // Format as YYMMdd-HHmm (e.g., 250701-1030)\n const yy = now.getFullYear().toString().slice(-2);\n const mm = (now.getMonth() + 1).toString().padStart(2, '0');\n const dd = now.getDate().toString().padStart(2, '0');\n const hh = now.getHours().toString().padStart(2, '0');\n const min = now.getMinutes().toString().padStart(2, '0');\n\n const timestamp = `${yy}${mm}${dd}-${hh}${min}`;\n\n return `${timestamp}-${baseName}${extension}`;\n};\n\nexport const getTimestampedRequestFilename = (baseName: string): string => {\n return getTimestampedFilename(baseName, '.request.json');\n};\n\nexport const getTimestampedResponseFilename = (baseName: string): string => {\n return getTimestampedFilename(baseName, '.response.json');\n};\n\nexport const getTimestampedCommitFilename = (): string => {\n return getTimestampedFilename('commit-message', '.md');\n};\n\nexport const getTimestampedReleaseNotesFilename = (): string => {\n return getTimestampedFilename('release-notes', '.md');\n};\n\nexport const getTimestampedAudioFilename = (): string => {\n return getTimestampedFilename('audio-recording', '.wav');\n};\n\nexport const getTimestampedTranscriptFilename = (): string => {\n return getTimestampedFilename('audio-transcript', '.md');\n};\n\nexport const getTimestampedReviewFilename = (): string => {\n return getTimestampedFilename('review-analysis', '.md');\n};\n\nexport const getTimestampedReviewNotesFilename = (): string => {\n return getTimestampedFilename('review-notes', '.md');\n};\n\nexport const getTimestampedArchivedAudioFilename = (originalExtension: string = '.wav'): string => {\n return getTimestampedFilename('review-audio', originalExtension);\n};\n\nexport const getTimestampedArchivedTranscriptFilename = (): string => {\n return getTimestampedFilename('review-transcript', '.md');\n};\n\n/**\n * Archives an audio file and its transcription to the output/kodrdriv directory\n * @param originalAudioPath - Path to the original audio file\n * @param transcriptionText - The raw transcription text\n * @param outputDirectory - Base output directory (default: 'output')\n * @returns Object containing the paths where files were archived\n */\nexport const archiveAudio = async (\n originalAudioPath: string,\n transcriptionText: string,\n outputDirectory: string = 'output'\n): Promise<{ audioPath: string; transcriptPath: string }> => {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n\n try {\n // Ensure the output directory exists (should already be output/kodrdriv)\n await storage.ensureDirectory(outputDirectory);\n\n // Get file extension from original audio file\n const originalExtension = path.extname(originalAudioPath);\n\n // Generate timestamped filenames\n const archivedAudioFilename = getTimestampedArchivedAudioFilename(originalExtension);\n const archivedTranscriptFilename = getTimestampedArchivedTranscriptFilename();\n\n // Full paths for archived files - directly in the output directory\n const archivedAudioPath = path.join(outputDirectory, archivedAudioFilename);\n const archivedTranscriptPath = path.join(outputDirectory, archivedTranscriptFilename);\n\n // Copy audio file if it exists\n if (await storage.isFileReadable(originalAudioPath)) {\n // Read original audio file as buffer using fs directly for binary files\n const audioBuffer = await fs.promises.readFile(originalAudioPath);\n await storage.writeFile(archivedAudioPath, audioBuffer, 'binary');\n logger.debug('Archived audio file to: %s', archivedAudioPath);\n } else {\n logger.warn('Original audio file not found or not readable: %s', originalAudioPath);\n }\n\n // Save transcription text\n const transcriptContent = `# Audio Transcription Archive\\n\\n**Original Audio File:** ${originalAudioPath}\\n**Archived:** ${new Date().toISOString()}\\n\\n## Transcription\\n\\n${transcriptionText}`;\n await storage.writeFile(archivedTranscriptPath, transcriptContent, 'utf8');\n logger.debug('Archived transcription to: %s', archivedTranscriptPath);\n\n logger.info('šŸ“ Audio archived successfully - Audio: %s, Transcript: %s', archivedAudioFilename, archivedTranscriptFilename);\n\n return {\n audioPath: archivedAudioPath,\n transcriptPath: archivedTranscriptPath\n };\n\n } catch (error: any) {\n logger.error('Failed to archive audio: %s', error.message);\n throw new Error(`Audio archiving failed: ${error.message}`);\n }\n};\n"],"names":["stringifyJSON","obj","options","depth","arrOfKeyVals","arrVals","objKeys","Array","isArray","undefined","forEach","el","push","Object","keys","key","keyOut","keyValOut","Function","incrementPatchVersion","version","cleanVersion","startsWith","slice","parts","split","length","Error","patchPart","patchNumber","originalPatchString","hasPrerelease","negativeComponents","parseInt","patchComponents","isNaN","newPatchNumber","toString","newVersion","incrementMinorVersion","majorNumber","minorPart","minorComponents","minorNumber","newMinorNumber","incrementMajorVersion","majorPart","majorComponents","newMajorNumber","validateVersionString","semverPattern","test","calculateTargetVersion","currentVersion","targetVersion","toLowerCase","incrementPrereleaseVersion","tag","dotParts","major","minor","patchAndPrerelease","join","prereleaseString","prereleaseComponents","existingTag","existingPrereleaseVersion","prereleaseNumber","convertToReleaseVersion","getVersionFromBranch","branchName","runSecure","validateGitRef","safeJsonParse","validatePackageJson","stdout","packageJson","validated","calculateBranchDependentVersion","currentBranch","branchesConfig","targetBranch","getLogger","logger","KODRDRIV_DEFAULTS","defaultConfig","branches","sourceConfig","finalTargetBranch","targetConfig","info","defaultVersion","debug","calculateVersionFromTargetConfig","defaultTargetBranch","versionConfig","type","releaseVersion","increment","targetBranchVersion","baseVersion","findDevelopmentBranch","branchConfig","entries","developmentBranch","checkIfTagExists","tagName","trim","confirmVersionInteractively","proposedVersion","targetVersionInput","getUserChoice","getUserTextInput","requireTTY","choices","label","choice","customVersion","cleanCustomVersion","getOutputPath","outputDirectory","filename","path","getTimestampedFilename","baseName","extension","now","Date","yy","getFullYear","mm","getMonth","padStart","dd","getDate","hh","getHours","min","getMinutes","timestamp","getTimestampedRequestFilename","getTimestampedResponseFilename","getTimestampedCommitFilename","getTimestampedReleaseNotesFilename","getTimestampedAudioFilename","getTimestampedReviewFilename","getTimestampedReviewNotesFilename","getTimestampedArchivedAudioFilename","originalExtension","getTimestampedArchivedTranscriptFilename","archiveAudio","originalAudioPath","transcriptionText","storage","Storage","log","ensureDirectory","extname","archivedAudioFilename","archivedTranscriptFilename","archivedAudioPath","archivedTranscriptPath","isFileReadable","audioBuffer","fs","promises","readFile","writeFile","warn","transcriptContent","toISOString","audioPath","transcriptPath","error","message"],"mappings":"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"}
1
+ {"version":3,"file":"general.js","sources":["../../src/util/general.ts"],"sourcesContent":["import path from 'path';\nimport * as Storage from './storage';\nimport { getLogger } from '../logging';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\n\n// Utility function for deep merging two objects.\nexport function deepMerge(target: any, source: any): any {\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n if (key === \"__proto__\" || key === \"constructor\") {\n continue; // Skip prototype-polluting keys\n }\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n if (!target[key]) {\n target[key] = {};\n }\n deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n }\n return target;\n}\n\n//Recursive implementation of jSON.stringify;\nexport const stringifyJSON = function (obj: any, options: { depth: number } = { depth: 0 }): string {\n\n if (options.depth > 10) {\n return '{\"error\": \"Maximum depth reached\"}';\n }\n\n const arrOfKeyVals: string[] = [];\n const arrVals: string[] = [];\n let objKeys: string[] = [];\n\n /*********CHECK FOR PRIMITIVE TYPES**********/\n if (typeof obj === 'number' || typeof obj === 'boolean' || obj === null)\n return '' + obj;\n else if (typeof obj === 'string')\n return '\"' + obj + '\"';\n\n /*********CHECK FOR ARRAY**********/\n else if (Array.isArray(obj)) {\n //check for empty array\n if (obj[0] === undefined)\n return '[]';\n else {\n obj.forEach(function (el) {\n arrVals.push(stringifyJSON(el, { depth: options.depth + 1 }));\n });\n return '[' + arrVals + ']';\n }\n }\n /*********CHECK FOR OBJECT**********/\n else if (obj instanceof Object) {\n //get object keys\n objKeys = Object.keys(obj);\n //set key output;\n objKeys.forEach(function (key) {\n const keyOut = '\"' + key + '\":';\n const keyValOut = obj[key];\n //skip functions and undefined properties\n if (keyValOut instanceof Function || keyValOut === undefined)\n arrOfKeyVals.push('');\n else if (typeof keyValOut === 'string')\n arrOfKeyVals.push(keyOut + '\"' + keyValOut + '\"');\n else if (typeof keyValOut === 'boolean' || typeof keyValOut === 'number' || keyValOut === null)\n arrOfKeyVals.push(keyOut + keyValOut);\n //check for nested objects, call recursively until no more objects\n else if (keyValOut instanceof Object) {\n arrOfKeyVals.push(keyOut + stringifyJSON(keyValOut, { depth: options.depth + 1 }));\n }\n });\n return '{' + arrOfKeyVals + '}';\n }\n return '';\n};\n\nexport const incrementPatchVersion = (version: string): string => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split into major.minor.patch and handle pre-release identifiers\n const parts = cleanVersion.split('.');\n if (parts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n // Handle pre-release versions like \"4.6.24-dev.0\"\n // Split the patch part on '-' to separate patch number from pre-release\n const patchPart = parts[2];\n let patchNumber: number;\n let originalPatchString: string;\n let hasPrerelease = false;\n\n if (patchPart.startsWith('-')) {\n // Handle negative patch numbers like \"-1\" or \"-5\" or \"-1-dev.0\"\n const negativeComponents = patchPart.split('-');\n // For \"-1-dev.0\", negativeComponents will be ['', '1', 'dev.0']\n if (negativeComponents.length > 2) {\n // This is a negative number with pre-release like \"-1-dev.0\"\n originalPatchString = `-${negativeComponents[1]}`;\n patchNumber = parseInt(`-${negativeComponents[1]}`, 10);\n hasPrerelease = true;\n } else {\n // This is just a negative number like \"-1\"\n patchNumber = parseInt(patchPart, 10);\n originalPatchString = patchPart;\n }\n } else {\n // Handle normal patch numbers with possible pre-release like \"24-dev.0\"\n const patchComponents = patchPart.split('-');\n originalPatchString = patchComponents[0];\n patchNumber = parseInt(patchComponents[0], 10);\n hasPrerelease = patchComponents.length > 1;\n }\n\n if (isNaN(patchNumber)) {\n throw new Error(`Invalid patch version: ${patchPart}`);\n }\n\n // For pre-release versions, graduate to the base version (drop pre-release identifier)\n // For stable versions, increment the patch number\n const newPatchNumber = hasPrerelease ? originalPatchString : (patchNumber + 1).toString();\n\n // Create clean release version\n const newVersion = `${parts[0]}.${parts[1]}.${newPatchNumber}`;\n\n return newVersion;\n};\n\nexport const incrementMinorVersion = (version: string): string => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split into major.minor.patch and handle pre-release identifiers\n const parts = cleanVersion.split('.');\n if (parts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const majorNumber = parseInt(parts[0], 10);\n const minorPart = parts[1];\n\n // Handle pre-release versions on minor like \"23-dev.0\"\n const minorComponents = minorPart.split('-');\n const minorNumber = parseInt(minorComponents[0], 10);\n\n if (isNaN(majorNumber) || isNaN(minorNumber)) {\n throw new Error(`Invalid version numbers in: ${version}`);\n }\n\n // Increment the minor number and reset patch to 0\n const newMinorNumber = minorNumber + 1;\n const newVersion = `${majorNumber}.${newMinorNumber}.0`;\n\n return newVersion;\n};\n\nexport const incrementMajorVersion = (version: string): string => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split into major.minor.patch and handle pre-release identifiers\n const parts = cleanVersion.split('.');\n if (parts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const majorPart = parts[0];\n\n // Handle pre-release versions on major like \"4-dev.0\"\n const majorComponents = majorPart.split('-');\n const majorNumber = parseInt(majorComponents[0], 10);\n\n if (isNaN(majorNumber)) {\n throw new Error(`Invalid major version number in: ${version}`);\n }\n\n // Increment the major number and reset minor and patch to 0\n const newMajorNumber = majorNumber + 1;\n const newVersion = `${newMajorNumber}.0.0`;\n\n return newVersion;\n};\n\nexport const validateVersionString = (version: string): boolean => {\n // Remove 'v' prefix if present\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Basic semver regex pattern\n const semverPattern = /^\\d+\\.\\d+\\.\\d+$/;\n return semverPattern.test(cleanVersion);\n};\n\nexport const calculateTargetVersion = (currentVersion: string, targetVersion: string): string => {\n switch (targetVersion.toLowerCase()) {\n case 'patch':\n return incrementPatchVersion(currentVersion);\n case 'minor':\n return incrementMinorVersion(currentVersion);\n case 'major':\n return incrementMajorVersion(currentVersion);\n default:\n // Explicit version provided\n if (!validateVersionString(targetVersion)) {\n throw new Error(`Invalid version format: ${targetVersion}. Expected format: \"x.y.z\" or one of: \"patch\", \"minor\", \"major\"`);\n }\n return targetVersion.startsWith('v') ? targetVersion.slice(1) : targetVersion;\n }\n};\n\n/**\n * Increment prerelease version with a specific tag\n * Examples:\n * - incrementPrereleaseVersion(\"1.2.3-dev.0\", \"dev\") => \"1.2.3-dev.1\"\n * - incrementPrereleaseVersion(\"1.2.3\", \"dev\") => \"1.2.3-dev.0\"\n * - incrementPrereleaseVersion(\"1.2.3-dev.5\", \"test\") => \"1.2.3-test.0\"\n */\nexport const incrementPrereleaseVersion = (version: string, tag: string): string => {\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split on dots but only use first 3 parts for major.minor.patch\n // This handles cases like \"1.2.3-dev.5\" correctly\n const dotParts = cleanVersion.split('.');\n if (dotParts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const major = dotParts[0];\n const minor = dotParts[1];\n\n // Reconstruct the patch part - everything after the second dot\n const patchAndPrerelease = dotParts.slice(2).join('.');\n const patchComponents = patchAndPrerelease.split('-');\n const patchNumber = patchComponents[0];\n\n if (patchComponents.length > 1) {\n // Already has prerelease (e.g., \"3-dev.0\" or \"3-test.2\")\n const prereleaseString = patchComponents.slice(1).join('-'); // Handle multiple dashes\n const prereleaseComponents = prereleaseString.split('.');\n const existingTag = prereleaseComponents[0];\n const existingPrereleaseVersion = prereleaseComponents[1];\n\n if (existingTag === tag) {\n // Same tag, increment the prerelease version\n const prereleaseNumber = parseInt(existingPrereleaseVersion) || 0;\n return `${major}.${minor}.${patchNumber}-${tag}.${prereleaseNumber + 1}`;\n } else {\n // Different tag, start at 0\n return `${major}.${minor}.${patchNumber}-${tag}.0`;\n }\n } else {\n // No prerelease yet, add it\n return `${major}.${minor}.${patchNumber}-${tag}.0`;\n }\n};\n\n/**\n * Convert prerelease version to release version\n * Examples:\n * - convertToReleaseVersion(\"1.2.3-dev.5\") => \"1.2.3\"\n * - convertToReleaseVersion(\"1.2.3-test.2\") => \"1.2.3\"\n * - convertToReleaseVersion(\"1.2.3\") => \"1.2.3\"\n */\nexport const convertToReleaseVersion = (version: string): string => {\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n\n // Split on dots but only use first 3 parts for major.minor.patch\n const dotParts = cleanVersion.split('.');\n if (dotParts.length < 3) {\n throw new Error(`Invalid version string: ${version}`);\n }\n\n const major = dotParts[0];\n const minor = dotParts[1];\n\n // Reconstruct the patch part - everything after the second dot\n const patchAndPrerelease = dotParts.slice(2).join('.');\n const patchComponents = patchAndPrerelease.split('-');\n const patchNumber = patchComponents[0];\n\n return `${major}.${minor}.${patchNumber}`;\n};\n\n/**\n * Get version from a specific branch's package.json\n */\nexport const getVersionFromBranch = async (branchName: string): Promise<string | null> => {\n const { runSecure, validateGitRef, safeJsonParse, validatePackageJson } = await import('@eldrforge/git-tools');\n\n try {\n // Validate branch name to prevent injection\n if (!validateGitRef(branchName)) {\n throw new Error(`Invalid branch name: ${branchName}`);\n }\n const { stdout } = await runSecure('git', ['show', `${branchName}:package.json`]);\n const packageJson = safeJsonParse(stdout, 'package.json');\n const validated = validatePackageJson(packageJson, 'package.json');\n return validated.version;\n } catch {\n // Return null if we can't get the version (branch may not exist or no package.json)\n return null;\n }\n};\n\n/**\n * Calculate target version based on branch configuration\n * SEMANTICS: The version config specifies what version should be ON the target branch\n */\nexport const calculateBranchDependentVersion = async (\n currentVersion: string,\n currentBranch: string,\n branchesConfig: any,\n targetBranch?: string\n): Promise<{ version: string; targetBranch: string }> => {\n const { getLogger } = await import('../logging');\n const logger = getLogger();\n\n // Look up the source branch to find the target branch\n if (!branchesConfig || !branchesConfig[currentBranch]) {\n // Use default configuration from constants\n const { KODRDRIV_DEFAULTS } = await import('../constants');\n const defaultConfig = KODRDRIV_DEFAULTS.branches as any;\n\n if (defaultConfig && defaultConfig[currentBranch]) {\n const sourceConfig = defaultConfig[currentBranch];\n const finalTargetBranch = sourceConfig.targetBranch || targetBranch || 'main';\n\n // Look at target branch's version config to determine what version it should have\n const targetConfig = defaultConfig[finalTargetBranch];\n\n logger.info(`šŸŽÆ Using default branch configuration: ${currentBranch} → ${finalTargetBranch}`);\n\n if (!targetConfig?.version) {\n const defaultVersion = incrementPatchVersion(currentVersion);\n logger.debug(`No version config for target branch '${finalTargetBranch}', using default increment`);\n return { version: defaultVersion, targetBranch: finalTargetBranch };\n }\n\n return calculateVersionFromTargetConfig(currentVersion, finalTargetBranch, targetConfig.version, logger);\n }\n\n // No config at all, use traditional defaults\n const defaultTargetBranch = targetBranch || 'main';\n const defaultVersion = incrementPatchVersion(currentVersion);\n logger.debug(`No branch-specific config found for '${currentBranch}', using defaults`);\n return { version: defaultVersion, targetBranch: defaultTargetBranch };\n }\n\n const sourceConfig = branchesConfig[currentBranch];\n const finalTargetBranch = sourceConfig.targetBranch || targetBranch || 'main';\n\n // Look at target branch's version config to determine what version it should have\n const targetConfig = branchesConfig[finalTargetBranch];\n\n logger.info(`šŸŽÆ Using branch-dependent targeting: ${currentBranch} → ${finalTargetBranch}`);\n\n if (!targetConfig?.version) {\n // No version config for target, use default increment\n const defaultVersion = incrementPatchVersion(currentVersion);\n logger.debug(`No version config for target branch '${finalTargetBranch}', using default increment`);\n return { version: defaultVersion, targetBranch: finalTargetBranch };\n }\n\n return calculateVersionFromTargetConfig(currentVersion, finalTargetBranch, targetConfig.version, logger);\n};\n\n/**\n * Calculate version based on target branch configuration\n */\nconst calculateVersionFromTargetConfig = async (\n currentVersion: string,\n targetBranch: string,\n versionConfig: any,\n logger: any\n): Promise<{ version: string; targetBranch: string }> => {\n if (versionConfig.type === 'release') {\n // Convert to release version (remove prerelease tags)\n const releaseVersion = convertToReleaseVersion(currentVersion);\n logger.info(`šŸ“¦ Converting to release version: ${currentVersion} → ${releaseVersion}`);\n return { version: releaseVersion, targetBranch };\n } else if (versionConfig.type === 'prerelease') {\n if (!versionConfig.tag) {\n throw new Error(`Prerelease version type requires a tag in branch configuration`);\n }\n\n const tag = versionConfig.tag;\n\n if (versionConfig.increment) {\n // Check if there's already a version with this tag in the target branch\n const targetBranchVersion = await getVersionFromBranch(targetBranch);\n\n if (targetBranchVersion) {\n // Use the target branch version as the base and increment\n const newVersion = incrementPrereleaseVersion(targetBranchVersion, tag);\n logger.info(`šŸ“¦ Incrementing prerelease in target branch: ${targetBranchVersion} → ${newVersion}`);\n return { version: newVersion, targetBranch };\n } else {\n // No version in target branch, use current version as base\n const newVersion = incrementPrereleaseVersion(currentVersion, tag);\n logger.info(`šŸ“¦ Creating new prerelease version: ${currentVersion} → ${newVersion}`);\n return { version: newVersion, targetBranch };\n }\n } else {\n // Just add/change the prerelease tag without incrementing\n const baseVersion = convertToReleaseVersion(currentVersion);\n const newVersion = `${baseVersion}-${tag}.0`;\n logger.info(`šŸ“¦ Setting prerelease tag: ${currentVersion} → ${newVersion}`);\n return { version: newVersion, targetBranch };\n }\n }\n\n throw new Error(`Invalid version type: ${versionConfig.type}`);\n};\n\n\n/**\n * Find the development branch from branches configuration\n * Returns the branch marked with developmentBranch: true\n */\nexport const findDevelopmentBranch = (branchesConfig: any): string | null => {\n if (!branchesConfig || typeof branchesConfig !== 'object') {\n return null;\n }\n\n for (const [branchName, branchConfig] of Object.entries(branchesConfig)) {\n if (branchConfig && typeof branchConfig === 'object' && (branchConfig as any).developmentBranch === true) {\n return branchName;\n }\n }\n\n return null;\n};\n\n/**\n * Check if two prerelease versions have the same tag\n * Examples:\n * - haveSamePrereleaseTag(\"1.2.3-dev.0\", \"1.2.3-dev.5\") => true\n * - haveSamePrereleaseTag(\"1.2.3-dev.0\", \"1.2.3-test.0\") => false\n * - haveSamePrereleaseTag(\"1.2.3\", \"1.2.3-dev.0\") => false\n */\nexport const haveSamePrereleaseTag = (version1: string, version2: string): boolean => {\n const extractTag = (version: string): string | null => {\n const cleanVersion = version.startsWith('v') ? version.slice(1) : version;\n const parts = cleanVersion.split('.');\n if (parts.length < 3) return null;\n\n const patchAndPrerelease = parts.slice(2).join('.');\n const patchComponents = patchAndPrerelease.split('-');\n\n if (patchComponents.length > 1) {\n const prereleaseString = patchComponents.slice(1).join('-');\n const prereleaseComponents = prereleaseString.split('.');\n return prereleaseComponents[0] || null;\n }\n\n return null;\n };\n\n const tag1 = extractTag(version1);\n const tag2 = extractTag(version2);\n\n return tag1 !== null && tag2 !== null && tag1 === tag2;\n};\n\nexport const checkIfTagExists = async (tagName: string): Promise<boolean> => {\n const { runSecure, validateGitRef } = await import('@eldrforge/git-tools');\n try {\n // Validate tag name to prevent injection\n if (!validateGitRef(tagName)) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\n const { stdout } = await runSecure('git', ['tag', '-l', tagName]);\n return stdout.trim() === tagName;\n } catch {\n // If git command fails, assume tag doesn't exist\n return false;\n }\n};\n\nexport const confirmVersionInteractively = async (currentVersion: string, proposedVersion: string, targetVersionInput?: string): Promise<string> => {\n const { getUserChoice, getUserTextInput, requireTTY } = await import('./interactive');\n const { getLogger } = await import('../logging');\n\n requireTTY('Interactive version confirmation requires a terminal.');\n\n const logger = getLogger();\n logger.info(`\\nšŸ“¦ Version Confirmation:`);\n logger.info(` Current version: ${currentVersion}`);\n logger.info(` Proposed version: ${proposedVersion}`);\n if (targetVersionInput) {\n logger.info(` Target input: ${targetVersionInput}`);\n }\n\n const choices = [\n { key: 'c', label: `Confirm ${proposedVersion}` },\n { key: 'e', label: 'Enter custom version' },\n { key: 'a', label: 'Abort publish' }\n ];\n\n const choice = await getUserChoice('\\nšŸ¤” Confirm the version for this release:', choices);\n\n switch (choice) {\n case 'c':\n return proposedVersion;\n case 'e': {\n const customVersion = await getUserTextInput('\\nšŸ“ Enter the version number (e.g., \"4.30.0\"):');\n if (!validateVersionString(customVersion)) {\n throw new Error(`Invalid version format: ${customVersion}. Expected format: \"x.y.z\"`);\n }\n const cleanCustomVersion = customVersion.startsWith('v') ? customVersion.slice(1) : customVersion;\n logger.info(`āœ… Using custom version: ${cleanCustomVersion}`);\n return cleanCustomVersion;\n }\n case 'a':\n throw new Error('Release aborted by user');\n default:\n throw new Error(`Unexpected choice: ${choice}`);\n }\n};\n\nexport const getOutputPath = (outputDirectory: string, filename: string): string => {\n return path.join(outputDirectory, filename);\n};\n\nexport const getTimestampedFilename = (baseName: string, extension: string = '.json'): string => {\n const now = new Date();\n\n // Format as YYMMdd-HHmm (e.g., 250701-1030)\n const yy = now.getFullYear().toString().slice(-2);\n const mm = (now.getMonth() + 1).toString().padStart(2, '0');\n const dd = now.getDate().toString().padStart(2, '0');\n const hh = now.getHours().toString().padStart(2, '0');\n const min = now.getMinutes().toString().padStart(2, '0');\n\n const timestamp = `${yy}${mm}${dd}-${hh}${min}`;\n\n return `${timestamp}-${baseName}${extension}`;\n};\n\nexport const getTimestampedRequestFilename = (baseName: string): string => {\n return getTimestampedFilename(baseName, '.request.json');\n};\n\nexport const getTimestampedResponseFilename = (baseName: string): string => {\n return getTimestampedFilename(baseName, '.response.json');\n};\n\nexport const getTimestampedCommitFilename = (): string => {\n return getTimestampedFilename('commit-message', '.md');\n};\n\nexport const getTimestampedReleaseNotesFilename = (): string => {\n return getTimestampedFilename('release-notes', '.md');\n};\n\nexport const getTimestampedAudioFilename = (): string => {\n return getTimestampedFilename('audio-recording', '.wav');\n};\n\nexport const getTimestampedTranscriptFilename = (): string => {\n return getTimestampedFilename('audio-transcript', '.md');\n};\n\nexport const getTimestampedReviewFilename = (): string => {\n return getTimestampedFilename('review-analysis', '.md');\n};\n\nexport const getTimestampedReviewNotesFilename = (): string => {\n return getTimestampedFilename('review-notes', '.md');\n};\n\nexport const getTimestampedArchivedAudioFilename = (originalExtension: string = '.wav'): string => {\n return getTimestampedFilename('review-audio', originalExtension);\n};\n\nexport const getTimestampedArchivedTranscriptFilename = (): string => {\n return getTimestampedFilename('review-transcript', '.md');\n};\n\n/**\n * Archives an audio file and its transcription to the output/kodrdriv directory\n * @param originalAudioPath - Path to the original audio file\n * @param transcriptionText - The raw transcription text\n * @param outputDirectory - Base output directory (default: 'output')\n * @returns Object containing the paths where files were archived\n */\nexport const archiveAudio = async (\n originalAudioPath: string,\n transcriptionText: string,\n outputDirectory: string = 'output'\n): Promise<{ audioPath: string; transcriptPath: string }> => {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n\n try {\n // Ensure the output directory exists (should already be output/kodrdriv)\n await storage.ensureDirectory(outputDirectory);\n\n // Get file extension from original audio file\n const originalExtension = path.extname(originalAudioPath);\n\n // Generate timestamped filenames\n const archivedAudioFilename = getTimestampedArchivedAudioFilename(originalExtension);\n const archivedTranscriptFilename = getTimestampedArchivedTranscriptFilename();\n\n // Full paths for archived files - directly in the output directory\n const archivedAudioPath = path.join(outputDirectory, archivedAudioFilename);\n const archivedTranscriptPath = path.join(outputDirectory, archivedTranscriptFilename);\n\n // Copy audio file if it exists\n if (await storage.isFileReadable(originalAudioPath)) {\n // Read original audio file as buffer using fs directly for binary files\n const audioBuffer = await fs.promises.readFile(originalAudioPath);\n await storage.writeFile(archivedAudioPath, audioBuffer, 'binary');\n logger.debug('Archived audio file to: %s', archivedAudioPath);\n } else {\n logger.warn('Original audio file not found or not readable: %s', originalAudioPath);\n }\n\n // Save transcription text\n const transcriptContent = `# Audio Transcription Archive\\n\\n**Original Audio File:** ${originalAudioPath}\\n**Archived:** ${new Date().toISOString()}\\n\\n## Transcription\\n\\n${transcriptionText}`;\n await storage.writeFile(archivedTranscriptPath, transcriptContent, 'utf8');\n logger.debug('Archived transcription to: %s', archivedTranscriptPath);\n\n logger.info('šŸ“ Audio archived successfully - Audio: %s, Transcript: %s', archivedAudioFilename, archivedTranscriptFilename);\n\n return {\n audioPath: archivedAudioPath,\n transcriptPath: archivedTranscriptPath\n };\n\n } catch (error: any) {\n logger.error('Failed to archive audio: %s', error.message);\n throw new Error(`Audio archiving failed: ${error.message}`);\n }\n};\n"],"names":["stringifyJSON","obj","options","depth","arrOfKeyVals","arrVals","objKeys","Array","isArray","undefined","forEach","el","push","Object","keys","key","keyOut","keyValOut","Function","incrementPatchVersion","version","cleanVersion","startsWith","slice","parts","split","length","Error","patchPart","patchNumber","originalPatchString","hasPrerelease","negativeComponents","parseInt","patchComponents","isNaN","newPatchNumber","toString","newVersion","incrementMinorVersion","majorNumber","minorPart","minorComponents","minorNumber","newMinorNumber","incrementMajorVersion","majorPart","majorComponents","newMajorNumber","validateVersionString","semverPattern","test","calculateTargetVersion","currentVersion","targetVersion","toLowerCase","incrementPrereleaseVersion","tag","dotParts","major","minor","patchAndPrerelease","join","prereleaseString","prereleaseComponents","existingTag","existingPrereleaseVersion","prereleaseNumber","convertToReleaseVersion","getVersionFromBranch","branchName","runSecure","validateGitRef","safeJsonParse","validatePackageJson","stdout","packageJson","validated","calculateBranchDependentVersion","currentBranch","branchesConfig","targetBranch","getLogger","logger","KODRDRIV_DEFAULTS","defaultConfig","branches","sourceConfig","finalTargetBranch","targetConfig","info","defaultVersion","debug","calculateVersionFromTargetConfig","defaultTargetBranch","versionConfig","type","releaseVersion","increment","targetBranchVersion","baseVersion","findDevelopmentBranch","branchConfig","entries","developmentBranch","checkIfTagExists","tagName","trim","confirmVersionInteractively","proposedVersion","targetVersionInput","getUserChoice","getUserTextInput","requireTTY","choices","label","choice","customVersion","cleanCustomVersion","getOutputPath","outputDirectory","filename","path","getTimestampedFilename","baseName","extension","now","Date","yy","getFullYear","mm","getMonth","padStart","dd","getDate","hh","getHours","min","getMinutes","timestamp","getTimestampedRequestFilename","getTimestampedResponseFilename","getTimestampedCommitFilename","getTimestampedReleaseNotesFilename","getTimestampedAudioFilename","getTimestampedReviewFilename","getTimestampedReviewNotesFilename","getTimestampedArchivedAudioFilename","originalExtension","getTimestampedArchivedTranscriptFilename","archiveAudio","originalAudioPath","transcriptionText","storage","Storage","log","ensureDirectory","extname","archivedAudioFilename","archivedTranscriptFilename","archivedAudioPath","archivedTranscriptPath","isFileReadable","audioBuffer","fs","promises","readFile","writeFile","warn","transcriptContent","toISOString","audioPath","transcriptPath","error","message"],"mappings":"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"}