wealthbox-cli 2.4.0__tar.gz → 2.4.1__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 (108) hide show
  1. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/.github/workflows/ci.yml +22 -1
  2. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/CHANGELOG.md +22 -0
  3. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/CONTRIBUTING.md +2 -1
  4. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/PKG-INFO +1 -1
  5. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/pyproject.toml +1 -1
  6. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/_factory.py +7 -2
  7. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/uv.lock +1 -1
  8. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/.github/dependabot.yml +0 -0
  9. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/.github/workflows/docs.yml +0 -0
  10. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/.github/workflows/release-binaries.yml +0 -0
  11. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/.gitignore +0 -0
  12. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/.pre-commit-config.yaml +0 -0
  13. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/LICENSE +0 -0
  14. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/README.md +0 -0
  15. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/SECURITY.md +0 -0
  16. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/docs/agents/domain.md +0 -0
  17. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/docs/agents/issue-tracker.md +0 -0
  18. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/docs/agents/triage-labels.md +0 -0
  19. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/docs/cli-reference.md +0 -0
  20. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/docs/getting-started.md +0 -0
  21. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/docs/index.md +0 -0
  22. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/docs/overrides/main.html +0 -0
  23. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/docs/promotion.md +0 -0
  24. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/mkdocs.yml +0 -0
  25. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/__init__.py +0 -0
  26. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/__init__.py +0 -0
  27. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/_client.py +0 -0
  28. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/_config.py +0 -0
  29. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/_format.py +0 -0
  30. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/_resolve.py +0 -0
  31. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/_skill_bootstrap.py +0 -0
  32. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/_skill_paths.py +0 -0
  33. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/_skill_platforms.py +0 -0
  34. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/_util.py +0 -0
  35. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/activity.py +0 -0
  36. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/categories.py +0 -0
  37. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/config.py +0 -0
  38. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/contacts.py +0 -0
  39. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/doctor.py +0 -0
  40. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/events.py +0 -0
  41. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/firm.py +0 -0
  42. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/households.py +0 -0
  43. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/internals.py +0 -0
  44. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/main.py +0 -0
  45. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/me.py +0 -0
  46. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/notes.py +0 -0
  47. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/opportunities.py +0 -0
  48. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/prefs.py +0 -0
  49. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/projects.py +0 -0
  50. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/self_cmd.py +0 -0
  51. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/skills.py +0 -0
  52. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/tasks.py +0 -0
  53. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/users.py +0 -0
  54. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/cli/workflows.py +0 -0
  55. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/__init__.py +0 -0
  56. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/activity.py +0 -0
  57. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/base.py +0 -0
  58. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/categories.py +0 -0
  59. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/comments.py +0 -0
  60. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/contacts.py +0 -0
  61. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/events.py +0 -0
  62. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/households.py +0 -0
  63. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/me.py +0 -0
  64. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/notes.py +0 -0
  65. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/opportunities.py +0 -0
  66. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/projects.py +0 -0
  67. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/tasks.py +0 -0
  68. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/users.py +0 -0
  69. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/client/workflows.py +0 -0
  70. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/firm/__init__.py +0 -0
  71. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/firm/archive.py +0 -0
  72. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/firm/diff.py +0 -0
  73. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/internals/__init__.py +0 -0
  74. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/internals/skill_ref_gen.py +0 -0
  75. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/__init__.py +0 -0
  76. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/activity.py +0 -0
  77. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/comments.py +0 -0
  78. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/common.py +0 -0
  79. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/contacts.py +0 -0
  80. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/custom_fields.py +0 -0
  81. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/enums.py +0 -0
  82. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/events.py +0 -0
  83. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/households.py +0 -0
  84. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/notes.py +0 -0
  85. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/opportunities.py +0 -0
  86. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/projects.py +0 -0
  87. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/tasks.py +0 -0
  88. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/models/workflows.py +0 -0
  89. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/py.typed +0 -0
  90. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/self_upgrade.py +0 -0
  91. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/SKILL.md +0 -0
  92. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/bootstrap.md +0 -0
  93. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/contacts.md +0 -0
  94. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/events.md +0 -0
  95. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/notes.md +0 -0
  96. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/opportunities.md +0 -0
  97. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/projects.md +0 -0
  98. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/tasks.md +0 -0
  99. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/workflows.md +0 -0
  100. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/references/contacts.md +0 -0
  101. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/references/events.md +0 -0
  102. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/references/households.md +0 -0
  103. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/references/lookups.md +0 -0
  104. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/references/notes.md +0 -0
  105. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/references/opportunities.md +0 -0
  106. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/references/projects.md +0 -0
  107. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/references/tasks.md +0 -0
  108. {wealthbox_cli-2.4.0 → wealthbox_cli-2.4.1}/src/wealthbox_tools/skills/wealthbox-crm/references/workflows.md +0 -0
@@ -50,6 +50,27 @@ jobs:
50
50
  - run: uv sync --extra dev
51
51
  - run: uv run mypy src/
52
52
 
