kirograph 0.27.0 → 0.27.2
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/README.md +27 -1
- package/dist/bin/commands/callees.js +76 -0
- package/dist/bin/commands/callees.js.map +7 -0
- package/dist/bin/commands/callers.js +76 -0
- package/dist/bin/commands/callers.js.map +7 -0
- package/dist/bin/commands/circular-deps.js +68 -0
- package/dist/bin/commands/circular-deps.js.map +7 -0
- package/dist/bin/commands/help.js +8 -3
- package/dist/bin/commands/help.js.map +2 -2
- package/dist/bin/commands/hook.js +242 -0
- package/dist/bin/commands/hook.js.map +7 -0
- package/dist/bin/commands/impact.js +76 -0
- package/dist/bin/commands/impact.js.map +7 -0
- package/dist/bin/commands/init.js.map +2 -2
- package/dist/bin/commands/type-hierarchy.js +76 -0
- package/dist/bin/commands/type-hierarchy.js.map +7 -0
- package/dist/bin/installer/common.js +15 -9
- package/dist/bin/installer/common.js.map +2 -2
- package/dist/bin/installer/config-prompt.js +16 -4
- package/dist/bin/installer/config-prompt.js.map +2 -2
- package/dist/bin/installer/index.js +37 -5
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/installer/instructions.js +14 -21
- package/dist/bin/installer/instructions.js.map +2 -2
- package/dist/bin/installer/mcp.js.map +2 -2
- package/dist/bin/installer/steering.js +38 -0
- package/dist/bin/installer/steering.js.map +2 -2
- package/dist/bin/installer/targets/aider.js +3 -3
- package/dist/bin/installer/targets/aider.js.map +2 -2
- package/dist/bin/installer/targets/amp.js +3 -3
- package/dist/bin/installer/targets/amp.js.map +2 -2
- package/dist/bin/installer/targets/antigravity.js +4 -4
- package/dist/bin/installer/targets/antigravity.js.map +2 -2
- package/dist/bin/installer/targets/augment.js +3 -3
- package/dist/bin/installer/targets/augment.js.map +2 -2
- package/dist/bin/installer/targets/claude.js +3 -3
- package/dist/bin/installer/targets/claude.js.map +2 -2
- package/dist/bin/installer/targets/cline.js +4 -4
- package/dist/bin/installer/targets/cline.js.map +2 -2
- package/dist/bin/installer/targets/codex.js +4 -4
- package/dist/bin/installer/targets/codex.js.map +2 -2
- package/dist/bin/installer/targets/continue.js +4 -4
- package/dist/bin/installer/targets/continue.js.map +2 -2
- package/dist/bin/installer/targets/copilot-cli.js +4 -4
- package/dist/bin/installer/targets/copilot-cli.js.map +2 -2
- package/dist/bin/installer/targets/copilot.js +4 -4
- package/dist/bin/installer/targets/copilot.js.map +2 -2
- package/dist/bin/installer/targets/cursor.js +5 -5
- package/dist/bin/installer/targets/cursor.js.map +2 -2
- package/dist/bin/installer/targets/devin.js +4 -4
- package/dist/bin/installer/targets/devin.js.map +2 -2
- package/dist/bin/installer/targets/gemini-cli.js +4 -4
- package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
- package/dist/bin/installer/targets/generic.js +2 -2
- package/dist/bin/installer/targets/generic.js.map +2 -2
- package/dist/bin/installer/targets/goose.js +3 -4
- package/dist/bin/installer/targets/goose.js.map +3 -3
- package/dist/bin/installer/targets/index.js.map +1 -1
- package/dist/bin/installer/targets/junie.js +4 -4
- package/dist/bin/installer/targets/junie.js.map +2 -2
- package/dist/bin/installer/targets/kilo.js +4 -4
- package/dist/bin/installer/targets/kilo.js.map +2 -2
- package/dist/bin/installer/targets/kiro.js +23 -3
- package/dist/bin/installer/targets/kiro.js.map +2 -2
- package/dist/bin/installer/targets/opencode.js +3 -3
- package/dist/bin/installer/targets/opencode.js.map +2 -2
- package/dist/bin/installer/targets/openhands.js +3 -3
- package/dist/bin/installer/targets/openhands.js.map +2 -2
- package/dist/bin/installer/targets/qoder.js +2 -2
- package/dist/bin/installer/targets/qoder.js.map +2 -2
- package/dist/bin/installer/targets/qwen.js +2 -2
- package/dist/bin/installer/targets/qwen.js.map +2 -2
- package/dist/bin/installer/targets/replit.js +3 -3
- package/dist/bin/installer/targets/replit.js.map +2 -2
- package/dist/bin/installer/targets/roo.js +4 -4
- package/dist/bin/installer/targets/roo.js.map +2 -2
- package/dist/bin/installer/targets/tabnine.js +3 -3
- package/dist/bin/installer/targets/tabnine.js.map +2 -2
- package/dist/bin/installer/targets/trae.js +3 -3
- package/dist/bin/installer/targets/trae.js.map +2 -2
- package/dist/bin/installer/targets/warp.js +4 -4
- package/dist/bin/installer/targets/warp.js.map +2 -2
- package/dist/bin/installer/targets/windsurf.js +4 -4
- package/dist/bin/installer/targets/windsurf.js.map +2 -2
- package/dist/bin/kirograph.js +13 -1
- package/dist/bin/kirograph.js.map +3 -3
- package/dist/config.js +4 -0
- package/dist/config.js.map +2 -2
- package/dist/hooks/import-prompt.js +75 -0
- package/dist/hooks/import-prompt.js.map +7 -0
- package/dist/hooks/manager.js +124 -0
- package/dist/hooks/manager.js.map +7 -0
- package/dist/hooks/prompt.js +296 -0
- package/dist/hooks/prompt.js.map +7 -0
- package/dist/mcp/cache.js +1 -1
- package/dist/mcp/cache.js.map +2 -2
- package/dist/mcp/tool-names.js +43 -4
- package/dist/mcp/tool-names.js.map +2 -2
- package/dist/mcp/tools.js +774 -182
- package/dist/mcp/tools.js.map +3 -3
- package/package.json +1 -1
|
@@ -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/dist/mcp/cache.js
CHANGED
|
@@ -71,7 +71,7 @@ class FileReadCache {
|
|
|
71
71
|
existing.lastRead = Date.now();
|
|
72
72
|
existing.readCount++;
|
|
73
73
|
return {
|
|
74
|
-
content: `[cached: unchanged
|
|
74
|
+
content: `[cached: file unchanged \u2014 use kirograph_retrieve to get full content, or noCache:true to force re-read]`,
|
|
75
75
|
cached: true,
|
|
76
76
|
changed: false
|
|
77
77
|
};
|
package/dist/mcp/cache.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/mcp/cache.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * KiroGraph File Read Cache\n *\n * In-memory, session-scoped file cache. First read returns full content,\n * subsequent reads of unchanged files return a compact \"cached\" marker (~13 tokens).\n * Uses content hashing (SHA-256) to detect changes.\n */\n\nimport * as fs from 'fs';\nimport * as crypto from 'crypto';\n\nexport interface CacheEntry {\n contentHash: string;\n content: string;\n lastRead: number;\n readCount: number;\n}\n\nexport interface CacheStats {\n entries: number;\n hits: number;\n misses: number;\n hitRate: number;\n}\n\nexport interface ReadResult {\n content: string;\n cached: boolean;\n changed: boolean;\n /** Previous content (for diff mode) */\n previousContent?: string;\n}\n\nexport class FileReadCache {\n private cache = new Map<string, CacheEntry>();\n private hits = 0;\n private misses = 0;\n\n /**\n * Read a file with caching. Returns full content on first read or if changed,\n * returns a compact marker if unchanged since last read.\n */\n read(filePath: string, noCache = false): ReadResult {\n let content: string;\n try {\n content = fs.readFileSync(filePath, 'utf8');\n } catch (err: any) {\n throw new Error(`Cannot read file: ${err.message}`);\n }\n\n if (noCache) {\n const hash = this.hashContent(content);\n const previous = this.cache.get(filePath);\n this.cache.set(filePath, {\n contentHash: hash,\n content,\n lastRead: Date.now(),\n readCount: (previous?.readCount ?? 0) + 1,\n });\n this.misses++;\n return { content, cached: false, changed: false };\n }\n\n const hash = this.hashContent(content);\n const existing = this.cache.get(filePath);\n\n if (existing && existing.contentHash === hash) {\n // Cache hit \u2014 file unchanged\n this.hits++;\n existing.lastRead = Date.now();\n existing.readCount++;\n return {\n content: `[cached: unchanged
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAoB;AACpB,aAAwB;AAwBjB,MAAM,cAAc;AAAA,EAApB;AACL,SAAQ,QAAQ,oBAAI,IAAwB;AAC5C,SAAQ,OAAO;AACf,SAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,KAAK,UAAkB,UAAU,OAAmB;AAClD,QAAI;AACJ,QAAI;AACF,gBAAU,GAAG,aAAa,UAAU,MAAM;AAAA,IAC5C,SAAS,KAAU;AACjB,YAAM,IAAI,MAAM,qBAAqB,IAAI,OAAO,EAAE;AAAA,IACpD;AAEA,QAAI,SAAS;AACX,YAAMA,QAAO,KAAK,YAAY,OAAO;AACrC,YAAM,WAAW,KAAK,MAAM,IAAI,QAAQ;AACxC,WAAK,MAAM,IAAI,UAAU;AAAA,QACvB,aAAaA;AAAA,QACb;AAAA,QACA,UAAU,KAAK,IAAI;AAAA,QACnB,YAAY,UAAU,aAAa,KAAK;AAAA,MAC1C,CAAC;AACD,WAAK;AACL,aAAO,EAAE,SAAS,QAAQ,OAAO,SAAS,MAAM;AAAA,IAClD;AAEA,UAAM,OAAO,KAAK,YAAY,OAAO;AACrC,UAAM,WAAW,KAAK,MAAM,IAAI,QAAQ;AAExC,QAAI,YAAY,SAAS,gBAAgB,MAAM;AAE7C,WAAK;AACL,eAAS,WAAW,KAAK,IAAI;AAC7B,eAAS;AACT,aAAO;AAAA,QACL,SAAS
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph File Read Cache\n *\n * In-memory, session-scoped file cache. First read returns full content,\n * subsequent reads of unchanged files return a compact \"cached\" marker (~13 tokens).\n * Uses content hashing (SHA-256) to detect changes.\n */\n\nimport * as fs from 'fs';\nimport * as crypto from 'crypto';\n\nexport interface CacheEntry {\n contentHash: string;\n content: string;\n lastRead: number;\n readCount: number;\n}\n\nexport interface CacheStats {\n entries: number;\n hits: number;\n misses: number;\n hitRate: number;\n}\n\nexport interface ReadResult {\n content: string;\n cached: boolean;\n changed: boolean;\n /** Previous content (for diff mode) */\n previousContent?: string;\n}\n\nexport class FileReadCache {\n private cache = new Map<string, CacheEntry>();\n private hits = 0;\n private misses = 0;\n\n /**\n * Read a file with caching. Returns full content on first read or if changed,\n * returns a compact marker if unchanged since last read.\n */\n read(filePath: string, noCache = false): ReadResult {\n let content: string;\n try {\n content = fs.readFileSync(filePath, 'utf8');\n } catch (err: any) {\n throw new Error(`Cannot read file: ${err.message}`);\n }\n\n if (noCache) {\n const hash = this.hashContent(content);\n const previous = this.cache.get(filePath);\n this.cache.set(filePath, {\n contentHash: hash,\n content,\n lastRead: Date.now(),\n readCount: (previous?.readCount ?? 0) + 1,\n });\n this.misses++;\n return { content, cached: false, changed: false };\n }\n\n const hash = this.hashContent(content);\n const existing = this.cache.get(filePath);\n\n if (existing && existing.contentHash === hash) {\n // Cache hit \u2014 file unchanged\n this.hits++;\n existing.lastRead = Date.now();\n existing.readCount++;\n return {\n content: `[cached: file unchanged \u2014 use kirograph_retrieve to get full content, or noCache:true to force re-read]`,\n cached: true,\n changed: false,\n };\n }\n\n // Cache miss or file changed\n this.misses++;\n const previousContent = existing?.content;\n this.cache.set(filePath, {\n contentHash: hash,\n content,\n lastRead: Date.now(),\n readCount: (existing?.readCount ?? 0) + 1,\n });\n\n if (existing) {\n // File changed since last read\n return { content, cached: false, changed: true, previousContent };\n }\n\n // First read\n return { content, cached: false, changed: false };\n }\n\n /**\n * Get the previously cached content for a file (used by diff mode).\n */\n getPreviousContent(filePath: string): string | undefined {\n return this.cache.get(filePath)?.content;\n }\n\n /**\n * Check if a file is in the cache.\n */\n has(filePath: string): boolean {\n return this.cache.has(filePath);\n }\n\n /**\n * Invalidate cache entries for specific files (e.g., after sync).\n */\n invalidate(filePaths: string[]): void {\n for (const fp of filePaths) {\n this.cache.delete(fp);\n }\n }\n\n /**\n * Clear all cached entries.\n */\n clear(): void {\n this.cache.clear();\n this.hits = 0;\n this.misses = 0;\n }\n\n /**\n * Get cache statistics.\n */\n getStats(): CacheStats {\n const total = this.hits + this.misses;\n return {\n entries: this.cache.size,\n hits: this.hits,\n misses: this.misses,\n hitRate: total > 0 ? Math.round((this.hits / total) * 100) : 0,\n };\n }\n\n /**\n * List all cached file paths with their metadata.\n */\n listEntries(): Array<{ path: string; readCount: number; lastRead: number }> {\n return [...this.cache.entries()].map(([p, e]) => ({\n path: p,\n readCount: e.readCount,\n lastRead: e.lastRead,\n }));\n }\n\n private hashContent(content: string): string {\n return crypto.createHash('sha256').update(content).digest('hex');\n }\n\n private formatTimestamp(ts: number): string {\n const diff = Date.now() - ts;\n const seconds = Math.floor(diff / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n return `${hours}h ago`;\n }\n}\n\n// Singleton instance \u2014 session-scoped (lives as long as the MCP server process)\nlet _instance: FileReadCache | null = null;\n\nexport function getFileReadCache(): FileReadCache {\n if (!_instance) {\n _instance = new FileReadCache();\n }\n return _instance;\n}\n\nexport function resetFileReadCache(): void {\n _instance?.clear();\n _instance = null;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["hash"]
|
|
7
7
|
}
|
package/dist/mcp/tool-names.js
CHANGED
|
@@ -40,7 +40,11 @@ const FEATURE_TOOL_SETS = {
|
|
|
40
40
|
"kirograph_mem_capture",
|
|
41
41
|
"kirograph_mem_save_prompt",
|
|
42
42
|
"kirograph_mem_suggest_topic_key",
|
|
43
|
-
"kirograph_mem_conflicts_scan"
|
|
43
|
+
"kirograph_mem_conflicts_scan",
|
|
44
|
+
"kirograph_mem_prune",
|
|
45
|
+
"kirograph_mem_lint",
|
|
46
|
+
"kirograph_mem_conflicts_list",
|
|
47
|
+
"kirograph_mem_conflicts_ignore"
|
|
44
48
|
],
|
|
45
49
|
enableDocs: [
|
|
46
50
|
"kirograph_docs_toc",
|
|
@@ -57,7 +61,9 @@ const FEATURE_TOOL_SETS = {
|
|
|
57
61
|
"kirograph_data_search",
|
|
58
62
|
"kirograph_data_join",
|
|
59
63
|
"kirograph_data_correlations",
|
|
60
|
-
"kirograph_data_quality"
|
|
64
|
+
"kirograph_data_quality",
|
|
65
|
+
"kirograph_data_drift",
|
|
66
|
+
"kirograph_data_history"
|
|
61
67
|
],
|
|
62
68
|
enableSecurity: [
|
|
63
69
|
"kirograph_security",
|
|
@@ -87,12 +93,18 @@ const FEATURE_TOOL_SETS = {
|
|
|
87
93
|
"kirograph_wiki_search",
|
|
88
94
|
"kirograph_wiki_page",
|
|
89
95
|
"kirograph_wiki_lint",
|
|
90
|
-
"kirograph_wiki_list"
|
|
96
|
+
"kirograph_wiki_list",
|
|
97
|
+
"kirograph_wiki_synthesize",
|
|
98
|
+
"kirograph_wiki_init",
|
|
99
|
+
"kirograph_wiki_reindex",
|
|
100
|
+
"kirograph_wiki_status"
|
|
91
101
|
],
|
|
92
102
|
enableCodeHealth: [
|
|
93
103
|
"kirograph_hotspots",
|
|
94
104
|
"kirograph_surprising",
|
|
95
105
|
"kirograph_diff",
|
|
106
|
+
"kirograph_snapshot_save",
|
|
107
|
+
"kirograph_snapshot_list",
|
|
96
108
|
"kirograph_dead_code",
|
|
97
109
|
"kirograph_circular_deps"
|
|
98
110
|
],
|
|
@@ -104,9 +116,18 @@ const FEATURE_TOOL_SETS = {
|
|
|
104
116
|
],
|
|
105
117
|
enableAgentUtils: [
|
|
106
118
|
"kirograph_read",
|
|
119
|
+
"kirograph_retrieve",
|
|
107
120
|
"kirograph_gain",
|
|
108
121
|
"kirograph_budget"
|
|
109
122
|
],
|
|
123
|
+
enableGeneralCompression: [
|
|
124
|
+
"kirograph_compress"
|
|
125
|
+
],
|
|
126
|
+
enableWatchmen: [
|
|
127
|
+
"kirograph_watchmen_status",
|
|
128
|
+
"kirograph_watchmen_synthesize",
|
|
129
|
+
"kirograph_watchmen_reset"
|
|
130
|
+
],
|
|
110
131
|
// Derived from shellCompressionLevel — disabled when compression is off
|
|
111
132
|
enableShellExec: [
|
|
112
133
|
"kirograph_exec"
|
|
@@ -135,10 +156,14 @@ const KIROGRAPH_TOOL_NAMES = [
|
|
|
135
156
|
"kirograph_hotspots",
|
|
136
157
|
"kirograph_surprising",
|
|
137
158
|
"kirograph_diff",
|
|
159
|
+
"kirograph_snapshot_save",
|
|
160
|
+
"kirograph_snapshot_list",
|
|
138
161
|
"kirograph_type_hierarchy",
|
|
139
162
|
"kirograph_exec",
|
|
140
163
|
"kirograph_gain",
|
|
141
164
|
"kirograph_read",
|
|
165
|
+
"kirograph_retrieve",
|
|
166
|
+
"kirograph_compress",
|
|
142
167
|
"kirograph_budget",
|
|
143
168
|
"kirograph_flows",
|
|
144
169
|
"kirograph_communities",
|
|
@@ -155,6 +180,10 @@ const KIROGRAPH_TOOL_NAMES = [
|
|
|
155
180
|
"kirograph_mem_save_prompt",
|
|
156
181
|
"kirograph_mem_suggest_topic_key",
|
|
157
182
|
"kirograph_mem_conflicts_scan",
|
|
183
|
+
"kirograph_mem_prune",
|
|
184
|
+
"kirograph_mem_lint",
|
|
185
|
+
"kirograph_mem_conflicts_list",
|
|
186
|
+
"kirograph_mem_conflicts_ignore",
|
|
158
187
|
"kirograph_docs_toc",
|
|
159
188
|
"kirograph_docs_search",
|
|
160
189
|
"kirograph_docs_section",
|
|
@@ -168,6 +197,8 @@ const KIROGRAPH_TOOL_NAMES = [
|
|
|
168
197
|
"kirograph_data_join",
|
|
169
198
|
"kirograph_data_correlations",
|
|
170
199
|
"kirograph_data_quality",
|
|
200
|
+
"kirograph_data_drift",
|
|
201
|
+
"kirograph_data_history",
|
|
171
202
|
"kirograph_security",
|
|
172
203
|
"kirograph_vulns",
|
|
173
204
|
"kirograph_sbom",
|
|
@@ -191,7 +222,15 @@ const KIROGRAPH_TOOL_NAMES = [
|
|
|
191
222
|
"kirograph_wiki_search",
|
|
192
223
|
"kirograph_wiki_page",
|
|
193
224
|
"kirograph_wiki_lint",
|
|
194
|
-
"kirograph_wiki_list"
|
|
225
|
+
"kirograph_wiki_list",
|
|
226
|
+
"kirograph_wiki_synthesize",
|
|
227
|
+
"kirograph_wiki_init",
|
|
228
|
+
"kirograph_wiki_reindex",
|
|
229
|
+
"kirograph_wiki_status",
|
|
230
|
+
"kirograph_watchmen_status",
|
|
231
|
+
"kirograph_watchmen_synthesize",
|
|
232
|
+
"kirograph_watchmen_reset",
|
|
233
|
+
"kirograph_affected"
|
|
195
234
|
];
|
|
196
235
|
// Annotate the CommonJS export names for ESM import in node:
|
|
197
236
|
0 && (module.exports = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/mcp/tool-names.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Feature flag \u2192 tool names. Used by the MCP server to filter tools/list\n * and by the installer to trim the autoApprove list.\n * Only tools NOT present in any feature set are always-on core tools.\n */\nexport const FEATURE_TOOL_SETS: Record<string, string[]> = {\n enableArchitecture: [\n 'kirograph_architecture',\n 'kirograph_coupling',\n 'kirograph_package',\n ],\n enableMemory: [\n 'kirograph_mem_search',\n 'kirograph_mem_store',\n 'kirograph_mem_timeline',\n 'kirograph_mem_status',\n 'kirograph_mem_review',\n 'kirograph_mem_mark_reviewed',\n 'kirograph_mem_compare',\n 'kirograph_mem_judge',\n 'kirograph_mem_capture',\n 'kirograph_mem_save_prompt',\n 'kirograph_mem_suggest_topic_key',\n 'kirograph_mem_conflicts_scan',\n ],\n enableDocs: [\n 'kirograph_docs_toc',\n 'kirograph_docs_search',\n 'kirograph_docs_section',\n 'kirograph_docs_outline',\n 'kirograph_docs_refs',\n ],\n enableData: [\n 'kirograph_data_list',\n 'kirograph_data_describe',\n 'kirograph_data_query',\n 'kirograph_data_aggregate',\n 'kirograph_data_search',\n 'kirograph_data_join',\n 'kirograph_data_correlations',\n 'kirograph_data_quality',\n ],\n enableSecurity: [\n 'kirograph_security',\n 'kirograph_vulns',\n 'kirograph_vuln_add',\n 'kirograph_vuln_suppress',\n 'kirograph_sbom',\n 'kirograph_vex',\n 'kirograph_reachability',\n 'kirograph_staleness',\n 'kirograph_licenses',\n 'kirograph_attack_surface',\n 'kirograph_secrets',\n 'kirograph_security_flows',\n 'kirograph_supply_chain',\n 'kirograph_dep_confusion',\n 'kirograph_remediation',\n ],\n enablePatterns: [\n 'kirograph_pattern_coverage',\n 'kirograph_pattern_save_baseline',\n 'kirograph_pattern_diff',\n ],\n enableWiki: [\n 'kirograph_wiki_ingest',\n 'kirograph_wiki_apply_diff',\n 'kirograph_wiki_search',\n 'kirograph_wiki_page',\n 'kirograph_wiki_lint',\n 'kirograph_wiki_list',\n ],\n enableCodeHealth: [\n 'kirograph_hotspots',\n 'kirograph_surprising',\n 'kirograph_diff',\n 'kirograph_dead_code',\n 'kirograph_circular_deps',\n ],\n enableAdvancedAnalysis: [\n 'kirograph_type_hierarchy',\n 'kirograph_flows',\n 'kirograph_communities',\n 'kirograph_refactor',\n ],\n enableAgentUtils: [\n 'kirograph_read',\n 'kirograph_gain',\n 'kirograph_budget',\n ],\n // Derived from shellCompressionLevel \u2014 disabled when compression is off\n enableShellExec: [\n 'kirograph_exec',\n ],\n // Disabled when call-site tracking is off\n trackCallSites: [\n 'kirograph_callers',\n 'kirograph_callees',\n ],\n};\n\nexport const KIROGRAPH_TOOL_NAMES = [\n 'kirograph_search',\n 'kirograph_context',\n 'kirograph_callers',\n 'kirograph_callees',\n 'kirograph_impact',\n 'kirograph_node',\n 'kirograph_status',\n 'kirograph_files',\n 'kirograph_dead_code',\n 'kirograph_circular_deps',\n 'kirograph_path',\n 'kirograph_architecture',\n 'kirograph_coupling',\n 'kirograph_package',\n 'kirograph_hotspots',\n 'kirograph_surprising',\n 'kirograph_diff',\n 'kirograph_type_hierarchy',\n 'kirograph_exec',\n 'kirograph_gain',\n 'kirograph_read',\n 'kirograph_budget',\n 'kirograph_flows',\n 'kirograph_communities',\n 'kirograph_refactor',\n 'kirograph_mem_search',\n 'kirograph_mem_store',\n 'kirograph_mem_timeline',\n 'kirograph_mem_status',\n 'kirograph_mem_review',\n 'kirograph_mem_mark_reviewed',\n 'kirograph_mem_compare',\n 'kirograph_mem_judge',\n 'kirograph_mem_capture',\n 'kirograph_mem_save_prompt',\n 'kirograph_mem_suggest_topic_key',\n 'kirograph_mem_conflicts_scan',\n 'kirograph_docs_toc',\n 'kirograph_docs_search',\n 'kirograph_docs_section',\n 'kirograph_docs_outline',\n 'kirograph_docs_refs',\n 'kirograph_data_list',\n 'kirograph_data_describe',\n 'kirograph_data_query',\n 'kirograph_data_aggregate',\n 'kirograph_data_search',\n 'kirograph_data_join',\n 'kirograph_data_correlations',\n 'kirograph_data_quality',\n 'kirograph_security',\n 'kirograph_vulns',\n 'kirograph_sbom',\n 'kirograph_vex',\n 'kirograph_reachability',\n 'kirograph_vuln_add',\n 'kirograph_vuln_suppress',\n 'kirograph_staleness',\n 'kirograph_licenses',\n 'kirograph_attack_surface',\n 'kirograph_secrets',\n 'kirograph_security_flows',\n 'kirograph_supply_chain',\n 'kirograph_dep_confusion',\n 'kirograph_remediation',\n 'kirograph_pattern_coverage',\n 'kirograph_pattern_save_baseline',\n 'kirograph_pattern_diff',\n 'kirograph_wiki_ingest',\n 'kirograph_wiki_apply_diff',\n 'kirograph_wiki_search',\n 'kirograph_wiki_page',\n 'kirograph_wiki_lint',\n 'kirograph_wiki_list',\n];\n\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,MAAM,oBAA8C;AAAA,EACzD,oBAAoB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,wBAAwB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAAA,EAEA,iBAAiB;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAEA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,EACF;AACF;AAEO,MAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
|
|
4
|
+
"sourcesContent": ["/**\n * Feature flag \u2192 tool names. Used by the MCP server to filter tools/list\n * and by the installer to trim the autoApprove list.\n * Only tools NOT present in any feature set are always-on core tools.\n */\nexport const FEATURE_TOOL_SETS: Record<string, string[]> = {\n enableArchitecture: [\n 'kirograph_architecture',\n 'kirograph_coupling',\n 'kirograph_package',\n ],\n enableMemory: [\n 'kirograph_mem_search',\n 'kirograph_mem_store',\n 'kirograph_mem_timeline',\n 'kirograph_mem_status',\n 'kirograph_mem_review',\n 'kirograph_mem_mark_reviewed',\n 'kirograph_mem_compare',\n 'kirograph_mem_judge',\n 'kirograph_mem_capture',\n 'kirograph_mem_save_prompt',\n 'kirograph_mem_suggest_topic_key',\n 'kirograph_mem_conflicts_scan',\n 'kirograph_mem_prune',\n 'kirograph_mem_lint',\n 'kirograph_mem_conflicts_list',\n 'kirograph_mem_conflicts_ignore',\n ],\n enableDocs: [\n 'kirograph_docs_toc',\n 'kirograph_docs_search',\n 'kirograph_docs_section',\n 'kirograph_docs_outline',\n 'kirograph_docs_refs',\n ],\n enableData: [\n 'kirograph_data_list',\n 'kirograph_data_describe',\n 'kirograph_data_query',\n 'kirograph_data_aggregate',\n 'kirograph_data_search',\n 'kirograph_data_join',\n 'kirograph_data_correlations',\n 'kirograph_data_quality',\n 'kirograph_data_drift',\n 'kirograph_data_history',\n ],\n enableSecurity: [\n 'kirograph_security',\n 'kirograph_vulns',\n 'kirograph_vuln_add',\n 'kirograph_vuln_suppress',\n 'kirograph_sbom',\n 'kirograph_vex',\n 'kirograph_reachability',\n 'kirograph_staleness',\n 'kirograph_licenses',\n 'kirograph_attack_surface',\n 'kirograph_secrets',\n 'kirograph_security_flows',\n 'kirograph_supply_chain',\n 'kirograph_dep_confusion',\n 'kirograph_remediation',\n ],\n enablePatterns: [\n 'kirograph_pattern_coverage',\n 'kirograph_pattern_save_baseline',\n 'kirograph_pattern_diff',\n ],\n enableWiki: [\n 'kirograph_wiki_ingest',\n 'kirograph_wiki_apply_diff',\n 'kirograph_wiki_search',\n 'kirograph_wiki_page',\n 'kirograph_wiki_lint',\n 'kirograph_wiki_list',\n 'kirograph_wiki_synthesize',\n 'kirograph_wiki_init',\n 'kirograph_wiki_reindex',\n 'kirograph_wiki_status',\n ],\n enableCodeHealth: [\n 'kirograph_hotspots',\n 'kirograph_surprising',\n 'kirograph_diff',\n 'kirograph_snapshot_save',\n 'kirograph_snapshot_list',\n 'kirograph_dead_code',\n 'kirograph_circular_deps',\n ],\n enableAdvancedAnalysis: [\n 'kirograph_type_hierarchy',\n 'kirograph_flows',\n 'kirograph_communities',\n 'kirograph_refactor',\n ],\n enableAgentUtils: [\n 'kirograph_read',\n 'kirograph_retrieve',\n 'kirograph_gain',\n 'kirograph_budget',\n ],\n enableGeneralCompression: [\n 'kirograph_compress',\n ],\n enableWatchmen: [\n 'kirograph_watchmen_status',\n 'kirograph_watchmen_synthesize',\n 'kirograph_watchmen_reset',\n ],\n // Derived from shellCompressionLevel \u2014 disabled when compression is off\n enableShellExec: [\n 'kirograph_exec',\n ],\n // Disabled when call-site tracking is off\n trackCallSites: [\n 'kirograph_callers',\n 'kirograph_callees',\n ],\n};\n\nexport const KIROGRAPH_TOOL_NAMES = [\n 'kirograph_search',\n 'kirograph_context',\n 'kirograph_callers',\n 'kirograph_callees',\n 'kirograph_impact',\n 'kirograph_node',\n 'kirograph_status',\n 'kirograph_files',\n 'kirograph_dead_code',\n 'kirograph_circular_deps',\n 'kirograph_path',\n 'kirograph_architecture',\n 'kirograph_coupling',\n 'kirograph_package',\n 'kirograph_hotspots',\n 'kirograph_surprising',\n 'kirograph_diff',\n 'kirograph_snapshot_save',\n 'kirograph_snapshot_list',\n 'kirograph_type_hierarchy',\n 'kirograph_exec',\n 'kirograph_gain',\n 'kirograph_read',\n 'kirograph_retrieve',\n 'kirograph_compress',\n 'kirograph_budget',\n 'kirograph_flows',\n 'kirograph_communities',\n 'kirograph_refactor',\n 'kirograph_mem_search',\n 'kirograph_mem_store',\n 'kirograph_mem_timeline',\n 'kirograph_mem_status',\n 'kirograph_mem_review',\n 'kirograph_mem_mark_reviewed',\n 'kirograph_mem_compare',\n 'kirograph_mem_judge',\n 'kirograph_mem_capture',\n 'kirograph_mem_save_prompt',\n 'kirograph_mem_suggest_topic_key',\n 'kirograph_mem_conflicts_scan',\n 'kirograph_mem_prune',\n 'kirograph_mem_lint',\n 'kirograph_mem_conflicts_list',\n 'kirograph_mem_conflicts_ignore',\n 'kirograph_docs_toc',\n 'kirograph_docs_search',\n 'kirograph_docs_section',\n 'kirograph_docs_outline',\n 'kirograph_docs_refs',\n 'kirograph_data_list',\n 'kirograph_data_describe',\n 'kirograph_data_query',\n 'kirograph_data_aggregate',\n 'kirograph_data_search',\n 'kirograph_data_join',\n 'kirograph_data_correlations',\n 'kirograph_data_quality',\n 'kirograph_data_drift',\n 'kirograph_data_history',\n 'kirograph_security',\n 'kirograph_vulns',\n 'kirograph_sbom',\n 'kirograph_vex',\n 'kirograph_reachability',\n 'kirograph_vuln_add',\n 'kirograph_vuln_suppress',\n 'kirograph_staleness',\n 'kirograph_licenses',\n 'kirograph_attack_surface',\n 'kirograph_secrets',\n 'kirograph_security_flows',\n 'kirograph_supply_chain',\n 'kirograph_dep_confusion',\n 'kirograph_remediation',\n 'kirograph_pattern_coverage',\n 'kirograph_pattern_save_baseline',\n 'kirograph_pattern_diff',\n 'kirograph_wiki_ingest',\n 'kirograph_wiki_apply_diff',\n 'kirograph_wiki_search',\n 'kirograph_wiki_page',\n 'kirograph_wiki_lint',\n 'kirograph_wiki_list',\n 'kirograph_wiki_synthesize',\n 'kirograph_wiki_init',\n 'kirograph_wiki_reindex',\n 'kirograph_wiki_status',\n 'kirograph_watchmen_status',\n 'kirograph_watchmen_synthesize',\n 'kirograph_watchmen_reset',\n 'kirograph_affected',\n];\n\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,MAAM,oBAA8C;AAAA,EACzD,oBAAoB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,wBAAwB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,0BAA0B;AAAA,IACxB;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAAA,EAEA,iBAAiB;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAEA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,EACF;AACF;AAEO,MAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|