runshift 0.0.4 → 0.0.5
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/.claude/settings.local.json +2 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +95 -17
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/remove.d.ts +2 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +49 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/context/collector.d.ts.map +1 -1
- package/dist/context/collector.js +33 -0
- package/dist/context/collector.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/display.d.ts +3 -0
- package/dist/ui/display.d.ts.map +1 -1
- package/dist/ui/display.js +36 -2
- package/dist/ui/display.js.map +1 -1
- package/dist/ui/prompt.d.ts +2 -0
- package/dist/ui/prompt.d.ts.map +1 -1
- package/dist/ui/prompt.js +37 -0
- package/dist/ui/prompt.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/init.ts +113 -19
- package/src/commands/remove.ts +59 -0
- package/src/context/collector.ts +44 -0
- package/src/index.ts +8 -0
- package/src/types.ts +2 -0
- package/src/ui/display.ts +37 -2
- package/src/ui/prompt.ts +42 -0
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
"Read(//private/tmp/**)",
|
|
8
8
|
"Bash(node /Users/dc/runshift-cli/dist/index.js init)",
|
|
9
9
|
"Bash(node /Users/dc/runshift-cli/dist/index.js init --help)",
|
|
10
|
-
"Bash(node /Users/dc/runshift-cli/dist/index.js --help)"
|
|
10
|
+
"Bash(node /Users/dc/runshift-cli/dist/index.js --help)",
|
|
11
|
+
"Bash(node /Users/dc/runshift-cli/dist/index.js remove)"
|
|
11
12
|
]
|
|
12
13
|
}
|
|
13
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAyEA,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA2P7D"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import ora from "ora";
|
|
2
|
-
import { execSync } from "node:child_process";
|
|
2
|
+
import { exec, execSync } from "node:child_process";
|
|
3
3
|
import { collectRepoContext, addFileToContext } from "../context/collector.js";
|
|
4
4
|
import { getGitState } from "../context/git.js";
|
|
5
|
-
import { showBanner, showNotGitRepo, showDirtyWarning, showBranchInfo, showScanResults, showDataPolicy, showFindings, showFileList, showSummary, showSuccess, showDryRunComplete, showError, } from "../ui/display.js";
|
|
6
|
-
import { confirm, promptChoice, promptFilePath } from "../ui/prompt.js";
|
|
5
|
+
import { showBanner, showNotGitRepo, showDirtyWarning, showBranchInfo, showScanResults, showDataPolicy, showFindings, showFileList, showSelectedFiles, showProtectedFiles, showSummary, showSuccess, showDryRunComplete, showCancelled, showError, } from "../ui/display.js";
|
|
6
|
+
import { confirm, promptChoice, promptFilePath, promptFileSelection, promptPreview } from "../ui/prompt.js";
|
|
7
7
|
import { writeFiles, commitFiles } from "../writer.js";
|
|
8
|
-
const
|
|
8
|
+
const IS_DEV = process.env.RUNSHIFT_DEV === "true";
|
|
9
|
+
const API_URL = IS_DEV
|
|
9
10
|
? "http://localhost:3000/api/cli/init"
|
|
10
11
|
: "https://runshift.ai/api/cli/init";
|
|
11
|
-
const
|
|
12
|
+
const BASE_URL = IS_DEV
|
|
13
|
+
? "http://localhost:3000"
|
|
14
|
+
: "https://runshift.ai";
|
|
15
|
+
const TIMEOUT_MS = 180_000;
|
|
12
16
|
function parseFlags(args) {
|
|
13
17
|
const flags = { dryRun: false, branch: null, help: false };
|
|
14
18
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -56,6 +60,7 @@ export async function init(args = []) {
|
|
|
56
60
|
showDirtyWarning();
|
|
57
61
|
const proceed = await confirm(" continue with uncommitted changes? (y/n) ");
|
|
58
62
|
if (!proceed) {
|
|
63
|
+
showCancelled();
|
|
59
64
|
process.exit(0);
|
|
60
65
|
}
|
|
61
66
|
}
|
|
@@ -75,8 +80,9 @@ export async function init(args = []) {
|
|
|
75
80
|
// ── 2. Collect context ────────────────────────────────────────────
|
|
76
81
|
const root = process.cwd();
|
|
77
82
|
const context = collectRepoContext(root);
|
|
78
|
-
// ── 3. Show scan results + data policy + prompt
|
|
83
|
+
// ── 3. Show scan results + protected files + data policy + prompt ─
|
|
79
84
|
showScanResults(context);
|
|
85
|
+
showProtectedFiles(context.protectedPaths);
|
|
80
86
|
showDataPolicy();
|
|
81
87
|
let choice = await promptChoice(" proceed? [y] add more files? [a] cancel? [n] ");
|
|
82
88
|
while (choice === "a") {
|
|
@@ -92,6 +98,7 @@ export async function init(args = []) {
|
|
|
92
98
|
choice = await promptChoice(" proceed? [y] add more files? [a] cancel? [n] ");
|
|
93
99
|
}
|
|
94
100
|
if (choice === "n") {
|
|
101
|
+
showCancelled();
|
|
95
102
|
process.exit(0);
|
|
96
103
|
}
|
|
97
104
|
// ── 4. Call API ───────────────────────────────────────────────────
|
|
@@ -99,7 +106,13 @@ export async function init(args = []) {
|
|
|
99
106
|
text: "relay is reading your repository...",
|
|
100
107
|
color: "yellow",
|
|
101
108
|
}).start();
|
|
102
|
-
|
|
109
|
+
const spinnerMessages = [
|
|
110
|
+
{ delay: 8000, text: "relay is analyzing your stack..." },
|
|
111
|
+
{ delay: 20000, text: "generating governance rules..." },
|
|
112
|
+
{ delay: 45000, text: "reviewing with second model..." },
|
|
113
|
+
{ delay: 70000, text: "synthesizing final rules..." },
|
|
114
|
+
];
|
|
115
|
+
const spinnerTimeouts = spinnerMessages.map(({ delay, text }) => setTimeout(() => { spinner.text = text; }, delay));
|
|
103
116
|
let response;
|
|
104
117
|
try {
|
|
105
118
|
const controller = new AbortController();
|
|
@@ -111,11 +124,13 @@ export async function init(args = []) {
|
|
|
111
124
|
signal: controller.signal,
|
|
112
125
|
});
|
|
113
126
|
clearTimeout(timeout);
|
|
127
|
+
spinnerTimeouts.forEach((t) => clearTimeout(t));
|
|
114
128
|
}
|
|
115
129
|
catch (err) {
|
|
130
|
+
spinnerTimeouts.forEach((t) => clearTimeout(t));
|
|
116
131
|
spinner.stop();
|
|
117
132
|
if (err instanceof Error && err.name === "AbortError") {
|
|
118
|
-
showError("network", "request timed out after
|
|
133
|
+
showError("network", "request timed out after 180s");
|
|
119
134
|
}
|
|
120
135
|
else {
|
|
121
136
|
showError("network");
|
|
@@ -152,33 +167,96 @@ export async function init(args = []) {
|
|
|
152
167
|
showSummary(data.summary);
|
|
153
168
|
showFindings(data.findings);
|
|
154
169
|
showFileList(data.files);
|
|
155
|
-
// ── 6.
|
|
170
|
+
// ── 6. Preview link ───────────────────────────────────────────────
|
|
171
|
+
if (data.previewId) {
|
|
172
|
+
const previewUrl = `${BASE_URL}/preview/${data.previewId}`;
|
|
173
|
+
const open = await promptPreview(` preview ready — ${previewUrl}\n\n [o] open in browser [enter] continue `);
|
|
174
|
+
if (open) {
|
|
175
|
+
exec(`open ${previewUrl}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// ── 7. Dry run exit ───────────────────────────────────────────────
|
|
156
179
|
if (flags.dryRun) {
|
|
157
180
|
showDryRunComplete();
|
|
158
181
|
return;
|
|
159
182
|
}
|
|
160
|
-
// ──
|
|
161
|
-
const
|
|
162
|
-
if (
|
|
183
|
+
// ── 8. File selection ────────────────────────────────────────────
|
|
184
|
+
const fileChoice = await promptFileSelection(" [a] accept all [s] select files [n] don't change anything ");
|
|
185
|
+
if (fileChoice === "n") {
|
|
186
|
+
showCancelled();
|
|
163
187
|
process.exit(0);
|
|
164
188
|
}
|
|
165
|
-
|
|
189
|
+
let filesToWrite = data.files;
|
|
190
|
+
if (fileChoice === "a") {
|
|
191
|
+
const preserved = context.protectedPaths.length;
|
|
192
|
+
if (preserved > 0) {
|
|
193
|
+
console.log(`\n relay will write ${data.files.length} files.`);
|
|
194
|
+
console.log(` ${preserved} file${preserved === 1 ? " was" : "s were"} preserved (human-written).\n`);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
console.log(`\n relay will write all ${data.files.length} files.\n`);
|
|
198
|
+
}
|
|
199
|
+
const acceptConfirm = await confirm(" confirm? (y/n) ");
|
|
200
|
+
if (!acceptConfirm) {
|
|
201
|
+
showCancelled();
|
|
202
|
+
process.exit(0);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else if (fileChoice === "s") {
|
|
206
|
+
console.log("\n which files do you want? you can say things like:");
|
|
207
|
+
console.log(" 'all except CLAUDE.md'");
|
|
208
|
+
console.log(" 'only the cursor rules'");
|
|
209
|
+
console.log(" 'just core.mdc and worktrees'\n");
|
|
210
|
+
const instruction = await promptFilePath(" → ");
|
|
211
|
+
const selectUrl = `${BASE_URL}/api/cli/select`;
|
|
212
|
+
let selectedPaths;
|
|
213
|
+
try {
|
|
214
|
+
const selectRes = await fetch(selectUrl, {
|
|
215
|
+
method: "POST",
|
|
216
|
+
headers: { "Content-Type": "application/json" },
|
|
217
|
+
body: JSON.stringify({
|
|
218
|
+
files: data.files.map((f) => f.path),
|
|
219
|
+
instruction,
|
|
220
|
+
}),
|
|
221
|
+
});
|
|
222
|
+
if (!selectRes.ok) {
|
|
223
|
+
showError("server", "file selection failed");
|
|
224
|
+
process.exit(1);
|
|
225
|
+
}
|
|
226
|
+
const selectData = (await selectRes.json());
|
|
227
|
+
selectedPaths = selectData.selectedPaths;
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
showError("network");
|
|
231
|
+
process.exit(1);
|
|
232
|
+
}
|
|
233
|
+
filesToWrite = data.files.filter((f) => selectedPaths.includes(f.path));
|
|
234
|
+
showSelectedFiles(data.files, selectedPaths);
|
|
235
|
+
console.log(` relay will write ${filesToWrite.length} of ${data.files.length} files.\n`);
|
|
236
|
+
const selectConfirm = await confirm(" confirm? (y/n) ");
|
|
237
|
+
if (!selectConfirm) {
|
|
238
|
+
showCancelled();
|
|
239
|
+
process.exit(0);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// ── 9. Re-check git before writing ────────────────────────────────
|
|
166
243
|
const gitNow = getGitState();
|
|
167
244
|
if (gitNow.isDirty && !git.isDirty) {
|
|
168
245
|
const proceed = await confirm(" working tree changed since scan — continue? (y/n) ");
|
|
169
246
|
if (!proceed) {
|
|
247
|
+
showCancelled();
|
|
170
248
|
process.exit(0);
|
|
171
249
|
}
|
|
172
250
|
}
|
|
173
|
-
// ──
|
|
251
|
+
// ── 10. Write + commit ────────────────────────────────────────────
|
|
174
252
|
console.log();
|
|
175
|
-
writeFiles(root,
|
|
253
|
+
writeFiles(root, filesToWrite);
|
|
176
254
|
console.log();
|
|
177
|
-
const committed = commitFiles(root,
|
|
255
|
+
const committed = commitFiles(root, filesToWrite);
|
|
178
256
|
if (!committed) {
|
|
179
257
|
console.log(" ⚠ files written but git commit failed\n");
|
|
180
258
|
}
|
|
181
|
-
// ──
|
|
259
|
+
// ── 11. Success ───────────────────────────────────────────────────
|
|
182
260
|
showSuccess();
|
|
183
261
|
}
|
|
184
262
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAUA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAgD5C"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { showBanner, showCancelled } from "../ui/display.js";
|
|
4
|
+
import { confirm } from "../ui/prompt.js";
|
|
5
|
+
const amber = chalk.hex("#f5a623");
|
|
6
|
+
const dim = chalk.dim;
|
|
7
|
+
const COMMIT_GREP = "install runshift agent governance rules";
|
|
8
|
+
export async function remove() {
|
|
9
|
+
showBanner();
|
|
10
|
+
// ── Find the most recent runshift commit ──────────────────────────
|
|
11
|
+
let logLine;
|
|
12
|
+
try {
|
|
13
|
+
logLine = execSync(`git log --oneline --grep="${COMMIT_GREP}" -1 --format="%H %s %ad" --date=short`, { stdio: "pipe" })
|
|
14
|
+
.toString()
|
|
15
|
+
.trim();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
console.log(amber(" no runshift commit found in this repository.\n"));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (!logLine) {
|
|
22
|
+
console.log(amber(" no runshift commit found in this repository.\n"));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const spaceIdx = logLine.indexOf(" ");
|
|
26
|
+
const hash = logLine.slice(0, spaceIdx);
|
|
27
|
+
const rest = logLine.slice(spaceIdx + 1);
|
|
28
|
+
// Split rest into message and date (date is last 10 chars: YYYY-MM-DD)
|
|
29
|
+
const date = rest.slice(-10);
|
|
30
|
+
const message = rest.slice(0, -11).trim();
|
|
31
|
+
console.log(amber(" relay will revert commit:\n"));
|
|
32
|
+
console.log(dim(` ${hash.slice(0, 7)}`));
|
|
33
|
+
console.log(dim(` ${message}`));
|
|
34
|
+
console.log(dim(` ${date}\n`));
|
|
35
|
+
const proceed = await confirm(" revert this commit? (y/n) ");
|
|
36
|
+
if (!proceed) {
|
|
37
|
+
showCancelled();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
execSync(`git revert ${hash} --no-edit`, { stdio: "pipe" });
|
|
42
|
+
console.log(amber("\n ✓ reverted — runshift governance rules removed\n"));
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
console.log(amber("\n revert failed."));
|
|
46
|
+
console.log(dim(` ${err instanceof Error ? err.message : err}\n`));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=remove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACnC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;AAEtB,MAAM,WAAW,GAAG,yCAAyC,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,UAAU,EAAE,CAAC;IAEb,qEAAqE;IACrE,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,QAAQ,CAChB,6BAA6B,WAAW,wCAAwC,EAChF,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB;aACE,QAAQ,EAAE;aACV,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAEzC,uEAAuE;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC9D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,IAAI,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC,CAAC;IAC7E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/context/collector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/context/collector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAuI/C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAsG5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAM9F"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
3
4
|
import { getGitState } from "./git.js";
|
|
4
5
|
const IGNORE_DIRS = new Set([
|
|
5
6
|
"node_modules", ".git", "dist", ".next", ".vercel", ".turbo",
|
|
@@ -89,6 +90,35 @@ function getRootConfigs(root) {
|
|
|
89
90
|
return [];
|
|
90
91
|
}
|
|
91
92
|
}
|
|
93
|
+
function getProtectedPaths(root, existingRules) {
|
|
94
|
+
const protectedPaths = [];
|
|
95
|
+
for (const filePath of Object.keys(existingRules)) {
|
|
96
|
+
// CLAUDE.md is always protected regardless of git history
|
|
97
|
+
if (filePath === "CLAUDE.md") {
|
|
98
|
+
protectedPaths.push(filePath);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const lastCommitMsg = execSync(`git log --follow -1 --pretty=format:"%s" -- "${filePath}"`, { cwd: root, stdio: "pipe" }).toString().trim();
|
|
103
|
+
if (!lastCommitMsg) {
|
|
104
|
+
// Not in git → human created → protect
|
|
105
|
+
protectedPaths.push(filePath);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const isRelay = lastCommitMsg.includes("install runshift agent governance rules") ||
|
|
109
|
+
lastCommitMsg.includes("runshift update");
|
|
110
|
+
if (!isRelay) {
|
|
111
|
+
// Last commit was by a human → protect
|
|
112
|
+
protectedPaths.push(filePath);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// git log failed → protect to be safe
|
|
117
|
+
protectedPaths.push(filePath);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return protectedPaths;
|
|
121
|
+
}
|
|
92
122
|
export function collectRepoContext(root) {
|
|
93
123
|
// ── package.json ──
|
|
94
124
|
const pkgJson = readJsonSafe(path.join(root, "package.json"));
|
|
@@ -150,6 +180,8 @@ export function collectRepoContext(root) {
|
|
|
150
180
|
if (claudeMd) {
|
|
151
181
|
existingRules["CLAUDE.md"] = claudeMd;
|
|
152
182
|
}
|
|
183
|
+
// ── Protected paths ──
|
|
184
|
+
const protectedPaths = getProtectedPaths(root, existingRules);
|
|
153
185
|
// ── Migrations ──
|
|
154
186
|
let migrationCount = 0;
|
|
155
187
|
let migrationNames = [];
|
|
@@ -177,6 +209,7 @@ export function collectRepoContext(root) {
|
|
|
177
209
|
migrationCount,
|
|
178
210
|
migrationNames,
|
|
179
211
|
rootConfigs,
|
|
212
|
+
protectedPaths,
|
|
180
213
|
gitState,
|
|
181
214
|
};
|
|
182
215
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/context/collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/context/collector.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { init } from "./commands/init.js";
|
|
3
|
+
import { remove } from "./commands/remove.js";
|
|
3
4
|
const args = process.argv.slice(2);
|
|
4
5
|
const command = args[0] ?? "init";
|
|
5
6
|
switch (command) {
|
|
@@ -9,6 +10,12 @@ switch (command) {
|
|
|
9
10
|
process.exit(1);
|
|
10
11
|
});
|
|
11
12
|
break;
|
|
13
|
+
case "remove":
|
|
14
|
+
remove().catch((err) => {
|
|
15
|
+
console.error(err.message ?? err);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
});
|
|
18
|
+
break;
|
|
12
19
|
case "--version":
|
|
13
20
|
case "-v":
|
|
14
21
|
console.log("runshift 0.0.3");
|
|
@@ -20,6 +27,7 @@ switch (command) {
|
|
|
20
27
|
|
|
21
28
|
Usage:
|
|
22
29
|
npx runshift init [options] Read your repo, generate governance rules
|
|
30
|
+
npx runshift remove Revert the runshift install commit
|
|
23
31
|
|
|
24
32
|
Options:
|
|
25
33
|
--version, -v Show version
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;AAElC,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,MAAM;QACT,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAChC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IACR,KAAK,QAAQ;QACX,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACrB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IACR,KAAK,WAAW,CAAC;IACjB,KAAK,IAAI;QACP,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,MAAM;IACR,KAAK,QAAQ,CAAC;IACd,KAAK,IAAI;QACP,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;CAcf,CAAC,CAAC;QACC,MAAM;IACR;QACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,oCAAoC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface RepoContext {
|
|
|
17
17
|
migrationCount: number;
|
|
18
18
|
migrationNames: string[];
|
|
19
19
|
rootConfigs: string[];
|
|
20
|
+
protectedPaths: string[];
|
|
20
21
|
gitState: {
|
|
21
22
|
branch: string;
|
|
22
23
|
isDirty: boolean;
|
|
@@ -38,5 +39,6 @@ export interface InitResponse {
|
|
|
38
39
|
files: GeneratedFile[];
|
|
39
40
|
findings: Findings;
|
|
40
41
|
summary: string;
|
|
42
|
+
previewId?: string;
|
|
41
43
|
}
|
|
42
44
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG;YAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;KAChD,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KAClB,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,yBAAyB,EAAE,MAAM,EAAE,CAAC;IACpC,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG;YAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;KAChD,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KAClB,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,yBAAyB,EAAE,MAAM,EAAE,CAAC;IACpC,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
package/dist/ui/display.d.ts
CHANGED
|
@@ -6,11 +6,14 @@ export declare function showBranchInfo(branch: string): void;
|
|
|
6
6
|
export declare function showScanResults(context: RepoContext): void;
|
|
7
7
|
export declare function showFindings(findings: Findings): void;
|
|
8
8
|
export declare function showFileList(files: GeneratedFile[]): void;
|
|
9
|
+
export declare function showSelectedFiles(allFiles: GeneratedFile[], selectedPaths: string[]): void;
|
|
9
10
|
export declare function showWriting(filePath: string): void;
|
|
10
11
|
export declare function showCommit(): void;
|
|
12
|
+
export declare function showProtectedFiles(protectedPaths: string[]): void;
|
|
11
13
|
export declare function showSummary(summary: string): void;
|
|
12
14
|
export declare function showSuccess(): void;
|
|
13
15
|
export declare function showDataPolicy(): void;
|
|
14
16
|
export declare function showDryRunComplete(): void;
|
|
17
|
+
export declare function showCancelled(): void;
|
|
15
18
|
export declare function showError(type: "network" | "rate-limit" | "validation" | "server", message?: string): void;
|
|
16
19
|
//# sourceMappingURL=display.d.ts.map
|
package/dist/ui/display.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/ui/display.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAOxE,wBAAgB,UAAU,IAAI,IAAI,CAUjC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/ui/display.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAOxE,wBAAgB,UAAU,IAAI,IAAI,CAUjC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAyD1D;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAsBrD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAQzD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,CAW1F;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,CAQjE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,IAAI,IAAI,CAQlC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAUrC;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAMpC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAmB1G"}
|
package/dist/ui/display.js
CHANGED
|
@@ -56,12 +56,16 @@ export function showScanResults(context) {
|
|
|
56
56
|
detections.push(`supabase/migrations/ — ${context.migrationCount} migration file${context.migrationCount === 1 ? "" : "s"} found`);
|
|
57
57
|
}
|
|
58
58
|
const existingRuleKeys = Object.keys(context.existingRules);
|
|
59
|
+
const protectedSet = new Set(context.protectedPaths);
|
|
59
60
|
const cursorRules = existingRuleKeys.filter((k) => k.startsWith(".cursor/rules/"));
|
|
60
61
|
if (cursorRules.length > 0) {
|
|
61
|
-
|
|
62
|
+
const protectedCount = cursorRules.filter((k) => protectedSet.has(k)).length;
|
|
63
|
+
const suffix = protectedCount > 0 ? ` (${protectedCount} protected)` : "";
|
|
64
|
+
detections.push(`.cursor/rules/ — ${cursorRules.length} existing file${cursorRules.length === 1 ? "" : "s"} detected${suffix}`);
|
|
62
65
|
}
|
|
63
66
|
if (existingRuleKeys.includes("CLAUDE.md")) {
|
|
64
|
-
|
|
67
|
+
const claudeProtected = protectedSet.has("CLAUDE.md") ? " (protected — human-written)" : "";
|
|
68
|
+
detections.push(`existing CLAUDE.md detected${claudeProtected}`);
|
|
65
69
|
}
|
|
66
70
|
if (context.tsconfig) {
|
|
67
71
|
detections.push("tsconfig.json detected");
|
|
@@ -106,12 +110,35 @@ export function showFileList(files) {
|
|
|
106
110
|
}
|
|
107
111
|
console.log(dim("\n + = create, ~ = update existing file\n"));
|
|
108
112
|
}
|
|
113
|
+
export function showSelectedFiles(allFiles, selectedPaths) {
|
|
114
|
+
const selected = new Set(selectedPaths);
|
|
115
|
+
console.log(amber(" relay understood:\n"));
|
|
116
|
+
for (const file of allFiles) {
|
|
117
|
+
if (selected.has(file.path)) {
|
|
118
|
+
console.log(dim(" ✓ ") + file.path + dim(" (included)"));
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.log(dim(" ✗ ") + muted(file.path) + dim(" (excluded)"));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
console.log();
|
|
125
|
+
}
|
|
109
126
|
export function showWriting(filePath) {
|
|
110
127
|
console.log(dim(" ✓ ") + filePath);
|
|
111
128
|
}
|
|
112
129
|
export function showCommit() {
|
|
113
130
|
console.log(dim(" ✓ ") + "committed");
|
|
114
131
|
}
|
|
132
|
+
export function showProtectedFiles(protectedPaths) {
|
|
133
|
+
if (protectedPaths.length === 0)
|
|
134
|
+
return;
|
|
135
|
+
console.log();
|
|
136
|
+
console.log(amber(" relay preserved your existing files:"));
|
|
137
|
+
for (const p of protectedPaths) {
|
|
138
|
+
console.log(dim(` ~ ${p} — human-written, not overwritten`));
|
|
139
|
+
}
|
|
140
|
+
console.log(dim(" run npx runshift update to review suggested changes.\n"));
|
|
141
|
+
}
|
|
115
142
|
export function showSummary(summary) {
|
|
116
143
|
console.log(muted(` ${summary.replace(/\n/g, "\n ")}\n`));
|
|
117
144
|
}
|
|
@@ -141,6 +168,13 @@ export function showDryRunComplete() {
|
|
|
141
168
|
console.log(dim(" run npx runshift init to install.\n"));
|
|
142
169
|
console.log(divider + "\n");
|
|
143
170
|
}
|
|
171
|
+
export function showCancelled() {
|
|
172
|
+
console.log();
|
|
173
|
+
console.log(amber(" no changes made."));
|
|
174
|
+
console.log(dim(" run npx runshift init when you're ready."));
|
|
175
|
+
console.log();
|
|
176
|
+
console.log(divider + "\n");
|
|
177
|
+
}
|
|
144
178
|
export function showError(type, message) {
|
|
145
179
|
console.log();
|
|
146
180
|
switch (type) {
|
package/dist/ui/display.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/ui/display.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/ui/display.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/prompt.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export declare function confirm(question: string): Promise<boolean>;
|
|
2
2
|
export declare function promptChoice(question: string): Promise<"y" | "a" | "n">;
|
|
3
3
|
export declare function promptFilePath(question: string): Promise<string>;
|
|
4
|
+
export declare function promptFileSelection(question: string): Promise<"a" | "s" | "n">;
|
|
5
|
+
export declare function promptPreview(message: string): Promise<boolean>;
|
|
4
6
|
//# sourceMappingURL=prompt.d.ts.map
|
package/dist/ui/prompt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/ui/prompt.ts"],"names":[],"mappings":"AAgBA,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIhE;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAM7E;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEtE"}
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/ui/prompt.ts"],"names":[],"mappings":"AAgBA,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIhE;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAM7E;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEtE;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAMpF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgC/D"}
|
package/dist/ui/prompt.js
CHANGED
|
@@ -28,4 +28,41 @@ export async function promptChoice(question) {
|
|
|
28
28
|
export async function promptFilePath(question) {
|
|
29
29
|
return ask(question);
|
|
30
30
|
}
|
|
31
|
+
export async function promptFileSelection(question) {
|
|
32
|
+
const answer = await ask(question);
|
|
33
|
+
const normalized = answer.toLowerCase();
|
|
34
|
+
if (normalized === "a" || normalized === "accept")
|
|
35
|
+
return "a";
|
|
36
|
+
if (normalized === "s" || normalized === "select")
|
|
37
|
+
return "s";
|
|
38
|
+
return "n";
|
|
39
|
+
}
|
|
40
|
+
export function promptPreview(message) {
|
|
41
|
+
return new Promise((resolve) => {
|
|
42
|
+
process.stdout.write(message);
|
|
43
|
+
const wasRaw = process.stdin.isRaw;
|
|
44
|
+
process.stdin.setRawMode(true);
|
|
45
|
+
process.stdin.resume();
|
|
46
|
+
const onData = (key) => {
|
|
47
|
+
process.stdin.setRawMode(wasRaw ?? false);
|
|
48
|
+
process.stdin.pause();
|
|
49
|
+
process.stdin.removeListener("data", onData);
|
|
50
|
+
const ch = key.toString();
|
|
51
|
+
// ctrl-c
|
|
52
|
+
if (ch === "\x03") {
|
|
53
|
+
console.log();
|
|
54
|
+
process.exit(0);
|
|
55
|
+
}
|
|
56
|
+
if (ch.toLowerCase() === "o") {
|
|
57
|
+
console.log("o\n");
|
|
58
|
+
resolve(true);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
console.log("\n");
|
|
62
|
+
resolve(false);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
process.stdin.on("data", onData);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
31
68
|
//# sourceMappingURL=prompt.js.map
|
package/dist/ui/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/ui/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,SAAS,GAAG,CAAC,QAAgB;IAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB;IAC5C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACxC,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC;IAC3D,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC;IAC3D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;AACvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/ui/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,SAAS,GAAG,CAAC,QAAgB;IAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB;IAC5C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACxC,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC;IAC3D,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC;IAC3D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAC9D,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAC9D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAEvB,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE;YAC7B,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAE7C,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YAE1B,SAAS;YACT,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
package/src/commands/init.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import ora from "ora";
|
|
2
|
-
import { execSync } from "node:child_process";
|
|
2
|
+
import { exec, execSync } from "node:child_process";
|
|
3
3
|
import { collectRepoContext, addFileToContext } from "../context/collector.js";
|
|
4
4
|
import { getGitState } from "../context/git.js";
|
|
5
5
|
import {
|
|
@@ -11,21 +11,29 @@ import {
|
|
|
11
11
|
showDataPolicy,
|
|
12
12
|
showFindings,
|
|
13
13
|
showFileList,
|
|
14
|
+
showSelectedFiles,
|
|
15
|
+
showProtectedFiles,
|
|
14
16
|
showSummary,
|
|
15
17
|
showSuccess,
|
|
16
18
|
showDryRunComplete,
|
|
19
|
+
showCancelled,
|
|
17
20
|
showError,
|
|
18
21
|
} from "../ui/display.js";
|
|
19
|
-
import { confirm, promptChoice, promptFilePath } from "../ui/prompt.js";
|
|
22
|
+
import { confirm, promptChoice, promptFilePath, promptFileSelection, promptPreview } from "../ui/prompt.js";
|
|
20
23
|
import { writeFiles, commitFiles } from "../writer.js";
|
|
21
24
|
import type { InitResponse } from "../types.js";
|
|
22
25
|
|
|
23
|
-
const
|
|
24
|
-
process.env.RUNSHIFT_DEV === "true"
|
|
25
|
-
? "http://localhost:3000/api/cli/init"
|
|
26
|
-
: "https://runshift.ai/api/cli/init";
|
|
26
|
+
const IS_DEV = process.env.RUNSHIFT_DEV === "true";
|
|
27
27
|
|
|
28
|
-
const
|
|
28
|
+
const API_URL = IS_DEV
|
|
29
|
+
? "http://localhost:3000/api/cli/init"
|
|
30
|
+
: "https://runshift.ai/api/cli/init";
|
|
31
|
+
|
|
32
|
+
const BASE_URL = IS_DEV
|
|
33
|
+
? "http://localhost:3000"
|
|
34
|
+
: "https://runshift.ai";
|
|
35
|
+
|
|
36
|
+
const TIMEOUT_MS = 180_000;
|
|
29
37
|
|
|
30
38
|
interface InitFlags {
|
|
31
39
|
dryRun: boolean;
|
|
@@ -87,6 +95,7 @@ export async function init(args: string[] = []): Promise<void> {
|
|
|
87
95
|
showDirtyWarning();
|
|
88
96
|
const proceed = await confirm(" continue with uncommitted changes? (y/n) ");
|
|
89
97
|
if (!proceed) {
|
|
98
|
+
showCancelled();
|
|
90
99
|
process.exit(0);
|
|
91
100
|
}
|
|
92
101
|
}
|
|
@@ -109,8 +118,9 @@ export async function init(args: string[] = []): Promise<void> {
|
|
|
109
118
|
const root = process.cwd();
|
|
110
119
|
const context = collectRepoContext(root);
|
|
111
120
|
|
|
112
|
-
// ── 3. Show scan results + data policy + prompt
|
|
121
|
+
// ── 3. Show scan results + protected files + data policy + prompt ─
|
|
113
122
|
showScanResults(context);
|
|
123
|
+
showProtectedFiles(context.protectedPaths);
|
|
114
124
|
showDataPolicy();
|
|
115
125
|
|
|
116
126
|
let choice = await promptChoice(" proceed? [y] add more files? [a] cancel? [n] ");
|
|
@@ -129,6 +139,7 @@ export async function init(args: string[] = []): Promise<void> {
|
|
|
129
139
|
}
|
|
130
140
|
|
|
131
141
|
if (choice === "n") {
|
|
142
|
+
showCancelled();
|
|
132
143
|
process.exit(0);
|
|
133
144
|
}
|
|
134
145
|
|
|
@@ -138,7 +149,16 @@ export async function init(args: string[] = []): Promise<void> {
|
|
|
138
149
|
color: "yellow",
|
|
139
150
|
}).start();
|
|
140
151
|
|
|
141
|
-
|
|
152
|
+
const spinnerMessages = [
|
|
153
|
+
{ delay: 8000, text: "relay is analyzing your stack..." },
|
|
154
|
+
{ delay: 20000, text: "generating governance rules..." },
|
|
155
|
+
{ delay: 45000, text: "reviewing with second model..." },
|
|
156
|
+
{ delay: 70000, text: "synthesizing final rules..." },
|
|
157
|
+
];
|
|
158
|
+
|
|
159
|
+
const spinnerTimeouts = spinnerMessages.map(({ delay, text }) =>
|
|
160
|
+
setTimeout(() => { spinner.text = text; }, delay),
|
|
161
|
+
);
|
|
142
162
|
|
|
143
163
|
let response: Response;
|
|
144
164
|
try {
|
|
@@ -153,10 +173,12 @@ export async function init(args: string[] = []): Promise<void> {
|
|
|
153
173
|
});
|
|
154
174
|
|
|
155
175
|
clearTimeout(timeout);
|
|
176
|
+
spinnerTimeouts.forEach((t) => clearTimeout(t));
|
|
156
177
|
} catch (err) {
|
|
178
|
+
spinnerTimeouts.forEach((t) => clearTimeout(t));
|
|
157
179
|
spinner.stop();
|
|
158
180
|
if (err instanceof Error && err.name === "AbortError") {
|
|
159
|
-
showError("network", "request timed out after
|
|
181
|
+
showError("network", "request timed out after 180s");
|
|
160
182
|
} else {
|
|
161
183
|
showError("network");
|
|
162
184
|
}
|
|
@@ -195,37 +217,109 @@ export async function init(args: string[] = []): Promise<void> {
|
|
|
195
217
|
showFindings(data.findings);
|
|
196
218
|
showFileList(data.files);
|
|
197
219
|
|
|
198
|
-
// ── 6.
|
|
220
|
+
// ── 6. Preview link ───────────────────────────────────────────────
|
|
221
|
+
if (data.previewId) {
|
|
222
|
+
const previewUrl = `${BASE_URL}/preview/${data.previewId}`;
|
|
223
|
+
const open = await promptPreview(` preview ready — ${previewUrl}\n\n [o] open in browser [enter] continue `);
|
|
224
|
+
if (open) {
|
|
225
|
+
exec(`open ${previewUrl}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// ── 7. Dry run exit ───────────────────────────────────────────────
|
|
199
230
|
if (flags.dryRun) {
|
|
200
231
|
showDryRunComplete();
|
|
201
232
|
return;
|
|
202
233
|
}
|
|
203
234
|
|
|
204
|
-
// ──
|
|
205
|
-
const
|
|
206
|
-
|
|
235
|
+
// ── 8. File selection ────────────────────────────────────────────
|
|
236
|
+
const fileChoice = await promptFileSelection(" [a] accept all [s] select files [n] don't change anything ");
|
|
237
|
+
|
|
238
|
+
if (fileChoice === "n") {
|
|
239
|
+
showCancelled();
|
|
207
240
|
process.exit(0);
|
|
208
241
|
}
|
|
209
242
|
|
|
210
|
-
|
|
243
|
+
let filesToWrite = data.files;
|
|
244
|
+
|
|
245
|
+
if (fileChoice === "a") {
|
|
246
|
+
const preserved = context.protectedPaths.length;
|
|
247
|
+
if (preserved > 0) {
|
|
248
|
+
console.log(`\n relay will write ${data.files.length} files.`);
|
|
249
|
+
console.log(` ${preserved} file${preserved === 1 ? " was" : "s were"} preserved (human-written).\n`);
|
|
250
|
+
} else {
|
|
251
|
+
console.log(`\n relay will write all ${data.files.length} files.\n`);
|
|
252
|
+
}
|
|
253
|
+
const acceptConfirm = await confirm(" confirm? (y/n) ");
|
|
254
|
+
if (!acceptConfirm) {
|
|
255
|
+
showCancelled();
|
|
256
|
+
process.exit(0);
|
|
257
|
+
}
|
|
258
|
+
} else if (fileChoice === "s") {
|
|
259
|
+
console.log("\n which files do you want? you can say things like:");
|
|
260
|
+
console.log(" 'all except CLAUDE.md'");
|
|
261
|
+
console.log(" 'only the cursor rules'");
|
|
262
|
+
console.log(" 'just core.mdc and worktrees'\n");
|
|
263
|
+
|
|
264
|
+
const instruction = await promptFilePath(" → ");
|
|
265
|
+
|
|
266
|
+
const selectUrl = `${BASE_URL}/api/cli/select`;
|
|
267
|
+
let selectedPaths: string[];
|
|
268
|
+
|
|
269
|
+
try {
|
|
270
|
+
const selectRes = await fetch(selectUrl, {
|
|
271
|
+
method: "POST",
|
|
272
|
+
headers: { "Content-Type": "application/json" },
|
|
273
|
+
body: JSON.stringify({
|
|
274
|
+
files: data.files.map((f) => f.path),
|
|
275
|
+
instruction,
|
|
276
|
+
}),
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
if (!selectRes.ok) {
|
|
280
|
+
showError("server", "file selection failed");
|
|
281
|
+
process.exit(1);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const selectData = (await selectRes.json()) as { selectedPaths: string[] };
|
|
285
|
+
selectedPaths = selectData.selectedPaths;
|
|
286
|
+
} catch {
|
|
287
|
+
showError("network");
|
|
288
|
+
process.exit(1);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
filesToWrite = data.files.filter((f) => selectedPaths.includes(f.path));
|
|
292
|
+
|
|
293
|
+
showSelectedFiles(data.files, selectedPaths);
|
|
294
|
+
console.log(` relay will write ${filesToWrite.length} of ${data.files.length} files.\n`);
|
|
295
|
+
|
|
296
|
+
const selectConfirm = await confirm(" confirm? (y/n) ");
|
|
297
|
+
if (!selectConfirm) {
|
|
298
|
+
showCancelled();
|
|
299
|
+
process.exit(0);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// ── 9. Re-check git before writing ────────────────────────────────
|
|
211
304
|
const gitNow = getGitState();
|
|
212
305
|
if (gitNow.isDirty && !git.isDirty) {
|
|
213
306
|
const proceed = await confirm(" working tree changed since scan — continue? (y/n) ");
|
|
214
307
|
if (!proceed) {
|
|
308
|
+
showCancelled();
|
|
215
309
|
process.exit(0);
|
|
216
310
|
}
|
|
217
311
|
}
|
|
218
312
|
|
|
219
|
-
// ──
|
|
313
|
+
// ── 10. Write + commit ────────────────────────────────────────────
|
|
220
314
|
console.log();
|
|
221
|
-
writeFiles(root,
|
|
315
|
+
writeFiles(root, filesToWrite);
|
|
222
316
|
console.log();
|
|
223
317
|
|
|
224
|
-
const committed = commitFiles(root,
|
|
318
|
+
const committed = commitFiles(root, filesToWrite);
|
|
225
319
|
if (!committed) {
|
|
226
320
|
console.log(" ⚠ files written but git commit failed\n");
|
|
227
321
|
}
|
|
228
322
|
|
|
229
|
-
// ──
|
|
323
|
+
// ── 11. Success ───────────────────────────────────────────────────
|
|
230
324
|
showSuccess();
|
|
231
325
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { showBanner, showCancelled } from "../ui/display.js";
|
|
4
|
+
import { confirm } from "../ui/prompt.js";
|
|
5
|
+
|
|
6
|
+
const amber = chalk.hex("#f5a623");
|
|
7
|
+
const dim = chalk.dim;
|
|
8
|
+
|
|
9
|
+
const COMMIT_GREP = "install runshift agent governance rules";
|
|
10
|
+
|
|
11
|
+
export async function remove(): Promise<void> {
|
|
12
|
+
showBanner();
|
|
13
|
+
|
|
14
|
+
// ── Find the most recent runshift commit ──────────────────────────
|
|
15
|
+
let logLine: string;
|
|
16
|
+
try {
|
|
17
|
+
logLine = execSync(
|
|
18
|
+
`git log --oneline --grep="${COMMIT_GREP}" -1 --format="%H %s %ad" --date=short`,
|
|
19
|
+
{ stdio: "pipe" },
|
|
20
|
+
)
|
|
21
|
+
.toString()
|
|
22
|
+
.trim();
|
|
23
|
+
} catch {
|
|
24
|
+
console.log(amber(" no runshift commit found in this repository.\n"));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (!logLine) {
|
|
29
|
+
console.log(amber(" no runshift commit found in this repository.\n"));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const spaceIdx = logLine.indexOf(" ");
|
|
34
|
+
const hash = logLine.slice(0, spaceIdx);
|
|
35
|
+
const rest = logLine.slice(spaceIdx + 1);
|
|
36
|
+
|
|
37
|
+
// Split rest into message and date (date is last 10 chars: YYYY-MM-DD)
|
|
38
|
+
const date = rest.slice(-10);
|
|
39
|
+
const message = rest.slice(0, -11).trim();
|
|
40
|
+
|
|
41
|
+
console.log(amber(" relay will revert commit:\n"));
|
|
42
|
+
console.log(dim(` ${hash.slice(0, 7)}`));
|
|
43
|
+
console.log(dim(` ${message}`));
|
|
44
|
+
console.log(dim(` ${date}\n`));
|
|
45
|
+
|
|
46
|
+
const proceed = await confirm(" revert this commit? (y/n) ");
|
|
47
|
+
if (!proceed) {
|
|
48
|
+
showCancelled();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
execSync(`git revert ${hash} --no-edit`, { stdio: "pipe" });
|
|
54
|
+
console.log(amber("\n ✓ reverted — runshift governance rules removed\n"));
|
|
55
|
+
} catch (err) {
|
|
56
|
+
console.log(amber("\n revert failed."));
|
|
57
|
+
console.log(dim(` ${err instanceof Error ? err.message : err}\n`));
|
|
58
|
+
}
|
|
59
|
+
}
|
package/src/context/collector.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
3
4
|
import type { RepoContext } from "../types.js";
|
|
4
5
|
import { getGitState } from "./git.js";
|
|
5
6
|
|
|
@@ -96,6 +97,45 @@ function getRootConfigs(root: string): string[] {
|
|
|
96
97
|
}
|
|
97
98
|
}
|
|
98
99
|
|
|
100
|
+
function getProtectedPaths(root: string, existingRules: Record<string, string>): string[] {
|
|
101
|
+
const protectedPaths: string[] = [];
|
|
102
|
+
|
|
103
|
+
for (const filePath of Object.keys(existingRules)) {
|
|
104
|
+
// CLAUDE.md is always protected regardless of git history
|
|
105
|
+
if (filePath === "CLAUDE.md") {
|
|
106
|
+
protectedPaths.push(filePath);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
const lastCommitMsg = execSync(
|
|
112
|
+
`git log --follow -1 --pretty=format:"%s" -- "${filePath}"`,
|
|
113
|
+
{ cwd: root, stdio: "pipe" },
|
|
114
|
+
).toString().trim();
|
|
115
|
+
|
|
116
|
+
if (!lastCommitMsg) {
|
|
117
|
+
// Not in git → human created → protect
|
|
118
|
+
protectedPaths.push(filePath);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const isRelay =
|
|
123
|
+
lastCommitMsg.includes("install runshift agent governance rules") ||
|
|
124
|
+
lastCommitMsg.includes("runshift update");
|
|
125
|
+
|
|
126
|
+
if (!isRelay) {
|
|
127
|
+
// Last commit was by a human → protect
|
|
128
|
+
protectedPaths.push(filePath);
|
|
129
|
+
}
|
|
130
|
+
} catch {
|
|
131
|
+
// git log failed → protect to be safe
|
|
132
|
+
protectedPaths.push(filePath);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return protectedPaths;
|
|
137
|
+
}
|
|
138
|
+
|
|
99
139
|
export function collectRepoContext(root: string): RepoContext {
|
|
100
140
|
// ── package.json ──
|
|
101
141
|
const pkgJson = readJsonSafe(path.join(root, "package.json"));
|
|
@@ -163,6 +203,9 @@ export function collectRepoContext(root: string): RepoContext {
|
|
|
163
203
|
existingRules["CLAUDE.md"] = claudeMd;
|
|
164
204
|
}
|
|
165
205
|
|
|
206
|
+
// ── Protected paths ──
|
|
207
|
+
const protectedPaths = getProtectedPaths(root, existingRules);
|
|
208
|
+
|
|
166
209
|
// ── Migrations ──
|
|
167
210
|
let migrationCount = 0;
|
|
168
211
|
let migrationNames: string[] = [];
|
|
@@ -192,6 +235,7 @@ export function collectRepoContext(root: string): RepoContext {
|
|
|
192
235
|
migrationCount,
|
|
193
236
|
migrationNames,
|
|
194
237
|
rootConfigs,
|
|
238
|
+
protectedPaths,
|
|
195
239
|
gitState,
|
|
196
240
|
};
|
|
197
241
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
import { init } from "./commands/init.js";
|
|
4
|
+
import { remove } from "./commands/remove.js";
|
|
4
5
|
|
|
5
6
|
const args = process.argv.slice(2);
|
|
6
7
|
const command = args[0] ?? "init";
|
|
@@ -12,6 +13,12 @@ switch (command) {
|
|
|
12
13
|
process.exit(1);
|
|
13
14
|
});
|
|
14
15
|
break;
|
|
16
|
+
case "remove":
|
|
17
|
+
remove().catch((err) => {
|
|
18
|
+
console.error(err.message ?? err);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
});
|
|
21
|
+
break;
|
|
15
22
|
case "--version":
|
|
16
23
|
case "-v":
|
|
17
24
|
console.log("runshift 0.0.3");
|
|
@@ -23,6 +30,7 @@ switch (command) {
|
|
|
23
30
|
|
|
24
31
|
Usage:
|
|
25
32
|
npx runshift init [options] Read your repo, generate governance rules
|
|
33
|
+
npx runshift remove Revert the runshift install commit
|
|
26
34
|
|
|
27
35
|
Options:
|
|
28
36
|
--version, -v Show version
|
package/src/types.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface RepoContext {
|
|
|
17
17
|
migrationCount: number;
|
|
18
18
|
migrationNames: string[];
|
|
19
19
|
rootConfigs: string[];
|
|
20
|
+
protectedPaths: string[];
|
|
20
21
|
gitState: {
|
|
21
22
|
branch: string;
|
|
22
23
|
isDirty: boolean;
|
|
@@ -41,4 +42,5 @@ export interface InitResponse {
|
|
|
41
42
|
files: GeneratedFile[];
|
|
42
43
|
findings: Findings;
|
|
43
44
|
summary: string;
|
|
45
|
+
previewId?: string;
|
|
44
46
|
}
|
package/src/ui/display.ts
CHANGED
|
@@ -63,13 +63,17 @@ export function showScanResults(context: RepoContext): void {
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
const existingRuleKeys = Object.keys(context.existingRules);
|
|
66
|
+
const protectedSet = new Set(context.protectedPaths);
|
|
66
67
|
const cursorRules = existingRuleKeys.filter((k) => k.startsWith(".cursor/rules/"));
|
|
67
68
|
if (cursorRules.length > 0) {
|
|
68
|
-
|
|
69
|
+
const protectedCount = cursorRules.filter((k) => protectedSet.has(k)).length;
|
|
70
|
+
const suffix = protectedCount > 0 ? ` (${protectedCount} protected)` : "";
|
|
71
|
+
detections.push(`.cursor/rules/ — ${cursorRules.length} existing file${cursorRules.length === 1 ? "" : "s"} detected${suffix}`);
|
|
69
72
|
}
|
|
70
73
|
|
|
71
74
|
if (existingRuleKeys.includes("CLAUDE.md")) {
|
|
72
|
-
|
|
75
|
+
const claudeProtected = protectedSet.has("CLAUDE.md") ? " (protected — human-written)" : "";
|
|
76
|
+
detections.push(`existing CLAUDE.md detected${claudeProtected}`);
|
|
73
77
|
}
|
|
74
78
|
|
|
75
79
|
if (context.tsconfig) {
|
|
@@ -121,6 +125,19 @@ export function showFileList(files: GeneratedFile[]): void {
|
|
|
121
125
|
console.log(dim("\n + = create, ~ = update existing file\n"));
|
|
122
126
|
}
|
|
123
127
|
|
|
128
|
+
export function showSelectedFiles(allFiles: GeneratedFile[], selectedPaths: string[]): void {
|
|
129
|
+
const selected = new Set(selectedPaths);
|
|
130
|
+
console.log(amber(" relay understood:\n"));
|
|
131
|
+
for (const file of allFiles) {
|
|
132
|
+
if (selected.has(file.path)) {
|
|
133
|
+
console.log(dim(" ✓ ") + file.path + dim(" (included)"));
|
|
134
|
+
} else {
|
|
135
|
+
console.log(dim(" ✗ ") + muted(file.path) + dim(" (excluded)"));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
console.log();
|
|
139
|
+
}
|
|
140
|
+
|
|
124
141
|
export function showWriting(filePath: string): void {
|
|
125
142
|
console.log(dim(" ✓ ") + filePath);
|
|
126
143
|
}
|
|
@@ -129,6 +146,16 @@ export function showCommit(): void {
|
|
|
129
146
|
console.log(dim(" ✓ ") + "committed");
|
|
130
147
|
}
|
|
131
148
|
|
|
149
|
+
export function showProtectedFiles(protectedPaths: string[]): void {
|
|
150
|
+
if (protectedPaths.length === 0) return;
|
|
151
|
+
console.log();
|
|
152
|
+
console.log(amber(" relay preserved your existing files:"));
|
|
153
|
+
for (const p of protectedPaths) {
|
|
154
|
+
console.log(dim(` ~ ${p} — human-written, not overwritten`));
|
|
155
|
+
}
|
|
156
|
+
console.log(dim(" run npx runshift update to review suggested changes.\n"));
|
|
157
|
+
}
|
|
158
|
+
|
|
132
159
|
export function showSummary(summary: string): void {
|
|
133
160
|
console.log(muted(` ${summary.replace(/\n/g, "\n ")}\n`));
|
|
134
161
|
}
|
|
@@ -162,6 +189,14 @@ export function showDryRunComplete(): void {
|
|
|
162
189
|
console.log(divider + "\n");
|
|
163
190
|
}
|
|
164
191
|
|
|
192
|
+
export function showCancelled(): void {
|
|
193
|
+
console.log();
|
|
194
|
+
console.log(amber(" no changes made."));
|
|
195
|
+
console.log(dim(" run npx runshift init when you're ready."));
|
|
196
|
+
console.log();
|
|
197
|
+
console.log(divider + "\n");
|
|
198
|
+
}
|
|
199
|
+
|
|
165
200
|
export function showError(type: "network" | "rate-limit" | "validation" | "server", message?: string): void {
|
|
166
201
|
console.log();
|
|
167
202
|
switch (type) {
|
package/src/ui/prompt.ts
CHANGED
|
@@ -31,3 +31,45 @@ export async function promptChoice(question: string): Promise<"y" | "a" | "n"> {
|
|
|
31
31
|
export async function promptFilePath(question: string): Promise<string> {
|
|
32
32
|
return ask(question);
|
|
33
33
|
}
|
|
34
|
+
|
|
35
|
+
export async function promptFileSelection(question: string): Promise<"a" | "s" | "n"> {
|
|
36
|
+
const answer = await ask(question);
|
|
37
|
+
const normalized = answer.toLowerCase();
|
|
38
|
+
if (normalized === "a" || normalized === "accept") return "a";
|
|
39
|
+
if (normalized === "s" || normalized === "select") return "s";
|
|
40
|
+
return "n";
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function promptPreview(message: string): Promise<boolean> {
|
|
44
|
+
return new Promise((resolve) => {
|
|
45
|
+
process.stdout.write(message);
|
|
46
|
+
|
|
47
|
+
const wasRaw = process.stdin.isRaw;
|
|
48
|
+
process.stdin.setRawMode(true);
|
|
49
|
+
process.stdin.resume();
|
|
50
|
+
|
|
51
|
+
const onData = (key: Buffer) => {
|
|
52
|
+
process.stdin.setRawMode(wasRaw ?? false);
|
|
53
|
+
process.stdin.pause();
|
|
54
|
+
process.stdin.removeListener("data", onData);
|
|
55
|
+
|
|
56
|
+
const ch = key.toString();
|
|
57
|
+
|
|
58
|
+
// ctrl-c
|
|
59
|
+
if (ch === "\x03") {
|
|
60
|
+
console.log();
|
|
61
|
+
process.exit(0);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (ch.toLowerCase() === "o") {
|
|
65
|
+
console.log("o\n");
|
|
66
|
+
resolve(true);
|
|
67
|
+
} else {
|
|
68
|
+
console.log("\n");
|
|
69
|
+
resolve(false);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
process.stdin.on("data", onData);
|
|
74
|
+
});
|
|
75
|
+
}
|