Merge origin/main into release/v0.8.0

This commit is contained in:
lefarcen 2026-05-21 15:09:38 +08:00
commit 0939987231
4 changed files with 124 additions and 42 deletions

View file

@ -1964,6 +1964,8 @@
color: var(--text-faint); color: var(--text-faint);
} }
.entry-star-badge__count { .entry-star-badge__count {
display: inline-block;
min-width: 5ch;
color: var(--text); color: var(--text);
font-variant-numeric: tabular-nums; font-variant-numeric: tabular-nums;
transition: opacity 160ms ease; transition: opacity 160ms ease;

View file

@ -26,7 +26,7 @@
}, },
"https://open-design.ai/blog/byok-reality-check-5-things-that-break/": { "https://open-design.ai/blog/byok-reality-check-5-things-that-break/": {
"url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/", "url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/",
"inspectedAt": "2026-05-19T10:11:55.870Z", "inspectedAt": "2026-05-21T03:04:29.361Z",
"result": { "result": {
"verdict": "NEUTRAL", "verdict": "NEUTRAL",
"coverageState": "Discovered - currently not indexed", "coverageState": "Discovered - currently not indexed",
@ -38,7 +38,7 @@
}, },
"https://open-design.ai/blog/layout-layer-canvas-used-to-hide/": { "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/": {
"url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/", "url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
"inspectedAt": "2026-05-19T10:12:02.175Z", "inspectedAt": "2026-05-21T03:04:16.961Z",
"result": { "result": {
"verdict": "PASS", "verdict": "PASS",
"coverageState": "Submitted and indexed", "coverageState": "Submitted and indexed",
@ -53,7 +53,7 @@
}, },
"https://open-design.ai/blog/open-source-alternative-to-claude-design/": { "https://open-design.ai/blog/open-source-alternative-to-claude-design/": {
"url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/", "url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
"inspectedAt": "2026-05-19T10:12:08.472Z", "inspectedAt": "2026-05-21T03:04:35.481Z",
"result": { "result": {
"verdict": "PASS", "verdict": "PASS",
"coverageState": "Submitted and indexed", "coverageState": "Submitted and indexed",
@ -68,7 +68,7 @@
}, },
"https://open-design.ai/blog/port-figma-workflow-open-design-plugin/": { "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/": {
"url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/", "url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
"inspectedAt": "2026-05-19T10:12:14.760Z", "inspectedAt": "2026-05-21T03:04:23.233Z",
"result": { "result": {
"verdict": "PASS", "verdict": "PASS",
"coverageState": "Submitted and indexed", "coverageState": "Submitted and indexed",
@ -95,6 +95,63 @@
} }
}, },
"history": [ "history": [
{
"url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
"inspectedAt": "2026-05-21T03:04:35.481Z",
"result": {
"verdict": "PASS",
"coverageState": "Submitted and indexed",
"pageFetchState": "SUCCESSFUL",
"indexingState": "INDEXING_ALLOWED",
"lastCrawlTime": "2026-05-15T12:22:17Z",
"googleCanonical": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
"userCanonical": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
"robotsTxtState": "ALLOWED",
"isIndexed": true
}
},
{
"url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/",
"inspectedAt": "2026-05-21T03:04:29.361Z",
"result": {
"verdict": "NEUTRAL",
"coverageState": "Discovered - currently not indexed",
"pageFetchState": "PAGE_FETCH_STATE_UNSPECIFIED",
"indexingState": "INDEXING_STATE_UNSPECIFIED",
"robotsTxtState": "ROBOTS_TXT_STATE_UNSPECIFIED",
"isIndexed": false
}
},
{
"url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
"inspectedAt": "2026-05-21T03:04:23.233Z",
"result": {
"verdict": "PASS",
"coverageState": "Submitted and indexed",
"pageFetchState": "SUCCESSFUL",
"indexingState": "INDEXING_ALLOWED",
"lastCrawlTime": "2026-05-19T09:20:41Z",
"googleCanonical": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
"userCanonical": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
"robotsTxtState": "ALLOWED",
"isIndexed": true
}
},
{
"url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
"inspectedAt": "2026-05-21T03:04:16.961Z",
"result": {
"verdict": "PASS",
"coverageState": "Submitted and indexed",
"pageFetchState": "SUCCESSFUL",
"indexingState": "INDEXING_ALLOWED",
"lastCrawlTime": "2026-05-19T09:20:42Z",
"googleCanonical": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
"userCanonical": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
"robotsTxtState": "ALLOWED",
"isIndexed": true
}
},
{ {
"url": "https://open-design.ai/blog/why-we-built-open-design-as-a-skill-layer/", "url": "https://open-design.ai/blog/why-we-built-open-design-as-a-skill-layer/",
"inspectedAt": "2026-05-20T03:04:04.911Z", "inspectedAt": "2026-05-20T03:04:04.911Z",
@ -277,10 +334,10 @@
"https://open-design.ai/blog/byok-reality-check-5-things-that-break/": { "https://open-design.ai/blog/byok-reality-check-5-things-that-break/": {
"7": { "7": {
"url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/", "url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/",
"queriedAt": "2026-05-19T10:12:28.984Z", "queriedAt": "2026-05-21T03:04:42.848Z",
"windowDays": 7, "windowDays": 7,
"startDate": "2026-05-11", "startDate": "2026-05-13",
"endDate": "2026-05-17", "endDate": "2026-05-19",
"clicks": 0, "clicks": 0,
"impressions": 0, "impressions": 0,
"ctr": 0, "ctr": 0,
@ -288,10 +345,10 @@
}, },
"28": { "28": {
"url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/", "url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/",
"queriedAt": "2026-05-19T10:12:29.090Z", "queriedAt": "2026-05-21T03:04:42.929Z",
"windowDays": 28, "windowDays": 28,
"startDate": "2026-04-20", "startDate": "2026-04-22",
"endDate": "2026-05-17", "endDate": "2026-05-19",
"clicks": 0, "clicks": 0,
"impressions": 0, "impressions": 0,
"ctr": 0, "ctr": 0,
@ -301,10 +358,10 @@
"https://open-design.ai/blog/layout-layer-canvas-used-to-hide/": { "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/": {
"7": { "7": {
"url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/", "url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
"queriedAt": "2026-05-19T10:12:29.196Z", "queriedAt": "2026-05-21T03:04:42.455Z",
"windowDays": 7, "windowDays": 7,
"startDate": "2026-05-11", "startDate": "2026-05-13",
"endDate": "2026-05-17", "endDate": "2026-05-19",
"clicks": 0, "clicks": 0,
"impressions": 0, "impressions": 0,
"ctr": 0, "ctr": 0,
@ -312,10 +369,10 @@
}, },
"28": { "28": {
"url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/", "url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
"queriedAt": "2026-05-19T10:12:29.334Z", "queriedAt": "2026-05-21T03:04:42.571Z",
"windowDays": 28, "windowDays": 28,
"startDate": "2026-04-20", "startDate": "2026-04-22",
"endDate": "2026-05-17", "endDate": "2026-05-19",
"clicks": 0, "clicks": 0,
"impressions": 0, "impressions": 0,
"ctr": 0, "ctr": 0,
@ -325,34 +382,34 @@
"https://open-design.ai/blog/open-source-alternative-to-claude-design/": { "https://open-design.ai/blog/open-source-alternative-to-claude-design/": {
"7": { "7": {
"url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/", "url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
"queriedAt": "2026-05-19T10:12:29.443Z", "queriedAt": "2026-05-21T03:04:43.015Z",
"windowDays": 7, "windowDays": 7,
"startDate": "2026-05-11", "startDate": "2026-05-13",
"endDate": "2026-05-17", "endDate": "2026-05-19",
"clicks": 1, "clicks": 4,
"impressions": 50, "impressions": 107,
"ctr": 0.02, "ctr": 0.037383177570093455,
"position": 8.86 "position": 7.94392523364486
}, },
"28": { "28": {
"url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/", "url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
"queriedAt": "2026-05-19T10:12:29.568Z", "queriedAt": "2026-05-21T03:04:43.089Z",
"windowDays": 28, "windowDays": 28,
"startDate": "2026-04-20", "startDate": "2026-04-22",
"endDate": "2026-05-17", "endDate": "2026-05-19",
"clicks": 1, "clicks": 4,
"impressions": 50, "impressions": 107,
"ctr": 0.02, "ctr": 0.037383177570093455,
"position": 8.86 "position": 7.94392523364486
} }
}, },
"https://open-design.ai/blog/port-figma-workflow-open-design-plugin/": { "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/": {
"7": { "7": {
"url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/", "url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
"queriedAt": "2026-05-19T10:12:29.818Z", "queriedAt": "2026-05-21T03:04:42.666Z",
"windowDays": 7, "windowDays": 7,
"startDate": "2026-05-11", "startDate": "2026-05-13",
"endDate": "2026-05-17", "endDate": "2026-05-19",
"clicks": 0, "clicks": 0,
"impressions": 0, "impressions": 0,
"ctr": 0, "ctr": 0,
@ -360,10 +417,10 @@
}, },
"28": { "28": {
"url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/", "url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
"queriedAt": "2026-05-19T10:12:29.947Z", "queriedAt": "2026-05-21T03:04:42.755Z",
"windowDays": 28, "windowDays": 28,
"startDate": "2026-04-20", "startDate": "2026-04-22",
"endDate": "2026-05-17", "endDate": "2026-05-19",
"clicks": 0, "clicks": 0,
"impressions": 0, "impressions": 0,
"ctr": 0, "ctr": 0,

View file

@ -29,16 +29,20 @@ the full architecture.
|---|---|---|---|---|---|---|---|---| |---|---|---|---|---|---|---|---|---|
| 31-skills-72-systems-how-the-library-works | neutral | Discovered - currently not indexed | — | 2026-05-20 | 0 | 0 | 0.0% | — | | 31-skills-72-systems-how-the-library-works | neutral | Discovered - currently not indexed | — | 2026-05-20 | 0 | 0 | 0.0% | — |
| byok-design-workflow-claude-codex-qwen | neutral | Discovered - currently not indexed | — | 2026-05-20 | 0 | 0 | 0.0% | — | | byok-design-workflow-claude-codex-qwen | neutral | Discovered - currently not indexed | — | 2026-05-20 | 0 | 0 | 0.0% | — |
| byok-reality-check-5-things-that-break | neutral | Discovered - currently not indexed | — | 2026-05-19 | 0 | 0 | 0.0% | — | | byok-reality-check-5-things-that-break | neutral | Discovered - currently not indexed | — | 2026-05-21 | 0 | 0 | 0.0% | — |
| layout-layer-canvas-used-to-hide | indexed | Submitted and indexed | 2026-05-19 | 2026-05-19 | 0 | 0 | 0.0% | — | | layout-layer-canvas-used-to-hide | indexed | Submitted and indexed | 2026-05-19 | 2026-05-21 | 0 | 0 | 0.0% | — |
| open-source-alternative-to-claude-design | indexed | Submitted and indexed | 2026-05-15 | 2026-05-19 | 50 | 1 | 2.0% | 8.9 | | open-source-alternative-to-claude-design | indexed | Submitted and indexed | 2026-05-15 | 2026-05-21 | 107 | 4 | 3.7% | 7.9 |
| port-figma-workflow-open-design-plugin | indexed | Submitted and indexed | 2026-05-19 | 2026-05-19 | 0 | 0 | 0.0% | — | | port-figma-workflow-open-design-plugin | indexed | Submitted and indexed | 2026-05-19 | 2026-05-21 | 0 | 0 | 0.0% | — |
| why-we-built-open-design-as-a-skill-layer | neutral | Discovered - currently not indexed | — | 2026-05-20 | 0 | 0 | 0.0% | — | | why-we-built-open-design-as-a-skill-layer | neutral | Discovered - currently not indexed | — | 2026-05-20 | 0 | 0 | 0.0% | — |
## Recent inspections ## Recent inspections
| Inspected | Slug | Verdict | Coverage state | Canonical | | Inspected | Slug | Verdict | Coverage state | Canonical |
|---|---|---|---|---| |---|---|---|---|---|
| 2026-05-21 | open-source-alternative-to-claude-design | indexed | Submitted and indexed | https://open-design.ai/blog/open-source-alternative-to-claude-design/ |
| 2026-05-21 | byok-reality-check-5-things-that-break | neutral | Discovered - currently not indexed | — |
| 2026-05-21 | port-figma-workflow-open-design-plugin | indexed | Submitted and indexed | https://open-design.ai/blog/port-figma-workflow-open-design-plugin/ |
| 2026-05-21 | layout-layer-canvas-used-to-hide | indexed | Submitted and indexed | https://open-design.ai/blog/layout-layer-canvas-used-to-hide/ |
| 2026-05-20 | why-we-built-open-design-as-a-skill-layer | neutral | Discovered - currently not indexed | — | | 2026-05-20 | why-we-built-open-design-as-a-skill-layer | neutral | Discovered - currently not indexed | — |
| 2026-05-20 | byok-design-workflow-claude-codex-qwen | neutral | Discovered - currently not indexed | — | | 2026-05-20 | byok-design-workflow-claude-codex-qwen | neutral | Discovered - currently not indexed | — |
| 2026-05-20 | 31-skills-72-systems-how-the-library-works | neutral | Discovered - currently not indexed | — | | 2026-05-20 | 31-skills-72-systems-how-the-library-works | neutral | Discovered - currently not indexed | — |

View file

@ -4,7 +4,11 @@ import { mkdir } from 'node:fs/promises';
import path from 'node:path'; import path from 'node:path';
const STORAGE_KEY = 'open-design:config'; const STORAGE_KEY = 'open-design:config';
const GITHUB_STARS_STORAGE_KEY = 'open-design:gh-stars';
const VISUAL_STYLE_ID = 'od-visual-stability-style'; const VISUAL_STYLE_ID = 'od-visual-stability-style';
// Keep this exact-route mock narrow so unrelated GitHub UI still behaves normally.
const VISUAL_GITHUB_REPO_API = 'https://api.github.com/repos/nexu-io/open-design';
const VISUAL_GITHUB_STARS = 40_000;
const VISUAL_CONFIG = { const VISUAL_CONFIG = {
mode: 'daemon', mode: 'daemon',
@ -129,9 +133,13 @@ const VISUAL_DESIGN_SYSTEMS = [
export async function configureVisualPage(page: Page, options: VisualPageOptions = {}): Promise<void> { export async function configureVisualPage(page: Page, options: VisualPageOptions = {}): Promise<void> {
const projects = options.projects ?? VISUAL_PROJECTS; const projects = options.projects ?? VISUAL_PROJECTS;
await page.addInitScript(([key, config]) => { await page.addInitScript(([key, config, githubStarsKey, githubStarsCount]) => {
window.localStorage.setItem(key, JSON.stringify(config)); window.localStorage.setItem(key, JSON.stringify(config));
}, [STORAGE_KEY, VISUAL_CONFIG] as const); window.localStorage.setItem(
githubStarsKey,
JSON.stringify({ count: githubStarsCount, ts: Date.now() }),
);
}, [STORAGE_KEY, VISUAL_CONFIG, GITHUB_STARS_STORAGE_KEY, VISUAL_GITHUB_STARS] as const);
await page.route('**/api/app-config', async (route) => { await page.route('**/api/app-config', async (route) => {
await fulfillGet(route, { config: VISUAL_CONFIG }); await fulfillGet(route, { config: VISUAL_CONFIG });
@ -141,6 +149,17 @@ export async function configureVisualPage(page: Page, options: VisualPageOptions
await fulfillGet(route, { agents: [MOCK_AGENT] }); await fulfillGet(route, { agents: [MOCK_AGENT] });
}); });
await page.route(VISUAL_GITHUB_REPO_API, async (route) => {
if (route.request().method() !== 'GET') {
await route.continue();
return;
}
await route.fulfill({
json: { stargazers_count: VISUAL_GITHUB_STARS },
});
});
await page.route('**/api/projects', async (route) => { await page.route('**/api/projects', async (route) => {
await fulfillGet(route, { projects }); await fulfillGet(route, { projects });
}); });