@pmelab/gtd 64.1.1 → 64.2.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.
Files changed (43) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +27 -14
  3. package/dist/chunks/{flows-B7ZRCe-B.mjs → flows-dnIE_qbe.mjs} +7 -13
  4. package/dist/chunks/{rolldown-runtime-D7D4PA-g.mjs → rolldown-runtime-D8jQpDG7.mjs} +1 -2
  5. package/dist/chunks/{steering-Cem5i6Xl.mjs → steering-DEh_MS40.mjs} +181 -187
  6. package/dist/chunks/{testkit-DfWZQCWQ.mjs → testkit-BwCH8ky6.mjs} +412 -512
  7. package/dist/chunks/{wire-CPNSm_9N.mjs → wire-CaPJ9Tme.mjs} +12 -24
  8. package/dist/flows.mjs +1 -2
  9. package/dist/gtd.bundle.mjs +1010 -1785
  10. package/dist/gtd.core.mjs +191 -182
  11. package/dist/steering.mjs +1 -2
  12. package/dist/testkit/gherkin.mjs +3 -5
  13. package/dist/testkit.mjs +2 -2
  14. package/dist/web/main.css +1 -1
  15. package/dist/web/main.js +438 -413
  16. package/dist/wire.mjs +1 -2
  17. package/dist/workflow-kit.mjs +6 -10
  18. package/package.json +19 -32
  19. package/src/cli/Cli.test.ts +1 -0
  20. package/src/cli/Cli.ts +16 -1
  21. package/src/cli/Program.ts +6 -0
  22. package/src/cli/ToolCommands.ts +1 -0
  23. package/src/edge/Edge.test.ts +23 -1
  24. package/src/edge/Edge.ts +23 -1
  25. package/src/edge/index.ts +1 -0
  26. package/src/emit/GitScript.test.ts +1 -1
  27. package/src/flows/runtime.test.ts +1 -1
  28. package/src/platform/Git.ts +33 -10
  29. package/src/replay/Replay.test.ts +21 -7
  30. package/src/steering/Blocks.test.ts +3 -1
  31. package/src/steering/Blocks.ts +14 -6
  32. package/src/steering/SteeringFormat.ts +9 -1
  33. package/src/steering/freeform.test.ts +51 -1
  34. package/src/steering/freeform.ts +38 -0
  35. package/src/steering/qa.test.ts +3 -3
  36. package/src/steering/qa.ts +1 -1
  37. package/src/steering/review.test.ts +26 -1
  38. package/src/step/LandStep.ts +1 -1
  39. package/src/twins/FakeGitOperations.ts +2 -0
  40. package/src/twins/GitTiers.ts +27 -2
  41. package/src/twins/InMemRepo.ts +5 -0
  42. package/src/wire/BeatPlain.ts +3 -3
  43. package/src/wire/Select.ts +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gtd",
3
- "version": "64.1.1",
3
+ "version": "64.2.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
@@ -433,20 +433,24 @@ commit. Its guide is
433
433
  Prefer a phone or another device over your editor? `gtd ui` opens the file whose
434
434
  turn it is as a small web app, over Tailscale — including a step that names no
435
435
  format, or one nothing recognizes, which still opens as plain markdown structure
