@pmelab/gtd 21.1.0 → 23.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gtd",
3
- "version": "21.1.0",
3
+ "version": "23.0.0",
4
4
  "description": "Drive the gtd loop inside Claude Code: agent turns run as subagents, gtd decides every beat",
5
5
  "author": {
6
6
  "name": "Philipp Melab"
package/README.md CHANGED
@@ -34,8 +34,8 @@ none is optional. See
34
34
  [Setup](https://github.com/pmelab/gtd/blob/main/docs/setup.md) for the list, the
35
35
  install flags, and the never-install-the-plugin caveat. Skills are declared per
36
36
  scope, and restricted per turn where the driver can; each bundled scope has its
37
- own addressable `.gtdrc` `skills:` entry — see
38
- [Configuration](https://github.com/pmelab/gtd/blob/main/docs/configuration.md#the-skills-key)
37
+ own addressable `config.skills` entry in `gtd.config.ts` — see
38
+ [Configuration](https://github.com/pmelab/gtd/blob/main/docs/configuration.md#skills)
39
39
  to repoint one to a set your own harness has instead.
40
40
 
41
41
  Each scope also declares which files its agent turns may read and write;
@@ -45,8 +45,10 @@ enforces it at the OS level. See
45
45
  [Configuration](https://github.com/pmelab/gtd/blob/main/docs/configuration.md#file-access).
46
46
 
47
47
  > **`fastTestCommand` is required, with no fallback to `testCommand`.** Set it
48
- > (everything but e2e) under `env:` in `.gtdrc` or as `GTD_FASTTESTCOMMAND`; gtd
49
- > stops at the start gate, writing `.gtd/SETUP.md`, until it is.
48
+ > (everything but e2e) as a workflow option in `gtd.config.ts`
49
+ > (`feature({ fastTestCommand: "npm run test:fast" })`) or as
50
+ > `GTD_FASTTESTCOMMAND`; gtd stops at the start gate, writing `.gtd/SETUP.md`,
51
+ > until it is.
50
52
 
51
53
  > **A repository's `gtd.config.ts` is code, and gtd runs it.** A custom workflow
52
54
  > is a TypeScript module, and every gtd command that looks at workflow state —
@@ -96,7 +98,8 @@ that.
96
98
  The fastest way to understand it is to drive a few beats by hand. Any git
97
99
  repository with at least one commit will do once `gtd install` has written its
98
100
  `gtd.config.ts` and you have committed it — the first two beats need nothing
99
- else. Later beats run your test command, set under `env:` in `.gtdrc`.
101
+ else. Later beats run your test command, set as the `testCommand` workflow
102
+ option in `gtd.config.ts`.
100
103
 
101
104
  ### Beat 1 — `gtd next` says whose turn it is
102
105
 
@@ -415,11 +418,10 @@ noted in steps 3 and 4 below.
415
418
  With no `--provider`, `gtd judge run` picks jev when `TYPESAFE_API_KEY` is
416
419
  set and non-empty and no `--model` is given, else llm — never falling back
417
420
  across them; the `GTD_JUDGE_PROVIDER` / `GTD_JUDGE_MODEL` environment
418
- variables, a user-level `~/.config/gtd/judge.json` `{ provider, model }`, and
419
- a `.gtdrc` `judge:` key choose the judge without editing the driver (flags
420
- win over all three, in that order); `--model` with `--provider fixed`/`jev`
421
- is refused. jev and llm exit 1 with nothing on stdout when they cannot answer
422
- every question):
421
+ variables and a user-level `~/.config/gtd/judge.json` `{ provider, model }`
422
+ choose the judge without editing the driver (flags win over both, in that
423
+ order); `--model` with `--provider fixed`/`jev` is refused. jev and llm exit
424
+ 1 with nothing on stdout when they cannot answer every question):
423
425
  - Every red round after the first: was the failure identical, new, or
424
426
  progress?
425
427
  - After you review: is each of your notes an edit, a question, a nit or
@@ -512,12 +514,23 @@ can add its own. `gtd --workflow <name>` starts any workflow by name.
512
514
  The workflow itself is a plain async TypeScript function, and the
513
515
  `gtd.config.ts` at the repository root names it: the one `gtd install` writes
514
516
  re-exports the shipped workflows from `@pmelab/gtd/workflows`, and the pieces
515
- they are built from are exported for yours to reuse. See
517
+ they are built from are exported for yours to reuse. Each shipped workflow is a
518
+ factory — `feature({ testCommand: "npm run ci" })` — whose options gtd validates
519
+ when it loads the config: a misspelled or mistyped one fails every command,
520
+ naming the workflow, the key and what was expected. See
516
521
  [Configuration](https://github.com/pmelab/gtd/blob/main/docs/configuration.md) —
517
522
  and remember gtd evaluates that file on every command. A shared workflow package
518
523
  bundling its own `@pmelab/gtd` is checked against the running gtd and refused,
519
524
  naming which side to upgrade, on a flows protocol mismatch.
520
525
 
526
+ Everything else a repository configures — steering-file modes, `gtd ui`
527
+ settings, per-scope skills and file access — goes in the same file's `config`
528
+ export, built with `defineConfig` from `@pmelab/gtd/flows`, which rejects an
529
+ unknown key. `gtd.config.ts` is the only repository config: gtd 23 removed the
530
+ `.gtdrc` files, and a leftover one — in the repository, above it, or in your
531
+ home directory — fails every command until you delete it. See
532
+ [Migrating from `.gtdrc`](https://github.com/pmelab/gtd/blob/main/docs/configuration.md#migrating-from-gtdrc).
533
+
521
534
  ## License
522
535
 
523
536
  MIT
@@ -4,7 +4,7 @@ const NEUTRAL = "You are a coding agent working on the task you are given."
4
4
 
5
5
  // `general-purpose` cannot carry a restriction, so every prompt turn gets a
6
6
  // registered persona. The name hashes everything the spec depends on: a
7
- // `.gtdrc` change or gtd upgrade mid-session must register a fresh one.
7
+ // `gtd.config.ts` change or gtd upgrade mid-session must register a fresh one.
8
8
  export async function personaSpec(t: Pick<Turn, "scope" | "system" | "skills">) {
9
9
  const key = JSON.stringify([t.scope, t.system ?? "", t.skills])
10
10
  const digest = new Uint8Array(