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.
- terp_cli-0.35.0/PKG-INFO +23 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/pyproject.toml +17 -8
- terp_cli-0.35.0/signer/Dockerfile +57 -0
- terp_cli-0.35.0/signer/terp-arch-releases.json +1 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/__init__.py +919 -25
- terp_cli-0.35.0/src/terp/cli/deployment_adopt.py +359 -0
- terp_cli-0.35.0/src/terp/cli/deployment_app.py +213 -0
- terp_cli-0.35.0/src/terp/cli/deployment_check.py +102 -0
- terp_cli-0.35.0/src/terp/cli/deployment_declare.py +327 -0
- terp_cli-0.35.0/src/terp/cli/deployment_render.py +160 -0
- terp_cli-0.35.0/src/terp/cli/docker.py +498 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/envfile.py +9 -6
- terp_cli-0.35.0/src/terp/cli/envrequired.py +86 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/envschema.py +19 -1
- terp_cli-0.35.0/src/terp/cli/heartbeat.py +139 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/jobs.py +121 -8
- terp_cli-0.35.0/src/terp/cli/locks.py +163 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/ports.py +22 -9
- terp_cli-0.35.0/src/terp/cli/release/__init__.py +18 -0
- terp_cli-0.35.0/src/terp/cli/release/_common.py +191 -0
- terp_cli-0.35.0/src/terp/cli/release/_compare.py +324 -0
- terp_cli-0.35.0/src/terp/cli/release/_dockerfile.py +469 -0
- terp_cli-0.35.0/src/terp/cli/release/_git.py +162 -0
- terp_cli-0.35.0/src/terp/cli/release/_image.py +199 -0
- terp_cli-0.35.0/src/terp/cli/release/_locks.py +230 -0
- terp_cli-0.35.0/src/terp/cli/release/_plan.py +287 -0
- terp_cli-0.35.0/src/terp/cli/release/_registry.py +226 -0
- terp_cli-0.35.0/src/terp/cli/release/_render.py +199 -0
- terp_cli-0.35.0/src/terp/cli/release/_sandbox.py +285 -0
- terp_cli-0.35.0/src/terp/cli/release/build.py +198 -0
- terp_cli-0.35.0/src/terp/cli/release/cli.py +142 -0
- terp_cli-0.35.0/src/terp/cli/release/dsse.py +202 -0
- terp_cli-0.35.0/src/terp/cli/release/gate.py +146 -0
- terp_cli-0.35.0/src/terp/cli/release/manifest.py +223 -0
- terp_cli-0.35.0/src/terp/cli/release/promote.py +379 -0
- terp_cli-0.35.0/src/terp/cli/release/sign.py +302 -0
- terp_cli-0.35.0/src/terp/cli/reseal.py +362 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/verify.py +106 -2
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/version.py +62 -10
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/workbench.py +141 -126
- terp_cli-0.35.0/src/terp/cli/workbench_adopt.py +235 -0
- terp_cli-0.34.0/PKG-INFO +0 -19
- terp_cli-0.34.0/src/terp/cli/docker.py +0 -253
- {terp_cli-0.34.0 → terp_cli-0.35.0}/.gitignore +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/_appref.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/_engine.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/_output.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/_subjects.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/access.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/apidocs.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/authz_surface.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/capabilities.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/deploy_safety.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/dev.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/docker_masks.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/envseams.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/fmt.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/grants.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/leases.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/module_roles.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/openapi.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/outbox.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/profiles.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/py.typed +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/routes.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/scaffold.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/schema.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/seed.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/service_accounts.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/smoke.py +0 -0
- {terp_cli-0.34.0 → terp_cli-0.35.0}/src/terp/cli/users.py +0 -0
terp_cli-0.35.0/PKG-INFO
ADDED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
33
|
-
scheduler = ["terp-cap-scheduler-apscheduler==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.
|
|
36
|
-
"terp-cap-scheduler-apscheduler==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}
|