@slowcook-ai/cli 0.16.0-alpha.3 → 0.17.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +10 -0
  2. package/dist/cli.js +49 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/brew/agent.d.ts +25 -1
  5. package/dist/commands/brew/agent.d.ts.map +1 -1
  6. package/dist/commands/brew/agent.js +123 -20
  7. package/dist/commands/brew/agent.js.map +1 -1
  8. package/dist/commands/brew/halt.d.ts +1 -1
  9. package/dist/commands/brew/halt.d.ts.map +1 -1
  10. package/dist/commands/brew/halt.js +13 -0
  11. package/dist/commands/brew/halt.js.map +1 -1
  12. package/dist/commands/check/index.d.ts +14 -0
  13. package/dist/commands/check/index.d.ts.map +1 -0
  14. package/dist/commands/check/index.js +75 -0
  15. package/dist/commands/check/index.js.map +1 -0
  16. package/dist/commands/check/mock-isolation.d.ts +52 -0
  17. package/dist/commands/check/mock-isolation.d.ts.map +1 -0
  18. package/dist/commands/check/mock-isolation.js +186 -0
  19. package/dist/commands/check/mock-isolation.js.map +1 -0
  20. package/dist/commands/init/mock.d.ts.map +1 -1
  21. package/dist/commands/init/mock.js +47 -13
  22. package/dist/commands/init/mock.js.map +1 -1
  23. package/dist/commands/on-mockup-approved/index.d.ts +25 -0
  24. package/dist/commands/on-mockup-approved/index.d.ts.map +1 -0
  25. package/dist/commands/on-mockup-approved/index.js +359 -0
  26. package/dist/commands/on-mockup-approved/index.js.map +1 -0
  27. package/dist/commands/plate/classify.d.ts +65 -0
  28. package/dist/commands/plate/classify.d.ts.map +1 -0
  29. package/dist/commands/plate/classify.js +194 -0
  30. package/dist/commands/plate/classify.js.map +1 -0
  31. package/dist/commands/plate/index.d.ts.map +1 -1
  32. package/dist/commands/plate/index.js +259 -34
  33. package/dist/commands/plate/index.js.map +1 -1
  34. package/dist/commands/port/index.d.ts +30 -0
  35. package/dist/commands/port/index.d.ts.map +1 -0
  36. package/dist/commands/port/index.js +237 -0
  37. package/dist/commands/port/index.js.map +1 -0
  38. package/dist/commands/port/transform.d.ts +68 -0
  39. package/dist/commands/port/transform.d.ts.map +1 -0
  40. package/dist/commands/port/transform.js +122 -0
  41. package/dist/commands/port/transform.js.map +1 -0
  42. package/dist/commands/preview/config.d.ts +73 -0
  43. package/dist/commands/preview/config.d.ts.map +1 -0
  44. package/dist/commands/preview/config.js +200 -0
  45. package/dist/commands/preview/config.js.map +1 -0
  46. package/dist/commands/preview/deploy.d.ts +35 -0
  47. package/dist/commands/preview/deploy.d.ts.map +1 -0
  48. package/dist/commands/preview/deploy.js +247 -0
  49. package/dist/commands/preview/deploy.js.map +1 -0
  50. package/dist/commands/preview/index.d.ts +9 -0
  51. package/dist/commands/preview/index.d.ts.map +1 -0
  52. package/dist/commands/preview/index.js +67 -0
  53. package/dist/commands/preview/index.js.map +1 -0
  54. package/dist/commands/preview/ssh.d.ts +49 -0
  55. package/dist/commands/preview/ssh.d.ts.map +1 -0
  56. package/dist/commands/preview/ssh.js +99 -0
  57. package/dist/commands/preview/ssh.js.map +1 -0
  58. package/dist/commands/preview/teardown.d.ts +25 -0
  59. package/dist/commands/preview/teardown.d.ts.map +1 -0
  60. package/dist/commands/preview/teardown.js +164 -0
  61. package/dist/commands/preview/teardown.js.map +1 -0
  62. package/dist/commands/recon/index.d.ts +60 -0
  63. package/dist/commands/recon/index.d.ts.map +1 -0
  64. package/dist/commands/recon/index.js +278 -0
  65. package/dist/commands/recon/index.js.map +1 -0
  66. package/dist/commands/refine/context.d.ts +12 -0
  67. package/dist/commands/refine/context.d.ts.map +1 -1
  68. package/dist/commands/refine/context.js +72 -0
  69. package/dist/commands/refine/context.js.map +1 -1
  70. package/dist/commands/refine/history-index.d.ts +84 -0
  71. package/dist/commands/refine/history-index.d.ts.map +1 -0
  72. package/dist/commands/refine/history-index.js +289 -0
  73. package/dist/commands/refine/history-index.js.map +1 -0
  74. package/dist/commands/refine/index.d.ts.map +1 -1
  75. package/dist/commands/refine/index.js +28 -0
  76. package/dist/commands/refine/index.js.map +1 -1
  77. package/dist/commands/run-mock/index.d.ts +34 -0
  78. package/dist/commands/run-mock/index.d.ts.map +1 -0
  79. package/dist/commands/run-mock/index.js +308 -0
  80. package/dist/commands/run-mock/index.js.map +1 -0
  81. package/dist/commands/vibe/emit.d.ts +6 -0
  82. package/dist/commands/vibe/emit.d.ts.map +1 -1
  83. package/dist/commands/vibe/emit.js +12 -0
  84. package/dist/commands/vibe/emit.js.map +1 -1
  85. package/dist/commands/vibe/index.d.ts.map +1 -1
  86. package/dist/commands/vibe/index.js +180 -47
  87. package/dist/commands/vibe/index.js.map +1 -1
  88. package/package.json +4 -3
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `slowcook run-mock <story>` — 0.16.0-α.17.
3
+ *
4
+ * One-command launch of the mock app + auto-pull when plate force-
5
+ * pushes the mockup branch. Removes the manual cycle of:
6
+ * git fetch + git checkout + cd mock + npm install + npm run dev
7
+ * ...wait for plate...
8
+ * git pull
9
+ *
10
+ * What it does:
11
+ * 1. Resolves story id → mockup branch (`slowcook/mockup/story-N`).
12
+ * 2. `git fetch origin <branch>` then `git checkout <branch>`.
13
+ * 3. `cd mock && npm install` (skipped if package-lock.json is up-to-date).
14
+ * 4. Spawns `npm run dev` in `mock/` (Next dev on :3100).
15
+ * 5. Background poll: every 15s `git fetch origin <branch>`; if origin
16
+ * moved, `git pull --ff-only`. Next-dev's filesystem watcher
17
+ * hot-reloads automatically when the files change.
18
+ * 6. Ctrl-C kills the dev server + the poll loop.
19
+ *
20
+ * Out of scope (queued for follow-up alpha):
21
+ * - Worktree isolation (don't change the user's branch state)
22
+ * - Localhost gh-proxy (PAT prompt remains for now)
23
+ * - Overlay auto-detect props (env vars still needed)
24
+ *
25
+ * Env vars exported into the dev-server child process so the overlay
26
+ * activates without manual setup:
27
+ * NEXT_PUBLIC_SLOWCOOK_REVIEW=1
28
+ * NEXT_PUBLIC_SLOWCOOK_OWNER=<detected from git remote>
29
+ * NEXT_PUBLIC_SLOWCOOK_REPO=<detected from git remote>
30
+ * NEXT_PUBLIC_SLOWCOOK_PR_NUMBER=<looked up via gh pr list>
31
+ * NEXT_PUBLIC_SLOWCOOK_STORY_ID=<from arg>
32
+ */
33
+ export declare function runMock(argv: string[], _cliVersion: string): Promise<void>;
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/run-mock/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AA4HH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0JhF"}
@@ -0,0 +1,308 @@
1
+ /**
2
+ * `slowcook run-mock <story>` — 0.16.0-α.17.
3
+ *
4
+ * One-command launch of the mock app + auto-pull when plate force-
5
+ * pushes the mockup branch. Removes the manual cycle of:
6
+ * git fetch + git checkout + cd mock + npm install + npm run dev
7
+ * ...wait for plate...
8
+ * git pull
9
+ *
10
+ * What it does:
11
+ * 1. Resolves story id → mockup branch (`slowcook/mockup/story-N`).
12
+ * 2. `git fetch origin <branch>` then `git checkout <branch>`.
13
+ * 3. `cd mock && npm install` (skipped if package-lock.json is up-to-date).
14
+ * 4. Spawns `npm run dev` in `mock/` (Next dev on :3100).
15
+ * 5. Background poll: every 15s `git fetch origin <branch>`; if origin
16
+ * moved, `git pull --ff-only`. Next-dev's filesystem watcher
17
+ * hot-reloads automatically when the files change.
18
+ * 6. Ctrl-C kills the dev server + the poll loop.
19
+ *
20
+ * Out of scope (queued for follow-up alpha):
21
+ * - Worktree isolation (don't change the user's branch state)
22
+ * - Localhost gh-proxy (PAT prompt remains for now)
23
+ * - Overlay auto-detect props (env vars still needed)
24
+ *
25
+ * Env vars exported into the dev-server child process so the overlay
26
+ * activates without manual setup:
27
+ * NEXT_PUBLIC_SLOWCOOK_REVIEW=1
28
+ * NEXT_PUBLIC_SLOWCOOK_OWNER=<detected from git remote>
29
+ * NEXT_PUBLIC_SLOWCOOK_REPO=<detected from git remote>
30
+ * NEXT_PUBLIC_SLOWCOOK_PR_NUMBER=<looked up via gh pr list>
31
+ * NEXT_PUBLIC_SLOWCOOK_STORY_ID=<from arg>
32
+ */
33
+ import { execSync, spawn } from "node:child_process";
34
+ import { existsSync, statSync } from "node:fs";
35
+ import { join } from "node:path";
36
+ function parseArgs(argv) {
37
+ const args = {
38
+ story: "",
39
+ repoRoot: process.cwd(),
40
+ pollSeconds: 15,
41
+ skipInstall: false,
42
+ branchOverride: null,
43
+ };
44
+ // Positional first arg is story id (consumer convenience).
45
+ if (argv.length > 0 && argv[0] && !argv[0].startsWith("-")) {
46
+ args.story = argv[0];
47
+ argv = argv.slice(1);
48
+ }
49
+ for (let i = 0; i < argv.length; i++) {
50
+ const a = argv[i];
51
+ const next = argv[i + 1];
52
+ if (a === "--story" && next) {
53
+ args.story = next;
54
+ i++;
55
+ }
56
+ else if (a === "--cwd" && next) {
57
+ args.repoRoot = next;
58
+ i++;
59
+ }
60
+ else if (a === "--branch" && next) {
61
+ args.branchOverride = next;
62
+ i++;
63
+ }
64
+ else if (a === "--poll-seconds" && next) {
65
+ args.pollSeconds = parseInt(next, 10);
66
+ i++;
67
+ }
68
+ else if (a === "--no-poll") {
69
+ args.pollSeconds = 0;
70
+ }
71
+ else if (a === "--skip-install") {
72
+ args.skipInstall = true;
73
+ }
74
+ else if (a === "--help" || a === "-h") {
75
+ printHelp();
76
+ process.exit(0);
77
+ }
78
+ }
79
+ if (!args.story) {
80
+ console.error("story id is required (positional or --story <id>).");
81
+ printHelp();
82
+ process.exit(64);
83
+ }
84
+ return args;
85
+ }
86
+ function printHelp() {
87
+ console.log(`
88
+ slowcook run-mock — one-command mock launch + auto-pull (0.16-α.17)
89
+
90
+ Usage:
91
+ slowcook run-mock <story-id> [options]
92
+ slowcook run-mock --story <story-id> [options]
93
+
94
+ Examples:
95
+ slowcook run-mock 017 # checkout mockup branch + launch dev
96
+ slowcook run-mock 017 --no-poll # disable auto-pull
97
+ slowcook run-mock 017 --poll-seconds 30
98
+ slowcook run-mock 017 --branch slowcook/mockup/story-017-fix
99
+
100
+ Options:
101
+ --story <id> Story id (positional alternative).
102
+ --cwd <path> Repo root (default: cwd).
103
+ --branch <ref> Override mockup branch name.
104
+ --poll-seconds <n> Auto-pull interval (default 15; 0 disables).
105
+ --no-poll Disable auto-pull.
106
+ --skip-install Skip npm install even on lockfile drift.
107
+
108
+ What it does:
109
+ 1. git fetch + git checkout the mockup branch
110
+ 2. npm install in mock/ (skipped when lockfile is up-to-date)
111
+ 3. Spawn next dev on :3100 with overlay env vars set
112
+ 4. Background-poll origin every <poll-seconds> for new commits
113
+ (e.g. plate amendments) and auto-pull. next-dev hot-reloads.
114
+ 5. Ctrl-C cleans up both the dev server + the poll loop.
115
+
116
+ Env auto-exported to the dev process:
117
+ NEXT_PUBLIC_SLOWCOOK_REVIEW=1
118
+ NEXT_PUBLIC_SLOWCOOK_OWNER, _REPO, _PR_NUMBER, _STORY_ID
119
+
120
+ Exit codes:
121
+ 0 clean shutdown via Ctrl-C
122
+ 2 setup error (missing branch / missing mock dir / etc.)
123
+ `);
124
+ }
125
+ function detectOwnerRepo(repoRoot) {
126
+ try {
127
+ const url = execSync("git remote get-url origin", {
128
+ cwd: repoRoot,
129
+ encoding: "utf8",
130
+ stdio: ["ignore", "pipe", "ignore"],
131
+ }).trim();
132
+ const m = url.match(/github\.com[:/]([^/]+)\/([^/.]+)(?:\.git)?$/);
133
+ if (m && m[1] && m[2])
134
+ return { owner: m[1], repo: m[2] };
135
+ }
136
+ catch { /* ignore */ }
137
+ return null;
138
+ }
139
+ function detectPrNumber(repoRoot, branch) {
140
+ try {
141
+ const out = execSync(`gh pr list --repo "$(git -C ${JSON.stringify(repoRoot)} remote get-url origin | sed -E 's|^.*github\\.com[:/]||; s|\\.git$||')" --head ${JSON.stringify(branch)} --state open --json number --jq '.[0].number'`, { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
142
+ const n = parseInt(out, 10);
143
+ return Number.isNaN(n) ? null : n;
144
+ }
145
+ catch {
146
+ return null;
147
+ }
148
+ }
149
+ function gitRevParse(repoRoot, ref) {
150
+ try {
151
+ return execSync(`git -C ${JSON.stringify(repoRoot)} rev-parse ${JSON.stringify(ref)}`, { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
152
+ }
153
+ catch {
154
+ return null;
155
+ }
156
+ }
157
+ export async function runMock(argv, _cliVersion) {
158
+ const args = parseArgs(argv);
159
+ const branch = args.branchOverride ?? `slowcook/mockup/story-${args.story}`;
160
+ const mockDir = join(args.repoRoot, "mock");
161
+ if (!existsSync(mockDir) || !statSync(mockDir).isDirectory()) {
162
+ console.error(`No mock/ directory at ${mockDir}. Run \`slowcook init mock\` first.`);
163
+ process.exit(2);
164
+ }
165
+ const detected = detectOwnerRepo(args.repoRoot);
166
+ if (!detected) {
167
+ console.error("Could not detect owner/repo from git remote. Cannot proceed.");
168
+ process.exit(2);
169
+ }
170
+ console.log(`slowcook run-mock · story-${args.story} on branch ${branch}`);
171
+ // Step 1: git fetch + checkout.
172
+ // 0.16.0-α.21 — auto-stash any dirty working tree before the
173
+ // checkout. Real consumers always have some incidental dirt
174
+ // (Next reformats tsconfig.json, lock files differ, etc.); failing
175
+ // the checkout on those is hostile UX. Stash gets popped on exit.
176
+ let stashedRef = null;
177
+ try {
178
+ const dirty = execSync(`git -C ${JSON.stringify(args.repoRoot)} status --porcelain`, {
179
+ encoding: "utf8",
180
+ stdio: ["ignore", "pipe", "ignore"],
181
+ }).trim();
182
+ if (dirty.length > 0) {
183
+ console.log(` git auto-stash dirty working tree (will pop on exit)`);
184
+ execSync(`git -C ${JSON.stringify(args.repoRoot)} stash push -u -m "slowcook-run-mock auto-stash"`, { stdio: ["ignore", "pipe", "pipe"] });
185
+ stashedRef = "stash@{0}";
186
+ }
187
+ }
188
+ catch (e) {
189
+ console.warn(` git auto-stash failed (${e.message}); checkout may fail`);
190
+ }
191
+ console.log(` git fetch + checkout ${branch}`);
192
+ try {
193
+ execSync(`git -C ${JSON.stringify(args.repoRoot)} fetch origin ${JSON.stringify(branch)}`, { stdio: ["ignore", "ignore", "pipe"] });
194
+ execSync(`git -C ${JSON.stringify(args.repoRoot)} checkout ${JSON.stringify(branch)}`, { stdio: ["ignore", "ignore", "pipe"] });
195
+ }
196
+ catch (e) {
197
+ console.error(`Failed to fetch + checkout ${branch}: ${e.message}`);
198
+ if (stashedRef) {
199
+ try {
200
+ execSync(`git -C ${JSON.stringify(args.repoRoot)} stash pop`, { stdio: ["ignore", "ignore", "pipe"] });
201
+ }
202
+ catch { /* ignore */ }
203
+ }
204
+ process.exit(2);
205
+ }
206
+ // Step 2: npm install in mock/ (only if lockfile changed since last install).
207
+ // 0.16.0-α.22 — also `npm update` the slowcook-ai deps so the lockfile
208
+ // doesn't pin a stale review-overlay / mock-runtime forever. Without
209
+ // this, consumers would only get new features after a manual `npm
210
+ // update` — exactly the wall caught in dogfood iter 8.
211
+ if (!args.skipInstall) {
212
+ console.log(` npm install in mock/`);
213
+ try {
214
+ execSync(`npm install --silent`, { cwd: mockDir, stdio: ["ignore", "inherit", "inherit"] });
215
+ }
216
+ catch (e) {
217
+ console.error(`npm install failed: ${e.message}`);
218
+ process.exit(2);
219
+ }
220
+ console.log(` npm update @slowcook-ai/* (refresh lockfile against latest)`);
221
+ try {
222
+ execSync(`npm update --silent @slowcook-ai/mock-runtime @slowcook-ai/review-overlay`, {
223
+ cwd: mockDir,
224
+ stdio: ["ignore", "inherit", "inherit"],
225
+ });
226
+ }
227
+ catch {
228
+ // Best-effort; old lockfile still works. Don't fail the run.
229
+ console.warn(` npm update failed (non-fatal); using whatever's in the lockfile.`);
230
+ }
231
+ }
232
+ // Step 3: detect PR number for the overlay env vars.
233
+ const prNumber = detectPrNumber(args.repoRoot, branch);
234
+ // Step 4: spawn next dev with env vars.
235
+ const env = {
236
+ ...process.env,
237
+ NEXT_PUBLIC_SLOWCOOK_REVIEW: "1",
238
+ NEXT_PUBLIC_SLOWCOOK_OWNER: detected.owner,
239
+ NEXT_PUBLIC_SLOWCOOK_REPO: detected.repo,
240
+ NEXT_PUBLIC_SLOWCOOK_PR_NUMBER: prNumber ? String(prNumber) : "0",
241
+ NEXT_PUBLIC_SLOWCOOK_STORY_ID: args.story,
242
+ };
243
+ console.log(` npm run dev (next dev :3100)`);
244
+ console.log(` overlay env: REVIEW=1 OWNER=${detected.owner} REPO=${detected.repo} PR=${prNumber ?? "?"} STORY=${args.story}`);
245
+ if (!prNumber) {
246
+ console.warn(` (no open mockup PR found for branch ${branch}; overlay submits will fail until one exists)`);
247
+ }
248
+ const dev = spawn("npm", ["run", "dev"], { cwd: mockDir, env, stdio: "inherit" });
249
+ // Step 5: background poll for branch updates.
250
+ let pollTimer = null;
251
+ if (args.pollSeconds > 0) {
252
+ let lastSha = gitRevParse(args.repoRoot, "HEAD");
253
+ console.log(` poll every ${args.pollSeconds}s for new commits on origin/${branch} (HEAD=${lastSha?.slice(0, 7) ?? "?"})`);
254
+ pollTimer = setInterval(() => {
255
+ try {
256
+ execSync(`git -C ${JSON.stringify(args.repoRoot)} fetch origin ${JSON.stringify(branch)}`, { stdio: ["ignore", "ignore", "pipe"] });
257
+ const remoteSha = gitRevParse(args.repoRoot, `origin/${branch}`);
258
+ if (remoteSha && remoteSha !== lastSha) {
259
+ console.log(`\n[run-mock] origin/${branch} moved: ${lastSha?.slice(0, 7)} → ${remoteSha.slice(0, 7)}`);
260
+ try {
261
+ execSync(`git -C ${JSON.stringify(args.repoRoot)} pull --ff-only origin ${JSON.stringify(branch)}`, { stdio: ["ignore", "inherit", "inherit"] });
262
+ lastSha = remoteSha;
263
+ console.log(`[run-mock] pulled. next-dev should hot-reload.`);
264
+ }
265
+ catch (e) {
266
+ console.error(`[run-mock] pull failed (non-ff?): ${e.message}`);
267
+ }
268
+ }
269
+ }
270
+ catch {
271
+ // Network blip / rate limit — keep polling silently.
272
+ }
273
+ }, args.pollSeconds * 1000);
274
+ }
275
+ // Step 6: clean shutdown on Ctrl-C / dev exit. Pop any stash we
276
+ // pushed in step 1 so the user's working tree is restored to its
277
+ // pre-run-mock state — same UX guarantee as `git stash pop` after
278
+ // their own manual stash dance.
279
+ const cleanup = (signal) => {
280
+ if (pollTimer)
281
+ clearInterval(pollTimer);
282
+ if (dev && !dev.killed) {
283
+ try {
284
+ dev.kill(signal ?? "SIGTERM");
285
+ }
286
+ catch { /* ignore */ }
287
+ }
288
+ if (stashedRef) {
289
+ try {
290
+ execSync(`git -C ${JSON.stringify(args.repoRoot)} stash pop ${JSON.stringify(stashedRef)}`, { stdio: ["ignore", "inherit", "inherit"] });
291
+ console.log(`[run-mock] popped auto-stash; working tree restored.`);
292
+ }
293
+ catch (e) {
294
+ console.warn(`[run-mock] could not pop auto-stash (${e.message}). Run \`git stash pop ${stashedRef}\` manually.`);
295
+ }
296
+ }
297
+ };
298
+ process.on("SIGINT", () => { cleanup("SIGINT"); process.exit(0); });
299
+ process.on("SIGTERM", () => { cleanup("SIGTERM"); process.exit(0); });
300
+ await new Promise((resolve) => {
301
+ dev.on("exit", (code) => {
302
+ cleanup();
303
+ console.log(`\n[run-mock] dev server exited with code ${code ?? 0}`);
304
+ resolve();
305
+ });
306
+ });
307
+ }
308
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/run-mock/index.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,12 @@ export declare function parseVibeOutput(body: string): VibeOutput;
34
34
  * Rejects absolute paths, parent-dir escapes, and paths that normalize
35
35
  * outside the repo.
36
36
  *
37
+ * 0.16.0-α.4 — also requires the path start with `mock/`. Vibe writes
38
+ * ONLY into the mock app (per the singular-mock-app architecture); any
39
+ * write to `src/` or elsewhere is a sign the prompt steering failed.
40
+ * The hard signal here is structural — the agent can't accidentally
41
+ * leak into production source.
42
+ *
37
43
  * Returns the absolute target path on success; throws on rejection.
38
44
  */
39
45
  export declare function validateAndResolveVibePath(repoRoot: string, relPath: string): string;
@@ -1 +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"}
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;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CA4BR;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,MAAM,EAAE,CASV"}
@@ -29,6 +29,12 @@ export function parseVibeOutput(body) {
29
29
  * Rejects absolute paths, parent-dir escapes, and paths that normalize
30
30
  * outside the repo.
31
31
  *
32
+ * 0.16.0-α.4 — also requires the path start with `mock/`. Vibe writes
33
+ * ONLY into the mock app (per the singular-mock-app architecture); any
34
+ * write to `src/` or elsewhere is a sign the prompt steering failed.
35
+ * The hard signal here is structural — the agent can't accidentally
36
+ * leak into production source.
37
+ *
32
38
  * Returns the absolute target path on success; throws on rejection.
33
39
  */
34
40
  export function validateAndResolveVibePath(repoRoot, relPath) {
@@ -39,6 +45,12 @@ export function validateAndResolveVibePath(repoRoot, relPath) {
39
45
  if (normalized.startsWith("..") || normalized === "..") {
40
46
  throw new Error(`Vibe path safety: refusing parent-dir escape: ${JSON.stringify(relPath)}`);
41
47
  }
48
+ // 0.16.0-α.4 — vibe writes only into mock/ (the singular mock app).
49
+ // The mock + production filesystems are kept separate; any leak into
50
+ // src/ or root would break the architecture's structural guarantees.
51
+ if (!normalized.startsWith("mock/") && normalized !== "mock") {
52
+ throw new Error(`Vibe path safety: refusing write outside mock/: ${JSON.stringify(relPath)}. Vibe writes ONLY into the mock app; production src/ is brew's territory.`);
53
+ }
42
54
  // Defense in depth: after join, ensure result starts with repoRoot.
43
55
  const abs = join(repoRoot, normalized);
44
56
  if (!abs.startsWith(repoRoot + sep) && abs !== repoRoot) {
@@ -1 +1 @@
1
- {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../../src/commands/vibe/emit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../../src/commands/vibe/emit.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/vibe/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgMH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuH5E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/vibe/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuRH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgI5E"}