diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a01e6e02..7cc368c9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,6 +31,24 @@ jobs: with: go-version: "1.25" + # The top released section of the changelog must name the tag being + # released and carry a real date. Between releases that heading sits at + # `## [0.1.0] - 2026-XX-XX`; shipping the placeholder is easy to do and + # invisible once the release is out. Dispatch this workflow on the tag + # (`gh workflow run release.yml --ref v0.1.0`) so GITHUB_REF_NAME is it. + - name: CHANGELOG matches the tag + run: | + tag="${GITHUB_REF_NAME#v}" + line=$(grep -m1 -E '^## \[[0-9]' CHANGELOG.md) + echo "releasing: $GITHUB_REF_NAME" + echo "changelog: $line" + case "$line" in + *"[$tag]"*) ;; + *) echo "::error::top changelog version is not [$tag]"; exit 1 ;; + esac + echo "$line" | grep -qE '[0-9]{4}-[0-9]{2}-[0-9]{2}[[:space:]]*$' \ + || { echo "::error::changelog date is still a placeholder"; exit 1; } + - name: Run tests run: make test diff --git a/CHANGELOG.md b/CHANGELOG.md index 148b1310..57336efb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,11 +7,59 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -The agent-ergonomics arc lands across four sequenced PRs: +## [0.1.0] — 2026-XX-XX + +First tagged release. The project transitions from a curated set of HOCON +configuration templates into a CLI for declarative TRON node deployment. + +Nothing was published before this tag — no `v0.1.0-alpha` release ever existed, +so the work that was previously filed under that heading is folded in here. + +`0.x` is deliberate. The public surface is not just the CLI flags: it is +`schemas/intent.schema.json` (~50 fields), the ~30 machine-readable schemas +under `schemas/output/`, and the exit-code contract that `AGENTS.md` tells +agents to branch on. Those are worth changing in response to real use before +they are frozen behind a compatibility promise, which is what `1.0.0` would +mean under the semantic-versioning rule in the project constitution. + +The agent-ergonomics arc landed across four sequenced PRs: **#151** (CLI core + AGENTS.md) → **#152** (`trond schema`) → **#153** (`trond mcp`) → **#154** (`trond recipe`). ### Added + +**Foundation** + +- 32 CLI commands across lifecycle (apply / stop / start / restart / upgrade / + rollback / remove), configuration (validate / render / diff / docs), + observability (status / list / logs / health / diagnose / verify / inspect / + events), test-harness SDK (exec / files / wait), chaos primitives + (disconnect / connect / partition / heal), private networks (create / add / + status / destroy), environment (preflight / bootstrap), knowledge base, and + meta (version / completion / help) +- Declarative intent.yaml schema covering ~50 fields: + target (local/ssh, runtime, auto_ports), node (type, version, image, ports, + resources, jvm, storage, restart, extra_env, extra_args, labels, networks, + depends_on, healthcheck, ulimits, extra_hosts, entrypoint, logging, + shm_size, jar source URL+SHA256), network_overrides + (seeds, active_peers, p2p_version, discovery, max_connections, …), + witness_key (private_key_env, keystore_path, account_address), + config_overrides (arbitrary HOCON dotted-key escape hatch) +- HOCON two-pass render: in-place key rewrites + appended override block +- Compose render aligned with the official `tronprotocol/java-tron` image: + `/java-tron/conf`, `/java-tron/output-directory`, `/java-tron/logs` +- SSH host-key verification with explicit MITM detection (TOFU opt-in via + `TROND_SSH_ACCEPT_NEW_HOSTS=1`) +- SSH command whitelist enforced at `Exec` entry +- Private key never written to env or stdout — `PrivateKey` type redacted in + every formatter; witness key inlined into HOCON (which is 0600 on disk) +- `--state-dir` / `TROND_STATE_DIR` for parallel test enclaves +- `target.auto_ports: true` allocates free TCP+UDP ports automatically +- `network create` auto-wires `node.active` peering between siblings +- Audit log (JSONL) for every mutating command, streamable via `events --follow` + +**Since** + - **`jvm.extra_opts`** — an escape hatch for JVM flags outside the closed heap/GC field set, appended last so they win on any last-flag-wins option. Needed because trond runs the JAR directly and so never reads @@ -187,6 +235,7 @@ The agent-ergonomics arc lands across four sequenced PRs: - `scripts/install.sh` — single-shot installer with SHA256 verification ### Changed + - `goreleaser` now produces .deb / .rpm / .apk packages alongside the tar.gz archives; release notes group commits by feat/fix - CI matrix expanded: `lint`, `test+coverage`, `govulncheck`, and @@ -206,6 +255,7 @@ The agent-ergonomics arc lands across four sequenced PRs: (was a documented TODO before); refuses `/` and empty paths ### Fixed + - **`config_overrides` rendered Go syntax, not HOCON.** `hoconValue` fell back to `fmt.%v` for slices and maps, emitting `[map[address:T… voteCount:5000]]` — which no HOCON parser accepts — so every list-valued override was @@ -261,6 +311,7 @@ The agent-ergonomics arc lands across four sequenced PRs: the SSH key after apply) ### Security + - **GitHub Releases is the only publication channel.** The Homebrew tap and the `tronprotocol/trond` Docker image were configured and are removed before the first tag. Both needed a long-lived credential in this @@ -336,41 +387,8 @@ The agent-ergonomics arc lands across four sequenced PRs: `monitoring.grafana.admin_password_env` (the NAME of an env var feeding `GF_SECURITY_ADMIN_PASSWORD`) -## [0.1.0-alpha] — 2026-XX-XX - -Initial public alpha. The project transitions from a curated set of HOCON -configuration templates into a CLI for declarative TRON node deployment. - -### Added -- 32 CLI commands across lifecycle (apply / stop / start / restart / upgrade / - rollback / remove), configuration (validate / render / diff / docs), - observability (status / list / logs / health / diagnose / verify / inspect / - events), test-harness SDK (exec / files / wait), chaos primitives - (disconnect / connect / partition / heal), private networks (create / add / - status / destroy), environment (preflight / bootstrap), knowledge base, and - meta (version / completion / help) -- Declarative intent.yaml schema covering ~50 fields: - target (local/ssh, runtime, auto_ports), node (type, version, image, ports, - resources, jvm, storage, restart, extra_env, extra_args, labels, networks, - depends_on, healthcheck, ulimits, extra_hosts, entrypoint, logging, - shm_size, jar source URL+SHA256), network_overrides - (seeds, active_peers, p2p_version, discovery, max_connections, …), - witness_key (private_key_env, keystore_path, account_address), - config_overrides (arbitrary HOCON dotted-key escape hatch) -- HOCON two-pass render: in-place key rewrites + appended override block -- Compose render aligned with the official `tronprotocol/java-tron` image: - `/java-tron/conf`, `/java-tron/output-directory`, `/java-tron/logs` -- SSH host-key verification with explicit MITM detection (TOFU opt-in via - `TROND_SSH_ACCEPT_NEW_HOSTS=1`) -- SSH command whitelist enforced at `Exec` entry -- Private key never written to env or stdout — `PrivateKey` type redacted in - every formatter; witness key inlined into HOCON (which is 0600 on disk) -- `--state-dir` / `TROND_STATE_DIR` for parallel test enclaves -- `target.auto_ports: true` allocates free TCP+UDP ports automatically -- `network create` auto-wires `node.active` peering between siblings -- Audit log (JSONL) for every mutating command, streamable via `events --follow` - ### Repository changes + - HOCON templates remain at the repository root (`main_net_config.conf`, `test_net_config.conf`, `private_net_config.conf`) and continue to track upstream. `make sync-templates` refreshes them @@ -378,5 +396,5 @@ configuration templates into a CLI for declarative TRON node deployment. release time and bundled into the binary so `trond config render` works from any working directory -[Unreleased]: https://github.com/tronprotocol/tron-deployment/compare/v0.1.0-alpha...HEAD -[0.1.0-alpha]: https://github.com/tronprotocol/tron-deployment/releases/tag/v0.1.0-alpha +[Unreleased]: https://github.com/tronprotocol/tron-deployment/compare/v0.1.0...HEAD +[0.1.0]: https://github.com/tronprotocol/tron-deployment/releases/tag/v0.1.0 diff --git a/specs/001-trond-cli-platform/tasks.md b/specs/001-trond-cli-platform/tasks.md index 21262585..ecb2321d 100644 --- a/specs/001-trond-cli-platform/tasks.md +++ b/specs/001-trond-cli-platform/tasks.md @@ -231,7 +231,11 @@ - [ ] T088 Run golangci-lint on entire codebase and fix all findings - [ ] T089 Run `trond config validate` against all example intent files to verify they pass - [ ] T090 Validate quickstart.md scenarios end-to-end -- [ ] T091 Tag v0.1.0-alpha release and verify goreleaser + cosign pipeline +- [ ] T091 Tag v0.1.0 release and verify goreleaser + cosign pipeline + (was `v0.1.0-alpha`; the phased alpha plan further down was never + followed — everything landed on develop untagged and ships as one + `v0.1.0`. `prerelease: auto` would also file any `-alpha` tag as a + pre-release, which `scripts/install.sh` does not resolve.) ---