Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
5359466
📝 presentation: package責務と依存境界を定義
T4ko0522 Aug 26, 2026
d98817f
✨ contracts: Presentation artifact契約を追加
T4ko0522 Aug 26, 2026
10bd1a3
✨ presentation-core: semantic検証とcanonical hashを追加
T4ko0522 Aug 26, 2026
24cf6b5
✨ presentation: authoring宣言SDKを追加
T4ko0522 Aug 26, 2026
4db49d8
✨ presentation: renderer plugin契約を追加
T4ko0522 Aug 26, 2026
caafab0
✨ presentation: 標準Surface Primitiveを追加
T4ko0522 Aug 26, 2026
a852e1c
✨ presentation: deterministic PNG変換を追加
T4ko0522 Aug 26, 2026
a79d6fe
✨ presentation-compiler: RenderBundle生成を追加
T4ko0522 Aug 26, 2026
df6e2d0
✨ presentation-renderer-api: prepared build境界を追加
T4ko0522 Aug 27, 2026
1bca972
✨ presentation-renderer-web: Structured Web Rendererを追加
T4ko0522 Aug 27, 2026
bd2ee00
✨ presentation-cli: checkとbuild境界を追加
T4ko0522 Aug 27, 2026
7829f96
♻️ contracts: Presentation契約の正本をZodに移行
T4ko0522 Aug 28, 2026
52411a8
♻️ presentation-core: RFC 8785 canonicalizationを分離
T4ko0522 Aug 28, 2026
d78651d
✨ presentation-compiler: TypeScript構文解析境界を追加
T4ko0522 Aug 28, 2026
4f2c2f2
✨ presentation-renderer-web: RolldownでOpaque bundle境界を追加
T4ko0522 Aug 28, 2026
351316d
✨ presentation-cli: BunとOpenTUIのTUI基盤を追加
T4ko0522 Aug 28, 2026
1513575
📝 presentation: 依存基盤の実装状況を反映
T4ko0522 Aug 28, 2026
0dec7ad
♻️ presentation-renderer-web: Zodでruntime境界を検証
T4ko0522 Aug 28, 2026
d0cb3b4
♻️ presentation: 実行時検証をZodに統一
T4ko0522 Aug 28, 2026
33aeae2
♻️ presentation: パッケージの責務境界を整理
T4ko0522 Aug 28, 2026
4488f0f
💄 自動整形と lint 修正を適用
github-actions[bot] Aug 28, 2026
22c14c9
🐛 presentation: テストランナーの実行コマンドを修正
T4ko0522 Aug 28, 2026
bc0a8a8
🐛 contracts: presentation制約を復元
T4ko0522 Aug 28, 2026
a9ef1b2
🐛 presentation-renderer-web: バイナリアセットの入力を保持
T4ko0522 Aug 28, 2026
acb80b1
Merge pull request #68 from unframe-dev/refactor/presentation-depende…
T4ko0522 Aug 28, 2026
8daeea3
♻️ presentation-core: ambient runtime依存を除去
T4ko0522 Aug 28, 2026
e65fe19
👷 config: presentation品質基盤を接続
T4ko0522 Aug 28, 2026
6fbce66
✨ presentation-compiler: virtual source project境界を追加
T4ko0522 Aug 28, 2026
703dc16
✨ presentation-compiler: virtual module型検査を追加
T4ko0522 Aug 28, 2026
fa75044
✨ presentation-compiler: locked package入力境界を追加
T4ko0522 Aug 28, 2026
d572ec1
✨ presentation-compiler: locked package解決を追加
T4ko0522 Aug 28, 2026
ebccb17
✨ presentation-compiler: symbol provenanceを追加
T4ko0522 Aug 28, 2026
c25f1bc
📝 presentation: Compiler frontend進捗を同期
T4ko0522 Aug 28, 2026
a175469
📝 presentation: Timeline wire監査を記録
T4ko0522 Aug 28, 2026
4a01f84
📝 presentation: M1 Static DSLを確定
T4ko0522 Aug 29, 2026
fd30abc
✨ presentation-compiler: Static DSL Graphを追加
T4ko0522 Aug 29, 2026
5fa6d2e
✨ presentation-compiler: Declaration Graphを正規化
T4ko0522 Aug 29, 2026
035fa84
✨ presentation-compiler: declaration sourceを収集
T4ko0522 Aug 29, 2026
200a089
♻️ presentation: declaration検証をbuilderから分離
T4ko0522 Aug 29, 2026
0f0e31e
✨ presentation-compiler: declaration catalogを対応付け
T4ko0522 Aug 29, 2026
7153d0c
✨ presentation-compiler: Authoring Source検証APIを公開
T4ko0522 Aug 29, 2026
60873e4
📝 presentation: Timeline Run wire契約を確定
T4ko0522 Aug 29, 2026
b42e3ec
📝 presentation: Runtime transport契約を確定
T4ko0522 Aug 29, 2026
819aa9f
📝 presentation: Semantic Tree契約を確定
T4ko0522 Aug 29, 2026
f333005
📝 presentation: 座標変換契約を確定
T4ko0522 Aug 29, 2026
9bd68c7
📝 presentation: Surface Partition契約を確定
T4ko0522 Aug 29, 2026
91a0a8c
📝 presentation: Texture budget契約を確定
T4ko0522 Aug 29, 2026
7284a34
✨ presentation: Source catalog assemblyを追加
T4ko0522 Aug 29, 2026
5dce30a
✨ presentation: Authoring Sourceからcompileまで接続
T4ko0522 Aug 29, 2026
3d82737
✨ presentation: Fixed Browser環境を追加
T4ko0522 Aug 29, 2026
096417a
✨ presentation: Canonical JSON hashを公開
T4ko0522 Aug 29, 2026
2d47ca6
📝 presentation: Local Compilerのfilesystem契約を確定
T4ko0522 Aug 29, 2026
2e486ce
✨ presentation: project filesystem入力境界を追加
T4ko0522 Aug 29, 2026
8896c53
✨ presentation: lock v1 loaderを追加
T4ko0522 Aug 29, 2026
ca77c53
✨ presentation: declaration hashをlockと照合
T4ko0522 Aug 29, 2026
dd64f4a
✨ presentation: artifactをatomicに公開
T4ko0522 Aug 29, 2026
400ff40
✨ presentation: Authoring sourceをfilesystemから発見
T4ko0522 Aug 29, 2026
dc8716c
✨ presentation: filesystem Local Compilerを接続
T4ko0522 Aug 29, 2026
d65ef8f
✨ presentation: reference Authoring Projectを追加
T4ko0522 Aug 29, 2026
3aeccc1
✨ presentation: Local Compiler process entryを追加
T4ko0522 Aug 29, 2026
2e1ab33
📝 presentation: Milestone 1の完了状態を同期
T4ko0522 Aug 29, 2026
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
3 changes: 2 additions & 1 deletion .github/workflows/autofix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,11 @@ jobs:
- name: Install JS dependencies
run: nix develop --command pnpm install --frozen-lockfile --ignore-scripts

