Skip to content

Commit 201b3af

Browse files
authored
Merge pull request #317 from alex-feel/alex-feel-dev
Add effortLevel support to environment configurations
2 parents ba249fd + e9af0da commit 201b3af

12 files changed

+202
-1
lines changed

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ The golden config includes:
227227
- Hooks: `hooks` (files and events with command/prompt types)
228228
- MCP Servers: `mcp-servers` (http, sse, stdio transports)
229229
- Settings: `model`, `permissions`, `env-variables`, `os-env-variables`
230-
- Advanced: `command-defaults`, `user-settings`, `always-thinking-enabled`
230+
- Advanced: `command-defaults`, `user-settings`, `always-thinking-enabled`, `effort-level`
231231
- Extras: `company-announcements`, `attribution`, `status-line`
232232

233233
#### Key Design Principles

scripts/setup_environment.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
'always-thinking-enabled': 'alwaysThinkingEnabled',
8585
'company-announcements': 'companyAnnouncements',
8686
'env-variables': 'env', # Different names
87+
'effort-level': 'effortLevel', # Adaptive reasoning effort
8788
}
8889

8990

@@ -5050,6 +5051,7 @@ def create_additional_settings(
50505051
company_announcements: list[str] | None = None,
50515052
attribution: dict[str, str] | None = None,
50525053
status_line: dict[str, Any] | None = None,
5054+
effort_level: str | None = None,
50535055
) -> bool:
50545056
"""Create {command_name}-additional-settings.json with environment-specific settings.
50555057
@@ -5073,6 +5075,9 @@ def create_additional_settings(
50735075
'padding' key, and optional 'config' key for config file reference.
50745076
Both the script and config file are downloaded to ~/.claude/hooks/ and
50755077
the config path is appended as a command line argument.
5078+
effort_level: Optional effort level for adaptive reasoning.
5079+
Valid values: 'low', 'medium', 'high'. Controls how much thinking
5080+
is allocated based on task complexity.
50765081
50775082
Returns:
50785083
bool: True if successful, False otherwise.
@@ -5130,6 +5135,11 @@ def create_additional_settings(
51305135
settings['alwaysThinkingEnabled'] = always_thinking_enabled
51315136
info(f'Setting alwaysThinkingEnabled: {always_thinking_enabled}')
51325137

5138+
# Add effortLevel if explicitly set (None means not configured, leave as default)
5139+
if effort_level is not None:
5140+
settings['effortLevel'] = effort_level
5141+
info(f'Setting effortLevel: {effort_level}')
5142+
51335143
# Add companyAnnouncements if explicitly set (None means not configured, leave as default)
51345144
if company_announcements is not None:
51355145
settings['companyAnnouncements'] = company_announcements
@@ -6244,6 +6254,17 @@ def main() -> None:
62446254
# Extract status_line configuration
62456255
status_line = config.get('status-line')
62466256

6257+
# Extract and validate effort_level configuration
6258+
effort_level = config.get('effort-level')
6259+
if effort_level is not None:
6260+
valid_effort_levels = ('low', 'medium', 'high')
6261+
if effort_level not in valid_effort_levels:
6262+
warning(
6263+
f'Invalid effort-level value: {effort_level!r}. '
6264+
f'Valid values: {", ".join(valid_effort_levels)}. Skipping.',
6265+
)
6266+
effort_level = None
6267+
62476268
# Extract user-settings configuration (global user-level settings)
62486269
user_settings = config.get('user-settings')
62496270

@@ -6501,6 +6522,7 @@ def main() -> None:
65016522
company_announcements,
65026523
attribution,
65036524
status_line_arg,
6525+
effort_level,
65046526
)
65056527

65066528
# Step 15: Create launcher script
@@ -6613,6 +6635,8 @@ def main() -> None:
66136635
print(f' * Environment variables: {len(env_variables)} configured')
66146636
if company_announcements:
66156637
print(f' * Company announcements: {len(company_announcements)} configured')
6638+
if effort_level:
6639+
print(f' * Effort level: {effort_level}')
66166640
if status_line and isinstance(status_line, dict):
66176641
status_line_dict = cast(dict[str, Any], status_line)
66186642
status_line_file_val = status_line_dict.get('file', '')

tests/e2e/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ def golden_config() -> dict[str, Any]:
161161
- command-defaults: System prompt and mode
162162
- user-settings: User settings to merge
163163
- always-thinking-enabled: Thinking mode flag
164+
- effort-level: Adaptive reasoning effort level
164165
- company-announcements: Announcement messages
165166
- attribution: Commit and PR attribution settings
166167
- status-line: Status line configuration

tests/e2e/expected/common.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
'companyAnnouncements',
3131
'attribution',
3232
'statusLine',
33+
'effortLevel',
3334
],
3435
'mcp-config': [
3536
'mcpServers',

tests/e2e/golden_config.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,9 @@ user-settings:
176176
# Always-thinking mode
177177
always-thinking-enabled: true
178178

179+
# Effort level for adaptive reasoning
180+
effort-level: "low"
181+
179182
# Company announcements
180183
company-announcements:
181184
- "Welcome to E2E Testing Environment"

tests/e2e/test_full_setup.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ def test_setup_creates_expected_files(
9797
company_announcements=golden_config.get('company-announcements'),
9898
attribution=golden_config.get('attribution'),
9999
status_line=golden_config.get('status-line'),
100+
effort_level=golden_config.get('effort-level'),
100101
)
101102

102103
# Create MCP config file (use configure_all_mcp_servers to get profile servers)
@@ -168,6 +169,7 @@ def test_setup_processes_all_config_keys(
168169
company_announcements=golden_config.get('company-announcements'),
169170
attribution=golden_config.get('attribution'),
170171
status_line=golden_config.get('status-line'),
172+
effort_level=golden_config.get('effort-level'),
171173
)
172174

173175
# Verify additional-settings file exists (written to claude_user_dir)

tests/e2e/test_javascript_hooks.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def test_js_hook_has_node_prefix(
4242
company_announcements=None,
4343
attribution=None,
4444
status_line=None,
45+
effort_level=None,
4546
)
4647

4748
settings_path = claude_dir / f'{cmd}-additional-settings.json'
@@ -89,6 +90,7 @@ def test_mjs_hook_has_node_prefix(
8990
company_announcements=None,
9091
attribution=None,
9192
status_line=None,
93+
effort_level=None,
9294
)
9395

9496
settings_path = claude_dir / f'{cmd}-additional-settings.json'
@@ -131,6 +133,7 @@ def test_cjs_hook_has_node_prefix(
131133
company_announcements=None,
132134
attribution=None,
133135
status_line=None,
136+
effort_level=None,
134137
)
135138

136139
settings_path = claude_dir / f'{cmd}-additional-settings.json'
@@ -173,6 +176,7 @@ def test_js_hook_with_config_has_node_prefix(
173176
company_announcements=None,
174177
attribution=None,
175178
status_line=None,
179+
effort_level=None,
176180
)
177181

178182
settings_path = claude_dir / f'{cmd}-additional-settings.json'
@@ -227,6 +231,7 @@ def test_python_and_js_hooks_coexist(
227231
company_announcements=None,
228232
attribution=None,
229233
status_line=None,
234+
effort_level=None,
230235
)
231236

232237
settings_path = claude_dir / f'{cmd}-additional-settings.json'
@@ -282,6 +287,7 @@ def test_no_cmd_wrapper_for_node(
282287
company_announcements=None,
283288
attribution=None,
284289
status_line=None,
290+
effort_level=None,
285291
)
286292

287293
settings_path = claude_dir / f'{cmd}-additional-settings.json'

tests/e2e/test_output_files.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ def test_additional_settings_json_structure(
5353
company_announcements=golden_config.get('company-announcements'),
5454
attribution=golden_config.get('attribution'),
5555
status_line=golden_config.get('status-line'),
56+
effort_level=golden_config.get('effort-level'),
5657
)
5758

5859
# File is written to claude_user_dir (= claude_dir)
@@ -88,6 +89,7 @@ def test_additional_settings_has_expected_keys(
8889
company_announcements=golden_config.get('company-announcements'),
8990
attribution=golden_config.get('attribution'),
9091
status_line=golden_config.get('status-line'),
92+
effort_level=golden_config.get('effort-level'),
9193
)
9294

9395
# File is written to claude_user_dir (= claude_dir)
@@ -211,6 +213,7 @@ def test_permissions_structure_complete(
211213
company_announcements=None,
212214
attribution=None,
213215
status_line=None,
216+
effort_level=None,
214217
)
215218

216219
# File is written to claude_user_dir (= claude_dir)

tests/e2e/test_path_handling.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ def test_additional_settings_paths_expanded(
112112
company_announcements=golden_config.get('company-announcements'),
113113
attribution=golden_config.get('attribution'),
114114
status_line=golden_config.get('status-line'),
115+
effort_level=golden_config.get('effort-level'),
115116
)
116117

117118
# File is written to claude_user_dir (= claude_dir)
@@ -237,6 +238,7 @@ def test_hooks_command_paths_expanded(
237238
company_announcements=None,
238239
attribution=None,
239240
status_line=None,
241+
effort_level=None,
240242
)
241243

242244
# File is written to claude_user_dir (= claude_dir)
@@ -293,6 +295,7 @@ def test_status_line_command_expanded(
293295
company_announcements=None,
294296
attribution=None,
295297
status_line=status_line_config,
298+
effort_level=None,
296299
)
297300

298301
# File is written to claude_user_dir (= claude_dir)

tests/e2e/test_path_normalization.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ def test_hooks_use_posix_paths(
297297
company_announcements=None,
298298
attribution=None,
299299
status_line=None,
300+
effort_level=None,
300301
)
301302

302303
settings_path = claude_dir / f'{cmd}-additional-settings.json'
@@ -361,6 +362,7 @@ def test_status_line_uses_posix_paths(
361362
company_announcements=None,
362363
attribution=None,
363364
status_line=status_line_config,
365+
effort_level=None,
364366
)
365367

366368
settings_path = claude_dir / f'{cmd}-additional-settings.json'
@@ -411,6 +413,7 @@ def test_additional_settings_all_paths_consistent(
411413
company_announcements=golden_config.get('company-announcements'),
412414
attribution=golden_config.get('attribution'),
413415
status_line=golden_config.get('status-line'),
416+
effort_level=golden_config.get('effort-level'),
414417
)
415418

416419
settings_path = claude_dir / f'{cmd}-additional-settings.json'

0 commit comments

Comments
 (0)