feat(tooling): pre-ship approved library traces in optional core generator templates
Each of the five optional core package generators (events, realtime, audit, trpc, ui) now copies pre-written decision: approved trace files into docs/library-decisions/ at scaffold time, covering every direct runtime dependency of that core package. This prevents a pre-commit gate failure the first time a developer runs pnpm turbo gen core-package <name> — the generator is the policy-compliant path, so the traces land by construction. - Added docs/library-decisions/*.md.hbs trace files under each of the five core-package template directories (15 files total) - Updated generator config to emit traces into workspace docs/library-decisions/ via a second emitTemplateTree call per core package - Updated all five __snapshots__/core-package/*.snapshot.json to include the new trace file entries - Added verify-doc-shas.test.ts to pin SHA256 hashes of all 15 trace templates so snapshot and file content cannot drift independently ADR refs: events→ADR-015, realtime→ADR-016, audit→ADR-018; trpc and ui cite closest ADR or null where no specific ADR exists. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -634,6 +634,11 @@ import noRealtimeHandlerReexport from "./rules/no-realtime-handler-reexport.js";
|
||||
return "Guard passed — packages/core-realtime does not exist yet.";
|
||||
},
|
||||
...emitTemplateTree("core-package/realtime", "packages/core-realtime"),
|
||||
...emitTemplateTree(
|
||||
"core-package/realtime/docs/library-decisions",
|
||||
"docs/library-decisions",
|
||||
{ force: true },
|
||||
),
|
||||
...emitTemplateTree(
|
||||
"core-package/realtime-eslint-rules",
|
||||
"packages/core-eslint/rules",
|
||||
@@ -677,6 +682,11 @@ import noRealtimeHandlerReexport from "./rules/no-realtime-handler-reexport.js";
|
||||
return "Guard passed — packages/core-events does not exist yet.";
|
||||
},
|
||||
...emitTemplateTree("core-package/events", "packages/core-events"),
|
||||
...emitTemplateTree(
|
||||
"core-package/events/docs/library-decisions",
|
||||
"docs/library-decisions",
|
||||
{ force: true },
|
||||
),
|
||||
() => {
|
||||
addToTranspilePackages(
|
||||
"apps/web-next/next.config.mjs",
|
||||
@@ -700,6 +710,11 @@ import noRealtimeHandlerReexport from "./rules/no-realtime-handler-reexport.js";
|
||||
return "Guard passed — packages/core-trpc does not exist yet.";
|
||||
},
|
||||
...emitTemplateTree("core-package/trpc", "packages/core-trpc"),
|
||||
...emitTemplateTree(
|
||||
"core-package/trpc/docs/library-decisions",
|
||||
"docs/library-decisions",
|
||||
{ force: true },
|
||||
),
|
||||
() => {
|
||||
addToTranspilePackages(
|
||||
"apps/web-next/next.config.mjs",
|
||||
@@ -715,6 +730,11 @@ import noRealtimeHandlerReexport from "./rules/no-realtime-handler-reexport.js";
|
||||
return "Guard passed — packages/core-ui does not exist yet.";
|
||||
},
|
||||
...emitTemplateTree("core-package/ui", "packages/core-ui"),
|
||||
...emitTemplateTree(
|
||||
"core-package/ui/docs/library-decisions",
|
||||
"docs/library-decisions",
|
||||
{ force: true },
|
||||
),
|
||||
() => {
|
||||
addToTranspilePackages(
|
||||
"apps/web-next/next.config.mjs",
|
||||
@@ -730,6 +750,11 @@ import noRealtimeHandlerReexport from "./rules/no-realtime-handler-reexport.js";
|
||||
return "Guard passed — packages/core-audit does not exist yet.";
|
||||
},
|
||||
...emitTemplateTree("core-package/audit", "packages/core-audit"),
|
||||
...emitTemplateTree(
|
||||
"core-package/audit/docs/library-decisions",
|
||||
"docs/library-decisions",
|
||||
{ force: true },
|
||||
),
|
||||
() => {
|
||||
addToTranspilePackages(
|
||||
"apps/web-next/next.config.mjs",
|
||||
|
||||
Reference in New Issue
Block a user