@oss-scout/mcp 0.4.0 → 0.5.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.
@@ -35742,6 +35742,11 @@ var StoredClosedPRSchema = external_exports3.object({
35742
35742
  title: external_exports3.string(),
35743
35743
  closedAt: external_exports3.string()
35744
35744
  });
35745
+ var StoredOpenPRSchema = external_exports3.object({
35746
+ url: external_exports3.string(),
35747
+ title: external_exports3.string(),
35748
+ openedAt: external_exports3.string()
35749
+ });
35745
35750
  var ContributionGuidelinesSchema = external_exports3.object({
35746
35751
  branchNamingConvention: external_exports3.string().optional(),
35747
35752
  commitMessageFormat: external_exports3.string().optional(),
@@ -35831,6 +35836,7 @@ var ScoutStateSchema = external_exports3.object({
35831
35836
  starredReposLastFetched: external_exports3.string().optional(),
35832
35837
  mergedPRs: external_exports3.array(StoredMergedPRSchema).default([]),
35833
35838
  closedPRs: external_exports3.array(StoredClosedPRSchema).default([]),
35839
+ openPRs: external_exports3.array(StoredOpenPRSchema).default([]),
35834
35840
  savedResults: external_exports3.array(SavedCandidateSchema).default([]),
35835
35841
  skippedIssues: external_exports3.array(SkippedIssueSchema).default([]),
35836
35842
  lastSearchAt: external_exports3.string().optional(),
@@ -37337,6 +37343,7 @@ var IssueDiscovery = class {
37337
37343
  return { candidates: [], strategiesUsed: [] };
37338
37344
  }
37339
37345
  const mergedPRRepos = this.stateReader.getReposWithMergedPRs();
37346
+ const openPRRepos = this.stateReader.getReposWithOpenPRs();
37340
37347
  const starredRepos = this.getStarredRepos();
37341
37348
  const starredRepoSet = new Set(starredRepos);
37342
37349
  const lowScoringRepos = new Set(this.deriveLowScoringRepos(config2.minRepoScoreThreshold));
@@ -37357,7 +37364,16 @@ var IssueDiscovery = class {
37357
37364
  now: /* @__PURE__ */ new Date(),
37358
37365
  includeDocIssues: config2.includeDocIssues ?? true
37359
37366
  });
37360
- const phase0Repos = mergedPRRepos.slice(0, 10);
37367
+ const seenPhase0 = /* @__PURE__ */ new Set();
37368
+ const phase0Repos = [];
37369
+ for (const repo of [...mergedPRRepos, ...openPRRepos]) {
37370
+ if (seenPhase0.has(repo))
37371
+ continue;
37372
+ seenPhase0.add(repo);
37373
+ phase0Repos.push(repo);
37374
+ if (phase0Repos.length >= 10)
37375
+ break;
37376
+ }
37361
37377
  const phase0RepoSet = new Set(phase0Repos);
37362
37378
  if (phase0Repos.length > 0 && enabledStrategies.has("merged")) {
37363
37379
  const remaining = maxResults - allCandidates.length;
@@ -37721,6 +37737,7 @@ function mergeStates(local, remote) {
37721
37737
  starredReposLastFetched: pickFresherTimestamp(local.starredReposLastFetched, remote.starredReposLastFetched),
37722
37738
  mergedPRs: unionByUrl(local.mergedPRs, remote.mergedPRs),
37723
37739
  closedPRs: unionByUrl(local.closedPRs, remote.closedPRs),
37740
+ openPRs: unionByUrl(local.openPRs ?? [], remote.openPRs ?? []),
37724
37741
  savedResults: mergeSavedResults(local.savedResults ?? [], remote.savedResults ?? []),
37725
37742
  skippedIssues: mergeSkippedIssues(local.skippedIssues ?? [], remote.skippedIssues ?? []),
37726
37743
  lastSearchAt: pickFresherTimestamp(local.lastSearchAt, remote.lastSearchAt),
@@ -38003,6 +38020,16 @@ var OssScout = class {
38003
38020
  }
38004
38021
  return [...repoCounts.entries()].sort((a, b) => b[1] - a[1]).map(([repo]) => repo);
38005
38022
  }
38023
+ getReposWithOpenPRs() {
38024
+ const repoCounts = /* @__PURE__ */ new Map();
38025
+ for (const pr of this.state.openPRs ?? []) {
38026
+ const repo = extractRepoFromUrl(pr.url);
38027
+ if (repo) {
38028
+ repoCounts.set(repo, (repoCounts.get(repo) ?? 0) + 1);
38029
+ }
38030
+ }
38031
+ return [...repoCounts.entries()].sort((a, b) => b[1] - a[1]).map(([repo]) => repo);
38032
+ }
38006
38033
  getStarredRepos() {
38007
38034
  return this.state.starredRepos;
38008
38035
  }
@@ -38051,6 +38078,20 @@ var OssScout = class {
38051
38078
  this.updateRepoScoreFromPRs(pr.repo);
38052
38079
  this.dirty = true;
38053
38080
  }
38081
+ /**
38082
+ * Record that a PR is currently open in this repo.
38083
+ * Open PRs signal active engagement even when nothing is merged yet.
38084
+ */
38085
+ recordOpenPR(pr) {
38086
+ const existing = this.state.openPRs ?? [];
38087
+ if (existing.some((p) => p.url === pr.url))
38088
+ return;
38089
+ this.state.openPRs = [
38090
+ ...existing,
38091
+ { url: pr.url, title: pr.title, openedAt: pr.openedAt }
38092
+ ];
38093
+ this.dirty = true;
38094
+ }
38054
38095
  /**
38055
38096
  * Update repo score with observed signals.
38056
38097
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oss-scout/mcp",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "MCP server for oss-scout — exposes issue discovery and vetting as MCP tools",
5
5
  "type": "module",
6
6
  "bin": {
@@ -18,15 +18,16 @@
18
18
  "dependencies": {
19
19
  "@modelcontextprotocol/sdk": "^1.27.1",
20
20
  "zod": "^4.3.6",
21
- "@oss-scout/core": "^0.4.0"
21
+ "@oss-scout/core": "^0.5.0"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/node": "^25.5.0",
25
+ "@vitest/coverage-v8": "^4.1.4",
25
26
  "esbuild": "^0.27.4",
26
27
  "tsx": "^4.21.0",
27
28
  "typescript": "^5.9.3",
28
- "@vitest/coverage-v8": "^4.1.0",
29
- "vitest": "^4.1.0"
29
+ "vite": "^8.0.5",
30
+ "vitest": "^4.1.4"
30
31
  },
31
32
  "keywords": [
32
33
  "mcp",