diff --git a/docs/development_plan.md b/docs/development_plan.md index c6a7836..ade5e17 100644 --- a/docs/development_plan.md +++ b/docs/development_plan.md @@ -277,7 +277,7 @@ Copy from `nest-auth/` / `nest-logger/` and adapt (`nest-auth` → `nest-queue`, "peerDependenciesMeta": { "bullmq-otel": { "optional": true } }, - "packageManager": "pnpm@11.0.0", + "packageManager": "pnpm@11.20.0", "engines": { "node": ">=24.0.0" }, "publishConfig": { "access": "public", diff --git a/docs/tasks/phase-01-foundation.md b/docs/tasks/phase-01-foundation.md index e5468f2..9973bdc 100644 --- a/docs/tasks/phase-01-foundation.md +++ b/docs/tasks/phase-01-foundation.md @@ -20,7 +20,7 @@ Phase 1 produces the **first end-to-end usable slice**: a fully-gated project sc 2. **Clean Code sizing.** Functions ≤ 50 lines; files ≤ 800 lines (200–400 typical). Split by responsibility when over the limit. 3. **One responsibility per file/function (SRP); SOLID throughout.** Explicit DI (no implicit metadata wiring beyond NestJS providers); DI tokens are `Symbol`. 4. **JSDoc on every exported symbol** (class, function, interface, type, constant), with `@example` where it clarifies usage. -5. **English-only and timeless comments** — no `Phase N`/`Task`/roadmap-stage references inside any committed file (code, config, or docs-as-config). Explain *what* and *why*, never *which roadmap stage*. +5. **English-only and timeless comments** — no `Phase N`/`Task`/roadmap-stage references inside any committed file (code, config, or docs-as-config). Explain _what_ and _why_, never _which roadmap stage_. 6. **100% line/branch coverage** on every implemented file (`jest.coverage.config.ts` thresholds `100/100/100/100`). No `eslint-disable`, no `@ts-ignore`, no `@ts-expect-error` to dodge a gate. 7. **Never create `.gitkeep`/`.keep` or empty-directory placeholders** — directories emerge from real files only (the `index.ts` placeholders in §2.1 are real files). 8. **Current BullMQ API only.** Built on `ConfigurableModuleBuilder` + `isGlobal`/`setExtras` (no `@Global`, no `forFeature`); recurring jobs use `upsertJobScheduler`/`removeJobScheduler`/`getJobSchedulers` (never `addRepeatable`); `cleanQueue(name, grace, limit, status?)` mirrors BullMQ argument order; per-role `maxRetriesPerRequest` (Queue/FlowProducer keep ioredis default; only duplicated Worker/QueueEvents connections are forced to `null`). @@ -39,16 +39,16 @@ Phase 1 produces the **first end-to-end usable slice**: a fully-gated project sc ## Task index -| ID | Task | Status | Priority | Size | Depends on | -|---|---|---|---|---|---| -| 1.1 | Project scaffold (build chain, configs, budgets) | ✅ Done | P0 | M | — | -| 1.2 | Shared types & constants (`src/shared/`) | ✅ Done | P0 | S | 1.1 | -| 1.3 | Public server interfaces & contracts | ✅ Done | P0 | M | 1.1 | -| 1.4 | DI tokens, default options & error messages | ✅ Done | P0 | S | 1.1, 1.2 | -| 1.5 | `ConnectionResolver`, `QueueException` & connection utils | ✅ Done | P0 | L | 1.3, 1.4 | -| 1.6 | Resolved options + bootstrap validation | ✅ Done | P0 | M | 1.3, 1.4 | -| 1.7 | Base `QueueService` (cache, enqueue, metrics, control) | ✅ Done | P0 | M | 1.3, 1.5, 1.6 | -| 1.8 | `BymaxQueueModule.forRoot()`, barrel & unit tests | ✅ Done | P0 | L | 1.1–1.7 | +| ID | Task | Status | Priority | Size | Depends on | +| --- | --------------------------------------------------------- | ------- | -------- | ---- | ------------- | +| 1.1 | Project scaffold (build chain, configs, budgets) | ✅ Done | P0 | M | — | +| 1.2 | Shared types & constants (`src/shared/`) | ✅ Done | P0 | S | 1.1 | +| 1.3 | Public server interfaces & contracts | ✅ Done | P0 | M | 1.1 | +| 1.4 | DI tokens, default options & error messages | ✅ Done | P0 | S | 1.1, 1.2 | +| 1.5 | `ConnectionResolver`, `QueueException` & connection utils | ✅ Done | P0 | L | 1.3, 1.4 | +| 1.6 | Resolved options + bootstrap validation | ✅ Done | P0 | M | 1.3, 1.4 | +| 1.7 | Base `QueueService` (cache, enqueue, metrics, control) | ✅ Done | P0 | M | 1.3, 1.5, 1.6 | +| 1.8 | `BymaxQueueModule.forRoot()`, barrel & unit tests | ✅ Done | P0 | L | 1.1–1.7 | --- @@ -138,7 +138,7 @@ DELIVERABLES "reflect-metadata": "^0.2.0", "bullmq-otel": "^1.0.0" }, "peerDependenciesMeta": { "bullmq-otel": { "optional": true } }, - "packageManager": "pnpm@11.0.0", + "packageManager": "pnpm@11.20.0", "engines": { "node": ">=24.0.0" }, "publishConfig": { "access": "public", "provenance": true, "registry": "https://registry.npmjs.org/" } } diff --git a/docs/technical_specification.md b/docs/technical_specification.md index 78e8adf..7c80207 100644 --- a/docs/technical_specification.md +++ b/docs/technical_specification.md @@ -1939,7 +1939,7 @@ This decision is reviewed in every minor release of the lib. "graceful-shutdown", "job" ], - "packageManager": "pnpm@11.0.0", + "packageManager": "pnpm@11.20.0", "engines": { "node": ">=24.0.0" }, "publishConfig": { "access": "public", diff --git a/package.json b/package.json index dc1c261..49de2b8 100644 --- a/package.json +++ b/package.json @@ -146,7 +146,7 @@ "prettier --write" ] }, - "packageManager": "pnpm@11.0.0", + "packageManager": "pnpm@11.20.0", "engines": { "node": ">=24.0.0" }, diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 440f974..6530bf0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,10 +3,9 @@ packages: - 'test/consumer-app' verifyDepsBeforeRun: false -onlyBuiltDependencies: - - esbuild - - msgpackr-extract - - unrs-resolver +# `allowBuilds` is the only spelling pnpm 11 reads: onlyBuiltDependencies, +# neverBuiltDependencies and their siblings were removed in v11 and replaced by +# this map. An unlisted package counts as unreviewed and its scripts are denied. allowBuilds: esbuild: true msgpackr-extract: true @@ -16,8 +15,8 @@ allowBuilds: ssh2: false # Forced versions, for two distinct reasons. These live here and NOT in -# package.json: since pnpm 11 the `pnpm` field of package.json is ignored outright, -# with no warning, so an override placed there silently does nothing. +# package.json: pnpm 11 no longer reads the `pnpm` field of package.json, so an +# override placed there does nothing — it warns, but it does nothing. # # 1. `bullmq` and `ioredis` are collapsed to ONE copy across the workspace. BullMQ's # `ConnectionOptions` accepts an ioredis `Redis`, and that assignment typechecks