Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ jobs:
run: node scripts/release-publish.mjs packed-consumer

publish:
if: github.ref_type == 'tag'
if: github.event.deleted != true && github.ref_type == 'tag'
runs-on: ubuntu-latest
needs: [quality, packed-consumer]
timeout-minutes: 30
Expand Down Expand Up @@ -176,7 +176,7 @@ jobs:
run: node scripts/release-publish.mjs public-consumer

github-release:
if: github.ref_type == 'tag'
if: github.event.deleted != true && github.ref_type == 'tag'
runs-on: ubuntu-latest
needs: [publish]
timeout-minutes: 15
Expand Down
2 changes: 1 addition & 1 deletion docs/launch/v1.0.0-next.0.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Primitree 1.0.0-next.0

Status: Unreleased.
Status: Released 2026-08-17.

Primitree checks a local DTCG source against project layer and owner rules. The
first public prerelease also reserves the unscoped `primitree` package name, so
Expand Down
6 changes: 3 additions & 3 deletions docs/plans/2026-08-10-configured-dtcg-adoption.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,9 @@ Node test runner, Fumadocs, Prettier, and Biome.

- [ ] **Step 7: Review and commit the release set**

Run the code scanner on both files, inspect every signal, complete
OMP-CODE-000 through OMP-CODE-021, and scan their prose. Run the root release
tests, formatter check, Biome, and `git diff --check` in a disposable copy.
Run the code and prose review checks on both files and inspect every signal.
Run the root release tests, formatter check, Biome, and `git diff --check` in
a disposable copy.

Commit subject:

Expand Down
346 changes: 284 additions & 62 deletions docs/releasing.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/cli/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Changelog

## 1.0.0-next.0
## 1.0.0-next.0 (2026-08-17)

### Major Changes

Expand Down
2 changes: 1 addition & 1 deletion packages/core/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Changelog

## 1.0.0-next.0
## 1.0.0-next.0 (2026-08-17)

### Major Changes

Expand Down
2 changes: 1 addition & 1 deletion packages/dtcg/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Changelog

## 1.0.0-next.0
## 1.0.0-next.0 (2026-08-17)

### Major Changes

Expand Down
60 changes: 32 additions & 28 deletions packages/dtcg/tests/emitter-bounds.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,37 +148,41 @@ describe('emitTypescript work bounds', () => {
).toThrow(TYPESCRIPT_WORK_LIMIT_MESSAGE)
})

it('caps generated TypeScript output at 20 MiB of UTF-8', () => {
const value = '界'.repeat(50_000)
const aliases = Object.fromEntries(
Array.from({ length: 140 }, (_, index) => [
`alias-${index}`,
{ $type: 'string' as const, $value: '{tokens.base}' },
])
)
it(
'caps generated TypeScript output at 20 MiB of UTF-8',
{ timeout: 10_000 },
() => {
const value = '界'.repeat(50_000)
const aliases = Object.fromEntries(
Array.from({ length: 140 }, (_, index) => [
`alias-${index}`,
{ $type: 'string' as const, $value: '{tokens.base}' },
])
)

expect(() =>
emitTypescript(
{},
{
version: '2025.10',
sets: {
source: {
sources: [
{
tokens: {
base: { $type: 'string', $value: value },
...aliases,
expect(() =>
emitTypescript(
{},
{
version: '2025.10',
sets: {
source: {
sources: [
{
tokens: {
base: { $type: 'string', $value: value },
...aliases,
},
},
},
],
],
},
},
},
resolutionOrder: [{ $ref: '#/sets/source' }],
}
)
).toThrow('TypeScript output can contain at most 20 MiB.')
})
resolutionOrder: [{ $ref: '#/sets/source' }],
}
)
).toThrow('TypeScript output can contain at most 20 MiB.')
}
)
})

function tailwindCollisionTree(depth: number): DTCGDocument {
Expand Down
86 changes: 47 additions & 39 deletions packages/dtcg/tests/output-byte-limits.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,47 +17,55 @@ const outputOptions = {
} as const

describe('buildDTCGOutputs JSON byte limits', () => {
it('counts UTF-8 bytes across token names and text values', () => {
const value = '😀'.repeat(2_625_000)
const files = {
'brand.tokens.json': {
first: { $type: 'fontFamily', $value: value },
},
'second.tokens.json': {
second: { $type: 'fontFamily', $value: value },
},
} satisfies Record<string, DTCGDocument>

expect(() =>
buildDTCGOutputs(
{
files,
resolver,
resolverFileName: 'tokens.resolver.json',
it(
'counts UTF-8 bytes across token names and text values',
{ timeout: 10_000 },
() => {
const value = '😀'.repeat(2_625_000)
const files = {
'brand.tokens.json': {
first: { $type: 'fontFamily', $value: value },
},
'second.tokens.json': {
second: { $type: 'fontFamily', $value: value },
},
outputOptions
)
).toThrow('DTCG output text can contain at most 20 MiB.')
})
} satisfies Record<string, DTCGDocument>

it('counts UTF-8 bytes in each serialized token file', () => {
const value = '界'.repeat(75)
const document = {
family: {
$type: 'fontFamily',
$value: Array.from({ length: 90_000 }, () => value),
},
} satisfies DTCGDocument
expect(() =>
buildDTCGOutputs(
{
files,
resolver,
resolverFileName: 'tokens.resolver.json',
},
outputOptions
)
).toThrow('DTCG output text can contain at most 20 MiB.')
}
)

expect(() =>
buildDTCGOutputs(
{
files: { 'brand.tokens.json': document },
resolver,
resolverFileName: 'tokens.resolver.json',
it(
'counts UTF-8 bytes in each serialized token file',
{ timeout: 10_000 },
() => {
const value = '界'.repeat(75)
const document = {
family: {
$type: 'fontFamily',
$value: Array.from({ length: 90_000 }, () => value),
},
outputOptions
)
).toThrow('A DTCG output file can contain at most 20 MiB.')
})
} satisfies DTCGDocument

expect(() =>
buildDTCGOutputs(
{
files: { 'brand.tokens.json': document },
resolver,
resolverFileName: 'tokens.resolver.json',
},
outputOptions
)
).toThrow('A DTCG output file can contain at most 20 MiB.')
}
)
})
2 changes: 1 addition & 1 deletion packages/dtcg/tests/pipeline.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1147,7 +1147,7 @@ describe('emitCss', () => {
).not.toThrow()
})

it('stops before CSS output exceeds 20 MiB', () => {
it('stops before CSS output exceeds 20 MiB', { timeout: 10_000 }, () => {
const banner = 'é'.repeat(10 * 1024 * 1024 + 1)

expect(() =>
Expand Down
2 changes: 1 addition & 1 deletion packages/hooks/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Changelog

## 1.0.0-next.0
## 1.0.0-next.0 (2026-08-17)

### Major Changes

Expand Down
2 changes: 1 addition & 1 deletion packages/mcp/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Changelog

## 1.0.0-next.0
## 1.0.0-next.0 (2026-08-17)

### Major Changes

Expand Down
2 changes: 1 addition & 1 deletion packages/primitree/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Changelog

## 1.0.0-next.0
## 1.0.0-next.0 (2026-08-17)

### Major Changes

Expand Down
Loading