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.
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/PKG-INFO +1 -1
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/docs/changelog.md +21 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/docs/cli-reference.md +12 -1
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/pyproject.toml +1 -1
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/_skill_bootstrap.py +17 -1
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/_util.py +6 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/categories.py +21 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/skills.py +20 -6
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/contacts.md +2 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/lookups.md +14 -9
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/.env.example +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/.github/workflows/ci.yml +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/.github/workflows/docs.yml +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/.gitignore +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/CONTRIBUTING.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/LICENSE +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/README.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/SECURITY.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/docs/getting-started.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/docs/index.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/docs/overrides/main.html +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/docs/promotion.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/mkdocs.yml +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/__init__.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/__init__.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/_config.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/_skill_platforms.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/activity.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/config.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/contacts.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/events.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/households.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/main.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/me.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/notes.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/opportunities.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/projects.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/tasks.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/users.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/cli/workflows.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/__init__.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/activity.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/base.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/categories.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/comments.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/contacts.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/events.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/households.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/me.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/notes.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/opportunities.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/projects.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/tasks.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/users.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/client/workflows.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/__init__.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/activity.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/comments.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/common.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/contacts.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/custom_fields.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/enums.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/events.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/households.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/notes.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/opportunities.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/projects.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/tasks.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/models/workflows.py +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/py.typed +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/SKILL.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/bootstrap.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/contacts.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/events.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/notes.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/opportunities.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/projects.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/tasks.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/firm-examples/workflows.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/events.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/households.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/notes.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/opportunities.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/projects.md +0 -0
- {wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/references/tasks.md +0 -0
- {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.
|
|
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
|
|
|
@@ -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
|
|
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=
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
|
77
|
+
wbox categories contact-types
|
|
73
78
|
```
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/SKILL.md
RENAMED
|
File without changes
|
{wealthbox_cli-1.1.2 → wealthbox_cli-1.1.5}/src/wealthbox_tools/skills/wealthbox-crm/bootstrap.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|