Files
Beyond-KLE/typescript-implementation-plan.md
T
ewdernaandClaude Opus 5 300fb18e4a PHY Editor は既存エディタを改造せず自作する
PHYの正本を相対座標の木にしたため、フラットな絶対座標配列を直接
書き換える既存エディタ(KLE, kle-ng)を改造しても、編集操作の中核は
書き直しになる。ijprest KLE は全権利留保でフォーク不可。

実装計画の既存記述は未整理のまま、決定と制約だけを冒頭に追記した。
kle-serial2 の書き出しコードの出自を未確認事項 P-1 として残した。

Journal: journal/2026-09-18-editor-base.md

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 22:16:37 +09:00

6.0 KiB

Beyond KLE: TypeScript実装計画

PHY Editor の土台

PHY Editor は自作する。既存のレイアウトエディタのコードを土台にしない。 PHYの正本は相対座標の木だが、既存エディタ(KLE, kle-ng)の移動・回転・undoはフラットな絶対座標の配列を直接書き換える作りで、改造しても中核は書き直しになるため。

  • ijprest/keyboard-layout-editor のコードは取り込まない。全権利留保で、作者はフォークを避けたい意向を明記している。ソースを読んで挙動を確かめるのは可
  • adamws/kle-ng は MIT ライセンスで、参考実装として読める

プロジェクト構造

beyond-kle/
├── packages/
│   ├── core/                 # 共通型定義とユーティリティ
│   │   ├── src/
│   │   │   ├── types/       # 各レイヤーの型定義
│   │   │   ├── validators/  # JSON Schema バリデーター
│   │   │   └── utils/       # 共通ユーティリティ
│   │   └── package.json
│   ├── phy-editor/          # PHYレイヤーエディタ
│   ├── matrix-mapper/       # IDX/ELCレイヤーマッパー
│   ├── keymap-designer/     # MAPレイヤーデザイナー
│   ├── converter/           # 既存フォーマット変換
│   └── firmware-gen/        # ファームウェア生成
├── tools/
│   ├── cli/                 # CLI ツール
│   └── web-editor/          # Web統合エディタ
├── schemas/                 # JSON Schema定義
├── examples/               # サンプルプロジェクト
└── docs/                   # ドキュメント

開発フェーズ

Phase 1a: 基盤実装

  1. 型定義とSchema

    • TypeScript型定義
    • JSON Schema validation
    • テスト用サンプルデータ
  2. 変換エンジン

    • KLE JSON → PHY変換
    • PHY → IDX自動生成
    • QMK/VIA出力
  3. CLIツール

    • 変換機能のコマンドライン提供
    • バリデーション機能

Phase 1b: エディタプロトタイプ

  1. PHY Editor (Web)

    • React + Canvas での編集機能
    • KLE互換インポート
  2. Matrix Mapper

    • 視覚的マトリックス割り当て
    • 最適化アルゴリズム

技術スタック

コア

  • 言語: TypeScript
  • ランタイム: Node.js / Bun
  • パッケージ管理: pnpm + workspace
  • バリデーション: Ajv (JSON Schema)

CLI

  • フレームワーク: Commander.js
  • 出力: chalk (色付き), table

Web Editor

  • フロントエンド: React + Vite
  • 描画: Konva.js / Fabric.js
  • 状態管理: Zustand
  • UI: Mantine / shadcn/ui

テスト

  • テストランナー: Vitest
  • E2E: Playwright

実装優先度

最優先 (2週間)

  1. 型定義とJSON Schema
  2. KLE → PHY変換
  3. PHY → IDX基本変換
  4. CLIでの変換確認

高優先 (1ヶ月)

  1. QMK/VIA出力
  2. 基本的なWebエディタ
  3. マトリックス最適化

中優先 (2ヶ月)

  1. 高度なエディタ機能
  2. プロジェクト管理
  3. 既存ツール連携

開発環境セットアップ

1. プロジェクト初期化

# プロジェクト作成
mkdir beyond-kle-proto
cd beyond-kle-proto

# pnpm workspace設定
echo 'packages:\n  - "packages/*"\n  - "tools/*"' > pnpm-workspace.yaml

# TypeScript設定
pnpm add -D typescript @types/node
npx tsc --init

# 共通依存関係
pnpm add -D vitest ajv

2. パッケージ構成

# Core package
mkdir -p packages/core/src/{types,validators,utils}
cd packages/core && pnpm init

# CLI tool
mkdir -p tools/cli/src
cd tools/cli && pnpm init

# 各エディタパッケージ
mkdir -p packages/{phy-editor,matrix-mapper,keymap-designer}

3. 開発ツール設定

# Linting & Formatting
pnpm add -D eslint prettier @typescript-eslint/eslint-plugin

# Testing
pnpm add -D @vitest/ui

# Build tools
pnpm add -D tsup

サンプルプロジェクト設計

テストケース

  1. 60% ANSI - 標準的なレイアウト
  2. Split keyboard - 左右分離型
  3. Ergonomic layout - カラムスタッガード + 回転
  4. Macro pad - シンプルな4x4

データ例

60% ANSI PHY Layer

{
  "version": "1.0.0",
  "metadata": {
    "name": "60% ANSI",
    "description": "Standard 60% layout"
  },
  "profiles": [
    {
      "id": "standard",
      "name": "Cherry MX",
      "unitSize": { "x": 19.05, "y": 19.05 }
    }
  ],
  "keys": [
    // Escape key
    {
      "id": "k00", "profile": "standard",
      "position": { "x": 0, "y": 0 },
      "size": { "width": 1, "height": 1 },
      "metadata": { "label": "Esc" }
    },
    // Space bar
    {
      "id": "k60", "profile": "standard", 
      "position": { "x": 5, "y": 4 },
      "size": { "width": 6.25, "height": 1 },
      "metadata": { "label": "Space" }
    }
  ]
}

次のアクション

  1. GitHub リポジトリ作成
  2. 開発環境セットアップ
  3. 型定義の実装開始
  4. KLE変換機能のプロトタイプ

実装を開始しますか?最初にどの部分から取り組みたいでしょうか?

検討済み・非採用

  • ijprest/keyboard-layout-editor の改造 (journal/2026-09-18-editor-base.md)
  • adamws/kle-ng の改造 (journal/2026-09-18-editor-base.md)

未確認事項

P-1 kle-serial2 の serialize がKLE本体のコードに由来しないか

  • 位置づけ: 未解決の問い。KLE JSONの書き出しに kle-serial2 (MIT) を使うかの判断に関わる
  • 現状の認識: 本家 kle-serial は書き出しを「KLE本体から移植予定」としていた。kle-serial2 の serialize は KLE の serial.js と構造が似るが、KLEフォーマットがその構造を要求するため由来の証拠にはならない
  • 格上げ条件: kle-serial2 の作者に出自を確認する。確認できない場合は書き出しを自前で書くかをユーザーが決める