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.
Files changed (135) hide show
  1. package/dist/bundled-resource-path.d.ts +8 -0
  2. package/dist/bundled-resource-path.js +14 -0
  3. package/dist/headless-query.js +6 -6
  4. package/dist/resources/extensions/gsd/auto/session.js +27 -32
  5. package/dist/resources/extensions/gsd/auto-dashboard.js +29 -109
  6. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +6 -1
  7. package/dist/resources/extensions/gsd/auto-dispatch.js +52 -81
  8. package/dist/resources/extensions/gsd/auto-loop.js +956 -0
  9. package/dist/resources/extensions/gsd/auto-observability.js +4 -2
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +75 -185
  11. package/dist/resources/extensions/gsd/auto-prompts.js +133 -101
  12. package/dist/resources/extensions/gsd/auto-recovery.js +59 -97
  13. package/dist/resources/extensions/gsd/auto-start.js +330 -309
  14. package/dist/resources/extensions/gsd/auto-supervisor.js +5 -11
  15. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +7 -7
  16. package/dist/resources/extensions/gsd/auto-timers.js +3 -4
  17. package/dist/resources/extensions/gsd/auto-verification.js +35 -73
  18. package/dist/resources/extensions/gsd/auto-worktree-sync.js +167 -0
  19. package/dist/resources/extensions/gsd/auto-worktree.js +291 -126
  20. package/dist/resources/extensions/gsd/auto.js +283 -1013
  21. package/dist/resources/extensions/gsd/captures.js +10 -4
  22. package/dist/resources/extensions/gsd/dispatch-guard.js +7 -8
  23. package/dist/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  24. package/dist/resources/extensions/gsd/doctor-checks.js +3 -4
  25. package/dist/resources/extensions/gsd/git-service.js +1 -1
  26. package/dist/resources/extensions/gsd/gsd-db.js +296 -151
  27. package/dist/resources/extensions/gsd/index.js +92 -228
  28. package/dist/resources/extensions/gsd/post-unit-hooks.js +13 -13
  29. package/dist/resources/extensions/gsd/progress-score.js +61 -156
  30. package/dist/resources/extensions/gsd/quick.js +98 -122
  31. package/dist/resources/extensions/gsd/session-lock.js +13 -0
  32. package/dist/resources/extensions/gsd/templates/preferences.md +1 -0
  33. package/dist/resources/extensions/gsd/undo.js +43 -48
  34. package/dist/resources/extensions/gsd/unit-runtime.js +16 -15
  35. package/dist/resources/extensions/gsd/verification-evidence.js +0 -1
  36. package/dist/resources/extensions/gsd/verification-gate.js +6 -35
  37. package/dist/resources/extensions/gsd/worktree-command.js +30 -24
  38. package/dist/resources/extensions/gsd/worktree-manager.js +2 -3
  39. package/dist/resources/extensions/gsd/worktree-resolver.js +344 -0
  40. package/dist/resources/extensions/gsd/worktree.js +7 -44
  41. package/dist/tool-bootstrap.js +59 -11
  42. package/dist/worktree-cli.js +7 -7
  43. package/package.json +1 -1
  44. package/packages/pi-ai/dist/models.generated.d.ts +3630 -5483
  45. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  46. package/packages/pi-ai/dist/models.generated.js +735 -2588
  47. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  48. package/packages/pi-ai/src/models.generated.ts +1039 -2892
  49. package/packages/pi-coding-agent/package.json +1 -1
  50. package/pkg/package.json +1 -1
  51. package/src/resources/extensions/gsd/auto/session.ts +47 -30
  52. package/src/resources/extensions/gsd/auto-dashboard.ts +28 -131
  53. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +6 -1
  54. package/src/resources/extensions/gsd/auto-dispatch.ts +135 -91
  55. package/src/resources/extensions/gsd/auto-loop.ts +1665 -0
  56. package/src/resources/extensions/gsd/auto-observability.ts +4 -2
  57. package/src/resources/extensions/gsd/auto-post-unit.ts +85 -228
  58. package/src/resources/extensions/gsd/auto-prompts.ts +138 -109
  59. package/src/resources/extensions/gsd/auto-recovery.ts +124 -118
  60. package/src/resources/extensions/gsd/auto-start.ts +440 -354
  61. package/src/resources/extensions/gsd/auto-supervisor.ts +5 -12
  62. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +8 -8
  63. package/src/resources/extensions/gsd/auto-timers.ts +3 -4
  64. package/src/resources/extensions/gsd/auto-verification.ts +76 -90
  65. package/src/resources/extensions/gsd/auto-worktree-sync.ts +204 -0
  66. package/src/resources/extensions/gsd/auto-worktree.ts +389 -141
  67. package/src/resources/extensions/gsd/auto.ts +515 -1199
  68. package/src/resources/extensions/gsd/captures.ts +10 -4
  69. package/src/resources/extensions/gsd/dispatch-guard.ts +13 -9
  70. package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  71. package/src/resources/extensions/gsd/doctor-checks.ts +3 -4
  72. package/src/resources/extensions/gsd/git-service.ts +8 -1
  73. package/src/resources/extensions/gsd/gitignore.ts +4 -2
  74. package/src/resources/extensions/gsd/gsd-db.ts +375 -180
  75. package/src/resources/extensions/gsd/index.ts +104 -263
  76. package/src/resources/extensions/gsd/post-unit-hooks.ts +13 -13
  77. package/src/resources/extensions/gsd/progress-score.ts +65 -200
  78. package/src/resources/extensions/gsd/quick.ts +121 -125
  79. package/src/resources/extensions/gsd/session-lock.ts +11 -0
  80. package/src/resources/extensions/gsd/templates/preferences.md +1 -0
  81. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +32 -59
  82. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +75 -27
  83. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  84. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +37 -0
  85. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1458 -0
  86. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +8 -162
  87. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -108
  88. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +1 -3
  89. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -3
  90. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
  91. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -55
  92. package/src/resources/extensions/gsd/tests/headless-query.test.ts +22 -0
  93. package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +8 -11
  94. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +4 -6
  95. package/src/resources/extensions/gsd/tests/run-uat.test.ts +3 -3
  96. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +64 -0
  97. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +181 -0
  98. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -3
  99. package/src/resources/extensions/gsd/tests/token-profile.test.ts +6 -6
  100. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -6
  101. package/src/resources/extensions/gsd/tests/undo.test.ts +6 -0
  102. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +24 -26
  103. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +7 -201
  104. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +205 -0
  105. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +442 -0
  106. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -3
  107. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +705 -0
  108. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +57 -106
  109. package/src/resources/extensions/gsd/tests/worktree.test.ts +5 -1
  110. package/src/resources/extensions/gsd/tests/write-gate.test.ts +43 -132
  111. package/src/resources/extensions/gsd/types.ts +90 -81
  112. package/src/resources/extensions/gsd/undo.ts +42 -46
  113. package/src/resources/extensions/gsd/unit-runtime.ts +14 -18
  114. package/src/resources/extensions/gsd/verification-evidence.ts +1 -3
  115. package/src/resources/extensions/gsd/verification-gate.ts +6 -39
  116. package/src/resources/extensions/gsd/worktree-command.ts +36 -24
  117. package/src/resources/extensions/gsd/worktree-manager.ts +2 -3
  118. package/src/resources/extensions/gsd/worktree-resolver.ts +485 -0
  119. package/src/resources/extensions/gsd/worktree.ts +7 -44
  120. package/dist/resources/extensions/gsd/auto-constants.js +0 -5
  121. package/dist/resources/extensions/gsd/auto-idempotency.js +0 -106
  122. package/dist/resources/extensions/gsd/auto-stuck-detection.js +0 -165
  123. package/dist/resources/extensions/gsd/mechanical-completion.js +0 -351
  124. package/src/resources/extensions/gsd/auto-constants.ts +0 -6
  125. package/src/resources/extensions/gsd/auto-idempotency.ts +0 -151
  126. package/src/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  127. package/src/resources/extensions/gsd/mechanical-completion.ts +0 -430
  128. package/src/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
  129. package/src/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  130. package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  131. package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  132. package/src/resources/extensions/gsd/tests/loop-regression.test.ts +0 -874
  133. package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  134. package/src/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  135. package/src/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
