gsd-pi 2.33.1-dev.ee47f1b → 2.34.0-dev.bbb5216
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/dist/bundled-resource-path.d.ts +8 -0
- package/dist/bundled-resource-path.js +14 -0
- package/dist/headless-query.js +6 -6
- package/dist/resources/extensions/gsd/auto/session.js +27 -32
- package/dist/resources/extensions/gsd/auto-dashboard.js +29 -109
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +6 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +52 -81
- package/dist/resources/extensions/gsd/auto-loop.js +956 -0
- package/dist/resources/extensions/gsd/auto-observability.js +4 -2
- package/dist/resources/extensions/gsd/auto-post-unit.js +75 -185
- package/dist/resources/extensions/gsd/auto-prompts.js +133 -101
- package/dist/resources/extensions/gsd/auto-recovery.js +59 -97
- package/dist/resources/extensions/gsd/auto-start.js +330 -309
- package/dist/resources/extensions/gsd/auto-supervisor.js +5 -11
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +7 -7
- package/dist/resources/extensions/gsd/auto-timers.js +3 -4
- package/dist/resources/extensions/gsd/auto-verification.js +35 -73
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +167 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +291 -126
- package/dist/resources/extensions/gsd/auto.js +283 -1013
- package/dist/resources/extensions/gsd/captures.js +10 -4
- package/dist/resources/extensions/gsd/dispatch-guard.js +7 -8
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +25 -18
- package/dist/resources/extensions/gsd/doctor-checks.js +3 -4
- package/dist/resources/extensions/gsd/git-service.js +1 -1
- package/dist/resources/extensions/gsd/gsd-db.js +296 -151
- package/dist/resources/extensions/gsd/index.js +92 -228
- package/dist/resources/extensions/gsd/post-unit-hooks.js +13 -13
- package/dist/resources/extensions/gsd/progress-score.js +61 -156
- package/dist/resources/extensions/gsd/quick.js +98 -122
- package/dist/resources/extensions/gsd/session-lock.js +13 -0
- package/dist/resources/extensions/gsd/templates/preferences.md +1 -0
- package/dist/resources/extensions/gsd/undo.js +43 -48
- package/dist/resources/extensions/gsd/unit-runtime.js +16 -15
- package/dist/resources/extensions/gsd/verification-evidence.js +0 -1
- package/dist/resources/extensions/gsd/verification-gate.js +6 -35
- package/dist/resources/extensions/gsd/worktree-command.js +30 -24
- package/dist/resources/extensions/gsd/worktree-manager.js +2 -3
- package/dist/resources/extensions/gsd/worktree-resolver.js +344 -0
- package/dist/resources/extensions/gsd/worktree.js +7 -44
- package/dist/tool-bootstrap.js +59 -11
- package/dist/worktree-cli.js +7 -7
- package/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +3630 -5483
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +735 -2588
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/src/models.generated.ts +1039 -2892
- package/packages/pi-coding-agent/package.json +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/auto/session.ts +47 -30
- package/src/resources/extensions/gsd/auto-dashboard.ts +28 -131
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +6 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +135 -91
- package/src/resources/extensions/gsd/auto-loop.ts +1665 -0
- package/src/resources/extensions/gsd/auto-observability.ts +4 -2
- package/src/resources/extensions/gsd/auto-post-unit.ts +85 -228
- package/src/resources/extensions/gsd/auto-prompts.ts +138 -109
- package/src/resources/extensions/gsd/auto-recovery.ts +124 -118
- package/src/resources/extensions/gsd/auto-start.ts +440 -354
- package/src/resources/extensions/gsd/auto-supervisor.ts +5 -12
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +8 -8
- package/src/resources/extensions/gsd/auto-timers.ts +3 -4
- package/src/resources/extensions/gsd/auto-verification.ts +76 -90
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +204 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +389 -141
- package/src/resources/extensions/gsd/auto.ts +515 -1199
- package/src/resources/extensions/gsd/captures.ts +10 -4
- package/src/resources/extensions/gsd/dispatch-guard.ts +13 -9
- package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -18
- package/src/resources/extensions/gsd/doctor-checks.ts +3 -4
- package/src/resources/extensions/gsd/git-service.ts +8 -1
- package/src/resources/extensions/gsd/gitignore.ts +4 -2
- package/src/resources/extensions/gsd/gsd-db.ts +375 -180
- package/src/resources/extensions/gsd/index.ts +104 -263
- package/src/resources/extensions/gsd/post-unit-hooks.ts +13 -13
- package/src/resources/extensions/gsd/progress-score.ts +65 -200
- package/src/resources/extensions/gsd/quick.ts +121 -125
- package/src/resources/extensions/gsd/session-lock.ts +11 -0
- package/src/resources/extensions/gsd/templates/preferences.md +1 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +32 -59
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +75 -27
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1458 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +8 -162
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -108
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +1 -3
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -55
- package/src/resources/extensions/gsd/tests/headless-query.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +8 -11
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +4 -6
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +181 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/undo.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +24 -26
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +7 -201
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +442 -0
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +705 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +57 -106
- package/src/resources/extensions/gsd/tests/worktree.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +43 -132
- package/src/resources/extensions/gsd/types.ts +90 -81
- package/src/resources/extensions/gsd/undo.ts +42 -46
- package/src/resources/extensions/gsd/unit-runtime.ts +14 -18
- package/src/resources/extensions/gsd/verification-evidence.ts +1 -3
- package/src/resources/extensions/gsd/verification-gate.ts +6 -39
- package/src/resources/extensions/gsd/worktree-command.ts +36 -24
- package/src/resources/extensions/gsd/worktree-manager.ts +2 -3
- package/src/resources/extensions/gsd/worktree-resolver.ts +485 -0
- package/src/resources/extensions/gsd/worktree.ts +7 -44
- package/dist/resources/extensions/gsd/auto-constants.js +0 -5
- package/dist/resources/extensions/gsd/auto-idempotency.js +0 -106
- package/dist/resources/extensions/gsd/auto-stuck-detection.js +0 -165
- package/dist/resources/extensions/gsd/mechanical-completion.js +0 -351
- package/src/resources/extensions/gsd/auto-constants.ts +0 -6
- package/src/resources/extensions/gsd/auto-idempotency.ts +0 -151
- package/src/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
- package/src/resources/extensions/gsd/mechanical-completion.ts +0 -430
- package/src/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
- package/src/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
- package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
- package/src/resources/extensions/gsd/tests/loop-regression.test.ts +0 -874
- package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
- package/src/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
- package/src/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
|
@@ -8,10 +8,9 @@
|
|
|
8
8
|
* `.gsd/CAPTURES.md`, not the worktree's local `.gsd/`.
|
|
9
9
|
*/
|
|
10
10
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
11
|
-
import { join, resolve } from "node:path";
|
|
11
|
+
import { join, resolve, sep } from "node:path";
|
|
12
12
|
import { randomUUID } from "node:crypto";
|
|
13
13
|
import { gsdRoot } from "./paths.js";
|
|
14
|
-
import { resolveProjectRoot } from "./worktree.js";
|
|
15
14
|
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
16
15
|
const CAPTURES_FILENAME = "CAPTURES.md";
|
|
17
16
|
const VALID_CLASSIFICATIONS = [
|
|
@@ -30,8 +29,15 @@ const VALID_CLASSIFICATIONS = [
|
|
|
30
29
|
* directory that contains `.gsd/worktrees/` — that's the project root.
|
|
31
30
|
*/
|
|
32
31
|
export function resolveCapturesPath(basePath) {
|
|
33
|
-
const
|
|
34
|
-
|
|
32
|
+
const resolved = resolve(basePath);
|
|
33
|
+
const worktreeMarker = `${sep}.gsd${sep}worktrees${sep}`;
|
|
34
|
+
const idx = resolved.indexOf(worktreeMarker);
|
|
35
|
+
if (idx !== -1) {
|
|
36
|
+
// basePath is inside a worktree — resolve to project root
|
|
37
|
+
const projectRoot = resolved.slice(0, idx);
|
|
38
|
+
return join(projectRoot, ".gsd", CAPTURES_FILENAME);
|
|
39
|
+
}
|
|
40
|
+
return join(gsdRoot(basePath), CAPTURES_FILENAME);
|
|
35
41
|
}
|
|
36
42
|
// ─── File I/O ─────────────────────────────────────────────────────────────────
|
|
37
43
|
/**
|
|
@@ -3,7 +3,6 @@ import { readFileSync } from "node:fs";
|
|
|
3
3
|
import { resolveMilestoneFile } from "./paths.js";
|
|
4
4
|
import { parseRoadmapSlices } from "./roadmap-slices.js";
|
|
5
5
|
import { findMilestoneIds } from "./guided-flow.js";
|
|
6
|
-
import { parseUnitId } from "./unit-id.js";
|
|
7
6
|
const SLICE_DISPATCH_TYPES = new Set([
|
|
8
7
|
"research-slice",
|
|
9
8
|
"plan-slice",
|
|
@@ -37,7 +36,7 @@ function readRoadmapFromDisk(base, milestoneId) {
|
|
|
37
36
|
export function getPriorSliceCompletionBlocker(base, _mainBranch, unitType, unitId) {
|
|
38
37
|
if (!SLICE_DISPATCH_TYPES.has(unitType))
|
|
39
38
|
return null;
|
|
40
|
-
const
|
|
39
|
+
const [targetMid, targetSid] = unitId.split("/");
|
|
41
40
|
if (!targetMid || !targetSid)
|
|
42
41
|
return null;
|
|
43
42
|
// Use findMilestoneIds to respect custom queue order.
|
|
@@ -48,9 +47,7 @@ export function getPriorSliceCompletionBlocker(base, _mainBranch, unitType, unit
|
|
|
48
47
|
return null;
|
|
49
48
|
const milestoneIds = allIds.slice(0, targetIdx + 1);
|
|
50
49
|
for (const mid of milestoneIds) {
|
|
51
|
-
|
|
52
|
-
const parkedFile = resolveMilestoneFile(base, mid, "PARKED");
|
|
53
|
-
if (parkedFile)
|
|
50
|
+
if (resolveMilestoneFile(base, mid, "PARKED"))
|
|
54
51
|
continue;
|
|
55
52
|
// Read from disk (working tree) — always has the latest state
|
|
56
53
|
const roadmapContent = readRoadmapFromDisk(base, mid);
|
|
@@ -58,16 +55,18 @@ export function getPriorSliceCompletionBlocker(base, _mainBranch, unitType, unit
|
|
|
58
55
|
continue;
|
|
59
56
|
const slices = parseRoadmapSlices(roadmapContent);
|
|
60
57
|
if (mid !== targetMid) {
|
|
61
|
-
const incomplete = slices.find(slice => !slice.done);
|
|
58
|
+
const incomplete = slices.find((slice) => !slice.done);
|
|
62
59
|
if (incomplete) {
|
|
63
60
|
return `Cannot dispatch ${unitType} ${unitId}: earlier slice ${mid}/${incomplete.id} is not complete.`;
|
|
64
61
|
}
|
|
65
62
|
continue;
|
|
66
63
|
}
|
|
67
|
-
const targetIndex = slices.findIndex(slice => slice.id === targetSid);
|
|
64
|
+
const targetIndex = slices.findIndex((slice) => slice.id === targetSid);
|
|
68
65
|
if (targetIndex === -1)
|
|
69
66
|
return null;
|
|
70
|
-
const incomplete = slices
|
|
67
|
+
const incomplete = slices
|
|
68
|
+
.slice(0, targetIndex)
|
|
69
|
+
.find((slice) => !slice.done);
|
|
71
70
|
if (incomplete) {
|
|
72
71
|
return `Cannot dispatch ${unitType} ${unitId}: earlier slice ${targetMid}/${incomplete.id} is not complete.`;
|
|
73
72
|
}
|
|
@@ -21,7 +21,12 @@ Full documentation for `~/.gsd/preferences.md` (global) and `.gsd/preferences.md
|
|
|
21
21
|
**Empty arrays (`[]`) are equivalent to omitting the field entirely.** During validation, GSD deletes empty arrays from the preferences object (see `validatePreferences()` in `preferences.ts`):
|
|
22
22
|
|
|
23
23
|
```typescript
|
|
24
|
-
for (const key of [
|
|
24
|
+
for (const key of [
|
|
25
|
+
"always_use_skills",
|
|
26
|
+
"prefer_skills",
|
|
27
|
+
"avoid_skills",
|
|
28
|
+
"custom_instructions",
|
|
29
|
+
] as const) {
|
|
25
30
|
if (validated[key] && validated[key]!.length === 0) {
|
|
26
31
|
delete validated[key];
|
|
27
32
|
}
|
|
@@ -50,6 +55,7 @@ Preferences are loaded from two locations and merged:
|
|
|
50
55
|
2. **Project:** `.gsd/preferences.md` — applies to the current project only
|
|
51
56
|
|
|
52
57
|
**Merge behavior** (see `mergePreferences()` in `preferences.ts`):
|
|
58
|
+
|
|
53
59
|
- **Scalar fields** (`skill_discovery`, `budget_ceiling`, etc.): Project wins if defined, otherwise global. Uses nullish coalescing (`??`).
|
|
54
60
|
- **Array fields** (`always_use_skills`, `prefer_skills`, etc.): Concatenated via `mergeStringLists()` (global first, then project).
|
|
55
61
|
- **Object fields** (`models`, `git`, `auto_supervisor`): Shallow merge via spread operator `{ ...base, ...override }`.
|
|
@@ -60,10 +66,10 @@ For `models`, project settings override global at the phase level. If global has
|
|
|
60
66
|
|
|
61
67
|
These are **separate concerns**:
|
|
62
68
|
|
|
63
|
-
| Field
|
|
64
|
-
|
|
65
|
-
| `skill_discovery`
|
|
66
|
-
| `always_use_skills`, `prefer_skills`, `avoid_skills` | **Which** skills to use when they're found relevant
|
|
69
|
+
| Field | What it controls | Code reference |
|
|
70
|
+
| ---------------------------------------------------- | --------------------------------------------------------- | -------------------------------------------------------- |
|
|
71
|
+
| `skill_discovery` | **Whether** GSD looks for relevant skills during research | `resolveSkillDiscoveryMode()` in `preferences.ts` |
|
|
72
|
+
| `always_use_skills`, `prefer_skills`, `avoid_skills` | **Which** skills to use when they're found relevant | `renderPreferencesForSystemPrompt()` in `preferences.ts` |
|
|
67
73
|
|
|
68
74
|
Setting `prefer_skills: []` does **not** disable skill discovery — it just means you have no preference overrides. Use `skill_discovery: off` to disable discovery entirely.
|
|
69
75
|
|
|
@@ -75,14 +81,14 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
|
|
|
75
81
|
|
|
76
82
|
- `mode`: workflow mode — `"solo"` or `"team"`. Sets sensible defaults for git and project settings based on your workflow. Mode defaults are the lowest priority layer — any explicit preference overrides them. Omit to configure everything manually.
|
|
77
83
|
|
|
78
|
-
| Setting
|
|
79
|
-
|
|
80
|
-
| `git.auto_push`
|
|
81
|
-
| `git.push_branches`
|
|
82
|
-
| `git.pre_merge_check`
|
|
83
|
-
| `git.merge_strategy`
|
|
84
|
-
| `git.isolation`
|
|
85
|
-
| `unique_milestone_ids` | `false`
|
|
84
|
+
| Setting | `solo` | `team` |
|
|
85
|
+
| ---------------------- | ------------ | ------------ |
|
|
86
|
+
| `git.auto_push` | `true` | `false` |
|
|
87
|
+
| `git.push_branches` | `false` | `true` |
|
|
88
|
+
| `git.pre_merge_check` | `false` | `true` |
|
|
89
|
+
| `git.merge_strategy` | `"squash"` | `"squash"` |
|
|
90
|
+
| `git.isolation` | `"worktree"` | `"worktree"` |
|
|
91
|
+
| `unique_milestone_ids` | `false` | `true` |
|
|
86
92
|
|
|
87
93
|
Quick setup: `/gsd mode` (global) or `/gsd mode project` (project-level).
|
|
88
94
|
|
|
@@ -141,11 +147,12 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
|
|
|
141
147
|
|
|
142
148
|
- `context_pause_threshold`: number (0-100) — context window usage percentage at which auto-mode should pause to suggest checkpointing. Set to `0` to disable. Default: `0` (disabled).
|
|
143
149
|
|
|
144
|
-
- `token_profile`: `"budget"`, `"balanced"`, or `"quality"` — coordinates model selection, phase skipping, and context compression. `budget` skips research/reassessment and uses cheaper models; `balanced` (default)
|
|
150
|
+
- `token_profile`: `"budget"`, `"balanced"`, or `"quality"` — coordinates model selection, phase skipping, and context compression. `budget` skips research/reassessment and uses cheaper models; `balanced` (default) skips research/reassessment to reduce token burn; `quality` prefers higher-quality models. See token-optimization docs.
|
|
145
151
|
|
|
146
152
|
- `phases`: fine-grained control over which phases run. Usually set by `token_profile`, but can be overridden. Keys:
|
|
147
153
|
- `skip_research`: boolean — skip milestone-level research. Default: `false`.
|
|
148
|
-
- `
|
|
154
|
+
- `reassess_after_slice`: boolean — run roadmap reassessment after each completed slice. Default: `false`.
|
|
155
|
+
- `skip_reassess`: boolean — force-disable roadmap reassessment even if `reassess_after_slice` is enabled. Default: `false`.
|
|
149
156
|
- `skip_slice_research`: boolean — skip per-slice research. Default: `false`.
|
|
150
157
|
|
|
151
158
|
- `remote_questions`: route interactive questions to Slack/Discord for headless auto-mode. Keys:
|
|
@@ -359,11 +366,11 @@ If you use a bare model ID (no provider prefix) and it exists in multiple provid
|
|
|
359
366
|
---
|
|
360
367
|
version: 1
|
|
361
368
|
models:
|
|
362
|
-
research: openrouter/deepseek/deepseek-r1
|
|
369
|
+
research: openrouter/deepseek/deepseek-r1 # $0.28/$0.42 per 1M tokens
|
|
363
370
|
planning:
|
|
364
|
-
model: claude-opus-4-6
|
|
371
|
+
model: claude-opus-4-6 # $5/$25 — best for architecture
|
|
365
372
|
fallbacks:
|
|
366
|
-
- openrouter/z-ai/glm-5
|
|
373
|
+
- openrouter/z-ai/glm-5 # $1/$3.20 — strong alternative
|
|
367
374
|
execution: openrouter/minimax/minimax-m2.5 # $0.30/$1.20 — cheapest quality
|
|
368
375
|
completion: openrouter/minimax/minimax-m2.5
|
|
369
376
|
---
|
|
@@ -286,10 +286,9 @@ export async function checkRuntimeHealth(basePath, issues, fixesApplied, shouldF
|
|
|
286
286
|
fixable: true,
|
|
287
287
|
});
|
|
288
288
|
if (shouldFix("orphaned_completed_units")) {
|
|
289
|
-
const
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
}
|
|
289
|
+
const orphanedSet = new Set(orphaned);
|
|
290
|
+
const remaining = keys.filter((key) => !orphanedSet.has(key));
|
|
291
|
+
await saveFile(completedKeysFile, JSON.stringify(remaining));
|
|
293
292
|
fixesApplied.push(`removed ${orphaned.length} orphaned completed-unit key(s)`);
|
|
294
293
|
}
|
|
295
294
|
}
|
|
@@ -123,7 +123,7 @@ export function readIntegrationBranch(basePath, milestoneId) {
|
|
|
123
123
|
*/
|
|
124
124
|
/** Regex matching GSD quick-task branches: gsd/quick/<num>-<slug> */
|
|
125
125
|
export const QUICK_BRANCH_RE = /^gsd\/quick\//;
|
|
126
|
-
export function writeIntegrationBranch(basePath, milestoneId, branch) {
|
|
126
|
+
export function writeIntegrationBranch(basePath, milestoneId, branch, _options) {
|
|
127
127
|
// Don't record slice branches as the integration target
|
|
128
128
|
if (SLICE_BRANCH_RE.test(branch))
|
|
129
129
|
return;
|