@slowcook-ai/cli 0.14.0-alpha.6 → 0.15.0-alpha.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.
- package/dist/cli.js +9 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/vibe/agent.d.ts +49 -0
- package/dist/commands/vibe/agent.d.ts.map +1 -0
- package/dist/commands/vibe/agent.js +98 -0
- package/dist/commands/vibe/agent.js.map +1 -0
- package/dist/commands/vibe/emit.d.ts +41 -0
- package/dist/commands/vibe/emit.d.ts.map +1 -0
- package/dist/commands/vibe/emit.js +59 -0
- package/dist/commands/vibe/emit.js.map +1 -0
- package/dist/commands/vibe/index.d.ts +14 -0
- package/dist/commands/vibe/index.d.ts.map +1 -0
- package/dist/commands/vibe/index.js +272 -0
- package/dist/commands/vibe/index.js.map +1 -0
- package/dist/commands/vibe/prompts.d.ts +6 -0
- package/dist/commands/vibe/prompts.d.ts.map +1 -0
- package/dist/commands/vibe/prompts.js +6 -0
- package/dist/commands/vibe/prompts.js.map +1 -0
- package/package.json +3 -3
package/dist/cli.js
CHANGED
|
@@ -18,6 +18,7 @@ import { catchup } from "./commands/catchup/index.js";
|
|
|
18
18
|
import { brew } from "./commands/brew/index.js";
|
|
19
19
|
import { map } from "./commands/map/index.js";
|
|
20
20
|
import { extract } from "./commands/extract/index.js";
|
|
21
|
+
import { vibe } from "./commands/vibe/index.js";
|
|
21
22
|
import { dispatch } from "./commands/dispatch/index.js";
|
|
22
23
|
import { fixtures } from "./commands/fixtures/index.js";
|
|
23
24
|
// Read VERSION from package.json at runtime so the CLI's self-reported
|
|
@@ -53,6 +54,7 @@ Usage:
|
|
|
53
54
|
slowcook brew --story <id> [--budget-usd <n>] [--max-iterations <n>] [--model <id>]
|
|
54
55
|
slowcook map (generate|check) [--cwd <path>] [--out <path>] [--md <path>]
|
|
55
56
|
slowcook extract [--schema] [--tokens] [--cwd <path>]
|
|
57
|
+
slowcook vibe --spec <id> [--cwd <path>] [--owner <login>] [--repo <name>] [--dry-run]
|
|
56
58
|
slowcook dispatch <step> [inputs...]
|
|
57
59
|
slowcook fixtures check [--max-age-days <n>] [--story <id>]
|
|
58
60
|
slowcook version
|
|
@@ -74,6 +76,7 @@ Commands available in ${VERSION}:
|
|
|
74
76
|
brew Ratcheted implementation loop: flip red tests to green for one story.
|
|
75
77
|
map Generate / check the repo-wide code map (APIs, pages, components, helpers, types).
|
|
76
78
|
extract Brownfield extracts (schema.mmd, tokens.md) for refine/investigate context. Fast, no node_modules.
|
|
79
|
+
vibe (0.15-α.1) Design-first mockup generator. Reads spec + brownfield + code-map; emits runnable React mockup to slowcook/mockup/story-N PR.
|
|
77
80
|
dispatch Trigger a slowcook GitHub Actions workflow remotely (brew / testgen / refine).
|
|
78
81
|
|
|
79
82
|
Coming in later versions:
|
|
@@ -156,6 +159,12 @@ async function main() {
|
|
|
156
159
|
// context without paying for `map generate`'s full ts-morph scan.
|
|
157
160
|
await extract(args.slice(1), VERSION);
|
|
158
161
|
return;
|
|
162
|
+
case "vibe":
|
|
163
|
+
// 0.15.0-α.1 — design-first mockup generator (plate-pipeline α.1).
|
|
164
|
+
// Reads spec + brownfield extracts + code-map; emits a runnable
|
|
165
|
+
// React mockup to slowcook/mockup/story-N branch + PR.
|
|
166
|
+
await vibe(args.slice(1), VERSION);
|
|
167
|
+
return;
|
|
159
168
|
case "dispatch":
|
|
160
169
|
await dispatch(args.slice(1));
|
|
161
170
|
return;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,uEAAuE;AACvE,2EAA2E;AAC3E,yEAAyE;AACzE,uEAAuE;AACvE,yBAAyB;AACzB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAC9D,MAAM,OAAO,GAAW,CAAC,GAAG,EAAE;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,OAAO,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,MAAM,KAAK,GAAG
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vibe agent — single-shot mockup generator (0.15.0-α.1).
|
|
3
|
+
*
|
|
4
|
+
* Reads spec.yaml + brownfield extracts + code-map summary, calls the
|
|
5
|
+
* LLM once with the VIBE_SYSTEM prompt, parses the XML-block output,
|
|
6
|
+
* writes files + collects component-change requests.
|
|
7
|
+
*
|
|
8
|
+
* Pattern mirrors investigate/agent.ts but simpler:
|
|
9
|
+
* - no tools (vibe doesn't read files; the project context is inlined)
|
|
10
|
+
* - single LLM call (multi-round iteration belongs to plate, not vibe)
|
|
11
|
+
* - format-compliance retry once if the agent emits prose
|
|
12
|
+
*
|
|
13
|
+
* Returns a `VibeResult` the index.ts dispatch consumes for git ops +
|
|
14
|
+
* PR opening.
|
|
15
|
+
*/
|
|
16
|
+
import { type VibeChangeRequest, type VibeFileBlock } from "./emit.js";
|
|
17
|
+
export interface VibeContext {
|
|
18
|
+
repoRoot: string;
|
|
19
|
+
anthropicApiKey: string;
|
|
20
|
+
model: string;
|
|
21
|
+
storyId: string;
|
|
22
|
+
cliVersion: string;
|
|
23
|
+
/** Pre-rendered spec YAML (read by the index.ts wrapper). */
|
|
24
|
+
specYaml: string;
|
|
25
|
+
/**
|
|
26
|
+
* Pre-assembled project-context blob: brownfield extracts + code-map
|
|
27
|
+
* summary, formatted as Markdown. The index.ts wrapper builds this
|
|
28
|
+
* from `.brewing/diagrams/{schema.mmd, tokens.md}` + a code-map
|
|
29
|
+
* digest.
|
|
30
|
+
*/
|
|
31
|
+
projectContext: string;
|
|
32
|
+
/** Optional similar-pages-in-codebase free-form hint. */
|
|
33
|
+
similarPagesHint?: string;
|
|
34
|
+
}
|
|
35
|
+
export type VibeResult = {
|
|
36
|
+
kind: "emitted";
|
|
37
|
+
files: VibeFileBlock[];
|
|
38
|
+
writtenPaths: string[];
|
|
39
|
+
changeRequests: VibeChangeRequest[];
|
|
40
|
+
spendUsd: number;
|
|
41
|
+
rounds: number;
|
|
42
|
+
} | {
|
|
43
|
+
kind: "format-failure";
|
|
44
|
+
finalText: string;
|
|
45
|
+
spendUsd: number;
|
|
46
|
+
rounds: number;
|
|
47
|
+
};
|
|
48
|
+
export declare function runVibe(ctx: VibeContext): Promise<VibeResult>;
|
|
49
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/commands/vibe/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;AAMnB,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,iBAAiB,EAAE,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN,wBAAsB,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAwEnE"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vibe agent — single-shot mockup generator (0.15.0-α.1).
|
|
3
|
+
*
|
|
4
|
+
* Reads spec.yaml + brownfield extracts + code-map summary, calls the
|
|
5
|
+
* LLM once with the VIBE_SYSTEM prompt, parses the XML-block output,
|
|
6
|
+
* writes files + collects component-change requests.
|
|
7
|
+
*
|
|
8
|
+
* Pattern mirrors investigate/agent.ts but simpler:
|
|
9
|
+
* - no tools (vibe doesn't read files; the project context is inlined)
|
|
10
|
+
* - single LLM call (multi-round iteration belongs to plate, not vibe)
|
|
11
|
+
* - format-compliance retry once if the agent emits prose
|
|
12
|
+
*
|
|
13
|
+
* Returns a `VibeResult` the index.ts dispatch consumes for git ops +
|
|
14
|
+
* PR opening.
|
|
15
|
+
*/
|
|
16
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
17
|
+
import { VIBE_SYSTEM, buildVibeUserPrompt, } from "./prompts.js";
|
|
18
|
+
import { parseVibeOutput, writeVibeFiles, } from "./emit.js";
|
|
19
|
+
import { costUsdForUsage } from "@slowcook-ai/llm-anthropic";
|
|
20
|
+
const DEFAULT_MODEL = "claude-opus-4-7";
|
|
21
|
+
const MAX_TOKENS = 8192;
|
|
22
|
+
export async function runVibe(ctx) {
|
|
23
|
+
const anthropic = new Anthropic({ apiKey: ctx.anthropicApiKey });
|
|
24
|
+
const userPrompt = buildVibeUserPrompt({
|
|
25
|
+
storyId: ctx.storyId,
|
|
26
|
+
specYaml: ctx.specYaml,
|
|
27
|
+
similarPagesHint: ctx.similarPagesHint,
|
|
28
|
+
});
|
|
29
|
+
const messages = [
|
|
30
|
+
{ role: "user", content: userPrompt },
|
|
31
|
+
];
|
|
32
|
+
let spendUsd = 0;
|
|
33
|
+
let rounds = 0;
|
|
34
|
+
let finalText = "";
|
|
35
|
+
// Round 1 — fresh emit.
|
|
36
|
+
rounds += 1;
|
|
37
|
+
const r1 = await anthropic.messages.create({
|
|
38
|
+
model: ctx.model,
|
|
39
|
+
max_tokens: MAX_TOKENS,
|
|
40
|
+
system: VIBE_SYSTEM(ctx.projectContext),
|
|
41
|
+
messages,
|
|
42
|
+
});
|
|
43
|
+
spendUsd += costUsd(r1, ctx.model);
|
|
44
|
+
for (const block of r1.content) {
|
|
45
|
+
if (block.type === "text")
|
|
46
|
+
finalText = block.text;
|
|
47
|
+
}
|
|
48
|
+
// Format-compliance retry (single nudge) if no <file> blocks parsed.
|
|
49
|
+
// Mirrors investigate's pattern from 0.13.0-alpha.2c.
|
|
50
|
+
let parsed = parseVibeOutput(finalText);
|
|
51
|
+
if (parsed.files.length === 0) {
|
|
52
|
+
rounds += 1;
|
|
53
|
+
messages.push({ role: "assistant", content: finalText });
|
|
54
|
+
messages.push({
|
|
55
|
+
role: "user",
|
|
56
|
+
content: "Your previous reply contained no `<file path=\"...\">...</file>` blocks. Slowcook's parser greps for those literal tags. Re-emit now using the Output format from your system prompt: each file as a separate `<file path=\"...\">contents</file>` block. No prose preamble or postscript.",
|
|
57
|
+
});
|
|
58
|
+
const r2 = await anthropic.messages.create({
|
|
59
|
+
model: ctx.model,
|
|
60
|
+
max_tokens: MAX_TOKENS,
|
|
61
|
+
system: VIBE_SYSTEM(ctx.projectContext),
|
|
62
|
+
messages,
|
|
63
|
+
});
|
|
64
|
+
spendUsd += costUsd(r2, ctx.model);
|
|
65
|
+
for (const block of r2.content) {
|
|
66
|
+
if (block.type === "text")
|
|
67
|
+
finalText = block.text;
|
|
68
|
+
}
|
|
69
|
+
parsed = parseVibeOutput(finalText);
|
|
70
|
+
}
|
|
71
|
+
if (parsed.files.length === 0) {
|
|
72
|
+
return {
|
|
73
|
+
kind: "format-failure",
|
|
74
|
+
finalText,
|
|
75
|
+
spendUsd,
|
|
76
|
+
rounds,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const writtenPaths = writeVibeFiles(ctx.repoRoot, parsed.files);
|
|
80
|
+
return {
|
|
81
|
+
kind: "emitted",
|
|
82
|
+
files: parsed.files,
|
|
83
|
+
writtenPaths,
|
|
84
|
+
changeRequests: parsed.changeRequests,
|
|
85
|
+
spendUsd,
|
|
86
|
+
rounds,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function costUsd(response, model) {
|
|
90
|
+
const usage = response.usage;
|
|
91
|
+
return costUsdForUsage(model, {
|
|
92
|
+
inputTokens: usage.input_tokens,
|
|
93
|
+
outputTokens: usage.output_tokens,
|
|
94
|
+
cacheReadTokens: usage.cache_read_input_tokens ?? 0,
|
|
95
|
+
cacheCreateTokens: usage.cache_creation_input_tokens ?? 0,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/commands/vibe/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0.15.0-α.1 — vibe's output parser + writer.
|
|
3
|
+
*
|
|
4
|
+
* Vibe emits multi-artifact XML-tagged blocks (matching testgen's shape):
|
|
5
|
+
* <file path="...">contents</file>
|
|
6
|
+
* <component_change_request component="..." path="...">prose</component_change_request>
|
|
7
|
+
*
|
|
8
|
+
* `parseVibeOutput` extracts the blocks. `writeVibeFiles` writes them to
|
|
9
|
+
* disk under repoRoot, with path-safety checks (no escapes, no absolute
|
|
10
|
+
* paths, must be under repoRoot).
|
|
11
|
+
*
|
|
12
|
+
* Component-change requests are surfaced separately; they don't write
|
|
13
|
+
* files. The plate agent (later) handles them by either applying or
|
|
14
|
+
* rejecting via PM iteration.
|
|
15
|
+
*/
|
|
16
|
+
export interface VibeFileBlock {
|
|
17
|
+
/** Repo-relative path; validated to be safe. */
|
|
18
|
+
path: string;
|
|
19
|
+
/** File contents verbatim. */
|
|
20
|
+
contents: string;
|
|
21
|
+
}
|
|
22
|
+
export interface VibeChangeRequest {
|
|
23
|
+
component: string;
|
|
24
|
+
path: string;
|
|
25
|
+
rationale: string;
|
|
26
|
+
}
|
|
27
|
+
export interface VibeOutput {
|
|
28
|
+
files: VibeFileBlock[];
|
|
29
|
+
changeRequests: VibeChangeRequest[];
|
|
30
|
+
}
|
|
31
|
+
export declare function parseVibeOutput(body: string): VibeOutput;
|
|
32
|
+
/**
|
|
33
|
+
* Validate a vibe-emitted path is safe to write under repoRoot.
|
|
34
|
+
* Rejects absolute paths, parent-dir escapes, and paths that normalize
|
|
35
|
+
* outside the repo.
|
|
36
|
+
*
|
|
37
|
+
* Returns the absolute target path on success; throws on rejection.
|
|
38
|
+
*/
|
|
39
|
+
export declare function validateAndResolveVibePath(repoRoot: string, relPath: string): string;
|
|
40
|
+
export declare function writeVibeFiles(repoRoot: string, files: VibeFileBlock[]): string[];
|
|
41
|
+
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/commands/vibe/emit.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,cAAc,EAAE,iBAAiB,EAAE,CAAC;CACrC;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAuBxD;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CAoBR;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,MAAM,EAAE,CASV"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { writeFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, normalize, join, sep } from "node:path";
|
|
3
|
+
const FILE_BLOCK_RE = /<file\s+path="([^"]+)">([\s\S]*?)<\/file>/g;
|
|
4
|
+
const CHANGE_REQ_RE = /<component_change_request\s+component="([^"]+)"\s+path="([^"]+)">([\s\S]*?)<\/component_change_request>/g;
|
|
5
|
+
export function parseVibeOutput(body) {
|
|
6
|
+
const files = [];
|
|
7
|
+
let m;
|
|
8
|
+
const fileRe = new RegExp(FILE_BLOCK_RE.source, "g");
|
|
9
|
+
while ((m = fileRe.exec(body)) !== null) {
|
|
10
|
+
const path = m[1].trim();
|
|
11
|
+
// Strip leading/trailing newlines from the captured body, but
|
|
12
|
+
// preserve interior formatting verbatim.
|
|
13
|
+
const contents = m[2].replace(/^\r?\n/, "").replace(/\s+$/, "") + "\n";
|
|
14
|
+
files.push({ path, contents });
|
|
15
|
+
}
|
|
16
|
+
const changeRequests = [];
|
|
17
|
+
const reqRe = new RegExp(CHANGE_REQ_RE.source, "g");
|
|
18
|
+
while ((m = reqRe.exec(body)) !== null) {
|
|
19
|
+
changeRequests.push({
|
|
20
|
+
component: m[1].trim(),
|
|
21
|
+
path: m[2].trim(),
|
|
22
|
+
rationale: m[3].trim(),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return { files, changeRequests };
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Validate a vibe-emitted path is safe to write under repoRoot.
|
|
29
|
+
* Rejects absolute paths, parent-dir escapes, and paths that normalize
|
|
30
|
+
* outside the repo.
|
|
31
|
+
*
|
|
32
|
+
* Returns the absolute target path on success; throws on rejection.
|
|
33
|
+
*/
|
|
34
|
+
export function validateAndResolveVibePath(repoRoot, relPath) {
|
|
35
|
+
if (isAbsolute(relPath)) {
|
|
36
|
+
throw new Error(`Vibe path safety: refusing absolute path: ${JSON.stringify(relPath)}`);
|
|
37
|
+
}
|
|
38
|
+
const normalized = normalize(relPath);
|
|
39
|
+
if (normalized.startsWith("..") || normalized === "..") {
|
|
40
|
+
throw new Error(`Vibe path safety: refusing parent-dir escape: ${JSON.stringify(relPath)}`);
|
|
41
|
+
}
|
|
42
|
+
// Defense in depth: after join, ensure result starts with repoRoot.
|
|
43
|
+
const abs = join(repoRoot, normalized);
|
|
44
|
+
if (!abs.startsWith(repoRoot + sep) && abs !== repoRoot) {
|
|
45
|
+
throw new Error(`Vibe path safety: resolved path escaped repoRoot: ${JSON.stringify(relPath)}`);
|
|
46
|
+
}
|
|
47
|
+
return abs;
|
|
48
|
+
}
|
|
49
|
+
export function writeVibeFiles(repoRoot, files) {
|
|
50
|
+
const written = [];
|
|
51
|
+
for (const f of files) {
|
|
52
|
+
const abs = validateAndResolveVibePath(repoRoot, f.path);
|
|
53
|
+
mkdirSync(dirname(abs), { recursive: true });
|
|
54
|
+
writeFileSync(abs, f.contents, "utf8");
|
|
55
|
+
written.push(f.path);
|
|
56
|
+
}
|
|
57
|
+
return written;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=emit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../../src/commands/vibe/emit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `slowcook vibe --spec <id>` — 0.15.0-α.1.
|
|
3
|
+
*
|
|
4
|
+
* Reads specs/story-<id>.yaml + brownfield extracts (.brewing/diagrams/)
|
|
5
|
+
* + code-map summary, runs the vibe agent (single-shot LLM call),
|
|
6
|
+
* writes the emitted mockup files to a `slowcook/mockup/story-<id>`
|
|
7
|
+
* branch, opens a draft PR labeled `slowcook-mockup`.
|
|
8
|
+
*
|
|
9
|
+
* The PR is the PM-review surface: preview-deploy renders it, PM
|
|
10
|
+
* comments / annotates / approves. Iteration is handled by the
|
|
11
|
+
* `slowcook plate` command (α.3); vibe is single-shot.
|
|
12
|
+
*/
|
|
13
|
+
export declare function vibe(argv: string[], cliVersion: string): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/vibe/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA4JH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2G5E"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `slowcook vibe --spec <id>` — 0.15.0-α.1.
|
|
3
|
+
*
|
|
4
|
+
* Reads specs/story-<id>.yaml + brownfield extracts (.brewing/diagrams/)
|
|
5
|
+
* + code-map summary, runs the vibe agent (single-shot LLM call),
|
|
6
|
+
* writes the emitted mockup files to a `slowcook/mockup/story-<id>`
|
|
7
|
+
* branch, opens a draft PR labeled `slowcook-mockup`.
|
|
8
|
+
*
|
|
9
|
+
* The PR is the PM-review surface: preview-deploy renders it, PM
|
|
10
|
+
* comments / annotates / approves. Iteration is handled by the
|
|
11
|
+
* `slowcook plate` command (α.3); vibe is single-shot.
|
|
12
|
+
*/
|
|
13
|
+
import { execSync } from "node:child_process";
|
|
14
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { GitHubAdapter } from "@slowcook-ai/forge-github";
|
|
17
|
+
import { runVibe } from "./agent.js";
|
|
18
|
+
function parseArgs(argv) {
|
|
19
|
+
const args = {
|
|
20
|
+
specId: "",
|
|
21
|
+
repoRoot: process.cwd(),
|
|
22
|
+
model: "claude-opus-4-7",
|
|
23
|
+
dryRun: false,
|
|
24
|
+
baseBranch: "main",
|
|
25
|
+
};
|
|
26
|
+
for (let i = 0; i < argv.length; i++) {
|
|
27
|
+
const a = argv[i];
|
|
28
|
+
const next = argv[i + 1];
|
|
29
|
+
if (a === "--spec" && next) {
|
|
30
|
+
args.specId = next;
|
|
31
|
+
i++;
|
|
32
|
+
}
|
|
33
|
+
else if (a === "--cwd" && next) {
|
|
34
|
+
args.repoRoot = next;
|
|
35
|
+
i++;
|
|
36
|
+
}
|
|
37
|
+
else if (a === "--owner" && next) {
|
|
38
|
+
args.owner = next;
|
|
39
|
+
i++;
|
|
40
|
+
}
|
|
41
|
+
else if (a === "--repo" && next) {
|
|
42
|
+
args.repo = next;
|
|
43
|
+
i++;
|
|
44
|
+
}
|
|
45
|
+
else if (a === "--model" && next) {
|
|
46
|
+
args.model = next;
|
|
47
|
+
i++;
|
|
48
|
+
}
|
|
49
|
+
else if (a === "--base-branch" && next) {
|
|
50
|
+
args.baseBranch = next;
|
|
51
|
+
i++;
|
|
52
|
+
}
|
|
53
|
+
else if (a === "--dry-run") {
|
|
54
|
+
args.dryRun = true;
|
|
55
|
+
}
|
|
56
|
+
else if (a === "--help" || a === "-h") {
|
|
57
|
+
printHelp();
|
|
58
|
+
process.exit(0);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (!args.specId) {
|
|
62
|
+
console.error("--spec <id> is required.");
|
|
63
|
+
printHelp();
|
|
64
|
+
process.exit(64);
|
|
65
|
+
}
|
|
66
|
+
return args;
|
|
67
|
+
}
|
|
68
|
+
function printHelp() {
|
|
69
|
+
console.log(`
|
|
70
|
+
slowcook vibe — design-first mockup generator (0.15 plate-pipeline α.1)
|
|
71
|
+
|
|
72
|
+
Reads a frozen spec YAML + brownfield extracts + code-map summary;
|
|
73
|
+
emits a runnable React mockup to a slowcook/mockup/story-<id> branch
|
|
74
|
+
and opens a draft PR. The mockup uses mock data via the data-layer
|
|
75
|
+
seam (src/lib/data/<domain>.{mock.ts,ts}); brew (--mode plate, later)
|
|
76
|
+
replaces the .ts stub with real fetches.
|
|
77
|
+
|
|
78
|
+
Usage:
|
|
79
|
+
slowcook vibe --spec <id> [--cwd <path>] [--owner <login>] [--repo <name>]
|
|
80
|
+
[--model <id>] [--base-branch <name>] [--dry-run]
|
|
81
|
+
|
|
82
|
+
Options:
|
|
83
|
+
--spec <id> Story id (e.g. 017). REQUIRED.
|
|
84
|
+
--cwd <path> Repo root (default: cwd).
|
|
85
|
+
--owner <login> GitHub owner (default: detect from git remote).
|
|
86
|
+
--repo <name> GitHub repo (default: detect from git remote).
|
|
87
|
+
--model <id> Anthropic model (default: claude-opus-4-7).
|
|
88
|
+
--base-branch <n> Base branch for the PR (default: main).
|
|
89
|
+
--dry-run Skip git/PR ops; just emit files in-place.
|
|
90
|
+
|
|
91
|
+
Environment:
|
|
92
|
+
ANTHROPIC_API_KEY (required) Anthropic API key.
|
|
93
|
+
GITHUB_TOKEN (required unless --dry-run) for opening the PR.
|
|
94
|
+
`);
|
|
95
|
+
}
|
|
96
|
+
function detectOwnerRepo(cwd) {
|
|
97
|
+
try {
|
|
98
|
+
const url = execSync("git remote get-url origin", {
|
|
99
|
+
cwd,
|
|
100
|
+
encoding: "utf8",
|
|
101
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
102
|
+
}).trim();
|
|
103
|
+
const m = url.match(/github\.com[:/]([^/]+)\/([^/.]+)(?:\.git)?$/);
|
|
104
|
+
if (m && m[1] && m[2])
|
|
105
|
+
return { owner: m[1], repo: m[2] };
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
/* not a git repo */
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Build the project-context blob fed to vibe's system prompt.
|
|
114
|
+
*
|
|
115
|
+
* Three sections, all optional:
|
|
116
|
+
* 1. .brewing/diagrams/schema.mmd — brownfield ERD
|
|
117
|
+
* 2. .brewing/diagrams/tokens.md — brownfield design tokens
|
|
118
|
+
* 3. .brewing/code-map.md — components/pages/helpers inventory
|
|
119
|
+
*
|
|
120
|
+
* If a file is missing, the section is skipped silently. Vibe still
|
|
121
|
+
* runs (with a "no project context" note) — but quality is much lower
|
|
122
|
+
* without these. Workflow templates run `slowcook map generate
|
|
123
|
+
* --emit-schema --emit-tokens` before vibe to ensure all three exist.
|
|
124
|
+
*/
|
|
125
|
+
function buildProjectContext(repoRoot) {
|
|
126
|
+
const sections = [];
|
|
127
|
+
const schemaPath = join(repoRoot, ".brewing/diagrams/schema.mmd");
|
|
128
|
+
if (existsSync(schemaPath)) {
|
|
129
|
+
try {
|
|
130
|
+
const c = readFileSync(schemaPath, "utf8").trim();
|
|
131
|
+
sections.push("## Existing schema (extracted from `supabase/migrations/*.sql`)\n\n```mermaid\n" +
|
|
132
|
+
c +
|
|
133
|
+
"\n```\n\nReuse entity names verbatim when adding new tables; foreign keys must reference these names exactly.");
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// ignore
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const tokensPath = join(repoRoot, ".brewing/diagrams/tokens.md");
|
|
140
|
+
if (existsSync(tokensPath)) {
|
|
141
|
+
try {
|
|
142
|
+
const c = readFileSync(tokensPath, "utf8").trim();
|
|
143
|
+
sections.push("## Existing design tokens (extracted from `**/*.css`)\n\n" +
|
|
144
|
+
c +
|
|
145
|
+
"\n\nReuse these tokens by exact name (`bg-coral`, `var(--tint-celebrate)`); do NOT introduce new hex/rgb values.");
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// ignore
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const codeMapPath = join(repoRoot, ".brewing/code-map.md");
|
|
152
|
+
if (existsSync(codeMapPath)) {
|
|
153
|
+
try {
|
|
154
|
+
const c = readFileSync(codeMapPath, "utf8").trim();
|
|
155
|
+
sections.push("## Code-map (existing components, pages, helpers)\n\n" +
|
|
156
|
+
c +
|
|
157
|
+
"\n\nReuse components by their import path verbatim. NEVER duplicate functionality of an existing component under a new name.");
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// ignore
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (sections.length === 0) {
|
|
164
|
+
return "_(No `.brewing/diagrams/` or `.brewing/code-map.md` extracts found. Vibe will run blind — strongly recommend running `slowcook map generate --emit-schema --emit-tokens` first.)_";
|
|
165
|
+
}
|
|
166
|
+
return sections.join("\n\n---\n\n");
|
|
167
|
+
}
|
|
168
|
+
export async function vibe(argv, cliVersion) {
|
|
169
|
+
const args = parseArgs(argv);
|
|
170
|
+
const anthropicApiKey = process.env["ANTHROPIC_API_KEY"];
|
|
171
|
+
if (!anthropicApiKey) {
|
|
172
|
+
console.error("ANTHROPIC_API_KEY environment variable is not set.");
|
|
173
|
+
process.exit(2);
|
|
174
|
+
}
|
|
175
|
+
// Spec must exist
|
|
176
|
+
const specPath = join(args.repoRoot, "specs", `story-${args.specId}.yaml`);
|
|
177
|
+
if (!existsSync(specPath)) {
|
|
178
|
+
console.error(`Spec not found at ${specPath}. Did you pass the right --spec id?`);
|
|
179
|
+
process.exit(2);
|
|
180
|
+
}
|
|
181
|
+
const specYaml = readFileSync(specPath, "utf8");
|
|
182
|
+
const projectContext = buildProjectContext(args.repoRoot);
|
|
183
|
+
console.log(`slowcook vibe · story-${args.specId} on ${args.repoRoot} (model: ${args.model}${args.dryRun ? ", dry-run" : ""})`);
|
|
184
|
+
const ctx = {
|
|
185
|
+
repoRoot: args.repoRoot,
|
|
186
|
+
anthropicApiKey,
|
|
187
|
+
model: args.model,
|
|
188
|
+
storyId: args.specId,
|
|
189
|
+
cliVersion,
|
|
190
|
+
specYaml,
|
|
191
|
+
projectContext,
|
|
192
|
+
};
|
|
193
|
+
const result = await runVibe(ctx);
|
|
194
|
+
if (result.kind === "format-failure") {
|
|
195
|
+
console.error(`Vibe emitted no <file> blocks after ${result.rounds} round(s). Spend: $${result.spendUsd.toFixed(4)}.`);
|
|
196
|
+
if (process.env["SLOWCOOK_DEBUG"]) {
|
|
197
|
+
console.error("\n--- agent's final text ---\n");
|
|
198
|
+
console.error(result.finalText);
|
|
199
|
+
}
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
console.log(`Vibe wrote ${result.writtenPaths.length} file(s) in ${result.rounds} round(s) (spend $${result.spendUsd.toFixed(4)}):`);
|
|
203
|
+
for (const p of result.writtenPaths)
|
|
204
|
+
console.log(` ${p}`);
|
|
205
|
+
if (result.changeRequests.length > 0) {
|
|
206
|
+
console.log(`\nVibe surfaced ${result.changeRequests.length} component-change request(s) for plate to handle:`);
|
|
207
|
+
for (const cr of result.changeRequests) {
|
|
208
|
+
console.log(` - ${cr.component} (${cr.path}): ${cr.rationale.slice(0, 100)}…`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (args.dryRun) {
|
|
212
|
+
console.log(`\n--dry-run: skipping git ops + PR opening. Files are emitted in-place at ${args.repoRoot}.`);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const githubToken = process.env["GITHUB_TOKEN"];
|
|
216
|
+
if (!githubToken) {
|
|
217
|
+
console.error("\nGITHUB_TOKEN environment variable is not set. Pass --dry-run to skip git/PR ops.");
|
|
218
|
+
process.exit(2);
|
|
219
|
+
}
|
|
220
|
+
let owner = args.owner;
|
|
221
|
+
let repo = args.repo;
|
|
222
|
+
if (!owner || !repo) {
|
|
223
|
+
const detected = detectOwnerRepo(args.repoRoot);
|
|
224
|
+
if (!detected) {
|
|
225
|
+
console.error("Could not detect owner/repo from git remote. Pass --owner and --repo explicitly.");
|
|
226
|
+
process.exit(2);
|
|
227
|
+
}
|
|
228
|
+
owner = owner ?? detected.owner;
|
|
229
|
+
repo = repo ?? detected.repo;
|
|
230
|
+
}
|
|
231
|
+
const forge = new GitHubAdapter({ owner, repo, token: githubToken });
|
|
232
|
+
const branch = `slowcook/mockup/story-${args.specId}`;
|
|
233
|
+
await forge.git.createBranch(branch);
|
|
234
|
+
for (const p of result.writtenPaths)
|
|
235
|
+
await forge.git.stage(p);
|
|
236
|
+
await forge.git.commit(`vibe: mockup for story-${args.specId}\n\nGenerated by slowcook vibe@${cliVersion}.\n`);
|
|
237
|
+
await forge.git.push(branch);
|
|
238
|
+
try {
|
|
239
|
+
const pr = await forge.createPullRequest({
|
|
240
|
+
head: branch,
|
|
241
|
+
base: args.baseBranch,
|
|
242
|
+
title: `mockup: story-${args.specId}`,
|
|
243
|
+
body: buildPrBody(args.specId, result.writtenPaths, result.changeRequests, result.spendUsd, cliVersion),
|
|
244
|
+
draft: true,
|
|
245
|
+
labels: ["slowcook-mockup"],
|
|
246
|
+
});
|
|
247
|
+
console.log(`\nDraft PR opened: ${pr.url}`);
|
|
248
|
+
console.log("Review the preview deploy; comment `/plate <prose>` to iterate.");
|
|
249
|
+
}
|
|
250
|
+
catch (e) {
|
|
251
|
+
console.error(`Files committed + pushed to '${branch}', but PR creation failed: ${e.message}`);
|
|
252
|
+
process.exit(2);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function buildPrBody(specId, writtenPaths, changeRequests, spendUsd, cliVersion) {
|
|
256
|
+
const out = [];
|
|
257
|
+
out.push(`## Mockup for story-${specId}\n\nGenerated by \`slowcook vibe@${cliVersion}\` (spend $${spendUsd.toFixed(4)}).`);
|
|
258
|
+
out.push(`\nThis is a runnable mockup with mock data. The PM reviews the preview deploy + comments \`/plate <prose>\` to iterate. Brew (\`--mode plate\`, after recipe writes tests against this branch's DOM) will replace \`src/lib/data/<domain>.ts\` stubs with real fetches and add API handlers + migrations — leaving these UI files frozen.\n`);
|
|
259
|
+
out.push(`\n## Files emitted (${writtenPaths.length})\n`);
|
|
260
|
+
for (const p of writtenPaths)
|
|
261
|
+
out.push(`- \`${p}\``);
|
|
262
|
+
if (changeRequests.length > 0) {
|
|
263
|
+
out.push(`\n## Component-change requests (${changeRequests.length})\n`);
|
|
264
|
+
out.push(`Vibe identified existing components that would benefit from a structural change (new prop, etc.) but did NOT modify them. PM reviews + plate applies on iteration.\n`);
|
|
265
|
+
for (const cr of changeRequests) {
|
|
266
|
+
out.push(`### \`${cr.component}\` — \`${cr.path}\`\n\n${cr.rationale}\n`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
out.push(`\n---\nMerge this PR after PM approval to fire \`recipe\` (writes tests against this branch's DOM) → \`brew --mode plate\` (real data layer + API + migrations).`);
|
|
270
|
+
return out.join("\n");
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/vibe/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-export shim — see investigate/prompts.ts for the rationale.
|
|
3
|
+
* Source of truth: `@slowcook-ai/llm-anthropic/prompts/vibe`.
|
|
4
|
+
*/
|
|
5
|
+
export { VIBE_SYSTEM, VIBE_TOOLS, buildVibeUserPrompt, type VibeUserPromptArgs, } from "@slowcook-ai/llm-anthropic";
|
|
6
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/commands/vibe/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,KAAK,kBAAkB,GACxB,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-export shim — see investigate/prompts.ts for the rationale.
|
|
3
|
+
* Source of truth: `@slowcook-ai/llm-anthropic/prompts/vibe`.
|
|
4
|
+
*/
|
|
5
|
+
export { VIBE_SYSTEM, VIBE_TOOLS, buildVibeUserPrompt, } from "@slowcook-ai/llm-anthropic";
|
|
6
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/commands/vibe/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EACX,UAAU,EACV,mBAAmB,GAEpB,MAAM,4BAA4B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@slowcook-ai/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0-alpha.1",
|
|
4
4
|
"description": "CLI for the slowcook brewing harness",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "aminazar",
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
"@slowcook-ai/core": "^0.12.0",
|
|
42
42
|
"@slowcook-ai/stack-ts": "^0.9.6",
|
|
43
43
|
"@slowcook-ai/forge-github": "^0.10.1",
|
|
44
|
-
"@slowcook-ai/
|
|
45
|
-
"@slowcook-ai/
|
|
44
|
+
"@slowcook-ai/llm-anthropic": "^0.10.0",
|
|
45
|
+
"@slowcook-ai/recorder": "^0.9.1"
|
|
46
46
|
},
|
|
47
47
|
"publishConfig": {
|
|
48
48
|
"access": "public"
|