terp-cli 0.34.0__tar.gz → 0.35.0__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 (71) hide show
  1. terp_cli-0.35.0/PKG-INFO +23 -0
  2. {terp_cli-0.34.0 → terp_cli-0.35.0}/pyproject.toml +17 -8
  3. terp_cli-0.35.0/signer/Dockerfile +57 -0
  4. terp_cli-0.35.0/signer/terp-arch-releases.json +1 -0
  5. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/__init__.py +919 -25
  6. terp_cli-0.35.0/src/terp/cli/deployment_adopt.py +359 -0
  7. terp_cli-0.35.0/src/terp/cli/deployment_app.py +213 -0
  8. terp_cli-0.35.0/src/terp/cli/deployment_check.py +102 -0
  9. terp_cli-0.35.0/src/terp/cli/deployment_declare.py +327 -0
  10. terp_cli-0.35.0/src/terp/cli/deployment_render.py +160 -0
  11. terp_cli-0.35.0/src/terp/cli/docker.py +498 -0
  12. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/envfile.py +9 -6
  13. terp_cli-0.35.0/src/terp/cli/envrequired.py +86 -0
  14. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/envschema.py +19 -1
  15. terp_cli-0.35.0/src/terp/cli/heartbeat.py +139 -0
  16. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/jobs.py +121 -8
  17. terp_cli-0.35.0/src/terp/cli/locks.py +163 -0
  18. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/ports.py +22 -9
  19. terp_cli-0.35.0/src/terp/cli/release/__init__.py +18 -0
  20. terp_cli-0.35.0/src/terp/cli/release/_common.py +191 -0
  21. terp_cli-0.35.0/src/terp/cli/release/_compare.py +324 -0
  22. terp_cli-0.35.0/src/terp/cli/release/_dockerfile.py +469 -0
  23. terp_cli-0.35.0/src/terp/cli/release/_git.py +162 -0
  24. terp_cli-0.35.0/src/terp/cli/release/_image.py +199 -0
  25. terp_cli-0.35.0/src/terp/cli/release/_locks.py +230 -0
  26. terp_cli-0.35.0/src/terp/cli/release/_plan.py +287 -0
  27. terp_cli-0.35.0/src/terp/cli/release/_registry.py +226 -0
  28. terp_cli-0.35.0/src/terp/cli/release/_render.py +199 -0
  29. terp_cli-0.35.0/src/terp/cli/release/_sandbox.py +285 -0
  30. terp_cli-0.35.0/src/terp/cli/release/build.py +198 -0
  31. terp_cli-0.35.0/src/terp/cli/release/cli.py +142 -0
  32. terp_cli-0.35.0/src/terp/cli/release/dsse.py +202 -0
  33. terp_cli-0.35.0/src/terp/cli/release/gate.py +146 -0
  34. terp_cli-0.35.0/src/terp/cli/release/manifest.py +223 -0
  35. terp_cli-0.35.0/src/terp/cli/release/promote.py +379 -0
  36. terp_cli-0.35.0/src/terp/cli/release/sign.py +302 -0
  37. terp_cli-0.35.0/src/terp/cli/reseal.py +362 -0
  38. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/verify.py +106 -2
  39. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/version.py +62 -10
  40. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/workbench.py +141 -126
  41. terp_cli-0.35.0/src/terp/cli/workbench_adopt.py +235 -0
  42. terp_cli-0.34.0/PKG-INFO +0 -19
  43. terp_cli-0.34.0/src/terp/cli/docker.py +0 -253
  44. {terp_cli-0.34.0 → terp_cli-0.35.0}/.gitignore +0 -0
  45. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/_appref.py +0 -0
  46. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/_engine.py +0 -0
  47. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/_output.py +0 -0
  48. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/_subjects.py +0 -0
  49. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/access.py +0 -0
  50. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/apidocs.py +0 -0
  51. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/authz_surface.py +0 -0
  52. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/capabilities.py +0 -0
  53. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/deploy_safety.py +0 -0
  54. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/dev.py +0 -0
  55. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/docker_masks.py +0 -0
  56. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/envseams.py +0 -0
  57. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/fmt.py +0 -0
  58. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/grants.py +0 -0
  59. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/leases.py +0 -0
  60. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/module_roles.py +0 -0
  61. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/openapi.py +0 -0
  62. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/outbox.py +0 -0
  63. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/profiles.py +0 -0
  64. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/py.typed +0 -0
  65. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/routes.py +0 -0
  66. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/scaffold.py +0 -0
  67. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/schema.py +0 -0
  68. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/seed.py +0 -0
  69. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/service_accounts.py +0 -0
  70. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/smoke.py +0 -0
  71. {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/users.py +0 -0
@@ -0,0 +1,23 @@
1
+ Metadata-Version: 2.5
2
+ Name: terp-cli
3
+ Version: 0.35.0
4
+ Summary: Terp command-line tool — inspect, scaffolding, migrations, checks, api-docs.
5
+ Project-URL: Repository, https://github.com/AITT-NL/terp-framework
6
+ Project-URL: Changelog, https://github.com/AITT-NL/terp-framework/blob/main/CHANGELOG.md
7
+ License-Expression: Apache-2.0
8
+ Requires-Python: >=3.13
9
+ Requires-Dist: pyyaml>=6.0
10
+ Requires-Dist: terp-arch==0.35.0
11
+ Requires-Dist: terp-core==0.35.0
12
+ Requires-Dist: terp-migrations==0.35.0
13
+ Provides-Extra: jobs
14
+ Requires-Dist: terp-cap-outbox==0.35.0; extra == 'jobs'
15
+ Requires-Dist: terp-cap-scheduler-apscheduler==0.35.0; extra == 'jobs'
16
+ Provides-Extra: release
17
+ Requires-Dist: cryptography>=46; extra == 'release'
18
+ Requires-Dist: packaging>=24; extra == 'release'
19
+ Requires-Dist: terp-cap-egress==0.35.0; extra == 'release'
20
+ Provides-Extra: scheduler
21
+ Requires-Dist: terp-cap-scheduler-apscheduler==0.35.0; extra == 'scheduler'
22
+ Provides-Extra: worker
23
+ Requires-Dist: terp-cap-outbox==0.35.0; extra == 'worker'
@@ -4,18 +4,18 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "terp-cli"
7
- version = "0.34.0"
7
+ version = "0.35.0"
8
8
  description = "Terp command-line tool — inspect, scaffolding, migrations, checks, api-docs."
9
9
  requires-python = ">=3.13"
10
10
  license = "Apache-2.0"
11
11
  dependencies = [
12
- "terp-core==0.34.0",
12
+ "terp-core==0.35.0",
13
13
  # `terp migrate` delegates to terp-migrations (lazily imported), keeping Alembic
14
14
  # off the path for `terp inspect` / `terp guide` while making migrations work.
15
- "terp-migrations==0.34.0",
15
+ "terp-migrations==0.35.0",
16
16
  # `terp guide rules` projects the live rule registry; terp-arch is imported lazily
17
17
  # (only when that topic is rendered), so it stays off the common `terp guide` path.
18
- "terp-arch==0.34.0",
18
+ "terp-arch==0.35.0",
19
19
  # `terp verify --only env-seams` and `terp smoke` read the compose profiles as data
20
20
  # (anchors and `<<:` merge keys resolved), so both answer without a Docker daemon or
21
21
  # even the `docker` binary. Declared explicitly rather than leant on: every app
@@ -29,11 +29,20 @@ dependencies = [
29
29
  # or a scheduler engine into apps that only use inspect/check/migrate. Deployments can select
30
30
  # one process role, while `jobs` is the convenient complete jobs-process bundle.
31
31
  [project.optional-dependencies]
32
- worker = ["terp-cap-outbox==0.34.0"]
33
- scheduler = ["terp-cap-scheduler-apscheduler==0.34.0"]
32
+ worker = ["terp-cap-outbox==0.35.0"]
33
+ scheduler = ["terp-cap-scheduler-apscheduler==0.35.0"]
34
34
  jobs = [
35
- "terp-cap-outbox==0.34.0",
36
- "terp-cap-scheduler-apscheduler==0.34.0",
35
+ "terp-cap-outbox==0.35.0",
36
+ "terp-cap-scheduler-apscheduler==0.35.0",
37
+ ]
38
+ # `terp release` and `terp promote` (ADR 0187): the DSSE signature (cryptography), the lock's
39
+ # markers (packaging), and the one declared way to a registry, an index and the vulnerability
40
+ # database (the egress capability). Optional, because no app's own process needs them; without
41
+ # them both commands refuse to run, and never skip a verification.
42
+ release = [
43
+ "cryptography>=46",
44
+ "packaging>=24",
45
+ "terp-cap-egress==0.35.0",
37
46
  ]
38
47
 
39
48
  [project.scripts]
@@ -0,0 +1,57 @@
1
+ # The signer image: the operator's own toolchain for `terp release sign` (ADR 0187 decision 6).
2
+ #
3
+ # `sign` never runs at the version a release pins, so an app cannot choose its own verifier: it
4
+ # runs from this image, at the framework's newest release. The image holds terp-cli with its
5
+ # `release` extra, installed from a hash-locked requirements file and the framework's own wheels
6
+ # (tools/signer_context.py writes both), gitleaks for the secret scan, the docker client the
7
+ # bytecode check runs the base image's interpreter with (never an app image), git to read the
8
+ # commit, and the terp-arch release table: the wheel SHA-256 of every terp-arch release from the
9
+ # floor up, the only wheels `sign` renders with.
10
+ #
11
+ # The framework's CI builds it from the commit's wheels and runs it; nothing publishes it yet.
12
+ # What the release pipeline will add, and the reason each is not here: publishing it by digest
13
+ # with provenance, so an operator pins the image rather than a tag; the release table filled
14
+ # from the published terp-arch wheels' hashes, which exist only once a release is on the index
15
+ # (this table is empty until then, so this build signs nothing a published app pins); and git
16
+ # from a pinned source, as the bases are, where apt installs Debian's current one today.
17
+ #
18
+ # Built as: docker build --pull --no-cache -f Dockerfile <context>, the context holding this
19
+ # file, requirements.txt, wheels/ and terp-arch-releases.json.
20
+ #
21
+ # Run with the checkout mounted read-only and the engine the bytecode check starts the base
22
+ # interpreter on: its socket mounted, and the socket's group added (`--group-add`), because the
23
+ # image runs as its own user, `signer`, who owns neither (a checkout another user owns is read
24
+ # all the same: sign tells git the named repository is safe). A registry on the loopback, the
25
+ # release lane's, is reached with `--network host`. The release lane runs it exactly so
26
+ # (tests/release_lane/).
27
+
28
+ # python:3.14-slim, the base-image table's interpreter (terp-arch's base-images.json).
29
+ FROM python@sha256:fbecd461fc72d21b2143c6eaba25143738079154a6d0ea3da3aec724f50eed4a AS install
30
+ COPY wheels/ /wheels/
31
+ COPY requirements.txt /requirements.txt
32
+ # Every distribution by its hash: the third-party ones as uv.lock pins them, the framework's as
33
+ # built for this image, each named by its file under /wheels and never by its version, which an
34
+ # index may carry too (between two releases the tree's is the last published one, and pip took
35
+ # that wheel). --no-deps: the file names every one, so nothing is resolved here.
36
+ RUN python -m venv /opt/terp \
37
+ && /opt/terp/bin/pip install --no-cache-dir --no-deps --require-hashes -r /requirements.txt
38
+
39
+ # gitleaks v8.30.1, by digest (zricethezav/gitleaks:v8.30.1, read 2026-10-22).
40
+ FROM zricethezav/gitleaks@sha256:c00b6bd0aeb3071cbcb79009cb16a60dd9e0a7c60e2be9ab65d25e6bc8abbb7f AS gitleaks
41
+ # The docker client 29.9.2, by digest (docker:29.9.2-cli, read 2026-10-22).
42
+ FROM docker@sha256:5e6baf67325a79f64ed3bed6863954d5e05d0f3d4e57cbdb14809346814bbfdb AS docker
43
+
44
+ FROM python@sha256:fbecd461fc72d21b2143c6eaba25143738079154a6d0ea3da3aec724f50eed4a
45
+ RUN apt-get update \
46
+ && apt-get install -y --no-install-recommends git \
47
+ && rm -rf /var/lib/apt/lists/* \
48
+ && useradd --create-home --uid 10001 signer
49
+ COPY --from=gitleaks /usr/bin/gitleaks /usr/local/bin/gitleaks
50
+ COPY --from=docker /usr/local/bin/docker /usr/local/bin/docker
51
+ COPY --from=install /opt/terp /opt/terp
52
+ COPY terp-arch-releases.json /etc/terp/terp-arch-releases.json
53
+ ENV PATH="/opt/terp/bin:$PATH" \
54
+ PYTHONDONTWRITEBYTECODE=1
55
+ USER signer
56
+ ENTRYPOINT ["terp", "release"]
57
+ CMD ["sign", "--help"]
@@ -0,0 +1 @@
1
+ {"releases":{},"terpArchReleases":1}