fix: pinhole tracks chant 0.52 — the pin no longer nests a stale chant (#116) - #117
Merged
Conversation
#116) pinhole's dependency sat at @intentius/chant ^0.44.3 while chant shipped 0.52.2, so a consumer already on 0.52.x — behold, as of today — resolved its own 0.52 at the top level and carried a second, nested chant@0.44.14 underneath pinhole for good. Dead weight at runtime (pinhole shells the project's own chant bin, not its bundled one), but the two copies would eventually diverge on type identity, since pinhole re-exports chant's IR types rather than keeping a copy. Nothing in the surface pinhole touches moved. The IR types it re-exports (GraphIR, IRNode, IREdge, IRGroups, IRExport, IRImport, SourceLoc) and the layout ones it imports (Layout, Point, NodeSize) changed only by addition between 0.44.3 and 0.52.2: IRExport picked up `value`/`stack` and GraphIR picked up `stackExports`, both for observed graphs (chant#1279); graph-layout.d.ts is byte-identical. `chant graph --format ir|layout` still takes --detail, --lens, --up/--down, --env and --node-sizes, and `chant lint --format json` still backs the gate — so the bump carries no code change beyond the README's floor. Verified end to end against a real 0.52.2 project (behold's argo estate), not only the typecheck: render walks the project's own chant install, shells graph twice, and paints cards with fields — withResourceAttrs still finds the resource tier where 0.44 left it. Falls out of the bump: chant 0.52 moved esbuild to ^0.28.1, which dedupes with pinhole's own devDependency, dropping 27 nested esbuild entries from the lock. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rfs1mLVWmwginHnDTg75sG
lex00
added a commit
that referenced
this pull request
Aug 30, 2026
…118) Claude-Session: https://claude.ai/code/session_01Rfs1mLVWmwginHnDTg75sG Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #116.
pinhole's dependency sat at
@intentius/chant^0.44.3while chant shipped 0.52.2, so a consumer already on 0.52.x — behold, as of today — resolved its own 0.52 at the top level and carried a second, nestedchant@0.44.14underneath pinhole for good. Dead weight at runtime (pinhole shells the project's own chant bin, not its bundled one), but the two copies would eventually diverge on type identity, since pinhole re-exports chant's IR types rather than keeping a copy.What pinhole uses chant for
Two things, both narrow:
src/ir.tsre-exportsGraphIR,IRNode,IREdge,IRGroups,IRExport,IRImport,SourceLoc,Layout,Point;src/chant.tsimportsGraphIR,Layout,NodeSize. Allimport type.src/chant.tsresolves chant's bin path (preferring the target project's own install, resolve lexicons from the target project, not pinhole's own node_modules #36) and shellschant graph --format ir|layoutandchant lint --format json. chant is--externalin both esbuild bundles, so it is never inlined.Why the bump is a one-liner
The surface moved only by addition between 0.44.3 and 0.52.2:
IRExportpicked up optionalvalueandstack, andGraphIRpicked up optionalstackExports— both for observed graphs (chant#1279).graph-layout.d.tsis byte-identical.chant graphstill takes--detail,--lens,--up/--down,--env,--node-sizes;chant lint --format jsonstill backs the gate.So no code change beyond the README's stated floor.
Verification
npm cifrom the regenerated lock, then the three gates CI runs —npm run tsc,npm test(19 files, 211 tests),npm run build— all clean.Beyond the typecheck, rendered a real chant 0.52.2 project end to end (behold's
example-argo-estate/app-a):renderwalked the project's own chant install, shelledgraphtwice, and painted cards with populated fields, sowithResourceAttrsstill finds the resource tier where 0.44 left it.Lock side effect
chant 0.52 moved
esbuildto^0.28.1, which dedupes against pinhole's own devDependency — 27 nested@intentius/chant/node_modules/@esbuild/*entries drop out of the lock.🤖 Generated with Claude Code
https://claude.ai/code/session_01Rfs1mLVWmwginHnDTg75sG