pvectl 0.2.0
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.
- checksums.yaml +7 -0
- data/.claude/rules/branch-before-changes.md +52 -0
- data/.claude/rules/documentation-updates.md +104 -0
- data/.claude/rules/git-workflow.md +84 -0
- data/.claude/rules/proxmox-api-docs.md +58 -0
- data/.claude/rules/rbs-signatures.md +80 -0
- data/.claude/rules/refactoring-as-design-option.md +35 -0
- data/.claude/scheduled_tasks.lock +1 -0
- data/.claude/settings.json +51 -0
- data/.mcp.json +8 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +138 -0
- data/CLAUDE.md +211 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/LICENSE.txt +21 -0
- data/README.md +143 -0
- data/Rakefile +8 -0
- data/docs/proxmox-api-update.sh +96 -0
- data/exe/pvectl +5 -0
- data/lib/pvectl/argv_preprocessor.rb +334 -0
- data/lib/pvectl/cli.rb +102 -0
- data/lib/pvectl/commands/apt.rb +389 -0
- data/lib/pvectl/commands/clone_container.rb +230 -0
- data/lib/pvectl/commands/clone_vm.rb +331 -0
- data/lib/pvectl/commands/cloudinit/command.rb +122 -0
- data/lib/pvectl/commands/cloudinit/dump.rb +94 -0
- data/lib/pvectl/commands/cloudinit/pending.rb +137 -0
- data/lib/pvectl/commands/cloudinit/regenerate.rb +79 -0
- data/lib/pvectl/commands/config/command.rb +65 -0
- data/lib/pvectl/commands/config/get_contexts.rb +68 -0
- data/lib/pvectl/commands/config/set_cluster.rb +103 -0
- data/lib/pvectl/commands/config/set_context.rb +136 -0
- data/lib/pvectl/commands/config/set_credentials.rb +181 -0
- data/lib/pvectl/commands/config/use_context.rb +69 -0
- data/lib/pvectl/commands/config/view.rb +67 -0
- data/lib/pvectl/commands/console.rb +93 -0
- data/lib/pvectl/commands/console_ct.rb +187 -0
- data/lib/pvectl/commands/console_vm.rb +187 -0
- data/lib/pvectl/commands/container_lifecycle_command.rb +77 -0
- data/lib/pvectl/commands/create_backup.rb +173 -0
- data/lib/pvectl/commands/create_container.rb +141 -0
- data/lib/pvectl/commands/create_resource_command.rb +244 -0
- data/lib/pvectl/commands/create_snapshot.rb +242 -0
- data/lib/pvectl/commands/create_vm.rb +267 -0
- data/lib/pvectl/commands/delete_backup.rb +139 -0
- data/lib/pvectl/commands/delete_command.rb +119 -0
- data/lib/pvectl/commands/delete_container.rb +30 -0
- data/lib/pvectl/commands/delete_snapshot.rb +248 -0
- data/lib/pvectl/commands/delete_vm.rb +127 -0
- data/lib/pvectl/commands/describe/command.rb +251 -0
- data/lib/pvectl/commands/edit_container.rb +56 -0
- data/lib/pvectl/commands/edit_dns.rb +149 -0
- data/lib/pvectl/commands/edit_hosts.rb +135 -0
- data/lib/pvectl/commands/edit_node.rb +54 -0
- data/lib/pvectl/commands/edit_resource_command.rb +180 -0
- data/lib/pvectl/commands/edit_vm.rb +154 -0
- data/lib/pvectl/commands/edit_volume.rb +189 -0
- data/lib/pvectl/commands/feature_command.rb +230 -0
- data/lib/pvectl/commands/feature_container.rb +21 -0
- data/lib/pvectl/commands/feature_vm.rb +94 -0
- data/lib/pvectl/commands/get/command.rb +360 -0
- data/lib/pvectl/commands/get/handlers/backups.rb +76 -0
- data/lib/pvectl/commands/get/handlers/capabilities.rb +107 -0
- data/lib/pvectl/commands/get/handlers/containers.rb +148 -0
- data/lib/pvectl/commands/get/handlers/disks.rb +107 -0
- data/lib/pvectl/commands/get/handlers/dns.rb +94 -0
- data/lib/pvectl/commands/get/handlers/hosts.rb +94 -0
- data/lib/pvectl/commands/get/handlers/nodes.rb +162 -0
- data/lib/pvectl/commands/get/handlers/services.rb +81 -0
- data/lib/pvectl/commands/get/handlers/snapshots.rb +97 -0
- data/lib/pvectl/commands/get/handlers/storage.rb +118 -0
- data/lib/pvectl/commands/get/handlers/subscription.rb +69 -0
- data/lib/pvectl/commands/get/handlers/tasks.rb +89 -0
- data/lib/pvectl/commands/get/handlers/templates.rb +175 -0
- data/lib/pvectl/commands/get/handlers/time.rb +118 -0
- data/lib/pvectl/commands/get/handlers/vms.rb +145 -0
- data/lib/pvectl/commands/get/handlers/volume.rb +134 -0
- data/lib/pvectl/commands/get/resource_handler.rb +63 -0
- data/lib/pvectl/commands/get/resource_registry.rb +18 -0
- data/lib/pvectl/commands/get/watch_loop.rb +129 -0
- data/lib/pvectl/commands/irreversible_command.rb +265 -0
- data/lib/pvectl/commands/logs/command.rb +275 -0
- data/lib/pvectl/commands/logs/handlers/journal.rb +46 -0
- data/lib/pvectl/commands/logs/handlers/syslog.rb +53 -0
- data/lib/pvectl/commands/logs/handlers/task_detail.rb +52 -0
- data/lib/pvectl/commands/logs/handlers/task_logs.rb +115 -0
- data/lib/pvectl/commands/logs/resource_handler.rb +46 -0
- data/lib/pvectl/commands/logs/resource_registry.rb +22 -0
- data/lib/pvectl/commands/migrate_command.rb +282 -0
- data/lib/pvectl/commands/migrate_container.rb +23 -0
- data/lib/pvectl/commands/migrate_vm.rb +122 -0
- data/lib/pvectl/commands/move_disk_command.rb +239 -0
- data/lib/pvectl/commands/move_disk_container.rb +21 -0
- data/lib/pvectl/commands/move_disk_vm.rb +127 -0
- data/lib/pvectl/commands/ping.rb +249 -0
- data/lib/pvectl/commands/pull.rb +342 -0
- data/lib/pvectl/commands/push.rb +352 -0
- data/lib/pvectl/commands/reset.rb +64 -0
- data/lib/pvectl/commands/resource_lifecycle_command.rb +277 -0
- data/lib/pvectl/commands/resource_registry.rb +73 -0
- data/lib/pvectl/commands/restart.rb +70 -0
- data/lib/pvectl/commands/restart_container.rb +18 -0
- data/lib/pvectl/commands/restore_backup.rb +236 -0
- data/lib/pvectl/commands/resume.rb +57 -0
- data/lib/pvectl/commands/rollback_snapshot.rb +228 -0
- data/lib/pvectl/commands/sendkey_vm.rb +205 -0
- data/lib/pvectl/commands/service.rb +293 -0
- data/lib/pvectl/commands/set_container.rb +50 -0
- data/lib/pvectl/commands/set_node.rb +52 -0
- data/lib/pvectl/commands/set_resource_command.rb +185 -0
- data/lib/pvectl/commands/set_vm.rb +136 -0
- data/lib/pvectl/commands/set_volume.rb +212 -0
- data/lib/pvectl/commands/shared_config_parsers.rb +126 -0
- data/lib/pvectl/commands/shared_flags.rb +155 -0
- data/lib/pvectl/commands/shutdown.rb +73 -0
- data/lib/pvectl/commands/shutdown_container.rb +18 -0
- data/lib/pvectl/commands/start.rb +79 -0
- data/lib/pvectl/commands/start_container.rb +18 -0
- data/lib/pvectl/commands/stop.rb +75 -0
- data/lib/pvectl/commands/stop_container.rb +18 -0
- data/lib/pvectl/commands/suspend.rb +64 -0
- data/lib/pvectl/commands/template_command.rb +205 -0
- data/lib/pvectl/commands/template_container.rb +27 -0
- data/lib/pvectl/commands/template_vm.rb +106 -0
- data/lib/pvectl/commands/top/command.rb +206 -0
- data/lib/pvectl/commands/top/handlers/containers.rb +61 -0
- data/lib/pvectl/commands/top/handlers/nodes.rb +61 -0
- data/lib/pvectl/commands/top/handlers/vms.rb +61 -0
- data/lib/pvectl/commands/top/resource_handler.rb +46 -0
- data/lib/pvectl/commands/top/resource_registry.rb +22 -0
- data/lib/pvectl/commands/unlink_disk_vm.rb +232 -0
- data/lib/pvectl/commands/vm_lifecycle_command.rb +77 -0
- data/lib/pvectl/commands/wakeonlan_node.rb +153 -0
- data/lib/pvectl/config/errors.rb +62 -0
- data/lib/pvectl/config/models/cluster.rb +180 -0
- data/lib/pvectl/config/models/context.rb +100 -0
- data/lib/pvectl/config/models/resolved_config.rb +171 -0
- data/lib/pvectl/config/models/user.rb +133 -0
- data/lib/pvectl/config/provider.rb +297 -0
- data/lib/pvectl/config/service.rb +300 -0
- data/lib/pvectl/config/store.rb +161 -0
- data/lib/pvectl/config/wizard.rb +309 -0
- data/lib/pvectl/config_serializer.rb +1034 -0
- data/lib/pvectl/connection/retry_handler.rb +161 -0
- data/lib/pvectl/connection.rb +157 -0
- data/lib/pvectl/console/terminal_session.rb +449 -0
- data/lib/pvectl/editor_session.rb +157 -0
- data/lib/pvectl/exit_codes.rb +43 -0
- data/lib/pvectl/formatters/base.rb +55 -0
- data/lib/pvectl/formatters/color_support.rb +90 -0
- data/lib/pvectl/formatters/json.rb +45 -0
- data/lib/pvectl/formatters/output_helper.rb +77 -0
- data/lib/pvectl/formatters/registry.rb +72 -0
- data/lib/pvectl/formatters/table.rb +235 -0
- data/lib/pvectl/formatters/wide.rb +93 -0
- data/lib/pvectl/formatters/yaml.rb +49 -0
- data/lib/pvectl/manifest_serializer.rb +142 -0
- data/lib/pvectl/models/apt_package.rb +107 -0
- data/lib/pvectl/models/backup.rb +173 -0
- data/lib/pvectl/models/base.rb +49 -0
- data/lib/pvectl/models/capability.rb +62 -0
- data/lib/pvectl/models/container.rb +205 -0
- data/lib/pvectl/models/container_operation_result.rb +27 -0
- data/lib/pvectl/models/dns_config.rb +54 -0
- data/lib/pvectl/models/hosts_file.rb +47 -0
- data/lib/pvectl/models/journal_entry.rb +16 -0
- data/lib/pvectl/models/network_interface.rb +85 -0
- data/lib/pvectl/models/node.rb +195 -0
- data/lib/pvectl/models/node_operation_result.rb +45 -0
- data/lib/pvectl/models/operation_result.rb +110 -0
- data/lib/pvectl/models/physical_disk.rb +193 -0
- data/lib/pvectl/models/service.rb +80 -0
- data/lib/pvectl/models/snapshot.rb +101 -0
- data/lib/pvectl/models/snapshot_description.rb +39 -0
- data/lib/pvectl/models/storage.rb +180 -0
- data/lib/pvectl/models/subscription.rb +87 -0
- data/lib/pvectl/models/syslog_entry.rb +17 -0
- data/lib/pvectl/models/task.rb +95 -0
- data/lib/pvectl/models/task_entry.rb +52 -0
- data/lib/pvectl/models/task_log_line.rb +17 -0
- data/lib/pvectl/models/time_config.rb +47 -0
- data/lib/pvectl/models/vm.rb +137 -0
- data/lib/pvectl/models/vm_operation_result.rb +27 -0
- data/lib/pvectl/models/volume.rb +133 -0
- data/lib/pvectl/models/volume_operation_result.rb +26 -0
- data/lib/pvectl/parsers/cloud_init_config.rb +92 -0
- data/lib/pvectl/parsers/disk_config.rb +97 -0
- data/lib/pvectl/parsers/lxc_mount_config.rb +98 -0
- data/lib/pvectl/parsers/lxc_net_config.rb +97 -0
- data/lib/pvectl/parsers/net_config.rb +95 -0
- data/lib/pvectl/parsers/smart_text.rb +42 -0
- data/lib/pvectl/plugin_loader.rb +157 -0
- data/lib/pvectl/presenters/apt_package.rb +99 -0
- data/lib/pvectl/presenters/backup.rb +128 -0
- data/lib/pvectl/presenters/base.rb +283 -0
- data/lib/pvectl/presenters/capability.rb +104 -0
- data/lib/pvectl/presenters/config/context.rb +80 -0
- data/lib/pvectl/presenters/container.rb +574 -0
- data/lib/pvectl/presenters/container_operation_result.rb +109 -0
- data/lib/pvectl/presenters/disk.rb +184 -0
- data/lib/pvectl/presenters/dns_config.rb +68 -0
- data/lib/pvectl/presenters/hosts_file.rb +61 -0
- data/lib/pvectl/presenters/journal_entry.rb +20 -0
- data/lib/pvectl/presenters/node.rb +762 -0
- data/lib/pvectl/presenters/node_operation_result.rb +50 -0
- data/lib/pvectl/presenters/operation_result.rb +61 -0
- data/lib/pvectl/presenters/service.rb +76 -0
- data/lib/pvectl/presenters/snapshot.rb +239 -0
- data/lib/pvectl/presenters/snapshot_operation_result.rb +125 -0
- data/lib/pvectl/presenters/storage.rb +329 -0
- data/lib/pvectl/presenters/subscription.rb +189 -0
- data/lib/pvectl/presenters/syslog_entry.rb +20 -0
- data/lib/pvectl/presenters/task_entry.rb +69 -0
- data/lib/pvectl/presenters/task_log_line.rb +20 -0
- data/lib/pvectl/presenters/template.rb +76 -0
- data/lib/pvectl/presenters/time_config.rb +86 -0
- data/lib/pvectl/presenters/top_container.rb +112 -0
- data/lib/pvectl/presenters/top_node.rb +115 -0
- data/lib/pvectl/presenters/top_presenter.rb +59 -0
- data/lib/pvectl/presenters/top_vm.rb +105 -0
- data/lib/pvectl/presenters/vm.rb +853 -0
- data/lib/pvectl/presenters/vm_operation_result.rb +109 -0
- data/lib/pvectl/presenters/volume.rb +136 -0
- data/lib/pvectl/presenters/volume_operation_result.rb +58 -0
- data/lib/pvectl/repositories/apt.rb +93 -0
- data/lib/pvectl/repositories/backup.rb +186 -0
- data/lib/pvectl/repositories/base.rb +110 -0
- data/lib/pvectl/repositories/capabilities.rb +96 -0
- data/lib/pvectl/repositories/container.rb +503 -0
- data/lib/pvectl/repositories/disk.rb +87 -0
- data/lib/pvectl/repositories/dns.rb +54 -0
- data/lib/pvectl/repositories/hosts.rb +63 -0
- data/lib/pvectl/repositories/journal.rb +23 -0
- data/lib/pvectl/repositories/node.rb +537 -0
- data/lib/pvectl/repositories/service.rb +139 -0
- data/lib/pvectl/repositories/snapshot.rb +133 -0
- data/lib/pvectl/repositories/storage.rb +302 -0
- data/lib/pvectl/repositories/subscription.rb +77 -0
- data/lib/pvectl/repositories/syslog.rb +25 -0
- data/lib/pvectl/repositories/task.rb +82 -0
- data/lib/pvectl/repositories/task_list.rb +30 -0
- data/lib/pvectl/repositories/task_log.rb +31 -0
- data/lib/pvectl/repositories/time_config.rb +53 -0
- data/lib/pvectl/repositories/vm.rb +616 -0
- data/lib/pvectl/repositories/volume.rb +306 -0
- data/lib/pvectl/selectors/base.rb +201 -0
- data/lib/pvectl/selectors/container.rb +116 -0
- data/lib/pvectl/selectors/disk.rb +59 -0
- data/lib/pvectl/selectors/vm.rb +116 -0
- data/lib/pvectl/selectors/volume.rb +59 -0
- data/lib/pvectl/services/backup.rb +209 -0
- data/lib/pvectl/services/clone_container.rb +260 -0
- data/lib/pvectl/services/clone_vm.rb +265 -0
- data/lib/pvectl/services/cloudinit.rb +96 -0
- data/lib/pvectl/services/console.rb +152 -0
- data/lib/pvectl/services/container_lifecycle.rb +124 -0
- data/lib/pvectl/services/create_container.rb +179 -0
- data/lib/pvectl/services/create_vm.rb +191 -0
- data/lib/pvectl/services/edit_container.rb +125 -0
- data/lib/pvectl/services/edit_dns.rb +159 -0
- data/lib/pvectl/services/edit_hosts.rb +78 -0
- data/lib/pvectl/services/edit_node.rb +147 -0
- data/lib/pvectl/services/edit_vm.rb +125 -0
- data/lib/pvectl/services/edit_volume.rb +224 -0
- data/lib/pvectl/services/get/resource_service.rb +98 -0
- data/lib/pvectl/services/move_disk.rb +132 -0
- data/lib/pvectl/services/pull_config.rb +94 -0
- data/lib/pvectl/services/push_config.rb +524 -0
- data/lib/pvectl/services/resize_volume.rb +253 -0
- data/lib/pvectl/services/resource_delete.rb +169 -0
- data/lib/pvectl/services/resource_migration.rb +170 -0
- data/lib/pvectl/services/sendkey.rb +108 -0
- data/lib/pvectl/services/service_lifecycle.rb +89 -0
- data/lib/pvectl/services/set_container.rb +128 -0
- data/lib/pvectl/services/set_node.rb +236 -0
- data/lib/pvectl/services/set_vm.rb +128 -0
- data/lib/pvectl/services/set_volume.rb +126 -0
- data/lib/pvectl/services/snapshot.rb +261 -0
- data/lib/pvectl/services/task_listing.rb +75 -0
- data/lib/pvectl/services/unlink_disk.rb +86 -0
- data/lib/pvectl/services/vm_lifecycle.rb +124 -0
- data/lib/pvectl/services/wakeonlan.rb +79 -0
- data/lib/pvectl/utils/resource_resolver.rb +80 -0
- data/lib/pvectl/version.rb +13 -0
- data/lib/pvectl/wizards/create_container.rb +105 -0
- data/lib/pvectl/wizards/create_vm.rb +98 -0
- data/lib/pvectl.rb +439 -0
- data/sig/external/gli.rbs +16 -0
- data/sig/external/proxmox_api.rbs +10 -0
- data/sig/pvectl/argv_preprocessor.rbs +53 -0
- data/sig/pvectl/cli.rbs +26 -0
- data/sig/pvectl/commands/apt.rbs +47 -0
- data/sig/pvectl/commands/clone_container.rbs +31 -0
- data/sig/pvectl/commands/clone_vm.rbs +33 -0
- data/sig/pvectl/commands/cloudinit/command.rbs +13 -0
- data/sig/pvectl/commands/cloudinit/dump.rbs +13 -0
- data/sig/pvectl/commands/cloudinit/pending.rbs +17 -0
- data/sig/pvectl/commands/cloudinit/regenerate.rbs +11 -0
- data/sig/pvectl/commands/config/command.rbs +9 -0
- data/sig/pvectl/commands/config/get_contexts.rbs +11 -0
- data/sig/pvectl/commands/config/set_cluster.rbs +11 -0
- data/sig/pvectl/commands/config/set_context.rbs +15 -0
- data/sig/pvectl/commands/config/set_credentials.rbs +15 -0
- data/sig/pvectl/commands/config/use_context.rbs +11 -0
- data/sig/pvectl/commands/config/view.rbs +11 -0
- data/sig/pvectl/commands/console.rbs +9 -0
- data/sig/pvectl/commands/console_ct.rbs +27 -0
- data/sig/pvectl/commands/console_vm.rbs +27 -0
- data/sig/pvectl/commands/container_lifecycle_command.rbs +25 -0
- data/sig/pvectl/commands/create_backup.rbs +29 -0
- data/sig/pvectl/commands/create_container.rbs +30 -0
- data/sig/pvectl/commands/create_resource_command.rbs +53 -0
- data/sig/pvectl/commands/create_snapshot.rbs +35 -0
- data/sig/pvectl/commands/create_vm.rbs +30 -0
- data/sig/pvectl/commands/delete_backup.rbs +25 -0
- data/sig/pvectl/commands/delete_command.rbs +45 -0
- data/sig/pvectl/commands/delete_container.rbs +11 -0
- data/sig/pvectl/commands/delete_snapshot.rbs +35 -0
- data/sig/pvectl/commands/delete_vm.rbs +13 -0
- data/sig/pvectl/commands/describe/command.rbs +27 -0
- data/sig/pvectl/commands/edit_container.rbs +17 -0
- data/sig/pvectl/commands/edit_dns.rbs +25 -0
- data/sig/pvectl/commands/edit_hosts.rbs +23 -0
- data/sig/pvectl/commands/edit_node.rbs +17 -0
- data/sig/pvectl/commands/edit_resource_command.rbs +35 -0
- data/sig/pvectl/commands/edit_vm.rbs +19 -0
- data/sig/pvectl/commands/edit_volume.rbs +24 -0
- data/sig/pvectl/commands/feature_command.rbs +43 -0
- data/sig/pvectl/commands/feature_container.rbs +10 -0
- data/sig/pvectl/commands/feature_vm.rbs +12 -0
- data/sig/pvectl/commands/get/command.rbs +42 -0
- data/sig/pvectl/commands/get/handlers/backups.rbs +23 -0
- data/sig/pvectl/commands/get/handlers/capabilities.rbs +29 -0
- data/sig/pvectl/commands/get/handlers/containers.rbs +35 -0
- data/sig/pvectl/commands/get/handlers/disks.rbs +27 -0
- data/sig/pvectl/commands/get/handlers/dns.rbs +25 -0
- data/sig/pvectl/commands/get/handlers/hosts.rbs +25 -0
- data/sig/pvectl/commands/get/handlers/nodes.rbs +33 -0
- data/sig/pvectl/commands/get/handlers/services.rbs +23 -0
- data/sig/pvectl/commands/get/handlers/snapshots.rbs +27 -0
- data/sig/pvectl/commands/get/handlers/storage.rbs +25 -0
- data/sig/pvectl/commands/get/handlers/subscription.rbs +25 -0
- data/sig/pvectl/commands/get/handlers/tasks.rbs +28 -0
- data/sig/pvectl/commands/get/handlers/templates.rbs +35 -0
- data/sig/pvectl/commands/get/handlers/time.rbs +29 -0
- data/sig/pvectl/commands/get/handlers/vms.rbs +35 -0
- data/sig/pvectl/commands/get/handlers/volume.rbs +27 -0
- data/sig/pvectl/commands/get/resource_handler.rbs +13 -0
- data/sig/pvectl/commands/get/resource_registry.rbs +8 -0
- data/sig/pvectl/commands/get/watch_loop.rbs +33 -0
- data/sig/pvectl/commands/irreversible_command.rbs +32 -0
- data/sig/pvectl/commands/logs/command.rbs +35 -0
- data/sig/pvectl/commands/logs/handlers/journal.rbs +21 -0
- data/sig/pvectl/commands/logs/handlers/syslog.rbs +21 -0
- data/sig/pvectl/commands/logs/handlers/task_detail.rbs +21 -0
- data/sig/pvectl/commands/logs/handlers/task_logs.rbs +35 -0
- data/sig/pvectl/commands/logs/resource_handler.rbs +11 -0
- data/sig/pvectl/commands/logs/resource_registry.rbs +8 -0
- data/sig/pvectl/commands/migrate_command.rbs +45 -0
- data/sig/pvectl/commands/migrate_container.rbs +11 -0
- data/sig/pvectl/commands/migrate_vm.rbs +13 -0
- data/sig/pvectl/commands/move_disk_command.rbs +43 -0
- data/sig/pvectl/commands/move_disk_container.rbs +11 -0
- data/sig/pvectl/commands/move_disk_vm.rbs +13 -0
- data/sig/pvectl/commands/ping.rbs +39 -0
- data/sig/pvectl/commands/pull.rbs +33 -0
- data/sig/pvectl/commands/push.rbs +32 -0
- data/sig/pvectl/commands/reset.rbs +11 -0
- data/sig/pvectl/commands/resource_lifecycle_command.rbs +55 -0
- data/sig/pvectl/commands/resource_registry.rbs +19 -0
- data/sig/pvectl/commands/restart.rbs +11 -0
- data/sig/pvectl/commands/restart_container.rbs +9 -0
- data/sig/pvectl/commands/restore_backup.rbs +27 -0
- data/sig/pvectl/commands/resume.rbs +11 -0
- data/sig/pvectl/commands/rollback_snapshot.rbs +31 -0
- data/sig/pvectl/commands/sendkey_vm.rbs +25 -0
- data/sig/pvectl/commands/service.rbs +38 -0
- data/sig/pvectl/commands/set_container.rbs +13 -0
- data/sig/pvectl/commands/set_node.rbs +13 -0
- data/sig/pvectl/commands/set_resource_command.rbs +25 -0
- data/sig/pvectl/commands/set_vm.rbs +15 -0
- data/sig/pvectl/commands/set_volume.rbs +24 -0
- data/sig/pvectl/commands/shared_config_parsers.rbs +19 -0
- data/sig/pvectl/commands/shared_flags.rbs +10 -0
- data/sig/pvectl/commands/shutdown.rbs +11 -0
- data/sig/pvectl/commands/shutdown_container.rbs +9 -0
- data/sig/pvectl/commands/start.rbs +11 -0
- data/sig/pvectl/commands/start_container.rbs +9 -0
- data/sig/pvectl/commands/stop.rbs +11 -0
- data/sig/pvectl/commands/stop_container.rbs +9 -0
- data/sig/pvectl/commands/suspend.rbs +11 -0
- data/sig/pvectl/commands/template_command.rbs +21 -0
- data/sig/pvectl/commands/template_container.rbs +10 -0
- data/sig/pvectl/commands/template_vm.rbs +12 -0
- data/sig/pvectl/commands/top/command.rbs +31 -0
- data/sig/pvectl/commands/top/handlers/containers.rbs +21 -0
- data/sig/pvectl/commands/top/handlers/nodes.rbs +21 -0
- data/sig/pvectl/commands/top/handlers/vms.rbs +21 -0
- data/sig/pvectl/commands/top/resource_handler.rbs +11 -0
- data/sig/pvectl/commands/top/resource_registry.rbs +8 -0
- data/sig/pvectl/commands/unlink_disk_vm.rbs +27 -0
- data/sig/pvectl/commands/vm_lifecycle_command.rbs +25 -0
- data/sig/pvectl/commands/wakeonlan_node.rbs +21 -0
- data/sig/pvectl/config/errors.rbs +24 -0
- data/sig/pvectl/config/models/cluster.rbs +39 -0
- data/sig/pvectl/config/models/context.rbs +23 -0
- data/sig/pvectl/config/models/resolved_config.rbs +51 -0
- data/sig/pvectl/config/models/user.rbs +31 -0
- data/sig/pvectl/config/provider.rbs +40 -0
- data/sig/pvectl/config/service.rbs +65 -0
- data/sig/pvectl/config/store.rbs +14 -0
- data/sig/pvectl/config/wizard.rbs +48 -0
- data/sig/pvectl/config_serializer.rbs +121 -0
- data/sig/pvectl/connection/retry_handler.rbs +31 -0
- data/sig/pvectl/connection.rbs +35 -0
- data/sig/pvectl/console/terminal_session.rbs +63 -0
- data/sig/pvectl/editor_session.rbs +33 -0
- data/sig/pvectl/exit_codes.rbs +19 -0
- data/sig/pvectl/formatters/base.rbs +13 -0
- data/sig/pvectl/formatters/color_support.rbs +13 -0
- data/sig/pvectl/formatters/json.rbs +7 -0
- data/sig/pvectl/formatters/output_helper.rbs +9 -0
- data/sig/pvectl/formatters/registry.rbs +13 -0
- data/sig/pvectl/formatters/table.rbs +25 -0
- data/sig/pvectl/formatters/wide.rbs +15 -0
- data/sig/pvectl/formatters/yaml.rbs +7 -0
- data/sig/pvectl/manifest_serializer.rbs +18 -0
- data/sig/pvectl/models/apt_package.rbs +26 -0
- data/sig/pvectl/models/backup.rbs +31 -0
- data/sig/pvectl/models/base.rbs +11 -0
- data/sig/pvectl/models/capability.rbs +16 -0
- data/sig/pvectl/models/container.rbs +44 -0
- data/sig/pvectl/models/container_operation_result.rbs +9 -0
- data/sig/pvectl/models/dns_config.rbs +15 -0
- data/sig/pvectl/models/hosts_file.rbs +13 -0
- data/sig/pvectl/models/journal_entry.rbs +10 -0
- data/sig/pvectl/models/network_interface.rbs +20 -0
- data/sig/pvectl/models/node.rbs +47 -0
- data/sig/pvectl/models/node_operation_result.rbs +12 -0
- data/sig/pvectl/models/operation_result.rbs +21 -0
- data/sig/pvectl/models/physical_disk.rbs +35 -0
- data/sig/pvectl/models/service.rbs +18 -0
- data/sig/pvectl/models/snapshot.rbs +21 -0
- data/sig/pvectl/models/snapshot_description.rbs +18 -0
- data/sig/pvectl/models/storage.rbs +39 -0
- data/sig/pvectl/models/subscription.rbs +24 -0
- data/sig/pvectl/models/syslog_entry.rbs +10 -0
- data/sig/pvectl/models/task.rbs +22 -0
- data/sig/pvectl/models/task_entry.rbs +24 -0
- data/sig/pvectl/models/task_log_line.rbs +10 -0
- data/sig/pvectl/models/time_config.rbs +12 -0
- data/sig/pvectl/models/vm.rbs +32 -0
- data/sig/pvectl/models/vm_operation_result.rbs +9 -0
- data/sig/pvectl/models/volume.rbs +29 -0
- data/sig/pvectl/models/volume_operation_result.rbs +9 -0
- data/sig/pvectl/parsers/cloud_init_config.rbs +15 -0
- data/sig/pvectl/parsers/disk_config.rbs +19 -0
- data/sig/pvectl/parsers/lxc_mount_config.rbs +19 -0
- data/sig/pvectl/parsers/lxc_net_config.rbs +19 -0
- data/sig/pvectl/parsers/net_config.rbs +19 -0
- data/sig/pvectl/parsers/smart_text.rbs +7 -0
- data/sig/pvectl/plugin_loader.rbs +25 -0
- data/sig/pvectl/presenters/apt_package.rbs +19 -0
- data/sig/pvectl/presenters/backup.rbs +25 -0
- data/sig/pvectl/presenters/base.rbs +41 -0
- data/sig/pvectl/presenters/capability.rbs +19 -0
- data/sig/pvectl/presenters/config/context.rbs +17 -0
- data/sig/pvectl/presenters/container.rbs +78 -0
- data/sig/pvectl/presenters/container_operation_result.rbs +19 -0
- data/sig/pvectl/presenters/disk.rbs +31 -0
- data/sig/pvectl/presenters/dns_config.rbs +13 -0
- data/sig/pvectl/presenters/hosts_file.rbs +13 -0
- data/sig/pvectl/presenters/journal_entry.rbs +11 -0
- data/sig/pvectl/presenters/node.rbs +118 -0
- data/sig/pvectl/presenters/node_operation_result.rbs +11 -0
- data/sig/pvectl/presenters/operation_result.rbs +17 -0
- data/sig/pvectl/presenters/service.rbs +15 -0
- data/sig/pvectl/presenters/snapshot.rbs +35 -0
- data/sig/pvectl/presenters/snapshot_operation_result.rbs +27 -0
- data/sig/pvectl/presenters/storage.rbs +59 -0
- data/sig/pvectl/presenters/subscription.rbs +36 -0
- data/sig/pvectl/presenters/syslog_entry.rbs +11 -0
- data/sig/pvectl/presenters/task_entry.rbs +21 -0
- data/sig/pvectl/presenters/task_log_line.rbs +11 -0
- data/sig/pvectl/presenters/template.rbs +15 -0
- data/sig/pvectl/presenters/time_config.rbs +19 -0
- data/sig/pvectl/presenters/top_container.rbs +17 -0
- data/sig/pvectl/presenters/top_node.rbs +17 -0
- data/sig/pvectl/presenters/top_presenter.rbs +13 -0
- data/sig/pvectl/presenters/top_vm.rbs +17 -0
- data/sig/pvectl/presenters/vm.rbs +91 -0
- data/sig/pvectl/presenters/vm_operation_result.rbs +19 -0
- data/sig/pvectl/presenters/volume.rbs +23 -0
- data/sig/pvectl/presenters/volume_operation_result.rbs +11 -0
- data/sig/pvectl/repositories/apt.rbs +17 -0
- data/sig/pvectl/repositories/backup.rbs +27 -0
- data/sig/pvectl/repositories/base.rbs +23 -0
- data/sig/pvectl/repositories/capabilities.rbs +20 -0
- data/sig/pvectl/repositories/container.rbs +63 -0
- data/sig/pvectl/repositories/disk.rbs +17 -0
- data/sig/pvectl/repositories/dns.rbs +13 -0
- data/sig/pvectl/repositories/hosts.rbs +13 -0
- data/sig/pvectl/repositories/journal.rbs +7 -0
- data/sig/pvectl/repositories/node.rbs +68 -0
- data/sig/pvectl/repositories/service.rbs +27 -0
- data/sig/pvectl/repositories/snapshot.rbs +19 -0
- data/sig/pvectl/repositories/storage.rbs +37 -0
- data/sig/pvectl/repositories/subscription.rbs +17 -0
- data/sig/pvectl/repositories/syslog.rbs +7 -0
- data/sig/pvectl/repositories/task.rbs +19 -0
- data/sig/pvectl/repositories/task_list.rbs +7 -0
- data/sig/pvectl/repositories/task_log.rbs +11 -0
- data/sig/pvectl/repositories/time_config.rbs +13 -0
- data/sig/pvectl/repositories/vm.rbs +85 -0
- data/sig/pvectl/repositories/volume.rbs +43 -0
- data/sig/pvectl/selectors/base.rbs +37 -0
- data/sig/pvectl/selectors/container.rbs +19 -0
- data/sig/pvectl/selectors/disk.rbs +13 -0
- data/sig/pvectl/selectors/vm.rbs +19 -0
- data/sig/pvectl/selectors/volume.rbs +13 -0
- data/sig/pvectl/services/backup.rbs +27 -0
- data/sig/pvectl/services/clone_container.rbs +35 -0
- data/sig/pvectl/services/clone_vm.rbs +35 -0
- data/sig/pvectl/services/cloudinit.rbs +19 -0
- data/sig/pvectl/services/console.rbs +23 -0
- data/sig/pvectl/services/container_lifecycle.rbs +26 -0
- data/sig/pvectl/services/create_container.rbs +64 -0
- data/sig/pvectl/services/create_vm.rbs +72 -0
- data/sig/pvectl/services/edit_container.rbs +17 -0
- data/sig/pvectl/services/edit_dns.rbs +23 -0
- data/sig/pvectl/services/edit_hosts.rbs +13 -0
- data/sig/pvectl/services/edit_node.rbs +21 -0
- data/sig/pvectl/services/edit_vm.rbs +17 -0
- data/sig/pvectl/services/edit_volume.rbs +18 -0
- data/sig/pvectl/services/get/resource_service.rbs +23 -0
- data/sig/pvectl/services/move_disk.rbs +21 -0
- data/sig/pvectl/services/pull_config.rbs +18 -0
- data/sig/pvectl/services/push_config.rbs +37 -0
- data/sig/pvectl/services/resize_volume.rbs +47 -0
- data/sig/pvectl/services/resource_delete.rbs +27 -0
- data/sig/pvectl/services/resource_migration.rbs +29 -0
- data/sig/pvectl/services/sendkey.rbs +19 -0
- data/sig/pvectl/services/service_lifecycle.rbs +17 -0
- data/sig/pvectl/services/set_container.rbs +14 -0
- data/sig/pvectl/services/set_node.rbs +23 -0
- data/sig/pvectl/services/set_vm.rbs +14 -0
- data/sig/pvectl/services/set_volume.rbs +12 -0
- data/sig/pvectl/services/snapshot.rbs +35 -0
- data/sig/pvectl/services/task_listing.rbs +13 -0
- data/sig/pvectl/services/unlink_disk.rbs +17 -0
- data/sig/pvectl/services/vm_lifecycle.rbs +26 -0
- data/sig/pvectl/services/wakeonlan.rbs +17 -0
- data/sig/pvectl/utils/resource_resolver.rbs +17 -0
- data/sig/pvectl/wizards/create_container.rbs +21 -0
- data/sig/pvectl/wizards/create_vm.rbs +21 -0
- data/sig/pvectl.rbs +9 -0
- metadata +675 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: bb04ff3ee9a4e695997d9d9ca6f5916739192462b99613e958e7688b8d12c35a
|
|
4
|
+
data.tar.gz: f896c8bed260817c0f4cdb92fded47564d936b305b26bba23cf3521c5e8383d9
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 3dab5c1c7042461e7077b2ff21046c8d3d47a23a06c89cf1d456406355aa6d9f95a6773bb02f662b79d24fc824c46beec7cc1eea269076e8151cb8563628e88e
|
|
7
|
+
data.tar.gz: d30437f002bfa2c551ef384325ab92af5a92f859036976ba8c9557d70069fba2febd2ef75f684c25300fc83018c6a584002a26031ccfda9027d15ed81dfb544d
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Branch Before Changes Rule
|
|
2
|
+
|
|
3
|
+
## MUST work on a feature branch before modifying any repository files
|
|
4
|
+
|
|
5
|
+
Every time you need to modify files in the repository, you MUST follow this sequence:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
1. Be on a feature branch → 2. Make changes → 3. Commit → STOP
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Workflow ends at commit.** The agent must NOT push and must NOT create a pull request on its own initiative. Push and PR creation require an explicit user request — see `git-workflow.md` for details.
|
|
12
|
+
|
|
13
|
+
### Workflow
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# 1. Determine the working branch
|
|
17
|
+
# - If already on a non-main feature branch: continue using it (preferred)
|
|
18
|
+
# - If on main: create a new feature branch
|
|
19
|
+
git status # check current branch
|
|
20
|
+
git checkout -b <type>/<short-description> main # only if on main
|
|
21
|
+
|
|
22
|
+
# 2. Make changes, commit (see git-workflow.md for commit conventions)
|
|
23
|
+
git add <files>
|
|
24
|
+
git commit -m "<type>(<scope>): <description>"
|
|
25
|
+
|
|
26
|
+
# 3. STOP. Do NOT push or create PRs on your own — these need explicit user request.
|
|
27
|
+
# git merge is allowed for local integration when appropriate.
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Rules
|
|
31
|
+
|
|
32
|
+
- **NEVER commit changes directly to `main`** — always work on a feature branch.
|
|
33
|
+
- **NEVER push to remote on agent initiative** — `git push` only when the user explicitly asks for it.
|
|
34
|
+
- **NEVER create pull requests on agent initiative** — `gh pr create` only when the user explicitly asks for it.
|
|
35
|
+
- `git merge` is allowed for local merges between branches.
|
|
36
|
+
- If currently on a non-`main` branch, **continue working there** — do not create a new branch unless the new request is clearly a different scope.
|
|
37
|
+
- Create a new branch **before** making any file modifications, not after.
|
|
38
|
+
- One logical *initiative* per branch — multiple commits per branch is expected and desired.
|
|
39
|
+
- If the user asks to make a change without specifying a branch and we're on `main`, create one automatically following `git-workflow.md` naming conventions.
|
|
40
|
+
- After committing, stay on the feature branch.
|
|
41
|
+
|
|
42
|
+
### When this applies
|
|
43
|
+
|
|
44
|
+
- Any code changes (`lib/`, `test/`, `sig/`)
|
|
45
|
+
- Configuration changes (`.claude/rules/`, `CLAUDE.md`, `.mcp.json`)
|
|
46
|
+
- Documentation changes (`CHANGELOG.md`, `README.md`)
|
|
47
|
+
- Any other tracked file in the repository
|
|
48
|
+
|
|
49
|
+
### When this does NOT apply
|
|
50
|
+
|
|
51
|
+
- Read-only operations (exploring code, running tests, searching)
|
|
52
|
+
- Changes to files outside the repository (memory files, local config)
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Documentation Update Rules
|
|
2
|
+
|
|
3
|
+
## CLAUDE.md philosophy
|
|
4
|
+
|
|
5
|
+
CLAUDE.md defines **architectural assumptions and conventions** — how to build, not what exists. It should contain:
|
|
6
|
+
- Design patterns and when to use them
|
|
7
|
+
- Architectural flow diagrams (data paths, layer responsibilities)
|
|
8
|
+
- Module layer roles (directory → purpose mapping)
|
|
9
|
+
- Coding conventions and style rules
|
|
10
|
+
- Configuration format and loading hierarchy
|
|
11
|
+
- Known pitfalls and anti-patterns
|
|
12
|
+
|
|
13
|
+
It must NOT contain:
|
|
14
|
+
- Class/module inventories or lists of files
|
|
15
|
+
- Specific class names beyond pattern examples (e.g., "BaseTemplate" in Hybrid Include is fine, but listing all 12 repositories is not)
|
|
16
|
+
- Feature lists or command enumerations (that belongs in README)
|
|
17
|
+
- Anything that requires updating when adding a new class within an existing pattern
|
|
18
|
+
|
|
19
|
+
**Litmus test:** If adding a new handler/model/presenter/repository requires editing CLAUDE.md, the document has drifted into inventory territory.
|
|
20
|
+
|
|
21
|
+
## MUST update documentation after completing changes
|
|
22
|
+
|
|
23
|
+
After finishing any feature, bugfix, refactor, or other code change — before claiming work is done — you MUST update:
|
|
24
|
+
|
|
25
|
+
### 1. CHANGELOG.md
|
|
26
|
+
|
|
27
|
+
- Add entry under `## [Unreleased]` in the appropriate section:
|
|
28
|
+
- **Added** — new features and capabilities
|
|
29
|
+
- **Changed** — changes to existing functionality
|
|
30
|
+
- **Fixed** — bug fixes
|
|
31
|
+
- **Removed** — removed features
|
|
32
|
+
- **Documentation** — documentation-only changes
|
|
33
|
+
- Format: `- **scope**: Description of what changed`
|
|
34
|
+
- Follow [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) conventions
|
|
35
|
+
- All entries in English (matching project convention: code, comments, commits in English)
|
|
36
|
+
|
|
37
|
+
### 2. README.md
|
|
38
|
+
|
|
39
|
+
- Update if the change affects user-facing behavior:
|
|
40
|
+
- New commands or subcommands
|
|
41
|
+
- New flags or options
|
|
42
|
+
- Changed CLI syntax or output
|
|
43
|
+
- New configuration options
|
|
44
|
+
- New features described in the Features section
|
|
45
|
+
- Do NOT update README for internal refactors, test changes, or implementation details invisible to the user
|
|
46
|
+
|
|
47
|
+
### 3. CLI Help (`long_desc`)
|
|
48
|
+
|
|
49
|
+
When adding or modifying a command, MUST update its `long_desc` help text:
|
|
50
|
+
|
|
51
|
+
- Every command MUST have a `long_desc` with man-page style sections: DESCRIPTION, EXAMPLES, NOTES, SEE ALSO
|
|
52
|
+
- Sub-commands use `parent.long_desc <<~HELP ... HELP` BEFORE `parent.command :name do |s|` (NOT `s.long_desc` inside the block — GLI ignores it)
|
|
53
|
+
- Sub-commands also need `parent.desc "..."` before `parent.command` for the short description
|
|
54
|
+
- Include 2-5 practical examples with `$ pvectl ...` syntax
|
|
55
|
+
- Reference related commands in SEE ALSO
|
|
56
|
+
|
|
57
|
+
### 4. GitHub Wiki
|
|
58
|
+
|
|
59
|
+
When changes affect user-facing behavior, update the relevant wiki page(s):
|
|
60
|
+
|
|
61
|
+
- Wiki repo is cloned locally (see `CLAUDE.local.md` for path)
|
|
62
|
+
- Key pages to consider: Command-Reference.md, Configuration-Guide.md, Getting-Started.md, Workflows.md
|
|
63
|
+
- New commands → update Command-Reference.md
|
|
64
|
+
- New flags/options → update Command-Reference.md and any relevant guide pages
|
|
65
|
+
- New configuration options → update Configuration-Guide.md
|
|
66
|
+
- Commit and push wiki changes separately (wiki is a separate git repo)
|
|
67
|
+
|
|
68
|
+
### When to skip
|
|
69
|
+
|
|
70
|
+
- Pure test changes (`test:` commits) — skip README/wiki, add to CHANGELOG only if significant
|
|
71
|
+
- CI/CD or tooling changes (`chore:` commits) — skip all unless user-facing
|
|
72
|
+
- `.claude/` config changes — skip all
|
|
73
|
+
|
|
74
|
+
### 3. CLAUDE.md — propose only, do NOT auto-update
|
|
75
|
+
|
|
76
|
+
After completing work, evaluate whether the change affects project architecture or conventions documented in CLAUDE.md. If it does, **propose the update to the user** — do NOT modify CLAUDE.md automatically.
|
|
77
|
+
|
|
78
|
+
Propose when:
|
|
79
|
+
- A new architectural pattern or convention was introduced
|
|
80
|
+
- An existing pattern described in CLAUDE.md was changed or removed
|
|
81
|
+
- A new module layer was added (new directory under `lib/pvectl/`)
|
|
82
|
+
- Design patterns table needs a new entry
|
|
83
|
+
|
|
84
|
+
Do NOT propose for:
|
|
85
|
+
- Adding new classes/files within existing patterns (new handler, new model, etc.)
|
|
86
|
+
- Bug fixes, refactors that don't change architecture
|
|
87
|
+
- Anything that would turn CLAUDE.md into a class inventory
|
|
88
|
+
|
|
89
|
+
Format: briefly describe what changed and suggest specific edits. Wait for user approval before touching CLAUDE.md.
|
|
90
|
+
|
|
91
|
+
### Order of operations
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
1. Implement changes
|
|
95
|
+
2. Update RBS signatures (see rbs-signatures.md)
|
|
96
|
+
3. Update CLI help long_desc (if command changed)
|
|
97
|
+
4. Verify (tests pass, rbs parse clean)
|
|
98
|
+
5. Update CHANGELOG.md
|
|
99
|
+
6. Update README.md (if user-facing)
|
|
100
|
+
7. Update GitHub Wiki (if user-facing)
|
|
101
|
+
8. Propose CLAUDE.md update (if architecture changed)
|
|
102
|
+
9. Commit code changes
|
|
103
|
+
10. Commit and push wiki changes (separate repo)
|
|
104
|
+
```
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Git Workflow Rules
|
|
2
|
+
|
|
3
|
+
## Branch Strategy
|
|
4
|
+
|
|
5
|
+
This project uses simple feature branches — NO git worktrees.
|
|
6
|
+
|
|
7
|
+
### Branch Naming
|
|
8
|
+
|
|
9
|
+
Use descriptive branch names with prefixes matching Conventional Commits:
|
|
10
|
+
|
|
11
|
+
| Prefix | Use Case | Example |
|
|
12
|
+
|--------|----------|---------|
|
|
13
|
+
| `feat/` | New features | `feat/describe-command` |
|
|
14
|
+
| `fix/` | Bug fixes | `fix/get-params-encoding` |
|
|
15
|
+
| `refactor/` | Code restructuring | `refactor/repository-pattern` |
|
|
16
|
+
| `test/` | Test improvements | `test/mock-coverage` |
|
|
17
|
+
| `docs/` | Documentation | `docs/rdoc-annotations` |
|
|
18
|
+
| `chore/` | Tooling, deps, config | `chore/update-dependencies` |
|
|
19
|
+
|
|
20
|
+
### Branch Lifecycle
|
|
21
|
+
|
|
22
|
+
1. **Start** — determine the working branch:
|
|
23
|
+
- If currently on a non-`main` branch, **continue using it** (append commits to the ongoing branch). This is the default to avoid branch proliferation.
|
|
24
|
+
- If on `main`, create a new feature branch:
|
|
25
|
+
```bash
|
|
26
|
+
git checkout -b feat/my-feature main
|
|
27
|
+
```
|
|
28
|
+
- Only create a new branch from `main` if the new work is a clearly different scope from the current branch.
|
|
29
|
+
|
|
30
|
+
2. **Commit** frequently with small, atomic commits (see Commit Rules below).
|
|
31
|
+
|
|
32
|
+
3. **Stop** — the agent's workflow ends at the commit. **DO NOT push and DO NOT create a PR on your own initiative.** Pushing and PR creation require an explicit user request.
|
|
33
|
+
|
|
34
|
+
### Rules
|
|
35
|
+
|
|
36
|
+
- **NEVER push to remote on agent initiative** — `git push`, `git push -u`, force-push, any variant. Push is permitted ONLY when the user explicitly asks for it (e.g. "push it", "wypchnij branch"). The agent must NOT decide on its own that the work is "ready to push" or push as part of a workflow.
|
|
37
|
+
- **NEVER create pull requests on agent initiative** — `gh pr create` and any equivalent (web UI automation, API calls, scripts) is permitted ONLY when the user explicitly asks (e.g. "open a PR", "stwórz PR"). The agent must never open a PR autonomously, even when commits land cleanly and the branch "feels finished".
|
|
38
|
+
- `git merge` is allowed for local merges. Use it to integrate feature branches when needed.
|
|
39
|
+
- Never commit directly to `main` for feature work — always go through a feature branch first.
|
|
40
|
+
- Always work on a feature branch — create one only if not already on a non-`main` branch.
|
|
41
|
+
- **Append commits to the existing feature branch** when continuing related work. Don't spin up a new branch per request.
|
|
42
|
+
- One logical *initiative* per branch (not one commit per branch). Multiple commits per branch is normal and preferred.
|
|
43
|
+
- Keep branches short-lived — they exist until the user decides to merge or open a PR.
|
|
44
|
+
- The `superpowers:finishing-a-development-branch` skill does NOT apply in this project — agent workflow ends at commit. Push, PR, and remote integration require explicit user action.
|
|
45
|
+
|
|
46
|
+
## Commit Rules
|
|
47
|
+
|
|
48
|
+
### Format: Conventional Commits
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
<type>(<scope>): <description>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Types:** `feat`, `fix`, `refactor`, `test`, `docs`, `chore`
|
|
55
|
+
|
|
56
|
+
**Scope:** module or area affected (e.g., `cli`, `repositories`, `logs`, `config`)
|
|
57
|
+
|
|
58
|
+
### Examples
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
feat(cli): register logs command with filtering flags
|
|
62
|
+
fix(repositories): pass GET query params via rest-client params key
|
|
63
|
+
test(logs): add handler unit tests with mock repositories
|
|
64
|
+
refactor(presenters): extract shared column definitions
|
|
65
|
+
docs(logs): add RDoc documentation for public API
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Commit Discipline
|
|
69
|
+
|
|
70
|
+
- Commit after each logical unit of work (TDD cycle: test → implement → refactor)
|
|
71
|
+
- Never bundle unrelated changes in one commit
|
|
72
|
+
- Write imperative mood descriptions: "add", "fix", "remove" — not "added", "fixes"
|
|
73
|
+
- **NEVER add `Co-Authored-By` trailers** — this is a hard rule, no exceptions. Do not add any Co-Authored-By, Signed-off-by, or similar trailers to commit messages. This applies to ALL commits: manual, from subagents, from scripts. When dispatching subagents that commit, explicitly instruct them: "Do NOT add Co-Authored-By or any trailers to commit messages."
|
|
74
|
+
- When the user asks to commit — execute immediately, no questions asked
|
|
75
|
+
|
|
76
|
+
### TDD Commit Rhythm
|
|
77
|
+
|
|
78
|
+
Following the red-green-refactor cycle, the natural commit points are:
|
|
79
|
+
|
|
80
|
+
1. `test(scope): add failing test for <behavior>` — after writing the test (red)
|
|
81
|
+
2. `feat(scope): implement <behavior>` — after making it pass (green)
|
|
82
|
+
3. `refactor(scope): <what changed>` — after cleanup (refactor)
|
|
83
|
+
|
|
84
|
+
Not every cycle needs 3 commits — use judgment. Small features can be one commit.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Proxmox API Documentation Rules
|
|
2
|
+
|
|
3
|
+
## MUST consult official sources before implementing API calls
|
|
4
|
+
|
|
5
|
+
When implementing or modifying any Proxmox API interaction (repositories, endpoints, parameters), you MUST:
|
|
6
|
+
|
|
7
|
+
1. **Check the local Proxmox API reference** in `docs/proxmox-api/` (JSON files parsed from official `apidata.js`):
|
|
8
|
+
- Files are organized by API section: `nodes-qemu-status.json`, `nodes-lxc-config.json`, `storage.json`, etc.
|
|
9
|
+
- Each file contains a flat array of endpoint objects with: `path`, `info` (per HTTP method with `parameters`, `returns`, `description`), `permissions`
|
|
10
|
+
- Use `Read` tool to inspect the relevant file for your endpoint
|
|
11
|
+
- Use `Grep` to search across all files: `grep -r "endpoint-keyword" docs/proxmox-api/`
|
|
12
|
+
|
|
13
|
+
2. **Check the proxmox-api gem documentation** via `context7` MCP server with library ID `/L-Eugene/proxmox-api` to verify:
|
|
14
|
+
- Correct Ruby client usage and method chaining
|
|
15
|
+
- How to pass parameters (remember the `params:` key fix — see MEMORY.md)
|
|
16
|
+
|
|
17
|
+
## File naming convention
|
|
18
|
+
|
|
19
|
+
| File | Covers |
|
|
20
|
+
|------|--------|
|
|
21
|
+
| `nodes-qemu-status.json` | `/nodes/{node}/qemu/{vmid}/status/*` (start, stop, current, etc.) |
|
|
22
|
+
| `nodes-qemu-config.json` | `/nodes/{node}/qemu/{vmid}/config` (VM configuration — large file, use offset/limit) |
|
|
23
|
+
| `nodes-qemu-snapshot.json` | `/nodes/{node}/qemu/{vmid}/snapshot/*` |
|
|
24
|
+
| `nodes-qemu-firewall.json` | `/nodes/{node}/qemu/{vmid}/firewall/*` |
|
|
25
|
+
| `nodes-qemu-agent.json` | `/nodes/{node}/qemu/{vmid}/agent/*` |
|
|
26
|
+
| `nodes-qemu-migrate.json` | `/nodes/{node}/qemu/{vmid}/migrate` |
|
|
27
|
+
| `nodes-lxc-status.json` | `/nodes/{node}/lxc/{vmid}/status/*` |
|
|
28
|
+
| `nodes-lxc-config.json` | `/nodes/{node}/lxc/{vmid}/config` |
|
|
29
|
+
| `nodes-lxc-snapshot.json` | `/nodes/{node}/lxc/{vmid}/snapshot/*` |
|
|
30
|
+
| `nodes-storage.json` | `/nodes/{node}/storage/*` (node-level storage) |
|
|
31
|
+
| `nodes-tasks.json` | `/nodes/{node}/tasks/*` |
|
|
32
|
+
| `nodes-disks.json` | `/nodes/{node}/disks/*` |
|
|
33
|
+
| `storage.json` | `/storage/*` (cluster-level storage config) |
|
|
34
|
+
| `access.json` | `/access/*` (auth, users, roles, tokens) |
|
|
35
|
+
| `cluster-*.json` | `/cluster/*` (HA, backup, firewall, SDN, etc.) |
|
|
36
|
+
|
|
37
|
+
## Updating the API reference
|
|
38
|
+
|
|
39
|
+
If `docs/proxmox-api/` is empty or outdated, regenerate with the update script:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
bash docs/proxmox-api-update.sh
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## MUST NOT
|
|
46
|
+
|
|
47
|
+
- **Guess or invent endpoint paths** — always verify against the local API reference
|
|
48
|
+
- **Assume parameter names** — Proxmox naming is inconsistent (e.g., `vmid` vs `id`, `reboot` vs `restart`)
|
|
49
|
+
- **Assume HTTP methods** — some operations use unexpected methods
|
|
50
|
+
- **Copy patterns from other APIs** — Proxmox has its own conventions
|
|
51
|
+
|
|
52
|
+
## Known Proxmox API gotchas
|
|
53
|
+
|
|
54
|
+
- LXC restart uses endpoint `reboot`, not `restart`
|
|
55
|
+
- LXC does NOT support `reset`, `suspend`, `resume`
|
|
56
|
+
- Task status endpoint returns UPID format strings
|
|
57
|
+
- Some endpoints use `POST` for read-like operations (e.g., task log with pagination)
|
|
58
|
+
- Storage content listing requires `content` parameter to filter by type
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# RBS Type Signatures Rules
|
|
2
|
+
|
|
3
|
+
## MUST maintain RBS signatures alongside code changes
|
|
4
|
+
|
|
5
|
+
Every time you create, modify, or delete a Ruby file under `lib/`, you MUST update the corresponding RBS signature file under `sig/`.
|
|
6
|
+
|
|
7
|
+
### When creating a new file
|
|
8
|
+
|
|
9
|
+
- Create `sig/pvectl/<path>.rbs` mirroring `lib/pvectl/<path>.rb`
|
|
10
|
+
- Include signatures for all public and private methods, attr_readers, constants, and class inheritance
|
|
11
|
+
- Follow existing RBS conventions in the project (see below)
|
|
12
|
+
|
|
13
|
+
### When modifying an existing file
|
|
14
|
+
|
|
15
|
+
- Update the corresponding `.rbs` file to reflect:
|
|
16
|
+
- New methods added
|
|
17
|
+
- Changed method signatures (parameters, return types)
|
|
18
|
+
- Removed methods
|
|
19
|
+
- Changed visibility (public/private)
|
|
20
|
+
- New or changed constants
|
|
21
|
+
- Changed inheritance or module includes
|
|
22
|
+
|
|
23
|
+
### When deleting a file
|
|
24
|
+
|
|
25
|
+
- Delete the corresponding `.rbs` file
|
|
26
|
+
|
|
27
|
+
### When renaming/moving a file
|
|
28
|
+
|
|
29
|
+
- Rename/move the corresponding `.rbs` file to match the new path
|
|
30
|
+
|
|
31
|
+
## Validation
|
|
32
|
+
|
|
33
|
+
After creating or modifying `.rbs` files, validate syntax:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
BUNDLE_GEMFILE="" rbs parse sig/pvectl/<path>.rbs
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The `rbs` gem is NOT in the project's Gemfile — always use `BUNDLE_GEMFILE=""` to bypass bundler.
|
|
40
|
+
|
|
41
|
+
## Conventions
|
|
42
|
+
|
|
43
|
+
Follow these established project conventions:
|
|
44
|
+
|
|
45
|
+
| Convention | Example |
|
|
46
|
+
|------------|---------|
|
|
47
|
+
| Nullable types | `String?` for values that can be nil |
|
|
48
|
+
| Boolean predicates | `def running?: () -> bool` |
|
|
49
|
+
| API data hashes | `Hash[Symbol, untyped]` |
|
|
50
|
+
| Void returns | `-> void` for methods with no meaningful return |
|
|
51
|
+
| VMIDs/CTIDs | `Integer` (or `Integer \| String` when API accepts both) |
|
|
52
|
+
| UPIDs | `String` |
|
|
53
|
+
| Gem boundary types | `untyped` for objects from external gems (GLI, ProxmoxAPI, TTY, Pastel) |
|
|
54
|
+
| Optional parameters | `?String name` for positional, `?key: String` for keyword |
|
|
55
|
+
| Block parameters | `{ (String) -> void }` or `{ () -> String }` |
|
|
56
|
+
|
|
57
|
+
### RBS limitations to remember
|
|
58
|
+
|
|
59
|
+
- **No `protected`** — use `private` instead (RBS only supports `public` and `private`)
|
|
60
|
+
- **No `extend untyped`** — list class methods directly with a comment
|
|
61
|
+
- **No `nil` in tuple literals** — use `[String?, String?]` instead of `[String, String] | [nil, nil]`
|
|
62
|
+
|
|
63
|
+
## Order of operations
|
|
64
|
+
|
|
65
|
+
RBS updates fit into the documentation workflow (see `documentation-updates.md`):
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
1. Implement changes
|
|
69
|
+
2. Update RBS signatures ← here
|
|
70
|
+
3. Verify (tests pass, rbs parse clean)
|
|
71
|
+
4. Update CHANGELOG.md
|
|
72
|
+
5. Update README.md (if user-facing)
|
|
73
|
+
6. Propose CLAUDE.md update (if architecture changed)
|
|
74
|
+
7. Commit
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## When to skip
|
|
78
|
+
|
|
79
|
+
- Changes to files outside `lib/` (tests, config, docs, `.claude/` rules)
|
|
80
|
+
- Changes to `lib/pvectl/version.rb` — `VERSION` constant is already in `sig/pvectl.rbs`
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Refactoring Rules
|
|
2
|
+
|
|
3
|
+
## Reactive refactoring — propose, don't act
|
|
4
|
+
|
|
5
|
+
When you spot existing code that needs improvement while working on a task — propose the refactoring to the user but wait for approval before making changes. Do NOT silently refactor surrounding code.
|
|
6
|
+
|
|
7
|
+
## Refactoring as a design option — don't dismiss it
|
|
8
|
+
|
|
9
|
+
When designing an approach for new functionality, if refactoring existing code would provide a better foundation — do NOT automatically dismiss it in favor of the path of least resistance.
|
|
10
|
+
|
|
11
|
+
Instead, present it as one of the considered approaches with clear trade-offs:
|
|
12
|
+
|
|
13
|
+
| Factor | Describe |
|
|
14
|
+
|--------|----------|
|
|
15
|
+
| **Cost** | What needs to change, how many files, risk of regressions |
|
|
16
|
+
| **Benefit** | Simpler integration, reduced duplication, better extensibility |
|
|
17
|
+
| **Alternative** | What the non-refactoring approach looks like and its downsides |
|
|
18
|
+
|
|
19
|
+
Use `AskUserQuestion` to discuss the trade-offs and let the user decide.
|
|
20
|
+
|
|
21
|
+
### When this applies
|
|
22
|
+
|
|
23
|
+
- When proposing approaches for a new feature — refactoring should be one of the 2-3 considered approaches when relevant
|
|
24
|
+
- During implementation — if you discover that refactoring would significantly simplify the current or upcoming work
|
|
25
|
+
- When adding a new resource/handler/command that is structurally similar to existing ones with code duplication
|
|
26
|
+
|
|
27
|
+
### When this does NOT apply
|
|
28
|
+
|
|
29
|
+
- Cosmetic improvements (renaming, reformatting) unrelated to the current task
|
|
30
|
+
- Refactoring that only benefits hypothetical future features (violates YAGNI)
|
|
31
|
+
- Changes where the refactoring cost clearly outweighs the benefit — use judgment
|
|
32
|
+
|
|
33
|
+
### Relationship to YAGNI/KISS
|
|
34
|
+
|
|
35
|
+
Refactoring to simplify integration of a **current** feature is NOT over-engineering — it's applying KISS. The test: "Does this refactoring make the feature I'm building right now simpler?" If yes, it's a valid option worth discussing.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"sessionId":"7f14d39a-39de-4e2c-b08f-00aa88f114c4","pid":25781,"procStart":"Sun May 17 18:41:59 2026","acquiredAt":1779126762839}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Edit(./**)",
|
|
5
|
+
"Write(./**)",
|
|
6
|
+
"Bash(touch ./*:*)",
|
|
7
|
+
"Bash(find .:*)",
|
|
8
|
+
"Bash(find ./:*)",
|
|
9
|
+
"Bash(git init:*)",
|
|
10
|
+
"Bash(git add:*)",
|
|
11
|
+
"Bash(git rm:*)",
|
|
12
|
+
"Bash(git reset:*)",
|
|
13
|
+
"Bash(git commit:*)",
|
|
14
|
+
"Bash(git checkout:*)",
|
|
15
|
+
"Bash(git branch:*)",
|
|
16
|
+
"Bash(git status:*)",
|
|
17
|
+
"Bash(git diff:*)",
|
|
18
|
+
"Bash(git log:*)",
|
|
19
|
+
"Bash(git pull:*)",
|
|
20
|
+
"Bash(git merge:*)",
|
|
21
|
+
"Bash(git restore:*)",
|
|
22
|
+
"Bash(git stash:*)",
|
|
23
|
+
"Bash(git ls-remote:*)",
|
|
24
|
+
"Bash(bundle info:*)",
|
|
25
|
+
"Bash(gem contents:*)",
|
|
26
|
+
"Bash(GLI_DEBUG=true bundle exec exe/pvectl:*)",
|
|
27
|
+
"WebSearch",
|
|
28
|
+
"AskUserQuestion",
|
|
29
|
+
"WebFetch(domain:github.com)",
|
|
30
|
+
"WebFetch(domain:raw.githubusercontent.com)",
|
|
31
|
+
"WebFetch(domain:rubygems.org)",
|
|
32
|
+
"WebFetch(domain:rubystyle.guide)",
|
|
33
|
+
"WebFetch(domain:www.rubydoc.info)",
|
|
34
|
+
"WebFetch(domain:docs.ruby-lang.org)",
|
|
35
|
+
"WebFetch(domain:ruby-doc.org)",
|
|
36
|
+
"WebFetch(domain:rubyapi.org)",
|
|
37
|
+
"WebFetch(domain:davetron5000.github.io)",
|
|
38
|
+
"WebFetch(domain:pve.proxmox.com)",
|
|
39
|
+
"WebFetch(domain:docs.claude.com)",
|
|
40
|
+
"mcp__context7__*",
|
|
41
|
+
"mcp__acp__Bash"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
"enableAllProjectMcpServers": true,
|
|
45
|
+
"enabledMcpjsonServers": [
|
|
46
|
+
"context7"
|
|
47
|
+
],
|
|
48
|
+
"enabledPlugins": {
|
|
49
|
+
"superpowers@claude-plugins-official": true
|
|
50
|
+
}
|
|
51
|
+
}
|
data/.mcp.json
ADDED
data/.ruby-gemset
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pvectl
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ruby-3.3.0
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **describe**: Firewall Rules section in `describe vm`, `describe container`, and `describe node` output — top-level table with ENABLED, TYPE, ACTION, PROTO, SOURCE, DEST, COMMENT columns
|
|
12
|
+
- **describe vm**: Block Device Statistics section with per-disk read/write bytes and IOPS
|
|
13
|
+
- **describe vm**: Balloon memory details (actual, max, free, total inside guest) in Memory section
|
|
14
|
+
- **commands**: Node DNS configuration — `pvectl get dns --node NODE` reads per-node DNS resolver settings; `pvectl edit dns NODE` opens DNS configuration (search domain, dns1, dns2, dns3) in an interactive YAML editor with diff preview and `--dry-run` support
|
|
15
|
+
- **commands**: Node systemd services — `get services`, `pvectl service start/stop/restart/reload`
|
|
16
|
+
- **commands**: `pvectl get time` — show node time and timezone (single node via `--node`, otherwise iterates online nodes)
|
|
17
|
+
- **commands**: `pvectl set node N timezone=...` — change node timezone via the dedicated `/nodes/{node}/time` API endpoint
|
|
18
|
+
- **commands**: Node hosts file editing — `edit hosts NODE` opens `/etc/hosts` in editor and posts back with original digest for optimistic locking, plus `get hosts --node NODE` to read raw contents
|
|
19
|
+
- **commands**: APT package management — `pvectl apt list/update/changelog/versions`
|
|
20
|
+
- **commands**: `pvectl wakeonlan node <NAME>` — send Wake-on-LAN to a cluster node via `POST /nodes/{node}/wakeonlan`; surfaces the MAC address used for the magic packet on success
|
|
21
|
+
- **commands**: `pvectl get node-capabilities` (aliases: `capabilities`, `caps`) — list supported QEMU CPU models and machine types per node via `/nodes/{node}/capabilities/qemu/*`
|
|
22
|
+
- **commands**: `pvectl move disk vm/ct` — migrate disk/volume between storages on same node (`--target STORAGE`, `--format` for VMs, `--delete-source`, `--bandwidth`, `--wait`, `--timeout`, `-y`)
|
|
23
|
+
- **repositories**: `Vm#move_disk` and `Container#move_volume` wrapping Proxmox `move_disk`/`move_volume` endpoints
|
|
24
|
+
- **services**: `Services::MoveDisk` orchestrates async repository call + optional task polling and returns a typed `OperationResult`
|
|
25
|
+
- **commands**: Cloud-init management — `pvectl cloudinit regenerate/pending/dump vm` to rebuild the cloud-init ISO, list pending configuration changes, and print generated user/network/meta YAML
|
|
26
|
+
- **commands**: `pvectl sendkey vm` — send QEMU keycodes to a running VM (e.g., ctrl-alt-delete)
|
|
27
|
+
- **commands**: `pvectl get subscription` — show Proxmox subscription status per node (level, status, next due date, masked key). Use `-o wide` to reveal the full license key.
|
|
28
|
+
- **commands**: `pvectl feature vm/ct` — query availability of clone/snapshot/copy for a VM or container
|
|
29
|
+
- **commands**: `pvectl unlink disk vm` — remove disk from VM config without deleting volume (or `--force` to delete)
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
- **describe**: rules are no longer nested under the `Firewall` section as a `Rules` sub-table; they are rendered in the dedicated `Firewall Rules` top-level section
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
|
|
36
|
+
### Removed
|
|
37
|
+
|
|
38
|
+
### Documentation
|
|
39
|
+
|
|
40
|
+
## [0.2.0] — 2026-05-17
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
- **commands**: `pvectl pull` command — export VM/container configuration as kubectl-like YAML manifests (single, multiple, `--all`, selectors) with diff preview, `--yes`, `--dry-run` for file output
|
|
44
|
+
- **commands**: `pvectl push` command — apply YAML manifests to cluster (create or update resources) with diff preview, `-f`/`--file`, stdin pipe support, auto-VMID allocation, `--yes`, `--dry-run`, post-apply manifest refresh
|
|
45
|
+
- **manifest-serializer**: kubectl-like manifest format with `apiVersion`/`kind`/`metadata`/`spec` envelope
|
|
46
|
+
- **config-serializer**: `to_nested`/`from_nested` methods for structured config with parsed complex values
|
|
47
|
+
- **config-serializer**: bidirectional value parsing for complex Proxmox config strings (network, disk, boot, agent, startup, ipconfig)
|
|
48
|
+
- **commands**: `pvectl set` command for non-interactive resource configuration (vm, container, volume, node) with key=value syntax
|
|
49
|
+
- **commands**: `pvectl edit volume` for interactive volume property editing via YAML editor
|
|
50
|
+
- **commands**: `pvectl edit node` for interactive node configuration editing via YAML editor
|
|
51
|
+
- **commands**: `pvectl get volume <vm|ct> <ID...>` and `pvectl get volume --storage <STORAGE>` list virtual disk volumes from VM/CT config or storage content API
|
|
52
|
+
- **commands**: `pvectl describe volume <vm|ct> <ID> <disk_name>` shows detailed information about a specific virtual disk
|
|
53
|
+
- **volumes**: Volume selector with `-l format=raw,storage=local-lvm` filtering for `get volume`
|
|
54
|
+
- **describe disk**: `pvectl describe disk /dev/xxx [--node NODE]` shows device info and structured SMART attributes (ATA table or parsed NVMe/SAS key-value pairs)
|
|
55
|
+
- **parsers**: SmartText parser for converting NVMe/SAS smartctl text output into structured data
|
|
56
|
+
- **repositories**: `Disk#smart` method for SMART data retrieval from Proxmox API (`GET /nodes/{node}/disks/smart`)
|
|
57
|
+
- **cli**: `get disks` command to list physical disks (block devices) on cluster nodes with `--node` filtering
|
|
58
|
+
- **cli**: `get disk` alias for `get disks`
|
|
59
|
+
- **cli**: selector support for disks (`-l type=ssd,health=PASSED,node=pve1,gpt=yes,mounted=yes`)
|
|
60
|
+
- **selectors**: support `template` field filtering for VMs and containers (`-l template=yes`, `-l template=no`)
|
|
61
|
+
- **cli**: `-l`/`--selector` flag for `get` command enables kubectl-style filtering for VMs and containers (e.g., `-l status=running,tags=prod`, `-l name=~web-*`)
|
|
62
|
+
- **cli**: `--status` flag acts as shortcut for `-l status=VALUE` for VM/CT resources, combinable with other selectors
|
|
63
|
+
- **cli**: `pvectl template vm/ct` command for converting VMs and containers to Proxmox templates (irreversible, with confirmation prompt or `--yes` flag, `--force` to stop running resources)
|
|
64
|
+
- **cli**: `pvectl get templates` handler for listing templates with optional `--type vm|ct` filter
|
|
65
|
+
- **models**: `type` attribute added to VM and Container models (distinguishes `qemu`/`lxc`)
|
|
66
|
+
- **cli**: `pvectl get tasks` command for cluster-wide task listing with `--node`, `--limit`, `--since`, `--until`, `--type`, `--status` filtering flags
|
|
67
|
+
- **rbs**: Full RBS type signatures for the entire codebase (175 files, ~4300 lines under `sig/`)
|
|
68
|
+
- **rbs**: External stubs for GLI and ProxmoxAPI gems (`sig/external/`)
|
|
69
|
+
- **rbs**: Pragmatic typing strategy — strict types for domain layer, `untyped` at gem boundaries
|
|
70
|
+
- **console**: Interactive terminal session for VMs and containers via `pvectl console vm|ct <ID>`
|
|
71
|
+
- **console**: WebSocket-based xtermjs protocol with native Ruby implementation (websocket-driver gem)
|
|
72
|
+
- **console**: Session authentication with interactive credential prompt when API token is insufficient
|
|
73
|
+
- **plugins**: Plugin system with gem-based (`pvectl-plugin-*`) and directory-based (`~/.pvectl/plugins/*.rb`) discovery
|
|
74
|
+
- **plugins**: `PluginLoader` class for automatic plugin loading with graceful error handling
|
|
75
|
+
- **commands**: `SharedFlags` module for reusable flag definitions across commands
|
|
76
|
+
- **commands**: `SharedConfigParsers` mixin module for shared CLI flag parsing (disks, nets, cloud-init, mountpoints) across create and clone commands
|
|
77
|
+
- **cli**: Configuration flags for `pvectl clone vm/ct` — modify CPU, memory, disks, network, and other settings during clone (two-step: clone then config update via PUT API)
|
|
78
|
+
- **models**: `:partial` status on `OperationResult` for operations that partially succeed (e.g. clone OK but config update failed)
|
|
79
|
+
- **resize**: `pvectl resize disk vm/ct <id> <disk> <size>` command for resizing VM and container disks with confirmation prompt and `--yes` flag
|
|
80
|
+
- **describe**: `pvectl describe snapshot <name> [vmid...]` command showing detailed snapshot metadata with visual snapshot tree
|
|
81
|
+
|
|
82
|
+
### Changed
|
|
83
|
+
- **config-serializer**: section layout restructured to match Proxmox UI tabs (hardware/options/cloud-init for VM, resources/network/dns for CT)
|
|
84
|
+
- **edit**: output format updated to reflect new section layout (hardware wrapper, options section)
|
|
85
|
+
- **describe vm**: reorganize output to match PVE web UI tabs (Summary, Hardware, Cloud-Init, Options, Task History, Snapshots, Pending Changes) with previously hidden config keys (ACPI, KVM, Tablet, Freeze CPU, Local Time, NUMA) now visible in Options section
|
|
86
|
+
- **describe container**: reorganize output to match PVE web UI tabs (Summary, Resources, Network, DNS, Options, Task History, Snapshots, High Availability) with all options visible
|
|
87
|
+
- **describe**: add Task History section showing recent operations for VM and container resources
|
|
88
|
+
- **get**: `storages` is now the primary resource name (consistent with `vms`, `nodes`, etc.); `storage` and `stor` remain as aliases
|
|
89
|
+
- **commands**: `pvectl edit` now supports `volume` and `node` resource types in addition to `vm` and `container`
|
|
90
|
+
- **presenters**: reduce default table columns to 6 (NAME, ID, STATUS, NODE, CPU, MEMORY); UPTIME, TEMPLATE, TAGS moved to wide output
|
|
91
|
+
- **presenters**: NAME column now appears first (before VMID/CTID), matching kubectl convention
|
|
92
|
+
- **presenters**: extract shared display helpers (format_bytes, uptime_human, tags_display, template_display) to Presenters::Base
|
|
93
|
+
- **cli**: boolean config flags (`--start`, `--numa`, `--agent`, `--privileged`, `--onboot`) now support negation (`--no-start`, `--no-agent`, etc.) in `create` and `clone` commands
|
|
94
|
+
- **cli**: Unified snapshot CLI syntax — snapshot name is now a positional argument, VMIDs use `--vmid` flag (repeatable), `--node` filters by node, `--all` deletes all snapshots (**breaking change**)
|
|
95
|
+
- **cli**: `create snapshot` and `delete snapshot` are now GLI sub-commands with dedicated flags
|
|
96
|
+
- **cli**: `get snapshots` and `describe snapshot` accept `--vmid` and `--node` flags
|
|
97
|
+
- **services**: Snapshot service methods accept `node:` parameter for node filtering
|
|
98
|
+
- **services**: Added `delete_all` method for removing all snapshots from VMs
|
|
99
|
+
- **cli**: `pvectl get snapshots`, `pvectl create snapshot`, and `pvectl delete snapshot` without VMIDs now operate cluster-wide (previously required at least one VMID)
|
|
100
|
+
- **commands**: Extracted `IrreversibleCommand` mixin from `DeleteCommand` for reuse in template and other destructive commands
|
|
101
|
+
- **services**: Extract `Services::TaskListing` from `Logs::Handlers::TaskLogs` for shared multi-node task listing logic
|
|
102
|
+
- **cli**: Refactored all command definitions from inline `cli.rb` to self-registration via `.register(cli)` class methods
|
|
103
|
+
- **cli**: `cli.rb` reduced from ~930 lines to ~96 lines (globals, error handling, PluginLoader)
|
|
104
|
+
- **cli**: `template` command now uses `--yes` to skip confirmation (was `--force`) for consistency with `delete` and other destructive commands
|
|
105
|
+
- **cli**: `template --force` now stops running VMs/containers before conversion (matching `delete --force` behavior)
|
|
106
|
+
- **cli**: `ArgvPreprocessor` refactored to use dynamic GLI reflection instead of static flag maps — automatically discovers all registered flags and switches
|
|
107
|
+
- **commands**: `CreateVm` and `CreateContainer` refactored to use `SharedFlags` config groups and `SharedConfigParsers` mixin, eliminating inline flag definitions and parser method duplication
|
|
108
|
+
|
|
109
|
+
### Fixed
|
|
110
|
+
- **push**: transform disk values to Proxmox create API format (`STORAGE_ID:SIZE_IN_GiB`) — strip volume names, handle cloud-init, EFI/TPM, and empty CD-ROM
|
|
111
|
+
- **push**: normalize cloud-init volume names symmetrically in both directions (API→manifest and manifest→flat), preventing false diffs and invalid create params
|
|
112
|
+
- **push**: complete manifest values from API before update diff — fill missing sub-properties (volume names, MAC addresses, cloudinit size) and restrict diff to manifest-only keys, preventing false diffs for default/omitted values
|
|
113
|
+
- **push**: coerce numeric strings from YAML manifests to integers for consistent comparison with API values (e.g., `memory: '2048'` vs `2048`)
|
|
114
|
+
- **push**: filter nil/empty values from create params and extract detailed error info from Proxmox API responses
|
|
115
|
+
- **push**: detect disk size changes and use Proxmox resize API instead of config PUT (which only updates metadata without actually resizing the disk)
|
|
116
|
+
- **push**: refresh unchanged manifest files with server-assigned values (MAC addresses, volume names, UUIDs) even when no config changes need to be applied
|
|
117
|
+
- **push**: track async task completion for resize and create operations — report actual success/failure instead of fire-and-forget
|
|
118
|
+
- **repositories**: use server-side `/cluster/nextid` API for VMID/CTID allocation instead of client-side scanning (fixes stale config file conflicts)
|
|
119
|
+
- **pull**: rename `-o` flag to `-f`/`--file` to avoid conflict with global `-o`/`--output` format flag
|
|
120
|
+
- **presenters**: rename misleading "Wearout" label to "Life Remaining" in describe disk output (Proxmox reports remaining life, not wear percentage)
|
|
121
|
+
- **presenters**: remove "Mounted" field from describe disk output (mount status applies to partitions, not whole disks)
|
|
122
|
+
- **services**: `--agent` and `--onboot` now correctly send disable value to API when negated (previously only supported enabling)
|
|
123
|
+
- **services**: `create container` no longer forces `unprivileged: 1` when `--privileged` flag is not specified (respects API defaults)
|
|
124
|
+
- **cli**: `--status` flag now correctly filters VMs and containers by status in `get` command (previously ignored for VM/CT resources)
|
|
125
|
+
- **wizards**: Remove duplicate confirmation prompt in `create vm` and `create ct` interactive wizards — wizard no longer asks "Create this VM/container?" before showing the summary; only the summary-based confirmation remains
|
|
126
|
+
- **presenters**: Clone operation output now displays the new (cloned) resource data (VMID/CTID, name, node) instead of the source resource data
|
|
127
|
+
- **config**: `SimplePrompt` fallback now supports `required:`, `convert:`, and extra keyword arguments matching `TTY::Prompt#ask` interface (fixes `unknown keyword: :required` in interactive `create` wizard)
|
|
128
|
+
- **cli**: Command flags placed after positional arguments are now correctly reordered (e.g., `pvectl delete vm 103 --yes` now works as expected)
|
|
129
|
+
|
|
130
|
+
### Removed
|
|
131
|
+
- **commands**: `pvectl resize volume` command (replaced by `pvectl set volume ... size=+10G`)
|
|
132
|
+
|
|
133
|
+
### Documentation
|
|
134
|
+
- **cli**: Added `long_desc` man-page style help text to all commands (~25 commands) with DESCRIPTION, EXAMPLES, NOTES, and SEE ALSO sections
|
|
135
|
+
- **cli**: Enabled `wrap_help_text :verbatim` for proper formatting of code examples in help output
|
|
136
|
+
- **cli**: Enabled `sort_help :manually` to display commands in logical declaration order
|
|
137
|
+
- **readme**: Transformed README from 529-line reference into ~130-line landing page with links to GitHub Wiki
|
|
138
|
+
- **wiki**: Created comprehensive GitHub Wiki with 10 pages: Home, Getting Started, Command Reference, Configuration Guide, Selectors & Filtering, Output Formats, Workflows, Plugin Development, Troubleshooting, FAQ
|