@shrkcrft/presets 0.1.0-alpha.2 → 0.1.0-alpha.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/builtin/angular21-presets.d.ts +9 -0
  2. package/dist/builtin/angular21-presets.d.ts.map +1 -0
  3. package/dist/builtin/angular21-presets.js +218 -0
  4. package/dist/builtin/angular21-snippets.d.ts +28 -0
  5. package/dist/builtin/angular21-snippets.d.ts.map +1 -0
  6. package/dist/builtin/angular21-snippets.js +243 -0
  7. package/dist/builtin/builtin-presets.d.ts.map +1 -1
  8. package/dist/builtin/builtin-presets.js +40 -19
  9. package/dist/builtin/nest11-presets.d.ts +11 -0
  10. package/dist/builtin/nest11-presets.d.ts.map +1 -0
  11. package/dist/builtin/nest11-presets.js +257 -0
  12. package/dist/builtin/nest11-snippets.d.ts +32 -0
  13. package/dist/builtin/nest11-snippets.d.ts.map +1 -0
  14. package/dist/builtin/nest11-snippets.js +270 -0
  15. package/dist/builtin/r26-presets.d.ts +1 -3
  16. package/dist/builtin/r26-presets.d.ts.map +1 -1
  17. package/dist/builtin/r26-presets.js +5 -33
  18. package/dist/builtin/r26-snippets.d.ts +0 -2
  19. package/dist/builtin/r26-snippets.d.ts.map +1 -1
  20. package/dist/builtin/r26-snippets.js +0 -16
  21. package/dist/builtin/r45-presets.d.ts +1 -1
  22. package/dist/builtin/r45-presets.d.ts.map +1 -1
  23. package/dist/builtin/r45-presets.js +5 -5
  24. package/dist/builtin/r47-presets.d.ts +1 -1
  25. package/dist/builtin/r47-presets.d.ts.map +1 -1
  26. package/dist/builtin/r47-presets.js +4 -4
  27. package/dist/builtin/react19-presets.d.ts +12 -0
  28. package/dist/builtin/react19-presets.d.ts.map +1 -0
  29. package/dist/builtin/react19-presets.js +299 -0
  30. package/dist/builtin/react19-snippets.d.ts +43 -0
  31. package/dist/builtin/react19-snippets.d.ts.map +1 -0
  32. package/dist/builtin/react19-snippets.js +363 -0
  33. package/dist/builtin/shared-snippets.d.ts +25 -3
  34. package/dist/builtin/shared-snippets.d.ts.map +1 -1
  35. package/dist/builtin/shared-snippets.js +265 -0
  36. package/dist/emit/synthesize-files.d.ts.map +1 -1
  37. package/dist/emit/synthesize-files.js +76 -17
  38. package/dist/registry/recommend.d.ts.map +1 -1
  39. package/dist/registry/recommend.js +7 -3
  40. package/package.json +5 -5