53
+ smoke:
54
+ # Install the built wheel in isolation WITHOUT dev dependencies and run the
55
+ # entrypoint, so a missing runtime dependency (e.g. a module-level import of
56
+ # a package typer no longer pulls in) is caught before publish. The normal
57
+ # test job always has dev deps present and cannot catch this.
58
+ runs-on: ${{ matrix.os }}
59
+ strategy:
60
+ matrix:
61
+ os: [ubuntu-latest, windows-latest]
62
+ steps:
63
+ - uses: actions/checkout@v6
64
+ - uses: astral-sh/setup-uv@v8.1.0
65
+ with:
66
+ python-version: "3.12"
67
+ - name: Build and smoke-test clean install
68
+ shell: bash
69
+ run: |
70
+ uv build
71
+ uv run --isolated --no-project --with "$(ls dist/*.whl)" wbox --version
72
+ uv run --isolated --no-project --with "$(ls dist/*.whl)" wbox notes --help
73
+
53
74
  skill-ref-drift:
54
75
  needs: [lint, test]
55
76
  runs-on: ubuntu-latest
@@ -63,7 +84,7 @@ jobs:
63
84
  - run: git diff --exit-code -- src/wealthbox_tools/skills/wealthbox-crm/references/
64
85
 
65
86
  publish:
66
- needs: [lint, test, typecheck, skill-ref-drift]
87
+ needs: [lint, test, typecheck, smoke, skill-ref-drift]
67
88
  if: startsWith(github.ref, 'refs/tags/v')
68
89
  runs-on: ubuntu-latest
69
90
  permissions:
@@ -4,6 +4,28 @@ All notable changes to `wealthbox-cli` are documented here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
5
5
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [2.4.1] - 2026-06-12
8
+
9
+ Patch release fixing a startup crash in 2.4.0. The `cli/_factory.py` module
10
+ (introduced in the 2.4.0 refactor) imported `click` at module level to
11
+ annotate a `TyperGroup` subclass, but `click` is only referenced in type
12
+ annotations. On installs where `typer` (>=0.26) does not pull in `click` as a
13
+ transitive dependency, `wbox` crashed on launch with
14
+ `ModuleNotFoundError: No module named 'click'` — the same failure class fixed
15
+ for `skill_ref_gen` in 2.3.1. This was not caught by CI because the test
16
+ environment always has `click` present via the dev dependencies.
17
+
18
+ ### Fixed
19
+ - `wbox` startup crash (`ModuleNotFoundError: click`) on clean installs that
20
+ lack `click`. The `import click` in `cli/_factory.py` is now guarded by
21
+ `TYPE_CHECKING` (it is only used in annotations, which are not evaluated at
22
+ runtime under `from __future__ import annotations`).
23
+
24
+ ### Internal
25
+ - CI gains a `smoke` job that installs the built wheel in isolation **without
26
+ dev dependencies** and runs `wbox --version`, so a missing-runtime-dependency
27
+ startup crash can no longer reach PyPI. The `publish` job now depends on it.
28
+
7
29
  ## [2.4.0] - 2026-06-12
8
30
 
9
31
  The notable user-facing change in this release is **differentiated CLI exit
@@ -167,9 +167,10 @@ Pull requests and pushes to `main` run GitHub Actions CI:
167
167
  - **Lint:** `ruff check src/ tests/`
168
168
  - **Test:** `pytest` across Python 3.11, 3.12, 3.13 (ubuntu) + 3.12 (windows); coverage gate `--cov-fail-under=91` on ubuntu
169
169
  - **Typecheck:** `mypy src/` (strict)
170
+ - **Smoke:** installs the built wheel in isolation (no dev deps) and runs `wbox --version` / `wbox notes --help`, catching missing-runtime-dependency startup crashes
170
171
  - **Skill-ref drift:** regenerates refs and asserts no git diff
171
172
 
172
- All four jobs must pass before merging.
173
+ All jobs must pass before merging; `publish` (on `v*` tags) additionally gates on lint, test, typecheck, and smoke.
173
174
 
174
175
  ---
175
176
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wealthbox-cli
3
- Version: 2.4.0
3
+ Version: 2.4.1
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/
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "wealthbox-cli"
7
- version = "2.4.0"
7
+ version = "2.4.1"
8
8
  description = "CLI and client library for the Wealthbox CRM API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -3,9 +3,8 @@ from __future__ import annotations
3
3
  import inspect
4
4
  from collections.abc import Callable
5
5
  from dataclasses import dataclass, field
6
- from typing import Any
6
+ from typing import TYPE_CHECKING, Any
7
7
 
8
- import click
9
8
  import typer
10
9
  from typer.core import TyperGroup
11
10
 
@@ -14,6 +13,12 @@ from wealthbox_tools.models import CategoryListQuery, CategoryType
14
13
  from ._client import handle_errors, run_client, run_client_with_comments
15
14
  from ._format import OutputFormat, output_get_result, output_result
16
15
 
16
+ if TYPE_CHECKING:
17
+ # click is only referenced in type annotations below; importing it at
18
+ # runtime would crash on installs where typer (>=0.26) does not pull in
19
+ # click. Keep it type-only. See the 2.3.1 fix for the same class of bug.
20
+ import click
21
+
17
22
 
18
23
  class _GetShortcutGroup(TyperGroup):
19
24
  """Typer Group that routes numeric first arguments to the ``get`` subcommand."""
@@ -783,7 +783,7 @@ wheels = [
783
783
 
784
784
  [[package]]
785
785
  name = "wealthbox-cli"
786
- version = "2.4.0"
786
+ version = "2.4.1"
787
787
  source = { editable = "." }
788
788
  dependencies = [
789
789
  { name = "httpx" },
File without changes
File without changes
File without changes
File without changes
File without changes