sequant 1.12.0 → 1.13.1
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/README.md +10 -8
- package/dist/bin/cli.js +19 -9
- package/dist/src/commands/doctor.js +42 -20
- package/dist/src/commands/init.js +152 -65
- package/dist/src/commands/logs.js +7 -6
- package/dist/src/commands/run.d.ts +13 -1
- package/dist/src/commands/run.js +122 -32
- package/dist/src/commands/stats.js +67 -48
- package/dist/src/commands/status.js +30 -12
- package/dist/src/commands/sync.d.ts +28 -0
- package/dist/src/commands/sync.js +102 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +4 -0
- package/dist/src/lib/cli-ui.d.ts +196 -0
- package/dist/src/lib/cli-ui.js +544 -0
- package/dist/src/lib/content-analyzer.d.ts +89 -0
- package/dist/src/lib/content-analyzer.js +437 -0
- package/dist/src/lib/phase-signal.d.ts +94 -0
- package/dist/src/lib/phase-signal.js +171 -0
- package/dist/src/lib/phase-spinner.d.ts +146 -0
- package/dist/src/lib/phase-spinner.js +255 -0
- package/dist/src/lib/solve-comment-parser.d.ts +84 -0
- package/dist/src/lib/solve-comment-parser.js +200 -0
- package/dist/src/lib/stack-config.d.ts +51 -0
- package/dist/src/lib/stack-config.js +77 -0
- package/dist/src/lib/stacks.d.ts +52 -0
- package/dist/src/lib/stacks.js +173 -0
- package/dist/src/lib/templates.d.ts +2 -0
- package/dist/src/lib/templates.js +9 -2
- package/dist/src/lib/upstream/assessment.d.ts +70 -0
- package/dist/src/lib/upstream/assessment.js +385 -0
- package/dist/src/lib/upstream/index.d.ts +11 -0
- package/dist/src/lib/upstream/index.js +14 -0
- package/dist/src/lib/upstream/issues.d.ts +38 -0
- package/dist/src/lib/upstream/issues.js +267 -0
- package/dist/src/lib/upstream/relevance.d.ts +50 -0
- package/dist/src/lib/upstream/relevance.js +209 -0
- package/dist/src/lib/upstream/report.d.ts +29 -0
- package/dist/src/lib/upstream/report.js +391 -0
- package/dist/src/lib/upstream/types.d.ts +207 -0
- package/dist/src/lib/upstream/types.js +5 -0
- package/dist/src/lib/workflow/log-writer.d.ts +1 -1
- package/dist/src/lib/workflow/metrics-schema.d.ts +3 -3
- package/dist/src/lib/workflow/qa-cache.d.ts +199 -0
- package/dist/src/lib/workflow/qa-cache.js +440 -0
- package/dist/src/lib/workflow/run-log-schema.d.ts +34 -6
- package/dist/src/lib/workflow/run-log-schema.js +12 -1
- package/dist/src/lib/workflow/state-schema.d.ts +4 -4
- package/dist/src/lib/workflow/types.d.ts +4 -0
- package/package.json +6 -1
- package/templates/skills/qa/scripts/quality-checks.sh +509 -53
- package/templates/skills/solve/SKILL.md +375 -83
- package/templates/skills/spec/SKILL.md +107 -5
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report generation for upstream assessments
|
|
3
|
+
* Creates markdown reports for GitHub issues and local files
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Calculate summary counts from findings
|
|
7
|
+
*/
|
|
8
|
+
export function calculateSummary(findings) {
|
|
9
|
+
const summary = {
|
|
10
|
+
breakingChanges: 0,
|
|
11
|
+
deprecations: 0,
|
|
12
|
+
newTools: 0,
|
|
13
|
+
hookChanges: 0,
|
|
14
|
+
opportunities: 0,
|
|
15
|
+
noAction: 0,
|
|
16
|
+
};
|
|
17
|
+
for (const finding of findings) {
|
|
18
|
+
switch (finding.category) {
|
|
19
|
+
case "breaking":
|
|
20
|
+
summary.breakingChanges++;
|
|
21
|
+
break;
|
|
22
|
+
case "deprecation":
|
|
23
|
+
summary.deprecations++;
|
|
24
|
+
break;
|
|
25
|
+
case "new-tool":
|
|
26
|
+
summary.newTools++;
|
|
27
|
+
break;
|
|
28
|
+
case "hook-change":
|
|
29
|
+
summary.hookChanges++;
|
|
30
|
+
break;
|
|
31
|
+
case "opportunity":
|
|
32
|
+
summary.opportunities++;
|
|
33
|
+
break;
|
|
34
|
+
case "no-action":
|
|
35
|
+
summary.noAction++;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return summary;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get action status text for summary table
|
|
43
|
+
*/
|
|
44
|
+
function getActionStatus(count, category) {
|
|
45
|
+
if (count === 0) {
|
|
46
|
+
return "None";
|
|
47
|
+
}
|
|
48
|
+
switch (category) {
|
|
49
|
+
case "breaking":
|
|
50
|
+
return "Review required";
|
|
51
|
+
case "deprecation":
|
|
52
|
+
return "Review needed";
|
|
53
|
+
case "new-tool":
|
|
54
|
+
case "hook-change":
|
|
55
|
+
case "opportunity":
|
|
56
|
+
return "Issues created";
|
|
57
|
+
default:
|
|
58
|
+
return "None";
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Format a finding for the assessment report
|
|
63
|
+
*/
|
|
64
|
+
function formatFinding(finding, index) {
|
|
65
|
+
const lines = [];
|
|
66
|
+
lines.push(`#### ${index + 1}. ${finding.title}`);
|
|
67
|
+
lines.push("");
|
|
68
|
+
if (finding.description !== finding.title) {
|
|
69
|
+
lines.push(`> ${finding.description}`);
|
|
70
|
+
lines.push("");
|
|
71
|
+
}
|
|
72
|
+
if (finding.matchedKeywords.length > 0) {
|
|
73
|
+
lines.push(`- **Matched keywords:** ${finding.matchedKeywords.join(", ")}`);
|
|
74
|
+
}
|
|
75
|
+
if (finding.matchedPatterns.length > 0) {
|
|
76
|
+
lines.push(`- **Matched patterns:** ${finding.matchedPatterns.join(", ")}`);
|
|
77
|
+
}
|
|
78
|
+
if (finding.sequantFiles.length > 0) {
|
|
79
|
+
lines.push(`- **Affected files:** ${finding.sequantFiles.join(", ")}`);
|
|
80
|
+
}
|
|
81
|
+
lines.push(`- **Impact:** ${finding.impact}`);
|
|
82
|
+
if (finding.issueNumber) {
|
|
83
|
+
lines.push(`- **Issue created:** #${finding.issueNumber}`);
|
|
84
|
+
}
|
|
85
|
+
if (finding.existingIssue) {
|
|
86
|
+
lines.push(`- **Existing issue:** #${finding.existingIssue}`);
|
|
87
|
+
}
|
|
88
|
+
lines.push("");
|
|
89
|
+
return lines.join("\n");
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Generate the assessment issue body
|
|
93
|
+
*/
|
|
94
|
+
export function generateAssessmentReport(assessment) {
|
|
95
|
+
const { version, releaseDate, assessmentDate, findings, summary, dryRun } = assessment;
|
|
96
|
+
const lines = [];
|
|
97
|
+
// Header
|
|
98
|
+
lines.push(`## Upstream: Claude Code ${version} Assessment`);
|
|
99
|
+
lines.push("");
|
|
100
|
+
lines.push(`**Release:** [${version}](https://github.com/anthropics/claude-code/releases/tag/${version})`);
|
|
101
|
+
lines.push(`**Released:** ${releaseDate}`);
|
|
102
|
+
lines.push(`**Assessed:** ${assessmentDate}`);
|
|
103
|
+
if (dryRun) {
|
|
104
|
+
lines.push(`**Mode:** Dry Run (no issues created)`);
|
|
105
|
+
}
|
|
106
|
+
lines.push("");
|
|
107
|
+
// Summary table
|
|
108
|
+
lines.push("### Summary");
|
|
109
|
+
lines.push("");
|
|
110
|
+
lines.push("| Category | Count | Action Required |");
|
|
111
|
+
lines.push("|----------|-------|-----------------|");
|
|
112
|
+
lines.push(`| Breaking Changes | ${summary.breakingChanges} | ${getActionStatus(summary.breakingChanges, "breaking")} |`);
|
|
113
|
+
lines.push(`| Deprecations | ${summary.deprecations} | ${getActionStatus(summary.deprecations, "deprecation")} |`);
|
|
114
|
+
lines.push(`| New Tools | ${summary.newTools} | ${getActionStatus(summary.newTools, "new-tool")} |`);
|
|
115
|
+
lines.push(`| Hook Changes | ${summary.hookChanges} | ${getActionStatus(summary.hookChanges, "hook-change")} |`);
|
|
116
|
+
lines.push(`| Opportunities | ${summary.opportunities} | ${getActionStatus(summary.opportunities, "opportunity")} |`);
|
|
117
|
+
lines.push(`| No Action | ${summary.noAction} | None |`);
|
|
118
|
+
lines.push("");
|
|
119
|
+
// Breaking Changes section
|
|
120
|
+
const breakingFindings = findings.filter((f) => f.category === "breaking");
|
|
121
|
+
lines.push("### Breaking Changes");
|
|
122
|
+
lines.push("");
|
|
123
|
+
if (breakingFindings.length === 0) {
|
|
124
|
+
lines.push("None detected.");
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
breakingFindings.forEach((f, i) => {
|
|
128
|
+
lines.push(formatFinding(f, i));
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
lines.push("");
|
|
132
|
+
// Deprecations section
|
|
133
|
+
const deprecations = findings.filter((f) => f.category === "deprecation");
|
|
134
|
+
lines.push("### Deprecations");
|
|
135
|
+
lines.push("");
|
|
136
|
+
if (deprecations.length === 0) {
|
|
137
|
+
lines.push("None detected.");
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
deprecations.forEach((f, i) => {
|
|
141
|
+
lines.push(formatFinding(f, i));
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
lines.push("");
|
|
145
|
+
// New Tools section
|
|
146
|
+
const newTools = findings.filter((f) => f.category === "new-tool");
|
|
147
|
+
lines.push("### New Tools");
|
|
148
|
+
lines.push("");
|
|
149
|
+
if (newTools.length === 0) {
|
|
150
|
+
lines.push("None detected.");
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
newTools.forEach((f, i) => {
|
|
154
|
+
lines.push(formatFinding(f, i));
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
lines.push("");
|
|
158
|
+
// Hook Changes section
|
|
159
|
+
const hookChanges = findings.filter((f) => f.category === "hook-change");
|
|
160
|
+
lines.push("### Hook Changes");
|
|
161
|
+
lines.push("");
|
|
162
|
+
if (hookChanges.length === 0) {
|
|
163
|
+
lines.push("None detected.");
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
hookChanges.forEach((f, i) => {
|
|
167
|
+
lines.push(formatFinding(f, i));
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
lines.push("");
|
|
171
|
+
// Opportunities section
|
|
172
|
+
const opportunities = findings.filter((f) => f.category === "opportunity");
|
|
173
|
+
lines.push("### Feature Opportunities");
|
|
174
|
+
lines.push("");
|
|
175
|
+
if (opportunities.length === 0) {
|
|
176
|
+
lines.push("None detected.");
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
opportunities.forEach((f, i) => {
|
|
180
|
+
lines.push(formatFinding(f, i));
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
lines.push("");
|
|
184
|
+
// No Action section
|
|
185
|
+
const noAction = findings.filter((f) => f.category === "no-action");
|
|
186
|
+
lines.push("### No Action Required");
|
|
187
|
+
lines.push("");
|
|
188
|
+
if (noAction.length === 0) {
|
|
189
|
+
lines.push("All changes were relevant.");
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
lines.push(`${noAction.length} changes did not require action:`);
|
|
193
|
+
lines.push("");
|
|
194
|
+
noAction.forEach((f) => {
|
|
195
|
+
lines.push(`- ${f.description}`);
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
lines.push("");
|
|
199
|
+
// Footer
|
|
200
|
+
lines.push("---");
|
|
201
|
+
lines.push("");
|
|
202
|
+
lines.push("*Generated by /upstream skill*");
|
|
203
|
+
return lines.join("\n");
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Generate an individual issue body for an actionable finding
|
|
207
|
+
*/
|
|
208
|
+
export function generateFindingIssue(finding, version, assessmentIssueNumber) {
|
|
209
|
+
const lines = [];
|
|
210
|
+
// Determine issue type prefix
|
|
211
|
+
let prefix;
|
|
212
|
+
switch (finding.category) {
|
|
213
|
+
case "breaking":
|
|
214
|
+
prefix = "fix";
|
|
215
|
+
break;
|
|
216
|
+
case "deprecation":
|
|
217
|
+
prefix = "chore";
|
|
218
|
+
break;
|
|
219
|
+
default:
|
|
220
|
+
prefix = "feat";
|
|
221
|
+
}
|
|
222
|
+
// Generate title
|
|
223
|
+
const title = `${prefix}: ${finding.title} (from Claude Code ${version})`;
|
|
224
|
+
// Body
|
|
225
|
+
lines.push(`**Upstream:** Claude Code ${version}`);
|
|
226
|
+
lines.push(`**Category:** ${formatCategory(finding.category)}`);
|
|
227
|
+
if (assessmentIssueNumber) {
|
|
228
|
+
lines.push(`**Assessment:** #${assessmentIssueNumber}`);
|
|
229
|
+
}
|
|
230
|
+
lines.push("");
|
|
231
|
+
lines.push("### Context");
|
|
232
|
+
lines.push("");
|
|
233
|
+
lines.push(finding.description);
|
|
234
|
+
lines.push("");
|
|
235
|
+
if (finding.sequantFiles.length > 0) {
|
|
236
|
+
lines.push("### Affected Files");
|
|
237
|
+
lines.push("");
|
|
238
|
+
finding.sequantFiles.forEach((f) => {
|
|
239
|
+
lines.push(`- \`${f}\``);
|
|
240
|
+
});
|
|
241
|
+
lines.push("");
|
|
242
|
+
}
|
|
243
|
+
lines.push("### Opportunity");
|
|
244
|
+
lines.push("");
|
|
245
|
+
lines.push("[To be analyzed during /spec phase]");
|
|
246
|
+
lines.push("");
|
|
247
|
+
lines.push("### Proposed Implementation");
|
|
248
|
+
lines.push("");
|
|
249
|
+
lines.push("[To be determined during /spec phase]");
|
|
250
|
+
lines.push("");
|
|
251
|
+
lines.push("### Acceptance Criteria");
|
|
252
|
+
lines.push("");
|
|
253
|
+
lines.push("- [ ] AC-1: [To be defined]");
|
|
254
|
+
lines.push("");
|
|
255
|
+
lines.push("---");
|
|
256
|
+
lines.push("");
|
|
257
|
+
if (assessmentIssueNumber) {
|
|
258
|
+
lines.push(`*Auto-created by /upstream assessment #${assessmentIssueNumber}*`);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
lines.push("*Auto-created by /upstream skill*");
|
|
262
|
+
}
|
|
263
|
+
// Labels
|
|
264
|
+
const labels = ["upstream", "needs-triage"];
|
|
265
|
+
switch (finding.category) {
|
|
266
|
+
case "breaking":
|
|
267
|
+
labels.push("bug", "priority:high");
|
|
268
|
+
break;
|
|
269
|
+
case "deprecation":
|
|
270
|
+
labels.push("bug");
|
|
271
|
+
break;
|
|
272
|
+
default:
|
|
273
|
+
labels.push("enhancement");
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
title,
|
|
277
|
+
body: lines.join("\n"),
|
|
278
|
+
labels,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Generate a batched summary issue for multiple versions
|
|
283
|
+
*/
|
|
284
|
+
export function generateBatchedSummaryReport(batched) {
|
|
285
|
+
const lines = [];
|
|
286
|
+
lines.push(`## Upstream: Claude Code Assessment (${batched.sinceVersion} → ${batched.toVersion})`);
|
|
287
|
+
lines.push("");
|
|
288
|
+
lines.push(`**Versions assessed:** ${batched.versions.length}`);
|
|
289
|
+
lines.push(`**From:** ${batched.sinceVersion}`);
|
|
290
|
+
lines.push(`**To:** ${batched.toVersion}`);
|
|
291
|
+
lines.push("");
|
|
292
|
+
// Summary across all versions
|
|
293
|
+
const totals = {
|
|
294
|
+
breakingChanges: 0,
|
|
295
|
+
deprecations: 0,
|
|
296
|
+
newTools: 0,
|
|
297
|
+
hookChanges: 0,
|
|
298
|
+
opportunities: 0,
|
|
299
|
+
noAction: 0,
|
|
300
|
+
};
|
|
301
|
+
for (const assessment of batched.assessments) {
|
|
302
|
+
totals.breakingChanges += assessment.summary.breakingChanges;
|
|
303
|
+
totals.deprecations += assessment.summary.deprecations;
|
|
304
|
+
totals.newTools += assessment.summary.newTools;
|
|
305
|
+
totals.hookChanges += assessment.summary.hookChanges;
|
|
306
|
+
totals.opportunities += assessment.summary.opportunities;
|
|
307
|
+
totals.noAction += assessment.summary.noAction;
|
|
308
|
+
}
|
|
309
|
+
lines.push("### Combined Summary");
|
|
310
|
+
lines.push("");
|
|
311
|
+
lines.push("| Category | Total |");
|
|
312
|
+
lines.push("|----------|-------|");
|
|
313
|
+
lines.push(`| Breaking Changes | ${totals.breakingChanges} |`);
|
|
314
|
+
lines.push(`| Deprecations | ${totals.deprecations} |`);
|
|
315
|
+
lines.push(`| New Tools | ${totals.newTools} |`);
|
|
316
|
+
lines.push(`| Hook Changes | ${totals.hookChanges} |`);
|
|
317
|
+
lines.push(`| Opportunities | ${totals.opportunities} |`);
|
|
318
|
+
lines.push("");
|
|
319
|
+
// Per-version breakdown
|
|
320
|
+
lines.push("### Per-Version Breakdown");
|
|
321
|
+
lines.push("");
|
|
322
|
+
for (const assessment of batched.assessments) {
|
|
323
|
+
const actionable = assessment.summary.breakingChanges +
|
|
324
|
+
assessment.summary.deprecations +
|
|
325
|
+
assessment.summary.newTools +
|
|
326
|
+
assessment.summary.hookChanges +
|
|
327
|
+
assessment.summary.opportunities;
|
|
328
|
+
lines.push(`#### ${assessment.version}`);
|
|
329
|
+
lines.push("");
|
|
330
|
+
lines.push(`- Released: ${assessment.releaseDate}`);
|
|
331
|
+
lines.push(`- Actionable findings: ${actionable}`);
|
|
332
|
+
if (assessment.issuesCreated.length > 0) {
|
|
333
|
+
lines.push(`- Issues created: ${assessment.issuesCreated.map((n) => `#${n}`).join(", ")}`);
|
|
334
|
+
}
|
|
335
|
+
lines.push("");
|
|
336
|
+
}
|
|
337
|
+
lines.push("---");
|
|
338
|
+
lines.push("");
|
|
339
|
+
lines.push("*Generated by /upstream skill*");
|
|
340
|
+
return lines.join("\n");
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Generate local report markdown file
|
|
344
|
+
*/
|
|
345
|
+
export function generateLocalReport(assessment) {
|
|
346
|
+
const lines = [];
|
|
347
|
+
lines.push(`# Claude Code ${assessment.version} Assessment`);
|
|
348
|
+
lines.push("");
|
|
349
|
+
lines.push(`**Assessed:** ${assessment.assessmentDate}`);
|
|
350
|
+
if (assessment.previousVersion) {
|
|
351
|
+
lines.push(`**Previous:** ${assessment.previousVersion}`);
|
|
352
|
+
}
|
|
353
|
+
lines.push("");
|
|
354
|
+
// Include full assessment report
|
|
355
|
+
lines.push(generateAssessmentReport(assessment));
|
|
356
|
+
lines.push("");
|
|
357
|
+
// Add raw data section for debugging
|
|
358
|
+
lines.push("## Raw Data");
|
|
359
|
+
lines.push("");
|
|
360
|
+
lines.push("```json");
|
|
361
|
+
lines.push(JSON.stringify({
|
|
362
|
+
version: assessment.version,
|
|
363
|
+
releaseDate: assessment.releaseDate,
|
|
364
|
+
assessmentDate: assessment.assessmentDate,
|
|
365
|
+
previousVersion: assessment.previousVersion,
|
|
366
|
+
summary: assessment.summary,
|
|
367
|
+
issuesCreated: assessment.issuesCreated,
|
|
368
|
+
findingCount: assessment.findings.length,
|
|
369
|
+
}, null, 2));
|
|
370
|
+
lines.push("```");
|
|
371
|
+
return lines.join("\n");
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Format category for display
|
|
375
|
+
*/
|
|
376
|
+
function formatCategory(category) {
|
|
377
|
+
switch (category) {
|
|
378
|
+
case "breaking":
|
|
379
|
+
return "Breaking Change";
|
|
380
|
+
case "deprecation":
|
|
381
|
+
return "Deprecation";
|
|
382
|
+
case "new-tool":
|
|
383
|
+
return "New Tool";
|
|
384
|
+
case "hook-change":
|
|
385
|
+
return "Hook Change";
|
|
386
|
+
case "opportunity":
|
|
387
|
+
return "Feature Opportunity";
|
|
388
|
+
case "no-action":
|
|
389
|
+
return "No Action";
|
|
390
|
+
}
|
|
391
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the upstream assessment module
|
|
3
|
+
* Tracks Claude Code releases and compatibility with sequant
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Categories for classifying changes from upstream releases
|
|
7
|
+
*/
|
|
8
|
+
export type FindingCategory = "breaking" | "deprecation" | "new-tool" | "hook-change" | "opportunity" | "no-action";
|
|
9
|
+
/**
|
|
10
|
+
* Impact level for a finding
|
|
11
|
+
*/
|
|
12
|
+
export type ImpactLevel = "high" | "medium" | "low" | "none";
|
|
13
|
+
/**
|
|
14
|
+
* A single finding from release analysis
|
|
15
|
+
*/
|
|
16
|
+
export interface Finding {
|
|
17
|
+
/** Category of the change */
|
|
18
|
+
category: FindingCategory;
|
|
19
|
+
/** Brief title describing the change */
|
|
20
|
+
title: string;
|
|
21
|
+
/** Full description from release notes */
|
|
22
|
+
description: string;
|
|
23
|
+
/** Impact level on sequant */
|
|
24
|
+
impact: ImpactLevel;
|
|
25
|
+
/** Keywords that triggered detection */
|
|
26
|
+
matchedKeywords: string[];
|
|
27
|
+
/** Regex patterns that matched */
|
|
28
|
+
matchedPatterns: string[];
|
|
29
|
+
/** Affected sequant files from dependency map */
|
|
30
|
+
sequantFiles: string[];
|
|
31
|
+
/** GitHub issue number if created */
|
|
32
|
+
issueNumber?: number;
|
|
33
|
+
/** Existing issue number if duplicate found */
|
|
34
|
+
existingIssue?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Summary counts for an assessment
|
|
38
|
+
*/
|
|
39
|
+
export interface AssessmentSummary {
|
|
40
|
+
breakingChanges: number;
|
|
41
|
+
deprecations: number;
|
|
42
|
+
newTools: number;
|
|
43
|
+
hookChanges: number;
|
|
44
|
+
opportunities: number;
|
|
45
|
+
noAction: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Complete assessment result for a release
|
|
49
|
+
*/
|
|
50
|
+
export interface UpstreamAssessment {
|
|
51
|
+
/** Version tag (e.g., "v2.1.29") */
|
|
52
|
+
version: string;
|
|
53
|
+
/** Release date from GitHub */
|
|
54
|
+
releaseDate: string;
|
|
55
|
+
/** Date when assessment was performed */
|
|
56
|
+
assessmentDate: string;
|
|
57
|
+
/** Previous version (for --since support) */
|
|
58
|
+
previousVersion: string | null;
|
|
59
|
+
/** All findings from the assessment */
|
|
60
|
+
findings: Finding[];
|
|
61
|
+
/** Issue numbers created during assessment */
|
|
62
|
+
issuesCreated: number[];
|
|
63
|
+
/** Summary counts by category */
|
|
64
|
+
summary: AssessmentSummary;
|
|
65
|
+
/** Whether this was a dry run */
|
|
66
|
+
dryRun: boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Release data from GitHub API
|
|
70
|
+
*/
|
|
71
|
+
export interface ReleaseData {
|
|
72
|
+
/** Version tag name (e.g., "v2.1.29") */
|
|
73
|
+
tagName: string;
|
|
74
|
+
/** Release title */
|
|
75
|
+
name: string;
|
|
76
|
+
/** Release body/changelog content */
|
|
77
|
+
body: string;
|
|
78
|
+
/** Publication date */
|
|
79
|
+
publishedAt: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Tools configuration in baseline
|
|
83
|
+
*/
|
|
84
|
+
export interface ToolsConfig {
|
|
85
|
+
/** Core tools sequant relies on */
|
|
86
|
+
core: string[];
|
|
87
|
+
/** Optional tools that enhance functionality */
|
|
88
|
+
optional: string[];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Hooks configuration in baseline
|
|
92
|
+
*/
|
|
93
|
+
export interface HooksConfig {
|
|
94
|
+
/** Hook types sequant uses */
|
|
95
|
+
used: string[];
|
|
96
|
+
/** Files that implement hooks */
|
|
97
|
+
files: string[];
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* MCP servers configuration in baseline
|
|
101
|
+
*/
|
|
102
|
+
export interface McpServersConfig {
|
|
103
|
+
/** Required MCP servers */
|
|
104
|
+
required: string[];
|
|
105
|
+
/** Optional MCP servers */
|
|
106
|
+
optional: string[];
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Permissions configuration in baseline
|
|
110
|
+
*/
|
|
111
|
+
export interface PermissionsConfig {
|
|
112
|
+
/** Permission patterns used */
|
|
113
|
+
patterns: string[];
|
|
114
|
+
/** Files containing permission configs */
|
|
115
|
+
files: string[];
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Baseline configuration for sequant capabilities
|
|
119
|
+
*/
|
|
120
|
+
export interface Baseline {
|
|
121
|
+
/** Last assessed version (null if never assessed) */
|
|
122
|
+
lastAssessedVersion: string | null;
|
|
123
|
+
/** Schema version for migration support */
|
|
124
|
+
schemaVersion: string;
|
|
125
|
+
/** Tools configuration */
|
|
126
|
+
tools: ToolsConfig;
|
|
127
|
+
/** Hooks configuration */
|
|
128
|
+
hooks: HooksConfig;
|
|
129
|
+
/** MCP servers configuration */
|
|
130
|
+
mcpServers: McpServersConfig;
|
|
131
|
+
/** Permissions configuration */
|
|
132
|
+
permissions: PermissionsConfig;
|
|
133
|
+
/** Keywords to match in release notes */
|
|
134
|
+
keywords: string[];
|
|
135
|
+
/** Map of keywords to affected sequant files */
|
|
136
|
+
dependencyMap: Record<string, string[]>;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Regex patterns for detecting change types
|
|
140
|
+
*/
|
|
141
|
+
export interface DetectionPatterns {
|
|
142
|
+
newTool: RegExp;
|
|
143
|
+
deprecation: RegExp;
|
|
144
|
+
breaking: RegExp;
|
|
145
|
+
hook: RegExp;
|
|
146
|
+
permission: RegExp;
|
|
147
|
+
mcp: RegExp;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Options for running an upstream assessment
|
|
151
|
+
*/
|
|
152
|
+
export interface AssessmentOptions {
|
|
153
|
+
/** Specific version to assess (default: latest) */
|
|
154
|
+
version?: string;
|
|
155
|
+
/** Assess all versions since this version */
|
|
156
|
+
since?: string;
|
|
157
|
+
/** Skip issue creation */
|
|
158
|
+
dryRun?: boolean;
|
|
159
|
+
/** Force re-assessment even if already done */
|
|
160
|
+
force?: boolean;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Result of checking for duplicate issues
|
|
164
|
+
*/
|
|
165
|
+
export interface DuplicateCheckResult {
|
|
166
|
+
/** Whether a duplicate was found */
|
|
167
|
+
isDuplicate: boolean;
|
|
168
|
+
/** Existing issue number if duplicate */
|
|
169
|
+
existingIssue?: number;
|
|
170
|
+
/** Existing issue title if duplicate */
|
|
171
|
+
existingTitle?: string;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* GitHub issue creation parameters
|
|
175
|
+
*/
|
|
176
|
+
export interface IssueParams {
|
|
177
|
+
/** Issue title */
|
|
178
|
+
title: string;
|
|
179
|
+
/** Issue body in markdown */
|
|
180
|
+
body: string;
|
|
181
|
+
/** Labels to apply */
|
|
182
|
+
labels: string[];
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Result of creating an issue
|
|
186
|
+
*/
|
|
187
|
+
export interface IssueResult {
|
|
188
|
+
/** Created issue number */
|
|
189
|
+
number: number;
|
|
190
|
+
/** Issue URL */
|
|
191
|
+
url: string;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Batched assessment for multiple versions
|
|
195
|
+
*/
|
|
196
|
+
export interface BatchedAssessment {
|
|
197
|
+
/** All versions assessed */
|
|
198
|
+
versions: string[];
|
|
199
|
+
/** Individual assessments */
|
|
200
|
+
assessments: UpstreamAssessment[];
|
|
201
|
+
/** Summary issue number */
|
|
202
|
+
summaryIssueNumber?: number;
|
|
203
|
+
/** Start version (from --since) */
|
|
204
|
+
sinceVersion: string;
|
|
205
|
+
/** End version (latest assessed) */
|
|
206
|
+
toVersion: string;
|
|
207
|
+
}
|
|
@@ -85,4 +85,4 @@ export declare class LogWriter {
|
|
|
85
85
|
*
|
|
86
86
|
* Utility function for creating phase logs when you have start/end times.
|
|
87
87
|
*/
|
|
88
|
-
export declare function createPhaseLogFromTiming(phase: Phase, issueNumber: number, startTime: Date, endTime: Date, status: PhaseLog["status"], options?: Partial<Pick<PhaseLog, "error" | "iterations" | "filesModified" | "testsRun" | "testsPassed">>): PhaseLog;
|
|
88
|
+
export declare function createPhaseLogFromTiming(phase: Phase, issueNumber: number, startTime: Date, endTime: Date, status: PhaseLog["status"], options?: Partial<Pick<PhaseLog, "error" | "iterations" | "filesModified" | "testsRun" | "testsPassed" | "verdict">>): PhaseLog;
|
|
@@ -20,8 +20,8 @@ import { z } from "zod";
|
|
|
20
20
|
* Outcome of a workflow run
|
|
21
21
|
*/
|
|
22
22
|
export declare const RunOutcomeSchema: z.ZodEnum<{
|
|
23
|
-
failed: "failed";
|
|
24
23
|
success: "success";
|
|
24
|
+
failed: "failed";
|
|
25
25
|
partial: "partial";
|
|
26
26
|
}>;
|
|
27
27
|
export type RunOutcome = z.infer<typeof RunOutcomeSchema>;
|
|
@@ -73,8 +73,8 @@ export declare const MetricRunSchema: z.ZodObject<{
|
|
|
73
73
|
test: "test";
|
|
74
74
|
}>>;
|
|
75
75
|
outcome: z.ZodEnum<{
|
|
76
|
-
failed: "failed";
|
|
77
76
|
success: "success";
|
|
77
|
+
failed: "failed";
|
|
78
78
|
partial: "partial";
|
|
79
79
|
}>;
|
|
80
80
|
duration: z.ZodNumber;
|
|
@@ -110,8 +110,8 @@ export declare const MetricsSchema: z.ZodObject<{
|
|
|
110
110
|
test: "test";
|
|
111
111
|
}>>;
|
|
112
112
|
outcome: z.ZodEnum<{
|
|
113
|
-
failed: "failed";
|
|
114
113
|
success: "success";
|
|
114
|
+
failed: "failed";
|
|
115
115
|
partial: "partial";
|
|
116
116
|
}>;
|
|
117
117
|
duration: z.ZodNumber;
|