From 4a535dc19cf7e3a018bce21a79018ec0433c7465 Mon Sep 17 00:00:00 2001 From: richard-epsilla Date: Sun, 13 Sep 2026 15:10:45 -0700 Subject: [PATCH 1/2] kits: each kit's Skills ship as an Agent Plugins package Every kit now carries its Skills as a plugin at kits//plugin/: plugin.json names and versions the package (harnessrouter-slides, harnessrouter-sheets, harnessrouter-dashboard, harnessrouter-video) and skills/ holds what used to sit at kits//skills/. kit.json points at the package with harness.plugin instead of listing skill names, so there is one source for what a kit's Harness knows. HarnessRouter installs the package at launch, and the Harness shows the kit as a named plugin it can export; the same package installs into any server that speaks the UHP Plugins chapter or any client that reads the format. Co-Authored-By: Claude Fable 5.1 --- README.md | 8 ++++++++ kits/dashboard/README.md | 6 +++--- kits/dashboard/kit.json | 9 +++++---- kits/dashboard/plugin/plugin.json | 20 +++++++++++++++++++ .../skills/dashboard-design/SKILL.md | 0 .../dashboard-design/validate_dashboard.py | 0 kits/sheets/README.md | 4 ++-- kits/sheets/kit.json | 4 +--- kits/sheets/plugin/plugin.json | 20 +++++++++++++++++++ .../{ => plugin}/skills/sheet-design/SKILL.md | 0 .../skills/sheet-design/validate_sheet.py | 0 kits/slides/README.md | 2 +- kits/slides/kit.json | 8 +++----- kits/slides/plugin/plugin.json | 20 +++++++++++++++++++ .../{ => plugin}/skills/slide-design/SKILL.md | 0 .../skills/slide-design/deck_model.py | 0 .../skills/slide-design/validate_deck.py | 0 kits/video/CREDITS.md | 4 ++-- kits/video/README.md | 8 ++++---- kits/video/kit.json | 4 +--- kits/video/plugin/plugin.json | 20 +++++++++++++++++++ .../skills/video-storyboard/SKILL.md | 0 .../video-storyboard/references/continuity.md | 0 .../references/storyboard-format.md | 0 .../skills/video-storyboard/validate_scene.py | 0 25 files changed, 110 insertions(+), 27 deletions(-) create mode 100644 kits/dashboard/plugin/plugin.json rename kits/dashboard/{ => plugin}/skills/dashboard-design/SKILL.md (100%) rename kits/dashboard/{ => plugin}/skills/dashboard-design/validate_dashboard.py (100%) create mode 100644 kits/sheets/plugin/plugin.json rename kits/sheets/{ => plugin}/skills/sheet-design/SKILL.md (100%) rename kits/sheets/{ => plugin}/skills/sheet-design/validate_sheet.py (100%) create mode 100644 kits/slides/plugin/plugin.json rename kits/slides/{ => plugin}/skills/slide-design/SKILL.md (100%) rename kits/slides/{ => plugin}/skills/slide-design/deck_model.py (100%) rename kits/slides/{ => plugin}/skills/slide-design/validate_deck.py (100%) create mode 100644 kits/video/plugin/plugin.json rename kits/video/{ => plugin}/skills/video-storyboard/SKILL.md (100%) rename kits/video/{ => plugin}/skills/video-storyboard/references/continuity.md (100%) rename kits/video/{ => plugin}/skills/video-storyboard/references/storyboard-format.md (100%) rename kits/video/{ => plugin}/skills/video-storyboard/validate_scene.py (100%) diff --git a/README.md b/README.md index 0c31c7f..fae2187 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,14 @@ Four working products, each launched from **Starter Kits** in the HarnessRouter one provisions the Harness it needs and serves the app from the HarnessRouter image — there is no separate service to deploy, no database to configure, and no API key to paste into the app. +Each kit's Skills ship as a plugin, a package in the +[Agent Plugins](https://agent-plugins.org) format at `kits//plugin/`: `plugin.json` names and +versions it, `skills/` holds the Skills. Launching a kit installs that package on the Harness it +provisions, so the Harness shows the kit as a named plugin it can export, and the same package installs +into any other server that speaks the +[Unified Harness Protocol](https://unifiedharnessprotocol.org/spec/2026-09-12/plugins) or any client that +reads the format. + Every one of them is the same idea in a different shape: **a session is a document**. The list of decks, sheets, dashboards or films *is* the Harness's session list, and the document is a file in that session's workspace. Delete the session and the work goes with it. diff --git a/kits/dashboard/README.md b/kits/dashboard/README.md index 8e6be05..3ebb226 100644 --- a/kits/dashboard/README.md +++ b/kits/dashboard/README.md @@ -81,7 +81,7 @@ numbers are tomorrow's. | Path | What | |---|---| | `kit.json` | The Harness this kit needs, and where its app is served | -| `skills/dashboard-design/` | The `dashboard.json` contract, how to explore a schema, which chart answers which question, and the validator — read before anything is written | +| `plugin/skills/dashboard-design/` | The `dashboard.json` contract, how to explore a schema, which chart answers which question, and the validator — read before anything is written | | `templates/templates.json` | Five worked dashboards (revenue, pipeline, traffic, support, executive) as reference material | | `app/` | The UI | @@ -90,12 +90,12 @@ numbers are tomorrow's. `dashboard.json` is the whole dashboard: `meta`, one `datasource`, a list of `queries` (id, name, SQL), and a list of `panels` (a title, the query it draws, its place on a 12-column grid, and either a single-number readout or an ECharts option). The contract is stated once, in -`skills/dashboard-design/SKILL.md`, and enforced twice — by the app's reader and by +`plugin/skills/dashboard-design/SKILL.md`, and enforced twice — by the app's reader and by `validate_dashboard.py`, which the agent runs before it finishes. If the two ever disagree, the app is right and the validator is the bug. ``` -python3 skills/dashboard-design/validate_dashboard.py path/to/dashboard.json +python3 plugin/skills/dashboard-design/validate_dashboard.py path/to/dashboard.json ``` It catches what cannot be seen from inside a turn: a statement the read-only check would refuse, diff --git a/kits/dashboard/kit.json b/kits/dashboard/kit.json index b303e3f..92a26b1 100644 --- a/kits/dashboard/kit.json +++ b/kits/dashboard/kit.json @@ -11,7 +11,10 @@ "launch": { "database": { "$comment": "This kit reads a database, so launch asks for one before it provisions anything. Without a connection every panel it builds has nothing to read. Declaring this is what makes launch collect a connection string; the entry it provisions is an ordinary tool from then on.", - "engines": ["postgres", "mysql"], + "engines": [ + "postgres", + "mysql" + ], "name": "database", "id": "mcp.database" } @@ -31,9 +34,7 @@ } ], "system_prompt": "You build dashboards that read a database.\n\nTHE FILE: ./dashboard.json, in your current working directory. That exact path, always. Do not search for it, do not look elsewhere in the tree, and do not treat its absence as a puzzle — on a new dashboard it simply does not exist yet and you create it there. It is the single source of truth and the only file the app reads.\n\nRead it before every change and write it back WHOLE — the person may have moved panels between turns. Its schema, and the mistakes that leave a panel blank, are in the dashboard-design skill: read that skill first, on every request, and validate with its validate_dashboard.py before you finish.\n\nThe database is reachable only through the database tools in your tool list, and only for reading: one statement, SELECT, row-capped and timed out. Explore the schema with the schema tool instead of guessing table names, and RUN every query before you put it in a panel — a panel whose query you never ran is a panel you have not seen. You are never given a connection string; never write one into any file.\n\nNever put a number in the file. Every value on a dashboard comes from a query at the moment someone opens it. There is nowhere in this document to type a figure you already know, and a chart with its data written in is a lie that never refreshes.\n\nWork directly. Every command you spend orienting is a command the person waits through.", - "skills": [ - "dashboard-design" - ] + "plugin": "plugin" }, "app": { "dir": "app", diff --git a/kits/dashboard/plugin/plugin.json b/kits/dashboard/plugin/plugin.json new file mode 100644 index 0000000..964efdc --- /dev/null +++ b/kits/dashboard/plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", + "name": "harnessrouter-dashboard", + "version": "1.0.0", + "description": "Say what you want to understand; your database answers it.", + "author": { + "name": "HarnessRouter", + "url": "https://harnessrouter.ai" + }, + "homepage": "https://github.com/HarnessRouter/starter-kit/tree/main/kits/dashboard", + "repository": "https://github.com/HarnessRouter/starter-kit", + "license": "LicenseRef-HarnessRouter-Starter-Kit-1.0.0", + "keywords": [ + "harnessrouter", + "starter-kit", + "dashboards", + "sql", + "charts" + ] +} diff --git a/kits/dashboard/skills/dashboard-design/SKILL.md b/kits/dashboard/plugin/skills/dashboard-design/SKILL.md similarity index 100% rename from kits/dashboard/skills/dashboard-design/SKILL.md rename to kits/dashboard/plugin/skills/dashboard-design/SKILL.md diff --git a/kits/dashboard/skills/dashboard-design/validate_dashboard.py b/kits/dashboard/plugin/skills/dashboard-design/validate_dashboard.py similarity index 100% rename from kits/dashboard/skills/dashboard-design/validate_dashboard.py rename to kits/dashboard/plugin/skills/dashboard-design/validate_dashboard.py diff --git a/kits/sheets/README.md b/kits/sheets/README.md index 507f127..f87f8a9 100644 --- a/kits/sheets/README.md +++ b/kits/sheets/README.md @@ -48,7 +48,7 @@ agent doing real work, one row at a time, and you can watch each cell arrive. | Path | What | |---|---| | `kit.json` | The Harness this kit needs, and where its app is served | -| `skills/sheet-design/` | The `sheet.json` contract and how to design columns — read before anything is written | +| `plugin/skills/sheet-design/` | The `sheet.json` contract and how to design columns — read before anything is written | | `templates/templates.json` | Starting points, including one with agent columns | | `app/` | The UI | @@ -70,7 +70,7 @@ npm run build | `cell.js` | The dispatcher: one cell, one turn | | `sh.js` | What "sheet" adds on top of `reifyui/harness` | -`model.test.mjs` and `run.test.mjs` cover both. `skills/sheet-design/validate_sheet.py` is the +`model.test.mjs` and `run.test.mjs` cover both. `plugin/skills/sheet-design/validate_sheet.py` is the agent-side twin of `model.js`'s `validate()`; if the two ever disagree, the app is right. ## License diff --git a/kits/sheets/kit.json b/kits/sheets/kit.json index 30b816e..c39aea1 100644 --- a/kits/sheets/kit.json +++ b/kits/sheets/kit.json @@ -22,9 +22,7 @@ } ], "system_prompt": "You build and edit spreadsheets.\n\nTHE FILE: ./sheet.json, in your current working directory. That exact path, always. Do not search for it, do not look elsewhere in the tree, and do not treat its absence as a puzzle — on a new sheet it simply does not exist yet and you create it there. It is the single source of truth and the only file the app reads.\n\nRead it before every change and write it back WHOLE — the person may have edited the grid between turns. Its schema, and the mistakes that make a sheet fail to load, are in the sheet-design skill: read that skill first, on every request, and validate with its validate_sheet.py before you finish.\n\nA column may be an AGENT column (type \"harness\"): it runs an agent once per row. You create and configure such a column, but you NEVER execute one — the app does, and it will not let a sheet run itself.\n\nALWAYS give an agent column a working default so the person can press Run the moment the sheet exists. Set harness_id to a BASE agent id, choosing the one that suits the work: \"codex\", \"claude-code\", \"hermes\", \"pi\", \"dsh\", \"opencode\", \"qwen\". Those ids are stable and you may write them. Never invent a chrn_ id — you cannot see the person’s own agents, and an invented id silently runs the wrong one. If the base you pick is not installed here the app substitutes one that is, so a reasonable choice is always better than leaving it blank. The person can change it in the column menu.\n\nCells in an agent column carry results the app produced — status, session_id, response_id, artifacts. Never write them and never delete them unless you are asked to clear that column; you cannot recompute them.\n\nWork directly. Every command you spend orienting is a command the person waits through.", - "skills": [ - "sheet-design" - ] + "plugin": "plugin" }, "app": { "dir": "app", diff --git a/kits/sheets/plugin/plugin.json b/kits/sheets/plugin/plugin.json new file mode 100644 index 0000000..dd066cc --- /dev/null +++ b/kits/sheets/plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", + "name": "harnessrouter-sheets", + "version": "1.0.0", + "description": "A spreadsheet where a column can be an agent.", + "author": { + "name": "HarnessRouter", + "url": "https://harnessrouter.ai" + }, + "homepage": "https://github.com/HarnessRouter/starter-kit/tree/main/kits/sheets", + "repository": "https://github.com/HarnessRouter/starter-kit", + "license": "LicenseRef-HarnessRouter-Starter-Kit-1.0.0", + "keywords": [ + "harnessrouter", + "starter-kit", + "spreadsheets", + "sheets", + "data" + ] +} diff --git a/kits/sheets/skills/sheet-design/SKILL.md b/kits/sheets/plugin/skills/sheet-design/SKILL.md similarity index 100% rename from kits/sheets/skills/sheet-design/SKILL.md rename to kits/sheets/plugin/skills/sheet-design/SKILL.md diff --git a/kits/sheets/skills/sheet-design/validate_sheet.py b/kits/sheets/plugin/skills/sheet-design/validate_sheet.py similarity index 100% rename from kits/sheets/skills/sheet-design/validate_sheet.py rename to kits/sheets/plugin/skills/sheet-design/validate_sheet.py diff --git a/kits/slides/README.md b/kits/slides/README.md index 2317326..181ec20 100644 --- a/kits/slides/README.md +++ b/kits/slides/README.md @@ -34,7 +34,7 @@ service: nothing it makes is a flat picture you have to ask it to change. | Path | What | |---|---| | `kit.json` | The Harness this kit needs, and where its app is served | -| `skills/slide-design/` | How to design a deck — read before any slide is written | +| `plugin/skills/slide-design/` | How to design a deck — read before any slide is written | | `templates/templates.json` | 46 starting points | | `app/` | The UI | diff --git a/kits/slides/kit.json b/kits/slides/kit.json index 96062cd..cb9272a 100644 --- a/kits/slides/kit.json +++ b/kits/slides/kit.json @@ -2,7 +2,7 @@ "id": "slides", "title": "Slides", "tagline": "Design presentations by conversation, then edit them by hand.", - "description": "A deck is one conversation. Ask for a presentation and the agent designs it \u2014 structure first, then a style system, then slide by slide. Everything it makes is editable on the canvas: drag, resize, retype, add. Ships with 46 templates.", + "description": "A deck is one conversation. Ask for a presentation and the agent designs it — structure first, then a style system, then slide by slide. Everything it makes is editable on the canvas: drag, resize, retype, add. Ships with 46 templates.", "icon": "tabler:presentation", "accent": "#6E55FF", "harness": { @@ -21,10 +21,8 @@ "model": "claude-opus-5" } ], - "system_prompt": "You design and edit presentation decks.\n\nTHE FILE: ./deck.json, in your current working directory. That exact path, always. Do not search for it, do not look elsewhere in the tree, and do not treat its absence as a puzzle \u2014 on a new deck it simply does not exist yet and you create it there. It is the single source of truth and the only file the app reads.\n\nRead it before every change and write it back whole. Its schema, and the four mistakes that render as an empty rectangle, are in the slide-design skill \u2014 read that skill first, on every deck request, and validate with its validate_deck.py before you finish.\n\nWork directly. Every command you spend orienting is a command the person waits through.", - "skills": [ - "slide-design" - ] + "system_prompt": "You design and edit presentation decks.\n\nTHE FILE: ./deck.json, in your current working directory. That exact path, always. Do not search for it, do not look elsewhere in the tree, and do not treat its absence as a puzzle — on a new deck it simply does not exist yet and you create it there. It is the single source of truth and the only file the app reads.\n\nRead it before every change and write it back whole. Its schema, and the four mistakes that render as an empty rectangle, are in the slide-design skill — read that skill first, on every deck request, and validate with its validate_deck.py before you finish.\n\nWork directly. Every command you spend orienting is a command the person waits through.", + "plugin": "plugin" }, "app": { "dir": "app", diff --git a/kits/slides/plugin/plugin.json b/kits/slides/plugin/plugin.json new file mode 100644 index 0000000..50034d9 --- /dev/null +++ b/kits/slides/plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", + "name": "harnessrouter-slides", + "version": "1.0.0", + "description": "Design presentations by conversation, then edit them by hand.", + "author": { + "name": "HarnessRouter", + "url": "https://harnessrouter.ai" + }, + "homepage": "https://github.com/HarnessRouter/starter-kit/tree/main/kits/slides", + "repository": "https://github.com/HarnessRouter/starter-kit", + "license": "LicenseRef-HarnessRouter-Starter-Kit-1.0.0", + "keywords": [ + "harnessrouter", + "starter-kit", + "presentations", + "slides", + "design" + ] +} diff --git a/kits/slides/skills/slide-design/SKILL.md b/kits/slides/plugin/skills/slide-design/SKILL.md similarity index 100% rename from kits/slides/skills/slide-design/SKILL.md rename to kits/slides/plugin/skills/slide-design/SKILL.md diff --git a/kits/slides/skills/slide-design/deck_model.py b/kits/slides/plugin/skills/slide-design/deck_model.py similarity index 100% rename from kits/slides/skills/slide-design/deck_model.py rename to kits/slides/plugin/skills/slide-design/deck_model.py diff --git a/kits/slides/skills/slide-design/validate_deck.py b/kits/slides/plugin/skills/slide-design/validate_deck.py similarity index 100% rename from kits/slides/skills/slide-design/validate_deck.py rename to kits/slides/plugin/skills/slide-design/validate_deck.py diff --git a/kits/video/CREDITS.md b/kits/video/CREDITS.md index 298a66e..d244b57 100644 --- a/kits/video/CREDITS.md +++ b/kits/video/CREDITS.md @@ -4,7 +4,7 @@ The five worked storyboards in `templates/templates.json` — their shot lists, their prompts and their arrangement — are original to this kit, and so is the guidance in -`skills/video-storyboard/`. What is not original is the craft underneath: which shots a short film +`plugin/skills/video-storyboard/`. What is not original is the craft underneath: which shots a short film needs, in what order, and why a face has to be established once rather than described repeatedly. These are the sources that settled those questions. @@ -30,7 +30,7 @@ These are the sources that settled those questions. - Pat P. Miller, *Script Supervising and Film Continuity* (Focal Press) — continuity is somebody's explicit responsibility on a real set, tracked shot by shot, precisely because it cannot be held - in anyone's head. `skills/video-storyboard/references/continuity.md` is that idea applied to a + in anyone's head. `plugin/skills/video-storyboard/references/continuity.md` is that idea applied to a generative pipeline, where the failure mode is sharper: a described character is a distribution of faces, and re-describing draws a new one each time. diff --git a/kits/video/README.md b/kits/video/README.md index 361689a..8eaa2c9 100644 --- a/kits/video/README.md +++ b/kits/video/README.md @@ -102,7 +102,7 @@ ended on, which is how a move carries across a join without a jump. | Path | What | |---|---| | `kit.json` | The Harness this kit needs, and where its app is served | -| `skills/video-storyboard/` | The loop, the storyboard format, the continuity rules, and the validator — read before anything is generated | +| `plugin/skills/video-storyboard/` | The loop, the storyboard format, the continuity rules, and the validator — read before anything is generated | | `templates/templates.json` | Five worked storyboards (product launch, explainer, teaser, story, how-to) as reference material | | `app/` | The UI | @@ -120,13 +120,13 @@ Two rules about that file are worth stating outright because both fail silently: - **The order of `timeline.shots` is the cut order.** It is never inferred from where cards sit on the canvas, or dragging one to tidy the board would silently re-cut the film. -The contract is stated once, in `skills/video-storyboard/SKILL.md`, and enforced twice — by the app +The contract is stated once, in `plugin/skills/video-storyboard/SKILL.md`, and enforced twice — by the app and the export pipeline, and by `validate_scene.py`, which the agent runs before it finishes. If the two ever disagree, the running system is right and the validator is the bug. ``` -python3 skills/video-storyboard/validate_scene.py path/to/scene.excalidraw --expect-seconds 36 -python3 skills/video-storyboard/validate_scene.py --templates templates/templates.json +python3 plugin/skills/video-storyboard/validate_scene.py path/to/scene.excalidraw --expect-seconds 36 +python3 plugin/skills/video-storyboard/validate_scene.py --templates templates/templates.json ``` It catches what cannot be seen from inside a turn: a timeline shot that is still rendering, a shot diff --git a/kits/video/kit.json b/kits/video/kit.json index 599e742..e4e167d 100644 --- a/kits/video/kit.json +++ b/kits/video/kit.json @@ -40,9 +40,7 @@ } ], "system_prompt": "You make short videos with someone, on a canvas you both edit.\n\nTHE CANVAS IS NOT A FILE YOU WRITE. Never create, read or edit scene.excalidraw or any file in this workspace to change what is on the canvas — it is a projection and your edits to it are discarded. Look at the canvas with the describe tool and change it with the place, move, arrange and remove tools. There is no other way and you do not need one.\n\nGENERATION IS SUBMIT AND POLL. Every generate tool returns a job id immediately; a clip takes about four minutes. Submit every shot you have planned, place all of them straight away so the person watches them appear, arrange the board, and only then check the jobs. Never submit one clip and wait for it.\n\nEVERY GENERATION COSTS MONEY. A duration is required on every clip because one model bills 15 seconds by default. Never re-render something that already exists — place it again instead. Never loop a generation.\n\nLIST THE CAPABILITIES FIRST. Models come and go and some are broken today. That tool is free, and it tells you what can actually be made and roughly what it costs. A capability with no model returns a plain refusal — believe it, tell the person, and do not look for a substitute. Speech is not music.\n\nGET THE STORYBOARD AGREED BEFORE YOU SPEND ANYTHING. Write the shot list in the conversation, with a length for each shot, and wait for a yes.\n\nRead your tool list for the exact names — it is the authority, not this paragraph. Read the video-storyboard skill on every request and follow it.", - "skills": [ - "video-storyboard" - ] + "plugin": "plugin" }, "app": { "dir": "app", diff --git a/kits/video/plugin/plugin.json b/kits/video/plugin/plugin.json new file mode 100644 index 0000000..7c58f9b --- /dev/null +++ b/kits/video/plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", + "name": "harnessrouter-video", + "version": "1.0.0", + "description": "Describe the film; watch the shots arrive on the canvas.", + "author": { + "name": "HarnessRouter", + "url": "https://harnessrouter.ai" + }, + "homepage": "https://github.com/HarnessRouter/starter-kit/tree/main/kits/video", + "repository": "https://github.com/HarnessRouter/starter-kit", + "license": "LicenseRef-HarnessRouter-Starter-Kit-1.0.0", + "keywords": [ + "harnessrouter", + "starter-kit", + "video", + "storyboard", + "media" + ] +} diff --git a/kits/video/skills/video-storyboard/SKILL.md b/kits/video/plugin/skills/video-storyboard/SKILL.md similarity index 100% rename from kits/video/skills/video-storyboard/SKILL.md rename to kits/video/plugin/skills/video-storyboard/SKILL.md diff --git a/kits/video/skills/video-storyboard/references/continuity.md b/kits/video/plugin/skills/video-storyboard/references/continuity.md similarity index 100% rename from kits/video/skills/video-storyboard/references/continuity.md rename to kits/video/plugin/skills/video-storyboard/references/continuity.md diff --git a/kits/video/skills/video-storyboard/references/storyboard-format.md b/kits/video/plugin/skills/video-storyboard/references/storyboard-format.md similarity index 100% rename from kits/video/skills/video-storyboard/references/storyboard-format.md rename to kits/video/plugin/skills/video-storyboard/references/storyboard-format.md diff --git a/kits/video/skills/video-storyboard/validate_scene.py b/kits/video/plugin/skills/video-storyboard/validate_scene.py similarity index 100% rename from kits/video/skills/video-storyboard/validate_scene.py rename to kits/video/plugin/skills/video-storyboard/validate_scene.py From d32f04c44e2c53495d834355f038c6415f23fcf2 Mon Sep 17 00:00:00 2001 From: richard-epsilla Date: Sun, 13 Sep 2026 17:45:06 -0700 Subject: [PATCH 2/2] ci: the templates check runs the validator at its new path under the plugin package Co-Authored-By: Claude Fable 5.1 --- .github/workflows/kits.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/kits.yml b/.github/workflows/kits.yml index dc95236..c8f4c24 100644 --- a/.github/workflows/kits.yml +++ b/.github/workflows/kits.yml @@ -41,5 +41,5 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - run: python3 kits/video/skills/video-storyboard/validate_scene.py + - run: python3 kits/video/plugin/skills/video-storyboard/validate_scene.py --templates kits/video/templates/templates.json