@se-studio/skills 1.6.9 → 1.7.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @se-studio/skills
2
2
 
3
+ ## 1.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 8e94be2: Support Next.js 16.3 while remaining compatible with Next.js 15.5 (peer `>=15.5.0 <17`). CMS webhooks call `revalidateTag(tag, { expire: 0 })` so published content is not served stale. Template apps use `proxy.ts` on Next 16. Not-found metadata uses `title.absolute` so layout `title.template` does not produce duplicated site names.
8
+
9
+ ## 1.6.10
10
+
11
+ ### Patch Changes
12
+
13
+ - 41cfadb: Allow agents to merge customer production only for cms-edit-only diffs (host package / editor-pack), one site at a time with a live health check.
14
+
3
15
  ## 1.6.9
4
16
 
5
17
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@se-studio/skills",
3
- "version": "1.6.9",
3
+ "version": "1.7.0",
4
4
  "description": "SE Studio agent skills for marketing site development with Contentful CMS",
5
5
  "repository": {
6
6
  "type": "git",
@@ -0,0 +1,35 @@
1
+ # cms-edit-only production merge
2
+
3
+ The **only** agent exception to “no production git”. Marketing site source, core `main`, and Vercel CLI deploys stay human-only.
4
+
5
+ ## When it applies
6
+
7
+ All of the following must be true:
8
+
9
+ 1. The user asked to ship **hosted cms-edit** (host package bump, editor-pack-only, or continue a cms-edit host rollout).
10
+ 2. Any required `@se-studio/contentful-cms` version is **already on npm**.
11
+ 3. The merge is **customer** `develop` → that site’s production branch (`main`, HSD **`production`**). Never `se-core-product` `main`.
12
+ 4. `git diff --name-only origin/<productionBranch>...origin/develop` is **only**:
13
+ - `cms-edit/**`
14
+ - root `package.json` and/or `pnpm-lock.yaml` (and `pnpm-workspace.yaml` only if it already listed the package)
15
+ 5. Those package/lock changes are **only** `@se-studio/contentful-cms` (plus lockfile transitives). No `src/`, `apps/` marketing, smoke, server-config, or other dependency bumps.
16
+ 6. Merge **one customer repo at a time**. Wait for that repo’s cms-edit Vercel **production** deployment **Ready**. Then check live `https://<host>/api/health`: `ok`, `cmsEdit.version` matches npm, `redis` and `oauth` checks ok. Probe `/.well-known/oauth-authorization-server` (200). **Stop at the first failure.**
17
+
18
+ ## How to merge
19
+
20
+ From the **develop** checkout (not `productionPath`):
21
+
22
+ ```bash
23
+ git fetch origin
24
+ git diff --name-only origin/<productionBranch>...origin/develop # must pass the path gate
25
+ gh pr create --base <productionBranch> --head develop --title "cms-edit: <version or editor-pack>"
26
+ # or ff-only merge via gh
27
+ ```
28
+
29
+ Do **not** use HSD `production-hsd-website` (or any `productionPath`) as the working tree. Do **not** run `pnpm cms-edit:deploy`, `vercel deploy`, or `./scripts/deploy-cms-edit-host.sh`.
30
+
31
+ ## After a successful host
32
+
33
+ Reconnect Grok `/mcps` → `i` is an editor step if OAuth tokens were dead — not a substitute for the health check.
34
+
35
+ If the diff is not cms-edit-only, **stop and hand off** — no production merge.
@@ -6,9 +6,8 @@ Default mode for this repo: **site-first**.
6
6
 
7
7
  ### Branch policy
8
8
 
9
- - Agents may commit and push **`develop`** and **`feature/*`** only.
10
- - **Never** push to `main`, `master`, `production`, or any production branch — **human-only** for all customer sites.
11
- - Do **not** ship from a production checkout (e.g. HSD `~/source/customers/hopskipdrive/production-hsd-website`). Use the develop checkout only.
9
+ - Agents may commit and push **`develop`** and **`feature/*`**. Customer production (`main`, HSD `production`) only when the **cms-edit-only** gate passes (`se-core-product` `packages/skills/references/agent-session/cms-edit-prod-merge.md`).
10
+ - **Never** merge marketing `src/` to production. **Never** ship from a production checkout (e.g. HSD `production-hsd-website`). Use the develop checkout only.
12
11
  - Prefer **draft PRs** to `develop` over direct pushes when `gh` is available.
13
12
 
14
13
  ### Core vs customer placement
@@ -56,4 +55,4 @@ Never hand-edit `package.json` dependency versions.
56
55
 
57
56
  ### Production handoff
58
57
 
59
- When ready for production, agents **stop** and deliver a handoff note — they do not merge to `main` / `production` or promote Vercel/Netlify. Production promotion is always **human-only**. See skill Step 8.
58
+ When **marketing** work is ready, agents **stop** and hand off. **cms-edit-only** host rollouts may merge `develop` → production one site at a time (health-check, stop at first failure). No `vercel deploy`. See skill Step 7–8 and `cms-edit-prod-merge.md`.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "canonicalPatchesScript": "~/source/se/se-core-product/scripts/check-no-pnpm-patches.mjs",
3
3
  "pinOverrides": {
4
- "next": "^15.5.21",
4
+ "next": "^16.3.1",
5
5
  "@types/node": "^24.13.3"
6
6
  },
7
7
  "pnpm": {
@@ -121,7 +121,7 @@ If a route needs a different layout (e.g. no header/footer), create `layout.tsx`
121
121
 
122
122
  ## A/B Test Variant Route (`page-test`)
123
123
 
124
- When A/B testing is enabled, variant pages are served through a `/page-test/[...slugs]` route that the middleware rewrites to. This route **must** use:
124
+ When A/B testing is enabled, variant pages are served through a `/page-test/[...slugs]` route that the proxy (Next 16) or middleware (Next 15) rewrites to. This route **must** use:
125
125
 
126
126
  - **`generatePageTestMetadata`** (not `generatePageMetadata`) so that `robots`/`indexed` comes from the **canonical/control** page — variant entries are intentionally `indexed: false` in Contentful.
127
127
  - **`generatePageTest`** (not `generatePage`) so breadcrumbs, `model.href`, and JSON-LD use the **control/canonical** path while variant **content** still renders.
@@ -11,7 +11,7 @@ This skill adds the ability for **non-technical content editors** to manage redi
11
11
  - Editors create `redirect` entries (they can **pick** existing Pages/Articles/etc. via the single From/To internal pickers or type raw paths).
12
12
  - On publish, a Contentful webhook calls your Vercel **Deploy Hook**.
13
13
  - The next build fetches the current redirects (via the normal CDA helpers), runs `buildRedirectMap`, and writes a tiny static file.
14
- - Your `middleware.ts` imports that file and does the redirect **synchronously with zero runtime cost**.
14
+ - Your `proxy.ts` (Next 16) or `middleware.ts` (Next 15) imports that file and does the redirect **synchronously with zero runtime cost**.
15
15
  - Propagation time = normal Vercel build (usually 1–3 minutes). Robust, no extra tokens or Edge Config required.
16
16
 
17
17
  A faster "seconds" path (Edge Config) is explicitly **not** included in v1 per product direction — the model and helpers are forward-compatible if you add it later.
@@ -133,19 +133,19 @@ Wire it into the build:
133
133
 
134
134
  (You can also call it from a `next.config.ts` `webpack` hook or a turbo pipeline step — whatever is consistent with how you generate the A/B static data.)
135
135
 
136
- ### 4.2 Static middleware (zero runtime work)
136
+ ### 4.2 Static proxy (zero runtime work)
137
137
 
138
- Create `middleware.ts` at the root of your Next app (alongside `next.config.ts`):
138
+ On Next 16 create `src/proxy.ts` (Next 15: `src/middleware.ts` + `export function middleware`). Canonical template: `apps/example-empty/src/proxy.ts`.
139
139
 
140
140
  ```ts
141
141
  import { NextResponse, type NextRequest } from 'next/server';
142
- import { redirects } from './src/generated/redirects'; // the file we just generated
142
+ import { redirects } from '@/generated/redirects';
143
143
 
144
144
  // If you also use A/B testing static middleware, import and compose here.
145
145
  import { createStaticAbTestMiddleware } from '@se-studio/ab-testing/middleware';
146
- // import { testsByPath } from './src/generated/abTests';
146
+ // import { testsByPath } from '@/generated/abTests';
147
147
 
148
- export async function middleware(request: NextRequest) {
148
+ export async function proxy(request: NextRequest) {
149
149
  const { pathname } = request.nextUrl;
150
150
 
151
151
  // 1. Redirects first (cheap object lookup)
@@ -177,7 +177,7 @@ export const config = {
177
177
  };
178
178
  ```
179
179
 
180
- If you already have a `middleware.ts` for A/B or other things, just add the redirect check at the very top (before any other logic).
180
+ If you already have a `proxy.ts` (or Next 15 `middleware.ts`) for A/B or other things, just add the redirect check at the very top (before any other logic).
181
181
 
182
182
  ### 4.2.1 Redirects and sitemaps
183
183
 
@@ -370,7 +370,7 @@ Restricts request-time Next.js APIs in:
370
370
 
371
371
  Banned: `next/headers` (headers, cookies, draftMode), `connection` from `next/server`, `unstable_noStore` from `next/cache`. `unstable_cache` and other `next/cache` exports remain allowed.
372
372
 
373
- Dynamic by design (no restriction): `(cms-dev)`, `preview`, `api`, `middleware.ts`.
373
+ Dynamic by design (no restriction): `(cms-dev)`, `preview`, `api`, `proxy.ts` (Next 16) / `middleware.ts` (Next 15).
374
374
 
375
375
  Lint is necessary but not sufficient — route policy + production smoke still required.
376
376
 
@@ -5,7 +5,7 @@ description: "Start and manage agent work sessions across se-core-product and cu
5
5
 
6
6
  # Agent session workflow
7
7
 
8
- Orchestrates **where** to work, **where code belongs**, and **how to isolate parallel features**. **Humans only** merge/promote to `main` / production (all customer sites + core) — agents stop at handoff.
8
+ Orchestrates **where** to work, **where code belongs**, and **how to isolate parallel features**. **Humans only** merge marketing production and core `main` — except **cms-edit-only** customer merges (reference `cms-edit-prod-merge.md`).
9
9
 
10
10
  **Registry:** [`packages/skills/references/agent-session/projects.registry.json`](../../references/agent-session/projects.registry.json) — repo paths, `worktreesRoot`, `productionPath` / `productionBranch`, integration branches, hosted MCP keys.
11
11
 
@@ -57,12 +57,12 @@ feature/<scope>/<short-slug>
57
57
 
58
58
  Integration branches (agents push feature branches here via PR or merge — **never production**):
59
59
 
60
- | Repo type | Integration branch | Production (human-only) |
61
- |-----------|-------------------|-------------------------|
62
- | `se-core-product` | `dev` | `main` |
63
- | Customer sites | `develop` (or registry override) | Usually `main`; HSD uses branch **`production`** and checkout `productionPath` |
60
+ | Repo type | Integration branch | Production |
61
+ |-----------|-------------------|------------|
62
+ | `se-core-product` | `dev` | `main` — **never** agent |
63
+ | Customer sites | `develop` (or registry override) | Usually `main`; HSD **`production`**. Marketing: human-only. **cms-edit-only:** agents may merge — see below |
64
64
 
65
- **Never** push, merge, or promote registry `productionBranch` / work in `productionPath`. Agent work uses `path` (develop checkout) only.
65
+ **Never** work in `productionPath`. Agent work uses `path` (develop checkout) only.
66
66
 
67
67
  ---
68
68
 
@@ -253,8 +253,9 @@ Agents may push to:
253
253
 
254
254
  - `dev` / `develop` (via feature branch merge or direct if user prefers)
255
255
  - `feature/*` branches
256
+ - Customer production (`main`, HSD `production`) **only** when the [cms-edit-only gate](../../references/agent-session/cms-edit-prod-merge.md) passes
256
257
 
257
- Agents must **never** push to `main`, `master`, `production`, or any registry `productionBranch`. Agents must **never** ship from a registry `productionPath` (e.g. HSD `~/source/customers/hopskipdrive/production-hsd-website`).
258
+ Agents must **never** push **se-core-product** `main`, or customer production when the diff is not cms-edit-only. Agents must **never** ship from a registry `productionPath` (e.g. HSD `~/source/customers/hopskipdrive/production-hsd-website`).
258
259
 
259
260
  **Preferred:** open a **draft PR** targeting the integration branch:
260
261
 
@@ -268,7 +269,7 @@ If `gh` is unavailable or user prefers direct push, push `feature/*` and note in
268
269
 
269
270
  ## Step 8 — Handoff (production-ready)
270
271
 
271
- When work is ready for human review / production promotion, **stop** — do not merge to `main`, `production`, or any production branch. **Production promotion is human-only** for core and every customer site.
272
+ When **marketing** work is ready for production, **stop** — do not merge to `main` / `production`. **Exception:** cms-edit-only (Step 7 + [`cms-edit-prod-merge.md`](../../references/agent-session/cms-edit-prod-merge.md)) — merge one customer repo at a time, wait for cms-edit host Ready, verify `/api/health`, stop at the first failure.
272
273
 
273
274
  1. Set manifest `status: ready_for_review`
274
275
  2. Deliver handoff using template below
@@ -300,9 +301,9 @@ When work is ready for human review / production promotion, **stop** — do not
300
301
  2. <customer pnpm update @se-studio/...>
301
302
  3. <customer PR>
302
303
 
303
- ### Production (human-only)
304
- Ready for you to merge to production (`main` or site `productionBranch`) / promote Vercel.
305
- Agent will not push production or use productionPath checkouts.
304
+ ### Production
305
+ Marketing: human-only (`main` or site `productionBranch`).
306
+ cms-edit-only: agent may merge per `cms-edit-prod-merge.md` (not `productionPath`, not `vercel deploy`).
306
307
  ```
307
308
 
308
309
  ---
@@ -341,7 +342,7 @@ Agent must load this skill, write manifest (with `worktree` path), run placement
341
342
 
342
343
  ## Quick reference — project keys
343
344
 
344
- | key | Integration | Production (human-only) | Type |
345
+ | key | Integration | Production | Type |
345
346
  |-----|-------------|-------------------------|------|
346
347
  | `se-core-product` | `dev` | `main` | core monorepo |
347
348
  | `se2026` | `develop` | `main` | customer |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: site-workflows-deps-update
3
- description: "Update npm dependencies to latest across se-core-product and consumer SE Studio sites, one repo at a time. Pins Next.js 15 and Node 24, updates pnpm to latest 11.x, enforces no pnpm patches everywhere. Validates, commits, and pushes to dev/develop. Use when asked to update outdated packages or bump dependencies."
3
+ description: "Update npm dependencies to latest across se-core-product and consumer SE Studio sites, one repo at a time. Pins Next.js 16.3 and Node 24, updates pnpm to latest 11.x, enforces no pnpm patches everywhere. Validates, commits, and pushes to dev/develop. PointMe stays on Next 15.5 until its dedicated upgrade. Use when asked to update outdated packages or bump dependencies."
4
4
  ---
5
5
 
6
6
  # SE dependency update (one project at a time)
@@ -11,7 +11,7 @@ Update npm dependencies to **latest** in se-core-product and consumer repos that
11
11
 
12
12
  **Default:** Process **one repo per invocation**. At the end, summarize changes and offer the next project.
13
13
 
14
- **Never:** push to `main`/`master`/`production` or any production branch; promote from production checkouts (e.g. HSD `production-hsd-website`); bump Next to 16; bump Node to 25+; use `pnpm patch` / `patchedDependencies` / `patches/`; bypass or remove `minimumReleaseAge`; **hand-edit `package.json` dependency versions** (use `pnpm update` instead). Production promotion is **human-only** for all customer sites.
14
+ **Never:** push to `main`/`master`/`production` or any production branch; promote from production checkouts (e.g. HSD `production-hsd-website`); bump Next to 17; bump Node to 25+; use `pnpm patch` / `patchedDependencies` / `patches/`; bypass or remove `minimumReleaseAge`; **hand-edit `package.json` dependency versions** (use `pnpm update` instead). Production promotion is **human-only** for all customer sites. **PointMe:** keep `overrides.next` on `^15.5.x` until the Next 16 site wave — do not pull it to 16 during a routine deps update.
15
15
 
16
16
  ---
17
17
 
@@ -101,15 +101,16 @@ minimumReleaseAgeExclude:
101
101
  - '@se-studio/*'
102
102
 
103
103
  overrides:
104
- next: ^15.5.19
104
+ next: ^16.3.1
105
105
  '@types/node': ^24.13.2
106
106
  ```
107
107
 
108
108
  - **`minimumReleaseAge: 1440`** — do not install packages published in the last 24 hours (supply-chain guard).
109
109
  - **`@se-studio/*` exclude** — our own packages may update immediately after npm publish.
110
110
  - **Keep repo-specific additional excludes** when present (e.g. vitest pins in se-core-product, `@emnapi/runtime` in se-website-2026, PointMe `mapbox-gl` / `react-day-picker` overrides).
111
+ - **PointMe exception:** leave `next: ^15.5.x` until that site’s Next 16 wave.
111
112
 
112
- `pnpm update -r --latest` would bump `next` → 16 and `@types/node` → 26 without the overrides block. The overrides prevent that.
113
+ `pnpm update -r --latest` would bump `next` past the supported 16.3 line and `@types/node` → 26 without the overrides block. The overrides prevent that.
113
114
 
114
115
  **Never bypass `minimumReleaseAge`** during dependency updates. Do not remove the block, comment it out, or use undocumented pnpm flags. If a non-`@se-studio` package was published within 24 hours, it stays at the current version until it ages out — note that in the report and re-run later if needed.
115
116
 
@@ -162,7 +163,7 @@ pnpm update -r \
162
163
  Safety re-pin after update:
163
164
 
164
165
  ```bash
165
- pnpm update -r next@^15 @types/node@^24
166
+ pnpm update -r next@^16.3.1 @types/node@^24
166
167
  pnpm install
167
168
  ```
168
169
 
@@ -217,7 +218,7 @@ Include in the summary:
217
218
 
218
219
  - Major dependency bumps (from the Step 1 audit diff)
219
220
  - pnpm version: before → after
220
- - Confirmed pins: Next 15.x, Node 24, `@types/node` ^24
221
+ - Confirmed pins: Next 16.3.x (PointMe: Next 15.5.x until its upgrade), Node 24, `@types/node` ^24
221
222
  - Confirmed `minimumReleaseAge: 1440` and `@se-studio/*` exclude present
222
223
  - Packages still outdated because they are inside the 24-hour release window (if any)
223
224
  - Patches check bootstrapped (yes/no)
@@ -76,14 +76,24 @@ Write `AGENTS.md` at the project root. Fill in the user's email address (from me
76
76
  Include the **agent session workflow block** from [`packages/skills/references/agent-session/customer-agents-block.md`](../../references/agent-session/customer-agents-block.md) (branch policy, placement, parallel features, handoff).
77
77
 
78
78
  ```markdown
79
- # Next.js: ALWAYS read docs before coding
79
+ <!-- BEGIN:nextjs-agent-rules -->
80
80
 
81
- Before any Next.js work, find and read the relevant doc in `node_modules/next/dist/docs/`. Your training data is outdated — the docs are the source of truth.
81
+ # This is NOT the Next.js you know
82
+
83
+ This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
84
+
85
+ This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
86
+
87
+ <!-- END:nextjs-agent-rules -->
88
+
89
+ <!-- BEGIN:se-studio-package-rules -->
82
90
 
83
91
  # @se-studio packages: ALWAYS read docs before coding
84
92
 
85
93
  Before using any `@se-studio/*` package, read the relevant `node_modules/@se-studio/<package>/docs/llms.md`.
86
94
 
95
+ <!-- END:se-studio-package-rules -->
96
+
87
97
  # userEmail
88
98
  The user's email address is [USER_EMAIL].
89
99
 
@@ -116,7 +126,7 @@ One feature = one `feature/<scope>/<slug>` branch. **Git worktree required** for
116
126
 
117
127
  ### Production handoff
118
128
 
119
- Agents stop at handoff — they do not merge to `main` / production or promote production deploys. Human-only. See skill `site-workflows-agent-session` Step 8.
129
+ Agents stop at handoff for **marketing** production. cms-edit-only host merges: see `site-workflows-agent-session` and `cms-edit-prod-merge.md`.
120
130
 
121
131
  ## CMS editing (cms-edit)
122
132
 
@@ -19,7 +19,7 @@ Remove **dead weight** from an SE Studio site repo without changing product beha
19
19
 
20
20
  **Default:** Plan mode first — present a classified audit table before deleting anything.
21
21
 
22
- **Never:** push to `main`/`master`/`production` or promote production (human-only for all customer sites); delete `docs/cms-editor/` or committed `cms-edit/*/editor-pack/` without explicit user request; fix Dependabot alerts unless the user asks.
22
+ **Never:** push marketing production or use production checkouts (cms-edit-only gate is in `cms-edit-prod-merge.md`); delete `docs/cms-editor/` or committed `cms-edit/*/editor-pack/` without explicit user request; fix Dependabot alerts unless the user asks.
23
23
 
24
24
  ---
25
25
 
@@ -153,7 +153,7 @@ pnpm validate # or repo-specific validate from AGENTS.md
153
153
 
154
154
  Commit on integration branch only. Suggested message: `chore: remove stale scripts, docs, and tooling`.
155
155
 
156
- Hand off production promotion to the human — never push `main` / `production` or use production checkouts to ship.
156
+ Hand off **marketing** production. Do not use production checkouts. cms-edit-only: `cms-edit-prod-merge.md`.
157
157
 
158
158
  ---
159
159