Skip to content

Commit 136f515

Browse files
authored
feat(showcase): add runnable Vue documentation (#6222)
## What this adds Vue users should be able to follow the same documentation journeys as React users, with examples that match the Vue package they can install today. This PR adds a runnable Vue chat application to Showcase and makes the website the home for Vue guides and API reference. It follows the existing React and Angular setup rather than introducing a separate documentation system. - **Showcase:** one Vue application and build artifact, integrated with the existing backend catalog, hosting, and validation. Only `agentic-chat` is enabled; unsupported combinations stay unavailable. - **Guides:** React-aligned Vue examples, shared explanations where the behavior is framework-neutral, and explicit notes where Vue currently differs. - **Reference and discovery:** updated Vue API pages, navigation derived from the React structure, and Vue-aware links, search, sitemap, and Markdown/LLM output. This does not add Vue runtime features, resolve existing package type errors, define A2UI or v1 compatibility, or change shared server-side authorization examples. ## How to review The eight commits keep the Vue host, hosting and build integration, validation, API reference, guides, package entry point, synchronization policy, and reviewer corrections separate. The main review questions are whether the Showcase integration follows the existing frontend pattern, and whether the Vue docs differ from React only where the current Vue implementation requires it.
2 parents ed78b19 + 38cef95 commit 136f515

185 files changed

Lines changed: 8232 additions & 1383 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/config-allowlist.txt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,4 @@ showcase/shell-dashboard/next.config.ts
137137
showcase/shell-docs/next.config.ts
138138
showcase/shell-dojo/next.config.ts
139139
showcase/shell/next.config.ts
140+
showcase/vue/vite.config.ts

‎.github/workflows/showcase_build.yml‎

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ on:
4040
- "packages/angular/**"
4141
- "packages/core/**"
4242
- "packages/shared/**"
43+
- "packages/vue/**"
4344
- "packages/web-components/**"
45+
- "packages/web-inspector/**"
4446
- ".github/workflows/showcase_build.yml"
4547
- ".github/workflows/showcase_build_check.yml"
4648
workflow_dispatch:
@@ -120,6 +122,7 @@ jobs:
120122
matrix: ${{ steps.build-matrix.outputs.matrix }}
121123
has_changes: ${{ steps.build-matrix.outputs.has_changes }}
122124
needs_angular: ${{ steps.build-matrix.outputs.needs_angular }}
125+
needs_vue: ${{ steps.build-matrix.outputs.needs_vue }}
123126
steps:
124127
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
125128
with:
@@ -149,6 +152,13 @@ jobs:
149152
- 'packages/core/**'
150153
- 'packages/shared/**'
151154
- 'packages/web-components/**'
155+
vue:
156+
- 'showcase/vue/**'
157+
- 'packages/core/**'
158+
- 'packages/shared/**'
159+
- 'packages/vue/**'
160+
- 'packages/web-components/**'
161+
- 'packages/web-inspector/**'
152162
shell:
153163
- 'showcase/shell/**'
154164
- 'showcase/shared/**'
@@ -362,6 +372,10 @@ jobs:
362372
(($changes | index("angular") != null) and (
363373
(.context | startswith("showcase/integrations/")) or
364374
.dispatch_name == "shell"
375+
)) or
376+
(($changes | index("vue") != null) and (
377+
(.context | startswith("showcase/integrations/")) or
378+
.dispatch_name == "shell"
365379
))
366380
))
367381
))]
@@ -393,6 +407,7 @@ jobs:
393407
394408
echo "matrix=$MATRIX" >> $GITHUB_OUTPUT
395409
echo "needs_angular=$(echo "$MATRIX" | jq -r 'any(.[]; (.context | startswith("showcase/integrations/")))')" >> $GITHUB_OUTPUT
410+
echo "needs_vue=$(echo "$MATRIX" | jq -r 'any(.[]; (.context | startswith("showcase/integrations/")))')" >> $GITHUB_OUTPUT
396411
if [ "$MATRIX" = "[]" ]; then
397412
echo "has_changes=false" >> $GITHUB_OUTPUT
398413
else
@@ -500,8 +515,50 @@ jobs:
500515
if-no-files-found: error
501516
retention-days: 1
502517

