Skip to content

Commit e2a6cc2

Browse files
committed
Regenerate shell-dojo registry at build and expand CI trigger paths
The dojo app was missing items under the langgraph column because shell-dojo shipped a stale committed registry.json. The generator only wrote to shell/, the dojo Dockerfile didn't run the generator at build, and the CI path filter didn't rebuild the dojo when manifest files changed. Fix: emit from generate-registry.ts to shell, shell-dojo, and shell-docs; add the generator step to shell-dojo's Dockerfile; expand the deploy workflow's path filter to include packages/** and shared/**; and refresh the committed registry/demo-content JSON so files on disk match what the generator produces today.
1 parent aa4af55 commit e2a6cc2

11 files changed

Lines changed: 7140 additions & 2606 deletions

File tree

.github/workflows/showcase_deploy.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,11 @@ jobs:
115115
starter_spring_ai: 'showcase/starters/spring-ai/**'
116116
starter_strands: 'showcase/starters/strands/**'
117117
aimock: 'showcase/aimock/**'
118-
shell_dojo: 'showcase/shell-dojo/**'
118+
shell_dojo:
119+
- 'showcase/shell-dojo/**'
120+
- 'showcase/shared/**'
121+
- 'showcase/scripts/**'
122+
- 'showcase/packages/*/manifest.yaml'
119123
shell_dashboard:
120124
- 'showcase/shell-dashboard/**'
121125
- 'showcase/shared/**'
@@ -174,7 +178,7 @@ jobs:
174178
{"dispatch_name":"starter-spring-ai","filter_key":"starter_spring_ai","context":"showcase/starters/spring-ai","image":"showcase-starter-spring-ai","railway_id":"3559ece3-7ba3-41ac-b24c-1f780133ec58","timeout":15,"lfs":false,"build_args":"","dockerfile":"","health_path":"/api/health"},
175179
{"dispatch_name":"starter-strands","filter_key":"starter_strands","context":"showcase/starters/strands","image":"showcase-starter-strands","railway_id":"06db2bb8-e15d-4c6a-97ad-e14777c92d9f","timeout":15,"lfs":false,"build_args":"","dockerfile":"","health_path":"/api/health"},
176180
{"dispatch_name":"aimock","filter_key":"aimock","context":"showcase/aimock","image":"showcase-aimock","railway_id":"0fa0435d-8a66-46f0-84fd-e4250b580013","timeout":5,"lfs":false,"build_args":"","dockerfile":"","health_path":"/health"},
177-
{"dispatch_name":"shell-dojo","filter_key":"shell_dojo","context":"showcase/shell-dojo","image":"showcase-shell-dojo","railway_id":"7ad1ece7-2228-49cd-8a78-bddf30322907","timeout":10,"lfs":false,"build_args":"","dockerfile":"","health_path":"/"},
181+
{"dispatch_name":"shell-dojo","filter_key":"shell_dojo","context":".","image":"showcase-shell-dojo","railway_id":"7ad1ece7-2228-49cd-8a78-bddf30322907","timeout":10,"lfs":true,"build_args_sha":"${{ github.sha }}","build_args_branch":"${{ github.ref_name }}","dockerfile":"showcase/shell-dojo/Dockerfile","health_path":"/"},
178182
{"dispatch_name":"shell-dashboard","filter_key":"shell_dashboard","context":".","image":"showcase-shell-dashboard","railway_id":"4d5dfd74-be61-40b2-8564-b53b7dd4c15b","timeout":10,"lfs":true,"build_args_sha":"${{ github.sha }}","build_args_branch":"${{ github.ref_name }}","build_args_shell_url":"https://showcase.copilotkit.ai","dockerfile":"showcase/shell-dashboard/Dockerfile","health_path":"/"},
179183
{"dispatch_name":"shell-docs","filter_key":"shell_docs","context":".","image":"showcase-shell-docs","railway_id":"7badfb8d-4228-414c-9145-b4026803714f","timeout":10,"lfs":true,"build_args_sha":"${{ github.sha }}","build_args_branch":"${{ github.ref_name }}","dockerfile":"showcase/shell-docs/Dockerfile","health_path":"/"}
180184
]'

showcase/scripts/bundle-demo-content.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,15 @@ const __dirname = path.dirname(__filename);
5858

5959
const ROOT = path.resolve(__dirname, "..");
6060
const PACKAGES_DIR = path.join(ROOT, "packages");
61-
// demo-content is consumed by BOTH shells:
61+
// demo-content is consumed by ALL shells:
6262
// - shell: integration pages + demo drawer read the bundle at runtime
6363
// - shell-docs: <Snippet> (docs routes) imports directly at build time
64-
// so we dual-emit. Paths array is iterated at write time.
64+
// - shell-dojo: demo content renders inside the dojo's cell viewer
65+
// so we multi-emit. Paths array is iterated at write time.
6566
const OUTPUT_PATHS = [
6667
path.join(ROOT, "shell", "src", "data", "demo-content.json"),
6768
path.join(ROOT, "shell-docs", "src", "data", "demo-content.json"),
69+
path.join(ROOT, "shell-dojo", "src", "data", "demo-content.json"),
6870
];
6971

