kirograph 0.27.0 → 0.27.1

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/hooks/import-prompt.ts"],
4
+ "sourcesContent": ["import {\n getGlobalHooksDir,\n listHooks,\n copyHooks,\n getWorkspaceHooksDir,\n ensureDir,\n} from './manager';\nimport { singleChoice, multiSelect } from './prompt';\n\nconst green = '\\x1b[32m';\nconst reset = '\\x1b[0m';\n\n/**\n * Ask which global hooks to import. Returns filenames to copy, or null to skip.\n */\nexport async function promptImportGlobalHookSelection(): Promise<string[] | null> {\n let globalDir: string;\n try {\n globalDir = getGlobalHooksDir();\n } catch {\n return null;\n }\n\n const globalHooks = listHooks(globalDir);\n if (globalHooks.length === 0) return null;\n\n const choice = await singleChoice('Import global hooks?', [\n { label: 'None', value: 'none' },\n { label: 'All', value: 'all' },\n { label: 'Select specific hooks', value: 'select' },\n ]);\n\n if (choice === 'all') {\n return globalHooks.map((h) => h.filename);\n }\n\n if (choice === 'select') {\n const options = globalHooks.map((h) => ({\n label: h.displayName,\n value: h.filename,\n description: h.description,\n }));\n const selected = await multiSelect('Select hooks to import:', options);\n return selected.length > 0 ? selected : null;\n }\n\n return null;\n}\n\n/** Copy selected global hooks into the workspace and print a summary. */\nexport function applyImportedGlobalHooks(\n projectRoot: string,\n filenames: string[]\n): void {\n if (filenames.length === 0) return;\n\n const globalDir = getGlobalHooksDir();\n const globalHooks = listHooks(globalDir);\n const workspaceHooksDir = getWorkspaceHooksDir(projectRoot);\n ensureDir(workspaceHooksDir);\n const copied = copyHooks(globalDir, workspaceHooksDir, filenames);\n console.log(` ${green}\u2713${reset} Imported ${copied.length} hook${copied.length === 1 ? '' : 's'}:`);\n for (const f of copied) {\n const hook = globalHooks.find((h) => h.filename === f);\n console.log(` ${hook?.displayName ?? f}`);\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAMO;AACP,oBAA0C;AAE1C,MAAM,QAAQ;AACd,MAAM,QAAQ;AAKd,eAAsB,kCAA4D;AAChF,MAAI;AACJ,MAAI;AACF,oBAAY,kCAAkB;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,kBAAc,0BAAU,SAAS;AACvC,MAAI,YAAY,WAAW,EAAG,QAAO;AAErC,QAAM,SAAS,UAAM,4BAAa,wBAAwB;AAAA,IACxD,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,IAC/B,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,IAC7B,EAAE,OAAO,yBAAyB,OAAO,SAAS;AAAA,EACpD,CAAC;AAED,MAAI,WAAW,OAAO;AACpB,WAAO,YAAY,IAAI,CAAC,MAAM,EAAE,QAAQ;AAAA,EAC1C;AAEA,MAAI,WAAW,UAAU;AACvB,UAAM,UAAU,YAAY,IAAI,CAAC,OAAO;AAAA,MACtC,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT,aAAa,EAAE;AAAA,IACjB,EAAE;AACF,UAAM,WAAW,UAAM,2BAAY,2BAA2B,OAAO;AACrE,WAAO,SAAS,SAAS,IAAI,WAAW;AAAA,EAC1C;AAEA,SAAO;AACT;AAGO,SAAS,yBACd,aACA,WACM;AACN,MAAI,UAAU,WAAW,EAAG;AAE5B,QAAM,gBAAY,kCAAkB;AACpC,QAAM,kBAAc,0BAAU,SAAS;AACvC,QAAM,wBAAoB,qCAAqB,WAAW;AAC1D,gCAAU,iBAAiB;AAC3B,QAAM,aAAS,0BAAU,WAAW,mBAAmB,SAAS;AAChE,UAAQ,IAAI,KAAK,KAAK,SAAI,KAAK,aAAa,OAAO,MAAM,QAAQ,OAAO,WAAW,IAAI,KAAK,GAAG,GAAG;AAClG,aAAW,KAAK,QAAQ;AACtB,UAAM,OAAO,YAAY,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC;AACrD,YAAQ,IAAI,OAAO,MAAM,eAAe,CAAC,EAAE;AAAA,EAC7C;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var manager_exports = {};
30
+ __export(manager_exports, {
31
+ copyHooks: () => copyHooks,
32
+ ensureDir: () => ensureDir,
33
+ getGlobalHooksDir: () => getGlobalHooksDir,
34
+ getGlobalKirographDir: () => getGlobalKirographDir,
35
+ getWorkspaceHooksDir: () => getWorkspaceHooksDir,
36
+ listHooks: () => listHooks,
37
+ parseHookMetadata: () => parseHookMetadata,
38
+ parseHookName: () => parseHookName,
39
+ removeHooks: () => removeHooks
40
+ });
41
+ module.exports = __toCommonJS(manager_exports);
42
+ var fs = __toESM(require("fs"));
43
+ var path = __toESM(require("path"));
44
+ function getGlobalKirographDir() {
45
+ const home = process.env.HOME || process.env.USERPROFILE;
46
+ if (!home) {
47
+ throw new Error("Cannot determine home directory");
48
+ }
49
+ return path.join(home, ".kirograph");
50
+ }
51
+ function getGlobalHooksDir() {
52
+ return path.join(getGlobalKirographDir(), "hooks");
53
+ }
54
+ function getWorkspaceHooksDir(projectRoot) {
55
+ return path.join(projectRoot, ".kiro", "hooks");
56
+ }
57
+ function ensureDir(dirPath) {
58
+ fs.mkdirSync(dirPath, { recursive: true });
59
+ }
60
+ function listHooks(dirPath) {
61
+ let entries;
62
+ try {
63
+ entries = fs.readdirSync(dirPath);
64
+ } catch (err) {
65
+ if (err.code === "ENOENT") {
66
+ return [];
67
+ }
68
+ throw err;
69
+ }
70
+ return entries.filter((name) => name.endsWith(".kiro.hook") || name.endsWith(".json")).map((filename) => {
71
+ const fullPath = path.join(dirPath, filename);
72
+ const { displayName, description } = parseHookMetadata(fullPath);
73
+ return { filename, displayName, description, fullPath };
74
+ });
75
+ }
76
+ function copyHooks(sourceDir, destDir, filenames) {
77
+ const copied = [];
78
+ for (const filename of filenames) {
79
+ const src = path.join(sourceDir, filename);
80
+ const dest = path.join(destDir, filename);
81
+ const content = fs.readFileSync(src);
82
+ fs.writeFileSync(dest, content);
83
+ copied.push(filename);
84
+ }
85
+ return copied;
86
+ }
87
+ function removeHooks(dirPath, filenames) {
88
+ const removed = [];
89
+ for (const filename of filenames) {
90
+ fs.unlinkSync(path.join(dirPath, filename));
91
+ removed.push(filename);
92
+ }
93
+ return removed;
94
+ }
95
+ function parseHookMetadata(filePath) {
96
+ const fallback = path.basename(filePath);
97
+ try {
98
+ const content = fs.readFileSync(filePath, "utf-8");
99
+ const json = JSON.parse(content);
100
+ const isV2 = Array.isArray(json.hooks) && json.hooks.length > 0;
101
+ const rawName = isV2 ? json.hooks[0].name : json.name;
102
+ const displayName = typeof rawName === "string" && rawName.length > 0 ? rawName : fallback;
103
+ const description = !isV2 && typeof json.description === "string" && json.description.length > 0 ? json.description : void 0;
104
+ return { displayName, description };
105
+ } catch {
106
+ return { displayName: fallback };
107
+ }
108
+ }
109
+ function parseHookName(filePath) {
110
+ return parseHookMetadata(filePath).displayName;
111
+ }
112
+ // Annotate the CommonJS export names for ESM import in node:
113
+ 0 && (module.exports = {
114
+ copyHooks,
115
+ ensureDir,
116
+ getGlobalHooksDir,
117
+ getGlobalKirographDir,
118
+ getWorkspaceHooksDir,
119
+ listHooks,
120
+ parseHookMetadata,
121
+ parseHookName,
122
+ removeHooks
123
+ });
124
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/hooks/manager.ts"],
4
+ "sourcesContent": ["import * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Information about a hook file found in a directory.\n */\nexport interface HookFileInfo {\n /** Filename (e.g. \"my-lint-hook.kiro.hook\") */\n filename: string;\n /** Display name parsed from hook JSON `name` field, or filename if unparseable */\n displayName: string;\n /** Description parsed from hook JSON `description` field, if present */\n description?: string;\n /** Full absolute path to the file */\n fullPath: string;\n}\n\n/**\n * Resolve the global KiroGraph directory path (~/.kirograph/).\n * Throws if home directory cannot be determined.\n */\nexport function getGlobalKirographDir(): string {\n const home = process.env.HOME || process.env.USERPROFILE;\n if (!home) {\n throw new Error('Cannot determine home directory');\n }\n return path.join(home, '.kirograph');\n}\n\n/**\n * Resolve the global hooks directory path (~/.kirograph/hooks/).\n * Throws if home directory cannot be determined.\n */\nexport function getGlobalHooksDir(): string {\n return path.join(getGlobalKirographDir(), 'hooks');\n}\n\n/**\n * Resolve the workspace hooks directory path (.kiro/hooks/ relative to project root).\n */\nexport function getWorkspaceHooksDir(projectRoot: string): string {\n return path.join(projectRoot, '.kiro', 'hooks');\n}\n\n/**\n * Ensure the target directory exists, creating it recursively.\n * Throws on permission or filesystem errors.\n */\nexport function ensureDir(dirPath: string): void {\n fs.mkdirSync(dirPath, { recursive: true });\n}\n\n/**\n * List all .kiro.hook files in a directory.\n * Returns empty array if directory does not exist.\n */\nexport function listHooks(dirPath: string): HookFileInfo[] {\n let entries: string[];\n try {\n entries = fs.readdirSync(dirPath);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw err;\n }\n\n return entries\n .filter((name) => name.endsWith('.kiro.hook') || name.endsWith('.json'))\n .map((filename) => {\n const fullPath = path.join(dirPath, filename);\n const { displayName, description } = parseHookMetadata(fullPath);\n return { filename, displayName, description, fullPath };\n });\n}\n\n/**\n * Copy hook files from source dir to destination dir.\n * Always overwrites existing files with the same filename.\n * Uses fail-fast semantics: throws immediately on first copy error.\n * Returns the list of copied filenames.\n */\nexport function copyHooks(\n sourceDir: string,\n destDir: string,\n filenames: string[]\n): string[] {\n const copied: string[] = [];\n for (const filename of filenames) {\n const src = path.join(sourceDir, filename);\n const dest = path.join(destDir, filename);\n const content = fs.readFileSync(src);\n fs.writeFileSync(dest, content);\n copied.push(filename);\n }\n return copied;\n}\n\n/**\n * Remove hook files from a directory.\n * Uses fail-fast semantics: throws immediately on first removal error.\n * Returns the list of removed filenames.\n */\nexport function removeHooks(dirPath: string, filenames: string[]): string[] {\n const removed: string[] = [];\n for (const filename of filenames) {\n fs.unlinkSync(path.join(dirPath, filename));\n removed.push(filename);\n }\n return removed;\n}\n\n/**\n * Parse a hook file's JSON metadata (`name`, `description`).\n * Falls back to the filename when `name` is absent or unparseable.\n */\nexport function parseHookMetadata(filePath: string): {\n displayName: string;\n description?: string;\n} {\n const fallback = path.basename(filePath);\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const json = JSON.parse(content);\n // v2 format: { version: 'v1', hooks: [{ name, ... }] }\n // v1 format: { name, description, ... }\n const isV2 = Array.isArray(json.hooks) && json.hooks.length > 0;\n const rawName = isV2 ? json.hooks[0].name : json.name;\n const displayName =\n typeof rawName === 'string' && rawName.length > 0 ? rawName : fallback;\n const description =\n !isV2 && typeof json.description === 'string' && json.description.length > 0\n ? json.description\n : undefined;\n return { displayName, description };\n } catch {\n return { displayName: fallback };\n }\n}\n\n/**\n * Parse a hook file's JSON to extract the `name` field.\n * Returns the basename of the file path if parsing fails or `name` is absent/empty.\n */\nexport function parseHookName(filePath: string): string {\n return parseHookMetadata(filePath).displayName;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAoB;AACpB,WAAsB;AAoBf,SAAS,wBAAgC;AAC9C,QAAM,OAAO,QAAQ,IAAI,QAAQ,QAAQ,IAAI;AAC7C,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AACA,SAAO,KAAK,KAAK,MAAM,YAAY;AACrC;AAMO,SAAS,oBAA4B;AAC1C,SAAO,KAAK,KAAK,sBAAsB,GAAG,OAAO;AACnD;AAKO,SAAS,qBAAqB,aAA6B;AAChE,SAAO,KAAK,KAAK,aAAa,SAAS,OAAO;AAChD;AAMO,SAAS,UAAU,SAAuB;AAC/C,KAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAC3C;AAMO,SAAS,UAAU,SAAiC;AACzD,MAAI;AACJ,MAAI;AACF,cAAU,GAAG,YAAY,OAAO;AAAA,EAClC,SAAS,KAAc;AACrB,QAAK,IAA8B,SAAS,UAAU;AACpD,aAAO,CAAC;AAAA,IACV;AACA,UAAM;AAAA,EACR;AAEA,SAAO,QACJ,OAAO,CAAC,SAAS,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,OAAO,CAAC,EACtE,IAAI,CAAC,aAAa;AACjB,UAAM,WAAW,KAAK,KAAK,SAAS,QAAQ;AAC5C,UAAM,EAAE,aAAa,YAAY,IAAI,kBAAkB,QAAQ;AAC/D,WAAO,EAAE,UAAU,aAAa,aAAa,SAAS;AAAA,EACxD,CAAC;AACL;AAQO,SAAS,UACd,WACA,SACA,WACU;AACV,QAAM,SAAmB,CAAC;AAC1B,aAAW,YAAY,WAAW;AAChC,UAAM,MAAM,KAAK,KAAK,WAAW,QAAQ;AACzC,UAAM,OAAO,KAAK,KAAK,SAAS,QAAQ;AACxC,UAAM,UAAU,GAAG,aAAa,GAAG;AACnC,OAAG,cAAc,MAAM,OAAO;AAC9B,WAAO,KAAK,QAAQ;AAAA,EACtB;AACA,SAAO;AACT;AAOO,SAAS,YAAY,SAAiB,WAA+B;AAC1E,QAAM,UAAoB,CAAC;AAC3B,aAAW,YAAY,WAAW;AAChC,OAAG,WAAW,KAAK,KAAK,SAAS,QAAQ,CAAC;AAC1C,YAAQ,KAAK,QAAQ;AAAA,EACvB;AACA,SAAO;AACT;AAMO,SAAS,kBAAkB,UAGhC;AACA,QAAM,WAAW,KAAK,SAAS,QAAQ;AACvC,MAAI;AACF,UAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AACjD,UAAM,OAAO,KAAK,MAAM,OAAO;AAG/B,UAAM,OAAO,MAAM,QAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,SAAS;AAC9D,UAAM,UAAU,OAAO,KAAK,MAAM,CAAC,EAAE,OAAO,KAAK;AACjD,UAAM,cACJ,OAAO,YAAY,YAAY,QAAQ,SAAS,IAAI,UAAU;AAChE,UAAM,cACJ,CAAC,QAAQ,OAAO,KAAK,gBAAgB,YAAY,KAAK,YAAY,SAAS,IACvE,KAAK,cACL;AACN,WAAO,EAAE,aAAa,YAAY;AAAA,EACpC,QAAQ;AACN,WAAO,EAAE,aAAa,SAAS;AAAA,EACjC;AACF;AAMO,SAAS,cAAc,UAA0B;AACtD,SAAO,kBAAkB,QAAQ,EAAE;AACrC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var prompt_exports = {};
30
+ __export(prompt_exports, {
31
+ isInteractive: () => isInteractive,
32
+ multiSelect: () => multiSelect,
33
+ singleChoice: () => singleChoice
34
+ });
35
+ module.exports = __toCommonJS(prompt_exports);
36
+ var readline = __toESM(require("readline"));
37
+ const PAGE_SIZE = 10;
38
+ const violet = "\x1B[38;5;99m";
39
+ const reset = "\x1B[0m";
40
+ const dim = "\x1B[2m";
41
+ const bold = "\x1B[1m";
42
+ const green = "\x1B[32m";
43
+ const CURSOR_UP = "\x1B[A";
44
+ const CURSOR_DOWN = "\x1B[B";
45
+ const CURSOR_LEFT = "\x1B[D";
46
+ const CURSOR_RIGHT = "\x1B[C";
47
+ const CLEAR_LINE = "\x1B[2K\x1B[G";
48
+ function isInteractive() {
49
+ return !!process.stdout.isTTY;
50
+ }
51
+ function pageCount(total) {
52
+ return Math.max(1, Math.ceil(total / PAGE_SIZE));
53
+ }
54
+ function pageSlice(items, page) {
55
+ const start = page * PAGE_SIZE;
56
+ return items.slice(start, start + PAGE_SIZE);
57
+ }
58
+ function optionRowCount(totalPages, pageItemCount) {
59
+ return totalPages > 1 ? PAGE_SIZE : pageItemCount;
60
+ }
61
+ function descLineCount(desc) {
62
+ if (!desc) return 0;
63
+ const termWidth = process.stdout.columns || 80;
64
+ return Math.max(1, Math.ceil((desc.length + 4) / termWidth));
65
+ }
66
+ function startRawKeySession(rl) {
67
+ rl.pause();
68
+ const stdin = process.stdin;
69
+ const wasTTY = stdin.isTTY;
70
+ if (wasTTY) stdin.setRawMode(true);
71
+ stdin.resume();
72
+ stdin.setEncoding("utf8");
73
+ let keyHandler = null;
74
+ const onData = (key) => {
75
+ keyHandler?.(key);
76
+ };
77
+ stdin.on("data", onData);
78
+ return {
79
+ onKey: (handler) => {
80
+ keyHandler = handler;
81
+ },
82
+ cleanup: () => {
83
+ stdin.removeListener("data", onData);
84
+ if (wasTTY) stdin.setRawMode(false);
85
+ stdin.pause();
86
+ rl.resume();
87
+ }
88
+ };
89
+ }
90
+ function clearRenderedBlock(lineCount) {
91
+ if (lineCount <= 0) return;
92
+ process.stdout.write(`\x1B[${lineCount}A`);
93
+ for (let i = 0; i < lineCount; i++) {
94
+ process.stdout.write(`${CLEAR_LINE}
95
+ `);
96
+ }
97
+ process.stdout.write(`\x1B[${lineCount}A`);
98
+ }
99
+ function singleChoice(message, options) {
100
+ return new Promise((resolve) => {
101
+ const rl = readline.createInterface({
102
+ input: process.stdin,
103
+ output: process.stdout
104
+ });
105
+ const totalPages = pageCount(options.length);
106
+ let page = 0;
107
+ let selected = 0;
108
+ let prevDescLines = 0;
109
+ let renderedLines = 0;
110
+ const getGlobalIndex = () => page * PAGE_SIZE + selected;
111
+ const getDescription = () => options[getGlobalIndex()]?.description;
112
+ const render = (first) => {
113
+ const pageOptions = pageSlice(options, page);
114
+ const desc = getDescription();
115
+ const descLines = descLineCount(desc);
116
+ const footer = totalPages > 1 ? `${dim}Page ${page + 1}/${totalPages} \xB7 \u2190/\u2192 change page \xB7 Enter select${reset}` : `${dim}\u2191/\u2193 navigate \xB7 Enter select${reset}`;
117
+ const rowCount = optionRowCount(totalPages, pageOptions.length);
118
+ const trailingLines = desc ? descLines : prevDescLines;
119
+ const blockLines = 3 + rowCount + trailingLines;
120
+ if (!first) {
121
+ process.stdout.write(`\x1B[${renderedLines}A`);
122
+ }
123
+ process.stdout.write(`${CLEAR_LINE}
124
+ `);
125
+ process.stdout.write(`${CLEAR_LINE} ${violet}${message}${reset}
126
+ `);
127
+ process.stdout.write(`${CLEAR_LINE} ${footer}
128
+ `);
129
+ for (let i = 0; i < rowCount; i++) {
130
+ const opt = pageOptions[i];
131
+ if (opt) {
132
+ const active = i === selected;
133
+ const cursor = active ? `${green}${bold}\u276F${reset}` : " ";
134
+ const text = active ? `${bold}${opt.label}${reset}` : `${dim}${opt.label}${reset}`;
135
+ process.stdout.write(`${CLEAR_LINE} ${cursor} ${text}
136
+ `);
137
+ } else {
138
+ process.stdout.write(`${CLEAR_LINE}
139
+ `);
140
+ }
141
+ }
142
+ if (desc) {
143
+ process.stdout.write(`${CLEAR_LINE} ${dim}${desc}${reset}
144
+ `);
145
+ } else if (prevDescLines > 0) {
146
+ for (let i = 0; i < prevDescLines; i++) {
147
+ process.stdout.write(`${CLEAR_LINE}
148
+ `);
149
+ }
150
+ }
151
+ prevDescLines = descLines;
152
+ renderedLines = blockLines;
153
+ };
154
+ const session = startRawKeySession(rl);
155
+ console.log("");
156
+ render(true);
157
+ session.onKey((key) => {
158
+ const pageOptions = pageSlice(options, page);
159
+ if (key === CURSOR_UP || key === "\x1B[A") {
160
+ selected = (selected - 1 + pageOptions.length) % pageOptions.length;
161
+ render(false);
162
+ } else if (key === CURSOR_DOWN || key === "\x1B[B") {
163
+ selected = (selected + 1) % pageOptions.length;
164
+ render(false);
165
+ } else if ((key === CURSOR_LEFT || key === "\x1B[D") && totalPages > 1) {
166
+ page = (page - 1 + totalPages) % totalPages;
167
+ selected = 0;
168
+ render(false);
169
+ } else if ((key === CURSOR_RIGHT || key === "\x1B[C") && totalPages > 1) {
170
+ page = (page + 1) % totalPages;
171
+ selected = 0;
172
+ render(false);
173
+ } else if (key === "\r" || key === "\n" || key === " ") {
174
+ const choice = options[getGlobalIndex()];
175
+ session.cleanup();
176
+ rl.close();
177
+ clearRenderedBlock(renderedLines + 1);
178
+ process.stdout.write(
179
+ `${CLEAR_LINE} ${green}${bold}\u2713${reset} ${message} ${green}${bold}${choice.label}${reset}
180
+ `
181
+ );
182
+ resolve(choice.value);
183
+ } else if (key === "") {
184
+ session.cleanup();
185
+ rl.close();
186
+ process.exit(1);
187
+ }
188
+ });
189
+ });
190
+ }
191
+ function multiSelect(message, options, selectOpts = {}) {
192
+ return new Promise((resolve) => {
193
+ const rl = readline.createInterface({
194
+ input: process.stdin,
195
+ output: process.stdout
196
+ });
197
+ const totalPages = pageCount(options.length);
198
+ const selectedValues = /* @__PURE__ */ new Set();
199
+ let page = 0;
200
+ let cursor = 0;
201
+ let renderedLines = 0;
202
+ const getGlobalIndex = () => page * PAGE_SIZE + cursor;
203
+ const render = (first) => {
204
+ const pageOptions = pageSlice(options, page);
205
+ const pageHint = totalPages > 1 ? ` \xB7 \u2190/\u2192 page` : "";
206
+ const enterHint = selectOpts.emptySelection === "focused" ? " \xB7 Enter save focused" : " \xB7 Enter confirm";
207
+ const footer = `${dim}${selectedValues.size} selected${pageHint} \xB7 Space toggle${enterHint}${reset}`;
208
+ const rowCount = optionRowCount(totalPages, pageOptions.length);
209
+ const blockLines = 3 + rowCount + (totalPages > 1 ? 1 : 0);
210
+ if (!first) {
211
+ process.stdout.write(`\x1B[${renderedLines}A`);
212
+ }
213
+ process.stdout.write(`${CLEAR_LINE}
214
+ `);
215
+ process.stdout.write(`${CLEAR_LINE} ${violet}${message}${reset}
216
+ `);
217
+ process.stdout.write(`${CLEAR_LINE} ${footer}
218
+ `);
219
+ for (let i = 0; i < rowCount; i++) {
220
+ const opt = pageOptions[i];
221
+ if (opt) {
222
+ const active = i === cursor;
223
+ const checked = selectedValues.has(opt.value);
224
+ const mark = checked ? `${green}[x]${reset}` : `${dim}[ ]${reset}`;
225
+ const pointer = active ? `${green}${bold}\u276F${reset}` : " ";
226
+ const text = active ? `${bold}${opt.label}${reset}` : `${dim}${opt.label}${reset}`;
227
+ process.stdout.write(`${CLEAR_LINE} ${pointer} ${mark} ${text}
228
+ `);
229
+ } else {
230
+ process.stdout.write(`${CLEAR_LINE}
231
+ `);
232
+ }
233
+ }
234
+ if (totalPages > 1) {
235
+ process.stdout.write(`${CLEAR_LINE} ${dim}Page ${page + 1}/${totalPages}${reset}
236
+ `);
237
+ }
238
+ renderedLines = blockLines;
239
+ };
240
+ const session = startRawKeySession(rl);
241
+ console.log("");
242
+ render(true);
243
+ session.onKey((key) => {
244
+ const pageOptions = pageSlice(options, page);
245
+ if (key === CURSOR_UP || key === "\x1B[A") {
246
+ cursor = (cursor - 1 + pageOptions.length) % pageOptions.length;
247
+ render(false);
248
+ } else if (key === CURSOR_DOWN || key === "\x1B[B") {
249
+ cursor = (cursor + 1) % pageOptions.length;
250
+ render(false);
251
+ } else if ((key === CURSOR_LEFT || key === "\x1B[D") && totalPages > 1) {
252
+ page = (page - 1 + totalPages) % totalPages;
253
+ cursor = 0;
254
+ render(false);
255
+ } else if ((key === CURSOR_RIGHT || key === "\x1B[C") && totalPages > 1) {
256
+ page = (page + 1) % totalPages;
257
+ cursor = 0;
258
+ render(false);
259
+ } else if (key === " ") {
260
+ const opt = options[getGlobalIndex()];
261
+ if (selectedValues.has(opt.value)) {
262
+ selectedValues.delete(opt.value);
263
+ } else {
264
+ selectedValues.add(opt.value);
265
+ }
266
+ render(false);
267
+ } else if (key === "\r" || key === "\n") {
268
+ let result = options.filter((opt) => selectedValues.has(opt.value)).map((opt) => opt.value);
269
+ if (result.length === 0 && selectOpts.emptySelection === "focused") {
270
+ const focused = options[getGlobalIndex()];
271
+ if (focused) result = [focused.value];
272
+ }
273
+ session.cleanup();
274
+ rl.close();
275
+ clearRenderedBlock(renderedLines + 1);
276
+ const summary = result.length === 0 ? `${dim}none${reset}` : `${green}${bold}${result.length}${reset} ${dim}hook${result.length === 1 ? "" : "s"}${reset}`;
277
+ process.stdout.write(
278
+ `${CLEAR_LINE} ${green}${bold}\u2713${reset} ${message} ${summary}
279
+ `
280
+ );
281
+ resolve(result);
282
+ } else if (key === "") {
283
+ session.cleanup();
284
+ rl.close();
285
+ process.exit(1);
286
+ }
287
+ });
288
+ });
289
+ }
290
+ // Annotate the CommonJS export names for ESM import in node:
291
+ 0 && (module.exports = {
292
+ isInteractive,
293
+ multiSelect,
294
+ singleChoice
295
+ });
296
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/hooks/prompt.ts"],
4
+ "sourcesContent": ["import * as readline from 'readline';\n\nexport interface ChoiceOption {\n label: string;\n value: string;\n description?: string;\n}\n\nconst PAGE_SIZE = 10;\n\nconst violet = '\\x1b[38;5;99m';\nconst reset = '\\x1b[0m';\nconst dim = '\\x1b[2m';\nconst bold = '\\x1b[1m';\nconst green = '\\x1b[32m';\n\nconst CURSOR_UP = '\\x1b[A';\nconst CURSOR_DOWN = '\\x1b[B';\nconst CURSOR_LEFT = '\\x1b[D';\nconst CURSOR_RIGHT = '\\x1b[C';\nconst CLEAR_LINE = '\\x1b[2K\\x1b[G';\n\n/**\n * Returns true if stdout is a TTY (interactive terminal).\n */\nexport function isInteractive(): boolean {\n return !!process.stdout.isTTY;\n}\n\nfunction pageCount(total: number): number {\n return Math.max(1, Math.ceil(total / PAGE_SIZE));\n}\n\nfunction pageSlice<T>(items: T[], page: number): T[] {\n const start = page * PAGE_SIZE;\n return items.slice(start, start + PAGE_SIZE);\n}\n\nfunction optionRowCount(totalPages: number, pageItemCount: number): number {\n return totalPages > 1 ? PAGE_SIZE : pageItemCount;\n}\n\nfunction descLineCount(desc: string | undefined): number {\n if (!desc) return 0;\n const termWidth = process.stdout.columns || 80;\n return Math.max(1, Math.ceil((desc.length + 4) / termWidth));\n}\n\ninterface RawKeySession {\n onKey: (handler: (key: string) => void) => void;\n cleanup: () => void;\n}\n\nfunction startRawKeySession(rl: readline.Interface): RawKeySession {\n rl.pause();\n const stdin = process.stdin;\n const wasTTY = stdin.isTTY;\n if (wasTTY) stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n let keyHandler: ((key: string) => void) | null = null;\n\n const onData = (key: string) => {\n keyHandler?.(key);\n };\n\n stdin.on('data', onData);\n\n return {\n onKey: (handler) => {\n keyHandler = handler;\n },\n cleanup: () => {\n stdin.removeListener('data', onData);\n if (wasTTY) stdin.setRawMode(false);\n stdin.pause();\n rl.resume();\n },\n };\n}\n\nfunction clearRenderedBlock(lineCount: number): void {\n if (lineCount <= 0) return;\n process.stdout.write(`\\x1b[${lineCount}A`);\n for (let i = 0; i < lineCount; i++) {\n process.stdout.write(`${CLEAR_LINE}\\n`);\n }\n process.stdout.write(`\\x1b[${lineCount}A`);\n}\n\n/**\n * Display a single-choice menu with arrow-key navigation.\n * Paginates automatically when there are more than 10 options.\n */\nexport function singleChoice(\n message: string,\n options: ChoiceOption[]\n): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const totalPages = pageCount(options.length);\n let page = 0;\n let selected = 0;\n let prevDescLines = 0;\n let renderedLines = 0;\n\n const getGlobalIndex = () => page * PAGE_SIZE + selected;\n const getDescription = () => options[getGlobalIndex()]?.description;\n\n const render = (first: boolean) => {\n const pageOptions = pageSlice(options, page);\n const desc = getDescription();\n const descLines = descLineCount(desc);\n const footer = totalPages > 1\n ? `${dim}Page ${page + 1}/${totalPages} \u00B7 \u2190/\u2192 change page \u00B7 Enter select${reset}`\n : `${dim}\u2191/\u2193 navigate \u00B7 Enter select${reset}`;\n\n const rowCount = optionRowCount(totalPages, pageOptions.length);\n const trailingLines = desc ? descLines : prevDescLines;\n const blockLines = 3 + rowCount + trailingLines;\n\n if (!first) {\n process.stdout.write(`\\x1b[${renderedLines}A`);\n }\n\n process.stdout.write(`${CLEAR_LINE}\\n`);\n process.stdout.write(`${CLEAR_LINE} ${violet}${message}${reset}\\n`);\n process.stdout.write(`${CLEAR_LINE} ${footer}\\n`);\n\n for (let i = 0; i < rowCount; i++) {\n const opt = pageOptions[i];\n if (opt) {\n const active = i === selected;\n const cursor = active ? `${green}${bold}\u276F${reset}` : ' ';\n const text = active\n ? `${bold}${opt.label}${reset}`\n : `${dim}${opt.label}${reset}`;\n process.stdout.write(`${CLEAR_LINE} ${cursor} ${text}\\n`);\n } else {\n process.stdout.write(`${CLEAR_LINE}\\n`);\n }\n }\n\n if (desc) {\n process.stdout.write(`${CLEAR_LINE} ${dim}${desc}${reset}\\n`);\n } else if (prevDescLines > 0) {\n for (let i = 0; i < prevDescLines; i++) {\n process.stdout.write(`${CLEAR_LINE}\\n`);\n }\n }\n\n prevDescLines = descLines;\n renderedLines = blockLines;\n };\n\n const session = startRawKeySession(rl);\n console.log('');\n render(true);\n\n session.onKey((key) => {\n const pageOptions = pageSlice(options, page);\n\n if (key === CURSOR_UP || key === '\\x1b[A') {\n selected = (selected - 1 + pageOptions.length) % pageOptions.length;\n render(false);\n } else if (key === CURSOR_DOWN || key === '\\x1b[B') {\n selected = (selected + 1) % pageOptions.length;\n render(false);\n } else if ((key === CURSOR_LEFT || key === '\\x1b[D') && totalPages > 1) {\n page = (page - 1 + totalPages) % totalPages;\n selected = 0;\n render(false);\n } else if ((key === CURSOR_RIGHT || key === '\\x1b[C') && totalPages > 1) {\n page = (page + 1) % totalPages;\n selected = 0;\n render(false);\n } else if (key === '\\r' || key === '\\n' || key === ' ') {\n const choice = options[getGlobalIndex()]!;\n session.cleanup();\n rl.close();\n clearRenderedBlock(renderedLines + 1);\n process.stdout.write(\n `${CLEAR_LINE} ${green}${bold}\u2713${reset} ${message} ${green}${bold}${choice.label}${reset}\\n`\n );\n resolve(choice.value);\n } else if (key === '\\x03') {\n session.cleanup();\n rl.close();\n process.exit(1);\n }\n });\n });\n}\n\n/**\n * Display a multi-select checkbox menu with arrow-key navigation.\n * Paginates automatically when there are more than 10 options.\n */\nexport interface MultiSelectOptions {\n /** When Enter is pressed with no checkboxes toggled, save the focused item. */\n emptySelection?: 'none' | 'focused';\n}\n\nexport function multiSelect(\n message: string,\n options: ChoiceOption[],\n selectOpts: MultiSelectOptions = {}\n): Promise<string[]> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const totalPages = pageCount(options.length);\n const selectedValues = new Set<string>();\n let page = 0;\n let cursor = 0;\n let renderedLines = 0;\n\n const getGlobalIndex = () => page * PAGE_SIZE + cursor;\n\n const render = (first: boolean) => {\n const pageOptions = pageSlice(options, page);\n const pageHint = totalPages > 1 ? ` \u00B7 \u2190/\u2192 page` : '';\n const enterHint = selectOpts.emptySelection === 'focused'\n ? ' \u00B7 Enter save focused'\n : ' \u00B7 Enter confirm';\n const footer =\n `${dim}${selectedValues.size} selected${pageHint} \u00B7 Space toggle${enterHint}${reset}`;\n\n const rowCount = optionRowCount(totalPages, pageOptions.length);\n const blockLines = 3 + rowCount + (totalPages > 1 ? 1 : 0);\n\n if (!first) {\n process.stdout.write(`\\x1b[${renderedLines}A`);\n }\n\n process.stdout.write(`${CLEAR_LINE}\\n`);\n process.stdout.write(`${CLEAR_LINE} ${violet}${message}${reset}\\n`);\n process.stdout.write(`${CLEAR_LINE} ${footer}\\n`);\n\n for (let i = 0; i < rowCount; i++) {\n const opt = pageOptions[i];\n if (opt) {\n const active = i === cursor;\n const checked = selectedValues.has(opt.value);\n const mark = checked ? `${green}[x]${reset}` : `${dim}[ ]${reset}`;\n const pointer = active ? `${green}${bold}\u276F${reset}` : ' ';\n const text = active\n ? `${bold}${opt.label}${reset}`\n : `${dim}${opt.label}${reset}`;\n process.stdout.write(`${CLEAR_LINE} ${pointer} ${mark} ${text}\\n`);\n } else {\n process.stdout.write(`${CLEAR_LINE}\\n`);\n }\n }\n\n if (totalPages > 1) {\n process.stdout.write(`${CLEAR_LINE} ${dim}Page ${page + 1}/${totalPages}${reset}\\n`);\n }\n\n renderedLines = blockLines;\n };\n\n const session = startRawKeySession(rl);\n console.log('');\n render(true);\n\n session.onKey((key) => {\n const pageOptions = pageSlice(options, page);\n\n if (key === CURSOR_UP || key === '\\x1b[A') {\n cursor = (cursor - 1 + pageOptions.length) % pageOptions.length;\n render(false);\n } else if (key === CURSOR_DOWN || key === '\\x1b[B') {\n cursor = (cursor + 1) % pageOptions.length;\n render(false);\n } else if ((key === CURSOR_LEFT || key === '\\x1b[D') && totalPages > 1) {\n page = (page - 1 + totalPages) % totalPages;\n cursor = 0;\n render(false);\n } else if ((key === CURSOR_RIGHT || key === '\\x1b[C') && totalPages > 1) {\n page = (page + 1) % totalPages;\n cursor = 0;\n render(false);\n } else if (key === ' ') {\n const opt = options[getGlobalIndex()]!;\n if (selectedValues.has(opt.value)) {\n selectedValues.delete(opt.value);\n } else {\n selectedValues.add(opt.value);\n }\n render(false);\n } else if (key === '\\r' || key === '\\n') {\n let result = options\n .filter((opt) => selectedValues.has(opt.value))\n .map((opt) => opt.value);\n if (result.length === 0 && selectOpts.emptySelection === 'focused') {\n const focused = options[getGlobalIndex()];\n if (focused) result = [focused.value];\n }\n session.cleanup();\n rl.close();\n clearRenderedBlock(renderedLines + 1);\n const summary = result.length === 0\n ? `${dim}none${reset}`\n : `${green}${bold}${result.length}${reset} ${dim}hook${result.length === 1 ? '' : 's'}${reset}`;\n process.stdout.write(\n `${CLEAR_LINE} ${green}${bold}\u2713${reset} ${message} ${summary}\\n`\n );\n resolve(result);\n } else if (key === '\\x03') {\n session.cleanup();\n rl.close();\n process.exit(1);\n }\n });\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kirograph",
3
- "version": "0.27.0",
3
+ "version": "0.27.1",
4
4
  "description": "Semantic code knowledge graph for Kiro: fewer tool calls, instant symbol lookups, 100% local.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",