feat(core-consent): extend generator with consent template + fix withCapture brand propagation

- Add consent to CORE_PACKAGE_GENERATORS in turbo/generators/config.ts so
  pnpm turbo gen core-package consent is a valid command (not hand-rollable)
- Create turbo/generators/templates/core-package/consent/ mirroring the
  analytics template shape (AGENTS.md, package.json, tsconfig, turbo, vitest,
  eslint, src/index.ts scaffolds)
- Regenerate packages/core-consent/ from the new template (replaces the
  previous hand-rolled attempt that violated the generator-first rule)
- Add __consentChecked to withCapture PROPAGATED_BRANDS so the brand bubbles
  through the full withSpan→withCapture wrapper chain to the outermost binding
  that assertFeatureConformance reads

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-19 11:01:17 +00:00
parent 9cb2fa321c
commit b992fee088
14 changed files with 150 additions and 25 deletions

View File

@@ -782,17 +782,40 @@ import noRealtimeHandlerReexport from "./rules/no-realtime-handler-reexport.js";
},
printAnalyticsNextSteps,
],
consent: () => [
() => {
assertOptionalPackageNotPresent("core-consent");
return "Guard passed — packages/core-consent does not exist yet.";
},
...emitTemplateTree("core-package/consent", "packages/core-consent"),
() => {
addToTranspilePackages(
"apps/web-next/next.config.mjs",
"@repo/core-consent",
);
return "Added @repo/core-consent to transpilePackages.";
},
printConsentNextSteps,
],
};
plop.setGenerator("core-package", {
description:
"Scaffold an optional core package (realtime, events, trpc, ui, audit, analytics)",
"Scaffold an optional core package (realtime, events, trpc, ui, audit, analytics, consent)",
prompts: [
{
type: "list",
name: "name",
message: "Which optional core package?",
choices: ["analytics", "audit", "events", "realtime", "trpc", "ui"],
choices: [
"analytics",
"audit",
"consent",
"events",
"realtime",
"trpc",
"ui",
],
},
],
actions: (answers) => {
@@ -1517,6 +1540,30 @@ function printAnalyticsNextSteps(): string {
].join("\n");
}
function printConsentNextSteps(): string {
return [
"─────────────────────────────────────────────────────────────",
"@repo/core-consent scaffolded into packages/core-consent/.",
"",
"Next steps:",
"",
" 1. pnpm install # link the new workspace package",
"",
" 2. Implement consent-types.ts, consent.interface.ts, and withConsent",
" in packages/core-consent/src/ (see story 03-core-consent-foundation)",
"",
" 3. Add @repo/core-consent to feature package.json files that need consent",
"",
" 4. Wire IConsent into apps/web-next/src/server/bind-production.ts:",
' - import { type IConsent } from "@repo/core-consent";',
" - add consent field to BindAllDeps and BindProductionContext",
" - pass the consent instance into each feature binder",
"",
" 5. pnpm typecheck && pnpm lint && pnpm test",
"─────────────────────────────────────────────────────────────",
].join("\n");
}
function coreUiComponentActions(a: {
tier: "atom" | "molecule" | "organism";
name: string;