@gaud_erp/paperclip-github-manager 1.4.0 → 1.6.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/dist/manifest.js +71 -2
- package/dist/manifest.js.map +2 -2
- package/dist/worker.js +95 -0
- package/dist/worker.js.map +3 -3
- package/package.json +1 -1
- package/src/db/migrations/002_repo_graph_cache.sql +3 -0
package/dist/manifest.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/manifest.ts
|
|
2
2
|
var manifest = {
|
|
3
3
|
id: "cus.github-manager",
|
|
4
|
-
version: "1.
|
|
4
|
+
version: "1.6.0",
|
|
5
5
|
apiVersion: 1,
|
|
6
6
|
displayName: "GitHub Manager",
|
|
7
7
|
description: "Manage GitHub repos, PRs, issues, agent code reviews, and knowledge graphs \u2014 all from Paperclip",
|
|
@@ -29,7 +29,8 @@ var manifest = {
|
|
|
29
29
|
"ui.sidebar.register",
|
|
30
30
|
"ui.detailTab.register",
|
|
31
31
|
"ui.action.register",
|
|
32
|
-
"instance.settings.register"
|
|
32
|
+
"instance.settings.register",
|
|
33
|
+
"skills.managed"
|
|
33
34
|
],
|
|
34
35
|
instanceConfigSchema: {
|
|
35
36
|
type: "object",
|
|
@@ -158,6 +159,19 @@ var manifest = {
|
|
|
158
159
|
},
|
|
159
160
|
required: ["query"]
|
|
160
161
|
}
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
name: "github_get_repo_structure",
|
|
165
|
+
displayName: "Get Repo Structure",
|
|
166
|
+
description: "Get the cached directory/file structure of a repository. Use this FIRST before reading files to understand the codebase layout and save tokens. Set refresh=true to regenerate from GitHub.",
|
|
167
|
+
parametersSchema: {
|
|
168
|
+
type: "object",
|
|
169
|
+
properties: {
|
|
170
|
+
repo_full_name: { type: "string", description: "owner/repo format" },
|
|
171
|
+
refresh: { type: "boolean", description: "Set true to regenerate the structure from GitHub (use when cache is stale)" }
|
|
172
|
+
},
|
|
173
|
+
required: ["repo_full_name"]
|
|
174
|
+
}
|
|
161
175
|
}
|
|
162
176
|
],
|
|
163
177
|
agents: [
|
|
@@ -168,6 +182,61 @@ var manifest = {
|
|
|
168
182
|
title: "Senior Code Reviewer"
|
|
169
183
|
}
|
|
170
184
|
],
|
|
185
|
+
skills: [
|
|
186
|
+
{
|
|
187
|
+
skillKey: "github-codebase-access",
|
|
188
|
+
displayName: "GitHub Codebase Access",
|
|
189
|
+
description: "Provides agents with tools to read repository structure and files from GitHub without needing local filesystem access",
|
|
190
|
+
markdown: `# GitHub Codebase Access
|
|
191
|
+
|
|
192
|
+
You have access to GitHub repositories through the GitHub Manager plugin tools. NEVER say you don't have access to the codebase.
|
|
193
|
+
|
|
194
|
+
## Available Tools
|
|
195
|
+
|
|
196
|
+
### 1. github_get_repo_structure
|
|
197
|
+
Get the directory and file structure of a repository. **Always call this FIRST** before reading any files.
|
|
198
|
+
|
|
199
|
+
Parameters:
|
|
200
|
+
- \`repo_full_name\` (required): Repository in "owner/repo" format
|
|
201
|
+
- \`refresh\` (optional): Set to true to regenerate from GitHub if cache is stale
|
|
202
|
+
|
|
203
|
+
### 2. github_read_file_content
|
|
204
|
+
Read the content of a specific file from a GitHub repository.
|
|
205
|
+
|
|
206
|
+
Parameters:
|
|
207
|
+
- \`owner\` (required): Repository owner (e.g. "gauderp")
|
|
208
|
+
- \`repo\` (required): Repository name (e.g. "gaud-erp-api")
|
|
209
|
+
- \`path\` (required): File path (e.g. "src/main/java/com/gaud/App.java")
|
|
210
|
+
- \`ref\` (optional): Branch or commit SHA (defaults to main branch)
|
|
211
|
+
|
|
212
|
+
### 3. github_get_pull_request_diff
|
|
213
|
+
Get the unified diff of a pull request for code review.
|
|
214
|
+
|
|
215
|
+
Parameters:
|
|
216
|
+
- \`owner\`, \`repo\`, \`pull_number\`
|
|
217
|
+
|
|
218
|
+
### 4. github_search_issues
|
|
219
|
+
Search GitHub issues and PRs using GitHub search syntax.
|
|
220
|
+
|
|
221
|
+
Parameters:
|
|
222
|
+
- \`query\`: GitHub search query (e.g. "is:open label:bug")
|
|
223
|
+
|
|
224
|
+
### 5. github_list_repositories
|
|
225
|
+
List all tracked GitHub repositories (no parameters needed).
|
|
226
|
+
|
|
227
|
+
## Mandatory Workflow
|
|
228
|
+
|
|
229
|
+
1. **ALWAYS** start with \`github_get_repo_structure\` to understand the codebase layout
|
|
230
|
+
2. Read only the files you actually need with \`github_read_file_content\`
|
|
231
|
+
3. If the structure seems outdated, call \`github_get_repo_structure\` with \`refresh=true\`
|
|
232
|
+
4. Never try to access the local filesystem for source code \u2014 always use these tools
|
|
233
|
+
|
|
234
|
+
## Token Efficiency
|
|
235
|
+
The structure cache returns directories and key files in a single call (~5-50KB).
|
|
236
|
+
This replaces hundreds of file-listing API calls, saving 60-90% of tokens.
|
|
237
|
+
`
|
|
238
|
+
}
|
|
239
|
+
],
|
|
171
240
|
ui: {
|
|
172
241
|
slots: [
|
|
173
242
|
{
|
package/dist/manifest.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/manifest.ts"],
|
|
4
|
-
"sourcesContent": ["import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: \"cus.github-manager\",\n version: \"1.
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: \"cus.github-manager\",\n version: \"1.6.0\",\n apiVersion: 1,\n displayName: \"GitHub Manager\",\n description: \"Manage GitHub repos, PRs, issues, agent code reviews, and knowledge graphs \u2014 all from Paperclip\",\n author: \"Gaud ERP\",\n categories: [\"connector\", \"automation\"],\n\n capabilities: [\n \"events.subscribe\",\n \"events.emit\",\n \"http.outbound\",\n \"plugin.state.read\",\n \"plugin.state.write\",\n \"database.namespace.read\",\n \"database.namespace.write\",\n \"database.namespace.migrate\",\n \"jobs.schedule\",\n \"webhooks.receive\",\n \"agent.tools.register\",\n \"agents.managed\",\n \"agents.invoke\",\n \"agents.read\",\n \"issues.read\",\n \"companies.read\",\n \"ui.page.register\",\n \"ui.dashboardWidget.register\",\n \"ui.sidebar.register\",\n \"ui.detailTab.register\",\n \"ui.action.register\",\n \"instance.settings.register\",\n \"skills.managed\",\n ],\n\n instanceConfigSchema: {\n type: \"object\",\n required: [\"githubToken\"],\n properties: {\n githubToken: {\n type: \"string\",\n title: \"GitHub Personal Access Token\",\n description: \"Cole aqui o PAT do GitHub com permiss\u00F5es 'repo' e 'read:org'\",\n },\n defaultOrg: {\n type: \"string\",\n title: \"Default Organization\",\n description: \"GitHub organization to sync repositories from (optional)\",\n },\n syncIntervalMinutes: {\n type: \"number\",\n title: \"Sync Interval (minutes)\",\n description: \"How often to sync PRs and issues (default: 5)\",\n default: 5,\n minimum: 1,\n maximum: 1440,\n },\n },\n },\n\n entrypoints: {\n worker: \"./dist/worker.js\",\n ui: \"./dist/ui\",\n },\n\n database: {\n migrationsDir: \"src/db/migrations\",\n },\n\n jobs: [\n {\n jobKey: \"sync-github\",\n displayName: \"Sync GitHub PRs and Issues\",\n schedule: \"*/5 * * * *\",\n description: \"Incremental sync of open PRs and issues for tracked repositories\",\n },\n ],\n\n webhooks: [\n {\n endpointKey: \"github-events\",\n displayName: \"GitHub Events\",\n description: \"Receives GitHub webhook events (pull_request, issues)\",\n },\n ],\n\n tools: [\n {\n name: \"github_get_pull_request_diff\",\n displayName: \"Get PR Diff\",\n description: \"Retrieve the unified diff of a GitHub pull request\",\n parametersSchema: {\n type: \"object\",\n properties: {\n owner: { type: \"string\" },\n repo: { type: \"string\" },\n pull_number: { type: \"number\" },\n },\n required: [\"owner\", \"repo\", \"pull_number\"],\n },\n },\n {\n name: \"github_read_file_content\",\n displayName: \"Read File\",\n description: \"Read a file from a GitHub repository\",\n parametersSchema: {\n type: \"object\",\n properties: {\n owner: { type: \"string\" },\n repo: { type: \"string\" },\n path: { type: \"string\" },\n ref: { type: \"string\" },\n },\n required: [\"owner\", \"repo\", \"path\"],\n },\n },\n {\n name: \"github_create_review_comment\",\n displayName: \"Add Review Comment\",\n description: \"Post an inline review comment on a pull request\",\n parametersSchema: {\n type: \"object\",\n properties: {\n owner: { type: \"string\" },\n repo: { type: \"string\" },\n pull_number: { type: \"number\" },\n commit_id: { type: \"string\" },\n path: { type: \"string\" },\n line: { type: \"number\" },\n body: { type: \"string\" },\n },\n required: [\"owner\", \"repo\", \"pull_number\", \"commit_id\", \"path\", \"line\", \"body\"],\n },\n },\n {\n name: \"github_submit_pr_review\",\n displayName: \"Submit PR Review\",\n description: \"Submit a review verdict (approve, request changes, comment)\",\n parametersSchema: {\n type: \"object\",\n properties: {\n owner: { type: \"string\" },\n repo: { type: \"string\" },\n pull_number: { type: \"number\" },\n event: { type: \"string\", enum: [\"APPROVE\", \"REQUEST_CHANGES\", \"COMMENT\"] },\n body: { type: \"string\" },\n },\n required: [\"owner\", \"repo\", \"pull_number\", \"event\", \"body\"],\n },\n },\n {\n name: \"github_list_repositories\",\n displayName: \"List Repositories\",\n description: \"List all tracked GitHub repositories\",\n parametersSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"github_search_issues\",\n displayName: \"Search Issues\",\n description: \"Search GitHub issues and PRs using search syntax\",\n parametersSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\" },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"github_get_repo_structure\",\n displayName: \"Get Repo Structure\",\n description: \"Get the cached directory/file structure of a repository. Use this FIRST before reading files to understand the codebase layout and save tokens. Set refresh=true to regenerate from GitHub.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n repo_full_name: { type: \"string\", description: \"owner/repo format\" },\n refresh: { type: \"boolean\", description: \"Set true to regenerate the structure from GitHub (use when cache is stale)\" },\n },\n required: [\"repo_full_name\"],\n },\n },\n ],\n\n agents: [\n {\n agentKey: \"github-reviewer\",\n displayName: \"GitHub Code Reviewer\",\n role: \"code-review\",\n title: \"Senior Code Reviewer\",\n },\n ],\n\n skills: [\n {\n skillKey: \"github-codebase-access\",\n displayName: \"GitHub Codebase Access\",\n description: \"Provides agents with tools to read repository structure and files from GitHub without needing local filesystem access\",\n markdown: `# GitHub Codebase Access\n\nYou have access to GitHub repositories through the GitHub Manager plugin tools. NEVER say you don't have access to the codebase.\n\n## Available Tools\n\n### 1. github_get_repo_structure\nGet the directory and file structure of a repository. **Always call this FIRST** before reading any files.\n\nParameters:\n- \\`repo_full_name\\` (required): Repository in \"owner/repo\" format\n- \\`refresh\\` (optional): Set to true to regenerate from GitHub if cache is stale\n\n### 2. github_read_file_content\nRead the content of a specific file from a GitHub repository.\n\nParameters:\n- \\`owner\\` (required): Repository owner (e.g. \"gauderp\")\n- \\`repo\\` (required): Repository name (e.g. \"gaud-erp-api\")\n- \\`path\\` (required): File path (e.g. \"src/main/java/com/gaud/App.java\")\n- \\`ref\\` (optional): Branch or commit SHA (defaults to main branch)\n\n### 3. github_get_pull_request_diff\nGet the unified diff of a pull request for code review.\n\nParameters:\n- \\`owner\\`, \\`repo\\`, \\`pull_number\\`\n\n### 4. github_search_issues\nSearch GitHub issues and PRs using GitHub search syntax.\n\nParameters:\n- \\`query\\`: GitHub search query (e.g. \"is:open label:bug\")\n\n### 5. github_list_repositories\nList all tracked GitHub repositories (no parameters needed).\n\n## Mandatory Workflow\n\n1. **ALWAYS** start with \\`github_get_repo_structure\\` to understand the codebase layout\n2. Read only the files you actually need with \\`github_read_file_content\\`\n3. If the structure seems outdated, call \\`github_get_repo_structure\\` with \\`refresh=true\\`\n4. Never try to access the local filesystem for source code \u2014 always use these tools\n\n## Token Efficiency\nThe structure cache returns directories and key files in a single call (~5-50KB).\nThis replaces hundreds of file-listing API calls, saving 60-90% of tokens.\n`,\n },\n ],\n\n ui: {\n slots: [\n {\n type: \"sidebar\",\n id: \"github-sidebar\",\n exportName: \"GitHubSidebarLink\",\n displayName: \"GitHub\",\n },\n {\n type: \"page\",\n id: \"github-settings\",\n exportName: \"GitHubSettingsPage\",\n displayName: \"Configura\u00E7\u00F5es GitHub\",\n routePath: \"github-settings\",\n },\n {\n type: \"page\",\n id: \"github-repos\",\n exportName: \"GitHubReposPage\",\n displayName: \"Reposit\u00F3rios\",\n routePath: \"github-repos\",\n },\n {\n type: \"page\",\n id: \"github-prs\",\n exportName: \"GitHubPullRequestsPage\",\n displayName: \"Pull Requests\",\n routePath: \"github-prs\",\n },\n {\n type: \"page\",\n id: \"github-graphs\",\n exportName: \"GitHubGraphsPage\",\n displayName: \"Knowledge Graphs\",\n routePath: \"github-graphs\",\n },\n {\n type: \"dashboardWidget\",\n id: \"github-dashboard\",\n exportName: \"GitHubDashboardWidget\",\n displayName: \"GitHub Status\",\n },\n {\n type: \"detailTab\",\n id: \"github-detail\",\n exportName: \"GitHubDetailTab\",\n displayName: \"GitHub\",\n entityTypes: [\"issue\"],\n },\n {\n type: \"contextMenuItem\",\n id: \"github-context-menu\",\n exportName: \"GitHubContextMenu\",\n displayName: \"GitHub Actions\",\n entityTypes: [\"issue\"],\n },\n ],\n },\n};\n\nexport default manifest;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/worker.js
CHANGED
|
@@ -18,9 +18,11 @@ __export(queries_exports, {
|
|
|
18
18
|
getLinksForPR: () => getLinksForPR,
|
|
19
19
|
getPRByRepoAndNumber: () => getPRByRepoAndNumber,
|
|
20
20
|
getRepoByFullName: () => getRepoByFullName,
|
|
21
|
+
getRepoGraph: () => getRepoGraph,
|
|
21
22
|
linkPRToCard: () => linkPRToCard,
|
|
22
23
|
listPRs: () => listPRs,
|
|
23
24
|
listRepos: () => listRepos,
|
|
25
|
+
saveRepoGraph: () => saveRepoGraph,
|
|
24
26
|
upsertIssue: () => upsertIssue,
|
|
25
27
|
upsertPR: () => upsertPR,
|
|
26
28
|
upsertRepo: () => upsertRepo
|
|
@@ -251,6 +253,23 @@ async function getLastSyncTime(db) {
|
|
|
251
253
|
);
|
|
252
254
|
return rows.length > 0 ? rows[0].finished_at : null;
|
|
253
255
|
}
|
|
256
|
+
async function saveRepoGraph(db, repoId, graphJson) {
|
|
257
|
+
await db.execute(
|
|
258
|
+
`UPDATE ${S}.gh_repositories SET graph_json=$1, graph_generated_at=$2 WHERE id=$3`,
|
|
259
|
+
[graphJson, (/* @__PURE__ */ new Date()).toISOString(), repoId]
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
async function getRepoGraph(db, fullName) {
|
|
263
|
+
const rows = await db.query(
|
|
264
|
+
`SELECT graph_json, graph_generated_at FROM ${S}.gh_repositories WHERE full_name = $1 AND graph_json IS NOT NULL`,
|
|
265
|
+
[fullName]
|
|
266
|
+
);
|
|
267
|
+
if (rows.length === 0) return null;
|
|
268
|
+
return {
|
|
269
|
+
graphJson: rows[0].graph_json,
|
|
270
|
+
generatedAt: rows[0].graph_generated_at
|
|
271
|
+
};
|
|
272
|
+
}
|
|
254
273
|
var S;
|
|
255
274
|
var init_queries = __esm({
|
|
256
275
|
"src/db/queries.ts"() {
|
|
@@ -9244,6 +9263,7 @@ function isRateLimitSafe(rateLimit, threshold = 100) {
|
|
|
9244
9263
|
}
|
|
9245
9264
|
|
|
9246
9265
|
// src/review/review-tools.ts
|
|
9266
|
+
init_queries();
|
|
9247
9267
|
var MAX_DIFF_CHARS = 12e4;
|
|
9248
9268
|
var MAX_FILE_CHARS = 128e3;
|
|
9249
9269
|
function registerReviewTools(ctx) {
|
|
@@ -9442,6 +9462,62 @@ ${diff}`,
|
|
|
9442
9462
|
return { content: items.map((i) => `#${i.number} ${i.title} [${i.state}]`).join("\n"), data: { items } };
|
|
9443
9463
|
}
|
|
9444
9464
|
);
|
|
9465
|
+
ctx.tools.register(
|
|
9466
|
+
"github_get_repo_structure",
|
|
9467
|
+
{
|
|
9468
|
+
displayName: "Get Repo Structure",
|
|
9469
|
+
description: "Get the cached directory and file structure of a repository. Call this FIRST before reading files to understand codebase layout.",
|
|
9470
|
+
parametersSchema: {
|
|
9471
|
+
type: "object",
|
|
9472
|
+
properties: {
|
|
9473
|
+
repo_full_name: { type: "string", description: "Repository in owner/repo format" }
|
|
9474
|
+
},
|
|
9475
|
+
required: ["repo_full_name"]
|
|
9476
|
+
}
|
|
9477
|
+
},
|
|
9478
|
+
async (params, runCtx) => {
|
|
9479
|
+
const { repo_full_name, refresh } = params;
|
|
9480
|
+
const companyId = runCtx.companyId;
|
|
9481
|
+
if (refresh && companyId) {
|
|
9482
|
+
const repo = await getRepoByFullName(ctx.db, repo_full_name);
|
|
9483
|
+
if (repo) {
|
|
9484
|
+
const { data: treeData } = await githubFetch(
|
|
9485
|
+
ctx,
|
|
9486
|
+
companyId,
|
|
9487
|
+
`/repos/${repo_full_name}/git/trees/${repo.defaultBranch}?recursive=1`
|
|
9488
|
+
);
|
|
9489
|
+
const tree = treeData.tree;
|
|
9490
|
+
const dirs = [];
|
|
9491
|
+
const files = [];
|
|
9492
|
+
for (const entry of tree) {
|
|
9493
|
+
const p = entry.path;
|
|
9494
|
+
if (entry.type === "tree" && p.split("/").length <= 3) dirs.push(p);
|
|
9495
|
+
else if (entry.type === "blob" && (p.split("/").length <= 2 || /\.(ts|js|py|go|rs|java|json|ya?ml|toml|md)$/.test(p))) files.push(p);
|
|
9496
|
+
}
|
|
9497
|
+
const graph2 = { dirs, files, defaultBranch: repo.defaultBranch, language: repo.language };
|
|
9498
|
+
await saveRepoGraph(ctx.db, repo.id, JSON.stringify(graph2));
|
|
9499
|
+
}
|
|
9500
|
+
}
|
|
9501
|
+
const cached = await getRepoGraph(ctx.db, repo_full_name);
|
|
9502
|
+
if (!cached) {
|
|
9503
|
+
return { content: `No cached structure for ${repo_full_name}. Run a full sync first or call with refresh=true.` };
|
|
9504
|
+
}
|
|
9505
|
+
const graph = JSON.parse(cached.graphJson);
|
|
9506
|
+
const summary = [
|
|
9507
|
+
`Repository: ${repo_full_name}`,
|
|
9508
|
+
`Language: ${graph.language ?? "unknown"}`,
|
|
9509
|
+
`Default branch: ${graph.defaultBranch}`,
|
|
9510
|
+
`Generated: ${cached.generatedAt}`,
|
|
9511
|
+
``,
|
|
9512
|
+
`Directories (${graph.dirs.length}):`,
|
|
9513
|
+
...graph.dirs.map((d) => ` ${d}/`),
|
|
9514
|
+
``,
|
|
9515
|
+
`Key files (${graph.files.length}):`,
|
|
9516
|
+
...graph.files.map((f) => ` ${f}`)
|
|
9517
|
+
].join("\n");
|
|
9518
|
+
return { content: summary, data: graph };
|
|
9519
|
+
}
|
|
9520
|
+
);
|
|
9445
9521
|
}
|
|
9446
9522
|
|
|
9447
9523
|
// src/sync/webhook-handler.ts
|
|
@@ -9782,6 +9858,25 @@ async function runFullSync(ctx, companyId) {
|
|
|
9782
9858
|
await upsertIssue(ctx.db, issue);
|
|
9783
9859
|
issuesSynced++;
|
|
9784
9860
|
}
|
|
9861
|
+
try {
|
|
9862
|
+
const { data: treeData } = await githubFetch(
|
|
9863
|
+
ctx,
|
|
9864
|
+
companyId,
|
|
9865
|
+
`/repos/${repo.fullName}/git/trees/${repo.defaultBranch}?recursive=1`
|
|
9866
|
+
);
|
|
9867
|
+
const tree = treeData.tree;
|
|
9868
|
+
const dirs = [];
|
|
9869
|
+
const files = [];
|
|
9870
|
+
for (const entry of tree) {
|
|
9871
|
+
const p = entry.path;
|
|
9872
|
+
if (entry.type === "tree" && p.split("/").length <= 3) dirs.push(p);
|
|
9873
|
+
else if (entry.type === "blob" && (p.split("/").length <= 2 || /\.(ts|js|py|go|rs|java|json|ya?ml|toml|md)$/.test(p))) files.push(p);
|
|
9874
|
+
}
|
|
9875
|
+
const graph = { dirs, files, defaultBranch: repo.defaultBranch, language: repo.language };
|
|
9876
|
+
await saveRepoGraph(ctx.db, repo.id, JSON.stringify(graph));
|
|
9877
|
+
} catch (graphErr) {
|
|
9878
|
+
ctx.logger.warn(`Graph generation failed for ${repo.fullName}: ${graphErr}`);
|
|
9879
|
+
}
|
|
9785
9880
|
reposSynced++;
|
|
9786
9881
|
} catch (err) {
|
|
9787
9882
|
errors.push(`${repo.fullName}: ${err instanceof Error ? err.message : String(err)}`);
|