Files
hakorune/docs/development/roadmap/phases/phase-25.4-naming-cli-cleanup/README.md
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

148 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 フィールド設計
#### **実行制御フィールド**(本番用)
```nyash
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専用フラグ**(開発用)
```nyash
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 決定ロジック
```nyash
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`