@@ -0,0 +1,270 @@
1
+ // NestJS 11+ rule snippets.
2
+ //
3
+ // Covers the modern Nest service surface: module structure, thin
4
+ // controllers, DTOs with class-validator, the global ValidationPipe with
5
+ // strict options, async providers + lifecycle hooks, graceful shutdown,
6
+ // the Fastify adapter, caching, throttling, helmet, explicit CORS, JWT
7
+ // auth, structured logging via the Nest Logger, @nestjs/terminus health
8
+ // checks, and the TestingModule patterns for unit + supertest e2e.
9
+ //
10
+ // Each snippet is a string injected verbatim into a generated
11
+ // `sharkcraft/*.ts` file; `defineKnowledgeEntry`, `KnowledgeType`, and
12
+ // `KnowledgePriority` are provided by the local-mirror preamble the
13
+ // synthesizer prepends to the file.
14
+ import { ruleSnippet } from "./r26-snippets.js";
15
+ // ─── Architecture: modules, controllers, services, repos ──────────────────
16
+ export const NEST11_THIN_CONTROLLERS = ruleSnippet({
17
+ id: 'nest11.thin-controllers',
18
+ title: 'Controllers are thin — no business logic',
19
+ priority: 'critical',
20
+ tags: ['nestjs', 'nest-11', 'architecture'],
21
+ appliesWhen: ['generate-controller', 'review'],
22
+ content: 'Controllers parse the request (params/query/body via DTOs), call ONE service method, and return the result. No conditionals over domain rules, no inline database access, no orchestration of multiple services. If a controller method body is more than a handful of lines or branches on domain state, the logic belongs in a service.',
23
+ });
24
+ export const NEST11_SERVICE_OWNS_DOMAIN = ruleSnippet({
25
+ id: 'nest11.service-owns-domain',
26
+ title: 'Services own domain logic; repositories own data access',
27
+ priority: 'high',
28
+ tags: ['nestjs', 'nest-11', 'architecture'],
29
+ appliesWhen: ['generate-service', 'review'],
30
+ content: 'Services express domain rules and orchestrate work. Data access lives behind a repository (TypeORM Repository, Prisma client, or a hand-rolled interface). Services depend on repository interfaces, not on the ORM directly — that boundary is what makes unit tests cheap.',
31
+ });
32
+ export const NEST11_MODULE_PER_FEATURE = ruleSnippet({
33
+ id: 'nest11.module-per-feature',
34
+ title: 'Module per feature, not per layer',
35
+ priority: 'high',
36
+ tags: ['nestjs', 'nest-11', 'architecture'],
37
+ appliesWhen: ['create-feature'],
38
+ content: 'Each feature gets its own module under src/<feature>/ owning controller(s), service(s), DTOs, and (optionally) entities. Top-level grab-bags like ControllersModule / ServicesModule are an anti-pattern — they couple every feature to every other.',
39
+ });
40
+ export const NEST11_MODULE_PUBLIC_API = ruleSnippet({
41
+ id: 'nest11.module-public-api',
42
+ title: 'Each module exports its public API only',
43
+ priority: 'high',
44
+ tags: ['nestjs', 'nest-11', 'architecture', 'boundaries'],
45
+ appliesWhen: ['generate-code', 'review'],
46
+ content: 'A module\'s `exports: [...]` lists exactly the providers other modules may inject. Internal services stay unexported. Avoid `exports: [SomeModule]` re-exports unless you intentionally want the entire surface to be transitive.',
47
+ });
48
+ export const NEST11_NO_CIRCULAR_MODULES = ruleSnippet({
49
+ id: 'nest11.no-circular-modules',
50
+ title: 'Avoid circular module dependencies',
51
+ priority: 'critical',
52
+ tags: ['nestjs', 'nest-11', 'architecture'],
53
+ appliesWhen: ['generate-code', 'review'],
54
+ content: 'If module A imports module B and B imports A, extract the shared piece into a third module that both depend on. `forwardRef()` exists to escape genuine cycles in the dependency graph, not to paper over a missing abstraction.',
55
+ });
56
+ export const NEST11_DTO_AT_BOUNDARY = ruleSnippet({
57
+ id: 'nest11.dto-at-boundary',
58
+ title: 'DTOs at the HTTP boundary; never expose entities',
59
+ priority: 'critical',
60
+ tags: ['nestjs', 'nest-11', 'dto', 'security'],
61
+ appliesWhen: ['generate-controller', 'generate-dto'],
62
+ content: 'Request shapes live in `<feature>.dto.ts`; response shapes either in a dedicated response DTO or as a serialized projection. Never return an ORM entity directly — that leaks internal columns (audit fields, soft-delete flags, foreign keys) and couples your HTTP contract to your schema.',
63
+ });
64
+ // ─── Validation: ValidationPipe + class-validator ─────────────────────────
65
+ export const NEST11_GLOBAL_VALIDATION_PIPE = ruleSnippet({
66
+ id: 'nest11.global-validation-pipe',
67
+ title: 'Global ValidationPipe with whitelist + forbidNonWhitelisted + transform',
68
+ priority: 'critical',
69
+ tags: ['nestjs', 'nest-11', 'validation', 'security'],
70
+ appliesWhen: ['bootstrap'],
71
+ content: 'main.ts registers a global ValidationPipe: `app.useGlobalPipes(new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true, transformOptions: { enableImplicitConversion: true } }))`. whitelist strips unknown properties, forbidNonWhitelisted rejects them, transform turns plain objects into the DTO class so class-validator + class-transformer decorators fire.',
72
+ });
73
+ export const NEST11_CLASS_VALIDATOR_DTO = ruleSnippet({
74
+ id: 'nest11.class-validator-dto',
75
+ title: 'DTOs are classes with class-validator decorators',
76
+ priority: 'critical',
77
+ tags: ['nestjs', 'nest-11', 'validation', 'dto'],
78
+ appliesWhen: ['generate-dto'],
79
+ content: 'Define DTOs as classes (not interfaces) so class-validator can attach metadata. Use @IsString, @IsInt, @IsEmail, @IsUUID, @Length, @Min, @Max, @IsOptional, @IsEnum, @IsArray + @ValidateNested + @Type(() => Inner). Mark optional fields with @IsOptional() + a `?` on the property; the ValidationPipe will skip them when absent.',
80
+ });
81
+ export const NEST11_REQUEST_RESPONSE_DTOS = ruleSnippet({
82
+ id: 'nest11.request-response-dtos',
83
+ title: 'Separate request DTOs from response DTOs',
84
+ priority: 'high',
85
+ tags: ['nestjs', 'nest-11', 'dto'],
86
+ appliesWhen: ['generate-dto', 'generate-controller'],
87
+ content: 'CreateXDto, UpdateXDto, and XResponseDto are distinct classes — even when fields overlap. PartialType(CreateXDto) and PickType / OmitType from @nestjs/mapped-types compose them without duplication. This keeps the input surface (validated) and output surface (serialized) under independent control.',
88
+ });
89
+ export const NEST11_SWAGGER_DECORATORS = ruleSnippet({
90
+ id: 'nest11.swagger-decorators',
91
+ title: 'Annotate DTOs with @ApiProperty for OpenAPI',
92
+ priority: 'medium',
93
+ tags: ['nestjs', 'nest-11', 'openapi', 'swagger'],
94
+ appliesWhen: ['generate-dto'],
95
+ content: 'Pair each class-validator decorator with @ApiProperty / @ApiPropertyOptional from @nestjs/swagger. Set example, description, enum, and type explicitly — Swagger UI is the canonical contract reference for clients.',
96
+ });
97
+ // ─── Async lifecycle + graceful shutdown ──────────────────────────────────
98
+ export const NEST11_LIFECYCLE_HOOKS = ruleSnippet({
99
+ id: 'nest11.lifecycle-hooks',
100
+ title: 'Use Nest lifecycle hooks, not raw process events',
101
+ priority: 'high',
102
+ tags: ['nestjs', 'nest-11', 'lifecycle'],
103
+ appliesWhen: ['generate-service'],
104
+ content: 'Implement OnModuleInit / OnApplicationBootstrap for warm-up, OnModuleDestroy / OnApplicationShutdown for teardown. They run in DI-resolution order, so dependencies of a provider are still live during its destroy hook. Don\'t hook process.on(\'SIGTERM\') directly — Nest already wires it via enableShutdownHooks().',
105
+ });
106
+ export const NEST11_ENABLE_SHUTDOWN_HOOKS = ruleSnippet({
107
+ id: 'nest11.enable-shutdown-hooks',
108
+ title: 'Call app.enableShutdownHooks() in main.ts',
109
+ priority: 'high',
110
+ tags: ['nestjs', 'nest-11', 'lifecycle'],
111
+ appliesWhen: ['bootstrap'],
112
+ content: 'Without enableShutdownHooks() the OnModuleDestroy / OnApplicationShutdown hooks never fire on SIGTERM, leaving connections (DB pools, Kafka clients, etc.) dangling. Call it before app.listen().',
113
+ });
114
+ export const NEST11_ASYNC_PROVIDERS = ruleSnippet({
115
+ id: 'nest11.async-providers',
116
+ title: 'Use useFactory for async configuration providers',
117
+ priority: 'medium',
118
+ tags: ['nestjs', 'nest-11', 'di'],
119
+ appliesWhen: ['generate-module'],
120
+ content: 'Configuration that must be resolved at boot (env, secrets vault, schema generation) goes through `{ provide: TOKEN, useFactory: async (cfg) => …, inject: [ConfigService] }`. Don\'t lazy-load it inside a service\'s onModuleInit — that delays the readiness signal.',
121
+ });
122
+ // ─── Performance: Fastify, cache, throttler, pagination ──────────────────
123
+ export const NEST11_FASTIFY_ADAPTER = ruleSnippet({
124
+ id: 'nest11.fastify-adapter',
125
+ title: 'Use the Fastify adapter for high-throughput services',
126
+ priority: 'high',
127
+ tags: ['nestjs', 'nest-11', 'performance'],
128
+ appliesWhen: ['bootstrap'],
129
+ content: 'NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter()) gives ~2× the RPS of the default Express adapter and matches Nest\'s typed-decorator surface. Only stay on Express if you need a middleware that isn\'t available for Fastify (rare).',
130
+ });
131
+ export const NEST11_CACHE_MANAGER = ruleSnippet({
132
+ id: 'nest11.cache-manager',
133
+ title: 'Cache idempotent GETs via @nestjs/cache-manager',
134
+ priority: 'medium',
135
+ tags: ['nestjs', 'nest-11', 'performance'],
136
+ appliesWhen: ['generate-controller', 'optimize'],
137
+ content: 'Register CacheModule with a TTL appropriate to the data (seconds for hot reads, minutes for slowly-changing references). Decorate idempotent GET endpoints with @UseInterceptors(CacheInterceptor) or inject CACHE_MANAGER for explicit key-based caches. Never cache user-private responses without a per-user key.',
138
+ });
139
+ export const NEST11_THROTTLER = ruleSnippet({
140
+ id: 'nest11.throttler',
141
+ title: 'Rate-limit with @nestjs/throttler',
142
+ priority: 'high',
143
+ tags: ['nestjs', 'nest-11', 'performance', 'security'],
144
+ appliesWhen: ['bootstrap', 'generate-controller'],
145
+ content: 'Register ThrottlerModule globally with sane defaults (e.g. 60 requests / minute / IP), then loosen or tighten per route via @Throttle({ default: { limit, ttl } }) or @SkipThrottle() for internal endpoints. Without throttler a single client can DOS your service trivially.',
146
+ });
147
+ export const NEST11_PAGINATION_BY_DEFAULT = ruleSnippet({
148
+ id: 'nest11.pagination-by-default',
149
+ title: 'List endpoints paginate by default',
150
+ priority: 'high',
151
+ tags: ['nestjs', 'nest-11', 'performance'],
152
+ appliesWhen: ['generate-controller'],
153
+ content: 'Every list endpoint accepts `?page=1&pageSize=20` (or cursor-based) and caps pageSize server-side (e.g. max 100). Returning an unbounded array works on day 1 and dies in week 3 — paginate from the start so the contract never has to break.',
154
+ });
155
+ // ─── Security: helmet, CORS, auth, secrets ────────────────────────────────
156
+ export const NEST11_HELMET = ruleSnippet({
157
+ id: 'nest11.helmet',
158
+ title: 'Register helmet for HTTP security headers',
159
+ priority: 'critical',
160
+ tags: ['nestjs', 'nest-11', 'security'],
161
+ appliesWhen: ['bootstrap'],
162
+ content: 'Add `app.register(helmet)` (Fastify) or `app.use(helmet())` (Express) before any route is mounted. helmet sets X-Content-Type-Options, X-Frame-Options, Strict-Transport-Security, and CSP defaults. Skipping it leaves you on every "missing security header" audit.',
163
+ });
164
+ export const NEST11_EXPLICIT_CORS = ruleSnippet({
165
+ id: 'nest11.explicit-cors',
166
+ title: 'CORS allowlist — never `origin: true` in production',
167
+ priority: 'critical',
168
+ tags: ['nestjs', 'nest-11', 'security'],
169
+ appliesWhen: ['bootstrap'],
170
+ content: 'Configure CORS with an explicit `origin: ["https://app.example.com"]` array (or a function that validates against an allowlist). `origin: true` reflects whatever the request sent — fine for local dev, catastrophic in prod for any cookie-/credential-bearing endpoint.',
171
+ });
172
+ export const NEST11_JWT_GUARDS = ruleSnippet({
173
+ id: 'nest11.jwt-guards',
174
+ title: 'Authentication via Guards, not middleware',
175
+ priority: 'high',
176
+ tags: ['nestjs', 'nest-11', 'security', 'auth'],
177
+ appliesWhen: ['generate-controller'],
178
+ content: 'Auth runs through @nestjs/passport + a JwtAuthGuard (or custom AuthGuard) applied via @UseGuards() at controller or method level. Guards see the full execution context (request, handler metadata) and integrate with @SetMetadata for role-based / permission-based checks. Middleware can\'t do that.',
179
+ });
180
+ export const NEST11_NO_SECRETS_IN_CODE = ruleSnippet({
181
+ id: 'nest11.no-secrets-in-code',
182
+ title: 'Secrets come from the env, never from source',
183
+ priority: 'critical',
184
+ tags: ['nestjs', 'nest-11', 'security'],
185
+ appliesWhen: ['generate-code', 'review'],
186
+ content: 'JWT signing keys, DB passwords, third-party API keys, encryption secrets — all loaded through @nestjs/config (ConfigService.get) from environment variables, .env (local only, in .gitignore), or a vault. A literal secret in a `.ts` file is a CVE waiting for a commit.',
187
+ });
188
+ export const NEST11_TRUST_PROXY_AWARE = ruleSnippet({
189
+ id: 'nest11.trust-proxy-aware',
190
+ title: 'Configure trust-proxy when behind a load balancer',
191
+ priority: 'medium',
192
+ tags: ['nestjs', 'nest-11', 'security'],
193
+ appliesWhen: ['bootstrap'],
194
+ content: 'When the service runs behind an ALB / Cloudflare / nginx, set the trust-proxy option on the adapter so req.ip + X-Forwarded-For resolve correctly. Otherwise throttler keys, audit logs, and rate-limiting all degenerate to the proxy\'s IP.',
195
+ });
196
+ // ─── Observability: Logger, structured logs, terminus ────────────────────
197
+ export const NEST11_LOGGER_WITH_CONTEXT = ruleSnippet({
198
+ id: 'nest11.logger-with-context',
199
+ title: 'Logger instances carry a context name',
200
+ priority: 'high',
201
+ tags: ['nestjs', 'nest-11', 'observability'],
202
+ appliesWhen: ['generate-service'],
203
+ content: 'In each provider, do `private readonly logger = new Logger(MyService.name)`. The context name appears in every log line so filtering by component is trivial. Don\'t share a single Logger instance across the app — you lose the grouping.',
204
+ });
205
+ export const NEST11_STRUCTURED_LOGS = ruleSnippet({
206
+ id: 'nest11.structured-logs',
207
+ title: 'JSON-structured logs in production (pino or nest-winston)',
208
+ priority: 'high',
209
+ tags: ['nestjs', 'nest-11', 'observability'],
210
+ appliesWhen: ['bootstrap', 'configure'],
211
+ content: 'Plug a structured logger (nestjs-pino or nest-winston) and route the Nest Logger through it. Production logs are JSON one-line records that ship cleanly into Loki / CloudWatch / Datadog. The default ConsoleLogger is fine for dev only.',
212
+ });
213
+ export const NEST11_NO_LOG_SECRETS = ruleSnippet({
214
+ id: 'nest11.no-log-secrets',
215
+ title: 'Never log secrets, tokens, PII, or full request bodies',
216
+ priority: 'critical',
217
+ tags: ['nestjs', 'nest-11', 'observability', 'security'],
218
+ appliesWhen: ['generate-code', 'review'],
219
+ content: 'Redact Authorization headers, JWTs, passwords, credit-card numbers, government IDs, and full request/response bodies that may contain user data. Configure the logger redact paths once (pino: redact: [\'req.headers.authorization\', \'body.password\']) so the discipline survives drive-by edits.',
220
+ });
221
+ export const NEST11_TERMINUS_HEALTH = ruleSnippet({
222
+ id: 'nest11.terminus-health',
223
+ title: 'Expose /health via @nestjs/terminus with liveness + readiness',
224
+ priority: 'high',
225
+ tags: ['nestjs', 'nest-11', 'observability'],
226
+ appliesWhen: ['generate-controller'],
227
+ content: 'Use @nestjs/terminus HealthCheckService to compose indicators (db.pingCheck, http.pingCheck, memory.heapCheck). Expose /health/liveness (process is up) AND /health/readiness (deps are reachable) separately — Kubernetes treats them differently. Don\'t return 200 from readiness when the DB is down.',
228
+ });
229
+ // ─── Testing: TestingModule + e2e ────────────────────────────────────────
230
+ export const NEST11_TESTING_MODULE = ruleSnippet({
231
+ id: 'nest11.testing-module',
232
+ title: 'Unit tests use Test.createTestingModule + overrideProvider',
233
+ priority: 'high',
234
+ tags: ['nestjs', 'nest-11', 'testing'],
235
+ appliesWhen: ['generate-test'],
236
+ content: 'Build a TestingModule that imports the module under test, then `overrideProvider(SlowDep).useValue(mock)` for whatever you want to fake. Resolve the unit under test with `module.get(MyService)`. Avoid `new MyService(...)` outside of testing the constructor itself — DI is part of the contract.',
237
+ });
238
+ export const NEST11_E2E_SUPERTEST = ruleSnippet({
239
+ id: 'nest11.e2e-supertest',
240
+ title: 'E2E with supertest against the real AppModule',
241
+ priority: 'high',
242
+ tags: ['nestjs', 'nest-11', 'testing'],
243
+ appliesWhen: ['generate-test'],
244
+ content: 'E2E tests bootstrap a TestingModule from AppModule, build a Nest application, and drive it with supertest (`request(app.getHttpServer()).get(...)`). Override only the truly slow/expensive deps (external HTTP, message brokers); keep the validation pipeline, guards, and interceptors live — that\'s the contract being tested.',
245
+ });
246
+ export const NEST11_TEST_FILE_LAYOUT = ruleSnippet({
247
+ id: 'nest11.test-file-layout',
248
+ title: 'Unit specs co-located; e2e under test/',
249
+ priority: 'medium',
250
+ tags: ['nestjs', 'nest-11', 'testing'],
251
+ appliesWhen: ['generate-test'],
252
+ content: 'Unit specs live next to the unit (`users.service.spec.ts` beside `users.service.ts`). E2E specs live under `test/*.e2e-spec.ts` — Nest\'s default jest-e2e.json glob matches that pattern. Don\'t mix the two; they have different setup costs and different debugging stories.',
253
+ });
254
+ // ─── API design ──────────────────────────────────────────────────────────
255
+ export const NEST11_API_VERSIONING = ruleSnippet({
256
+ id: 'nest11.api-versioning',
257
+ title: 'Enable versioning when the contract is consumed externally',
258
+ priority: 'medium',
259
+ tags: ['nestjs', 'nest-11', 'api'],
260
+ appliesWhen: ['bootstrap', 'generate-controller'],
261
+ content: 'For any service whose API has external consumers, call `app.enableVersioning({ type: VersioningType.URI, defaultVersion: \'1\' })` at bootstrap. Annotate controllers with @Controller({ path: \'users\', version: \'1\' }). Breaking changes ship as v2 alongside v1 — never as a silent overwrite.',
262
+ });
263
+ export const NEST11_NO_QUERY_IN_CONTROLLER = ruleSnippet({
264
+ id: 'nest11.no-query-in-controller',
265
+ title: 'Never query the database from a controller',
266
+ priority: 'high',
267
+ tags: ['nestjs', 'nest-11', 'architecture'],
268
+ appliesWhen: ['generate-controller', 'review'],
269
+ content: 'Repositories are injected into services, not controllers. A controller that imports `Repository<User>` or `prisma.user` directly is on the path to a 600-line "controller that does everything" — back it out into a service.',
270
+ });
@@ -14,10 +14,8 @@ export declare const ANGULAR_PERFORMANCE: IPreset;
14
14
  export declare const ANGULAR_TESTING: IPreset;