7072
interface DemoFile {

showcase/scripts/generate-registry.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,19 @@ const FEATURE_REGISTRY_PATH = path.join(
2424
"shared",
2525
"feature-registry.json",
2626
);
27-
// Registry is consumed by BOTH shells:
27+
// Registry is consumed by ALL shells:
2828
// - shell: home grid, integrations catalog, matrix, middleware
2929
// - shell-docs: docs routes (framework lookup, MDX renderer)
30-
// so we dual-emit. constraints.json is shell-only (integration-explorer).
30+
// - shell-dojo: dojo app's integration grid and demo columns
31+
// so we multi-emit. constraints.json is shell-only (integration-explorer).
3132
const SHELL_OUTPUT_DIR = path.join(ROOT, "shell", "src", "data");
3233
const SHELL_DOCS_OUTPUT_DIR = path.join(ROOT, "shell-docs", "src", "data");
33-
const OUTPUT_DIRS = [SHELL_OUTPUT_DIR, SHELL_DOCS_OUTPUT_DIR];
34+
const SHELL_DOJO_OUTPUT_DIR = path.join(ROOT, "shell-dojo", "src", "data");
35+
const OUTPUT_DIRS = [
36+
SHELL_OUTPUT_DIR,
37+
SHELL_DOCS_OUTPUT_DIR,
38+
SHELL_DOJO_OUTPUT_DIR,
39+
];
3440
const CONSTRAINTS_PATH = path.join(ROOT, "shared", "constraints.yaml");
3541
const CONSTRAINTS_OUTPUT_PATH = path.join(SHELL_OUTPUT_DIR, "constraints.json");
3642

showcase/shell-docs/src/data/demo-content.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"generated_at": "2026-04-21T05:02:54.302Z",
2+
"generated_at": "2026-04-21T20:03:18.267Z",
33
"demos": {
44
"ag2::agentic-chat": {
55
"readme": "# Agentic Chat\n\n## What This Demo Shows\n\nNatural conversation with frontend tool execution\n\n## How to Interact\n\nTry asking your Copilot to:\n\n- \"Can you change the background color to something more vibrant?\"\n- \"Make the background a blue to purple gradient\"\n- \"What's the weather like in San Francisco?\"\n- \"Set the background to a sunset-themed gradient\"\n\nYou can also chat about other topics — the agent will respond conversationally while having the ability to use your UI tools when appropriate.\n\n## Technical Details\n\n**Frontend tools** are registered using `useFrontendTool`:\n\n- `change_background` — accepts a CSS background value and applies it to the chat container\n- CopilotKit automatically exposes this function to the agent\n- The agent determines when to call the tool based on the user's request\n\n**Backend tool rendering** uses `useRenderTool`:\n\n- `get_weather` — a backend tool that the agent calls; the frontend renders the result as a weather card\n- The render function receives `args`, `result`, and `status` for loading/complete states\n\n**Agent context** is provided via `useAgentContext`:\n\n- Sends the user's name to the agent so it can personalize responses\n\n**Suggestions** are configured with `useConfigureSuggestions`:\n\n- Static suggestions shown as quick-action buttons below the chat\n\n## Building With This\n\nIf you're extending this demo or building something similar, here are key things to know:\n\n### Styling Inside the Chat\n\nContent rendered inside CopilotKit's chat area (via `useRenderTool`, `useHumanInTheLoop`, `useFrontendTool`) runs inside CopilotKit's component tree. Standard Tailwind classes may not work here because Tailwind v4 can't statically detect them.\n\n**Use inline styles** for any UI rendered inside the chat:\n\n```tsx\n// Do this\n<div style={{ padding: \"24px\", borderRadius: \"12px\", background: \"#fff\" }}>\n\n// Not this — Tailwind may purge these classes\n<div className=\"p-6 rounded-xl bg-white\">\n```\n\n### Chat Layout\n\nWrap `CopilotChat` in a constraining div for proper spacing:\n\n```tsx\n<div className=\"flex justify-center items-center h-screen w-full\">\n <div className=\"h-full w-full md:w-4/5 md:h-4/5 rounded-lg\">\n <CopilotChat className=\"h-full rounded-2xl max-w-6xl mx-auto\" />\n </div>\n</div>\n```\n\n### Overriding CopilotKit Styles\n\nCopilotKit uses `cpk:` prefixed classes internally. To override them, create a **separate CSS file** (not in globals.css — Tailwind purges it):\n\n```css\n/* copilotkit-overrides.css */\n.copilotKitInput {\n border-radius: 0.75rem;\n border: 1px solid var(--copilot-kit-separator-color) !important;\n}\n```\n\nImport it in `layout.tsx` after `globals.css`.\n\n### Images and Icons\n\n- Don't reference local image files from agent-generated content (they won't exist). Add `onError` fallbacks.\n- Use emoji instead of SVG icons inside chat messages (`fill=\"currentColor\"` renders unpredictably in the chat context).\n\nSee the full [Styling Guide](https://github.com/CopilotKit/CopilotKit/blob/main/showcase/STYLING-GUIDE.md) for more details.\n",

0 commit comments

Comments
 (0)