Skip to content

devel の成果を main に反映#181

Merged
igapyon merged 16 commits into
mainfrom
devel
Apr 17, 2026
Merged

devel の成果を main に反映#181
igapyon merged 16 commits into
mainfrom
devel

Conversation

@igapyon
Copy link
Copy Markdown
Owner

@igapyon igapyon commented Apr 17, 2026

devel の成果を main に反映

igapyon added 16 commits April 16, 2026 09:18
## 概要

CLI で MusicXML / MuseScore の圧縮形式を file I/O に限って扱えるようにします。あわせて、既存の ZIP 読み書き処理を共通 helper に整理し、CLI と既存処理の再利用性を高めます。

## 変更内容

- CLI で `--from musicxml` の入力として `.mxl` を扱えるように変更
- CLI で `--from musescore` の入力として `.mscz` を扱えるように変更
- CLI で `--to musicxml` の出力先が `.mxl` の場合に圧縮 MusicXML を出力するように変更
- CLI で `--to musescore` の出力先が `.mscz` の場合に圧縮 MuseScore を出力するように変更
- `stdin` / `stdout` は従来どおり text-only のまま維持
- ZIP 読み書き処理を `src/ts/zip-io.ts` に共通化
- `src/ts/mxl-io.ts` と `src/ts/download-flow.ts` から ZIP 共通 helper を利用する構成に整理
- `src/ts/cli-api.ts` に CLI 向けの ZIP 入出力 helper を追加
- `scripts/mikuscore-cli.mjs` の help 文面を ZIP file I/O 対応に合わせて更新
- `README.md`、`docs/DEVELOPMENT.md`、`docs/spec/CLI_STEP1.md`、`docs/future/CLI_ROADMAP.md`、`TODO.md` を更新

## テスト

- `tests/unit/cli-api.spec.ts` に `.mxl` / `.mscz` の encode / decode テストを追加
- `tests/unit/mikuscore-cli.spec.ts` に `.mxl` / `.mscz` の CLI file input / output テストを追加

## 補足

- `index.html`、`mikuscore.html`、`src/js/main.js` は関連変更に伴う更新を含みます
- `TODO.md` には、今回の対応完了に加えて、重い `musescore-io` roundtrip テストの見直しタスクが追記されています
CLI の `.mxl` / `.mscz` file I/O 対応と ZIP 処理の共通化
## 概要

CLI の `musicxml` / `musescore` 入力デコードで使っていた `Buffer` 依存を外し、UTF-8 デコードを `TextDecoder` ベースに変更します。あわせて、CLI の入出力契約と UTF-8 テキスト扱いに関する説明をドキュメントへ追記します。

## 変更内容

- `src/ts/cli-api.ts`
  - `decodeUtf8Text` を追加
  - `decodeCliMusicXmlInput` の平文入力デコードを `Buffer.from(...).toString("utf8")` から `TextDecoder("utf-8").decode(...)` に変更
  - `decodeCliMuseScoreInput` の平文入力デコードを `Buffer.from(...).toString("utf8")` から `TextDecoder("utf-8").decode(...)` に変更
- `README.md`
  - `musicxml` / `musescore` の平文 `stdin` / `stdout` は UTF-8 テキストとして扱い、`.mxl` / `.mscz` の圧縮入出力はファイルパス I/O に限定される旨を追記
- `docs/DEVELOPMENT.md`
  - CLI の平文デコードが Node 固有の `Buffer` ではなく UTF-8 `TextDecoder` ベースであることを追記
- `docs/spec/CLI_STEP1.md`
  - `musicxml` / `musescore` の CLI 平文入力デコードは、Node 以外のランタイムとも互換な UTF-8 デコードを使うべきことを追記

## 影響範囲

- CLI の `musicxml` / `musescore` 平文入力デコード
- CLI の仕様説明と開発者向けドキュメント
CLI の UTF-8 デコードを `TextDecoder` ベースに変更し、関連ドキュメントを更新
## 概要

`mikuscore` の CLI を `convert` 中心の構成から、`convert` / `render` / `state` を意識した構成へ広げます。
あわせて、CLI の help・エラーハンドリング・diagnostics の基盤を整理し、`state` 系の初期コマンドを追加します。

## 変更内容

### CLI 基盤の改善

