runshift 0.0.3 → 0.0.4
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 +3 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +63 -8
- package/dist/commands/init.js.map +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/ui/display.d.ts +2 -0
- package/dist/ui/display.d.ts.map +1 -1
- package/dist/ui/display.js +20 -2
- package/dist/ui/display.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/init.ts +75 -7
- package/src/index.ts +9 -5
- package/src/ui/display.ts +22 -2
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
"Bash(npm install:*)",
|
|
6
6
|
"Bash(npm run:*)",
|
|
7
7
|
"Read(//private/tmp/**)",
|
|
8
|
-
"Bash(node /Users/dc/runshift-cli/dist/index.js init)"
|
|
8
|
+
"Bash(node /Users/dc/runshift-cli/dist/index.js init)",
|
|
9
|
+
"Bash(node /Users/dc/runshift-cli/dist/index.js init --help)",
|
|
10
|
+
"Bash(node /Users/dc/runshift-cli/dist/index.js --help)"
|
|
9
11
|
]
|
|
10
12
|
}
|
|
11
13
|
}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function init(): Promise<void>;
|
|
1
|
+
export declare function init(args?: string[]): Promise<void>;
|
|
2
2
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -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":"AAiEA,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqK7D"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,14 +1,49 @@
|
|
|
1
1
|
import ora from "ora";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
2
3
|
import { collectRepoContext, addFileToContext } from "../context/collector.js";
|
|
3
4
|
import { getGitState } from "../context/git.js";
|
|
4
|
-
import { showBanner, showNotGitRepo, showDirtyWarning, showBranchInfo, showScanResults, showFindings, showFileList, showSummary, showSuccess, showError, } from "../ui/display.js";
|
|
5
|
+
import { showBanner, showNotGitRepo, showDirtyWarning, showBranchInfo, showScanResults, showDataPolicy, showFindings, showFileList, showSummary, showSuccess, showDryRunComplete, showError, } from "../ui/display.js";
|
|
5
6
|
import { confirm, promptChoice, promptFilePath } from "../ui/prompt.js";
|
|
6
7
|
import { writeFiles, commitFiles } from "../writer.js";
|
|
7
8
|
const API_URL = process.env.RUNSHIFT_DEV === "true"
|
|
8
9
|
? "http://localhost:3000/api/cli/init"
|
|
9
10
|
: "https://runshift.ai/api/cli/init";
|
|
10
11
|
const TIMEOUT_MS = 240_000;
|
|
11
|
-
|
|
12
|
+
function parseFlags(args) {
|
|
13
|
+
const flags = { dryRun: false, branch: null, help: false };
|
|
14
|
+
for (let i = 0; i < args.length; i++) {
|
|
15
|
+
const arg = args[i];
|
|
16
|
+
if (arg === "--dry-run") {
|
|
17
|
+
flags.dryRun = true;
|
|
18
|
+
}
|
|
19
|
+
else if (arg === "--branch") {
|
|
20
|
+
const next = args[i + 1];
|
|
21
|
+
flags.branch = next && !next.startsWith("--") ? next : "relay-init";
|
|
22
|
+
if (next && !next.startsWith("--"))
|
|
23
|
+
i++;
|
|
24
|
+
}
|
|
25
|
+
else if (arg === "--help") {
|
|
26
|
+
flags.help = true;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return flags;
|
|
30
|
+
}
|
|
31
|
+
function showInitHelp() {
|
|
32
|
+
console.log(`
|
|
33
|
+
npx runshift init [options]
|
|
34
|
+
|
|
35
|
+
options:
|
|
36
|
+
--dry-run preview changes without writing files
|
|
37
|
+
--branch <name> run on a new branch (default: relay-init)
|
|
38
|
+
--help show this help
|
|
39
|
+
`);
|
|
40
|
+
}
|
|
41
|
+
export async function init(args = []) {
|
|
42
|
+
const flags = parseFlags(args);
|
|
43
|
+
if (flags.help) {
|
|
44
|
+
showInitHelp();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
12
47
|
showBanner();
|
|
13
48
|
// ── 1. Git safety ─────────────────────────────────────────────────
|
|
14
49
|
const git = getGitState();
|
|
@@ -24,11 +59,25 @@ export async function init() {
|
|
|
24
59
|
process.exit(0);
|
|
25
60
|
}
|
|
26
61
|
}
|
|
62
|
+
// ── 1b. Branch flag — create and switch ───────────────────────────
|
|
63
|
+
if (flags.branch) {
|
|
64
|
+
try {
|
|
65
|
+
execSync(`git rev-parse --verify ${flags.branch}`, { stdio: "pipe" });
|
|
66
|
+
console.log(` branch ${flags.branch} already exists.\n`);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// branch doesn't exist — good
|
|
71
|
+
}
|
|
72
|
+
execSync(`git checkout -b ${flags.branch}`, { stdio: "pipe" });
|
|
73
|
+
console.log(` switched to new branch ${flags.branch}\n`);
|
|
74
|
+
}
|
|
27
75
|
// ── 2. Collect context ────────────────────────────────────────────
|
|
28
76
|
const root = process.cwd();
|
|
29
77
|
const context = collectRepoContext(root);
|
|
30
|
-
// ── 3. Show scan results + prompt
|
|
78
|
+
// ── 3. Show scan results + data policy + prompt ───────────────────
|
|
31
79
|
showScanResults(context);
|
|
80
|
+
showDataPolicy();
|
|
32
81
|
let choice = await promptChoice(" proceed? [y] add more files? [a] cancel? [n] ");
|
|
33
82
|
while (choice === "a") {
|
|
34
83
|
const filePath = await promptFilePath(" file path: ");
|
|
@@ -39,6 +88,7 @@ export async function init() {
|
|
|
39
88
|
}
|
|
40
89
|
}
|
|
41
90
|
showScanResults(context);
|
|
91
|
+
showDataPolicy();
|
|
42
92
|
choice = await promptChoice(" proceed? [y] add more files? [a] cancel? [n] ");
|
|
43
93
|
}
|
|
44
94
|
if (choice === "n") {
|
|
@@ -65,7 +115,7 @@ export async function init() {
|
|
|
65
115
|
catch (err) {
|
|
66
116
|
spinner.stop();
|
|
67
117
|
if (err instanceof Error && err.name === "AbortError") {
|
|
68
|
-
showError("network", "request timed out after
|
|
118
|
+
showError("network", "request timed out after 240s");
|
|
69
119
|
}
|
|
70
120
|
else {
|
|
71
121
|
showError("network");
|
|
@@ -102,12 +152,17 @@ export async function init() {
|
|
|
102
152
|
showSummary(data.summary);
|
|
103
153
|
showFindings(data.findings);
|
|
104
154
|
showFileList(data.files);
|
|
105
|
-
// ── 6.
|
|
155
|
+
// ── 6. Dry run exit ───────────────────────────────────────────────
|
|
156
|
+
if (flags.dryRun) {
|
|
157
|
+
showDryRunComplete();
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
// ── 7. Confirm write ──────────────────────────────────────────────
|
|
106
161
|
const writeConfirm = await confirm(" write these files? (y/n) ");
|
|
107
162
|
if (!writeConfirm) {
|
|
108
163
|
process.exit(0);
|
|
109
164
|
}
|
|
110
|
-
// ──
|
|
165
|
+
// ── 8. Re-check git before writing ────────────────────────────────
|
|
111
166
|
const gitNow = getGitState();
|
|
112
167
|
if (gitNow.isDirty && !git.isDirty) {
|
|
113
168
|
const proceed = await confirm(" working tree changed since scan — continue? (y/n) ");
|
|
@@ -115,7 +170,7 @@ export async function init() {
|
|
|
115
170
|
process.exit(0);
|
|
116
171
|
}
|
|
117
172
|
}
|
|
118
|
-
// ──
|
|
173
|
+
// ── 9. Write + commit ─────────────────────────────────────────────
|
|
119
174
|
console.log();
|
|
120
175
|
writeFiles(root, data.files);
|
|
121
176
|
console.log();
|
|
@@ -123,7 +178,7 @@ export async function init() {
|
|
|
123
178
|
if (!committed) {
|
|
124
179
|
console.log(" ⚠ files written but git commit failed\n");
|
|
125
180
|
}
|
|
126
|
-
// ──
|
|
181
|
+
// ── 10. Success ───────────────────────────────────────────────────
|
|
127
182
|
showSuccess();
|
|
128
183
|
}
|
|
129
184
|
//# 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,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGvD,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,MAAM;IACjC,CAAC,CAAC,oCAAoC;IACtC,CAAC,CAAC,kCAAkC,CAAC;AAEzC,MAAM,UAAU,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,14 +4,14 @@ const args = process.argv.slice(2);
|
|
|
4
4
|
const command = args[0] ?? "init";
|
|
5
5
|
switch (command) {
|
|
6
6
|
case "init":
|
|
7
|
-
init().catch((err) => {
|
|
7
|
+
init(args.slice(1)).catch((err) => {
|
|
8
8
|
console.error(err.message ?? err);
|
|
9
9
|
process.exit(1);
|
|
10
10
|
});
|
|
11
11
|
break;
|
|
12
12
|
case "--version":
|
|
13
13
|
case "-v":
|
|
14
|
-
console.log("runshift 0.0.
|
|
14
|
+
console.log("runshift 0.0.3");
|
|
15
15
|
break;
|
|
16
16
|
case "--help":
|
|
17
17
|
case "-h":
|
|
@@ -19,11 +19,15 @@ switch (command) {
|
|
|
19
19
|
runshift — the control plane for agents, wherever they run.
|
|
20
20
|
|
|
21
21
|
Usage:
|
|
22
|
-
npx runshift init
|
|
22
|
+
npx runshift init [options] Read your repo, generate governance rules
|
|
23
23
|
|
|
24
24
|
Options:
|
|
25
|
-
--version, -v
|
|
26
|
-
--help, -h
|
|
25
|
+
--version, -v Show version
|
|
26
|
+
--help, -h Show this help
|
|
27
|
+
|
|
28
|
+
Init options:
|
|
29
|
+
--dry-run Preview changes without writing files
|
|
30
|
+
--branch <name> Run on a new branch (default: relay-init)
|
|
27
31
|
`);
|
|
28
32
|
break;
|
|
29
33
|
default:
|
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;AAE1C,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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,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,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;;;;;;;;;;;;;CAaf,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/ui/display.d.ts
CHANGED
|
@@ -10,5 +10,7 @@ export declare function showWriting(filePath: string): void;
|
|
|
10
10
|
export declare function showCommit(): void;
|
|
11
11
|
export declare function showSummary(summary: string): void;
|
|
12
12
|
export declare function showSuccess(): void;
|
|
13
|
+
export declare function showDataPolicy(): void;
|
|
14
|
+
export declare function showDryRunComplete(): void;
|
|
13
15
|
export declare function showError(type: "network" | "rate-limit" | "validation" | "server", message?: string): void;
|
|
14
16
|
//# 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,
|
|
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,CAqD1D;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAsBrD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAQzD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC;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,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
|
@@ -10,8 +10,9 @@ export function showBanner() {
|
|
|
10
10
|
horizontalLayout: "default",
|
|
11
11
|
});
|
|
12
12
|
console.log(amber(banner));
|
|
13
|
-
console.log(muted(" v0.0.
|
|
14
|
-
console.log(muted(" the control plane for agents, wherever they run
|
|
13
|
+
console.log(muted(" v0.0.3"));
|
|
14
|
+
console.log(muted(" the control plane for agents, wherever they run."));
|
|
15
|
+
console.log(dim(" usage: npx runshift init [--dry-run] [--branch <name>]\n"));
|
|
15
16
|
console.log(divider + "\n");
|
|
16
17
|
}
|
|
17
18
|
export function showNotGitRepo() {
|
|
@@ -123,6 +124,23 @@ export function showSuccess() {
|
|
|
123
124
|
console.log(muted(" connect to the runshift control plane: ") + amber("runshift.ai"));
|
|
124
125
|
console.log("\n" + divider + "\n");
|
|
125
126
|
}
|
|
127
|
+
export function showDataPolicy() {
|
|
128
|
+
console.log(amber(" relay will send to runshift.ai:\n"));
|
|
129
|
+
console.log(dim(" ✓ package.json (dependencies and scripts only)"));
|
|
130
|
+
console.log(dim(" ✓ directory structure (top 2 levels, folder names only)"));
|
|
131
|
+
console.log(dim(" ✓ .env.example (key names only — values are never read)"));
|
|
132
|
+
console.log(dim(" ✓ existing CLAUDE.md (if present)"));
|
|
133
|
+
console.log(dim(" ✓ existing .cursor/rules/ (if present)"));
|
|
134
|
+
console.log(dim(" ✓ migration file names (no file contents)"));
|
|
135
|
+
console.log(dim("\n no source code is sent."));
|
|
136
|
+
console.log(dim(" no secret values are ever read.\n"));
|
|
137
|
+
}
|
|
138
|
+
export function showDryRunComplete() {
|
|
139
|
+
console.log("\n" + divider + "\n");
|
|
140
|
+
console.log(amber(" dry run complete — no files written."));
|
|
141
|
+
console.log(dim(" run npx runshift init to install.\n"));
|
|
142
|
+
console.log(divider + "\n");
|
|
143
|
+
}
|
|
126
144
|
export function showError(type, message) {
|
|
127
145
|
console.log();
|
|
128
146
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACnC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACnC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;AACtB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAE7C,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE;QACzC,IAAI,EAAE,UAAU;QAChB,gBAAgB,EAAE,SAAS;KAC5B,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/ui/display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACnC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACnC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;AACtB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAE7C,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE;QACzC,IAAI,EAAE,UAAU;QAChB,gBAAgB,EAAE,SAAS;KAC5B,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAoB;IAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAEzD,MAAM,IAAI,GAA2B;QACnC,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY;QACnC,GAAG,OAAO,CAAC,WAAW,CAAC,eAAe;KACvC,CAAC;IAEF,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,MAAM,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnF,IAAI,IAAI,CAAC,aAAa,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,aAAa,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,QAAQ,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;QAC7E,UAAU,CAAC,IAAI,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,OAAO,CAAC,MAAM,wBAAwB,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;IACnI,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,cAAc,kBAAkB,OAAO,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;IACrI,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACnF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,UAAU,CAAC,IAAI,CAAC,oBAAoB,WAAW,CAAC,MAAM,iBAAiB,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;IACzH,CAAC;IAED,IAAI,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3C,UAAU,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,UAAU,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IAC5D,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC,GAAG,WAAW,eAAe,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;IACrF,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAkB;IAC7C,MAAM,QAAQ,GAAyB;QACrC,CAAC,cAAc,EAAE,QAAQ,CAAC,WAAW,CAAC;QACtC,CAAC,eAAe,EAAE,QAAQ,CAAC,YAAY,CAAC;QACxC,CAAC,wBAAwB,EAAE,QAAQ,CAAC,oBAAoB,CAAC;QACzD,CAAC,4BAA4B,EAAE,QAAQ,CAAC,yBAAyB,CAAC;QAClE,CAAC,qBAAqB,EAAE,QAAQ,CAAC,kBAAkB,CAAC;KACrD,CAAC;IAEF,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC,WAAW;QAAE,OAAO;IAEzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;IAE/D,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAsB;IACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACjG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,2CAA2C,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAwD,EAAE,OAAgB;IAClG,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;YAC7D,MAAM;QACR,KAAK,YAAY;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC,CAAC;YAC1E,MAAM;QACR,KAAK,YAAY;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC,CAAC;YAC9D,IAAI,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;YAChD,MAAM;QACR,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC,CAAC;YACrF,IAAI,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;YAChD,MAAM;IACV,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
package/src/commands/init.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import ora from "ora";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
2
3
|
import { collectRepoContext, addFileToContext } from "../context/collector.js";
|
|
3
4
|
import { getGitState } from "../context/git.js";
|
|
4
5
|
import {
|
|
@@ -7,10 +8,12 @@ import {
|
|
|
7
8
|
showDirtyWarning,
|
|
8
9
|
showBranchInfo,
|
|
9
10
|
showScanResults,
|
|
11
|
+
showDataPolicy,
|
|
10
12
|
showFindings,
|
|
11
13
|
showFileList,
|
|
12
14
|
showSummary,
|
|
13
15
|
showSuccess,
|
|
16
|
+
showDryRunComplete,
|
|
14
17
|
showError,
|
|
15
18
|
} from "../ui/display.js";
|
|
16
19
|
import { confirm, promptChoice, promptFilePath } from "../ui/prompt.js";
|
|
@@ -24,7 +27,50 @@ const API_URL =
|
|
|
24
27
|
|
|
25
28
|
const TIMEOUT_MS = 240_000;
|
|
26
29
|
|
|
27
|
-
|
|
30
|
+
interface InitFlags {
|
|
31
|
+
dryRun: boolean;
|
|
32
|
+
branch: string | null;
|
|
33
|
+
help: boolean;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function parseFlags(args: string[]): InitFlags {
|
|
37
|
+
const flags: InitFlags = { dryRun: false, branch: null, help: false };
|
|
38
|
+
|
|
39
|
+
for (let i = 0; i < args.length; i++) {
|
|
40
|
+
const arg = args[i];
|
|
41
|
+
if (arg === "--dry-run") {
|
|
42
|
+
flags.dryRun = true;
|
|
43
|
+
} else if (arg === "--branch") {
|
|
44
|
+
const next = args[i + 1];
|
|
45
|
+
flags.branch = next && !next.startsWith("--") ? next : "relay-init";
|
|
46
|
+
if (next && !next.startsWith("--")) i++;
|
|
47
|
+
} else if (arg === "--help") {
|
|
48
|
+
flags.help = true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return flags;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function showInitHelp(): void {
|
|
56
|
+
console.log(`
|
|
57
|
+
npx runshift init [options]
|
|
58
|
+
|
|
59
|
+
options:
|
|
60
|
+
--dry-run preview changes without writing files
|
|
61
|
+
--branch <name> run on a new branch (default: relay-init)
|
|
62
|
+
--help show this help
|
|
63
|
+
`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function init(args: string[] = []): Promise<void> {
|
|
67
|
+
const flags = parseFlags(args);
|
|
68
|
+
|
|
69
|
+
if (flags.help) {
|
|
70
|
+
showInitHelp();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
28
74
|
showBanner();
|
|
29
75
|
|
|
30
76
|
// ── 1. Git safety ─────────────────────────────────────────────────
|
|
@@ -45,12 +91,27 @@ export async function init(): Promise<void> {
|
|
|
45
91
|
}
|
|
46
92
|
}
|
|
47
93
|
|
|
94
|
+
// ── 1b. Branch flag — create and switch ───────────────────────────
|
|
95
|
+
if (flags.branch) {
|
|
96
|
+
try {
|
|
97
|
+
execSync(`git rev-parse --verify ${flags.branch}`, { stdio: "pipe" });
|
|
98
|
+
console.log(` branch ${flags.branch} already exists.\n`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
} catch {
|
|
101
|
+
// branch doesn't exist — good
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
execSync(`git checkout -b ${flags.branch}`, { stdio: "pipe" });
|
|
105
|
+
console.log(` switched to new branch ${flags.branch}\n`);
|
|
106
|
+
}
|
|
107
|
+
|
|
48
108
|
// ── 2. Collect context ────────────────────────────────────────────
|
|
49
109
|
const root = process.cwd();
|
|
50
110
|
const context = collectRepoContext(root);
|
|
51
111
|
|
|
52
|
-
// ── 3. Show scan results + prompt
|
|
112
|
+
// ── 3. Show scan results + data policy + prompt ───────────────────
|
|
53
113
|
showScanResults(context);
|
|
114
|
+
showDataPolicy();
|
|
54
115
|
|
|
55
116
|
let choice = await promptChoice(" proceed? [y] add more files? [a] cancel? [n] ");
|
|
56
117
|
|
|
@@ -63,6 +124,7 @@ export async function init(): Promise<void> {
|
|
|
63
124
|
}
|
|
64
125
|
}
|
|
65
126
|
showScanResults(context);
|
|
127
|
+
showDataPolicy();
|
|
66
128
|
choice = await promptChoice(" proceed? [y] add more files? [a] cancel? [n] ");
|
|
67
129
|
}
|
|
68
130
|
|
|
@@ -94,7 +156,7 @@ export async function init(): Promise<void> {
|
|
|
94
156
|
} catch (err) {
|
|
95
157
|
spinner.stop();
|
|
96
158
|
if (err instanceof Error && err.name === "AbortError") {
|
|
97
|
-
showError("network", "request timed out after
|
|
159
|
+
showError("network", "request timed out after 240s");
|
|
98
160
|
} else {
|
|
99
161
|
showError("network");
|
|
100
162
|
}
|
|
@@ -133,13 +195,19 @@ export async function init(): Promise<void> {
|
|
|
133
195
|
showFindings(data.findings);
|
|
134
196
|
showFileList(data.files);
|
|
135
197
|
|
|
136
|
-
// ── 6.
|
|
198
|
+
// ── 6. Dry run exit ───────────────────────────────────────────────
|
|
199
|
+
if (flags.dryRun) {
|
|
200
|
+
showDryRunComplete();
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ── 7. Confirm write ──────────────────────────────────────────────
|
|
137
205
|
const writeConfirm = await confirm(" write these files? (y/n) ");
|
|
138
206
|
if (!writeConfirm) {
|
|
139
207
|
process.exit(0);
|
|
140
208
|
}
|
|
141
209
|
|
|
142
|
-
// ──
|
|
210
|
+
// ── 8. Re-check git before writing ────────────────────────────────
|
|
143
211
|
const gitNow = getGitState();
|
|
144
212
|
if (gitNow.isDirty && !git.isDirty) {
|
|
145
213
|
const proceed = await confirm(" working tree changed since scan — continue? (y/n) ");
|
|
@@ -148,7 +216,7 @@ export async function init(): Promise<void> {
|
|
|
148
216
|
}
|
|
149
217
|
}
|
|
150
218
|
|
|
151
|
-
// ──
|
|
219
|
+
// ── 9. Write + commit ─────────────────────────────────────────────
|
|
152
220
|
console.log();
|
|
153
221
|
writeFiles(root, data.files);
|
|
154
222
|
console.log();
|
|
@@ -158,6 +226,6 @@ export async function init(): Promise<void> {
|
|
|
158
226
|
console.log(" ⚠ files written but git commit failed\n");
|
|
159
227
|
}
|
|
160
228
|
|
|
161
|
-
// ──
|
|
229
|
+
// ── 10. Success ───────────────────────────────────────────────────
|
|
162
230
|
showSuccess();
|
|
163
231
|
}
|
package/src/index.ts
CHANGED
|
@@ -7,14 +7,14 @@ const command = args[0] ?? "init";
|
|
|
7
7
|
|
|
8
8
|
switch (command) {
|
|
9
9
|
case "init":
|
|
10
|
-
init().catch((err) => {
|
|
10
|
+
init(args.slice(1)).catch((err) => {
|
|
11
11
|
console.error(err.message ?? err);
|
|
12
12
|
process.exit(1);
|
|
13
13
|
});
|
|
14
14
|
break;
|
|
15
15
|
case "--version":
|
|
16
16
|
case "-v":
|
|
17
|
-
console.log("runshift 0.0.
|
|
17
|
+
console.log("runshift 0.0.3");
|
|
18
18
|
break;
|
|
19
19
|
case "--help":
|
|
20
20
|
case "-h":
|
|
@@ -22,11 +22,15 @@ switch (command) {
|
|
|
22
22
|
runshift — the control plane for agents, wherever they run.
|
|
23
23
|
|
|
24
24
|
Usage:
|
|
25
|
-
npx runshift init
|
|
25
|
+
npx runshift init [options] Read your repo, generate governance rules
|
|
26
26
|
|
|
27
27
|
Options:
|
|
28
|
-
--version, -v
|
|
29
|
-
--help, -h
|
|
28
|
+
--version, -v Show version
|
|
29
|
+
--help, -h Show this help
|
|
30
|
+
|
|
31
|
+
Init options:
|
|
32
|
+
--dry-run Preview changes without writing files
|
|
33
|
+
--branch <name> Run on a new branch (default: relay-init)
|
|
30
34
|
`);
|
|
31
35
|
break;
|
|
32
36
|
default:
|
package/src/ui/display.ts
CHANGED
|
@@ -13,8 +13,9 @@ export function showBanner(): void {
|
|
|
13
13
|
horizontalLayout: "default",
|
|
14
14
|
});
|
|
15
15
|
console.log(amber(banner));
|
|
16
|
-
console.log(muted(" v0.0.
|
|
17
|
-
console.log(muted(" the control plane for agents, wherever they run
|
|
16
|
+
console.log(muted(" v0.0.3"));
|
|
17
|
+
console.log(muted(" the control plane for agents, wherever they run."));
|
|
18
|
+
console.log(dim(" usage: npx runshift init [--dry-run] [--branch <name>]\n"));
|
|
18
19
|
console.log(divider + "\n");
|
|
19
20
|
}
|
|
20
21
|
|
|
@@ -142,6 +143,25 @@ export function showSuccess(): void {
|
|
|
142
143
|
console.log("\n" + divider + "\n");
|
|
143
144
|
}
|
|
144
145
|
|
|
146
|
+
export function showDataPolicy(): void {
|
|
147
|
+
console.log(amber(" relay will send to runshift.ai:\n"));
|
|
148
|
+
console.log(dim(" ✓ package.json (dependencies and scripts only)"));
|
|
149
|
+
console.log(dim(" ✓ directory structure (top 2 levels, folder names only)"));
|
|
150
|
+
console.log(dim(" ✓ .env.example (key names only — values are never read)"));
|
|
151
|
+
console.log(dim(" ✓ existing CLAUDE.md (if present)"));
|
|
152
|
+
console.log(dim(" ✓ existing .cursor/rules/ (if present)"));
|
|
153
|
+
console.log(dim(" ✓ migration file names (no file contents)"));
|
|
154
|
+
console.log(dim("\n no source code is sent."));
|
|
155
|
+
console.log(dim(" no secret values are ever read.\n"));
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export function showDryRunComplete(): void {
|
|
159
|
+
console.log("\n" + divider + "\n");
|
|
160
|
+
console.log(amber(" dry run complete — no files written."));
|
|
161
|
+
console.log(dim(" run npx runshift init to install.\n"));
|
|
162
|
+
console.log(divider + "\n");
|
|
163
|
+
}
|
|
164
|
+
|
|
145
165
|
export function showError(type: "network" | "rate-limit" | "validation" | "server", message?: string): void {
|
|
146
166
|
console.log();
|
|
147
167
|
switch (type) {
|