Skip to content

Modernize toolchain: pnpm 11, TypeScript 6, oxlint type-checking, dependency & security cleanup#117

Open
venables wants to merge 28 commits into
mainfrom
bump-depenencies
Open

Modernize toolchain: pnpm 11, TypeScript 6, oxlint type-checking, dependency & security cleanup#117
venables wants to merge 28 commits into
mainfrom
bump-depenencies

Conversation

@venables

@venables venables commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Summary

A broad toolchain modernization and dependency/security cleanup pass. Highlights:

Tooling

  • Bump linting stack: oxlint 1.50→1.71, oxfmt 0.35→0.56, oxlint-tsgolint 0.14→0.23, knip 6.17→6.18, tsdown 0.15→0.22
  • Upgrade pnpm 10.20 → 11.8; migrate workspace settings (.npmrcsaveExact, onlyBuiltDependenciesallowBuilds)
  • Upgrade TypeScript 5.9 → 6.0.3
  • Pin tsdown output to .js/.d.ts via fixedExtension: false (tsdown 0.22 changed the default ESM extension, which broke type resolution against the exports maps)

Type checking via oxlint (no more tsc)

  • Enable oxlint type-aware + type-check (options.typeAware / options.typeCheck, backed by oxlint-tsgolint) — these were previously in the wrong config block (settings) and silently inert
  • Remove all per-package check:types (tsc --noEmit) scripts and the check:types turbo task; type checking now runs inside lint

Config consolidation

  • Replace the @repo/typescript-config workspace package with a single root tsconfig.json that every sub-project extends (examples add allowJs/jsx inline)

