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.
This commit is contained in:
KeyInfo Bot committed 2026-11-05 00:03:16 +08:00
1 parent d8b11a58ac
commit 6092258537
10 files changed
+31 -21

No files matched your search

+6 -6
View File
@@ -24,8 +24,8 @@
"repo": "https://github.com/Nutlope/hallmark.git", "repo": "https://github.com/Nutlope/hallmark.git",
"ref": "main", "ref": "main",
"adapter": "claude-skill", "adapter": "claude-skill",
"commit": "52328cb3129135499e4e178d4864ee90029dea2b", "commit": "de4999e0cd7a7a41df0b4e6903fa02fe9f1492a8",
"syncedAt": "2026-11-03T16:00:00Z" "syncedAt": "2026-11-04T16:00:00Z"
}, },
{ {
"id": "docx", "id": "docx",
@@ -132,8 +132,8 @@
"repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git",
"ref": "main", "ref": "main",
"adapter": "claude-skill", "adapter": "claude-skill",
"commit": "dd9a1b4cf9f67ca2e326f646d93e101b2778db30", "commit": "ccce51cba388476d4f403091ddb91636d5cd9fed",
"syncedAt": "2026-11-04T09:24:25Z" "syncedAt": "2026-11-04T16:00:00Z"
}, },
{ {
"id": "superpowers-zh", "id": "superpowers-zh",
@@ -285,8 +285,8 @@
"repo": "https://github.com/vercel/next.js.git", "repo": "https://github.com/vercel/next.js.git",
"ref": "canary", "ref": "canary",
"adapter": "skill-collection", "adapter": "skill-collection",
"commit": "cc65c414d283e22e587828c94770d9b12522bbb4", "commit": "d2defa02a2887f94b99a573cf17efbef112218fd",
"syncedAt": "2026-11-04T09:24:25Z" "syncedAt": "2026-11-04T16:00:00Z"
}, },
{ {
"id": "shuorenhua", "id": "shuorenhua",
@@ -2,8 +2,8 @@
"sourceId": "hallmark", "sourceId": "hallmark",
"repo": "https://github.com/Nutlope/hallmark.git", "repo": "https://github.com/Nutlope/hallmark.git",
"ref": "main", "ref": "main",
"commit": "52328cb3129135499e4e178d4864ee90029dea2b", "commit": "de4999e0cd7a7a41df0b4e6903fa02fe9f1492a8",
"adapter": "claude-skill", "adapter": "claude-skill",
"sourcePath": "skills/hallmark", "sourcePath": "skills/hallmark",
"syncedAt": "2026-11-03T16:00:00Z" "syncedAt": "2026-11-04T16:00:00Z"
} }
@@ -48,11 +48,11 @@ Stamp: `/* Hallmark · component: <type> · genre: <genre> · theme: <theme> ·
## App screens ## 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: 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 <slug> --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. - **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. - **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. - **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.
@@ -3,7 +3,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
import { join, dirname, basename, resolve } from 'node:path'; import { join, dirname, basename, resolve } from 'node:path';
import { fileURLToPath, pathToFileURL } from 'node:url'; 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 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 isUrl = (t) => /^https?:\/\//.test(t);
const slugOf = (t) => isUrl(t) ? t.replace(/^https?:\/\//, '').replace(/[^\w.-]+/g, '-').replace(/-+$/, '') : basename(t, '.html'); const slugOf = (t) => isUrl(t) ? t.replace(/^https?:\/\//, '').replace(/[^\w.-]+/g, '-').replace(/-+$/, '') : basename(t, '.html');
@@ -13,7 +13,7 @@ const args = process.argv.slice(2);
const cmd = args[0]; 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 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 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 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']; 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. // 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 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 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 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 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 [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')); 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(`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(`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 ? '' : `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(`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); console.log('take the draw unless the prompt\'s material refuses a pick; name any swap in the Picks block, and stamp draw: ' + seed);
} }
@@ -3,5 +3,5 @@
"name": "playwright浏览器自动化操作", "name": "playwright浏览器自动化操作",
"version": "20260605", "version": "20260605",
"keySource": "none", "keySource": "none",
"syncedAt": "2026-11-04T09:28:42Z" "syncedAt": "2026-11-04T16:03:15Z"
} }
@@ -2,8 +2,8 @@
"sourceId": "next-skills", "sourceId": "next-skills",
"repo": "https://github.com/vercel/next.js.git", "repo": "https://github.com/vercel/next.js.git",
"ref": "canary", "ref": "canary",
"commit": "cc65c414d283e22e587828c94770d9b12522bbb4", "commit": "d2defa02a2887f94b99a573cf17efbef112218fd",
"adapter": "skill-collection", "adapter": "skill-collection",
"sourcePath": "skills", "sourcePath": "skills",
"syncedAt": "2026-11-04T09:24:25Z" "syncedAt": "2026-11-04T16:00:00Z"
} }
@@ -117,7 +117,8 @@ Four failure modes. Check each:
enabled exposes the component tree, props, state, and render enabled exposes the component tree, props, state, and render
counts. Anchor framework-level checks here (extra renders, counts. Anchor framework-level checks here (extra renders,
server/client boundary shifts, suspense fallbacks) — DOM asserts 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 Pick the specific tool from `tools/list` or the agent-browser
manual rather than from memory. 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 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 incremental caches. Moving it to a backup is still a reset. If a production
build needs isolated output, configure a separate `distDir`. 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 - **Every `agent-browser` command must know your session and restore
key, or it may use an empty default browser or fail to save login key, or it may use an empty default browser or fail to save login
state.** Easiest: export both `AGENT_BROWSER_SESSION="$SESSION"` and 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 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 the link's exact href — a guessed or placeholder path won't match the
real URL and times out after 25s. 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 - A blank read, empty snapshot, `about:blank`, or a "no browser
session" error — right after `open` or after a click (even if `open` session" error — right after `open` or after a click (even if `open`
reported the page) — is the browser dropping the page (a stale reported the page) — is the browser dropping the page (a stale
@@ -7,7 +7,8 @@
<a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/main/README.ko.md">🇰🇷 한국어</a> | <a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/main/README.ko.md">🇰🇷 한국어</a> |
<a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/main/README.vi.md">🇻🇳 Tiếng Việt</a> | <a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/main/README.vi.md">🇻🇳 Tiếng Việt</a> |
<a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/main/README.zh.md">🇨🇳 简体中文</a> | <a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/main/README.zh.md">🇨🇳 简体中文</a> |
<a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/main/README.md">🇺🇸 English</a> <a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/main/README.md">🇺🇸 English</a> |
<a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/blob/main/README.fa.md">🇮🇷 فارسی</a>
</p> </p>
<p align="center"> <p align="center">
@@ -2,8 +2,8 @@
"sourceId": "ui-ux-pro-max", "sourceId": "ui-ux-pro-max",
"repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git",
"ref": "main", "ref": "main",
"commit": "dd9a1b4cf9f67ca2e326f646d93e101b2778db30", "commit": "ccce51cba388476d4f403091ddb91636d5cd9fed",
"adapter": "claude-skill", "adapter": "claude-skill",
"sourcePath": ".claude/skills/ui-ux-pro-max", "sourcePath": ".claude/skills/ui-ux-pro-max",
"syncedAt": "2026-11-04T09:24:25Z" "syncedAt": "2026-11-04T16:00:00Z"
} }