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.
Files changed (99) hide show
  1. package/dist/resource-loader.js +34 -1
  2. package/dist/resources/extensions/github-sync/cli.js +284 -0
  3. package/dist/resources/extensions/github-sync/index.js +73 -0
  4. package/dist/resources/extensions/github-sync/mapping.js +67 -0
  5. package/dist/resources/extensions/github-sync/sync.js +424 -0
  6. package/dist/resources/extensions/github-sync/templates.js +118 -0
  7. package/dist/resources/extensions/github-sync/types.js +7 -0
  8. package/dist/resources/extensions/gsd/auto/session.js +3 -23
  9. package/dist/resources/extensions/gsd/auto-dispatch.js +1 -1
  10. package/dist/resources/extensions/gsd/auto-loop.js +292 -263
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +28 -3
  12. package/dist/resources/extensions/gsd/auto-prompts.js +23 -43
  13. package/dist/resources/extensions/gsd/auto-start.js +7 -1
  14. package/dist/resources/extensions/gsd/auto-worktree.js +3 -3
  15. package/dist/resources/extensions/gsd/auto.js +143 -80
  16. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  17. package/dist/resources/extensions/gsd/commands.js +2 -1
  18. package/dist/resources/extensions/gsd/context-budget.js +2 -10
  19. package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -2
  20. package/dist/resources/extensions/gsd/doctor-providers.js +27 -11
  21. package/dist/resources/extensions/gsd/doctor.js +20 -1
  22. package/dist/resources/extensions/gsd/exit-command.js +2 -1
  23. package/dist/resources/extensions/gsd/files.js +4 -0
  24. package/dist/resources/extensions/gsd/git-service.js +15 -12
  25. package/dist/resources/extensions/gsd/guided-flow.js +82 -32
  26. package/dist/resources/extensions/gsd/index.js +22 -19
  27. package/dist/resources/extensions/gsd/native-git-bridge.js +37 -0
  28. package/dist/resources/extensions/gsd/preferences-models.js +0 -12
  29. package/dist/resources/extensions/gsd/preferences-types.js +1 -1
  30. package/dist/resources/extensions/gsd/preferences-validation.js +58 -10
  31. package/dist/resources/extensions/gsd/preferences.js +4 -2
  32. package/dist/resources/extensions/gsd/prompts/run-uat.md +2 -0
  33. package/dist/resources/extensions/gsd/repo-identity.js +19 -3
  34. package/dist/resources/extensions/gsd/roadmap-mutations.js +24 -0
  35. package/dist/resources/extensions/mcp-client/index.js +14 -1
  36. package/package.json +1 -1
  37. package/packages/pi-ai/dist/utils/oauth/anthropic.js +2 -2
  38. package/packages/pi-ai/dist/utils/oauth/anthropic.js.map +1 -1
  39. package/packages/pi-ai/src/utils/oauth/anthropic.ts +2 -2
  40. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  41. package/packages/pi-coding-agent/dist/core/extensions/loader.js +205 -7
  42. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  43. package/packages/pi-coding-agent/src/core/extensions/loader.ts +223 -7
  44. package/src/resources/extensions/github-sync/cli.ts +364 -0
  45. package/src/resources/extensions/github-sync/index.ts +93 -0
  46. package/src/resources/extensions/github-sync/mapping.ts +81 -0
  47. package/src/resources/extensions/github-sync/sync.ts +556 -0
  48. package/src/resources/extensions/github-sync/templates.ts +183 -0
  49. package/src/resources/extensions/github-sync/tests/cli.test.ts +20 -0
  50. package/src/resources/extensions/github-sync/tests/commit-linking.test.ts +39 -0
  51. package/src/resources/extensions/github-sync/tests/mapping.test.ts +104 -0
  52. package/src/resources/extensions/github-sync/tests/templates.test.ts +110 -0
  53. package/src/resources/extensions/github-sync/types.ts +47 -0
  54. package/src/resources/extensions/gsd/auto/session.ts +3 -25
  55. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -1
  56. package/src/resources/extensions/gsd/auto-loop.ts +382 -360
  57. package/src/resources/extensions/gsd/auto-post-unit.ts +29 -3
  58. package/src/resources/extensions/gsd/auto-prompts.ts +25 -45
  59. package/src/resources/extensions/gsd/auto-start.ts +11 -1
  60. package/src/resources/extensions/gsd/auto-worktree.ts +3 -3
  61. package/src/resources/extensions/gsd/auto.ts +139 -86
  62. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  63. package/src/resources/extensions/gsd/commands.ts +2 -2
  64. package/src/resources/extensions/gsd/context-budget.ts +2 -12
  65. package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -2
  66. package/src/resources/extensions/gsd/doctor-providers.ts +26 -9
  67. package/src/resources/extensions/gsd/doctor.ts +22 -1
  68. package/src/resources/extensions/gsd/exit-command.ts +2 -2
  69. package/src/resources/extensions/gsd/files.ts +3 -1
  70. package/src/resources/extensions/gsd/git-service.ts +20 -10
  71. package/src/resources/extensions/gsd/guided-flow.ts +110 -38
  72. package/src/resources/extensions/gsd/index.ts +21 -16
  73. package/src/resources/extensions/gsd/native-git-bridge.ts +37 -0
  74. package/src/resources/extensions/gsd/preferences-models.ts +0 -12
  75. package/src/resources/extensions/gsd/preferences-types.ts +4 -4
  76. package/src/resources/extensions/gsd/preferences-validation.ts +50 -10
  77. package/src/resources/extensions/gsd/preferences.ts +3 -2
  78. package/src/resources/extensions/gsd/prompts/run-uat.md +2 -0
  79. package/src/resources/extensions/gsd/repo-identity.ts +20 -3
  80. package/src/resources/extensions/gsd/roadmap-mutations.ts +29 -0
  81. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +21 -18
  82. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +122 -68
  83. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +86 -3
  84. package/src/resources/extensions/gsd/tests/preferences.test.ts +2 -7
  85. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +21 -1
  86. package/src/resources/extensions/gsd/types.ts +0 -1
  87. package/src/resources/extensions/mcp-client/index.ts +17 -1
  88. package/dist/resources/extensions/gsd/prompt-compressor.js +0 -393
  89. package/dist/resources/extensions/gsd/semantic-chunker.js +0 -254
  90. package/dist/resources/extensions/gsd/summary-distiller.js +0 -212
  91. package/src/resources/extensions/gsd/prompt-compressor.ts +0 -508
  92. package/src/resources/extensions/gsd/semantic-chunker.ts +0 -336
  93. package/src/resources/extensions/gsd/summary-distiller.ts +0 -258
  94. package/src/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
  95. package/src/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
  96. package/src/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
  97. package/src/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
  98. package/src/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
  99. 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
- });