gsd-pi 2.38.0-dev.bc2e21e → 2.38.0-dev.d533afb
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/resource-loader.js +34 -1
- package/dist/resources/extensions/github-sync/cli.js +284 -0
- package/dist/resources/extensions/github-sync/index.js +73 -0
- package/dist/resources/extensions/github-sync/mapping.js +67 -0
- package/dist/resources/extensions/github-sync/sync.js +424 -0
- package/dist/resources/extensions/github-sync/templates.js +118 -0
- package/dist/resources/extensions/github-sync/types.js +7 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -23
- package/dist/resources/extensions/gsd/auto-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto-loop.js +292 -263
- package/dist/resources/extensions/gsd/auto-post-unit.js +28 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +23 -43
- package/dist/resources/extensions/gsd/auto-start.js +7 -1
- package/dist/resources/extensions/gsd/auto-worktree.js +3 -3
- package/dist/resources/extensions/gsd/auto.js +143 -80
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
- package/dist/resources/extensions/gsd/commands.js +2 -1
- package/dist/resources/extensions/gsd/context-budget.js +2 -10
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -2
- package/dist/resources/extensions/gsd/doctor-providers.js +27 -11
- package/dist/resources/extensions/gsd/doctor.js +20 -1
- package/dist/resources/extensions/gsd/exit-command.js +2 -1
- package/dist/resources/extensions/gsd/files.js +4 -0
- package/dist/resources/extensions/gsd/git-service.js +15 -12
- package/dist/resources/extensions/gsd/guided-flow.js +82 -32
- package/dist/resources/extensions/gsd/index.js +22 -19
- package/dist/resources/extensions/gsd/native-git-bridge.js +37 -0
- package/dist/resources/extensions/gsd/preferences-models.js +0 -12
- package/dist/resources/extensions/gsd/preferences-types.js +1 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +58 -10
- package/dist/resources/extensions/gsd/preferences.js +4 -2
- package/dist/resources/extensions/gsd/prompts/run-uat.md +2 -0
- package/dist/resources/extensions/gsd/repo-identity.js +19 -3
- package/dist/resources/extensions/gsd/roadmap-mutations.js +24 -0
- package/dist/resources/extensions/mcp-client/index.js +14 -1
- package/package.json +1 -1
- package/packages/pi-ai/dist/utils/oauth/anthropic.js +2 -2
- package/packages/pi-ai/dist/utils/oauth/anthropic.js.map +1 -1
- package/packages/pi-ai/src/utils/oauth/anthropic.ts +2 -2
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +205 -7
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +223 -7
- package/src/resources/extensions/github-sync/cli.ts +364 -0
- package/src/resources/extensions/github-sync/index.ts +93 -0
- package/src/resources/extensions/github-sync/mapping.ts +81 -0
- package/src/resources/extensions/github-sync/sync.ts +556 -0
- package/src/resources/extensions/github-sync/templates.ts +183 -0
- package/src/resources/extensions/github-sync/tests/cli.test.ts +20 -0
- package/src/resources/extensions/github-sync/tests/commit-linking.test.ts +39 -0
- package/src/resources/extensions/github-sync/tests/mapping.test.ts +104 -0
- package/src/resources/extensions/github-sync/tests/templates.test.ts +110 -0
- package/src/resources/extensions/github-sync/types.ts +47 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -25
- package/src/resources/extensions/gsd/auto-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto-loop.ts +382 -360
- package/src/resources/extensions/gsd/auto-post-unit.ts +29 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +25 -45
- package/src/resources/extensions/gsd/auto-start.ts +11 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +3 -3
- package/src/resources/extensions/gsd/auto.ts +139 -86
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
- package/src/resources/extensions/gsd/commands.ts +2 -2
- package/src/resources/extensions/gsd/context-budget.ts +2 -12
- package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -2
- package/src/resources/extensions/gsd/doctor-providers.ts +26 -9
- package/src/resources/extensions/gsd/doctor.ts +22 -1
- package/src/resources/extensions/gsd/exit-command.ts +2 -2
- package/src/resources/extensions/gsd/files.ts +3 -1
- package/src/resources/extensions/gsd/git-service.ts +20 -10
- package/src/resources/extensions/gsd/guided-flow.ts +110 -38
- package/src/resources/extensions/gsd/index.ts +21 -16
- package/src/resources/extensions/gsd/native-git-bridge.ts +37 -0
- package/src/resources/extensions/gsd/preferences-models.ts +0 -12
- package/src/resources/extensions/gsd/preferences-types.ts +4 -4
- package/src/resources/extensions/gsd/preferences-validation.ts +50 -10
- package/src/resources/extensions/gsd/preferences.ts +3 -2
- package/src/resources/extensions/gsd/prompts/run-uat.md +2 -0
- package/src/resources/extensions/gsd/repo-identity.ts +20 -3
- package/src/resources/extensions/gsd/roadmap-mutations.ts +29 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +21 -18
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +122 -68
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +86 -3
- package/src/resources/extensions/gsd/tests/preferences.test.ts +2 -7
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +21 -1
- package/src/resources/extensions/gsd/types.ts +0 -1
- package/src/resources/extensions/mcp-client/index.ts +17 -1
- package/dist/resources/extensions/gsd/prompt-compressor.js +0 -393
- package/dist/resources/extensions/gsd/semantic-chunker.js +0 -254
- package/dist/resources/extensions/gsd/summary-distiller.js +0 -212
- package/src/resources/extensions/gsd/prompt-compressor.ts +0 -508
- package/src/resources/extensions/gsd/semantic-chunker.ts +0 -336
- package/src/resources/extensions/gsd/summary-distiller.ts +0 -258
- package/src/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
- package/src/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
- package/src/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
- package/src/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
- package/src/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
- package/src/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +0 -164
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context Compression — unit tests for M004/S02.
|
|
3
|
-
*
|
|
4
|
-
* Verifies that prompt builders respect inlineLevel parameter by
|
|
5
|
-
* inspecting the auto-prompts.ts source for level-aware gating.
|
|
6
|
-
* Cannot call builders directly due to @gsd/pi-coding-agent import
|
|
7
|
-
* resolution — uses source-level structural verification instead.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import test from "node:test";
|
|
11
|
-
import assert from "node:assert/strict";
|
|
12
|
-
import { readFileSync } from "node:fs";
|
|
13
|
-
import { join, dirname } from "node:path";
|
|
14
|
-
import { fileURLToPath } from "node:url";
|
|
15
|
-
|
|
16
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
|
-
const promptsSrc = readFileSync(join(__dirname, "..", "auto-prompts.ts"), "utf-8");
|
|
18
|
-
|
|
19
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
20
|
-
// inlineLevel Parameter Presence
|
|
21
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
22
|
-
|
|
23
|
-
const BUILDERS_WITH_LEVEL = [
|
|
24
|
-
"buildPlanMilestonePrompt",
|
|
25
|
-
"buildPlanSlicePrompt",
|
|
26
|
-
"buildExecuteTaskPrompt",
|
|
27
|
-
"buildCompleteSlicePrompt",
|
|
28
|
-
"buildCompleteMilestonePrompt",
|
|
29
|
-
"buildReassessRoadmapPrompt",
|
|
30
|
-
];
|
|
31
|
-
|
|
32
|
-
for (const builder of BUILDERS_WITH_LEVEL) {
|
|
33
|
-
test(`compression: ${builder} accepts inlineLevel parameter`, () => {
|
|
34
|
-
// Find the function signature
|
|
35
|
-
const sigRegex = new RegExp(`export async function ${builder}\\([^)]*level\\?: InlineLevel`);
|
|
36
|
-
assert.ok(
|
|
37
|
-
sigRegex.test(promptsSrc),
|
|
38
|
-
`${builder} should have level?: InlineLevel parameter`,
|
|
39
|
-
);
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
44
|
-
// Default Level Resolution
|
|
45
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
46
|
-
|
|
47
|
-
test("compression: builders default to resolveInlineLevel() when no level passed", () => {
|
|
48
|
-
const defaultPattern = /const inlineLevel = level \?\? resolveInlineLevel\(\)/g;
|
|
49
|
-
const matches = promptsSrc.match(defaultPattern);
|
|
50
|
-
assert.ok(matches, "should have resolveInlineLevel() fallback");
|
|
51
|
-
assert.ok(
|
|
52
|
-
matches.length >= BUILDERS_WITH_LEVEL.length,
|
|
53
|
-
`should have ${BUILDERS_WITH_LEVEL.length} fallback instances, found ${matches?.length}`,
|
|
54
|
-
);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
58
|
-
// Minimal Level — Template Reduction
|
|
59
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
60
|
-
|
|
61
|
-
test("compression: buildExecuteTaskPrompt minimal drops decisions template", () => {
|
|
62
|
-
// In the execute-task builder, minimal should only inline task-summary, not decisions
|
|
63
|
-
assert.ok(
|
|
64
|
-
promptsSrc.includes('inlineLevel === "minimal"') &&
|
|
65
|
-
promptsSrc.includes('inlineTemplate("task-summary"'),
|
|
66
|
-
"execute-task should conditionally include decisions template based on level",
|
|
67
|
-
);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("compression: buildExecuteTaskPrompt minimal truncates prior summaries", () => {
|
|
71
|
-
assert.ok(
|
|
72
|
-
promptsSrc.includes('inlineLevel === "minimal" && priorSummaries.length > 1'),
|
|
73
|
-
"execute-task should limit prior summaries for minimal level",
|
|
74
|
-
);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test("compression: buildExecuteTaskPrompt passes verificationBudget to loadPrompt (#707)", () => {
|
|
78
|
-
// The execute-task template declares {{verificationBudget}} — the builder must supply it
|
|
79
|
-
assert.ok(
|
|
80
|
-
promptsSrc.includes("verificationBudget"),
|
|
81
|
-
"buildExecuteTaskPrompt should pass verificationBudget in the loadPrompt vars object",
|
|
82
|
-
);
|
|
83
|
-
// Verify it computes the budget from computeBudgets
|
|
84
|
-
assert.ok(
|
|
85
|
-
promptsSrc.includes("computeBudgets(contextWindow)"),
|
|
86
|
-
"buildExecuteTaskPrompt should compute budgets from the executor context window",
|
|
87
|
-
);
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
test("compression: buildPlanMilestonePrompt minimal drops project/requirements/decisions files", () => {
|
|
91
|
-
// The plan-milestone builder should gate root file inlining on inlineLevel
|
|
92
|
-
assert.ok(
|
|
93
|
-
promptsSrc.includes('inlineLevel !== "minimal"') &&
|
|
94
|
-
promptsSrc.includes("inlineProjectFromDb(base)"),
|
|
95
|
-
"plan-milestone should conditionally include project.md based on level",
|
|
96
|
-
);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
test("compression: buildPlanMilestonePrompt minimal drops extra templates", () => {
|
|
100
|
-
// Full inlines 5 templates, minimal should inline fewer
|
|
101
|
-
assert.ok(
|
|
102
|
-
promptsSrc.includes('if (inlineLevel === "full")') &&
|
|
103
|
-
promptsSrc.includes('inlineTemplate("secrets-manifest"'),
|
|
104
|
-
"plan-milestone should only include secrets-manifest template at full level",
|
|
105
|
-
);
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
109
|
-
// Complete-Slice Level Gating
|
|
110
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
111
|
-
|
|
112
|
-
test("compression: buildCompleteSlicePrompt minimal drops requirements", () => {
|
|
113
|
-
// Find the complete-slice section and verify requirements gating
|
|
114
|
-
const completeSliceIdx = promptsSrc.indexOf("buildCompleteSlicePrompt");
|
|
115
|
-
const nextBuilder = promptsSrc.indexOf("buildCompleteMilestonePrompt");
|
|
116
|
-
const completeSliceBlock = promptsSrc.slice(completeSliceIdx, nextBuilder);
|
|
117
|
-
assert.ok(
|
|
118
|
-
completeSliceBlock.includes('inlineLevel !== "minimal"'),
|
|
119
|
-
"complete-slice should gate requirements inlining on level",
|
|
120
|
-
);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test("compression: buildCompleteSlicePrompt minimal drops UAT template", () => {
|
|
124
|
-
const completeSliceIdx = promptsSrc.indexOf("buildCompleteSlicePrompt");
|
|
125
|
-
const nextBuilder = promptsSrc.indexOf("buildCompleteMilestonePrompt");
|
|
126
|
-
const completeSliceBlock = promptsSrc.slice(completeSliceIdx, nextBuilder);
|
|
127
|
-
assert.ok(
|
|
128
|
-
completeSliceBlock.includes('inlineLevel !== "minimal"') &&
|
|
129
|
-
completeSliceBlock.includes('inlineTemplate("uat"'),
|
|
130
|
-
"complete-slice should conditionally include UAT template based on level",
|
|
131
|
-
);
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
135
|
-
// Complete-Milestone Level Gating
|
|
136
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
137
|
-
|
|
138
|
-
test("compression: buildCompleteMilestonePrompt minimal drops root GSD files", () => {
|
|
139
|
-
const completeMilestoneIdx = promptsSrc.indexOf("buildCompleteMilestonePrompt");
|
|
140
|
-
const nextBuilder = promptsSrc.indexOf("buildReplanSlicePrompt");
|
|
141
|
-
const block = promptsSrc.slice(completeMilestoneIdx, nextBuilder);
|
|
142
|
-
assert.ok(
|
|
143
|
-
block.includes('inlineLevel !== "minimal"') &&
|
|
144
|
-
(block.includes('inlineGsdRootFile(base, "requirements.md"') || block.includes('inlineRequirementsFromDb(base')),
|
|
145
|
-
"complete-milestone should gate root file inlining on level",
|
|
146
|
-
);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
150
|
-
// Reassess-Roadmap Level Gating
|
|
151
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
152
|
-
|
|
153
|
-
test("compression: buildReassessRoadmapPrompt minimal drops project/requirements/decisions", () => {
|
|
154
|
-
const reassessIdx = promptsSrc.indexOf("buildReassessRoadmapPrompt");
|
|
155
|
-
const block = promptsSrc.slice(reassessIdx, reassessIdx + 1500);
|
|
156
|
-
assert.ok(
|
|
157
|
-
block.includes('inlineLevel !== "minimal"'),
|
|
158
|
-
"reassess-roadmap should gate file inlining on level",
|
|
159
|
-
);
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
163
|
-
// Full Level — No Regression
|
|
164
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
165
|
-
|
|
166
|
-
test("compression: full level preserves all templates and files (no regression)", () => {
|
|
167
|
-
// Verify the key template names are still present in the source
|
|
168
|
-
const expectedTemplates = [
|
|
169
|
-
"roadmap", "decisions", "plan", "task-plan", "secrets-manifest",
|
|
170
|
-
"task-summary", "slice-summary", "uat", "milestone-summary",
|
|
171
|
-
];
|
|
172
|
-
for (const tpl of expectedTemplates) {
|
|
173
|
-
assert.ok(
|
|
174
|
-
promptsSrc.includes(`inlineTemplate("${tpl}"`),
|
|
175
|
-
`template "${tpl}" should still be present in auto-prompts.ts`,
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
181
|
-
// Import Verification
|
|
182
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
183
|
-
|
|
184
|
-
test("compression: auto-prompts.ts imports resolveInlineLevel and InlineLevel", () => {
|
|
185
|
-
assert.ok(
|
|
186
|
-
promptsSrc.includes("resolveInlineLevel"),
|
|
187
|
-
"should import resolveInlineLevel from preferences",
|
|
188
|
-
);
|
|
189
|
-
assert.ok(
|
|
190
|
-
promptsSrc.includes("InlineLevel"),
|
|
191
|
-
"should import InlineLevel type from types",
|
|
192
|
-
);
|
|
193
|
-
});
|