Skip to content

chore: pull ddd-core (ESM config-graph imports) - #152

Merged
JakeGinnivan merged 3 commits into
mainfrom
jakeginnivan/pull-upstream-core-esm-imports
Sep 3, 2026
Merged

JakeGinnivan merged 3 commits into
mainfrom
jakeginnivan/pull-upstream-core-esm-imports

Conversation

@JakeGinnivan

@JakeGinnivan JakeGinnivan commented Sep 2, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Do not squash-merge this PR. Use "Create a merge commit" or "Rebase and merge".

git subtree pull --squash records the sync point in a git-subtree-split trailer on
the squash commit, and the next pull scans history for the most recent one to find its
starting point. Upstream's individual commits never exist in this fork, so that trailer is
the only record of where we last synced to. A GitHub squash merge rewrites the commit
message and destroys it — after which every future pull replays the whole range from the
original subtree add, manufacturing spurious conflicts as that range grows.

Verified present on this branch (skill step 6b):

git-subtree-split: 790acd007b2c5c411b0a634771c31bf477c9a2a3

What

git subtree pull of ddd-core 72ff724..790acd0 — dddwa/ddd-core#16, the core half of the native-ESM import work that landed here in #151.

Net effect on the fork: one line. Because #151 had already made the identical changes to the fork's core/, the only content this pull actually brings down is core's own eslint boundary-allowlist fix:

-allow: ['^.*/website/themes/theme-builder$'],
+allow: ['^.*/website/themes/theme-builder(\\.ts)?$'],

Everything else in the subtree already matched.

The one conflict, and why it resolved this way

core/website/vite.config.ts conflicted. The three-way view:

side specifier
base '../conference-stub/build-manifest'
upstream '../conference-stub/build-manifest.ts'
ours '../../conference/build-manifest.ts'

Both sides independently added .ts; only the path differs, and that difference is the documented fork override (the comment directly above it spells this out). Resolved by keeping ours. No upstream intent was dropped — the extension upstream wanted is already present.

Verification

Check Result
tsc -b --force exit 0
nx run-many --target=lint --all 0 errors across 3 projects
nx run-many --target=test --all 328 passed / 33 files
nx build website ✓ 3.86s + 934ms, zero Vite warnings

Also diffed the fork's core/ against upstream 790acd0: the only remaining differences are the three documented fork overrides (@conference/* path aliases in website/tsconfig.json, the build-manifest import in vite.config.ts) plus a pre-existing ignoreDeprecations line. No merge damage.

Note on the skill

/pull-upstream step 3 previews incoming work with git log --oneline core..ddd-core/main -- core/. There is no ref named core — it's a directory — so that command silently returns empty and the skill reports "already up to date" even when there are commits to pull. I read the real state from the git-subtree-dir trailer instead (Squashed 'core/' changes from 8ba297f..72ff724 → fork at 72ff724, upstream at 790acd0). Worth fixing in the skill separately; I haven't touched it here.

https://claude.ai/code/session_012ZUK9WJ1TGNQzBSNwwrBx1

790acd0 Merge pull request #16 from dddwa/jakeginnivan/esm-extensionless-imports-nodenext-resolution
1330c7b chore: fully specify config-graph imports for native ESM resolution

git-subtree-dir: core
git-subtree-split: 790acd007b2c5c411b0a634771c31bf477c9a2a3
…ivan/pull-upstream-core-esm-imports

# Conflicts:
#	core/website/vite.config.ts
The skills describing this layout (/new-conference, /pull-upstream) are
authored in ddd-core and travel down with the subtree as
core/.claude/skills/. But Claude Code only reads .claude/skills/ at the repo
root, so the copies actually loaded were snapshots taken when the fork was
created and never updated again.

That gap is silent and it already bit: ddd-core added a step to
/pull-upstream requiring the subtree-split trailer be verified and the PR
marked do-not-squash — guidance that exists precisely because squash-merging
a subtree pull corrupts every later pull. The fork's copy was 50 lines behind
and had none of it, so the skill ran without those checks. Both fork copies
turn out to be older revisions of the upstream files rather than local
customisations, so copying is the right operation, not merging.

Adds scripts/sync-core-skills.mjs (copy, --check to verify, removes skills
core has dropped) and wires it into the pull itself at step 6, next to the
`pnpm i` that already runs there.

Deliberately not relying on `prepare` alone: pnpm skips lifecycle scripts
when an install is a no-op, which is exactly what `pnpm i` does after a pull
that changed no dependencies — verified, the hook does not fire there. It is
still wired to `prepare` so a fresh clone gets current skills, but the pull
is what guarantees it.

Nothing is fetched; the subtree pull has already placed the current skills in
core/.claude/skills/. This only copies them to where they are read.

Claude-Session: https://claude.ai/code/session_012ZUK9WJ1TGNQzBSNwwrBx1
@JakeGinnivan
JakeGinnivan merged commit c5b29e4 into main Sep 3, 2026
3 checks passed
@JakeGinnivan
JakeGinnivan deleted the jakeginnivan/pull-upstream-core-esm-imports branch September 3, 2026 00:00
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