skilldrop-cli 0.16.30 → 0.16.32
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 +133 -18
- package/catalogue.json +4 -2
- package/contracts/skill.schema.json +3 -3
- package/model-routing.json +8 -0
- package/package.json +1 -1
- package/packs/converters/skills/mermaid-render/manifest.json +11 -1
- package/packs/dev-team/loops/release/LOOP.md +7 -5
- package/packs/dev-team/loops/release/loop.json +2 -2
- package/packs/dev-team/skills/codebase-tour/evals/files/3/.github/workflows/ci.yml +2 -2
- package/packs/dev-team/skills/codebase-tour/evals/files/3/go.mod +2 -2
- package/packs/dev-team/skills/dependency-upgrade-review/SKILL.md +52 -34
- package/packs/dev-team/skills/dependency-upgrade-review/evals/evals.json +33 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/.github/workflows/ci.yml +39 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/.github/workflows/integration.yml +20 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/PR.md +39 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/go.mod +17 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/internal/notify/client.go +35 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/internal/payments/client.go +66 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/internal/payments/client_integration_test.go +38 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/internal/payments/client_test.go +53 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/internal/payments/settle.go +30 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/pr.diff +42 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/vendor-notes/httpkit-CHANGELOG.md +43 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/.github/workflows/ci.yml +67 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/.lintwright.json +7 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/.nvmrc +1 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/PR.md +110 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/package.json +25 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/pr.diff +146 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/src/due-date.ts +16 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/src/totals.ts +11 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/tests/due-date.test.ts +17 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/tests/totals.test.ts +12 -0
- package/packs/dev-team/skills/dependency-upgrade-review/examples/ledgerline-tidyparse.md +23 -14
- package/packs/dev-team/skills/dependency-upgrade-review/manifest.json +17 -5
- package/packs/dev-team/skills/dependency-upgrade-review/reference.md +36 -1
- package/packs/dev-team/skills/dependency-upgrade-review/scripts/upgrade_diff.py +22 -4
- package/packs/dev-team/skills/refactor-plan/SKILL.md +168 -0
- package/packs/dev-team/skills/refactor-plan/evals/eval_queries.json +46 -0
- package/packs/dev-team/skills/refactor-plan/evals/evals.json +106 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/1/debt-register-row.md +5 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/1/in-flight-prs.md +7 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/1/order_service.py +74 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/1/test-coverage.txt +14 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/3/imports.txt +22 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/3/register.md +3 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/4/docs/open-prs.md +6 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/4/docs/tech-debt-register.md +7 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/4/reports/monthly_revenue.py +44 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/4/src/billing/invoice.py +233 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/4/src/partners/statement.py +29 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/4/tests/billing/test_payments.py +13 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/5/ci-notes.md +5 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/5/open-prs.txt +4 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/5/scripts/nightly-digest.js +36 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/5/src/auth/passwordReset.ts +16 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/5/src/notify/index.ts +2 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/5/src/notify/legacyMailer.ts +149 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/5/src/orders/onOrderShipped.ts +15 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/5/tests/notify/legacyMailer.test.ts +7 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/6/billing-service/src/main/kotlin/billing/DunningJob.kt +29 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/6/billing-service/src/main/kotlin/billing/InvoiceService.kt +157 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/6/billing-service/src/main/kotlin/billing/pdf/InvoicePdfRenderer.kt +36 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/6/billing-service/src/test/kotlin/billing/InvoiceServiceTest.kt +40 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/6/docs/adr-007-persistence.md +26 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/6/docs/open-prs.md +9 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/7/notes/open-work.md +19 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/7/web/src/components/CheckoutPanel.tsx +207 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/7/web/src/components/MiniCart.tsx +33 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/7/web/src/components/__tests__/CheckoutPanel.test.tsx +13 -0
- package/packs/dev-team/skills/refactor-plan/evals/files/7/web/src/pages/OrderReview.tsx +24 -0
- package/packs/dev-team/skills/refactor-plan/examples/search-ranker.md +104 -0
- package/packs/dev-team/skills/refactor-plan/manifest.json +36 -0
- package/packs/dev-team/skills/refactor-plan/reference.md +149 -0
- package/packs/dev-team/skills/refactor-plan/templates/refactor-plan.md +82 -0
- package/packs/dev-team/skills/rollout-plan/SKILL.md +157 -0
- package/packs/dev-team/skills/rollout-plan/evals/eval_queries.json +12 -0
- package/packs/dev-team/skills/rollout-plan/evals/evals.json +109 -0
- package/packs/dev-team/skills/rollout-plan/evals/files/2/metrics-snapshot.txt +11 -0
- package/packs/dev-team/skills/rollout-plan/evals/files/2/pr-description.md +28 -0
- package/packs/dev-team/skills/rollout-plan/evals/files/4/PR_DESCRIPTION.md +24 -0
- package/packs/dev-team/skills/rollout-plan/evals/files/4/metrics_snapshot.txt +7 -0
- package/packs/dev-team/skills/rollout-plan/evals/files/5/docs/tax-engine-v2.md +24 -0
- package/packs/dev-team/skills/rollout-plan/evals/files/6/flags/smart_reminders_v2.yaml +14 -0
- package/packs/dev-team/skills/rollout-plan/evals/files/6/notes/push-pipeline.md +10 -0
- package/packs/dev-team/skills/rollout-plan/evals/files/7/docs/ratelimiter-v2.md +21 -0
- package/packs/dev-team/skills/rollout-plan/evals/files/7/ops/traffic-summary.txt +9 -0
- package/packs/dev-team/skills/rollout-plan/examples/sync-engine-workspaces.md +102 -0
- package/packs/dev-team/skills/rollout-plan/manifest.json +35 -0
- package/packs/dev-team/skills/rollout-plan/reference.md +100 -0
- package/packs/dev-team/skills/rollout-plan/scripts/canary_math.py +261 -0
- package/packs/dev-team/skills/rollout-plan/templates/rollout-plan.md +50 -0
- package/packs/dev-team/skills/sonar-review/manifest.json +12 -0
- package/packs/infra-as-code/skills/terraform-module/manifest.json +11 -0
- package/packs/infra-as-code/skills/terraform-plan-review/manifest.json +8 -1
- package/packs/solution-architect/skills/figma-diagrams/manifest.json +12 -1
|
@@ -12,6 +12,7 @@
|
|
|
12
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
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
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
|
+
"Opens with the verdict and the decisive reasons (the removed renderInline() call and the sanitize default) in plain words before any list, keeps the lockfile changes to a line or a short list rather than a table, and does not describe the session's network or tool access",
|
|
15
16
|
"Does not invent versions, advisory IDs, APIs, files or tests that are not in the supplied input"
|
|
16
17
|
]
|
|
17
18
|
},
|
|
@@ -26,6 +27,7 @@
|
|
|
26
27
|
"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
28
|
"Classes the jumps: checkout-lite v3.1.0 to v3.2.0 as minor, pypi-publish v2 to v3 as major",
|
|
28
29
|
"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",
|
|
30
|
+
"Does not report either SHA or the tag move as verified, and does not explain the gap by describing the session's network or tool access; it gives the command and the SHA it must equal instead",
|
|
29
31
|
"Does not invent action versions, SHAs, inputs or workflow steps that are not in the supplied files"
|
|
30
32
|
]
|
|
31
33
|
},
|
|
@@ -40,6 +42,7 @@
|
|
|
40
42
|
"Flags github.com/lanternhq/clock v1.2.0 as a new indirect module the PR title does not mention",
|
|
41
43
|
"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
44
|
"Gives a rollback command such as go get github.com/lanternhq/ratelimit@v0.8.3 followed by go mod tidy, or reverting the PR",
|
|
45
|
+
"Stays short, as the user asked for a quick verdict: the verdict and its reasons come first, and there is no package table and no empty section",
|
|
43
46
|
"Does not invent file names, call sites, tests or release versions that are not in the prompt"
|
|
44
47
|
]
|
|
45
48
|
},
|
|
@@ -72,6 +75,36 @@
|
|
|
72
75
|
"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
76
|
"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
77
|
]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": 6,
|
|
81
|
+
"held_out": "2026-10-20",
|
|
82
|
+
"prompt": "Dependabot opened PR #412 on our payments-gateway service bumping github.com/fernwire/httpkit from 1.8.1 to 1.8.4. It's only a patch bump and every check is green, so I'd like to merge it before the release cut this afternoon. Can I merge this dependency upgrade? The PR body is in PR.md, the diff is pr.diff, and I pasted the upstream changelog into vendor-notes/httpkit-CHANGELOG.md. The repo source is checked out here.",
|
|
83
|
+
"assertions": [
|
|
84
|
+
"Picks out the v1.8.3 entry in vendor-notes/httpkit-CHANGELOG.md (a version the Dependabot release notes in PR.md leave out): NewClient no longer applies a default 30-second Timeout, and the zero value now means no client-level timeout. It treats this as the key finding even though the bump looks like a patch.",
|
|
85
|
+
"Points to internal/payments/client.go NewClient, which calls httpkit.NewClient with only WithBaseURL and WithRetries and whose comment says it relies on the 30s default (INC-2291), and to internal/payments/settle.go, which calls Charge with context.Background() and no deadline. So after the upgrade a hung gateway can block the settlement batch indefinitely. It also notes that internal/notify/client.go sets WithTimeout(5*time.Second) explicitly and is unaffected.",
|
|
86
|
+
"Explains that the green CI does not test this change: client_test.go injects fakeDoer, so the real httpkit client is never exercised, and ci.yml runs `go test -race -short ./...` without `-tags integration`, so client_integration_test.go (TestChargeHungGatewayTimesOut) did not run on this PR. It runs only nightly or on manual dispatch via integration.yml.",
|
|
87
|
+
"Gives a verdict of DO NOT MERGE as-is, or MERGE AFTER CHECKS on the specific condition that payments NewClient gains an explicit httpkit.WithTimeout(30*time.Second) (or a per-call context deadline in SettleBatch) and the integration test passes. It is never plain MERGE.",
|
|
88
|
+
"Lists the go.mod/go.sum changes the PR title does not mention: indirect github.com/fernwire/backoff v0.3.0 -> v0.4.0 and a newly added indirect github.com/fernwire/otelshim v0.1.0. It ties them to the v1.8.2 (backoff, full-jitter) and v1.8.4 (WithTracer) changelog entries rather than calling them unexplained.",
|
|
89
|
+
"Gives a concrete rollback: revert the merge commit, or `go get github.com/fernwire/httpkit@v1.8.1 && go mod tidy`, which also returns backoff to v0.3.0 and drops otelshim. It notes that adding the explicit WithTimeout is safe to keep on either version.",
|
|
90
|
+
"Does not claim to have run tests or verified the go.sum hashes or upstream tags. It gives the network or execution steps as commands to run (for example `go mod verify`, `go test -tags integration -run TestChargeHungGatewayTimesOut ./internal/payments/`, or triggering integration.yml via workflow_dispatch).",
|
|
91
|
+
"Invents no httpkit versions, options or behaviours beyond those in the files (for example no made-up v1.8.5, no claimed retry-on-POST change, no options other than WithBaseURL, WithRetries, WithTimeout and WithTracer)."
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": 7,
|
|
96
|
+
"held_out": "2026-10-20",
|
|
97
|
+
"prompt": "Renovate grouped this week's dev dependency updates into PR #88 for our invoice-widgets package: five npm packages in one go (details in PR.md, diff in pr.diff). After last quarter's incident with a grouped bump I'm nervous about these. Is this Renovate bump safe to merge, or should I split it up? Repo files are here.",
|
|
98
|
+
"assertions": [
|
|
99
|
+
"Ends with a verdict of MERGE. It does not downgrade to MERGE AFTER CHECKS or DO NOT MERGE over problems the files do not contain (for example an install script, a registry change, a maintainer change, or a breaking change that affects this repo), and it does not insist on splitting the PR without a concrete reason from the files.",
|
|
100
|
+
"Checks bundlecrate 6.1.0's new Node >=18.18 minimum against the repo and finds it harmless: .nvmrc is 20.11.1, package.json engines is node >=20, and ci.yml uses node-version-file: .nvmrc.",
|
|
101
|
+
"Checks the repo's uses of the changed APIs and finds nothing that needs action. vellum-test 2.8.0 deprecates vt.legacyTimers(), but tests/due-date.test.ts uses only vt.fakeTimers/vt.restoreTimers. lintwright 4.3.0's new no-floating-promise rule is only in lintwright:strict, while .lintwright.json extends lintwright:recommended.",
|
|
102
|
+
"Lists the lockfile changes beyond the five headline bumps: @bundlecrate/resolver-core 1.0.0 added, bundlecrate-legacy-resolver 2.3.4 removed, and the transitive picolabel 0.9.1 -> 0.9.2. It ties each to a changelog entry (bundlecrate 6.1.0 resolver extraction, lintwright 4.3.0 picolabel update).",
|
|
103
|
+
"States that no lockfile entry in pr.diff has \"hasInstallScript\" and that every resolved URL is on https://registry.npmjs.org/, which matches .npmrc. So there are no new install-time scripts and no registry switch.",
|
|
104
|
+
"Says CI did exercise the changed code, mapping the packages to jobs in .github/workflows/ci.yml: lintwright -> lint, prettyquill -> format, tsforge-types -> typecheck, vellum-test -> test, bundlecrate -> build-and-smoke (which runs test:dist against the built bundle). It says the pass/fail status comes from PR.md and was not observed directly.",
|
|
105
|
+
"Gives a rollback: revert the merge commit (restoring package.json and package-lock.json together) and run `npm ci`. It notes these are all devDependencies, so only the bundlecrate-built dist/ could reach users, and that build is covered by the smoke step.",
|
|
106
|
+
"Does not claim to have verified integrity hashes, provenance or upstream tags offline. It invents no versions, rules or APIs not in the files, and frames anything network-dependent (for example `npm audit signatures`, `npm ci` locally) as an optional command, not a blocker."
|
|
107
|
+
]
|
|
75
108
|
}
|
|
76
109
|
]
|
|
77
110
|
}
|
package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/.github/workflows/ci.yml
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
lint:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@3d1f0a9c7e5b2846f0c1a7d9e3b5f8c2a6d4e017 # v4.2.2
|
|
16
|
+
- uses: actions/setup-go@8e2c4a6f0b1d3957a2c8e4f6b0d1a3c5e7f9b204 # v5.1.0
|
|
17
|
+
with:
|
|
18
|
+
go-version: "1.23"
|
|
19
|
+
- run: go vet ./...
|
|
20
|
+
|
|
21
|
+
test:
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@3d1f0a9c7e5b2846f0c1a7d9e3b5f8c2a6d4e017 # v4.2.2
|
|
25
|
+
- uses: actions/setup-go@8e2c4a6f0b1d3957a2c8e4f6b0d1a3c5e7f9b204 # v5.1.0
|
|
26
|
+
with:
|
|
27
|
+
go-version: "1.23"
|
|
28
|
+
# Unit tests only. Integration tests (-tags integration) run nightly in
|
|
29
|
+
# integration.yml because they need a long timeout.
|
|
30
|
+
- run: go test -race -short ./...
|
|
31
|
+
|
|
32
|
+
build:
|
|
33
|
+
runs-on: ubuntu-latest
|
|
34
|
+
steps:
|
|
35
|
+
- uses: actions/checkout@3d1f0a9c7e5b2846f0c1a7d9e3b5f8c2a6d4e017 # v4.2.2
|
|
36
|
+
- uses: actions/setup-go@8e2c4a6f0b1d3957a2c8e4f6b0d1a3c5e7f9b204 # v5.1.0
|
|
37
|
+
with:
|
|
38
|
+
go-version: "1.23"
|
|
39
|
+
- run: go build ./...
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
name: integration
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "30 2 * * *"
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
integration:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 20
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@3d1f0a9c7e5b2846f0c1a7d9e3b5f8c2a6d4e017 # v4.2.2
|
|
17
|
+
- uses: actions/setup-go@8e2c4a6f0b1d3957a2c8e4f6b0d1a3c5e7f9b204 # v5.1.0
|
|
18
|
+
with:
|
|
19
|
+
go-version: "1.23"
|
|
20
|
+
- run: go test -tags integration -timeout 10m ./...
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Bump github.com/fernwire/httpkit from 1.8.1 to 1.8.4 #412
|
|
2
|
+
|
|
3
|
+
**dependabot** wants to merge 1 commit into `main` from `dependabot/go_modules/github.com/fernwire/httpkit-1.8.4`
|
|
4
|
+
|
|
5
|
+
Bumps [github.com/fernwire/httpkit](https://github.com/fernwire/httpkit) from 1.8.1 to 1.8.4.
|
|
6
|
+
|
|
7
|
+
<details>
|
|
8
|
+
<summary>Release notes</summary>
|
|
9
|
+
<p><em>Sourced from <a href="https://github.com/fernwire/httpkit/releases">github.com/fernwire/httpkit's releases</a>.</em></p>
|
|
10
|
+
<blockquote>
|
|
11
|
+
<h2>v1.8.4</h2>
|
|
12
|
+
<ul>
|
|
13
|
+
<li>Add optional OpenTelemetry hooks via <code>WithTracer</code> (backed by the new <code>fernwire/otelshim</code> module). No behaviour change unless the option is passed.</li>
|
|
14
|
+
<li>Fix a data race in connection-pool metrics (#240).</li>
|
|
15
|
+
</ul>
|
|
16
|
+
</blockquote>
|
|
17
|
+
</details>
|
|
18
|
+
<details>
|
|
19
|
+
<summary>Commits</summary>
|
|
20
|
+
<ul>
|
|
21
|
+
<li><code>9c1e4b7</code> release v1.8.4</li>
|
|
22
|
+
<li><code>3fa02d1</code> pool: fix metrics race (#240)</li>
|
|
23
|
+
<li><code>b81d6e0</code> add WithTracer option (#238)</li>
|
|
24
|
+
<li>Additional commits viewable in <a href="https://github.com/fernwire/httpkit/compare/v1.8.1...v1.8.4">compare view</a></li>
|
|
25
|
+
</ul>
|
|
26
|
+
</details>
|
|
27
|
+
<br />
|
|
28
|
+
|
|
29
|
+
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
### Checks
|
|
34
|
+
|
|
35
|
+
- ci / lint — passed (41s)
|
|
36
|
+
- ci / test — passed (1m 52s)
|
|
37
|
+
- ci / build — passed (38s)
|
|
38
|
+
|
|
39
|
+
All checks have passed.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module example.internal/payments-gateway
|
|
2
|
+
|
|
3
|
+
go 1.23
|
|
4
|
+
|
|
5
|
+
require (
|
|
6
|
+
github.com/fernwire/httpkit v1.8.4
|
|
7
|
+
github.com/quillstack/zlogx v0.11.2
|
|
8
|
+
github.com/stretchr/testify v1.9.0
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
require (
|
|
12
|
+
github.com/davecgh/go-spew v1.1.1 // indirect
|
|
13
|
+
github.com/fernwire/backoff v0.4.0 // indirect
|
|
14
|
+
github.com/fernwire/otelshim v0.1.0 // indirect
|
|
15
|
+
github.com/pmezard/go-difflib v1.0.0 // indirect
|
|
16
|
+
gopkg.in/yaml.v3 v3.0.1 // indirect
|
|
17
|
+
)
|
package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/internal/notify/client.go
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Package notify sends merchant webhooks.
|
|
2
|
+
package notify
|
|
3
|
+
|
|
4
|
+
import (
|
|
5
|
+
"bytes"
|
|
6
|
+
"context"
|
|
7
|
+
"net/http"
|
|
8
|
+
"time"
|
|
9
|
+
|
|
10
|
+
"github.com/fernwire/httpkit"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
type Sender struct {
|
|
14
|
+
hc *httpkit.Client
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
func NewSender() *Sender {
|
|
18
|
+
return &Sender{hc: httpkit.NewClient(
|
|
19
|
+
httpkit.WithTimeout(5*time.Second),
|
|
20
|
+
httpkit.WithRetries(3),
|
|
21
|
+
)}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
func (s *Sender) Send(ctx context.Context, url string, payload []byte) error {
|
|
25
|
+
req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(payload))
|
|
26
|
+
if err != nil {
|
|
27
|
+
return err
|
|
28
|
+
}
|
|
29
|
+
req.Header.Set("Content-Type", "application/json")
|
|
30
|
+
resp, err := s.hc.Do(ctx, req)
|
|
31
|
+
if err != nil {
|
|
32
|
+
return err
|
|
33
|
+
}
|
|
34
|
+
return resp.Body.Close()
|
|
35
|
+
}
|
package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/internal/payments/client.go
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Package payments talks to the upstream card-processing gateway.
|
|
2
|
+
package payments
|
|
3
|
+
|
|
4
|
+
import (
|
|
5
|
+
"context"
|
|
6
|
+
"encoding/json"
|
|
7
|
+
"fmt"
|
|
8
|
+
"net/http"
|
|
9
|
+
"strings"
|
|
10
|
+
|
|
11
|
+
"github.com/fernwire/httpkit"
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
// doer is the subset of *httpkit.Client we use. Tests substitute a fake.
|
|
15
|
+
type doer interface {
|
|
16
|
+
Do(ctx context.Context, req *http.Request) (*http.Response, error)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Client calls the gateway's /v2/charges API.
|
|
20
|
+
type Client struct {
|
|
21
|
+
http doer
|
|
22
|
+
baseURL string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// NewClient builds a gateway client.
|
|
26
|
+
//
|
|
27
|
+
// We deliberately do not set a timeout here: httpkit's default 30s client
|
|
28
|
+
// timeout is what protects the settlement worker from a hung gateway
|
|
29
|
+
// connection (see INC-2291).
|
|
30
|
+
func NewClient(baseURL string) *Client {
|
|
31
|
+
hc := httpkit.NewClient(
|
|
32
|
+
httpkit.WithBaseURL(baseURL),
|
|
33
|
+
httpkit.WithRetries(2),
|
|
34
|
+
)
|
|
35
|
+
return &Client{http: hc, baseURL: baseURL}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
type ChargeResult struct {
|
|
39
|
+
ID string `json:"id"`
|
|
40
|
+
Status string `json:"status"`
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Charge submits a capture for a previously authorised payment.
|
|
44
|
+
func (c *Client) Charge(ctx context.Context, authID string, amountMinor int64, idemKey string) (*ChargeResult, error) {
|
|
45
|
+
body := fmt.Sprintf(`{"authorization":%q,"amount":%d}`, authID, amountMinor)
|
|
46
|
+
req, err := http.NewRequest(http.MethodPost, c.baseURL+"/v2/charges", strings.NewReader(body))
|
|
47
|
+
if err != nil {
|
|
48
|
+
return nil, err
|
|
49
|
+
}
|
|
50
|
+
req.Header.Set("Content-Type", "application/json")
|
|
51
|
+
req.Header.Set("Idempotency-Key", idemKey)
|
|
52
|
+
|
|
53
|
+
resp, err := c.http.Do(ctx, req)
|
|
54
|
+
if err != nil {
|
|
55
|
+
return nil, fmt.Errorf("gateway charge: %w", err)
|
|
56
|
+
}
|
|
57
|
+
defer resp.Body.Close()
|
|
58
|
+
if resp.StatusCode >= 300 {
|
|
59
|
+
return nil, fmt.Errorf("gateway charge: status %d", resp.StatusCode)
|
|
60
|
+
}
|
|
61
|
+
var out ChargeResult
|
|
62
|
+
if err := json.NewDecoder(resp.Body).Decode(&out); err != nil {
|
|
63
|
+
return nil, fmt.Errorf("gateway charge: decode: %w", err)
|
|
64
|
+
}
|
|
65
|
+
return &out, nil
|
|
66
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//go:build integration
|
|
2
|
+
|
|
3
|
+
package payments
|
|
4
|
+
|
|
5
|
+
import (
|
|
6
|
+
"context"
|
|
7
|
+
"net/http"
|
|
8
|
+
"net/http/httptest"
|
|
9
|
+
"testing"
|
|
10
|
+
"time"
|
|
11
|
+
|
|
12
|
+
"github.com/stretchr/testify/require"
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
// TestChargeHungGatewayTimesOut guards INC-2291: a gateway that accepts the
|
|
16
|
+
// connection and never responds must not block the settlement worker forever.
|
|
17
|
+
func TestChargeHungGatewayTimesOut(t *testing.T) {
|
|
18
|
+
block := make(chan struct{})
|
|
19
|
+
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
20
|
+
<-block
|
|
21
|
+
}))
|
|
22
|
+
defer srv.Close()
|
|
23
|
+
defer close(block)
|
|
24
|
+
|
|
25
|
+
c := NewClient(srv.URL)
|
|
26
|
+
done := make(chan error, 1)
|
|
27
|
+
go func() {
|
|
28
|
+
_, err := c.Charge(context.Background(), "auth_1", 100, "idem-hang")
|
|
29
|
+
done <- err
|
|
30
|
+
}()
|
|
31
|
+
|
|
32
|
+
select {
|
|
33
|
+
case err := <-done:
|
|
34
|
+
require.Error(t, err)
|
|
35
|
+
case <-time.After(2 * time.Minute):
|
|
36
|
+
t.Fatal("Charge did not time out against a hung gateway")
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
package payments
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
"errors"
|
|
6
|
+
"io"
|
|
7
|
+
"net/http"
|
|
8
|
+
"strings"
|
|
9
|
+
"testing"
|
|
10
|
+
|
|
11
|
+
"github.com/stretchr/testify/require"
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
type fakeDoer struct {
|
|
15
|
+
status int
|
|
16
|
+
body string
|
|
17
|
+
err error
|
|
18
|
+
got *http.Request
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
func (f *fakeDoer) Do(_ context.Context, req *http.Request) (*http.Response, error) {
|
|
22
|
+
f.got = req
|
|
23
|
+
if f.err != nil {
|
|
24
|
+
return nil, f.err
|
|
25
|
+
}
|
|
26
|
+
return &http.Response{
|
|
27
|
+
StatusCode: f.status,
|
|
28
|
+
Body: io.NopCloser(strings.NewReader(f.body)),
|
|
29
|
+
}, nil
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
func TestChargeOK(t *testing.T) {
|
|
33
|
+
fd := &fakeDoer{status: 201, body: `{"id":"ch_1","status":"captured"}`}
|
|
34
|
+
c := &Client{http: fd, baseURL: "https://gw.test"}
|
|
35
|
+
res, err := c.Charge(context.Background(), "auth_1", 1250, "idem-1")
|
|
36
|
+
require.NoError(t, err)
|
|
37
|
+
require.Equal(t, "ch_1", res.ID)
|
|
38
|
+
require.Equal(t, "idem-1", fd.got.Header.Get("Idempotency-Key"))
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
func TestChargeGatewayError(t *testing.T) {
|
|
42
|
+
fd := &fakeDoer{err: errors.New("boom")}
|
|
43
|
+
c := &Client{http: fd, baseURL: "https://gw.test"}
|
|
44
|
+
_, err := c.Charge(context.Background(), "auth_1", 1250, "idem-1")
|
|
45
|
+
require.Error(t, err)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func TestChargeNon2xx(t *testing.T) {
|
|
49
|
+
fd := &fakeDoer{status: 502, body: ``}
|
|
50
|
+
c := &Client{http: fd, baseURL: "https://gw.test"}
|
|
51
|
+
_, err := c.Charge(context.Background(), "auth_1", 1250, "idem-1")
|
|
52
|
+
require.ErrorContains(t, err, "status 502")
|
|
53
|
+
}
|
package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/internal/payments/settle.go
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
package payments
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
|
|
6
|
+
"github.com/quillstack/zlogx"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
// Pending is a capture waiting to be settled.
|
|
10
|
+
type Pending struct {
|
|
11
|
+
AuthID string
|
|
12
|
+
AmountMinor int64
|
|
13
|
+
IdemKey string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// SettleBatch is run by the nightly settlement worker. It processes captures
|
|
17
|
+
// one at a time, in order; a single stuck call blocks the rest of the batch.
|
|
18
|
+
func SettleBatch(c *Client, batch []Pending, log *zlogx.Logger) (settled int) {
|
|
19
|
+
for _, p := range batch {
|
|
20
|
+
// No per-call deadline: we rely on the client's own timeout.
|
|
21
|
+
res, err := c.Charge(context.Background(), p.AuthID, p.AmountMinor, p.IdemKey)
|
|
22
|
+
if err != nil {
|
|
23
|
+
log.Warn("settle failed", "auth", p.AuthID, "err", err)
|
|
24
|
+
continue
|
|
25
|
+
}
|
|
26
|
+
log.Info("settled", "auth", p.AuthID, "charge", res.ID)
|
|
27
|
+
settled++
|
|
28
|
+
}
|
|
29
|
+
return settled
|
|
30
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
diff --git a/go.mod b/go.mod
|
|
2
|
+
index 4be19a2..d07c3e1 100644
|
|
3
|
+
--- a/go.mod
|
|
4
|
+
+++ b/go.mod
|
|
5
|
+
@@ -3,14 +3,15 @@ module example.internal/payments-gateway
|
|
6
|
+
go 1.23
|
|
7
|
+
|
|
8
|
+
require (
|
|
9
|
+
- github.com/fernwire/httpkit v1.8.1
|
|
10
|
+
+ github.com/fernwire/httpkit v1.8.4
|
|
11
|
+
github.com/quillstack/zlogx v0.11.2
|
|
12
|
+
github.com/stretchr/testify v1.9.0
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
require (
|
|
16
|
+
github.com/davecgh/go-spew v1.1.1 // indirect
|
|
17
|
+
- github.com/fernwire/backoff v0.3.0 // indirect
|
|
18
|
+
+ github.com/fernwire/backoff v0.4.0 // indirect
|
|
19
|
+
+ github.com/fernwire/otelshim v0.1.0 // indirect
|
|
20
|
+
github.com/pmezard/go-difflib v1.0.0 // indirect
|
|
21
|
+
gopkg.in/yaml.v3 v3.0.1 // indirect
|
|
22
|
+
)
|
|
23
|
+
diff --git a/go.sum b/go.sum
|
|
24
|
+
index 7a10c3f..e41b9d8 100644
|
|
25
|
+
--- a/go.sum
|
|
26
|
+
+++ b/go.sum
|
|
27
|
+
@@ -1,10 +1,12 @@
|
|
28
|
+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
|
29
|
+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
30
|
+
-github.com/fernwire/backoff v0.3.0 h1:Qm3kT0n1Zr8vYx2LdP4eWc7sHf9aJbN6uE5tGiKoR1s=
|
|
31
|
+
-github.com/fernwire/backoff v0.3.0/go.mod h1:Hc2pW8yTn5sLq0FvB3xJdM7eKa4rZu9gYiN1oPtE6Xw=
|
|
32
|
+
-github.com/fernwire/httpkit v1.8.1 h1:Tz4xR9cWm1bPq7Ls2nVe8KdJ3hYf0aGu6oNiE5rBtXk=
|
|
33
|
+
-github.com/fernwire/httpkit v1.8.1/go.mod h1:Lw6pD2sNx9bRe4Ty1qZa7HmKc3jUf8vGo0iEnB5tYsQ=
|
|
34
|
+
+github.com/fernwire/backoff v0.4.0 h1:Bv7nQ2xKp4cLz9Ws1mTe6RdH0yJa3fGu8oNiE5rCtWk=
|
|
35
|
+
+github.com/fernwire/backoff v0.4.0/go.mod h1:Hc2pW8yTn5sLq0FvB3xJdM7eKa4rZu9gYiN1oPtE6Xw=
|
|
36
|
+
+github.com/fernwire/httpkit v1.8.4 h1:Kp9sT3vWn2cRq6Lx1mBe7JdH4yGf0aZu5oNiE8rAtYk=
|
|
37
|
+
+github.com/fernwire/httpkit v1.8.4/go.mod h1:Rm3dF8sNx1bWe6Ty2qZa9HkKc4jUf7vGo0iEnB5tXsP=
|
|
38
|
+
+github.com/fernwire/otelshim v0.1.0 h1:Wd2mR7xKq5cLp8Vs3nTe1RfH6yJb0aGu4oNiE9rDtUk=
|
|
39
|
+
+github.com/fernwire/otelshim v0.1.0/go.mod h1:Ty5nB3sMx7bQe2Rw8qZa4HjKc1jUf6vGo9iEnC0tWsL=
|
|
40
|
+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
41
|
+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
|
42
|
+
github.com/quillstack/zlogx v0.11.2 h1:Jn8cV4xTq1bLm7Rs2pWe5KdF3hYg0aHu9oNiE6rBtZk=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Changelog — github.com/fernwire/httpkit
|
|
2
|
+
|
|
3
|
+
Excerpt copied from the upstream repository's CHANGELOG.md at tag v1.8.4.
|
|
4
|
+
|
|
5
|
+
## v1.8.4 — 2026-10-02
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- `WithTracer(t otelshim.Tracer)` option for OpenTelemetry spans. Pulls in
|
|
9
|
+
`github.com/fernwire/otelshim` as a dependency. No behaviour change unless
|
|
10
|
+
the option is passed. (#238)
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- Data race in connection-pool metrics when `Stats()` is called concurrently
|
|
14
|
+
with in-flight requests. (#240)
|
|
15
|
+
|
|
16
|
+
## v1.8.3 — 2026-09-18
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- `NewClient` no longer applies a default 30-second `Timeout`. The zero value
|
|
20
|
+
now means **no client-level timeout**, matching `net/http.Client`. Callers
|
|
21
|
+
that relied on the old default should pass `WithTimeout(30 * time.Second)`
|
|
22
|
+
explicitly. Deadlines carried by the request `context.Context` are still
|
|
23
|
+
honoured. (#231)
|
|
24
|
+
|
|
25
|
+
We are shipping this in a patch release because the old default silently
|
|
26
|
+
cut off long-polling and streaming callers, which we consider a bug.
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
- `Response.Body` is now always closed when `Do` returns an error after
|
|
30
|
+
reading headers. (#229)
|
|
31
|
+
|
|
32
|
+
## v1.8.2 — 2026-08-30
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
- Retry backoff is now computed by `github.com/fernwire/backoff` v0.4.0
|
|
36
|
+
(previously v0.3.0). Jitter is full-jitter instead of equal-jitter; the
|
|
37
|
+
maximum delay per attempt is unchanged at 2s. `WithRetries(n)` semantics
|
|
38
|
+
are unchanged. (#224)
|
|
39
|
+
|
|
40
|
+
## v1.8.1 — 2026-08-04
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
- `WithBaseURL` now tolerates a trailing slash. (#219)
|
package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/.github/workflows/ci.yml
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
lint:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@3d1f0a9c7e5b2846f0c1a7d9e3b5f8c2a6d4e017 # v4.2.2
|
|
16
|
+
- uses: actions/setup-node@6b2e8d0f4a1c3957e2a8c4f6b0d9a1c3e5f7b8d2 # v4.1.0
|
|
17
|
+
with:
|
|
18
|
+
node-version-file: .nvmrc
|
|
19
|
+
cache: npm
|
|
20
|
+
- run: npm ci
|
|
21
|
+
- run: npm run lint
|
|
22
|
+
|
|
23
|
+
format:
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@3d1f0a9c7e5b2846f0c1a7d9e3b5f8c2a6d4e017 # v4.2.2
|
|
27
|
+
- uses: actions/setup-node@6b2e8d0f4a1c3957e2a8c4f6b0d9a1c3e5f7b8d2 # v4.1.0
|
|
28
|
+
with:
|
|
29
|
+
node-version-file: .nvmrc
|
|
30
|
+
cache: npm
|
|
31
|
+
- run: npm ci
|
|
32
|
+
- run: npm run format:check
|
|
33
|
+
|
|
34
|
+
typecheck:
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
steps:
|
|
37
|
+
- uses: actions/checkout@3d1f0a9c7e5b2846f0c1a7d9e3b5f8c2a6d4e017 # v4.2.2
|
|
38
|
+
- uses: actions/setup-node@6b2e8d0f4a1c3957e2a8c4f6b0d9a1c3e5f7b8d2 # v4.1.0
|
|
39
|
+
with:
|
|
40
|
+
node-version-file: .nvmrc
|
|
41
|
+
cache: npm
|
|
42
|
+
- run: npm ci
|
|
43
|
+
- run: npm run typecheck
|
|
44
|
+
|
|
45
|
+
test:
|
|
46
|
+
runs-on: ubuntu-latest
|
|
47
|
+
steps:
|
|
48
|
+
- uses: actions/checkout@3d1f0a9c7e5b2846f0c1a7d9e3b5f8c2a6d4e017 # v4.2.2
|
|
49
|
+
- uses: actions/setup-node@6b2e8d0f4a1c3957e2a8c4f6b0d9a1c3e5f7b8d2 # v4.1.0
|
|
50
|
+
with:
|
|
51
|
+
node-version-file: .nvmrc
|
|
52
|
+
cache: npm
|
|
53
|
+
- run: npm ci
|
|
54
|
+
- run: npm test
|
|
55
|
+
|
|
56
|
+
build-and-smoke:
|
|
57
|
+
runs-on: ubuntu-latest
|
|
58
|
+
steps:
|
|
59
|
+
- uses: actions/checkout@3d1f0a9c7e5b2846f0c1a7d9e3b5f8c2a6d4e017 # v4.2.2
|
|
60
|
+
- uses: actions/setup-node@6b2e8d0f4a1c3957e2a8c4f6b0d9a1c3e5f7b8d2 # v4.1.0
|
|
61
|
+
with:
|
|
62
|
+
node-version-file: .nvmrc
|
|
63
|
+
cache: npm
|
|
64
|
+
- run: npm ci
|
|
65
|
+
- run: npm run build
|
|
66
|
+
# Runs the test suite against the built dist/ bundle, not src/.
|
|
67
|
+
- run: npm run test:dist
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
20.11.1
|