proxcli 0.13.2__tar.gz → 0.15.0__tar.gz

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.
Files changed (138) hide show
  1. {proxcli-0.13.2 → proxcli-0.15.0}/.github/workflows/ci.yml +1 -0
  2. {proxcli-0.13.2 → proxcli-0.15.0}/.gitignore +6 -0
  3. {proxcli-0.13.2 → proxcli-0.15.0}/CHANGELOG.md +72 -1
  4. {proxcli-0.13.2 → proxcli-0.15.0}/PKG-INFO +1 -1
  5. proxcli-0.15.0/TODO.md +213 -0
  6. proxcli-0.15.0/docs/DESIGN.md +165 -0
  7. proxcli-0.15.0/docs/api-coverage.md +249 -0
  8. proxcli-0.15.0/docs/assets/index-CXpOjuxt.css +2 -0
  9. proxcli-0.15.0/docs/assets/index-DLDs0H6j.js +144 -0
  10. {proxcli-0.13.2 → proxcli-0.15.0}/docs/cloud-init.md +212 -4
  11. proxcli-0.15.0/docs/coding-agents.md +205 -0
  12. proxcli-0.15.0/docs/coverage.json +274 -0
  13. proxcli-0.15.0/docs/demos/cluster.gif +0 -0
  14. proxcli-0.15.0/docs/demos/node-list.gif +0 -0
  15. proxcli-0.15.0/docs/demos/vm-list.gif +0 -0
  16. proxcli-0.15.0/docs/demos/vm-show.gif +0 -0
  17. proxcli-0.15.0/docs/demos/yaml-spec.gif +0 -0
  18. proxcli-0.15.0/docs/favicon.svg +4 -0
  19. proxcli-0.15.0/docs/icons.svg +24 -0
  20. proxcli-0.15.0/docs/index.html +64 -0
  21. proxcli-0.15.0/docs/production-automation.md +356 -0
  22. proxcli-0.15.0/docs/quickstart.md +150 -0
  23. proxcli-0.15.0/docs/website/.gitignore +24 -0
  24. proxcli-0.15.0/docs/website/README.md +16 -0
  25. proxcli-0.15.0/docs/website/build-all.sh +30 -0
  26. proxcli-0.15.0/docs/website/eslint.config.js +21 -0
  27. proxcli-0.15.0/docs/website/index.html +63 -0
  28. proxcli-0.15.0/docs/website/package-lock.json +4588 -0
  29. proxcli-0.15.0/docs/website/package.json +38 -0
  30. proxcli-0.15.0/docs/website/public/coverage.json +274 -0
  31. proxcli-0.15.0/docs/website/public/demos/cluster.gif +0 -0
  32. proxcli-0.15.0/docs/website/public/demos/node-list.gif +0 -0
  33. proxcli-0.15.0/docs/website/public/demos/vm-list.gif +0 -0
  34. proxcli-0.15.0/docs/website/public/demos/vm-show.gif +0 -0
  35. proxcli-0.15.0/docs/website/public/demos/yaml-spec.gif +0 -0
  36. proxcli-0.15.0/docs/website/public/favicon.svg +4 -0
  37. proxcli-0.15.0/docs/website/public/icons.svg +24 -0
  38. proxcli-0.15.0/docs/website/remotion-demos/.gitignore +7 -0
  39. proxcli-0.15.0/docs/website/remotion-demos/.prettierrc +5 -0
  40. proxcli-0.15.0/docs/website/remotion-demos/README.md +54 -0
  41. proxcli-0.15.0/docs/website/remotion-demos/eslint.config.mjs +3 -0
  42. proxcli-0.15.0/docs/website/remotion-demos/package-lock.json +5032 -0
  43. proxcli-0.15.0/docs/website/remotion-demos/package.json +33 -0
  44. proxcli-0.15.0/docs/website/remotion-demos/public/cluster-real.txt +5 -0
  45. proxcli-0.15.0/docs/website/remotion-demos/public/node-list-real.txt +7 -0
  46. proxcli-0.15.0/docs/website/remotion-demos/public/vm-list-real.txt +8 -0
  47. proxcli-0.15.0/docs/website/remotion-demos/public/vm-show-real.txt +11 -0
  48. proxcli-0.15.0/docs/website/remotion-demos/remotion.config.ts +13 -0
  49. proxcli-0.15.0/docs/website/remotion-demos/src/Composition.tsx +328 -0
  50. proxcli-0.15.0/docs/website/remotion-demos/src/Root.tsx +50 -0
  51. proxcli-0.15.0/docs/website/remotion-demos/src/index.css +16 -0
  52. proxcli-0.15.0/docs/website/remotion-demos/src/index.ts +4 -0
  53. proxcli-0.15.0/docs/website/remotion-demos/tsconfig.json +15 -0
  54. proxcli-0.15.0/docs/website/src/App.jsx +17 -0
  55. proxcli-0.15.0/docs/website/src/components/CoverageGrid.jsx +217 -0
  56. proxcli-0.15.0/docs/website/src/components/SplitFlapAgent.jsx +360 -0
  57. proxcli-0.15.0/docs/website/src/index.css +41 -0
  58. proxcli-0.15.0/docs/website/src/main.jsx +10 -0
  59. proxcli-0.15.0/docs/website/src/pages/Docs.jsx +834 -0
  60. proxcli-0.15.0/docs/website/src/pages/Landing.jsx +649 -0
  61. proxcli-0.15.0/docs/website/vite.config.js +49 -0
  62. proxcli-0.15.0/proxmox/cli/api.py +75 -0
  63. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/backup.py +64 -0
  64. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/container.py +43 -0
  65. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/main.py +3 -1
  66. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/tasks.py +52 -0
  67. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/vm.py +504 -0
  68. {proxcli-0.13.2 → proxcli-0.15.0}/pyproject.toml +1 -1
  69. proxcli-0.15.0/tests/test_cli/test_api.py +126 -0
  70. proxcli-0.15.0/tests/test_cli/test_backup_restore.py +115 -0
  71. proxcli-0.15.0/tests/test_cli/test_container_ip.py +45 -0
  72. proxcli-0.15.0/tests/test_cli/test_task_wait.py +48 -0
  73. proxcli-0.15.0/tests/test_cli/test_vm_agent.py +103 -0
  74. proxcli-0.15.0/tests/test_cli/test_vm_clone.py +115 -0
  75. proxcli-0.15.0/tests/test_cli/test_vm_disk.py +125 -0
  76. proxcli-0.15.0/tests/test_cli/test_vm_ip.py +45 -0
  77. proxcli-0.15.0/tests/test_cli/test_vm_iso.py +86 -0
  78. proxcli-0.15.0/tests/test_cli/test_vm_migrate.py +108 -0
  79. proxcli-0.15.0/tests/test_cli/test_vm_set.py +130 -0
  80. proxcli-0.15.0/tests/test_cli/test_vm_template.py +61 -0
  81. {proxcli-0.13.2 → proxcli-0.15.0}/uv.lock +2 -2
  82. proxcli-0.13.2/TODO.md +0 -90
  83. proxcli-0.13.2/docs/api-coverage.md +0 -68
  84. {proxcli-0.13.2 → proxcli-0.15.0}/.env.example +0 -0
  85. {proxcli-0.13.2 → proxcli-0.15.0}/.python-version +0 -0
  86. {proxcli-0.13.2 → proxcli-0.15.0}/AGENTS.md +0 -0
  87. {proxcli-0.13.2 → proxcli-0.15.0}/PLAN.md +0 -0
  88. {proxcli-0.13.2 → proxcli-0.15.0}/PROJECT.md +0 -0
  89. {proxcli-0.13.2 → proxcli-0.15.0}/PROMPT.md +0 -0
  90. {proxcli-0.13.2 → proxcli-0.15.0}/README.md +0 -0
  91. {proxcli-0.13.2 → proxcli-0.15.0}/docs/api-permissions.md +0 -0
  92. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/__init__.py +0 -0
  93. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/__init__.py +0 -0
  94. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/acl.py +0 -0
  95. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/auth.py +0 -0
  96. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/ceph.py +0 -0
  97. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/cluster.py +0 -0
  98. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/completion.py +0 -0
  99. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/firewall_helpers.py +0 -0
  100. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/network.py +0 -0
  101. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/node.py +0 -0
  102. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/pool.py +0 -0
  103. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/role.py +0 -0
  104. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/storage.py +0 -0
  105. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/user.py +0 -0
  106. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/cli/vm_spec.py +0 -0
  107. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/client/__init__.py +0 -0
  108. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/client/auth.py +0 -0
  109. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/client/client.py +0 -0
  110. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/client/exceptions.py +0 -0
  111. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/config/__init__.py +0 -0
  112. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/config/config.py +0 -0
  113. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/config/models.py +0 -0
  114. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/output/__init__.py +0 -0
  115. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/output/formatter.py +0 -0
  116. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/output/json_fmt.py +0 -0
  117. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/output/log_fmt.py +0 -0
  118. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/output/table_fmt.py +0 -0
  119. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/output/yaml_fmt.py +0 -0
  120. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/utils/__init__.py +0 -0
  121. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/utils/helpers.py +0 -0
  122. {proxcli-0.13.2 → proxcli-0.15.0}/proxmox/utils/logging.py +0 -0
  123. {proxcli-0.13.2 → proxcli-0.15.0}/tests/__init__.py +0 -0
  124. {proxcli-0.13.2 → proxcli-0.15.0}/tests/conftest.py +0 -0
  125. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_auth.py +0 -0
  126. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_cli/__init__.py +0 -0
  127. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_cli/test_backup.py +0 -0
  128. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_cli/test_ceph.py +0 -0
  129. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_cli/test_main.py +0 -0
  130. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_cli/test_network.py +0 -0
  131. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_cli/test_node_system.py +0 -0
  132. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_cli/test_role_acl.py +0 -0
  133. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_cli/test_user.py +0 -0
  134. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_client.py +0 -0
  135. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_config.py +0 -0
  136. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_integration/__init__.py +0 -0
  137. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_output/__init__.py +0 -0
  138. {proxcli-0.13.2 → proxcli-0.15.0}/tests/test_output/test_formatter.py +0 -0
