@tekyzinc/gsd-t 5.19.10 → 5.19.11

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/CHANGELOG.md CHANGED
@@ -2,6 +2,24 @@
2
2
 
3
3
  All notable changes to GSD-T are documented here. Updated with each release.
4
4
 
5
+ ## [5.19.11] - 2026-09-15
6
+
7
+ ### Fixed — a broken git made the worktree prompt vanish with nothing said
8
+
9
+ An Xcode update left the licence unaccepted, so every git command exited 69 with a licence
10
+ notice. The worktree picker's first check asks "is this a git repo" and read that failure as
11
+ a plain "no" — which is the ordinary case for most directories, so it exited silently. The
12
+ launcher then skipped the worktree prompt entirely and started the session where it stood.
13
+ A prompt that disappears reads as a GSD-T bug; the actual cause was git, two commands away.
14
+
15
+ - `bin/gsd-t-pick-worktree.cjs`: "not a repository" and "git could not answer" are now
16
+ different answers. git's own exit tells them apart — a genuine non-repo says so on stderr;
17
+ anything else (missing binary, unaccepted licence, broken install) HALTS with what git said
18
+ and how to fix it. The sibling checks in `gsd-t-worktree-detect.cjs` already halted this way;
19
+ this one was the inconsistent member.
20
+ - `test/m111-pick-worktree.test.js`: 3 regression tests — a licence-style failure halts, a
21
+ directory that is genuinely not a repo stays silent, and git missing from PATH also halts.
22
+
5
23
  ## [5.19.10] - 2026-09-09
6
24
 
7
25
  ### Added — M117 Graph Search Guard: the graph rule finally fires on the path work actually takes
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # GSD-T: Contract-Driven Development for Claude Code
2
2
 
3
- **v5.19.10** - A methodology for reliable, parallelizable development using Claude Code with optional Agent Teams support.
3
+ **v5.19.11** - A methodology for reliable, parallelizable development using Claude Code with optional Agent Teams support.
4
4
 
5
5
  **Eliminates context rot** — task-level fresh dispatch (one subagent per task, ~10-20% context each) means compaction never triggers.
6
6
  **Compaction-proof debug loops** — `gsd-t headless --debug-loop` runs test-fix-retest cycles as separate `claude -p` sessions. A JSONL debug ledger persists all hypothesis/fix/learning history across fresh sessions. Anti-repetition preamble injection prevents retrying failed hypotheses. Escalation tiers (sonnet → opus → human) and a hard iteration ceiling enforced externally.
@@ -208,9 +208,50 @@ function isSwitchedOff(cwd) {
208
208
  return cfg.enabled === false;
209
209
  }
210
210
 
211
- // Most directories are not git repos. That is ordinary, not a failure.
211
+ /**
212
+ * Is this directory a git repo?
213
+ *
214
+ * "No" and "git could not tell me" are DIFFERENT answers and must not collapse
215
+ * into one. Most directories are genuinely not repos, which is ordinary and
216
+ * silent. But a git that cannot run at all fails the same probe, and reading
217
+ * that as "not a repo" makes the whole picker exit silently — the launcher then
218
+ * skips the worktree prompt entirely and starts the session wherever it stood,
219
+ * with nothing said. That happened for real on 2026-09-15: an Xcode update left
220
+ * the license unaccepted, every git command exited 69, and `cc` quietly stopped
221
+ * asking. The prompt vanishing looked like a GSD-T bug for as long as it took to
222
+ * run git by hand.
223
+ *
224
+ * git distinguishes them itself: a plain "not a repository" exits 128 with that
225
+ * message on stderr. Anything else — a missing binary, an unaccepted licence, a
226
+ * broken install — is git failing to answer, and that HALTS with what git said.
227
+ */
212
228
  function isGitRepo(dir) {
213
- return spawnSync("git", ["rev-parse", "--git-dir"], { cwd: dir, stdio: "pipe" }).status === 0;
229
+ const r = spawnSync("git", ["rev-parse", "--git-dir"], {
230
+ cwd: dir, encoding: "utf8", timeout: 10000,
231
+ });
232
+
233
+ if (r.status === 0) return true;
234
+
235
+ // git never ran: no binary on PATH, or it could not be spawned.
236
+ if (r.error) {
237
+ fail(
238
+ `git could not be run (${r.error.message}), so it cannot be told whether ` +
239
+ `${dir} is a repository. Fix git, then start the session again.`
240
+ );
241
+ }
242
+
243
+ const stderr = String(r.stderr || "").trim();
244
+
245
+ // The ordinary answer: this is simply not a repository.
246
+ if (/not a git repository/i.test(stderr)) return false;
247
+
248
+ // Anything else is git declining to answer, not an answer.
249
+ fail(
250
+ `git could not say whether ${dir} is a repository — it exited ${r.status}` +
251
+ (stderr ? ` saying: ${stderr}` : " with no message") + ".\n" +
252
+ `Until git works, the worktree prompt cannot run. Fix the cause above, then ` +
253
+ `start the session again.`
254
+ );
214
255
  }
215
256
 
216
257
  // Shared with branch-guard so the two cannot drift apart — see
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekyzinc/gsd-t",
3
- "version": "5.19.10",
3
+ "version": "5.19.11",
4
4
  "description": "GSD-T: Contract-Driven Development for Claude Code — 54 slash commands with headless-by-default workflow spawning, unattended supervisor relay with event stream, graph-powered code analysis, real-time agent dashboard, task telemetry, doc-ripple enforcement, backlog management, impact analysis, test sync, milestone archival, and PRD generation",
5
5
  "author": "Tekyz, Inc.",
6
6
  "license": "MIT",