- help 出力を一元化
- `CliUsageError` / `CliProcessingError` を導入
- `--diagnostics text|json` を追加
- `--out -` を明示的な `stdout` として扱うよう変更
- usage error と processing error の扱いを分離
- JSON diagnostics の first cut を追加

### `render` の拡張

- `render svg` に `--from abc` を追加
- 外向きには one-shot な `ABC -> SVG` を提供しつつ、内部は `ABC -> MusicXML -> SVG` の流れを維持

### `state` 初期コマンドの追加

- `state summarize`
- `state inspect-measure`
- `state validate-command`
- `state apply-command`
- `state diff`

### CLI API の拡張

`src/ts/cli-api.ts` に以下を追加し、CLI から canonical `MusicXML` の inspection / validation / mutation / diff を扱えるようにしました。

- `summarizeMusicXmlState(...)`
- `inspectMusicXmlMeasure(...)`
- `validateMusicXmlCommand(...)`
- `applyMusicXmlCommand(...)`
- `diffMusicXmlState(...)`

### テスト更新

`tests/unit/mikuscore-cli.spec.ts` を拡張し、以下を含む CLI の振る舞いを検証対象に追加しました。

- top-level / command help
- `--out -`
- `--diagnostics json`
- `render svg --from abc`
- `state` 系各コマンド
- usage failure / unsupported input の扱い

### ドキュメント更新

README / development note / roadmap / future note / spec 群を更新し、今回の CLI 再構築方針と first cut を文書化しました。

追加した主な spec:

- `docs/spec/CLI_TAXONOMY_FIRSTCUT.md`
- `docs/spec/CLI_RENDER_FIRSTCUT.md`
- `docs/spec/CLI_STATE_FIRSTCUT.md`
- `docs/spec/CLI_DIAGNOSTICS_FIRSTCUT.md`
- `docs/spec/CLI_HELP_FIRSTCUT.md`
- `docs/spec/CLI_REBUILD_PLAN.md`

## 意図

- `MusicXML` canonical を維持したまま CLI の責務分離を明確にする
- 人間利用、Agent Skills、将来の生成 AI 連携を見据えた CLI 契約へ寄せる
- raw な JavaScript 例外露出を減らし、CLI としての failure UX を改善する
- 小さい編集機能を `state` 系の bounded mutation workflow として扱える土台を作る

## 補足

- `TODO.md` には、今回の CLI 再構築系列に関する TODO / future direction を追加しています
- patch envelope やより深い `state` workflow は今後の拡張対象です
CLI を `convert` / `render` / `state` 軸へ拡張し、`state` 初期コマンドと診断基盤を追加
## 概要

CLI 再構築の続きを進め、`state` 系コマンドの targeting を強化しました。
あわせて、one-shot `render svg --from abc` の JSON diagnostics に stage 情報を追加し、CLI help / spec / README / development note を現在の実装に合わせて更新しています。

## 変更内容

### `state` 系コマンドの targeting 強化

`src/ts/cli-api.ts` で、`state validate-command` / `state apply-command` の command payload が以下の両方を受けられるようになりました。

- `targetNodeId` / `anchorNodeId` の直接指定
- `state inspect-measure` 出力に基づく `selector` / `anchor_selector`

これにより、`inspect-measure` の結果をそのまま次の bounded edit workflow へつなぎやすくしています。

### `state inspect-measure` / `state diff` の実用性向上

`src/ts/cli-api.ts` で以下を強化しました。

- `state inspect-measure`
  - hybrid targeting hint を返す方向を維持
- `state diff`
  - `changed_measure_numbers`
  - `changed_measures`

を返すようにし、raw XML diff ではなく workflow-friendly な差分 summary を少し深めました。

### one-shot render の stage-aware diagnostics

`scripts/mikuscore-cli.mjs` で、`render svg --from abc --diagnostics json` 実行時に `stages` を返すようにしました。

現状の stage は以下です。

- `abc_to_musicxml`
- `musicxml_to_svg`

primary artifact は従来どおり `stdout` の SVG のままにしつつ、`stderr` の JSON diagnostics だけを強化しています。

### CLI 実装の整理

`scripts/mikuscore-cli.mjs` では、`MusicXML` 入力の読み込みや `state` 実行の重複を helper 化して整理しています。

- `readMusicXmlInputText(...)`
- `runStateMusicXmlCommand(...)`

