@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.
- package/README.md +10 -0
- package/dist/cli.js +49 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/brew/agent.d.ts +25 -1
- package/dist/commands/brew/agent.d.ts.map +1 -1
- package/dist/commands/brew/agent.js +123 -20
- package/dist/commands/brew/agent.js.map +1 -1
- package/dist/commands/brew/halt.d.ts +1 -1
- package/dist/commands/brew/halt.d.ts.map +1 -1
- package/dist/commands/brew/halt.js +13 -0
- package/dist/commands/brew/halt.js.map +1 -1
- package/dist/commands/check/index.d.ts +14 -0
- package/dist/commands/check/index.d.ts.map +1 -0
- package/dist/commands/check/index.js +75 -0
- package/dist/commands/check/index.js.map +1 -0
- package/dist/commands/check/mock-isolation.d.ts +52 -0
- package/dist/commands/check/mock-isolation.d.ts.map +1 -0
- package/dist/commands/check/mock-isolation.js +186 -0
- package/dist/commands/check/mock-isolation.js.map +1 -0
- package/dist/commands/init/mock.d.ts.map +1 -1
- package/dist/commands/init/mock.js +47 -13
- package/dist/commands/init/mock.js.map +1 -1
- package/dist/commands/on-mockup-approved/index.d.ts +25 -0
- package/dist/commands/on-mockup-approved/index.d.ts.map +1 -0
- package/dist/commands/on-mockup-approved/index.js +359 -0
- package/dist/commands/on-mockup-approved/index.js.map +1 -0
- package/dist/commands/plate/classify.d.ts +65 -0
- package/dist/commands/plate/classify.d.ts.map +1 -0
- package/dist/commands/plate/classify.js +194 -0
- package/dist/commands/plate/classify.js.map +1 -0
- package/dist/commands/plate/index.d.ts.map +1 -1
- package/dist/commands/plate/index.js +259 -34
- package/dist/commands/plate/index.js.map +1 -1
- package/dist/commands/port/index.d.ts +30 -0
- package/dist/commands/port/index.d.ts.map +1 -0
- package/dist/commands/port/index.js +237 -0
- package/dist/commands/port/index.js.map +1 -0
- package/dist/commands/port/transform.d.ts +68 -0
- package/dist/commands/port/transform.d.ts.map +1 -0
- package/dist/commands/port/transform.js +122 -0
- package/dist/commands/port/transform.js.map +1 -0
- package/dist/commands/preview/config.d.ts +73 -0
- package/dist/commands/preview/config.d.ts.map +1 -0
- package/dist/commands/preview/config.js +200 -0
- package/dist/commands/preview/config.js.map +1 -0
- package/dist/commands/preview/deploy.d.ts +35 -0
- package/dist/commands/preview/deploy.d.ts.map +1 -0
- package/dist/commands/preview/deploy.js +247 -0
- package/dist/commands/preview/deploy.js.map +1 -0
- package/dist/commands/preview/index.d.ts +9 -0
- package/dist/commands/preview/index.d.ts.map +1 -0
- package/dist/commands/preview/index.js +67 -0
- package/dist/commands/preview/index.js.map +1 -0
- package/dist/commands/preview/ssh.d.ts +49 -0
- package/dist/commands/preview/ssh.d.ts.map +1 -0
- package/dist/commands/preview/ssh.js +99 -0
- package/dist/commands/preview/ssh.js.map +1 -0
- package/dist/commands/preview/teardown.d.ts +25 -0
- package/dist/commands/preview/teardown.d.ts.map +1 -0
- package/dist/commands/preview/teardown.js +164 -0
- package/dist/commands/preview/teardown.js.map +1 -0
- package/dist/commands/recon/index.d.ts +60 -0
- package/dist/commands/recon/index.d.ts.map +1 -0
- package/dist/commands/recon/index.js +278 -0
- package/dist/commands/recon/index.js.map +1 -0
- package/dist/commands/refine/context.d.ts +12 -0
- package/dist/commands/refine/context.d.ts.map +1 -1
- package/dist/commands/refine/context.js +72 -0
- package/dist/commands/refine/context.js.map +1 -1
- package/dist/commands/refine/history-index.d.ts +84 -0
- package/dist/commands/refine/history-index.d.ts.map +1 -0
- package/dist/commands/refine/history-index.js +289 -0
- package/dist/commands/refine/history-index.js.map +1 -0
- package/dist/commands/refine/index.d.ts.map +1 -1
- package/dist/commands/refine/index.js +28 -0
- package/dist/commands/refine/index.js.map +1 -1
- package/dist/commands/run-mock/index.d.ts +34 -0
- package/dist/commands/run-mock/index.d.ts.map +1 -0
- package/dist/commands/run-mock/index.js +308 -0
- package/dist/commands/run-mock/index.js.map +1 -0
- package/dist/commands/vibe/emit.d.ts +6 -0
- package/dist/commands/vibe/emit.d.ts.map +1 -1
- package/dist/commands/vibe/emit.js +12 -0
- package/dist/commands/vibe/emit.js.map +1 -1
- package/dist/commands/vibe/index.d.ts.map +1 -1
- package/dist/commands/vibe/index.js +180 -47
- package/dist/commands/vibe/index.js.map +1 -1
- 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
|
|
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":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAoCtE,MAAM,aAAa,GAAG,4CAA4C,CAAC;AACnE,MAAM,aAAa,GACjB,0GAA0G,CAAC;AAE7G,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,IAAI,CAAyB,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrD,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAC1B,8DAA8D;QAC9D,yCAAyC;QACzC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,cAAc,GAAwB,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,cAAc,CAAC,IAAI,CAAC;YAClB,SAAS,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;YACvB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;YAClB,SAAS,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;SACxB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;AACnC,CAAC;AAED
|
|
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;
|
|
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"}
|