gsd-pi 2.54.0-dev.e1efc1a → 2.55.0-dev.9ec7cdf
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/cli.js +19 -19
- package/dist/headless-ui.d.ts +27 -1
- package/dist/headless-ui.js +203 -13
- package/dist/headless.js +60 -3
- package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +2 -2
- package/dist/resources/extensions/bg-shell/utilities.js +34 -5
- package/dist/resources/extensions/gsd/auto/phases.js +19 -3
- package/dist/resources/extensions/gsd/auto-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +17 -1
- package/dist/resources/extensions/gsd/auto-prompts.js +9 -0
- package/dist/resources/extensions/gsd/auto-start.js +12 -5
- package/dist/resources/extensions/gsd/auto-worktree.js +39 -14
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +5 -1
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +18 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +18 -5
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +20 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +2 -1
- package/dist/resources/extensions/gsd/commands/handlers/parallel.js +15 -1
- package/dist/resources/extensions/gsd/crash-recovery.js +2 -2
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +413 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +5 -1
- package/dist/resources/extensions/gsd/session-lock.js +46 -12
- package/dist/resources/extensions/gsd/skill-health.js +2 -2
- package/dist/resources/extensions/gsd/visualizer-overlay.js +3 -3
- package/dist/resources/extensions/shared/format-utils.js +1 -1
- package/dist/resources/extensions/subagent/worker-registry.js +2 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -18
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -18
- package/dist/web/standalone/.next/server/chunks/2229.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/6502.2305d0afd2385711.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-b950e4e384cc62b3.js → page-0c485498795110d6.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-bca0e732db0dcec3.js → webpack-4332cbd5dd1be584.js} +1 -1
- package/package.json +6 -4
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +14 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/model-registry.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +16 -2
- package/pkg/package.json +1 -1
- package/scripts/ensure-workspace-builds.cjs +45 -41
- package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +2 -2
- package/src/resources/extensions/bg-shell/utilities.ts +39 -4
- package/src/resources/extensions/gsd/auto/phases.ts +25 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +21 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +15 -0
- package/src/resources/extensions/gsd/auto-start.ts +13 -5
- package/src/resources/extensions/gsd/auto-worktree.ts +46 -13
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +5 -4
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +53 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +19 -6
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +24 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +2 -1
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +19 -1
- package/src/resources/extensions/gsd/crash-recovery.ts +2 -3
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +497 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -1
- package/src/resources/extensions/gsd/session-lock.ts +46 -12
- package/src/resources/extensions/gsd/skill-health.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/{all-milestones-complete-merge.test.ts → integration/all-milestones-complete-merge.test.ts} +3 -3
- package/src/resources/extensions/gsd/tests/{atomic-task-closeout.test.ts → integration/atomic-task-closeout.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{auto-preflight.test.ts → integration/auto-preflight.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{auto-recovery.test.ts → integration/auto-recovery.test.ts} +7 -7
- package/src/resources/extensions/gsd/tests/{auto-secrets-gate.test.ts → integration/auto-secrets-gate.test.ts} +2 -2
- package/src/resources/extensions/gsd/tests/{auto-stash-merge.test.ts → integration/auto-stash-merge.test.ts} +3 -3
- package/src/resources/extensions/gsd/tests/{auto-worktree-milestone-merge.test.ts → integration/auto-worktree-milestone-merge.test.ts} +4 -4
- package/src/resources/extensions/gsd/tests/{auto-worktree.test.ts → integration/auto-worktree.test.ts} +5 -5
- package/src/resources/extensions/gsd/tests/{continue-here.test.ts → integration/continue-here.test.ts} +3 -3
- package/src/resources/extensions/gsd/tests/{doctor-completion-deferral.test.ts → integration/doctor-completion-deferral.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{doctor-delimiter-fix.test.ts → integration/doctor-delimiter-fix.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{doctor-enhancements.test.ts → integration/doctor-enhancements.test.ts} +3 -3
- package/src/resources/extensions/gsd/tests/{doctor-environment-worktree.test.ts → integration/doctor-environment-worktree.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{doctor-environment.test.ts → integration/doctor-environment.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{doctor-fixlevel.test.ts → integration/doctor-fixlevel.test.ts} +2 -2
- package/src/resources/extensions/gsd/tests/{doctor-git.test.ts → integration/doctor-git.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{doctor-proactive.test.ts → integration/doctor-proactive.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{doctor-roadmap-summary-atomicity.test.ts → integration/doctor-roadmap-summary-atomicity.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{doctor-runtime.test.ts → integration/doctor-runtime.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{doctor.test.ts → integration/doctor.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{e2e-workflow-pipeline-integration.test.ts → integration/e2e-workflow-pipeline-integration.test.ts} +5 -5
- package/src/resources/extensions/gsd/tests/{feature-branch-lifecycle-integration.test.ts → integration/feature-branch-lifecycle-integration.test.ts} +4 -4
- package/src/resources/extensions/gsd/tests/{git-locale.test.ts → integration/git-locale.test.ts} +4 -4
- package/src/resources/extensions/gsd/tests/{git-self-heal.test.ts → integration/git-self-heal.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{git-service.test.ts → integration/git-service.test.ts} +4 -4
- package/src/resources/extensions/gsd/tests/{gitignore-tracked-gsd.test.ts → integration/gitignore-tracked-gsd.test.ts} +2 -2
- package/src/resources/extensions/gsd/tests/{idle-recovery.test.ts → integration/idle-recovery.test.ts} +3 -3
- package/src/resources/extensions/gsd/tests/{inherited-repo-home-dir.test.ts → integration/inherited-repo-home-dir.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{integration-lifecycle.test.ts → integration/integration-lifecycle.test.ts} +4 -4
- package/src/resources/extensions/gsd/tests/{integration-mixed-milestones.test.ts → integration/integration-mixed-milestones.test.ts} +6 -6
- package/src/resources/extensions/gsd/tests/{integration-proof.test.ts → integration/integration-proof.test.ts} +12 -12
- package/src/resources/extensions/gsd/tests/{migrate-command.test.ts → integration/migrate-command.test.ts} +2 -2
- package/src/resources/extensions/gsd/tests/{milestone-transition-worktree.test.ts → integration/milestone-transition-worktree.test.ts} +3 -3
- package/src/resources/extensions/gsd/tests/{parallel-merge.test.ts → integration/parallel-merge.test.ts} +3 -3
- package/src/resources/extensions/gsd/tests/{parallel-workers-multi-milestone-e2e.test.ts → integration/parallel-workers-multi-milestone-e2e.test.ts} +3 -3
- package/src/resources/extensions/gsd/tests/{paths.test.ts → integration/paths.test.ts} +1 -1
- package/src/resources/extensions/gsd/tests/{plugin-importer-live.test.ts → integration/plugin-importer-live.test.ts} +2 -2
- package/src/resources/extensions/gsd/tests/{queue-completed-milestone-perf.test.ts → integration/queue-completed-milestone-perf.test.ts} +3 -3
- package/src/resources/extensions/gsd/tests/{queue-reorder-e2e.test.ts → integration/queue-reorder-e2e.test.ts} +5 -5
- package/src/resources/extensions/gsd/tests/{quick-branch-lifecycle.test.ts → integration/quick-branch-lifecycle.test.ts} +5 -5
- package/src/resources/extensions/gsd/tests/{run-uat.test.ts → integration/run-uat.test.ts} +4 -4
- package/src/resources/extensions/gsd/tests/{token-savings.test.ts → integration/token-savings.test.ts} +3 -3
- package/src/resources/extensions/gsd/tests/{worktree-e2e.test.ts → integration/worktree-e2e.test.ts} +4 -4
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +226 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-queue-context.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +61 -19
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +49 -24
- package/src/resources/extensions/gsd/visualizer-overlay.ts +3 -3
- package/src/resources/extensions/shared/format-utils.ts +1 -1
- package/src/resources/extensions/subagent/worker-registry.ts +2 -1
- package/dist/web/standalone/.next/static/chunks/4024.87fd909ae0110f50.js +0 -9
- /package/dist/web/standalone/.next/static/{nISuDzAIpGYC-DVTvs4Po → k92jvAf8IfV4dZE3nnrAr}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{nISuDzAIpGYC-DVTvs4Po → k92jvAf8IfV4dZE3nnrAr}/_ssgManifest.js +0 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* worktree-preferences-sync.test.ts — Regression test for #2684.
|
|
3
3
|
*
|
|
4
|
-
* Verifies that
|
|
4
|
+
* Verifies that canonical PREFERENCES.md is seeded into auto-mode worktrees,
|
|
5
|
+
* while legacy lowercase preferences.md remains supported:
|
|
5
6
|
*
|
|
6
|
-
* 1.
|
|
7
|
-
* 2. syncGsdStateToWorktree()
|
|
8
|
-
* 3. syncWorktreeStateBack() does NOT overwrite project root
|
|
7
|
+
* 1. syncGsdStateToWorktree() forward-syncs PREFERENCES.md (additive only)
|
|
8
|
+
* 2. syncGsdStateToWorktree() still accepts legacy lowercase preferences.md
|
|
9
|
+
* 3. syncWorktreeStateBack() does NOT overwrite project root PREFERENCES.md
|
|
9
10
|
*/
|
|
10
11
|
|
|
11
12
|
import test from "node:test";
|
|
@@ -15,6 +16,7 @@ import {
|
|
|
15
16
|
mkdirSync,
|
|
16
17
|
mkdtempSync,
|
|
17
18
|
readFileSync,
|
|
19
|
+
readdirSync,
|
|
18
20
|
rmSync,
|
|
19
21
|
writeFileSync,
|
|
20
22
|
} from "node:fs";
|
|
@@ -56,35 +58,58 @@ const PREFS_CONTENT = [
|
|
|
56
58
|
' - use: "frontend-design"',
|
|
57
59
|
].join("\n");
|
|
58
60
|
|
|
59
|
-
test("#2684: syncGsdStateToWorktree forward-syncs
|
|
61
|
+
test("#2684: syncGsdStateToWorktree forward-syncs PREFERENCES.md when missing from worktree", (t) => {
|
|
60
62
|
const mainBase = makeTempDir("main");
|
|
61
63
|
const wtBase = makeTempDir("wt");
|
|
62
64
|
t.after(() => cleanup(mainBase, wtBase));
|
|
63
65
|
|
|
64
|
-
// Project root has
|
|
65
|
-
writeFile(mainBase, ".gsd/
|
|
66
|
+
// Project root has canonical PREFERENCES.md
|
|
67
|
+
writeFile(mainBase, ".gsd/PREFERENCES.md", PREFS_CONTENT);
|
|
66
68
|
|
|
67
|
-
// Worktree has .gsd/ but no preferences
|
|
69
|
+
// Worktree has .gsd/ but no preferences file
|
|
68
70
|
mkdirSync(join(wtBase, ".gsd"), { recursive: true });
|
|
69
71
|
|
|
70
72
|
const result = syncGsdStateToWorktree(mainBase, wtBase);
|
|
71
73
|
|
|
72
74
|
assert.ok(
|
|
73
|
-
existsSync(join(wtBase, ".gsd", "
|
|
74
|
-
"
|
|
75
|
+
existsSync(join(wtBase, ".gsd", "PREFERENCES.md")),
|
|
76
|
+
"PREFERENCES.md should be copied to worktree",
|
|
75
77
|
);
|
|
76
78
|
assert.equal(
|
|
77
|
-
readFileSync(join(wtBase, ".gsd", "
|
|
79
|
+
readFileSync(join(wtBase, ".gsd", "PREFERENCES.md"), "utf-8"),
|
|
78
80
|
PREFS_CONTENT,
|
|
79
|
-
"
|
|
81
|
+
"PREFERENCES.md content should match source",
|
|
82
|
+
);
|
|
83
|
+
assert.ok(
|
|
84
|
+
result.synced.includes("PREFERENCES.md"),
|
|
85
|
+
"PREFERENCES.md should appear in synced list",
|
|
86
|
+
);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test("syncGsdStateToWorktree still accepts legacy lowercase preferences.md", (t) => {
|
|
90
|
+
const mainBase = makeTempDir("main");
|
|
91
|
+
const wtBase = makeTempDir("wt");
|
|
92
|
+
t.after(() => cleanup(mainBase, wtBase));
|
|
93
|
+
|
|
94
|
+
writeFile(mainBase, ".gsd/preferences.md", PREFS_CONTENT);
|
|
95
|
+
mkdirSync(join(wtBase, ".gsd"), { recursive: true });
|
|
96
|
+
|
|
97
|
+
const result = syncGsdStateToWorktree(mainBase, wtBase);
|
|
98
|
+
|
|
99
|
+
const copiedEntries = readdirSync(join(wtBase, ".gsd"))
|
|
100
|
+
.filter((name) => name === "PREFERENCES.md" || name === "preferences.md");
|
|
101
|
+
|
|
102
|
+
assert.ok(
|
|
103
|
+
copiedEntries.length === 1,
|
|
104
|
+
`expected exactly one preferences file in worktree, got ${copiedEntries.join(", ") || "(none)"}`,
|
|
80
105
|
);
|
|
81
106
|
assert.ok(
|
|
82
|
-
result.synced.includes("preferences.md"),
|
|
83
|
-
"
|
|
107
|
+
result.synced.includes("preferences.md") || result.synced.includes("PREFERENCES.md"),
|
|
108
|
+
"legacy source should still appear in synced list",
|
|
84
109
|
);
|
|
85
110
|
});
|
|
86
111
|
|
|
87
|
-
test("#2684: syncGsdStateToWorktree does NOT overwrite existing worktree preferences
|
|
112
|
+
test("#2684: syncGsdStateToWorktree does NOT overwrite existing worktree preferences file", (t) => {
|
|
88
113
|
const mainBase = makeTempDir("main");
|
|
89
114
|
const wtBase = makeTempDir("wt");
|
|
90
115
|
t.after(() => cleanup(mainBase, wtBase));
|
|
@@ -92,19 +117,19 @@ test("#2684: syncGsdStateToWorktree does NOT overwrite existing worktree prefere
|
|
|
92
117
|
const rootPrefs = "# Root preferences\nold: true";
|
|
93
118
|
const wtPrefs = "# Worktree preferences\nmodified: true";
|
|
94
119
|
|
|
95
|
-
writeFile(mainBase, ".gsd/
|
|
96
|
-
writeFile(wtBase, ".gsd/
|
|
120
|
+
writeFile(mainBase, ".gsd/PREFERENCES.md", rootPrefs);
|
|
121
|
+
writeFile(wtBase, ".gsd/PREFERENCES.md", wtPrefs);
|
|
97
122
|
|
|
98
123
|
syncGsdStateToWorktree(mainBase, wtBase);
|
|
99
124
|
|
|
100
125
|
assert.equal(
|
|
101
|
-
readFileSync(join(wtBase, ".gsd", "
|
|
126
|
+
readFileSync(join(wtBase, ".gsd", "PREFERENCES.md"), "utf-8"),
|
|
102
127
|
wtPrefs,
|
|
103
|
-
"existing worktree
|
|
128
|
+
"existing worktree PREFERENCES.md must not be overwritten",
|
|
104
129
|
);
|
|
105
130
|
});
|
|
106
131
|
|
|
107
|
-
test("#2684: syncWorktreeStateBack does NOT overwrite project root
|
|
132
|
+
test("#2684: syncWorktreeStateBack does NOT overwrite project root PREFERENCES.md", (t) => {
|
|
108
133
|
const mainBase = makeTempDir("main");
|
|
109
134
|
const wtBase = makeTempDir("wt");
|
|
110
135
|
const mid = "M001";
|
|
@@ -113,8 +138,8 @@ test("#2684: syncWorktreeStateBack does NOT overwrite project root preferences.m
|
|
|
113
138
|
const rootPrefs = "# Root preferences\nauthoritative: true";
|
|
114
139
|
const wtPrefs = "# Worktree preferences\nstale-copy: true";
|
|
115
140
|
|
|
116
|
-
writeFile(mainBase, ".gsd/
|
|
117
|
-
writeFile(wtBase, ".gsd/
|
|
141
|
+
writeFile(mainBase, ".gsd/PREFERENCES.md", rootPrefs);
|
|
142
|
+
writeFile(wtBase, ".gsd/PREFERENCES.md", wtPrefs);
|
|
118
143
|
|
|
119
144
|
// Worktree needs at least a milestone dir for the function to proceed
|
|
120
145
|
mkdirSync(join(wtBase, ".gsd", "milestones", mid), { recursive: true });
|
|
@@ -123,8 +148,8 @@ test("#2684: syncWorktreeStateBack does NOT overwrite project root preferences.m
|
|
|
123
148
|
syncWorktreeStateBack(mainBase, wtBase, mid);
|
|
124
149
|
|
|
125
150
|
assert.equal(
|
|
126
|
-
readFileSync(join(mainBase, ".gsd", "
|
|
151
|
+
readFileSync(join(mainBase, ".gsd", "PREFERENCES.md"), "utf-8"),
|
|
127
152
|
rootPrefs,
|
|
128
|
-
"project root
|
|
153
|
+
"project root PREFERENCES.md must NOT be overwritten by worktree copy",
|
|
129
154
|
);
|
|
130
155
|
});
|
|
@@ -14,7 +14,10 @@ import {
|
|
|
14
14
|
renderHealthView,
|
|
15
15
|
type ProgressFilter,
|
|
16
16
|
} from "./visualizer-views.js";
|
|
17
|
+
import { writeFileSync, mkdirSync } from "node:fs";
|
|
18
|
+
import { join } from "node:path";
|
|
17
19
|
import { writeExportFile } from "./export.js";
|
|
20
|
+
import { gsdRoot } from "./paths.js";
|
|
18
21
|
import { stripAnsi } from "../shared/mod.js";
|
|
19
22
|
|
|
20
23
|
const TAB_COUNT = 10;
|
|
@@ -350,9 +353,6 @@ export class GSDVisualizerOverlay {
|
|
|
350
353
|
// Capture current active tab's rendered lines as snapshot
|
|
351
354
|
const snapshotLines = this.renderTabContent(this.activeTab, 80);
|
|
352
355
|
const timestamp = new Date().toISOString().replace(/[:.]/g, "-").slice(0, 19);
|
|
353
|
-
const { writeFileSync, mkdirSync } = require("node:fs");
|
|
354
|
-
const { join } = require("node:path");
|
|
355
|
-
const { gsdRoot } = require("./paths.js");
|
|
356
356
|
const exportDir = gsdRoot(this.basePath);
|
|
357
357
|
mkdirSync(exportDir, { recursive: true });
|
|
358
358
|
const outPath = join(exportDir, `snapshot-${timestamp}.txt`);
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
/** Format a millisecond duration as a compact human-readable string. */
|
|
13
13
|
export function formatDuration(ms: number): string {
|
|
14
|
-
if (ms < 1000) return `${ms}ms`;
|
|
14
|
+
if (ms > 0 && ms < 1000) return `${ms}ms`;
|
|
15
15
|
const s = Math.floor(ms / 1000);
|
|
16
16
|
if (s < 60) return `${s}s`;
|
|
17
17
|
const m = Math.floor(s / 60);
|
|
@@ -54,9 +54,10 @@ export function updateWorker(id: string, status: "completed" | "failed"): void {
|
|
|
54
54
|
if (entry) {
|
|
55
55
|
entry.status = status;
|
|
56
56
|
// Remove after a brief display window (5 seconds)
|
|
57
|
+
// unref() so the timer doesn't keep the process alive in test environments
|
|
57
58
|
setTimeout(() => {
|
|
58
59
|
activeWorkers.delete(id);
|
|
59
|
-
}, 5000);
|
|
60
|
+
}, 5000).unref();
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
|