- name: Apply autofix (control-plane / realtime / lp / web)
- name: Apply autofix (control-plane / realtime / presentation / lp / web)
run: |
nix run .#control-plane -- fix
nix run .#realtime -- fix
nix run .#presentation -- fix
nix run .#lp -- fix
nix run .#web -- fix

Expand Down
21 changes: 18 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: CI

# オーケストレーション。変更のあった領域だけ reusable workflow を呼び、
# 最後に集約ゲート (job: ci) を必須チェックにする。
# 各領域の実体: control-plane.yml / realtime.yml / web.yml / lp.yml / unity.yml。
# 各領域の実体: control-plane.yml / presentation.yml / realtime.yml / web.yml / lp.yml / unity.yml。
#
# paths-ignore は設けない。docs-only PR でも workflow を起動し、changes で全領域が
# skip → 集約 job `CI` が成功することで、必須ステータスチェックが常に報告される。
Expand Down Expand Up @@ -38,6 +38,7 @@ jobs:
control-plane: ${{ steps.filter.outputs.control-plane }}
realtime: ${{ steps.filter.outputs.realtime }}
web: ${{ steps.filter.outputs.web }}
presentation: ${{ steps.filter.outputs.presentation }}
lp: ${{ steps.filter.outputs.lp }}
unity: ${{ steps.filter.outputs.unity }}
steps:
Expand All @@ -53,7 +54,7 @@ jobs:
shared: &shared
- 'flake.nix'
- 'flake.lock'
- 'scripts/lib/**'
- 'scripts/**'
- '.github/workflows/ci.yml'
js-shared: &js-shared
- 'pnpm-lock.yaml'
Expand Down Expand Up @@ -83,6 +84,14 @@ jobs:
- 'scripts/ci/web.sh'
- 'app/web/**'
- 'packages/api-client-typescript/**'
presentation:
- *shared
- *js-shared
- '.github/workflows/presentation.yml'
- 'scripts/ci/presentation.sh'
- 'packages/contracts/**'
- 'packages/api-client-csharp/**'
- 'packages/presentation-*/**'
lp:
- *shared
- *js-shared
Expand Down Expand Up @@ -111,6 +120,12 @@ jobs:
if: needs.changes.outputs.web == 'true'
uses: ./.github/workflows/web.yml

