@taiga-ai/mcp-server 0.26.0-dev.482 → 0.26.0-dev.484

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.
Files changed (2) hide show
  1. package/dist/index.js +36 -4
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1774,6 +1774,11 @@ const MAINTENANCE_IGNORE_REASONS = [
1774
1774
  * alone is shipped, and `dev` + `optional` (devOptional) is left undecided.
1775
1775
  * - pnpm-lock.yaml: `dev` comes from a per-package `dev: true` that lockfile
1776
1776
  * v9 no longer writes, so an empty list says nothing; `dev` still means dev.
1777
+ * For a package a workspace declares under `dependencies` or
1778
+ * `optionalDependencies`, the sweep adds Taiga's own `prod`, so that copy
1779
+ * reads runtime. A `devDependencies` declaration is not turned into `dev`:
1780
+ * a runtime dependency's snapshot may pull the same copy in, which only the
1781
+ * `snapshots` graph could rule out, so it stays unknown.
1777
1782
  * - poetry.lock: group names with `main` dropped; a non-main, non-optional
1778
1783
  * group is not in the runtime install. Poetry 1.x lockfiles carry no groups
1779
1784
  * at all, so an empty list says nothing.
@@ -1801,6 +1806,8 @@ function lockfileScope(path, groups) {
1801
1806
  return "unknown";
1802
1807
  }
1803
1808
  case "pnpm-lock.yaml":
1809
+ if (set.has("prod")) return "runtime";
1810
+ return set.size === 1 && set.has("dev") ? "dev" : "unknown";
1804
1811
  case "uv.lock": return set.size === 1 && set.has("dev") ? "dev" : "unknown";
1805
1812
  case "poetry.lock": return set.size > 0 && !set.has("optional") && !set.has("main") ? "dev" : "unknown";
1806
1813
  default: return "unknown";
@@ -1827,6 +1834,21 @@ function combineScopes(scopes) {
1827
1834
  if (scopes.includes("unknown") || scopes.length === 0) return "unknown";
1828
1835
  return "dev";
1829
1836
  }
1837
+ /**
1838
+ * Whether the repository declares the package itself. Per lockfile the sweep
1839
+ * says direct or transitive; across lockfiles one direct declaration makes the
1840
+ * finding direct (that copy is the repository's to bump), transitive only when
1841
+ * every readable lockfile says so, unknown when the sweep could read none of
1842
+ * them or did not record it (older images, code kinds). Presentation only; the
1843
+ * remediation step already finds every resolved copy and its parent itself.
1844
+ */
1845
+ function dependencyRelation(finding) {
1846
+ if (finding.kind !== "vulnerable_dependency" && finding.kind !== "outdated_dependency") return "unknown";
1847
+ const values = Object.values(finding.dependencyRelation ?? {});
1848
+ if (values.includes("direct")) return "direct";
1849
+ if (values.length > 0 && values.every((v) => v === "transitive")) return "transitive";
1850
+ return "unknown";
1851
+ }
1830
1852
  new Set(CODE_REMEDIATION_KINDS);
1831
1853
  /** A non-empty string, or null. */
1832
1854
  const locationText = z.string().min(1).nullable().catch(null);
@@ -4961,15 +4983,24 @@ function withFixability(row) {
4961
4983
  * the API carries: the groups need the lockfile name to read, which `dependencyScope` does once here.
4962
4984
  */
4963
4985
  function withDependencyScope(row, { keepGroups = false } = {}) {
4964
- const { dependencyGroups: _groups, ...lean } = row;
4965
- const rest = keepGroups ? row : lean;
4986
+ const { dependencyGroups: _groups, dependencyRelation: _relation, ...lean } = row;
4987
+ const rest = keepGroups ? {
4988
+ ...row,
4989
+ dependencyRelation: void 0
4990
+ } : lean;
4966
4991
  if (!(row["kind"] === "vulnerable_dependency" || row["kind"] === "outdated_dependency")) return rest;
4992
+ const kind = row["kind"];
4967
4993
  return {
4968
4994
  ...rest,
4969
4995
  dependencyScope: dependencyScope({
4970
- kind: row["kind"],
4996
+ kind,
4971
4997
  dependencyGroups: row["dependencyGroups"]
4972
- })
4998
+ }),
4999
+ dependencyRelation: dependencyRelation({
5000
+ kind,
5001
+ dependencyRelation: row["dependencyRelation"]
5002
+ }),
5003
+ ...keepGroups ? { dependencyRelationByLockfile: row["dependencyRelation"] ?? null } : {}
4973
5004
  };
4974
5005
  }
4975
5006
  /** A finding as a tool answers it: the row fields, the scope, and whether Fix would take it. */
@@ -4977,6 +5008,7 @@ function findingRows(findings, extra = []) {
4977
5008
  return pickFields(findings, [
4978
5009
  ...FINDING_ROW_FIELDS,
4979
5010
  "dependencyGroups",
5011
+ "dependencyRelation",
4980
5012
  ...extra
4981
5013
  ]).map((row) => withDependencyScope(row)).map(withFixability);
4982
5014
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taiga-ai/mcp-server",
3
- "version": "0.26.0-dev.482",
3
+ "version": "0.26.0-dev.484",
4
4
  "description": "Taiga for AI coding assistants: read products, policies, initiatives and runs, and operate the line, over MCP",
5
5
  "mcpName": "ga.tai/mcp-server",
6
6
  "type": "module",