wealthbox-cli 1.5.1__tar.gz → 2.1.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 (150) hide show
  1. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/.github/workflows/ci.yml +21 -10
  2. wealthbox_cli-2.1.0/.github/workflows/release-binaries.yml +220 -0
  3. wealthbox_cli-1.5.1/docs/changelog.md → wealthbox_cli-2.1.0/CHANGELOG.md +93 -45
  4. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/CONTRIBUTING.md +22 -14
  5. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/PKG-INFO +7 -15
  6. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/README.md +6 -13
  7. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/SECURITY.md +1 -1
  8. wealthbox_cli-2.1.0/docs/agents/domain.md +51 -0
  9. wealthbox_cli-2.1.0/docs/agents/issue-tracker.md +22 -0
  10. wealthbox_cli-2.1.0/docs/agents/triage-labels.md +15 -0
  11. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/docs/getting-started.md +1 -7
  12. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/mkdocs.yml +0 -1
  13. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/pyproject.toml +1 -3
  14. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/__init__.py +9 -0
  15. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/_config.py +24 -0
  16. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/_skill_bootstrap.py +18 -4
  17. wealthbox_cli-2.1.0/src/wealthbox_tools/cli/_skill_platforms.py +109 -0
  18. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/_util.py +2 -10
  19. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/doctor.py +84 -24
  20. wealthbox_cli-2.1.0/src/wealthbox_tools/cli/firm.py +158 -0
  21. wealthbox_cli-2.1.0/src/wealthbox_tools/cli/internals.py +37 -0
  22. wealthbox_cli-2.1.0/src/wealthbox_tools/cli/main.py +138 -0
  23. wealthbox_cli-2.1.0/src/wealthbox_tools/cli/prefs.py +44 -0
  24. wealthbox_cli-2.1.0/src/wealthbox_tools/cli/self_cmd.py +61 -0
  25. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/skills.py +11 -14
  26. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/users.py +1 -1
  27. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/base.py +12 -1
  28. wealthbox_cli-2.1.0/src/wealthbox_tools/firm/__init__.py +31 -0
  29. wealthbox_cli-2.1.0/src/wealthbox_tools/firm/archive.py +499 -0
  30. wealthbox_cli-2.1.0/src/wealthbox_tools/firm/diff.py +233 -0
  31. wealthbox_cli-2.1.0/src/wealthbox_tools/internals/__init__.py +6 -0
  32. wealthbox_cli-2.1.0/src/wealthbox_tools/internals/skill_ref_gen.py +433 -0
  33. wealthbox_cli-2.1.0/src/wealthbox_tools/self_upgrade.py +680 -0
  34. {wealthbox_cli-1.5.1/plugins/wealthbox-crm → wealthbox_cli-2.1.0/src/wealthbox_tools}/skills/wealthbox-crm/SKILL.md +38 -1
  35. {wealthbox_cli-1.5.1/plugins/wealthbox-crm → wealthbox_cli-2.1.0/src/wealthbox_tools}/skills/wealthbox-crm/bootstrap.md +7 -0
  36. wealthbox_cli-2.1.0/src/wealthbox_tools/skills/wealthbox-crm/references/contacts.md +519 -0
  37. wealthbox_cli-2.1.0/src/wealthbox_tools/skills/wealthbox-crm/references/events.md +241 -0
  38. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/skills/wealthbox-crm/references/households.md +51 -0
  39. wealthbox_cli-2.1.0/src/wealthbox_tools/skills/wealthbox-crm/references/notes.md +157 -0
  40. wealthbox_cli-2.1.0/src/wealthbox_tools/skills/wealthbox-crm/references/opportunities.md +212 -0
  41. wealthbox_cli-2.1.0/src/wealthbox_tools/skills/wealthbox-crm/references/projects.md +143 -0
  42. wealthbox_cli-2.1.0/src/wealthbox_tools/skills/wealthbox-crm/references/tasks.md +251 -0
  43. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/skills/wealthbox-crm/references/workflows.md +165 -0
  44. wealthbox_cli-2.1.0/uv.lock +635 -0
  45. wealthbox_cli-1.5.1/.claude-plugin/marketplace.json +0 -25
  46. wealthbox_cli-1.5.1/.codex-plugin/plugin.json +0 -16
  47. wealthbox_cli-1.5.1/.env.example +0 -2
  48. wealthbox_cli-1.5.1/codex-skill/wealthbox-crm/SKILL.md +0 -160
  49. wealthbox_cli-1.5.1/codex-skill/wealthbox-crm/bootstrap.md +0 -127
  50. wealthbox_cli-1.5.1/codex-skill/wealthbox-crm/references/contacts.md +0 -155
  51. wealthbox_cli-1.5.1/codex-skill/wealthbox-crm/references/events.md +0 -88
  52. wealthbox_cli-1.5.1/codex-skill/wealthbox-crm/references/households.md +0 -40
  53. wealthbox_cli-1.5.1/codex-skill/wealthbox-crm/references/notes.md +0 -67
  54. wealthbox_cli-1.5.1/codex-skill/wealthbox-crm/references/opportunities.md +0 -87
  55. wealthbox_cli-1.5.1/codex-skill/wealthbox-crm/references/projects.md +0 -60
  56. wealthbox_cli-1.5.1/codex-skill/wealthbox-crm/references/tasks.md +0 -106
  57. wealthbox_cli-1.5.1/codex-skill/wealthbox-crm/references/workflows.md +0 -145
  58. wealthbox_cli-1.5.1/plugins/wealthbox-crm/.claude-plugin/plugin.json +0 -17
  59. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/firm-examples/contacts.md +0 -21
  60. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/firm-examples/events.md +0 -9
  61. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/firm-examples/notes.md +0 -5
  62. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/firm-examples/opportunities.md +0 -12
  63. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/firm-examples/projects.md +0 -5
  64. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/firm-examples/tasks.md +0 -14
  65. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/firm-examples/workflows.md +0 -31
  66. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/references/contacts.md +0 -155
  67. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/references/events.md +0 -88
  68. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/references/households.md +0 -40
  69. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/references/lookups.md +0 -78
  70. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/references/notes.md +0 -67
  71. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/references/opportunities.md +0 -87
  72. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/references/projects.md +0 -60
  73. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/references/tasks.md +0 -106
  74. wealthbox_cli-1.5.1/plugins/wealthbox-crm/skills/wealthbox-crm/references/workflows.md +0 -145
  75. wealthbox_cli-1.5.1/src/wealthbox_tools/cli/_skill_platforms.py +0 -235
  76. wealthbox_cli-1.5.1/src/wealthbox_tools/cli/main.py +0 -71
  77. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/SKILL.md +0 -160
  78. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/bootstrap.md +0 -127
  79. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/contacts.md +0 -21
  80. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/events.md +0 -9
  81. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/notes.md +0 -5
  82. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/opportunities.md +0 -12
  83. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/projects.md +0 -5
  84. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/tasks.md +0 -14
  85. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/workflows.md +0 -31
  86. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/references/contacts.md +0 -155
  87. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/references/events.md +0 -88
  88. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/references/lookups.md +0 -78
  89. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/references/notes.md +0 -67
  90. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/references/opportunities.md +0 -87
  91. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/references/projects.md +0 -60
  92. wealthbox_cli-1.5.1/src/wealthbox_tools/skills/wealthbox-crm/references/tasks.md +0 -106
  93. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/.github/workflows/docs.yml +0 -0
  94. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/.gitignore +0 -0
  95. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/LICENSE +0 -0
  96. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/docs/cli-reference.md +0 -0
  97. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/docs/index.md +0 -0
  98. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/docs/overrides/main.html +0 -0
  99. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/docs/promotion.md +0 -0
  100. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/__init__.py +0 -0
  101. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/_skill_paths.py +0 -0
  102. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/activity.py +0 -0
  103. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/categories.py +0 -0
  104. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/config.py +0 -0
  105. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/contacts.py +0 -0
  106. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/events.py +0 -0
  107. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/households.py +0 -0
  108. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/me.py +0 -0
  109. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/notes.py +0 -0
  110. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/opportunities.py +0 -0
  111. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/projects.py +0 -0
  112. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/tasks.py +0 -0
  113. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/cli/workflows.py +0 -0
  114. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/__init__.py +0 -0
  115. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/activity.py +0 -0
  116. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/categories.py +0 -0
  117. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/comments.py +0 -0
  118. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/contacts.py +0 -0
  119. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/events.py +0 -0
  120. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/households.py +0 -0
  121. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/me.py +0 -0
  122. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/notes.py +0 -0
  123. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/opportunities.py +0 -0
  124. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/projects.py +0 -0
  125. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/tasks.py +0 -0
  126. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/users.py +0 -0
  127. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/client/workflows.py +0 -0
  128. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/__init__.py +0 -0
  129. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/activity.py +0 -0
  130. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/comments.py +0 -0
  131. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/common.py +0 -0
  132. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/contacts.py +0 -0
  133. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/custom_fields.py +0 -0
  134. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/enums.py +0 -0
  135. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/events.py +0 -0
  136. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/households.py +0 -0
  137. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/notes.py +0 -0
  138. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/opportunities.py +0 -0
  139. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/projects.py +0 -0
  140. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/tasks.py +0 -0
  141. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/models/workflows.py +0 -0
  142. {wealthbox_cli-1.5.1 → wealthbox_cli-2.1.0}/src/wealthbox_tools/py.typed +0 -0
  143. {wealthbox_cli-1.5.1/codex-skill → wealthbox_cli-2.1.0/src/wealthbox_tools/skills}/wealthbox-crm/firm-examples/contacts.md +0 -0
  144. {wealthbox_cli-1.5.1/codex-skill → wealthbox_cli-2.1.0/src/wealthbox_tools/skills}/wealthbox-crm/firm-examples/events.md +0 -0
  145. {wealthbox_cli-1.5.1/codex-skill → wealthbox_cli-2.1.0/src/wealthbox_tools/skills}/wealthbox-crm/firm-examples/notes.md +0 -0
  146. {wealthbox_cli-1.5.1/codex-skill → wealthbox_cli-2.1.0/src/wealthbox_tools/skills}/wealthbox-crm/firm-examples/opportunities.md +0 -0
  147. {wealthbox_cli-1.5.1/codex-skill → wealthbox_cli-2.1.0/src/wealthbox_tools/skills}/wealthbox-crm/firm-examples/projects.md +0 -0
  148. {wealthbox_cli-1.5.1/codex-skill → wealthbox_cli-2.1.0/src/wealthbox_tools/skills}/wealthbox-crm/firm-examples/tasks.md +0 -0
  149. {wealthbox_cli-1.5.1/codex-skill → wealthbox_cli-2.1.0/src/wealthbox_tools/skills}/wealthbox-crm/firm-examples/workflows.md +0 -0
  150. {wealthbox_cli-1.5.1/codex-skill → wealthbox_cli-2.1.0/src/wealthbox_tools/skills}/wealthbox-crm/references/lookups.md +0 -0
