From 8dc733ef7c19916e9b3c027cf51446dda55d94cc Mon Sep 17 00:00:00 2001 From: Sin-Kang Date: Sun, 30 Aug 2026 14:47:39 +0900 Subject: [PATCH 1/3] chore: ignore local worktrees --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e458ed5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.worktrees/ From 7cd1bc1d5b8ce880aefac0f26f66767f93a9721c Mon Sep 17 00:00:00 2001 From: Sin-Kang Date: Sun, 6 Sep 2026 16:55:49 +0900 Subject: [PATCH 2/3] fix(seo): identify Korean DevsLab brand on open source hub --- index.html | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/index.html b/index.html index 9202779..7c8fc09 100644 --- a/index.html +++ b/index.html @@ -3,27 +3,51 @@ - devslab 오픈소스 — 라이브 데모 허브 + 데브스랩(DevsLab) 오픈소스 — 라이브 데모 허브 - + - + - + + + @@ -331,12 +355,12 @@

// open-source

- devslab 오픈소스 + 데브스랩(DevsLab) 오픈소스
라이브 데모 허브

- 저희 SaaS 프로덕션에서 먼저 검증하고 커뮤니티에 공개하는 + 데브스랩(DevsLab)의 SaaS 프로덕션에서 먼저 검증하고 커뮤니티에 공개하는 라이브러리들입니다. 라이브 데모와 문서, 설치 링크를 한곳에 모았습니다.

@@ -497,7 +521,7 @@

devslab-examples

@@ -558,7 +535,11 @@

devslab-examples

Open source by DevsLab
diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..72d47a9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,118 @@ +{ + "name": "devslab-oss-demo-hub", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "devslab-oss-demo-hub", + "devDependencies": { + "@devslab/site-kit": "0.8.0" + } + }, + "node_modules/@devslab/dds-css": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@devslab/dds-css/-/dds-css-0.8.0.tgz", + "integrity": "sha512-PxibTv92uMzU3rKtOesFUOSR5x3RWp3JHoO9LBidlqwFOjg37+Wd/Y7prLA8mw7USJ1FnF/R5Q4xHDJHk3iCAQ==", + "dev": true, + "license": "SEE LICENSE IN LICENSE" + }, + "node_modules/@devslab/dds-icons": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@devslab/dds-icons/-/dds-icons-0.8.0.tgz", + "integrity": "sha512-kspidNuH1A1E9euuVYlsw5D+vLsPZf01+lGShyB186ru7UEsLkz3epdNH9ry+OPx4lloGYzigyyqq1jwBK8Ofg==", + "dev": true, + "license": "SEE LICENSE IN LICENSE" + }, + "node_modules/@devslab/dds-solid": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@devslab/dds-solid/-/dds-solid-0.8.0.tgz", + "integrity": "sha512-Q05I3QeiaIJga1ixgw+usw3U9Oc4V8tps8mv/Jylu1B0uip4IiAILIM2sePaeJe/ciGfRTxJRsAtprqfyk9I/w==", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "@devslab/dds-css": "0.8.0", + "@devslab/dds-icons": "0.8.0", + "@devslab/dds-tokens": "0.8.0" + }, + "peerDependencies": { + "solid-js": "1.9.15" + } + }, + "node_modules/@devslab/dds-tokens": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@devslab/dds-tokens/-/dds-tokens-0.8.0.tgz", + "integrity": "sha512-lI/K50/jbKFWjlnTIBce23xry7JbJ1Io461VwUjpLvTAxTrZ5vee9ybosSMSTIs/BDWQidt6V80ghZxsGjX5yg==", + "dev": true, + "license": "SEE LICENSE IN LICENSE" + }, + "node_modules/@devslab/site-kit": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@devslab/site-kit/-/site-kit-0.8.0.tgz", + "integrity": "sha512-m2J6/GH7zid3db+BhoN/2GGUg4tlOsDamXBLFjJg+r8JqDgUv5QyocM5tPgqhW6G/jwKIxS0cZo8RcJJAvU7gQ==", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "@devslab/dds-solid": "0.8.0" + }, + "peerDependencies": { + "@tanstack/solid-router": "1.170.30", + "@tanstack/solid-start": "1.168.47", + "solid-js": "1.9.15" + }, + "peerDependenciesMeta": { + "@tanstack/solid-router": { + "optional": true + }, + "@tanstack/solid-start": { + "optional": true + } + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/seroval": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.6.tgz", + "integrity": "sha512-rVQVWjjSvlINzaQPZH5JFqsqEsIWdTxY3iJZCnTL/5gQbXIRooVZKI60tVCkOVfzcRPejboxO2t0P89dg5mQaA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/seroval-plugins": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.6.tgz", + "integrity": "sha512-HXuLAX2pu/UByPpaeo/TaMfvMIi+1QqIoPJYCcAtU8QkVNwgR6MPlGuCQTErV1JwraaMbYaWVIBX7mppzGLATQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "seroval": "^1.0" + } + }, + "node_modules/solid-js": { + "version": "1.9.15", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.15.tgz", + "integrity": "sha512-EeiY2xfpZJqPLjXspVEKjAII4yv8NyG//NxZ3IpOFHdUNnnTyL0uJOeS9LWGvA7cFCz5y94cjFwYlmw5Luncsg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.1.0", + "seroval": "~1.5.4", + "seroval-plugins": "~1.5.4" + } + } + } +} diff --git a/package.json b/package.json index d87d234..950a3d7 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,11 @@ "scripts": { "generate:brand-manifest": "node scripts/generate-oss-brand-manifest.mjs", "sync:brand": "node scripts/sync-oss-brand.mjs", - "test": "node --test tests/*.test.mjs", - "serve": "node scripts/serve.mjs" + "test": "node scripts/build-publisher.mjs --check && node --test tests/*.test.mjs", + "serve": "node scripts/serve.mjs", + "build:publisher": "node scripts/build-publisher.mjs" + }, + "devDependencies": { + "@devslab/site-kit": "0.8.0" } } diff --git a/scripts/build-publisher.mjs b/scripts/build-publisher.mjs new file mode 100644 index 0000000..0de3eea --- /dev/null +++ b/scripts/build-publisher.mjs @@ -0,0 +1,23 @@ +import { readFileSync, writeFileSync } from 'node:fs'; +import { buildPublisher, renderPublisherHtml, serializeJsonLd } from '@devslab/site-kit'; +import { DEVSLAB_PUBLISHER } from '@devslab/site-kit/devslab'; + +const target = new URL('../index.html', import.meta.url); +const publisher = buildPublisher(DEVSLAB_PUBLISHER); +const website = { + '@context': 'https://schema.org', + '@type': 'WebSite', + '@id': 'https://devslab-kr.github.io/#website', + name: '데브스랩 오픈소스', + alternateName: ['DevsLab Open Source', 'devslab open source'], + url: 'https://devslab-kr.github.io/', + publisher: publisher.reference, +}; +const block = `\n${renderPublisherHtml(DEVSLAB_PUBLISHER)}\n\n`; +const source = readFileSync(target, 'utf8'); +const marker = /[\s\S]*?/g; +if ([...source.matchAll(marker)].length !== 1) throw new Error('Expected exactly one publisher block'); +const output = source.replace(marker, block); +if (process.argv.includes('--check')) { + if (source.replaceAll('\r\n', '\n') !== output.replaceAll('\r\n', '\n')) throw new Error('Run npm run build:publisher to refresh site-kit attribution'); +} else writeFileSync(target, output);