port-showcases
GitHub同步Angular/Vue/TS等框架的演示代码与React基准版本,通过识别过时端口、按指南移植变更并验证一致性来保持多框架示例对齐。
Trigger Scenarios
Install
npx skills add ag-grid/ag-charts --skill port-showcases -g -y
SKILL.md
Frontmatter
{
"name": "port-showcases",
"targets": [
"*"
],
"description": "Bring the Angular, Vue and TypeScript ports of the showcase demos (financial, web-analytics, procurement) back into step with their React golden masters: find the stale ports, port the React change following each PORTING guide, restamp the manifests and prove parity. Use when asked to align, sync or update the demo ports or seeds, when `check-seeds.mjs --stale` lists a port, or on \/port-showcases [demo] [framework] [--ci]."
}
Port Showcases
The React demo under packages/ag-charts-demos/src/demos/<demo>/ is the golden master. Each
packages/ag-charts-demos/seeds/<demo>/<framework>/ port records in .seed-manifest.json the
source hash it was last aligned to. This skill brings stale ports back into step and proves it.
Read first: packages/ag-charts-demos/tools/seeds/README.md (manifests, pins, the scripts),
packages/ag-charts-demos/e2e/parity/README.md (the harness), .rulesync/rules/demo-ports.md,
and for each port you touch, seeds/<demo>/<framework>.PORTING.md. Those are authoritative; this
skill is the order of work.
Arguments
/port-showcases [demo] [framework] [--ci]
demo(financial,web-analytics,procurement) andframework(angular,vue,typescript) filter the stale list; either may be given alone. Default: every stale port.--ci: headless run from.github/workflows/demo-port-align.yml. Commit, write the summary (step 5), and never push or open a PR; the workflow does both.
All commands run from the repository root with NX_DAEMON=false. Record the commit you start from
as <base> (git rev-parse HEAD) before changing anything.
1. Find the stale ports and what moved
node packages/ag-charts-demos/tools/seeds/check-seeds.mjs --stale
Each entry names demo, framework, manifestCommit (last aligned) and sourceCommit (the
golden master now). An empty list means nothing to do: say so and stop. For each entry, read the
React change since the port was aligned:
git log --oneline <manifestCommit>..HEAD -- packages/ag-charts-demos/src/demos/<demo>
git diff <manifestCommit> HEAD -- packages/ag-charts-demos/src/demos/<demo> packages/ag-charts-demos/seeds/<demo>/react
The React seed diff also shows the files it vendors from sibling demos (the manifest's vendored
list, such as web-analytics/topology.ts for procurement), whose changes make a port stale too.
A manifest with no manifestCommit was never aligned: compare the whole port against React.
2. Port each change
Follow the port's PORTING guide: its file-mapping table, mapping rules and DOM invariants.
- Byte-identical modules are re-copied, never edited. Every file the mapping table marks as
copied (data, types, formatters, CSS, vendored files) is copied again from the source the table
names (the demo source, or the React seed for
routes.tsandvendored/), then any rename the table lists is re-applied. - Components and hooks are rewritten by the guide's mapping rules. Keep React's DOM, class
names, roles, ARIA and
data-*attributes: the functional specs and the pixel comparison key off them. - Never edit
src/demos/**,seeds/<demo>/react/**or anything outside the port to suit a port. If the port cannot match React without that, stop on that port and report why. - Update the PORTING guide in the same commit when a mapping rule or invariant changed.
3. Restamp
Once a port reproduces the change:
node packages/ag-charts-demos/tools/seeds/stamp-port-manifest.mjs <demo> <framework>
node packages/ag-charts-demos/tools/seeds/check-seeds.mjs --stale --pins # the port is no longer listed
check-seeds.mjs runs every check it is given and prints only the --stale report on stdout.
Use the stamp script, not a hand-written manifest rewrite; it keeps vendored, dist and the pins. Never stamp a port that fails a gate below.
4. Gate
yarn nx run ag-charts-demos-seeds:build(every seed's typecheck and build; the React seeds included, so a broken golden master shows up here too).- Functional specs against each aligned port. Serve its
distand run the specs its guide names (the guides differ:-g <demo>or named spec files), frompackages/ag-charts-demos:DEMOS_BASE_URL=http://localhost:<port> npx playwright test <selection>. - Pixel parity. Self-parity first,
yarn nx test:e2e:parity ag-charts-demos, which must be pixel-identical. Then every aligned port as explicit targets in one run: serve eachdistwithnode packages/ag-charts-demos/e2e/parity/serve-dist.mjs --dir <seed>/dist --port <port>and pass them all inPARITY_TARGETS(the parity README's "Explicit targets" subshell stops the servers on exit). Fix the port on a failure; never add a mask or widen the gate. The results are inpackages/ag-charts-demos/e2e/parity/results/<run>/summary.json. yarn nx format, thenyarn nx format:checkandyarn nx lint ag-charts-demos.node tools/hot-paths/detect.js --range <base>...HEAD --summary.
Ports: the harness defaults to 4701 (reference), 4702 (self-parity copy) and 4710 upwards for
served ports, and fails rather than reuse a busy one. Check each with
lsof -nP -iTCP:<port> -sTCP:LISTEN first; move the reference and copy with
PARITY_REFERENCE_PORT and PARITY_SELF_PORT and pick free ports for the seeds. Stop every
server you started before finishing.
5. Output
- One commit per port: the port's files, its manifest and any guide change together, per
/ag-eng:git-conventions. Use the ticket key when the work has one; a--cirun has none, so its subjects are plain, for exampleAlign the financial Angular port with React at 1a2b3c4d. - Interactive: stop at the commits; open a PR into the detected base (the release branch on
one) only when asked, with
/ag-eng:pr-create. --ci: also writereports/port-showcases/summary.md(gitignored), which the workflow puts in the PR body: a table of each port handled (demo/framework, the React commits ported, aligned or not and why), then each gate above with its verbatim result line. A port left stale must be listed with the reason. Never push, and leave no uncommitted changes other than.claude/settings.json.
Version History
- 4f5d825 Current 2026-09-27 22:39


