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);
}
.entry-star-badge__count {
display: inline-block;
min-width: 5ch;
color: var(--text);
font-variant-numeric: tabular-nums;
transition: opacity 160ms ease;

View file

@ -26,7 +26,7 @@
},
"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": {
"verdict": "NEUTRAL",
"coverageState": "Discovered - currently not indexed",
@ -38,7 +38,7 @@
},
"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": {
"verdict": "PASS",
"coverageState": "Submitted and indexed",
@ -53,7 +53,7 @@
},
"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": {
"verdict": "PASS",
"coverageState": "Submitted and indexed",
@ -68,7 +68,7 @@
},
"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": {
"verdict": "PASS",
"coverageState": "Submitted and indexed",
@ -95,6 +95,63 @@
}
},
"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/",
"inspectedAt": "2026-05-20T03:04:04.911Z",
@ -277,10 +334,10 @@
"https://open-design.ai/blog/byok-reality-check-5-things-that-break/": {
"7": {
"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,
"startDate": "2026-05-11",
"endDate": "2026-05-17",
"startDate": "2026-05-13",
"endDate": "2026-05-19",
"clicks": 0,
"impressions": 0,
"ctr": 0,
@ -288,10 +345,10 @@
},
"28": {
"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,
"startDate": "2026-04-20",
"endDate": "2026-05-17",
"startDate": "2026-04-22",
"endDate": "2026-05-19",
"clicks": 0,
"impressions": 0,
"ctr": 0,
@ -301,10 +358,10 @@
"https://open-design.ai/blog/layout-layer-canvas-used-to-hide/": {
"7": {
"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,
"startDate": "2026-05-11",
"endDate": "2026-05-17",
"startDate": "2026-05-13",
"endDate": "2026-05-19",
"clicks": 0,
"impressions": 0,
"ctr": 0,
@ -312,10 +369,10 @@
},
"28": {
"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,
"startDate": "2026-04-20",
"endDate": "2026-05-17",
"startDate": "2026-04-22",
"endDate": "2026-05-19",
"clicks": 0,
"impressions": 0,
"ctr": 0,
@ -325,34 +382,34 @@
"https://open-design.ai/blog/open-source-alternative-to-claude-design/": {
"7": {
"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,
"startDate": "2026-05-11",
"endDate": "2026-05-17",
"clicks": 1,
"impressions": 50,
"ctr": 0.02,
"position": 8.86
"startDate": "2026-05-13",
"endDate": "2026-05-19",
"clicks": 4,
"impressions": 107,
"ctr": 0.037383177570093455,
"position": 7.94392523364486
},
"28": {
"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,
"startDate": "2026-04-20",
"endDate": "2026-05-17",
"clicks": 1,
"impressions": 50,
"ctr": 0.02,
"position": 8.86
"startDate": "2026-04-22",
"endDate": "2026-05-19",
"clicks": 4,
"impressions": 107,
"ctr": 0.037383177570093455,
"position": 7.94392523364486
}
},
"https://open-design.ai/blog/port-figma-workflow-open-design-plugin/": {
"7": {
"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,
"startDate": "2026-05-11",
"endDate": "2026-05-17",
"startDate": "2026-05-13",
"endDate": "2026-05-19",
"clicks": 0,
"impressions": 0,
"ctr": 0,
@ -360,10 +417,10 @@
},
"28": {
"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,
"startDate": "2026-04-20",
"endDate": "2026-05-17",
"startDate": "2026-04-22",
"endDate": "2026-05-19",
"clicks": 0,
"impressions": 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% | — |
| 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% | — |
| layout-layer-canvas-used-to-hide | indexed | Submitted and indexed | 2026-05-19 | 2026-05-19 | 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 |
| port-figma-workflow-open-design-plugin | indexed | Submitted and indexed | 2026-05-19 | 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-21 | 0 | 0 | 0.0% | — |
| 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-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% | — |
## Recent inspections
| 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 | 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 | — |

View file

@ -4,7 +4,11 @@ import { mkdir } from 'node:fs/promises';
import path from 'node:path';
const STORAGE_KEY = 'open-design:config';
const GITHUB_STARS_STORAGE_KEY = 'open-design:gh-stars';
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 = {
mode: 'daemon',
@ -129,9 +133,13 @@ const VISUAL_DESIGN_SYSTEMS = [
export async function configureVisualPage(page: Page, options: VisualPageOptions = {}): Promise<void> {
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));
}, [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 fulfillGet(route, { config: VISUAL_CONFIG });
@ -141,6 +149,17 @@ export async function configureVisualPage(page: Page, options: VisualPageOptions
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 fulfillGet(route, { projects });
});