Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
92 changes: 55 additions & 37 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -336,47 +387,14 @@ 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
- Embedded copies under `internal/render/templates/` are kept in sync at
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
6 changes: 5 additions & 1 deletion specs/001-trond-cli-platform/tasks.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.)

---

Expand Down
Loading