From 6092258537f3b21bdd61b995c0faf91e1955b628 Mon Sep 17 00:00:00 2001 From: KeyInfo Bot Date: Thu, 5 Nov 2026 00:03:16 +0800 Subject: [PATCH] Sync third-party and MCP marketplace plugins Constraint: Public skills are published only by explicit administrator action unless they are tracked third-party market sources. Confidence: high Scope-risk: narrow Directive: Keep private/internal skills out of the public marketplace and preserve normal incremental market Git history. Tested: Marketplace validation passed. --- config/external-sources.lock.json | 12 ++++++------ .../codex/plugins/hallmark/THIRD_PARTY_SOURCE.json | 4 ++-- .../hallmark/skills/hallmark/references/flow.md | 4 ++-- .../skills/hallmark/scripts/sloplint-render.mjs | 2 +- .../hallmark/skills/hallmark/scripts/theme.mjs | 10 +++++++--- plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json | 2 +- .../plugins/next-skills/THIRD_PARTY_SOURCE.json | 4 ++-- .../next-skills/skills/next-dev-loop/SKILL.md | 7 ++++++- plugins/codex/plugins/ui-ux-pro-max/README.md | 3 ++- .../plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json | 4 ++-- 10 files changed, 31 insertions(+), 21 deletions(-) diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json index 3a7a6026..cb4845a5 100644 --- a/config/external-sources.lock.json +++ b/config/external-sources.lock.json @@ -24,8 +24,8 @@ "repo": "https://github.com/Nutlope/hallmark.git", "ref": "main", "adapter": "claude-skill", - "commit": "52328cb3129135499e4e178d4864ee90029dea2b", - "syncedAt": "2026-11-03T16:00:00Z" + "commit": "de4999e0cd7a7a41df0b4e6903fa02fe9f1492a8", + "syncedAt": "2026-11-04T16:00:00Z" }, { "id": "docx", @@ -132,8 +132,8 @@ "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", "ref": "main", "adapter": "claude-skill", - "commit": "dd9a1b4cf9f67ca2e326f646d93e101b2778db30", - "syncedAt": "2026-11-04T09:24:25Z" + "commit": "ccce51cba388476d4f403091ddb91636d5cd9fed", + "syncedAt": "2026-11-04T16:00:00Z" }, { "id": "superpowers-zh", @@ -285,8 +285,8 @@ "repo": "https://github.com/vercel/next.js.git", "ref": "canary", "adapter": "skill-collection", - "commit": "cc65c414d283e22e587828c94770d9b12522bbb4", - "syncedAt": "2026-11-04T09:24:25Z" + "commit": "d2defa02a2887f94b99a573cf17efbef112218fd", + "syncedAt": "2026-11-04T16:00:00Z" }, { "id": "shuorenhua", diff --git a/plugins/codex/plugins/hallmark/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/hallmark/THIRD_PARTY_SOURCE.json index 4df7e1ea..ee47e2fe 100644 --- a/plugins/codex/plugins/hallmark/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/hallmark/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "hallmark", "repo": "https://github.com/Nutlope/hallmark.git", "ref": "main", - "commit": "52328cb3129135499e4e178d4864ee90029dea2b", + "commit": "de4999e0cd7a7a41df0b4e6903fa02fe9f1492a8", "adapter": "claude-skill", "sourcePath": "skills/hallmark", - "syncedAt": "2026-11-03T16:00:00Z" + "syncedAt": "2026-11-04T16:00:00Z" } diff --git a/plugins/codex/plugins/hallmark/skills/hallmark/references/flow.md b/plugins/codex/plugins/hallmark/skills/hallmark/references/flow.md index 0a14a016..8912ffb3 100644 --- a/plugins/codex/plugins/hallmark/skills/hallmark/references/flow.md +++ b/plugins/codex/plugins/hallmark/skills/hallmark/references/flow.md @@ -48,11 +48,11 @@ Stamp: `/* Hallmark · component: · genre: · theme: · ## App screens -A dashboard, an admin, a settings page, a tool: a screen someone works in rather than reads. Signals: the prompt says app, dashboard, admin, console, settings or tool; the target sits behind a sign-in; the screen is tables, forms and controls. The bar is earned familiarity: the tool disappears into the task, and someone fluent in the category trusts it at once. The marketing rules step aside: no shape from `macrostructures.md`, no hero or fold, no screen word budget, no section rhythm, no stand-in photographs, no reveal on load. `sloplint --scope app` skips their gates (1, 6, 8, 9, 32, 42, 44, 46b, 58, 59, 66, 68, 77 to 79 and 81 to 83, and F8, F15 and F20) and reads control heights on the app range. Everything else binds, the Floor first: tokens, contrast, focus, states, no eyebrow, no tracked-caps label on a table head, no invented figure. +A dashboard, an admin, a settings page, a tool: a screen someone works in rather than reads. Signals: the prompt says app, dashboard, admin, console, settings or tool; the target sits behind a sign-in; the screen is tables, forms and controls. The bar is earned familiarity: the tool disappears into the task, and someone fluent in the category trusts it at once. The marketing rules step aside: no shape from `macrostructures.md`, no hero or fold, no screen word budget, no section rhythm, no stand-in photographs, no reveal on load. `sloplint --scope app` skips their gates (1, 6, 8, 9, 32, 42, 44, 46b, 58, 59, 66, 68, 77 to 79, 81 to 83 and 85, and F8, F15 and F20) and reads control heights on the app range. Everything else binds, the Floor first: tokens, contrast, focus, states, no eyebrow, no tracked-caps label on a table head, no invented figure. What takes their place: -- **The theme lends its palette, its faces, its radius and its surfaces,** never its layout, navigation or ornament. One family is often right, and a familiar sans or a system face is allowed here; the type scale is fixed, at a ratio of 1.125 to 1.2, with no fluid heads and no display face on labels, buttons or data (`theme.mjs scaffold --scope app` writes that scale and a stamp without the page's fields). +- **The theme lends its palette, its faces, its radius and its surfaces,** never its layout, navigation or ornament. One family is often right, and a familiar sans or a system face is allowed here; the type scale is fixed, at a ratio of 1.125 to 1.2, with no fluid heads and no display face on labels, buttons or data (`theme.mjs scaffold --scope app` writes that scale and a stamp without the page's fields). - **Colour is restrained.** The accent marks the primary action, the current selection and state, nothing else; a second neutral carries sidebars, toolbars and panels. - **The shell is the project's own.** A new one is a top bar; a sidebar is earned by more than about seven destinations, never reached for by reflex, and it collapses to a menu under 60rem. Standard patterns (tabs, breadcrumbs, a command palette) beat invented ones, and a modal is the last answer, after inline editing and disclosure. - **Density is the design.** Controls 32 to 40px with a 44px hit target, one container recipe, tables before cards (a table may run wider than any prose measure), and `craft.md` § 9 for controls, inputs, tables and stat rows. diff --git a/plugins/codex/plugins/hallmark/skills/hallmark/scripts/sloplint-render.mjs b/plugins/codex/plugins/hallmark/skills/hallmark/scripts/sloplint-render.mjs index 567ed6a0..10f62daf 100644 --- a/plugins/codex/plugins/hallmark/skills/hallmark/scripts/sloplint-render.mjs +++ b/plugins/codex/plugins/hallmark/skills/hallmark/scripts/sloplint-render.mjs @@ -3,7 +3,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'node:fs'; import { join, dirname, basename, resolve } from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; -const WIDTHS = [320, 375, 414, 768, 1024, 1280, 1920]; +const WIDTHS = [320, 375, 414, 768, 1024, 1280, 1440, 1920]; const CHROMES = ['/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', '/Applications/Chromium.app/Contents/MacOS/Chromium', '/usr/bin/google-chrome', '/usr/bin/google-chrome-stable', '/usr/bin/chromium', '/usr/bin/chromium-browser', '/snap/bin/chromium', 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe']; const isUrl = (t) => /^https?:\/\//.test(t); const slugOf = (t) => isUrl(t) ? t.replace(/^https?:\/\//, '').replace(/[^\w.-]+/g, '-').replace(/-+$/, '') : basename(t, '.html'); diff --git a/plugins/codex/plugins/hallmark/skills/hallmark/scripts/theme.mjs b/plugins/codex/plugins/hallmark/skills/hallmark/scripts/theme.mjs index b5624cee..05bdaa7e 100644 --- a/plugins/codex/plugins/hallmark/skills/hallmark/scripts/theme.mjs +++ b/plugins/codex/plugins/hallmark/skills/hallmark/scripts/theme.mjs @@ -13,7 +13,7 @@ const args = process.argv.slice(2); const cmd = args[0]; const flag = (k, d = null) => { const i = args.indexOf('--' + k); const v = i >= 0 ? args[i + 1] : undefined; return v !== undefined && !String(v).startsWith('--') ? v : d; }; const has = (k) => args.includes('--' + k); -const VALUED = new Set(['genre', 'prompt', 'brief', 'log', 'n', 'reroll', 'dealt', 'dir', 'axes', 'face', 'hue', 'entry', 'redesign', 'theme', 'orient', 'save', 'avoid', 'material', 'seed', 'job']); +const VALUED = new Set(['genre', 'prompt', 'brief', 'log', 'n', 'reroll', 'dealt', 'dir', 'axes', 'face', 'hue', 'entry', 'redesign', 'scope', 'theme', 'orient', 'save', 'avoid', 'material', 'seed', 'job']); const positional = () => { const out = []; for (let i = 1; i < args.length; i++) { const a = args[i]; if (a.startsWith('--')) { if (VALUED.has(a.slice(2))) i++; continue; } out.push(a); } return out; }; const GENRES = ['editorial', 'modern-minimal', 'atmospheric', 'playful']; // A theme slug names a file in references/themes, so it is a plain name, never a path. @@ -193,7 +193,10 @@ function draw() { const near = (opts, n, k, extra = []) => { const bad = new Set([...recent(k, n), ...extra]); const ok = opts.filter((o) => ![...bad].some((b) => b && b.includes(low(o)))); return ok.length ? ok : opts; }; const take = (opts, m = 1) => { const pool = [...new Set(opts)]; const out = []; while (out.length < m && pool.length) out.push(pool.splice(Math.floor(rand() * pool.length), 1)[0]); return out; }; const shapes = take(near(DRAW.shapes[material], 3, 'shape', pictured), 1); - const jobName = low(flag('job', '')).replace(/download|app/, 'try').replace(/software|saas/, 'sign up').replace(/newsletter|waitlist/, 'subscribe').replace(/watch|read/, 'listen'); + // Synonyms match the whole job: "app" is try, "application" is not. + const JOB_SYNONYMS = { download: 'try', app: 'try', software: 'sign up', saas: 'sign up', newsletter: 'subscribe', waitlist: 'subscribe', watch: 'listen', read: 'listen' }; + const rawJob = low(flag('job', '')).trim(); + const jobName = JOB_SYNONYMS[rawJob] || rawJob; const job = DRAW.jobs[jobName] || null; const [hero] = take(near(job ? [...job.heroes, ...job.heroes, ...DRAW.heroes[material].filter((h) => !/settled|stage/i.test(h) || job.heroes.includes(h))] : DRAW.heroes[material], 1, 'hero', pictured)); const [nav] = take(near(DRAW.navs, 3, 'nav')); @@ -209,7 +212,8 @@ function draw() { console.log(`draw ${seed} (fresh each build; --seed ${seed} repeats it)${pictured.length ? ` · clear of the theme picture's ${pictured.join(' and ')}` : ''}`); console.log(`shape: ${shapes[0]} · hero: ${hero} · nav: ${nav} · footer: ${footer}`); console.log(`${job ? '' : `first section after the hero: ${opener} · `}leave out this time: ${skip.join(' and ')} · the hero leads with ${lead}, if the prompt has it`); - console.log(job ? `job: ${jobName} · the action: ${action}\nbuild these, in the order the shape suits (the first right after the hero): ${native.join('; ')} · close on: ${close} (anatomy.md § ${jobName})` : 'no --job given: name the page\'s job (subscribe, book, visit, attend, buy, try, sign up, hire, join, listen) and draw again with --job'); + const jobs = 'subscribe, book, visit, attend, buy, try, sign up, hire, join, listen'; + console.log(job ? `job: ${jobName} · the action: ${action}\nbuild these, in the order the shape suits (the first right after the hero): ${native.join('; ')} · close on: ${close} (anatomy.md § ${jobName})` : rawJob ? `unknown --job "${rawJob}": name the page's job (${jobs}) and draw again with --job` : `no --job given: name the page's job (${jobs}) and draw again with --job`); console.log(`photos: pass --seed ${seed} to every theme.mjs photos call, so this build's picks are its own, and take its first fitting pick for the hero rather than hunting for the library's single best frame`); console.log('take the draw unless the prompt\'s material refuses a pick; name any swap in the Picks block, and stamp draw: ' + seed); } diff --git a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json index d69070b2..8c62cbac 100644 --- a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json +++ b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json @@ -3,5 +3,5 @@ "name": "playwright浏览器自动化操作", "version": "20260605", "keySource": "none", - "syncedAt": "2026-11-04T09:28:42Z" + "syncedAt": "2026-11-04T16:03:15Z" } diff --git a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json index 44972c20..764ba5f1 100644 --- a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "next-skills", "repo": "https://github.com/vercel/next.js.git", "ref": "canary", - "commit": "cc65c414d283e22e587828c94770d9b12522bbb4", + "commit": "d2defa02a2887f94b99a573cf17efbef112218fd", "adapter": "skill-collection", "sourcePath": "skills", - "syncedAt": "2026-11-04T09:24:25Z" + "syncedAt": "2026-11-04T16:00:00Z" } diff --git a/plugins/codex/plugins/next-skills/skills/next-dev-loop/SKILL.md b/plugins/codex/plugins/next-skills/skills/next-dev-loop/SKILL.md index 1d758d53..0b1874dd 100644 --- a/plugins/codex/plugins/next-skills/skills/next-dev-loop/SKILL.md +++ b/plugins/codex/plugins/next-skills/skills/next-dev-loop/SKILL.md @@ -117,7 +117,8 @@ Four failure modes. Check each: enabled exposes the component tree, props, state, and render counts. Anchor framework-level checks here (extra renders, server/client boundary shifts, suspense fallbacks) — DOM asserts - alone miss them. + alone miss them. Use `agent-browser react tree --json` to get the tree + rather than a bare acknowledgement. Pick the specific tool from `tools/list` or the agent-browser manual rather than from memory. @@ -128,6 +129,9 @@ manual rather than from memory. deleting it disconnects the server from its generated state and discards incremental caches. Moving it to a backup is still a reset. If a production build needs isolated output, configure a separate `distDir`. +- Before running production tests, give their app and API servers ports + distinct from dev, or stop dev first. Otherwise readiness checks may + reach the wrong server. - **Every `agent-browser` command must know your session and restore key, or it may use an empty default browser or fail to save login state.** Easiest: export both `AGENT_BROWSER_SESSION="$SESSION"` and @@ -144,6 +148,7 @@ manual rather than from memory. snapshot/read to confirm the page. Avoid `wait --url` unless you pass the link's exact href — a guessed or placeholder path won't match the real URL and times out after 25s. +- After a locator timeout, check the URL and a fresh snapshot before retrying. - A blank read, empty snapshot, `about:blank`, or a "no browser session" error — right after `open` or after a click (even if `open` reported the page) — is the browser dropping the page (a stale diff --git a/plugins/codex/plugins/ui-ux-pro-max/README.md b/plugins/codex/plugins/ui-ux-pro-max/README.md index de6da11a..04581ab3 100755 --- a/plugins/codex/plugins/ui-ux-pro-max/README.md +++ b/plugins/codex/plugins/ui-ux-pro-max/README.md @@ -7,7 +7,8 @@ 🇰🇷 한국어 | 🇻🇳 Tiếng Việt | 🇨🇳 简体中文 | - 🇺🇸 English + 🇺🇸 English | + 🇮🇷 فارسی

diff --git a/plugins/codex/plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json index 1c1e9cf1..917965d9 100644 --- a/plugins/codex/plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "ui-ux-pro-max", "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", "ref": "main", - "commit": "dd9a1b4cf9f67ca2e326f646d93e101b2778db30", + "commit": "ccce51cba388476d4f403091ddb91636d5cd9fed", "adapter": "claude-skill", "sourcePath": ".claude/skills/ui-ux-pro-max", - "syncedAt": "2026-11-04T09:24:25Z" + "syncedAt": "2026-11-04T16:00:00Z" }