diff --git a/CONTRIBUTING.ko.md b/CONTRIBUTING.ko.md
new file mode 100644
index 0000000..1abc18c
--- /dev/null
+++ b/CONTRIBUTING.ko.md
@@ -0,0 +1,52 @@
+# DDS 기여 안내
+
+DDS (DevsLab Design System)는 **source-available이며 오픈소스가 아닙니다**.
+코드는 공개되어 있고 열람·이슈 제보·변경 제안은 환영하지만, 모든 사용은
+[DevsLab Source-Available License 1.0](./LICENSE)을 따릅니다 — 수정·재배포,
+경쟁 디자인 시스템 제작은 허용되지 않습니다.
+
+## 기여 라이선스 귀속
+
+이 저장소에 기여물(풀 리퀘스트, 패치, 이슈 본문 등)을 제출하면 다음에
+동의하는 것으로 간주합니다:
+
+- 제출할 권리가 있는 본인의 작업물(또는 제출을 허락받은 작업물)입니다;
+- DevsLab에 기여물을 Software의 일부로 사용·수정·재라이선스·배포할 수 있는
+ 영구적·전세계적·취소 불가·무상·서브라이선스 가능한 권리를 부여하며,
+ 추가 의무는 없습니다;
+- 기여물은 LICENSE 3조의 피드백 조항과 동일하게 취급되며, 커밋 히스토리
+ 이상의 보상이나 저작자 표시 의무는 발생하지 않습니다.
+
+동의하기 어렵다면 코드 대신 문제를 설명하는 이슈를 열어 주세요.
+
+## 받는 기여
+
+- 버그 리포트와 재현 케이스 — 언제나 환영합니다.
+- 결함 수정(깨진 토큰, 대비 미달, 접근성 문제, 빌드/테스트 문제).
+- 문서 교정 — 영/한 쌍 동기화 유지 포함.
+
+새 컴포넌트·새 토큰·파운데이션(§3) 변경은 DevsLab 제품 필요와 결정 로그가
+주도합니다. 코드를 쓰기 전에 이슈로 먼저 논의해 주세요.
+
+## 기본 규칙 (스펙 요약)
+
+- 토큰이 유일한 진실 — 컴포넌트·예제에 hex/px 하드코딩 금지. 컴포넌트는
+ 시맨틱 토큰만 참조합니다.
+- 라이트가 기본 테마, 다크는 시맨틱 매핑 교체 — `if (dark)` 분기 금지.
+- cyan 면 위 텍스트는 흰색 금지, `zinc.950` 사용.
+- 접근성 최소선: 텍스트 대비 4.5:1, focus-visible 링, 아이콘 단독 버튼
+ 라벨 필수, 모션 감소 설정 존중.
+- 문서는 영/한 쌍(`*.md` + `*.ko.md`) — 양쪽을 함께 수정합니다.
+- 문서 표와 `tokens/*.json`이 어긋나면 같은 변경에서 양쪽을 고칩니다.
+
+## 개발
+
+```bash
+pnpm install --frozen-lockfile
+pnpm run build # 전체 패키지 빌드
+pnpm run check # 패키지 체크 + 문서/토큰 동기화
+pnpm run verify # build + check (CI가 먼저 도는 것)
+```
+
+파운데이션에 영향을 주는 변경은 `docs/decisions.md`에 기록이 필요합니다.
+릴리스는 DevsLab이 `dds-v*` 태그로만 수행하며, 기여자는 발행하지 않습니다.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..eda25bf
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,61 @@
+# Contributing to DDS
+
+DDS (DevsLab Design System) is **source-available, not open source**. The
+code is public and you are welcome to read it, report issues, and propose
+changes, but the [DevsLab Source-Available License 1.0](./LICENSE) governs
+all use — it does not permit modification, redistribution, or building a
+competing design system.
+
+## Contribution license grant
+
+By submitting a contribution (a pull request, patch, issue text, or any
+other material) to this repository, you agree that:
+
+- you have the right to submit it, and it is your own work or work you are
+ authorized to submit;
+- you grant DevsLab a perpetual, worldwide, irrevocable, royalty-free,
+ sublicensable license to use, modify, relicense, and distribute your
+ contribution as part of the Software, without further obligation to you;
+- your contribution is provided under the same feedback terms as Section 3
+ of the LICENSE, and no compensation or attribution is owed beyond the
+ repository's commit history.
+
+If you cannot agree to this, please open an issue describing the problem
+instead of sending code.
+
+## What we accept
+
+- Bug reports and reproduction cases — always welcome.
+- Fixes for defects (broken tokens, contrast failures, a11y issues,
+ build/test problems).
+- Documentation corrections, including keeping the English/Korean pairs in
+ sync.
+
+New components, new tokens, and foundation (§3) changes are driven by
+DevsLab product needs and the decision log; open an issue to discuss before
+writing code.
+
+## Ground rules (from the spec)
+
+- Tokens are the single source of truth — no hardcoded hex/px in components
+ or examples. Components reference semantic tokens only.
+- Light is the default theme; dark is a semantic remapping, never an
+ `if (dark)` branch.
+- Text on cyan surfaces uses `zinc.950`, never white.
+- Accessibility floor: 4.5:1 text contrast, focus-visible rings, labels on
+ icon-only buttons, reduced-motion respected.
+- Docs ship in English/Korean pairs (`*.md` + `*.ko.md`) — edit both.
+- If the docs table and `tokens/*.json` disagree, fix both sides in the
+ same change.
+
+## Development
+
+```bash
+pnpm install --frozen-lockfile
+pnpm run build # build all packages
+pnpm run check # package checks + docs/token sync
+pnpm run verify # build + check (what CI runs first)
+```
+
+Foundation-affecting changes need an entry in `docs/decisions.md`.
+Releases are cut by DevsLab via `dds-v*` tags; contributors never publish.
diff --git a/brand/index.html b/brand/index.html
index 0a0f43e..8a9138c 100644
--- a/brand/index.html
+++ b/brand/index.html
@@ -485,10 +485,10 @@
공식 OSS 브랜드 규칙
devslab.kr/brand/open-source/
-
asset source · v0.2.0
+
asset source · v0.3.0
버전이 고정된 원본 자산
사이트와 README에는 중앙 생성물의 버전 URL을 사용합니다. DDS는 프로젝트별 경로를 복제하지 않습니다.
-
oss-brand v0.2.0
+
oss-brand v0.3.0
diff --git a/docs/backlog.md b/docs/backlog.md
index 1e19206..acdf56d 100644
--- a/docs/backlog.md
+++ b/docs/backlog.md
@@ -172,8 +172,10 @@ Geist/Geist Mono 셀프호스팅 여부, Pretendard 서브셋, RN 번들 전략.
- **로고 스토리**: `brand/index.html`의 마크 해석("코드 블록 + 아키텍처
설계")은 형태를 보고 붙인 것. 실제 제작 의도가 따로 있으면 교체.
-- **DDS 공개 여부**: 레포/패키지를 공개(오픈소스)할지, npm 스코프 배포
- 방식(공개 vs GitHub Packages)을 어떻게 할지.
+- ~~**DDS 공개 여부**~~: **해소 (2026-08-31, D-015)** — 레포 공개 + 공개 npm
+ `@devslab/*` 배포, DevsLab Source-Available License 1.0 적용(오픈소스 아님).
+ 남은 오너 액션: ① GitHub 레포 Public 전환, ② 레포 시크릿 `NPM_TOKEN` 확인,
+ ③ `dds-v*` 태그 푸시로 릴리스 워크플로 가동.
- **브랜드 페이지 i18n 범위**: devslab.kr의 14개 로케일을 /brand에도 전부
적용할지, ko/en만 유지할지.
diff --git a/packages/dds-css/package.json b/packages/dds-css/package.json
index 8878e16..62f16cc 100644
--- a/packages/dds-css/package.json
+++ b/packages/dds-css/package.json
@@ -1,6 +1,6 @@
{
"name": "@devslab/dds-css",
- "version": "0.3.0",
+ "version": "0.3.1",
"description": "DDS CSS component layer — class-based, framework-neutral, semantic-token-only (spec §4.3 v1 inventory, 20 components)",
"type": "module",
"license": "SEE LICENSE IN LICENSE",
@@ -24,5 +24,16 @@
"scripts": {
"build": "node build.mjs",
"check": "node scripts/check-css.mjs"
- }
+ },
+ "homepage": "https://devslab.kr/brand/",
+ "bugs": {
+ "url": "https://github.com/devslab-kr/dds/issues"
+ },
+ "keywords": [
+ "design-system",
+ "css",
+ "components",
+ "framework-neutral",
+ "devslab"
+ ]
}
diff --git a/packages/dds-icons/package.json b/packages/dds-icons/package.json
index 493a608..99f3dc1 100644
--- a/packages/dds-icons/package.json
+++ b/packages/dds-icons/package.json
@@ -1,6 +1,6 @@
{
"name": "@devslab/dds-icons",
- "version": "0.3.0",
+ "version": "0.3.1",
"description": "DDS icon set — one SVG source (24 grid, currentColor), shipped as files, a sprite and a path-data map",
"type": "module",
"license": "SEE LICENSE IN LICENSE",
@@ -32,5 +32,16 @@
"scripts": {
"build": "node build.mjs",
"check": "node scripts/check-icons.mjs"
- }
+ },
+ "homepage": "https://devslab.kr/brand/",
+ "bugs": {
+ "url": "https://github.com/devslab-kr/dds/issues"
+ },
+ "keywords": [
+ "icons",
+ "svg",
+ "sprite",
+ "design-system",
+ "devslab"
+ ]
}
diff --git a/packages/dds-solid/package.json b/packages/dds-solid/package.json
index 03424a7..86d1a7f 100644
--- a/packages/dds-solid/package.json
+++ b/packages/dds-solid/package.json
@@ -1,6 +1,6 @@
{
"name": "@devslab/dds-solid",
- "version": "0.3.0",
+ "version": "0.3.1",
"description": "Accessible SolidJS primitives for the DevsLab Design System",
"type": "module",
"license": "SEE LICENSE IN LICENSE",
@@ -43,9 +43,9 @@
"test:a11y": "vitest run --config vitest.config.ts src/__tests__/a11y.test.tsx"
},
"dependencies": {
- "@devslab/dds-css": "workspace:0.3.0",
- "@devslab/dds-icons": "workspace:0.3.0",
- "@devslab/dds-tokens": "workspace:0.3.0"
+ "@devslab/dds-css": "workspace:0.3.1",
+ "@devslab/dds-icons": "workspace:0.3.1",
+ "@devslab/dds-tokens": "workspace:0.3.1"
},
"peerDependencies": {
"solid-js": "1.9.15"
@@ -60,5 +60,16 @@
"vite": "8.2.1",
"vite-plugin-solid": "2.11.14",
"vitest": "4.1.1"
- }
+ },
+ "homepage": "https://devslab.kr/brand/",
+ "bugs": {
+ "url": "https://github.com/devslab-kr/dds/issues"
+ },
+ "keywords": [
+ "solidjs",
+ "components",
+ "accessibility",
+ "design-system",
+ "devslab"
+ ]
}
diff --git a/packages/dds-tokens/package.json b/packages/dds-tokens/package.json
index 6400757..56e8b2f 100644
--- a/packages/dds-tokens/package.json
+++ b/packages/dds-tokens/package.json
@@ -1,6 +1,6 @@
{
"name": "@devslab/dds-tokens",
- "version": "0.3.0",
+ "version": "0.3.1",
"description": "DDS (DevsLab Design System) design tokens — one JSON source, built for CSS, Tailwind, TypeScript/RN and Ionic",
"type": "module",
"license": "SEE LICENSE IN LICENSE",
@@ -37,5 +37,16 @@
},
"devDependencies": {
"typescript": "7.0.2"
- }
+ },
+ "homepage": "https://devslab.kr/brand/",
+ "bugs": {
+ "url": "https://github.com/devslab-kr/dds/issues"
+ },
+ "keywords": [
+ "design-tokens",
+ "design-system",
+ "css-variables",
+ "tailwind",
+ "devslab"
+ ]
}
diff --git a/packages/site-kit/package.json b/packages/site-kit/package.json
index c869d68..fa4acf6 100644
--- a/packages/site-kit/package.json
+++ b/packages/site-kit/package.json
@@ -1,6 +1,6 @@
{
"name": "@devslab/site-kit",
- "version": "0.3.0",
+ "version": "0.3.1",
"description": "Strict i18n, SEO/GEO, and Solid public-site shells for DevsLab products",
"type": "module",
"license": "SEE LICENSE IN LICENSE",
@@ -55,7 +55,7 @@
"test:worker": "wrangler deploy --dry-run --config fixtures/worker/wrangler.jsonc --outdir dist-worker"
},
"dependencies": {
- "@devslab/dds-solid": "workspace:0.3.0"
+ "@devslab/dds-solid": "workspace:0.3.1"
},
"peerDependencies": {
"@tanstack/solid-router": "1.170.30",
@@ -83,5 +83,16 @@
"vite-plugin-solid": "2.11.14",
"vitest": "4.1.1",
"wrangler": "4.127.1"
- }
+ },
+ "homepage": "https://devslab.kr/brand/",
+ "bugs": {
+ "url": "https://github.com/devslab-kr/dds/issues"
+ },
+ "keywords": [
+ "solidjs",
+ "i18n",
+ "seo",
+ "design-system",
+ "devslab"
+ ]
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7084cae..0b665c1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -74,13 +74,13 @@ importers:
packages/dds-solid:
dependencies:
'@devslab/dds-css':
- specifier: workspace:0.3.0
+ specifier: workspace:0.3.1
version: link:../dds-css
'@devslab/dds-icons':
- specifier: workspace:0.3.0
+ specifier: workspace:0.3.1
version: link:../dds-icons
'@devslab/dds-tokens':
- specifier: workspace:0.3.0
+ specifier: workspace:0.3.1
version: link:../dds-tokens
devDependencies:
'@testing-library/jest-dom':
@@ -120,7 +120,7 @@ importers:
packages/site-kit:
dependencies:
'@devslab/dds-solid':
- specifier: workspace:0.3.0
+ specifier: workspace:0.3.1
version: link:../dds-solid
devDependencies:
'@tanstack/solid-router':
diff --git a/tests/foundation-contracts.test.mjs b/tests/foundation-contracts.test.mjs
index ed0b6f9..a3ecee6 100644
--- a/tests/foundation-contracts.test.mjs
+++ b/tests/foundation-contracts.test.mjs
@@ -15,7 +15,7 @@ test("public foundation packages use the @devslab scope, source-available licens
for (const [path, name] of Object.entries(expected)) {
const manifest = await json(path);
assert.equal(manifest.name, name);
- assert.equal(manifest.version, "0.3.0");
+ assert.equal(manifest.version, "0.3.1");
assert.equal(manifest.license, "SEE LICENSE IN LICENSE");
assert.equal(manifest.publishConfig?.registry, "https://registry.npmjs.org");
assert.equal(manifest.publishConfig?.access, "public");
@@ -58,7 +58,7 @@ test("unpublished DDS packages bootstrap from this workspace", async () => {
for (const name of names) {
assert.equal(
manifest.dependencies?.[name],
- "workspace:0.3.0",
+ "workspace:0.3.1",
`${path} must resolve unpublished ${name} from the local release workspace`,
);
}
diff --git a/tests/site-kit-contracts.test.mjs b/tests/site-kit-contracts.test.mjs
index 0370b06..f3c5510 100644
--- a/tests/site-kit-contracts.test.mjs
+++ b/tests/site-kit-contracts.test.mjs
@@ -50,7 +50,7 @@ test("OSS product marks remain caller-supplied and reference the canonical brand
assert.match(styles, /block-size/);
assert.doesNotMatch(styles, /\.oss-product-mark[^}]*animation\s*:/s);
assert.match(await read("brand/index.html"), /https:\/\/devslab\.kr\/brand\/open-source\//);
- assert.match(await read("brand/index.html"), /oss-brand\/releases\/tag\/v0\.2\.0/);
+ assert.match(await read("brand/index.html"), /oss-brand\/releases\/tag\/v0\.3\.0/);
});
test("public chrome requires injected copy and keeps forms native", async () => {