518+
build-vue:
519+
name: Build canonical Vue browser artifact
520+
needs: [detect-changes]
521+
if: needs.detect-changes.outputs.has_changes == 'true'
522+
runs-on: ubuntu-26.04
523+
timeout-minutes: 30
524+
permissions:
525+
contents: read
526+
steps:
527+
- name: Checkout
528+
if: needs.detect-changes.outputs.needs_vue == 'true'
529+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
530+
with:
531+
persist-credentials: false
532+
533+
- name: Setup pnpm
534+
if: needs.detect-changes.outputs.needs_vue == 'true'
535+
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
536+
537+
- name: Setup Node
538+
if: needs.detect-changes.outputs.needs_vue == 'true'
539+
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
540+
with:
541+
node-version: 22.x
542+
543+
- name: Install
544+
if: needs.detect-changes.outputs.needs_vue == 'true'
545+
run: pnpm install --frozen-lockfile --ignore-scripts
546+
547+
- name: Build
548+
if: needs.detect-changes.outputs.needs_vue == 'true'
549+
run: pnpm nx build @copilotkit/showcase-vue-host
550+
551+
- name: Upload canonical Vue browser artifact
552+
if: needs.detect-changes.outputs.needs_vue == 'true'
553+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
554+
with:
555+
name: showcase-vue-browser-${{ github.sha }}
556+
path: showcase/vue/dist
557+
if-no-files-found: error
558+
retention-days: 1
559+
503560
build:
504-
needs: [detect-changes, check-lockfile, build-angular]
561+
needs: [detect-changes, check-lockfile, build-angular, build-vue]
505562
if: needs.detect-changes.outputs.has_changes == 'true'
506563
runs-on: depot-ubuntu-24.04-4
507564
timeout-minutes: ${{ fromJSON(matrix.service.timeout) }}
@@ -541,6 +598,13 @@ jobs:
541598
name: showcase-angular-browser-${{ github.sha }}
542599
path: ${{ runner.temp }}/showcase-angular-browser
543600

601+
- name: Download canonical Vue browser artifact
602+
if: startsWith(matrix.service.context, 'showcase/integrations/')
603+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
604+
with:
605+
name: showcase-vue-browser-${{ github.sha }}
606+
path: ${{ runner.temp }}/showcase-vue-browser
607+
544608
- name: Setup Depot
545609
uses: depot/setup-action@91bc8495a33ebfc504ffc89e5674379ccf23c29c # v1
546610

@@ -591,6 +655,7 @@ jobs:
591655
- name: Copy shared modules into build context
592656
env:
593657
ANGULAR_BROWSER: ${{ runner.temp }}/showcase-angular-browser
658+
VUE_BROWSER: ${{ runner.temp }}/showcase-vue-browser
594659
run: |
595660
set -euo pipefail
596661
CONTEXT="${{ matrix.service.context }}"
@@ -632,6 +697,10 @@ jobs:
632697
source showcase/scripts/cli/_common.sh
633698
stage_angular "$CONTEXT" "$ANGULAR_BROWSER"
634699
fi
700+
if [ -L "$CONTEXT/public/vue" ]; then
701+
source showcase/scripts/cli/_common.sh
702+
stage_vue "$CONTEXT" "$VUE_BROWSER"
703+
fi
635704
636705
- name: Build and push
637706
if: ${{ matrix.service.skip_build != true }}

‎.github/workflows/showcase_build_check.yml‎

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ on:
1717
- "packages/angular/**"
1818
- "packages/core/**"
1919
- "packages/shared/**"
20+
- "packages/vue/**"
2021
- "packages/web-components/**"
22+
- "packages/web-inspector/**"
2123
- ".github/workflows/showcase_build.yml"
2224
- ".github/workflows/showcase_build_check.yml"
2325