@@ -12,11 +12,11 @@ jobs:
12
12
  runs-on: ubuntu-latest
13
13
  steps:
14
14
  - uses: actions/checkout@v4
15
- - uses: actions/setup-python@v5
15
+ - uses: astral-sh/setup-uv@v6
16
16
  with:
17
17
  python-version: "3.12"
18
- - run: pip install -e ".[dev]"
19
- - run: ruff check src/ tests/
18
+ - run: uv sync --extra dev
19
+ - run: uv run ruff check src/ tests/
20
20
 
21
21
  test:
22
22
  runs-on: ubuntu-latest
@@ -25,14 +25,26 @@ jobs:
25
25
  python-version: ["3.11", "3.12", "3.13"]
26
26
  steps:
27
27
  - uses: actions/checkout@v4
28
- - uses: actions/setup-python@v5
28
+ - uses: astral-sh/setup-uv@v6
29
29
  with:
30
30
  python-version: ${{ matrix.python-version }}
31
- - run: pip install -e ".[dev]"
32
- - run: pytest
31
+ - run: uv sync --extra dev
32
+ - run: uv run pytest
33
33
 
34
- publish:
34
+ skill-ref-drift:
35
35
  needs: [lint, test]
36
+ runs-on: ubuntu-latest
37
+ steps:
38
+ - uses: actions/checkout@v4
39
+ - uses: astral-sh/setup-uv@v6
40
+ with:
41
+ python-version: "3.12"
42
+ - run: uv sync --extra dev
43
+ - run: uv run wbox internals regen-skill-refs
44
+ - run: git diff --exit-code -- src/wealthbox_tools/skills/wealthbox-crm/references/
45
+
46
+ publish:
47
+ needs: [lint, test, skill-ref-drift]
36
48
  if: startsWith(github.ref, 'refs/tags/v')