15
15
  export declare const ANGULAR_ACCESSIBILITY: IPreset;
16
16
  export declare const ANGULAR_SECURITY: IPreset;
17
- export declare const ANGULAR_PLUGIN_PLATFORM: IPreset;
18
17
  export declare const ANGULAR_ENTERPRISE_APP: IPreset;
19
18
  export declare const ANGULAR_LIBRARY: IPreset;
20
- export declare const ANGULAR_SMART_UI_PLATFORM: IPreset;
21
19
  export declare const VITEST_FOCUSED: IPreset;
22
20
  export declare const JEST_FOCUSED: IPreset;
23
21
  export declare const PLAYWRIGHT_FOCUSED: IPreset;
@@ -27,5 +25,5 @@ export declare const WEB_COMPONENT_LIBRARY: IPreset;
27
25
  export declare const NESTJS_SERVICE: IPreset;
28
26
  export declare const EXPRESS_SERVICE: IPreset;
29
27
  export declare const FASTIFY_SERVICE: IPreset;
30
- export declare const R26_PRESETS: readonly IPreset[];
28
+ export declare const MULTI_STACK_PRESETS: readonly IPreset[];
31
29
  //# sourceMappingURL=r26-presets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"r26-presets.d.ts","sourceRoot":"","sources":["../../src/builtin/r26-presets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AA+ClD,eAAO,MAAM,iBAAiB,EAAE,OAe9B,CAAC;AAEH,eAAO,MAAM,yBAAyB,EAAE,OAgBtC,CAAC;AAEH,eAAO,MAAM,uBAAuB,EAAE,OAoBpC,CAAC;AAIH,eAAO,MAAM,iBAAiB,EAAE,OAgC9B,CAAC;AAEH,eAAO,MAAM,YAAY,EAAE,OAiBzB,CAAC;AAEH,eAAO,MAAM,WAAW,EAAE,OAiBxB,CAAC;AAIH,eAAO,MAAM,cAAc,EAAE,OAmC3B,CAAC;AAEH,eAAO,MAAM,qBAAqB,EAAE,OAelC,CAAC;AAEH,eAAO,MAAM,wBAAwB,EAAE,OAerC,CAAC;AAEH,eAAO,MAAM,6BAA6B,EAAE,OAe1C,CAAC;AAEH,eAAO,MAAM,+BAA+B,EAAE,OAe5C,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,OAehC,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,OAe5B,CAAC;AAEH,eAAO,MAAM,qBAAqB,EAAE,OAelC,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,OAe7B,CAAC;AAEH,eAAO,MAAM,uBAAuB,EAAE,OAepC,CAAC;AAEH,eAAO,MAAM,sBAAsB,EAAE,OASnC,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,OAS5B,CAAC;AAEH,eAAO,MAAM,yBAAyB,EAAE,OAStC,CAAC;AAIH,eAAO,MAAM,cAAc,EAAE,OAQ3B,CAAC;AAEH,eAAO,MAAM,YAAY,EAAE,OAQzB,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,OAO/B,CAAC;AAIH,eAAO,MAAM,gBAAgB,EAAE,OAS7B,CAAC;AAEH,eAAO,MAAM,cAAc,EAAE,OAS3B,CAAC;AAEH,eAAO,MAAM,qBAAqB,EAAE,OAQlC,CAAC;AAIH,eAAO,MAAM,cAAc,EAAE,OAS3B,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,OAS5B,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,OAS5B,CAAC;AAEH,eAAO,MAAM,WAAW,EAAE,SAAS,OAAO,EA6BxC,CAAC"}
