@eldrforge/kodrdriv 0.0.1

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 (43) hide show
  1. package/.gitcarve/config.yaml +11 -0
  2. package/.gitcarve/context/people/context.md +5 -0
  3. package/.gitcarve/context/projects/context.md +3 -0
  4. package/.gitcarve/instructions/INACTIVE-release-pre.md +1 -0
  5. package/LICENSE +190 -0
  6. package/README.md +337 -0
  7. package/dist/arguments.js +252 -0
  8. package/dist/arguments.js.map +1 -0
  9. package/dist/commands/commit.js +54 -0
  10. package/dist/commands/commit.js.map +1 -0
  11. package/dist/commands/release.js +27 -0
  12. package/dist/commands/release.js.map +1 -0
  13. package/dist/constants.js +95 -0
  14. package/dist/constants.js.map +1 -0
  15. package/dist/content/diff.js +53 -0
  16. package/dist/content/diff.js.map +1 -0
  17. package/dist/content/log.js +34 -0
  18. package/dist/content/log.js.map +1 -0
  19. package/dist/error/ExitError.js +9 -0
  20. package/dist/error/ExitError.js.map +1 -0
  21. package/dist/logging.js +46 -0
  22. package/dist/logging.js.map +1 -0
  23. package/dist/main.js +53 -0
  24. package/dist/main.js.map +1 -0
  25. package/dist/prompt/instructions/commit.md +48 -0
  26. package/dist/prompt/instructions/release.md +31 -0
  27. package/dist/prompt/personas/you.md +11 -0
  28. package/dist/prompt/prompts.js +55 -0
  29. package/dist/prompt/prompts.js.map +1 -0
  30. package/dist/types.js +29 -0
  31. package/dist/types.js.map +1 -0
  32. package/dist/util/child.js +11 -0
  33. package/dist/util/child.js.map +1 -0
  34. package/dist/util/openai.js +55 -0
  35. package/dist/util/openai.js.map +1 -0
  36. package/dist/util/storage.js +126 -0
  37. package/dist/util/storage.js.map +1 -0
  38. package/eslint.config.mjs +82 -0
  39. package/nodemon.json +14 -0
  40. package/package.json +74 -0
  41. package/tsconfig.tsbuildinfo +1 -0
  42. package/vite.config.ts +90 -0
  43. package/vitest.config.ts +21 -0