@@ -3,6 +3,7 @@ name: CI
3
3
  on:
4
4
  push:
5
5
  branches: [main]
6
+ tags-ignore: ["v*"]
6
7
  pull_request:
7
8
  branches: [main]
8
9
  release:
@@ -24,3 +24,9 @@ coverage.xml
24
24
 
25
25
  # Rust cache
26
26
  .ruff_cache/
27
+
28
+ # Website build artifacts (node_modules are in docs/website/)
29
+ docs/website/node_modules/
30
+ docs/website/remotion-demos/node_modules/
31
+ # Built docs subdir (markdown copies for the docs site)
32
+ docs/docs/
@@ -5,7 +5,72 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
8
+ ## [0.15.0] - 2026-06-30
9
+
10
+ ### Added
11
+ - **``proxmox vm set``**: update VM configuration keys. Wraps
12
+ ``PUT /nodes/{node}/qemu/{vmid}/config``. Supports ``--ipconfig0``–``--ipconfig3``,
13
+ ``--ciuser``, ``--cipassword``, ``--sshkeys``, ``--nameserver``,
14
+ ``--searchdomain``, ``--cicustom``, and arbitrary ``--option key=value`` pairs.
15
+ Complements ``vm clone`` and ``vm template`` for full cloud-init template workflows.
16
+ - **``proxmox api``**: make raw authenticated API calls for endpoints not yet
17
+ covered by dedicated subcommands. Supports ``GET``, ``POST``, ``PUT``, ``DELETE``
18
+ with ``--data`` (inline JSON), ``--data-file`` (JSON file), or stdin piping.
19
+ Reuses the same authentication as the rest of proxcli — no more ``curl`` with
20
+ manual tokens.
21
+
22
+ ### Changed
23
+ - **Docs deduplication**: ``docs/*.md`` is now the single source of truth.
24
+ Removed ``docs/website/public/docs/`` (stale duplicate) and the ``copyDocsPlugin``
25
+ from ``vite.config.js``. Added ``serveDocsPlugin`` middleware for dev mode.
26
+ - **``docs/cloud-init.md``**: added "Reusable Cloud-Init Template" guide covering
27
+ the full workflow (upload → create → template → clone → customize) entirely
28
+ with proxcli commands.
29
+ - **``docs/production-automation.md``**: replaced curl-based template conversion
30
+ with ``proxmox vm template``.
31
+ - **``docs/quickstart.md``**: added "Raw API calls" section.
32
+
33
+ ## [0.14.0] - 2026-06-22
34
+
35
+ ### Added
36
+ - **``proxmox vm clone``**: clone a QEMU VM to a new VMID. Supports ``--newid``
37
+ (required), ``--node``, ``--name``, ``--target-node``, ``--target-storage``,
38
+ ``--full`` (1=full, 0=linked), ``--description``, and ``--pool``.
39
+ - **``proxmox vm migrate``**: migrate a QEMU VM to another node. Supports
40
+ ``--target`` (required), ``--node``, ``--online`` (live migration),
41
+ ``--with-local-disks``, and ``--target-storage``.
42
+ - **``proxmox backup restore``**: restore a backup to a new VM or container.
43
+ Supports ``--vmid`` (required), ``--node``, ``--storage``, ``--unique``
44
+ (unique MACs/IDs), ``--pool``, and ``--start``. Auto-detects guest type
45
+ (qemu vs lxc) from the backup volume ID.
46
+ - **``proxmox vm template``**: convert a VM into a template. Wraps
47
+ ``POST /nodes/{node}/qemu/{vmid}/template``.
48
+ - **``proxmox vm iso attach/detach``**: attach or eject an ISO image from
49
+ a VM's virtual CD/DVD drive. ``attach --iso-volume`` accepts a full volid
50
+ or a bare filename (auto-resolved across node storages).
51
+ - **``proxmox vm ip <vmid>``**: quick IP address lookup via guest agent.
52
+ Returns interface name, IP, and prefix; filters out loopback and
53
+ link-local addresses.
54
+ - **``proxmox container ip <vmid>``**: IP address lookup for LXC containers.
55
+ Wraps ``GET /nodes/{node}/lxc/{vmid}/interfaces``, extracting inet/inet6
56
+ addresses; filters loopback and link-local.
57
+ - **``proxmox vm disk resize``**: resize a VM disk. Wraps
58
+ ``PUT /nodes/{node}/qemu/{vmid}/resize`` with ``--disk`` and ``--size``.
59
+ - **``proxmox vm agent`` new subcommands**: ``osinfo`` (guest OS details),
60
+ ``fsinfo`` (filesystem info), ``users`` (user accounts), and ``exec``
61
+ (execute a command inside the guest with base64 I/O decoding and result
62
+ polling).
63
+ - **``proxmox vm disk detach/remove``**: detach (keep data) or remove
64
+ (delete image) a disk from a VM. Wraps ``PUT /nodes/{node}/qemu/{vmid}/config``.
65
+ - **``proxmox task wait <upid>``**: block until a task completes. Polls
66
+ task status at configurable ``--poll`` intervals with ``--timeout``.
67
+
68
+ ### Fixed
69
+ - **Test suite**: all 102 tests now pass reliably. Root cause was the `.venv`
70
+ referencing the old project path (`proxmox-cli` -> `proxcli`), causing
71
+ `pytest-httpx` plugin not to load and subprocess tests to fail with
72
+ `PackageNotFoundError`. Fixed by reinstalling dev dependencies into the
73
+ current `.venv` and re-registering the editable install.
9
74
 
10
75
  ## [0.13.1] - 2026-06-21
11
76
 
@@ -268,6 +333,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
268
333
  - CSRF ticket auto-refresh on 401.
269
334
  - AI-agent-friendly: default JSON output, strict exit codes, `--dry-run` mode.
270
335
 
336
+ [0.15.0]: https://github.com/xezpeleta/proxcli/releases/tag/v0.15.0
337
+ [0.14.0]: https://github.com/xezpeleta/proxcli/releases/tag/v0.14.0
338
+ [0.13.1]: https://github.com/xezpeleta/proxcli/releases/tag/v0.13.1
339
+ [0.13.0]: https://github.com/xezpeleta/proxcli/releases/tag/v0.13.0
340
+ [0.12.0]: https://github.com/xezpeleta/proxcli/releases/tag/v0.12.0
341
+ [0.11.0]: https://github.com/xezpeleta/proxcli/releases/tag/v0.11.0
271
342
  [0.10.0]: https://github.com/xezpeleta/proxcli/releases/tag/v0.10.0
272
343
  [0.9.1]: https://github.com/xezpeleta/proxcli/releases/tag/v0.9.1
273
344
  [0.9.0]: https://github.com/xezpeleta/proxcli/releases/tag/v0.9.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proxcli
3
- Version: 0.13.2
3
+ Version: 0.15.0
4
4
  Summary: A CLI tool to interact with Proxmox VE nodes and clusters via the REST API
5
5
  Author-email: Xabi Ezpeleta <xezpeleta@gmail.com>
6
6
  License: MIT
proxcli-0.15.0/TODO.md ADDED
@@ -0,0 +1,213 @@
1
+ # TODO
2
+
3
+ Planned improvements for future releases. Items are roughly ordered by priority.
4
+
5
+ Completed items are marked with a check. Implementation notes are preserved for context.
6
+
7
+ ---
8
+
9
+ ## ✅ Done
10
+
11
+ - [x] **Firewall management** — cluster, node, VM, and container. Options, enable/disable, policy, rules (CRUD), aliases (cluster), ipsets with CIDR mgmt (cluster), refs.
12
+ - [x] **Pool management** — `proxmox pool`: list, show, create, update, delete. Wraps `/pools`.
13
+ - [x] **Shell completions** — `proxmox completion bash|zsh|fish`. Dynamic, introspects the parser tree.
14
+ - [x] **VM snapshot management** — `proxmox vm snapshot`: list, create, show, rollback, delete. Wraps `/nodes/{node}/qemu/{vmid}/snapshot`.
15
+ - [x] **QEMU guest agent interfaces** — `proxmox vm agent interfaces <vmid>`. Wraps `/nodes/{node}/qemu/{vmid}/agent/network-get-interfaces`.
16
+ - [x] **Streaming task logs** — `proxmox task log <upid> [--follow]`. Polls `/nodes/{node}/tasks/{upid}/log`.
17
+ - [x] **Global flag hint** — If user places `--output` / `--dry-run` / etc. after the resource, a hint suggests the correct order.
18
+ - [x] **User & permission management** — `proxmox user` (list/show/create/update/delete), `proxmox role` (list/show/create/update/delete), `proxmox acl` (list/show/add/delete). Wraps `/access/users`, `/access/roles`, `/access/acl`. ACL write requires `Permissions.Modify` (Administrator).
19
+ - [x] **VM cloud-init support** — `vm create` flags for citype, ciuser, cipassword, sshkeys, nameserver, searchdomain, cicustom + auto cloud-init drive creation. `vm cloudinit generate` for regeneration.
20
+ - [x] **VM disk import** — `vm create --import-from <storage:path>` imports an existing disk image as VM boot disk.
21
+ - [x] **Docs** — `docs/cloud-init.md` (cloud-init VM workflow), `docs/api-permissions.md` (minimum API privileges).
22
+ - [x] **Network management** — `proxmox network` (list, show). Wraps `/nodes/{node}/network[/{iface}]`. Shows bridges, bonds, VLANs, physical NICs with config details. Type filtering support.
23
+ - [x] **Backup (vzdump) management** — `proxmox backup` (list/show/create/delete/tasks/defaults). Wraps `/nodes/{node}/vzdump` and storage content endpoints. Supports snapshot/suspend/stop modes, compression, PBS.
24
+ - [x] **Ceph & disk management** — `proxmox ceph` (status, osd, log, disks). Cluster health, OSD-to-disk mapping, wearout tracking, Ceph logs.
25
+ - [x] **Config loader made read-only** — `auth login`/`auth clear` removed. `PROXMOX_CONFIG_DIR` env var for custom config path.
26
+ - [x] **Node system info** — `proxmox node subscription/dns/time/services/pci/netstat/config`. Read-only node inspection.
27
+ - [x] **Cluster log & options** — `proxmox cluster log [--limit N]` and `proxmox cluster options`.
28
+ - [x] **Storage status** — `proxmox storage status <storage> [--node]` for usage stats.
29
+ - [x] **API coverage doc** — `docs/api-coverage.md` tracking all implemented and remaining endpoints.
30
+
31
+ ## v1.1 — Polish & Usability
32
+
33
+ - [x] **`--output table` column selection**
34
+ - ``proxmox --output table --columns vmid,name,status vm list`` picks which columns appear.
35
+
36
+ - [x] **Color support in table output**
37
+ - Status/state values are styled: green for running/active/ok, red for stopped/error, yellow for paused/suspended.
38
+
39
+ ---
40
+
41
+ ## v1.2 — VM & Container Lifecycle Gaps
42
+
43
+ High-impact VM/container workflows that exist in the Proxmox API but are missing from the CLI. Ordered by user value.
44
+
45
+ ### Priority: HIGH
46
+
47
+ - [x] **VM clone**
48
+ - `proxmox vm clone <vmid> --newid <id> [--name <name>] [--target-node <node>] [--target-storage <storage>] [--full] [--description <text>]`
49
+ - Wraps `POST /nodes/{node}/qemu/{vmid}/clone`
50
+ - Cloning from templates or golden images is a core homelab/admin workflow.
51
+ - From piclaw: `vm.clone` workflow covers full/linked clone, target node/storage, optional description.
52
+
53
+ - [x] **VM migrate**
54
+ - `proxmox vm migrate <vmid> --target <node> [--target-storage <storage>] [--online] [--with-local-disks]`
55
+ - Wraps `POST /nodes/{node}/qemu/{vmid}/migrate`
56
+ - Moving VMs between nodes is essential for maintenance and load balancing.
57
+ - From piclaw: `vm.migrate` workflow with online flag and local disk migration.
58
+
59
+ - [x] **Backup restore**
60
+ - `proxmox backup restore <volid> --vmid <id> [--node <node>] [--storage <storage>] [--target-storage <storage>]`
61
+ - Wraps `POST /nodes/{node}/storage/{storage}/content` with archive restore.
62
+ - Currently proxcli can create/list/delete backups but not restore them — a glaring asymmetry.
63
+ - From piclaw: `backup.restore` workflow.
64
+
65
+ ### Priority: MEDIUM
66
+
67
+ - [x] **VM template (convert to template)**
68
+ - `proxmox vm template <vmid> [--node <node>]`
69
+ - Wraps `POST /nodes/{node}/qemu/{vmid}/template`
70
+ - Small addition but unlocks the clone-from-template workflow.
71
+ - From piclaw: `vm.template.create` workflow.
72
+
73
+ - [x] **VM ISO attach / detach**
74
+ - `proxmox vm iso attach <vmid> --iso-volume <volid> [--slot ide2] [--node <node>]`
75
+ - `proxmox vm iso detach <vmid> [--slot ide2] [--node <node>]`
76
+ - Wraps `PUT /nodes/{node}/qemu/{vmid}/config` with cdrom slot changes.
77
+ - Exposing this as first-class actions is much more intuitive than raw config editing.
78
+ - From piclaw: `vm.iso.attach` and `vm.iso.detach` workflows.
79
+
80
+ - [x] **VM IP quick-lookup**
81
+ - `proxmox vm ip <vmid> [--node <node>]`
82
+ - Combines guest agent network-get-interfaces (already implemented) into a one-shot "give me the IPs" command. Filter out loopback/link-local.
83
+ - From piclaw: `vm.ip` and `lxc.ip` workflows.
84
+
85
+ - [x] **LXC IP quick-lookup**
86
+ - `proxmox container ip <vmid> [--node <node>]`
87
+ - Wraps `GET /nodes/{node}/lxc/{vmid}/interfaces`, extracting IPv4/IPv6 addresses.
88
+ - From piclaw: `lxc.ip` workflow.
89
+
90
+ ### Priority: LOW
91
+
92
+ - [x] **VM disk resize**
93
+ - `proxmox vm disk resize <vmid> --disk <disk> --size <+N or N> [--node <node>]`
94
+ - Wraps `PUT /nodes/{node}/qemu/{vmid}/resize`.
95
+ - From piclaw: `vm.disk.resize` workflow.
96
+
97
+ - [x] **VM disk detach / remove**
98
+ - `proxmox vm disk detach <vmid> --disk <disk> [--node <node>]`
99
+ - `proxmox vm disk remove <vmid> --disk <disk> [--force] [--node <node>]`
100
+ - From piclaw: `vm.disk.detach` and `vm.disk.remove` workflows.
101
+
102
+ - [x] **VM guest agent exec**
103
+ - `proxmox vm agent exec <vmid> --command <cmd> [--args ...] [--input-data ...] [--shell posix|powershell]`
104
+ - Extend the existing `vm agent` subcommand with an `exec` sub-action.
105
+ - Wraps `POST /nodes/{node}/qemu/{vmid}/agent/exec` + polling for result.
106
+ - From piclaw: `vm.agent.exec` workflow. Bounded command execution with base64 I/O decoding.
107
+
108
+ - [x] **VM guest agent OS info / FS info / users**
109
+ - `proxmox vm agent osinfo <vmid>` — `GET /nodes/{node}/qemu/{vmid}/agent/get-osinfo`
110
+ - `proxmox vm agent fsinfo <vmid>` — `GET /nodes/{node}/qemu/{vmid}/agent/get-fsinfo`
111
+ - `proxmox vm agent users <vmid>` — `GET /nodes/{node}/qemu/{vmid}/agent/get-users`
112
+ - From piclaw: `vm.agent.osinfo`, `vm.agent.fsinfo`, `vm.agent.users` workflows.
113
+
114
+ - [x] **Task wait (blocking poll)**
115
+ - `proxmox task wait <upid> [--timeout <ms>] [--poll <ms>]`
116
+ - Polls task status until completion, useful in scripts. pixlaw has both `task.wait` and `vm.wait_state`.
117
+
118
+ ---
119
+
120
+ ## v1.3 — Metrics & Monitoring
121
+
122
+ The piclaw proxmox addon has a rich `metrics.*` workflow family. proxcli has zero metrics support. This would be a killer feature for a CLI.
123
+
124
+ - [ ] **`proxmox metrics` top-level subcommand**
125
+ - Wraps the RRD data API endpoints (`/nodes/{node}/rrddata`, `/nodes/{node}/qemu/{vmid}/rrddata`, `/nodes/{node}/storage/{storage}/rrddata`).
126
+ - Common flags: `--timeframe hour|day|week|month|year` (default: `hour`), `--cf AVERAGE|MAX` (default: `AVERAGE`).
127
+
128
+ - [ ] **`proxmox metrics node <node> [--metric <name>]`**
129
+ - Pulls node-level RRD series: CPU, memory, disk, network, load, etc.
130
+
131
+ - [ ] **`proxmox metrics vm <vmid> [--node <node>] [--metric <name>]`**
132
+ - Pulls VM-level RRD series for a specific guest.
133
+
134
+ - [ ] **`proxmox metrics storage <storage> --node <node> [--metric <name>]`**
135
+ - Pulls storage usage metrics over time.
136
+
137
+ - [ ] **Metrics output: chart / CSV / JSON**
138
+ - `--output chart` could render a simple ASCII/Unicode sparkline in the terminal.
139
+ - `--output csv` for data export into external tools.
140
+ - `--output json` for programmatic consumers.
141
+
142
+ - [ ] **Guest comparison chart** (inspired by piclaw skill `proxmox-guest-compare-chart`)
143
+ - A `proxmox compare` or `proxmox metrics compare` subcommand that fetches RRD series for two guests and renders an SVG chart or terminal comparison table.
144
+ - The piclaw skill uses a Bun script to render SVG/CSV/JSON from normalized input — we could do this purely in Python.
145
+
146
+ ---
147
+
148
+ ## v1.4 — Storage Gaps
149
+
150
+ - [ ] **Storage create**
151
+ - `proxmox storage create <name> --type <type> [--config key=value ...]`
152
+ - Wraps `POST /storage`. Supports dir, nfs, lvmthin, zfspool, etc.
153
+ - From piclaw: `storage.create` workflow. Config fields passed as a flat dict for backend-specific options.
154
+
155
+ - [ ] **Storage download-url** (server-side pull)
156
+ - `proxmox storage download-url --node <node> --storage <storage> --url <url> --filename <name> [--content iso|vztmpl|import] [--checksum <sha256:...>] [--verify-tls]`
157
+ - Wraps `POST /nodes/{node}/storage/{storage}/download-url`.
158
+ - Lets you pull ISOs/templates directly into storage without agent-side upload.
159
+ - From piclaw: `storage.download_url` workflow with checksum verification.
160
+
161
+ ---
162
+
163
+ ## v1.5 — Resource Coverage (existing TODO)
164
+
165
+ - [ ] **SDN (Software-Defined Networking)**
166
+ - `proxmox sdn` subcommand: `zones`, `vnets`, `subnets`. Wraps `/cluster/sdn/*` endpoints.
167
+
168
+ - [ ] **HA (High Availability)**
169
+ - `proxmox ha` subcommand: `status`, `groups`, `resources`. Wraps `/cluster/ha/*` endpoints.
170
+
171
+ - [ ] **Node syslog**
172
+ - `proxmox node log <node> [--limit N]`
173
+ - Wraps `GET /nodes/{node}/syslog`. Read node-level syslog entries (currently only `ceph log` exists).
174
+
175
+ ---
176
+
177
+ ## v2.0 — Multi-Cluster & Advanced
178
+
179
+ - [ ] **Multi-profile / multi-cluster support**
180
+ - Support `--profile <name>` global flag to switch between multiple saved Proxmox endpoints. Config file format extended from single endpoint to a profiles dict. `proxmox auth login --profile homelab` and `proxmox auth login --profile work` coexist.
181
+
182
+ - [ ] **Batch / bulk operations**
183
+ - `proxmox vm start --all-on-node pve01` (start all VMs on a node). `proxmox vm snapshot --vmid 100,101,102` (apply to multiple IDs).
184
+
185
+ - [x] **Config file templating**
186
+ - ``vm create --file spec.yaml`` for declarative VM specs. File format
187
+ mirrors the native Proxmox VM config (flat key-value: ``name``,
188
+ ``memory``, ``cores``, ``net0``, ``scsi0``, ``ciuser``, etc.).
189
+ - ``vm show <id> --output yaml`` exports existing VM config in the
190
+ same flat format (strips internal fields like ``digest``, ``vmgenid``).
191
+ Export → edit → recreate loop.
192
+
193
+ - [ ] **Plugin system for custom commands**
194
+ - Allow users to extend the CLI with custom subcommands via a plugins directory.
195
+
196
+ - [ ] **Dry-run diff mode**
197
+ - `--dry-run` that shows what *would change* on the Proxmox side (e.g., before/after VM config diff) rather than just the HTTP request.
198
+
199
+ ---
200
+
201
+ ## Ideas (not yet scheduled)
202
+
203
+ - [ ] **Interactive mode / TUI**
204
+ - A `proxmox tui` command that opens a terminal UI (like `htop` but for Proxmox resources). Low priority — the CLI is designed for automation first.
205
+
206
+ - [ ] **Webhook / event listener**
207
+ - Subscribe to Proxmox cluster events and pipe them to a webhook or stdout for external monitoring.
208
+
209
+ - [ ] **Proxmox Backup Server (PBS) integration**
210
+ - Separate subcommand or a companion tool (`proxbackup`?) for managing PBS instances via their API.
211
+
212
+ - [ ] **Terraform / Pulumi bridge**
213
+ - Export current Proxmox state as Terraform HCL or Pulumi Python/TypeScript, enabling import into IaC.
@@ -0,0 +1,165 @@
1
+ ---
2
+ name: proxcli
3
+ version: "1.0"
4
+ colors:
5
+ primary: "#0F172A"
6
+ secondary: "#334155"
7
+ tertiary: "#3B82F6"
8
+ on-tertiary: "#FFFFFF"
9
+ surface: "#F8FAFC"
10
+ surface-variant: "#E2E8F0"
11
+ on-surface: "#1E293B"
12
+ border: "#CBD5E1"
13
+ muted: "#94A3B8"
14
+ success: "#10B981"
15
+ warning: "#F59E0B"
16
+ error: "#EF4444"
17
+ code-bg: "#1E293B"
18
+ code-fg: "#E2E8F0"
19
+ typography:
20
+ heading:
21
+ fontFamily: "Inter, system-ui, sans-serif"
22
+ fontWeight: 700
23
+ body:
24
+ fontFamily: "Inter, system-ui, sans-serif"
25
+ fontWeight: 400
26
+ mono:
27
+ fontFamily: "'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace"
28
+ fontWeight: 400
29
+ label-caps:
30
+ fontFamily: "Inter, system-ui, sans-serif"
31
+ fontWeight: 600
32
+ letterSpacing: "0.05em"
33
+ rounded:
34
+ sm: 4px
35
+ md: 8px
36
+ lg: 12px
37
+ xl: 16px
38
+ full: 9999px
39
+ spacing:
40
+ xs: 4px
41
+ sm: 8px
42
+ md: 16px
43
+ lg: 24px
44
+ xl: 32px
45
+ "2xl": 48px
46
+ "3xl": 64px
47
+ "4xl": 96px
48
+ components:
49
+ button-primary:
50
+ backgroundColor: "{colors.tertiary}"
51
+ textColor: "{colors.on-tertiary}"
52
+ rounded: "{rounded.md}"
53
+ padding: "{spacing.sm} {spacing.lg}"
54
+ typography: "{typography.label-caps}"
55
+ button-primary-hover:
56
+ backgroundColor: "#2563EB"
57
+ code-block:
58
+ backgroundColor: "{colors.code-bg}"
59
+ textColor: "{colors.code-fg}"
60
+ rounded: "{rounded.lg}"
61
+ padding: "{spacing.lg}"
62
+ hero-section:
63
+ backgroundColor: "{colors.primary}"
64
+ textColor: "{colors.on-tertiary}"
65
+ card:
66
+ backgroundColor: "{colors.surface}"
67
+ borderColor: "{colors.border}"
68
+ rounded: "{rounded.lg}"
69
+ padding: "{spacing.lg}"
70
+ ---
71
+
72
+ ## Overview
73
+
74
+ **proxcli** is a developer-first CLI tool for Proxmox VE infrastructure.
75
+ The visual identity balances terminal minimalism with modern SaaS polish —
76
+ dark slate foundation, a single electric-blue accent, and crisp monospaced
77
+ code surfaces.
78
+
79
+ The brand sits at the intersection of **infrastructure professionalism**
80
+ and **developer joy**. Clean, confident, utilitarian — but never cold.
81
+ The blue accent (`#3B82F6`) provides the energy and forward momentum
82
+ of a tool that makes infrastructure feel fast, responsive, and under
83
+ control.
84
+
85
+ ## Colors
86
+
87
+ - **Primary (`#0F172A`):** Deep navy-slate. Used for hero sections,
88
+ the nav bar, and as a grounding dark surface. Conveys infrastructure
89
+ seriousness and reliability.
90
+ - **Secondary (`#334155`):** Medium slate. Used for subheadings,
91
+ muted text on light backgrounds, and secondary UI chrome.
92
+ - **Tertiary (`#3B82F6`):** Electric blue. The sole interactive accent —
93
+ buttons, links, active states, code highlights. High-energy without
94
+ being aggressive. Hover darkens to `#2563EB`.
95
+ - **Surface (`#F8FAFC`):** Near-white with a hint of cool gray. Primary
96
+ page background. Softer than pure white for long-form reading.
97
+ - **Surface variant (`#E2E8F0`):** Light gray for alternating sections,
98
+ card borders, and subtle visual separation.
99
+ - **Code background (`#1E293B`):** Dark slate for code blocks and
100
+ terminal emulation. Paired with off-white `#E2E8F0` for code text.
101
+
102
+ ## Typography
103
+
104
+ - **Headings:** Inter, bold weight. Clean and geometric for section
105
+ titles. Large sizes (`4xl`, `3xl`, `2xl`) for hero and section heads.
106
+ - **Body:** Inter, regular weight. Optimized for screen reading at
107
+ `16px` base size (1rem).
108
+ - **Mono:** JetBrains Mono for all code, terminal output, and
109
+ command examples. Fallback stack: Fira Code → Cascadia Code → monospace.
110
+ - **Label/Caps:** Inter Semibold with 0.05em letter-spacing for button
111
+ text, badges, and navigation items.
112
+
113
+ ## Layout
114
+
115
+ - **Max content width:** 1280px centered, with generous horizontal
116
+ padding (`2xl`) on wider screens.
117
+ - **Sections stack vertically** with `3xl` or `4xl` spacing between them.
118
+ - **Two-column grids** for feature cards, comparison tables, and
119
+ use-case highlights.
120
+ - **Terminal/Code blocks** are full-width within content, with
121
+ `lg` rounded corners and `lg` internal padding.
122
+
123
+ ## Elevation & Depth
124
+
125
+ - Flat design with minimal shadow usage. Cards use a 1px border
126
+ instead of box-shadow to maintain a crisp, editor-like aesthetic.
127
+ - Code blocks sit on the dark `code-bg` surface with no shadow —
128
+ they feel "cut into" the page.
129
+ - Only the sticky navigation bar gets a subtle shadow on scroll.
130
+
131
+ ## Shapes
132
+
133
+ - All interactive elements use `md` border radius (8px).
134
+ - Code blocks and terminal surfaces use `lg` (12px).
135
+ - Buttons use `md` (8px) — rounded enough to feel modern but not pill-shaped.
136
+ - Full-radius (`full`) reserved for badges and tags.
137
+
138
+ ## Components
139
+
140
+ - **button-primary:** Electric blue background with white text, Inter semibold.
141
+ Hover darkens to `#2563EB`. Used for primary CTAs.
142
+ - **code-block:** Dark slate surface (`#1E293B`) with off-white monospaced text.
143
+ Used for all command examples, terminal output, and YAML samples.
144
+ - **hero-section:** Full-width dark slate background with centered white text.
145
+ Features the proxcli logo/title, a one-line value prop, and a "Get Started"
146
+ button.
147
+ - **card:** White surface with a subtle border, rounded corners, and internal
148
+ padding. Used for feature tiles and documentation sections.
149
+
150
+ ## Do's and Don'ts
151
+
152
+ ### Do
153
+ - Use the single accent (`#3B82F6`) sparingly for interactive elements only
154
+ - Keep code examples concise — show the command and its output
155
+ - Use Inter for all prose, JetBrains Mono for all code
156
+ - Maintain generous whitespace around sections for readability
157
+ - Use the dark hero to ground the page immediately on landing
158
+
159
+ ### Don't
160
+ - Don't introduce additional colors beyond the defined palette
161
+ - Don't use box-shadows on cards — use borders instead
162
+ - Don't use the accent color for non-interactive text
163
+ - Don't clump multiple code blocks without prose between them
164
+ - Don't use the dark surface (`#0F172A`) for large text blocks —
165
+ it's reserved for hero sections and navigation