feat: initial project setup with gai tool
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
import * as readline from "node:readline";
|
||||
import type { FileEntry } from "./types";
|
||||
import { BOLD, GREEN, YELLOW, CYAN, RESET } from "./terminal";
|
||||
|
||||
export async function selectFiles(
|
||||
stagedFiles: FileEntry[],
|
||||
unstagedFiles: FileEntry[],
|
||||
): Promise<string[]> {
|
||||
if (unstagedFiles.length === 0) return [];
|
||||
|
||||
if (stagedFiles.length > 0) {
|
||||
console.log(`\n ${BOLD}Staged files (will be included):${RESET}`);
|
||||
for (const f of stagedFiles) {
|
||||
console.log(` ${GREEN}✓${RESET} ${f.path} (${YELLOW}${f.label}${RESET})`);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\n ${BOLD}Unstaged files:${RESET}`);
|
||||
for (let i = 0; i < unstagedFiles.length; i++) {
|
||||
const f = unstagedFiles[i]!;
|
||||
console.log(
|
||||
` ${CYAN}${i + 1}.${RESET} ${f.path} (${YELLOW}${f.label}${RESET})`,
|
||||
);
|
||||
}
|
||||
|
||||
console.log("");
|
||||
const rl = readline.createInterface({
|
||||
input: process.stdin,
|
||||
output: process.stdout,
|
||||
});
|
||||
|
||||
return new Promise((resolve) => {
|
||||
rl.question(
|
||||
" Enter files to stage (e.g. 1,3) or 'a' for all: ",
|
||||
(answer) => {
|
||||
rl.close();
|
||||
const trimmed = answer.trim().toLowerCase();
|
||||
|
||||
if (trimmed === "a" || trimmed === "all") {
|
||||
resolve(unstagedFiles.map((f) => f.path));
|
||||
return;
|
||||
}
|
||||
|
||||
if (trimmed === "") {
|
||||
resolve([]);
|
||||
return;
|
||||
}
|
||||
|
||||
const indices = trimmed
|
||||
.split(/[,\s]+/)
|
||||
.map((s) => parseInt(s.trim()))
|
||||
.filter(
|
||||
(n) => !isNaN(n) && n >= 1 && n <= unstagedFiles.length,
|
||||
)
|
||||
.map((n) => n - 1);
|
||||
|
||||
const uniqueIndices = [...new Set(indices)];
|
||||
resolve(uniqueIndices.map((i) => unstagedFiles[i]!.path));
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user