436
- instead of refusing to start: read, plus a note on any block. It also binds on
437
- an idle worktree — nothing pending yet — opening `.gtd/TODO.md` free-form with a
438
- bare textfield so you can sketch from your phone; the sketch stays un-triaged on
439
- disk until you run `gtd` again, from anywhere, to pick it up. A description
440
- renders inline markdown — bold, code, strikethrough, links, and images — instead
441
- of literal asterisks and backticks. A note you add from the phone starts a
442
- thread: a footnote holding a `H:`/`A:` conversation. Threads show as a
443
- conversation under their block, question, chunk, or hunk, and one the agent
444
- answered last carries a "waiting on you" badge. Tap it to reply — your reply is
445
- added as a new `H:` entry; while the agent has yet to answer, reopening it edits
446
- your last entry instead. Tap an already-answered question to leave a note on it;
447
- the agent may overturn the answer. A `findings` file lists its findings, each
448
- with a fix checkbox and, once ticked, an optional line of guidance; Done stays
449
- disabled while the file holds anything its gate would refuse. See
436
+ instead of refusing to start: read, plus a note on any block and tickable
437
+ task-list boxes (each list is pick-one: ticking a box unticks its siblings, and
438
+ a ticked box can't be cleared from the phone). It also binds on an idle worktree
439
+ — nothing pending yet — opening `.gtd/TODO.md` free-form with a bare textfield
440
+ so you can sketch from your phone; the sketch stays un-triaged on disk until you
441
+ run `gtd` again, from anywhere, to pick it up. A description renders inline
442
+ markdown — bold, code, strikethrough, links, and images — instead of literal
443
+ asterisks and backticks. A note you add from the phone starts a thread: a
444
+ footnote holding a `H:`/`A:` conversation. Threads show as a conversation under
445
+ their block, question, chunk, or hunk — or, in a review chunk with no file
446
+ pointers, under each line of its lists, so a summary's entries take a note
447
+ apiece — and one the agent answered last carries a "waiting on you" badge. Tap
448
+ it to reply — your reply is added as a new `H:` entry; while the agent has yet
449
+ to answer, reopening it edits your last entry instead. Tap an already-answered
450
+ question to leave a note on it; the agent may overturn the answer. A `findings`
451
+ file lists its findings, each with a fix checkbox and, once ticked, an optional
452
+ line of guidance; Done stays disabled while the file holds anything its gate
453
+ would refuse. See
450
454
  [Configuration](https://github.com/pmelab/gtd/blob/main/docs/configuration.md)
451
455
  for its `ui:` settings.
452
456
 
@@ -470,6 +474,15 @@ unknown key. `gtd.config.ts` is the only repository config: gtd 23 removed the
470
474
  home directory — fails every command until you delete it. See
471
475
  [Migrating from `.gtdrc`](https://github.com/pmelab/gtd/blob/main/docs/configuration.md#migrating-from-gtdrc).
472
476
 
477
+ ## Large untracked trees
478
+
479
+ `gtd next`, `gtd land`, `gtd judge answer` and `gtd start` refuse when the
480
+ worktree holds more than 1,000 untracked, un-ignored files (a landing would
481
+ commit them all). The error names the count and the largest untracked
482
+ directories; add them to `.gitignore` (or `.git/info/exclude`) or delete them,
483
+ then run again. Fixed limit, no config key. Every other command — read-only ones
484
+ like `gtd check --open-threads`, `gtd judge`, `gtd validate` — never refuses.
485
+
473
486
  ## Checking a range for stray files
474
487
 
475
488
  ```sh
@@ -1,5 +1,5 @@
1
- import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
- //#region src/flows/runtime.ts
1
+ import { t as __exportAll } from "./rolldown-runtime-D8jQpDG7.mjs";
2
+ // src/flows/runtime.ts
3
3
  /**
4
4
  * Bump only when the installed `FlowContext` object changes shape or semantics;
5
5
  * type-only authoring-API changes don't count. A bump past 1 must keep v1
@@ -207,8 +207,7 @@ const workflow = (flow, options = {}) => {
207
207
  };
208
208
  /** The options `value` was marked with, or `undefined` when it went through no `workflow()`. */
209
209
  const markedOptions = (value) => typeof value === "function" && MARKED in value ? value[MARKED] : void 0;
210
- //#endregion
211
- //#region src/flows/scripts.ts
210
+ // src/flows/scripts.ts
212
211
  /** POSIX single-quoting: `value` survives the shell as one word, verbatim. */
213
212
  const quote = (value) => `'${value.replace(/'/g, "'\\''")}'`;
214
213
  const removal = (paths) => paths.length === 0 ? [] : [`rm -rf -- ${paths.map(quote).join(" ")}`];
@@ -319,8 +318,7 @@ const showScript = (ref, path, to) => [
319
318
  `git show ${quote(`${ref}:${path}`)} > ${quote(to)}`,
320
319
  ""
321
320
  ].join("\n");
322
- //#endregion
323
- //#region src/flows/helpers.ts
321
+ // src/flows/helpers.ts
324
322
  /** Whether a judge answered `expected` at a probability of at least `minP`. */
325
323
  const answered = (answer, expected, minP) => answer !== void 0 && answer.answer === expected && answer.p >= minP;
326
324
  /** A numeric var, or `fallback` when it is unset, blank or not a finite number. */
@@ -484,8 +482,7 @@ const seamGate = async (name, shape) => {
484
482
  approve: true
485
483
  });
