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,212 +0,0 @@
1
- /**
2
- * Summary distiller — extracts essential structured data from SUMMARY.md files,
3
- * dropping verbose prose to save context budget.
4
- */
5
- // ─── Frontmatter parsing ─────────────────────────────────────────────────────
6
- function parseFrontmatter(raw) {
7
- const result = {
8
- id: "",
9
- provides: [],
10
- requires: [],
11
- key_files: [],
12
- key_decisions: [],
13
- patterns_established: [],
14
- };
15
- // Extract frontmatter block between --- markers
16
- const fmMatch = raw.match(/^---\r?\n([\s\S]*?)\r?\n---/);
17
- if (!fmMatch)
18
- return result;
19
- const fmBlock = fmMatch[1];
20
- const lines = fmBlock.split(/\r?\n/);
21
- let currentKey = null;
22
- for (const line of lines) {
23
- // Scalar value: key: value
24
- const scalarMatch = line.match(/^(\w[\w_]*):\s*(.+)$/);
25
- if (scalarMatch) {
26
- const [, key, value] = scalarMatch;
27
- currentKey = key;
28
- setScalar(result, key, value.trim());
29
- continue;
30
- }
31
- // Array-start key with empty value: key:\n or key: []\n
32
- const arrayStartMatch = line.match(/^(\w[\w_]*):\s*(\[\])?\s*$/);
33
- if (arrayStartMatch) {
34
- currentKey = arrayStartMatch[1];
35
- continue;
36
- }
37
- // Array item: - value
38
- const itemMatch = line.match(/^\s+-\s+(.+)$/);
39
- if (itemMatch && currentKey) {
40
- pushItem(result, currentKey, itemMatch[1].trim());
41
- continue;
42
- }
43
- }
44
- return result;
45
- }
46
- function setScalar(fm, key, value) {
47
- if (key === "id")
48
- fm.id = value;
49
- }
50
- function pushItem(fm, key, value) {
51
- switch (key) {
52
- case "provides":
53
- fm.provides.push(value);
54
- break;
55
- case "requires":
56
- fm.requires.push(value);
57
- break;
58
- case "key_files":
59
- fm.key_files.push(value);
60
- break;
61
- case "key_decisions":
62
- fm.key_decisions.push(value);
63
- break;
64
- case "patterns_established":
65
- fm.patterns_established.push(value);
66
- break;
67
- }
68
- }
69
- // ─── Body parsing ────────────────────────────────────────────────────────────
70
- function extractTitleAndOneLiner(body) {
71
- const lines = body.split(/\r?\n/);
72
- let titleId = "";
73
- let oneLiner = "";
74
- let foundTitle = false;
75
- for (const line of lines) {
76
- const titleMatch = line.match(/^#\s+(\S+):\s*(.*)$/);
77
- if (titleMatch && !foundTitle) {
78
- titleId = titleMatch[1];
79
- // If the title line itself has text after "S01: ", use that as a fallback
80
- if (titleMatch[2].trim()) {
81
- oneLiner = titleMatch[2].trim();
82
- }
83
- foundTitle = true;
84
- continue;
85
- }
86
- // First non-empty line after the title is the one-liner
87
- if (foundTitle && !oneLiner && line.trim() && !line.startsWith("#")) {
88
- oneLiner = line.trim();
89
- break;
90
- }
91
- }
92
- return { id: titleId, oneLiner };
93
- }
94
- function getBodyAfterFrontmatter(raw) {
95
- const fmMatch = raw.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);
96
- if (fmMatch) {
97
- return raw.slice(fmMatch[0].length);
98
- }
99
- return raw;
100
- }
101
- // ─── Public API ──────────────────────────────────────────────────────────────
102
- /**
103
- * Distill a single SUMMARY.md content string into a compact structured block.
104
- */
105
- export function distillSingle(summary) {
106
- const fm = parseFrontmatter(summary);
107
- const body = getBodyAfterFrontmatter(summary);
108
- const { id: titleId, oneLiner } = extractTitleAndOneLiner(body);
109
- const id = fm.id || titleId || "???";
110
- return formatEntry({
111
- id,
112
- oneLiner,
113
- provides: fm.provides,
114
- requires: fm.requires,
115
- key_files: fm.key_files,
116
- key_decisions: fm.key_decisions,
117
- patterns: fm.patterns_established,
118
- });
119
- }
120
- function formatEntry(entry) {
121
- return formatEntryWithDropLevel(entry, 0);
122
- }
123
- /**
124
- * Format an entry, progressively dropping fields based on dropLevel:
125
- * 0 = full output
126
- * 1 = drop patterns
127
- * 2 = drop patterns + key_decisions
128
- * 3 = drop patterns + key_decisions + key_files
129
- */
130
- function formatEntryWithDropLevel(entry, dropLevel) {
131
- const lines = [];
132
- lines.push(`## ${entry.id}: ${entry.oneLiner}`);
133
- if (entry.provides.length > 0) {
134
- lines.push(`provides: ${entry.provides.join(", ")}`);
135
- }
136
- if (entry.requires.length > 0) {
137
- lines.push(`requires: ${entry.requires.join(", ")}`);
138
- }
139
- if (dropLevel < 3 && entry.key_files.length > 0) {
140
- lines.push(`key_files: ${entry.key_files.join(", ")}`);
141
- }
142
- if (dropLevel < 2 && entry.key_decisions.length > 0) {
143
- lines.push(`key_decisions: ${entry.key_decisions.join(", ")}`);
144
- }
145
- if (dropLevel < 1 && entry.patterns.length > 0) {
146
- lines.push(`patterns: ${entry.patterns.join(", ")}`);
147
- }
148
- return lines.join("\n");
149
- }
150
- /**
151
- * Distill multiple SUMMARY.md contents into a budget-constrained output.
152
- */
153
- export function distillSummaries(summaries, budgetChars) {
154
- const originalChars = summaries.reduce((sum, s) => sum + s.length, 0);
155
- if (summaries.length === 0) {
156
- return {
157
- content: "",
158
- summaryCount: 0,
159
- savingsPercent: 0,
160
- originalChars: 0,
161
- distilledChars: 0,
162
- };
163
- }
164
- // Parse all entries up front
165
- const entries = summaries.map((summary) => {
166
- const fm = parseFrontmatter(summary);
167
- const body = getBodyAfterFrontmatter(summary);
168
- const { id: titleId, oneLiner } = extractTitleAndOneLiner(body);
169
- return {
170
- id: fm.id || titleId || "???",
171
- oneLiner,
172
- provides: fm.provides,
173
- requires: fm.requires,
174
- key_files: fm.key_files,
175
- key_decisions: fm.key_decisions,
176
- patterns: fm.patterns_established,
177
- };
178
- });
179
- // Try progressively more aggressive dropping until it fits
180
- for (let dropLevel = 0; dropLevel <= 3; dropLevel++) {
181
- const blocks = entries.map((e) => formatEntryWithDropLevel(e, dropLevel));
182
- const content = blocks.join("\n\n");
183
- if (content.length <= budgetChars) {
184
- const distilledChars = content.length;
185
- return {
186
- content,
187
- summaryCount: summaries.length,
188
- savingsPercent: originalChars > 0
189
- ? Math.round((1 - distilledChars / originalChars) * 100)
190
- : 0,
191
- originalChars,
192
- distilledChars,
193
- };
194
- }
195
- }
196
- // Even at max drop level it doesn't fit — truncate
197
- const blocks = entries.map((e) => formatEntryWithDropLevel(e, 3));
198
- let content = blocks.join("\n\n");
199
- if (content.length > budgetChars) {
200
- content = content.slice(0, Math.max(0, budgetChars - 15)) + "\n[...truncated]";
201
- }
202
- const distilledChars = content.length;
203
- return {
204
- content,
205
- summaryCount: summaries.length,
206
- savingsPercent: originalChars > 0
207
- ? Math.round((1 - distilledChars / originalChars) * 100)
208
- : 0,
209
- originalChars,
210
- distilledChars,
211
- };
212
- }