@@ -39,6 +41,7 @@ jobs:
3941
matrix: ${{ steps.build-matrix.outputs.matrix }}
4042
has_changes: ${{ steps.build-matrix.outputs.has_changes }}
4143
needs_angular: ${{ steps.build-matrix.outputs.needs_angular }}
44+
needs_vue: ${{ steps.build-matrix.outputs.needs_vue }}
4245
steps:
4346
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
4447
with:
@@ -86,6 +89,13 @@ jobs:
8689
- 'packages/core/**'
8790
- 'packages/shared/**'
8891
- 'packages/web-components/**'
92+
vue:
93+
- 'showcase/vue/**'
94+
- 'packages/core/**'
95+
- 'packages/shared/**'
96+
- 'packages/vue/**'
97+
- 'packages/web-components/**'
98+
- 'packages/web-inspector/**'
8999
shell:
90100
- 'showcase/shell/**'
91101
- 'showcase/shared/**'
@@ -230,12 +240,13 @@ jobs:
230240
# untrusted PR metadata so branch names are encoded as JSON data,
231241
# not interpolated into shell source.
232242
#
233-
# A workflow change builds every image, because the edit can break
234-
# any build step. An Angular/package change builds NO image by
235-
# itself: integration images install PUBLISHED @copilotkit packages
243+
# A workflow change builds every image declared here, because the
244+
# edit can break any build step. An Angular/Vue/package change builds
245+
# NO image by itself: integration images install PUBLISHED @copilotkit packages
236246
# and their contexts exclude packages/, so the image builds do not
237-
# test the PR's package code. The build-angular job still compiles
238-
# the Angular host against the PR's packages (needs_angular below).
247+
# test the PR's package code. The canonical frontend jobs compile
248+
# the affected hosts against the PR's packages. Any integration
249+
# image needs both browser artifacts for staging below.
239250
# The post-merge showcase_build.yml still builds every image.
240251
MATRIX=$(echo "$ALL_SERVICES" | jq -c --argjson changes "$CHANGES" --arg sha "$PR_HEAD_SHA" --arg ref "$PR_HEAD_REF" '
241252
[.[] |
@@ -249,6 +260,7 @@ jobs:
249260
250261
echo "matrix=$MATRIX" >> $GITHUB_OUTPUT
251262
echo "needs_angular=$(echo "$MATRIX" | jq -r --argjson changes "$CHANGES" 'any(.[]; (.context | startswith("showcase/integrations/"))) or ($changes | index("angular") != null)')" >> $GITHUB_OUTPUT
263+
echo "needs_vue=$(echo "$MATRIX" | jq -r --argjson changes "$CHANGES" 'any(.[]; (.context | startswith("showcase/integrations/"))) or ($changes | index("vue") != null)')" >> $GITHUB_OUTPUT
252264
if [ "$MATRIX" = "[]" ]; then
253265
echo "has_changes=false" >> $GITHUB_OUTPUT
254266
else
@@ -258,8 +270,8 @@ jobs:
258270
build-angular:
259271
name: Build canonical Angular browser artifact
260272
needs: [detect-changes]
261-
# Runs for an Angular/package change even when no image builds, so the
262-
# Angular host still compiles against the PR's packages.
273+
# Compile for Angular/package changes or integration images. For other
274+
# images, run a successful no-op so build-check's needs does not skip them.
263275
if: needs.detect-changes.outputs.has_changes == 'true' || needs.detect-changes.outputs.needs_angular == 'true'
264276
runs-on: ubuntu-26.04
265277
timeout-minutes: 30
@@ -299,8 +311,52 @@ jobs:
299311
if-no-files-found: error
300312
retention-days: 1
301313

314+
build-vue:
315+
name: Build canonical Vue browser artifact
316+
needs: [detect-changes]
317+
# Compile for Vue/package changes or integration images. For other
318+
# images, run a successful no-op so build-check's needs does not skip them.
319+
if: needs.detect-changes.outputs.has_changes == 'true' || needs.detect-changes.outputs.needs_vue == 'true'
320+
runs-on: ubuntu-26.04
321+
timeout-minutes: 30
322+
permissions:
323+
contents: read
324+
steps:
325+
- name: Checkout
326+
if: needs.detect-changes.outputs.needs_vue == 'true'
327+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
328+
with:
329+
persist-credentials: false
330+
331+
- name: Setup pnpm
332+
if: needs.detect-changes.outputs.needs_vue == 'true'
333+
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
334+
335+
- name: Setup Node
336+
if: needs.detect-changes.outputs.needs_vue == 'true'
337+
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
338+
with:
339+
node-version: 22.x
340+
341+
- name: Install
342+
if: needs.detect-changes.outputs.needs_vue == 'true'
343+
run: pnpm install --frozen-lockfile --ignore-scripts
344+
345+
- name: Build
346+
if: needs.detect-changes.outputs.needs_vue == 'true'
347+
run: pnpm nx build @copilotkit/showcase-vue-host
348+
349+
- name: Upload canonical Vue browser artifact
350+
if: needs.detect-changes.outputs.needs_vue == 'true'
351+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
352+
with:
353+
name: showcase-vue-browser-${{ github.sha }}
354+
path: showcase/vue/dist
355+
if-no-files-found: error
356+
retention-days: 1
357+
302358
build-check:
303-
needs: [detect-changes, build-angular]
359+
needs: [detect-changes, build-angular, build-vue]
304360
if: needs.detect-changes.outputs.has_changes == 'true'
305361
# Depot builds the image remotely; this GitHub-hosted runner loads it
306362
# locally and verifies the resulting Node runtime without starting the app.
@@ -339,6 +395,13 @@ jobs:
339395
name: showcase-angular-browser-${{ github.sha }}
340396
path: ${{ runner.temp }}/showcase-angular-browser
341397

398+
- name: Download canonical Vue browser artifact
399+
if: startsWith(matrix.service.context, 'showcase/integrations/')
400+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
401+
with:
402+
name: showcase-vue-browser-${{ github.sha }}
403+
path: ${{ runner.temp }}/showcase-vue-browser
404+
342405
- name: Setup Depot
343406
uses: depot/setup-action@91bc8495a33ebfc504ffc89e5674379ccf23c29c # v1
344407

@@ -362,6 +425,7 @@ jobs:
362425
if: startsWith(matrix.service.context, 'showcase/integrations/')
363426
env:
364427
ANGULAR_BROWSER: ${{ runner.temp }}/showcase-angular-browser
428+
VUE_BROWSER: ${{ runner.temp }}/showcase-vue-browser
365429
run: |
366430
set -euo pipefail
367431
CONTEXT="${{ matrix.service.context }}"
@@ -399,6 +463,10 @@ jobs:
399463
source showcase/scripts/cli/_common.sh
400464
stage_angular "$CONTEXT" "$ANGULAR_BROWSER"
401465
fi
466+
if [ -L "$CONTEXT/public/vue" ]; then
467+
source showcase/scripts/cli/_common.sh
468+
stage_vue "$CONTEXT" "$VUE_BROWSER"
469+
fi
402470
403471
- name: Login to GHCR for the pinned aimock base
404472
if: matrix.service.dispatch_name == 'showcase-aimock'

‎packages/vue/AGENTS.md‎

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ This file defines contributor workflow for keeping `@copilotkit/vue` aligned wit
44

55
## Scope
66

7-
- Scope is limited to `packages/vue/**`.
8-
- Keep upstream changes outside the Vue package to a minimum until the Vue port is merged.
7+
- Package implementation scope is limited to `packages/vue/**`.
8+
- The documented integration exceptions are Vue docs and runnable examples under `showcase/**`, plus their registry, generated-catalog, and validation-workflow plumbing described in [Documentation ownership](#documentation-ownership).
9+
- Keep other upstream changes outside the Vue package to a minimum until the Vue port is merged.
910

1011
## Parity source of truth
1112

1213
- React remains the canonical behavioral reference: `packages/react-core/`, `packages/react-ui/`, and `packages/react-textarea/`.
1314
- Use [PARITY.md](./PARITY.md) as the canonical Vue-side parity policy, architectural translation guide, strict test-port rulebook, and living React-to-Vue implementation/test matrix.
14-
- Keep [README.md](./README.md) focused on user-facing package documentation.
15+
- Keep [README.md](./README.md) as the slim npm-facing package entry point.
1516

1617
## Required parity workflow
1718

@@ -49,8 +50,8 @@ When touching integration/build behavior:
4950

5051
1. `pnpm nx run @copilotkit/vue:build`
5152

52-
## Documentation placement
53+
## Documentation ownership
5354

54-
- Parity rules, architectural translation decisions, strict translatability criteria, checklist, and mapping matrix: [PARITY.md](./PARITY.md).
55-
- Public package usage and API examples: [README.md](./README.md).
56-
- User-facing visual docs/examples: `examples/v2/vue/storybook/**`.
55+
- Canonical long-form Vue guides and API reference live in `showcase/shell-docs/src/content/`.
56+
- Runnable Vue examples live in `showcase/vue/`; feature coverage is owned by `showcase/shared/frontend-registry.json`, generated frontend catalogs, and Showcase validation workflows. See [PARITY.md](./PARITY.md#package-boundary-and-documentation-placement) for the canonical policy.
57+
- [PARITY.md](./PARITY.md) records parity governance and intentional differences; it is not a duplicate coverage catalog.

0 commit comments

Comments
 (0)