midnight-mcp 0.1.0 → 0.1.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.
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Repository handler functions
3
+ * Business logic for repository-related MCP tools
4
+ */
5
+ import { githubClient } from "../../pipeline/index.js";
6
+ import { releaseTracker } from "../../pipeline/releases.js";
7
+ import { logger, DEFAULT_REPOSITORIES } from "../../utils/index.js";
8
+ import { REPO_ALIASES, EXAMPLES } from "./constants.js";
9
+ /**
10
+ * Resolve repository name alias to owner/repo
11
+ */
12
+ export function resolveRepo(repoName) {
13
+ // Default to compact if not provided
14
+ const name = repoName || "compact";
15
+ const normalized = name.toLowerCase().replace(/^midnightntwrk\//, "");
16
+ const alias = REPO_ALIASES[normalized];
17
+ if (alias)
18
+ return alias;
19
+ // Try to find in configured repos
20
+ for (const config of DEFAULT_REPOSITORIES) {
21
+ if (config.repo.toLowerCase() === normalized) {
22
+ return { owner: config.owner, repo: config.repo };
23
+ }
24
+ }
25
+ // Assume it's a full org/repo name
26
+ if (name.includes("/")) {
27
+ const [owner, repo] = name.split("/");
28
+ return { owner, repo };
29
+ }
30
+ return null;
31
+ }
32
+ /**
33
+ * Retrieve a specific file from Midnight repositories
34
+ */
35
+ export async function getFile(input) {
36
+ logger.debug("Getting file", { repo: input.repo, path: input.path });
37
+ const repoInfo = resolveRepo(input.repo);
38
+ if (!repoInfo) {
39
+ return {
40
+ error: `Unknown repository: ${input.repo}`,
41
+ suggestion: `Valid repositories: ${Object.keys(REPO_ALIASES).join(", ")}`,
42
+ };
43
+ }
44
+ const file = await githubClient.getFileContent(repoInfo.owner, repoInfo.repo, input.path, input.ref);
45
+ if (!file) {
46
+ return {
47
+ error: `File not found: ${input.path}`,
48
+ repository: `${repoInfo.owner}/${repoInfo.repo}`,
49
+ suggestion: "Check the file path and try again. Use midnight:list-examples to see available example files.",
50
+ };
51
+ }
52
+ return {
53
+ content: file.content,
54
+ path: file.path,
55
+ repository: `${repoInfo.owner}/${repoInfo.repo}`,
56
+ sha: file.sha,
57
+ size: file.size,
58
+ url: `https://github.com/${repoInfo.owner}/${repoInfo.repo}/blob/${input.ref || "main"}/${file.path}`,
59
+ };
60
+ }
61
+ /**
62
+ * List available example contracts and DApps
63
+ */
64
+ export async function listExamples(input) {
65
+ logger.debug("Listing examples", { category: input.category });
66
+ let filteredExamples = EXAMPLES;
67
+ if (input.category && input.category !== "all") {
68
+ filteredExamples = EXAMPLES.filter((e) => e.category === input.category);
69
+ }
70
+ return {
71
+ examples: filteredExamples.map((e) => ({
72
+ name: e.name,
73
+ repository: e.repository,
74
+ description: e.description,
75
+ complexity: e.complexity,
76
+ mainFile: e.mainFile,
77
+ features: e.features,
78
+ githubUrl: `https://github.com/${e.repository}`,
79
+ })),
80
+ totalCount: filteredExamples.length,
81
+ categories: [...new Set(EXAMPLES.map((e) => e.category))],
82
+ };
83
+ }
84
+ /**
85
+ * Retrieve recent changes across Midnight repositories
86
+ */
87
+ export async function getLatestUpdates(input) {
88
+ logger.debug("Getting latest updates", input);
89
+ // Default to last 7 days
90
+ const since = input.since || new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
91
+ const repos = input.repos?.map(resolveRepo).filter(Boolean) ||
92
+ DEFAULT_REPOSITORIES.map((r) => ({ owner: r.owner, repo: r.repo }));
93
+ const updates = [];
94
+ for (const repo of repos) {
95
+ if (!repo)
96
+ continue;
97
+ const commits = await githubClient.getRecentCommits(repo.owner, repo.repo, since, 10);
98
+ if (commits.length > 0) {
99
+ updates.push({
100
+ repository: `${repo.owner}/${repo.repo}`,
101
+ commits,
102
+ });
103
+ }
104
+ }
105
+ // Sort by most recent commit
106
+ updates.sort((a, b) => {
107
+ const aDate = a.commits[0]?.date || "";
108
+ const bDate = b.commits[0]?.date || "";
109
+ return bDate.localeCompare(aDate);
110
+ });
111
+ // Generate summary
112
+ const totalCommits = updates.reduce((sum, u) => sum + u.commits.length, 0);
113
+ const activeRepos = updates.filter((u) => u.commits.length > 0).length;
114
+ return {
115
+ summary: {
116
+ since,
117
+ totalCommits,
118
+ activeRepositories: activeRepos,
119
+ checkedRepositories: repos.length,
120
+ },
121
+ updates: updates.map((u) => ({
122
+ repository: u.repository,
123
+ commitCount: u.commits.length,
124
+ latestCommit: u.commits[0]
125
+ ? {
126
+ message: u.commits[0].message.split("\n")[0], // First line only
127
+ date: u.commits[0].date,
128
+ author: u.commits[0].author,
129
+ url: u.commits[0].url,
130
+ }
131
+ : null,
132
+ recentCommits: u.commits.slice(0, 5).map((c) => ({
133
+ message: c.message.split("\n")[0],
134
+ date: c.date,
135
+ sha: c.sha.substring(0, 7),
136
+ })),
137
+ })),
138
+ };
139
+ }
140
+ /**
141
+ * Get version and release info for a repository
142
+ */
143
+ export async function getVersionInfo(input) {
144
+ logger.debug("Getting version info", input);
145
+ const resolved = resolveRepo(input.repo);
146
+ if (!resolved) {
147
+ throw new Error(`Unknown repository: ${input.repo}. Available: ${Object.keys(REPO_ALIASES).join(", ")}`);
148
+ }
149
+ const versionInfo = await releaseTracker.getVersionInfo(resolved.owner, resolved.repo);
150
+ return {
151
+ repository: `${resolved.owner}/${resolved.repo}`,
152
+ latestVersion: versionInfo.latestRelease?.tag || "No releases found",
153
+ latestStableVersion: versionInfo.latestStableRelease?.tag || "No stable releases",
154
+ publishedAt: versionInfo.latestRelease?.publishedAt || null,
155
+ releaseNotes: versionInfo.latestRelease?.body || null,
156
+ recentReleases: versionInfo.recentReleases.slice(0, 5).map((r) => ({
157
+ version: r.tag,
158
+ date: r.publishedAt.split("T")[0],
159
+ isPrerelease: r.isPrerelease,
160
+ url: r.url,
161
+ })),
162
+ recentBreakingChanges: versionInfo.changelog
163
+ .slice(0, 3)
164
+ .flatMap((c) => c.changes.breaking)
165
+ .slice(0, 10),
166
+ versionContext: releaseTracker.getVersionContext(versionInfo),
167
+ };
168
+ }
169
+ /**
170
+ * Check for breaking changes since a specific version
171
+ */
172
+ export async function checkBreakingChanges(input) {
173
+ logger.debug("Checking breaking changes", input);
174
+ const resolved = resolveRepo(input.repo);
175
+ if (!resolved) {
176
+ throw new Error(`Unknown repository: ${input.repo}. Available: ${Object.keys(REPO_ALIASES).join(", ")}`);
177
+ }
178
+ const outdatedInfo = await releaseTracker.isOutdated(resolved.owner, resolved.repo, input.currentVersion);
179
+ const breakingChanges = await releaseTracker.getBreakingChangesSince(resolved.owner, resolved.repo, input.currentVersion);
180
+ return {
181
+ repository: `${resolved.owner}/${resolved.repo}`,
182
+ currentVersion: input.currentVersion,
183
+ latestVersion: outdatedInfo.latestVersion,
184
+ isOutdated: outdatedInfo.isOutdated,
185
+ versionsBehind: outdatedInfo.versionsBehind,
186
+ hasBreakingChanges: outdatedInfo.hasBreakingChanges,
187
+ breakingChanges: breakingChanges,
188
+ recommendation: outdatedInfo.hasBreakingChanges
189
+ ? `⚠️ Breaking changes detected! Review the ${breakingChanges.length} breaking change(s) before upgrading.`
190
+ : outdatedInfo.isOutdated
191
+ ? `✅ Safe to upgrade. No breaking changes detected since ${input.currentVersion}.`
192
+ : `✅ You're on the latest version.`,
193
+ };
194
+ }
195
+ /**
196
+ * Get migration guide between versions
197
+ */
198
+ export async function getMigrationGuide(input) {
199
+ logger.debug("Getting migration guide", input);
200
+ const resolved = resolveRepo(input.repo);
201
+ if (!resolved) {
202
+ throw new Error(`Unknown repository: ${input.repo}. Available: ${Object.keys(REPO_ALIASES).join(", ")}`);
203
+ }
204
+ const guide = await releaseTracker.getMigrationGuide(resolved.owner, resolved.repo, input.fromVersion, input.toVersion);
205
+ return {
206
+ repository: `${resolved.owner}/${resolved.repo}`,
207
+ from: guide.from,
208
+ to: guide.to,
209
+ summary: {
210
+ breakingChangesCount: guide.breakingChanges.length,
211
+ deprecationsCount: guide.deprecations.length,
212
+ newFeaturesCount: guide.newFeatures.length,
213
+ },
214
+ breakingChanges: guide.breakingChanges,
215
+ deprecations: guide.deprecations,
216
+ newFeatures: guide.newFeatures,
217
+ migrationSteps: guide.migrationSteps,
218
+ migrationDifficulty: guide.breakingChanges.length === 0
219
+ ? "Easy - No breaking changes"
220
+ : guide.breakingChanges.length <= 3
221
+ ? "Moderate - Few breaking changes"
222
+ : "Complex - Multiple breaking changes, plan carefully",
223
+ };
224
+ }
225
+ /**
226
+ * Get a file at a specific version - critical for version-accurate recommendations
227
+ */
228
+ export async function getFileAtVersion(input) {
229
+ logger.debug("Getting file at version", input);
230
+ const resolved = resolveRepo(input.repo);
231
+ if (!resolved) {
232
+ throw new Error(`Unknown repository: ${input.repo}. Available: ${Object.keys(REPO_ALIASES).join(", ")}`);
233
+ }
234
+ const result = await releaseTracker.getFileAtVersion(resolved.owner, resolved.repo, input.path, input.version);
235
+ if (!result) {
236
+ throw new Error(`File not found: ${input.path} at version ${input.version} in ${input.repo}`);
237
+ }
238
+ return {
239
+ repository: `${resolved.owner}/${resolved.repo}`,
240
+ path: input.path,
241
+ version: result.version,
242
+ content: result.content,
243
+ note: `This is the exact content at version ${result.version}. Use this as the source of truth for syntax and API at this version.`,
244
+ };
245
+ }
246
+ /**
247
+ * Compare syntax between two versions - shows what changed
248
+ */
249
+ export async function compareSyntax(input) {
250
+ logger.debug("Comparing syntax between versions", input);
251
+ const resolved = resolveRepo(input.repo);
252
+ if (!resolved) {
253
+ throw new Error(`Unknown repository: ${input.repo}. Available: ${Object.keys(REPO_ALIASES).join(", ")}`);
254
+ }
255
+ // If no newVersion specified, get latest
256
+ let newVersion = input.newVersion;
257
+ if (!newVersion) {
258
+ const versionInfo = await releaseTracker.getVersionInfo(resolved.owner, resolved.repo);
259
+ newVersion =
260
+ versionInfo.latestStableRelease?.tag ||
261
+ versionInfo.latestRelease?.tag ||
262
+ "main";
263
+ }
264
+ const comparison = await releaseTracker.compareSyntax(resolved.owner, resolved.repo, input.path, input.oldVersion, newVersion);
265
+ return {
266
+ repository: `${resolved.owner}/${resolved.repo}`,
267
+ path: input.path,
268
+ oldVersion: comparison.oldVersion,
269
+ newVersion: comparison.newVersion,
270
+ hasDifferences: comparison.hasDifferences,
271
+ oldContent: comparison.oldContent,
272
+ newContent: comparison.newContent,
273
+ recommendation: comparison.hasDifferences
274
+ ? `⚠️ This file has changed between ${comparison.oldVersion} and ${comparison.newVersion}. Review the differences before using code patterns from the old version.`
275
+ : `✅ No changes in this file between versions.`,
276
+ };
277
+ }
278
+ /**
279
+ * Get the latest syntax reference for Compact language
280
+ * This is the source of truth for writing valid, compilable contracts
281
+ */
282
+ export async function getLatestSyntax(input) {
283
+ logger.debug("Getting latest syntax reference", input);
284
+ const resolved = resolveRepo(input.repo);
285
+ if (!resolved) {
286
+ throw new Error(`Unknown repository: ${input.repo}. Available: ${Object.keys(REPO_ALIASES).join(", ")}`);
287
+ }
288
+ const reference = await releaseTracker.getLatestSyntaxReference(resolved.owner, resolved.repo);
289
+ if (!reference || reference.syntaxFiles.length === 0) {
290
+ // Fallback: get example contracts as syntax reference
291
+ const versionInfo = await releaseTracker.getVersionInfo(resolved.owner, resolved.repo);
292
+ const version = versionInfo.latestStableRelease?.tag || "main";
293
+ return {
294
+ repository: `${resolved.owner}/${resolved.repo}`,
295
+ version,
296
+ warning: "No grammar documentation found. Use example contracts as reference.",
297
+ syntaxFiles: [],
298
+ examplePaths: ["examples/", "test/", "contracts/"],
299
+ };
300
+ }
301
+ return {
302
+ repository: `${resolved.owner}/${resolved.repo}`,
303
+ version: reference.version,
304
+ syntaxFiles: reference.syntaxFiles.map((f) => ({
305
+ path: f.path,
306
+ content: f.content,
307
+ })),
308
+ note: `This is the authoritative syntax reference at version ${reference.version}. Use this to ensure contracts are compilable.`,
309
+ };
310
+ }
311
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Repository module exports
3
+ * Barrel file for repository-related tools
4
+ */
5
+ export { GetFileInputSchema, ListExamplesInputSchema, GetLatestUpdatesInputSchema, GetVersionInfoInputSchema, CheckBreakingChangesInputSchema, GetMigrationGuideInputSchema, GetFileAtVersionInputSchema, CompareSyntaxInputSchema, GetLatestSyntaxInputSchema, type GetFileInput, type ListExamplesInput, type GetLatestUpdatesInput, type GetVersionInfoInput, type CheckBreakingChangesInput, type GetMigrationGuideInput, type GetFileAtVersionInput, type CompareSyntaxInput, type GetLatestSyntaxInput, } from "./schemas.js";
6
+ export { REPO_ALIASES, EXAMPLES, type ExampleDefinition } from "./constants.js";
7
+ export { resolveRepo, getFile, listExamples, getLatestUpdates, getVersionInfo, checkBreakingChanges, getMigrationGuide, getFileAtVersion, compareSyntax, getLatestSyntax, } from "./handlers.js";
8
+ export { repositoryTools } from "./tools.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Repository module exports
3
+ * Barrel file for repository-related tools
4
+ */
5
+ // Schemas and types
6
+ export { GetFileInputSchema, ListExamplesInputSchema, GetLatestUpdatesInputSchema, GetVersionInfoInputSchema, CheckBreakingChangesInputSchema, GetMigrationGuideInputSchema, GetFileAtVersionInputSchema, CompareSyntaxInputSchema, GetLatestSyntaxInputSchema, } from "./schemas.js";
7
+ // Constants
8
+ export { REPO_ALIASES, EXAMPLES } from "./constants.js";
9
+ // Handlers
10
+ export { resolveRepo, getFile, listExamples, getLatestUpdates, getVersionInfo, checkBreakingChanges, getMigrationGuide, getFileAtVersion, compareSyntax, getLatestSyntax, } from "./handlers.js";
11
+ // Tools
12
+ export { repositoryTools } from "./tools.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Repository tool input schemas
3
+ * Zod schemas for validating tool inputs
4
+ */
5
+ import { z } from "zod";
6
+ export declare const GetFileInputSchema: z.ZodObject<{
7
+ repo: z.ZodString;
8
+ path: z.ZodString;
9
+ ref: z.ZodOptional<z.ZodString>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ path: string;
12
+ repo: string;
13
+ ref?: string | undefined;
14
+ }, {
15
+ path: string;
16
+ repo: string;
17
+ ref?: string | undefined;
18
+ }>;
19
+ export declare const ListExamplesInputSchema: z.ZodObject<{
20
+ category: z.ZodDefault<z.ZodOptional<z.ZodEnum<["counter", "bboard", "token", "voting", "all"]>>>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ category: "all" | "counter" | "bboard" | "token" | "voting";
23
+ }, {
24
+ category?: "all" | "counter" | "bboard" | "token" | "voting" | undefined;
25
+ }>;
26
+ export declare const GetLatestUpdatesInputSchema: z.ZodObject<{
27
+ since: z.ZodOptional<z.ZodString>;
28
+ repos: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
29
+ }, "strip", z.ZodTypeAny, {
30
+ repos?: string[] | undefined;
31
+ since?: string | undefined;
32
+ }, {
33
+ repos?: string[] | undefined;
34
+ since?: string | undefined;
35
+ }>;
36
+ export declare const GetVersionInfoInputSchema: z.ZodObject<{
37
+ repo: z.ZodString;
38
+ }, "strip", z.ZodTypeAny, {
39
+ repo: string;
40
+ }, {
41
+ repo: string;
42
+ }>;
43
+ export declare const CheckBreakingChangesInputSchema: z.ZodObject<{
44
+ repo: z.ZodString;
45
+ currentVersion: z.ZodString;
46
+ }, "strip", z.ZodTypeAny, {
47
+ repo: string;
48
+ currentVersion: string;
49
+ }, {
50
+ repo: string;
51
+ currentVersion: string;
52
+ }>;
53
+ export declare const GetMigrationGuideInputSchema: z.ZodObject<{
54
+ repo: z.ZodString;
55
+ fromVersion: z.ZodString;
56
+ toVersion: z.ZodOptional<z.ZodString>;
57
+ }, "strip", z.ZodTypeAny, {
58
+ repo: string;
59
+ fromVersion: string;
60
+ toVersion?: string | undefined;
61
+ }, {
62
+ repo: string;
63
+ fromVersion: string;
64
+ toVersion?: string | undefined;
65
+ }>;
66
+ export declare const GetFileAtVersionInputSchema: z.ZodObject<{
67
+ repo: z.ZodString;
68
+ path: z.ZodString;
69
+ version: z.ZodString;
70
+ }, "strip", z.ZodTypeAny, {
71
+ path: string;
72
+ repo: string;
73
+ version: string;
74
+ }, {
75
+ path: string;
76
+ repo: string;
77
+ version: string;
78
+ }>;
79
+ export declare const CompareSyntaxInputSchema: z.ZodObject<{
80
+ repo: z.ZodString;
81
+ path: z.ZodString;
82
+ oldVersion: z.ZodString;
83
+ newVersion: z.ZodOptional<z.ZodString>;
84
+ }, "strip", z.ZodTypeAny, {
85
+ path: string;
86
+ repo: string;
87
+ oldVersion: string;
88
+ newVersion?: string | undefined;
89
+ }, {
90
+ path: string;
91
+ repo: string;
92
+ oldVersion: string;
93
+ newVersion?: string | undefined;
94
+ }>;
95
+ export declare const GetLatestSyntaxInputSchema: z.ZodObject<{
96
+ repo: z.ZodDefault<z.ZodString>;
97
+ }, "strip", z.ZodTypeAny, {
98
+ repo: string;
99
+ }, {
100
+ repo?: string | undefined;
101
+ }>;
102
+ export type GetFileInput = z.infer<typeof GetFileInputSchema>;
103
+ export type ListExamplesInput = z.infer<typeof ListExamplesInputSchema>;
104
+ export type GetLatestUpdatesInput = z.infer<typeof GetLatestUpdatesInputSchema>;
105
+ export type GetVersionInfoInput = z.infer<typeof GetVersionInfoInputSchema>;
106
+ export type CheckBreakingChangesInput = z.infer<typeof CheckBreakingChangesInputSchema>;
107
+ export type GetMigrationGuideInput = z.infer<typeof GetMigrationGuideInputSchema>;
108
+ export type GetFileAtVersionInput = z.infer<typeof GetFileAtVersionInputSchema>;
109
+ export type CompareSyntaxInput = z.infer<typeof CompareSyntaxInputSchema>;
110
+ export type GetLatestSyntaxInput = z.infer<typeof GetLatestSyntaxInputSchema>;
111
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Repository tool input schemas
3
+ * Zod schemas for validating tool inputs
4
+ */
5
+ import { z } from "zod";
6
+ // Schema definitions
7
+ export const GetFileInputSchema = z.object({
8
+ repo: z
9
+ .string()
10
+ .describe("Repository name (e.g., 'compact', 'midnight-js', 'example-counter')"),
11
+ path: z.string().describe("File path within repository"),
12
+ ref: z
13
+ .string()
14
+ .optional()
15
+ .describe("Branch, tag, or commit SHA (default: main)"),
16
+ });
17
+ export const ListExamplesInputSchema = z.object({
18
+ category: z
19
+ .enum(["counter", "bboard", "token", "voting", "all"])
20
+ .optional()
21
+ .default("all")
22
+ .describe("Filter by example type"),
23
+ });
24
+ export const GetLatestUpdatesInputSchema = z.object({
25
+ since: z
26
+ .string()
27
+ .optional()
28
+ .describe("ISO date to fetch updates from (default: last 7 days)"),
29
+ repos: z
30
+ .array(z.string())
31
+ .optional()
32
+ .describe("Specific repos to check (default: all configured repos)"),
33
+ });
34
+ export const GetVersionInfoInputSchema = z.object({
35
+ repo: z.string().describe("Repository name (e.g., 'compact', 'midnight-js')"),
36
+ });
37
+ export const CheckBreakingChangesInputSchema = z.object({
38
+ repo: z.string().describe("Repository name (e.g., 'compact', 'midnight-js')"),
39
+ currentVersion: z
40
+ .string()
41
+ .describe("Version you're currently using (e.g., 'v1.0.0', '0.5.2')"),
42
+ });
43
+ export const GetMigrationGuideInputSchema = z.object({
44
+ repo: z.string().describe("Repository name (e.g., 'compact', 'midnight-js')"),
45
+ fromVersion: z.string().describe("Version you're migrating from"),
46
+ toVersion: z
47
+ .string()
48
+ .optional()
49
+ .describe("Target version (default: latest stable)"),
50
+ });
51
+ export const GetFileAtVersionInputSchema = z.object({
52
+ repo: z.string().describe("Repository name (e.g., 'compact', 'midnight-js')"),
53
+ path: z.string().describe("File path within repository"),
54
+ version: z
55
+ .string()
56
+ .describe("Version tag (e.g., 'v1.0.0') or branch (e.g., 'main')"),
57
+ });
58
+ export const CompareSyntaxInputSchema = z.object({
59
+ repo: z.string().describe("Repository name (e.g., 'compact')"),
60
+ path: z.string().describe("File path to compare"),
61
+ oldVersion: z.string().describe("Old version tag (e.g., 'v0.9.0')"),
62
+ newVersion: z
63
+ .string()
64
+ .optional()
65
+ .describe("New version tag (default: latest)"),
66
+ });
67
+ export const GetLatestSyntaxInputSchema = z.object({
68
+ repo: z
69
+ .string()
70
+ .default("compact")
71
+ .describe("Repository name (default: 'compact')"),
72
+ });
73
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Repository tool definitions
3
+ * MCP tool registration for repository-related operations
4
+ */
5
+ import type { ExtendedToolDefinition } from "../../types/index.js";
6
+ export declare const repositoryTools: ExtendedToolDefinition[];
7
+ //# sourceMappingURL=tools.d.ts.map