1
+ {"version":3,"file":"r26-presets.d.ts","sourceRoot":"","sources":["../../src/builtin/r26-presets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAkDlD,eAAO,MAAM,iBAAiB,EAAE,OAe9B,CAAC;AAEH,eAAO,MAAM,yBAAyB,EAAE,OAgBtC,CAAC;AAEH,eAAO,MAAM,uBAAuB,EAAE,OAoBpC,CAAC;AAIH,eAAO,MAAM,iBAAiB,EAAE,OAgC9B,CAAC;AAEH,eAAO,MAAM,YAAY,EAAE,OAiBzB,CAAC;AAEH,eAAO,MAAM,WAAW,EAAE,OAiBxB,CAAC;AAIH,eAAO,MAAM,cAAc,EAAE,OAmC3B,CAAC;AAEH,eAAO,MAAM,qBAAqB,EAAE,OAelC,CAAC;AAEH,eAAO,MAAM,wBAAwB,EAAE,OAerC,CAAC;AAEH,eAAO,MAAM,6BAA6B,EAAE,OAe1C,CAAC;AAEH,eAAO,MAAM,+BAA+B,EAAE,OAe5C,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,OAehC,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,OAe5B,CAAC;AAEH,eAAO,MAAM,qBAAqB,EAAE,OAelC,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,OAe7B,CAAC;AAEH,eAAO,MAAM,sBAAsB,EAAE,OASnC,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,OAS5B,CAAC;AAIH,eAAO,MAAM,cAAc,EAAE,OAQ3B,CAAC;AAEH,eAAO,MAAM,YAAY,EAAE,OAQzB,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,OAO/B,CAAC;AAIH,eAAO,MAAM,gBAAgB,EAAE,OAS7B,CAAC;AAEH,eAAO,MAAM,cAAc,EAAE,OAS3B,CAAC;AAEH,eAAO,MAAM,qBAAqB,EAAE,OAQlC,CAAC;AAIH,eAAO,MAAM,cAAc,EAAE,OAS3B,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,OAS5B,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,OAS5B,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,SAAS,OAAO,EA2BhD,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { WorkspaceProfile } from '@shrkcrft/workspace';
2
2
  import { definePreset } from "../define/define-preset.js";
3
- import { COMMON_AGENT_BRIEFING, COMMON_PIPELINE_CONTEXT_ONLY, COMMON_PIPELINE_FEATURE_DEV, COMMON_PIPELINE_UNIT_TEST, COMMON_RULE_INTERFACE_PREFIX, COMMON_RULE_NO_LOGIC_CONSTRUCTORS, COMMON_RULE_ONE_EXPORT, COMMON_SAFETY_RULE, OVERVIEW_DOC, } from "./shared-snippets.js";
4
- import { NG_ACCESSIBLE, NG_AVOID_BYPASS_SECURITY, NG_DOMAIN_NO_UI_IMPORTS, NG_FEATURE_FOLDERS, NG_GUARDS_SMALL, NG_LAZY_ROUTES, NG_LIFECYCLE_SAFE_CLEANUP, NG_NO_BUSINESS_LOGIC_IN_TEMPLATE, NG_NO_DEEP_LIB_IMPORTS, NG_NO_GOD_SERVICES, NG_ON_PUSH, NG_PLUGIN_NO_DEEP_IMPORTS, NG_PLUGIN_STABLE_CONTRACT, NG_RXJS_NO_NESTED_SUBSCRIBE, NG_SIGNALS_FIRST, NG_STANDALONE_COMPONENTS, NG_TRACK_BY, NG_TYPED_REACTIVE_FORMS, TS_AGENT_SMALL_DIFFS, TS_BRANDED_IDS, TS_DISCRIMINATED_UNIONS, TS_ERROR_HANDLING, TS_NO_ANY, TS_NO_CIRCULAR_IMPORTS, TS_NO_DEEP_IMPORTS, TS_NO_FLOATING_PROMISES, TS_PREFER_SATISFIES, TS_PUBLIC_RETURN_TYPES, TS_READONLY_DEFAULT, TS_VALIDATE_BOUNDARY_INPUT, } from "./r26-snippets.js";
3
+ import { ANGULAR_PATH_APP, ANGULAR_PATH_COMPONENTS, ANGULAR_PATH_SERVICES, COMMON_AGENT_BRIEFING, COMMON_PIPELINE_CONTEXT_ONLY, COMMON_PIPELINE_FEATURE_DEV, COMMON_PIPELINE_UNIT_TEST, COMMON_RULE_INTERFACE_PREFIX, COMMON_RULE_NO_LOGIC_CONSTRUCTORS, COMMON_RULE_ONE_EXPORT, COMMON_SAFETY_RULE, NEST_PATH_E2E, NEST_PATH_SRC, OVERVIEW_DOC, } from "./shared-snippets.js";
4
+ import { NG_ACCESSIBLE, NG_AVOID_BYPASS_SECURITY, NG_DOMAIN_NO_UI_IMPORTS, NG_FEATURE_FOLDERS, NG_GUARDS_SMALL, NG_LAZY_ROUTES, NG_LIFECYCLE_SAFE_CLEANUP, NG_NO_BUSINESS_LOGIC_IN_TEMPLATE, NG_NO_DEEP_LIB_IMPORTS, NG_NO_GOD_SERVICES, NG_ON_PUSH, NG_RXJS_NO_NESTED_SUBSCRIBE, NG_SIGNALS_FIRST, NG_STANDALONE_COMPONENTS, NG_TRACK_BY, NG_TYPED_REACTIVE_FORMS, TS_AGENT_SMALL_DIFFS, TS_BRANDED_IDS, TS_DISCRIMINATED_UNIONS, TS_ERROR_HANDLING, TS_NO_ANY, TS_NO_CIRCULAR_IMPORTS, TS_NO_DEEP_IMPORTS, TS_NO_FLOATING_PROMISES, TS_PREFER_SATISFIES, TS_PUBLIC_RETURN_TYPES, TS_READONLY_DEFAULT, TS_VALIDATE_BOUNDARY_INPUT, } from "./r26-snippets.js";
5
5
  // ─── Core ──────────────────────────────────────────────────────────────────
6
6
  export const GENERIC_SAFE_REPO = definePreset({
7
7
  id: 'generic-safe-repo',
@@ -156,7 +156,7 @@ export const MODERN_ANGULAR = definePreset({
156
156
  NG_ACCESSIBLE,
157
157
  NG_AVOID_BYPASS_SECURITY,
158
158
  ],
159
- paths: [],
159
+ paths: [ANGULAR_PATH_APP, ANGULAR_PATH_COMPONENTS, ANGULAR_PATH_SERVICES],
160
160
  templates: [],
161
161
  pipelines: [COMMON_PIPELINE_FEATURE_DEV],
162
162
  docs: { 'overview.md': OVERVIEW_DOC('Modern Angular', 'Signals-first reactivity, RxJS used deliberately, standalone components, OnPush CD, lazy routes, typed forms, Nx-style boundaries.') },
@@ -292,22 +292,6 @@ export const ANGULAR_SECURITY = definePreset({
292
292
  docs: { 'overview.md': OVERVIEW_DOC('Angular security', 'Avoid bypassSecurityTrust*. Sanitize user HTML. Validate route params.') },
293
293
  },
294
294
  });
295
- export const ANGULAR_PLUGIN_PLATFORM = definePreset({
296
- id: 'angular-plugin-platform',
297
- title: 'Angular — plugin platform',
298
- description: 'Plugin contracts, lifecycle, capability tokens, isolation.',
299
- tags: ['angular', 'plugins'],
300
- appliesTo: [WorkspaceProfile.HasAngular],
301
- weight: 5,
302
- includes: {
303
- knowledge: [],
304
- rules: [NG_PLUGIN_STABLE_CONTRACT, NG_PLUGIN_NO_DEEP_IMPORTS],
305
- paths: [],
306
- templates: [],
307
- pipelines: [],
308
- docs: { 'overview.md': OVERVIEW_DOC('Angular plugin platform', 'Plugin contracts are stable. No plugin-to-plugin deep imports. Lifecycle is deterministic.') },
309
- },
310
- });
311
295
  export const ANGULAR_ENTERPRISE_APP = definePreset({
312
296
  id: 'angular-enterprise-app',
313
297
  title: 'Angular enterprise app',
@@ -328,16 +312,6 @@ export const ANGULAR_LIBRARY = definePreset({
328
312
  composes: ['modern-angular', 'npm-package'],
329
313
  includes: { knowledge: [], rules: [], paths: [], templates: [], pipelines: [], docs: {} },
330
314
  });
331
- export const ANGULAR_SMART_UI_PLATFORM = definePreset({
332
- id: 'angular-smart-ui-platform',
333
- title: 'Angular smart UI platform',
334
- description: 'Smart/dumb component split, deliberate state ownership, large-app organisation.',
335
- tags: ['angular', 'ui-platform'],
336
- appliesTo: [WorkspaceProfile.HasAngular],
337
- weight: 6,
338
- composes: ['modern-angular'],
339
- includes: { knowledge: [], rules: [], paths: [], templates: [], pipelines: [], docs: {} },
340
- });
341
315
  // ─── Testing presets ───────────────────────────────────────────────────────
342
316
  export const VITEST_FOCUSED = definePreset({
343
317
  id: 'vitest-focused',
@@ -404,7 +378,7 @@ export const NESTJS_SERVICE = definePreset({
404
378
  appliesTo: [WorkspaceProfile.HasNestJS, WorkspaceProfile.IsBackend],
405
379
  weight: 7,
406
380
  composes: ['node-service'],
407
- includes: { knowledge: [], rules: [TS_VALIDATE_BOUNDARY_INPUT], paths: [], templates: [], pipelines: [], docs: { 'overview.md': OVERVIEW_DOC('NestJS service', 'Validate DTOs at controllers. Keep services thin. Use modules to enforce layers.') } },
381
+ includes: { knowledge: [], rules: [TS_VALIDATE_BOUNDARY_INPUT], paths: [NEST_PATH_SRC, NEST_PATH_E2E], templates: [], pipelines: [], docs: { 'overview.md': OVERVIEW_DOC('NestJS service', 'Validate DTOs at controllers. Keep services thin. Use modules to enforce layers.') } },
408
382
  });
409
383
  export const EXPRESS_SERVICE = definePreset({
410
384
  id: 'express-service',
@@ -426,7 +400,7 @@ export const FASTIFY_SERVICE = definePreset({
426
400
  composes: ['node-service'],
427
401
  includes: { knowledge: [], rules: [], paths: [], templates: [], pipelines: [], docs: { 'overview.md': OVERVIEW_DOC('Fastify service', 'Schema-validate routes. Encapsulate features as plugins. Keep startup ordering deterministic.') } },
428
402
  });
429
- export const R26_PRESETS = Object.freeze([
403
+ export const MULTI_STACK_PRESETS = Object.freeze([
430
404
  GENERIC_SAFE_REPO,
431
405
  AI_AGENT_SAFE_DEVELOPMENT,
432
406
  ENTERPRISE_REVIEW_GATED,
@@ -442,10 +416,8 @@ export const R26_PRESETS = Object.freeze([
442
416
  ANGULAR_TESTING,
443
417
  ANGULAR_ACCESSIBILITY,
444
418
  ANGULAR_SECURITY,
445
- ANGULAR_PLUGIN_PLATFORM,
446
419
  ANGULAR_ENTERPRISE_APP,
447
420
  ANGULAR_LIBRARY,
448
- ANGULAR_SMART_UI_PLATFORM,
449
421
  VITEST_FOCUSED,
450
422
  JEST_FOCUSED,
451
423
  PLAYWRIGHT_FOCUSED,
@@ -34,6 +34,4 @@ export declare const NG_NO_GOD_SERVICES: string;
34
34
  export declare const NG_DOMAIN_NO_UI_IMPORTS: string;
35
35
  export declare const NG_ACCESSIBLE: string;
36
36
  export declare const NG_AVOID_BYPASS_SECURITY: string;
37
- export declare const NG_PLUGIN_STABLE_CONTRACT: string;
38
- export declare const NG_PLUGIN_NO_DEEP_IMPORTS: string;
39
37
  //# sourceMappingURL=r26-snippets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"r26-snippets.d.ts","sourceRoot":"","sources":["../../src/builtin/r26-snippets.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAWT;AAID,eAAO,MAAM,SAAS,QAOpB,CAAC;AAEH,eAAO,MAAM,mBAAmB,QAO9B,CAAC;AAEH,eAAO,MAAM,uBAAuB,QAOlC,CAAC;AAEH,eAAO,MAAM,mBAAmB,QAO9B,CAAC;AAEH,eAAO,MAAM,sBAAsB,QAOjC,CAAC;AAEH,eAAO,MAAM,uBAAuB,QAOlC,CAAC;AAEH,eAAO,MAAM,iBAAiB,QAO5B,CAAC;AAEH,eAAO,MAAM,kBAAkB,QAO7B,CAAC;AAEH,eAAO,MAAM,0BAA0B,QAOrC,CAAC;AAEH,eAAO,MAAM,cAAc,QAOzB,CAAC;AAEH,eAAO,MAAM,sBAAsB,QAOjC,CAAC;AAEH,eAAO,MAAM,oBAAoB,QAO/B,CAAC;AAIH,eAAO,MAAM,wBAAwB,QAOnC,CAAC;AAEH,eAAO,MAAM,UAAU,QAOrB,CAAC;AAEH,eAAO,MAAM,gBAAgB,QAO3B,CAAC;AAEH,eAAO,MAAM,2BAA2B,QAOtC,CAAC;AAEH,eAAO,MAAM,yBAAyB,QAOpC,CAAC;AAEH,eAAO,MAAM,WAAW,QAOtB,CAAC;AAEH,eAAO,MAAM,gCAAgC,QAO3C,CAAC;AAEH,eAAO,MAAM,uBAAuB,QAOlC,CAAC;AAEH,eAAO,MAAM,cAAc,QAOzB,CAAC;AAEH,eAAO,MAAM,eAAe,QAO1B,CAAC;AAEH,eAAO,MAAM,sBAAsB,QAOjC,CAAC;AAEH,eAAO,MAAM,kBAAkB,QAO7B,CAAC;AAEH,eAAO,MAAM,kBAAkB,QAO7B,CAAC;AAEH,eAAO,MAAM,uBAAuB,QAOlC,CAAC;AAEH,eAAO,MAAM,aAAa,QAOxB,CAAC;AAEH,eAAO,MAAM,wBAAwB,QAOnC,CAAC;AAEH,eAAO,MAAM,yBAAyB,QAOpC,CAAC;AAEH,eAAO,MAAM,yBAAyB,QAOpC,CAAC"}
1
+ {"version":3,"file":"r26-snippets.d.ts","sourceRoot":"","sources":["../../src/builtin/r26-snippets.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAWT;AAID,eAAO,MAAM,SAAS,QAOpB,CAAC;AAEH,eAAO,MAAM,mBAAmB,QAO9B,CAAC;AAEH,eAAO,MAAM,uBAAuB,QAOlC,CAAC;AAEH,eAAO,MAAM,mBAAmB,QAO9B,CAAC;AAEH,eAAO,MAAM,sBAAsB,QAOjC,CAAC;AAEH,eAAO,MAAM,uBAAuB,QAOlC,CAAC;AAEH,eAAO,MAAM,iBAAiB,QAO5B,CAAC;AAEH,eAAO,MAAM,kBAAkB,QAO7B,CAAC;AAEH,eAAO,MAAM,0BAA0B,QAOrC,CAAC;AAEH,eAAO,MAAM,cAAc,QAOzB,CAAC;AAEH,eAAO,MAAM,sBAAsB,QAOjC,CAAC;AAEH,eAAO,MAAM,oBAAoB,QAO/B,CAAC;AAIH,eAAO,MAAM,wBAAwB,QAOnC,CAAC;AAEH,eAAO,MAAM,UAAU,QAOrB,CAAC;AAEH,eAAO,MAAM,gBAAgB,QAO3B,CAAC;AAEH,eAAO,MAAM,2BAA2B,QAOtC,CAAC;AAEH,eAAO,MAAM,yBAAyB,QAOpC,CAAC;AAEH,eAAO,MAAM,WAAW,QAOtB,CAAC;AAEH,eAAO,MAAM,gCAAgC,QAO3C,CAAC;AAEH,eAAO,MAAM,uBAAuB,QAOlC,CAAC;AAEH,eAAO,MAAM,cAAc,QAOzB,CAAC;AAEH,eAAO,MAAM,eAAe,QAO1B,CAAC;AAEH,eAAO,MAAM,sBAAsB,QAOjC,CAAC;AAEH,eAAO,MAAM,kBAAkB,QAO7B,CAAC;AAEH,eAAO,MAAM,kBAAkB,QAO7B,CAAC;AAEH,eAAO,MAAM,uBAAuB,QAOlC,CAAC;AAEH,eAAO,MAAM,aAAa,QAOxB,CAAC;AAEH,eAAO,MAAM,wBAAwB,QAOnC,CAAC"}
@@ -239,19 +239,3 @@ export const NG_AVOID_BYPASS_SECURITY = ruleSnippet({
239
239
  appliesWhen: ['generate-code', 'review'],
240
240
  content: '`DomSanitizer.bypassSecurityTrust*` opens an XSS hole. Only use it with reviewed, trusted inputs — sanitize otherwise.',
241
241
  });
242
- export const NG_PLUGIN_STABLE_CONTRACT = ruleSnippet({
243
- id: 'angular.plugin.stable-contract',
244
- title: 'Plugin contracts are stable',
245
- priority: 'critical',
246
- tags: ['angular', 'plugins'],
247
- appliesWhen: ['generate-code', 'review'],
248
- content: 'Plugin manifests, lifecycle hooks, and capability tokens are public API. Breaking changes require a migration note and a major-version bump.',
249
- });
250
- export const NG_PLUGIN_NO_DEEP_IMPORTS = ruleSnippet({
251
- id: 'angular.plugin.no-deep-imports',
252
- title: 'Plugins cannot deep-import each other',
253
- priority: 'critical',
254
- tags: ['angular', 'plugins', 'boundaries'],
255
- appliesWhen: ['generate-code', 'review'],
256
- content: 'Plugin-to-plugin communication must use the documented event/token contract. Direct imports between plugin packages are forbidden.',
257
- });
@@ -3,5 +3,5 @@ export declare const NEXT_APP_PRESET: IPreset;
3
3
  export declare const TURBOREPO_PRESET: IPreset;
4
4
  export declare const PACKAGE_WORKSPACE_PRESET: IPreset;
5
5
  export declare const CLEAN_ARCHITECTURE_TS_PRESET: IPreset;
6
- export declare const R45_PRESETS: readonly IPreset[];
6
+ export declare const UNIVERSAL_ADOPTION_PRESETS: readonly IPreset[];
7
7
  //# sourceMappingURL=r45-presets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"r45-presets.d.ts","sourceRoot":"","sources":["../../src/builtin/r45-presets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAwBlD,eAAO,MAAM,eAAe,EAAE,OA+C5B,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,OA+C7B,CAAC;AAEH,eAAO,MAAM,wBAAwB,EAAE,OAuCrC,CAAC;AAEH,eAAO,MAAM,4BAA4B,EAAE,OAoDzC,CAAC;AAEH,eAAO,MAAM,WAAW,EAAE,SAAS,OAAO,EAKxC,CAAC"}
1
+ {"version":3,"file":"r45-presets.d.ts","sourceRoot":"","sources":["../../src/builtin/r45-presets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AA0BlD,eAAO,MAAM,eAAe,EAAE,OA+C5B,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,OA+C7B,CAAC;AAEH,eAAO,MAAM,wBAAwB,EAAE,OAuCrC,CAAC;AAEH,eAAO,MAAM,4BAA4B,EAAE,OAoDzC,CAAC;AAEH,eAAO,MAAM,0BAA0B,EAAE,SAAS,OAAO,EAKvD,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { WorkspaceProfile } from '@shrkcrft/workspace';
2
2
  import { definePreset } from "../define/define-preset.js";
3
- import { COMMON_AGENT_BRIEFING, COMMON_PATH_SERVICES, COMMON_PATH_TESTS, COMMON_PATH_UTILS, COMMON_PIPELINE_CONTEXT_ONLY, COMMON_PIPELINE_FEATURE_DEV, COMMON_PIPELINE_UNIT_TEST, COMMON_RULE_INTERFACE_PREFIX, COMMON_RULE_NO_LOGIC_CONSTRUCTORS, COMMON_RULE_ONE_EXPORT, COMMON_SAFETY_RULE, COMMON_TEMPLATE_SERVICE, COMMON_TEMPLATE_TEST, COMMON_TEMPLATE_UTILITY, OVERVIEW_DOC, } from "./shared-snippets.js";
3
+ import { COMMON_AGENT_BRIEFING, COMMON_PATH_SERVICES, COMMON_PATH_TESTS, COMMON_PATH_UTILS, COMMON_PIPELINE_CONTEXT_ONLY, COMMON_PIPELINE_FEATURE_DEV, COMMON_PIPELINE_UNIT_TEST, COMMON_RULE_INTERFACE_PREFIX, COMMON_RULE_NO_LOGIC_CONSTRUCTORS, COMMON_RULE_ONE_EXPORT, COMMON_SAFETY_RULE, COMMON_TEMPLATE_SERVICE, COMMON_TEMPLATE_TEST, COMMON_TEMPLATE_UTILITY, OVERVIEW_DOC, WORKSPACE_PATH_APPS, WORKSPACE_PATH_PACKAGES, } from "./shared-snippets.js";
4
4
  // Universal adoption — fills four Phase-1 preset gaps:
5
5
  // next-app, turborepo, package-workspace, clean-architecture-ts.
6
6
  // Each preset is generic — no project-specific anchors, no per-stack jargon
@@ -52,7 +52,7 @@ export const NEXT_APP_PRESET = definePreset({
52
52
  export const TURBOREPO_PRESET = definePreset({
53
53
  id: 'turborepo',
54
54
  title: 'Turborepo monorepo',
55
- description: 'Conventions for Turborepo workspaces: package layer order, public entry points, no relative cross-package imports, run via the affected task graph.',
55
+ description: 'Conventions for Turborepo workspaces: public entry points, no relative cross-package imports, run via the affected task graph.',
56
56
  tags: ['turborepo', 'monorepo'],
57
57
  appliesTo: [WorkspaceProfile.HasTurborepo, WorkspaceProfile.IsMonorepo],
58
58
  weight: 8,
@@ -80,7 +80,7 @@ export const TURBOREPO_PRESET = definePreset({
80
80
  })`,
81
81
  ],
82
82
  rules: [COMMON_SAFETY_RULE, COMMON_RULE_INTERFACE_PREFIX, COMMON_RULE_ONE_EXPORT],
83
- paths: [COMMON_PATH_SERVICES, COMMON_PATH_UTILS, COMMON_PATH_TESTS],
83
+ paths: [WORKSPACE_PATH_APPS, WORKSPACE_PATH_PACKAGES],
84
84
  templates: [COMMON_TEMPLATE_SERVICE, COMMON_TEMPLATE_UTILITY, COMMON_TEMPLATE_TEST],
85
85
  pipelines: [COMMON_PIPELINE_CONTEXT_ONLY, COMMON_PIPELINE_FEATURE_DEV, COMMON_PIPELINE_UNIT_TEST],
86
86
  docs: {
@@ -116,7 +116,7 @@ export const PACKAGE_WORKSPACE_PRESET = definePreset({
116
116
  })`,
117
117
  ],
118
118
  rules: [COMMON_SAFETY_RULE, COMMON_RULE_INTERFACE_PREFIX, COMMON_RULE_ONE_EXPORT],
119
- paths: [COMMON_PATH_SERVICES, COMMON_PATH_UTILS, COMMON_PATH_TESTS],
119
+ paths: [WORKSPACE_PATH_PACKAGES],
120
120
  templates: [COMMON_TEMPLATE_SERVICE, COMMON_TEMPLATE_UTILITY, COMMON_TEMPLATE_TEST],
121
121
  pipelines: [COMMON_PIPELINE_CONTEXT_ONLY, COMMON_PIPELINE_FEATURE_DEV, COMMON_PIPELINE_UNIT_TEST],
122
122
  docs: {
@@ -178,7 +178,7 @@ export const CLEAN_ARCHITECTURE_TS_PRESET = definePreset({
178
178
  'shrk task "<task>"',
179
179
  ],
180
180
  });
181
- export const R45_PRESETS = Object.freeze([
181
+ export const UNIVERSAL_ADOPTION_PRESETS = Object.freeze([
182
182
  NEXT_APP_PRESET,
183
183
  TURBOREPO_PRESET,
184
184
  PACKAGE_WORKSPACE_PRESET,
@@ -1,5 +1,5 @@
1
1
  import type { IPreset } from '../model/preset.js';
2
2
  export declare const NEST_SERVICE_PRESET: IPreset;
3
3
  export declare const ANGULAR_APP_PRESET: IPreset;
4
- export declare const R47_PRESETS: readonly IPreset[];
4
+ export declare const CANONICAL_ALIAS_PRESETS: readonly IPreset[];
5
5
  //# sourceMappingURL=r47-presets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"r47-presets.d.ts","sourceRoot":"","sources":["../../src/builtin/r47-presets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAclD,eAAO,MAAM,mBAAmB,EAAE,OA2BhC,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,OA2B/B,CAAC;AAEH,eAAO,MAAM,WAAW,EAAE,SAAS,OAAO,EAGxC,CAAC"}
1
+ {"version":3,"file":"r47-presets.d.ts","sourceRoot":"","sources":["../../src/builtin/r47-presets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAuBlD,eAAO,MAAM,mBAAmB,EAAE,OA2BhC,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,OA2B/B,CAAC;AAEH,eAAO,MAAM,uBAAuB,EAAE,SAAS,OAAO,EAGpD,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { WorkspaceProfile } from '@shrkcrft/workspace';
2
2
  import { definePreset } from "../define/define-preset.js";
3
- import { COMMON_AGENT_BRIEFING, COMMON_SAFETY_RULE, OVERVIEW_DOC } from "./shared-snippets.js";
3
+ import { ANGULAR_PATH_APP, ANGULAR_PATH_COMPONENTS, ANGULAR_PATH_SERVICES, COMMON_AGENT_BRIEFING, COMMON_SAFETY_RULE, NEST_PATH_E2E, NEST_PATH_SRC, OVERVIEW_DOC, } from "./shared-snippets.js";
4
4
  // Universal adoption (top 5) — canonical-id aliases.
5
5
  //
6
6
  // Why: canonical preset ids are `nest-service` and `angular-app`. The
@@ -22,7 +22,7 @@ export const NEST_SERVICE_PRESET = definePreset({
22
22
  includes: {
23
23
  knowledge: [COMMON_AGENT_BRIEFING],
24
24
  rules: [COMMON_SAFETY_RULE],
25
- paths: [],
25
+ paths: [NEST_PATH_SRC, NEST_PATH_E2E],
26
26
  templates: [],
27
27
  pipelines: [],
28
28
  docs: {
@@ -46,7 +46,7 @@ export const ANGULAR_APP_PRESET = definePreset({
46
46
  includes: {
47
47
  knowledge: [COMMON_AGENT_BRIEFING],
48
48
  rules: [COMMON_SAFETY_RULE],
49
- paths: [],
49
+ paths: [ANGULAR_PATH_APP, ANGULAR_PATH_COMPONENTS, ANGULAR_PATH_SERVICES],
50
50
  templates: [],
51
51
  pipelines: [],
52
52
  docs: {
@@ -59,7 +59,7 @@ export const ANGULAR_APP_PRESET = definePreset({
59
59
  'shrk task "<task>"',
60
60
  ],
61
61
  });
62
- export const R47_PRESETS = Object.freeze([
62
+ export const CANONICAL_ALIAS_PRESETS = Object.freeze([
63
63
  NEST_SERVICE_PRESET,
64
64
  ANGULAR_APP_PRESET,
65
65
  ]);
@@ -0,0 +1,12 @@
1
+ import type { IPreset } from '../model/preset.js';
2
+ export declare const REACT_19_MODERN_COMPONENTS: IPreset;
3
+ export declare const REACT_19_HOOKS_DISCIPLINE: IPreset;
4
+ export declare const REACT_19_ACTIONS_FORMS: IPreset;
5
+ export declare const REACT_19_STATE: IPreset;
6
+ export declare const REACT_19_PERFORMANCE: IPreset;
7
+ export declare const REACT_19_CONCURRENT: IPreset;
8
+ export declare const REACT_19_TESTING: IPreset;
9
+ export declare const REACT_19_RSC: IPreset;
10
+ export declare const REACT_19_MODERN: IPreset;
11
+ export declare const REACT_19_PRESETS: readonly IPreset[];
12
+ //# sourceMappingURL=react19-presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react19-presets.d.ts","sourceRoot":"","sources":["../../src/builtin/react19-presets.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAmElD,eAAO,MAAM,0BAA0B,EAAE,OAgCvC,CAAC;AAIH,eAAO,MAAM,yBAAyB,EAAE,OA+BtC,CAAC;AAIH,eAAO,MAAM,sBAAsB,EAAE,OA8BnC,CAAC;AAIH,eAAO,MAAM,cAAc,EAAE,OA6B3B,CAAC;AAIH,eAAO,MAAM,oBAAoB,EAAE,OA6BjC,CAAC;AAIH,eAAO,MAAM,mBAAmB,EAAE,OA6BhC,CAAC;AAIH,eAAO,MAAM,gBAAgB,EAAE,OA4B7B,CAAC;AAIH,eAAO,MAAM,YAAY,EAAE,OA6BzB,CAAC;AAIH,eAAO,MAAM,eAAe,EAAE,OA8C5B,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,SAAS,OAAO,EAU7C,CAAC"}