skilldrop-cli 0.16.31 → 0.16.33
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/contracts/skill.schema.json +3 -3
- package/package.json +1 -1
- package/packs/converters/skills/file-to-markdown/SKILL.md +8 -4
- package/packs/converters/skills/file-to-markdown/manifest.json +11 -2
- package/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +118 -8
- package/packs/converters/skills/md-to-docx/examples/q3-support-review.md +7 -0
- package/packs/converters/skills/md-to-xlsx/examples/vendor-review.md +6 -1
- package/packs/converters/skills/mermaid-render/manifest.json +11 -1
- 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/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
|
@@ -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
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# chore(deps): update dev dependencies (non-major) #88
|
|
2
|
+
|
|
3
|
+
**renovate** wants to merge 1 commit into `main` from `renovate/dev-dependencies-non-major`
|
|
4
|
+
|
|
5
|
+
This PR contains the following updates:
|
|
6
|
+
|
|
7
|
+
| Package | Type | Update | Change |
|
|
8
|
+
|---|---|---|---|
|
|
9
|
+
| bundlecrate | devDependencies | minor | `6.0.1` -> `6.1.0` |
|
|
10
|
+
| lintwright | devDependencies | minor | `4.2.0` -> `4.3.1` |
|
|
11
|
+
| prettyquill | devDependencies | patch | `3.1.2` -> `3.1.4` |
|
|
12
|
+
| tsforge-types | devDependencies | patch | `1.4.0` -> `1.4.2` |
|
|
13
|
+
| vellum-test | devDependencies | minor | `2.7.3` -> `2.8.0` |
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
### Release Notes
|
|
18
|
+
|
|
19
|
+
<details>
|
|
20
|
+
<summary>bundlecrate/bundlecrate (bundlecrate)</summary>
|
|
21
|
+
|
|
22
|
+
#### v6.1.0
|
|
23
|
+
|
|
24
|
+
- **Node.js support:** minimum supported Node.js is now 18.18. Node 16 is no longer tested. (#1502)
|
|
25
|
+
- The module resolver has been extracted into its own package, `@bundlecrate/resolver-core`, which `bundlecrate` now depends on. The previous internal fallback package `bundlecrate-legacy-resolver` is no longer needed and has been dropped. No change to resolution behaviour; output is byte-identical on our fixture suite. (#1497)
|
|
26
|
+
- Incremental rebuilds are ~20% faster in watch mode. (#1489)
|
|
27
|
+
|
|
28
|
+
#### v6.0.2
|
|
29
|
+
|
|
30
|
+
- Fix source-map `sources` paths on Windows. (#1481)
|
|
31
|
+
|
|
32
|
+
</details>
|
|
33
|
+
|
|
34
|
+
<details>
|
|
35
|
+
<summary>lintwright/lintwright (lintwright)</summary>
|
|
36
|
+
|
|
37
|
+
#### v4.3.1
|
|
38
|
+
|
|
39
|
+
- Fix false positive in `no-unused-vars` for destructured catch parameters. (#902)
|
|
40
|
+
|
|
41
|
+
#### v4.3.0
|
|
42
|
+
|
|
43
|
+
- New rule `no-floating-promise`, enabled as an error in the `lintwright:strict` preset. It is **not** added to `lintwright:recommended`. (#888)
|
|
44
|
+
- `picolabel` updated to 0.9.2 for terminal colour detection fixes.
|
|
45
|
+
|
|
46
|
+
#### v4.2.1
|
|
47
|
+
|
|
48
|
+
- Docs-only release.
|
|
49
|
+
|
|
50
|
+
</details>
|
|
51
|
+
|
|
52
|
+
<details>
|
|
53
|
+
<summary>prettyquill/prettyquill (prettyquill)</summary>
|
|
54
|
+
|
|
55
|
+
#### v3.1.4
|
|
56
|
+
|
|
57
|
+
- Fix idempotency bug when formatting long ternaries inside JSX attributes. (#611)
|
|
58
|
+
|
|
59
|
+
#### v3.1.3
|
|
60
|
+
|
|
61
|
+
- Performance: cache parsed config across files. (#604)
|
|
62
|
+
|
|
63
|
+
</details>
|
|
64
|
+
|
|
65
|
+
<details>
|
|
66
|
+
<summary>tsforge/types (tsforge-types)</summary>
|
|
67
|
+
|
|
68
|
+
#### v1.4.2
|
|
69
|
+
|
|
70
|
+
- Correct return type of `DeepReadonly<T>` for tuple types. (#77)
|
|
71
|
+
|
|
72
|
+
#### v1.4.1
|
|
73
|
+
|
|
74
|
+
- Add JSDoc to `Brand<T, K>`. (#74)
|
|
75
|
+
|
|
76
|
+
</details>
|
|
77
|
+
|
|
78
|
+
<details>
|
|
79
|
+
<summary>vellum/vellum-test (vellum-test)</summary>
|
|
80
|
+
|
|
81
|
+
#### v2.8.0
|
|
82
|
+
|
|
83
|
+
- `vt.legacyTimers()` is deprecated and now prints a warning when called. It still works and will be removed in 3.0. Use `vt.fakeTimers()`. (#455)
|
|
84
|
+
- New `expect.toSatisfyAll()` matcher. (#450)
|
|
85
|
+
|
|
86
|
+
#### v2.7.4
|
|
87
|
+
|
|
88
|
+
- Fix watch mode ignoring `.mts` files. (#447)
|
|
89
|
+
|
|
90
|
+
</details>
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
### Configuration
|
|
95
|
+
|
|
96
|
+
📅 **Schedule**: Branch creation - "before 6am on monday" (UTC), Automerge - Disabled by config.
|
|
97
|
+
|
|
98
|
+
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
### Checks
|
|
103
|
+
|
|
104
|
+
- ci / lint — passed
|
|
105
|
+
- ci / format — passed
|
|
106
|
+
- ci / typecheck — passed
|
|
107
|
+
- ci / test — passed
|
|
108
|
+
- ci / build-and-smoke — passed
|
|
109
|
+
|
|
110
|
+
All checks have passed.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ledgerly/invoice-widgets",
|
|
3
|
+
"version": "3.12.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=20"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"lint": "lintwright . --max-warnings 0",
|
|
12
|
+
"format:check": "prettyquill --check .",
|
|
13
|
+
"typecheck": "tsc --noEmit",
|
|
14
|
+
"test": "vellum run",
|
|
15
|
+
"build": "bundlecrate src/index.ts --out dist",
|
|
16
|
+
"test:dist": "vellum run --config vellum.dist.config.js"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"bundlecrate": "6.1.0",
|
|
20
|
+
"lintwright": "4.3.1",
|
|
21
|
+
"prettyquill": "3.1.4",
|
|
22
|
+
"tsforge-types": "1.4.2",
|
|
23
|
+
"vellum-test": "2.8.0"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
diff --git a/package.json b/package.json
|
|
2
|
+
index 1c2e8f0..5ad91b3 100644
|
|
3
|
+
--- a/package.json
|
|
4
|
+
+++ b/package.json
|
|
5
|
+
@@ -17,11 +17,11 @@
|
|
6
|
+
"devDependencies": {
|
|
7
|
+
- "bundlecrate": "6.0.1",
|
|
8
|
+
- "lintwright": "4.2.0",
|
|
9
|
+
- "prettyquill": "3.1.2",
|
|
10
|
+
- "tsforge-types": "1.4.0",
|
|
11
|
+
- "vellum-test": "2.7.3"
|
|
12
|
+
+ "bundlecrate": "6.1.0",
|
|
13
|
+
+ "lintwright": "4.3.1",
|
|
14
|
+
+ "prettyquill": "3.1.4",
|
|
15
|
+
+ "tsforge-types": "1.4.2",
|
|
16
|
+
+ "vellum-test": "2.8.0"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
diff --git a/package-lock.json b/package-lock.json
|
|
20
|
+
index 9e04a1d..c3b7f52 100644
|
|
21
|
+
--- a/package-lock.json
|
|
22
|
+
+++ b/package-lock.json
|
|
23
|
+
@@ -12,11 +12,11 @@
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
- "bundlecrate": "6.0.1",
|
|
26
|
+
- "lintwright": "4.2.0",
|
|
27
|
+
- "prettyquill": "3.1.2",
|
|
28
|
+
- "tsforge-types": "1.4.0",
|
|
29
|
+
- "vellum-test": "2.7.3"
|
|
30
|
+
+ "bundlecrate": "6.1.0",
|
|
31
|
+
+ "lintwright": "4.3.1",
|
|
32
|
+
+ "prettyquill": "3.1.4",
|
|
33
|
+
+ "tsforge-types": "1.4.2",
|
|
34
|
+
+ "vellum-test": "2.8.0"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=20"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
+ "node_modules/@bundlecrate/resolver-core": {
|
|
41
|
+
+ "version": "1.0.0",
|
|
42
|
+
+ "resolved": "https://registry.npmjs.org/@bundlecrate/resolver-core/-/resolver-core-1.0.0.tgz",
|
|
43
|
+
+ "integrity": "sha512-Xk3bP9vQm2LrT7wZ1sNc4HfJ8eYd0GaU6oKiE5rBtWqV2nM7xL1pR9sT3vW8cZ4yH6jF0dK2gA5eN1bQ7uI3oP==",
|
|
44
|
+
+ "dev": true,
|
|
45
|
+
+ "license": "MIT",
|
|
46
|
+
+ "engines": {
|
|
47
|
+
+ "node": ">=18.18"
|
|
48
|
+
+ }
|
|
49
|
+
+ },
|
|
50
|
+
"node_modules/bundlecrate": {
|
|
51
|
+
- "version": "6.0.1",
|
|
52
|
+
- "resolved": "https://registry.npmjs.org/bundlecrate/-/bundlecrate-6.0.1.tgz",
|
|
53
|
+
- "integrity": "sha512-Lm7nQ2vKp9cRz4Wt1bXe8JdH3yGa0fUu6oNiE5rCtYqW2sM7xP1kR9tT3vV8bZ4yJ6hF0dL2gA5eN1cQ7uO3iP==",
|
|
54
|
+
+ "version": "6.1.0",
|
|
55
|
+
+ "resolved": "https://registry.npmjs.org/bundlecrate/-/bundlecrate-6.1.0.tgz",
|
|
56
|
+
+ "integrity": "sha512-Pq4rT8wXn1cLz6Vs2mBe9KdJ7hYf3aGu0oNiE5rDtUqX2nL7wM1pS9vT4bW8cZ3yK6jG0eH2fA5dN1aQ7iU3oR==",
|
|
57
|
+
"dev": true,
|
|
58
|
+
"license": "MIT",
|
|
59
|
+
"dependencies": {
|
|
60
|
+
- "bundlecrate-legacy-resolver": "^2.3.0",
|
|
61
|
+
+ "@bundlecrate/resolver-core": "^1.0.0",
|
|
62
|
+
"picolabel": "^0.9.0"
|
|
63
|
+
},
|
|
64
|
+
"bin": {
|
|
65
|
+
"bundlecrate": "bin/bundlecrate.js"
|
|
66
|
+
},
|
|
67
|
+
"engines": {
|
|
68
|
+
- "node": ">=16"
|
|
69
|
+
+ "node": ">=18.18"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
- "node_modules/bundlecrate-legacy-resolver": {
|
|
73
|
+
- "version": "2.3.4",
|
|
74
|
+
- "resolved": "https://registry.npmjs.org/bundlecrate-legacy-resolver/-/bundlecrate-legacy-resolver-2.3.4.tgz",
|
|
75
|
+
- "integrity": "sha512-Ab2cD4eF6gH8iJ0kL2mN4oP6qR8sT0uV2wX4yZ6aB8cD0eF2gH4iJ6kL8mN0oP2qR4sT6uV8wX0yZ2aB4cD6eF8==",
|
|
76
|
+
- "dev": true,
|
|
77
|
+
- "license": "MIT"
|
|
78
|
+
- },
|
|
79
|
+
"node_modules/lintwright": {
|
|
80
|
+
- "version": "4.2.0",
|
|
81
|
+
- "resolved": "https://registry.npmjs.org/lintwright/-/lintwright-4.2.0.tgz",
|
|
82
|
+
- "integrity": "sha512-Hn5mR2xLq8cTz3Wv1bYe7KdF4hJa9gUu0oNiE6rBtWpX3sM2wL1kQ8vT5cV9bZ7yG4hF0dJ2eA6nN1aR3uI7oS==",
|
|
83
|
+
+ "version": "4.3.1",
|
|
84
|
+
+ "resolved": "https://registry.npmjs.org/lintwright/-/lintwright-4.3.1.tgz",
|
|
85
|
+
+ "integrity": "sha512-Ty8kW3vNp2cQz5Ls1mXe6RdJ9hGa4fUu7oNiE0rBtVqY2sK3wM1pL8vS5cT9bZ6yH4jF0eG2dA7nN1bR3iU5oQ==",
|
|
86
|
+
"dev": true,
|
|
87
|
+
"license": "MIT",
|
|
88
|
+
"dependencies": {
|
|
89
|
+
- "picolabel": "0.9.1"
|
|
90
|
+
+ "picolabel": "0.9.2"
|
|
91
|
+
},
|
|
92
|
+
"bin": {
|
|
93
|
+
"lintwright": "bin/lintwright.js"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"node_modules/picolabel": {
|
|
97
|
+
- "version": "0.9.1",
|
|
98
|
+
- "resolved": "https://registry.npmjs.org/picolabel/-/picolabel-0.9.1.tgz",
|
|
99
|
+
- "integrity": "sha512-Cd3eF5gH7iJ9kL1mN3oP5qR7sT9uV1wX3yZ5aB7cD9eF1gH3iJ5kL7mN9oP1qR3sT5uV7wX9yZ1aB3cD5eF7gH==",
|
|
100
|
+
+ "version": "0.9.2",
|
|
101
|
+
+ "resolved": "https://registry.npmjs.org/picolabel/-/picolabel-0.9.2.tgz",
|
|
102
|
+
+ "integrity": "sha512-Ef4gH6iJ8kL0mN2oP4qR6sT8uV0wX2yZ4aB6cD8eF0gH2iJ4kL6mN8oP0qR2sT4uV6wX8yZ0aB2cD4eF6gH8iJ==",
|
|
103
|
+
"dev": true,
|
|
104
|
+
"license": "MIT"
|
|
105
|
+
},
|
|
106
|
+
"node_modules/prettyquill": {
|
|
107
|
+
- "version": "3.1.2",
|
|
108
|
+
- "resolved": "https://registry.npmjs.org/prettyquill/-/prettyquill-3.1.2.tgz",
|
|
109
|
+
- "integrity": "sha512-Gh6iJ8kL0mN2oP4qR6sT8uV0wX2yZ4aB6cD8eF0gH2iJ4kL6mN8oP0qR2sT4uV6wX8yZ0aB2cD4eF6gH8iJ0kL==",
|
|
110
|
+
+ "version": "3.1.4",
|
|
111
|
+
+ "resolved": "https://registry.npmjs.org/prettyquill/-/prettyquill-3.1.4.tgz",
|
|
112
|
+
+ "integrity": "sha512-Ij7kL9mN1oP3qR5sT7uV9wX1yZ3aB5cD7eF9gH1iJ3kL5mN7oP9qR1sT3uV5wX7yZ9aB1cD3eF5gH7iJ9kL1mN==",
|
|
113
|
+
"dev": true,
|
|
114
|
+
"license": "MIT",
|
|
115
|
+
"bin": {
|
|
116
|
+
"prettyquill": "bin/prettyquill.js"
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"node_modules/tsforge-types": {
|
|
120
|
+
- "version": "1.4.0",
|
|
121
|
+
- "resolved": "https://registry.npmjs.org/tsforge-types/-/tsforge-types-1.4.0.tgz",
|
|
122
|
+
- "integrity": "sha512-Kl8mN0oP2qR4sT6uV8wX0yZ2aB4cD6eF8gH0iJ2kL4mN6oP8qR0sT2uV4wX6yZ8aB0cD2eF4gH6iJ8kL0mN2oP==",
|
|
123
|
+
+ "version": "1.4.2",
|
|
124
|
+
+ "resolved": "https://registry.npmjs.org/tsforge-types/-/tsforge-types-1.4.2.tgz",
|
|
125
|
+
+ "integrity": "sha512-Mn9oP1qR3sT5uV7wX9yZ1aB3cD5eF7gH9iJ1kL3mN5oP7qR9sT1uV3wX5yZ7aB9cD1eF3gH5iJ7kL9mN1oP3qR==",
|
|
126
|
+
"dev": true,
|
|
127
|
+
"license": "MIT"
|
|
128
|
+
},
|
|
129
|
+
"node_modules/vellum-test": {
|
|
130
|
+
- "version": "2.7.3",
|
|
131
|
+
- "resolved": "https://registry.npmjs.org/vellum-test/-/vellum-test-2.7.3.tgz",
|
|
132
|
+
- "integrity": "sha512-Op0qR2sT4uV6wX8yZ0aB2cD4eF6gH8iJ0kL2mN4oP6qR8sT0uV2wX4yZ6aB8cD0eF2gH4iJ6kL8mN0oP2qR4sT==",
|
|
133
|
+
+ "version": "2.8.0",
|
|
134
|
+
+ "resolved": "https://registry.npmjs.org/vellum-test/-/vellum-test-2.8.0.tgz",
|
|
135
|
+
+ "integrity": "sha512-Qr1sT3uV5wX7yZ9aB1cD3eF5gH7iJ9kL1mN3oP5qR7sT9uV1wX3yZ5aB7cD9eF1gH3iJ5kL7mN9oP1qR3sT5uV==",
|
|
136
|
+
"dev": true,
|
|
137
|
+
"license": "MIT",
|
|
138
|
+
"bin": {
|
|
139
|
+
"vellum": "bin/vellum.js"
|
|
140
|
+
},
|
|
141
|
+
"engines": {
|
|
142
|
+
"node": ">=18"
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Brand } from "tsforge-types";
|
|
2
|
+
|
|
3
|
+
export type IsoDate = Brand<string, "IsoDate">;
|
|
4
|
+
|
|
5
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
6
|
+
|
|
7
|
+
export function isOverdue(inv: { dueAt: string }): boolean {
|
|
8
|
+
return Date.now() > Date.parse(inv.dueAt);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function formatDue(inv: { dueAt: string }): string {
|
|
12
|
+
const days = Math.round((Date.parse(inv.dueAt) - Date.now()) / DAY_MS);
|
|
13
|
+
if (days < 0) return `overdue by ${-days} days`;
|
|
14
|
+
if (days === 0) return "due today";
|
|
15
|
+
return `due in ${days} days`;
|
|
16
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DeepReadonly } from "tsforge-types";
|
|
2
|
+
|
|
3
|
+
export type Line = DeepReadonly<{ qty: number; unitMinor: number }>;
|
|
4
|
+
|
|
5
|
+
export function lineTotal(l: Line): number {
|
|
6
|
+
return l.qty * l.unitMinor;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function invoiceTotal(lines: readonly Line[]): number {
|
|
10
|
+
return lines.reduce((sum, l) => sum + lineTotal(l), 0);
|
|
11
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { describe, it, expect, vt } from "vellum-test";
|
|
2
|
+
import { isOverdue, formatDue } from "../src/due-date";
|
|
3
|
+
|
|
4
|
+
describe("due dates", () => {
|
|
5
|
+
it("flags invoices past their due date", () => {
|
|
6
|
+
vt.fakeTimers({ now: new Date("2026-03-15T09:00:00Z") });
|
|
7
|
+
expect(isOverdue({ dueAt: "2026-03-14T23:59:59Z" })).toBe(true);
|
|
8
|
+
expect(isOverdue({ dueAt: "2026-03-16T00:00:00Z" })).toBe(false);
|
|
9
|
+
vt.restoreTimers();
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it("formats relative due text", () => {
|
|
13
|
+
vt.fakeTimers({ now: new Date("2026-03-15T09:00:00Z") });
|
|
14
|
+
expect(formatDue({ dueAt: "2026-03-18T09:00:00Z" })).toBe("due in 3 days");
|
|
15
|
+
vt.restoreTimers();
|
|
16
|
+
});
|
|
17
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { describe, it, expect } from "vellum-test";
|
|
2
|
+
import { lineTotal, invoiceTotal } from "../src/totals";
|
|
3
|
+
|
|
4
|
+
describe("totals", () => {
|
|
5
|
+
it("multiplies quantity by unit price in minor units", () => {
|
|
6
|
+
expect(lineTotal({ qty: 3, unitMinor: 1250 })).toBe(3750);
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
it("sums lines", () => {
|
|
10
|
+
expect(invoiceTotal([{ qty: 1, unitMinor: 100 }, { qty: 2, unitMinor: 50 }])).toBe(200);
|
|
11
|
+
});
|
|
12
|
+
});
|
|
@@ -67,25 +67,34 @@ No install scripts, sources, licences or pins appear. The floor says only that t
|
|
|
67
67
|
|
|
68
68
|
## Review (what the agent hands back)
|
|
69
69
|
|
|
70
|
-
**MERGE.**
|
|
70
|
+
**MERGE.** Two patch releases; the only behaviour change, 2.2.2's new 10 MB line limit, raises an error the import code already handles, and the PR's tests run that code.
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
- Both releases read. 2.2.1 fixes quoted newlines splitting rows, covered by `test_quoted_newline_stays_one_row` (`tests/test_ingest.py:9`). 2.2.2 is a security fix: lines over 10 MB raise `RowTooLongError`, a subclass of `ParseError`.
|
|
73
|
+
- `git grep -n "tidyparse" -- '*.py'` finds one call, `app/ingest.py:14`, inside `except tidyparse.ParseError` (`app/ingest.py:15`), so the new error becomes `StatementRejected` like any malformed file.
|
|
74
|
+
- `ci.yml` runs `pytest -q` on the PR and `tests/test_ingest.py:3` imports `import_statement`, so the changed code ran.
|
|
73
75
|
|
|
74
|
-
|
|
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.
|
|
76
|
+
Also in the lockfile: `charset-sniff` 1.4.0 → 1.4.1 (transitive patch). No new packages, install scripts, sources, runtime changes or pins.
|
|
79
77
|
|
|
80
|
-
|
|
81
|
-
|---|---|---|---|
|
|
82
|
-
| tidyparse | 2.2.0 → 2.2.2 | patch | direct |
|
|
83
|
-
| charset-sniff | 1.4.0 → 1.4.1 | patch | transitive |
|
|
78
|
+
Rollback: `git revert` the merge commit, or `poetry add tidyparse@2.2.0` and commit `pyproject.toml` and `poetry.lock`; that reopens the 2.2.2 memory issue, so treat it as a stopgap.
|
|
84
79
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
To confirm: nothing.
|
|
80
|
+
About 150 words. No package table: two packages fit in a line. No "To confirm": nothing is open.
|
|
88
81
|
|
|
89
82
|
## Why this is MERGE and not MERGE AFTER CHECKS
|
|
90
83
|
|
|
91
84
|
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.
|
|
85
|
+
|
|
86
|
+
## The same shape when it blocks
|
|
87
|
+
|
|
88
|
+
Suppose instead the PR moved tidyparse to 3.0.0 and the notes (invented for this illustration) said 3.0.0 requires Python 3.11 and `parse_rows()` now returns a `RowSet` instead of a list. The reply keeps the order and stays short:
|
|
89
|
+
|
|
90
|
+
> **DO NOT MERGE.** 3.0.0 needs Python 3.11 and the production image runs 3.10, and the import code indexes a result that is no longer a list.
|
|
91
|
+
>
|
|
92
|
+
> 🟥 1. `Dockerfile:1` builds on `python:3.10-slim`; CI runs 3.12 (`ci.yml:12`), so the PR passed and the image build fails at install. Move the image to 3.11 in this PR.
|
|
93
|
+
> 🟥 2. `app/ingest.py:17` does `rows[0]` on what is now a `RowSet`; no test reads the first row, so CI missed it. Use `rows.first()`.
|
|
94
|
+
>
|
|
95
|
+
> Also in the lockfile: `charset-sniff` 1.4.0 → 1.4.1.
|
|
96
|
+
> Rollback: `git revert` the merge commit and rebuild the image.
|
|
97
|
+
>
|
|
98
|
+
> I can make both changes on this branch.
|
|
99
|
+
|
|
100
|
+
The lead names both blockers; each blocker says what breaks, where, why CI missed it and the fix; nothing is in the reply that does not change the decision.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dependency-upgrade-review",
|
|
3
|
-
"version": "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
|
|
3
|
+
"version": "0.2.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 each SHA pin against its release tag and against the PR's other pins, checks raised runtime floors against the images and runners that install it, says whether CI ran the changed code, traces what each caller of a changed API now does and writes the rollback. The reply leads with MERGE, MERGE AFTER CHECKS or DO NOT MERGE and the reasons that decide it. 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
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
7
7
|
"npm": [],
|
|
@@ -38,10 +38,22 @@
|
|
|
38
38
|
"github-actions"
|
|
39
39
|
],
|
|
40
40
|
"permissions": {
|
|
41
|
-
"network": [
|
|
42
|
-
|
|
41
|
+
"network": [
|
|
42
|
+
"github.com",
|
|
43
|
+
"api.github.com",
|
|
44
|
+
"registry.npmjs.org",
|
|
45
|
+
"pypi.org",
|
|
46
|
+
"proxy.golang.org"
|
|
47
|
+
],
|
|
48
|
+
"commands": [
|
|
49
|
+
"git",
|
|
50
|
+
"gh",
|
|
51
|
+
"npm",
|
|
52
|
+
"pip",
|
|
53
|
+
"go"
|
|
54
|
+
],
|
|
43
55
|
"files": "named-paths",
|
|
44
|
-
"notes": "
|
|
56
|
+
"notes": "The script reads only the diff path it is given, or stdin, writes only the -o path when given, and makes no network calls. The instructions read the PR with gh or git, list a package's releases with npm, pip, go or gh, and verify a SHA pin with git ls-remote against github.com; gh reaches api.github.com and the package managers their registries; with no network those become commands in the reply for the reviewer to run."
|
|
45
57
|
},
|
|
46
58
|
"model": {
|
|
47
59
|
"tier": "standard",
|