diff --git a/package-lock.json b/package-lock.json index 5b736ad4..f5204e7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -148,6 +148,7 @@ "@radix-ui/react-slot": "^1.2.3", "@tailwindcss/postcss": "^4.1.11", "@tanstack/react-query": "^5.83.0", + "@tm/core": "*", "@types/mocha": "^10.0.10", "@types/node": "^22.10.5", "@types/react": "19.1.8", diff --git a/scripts/modules/config-manager.js b/scripts/modules/config-manager.js index d6947f8d..edd7ed2d 100644 --- a/scripts/modules/config-manager.js +++ b/scripts/modules/config-manager.js @@ -311,7 +311,8 @@ function validateClaudeCodeSettings(settings) { // Define the base settings schema without commandSpecific first const BaseSettingsSchema = z.object({ pathToClaudeCodeExecutable: z.string().optional(), - maxTurns: z.int().positive().optional(), + // Use number().int() for integer validation in Zod + maxTurns: z.number().int().positive().optional(), customSystemPrompt: z.string().optional(), appendSystemPrompt: z.string().optional(), permissionMode: z @@ -334,11 +335,14 @@ function validateClaudeCodeSettings(settings) { .optional() }); - // Define CommandSpecificSchema using the base schema - const CommandSpecificSchema = z.record( - z.enum(AI_COMMAND_NAMES), - BaseSettingsSchema - ); + // Define CommandSpecificSchema using flexible keys, but restrict to known commands + const CommandSpecificSchema = z + .record(z.string(), BaseSettingsSchema) + .refine( + (obj) => + Object.keys(obj || {}).every((k) => AI_COMMAND_NAMES.includes(k)), + { message: 'Invalid command name in commandSpecific' } + ); // Define the full settings schema with commandSpecific const SettingsSchema = BaseSettingsSchema.extend({ diff --git a/tests/integration/cli/complex-cross-tag-scenarios.test.js b/tests/integration/cli/complex-cross-tag-scenarios.test.js index adfe1cbc..5836edc0 100644 --- a/tests/integration/cli/complex-cross-tag-scenarios.test.js +++ b/tests/integration/cli/complex-cross-tag-scenarios.test.js @@ -372,7 +372,7 @@ describe('Complex Cross-Tag Scenarios', () => { fs.writeFileSync(tasksPath, JSON.stringify(largeTaskSet, null, 2)); // Should complete within reasonable time - const timeout = process.env.CI ? 11000 : 6000; + const timeout = process.env.CI ? 12000 : 8000; const startTime = Date.now(); execSync( `node ${binPath} move --from=50 --from-tag=master --to-tag=in-progress --with-dependencies`,