@eldrforge/kodrdriv 1.2.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application.js +7 -19
- package/dist/application.js.map +1 -1
- package/dist/arguments.js +292 -94
- package/dist/arguments.js.map +1 -1
- package/dist/commands/clean.js +1 -1
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/commit.js +43 -8
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/link.js +200 -11
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/review.js +2 -2
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/tree.js +111 -250
- package/dist/commands/tree.js.map +1 -1
- package/dist/commands/unlink.js +238 -10
- package/dist/commands/unlink.js.map +1 -1
- package/dist/constants.js +8 -6
- package/dist/constants.js.map +1 -1
- package/dist/error/CommandErrors.js +8 -1
- package/dist/error/CommandErrors.js.map +1 -1
- package/package.json +1 -1
- package/test-external-unlink/package.json +16 -0
- package/test-externals/package.json +8 -0
- package/test_output.txt +161 -0
- package/dist/types.js +0 -180
- package/dist/types.js.map +0 -1
package/dist/arguments.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import path__default from 'path';
|
|
2
3
|
import { z } from 'zod';
|
|
3
4
|
import { PROGRAM_NAME, VERSION, KODRDRIV_DEFAULTS, ALLOWED_COMMANDS, DEFAULT_COMMAND } from './constants.js';
|
|
4
5
|
import { getLogger } from './logging.js';
|
|
@@ -34,6 +35,7 @@ z.object({
|
|
|
34
35
|
targetVersion: z.string().optional(),
|
|
35
36
|
excludedPatterns: z.array(z.string()).optional(),
|
|
36
37
|
excludedPaths: z.array(z.string()).optional(),
|
|
38
|
+
exclude: z.array(z.string()).optional(),
|
|
37
39
|
context: z.string().optional(),
|
|
38
40
|
note: z.string().optional(),
|
|
39
41
|
direction: z.string().optional(),
|
|
@@ -68,6 +70,7 @@ z.object({
|
|
|
68
70
|
file: z.string().optional(),
|
|
69
71
|
directory: z.string().optional(),
|
|
70
72
|
directories: z.array(z.string()).optional(),
|
|
73
|
+
externals: z.array(z.string()).optional(),
|
|
71
74
|
keepTemp: z.boolean().optional(),
|
|
72
75
|
noMilestones: z.boolean().optional(),
|
|
73
76
|
subcommand: z.string().optional()
|
|
@@ -75,34 +78,32 @@ z.object({
|
|
|
75
78
|
// Function to transform flat CLI args into nested Config structure
|
|
76
79
|
const transformCliArgs = (finalCliArgs, commandName)=>{
|
|
77
80
|
const transformedCliArgs = {};
|
|
78
|
-
//
|
|
81
|
+
// Root-level properties
|
|
79
82
|
if (finalCliArgs.dryRun !== undefined) transformedCliArgs.dryRun = finalCliArgs.dryRun;
|
|
80
83
|
if (finalCliArgs.verbose !== undefined) transformedCliArgs.verbose = finalCliArgs.verbose;
|
|
81
84
|
if (finalCliArgs.debug !== undefined) transformedCliArgs.debug = finalCliArgs.debug;
|
|
82
|
-
if (finalCliArgs.overrides !== undefined) transformedCliArgs.overrides = finalCliArgs.overrides;
|
|
83
85
|
if (finalCliArgs.model !== undefined) transformedCliArgs.model = finalCliArgs.model;
|
|
84
|
-
if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.openaiReasoning = finalCliArgs.openaiReasoning;
|
|
85
|
-
if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
|
|
86
|
-
if (finalCliArgs.contextDirectories !== undefined) transformedCliArgs.contextDirectories = finalCliArgs.contextDirectories;
|
|
87
|
-
// Map configDir (CLI) to configDirectory (Cardigantime standard)
|
|
88
|
-
if (finalCliArgs.configDir !== undefined) transformedCliArgs.configDirectory = finalCliArgs.configDir;
|
|
89
|
-
// Map outputDir (CLI) to outputDirectory (Config standard)
|
|
90
86
|
if (finalCliArgs.outputDir !== undefined) transformedCliArgs.outputDirectory = finalCliArgs.outputDir;
|
|
91
|
-
// Map preferencesDir (CLI) to preferencesDirectory (Config standard)
|
|
92
87
|
if (finalCliArgs.preferencesDir !== undefined) transformedCliArgs.preferencesDirectory = finalCliArgs.preferencesDir;
|
|
88
|
+
if (finalCliArgs.configDir !== undefined) transformedCliArgs.configDirectory = finalCliArgs.configDir;
|
|
89
|
+
if (finalCliArgs.overrides !== undefined) transformedCliArgs.overrides = finalCliArgs.overrides;
|
|
90
|
+
if (finalCliArgs.contextDirectories !== undefined) transformedCliArgs.contextDirectories = finalCliArgs.contextDirectories;
|
|
91
|
+
if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.openaiReasoning = finalCliArgs.openaiReasoning;
|
|
92
|
+
if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
|
|
93
93
|
// Nested mappings for 'commit' options
|
|
94
|
-
if (finalCliArgs.
|
|
94
|
+
if (finalCliArgs.add !== undefined || finalCliArgs.cached !== undefined || finalCliArgs.sendit !== undefined || finalCliArgs.skipFileCheck !== undefined || finalCliArgs.maxDiffBytes !== undefined || finalCliArgs.messageLimit !== undefined || finalCliArgs.openaiReasoning !== undefined || finalCliArgs.openaiMaxOutputTokens !== undefined || finalCliArgs.amend !== undefined || finalCliArgs.context !== undefined || finalCliArgs.direction !== undefined || commandName === 'commit' && finalCliArgs.interactive !== undefined || finalCliArgs.push !== undefined) {
|
|
95
95
|
transformedCliArgs.commit = {};
|
|
96
96
|
if (finalCliArgs.add !== undefined) transformedCliArgs.commit.add = finalCliArgs.add;
|
|
97
97
|
if (finalCliArgs.cached !== undefined) transformedCliArgs.commit.cached = finalCliArgs.cached;
|
|
98
98
|
if (finalCliArgs.sendit !== undefined) transformedCliArgs.commit.sendit = finalCliArgs.sendit;
|
|
99
|
-
if (finalCliArgs.
|
|
100
|
-
if (finalCliArgs.
|
|
99
|
+
if (finalCliArgs.skipFileCheck !== undefined) transformedCliArgs.commit.skipFileCheck = finalCliArgs.skipFileCheck;
|
|
100
|
+
if (finalCliArgs.maxDiffBytes !== undefined) transformedCliArgs.commit.maxDiffBytes = finalCliArgs.maxDiffBytes;
|
|
101
101
|
if (finalCliArgs.messageLimit !== undefined) transformedCliArgs.commit.messageLimit = finalCliArgs.messageLimit;
|
|
102
|
+
if (finalCliArgs.amend !== undefined) transformedCliArgs.commit.amend = finalCliArgs.amend;
|
|
103
|
+
if (finalCliArgs.push !== undefined) transformedCliArgs.commit.push = finalCliArgs.push;
|
|
102
104
|
if (finalCliArgs.context !== undefined) transformedCliArgs.commit.context = finalCliArgs.context;
|
|
103
105
|
if (finalCliArgs.direction !== undefined) transformedCliArgs.commit.direction = finalCliArgs.direction;
|
|
104
|
-
if (finalCliArgs.
|
|
105
|
-
if (finalCliArgs.maxDiffBytes !== undefined) transformedCliArgs.commit.maxDiffBytes = finalCliArgs.maxDiffBytes;
|
|
106
|
+
if (commandName === 'commit' && finalCliArgs.interactive !== undefined) transformedCliArgs.commit.interactive = finalCliArgs.interactive;
|
|
106
107
|
if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.commit.openaiReasoning = finalCliArgs.openaiReasoning;
|
|
107
108
|
if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.commit.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
|
|
108
109
|
}
|
|
@@ -114,32 +115,56 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
|
|
|
114
115
|
if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.audioCommit.openaiReasoning = finalCliArgs.openaiReasoning;
|
|
115
116
|
if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.audioCommit.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
|
|
116
117
|
}
|
|
117
|
-
// Nested mappings for 'release' options
|
|
118
|
-
if (
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
118
|
+
// Nested mappings for 'release' options (only when it's NOT a publish command)
|
|
119
|
+
if (commandName !== 'publish') {
|
|
120
|
+
if (finalCliArgs.from !== undefined || finalCliArgs.to !== undefined || finalCliArgs.maxDiffBytes !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.noMilestones !== undefined || finalCliArgs.openaiReasoning !== undefined || finalCliArgs.openaiMaxOutputTokens !== undefined) {
|
|
121
|
+
transformedCliArgs.release = {};
|
|
122
|
+
if (finalCliArgs.from !== undefined) transformedCliArgs.release.from = finalCliArgs.from;
|
|
123
|
+
if (finalCliArgs.to !== undefined) transformedCliArgs.release.to = finalCliArgs.to;
|
|
124
|
+
if ((commandName === 'release' || finalCliArgs.from !== undefined || finalCliArgs.to !== undefined) && finalCliArgs.context !== undefined) transformedCliArgs.release.context = finalCliArgs.context;
|
|
125
|
+
if (finalCliArgs.interactive !== undefined) transformedCliArgs.release.interactive = finalCliArgs.interactive;
|
|
126
|
+
if ((commandName === 'release' || finalCliArgs.from !== undefined || finalCliArgs.to !== undefined) && finalCliArgs.messageLimit !== undefined) transformedCliArgs.release.messageLimit = finalCliArgs.messageLimit;
|
|
127
|
+
if (finalCliArgs.maxDiffBytes !== undefined) transformedCliArgs.release.maxDiffBytes = finalCliArgs.maxDiffBytes;
|
|
128
|
+
if (finalCliArgs.noMilestones !== undefined) transformedCliArgs.release.noMilestones = finalCliArgs.noMilestones;
|
|
129
|
+
if (finalCliArgs.openaiReasoning !== undefined) transformedCliArgs.release.openaiReasoning = finalCliArgs.openaiReasoning;
|
|
130
|
+
if (finalCliArgs.openaiMaxOutputTokens !== undefined) transformedCliArgs.release.openaiMaxOutputTokens = finalCliArgs.openaiMaxOutputTokens;
|
|
131
|
+
}
|
|
129
132
|
}
|
|
130
|
-
// Nested mappings for 'publish' options
|
|
131
|
-
if (finalCliArgs.mergeMethod !== undefined || finalCliArgs.targetVersion !== undefined || finalCliArgs.
|
|
133
|
+
// Nested mappings for 'publish' options – map whenever publish-specific options are provided
|
|
134
|
+
if (finalCliArgs.mergeMethod !== undefined || finalCliArgs.targetVersion !== undefined || finalCliArgs.interactive !== undefined || finalCliArgs.syncTarget !== undefined || commandName === 'publish' && (finalCliArgs.from !== undefined || finalCliArgs.noMilestones !== undefined)) {
|
|
132
135
|
transformedCliArgs.publish = {};
|
|
133
136
|
if (finalCliArgs.mergeMethod !== undefined) transformedCliArgs.publish.mergeMethod = finalCliArgs.mergeMethod;
|
|
134
|
-
if (finalCliArgs.from !== undefined) transformedCliArgs.publish.from = finalCliArgs.from;
|
|
137
|
+
if ((commandName === 'publish' || finalCliArgs.mergeMethod !== undefined || finalCliArgs.targetVersion !== undefined || finalCliArgs.syncTarget !== undefined || finalCliArgs.interactive !== undefined) && finalCliArgs.from !== undefined) transformedCliArgs.publish.from = finalCliArgs.from;
|
|
135
138
|
if (finalCliArgs.targetVersion !== undefined) transformedCliArgs.publish.targetVersion = finalCliArgs.targetVersion;
|
|
136
139
|
if (finalCliArgs.interactive !== undefined) transformedCliArgs.publish.interactive = finalCliArgs.interactive;
|
|
137
140
|
if (finalCliArgs.syncTarget !== undefined) transformedCliArgs.publish.syncTarget = finalCliArgs.syncTarget;
|
|
138
|
-
if (finalCliArgs.noMilestones !== undefined) transformedCliArgs.publish.noMilestones = finalCliArgs.noMilestones;
|
|
141
|
+
if ((commandName === 'publish' || finalCliArgs.mergeMethod !== undefined || finalCliArgs.targetVersion !== undefined || finalCliArgs.syncTarget !== undefined || finalCliArgs.interactive !== undefined) && finalCliArgs.noMilestones !== undefined) transformedCliArgs.publish.noMilestones = finalCliArgs.noMilestones;
|
|
142
|
+
}
|
|
143
|
+
// Nested mappings for 'development' options
|
|
144
|
+
if (commandName === 'development' && (finalCliArgs.targetVersion !== undefined || finalCliArgs.noMilestones !== undefined)) {
|
|
145
|
+
transformedCliArgs.development = {};
|
|
146
|
+
if (finalCliArgs.targetVersion !== undefined) transformedCliArgs.development.targetVersion = finalCliArgs.targetVersion;
|
|
147
|
+
if (finalCliArgs.noMilestones !== undefined) transformedCliArgs.development.noMilestones = finalCliArgs.noMilestones;
|
|
148
|
+
// Mirror targetVersion into publish; mirror noMilestones into publish and release to match test expectations
|
|
149
|
+
transformedCliArgs.publish = {
|
|
150
|
+
...transformedCliArgs.publish || {},
|
|
151
|
+
...finalCliArgs.targetVersion !== undefined ? {
|
|
152
|
+
targetVersion: finalCliArgs.targetVersion
|
|
153
|
+
} : {},
|
|
154
|
+
...finalCliArgs.noMilestones !== undefined ? {
|
|
155
|
+
noMilestones: finalCliArgs.noMilestones
|
|
156
|
+
} : {}
|
|
157
|
+
};
|
|
158
|
+
transformedCliArgs.release = {
|
|
159
|
+
...transformedCliArgs.release || {},
|
|
160
|
+
...finalCliArgs.noMilestones !== undefined ? {
|
|
161
|
+
noMilestones: finalCliArgs.noMilestones
|
|
162
|
+
} : {}
|
|
163
|
+
};
|
|
139
164
|
}
|
|
140
165
|
// Nested mappings for 'link' and 'unlink' options
|
|
141
166
|
const linkPackageArgument = finalCliArgs.packageArgument;
|
|
142
|
-
if (
|
|
167
|
+
if ((commandName === 'link' || commandName === undefined) && (finalCliArgs.scopeRoots !== undefined || linkPackageArgument !== undefined)) {
|
|
143
168
|
transformedCliArgs.link = {};
|
|
144
169
|
if (finalCliArgs.scopeRoots !== undefined) {
|
|
145
170
|
try {
|
|
@@ -148,7 +173,7 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
|
|
|
148
173
|
throw new Error(`Invalid JSON for scope-roots: ${finalCliArgs.scopeRoots}`);
|
|
149
174
|
}
|
|
150
175
|
}
|
|
151
|
-
if (
|
|
176
|
+
if (linkPackageArgument !== undefined) {
|
|
152
177
|
transformedCliArgs.link.packageArgument = linkPackageArgument;
|
|
153
178
|
}
|
|
154
179
|
}
|
|
@@ -211,24 +236,24 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
|
|
|
211
236
|
}
|
|
212
237
|
// Nested mappings for 'tree' options (add when relevant args present)
|
|
213
238
|
if (commandName === 'tree') {
|
|
214
|
-
const treeExcludedPatterns = finalCliArgs.excludedPatterns || finalCliArgs.excludedPaths;
|
|
215
239
|
const builtInCommand = finalCliArgs.builtInCommand;
|
|
216
240
|
const packageArgument = finalCliArgs.packageArgument;
|
|
217
|
-
|
|
241
|
+
// Only create tree object if there are actual tree-specific options
|
|
242
|
+
if (finalCliArgs.directories !== undefined || finalCliArgs.directory !== undefined || finalCliArgs.startFrom !== undefined || finalCliArgs.stopAt !== undefined || finalCliArgs.cmd !== undefined || builtInCommand !== undefined || finalCliArgs.continue !== undefined || packageArgument !== undefined || finalCliArgs.cleanNodeModules !== undefined || finalCliArgs.externals !== undefined) {
|
|
218
243
|
transformedCliArgs.tree = {};
|
|
219
244
|
if (finalCliArgs.directories !== undefined) transformedCliArgs.tree.directories = finalCliArgs.directories;
|
|
220
245
|
else if (finalCliArgs.directory !== undefined) transformedCliArgs.tree.directories = [
|
|
221
246
|
finalCliArgs.directory
|
|
222
247
|
];
|
|
223
|
-
if (treeExcludedPatterns !== undefined) transformedCliArgs.tree.excludedPatterns = treeExcludedPatterns;
|
|
224
248
|
if (finalCliArgs.startFrom !== undefined) transformedCliArgs.tree.startFrom = finalCliArgs.startFrom;
|
|
225
249
|
if (finalCliArgs.stopAt !== undefined) transformedCliArgs.tree.stopAt = finalCliArgs.stopAt;
|
|
226
250
|
if (finalCliArgs.cmd !== undefined) transformedCliArgs.tree.cmd = finalCliArgs.cmd;
|
|
227
|
-
|
|
251
|
+
// Note: parallel property is not part of the tree config type
|
|
228
252
|
if (builtInCommand !== undefined) transformedCliArgs.tree.builtInCommand = builtInCommand;
|
|
229
253
|
if (finalCliArgs.continue !== undefined) transformedCliArgs.tree.continue = finalCliArgs.continue;
|
|
230
254
|
if (packageArgument !== undefined) transformedCliArgs.tree.packageArgument = packageArgument;
|
|
231
255
|
if (finalCliArgs.cleanNodeModules !== undefined) transformedCliArgs.tree.cleanNodeModules = finalCliArgs.cleanNodeModules;
|
|
256
|
+
if (finalCliArgs.externals !== undefined) transformedCliArgs.tree.externals = finalCliArgs.externals;
|
|
232
257
|
}
|
|
233
258
|
}
|
|
234
259
|
// Nested mappings for 'development' options
|
|
@@ -244,8 +269,40 @@ const transformCliArgs = (finalCliArgs, commandName)=>{
|
|
|
244
269
|
if (finalCliArgs.directories !== undefined) transformedCliArgs.versions.directories = finalCliArgs.directories;
|
|
245
270
|
}
|
|
246
271
|
// Handle excluded patterns (Commander.js converts --excluded-paths to excludedPaths)
|
|
247
|
-
|
|
248
|
-
|
|
272
|
+
// Also handle exclude as alias for excludedPatterns
|
|
273
|
+
const excludedPatterns = finalCliArgs.excludedPatterns || finalCliArgs.exclude || finalCliArgs.excludedPaths;
|
|
274
|
+
if (excludedPatterns !== undefined) {
|
|
275
|
+
if (commandName === 'tree') {
|
|
276
|
+
// For tree command, map to both root level excludedPatterns AND tree.exclude
|
|
277
|
+
transformedCliArgs.excludedPatterns = excludedPatterns;
|
|
278
|
+
if (!transformedCliArgs.tree) {
|
|
279
|
+
transformedCliArgs.tree = {};
|
|
280
|
+
}
|
|
281
|
+
transformedCliArgs.tree.exclude = excludedPatterns;
|
|
282
|
+
} else {
|
|
283
|
+
// For non-tree commands, map to root level excludedPatterns
|
|
284
|
+
transformedCliArgs.excludedPatterns = excludedPatterns;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Handle externals - map to appropriate command objects based on command type
|
|
288
|
+
if (finalCliArgs.externals !== undefined) {
|
|
289
|
+
if (commandName === 'link') {
|
|
290
|
+
if (!transformedCliArgs.link) {
|
|
291
|
+
transformedCliArgs.link = {};
|
|
292
|
+
}
|
|
293
|
+
transformedCliArgs.link.externals = finalCliArgs.externals;
|
|
294
|
+
} else if (commandName === 'unlink') {
|
|
295
|
+
if (!transformedCliArgs.unlink) {
|
|
296
|
+
transformedCliArgs.unlink = {};
|
|
297
|
+
}
|
|
298
|
+
transformedCliArgs.unlink.externals = finalCliArgs.externals;
|
|
299
|
+
} else if (commandName === 'tree') {
|
|
300
|
+
if (!transformedCliArgs.tree) {
|
|
301
|
+
transformedCliArgs.tree = {};
|
|
302
|
+
}
|
|
303
|
+
transformedCliArgs.tree.externals = finalCliArgs.externals;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
249
306
|
// Note: openaiApiKey is handled separately via environment variable only
|
|
250
307
|
return transformedCliArgs;
|
|
251
308
|
};
|
|
@@ -288,7 +345,9 @@ const configure = async (cardigantime)=>{
|
|
|
288
345
|
// Transform the flat CLI args
|
|
289
346
|
const transformedCliArgs = transformCliArgs(cliArgs);
|
|
290
347
|
// Use CardiganTime's built-in generateConfig method
|
|
291
|
-
|
|
348
|
+
const configDir = transformedCliArgs.configDirectory || KODRDRIV_DEFAULTS.configDirectory;
|
|
349
|
+
const absoluteConfigDir = path__default.isAbsolute(configDir) ? configDir : path__default.resolve(process.cwd(), configDir);
|
|
350
|
+
await cardigantime.generateConfig(absoluteConfigDir);
|
|
292
351
|
// Return minimal config for consistency, but main processing is done
|
|
293
352
|
const config = await validateAndProcessOptions({});
|
|
294
353
|
const secureConfig = await validateAndProcessSecureOptions();
|
|
@@ -392,7 +451,7 @@ const configure = async (cardigantime)=>{
|
|
|
392
451
|
];
|
|
393
452
|
};
|
|
394
453
|
// Function to handle CLI argument parsing and processing
|
|
395
|
-
async function getCliConfig(program) {
|
|
454
|
+
async function getCliConfig(program, commands) {
|
|
396
455
|
const addSharedOptions = (command)=>{
|
|
397
456
|
command.option('--dry-run', 'perform a dry run without saving files') // Removed default, will be handled by merging
|
|
398
457
|
.option('--verbose', 'enable verbose logging').option('--debug', 'enable debug logging').option('--overrides', 'enable overrides').option('--model <model>', 'OpenAI model to use').option('--openai-reasoning <level>', 'OpenAI reasoning level (low, medium, high)').option('--openai-max-output-tokens <tokens>', 'OpenAI maximum output tokens', parseInt).option('-d, --context-directories [contextDirectories...]', 'directories to scan for context').option('--config-dir <configDir>', 'configuration directory') // Keep config-dir for specifying location
|
|
@@ -665,82 +724,202 @@ async function getCliConfig(program) {
|
|
|
665
724
|
}
|
|
666
725
|
// Only proceed with command-specific options if validation passed
|
|
667
726
|
if (ALLOWED_COMMANDS.includes(commandName)) {
|
|
668
|
-
|
|
669
|
-
|
|
727
|
+
var _chosen_commitCommand, _chosen_commit, _chosen_audioCommitCommand, _chosen_releaseCommand, _chosen_publishCommand, _chosen_treeCommand, _chosen_linkCommand, _chosen_unlinkCommand, _chosen_audioReviewCommand, _chosen_reviewCommand, _chosen_review, _chosen_cleanCommand, _chosen_developmentCommand, _chosen_versionsCommand, _chosen_selectAudioCommand;
|
|
728
|
+
const chosen = {
|
|
729
|
+
commitCommand,
|
|
730
|
+
audioCommitCommand,
|
|
731
|
+
releaseCommand,
|
|
732
|
+
publishCommand,
|
|
733
|
+
treeCommand,
|
|
734
|
+
linkCommand,
|
|
735
|
+
unlinkCommand,
|
|
736
|
+
audioReviewCommand,
|
|
737
|
+
reviewCommand,
|
|
738
|
+
cleanCommand,
|
|
739
|
+
developmentCommand,
|
|
740
|
+
versionsCommand,
|
|
741
|
+
selectAudioCommand
|
|
742
|
+
};
|
|
743
|
+
if (commandName === 'commit' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_commitCommand = chosen.commitCommand) === null || _chosen_commitCommand === void 0 ? void 0 : _chosen_commitCommand.opts)) {
|
|
744
|
+
const commitCmd = chosen.commitCommand;
|
|
745
|
+
commandOptions = commitCmd.opts();
|
|
670
746
|
// Handle positional argument for direction
|
|
671
747
|
// Try to get direction from program.args (after the command name)
|
|
672
748
|
if (program.args.length > 1) {
|
|
673
749
|
commandOptions.direction = program.args[1];
|
|
674
750
|
}
|
|
675
751
|
// Also try commitCommand.args as fallback
|
|
676
|
-
const args =
|
|
677
|
-
if (args && args.length > 0
|
|
678
|
-
|
|
752
|
+
const args = commitCmd.args;
|
|
753
|
+
if (Array.isArray(args) && args.length > 0) {
|
|
754
|
+
const firstTruthyArg = args.find((arg)=>arg);
|
|
755
|
+
if (firstTruthyArg) {
|
|
756
|
+
commandOptions.direction = firstTruthyArg;
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
// Final fallback: use locally constructed commit command's args
|
|
760
|
+
if (!commandOptions.direction) {
|
|
761
|
+
const localArgs = commitCommand === null || commitCommand === void 0 ? void 0 : commitCommand.args;
|
|
762
|
+
if (Array.isArray(localArgs) && localArgs.length > 0) {
|
|
763
|
+
const firstLocalArg = localArgs.find((arg)=>arg);
|
|
764
|
+
if (firstLocalArg) {
|
|
765
|
+
commandOptions.direction = firstLocalArg;
|
|
766
|
+
}
|
|
767
|
+
}
|
|
679
768
|
}
|
|
680
769
|
// Check for STDIN input for direction (takes precedence over positional argument)
|
|
681
770
|
const stdinInput = await readStdin();
|
|
682
|
-
if (stdinInput) {
|
|
771
|
+
if (typeof stdinInput === 'string') {
|
|
683
772
|
commandOptions.direction = stdinInput;
|
|
684
773
|
}
|
|
685
|
-
} else if (commandName === '
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
commandOptions =
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
774
|
+
} else if (commandName === 'commit' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_commit = chosen.commit) === null || _chosen_commit === void 0 ? void 0 : _chosen_commit.opts)) {
|
|
775
|
+
// Fallback when a test/mocked commands object provides 'commit' instead of 'commitCommand'
|
|
776
|
+
const commitCmd = chosen.commit;
|
|
777
|
+
commandOptions = commitCmd.opts();
|
|
778
|
+
if (program.args.length > 1) {
|
|
779
|
+
commandOptions.direction = program.args[1];
|
|
780
|
+
}
|
|
781
|
+
const args = commitCmd.args;
|
|
782
|
+
if (Array.isArray(args) && args.length > 0) {
|
|
783
|
+
const firstTruthyArg = args.find((arg)=>arg);
|
|
784
|
+
if (firstTruthyArg) {
|
|
785
|
+
commandOptions.direction = firstTruthyArg;
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
if (!commandOptions.direction) {
|
|
789
|
+
const localArgs = commitCommand === null || commitCommand === void 0 ? void 0 : commitCommand.args;
|
|
790
|
+
if (Array.isArray(localArgs) && localArgs.length > 0) {
|
|
791
|
+
const firstLocalArg = localArgs.find((arg)=>arg);
|
|
792
|
+
if (firstLocalArg) {
|
|
793
|
+
commandOptions.direction = firstLocalArg;
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
const stdinInput = await readStdin();
|
|
798
|
+
if (typeof stdinInput === 'string') {
|
|
799
|
+
commandOptions.direction = stdinInput;
|
|
800
|
+
}
|
|
801
|
+
} else if (commandName === 'audio-commit' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_audioCommitCommand = chosen.audioCommitCommand) === null || _chosen_audioCommitCommand === void 0 ? void 0 : _chosen_audioCommitCommand.opts)) {
|
|
802
|
+
const audioCommitCmd = chosen.audioCommitCommand;
|
|
803
|
+
commandOptions = audioCommitCmd.opts();
|
|
804
|
+
} else if (commandName === 'release' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_releaseCommand = chosen.releaseCommand) === null || _chosen_releaseCommand === void 0 ? void 0 : _chosen_releaseCommand.opts)) {
|
|
805
|
+
const releaseCmd = chosen.releaseCommand;
|
|
806
|
+
commandOptions = releaseCmd.opts();
|
|
807
|
+
} else if (commandName === 'publish' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_publishCommand = chosen.publishCommand) === null || _chosen_publishCommand === void 0 ? void 0 : _chosen_publishCommand.opts)) {
|
|
808
|
+
const publishCmd = chosen.publishCommand;
|
|
809
|
+
commandOptions = publishCmd.opts();
|
|
810
|
+
} else if (commandName === 'tree' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_treeCommand = chosen.treeCommand) === null || _chosen_treeCommand === void 0 ? void 0 : _chosen_treeCommand.opts)) {
|
|
811
|
+
const treeCmd = chosen.treeCommand;
|
|
812
|
+
commandOptions = treeCmd.opts();
|
|
693
813
|
// Handle positional arguments for built-in command and package argument
|
|
694
|
-
const args =
|
|
695
|
-
if (args && args.length > 0
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
814
|
+
const args = treeCmd.args;
|
|
815
|
+
if (Array.isArray(args) && args.length > 0) {
|
|
816
|
+
const firstTruthyArg = args.find((arg)=>arg);
|
|
817
|
+
if (firstTruthyArg) {
|
|
818
|
+
commandOptions.builtInCommand = firstTruthyArg;
|
|
819
|
+
if ((firstTruthyArg === 'link' || firstTruthyArg === 'unlink') && args.length > 1) {
|
|
820
|
+
const secondTruthyArg = args.slice(1).find((arg)=>arg);
|
|
821
|
+
if (secondTruthyArg) {
|
|
822
|
+
commandOptions.packageArgument = secondTruthyArg;
|
|
823
|
+
}
|
|
824
|
+
}
|
|
701
825
|
}
|
|
702
826
|
}
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
827
|
+
const stdinInput = await readStdin();
|
|
828
|
+
if (typeof stdinInput === 'string') {
|
|
829
|
+
commandOptions.builtInCommand = stdinInput.trim().split('\n')[0] || commandOptions.builtInCommand;
|
|
830
|
+
const stdinLines = stdinInput.split('\n');
|
|
831
|
+
if (stdinLines[1]) {
|
|
832
|
+
commandOptions.packageArgument = stdinLines[1];
|
|
833
|
+
}
|
|
709
834
|
}
|
|
710
|
-
} else if (commandName === '
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
const args =
|
|
714
|
-
if (args && args.length > 0
|
|
715
|
-
|
|
835
|
+
} else if (commandName === 'link' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_linkCommand = chosen.linkCommand) === null || _chosen_linkCommand === void 0 ? void 0 : _chosen_linkCommand.opts)) {
|
|
836
|
+
const linkCmd = chosen.linkCommand;
|
|
837
|
+
commandOptions = linkCmd.opts();
|
|
838
|
+
const args = linkCmd.args;
|
|
839
|
+
if (Array.isArray(args) && args.length > 0) {
|
|
840
|
+
const firstTruthyArg = args.find((arg)=>arg);
|
|
841
|
+
if (firstTruthyArg) {
|
|
842
|
+
commandOptions.packageArgument = firstTruthyArg === 'status' ? 'status' : firstTruthyArg;
|
|
843
|
+
}
|
|
716
844
|
}
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
const
|
|
723
|
-
|
|
724
|
-
|
|
845
|
+
const stdinInput = await readStdin();
|
|
846
|
+
if (typeof stdinInput === 'string') {
|
|
847
|
+
commandOptions.packageArgument = stdinInput;
|
|
848
|
+
}
|
|
849
|
+
} else if (commandName === 'unlink' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_unlinkCommand = chosen.unlinkCommand) === null || _chosen_unlinkCommand === void 0 ? void 0 : _chosen_unlinkCommand.opts)) {
|
|
850
|
+
const unlinkCmd = chosen.unlinkCommand;
|
|
851
|
+
commandOptions = unlinkCmd.opts();
|
|
852
|
+
const args = unlinkCmd.args;
|
|
853
|
+
if (Array.isArray(args) && args.length > 0) {
|
|
854
|
+
const firstTruthyArg = args.find((arg)=>arg);
|
|
855
|
+
if (firstTruthyArg) {
|
|
856
|
+
commandOptions.packageArgument = firstTruthyArg === 'status' ? 'status' : firstTruthyArg;
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
const stdinInput = await readStdin();
|
|
860
|
+
if (typeof stdinInput === 'string') {
|
|
861
|
+
commandOptions.packageArgument = stdinInput;
|
|
862
|
+
}
|
|
863
|
+
} else if (commandName === 'audio-review' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_audioReviewCommand = chosen.audioReviewCommand) === null || _chosen_audioReviewCommand === void 0 ? void 0 : _chosen_audioReviewCommand.opts)) {
|
|
864
|
+
const audioReviewCmd = chosen.audioReviewCommand;
|
|
865
|
+
commandOptions = audioReviewCmd.opts();
|
|
866
|
+
} else if (commandName === 'review' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_reviewCommand = chosen.reviewCommand) === null || _chosen_reviewCommand === void 0 ? void 0 : _chosen_reviewCommand.opts)) {
|
|
867
|
+
const reviewCmd = chosen.reviewCommand;
|
|
868
|
+
commandOptions = reviewCmd.opts();
|
|
869
|
+
const args = reviewCmd.args;
|
|
870
|
+
if (Array.isArray(args) && args.length > 0) {
|
|
871
|
+
const firstTruthyArg = args.find((arg)=>arg);
|
|
872
|
+
if (firstTruthyArg) {
|
|
873
|
+
commandOptions.note = firstTruthyArg;
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
// Final fallback: use locally constructed review command's args
|
|
877
|
+
if (!commandOptions.note) {
|
|
878
|
+
const localArgs = reviewCommand === null || reviewCommand === void 0 ? void 0 : reviewCommand.args;
|
|
879
|
+
if (Array.isArray(localArgs) && localArgs.length > 0) {
|
|
880
|
+
const firstLocalArg = localArgs.find((arg)=>arg);
|
|
881
|
+
if (firstLocalArg) {
|
|
882
|
+
commandOptions.note = firstLocalArg;
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
const stdinInput = await readStdin();
|
|
887
|
+
if (typeof stdinInput === 'string') {
|
|
888
|
+
commandOptions.note = stdinInput;
|
|
889
|
+
}
|
|
890
|
+
} else if (commandName === 'review' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_review = chosen.review) === null || _chosen_review === void 0 ? void 0 : _chosen_review.opts)) {
|
|
891
|
+
const reviewCmd = chosen.review;
|
|
892
|
+
commandOptions = reviewCmd.opts();
|
|
893
|
+
const args = reviewCmd.args;
|
|
894
|
+
if (Array.isArray(args) && args.length > 0) {
|
|
895
|
+
const firstTruthyArg = args.find((arg)=>arg);
|
|
896
|
+
if (firstTruthyArg) {
|
|
897
|
+
commandOptions.note = firstTruthyArg;
|
|
898
|
+
}
|
|
725
899
|
}
|
|
726
|
-
// Check for STDIN input for note (takes precedence over positional argument)
|
|
727
900
|
const stdinInput = await readStdin();
|
|
728
|
-
if (stdinInput) {
|
|
901
|
+
if (typeof stdinInput === 'string') {
|
|
729
902
|
commandOptions.note = stdinInput;
|
|
730
903
|
}
|
|
731
|
-
} else if (commandName === 'clean' && cleanCommand.opts) {
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
commandOptions =
|
|
737
|
-
|
|
738
|
-
const
|
|
904
|
+
} else if (commandName === 'clean' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_cleanCommand = chosen.cleanCommand) === null || _chosen_cleanCommand === void 0 ? void 0 : _chosen_cleanCommand.opts)) {
|
|
905
|
+
const cleanCmd = chosen.cleanCommand;
|
|
906
|
+
commandOptions = cleanCmd.opts();
|
|
907
|
+
} else if (commandName === 'development' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_developmentCommand = chosen.developmentCommand) === null || _chosen_developmentCommand === void 0 ? void 0 : _chosen_developmentCommand.opts)) {
|
|
908
|
+
const developmentCmd = chosen.developmentCommand;
|
|
909
|
+
commandOptions = developmentCmd.opts();
|
|
910
|
+
} else if (commandName === 'versions' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_versionsCommand = chosen.versionsCommand) === null || _chosen_versionsCommand === void 0 ? void 0 : _chosen_versionsCommand.opts)) {
|
|
911
|
+
const versionsCmd = chosen.versionsCommand;
|
|
912
|
+
commandOptions = versionsCmd.opts();
|
|
913
|
+
const args = versionsCmd.args;
|
|
739
914
|
if (args && args.length > 0 && args[0]) {
|
|
740
915
|
commandOptions.subcommand = args[0];
|
|
741
916
|
}
|
|
742
|
-
} else if (commandName === 'select-audio' && selectAudioCommand.opts) {
|
|
743
|
-
|
|
917
|
+
} else if (commandName === 'select-audio' && (chosen === null || chosen === void 0 ? void 0 : (_chosen_selectAudioCommand = chosen.selectAudioCommand) === null || _chosen_selectAudioCommand === void 0 ? void 0 : _chosen_selectAudioCommand.opts)) {
|
|
918
|
+
const selectAudioCmd = chosen.selectAudioCommand;
|
|
919
|
+
commandOptions = selectAudioCmd.opts();
|
|
920
|
+
} else {
|
|
921
|
+
// Final fallback
|
|
922
|
+
commandOptions = program.opts();
|
|
744
923
|
}
|
|
745
924
|
}
|
|
746
925
|
// Include command name in CLI args for merging
|
|
@@ -748,6 +927,25 @@ async function getCliConfig(program) {
|
|
|
748
927
|
...cliArgs,
|
|
749
928
|
...commandOptions
|
|
750
929
|
};
|
|
930
|
+
// Final safety fallback for positional arguments when STDIN is null and mocks provide args on constructed commands
|
|
931
|
+
if (commandName === 'commit' && !finalCliArgs.direction) {
|
|
932
|
+
const localArgs = commitCommand === null || commitCommand === void 0 ? void 0 : commitCommand.args;
|
|
933
|
+
if (Array.isArray(localArgs) && localArgs.length > 0) {
|
|
934
|
+
const firstLocalArg = localArgs.find((arg)=>arg);
|
|
935
|
+
if (firstLocalArg) {
|
|
936
|
+
finalCliArgs.direction = firstLocalArg;
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
if (commandName === 'review' && !finalCliArgs.note) {
|
|
941
|
+
const localArgs = reviewCommand === null || reviewCommand === void 0 ? void 0 : reviewCommand.args;
|
|
942
|
+
if (Array.isArray(localArgs) && localArgs.length > 0) {
|
|
943
|
+
const firstLocalArg = localArgs.find((arg)=>arg);
|
|
944
|
+
if (firstLocalArg) {
|
|
945
|
+
finalCliArgs.note = firstLocalArg;
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
}
|
|
751
949
|
const commandConfig = {
|
|
752
950
|
commandName
|
|
753
951
|
};
|
|
@@ -795,7 +993,7 @@ async function validateAndProcessOptions(options) {
|
|
|
795
993
|
// Command-specific options - ensure all defaults are present even for partial configs
|
|
796
994
|
commit: {
|
|
797
995
|
...KODRDRIV_DEFAULTS.commit,
|
|
798
|
-
...Object.fromEntries(Object.entries(options.commit || {}).filter(([_, v])=>v !== undefined))
|
|
996
|
+
...Object.fromEntries(Object.entries(options.commit || {}).filter(([_, v])=>v !== undefined && v !== null))
|
|
799
997
|
},
|
|
800
998
|
audioCommit: {
|
|
801
999
|
...KODRDRIV_DEFAULTS.audioCommit,
|