presentation:
name: Presentation Packages
needs: changes
if: needs.changes.outputs.presentation == 'true'
uses: ./.github/workflows/presentation.yml

lp:
name: LP
needs: changes
Expand All @@ -126,7 +141,7 @@ jobs:
ci:
name: CI
# 必須ステータスチェック。全領域の結果を集約する。
needs: [changes, control-plane, realtime, web, lp, unity]
needs: [changes, control-plane, realtime, web, presentation, lp, unity]
if: always()
runs-on: ubuntu-latest
steps:
Expand Down
25 changes: 25 additions & 0 deletions .github/workflows/presentation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Presentation Packages

on:
workflow_call:
workflow_dispatch:

permissions:
contents: read

jobs:
check:
name: presentation / check
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4

- uses: DeterminateSystems/nix-installer-action@33c9ab3ef95cd57c164d9d6eb1f9a46338538d41 # main
- uses: DeterminateSystems/magic-nix-cache-action@55718cd9ebf1737a061487d5ada21abf31e99a98 # main

- name: Install JS dependencies
run: nix develop --command pnpm install --frozen-lockfile

- name: shared config / typecheck / lint / test
run: nix run .#presentation
51 changes: 27 additions & 24 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,17 +87,17 @@ nix run .#setup
公式のタスク入口は Nix flake apps です。複雑な処理の実体は `scripts/` にあり、
通常は内部スクリプトを直接実行せず、次の入口を使用します。

| 用途 | コマンド |
| --- | --- |
| 開発環境 | `nix develop` |
| 依存関係と hook のセットアップ | `nix run .#setup` |
| 全体品質ゲート | `nix run .#check` |
| Control Plane check / test / build | `nix run .#control-plane` |
| Realtime check / test / build / race | `nix run .#realtime` |
| Web check / test / build | `nix run .#web` |
| LP test / check / build | `nix run .#lp` |
| Notion 同期 | `nix run .#notion-sync` |
| flake の評価と formatter 検証 | `nix flake check` |
| 用途 | コマンド |
| ------------------------------------ | ------------------------- |
| 開発環境 | `nix develop` |
| 依存関係と hook のセットアップ | `nix run .#setup` |
| 全体品質ゲート | `nix run .#check` |
| Control Plane check / test / build | `nix run .#control-plane` |
| Realtime check / test / build / race | `nix run .#realtime` |
| Web check / test / build | `nix run .#web` |
| LP test / check / build | `nix run .#lp` |
| Notion 同期 | `nix run .#notion-sync` |
| flake の評価と formatter 検証 | `nix flake check` |

`nix flake check` は flake の評価と formatter を検証します。アプリケーションの
品質ゲートではありません。コード変更時の全体品質ゲートは
Expand Down Expand Up @@ -130,16 +130,17 @@ generated-file notice を保持します。C# generator は未接続のため、
各 package の `package.json` にある script を JavaScript の実行方法の正とします。
テストフレームワークを推測してコマンドを追加しません。

| 対象 | 現在のテスト | 今後の方針 |
| --- | --- | --- |
| `app/web/` | package script で実行 | 機能追加に合わせて拡張 |
| `app/server/realtime/` | Go `testing`、race detector | gRPC contract と session 実装に合わせて拡張 |
| `lp/` | package script、`svelte-check`、静的 build | ページ追加に合わせて拡張 |
| `app/unity/` | Unity Test Framework の EditMode/PlayMode | Unity Editor で実行 |
| 対象 | 現在のテスト | 今後の方針 |
| ---------------------- | ------------------------------------------ | ------------------------------------------- |
| `app/web/` | package script で実行 | 機能追加に合わせて拡張 |
| `app/server/realtime/` | Go `testing`、race detector | gRPC contract と session 実装に合わせて拡張 |
| `lp/` | package script、`svelte-check`、静的 build | ページ追加に合わせて拡張 |
| `app/unity/` | Unity Test Framework の EditMode/PlayMode | Unity Editor で実行 |

