@@ -74,6 +74,50 @@ describe("mode-validator", () => {
7474 // Should not allow tools from other groups
7575 expect ( isToolAllowedForMode ( "write_to_file" , codeMode , customModes ) ) . toBe ( false )
7676 } )
77+
78+ it ( "respects tool requirements in custom modes" , ( ) => {
79+ const customModes = [
80+ {
81+ slug : "custom-mode" ,
82+ name : "Custom Mode" ,
83+ roleDefinition : "Custom role" ,
84+ groups : [ "edit" ] as const ,
85+ } ,
86+ ]
87+ const requirements = { apply_diff : false }
88+
89+ // Should respect disabled requirement even if tool group is allowed
90+ expect ( isToolAllowedForMode ( "apply_diff" , "custom-mode" , customModes , requirements ) ) . toBe ( false )
91+
92+ // Should allow other edit tools
93+ expect ( isToolAllowedForMode ( "write_to_file" , "custom-mode" , customModes , requirements ) ) . toBe ( true )
94+ } )
95+ } )
96+
97+ describe ( "tool requirements" , ( ) => {
98+ it ( "respects tool requirements when provided" , ( ) => {
99+ const requirements = { apply_diff : false }
100+ expect ( isToolAllowedForMode ( "apply_diff" , codeMode , [ ] , requirements ) ) . toBe ( false )
101+
102+ const enabledRequirements = { apply_diff : true }
103+ expect ( isToolAllowedForMode ( "apply_diff" , codeMode , [ ] , enabledRequirements ) ) . toBe ( true )
104+ } )
105+
106+ it ( "allows tools when their requirements are not specified" , ( ) => {
107+ const requirements = { some_other_tool : true }
108+ expect ( isToolAllowedForMode ( "apply_diff" , codeMode , [ ] , requirements ) ) . toBe ( true )
109+ } )
110+
111+ it ( "handles undefined and empty requirements" , ( ) => {
112+ expect ( isToolAllowedForMode ( "apply_diff" , codeMode , [ ] , undefined ) ) . toBe ( true )
113+ expect ( isToolAllowedForMode ( "apply_diff" , codeMode , [ ] , { } ) ) . toBe ( true )
114+ } )
115+
116+ it ( "prioritizes requirements over mode configuration" , ( ) => {
117+ const requirements = { apply_diff : false }
118+ // Even in code mode which allows all tools, disabled requirement should take precedence
119+ expect ( isToolAllowedForMode ( "apply_diff" , codeMode , [ ] , requirements ) ) . toBe ( false )
120+ } )
77121 } )
78122 } )
79123
@@ -87,5 +131,21 @@ describe("mode-validator", () => {
87131 it ( "does not throw for allowed tools in architect mode" , ( ) => {
88132 expect ( ( ) => validateToolUse ( "read_file" , "architect" , [ ] ) ) . not . toThrow ( )
89133 } )
134+
135+ it ( "throws error when tool requirement is not met" , ( ) => {
136+ const requirements = { apply_diff : false }
137+ expect ( ( ) => validateToolUse ( "apply_diff" , codeMode , [ ] , requirements ) ) . toThrow (
138+ 'Tool "apply_diff" is not allowed in code mode.' ,
139+ )
140+ } )
141+
142+ it ( "does not throw when tool requirement is met" , ( ) => {
143+ const requirements = { apply_diff : true }
144+ expect ( ( ) => validateToolUse ( "apply_diff" , codeMode , [ ] , requirements ) ) . not . toThrow ( )
145+ } )
146+
147+ it ( "handles undefined requirements gracefully" , ( ) => {
148+ expect ( ( ) => validateToolUse ( "apply_diff" , codeMode , [ ] , undefined ) ) . not . toThrow ( )
149+ } )
90150 } )
91151} )
0 commit comments