@pmelab/gtd 22.0.0 → 23.1.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": "22.0.0",
3
+ "version": "23.1.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 —
@@ -58,9 +60,11 @@ enforces it at the OS level. See
58
60
 
59
61
  Run `gtd install` at your repository's root. It writes a `gtd.config.ts` that
60
62
  runs gtd's shipped workflows — commit it; gtd refuses to run without one — and
61
- prints a briefing. Pipe that briefing into your coding agent and answer its
62
- questions. It should build you a script that will autonomously run the process
63
- for you. Ask your agent if you have any questions.
63
+ prints a briefing. The repository need not be a JavaScript project: gtd resolves
64
+ the config's `@pmelab/gtd/*` imports itself, so a Python, Rust or notes
65
+ repository needs no `package.json` and no install. Pipe that briefing into your
66
+ coding agent and answer its questions. It should build you a script that will
67
+ autonomously run the process for you. Ask your agent if you have any questions.
64
68
 
65
69
  ## Why
66
70
 
@@ -96,7 +100,8 @@ that.
96
100
  The fastest way to understand it is to drive a few beats by hand. Any git
97
101
  repository with at least one commit will do once `gtd install` has written its
98
102
  `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`.
103
+ else. Later beats run your test command, set as the `testCommand` workflow
104
+ option in `gtd.config.ts`.
100
105
 
101
106
  ### Beat 1 — `gtd next` says whose turn it is
102
107
 
@@ -415,11 +420,10 @@ noted in steps 3 and 4 below.
415
420
  With no `--provider`, `gtd judge run` picks jev when `TYPESAFE_API_KEY` is
416
421
  set and non-empty and no `--model` is given, else llm — never falling back
417
422
  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):
423
+ variables and a user-level `~/.config/gtd/judge.json` `{ provider, model }`
424
+ choose the judge without editing the driver (flags win over both, in that
425
+ order); `--model` with `--provider fixed`/`jev` is refused. jev and llm exit
426
+ 1 with nothing on stdout when they cannot answer every question):
423
427
  - Every red round after the first: was the failure identical, new, or
424
428
  progress?
425
429
  - After you review: is each of your notes an edit, a question, a nit or
@@ -521,6 +525,14 @@ and remember gtd evaluates that file on every command. A shared workflow package
521
525
  bundling its own `@pmelab/gtd` is checked against the running gtd and refused,
522
526
  naming which side to upgrade, on a flows protocol mismatch.
523
527
 
528
+ Everything else a repository configures — steering-file modes, `gtd ui`
529
+ settings, per-scope skills and file access — goes in the same file's `config`
530
+ export, built with `defineConfig` from `@pmelab/gtd/flows`, which rejects an
531
+ unknown key. `gtd.config.ts` is the only repository config: gtd 23 removed the
532
+ `.gtdrc` files, and a leftover one — in the repository, above it, or in your
533
+ home directory — fails every command until you delete it. See
534
+ [Migrating from `.gtdrc`](https://github.com/pmelab/gtd/blob/main/docs/configuration.md#migrating-from-gtdrc).
535
+
524
536
  ## License
525
537
 
526
538
  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(