wealthbox-cli 1.1.2__tar.gz → 1.1.5__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.5}/PKG-INFO +1 -1
  2. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/docs/changelog.md +21 -0
  3. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/docs/cli-reference.md +12 -1
  4. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/pyproject.toml +1 -1
  5. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/_skill_bootstrap.py +17 -1
  6. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/_util.py +6 -0
  7. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/categories.py +21 -0
  8. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/skills.py +20 -6
  9. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/contacts.md +2 -0
  10. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/lookups.md +14 -9
  11. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/.env.example +0 -0
  12. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/.github/workflows/ci.yml +0 -0
  13. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/.github/workflows/docs.yml +0 -0
  14. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/.gitignore +0 -0
  15. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/CONTRIBUTING.md +0 -0
  16. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/LICENSE +0 -0
  17. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/README.md +0 -0
  18. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/SECURITY.md +0 -0
  19. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/docs/getting-started.md +0 -0
  20. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/docs/index.md +0 -0
  21. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/docs/overrides/main.html +0 -0
  22. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/docs/promotion.md +0 -0
  23. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/mkdocs.yml +0 -0
  24. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/__init__.py +0 -0
  25. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/__init__.py +0 -0
  26. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/_config.py +0 -0
  27. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/_skill_platforms.py +0 -0
  28. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/activity.py +0 -0
  29. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/config.py +0 -0
  30. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/contacts.py +0 -0
  31. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/events.py +0 -0
  32. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/households.py +0 -0
  33. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/main.py +0 -0
  34. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/me.py +0 -0
  35. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/notes.py +0 -0
  36. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/opportunities.py +0 -0
  37. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/projects.py +0 -0
  38. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/tasks.py +0 -0
  39. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/users.py +0 -0
  40. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/workflows.py +0 -0
  41. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/__init__.py +0 -0
  42. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/activity.py +0 -0
  43. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/base.py +0 -0
  44. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/categories.py +0 -0
  45. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/comments.py +0 -0
  46. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/contacts.py +0 -0
  47. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/events.py +0 -0
  48. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/households.py +0 -0
  49. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/me.py +0 -0
  50. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/notes.py +0 -0
  51. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/opportunities.py +0 -0
  52. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/projects.py +0 -0
  53. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/tasks.py +0 -0
  54. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/users.py +0 -0
  55. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/workflows.py +0 -0
  56. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/__init__.py +0 -0
  57. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/activity.py +0 -0
  58. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/comments.py +0 -0
  59. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/common.py +0 -0
  60. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/contacts.py +0 -0
  61. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/custom_fields.py +0 -0
  62. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/enums.py +0 -0
  63. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/events.py +0 -0
  64. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/households.py +0 -0
  65. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/notes.py +0 -0
  66. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/opportunities.py +0 -0
  67. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/projects.py +0 -0
  68. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/tasks.py +0 -0
  69. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/workflows.py +0 -0
  70. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/py.typed +0 -0
  71. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/SKILL.md +0 -0
  72. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/bootstrap.md +0 -0
  73. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/contacts.md +0 -0
  74. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/events.md +0 -0
  75. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/notes.md +0 -0
  76. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/opportunities.md +0 -0
  77. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/projects.md +0 -0
  78. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/tasks.md +0 -0
  79. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/workflows.md +0 -0
  80. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/events.md +0 -0
  81. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/households.md +0 -0
  82. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/notes.md +0 -0
  83. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/opportunities.md +0 -0
  84. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/projects.md +0 -0
  85. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/tasks.md +0 -0
  86. {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/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.5
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,27 @@ This project uses [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ---
8
8
 
9
+ ## [1.1.5](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.1.5) — 2026-05-01
10
+
11
+ ### Fixed
12
+ - `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.
13
+ - The "token required" error message now lists every supported source (flag, env var, config file, `.env`).
14
+
15
+ ### Added
16
+ - `wbox skills install` accepts `--token` (matching `bootstrap`, `refresh`, and `doctor`), so a token can be supplied inline for the post-install bootstrap step.
17
+
18
+ ---
19
+
20
+ ## [1.1.4](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.1.4) — 2026-05-01
21
+
22
+ ### Added
23
+ - 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.
24
+
25
+ ### Docs
26
+ - Skill references (`lookups.md`, `contacts.md`) and `docs/cli-reference.md` updated to surface the workspace-level form as the primary listing.
27
+
28
+ ---
29
+
9
30
  ## [1.0.2](https://github.com/massive-value/wealthbox-cli/releases/tag/v1.0.2) — 2026-03-30
10
31
 
11
32
  ### 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.5"
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
  # --------------------------------------------------------------------------- #
@@ -198,6 +212,8 @@ from importlib.metadata import version as _pkg_version # noqa: E402
198
212
  from wealthbox_tools.client import WealthboxClient # noqa: E402
199
213
  from wealthbox_tools.models import CategoryListQuery, CategoryType, DocumentType # noqa: E402
200
214
 
215
+ from ._util import get_client # noqa: E402
216
+
201
217
 
202
218
  @dataclass
203
219
  class BootstrapResult:
@@ -250,7 +266,7 @@ def bootstrap_skill_dir(
250
266
  firm_dir.mkdir(parents=True, exist_ok=True)
251
267
 
252
268
  async def _run() -> tuple[dict, dict, list, dict]:
253
- async with WealthboxClient(token=token) as client:
269
+ async with get_client(token) as client:
254
270
  return await _fetch_all(client)
255
271
 
256
272
  categories, custom_fields, users, firm_identity = asyncio.run(_run())
@@ -62,6 +62,12 @@ def get_client(token: str | None = None) -> WealthboxClient:
62
62
  token = os.environ.get("WEALTHBOX_TOKEN")
63
63
  except ImportError:
64
64
  pass
65
+ if not token:
66
+ raise ValueError(
67
+ "Wealthbox token required. Provide one via any of: "
68
+ "--token flag, WEALTHBOX_TOKEN env var, "
69
+ "`wbox config set-token`, or a .env file in the working directory."
70
+ )
65
71
  return WealthboxClient(token=token)
66
72
 
67
73
 
@@ -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,
@@ -98,6 +98,7 @@ def install_cmd(
98
98
  ),
99
99
  force: bool = typer.Option(False, "--force", help="Overwrite existing install."),
100
100
  no_bootstrap: bool = typer.Option(False, "--no-bootstrap", help="Skip the post-install bootstrap prompt."),
101
+ token: str | None = typer.Option(None, envvar="WEALTHBOX_TOKEN", hidden=True),
101
102
  ) -> None:
102
103
  targets = _resolve_platforms(platforms_flag) if platforms_flag else _prompt_platforms()
103
104
 
@@ -122,7 +123,7 @@ def install_cmd(
122
123
  if typer.confirm("Run 'wbox skills bootstrap' now?", default=True):
123
124
  from ._skill_bootstrap import bootstrap_skill_dir
124
125
  for target in targets:
125
- bootstrap_skill_dir(skill_dir(target), token=None, generated_only=False)
126
+ bootstrap_skill_dir(skill_dir(target), token=token, generated_only=False)
126
127
  typer.echo(f"OK bootstrapped {target.id}")
127
128
 
128
129
 
@@ -376,7 +377,12 @@ def sync_cmd(
376
377
  )
377
378
  raise typer.Exit(code=2)
378
379
 
379
- others = [p for p in installed if p.id != source.id]
380
+ src_resolved = skill_dir(source).resolve()
381
+
382
+ def _is_same_path(p: Platform) -> bool:
383
+ return skill_dir(p).resolve() == src_resolved
384
+
385
+ others = [p for p in installed if p.id != source.id and not _is_same_path(p)]
380
386
 
381
387
  if all_targets and target_ids:
382
388
  typer.echo("Error: --all-targets and --target are mutually exclusive.", err=True)
@@ -387,8 +393,12 @@ def sync_cmd(
387
393
  elif target_ids:
388
394
  targets = _resolve_platforms(target_ids)
389
395
  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)
396
+ if t.id == source.id or _is_same_path(t):
397
+ typer.echo(
398
+ f"Error: target {t.id!r} is the same as the source "
399
+ f"(resolves to {src_resolved}).",
400
+ err=True,
401
+ )
392
402
  raise typer.Exit(code=2)
393
403
  if not is_installed(t):
394
404
  typer.echo(f"Error: target {t.id!r} is not installed.", err=True)
@@ -425,7 +435,11 @@ def sync_cmd(
425
435
  tgt_firm = skill_dir(t) / "firm"
426
436
  tgt_firm.mkdir(parents=True, exist_ok=True)
427
437
  shutil.copytree(src_firm, tgt_firm, dirs_exist_ok=True)
428
- typer.echo(f"OK synced {len(src_files)} files: {source.id} -> {t.id}")
438
+ meta_copied = copy_firm_meta(skill_dir(source), skill_dir(t))
439
+ meta_note = "" if meta_copied else " (no _meta.json firm section on source)"
440
+ typer.echo(
441
+ f"OK synced {len(src_files)} files: {source.id} -> {t.id}{meta_note}"
442
+ )
429
443
 
430
444
 
431
445
  @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