Skip to content

Latest commit

 

History

History
56 lines (50 loc) · 4.61 KB

File metadata and controls

56 lines (50 loc) · 4.61 KB

Example: pr-stack-map.md for a multi-ecosystem monorepo

What map mode produces for a fictional repo: a pnpm workspace under packages/ (shared libs + a React webapp), a Rust worker, Foundry contracts, and manifest-less infra under apps/. Every name below is invented; the shape is from a real production run.

<!-- GENERATED by pr-stack map — edit below the overrides marker only -->
<!-- hash-cmd: git ls-files -s -- packages/pnpm-workspace.yaml packages/package.json 'packages/*/package.json' 'apps/*/package.json' apps/worker/Cargo.toml apps/contracts/foundry.toml | shasum -a 256 -->
<!-- inputs-hash: 3fc9e21b0a774d5c8e6f12aa90cd44e7b81f0c3d5a26e98d417b6f20c5a3d9e1  - · generated: 2026-07-14 -->
<!-- refresh = `pnpm -C packages install --frozen-lockfile` — core/api-client are pnpm file: deps
     (snapshot-installed); consumers build against a stale copy until refresh runs. -->
| tier | layer            | side    | paths                                                            | verify |
|------|------------------|---------|------------------------------------------------------------------|--------|
| 0    | repo-config/docs | backend | *.md, LICENSE, .github/**, .gitignore, docs/**                   | none |
| 1    | workspace-root   | backend | packages/package.json, packages/pnpm-workspace.yaml, packages/pnpm-lock.yaml, packages/tsconfig.base.json | pnpm -C packages install --frozen-lockfile |
| 1    | contracts        | backend | apps/contracts/**                                                | cd apps/contracts && forge test |
| 1    | worker           | backend | apps/worker/**                                                   | cd apps/worker && cargo check && cargo test |
| 1    | infra            | backend | apps/infra/**                                                    | none (db/dashboards, no toolchain) |
| 2    | core             | backend | packages/core/**                                                 | pnpm -C packages/core check && pnpm -C packages/core lint && pnpm -C packages/core test |
| 3    | api-client       | backend | packages/api-client/**                                           | pnpm -C packages/api-client check && pnpm -C packages/api-client lint && pnpm -C packages/api-client test |
| 4    | webapp:api       | backend | packages/webapp/src/{api,config,hooks}/**, packages/webapp/package.json, packages/webapp/*.{json,ts,js,mjs}, packages/webapp/.* | refresh && pnpm -C packages/webapp check && lint && test |
| 5    | webapp:components| ui      | packages/webapp/src/components/**, packages/webapp/public/**     | refresh && pnpm -C packages/webapp check && lint && test |
| 6    | webapp:pages     | ui      | packages/webapp/src/{pages,flows}/**, packages/webapp/src/main.tsx, packages/webapp/src/app-routes.ts, packages/webapp/src/assets/** | refresh && pnpm -C packages/webapp check && lint && test |
|| unmapped         || (none at generation; new paths matching no row land here and must be flagged in the plan) ||

<!-- Layer confirmations: webapp api/components/pages split confirmed 2026-07-14 by the operator.
     Ecosystems: pnpm workspace (packages/), Rust crate (apps/worker), Foundry (apps/contracts).
     No dependency edges between ecosystems — they sort independently. -->

<!-- MANUAL OVERRIDES — survives regeneration -->
<!-- core and api-client are file: deps (snapshot-installed, not live symlinks). After editing
     one, run the refresh command before typechecking a dependent — a plain build is not
     seen by dependents. -->
<!-- api-client: 9 tests are env-gated on TESTS_RPC_URL and fail without fork config;
     that set is the green baseline, per the skill's END-baseline rule. -->

Things to notice:

  • The hash command names every manifest consulted, across all three ecosystems. Editing Cargo.toml or foundry.toml flips the hash and forces regeneration, same as any package.json.
  • Completeness is glob-level, not package-level. webapp's rows together cover every file in the package — dotfiles, main.tsx, and assets/ included. A file matching no row would fall to the package's lowest tier and its side, so a missed flows/ glob would route UI code into a backend PR.
  • The refresh macro rides in consumer recipes. core and api-client are snapshot-installed; every tier that consumes them re-installs before verifying. The producers themselves don't need it.
  • Operator knowledge survives regeneration below the overrides marker: the snapshot-dep explanation and the env-gated test baseline were both learned the hard way mid-run, then recorded here so no future run relearns them.