@pmelab/gtd 9.1.2 → 9.3.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.
- package/README.md +178 -113
- package/dist/gtd.bundle.mjs +164 -131
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,9 +21,10 @@ No chat scrollback. No lost sessions. No infinite fix loops. Just git.
|
|
|
21
21
|
- **Shareable.** Push the branch, and the workflow travels with it — the state
|
|
22
22
|
lives in the commits, so another machine (or another person) picks up exactly
|
|
23
23
|
where you left off.
|
|
24
|
-
- **Files, not chat.** Plans live in `.gtd
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
- **Files, not chat.** Plans live in `.gtd/` steering files (`REQUIREMENTS.md`,
|
|
25
|
+
`ARCHITECTURE.md`, the package files under `.gtd/packages/`). Request changes
|
|
26
|
+
by editing them, approve by leaving the tree clean — all in your own editor.
|
|
27
|
+
There is no chat UI to lose.
|
|
27
28
|
- **Harness agnostic.** gtd emits prompts to stdout (or JSON). Claude Code, a
|
|
28
29
|
bash loop, a CI job, or you reading it out loud — the workflow doesn't care
|
|
29
30
|
who executes it.
|
|
@@ -61,17 +62,23 @@ gtd init
|
|
|
61
62
|
This writes a minimal `.gtdrc.json` seeding the one variable most projects
|
|
62
63
|
change — the test command (`vars.testCommand`, defaulting to `npm test`) — plus
|
|
63
64
|
a top-level `modes:` block suggesting **Prettier** as the steering-file
|
|
64
|
-
formatter (`npx prettier --write` for the built-in `qa`/`review
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
up. To customize the machine itself, add a `workflow:` key (there is no default
|
|
65
|
+
formatter (`npx prettier --write` for the built-in `qa`/`review` modes — format
|
|
66
|
+
only, so gtd still validates them); edit or drop either freely (point
|
|
67
|
+
`testCommand` at your suite, swap Prettier for dprint or a script, delete a
|
|
68
|
+
key). It writes **no** `workflow:` key — the machine is built in — so review and
|
|
69
|
+
commit the file before your first `gtd land`. `gtd init` takes no argument and
|
|
70
|
+
refuses to clobber an existing config; it may also run in a plain parent
|
|
71
|
+
directory (not a git repo) to seed a shared config a nested repo picks up. To
|
|
72
|
+
customize the machine itself, add a `workflow:` key (there is no default
|
|
73
73
|
fallback to merge over — a `workflow:` is the whole definition).
|
|
74
74
|
|
|
75
|
+
gtd requires a repository with **at least one commit** before any state command
|
|
76
|
+
(`land`, `--entry`, `next`, `status`, `abandon`, `restore`, `validate`) will run
|
|
77
|
+
— there is no workflow state to derive from an empty history. Committing the
|
|
78
|
+
`.gtdrc.json` above (or anything else) satisfies this by construction;
|
|
79
|
+
`gtd init`, `gtd install`, `gtd lsp`, `gtd visualize`, and `gtd check` are
|
|
80
|
+
unaffected since none of them derive workflow state.
|
|
81
|
+
|
|
75
82
|
## How it works
|
|
76
83
|
|
|
77
84
|
gtd is a small **pattern machine**: named states, each awaiting one actor and
|
|
@@ -110,76 +117,100 @@ together: the `action` leads when the edge declares one, with the raw pattern
|
|
|
110
117
|
(and `describe`) still shown alongside it, so a human choosing between routes
|
|
111
118
|
reads intent first, glob second.
|
|
112
119
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
and the
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
`.gtd/REVIEW.md
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
120
|
+
**Your input is a spec, not the work.** The unified workflow treats ANY change
|
|
121
|
+
to the tree — a hand-edit to real code, a scratch note in some file, anything at
|
|
122
|
+
all — as a sketch to be finished, never as work to be preserved: there is no
|
|
123
|
+
fork on which steering file you happen to create, and `idle` has exactly one
|
|
124
|
+
outgoing edge, into `unwind`. `.gtd/TODO.md` (the `todoFile` var) is a good
|
|
125
|
+
default place to start sketching when you'd rather write a note than touch code
|
|
126
|
+
— despite living beside the workflow's own state files, that sketch is your
|
|
127
|
+
input for `design.triage` to fold in, never gtd bookkeeping to preserve or
|
|
128
|
+
ignore. `unwind` reverts that whole diff back out of your working tree
|
|
129
|
+
(`git revert --no-commit` against the commit it just landed in) before planning
|
|
130
|
+
ever starts — your tree is back to exactly what it was, and your intent doesn't
|
|
131
|
+
disappear, it survives in history for `design.triage` to read.
|
|
132
|
+
|
|
133
|
+
From there, `start-gate.check` runs your test suite on the tree as it now stands
|
|
134
|
+
— which, thanks to the unwind, is simply your repo's own baseline. The rule is
|
|
135
|
+
the plain one: the baseline must be green. A red run halts the process and tells
|
|
136
|
+
you to repair it first (that's what `gtd --entry fix-precheck` is for);
|
|
137
|
+
`review-gate` follows the same rule.
|
|
138
|
+
|
|
139
|
+
Once past the gate, `design.triage` reads the diff that started the process
|
|
140
|
+
itself — the prompt never inlines it; it finds the entry commit (the one
|
|
141
|
+
`unwind` reverted) and runs `git show` against it — and groups that diff into an
|
|
142
|
+
ORDERED list of **concerns**, each one able to leave the test suite green on its
|
|
143
|
+
own, classifying each as **product** (a user-facing/requirements decision) or
|
|
144
|
+
**technical** (an implementation decision). It raises open questions for the
|
|
145
|
+
product concerns only, in `.gtd/REQUIREMENTS.md`, folding EVERYTHING the entry
|
|
146
|
+
commit added into those concerns — a scratch sketch and a hand-edited code
|
|
147
|
+
change alike, since the unwind already reverted both; nothing is left to delete.
|
|
148
|
+
A shared check+answer gate then probes `.gtd/REQUIREMENTS.md` for unanswered
|
|
149
|
+
questions: each open question offers a couple of candidate answers plus a
|
|
150
|
+
`- [ ] _your answer_` slot, and you tick exactly one per question (the gate
|
|
151
|
+
won't let the phase advance while any question is unanswered) — but a phase
|
|
152
|
+
whose document has no open questions skips that human stop entirely and falls
|
|
153
|
+
straight through.
|
|
154
|
+
|
|
155
|
+
Once the product questions are settled, `architecture.author` picks up as a
|
|
156
|
+
**cold reader** — a separate machine with its own memory scope, so it does not
|
|
157
|
+
resume the triage conversation but reads `.gtd/REQUIREMENTS.md` in full — and
|
|
158
|
+
develops the _how_ for each settled concern, raising only technical open
|
|
159
|
+
questions in `.gtd/ARCHITECTURE.md` (routed through that same shared
|
|
160
|
+
check+answer gate shape, again skipping the human stop when nothing is open),
|
|
161
|
+
deleting `.gtd/REQUIREMENTS.md` once its content is folded in. Once those are
|
|
162
|
+
settled, `architecture.decompose` is a purely mechanical write-out — **one
|
|
163
|
+
package file per concern**, in the settled order, with no merge/split judgement
|
|
164
|
+
of its own (that already happened in triage's grouping) — handing off to the
|
|
165
|
+
per-package build queue: each package (a set of independent tasks a single build
|
|
166
|
+
turn fans out to parallel subagents) runs its own test loop and a per-package
|
|
167
|
+
**agentic review** that verifies it against its own spec. A package whose work
|
|
168
|
+
already landed (an earlier package's fix turn pulled it in) is not a dead end:
|
|
169
|
+
the build turn records per-criterion evidence in `.gtd/SATISFIED.md` instead of
|
|
170
|
+
implementing anything, and the package still goes through the checks and the
|
|
171
|
+
spec review before closing out. If a queue item ever _does_ dead-end (a build
|
|
172
|
+
turn that authors nothing stalls), the supported recovery is to write that same
|
|
173
|
+
file yourself and `gtd land` — no hand-authored state commit.
|
|
174
|
+
|
|
175
|
+
The process converges on that same shared tail: an agent hands you a
|
|
176
|
+
`.gtd/REVIEW.md` checkbox review of the diff — the prompt never inlines the diff
|
|
177
|
+
itself; it names the commit the changes are based at and the agent runs
|
|
178
|
+
`git diff` to read the range before writing the review. While the process rests
|
|
179
|
+
at that gate, the landing script opens a **review checkout window**: HEAD is
|
|
180
|
+
rewound to the review base with the working tree untouched, so the whole
|
|
181
|
+
reviewable change shows up as ordinary uncommitted changes in your editor's
|
|
182
|
+
normal git integration (and files added during the process show up as ordinary
|
|
183
|
+
untracked files, so discarding one deletes it — an untracked file you leave
|
|
184
|
+
alone is not a pending change, and only actually removing it from disk counts as
|
|
185
|
+
a deletion). The next landing's own script closes the window before it commits.
|
|
186
|
+
Tick a box as you review each hunk (ticking just records "I read this"), and
|
|
187
|
+
leave a **comment** to request changes: a note on a line, an inline
|
|
188
|
+
`// TODO`-style comment in the code, or a direct code edit. Any comment sends a
|
|
189
|
+
build + re-review round — an agent first turns your comments into an explicit
|
|
190
|
+
instruction list, then a build turn implements it (a re-review then covers only
|
|
191
|
+
the follow-through, and a hand-edit is treated as your own fix the agent
|
|
192
|
+
completes without reverting your lines; a comment can't be silently dropped — a
|
|
193
|
+
build turn that addresses nothing is refused). The build turn that follows
|
|
194
|
+
through on feedback and the turn that drafts the final squash message both
|
|
195
|
+
resume the same session that built the feature in the first place, since the
|
|
196
|
+
review tail is nested inside that build identity rather than sitting beside it.
|
|
197
|
+
Ticking every box with no comment is the sign-off, which collapses the whole
|
|
198
|
+
process into one commit (a **squash finale** whose message an agent drafts).
|
|
199
|
+
Landing with a box still unticked and no comment is refused (finish reviewing
|
|
200
|
+
first), as is deleting `.gtd/REVIEW.md`. Both refusals hold wherever the review
|
|
201
|
+
doc lives: repointing `reviewFile` out of `.gtd/` (say to `REVIEW.md` at the
|
|
202
|
+
repo root) changes nothing about them — your own edit to the review doc is never
|
|
203
|
+
mistaken for a code comment, and the doc's pre-turn copy is read at the review
|
|
204
|
+
window's saved head rather than at the rewound `HEAD`.
|
|
205
|
+
|
|
206
|
+
A second entry, the same review tail's own direct entry point —
|
|
176
207
|
`gtd --entry review-gate.check --var reviewBase=<commitish>` starts a brand new
|
|
177
208
|
process reviewing `<commitish>..HEAD` with no build of its own, e.g. a
|
|
178
209
|
colleague's PR branch (`review-gate.check`'s `reviewBase:` is a template bound
|
|
179
210
|
to the `reviewBase` var, so supplying it via `--var` fixes the whole process's
|
|
180
211
|
diff base to that commitish). Its squash keeps and describes only the fixes made
|
|
181
212
|
_during_ the review (not the reviewed changeset); a clean sign-off with no fixes
|
|
182
|
-
becomes an empty `chore: human review` commit. A
|
|
213
|
+
becomes an empty `chore: human review` commit. A third entry,
|
|
183
214
|
`gtd --entry fix-precheck`, starts from a clean `idle` and goes straight into
|
|
184
215
|
repairing a red baseline — repair, review, and squash into one commit. If the
|
|
185
216
|
suite is already green there is nothing to fix, and the log is left untouched —
|
|
@@ -191,19 +222,23 @@ no commit is left behind.
|
|
|
191
222
|
_extra_ reachability root (and drives a badge in `gtd visualize`) for a state
|
|
192
223
|
that would otherwise be unreachable from the ordinary `idle` rest —
|
|
193
224
|
`review-gate.check` and `fix-precheck` need it for exactly that reason, while
|
|
194
|
-
`
|
|
195
|
-
|
|
196
|
-
state flags
|
|
197
|
-
`entry: true` is not a precondition for `--entry`
|
|
225
|
+
`start-gate.check` carries it too (the bundled template dedups its two
|
|
226
|
+
`entryGate` instances — `start-gate` and `review-gate` — into one shared
|
|
227
|
+
machine, so flagging the shared state flags both) even though `idle` already
|
|
228
|
+
reaches it the ordinary way. `entry: true` is not a precondition for `--entry`
|
|
229
|
+
to target a state.
|
|
198
230
|
|
|
199
231
|
Every agent state routes its model through two `vars` tiers — `plannerModel`
|
|
200
232
|
(heavier planning and review) and `coderModel` (the coding turns) — so you can
|
|
201
233
|
repoint the models globally in one place (a `vars:` edit or a `GTD_PLANNERMODEL`
|
|
202
|
-
override) instead of per state. Steering-file path vars (`
|
|
203
|
-
`reviewFile`, …) work the same way, and propagate to the `on`
|
|
204
|
-
route on them too — a repointed path var actually reroutes the
|
|
205
|
-
the templates that read/write the file.
|
|
206
|
-
`.gtd`
|
|
234
|
+
override) instead of per state. Steering-file path vars (`todoFile`,
|
|
235
|
+
`feedbackFile`, `reviewFile`, …) work the same way, and propagate to the `on`
|
|
236
|
+
patterns that route on them too — a repointed path var actually reroutes the
|
|
237
|
+
machine, not just the templates that read/write the file. `todoFile` (default
|
|
238
|
+
`.gtd/TODO.md`, `idle`'s own `file:` hint) is the one exception: it's the only
|
|
239
|
+
per-file var gtd never writes and never reads, since it names your own sketch
|
|
240
|
+
pad, not a file any state produces. A separate `stateDir` var (default `.gtd`)
|
|
241
|
+
names only where the check scripts keep their own scratch/bookkeeping,
|
|
207
242
|
independent of the per-file vars — relocate one steering file without touching
|
|
208
243
|
it.
|
|
209
244
|
|
|
@@ -280,7 +315,9 @@ Commands:
|
|
|
280
315
|
non-zero when there are any. Resolves no workflow state and
|
|
281
316
|
reads no config — standalone, runnable from any directory
|
|
282
317
|
with <mode>/<file> given explicitly. This is what a
|
|
283
|
-
workflow's emitted validation script invokes as a leaf step
|
|
318
|
+
workflow's emitted validation script invokes as a leaf step.
|
|
319
|
+
--open-questions runs the qa unanswered-questions predicate
|
|
320
|
+
instead (see --help)
|
|
284
321
|
install Print a complete, self-contained briefing that teaches an
|
|
285
322
|
agent (or a human) to build a gtd driver in any shell or
|
|
286
323
|
runtime — the self-serve version of README's 'Writing
|
|
@@ -303,6 +340,10 @@ Options:
|
|
|
303
340
|
(with --entry; repeatable) supply a fixed it.vars
|
|
304
341
|
override for the new process; the name must already be
|
|
305
342
|
declared by the workflow's own vars: or the .gtdrc vars:
|
|
343
|
+
--open-questions (gtd check only) ignore <mode>'s structural findings and
|
|
344
|
+
instead run the qa open-questions predicate over <file>,
|
|
345
|
+
printing each unanswered question one per line and exiting
|
|
346
|
+
non-zero when any remain
|
|
306
347
|
--version, -v Print version and exit
|
|
307
348
|
--help, -h Print this help and exit
|
|
308
349
|
```
|
|
@@ -383,17 +424,17 @@ exits. You act by editing files (answer a plan question, tick a review box, fix
|
|
|
383
424
|
code) and re-running it — your pending edit arrives as the loop's first beat
|
|
384
425
|
(`kind: "capture"`, landed immediately), so you never run `gtd land` by hand.
|
|
385
426
|
|
|
386
|
-
Some gates accept by INACTION instead:
|
|
387
|
-
|
|
388
|
-
"accept
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
no-op (see `gtd land`'s exit
|
|
395
|
-
|
|
396
|
-
actually next.
|
|
427
|
+
Some gates could accept by INACTION instead: a workflow may declare a `"C"`
|
|
428
|
+
(clean-tree) pattern on a human-actor state that routes onward, so changing
|
|
429
|
+
nothing there means "accept as-is" rather than nothing happening. That reaches
|
|
430
|
+
the driver as `kind: "message"` either way, which no inspection can tell apart
|
|
431
|
+
from a gate you have not read yet — so the driver treats its OPENING beat as
|
|
432
|
+
yours regardless and lands it: you re-ran it while resting there, and that
|
|
433
|
+
invocation IS the decision. Every later beat halts as usual, because a gate the
|
|
434
|
+
driver produced mid-run is one you have not seen. Landing an opening beat at a
|
|
435
|
+
gate with no `"C"` pattern is harmless — a benign no-op (see `gtd land`'s exit
|
|
436
|
+
codes below) — and the gate then prints on the next beat. A mid-process restart
|
|
437
|
+
simply resumes driving from whatever beat is actually next.
|
|
397
438
|
|
|
398
439
|
Anything richer at that boundary — opening your editor, desktop notifications,
|
|
399
440
|
terminal-multiplexer status — is the job of an outer wrapper around the driver,
|
|
@@ -758,17 +799,14 @@ emitted script opens by asserting its own precondition
|
|
|
758
799
|
and the same shape for a review window's saved ref — see `src/Emit.ts`'s
|
|
759
800
|
`headAssertion`/`reviewWindowAssertion`), so a script generated against a
|
|
760
801
|
repository state that has since moved refuses loudly instead of corrupting
|
|
761
|
-
anything.
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
yet — safe to retry verbatim) or gtd's next invocation reads the new real state
|
|
770
|
-
and emits a fresh script for what remains. A driver never needs its own
|
|
771
|
-
retry/resume logic beyond "if the script failed, ask gtd again."
|
|
802
|
+
anything. **Emitted scripts are re-runnable**: this is the single most important
|
|
803
|
+
property for a driver's recovery logic. Re-running a script that already fully
|
|
804
|
+
applied is a no-op (its git writes are `--allow-empty` commits, idempotent ref
|
|
805
|
+
updates, and tolerant staged-restore calls), and re-running one that only
|
|
806
|
+
partially applied resumes correctly, because the precondition either still holds
|
|
807
|
+
(nothing landed yet — safe to retry verbatim) or gtd's next invocation reads the
|
|
808
|
+
new real state and emits a fresh script for what remains. A driver never needs
|
|
809
|
+
its own retry/resume logic beyond "if the script failed, ask gtd again."
|
|
772
810
|
|
|
773
811
|
### Prerequisites
|
|
774
812
|
|
|
@@ -1037,6 +1075,26 @@ model, pattern grammar, load-time rules, and how to verify a change compiles.
|
|
|
1037
1075
|
> discard it and start over (or finish the process on the pre-upgrade workflow
|
|
1038
1076
|
> version first).
|
|
1039
1077
|
|
|
1078
|
+
> **Upgrading a `workflow:` from the old two-flow (`.gtd/TODO.md` vs.
|
|
1079
|
+
> `.gtd/REQUIREMENTS.md`) shape?** The bundled template collapsed that fork into
|
|
1080
|
+
> one flow: `idle` now has a single outgoing edge — any change at all starts the
|
|
1081
|
+
> process, never a fork on which steering file you create — and
|
|
1082
|
+
> `plan-gate.check`/`spec-gate.check` merged into one shared `start-gate.check`.
|
|
1083
|
+
> The old plan-iteration machine's `plan.planning`/`plan.await-plan` states and
|
|
1084
|
+
> its monolithic `build.building` state are gone outright; every concern now
|
|
1085
|
+
> goes through the same per-package build queue instead. Renamed:
|
|
1086
|
+
> `design.product-author` → `design.triage`, `design.product-answer` →
|
|
1087
|
+
> `design.gate.answer`, `design.technical-author` → `architecture.author`,
|
|
1088
|
+
> `design.technical-answer` → `architecture.gate.answer`, `design.decompose` →
|
|
1089
|
+
> `architecture.decompose` (architecture is now its own sibling machine with its
|
|
1090
|
+
> own memory scope, not nested under `design`). The `prose` mode is gone and
|
|
1091
|
+
> there is no more free-form _plan_ file — `todoFile` itself came back later
|
|
1092
|
+
> with a different job: `idle`'s own mode-less `file:` hint, gtd's sketch pad
|
|
1093
|
+
> that no state writes or reads. As with every rename above, an in-flight
|
|
1094
|
+
> process resting at one of the old names can no longer be resumed;
|
|
1095
|
+
> `gtd abandon` it (or finish it on the pre-upgrade workflow version) before
|
|
1096
|
+
> upgrading.
|
|
1097
|
+
|
|
1040
1098
|
### Variables
|
|
1041
1099
|
|
|
1042
1100
|
Every template — `script`/`prompt`/`message`/`commit`, a machine's own `model:`,
|
|
@@ -1148,7 +1206,14 @@ separator), symbols over a `qa`-mode file's open questions plus "pick this
|
|
|
1148
1206
|
option"/"uncheck this option" code actions on each option — offered anywhere on
|
|
1149
1207
|
the option's list item, including any wrapped continuation lines, not just its
|
|
1150
1208
|
own `- [ ]` line — diagnostics for both (live as you edit), and a
|
|
1151
|
-
`gtd.openSteeringFile` command that jumps to the current state's steering file
|
|
1209
|
+
`gtd.openSteeringFile` command that jumps to the current state's steering file —
|
|
1210
|
+
including `idle`, whose `todoFile` hint gives the one keybinding an answer even
|
|
1211
|
+
before a process has started. The command only names that path — it never
|
|
1212
|
+
stat-checks or creates it — so on a repo that has never run gtd, `.gtd/` may not
|
|
1213
|
+
exist yet and editors differ on opening a file whose parent directory is missing
|
|
1214
|
+
(an empty buffer that creates it on save vs. refusing the path outright); this
|
|
1215
|
+
bites only the very first sketch in a fresh repo, since the workflow's own check
|
|
1216
|
+
scripts create the state directory on the first `gtd next`/`gtd land`.
|
|
1152
1217
|
|
|
1153
1218
|
It is config-driven via each state's `file:`/`mode:`, and falls back to basename
|
|
1154
1219
|
dispatch (`REVIEW.md` → `review`) with no config in sight. `qa` and `review` are
|
|
@@ -1160,10 +1225,10 @@ itself, so you bring your own formatter and your own checkers. Overriding one of
|
|
|
1160
1225
|
actions — those come from the FORMAT (the name), independent of who validates —
|
|
1161
1226
|
but `gtd lsp` never runs a shell command per keystroke, so live diagnostics
|
|
1162
1227
|
become one `Information` notice pointing at `gtd validate` instead of the
|
|
1163
|
-
built-in findings. Any OTHER mode name —
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1228
|
+
built-in findings. Any OTHER mode name — a project's own declared name (e.g.
|
|
1229
|
+
`prose`, for a free-form note) — has no built-in format, so it gets no live
|
|
1230
|
+
editor support at all: `gtd validate`'s emitted script and the `gtd land` gate
|
|
1231
|
+
still format and validate it like any other mode.
|
|
1167
1232
|
|
|
1168
1233
|
## Development
|
|
1169
1234
|
|