37
49
  runs-on: ubuntu-latest
38
50
  permissions:
@@ -40,9 +52,8 @@ jobs:
40
52
  environment: pypi
41
53
  steps:
42
54
  - uses: actions/checkout@v4
43
- - uses: actions/setup-python@v5
55
+ - uses: astral-sh/setup-uv@v6
44
56
  with:
45
57
  python-version: "3.12"
46
- - run: pip install build
47
- - run: python -m build
58
+ - run: uv build
48
59
  - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,220 @@
1
+ # Per-platform PyInstaller build + GitHub Release upload.
2
+ #
3
+ # Triggered on v* tags (and manually via workflow_dispatch for fork
4
+ # validation). Builds a single-file ``wbox`` binary for each of the four
5
+ # supported targets, computes its SHA-256, and uploads the binaries plus
6
+ # a combined manifest as assets on the GitHub Release for the tag.
7
+ #
8
+ # The PyPI publish job lives in ci.yml and is intentionally not touched
9
+ # here — both workflows fire on ``v*`` tags but operate independently.
10
+ #
11
+ # ----------------------------------------------------------------------
12
+ # Manifest contract (LOCKED — downstream consumers: issue #42 install.sh
13
+ # rewrite, issue #43 install.ps1 parity)
14
+ # ----------------------------------------------------------------------
15
+ # Manifest filename: SHA256SUMS.txt
16
+ # Format: standard sha256sum-compatible. One record per line:
17
+ # <hex-sha256><two-spaces><filename>
18
+ # Sort order: ASCII-sorted by filename (stable across runs)
19
+ # Binary filenames:
20
+ # wbox-linux-x64
21
+ # wbox-macos-arm64
22
+ # wbox-macos-x64
23
+ # wbox-windows-x64.exe
24
+ # Manifest assets are attached to the same GitHub Release as the four
25
+ # binaries. Install scripts can fetch SHA256SUMS.txt and a single binary
26
+ # from the same release URL prefix and verify the binary against the
27
+ # matching line.
28
+ # ----------------------------------------------------------------------
29
+
30
+ name: Release Binaries
31
+
32
+ on:
33
+ push:
34
+ tags: ["v*"]
35
+ workflow_dispatch: {}
36
+
37
+ permissions:
38
+ contents: read
39
+
40
+ jobs:
41
+ build:
42
+ name: Build ${{ matrix.target }}
43
+ runs-on: ${{ matrix.os }}
44
+ strategy:
45
+ fail-fast: false
46
+ matrix:
47
+ include:
48
+ - os: ubuntu-latest
49
+ target: linux-x64
50
+ binary: wbox-linux-x64
51
+ - os: macos-15-intel # Intel runner (x86_64) — macos-13 was retired Dec 2025
52
+ target: macos-x64
53
+ binary: wbox-macos-x64
54
+ - os: macos-14 # Apple Silicon runner (arm64)
55
+ target: macos-arm64
56
+ binary: wbox-macos-arm64
57
+ - os: windows-latest
58
+ target: windows-x64
59
+ binary: wbox-windows-x64.exe
60
+ steps:
61
+ - name: Checkout
62
+ uses: actions/checkout@v4
63
+
64
+ - name: Set up Python
65
+ uses: actions/setup-python@v5
66
+ with:
67
+ python-version: "3.12"
68
+
69
+ - name: Install runtime + build deps
70
+ run: |
71
+ python -m pip install --upgrade pip
72
+ pip install .
73
+ pip install pyinstaller
74
+
75
+ - name: Build single-file binary (Unix)
76
+ if: runner.os != 'Windows'
77
+ shell: bash
78
+ run: |
79
+ pyinstaller \
80
+ --onefile \
81
+ --name "${{ matrix.binary }}" \
82
+ --noconfirm \
83
+ --collect-data wealthbox_tools \
84
+ --copy-metadata wealthbox-cli \
85
+ scripts/wbox_entry.py
86
+ test -f "dist/${{ matrix.binary }}"
87
+ chmod +x "dist/${{ matrix.binary }}"
88
+
89
+ - name: Build single-file binary (Windows)
90
+ if: runner.os == 'Windows'
91
+ shell: pwsh
92
+ run: |
93
+ pyinstaller `
94
+ --onefile `
95
+ --name "${{ matrix.binary }}" `
96
+ --noconfirm `
97
+ --collect-data wealthbox_tools `
98
+ --copy-metadata wealthbox-cli `
99
+ scripts/wbox_entry.py
100
+ if (-not (Test-Path "dist/${{ matrix.binary }}")) {
101
+ throw "expected dist/${{ matrix.binary }} to exist"
102
+ }
103
+
104
+ - name: Smoke-test binary
105
+ # `--version` only proves the entry point runs. `skills install`
106
+ # exercises bundled package data — it reads
107
+ # wealthbox_tools/skills/wealthbox-crm via importlib.resources — so
108
+ # this fails loudly if --collect-data wealthbox_tools didn't bundle
109
+ # the skill template. Runs against the fresh runner HOME with
110
+ # --no-bootstrap to skip the post-install confirm prompt.
111
+ run: |
112
+ ./dist/${{ matrix.binary }} --version
113
+ ./dist/${{ matrix.binary }} skills install --platform claude-code-user --no-bootstrap
114
+
115
+ - name: Compute SHA-256 (Unix)
116
+ if: runner.os != 'Windows'
117
+ shell: bash
118
+ working-directory: dist
119
+ run: |
120
+ if command -v sha256sum >/dev/null 2>&1; then
121
+ sha256sum "${{ matrix.binary }}" > "${{ matrix.binary }}.sha256"
122
+ else
123
+ # macOS: shasum -a 256 emits sha256sum-compatible "<hash> <name>"
124
+ shasum -a 256 "${{ matrix.binary }}" > "${{ matrix.binary }}.sha256"
125
+ fi
126
+ cat "${{ matrix.binary }}.sha256"
127
+
128
+ - name: Compute SHA-256 (Windows)
129
+ if: runner.os == 'Windows'
130
+ shell: pwsh
131
+ working-directory: dist
132
+ run: |
133
+ $hash = (Get-FileHash -Algorithm SHA256 "${{ matrix.binary }}").Hash.ToLower()
134
+ # sha256sum format: "<hex> <filename>" (two spaces, LF line ending)
135
+ $line = "$hash ${{ matrix.binary }}`n"
136
+ [System.IO.File]::WriteAllText(
137
+ (Join-Path $PWD "${{ matrix.binary }}.sha256"),
138
+ $line
139
+ )
140
+ Get-Content "${{ matrix.binary }}.sha256"
141
+
142
+ - name: Upload build artifact
143
+ uses: actions/upload-artifact@v4
144
+ with:
145
+ name: wbox-${{ matrix.target }}
146
+ path: |
147
+ dist/${{ matrix.binary }}
148
+ dist/${{ matrix.binary }}.sha256
149
+ if-no-files-found: error
150
+ retention-days: 7
151
+
152
+ manifest-and-release:
153
+ name: Combine manifest and upload to release
154
+ needs: [build]
155
+ runs-on: ubuntu-latest
156
+ permissions:
157
+ contents: write
158
+ steps:
159
+ - name: Download all build artifacts
160
+ uses: actions/download-artifact@v4
161
+ with:
162
+ path: artifacts
163
+
164
+ - name: Stage release files
165
+ shell: bash
166
+ run: |
167
+ mkdir -p release
168
+ # Each artifact directory contains one binary + one .sha256 file.
169
+ find artifacts -type f \( -name 'wbox-*' -a ! -name '*.sha256' \) -exec cp -v {} release/ \;
170
+ find artifacts -type f -name '*.sha256' -exec cp -v {} release/ \;
171
+ ls -la release
172
+
173
+ - name: Build combined SHA256SUMS.txt
174
+ shell: bash
175
+ working-directory: release
176
+ run: |
177
+ # Concatenate per-binary sums into a single sha256sum-compatible
178
+ # manifest, ASCII-sorted by filename for stability.
179
+ # Each .sha256 file is already in "<hex> <filename>" form.
180
+ cat *.sha256 | LC_ALL=C sort -k 2 > SHA256SUMS.txt
181
+ echo "----- SHA256SUMS.txt -----"
182
+ cat SHA256SUMS.txt
183
+ echo "--------------------------"
184
+ # Verify the manifest against the staged binaries as a sanity check.
185
+ sha256sum -c SHA256SUMS.txt
186
+
187
+ - name: Upload combined manifest artifact
188
+ uses: actions/upload-artifact@v4
189
+ with:
190
+ name: SHA256SUMS
191
+ path: release/SHA256SUMS.txt
192
+ if-no-files-found: error
193
+
194
+ - name: Upload assets to GitHub Release
195
+ if: startsWith(github.ref, 'refs/tags/')
196
+ env:
197
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
198
+ TAG: ${{ github.ref_name }}
199
+ GH_REPO: ${{ github.repository }}
200
+ shell: bash
201
+ working-directory: release
202
+ run: |
203
+ # Ensure a release exists for the tag. If the PyPI publish job in
204
+ # ci.yml or a manual release-create created it first, --clobber on
205
+ # upload handles re-runs cleanly.
206
+ if ! gh release view "$TAG" >/dev/null 2>&1; then
207
+ gh release create "$TAG" \
208
+ --title "$TAG" \
209
+ --notes "Automated release for $TAG. Binaries built by release-binaries.yml; PyPI wheel published by ci.yml."
210
+ fi
211
+ # Upload all four binaries + the combined manifest. Per-platform
212
+ # .sha256 sidecars are intentionally not uploaded — SHA256SUMS.txt
213
+ # is the single source of truth for installers.
214
+ gh release upload "$TAG" \
215
+ wbox-linux-x64 \
216
+ wbox-macos-arm64 \
217
+ wbox-macos-x64 \
218
+ wbox-windows-x64.exe \
219
+ SHA256SUMS.txt \
220
+ --clobber
@@ -1,12 +1,94 @@
1
1
  # Changelog