`nix run .#check` は現在、Control Plane、Realtime、LP、Web の検証を実行します。
現在は Unity Editor テストを実行しません。ドキュメント link check や security
check も、この品質ゲートには含まれません。
`nix run .#check` は現在、Control Plane、Presentation packages、Realtime、LP、Web
の検証を実行します。Presentation gate は共有 `packages/config` の hook fixture と設定
check も実行します。現在は Unity Editor テストを実行しません。ドキュメント link
check や security check も、この品質ゲートには含まれません。

Unity の動作変更では、Unity `6000.3.14f1` の Editor で EditMode/PlayMode テストを
実行します。GitHub-hosted runner の Unity workflow は `dotnet format`、PowerShell
Expand All @@ -155,6 +156,8 @@ skip された検証を成功したとは報告しません。
領域別の自動修正は次のコマンドで実行します。

```bash
nix run .#control-plane -- fix
nix run .#presentation -- fix
nix run .#realtime -- fix
nix run .#lp -- fix
nix run .#web -- fix
Expand All @@ -167,10 +170,10 @@ Pull Request では `autofix.yml` が format と lint の自動修正を行う
`nix develop` または `nix run .#setup` により、repository-local の
`core.hooksPath=packages/config/githooks` が有効になります。

現在 tracked されている hook は `prepare-commit-msg` です。commit message を変換
しますが、pre-commit の format や staged file の検証を保証するものではありません。
Vite+ の staged 設定が存在していても、設定された `core.hooksPath` と hook file を
確認せずに自動実行を前提にしません
tracked hook の `pre-commit` は repository root の Vite+ staged 設定を解決し、対象の
staged file に `vp check --fix` または `vp fmt` を実行します。`prepare-commit-msg` は
commit message を変換します。hook を前提にする前に、repository-local の
`core.hooksPath` が `packages/config/githooks` を指すことを確認します

現在の変換例は次のとおりです。

Expand Down
2 changes: 1 addition & 1 deletion app/server/control-plane/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"db:migrate:remote": "wrangler d1 migrations apply unframe-control-plane --remote",
"r2:cors:apply": "wrangler r2 bucket cors set unframe-assets --file ./r2-cors.json",
"r2:cors:list": "wrangler r2 bucket cors list unframe-assets",
"contracts:check": "pnpm --filter @unframe/contracts check:control-plane",
"contracts:check": "pnpm --filter @unframe/contracts check",
"client:check": "pnpm --filter @unframe/api-client-typescript check",
"check": "pnpm types:check && pnpm typecheck && pnpm lint && pnpm test && pnpm contracts:check && pnpm client:check && pnpm build"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@ const fromBase64Url = (value: string) => {
return Uint8Array.from(atob(padded), (character) => character.charCodeAt(0));
};

const generatePrivateJwk = async () => {
const generatedKey = await crypto.subtle.generateKey({ name: "Ed25519" }, true, [
"sign",
"verify",
]);
if (!("privateKey" in generatedKey)) throw new Error("Ed25519 must generate a key pair");

const exportedKey = await crypto.subtle.exportKey("jwk", generatedKey.privateKey);
if (exportedKey instanceof ArrayBuffer) throw new Error("JWK export must return a JSON key");
return exportedKey;
};

describe("RealtimeBootstrapCredentials", () => {
it("rejects a signing key that is not an Ed25519 private JWK", () => {
expect(
Expand All @@ -26,8 +38,7 @@ describe("RealtimeBootstrapCredentials", () => {
});

it("issues a verifiable EdDSA session credential and only publishes its public JWK", async () => {
const keyPair = await crypto.subtle.generateKey({ name: "Ed25519" }, true, ["sign", "verify"]);
const privateJwk = await crypto.subtle.exportKey("jwk", keyPair.privateKey);
const privateJwk = await generatePrivateJwk();
const credentials = new RealtimeBootstrapCredentials(privateJwk, {
issuer: "https://control-plane.example.com",
keyId: "realtime-2026-08",
Expand Down Expand Up @@ -107,8 +118,7 @@ describe("RealtimeBootstrapCredentials", () => {
});

it("UTF-8 audienceを含むcredentialを発行する", async () => {
const keyPair = await crypto.subtle.generateKey({ name: "Ed25519" }, true, ["sign", "verify"]);
const privateJwk = await crypto.subtle.exportKey("jwk", keyPair.privateKey);
const privateJwk = await generatePrivateJwk();
const credentials = new RealtimeBootstrapCredentials(privateJwk, {
issuer: "https://control-plane.example.com",
keyId: "realtime-2026-08",
Expand Down
Loading