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
@@ -33,9 +33,9 @@ export type Phase = z.infer<typeof PhaseSchema>;
33
33
  * Phase execution status
34
34
  */
35
35
  export declare const PhaseStatusSchema: z.ZodEnum<{
36
- skipped: "skipped";
37
36
  success: "success";
38
37
  failure: "failure";
38
+ skipped: "skipped";
39
39
  timeout: "timeout";
40
40
  }>;
41
41
  export type PhaseStatus = z.infer<typeof PhaseStatusSchema>;
@@ -48,6 +48,16 @@ export declare const IssueStatusSchema: z.ZodEnum<{
48
48
  partial: "partial";
49
49
  }>;
50
50
  export type IssueStatus = z.infer<typeof IssueStatusSchema>;
51
+ /**
52
+ * Valid QA verdicts schema
53
+ */
54
+ export declare const QaVerdictSchema: z.ZodEnum<{
55
+ READY_FOR_MERGE: "READY_FOR_MERGE";
56
+ AC_MET_BUT_NOT_A_PLUS: "AC_MET_BUT_NOT_A_PLUS";
57
+ AC_NOT_MET: "AC_NOT_MET";
58
+ NEEDS_VERIFICATION: "NEEDS_VERIFICATION";
59
+ }>;
60
+ export type QaVerdict = z.infer<typeof QaVerdictSchema>;
51
61
  /**
52
62
  * Log entry for a single phase execution
53
63
  */