@@ -9,10 +9,9 @@
9
9
  */
10
10
 
11
11
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
12
- import { join, resolve } from "node:path";
12
+ import { join, resolve, sep } from "node:path";
13
13
  import { randomUUID } from "node:crypto";
14
14
  import { gsdRoot } from "./paths.js";
15
- import { resolveProjectRoot } from "./worktree.js";
16
15
 
17
16
  // ─── Types ────────────────────────────────────────────────────────────────────
18
17
 
@@ -59,8 +58,15 @@ const VALID_CLASSIFICATIONS: readonly string[] = [
59
58
  * directory that contains `.gsd/worktrees/` — that's the project root.
60
59
  */
61
60
  export function resolveCapturesPath(basePath: string): string {
62
- const projectRoot = resolveProjectRoot(resolve(basePath));
63
- return join(gsdRoot(projectRoot), CAPTURES_FILENAME);
61
+ const resolved = resolve(basePath);
62
+ const worktreeMarker = `${sep}.gsd${sep}worktrees${sep}`;
63
+ const idx = resolved.indexOf(worktreeMarker);
64
+ if (idx !== -1) {
65
+ // basePath is inside a worktree — resolve to project root
66
+ const projectRoot = resolved.slice(0, idx);
67
+ return join(projectRoot, ".gsd", CAPTURES_FILENAME);
68
+ }
69
+ return join(gsdRoot(basePath), CAPTURES_FILENAME);
64
70
  }
65
71
 
66
72
  // ─── File I/O ─────────────────────────────────────────────────────────────────
@@ -5,7 +5,6 @@ import { readdirSync } from "node:fs";
5
5
  import { resolveMilestoneFile, milestonesDir } from "./paths.js";
6
6
  import { parseRoadmapSlices } from "./roadmap-slices.js";
7
7
  import { findMilestoneIds } from "./guided-flow.js";
8
- import { parseUnitId } from "./unit-id.js";
9
8
 
10
9
  const SLICE_DISPATCH_TYPES = new Set([
11
10
  "research-slice",
@@ -37,10 +36,15 @@ function readRoadmapFromDisk(base: string, milestoneId: string): string | null {
37
36
  }
38
37
  }
39
38
 
40
- export function getPriorSliceCompletionBlocker(base: string, _mainBranch: string, unitType: string, unitId: string): string | null {
39
+ export function getPriorSliceCompletionBlocker(
40
+ base: string,
41
+ _mainBranch: string,
42
+ unitType: string,
43
+ unitId: string,
44
+ ): string | null {
41
45
  if (!SLICE_DISPATCH_TYPES.has(unitType)) return null;
42
46
 
43
- const { milestone: targetMid, slice: targetSid } = parseUnitId(unitId);
47
+ const [targetMid, targetSid] = unitId.split("/");
44
48
  if (!targetMid || !targetSid) return null;
45
49
 
46
50
  // Use findMilestoneIds to respect custom queue order.
@@ -51,9 +55,7 @@ export function getPriorSliceCompletionBlocker(base: string, _mainBranch: string
51
55
  const milestoneIds = allIds.slice(0, targetIdx + 1);
52
56
 
53
57
  for (const mid of milestoneIds) {
54
- // Skip parked milestones — they don't block dispatch of later milestones
55
- const parkedFile = resolveMilestoneFile(base, mid, "PARKED");
56
- if (parkedFile) continue;
58
+ if (resolveMilestoneFile(base, mid, "PARKED")) continue;
57
59
 
58
60
  // Read from disk (working tree) — always has the latest state
59
61
  const roadmapContent = readRoadmapFromDisk(base, mid);
@@ -61,17 +63,19 @@ export function getPriorSliceCompletionBlocker(base: string, _mainBranch: string
61
63
 
62
64
  const slices = parseRoadmapSlices(roadmapContent);
63
65
  if (mid !== targetMid) {
64
- const incomplete = slices.find(slice => !slice.done);
66
+ const incomplete = slices.find((slice) => !slice.done);
65
67
  if (incomplete) {
66
68
  return `Cannot dispatch ${unitType} ${unitId}: earlier slice ${mid}/${incomplete.id} is not complete.`;
67
69
  }
68
70
  continue;
69
71
  }
70
72
 
71
- const targetIndex = slices.findIndex(slice => slice.id === targetSid);
73
+ const targetIndex = slices.findIndex((slice) => slice.id === targetSid);
72
74
  if (targetIndex === -1) return null;
73
75
 
74
- const incomplete = slices.slice(0, targetIndex).find(slice => !slice.done);
76
+ const incomplete = slices
77
+ .slice(0, targetIndex)
78
+ .find((slice) => !slice.done);
75
79
  if (incomplete) {
76
80
  return `Cannot dispatch ${unitType} ${unitId}: earlier slice ${targetMid}/${incomplete.id} is not complete.`;
77
81
  }
@@ -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 ["always_use_skills", "prefer_skills", "avoid_skills", "custom_instructions"] as const) {
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 | What it controls | Code reference |
64
- |-------|-----------------|----------------|
65
- | `skill_discovery` | **Whether** GSD looks for relevant skills during research | `resolveSkillDiscoveryMode()` in `preferences.ts` |
66
- | `always_use_skills`, `prefer_skills`, `avoid_skills` | **Which** skills to use when they're found relevant | `renderPreferencesForSystemPrompt()` in `preferences.ts` |
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 | `solo` | `team` |
79
- |---|---|---|
80
- | `git.auto_push` | `true` | `false` |
81
- | `git.push_branches` | `false` | `true` |
82
- | `git.pre_merge_check` | `false` | `true` |
83
- | `git.merge_strategy` | `"squash"` | `"squash"` |
84
- | `git.isolation` | `"worktree"` | `"worktree"` |
85
- | `unique_milestone_ids` | `false` | `true` |
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) runs all phases; `quality` prefers higher-quality models. See token-optimization docs.
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
- - `skip_reassess`: boolean — skip roadmap reassessment after each slice. Default: `false`.
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 # $0.28/$0.42 per 1M tokens
369
+ research: openrouter/deepseek/deepseek-r1 # $0.28/$0.42 per 1M tokens
363
370
  planning:
364
- model: claude-opus-4-6 # $5/$25 — best for architecture
371
+ model: claude-opus-4-6 # $5/$25 — best for architecture
365
372
  fallbacks:
366
- - openrouter/z-ai/glm-5 # $1/$3.20 — strong alternative
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
  ---
@@ -314,10 +314,9 @@ export async function checkRuntimeHealth(
314
314
  });
315
315
 
316
316
  if (shouldFix("orphaned_completed_units")) {
317
- const { removePersistedKey } = await import("./auto-recovery.js");
318
- for (const key of orphaned) {
319
- removePersistedKey(basePath, key);
320
- }
317
+ const orphanedSet = new Set(orphaned);
318
+ const remaining = keys.filter((key) => !orphanedSet.has(key));
319
+ await saveFile(completedKeysFile, JSON.stringify(remaining));
321
320
  fixesApplied.push(`removed ${orphaned.length} orphaned completed-unit key(s)`);
322
321
  }
323
322
  }
@@ -42,6 +42,8 @@ export interface GitPreferences {
42
42
  push_branches?: boolean;
43
43
  remote?: string;
44
44
  snapshots?: boolean;
45
+ /** Deprecated. .gsd/ is managed externally; retained for compatibility. */
46
+ commit_docs?: boolean;
45
47
  pre_merge_check?: boolean | string;
46
48
  commit_type?: string;
47
49
  main_branch?: string;
@@ -226,7 +228,12 @@ export function readIntegrationBranch(basePath: string, milestoneId: string): st
226
228
  /** Regex matching GSD quick-task branches: gsd/quick/<num>-<slug> */
227
229
  export const QUICK_BRANCH_RE = /^gsd\/quick\//;
228
230
 
229
- export function writeIntegrationBranch(basePath: string, milestoneId: string, branch: string): void {
231
+ export function writeIntegrationBranch(
232
+ basePath: string,
233
+ milestoneId: string,
234
+ branch: string,
235
+ _options?: { commitDocs?: boolean },
236
+ ): void {
230
237
  // Don't record slice branches as the integration target
231
238
  if (SLICE_BRANCH_RE.test(branch)) return;
232
239
  // Don't record quick-task branches — they are ephemeral and merge back
@@ -86,7 +86,10 @@ const BASELINE_PATTERNS = [
86
86
  * `.gsd/` state is managed externally (symlinked to `~/.gsd/projects/<hash>/`),
87
87
  * so the entire directory is always gitignored.
88
88
  */
89
- export function ensureGitignore(basePath: string, options?: { manageGitignore?: boolean }): boolean {
89
+ export function ensureGitignore(
90
+ basePath: string,
91
+ options?: { manageGitignore?: boolean; commitDocs?: boolean },
92
+ ): boolean {
90
93
  // If manage_gitignore is explicitly false, do not touch .gitignore at all
91
94
  if (options?.manageGitignore === false) return false;
92
95
 
@@ -212,4 +215,3 @@ custom_instructions:
212
215
  return true;
213
216
  }
214
217
 
215
-