runshift 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/dist/commands/init.d.ts +2 -0
  3. package/dist/commands/init.d.ts.map +1 -0
  4. package/dist/commands/init.js +129 -0
  5. package/dist/commands/init.js.map +1 -0
  6. package/dist/context/collector.d.ts +4 -0
  7. package/dist/context/collector.d.ts.map +1 -0
  8. package/dist/context/collector.js +191 -0
  9. package/dist/context/collector.js.map +1 -0
  10. package/dist/context/git.d.ts +7 -0
  11. package/dist/context/git.d.ts.map +1 -0
  12. package/dist/context/git.js +30 -0
  13. package/dist/context/git.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +33 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/types.d.ts +42 -0
  19. package/dist/types.d.ts.map +1 -0
  20. package/dist/types.js +3 -0
  21. package/dist/types.js.map +1 -0
  22. package/dist/ui/display.d.ts +14 -0
  23. package/dist/ui/display.d.ts.map +1 -0
  24. package/dist/ui/display.js +148 -0
  25. package/dist/ui/display.js.map +1 -0
  26. package/dist/ui/prompt.d.ts +4 -0
  27. package/dist/ui/prompt.d.ts.map +1 -0
  28. package/dist/ui/prompt.js +31 -0
  29. package/dist/ui/prompt.js.map +1 -0
  30. package/dist/writer.d.ts +4 -0
  31. package/dist/writer.d.ts.map +1 -0
  32. package/dist/writer.js +29 -0
  33. package/dist/writer.js.map +1 -0
  34. package/package.json +22 -4
  35. package/src/commands/init.ts +163 -0
  36. package/src/context/collector.ts +205 -0
  37. package/src/context/git.ts +36 -0
  38. package/src/index.ts +35 -0
  39. package/src/types.ts +44 -0
  40. package/src/ui/display.ts +164 -0
  41. package/src/ui/prompt.ts +33 -0
  42. package/src/writer.ts +37 -0
  43. package/tsconfig.json +19 -0
  44. package/index.js +0 -2
