sequant 1.1.2 → 1.2.0

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 (72) hide show
  1. package/README.md +112 -10
  2. package/dist/bin/cli.js +3 -1
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/src/commands/doctor.d.ts.map +1 -1
  5. package/dist/src/commands/doctor.js +33 -2
  6. package/dist/src/commands/doctor.js.map +1 -1
  7. package/dist/src/commands/doctor.test.js +63 -1
  8. package/dist/src/commands/doctor.test.js.map +1 -1
  9. package/dist/src/commands/init.d.ts +1 -0
  10. package/dist/src/commands/init.d.ts.map +1 -1
  11. package/dist/src/commands/init.js +75 -9
  12. package/dist/src/commands/init.js.map +1 -1
  13. package/dist/src/commands/init.test.js +137 -2
  14. package/dist/src/commands/init.test.js.map +1 -1
  15. package/dist/src/commands/logs.js +1 -1
  16. package/dist/src/commands/logs.js.map +1 -1
  17. package/dist/src/commands/run.d.ts +18 -0
  18. package/dist/src/commands/run.d.ts.map +1 -1
  19. package/dist/src/commands/run.js +613 -54
  20. package/dist/src/commands/run.js.map +1 -1
  21. package/dist/src/commands/run.test.d.ts +2 -0
  22. package/dist/src/commands/run.test.d.ts.map +1 -0
  23. package/dist/src/commands/run.test.js +155 -0
  24. package/dist/src/commands/run.test.js.map +1 -0
  25. package/dist/src/commands/update.d.ts.map +1 -1
  26. package/dist/src/commands/update.js +58 -6
  27. package/dist/src/commands/update.js.map +1 -1
  28. package/dist/src/index.d.ts +3 -1
  29. package/dist/src/index.d.ts.map +1 -1
  30. package/dist/src/index.js +2 -1
  31. package/dist/src/index.js.map +1 -1
  32. package/dist/src/lib/config.d.ts +19 -0
  33. package/dist/src/lib/config.d.ts.map +1 -0
  34. package/dist/src/lib/config.js +31 -0
  35. package/dist/src/lib/config.js.map +1 -0
  36. package/dist/src/lib/manifest.d.ts +3 -1
  37. package/dist/src/lib/manifest.d.ts.map +1 -1
  38. package/dist/src/lib/manifest.js +2 -1
  39. package/dist/src/lib/manifest.js.map +1 -1
  40. package/dist/src/lib/settings.d.ts +69 -0
  41. package/dist/src/lib/settings.d.ts.map +1 -0
  42. package/dist/src/lib/settings.js +79 -0
  43. package/dist/src/lib/settings.js.map +1 -0
  44. package/dist/src/lib/stacks.d.ts +28 -0
  45. package/dist/src/lib/stacks.d.ts.map +1 -1
  46. package/dist/src/lib/stacks.js +160 -17
  47. package/dist/src/lib/stacks.js.map +1 -1
  48. package/dist/src/lib/stacks.test.js +343 -1
  49. package/dist/src/lib/stacks.test.js.map +1 -1
  50. package/dist/src/lib/system.d.ts +8 -0
  51. package/dist/src/lib/system.d.ts.map +1 -1
  52. package/dist/src/lib/system.js +23 -0
  53. package/dist/src/lib/system.js.map +1 -1
  54. package/dist/src/lib/templates.d.ts +5 -1
  55. package/dist/src/lib/templates.d.ts.map +1 -1
  56. package/dist/src/lib/templates.js +3 -2
  57. package/dist/src/lib/templates.js.map +1 -1
  58. package/dist/src/lib/tty.d.ts +31 -0
  59. package/dist/src/lib/tty.d.ts.map +1 -0
  60. package/dist/src/lib/tty.js +81 -0
  61. package/dist/src/lib/tty.js.map +1 -0
  62. package/dist/src/lib/tty.test.d.ts +2 -0
  63. package/dist/src/lib/tty.test.d.ts.map +1 -0
  64. package/dist/src/lib/tty.test.js +227 -0
  65. package/dist/src/lib/tty.test.js.map +1 -0
  66. package/dist/src/lib/workflow/types.d.ts +2 -0
  67. package/dist/src/lib/workflow/types.d.ts.map +1 -1
  68. package/package.json +1 -1
  69. package/templates/hooks/post-tool.sh +4 -2
  70. package/templates/scripts/new-feature.sh +33 -9
  71. package/templates/skills/solve/SKILL.md +27 -11
  72. package/templates/skills/spec/SKILL.md +30 -2
