diagnosing-dependabot-alerts

作者: medusajs

诊断 Medusa 单仓库中的 GitHub Dependabot / 安全警报,并找到侵入性最小的修复方案。在调查 Dependabot 警报、安全…时使用。

npx skills add https://github.com/medusajs/medusa --skill diagnosing-dependabot-alerts

Diagnosing Dependabot Alerts

Investigate a Dependabot/security alert in the Medusa monorepo, identify the exact affected package(s), assess real-world impact, and pick the least-invasive fix. Default output is a diagnosis; only make changes when asked.

Constraints

  • Diagnose first, don't default to a fix: Never jump to a root resolutions/overrides bump. Root-level overrides are the LAST resort — see the remediation ladder.
  • Root overrides don't ship: resolutions (yarn) / overrides (npm) apply only to THIS repo's install. They are NOT published with packages/*, so they do not protect downstream consumers of a published package. Never present them as a full fix for a vulnerability that reaches a published package.
  • Find the fix inside the affected package first: Prefer refreshing/bumping the dependency within the workspace package that owns it (transitive refresh or direct-dep bump) before touching anything at the monorepo root.
  • Reachable is not pinnable: A fixed version being resolvable within existing semver ranges (a lockfile float) is weaker than a range that GUARANTEES the fix. Call out the difference — the float can regress for downstream consumers.
  • Assess impact, don't assume: Determine whether the vulnerable code path is actually reachable with untrusted input in Medusa before recommending urgency.

Workflow

Follow these steps in order. Load reference/remediation-strategies.md before proposing any fix.

1. Fetch alert details        → gh api (package, versions, scope)
2. Trace to affected package  → walk yarn.lock up to packages/*
3. Assess real impact         → is the vulnerable path reachable?
4. Choose remediation         → remediation ladder (least-invasive first)
5. Verify (only if changing)  → scoped diff, no vulnerable version remains

1. Fetch alert details

The alert number is the last path segment of the URL (.../dependabot/<N>).

gh api repos/medusajs/medusa/dependabot/alerts/<N> | jq '{
  state, package: .dependency.package.name, scope: .dependency.scope,
  relationship: .dependency.relationship, manifest: .dependency.manifest_path,
  ghsa: .security_advisory.ghsa_id, severity: .security_advisory.severity,
  summary: .security_advisory.summary,
  matched_range: .security_vulnerability.vulnerable_version_range,
  first_patched: .security_vulnerability.first_patched_version.identifier,
  all_ranges: [.security_advisory.vulnerabilities[] | {range: .vulnerable_version_range, patched: .first_patched_version.identifier}]
}'

Record: the vulnerable package name, every {vulnerable range → first patched} pair, and whether the alert is direct or transitive.

2. Trace to the exact affected Medusa package(s)

Find which version(s) are actually installed and walk up the dependency chain to the workspace package(s) under packages/ that own the dependency. See reference/remediation-strategies.md for the full tracing recipe. In short:

  1. grep -n "<pkg>@npm" yarn.lock — list installed versions; confirm which match the vulnerable range.
  2. Walk up dependents (grep the version string as a dependency of other lock entries) until you reach a package declared in a packages/*/package.json.
  3. For that workspace package, determine:
    • Direct vs transitive — is <pkg> (or the nearest ancestor) in its dependencies/devDependencies, or purely transitive?
    • Ships or notprivate: false means it publishes; a runtime dependencies entry ships to consumers. devDependencies and private: true do not.
    • Runtime-reachable — is the ancestor actually imported in src/ (runtime), or only used at build/test time?

The "affected package" is the workspace package whose manifest declares the dependency (or the nearest ancestor that does).

3. Assess real impact

Before recommending urgency, check whether the vulnerable code path is reachable with untrusted input in Medusa. Example from a past alert: immutable prototype pollution reached us only through @graphql-codegen/typescript, used to generate types from Medusa's OWN internal GraphQL schema — no untrusted input, so practical exploitability was negligible. State the impact explicitly; it changes how aggressive the fix needs to be.

4. Choose remediation (least-invasive first)

Load reference/remediation-strategies.md now. Apply the ladder in order and stop at the first tier that works without breaking changes:

