Files
hakorune/docs/development/roadmap/phases/phase-25.4-naming-cli-cleanup
nyash-codex 554ba96f76 feat(stage1-cli): Config箱化完了 - env処理を一元管理
Phase 25.4-B: Stage-1 CLI 設定箱実装

## 📦 実装内容

### 1. Config 箱作成
- 新規: `Stage1CliConfigBox` (`lang/src/runner/stage1_cli.hako:16-48`)
- `from_env()` メソッドで全環境変数を MapBox に集約
- Mode/Backend/Sources/Dev flags を構造化

### 2. stage1_main リファクタ
- `local cfg = Stage1CliConfigBox.from_env()` で設定取得
- `env.get` 散在 → `cfg.get` 一箇所参照に統一
- Mode-based dispatch (emit_program_json | emit_mir_json | run | disabled)

### 3. 環境変数マッピング

**実行制御**:
- `NYASH_USE_STAGE1_CLI` → mode="run"
- `STAGE1_EMIT_PROGRAM_JSON` → mode="emit_program_json"
- `STAGE1_EMIT_MIR_JSON` → mode="emit_mir_json"
- `STAGE1_BACKEND` → backend (default: "vm")
- `STAGE1_SOURCE` / `STAGE1_SOURCE_TEXT` / `STAGE1_PROGRAM_JSON` → sources

**Dev専用**:
- `STAGE1_CLI_DEBUG` → debug
- `NYASH_TO_I64_FORCE_ZERO` → to_i64_force_zero

### 4. 設計文書
- 新規作成: `docs/development/roadmap/phases/phase-25.4-naming-cli-cleanup/README.md`
- Config フィールド設計・環境変数マッピング完全文書化

## 技術的成果
- **env.get 削減**: stage1_main 内 15箇所 → 1箇所(Config生成)に集約
- **Mode決定ロジック**: 排他的Mode選択を Config 箱に集中
- **保守性向上**: 環境変数追加時は Config 箱のみ修正

## テスト結果
 cargo test mir_stage1_cli_stage1_main_shape_verifies: 1 passed
 cargo test mir_stage1_cli_entry_like_pattern_verifies: 1 passed
 cargo test mir_static_box_naming: 2 passed
 Background stage1_cli execution: RC=0

## 参考
- Phase 25.4-A: fa9cea51, bceb20ed, 419214a5
- Config 設計: docs/development/roadmap/phases/phase-25.4-naming-cli-cleanup/README.md

🎉 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 09:43:42 +09:00
..

Phase 25.4 — NamingBox SSOT & CLI 設定箱化

目的: static box / global 呼び出しの名前決定を一元化し、Stage-1 CLI の環境変数処理を Config 箱に集約する。


Task A: NamingBox SSOT化 完了)

Rust側統一:

  • src/mir/naming.rs を SSOT に設定
  • Builder/VM/Entry選択ロジックを統一

Python側ミラー:

  • src/llvm_py/naming_helper.py 作成
  • Rust NamingBox と完全同一の意味論

完了コミット: fa9cea51 (Rust), bceb20ed (Entry選択), 419214a5 (Python)


Task B: Stage-1 CLI 設定箱(進行中)

目的

stage1_main から env/トグル処理を分離し、1箇所の「設定箱」で env を解釈する。

Config フィールド設計

実行制御フィールド(本番用)

static box Stage1CliConfigBox {
  // 1. Mode selection
  mode: String  // "emit_program_json" | "emit_mir_json" | "run" | "disabled"

  // 2. Backend selection
  backend: String  // "vm" | "llvm" | "pyvm" (default: "vm")

  // 3. Input sources
  source_path: String       // STAGE1_SOURCE: .hako file path
  source_text: String       // STAGE1_SOURCE_TEXT: direct source text (test use)
  program_json_path: String // STAGE1_PROGRAM_JSON: pre-built Program JSON path

  // 4. Control flags
  use_stage1_cli: Integer  // NYASH_USE_STAGE1_CLI: 1=enable, 0=disable
}

