T-LVLY-vendor-augmented-ts-packages
Status: closed/done · Impact: high · Complexity: medium
The sksizer/augmented_books repo (dormant since 2026-02) is being folded
into this monorepo. Its shared TS packages are the substrate every one of
its apps depends on; nothing here can consume them while they live in the
external repo. Vendor all eleven into packages/ts/ as root Bun workspace
members so the app adoptions (T-6C0Z, T-KTGF, T-UPV1) can
resolve them via workspace:* and the rest of the monorepo can share them.
Source of truth for the vendor: https://github.com/sksizer/augmented_books
at pinned rev acedcf77652e2e7c481e95123c486c2befe2c423. Clone to a scratch
dir; copy from there (clean vendored copy, no history — the
apps/zoo/MIGRATION.md recipe).
| Location | Role today |
|---|---|
package.json | Root Bun workspaces already glob packages/ts/* — vendored packages auto-join; no root edit needed |
packages/ts/ | Existing shared TS packages (@sksizer/*, @determined/*); no augmented packages present |
packages/ts/obsidian-bases/ | @sksizer/obsidian-bases — an independent implementation of the same idea as @augment/obsidian-bases; the directory-name collision forces the -augment suffix below |
packages/ts/intersect/moon.yml | The moon.yml shape existing packages/ts members follow |
.moon/workspace.yml | projects.globs includes packages/ts/* — vendored dirs register as moon projects |
apps/zoo/MIGRATION.md | The vendoring recipe: clean copy, pnpm→Bun, locks dropped |
In the source repo the packages live under packages/node/* plus
packages/web/test-vue-component. Internal dependency graph (all via
workspace: ranges, which Bun also supports): utils ← entity ←
books; logging ← books; json-canvas-core ← json-canvas-vue;
the rest are leaves.
Proposed
Section titled “Proposed”Eleven packages vendored, names and scopes unchanged (rescoping to
@sksizer is a separate decision — T-JCML):
| Source (in augmented_books) | Destination | Package name |
|---|---|---|
packages/node/books | packages/ts/books/ | @augmented/books |
packages/node/context | packages/ts/context/ | @augmented/context |
packages/node/entity | packages/ts/entity/ | @augmented/entity |
packages/node/hierarchy | packages/ts/hierarchy/ | @augmented/hierarchy |
packages/node/json-canvas-core | packages/ts/json-canvas-core/ | @augment/json-canvas-core |
packages/node/json-canvas-vue | packages/ts/json-canvas-vue/ | @augment/json-canvas-vue |
packages/node/logging | packages/ts/logging/ | @augmented/logging |
packages/node/obsidian-bases | packages/ts/obsidian-bases-augment/ | @augment/obsidian-bases |
packages/node/render | packages/ts/render/ | @augmented/render |
packages/node/utils | packages/ts/utils/ | @augmented/utils |
packages/web/test-vue-component | packages/ts/test-vue-component/ | @augmented/test-vue-component |
obsidian-bases-augment is explicitly temporary: T-NLKF ports its
consumers onto @sksizer/obsidian-bases and deletes it. Its README gets a
banner saying so.
Approach
Section titled “Approach”- Clone the pinned rev to a scratch directory.
- Copy each package directory per the table (exclude
node_modules, anypnpm-lock.yaml/package-lock.json,.npmrc). - Per package: keep
nameand scope as-is; drop pnpm-only fields (packageManager, pnpm-specific publish config); ensure scripts run under Bun (bun test,tsc --noEmitor equivalent). - Add a thin
moon.ymlper package mirroringpackages/ts/intersect/moon.ymlwhere the package has test/build tasks. - Root
bun install; confirm the workspace glob picked all eleven up. - Run each package’s tests under
bun test; typecheck packages without tests. Fix only what the Bun conversion broke — no refactors. - Write the
obsidian-bases-augmentREADME banner pointing atT-NLKF.
Files to touch
Section titled “Files to touch”| Location | Kind | Change |
|---|---|---|
packages/ts/books/ | new | Vendored @augmented/books |
packages/ts/context/ | new | Vendored @augmented/context |
packages/ts/entity/ | new | Vendored @augmented/entity |
packages/ts/hierarchy/ | new | Vendored @augmented/hierarchy |
packages/ts/json-canvas-core/ | new | Vendored @augment/json-canvas-core |
packages/ts/json-canvas-vue/ | new | Vendored @augment/json-canvas-vue |
packages/ts/logging/ | new | Vendored @augmented/logging |
packages/ts/obsidian-bases-augment/ | new | Vendored @augment/obsidian-bases + temporariness banner |
packages/ts/render/ | new | Vendored @augmented/render |
packages/ts/utils/ | new | Vendored @augmented/utils |
packages/ts/test-vue-component/ | new | Vendored @augmented/test-vue-component |
bun.lock | modify | Root install absorbs the vendored packages |
Acceptance criteria
Section titled “Acceptance criteria”- AC-1: All eleven destination directories exist and
bun installexits 0 from a clean checkout. - AC-2:
bun testpasses in every vendored package that carries tests; packages without tests typecheck clean. - AC-3: No
pnpm-lock.yaml,package-lock.json, or.npmrcexists anywhere underpackages/ts/. - AC-4:
packages/ts/obsidian-bases-augment/README.mdnamesT-NLKFas its planned deletion. - AC-5:
moon query projectslists the vendored packages that received amoon.yml.
Out of scope
Section titled “Out of scope”- App adoptions (separate tasks:
T-JV2A,T-6C0Z,T-KTGF,T-LAKY,T-UPV1). - Rescoping
@augmented/@augmentto@sksizer(T-JCMLdecides). - obsidian-bases convergence (
T-NLKF). - Publishing any vendored package through the derived-libraries channel.
Dependencies
Section titled “Dependencies”- none — this is the first mover of the adoption; the app tasks depend on it.
Discovery context
Section titled “Discovery context”- Owner decision 2026-07-18: fold augmented_books into the monorepo, flat
layout (
apps/<name>+packages/ts/*), sharing libraries and componentry as much as possible. vimit stays behind in the source repo.
Post-mortem
Section titled “Post-mortem”Captured by /sdlc:task-work on 2026-07-18. PR: pending.
Acceptance criteria coverage
Section titled “Acceptance criteria coverage”- AC-1: agent-manual —
bun install --frozen-lockfileis clean (1830 installs across 2096 packages, no changes); all 11 destination dirs exist underpackages/ts/. - AC-2: auto —
moon run <pkg>:testpasses for every vendored package that carries tests (e.g.obsidian-bases-augment165 tests,hierarchy73); packages without tests typecheck clean under roottsc --noEmit(exit 0). - AC-3: auto — no
pnpm-lock.yaml/package-lock.json/.npmrcunderpackages/ts/. - AC-4: auto —
packages/ts/obsidian-bases-augment/README.mdnamesT-NLKFas its planned deletion. - AC-5: agent-manual —
moon query projectslists the vendored packages with theirmoon.ymltask surface (books:test,context:check, …).
What worked
Section titled “What worked”- The root Bun workspace glob (
packages/ts/*) auto-absorbed all 11 vendored packages — no rootworkspacesedit needed. - The internal workspace dep graph (
utils←entity←books;logging←books;json-canvas-core←json-canvas-vue) resolved viaworkspace:ranges under Bun without changes. - A thin
moon.ymlper package registered each into the moon build graph.
Friction and automation gaps
Section titled “Friction and automation gaps”- Vendored
@types/nodebump broke unrelatedtsc— 7 vendored packages declared@types/node ^22.x, which bun resolved as a THIRD@types/node(22.20.1) alongside the repo’s 24/26. Multiple@types/nodeversions conflict in TypeScript’s global scope and brokeEventEmitter.on()typing inapps/sdlc’s dashboard/lease tests — a failure surfacing far from the vendored code. Caught only by the Step 7 gate’stsc --noEmit, not by per-package tests. Fixed by aligning the seven to^26.1.0. Automation gap: the adoption recipe should reconcile shared dev-dependency versions (@types/node,typescript) to the monorepo’s pins as a standard step, not leave the source ranges to collide. - Native dependency needed explicit trust —
@augment/obsidian-bases’s SQLite layer pullsbetter-sqlite3(native binding), which does not build on a cleanbun installuntilbetter-sqlite3is added to the rootpackage.jsontrustedDependencies. The task’s## Files to touchasserted no root edit was needed; a vendored package with a native dep is an exception the checklist should anticipate. - Quality baseline not seeded into the worktree —
.sdlc/quality-baselines/<sha>.jsonis gitignored andgit worktree adddoes not propagate it, sosdlc quality run --diff-against-baselineneeded the file copied in by hand. (Same recurring gap asT-LAKY/T-F0B2.) Fix: task-work worktree init should seed/symlink.sdlc/quality-baselines/into new worktrees.