@@ -0,0 +1,81 @@
1
+ /**
2
+ * TTY and CI detection utilities for non-interactive mode handling
3
+ */
4
+ /**
5
+ * Check if stdin is a TTY (terminal)
6
+ */
7
+ export function isStdinTTY() {
8
+ return Boolean(process.stdin.isTTY);
9
+ }
10
+ /**
11
+ * Check if stdout is a TTY (terminal)
12
+ */
13
+ export function isStdoutTTY() {
14
+ return Boolean(process.stdout.isTTY);
15
+ }
16
+ /**
17
+ * Common CI environment variables that indicate non-interactive mode
18
+ */
19
+ const CI_ENV_VARS = [
20
+ "CI",
21
+ "CONTINUOUS_INTEGRATION",
22
+ "GITHUB_ACTIONS",
23
+ "GITLAB_CI",
24
+ "CIRCLECI",
25
+ "TRAVIS",
26
+ "JENKINS_URL",
27
+ "BUILDKITE",
28
+ "DRONE",
29
+ "TEAMCITY_VERSION",
30
+ "TF_BUILD", // Azure DevOps
31
+ "CODEBUILD_BUILD_ID", // AWS CodeBuild
32
+ ];
33
+ /**
34
+ * Check if running in a CI environment
35
+ */
36
+ export function isCI() {
37
+ return CI_ENV_VARS.some((envVar) => Boolean(process.env[envVar]));
38
+ }
39
+ /**
40
+ * Determine if interactive mode should be used
41
+ *
42
+ * Interactive mode is used when:
43
+ * 1. --interactive flag is passed (forceInteractive = true)
44
+ * 2. OR (stdin is TTY AND stdout is TTY AND not in CI)
45
+ *
46
+ * @param forceInteractive - Whether --interactive flag was passed
47
+ * @returns true if interactive prompts should be shown
48
+ */
49
+ export function shouldUseInteractiveMode(forceInteractive) {
50
+ if (forceInteractive) {
51
+ return true;
52
+ }
53
+ // Non-interactive if any of these conditions are met
54
+ if (!isStdinTTY() || !isStdoutTTY() || isCI()) {
55
+ return false;
56
+ }
57
+ return true;
58
+ }
59
+ /**
60
+ * Get a human-readable reason for non-interactive mode
61
+ */
62
+ export function getNonInteractiveReason() {
63
+ if (!isStdinTTY()) {
64
+ return "stdin is not a terminal (piped input detected)";
65
+ }
66
+ if (!isStdoutTTY()) {
67
+ return "stdout is not a terminal";
68
+ }
69
+ if (isCI()) {
70
+ // Find which CI environment
71
+ for (const envVar of CI_ENV_VARS) {
72
+ if (process.env[envVar]) {
73
+ const ciName = envVar.replace(/_/g, " ").toLowerCase();
74
+ return `running in CI environment (${ciName})`;
75
+ }
76
+ }
77
+ return "running in CI environment";
78
+ }
79
+ return null;
80
+ }
81
+ //# sourceMappingURL=tty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tty.js","sourceRoot":"","sources":["../../../src/lib/tty.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,IAAI;IACJ,wBAAwB;IACxB,gBAAgB;IAChB,WAAW;IACX,UAAU;IACV,QAAQ;IACR,aAAa;IACb,WAAW;IACX,OAAO;IACP,kBAAkB;IAClB,UAAU,EAAE,eAAe;IAC3B,oBAAoB,EAAE,gBAAgB;CACvC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,IAAI;IAClB,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,gBAA0B;IACjE,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qDAAqD;IACrD,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAClB,OAAO,gDAAgD,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACnB,OAAO,0BAA0B,CAAC;IACpC,CAAC;IACD,IAAI,IAAI,EAAE,EAAE,CAAC;QACX,4BAA4B;QAC5B,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;gBACvD,OAAO,8BAA8B,MAAM,GAAG,CAAC;YACjD,CAAC;QACH,CAAC;QACD,OAAO,2BAA2B,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tty.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tty.test.d.ts","sourceRoot":"","sources":["../../../src/lib/tty.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,227 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { isStdinTTY, isStdoutTTY, isCI, shouldUseInteractiveMode, getNonInteractiveReason, } from "./tty.js";
3
+ describe("tty utilities", () => {
4
+ const originalStdinIsTTY = process.stdin.isTTY;
5
+ const originalStdoutIsTTY = process.stdout.isTTY;
6
+ const originalEnv = { ...process.env };
7
+ beforeEach(() => {
8
+ // Reset environment
9
+ process.env = { ...originalEnv };
10
+ // Clear CI-related env vars
11
+ const ciVars = [
12
+ "CI",
13
+ "CONTINUOUS_INTEGRATION",
14
+ "GITHUB_ACTIONS",
15
+ "GITLAB_CI",
16
+ "CIRCLECI",
17
+ "TRAVIS",
18
+ "JENKINS_URL",
19
+ "BUILDKITE",
20
+ "DRONE",
21
+ "TEAMCITY_VERSION",
22
+ "TF_BUILD",
23
+ "CODEBUILD_BUILD_ID",
24
+ ];
25
+ for (const v of ciVars) {
26
+ delete process.env[v];
27
+ }
28
+ });
29
+ afterEach(() => {
30
+ // Restore original values
31
+ Object.defineProperty(process.stdin, "isTTY", {
32
+ value: originalStdinIsTTY,
33
+ writable: true,
34
+ });
35
+ Object.defineProperty(process.stdout, "isTTY", {
36
+ value: originalStdoutIsTTY,
37
+ writable: true,
38
+ });
39
+ process.env = originalEnv;
40
+ });
41
+ describe("isStdinTTY", () => {
42
+ it("returns true when stdin.isTTY is true", () => {
43
+ Object.defineProperty(process.stdin, "isTTY", {
44
+ value: true,
45
+ writable: true,
46
+ });
47
+ expect(isStdinTTY()).toBe(true);
48
+ });
49
+ it("returns false when stdin.isTTY is false", () => {
50
+ Object.defineProperty(process.stdin, "isTTY", {
51
+ value: false,
52
+ writable: true,
53
+ });
54
+ expect(isStdinTTY()).toBe(false);
55
+ });
56
+ it("returns false when stdin.isTTY is undefined", () => {
57
+ Object.defineProperty(process.stdin, "isTTY", {
58
+ value: undefined,
59
+ writable: true,
60
+ });
61
+ expect(isStdinTTY()).toBe(false);
62
+ });
63
+ });
64
+ describe("isStdoutTTY", () => {
65
+ it("returns true when stdout.isTTY is true", () => {
66
+ Object.defineProperty(process.stdout, "isTTY", {
67
+ value: true,
68
+ writable: true,
69
+ });
70
+ expect(isStdoutTTY()).toBe(true);
71
+ });
72
+ it("returns false when stdout.isTTY is false", () => {
73
+ Object.defineProperty(process.stdout, "isTTY", {
74
+ value: false,
75
+ writable: true,
76
+ });
77
+ expect(isStdoutTTY()).toBe(false);
78
+ });
79
+ });
80
+ describe("isCI", () => {
81
+ it("returns false when no CI env vars are set", () => {
82
+ expect(isCI()).toBe(false);
83
+ });
84
+ it("returns true when CI=true", () => {
85
+ process.env.CI = "true";
86
+ expect(isCI()).toBe(true);
87
+ });
88
+ it("returns true when GITHUB_ACTIONS is set", () => {
89
+ process.env.GITHUB_ACTIONS = "true";
90
+ expect(isCI()).toBe(true);
91
+ });
92
+ it("returns true when GITLAB_CI is set", () => {
93
+ process.env.GITLAB_CI = "true";
94
+ expect(isCI()).toBe(true);
95
+ });
96
+ it("returns true when CIRCLECI is set", () => {
97
+ process.env.CIRCLECI = "true";
98
+ expect(isCI()).toBe(true);
99
+ });
100
+ it("returns true when JENKINS_URL is set", () => {
101
+ process.env.JENKINS_URL = "http://jenkins.local";
102
+ expect(isCI()).toBe(true);
103
+ });
104
+ });
105
+ describe("shouldUseInteractiveMode", () => {
106
+ it("returns true when forceInteractive is true", () => {
107
+ // Even in non-TTY environment, forceInteractive should win
108
+ Object.defineProperty(process.stdin, "isTTY", {
109
+ value: false,
110
+ writable: true,
111
+ });
112
+ expect(shouldUseInteractiveMode(true)).toBe(true);
113
+ });
114
+ it("returns true when stdin and stdout are TTY and not in CI", () => {
115
+ Object.defineProperty(process.stdin, "isTTY", {
116
+ value: true,
117
+ writable: true,
118
+ });
119
+ Object.defineProperty(process.stdout, "isTTY", {
120
+ value: true,
121
+ writable: true,
122
+ });
123
+ expect(shouldUseInteractiveMode()).toBe(true);
124
+ });
125
+ it("returns false when stdin is not TTY", () => {
126
+ Object.defineProperty(process.stdin, "isTTY", {
127
+ value: false,
128
+ writable: true,
129
+ });
130
+ Object.defineProperty(process.stdout, "isTTY", {
131
+ value: true,
132
+ writable: true,
133
+ });
134
+ expect(shouldUseInteractiveMode()).toBe(false);
135
+ });
136
+ it("returns false when stdout is not TTY", () => {
137
+ Object.defineProperty(process.stdin, "isTTY", {
138
+ value: true,
139
+ writable: true,
140
+ });
141
+ Object.defineProperty(process.stdout, "isTTY", {
142
+ value: false,
143
+ writable: true,
144
+ });
145
+ expect(shouldUseInteractiveMode()).toBe(false);
146
+ });
147
+ it("returns false when in CI environment", () => {
148
+ Object.defineProperty(process.stdin, "isTTY", {
149
+ value: true,
150
+ writable: true,
151
+ });
152
+ Object.defineProperty(process.stdout, "isTTY", {
153
+ value: true,
154
+ writable: true,
155
+ });
156
+ process.env.CI = "true";
157
+ expect(shouldUseInteractiveMode()).toBe(false);
158
+ });
159
+ it("returns false when forceInteractive is explicitly false and in non-TTY", () => {
160
+ Object.defineProperty(process.stdin, "isTTY", {
161
+ value: false,
162
+ writable: true,
163
+ });
164
+ expect(shouldUseInteractiveMode(false)).toBe(false);
165
+ });
166
+ });
167
+ describe("getNonInteractiveReason", () => {
168
+ it("returns null when in interactive mode", () => {
169
+ Object.defineProperty(process.stdin, "isTTY", {
170
+ value: true,
171
+ writable: true,
172
+ });
173
+ Object.defineProperty(process.stdout, "isTTY", {
174
+ value: true,
175
+ writable: true,
176
+ });
177
+ expect(getNonInteractiveReason()).toBeNull();
178
+ });
179
+ it("returns stdin reason when stdin is not TTY", () => {
180
+ Object.defineProperty(process.stdin, "isTTY", {
181
+ value: false,
182
+ writable: true,
183
+ });
184
+ Object.defineProperty(process.stdout, "isTTY", {
185
+ value: true,
186
+ writable: true,
187
+ });
188
+ expect(getNonInteractiveReason()).toBe("stdin is not a terminal (piped input detected)");
189
+ });
190
+ it("returns stdout reason when stdout is not TTY", () => {
191
+ Object.defineProperty(process.stdin, "isTTY", {
192
+ value: true,
193
+ writable: true,
194
+ });
195
+ Object.defineProperty(process.stdout, "isTTY", {
196
+ value: false,
197
+ writable: true,
198
+ });
199
+ expect(getNonInteractiveReason()).toBe("stdout is not a terminal");
200
+ });
201
+ it("returns CI reason with env var name when in GitHub Actions", () => {
202
+ Object.defineProperty(process.stdin, "isTTY", {
203
+ value: true,
204
+ writable: true,
205
+ });
206
+ Object.defineProperty(process.stdout, "isTTY", {
207
+ value: true,
208
+ writable: true,
209
+ });
210
+ process.env.GITHUB_ACTIONS = "true";
211
+ expect(getNonInteractiveReason()).toBe("running in CI environment (github actions)");
212
+ });
213
+ it("returns CI reason with env var name when in GitLab CI", () => {
214
+ Object.defineProperty(process.stdin, "isTTY", {
215
+ value: true,
216
+ writable: true,
217
+ });
218
+ Object.defineProperty(process.stdout, "isTTY", {
219
+ value: true,
220
+ writable: true,
221
+ });
222
+ process.env.GITLAB_CI = "true";
223
+ expect(getNonInteractiveReason()).toBe("running in CI environment (gitlab ci)");
224
+ });
225
+ });
226
+ });
227
+ //# sourceMappingURL=tty.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tty.test.js","sourceRoot":"","sources":["../../../src/lib/tty.test.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,8 @@ export interface PhaseResult {
46
46
  success: boolean;
