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,47 @@
|
|
|
1
|
+
diff --git a/requirements.in b/requirements.in
|
|
2
|
+
index 4b1c2e0..9a7d3f1 100644
|
|
3
|
+
--- a/requirements.in
|
|
4
|
+
+++ b/requirements.in
|
|
5
|
+
@@ -1,4 +1,4 @@
|
|
6
|
+
httpcore-lite==1.3.0
|
|
7
|
+
-quillstream==2.4.1
|
|
8
|
+
+quillstream==3.1.0
|
|
9
|
+
pydantic-mini==0.9.2
|
|
10
|
+
structlog-tiny==4.0.1
|
|
11
|
+
diff --git a/requirements.txt b/requirements.txt
|
|
12
|
+
index 77e0a1d..c2f9b48 100644
|
|
13
|
+
--- a/requirements.txt
|
|
14
|
+
+++ b/requirements.txt
|
|
15
|
+
@@ -4,10 +4,10 @@
|
|
16
|
+
#
|
|
17
|
+
# pip-compile --generate-hashes requirements.in
|
|
18
|
+
#
|
|
19
|
+
-compat-six==1.16.2 \
|
|
20
|
+
- --hash=sha256:5926410f0515cd47563d23317bb234f19b519e17a61f630b3a7a3be2fbd023f3
|
|
21
|
+
- # via quillstream
|
|
22
|
+
+grainwire==1.0.0 \
|
|
23
|
+
+ --hash=sha256:ac5a05fbf6a38d80bb205b0640bfe3c886336e7fa936be0c57d323fe24f258ba
|
|
24
|
+
+ # via quillstream
|
|
25
|
+
httpcore-lite==1.3.0 \
|
|
26
|
+
--hash=sha256:993ac8ea6cc9be8463df390c480a245a090a3bba42ed538f9c8742d09ad7222a
|
|
27
|
+
# via
|
|
28
|
+
# -r requirements.in
|
|
29
|
+
# quillstream
|
|
30
|
+
@@ -16,15 +16,15 @@ pydantic-mini==0.9.2 \
|
|
31
|
+
--hash=sha256:5411291f6c6c8ca714342bb4a421861331b89026a8318fa95c72043a8b6cfee7
|
|
32
|
+
# via -r requirements.in
|
|
33
|
+
-quillstream==2.4.1 \
|
|
34
|
+
- --hash=sha256:7eb6637605fcb69f63cecd3000870f473af8aaaf41e5347ee3e80708a07561ca
|
|
35
|
+
+quillstream==3.1.0 \
|
|
36
|
+
+ --hash=sha256:e56b4c0d40fd62f44e33a53cc83ab388ac8edb6275eaac283afb2744bcd27c6d
|
|
37
|
+
# via -r requirements.in
|
|
38
|
+
structlog-tiny==4.0.1 \
|
|
39
|
+
--hash=sha256:1058a4589566f633cf2e795c7e5cfacdeb635d0b35e927619b4a437a1f6bdc01
|
|
40
|
+
# via -r requirements.in
|
|
41
|
+
-typing-shimx==4.5.0 \
|
|
42
|
+
- --hash=sha256:0c8ab72efe0bd56117af955bfa741a49741395e2dfcd4ba688c941bda1cb963a
|
|
43
|
+
+typing-shimx==4.9.1 \
|
|
44
|
+
+ --hash=sha256:2e0970bbb5cd4ca819222abb76df78762fb1a7a0b3a98ee8fc38c3271cb7f450
|
|
45
|
+
# via
|
|
46
|
+
# pydantic-mini
|
|
47
|
+
# quillstream
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import time
|
|
4
|
+
|
|
5
|
+
import structlog_tiny
|
|
6
|
+
|
|
7
|
+
log = structlog_tiny.get_logger(__name__)
|
|
8
|
+
|
|
9
|
+
MAX_ATTEMPTS = 3
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def fetch_with_retry(client, url: str):
|
|
13
|
+
"""Fetch ``url``, retrying on timeout.
|
|
14
|
+
|
|
15
|
+
quillstream's ``Client.fetch`` returns ``None`` when the request times out.
|
|
16
|
+
"""
|
|
17
|
+
for attempt in range(1, MAX_ATTEMPTS + 1):
|
|
18
|
+
result = client.fetch(url)
|
|
19
|
+
if result is None:
|
|
20
|
+
log.warning("quillstream fetch timed out", url=url, attempt=attempt)
|
|
21
|
+
time.sleep(2 ** attempt)
|
|
22
|
+
continue
|
|
23
|
+
return result
|
|
24
|
+
raise RuntimeError(f"gave up fetching {url} after {MAX_ATTEMPTS} attempts")
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Readers for the ingest pipeline.
|
|
2
|
+
|
|
3
|
+
Current-format files go through ``read_stream``. Archived ``.qsf1`` files
|
|
4
|
+
written before the 2024 migration are still replayed by the monthly backfill
|
|
5
|
+
job through ``read_legacy_archive``.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Iterator
|
|
11
|
+
|
|
12
|
+
import quillstream
|
|
13
|
+
|
|
14
|
+
from .client import fetch_with_retry
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def read_stream(url: str) -> Iterator[bytes]:
|
|
18
|
+
client = quillstream.Client(timeout=10)
|
|
19
|
+
payload = fetch_with_retry(client, url)
|
|
20
|
+
yield from payload.chunks()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def read_legacy_archive(path: Path) -> Iterator[bytes]:
|
|
24
|
+
# Imported lazily: only the backfill job needs the old frame format.
|
|
25
|
+
from quillstream.legacy import parse_frame
|
|
26
|
+
|
|
27
|
+
data = path.read_bytes()
|
|
28
|
+
offset = 0
|
|
29
|
+
while offset < len(data):
|
|
30
|
+
header, payload = parse_frame(data[offset:])
|
|
31
|
+
yield payload
|
|
32
|
+
offset += header.length
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from unittest import mock
|
|
2
|
+
|
|
3
|
+
from src.ingest import reader
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class FakePayload:
|
|
7
|
+
def chunks(self):
|
|
8
|
+
return [b"a", b"b"]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_read_stream_yields_chunks():
|
|
12
|
+
fake_client = mock.Mock()
|
|
13
|
+
fake_client.fetch.return_value = FakePayload()
|
|
14
|
+
with mock.patch("quillstream.Client", return_value=fake_client):
|
|
15
|
+
assert list(reader.read_stream("qs://example/feed")) == [b"a", b"b"]
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to quillstream are documented here. This project follows Semantic Versioning.
|
|
4
|
+
|
|
5
|
+
## 3.1.0 — 2026-10-11
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- Frame decoding is now delegated to the new `grainwire` package (`grainwire>=1.0,<2`), which is a required dependency. `grainwire` ships compiled wheels for CPython 3.10–3.13 on manylinux and macOS; other platforms build from sdist and need a Rust toolchain.
|
|
9
|
+
- `Client(..., compression="auto")` negotiates zstd when the server supports it.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
- `Client.close()` no longer leaks a socket when called twice.
|
|
13
|
+
|
|
14
|
+
## 3.0.0 — 2026-08-29
|
|
15
|
+
|
|
16
|
+
### Breaking
|
|
17
|
+
- **Python 3.10 or newer is required.** Support for Python 3.8 and 3.9 has been dropped (`python_requires=">=3.10"`).
|
|
18
|
+
- **Removed the `quillstream.legacy` module**, deprecated since 2.2. `quillstream.legacy.parse_frame(buf)` is gone; use `quillstream.frames.decode(buf, strict=False)` instead. Note that `decode` returns a `Frame` object rather than a `(header, payload)` tuple; use `frame.header` and `frame.payload`.
|
|
19
|
+
- `Client.fetch()` now raises `quillstream.errors.QuillTimeout` when the request times out. Previously it returned `None`.
|
|
20
|
+
- Dropped the dependency on `compat-six`.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- Minimum `typing-shimx` is now 4.8.
|
|
24
|
+
|
|
25
|
+
## 2.5.0 — 2026-06-02
|
|
26
|
+
|
|
27
|
+
### Deprecated
|
|
28
|
+
- Importing `quillstream.legacy` now emits a `DeprecationWarning` with the removal version (3.0).
|
|
29
|
+
- `Client.fetch()` returning `None` on timeout is deprecated; opt in to the 3.0 behaviour with `Client(raise_on_timeout=True)`.
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
- `quillstream.frames.decode()`.
|
|
33
|
+
|
|
34
|
+
## 2.4.1 — 2026-03-17
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
- Off-by-one in chunked frame reassembly for payloads larger than 64 KiB.
|
package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.github/workflows/ci.yml
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
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@9ce6fd9fa4b164bf8911b62115bf9104ba1a2803 # v4.2.0
|
|
16
|
+
- uses: bramblewick/setup-toolchain@c8aee2ae521bdb1ef1b97761673ebbe92c953b0f # v3.2.0
|
|
17
|
+
with:
|
|
18
|
+
node-version-file: .nvmrc
|
|
19
|
+
- run: npm ci --ignore-scripts
|
|
20
|
+
- run: npm run lint
|
|
21
|
+
- run: npm test
|
|
22
|
+
- run: npm run build
|
package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.github/workflows/release.yml
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: write
|
|
9
|
+
id-token: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
publish:
|
|
13
|
+
runs-on: [self-hosted, linux, release]
|
|
14
|
+
environment: production
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@9ce6fd9fa4b164bf8911b62115bf9104ba1a2803 # v4.2.0
|
|
17
|
+
- uses: bramblewick/setup-toolchain@c8aee2ae521bdb1ef1b97761673ebbe92c953b0f # v3.2.0
|
|
18
|
+
with:
|
|
19
|
+
node-version-file: .nvmrc
|
|
20
|
+
- run: npm ci
|
|
21
|
+
- run: npm run build
|
|
22
|
+
- run: npm run release
|
|
23
|
+
env:
|
|
24
|
+
RELEASE_SIGNING_KEY: ${{ secrets.RELEASE_SIGNING_KEY }}
|
|
25
|
+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
22.11.0
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# PR #412: Bump bramblewick/setup-toolchain from 3.2.0 to 3.3.0
|
|
2
|
+
|
|
3
|
+
**Author:** dependabot[bot]
|
|
4
|
+
**Base:** main **Head:** dependabot/github_actions/bramblewick/setup-toolchain-3.3.0
|
|
5
|
+
**Checks:** ✅ ci / test (pull_request) — passed
|
|
6
|
+
|
|
7
|
+
Bumps [bramblewick/setup-toolchain](https://github.com/bramblewick/setup-toolchain) from 3.2.0 to 3.3.0.
|
|
8
|
+
|
|
9
|
+
Release notes: see `upstream/setup-toolchain-RELEASES.md`.
|
|
10
|
+
|
|
11
|
+
**Commits on this branch**
|
|
12
|
+
1. `dependabot[bot]` — Bump bramblewick/setup-toolchain from 3.2.0 to 3.3.0
|
|
13
|
+
2. `mkowalczyk` — "dependabot only touched ci.yml, bumped release.yml too so they match"
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# PR #413: Bump release-notary from 1.8.2 to 1.9.0
|
|
2
|
+
|
|
3
|
+
**Author:** dependabot[bot]
|
|
4
|
+
**Base:** main **Head:** dependabot/npm_and_yarn/release-notary-1.9.0
|
|
5
|
+
**Labels:** dependencies, javascript
|
|
6
|
+
**Checks:** ✅ ci / test (pull_request) — passed
|
|
7
|
+
|
|
8
|
+
Bumps [release-notary](https://github.com/notary-tools/release-notary) from 1.8.2 to 1.9.0.
|
|
9
|
+
|
|
10
|
+
Changelog: see `upstream/release-notary-CHANGELOG.md`.
|
|
11
|
+
|
|
12
|
+
[](#) — compatibility score unknown (too few updates).
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@harrowfield/ledger-ui",
|
|
3
|
+
"version": "5.12.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"lint": "eslint-mini src",
|
|
8
|
+
"test": "vitest-lite run",
|
|
9
|
+
"build": "rollup-lite -c",
|
|
10
|
+
"release": "node scripts/release.mjs"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"tally-format": "^2.3.0"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"eslint-mini": "^9.1.0",
|
|
17
|
+
"release-notary": "^1.8.2",
|
|
18
|
+
"rollup-lite": "^4.0.3",
|
|
19
|
+
"vitest-lite": "^2.0.0"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
|
|
2
|
+
index 3c1d0a2..5e7b9f4 100644
|
|
3
|
+
--- a/.github/workflows/ci.yml
|
|
4
|
+
+++ b/.github/workflows/ci.yml
|
|
5
|
+
@@ -13,7 +13,7 @@ jobs:
|
|
6
|
+
runs-on: ubuntu-latest
|
|
7
|
+
steps:
|
|
8
|
+
- uses: actions/checkout@9ce6fd9fa4b164bf8911b62115bf9104ba1a2803 # v4.2.0
|
|
9
|
+
- - uses: bramblewick/setup-toolchain@c8aee2ae521bdb1ef1b97761673ebbe92c953b0f # v3.2.0
|
|
10
|
+
+ - uses: bramblewick/setup-toolchain@8141d107d0837efc25f86e096a7eefd58e979515 # v3.3.0
|
|
11
|
+
with:
|
|
12
|
+
node-version-file: .nvmrc
|
|
13
|
+
- run: npm ci --ignore-scripts
|
|
14
|
+
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
|
|
15
|
+
index 0a4e8c1..b19d2e7 100644
|
|
16
|
+
--- a/.github/workflows/release.yml
|
|
17
|
+
+++ b/.github/workflows/release.yml
|
|
18
|
+
@@ -15,7 +15,7 @@ jobs:
|
|
19
|
+
environment: production
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@9ce6fd9fa4b164bf8911b62115bf9104ba1a2803 # v4.2.0
|
|
22
|
+
- - uses: bramblewick/setup-toolchain@c8aee2ae521bdb1ef1b97761673ebbe92c953b0f # v3.2.0
|
|
23
|
+
+ - uses: bramblewick/setup-toolchain@7dd0aa52537f8f4f4002b505507186cdaec669c4 # v3.3.0
|
|
24
|
+
with:
|
|
25
|
+
node-version-file: .nvmrc
|
|
26
|
+
- run: npm ci
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
diff --git a/package.json b/package.json
|
|
2
|
+
index 61b0e2a..e3f7c19 100644
|
|
3
|
+
--- a/package.json
|
|
4
|
+
+++ b/package.json
|
|
5
|
+
@@ -14,7 +14,7 @@
|
|
6
|
+
},
|
|
7
|
+
"devDependencies": {
|
|
8
|
+
"eslint-mini": "^9.1.0",
|
|
9
|
+
- "release-notary": "^1.8.2",
|
|
10
|
+
+ "release-notary": "^1.9.0",
|
|
11
|
+
"rollup-lite": "^4.0.3",
|
|
12
|
+
"vitest-lite": "^2.0.0"
|
|
13
|
+
}
|
|
14
|
+
diff --git a/package-lock.json b/package-lock.json
|
|
15
|
+
index 9f2d4b7..1ac80e5 100644
|
|
16
|
+
--- a/package-lock.json
|
|
17
|
+
+++ b/package-lock.json
|
|
18
|
+
@@ -12,7 +12,7 @@
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"eslint-mini": "^9.1.0",
|
|
21
|
+
- "release-notary": "^1.8.2",
|
|
22
|
+
+ "release-notary": "^1.9.0",
|
|
23
|
+
"rollup-lite": "^4.0.3",
|
|
24
|
+
"vitest-lite": "^2.0.0"
|
|
25
|
+
}
|
|
26
|
+
@@ -88,16 +88,6 @@
|
|
27
|
+
- "node_modules/ansi-tint": {
|
|
28
|
+
- "version": "1.0.4",
|
|
29
|
+
- "resolved": "https://registry.npmjs.org/ansi-tint/-/ansi-tint-1.0.4.tgz",
|
|
30
|
+
- "integrity": "sha512-G/ihecLGe8wYlmaKXMJUFfgBUV/HgkesmrXhTTxBqhQrYzGlVOniQfCu4MlJAUfeyjvVf+TYrCCSemjHEdDQjA==",
|
|
31
|
+
- "dev": true,
|
|
32
|
+
- "license": "MIT",
|
|
33
|
+
- "engines": {
|
|
34
|
+
- "node": ">=14"
|
|
35
|
+
- }
|
|
36
|
+
- },
|
|
37
|
+
@@ -402,30 +392,45 @@
|
|
38
|
+
+ "node_modules/notary-telemetry": {
|
|
39
|
+
+ "version": "0.2.1",
|
|
40
|
+
+ "resolved": "https://npm.notary-cdn.io/notary-telemetry/-/notary-telemetry-0.2.1.tgz",
|
|
41
|
+
+ "integrity": "sha512-kJAfi+YYicLisVOtWlYrspxPF4uz6y3b6QfD9GN44+ykAjLtZFIBMPzpRjsixIrGncIVsO5cZPGTL3edJLEDag==",
|
|
42
|
+
+ "dev": true,
|
|
43
|
+
+ "hasInstallScript": true,
|
|
44
|
+
+ "license": "SEE LICENSE IN LICENSE.txt",
|
|
45
|
+
+ "dependencies": {
|
|
46
|
+
+ "semver-lite": "^2.3.0"
|
|
47
|
+
+ }
|
|
48
|
+
+ },
|
|
49
|
+
"node_modules/release-notary": {
|
|
50
|
+
- "version": "1.8.2",
|
|
51
|
+
- "resolved": "https://registry.npmjs.org/release-notary/-/release-notary-1.8.2.tgz",
|
|
52
|
+
- "integrity": "sha512-fS99/rtXzwQTzMu2D7jDqVze+VZpAS8ftGR6+1J6GeJ4JMhkxkVVRhHLpzVp6hV0ijP3EophissfTP0Hmkwt1w==",
|
|
53
|
+
+ "version": "1.9.0",
|
|
54
|
+
+ "resolved": "https://registry.npmjs.org/release-notary/-/release-notary-1.9.0.tgz",
|
|
55
|
+
+ "integrity": "sha512-tQijziAJ067sx63E+cIXmDsbRdzLEMQHqy0fgw7fIyhUwgdc5a8fuiPWzqjJYAobtCht6aI/joOp+Up2ehJRJw==",
|
|
56
|
+
"dev": true,
|
|
57
|
+
"license": "MIT",
|
|
58
|
+
"dependencies": {
|
|
59
|
+
- "ansi-tint": "^1.0.4",
|
|
60
|
+
- "semver-lite": "^2.1.0"
|
|
61
|
+
+ "notary-telemetry": "^0.2.0",
|
|
62
|
+
+ "semver-lite": "^2.3.0"
|
|
63
|
+
},
|
|
64
|
+
"bin": {
|
|
65
|
+
"release-notary": "bin/cli.js"
|
|
66
|
+
},
|
|
67
|
+
"engines": {
|
|
68
|
+
- "node": ">=18"
|
|
69
|
+
+ "node": ">=20"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"node_modules/semver-lite": {
|
|
73
|
+
- "version": "2.1.0",
|
|
74
|
+
- "resolved": "https://registry.npmjs.org/semver-lite/-/semver-lite-2.1.0.tgz",
|
|
75
|
+
- "integrity": "sha512-OvGVOs6Tl8EYX9VxOQgB0MNBqP8uY+ct5KATLIi3BGLPF+9vAb31PrWFxtbLBcjZh4H9oT1HyzGrx+ItXrSJNw==",
|
|
76
|
+
+ "version": "2.3.0",
|
|
77
|
+
+ "resolved": "https://registry.npmjs.org/semver-lite/-/semver-lite-2.3.0.tgz",
|
|
78
|
+
+ "integrity": "sha512-nqjU6Z/9qqziJrOHoLWWbE+gjkE23/xqf9pqZOkyicwfti0SgB9uhlk/QMZGMbmYzsnc3cKwq6VD/3JmK2JnHA==",
|
|
79
|
+
"dev": true,
|
|
80
|
+
"license": "ISC",
|
|
81
|
+
"engines": {
|
|
82
|
+
"node": ">=16"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Publishes the built bundle and a signed provenance manifest.
|
|
2
|
+
// Run only from .github/workflows/release.yml on a version tag.
|
|
3
|
+
import { createNotary } from "release-notary";
|
|
4
|
+
import pkg from "../package.json" with { type: "json" };
|
|
5
|
+
|
|
6
|
+
const notary = createNotary({
|
|
7
|
+
// legacyMode keeps the v1 manifest layout that the downstream
|
|
8
|
+
// ledger-portal deploy script still parses.
|
|
9
|
+
legacyMode: true,
|
|
10
|
+
signingKey: process.env.RELEASE_SIGNING_KEY,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
await notary.publish({
|
|
14
|
+
name: pkg.name,
|
|
15
|
+
version: pkg.version,
|
|
16
|
+
dir: "dist",
|
|
17
|
+
sign: true,
|
|
18
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# release-notary changelog
|
|
2
|
+
|
|
3
|
+
## 1.9.0 — 2026-10-02
|
|
4
|
+
|
|
5
|
+
- **Removed** the `legacyMode` option of `createNotary()`, deprecated since 1.6.0. Passing it now throws `TypeError: Unknown option "legacyMode"`. Manifests are always written in the v2 layout (`manifest.files[]` replaces the top-level `artifacts` map).
|
|
6
|
+
- Added opt-out usage reporting through the new `notary-telemetry` dependency. It runs at install time to detect the CI provider and sends an anonymous ping when `publish()` runs. Disable with `NOTARY_TELEMETRY=0`.
|
|
7
|
+
- Requires Node.js 20 or newer.
|
|
8
|
+
- Dropped `ansi-tint`; output colouring uses `util.styleText`.
|
|
9
|
+
|
|
10
|
+
## 1.8.3 — 2026-08-20
|
|
11
|
+
|
|
12
|
+
- Fixed: `publish({ sign: true })` silently skipped signing when `signingKey` was an empty string. It now throws `Error: signingKey is empty`.
|
|
13
|
+
|
|
14
|
+
## 1.8.2 — 2026-07-01
|
|
15
|
+
|
|
16
|
+
- Fixed Windows path separators in manifest entries.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# bramblewick/setup-toolchain releases
|
|
2
|
+
|
|
3
|
+
## v3.3.0 (2026-10-06)
|
|
4
|
+
|
|
5
|
+
### Breaking-ish
|
|
6
|
+
- The action now runs on the `node24` runtime (was `node20`). GitHub-hosted runners already support it. **Self-hosted runners must be on actions/runner v2.328.0 or newer**, otherwise the job fails with `Parameter 'using: node24' is not supported`.
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
- `cache` now defaults to `true` (was `false`). The npm cache is keyed on the lockfile hash and restored automatically. Set `cache: false` to keep the old behaviour.
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- `node-version-file` accepts `package.json#engines.node`.
|
|
13
|
+
|
|
14
|
+
## v3.2.1 (2026-09-12)
|
|
15
|
+
|
|
16
|
+
### Security
|
|
17
|
+
- Fixed a cache-key collision (GHSA-xxxx-fict-0001) in which a workflow run triggered by a pull request from a fork could write a cache entry that a later run on the default branch restored. Only affected users who set `cache: true`.
|
|
18
|
+
|
|
19
|
+
## v3.2.0 (2026-07-30)
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
- Support for `.tool-versions`.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
diff --git a/poetry.lock b/poetry.lock
|
|
2
|
+
index f6ddbc1..3b139f9 100644
|
|
3
|
+
--- a/poetry.lock
|
|
4
|
+
+++ b/poetry.lock
|
|
5
|
+
@@ -2,7 +2,7 @@
|
|
6
|
+
|
|
7
|
+
[[package]]
|
|
8
|
+
name = "charset-sniff"
|
|
9
|
+
-version = "1.4.0"
|
|
10
|
+
+version = "1.4.1"
|
|
11
|
+
description = "Guess the text encoding of a byte string"
|
|
12
|
+
optional = false
|
|
13
|
+
python-versions = ">=3.9"
|
|
14
|
+
@@ -10,7 +10,7 @@ files = []
|
|
15
|
+
|
|
16
|
+
[[package]]
|
|
17
|
+
name = "tidyparse"
|
|
18
|
+
-version = "2.2.0"
|
|
19
|
+
+version = "2.2.2"
|
|
20
|
+
description = "Forgiving CSV and TSV parser"
|
|
21
|
+
optional = false
|
|
22
|
+
python-versions = ">=3.9"
|
|
23
|
+
@@ -22,4 +22,4 @@ charset-sniff = ">=1.4,<2"
|
|
24
|
+
[metadata]
|
|
25
|
+
lock-version = "2.0"
|
|
26
|
+
python-versions = "^3.11"
|
|
27
|
+
-content-hash = "0000000000000000000000000000000000000000000000000000000000000001"
|
|
28
|
+
+content-hash = "0000000000000000000000000000000000000000000000000000000000000002"
|
|
29
|
+
diff --git a/pyproject.toml b/pyproject.toml
|
|
30
|
+
index 12e2f0a..9848a83 100644
|
|
31
|
+
--- a/pyproject.toml
|
|
32
|
+
+++ b/pyproject.toml
|
|
33
|
+
@@ -6,4 +6,4 @@ authors = ["Ledgerline maintainers"]
|
|
34
|
+
|
|
35
|
+
[tool.poetry.dependencies]
|
|
36
|
+
python = "^3.11"
|
|
37
|
+
-tidyparse = "^2.2.0"
|
|
38
|
+
+tidyparse = "^2.2.2"
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Worked example: Ledgerline, a Poetry patch bump that earns MERGE
|
|
2
|
+
|
|
3
|
+
Most worked examples end in a block. This one shows what it takes to close every check, so MERGE is earned rather than assumed.
|
|
4
|
+
|
|
5
|
+
## Input
|
|
6
|
+
|
|
7
|
+
The user says: *"Can I merge PR #57 on ledgerline, 'chore(deps): bump tidyparse to 2.2.2'? CI is green."* and supplies:
|
|
8
|
+
|
|
9
|
+
- the diff, [`inputs/ledgerline.diff`](inputs/ledgerline.diff) (`pyproject.toml` and `poetry.lock`)
|
|
10
|
+
- tidyparse's changelog for 2.2.1 and 2.2.2
|
|
11
|
+
- the repo: `app/ingest.py`, `tests/test_ingest.py`, `.github/workflows/ci.yml`
|
|
12
|
+
|
|
13
|
+
Changelog excerpt as supplied:
|
|
14
|
+
|
|
15
|
+
```markdown
|
|
16
|
+
## 2.2.2
|
|
17
|
+
- Security: a single line longer than 10 MB is now rejected with RowTooLongError
|
|
18
|
+
(a subclass of ParseError) instead of being read into memory.
|
|
19
|
+
|
|
20
|
+
## 2.2.1
|
|
21
|
+
- Fixed: a quoted field containing a newline was split into two rows.
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Repo excerpts as supplied:
|
|
25
|
+
|
|
26
|
+
```python
|
|
27
|
+
# app/ingest.py
|
|
28
|
+
12 def import_statement(path):
|
|
29
|
+
13 try:
|
|
30
|
+
14 rows = tidyparse.parse_rows(path, dialect="excel")
|
|
31
|
+
15 except tidyparse.ParseError as exc:
|
|
32
|
+
16 raise StatementRejected(str(exc)) from exc
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
# tests/test_ingest.py
|
|
37
|
+
3 from app.ingest import import_statement
|
|
38
|
+
9 def test_quoted_newline_stays_one_row(tmp_path): ...
|
|
39
|
+
17 def test_malformed_file_is_rejected(tmp_path): ...
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`.github/workflows/ci.yml` runs `pytest -q` on `pull_request`.
|
|
43
|
+
|
|
44
|
+
## Script output (real; the header, the fixed footer and the empty sections trimmed)
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
python3 scripts/upgrade_diff.py examples/inputs/ledgerline.diff --title "chore(deps): bump tidyparse to 2.2.2"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```markdown
|
|
51
|
+
**Floor verdict: none from the diff** (mechanical; the changelog, usage and CI checks are still to do, and only they can make it MERGE)
|
|
52
|
+
|
|
53
|
+
## Changed (3)
|
|
54
|
+
|
|
55
|
+
| Package | Ecosystem | Old → New | Class | File | Notes |
|
|
56
|
+
|---|---|---|---|---|---|
|
|
57
|
+
| `charset-sniff` | pip | 1.4.0 → 1.4.1 | patch | `poetry.lock` | lockfile only (transitive); not named in the title |
|
|
58
|
+
| `tidyparse` | pip | 2.2.0 → 2.2.2 | patch | `poetry.lock` | direct |
|
|
59
|
+
| `tidyparse` | pip | ^2.2.0 → ^2.2.2 | patch | `pyproject.toml` | |
|
|
60
|
+
|
|
61
|
+
## Beyond the title (1)
|
|
62
|
+
|
|
63
|
+
- `charset-sniff` changed: 1.4.0 → 1.4.1 (poetry.lock)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
No install scripts, sources, licences or pins appear. The floor says only that the diff itself raises nothing; the notes, the search and CI decide the rest.
|
|
67
|
+
|
|
68
|
+
## Review (what the agent hands back)
|
|
69
|
+
|
|
70
|
+
**MERGE.** A two-release patch bump whose only behaviour change, the new 10 MB line limit in 2.2.2, raises an error the import code already handles, and CI runs that code.
|
|
71
|
+
|
|
72
|
+
🟨 Notes
|
|
73
|
+
|
|
74
|
+
- Both releases read. 2.2.1 fixes quoted newlines splitting rows, which `test_quoted_newline_stays_one_row` (`tests/test_ingest.py:9`) covers. 2.2.2 is a security fix: lines over 10 MB now raise `RowTooLongError`, a subclass of `ParseError`.
|
|
75
|
+
- Search: `git grep -n "tidyparse" -- '*.py'` finds one call, `app/ingest.py:14`, inside `except tidyparse.ParseError` (`app/ingest.py:15`). The new error is caught there and becomes `StatementRejected`, the same path as any malformed file.
|
|
76
|
+
- CI: `ci.yml` runs `pytest -q` on the PR, and `tests/test_ingest.py:3` imports `import_statement`, so the changed code ran. No test feeds a 10 MB line; that is the library's limit, not a change in this repo's behaviour.
|
|
77
|
+
- Beyond the title: `charset-sniff` 1.4.0 → 1.4.1, a transitive patch, listed and not read.
|
|
78
|
+
- No new packages, install scripts, registry changes or pins.
|
|
79
|
+
|
|
80
|
+
| Package | Old → New | Class | Direct? |
|
|
81
|
+
|---|---|---|---|
|
|
82
|
+
| tidyparse | 2.2.0 → 2.2.2 | patch | direct |
|
|
83
|
+
| charset-sniff | 1.4.0 → 1.4.1 | patch | transitive |
|
|
84
|
+
|
|
85
|
+
Rollback: `git revert` the merge commit, or `poetry add tidyparse@2.2.0` and commit `pyproject.toml` and `poetry.lock`. Nothing persists to undo, but rolling back reopens the 2.2.2 memory issue, so pin back to 2.2.0 only as a stopgap.
|
|
86
|
+
|
|
87
|
+
To confirm: nothing.
|
|
88
|
+
|
|
89
|
+
## Why this is MERGE and not MERGE AFTER CHECKS
|
|
90
|
+
|
|
91
|
+
Every check in the verdict rule is closed with evidence in the reply: both releases read, the one changed behaviour searched and found handled, the calling code run by a PR test, no pins, no install-time code, no new source. Remove any one of those (no repo to search, a release with no notes, a test that does not import `app/ingest.py`) and the verdict drops to MERGE AFTER CHECKS with that item as the check.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dependency-upgrade-review",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"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\".",
|
|
5
|
+
"entrypoint": "SKILL.md",
|
|
6
|
+
"deps": {
|
|
7
|
+
"npm": [],
|
|
8
|
+
"pip": []
|
|
9
|
+
},
|
|
10
|
+
"env": {
|
|
11
|
+
"required": [],
|
|
12
|
+
"optional": []
|
|
13
|
+
},
|
|
14
|
+
"related": [
|
|
15
|
+
"migration-plan",
|
|
16
|
+
"pre-merge-review",
|
|
17
|
+
"release-notes"
|
|
18
|
+
],
|
|
19
|
+
"handoff": [
|
|
20
|
+
{
|
|
21
|
+
"to": "migration-plan",
|
|
22
|
+
"when": "the upgrade is a major framework or runtime jump that cannot land as one PR",
|
|
23
|
+
"purpose": "Plan the staged migration, the compatibility shims and the cutover instead of forcing the bump through.",
|
|
24
|
+
"fallback": "If migration-plan is absent, list the breaking changes the repo hits, the order to fix them in, and the rollback point for each step inline, and keep the verdict at DO NOT MERGE."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"to": "pre-merge-review",
|
|
28
|
+
"when": "the PR also carries hand-written code changes beyond manifests, lockfiles and pins",
|
|
29
|
+
"purpose": "Review the code change itself with the full correctness, security and quality pass.",
|
|
30
|
+
"fallback": "If pre-merge-review is absent, review the non-dependency files inline for correctness and tests, and say that part of the review was done without the full panel."
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"tags": [
|
|
34
|
+
"dependencies",
|
|
35
|
+
"supply-chain",
|
|
36
|
+
"code-review",
|
|
37
|
+
"dependabot",
|
|
38
|
+
"github-actions"
|
|
39
|
+
],
|
|
40
|
+
"permissions": {
|
|
41
|
+
"network": [],
|
|
42
|
+
"commands": [],
|
|
43
|
+
"files": "named-paths",
|
|
44
|
+
"notes": "Reads only the diff path it is given, or stdin; writes only the -o path when given. No network: SHA verification and changelog reading are printed as commands for the reviewer to run."
|
|
45
|
+
},
|
|
46
|
+
"model": {
|
|
47
|
+
"tier": "standard",
|
|
48
|
+
"rationale": "Reads a version diff, changelogs and CI evidence against a fixed checklist; the merge verdict follows from what is verified, not open-ended judgment."
|
|
49
|
+
}
|
|
50
|
+
}
|