Files
marketplace/plugins/tdl/AGENTS.md
T
naudachu 01fb5a2703 feat: publish releases with this repository's own SDK code
There is no CI: the instance has no act_runner and none is planned, so releases
are cut by hand. That makes `make check` the only thing standing between a
mistake and the tracker, and it is one command: gofmt, vet, the suite with the
cache defeated, `go mod verify`, a vendored build, and `kettle gen skills
--check`. The last one is the invariant worth having — the plugin's SKILL.md
command reference is generated from the binary's registry, so a flag that
changed cannot ship with documentation that recommends the old one.

`cli/cmd/release` publishes to Gitea using the same SDK the binary already
vendors, which is a pleasing thing to be able to say: nothing third-party
handles the artifacts. It is a second binary rather than a `kettle` subcommand
on purpose — `kettle`'s command tree is what generates the plugin's skills, so a
verb there ships to every operator, and publishing a release is build
infrastructure. It is idempotent end to end: an existing release for the tag is
reused, an asset of the same name is replaced rather than doubled, and a retried
run converges instead of duplicating.

`make release` refuses three things, each with its own message: a dirty working
tree, a TAG that is not what `git describe` reports, and a tag the remote does
not have. A release built from uncommitted code is unreproducible and nobody
finds out until they need to reproduce it.

`kettle version` reports the stamp, the toolchain and the VCS revision. The
default is `dev`, and a hand build says so and means it — a binary out of
somebody's working tree is not a release and must not claim to be one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-12 01:01:27 +05:00

2.8 KiB

AGENTS.md — the tdl plugin

Three Dots Labs Go conventions as an enforceable rule set. One skill, /tdl:audit, which does two things with the same body of rules: audits a Go project against them, or scaffolds code that already follows them.

No binary, no hooks, no state, no network. Everything here is markdown an agent reads.

.claude-plugin/plugin.json      the manifest
skills/audit/
  SKILL.md                      the procedure: parse args, load rules, audit or scaffold
  references/rules-*.md         nine rule files, loaded in full before any operation
  templates/*.md                nine scaffolds, one per generated artefact

The rules

Nine files, by subject: architecture, domain, cqrs, repository, errors, ports, naming, codestyle, watermill. They encode the conventions of the wild-workouts-go-ddd-example reference implementation and the four canonical Three Dots Labs articles — DDD Lite in Go, Introducing Clean Architecture, Basic CQRS in Go, Repository Pattern in Go.

The skill loads all nine before it does anything, in parallel, and the reason is that the rules cross-reference each other: a naming finding is only correct in the light of the layer the file sits in, and an audit that read one file would report violations of a rule it had not read the exception to.

Findings are reported by severity, and the severity is part of the rule, not a judgement made at report time. That is what makes the output usable: a run that flags everything equally is a run somebody stops reading.

The templates

Nine, one per artefact the scaffolder can produce: service, command, query, entity, repo, unified_server, watermill_router, event_handler, event_publisher.

They exist so that "generate a handler" and "audit a handler" cannot disagree — a template that would fail the audit is a bug in the template. When a rule changes, the templates it touches change in the same edit; that is the plugin's only real invariant and nothing mechanical checks it.

Usage

/tdl:audit                                  # audit the working directory
/tdl:audit ./internal/orders                # audit one path
/tdl:audit scaffold command PlaceOrder      # generate from a template
/tdl:audit scaffold service Billing

The scaffold types are listed in the skill's argument parsing, and an argument that matches no pattern gets usage help rather than a guess.

Keeping this file true

  • Scope: this plugin's layout, the two things the skill does, and the template ⇄ rule invariant. Files: SKILL.md, references/, templates/.
  • Update it when a rule file or a template is added or removed (both lists above name every one), a scaffold type is added, or the skill grows a third mode.
  • Do not copy rule content here. The references are the rules; this file says what they are for.