@@ -0,0 +1,11 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(find /Users/dc/runshift-cli -type f -name *.md)",
5
+ "Bash(npm install:*)",
6
+ "Bash(npm run:*)",
7
+ "Read(//private/tmp/**)",
8
+ "Bash(node /Users/dc/runshift-cli/dist/index.js init)"
9
+ ]
10
+ }
11
+ }
@@ -0,0 +1,2 @@
1
+ export declare function init(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA0BA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAwI1C"}
@@ -0,0 +1,129 @@
1
+ import ora from "ora";
2
+ import { collectRepoContext, addFileToContext } from "../context/collector.js";
3
+ import { getGitState } from "../context/git.js";
4
+ import { showBanner, showNotGitRepo, showDirtyWarning, showBranchInfo, showScanResults, showFindings, showFileList, showSummary, showSuccess, showError, } from "../ui/display.js";
5
+ import { confirm, promptChoice, promptFilePath } from "../ui/prompt.js";
6
+ import { writeFiles, commitFiles } from "../writer.js";
7
+ const API_URL = process.env.RUNSHIFT_DEV === "true"
8
+ ? "http://localhost:3000/api/cli/init"
9
+ : "https://runshift.ai/api/cli/init";
10
+ const TIMEOUT_MS = 240_000;
11
+ export async function init() {
12
+ showBanner();
13
+ // ── 1. Git safety ─────────────────────────────────────────────────
14
+ const git = getGitState();
15
+ if (!git.isGitRepo) {
16
+ showNotGitRepo();
17
+ process.exit(0);
18
+ }
19
+ showBranchInfo(git.branch);
20
+ if (git.isDirty) {
21
+ showDirtyWarning();
22
+ const proceed = await confirm(" continue with uncommitted changes? (y/n) ");
23
+ if (!proceed) {
24
+ process.exit(0);
25
+ }
26
+ }
27
+ // ── 2. Collect context ────────────────────────────────────────────
28
+ const root = process.cwd();
29
+ const context = collectRepoContext(root);
30
+ // ── 3. Show scan results + prompt ─────────────────────────────────
31
+ showScanResults(context);
32
+ let choice = await promptChoice(" proceed? [y] add more files? [a] cancel? [n] ");
33
+ while (choice === "a") {
34
+ const filePath = await promptFilePath(" file path: ");
35
+ if (filePath) {
36
+ const added = addFileToContext(root, filePath, context);
37
+ if (!added) {
38
+ console.log(` could not read ${filePath}\n`);
39
+ }
40
+ }
41
+ showScanResults(context);
42
+ choice = await promptChoice(" proceed? [y] add more files? [a] cancel? [n] ");
43
+ }
44
+ if (choice === "n") {
45
+ process.exit(0);
46
+ }
47
+ // ── 4. Call API ───────────────────────────────────────────────────
48
+ const spinner = ora({
49
+ text: "relay is reading your repository...",
50
+ color: "yellow",
51
+ }).start();
52
+ console.log("calling:", API_URL);
53
+ let response;
54
+ try {
55
+ const controller = new AbortController();
56
+ const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS);
57
+ response = await fetch(API_URL, {
58
+ method: "POST",
59
+ headers: { "Content-Type": "application/json" },
60
+ body: JSON.stringify(context),
61
+ signal: controller.signal,
62
+ });
63
+ clearTimeout(timeout);
64
+ }
65
+ catch (err) {
66
+ spinner.stop();
67
+ if (err instanceof Error && err.name === "AbortError") {
68
+ showError("network", "request timed out after 120s");
69
+ }
70
+ else {
71
+ showError("network");
72
+ }
73
+ process.exit(1);
74
+ }
75
+ if (!response.ok) {
76
+ spinner.stop();
77
+ const body = (await response.json().catch(() => ({})));
78
+ const msg = (body.message ?? body.error);
79
+ if (response.status === 429) {
80
+ showError("rate-limit");
81
+ }
82
+ else if (response.status === 400) {
83
+ showError("validation", msg);
84
+ }
85
+ else {
86
+ showError("server", msg);
87
+ }
88
+ process.exit(1);
89
+ }
90
+ let data;
91
+ try {
92
+ data = (await response.json());
93
+ }
94
+ catch {
95
+ spinner.stop();
96
+ showError("server", "invalid response from relay");
97
+ process.exit(1);
98
+ }
99
+ spinner.stop();
100
+ console.log();
101
+ // ── 5. Show findings + file list ──────────────────────────────────
102
+ showSummary(data.summary);
103
+ showFindings(data.findings);
104
+ showFileList(data.files);
105
+ // ── 6. Confirm write ──────────────────────────────────────────────
106
+ const writeConfirm = await confirm(" write these files? (y/n) ");
107
+ if (!writeConfirm) {
108
+ process.exit(0);
109
+ }
110
+ // ── 7. Re-check git before writing ────────────────────────────────
111
+ const gitNow = getGitState();
112
+ if (gitNow.isDirty && !git.isDirty) {
113
+ const proceed = await confirm(" working tree changed since scan — continue? (y/n) ");
114
+ if (!proceed) {
115
+ process.exit(0);
116
+ }
117
+ }
118
+ // ── 8. Write + commit ─────────────────────────────────────────────
119
+ console.log();
120
+ writeFiles(root, data.files);
121
+ console.log();
122
+ const committed = commitFiles(root, data.files);
123
+ if (!committed) {
124
+ console.log(" ⚠ files written but git commit failed\n");
125
+ }
126
+ // ── 9. Success ────────────────────────────────────────────────────
127
+ showSuccess();
128
+ }
129
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { RepoContext } from "../types.js";
2
+ export declare function collectRepoContext(root: string): RepoContext;
3
+ export declare function addFileToContext(root: string, filePath: string, context: RepoContext): boolean;
4
+ //# sourceMappingURL=collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/context/collector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgG/C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAkG5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAM9F"}
@@ -0,0 +1,191 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { getGitState } from "./git.js";
4
+ const IGNORE_DIRS = new Set([
5
+ "node_modules", ".git", "dist", ".next", ".vercel", ".turbo",
6
+ "__pycache__", ".cache", "coverage", ".nyc_output", "build",
7
+ ]);
8
+ const CONFIG_PATTERNS = [
9
+ "next.config.ts", "next.config.js", "next.config.mjs",
10
+ "tailwind.config.ts", "tailwind.config.js",
11
+ "supabase/config.toml",
12
+ "vercel.json",
13
+ "prisma/schema.prisma",
14
+ "drizzle.config.ts",
15
+ ".eslintrc.json", ".eslintrc.js", "eslint.config.js", "eslint.config.mjs",
16
+ ".prettierrc", ".prettierrc.json",
17
+ "jest.config.ts", "jest.config.js",
18
+ "vitest.config.ts", "vitest.config.js",
19
+ "playwright.config.ts",
20
+ ];
21
+ function readJsonSafe(filePath) {
22
+ try {
23
+ const raw = fs.readFileSync(filePath, "utf-8");
24
+ return JSON.parse(raw);
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ function readFileSafe(filePath) {
31
+ try {
32
+ return fs.readFileSync(filePath, "utf-8");
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ function getDirectoryTree(root, maxDepth = 2) {
39
+ const entries = [];
40
+ function walk(dir, depth, prefix) {
41
+ if (depth > maxDepth)
42
+ return;
43
+ let items;
44
+ try {
45
+ items = fs.readdirSync(dir, { withFileTypes: true });
46
+ }
47
+ catch {
48
+ return;
49
+ }
50
+ for (const item of items) {
51
+ if (IGNORE_DIRS.has(item.name))
52
+ continue;
53
+ if (item.name.startsWith(".") && depth === 0 && item.isDirectory())
54
+ continue;
55
+ const relative = prefix ? `${prefix}/${item.name}` : item.name;
56
+ if (item.isDirectory()) {
57
+ entries.push(`${relative}/`);
58
+ walk(path.join(dir, item.name), depth + 1, relative);
59
+ }
60
+ else if (depth <= 1) {
61
+ entries.push(relative);
62
+ }
63
+ }
64
+ }
65
+ walk(root, 0, "");
66
+ return entries;
67
+ }
68
+ function getRootConfigs(root) {
69
+ const configPatterns = [
70
+ /^\..*rc$/,
71
+ /^\..*rc\.json$/,
72
+ /^\..*rc\.js$/,
73
+ /^\..*rc\.yml$/,
74
+ /^\..*rc\.yaml$/,
75
+ /\.config\.(ts|js|mjs|cjs)$/,
76
+ /^tsconfig.*\.json$/,
77
+ /^docker-compose.*\.ya?ml$/,
78
+ /^Dockerfile/,
79
+ /^Makefile$/,
80
+ /^\.env\.example$/,
81
+ ];
82
+ try {
83
+ const items = fs.readdirSync(root);
84
+ return items.filter((item) => {
85
+ return configPatterns.some((p) => p.test(item));
86
+ });
87
+ }
88
+ catch {
89
+ return [];
90
+ }
91
+ }
92
+ export function collectRepoContext(root) {
93
+ // ── package.json ──
94
+ const pkgJson = readJsonSafe(path.join(root, "package.json"));
95
+ const packageJson = pkgJson
96
+ ? {
97
+ name: pkgJson.name,
98
+ description: pkgJson.description,
99
+ dependencies: (pkgJson.dependencies ?? {}),
100
+ devDependencies: (pkgJson.devDependencies ?? {}),
101
+ scripts: (pkgJson.scripts ?? {}),
102
+ workspaces: pkgJson.workspaces,
103
+ }
104
+ : { dependencies: {}, devDependencies: {}, scripts: {} };
105
+ // ── tsconfig.json ──
106
+ const tsconfig = readJsonSafe(path.join(root, "tsconfig.json"));
107
+ // ── Directory tree ──
108
+ const directoryTree = getDirectoryTree(root);
109
+ // ── .env.example — key names only ──
110
+ const envKeys = [];
111
+ const envContent = readFileSafe(path.join(root, ".env.example"));
112
+ if (envContent) {
113
+ for (const line of envContent.split("\n")) {
114
+ const trimmed = line.trim();
115
+ if (trimmed && !trimmed.startsWith("#")) {
116
+ const key = trimmed.split("=")[0].trim();
117
+ if (key)
118
+ envKeys.push(key);
119
+ }
120
+ }
121
+ }
122
+ // ── Config files ──
123
+ const configFiles = {};
124
+ for (const pattern of CONFIG_PATTERNS) {
125
+ const fullPath = path.join(root, pattern);
126
+ const content = readFileSafe(fullPath);
127
+ if (content) {
128
+ // Cap config file content at 5000 chars
129
+ configFiles[pattern] = content.slice(0, 5000);
130
+ }
131
+ }
132
+ // ── Existing rules ──
133
+ const existingRules = {};
134
+ // .cursor/rules/
135
+ const cursorRulesDir = path.join(root, ".cursor", "rules");
136
+ try {
137
+ const ruleFiles = fs.readdirSync(cursorRulesDir);
138
+ for (const file of ruleFiles) {
139
+ const content = readFileSafe(path.join(cursorRulesDir, file));
140
+ if (content) {
141
+ existingRules[`.cursor/rules/${file}`] = content;
142
+ }
143
+ }
144
+ }
145
+ catch {
146
+ // no existing rules
147
+ }
148
+ // CLAUDE.md
149
+ const claudeMd = readFileSafe(path.join(root, "CLAUDE.md"));
150
+ if (claudeMd) {
151
+ existingRules["CLAUDE.md"] = claudeMd;
152
+ }
153
+ // ── Migrations ──
154
+ let migrationCount = 0;
155
+ let migrationNames = [];
156
+ const migrationsDir = path.join(root, "supabase", "migrations");
157
+ try {
158
+ const migFiles = fs.readdirSync(migrationsDir).filter((f) => f.endsWith(".sql"));
159
+ migrationCount = migFiles.length;
160
+ migrationNames = migFiles;
161
+ }
162
+ catch {
163
+ // no migrations
164
+ }
165
+ // ── Root configs ──
166
+ const rootConfigs = getRootConfigs(root);
167
+ // ── Git state ──
168
+ const git = getGitState();
169
+ const gitState = git.isGitRepo ? { branch: git.branch, isDirty: git.isDirty } : null;
170
+ return {
171
+ packageJson,
172
+ tsconfig,
173
+ directoryTree,
174
+ envKeys,
175
+ configFiles,
176
+ existingRules,
177
+ migrationCount,
178
+ migrationNames,
179
+ rootConfigs,
180
+ gitState,
181
+ };
182
+ }
183
+ export function addFileToContext(root, filePath, context) {
184
+ const fullPath = path.resolve(root, filePath);
185
+ const content = readFileSafe(fullPath);
186
+ if (!content)
187
+ return false;
188
+ context.configFiles[filePath] = content.slice(0, 5000);
189
+ return true;
190
+ }
191
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/context/collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface GitState {
2
+ isGitRepo: boolean;
3
+ branch: string;
4
+ isDirty: boolean;
5
+ }
6
+ export declare function getGitState(): GitState;
7
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/context/git.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,WAAW,IAAI,QAAQ,CA2BtC"}
@@ -0,0 +1,30 @@
1
+ import { execSync } from "node:child_process";
2
+ export function getGitState() {
3
+ try {
4
+ execSync("git rev-parse --is-inside-work-tree", { stdio: "pipe" });
5
+ }
6
+ catch {
7
+ return { isGitRepo: false, branch: "", isDirty: false };
8
+ }
9
+ let branch = "";
10
+ try {
11
+ branch = execSync("git branch --show-current", { stdio: "pipe" })
12
+ .toString()
13
+ .trim();
14
+ }
15
+ catch {
16
+ branch = "unknown";
17
+ }
18
+ let isDirty = false;
19
+ try {
20
+ const status = execSync("git status --porcelain", { stdio: "pipe" })
21
+ .toString()
22
+ .trim();
23
+ isDirty = status.length > 0;
24
+ }
25
+ catch {
26
+ isDirty = false;
27
+ }
28
+ return { isGitRepo: true, branch, isDirty };
29
+ }
30
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/context/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAQ9C,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,QAAQ,CAAC,qCAAqC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC1D,CAAC;IAED,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,QAAQ,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;aAC9D,QAAQ,EAAE;aACV,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;aACjE,QAAQ,EAAE;aACV,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ import { init } from "./commands/init.js";
3
+ const args = process.argv.slice(2);
4
+ const command = args[0] ?? "init";
5
+ switch (command) {
6
+ case "init":
7
+ init().catch((err) => {
8
+ console.error(err.message ?? err);
9
+ process.exit(1);
10
+ });
11
+ break;
12
+ case "--version":
13
+ case "-v":
14
+ console.log("runshift 0.0.2");
15
+ break;
16
+ case "--help":
17
+ case "-h":
18
+ console.log(`
19
+ runshift — the control plane for agents, wherever they run.
20
+
21
+ Usage:
22
+ npx runshift init Read your repo, generate governance rules
23
+
24
+ Options:
25
+ --version, -v Show version
26
+ --help, -h Show this help
27
+ `);
28
+ break;
29
+ default:
30
+ console.error(`Unknown command: ${command}\nRun "runshift --help" for usage.`);
31
+ process.exit(1);
32
+ }
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACnB,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;;;;;;;;;CASf,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"}
@@ -0,0 +1,42 @@
1
+ export interface RepoContext {
2
+ packageJson: {
3
+ name?: string;
4
+ description?: string;
5
+ dependencies?: Record<string, string>;
6
+ devDependencies?: Record<string, string>;
7
+ scripts?: Record<string, string>;
8
+ workspaces?: string[] | {
9
+ packages: string[];
10
+ };
11
+ };
12
+ tsconfig: Record<string, unknown> | null;
13
+ directoryTree: string[];
14
+ envKeys: string[];
15
+ configFiles: Record<string, string>;
16
+ existingRules: Record<string, string>;
17
+ migrationCount: number;
18
+ migrationNames: string[];
19
+ rootConfigs: string[];
20
+ gitState: {
21
+ branch: string;
22
+ isDirty: boolean;
23
+ } | null;
24
+ }
25
+ export interface GeneratedFile {
26
+ path: string;
27
+ content: string;
28
+ action: "create" | "update";
29
+ }
30
+ export interface Findings {
31
+ blastRadius: string[];
32
+ securityGaps: string[];
33
+ agentFailurePatterns: string[];
34
+ parallelizationBoundaries: string[];
35
+ deprecatedPatterns: string[];
36
+ }
37
+ export interface InitResponse {
38
+ files: GeneratedFile[];
39
+ findings: Findings;
40
+ summary: string;
41
+ }
42
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +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;CACjB"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // ── Shared types mirroring the API contract ──
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,gDAAgD"}
@@ -0,0 +1,14 @@
1
+ import type { Findings, GeneratedFile, RepoContext } from "../types.js";
2
+ export declare function showBanner(): void;
3
+ export declare function showNotGitRepo(): void;
4
+ export declare function showDirtyWarning(): void;
5
+ export declare function showBranchInfo(branch: string): void;
6
+ export declare function showScanResults(context: RepoContext): void;
7
+ export declare function showFindings(findings: Findings): void;
8
+ export declare function showFileList(files: GeneratedFile[]): void;
9
+ export declare function showWriting(filePath: string): void;
10
+ export declare function showCommit(): void;
11
+ export declare function showSummary(summary: string): void;
12
+ export declare function showSuccess(): void;
13
+ export declare function showError(type: "network" | "rate-limit" | "validation" | "server", message?: string): void;
14
+ //# sourceMappingURL=display.d.ts.map
@@ -0,0 +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,CASjC;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,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAmB1G"}