refactor: strip Phase/Plan/R-number references from source comments

This commit is contained in:
2026-05-13 09:51:45 +02:00
parent 075b729266
commit 17ae157365
66 changed files with 980 additions and 647 deletions

View File

@@ -14,10 +14,10 @@ import {
/**
* Turbo generator: `feature`
*
* Scaffolds a Lazar-conformant feature package under `packages/<name>/`
* Scaffolds a feature package under `packages/<name>/`
* matching the shape of the existing `navigation` reference feature.
*
* Phase 1 scope (intentionally limited):
* Scope (intentionally limited):
* - Single entity, single use case (`getX`)
* - Skips Payload CMS collection/global templates (integrations/cms/**)
* - Skips UI query helpers (ui/query.ts) — emits an empty barrel
@@ -38,8 +38,7 @@ export default function generator(plop: PlopTypes.NodePlopAPI): void {
plop.setHelper("eq", (a: unknown, b: unknown) => a === b);
plop.setGenerator("feature", {
description:
"Scaffold a Lazar-conformant feature package (single entity / single use case)",
description: "Scaffold a feature package (single entity / single use case)",
prompts: [
{
type: "input",
@@ -135,7 +134,8 @@ export default function generator(plop: PlopTypes.NodePlopAPI): void {
{
type: "add",
path: "packages/{{kebabCase name}}/src/entities/models/{{kebabCase entity}}.test.ts",
templateFile: "templates/feature/src/entities/models/entity.test.ts.hbs",
templateFile:
"templates/feature/src/entities/models/entity.test.ts.hbs",
},
{
type: "add",
@@ -255,7 +255,8 @@ export default function generator(plop: PlopTypes.NodePlopAPI): void {
{
type: "add",
path: "packages/{{kebabCase name}}/src/integrations/api/procedures.ts",
templateFile: "templates/feature/src/integrations/api/procedures.ts.hbs",
templateFile:
"templates/feature/src/integrations/api/procedures.ts.hbs",
},
{
type: "add",
@@ -265,10 +266,11 @@ export default function generator(plop: PlopTypes.NodePlopAPI): void {
{
type: "add",
path: "packages/{{kebabCase name}}/src/integrations/api/router.test.ts",
templateFile: "templates/feature/src/integrations/api/router.test.ts.hbs",
templateFile:
"templates/feature/src/integrations/api/router.test.ts.hbs",
},
// Seeds + factories + contracts (Phase 1: minimal stubs that still typecheck/test)
// Seeds + factories + contracts (minimal stubs that still typecheck/test)
{
type: "add",
path: "packages/{{kebabCase name}}/src/__seeds__/dev.ts",
@@ -282,7 +284,8 @@ export default function generator(plop: PlopTypes.NodePlopAPI): void {
{
type: "add",
path: "packages/{{kebabCase name}}/src/__factories__/{{kebabCase entity}}.factory.ts",
templateFile: "templates/feature/src/__factories__/entity.factory.ts.hbs",
templateFile:
"templates/feature/src/__factories__/entity.factory.ts.hbs",
},
{
type: "add",
@@ -291,7 +294,7 @@ export default function generator(plop: PlopTypes.NodePlopAPI): void {
"templates/feature/src/__contracts__/entity-repository.contract.ts.hbs",
},
// ui — empty barrel for Phase 1 (./ui subpath kept reserved)
// ui — empty barrel (./ui subpath kept reserved)
{
type: "add",
path: "packages/{{kebabCase name}}/src/ui/index.ts",
@@ -300,7 +303,11 @@ export default function generator(plop: PlopTypes.NodePlopAPI): void {
// Final manual-wiring instructions printed to the user
function printNextSteps(answers: Record<string, unknown>): string {
const a = answers as { name: string; entity: string; entityPlural: string };
const a = answers as {
name: string;
entity: string;
entityPlural: string;
};
const kebab = a.name;
const constSym = a.name.toUpperCase().replace(/-/g, "_");
const pkg = `@repo/${kebab}`;
@@ -602,11 +609,18 @@ import noRealtimeHandlerReexport from "./rules/no-realtime-handler-reexport.js";
"packages/core-eslint/rules",
),
() => {
addToTranspilePackages("apps/web-next/next.config.mjs", "@repo/core-realtime");
addToTranspilePackages(
"apps/web-next/next.config.mjs",
"@repo/core-realtime",
);
return "Added @repo/core-realtime to transpilePackages.";
},
() => {
addBoundariesEntry("packages/core-eslint/base.js", "packages/core-realtime", { mode: "folder" });
addBoundariesEntry(
"packages/core-eslint/base.js",
"packages/core-realtime",
{ mode: "folder" },
);
return "Added core-realtime boundaries entry.";
},
() => {
@@ -634,7 +648,10 @@ import noRealtimeHandlerReexport from "./rules/no-realtime-handler-reexport.js";
},
...emitTemplateTree("core-package/events", "packages/core-events"),
() => {
addToTranspilePackages("apps/web-next/next.config.mjs", "@repo/core-events");
addToTranspilePackages(
"apps/web-next/next.config.mjs",
"@repo/core-events",
);
return "Added @repo/core-events to transpilePackages.";
},
() => {
@@ -654,7 +671,10 @@ import noRealtimeHandlerReexport from "./rules/no-realtime-handler-reexport.js";
},
...emitTemplateTree("core-package/trpc", "packages/core-trpc"),
() => {
addToTranspilePackages("apps/web-next/next.config.mjs", "@repo/core-trpc");
addToTranspilePackages(
"apps/web-next/next.config.mjs",
"@repo/core-trpc",
);
return "Added @repo/core-trpc to transpilePackages.";
},
printTrpcNextSteps,
@@ -666,7 +686,10 @@ import noRealtimeHandlerReexport from "./rules/no-realtime-handler-reexport.js";
},
...emitTemplateTree("core-package/ui", "packages/core-ui"),
() => {
addToTranspilePackages("apps/web-next/next.config.mjs", "@repo/core-ui");
addToTranspilePackages(
"apps/web-next/next.config.mjs",
"@repo/core-ui",
);
return "Added @repo/core-ui to transpilePackages.";
},
printUiNextSteps,
@@ -678,7 +701,10 @@ import noRealtimeHandlerReexport from "./rules/no-realtime-handler-reexport.js";
},
...emitTemplateTree("core-package/audit", "packages/core-audit"),
() => {
addToTranspilePackages("apps/web-next/next.config.mjs", "@repo/core-audit");
addToTranspilePackages(
"apps/web-next/next.config.mjs",
"@repo/core-audit",
);
return "Added @repo/core-audit to transpilePackages.";
},
printAuditNextSteps,
@@ -686,7 +712,8 @@ import noRealtimeHandlerReexport from "./rules/no-realtime-handler-reexport.js";
};
plop.setGenerator("core-package", {
description: "Scaffold an optional core package (realtime, events, trpc, ui, audit)",
description:
"Scaffold an optional core package (realtime, events, trpc, ui, audit)",
prompts: [
{
type: "list",
@@ -949,7 +976,9 @@ function consumeActions(a: {
const cmsIndexFile = `packages/${a.feature}/src/integrations/cms/index.ts`;
return [
() => {
assertAnchors(process.cwd(), symbolFile, ["// <gen:event-handler-symbols>"]);
assertAnchors(process.cwd(), symbolFile, [
"// <gen:event-handler-symbols>",
]);
assertAnchors(process.cwd(), bindProdFile, ["// <gen:event-handlers>"]);
assertAnchors(process.cwd(), bindDevFile, ["// <gen:event-handlers>"]);
assertAnchors(process.cwd(), cmsIndexFile, ["// <gen:job-tasks>"]);
@@ -1153,7 +1182,9 @@ function realtimeHandlerActions(a: {
assertAnchors(process.cwd(), symbolFile, [
"// <gen:realtime-handler-symbols>",
]);
assertAnchors(process.cwd(), bindProdFile, ["// <gen:realtime-handlers>"]);
assertAnchors(process.cwd(), bindProdFile, [
"// <gen:realtime-handlers>",
]);
assertAnchors(process.cwd(), bindDevFile, ["// <gen:realtime-handlers>"]);
return "All required anchors present";
},
@@ -1241,7 +1272,7 @@ function printTrpcNextSteps(): string {
"",
" 2. apps/web-next/src/app/providers.tsx:",
' - import { NextTrpcProvider } from "@repo/core-trpc/next";',
" - wrap children: <NextTrpcProvider trpcUrl=\"/api/trpc\">{children}</NextTrpcProvider>",
' - wrap children: <NextTrpcProvider trpcUrl="/api/trpc">{children}</NextTrpcProvider>',
"",
" 3. apps/web-next/src/app/api/trpc/[trpc]/route.ts:",
' - import { fetchRequestHandler } from "@trpc/server/adapters/fetch";',
@@ -1250,7 +1281,7 @@ function printTrpcNextSteps(): string {
"",
" 4. apps/web-tanstack/src/routes/__root.tsx:",
' - import { TanstackTrpcProvider } from "@repo/core-trpc/tanstack";',
" - wrap <Outlet /> with <TanstackTrpcProvider trpcUrl=\"http://localhost:3000/api/trpc\">",
' - wrap <Outlet /> with <TanstackTrpcProvider trpcUrl="http://localhost:3000/api/trpc">',
"",
" 5. Add @repo/core-trpc to apps/web-next/package.json and apps/web-tanstack/package.json dependencies",
"",
@@ -1358,7 +1389,7 @@ function printAuditNextSteps(): string {
"",
"3. Mount the admin tRPC router in packages/core-api/src/root.ts:",
' import { createAuditRouter } from "@repo/core-audit/api";',
" // const { auditLog } = bindAudit(container, { payloadConfig, sinks: [\"payload\", \"stdout\"] });",
' // const { auditLog } = bindAudit(container, { payloadConfig, sinks: ["payload", "stdout"] });',
" // routers: { ..., audit: createAuditRouter(auditLog) },",
"",
"4. Bind audit in apps/web-next/src/server/bind-production.ts:",
@@ -1371,7 +1402,7 @@ function printAuditNextSteps(): string {
"5. Install user-collection hooks (recommended for DPA compliance):",
" In packages/auth/src/di/bind-production.ts, gate on ctx.auditLog:",
" if (ctx.auditLog) {",
' const { createAuditErasureHook, createAuditAfterReadHook } =',
" const { createAuditErasureHook, createAuditAfterReadHook } =",
' await import("@repo/core-audit/hooks");',
" // wire onto users collection — see docs/guides/audit-and-compliance.md",
" }",