claude-ide-bridge 2.4.3 → 2.4.4

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.
@@ -1,245 +0,0 @@
1
- import path from "node:path";
2
- import { error, execSafe, optionalBool, optionalInt, optionalString, resolveFilePath, success, } from "./utils.js";
3
- function parseDiffHunks(diffOutput) {
4
- const regions = new Map();
5
- let currentFile = null;
6
- for (const line of diffOutput.split("\n")) {
7
- // Track current file from +++ line
8
- if (line.startsWith("+++ b/")) {
9
- currentFile = line.slice(6);
10
- if (!regions.has(currentFile)) {
11
- regions.set(currentFile, []);
12
- }
13
- continue;
14
- }
15
- // Skip binary files
16
- if (line.startsWith("Binary files")) {
17
- currentFile = null;
18
- continue;
19
- }
20
- // Parse hunk headers
21
- if (currentFile && line.startsWith("@@")) {
22
- const match = line.match(/@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@(.*)/);
23
- if (match) {
24
- const newStart = Number.parseInt(match[1], 10);
25
- const newCount = match[2] !== undefined ? Number.parseInt(match[2], 10) : 1;
26
- const header = match[3]?.trim() ?? "";
27
- if (newCount === 0) {
28
- // Pure deletion — record as a point
29
- regions.get(currentFile)?.push({
30
- startLine: newStart,
31
- endLine: newStart,
32
- header,
33
- });
34
- }
35
- else {
36
- regions.get(currentFile)?.push({
37
- startLine: newStart,
38
- endLine: newStart + newCount - 1,
39
- header,
40
- });
41
- }
42
- }
43
- }
44
- }
45
- return regions;
46
- }
47
- function lineDistance(line, regionStart, regionEnd) {
48
- if (line >= regionStart && line <= regionEnd)
49
- return 0;
50
- if (line < regionStart)
51
- return regionStart - line;
52
- return line - regionEnd;
53
- }
54
- export function createDiffDebugTool(workspace, getDiagnosticsFn) {
55
- return {
56
- schema: {
57
- name: "diffDebug",
58
- description: "Correlate git diffs with diagnostics to identify which changes likely introduced errors or warnings. Compares changed regions with diagnostic locations.",
59
- annotations: { readOnlyHint: true },
60
- inputSchema: {
61
- type: "object",
62
- properties: {
63
- commitRange: {
64
- type: "string",
65
- description: "Git commit range for the diff (e.g., 'HEAD~3..HEAD'). Default: working tree vs HEAD",
66
- },
67
- staged: {
68
- type: "boolean",
69
- description: "If true and no commitRange, diff staged changes vs HEAD. Default: false",
70
- },
71
- filePath: {
72
- type: "string",
73
- description: "Optional file path to limit analysis to",
74
- },
75
- proximity: {
76
- type: "integer",
77
- description: "Number of lines around a changed region to consider 'nearby'. Default: 3",
78
- },
79
- severity: {
80
- oneOf: [
81
- { type: "string" },
82
- { type: "array", items: { type: "string" } },
83
- ],
84
- description: "Filter diagnostics by severity: 'error', 'warning', 'information', 'hint'. Single value or array.",
85
- },
86
- source: {
87
- oneOf: [
88
- { type: "string" },
89
- { type: "array", items: { type: "string" } },
90
- ],
91
- description: "Filter diagnostics by source (e.g., 'tsc', 'eslint', 'pyright'). Single value or array.",
92
- },
93
- },
94
- additionalProperties: false,
95
- },
96
- },
97
- handler: async (args, signal) => {
98
- const commitRange = optionalString(args, "commitRange");
99
- const staged = optionalBool(args, "staged") ?? false;
100
- const rawPath = optionalString(args, "filePath");
101
- const proximity = optionalInt(args, "proximity", 0, 50) ?? 3;
102
- // Reject git flag injection and invalid characters in commit range
103
- if (commitRange?.startsWith("-")) {
104
- return error("commitRange must be a revision range, not a flag");
105
- }
106
- // Allow word chars, dots, dashes, slashes, and git range/ref syntax (~^@:.)
107
- if (commitRange && !/^[\w.\-/^~@:.]+$/.test(commitRange)) {
108
- return error("commitRange contains invalid characters — use a valid git revision range (e.g. 'HEAD~3..HEAD')");
109
- }
110
- // Build diff command
111
- const diffArgs = ["diff", "-U0"];
112
- if (commitRange) {
113
- diffArgs.push(commitRange);
114
- }
115
- else if (staged) {
116
- diffArgs.push("--cached");
117
- }
118
- if (rawPath) {
119
- const filterPath = resolveFilePath(rawPath, workspace);
120
- diffArgs.push("--", filterPath);
121
- }
122
- const diffResult = await execSafe("git", diffArgs, {
123
- cwd: workspace,
124
- signal,
125
- });
126
- if (diffResult.exitCode !== 0 && !diffResult.stdout) {
127
- return error(`git diff failed: ${diffResult.stderr.trim()}`);
128
- }
129
- const changedRegions = parseDiffHunks(diffResult.stdout);
130
- // Get diagnostics
131
- const diagResult = await getDiagnosticsFn({}, signal);
132
- let diagnostics = [];
133
- try {
134
- const rawText = diagResult.content?.[0]?.text;
135
- if (rawText) {
136
- const parsed = JSON.parse(rawText);
137
- diagnostics = parsed.diagnostics ?? parsed.results ?? [];
138
- }
139
- }
140
- catch {
141
- // If parsing fails, no diagnostics to correlate
142
- }
143
- // Apply severity/source filters
144
- const rawSeverity = args.severity;
145
- const severityFilter = rawSeverity
146
- ? (Array.isArray(rawSeverity) ? rawSeverity : [rawSeverity]).filter((s) => typeof s === "string")
147
- : null;
148
- const rawSource = args.source;
149
- const sourceFilter = rawSource
150
- ? (Array.isArray(rawSource) ? rawSource : [rawSource]).filter((s) => typeof s === "string")
151
- : null;
152
- if (severityFilter) {
153
- diagnostics = diagnostics.filter((d) => severityFilter.includes(d.severity));
154
- }
155
- if (sourceFilter) {
156
- diagnostics = diagnostics.filter((d) => sourceFilter.includes(d.source));
157
- }
158
- // Correlate
159
- const correlations = [];
160
- for (const diag of diagnostics) {
161
- // Normalize diagnostic file path to workspace-relative
162
- let diagRelative;
163
- if (path.isAbsolute(diag.file)) {
164
- diagRelative = path.relative(workspace, diag.file);
165
- }
166
- else {
167
- diagRelative = diag.file;
168
- }
169
- // Filter by filePath if specified
170
- if (rawPath) {
171
- const filterRelative = path.relative(workspace, resolveFilePath(rawPath, workspace));
172
- if (diagRelative !== filterRelative)
173
- continue;
174
- }
175
- const regions = changedRegions.get(diagRelative);
176
- if (!regions || regions.length === 0) {
177
- correlations.push({
178
- file: diagRelative,
179
- diagnostic: {
180
- line: diag.line,
181
- column: diag.column,
182
- severity: diag.severity,
183
- message: diag.message,
184
- source: diag.source,
185
- },
186
- diffHunk: null,
187
- likelyIntroducedByChange: false,
188
- distance: null,
189
- });
190
- continue;
191
- }
192
- let minDist = Number.POSITIVE_INFINITY;
193
- let nearestHunk = null;
194
- for (const region of regions) {
195
- const dist = lineDistance(diag.line, region.startLine, region.endLine);
196
- if (dist < minDist) {
197
- minDist = dist;
198
- nearestHunk = region;
199
- }
200
- }
201
- correlations.push({
202
- file: diagRelative,
203
- diagnostic: {
204
- line: diag.line,
205
- column: diag.column,
206
- severity: diag.severity,
207
- message: diag.message,
208
- source: diag.source,
209
- },
210
- diffHunk: nearestHunk
211
- ? {
212
- startLine: nearestHunk.startLine,
213
- endLine: nearestHunk.endLine,
214
- header: nearestHunk.header,
215
- }
216
- : null,
217
- likelyIntroducedByChange: minDist <= proximity,
218
- distance: minDist === Number.POSITIVE_INFINITY ? null : minDist,
219
- });
220
- }
221
- // Sort: likely-introduced first, then by file/line
222
- correlations.sort((a, b) => {
223
- if (a.likelyIntroducedByChange !== b.likelyIntroducedByChange) {
224
- return a.likelyIntroducedByChange ? -1 : 1;
225
- }
226
- if (a.file !== b.file)
227
- return a.file.localeCompare(b.file);
228
- return a.diagnostic.line - b.diagnostic.line;
229
- });
230
- const summary = {
231
- totalDiagnostics: correlations.length,
232
- likelyIntroduced: correlations.filter((c) => c.likelyIntroducedByChange)
233
- .length,
234
- unrelatedToChanges: correlations.filter((c) => !c.likelyIntroducedByChange).length,
235
- filesAnalyzed: new Set(correlations.map((c) => c.file)).size,
236
- filtersApplied: {
237
- severity: severityFilter,
238
- source: sourceFilter,
239
- },
240
- };
241
- return success({ correlations, summary });
242
- },
243
- };
244
- }
245
- //# sourceMappingURL=diffDebugger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diffDebugger.js","sourceRoot":"","sources":["../../src/tools/diffDebugger.ts"],"names":[],"mappings":"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"}
@@ -1,61 +0,0 @@
1
- export declare function createCheckScopeTool(workspace: string): {
2
- schema: {
3
- name: string;
4
- description: string;
5
- annotations: {
6
- readOnlyHint: boolean;
7
- };
8
- inputSchema: {
9
- type: "object";
10
- required: string[];
11
- properties: {
12
- filePath: {
13
- type: string;
14
- description: string;
15
- };
16
- operation: {
17
- type: string;
18
- enum: string[];
19
- description: string;
20
- };
21
- };
22
- additionalProperties: false;
23
- };
24
- };
25
- handler: (args: Record<string, unknown>) => Promise<{
26
- content: Array<{
27
- type: string;
28
- text: string;
29
- }>;
30
- }>;
31
- };
32
- export declare function createExpandScopeTool(workspace: string): {
33
- schema: {
34
- name: string;
35
- description: string;
36
- inputSchema: {
37
- type: "object";
38
- required: string[];
39
- properties: {
40
- entries: {
41
- type: string;
42
- items: {
43
- type: string;
44
- };
45
- description: string;
46
- };
47
- fileName: {
48
- type: string;
49
- description: string;
50
- };
51
- };
52
- additionalProperties: false;
53
- };
54
- };
55
- handler: (args: Record<string, unknown>) => Promise<{
56
- content: Array<{
57
- type: string;
58
- text: string;
59
- }>;
60
- }>;
61
- };
@@ -1,311 +0,0 @@
1
- import fsp from "node:fs/promises";
2
- import path from "node:path";
3
- import { error, optionalString, requireString, resolveFilePath, success, } from "./utils.js";
4
- function parseScopeSection(lines) {
5
- const entries = [];
6
- for (const line of lines) {
7
- const match = line.match(/^- (.+)/);
8
- if (!match)
9
- continue;
10
- let pattern = match[1]?.trim();
11
- if (!pattern)
12
- continue;
13
- const isNegation = pattern.startsWith("!");
14
- if (isNegation)
15
- pattern = pattern.slice(1);
16
- entries.push({
17
- pattern,
18
- isDirectory: pattern.endsWith("/"),
19
- isGlob: pattern.includes("*"),
20
- isNegation,
21
- });
22
- }
23
- return entries;
24
- }
25
- function matchesScopeEntry(relativePath, entry) {
26
- if (entry.isGlob)
27
- return matchesGlob(relativePath, entry.pattern);
28
- if (entry.isDirectory) {
29
- return (relativePath.startsWith(entry.pattern) ||
30
- relativePath.startsWith(entry.pattern.slice(0, -1)));
31
- }
32
- return relativePath === entry.pattern;
33
- }
34
- function extractImplicitPaths(content) {
35
- const paths = new Set();
36
- // Backtick-wrapped paths
37
- const backtickRegex = /`([\w./-]+(?:\.\w+)?)`/g;
38
- let m;
39
- while ((m = backtickRegex.exec(content)) !== null) {
40
- const p = m[1];
41
- if (p.includes("/") || p.includes("."))
42
- paths.add(p);
43
- }
44
- // Bare path-like mentions (word/word.ext or word/word/)
45
- const bareRegex = /(?:^|\s)((?:[\w-]+\/)+[\w.-]+)/gm;
46
- while ((m = bareRegex.exec(content)) !== null) {
47
- paths.add(m[1]);
48
- }
49
- return [...paths];
50
- }
51
- function matchesGlob(filePath, pattern) {
52
- // Guard against ReDoS: reject overly complex patterns
53
- if (pattern.length > 200)
54
- return false;
55
- if ((pattern.match(/\*/g) || []).length > 10)
56
- return false;
57
- // Collapse consecutive * (same fix as minimatch 10.2.1 for CVE-2026-27904)
58
- const collapsed = pattern.replace(/\*{3,}/g, "**");
59
- // Simple glob matching: ** matches any path segments, * matches within segment
60
- const regexStr = collapsed
61
- .replace(/[.+^${}()|[\]\\?]/g, "\\$&")
62
- .replace(/\*\*/g, "§§")
63
- .replace(/\*/g, "[^/]*")
64
- .replace(/§§/g, ".*");
65
- return new RegExp(`^${regexStr}$`).test(filePath);
66
- }
67
- export function createCheckScopeTool(workspace) {
68
- return {
69
- schema: {
70
- name: "checkScope",
71
- description: "Check whether a file path and operation are in-scope for the active plan (.claude-plan.md). Advisory only — returns scope status and suggested action.",
72
- annotations: { readOnlyHint: true },
73
- inputSchema: {
74
- type: "object",
75
- required: ["filePath"],
76
- properties: {
77
- filePath: {
78
- type: "string",
79
- description: "File path to check (absolute or relative to workspace)",
80
- },
81
- operation: {
82
- type: "string",
83
- enum: ["read", "write", "delete", "create"],
84
- description: "Type of operation being considered. Default: 'write'",
85
- },
86
- },
87
- additionalProperties: false,
88
- },
89
- },
90
- handler: async (args) => {
91
- const rawPath = requireString(args, "filePath");
92
- const operation = optionalString(args, "operation") ?? "write";
93
- const resolved = resolveFilePath(rawPath, workspace);
94
- const relativePath = path.relative(workspace, resolved);
95
- // Try to read the plan file
96
- const planPath = path.join(workspace, ".claude-plan.md");
97
- if (!(await fsp.access(planPath).then(() => true, () => false))) {
98
- return success({
99
- planFound: false,
100
- inScope: true,
101
- reason: "No active plan found — all operations permitted",
102
- suggestedAction: "proceed",
103
- scopeSection: false,
104
- });
105
- }
106
- const content = await fsp.readFile(planPath, "utf-8");
107
- // Read operations are always in scope
108
- if (operation === "read") {
109
- return success({
110
- planFound: true,
111
- inScope: true,
112
- reason: "Read operations are always in scope",
113
- suggestedAction: "proceed",
114
- scopeSection: false,
115
- });
116
- }
117
- // Parse ## Scope section
118
- const lines = content.split("\n");
119
- let inScopeSection = false;
120
- const scopeLines = [];
121
- for (const line of lines) {
122
- if (line.match(/^## Scope/i)) {
123
- inScopeSection = true;
124
- continue;
125
- }
126
- if (inScopeSection && line.match(/^## /))
127
- break;
128
- if (inScopeSection)
129
- scopeLines.push(line);
130
- }
131
- const hasExplicitScope = scopeLines.length > 0;
132
- const scopeEntries = parseScopeSection(scopeLines);
133
- const implicitPaths = extractImplicitPaths(content);
134
- // Check explicit scope entries
135
- if (hasExplicitScope) {
136
- // Check negations first — if a negation matches, block immediately
137
- for (const entry of scopeEntries) {
138
- if (entry.isNegation && matchesScopeEntry(relativePath, entry)) {
139
- return success({
140
- planFound: true,
141
- inScope: false,
142
- reason: `Excluded by negation pattern: !${entry.pattern}`,
143
- suggestedAction: "block",
144
- scopeSection: true,
145
- });
146
- }
147
- }
148
- // Check positive scope entries
149
- for (const entry of scopeEntries) {
150
- if (entry.isNegation)
151
- continue;
152
- if (matchesScopeEntry(relativePath, entry)) {
153
- const reason = entry.isGlob
154
- ? `Matches scope glob pattern: ${entry.pattern}`
155
- : entry.isDirectory
156
- ? `Within scoped directory: ${entry.pattern}`
157
- : `Exact match in scope: ${entry.pattern}`;
158
- return success({
159
- planFound: true,
160
- inScope: true,
161
- reason,
162
- suggestedAction: "proceed",
163
- scopeSection: true,
164
- });
165
- }
166
- }
167
- // Check if it's in a mentioned directory but not explicitly scoped
168
- for (const p of implicitPaths) {
169
- if (relativePath === p || relativePath.startsWith(`${p}/`)) {
170
- return success({
171
- planFound: true,
172
- inScope: true,
173
- reason: `Mentioned in plan body but not in explicit Scope section: ${p}`,
174
- suggestedAction: "warn",
175
- scopeSection: true,
176
- });
177
- }
178
- }
179
- const positiveEntries = scopeEntries.filter((e) => !e.isNegation);
180
- return success({
181
- planFound: true,
182
- inScope: false,
183
- reason: `Not matched by any Scope entry. Scoped to: ${positiveEntries.map((e) => e.pattern).join(", ")}`,
184
- suggestedAction: "block",
185
- scopeSection: true,
186
- });
187
- }
188
- // No explicit scope — use implicit mentions
189
- for (const p of implicitPaths) {
190
- if (relativePath === p || relativePath.startsWith(`${p}/`)) {
191
- return success({
192
- planFound: true,
193
- inScope: true,
194
- reason: `Mentioned in plan: ${p}`,
195
- suggestedAction: "proceed",
196
- scopeSection: false,
197
- });
198
- }
199
- }
200
- // Check if any implicit path shares a directory prefix
201
- const relativeDir = path.dirname(relativePath);
202
- for (const p of implicitPaths) {
203
- const pDir = path.dirname(p);
204
- if (relativeDir === pDir || relativeDir.startsWith(`${pDir}/`)) {
205
- return success({
206
- planFound: true,
207
- inScope: true,
208
- reason: `In same directory as plan-mentioned file: ${p}`,
209
- suggestedAction: "proceed",
210
- scopeSection: false,
211
- });
212
- }
213
- }
214
- return success({
215
- planFound: true,
216
- inScope: false,
217
- reason: "File not mentioned in plan",
218
- suggestedAction: "warn",
219
- scopeSection: false,
220
- });
221
- },
222
- };
223
- }
224
- export function createExpandScopeTool(workspace) {
225
- return {
226
- schema: {
227
- name: "expandScope",
228
- description: "Add entries to the ## Scope section of the active plan (.claude-plan.md). Creates the section if it doesn't exist.",
229
- inputSchema: {
230
- type: "object",
231
- required: ["entries"],
232
- properties: {
233
- entries: {
234
- type: "array",
235
- items: { type: "string" },
236
- description: "Scope entries to add (e.g., 'src/utils/', '!dist/', '**/*.test.ts')",
237
- },
238
- fileName: {
239
- type: "string",
240
- description: "Plan filename (default: .claude-plan.md)",
241
- },
242
- },
243
- additionalProperties: false,
244
- },
245
- },
246
- handler: async (args) => {
247
- const rawEntries = args.entries;
248
- if (!Array.isArray(rawEntries) || rawEntries.length === 0) {
249
- return error("entries must be a non-empty array of strings");
250
- }
251
- if (rawEntries.length > 100) {
252
- return error("Maximum 100 scope entries allowed at once");
253
- }
254
- const entries = rawEntries
255
- .filter((e) => typeof e === "string")
256
- .map((e) => e.replace(/[\n\r]/g, "").trim())
257
- .filter((e) => e.length > 0 && e.length <= 200);
258
- if (entries.length === 0) {
259
- return error("No valid entries provided");
260
- }
261
- const fileName = optionalString(args, "fileName") ?? ".claude-plan.md";
262
- const planPath = resolveFilePath(fileName, workspace);
263
- if (!(await fsp.access(planPath).then(() => true, () => false))) {
264
- return error(`Plan file "${fileName}" not found. Use createPlan to create one.`);
265
- }
266
- const content = await fsp.readFile(planPath, "utf-8");
267
- const lines = content.split("\n");
268
- // Find ## Scope section
269
- let scopeStart = -1;
270
- let scopeEnd = lines.length;
271
- for (let i = 0; i < lines.length; i++) {
272
- if (lines[i]?.match(/^## Scope/i)) {
273
- scopeStart = i;
274
- for (let j = i + 1; j < lines.length; j++) {
275
- if (lines[j]?.match(/^## /)) {
276
- scopeEnd = j;
277
- break;
278
- }
279
- }
280
- break;
281
- }
282
- }
283
- const newLines = entries.map((e) => `- ${e.trim()}`);
284
- if (scopeStart === -1) {
285
- // No Scope section — insert after frontmatter
286
- let insertAt = 0;
287
- if (lines[0]?.trim() === "---") {
288
- for (let i = 1; i < lines.length; i++) {
289
- if (lines[i]?.trim() === "---") {
290
- insertAt = i + 1;
291
- break;
292
- }
293
- }
294
- }
295
- const section = ["", "## Scope", "", ...newLines, ""];
296
- lines.splice(insertAt, 0, ...section);
297
- }
298
- else {
299
- // Insert before the next section (or end)
300
- lines.splice(scopeEnd, 0, ...newLines);
301
- }
302
- await fsp.writeFile(planPath, lines.join("\n"), "utf-8");
303
- return success({
304
- expanded: true,
305
- entriesAdded: entries.length,
306
- entries,
307
- });
308
- },
309
- };
310
- }
311
- //# sourceMappingURL=flowGuardian.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"flowGuardian.js","sourceRoot":"","sources":["../../src/tools/flowGuardian.ts"],"names":[],"mappings":"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"}