healthcloud-cli 3.7.3__tar.gz → 3.7.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.
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/PKG-INFO +31 -13
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/README.md +30 -12
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/auth.py +25 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/departments/commands.py +58 -11
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/departments/operations.py +108 -1
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/policies/commands.py +2 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/skills/commands.py +2 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/teams/commands.py +4 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/pyproject.toml +1 -1
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/.gitignore +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/hatch_build.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/admins/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/admins/commands.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/admins/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/admins/operations.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/agents/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/agents/commands.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/agents/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/agents/operations.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/agents/projections.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/commands.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/compatibility.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/context.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/data_sources/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/data_sources/commands.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/data_sources/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/data_sources/operations.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/data_sources/projections.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/departments/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/departments/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/departments/projections.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/domain_errors.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/errors.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/guardrails/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/guardrails/commands.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/guardrails/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/guardrails/operations.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/guardrails/projections.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/organization/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/organization/commands.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/organization/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/organization/operations.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/organization/projections.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/output.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/policies/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/policies/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/policies/operations.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/policies/projections.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/pretty.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/registry.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/results.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/session.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/sessions/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/sessions/commands.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/sessions/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/sessions/operations.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/sessions/projections.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/skills/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/skills/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/skills/operations.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/skills/projections.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/target.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/teams/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/teams/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/teams/operations.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/teams/projections.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/tools/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/tools/commands.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/tools/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/tools/operations.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/tools/projections.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/tuning.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/ui.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/windows_files.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/cli.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/context.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/contracts/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/contracts/mcp-tools.manifest.json +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/main.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/manifest.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/output.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/params.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/tenants/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/tenants/commands.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/tenants/group.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/tenants/operations.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/util.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/scripts/__init__.py +0 -0
- {healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/scripts/bundle_manifest.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: healthcloud-cli
|
|
3
|
-
Version: 3.7.
|
|
3
|
+
Version: 3.7.5
|
|
4
4
|
Summary: Command-line interface for the HealthCloud MCP gateway, generated from the shared MCP tool manifest.
|
|
5
5
|
Project-URL: Issues, https://github.com/healthcloudservices/healthcloud-services/issues
|
|
6
6
|
Project-URL: Repository, https://github.com/healthcloudservices/healthcloud-services
|
|
@@ -797,25 +797,39 @@ and the result envelope carries the server's authoritative readback of the
|
|
|
797
797
|
department (same bounded projection as reads):
|
|
798
798
|
|
|
799
799
|
```bash
|
|
800
|
-
uv run --frozen hc ams departments create --environment dev --tenant-id TENANT_ID --name "Clinical Operations"
|
|
800
|
+
uv run --frozen hc ams departments create --environment dev --tenant-id TENANT_ID --name "Clinical Operations" [--description TEXT] [--parent-department-id PARENT_ID] [--key KEY] [--required-eval-suite-ids SUITE_ID ...]
|
|
801
801
|
uv run --frozen hc ams departments update --environment dev --tenant-id TENANT_ID --department-id DEPARTMENT_ID [--name NAME] [--description TEXT] [--parent-department-id PARENT_ID] [--key KEY] [--required-eval-suite-ids SUITE_ID ...]
|
|
802
802
|
uv run --frozen hc ams departments set-active --environment dev --tenant-id TENANT_ID --department-id DEPARTMENT_ID
|
|
803
803
|
uv run --frozen hc ams departments deactivate --environment dev --tenant-id TENANT_ID --department-id DEPARTMENT_ID
|
|
804
|
-
uv run --frozen hc ams departments delete --environment dev --tenant-id TENANT_ID --department-id DEPARTMENT_ID
|
|
804
|
+
uv run --frozen hc ams departments delete --environment dev --tenant-id TENANT_ID --department-id DEPARTMENT_ID [--confirm]
|
|
805
805
|
```
|
|
806
806
|
|
|
807
807
|
- `create` succeeds with `operation: "departments.create"` and
|
|
808
|
-
`data.department` = the server's 201 readback. `--name`
|
|
809
|
-
|
|
810
|
-
|
|
808
|
+
`data.department` = the server's 201 readback. `--name` is required. There is
|
|
809
|
+
no creator flag: before the write the CLI reads the saved session's own
|
|
810
|
+
identity (`GET /admins/me`) and sends it as the server contract's
|
|
811
|
+
`created_by_user_id`, so a create can never be attributed to another admin
|
|
812
|
+
and the tenant is taken from that same authenticated admin. A failed identity
|
|
813
|
+
read is a bounded failure and the write is never sent — it is not reported as
|
|
814
|
+
an unknown outcome.
|
|
811
815
|
- `update` sends only the options you pass (an empty `--description ""`
|
|
812
816
|
clears it); it refuses with exit 1 (`validation`) when no field option is
|
|
813
817
|
given. `set-active` and `deactivate` mark the department active/inactive.
|
|
814
|
-
- `delete` succeeds with `data: {"deleted": true}` (the server
|
|
815
|
-
with no body) and is irreversible.
|
|
818
|
+
- `delete --confirm` succeeds with `data: {"deleted": true}` (the server
|
|
819
|
+
answers 204 with no body) and is irreversible: the CLI keeps no restore.
|
|
820
|
+
Without `--confirm` the command is a **preview**: it reads the department
|
|
821
|
+
exactly once (one bounded `GET`), prints `preview: --confirm was not passed,
|
|
822
|
+
so nothing has been sent.` plus the resolved target and the disclosure block
|
|
823
|
+
to stderr, and exits 2 having sent no `DELETE`. With `--confirm` the confirmed
|
|
824
|
+
run makes the same single `GET` before its single `DELETE`, and the result
|
|
825
|
+
envelope is the same, so a preview is never an approval token. The preview
|
|
826
|
+
text is suppressed under `--output json`/`raw`, which keep stderr
|
|
827
|
+
machine-parsable (the exit-2 refusal message itself is plain text on stderr;
|
|
828
|
+
see #890).
|
|
816
829
|
- A 404 for the requested department is a `not_found` refusal naming the ID
|
|
817
830
|
(on `create`, a 404 names the referenced department — typically the missing
|
|
818
|
-
`--parent-department-id
|
|
831
|
+
`--parent-department-id`; on `delete`, the reviewed read refuses identically
|
|
832
|
+
and nothing is sent); a target/tenant or identity mismatch is a
|
|
819
833
|
`validation` refusal; both exit 1
|
|
820
834
|
without changes. The one exception is a tenant mismatch on the `create`
|
|
821
835
|
readback: the department has already been created server-side, so the CLI
|
|
@@ -849,7 +863,7 @@ projection as reads). Teams have no active/inactive lifecycle, so there are no
|
|
|
849
863
|
|
|
850
864
|
```bash
|
|
851
865
|
uv run --frozen hc ams teams create --environment dev --tenant-id TENANT_ID --name "Escalation Team" --department-id DEPARTMENT_ID --created-by-user-id ADMIN_USER_ID [--description TEXT] [--key KEY] [--required-eval-suite-ids SUITE_ID ...]
|
|
852
|
-
uv run --frozen hc ams teams update --environment dev --tenant-id TENANT_ID --team-id TEAM_ID [--name NAME] [--description TEXT] [--key KEY] [--required-eval-suite-ids SUITE_ID ...]
|
|
866
|
+
uv run --frozen hc ams teams update --environment dev --tenant-id TENANT_ID --team-id TEAM_ID [--name NAME] [--description TEXT] [--key KEY] [--required-eval-suite-ids SUITE_ID ... | --clear-required-eval-suite-ids]
|
|
853
867
|
uv run --frozen hc ams teams delete --environment dev --tenant-id TENANT_ID --team-id TEAM_ID
|
|
854
868
|
```
|
|
855
869
|
|
|
@@ -861,7 +875,8 @@ uv run --frozen hc ams teams delete --environment dev --tenant-id TENANT_ID --
|
|
|
861
875
|
clears it; `--clear-required-eval-suite-ids` sends an empty list to clear
|
|
862
876
|
the required evaluation suites; `--key` accepts a nonblank key, it cannot be
|
|
863
877
|
blanked); it refuses with exit 1 (`validation`) when no field option is
|
|
864
|
-
given.
|
|
878
|
+
given. `--required-eval-suite-ids` and `--clear-required-eval-suite-ids` are
|
|
879
|
+
alternatives: passing both is a usage error (exit 2) and nothing is sent.
|
|
865
880
|
- `delete` succeeds with `data: {"deleted": true}` (the server answers 204
|
|
866
881
|
with no body) and is irreversible. When AI agents still reference the team,
|
|
867
882
|
the server refuses with 409 and the CLI reports one `conflict` refusal that
|
|
@@ -928,7 +943,8 @@ uv run --frozen hc ams skills delete --environment dev --tenant-id TENANT_ID --s
|
|
|
928
943
|
- `update` sends only the options you pass (an empty `--description ""`
|
|
929
944
|
clears it; `--clear-tool-ids` sends an explicit empty list to clear the
|
|
930
945
|
skill's tool bindings); it refuses with exit 1 (`validation`) when no field
|
|
931
|
-
option is given.
|
|
946
|
+
option is given. `--tool-ids` and `--clear-tool-ids` are alternatives:
|
|
947
|
+
passing both is a usage error (exit 2) and nothing is sent.
|
|
932
948
|
- `delete` succeeds with `data: {"deleted": true}` (the server answers 204
|
|
933
949
|
with no body) and is irreversible. When AI agents still reference the skill
|
|
934
950
|
(via their `skill_ids`), the server refuses with 409 and the CLI reports one
|
|
@@ -1020,7 +1036,9 @@ uv run --frozen hc ams policies delete --environment dev --tenant-id TENANT_ID -
|
|
|
1020
1036
|
- `update` sends only the options you pass (an empty `--description ""` or
|
|
1021
1037
|
`--content ""` clears it; `--clear-guardrail-ids` sends an explicit empty
|
|
1022
1038
|
list to clear the policy's guardrail bindings); it refuses with exit 1
|
|
1023
|
-
(`validation`) when no field option is given.
|
|
1039
|
+
(`validation`) when no field option is given. `--guardrail-ids` and
|
|
1040
|
+
`--clear-guardrail-ids` are alternatives: passing both is a usage error
|
|
1041
|
+
(exit 2) and nothing is sent.
|
|
1024
1042
|
- `activate`/`deactivate` PUT `active: true|false` and succeed only when the
|
|
1025
1043
|
readback confirms the requested flag.
|
|
1026
1044
|
- `delete` succeeds with `data: {"deleted": true}` (the server answers 204
|
|
@@ -779,25 +779,39 @@ and the result envelope carries the server's authoritative readback of the
|
|
|
779
779
|
department (same bounded projection as reads):
|
|
780
780
|
|
|
781
781
|
```bash
|
|
782
|
-
uv run --frozen hc ams departments create --environment dev --tenant-id TENANT_ID --name "Clinical Operations"
|
|
782
|
+
uv run --frozen hc ams departments create --environment dev --tenant-id TENANT_ID --name "Clinical Operations" [--description TEXT] [--parent-department-id PARENT_ID] [--key KEY] [--required-eval-suite-ids SUITE_ID ...]
|
|
783
783
|
uv run --frozen hc ams departments update --environment dev --tenant-id TENANT_ID --department-id DEPARTMENT_ID [--name NAME] [--description TEXT] [--parent-department-id PARENT_ID] [--key KEY] [--required-eval-suite-ids SUITE_ID ...]
|
|
784
784
|
uv run --frozen hc ams departments set-active --environment dev --tenant-id TENANT_ID --department-id DEPARTMENT_ID
|
|
785
785
|
uv run --frozen hc ams departments deactivate --environment dev --tenant-id TENANT_ID --department-id DEPARTMENT_ID
|
|
786
|
-
uv run --frozen hc ams departments delete --environment dev --tenant-id TENANT_ID --department-id DEPARTMENT_ID
|
|
786
|
+
uv run --frozen hc ams departments delete --environment dev --tenant-id TENANT_ID --department-id DEPARTMENT_ID [--confirm]
|
|
787
787
|
```
|
|
788
788
|
|
|
789
789
|
- `create` succeeds with `operation: "departments.create"` and
|
|
790
|
-
`data.department` = the server's 201 readback. `--name`
|
|
791
|
-
|
|
792
|
-
|
|
790
|
+
`data.department` = the server's 201 readback. `--name` is required. There is
|
|
791
|
+
no creator flag: before the write the CLI reads the saved session's own
|
|
792
|
+
identity (`GET /admins/me`) and sends it as the server contract's
|
|
793
|
+
`created_by_user_id`, so a create can never be attributed to another admin
|
|
794
|
+
and the tenant is taken from that same authenticated admin. A failed identity
|
|
795
|
+
read is a bounded failure and the write is never sent — it is not reported as
|
|
796
|
+
an unknown outcome.
|
|
793
797
|
- `update` sends only the options you pass (an empty `--description ""`
|
|
794
798
|
clears it); it refuses with exit 1 (`validation`) when no field option is
|
|
795
799
|
given. `set-active` and `deactivate` mark the department active/inactive.
|
|
796
|
-
- `delete` succeeds with `data: {"deleted": true}` (the server
|
|
797
|
-
with no body) and is irreversible.
|
|
800
|
+
- `delete --confirm` succeeds with `data: {"deleted": true}` (the server
|
|
801
|
+
answers 204 with no body) and is irreversible: the CLI keeps no restore.
|
|
802
|
+
Without `--confirm` the command is a **preview**: it reads the department
|
|
803
|
+
exactly once (one bounded `GET`), prints `preview: --confirm was not passed,
|
|
804
|
+
so nothing has been sent.` plus the resolved target and the disclosure block
|
|
805
|
+
to stderr, and exits 2 having sent no `DELETE`. With `--confirm` the confirmed
|
|
806
|
+
run makes the same single `GET` before its single `DELETE`, and the result
|
|
807
|
+
envelope is the same, so a preview is never an approval token. The preview
|
|
808
|
+
text is suppressed under `--output json`/`raw`, which keep stderr
|
|
809
|
+
machine-parsable (the exit-2 refusal message itself is plain text on stderr;
|
|
810
|
+
see #890).
|
|
798
811
|
- A 404 for the requested department is a `not_found` refusal naming the ID
|
|
799
812
|
(on `create`, a 404 names the referenced department — typically the missing
|
|
800
|
-
`--parent-department-id
|
|
813
|
+
`--parent-department-id`; on `delete`, the reviewed read refuses identically
|
|
814
|
+
and nothing is sent); a target/tenant or identity mismatch is a
|
|
801
815
|
`validation` refusal; both exit 1
|
|
802
816
|
without changes. The one exception is a tenant mismatch on the `create`
|
|
803
817
|
readback: the department has already been created server-side, so the CLI
|
|
@@ -831,7 +845,7 @@ projection as reads). Teams have no active/inactive lifecycle, so there are no
|
|
|
831
845
|
|
|
832
846
|
```bash
|
|
833
847
|
uv run --frozen hc ams teams create --environment dev --tenant-id TENANT_ID --name "Escalation Team" --department-id DEPARTMENT_ID --created-by-user-id ADMIN_USER_ID [--description TEXT] [--key KEY] [--required-eval-suite-ids SUITE_ID ...]
|
|
834
|
-
uv run --frozen hc ams teams update --environment dev --tenant-id TENANT_ID --team-id TEAM_ID [--name NAME] [--description TEXT] [--key KEY] [--required-eval-suite-ids SUITE_ID ...]
|
|
848
|
+
uv run --frozen hc ams teams update --environment dev --tenant-id TENANT_ID --team-id TEAM_ID [--name NAME] [--description TEXT] [--key KEY] [--required-eval-suite-ids SUITE_ID ... | --clear-required-eval-suite-ids]
|
|
835
849
|
uv run --frozen hc ams teams delete --environment dev --tenant-id TENANT_ID --team-id TEAM_ID
|
|
836
850
|
```
|
|
837
851
|
|
|
@@ -843,7 +857,8 @@ uv run --frozen hc ams teams delete --environment dev --tenant-id TENANT_ID --
|
|
|
843
857
|
clears it; `--clear-required-eval-suite-ids` sends an empty list to clear
|
|
844
858
|
the required evaluation suites; `--key` accepts a nonblank key, it cannot be
|
|
845
859
|
blanked); it refuses with exit 1 (`validation`) when no field option is
|
|
846
|
-
given.
|
|
860
|
+
given. `--required-eval-suite-ids` and `--clear-required-eval-suite-ids` are
|
|
861
|
+
alternatives: passing both is a usage error (exit 2) and nothing is sent.
|
|
847
862
|
- `delete` succeeds with `data: {"deleted": true}` (the server answers 204
|
|
848
863
|
with no body) and is irreversible. When AI agents still reference the team,
|
|
849
864
|
the server refuses with 409 and the CLI reports one `conflict` refusal that
|
|
@@ -910,7 +925,8 @@ uv run --frozen hc ams skills delete --environment dev --tenant-id TENANT_ID --s
|
|
|
910
925
|
- `update` sends only the options you pass (an empty `--description ""`
|
|
911
926
|
clears it; `--clear-tool-ids` sends an explicit empty list to clear the
|
|
912
927
|
skill's tool bindings); it refuses with exit 1 (`validation`) when no field
|
|
913
|
-
option is given.
|
|
928
|
+
option is given. `--tool-ids` and `--clear-tool-ids` are alternatives:
|
|
929
|
+
passing both is a usage error (exit 2) and nothing is sent.
|
|
914
930
|
- `delete` succeeds with `data: {"deleted": true}` (the server answers 204
|
|
915
931
|
with no body) and is irreversible. When AI agents still reference the skill
|
|
916
932
|
(via their `skill_ids`), the server refuses with 409 and the CLI reports one
|
|
@@ -1002,7 +1018,9 @@ uv run --frozen hc ams policies delete --environment dev --tenant-id TENANT_ID -
|
|
|
1002
1018
|
- `update` sends only the options you pass (an empty `--description ""` or
|
|
1003
1019
|
`--content ""` clears it; `--clear-guardrail-ids` sends an explicit empty
|
|
1004
1020
|
list to clear the policy's guardrail bindings); it refuses with exit 1
|
|
1005
|
-
(`validation`) when no field option is given.
|
|
1021
|
+
(`validation`) when no field option is given. `--guardrail-ids` and
|
|
1022
|
+
`--clear-guardrail-ids` are alternatives: passing both is a usage error
|
|
1023
|
+
(exit 2) and nothing is sent.
|
|
1006
1024
|
- `activate`/`deactivate` PUT `active: true|false` and succeed only when the
|
|
1007
1025
|
readback confirms the requested flag.
|
|
1008
1026
|
- `delete` succeeds with `data: {"deleted": true}` (the server answers 204
|
|
@@ -121,6 +121,31 @@ def _saved_session_token(target: AmsTarget | TenantTarget) -> str:
|
|
|
121
121
|
return session.access_token
|
|
122
122
|
|
|
123
123
|
|
|
124
|
+
def session_admin_id(target: AmsTarget | TenantTarget) -> str:
|
|
125
|
+
"""The saved ``hc login`` session's own tenant-admin id (``GET /admins/me``).
|
|
126
|
+
|
|
127
|
+
The server resolves the identity from the verified access token, so nothing
|
|
128
|
+
here is caller-supplied. This is a read of the saved session only: there is
|
|
129
|
+
no environment-variable credential fallback and no password path, so a write
|
|
130
|
+
that needs the creator identity can never borrow another admin's id.
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
token = _saved_session_token(target)
|
|
134
|
+
with _tenant_admin_sdk(target.environment, target.tenant_id) as admin:
|
|
135
|
+
admin.set_access_token(token)
|
|
136
|
+
try:
|
|
137
|
+
profile = admin.admin.get_current_tenant_admin()
|
|
138
|
+
finally:
|
|
139
|
+
admin.clear_access_token()
|
|
140
|
+
admin_id = getattr(profile, "admin_id", None)
|
|
141
|
+
if not isinstance(admin_id, str) or not admin_id.strip():
|
|
142
|
+
raise click.ClickException("Saved AMS session identity unavailable; run hc login.")
|
|
143
|
+
profile_tenant_id = getattr(profile, "tenant_id", None)
|
|
144
|
+
if profile_tenant_id is not None and profile_tenant_id != target.tenant_id:
|
|
145
|
+
raise click.ClickException("Saved AMS session identity does not match the AMS target; run hc login.")
|
|
146
|
+
return admin_id
|
|
147
|
+
|
|
148
|
+
|
|
124
149
|
def selected_agent(sdk, target: AmsTarget):
|
|
125
150
|
agent = sdk.ams_admin.get_agent(target.agent_id)
|
|
126
151
|
if agent is None or agent.id != target.agent_id or agent.tenant_id != target.tenant_id:
|
|
@@ -4,8 +4,9 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
6
|
|
|
7
|
+
from ..auth import session_admin_id
|
|
7
8
|
from ..context import AmsDependencies, pass_ams, preflight_departments
|
|
8
|
-
from ..errors import run_domain
|
|
9
|
+
from ..errors import run_domain, run_preview
|
|
9
10
|
from ..session import resolve_tenant_target
|
|
10
11
|
from .operations import (
|
|
11
12
|
activate_department,
|
|
@@ -14,10 +15,12 @@ from .operations import (
|
|
|
14
15
|
delete_department,
|
|
15
16
|
get_department,
|
|
16
17
|
list_departments,
|
|
18
|
+
preview_delete,
|
|
17
19
|
update_department,
|
|
18
20
|
)
|
|
19
21
|
|
|
20
22
|
LOGIN_HINT = "Not logged in; run `hc login` before writing department changes."
|
|
23
|
+
DELETE_LOGIN_HINT = "Not logged in; run `hc login` before deleting a department."
|
|
21
24
|
|
|
22
25
|
|
|
23
26
|
def _environment(function):
|
|
@@ -71,23 +74,45 @@ def create_get_command(dependencies: AmsDependencies) -> click.Command:
|
|
|
71
74
|
return command
|
|
72
75
|
|
|
73
76
|
|
|
74
|
-
def _require_login() -> None:
|
|
77
|
+
def _require_login(hint: str = LOGIN_HINT) -> None:
|
|
75
78
|
"""Department writes need a saved `hc login` session, not env-var credentials."""
|
|
76
79
|
|
|
77
80
|
from ..session import load_session
|
|
78
81
|
|
|
79
82
|
if load_session() is None:
|
|
80
|
-
raise click.ClickException(
|
|
83
|
+
raise click.ClickException(hint)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _preview_then_refuse(invocation, target_data: dict, preview, refusal: str) -> None:
|
|
87
|
+
"""Read the target once, print the reviewed delete, then refuse with exit 2.
|
|
88
|
+
|
|
89
|
+
Nothing is written before the refusal, and the preview is still a read: a
|
|
90
|
+
failed read (not logged in, wrong tenant, 404, transport) keeps the bounded
|
|
91
|
+
error envelope instead of escaping as a traceback. The confirmed run makes
|
|
92
|
+
the same read before its single DELETE, so a preview is never an approval
|
|
93
|
+
token.
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
def read() -> None:
|
|
97
|
+
_require_login(DELETE_LOGIN_HINT)
|
|
98
|
+
target = resolve_tenant_target(target_data["environment"], target_data["tenant_id"])
|
|
99
|
+
target_data.update(environment=target.environment, tenant_id=target.tenant_id)
|
|
100
|
+
preflight_departments(invocation, target)
|
|
101
|
+
preview(target)
|
|
102
|
+
|
|
103
|
+
run_preview("departments.delete", target_data, read)
|
|
104
|
+
raise click.UsageError(refusal)
|
|
81
105
|
|
|
82
106
|
|
|
83
107
|
def create_create_command(dependencies: AmsDependencies) -> click.Command:
|
|
84
|
-
@click.command(
|
|
108
|
+
@click.command(
|
|
109
|
+
"create",
|
|
110
|
+
help="Create one department (send-once write; requires `hc login`). The creator is the saved "
|
|
111
|
+
"session's own admin, resolved from the verified token.",
|
|
112
|
+
)
|
|
85
113
|
@_environment
|
|
86
114
|
@_tenant
|
|
87
115
|
@click.option("--name", required=True, help="Department name.")
|
|
88
|
-
@click.option(
|
|
89
|
-
"--created-by-user-id", required=True, help="Calling admin's user ID (required by the server contract)."
|
|
90
|
-
)
|
|
91
116
|
@click.option("--description", default=None, help="Optional department description.")
|
|
92
117
|
@click.option("--parent-department-id", default=None, help="Optional parent department ID.")
|
|
93
118
|
@click.option("--key", default=None, help="Optional department key.")
|
|
@@ -102,7 +127,6 @@ def create_create_command(dependencies: AmsDependencies) -> click.Command:
|
|
|
102
127
|
environment: str | None,
|
|
103
128
|
tenant_id: str | None,
|
|
104
129
|
name: str,
|
|
105
|
-
created_by_user_id: str,
|
|
106
130
|
description: str | None,
|
|
107
131
|
parent_department_id: str | None,
|
|
108
132
|
key: str | None,
|
|
@@ -115,6 +139,10 @@ def create_create_command(dependencies: AmsDependencies) -> click.Command:
|
|
|
115
139
|
target = resolve_tenant_target(environment, tenant_id)
|
|
116
140
|
target_data.update(environment=target.environment, tenant_id=target.tenant_id)
|
|
117
141
|
preflight_departments(invocation, target)
|
|
142
|
+
# Attribution is a read of the saved session's own identity (GET /admins/me):
|
|
143
|
+
# the server derives it from the verified token, so it is resolved before
|
|
144
|
+
# the write and never supplied by the caller.
|
|
145
|
+
created_by_user_id = session_admin_id(target)
|
|
118
146
|
return create_department(
|
|
119
147
|
dependencies,
|
|
120
148
|
target,
|
|
@@ -239,20 +267,39 @@ def create_deactivate_command(dependencies: AmsDependencies) -> click.Command:
|
|
|
239
267
|
|
|
240
268
|
|
|
241
269
|
def create_delete_command(dependencies: AmsDependencies) -> click.Command:
|
|
242
|
-
|
|
270
|
+
help_text = (
|
|
271
|
+
"Delete one department (irreversible; send-once; requires `hc login` and --confirm). The CLI keeps "
|
|
272
|
+
"no restore and cannot undo the delete."
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
@click.command("delete", help=help_text)
|
|
243
276
|
@_environment
|
|
244
277
|
@_tenant
|
|
245
278
|
@click.option("--department-id", required=True)
|
|
279
|
+
@click.option(
|
|
280
|
+
"--confirm",
|
|
281
|
+
is_flag=True,
|
|
282
|
+
default=False,
|
|
283
|
+
help="Required acknowledgement of the printed target and disclosure block; without it the command "
|
|
284
|
+
"reads the department, prints both and sends nothing.",
|
|
285
|
+
)
|
|
246
286
|
@pass_ams
|
|
247
|
-
def command(invocation, environment: str | None, tenant_id: str | None, department_id: str) -> None:
|
|
287
|
+
def command(invocation, environment: str | None, tenant_id: str | None, department_id: str, confirm: bool) -> None:
|
|
248
288
|
target_data = {
|
|
249
289
|
"environment": environment,
|
|
250
290
|
"tenant_id": tenant_id,
|
|
251
291
|
"department_id": department_id,
|
|
252
292
|
}
|
|
293
|
+
if not confirm:
|
|
294
|
+
_preview_then_refuse(
|
|
295
|
+
invocation,
|
|
296
|
+
target_data,
|
|
297
|
+
lambda target: preview_delete(dependencies, target, department_id),
|
|
298
|
+
"--confirm is required; no delete was sent. Re-run with --confirm to send it.",
|
|
299
|
+
)
|
|
253
300
|
|
|
254
301
|
def execute():
|
|
255
|
-
_require_login()
|
|
302
|
+
_require_login(DELETE_LOGIN_HINT)
|
|
256
303
|
target = resolve_tenant_target(environment, tenant_id)
|
|
257
304
|
target_data.update(environment=target.environment, tenant_id=target.tenant_id)
|
|
258
305
|
preflight_departments(invocation, target)
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/departments/operations.py
RENAMED
|
@@ -270,12 +270,119 @@ def deactivate_department(dependencies: AmsDependencies, target: TenantTarget, d
|
|
|
270
270
|
return _lifecycle(dependencies, target, department_id, "deactivate")
|
|
271
271
|
|
|
272
272
|
|
|
273
|
+
DELETE_DISCLOSURE = {
|
|
274
|
+
"irreversible": "the server deletes the department; the CLI has no restore and no retention window.",
|
|
275
|
+
"no_retry": "exactly one DELETE is sent, and an uncertain outcome is never replayed.",
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def _review_enabled() -> bool:
|
|
280
|
+
"""A reviewed write rendering is human: json/raw keep stderr machine-parsable."""
|
|
281
|
+
|
|
282
|
+
import click
|
|
283
|
+
|
|
284
|
+
from ...context import CliConfig
|
|
285
|
+
|
|
286
|
+
ctx = click.get_current_context(silent=True)
|
|
287
|
+
config = ctx.find_object(CliConfig) if ctx is not None else None
|
|
288
|
+
return getattr(config, "output", None) not in ("json", "raw")
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def _echo_preview_notice() -> None:
|
|
292
|
+
"""Say plainly that what follows is a preview and nothing has been sent."""
|
|
293
|
+
|
|
294
|
+
import click
|
|
295
|
+
|
|
296
|
+
if not _review_enabled():
|
|
297
|
+
return
|
|
298
|
+
click.echo("preview: --confirm was not passed, so nothing has been sent.", err=True)
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def _delete_target(department, department_id: str) -> dict:
|
|
302
|
+
"""The exact record the operator is approving: ids and bounded fields only."""
|
|
303
|
+
|
|
304
|
+
return {
|
|
305
|
+
"department_id": department_id,
|
|
306
|
+
"name": getattr(department, "name", None),
|
|
307
|
+
"key": getattr(department, "key", None),
|
|
308
|
+
"active": getattr(department, "active", None),
|
|
309
|
+
"parent_department_id": getattr(department, "parent_department_id", None),
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def _echo_delete_review(department, department_id: str, *, preview: bool = False) -> None:
|
|
314
|
+
"""Print the destructive target and the disclosure before the single DELETE.
|
|
315
|
+
|
|
316
|
+
``preview`` is the unconfirmed half: it prints the same target and the same
|
|
317
|
+
disclosure, worded as what the confirmed run would do.
|
|
318
|
+
"""
|
|
319
|
+
|
|
320
|
+
import click
|
|
321
|
+
|
|
322
|
+
if not _review_enabled():
|
|
323
|
+
return
|
|
324
|
+
target = _delete_target(department, department_id)
|
|
325
|
+
click.echo(
|
|
326
|
+
f"{'would delete' if preview else 'deleting'} department '{department_id}' "
|
|
327
|
+
f"(name {target['name']!r}, key {target['key']!r}, active {target['active']}, "
|
|
328
|
+
f"parent_department_id {target['parent_department_id']!r}):",
|
|
329
|
+
err=True,
|
|
330
|
+
)
|
|
331
|
+
for key, fact in DELETE_DISCLOSURE.items():
|
|
332
|
+
click.echo(f" {key}: {fact}", err=True)
|
|
333
|
+
click.echo(f"one DELETE /departments/{department_id}", err=True)
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def _delete_review_target(sdk, target: TenantTarget, department_id: str):
|
|
337
|
+
"""The one bounded read a delete reviews: a 404 is its own refusal.
|
|
338
|
+
|
|
339
|
+
Used by both the unconfirmed preview and the confirmed run, so the target the
|
|
340
|
+
operator reviewed and the target that is deleted cannot drift.
|
|
341
|
+
"""
|
|
342
|
+
|
|
343
|
+
from healthcloud.errors import HealthCloudHTTPError
|
|
344
|
+
|
|
345
|
+
try:
|
|
346
|
+
department = _resource(sdk, ("get",)).get(department_id)
|
|
347
|
+
except HealthCloudHTTPError as error:
|
|
348
|
+
if getattr(error, "status_code", 0) == 404:
|
|
349
|
+
raise DepartmentWriteRefused(
|
|
350
|
+
"not_found",
|
|
351
|
+
f"Department '{department_id}' was not found in this tenant; nothing was sent.",
|
|
352
|
+
) from None
|
|
353
|
+
raise
|
|
354
|
+
if (
|
|
355
|
+
department is None
|
|
356
|
+
or getattr(department, "id", None) != department_id
|
|
357
|
+
or getattr(department, "tenant_id", None) != target.tenant_id
|
|
358
|
+
):
|
|
359
|
+
raise DepartmentWriteRefused("validation", "Department/tenant identity mismatch; stopped.")
|
|
360
|
+
return department
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
def preview_delete(dependencies: AmsDependencies, target: TenantTarget, department_id: str) -> None:
|
|
364
|
+
"""Print the delete target and its disclosure without sending the DELETE."""
|
|
365
|
+
|
|
366
|
+
department_id = _department_id(department_id)
|
|
367
|
+
with dependencies.authenticated_sdk_factory(target) as sdk:
|
|
368
|
+
before = _delete_review_target(sdk, target, department_id)
|
|
369
|
+
_echo_preview_notice()
|
|
370
|
+
_echo_delete_review(before, department_id, preview=True)
|
|
371
|
+
|
|
372
|
+
|
|
273
373
|
def delete_department(dependencies: AmsDependencies, target: TenantTarget, department_id: str) -> dict:
|
|
274
|
-
"""Delete one department (204, no body); no retry on unknown outcome.
|
|
374
|
+
"""Delete one department (204, no body); no retry on unknown outcome.
|
|
375
|
+
|
|
376
|
+
Sequence: exactly one ``GET /departments/{id}`` (the reviewed target, the same
|
|
377
|
+
read the unconfirmed preview makes) and exactly one ``DELETE``. There is never
|
|
378
|
+
a retry, a replay, a second delete or a restore claim.
|
|
379
|
+
"""
|
|
275
380
|
from healthcloud.errors import HealthCloudHTTPError, HealthCloudNetworkError
|
|
276
381
|
|
|
277
382
|
department_id = _department_id(department_id)
|
|
278
383
|
with dependencies.authenticated_sdk_factory(target) as sdk:
|
|
384
|
+
before = _delete_review_target(sdk, target, department_id)
|
|
385
|
+
_echo_delete_review(before, department_id)
|
|
279
386
|
resource = _resource(sdk, ("delete",))
|
|
280
387
|
try:
|
|
281
388
|
resource.delete(department_id)
|
|
@@ -188,6 +188,8 @@ def create_update_command(dependencies: AmsDependencies) -> click.Command:
|
|
|
188
188
|
) -> None:
|
|
189
189
|
if content is not None and content_file is not None:
|
|
190
190
|
raise click.UsageError("Pass --content or --content-file, not both; nothing was sent.")
|
|
191
|
+
if guardrail_ids and clear_guardrail_ids:
|
|
192
|
+
raise click.UsageError("--guardrail-ids and --clear-guardrail-ids cannot be combined; nothing was sent.")
|
|
191
193
|
target_data = {
|
|
192
194
|
"environment": environment,
|
|
193
195
|
"tenant_id": tenant_id,
|
|
@@ -141,6 +141,8 @@ def create_update_command(dependencies: AmsDependencies) -> click.Command:
|
|
|
141
141
|
tool_ids: tuple[str, ...],
|
|
142
142
|
clear_tool_ids: bool,
|
|
143
143
|
) -> None:
|
|
144
|
+
if tool_ids and clear_tool_ids:
|
|
145
|
+
raise click.UsageError("--tool-ids and --clear-tool-ids cannot be combined; nothing was sent.")
|
|
144
146
|
target_data = {
|
|
145
147
|
"environment": environment,
|
|
146
148
|
"tenant_id": tenant_id,
|
|
@@ -149,6 +149,10 @@ def create_update_command(dependencies: AmsDependencies) -> click.Command:
|
|
|
149
149
|
required_eval_suite_ids: tuple[str, ...],
|
|
150
150
|
clear_required_eval_suite_ids: bool,
|
|
151
151
|
) -> None:
|
|
152
|
+
if required_eval_suite_ids and clear_required_eval_suite_ids:
|
|
153
|
+
raise click.UsageError(
|
|
154
|
+
"--required-eval-suite-ids and --clear-required-eval-suite-ids cannot be combined; nothing was sent."
|
|
155
|
+
)
|
|
152
156
|
target_data = {
|
|
153
157
|
"environment": environment,
|
|
154
158
|
"tenant_id": tenant_id,
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "healthcloud-cli"
|
|
7
|
-
version = "3.7.
|
|
7
|
+
version = "3.7.5"
|
|
8
8
|
description = "Command-line interface for the HealthCloud MCP gateway, generated from the shared MCP tool manifest."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.14"
|
|
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
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/data_sources/__init__.py
RENAMED
|
File without changes
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/data_sources/commands.py
RENAMED
|
File without changes
|
|
File without changes
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/data_sources/operations.py
RENAMED
|
File without changes
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/data_sources/projections.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/departments/projections.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/guardrails/operations.py
RENAMED
|
File without changes
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/guardrails/projections.py
RENAMED
|
File without changes
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/organization/__init__.py
RENAMED
|
File without changes
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/organization/commands.py
RENAMED
|
File without changes
|
|
File without changes
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/organization/operations.py
RENAMED
|
File without changes
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/ams/organization/projections.py
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
|
|
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
|
{healthcloud_cli-3.7.3 → healthcloud_cli-3.7.5}/healthcloud_cli/contracts/mcp-tools.manifest.json
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
|