Commit Graph

777 Commits

Author SHA1 Message Date
Jordan Ritter 143b3eb41b fix: address CR findings — explicit pr_opened output + safe JSON + Slack fallback
Fixes 3 HIGH findings from R1 review on #3988:

1. pr_url empty was used as a proxy for "no PR opened because clean-transform
   was empty", but it's also empty on every error path (bot-token failure, gh
   pr create failure, push failure). Replace with an explicit pr_opened=true/
   false output from the push step — true only after the PR URL is captured,
   false only on the deliberate CHANGED=0 path. Error paths leave it unset so
   alerts fall through to the failure() handler.

2. review_items_json was string-interpolated raw into a JSON payload inside
   triple-backticks. Any filename containing ", \\, or a control character
   would break the payload. Moved to a jq-based payload-file-path pattern:
   a dedicated Build Slack payloads step writes each payload to disk with jq
   --arg, so all values are safely JSON-escaped regardless of content. Slack
   steps consume the tmpfiles via payload-file-path.

3. If a notify-* step itself fails (webhook 5xx, rate limit, malformed JSON),
   the review-needed alert was silently lost — the existing failure() alert
   was gated on pr_url == '' and would not fire. Added an unconditional
   fallback step that posts a plain-text "alert machinery failed" message via
   curl when any notify-* step's outcome is failure, so we never lose a
   review-needed or failure notification.
2026-04-16 14:12:15 -07:00
Jordan Ritter 8a1b6fc0e1 ci(docs-sync): include PR link in review-needed Slack alert
The "files needing manual review" Slack warning listed files but
didn't link the auto-opened PR, forcing reviewers to hunt for it
in GitHub. Capture the PR URL from the create/merge step output
(already exposed as steps.push.outputs.pr_url) and include it as
a "Review:" line in the payload.

Split the alert into two variants:
- PR opened (normal case): includes the PR link
- No PR opened (edge case where clean-transform portion was empty):
  posts review items without a link

