Skip to content

1.0.0

Choose a tag to compare

@github-actions github-actions released this 10 Aug 19:02
· 29 commits to main since this release
2109922

v1.0.0 - 2026-08-11

Added

  • Add the four SQS dead-letter redrive operations (ListDeadLetterSourceQueues, Start/List/CancelMessageMoveTask), completing SQS at 23 operations (#94)
  • Document the ServicePlugin API and its v1.x stability policy in docs/plugin-api.md, enforced by a conformance test over every registered service (#96)
  • Enable boto3 compatibility tests for CodeConnections, DMS, and Verified Permissions (#96)
  • Add 24 core-service operations: EC2 instance lifecycle, region/AZ and tag queries, security group rules, Elastic IP association, and IAM group policy management (#97)
  • Serve ~2,200 standard CRUD operations across the 46 JSON-protocol services from a Smithy-driven fallback engine (internal/shared/crud); hand-written operations take precedence and unclassifiable ones still return an error. See docs/crud-engine.md (#98)
  • Homebrew installation via brew install skyoo2003/tap/devcloud, published to the tap on each release (#121)
  • Per-operation fidelity manifest declaring every operation as hand-verified, auto-crud or unimplemented, exposed at GET /devcloud/api/fidelity and enforced by a build-failing coverage test (#126)
  • Real tag support for KMS, CloudWatch and EventBridge — TagResource, UntagResource and ListTagsForResource/ListResourceTags now persist tags per resource ARN instead of being echoed by the generic CRUD engine (#126)
  • A published compatibility policy (docs/compatibility-policy.md) stating what v1.0 guarantees across the 1.x line — config keys, environment variables, the CLI, admin API response keys, fidelity tier names, and the response shape of hand-verified operations covered by the boto3 compatibility suite — what it explicitly does not guarantee, and the deprecation procedure that precedes any removal (#129)

Changed

  • Rename internal/dashboard to internal/admin and the dashboard.enabled config key to admin.enabled. The old key is honoured for one release with a deprecation warning. (#111)
  • Build the request log collector only when admin.enabled is set, dropping a per-request mutex lock and ring-buffer write from the AWS request hot path (#112)
  • The services config block is now optional: omit it and every registered service starts with data_dir ./data/<service>; list services and only those start. Replaces 325 lines of identical boilerplate. (#120)
  • Release archives now carry the docs/ tree alongside the binary, so the documentation you unpack — including the fidelity manifest and the release's compatibility promises — describes exactly the version you downloaded (#127)

Removed

  • Remove the dead, unregistered STS provider stub (internal/services/sts); STS is served by the IAM package (#96)
  • Extract the web dashboard to a separate repository. The binary builds and serves no UI, only the opt-in admin API at /devcloud/api/*. (#111)
  • Remove dead surface found by a repo-wide over-engineering audit: the event bus and admin WebSocket, the GetMetrics plugin API and /devcloud/api/metrics (resource counts remain on /devcloud/api/services), shared.ResourceStore, gateway.ExtractAccountID, and the auth.enabled key — still read for one release so enabling it warns that credentials are accepted regardless. Drops the gorilla/websocket dependency. (#120)

Fixed

  • Route X-Amz-Target prefixes that contain dots (CodeConnections, DMS) to the right service; they misrouted to CloudTrail (#96)
  • Unimplemented operations return NotImplemented (HTTP 501) instead of an empty 200, so SDKs can tell a not-yet-emulated operation from an invalid one (#96)
  • EC2: Describe{SecurityGroups,Tags,Addresses} honor their selectors and Filters instead of returning every resource, unknown IDs raise NotFound, batch Start/Stop is atomic, and duplicate or absent security group rules are rejected (#97)
  • DynamoDB: numeric sort keys order by true value over the full 38 digits via a NUMTEXT collation, instead of a float CAST that lost precision past 2^53 (#97)
  • Config-time warnings (deprecated dashboard key, unknown DEVCLOUD_SERVICES tier) now honor logging.format/logging.level instead of always printing as plain text before the logger is configured (#113)
  • The weekly Smithy model sync could never report an update: it skipped every model already in the tree (all of them), and 14 entries of its hand-maintained service list 404'd upstream. The list is now derived from the tree, the workflow re-downloads with --refresh, and downloads are atomic so a failed fetch cannot delete a committed model. (#120)
  • Codegen now parses operations bound to Smithy resource shapes, recovering 285 operations that were invisible to the generator (bedrock 0 of 101, lambda 19 of 85, ecs 12 of 76, transfer 29 of 71, sso-admin 67 of 79) (#126)
  • The fidelity manifest now reads each provider's actual dispatch instead of intersecting with the Smithy model, recovering 226 served operations it had hidden (dynamodbstreams listed 4 of its 22, acm's UpdateCertificate, bedrock's InvokeModelWithResponseStream) and dropping 5 non-operations it had invented (identitystore Description/DisplayName/Emails, pipes DELETE/POST) (#126)
  • EventBridge now drops a bus's or rule's tags when it is deleted. ARNs are derived from the name, so recreating a deleted resource reused its ARN and inherited the previous tags (#126)
  • Restored CloudWatch's 17 CRUD-engine operations. The gateway picks the protocol from the request, not from the provider, so CloudWatch reaches the engine whenever a client speaks JSON — filtering the registry by the provider's declared protocol had removed that coverage outright (#126)
  • EventBridge rule ARNs now name their event bus, as AWS does. A rule name is unique per bus, so same-named rules on two custom buses previously shared one ARN — and with it, one tag set, where tagging one rule changed the other's and deleting one wiped the survivor's (#126)
  • CloudWatch now drops an alarm's tags when the alarm is deleted, so recreating an alarm under the same name no longer inherits the old one's tags (#126)
  • Downloadable binaries now start, where releases built with CGO_ENABLED=0 against a SQLite driver that required cgo exited at startup — every tar.gz/zip binary, the Homebrew formula and the versioned *-alpine images. The driver is now pure Go, so no build needs a C toolchain or SQLite headers (#128)
  • Service selection now matches what the docs promise: an empty services block starts nothing rather than every registered service, and DEVCLOUD_SERVICES names the running set outright instead of intersecting with the block. Previously DEVCLOUD_SERVICES=sqs alongside a block listing only s3 started nothing at all (#129)
  • CloudFront no longer fabricates a success for the 122 operations the fidelity manifest classifies as unimplemented, where its dispatch fallback answered HTTP 200 with an empty XML document that boto3 parses as a successful empty result. It now returns NotImplemented (HTTP 501), matching the other 32 providers that decline from their own dispatch default (#129)
  • Generated routers now honour route patterns that constrain the query string, so operations distinguished only by a query parameter are reachable — matchURI split the whole pattern into path segments, leaving CloudFront TagResource and UntagResource implemented but unroutable. Query-constrained routes are tried ahead of unconstrained ones, so a bare path cannot shadow a more specific route (#129)
  • Released binaries now register their services, where GoReleaser built cmd/devcloud/main.go rather than the package and dropped the imports.go that blank-imports all 104 services — every archive, the Homebrew formula and the container images exited at startup with unknown service: s3. The release gate now builds with GoReleaser instead of compiling the package, which is why the boto3 suite missed it (#131)

Documentation

  • Corrected what the fidelity manifest says an unimplemented operation returns: it claimed JSON and Query services answer InvalidAction (HTTP 400), where only the 46 providers falling through to the CRUD engine do and 32 answer NotImplemented (HTTP 501) from their own dispatch default. Only the failure itself is stable — the specific code and status are documented, not guaranteed (#129)
  • The roadmap, architecture and governance docs no longer describe DevCloud as pre-1.0. All three ship inside the release archive, so a v1.0 download would have carried a roadmap listing its own release as pending, an architecture overview naming Phase 1 as current, and a governance doc calling the API unstable — contradicting the compatibility policy packaged beside them (#130)