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.
Files changed (53) hide show
  1. package/README.md +10 -8
  2. package/dist/bin/cli.js +19 -9
  3. package/dist/src/commands/doctor.js +42 -20
  4. package/dist/src/commands/init.js +152 -65
  5. package/dist/src/commands/logs.js +7 -6
  6. package/dist/src/commands/run.d.ts +13 -1
  7. package/dist/src/commands/run.js +122 -32
  8. package/dist/src/commands/stats.js +67 -48
  9. package/dist/src/commands/status.js +30 -12
  10. package/dist/src/commands/sync.d.ts +28 -0
  11. package/dist/src/commands/sync.js +102 -0
  12. package/dist/src/index.d.ts +6 -0
  13. package/dist/src/index.js +4 -0
  14. package/dist/src/lib/cli-ui.d.ts +196 -0
  15. package/dist/src/lib/cli-ui.js +544 -0
  16. package/dist/src/lib/content-analyzer.d.ts +89 -0
  17. package/dist/src/lib/content-analyzer.js +437 -0
  18. package/dist/src/lib/phase-signal.d.ts +94 -0
  19. package/dist/src/lib/phase-signal.js +171 -0
  20. package/dist/src/lib/phase-spinner.d.ts +146 -0
  21. package/dist/src/lib/phase-spinner.js +255 -0
  22. package/dist/src/lib/solve-comment-parser.d.ts +84 -0
  23. package/dist/src/lib/solve-comment-parser.js +200 -0
  24. package/dist/src/lib/stack-config.d.ts +51 -0
  25. package/dist/src/lib/stack-config.js +77 -0
  26. package/dist/src/lib/stacks.d.ts +52 -0
  27. package/dist/src/lib/stacks.js +173 -0
  28. package/dist/src/lib/templates.d.ts +2 -0
  29. package/dist/src/lib/templates.js +9 -2
  30. package/dist/src/lib/upstream/assessment.d.ts +70 -0
  31. package/dist/src/lib/upstream/assessment.js +385 -0
  32. package/dist/src/lib/upstream/index.d.ts +11 -0
  33. package/dist/src/lib/upstream/index.js +14 -0
  34. package/dist/src/lib/upstream/issues.d.ts +38 -0
  35. package/dist/src/lib/upstream/issues.js +267 -0
  36. package/dist/src/lib/upstream/relevance.d.ts +50 -0
  37. package/dist/src/lib/upstream/relevance.js +209 -0
  38. package/dist/src/lib/upstream/report.d.ts +29 -0
  39. package/dist/src/lib/upstream/report.js +391 -0
  40. package/dist/src/lib/upstream/types.d.ts +207 -0
  41. package/dist/src/lib/upstream/types.js +5 -0
  42. package/dist/src/lib/workflow/log-writer.d.ts +1 -1
  43. package/dist/src/lib/workflow/metrics-schema.d.ts +3 -3
  44. package/dist/src/lib/workflow/qa-cache.d.ts +199 -0
  45. package/dist/src/lib/workflow/qa-cache.js +440 -0
  46. package/dist/src/lib/workflow/run-log-schema.d.ts +34 -6
  47. package/dist/src/lib/workflow/run-log-schema.js +12 -1
  48. package/dist/src/lib/workflow/state-schema.d.ts +4 -4
  49. package/dist/src/lib/workflow/types.d.ts +4 -0
  50. package/package.json +6 -1
  51. package/templates/skills/qa/scripts/quality-checks.sh +509 -53
  52. package/templates/skills/solve/SKILL.md +375 -83
  53. 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
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Types for the upstream assessment module
3
+ * Tracks Claude Code releases and compatibility with sequant
4
+ */
5
+ export {};
@@ -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;