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,164 +0,0 @@
1
- import { describe, it } from "node:test";
2
- import assert from "node:assert/strict";
3
-
4
- // Test the type definitions exist and are correct
5
- describe("token-optimization: types", () => {
6
- it("CompressionStrategy accepts valid values", async () => {
7
- const { } = await import("../types.js");
8
- // Type-level test — if this compiles, the types exist
9
- const truncate: import("../types.js").CompressionStrategy = "truncate";
10
- const compress: import("../types.js").CompressionStrategy = "compress";
11
- assert.equal(truncate, "truncate");
12
- assert.equal(compress, "compress");
13
- });
14
-
15
- it("ContextSelectionMode accepts valid values", async () => {
16
- const full: import("../types.js").ContextSelectionMode = "full";
17
- const smart: import("../types.js").ContextSelectionMode = "smart";
18
- assert.equal(full, "full");
19
- assert.equal(smart, "smart");
20
- });
21
- });
22
-
23
- // Test cache hit rate computation
24
- describe("token-optimization: cache hit rate", () => {
25
- it("computeCacheHitRate returns correct percentage", async () => {
26
- const { computeCacheHitRate } = await import("../prompt-cache-optimizer.js");
27
- assert.equal(computeCacheHitRate({ cacheRead: 900, cacheWrite: 100, input: 100 }), 90);
28
- assert.equal(computeCacheHitRate({ cacheRead: 0, cacheWrite: 0, input: 100 }), 0);
29
- assert.equal(computeCacheHitRate({ cacheRead: 0, cacheWrite: 0, input: 0 }), 0);
30
- assert.equal(computeCacheHitRate({ cacheRead: 500, cacheWrite: 0, input: 500 }), 50);
31
- });
32
- });
33
-
34
- // Test structured data savings
35
- describe("token-optimization: structured data savings", () => {
36
- it("compact decisions format is shorter than markdown table", async () => {
37
- const { formatDecisionsCompact, measureSavings } = await import("../structured-data-formatter.js");
38
- const decisions = [
39
- { id: "D001", when_context: "M001/S01", scope: "architecture", decision: "Use SQLite for storage", choice: "WAL mode", rationale: "Built-in, no external deps", revisable: "yes" },
40
- { id: "D002", when_context: "M001/S02", scope: "testing", decision: "Unit test all parsers", choice: "node:test", rationale: "Fast, zero-dependency", revisable: "no" },
41
- ];
42
- const compact = formatDecisionsCompact(decisions);
43
- // A realistic markdown table equivalent
44
- const markdown = [
45
- "| # | When | Scope | Decision | Choice | Rationale | Revisable? |",
46
- "|---|------|-------|----------|--------|-----------|------------|",
47
- "| D001 | M001/S01 | architecture | Use SQLite for storage | WAL mode | Built-in, no external deps | yes |",
48
- "| D002 | M001/S02 | testing | Unit test all parsers | node:test | Fast, zero-dependency | no |",
49
- ].join("\n");
50
- const savings = measureSavings(compact, markdown);
51
- assert.ok(savings > 10, `Expected >10% savings, got ${savings}%`);
52
- });
53
-
54
- it("compact requirements format drops low-value fields", async () => {
55
- const { formatRequirementsCompact } = await import("../structured-data-formatter.js");
56
- const requirements = [{
57
- id: "R001", class: "functional", status: "active",
58
- description: "API response time < 200ms",
59
- why: "User experience", primary_owner: "S01",
60
- validation: "Load test P99 < 200ms",
61
- }];
62
- const compact = formatRequirementsCompact(requirements);
63
- assert.ok(!compact.includes("source"), "Should not include source field");
64
- assert.ok(!compact.includes("supporting_slices"), "Should not include supporting_slices");
65
- assert.ok(compact.includes("R001"), "Should include requirement ID");
66
- });
67
- });
68
-
69
- // Test compression levels
70
- describe("token-optimization: prompt compression", () => {
71
- it("light compression removes extra whitespace", async () => {
72
- const { compressPrompt } = await import("../prompt-compressor.js");
73
- const input = "Line 1\n\n\n\n\nLine 2\n\n\n\nLine 3";
74
- const result = compressPrompt(input, { level: "light" });
75
- assert.ok(result.savingsPercent > 0, "Should have positive savings");
76
- assert.ok(!result.content.includes("\n\n\n"), "Should collapse multiple blank lines");
77
- });
78
-
79
- it("moderate compression abbreviates verbose phrases", async () => {
80
- const { compressPrompt } = await import("../prompt-compressor.js");
81
- const input = "In order to achieve this, it is important to note that the following steps are required.";
82
- const result = compressPrompt(input, { level: "moderate" });
83
- assert.ok(result.compressedChars < result.originalChars, "Should be shorter");
84
- });
85
-
86
- it("code blocks are preserved during compression", async () => {
87
- const { compressPrompt } = await import("../prompt-compressor.js");
88
- const input = "In order to do this:\n\n```typescript\nconst x = 1;\n```\n\nIn order to verify:";
89
- const result = compressPrompt(input, { level: "aggressive" });
90
- assert.ok(result.content.includes("const x = 1;"), "Code block should be preserved");
91
- });
92
- });
93
-
94
- // Test summary distillation
95
- describe("token-optimization: summary distillation", () => {
96
- it("distills summaries preserving key fields", async () => {
97
- const { distillSummaries } = await import("../summary-distiller.js");
98
- const summary = `---
99
- id: S01
100
- provides:
101
- - Core types
102
- key_files:
103
- - src/types.ts
104
- key_decisions:
105
- - D001
106
- ---
107
-
108
- # S01: Core Types
109
-
110
- Built the foundation type system.
111
-
112
- ## What Happened
113
-
114
- Long prose about implementation details that should be dropped...
115
- `;
116
- const result = distillSummaries([summary], 5000);
117
- assert.ok(result.savingsPercent > 0, "Should have savings");
118
- assert.ok(result.content.includes("Core types"), "Should preserve provides");
119
- assert.ok(result.content.includes("src/types.ts"), "Should preserve key_files");
120
- });
121
- });
122
-
123
- // Test semantic chunker
124
- describe("token-optimization: semantic chunking", () => {
125
- it("chunks TypeScript code at function boundaries", async () => {
126
- const { splitIntoChunks } = await import("../semantic-chunker.js");
127
- const code = `export function alpha() {
128
- return 1;
129
- }
130
-
131
- export function beta() {
132
- return 2;
133
- }
134
-
135
- export function gamma() {
136
- return 3;
137
- }`;
138
- const chunks = splitIntoChunks(code);
139
- assert.ok(chunks.length >= 2, `Expected >=2 chunks, got ${chunks.length}`);
140
- });
141
-
142
- it("scores chunks by relevance to query", async () => {
143
- const { chunkByRelevance } = await import("../semantic-chunker.js");
144
- const code = `export function createUser(name: string) {
145
- return { name, id: generateId() };
146
- }
147
-
148
- export function deleteDatabase() {
149
- dropAllTables();
150
- clearCache();
151
- }
152
-
153
- export function updateUser(id: string, name: string) {
154
- const user = findUser(id);
155
- user.name = name;
156
- return user;
157
- }`;
158
- const result = chunkByRelevance(code, "user creation and management", { maxChunks: 2 });
159
- // The user-related chunks should score higher
160
- const content = result.chunks.map(c => c.content).join("\n");
161
- assert.ok(content.includes("createUser") || content.includes("updateUser"),
162
- "Should include user-related chunks");
163
- });
164
- });