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,242 @@
|
|
|
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 hook_exports = {};
|
|
30
|
+
__export(hook_exports, {
|
|
31
|
+
register: () => register
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(hook_exports);
|
|
34
|
+
var path = __toESM(require("path"));
|
|
35
|
+
var import_manager = require("../../hooks/manager");
|
|
36
|
+
var import_prompt = require("../../hooks/prompt");
|
|
37
|
+
var import_ui = require("../ui");
|
|
38
|
+
function hookChoiceOption(h) {
|
|
39
|
+
return {
|
|
40
|
+
label: h.displayName,
|
|
41
|
+
value: h.filename,
|
|
42
|
+
description: h.description
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function hookSummaryLabel(hooks, filename) {
|
|
46
|
+
const hook = hooks.find((h) => h.filename === filename);
|
|
47
|
+
if (!hook) return filename;
|
|
48
|
+
return hook.displayName;
|
|
49
|
+
}
|
|
50
|
+
function register(program) {
|
|
51
|
+
const hookCmd = program.command("hook").description("Manage global hooks: save, import, and list");
|
|
52
|
+
hookCmd.command("save").description("Save workspace hooks to the global store").argument("[projectPath]", "Project root path (optional)").option("--all", "Save all hooks without prompting").action(async (projectPath, opts) => {
|
|
53
|
+
const target = path.resolve(projectPath ?? process.cwd());
|
|
54
|
+
let globalDir;
|
|
55
|
+
try {
|
|
56
|
+
globalDir = (0, import_manager.getGlobalHooksDir)();
|
|
57
|
+
} catch (err) {
|
|
58
|
+
console.error(` \u2716 ${err.message}`);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
const workspaceDir = (0, import_manager.getWorkspaceHooksDir)(target);
|
|
62
|
+
const hooks = (0, import_manager.listHooks)(workspaceDir);
|
|
63
|
+
if (hooks.length === 0) {
|
|
64
|
+
console.log(` ${import_ui.dim}No hooks found in workspace${import_ui.reset}`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
let filesToSave;
|
|
68
|
+
if (opts.all || !(0, import_prompt.isInteractive)()) {
|
|
69
|
+
filesToSave = hooks.map((h) => h.filename);
|
|
70
|
+
} else {
|
|
71
|
+
const choice = await (0, import_prompt.singleChoice)("Save workspace hooks globally:", [
|
|
72
|
+
{ label: "All", value: "all" },
|
|
73
|
+
{ label: "Select specific hooks", value: "select" },
|
|
74
|
+
{ label: "Cancel", value: "cancel" }
|
|
75
|
+
]);
|
|
76
|
+
if (choice === "cancel") {
|
|
77
|
+
console.log(` ${import_ui.dim}No hooks saved${import_ui.reset}`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (choice === "all") {
|
|
81
|
+
filesToSave = hooks.map((h) => h.filename);
|
|
82
|
+
} else {
|
|
83
|
+
const hookOptions = hooks.map(hookChoiceOption);
|
|
84
|
+
const selected = await (0, import_prompt.multiSelect)(
|
|
85
|
+
"Select hooks to save globally:",
|
|
86
|
+
hookOptions,
|
|
87
|
+
{ emptySelection: "focused" }
|
|
88
|
+
);
|
|
89
|
+
if (selected.length === 0) {
|
|
90
|
+
console.log(` ${import_ui.dim}No hooks saved${import_ui.reset}`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
filesToSave = selected;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
(0, import_manager.ensureDir)(globalDir);
|
|
98
|
+
const copied = (0, import_manager.copyHooks)(workspaceDir, globalDir, filesToSave);
|
|
99
|
+
console.log(` ${import_ui.green}\u2713${import_ui.reset} Saved ${copied.length} hook${copied.length === 1 ? "" : "s"} to global store:`);
|
|
100
|
+
for (const f of copied) {
|
|
101
|
+
console.log(` ${hookSummaryLabel(hooks, f)}`);
|
|
102
|
+
}
|
|
103
|
+
} catch (err) {
|
|
104
|
+
console.error(` \u2716 ${err.message}`);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
hookCmd.command("import").description("Import hooks from the global store into the workspace").argument("[projectPath]", "Project root path (optional)").option("--all", "Import all hooks without prompting").action(async (projectPath, opts) => {
|
|
109
|
+
const target = path.resolve(projectPath ?? process.cwd());
|
|
110
|
+
let globalDir;
|
|
111
|
+
try {
|
|
112
|
+
globalDir = (0, import_manager.getGlobalHooksDir)();
|
|
113
|
+
} catch (err) {
|
|
114
|
+
console.error(` \u2716 ${err.message}`);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
const hooks = (0, import_manager.listHooks)(globalDir);
|
|
118
|
+
if (hooks.length === 0) {
|
|
119
|
+
console.log(` ${import_ui.dim}No global hooks found${import_ui.reset}`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
let filesToImport;
|
|
123
|
+
if (opts.all || !(0, import_prompt.isInteractive)()) {
|
|
124
|
+
filesToImport = hooks.map((h) => h.filename);
|
|
125
|
+
} else {
|
|
126
|
+
const choice = await (0, import_prompt.singleChoice)("Import global hooks:", [
|
|
127
|
+
{ label: "All", value: "all" },
|
|
128
|
+
{ label: "Select specific hooks", value: "select" },
|
|
129
|
+
{ label: "Cancel", value: "cancel" }
|
|
130
|
+
]);
|
|
131
|
+
if (choice === "cancel") {
|
|
132
|
+
console.log(` ${import_ui.dim}No hooks imported${import_ui.reset}`);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (choice === "all") {
|
|
136
|
+
filesToImport = hooks.map((h) => h.filename);
|
|
137
|
+
} else {
|
|
138
|
+
const options = hooks.map(hookChoiceOption);
|
|
139
|
+
const selected = await (0, import_prompt.multiSelect)("Select hooks to import:", options);
|
|
140
|
+
if (selected.length === 0) {
|
|
141
|
+
console.log(` ${import_ui.dim}No hooks imported${import_ui.reset}`);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
filesToImport = selected;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const workspaceDir = (0, import_manager.getWorkspaceHooksDir)(target);
|
|
148
|
+
try {
|
|
149
|
+
(0, import_manager.ensureDir)(workspaceDir);
|
|
150
|
+
const copied = (0, import_manager.copyHooks)(globalDir, workspaceDir, filesToImport);
|
|
151
|
+
console.log(` ${import_ui.green}\u2713${import_ui.reset} Imported ${copied.length} hook${copied.length === 1 ? "" : "s"}:`);
|
|
152
|
+
for (const f of copied) {
|
|
153
|
+
console.log(` ${hookSummaryLabel(hooks, f)}`);
|
|
154
|
+
}
|
|
155
|
+
} catch (err) {
|
|
156
|
+
console.error(` \u2716 ${err.message}`);
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
hookCmd.command("remove").description("Remove hooks from the global store").option("--all", "Remove all hooks without prompting").action(async (opts) => {
|
|
161
|
+
let globalDir;
|
|
162
|
+
try {
|
|
163
|
+
globalDir = (0, import_manager.getGlobalHooksDir)();
|
|
164
|
+
} catch (err) {
|
|
165
|
+
console.error(` \u2716 ${err.message}`);
|
|
166
|
+
process.exit(1);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const hooks = (0, import_manager.listHooks)(globalDir);
|
|
170
|
+
if (hooks.length === 0) {
|
|
171
|
+
console.log(` ${import_ui.dim}No global hooks saved${import_ui.reset}`);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
let filesToRemove;
|
|
175
|
+
if (opts.all || !(0, import_prompt.isInteractive)()) {
|
|
176
|
+
filesToRemove = hooks.map((h) => h.filename);
|
|
177
|
+
} else {
|
|
178
|
+
const choice = await (0, import_prompt.singleChoice)("Remove global hooks:", [
|
|
179
|
+
{ label: "Select specific hooks", value: "select" },
|
|
180
|
+
{ label: "All", value: "all" },
|
|
181
|
+
{ label: "Cancel", value: "cancel" }
|
|
182
|
+
]);
|
|
183
|
+
if (choice === "cancel") {
|
|
184
|
+
console.log(` ${import_ui.dim}No hooks removed${import_ui.reset}`);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (choice === "all") {
|
|
188
|
+
filesToRemove = hooks.map((h) => h.filename);
|
|
189
|
+
} else {
|
|
190
|
+
const selected = await (0, import_prompt.multiSelect)(
|
|
191
|
+
"Select hooks to remove:",
|
|
192
|
+
hooks.map(hookChoiceOption),
|
|
193
|
+
{ emptySelection: "focused" }
|
|
194
|
+
);
|
|
195
|
+
if (selected.length === 0) {
|
|
196
|
+
console.log(` ${import_ui.dim}No hooks removed${import_ui.reset}`);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
filesToRemove = selected;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
const removed = (0, import_manager.removeHooks)(globalDir, filesToRemove);
|
|
204
|
+
console.log(` ${import_ui.green}\u2713${import_ui.reset} Removed ${removed.length} hook${removed.length === 1 ? "" : "s"} from global store:`);
|
|
205
|
+
for (const f of removed) {
|
|
206
|
+
console.log(` ${hookSummaryLabel(hooks, f)}`);
|
|
207
|
+
}
|
|
208
|
+
} catch (err) {
|
|
209
|
+
console.error(` \u2716 ${err.message}`);
|
|
210
|
+
process.exit(1);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
hookCmd.command("list").description("List all saved global hooks").action(() => {
|
|
214
|
+
let globalDir;
|
|
215
|
+
try {
|
|
216
|
+
globalDir = (0, import_manager.getGlobalHooksDir)();
|
|
217
|
+
} catch (err) {
|
|
218
|
+
console.error(` \u2716 ${err.message}`);
|
|
219
|
+
process.exit(1);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const hooks = (0, import_manager.listHooks)(globalDir);
|
|
223
|
+
if (hooks.length === 0) {
|
|
224
|
+
console.log(` ${import_ui.dim}No global hooks saved${import_ui.reset}`);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
console.log(` ${import_ui.dim}Global hooks:${import_ui.reset}`);
|
|
228
|
+
for (const hook of hooks) {
|
|
229
|
+
if (hook.description) {
|
|
230
|
+
console.log(` ${hook.displayName} ${import_ui.dim}(${hook.description})${import_ui.reset}`);
|
|
231
|
+
} else {
|
|
232
|
+
console.log(` ${hook.displayName}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
return hookCmd;
|
|
237
|
+
}
|
|
238
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
239
|
+
0 && (module.exports = {
|
|
240
|
+
register
|
|
241
|
+
});
|
|
242
|
+
//# sourceMappingURL=hook.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/bin/commands/hook.ts"],
|
|
4
|
+
"sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport {\n getGlobalHooksDir,\n getWorkspaceHooksDir,\n listHooks,\n copyHooks,\n removeHooks,\n ensureDir,\n} from '../../hooks/manager';\nimport { singleChoice, multiSelect, isInteractive } from '../../hooks/prompt';\nimport { dim, reset, green } from '../ui';\n\nfunction hookChoiceOption(h: { displayName: string; filename: string; description?: string }) {\n return {\n label: h.displayName,\n value: h.filename,\n description: h.description,\n };\n}\n\nfunction hookSummaryLabel(\n hooks: Array<{ filename: string; displayName: string; description?: string }>,\n filename: string\n): string {\n const hook = hooks.find((h) => h.filename === filename);\n if (!hook) return filename;\n return hook.displayName;\n}\n\n/**\n * Register the `hook` command group with save, import, and list subcommands.\n * Returns the hook Command so it can be extended.\n */\nexport function register(program: Command): Command {\n const hookCmd = program\n .command('hook')\n .description('Manage global hooks: save, import, and list');\n\n // \u2500\u2500 hook save \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n hookCmd\n .command('save')\n .description('Save workspace hooks to the global store')\n .argument('[projectPath]', 'Project root path (optional)')\n .option('--all', 'Save all hooks without prompting')\n .action(async (projectPath: string | undefined, opts: { all?: boolean }) => {\n const target = path.resolve(projectPath ?? process.cwd());\n\n let globalDir: string;\n try {\n globalDir = getGlobalHooksDir();\n } catch (err: unknown) {\n console.error(` \u2716 ${(err as Error).message}`);\n process.exit(1);\n }\n\n const workspaceDir = getWorkspaceHooksDir(target);\n const hooks = listHooks(workspaceDir);\n\n if (hooks.length === 0) {\n console.log(` ${dim}No hooks found in workspace${reset}`);\n return;\n }\n\n let filesToSave: string[];\n\n if (opts.all || !isInteractive()) {\n filesToSave = hooks.map((h) => h.filename);\n } else {\n const choice = await singleChoice('Save workspace hooks globally:', [\n { label: 'All', value: 'all' },\n { label: 'Select specific hooks', value: 'select' },\n { label: 'Cancel', value: 'cancel' },\n ]);\n\n if (choice === 'cancel') {\n console.log(` ${dim}No hooks saved${reset}`);\n return;\n }\n\n if (choice === 'all') {\n filesToSave = hooks.map((h) => h.filename);\n } else {\n const hookOptions = hooks.map(hookChoiceOption);\n const selected = await multiSelect(\n 'Select hooks to save globally:',\n hookOptions,\n { emptySelection: 'focused' }\n );\n if (selected.length === 0) {\n console.log(` ${dim}No hooks saved${reset}`);\n return;\n }\n filesToSave = selected;\n }\n }\n\n try {\n ensureDir(globalDir);\n const copied = copyHooks(workspaceDir, globalDir, filesToSave);\n console.log(` ${green}\u2713${reset} Saved ${copied.length} hook${copied.length === 1 ? '' : 's'} to global store:`);\n for (const f of copied) {\n console.log(` ${hookSummaryLabel(hooks, f)}`);\n }\n } catch (err: unknown) {\n console.error(` \u2716 ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // \u2500\u2500 hook import \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n hookCmd\n .command('import')\n .description('Import hooks from the global store into the workspace')\n .argument('[projectPath]', 'Project root path (optional)')\n .option('--all', 'Import all hooks without prompting')\n .action(async (projectPath: string | undefined, opts: { all?: boolean }) => {\n const target = path.resolve(projectPath ?? process.cwd());\n\n let globalDir: string;\n try {\n globalDir = getGlobalHooksDir();\n } catch (err: unknown) {\n console.error(` \u2716 ${(err as Error).message}`);\n process.exit(1);\n }\n\n const hooks = listHooks(globalDir);\n\n if (hooks.length === 0) {\n console.log(` ${dim}No global hooks found${reset}`);\n return;\n }\n\n let filesToImport: string[];\n\n if (opts.all || !isInteractive()) {\n filesToImport = hooks.map((h) => h.filename);\n } else {\n const choice = await singleChoice('Import global hooks:', [\n { label: 'All', value: 'all' },\n { label: 'Select specific hooks', value: 'select' },\n { label: 'Cancel', value: 'cancel' },\n ]);\n\n if (choice === 'cancel') {\n console.log(` ${dim}No hooks imported${reset}`);\n return;\n }\n\n if (choice === 'all') {\n filesToImport = hooks.map((h) => h.filename);\n } else {\n const options = hooks.map(hookChoiceOption);\n const selected = await multiSelect('Select hooks to import:', options);\n if (selected.length === 0) {\n console.log(` ${dim}No hooks imported${reset}`);\n return;\n }\n filesToImport = selected;\n }\n }\n\n const workspaceDir = getWorkspaceHooksDir(target);\n\n try {\n ensureDir(workspaceDir);\n const copied = copyHooks(globalDir, workspaceDir, filesToImport);\n console.log(` ${green}\u2713${reset} Imported ${copied.length} hook${copied.length === 1 ? '' : 's'}:`);\n for (const f of copied) {\n console.log(` ${hookSummaryLabel(hooks, f)}`);\n }\n } catch (err: unknown) {\n console.error(` \u2716 ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // \u2500\u2500 hook remove \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n hookCmd\n .command('remove')\n .description('Remove hooks from the global store')\n .option('--all', 'Remove all hooks without prompting')\n .action(async (opts: { all?: boolean }) => {\n let globalDir: string;\n try {\n globalDir = getGlobalHooksDir();\n } catch (err: unknown) {\n console.error(` \u2716 ${(err as Error).message}`);\n process.exit(1);\n return;\n }\n\n const hooks = listHooks(globalDir);\n\n if (hooks.length === 0) {\n console.log(` ${dim}No global hooks saved${reset}`);\n return;\n }\n\n let filesToRemove: string[];\n\n if (opts.all || !isInteractive()) {\n filesToRemove = hooks.map((h) => h.filename);\n } else {\n const choice = await singleChoice('Remove global hooks:', [\n { label: 'Select specific hooks', value: 'select' },\n { label: 'All', value: 'all' },\n { label: 'Cancel', value: 'cancel' },\n ]);\n\n if (choice === 'cancel') {\n console.log(` ${dim}No hooks removed${reset}`);\n return;\n }\n\n if (choice === 'all') {\n filesToRemove = hooks.map((h) => h.filename);\n } else {\n const selected = await multiSelect(\n 'Select hooks to remove:',\n hooks.map(hookChoiceOption),\n { emptySelection: 'focused' }\n );\n if (selected.length === 0) {\n console.log(` ${dim}No hooks removed${reset}`);\n return;\n }\n filesToRemove = selected;\n }\n }\n\n try {\n const removed = removeHooks(globalDir, filesToRemove);\n console.log(` ${green}\u2713${reset} Removed ${removed.length} hook${removed.length === 1 ? '' : 's'} from global store:`);\n for (const f of removed) {\n console.log(` ${hookSummaryLabel(hooks, f)}`);\n }\n } catch (err: unknown) {\n console.error(` \u2716 ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // \u2500\u2500 hook list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n hookCmd\n .command('list')\n .description('List all saved global hooks')\n .action(() => {\n let globalDir: string;\n try {\n globalDir = getGlobalHooksDir();\n } catch (err: unknown) {\n console.error(` \u2716 ${(err as Error).message}`);\n process.exit(1);\n return;\n }\n\n const hooks = listHooks(globalDir);\n\n if (hooks.length === 0) {\n console.log(` ${dim}No global hooks saved${reset}`);\n return;\n }\n\n console.log(` ${dim}Global hooks:${reset}`);\n for (const hook of hooks) {\n if (hook.description) {\n console.log(` ${hook.displayName} ${dim}(${hook.description})${reset}`);\n } else {\n console.log(` ${hook.displayName}`);\n }\n }\n });\n\n return hookCmd;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
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 impact_exports = {};
|
|
30
|
+
__export(impact_exports, {
|
|
31
|
+
register: () => register
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(impact_exports);
|
|
34
|
+
var path = __toESM(require("path"));
|
|
35
|
+
var import_ui = require("../ui");
|
|
36
|
+
function register(program) {
|
|
37
|
+
program.command("impact <symbol>").description("Show symbols that would be affected by changing a given symbol").option("-d, --depth <n>", "Max traversal depth (default: 2)", "2").option("-j, --json", "Output as JSON").option("-p, --path <path>", "Project path").action(async (symbol, opts) => {
|
|
38
|
+
const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
|
|
39
|
+
const target = path.resolve(opts.path ?? process.cwd());
|
|
40
|
+
const cg = await KiroGraph.open(target);
|
|
41
|
+
const results = cg.searchNodes(symbol, void 0, 5);
|
|
42
|
+
if (results.length === 0) {
|
|
43
|
+
console.error(` \u2716 Symbol "${symbol}" not found in index.`);
|
|
44
|
+
cg.close();
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
const node = results[0].node;
|
|
48
|
+
const depth = Math.max(1, Math.min(10, parseInt(opts.depth) || 2));
|
|
49
|
+
const affected = await cg.getImpactRadius(node.id, depth);
|
|
50
|
+
if (opts.json) {
|
|
51
|
+
console.log(JSON.stringify({ symbol: node.name, depth, affected }));
|
|
52
|
+
cg.close();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (affected.length === 0) {
|
|
56
|
+
console.log(`
|
|
57
|
+
${import_ui.dim}No dependents found for \`${node.name}\`.${import_ui.reset}
|
|
58
|
+
`);
|
|
59
|
+
cg.close();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
console.log(`
|
|
63
|
+
${import_ui.violet}${import_ui.bold}Impact of \`${node.name}\`${import_ui.reset} ${import_ui.dim}(${affected.length} symbol(s) affected, depth: ${depth})${import_ui.reset}
|
|
64
|
+
`);
|
|
65
|
+
for (const n of affected) {
|
|
66
|
+
console.log(` ${import_ui.violet}${n.name}${import_ui.reset} ${import_ui.dim}${n.kind} ${n.filePath}:${n.startLine}${import_ui.reset}`);
|
|
67
|
+
}
|
|
68
|
+
console.log();
|
|
69
|
+
cg.close();
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
73
|
+
0 && (module.exports = {
|
|
74
|
+
register
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=impact.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/bin/commands/impact.ts"],
|
|
4
|
+
"sourcesContent": ["import * as path from 'path';\nimport { Command } from 'commander';\nimport { bold, dim, reset, violet } from '../ui';\n\nexport function register(program: Command): void {\n program\n .command('impact <symbol>')\n .description('Show symbols that would be affected by changing a given symbol')\n .option('-d, --depth <n>', 'Max traversal depth (default: 2)', '2')\n .option('-j, --json', 'Output as JSON')\n .option('-p, --path <path>', 'Project path')\n .action(async (symbol: string, opts: { depth: string; json?: boolean; path?: string }) => {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const target = path.resolve(opts.path ?? process.cwd());\n const cg = await KiroGraph.open(target);\n\n const results = cg.searchNodes(symbol, undefined, 5);\n if (results.length === 0) {\n console.error(` \u2716 Symbol \"${symbol}\" not found in index.`);\n cg.close(); process.exit(1);\n }\n\n const node = results[0].node;\n const depth = Math.max(1, Math.min(10, parseInt(opts.depth) || 2));\n const affected = await cg.getImpactRadius(node.id, depth);\n\n if (opts.json) {\n console.log(JSON.stringify({ symbol: node.name, depth, affected }));\n cg.close(); return;\n }\n\n if (affected.length === 0) {\n console.log(`\\n ${dim}No dependents found for \\`${node.name}\\`.${reset}\\n`);\n cg.close(); return;\n }\n\n console.log(`\\n ${violet}${bold}Impact of \\`${node.name}\\`${reset} ${dim}(${affected.length} symbol(s) affected, depth: ${depth})${reset}\\n`);\n for (const n of affected) {\n console.log(` ${violet}${n.name}${reset} ${dim}${n.kind} ${n.filePath}:${n.startLine}${reset}`);\n }\n console.log();\n cg.close();\n });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAsB;AAEtB,gBAAyC;AAElC,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,iBAAiB,EACzB,YAAY,gEAAgE,EAC5E,OAAO,mBAAmB,oCAAoC,GAAG,EACjE,OAAO,cAAc,gBAAgB,EACrC,OAAO,qBAAqB,cAAc,EAC1C,OAAO,OAAO,QAAgB,SAA2D;AACxF,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,UAAM,SAAS,KAAK,QAAQ,KAAK,QAAQ,QAAQ,IAAI,CAAC;AACtD,UAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AAEtC,UAAM,UAAU,GAAG,YAAY,QAAQ,QAAW,CAAC;AACnD,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,MAAM,oBAAe,MAAM,uBAAuB;AAC1D,SAAG,MAAM;AAAG,cAAQ,KAAK,CAAC;AAAA,IAC5B;AAEA,UAAM,OAAO,QAAQ,CAAC,EAAE;AACxB,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,SAAS,KAAK,KAAK,KAAK,CAAC,CAAC;AACjE,UAAM,WAAW,MAAM,GAAG,gBAAgB,KAAK,IAAI,KAAK;AAExD,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,KAAK,MAAM,OAAO,SAAS,CAAC,CAAC;AAClE,SAAG,MAAM;AAAG;AAAA,IACd;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,cAAQ,IAAI;AAAA,IAAO,aAAG,6BAA6B,KAAK,IAAI,MAAM,eAAK;AAAA,CAAI;AAC3E,SAAG,MAAM;AAAG;AAAA,IACd;AAEA,YAAQ,IAAI;AAAA,IAAO,gBAAM,GAAG,cAAI,eAAe,KAAK,IAAI,KAAK,eAAK,KAAK,aAAG,IAAI,SAAS,MAAM,+BAA+B,KAAK,IAAI,eAAK;AAAA,CAAI;AAC9I,eAAW,KAAK,UAAU;AACxB,cAAQ,IAAI,KAAK,gBAAM,GAAG,EAAE,IAAI,GAAG,eAAK,KAAK,aAAG,GAAG,EAAE,IAAI,KAAK,EAAE,QAAQ,IAAI,EAAE,SAAS,GAAG,eAAK,EAAE;AAAA,IACnG;AACA,YAAQ,IAAI;AACZ,OAAG,MAAM;AAAA,EACX,CAAC;AACL;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/bin/commands/init.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { printBanner } from '../banner';\nimport { renderIndexProgress } from '../progress';\nimport { dim, reset, violet, bold, green, value } from '../ui';\nimport { warnFallback } from './utils';\n\nexport function register(program: Command): void {\n program\n .command('init [projectPath]')\n .description('Initialize KiroGraph in a project')\n .option('-i, --index', 'Index immediately after init')\n .action(async (projectPath: string | undefined, opts: { index?: boolean }) => {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const target = path.resolve(projectPath ?? process.cwd());\n if (KiroGraph.isInitialized(target)) {\n console.log(` ${dim}KiroGraph already initialized at ${target}${reset}`);\n } else {\n await KiroGraph.init(target);\n console.log(` ${green}\u2713${reset} Initialized ${violet}${bold}.kirograph/${reset} in ${dim}${target}${reset}`);\n }\n if (opts.index) {\n const cg = await KiroGraph.open(target);\n console.log(`\\n ${dim}Indexing...${reset}`);\n const result = await cg.indexAll({\n force: true,\n onProgress: renderIndexProgress,\n });\n process.stdout.write('\\n');\n console.log(` ${green}\u2713${reset} ${value(String(result.filesIndexed))} ${dim}files,${reset} ${value(String(result.nodesCreated))} ${dim}symbols,${reset} ${value(String(result.edgesCreated))} ${dim}edges${reset} ${dim}(${result.duration}ms)${reset}`);\n if (result.errors.length) console.warn(` \\x1b[33m\u26A0 ${result.errors.length} warning(s)\\x1b[0m`);\n warnFallback(cg.getEngineFallback());\n cg.close();\n }\n });\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,WAAsB;AAEtB,sBAAoC;AACpC,gBAAuD;AACvD,mBAA6B;AAEtB,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,oBAAoB,EAC5B,YAAY,mCAAmC,EAC/C,OAAO,eAAe,8BAA8B,EACpD,OAAO,OAAO,aAAiC,SAA8B;AAC5E,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,UAAM,SAAS,KAAK,QAAQ,eAAe,QAAQ,IAAI,CAAC;AACxD,QAAI,UAAU,cAAc,MAAM,GAAG;AACnC,cAAQ,IAAI,KAAK,aAAG,oCAAoC,MAAM,GAAG,eAAK,EAAE;AAAA,IAC1E,OAAO;AACL,YAAM,UAAU,KAAK,MAAM;AAC3B,cAAQ,IAAI,KAAK,eAAK,SAAI,eAAK,gBAAgB,gBAAM,GAAG,cAAI,cAAc,eAAK,OAAO,aAAG,GAAG,MAAM,GAAG,eAAK,EAAE;AAAA,IAC9G;
|
|
4
|
+
"sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { printBanner } from '../banner';\nimport { renderIndexProgress } from '../progress';\nimport { dim, reset, violet, bold, green, value } from '../ui';\nimport { warnFallback } from './utils';\n\nexport function register(program: Command): void {\n program\n .command('init [projectPath]')\n .description('Initialize KiroGraph in a project')\n .option('-i, --index', 'Index immediately after init')\n .action(async (projectPath: string | undefined, opts: { index?: boolean }) => {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const target = path.resolve(projectPath ?? process.cwd());\n if (KiroGraph.isInitialized(target)) {\n console.log(` ${dim}KiroGraph already initialized at ${target}${reset}`);\n } else {\n await KiroGraph.init(target);\n console.log(` ${green}\u2713${reset} Initialized ${violet}${bold}.kirograph/${reset} in ${dim}${target}${reset}`);\n }\n\n if (opts.index) {\n const cg = await KiroGraph.open(target);\n console.log(`\\n ${dim}Indexing...${reset}`);\n const result = await cg.indexAll({\n force: true,\n onProgress: renderIndexProgress,\n });\n process.stdout.write('\\n');\n console.log(` ${green}\u2713${reset} ${value(String(result.filesIndexed))} ${dim}files,${reset} ${value(String(result.nodesCreated))} ${dim}symbols,${reset} ${value(String(result.edgesCreated))} ${dim}edges${reset} ${dim}(${result.duration}ms)${reset}`);\n if (result.errors.length) console.warn(` \\x1b[33m\u26A0 ${result.errors.length} warning(s)\\x1b[0m`);\n warnFallback(cg.getEngineFallback());\n cg.close();\n }\n });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,WAAsB;AAEtB,sBAAoC;AACpC,gBAAuD;AACvD,mBAA6B;AAEtB,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,oBAAoB,EAC5B,YAAY,mCAAmC,EAC/C,OAAO,eAAe,8BAA8B,EACpD,OAAO,OAAO,aAAiC,SAA8B;AAC5E,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,UAAM,SAAS,KAAK,QAAQ,eAAe,QAAQ,IAAI,CAAC;AACxD,QAAI,UAAU,cAAc,MAAM,GAAG;AACnC,cAAQ,IAAI,KAAK,aAAG,oCAAoC,MAAM,GAAG,eAAK,EAAE;AAAA,IAC1E,OAAO;AACL,YAAM,UAAU,KAAK,MAAM;AAC3B,cAAQ,IAAI,KAAK,eAAK,SAAI,eAAK,gBAAgB,gBAAM,GAAG,cAAI,cAAc,eAAK,OAAO,aAAG,GAAG,MAAM,GAAG,eAAK,EAAE;AAAA,IAC9G;AAEA,QAAI,KAAK,OAAO;AACd,YAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AACtC,cAAQ,IAAI;AAAA,IAAO,aAAG,cAAc,eAAK,EAAE;AAC3C,YAAM,SAAS,MAAM,GAAG,SAAS;AAAA,QAC/B,OAAO;AAAA,QACP,YAAY;AAAA,MACd,CAAC;AACD,cAAQ,OAAO,MAAM,IAAI;AACzB,cAAQ,IAAI,KAAK,eAAK,SAAI,eAAK,QAAI,iBAAM,OAAO,OAAO,YAAY,CAAC,CAAC,IAAI,aAAG,SAAS,eAAK,QAAI,iBAAM,OAAO,OAAO,YAAY,CAAC,CAAC,IAAI,aAAG,WAAW,eAAK,QAAI,iBAAM,OAAO,OAAO,YAAY,CAAC,CAAC,IAAI,aAAG,QAAQ,eAAK,IAAI,aAAG,IAAI,OAAO,QAAQ,MAAM,eAAK,EAAE;AACxP,UAAI,OAAO,OAAO,OAAQ,SAAQ,KAAK,oBAAe,OAAO,OAAO,MAAM,oBAAoB;AAC9F,qCAAa,GAAG,kBAAkB,CAAC;AACnC,SAAG,MAAM;AAAA,IACX;AAAA,EACF,CAAC;AACL;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,76 @@
|
|
|
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 type_hierarchy_exports = {};
|
|
30
|
+
__export(type_hierarchy_exports, {
|
|
31
|
+
register: () => register
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(type_hierarchy_exports);
|
|
34
|
+
var path = __toESM(require("path"));
|
|
35
|
+
var import_ui = require("../ui");
|
|
36
|
+
function register(program) {
|
|
37
|
+
program.command("type-hierarchy <symbol>").description("Traverse the type hierarchy of a class or interface (base types and derived types)").option("--direction <dir>", "Direction: up (base types), down (derived types), both (default)", "both").option("-j, --json", "Output as JSON").option("-p, --path <path>", "Project path").action(async (symbol, opts) => {
|
|
38
|
+
const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
|
|
39
|
+
const target = path.resolve(opts.path ?? process.cwd());
|
|
40
|
+
const cg = await KiroGraph.open(target);
|
|
41
|
+
const results = cg.searchNodes(symbol, void 0, 5);
|
|
42
|
+
if (results.length === 0) {
|
|
43
|
+
console.error(` \u2716 Symbol "${symbol}" not found in index.`);
|
|
44
|
+
cg.close();
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
const node = results[0].node;
|
|
48
|
+
const direction = ["up", "down", "both"].includes(opts.direction) ? opts.direction : "both";
|
|
49
|
+
const hierarchy = cg.getTypeHierarchy(node.id, direction);
|
|
50
|
+
if (opts.json) {
|
|
51
|
+
console.log(JSON.stringify({ symbol: node.name, direction, hierarchy }));
|
|
52
|
+
cg.close();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (hierarchy.length === 0) {
|
|
56
|
+
console.log(`
|
|
57
|
+
${import_ui.dim}No type hierarchy found for \`${node.name}\`.${import_ui.reset}
|
|
58
|
+
`);
|
|
59
|
+
cg.close();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
console.log(`
|
|
63
|
+
${import_ui.violet}${import_ui.bold}Type hierarchy of \`${node.name}\`${import_ui.reset} ${import_ui.dim}(direction: ${direction})${import_ui.reset}
|
|
64
|
+
`);
|
|
65
|
+
for (const n of hierarchy) {
|
|
66
|
+
console.log(` ${import_ui.violet}${n.name}${import_ui.reset} ${import_ui.dim}${n.kind} ${n.filePath}:${n.startLine}${import_ui.reset}`);
|
|
67
|
+
}
|
|
68
|
+
console.log();
|
|
69
|
+
cg.close();
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
73
|
+
0 && (module.exports = {
|
|
74
|
+
register
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=type-hierarchy.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/bin/commands/type-hierarchy.ts"],
|
|
4
|
+
"sourcesContent": ["import * as path from 'path';\nimport { Command } from 'commander';\nimport { bold, dim, reset, violet } from '../ui';\n\nexport function register(program: Command): void {\n program\n .command('type-hierarchy <symbol>')\n .description('Traverse the type hierarchy of a class or interface (base types and derived types)')\n .option('--direction <dir>', 'Direction: up (base types), down (derived types), both (default)', 'both')\n .option('-j, --json', 'Output as JSON')\n .option('-p, --path <path>', 'Project path')\n .action(async (symbol: string, opts: { direction: string; json?: boolean; path?: string }) => {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const target = path.resolve(opts.path ?? process.cwd());\n const cg = await KiroGraph.open(target);\n\n const results = cg.searchNodes(symbol, undefined, 5);\n if (results.length === 0) {\n console.error(` \u2716 Symbol \"${symbol}\" not found in index.`);\n cg.close(); process.exit(1);\n }\n\n const node = results[0].node;\n const direction = (['up', 'down', 'both'].includes(opts.direction) ? opts.direction : 'both') as 'up' | 'down' | 'both';\n const hierarchy = cg.getTypeHierarchy(node.id, direction);\n\n if (opts.json) {\n console.log(JSON.stringify({ symbol: node.name, direction, hierarchy }));\n cg.close(); return;\n }\n\n if (hierarchy.length === 0) {\n console.log(`\\n ${dim}No type hierarchy found for \\`${node.name}\\`.${reset}\\n`);\n cg.close(); return;\n }\n\n console.log(`\\n ${violet}${bold}Type hierarchy of \\`${node.name}\\`${reset} ${dim}(direction: ${direction})${reset}\\n`);\n for (const n of hierarchy) {\n console.log(` ${violet}${n.name}${reset} ${dim}${n.kind} ${n.filePath}:${n.startLine}${reset}`);\n }\n console.log();\n cg.close();\n });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAsB;AAEtB,gBAAyC;AAElC,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,yBAAyB,EACjC,YAAY,oFAAoF,EAChG,OAAO,qBAAqB,oEAAoE,MAAM,EACtG,OAAO,cAAc,gBAAgB,EACrC,OAAO,qBAAqB,cAAc,EAC1C,OAAO,OAAO,QAAgB,SAA+D;AAC5F,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,UAAM,SAAS,KAAK,QAAQ,KAAK,QAAQ,QAAQ,IAAI,CAAC;AACtD,UAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AAEtC,UAAM,UAAU,GAAG,YAAY,QAAQ,QAAW,CAAC;AACnD,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,MAAM,oBAAe,MAAM,uBAAuB;AAC1D,SAAG,MAAM;AAAG,cAAQ,KAAK,CAAC;AAAA,IAC5B;AAEA,UAAM,OAAO,QAAQ,CAAC,EAAE;AACxB,UAAM,YAAa,CAAC,MAAM,QAAQ,MAAM,EAAE,SAAS,KAAK,SAAS,IAAI,KAAK,YAAY;AACtF,UAAM,YAAY,GAAG,iBAAiB,KAAK,IAAI,SAAS;AAExD,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,KAAK,MAAM,WAAW,UAAU,CAAC,CAAC;AACvE,SAAG,MAAM;AAAG;AAAA,IACd;AAEA,QAAI,UAAU,WAAW,GAAG;AAC1B,cAAQ,IAAI;AAAA,IAAO,aAAG,iCAAiC,KAAK,IAAI,MAAM,eAAK;AAAA,CAAI;AAC/E,SAAG,MAAM;AAAG;AAAA,IACd;AAEA,YAAQ,IAAI;AAAA,IAAO,gBAAM,GAAG,cAAI,uBAAuB,KAAK,IAAI,KAAK,eAAK,KAAK,aAAG,eAAe,SAAS,IAAI,eAAK;AAAA,CAAI;AACvH,eAAW,KAAK,WAAW;AACzB,cAAQ,IAAI,KAAK,gBAAM,GAAG,EAAE,IAAI,GAAG,eAAK,KAAK,aAAG,GAAG,EAAE,IAAI,KAAK,EAAE,QAAQ,IAAI,EAAE,SAAS,GAAG,eAAK,EAAE;AAAA,IACnG;AACA,YAAQ,IAAI;AACZ,OAAG,MAAM;AAAA,EACX,CAAC;AACL;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -148,16 +148,22 @@ function removeGeneratedBlock(filePath, blockId) {
|
|
|
148
148
|
function escapeRegExp(s) {
|
|
149
149
|
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
150
150
|
}
|
|
151
|
-
function buildInstructionOpts(
|
|
151
|
+
function buildInstructionOpts(opts, hasHooks) {
|
|
152
152
|
return {
|
|
153
|
-
cavemanMode,
|
|
154
|
-
shellCompressionLevel: shellCompressionLevel ?? void 0,
|
|
155
|
-
enableArchitecture: enableArchitecture ?? false,
|
|
156
|
-
enableMemory: enableMemory ?? false,
|
|
157
|
-
enableDocs: enableDocs ?? false,
|
|
158
|
-
enableData: enableData ?? false,
|
|
159
|
-
enableSecurity: enableSecurity ?? false,
|
|
160
|
-
enablePatterns: enablePatterns ?? false,
|
|
153
|
+
cavemanMode: opts.cavemanMode,
|
|
154
|
+
shellCompressionLevel: opts.shellCompressionLevel ?? void 0,
|
|
155
|
+
enableArchitecture: opts.enableArchitecture ?? false,
|
|
156
|
+
enableMemory: opts.enableMemory ?? false,
|
|
157
|
+
enableDocs: opts.enableDocs ?? false,
|
|
158
|
+
enableData: opts.enableData ?? false,
|
|
159
|
+
enableSecurity: opts.enableSecurity ?? false,
|
|
160
|
+
enablePatterns: opts.enablePatterns ?? false,
|
|
161
|
+
enableWiki: opts.enableWiki ?? false,
|
|
162
|
+
enableCodeHealth: opts.enableCodeHealth ?? false,
|
|
163
|
+
enableAdvancedAnalysis: opts.enableAdvancedAnalysis ?? false,
|
|
164
|
+
enableAgentUtils: opts.enableAgentUtils ?? false,
|
|
165
|
+
enableGeneralCompression: opts.enableGeneralCompression ?? false,
|
|
166
|
+
trackCallSites: opts.trackCallSites ?? false,
|
|
161
167
|
hasHooks: hasHooks ?? false
|
|
162
168
|
};
|
|
163
169
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/bin/installer/common.ts"],
|
|
4
|
-
"sourcesContent": ["import * as fs from 'fs';\nimport * as path from 'path';\nimport { KIROGRAPH_TOOL_NAMES } from '../../mcp/tool-names';\nimport type { InstructionOptions } from './instructions';\nimport type { CavemanMode } from './caveman';\n\nexport type InstallTarget = 'kiro' | 'claude' | 'codex' | 'cursor' | 'antigravity' | 'opencode' | 'windsurf' | 'cline' | 'copilot' | 'copilot-cli' | 'junie' | 'gemini-cli' | 'continue' | 'roo' | 'warp' | 'aider' | 'trae' | 'augment' | 'kilo' | 'amp' | 'devin' | 'replit' | 'goose' | 'openhands' | 'tabnine' | 'mistral-vibe' | 'ibm-bob' | 'crush' | 'droid-factory' | 'forgecode' | 'iflow' | 'qwen' | 'rovo' | 'qoder';\n\nexport const KIROGRAPH_SERVER_NAME = 'kirograph';\nexport const KIROGRAPH_COMMAND = 'kirograph';\nexport const KIROGRAPH_MCP_ARGS = ['serve', '--mcp'];\nexport const KIROGRAPH_SYNC_CMD = 'kirograph sync-if-dirty --quiet 2>/dev/null || true';\nexport const KIROGRAPH_TOOLS = KIROGRAPH_TOOL_NAMES;\nexport const KIROGRAPH_SCOPED_TOOLS = KIROGRAPH_TOOL_NAMES.map(name => `@kirograph/${name}`);\n\nexport function ensureDir(p: string): void {\n fs.mkdirSync(p, { recursive: true });\n}\n\nexport function readJson(p: string): any {\n try { return JSON.parse(fs.readFileSync(p, 'utf8')); } catch { return {}; }\n}\n\nexport function writeJson(p: string, data: unknown): void {\n fs.writeFileSync(p, JSON.stringify(data, null, 2) + '\\n');\n}\n\n/**\n * Write MCP server config to a JSON file under the mcpServers key.\n * Returns true if the config was written, false if already configured (idempotent).\n */\nexport function writeMcpServersConfig(configPath: string, serverConfig: object): boolean {\n ensureDir(path.dirname(configPath));\n const existing = readJson(configPath);\n existing.mcpServers = existing.mcpServers ?? {};\n if (existing.mcpServers[KIROGRAPH_SERVER_NAME]) {\n return false; // Already configured\n }\n existing.mcpServers[KIROGRAPH_SERVER_NAME] = serverConfig;\n writeJson(configPath, existing);\n return true;\n}\n\n/**\n * Always write (overwrite) the MCP server config entry, regardless of whether it already exists.\n * Used when the final state is known upfront and idempotency would cause stale data.\n */\nexport function overwriteMcpServersConfig(configPath: string, serverConfig: object): void {\n ensureDir(path.dirname(configPath));\n const existing = readJson(configPath);\n existing.mcpServers = existing.mcpServers ?? {};\n existing.mcpServers[KIROGRAPH_SERVER_NAME] = serverConfig;\n writeJson(configPath, existing);\n}\n\nexport function removeMcpServersConfig(configPath: string): boolean {\n if (!fs.existsSync(configPath)) return false;\n const existing = readJson(configPath);\n if (!existing.mcpServers?.[KIROGRAPH_SERVER_NAME]) return false;\n delete existing.mcpServers[KIROGRAPH_SERVER_NAME];\n writeJson(configPath, existing);\n return true;\n}\n\nexport function appendImportLine(filePath: string, line: string, heading: string): boolean {\n const existing = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';\n if (existing.includes(line)) return false;\n\n const prefix = existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '';\n const separator = existing.trim().length > 0 ? '\\n' : '';\n fs.writeFileSync(filePath, existing + prefix + separator + heading + '\\n' + line + '\\n');\n return true;\n}\n\nexport function removeImportLine(filePath: string, line: string): boolean {\n if (!fs.existsSync(filePath)) return false;\n const original = fs.readFileSync(filePath, 'utf8');\n const next = original\n .split('\\n')\n .filter(l => l.trim() !== line)\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n');\n if (next === original) return false;\n fs.writeFileSync(filePath, next.endsWith('\\n') ? next : next + '\\n');\n return true;\n}\n\nexport function upsertGeneratedBlock(filePath: string, blockId: string, heading: string, content: string): boolean {\n const start = `<!-- kirograph:${blockId}:start -->`;\n const end = `<!-- kirograph:${blockId}:end -->`;\n const block = `${start}\\n${heading}\\n\\n${content.trim()}\\n${end}`;\n const existing = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';\n const pattern = new RegExp(`${escapeRegExp(start)}[\\\\s\\\\S]*?${escapeRegExp(end)}`);\n\n if (pattern.test(existing)) {\n const next = existing.replace(pattern, block);\n if (next === existing) return false;\n fs.writeFileSync(filePath, next.endsWith('\\n') ? next : next + '\\n');\n return true;\n }\n\n const prefix = existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '';\n const separator = existing.trim().length > 0 ? '\\n' : '';\n fs.writeFileSync(filePath, existing + prefix + separator + block + '\\n');\n return true;\n}\n\nexport function removeGeneratedBlock(filePath: string, blockId: string): boolean {\n if (!fs.existsSync(filePath)) return false;\n const start = `<!-- kirograph:${blockId}:start -->`;\n const end = `<!-- kirograph:${blockId}:end -->`;\n const original = fs.readFileSync(filePath, 'utf8');\n const pattern = new RegExp(`\\\\n?${escapeRegExp(start)}[\\\\s\\\\S]*?${escapeRegExp(end)}\\\\n?`);\n const next = original.replace(pattern, '\\n').replace(/\\n{3,}/g, '\\n\\n');\n if (next === original) return false;\n fs.writeFileSync(filePath, next.endsWith('\\n') ? next : next + '\\n');\n return true;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Build InstructionOptions from the installLate parameters.\n * Used by all targets to pass full feature config to buildAgentInstructions.\n */\nexport function buildInstructionOpts(
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAoB;AACpB,WAAsB;AACtB,wBAAqC;
|
|
4
|
+
"sourcesContent": ["import * as fs from 'fs';\nimport * as path from 'path';\nimport { KIROGRAPH_TOOL_NAMES } from '../../mcp/tool-names';\nimport type { InstructionOptions } from './instructions';\nimport type { CavemanMode } from './caveman';\n\n/** Single options object passed to every target's installLate(). */\nexport interface LateInstallOptions {\n cavemanMode?: CavemanMode | 'off';\n shellCompressionLevel?: string;\n enableMemory?: boolean;\n enableDocs?: boolean;\n enableData?: boolean;\n enableSecurity?: boolean;\n enableArchitecture?: boolean;\n enablePatterns?: boolean;\n enableWatchmen?: boolean;\n watchmenSynthesisMode?: 'local' | 'agent';\n enableWiki?: boolean;\n wikiSynthesisMode?: 'local' | 'agent';\n wikiLocalModel?: string;\n enableCodeHealth?: boolean;\n enableAdvancedAnalysis?: boolean;\n enableAgentUtils?: boolean;\n enableGeneralCompression?: boolean;\n trackCallSites?: boolean;\n kiroHookFormat?: 'v1-legacy' | 'v2';\n}\n\nexport type InstallTarget = 'kiro' | 'claude' | 'codex' | 'cursor' | 'antigravity' | 'opencode' | 'windsurf' | 'cline' | 'copilot' | 'copilot-cli' | 'junie' | 'gemini-cli' | 'continue' | 'roo' | 'warp' | 'aider' | 'trae' | 'augment' | 'kilo' | 'amp' | 'devin' | 'replit' | 'goose' | 'openhands' | 'tabnine' | 'mistral-vibe' | 'ibm-bob' | 'crush' | 'droid-factory' | 'forgecode' | 'iflow' | 'qwen' | 'rovo' | 'qoder';\n\nexport const KIROGRAPH_SERVER_NAME = 'kirograph';\nexport const KIROGRAPH_COMMAND = 'kirograph';\nexport const KIROGRAPH_MCP_ARGS = ['serve', '--mcp'];\nexport const KIROGRAPH_SYNC_CMD = 'kirograph sync-if-dirty --quiet 2>/dev/null || true';\nexport const KIROGRAPH_TOOLS = KIROGRAPH_TOOL_NAMES;\nexport const KIROGRAPH_SCOPED_TOOLS = KIROGRAPH_TOOL_NAMES.map(name => `@kirograph/${name}`);\n\nexport function ensureDir(p: string): void {\n fs.mkdirSync(p, { recursive: true });\n}\n\nexport function readJson(p: string): any {\n try { return JSON.parse(fs.readFileSync(p, 'utf8')); } catch { return {}; }\n}\n\nexport function writeJson(p: string, data: unknown): void {\n fs.writeFileSync(p, JSON.stringify(data, null, 2) + '\\n');\n}\n\n/**\n * Write MCP server config to a JSON file under the mcpServers key.\n * Returns true if the config was written, false if already configured (idempotent).\n */\nexport function writeMcpServersConfig(configPath: string, serverConfig: object): boolean {\n ensureDir(path.dirname(configPath));\n const existing = readJson(configPath);\n existing.mcpServers = existing.mcpServers ?? {};\n if (existing.mcpServers[KIROGRAPH_SERVER_NAME]) {\n return false; // Already configured\n }\n existing.mcpServers[KIROGRAPH_SERVER_NAME] = serverConfig;\n writeJson(configPath, existing);\n return true;\n}\n\n/**\n * Always write (overwrite) the MCP server config entry, regardless of whether it already exists.\n * Used when the final state is known upfront and idempotency would cause stale data.\n */\nexport function overwriteMcpServersConfig(configPath: string, serverConfig: object): void {\n ensureDir(path.dirname(configPath));\n const existing = readJson(configPath);\n existing.mcpServers = existing.mcpServers ?? {};\n existing.mcpServers[KIROGRAPH_SERVER_NAME] = serverConfig;\n writeJson(configPath, existing);\n}\n\nexport function removeMcpServersConfig(configPath: string): boolean {\n if (!fs.existsSync(configPath)) return false;\n const existing = readJson(configPath);\n if (!existing.mcpServers?.[KIROGRAPH_SERVER_NAME]) return false;\n delete existing.mcpServers[KIROGRAPH_SERVER_NAME];\n writeJson(configPath, existing);\n return true;\n}\n\nexport function appendImportLine(filePath: string, line: string, heading: string): boolean {\n const existing = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';\n if (existing.includes(line)) return false;\n\n const prefix = existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '';\n const separator = existing.trim().length > 0 ? '\\n' : '';\n fs.writeFileSync(filePath, existing + prefix + separator + heading + '\\n' + line + '\\n');\n return true;\n}\n\nexport function removeImportLine(filePath: string, line: string): boolean {\n if (!fs.existsSync(filePath)) return false;\n const original = fs.readFileSync(filePath, 'utf8');\n const next = original\n .split('\\n')\n .filter(l => l.trim() !== line)\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n');\n if (next === original) return false;\n fs.writeFileSync(filePath, next.endsWith('\\n') ? next : next + '\\n');\n return true;\n}\n\nexport function upsertGeneratedBlock(filePath: string, blockId: string, heading: string, content: string): boolean {\n const start = `<!-- kirograph:${blockId}:start -->`;\n const end = `<!-- kirograph:${blockId}:end -->`;\n const block = `${start}\\n${heading}\\n\\n${content.trim()}\\n${end}`;\n const existing = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';\n const pattern = new RegExp(`${escapeRegExp(start)}[\\\\s\\\\S]*?${escapeRegExp(end)}`);\n\n if (pattern.test(existing)) {\n const next = existing.replace(pattern, block);\n if (next === existing) return false;\n fs.writeFileSync(filePath, next.endsWith('\\n') ? next : next + '\\n');\n return true;\n }\n\n const prefix = existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '';\n const separator = existing.trim().length > 0 ? '\\n' : '';\n fs.writeFileSync(filePath, existing + prefix + separator + block + '\\n');\n return true;\n}\n\nexport function removeGeneratedBlock(filePath: string, blockId: string): boolean {\n if (!fs.existsSync(filePath)) return false;\n const start = `<!-- kirograph:${blockId}:start -->`;\n const end = `<!-- kirograph:${blockId}:end -->`;\n const original = fs.readFileSync(filePath, 'utf8');\n const pattern = new RegExp(`\\\\n?${escapeRegExp(start)}[\\\\s\\\\S]*?${escapeRegExp(end)}\\\\n?`);\n const next = original.replace(pattern, '\\n').replace(/\\n{3,}/g, '\\n\\n');\n if (next === original) return false;\n fs.writeFileSync(filePath, next.endsWith('\\n') ? next : next + '\\n');\n return true;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Build InstructionOptions from the installLate parameters.\n * Used by all targets to pass full feature config to buildAgentInstructions.\n */\nexport function buildInstructionOpts(opts: LateInstallOptions, hasHooks?: boolean): InstructionOptions {\n return {\n cavemanMode: opts.cavemanMode,\n shellCompressionLevel: (opts.shellCompressionLevel as InstructionOptions['shellCompressionLevel']) ?? undefined,\n enableArchitecture: opts.enableArchitecture ?? false,\n enableMemory: opts.enableMemory ?? false,\n enableDocs: opts.enableDocs ?? false,\n enableData: opts.enableData ?? false,\n enableSecurity: opts.enableSecurity ?? false,\n enablePatterns: opts.enablePatterns ?? false,\n enableWiki: opts.enableWiki ?? false,\n enableCodeHealth: opts.enableCodeHealth ?? false,\n enableAdvancedAnalysis: opts.enableAdvancedAnalysis ?? false,\n enableAgentUtils: opts.enableAgentUtils ?? false,\n enableGeneralCompression: opts.enableGeneralCompression ?? false,\n trackCallSites: opts.trackCallSites ?? false,\n hasHooks: hasHooks ?? false,\n };\n}\n\nconst violet = '\\x1b[38;5;99m';\nconst resetAnsi = '\\x1b[0m';\nconst dimAnsi = '\\x1b[2m';\nconst boldAnsi = '\\x1b[1m';\n\n/**\n * Print a highlighted MCP config JSON block for targets that need user-scoped setup.\n */\nexport function printMcpSetup(configPath: string, projectRoot: string): void {\n const escapedPath = projectRoot.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n console.log(`\\n ${dimAnsi}Add the MCP server manually:${resetAnsi}`);\n console.log(` ${dimAnsi}Edit${resetAnsi} ${violet}${boldAnsi}${configPath}${resetAnsi} ${dimAnsi}and add:${resetAnsi}`);\n console.log(` ${violet}{${resetAnsi}`);\n console.log(` ${violet} \"mcpServers\": {${resetAnsi}`);\n console.log(` ${violet} \"kirograph\": {${resetAnsi}`);\n console.log(` ${violet} \"command\": \"kirograph\",${resetAnsi}`);\n console.log(` ${violet} \"args\": [\"serve\", \"--mcp\", \"--path\", \"${escapedPath}\"]${resetAnsi}`);\n console.log(` ${violet} }${resetAnsi}`);\n console.log(` ${violet} }${resetAnsi}`);\n console.log(` ${violet}}${resetAnsi}\\n`);\n}\n\n/**\n * Print a highlighted CLI command for MCP registration.\n */\nexport function printMcpCommand(command: string): void {\n console.log(`\\n ${dimAnsi}Add the MCP server with:${resetAnsi}`);\n console.log(` ${violet}${boldAnsi}${command}${resetAnsi}\\n`);\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAoB;AACpB,WAAsB;AACtB,wBAAqC;AA6B9B,MAAM,wBAAwB;AAC9B,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB,CAAC,SAAS,OAAO;AAC5C,MAAM,qBAAqB;AAC3B,MAAM,kBAAkB;AACxB,MAAM,yBAAyB,uCAAqB,IAAI,UAAQ,cAAc,IAAI,EAAE;AAEpF,SAAS,UAAU,GAAiB;AACzC,KAAG,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACrC;AAEO,SAAS,SAAS,GAAgB;AACvC,MAAI;AAAE,WAAO,KAAK,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;AAAA,EAAG,QAAQ;AAAE,WAAO,CAAC;AAAA,EAAG;AAC5E;AAEO,SAAS,UAAU,GAAW,MAAqB;AACxD,KAAG,cAAc,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AAC1D;AAMO,SAAS,sBAAsB,YAAoB,cAA+B;AACvF,YAAU,KAAK,QAAQ,UAAU,CAAC;AAClC,QAAM,WAAW,SAAS,UAAU;AACpC,WAAS,aAAa,SAAS,cAAc,CAAC;AAC9C,MAAI,SAAS,WAAW,qBAAqB,GAAG;AAC9C,WAAO;AAAA,EACT;AACA,WAAS,WAAW,qBAAqB,IAAI;AAC7C,YAAU,YAAY,QAAQ;AAC9B,SAAO;AACT;AAMO,SAAS,0BAA0B,YAAoB,cAA4B;AACxF,YAAU,KAAK,QAAQ,UAAU,CAAC;AAClC,QAAM,WAAW,SAAS,UAAU;AACpC,WAAS,aAAa,SAAS,cAAc,CAAC;AAC9C,WAAS,WAAW,qBAAqB,IAAI;AAC7C,YAAU,YAAY,QAAQ;AAChC;AAEO,SAAS,uBAAuB,YAA6B;AAClE,MAAI,CAAC,GAAG,WAAW,UAAU,EAAG,QAAO;AACvC,QAAM,WAAW,SAAS,UAAU;AACpC,MAAI,CAAC,SAAS,aAAa,qBAAqB,EAAG,QAAO;AAC1D,SAAO,SAAS,WAAW,qBAAqB;AAChD,YAAU,YAAY,QAAQ;AAC9B,SAAO;AACT;AAEO,SAAS,iBAAiB,UAAkB,MAAc,SAA0B;AACzF,QAAM,WAAW,GAAG,WAAW,QAAQ,IAAI,GAAG,aAAa,UAAU,MAAM,IAAI;AAC/E,MAAI,SAAS,SAAS,IAAI,EAAG,QAAO;AAEpC,QAAM,SAAS,SAAS,SAAS,KAAK,CAAC,SAAS,SAAS,IAAI,IAAI,OAAO;AACxE,QAAM,YAAY,SAAS,KAAK,EAAE,SAAS,IAAI,OAAO;AACtD,KAAG,cAAc,UAAU,WAAW,SAAS,YAAY,UAAU,OAAO,OAAO,IAAI;AACvF,SAAO;AACT;AAEO,SAAS,iBAAiB,UAAkB,MAAuB;AACxE,MAAI,CAAC,GAAG,WAAW,QAAQ,EAAG,QAAO;AACrC,QAAM,WAAW,GAAG,aAAa,UAAU,MAAM;AACjD,QAAM,OAAO,SACV,MAAM,IAAI,EACV,OAAO,OAAK,EAAE,KAAK,MAAM,IAAI,EAC7B,KAAK,IAAI,EACT,QAAQ,WAAW,MAAM;AAC5B,MAAI,SAAS,SAAU,QAAO;AAC9B,KAAG,cAAc,UAAU,KAAK,SAAS,IAAI,IAAI,OAAO,OAAO,IAAI;AACnE,SAAO;AACT;AAEO,SAAS,qBAAqB,UAAkB,SAAiB,SAAiB,SAA0B;AACjH,QAAM,QAAQ,kBAAkB,OAAO;AACvC,QAAM,MAAM,kBAAkB,OAAO;AACrC,QAAM,QAAQ,GAAG,KAAK;AAAA,EAAK,OAAO;AAAA;AAAA,EAAO,QAAQ,KAAK,CAAC;AAAA,EAAK,GAAG;AAC/D,QAAM,WAAW,GAAG,WAAW,QAAQ,IAAI,GAAG,aAAa,UAAU,MAAM,IAAI;AAC/E,QAAM,UAAU,IAAI,OAAO,GAAG,aAAa,KAAK,CAAC,aAAa,aAAa,GAAG,CAAC,EAAE;AAEjF,MAAI,QAAQ,KAAK,QAAQ,GAAG;AAC1B,UAAM,OAAO,SAAS,QAAQ,SAAS,KAAK;AAC5C,QAAI,SAAS,SAAU,QAAO;AAC9B,OAAG,cAAc,UAAU,KAAK,SAAS,IAAI,IAAI,OAAO,OAAO,IAAI;AACnE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,SAAS,SAAS,KAAK,CAAC,SAAS,SAAS,IAAI,IAAI,OAAO;AACxE,QAAM,YAAY,SAAS,KAAK,EAAE,SAAS,IAAI,OAAO;AACtD,KAAG,cAAc,UAAU,WAAW,SAAS,YAAY,QAAQ,IAAI;AACvE,SAAO;AACT;AAEO,SAAS,qBAAqB,UAAkB,SAA0B;AAC/E,MAAI,CAAC,GAAG,WAAW,QAAQ,EAAG,QAAO;AACrC,QAAM,QAAQ,kBAAkB,OAAO;AACvC,QAAM,MAAM,kBAAkB,OAAO;AACrC,QAAM,WAAW,GAAG,aAAa,UAAU,MAAM;AACjD,QAAM,UAAU,IAAI,OAAO,OAAO,aAAa,KAAK,CAAC,aAAa,aAAa,GAAG,CAAC,MAAM;AACzF,QAAM,OAAO,SAAS,QAAQ,SAAS,IAAI,EAAE,QAAQ,WAAW,MAAM;AACtE,MAAI,SAAS,SAAU,QAAO;AAC9B,KAAG,cAAc,UAAU,KAAK,SAAS,IAAI,IAAI,OAAO,OAAO,IAAI;AACnE,SAAO;AACT;AAEA,SAAS,aAAa,GAAmB;AACvC,SAAO,EAAE,QAAQ,uBAAuB,MAAM;AAChD;AAMO,SAAS,qBAAqB,MAA0B,UAAwC;AACrG,SAAO;AAAA,IACL,aAAa,KAAK;AAAA,IAClB,uBAAwB,KAAK,yBAAyE;AAAA,IACtG,oBAAoB,KAAK,sBAAsB;AAAA,IAC/C,cAAc,KAAK,gBAAgB;AAAA,IACnC,YAAY,KAAK,cAAc;AAAA,IAC/B,YAAY,KAAK,cAAc;AAAA,IAC/B,gBAAgB,KAAK,kBAAkB;AAAA,IACvC,gBAAgB,KAAK,kBAAkB;AAAA,IACvC,YAAY,KAAK,cAAc;AAAA,IAC/B,kBAAkB,KAAK,oBAAoB;AAAA,IAC3C,wBAAwB,KAAK,0BAA0B;AAAA,IACvD,kBAAkB,KAAK,oBAAoB;AAAA,IAC3C,0BAA0B,KAAK,4BAA4B;AAAA,IAC3D,gBAAgB,KAAK,kBAAkB;AAAA,IACvC,UAAU,YAAY;AAAA,EACxB;AACF;AAEA,MAAM,SAAS;AACf,MAAM,YAAY;AAClB,MAAM,UAAU;AAChB,MAAM,WAAW;AAKV,SAAS,cAAc,YAAoB,aAA2B;AAC3E,QAAM,cAAc,YAAY,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AAC1E,UAAQ,IAAI;AAAA,IAAO,OAAO,+BAA+B,SAAS,EAAE;AACpE,UAAQ,IAAI,KAAK,OAAO,OAAO,SAAS,IAAI,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,IAAI,OAAO,WAAW,SAAS,EAAE;AACvH,UAAQ,IAAI,KAAK,MAAM,IAAI,SAAS,EAAE;AACtC,UAAQ,IAAI,KAAK,MAAM,oBAAoB,SAAS,EAAE;AACtD,UAAQ,IAAI,KAAK,MAAM,qBAAqB,SAAS,EAAE;AACvD,UAAQ,IAAI,KAAK,MAAM,gCAAgC,SAAS,EAAE;AAClE,UAAQ,IAAI,KAAK,MAAM,+CAA+C,WAAW,KAAK,SAAS,EAAE;AACjG,UAAQ,IAAI,KAAK,MAAM,QAAQ,SAAS,EAAE;AAC1C,UAAQ,IAAI,KAAK,MAAM,MAAM,SAAS,EAAE;AACxC,UAAQ,IAAI,KAAK,MAAM,IAAI,SAAS;AAAA,CAAI;AAC1C;AAKO,SAAS,gBAAgB,SAAuB;AACrD,UAAQ,IAAI;AAAA,IAAO,OAAO,2BAA2B,SAAS,EAAE;AAChE,UAAQ,IAAI,KAAK,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS;AAAA,CAAI;AAC9D;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|