486
484
  };
487
- //#endregion
488
- //#region src/flows/factory.ts
485
+ // src/flows/factory.ts
489
486
  const FACTORY = Symbol.for("@pmelab/gtd/workflow-factory");
490
487
  /**
491
488
  * Define a workflow configured by options. `schema` is any Standard Schema
@@ -549,8 +546,7 @@ const configure = (value, overrides = {}) => {
549
546
  build: internals.build(result.value)
550
547
  };
551
548
  };
552
- //#endregion
553
- //#region src/flows/config.ts
549
+ // src/flows/config.ts
554
550
  const CONFIG_KEYS = [
555
551
  "modes",
556
552
  "ui",
@@ -644,8 +640,7 @@ const defineConfig = (config) => {
644
640
  if (problems.length > 0) throw new Error(problems.map(formatConfigProblem).join("; "));
645
641
  return config;
646
642
  };
647
- //#endregion
648
- //#region src/flows/index.ts
643
+ // src/flows/index.ts
649
644
  var flows_exports = /* @__PURE__ */ __exportAll({
650
645
  FLOWS_PROTOCOL: () => 1,
651
646
  FlowsProtocolError: () => FlowsProtocolError,
@@ -703,5 +698,4 @@ var flows_exports = /* @__PURE__ */ __exportAll({
703
698
  writeScript: () => writeScript,
704
699
  wrote: () => wrote
705
700
  });
706
- //#endregion
707
701
  export { run as $, FLOWS_PROTOCOL as A, head as B, moveScript as C, revertScript as D, restoreScript as E, changesSince as F, mark as G, installContext as H, codeThreads as I, openQuestions as J, markedOptions as K, envSettings as L, accessFor as M, agent as N, showScript as O, changes as P, restart as Q, envSettingsOf as R, checkScript as S, removeScript as T, judge as U, human as V, kept as W, read as X, protocolMismatch as Y, refuse as Z, requireRevert as _, defineWorkflow as a, skillsFor as at, wrote as b, check as c, workflow as ct, hasThreadFor as d, scope as et, judgeDiffShape as f, requireReplies as g, requireProgress as h, configure as i, settingsOf as it, FlowsProtocolError as j, writeScript as k, codeChanges as l, requireAnswers as m, configProblems as n, sections as nt, isFactoryWorkflow as o, start as ot, numeric as p, matches as q, defineConfig as r, settings as rt, answered as s, threads as st, flows_exports as t, sectionBodies as tt, displayPath as u, requireThreadsClosed as v, quote as w, applyScript as x, seamGate as y, glob as z };
@@ -1,4 +1,4 @@
1
- //#region \0rolldown/runtime.js
1
+ // \0rolldown/runtime.js
2
2
  var __defProp = Object.defineProperty;
3
3
  var __exportAll = (all, no_symbols) => {
4
4
  let target = {};
@@ -9,5 +9,4 @@ var __exportAll = (all, no_symbols) => {
9
9
  if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
10
10
  return target;
11
11
  };
12
- //#endregion
13
12
  export { __exportAll as t };