gsd-pi 2.49.0-dev.c319e08 → 2.49.0-dev.de3d9f6
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/resources/extensions/gsd/auto/session.js +0 -4
- package/dist/resources/extensions/gsd/guided-flow-queue.js +11 -10
- package/dist/resources/extensions/gsd/worktree-resolver.js +0 -24
- 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 +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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.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/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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-paths-manifest.json +18 -18
- 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/package.json +1 -1
- package/src/resources/extensions/gsd/auto/session.ts +0 -5
- package/src/resources/extensions/gsd/guided-flow-queue.ts +12 -11
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -67
- package/src/resources/extensions/gsd/worktree-resolver.ts +0 -31
- package/src/resources/extensions/gsd/tests/queue-completed-milestone-perf.test.ts +0 -155
- /package/dist/web/standalone/.next/static/{QBhWLjeTSHlwrt9jbPmIz → ceckLbAMjhzHaQ3RPtJnT}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{QBhWLjeTSHlwrt9jbPmIz → ceckLbAMjhzHaQ3RPtJnT}/_ssgManifest.js +0 -0
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression test for #2379: /gsd queue fails with 429 rate limit on projects
|
|
3
|
-
* with many completed milestones.
|
|
4
|
-
*
|
|
5
|
-
* The bug: buildExistingMilestonesContext iterates over ALL milestones
|
|
6
|
-
* (including completed ones) and calls loadFile for CONTEXT, SUMMARY,
|
|
7
|
-
* CONTEXT-DRAFT, and ROADMAP files on each — causing excessive I/O that
|
|
8
|
-
* triggers rate limits on large projects.
|
|
9
|
-
*
|
|
10
|
-
* The fix: completed milestones should emit a short summary line without
|
|
11
|
-
* loading their heavy artifact files (CONTEXT.md, SUMMARY.md, etc.).
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
15
|
-
import { join } from "node:path";
|
|
16
|
-
import { tmpdir } from "node:os";
|
|
17
|
-
|
|
18
|
-
import { buildExistingMilestonesContext } from "../guided-flow-queue.ts";
|
|
19
|
-
import type { GSDState, MilestoneRegistryEntry } from "../types.ts";
|
|
20
|
-
import { createTestContext } from "./test-helpers.ts";
|
|
21
|
-
|
|
22
|
-
const { assertTrue, assertEq, report } = createTestContext();
|
|
23
|
-
|
|
24
|
-
// ─── Fixture: project with many completed milestones ─────────────────────
|
|
25
|
-
|
|
26
|
-
const tmpBase = mkdtempSync(join(tmpdir(), "gsd-queue-perf-"));
|
|
27
|
-
const gsd = join(tmpBase, ".gsd");
|
|
28
|
-
mkdirSync(join(gsd, "milestones"), { recursive: true });
|
|
29
|
-
|
|
30
|
-
const COMPLETED_COUNT = 25;
|
|
31
|
-
const ACTIVE_COUNT = 1;
|
|
32
|
-
const PENDING_COUNT = 2;
|
|
33
|
-
|
|
34
|
-
const allMilestoneIds: string[] = [];
|
|
35
|
-
const registry: MilestoneRegistryEntry[] = [];
|
|
36
|
-
|
|
37
|
-
// Create 25 completed milestones with CONTEXT.md and SUMMARY.md files
|
|
38
|
-
for (let i = 1; i <= COMPLETED_COUNT; i++) {
|
|
39
|
-
const mid = `M${String(i).padStart(3, "0")}`;
|
|
40
|
-
allMilestoneIds.push(mid);
|
|
41
|
-
registry.push({ id: mid, title: `Completed milestone ${i}`, status: "complete" });
|
|
42
|
-
mkdirSync(join(gsd, "milestones", mid), { recursive: true });
|
|
43
|
-
writeFileSync(
|
|
44
|
-
join(gsd, "milestones", mid, `${mid}-CONTEXT.md`),
|
|
45
|
-
`# ${mid}: Completed milestone ${i}\n\nThis is a large context document for ${mid}.\n${"Lorem ipsum dolor sit amet. ".repeat(50)}\n`,
|
|
46
|
-
);
|
|
47
|
-
writeFileSync(
|
|
48
|
-
join(gsd, "milestones", mid, `${mid}-SUMMARY.md`),
|
|
49
|
-
`# ${mid} Summary\n\nDelivered feature ${i} successfully.\n`,
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Create 1 active milestone
|
|
54
|
-
{
|
|
55
|
-
const mid = `M${String(COMPLETED_COUNT + 1).padStart(3, "0")}`;
|
|
56
|
-
allMilestoneIds.push(mid);
|
|
57
|
-
registry.push({ id: mid, title: "Active milestone", status: "active" });
|
|
58
|
-
mkdirSync(join(gsd, "milestones", mid), { recursive: true });
|
|
59
|
-
writeFileSync(
|
|
60
|
-
join(gsd, "milestones", mid, `${mid}-CONTEXT.md`),
|
|
61
|
-
`# ${mid}: Active milestone\n\nCurrently in progress.\n`,
|
|
62
|
-
);
|
|
63
|
-
writeFileSync(
|
|
64
|
-
join(gsd, "milestones", mid, `${mid}-ROADMAP.md`),
|
|
65
|
-
`# ${mid} Roadmap\n\nSlices planned.\n`,
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Create 2 pending milestones
|
|
70
|
-
for (let i = 0; i < PENDING_COUNT; i++) {
|
|
71
|
-
const mid = `M${String(COMPLETED_COUNT + ACTIVE_COUNT + 1 + i).padStart(3, "0")}`;
|
|
72
|
-
allMilestoneIds.push(mid);
|
|
73
|
-
registry.push({ id: mid, title: `Pending milestone ${i + 1}`, status: "pending" });
|
|
74
|
-
mkdirSync(join(gsd, "milestones", mid), { recursive: true });
|
|
75
|
-
writeFileSync(
|
|
76
|
-
join(gsd, "milestones", mid, `${mid}-CONTEXT.md`),
|
|
77
|
-
`# ${mid}: Pending milestone ${i + 1}\n\nQueued work.\n`,
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const state: GSDState = {
|
|
82
|
-
activeMilestone: { id: `M${String(COMPLETED_COUNT + 1).padStart(3, "0")}`, title: "Active milestone" },
|
|
83
|
-
activeSlice: null,
|
|
84
|
-
activeTask: null,
|
|
85
|
-
phase: "executing",
|
|
86
|
-
recentDecisions: [],
|
|
87
|
-
blockers: [],
|
|
88
|
-
nextAction: "",
|
|
89
|
-
registry,
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
// ─── Test: completed milestones should NOT have their files loaded ────────
|
|
93
|
-
|
|
94
|
-
console.log("\n=== Queue completed milestone performance (#2379) ===");
|
|
95
|
-
|
|
96
|
-
const context = await buildExistingMilestonesContext(tmpBase, allMilestoneIds, state);
|
|
97
|
-
|
|
98
|
-
// Active and pending milestones SHOULD have full context loaded
|
|
99
|
-
const activeMid = `M${String(COMPLETED_COUNT + 1).padStart(3, "0")}`;
|
|
100
|
-
assertTrue(
|
|
101
|
-
context.includes("Currently in progress"),
|
|
102
|
-
"Active milestone context content should be loaded",
|
|
103
|
-
);
|
|
104
|
-
assertTrue(
|
|
105
|
-
context.includes("Slices planned"),
|
|
106
|
-
"Active milestone roadmap should be loaded",
|
|
107
|
-
);
|
|
108
|
-
|
|
109
|
-
for (let i = 0; i < PENDING_COUNT; i++) {
|
|
110
|
-
const mid = `M${String(COMPLETED_COUNT + ACTIVE_COUNT + 1 + i).padStart(3, "0")}`;
|
|
111
|
-
assertTrue(
|
|
112
|
-
context.includes(`Pending milestone ${i + 1}`),
|
|
113
|
-
`Pending milestone ${mid} context should be loaded`,
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Completed milestones should NOT have their CONTEXT.md body or SUMMARY.md
|
|
118
|
-
// content loaded — only a status line
|
|
119
|
-
for (let i = 1; i <= COMPLETED_COUNT; i++) {
|
|
120
|
-
const mid = `M${String(i).padStart(3, "0")}`;
|
|
121
|
-
|
|
122
|
-
// Should still mention the milestone ID and status
|
|
123
|
-
assertTrue(
|
|
124
|
-
context.includes(mid),
|
|
125
|
-
`Completed milestone ${mid} should still be referenced`,
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
// Should NOT contain the heavy context body text
|
|
129
|
-
assertTrue(
|
|
130
|
-
!context.includes(`This is a large context document for ${mid}`),
|
|
131
|
-
`Completed milestone ${mid} should NOT have its full CONTEXT.md body loaded`,
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
// Should NOT contain the summary body
|
|
135
|
-
assertTrue(
|
|
136
|
-
!context.includes(`Delivered feature ${i} successfully`),
|
|
137
|
-
`Completed milestone ${mid} should NOT have its SUMMARY.md body loaded`,
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// ─── Test: the overall context should be reasonable in size ──────────────
|
|
142
|
-
|
|
143
|
-
// With 25 completed milestones NOT loading files, the context should be
|
|
144
|
-
// significantly smaller than if all files were loaded
|
|
145
|
-
const contextLines = context.split("\n").length;
|
|
146
|
-
assertTrue(
|
|
147
|
-
contextLines < 200,
|
|
148
|
-
`Context should be concise (got ${contextLines} lines); completed milestones should not inflate it`,
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
// ─── Cleanup ──────────────────────────────────────────────────────────────
|
|
152
|
-
|
|
153
|
-
rmSync(tmpBase, { recursive: true, force: true });
|
|
154
|
-
|
|
155
|
-
report();
|
|
File without changes
|
|
File without changes
|