wealthbox-cli 1.1.2__tar.gz → 1.1.4__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 (86) hide show
  1. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/PKG-INFO +1 -1
  2. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/docs/changelog.md +10 -0
  3. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/docs/cli-reference.md +12 -1
  4. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/pyproject.toml +1 -1
  5. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/_skill_bootstrap.py +14 -0
  6. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/categories.py +21 -0
  7. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/skills.py +18 -5
  8. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/references/contacts.md +2 -0
  9. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/references/lookups.md +14 -9
  10. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/.env.example +0 -0
  11. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/.github/workflows/ci.yml +0 -0
  12. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/.github/workflows/docs.yml +0 -0
  13. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/.gitignore +0 -0
  14. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/CONTRIBUTING.md +0 -0
  15. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/LICENSE +0 -0
  16. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/README.md +0 -0
  17. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/SECURITY.md +0 -0
  18. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/docs/getting-started.md +0 -0
  19. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/docs/index.md +0 -0
  20. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/docs/overrides/main.html +0 -0
  21. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/docs/promotion.md +0 -0
  22. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/mkdocs.yml +0 -0
  23. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/__init__.py +0 -0
  24. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/__init__.py +0 -0
  25. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/_config.py +0 -0
  26. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/_skill_platforms.py +0 -0
  27. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/_util.py +0 -0
  28. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/activity.py +0 -0
  29. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/config.py +0 -0
  30. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/contacts.py +0 -0
  31. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/events.py +0 -0
  32. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/households.py +0 -0
  33. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/main.py +0 -0
  34. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/me.py +0 -0
  35. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/notes.py +0 -0
  36. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/opportunities.py +0 -0
  37. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/projects.py +0 -0
  38. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/tasks.py +0 -0
  39. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/users.py +0 -0
  40. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/cli/workflows.py +0 -0
  41. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/__init__.py +0 -0
  42. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/activity.py +0 -0
  43. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/base.py +0 -0
  44. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/categories.py +0 -0
  45. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/comments.py +0 -0
  46. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/contacts.py +0 -0
  47. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/events.py +0 -0
  48. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/households.py +0 -0
  49. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/me.py +0 -0
  50. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/notes.py +0 -0
  51. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/opportunities.py +0 -0
  52. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/projects.py +0 -0
  53. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/tasks.py +0 -0
  54. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/users.py +0 -0
  55. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/client/workflows.py +0 -0
  56. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/__init__.py +0 -0
  57. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/activity.py +0 -0
  58. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/comments.py +0 -0
  59. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/common.py +0 -0
  60. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/contacts.py +0 -0
  61. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/custom_fields.py +0 -0
  62. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/enums.py +0 -0
  63. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/events.py +0 -0
  64. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/households.py +0 -0
  65. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/notes.py +0 -0
  66. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/opportunities.py +0 -0
  67. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/projects.py +0 -0
  68. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/tasks.py +0 -0
  69. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/models/workflows.py +0 -0
  70. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/py.typed +0 -0
  71. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/SKILL.md +0 -0
  72. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/bootstrap.md +0 -0
  73. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/contacts.md +0 -0
  74. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/events.md +0 -0
  75. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/notes.md +0 -0
  76. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/opportunities.md +0 -0
  77. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/projects.md +0 -0
  78. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/tasks.md +0 -0
  79. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/workflows.md +0 -0
  80. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/references/events.md +0 -0
  81. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/references/households.md +0 -0
  82. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/references/notes.md +0 -0
  83. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/references/opportunities.md +0 -0
  84. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/references/projects.md +0 -0
  85. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/references/tasks.md +0 -0
  86. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.4}/src/wealthbox_tools/skills/wealthbox-crm/references/workflows.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wealthbox-cli
