skilldrop-cli 0.16.28 → 0.16.30
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/bin/skilldrop.js +160 -33
- package/catalogue.json +7 -3
- package/model-routing.json +16 -0
- package/package.json +1 -1
- package/packs/ai-engineering/skills/mcp-pairing/SKILL.md +93 -0
- package/packs/ai-engineering/skills/mcp-pairing/evals/eval_queries.json +13 -0
- package/packs/ai-engineering/skills/mcp-pairing/evals/evals.json +76 -0
- package/packs/ai-engineering/skills/mcp-pairing/evals/files/2/mcp.json +32 -0
- package/packs/ai-engineering/skills/mcp-pairing/evals/files/4/.mcp.json +47 -0
- package/packs/ai-engineering/skills/mcp-pairing/evals/files/4/docs/pr-loop.md +12 -0
- package/packs/ai-engineering/skills/mcp-pairing/evals/files/5/docs/oncall-triage.md +18 -0
- package/packs/ai-engineering/skills/mcp-pairing/examples/build-loop-github-jira-datadog.md +69 -0
- package/packs/ai-engineering/skills/mcp-pairing/manifest.json +17 -0
- package/packs/ai-engineering/skills/mcp-pairing/reference.md +136 -0
- package/packs/ai-engineering/skills/mcp-pairing/templates/mcp-pairing.md +43 -0
- package/packs/data-analytics/loops/measure/LOOP.md +118 -0
- package/packs/data-analytics/loops/measure/evals/eval_queries.json +9 -0
- package/packs/data-analytics/loops/measure/evals/evals.json +28 -0
- package/packs/data-analytics/loops/measure/loop.json +41 -0
- package/packs/dev-team/loops/build/LOOP.md +4 -2
- package/packs/dev-team/loops/build/loop.json +2 -2
- package/packs/dev-team/skills/codebase-tour/SKILL.md +115 -0
- package/packs/dev-team/skills/codebase-tour/evals/eval_queries.json +13 -0
- package/packs/dev-team/skills/codebase-tour/evals/evals.json +77 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/.github/workflows/ci.yml +23 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/README.md +23 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/openapi.yaml +21 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/package-lock.json +7 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/package.json +29 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/config.ts +20 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/domain/shipments/filter.ts +24 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/domain/shipments/repository.ts +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/errors.ts +9 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/generated/api-types.ts +9 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/http/handlers/shipments.ts +38 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/http/routes.ts +7 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/jobs/export-shipments.ts +22 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/server.ts +18 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/tests/domain/filter.test.ts +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/tests/http/shipments.test.ts +18 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/tsconfig.json +10 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/vitest.config.ts +5 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/.github/workflows/ci.yml +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/README.md +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/noxfile.py +14 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/pyproject.toml +22 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/__init__.py +3 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/_version.py +4 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/cli.py +32 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/detect.py +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/errors.py +2 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/money.py +14 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/__init__.py +8 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/acme.py +18 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/base.py +24 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/harbor.py +13 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/tests/fixtures/acme_sample.csv +3 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/tests/test_acme.py +23 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/tests/test_detect.py +13 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/.github/workflows/ci.yml +28 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/Makefile +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/README.md +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/cmd/tidepool/main.go +24 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/go.mod +5 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/config/config.go +38 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/dispatch/dispatcher.go +52 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/dispatch/dispatcher_test.go +42 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/dispatch/sender.go +32 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/replay/replay.go +31 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/db.go +35 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/query.sql +11 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/query.sql.go +30 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/schema.sql +6 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/store_integration_test.go +21 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/sqlc.yaml +9 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/.env.example +4 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/.github/workflows/ci.yml +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/Makefile +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/README.md +23 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/data/rates.csv +4 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/pyproject.toml +19 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/scripts/gen_rates.py +29 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/__init__.py +0 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/api/__init__.py +0 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/api/preview.py +14 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/api/routes.py +36 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/config.py +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/discounts.py +8 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/generated/__init__.py +0 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/generated/rates_table.py +8 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/main.py +8 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/shipping.py +18 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/tax.py +7 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/tests/conftest.py +3 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/tests/unit/test_discounts.py +11 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/tests/unit/test_tax.py +13 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/.env.example +3 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/.github/workflows/ci.yml +13 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/README.md +18 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/package.json +13 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/openapi.json +30 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/package.json +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/db.js +19 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/flags.js +8 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/generated/schema.js +32 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/middleware/validate.js +20 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/routes/bookings.js +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/server.js +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/services/bookings.js +23 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/services/pricing.js +9 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/test/pricing.test.js +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/package.json +9 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/src/bookingForm.js +11 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/src/format.js +7 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/test/format.test.js +12 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/scripts/gen-schema.mjs +27 -0
- package/packs/dev-team/skills/codebase-tour/examples/refund-window.md +158 -0
- package/packs/dev-team/skills/codebase-tour/manifest.json +47 -0
- package/packs/dev-team/skills/codebase-tour/scripts/repo_facts.py +403 -0
- package/packs/dev-team/skills/codebase-tour/templates/codebase-tour.md +85 -0
- package/packs/dev-team/skills/dependency-upgrade-review/SKILL.md +101 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/eval_queries.json +11 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/evals.json +77 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/.github/workflows/ci.yml +20 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/pr.diff +87 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/quillmark-CHANGELOG.md +24 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/src/render/comment.js +6 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/src/render/note.js +8 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/test/note.test.js +12 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/.github/workflows/ci.yml +23 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/.github/workflows/release.yml +23 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/pr.diff +32 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/release-notes.md +20 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/.github/workflows/ci.yml +18 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/Dockerfile +8 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/PR.md +36 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/pr.diff +47 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/src/ingest/client.py +24 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/src/ingest/reader.py +32 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/tests/test_reader.py +15 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/upstream/quillstream-CHANGELOG.md +37 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.github/workflows/ci.yml +22 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.github/workflows/release.yml +25 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.nvmrc +1 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/PR-412.md +16 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/PR-413.md +15 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/package.json +21 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/pr-412.diff +26 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/pr-413.diff +84 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/scripts/release.mjs +18 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/upstream/release-notary-CHANGELOG.md +16 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/upstream/setup-toolchain-RELEASES.md +22 -0
- package/packs/dev-team/skills/dependency-upgrade-review/examples/inputs/ledgerline.diff +38 -0
- package/packs/dev-team/skills/dependency-upgrade-review/examples/ledgerline-tidyparse.md +91 -0
- package/packs/dev-team/skills/dependency-upgrade-review/manifest.json +50 -0
- package/packs/dev-team/skills/dependency-upgrade-review/reference.md +99 -0
- package/packs/dev-team/skills/dependency-upgrade-review/scripts/upgrade_diff.py +718 -0
- package/packs/grc/loops/comply/LOOP.md +133 -0
- package/packs/grc/loops/comply/evals/eval_queries.json +9 -0
- package/packs/grc/loops/comply/evals/evals.json +30 -0
- package/packs/grc/loops/comply/loop.json +54 -0
- package/packs/product-manager/loops/discover/LOOP.md +5 -4
- package/packs/product-manager/loops/discover/loop.json +2 -2
- package/packs/product-manager/skills/feedback-synthesis/SKILL.md +182 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/eval_queries.json +46 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/evals.json +76 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/1/interview-notes.md +47 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/1/nps-verbatims.csv +13 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/1/support-tickets.csv +36 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/3/churn-exit-survey.csv +11 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/3/sales-call-notes.md +55 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/4/csat_comments_q3.csv +17 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/4/support_tickets_q3.csv +49 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/5/app_reviews_last_60_days.csv +32 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/5/interview_notes_round1.md +48 -0
- package/packs/product-manager/skills/feedback-synthesis/examples/booking-app-feedback.md +139 -0
- package/packs/product-manager/skills/feedback-synthesis/examples/inputs/booking-app-coded.csv +17 -0
- package/packs/product-manager/skills/feedback-synthesis/manifest.json +53 -0
- package/packs/product-manager/skills/feedback-synthesis/reference.md +89 -0
- package/packs/product-manager/skills/feedback-synthesis/scripts/theme_counts.py +355 -0
- package/packs/product-manager/skills/feedback-synthesis/templates/coding-sheet.csv +6 -0
- package/packs/product-manager/skills/feedback-synthesis/templates/synthesis.md +42 -0
- package/packs/research/loops/research/LOOP.md +123 -0
- package/packs/research/loops/research/evals/eval_queries.json +9 -0
- package/packs/research/loops/research/evals/evals.json +39 -0
- package/packs/research/loops/research/loop.json +35 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Tour: {repo name}, for {the change, in one line}
|
|
2
|
+
|
|
3
|
+
_Read on {date}. Scope: {the path from the entry point to the change's far edge}. Skipped on purpose: {areas not on the path, e.g. "the admin UI, the billing service, deployment config"}._
|
|
4
|
+
|
|
5
|
+
{Any `[assumption]` lines go here, first, one per line.}
|
|
6
|
+
|
|
7
|
+
<!-- Citation key, for the writer (delete before sending):
|
|
8
|
+
`path:line` = read there · [inferred] = not verified, reason given ·
|
|
9
|
+
ran: passed / ran: failed (first error line) / read, not run · derived from <source> -->
|
|
10
|
+
|
|
11
|
+
## What matters for this change
|
|
12
|
+
|
|
13
|
+
<!-- 3–5 bullets. The things that change what the person does in the next hour: the README claim that's wrong, the second copy, the generated file, the test gap, the env var it won't start without. Each cites a file. -->
|
|
14
|
+
|
|
15
|
+
- {…} (`path:line`)
|
|
16
|
+
|
|
17
|
+
## Run it
|
|
18
|
+
|
|
19
|
+
<!-- ≤ ~15 lines. Commands only from CI / package scripts / Makefile / tox / nox / pyproject. CI's form wins. -->
|
|
20
|
+
|
|
21
|
+
| To | Command | Source | Status |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| Install | `{…}` | `{path:line}` | read, not run |
|
|
24
|
+
| Test (whole suite) | `{…}` | `{path:line}` | {ran: passed / ran: failed: … / read, not run} |
|
|
25
|
+
| Test (this area) | `{…}` | derived from `{path:line}` | {…} |
|
|
26
|
+
| Lint / typecheck | `{…}` | `{path:line}` | {…} |
|
|
27
|
+
| Run locally | `{…}` | `{path:line}` | {…} |
|
|
28
|
+
|
|
29
|
+
Needs: {env vars and services the commands need, each with where it is read or set, e.g. `DATABASE_URL` (`src/config.py:9`; CI sets it at `.github/workflows/ci.yml:14`)}.
|
|
30
|
+
|
|
31
|
+
## The path this change touches
|
|
32
|
+
|
|
33
|
+
<!-- ≤ 10 hops, entry point first, stop at the change's far edge. -->
|
|
34
|
+
|
|
35
|
+
1. `{path:line}` `{function}`: {what happens here}
|
|
36
|
+
2. …
|
|
37
|
+
|
|
38
|
+
## Where the change goes
|
|
39
|
+
|
|
40
|
+
<!-- Files and functions, each with the sibling pattern that justifies it. Then everything that must change with it. -->
|
|
41
|
+
|
|
42
|
+
- `{path}` `{function}`: {what to add} because {sibling pattern, cited}
|
|
43
|
+
- Must change with it: {spec + regenerate command / registry entry / second copy}, (`path:line`)
|
|
44
|
+
|
|
45
|
+
## Conventions the code follows
|
|
46
|
+
|
|
47
|
+
<!-- ≤ ~15 lines. Only the ones this change will hit. Each from code, cited. -->
|
|
48
|
+
|
|
49
|
+
- **Errors:** {…} (`path:line`)
|
|
50
|
+
- **Tests:** {location, naming, fixtures} (`path`)
|
|
51
|
+
- **Config:** {how it is read} (`path:line`)
|
|
52
|
+
- **Naming:** {…} (`path:line`)
|
|
53
|
+
|
|
54
|
+
## Traps
|
|
55
|
+
|
|
56
|
+
<!-- Every check reports. "none found" is an answer. -->
|
|
57
|
+
|
|
58
|
+
- **Generated:** {file} from {source}, regenerate with `{command}` (`path:line`); CI drift check: {yes, `path:line` / none}
|
|
59
|
+
- **Second copy:** {where the same logic lives} (`path:line`), or none found (searched for {identifiers})
|
|
60
|
+
- **Untested on the path:** {functions} or none
|
|
61
|
+
- **Tests the default command skips:** {marker / build tag / glob} (`path:line`) or none
|
|
62
|
+
- **Env vars and flags on the path:** `{NAME}` default {…} (`path:line`)
|
|
63
|
+
- **Vendored:** {…} or none
|
|
64
|
+
|
|
65
|
+
## Where the README is wrong
|
|
66
|
+
|
|
67
|
+
<!-- One line each, both citations. Omit the section only if every README claim checked out, and say "README checked: no conflicts." in the scope line instead. -->
|
|
68
|
+
|
|
69
|
+
- README says {…} (`README.md:{n}`); the code {…} (`path:line`). Follow the code.
|
|
70
|
+
|
|
71
|
+
## Tests for this area
|
|
72
|
+
|
|
73
|
+
- Covered by: `{test file}` ({what it asserts})
|
|
74
|
+
- Run just these: `{derived command}` (derived from `{path:line}`)
|
|
75
|
+
- Not covered: {functions with no test}, or "every function on the path has a test"
|
|
76
|
+
|
|
77
|
+
## First step
|
|
78
|
+
|
|
79
|
+
{Do X in `path`; run `command`; expect {result}.}
|
|
80
|
+
|
|
81
|
+
## Open questions for a maintainer
|
|
82
|
+
|
|
83
|
+
<!-- ≤ 5. Each answerable in a sentence, each pointing at the evidence that raised it. -->
|
|
84
|
+
|
|
85
|
+
1. {…} (`path:line`)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dependency-upgrade-review
|
|
3
|
+
description: Give a merge verdict on a dependency-upgrade pull request (Dependabot, Renovate or a hand-made bump) across npm, pip, Go, Cargo and Maven lockfiles and GitHub Actions pins. Reads the release notes for every skipped version, lists what the lockfile changes beyond the PR title (transitive bumps, new and removed packages, install scripts, registry changes), checks that each SHA pin is the commit its release tag points to, says whether CI ran the changed code, finds the repo's uses of changed APIs and writes the rollback, ending in MERGE, MERGE AFTER CHECKS or DO NOT MERGE. Use when the user says "review this Dependabot PR", "is this Renovate bump safe to merge", "can I merge this dependency upgrade", "check this lockfile diff", or "is this action SHA pin right".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# dependency-upgrade-review
|
|
7
|
+
|
|
8
|
+
A dependency bump is someone else's code entering the repo under a one-line title. This skill reads it the way a careful maintainer does: every release between the old and new version, every line of the lockfile, every pin, and the tests that would have caught a break. The verdict follows from those checks, not from a green badge. Reviewing the repo's own code changes is `pre-merge-review`; writing the notes for a release of this project is `release-notes`; planning a framework migration across many PRs is `migration-plan`.
|
|
9
|
+
|
|
10
|
+
## How to respond
|
|
11
|
+
|
|
12
|
+
**Four rules come before the steps and outrank them:**
|
|
13
|
+
|
|
14
|
+
- **Answer what was asked, first.** Open with the answer, the decision or the artifact, in plain words. Scores, matrices, frameworks and tags come after it, and anything that doesn't change the answer is cut.
|
|
15
|
+
- **Use only what you were given.** Don't add facts, names, numbers, incidents, history, steps or sections the input doesn't contain. What you need and don't have is left out of the artifact and listed once at the end under "To confirm".
|
|
16
|
+
- **Deliver from what you have.** When the request gives you something to work on, state your assumptions in a line and produce the result. When it gives you nothing to work on, ask for it in one or two plain sentences and say what you will do once you have it.
|
|
17
|
+
- **Write for someone who has never heard of this skill.** No skill names, no paths or scripts from this folder, no internal terms, and nothing about how the run was set up. A next step is one plain sentence at the end that describes the work.
|
|
18
|
+
- **For this skill:** A check nobody ran is an open check, written as the command that runs it. It is never reported as passed, and "CI is green" closes only the checks CI actually ran.
|
|
19
|
+
|
|
20
|
+
1. **Get the diff, the notes and the code, asking once.** Three inputs: the PR diff covering manifests, lockfiles and workflow files (`gh pr diff 212` or `git diff origin/main...HEAD`); the release notes or changelog for every version between old and new; the repo, or at least the files that import the package and the CI workflow files. Ask for what is missing in one message. With network access, fetch missing notes from the package's releases page or changelog; without it, each missing release becomes an open check.
|
|
21
|
+
|
|
22
|
+
2. **Run the diff script first.** It lists every changed dependency with old → new, semver class, direct or transitive, and flags added and removed packages, install hooks, native-code hints, registry changes, licence changes and pins, then prints a floor verdict.
|
|
23
|
+
```bash
|
|
24
|
+
# Claude Code
|
|
25
|
+
python3 "${CLAUDE_SKILL_DIR}/scripts/upgrade_diff.py" pr.diff --title "Bump quillmark from 3.4.1 to 4.1.0"
|
|
26
|
+
# Other IDEs (from the skill folder)
|
|
27
|
+
python3 scripts/upgrade_diff.py pr.diff --title "Bump quillmark from 3.4.1 to 4.1.0"
|
|
28
|
+
```
|
|
29
|
+
It reads stdin with `-` (`gh pr diff 212 | python3 scripts/upgrade_diff.py -`). If it reports version lines out of context, re-run on `git diff -U12`. If no script can run, read every lockfile hunk by hand with the per-ecosystem notes in [`reference.md`](reference.md).
|
|
30
|
+
|
|
31
|
+
3. **List everything the lockfile changes beyond the title.** The title names one package; the lockfile is the truth. Report each of: transitive bumps (with class), packages added, packages removed, new install scripts (`hasInstallScript: true`, a `preinstall` / `install` / `postinstall` / `prepare` hook, pnpm `requiresBuild: true`), new native or binary dependencies (`prebuild-install`, `node-gyp`, a Cargo `-sys` crate), a changed `resolved` / `source` / index URL, and a maintainer or publisher change when the input shows one. ✅ *"Also changes: `entity-codec` 2.1.0 → 3.0.2 (major, licence MIT → MPL-2.0), adds `quill-native-highlight` 1.0.0 with an install script, removes `html-escape-lite`."* ❌ *"Bumps quillmark to 4.1.0."*
|
|
32
|
+
|
|
33
|
+
4. **Class each jump.** Major, minor or patch from the version numbers. Below 1.0 the minor is the breaking number: 0.8.3 → 0.9.0 is a breaking jump, and below 0.1 so is the patch. A Go module path gaining `/v2` is a new module, not a bump. A prerelease target (`-rc.1`, `-beta`) or a downgrade is never a plain MERGE. A moving major tag (`@v2` → `@v3`) spans every v2.x after the one in use plus v3.0.0 to the current v3.
|
|
34
|
+
|
|
35
|
+
5. **Read every release between old and new, not only the target.** For each direct dependency, list every release after the old version up to and including the new one, and pull four things from each: breaking changes, deprecations, security fixes, licence changes. Transitive majors, 0.x breaking jumps and new packages get the same reading; transitive patch and minor bumps are listed, not read. Name each release whose notes are missing. ✅ *"3.5.0 fixes an attribute-injection bug in link titles and deprecates `setOptions()`; 4.0.0 removes `renderInline()` and turns `sanitize` off by default; 4.0.1 and 4.1.0 are fixes and an optional highlighter."* ❌ *"4.1.0 adds a native highlighter. Looks fine."* A security fix is a reason to take the upgrade; when the full jump is blocked, name the smallest version that carries the fix as the alternative.
|
|
36
|
+
|
|
37
|
+
6. **Search the repo for every API the notes change.** For each removed or renamed function, changed signature and changed default, search and report `file:line` for each hit, or "no hits". A changed default hits every call that doesn't pass the option. ✅ *"`src/render/note.js:7` calls `quillmark.render(markdown)` with no `sanitize`, so from 4.0.0 note bodies pass raw HTML through."* ❌ *"Check whether the code uses `renderInline`."* Give the search you ran (`git grep -n -E "renderInline|setOptions|render\(" -- '*.js' '*.ts'`); with no repo in hand, give that command as an open check and claim neither hits nor no hits.
|
|
38
|
+
|
|
39
|
+
7. **Verify every pin; an unverified SHA is an open check.** For a SHA-pinned action (or any dependency pinned to a commit), the pinned SHA must be the commit the release tag points to:
|
|
40
|
+
```bash
|
|
41
|
+
git ls-remote https://github.com/<owner>/<repo> refs/tags/<tag> 'refs/tags/<tag>^{}'
|
|
42
|
+
```
|
|
43
|
+
For an annotated tag the `^{}` line is the commit; the other line is the tag object. For a lightweight tag the single line is the commit. Not run means `UNVERIFIED`, never "looks right": a SHA from a fork of the repo also resolves under the upstream path. A SHA with no version comment is an unknown release. A tag-only pin (`@v3`) moved to another tag is weaker than a SHA, because the tag can be moved after review; say so and give the command that finds the SHA to pin. Say what the job hands the action: a `secrets.*` token, `id-token: write` or `contents: write` raises the stakes of every pin in that job.
|
|
44
|
+
|
|
45
|
+
8. **Say whether CI ran the changed code.** A green check proves what it ran and nothing else. For each changed package or action, name the workflow job and test file that exercise it, or say nothing does. The usual gaps: an action or tool used only in a workflow triggered by a tag push, a release, a schedule or `workflow_dispatch`, which the PR never ran; a library used only in a file no test imports (a step 6 hit with no test); a test that runs the code but not the changed behaviour. ✅ *"`ci / test` runs `test/note.test.js`, which renders Markdown with no raw HTML, so the `sanitize` change is untested; nothing imports `src/render/comment.js`."* ❌ *"All checks pass."*
|
|
46
|
+
|
|
47
|
+
9. **Write the rollback.** The exact revert: `git revert` of the merge commit, or the pin-back for the ecosystem (`npm install quillmark@3.4.1`, `poetry add tidyparse@2.2.0`, `go get <module>@v0.8.3 && go mod tidy`, `cargo update -p <crate> --precise <old>`, the old `uses:` line) with the lockfile regenerated and committed. Then name what a revert does not undo: a lockfile format migration, a data, cache or schema format the new version wrote, an artifact built or published with it (a registry version cannot be republished), and a security fix that rolling back reopens. When the old version sits inside a fixed advisory's range, the pin-back target is the first fixed version, not the old one: ✅ *"pin back to 3.5.0"* ❌ *"pin back to 3.4.1"* when 3.5.0 fixed a bug affecting 3.0.0 to 3.4.x. Per-ecosystem commands are in [`reference.md`](reference.md).
|
|
48
|
+
|
|
49
|
+
10. **Derive the verdict from the checks.** Exactly one of:
|
|
50
|
+
- **DO NOT MERGE** when any holds: a removed or changed API is still used and the PR does not fix it; a new install script or native binary download nobody has confirmed is expected; a dependency source or registry moved to an unexplained host; a SHA that does not match its tag; a pin weakened (SHA to tag, tag to branch); a licence the project cannot ship; a target version an advisory names as vulnerable; a red CI check.
|
|
51
|
+
- **MERGE AFTER CHECKS** when none of those holds but any of these does: an unverified SHA; a major or 0.x breaking jump; a release whose notes were not read; changed code no CI job runs; a deprecated API still used; a new package or transitive major; a licence change that needs sign-off; a moved tag-only pin; no repo to search. Each check is a command or a concrete action.
|
|
52
|
+
- **MERGE** only when every check above is closed, with the evidence in the reply.
|
|
53
|
+
The script's floor is a minimum. Raise it on what steps 5 to 8 find. Lower DO NOT MERGE only when the user confirms the install script or new source is expected, and say so in the reply.
|
|
54
|
+
|
|
55
|
+
11. **Reply in this order, in one message:** the verdict and the one reason that decides it; 🟥 blockers, 🟧 checks before merge and 🟨 notes, each with `file:line` or the command; a short table of what the PR changes, including everything beyond the title; the rollback; "To confirm". A routine PR fits in about 300 words. Lead with what blocks, not with the package history.
|
|
56
|
+
|
|
57
|
+
**Non-interactive runs** (subagent, CI, headless): with no diff, emit `BLOCKED: need the PR diff covering the manifests, lockfiles and workflow files (gh pr diff <number>)`. Missing release notes, repo or CI files do not block: each becomes a named open check, the verdict is at best MERGE AFTER CHECKS, and the gap is stated first as `[assumption] notes for <versions> not read` or `[assumption] CI coverage unknown, treated as none`.
|
|
58
|
+
|
|
59
|
+
## Useful references in this skill
|
|
60
|
+
|
|
61
|
+
- [`reference.md`](reference.md): reading each ecosystem's lockfile diff, where install scripts and sources show up, how to list the releases between two versions, SHA verification details, and per-ecosystem rollback commands with what a revert leaves behind
|
|
62
|
+
- [`scripts/upgrade_diff.py`](scripts/upgrade_diff.py): stdlib parser for a unified diff of manifests, lockfiles and workflow files; prints changes, flags, pin checks and a floor verdict (exit 2 on bad input)
|
|
63
|
+
- [`examples/ledgerline-tidyparse.md`](examples/ledgerline-tidyparse.md): worked example, a Poetry patch bump with a transitive bump, real script output and the review that reaches MERGE
|
|
64
|
+
|
|
65
|
+
## Quality bar
|
|
66
|
+
|
|
67
|
+
- **Exactly one verdict, first, and it follows from the checks.** Any unverified SHA, added install script, or removed API still in use rules out MERGE.
|
|
68
|
+
- **Every release between old and new is accounted for:** read, with its breaking changes, deprecations, security fixes and licence changes named, or listed as unread.
|
|
69
|
+
- **Everything the lockfile changes beyond the title is listed:** transitive bumps, added and removed packages, install scripts, native code, source changes.
|
|
70
|
+
- **Every changed API has a search result:** `file:line` hits, "no hits", or the command to run when there is no repo.
|
|
71
|
+
- **Every SHA pin is verified or marked UNVERIFIED with the `git ls-remote` command;** tag-only pins are called weaker.
|
|
72
|
+
- **CI coverage is named per changed package:** the job and test that exercise it, or "nothing does".
|
|
73
|
+
- **A rollback with the exact command** and what a revert does not undo.
|
|
74
|
+
- **No invented versions, advisories, APIs, files or test names.** Everything cited appears in the diff, the notes or the repo supplied.
|
|
75
|
+
|
|
76
|
+
## When to use this skill
|
|
77
|
+
|
|
78
|
+
- ✅ A Dependabot or Renovate PR is open and someone asks whether to merge it
|
|
79
|
+
- ✅ A hand-made bump of one or more packages, with its lockfile diff
|
|
80
|
+
- ✅ A GitHub Actions version bump, SHA-pinned or tag-pinned
|
|
81
|
+
- ✅ A grouped update PR where the title hides how many packages moved
|
|
82
|
+
- ✅ Checking whether a lockfile diff brings in install scripts, new registries or new packages
|
|
83
|
+
|
|
84
|
+
## When NOT to use this skill
|
|
85
|
+
|
|
86
|
+
- ❌ Reviewing a PR whose substance is the repo's own code change: use `pre-merge-review`
|
|
87
|
+
- ❌ Writing the release notes or changelog for this project's next version: use `release-notes`
|
|
88
|
+
- ❌ Planning a multi-step framework or runtime migration (a major framework version across many services): use `migration-plan`
|
|
89
|
+
- ❌ Scanning installed skills for supply-chain patterns: that is the `skilldrop scan` command
|
|
90
|
+
- ❌ Choosing which library to adopt in the first place: this reviews a version change, not a selection
|
|
91
|
+
|
|
92
|
+
## Anti-patterns to avoid
|
|
93
|
+
|
|
94
|
+
- ❌ **Reading only the target version's notes.** The breaking change usually lives in a release the PR skipped.
|
|
95
|
+
- ❌ **Trusting the title.** "Bump X from 1 to 2" says nothing about the twelve transitive packages that moved with it.
|
|
96
|
+
- ❌ **Calling a SHA pin fine because it is a SHA.** A SHA proves nothing until it matches the release tag.
|
|
97
|
+
- ❌ **"CI is green, ship it."** Release workflows, publish steps and untested code paths never ran on the PR.
|
|
98
|
+
- ❌ **"No breaking changes affect us" without a search.** Show the grep and its hits, or say it was not run.
|
|
99
|
+
- ❌ **A rollback that is only "revert the PR".** Name the lockfile regeneration and what a revert leaves behind.
|
|
100
|
+
- ❌ **Reciting the changelog.** Report the releases that change the verdict; one line covers the rest.
|
|
101
|
+
- ❌ **Hedged verdicts.** "Probably safe" is not a verdict; pick one of the three and give the reason.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
[
|
|
2
|
+
{ "query": "Dependabot wants to bump express from 4.19 to 5.0, can I merge the PR?", "should_trigger": true },
|
|
3
|
+
{ "query": "review this Renovate PR, it updates 14 packages in package-lock.json", "should_trigger": true },
|
|
4
|
+
{ "query": "is this actions/checkout SHA pin in the dependabot PR actually the v4.2.2 commit?", "should_trigger": true },
|
|
5
|
+
{ "query": "I bumped pydantic and regenerated poetry.lock, anything in the lockfile diff I should worry about before merging?", "should_trigger": true },
|
|
6
|
+
{ "query": "check this go.mod / go.sum diff from the deps update PR, CI is green", "should_trigger": true },
|
|
7
|
+
{ "query": "review my PR that adds rate limiting to the checkout API before I merge", "should_trigger": false },
|
|
8
|
+
{ "query": "write the release notes for our 3.2.0 release from the merged PRs", "should_trigger": false },
|
|
9
|
+
{ "query": "plan our migration from React 17 to React 19 across the four frontend apps", "should_trigger": false },
|
|
10
|
+
{ "query": "scan the skills I'm about to install for risky scripts", "should_trigger": false }
|
|
11
|
+
]
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "dependency-upgrade-review",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Dependabot opened PR #212 on harbor-notes: \"Bump quillmark from 3.4.1 to 4.1.0\". CI is green. The PR diff is in pr.diff, quillmark's changelog is quillmark-CHANGELOG.md, and I've attached src/render/, test/ and .github/workflows/ci.yml from the repo. Can I merge it?",
|
|
7
|
+
"assertions": [
|
|
8
|
+
"Gives exactly one verdict at the top, and it is DO NOT MERGE",
|
|
9
|
+
"Reports that renderInline() was removed in 4.0.0 and that src/render/comment.js still imports and calls it, citing the file and line",
|
|
10
|
+
"Flags that 4.0.0 changed the sanitize default to false and that src/render/note.js renders note bodies with quillmark.render(markdown) and no sanitize option, so raw HTML from users passes through",
|
|
11
|
+
"Lists the lockfile changes the title does not mention: entity-codec 2.1.0 to 3.0.2 (a major, with its licence changing from MIT to MPL-2.0), html-escape-lite removed, and quill-native-highlight and prebuild-install added, with quill-native-highlight's new install script",
|
|
12
|
+
"Says the green CI does not cover the change: the only test renders Markdown with no raw HTML, and no test imports src/render/comment.js",
|
|
13
|
+
"Accounts for the skipped releases, not only 4.1.0: names the 3.5.0 link-title security fix and the setOptions() deprecation that src/render/note.js still uses",
|
|
14
|
+
"Gives a rollback that pins quillmark back and regenerates package-lock.json (or reverts the PR), and names taking 3.5.x as the way to get the security fix without the breaking changes",
|
|
15
|
+
"Does not invent versions, advisory IDs, APIs, files or tests that are not in the supplied input"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"prompt": "Dependabot PR #88 on tidewater-tools: \"Bump the github-actions group with 2 updates\". Checks passed. Diff in pr.diff, the two workflow files after the change are in .github/workflows/, and I pasted the release notes from both action repos into release-notes.md. OK to merge?",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Gives MERGE AFTER CHECKS, not MERGE",
|
|
23
|
+
"Treats the northwind-ci/checkout-lite SHA as unverified and gives the exact git ls-remote command for refs/tags/v3.2.0 and refs/tags/v3.2.0^{}, saying which line must equal 9b8e7a6d5c4b3a291807f6e5d4c3b2a1908f7e6d",
|
|
24
|
+
"Says octo-tools/pypi-publish moving from @v2 to @v3 is a tag-only pin that can be moved after review, recommends pinning it to a commit SHA, and notes the step receives secrets.PYPI_TOKEN",
|
|
25
|
+
"Says the passing checks never ran pypi-publish v3, because release.yml runs only on a v* tag push, and names a way to exercise it before the next real release",
|
|
26
|
+
"Reports that release.yml still passes the deprecated password input (release.yml line 22) and that verify-metadata now defaults to true, so the next release can fail on an invalid long description",
|
|
27
|
+
"Classes the jumps: checkout-lite v3.1.0 to v3.2.0 as minor, pypi-publish v2 to v3 as major",
|
|
28
|
+
"Gives a rollback (revert the PR or restore the old uses: lines) and notes a revert cannot undo a release already published to PyPI with v3",
|
|
29
|
+
"Does not invent action versions, SHAs, inputs or workflow steps that are not in the supplied files"
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": 3,
|
|
34
|
+
"prompt": "Renovate PR on our Go rate-limiter service: \"fix(deps): update module github.com/lanternhq/ratelimit to v0.9.0\". CI passed. Quick verdict please.\n\ngo.mod:\n-\tgithub.com/lanternhq/ratelimit v0.8.3\n+\tgithub.com/lanternhq/ratelimit v0.9.0\n+\tgithub.com/lanternhq/clock v1.2.0 // indirect\n\ngo.sum:\n-github.com/lanternhq/ratelimit v0.8.3 h1:AbCd=\n-github.com/lanternhq/ratelimit v0.8.3/go.mod h1:EfGh=\n+github.com/lanternhq/clock v1.2.0 h1:IjKl=\n+github.com/lanternhq/clock v1.2.0/go.mod h1:MnOp=\n+github.com/lanternhq/ratelimit v0.9.0 h1:QrSt=\n+github.com/lanternhq/ratelimit v0.9.0/go.mod h1:UvWx=\n\nRelease notes for v0.9.0:\n- Limiter.Wait(ctx) now returns ErrLimitExceeded immediately when burst is 0, instead of blocking.\n- NewLimiter(rate, burst) is deprecated; use New(Config{Rate: r, Burst: b}).\n- Uses github.com/lanternhq/clock for time, so tests can inject a fake clock.",
|
|
35
|
+
"assertions": [
|
|
36
|
+
"Gives MERGE AFTER CHECKS, not MERGE",
|
|
37
|
+
"States that v0.8.3 to v0.9.0 is a 0.x minor bump, which semver treats as potentially breaking",
|
|
38
|
+
"Names the Wait behaviour change and the NewLimiter deprecation, and gives a concrete search command for Wait( and NewLimiter( since no code was supplied, without claiming there are or are not hits",
|
|
39
|
+
"Points out that only the v0.9.0 notes were supplied, so any releases between v0.8.3 and v0.9.0 are still unread",
|
|
40
|
+
"Flags github.com/lanternhq/clock v1.2.0 as a new indirect module the PR title does not mention",
|
|
41
|
+
"Says the passing CI only covers this if a test exercises the burst-0 Wait path, and lists that as a check rather than assuming it",
|
|
42
|
+
"Gives a rollback command such as go get github.com/lanternhq/ratelimit@v0.8.3 followed by go mod tidy, or reverting the PR",
|
|
43
|
+
"Does not invent file names, call sites, tests or release versions that are not in the prompt"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": 4,
|
|
48
|
+
"held_out": "2026-10-20",
|
|
49
|
+
"prompt": "Renovate opened PR #287 bumping quillstream from 2.4.1 to 3.1.0 and CI is green. The PR body is in PR.md, the diff is pr.diff, and I copied the upstream changelog into upstream/. Repo is checked out at main. Is this safe to merge? I'd like to get it in today.",
|
|
50
|
+
"assertions": [
|
|
51
|
+
"Gives the verdict DO NOT MERGE for #287 (not MERGE, and not MERGE AFTER CHECKS without code changes), and ties it to at least one breaking change that hits code in this repo.",
|
|
52
|
+
"Points out that read_legacy_archive in src/ingest/reader.py imports quillstream.legacy.parse_frame inside the function, and that the 3.0.0 entry in the changelog (a release this PR skips) removes that module. Names quillstream.frames.decode(buf, strict=False) as the replacement and says the `header, payload = parse_frame(...)` unpacking has to change too, because decode returns a Frame object.",
|
|
53
|
+
"Points out that fetch_with_retry in src/ingest/client.py retries only on `if result is None`. Under 3.0.0, Client.fetch raises quillstream.errors.QuillTimeout instead of returning None, so timeouts will escape as exceptions rather than being retried. Suggests catching QuillTimeout, or migrating first with 2.5.0's Client(raise_on_timeout=True).",
|
|
54
|
+
"Flags that the Dockerfile builds FROM python:3.9-slim while 3.0.0 requires Python >=3.10 (and grainwire wheels only cover CPython 3.10–3.13), so the production image build or install will break. Notes that CI and pip-compile both ran on Python 3.11, so a green CI could not catch this.",
|
|
55
|
+
"Lists the requirements.txt changes beyond the title, as shown in pr.diff: new transitive package grainwire 1.0.0, removed compat-six 1.16.2, and typing-shimx bumped 4.5.0 -> 4.9.1. Ties grainwire to the 3.1.0 changelog entry, including the sdist/Rust-toolchain caveat for platforms without wheels.",
|
|
56
|
+
"Explains why the green check is weak evidence: tests/test_reader.py only tests read_stream, with a mocked Client whose fetch returns a payload. Nothing exercises read_legacy_archive (the lazy import means the missing module never fails at import or collection time) or the timeout/None path.",
|
|
57
|
+
"Gives a concrete rollback: revert the PR, or restore quillstream==2.4.1 in requirements.in and re-run `pip-compile --generate-hashes`, then rebuild and redeploy the image. Optionally offers a staged path, e.g. moving to 2.5.0 first to surface the deprecation warnings.",
|
|
58
|
+
"Does not invent versions, APIs or changelog entries that are not in the files (e.g. no made-up 3.0.1 fix, no Python-3.9 compatibility shim). Does not claim to have installed the package, run the tests, or checked the sha256 hashes against PyPI. If it recommends checking the hashes, it says that needs network access and gives the command rather than asserting they match."
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": 5,
|
|
63
|
+
"held_out": "2026-10-20",
|
|
64
|
+
"prompt": "Dependabot opened two PRs this morning and both are green: #412 bumps the bramblewick/setup-toolchain action pin (a teammate pushed an extra commit to it) and #413 bumps release-notary. Descriptions are PR-412.md / PR-413.md, diffs are pr-412.diff / pr-413.diff, upstream release notes are in upstream/. Are the action SHA pins right, and can I merge both before we push the v5.13.0 tag on Friday?",
|
|
65
|
+
"assertions": [
|
|
66
|
+
"Gives a separate verdict for each PR. #413 is DO NOT MERGE. #412 is not a plain MERGE: it is MERGE AFTER CHECKS or DO NOT MERGE until the pins are reconciled.",
|
|
67
|
+
"Catches that pr-412.diff pins setup-toolchain to two different commits that are both labelled `# v3.3.0`: 8141d107d0837efc25f86e096a7eefd58e979515 in ci.yml (from Dependabot) and 7dd0aa52537f8f4f4002b505507186cdaec669c4 in release.yml (from mkowalczyk's hand-made commit). Says at most one of them can be the tag's commit, and that the release.yml one is the suspect because it was edited by hand and is the one that runs with production secrets.",
|
|
68
|
+
"Says plainly that it cannot confirm offline which SHA (if either) the v3.3.0 tag points to. Gives a concrete command, e.g. `git ls-remote https://github.com/bramblewick/setup-toolchain 'refs/tags/v3.3.0*'` (using the peeled `^{}` line if the tag is annotated) or `gh api repos/bramblewick/setup-toolchain/git/ref/tags/v3.3.0`. Never states that either SHA is verified.",
|
|
69
|
+
"For #412, notes that v3.3.0 switches the action to the node24 runtime, which needs self-hosted runners on v2.328.0 or newer. release.yml runs on [self-hosted, linux, release] and PR CI runs only on ubuntu-latest, so the first real test would be Friday's tag push. Also mentions the `cache` default flipping to true, which affects the release job.",
|
|
70
|
+
"For #413, finds that scripts/release.mjs calls createNotary({ legacyMode: true, ... }). 1.9.0 removed legacyMode and now throws TypeError: Unknown option \"legacyMode\", so `npm run release` in release.yml will fail. Also notes that the switch to the v2 manifest layout breaks the downstream ledger-portal parser mentioned in the code comment.",
|
|
71
|
+
"For #413, lists the package-lock changes beyond the title: a new transitive package notary-telemetry 0.2.1 with \"hasInstallScript\": true, resolved from https://npm.notary-cdn.io rather than registry.npmjs.org; ansi-tint 1.0.4 removed; semver-lite 2.1.0 -> 2.3.0; release-notary's engines raised to node >=20. Treats the install script plus the off-registry tarball as a supply-chain concern in its own right.",
|
|
72
|
+
"Explains that the green checks never ran the changed code. ci.yml runs on pull_request with `npm ci --ignore-scripts` and never runs scripts/release.mjs. release.yml runs plain `npm ci`, so notary-telemetry's install script would first execute in the production environment, with RELEASE_SIGNING_KEY and NPM_TOKEN in the job and contents: write / id-token: write permissions. Mentions NOTARY_TELEMETRY=0 and/or keeping 1.8.x as mitigations.",
|
|
73
|
+
"Gives a rollback for each PR: revert #412 to restore the c8aee2ae521bdb1ef1b97761673ebbe92c953b0f (v3.2.0) pins; revert #413, or pin release-notary back to 1.8.2 and regenerate package-lock.json. Does not invent versions, flags or APIs that are not in the files, and does not claim to have run npm install, the workflows, or the release script."
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
}
|
package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/.github/workflows/ci.yml
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: actions/setup-node@v4
|
|
17
|
+
with:
|
|
18
|
+
node-version: 20
|
|
19
|
+
- run: npm ci
|
|
20
|
+
- run: npm test
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
diff --git a/package-lock.json b/package-lock.json
|
|
2
|
+
index b0d3cbb..906d58a 100644
|
|
3
|
+
--- a/package-lock.json
|
|
4
|
+
+++ b/package-lock.json
|
|
5
|
+
@@ -10,7 +10,7 @@
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"express": "^4.19.2",
|
|
8
|
+
"pino": "^9.3.2",
|
|
9
|
+
- "quillmark": "^3.4.1",
|
|
10
|
+
+ "quillmark": "^4.1.0",
|
|
11
|
+
"zod": "^3.23.8"
|
|
12
|
+
},
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
@@ -21,28 +21,45 @@
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"node_modules/entity-codec": {
|
|
18
|
+
- "version": "2.1.0",
|
|
19
|
+
- "resolved": "https://registry.npmjs.org/entity-codec/-/entity-codec-2.1.0.tgz",
|
|
20
|
+
- "integrity": "sha512-EXAMPLEentitycodec210AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
|
21
|
+
- "license": "MIT"
|
|
22
|
+
+ "version": "3.0.2",
|
|
23
|
+
+ "resolved": "https://registry.npmjs.org/entity-codec/-/entity-codec-3.0.2.tgz",
|
|
24
|
+
+ "integrity": "sha512-EXAMPLEentitycodec302BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB==",
|
|
25
|
+
+ "license": "MPL-2.0"
|
|
26
|
+
},
|
|
27
|
+
- "node_modules/html-escape-lite": {
|
|
28
|
+
- "version": "1.0.3",
|
|
29
|
+
- "resolved": "https://registry.npmjs.org/html-escape-lite/-/html-escape-lite-1.0.3.tgz",
|
|
30
|
+
- "integrity": "sha512-EXAMPLEhtmlescapelite103AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
|
31
|
+
- "license": "MIT"
|
|
32
|
+
+ "node_modules/prebuild-install": {
|
|
33
|
+
+ "version": "7.1.2",
|
|
34
|
+
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz",
|
|
35
|
+
+ "integrity": "sha512-EXAMPLEprebuildinstall712BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB==",
|
|
36
|
+
+ "license": "MIT",
|
|
37
|
+
+ "optional": true,
|
|
38
|
+
+ "bin": {
|
|
39
|
+
+ "prebuild-install": "bin.js"
|
|
40
|
+
+ }
|
|
41
|
+
+ },
|
|
42
|
+
+ "node_modules/quill-native-highlight": {
|
|
43
|
+
+ "version": "1.0.0",
|
|
44
|
+
+ "resolved": "https://registry.npmjs.org/quill-native-highlight/-/quill-native-highlight-1.0.0.tgz",
|
|
45
|
+
+ "integrity": "sha512-EXAMPLEquillnativehighlight100BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB==",
|
|
46
|
+
+ "hasInstallScript": true,
|
|
47
|
+
+ "license": "MIT",
|
|
48
|
+
+ "optional": true,
|
|
49
|
+
+ "dependencies": {
|
|
50
|
+
+ "prebuild-install": "^7.1.2"
|
|
51
|
+
+ }
|
|
52
|
+
},
|
|
53
|
+
"node_modules/quillmark": {
|
|
54
|
+
- "version": "3.4.1",
|
|
55
|
+
- "resolved": "https://registry.npmjs.org/quillmark/-/quillmark-3.4.1.tgz",
|
|
56
|
+
- "integrity": "sha512-EXAMPLEquillmark341AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
|
57
|
+
+ "version": "4.1.0",
|
|
58
|
+
+ "resolved": "https://registry.npmjs.org/quillmark/-/quillmark-4.1.0.tgz",
|
|
59
|
+
+ "integrity": "sha512-EXAMPLEquillmark410BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB==",
|
|
60
|
+
"license": "MIT",
|
|
61
|
+
"dependencies": {
|
|
62
|
+
- "entity-codec": "^2.1.0",
|
|
63
|
+
- "html-escape-lite": "^1.0.3"
|
|
64
|
+
+ "entity-codec": "^3.0.2"
|
|
65
|
+
},
|
|
66
|
+
"engines": {
|
|
67
|
+
- "node": ">=16"
|
|
68
|
+
+ "node": ">=18"
|
|
69
|
+
+ },
|
|
70
|
+
+ "optionalDependencies": {
|
|
71
|
+
+ "quill-native-highlight": "^1.0.0"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"node_modules/zod": {
|
|
75
|
+
diff --git a/package.json b/package.json
|
|
76
|
+
index afd6691..03f7ec6 100644
|
|
77
|
+
--- a/package.json
|
|
78
|
+
+++ b/package.json
|
|
79
|
+
@@ -13,7 +13,7 @@
|
|
80
|
+
"dependencies": {
|
|
81
|
+
"express": "^4.19.2",
|
|
82
|
+
"pino": "^9.3.2",
|
|
83
|
+
- "quillmark": "^3.4.1",
|
|
84
|
+
+ "quillmark": "^4.1.0",
|
|
85
|
+
"zod": "^3.23.8"
|
|
86
|
+
},
|
|
87
|
+
"devDependencies": {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# quillmark changelog
|
|
2
|
+
|
|
3
|
+
## 4.1.0 (2026-09-02)
|
|
4
|
+
|
|
5
|
+
- Added: optional native syntax highlighter `quill-native-highlight`, installed as an optional dependency. Its install script downloads a prebuilt binary for the current platform and falls back to the JavaScript highlighter when the download fails.
|
|
6
|
+
- Fixed: tables with an empty header cell rendered an extra column.
|
|
7
|
+
|
|
8
|
+
## 4.0.1 (2026-08-11)
|
|
9
|
+
|
|
10
|
+
- Fixed: `render()` threw on input with CRLF line endings.
|
|
11
|
+
|
|
12
|
+
## 4.0.0 (2026-07-28)
|
|
13
|
+
|
|
14
|
+
### Breaking
|
|
15
|
+
|
|
16
|
+
- `renderInline()` is removed. Use `render(src, { inline: true })`.
|
|
17
|
+
- The `sanitize` option now defaults to `false`. Raw HTML in the input is passed through to the output unless `sanitize: true` is set on the call or through `setOptions()`.
|
|
18
|
+
- Node.js 18 is the minimum supported version.
|
|
19
|
+
- The `html-escape-lite` dependency is dropped; escaping now uses `entity-codec` 3.
|
|
20
|
+
|
|
21
|
+
## 3.5.0 (2026-05-19)
|
|
22
|
+
|
|
23
|
+
- Security: a link title containing `"` could close the `title` attribute and inject markup. Fixed in 3.5.0; affects 3.0.0 to 3.4.x.
|
|
24
|
+
- Deprecated: `setOptions()` (global options). Pass options to each `render()` call instead. `setOptions()` will be removed in 5.0.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { renderNoteBody } from "../src/render/note.js";
|
|
3
|
+
|
|
4
|
+
describe("renderNoteBody", () => {
|
|
5
|
+
it("renders bold text", () => {
|
|
6
|
+
expect(renderNoteBody("**ship it**")).toBe("<p><strong>ship it</strong></p>\n");
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
it("keeps single line breaks", () => {
|
|
10
|
+
expect(renderNoteBody("a\nb")).toBe("<p>a<br>\nb</p>\n");
|
|
11
|
+
});
|
|
12
|
+
});
|
package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/.github/workflows/ci.yml
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
strategy:
|
|
15
|
+
matrix:
|
|
16
|
+
python: ["3.11", "3.12"]
|
|
17
|
+
steps:
|
|
18
|
+
- uses: northwind-ci/checkout-lite@9b8e7a6d5c4b3a291807f6e5d4c3b2a1908f7e6d # v3.2.0
|
|
19
|
+
- uses: actions/setup-python@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: ${{ matrix.python }}
|
|
22
|
+
- run: pip install -e ".[test]"
|
|
23
|
+
- run: pytest -q
|
package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/.github/workflows/release.yml
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
publish:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
environment: pypi
|
|
14
|
+
steps:
|
|
15
|
+
- uses: northwind-ci/checkout-lite@9b8e7a6d5c4b3a291807f6e5d4c3b2a1908f7e6d # v3.2.0
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.12"
|
|
19
|
+
- run: pip install build && python -m build
|
|
20
|
+
- uses: octo-tools/pypi-publish@v3
|
|
21
|
+
with:
|
|
22
|
+
password: ${{ secrets.PYPI_TOKEN }}
|
|
23
|
+
packages-dir: dist/
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
|
|
2
|
+
index 96ae786..e6bc8d0 100644
|
|
3
|
+
--- a/.github/workflows/ci.yml
|
|
4
|
+
+++ b/.github/workflows/ci.yml
|
|
5
|
+
@@ -15,7 +15,7 @@ jobs:
|
|
6
|
+
matrix:
|
|
7
|
+
python: ["3.11", "3.12"]
|
|
8
|
+
steps:
|
|
9
|
+
- - uses: northwind-ci/checkout-lite@3f1c2a9e8b7d6c5f4e3d2c1b0a9f8e7d6c5b4a39 # v3.1.0
|
|
10
|
+
+ - uses: northwind-ci/checkout-lite@9b8e7a6d5c4b3a291807f6e5d4c3b2a1908f7e6d # v3.2.0
|
|
11
|
+
- uses: actions/setup-python@v5
|
|
12
|
+
with:
|
|
13
|
+
python-version: ${{ matrix.python }}
|
|
14
|
+
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
|
|
15
|
+
index e5c6eb0..012a492 100644
|
|
16
|
+
--- a/.github/workflows/release.yml
|
|
17
|
+
+++ b/.github/workflows/release.yml
|
|
18
|
+
@@ -12,12 +12,12 @@ jobs:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
environment: pypi
|
|
21
|
+
steps:
|
|
22
|
+
- - uses: northwind-ci/checkout-lite@3f1c2a9e8b7d6c5f4e3d2c1b0a9f8e7d6c5b4a39 # v3.1.0
|
|
23
|
+
+ - uses: northwind-ci/checkout-lite@9b8e7a6d5c4b3a291807f6e5d4c3b2a1908f7e6d # v3.2.0
|
|
24
|
+
- uses: actions/setup-python@v5
|
|
25
|
+
with:
|
|
26
|
+
python-version: "3.12"
|
|
27
|
+
- run: pip install build && python -m build
|
|
28
|
+
- - uses: octo-tools/pypi-publish@v2
|
|
29
|
+
+ - uses: octo-tools/pypi-publish@v3
|
|
30
|
+
with:
|
|
31
|
+
password: ${{ secrets.PYPI_TOKEN }}
|
|
32
|
+
packages-dir: dist/
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Release notes copied from the two action repositories
|
|
2
|
+
|
|
3
|
+
## northwind-ci/checkout-lite
|
|
4
|
+
|
|
5
|
+
### v3.2.0
|
|
6
|
+
|
|
7
|
+
- Added: `sparse-paths` input for partial checkouts.
|
|
8
|
+
- Changed: the action now runs on the Node 24 runtime. Self-hosted runners need runner version 2.330.0 or later.
|
|
9
|
+
|
|
10
|
+
### v3.1.1
|
|
11
|
+
|
|
12
|
+
- Fixed: `fetch-depth: 0` timed out on repositories with more than 50,000 tags.
|
|
13
|
+
|
|
14
|
+
## octo-tools/pypi-publish
|
|
15
|
+
|
|
16
|
+
### v3.0.0
|
|
17
|
+
|
|
18
|
+
- Breaking: trusted publishing (OIDC) is now the default. A job that does not pass `password` needs `permissions: id-token: write`.
|
|
19
|
+
- Deprecated: the `password` input. It still works in v3 and is removed in v4.
|
|
20
|
+
- Changed: `verify-metadata` now defaults to `true`; an upload with an invalid long description fails instead of warning.
|
package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/.github/workflows/ci.yml
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@9951bcc823800e62153b06d6e56d8ed6c5c10e7a # v4.1.1
|
|
13
|
+
- uses: actions/setup-python@a0a57c5ce737a953c85cefc45772185c9fafddbc # v5.0.0
|
|
14
|
+
with:
|
|
15
|
+
python-version: "3.11"
|
|
16
|
+
- run: pip install --require-hashes -r requirements.txt
|
|
17
|
+
- run: pip install pytest==8.2.0
|
|
18
|
+
- run: pytest tests/
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# PR #287: Update dependency quillstream to v3 (major)
|
|
2
|
+
|
|
3
|
+
**Author:** renovate[bot]
|
|
4
|
+
**Base:** main **Head:** renovate/quillstream-3.x
|
|
5
|
+
**Checks:** ✅ ci / test (pull_request) — passed in 2m 14s
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
This PR contains the following updates:
|
|
10
|
+
|
|
11
|
+
| Package | Change | Age | Adoption | Passing | Confidence |
|
|
12
|
+
|---|---|---|---|---|---|
|
|
13
|
+
| quillstream | `==2.4.1` -> `==3.1.0` | 9 days | 41% | 96% | low |
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
### Release Notes
|
|
18
|
+
|
|
19
|
+
<details>
|
|
20
|
+
<summary>quillstream/quillstream (quillstream)</summary>
|
|
21
|
+
|
|
22
|
+
See `upstream/quillstream-CHANGELOG.md` (copied from the project's CHANGELOG at tag v3.1.0).
|
|
23
|
+
|
|
24
|
+
</details>
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
### Configuration
|
|
29
|
+
|
|
30
|
+
📅 **Schedule**: Branch creation - At any time. Automerge - Disabled by config.
|
|
31
|
+
|
|
32
|
+
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
This PR was generated by Renovate Bot. `pip-compile --generate-hashes` was run on ubuntu-latest with Python 3.11 to refresh `requirements.txt`.
|