### ドキュメント更新

以下を current behavior に合わせて更新しました。

- `README.md`
- `docs/DEVELOPMENT.md`
- `docs/spec/CLI_DIAGNOSTICS_FIRSTCUT.md`
- `docs/spec/CLI_HELP_FIRSTCUT.md`
- `docs/spec/CLI_STATE_FIRSTCUT.md`
- `TODO.md`

主に反映した内容は以下です。

- `state` payload が `selector` / `anchor_selector` を受けられること
- one-shot render の JSON diagnostics が `stages` を返すこと
- CLI 再構築系列の TODO 実態反映

## テスト

`tests/unit/mikuscore-cli.spec.ts` を拡張し、以下を追加・更新しました。

- `state validate-command` の selector targeting
- `state apply-command` の selector targeting
- `insert_note_after` の `anchor_selector` targeting
- `state diff` の measure-level summary
- one-shot render の stage-aware diagnostics
- `state --help` の payload note

## 補足

- `index.html` の更新日は `2026-04-17` に更新されています
- `推測:` このコミットは CLI 再構築の first cut をさらに実運用しやすくするための refinement と位置づけられます
CLI 再構築を前進し、`state` selector targeting と stage-aware diagnostics を追加
## 概要

`scripts/mikuscore-cli.mjs` の内部構造を整理し、CLI の分岐処理・入力デコード・diagnostics 構築を helper ベースへ寄せます。
外向きのコマンド体系を大きく変えるのではなく、実装の責務分離と重複削減を進める変更です。

## 変更内容

### 1. help / command routing の整理

- `main()` での help 判定を `resolveHelpTopic(...)` に切り出し
- top-level command の実行を `runConvertCommand(...)` / `runRenderCommand(...)` / `runStateCommand(...)` に分離
- `runCommand(...)` を command family の routing 中心に整理

### 2. option parsing の整理

- `parseArgs(...)` 内で option value 取得を `readOptionValue(...)` に共通化
- `--diagnostics` の値検証を `validateDiagnosticsOption(...)` に切り出し

### 3. convert / render / state の handler 化

- `convert` の変換 pair ごとの処理を `buildConvertHandlers(...)` に集約
- `render` の source ごとの処理を `buildRenderHandlers(...)` に集約
- `state` の subcommand ごとの処理を `buildStateHandlers(...)` に集約

### 4. 入出力・変換 helper の整理

以下の helper を追加・整理し、MusicXML 読み込みや import/export の重複を削減しています。

- `readDecodedTextInput(...)`
- `runMusicXmlTextCommand(...)`
- `runMusicXmlExportCommand(...)`
- `runEncodedMusicXmlExportCommand(...)`
- `runTextImportCommand(...)`
- `runBinaryImportCommand(...)`
- `runDecodedTextImportCommand(...)`
- `runEncodedImportCommand(...)`

### 5. one-shot render の処理整理

- `ABC -> MusicXML -> SVG` の one-shot render を `runAbcToSvgRenderCommand(...)` に切り出し
- stage 情報の生成を `buildStageDiagnostics(...)` に分離

### 6. diagnostics 構築の共通化

- diagnostics の基底組み立てを `buildBaseDiagnostics(...)` に整理
- success / error 共通の集計を `summarizeDiagnosticOutcome(...)` に集約
- error diagnostics 用の `argv` 解析を `summarizeArgv(...)` に整理し、I/O diagnostics 用の二重走査を削減

## 意図

- `scripts/mikuscore-cli.mjs` の責務を分解し、読みやすさを上げる
- `convert` / `render` / `state` の dispatch 形状を揃える
- input decode / import / export / diagnostics の重複を減らす
- 今後の CLI 拡張時に command family や subcommand を追加しやすくする
CLI 実装を整理し、コマンド分岐・入出力処理・diagnostics 組み立てを共通化
## 概要

CLI 周辺の downstream 互換対応の一部を upstream 側に取り込み、あわせて landing page の CLI 文言と関連テストを更新しています。

## 変更内容

- `src/ts/cli-api.ts`
  - indexed measure-note builder に残っていた `Array.prototype.flatMap` の使用を通常ループに置き換えました。
  - `IndexedMeasureNote[]` の構築方法を整理し、既存の selector 解決処理と組み合わせる形を維持しています。