3
- Version: 1.1.2
3
+ Version: 1.1.4
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/
@@ -6,6 +6,16 @@ This project uses [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ---
8
8
 
9
+ ## [1.1.4](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.1.4) — 2026-05-01
10
+
11
+ ### Added
12
+ - 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.
13
+
14
+ ### Docs
15
+ - Skill references (`lookups.md`, `contacts.md`) and `docs/cli-reference.md` updated to surface the workspace-level form as the primary listing.
16
+
17
+ ---
18
+
9
19
  ## [1.0.2](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.0.2) — 2026-03-30
10
20
 
11
21
  ### Changed
@@ -343,7 +343,18 @@ wbox categories opportunity-stages
343
343
  wbox categories opportunity-pipelines
344
344
  wbox categories investment-objectives
345
345
  wbox categories financial-account-types
346
- ```
346
+ wbox categories contact-types
347
+ wbox categories contact-sources
348
+ wbox categories email-types
349
+ wbox categories phone-types
350
+ wbox categories address-types
351
+ wbox categories website-types
352
+ wbox categories contact-roles
353
+ wbox categories event-categories
354
+ wbox categories task-categories
355
+ ```
356
+
357
+ The contact category types (contact-types, contact-sources, email-types, phone-types, address-types, website-types, contact-roles) are also reachable under `wbox contacts categories <name>`. `wbox events categories` and `wbox tasks categories` are aliases for `wbox categories event-categories` and `wbox categories task-categories`. Both forms call the same API endpoint.
347
358
 
348
359
  ### Custom Fields
349
360
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "wealthbox-cli"
7
- version = "1.1.2"
7
+ version = "1.1.4"
8
8
  description = "CLI and client library for the Wealthbox CRM API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -187,6 +187,20 @@ def update_firm_meta(
187
187
  write_meta(skill_dir, meta)
188
188
 
189
189
 
190
+ def copy_firm_meta(src_skill_dir: Path, dst_skill_dir: Path) -> bool:
191
+ """Copy the firm section of _meta.json from src to dst, preserving dst's template.
192
+
193
+ Returns True if a firm section was copied, False if src had none.
194
+ """
195
+ src_firm = read_meta(src_skill_dir).get("firm")
196
+ if not src_firm:
197
+ return False
198
+ dst_meta = read_meta(dst_skill_dir)
199
+ dst_meta["firm"] = src_firm
200
+ write_meta(dst_skill_dir, dst_meta)
201
+ return True
202
+
203
+
190
204
  # --------------------------------------------------------------------------- #
191
205
  # Orchestrator #
192
206
  # --------------------------------------------------------------------------- #
@@ -26,6 +26,27 @@ app.command("investment-objectives", help="List investment objective options.")(
26
26
  app.command("financial-account-types", help="List financial account type options.")(
27
27
  make_category_command(CategoryType.FINANCIAL_ACCOUNT_TYPES)
28
28
  )
29
+ app.command("contact-types", help="List contact type options.")(make_category_command(CategoryType.CONTACT_TYPES))
30
+ app.command("contact-sources", help="List contact source options.")(
31
+ make_category_command(CategoryType.CONTACT_SOURCES)
32
+ )
33
+ app.command("email-types", help="List email type options.")(make_category_command(CategoryType.EMAIL_TYPES))
34
+ app.command("phone-types", help="List phone type options.")(make_category_command(CategoryType.PHONE_TYPES))
35
+ app.command("address-types", help="List address type options.")(
36
+ make_category_command(CategoryType.ADDRESS_TYPES)
37
+ )
38
+ app.command("website-types", help="List website type options.")(
39
+ make_category_command(CategoryType.WEBSITE_TYPES)
40
+ )
41
+ app.command("contact-roles", help="List contact role options.")(
42
+ make_category_command(CategoryType.CONTACT_ROLES)
43
+ )
44
+ app.command("event-categories", help="List event category options.")(
45
+ make_category_command(CategoryType.EVENT_CATEGORIES)
46
+ )
47
+ app.command("task-categories", help="List task category options.")(
48
+ make_category_command(CategoryType.TASK_CATEGORIES)
49
+ )
29
50
 
30
51
 
31
52
  @app.command("custom-fields", help="List custom field categories. Optionally filter by document type.")
@@ -8,7 +8,7 @@ from pathlib import Path
8
8
 
9
9
  import typer
10
10
 
11
- from ._skill_bootstrap import read_meta, update_template_meta
11
+ from ._skill_bootstrap import copy_firm_meta, read_meta, update_template_meta
12
12
  from ._skill_platforms import (
13
13
  Platform,
14
14
  SkillInstallError,
@@ -376,7 +376,12 @@ def sync_cmd(
376
376
  )
377
377
  raise typer.Exit(code=2)
378
378
 
379
- others = [p for p in installed if p.id != source.id]
379
+ src_resolved = skill_dir(source).resolve()
380
+
381
+ def _is_same_path(p: Platform) -> bool:
382
+ return skill_dir(p).resolve() == src_resolved
383
+
384
+ others = [p for p in installed if p.id != source.id and not _is_same_path(p)]
380
385
 
381
386
  if all_targets and target_ids:
382
387
  typer.echo("Error: --all-targets and --target are mutually exclusive.", err=True)
@@ -387,8 +392,12 @@ def sync_cmd(
387
392
  elif target_ids:
388
393
  targets = _resolve_platforms(target_ids)
389
394
  for t in targets:
390
- if t.id == source.id:
391
- typer.echo(f"Error: target {t.id!r} is the same as the source.", err=True)
395
+ if t.id == source.id or _is_same_path(t):
396
+ typer.echo(
397
+ f"Error: target {t.id!r} is the same as the source "
398
+ f"(resolves to {src_resolved}).",
399
+ err=True,
400
+ )
392
401
  raise typer.Exit(code=2)
393
402
  if not is_installed(t):
394
403
  typer.echo(f"Error: target {t.id!r} is not installed.", err=True)
@@ -425,7 +434,11 @@ def sync_cmd(
425
434
  tgt_firm = skill_dir(t) / "firm"
426
435
  tgt_firm.mkdir(parents=True, exist_ok=True)
427
436
  shutil.copytree(src_firm, tgt_firm, dirs_exist_ok=True)
428
- typer.echo(f"OK synced {len(src_files)} files: {source.id} -> {t.id}")
437
+ meta_copied = copy_firm_meta(skill_dir(source), skill_dir(t))
438
+ meta_note = "" if meta_copied else " (no _meta.json firm section on source)"
439
+ typer.echo(
440
+ f"OK synced {len(src_files)} files: {source.id} -> {t.id}{meta_note}"
441
+ )
429
442
 
430
443
 
431
444
  @app.command("uninstall", help="Remove the wealthbox-crm skill from a platform.")
@@ -122,6 +122,8 @@ No output on success.
122
122
 
123
123
  ## Contact Categories
124
124
 
125
+ Each of these is also available at the workspace level via `wbox categories <name>` — both forms return the same data.
126
+
125
127
  ```bash
126
128
  wbox contacts categories contact-types
127
129
  wbox contacts categories contact-sources
@@ -36,7 +36,9 @@ wbox activity list [OPTIONS]
36
36
 
37
37
  **Important:** Activity uses cursor-based pagination, NOT `--page`/`--per-page`. Use the cursor value from the previous response for the next page.
38
38
 
39
- ## Workspace-Level Categories
39
+ ## Categories
40
+
41
+ Every category type is available under `wbox categories <name>`. The full set:
40
42
 
41
43
  ```bash
42
44
  wbox categories tags
@@ -45,16 +47,19 @@ wbox categories opportunity-stages
45
47
  wbox categories opportunity-pipelines
46
48
  wbox categories investment-objectives
47
49
  wbox categories financial-account-types
50
+ wbox categories contact-types
51
+ wbox categories contact-sources
52
+ wbox categories email-types
53
+ wbox categories phone-types
54
+ wbox categories address-types
55
+ wbox categories website-types
56
+ wbox categories contact-roles
57
+ wbox categories event-categories
58
+ wbox categories task-categories
48
59
  wbox categories custom-fields [--document-type STR] [--page INT] [--per-page INT] [--format ...]
49
60
  ```
50
61
 
51
- ## Resource-Scoped Categories
52
-
53
- ```bash
54
- wbox contacts categories {contact-types|contact-sources|email-types|phone-types|address-types|website-types|contact-roles}
55
- wbox events categories
56
- wbox tasks categories
57
- ```
62
+ The contact-related types are also reachable as aliases under `wbox contacts categories <name>` (contact-types, contact-sources, email-types, phone-types, address-types, website-types, contact-roles). Likewise, `wbox events categories` and `wbox tasks categories` are aliases for `wbox categories event-categories` and `wbox categories task-categories`. Either form returns the same data.
58
63
 
59
64
  ## Examples
60
65
 
@@ -69,5 +74,5 @@ wbox users list --format table
69
74
  wbox activity list --contact 12345 --format table
70
75
 
71
76
  # Look up valid contact types
72
- wbox contacts categories contact-types
77
+ wbox categories contact-types
73
78
  ```
File without changes
File without changes
File without changes
File without changes
File without changes