@@ -66,9 +76,9 @@ export declare const PhaseLogSchema: z.ZodObject<{
66
76
  endTime: z.ZodString;
67
77
  durationSeconds: z.ZodNumber;
68
78
  status: z.ZodEnum<{
69
- skipped: "skipped";
70
79
  success: "success";
71
80
  failure: "failure";
81
+ skipped: "skipped";
72
82
  timeout: "timeout";
73
83
  }>;
74
84
  error: z.ZodOptional<z.ZodString>;
@@ -76,6 +86,12 @@ export declare const PhaseLogSchema: z.ZodObject<{
76
86
  filesModified: z.ZodOptional<z.ZodArray<z.ZodString>>;
77
87
  testsRun: z.ZodOptional<z.ZodNumber>;
78
88
  testsPassed: z.ZodOptional<z.ZodNumber>;
89
+ verdict: z.ZodOptional<z.ZodEnum<{
90
+ READY_FOR_MERGE: "READY_FOR_MERGE";
91
+ AC_MET_BUT_NOT_A_PLUS: "AC_MET_BUT_NOT_A_PLUS";
92
+ AC_NOT_MET: "AC_NOT_MET";
93
+ NEEDS_VERIFICATION: "NEEDS_VERIFICATION";
94
+ }>>;
79
95
  }, z.core.$strip>;
80
96
  export type PhaseLog = z.infer<typeof PhaseLogSchema>;
81
97
  /**
@@ -105,9 +121,9 @@ export declare const IssueLogSchema: z.ZodObject<{
105
121
  endTime: z.ZodString;
106
122
  durationSeconds: z.ZodNumber;
107
123
  status: z.ZodEnum<{
108
- skipped: "skipped";
109
124
  success: "success";
110
125
  failure: "failure";
126
+ skipped: "skipped";
111
127
  timeout: "timeout";
112
128
  }>;
113
129
  error: z.ZodOptional<z.ZodString>;
@@ -115,6 +131,12 @@ export declare const IssueLogSchema: z.ZodObject<{
115
131
  filesModified: z.ZodOptional<z.ZodArray<z.ZodString>>;
116
132
  testsRun: z.ZodOptional<z.ZodNumber>;
117
133
  testsPassed: z.ZodOptional<z.ZodNumber>;
134
+ verdict: z.ZodOptional<z.ZodEnum<{
135
+ READY_FOR_MERGE: "READY_FOR_MERGE";
136
+ AC_MET_BUT_NOT_A_PLUS: "AC_MET_BUT_NOT_A_PLUS";
137
+ AC_NOT_MET: "AC_NOT_MET";
138
+ NEEDS_VERIFICATION: "NEEDS_VERIFICATION";
139
+ }>>;
118
140
  }, z.core.$strip>>;
119
141
  totalDurationSeconds: z.ZodNumber;
120
142
  }, z.core.$strip>;
@@ -195,9 +217,9 @@ export declare const RunLogSchema: z.ZodObject<{
195
217
  endTime: z.ZodString;
196
218
  durationSeconds: z.ZodNumber;
197
219
  status: z.ZodEnum<{
198
- skipped: "skipped";
199
220
  success: "success";
200
221
  failure: "failure";
222
+ skipped: "skipped";
201
223
  timeout: "timeout";
202
224
  }>;
203
225
  error: z.ZodOptional<z.ZodString>;
@@ -205,6 +227,12 @@ export declare const RunLogSchema: z.ZodObject<{
205
227
  filesModified: z.ZodOptional<z.ZodArray<z.ZodString>>;
206
228
  testsRun: z.ZodOptional<z.ZodNumber>;
207
229
  testsPassed: z.ZodOptional<z.ZodNumber>;
230
+ verdict: z.ZodOptional<z.ZodEnum<{
231
+ READY_FOR_MERGE: "READY_FOR_MERGE";
232
+ AC_MET_BUT_NOT_A_PLUS: "AC_MET_BUT_NOT_A_PLUS";
233
+ AC_NOT_MET: "AC_NOT_MET";
234
+ NEEDS_VERIFICATION: "NEEDS_VERIFICATION";
235
+ }>>;
208
236
  }, z.core.$strip>>;
209
237
  totalDurationSeconds: z.ZodNumber;
210
238
  }, z.core.$strip>>;
@@ -253,10 +281,10 @@ export declare function createPhaseLog(phase: Phase, issueNumber: number): Omit<
253
281
  *
254
282
  * @param phaseLog - Partial phase log
255
283
  * @param status - Final status
256
- * @param options - Additional fields (error, filesModified, etc.)
284
+ * @param options - Additional fields (error, filesModified, verdict, etc.)
257
285
  * @returns Complete PhaseLog
258
286
  */
259
- export declare function completePhaseLog(phaseLog: Omit<PhaseLog, "endTime" | "durationSeconds" | "status">, status: PhaseStatus, options?: Partial<Pick<PhaseLog, "error" | "iterations" | "filesModified" | "testsRun" | "testsPassed">>): PhaseLog;
287
+ export declare function completePhaseLog(phaseLog: Omit<PhaseLog, "endTime" | "durationSeconds" | "status">, status: PhaseStatus, options?: Partial<Pick<PhaseLog, "error" | "iterations" | "filesModified" | "testsRun" | "testsPassed" | "verdict">>): PhaseLog;
260
288
  /**
261
289
  * Finalize a run log with summary statistics
262
290
  *
@@ -42,6 +42,15 @@ export const PhaseStatusSchema = z.enum([
42
42
  * Issue execution status
43
43
  */
44
44
  export const IssueStatusSchema = z.enum(["success", "failure", "partial"]);
45
+ /**
46
+ * Valid QA verdicts schema
47
+ */
48
+ export const QaVerdictSchema = z.enum([
49
+ "READY_FOR_MERGE",
50
+ "AC_MET_BUT_NOT_A_PLUS",
51
+ "AC_NOT_MET",
52
+ "NEEDS_VERIFICATION",
53
+ ]);
45
54
  /**
46
55
  * Log entry for a single phase execution
47
56
  */
@@ -68,6 +77,8 @@ export const PhaseLogSchema = z.object({
68
77
  testsRun: z.number().int().nonnegative().optional(),
69
78
  /** Number of tests passed */
70
79
  testsPassed: z.number().int().nonnegative().optional(),
80
+ /** Parsed QA verdict (only for qa phase) */
81
+ verdict: QaVerdictSchema.optional(),
71
82
  });
72
83
  /**
73
84
  * Complete execution record for a single issue
@@ -195,7 +206,7 @@ export function createPhaseLog(phase, issueNumber) {
195
206
  *
196
207
  * @param phaseLog - Partial phase log
197
208
  * @param status - Final status
198
- * @param options - Additional fields (error, filesModified, etc.)
209
+ * @param options - Additional fields (error, filesModified, verdict, etc.)
199
210
  * @returns Complete PhaseLog
200
211
  */
201
212
  export function completePhaseLog(phaseLog, status, options) {
@@ -25,9 +25,9 @@ export declare const WORKFLOW_PHASES: readonly ["spec", "security-review", "exec
25
25
  * Phase status - tracks individual phase progress
26
26
  */
27
27
  export declare const PhaseStatusSchema: z.ZodEnum<{
28
+ pending: "pending";
28
29
  skipped: "skipped";
29
30
  completed: "completed";
30
- pending: "pending";
31
31
  in_progress: "in_progress";
32
32
  failed: "failed";
33
33
  }>;
@@ -65,9 +65,9 @@ export type Phase = z.infer<typeof PhaseSchema>;
65
65
  */
66
66
  export declare const PhaseStateSchema: z.ZodObject<{
67
67
  status: z.ZodEnum<{
68
+ pending: "pending";
68
69
  skipped: "skipped";
69
70
  completed: "completed";
70
- pending: "pending";
71
71
  in_progress: "in_progress";
72
72
  failed: "failed";
73
73
  }>;
@@ -198,9 +198,9 @@ export declare const IssueStateSchema: z.ZodObject<{
198
198
  }>>;
199
199
  phases: z.ZodRecord<z.ZodString, z.ZodObject<{
200
200
  status: z.ZodEnum<{
201
+ pending: "pending";
201
202
  skipped: "skipped";
202
203
  completed: "completed";
203
- pending: "pending";
204
204
  in_progress: "in_progress";
205
205
  failed: "failed";
206
206
  }>;
@@ -286,9 +286,9 @@ export declare const WorkflowStateSchema: z.ZodObject<{
286
286
  }>>;
287
287
  phases: z.ZodRecord<z.ZodString, z.ZodObject<{
288
288
  status: z.ZodEnum<{
289
+ pending: "pending";
289
290
  skipped: "skipped";
290
291
  completed: "completed";
291
- pending: "pending";
292
292
  in_progress: "in_progress";
293
293
  failed: "failed";
294
294
  }>;
@@ -40,6 +40,8 @@ export interface ExecutionConfig {
40
40
  * Default execution configuration
41
41
  */
42
42
  export declare const DEFAULT_CONFIG: ExecutionConfig;
43
+ import type { QaVerdict } from "./run-log-schema.js";
44
+ export type { QaVerdict } from "./run-log-schema.js";
43
45
  /**
44
46
  * Result of executing a single phase
45
47
  */
@@ -50,6 +52,8 @@ export interface PhaseResult {
50
52
  error?: string;
51
53
  /** Captured output from the phase (used for parsing spec recommendations) */
52
54
  output?: string;
55
+ /** Parsed QA verdict (only for qa phase) */
56
+ verdict?: QaVerdict;
53
57
  }
54
58
  /**
55
59
  * Result of executing all phases for an issue
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sequant",
3
- "version": "1.12.0",
3
+ "version": "1.13.1",
4
4
  "description": "Quantize your development workflow - Sequential AI phases with quality gates",
5
5
  "type": "module",
6
6
  "bin": {
@@ -56,19 +56,24 @@
56
56
  "dependencies": {
57
57
  "@anthropic-ai/claude-agent-sdk": "^0.2.11",
58
58
  "@hono/node-server": "^1.19.9",
59
+ "boxen": "^8.0.1",
59
60
  "chalk": "^5.3.0",
60
61
  "chokidar": "^5.0.0",
62
+ "cli-table3": "^0.6.5",
61
63
  "commander": "^12.1.0",
62
64
  "diff": "^7.0.0",
65
+ "gradient-string": "^3.0.0",
63
66
  "hono": "^4.11.4",
64
67
  "inquirer": "^12.3.2",
65
68
  "open": "^11.0.0",
69
+ "ora": "^8.2.0",
66
70
  "yaml": "^2.7.0",
67
71
  "zod": "^4.3.5"
68
72
  },
69
73
  "devDependencies": {
70
74
  "@eslint/js": "^9.39.2",
71
75
  "@types/diff": "^7.0.0",
76
+ "@types/gradient-string": "^1.1.6",
72
77
  "@types/inquirer": "^9.0.7",
73
78
  "@types/node": "^22.10.5",
74
79
  "@typescript-eslint/eslint-plugin": "^8.52.0",