sequant 1.1.2 ā 1.1.3
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/dist/bin/cli.js +2 -1
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +38 -2
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/init.test.js +37 -1
- package/dist/src/commands/init.test.js.map +1 -1
- package/dist/src/commands/run.d.ts +2 -0
- package/dist/src/commands/run.d.ts.map +1 -1
- package/dist/src/commands/run.js +219 -18
- package/dist/src/commands/run.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +50 -2
- 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/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 +1 -0
- package/dist/src/lib/stacks.d.ts.map +1 -1
- package/dist/src/lib/stacks.js +6 -0
- package/dist/src/lib/stacks.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/workflow/types.d.ts +2 -0
- package/dist/src/lib/workflow/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/skills/solve/SKILL.md +27 -11
- package/templates/skills/spec/SKILL.md +30 -2
package/dist/bin/cli.js
CHANGED
|
@@ -52,7 +52,8 @@ program
|
|
|
52
52
|
.option("-d, --dry-run", "Preview without execution")
|
|
53
53
|
.option("-v, --verbose", "Verbose output with streaming")
|
|
54
54
|
.option("--timeout <seconds>", "Timeout per phase in seconds", parseInt)
|
|
55
|
-
.option("--log-json", "Enable structured JSON logging")
|
|
55
|
+
.option("--log-json", "Enable structured JSON logging (default: true)")
|
|
56
|
+
.option("--no-log", "Disable JSON logging for this run")
|
|
56
57
|
.option("--log-path <path>", "Custom log directory path")
|
|
57
58
|
.option("-q, --quality-loop", "Enable quality loop with auto-retry")
|
|
58
59
|
.option("--max-iterations <n>", "Max iterations for quality loop (default: 3)", parseInt)
|
package/dist/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,mCAAmC;AACnC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC;AAChC,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CACV,8EAA8E,CAC/E;KACA,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;AAElD,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,qBAAqB,EAAE,0CAA0C,CAAC;KACzE,MAAM,CAAC,WAAW,EAAE,2BAA2B,CAAC;KAChD,MAAM,CAAC,aAAa,EAAE,kCAAkC,CAAC;KACzD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,eAAe,EAAE,mDAAmD,CAAC;KAC5E,MAAM,CAAC,aAAa,EAAE,+BAA+B,CAAC;KACtD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,2DAA2D,CAAC;KACxE,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC;KACnD,MAAM,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;KAClE,MAAM,CAAC,cAAc,EAAE,yBAAyB,CAAC;KACjD,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;KACpD,MAAM,CAAC,eAAe,EAAE,+BAA+B,CAAC;KACxD,MAAM,CAAC,qBAAqB,EAAE,8BAA8B,EAAE,QAAQ,CAAC;KACvE,MAAM,CAAC,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4CH,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoMrE"}
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import chalk from "chalk";
|
|
5
5
|
import inquirer from "inquirer";
|
|
6
|
-
import { detectStack } from "../lib/stacks.js";
|
|
6
|
+
import { detectStack, getStackConfig } from "../lib/stacks.js";
|
|
7
7
|
import { copyTemplates } from "../lib/templates.js";
|
|
8
8
|
import { createManifest } from "../lib/manifest.js";
|
|
9
|
+
import { saveConfig } from "../lib/config.js";
|
|
10
|
+
import { createDefaultSettings } from "../lib/settings.js";
|
|
9
11
|
import { fileExists, ensureDir } from "../lib/fs.js";
|
|
10
12
|
import { commandExists, isGhAuthenticated, getInstallHint, } from "../lib/system.js";
|
|
11
13
|
/**
|
|
@@ -104,6 +106,24 @@ export async function initCommand(options) {
|
|
|
104
106
|
}
|
|
105
107
|
}
|
|
106
108
|
console.log(chalk.blue(`\nš Stack: ${stack}`));
|
|
109
|
+
// Get stack config for default dev URL
|
|
110
|
+
const stackConfig = getStackConfig(stack);
|
|
111
|
+
let devUrl = stackConfig.devUrl;
|
|
112
|
+
// Prompt for dev URL
|
|
113
|
+
if (options.yes) {
|
|
114
|
+
console.log(chalk.blue(`š Dev URL: ${devUrl} (default)`));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const { inputDevUrl } = await inquirer.prompt([
|
|
118
|
+
{
|
|
119
|
+
type: "input",
|
|
120
|
+
name: "inputDevUrl",
|
|
121
|
+
message: "Development server URL:",
|
|
122
|
+
default: devUrl,
|
|
123
|
+
},
|
|
124
|
+
]);
|
|
125
|
+
devUrl = inputDevUrl;
|
|
126
|
+
}
|
|
107
127
|
// Show what will be created
|
|
108
128
|
console.log(chalk.gray("\nWill create:"));
|
|
109
129
|
console.log(chalk.gray(" .claude/"));
|
|
@@ -111,6 +131,9 @@ export async function initCommand(options) {
|
|
|
111
131
|
console.log(chalk.gray(" āāā hooks/ (pre/post tool hooks)"));
|
|
112
132
|
console.log(chalk.gray(" āāā memory/ (constitution & context)"));
|
|
113
133
|
console.log(chalk.gray(" āāā settings.json (hooks configuration)"));
|
|
134
|
+
console.log(chalk.gray(" .sequant/"));
|
|
135
|
+
console.log(chalk.gray(" āāā settings.json (run preferences)"));
|
|
136
|
+
console.log(chalk.gray(" āāā logs/ (workflow run logs)"));
|
|
114
137
|
console.log(chalk.gray(" scripts/dev/"));
|
|
115
138
|
console.log(chalk.gray(" āāā *.sh (worktree helpers)"));
|
|
116
139
|
if (!options.yes) {
|
|
@@ -132,10 +155,23 @@ export async function initCommand(options) {
|
|
|
132
155
|
await ensureDir(".claude/skills");
|
|
133
156
|
await ensureDir(".claude/hooks");
|
|
134
157
|
await ensureDir(".claude/memory");
|
|
158
|
+
await ensureDir(".claude/.sequant");
|
|
159
|
+
await ensureDir(".sequant/logs");
|
|
135
160
|
await ensureDir("scripts/dev");
|
|
161
|
+
// Save config with tokens
|
|
162
|
+
console.log(chalk.blue("š¾ Saving configuration..."));
|
|
163
|
+
const tokens = { DEV_URL: devUrl };
|
|
164
|
+
await saveConfig({
|
|
165
|
+
tokens,
|
|
166
|
+
stack: stack,
|
|
167
|
+
initialized: new Date().toISOString(),
|
|
168
|
+
});
|
|
169
|
+
// Create default settings
|
|
170
|
+
console.log(chalk.blue("āļø Creating default settings..."));
|
|
171
|
+
await createDefaultSettings();
|
|
136
172
|
// Copy templates
|
|
137
173
|
console.log(chalk.blue("š Copying templates..."));
|
|
138
|
-
await copyTemplates(stack);
|
|
174
|
+
await copyTemplates(stack, tokens);
|
|
139
175
|
// Create manifest
|
|
140
176
|
console.log(chalk.blue("š Creating manifest..."));
|
|
141
177
|
await createManifest(stack);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,10 +3,31 @@ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
|
3
3
|
vi.mock("../lib/fs.js", () => ({
|
|
4
4
|
fileExists: vi.fn(),
|
|
5
5
|
ensureDir: vi.fn(),
|
|
6
|
+
writeFile: vi.fn(),
|
|
7
|
+
readFile: vi.fn(),
|
|
8
|
+
}));
|
|
9
|
+
// Mock settings
|
|
10
|
+
vi.mock("../lib/settings.js", () => ({
|
|
11
|
+
createDefaultSettings: vi.fn(),
|
|
12
|
+
SETTINGS_PATH: ".sequant/settings.json",
|
|
6
13
|
}));
|
|
7
14
|
// Mock stacks
|
|
8
15
|
vi.mock("../lib/stacks.js", () => ({
|
|
9
16
|
detectStack: vi.fn(),
|
|
17
|
+
getStackConfig: vi.fn(() => ({
|
|
18
|
+
name: "generic",
|
|
19
|
+
displayName: "Generic",
|
|
20
|
+
devUrl: "http://localhost:3000",
|
|
21
|
+
variables: {
|
|
22
|
+
TEST_COMMAND: "npm test",
|
|
23
|
+
BUILD_COMMAND: "npm run build",
|
|
24
|
+
LINT_COMMAND: "npm run lint",
|
|
25
|
+
},
|
|
26
|
+
})),
|
|
27
|
+
}));
|
|
28
|
+
// Mock config
|
|
29
|
+
vi.mock("../lib/config.js", () => ({
|
|
30
|
+
saveConfig: vi.fn(),
|
|
10
31
|
}));
|
|
11
32
|
// Mock templates
|
|
12
33
|
vi.mock("../lib/templates.js", () => ({
|
|
@@ -39,12 +60,16 @@ import { fileExists, ensureDir } from "../lib/fs.js";
|
|
|
39
60
|
import { detectStack } from "../lib/stacks.js";
|
|
40
61
|
import { copyTemplates } from "../lib/templates.js";
|
|
41
62
|
import { createManifest } from "../lib/manifest.js";
|
|
63
|
+
import { saveConfig } from "../lib/config.js";
|
|
64
|
+
import { createDefaultSettings } from "../lib/settings.js";
|
|
42
65
|
import { commandExists, isGhAuthenticated } from "../lib/system.js";
|
|
43
66
|
const mockFileExists = vi.mocked(fileExists);
|
|
44
67
|
const mockEnsureDir = vi.mocked(ensureDir);
|
|
45
68
|
const mockDetectStack = vi.mocked(detectStack);
|
|
46
69
|
const mockCopyTemplates = vi.mocked(copyTemplates);
|
|
47
70
|
const mockCreateManifest = vi.mocked(createManifest);
|
|
71
|
+
const mockSaveConfig = vi.mocked(saveConfig);
|
|
72
|
+
const mockCreateDefaultSettings = vi.mocked(createDefaultSettings);
|
|
48
73
|
const mockCommandExists = vi.mocked(commandExists);
|
|
49
74
|
const mockIsGhAuthenticated = vi.mocked(isGhAuthenticated);
|
|
50
75
|
describe("init command", () => {
|
|
@@ -58,6 +83,8 @@ describe("init command", () => {
|
|
|
58
83
|
mockDetectStack.mockResolvedValue(null);
|
|
59
84
|
mockCopyTemplates.mockResolvedValue(undefined);
|
|
60
85
|
mockCreateManifest.mockResolvedValue(undefined);
|
|
86
|
+
mockSaveConfig.mockResolvedValue(undefined);
|
|
87
|
+
mockCreateDefaultSettings.mockResolvedValue(undefined);
|
|
61
88
|
mockCommandExists.mockReturnValue(true);
|
|
62
89
|
mockIsGhAuthenticated.mockReturnValue(true);
|
|
63
90
|
});
|
|
@@ -131,8 +158,17 @@ describe("init command", () => {
|
|
|
131
158
|
expect(mockEnsureDir).toHaveBeenCalledWith(".claude/skills");
|
|
132
159
|
expect(mockEnsureDir).toHaveBeenCalledWith(".claude/hooks");
|
|
133
160
|
expect(mockEnsureDir).toHaveBeenCalledWith(".claude/memory");
|
|
161
|
+
expect(mockEnsureDir).toHaveBeenCalledWith(".claude/.sequant");
|
|
162
|
+
expect(mockEnsureDir).toHaveBeenCalledWith(".sequant/logs");
|
|
134
163
|
expect(mockEnsureDir).toHaveBeenCalledWith("scripts/dev");
|
|
135
|
-
expect(
|
|
164
|
+
expect(mockCreateDefaultSettings).toHaveBeenCalled();
|
|
165
|
+
expect(mockSaveConfig).toHaveBeenCalledWith(expect.objectContaining({
|
|
166
|
+
tokens: { DEV_URL: "http://localhost:3000" },
|
|
167
|
+
stack: "nextjs",
|
|
168
|
+
}));
|
|
169
|
+
expect(mockCopyTemplates).toHaveBeenCalledWith("nextjs", {
|
|
170
|
+
DEV_URL: "http://localhost:3000",
|
|
171
|
+
});
|
|
136
172
|
expect(mockCreateManifest).toHaveBeenCalledWith("nextjs");
|
|
137
173
|
const output = consoleLogSpy.mock.calls.map((c) => c[0]).join("\n");
|
|
138
174
|
expect(output).toContain("Sequant initialized successfully");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../../src/commands/init.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEzE,oBAAoB;AACpB,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../../src/commands/init.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ interface RunOptions {
|
|
|
11
11
|
verbose?: boolean;
|
|
12
12
|
timeout?: number;
|
|
13
13
|
logJson?: boolean;
|
|
14
|
+
noLog?: boolean;
|
|
14
15
|
logPath?: string;
|
|
15
16
|
qualityLoop?: boolean;
|
|
16
17
|
maxIterations?: number;
|
|
@@ -18,6 +19,7 @@ interface RunOptions {
|
|
|
18
19
|
smartTests?: boolean;
|
|
19
20
|
noSmartTests?: boolean;
|
|
20
21
|
testgen?: boolean;
|
|
22
|
+
autoDetectPhases?: boolean;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* Main run command
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyJH,UAAU,UAAU;IAClB,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,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAiTD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CA8Rf"}
|
package/dist/src/commands/run.js
CHANGED
|
@@ -8,6 +8,7 @@ import chalk from "chalk";
|
|
|
8
8
|
import { spawnSync } from "child_process";
|
|
9
9
|
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
10
10
|
import { getManifest } from "../lib/manifest.js";
|
|
11
|
+
import { getSettings } from "../lib/settings.js";
|
|
11
12
|
import { LogWriter, createPhaseLogFromTiming, } from "../lib/workflow/log-writer.js";
|
|
12
13
|
import { DEFAULT_PHASES, DEFAULT_CONFIG, } from "../lib/workflow/types.js";
|
|
13
14
|
/**
|
|
@@ -26,6 +27,84 @@ const PHASE_PROMPTS = {
|
|
|
26
27
|
* UI-related labels that trigger automatic test phase
|
|
27
28
|
*/
|
|
28
29
|
const UI_LABELS = ["ui", "frontend", "admin", "web", "browser"];
|
|
30
|
+
/**
|
|
31
|
+
* Bug-related labels that skip spec phase
|
|
32
|
+
*/
|
|
33
|
+
const BUG_LABELS = ["bug", "fix", "hotfix", "patch"];
|
|
34
|
+
/**
|
|
35
|
+
* Documentation labels that skip spec phase
|
|
36
|
+
*/
|
|
37
|
+
const DOCS_LABELS = ["docs", "documentation", "readme"];
|
|
38
|
+
/**
|
|
39
|
+
* Complex labels that enable quality loop
|
|
40
|
+
*/
|
|
41
|
+
const COMPLEX_LABELS = ["complex", "refactor", "breaking", "major"];
|
|
42
|
+
/**
|
|
43
|
+
* Detect phases based on issue labels (like /solve logic)
|
|
44
|
+
*/
|
|
45
|
+
function detectPhasesFromLabels(labels) {
|
|
46
|
+
const lowerLabels = labels.map((l) => l.toLowerCase());
|
|
47
|
+
// Check for bug/fix labels ā exec ā qa (skip spec)
|
|
48
|
+
const isBugFix = lowerLabels.some((label) => BUG_LABELS.some((bugLabel) => label.includes(bugLabel)));
|
|
49
|
+
// Check for docs labels ā exec ā qa (skip spec)
|
|
50
|
+
const isDocs = lowerLabels.some((label) => DOCS_LABELS.some((docsLabel) => label.includes(docsLabel)));
|
|
51
|
+
// Check for UI labels ā add test phase
|
|
52
|
+
const isUI = lowerLabels.some((label) => UI_LABELS.some((uiLabel) => label.includes(uiLabel)));
|
|
53
|
+
// Check for complex labels ā enable quality loop
|
|
54
|
+
const isComplex = lowerLabels.some((label) => COMPLEX_LABELS.some((complexLabel) => label.includes(complexLabel)));
|
|
55
|
+
// Build phase list
|
|
56
|
+
let phases;
|
|
57
|
+
if (isBugFix || isDocs) {
|
|
58
|
+
// Simple workflow: exec ā qa
|
|
59
|
+
phases = ["exec", "qa"];
|
|
60
|
+
}
|
|
61
|
+
else if (isUI) {
|
|
62
|
+
// UI workflow: spec ā exec ā test ā qa
|
|
63
|
+
phases = ["spec", "exec", "test", "qa"];
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Standard workflow: spec ā exec ā qa
|
|
67
|
+
phases = ["spec", "exec", "qa"];
|
|
68
|
+
}
|
|
69
|
+
return { phases, qualityLoop: isComplex };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Parse recommended workflow from /spec output
|
|
73
|
+
*
|
|
74
|
+
* Looks for:
|
|
75
|
+
* ## Recommended Workflow
|
|
76
|
+
* **Phases:** exec ā qa
|
|
77
|
+
* **Quality Loop:** enabled|disabled
|
|
78
|
+
*/
|
|
79
|
+
function parseRecommendedWorkflow(output) {
|
|
80
|
+
// Find the Recommended Workflow section
|
|
81
|
+
const workflowMatch = output.match(/## Recommended Workflow[\s\S]*?\*\*Phases:\*\*\s*([^\n]+)/i);
|
|
82
|
+
if (!workflowMatch) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
// Parse phases from "exec ā qa" or "spec ā exec ā test ā qa" format
|
|
86
|
+
const phasesStr = workflowMatch[1].trim();
|
|
87
|
+
const phaseNames = phasesStr
|
|
88
|
+
.split(/\s*ā\s*|\s*->\s*|\s*,\s*/)
|
|
89
|
+
.map((p) => p.trim().toLowerCase())
|
|
90
|
+
.filter((p) => p.length > 0);
|
|
91
|
+
// Validate and convert to Phase type
|
|
92
|
+
const validPhases = [];
|
|
93
|
+
for (const name of phaseNames) {
|
|
94
|
+
if (["spec", "testgen", "exec", "test", "qa", "loop"].includes(name)) {
|
|
95
|
+
validPhases.push(name);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (validPhases.length === 0) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
// Parse quality loop setting
|
|
102
|
+
const qualityLoopMatch = output.match(/\*\*Quality Loop:\*\*\s*(enabled|disabled|true|false|yes|no)/i);
|
|
103
|
+
const qualityLoop = qualityLoopMatch
|
|
104
|
+
? ["enabled", "true", "yes"].includes(qualityLoopMatch[1].toLowerCase())
|
|
105
|
+
: false;
|
|
106
|
+
return { phases: validPhases, qualityLoop };
|
|
107
|
+
}
|
|
29
108
|
/**
|
|
30
109
|
* Format duration in human-readable format
|
|
31
110
|
*/
|
|
@@ -72,6 +151,7 @@ async function executePhase(issueNumber, phase, config, sessionId) {
|
|
|
72
151
|
let resultSessionId;
|
|
73
152
|
let resultMessage;
|
|
74
153
|
let lastError;
|
|
154
|
+
let capturedOutput = "";
|
|
75
155
|
// Execute using Claude Agent SDK
|
|
76
156
|
const queryInstance = query({
|
|
77
157
|
prompt,
|
|
@@ -101,8 +181,8 @@ async function executePhase(issueNumber, phase, config, sessionId) {
|
|
|
101
181
|
if (message.type === "system" && message.subtype === "init") {
|
|
102
182
|
resultSessionId = message.session_id;
|
|
103
183
|
}
|
|
104
|
-
//
|
|
105
|
-
if (
|
|
184
|
+
// Capture output from assistant messages
|
|
185
|
+
if (message.type === "assistant") {
|
|
106
186
|
// Extract text content from the message
|
|
107
187
|
const content = message.message.content;
|
|
108
188
|
const textContent = content
|
|
@@ -110,7 +190,11 @@ async function executePhase(issueNumber, phase, config, sessionId) {
|
|
|
110
190
|
.map((c) => c.text)
|
|
111
191
|
.join("");
|
|
112
192
|
if (textContent) {
|
|
113
|
-
|
|
193
|
+
capturedOutput += textContent;
|
|
194
|
+
// Show streaming output in verbose mode
|
|
195
|
+
if (config.verbose) {
|
|
196
|
+
process.stdout.write(chalk.gray(textContent));
|
|
197
|
+
}
|
|
114
198
|
}
|
|
115
199
|
}
|
|
116
200
|
// Capture the final result
|
|
@@ -128,6 +212,7 @@ async function executePhase(issueNumber, phase, config, sessionId) {
|
|
|
128
212
|
success: true,
|
|
129
213
|
durationSeconds,
|
|
130
214
|
sessionId: resultSessionId,
|
|
215
|
+
output: capturedOutput,
|
|
131
216
|
};
|
|
132
217
|
}
|
|
133
218
|
else {
|
|
@@ -278,16 +363,34 @@ function parseBatches(batchArgs) {
|
|
|
278
363
|
* Main run command
|
|
279
364
|
*/
|
|
280
365
|
export async function runCommand(issues, options) {
|
|
281
|
-
console.log(chalk.blue("\n
|
|
366
|
+
console.log(chalk.blue("\nš Sequant Workflow Execution\n"));
|
|
282
367
|
// Check if initialized
|
|
283
368
|
const manifest = await getManifest();
|
|
284
369
|
if (!manifest) {
|
|
285
370
|
console.log(chalk.red("ā Sequant is not initialized. Run `sequant init` first."));
|
|
286
371
|
return;
|
|
287
372
|
}
|
|
288
|
-
//
|
|
373
|
+
// Load settings and merge with environment config and CLI options
|
|
374
|
+
const settings = await getSettings();
|
|
289
375
|
const envConfig = getEnvConfig();
|
|
290
|
-
|
|
376
|
+
// Settings provide defaults, env overrides settings, CLI overrides all
|
|
377
|
+
// Note: phases are auto-detected per-issue unless --phases is explicitly set
|
|
378
|
+
const mergedOptions = {
|
|
379
|
+
// Settings defaults (phases removed - now auto-detected)
|
|
380
|
+
sequential: options.sequential ?? settings.run.sequential,
|
|
381
|
+
timeout: options.timeout ?? settings.run.timeout,
|
|
382
|
+
logPath: options.logPath ?? settings.run.logPath,
|
|
383
|
+
qualityLoop: options.qualityLoop ?? settings.run.qualityLoop,
|
|
384
|
+
maxIterations: options.maxIterations ?? settings.run.maxIterations,
|
|
385
|
+
noSmartTests: options.noSmartTests ?? !settings.run.smartTests,
|
|
386
|
+
// Env overrides
|
|
387
|
+
...envConfig,
|
|
388
|
+
// CLI explicit options override all
|
|
389
|
+
...options,
|
|
390
|
+
};
|
|
391
|
+
// Determine if we should auto-detect phases from labels
|
|
392
|
+
const autoDetectPhases = !options.phases && settings.run.autoDetectPhases;
|
|
393
|
+
mergedOptions.autoDetectPhases = autoDetectPhases;
|
|
291
394
|
// Parse issue numbers (or use batch mode)
|
|
292
395
|
let issueNumbers;
|
|
293
396
|
let batches = null;
|
|
@@ -307,11 +410,13 @@ export async function runCommand(issues, options) {
|
|
|
307
410
|
return;
|
|
308
411
|
}
|
|
309
412
|
// Build config
|
|
413
|
+
// Note: config.phases is only used when --phases is explicitly set or autoDetect fails
|
|
414
|
+
const explicitPhases = mergedOptions.phases
|
|
415
|
+
? mergedOptions.phases.split(",").map((p) => p.trim())
|
|
416
|
+
: null;
|
|
310
417
|
const config = {
|
|
311
418
|
...DEFAULT_CONFIG,
|
|
312
|
-
phases:
|
|
313
|
-
? mergedOptions.phases.split(",").map((p) => p.trim())
|
|
314
|
-
: DEFAULT_PHASES,
|
|
419
|
+
phases: explicitPhases ?? DEFAULT_PHASES,
|
|
315
420
|
sequential: mergedOptions.sequential ?? false,
|
|
316
421
|
dryRun: mergedOptions.dryRun ?? false,
|
|
317
422
|
verbose: mergedOptions.verbose ?? false,
|
|
@@ -321,8 +426,12 @@ export async function runCommand(issues, options) {
|
|
|
321
426
|
noSmartTests: mergedOptions.noSmartTests ?? false,
|
|
322
427
|
};
|
|
323
428
|
// Initialize log writer if JSON logging enabled
|
|
429
|
+
// Default: enabled via settings (logJson: true), can be disabled with --no-log
|
|
324
430
|
let logWriter = null;
|
|
325
|
-
|
|
431
|
+
const shouldLog = !mergedOptions.noLog &&
|
|
432
|
+
!config.dryRun &&
|
|
433
|
+
(mergedOptions.logJson ?? settings.run.logJson);
|
|
434
|
+
if (shouldLog) {
|
|
326
435
|
const runConfig = {
|
|
327
436
|
phases: config.phases,
|
|
328
437
|
sequential: config.sequential,
|
|
@@ -330,14 +439,19 @@ export async function runCommand(issues, options) {
|
|
|
330
439
|
maxIterations: config.maxIterations,
|
|
331
440
|
};
|
|
332
441
|
logWriter = new LogWriter({
|
|
333
|
-
logPath: mergedOptions.logPath,
|
|
442
|
+
logPath: mergedOptions.logPath ?? settings.run.logPath,
|
|
334
443
|
verbose: config.verbose,
|
|
335
444
|
});
|
|
336
445
|
await logWriter.initialize(runConfig);
|
|
337
446
|
}
|
|
338
447
|
// Display configuration
|
|
339
448
|
console.log(chalk.gray(` Stack: ${manifest.stack}`));
|
|
340
|
-
|
|
449
|
+
if (autoDetectPhases) {
|
|
450
|
+
console.log(chalk.gray(` Phases: auto-detect from labels`));
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
console.log(chalk.gray(` Phases: ${config.phases.join(" ā ")}`));
|
|
454
|
+
}
|
|
341
455
|
console.log(chalk.gray(` Mode: ${config.sequential ? "sequential" : "parallel"}`));
|
|
342
456
|
if (config.qualityLoop) {
|
|
343
457
|
console.log(chalk.gray(` Quality loop: enabled (max ${config.maxIterations} iterations)`));
|
|
@@ -476,15 +590,102 @@ async function runIssueWithLogging(issueNumber, config, logWriter, labels, optio
|
|
|
476
590
|
let sessionId;
|
|
477
591
|
console.log(chalk.blue(`\n Issue #${issueNumber}`));
|
|
478
592
|
// Determine phases for this specific issue
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
593
|
+
let phases;
|
|
594
|
+
let detectedQualityLoop = false;
|
|
595
|
+
let specAlreadyRan = false;
|
|
596
|
+
if (options.autoDetectPhases) {
|
|
597
|
+
// Check if labels indicate a simple bug/fix (skip spec entirely)
|
|
598
|
+
const lowerLabels = labels.map((l) => l.toLowerCase());
|
|
599
|
+
const isSimpleBugFix = lowerLabels.some((label) => BUG_LABELS.some((bugLabel) => label.includes(bugLabel)));
|
|
600
|
+
if (isSimpleBugFix) {
|
|
601
|
+
// Simple bug fix: skip spec, go straight to exec ā qa
|
|
602
|
+
phases = ["exec", "qa"];
|
|
603
|
+
console.log(chalk.gray(` Bug fix detected: ${phases.join(" ā ")}`));
|
|
604
|
+
}
|
|
605
|
+
else {
|
|
606
|
+
// Run spec first to get recommended workflow
|
|
607
|
+
console.log(chalk.gray(` Running spec to determine workflow...`));
|
|
608
|
+
console.log(chalk.gray(` ā³ spec...`));
|
|
609
|
+
const specStartTime = new Date();
|
|
610
|
+
const specResult = await executePhase(issueNumber, "spec", config, sessionId);
|
|
611
|
+
const specEndTime = new Date();
|
|
612
|
+
if (specResult.sessionId) {
|
|
613
|
+
sessionId = specResult.sessionId;
|
|
614
|
+
}
|
|
615
|
+
phaseResults.push(specResult);
|
|
616
|
+
specAlreadyRan = true;
|
|
617
|
+
// Log spec phase result
|
|
618
|
+
if (logWriter) {
|
|
619
|
+
const phaseLog = createPhaseLogFromTiming("spec", issueNumber, specStartTime, specEndTime, specResult.success
|
|
620
|
+
? "success"
|
|
621
|
+
: specResult.error?.includes("Timeout")
|
|
622
|
+
? "timeout"
|
|
623
|
+
: "failure", { error: specResult.error });
|
|
624
|
+
logWriter.logPhase(phaseLog);
|
|
625
|
+
}
|
|
626
|
+
if (!specResult.success) {
|
|
627
|
+
console.log(chalk.red(` ā spec: ${specResult.error}`));
|
|
628
|
+
const durationSeconds = (Date.now() - startTime) / 1000;
|
|
629
|
+
return {
|
|
630
|
+
issueNumber,
|
|
631
|
+
success: false,
|
|
632
|
+
phaseResults,
|
|
633
|
+
durationSeconds,
|
|
634
|
+
loopTriggered: false,
|
|
635
|
+
};
|
|
636
|
+
}
|
|
637
|
+
const duration = specResult.durationSeconds
|
|
638
|
+
? ` (${formatDuration(specResult.durationSeconds)})`
|
|
639
|
+
: "";
|
|
640
|
+
console.log(chalk.green(` ā spec${duration}`));
|
|
641
|
+
// Parse recommended workflow from spec output
|
|
642
|
+
let parsedWorkflow = specResult.output
|
|
643
|
+
? parseRecommendedWorkflow(specResult.output)
|
|
644
|
+
: null;
|
|
645
|
+
if (parsedWorkflow) {
|
|
646
|
+
// Remove spec from phases since we already ran it
|
|
647
|
+
phases = parsedWorkflow.phases.filter((p) => p !== "spec");
|
|
648
|
+
detectedQualityLoop = parsedWorkflow.qualityLoop;
|
|
649
|
+
console.log(chalk.gray(` Spec recommends: ${phases.join(" ā ")}${detectedQualityLoop ? " (quality loop)" : ""}`));
|
|
650
|
+
}
|
|
651
|
+
else {
|
|
652
|
+
// Fall back to label-based detection
|
|
653
|
+
console.log(chalk.yellow(` Could not parse spec recommendation, using label-based detection`));
|
|
654
|
+
const detected = detectPhasesFromLabels(labels);
|
|
655
|
+
phases = detected.phases.filter((p) => p !== "spec");
|
|
656
|
+
detectedQualityLoop = detected.qualityLoop;
|
|
657
|
+
console.log(chalk.gray(` Fallback: ${phases.join(" ā ")}`));
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
else {
|
|
662
|
+
// Use explicit phases with adjustments
|
|
663
|
+
phases = determinePhasesForIssue(config.phases, labels, options);
|
|
664
|
+
if (phases.length !== config.phases.length) {
|
|
665
|
+
console.log(chalk.gray(` Phases adjusted: ${phases.join(" ā ")}`));
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
// Add testgen phase if requested (and spec was in the phases)
|
|
669
|
+
if (options.testgen &&
|
|
670
|
+
(phases.includes("spec") || specAlreadyRan) &&
|
|
671
|
+
!phases.includes("testgen")) {
|
|
672
|
+
// Insert testgen at the beginning if spec already ran, otherwise after spec
|
|
673
|
+
if (specAlreadyRan) {
|
|
674
|
+
phases.unshift("testgen");
|
|
675
|
+
}
|
|
676
|
+
else {
|
|
677
|
+
const specIndex = phases.indexOf("spec");
|
|
678
|
+
if (specIndex !== -1) {
|
|
679
|
+
phases.splice(specIndex + 1, 0, "testgen");
|
|
680
|
+
}
|
|
681
|
+
}
|
|
482
682
|
}
|
|
483
683
|
let iteration = 0;
|
|
484
|
-
const
|
|
684
|
+
const useQualityLoop = config.qualityLoop || detectedQualityLoop;
|
|
685
|
+
const maxIterations = useQualityLoop ? config.maxIterations : 1;
|
|
485
686
|
while (iteration < maxIterations) {
|
|
486
687
|
iteration++;
|
|
487
|
-
if (
|
|
688
|
+
if (useQualityLoop && iteration > 1) {
|
|
488
689
|
console.log(chalk.yellow(` Quality loop iteration ${iteration}/${maxIterations}`));
|
|
489
690
|
loopTriggered = true;
|
|
490
691
|
}
|
|
@@ -518,7 +719,7 @@ async function runIssueWithLogging(issueNumber, config, logWriter, labels, optio
|
|
|
518
719
|
console.log(chalk.red(` ā ${phase}: ${result.error}`));
|
|
519
720
|
phasesFailed = true;
|
|
520
721
|
// If quality loop enabled, run loop phase to fix issues
|
|
521
|
-
if (
|
|
722
|
+
if (useQualityLoop && iteration < maxIterations) {
|
|
522
723
|
console.log(chalk.yellow(` Running /loop to fix issues...`));
|
|
523
724
|
const loopResult = await executePhase(issueNumber, "loop", config, sessionId);
|
|
524
725
|
phaseResults.push(loopResult);
|