2
2
 
3
- All notable changes to **wealthbox-cli** are documented here.
3
+ All notable changes to `wealthbox-cli` are documented here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
5
+ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
6
 
5
- This project uses [Semantic Versioning](https://semver.org/).
7
+ ## [2.1.0] - 2026-05-09
6
8
 
7
- ---
9
+ Repository simplification release. Drops a runtime dep, retires `.env` support,
10
+ and switches dev tooling to [uv](https://docs.astral.sh/uv/).
8
11
 
9
- ## [1.3.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.3.0) — 2026-05-03
12
+ ### Breaking
13
+ - **Removed `.env` file support.** Token resolution is now a 3-tier chain:
14
+ `--token` flag → `WEALTHBOX_TOKEN` env var → config file. Users relying on a
15
+ working-directory `.env` should migrate to `wbox config set-token` (preferred)
16
+ or export `WEALTHBOX_TOKEN` in their shell. The `python-dotenv` runtime
17
+ dependency was dropped.
18
+
19
+ ### Changed
20
+ - Development tooling moved to [uv](https://docs.astral.sh/uv/). `uv sync
21
+ --extra dev` replaces the manual `python -m venv` + activate + `pip install
22
+ -e` dance, and `uv run wbox …` replaces direct `.venv/bin/wbox` invocation.
23
+ CI now uses `astral-sh/setup-uv@v6` and `uv build` for the publish job. Plain
24
+ `pip install -e ".[dev]"` continues to work — `pyproject.toml` is the source
25
+ of truth for both tools.
26
+ - `scripts/run-wbox.sh` and `scripts/smoke_test.sh` invoke via `uv run` and no
27
+ longer source a `.env` file.
28
+
29
+ ### Removed
30
+ - `.env` and `.env.example` files at the repo root.
31
+ - `.python-version` file. `requires-python = ">=3.11"` in `pyproject.toml` is
32
+ the authoritative interpreter constraint; uv reads it directly.
33
+
34
+ ## [2.0.0] - 2026-05-09
35
+
36
+ v2 retires the Claude marketplace plugin distribution and ships `wbox` as a
37
+ standalone binary plus a PyPI package. Existing v1 users must reinstall via the
38
+ new bootstrap script or `pip install wealthbox-cli` — see Breaking below.
39
+
40
+ ### Breaking
41
+ - **Retired the Claude marketplace plugin distribution.** `wbox` no longer
42
+ ships through the Claude marketplace. Install via `pip install wealthbox-cli`
43
+ or the bootstrap script (`curl -fsSL https://github.com/massive-value/wealthbox-cli/releases/latest/download/install.sh | sh`).
44
+ v1's `claude plugin install` flow is gone.
45
+ - **Rewrote `install.sh` and `install.ps1`** to fetch a prebuilt binary from
46
+ GitHub Releases instead of detecting and preferring the Claude marketplace
47
+ plugin (#42, #43). The installers now verify a checksum manifest before
48
+ swapping the binary into place.
49
+ - **Removed v1 distribution artifacts** — the in-repo plugin manifest and
50
+ marketplace metadata are deleted (#27).
51
+ - **Dropped plugin-cache scanning** from the skill platform helpers; `wbox
52
+ doctor` and `wbox skills list` no longer probe Claude's plugin cache (#28).
53
+
54
+ ### Added
55
+ - `wbox firm export` — end-to-end export of the configured firm's CRM data to
56
+ a portable JSON snapshot (#31).
57
+ - `wbox firm import` with `--mode overwrite|merge|abort-on-conflict` and
58
+ `--from-url` for fetching a snapshot directly from a URL (#36, #46, #45).
59
+ - `wbox firm diff` — diff a local snapshot against the live firm to preview
60
+ what an import would change (#47).
61
+ - Post-import provenance metadata and a 90-day freshness warning surfaced by
62
+ `wbox doctor` (#48).
63
+ - `wbox doctor` promoted to a top-level command, with a warning when the local
64
+ install is more than 30 days behind the latest GitHub release (#41).
65
+ - `wbox self upgrade` — happy-path binary self-update (#32), Windows
66
+ deferred-swap support (#67), and a subprocess hand-off so a fresh `wbox`
67
+ upgrades bundled skills after the binary swap (#40).
68
+ - `wbox prefs` — user-preferences slot for per-user defaults (#29).
69
+ - Per-platform PyInstaller build + release workflow that publishes Linux,
70
+ macOS, and Windows binaries plus a checksum manifest to GitHub Releases (#33).
71
+ - Skill-reference auto-generation markers across the bundled skill (#30, #85)
72
+ and a CI drift-detection job that fails when generated skill blocks fall out
73
+ of sync (#86).
74
+ - Bootstrap Q&A skips the onboarding prompts when an imported firm snapshot
75
+ already carries an `onboarded_at` timestamp (#49).
76
+ - `wbox firm apply` and `wbox doctor` now sweep stale `.old.<ts>` backup files
77
+ left behind by interrupted upgrades (#39).
78
+
79
+ ### Changed
80
+ - Rewrote the README around the v2 install flow — bootstrap script first, PyPI
81
+ second, no marketplace path (#83).
82
+ - Documented the three-layer config resolution (flag > env > config file) and
83
+ the new `prefs` commands inside the bundled skill (#34).
84
+
85
+ ### Fixed
86
+ - `wbox self upgrade` now reads the checksum manifest under its release-asset
87
+ filename, fixing the post-#33 break (#82).
88
+ - Pytest no longer clobbers the developer's real `~/.wbox_rate_limit.json`;
89
+ the rate-limit state file is isolated per test session (#56).
90
+
91
+ ## [1.3.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.3.0) - 2026-05-03
10
92
 
11
93
  ### Added
12
94
 
@@ -20,9 +102,7 @@ This project uses [Semantic Versioning](https://semver.org/).
20
102
  - Bootstrap `install.sh` no longer hangs at startup. The previous version did `exec </dev/tty` at the top, which cut off bash's source of piped script content (`curl … | bash`) and waited forever for the rest of the script to arrive on the user's keyboard. The whole body is now wrapped in a `main()` function so bash reads it fully before executing.
21
103
  - Bootstrap `install.ps1` no longer auto-closes its window on error. Wrapped in try/catch/finally with explicit step headers and a "Press Enter to close" pause so a transient PowerShell host stays open long enough to show the actual error.
22
104
 
23
- ---
24
-
25
- ## [1.2.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.2.0) — 2026-05-02
105
+ ## [1.2.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.2.0) - 2026-05-02
26
106
 
27
107
  ### Changed
28
108
 
@@ -45,9 +125,7 @@ This project uses [Semantic Versioning](https://semver.org/).
45
125
 
46
126
  - `--platform` flag on `bootstrap`, `refresh`, and `mark-onboarded` is accepted but ignored, with a warning. Firm operations are no longer scoped per platform.
47
127
 
48
- ---
49
-
50
- ## [1.1.6](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.1.6) — 2026-05-01
128
+ ## [1.1.6](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.1.6) - 2026-05-01
51
129
 
52
130
  ### Fixed
53
131
  - `wbox skills bootstrap` and `wbox skills refresh` now paginate every API call. Previously they fetched a single page (default `per_page=25`) for each category type, custom-field document type, and the user list, silently truncating any workspace with more than 25 entries per group. Generated `firm/categories.md`, `firm/custom-fields.md`, and `firm/users.md` are now complete.
@@ -58,9 +136,7 @@ This project uses [Semantic Versioning](https://semver.org/).
58
136
  - `wbox skills mark-onboarded` — stamps `firm.onboarded_at` in the skill's `_meta.json`. The agent invokes this as the last step of `bootstrap.md`; users typically don't need to run it manually.
59
137
  - `wbox skills list` and `wbox skills doctor` now report onboarded status (`bootstrapped (qualitative pending)` vs `onboarded`).
60
138
 
61
- ---
62
-
63
- ## [1.1.5](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.1.5) — 2026-05-01
139
+ ## [1.1.5](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.1.5) - 2026-05-01
64
140
 
65
141
  ### Fixed
66
142
  - `wbox skills install`, `wbox skills bootstrap`, and `wbox skills refresh` now honor every token source the rest of the CLI does. Previously these commands only looked at the `--token` flag and `WEALTHBOX_TOKEN` env var, ignoring tokens stored via `wbox config set-token` and `.env` files. Users running `wbox skills install` after `wbox config set-token` saw "Wealthbox token required" errors despite having a token set.
@@ -69,9 +145,7 @@ This project uses [Semantic Versioning](https://semver.org/).
69
145
  ### Added
70
146
  - `wbox skills install` accepts `--token` (matching `bootstrap`, `refresh`, and `doctor`), so a token can be supplied inline for the post-install bootstrap step.
71
147
 
72
- ---
73
-
74
- ## [1.1.4](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.1.4) — 2026-05-01
148
+ ## [1.1.4](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.1.4) - 2026-05-01
75
149
 
76
150
  ### Added
77
151
  - Workspace-level aliases for every resource-scoped category lookup. `wbox categories contact-types`, `wbox categories contact-roles`, `wbox categories event-categories`, `wbox categories task-categories`, and the rest now work alongside their existing `wbox <resource> categories` forms. Both routes call the same API endpoint.
@@ -79,25 +153,19 @@ This project uses [Semantic Versioning](https://semver.org/).
79
153
  ### Docs
80
154
  - Skill references (`lookups.md`, `contacts.md`) and `docs/cli-reference.md` updated to surface the workspace-level form as the primary listing.
81
155
 
82
- ---
83
-
84
- ## [1.0.2](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.0.2) — 2026-03-30
156
+ ## [1.0.2](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.0.2) - 2026-03-30
85
157
 
86
158
  ### Changed
87
159
  - Redesigned comment handling — comments are now embedded in `get` commands
88
160
  - Added ID shorthand for resource lookups
89
161
 
90
- ---
91
-
92
- ## [1.0.1](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.0.1) — 2026-03-30
162
+ ## [1.0.1](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.0.1) - 2026-03-30
93
163
 
94
164
  ### Changed
95
165
  - Updated README with API token instructions and config commands
96
166
  - Added deploy workflow documentation
97
167
 
98
- ---
99
-
100
- ## [1.0.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.0.0) — 2026-03-29
168
+ ## [1.0.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.0.0) - 2026-03-29
101
169
 
102
170
  ### Added
103
171
  - Full CRUD for contacts (person, household, organization, trust), tasks, events, and notes
@@ -115,76 +183,56 @@ This project uses [Semantic Versioning](https://semver.org/).
115
183
  - GitHub Actions CI (lint + test across Python 3.11, 3.12, 3.13)
116
184
  - PyPI publishing via trusted publishers (OIDC)
117
185
 
118
- ---
119
-
120
186
  ## [0.8.5](https://github.com/massive-value/wealthbox-cli/releases/tag/v0.8.5)
121
187
 
122
188
  ### Changed
123
189
  - Standardized CLI help text across all commands
124
190
 
125
- ---
126
-
127
191
  ## [0.8.4](https://github.com/massive-value/wealthbox-cli/releases/tag/v0.8.4)
128
192
 
129
193
  ### Added
130
194
  - PyPI badges and install instructions
131
195
 
132
- ---
133
-
134
196
  ## [0.8.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v0.8.0)
135
197
 
136
198
  ### Added
137
199
  - Events CRUD support
138
200
  - Notes CRUD support (create, read, update — delete not supported by API)
139
201
 
140
- ---
141
-
142
202
  ## [0.7.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v0.7.0)
143
203
 
144
204
  ### Added
145
205
  - Tasks CRUD support
146
206
  - Task categories
147
207
 
148
- ---
149
-
150
208
  ## [0.6.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v0.6.0)
151
209
 
152
210
  ### Added
153
211
  - Household member management commands
154
212
 
155
- ---
156
-
157
213
  ## [0.5.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v0.5.0)
158
214
 
159
215
  ### Added
160
216
  - Contact CRUD operations
161
217
  - Contact categories and metadata lookups
162
218
 
163
- ---
164
-
165
219
  ## [0.4.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v0.4.0)
166
220
 
167
221
  ### Added
168
222
  - Output format support (`--format json|table|csv|tsv`)
169
223
 
170
- ---
171
-
172
224
  ## [0.3.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v0.3.0)
173
225
 
174
226
  ### Added
175
227
  - User listing and `me` command
176
228
  - Activity feed with cursor-based pagination
177
229
 
178
- ---
179
-
180
230
  ## [0.2.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v0.2.0)
181
231
 
182
232
  ### Added
183
233
  - Rate limiting (sliding-window, 300 req / 5-min)
184
234
  - Token configuration (`--token`, env var, `.env`)
185
235
 
186
- ---
187
-
188
236
  ## [0.1.0](https://github.com/massive-value/wealthbox-cli/releases/tag/v0.1.0)
189
237
 
190
238
  ### Added
@@ -6,38 +6,46 @@ Thank you for your interest in contributing to **wealthbox-cli**!
6
6
 
7
7
  ## Development Setup
8
8
 
9
+ This project uses [uv](https://docs.astral.sh/uv/) for dependency management. Install it first if you don't have it:
10
+
9
11
  ```bash
10
- git clone https://github.com/massive-value/wealthbox-cli
11
- cd wealthbox-cli
12
- python -m venv .venv
12
+ # macOS / Linux
13
+ curl -LsSf https://astral.sh/uv/install.sh | sh
14
+
15
+ # Windows (PowerShell)
16
+ irm https://astral.sh/uv/install.ps1 | iex
13
17
  ```
14
18
 
15
- Activate the virtual environment:
19
+ Then clone and sync:
16
20
 
17
- | Platform | Command |
18
- |----------|---------|
19
- | macOS/Linux | `source .venv/bin/activate` |
20
- | Windows (PowerShell) | `.venv\Scripts\Activate.ps1` |
21
- | Windows (Command Prompt) | `.venv\Scripts\activate.bat` |
21
+ ```bash
22
+ git clone https://github.com/massive-value/wealthbox-cli
23
+ cd wealthbox-cli
24
+ uv sync --extra dev
25
+ ```
22
26
 
23
- Then install with dev dependencies:
27
+ `uv sync` creates a project-local `.venv/` and installs the package in editable mode with dev dependencies. There is nothing to "activate" — prefix commands with `uv run`:
24
28
 
25
29
  ```bash
26
- pip install -e ".[dev]"
30
+ uv run wbox --version
31
+ uv run pytest
32
+ uv run ruff check src/ tests/
27
33
  ```
28
34
 
29
35
  Configure your Wealthbox API token (optional — tests don't require a real token):
30
36
 
31
37
  ```bash
32
- wbox config set-token
38
+ uv run wbox config set-token
33
39
  ```
34
40
 
41
+ > Prefer plain `pip`? `pip install -e ".[dev]"` still works — `pyproject.toml` is the source of truth for both tools.
42
+
35
43
  ---
36
44
 
37
45
  ## Running Tests
38
46
 
39
47
  ```bash
40
- pytest
48
+ uv run pytest
41
49
  ```
42
50
 
43
51
  Tests use [respx](https://lundberg.github.io/respx/) to mock HTTP at the transport layer — no real API calls are made.
@@ -45,7 +53,7 @@ Tests use [respx](https://lundberg.github.io/respx/) to mock HTTP at the transpo
45
53
  ## Code Style
46
54
 
47
55
  ```bash
48
- ruff check src/ tests/
56
+ uv run ruff check src/ tests/
49
57
  ```
50
58
 
51
59
  - **ruff** for linting (E, F, I rules; 120-char line length)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wealthbox-cli
3
- Version: 1.5.1
3
+ Version: 2.1.0
4
4
  Summary: CLI and client library for the Wealthbox CRM API
5
5
  Project-URL: Homepage, https://github.com/massive-value/wealthbox-cli
6
6
  Project-URL: Documentation, https://massive-value.github.io/wealthbox-cli/
@@ -28,7 +28,6 @@ Classifier: Typing :: Typed
28
28
  Requires-Python: >=3.11
29
29
  Requires-Dist: httpx<1.0,>=0.27
30
30
  Requires-Dist: pydantic<3.0,>=2.0
31
- Requires-Dist: python-dotenv<2.0,>=1.0
32
31
  Requires-Dist: tabulate<1.0,>=0.9
33
32
  Requires-Dist: typer<1.0,>=0.12
34
33
  Provides-Extra: dev
@@ -57,9 +56,9 @@ Description-Content-Type: text/markdown
57
56
  | **Windows** (PowerShell) | `irm https://raw.githubusercontent.com/massive-value/wealthbox-cli/main/scripts/install.ps1 \| iex` |
58
57
 
59
58
  The installer:
60
- 1. Sets up the tools it needs (Python, etc. — handled automatically).
61
- 2. Asks for your **Wealthbox API token**. *Where to find it:* in Wealthbox, click your initials in the top right → **Settings** → **API Access** → **Create Access Token**. Paste the token when prompted.
62
- 3. Installs the AI agent skill into [Claude Code](https://claude.ai/download) (and Codex, if you have it).
59
+ 1. Downloads the prebuilt `wbox` binary from the latest GitHub Release and verifies its SHA-256 checksum (no Python required).
60
+ 2. Installs the AI agent skill into [Claude Code](https://claude.ai/download) (and Codex, if you have it).
61
+ 3. Asks for your **Wealthbox API token**. *Where to find it:* in Wealthbox, click your initials in the top right → **Settings** → **API Access** → **Create Access Token**. Paste the token when prompted.
63
62
 
64
63
  That's it. Open Claude Code and try one of the prompts below.
65
64
 
@@ -104,16 +103,9 @@ You stay in control: the agent shows you what it's about to do before it does it
104
103
 
105
104
  ------------------------------------------------------------------------
106
105
 
107
- ## Already a Claude Code user?
106
+ ## What gets installed, where
108
107
 
109
- You can install the skill directly from the plugin marketplace inside Claude Code:
110
-
111
- ```
112
- /plugin marketplace add massive-value/wealthbox-cli
113
- /plugin install wealthbox-crm@massive-value
114
- ```
115
-
116
- The plugin auto-updates daily. Firm data lives at `~/.config/wbox/firm/` (Mac/Linux) or `%APPDATA%\wbox\firm\` (Windows) and survives plugin updates. Run `wbox doctor` to see your install status anytime.
108
+ The installer drops a single prebuilt `wbox` binary onto your PATH (`~/.local/bin/wbox` on Mac/Linux, `%LOCALAPPDATA%\Programs\wbox\wbox.exe` on Windows), then registers the AI agent skill with Claude Code (and Codex, if it's installed). Firm data lives at `~/.config/wbox/firm/` (Mac/Linux) or `%APPDATA%\wbox\firm\` (Windows) and survives reinstalls and upgrades. Run `wbox doctor` to see your install status anytime, and `wbox skills upgrade` to pull the latest skill template.
117
109
 
118
110
  ------------------------------------------------------------------------
119
111
 
@@ -155,7 +147,7 @@ wbox skills uninstall # remove the skill template (firm data is preserved)
155
147
  wbox doctor # comprehensive health check
156
148
  ```
157
149
 
158
- The marketplace plugin path (above) is recommended for Claude Code. The legacy `wbox skills install` path remains for Codex users (until OpenAI's marketplace lands), project-scoped installs, or air-gapped setups without the `claude` CLI.
150
+ The one-line installer (top of this README) wires up Claude Code automatically. These commands are for the cases the installer doesn't cover: re-running on a different host, swapping platforms, project-scoped installs, or air-gapped setups where you've placed the `wbox` binary by hand.
159
151
  </details>
160
152
 
161
153
  <details>