- `tests/unit/mikuscore-cli.spec.ts`
  - `state validate-command` の失敗系に対する回帰テストを追加しました。
  - 追加した主なケース:
    - selector が複数ノートに一致する場合
    - selector が object ではない不正 payload の場合

- `tests/unit/cli-api.spec.ts`
  - ZIP helper I/O に対する軽量 roundtrip テストを追加しました。
  - 追加した主なケース:
    - `MusicXML -> .mxl -> MusicXML`
    - `MusicXML -> .mscz -> MuseScore text -> MusicXML`

- `index-src.html`
  - landing page に残っていた `convert-first` という表現を、現在の CLI 構成に合わせた文言へ更新しました。
  - 英語・日本語の両方を更新しています。

- `index.html`
  - `index-src.html` の変更を反映した生成物更新です。
  - コミット上では `Updated:` の日付表示も更新されています。

- `TODO.md`
  - `src/ts/cli-api.ts` まわりの upstream 取り込み方針を追記しました。
  - MIDI export option は当面 CLI flag としては公開せず、内部固定のまま扱う方針を追記しました。
  - landing page の CLI 文言を current-facing な構成へ揃える TODO を追記しました。

## 目的

- downstream 側で持っていた CLI 互換対応の一部を upstream 側へ寄せること
- `ES2018` 前提の isolated bundle path と衝突しうる `flatMap` 依存を避けること
- current-facing な CLI 文言を `convert` / `render` / `state` に揃えること
- selector 解決と ZIP helper I/O の回帰検知を強めること
CLI 互換対応を upstream に取り込み、landing page 文言と ZIP/selector 回帰テストを更新
## 概要

`src/ts/cli-api.ts` において、CLI command selector の解決結果および command 正規化結果に対する型ガードを追加し、失敗時の `message` 参照を型安全にしました。

## 変更内容

- `resolveMeasureNoteSelector(...)` の戻り値型に `ResolvedMeasureNoteSelectorResult` を追加
- `ResolvedMeasureNoteSelectorResult` 用の型ガード `isResolvedMeasureNoteSelectorFailure(...)` を追加
- `CliCommandNormalizationResult` 用の型ガード `isCliCommandNormalizationFailure(...)` を追加
- `if (!resolved.ok)` を `isResolvedMeasureNoteSelectorFailure(resolved)` に置き換え
- `if (!normalized.ok)` を `isCliCommandNormalizationFailure(normalized)` に置き換え

## 補足

- 変更対象は `src/ts/cli-api.ts` のみです
- 失敗分岐の型絞り込みを明示するための修正です
CLI API の selector 正規化まわりに型ガードを追加
…と TODO を更新

## 概要

CLI の変換面を拡張し、既存の reusable な変換ロジックを `cli-api` と `mikuscore-cli` に接続しました。あわせて、CLI help・回帰テスト・関連ドキュメント・TODO を更新しています。

## 変更内容

- `abc -> midi` の CLI 変換を追加
- `mei <-> musicxml` の CLI 変換を追加
- `lilypond <-> musicxml` の CLI 変換を追加
- `src/ts/cli-api.ts` に `mei` / `lilypond` の facade を追加
- `scripts/mikuscore-cli.mjs` の help と convert handler を更新
- `tests/unit/mikuscore-cli.spec.ts` に成功ケース・失敗ケースの回帰テストを追加
- `README.md` / `docs/DEVELOPMENT.md` / `docs/future/CLI_ROADMAP.md` の CLI 記述を更新
- `TODO.md` に CLI surface sync、VSQX の外部依存対応、MEI / LilyPond の CLI 対応タスクを追記

## 変更ファイル

- `src/ts/cli-api.ts`
- `scripts/mikuscore-cli.mjs`
- `tests/unit/mikuscore-cli.spec.ts`
- `README.md`
- `docs/DEVELOPMENT.md`
- `docs/future/CLI_ROADMAP.md`
- `TODO.md`

## 補足

- VSQX の CLI 対応はこの変更には含めていません。
- 理由として、`TODO.md` に integration / upstream 側への変更依頼が必要な前提を追記しています。
CLI に `abc -> midi` / `MEI` / `LilyPond` の MusicXML 相互変換を追加し、関連ドキュメント…
@igapyon igapyon merged commit 1ad145a into main Apr 17, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant