diff --git a/.gitignore b/.gitignore index 7af5975f..a61fdf39 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,7 @@ CLAUDE.local.md .coverage/ # ct-conventions, cloned at the tag pinned in AGENTS.md -.conventions/ +.ct-conventions/ + +# ct-agents, cloned at the tag pinned in AGENTS.md +.ct-agents/ diff --git a/AGENTS.md b/AGENTS.md index 11071908..49f478b1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,7 +12,8 @@ CTParser is a single flat module — no submodule split, no `ext/`. src/ # onepass.jl (the `@def` parser), defaults.jl, initial_guess.jl, utils.jl test/ # Test suite: flat files (not test/suite/) docs/ # Documentation site (DocumenterVitepress) -.conventions/ # ct-conventions, cloned at the pinned tag (git-ignored) +.ct-conventions/ # ct-conventions, cloned at the pinned tag (git-ignored) +.ct-agents/ # ct-agents, cloned at the pinned tag (git-ignored) ``` --- @@ -21,26 +22,26 @@ docs/ # Documentation site (DocumenterVitepress) The coding conventions live in [ct-conventions](https://github.com/control-toolbox/ct-conventions), pinned below to a -SemVer release tag (`vX.Y.Z`). Read them from a local clone in `.conventions/` -(git-ignored, not a submodule). If it is missing, or `git -C .conventions describe --tags` +SemVer release tag (`vX.Y.Z`). Read them from a local clone in `.ct-conventions/` +(git-ignored, not a submodule). If it is missing, or `git -C .ct-conventions describe --tags` is not the pinned tag, (re)create it: ```bash -rm -rf .conventions -git -c advice.detachedHead=false clone --quiet --depth 1 --branch v0.7.0 https://github.com/control-toolbox/ct-conventions.git .conventions +rm -rf .ct-conventions +git -c advice.detachedHead=false clone --quiet --depth 1 --branch v0.7.1 https://github.com/control-toolbox/ct-conventions.git .ct-conventions ``` -**Pinned version: ct-conventions v0.7.0.** Cite rules by identifier (`MOD3`, `TST1`), and +**Pinned version: ct-conventions v0.7.1.** Cite rules by identifier (`MOD3`, `TST1`), and state the version you applied in plans and reports. Read in this order: | File | Content | | --- | --- | -| [`rules/general.md`](.conventions/rules/general.md) | Rules that hold everywhere — **always read** | -| [`README.md`](.conventions/README.md) | Index of the rule files, one per area (`MOD`, `TYP`, `DIM`, `EXC`, `PERF`, `DOC`, `TST`, `SITE`, `CHG`, `REL`) | -| [`method.md`](.conventions/method.md) | How to work: tests, coverage, docs build, output capture | -| [`plan-template.md`](.conventions/plan-template.md) | Template for a substantial piece of work | +| [`rules/general.md`](.ct-conventions/rules/general.md) | Rules that hold everywhere — **always read** | +| [`README.md`](.ct-conventions/README.md) | Index of the rule files, one per area (`MOD`, `TYP`, `DIM`, `EXC`, `PERF`, `DOC`, `TST`, `SITE`, `CHG`, `REL`) | +| [`method.md`](.ct-conventions/method.md) | How to work: tests, coverage, docs build, output capture | +| [`plan-template.md`](.ct-conventions/plan-template.md) | Template for a substantial piece of work | How agents behave on these repositories is described in [ct-agents](https://github.com/control-toolbox/ct-agents). The CI workflows and their @@ -58,7 +59,7 @@ trigger labels are described in - **Structured errors** — seven typed exceptions; pick by the choice rule (`EXC1`). - **Type stability enforced** — hot paths `@inferred`-clean, verified with JET (`TYP8`, `PERF1`–`PERF5`). - **1-D is a scalar** — a one-dimensional state/control/variable is a `Number` (`DIM1`). -- **Plan before code** — a local agent proposes a plan ([`plan-template.md`](.conventions/plan-template.md)) and waits for confirmation before working on code. The process for remote agents is still to be defined. +- **Plan before code** — a local agent proposes a plan ([`plan-template.md`](.ct-conventions/plan-template.md)) and waits for confirmation before working on code. The process for remote agents is still to be defined. - **Docstrings last** — written once the implementation is stable (`DOC1`–`DOC8`). - **The human merges** — an agent never merges a pull request, except a release PR in `autonomous` mode, and then only with `release.jl merge` (see below). @@ -66,8 +67,21 @@ trigger labels are described in ## Recurring tasks +How a recurring task is done lives in [ct-agents](https://github.com/control-toolbox/ct-agents), +pinned below to a SemVer release tag (`vX.Y.Z`). Read it from a local clone in `.ct-agents/` +(git-ignored, not a submodule). If it is missing, or `git -C .ct-agents describe --tags` is +not the pinned tag, (re)create it: + +```bash +rm -rf .ct-agents +git -c advice.detachedHead=false clone --quiet --depth 1 --branch v0.2.0 https://github.com/control-toolbox/ct-agents.git .ct-agents +``` + +**Pinned version: ct-agents v0.2.0.** State it, with the ct-conventions version, in +plans and reports. + - **Release.** When asked, in any language, to prepare a release, follow - [`recipes/release.md`](https://github.com/control-toolbox/ct-agents/blob/main/recipes/release.md) - of ct-agents (rules `REL1`–`REL7`). Read it with - `gh api repos/control-toolbox/ct-agents/contents/recipes/release.md -H "Accept: application/vnd.github.raw"`. - Stable or beta is the human's choice: if the request does not say, ask; never infer it. + [`recipes/release.md`](.ct-agents/recipes/release.md) (rules `REL1`–`REL7`). Stable or + beta is the human's choice: if the request does not say, ask; never infer it. State in + the proposal the versions you apply: ct-agents, ct-conventions, and the commit of the + CTActions clone `release.jl` runs from. diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e049600..85b00e69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - ct-conventions pinned at `v0.7.0` in `AGENTS.md`: the release rules `REL1`–`REL7` in the index, and a *Recurring tasks* section pointing to the release recipe of ct-agents. +- ct-agents pinned at `v0.2.0` and ct-conventions at `v0.7.1` in `AGENTS.md`: the recipes (the + release) are read from a git-ignored clone in `.ct-agents/` at that tag, not from `main` + of ct-agents, and the proposal of a release states the versions applied. The clone of the + conventions is now `.ct-conventions/` (it was `.conventions/`), like `.ct-agents/`. ### 🧪 Testing diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4480cb9f..f5b0d2a8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,6 +17,6 @@ If you want to ask a question, feel free to start a discussion [here](https://gi ## Developer Resources -The [ct-conventions](https://github.com/control-toolbox/ct-conventions) repository (coding rules, method, plan template) is pinned to a SemVer release tag in `AGENTS.md` ("Pinned version"). Read it from a local clone in `.conventions/`, which git ignores; `AGENTS.md` gives the clone command. +The [ct-conventions](https://github.com/control-toolbox/ct-conventions) repository (coding rules, method, plan template) is pinned to a SemVer release tag in `AGENTS.md` ("Pinned version"). Read it from a local clone in `.ct-conventions/`, which git ignores; `AGENTS.md` gives the clone command. It is not a git submodule: `Pkg.add` on Julia 1.10 fails on a package whose tree contains one (`cannot get submodules without a working tree`). To bump it, change the tag in `AGENTS.md` (the "Pinned version" line and the clone command), then re-clone.