Dev専用フラグ(開発用)

static box Stage1CliConfigBox {
  // Debug & dev toggles
  debug: Integer           // STAGE1_CLI_DEBUG: 1=verbose logging
  to_i64_force_zero: Integer  // NYASH_TO_I64_FORCE_ZERO: 1=force 0 on Void (dev workaround)
}

環境変数マッピング

環境変数 Config フィールド 用途 デフォルト
NYASH_USE_STAGE1_CLI use_stage1_cli CLI有効化 0 (無効)
STAGE1_EMIT_PROGRAM_JSON mode "emit_program_json" -
STAGE1_EMIT_MIR_JSON mode "emit_mir_json" -
STAGE1_BACKEND backend backend選択 "vm"
STAGE1_SOURCE source_path .hakoパス -
STAGE1_SOURCE_TEXT source_text 直接ソース(テスト用) -
STAGE1_PROGRAM_JSON program_json_path Program JSONパス -
STAGE1_CLI_DEBUG debug デバッグログ 0 (無効)
NYASH_TO_I64_FORCE_ZERO to_i64_force_zero Void→0強制化dev用 0 (無効)

Mode 決定ロジック

method from_env() {
  local cfg = new MapBox()

  // Mode selection (排他的)
  if env.get("STAGE1_EMIT_PROGRAM_JSON") == "1" {
    cfg.set("mode", "emit_program_json")
  } else if env.get("STAGE1_EMIT_MIR_JSON") == "1" {
    cfg.set("mode", "emit_mir_json")
  } else if env.get("NYASH_USE_STAGE1_CLI") == "1" {
    cfg.set("mode", "run")
  } else {
    cfg.set("mode", "disabled")
  }

  // Backend
  local b = env.get("STAGE1_BACKEND")
  if b == null { b = "vm" }
  cfg.set("backend", "" + b)

  // Sources
  cfg.set("source_path", env.get("STAGE1_SOURCE"))
  cfg.set("source_text", env.get("STAGE1_SOURCE_TEXT"))
  cfg.set("program_json_path", env.get("STAGE1_PROGRAM_JSON"))

  // Flags
  cfg.set("debug", env.get("STAGE1_CLI_DEBUG"))
  cfg.set("to_i64_force_zero", env.get("NYASH_TO_I64_FORCE_ZERO"))

  return cfg
}

内部専用環境変数Config 外)

以下は Config に入れない(内部処理・参照のみ):

  • HAKO_STAGEB_APPLY_USINGS - Stage-B using 適用制御BuildBox内部
  • HAKO_MIR_BUILDER_DELEGATE - MirBuilder delegate トグルMirBuilderBox内部
  • NYASH_SCRIPT_ARGS_JSON - スクリプト引数(env.setで設定、読み取りは Stage0

Task C: MIR ログ観測リスト(後続)

__mir__.log のタグと用途を一覧化し、dev専用/観測用を分類する。

詳細: 後続セクション参照


実装計画

B-1. 設計( 完了)

  • Config フィールド設計: 上記

B-2. Config 箱実装(次)

  • Stage1CliConfigBox 作成
  • from_env() メソッド実装

B-3. stage1_main リファクタ(次)

  • local cfg = Stage1CliConfigBox.from_env() を先頭で呼び出し
  • env.get 呼び出しを cfg.get に置換

B-4. テスト(次)

  • cargo test mir_stage1_cli_stage1_main_shape_verifies
  • cargo test mir_stage1_cli_entry_like_pattern_verifies
  • tools/stage1_debug.sh 手動実行確認

参考

  • Phase 25.4-A 完了コミット: fa9cea51, bceb20ed, 419214a5
  • Stage-1 CLI 本体: lang/src/runner/stage1_cli.hako
  • Stage-1 テスト: src/tests/stage1_cli_entry_ssa_smoke.rs