TierFixScopeShips to consumers?
1aIn-range transitive refresh (lockfile only)affected pkg's treereflects fresh installs
1bBump the direct dep the affected pkg declaresaffected pkg's package.jsonyes (enforced)
2Root resolutions/overridesthis repo onlyNO — last resort
  • Prefer 1a when a fixed version is reachable within existing ranges and introduces no breaking changes (fastest, no manifest change).
  • Use 1b when the fix is only guaranteed by bumping the declared dep — check breaking changes (major bump, peerDeps, changed API usage) per the reference file.
  • Use 2 only when no in-package option exists; always state that it does not protect downstream consumers of published packages.

5. Verify (only when making changes)

  • git diff --stat — confirm the change is scoped (only yarn.lock, plus package.json if you bumped a direct dep).
  • Confirm NO version matching the vulnerable range remains in yarn.lock.
  • Confirm the diff touches only the vulnerable package's dependency neighborhood — no unrelated churn.
  • If a direct dep was bumped: build/typecheck the affected package and exercise its use of the dependency.

Reference Files Available

reference/remediation-strategies.md  - Tracing recipe, semver reachable-vs-pinnable
                                        analysis, per-tier commands, breaking-change checks

Common Mistakes Checklist

Verify you're NOT doing these:

  • Adding a root resolutions/overrides entry as the first (or only) fix
  • Presenting a root override as protecting downstream consumers of a published package
  • Treating a lockfile float ("reachable") as a guaranteed fix ("pinnable")
  • Skipping the trace and not naming the exact affected packages/* package(s)
  • Recommending a major-version bump without checking breaking changes / peerDeps / actual usage
  • Reporting urgency without checking whether the vulnerable path is reachable in Medusa
  • Making changes when only a diagnosis was requested

来自 medusajs 的更多技能

mcloud-variables
medusajs
执行mcloud变量命令,列出并获取云环境的环境变量。用于检查、读取或导出环境…
official
building-storefronts
medusajs
以SDK为先的前端集成方案,适用于Medusa商店前端,采用React Query模式并遵循关键API调用规则。所有API请求必须使用Medusa JS SDK——禁止使用常规fetch(),因其缺少必要请求头(商店路由需可发布API密钥,管理路由需认证信息)。向SDK方法传递纯JavaScript对象,切勿对请求体参数使用JSON.stringify(),SDK会自动处理序列化。GET请求使用useQuery,POST/DELETE请求使用useMutation,...
official
building-admin-dashboard-customizations
medusajs
使用管理SDK和Medusa UI组件为Medusa管理后台定制的UI扩展。对于任何管理后台UI工作(规划、实施、探索),请优先加载此技能;MCP服务器仅提供API参考,不包含设计模式或数据加载策略。关键:始终使用Medusa JS SDK进行所有API请求(切勿使用常规fetch);将显示查询与模态查询分离,并在变更后使显示数据失效。在现有页面上实现小部件或创建自定义UI路由;...
official
learning-medusa
medusajs
交互式逐步Medusa开发训练营,在构建品牌功能的同时学习架构模式。包含三个渐进式课程(总计2-3小时),涵盖模块、工作流、API路由、模块链接、工作流钩子及管理界面自定义。每个主要组件完成后进行检查点验证,测试概念理解、代码质量和功能实现。将错误视为教学机会,通过诊断性问题共同调试并定位根本原因……
official
db-migrate
medusajs
执行待处理的Medusa数据库迁移并报告结果。通过Bash运行npx medusa db:migrate,将所有待处理的迁移应用到Medusa数据库。报告迁移结果,包括已应用的迁移数量、遇到的任何错误以及成功确认。专为具有标准npm/npx设置的Medusa项目设计。
official
mcloud-environments
medusajs
执行mcloud environments命令,列出、获取、创建、删除、重新部署或触发云环境的构建。用于管理环境生命周期时使用…
official
db-generate
medusajs
通过单个命令为Medusa模块生成数据库迁移。封装了npx medusa db:generate CLI命令,用于为指定的Medusa模块创建迁移文件。接受模块名称作为参数,并报告迁移文件位置、错误及后续步骤。生成后自动建议运行npx medusa db:migrate以应用迁移。
official
mcloud-deployments
medusajs
执行 mcloud deployments 命令以列出部署、获取部署详情并获取构建日志。在列出部署、检查部署…时使用
official