Commit Graph

12110 Commits

Author SHA1 Message Date
Mark Fogle db2a76f55d docs(cookbook): defer nav placement, leave Cookbook section orphaned
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
2026-05-28 04:19:18 +00:00
Jordan Ritter 2fc27b3b3d style: oxfmt auto-fix 2026-05-27 21:12:15 -07:00
Jordan Ritter 0d3067f396 fix(ci): add set -euo pipefail + comment from CR round 2 2026-05-27 21:07:27 -07:00
Jordan Ritter a8d29776ce fix(ci): apply CR round 1 fixes (mode consistency, suffix validation, token via env, main-branch guard, prerelease version verify) 2026-05-27 21:03:25 -07:00
Jordan Ritter 195e769b7e fix(ci): delete prerelease.yml, superseded by publish-release.yml
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`.
2026-05-27 20:54:42 -07:00
Jordan Ritter 5e319f7607 feat(ci): support prerelease mode via workflow_dispatch in publish-release.yml
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>
2026-05-27 20:54:31 -07:00
Jordan Ritter 8a00793ba5 fix(ci): remove dead workflow_call trigger from publish-release.yml
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.
2026-05-27 20:53:32 -07:00
Mark Fogle 2a29103bae feat(skills): add copilotkit-daytona Agent Skill
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
2026-05-28 03:49:43 +00:00
Mark Fogle eb13dbe770 docs(cookbook): add Daytona recipe + new Cookbook docs section
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
2026-05-28 03:41:34 +00:00
cogwirrel 24b981de16 docs(aws-strands): add Python/TypeScript tabs to code examples
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.
2026-05-28 01:03:02 +00:00
Tyler Slaton 31fae47d93 Merge branch 'main' into tyler/pdx-199-error-anchor-drift 2026-05-27 16:13:58 -07:00
Tyler Slaton c425a2a8a8 fix(docs): hide unsupported shared-state frameworks (#5067) 2026-05-27 16:13:43 -07:00
Tyler Slaton 55cc95595c Merge branch 'main' into tyler/pdx-199-error-anchor-drift 2026-05-27 16:05:18 -07:00
Tyler Slaton fb4c065aae Merge branch 'main' into tyler/pdx-156-shared-state-excludes 2026-05-27 16:05:10 -07:00
Tyler Slaton 8cb04a63c9 fix: resolve recursive snippet imports (#5062)
## 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
2026-05-27 16:05:01 -07:00
Tyler Slaton acfc673ed7 Merge branch 'main' into tyler/pdx-208-recursive-snippet-imports 2026-05-27 15:58:36 -07:00
Tyler Slaton 574666a3bb Merge branch 'main' into tyler/pdx-199-error-anchor-drift 2026-05-27 15:58:02 -07:00
Jordan Ritter 17340d6b2a fix(ci): convert prerelease.yml into a thin caller of publish-release.yml (#5068)
## 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).
2026-05-27 15:47:30 -07:00
Tyler Slaton 38b2bd4fc6 fix(docs): resolve PDX-208 merge conflict 2026-05-27 15:46:30 -07:00
Tyler Slaton f285056ba7 fix(docs): resolve PDX-156 merge conflict 2026-05-27 15:43:58 -07:00
Tyler Slaton 438307ddfe fix: remove stale smoke monitor refs (#5060)
## Summary
- remove stale smoke monitor workflow reference from showcase validate
push paths
- update keep-alive comment so it no longer points at the deleted
workflow

## Tests
- rg "showcase_smoke-monitor|smoke-monitor" .github/workflows
- ruby -e 'require "yaml"; ARGV.each { |f| YAML.load_file(f); puts "ok
#{f}" }' .github/workflows/showcase_keep-alive.yml
.github/workflows/showcase_validate.yml
- git diff --check -- .github/workflows/showcase_keep-alive.yml
.github/workflows/showcase_validate.yml
- pre-commit hook: lint-fix, test-and-check-packages, commitlint passed
on retry
2026-05-27 15:41:51 -07:00
Tyler Slaton af66c73d7a Merge branch 'main' into tyler/pdx-199-error-anchor-drift 2026-05-27 15:41:44 -07:00
Tyler Slaton adaaed9819 fix: bundle shell-docs OG image fonts (#5064)
## 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.
2026-05-27 15:41:32 -07:00
Tyler Slaton 094830cf01 fix: resolve sidebar issues and bring in framework specific guides (#5057)
## 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.
2026-05-27 15:41:02 -07:00
Tyler Slaton 619ed1621b fix(docs): restore new look preview (#5065)
## 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.
2026-05-27 15:40:53 -07:00
Jordan Ritter 29291b41e9 fix(ci): grant id-token: write to publish job for reusable-workflow OIDC
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.
2026-05-27 15:38:36 -07:00
Jordan Ritter 19ff0d65d3 fix(ci): convert prerelease.yml publish job into workflow_call to publish-release.yml
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).
2026-05-27 15:38:36 -07:00
Jordan Ritter 49019e1b0b fix(ci): parametrize publish-release.yml for workflow_call (PR-A) (#5063)
## 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.
2026-05-27 15:36:05 -07:00
BenTaylorDev 94b1f61cc3 chore: release monorepo v1.59.0 2026-05-27 22:31:30 +00:00
Tyler Slaton 33d64d6507 fix: replace default FumaDocs search component with custom search (#5050)
## 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.
2026-05-27 15:07:21 -07:00
Tyler Slaton bf9ac27e8c Merge branch 'main' into tyler/showcase-fix-shelldocs-structure 2026-05-27 15:04:45 -07:00
Jordan Ritter 9df2e26878 chore(deps): bump @ag-ui/langgraph to 0.0.34 (#5054)
## 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.
2026-05-27 14:18:39 -07:00
github-actions[bot] 7f38086043 style: auto-fix formatting 2026-05-27 21:17:10 +00:00
Tyler Slaton 457ffab8d3 fix(docs): restore PDX-203 new look preview 2026-05-27 14:14:17 -07:00
Tyler Slaton cbeb6c8166 Merge remote-tracking branch 'origin/main' into tyler/showcase-fix-shelldocs-structure
# Conflicts:
#	showcase/shell-docs/src/app/[[...slug]]/page.tsx
2026-05-27 14:13:21 -07:00
Tyler Slaton 01afa8029b fix(docs): bundle PDX-201 OG image fonts 2026-05-27 14:05:37 -07:00
Jordan Ritter 7ea0a10eaa Merge remote-tracking branch 'origin/main' into chore/bump-agui-langgraph-0.0.34 2026-05-27 14:05:35 -07:00
Tyler Slaton f03227376f fix(docs): hide PDX-156 unsupported shared-state frameworks 2026-05-27 14:03:19 -07:00
Tyler Slaton 0c361cb6ad fix(docs): handle PDX-208 recursive snippet imports 2026-05-27 14:01:48 -07:00
Tyler Slaton 6926d88f0f fix(shared): update PDX-199 docs error anchors 2026-05-27 13:59:35 -07:00
Jordan Ritter 3c28715935 chore(deps): regenerate showcase langgraph-typescript outer package-lock.json (valid JSON)
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.
2026-05-27 13:59:16 -07:00
Jordan Ritter 6627a4c72b fix(ci): prevent phantom publish on PR close-without-merge + gate post-publish on success()
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
2026-05-27 13:58:40 -07:00
Jordan Ritter 6f8ff69e8f fix(lefthook): exclude package.json from oxlint/oxfmt (#5059)
## 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`
2026-05-27 13:58:01 -07:00
Jordan Ritter 562b4a338c chore(deps): regenerate showcase langgraph-typescript src/agent package-lock.json for 0.0.34
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.
2026-05-27 13:54:09 -07:00
Tyler Slaton b9815abbfa chore: remove pill design of sidebar on medium screen widths (#5058)
## 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).
2026-05-27 13:53:15 -07:00
Tyler Slaton b570e073f8 fix(ci): remove stale PDX-160 smoke monitor refs 2026-05-27 13:52:49 -07:00
Jordan Ritter dcb0f29d63 fix(ci): gate post-publish steps on dry-run + guard empty VERSION + split release summary
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
2026-05-27 13:51:52 -07:00
Jordan Ritter a8fa1a3b11 fix(lefthook): exclude json/jsonc/json5 from oxlint/oxfmt to prevent JSON5 mangling
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.
2026-05-27 13:49:31 -07:00
Jordan Ritter 0a24b5c430 chore(deps): regenerate showcase langgraph-typescript package-lock.json for 0.0.34
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.
2026-05-27 13:45:24 -07:00
Jordan Ritter c5c1b988d6 fix(ci): add workflow_call trigger to publish-release.yml for prerelease reuse
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.
2026-05-27 13:44:58 -07:00