kirograph 0.27.1 → 0.28.0
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 +35 -2
- package/dist/bin/commands/annotations.js +56 -0
- package/dist/bin/commands/annotations.js.map +7 -0
- package/dist/bin/commands/ast-rewrite.js +55 -0
- package/dist/bin/commands/ast-rewrite.js.map +7 -0
- package/dist/bin/commands/bench.js +103 -0
- package/dist/bin/commands/bench.js.map +7 -0
- package/dist/bin/commands/branch.js +133 -0
- package/dist/bin/commands/branch.js.map +7 -0
- 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/changelog.js +55 -0
- package/dist/bin/commands/changelog.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/commit-context.js +55 -0
- package/dist/bin/commands/commit-context.js.map +7 -0
- package/dist/bin/commands/complexity.js +60 -0
- package/dist/bin/commands/complexity.js.map +7 -0
- package/dist/bin/commands/cost.js +146 -0
- package/dist/bin/commands/cost.js.map +7 -0
- package/dist/bin/commands/dependency-depth.js +55 -0
- package/dist/bin/commands/dependency-depth.js.map +7 -0
- package/dist/bin/commands/diff-context.js +55 -0
- package/dist/bin/commands/diff-context.js.map +7 -0
- package/dist/bin/commands/distribution.js +56 -0
- package/dist/bin/commands/distribution.js.map +7 -0
- package/dist/bin/commands/doc-coverage.js +56 -0
- package/dist/bin/commands/doc-coverage.js.map +7 -0
- package/dist/bin/commands/doctor.js +202 -0
- package/dist/bin/commands/doctor.js.map +7 -0
- package/dist/bin/commands/dsm.js +56 -0
- package/dist/bin/commands/dsm.js.map +7 -0
- package/dist/bin/commands/gini.js +55 -0
- package/dist/bin/commands/gini.js.map +7 -0
- package/dist/bin/commands/god-class.js +56 -0
- package/dist/bin/commands/god-class.js.map +7 -0
- package/dist/bin/commands/health.js +55 -0
- package/dist/bin/commands/health.js.map +7 -0
- package/dist/bin/commands/help.js +224 -45
- package/dist/bin/commands/help.js.map +2 -2
- package/dist/bin/commands/impact.js +76 -0
- package/dist/bin/commands/impact.js.map +7 -0
- package/dist/bin/commands/inheritance-depth.js +56 -0
- package/dist/bin/commands/inheritance-depth.js.map +7 -0
- package/dist/bin/commands/insert-at.js +55 -0
- package/dist/bin/commands/insert-at.js.map +7 -0
- package/dist/bin/commands/largest.js +56 -0
- package/dist/bin/commands/largest.js.map +7 -0
- package/dist/bin/commands/manifest.js +158 -0
- package/dist/bin/commands/manifest.js.map +7 -0
- package/dist/bin/commands/module-api.js +57 -0
- package/dist/bin/commands/module-api.js.map +7 -0
- package/dist/bin/commands/monitor.js +91 -0
- package/dist/bin/commands/monitor.js.map +7 -0
- package/dist/bin/commands/multi-replace.js +66 -0
- package/dist/bin/commands/multi-replace.js.map +7 -0
- package/dist/bin/commands/pr-context.js +55 -0
- package/dist/bin/commands/pr-context.js.map +7 -0
- package/dist/bin/commands/query.js +19 -1
- package/dist/bin/commands/query.js.map +3 -3
- package/dist/bin/commands/rank.js +56 -0
- package/dist/bin/commands/rank.js.map +7 -0
- package/dist/bin/commands/read.js +1 -1
- package/dist/bin/commands/read.js.map +2 -2
- package/dist/bin/commands/recursion.js +56 -0
- package/dist/bin/commands/recursion.js.map +7 -0
- package/dist/bin/commands/rename-preview.js +56 -0
- package/dist/bin/commands/rename-preview.js.map +7 -0
- package/dist/bin/commands/session.js +60 -0
- package/dist/bin/commands/session.js.map +7 -0
- package/dist/bin/commands/simplify-scan.js +56 -0
- package/dist/bin/commands/simplify-scan.js.map +7 -0
- package/dist/bin/commands/str-replace.js +55 -0
- package/dist/bin/commands/str-replace.js.map +7 -0
- package/dist/bin/commands/test-coverage.js +59 -0
- package/dist/bin/commands/test-coverage.js.map +7 -0
- package/dist/bin/commands/test-map.js +56 -0
- package/dist/bin/commands/test-map.js.map +7 -0
- package/dist/bin/commands/test-risk.js +59 -0
- package/dist/bin/commands/test-risk.js.map +7 -0
- package/dist/bin/commands/type-hierarchy.js +76 -0
- package/dist/bin/commands/type-hierarchy.js.map +7 -0
- package/dist/bin/commands/unused-imports.js +55 -0
- package/dist/bin/commands/unused-imports.js.map +7 -0
- package/dist/bin/commands/upgrade.js +78 -0
- package/dist/bin/commands/upgrade.js.map +7 -0
- package/dist/bin/installer/common.js +19 -9
- package/dist/bin/installer/common.js.map +2 -2
- package/dist/bin/installer/config-prompt.js +147 -12
- package/dist/bin/installer/config-prompt.js.map +3 -3
- package/dist/bin/installer/index.js +62 -6
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/installer/instructions.js +14 -25
- package/dist/bin/installer/instructions.js.map +2 -2
- package/dist/bin/installer/mcp.js.map +2 -2
- package/dist/bin/installer/steering.js +569 -100
- 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 +27 -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 +83 -1
- package/dist/bin/kirograph.js.map +3 -3
- package/dist/config.js +30 -8
- package/dist/config.js.map +2 -2
- package/dist/core/branch-manager.js +111 -0
- package/dist/core/branch-manager.js.map +7 -0
- package/dist/core/pipeline.js +3 -3
- package/dist/core/pipeline.js.map +2 -2
- package/dist/data/pixelrag-bridge.js +93 -0
- package/dist/data/pixelrag-bridge.js.map +7 -0
- package/dist/data/pixelrag-manager.js +416 -0
- package/dist/data/pixelrag-manager.js.map +7 -0
- package/dist/db/database.js +34 -7
- package/dist/db/database.js.map +2 -2
- package/dist/db/schema.sql +7 -1
- package/dist/extraction/complexity.js +116 -0
- package/dist/extraction/complexity.js.map +7 -0
- package/dist/extraction/extractor.js +52 -1
- package/dist/extraction/extractor.js.map +2 -2
- package/dist/graph/git-context.js +229 -0
- package/dist/graph/git-context.js.map +7 -0
- package/dist/index.js +4 -2
- package/dist/index.js.map +2 -2
- package/dist/mcp/cache.js +1 -1
- package/dist/mcp/cache.js.map +2 -2
- package/dist/mcp/handler.js +446 -0
- package/dist/mcp/handler.js.map +7 -0
- package/dist/mcp/handlers/architecture.js +297 -0
- package/dist/mcp/handlers/architecture.js.map +7 -0
- package/dist/mcp/handlers/branch.js +175 -0
- package/dist/mcp/handlers/branch.js.map +7 -0
- package/dist/mcp/handlers/code-health.js +563 -0
- package/dist/mcp/handlers/code-health.js.map +7 -0
- package/dist/mcp/handlers/complexity.js +267 -0
- package/dist/mcp/handlers/complexity.js.map +7 -0
- package/dist/mcp/handlers/core.js +611 -0
- package/dist/mcp/handlers/core.js.map +7 -0
- package/dist/mcp/handlers/data.js +337 -0
- package/dist/mcp/handlers/data.js.map +7 -0
- package/dist/mcp/handlers/docs.js +159 -0
- package/dist/mcp/handlers/docs.js.map +7 -0
- package/dist/mcp/handlers/edit-primitives.js +200 -0
- package/dist/mcp/handlers/edit-primitives.js.map +7 -0
- package/dist/mcp/handlers/git-context.js +286 -0
- package/dist/mcp/handlers/git-context.js.map +7 -0
- package/dist/mcp/handlers/memory.js +363 -0
- package/dist/mcp/handlers/memory.js.map +7 -0
- package/dist/mcp/handlers/patterns.js +310 -0
- package/dist/mcp/handlers/patterns.js.map +7 -0
- package/dist/mcp/handlers/security.js +699 -0
- package/dist/mcp/handlers/security.js.map +7 -0
- package/dist/mcp/handlers/utils.js +97 -0
- package/dist/mcp/handlers/utils.js.map +7 -0
- package/dist/mcp/handlers/watchmen.js +104 -0
- package/dist/mcp/handlers/watchmen.js.map +7 -0
- package/dist/mcp/handlers/wiki.js +242 -0
- package/dist/mcp/handlers/wiki.js.map +7 -0
- package/dist/mcp/server.js +72 -3
- package/dist/mcp/server.js.map +2 -2
- package/dist/mcp/tool-names.js +136 -10
- package/dist/mcp/tool-names.js.map +2 -2
- package/dist/mcp/tools.js +846 -3019
- package/dist/mcp/tools.js.map +3 -3
- package/dist/types.js.map +2 -2
- package/package.json +36 -10
|
@@ -0,0 +1,286 @@
|
|
|
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 git_context_exports = {};
|
|
30
|
+
__export(git_context_exports, {
|
|
31
|
+
handleGitContext: () => handleGitContext
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(git_context_exports);
|
|
34
|
+
var import_utils = require("./utils");
|
|
35
|
+
function formatChangedSymbol(s) {
|
|
36
|
+
const lines = [` ${(0, import_utils.mapKind)(s.kind)} \`${s.name}\` (${s.changeType}) \u2014 ${s.filePath}:${s.startLine}`];
|
|
37
|
+
if (s.callers.length > 0) lines.push(` callers: ${s.callers.map((c) => `\`${c.name}\``).join(", ")}`);
|
|
38
|
+
if (s.callees.length > 0) lines.push(` calls: ${s.callees.map((c) => `\`${c.name}\``).join(", ")}`);
|
|
39
|
+
return lines.join("\n");
|
|
40
|
+
}
|
|
41
|
+
async function handleGitContext(toolName, args, cg) {
|
|
42
|
+
const { getChangedSymbols, getCommitContext, getPRContext, getCommitLog, findTestFiles, findUncoveredSymbols } = await Promise.resolve().then(() => require("../../graph/git-context.js"));
|
|
43
|
+
const projectRoot = cg.getProjectRoot();
|
|
44
|
+
const db = cg.getDatabase();
|
|
45
|
+
switch (toolName) {
|
|
46
|
+
case "kirograph_diff_context": {
|
|
47
|
+
const staged = args.staged ?? false;
|
|
48
|
+
let result;
|
|
49
|
+
try {
|
|
50
|
+
result = getChangedSymbols(projectRoot, db, { staged });
|
|
51
|
+
} catch (err) {
|
|
52
|
+
return `git diff failed: ${err.message}. Ensure this is a git repository with git installed.`;
|
|
53
|
+
}
|
|
54
|
+
if (result.changedSymbols.length === 0) {
|
|
55
|
+
return staged ? "No staged changes found." : "No unstaged changes found.";
|
|
56
|
+
}
|
|
57
|
+
const lines = [
|
|
58
|
+
`${staged ? "Staged" : "Unstaged"} changes \u2014 ${result.changedSymbols.length} affected symbol(s):
|
|
59
|
+
`
|
|
60
|
+
];
|
|
61
|
+
for (const s of result.changedSymbols) lines.push(formatChangedSymbol(s));
|
|
62
|
+
return lines.join("\n");
|
|
63
|
+
}
|
|
64
|
+
case "kirograph_commit_context": {
|
|
65
|
+
let ctx;
|
|
66
|
+
try {
|
|
67
|
+
ctx = getCommitContext(projectRoot, db);
|
|
68
|
+
} catch (err) {
|
|
69
|
+
return `git diff failed: ${err.message}. Ensure this is a git repository with staged changes.`;
|
|
70
|
+
}
|
|
71
|
+
if (ctx.stagedFiles.length === 0) return "No staged changes. Stage files with `git add` first.";
|
|
72
|
+
const lines = [
|
|
73
|
+
`Staged files (${ctx.stagedFiles.length}):
|
|
74
|
+
`,
|
|
75
|
+
...ctx.stagedFiles.map((f) => ` ${f}`),
|
|
76
|
+
"\nDiff summary:",
|
|
77
|
+
ctx.diffStat
|
|
78
|
+
];
|
|
79
|
+
if (ctx.changedSymbols.length > 0) {
|
|
80
|
+
lines.push(`
|
|
81
|
+
Affected symbols (${ctx.changedSymbols.length}):
|
|
82
|
+
`);
|
|
83
|
+
for (const s of ctx.changedSymbols) lines.push(formatChangedSymbol(s));
|
|
84
|
+
}
|
|
85
|
+
return lines.join("\n");
|
|
86
|
+
}
|
|
87
|
+
case "kirograph_pr_context": {
|
|
88
|
+
const base = args.base;
|
|
89
|
+
const head = args.head ?? "HEAD";
|
|
90
|
+
let result;
|
|
91
|
+
try {
|
|
92
|
+
result = getPRContext(projectRoot, db, base, head);
|
|
93
|
+
} catch (err) {
|
|
94
|
+
return `PR context failed: ${err.message}`;
|
|
95
|
+
}
|
|
96
|
+
if (result.changedSymbols.length === 0) return `No symbol changes found between ${base} and ${head}.`;
|
|
97
|
+
const lines = [
|
|
98
|
+
`Semantic diff: ${result.ref} \u2014 ${result.changedSymbols.length} affected symbol(s):
|
|
99
|
+
`
|
|
100
|
+
];
|
|
101
|
+
for (const s of result.changedSymbols) lines.push(formatChangedSymbol(s));
|
|
102
|
+
return lines.join("\n");
|
|
103
|
+
}
|
|
104
|
+
case "kirograph_changelog": {
|
|
105
|
+
const ref1 = args.ref1;
|
|
106
|
+
const ref2 = args.ref2 ?? "HEAD";
|
|
107
|
+
let commits;
|
|
108
|
+
try {
|
|
109
|
+
commits = getCommitLog(projectRoot, ref1, ref2);
|
|
110
|
+
} catch (err) {
|
|
111
|
+
return `git log failed: ${err.message}`;
|
|
112
|
+
}
|
|
113
|
+
if (commits.length === 0) return `No commits found between ${ref1} and ${ref2}.`;
|
|
114
|
+
let result;
|
|
115
|
+
try {
|
|
116
|
+
result = getPRContext(projectRoot, db, ref1, ref2);
|
|
117
|
+
} catch {
|
|
118
|
+
result = null;
|
|
119
|
+
}
|
|
120
|
+
const lines = [
|
|
121
|
+
`## Changelog: ${ref1}..${ref2} (${commits.length} commits)
|
|
122
|
+
`,
|
|
123
|
+
...commits.map((c) => `- ${c.shortHash} ${c.date} ${c.subject} (${c.author})`)
|
|
124
|
+
];
|
|
125
|
+
if (result && result.changedSymbols.length > 0) {
|
|
126
|
+
lines.push(`
|
|
127
|
+
## Affected symbols (${result.changedSymbols.length}):
|
|
128
|
+
`);
|
|
129
|
+
for (const s of result.changedSymbols.slice(0, 30)) lines.push(formatChangedSymbol(s));
|
|
130
|
+
if (result.changedSymbols.length > 30) lines.push(` \u2026and ${result.changedSymbols.length - 30} more`);
|
|
131
|
+
}
|
|
132
|
+
return lines.join("\n");
|
|
133
|
+
}
|
|
134
|
+
case "kirograph_test_map": {
|
|
135
|
+
const symbol = args.symbol;
|
|
136
|
+
if (symbol) {
|
|
137
|
+
const results = cg.searchNodes(symbol, void 0, 5);
|
|
138
|
+
if (results.length === 0) return `Symbol "${symbol}" not found in index.`;
|
|
139
|
+
const node = results[0].node;
|
|
140
|
+
const testFiles = findTestFiles(db, node.id);
|
|
141
|
+
if (testFiles.length === 0) return `No test files found that reference \`${node.name}\`.`;
|
|
142
|
+
return `Test files covering \`${node.name}\` (${testFiles.length}):
|
|
143
|
+
|
|
144
|
+
` + testFiles.map((f) => ` ${f}`).join("\n");
|
|
145
|
+
} else {
|
|
146
|
+
const uncovered = findUncoveredSymbols(db, 40);
|
|
147
|
+
if (uncovered.length === 0) return "All exported symbols appear to have test coverage.";
|
|
148
|
+
const lines = [`Exported symbols with no test coverage (${uncovered.length}):
|
|
149
|
+
`];
|
|
150
|
+
let lastFile = "";
|
|
151
|
+
for (const s of uncovered) {
|
|
152
|
+
if (s.filePath !== lastFile) {
|
|
153
|
+
lines.push(`
|
|
154
|
+
${s.filePath}`);
|
|
155
|
+
lastFile = s.filePath;
|
|
156
|
+
}
|
|
157
|
+
lines.push(` ${(0, import_utils.mapKind)(s.kind)} \`${s.name}\` \u2014 line ${s.startLine}`);
|
|
158
|
+
}
|
|
159
|
+
return lines.join("\n");
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
case "kirograph_flows": {
|
|
163
|
+
const { getExecutionFlows, traceFlow } = await Promise.resolve().then(() => require("../../graph/flows.js"));
|
|
164
|
+
const db2 = cg.getDatabase();
|
|
165
|
+
if (args.entryPoint) {
|
|
166
|
+
const results = cg.searchNodes(args.entryPoint, void 0, 5);
|
|
167
|
+
if (results.length === 0) return `Symbol "${args.entryPoint}" not found in index.`;
|
|
168
|
+
const hops = traceFlow(db2, results[0].node.id, args.maxDepth ?? 10);
|
|
169
|
+
if (hops.length < 2) return `No outgoing call chain found from "${args.entryPoint}".`;
|
|
170
|
+
const lines2 = [`## Execution flow from \`${args.entryPoint}\``, ""];
|
|
171
|
+
for (let i = 0; i < hops.length; i++) {
|
|
172
|
+
const hop = hops[i];
|
|
173
|
+
const indent = " ".repeat(i);
|
|
174
|
+
const arrow = i === 0 ? "\u2192" : "\u21B3";
|
|
175
|
+
const conf = hop.confidence && hop.confidence !== "extracted" ? ` [${hop.confidence}]` : "";
|
|
176
|
+
lines2.push(`${indent}${arrow} ${hop.kind} \`${hop.symbol}\` \u2014 ${hop.filePath}:${hop.line}${conf}`);
|
|
177
|
+
}
|
|
178
|
+
return lines2.join("\n");
|
|
179
|
+
}
|
|
180
|
+
const flows = getExecutionFlows(db2, { maxFlows: args.maxFlows ?? 10, maxDepth: args.maxDepth ?? 10 });
|
|
181
|
+
if (flows.length === 0) return "No execution flows detected. The graph may be too small or have no call edges.";
|
|
182
|
+
const lines = [`## Execution Flows (${flows.length} detected)`, ""];
|
|
183
|
+
for (const flow of flows) {
|
|
184
|
+
lines.push(`### \`${flow.entryPoint}\` (${flow.entryPointKind}) \u2014 criticality: ${flow.criticality.toFixed(2)}`);
|
|
185
|
+
lines.push(`File: ${flow.entryPointFile}`, "");
|
|
186
|
+
for (let i = 0; i < flow.hops.length; i++) {
|
|
187
|
+
const hop = flow.hops[i];
|
|
188
|
+
const indent = " ".repeat(Math.min(i, 5));
|
|
189
|
+
const arrow = i === 0 ? "\u2192" : "\u21B3";
|
|
190
|
+
const conf = hop.confidence && hop.confidence !== "extracted" ? ` [${hop.confidence}]` : "";
|
|
191
|
+
lines.push(`${indent}${arrow} \`${hop.symbol}\` (${hop.kind}) \u2014 ${hop.filePath}:${hop.line}${conf}`);
|
|
192
|
+
}
|
|
193
|
+
lines.push("");
|
|
194
|
+
}
|
|
195
|
+
return lines.join("\n");
|
|
196
|
+
}
|
|
197
|
+
case "kirograph_test_coverage": {
|
|
198
|
+
const fs = await import("fs");
|
|
199
|
+
const path = await import("path");
|
|
200
|
+
const sortBy = args.sortBy ?? "asc";
|
|
201
|
+
const limitN = typeof args.limit === "number" ? Math.max(1, Math.min(args.limit, 200)) : 30;
|
|
202
|
+
const candidates = [
|
|
203
|
+
"lcov.info",
|
|
204
|
+
"coverage/lcov.info",
|
|
205
|
+
".nyc_output/lcov.info",
|
|
206
|
+
"coverage/coverage-final.json"
|
|
207
|
+
];
|
|
208
|
+
let foundPath = null;
|
|
209
|
+
let fileType = null;
|
|
210
|
+
for (const rel of candidates) {
|
|
211
|
+
const full = path.join(projectRoot, rel);
|
|
212
|
+
if (fs.existsSync(full)) {
|
|
213
|
+
foundPath = full;
|
|
214
|
+
fileType = rel.endsWith(".json") ? "istanbul" : "lcov";
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (!foundPath || !fileType) {
|
|
219
|
+
return "No coverage file found. Generate one with: nyc report --reporter=lcov, jest --coverage, or vitest run --coverage.";
|
|
220
|
+
}
|
|
221
|
+
const content = fs.readFileSync(foundPath, "utf8");
|
|
222
|
+
const fileCoverage = [];
|
|
223
|
+
if (fileType === "lcov") {
|
|
224
|
+
let currentFile = "";
|
|
225
|
+
let covered = 0;
|
|
226
|
+
let total = 0;
|
|
227
|
+
for (const line of content.split("\n")) {
|
|
228
|
+
if (line.startsWith("SF:")) {
|
|
229
|
+
currentFile = line.slice(3).trim();
|
|
230
|
+
covered = 0;
|
|
231
|
+
total = 0;
|
|
232
|
+
} else if (line.startsWith("DA:")) {
|
|
233
|
+
const parts = line.slice(3).split(",");
|
|
234
|
+
if (parts.length >= 2) {
|
|
235
|
+
total++;
|
|
236
|
+
if (parseInt(parts[1], 10) > 0) covered++;
|
|
237
|
+
}
|
|
238
|
+
} else if (line.startsWith("end_of_record") && currentFile) {
|
|
239
|
+
const pct = total > 0 ? covered / total * 100 : 0;
|
|
240
|
+
fileCoverage.push({ file: currentFile, covered, total, pct });
|
|
241
|
+
currentFile = "";
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
} else {
|
|
245
|
+
let json;
|
|
246
|
+
try {
|
|
247
|
+
json = JSON.parse(content);
|
|
248
|
+
} catch {
|
|
249
|
+
return "Failed to parse coverage-final.json \u2014 invalid JSON.";
|
|
250
|
+
}
|
|
251
|
+
for (const [filePath, data] of Object.entries(json)) {
|
|
252
|
+
const statements = data?.s;
|
|
253
|
+
if (!statements) continue;
|
|
254
|
+
const vals = Object.values(statements);
|
|
255
|
+
const total = vals.length;
|
|
256
|
+
const covered = vals.filter((v) => v > 0).length;
|
|
257
|
+
const pct = total > 0 ? covered / total * 100 : 0;
|
|
258
|
+
fileCoverage.push({ file: filePath, covered, total, pct });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (fileCoverage.length === 0) return "Coverage file found but no data could be parsed.";
|
|
262
|
+
fileCoverage.sort((a, b) => sortBy === "desc" ? b.pct - a.pct : a.pct - b.pct);
|
|
263
|
+
const totalLines = fileCoverage.reduce((s, f) => s + f.total, 0);
|
|
264
|
+
const totalCovered = fileCoverage.reduce((s, f) => s + f.covered, 0);
|
|
265
|
+
const overallPct = totalLines > 0 ? totalCovered / totalLines * 100 : 0;
|
|
266
|
+
const lines = [
|
|
267
|
+
`## Test Coverage Report (from ${path.relative(projectRoot, foundPath)})`,
|
|
268
|
+
`Overall: ${overallPct.toFixed(1)}% (${totalCovered}/${totalLines} lines)`,
|
|
269
|
+
`Sorted by coverage ${sortBy === "desc" ? "DESC (highest first)" : "ASC (lowest first)"}, showing top ${limitN}
|
|
270
|
+
`
|
|
271
|
+
];
|
|
272
|
+
for (const f of fileCoverage.slice(0, limitN)) {
|
|
273
|
+
const relFile = f.file.startsWith(projectRoot) ? f.file.slice(projectRoot.length + 1) : f.file;
|
|
274
|
+
lines.push(` ${f.pct.toFixed(1).padStart(5)}% ${relFile} (${f.covered}/${f.total} lines)`);
|
|
275
|
+
}
|
|
276
|
+
return lines.join("\n");
|
|
277
|
+
}
|
|
278
|
+
default:
|
|
279
|
+
return `Unknown tool: ${toolName}`;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
283
|
+
0 && (module.exports = {
|
|
284
|
+
handleGitContext
|
|
285
|
+
});
|
|
286
|
+
//# sourceMappingURL=git-context.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/mcp/handlers/git-context.ts"],
|
|
4
|
+
"sourcesContent": ["import KiroGraph from '../../index';\nimport { mapKind } from './utils';\nimport type { ChangedSymbol } from '../../graph/git-context';\n\nfunction formatChangedSymbol(s: ChangedSymbol): string {\n const lines = [` ${mapKind(s.kind as any)} \\`${s.name}\\` (${s.changeType}) \u2014 ${s.filePath}:${s.startLine}`];\n if (s.callers.length > 0) lines.push(` callers: ${s.callers.map(c => `\\`${c.name}\\``).join(', ')}`);\n if (s.callees.length > 0) lines.push(` calls: ${s.callees.map(c => `\\`${c.name}\\``).join(', ')}`);\n return lines.join('\\n');\n}\n\nexport async function handleGitContext(toolName: string, args: Record<string, unknown>, cg: KiroGraph): Promise<string> {\n const { getChangedSymbols, getCommitContext, getPRContext, getCommitLog, findTestFiles, findUncoveredSymbols } = await Promise.resolve().then(() => require('../../graph/git-context.js'));\n const projectRoot = cg.getProjectRoot();\n const db = cg.getDatabase();\n\n switch (toolName) {\n case 'kirograph_diff_context': {\n const staged = (args.staged as boolean) ?? false;\n let result;\n try {\n result = getChangedSymbols(projectRoot, db, { staged });\n } catch (err: any) {\n return `git diff failed: ${err.message}. Ensure this is a git repository with git installed.`;\n }\n if (result.changedSymbols.length === 0) {\n return staged ? 'No staged changes found.' : 'No unstaged changes found.';\n }\n const lines = [\n `${staged ? 'Staged' : 'Unstaged'} changes \u2014 ${result.changedSymbols.length} affected symbol(s):\\n`,\n ];\n for (const s of result.changedSymbols) lines.push(formatChangedSymbol(s));\n return lines.join('\\n');\n }\n\n case 'kirograph_commit_context': {\n let ctx;\n try {\n ctx = getCommitContext(projectRoot, db);\n } catch (err: any) {\n return `git diff failed: ${err.message}. Ensure this is a git repository with staged changes.`;\n }\n if (ctx.stagedFiles.length === 0) return 'No staged changes. Stage files with `git add` first.';\n const lines = [\n `Staged files (${ctx.stagedFiles.length}):\\n`,\n ...ctx.stagedFiles.map(f => ` ${f}`),\n '\\nDiff summary:',\n ctx.diffStat,\n ];\n if (ctx.changedSymbols.length > 0) {\n lines.push(`\\nAffected symbols (${ctx.changedSymbols.length}):\\n`);\n for (const s of ctx.changedSymbols) lines.push(formatChangedSymbol(s));\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_pr_context': {\n const base = args.base as string;\n const head = (args.head as string) ?? 'HEAD';\n let result;\n try {\n result = getPRContext(projectRoot, db, base, head);\n } catch (err: any) {\n return `PR context failed: ${err.message}`;\n }\n if (result.changedSymbols.length === 0) return `No symbol changes found between ${base} and ${head}.`;\n const lines = [\n `Semantic diff: ${result.ref} \u2014 ${result.changedSymbols.length} affected symbol(s):\\n`,\n ];\n for (const s of result.changedSymbols) lines.push(formatChangedSymbol(s));\n return lines.join('\\n');\n }\n\n case 'kirograph_changelog': {\n const ref1 = args.ref1 as string;\n const ref2 = (args.ref2 as string) ?? 'HEAD';\n let commits;\n try {\n commits = getCommitLog(projectRoot, ref1, ref2);\n } catch (err: any) {\n return `git log failed: ${err.message}`;\n }\n if (commits.length === 0) return `No commits found between ${ref1} and ${ref2}.`;\n let result;\n try {\n result = getPRContext(projectRoot, db, ref1, ref2);\n } catch { result = null; }\n const lines = [\n `## Changelog: ${ref1}..${ref2} (${commits.length} commits)\\n`,\n ...commits.map(c => `- ${c.shortHash} ${c.date} ${c.subject} (${c.author})`),\n ];\n if (result && result.changedSymbols.length > 0) {\n lines.push(`\\n## Affected symbols (${result.changedSymbols.length}):\\n`);\n for (const s of result.changedSymbols.slice(0, 30)) lines.push(formatChangedSymbol(s));\n if (result.changedSymbols.length > 30) lines.push(` \u2026and ${result.changedSymbols.length - 30} more`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_test_map': {\n const symbol = args.symbol as string | undefined;\n if (symbol) {\n const results = cg.searchNodes(symbol, undefined, 5);\n if (results.length === 0) return `Symbol \"${symbol}\" not found in index.`;\n const node = results[0].node;\n const testFiles = findTestFiles(db, node.id);\n if (testFiles.length === 0) return `No test files found that reference \\`${node.name}\\`.`;\n return `Test files covering \\`${node.name}\\` (${testFiles.length}):\\n\\n` +\n testFiles.map(f => ` ${f}`).join('\\n');\n } else {\n const uncovered = findUncoveredSymbols(db, 40);\n if (uncovered.length === 0) return 'All exported symbols appear to have test coverage.';\n const lines = [`Exported symbols with no test coverage (${uncovered.length}):\\n`];\n let lastFile = '';\n for (const s of uncovered) {\n if (s.filePath !== lastFile) { lines.push(`\\n${s.filePath}`); lastFile = s.filePath; }\n lines.push(` ${mapKind(s.kind as any)} \\`${s.name}\\` \u2014 line ${s.startLine}`);\n }\n return lines.join('\\n');\n }\n }\n\n case 'kirograph_flows': {\n const { getExecutionFlows, traceFlow } = await Promise.resolve().then(() => require('../../graph/flows.js'));\n const db = cg.getDatabase();\n if (args.entryPoint) {\n const results = cg.searchNodes(args.entryPoint as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.entryPoint}\" not found in index.`;\n const hops = traceFlow(db, results[0].node.id, (args.maxDepth as number) ?? 10);\n if (hops.length < 2) return `No outgoing call chain found from \"${args.entryPoint}\".`;\n const lines = [`## Execution flow from \\`${args.entryPoint}\\``, ''];\n for (let i = 0; i < hops.length; i++) {\n const hop = hops[i];\n const indent = ' '.repeat(i);\n const arrow = i === 0 ? '\u2192' : '\u21B3';\n const conf = hop.confidence && hop.confidence !== 'extracted' ? ` [${hop.confidence}]` : '';\n lines.push(`${indent}${arrow} ${hop.kind} \\`${hop.symbol}\\` \u2014 ${hop.filePath}:${hop.line}${conf}`);\n }\n return lines.join('\\n');\n }\n const flows = getExecutionFlows(db, { maxFlows: (args.maxFlows as number) ?? 10, maxDepth: (args.maxDepth as number) ?? 10 });\n if (flows.length === 0) return 'No execution flows detected. The graph may be too small or have no call edges.';\n const lines = [`## Execution Flows (${flows.length} detected)`, ''];\n for (const flow of flows) {\n lines.push(`### \\`${flow.entryPoint}\\` (${flow.entryPointKind}) \u2014 criticality: ${flow.criticality.toFixed(2)}`);\n lines.push(`File: ${flow.entryPointFile}`, '');\n for (let i = 0; i < flow.hops.length; i++) {\n const hop = flow.hops[i];\n const indent = ' '.repeat(Math.min(i, 5));\n const arrow = i === 0 ? '\u2192' : '\u21B3';\n const conf = hop.confidence && hop.confidence !== 'extracted' ? ` [${hop.confidence}]` : '';\n lines.push(`${indent}${arrow} \\`${hop.symbol}\\` (${hop.kind}) \u2014 ${hop.filePath}:${hop.line}${conf}`);\n }\n lines.push('');\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_test_coverage': {\n const fs = await import('fs');\n const path = await import('path');\n const sortBy = (args.sortBy as string) ?? 'asc';\n const limitN = typeof args.limit === 'number' ? Math.max(1, Math.min(args.limit, 200)) : 30;\n\n // Search for coverage files\n const candidates = [\n 'lcov.info',\n 'coverage/lcov.info',\n '.nyc_output/lcov.info',\n 'coverage/coverage-final.json',\n ];\n\n let foundPath: string | null = null;\n let fileType: 'lcov' | 'istanbul' | null = null;\n for (const rel of candidates) {\n const full = path.join(projectRoot, rel);\n if (fs.existsSync(full)) {\n foundPath = full;\n fileType = rel.endsWith('.json') ? 'istanbul' : 'lcov';\n break;\n }\n }\n\n if (!foundPath || !fileType) {\n return 'No coverage file found. Generate one with: nyc report --reporter=lcov, jest --coverage, or vitest run --coverage.';\n }\n\n const content = fs.readFileSync(foundPath, 'utf8');\n const fileCoverage: Array<{ file: string; covered: number; total: number; pct: number }> = [];\n\n if (fileType === 'lcov') {\n let currentFile = '';\n let covered = 0;\n let total = 0;\n for (const line of content.split('\\n')) {\n if (line.startsWith('SF:')) {\n currentFile = line.slice(3).trim();\n covered = 0;\n total = 0;\n } else if (line.startsWith('DA:')) {\n const parts = line.slice(3).split(',');\n if (parts.length >= 2) {\n total++;\n if (parseInt(parts[1], 10) > 0) covered++;\n }\n } else if (line.startsWith('end_of_record') && currentFile) {\n const pct = total > 0 ? (covered / total) * 100 : 0;\n fileCoverage.push({ file: currentFile, covered, total, pct });\n currentFile = '';\n }\n }\n } else {\n // Istanbul JSON\n let json: Record<string, any>;\n try {\n json = JSON.parse(content);\n } catch {\n return 'Failed to parse coverage-final.json \u2014 invalid JSON.';\n }\n for (const [filePath, data] of Object.entries(json)) {\n const statements = data?.s as Record<string, number> | undefined;\n if (!statements) continue;\n const vals = Object.values(statements);\n const total = vals.length;\n const covered = vals.filter(v => v > 0).length;\n const pct = total > 0 ? (covered / total) * 100 : 0;\n fileCoverage.push({ file: filePath, covered, total, pct });\n }\n }\n\n if (fileCoverage.length === 0) return 'Coverage file found but no data could be parsed.';\n\n // Sort\n fileCoverage.sort((a, b) => sortBy === 'desc' ? b.pct - a.pct : a.pct - b.pct);\n\n // Overall coverage\n const totalLines = fileCoverage.reduce((s, f) => s + f.total, 0);\n const totalCovered = fileCoverage.reduce((s, f) => s + f.covered, 0);\n const overallPct = totalLines > 0 ? (totalCovered / totalLines) * 100 : 0;\n\n const lines = [\n `## Test Coverage Report (from ${path.relative(projectRoot, foundPath)})`,\n `Overall: ${overallPct.toFixed(1)}% (${totalCovered}/${totalLines} lines)`,\n `Sorted by coverage ${sortBy === 'desc' ? 'DESC (highest first)' : 'ASC (lowest first)'}, showing top ${limitN}\\n`,\n ];\n\n for (const f of fileCoverage.slice(0, limitN)) {\n const relFile = f.file.startsWith(projectRoot) ? f.file.slice(projectRoot.length + 1) : f.file;\n lines.push(` ${f.pct.toFixed(1).padStart(5)}% ${relFile} (${f.covered}/${f.total} lines)`);\n }\n\n return lines.join('\\n');\n }\n\n default:\n return `Unknown tool: ${toolName}`;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["db", "lines"]
|
|
7
|
+
}
|