@@ -0,0 +1,252 @@
1
+ import { Command } from 'commander';
2
+ import path from 'path';
3
+ import { z } from 'zod';
4
+ import { PROGRAM_NAME, VERSION, ALLOWED_COMMANDS, DEFAULT_COMMAND, KODRDRIV_DEFAULTS, DEFAULT_CHARACTER_ENCODING, DEFAULT_INSTRUCTIONS_DIR } from './constants.js';
5
+ import { getLogger } from './logging.js';
6
+ import { create } from './util/storage.js';
7
+
8
+ z.object({
9
+ dryRun: z.boolean().optional(),
10
+ verbose: z.boolean().optional(),
11
+ debug: z.boolean().optional(),
12
+ overrides: z.boolean().optional(),
13
+ openaiApiKey: z.string().optional(),
14
+ model: z.string().optional(),
15
+ contextDirectories: z.array(z.string()).optional(),
16
+ instructions: z.string().optional(),
17
+ configDir: z.string().optional(),
18
+ cached: z.boolean().optional(),
19
+ sendit: z.boolean().optional(),
20
+ from: z.string().optional(),
21
+ to: z.string().optional(),
22
+ excludedPatterns: z.array(z.string()).optional()
23
+ });
24
+ // Function to transform flat CLI args into nested Config structure
25
+ const transformCliArgs = (finalCliArgs)=>{
26
+ const transformedCliArgs = {};
27
+ // Direct mappings from Input to Config
28
+ if (finalCliArgs.dryRun !== undefined) transformedCliArgs.dryRun = finalCliArgs.dryRun;
29
+ if (finalCliArgs.verbose !== undefined) transformedCliArgs.verbose = finalCliArgs.verbose;
30
+ if (finalCliArgs.debug !== undefined) transformedCliArgs.debug = finalCliArgs.debug;
31
+ if (finalCliArgs.overrides !== undefined) transformedCliArgs.overrides = finalCliArgs.overrides;
32
+ if (finalCliArgs.model !== undefined) transformedCliArgs.model = finalCliArgs.model;
33
+ if (finalCliArgs.contextDirectories !== undefined) transformedCliArgs.contextDirectories = finalCliArgs.contextDirectories;
34
+ if (finalCliArgs.instructions !== undefined) transformedCliArgs.instructions = finalCliArgs.instructions;
35
+ // Map configDir (CLI) to configDirectory (Cardigantime standard)
36
+ if (finalCliArgs.configDir !== undefined) transformedCliArgs.configDirectory = finalCliArgs.configDir;
37
+ // Nested mappings for 'commit' options
38
+ if (finalCliArgs.cached !== undefined || finalCliArgs.sendit !== undefined) {
39
+ transformedCliArgs.commit = {};
40
+ if (finalCliArgs.cached !== undefined) transformedCliArgs.commit.cached = finalCliArgs.cached;
41
+ if (finalCliArgs.sendit !== undefined) transformedCliArgs.commit.sendit = finalCliArgs.sendit;
42
+ }
43
+ // Nested mappings for 'release' options
44
+ if (finalCliArgs.from !== undefined || finalCliArgs.to !== undefined) {
45
+ transformedCliArgs.release = {};
46
+ if (finalCliArgs.from !== undefined) transformedCliArgs.release.from = finalCliArgs.from;
47
+ if (finalCliArgs.to !== undefined) transformedCliArgs.release.to = finalCliArgs.to;
48
+ }
49
+ if (finalCliArgs.excludedPatterns !== undefined) transformedCliArgs.excludedPatterns = finalCliArgs.excludedPatterns;
50
+ // Note: finalCliArgs.openaiApiKey is intentionally omitted here as it belongs to SecureConfig
51
+ return transformedCliArgs;
52
+ };
53
+ // Update configure signature to accept cardigantime
54
+ const configure = async (cardigantime)=>{
55
+ const logger = getLogger();
56
+ let program = new Command();
57
+ // Configure program basics
58
+ program.name(PROGRAM_NAME).summary('Create Intelligent Release Notes or Change Logs from Git').description('Create Intelligent Release Notes or Change Logs from Git').version(VERSION);
59
+ // Let cardigantime add its arguments first
60
+ program = await cardigantime.configure(program);
61
+ // Get CLI arguments using the new function
62
+ const [finalCliArgs, commandConfig] = getCliConfig(program);
63
+ logger.debug('Loaded Command Line Options: %s', JSON.stringify(finalCliArgs, null, 2));
64
+ // Transform the flat CLI args using the new function
65
+ const transformedCliArgs = transformCliArgs(finalCliArgs);
66
+ logger.debug('Transformed CLI Args for merging: %s', JSON.stringify(transformedCliArgs, null, 2));
67
+ // Get values from config file
68
+ const fileValues = await cardigantime.read(finalCliArgs);
69
+ await cardigantime.validate(fileValues); // Validate file config against the shape
70
+ // Merge configurations: Defaults -> File -> CLI
71
+ const partialConfig = {
72
+ ...KODRDRIV_DEFAULTS,
73
+ ...fileValues,
74
+ ...transformedCliArgs
75
+ }; // Cast to Partial<MainConfig> initially
76
+ // Specific validation and processing after merge
77
+ const config = await validateAndProcessOptions(partialConfig);
78
+ logger.verbose('Final configuration: %s', JSON.stringify(config, null, 2));
79
+ const secureConfig = await validateAndProcessSecureOptions();
80
+ return [
81
+ config,
82
+ secureConfig,
83
+ commandConfig
84
+ ];
85
+ };
86
+ // Function to handle CLI argument parsing and processing
87
+ function getCliConfig(program) {
88
+ const addSharedOptions = (command)=>{
89
+ command.option('--dry-run', 'perform a dry run without saving files') // Removed default, will be handled by merging
90
+ .option('--verbose', 'enable verbose logging').option('--debug', 'enable debug logging').option('--overrides', 'enable overrides').option('--model <model>', 'OpenAI model to use').option('-d, --context-directories [contextDirectories...]', 'directories to scan for context').option('-i, --instructions <file>', 'instructions for the AI').option('--config-dir <configDir>', 'configuration directory') // Keep config-dir for specifying location
91
+ .option('--excluded-paths [excludedPatterns...]', 'paths to exclude from the diff');
92
+ };
93
+ // Add subcommands
94
+ const commitCommand = program.command('commit').option('--cached', 'use cached diff').option('--sendit', 'Commit with the message generated. No review.').description('Generate commit notes');
95
+ addSharedOptions(commitCommand);
96
+ const releaseCommand = program.command('release').option('--from <from>', 'branch to generate release notes from').option('--to <to>', 'branch to generate release notes to').description('Generate release notes');
97
+ addSharedOptions(releaseCommand);
98
+ program.parse();
99
+ const cliArgs = program.opts(); // Get all opts initially
100
+ // Determine which command is being run
101
+ let commandName = DEFAULT_COMMAND;
102
+ let commandOptions = {}; // Store specific command options
103
+ if (program.args.length > 0 && ALLOWED_COMMANDS.includes(program.args[0])) {
104
+ commandName = program.args[0];
105
+ if (commandName === 'commit' && commitCommand.opts) {
106
+ commandOptions = commitCommand.opts();
107
+ } else if (commandName === 'release' && releaseCommand.opts) {
108
+ commandOptions = releaseCommand.opts();
109
+ }
110
+ }
111
+ validateCommand(commandName);
112
+ // Include command name in CLI args for merging
113
+ const finalCliArgs = {
114
+ ...cliArgs,
115
+ ...commandOptions
116
+ };
117
+ const commandConfig = {
118
+ commandName
119
+ };
120
+ return [
121
+ finalCliArgs,
122
+ commandConfig
123
+ ];
124
+ }
125
+ async function validateAndProcessSecureOptions() {
126
+ if (!process.env.OPENAI_API_KEY) {
127
+ throw new Error('OpenAI API key is required, set OPENAI_API_KEY environment variable or provide --openai-api-key');
128
+ }
129
+ // Prefer CLI key if provided, otherwise use env var
130
+ const openaiApiKey = process.env.OPENAI_API_KEY;
131
+ const secureConfig = {
132
+ openaiApiKey: openaiApiKey
133
+ };
134
+ return secureConfig;
135
+ }
136
+ // Renamed validation function to reflect its broader role
137
+ async function validateAndProcessOptions(options) {
138
+ var _options_commit, _options_commit1, _options_release, _options_release1;
139
+ const contextDirectories = await validateContextDirectories(options.contextDirectories || KODRDRIV_DEFAULTS.contextDirectories);
140
+ const instructionsPathOrContent = options.instructions || KODRDRIV_DEFAULTS.instructions;
141
+ const instructions = await validateAndReadInstructions(instructionsPathOrContent);
142
+ const configDir = options.configDirectory || KODRDRIV_DEFAULTS.configDirectory;
143
+ await validateConfigDir(configDir); // Keep validation, but maybe remove return if not used elsewhere
144
+ var _options_dryRun, _options_verbose, _options_debug, _options_overrides, _options_model, _options_commit_cached, _options_commit_sendit, _options_release_from, _options_release_to, _options_excludedPatterns;
145
+ // Ensure all required fields are present and have correct types after merging
146
+ const finalConfig = {
147
+ dryRun: (_options_dryRun = options.dryRun) !== null && _options_dryRun !== void 0 ? _options_dryRun : KODRDRIV_DEFAULTS.dryRun,
148
+ verbose: (_options_verbose = options.verbose) !== null && _options_verbose !== void 0 ? _options_verbose : KODRDRIV_DEFAULTS.verbose,
149
+ debug: (_options_debug = options.debug) !== null && _options_debug !== void 0 ? _options_debug : KODRDRIV_DEFAULTS.debug,
150
+ overrides: (_options_overrides = options.overrides) !== null && _options_overrides !== void 0 ? _options_overrides : KODRDRIV_DEFAULTS.overrides,
151
+ model: (_options_model = options.model) !== null && _options_model !== void 0 ? _options_model : KODRDRIV_DEFAULTS.model,
152
+ instructions: instructions,
153
+ contextDirectories: contextDirectories,
154
+ configDirectory: configDir,
155
+ // Command-specific options with defaults
156
+ commit: {
157
+ cached: (_options_commit_cached = (_options_commit = options.commit) === null || _options_commit === void 0 ? void 0 : _options_commit.cached) !== null && _options_commit_cached !== void 0 ? _options_commit_cached : KODRDRIV_DEFAULTS.commit.cached,
158
+ sendit: (_options_commit_sendit = (_options_commit1 = options.commit) === null || _options_commit1 === void 0 ? void 0 : _options_commit1.sendit) !== null && _options_commit_sendit !== void 0 ? _options_commit_sendit : KODRDRIV_DEFAULTS.commit.sendit
159
+ },
160
+ release: {
161
+ from: (_options_release_from = (_options_release = options.release) === null || _options_release === void 0 ? void 0 : _options_release.from) !== null && _options_release_from !== void 0 ? _options_release_from : KODRDRIV_DEFAULTS.release.from,
162
+ to: (_options_release_to = (_options_release1 = options.release) === null || _options_release1 === void 0 ? void 0 : _options_release1.to) !== null && _options_release_to !== void 0 ? _options_release_to : KODRDRIV_DEFAULTS.release.to
163
+ },
164
+ excludedPatterns: (_options_excludedPatterns = options.excludedPatterns) !== null && _options_excludedPatterns !== void 0 ? _options_excludedPatterns : KODRDRIV_DEFAULTS.excludedPatterns
165
+ };
166
+ // Final validation against the MainConfig shape (optional, cardigantime might handle it)
167
+ // You could potentially use ConfigShape.parse(finalConfig) here if needed
168
+ return finalConfig;
169
+ }
170
+ // Export for testing
171
+ function validateCommand(commandName) {
172
+ if (!ALLOWED_COMMANDS.includes(commandName)) {
173
+ throw new Error(`Invalid command: ${commandName}, allowed commands: ${ALLOWED_COMMANDS.join(', ')}`);
174
+ }
175
+ return commandName;
176
+ }
177
+ async function validateConfigDir(configDir) {
178
+ const logger = getLogger();
179
+ const storage = create({
180
+ log: logger.info
181
+ });
182
+ // Make sure the config directory is absolute
183
+ const absoluteConfigDir = path.isAbsolute(configDir) ? configDir : path.resolve(process.cwd(), configDir);
184
+ // Create the config directory if it doesn't exist
185
+ try {
186
+ if (!await storage.exists(absoluteConfigDir)) {
187
+ logger.info(`Creating config directory: ${absoluteConfigDir}`);
188
+ await storage.createDirectory(absoluteConfigDir);
189
+ } else if (!await storage.isDirectory(absoluteConfigDir)) {
190
+ throw new Error(`Config directory is not a directory: ${absoluteConfigDir}`);
191
+ } else if (!await storage.isDirectoryWritable(absoluteConfigDir)) {
192
+ throw new Error(`Config directory is not writable: ${absoluteConfigDir}`);
193
+ }
194
+ } catch (error) {
195
+ logger.error(`Failed to validate or create config directory: ${absoluteConfigDir}`, error);
196
+ throw new Error(`Failed to validate or create config directory: ${absoluteConfigDir}: ${error.message}`);
197
+ }
198
+ return absoluteConfigDir;
199
+ }
200
+ // Export for testing
201
+ async function validateContextDirectories(contextDirectories) {
202
+ const logger = getLogger();
203
+ const storage = create({
204
+ log: logger.info
205
+ });
206
+ // Filter out directories that don't exist
207
+ const validDirectories = [];
208
+ for (const dir of contextDirectories){
209
+ try {
210
+ if (await storage.isDirectoryReadable(dir)) {
211
+ validDirectories.push(dir);
212
+ } else {
213
+ logger.warn(`Directory not readable: ${dir}`);
214
+ }
215
+ } catch (error) {
216
+ logger.warn(`Error validating directory ${dir}: ${error.message}`);
217
+ }
218
+ }
219
+ return validDirectories;
220
+ }
221
+ // Updated to handle reading the file content
222
+ // Export for testing
223
+ async function validateAndReadInstructions(instructionsPath) {
224
+ const logger = getLogger();
225
+ const storage = create({
226
+ log: logger.info
227
+ });
228
+ try {
229
+ // Assume it's a file path first
230
+ if (await storage.isFileReadable(instructionsPath)) {
231
+ logger.debug(`Reading instructions from file: ${instructionsPath}`);
232
+ return storage.readFile(instructionsPath, DEFAULT_CHARACTER_ENCODING);
233
+ } else {
234
+ // If not a readable file, assume it might be the content itself (e.g., from config file)
235
+ logger.debug(`Using provided instructions string directly.`);
236
+ return instructionsPath; // Return the string as is
237
+ }
238
+ } catch (error) {
239
+ logger.error('Error reading instructions file %s: %s', instructionsPath, error.message);
240
+ // Decide how to handle error: throw, return default, etc.
241
+ // Returning default for now, but might need adjustment
242
+ logger.warn('Falling back to default instructions path due to error.');
243
+ // Re-read the default file path if the provided one failed
244
+ if (await storage.isFileReadable(DEFAULT_INSTRUCTIONS_DIR)) {
245
+ return storage.readFile(DEFAULT_INSTRUCTIONS_DIR, DEFAULT_CHARACTER_ENCODING);
246
+ }
247
+ throw new Error(`Failed to read instructions from ${instructionsPath} or default location.`);
248
+ }
249
+ }
250
+
251
+ export { configure, transformCliArgs, validateAndReadInstructions, validateCommand, validateContextDirectories };
252
+ //# sourceMappingURL=arguments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arguments.js","sources":["../src/arguments.ts"],"sourcesContent":["import * as Cardigantime from '@theunwalked/cardigantime';\nimport { Command } from \"commander\";\nimport path from \"path\";\nimport { z } from \"zod\";\nimport { ALLOWED_COMMANDS, DEFAULT_CHARACTER_ENCODING, DEFAULT_COMMAND, DEFAULT_INSTRUCTIONS_DIR, KODRDRIV_DEFAULTS, PROGRAM_NAME, VERSION } from \"./constants\";\nimport { getLogger } from \"./logging\";\nimport { CommandConfig, Config, ConfigSchema, SecureConfig } from './types'; // Import the Config type from main.ts\nimport * as Storage from \"./util/storage\";\n\nexport const InputSchema = z.object({\n dryRun: z.boolean().optional(),\n verbose: z.boolean().optional(),\n debug: z.boolean().optional(),\n overrides: z.boolean().optional(),\n openaiApiKey: z.string().optional(),\n model: z.string().optional(),\n contextDirectories: z.array(z.string()).optional(),\n instructions: z.string().optional(),\n configDir: z.string().optional(),\n cached: z.boolean().optional(),\n sendit: z.boolean().optional(),\n from: z.string().optional(),\n to: z.string().optional(),\n excludedPatterns: z.array(z.string()).optional(),\n});\n\nexport type Input = z.infer<typeof InputSchema>;\n\n// Function to transform flat CLI args into nested Config structure\nexport const transformCliArgs = (finalCliArgs: Input): Partial<Config> => {\n const transformedCliArgs: Partial<Config> = {};\n\n // Direct mappings from Input to Config\n if (finalCliArgs.dryRun !== undefined) transformedCliArgs.dryRun = finalCliArgs.dryRun;\n if (finalCliArgs.verbose !== undefined) transformedCliArgs.verbose = finalCliArgs.verbose;\n if (finalCliArgs.debug !== undefined) transformedCliArgs.debug = finalCliArgs.debug;\n if (finalCliArgs.overrides !== undefined) transformedCliArgs.overrides = finalCliArgs.overrides;\n if (finalCliArgs.model !== undefined) transformedCliArgs.model = finalCliArgs.model;\n if (finalCliArgs.contextDirectories !== undefined) transformedCliArgs.contextDirectories = finalCliArgs.contextDirectories;\n if (finalCliArgs.instructions !== undefined) transformedCliArgs.instructions = finalCliArgs.instructions;\n\n // Map configDir (CLI) to configDirectory (Cardigantime standard)\n if (finalCliArgs.configDir !== undefined) transformedCliArgs.configDirectory = finalCliArgs.configDir;\n\n // Nested mappings for 'commit' options\n if (finalCliArgs.cached !== undefined || finalCliArgs.sendit !== undefined) {\n transformedCliArgs.commit = {};\n if (finalCliArgs.cached !== undefined) transformedCliArgs.commit.cached = finalCliArgs.cached;\n if (finalCliArgs.sendit !== undefined) transformedCliArgs.commit.sendit = finalCliArgs.sendit;\n }\n\n // Nested mappings for 'release' options\n if (finalCliArgs.from !== undefined || finalCliArgs.to !== undefined) {\n transformedCliArgs.release = {};\n if (finalCliArgs.from !== undefined) transformedCliArgs.release.from = finalCliArgs.from;\n if (finalCliArgs.to !== undefined) transformedCliArgs.release.to = finalCliArgs.to;\n }\n\n if (finalCliArgs.excludedPatterns !== undefined) transformedCliArgs.excludedPatterns = finalCliArgs.excludedPatterns;\n\n // Note: finalCliArgs.openaiApiKey is intentionally omitted here as it belongs to SecureConfig\n\n return transformedCliArgs;\n}\n\n// Update configure signature to accept cardigantime\nexport const configure = async (cardigantime: Cardigantime.Cardigantime<typeof ConfigSchema.shape>): Promise<[Config, SecureConfig, CommandConfig]> => {\n const logger = getLogger();\n let program = new Command();\n\n // Configure program basics\n program\n .name(PROGRAM_NAME)\n .summary('Create Intelligent Release Notes or Change Logs from Git')\n .description('Create Intelligent Release Notes or Change Logs from Git')\n .version(VERSION);\n\n // Let cardigantime add its arguments first\n program = await cardigantime.configure(program);\n\n // Get CLI arguments using the new function\n const [finalCliArgs, commandConfig]: [Input, CommandConfig] = getCliConfig(program);\n logger.debug('Loaded Command Line Options: %s', JSON.stringify(finalCliArgs, null, 2));\n\n // Transform the flat CLI args using the new function\n const transformedCliArgs: Partial<Config> = transformCliArgs(finalCliArgs);\n logger.debug('Transformed CLI Args for merging: %s', JSON.stringify(transformedCliArgs, null, 2));\n\n // Get values from config file\n const fileValues: Config = await cardigantime.read(finalCliArgs);\n await cardigantime.validate(fileValues); // Validate file config against the shape\n\n // Merge configurations: Defaults -> File -> CLI\n const partialConfig: Partial<Config> = {\n ...KODRDRIV_DEFAULTS, // Start with Kodrdriv defaults\n ...fileValues, // Apply file values (overwrites defaults)\n ...transformedCliArgs, // Apply CLI args last (highest precedence)\n } as Partial<Config>; // Cast to Partial<MainConfig> initially\n\n // Specific validation and processing after merge\n const config: Config = await validateAndProcessOptions(partialConfig);\n\n logger.verbose('Final configuration: %s', JSON.stringify(config, null, 2));\n\n const secureConfig: SecureConfig = await validateAndProcessSecureOptions();\n\n return [config, secureConfig, commandConfig];\n}\n\n// Function to handle CLI argument parsing and processing\nfunction getCliConfig(program: Command): [Input, CommandConfig] {\n\n const addSharedOptions = (command: Command) => {\n command\n .option('--dry-run', 'perform a dry run without saving files') // Removed default, will be handled by merging\n .option('--verbose', 'enable verbose logging')\n .option('--debug', 'enable debug logging')\n .option('--overrides', 'enable overrides')\n .option('--model <model>', 'OpenAI model to use')\n .option('-d, --context-directories [contextDirectories...]', 'directories to scan for context')\n .option('-i, --instructions <file>', 'instructions for the AI')\n .option('--config-dir <configDir>', 'configuration directory') // Keep config-dir for specifying location\n .option('--excluded-paths [excludedPatterns...]', 'paths to exclude from the diff');\n }\n\n // Add subcommands\n const commitCommand = program\n .command('commit')\n .option('--cached', 'use cached diff')\n .option('--sendit', 'Commit with the message generated. No review.')\n .description('Generate commit notes');\n addSharedOptions(commitCommand);\n\n const releaseCommand = program\n .command('release')\n .option('--from <from>', 'branch to generate release notes from')\n .option('--to <to>', 'branch to generate release notes to')\n .description('Generate release notes');\n addSharedOptions(releaseCommand);\n\n program.parse();\n\n const cliArgs: Input = program.opts<Input>(); // Get all opts initially\n\n // Determine which command is being run\n let commandName = DEFAULT_COMMAND;\n let commandOptions: Partial<Input> = {}; // Store specific command options\n\n if (program.args.length > 0 && ALLOWED_COMMANDS.includes(program.args[0])) {\n commandName = program.args[0];\n if (commandName === 'commit' && commitCommand.opts) {\n commandOptions = commitCommand.opts<Partial<Input>>();\n } else if (commandName === 'release' && releaseCommand.opts) {\n commandOptions = releaseCommand.opts<Partial<Input>>();\n }\n }\n\n validateCommand(commandName);\n\n // Include command name in CLI args for merging\n const finalCliArgs = { ...cliArgs, ...commandOptions };\n const commandConfig = { commandName };\n return [finalCliArgs, commandConfig];\n}\n\nasync function validateAndProcessSecureOptions(): Promise<SecureConfig> {\n if (!process.env.OPENAI_API_KEY) {\n throw new Error('OpenAI API key is required, set OPENAI_API_KEY environment variable or provide --openai-api-key');\n }\n // Prefer CLI key if provided, otherwise use env var\n const openaiApiKey = process.env.OPENAI_API_KEY as string;\n\n const secureConfig: SecureConfig = {\n openaiApiKey: openaiApiKey,\n };\n\n return secureConfig;\n}\n\n// Renamed validation function to reflect its broader role\nasync function validateAndProcessOptions(options: Partial<Config>): Promise<Config> {\n\n const contextDirectories = await validateContextDirectories(options.contextDirectories || KODRDRIV_DEFAULTS.contextDirectories);\n const instructionsPathOrContent = options.instructions || KODRDRIV_DEFAULTS.instructions;\n const instructions = await validateAndReadInstructions(instructionsPathOrContent);\n const configDir = options.configDirectory || KODRDRIV_DEFAULTS.configDirectory;\n await validateConfigDir(configDir); // Keep validation, but maybe remove return if not used elsewhere\n\n // Ensure all required fields are present and have correct types after merging\n const finalConfig: Config = {\n dryRun: options.dryRun ?? KODRDRIV_DEFAULTS.dryRun,\n verbose: options.verbose ?? KODRDRIV_DEFAULTS.verbose,\n debug: options.debug ?? KODRDRIV_DEFAULTS.debug,\n overrides: options.overrides ?? KODRDRIV_DEFAULTS.overrides,\n model: options.model ?? KODRDRIV_DEFAULTS.model,\n instructions: instructions, // Use processed instructions content\n contextDirectories: contextDirectories,\n configDirectory: configDir,\n // Command-specific options with defaults\n commit: {\n cached: options.commit?.cached ?? KODRDRIV_DEFAULTS.commit.cached, // Might be undefined if not commit command\n sendit: options.commit?.sendit ?? KODRDRIV_DEFAULTS.commit.sendit,\n },\n release: {\n from: options.release?.from ?? KODRDRIV_DEFAULTS.release.from,\n to: options.release?.to ?? KODRDRIV_DEFAULTS.release.to,\n },\n excludedPatterns: options.excludedPatterns ?? KODRDRIV_DEFAULTS.excludedPatterns,\n };\n\n // Final validation against the MainConfig shape (optional, cardigantime might handle it)\n // You could potentially use ConfigShape.parse(finalConfig) here if needed\n\n return finalConfig;\n}\n\n// Export for testing\nexport function validateCommand(commandName: string): string {\n if (!ALLOWED_COMMANDS.includes(commandName)) {\n throw new Error(`Invalid command: ${commandName}, allowed commands: ${ALLOWED_COMMANDS.join(', ')}`);\n }\n return commandName;\n}\n\nasync function validateConfigDir(configDir: string): Promise<string> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.info });\n\n // Make sure the config directory is absolute\n const absoluteConfigDir = path.isAbsolute(configDir) ?\n configDir :\n path.resolve(process.cwd(), configDir);\n\n // Create the config directory if it doesn't exist\n try {\n if (!(await storage.exists(absoluteConfigDir))) {\n logger.info(`Creating config directory: ${absoluteConfigDir}`);\n await storage.createDirectory(absoluteConfigDir);\n } else if (!(await storage.isDirectory(absoluteConfigDir))) {\n throw new Error(`Config directory is not a directory: ${absoluteConfigDir}`);\n } else if (!(await storage.isDirectoryWritable(absoluteConfigDir))) {\n throw new Error(`Config directory is not writable: ${absoluteConfigDir}`);\n }\n } catch (error: any) {\n logger.error(`Failed to validate or create config directory: ${absoluteConfigDir}`, error);\n throw new Error(`Failed to validate or create config directory: ${absoluteConfigDir}: ${error.message}`);\n }\n\n return absoluteConfigDir;\n}\n\n// Export for testing\nexport async function validateContextDirectories(contextDirectories: string[]): Promise<string[]> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.info });\n\n // Filter out directories that don't exist\n const validDirectories = [];\n\n for (const dir of contextDirectories) {\n try {\n if (await storage.isDirectoryReadable(dir)) {\n validDirectories.push(dir);\n } else {\n logger.warn(`Directory not readable: ${dir}`);\n }\n } catch (error: any) {\n logger.warn(`Error validating directory ${dir}: ${error.message}`);\n }\n }\n\n return validDirectories;\n}\n\n// Updated to handle reading the file content\n// Export for testing\nexport async function validateAndReadInstructions(instructionsPath: string): Promise<string> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.info });\n try {\n // Assume it's a file path first\n if (await storage.isFileReadable(instructionsPath)) {\n logger.debug(`Reading instructions from file: ${instructionsPath}`);\n return storage.readFile(instructionsPath, DEFAULT_CHARACTER_ENCODING);\n } else {\n // If not a readable file, assume it might be the content itself (e.g., from config file)\n logger.debug(`Using provided instructions string directly.`);\n return instructionsPath; // Return the string as is\n }\n } catch (error: any) {\n logger.error('Error reading instructions file %s: %s', instructionsPath, error.message);\n // Decide how to handle error: throw, return default, etc.\n // Returning default for now, but might need adjustment\n logger.warn('Falling back to default instructions path due to error.');\n // Re-read the default file path if the provided one failed\n if (DEFAULT_INSTRUCTIONS_DIR && await storage.isFileReadable(DEFAULT_INSTRUCTIONS_DIR)) {\n return storage.readFile(DEFAULT_INSTRUCTIONS_DIR, DEFAULT_CHARACTER_ENCODING);\n }\n throw new Error(`Failed to read instructions from ${instructionsPath} or default location.`);\n }\n}"],"names":["z","object","dryRun","boolean","optional","verbose","debug","overrides","openaiApiKey","string","model","contextDirectories","array","instructions","configDir","cached","sendit","from","to","excludedPatterns","transformCliArgs","finalCliArgs","transformedCliArgs","undefined","configDirectory","commit","release","configure","cardigantime","logger","getLogger","program","Command","name","PROGRAM_NAME","summary","description","version","VERSION","commandConfig","getCliConfig","JSON","stringify","fileValues","read","validate","partialConfig","KODRDRIV_DEFAULTS","config","validateAndProcessOptions","secureConfig","validateAndProcessSecureOptions","addSharedOptions","command","option","commitCommand","releaseCommand","parse","cliArgs","opts","commandName","DEFAULT_COMMAND","commandOptions","args","length","ALLOWED_COMMANDS","includes","validateCommand","process","env","OPENAI_API_KEY","Error","options","validateContextDirectories","instructionsPathOrContent","validateAndReadInstructions","validateConfigDir","finalConfig","join","storage","Storage","log","info","absoluteConfigDir","path","isAbsolute","resolve","cwd","exists","createDirectory","isDirectory","isDirectoryWritable","error","message","validDirectories","dir","isDirectoryReadable","push","warn","instructionsPath","isFileReadable","readFile","DEFAULT_CHARACTER_ENCODING","DEFAULT_INSTRUCTIONS_DIR"],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ import shellescape from 'shell-escape';
4
+ import { DEFAULT_EXCLUDED_PATTERNS } from '../constants.js';
5
+ import { hasStagedChanges, create as create$1 } from '../content/diff.js';
6
+ import { getLogger } from '../logging.js';
7
+ import { create } from '../prompt/prompts.js';
8
+ import { run } from '../util/child.js';
9
+ import { createCompletion } from '../util/openai.js';
10
+
11
+ const execute = async (runConfig)=>{
12
+ var _runConfig_commit, _runConfig_commit1, _runConfig_commit2;
13
+ const logger = getLogger();
14
+ const prompts = create(runConfig.model, runConfig);
15
+ let diffContent = '';
16
+ let cached = (_runConfig_commit = runConfig.commit) === null || _runConfig_commit === void 0 ? void 0 : _runConfig_commit.cached;
17
+ // If cached is undefined? We're going to look for a staged commit; otherwise, we'll use the supplied setting.
18
+ if (((_runConfig_commit1 = runConfig.commit) === null || _runConfig_commit1 === void 0 ? void 0 : _runConfig_commit1.cached) === undefined) {
19
+ cached = await hasStagedChanges();
20
+ }
21
+ var _runConfig_excludedPatterns;
22
+ const options = {
23
+ cached,
24
+ excludedPatterns: (_runConfig_excludedPatterns = runConfig.excludedPatterns) !== null && _runConfig_excludedPatterns !== void 0 ? _runConfig_excludedPatterns : DEFAULT_EXCLUDED_PATTERNS
25
+ };
26
+ const diff = await create$1(options);
27
+ diffContent = await diff.get();
28
+ const prompt = await prompts.createCommitPrompt(diffContent);
29
+ const request = prompts.format(prompt);
30
+ const summary = await createCompletion(request.messages, {
31
+ model: runConfig.model
32
+ });
33
+ if ((_runConfig_commit2 = runConfig.commit) === null || _runConfig_commit2 === void 0 ? void 0 : _runConfig_commit2.sendit) {
34
+ if (!cached) {
35
+ logger.error('SendIt mode enabled, but no changes to commit. Message: \n\n%s\n\n', summary);
36
+ process.exit(1);
37
+ }
38
+ logger.info('SendIt mode enabled. Committing with message: \n\n%s\n\n', summary);
39
+ try {
40
+ const escapedSummary = shellescape([
41
+ summary
42
+ ]);
43
+ await run(`git commit -m ${escapedSummary}`);
44
+ logger.info('Commit successful!');
45
+ } catch (error) {
46
+ logger.error('Failed to commit:', error);
47
+ process.exit(1);
48
+ }
49
+ }
50
+ return summary;
51
+ };
52
+
53
+ export { execute };
54
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sources":["../../src/commands/commit.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Model, Request } from '@riotprompt/riotprompt';\nimport 'dotenv/config';\nimport { ChatCompletionMessageParam } from 'openai/resources';\nimport shellescape from 'shell-escape';\nimport { DEFAULT_EXCLUDED_PATTERNS } from '../constants';\nimport * as Diff from '../content/diff';\nimport { getLogger } from '../logging';\nimport * as Prompts from '../prompt/prompts';\nimport { Config } from '../types';\nimport { run } from '../util/child';\nimport { createCompletion } from '../util/openai';\n\nexport const execute = async (runConfig: Config) => {\n const logger = getLogger();\n const prompts = Prompts.create(runConfig.model as Model, runConfig);\n\n let diffContent = '';\n\n let cached = runConfig.commit?.cached;\n // If cached is undefined? We're going to look for a staged commit; otherwise, we'll use the supplied setting.\n if (runConfig.commit?.cached === undefined) {\n cached = await Diff.hasStagedChanges();\n }\n const options = { cached, excludedPatterns: runConfig.excludedPatterns ?? DEFAULT_EXCLUDED_PATTERNS };\n const diff = await Diff.create(options);\n diffContent = await diff.get();\n\n const prompt = await prompts.createCommitPrompt(diffContent);\n\n const request: Request = prompts.format(prompt);\n\n const summary = await createCompletion(request.messages as ChatCompletionMessageParam[], { model: runConfig.model });\n\n if (runConfig.commit?.sendit) {\n if (!cached) {\n logger.error('SendIt mode enabled, but no changes to commit. Message: \\n\\n%s\\n\\n', summary);\n process.exit(1);\n }\n\n logger.info('SendIt mode enabled. Committing with message: \\n\\n%s\\n\\n', summary);\n try {\n const escapedSummary = shellescape([summary]);\n await run(`git commit -m ${escapedSummary}`);\n logger.info('Commit successful!');\n } catch (error) {\n logger.error('Failed to commit:', error);\n process.exit(1);\n }\n }\n\n return summary;\n}\n"],"names":["execute","runConfig","logger","getLogger","prompts","Prompts","model","diffContent","cached","commit","undefined","Diff","options","excludedPatterns","DEFAULT_EXCLUDED_PATTERNS","diff","get","prompt","createCommitPrompt","request","format","summary","createCompletion","messages","sendit","error","process","exit","info","escapedSummary","shellescape","run"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ import { DEFAULT_TO_COMMIT_ALIAS, DEFAULT_FROM_COMMIT_ALIAS } from '../constants.js';
4
+ import { create as create$1 } from '../content/log.js';
5
+ import { create } from '../prompt/prompts.js';
6
+ import { createCompletion } from '../util/openai.js';
7
+
8
+ const execute = async (runConfig)=>{
9
+ var _runConfig_release, _runConfig_release1;
10
+ const prompts = await create(runConfig.model, runConfig);
11
+ var _runConfig_release_from, _runConfig_release_to;
12
+ const log = await create$1({
13
+ from: (_runConfig_release_from = (_runConfig_release = runConfig.release) === null || _runConfig_release === void 0 ? void 0 : _runConfig_release.from) !== null && _runConfig_release_from !== void 0 ? _runConfig_release_from : DEFAULT_FROM_COMMIT_ALIAS,
14
+ to: (_runConfig_release_to = (_runConfig_release1 = runConfig.release) === null || _runConfig_release1 === void 0 ? void 0 : _runConfig_release1.to) !== null && _runConfig_release_to !== void 0 ? _runConfig_release_to : DEFAULT_TO_COMMIT_ALIAS
15
+ });
16
+ let logContent = '';
17
+ logContent = await log.get();
18
+ const prompt = await prompts.createReleasePrompt(logContent);
19
+ const request = prompts.format(prompt);
20
+ const summary = await createCompletion(request.messages, {
21
+ model: runConfig.model
22
+ });
23
+ return summary;
24
+ };
25
+
26
+ export { execute };
27
+ //# sourceMappingURL=release.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.js","sources":["../../src/commands/release.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Model, Request } from '@riotprompt/riotprompt';\nimport 'dotenv/config';\nimport { ChatCompletionMessageParam } from 'openai/resources';\nimport { DEFAULT_FROM_COMMIT_ALIAS, DEFAULT_TO_COMMIT_ALIAS } from '../constants';\nimport * as Log from '../content/log';\nimport * as Prompts from '../prompt/prompts';\nimport { Config } from '../types';\nimport { createCompletion } from '../util/openai';\n\nexport const execute = async (runConfig: Config) => {\n const prompts = await Prompts.create(runConfig.model as Model, runConfig);\n\n const log = await Log.create({ from: runConfig.release?.from ?? DEFAULT_FROM_COMMIT_ALIAS, to: runConfig.release?.to ?? DEFAULT_TO_COMMIT_ALIAS });\n let logContent = '';\n\n logContent = await log.get();\n\n const prompt = await prompts.createReleasePrompt(logContent);\n\n const request: Request = prompts.format(prompt);\n\n const summary = await createCompletion(request.messages as ChatCompletionMessageParam[], { model: runConfig.model });\n\n return summary;\n}\n"],"names":["execute","runConfig","prompts","Prompts","model","log","Log","from","release","DEFAULT_FROM_COMMIT_ALIAS","to","DEFAULT_TO_COMMIT_ALIAS","logContent","get","prompt","createReleasePrompt","request","format","summary","createCompletion","messages"],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ const VERSION = '0.0.1 (HEAD/4729cd0 T:0.0.1 2025-05-23 21:20:18 -0700) linux x64 v22.15.0';
2
+ const PROGRAM_NAME = 'kodrdriv';
3
+ const DEFAULT_CHARACTER_ENCODING = 'utf-8';
4
+ const DEFAULT_OVERRIDES = false;
5
+ const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-MM-DD-HHmmss';
6
+ const DEFAULT_VERBOSE = false;
7
+ const DEFAULT_DRY_RUN = false;
8
+ const DEFAULT_DEBUG = false;
9
+ const DEFAULT_MODEL = 'gpt-4o-mini';
10
+ const DEFAULT_CONTEXT_DIRECTORIES = [];
11
+ const COMMAND_COMMIT = 'commit';
12
+ const COMMAND_RELEASE = 'release';
13
+ const ALLOWED_COMMANDS = [
14
+ COMMAND_COMMIT,
15
+ COMMAND_RELEASE
16
+ ];
17
+ const DEFAULT_COMMAND = COMMAND_COMMIT;
18
+ const DEFAULT_CONFIG_DIR = `.${PROGRAM_NAME}`;
19
+ const DEFAULT_PERSONAS_DIR = `/personas`;
20
+ const DEFAULT_PERSONA_YOU_FILE = `${DEFAULT_PERSONAS_DIR}/you.md`;
21
+ const DEFAULT_INSTRUCTIONS_DIR = `/instructions`;
22
+ const DEFAULT_INSTRUCTIONS_COMMIT_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/commit.md`;
23
+ const DEFAULT_INSTRUCTIONS_RELEASE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/release.md`;
24
+ const DEFAULT_CACHED = false;
25
+ const DEFAULT_SENDIT_MODE = false;
26
+ const DEFAULT_FROM_COMMIT_ALIAS = 'main';
27
+ const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';
28
+ const DEFAULT_EXCLUDED_PATTERNS = [
29
+ // Node modules & dependency files
30
+ "node_modules",
31
+ "pnpm-lock.yaml",
32
+ "package-lock.json",
33
+ "yarn.lock",
34
+ "bun.lockb",
35
+ "composer.lock",
36
+ "Cargo.lock",
37
+ "Gemfile.lock",
38
+ // Build output
39
+ "dist",
40
+ "build",
41
+ "out",
42
+ ".next",
43
+ ".nuxt",
44
+ "coverage",
45
+ // IDE & OS files
46
+ ".vscode",
47
+ ".idea",
48
+ ".DS_Store",
49
+ // Version control
50
+ ".git",
51
+ ".gitignore",
52
+ // Logs, caches, and temp
53
+ "logs",
54
+ "tmp",
55
+ ".cache",
56
+ "*.log",
57
+ // Sensitive data
58
+ ".env",
59
+ ".env.*",
60
+ "*.pem",
61
+ "*.crt",
62
+ "*.key",
63
+ // Binary and database files
64
+ "*.sqlite",
65
+ "*.db",
66
+ "*.zip",
67
+ "*.tar",
68
+ "*.gz",
69
+ "*.exe",
70
+ "*.bin"
71
+ ];
72
+ // Define defaults in one place
73
+ const KODRDRIV_DEFAULTS = {
74
+ dryRun: DEFAULT_DRY_RUN,
75
+ verbose: DEFAULT_VERBOSE,
76
+ debug: DEFAULT_DEBUG,
77
+ overrides: DEFAULT_OVERRIDES,
78
+ model: DEFAULT_MODEL,
79
+ instructions: DEFAULT_INSTRUCTIONS_DIR,
80
+ contextDirectories: DEFAULT_CONTEXT_DIRECTORIES,
81
+ commandName: DEFAULT_COMMAND,
82
+ configDirectory: DEFAULT_CONFIG_DIR,
83
+ commit: {
84
+ cached: DEFAULT_CACHED,
85
+ sendit: DEFAULT_SENDIT_MODE
86
+ },
87
+ release: {
88
+ from: DEFAULT_FROM_COMMIT_ALIAS,
89
+ to: DEFAULT_TO_COMMIT_ALIAS
90
+ },
91
+ excludedPatterns: DEFAULT_EXCLUDED_PATTERNS
92
+ };
93
+
94
+ export { ALLOWED_COMMANDS, COMMAND_COMMIT, COMMAND_RELEASE, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, DEFAULT_CACHED, DEFAULT_CHARACTER_ENCODING, DEFAULT_COMMAND, DEFAULT_CONFIG_DIR, DEFAULT_CONTEXT_DIRECTORIES, DEFAULT_DEBUG, DEFAULT_DRY_RUN, DEFAULT_EXCLUDED_PATTERNS, DEFAULT_FROM_COMMIT_ALIAS, DEFAULT_INSTRUCTIONS_COMMIT_FILE, DEFAULT_INSTRUCTIONS_DIR, DEFAULT_INSTRUCTIONS_RELEASE_FILE, DEFAULT_MODEL, DEFAULT_OVERRIDES, DEFAULT_PERSONAS_DIR, DEFAULT_PERSONA_YOU_FILE, DEFAULT_SENDIT_MODE, DEFAULT_TO_COMMIT_ALIAS, DEFAULT_VERBOSE, KODRDRIV_DEFAULTS, PROGRAM_NAME, VERSION };
95
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["export const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'kodrdriv';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_OVERRIDES = false;\nexport const DATE_FORMAT_MONTH_DAY = 'MM-DD';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-MM';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-MM-DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/MM/DD';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-MM-DD-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-MM-DD-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';\nexport const DATE_FORMAT_MONTH = 'MM';\nexport const DATE_FORMAT_DAY = 'DD';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_MODEL = 'gpt-4o-mini';\nexport const DEFAULT_CONTEXT_DIRECTORIES: string[] = [];\n\nexport const COMMAND_COMMIT = 'commit';\nexport const COMMAND_RELEASE = 'release';\nexport const ALLOWED_COMMANDS = [COMMAND_COMMIT, COMMAND_RELEASE];\nexport const DEFAULT_COMMAND = COMMAND_COMMIT;\n\nexport const DEFAULT_CONFIG_DIR = `.${PROGRAM_NAME}`;\n\nexport const DEFAULT_PERSONAS_DIR = `/personas`;\n\nexport const DEFAULT_PERSONA_YOU_FILE = `${DEFAULT_PERSONAS_DIR}/you.md`;\n\nexport const DEFAULT_INSTRUCTIONS_DIR = `/instructions`;\n\nexport const DEFAULT_INSTRUCTIONS_COMMIT_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/commit.md`;\nexport const DEFAULT_INSTRUCTIONS_RELEASE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/release.md`;\n\nexport const DEFAULT_CACHED = false;\n\nexport const DEFAULT_SENDIT_MODE = false;\n\nexport const DEFAULT_FROM_COMMIT_ALIAS = 'main';\nexport const DEFAULT_TO_COMMIT_ALIAS = 'HEAD';\nexport const DEFAULT_VERSION = '1.0.0';\n\nexport const DEFAULT_EXCLUDED_PATTERNS: string[] = [\n // Node modules & dependency files\n \"node_modules\",\n \"pnpm-lock.yaml\",\n \"package-lock.json\",\n \"yarn.lock\",\n \"bun.lockb\",\n \"composer.lock\",\n \"Cargo.lock\",\n \"Gemfile.lock\",\n\n // Build output\n \"dist\",\n \"build\",\n \"out\",\n \".next\",\n \".nuxt\",\n \"coverage\",\n\n // IDE & OS files\n \".vscode\",\n \".idea\",\n \".DS_Store\",\n\n // Version control\n \".git\",\n \".gitignore\",\n\n // Logs, caches, and temp\n \"logs\",\n \"tmp\",\n \".cache\",\n \"*.log\",\n\n // Sensitive data\n \".env\",\n \".env.*\",\n \"*.pem\",\n \"*.crt\",\n \"*.key\",\n\n // Binary and database files\n \"*.sqlite\",\n \"*.db\",\n \"*.zip\",\n \"*.tar\",\n \"*.gz\",\n \"*.exe\",\n \"*.bin\",\n];\n\n// Define defaults in one place\nexport const KODRDRIV_DEFAULTS = {\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n overrides: DEFAULT_OVERRIDES,\n model: DEFAULT_MODEL,\n instructions: DEFAULT_INSTRUCTIONS_DIR,\n contextDirectories: DEFAULT_CONTEXT_DIRECTORIES,\n commandName: DEFAULT_COMMAND,\n configDirectory: DEFAULT_CONFIG_DIR,\n commit: {\n cached: DEFAULT_CACHED,\n sendit: DEFAULT_SENDIT_MODE,\n },\n release: {\n from: DEFAULT_FROM_COMMIT_ALIAS,\n to: DEFAULT_TO_COMMIT_ALIAS,\n },\n excludedPatterns: DEFAULT_EXCLUDED_PATTERNS,\n};"],"names":["VERSION","PROGRAM_NAME","DEFAULT_CHARACTER_ENCODING","DEFAULT_OVERRIDES","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS","DEFAULT_VERBOSE","DEFAULT_DRY_RUN","DEFAULT_DEBUG","DEFAULT_MODEL","DEFAULT_CONTEXT_DIRECTORIES","COMMAND_COMMIT","COMMAND_RELEASE","ALLOWED_COMMANDS","DEFAULT_COMMAND","DEFAULT_CONFIG_DIR","DEFAULT_PERSONAS_DIR","DEFAULT_PERSONA_YOU_FILE","DEFAULT_INSTRUCTIONS_DIR","DEFAULT_INSTRUCTIONS_COMMIT_FILE","DEFAULT_INSTRUCTIONS_RELEASE_FILE","DEFAULT_CACHED","DEFAULT_SENDIT_MODE","DEFAULT_FROM_COMMIT_ALIAS","DEFAULT_TO_COMMIT_ALIAS","DEFAULT_EXCLUDED_PATTERNS","KODRDRIV_DEFAULTS","dryRun","verbose","debug","overrides","model","instructions","contextDirectories","commandName","configDirectory","commit","cached","sendit","release","from","to","excludedPatterns"],"mappings":"AAAO,MAAMA,UAAU;AAChB,MAAMC,eAAe;AACrB,MAAMC,6BAA6B;AAInC,MAAMC,oBAAoB;AAO1B,MAAMC,mDAAmD;AAQzD,MAAMC,kBAAkB;AACxB,MAAMC,kBAAkB;AACxB,MAAMC,gBAAgB;AACtB,MAAMC,gBAAgB;AACtB,MAAMC,2BAAwC,GAAA;AAE9C,MAAMC,iBAAiB;AACvB,MAAMC,kBAAkB;MAClBC,gBAAmB,GAAA;AAACF,IAAAA,cAAAA;AAAgBC,IAAAA;;AAC1C,MAAME,kBAAkBH;MAElBI,kBAAqB,GAAA,CAAC,CAAC,EAAEb;AAEzBc,MAAAA,oBAAAA,GAAuB,CAAC,SAAS;MAEjCC,wBAA2B,GAAA,CAAA,EAAGD,oBAAqB,CAAA,OAAO;AAE1DE,MAAAA,wBAAAA,GAA2B,CAAC,aAAa;MAEzCC,gCAAmC,GAAA,CAAA,EAAGD,wBAAyB,CAAA,UAAU;MACzEE,iCAAoC,GAAA,CAAA,EAAGF,wBAAyB,CAAA,WAAW;AAEjF,MAAMG,iBAAiB;AAEvB,MAAMC,sBAAsB;AAE5B,MAAMC,4BAA4B;AAClC,MAAMC,0BAA0B;MAG1BC,yBAAsC,GAAA;;AAE/C,IAAA,cAAA;AACA,IAAA,gBAAA;AACA,IAAA,mBAAA;AACA,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,eAAA;AACA,IAAA,YAAA;AACA,IAAA,cAAA;;AAGA,IAAA,MAAA;AACA,IAAA,OAAA;AACA,IAAA,KAAA;AACA,IAAA,OAAA;AACA,IAAA,OAAA;AACA,IAAA,UAAA;;AAGA,IAAA,SAAA;AACA,IAAA,OAAA;AACA,IAAA,WAAA;;AAGA,IAAA,MAAA;AACA,IAAA,YAAA;;AAGA,IAAA,MAAA;AACA,IAAA,KAAA;AACA,IAAA,QAAA;AACA,IAAA,OAAA;;AAGA,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,OAAA;AACA,IAAA,OAAA;AACA,IAAA,OAAA;;AAGA,IAAA,UAAA;AACA,IAAA,MAAA;AACA,IAAA,OAAA;AACA,IAAA,OAAA;AACA,IAAA,MAAA;AACA,IAAA,OAAA;AACA,IAAA;;AAGJ;MACaC,iBAAoB,GAAA;IAC7BC,MAAQpB,EAAAA,eAAAA;IACRqB,OAAStB,EAAAA,eAAAA;IACTuB,KAAOrB,EAAAA,aAAAA;IACPsB,SAAW1B,EAAAA,iBAAAA;IACX2B,KAAOtB,EAAAA,aAAAA;IACPuB,YAAcd,EAAAA,wBAAAA;IACde,kBAAoBvB,EAAAA,2BAAAA;IACpBwB,WAAapB,EAAAA,eAAAA;IACbqB,eAAiBpB,EAAAA,kBAAAA;IACjBqB,MAAQ,EAAA;QACJC,MAAQhB,EAAAA,cAAAA;QACRiB,MAAQhB,EAAAA;AACZ,KAAA;IACAiB,OAAS,EAAA;QACLC,IAAMjB,EAAAA,yBAAAA;QACNkB,EAAIjB,EAAAA;AACR,KAAA;IACAkB,gBAAkBjB,EAAAA;AACtB;;;;"}
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ import { ExitError } from '../error/ExitError.js';
3
+ import { getLogger } from '../logging.js';
4
+ import { run } from '../util/child.js';
5
+
6
+ const create = async (options)=>{
7
+ const logger = getLogger();
8
+ async function get() {
9
+ try {
10
+ logger.verbose('Gathering change information from Git');
11
+ try {
12
+ logger.debug('Executing git diff');
13
+ const excludeString = options.excludedPatterns.map((p)=>`':(exclude)${p}'`).join(' ');
14
+ const command = options.cached ? `git diff --cached -- . ${excludeString}` : `git diff -- . ${excludeString}`;
15
+ const { stdout, stderr } = await run(command);
16
+ if (stderr) {
17
+ logger.warn('Git log produced stderr: %s', stderr);
18
+ }
19
+ logger.debug('Git log output: %s', stdout);
20
+ return stdout;
21
+ } catch (error) {
22
+ logger.error('Failed to execute git log: %s', error.message);
23
+ throw error;
24
+ }
25
+ } catch (error) {
26
+ logger.error('Error occurred during gather change phase: %s %s', error.message, error.stack);
27
+ throw new ExitError('Error occurred during gather change phase');
28
+ }
29
+ }
30
+ return {
31
+ get
32
+ };
33
+ };
34
+ const hasStagedChanges = async ()=>{
35
+ const logger = getLogger();
36
+ try {
37
+ logger.debug('Checking for staged changes');
38
+ const { stderr } = await run('git diff --cached --quiet');
39
+ if (stderr) {
40
+ logger.warn('Git diff produced stderr: %s', stderr);
41
+ }
42
+ // If there are staged changes, git diff --cached --quiet will return non-zero
43
+ // So if we get here without an error, there are no staged changes
44
+ return false;
45
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
46
+ } catch (error) {
47
+ // If we get an error, it means there are staged changes
48
+ return true;
49
+ }
50
+ };
51
+
52
+ export { create, hasStagedChanges };
53
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sources":["../../src/content/diff.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { ExitError } from '../error/ExitError';\nimport { getLogger } from '../logging';\nimport { run } from '../util/child';\n\nexport interface Instance {\n get(): Promise<string>;\n}\n\nexport const create = async (options: { cached?: boolean, excludedPatterns: string[] }): Promise<Instance> => {\n const logger = getLogger();\n\n async function get(): Promise<string> {\n try {\n logger.verbose('Gathering change information from Git');\n\n try {\n logger.debug('Executing git diff');\n const excludeString = options.excludedPatterns.map(p => `':(exclude)${p}'`).join(' ');\n const command = options.cached ? `git diff --cached -- . ${excludeString}` : `git diff -- . ${excludeString}`;\n const { stdout, stderr } = await run(command);\n if (stderr) {\n logger.warn('Git log produced stderr: %s', stderr);\n }\n logger.debug('Git log output: %s', stdout);\n return stdout;\n } catch (error: any) {\n logger.error('Failed to execute git log: %s', error.message);\n throw error;\n }\n } catch (error: any) {\n logger.error('Error occurred during gather change phase: %s %s', error.message, error.stack);\n throw new ExitError('Error occurred during gather change phase');\n }\n }\n\n return { get };\n}\n\nexport const hasStagedChanges = async (): Promise<boolean> => {\n const logger = getLogger();\n try {\n logger.debug('Checking for staged changes');\n const { stderr } = await run('git diff --cached --quiet');\n if (stderr) {\n logger.warn('Git diff produced stderr: %s', stderr);\n }\n // If there are staged changes, git diff --cached --quiet will return non-zero\n // So if we get here without an error, there are no staged changes\n return false;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error: any) {\n // If we get an error, it means there are staged changes\n return true;\n }\n}\n"],"names":["create","options","logger","getLogger","get","verbose","debug","excludeString","excludedPatterns","map","p","join","command","cached","stdout","stderr","run","warn","error","message","stack","ExitError","hasStagedChanges"],"mappings":";;;;;AASO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMA,SAAS,CAAOC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAMC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAASC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;CAEf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAeC,GAAAA,CAAAA,CAAAA,CAAAA,CAAAA;QACX,CAAI,CAAA,CAAA,CAAA,CAAA;AACAF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,uCAAA,CAAA,CAAA;YAEf,CAAI,CAAA,CAAA,CAAA,CAAA;AACAH,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,oBAAA,CAAA,CAAA;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMC,gBAAgBN,CAAQO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,gBAAgB,CAACC,CAAAA,CAAAA,CAAG,CAACC,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAEA,CAAE,CAAA,CAAC,CAAC,CAAA,CAAEC,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA;AACjF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAMC,CAAUX,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,OAAAA,CAAQY,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,EAAEN,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,CAAG,CAAA,CAAA,CAAC,cAAc,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,CAAA,CAAA,CAAA;AAC7G,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAEO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAMC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAIJ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIG,MAAQ,CAAA,CAAA,CAAA;oBACRb,MAAOe,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAA+BF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,MAAAA,CAAAA,CAAAA;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;gBACAb,MAAOI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAAC,CAAsBQ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,MAAAA,CAAAA,CAAAA;gBACnC,OAAOA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAOI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAAA,CAAA,CAAA;AACjBhB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOgB,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,+BAAiCA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAMC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,CAAA,CAAA;gBAC3D,MAAMD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAOA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAAA,CAAA,CAAA;AACjBhB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOgB,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoDA,MAAMC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAED,MAAME,KAAK,CAAA,CAAA;AAC3F,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,2CAAA,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACJ,CAAA,CAAA,CAAA,CAAA,CAAA;IAEA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAEjB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACjB,CAAA,CAAA;CAEakB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAmB,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAMpB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAASC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;IACf,CAAI,CAAA,CAAA,CAAA,CAAA;AACAD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAOI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,6BAAA,CAAA,CAAA;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAES,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,GAAG,CAAMC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAID,MAAQ,CAAA,CAAA,CAAA;YACRb,MAAOe,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAgCF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,MAAAA,CAAAA,CAAAA;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;QAGA,OAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAOG,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAAA,CAAA,CAAA;;QAEjB,OAAO,CAAA,CAAA,CAAA,CAAA,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA;AACJ,CAAA,CAAA;;"}