Jacob Magar
389b88f560
feat(settings): add update_ssh action with confirm=True guard
...
Enables/disables SSH and sets port via updateSshSettings mutation
(UpdateSshInput: enabled: Boolean!, port: Int!). Changing SSH config
can lock users out of the server — requires confirm=True.
- Add update_ssh to MUTATIONS, DESTRUCTIVE_ACTIONS, SETTINGS_ACTIONS
- Add ssh_enabled/ssh_port parameters to unraid_settings
- Add TestSshSettings class (4 tests: require ssh_enabled, require ssh_port, success, disable+verify vars)
- Update safety test KNOWN_DESTRUCTIVE + _DESTRUCTIVE_TEST_CASES + positive confirm test
- Update schema completeness test
757 tests passing
2026-03-15 20:13:51 -04:00
Jacob Magar
85cd173449
fix(elicitation): guard ctx=None in elicit_and_configure, cover all settings/docker/notifications actions
...
- setup.py: elicit_and_configure now accepts Context | None; returns False
immediately when ctx is None instead of crashing with AttributeError
- settings.py: added CredentialsNotConfiguredError try/except guard around
make_graphql_request calls in all 8 previously-unguarded actions
(update_temperature, update_time, configure_ups, update_api, connect_sign_in,
connect_sign_out, setup_remote_access, enable_dynamic_remote_access)
- docker.py: added guards to all 20 previously-unguarded make_graphql_request
calls (details, logs, networks, network_details, port_conflicts, check_updates,
restart, update_all, all 11 organizer mutations, and single-container fallback)
- notifications.py: added guards to all 11 previously-unguarded calls
(list, warnings, create, archive/unread, delete, delete_archived, archive_all,
archive_many, create_unique, unarchive_many, unarchive_all, recalculate)
2026-03-14 04:28:34 -04:00
Jacob Magar
d76bfb889d
fix: add confirm guard for update_ssh, fix avatar dropped without username/email
...
- info.py: add DESTRUCTIVE_ACTIONS set with update_ssh, add confirm param to
unraid_info signature, add destructive guard before mutation handlers
- settings.py: build user_info dict unconditionally so avatar is included
even when username/email are absent; only attach userInfo when non-empty
Resolves review threads PRRT_kwDOO6Hdxs50FgO0 PRRT_kwDOO6Hdxs50FgPC
2026-03-13 10:33:56 -04:00
Jacob Magar
9aee3a2448
feat: add 28 GraphQL mutations across storage, info, docker, and new settings tool
...
- storage: flash_backup mutation (initiates rclone flash backup, destructive)
- info: update_server and update_ssh mutations
- docker: 11 organizer mutations (create_folder, set_folder_children,
delete_entries, move_to_folder, move_to_position, rename_folder,
create_folder_with_items, update_view_prefs, sync_templates,
reset_template_mappings, refresh_digests); delete_entries and
reset_template_mappings added to DESTRUCTIVE_ACTIONS
- settings: new unraid_settings tool with 9 mutations (update,
update_temperature, update_time, configure_ups, update_api,
connect_sign_in, connect_sign_out, setup_remote_access,
enable_dynamic_remote_access); registered in server.py
- tests: 82 new tests (28 settings, 23 docker organizer, 7 info, 6 storage
+ 18 existing fixes for notification regex and safety audit list)
- bump version 0.3.0 → 0.4.0 (11 tools, ~104 actions)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com >
2026-03-13 03:03:37 -04:00