Code quality

  • Resolve all 193 oxlint warnings repo-wide (0 warnings): unsafe type assertions → valibot parsing / type guards, typed vi.fn mocks, restructured conditional expects, #private class fields, etc.
  • @repo/api-utils: infer validator schema output via v.InferOutput<S> (required by TS 6's stricter inference)
  • Remove deprecated public APIs across keys, did, ack-pay (see changeset for migrations)

Dependencies & security

  • pnpm audit: 92 → 1 advisories
    • pnpm overrides for vulnerable transitives (body-parser, path-to-regexp, qs, picomatch, uuid, ws, rollup, vite, postcss, esbuild, jsondiffpatch, js-yaml)
    • bump mintlify 4.2.377 → 4.2.637 (clears the bulk of docs-tooling advisories)
    • patch the changesets toolchain js-yaml via read-yaml-file@1 → ^2.1.0
    • upgrade demos/identity to AI SDK v6 (ai 4→6, providers to current majors; CoreMessageModelMessage, maxStepsstopWhen, parametersinputSchema)
    • The single remaining advisory is js-yaml 3.x via mintlify's front-matter (docs-only, never shipped; front-matter's latest still pins js-yaml 3.x and uses the removed safeLoad, so it can't move to 4.x)

Breaking changes

Removal of deprecated APIs in keys/did/ack-pay is covered by a changeset (minor bump, per the 0.x convention). Migrations are documented there.

Verification

  • pnpm run build + pnpm run check pass (29/29: build, lint incl. type-check, format, tests)
  • pnpm audit down to 1 (upstream-locked, docs-only)
  • AI SDK migration type-checks; runtime not exercised (requires a provider API key)

AI usage disclosure

Per the repo AI Usage Policy: this branch was developed with Claude Code (Anthropic). AI assistance was extensive — it performed the dependency/version investigation, code migrations, oxlint warning fixes, and audit remediation, with human review and direction throughout. Library/version-migration details were verified against current docs (AI SDK, pnpm, oxlint) rather than model memory.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Strengthened runtime schema-based validation for identity, payments, receipts, and credential/JWT flows.
  • Bug Fixes

    • More robust error message handling for non-standard thrown values.
    • Stricter on-chain and Solana receipt/transaction hash validation.
  • Breaking Changes

    • Removed deprecated alias APIs across DID/keys/payment helpers, including updated DID naming and payment request/token helper behavior.
    • Tightened VC parsing/creation return typing (less generic output).
  • Chores

    • Simplified check/type-check and lint tooling commands; updated workspace TypeScript/lint config and package manager/tooling versions.

venables and others added 16 commits June 23, 2026 11:06
- Bump oxlint 1.50→1.71, oxfmt 0.35→0.56, oxlint-tsgolint 0.14→0.23, knip 6.17→6.18, tsdown 0.15→0.22
- Enable type-aware linting in .oxlintrc.json (typeAware + typeCheck)
- Upgrade pnpm 10.20→11.8 and migrate workspace settings:
  - move save-exact from .npmrc to saveExact in pnpm-workspace.yaml
  - replace onlyBuiltDependencies/ignoredBuiltDependencies with allowBuilds
  - add blockExoticSubdeps, injectWorkspacePackages, enableGlobalVirtualStore, minimumReleaseAge
- Swap standard-parse → standard-matchers (test matchers import path)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tsdown 0.22 defaults fixedExtension to true (platform === 'node'), emitting
.mjs/.d.mts. The packages' exports maps point at ./dist/index.d.ts and .js, so
tsc --noEmit could not resolve workspace types (TS2307), breaking check:types
for every dependent. Setting fixedExtension: false restores .js/.d.ts to match
the existing exports maps.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both settings replace live workspace symlinks with hard-copied snapshots taken
at install time (injectWorkspacePackages is meant for pnpm deploy bundling, not
dev). Consumers then resolved a dist-less snapshot in the global store instead
of freshly built source, breaking the build->consume cycle (TS2307 in demos).
Removing them restores symlinks to packages/* and lets check:types pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The oxlint 1.71 bump promoted four vitest rules to errors across test files.
Downgrade them to warn in a dedicated, commented overrides block so CI passes
now; remove the block once the tests are cleaned up.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Move shared TypeScript config into the root tsconfig.json and have every
sub-project extend it via a relative path, removing the @repo/typescript-config
workspace package and the indirection of inheriting through a tools/ package.

- root tsconfig.json holds the shared options (base + noEmit, used by all)
- every sub-project extends ../../tsconfig.json; examples/* add allowJs/jsx
- drop @repo/typescript-config from every package.json and delete
  tools/typescript-config
- update AGENTS.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
typeAware/typeCheck are configured in .oxlintrc.json, so the CLI flag on the
lint script is redundant.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Type the signed-payload helpers by the schema type itself (S extends
GenericSchema) and derive the body via v.InferOutput<S>, instead of
GenericSchema<unknown, T>. TypeScript 6's stricter inference could not recover T
from the latter, leaving payload.body typed as unknown.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
oxlint's type-aware mode performs full TypeScript type checking (TS compiler
diagnostics) via oxlint-tsgolint, so the separate tsc pass is redundant.

- fix .oxlintrc.json: move typeAware/typeCheck from `settings` (plugin config,
  silently ignored) to `options`, where they actually take effect. Without this
  the flags were inert and `pnpm run lint` did no type-aware work at all.
- remove `check:types` ("tsc --noEmit") from every package.json and the root
  `turbo check:types` script
- drop the `check:types` turbo task and its entry in `check`'s dependsOn; type
  checking now runs inside `//#lint` (needs dist, so `check` builds first)
- document the no-tsc setup in AGENTS.md; also correct the stale .npmrc note

Verified: a deliberate type error now fails `pnpm run check` via oxlint (TS2322).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Clean up the 193 warnings surfaced once type-aware linting + type checking
were correctly enabled. No rules were globally weakened.

Code fixes by rule:
- typescript/no-unsafe-type-assertion (74): removed `as` casts in favor of
  precise types, type guards, or valibot `v.parse(...)` runtime validation;
  test fixtures rebuilt as properly-typed values / `satisfies`
- vitest/require-mock-type-parameters (31): typed `vi.fn<...>()` to the real
  signatures
- vitest/no-conditional-expect (20): restructured tests to assert
  unconditionally (`.rejects.toThrow`, guard-then-assert)
- eslint/no-shadow (16): renamed shadowing locals/imports
- vitest/require-to-throw-message (12): added matchers to `.toThrow(...)`
- eslint/no-await-in-loop (11): `Promise.all` where independent; kept genuinely
  sequential interactive/polling loops with a scoped disable + reason
- eslint/no-underscore-dangle (8): `DidResolver` cache fields are now true
  private `#cache`/`#useCache` (collision-proof vs the base Resolver)
- typescript/restrict-template-expressions (5): explicit `String(...)`
- eslint/no-unused-vars (4): `_`-prefixed type-predicate params
- unicorn/consistent-function-scoping (2): hoisted pure inner functions
- vitest/valid-title (1): dropped duplicate title prefix

Config:
- disable import/no-unassigned-import for `*.d.ts` + `vitest.setup.ts` (their
  side-effect imports cannot be assigned)
- remove the temporary vitest-rule downgrade block; those rules are back at
  their default (error) level with zero violations

jwtStringSchema now validates via isJwtString (identical regex, single source
of truth). Full build + type check + tests + format pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
These were thin aliases for their replacements and had no internal callers.
Removed while consolidating the larger tooling/type changes. Added a changeset
(minor bump per the project's 0.x convention) documenting the migrations.

keys:
- bytesToJwk → publicKeyBytesToJwk
- jwkToBytes → publicKeyJwkToBytes
- getCompressedPublicKey → getPublicKeyFromPrivateKey
did:
- DidPkhChainId → Caip2ChainId
- isDidPkhChainId → isCaip2ChainId
- createBlockchainAccountId → createCaip10AccountId (arg order differs)
- didPkhChainIdSchema (valibot + zod v3/v4) → caip2ChainIdSchema
ack-pay:
- createPaymentRequestBody → createSignedPaymentRequest

Also drops the now-orphaned isCaip2ChainId / caip2ChainIdSchema imports left
behind by the removed aliases. knip is clean; full check passes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add pnpm overrides forcing patched versions of vulnerable transitive
dependencies, scoped by major where multiple lines coexist. Brings pnpm audit
from 92 to 46 advisories.

Fixed via overrides: body-parser (1.x + 2.x), path-to-regexp, qs, picomatch
(2.x + 4.x), js-yaml (3.x), uuid, ws, rollup, vite, postcss, esbuild,
jsondiffpatch.

Not fixed (no safe option):
- js-yaml >=4.1.2 — advisory's patched version is unpublished
- ai / @ai-sdk/provider-utils — demo-only (demos/identity), low severity, fix
  only in a newer major of @ai-sdk/anthropic
- remaining advisories are mintlify docs-tooling, dev-only and never shipped;
  overriding them risks breaking the docs site

None of the affected deps ship in published package runtime (they reach the
packages only via devDependencies / peerDependencies). Full build + check pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ings)

The mintlify upgrade pulls in patched versions of its deep dependency tree,
clearing the bulk of the docs-tooling advisories. Combined with the transitive
overrides, pnpm audit is now down from 92 to 3.

- bump mintlify to 4.2.637
- add tar@7 override (>=7.5.16) for a mintlify transitive
- set keytar build to false (deny native build for the new optional mintlify
  credential-store dep; docs preview does not require it)

Remaining 3 advisories have no safe fix:
- ai (low) / @ai-sdk/provider-utils (low) — demo-only (demos/identity); fixes
  require major bumps of @ai-sdk/valibot and @ai-sdk/anthropic
- js-yaml (moderate) — advisory's patched version (>=4.1.2) is unpublished

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Migrate demos/identity from AI SDK v4 to v6 (ai 4.3.16 -> 6.0.209, providers
to their current majors). Clears the last two demo-only audit advisories
(ai, @ai-sdk/provider-utils); pnpm audit is now down to a single unfixable
moderate (js-yaml >=4.1.2, unpublished).

Dependency bumps:
- ai 4.3.16 -> 6.0.209
- @ai-sdk/anthropic 1.2.11 -> 3.0.85 (3.0.86 is younger than minimumReleaseAge)
- @ai-sdk/openai 1.3.22 -> 3.0.74
- @ai-sdk/valibot 0.1.28 -> 2.0.31

API migrations (per the v5/v6 migration guides):
- CoreMessage -> ModelMessage
- generateText maxSteps: 10 -> stopWhen: stepCountIs(10)
- tool({ parameters }) -> tool({ inputSchema })

Type-aware lint and full check pass. Runtime not exercised (requires a provider
API key).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Take the js-yaml advisory (<=4.1.1) off the changesets path:
- override js-yaml@4 to ^4.2.0 (the published fix; the advisory's >=4.1.2 was
  unpublished earlier but 4.2.0 satisfies it)
- override read-yaml-file@1 -> ^2.1.0 so @manypkg/get-packages pulls js-yaml 4.x
  instead of the 3.x line (read-yaml-file@1.1.0 used the removed safeLoad; 2.1.0
  is the latest CommonJS line and uses js-yaml 4). Verified `changeset status`
  still works.
- drop the now-unnecessary js-yaml@3 override (only front-matter still needs
  3.x, and it resolves to the latest 3.14.2 on its own)

The lone remaining audit advisory is js-yaml 3.x via mintlify's front-matter
(docs-only, never shipped): front-matter's latest (4.0.2) still pins js-yaml
^3.13.1 and calls the removed safeLoad, so it cannot move to 4.x without
breaking the docs preview.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

The PR updates workspace tooling, removes deprecated aliases, and migrates demos, examples, and utilities to root TypeScript config inheritance, runtime validation, and updated agent and middleware contracts.

Changes

Workspace and build policy

Layer / File(s) Summary
Repo tooling and root config
AGENTS.md, .npmrc, .oxlintrc.json, package.json, pnpm-workspace.yaml, turbo.json, tsconfig.json, docs/package.json
Root scripts, linting, pnpm workspace policy, and the inline tsconfig baseline are updated together.
Project config inheritance
demos/*/tsconfig.json, examples/*/tsconfig.json, packages/*/tsconfig.json, packages/*/tsdown.config.ts, packages/*/vitest.setup.ts, tools/*/tsconfig.json, tools/*/typescript-config/*
Package configs and shared TypeScript config files switch to the root TypeScript config and adjust related build/test setup.
Project manifests
demos/*/package.json, examples/*/package.json, packages/*/package.json, tools/*/package.json
Demo, example, package, and tool manifests remove legacy type-check scripts and shared config package references, and update selected dependency and peer dependency versions.

Shared package API cleanup

Layer / File(s) Summary
Release notes and API docs
.changeset/*.md, packages/ack-pay/README.md, packages/did/README.md
Changesets and package documentation record removed aliases, tighter VC typing, and updated payment request and DID documentation.
Deprecated aliases and public API tightening
packages/ack-pay/src/create-signed-payment-request.ts, packages/vc/src/create-credential.ts, packages/vc/src/verification/parse-jwt-credential.ts, packages/did/src/methods/did-pkh.ts, packages/did/src/schemas/*, packages/keys/src/encoding/jwk.ts, packages/keys/src/public-key.ts
Deprecated aliases are removed from keys, did, ack-pay, and vc, and the public credential helpers tighten their exported return types.
Key encoding and CAIP schema validation
packages/keys/src/encoding/*, packages/keys/src/curves/*, packages/keys/src/key-curves.ts, packages/keys/src/keypair.test.ts, packages/keys/src/public-key.test.ts, packages/caip/src/schemas/schemas.test.ts
Key encoding, multibase, and public-key helpers now use runtime guards and explicit overloads, and the CAIP schema suite is parameterized by schema source.
DID resolver and did:pkh updates
packages/did/src/did-resolvers/*, packages/did/src/methods/did-pkh.ts, packages/did/src/methods/did-pkh.test.ts, packages/did/src/resolve-did.ts
DidResolver caching, JWKS fetch composition, did:web resolution errors, and did:pkh validation now use private fields and runtime message normalization.
JWT validation
packages/jwt/src/*
JWT string validation, unsupported-curve errors, and schema refinements now use predicate-based checks and typed Vitest mocks.
VC credential and verification flow
packages/vc/src/*
Credential creation, JWT credential parsing, revocation checks, proof verification, and verifier orchestration now use explicit runtime validation and sequential verifier execution.
Ack-pay and ack-id tests
packages/ack-pay/src/verify-payment-receipt.test.ts, packages/ack-id/src/*.test.ts
Receipt verification and controller-verifier tests narrow expected runtime error and credential-shape assertions.

Utility validation helpers

Layer / File(s) Summary
Signed payload and body validation
tools/api-utils/src/middleware/signed-payload-validator.ts, tools/api-utils/src/validate-payload.ts, tools/api-utils/src/validate-payload.test.ts
Signed payload and body validation helpers infer output types from schemas and parse JWT payloads at runtime.
CLI prompt and env-file helpers
tools/cli-tools/src/prompts.ts, tools/cli-tools/src/update-env-file.ts
CLI prompt parsing and env-file updates avoid mutating argument arrays and normalize logged errors.

Demo and example migrations

Layer / File(s) Summary
Identity agent contract migration
demos/identity/src/agent.ts, demos/identity/src/client-agent.ts, demos/identity/src/haiku-agent.ts, demos/identity/src/identity-tools.ts, demos/identity/src/index.ts
Identity agent classes switch to ModelMessage and runInternal, and the tool schemas now use inputSchema with a loop ESLint suppression.
Identity A2A integration and logging
demos/identity-a2a/src/*, demos/e2e/src/verification.ts
Identity A2A and e2e error paths log caught values directly, and the DID document route returns agent.didDocument without a local variable.
Payments demo validation
demos/payments/src/index.ts, demos/payments/src/payment-service.ts, demos/payments/src/receipt-service.ts, demos/payments/src/utils/*
Payments entrypoints, receipt handling, and transfer helpers add runtime parsing for payment requests, receipts, transaction hashes, and balances.
Skyfire KYA validation
demos/skyfire-kya/src/*
Skyfire KYA conversion and logging paths validate aud, did:web values, and JWS strings, and stringify caught errors.
Issuer credential and receipt routes/tests
examples/issuer/src/routes/*, examples/issuer/src/db/utils/*, examples/issuer/src/lib/credentials/*
Issuer credential and receipt routes now use the issuer middleware alias, typed mocks, and runtime validation for payment-request and credential payloads.
Issuer status route and local DID host
examples/issuer/src/routes/status.ts, examples/local-did-host/src/index.ts
The status route parses and validates the Bitstring Status List claim after JWT decoding, and the local DID host middleware import is renamed.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • agentcommercekit/ack#115: This PR also changes packages/vc/src/verification/parse-jwt-credential.ts to validate decoded credential shape at runtime.
  • agentcommercekit/ack#116: This PR also touches the DID schema/export surface where deprecated aliases are removed.
  • agentcommercekit/ack#114: This PR also changes tools/api-utils/src/middleware/signed-payload-validator.ts around unsigned-payload bypass behavior.

Suggested reviewers

  • domleboss97
  • pitluga
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 43.48% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main changes: toolchain upgrades, oxlint type-checking, and dependency/security cleanup.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch bump-depenencies

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@mintlify

mintlify Bot commented Jun 24, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
Catena 🟢 Ready View Preview Jun 24, 2026, 7:47 PM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
demos/payments/src/index.ts (1)

439-446: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Check the receipt-service status before parsing the body.

Lines 446 and 599 parse whatever came back. If the service returns a 4xx/5xx or non-JSON error body, the demo throws a Valibot error and hides the actual receipt-service failure. Guard on response.ok first so the surfaced error still includes the upstream status.

Also applies to: 594-599

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@demos/payments/src/index.ts` around lines 439 - 446, The receipt-service
response is being parsed without checking whether the HTTP request succeeded,
which can hide upstream failures behind a Valibot parse error. Update the
receipt handling in the affected fetch/parse paths around the receipt service
call and the receipt parsing logic to first check response.ok, and if it is
false, surface an error that includes the upstream status before calling v.parse
on the JSON body. Keep the existing receiptResponseSchema parsing for successful
responses only.
🧹 Nitpick comments (4)
examples/issuer/src/routes/receipts.ts (1)

36-36: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Register issuerMiddleware() only once for this route.

Line 36 already applies issuerMiddleware() to every route, so keeping it again on Line 91 makes POST /credentials/receipts execute the same middleware twice on each request.

Suggested change
 app.post(
   "/",
   signedPayloadValidator("json", bodySchema),
-  issuerMiddleware(),
   async (c): Promise<ApiResponse<CredentialResponse>> => {

Also applies to: 91-91

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@examples/issuer/src/routes/receipts.ts` at line 36, The receipts route is
registering issuerMiddleware() twice, which causes POST /credentials/receipts to
run the same middleware more than once. Update the routing in receipts.ts so
issuerMiddleware() is applied only once for this router, keeping the single
shared registration around the app.use("*", issuerMiddleware()) setup and
removing the duplicate per-route usage near POST /credentials/receipts.
packages/vc/src/verification/is-expired.test.ts (1)

41-50: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Rename the new handles… cases to assertive names.

Please switch these two titles to returns…/throws… phrasing so they match the repo's Vitest naming convention.

Suggested rename
-  it("handles expiration date exactly at current time", () => {
+  it("returns false when expiration date equals the current time", () => {
@@
-  it("handles invalid date strings gracefully", () => {
+  it("returns false for invalid date strings", () => {

As per coding guidelines, **/*.test.ts: Vitest tests should use assertive names like it("creates…"), it("throws…"), it("requires…"), or it("returns…").

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/vc/src/verification/is-expired.test.ts` around lines 41 - 50, The
new Vitest cases in isExpired.test.ts use “handles…” titles, which do not match
the repo’s assertive naming convention. Rename the two affected it(...)
descriptions in the isExpired test block to use assertive phrasing such as
“returns…” for the expiration-at-current-time case and “throws…” for the
invalid-date-string case, keeping the test behavior unchanged.

Source: Coding guidelines

packages/keys/src/encoding/multibase.ts (1)

16-21: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Prevent multibaseEncodings from drifting from MULTIBASE_PREFIX.

getMultibaseEncoding() now depends on a manually maintained list. If a new key is added to MULTIBASE_PREFIX but not this tuple, detection silently breaks for that encoding. Consider deriving this list from the prefix map (or adding a compile-time exhaustiveness assertion).

Also applies to: 103-105

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/keys/src/encoding/multibase.ts` around lines 16 - 21, The manual
multibaseEncodings tuple has drift risk relative to MULTIBASE_PREFIX, so
detection in getMultibaseEncoding can silently miss newly added encodings.
Update the logic in multibase.ts to derive multibaseEncodings from
MULTIBASE_PREFIX or add a compile-time exhaustiveness check tied to
MULTIBASE_PREFIX so the tuple cannot get out of sync. Make sure the fix is
applied wherever the same list is duplicated, including the other referenced
occurrence, and keep getMultibaseEncoding using the authoritative source.
packages/did/src/did-resolvers/web-did-resolver.test.ts (1)

7-13: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Keep mockFetch typed as FetchLike.

MockFetch widens the contract to Promise<unknown>, so this file can still stub values that getResolver would never accept at runtime. Reusing FetchLike here preserves the stricter fetch shape the rest of this change is adding.

Suggested diff
-import type { FetchLike } from "../types"
+import type { FetchLike } from "../types"
 import { getResolver } from "./web-did-resolver"
 
-type MockFetch = (
-  input: string | URL | Request,
-  init?: RequestInit,
-) => Promise<unknown>
-
 describe("web-did-resolver", () => {
-  const mockFetch = vi.fn<MockFetch>()
+  const mockFetch = vi.fn<FetchLike>()
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/did/src/did-resolvers/web-did-resolver.test.ts` around lines 7 - 13,
The test helper type for the web DID resolver is too loose because MockFetch
returns Promise<unknown>, which weakens the fetch contract. Update the mock
declaration in web-did-resolver.test.ts to use FetchLike instead of MockFetch so
mockFetch matches the stricter shape expected by getResolver and cannot stub
invalid runtime values.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@demos/payments/src/index.ts`:
- Around line 75-78: Update the receipt response validation so the receipt field
is validated with jwtStringSchema instead of v.string(), ensuring the credential
is checked as a JWT before it is used as a Bearer token. Make the same schema
change in both receiptResponseSchema definitions, in index and the duplicate in
payment-service, so the runtime contract stays consistent across call sites.
- Around line 466-468: The Solana secret key parsing in the `keyBytes` निर्माण
path currently accepts non-byte numbers because `v.array(v.number())` is too
permissive and `Uint8Array` will coerce invalid values. Tighten the validation
in the `JSON.parse(clientSolKeys.secretKeyJson)` flow by using a schema in the
same `keyBytes` assignment that requires integers within the byte range before
constructing the `Uint8Array`, so invalid floats or out-of-range values are
rejected up front.

In `@demos/payments/src/receipt-service.ts`:
- Around line 288-297: The Solana token-balance parser in tokenBalanceSchema is
too strict because owner is required, but preTokenBalances and postTokenBalances
can omit it and valid transactions fail before recipient lookup. Update
tokenBalanceSchema in receipt-service to make owner optional while leaving the
recipient filtering logic at the use site in receipt creation/lookup so parsing
accepts all valid balances.

In `@package.json`:
- Around line 57-61: The pnpm engine constraint is too loose and can allow
versions that do not support the workspace settings used by this repo. Update
the package manifest’s engines.pnpm entry to require at least 10.26.0 so it
aligns with the packageManager pin and supports allowBuilds/blockExoticSubdeps,
or remove the pnpm engine entry entirely if packageManager should be the only
version gate.

In `@packages/caip/src/schemas/schemas.test.ts`:
- Around line 24-197: Several Vitest cases in schemas.test.ts use non-assertive
titles like “validates”, “rejects”, and “has correct type inference”; rename
each `it(...)` description to an assertive form that matches the test outcome.
Update the CAIP-2, CAIP-10, CAIP-19, and Type Inference cases in the `schemas`
test suite so they use required prefixes such as `creates`, `throws`,
`requires`, or `returns`, keeping the wording aligned with the actual assertion
in each block.

In `@packages/keys/src/encoding/multibase.test.ts`:
- Around line 27-29: The test case titles in multibase.test.ts use non-assertive
verbs like encodes, detects, validates, and roundtrips, which violates the
repo’s test naming rule for *.test.ts. Update the affected it.each descriptions
to use assertive verbs such as creates, throws, requires, or returns, and apply
the same naming style consistently across the affected test blocks identified
around the existing it.each calls in this spec.

In `@packages/keys/src/public-key.test.ts`:
- Line 33: Rename the new Vitest test cases in public-key.test.ts to use
assertive guideline-approved verbs instead of “encodes...”; update the affected
test titles in the public key test suite (including the one starting with
test("encodes public key to hex"... and the other matching cases) to names like
“returns...”, “throws...”, or “requires...” as appropriate, while keeping the
test behavior and assertions unchanged.

In `@packages/vc/src/verification/is-revoked.test.ts`:
- Around line 31-35: The helper getStatusListCredential currently treats
revokedIndex as a truthy check, so index 0 is skipped and the first status-list
entry is never marked revoked. Update the conditional in getStatusListCredential
to explicitly accept 0 as a valid value while still ignoring only
undefined/null, so tests can exercise the boundary case for the first bit.

In `@packages/vc/src/verification/parse-jwt-credential.ts`:
- Around line 23-45: The `isDecodedCredential` guard in
`parse-jwt-credential.ts` is only checking a subset of the `W3CCredential`
shape, so it can wrongly accept incomplete credentials; update this predicate to
validate the full contract before `parseJwtCredential()` returns. Use the
existing `isDecodedCredential`/`hasStringId` checks as the place to add required
fields like `@context`, `issuanceDate`, and any other mandatory W3C credential
properties, ensuring the returned value is truly a `Verifiable<W3CCredential>`.

In `@turbo.json`:
- Around line 16-17: The turbo check pipeline is missing a dependency on build,
so `//#lint` can run before `dist/` exists on a clean tree. Update the `check`
task in `turbo.json` to include `^build` alongside the existing `dependsOn`
entries, so both direct and filtered `turbo check` runs wait for upstream builds
before `//#lint` and `test` execute.

---

Outside diff comments:
In `@demos/payments/src/index.ts`:
- Around line 439-446: The receipt-service response is being parsed without
checking whether the HTTP request succeeded, which can hide upstream failures
behind a Valibot parse error. Update the receipt handling in the affected
fetch/parse paths around the receipt service call and the receipt parsing logic
to first check response.ok, and if it is false, surface an error that includes
the upstream status before calling v.parse on the JSON body. Keep the existing
receiptResponseSchema parsing for successful responses only.

---

Nitpick comments:
In `@examples/issuer/src/routes/receipts.ts`:
- Line 36: The receipts route is registering issuerMiddleware() twice, which
causes POST /credentials/receipts to run the same middleware more than once.
Update the routing in receipts.ts so issuerMiddleware() is applied only once for
this router, keeping the single shared registration around the app.use("*",
issuerMiddleware()) setup and removing the duplicate per-route usage near POST
/credentials/receipts.

In `@packages/did/src/did-resolvers/web-did-resolver.test.ts`:
- Around line 7-13: The test helper type for the web DID resolver is too loose
because MockFetch returns Promise<unknown>, which weakens the fetch contract.
Update the mock declaration in web-did-resolver.test.ts to use FetchLike instead
of MockFetch so mockFetch matches the stricter shape expected by getResolver and
cannot stub invalid runtime values.

In `@packages/keys/src/encoding/multibase.ts`:
- Around line 16-21: The manual multibaseEncodings tuple has drift risk relative
to MULTIBASE_PREFIX, so detection in getMultibaseEncoding can silently miss
newly added encodings. Update the logic in multibase.ts to derive
multibaseEncodings from MULTIBASE_PREFIX or add a compile-time exhaustiveness
check tied to MULTIBASE_PREFIX so the tuple cannot get out of sync. Make sure
the fix is applied wherever the same list is duplicated, including the other
referenced occurrence, and keep getMultibaseEncoding using the authoritative
source.

In `@packages/vc/src/verification/is-expired.test.ts`:
- Around line 41-50: The new Vitest cases in isExpired.test.ts use “handles…”
titles, which do not match the repo’s assertive naming convention. Rename the
two affected it(...) descriptions in the isExpired test block to use assertive
phrasing such as “returns…” for the expiration-at-current-time case and
“throws…” for the invalid-date-string case, keeping the test behavior unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 21f097a4-4a8b-4b2d-a0a9-b22d56e5ae55

📥 Commits

Reviewing files that changed from the base of the PR and between 8e9cf8e and 60a666c.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (131)
  • .changeset/remove-deprecated-aliases.md
  • .npmrc
  • .oxlintrc.json
  • AGENTS.md
  • demos/e2e/package.json
  • demos/e2e/src/verification.ts
  • demos/e2e/tsconfig.json
  • demos/identity-a2a/package.json
  • demos/identity-a2a/src/bank-client-agent.ts
  • demos/identity-a2a/src/bank-teller-agent.ts
  • demos/identity-a2a/src/utils/server-utils.ts
  • demos/identity-a2a/tsconfig.json
  • demos/identity/package.json
  • demos/identity/src/agent.ts
  • demos/identity/src/client-agent.ts
  • demos/identity/src/haiku-agent.ts
  • demos/identity/src/identity-tools.ts
  • demos/identity/src/index.ts
  • demos/identity/tsconfig.json
  • demos/payments/package.json
  • demos/payments/src/index.ts
  • demos/payments/src/payment-service.ts
  • demos/payments/src/receipt-service.ts
  • demos/payments/src/utils/ensure-balances.ts
  • demos/payments/src/utils/usdc-contract.ts
  • demos/payments/tsconfig.json
  • demos/skyfire-kya/package.json
  • demos/skyfire-kya/src/index.ts
  • demos/skyfire-kya/src/skyfire-kya-ack-id.ts
  • demos/skyfire-kya/tsconfig.json
  • docs/package.json
  • examples/issuer/package.json
  • examples/issuer/src/db/utils/get-status-list-position.test.ts
  • examples/issuer/src/lib/credentials/build-signed-credential.test.ts
  • examples/issuer/src/routes/credentials.test.ts
  • examples/issuer/src/routes/credentials.ts
  • examples/issuer/src/routes/receipts.test.ts
  • examples/issuer/src/routes/receipts.ts
  • examples/issuer/src/routes/status.ts
  • examples/issuer/tsconfig.json
  • examples/local-did-host/package.json
  • examples/local-did-host/src/index.ts
  • examples/local-did-host/tsconfig.json
  • examples/verifier/package.json
  • examples/verifier/tsconfig.json
  • package.json
  • packages/ack-id/package.json
  • packages/ack-id/src/controller-claim-verifier.test.ts
  • packages/ack-id/src/controller-credential.test.ts
  • packages/ack-id/tsconfig.json
  • packages/ack-id/tsdown.config.ts
  • packages/ack-pay/package.json
  • packages/ack-pay/src/create-signed-payment-request.ts
  • packages/ack-pay/src/verify-payment-receipt.test.ts
  • packages/ack-pay/tsconfig.json
  • packages/ack-pay/tsdown.config.ts
  • packages/agentcommercekit/package.json
  • packages/agentcommercekit/tsconfig.json
  • packages/agentcommercekit/tsdown.config.ts
  • packages/caip/package.json
  • packages/caip/src/schemas/schemas.test.ts
  • packages/caip/tsconfig.json
  • packages/caip/tsdown.config.ts
  • packages/caip/vitest.setup.ts
  • packages/did/package.json
  • packages/did/src/did-resolvers/did-resolver.ts
  • packages/did/src/did-resolvers/get-did-resolver.ts
  • packages/did/src/did-resolvers/web-did-resolver.test.ts
  • packages/did/src/did-resolvers/web-did-resolver.ts
  • packages/did/src/methods/did-pkh.test.ts
  • packages/did/src/methods/did-pkh.ts
  • packages/did/src/resolve-did.ts
  • packages/did/src/schemas/valibot.ts
  • packages/did/src/schemas/zod/v3.ts
  • packages/did/src/schemas/zod/v4.ts
  • packages/did/tsconfig.json
  • packages/did/tsdown.config.ts
  • packages/did/vitest.setup.ts
  • packages/jwt/package.json
  • packages/jwt/src/create-jwt.test.ts
  • packages/jwt/src/jwt-algorithm.ts
  • packages/jwt/src/schemas/valibot.ts
  • packages/jwt/src/schemas/zod/v3.ts
  • packages/jwt/src/schemas/zod/v4.ts
  • packages/jwt/src/verify.test.ts
  • packages/jwt/tsconfig.json
  • packages/jwt/tsdown.config.ts
  • packages/keys/package.json
  • packages/keys/src/curves/ed25519.test.ts
  • packages/keys/src/curves/secp256k1.test.ts
  • packages/keys/src/curves/secp256r1.test.ts
  • packages/keys/src/encoding/jwk.test.ts
  • packages/keys/src/encoding/jwk.ts
  • packages/keys/src/encoding/multibase.test.ts
  • packages/keys/src/encoding/multibase.ts
  • packages/keys/src/key-curves.ts
  • packages/keys/src/keypair.test.ts
  • packages/keys/src/public-key.test.ts
  • packages/keys/src/public-key.ts
  • packages/keys/tsconfig.json
  • packages/keys/tsdown.config.ts
  • packages/vc/package.json
  • packages/vc/src/create-credential.ts
  • packages/vc/src/revocation/status-list-credential.ts
  • packages/vc/src/signing/sign-credential.test.ts
  • packages/vc/src/verification/is-expired.test.ts
  • packages/vc/src/verification/is-revoked.test.ts
  • packages/vc/src/verification/parse-jwt-credential.test.ts
  • packages/vc/src/verification/parse-jwt-credential.ts
  • packages/vc/src/verification/verify-parsed-credential.test.ts
  • packages/vc/src/verification/verify-parsed-credential.ts
  • packages/vc/src/verification/verify-proof.test.ts
  • packages/vc/tsconfig.json
  • packages/vc/tsdown.config.ts
  • pnpm-workspace.yaml
  • tools/api-utils/package.json
  • tools/api-utils/src/middleware/signed-payload-validator.ts
  • tools/api-utils/src/validate-payload.test.ts
  • tools/api-utils/src/validate-payload.ts
  • tools/api-utils/tsconfig.json
  • tools/cli-tools/package.json
  • tools/cli-tools/src/prompts.ts
  • tools/cli-tools/src/update-env-file.ts
  • tools/cli-tools/tsconfig.json
  • tools/typescript-config/README.md
  • tools/typescript-config/base-app.json
  • tools/typescript-config/base.json
  • tools/typescript-config/package.json
  • tools/typescript-config/typescript-library.json
  • tsconfig.json
  • turbo.json
💤 Files with no reviewable changes (26)
  • packages/did/src/schemas/zod/v3.ts
  • packages/did/src/schemas/zod/v4.ts
  • packages/did/src/schemas/valibot.ts
  • tools/typescript-config/README.md
  • .npmrc
  • tools/typescript-config/typescript-library.json
  • packages/agentcommercekit/package.json
  • demos/skyfire-kya/package.json
  • demos/e2e/package.json
  • packages/vc/package.json
  • examples/verifier/package.json
  • tools/typescript-config/package.json
  • tools/typescript-config/base-app.json
  • examples/issuer/package.json
  • packages/keys/src/public-key.ts
  • packages/jwt/package.json
  • examples/local-did-host/package.json
  • demos/identity-a2a/package.json
  • packages/ack-pay/package.json
  • packages/keys/package.json
  • demos/payments/package.json
  • packages/ack-id/package.json
  • tools/cli-tools/package.json
  • tools/typescript-config/base.json
  • tools/api-utils/package.json
  • packages/ack-pay/src/create-signed-payment-request.ts

Comment thread demos/payments/src/index.ts
Comment thread demos/payments/src/index.ts
Comment thread demos/payments/src/receipt-service.ts
Comment thread package.json
Comment thread packages/caip/src/schemas/schemas.test.ts
Comment thread packages/keys/src/encoding/multibase.test.ts
Comment thread packages/keys/src/public-key.test.ts
Comment thread packages/vc/src/verification/is-revoked.test.ts
Comment thread packages/vc/src/verification/parse-jwt-credential.ts
Comment thread turbo.json
venables and others added 10 commits June 24, 2026 19:10
From the panel review loop on #117:

- verify-parsed-credential: restore sequential claim-verifier execution so a
  multi-verifier failure throws deterministically (first verifier in order) and
  short-circuits, instead of the race-dependent error Promise.all surfaced.
  Matches the original behavior; scoped oxlint-disable for the intentional
  sequential await.
- changeset: document the two breaking @agentcommercekit/vc type changes the
  lint cleanup introduced (parseJwtCredential dropped its <T> generic;
  createCredential now returns W3CCredential instead of T), bumping vc to minor
  with migration notes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Catalog (pnpm-workspace.yaml):
- hono 4.12.26 -> 4.12.27, @hono/node-server 2.0.5 -> 2.0.6
- uuid 14.0.0 -> 14.0.1, viem 2.52.2 -> 2.53.1
- zod 3.25.4 -> 4.4.3 (schema files already target zod/v3 + zod/v4 subpaths,
  both of which ship in zod 4; package zod peers widened to
  "^3.25.0 || ^4.0.0", which is additive/non-breaking)
- @a2a-js/sdk 0.2.2 -> 0.3.13

Direct deps:
- @types/node 24.9.2 -> 25.9.4 (see note on 26 below)
- express 4.21.2 -> 5.2.1 (demos/identity-a2a)
- @solana/kit 4.0.0 -> 6.10.0, @solana-program/token 0.6.0 -> 0.14.0
  (demos/payments)

@a2a-js/sdk 0.3 migration (demos/identity-a2a): entry points moved to
server/client/express subpaths; A2AError is now a value; AgentCard requires
protocolVersion. Updated imports and cards accordingly. ack-id/agentcommercekit
a2a peer bumped ^0.2.2 -> ^0.3.0 (breaking — changeset added).

Held back (not safely upgradable right now):
- did-resolver 5.0.1: the did-jwt stack (did-jwt@8, did-jwt-vc@4) still requires
  did-resolver ^4.1.0, so bumping @agentcommercekit/did to 5 creates a two-copy
  `Resolvable` type skew. Stays on 4.1.0 until upstream supports 5.
- @types/node 26: its declarations break the TS 6.0.3 / oxlint-tsgolint type
  check (poisons module resolution -> spurious "cannot find module 'vitest'"
  across all test files). 25.9.4 is the newest usable.

All packages build; full check passes (build + lint/type-check + format + test).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
From the panel review loop on #117:

- turbo.json: disable cache on //#lint. Type checking now runs via oxlint
  (tsgolint) inside //#lint, which depends on workspace dist/ that turbo does
  not track as inputs; a cached lint result could mask cross-package type
  errors. (dependsOn:["build"] isn't valid for a root task, so cache:false is
  the correct lever; the `turbo build && turbo check` script still guarantees
  build-first ordering.)
- ack-pay README: update the example to createSignedPaymentRequest (the removed
  createPaymentRequestBody), use paymentRequestToken, and fix the Response init
  (headers, not the invalid contentType key).
- did README: createDidPkhUri now documents Caip2ChainId (removed DidPkhChainId).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
publint flagged that `@agentcommercekit/keys` declares a `./secp256r1` subpath
export but never built `dist/curves/secp256r1.{js,d.ts}` — the module was
missing from the tsdown entry array, so importing the export failed at runtime.
Add it to the build. All packages/* now pass `publint`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Drop `fixedExtension: false` from every package's tsdown.config.ts so the build
uses tsdown's default extensions (.mjs / .d.mts) instead of forcing .js / .d.ts.
Update each package.json `main`, `types`, and `exports` to point at the new
extensions so module resolution still resolves.

(This reverses the earlier fixedExtension workaround, which existed only to keep
the old extensions and avoid touching the exports maps.) No public subpath
changes — consumers resolving via the package name / exports are unaffected.
All packages/* pass publint; full check passes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both receiptResponseSchema definitions checked receipt with v.string(); the
receipt is used as a Bearer credential, so validate it with jwtStringSchema at
the runtime boundary. Addresses a PR review comment.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Solana pre/postTokenBalances can omit owner, so requiring it rejected valid
transactions before the recipient filter ran. Addresses a PR review comment.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The workspace relies on pnpm 11-era settings (allowBuilds, blockExoticSubdeps);
engines.pnpm >=10 allowed versions that ignore them. Match the packageManager
pin. Addresses a PR review comment.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
getStatusListCredential(0) skipped the first bit because if (revokedIndex) is
falsy for 0; guard on !== undefined. Addresses a PR review comment.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
venables and others added 2 commits June 24, 2026 22:16
…-depenencies

#116 landed on main after this branch was cut, restructuring the schema layer
(collapsed schemas/zod/{v3,v4}.ts into a single zod.ts, dropped zod v3, adopted
web-identity-schemas). Resolved 16 conflicts by taking main's schema
architecture and re-applying this branch's orthogonal work on top:

- schema files / package.json exports: main's single ./schemas/zod (+ a2a) and
  web-identity-schemas dep; re-applied our .mjs/.d.mts extensions
- zod peer: ^4.0.0 (main; our v3-widening is obsolete)
- re-applied our removals that main predates: @repo/typescript-config devDeps,
  per-package check:types scripts, standard-parse -> standard-matchers
- kept our @a2a-js/sdk ^0.3.0 peer, dep bumps, audit overrides, tooling
- honored our deprecated-API removal (dropped didPkhChainIdSchema from did
  valibot+zod, which main had kept)
- dropped our redundant secp256r1 changeset (main fixed it independently)
- regenerated pnpm-lock.yaml

Build + full check pass (29/29). 4 pre-existing warnings in main's new schema
code (surfaced by this branch's type-aware lint) fixed in a follow-up.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- jwt/schemas/zod.ts: rename unused refine param val -> _val
- vc/schemas/{zod,valibot}.ts: scope-disable no-unsafe-type-assertion on the
  transform's W3CCredential normalization (main's #116 code, surfaced by this
  branch's type-aware lint)
- demos/skyfire-kya: drop a now-unnecessary `as JwtString`
- regenerate pnpm-lock.yaml from a clean store so the pnpm-audit overrides
  fully apply (the in-merge incremental installs had left vite/ws/body-parser
  on stale vulnerable versions); audit back to a single unfixable moderate

Full check passes (29/29); 0 lint warnings.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant