[E00-S01-T11] apps/packages/extensions separated #378
No Reviewers
Labels
Clear labels
agent/analyst-drafted
agent/analyst-drafted
needs/human-decision
needs/human-decision
needs/security-review
needs/security-review
tier/t0
tier/t1
tier/t2
tier/t3
kind
bug
kind
bug
kind
epic
kind
epic
kind
initiative
EPPP programme initiative
kind
story
kind
story
kind
task
EPPP engineering card/task decomposed from a story
kind
toil
kind
toil
loop
1
loop
1
loop
2
loop
2
loop
3
loop
3
risk
agent-full
risk
agent-full
risk
human-gated
risk
human-gated
risk
human-only
risk
human-only
size
l
size
l
size
m
size
m
size
s
size
s
status
blocked
status
blocked
status
done
Workflow: Done
status
in-progress
status
in-progress
status
proposed
status
proposed
status
ready
status
ready
status
review
status
review
stream
checkout
stream
checkout
stream
onboarding
stream
onboarding
stream
platform
stream
platform
trivial — implementer only, auto-merge
standard — implementer + reviewer + tester
complex — security if triggered, human merge
critical — full chain + security, human merge
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: Fabrika/PersonalBlog#378
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What changed
Locks in the [E00-S01-T11] apps/packages/extensions workspace separation (#164). The three top-level group directories (
apps/server,packages/core,extensions/example) were bootstrap-committed in E00-S01-T01 and are already reflected inpnpm-workspace.yaml,dependency-boundaries.jsonandpnpm-lock.yaml; this PR adds the regression suite that makes both acceptance criteria enforceable rather than incidental:tests/workspace-layout.test.mjs(new) — anode:testsuite (zero dependencies, lockfile untouched) that fails if the workspace layout ever drifts:apps/,packages/,extensions/;package.jsonsits exactly one level below one of the three groups — never at the root (besides the root workspace manifest), never in another directory, never nested deeper;@personal-blog/server→apps/server,@personal-blog/core→packages/core,@personal-blog/example-extension→extensions/example) and that the discovered package set is exactly the expected one;pnpm-workspace.yamldeclares exactlyapps/*,packages/*,extensions/*anddependency-boundaries.jsonmaps the same three groups to the same three directories (layout ↔ workspace/boundary config parity);lib/shared/,apps/package.json,packages/a/b/,docs/).Explicitly out of scope per the brief (not touched): strict base tsconfig (E00-S01-T10), root build/test/typecheck commands (E00-S01-T12), frozen lockfile clean install (E00-S01-T13). No CI workflow changes — test-suite wiring in CI is E00-S05 by design (same as T05–T10); the existing CI job (frozen install +
pnpm -r liston Node 24) stays green.Criterion → test table
tests/workspace-layout.test.mjs: "the workspace root contains exactly the three separated top-level group directories" — assertsapps/,packages/,extensions/all exist; "every workspace package.json sits exactly one level below its top-level group directory" — walks the tree and rejects anypackage.jsonoutside<group>/<name>/package.json. Mutation-probed: a package moved to a non-group directory fails this testtests/workspace-layout.test.mjs: "each expected package sits in the correct top-level directory" — asserts@personal-blog/serveris declared byapps/server/package.json,@personal-blog/corebypackages/core/package.json,@personal-blog/example-extensionbyextensions/example/package.json; "the discovered workspace package set is exactly the expected bootstrap set" — no extra/missing packages anywhere in the tree. Mutation-probed: movingpackages/core→apps/corefails both plus the lockfile-parity testtests/workspace-layout.test.mjs: "pnpm-workspace.yaml declares one group glob per top-level group directory" and "dependency-boundaries.json maps the three groups to the same top-level directories"tests/workspace-layout.test.mjs: "every discovered workspace package has a lockfile importer (layout ↔ lockfile parity)"tests/workspace-layout.test.mjs: "the placement validation flags mis-placed packages (non-vacuous probe)" — valid placements pass,lib/shared/,apps/package.json,packages/a/b/,docs/are flaggedTest plan executed
node_modules), Node 24 (v24.20.0):pnpm install --frozen-lockfilevia corepack → success,using pnpm v11.23.0, lockfile unchanged ✓pnpm -r list --depth -1(second CI step), Node 24 → lists all four workspace projects, exit 0 ✓node --test tests/workspace-layout.test.mjs→ 8/8 pass ✓node --test "tests/**/*.test.mjs"on Node 24 (v24.20.0) → 36/36 pass (10 architecture-import + 6 workspace-config + 5 node-engine + 3 typescript-pin + 4 strict-tsconfig + 8 workspace-layout), exit 0 ✓packages/coretemporarily moved toapps/core, three tests fail ("each expected package sits in the correct top-level directory", "the discovered workspace package set is exactly the expected bootstrap set", "every discovered workspace package has a lockfile importer") — restoring the layout returns to 36/36 ✓Risks / notes
Refs #164