47
47
  durationSeconds?: number;
48
48
  error?: string;
49
+ /** Captured output from the phase (used for parsing spec recommendations) */
50
+ output?: string;
49
51
  }
50
52
  /**
51
53
  * Result of executing all phases for an issue
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/workflow/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,EAA2B,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,eAW5B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/workflow/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,EAA2B,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,eAW5B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sequant",
3
- "version": "1.1.2",
3
+ "version": "1.2.0",
4
4
  "description": "Quantize your development workflow - Sequential AI phases with quality gates",
5
5
  "type": "module",
6
6
  "bin": {
@@ -190,14 +190,16 @@ if [[ "$TOOL_NAME" == "Bash" ]]; then
190
190
  fi
191
191
 
192
192
  # === DETECT TEST FAILURES ===
193
- if [[ "$TOOL_NAME" == "Bash" ]] && echo "$TOOL_INPUT" | grep -qE 'npm (test|run test)'; then
193
+ # Supports: npm, bun, yarn, pnpm
194
+ if [[ "$TOOL_NAME" == "Bash" ]] && echo "$TOOL_INPUT" | grep -qE '(npm (test|run test)|bun (test|run test)|yarn (test|run test)|pnpm (test|run test))'; then
194
195
  if echo "$TOOL_OUTPUT" | grep -qE '(FAIL|failed|Error:)'; then
195
196
  echo "$(date +%H:%M:%S) TEST_FAILURE detected" >> "$QUALITY_LOG"
196
197
  fi
197
198
  fi
198
199
 
199
200
  # === DETECT BUILD FAILURES ===
200
- if [[ "$TOOL_NAME" == "Bash" ]] && echo "$TOOL_INPUT" | grep -qE 'npm run build'; then
201
+ # Supports: npm, bun, yarn, pnpm
202
+ if [[ "$TOOL_NAME" == "Bash" ]] && echo "$TOOL_INPUT" | grep -qE '(npm run build|bun run build|yarn build|yarn run build|pnpm run build)'; then
201
203
  if echo "$TOOL_OUTPUT" | grep -qE '(error TS|Build failed|Error:)'; then
202
204
  echo "$(date +%H:%M:%S) BUILD_FAILURE detected" >> "$QUALITY_LOG"
203
205
  fi
@@ -1,8 +1,9 @@
1
1
  #!/bin/bash
2
2
 
3
3
  # Create a new feature worktree from a GitHub issue
4
- # Usage: ./scripts/new-feature.sh <issue-number>
4
+ # Usage: ./scripts/new-feature.sh <issue-number> [--stash]
5
5
  # Example: ./scripts/new-feature.sh 4
6
+ # Example: ./scripts/new-feature.sh 4 --stash # Auto-stash uncommitted changes
6
7
 
7
8
  set -e
8
9
 
@@ -13,16 +14,33 @@ BLUE='\033[0;34m'
13
14
  YELLOW='\033[1;33m'
14
15
  NC='\033[0m' # No Color
15
16
 
17
+ # Parse arguments (flexible position for --stash flag)
18
+ STASH_FLAG=false
19
+ ISSUE_NUMBER=""
20
+
21
+ for arg in "$@"; do
22
+ case $arg in
23
+ --stash)
24
+ STASH_FLAG=true
25
+ ;;
26
+ *)
27
+ # First non-flag argument is the issue number
28
+ if [ -z "$ISSUE_NUMBER" ]; then
29
+ ISSUE_NUMBER=$arg
30
+ fi
31
+ ;;
32
+ esac
33
+ done
34
+
16
35
  # Check if issue number is provided
17
- if [ -z "$1" ]; then
36
+ if [ -z "$ISSUE_NUMBER" ]; then
18
37
  echo -e "${RED}❌ Error: Issue number required${NC}"
19
- echo "Usage: ./scripts/new-feature.sh <issue-number>"
38
+ echo "Usage: ./scripts/new-feature.sh <issue-number> [--stash]"
20
39
  echo "Example: ./scripts/new-feature.sh 4"
40
+ echo "Example: ./scripts/new-feature.sh 4 --stash"
21
41
  exit 1
22
42
  fi
23
43
 
24
- ISSUE_NUMBER=$1
25
-
26
44
  # Check if gh CLI is installed
27
45
  if ! command -v gh &> /dev/null; then
28
46
  echo -e "${RED}❌ GitHub CLI not found. Install from: https://cli.github.com${NC}"
@@ -82,10 +100,16 @@ echo ""
82
100
 
83
101
  # Check for uncommitted changes before switching branches
84
102
  if ! git diff-index --quiet HEAD -- 2>/dev/null; then
85
- echo -e "${RED}❌ Working tree has uncommitted changes${NC}"
86
- echo -e "${YELLOW} Commit or stash your changes first:${NC}"
87
- echo -e " git stash push -m 'WIP before issue #${ISSUE_NUMBER}'"
88
- exit 1
103
+ if [ "$STASH_FLAG" = true ]; then
104
+ echo -e "${YELLOW}📦 Stashing uncommitted changes...${NC}"
105
+ git stash push --include-untracked -m "WIP before issue #${ISSUE_NUMBER}"
106
+ echo -e "${GREEN} Changes stashed successfully${NC}"
107
+ else
108
+ echo -e "${RED}❌ Working tree has uncommitted changes${NC}"
109
+ echo -e "${YELLOW} Use --stash to auto-stash, or manually:${NC}"
110
+ echo -e " git stash push -m 'WIP before issue #${ISSUE_NUMBER}'"
111
+ exit 1
112
+ fi
89
113
  fi
90
114
 
91
115
  # Check if branch already exists
@@ -58,7 +58,7 @@ Provide a clear, actionable response with:
58
58
 
59
59
  2. **Recommended Commands** in order
60
60
 
61
- 3. **CLI Command** - ALWAYS include `sequant run <issue>` for terminal/CI usage
61
+ 3. **CLI Command** - ALWAYS include `npx sequant run <issue>` for terminal/CI usage
62
62
 
63
63
  4. **Explanation** of why this workflow was chosen
64
64
 
@@ -102,10 +102,12 @@ For comprehensive quality with automatic fix iterations:
102
102
 
103
103
  Run from terminal (useful for automation/CI):
104
104
  ```bash
105
- sequant run 152 # Single issue
106
- sequant run 152 153 # Multiple issues
105
+ npx sequant run 152 # Single issue
106
+ npx sequant run 152 153 # Multiple issues
107
107
  ```
108
108
 
109
+ > **Tip:** For frequent use, install globally with `npm install -g sequant` to run `sequant` directly without `npx`.
110
+
109
111
  ### Notes
110
112
  - Issue #152 requires UI testing due to `ui` label
111
113
  - Issue #153 is a bug fix - simpler workflow recommended
@@ -114,6 +116,16 @@ sequant run 152 153 # Multiple issues
114
116
 
115
117
  ## Workflow Selection Logic
116
118
 
119
+ **Note:** `npx sequant run` now uses **spec-driven phase detection**. It runs `/spec` first, which analyzes the issue and outputs a `## Recommended Workflow` section. The CLI then parses this to determine subsequent phases.
120
+
121
+ ### How It Works
122
+
123
+ 1. **Bug fixes** (labels: `bug`, `fix`) → Skip spec, run `exec → qa` directly
124
+ 2. **All other issues** → Run `/spec` first, which recommends phases based on:
125
+ - UI/frontend changes → Add `test` phase
126
+ - Complex refactors → Enable quality loop
127
+ - Security-sensitive → Add `security-review` phase
128
+
117
129
  ### Standard Workflow (Most Issues)
118
130
  ```
119
131
  /spec → /exec → /qa
@@ -148,25 +160,27 @@ Runs complete workflow with automatic fix iterations.
148
160
 
149
161
  ## CLI Alternative
150
162
 
151
- Use `sequant run` for batch execution from the command line:
163
+ Use `npx sequant run` for batch execution from the command line:
152
164
 
153
165
  ```bash
154
166
  # Run workflow for single issue
155
- sequant run 152
167
+ npx sequant run 152
156
168
 
157
169
  # Multiple issues in parallel
158
- sequant run 152 153 154
170
+ npx sequant run 152 153 154
159
171
 
160
172
  # Sequential execution (respects dependencies)
161
- sequant run 152 153 --sequential
173
+ npx sequant run 152 153 --sequential
162
174
 
163
175
  # Custom phases
164
- sequant run 152 --phases spec,exec,qa
176
+ npx sequant run 152 --phases spec,exec,qa
165
177
 
166
178
  # Dry run (shows what would execute)
167
- sequant run 152 --dry-run
179
+ npx sequant run 152 --dry-run
168
180
  ```
169
181
 
182
+ > **Tip:** Install globally with `npm install -g sequant` to omit the `npx` prefix.
183
+
170
184
  ## Edge Cases
171
185
 
172
186
  ### Multiple Issues with Different Types
@@ -203,7 +217,7 @@ If issues depend on each other:
203
217
 
204
218
  - [ ] **Issue Summary Table** - Table with Issue, Title, Labels, Workflow columns
205
219
  - [ ] **Recommended Workflow** - Slash commands in order for each issue
206
- - [ ] **CLI Command** - `sequant run <issue-numbers>` command (REQUIRED)
220
+ - [ ] **CLI Command** - `npx sequant run <issue-numbers>` command (REQUIRED)
207
221
  - [ ] **Explanation** - Brief notes explaining workflow choices
208
222
 
209
223
  **DO NOT respond until all items are verified.**
@@ -232,9 +246,11 @@ You MUST use this exact structure:
232
246
 
233
247
  Run from terminal (useful for automation/CI):
234
248
  \`\`\`bash
235
- sequant run <ISSUE_NUMBERS>
249
+ npx sequant run <ISSUE_NUMBERS>
236
250
  \`\`\`
237
251
 
252
+ > **Tip:** Install globally with `npm install -g sequant` to omit the `npx` prefix.
253
+
238
254
  ### Notes
239
255
  <!-- FILL: explanation of workflow choices -->
240
256
  ```
@@ -143,7 +143,26 @@ Ask the user to confirm or adjust:
143
143
 
144
144
  **Do NOT start implementation** - this is planning-only.
145
145
 
146
- ### 4. Issue Comment Draft
146
+ ### 4. Recommended Workflow
147
+
148
+ Analyze the issue and recommend the optimal workflow phases:
149
+
150
+ ```markdown
151
+ ## Recommended Workflow
152
+
153
+ **Phases:** spec → exec → qa
154
+ **Quality Loop:** disabled
155
+ **Reasoning:** [Brief explanation of why these phases were chosen]
156
+ ```
157
+
158
+ **Phase Selection Logic:**
159
+ - **UI/Frontend changes** → Add `test` phase (browser testing)
160
+ - **Bug fixes** → Skip `spec` if already well-defined
161
+ - **Complex refactors** → Enable quality loop
162
+ - **Security-sensitive** → Add `security-review` phase
163
+ - **Documentation only** → Skip `spec`, just `exec → qa`
164
+
165
+ ### 5. Issue Comment Draft
147
166
 
148
167
  Generate a Markdown snippet with:
149
168
  - AC checklist with verification criteria
@@ -159,7 +178,7 @@ Label clearly as:
159
178
  --- DRAFT GITHUB ISSUE COMMENT (PLAN) ---
160
179
  ```
161
180
 
162
- ### 5. Update GitHub Issue
181
+ ### 6. Update GitHub Issue
163
182
 
164
183
  Post the draft comment to GitHub:
165
184
  ```bash
@@ -176,6 +195,7 @@ gh issue edit <issue-number> --add-label "planned"
176
195
  - [ ] **AC Checklist** - Numbered AC items (AC-1, AC-2, etc.) with descriptions
177
196
  - [ ] **Verification Criteria** - Each AC has Verification Method and Test Scenario
178
197
  - [ ] **Implementation Plan** - 3-7 concrete steps with codebase references
198
+ - [ ] **Recommended Workflow** - Phases, Quality Loop setting, and Reasoning
179
199
  - [ ] **Open Questions** - Any ambiguities with recommended defaults
180
200
  - [ ] **Issue Comment Draft** - Formatted for GitHub posting
181
201
 
@@ -221,6 +241,14 @@ You MUST include these sections in order:
221
241
 
222
242
  ---
223
243
 
244
+ ## Recommended Workflow
245
+
246
+ **Phases:** exec → qa
247
+ **Quality Loop:** disabled
248
+ **Reasoning:** [Why these phases based on issue analysis]
249
+
250
+ ---
251
+
224
252
  --- DRAFT GITHUB ISSUE COMMENT (PLAN) ---
225
253
 
226
254
  [Complete formatted comment for GitHub]