Remove the root and learn meta.json entries that placed the Cookbook in the
docs sidebar / Learn footer, deferring the nav-placement decision (top-level
tab vs sidebar group) to a follow-up. The recipe pages still route at
/cookbook and /cookbook/daytona (Fumadocs discovers MDX from the filesystem,
confirmed via .source generation), so Daytona-side deeplinks continue to
work. Nothing in our docs nav points at the section until the decision lands.
Also drops the stale '[Cookbook: State Machine]' Learn entry entirely (it had
been temporarily repointed to /cookbook in the previous commit).
OSS-222
Prerelease canary publishing is now an input mode on publish-release.yml's
workflow_dispatch. The dedicated prerelease.yml workflow is no longer
reachable and its workflow_call delegation never worked (npm matches the
OIDC token's caller `workflow_ref`, which was always prerelease.yml —
unregistered with any package's trust record).
Canaries are now dispatched via:
gh workflow run publish-release.yml \
-f scope=monorepo -f mode=prerelease -f suffix=<name>
The `bump-prerelease.ts` and `prerelease.ts` scripts remain unchanged; they
are invoked by publish-release.yml when `mode=prerelease`.
Folds prerelease.yml's canary publishing back into publish-release.yml, which
is the workflow registered as npm trusted publisher for all 15 @copilotkit/*
monorepo packages and @copilotkitnext/angular. Since npm matches on the OIDC
token's `workflow_ref` claim (the caller), the canary must dispatch from THIS
workflow file — not from a separate workflow that delegates via workflow_call.
Changes:
- Add `mode` (stable|prerelease) and `suffix` inputs to workflow_dispatch.
`mode` selects the publish script and gates post-publish tag/release steps;
`suffix` is forwarded to bump-prerelease.ts when mode=prerelease.
- Add a conditional `Bump prerelease versions` step in the build job that
runs `scripts/release/bump-prerelease.ts` before `Build packages` whenever
`inputs.mode == 'prerelease'`. The bumped versions flow through the
workspace artifact to the publish job exactly as in the deleted
prerelease.yml.
- Switch the publish step's `PUBLISH_SCRIPT` env var to be mode-driven:
`prerelease.ts` for canaries, `publish-release.ts` for stable. The old
`inputs.publish-script` plumbing was removed in the prior commit along
with the workflow_call inputs schema.
- Simplify the publish-job `meta` step now that workflow_call is gone: mode
defaults to `stable` unless workflow_dispatch passes `prerelease`.
- Rewrite the top-of-file comment to document both modes and the OIDC trust
binding, replacing the old "MANUAL RETRIGGER" wording which only covered
the stable retrigger path.
All post-publish gating (`steps.meta.outputs.mode != 'prerelease'` on the tag,
release, and stable-summary steps; `mode == 'prerelease'` on the prerelease
summary) was already in place from the prior PR-A architecture and is left
intact. The `Verify publish step emitted version` step keeps its prerelease
bypass.
Canary invocation after this lands:
gh workflow run publish-release.yml \
-f scope=monorepo -f mode=prerelease -f suffix=<name>
The workflow_call trigger was added in the PR-A/B architecture so prerelease.yml
could invoke this workflow as a reusable workflow. That architecture was wrong:
npm's trusted-publisher matching uses the OIDC token's `workflow_ref` claim,
which is the CALLER workflow (prerelease.yml), not the callee's
`job_workflow_ref` (publish-release.yml). Since prerelease.yml has no trust
record, every canary attempt failed at the npm publish step with ENEEDAUTH.
This commit removes the dead code:
- workflow_call: trigger block (inputs schema + secrets block)
- the `github.event_name != 'workflow_call'` guard on the build job
- the `needs.build.result == 'skipped' && github.event_name == 'workflow_call'`
branch on the publish job's `if:` (simplified to plain success check)
The follow-up commit folds prerelease support back into this workflow as a
`workflow_dispatch` mode, so the canary path executes from the workflow with
the trust record.
Add an installable Agent Skill that wires a Daytona-backed runCode server
tool into an existing CopilotKit Built-in Agent app. Mirrors the structure
of skills/copilotkit-setup (SKILL.md + assets + references + eval.yaml +
sources.md + a workspace fixture).
References point at Daytona's maintained sources (llms.txt, dashboard
limits, the official daytona skill, and the Daytona MCP server) rather than
duplicating a hand-copied SDK surface that would rot. The runCode tool
itself was validated live against published @copilotkit/runtime@1.58.0
with Python and JavaScript snippets executing in real sandboxes.
The recipe in docs/content/docs/cookbook/daytona.mdx now also points at
this skill alongside the inline coding-agent prompt.
OSS-222
Add a top-level Cookbook section to the docs (landing page + meta.json wiring)
and the first recipe: wire CopilotKit's Built-in Agent up with a runCode server
tool that executes code in an isolated Daytona sandbox. The tool takes a
language (python/typescript/javascript, default python) and returns stdout +
exit code; recipe code validated end to end against published
@copilotkit/runtime@1.58.0 with both Python and JavaScript snippets round-
tripping through a real sandbox.
Also fixes a stale '../direct-to-llm/cookbook/state-machine' link in
learn/meta.json by repointing it at the new /cookbook section.
OSS-222
The @ag-ui/aws-strands TypeScript adapter ships alongside the Python
ag_ui_strands package but the docs only showed Python snippets. Add a
TypeScript tab next to every Python snippet (Python default, `persist`
on the tab group so a reader's choice sticks across pages) covering:
- quickstart: project init, install, agent file, run command
- frontend-tools: @tool stub + createStrandsApp server
- shared-state (read + write): StrandsAgentConfig.stateContextBuilder
- generative-ui tool-rendering: backend tool definition
- generative-ui state-rendering: ToolBehavior.stateFromArgs
Also applied to the parallel showcase/shell-docs tree. Non-code pages
(deploy-agentcore, copilot-runtime, inspector, etc.) remain untouched
since they either re-export shared snippets or have no framework code.
## Summary
- Inline MDX helpers imported from `@/snippets/...` recursively by
import target
- Remove the `ComponentExamples` SNIPPET_MAP workaround
- Add focused regression coverage for snippet helper imports and runtime
component imports
## Tests
- `npm test` in `showcase/shell-docs`
- `npm run typecheck` in `showcase/shell-docs`
- `npm run lint` in `showcase/shell-docs` (passes with existing
warnings)
- `npm run build` in `showcase/shell-docs`
- pre-commit: root package tests and package checks via lefthook
## Why
Follow-up to #5063. Together they unblock customer canary publishes that
have been failing with `npm ENEEDAUTH` since 2026-05-15.
#5063 parametrized `publish-release.yml` to support `workflow_call`.
This PR converts `prerelease.yml`'s publish path into a thin caller of
that reusable workflow. Because npm OIDC's `job_workflow_ref` claim
resolves to the callee in a reusable-workflow invocation, the existing
trust record on `publish-release.yml` covers both stable AND canary
publishes — no second trusted-publisher record needed (npm only allows
one per package).
## What changes
- `prerelease.yml`'s `build` job is preserved verbatim (checkout,
install, `bump-prerelease.ts --suffix`, build, test, upload `workspace`
artifact).
- The old `publish` job is replaced with `uses:
./.github/workflows/publish-release.yml` with `mode: prerelease`,
`publish-script: prerelease.ts`, `scope`, `dry-run`.
- The caller's `publish` job grants explicit `permissions: { contents:
write, id-token: write, actions: read }` — REQUIRED for the callee's npm
OIDC mint (per GitHub Actions, caller's per-job permissions cap the
callee's declared permissions).
- The caller's `workflow_dispatch.inputs.dry_run` (underscore, preserved
for backwards compat) maps to the callee's `dry-run` (hyphen) at the
`with:` boundary.
- No `secrets:` block — Notion not needed for prereleases; callee
declares `NOTION_API_KEY` optional and gates it on `mode == 'stable'`.
## Verification plan
1. Dispatch `prerelease.yml` with `scope: monorepo`, `suffix:
test-oidc-refactor`, `dry_run: true` → confirms plumbing without an
actual publish.
2. Dispatch again with `dry_run: false` → first OIDC-handshake-verifying
real canary.
3. `npm view @copilotkit/runtime@1.58.0-canary.test-oidc-refactor --json
| jq '.dist.attestations'` → confirm provenance attestation references
`publish-release.yml`.
## Test plan
- [ ] CI green.
- [ ] Post-merge: dispatch dry-run + real canary per Verification plan
above.
- [ ] Confirm provenance attestations land via `npm view`.
Supersedes #5066 (closed when #5063's base branch was deleted).
## Summary
- Bundle Inter Medium/Bold locally for shell-docs OG image rendering and
pass them to ImageResponse.
- Localize the OG background and CopilotKit logo as data URIs so the
route avoids render-time remote image fetches.
- Add route tests for valid image construction, unknown slug 404
propagation, render failure 500 behavior, and framework-scoped slug
resolution.
## Verification
- pnpm test in showcase/shell-docs (36 passed)
- pnpm lint in showcase/shell-docs (exits 0; existing warnings only)
- Local dev-server curl: /og/quickstart/og.png returned 200 image/png,
valid 1200 x 630 PNG
- Local dev-server curl: /og/does-not-exist/og.png returned 404
- Commit hook ran test-and-check-packages successfully
## Notes
- showcase/shell-docs is not present in the Nx project graph, so there
was no direct shell-docs Nx target to run.
- pnpm typecheck / pnpm build for standalone shell-docs currently fail
on pre-existing src/lib/rehype-code-meta.ts missing shiki types.
## Summary
- Unify authored and generated shell-docs navigation so the sidebar
keeps the same structure across framework modes.
- Restore setup-content bundling from integration-owned docs and wire
shell-docs to consume the generated bundle at runtime.
- Audit and fix the LangGraph TypeScript and Google ADK code regions so
the generated snippets are more useful and accurate.
- Tighten docs/build routing and workflow triggers so shell-docs
rebuilds when the relevant integration docs inputs change.
## Testing
- Shell-docs unit tests passed.
- Shell-docs typecheck passed.
- Shell-docs lint passed with existing repository warnings only.
- Setup-content bundle generation passed.
- Python integration files compiled successfully.
- Workflow YAML parsed successfully.
## Summary
- Restore the missing NewLookAndFeelPreview component for shell-docs
troubleshooting migration pages.
- Wire the MDX registry to render the real preview instead of an empty
shim.
## Verification
- npm --prefix showcase/shell-docs run typecheck
- npm --prefix showcase/shell-docs run lint (warnings only,
pre-existing)
- Browser verified
http://localhost:3003/built-in-agent/troubleshooting/migrate-to-1.8.2:
preview launcher renders and opens populated panel
- git commit pre-commit hooks passed: check-binaries, lint-fix,
test-and-check-packages
## Notes
- @copilotkit/showcase-scripts:verify-shell-docs:fast runs but fails on
existing broad shell-docs dead-link/import/content backlog unrelated to
PDX-203.
- Production next build hung locally after content generation with no
diagnostics; verified the affected route via dev server instead.
PR-B CR-r1 fix: reusable-workflow permissions in GitHub Actions are capped by
the caller's per-job permissions. The callee (publish-release.yml from PR-A)
declares id-token: write + contents: write on its publish job, but without
the caller (prerelease.yml) granting those at its own publish-job level, the
callee gets only the workflow-level default (contents: read). The OIDC token
mint then fails silently and npm publish errors.
4 of 7 CR agents independently flagged this. The spec missed it.
Adds contents: write (callee uses it in stable mode; gated off in prerelease
but matches the callee's declaration), id-token: write (required for OIDC),
and actions: read (required for actions/download-artifact in callee).
Spec updated to document this requirement.
PR-B of the two-PR refactor: prerelease.yml's build job is preserved verbatim
(checkout, install, bump-prerelease.ts with --suffix, build, test, upload-
artifact "workspace"); its publish job is replaced with a workflow_call
invocation into publish-release.yml from PR-A. The reusable workflow's
job_workflow_ref OIDC claim matches the existing trusted-publisher record on
publish-release.yml, so the canary publishes succeed without registering a
second trust binding (which npm does not allow).
The caller's workflow_dispatch.inputs.dry_run (underscore, preserved) maps
to the callee's dry-run (hyphen) at the with: boundary — independent keys
in independent namespaces. No secrets passed; Notion not needed for
prereleases.
Spec: https://www.notion.so/36d3aa381852811ba10ad1bcd228d6d8
Unblocks: @copilotkit/react-core canary --suffix thread-id-propagation.
Stacked on PR-A (fix/publish-release-workflow-call).
## Why
The `release / pre` workflow (`prerelease.yml`) has been failing with
`npm ENEEDAUTH` on every run since 2026-05-15 — see e.g. run
`26529550757`. Customer canary publishes are blocked.
Root cause: npm enforces **exactly one** trusted publisher per package.
All 16 monorepo-scoped packages (15 `@copilotkit/*` +
`@copilotkitnext/angular`) are bound to `publish-release.yml @
CopilotKit/CopilotKit`. `prerelease.yml` cannot register as a second
trusted publisher and therefore cannot complete the OIDC handshake.
## Fix (sequenced)
**This PR (PR-A)** parametrizes `publish-release.yml` so it can also be
invoked via `workflow_call`. A follow-up PR (PR-B) converts
`prerelease.yml` into a thin caller of this workflow. Because npm OIDC's
`job_workflow_ref` claim resolves to the *callee* in a reusable-workflow
invocation, the existing trust record on `publish-release.yml` covers
both the stable and canary publish paths — no npm UI changes, no second
trusted publisher.
## What changes
- New `workflow_call:` trigger with input schema (`scope`, `mode`,
`dry-run`, `publish-script`) and optional `NOTION_API_KEY` secret.
- New `dry-run` input on the existing `workflow_dispatch` trigger
(enables this PR's own post-merge verification via a sacrificial release
branch).
- New `meta` step in the publish job unifying scope+mode resolution
across all 3 event types (`pull_request`, `workflow_dispatch`,
`workflow_call`).
- Build job gated to skip on `workflow_call` (the caller provides the
artifact).
- Publish job `if:` override allows skipped-`needs.build` *only* when
`event_name == 'workflow_call'` (prevents phantom publish on
`pull_request: closed` without merge).
- All post-publish steps gated on `success() && inputs.dry-run != true
&& steps.meta.outputs.mode != 'prerelease'` so tag push and GH Release
are only created on a successful stable publish.
- `NOTION_API_KEY` env wiring gated on `mode == 'stable'`.
- `Release summary` split into three variants (stable / prerelease /
dry-run) so the summary never lies about what actually happened.
- New `Verify publish step emitted version` guard between npm publish
and tag creation.
- `inputs.publish-script` and `steps.meta.outputs.scope` passed via
`env:` (defense-in-depth shell hygiene).
- Concurrency key kept static (`publish-release`) — explicit decision,
documented in the spec.
## Verification plan (post-merge, before PR-B)
1. Cut a sacrificial release branch (e.g.
`release/publish/monorepo/v0.0.0-test`).
2. Dispatch `publish-release.yml` via `workflow_dispatch` with
`scope=monorepo`, `dry-run=true`.
3. Confirm the new gating logic, scope/mode resolution, and artifact
handoff all work end-to-end without an actual npm publish (the publish
step is skipped under `dry-run`). Note: `dry-run` does NOT exercise the
OIDC handshake — that is verified by PR-B's first real canary.
## Test plan
- [ ] CI green on the PR.
- [ ] After merge: sacrificial-branch `workflow_dispatch` with
`dry-run=true` runs cleanly and emits the "Dry Run Completed" summary.
- [ ] No regression to stable releases — verified by next real stable
release using the existing `pull_request: closed` path.
## Summary
- Disabled Fumadocs search in `showcase/shell-docs` so Cmd/Ctrl+K no
longer opens the built-in dialog.
- Centralized the custom search modal behind a single app-level
provider/event bridge so desktop and mobile triggers share one instance.
- Kept the custom search button and hotkey behavior intact, including
Escape to close.
## Testing
- `npm run typecheck` in `showcase/shell-docs` passed.
- `npm run lint` in `showcase/shell-docs` passed with pre-existing
warnings only.
- Verified locally in the in-app browser that Cmd+K opens one custom
search modal, Escape closes it, and no Fumadocs search dialog appears.
## Summary
- Bumps `@ag-ui/langgraph` from `0.0.33` to `0.0.34` across runtime,
sdk-js, and the showcase langgraph-typescript integration.
- Picks up the forwarded-headers fix from ag-ui PR #1798:
https://github.com/ag-ui-protocol/ag-ui/pull/1798
## Why
`@ag-ui/langgraph@0.0.34` injects `agent.headers` as
`config.configurable.copilotkit_forwarded_headers` inside
`prepareStream`. This means the X-AIMock-Context header (and any other
X-* header) reliably reaches the CopilotKit Python middleware regardless
of whether the LangGraph dev server has the
`LANGGRAPH_HTTP=configurable_headers` bridge enabled. This closes the
header-propagation gap that was preventing showcase D5/D6
langgraph-typescript probes from going green.
## Test plan
- [ ] CI green
- [ ] D5/D6 langgraph-typescript probes go GREEN after merge + deploy
## Risk
The ag-ui PR's `dojo / langgraph-typescript` CI was flaky on the rerun
(passed on the 2nd attempt after 3-retry exhaustion on the 1st). Watch
the showcase D6 langgraph-typescript probe closely after deploy.
Commit 0a24b5c430 attempted to regenerate the outer lockfile but produced
invalid JSON (trailing commas, JSON5-style formatting from a non-npm
tool). Docker stage 1 (frontend) npm ci --legacy-peer-deps fails with
EUSAGE "can only install with an existing package-lock.json" because npm
refuses to parse it.
This commit regenerates the file via `npm install --package-lock-only
--legacy-peer-deps` to produce a strict-JSON lockfile pinning
@ag-ui/langgraph@0.0.34. Diff is large because the prior file's
formatting differs structurally from canonical npm output.
PR-A CR-r2 fixes (2 bucket-(a) findings from 7-agent confirmation round).
A4: Tighten publish-job `if:` so `needs.build.result == 'skipped'` is only honored when
the event is `workflow_call` (the intentional skip for the reusable workflow callee).
Previously, a `pull_request: closed` event on a release branch where the PR was closed
WITHOUT merging would cause the build job to skip (its own merged-true guard), then the
publish job's permissive `if:` would still run it — a phantom publish from an unmerged
release PR.
A5: Every post-publish step's custom `if:` overrode the default implicit `success()`
check, meaning a failure in `Publish to npm` or the `Verify version` guard would not
prevent downstream steps (tag push, GitHub Release create) from running. Prepended
`success() && ` to all post-publish step `if:` conditions to restore the implicit gate.
Spec: https://www.notion.so/36d3aa381852811ba10ad1bcd228d6d8
## Summary
Removes `json`, `jsonc`, `json5` from the `lint-fix` pre-commit hook's
glob in `lefthook.yml`. These extensions caused `oxfmt --write` to
rewrite `package.json` files into invalid JSON5 syntax, breaking every
commit that touched a `package.json` until the hook was bypassed.
## The bug
When `package.json` is staged and the `lint-fix` hook runs `oxlint
--fix` + `oxfmt --write` over `{staged_files}`, oxfmt rewrites the file
into:
- 4-space indent (instead of 2)
- Trailing commas after the last key in every object
- Compact single-line objects (e.g. `"publishConfig": {"access":
"public"}`)
The result is **invalid strict JSON**. `pnpm install` then fails with:
```
ERR_PNPM_JSON_PARSE Unexpected token } in JSON at line 8 column 5
```
This blocks the commit because lefthook re-stages the mangled file
(`stage_fixed: true`), and any downstream tooling that calls `pnpm
install` (sync-lockfile, CI, etc.) rejects it.
### Reproduction
With the buggy glob in place:
1. Edit any `package.json` (e.g. add a key)
2. `git add packages/<pkg>/package.json`
3. `lefthook run pre-commit --command lint-fix`
4. oxfmt logs `1 file reformatted`
5. `node -e
"JSON.parse(require('fs').readFileSync('packages/<pkg>/package.json','utf8'))"`
throws `SyntaxError: Expected double-quoted property name in JSON`
PRs #5054 and #5055 both shipped with `LEFTHOOK_EXCLUDE=lint-fix` to
work around this.
## The fix
Drop `json,jsonc,json5` from the `lint-fix` glob. JSON formatting in
this repo is owned by `pnpm` (writes strict 2-space JSON during lockfile
sync) and manual editing — neither produces JSON5. oxfmt 0.36 exposes no
per-file knobs (`printWidth`, `proseWrap`, `ignorePatterns` only) to
keep `package.json` valid output, so excluding `.json*` at the hook
layer is the minimal correct fix.
After the fix:
- JSON-only staged sets cause lefthook to skip `lint-fix` (`no files for
inspection`) instead of mangling the file
- TS/JS/MD/CSS/YAML/etc. continue to flow through `oxlint --fix` +
`oxfmt --write` unchanged
- `oxlint --fix` was a no-op on JSON anyway (`0 files`), so removing it
costs nothing
A future oxfmt release that ships a configurable JSON formatter can
re-add these extensions; left a comment in `lefthook.yml` explaining the
rationale.
## Verification
Reproduced the bug locally with PR #5055's `packages/voice/package.json`
edit, then applied this fix and re-ran the same flow:
- **Before fix**: oxfmt mangled the file → `JSON.parse` threw at line 8
col 5
- **After fix**: lefthook skipped `lint-fix`, file remained valid strict
JSON
- **TS edit smoke test**: editing a `.ts` file in `packages/voice/src/`
still triggers `lint-fix` and runs cleanly through oxlint+oxfmt
This commit itself was created without `LEFTHOOK_EXCLUDE` — the full
pre-commit chain (`check-binaries`, `lint-fix`,
`test-and-check-packages`, `commitlint`) ran green because
`lefthook.yml` is not JSON.
## Related
- PR #5054 (`chore(deps): bump @ag-ui/langgraph to 0.0.34`) — bypassed
via `LEFTHOOK_EXCLUDE=lint-fix`
- PR #5055 (`chore(voice): move @copilotkit/runtime from dependencies to
peerDependencies`) — bypassed via `LEFTHOOK_EXCLUDE=lint-fix`, called
out the bug in the PR description
## Test plan
- [ ] CI green
- [ ] Future PRs touching `package.json` no longer need
`LEFTHOOK_EXCLUDE=lint-fix`
Companion to commit 0a24b5c430 which fixed the outer (frontend) lockfile.
The Dockerfile has a separate agent-deps stage that npm ci's against
src/agent/package-lock.json, which was pinning 0.0.32 while
src/agent/package.json was bumped to 0.0.34 in d61908dd1e. Closes the
final build-check (langgraph-typescript) failure on PR #5054.
## Summary
- Remove the rounded/bordered sidebar shell from `shell-docs` at all
viewport widths.
- Keep the sidebar navigation unframed globally instead of only
stripping the pill at large breakpoints.
- Update stale comments that still described the old pill treatment.
## Testing
- `git diff --check` passed.
- Not run (not requested).
PR-A CR-r1 fixes (4 of 4 actionable findings from 7-agent CR + 1 cheap defense-in-depth).
A1: post-publish steps (Configure git user, Check for pre-existing tags, Create and push
git tag, Create GitHub Release) now gate on `inputs.dry-run != true && mode != 'prerelease'`
instead of just `mode`. On dry-run + stable, VERSION was empty so TAG="v" garbage was
pushed; this prevents that.
A2: Add explicit Verify-publish-step-emitted-version guard between Publish to npm and the
post-publish chain. Fails loud if publish-release.ts (or any inputs.publish-script
override) forgets to emit `version` to GITHUB_OUTPUT.
A3: Replace the single unconditional Release summary with three gated variants (stable,
prerelease, dry-run) so the summary no longer claims "Release Published" on dry-run or
prerelease.
B3: inputs.publish-script and steps.meta.outputs.scope now flow through env to the shell
(reduces injection surface even though caller is in-repo today).
Spec: https://www.notion.so/36d3aa381852811ba10ad1bcd228d6d8
The lint-fix pre-commit step runs `oxlint --fix` + `oxfmt --write` over
staged files. When `package.json` is part of the staged set, oxfmt
rewrites the file into JSON5 syntax (4-space indent, trailing commas
after the last key in every object, compacted single-line objects).
The result is invalid strict JSON that pnpm rejects with
`ERR_PNPM_JSON_PARSE` at line 8 column 5, blocking every commit that
touches any `package.json`.
This was bypassed in PRs #5054 and #5055 via `LEFTHOOK_EXCLUDE=lint-fix`;
this commit fixes it at the source by removing `json,jsonc,json5` from
the lint-fix glob.
Reproduction (with the buggy glob):
- Apply PR #5055's edit to packages/voice/package.json
- git add + run `lefthook run pre-commit --command lint-fix`
- oxfmt logs "1 file reformatted"
- JSON.parse / pnpm install now fail on the rewritten file
After the fix:
- JSON-only staged sets cause lefthook to skip lint-fix ("no files for
inspection") rather than mangle the JSON
- TS/JS/etc. continue to flow through oxlint --fix + oxfmt --write
unchanged
- JSON formatting is left to pnpm and manual editing, both of which
produce strict 2-space JSON
oxfmt 0.36.0 exposes no per-file-type knob (printWidth/proseWrap/
ignorePatterns only); excluding json/jsonc/json5 from the glob is the
minimal correct fix. A future oxfmt upgrade that ships a json formatter
configurable via `.oxfmtrc.json` can re-add these extensions.
This commit itself is being landed with `LEFTHOOK_EXCLUDE=lint-fix`
because the bug being fixed currently blocks any path that exercises the
lint-fix hook. The change touches only `lefthook.yml`, which is not a
JSON file and would not be mangled — the exclude is purely defensive.
The prior bump commit d61908dd1e updated pnpm-lock.yaml at the repo root
but missed showcase/integrations/langgraph-typescript/package-lock.json,
which is the npm lockfile used by the integration's Docker build (npm ci
--legacy-peer-deps). Closes the build-check (langgraph-typescript) CI
failure on PR #5054.
LEFTHOOK_EXCLUDE: lint-fix step rewrites package.json files to invalid
JSON5 (oxfmt bug); test-and-check-packages step is blocked by a pre-existing
web-inspector telemetry test failure on main. Both being addressed in
separate PRs.
prerelease.yml cannot register as a second npm trusted publisher (npm allows
exactly one per package; all 16 monorepo-scoped packages bind to
publish-release.yml). Refactor publish-release.yml to also support
workflow_call so prerelease.yml can invoke it as a reusable workflow — OIDC's
job_workflow_ref claim points at the callee, so the existing trust record
covers both flows.
This PR (PR-A) adds the workflow_call trigger, input schema, meta step for
scope+mode resolution, build-job gating to skip on workflow_call, publish-job
if: override for skipped-needs, post-publish step gating on
mode != prerelease, NOTION_API_KEY gating on stable mode, and the
publish-script input for the TS file selection.
Also adds a dry-run input on workflow_dispatch so PR-A can be verified
post-merge via a sacrificial release branch without an actual publish.
Spec: https://www.notion.so/36d3aa381852811ba10ad1bcd228d6d8
Customer block (Ben Taylor, #engr): @copilotkit/react-core canary with
suffix=thread-id-propagation.
PR-B (prerelease.yml caller conversion) follows.