Auto-sync and merge-failed alerts already linked the PR — this
brings the review-needed alert to parity.
2026-04-16 13:52:51 -07:00
Jordan Ritter 8424575de3 fix(aimock): validate fixtures at load time to prevent runtime 500s (#3973)
## Summary

Follow-up hardening to #3971. aimock supports fixture schema validation
at startup via `--validate-on-load`, but the flag is **opt-in** and the
showcase Dockerfile was not passing it. That meant fixtures with
unrecognized response keys (e.g. `"text"` instead of `"content"`) loaded
silently and only surfaced as HTTP 500s at request time — which is
exactly what crashed crewai-crews and triggered #3971.

This PR wires up two independent safety nets so a broken fixture can't
ship again:

1. **Dockerfile (fail-fast at container boot)** —
`showcase/aimock/Dockerfile` now passes `--validate-on-load`. If any
fixture fails the aimock schema, the container exits non-zero instead of
starting and serving 500s. Railway will not promote a bad build.
2. **CI test (fail-fast in PR review)** — new vitest spec at
`showcase/scripts/__tests__/aimock-fixtures.test.ts` imports
`loadFixtureFile` + `validateFixtures` from `@copilotkit/aimock` and
asserts zero errors against both `feature-parity.json` and `smoke.json`.
Runs inside the existing ` Showcase: Validate` workflow
(`showcase/scripts` vitest suite) on every PR that touches
`showcase/**`.

## Verification

**Red-green on the vitest spec:**
- Rebased onto the tip of main *before* #3971 merged: the spec fails
with 5 errors — exactly the 5 broken `"text"` fixtures (`plan`, `steps`,
`mars`, `dashboard`, `report`) that #3971 repaired.
- Rebased forward onto main *after* #3971: spec passes with 0 errors,
all 549 showcase/scripts tests green.

**Red-green on the Dockerfile:**
- Current fixtures + `--validate-on-load`: container boots cleanly, logs
`Loaded 39 fixture(s) from /fixtures`.
- Injecting an intentionally broken fixture (`response: { "text": "..."
}`): container fails to start with `[aimock] Fixture 0: response is not
a recognized type (must have content, toolCalls, error, or embedding)` /
`Validation failed: 1 error(s), 0 warning(s)` and non-zero exit.

## Test plan

- [x] Local: full `showcase/scripts` vitest suite passes (549/549)
- [x] Local: `pnpm run test` (monorepo) passes
- [x] Docker: image builds and starts with `--validate-on-load` against
current fixtures
- [x] Docker red-green: broken fixture fails container start with
non-zero exit
- [ ] CI: ` Showcase: Validate` job runs the new test file on PR
2026-04-16 13:34:49 -07:00
Jordan Ritter f2eef1cb7c fix(ci): render real newlines in Slack alerts and enrich starter smoke payload (#3972)
## Summary

Fixes Slack alerts that rendered literal `\n` (backslash + n) instead of
actual newlines — messages looked like `*Starter Deployed Smoke Test
Failed*\nView run` in Slack.

Root cause: `jq -n --arg text "...\n..."` passes the two literal
characters `\` and `n` to jq (bash doesn't interpret `\n` inside double
quotes). `--arg` stores them verbatim; jq then JSON-escapes the
backslash, producing `"\\n"` in the payload, which Slack parses back to
the two-character string `\n` and renders as-is.

## Changes

Switched three alert builders from `jq --arg` with embedded `\n` to the
safer pattern already used in `showcase_smoke-monitor.yml`: write a
message file with real LF bytes via `printf`, then `jq -n --rawfile text
…` for correct JSON escaping.

Affected workflows:
- `starter_deployed_smoke.yml` — Starter Deployed Smoke Test Failed (the
alert from the screenshot)
- `starter-smoke.yml` — Starter smoke test failing: <starter>
- `showcase_drift-detection.yml` — Showcase E2E suite failed

## Enrichment (starter_deployed_smoke.yml)

The deployed-smoke failure alert was just `*Starter Deployed Smoke Test
Failed* | View run`. Now emits a Playwright JSON report, extracts
failures, and builds a richer payload:

- Failed starter slugs listed in the header (parsed from spec titles)
- Direct link to the failed job in addition to the workflow run
- Up to 5 failure entries, each with:
  - starter slug
- test-level tags (`@starter-health` / `@starter-agent` /
`@starter-chat` / `@starter-tools`)
  - first line of the error message (ANSI-stripped, 240-char cap)
- "…and N more failure(s)" footer when the count exceeds 5

Falls back to the minimal header when no JSON report exists (e.g.
pre-test setup failed) so alerts still fire.

The other two alerts already had a summary but now also include a "View
job" link for direct navigation.

## Test plan

- [ ] Trigger `starter_deployed_smoke.yml` via `workflow_dispatch`
against a starter known to fail (or simulate) and confirm Slack renders
real newlines plus the enriched payload
- [ ] Trigger `starter-smoke.yml` via `workflow_dispatch` (PR run skips
the Slack step) and confirm alerting format when a starter is forced to
fail
- [ ] Trigger `showcase_drift-detection.yml` via `workflow_dispatch` and
confirm Slack renders real newlines and the fenced code block
- [ ] Grep `.github/workflows/` for `jq -n --arg text ".*\\n"` — should
return zero matches

Supersedes #3912 (closed).
2026-04-16 13:14:56 -07:00
Jordan Ritter 86a4c15f08 fix: address CR R2 — surface extraction errors, fallback slug, empty summary sentinel 2026-04-16 13:05:46 -07:00
Jordan Ritter d1928cdb67 fix: address CR findings on aimock validate-on-load hardening
- Add --validate-on-load to all aimock invocations (4 workflows/scripts
  + 13 integration docker-compose files)
- Replace hardcoded 2-file fixture list with dynamic discovery across
  showcase/, examples/integrations/*/, scripts/doc-tests/ (16 fixtures)
- Add sanity check to prevent silent zero-test pass when discovery fails
- Extend showcase_validate.yml path filter to trigger on
  examples/integrations/**/fixtures/** and scripts/doc-tests/fixtures/**
- Import and use ValidationResult type for callback parameters
- Fix scripts/doc-tests/fixtures/default.json to use { fixtures: [...] }
  envelope shape
2026-04-16 13:00:01 -07:00
Jordan Ritter 07daf13717 fix: make drift alert Slack message less verbose, dedup via failure() guard
- Summarize count of stale services in the normal case instead of
  listing every image by name
- Only expand to the detailed per-service list when rebuild triggers
  actually fail, including each service's error reason
- Track triggered_count and failed_count separately so the alert
  accurately reflects what happened
- Exit 1 on rebuild-trigger failure so the workflow run shows red in
  the Actions UI, and guard the generic failure() notifier with
  has_stale != 'true' to prevent double-posting to Slack (the detailed
  drift-alert step already covers the drift case)
2026-04-16 12:58:01 -07:00
Jordan Ritter 3584cfcf05 fix: address CR findings — jq error handling, UTF-8 safe truncation, comment accuracy
Surface jq parse failures instead of silently emitting an empty list,
wrap capture() in try/catch so a non-matching title no longer poisons
the whole extraction pipeline, and iterate every test per spec so
multi-project configs don't drop failures.

Replace byte-level cut -c1-200 with head -c 200 | iconv UTF-8//IGNORE
so truncated summaries never emit partial UTF-8 sequences as mojibake.
Broaden the ANSI stripper to cover SGR, OSC, and G0/G1 charset
designator escapes in both sed and jq.

Use mktemp for slack message/payload files with an always() cleanup
step so self-hosted runners stay clean, route matrix.starter through
env for consistency with the existing pattern, and fix two misleading
comments (reporter behavior, cap-at-5 placement). Drop the unused
walk_suites helper.
2026-04-16 12:57:16 -07:00
Jordan Ritter 1afac6b03f fix(ci): render real newlines in Slack alerts and enrich starter smoke payload
The `jq -n --arg text "...\n..."` pattern passed the two literal characters
`\n` to jq, which preserved them as-is in the JSON string. Slack then
rendered the literal backslash-n instead of a line break, producing
messages like `*Starter Deployed Smoke Test Failed*\nView run`.

Switch the three affected alert builders to `printf` into a file with real
LF bytes and load via `jq -n --rawfile` so escaping is handled correctly.
This matches the pattern already used in `showcase_smoke-monitor.yml`.

Also enrich the Starter Deployed Smoke alert with:
- failed starter slug(s) in the header
- direct link to the failed job (not just the workflow run)
- up to 5 failure entries each showing: slug, test level tags
  (@starter-health/@starter-agent/@starter-chat), first line of error
- "…and N more" footer when more than 5 failed

Enrichment is driven by a new JSON reporter output from the Playwright run;
if the report is missing (e.g. pre-test step failed) the step falls back to
the minimal header so alerts still fire.

Fixes the literal `\n` rendering seen in Slack for:
- starter_deployed_smoke.yml (Starter Deployed Smoke Test Failed)
- starter-smoke.yml (Starter smoke test failing: <starter>)
- showcase_drift-detection.yml (Showcase E2E suite failed)
2026-04-16 12:27:04 -07:00
Jordan Ritter 36aa9d3135 fix: replace broken deploy health check with Railway API status polling (#3950)
## Summary

- **Problem 1**: Health check constructed URLs like
`showcase-X-production.up.railway.app` which never matched actual
Railway domains (many have hash suffixes like `-3f57`). Crashed services
silently passed health checks.
- **Problem 2**: No Railway deploy status check — only HTTP health was
checked, so CRASHED deployments were never caught.
- **Fix**: Replaced the URL-guessing health check with Railway API
polling that queries actual deployment status and real service domain.
Fails immediately on CRASHED, validates both Railway SUCCESS status and
HTTP 200 on the real domain.

## Test plan

- [ ] Trigger a `workflow_dispatch` deploy for a single service and
verify the health check step queries Railway API and logs status/domain
- [ ] Verify a healthy service shows `Railway status=SUCCESS` and `HTTP
check: ... → 200`
- [ ] Verify a crashed service (e.g. bad image) fails the job with
`::error::Service X CRASHED on Railway`
2026-04-16 11:25:32 -07:00
Jordan Ritter da9d8e0274 fix: replace broken deploy health check with Railway API status polling
The previous health check constructed URLs as `${IMAGE}-production.up.railway.app`
which never matched Railway's hash-suffixed domains, so it silently
passed on crashed services (the issue that made claude-sdk-typescript
and mastra appear "deployed" while crashing at runtime).

New verification:
- Capture prior deployment ID before redeploying so verify step can
  distinguish fresh deployment from stale (avoids false-positive where
  first poll sees previous SUCCESS deployment and exits 0 immediately)
- Poll Railway API for actual deployment status, fail fast on terminal
  failures (CRASHED, FAILED, REMOVED, SKIPPED)
- Use real staticUrl from Railway API instead of guessing URL pattern
- Hit /api/health instead of root (backends 404 at /)
- Require 2 consecutive 200 responses before declaring healthy (catches
  SUCCESS-then-crash from JVM lazy init failures, Python OOM on first
  request)
- Check GraphQL response body for errors (HTTP 200 + {errors:[...]}
  is how Railway signals auth/query failures)
- Validate RAILWAY_TOKEN is set before polling
- 360s total budget (24 × 15s) to accommodate slow-boot services
  (spring-ai, mastra)
2026-04-16 11:24:48 -07:00
Alem Tuzlak 0e38bb6bc9 fix(ci): rename package to copilotkit-vscode-extension for vsce compatibility 2026-04-16 16:41:11 +02:00
Alem Tuzlak c4a12ac554 fix(ci): simplify vscode-extension workflow — use pnpm run build from root 2026-04-16 16:36:43 +02:00
Alem Tuzlak acb6ade4da fix(ci): fix vscode-extension type check — add es2022 target, fix missing error prop in tests, run tsc directly 2026-04-16 16:36:02 +02:00
Alem Tuzlak 1eb4a154ad Merge origin/main into feature branch: resolve 7 conflicts 2026-04-16 16:16:48 +02:00
Alem Tuzlak 5427706e70 fix: harden release system — registry error handling, tag check, prerelease tests (#3858)
## Summary

Ports 3 proven patterns from ag-ui's release system to CopilotKit.

### C1: Registry error vs 404 distinction
`getPublishedVersion` in `publish-release.ts` now distinguishes between
npm E404 (package genuinely not published — proceed) and real errors
(network timeout, auth failure, rate limit — stop). Previously all
errors returned `null`, silently bypassing the version guard.

### C2: Pre-existing tag check
Added a check in `publish-release.yml` that verifies the tag doesn't
already exist before attempting to create it. Prevents the "published
but no tag" state on retries.

### C3: Pre-publish tests in prerelease
Added `pnpm run test` between build and publish in the canary workflow.
A broken canary erodes trust in the prerelease channel.

**Cross-pollination context:** [Notion
page](https://www.notion.so/3413aa38185281828aa1dfa014808ddc)
The ag-ui side (strict version ordering, AI release notes, atomic PR
creation) ships via ag-ui PR #1487.

## Test plan

- [ ] Verify `getPublishedVersion` returns null on E404 but throws on
network errors
- [ ] Verify pre-existing tag check fails fast before publish
- [ ] Verify prerelease workflow runs tests before canary publish

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-04-16 12:31:29 +02:00
Jordan Ritter f97bf875d9 fix: include review items in docs-sync Slack notification (#3940)
## Summary
- The docs-sync warning notification was sending "see workflow run for
details" with no actionable information
- Now reads `review-items.txt` and includes the file list directly in
the Slack message
- Recipients can see which files need attention without digging through
CI logs

## Test plan
- [ ] Trigger docs-sync with a file that has showcase-local
modifications (exit code 3 path)
- [ ] Verify Slack notification includes the file list in a code block
- [ ] Verify auto-push-only path (exit code 0) still does NOT send the
warning notification
2026-04-15 16:18:46 -07:00
Jordan Ritter ccbc19a436 fix: include review items in docs-sync Slack notification
The warning notification for files needing manual review was sending
'see workflow run for details' with no actionable information.

- Read review-items.txt and include file list in the Slack message
- Use jq for proper JSON escaping (handles newlines, quotes, special chars)
- Guard against missing review-items.txt with fallback and ::warning::
- Review-needed notification fires independently of push/merge outcome
2026-04-15 16:13:27 -07:00
Jordan Ritter 1fd938ac35 feat: add starter deployed smoke test CI workflow
New workflow running starter health/agent/chat tests against Railway:
- Triggers: 6h cron, after showcase deploy, manual dispatch
- Alerts on schedule + workflow_run failures (Slack + GitHub issue)
- Issue dedup by title match, continue-on-error on Slack
- Proper working-directory for npm ci and Playwright install
2026-04-15 15:17:13 -07:00
Alem Tuzlak 966a1127c1 ci: add GitHub Actions workflow for VS Code extension build and marketplace publishing 2026-04-15 13:08:19 +02:00
Jordan Ritter e64acdc091 fix: langgraph-python starter agent — 3 root causes fixed, verified locally (#3921)
## Root causes (all verified locally with docker build + run)

1. **PermissionError**: non-root `USER app` can't create
`.langgraph_api` directory — fix: `chown -R app:app /app` before `USER
app`
2. **ImportError**: relative imports (`from .tools`) fail when
`langgraph_cli` loads modules — fix: absolute imports (`from
src.agents.tools`)
3. **ValueError**: `tools.py` file collides with `tools/` directory —
fix: rename to `tool_wrappers.py`

## Verified
```
docker build -t test-lgp-starter .
docker run --rm -e OPENAI_API_KEY=test -e PORT=10003 -p 10003:10003 test-lgp-starter
# {"status":"ok","integration":"langgraph-python","agent":"ok"}
```
2026-04-14 17:20:19 -07:00
Jordan Ritter 580a3e9214 fix: langgraph-python starter agent — permissions, imports, and tools.py naming collision
Root causes (verified locally with docker build + run):
1. PermissionError: non-root user can't write .langgraph_api dir — fix: chown -R app:app /app
2. ImportError: relative imports fail in langgraph_cli context — fix: absolute imports
3. ValueError: tools.py and tools/ directory collision — fix: rename to tool_wrappers.py

Tested: docker run returns {"status":"ok","agent":"ok"}
2026-04-14 17:06:02 -07:00
Jordan Ritter 0bd59333f7 chore: update CODEOWNERS default reviewers 2026-04-14 16:35:14 -07:00
Jordan Ritter e3e8edcd42 fix: remove invalid secrets reference in deploy workflow step conditions 2026-04-14 15:41:52 -07:00
Jordan Ritter 10edf630f6 fix: clean Slack alert formatting across showcase workflows (#3914)
## Summary

- **drift-detection**: Split inline payload into `jq`-built file +
`payload-file-path`; sanitize playwright output (strip ANSI, head -3,
cap 200 chars)
- **starter-smoke**: Replace `toJSON(format(...))` double-encoding with
`jq` payload builder
- **showcase_deploy**: Replace 300-char inline ternary with readable
shell conditional + `jq`

All three workflows now use the same pattern: build a sanitized JSON
file with `jq -n`, then reference it via `payload-file-path`. This
eliminates raw `%0A` in Slack messages, unformatted stack traces, and
double-encoded JSON.

## Test plan

- [ ] Trigger `showcase_drift-detection.yml` manually — verify Slack
alert formats correctly on failure
- [ ] Trigger `starter-smoke.yml` manually — verify Slack alert on a
known-failing starter
- [ ] Trigger `showcase_deploy.yml` with `service: shell` — verify
deploy notification renders cleanly
- [ ] Confirm no `%0A` or raw escape sequences appear in any Slack
message
2026-04-14 15:38:07 -07:00
Jordan Ritter 8a013f9a08 fix: remove test-integration-tmp from starter-smoke matrix (lost in #3899 merge) 2026-04-14 15:37:21 -07:00
Jordan Ritter 6e66ea626b fix: clean Slack alert formatting across showcase workflows
Use jq to build JSON payloads safely and payload-file-path to avoid
inline multiline content. Limits error context to 3 lines, strips ANSI
codes, and caps field length at 200 chars.

- drift-detection: split payload build from post, sanitize playwright output
- starter-smoke: replace toJSON(format(...)) double-encoding with jq
- showcase_deploy: replace 300-char inline ternary with readable shell conditional
2026-04-14 15:33:41 -07:00
Jordan Ritter 44dec7c72e fix: harden deploy pipeline — independent concurrency, post-deploy health checks 2026-04-14 14:44:44 -07:00
Jordan Ritter 569f85246c fix: format showcase_deploy.yml 2026-04-14 14:13:59 -07:00
Jordan Ritter 72a7f16ca5 fix: remove shared_frontend from Dockerfiles and test-integration-tmp from CI 2026-04-14 13:43:36 -07:00
Jordan Ritter c25c1ca291 fix: remove shared_frontend COPY from demo package Dockerfiles (deleted in #3896) 2026-04-14 13:27:05 -07:00
Jordan Ritter 6f27637380 feat: add on-demand aimock e2e test workflow with PR comment trigger 2026-04-14 13:01:44 -07:00
Jordan Ritter 5ac07d4d9b feat: CI, shell, and aimock integration for showcase starters
CI:
- Add 17 starter services to showcase deploy workflow with Railway IDs
- Add drift detection workflow (triggers on starters, packages, scripts, shared)
- Remove shared_frontend copy step for starter builds

Shell:
- Update clone command to npx degit with clipboard fallback
- Update starter content bundler for full component tree + .java support
- Add clone_command to manifest schema and registry types

Aimock:
- Expand feature-parity.json from 18 to 37 fixture rules
- Add docker-compose.packages.yml for CI aimock sidecar (strict mode)
- Add run-e2e-with-aimock.sh convenience script
2026-04-14 12:52:52 -07:00
Jordan Ritter 7b31011e24 fix: revert serviceInstanceUpdate — CI token lacks permission
The RAILWAY_TOKEN in GitHub secrets can't call serviceInstanceUpdate
(403 Forbidden). Services are now all configured to pull :latest, so
serviceInstanceRedeploy will pull the latest image automatically.
2026-04-13 23:22:54 -07:00
Jordan Ritter 02b85fd809 fix: update Railway image source before redeploy
Railway was pinned to old SHA tags — serviceInstanceRedeploy just
restarts the existing image. Now the deploy step calls
serviceInstanceUpdate to set the image to the exact SHA just pushed,
then triggers the redeploy. Also re-enables Docker cache.
2026-04-13 23:02:47 -07:00
Jordan Ritter 7bd2af08fa fix: disable Docker cache to force rebuild with new code
The GHA Docker layer cache was serving stale builds — renderer adapter
code wasn't in the deployed images despite successful builds. Disabling
cache-from forces a full rebuild. Will re-enable after cache is fresh.
2026-04-13 22:51:37 -07:00
Jordan Ritter 5aed8ee088 fix: resolve 4 remaining showcase deploy failures
- Remove test-integration-tmp from workflow (package was deleted)
- starter-langgraph-python: disable Turbopack for Next.js build
  (serverExternalPackages incompatible with Turbopack)
- starter-crewai-crews: pin crewai-tools~=0.47.1 to avoid version
  conflict with crewai==0.130.0
- shell-dojolike: add missing zod dependency (required by shared
  frontend modules)
2026-04-13 21:37:03 -07:00
Jordan Ritter d551f099b6 fix: remove duplicate test_integration_tmp key in deploy workflow
The paths-filter YAML had test_integration_tmp defined twice (lines 71
and 90), causing a "duplicated mapping key" parse error that blocked all
deploy runs.
2026-04-13 21:24:53 -07:00
Jordan Ritter e55139c62e fix: cp -r trailing slash creates double-nested dirs in CI deploy
The CI workflow's shared module copy step used trailing slashes on both
source and destination (cp -r src/ dest/src/), which on Linux copies the
*contents* into an already-created dest/src/ — resulting in
shared_frontend/src/src/ instead of shared_frontend/src/. Same issue
for shared_typescript/tools/.

Root cause confirmed via diagnostic instrumentation: index.ts existed at
the wrong depth, leaving the webpack alias target empty.

Fix: mkdir only the parent, cp without trailing slashes so the directory
itself is placed correctly. Also removes the diagnostic debug line from
pydantic-ai Dockerfile.
2026-04-13 21:22:37 -07:00
Jordan Ritter ae3d871542 feat: showcase feature parity: shared tools, Sales Dashboard, A2UI across all 17 integrations (#3873)
## Summary
- Create `@copilotkit/showcase-shared` — shared frontend package with
React hooks, components, A2UI catalog, and SalesDashboard
- Create shared Python + TypeScript tool implementations (get_weather,
query_data, manage_sales_todos, search_flights, schedule_meeting,
generate_a2ui)
- Upgrade all 17 showcase integrations to full feature parity with the
langgraph-python starter
- Docker builds verified locally for all 17 packages
- Comprehensive test coverage: 165 unit tests, 68 React component tests,
130+ Playwright e2e files

## Commits
1. `feat:` shared packages — frontend, Python tools, TypeScript tools,
unit tests, React component tests, aimock fixtures
2. `feat:` all 17 package upgrades — tools, demo pages, cross-cutting
fixes, Playwright e2e tests
3. `feat:` Docker + CI — tsconfig paths resolution, shared module
copying, spring-ai base image fix
4. `chore:` pnpm lockfile update

## Code review
5 rounds of fresh unbiased MSAL (1 dedicated agent per package, zero
prior context). Round 5: **20/20 packages PASS with 0 findings.** Test
quality audit: all criticality-7+ gaps fixed.

## Docker builds (all 17 verified locally)
```
langgraph-python     ✅    langgraph-typescript  ✅
langgraph-fastapi    ✅    mastra               ✅
pydantic-ai          ✅    claude-sdk-typescript ✅
crewai-crews         ✅    spring-ai            ✅
google-adk           ✅    ms-agent-dotnet      ✅
agno                 ✅    claude-sdk-python     ✅
ag2                  ✅    langroid             ✅
strands              ✅    ms-agent-python      ✅
llamaindex           ✅
```

## Test coverage
- Python unit: 54 tests (tools + parity + framework wrappers)
- TypeScript unit: 43 tests
- React component: 68 tests (7 suites)
- Playwright e2e: 130+ files, per-package UI adaptation
- Aimock: 18 deterministic fixtures (ready for Docker-compose wiring)

## Known gaps (follow-up PR)
- Feature set varies: langgraph-python/fastapi have 9 demos, rest have 4
- gen-ui-tool-based: Chart/Haiku/Sales Pipeline variants across packages
- HITL: MeetingTimePicker vs step-selector variants
- Node 22 upgrade across all Dockerfiles + CI

## Test plan
- [x] `python3 -m pytest showcase/shared/python/tests/ -v` (54 passed)
- [x] `npx vitest run --config
showcase/shared/typescript/vitest.config.ts` (43 passed)
- [x] `npx vitest run --config
showcase/shared/frontend/vitest.config.ts` (68 passed)
- [x] Docker build all 17 packages locally
- [ ] Deploy to Railway and run smoke tests

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-04-13 20:17:54 -07:00
Jordan Ritter 810f8a4f4d feat: Docker + CI — Node 22, shared module copying
- Node 20 → 22 in all Dockerfiles + CI workflows
- CI copies shared_python, shared_frontend/src, shared_typescript/tools
- tsconfig paths for @copilotkit/showcase-shared
- .gitignore for CI artifacts
2026-04-13 19:57:59 -07:00
Jordan Ritter c070403014 feat: Docker and CI support for shared showcase modules
- CI copies shared_python, shared_frontend/src, shared_typescript/tools into
  each package's build context before Docker build
- 12 Python Dockerfiles: COPY shared_python, ENV PYTHONPATH
- All Dockerfiles: npm install --legacy-peer-deps + tsconfig paths for
  @copilotkit/showcase-shared (no npm dependency needed)
- spring-ai: unpinned eclipse-temurin:17 base images
- Aimock: 18 deterministic fixtures for all demo scenarios
2026-04-13 17:39:05 -07:00
Jordan Ritter fbb9d01584 fix: upgrade docs sync token action to v2, add failure context
The v1 action uses SubtleCrypto.importKey() which fails with 'Invalid keyData'
on certain PEM key formats. v2 handles this more robustly.

Also adds step-level failure info to the Slack notification so we know
WHICH step failed instead of just 'workflow failed'.
2026-04-13 15:03:54 -07:00
Jordan Ritter 60f3b899df fix: version drift Slack alert links directly to GitHub issue 2026-04-13 09:31:56 -07:00
Jordan Ritter abb87bf5f0 fix: harden release system — registry error handling, tag check, prerelease tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:57:53 -07:00
Jordan Ritter ed065725a4 fix: address CR findings — deploy needs, rebuild loop resilience, merge-failure alert, loop prevention, drift failure alert 2026-04-12 14:57:18 -07:00
Jordan Ritter c0fb38959a fix: add Slack alerts across all showcase workflows, fix silent failures and loop risk 2026-04-12 14:50:21 -07:00
Jordan Ritter 7a5ebbf1e3 fix: docs sync auto-merges via devops bot (bypasses branch protection) 2026-04-12 14:02:00 -07:00
Jordan Ritter 4f4541b711 fix: docs sync uses PRs instead of direct push (branch protection) 2026-04-12 13:33:13 -07:00
Jordan Ritter 63948957e0 fix: docs sync commit messages need conventional prefix + skip hooks 2026-04-12 13:23:06 -07:00