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.
- package/README.md +112 -10
- package/dist/bin/cli.js +3 -1
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +33 -2
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/doctor.test.js +63 -1
- package/dist/src/commands/doctor.test.js.map +1 -1
- package/dist/src/commands/init.d.ts +1 -0
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +75 -9
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/init.test.js +137 -2
- package/dist/src/commands/init.test.js.map +1 -1
- package/dist/src/commands/logs.js +1 -1
- package/dist/src/commands/logs.js.map +1 -1
- package/dist/src/commands/run.d.ts +18 -0
- package/dist/src/commands/run.d.ts.map +1 -1
- package/dist/src/commands/run.js +613 -54
- package/dist/src/commands/run.js.map +1 -1
- package/dist/src/commands/run.test.d.ts +2 -0
- package/dist/src/commands/run.test.d.ts.map +1 -0
- package/dist/src/commands/run.test.js +155 -0
- package/dist/src/commands/run.test.js.map +1 -0
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +58 -6
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/config.d.ts +19 -0
- package/dist/src/lib/config.d.ts.map +1 -0
- package/dist/src/lib/config.js +31 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/manifest.d.ts +3 -1
- package/dist/src/lib/manifest.d.ts.map +1 -1
- package/dist/src/lib/manifest.js +2 -1
- package/dist/src/lib/manifest.js.map +1 -1
- package/dist/src/lib/settings.d.ts +69 -0
- package/dist/src/lib/settings.d.ts.map +1 -0
- package/dist/src/lib/settings.js +79 -0
- package/dist/src/lib/settings.js.map +1 -0
- package/dist/src/lib/stacks.d.ts +28 -0
- package/dist/src/lib/stacks.d.ts.map +1 -1
- package/dist/src/lib/stacks.js +160 -17
- package/dist/src/lib/stacks.js.map +1 -1
- package/dist/src/lib/stacks.test.js +343 -1
- package/dist/src/lib/stacks.test.js.map +1 -1
- package/dist/src/lib/system.d.ts +8 -0
- package/dist/src/lib/system.d.ts.map +1 -1
- package/dist/src/lib/system.js +23 -0
- package/dist/src/lib/system.js.map +1 -1
- package/dist/src/lib/templates.d.ts +5 -1
- package/dist/src/lib/templates.d.ts.map +1 -1
- package/dist/src/lib/templates.js +3 -2
- package/dist/src/lib/templates.js.map +1 -1
- package/dist/src/lib/tty.d.ts +31 -0
- package/dist/src/lib/tty.d.ts.map +1 -0
- package/dist/src/lib/tty.js +81 -0
- package/dist/src/lib/tty.js.map +1 -0
- package/dist/src/lib/tty.test.d.ts +2 -0
- package/dist/src/lib/tty.test.d.ts.map +1 -0
- package/dist/src/lib/tty.test.js +227 -0
- package/dist/src/lib/tty.test.js.map +1 -0
- package/dist/src/lib/workflow/types.d.ts +2 -0
- package/dist/src/lib/workflow/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/hooks/post-tool.sh +4 -2
- package/templates/scripts/new-feature.sh +33 -9
- package/templates/skills/solve/SKILL.md +27 -11
- 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 @@
|
|
|
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;
|
|
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
|
@@ -190,14 +190,16 @@ if [[ "$TOOL_NAME" == "Bash" ]]; then
|
|
|
190
190
|
fi
|
|
191
191
|
|
|
192
192
|
# === DETECT TEST FAILURES ===
|
|
193
|
-
|
|
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
|
-
|
|
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 "$
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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.
|
|
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
|
-
###
|
|
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]
|