Files
hakorune/src/runner/plugins.rs
nyash-codex 50ac8af2b8 Phase 21.4 Complete: FileBox SSOT + Analyzer Stabilization (7 Tasks)
 Task 1: Fallback Guarantee (create_box failure → ring1/core-ro auto fallback)
- Three-tier fallback system: plugin → builtin → core-ro
- Mode control: auto/plugin-only/core-ro
- New: src/box_factory/builtin_impls/file_box.rs
- New: tools/test_filebox_fallback_smoke.sh

 Task 2: Provider Registration SSOT (static/dynamic/core-ro unified)
- ProviderFactory trait with priority-based selection
- Global registry PROVIDER_FACTORIES implementation
- Priority: dynamic(100) > builtin(10) > core-ro(0)
- New: src/boxes/file/builtin_factory.rs
- New: tools/smoke_provider_modes.sh

 Task 3: FileBox Publication Unification
- Verified: basic/file_box.rs already minimized (11 lines)
- Perfect re-export pattern maintained

 Task 4: ENV Unification (FILEBOX_MODE/DISABLE_PLUGINS priority)
- Removed auto-setting of NYASH_USE_PLUGIN_BUILTINS
- Removed auto-setting of NYASH_PLUGIN_OVERRIDE_TYPES
- Added deprecation warnings with migration guide
- ENV hierarchy: DISABLE_PLUGINS > BOX_FACTORY_POLICY > FILEBOX_MODE

 Task 5: Error Log Visibility (Analyzer rule execution errors to stderr)
- Added [rule/exec] logging before IR-based rule execution
- Format: [rule/exec] HC012 (dead_static_box) <filepath>
- VM errors now traceable via stderr output

 Task 6: Unnecessary Using Removal (14 rules Str alias cleanup)
- Removed unused `using ... as Str` from 14 rule files
- All rules use local _itoa() helper instead
- 14 lines of dead code eliminated

 Task 7: HC017 Skip & TODO Documentation (UTF-8 support required)
- Enhanced run_tests.sh with clear skip message
- Added "Known Limitations" section to README.md
- Technical requirements documented (3 implementation options)
- Re-enable timeline: Phase 22 (Unicode Support Phase)

📊 Test Results:
- Analyzer: 10 tests PASS, 1 skipped (HC017)
- FileBox fallback: All 3 modes PASS
- Provider modes: All 4 modes PASS
- Build: Success (0 errors, 0 warnings)

🎯 Key Achievements:
- 28 files modified/created
- Three-Tier Fallback System (stability)
- SSOT Provider Registry (extensibility)
- ENV unification (operational clarity)
- Error visibility (debugging efficiency)
- Code cleanup (maintainability)
- Comprehensive documentation (Phase 22 ready)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 17:04:21 +09:00

85 lines
4.3 KiB
Rust
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.

/*!
* Runner plugin/registry initialization (extracted)
*/
use super::*;
impl NyashRunner {
/// Initialize global runtime registry and load configured plugins.
///
/// Behavior (Phase 21.4: Unified ENV Policy):
/// - Always initializes the unified type/box registry.
/// - Loads native BID plugins unless `NYASH_DISABLE_PLUGINS=1`.
/// - When `--load-ny-plugins` or `NYASH_LOAD_NY_PLUGINS=1` is set, besteffort
/// loads Nyash scripts listed under `nyash.toml`'s `ny_plugins`.
///
/// ENV Policy:
/// - NYASH_DISABLE_PLUGINS=1: Skip all plugin initialization
/// - NYASH_BOX_FACTORY_POLICY: Control factory priority (builtin_first|strict_plugin_first|compat_plugin_first)
/// - NYASH_FILEBOX_MODE: FileBox provider selection (auto|core-ro|plugin-only)
///
/// Deprecated ENV (removed auto-setting):
/// - NYASH_USE_PLUGIN_BUILTINS: No longer auto-set (use policy instead)
/// - NYASH_PLUGIN_OVERRIDE_TYPES: No longer auto-set (use policy instead)
pub(crate) fn init_runtime_and_plugins(&self, groups: &crate::cli::CliGroups) {
// Check if plugins are disabled
let plugins_disabled = std::env::var("NYASH_DISABLE_PLUGINS").ok().as_deref() == Some("1");
// Unified registry (always initialize)
runtime::init_global_unified_registry();
// Plugins (guarded by NYASH_DISABLE_PLUGINS)
if !plugins_disabled {
runner_plugin_init::init_bid_plugins();
crate::runner::box_index::refresh_box_index();
} else {
eprintln!("[plugins] Skipping plugin initialization (NYASH_DISABLE_PLUGINS=1)");
}
// Deprecation warnings for old ENV variables
if std::env::var("NYASH_USE_PLUGIN_BUILTINS").is_ok() {
eprintln!("[warn] NYASH_USE_PLUGIN_BUILTINS is deprecated. Use NYASH_BOX_FACTORY_POLICY instead.");
}
if std::env::var("NYASH_PLUGIN_OVERRIDE_TYPES").is_ok() {
eprintln!("[warn] NYASH_PLUGIN_OVERRIDE_TYPES is deprecated. Use NYASH_BOX_FACTORY_POLICY instead.");
}
// Optional Ny script plugins loader (best-effort)
if groups.load_ny_plugins || std::env::var("NYASH_LOAD_NY_PLUGINS").ok().as_deref() == Some("1") {
if let Ok(text) = std::fs::read_to_string("nyash.toml") {
if let Ok(doc) = toml::from_str::<toml::Value>(&text) {
if let Some(np) = doc.get("ny_plugins") {
let mut list: Vec<String> = Vec::new();
if let Some(arr) = np.as_array() { for v in arr { if let Some(s) = v.as_str() { list.push(s.to_string()); } } }
else if let Some(tbl) = np.as_table() { for (_k, v) in tbl { if let Some(s) = v.as_str() { list.push(s.to_string()); } else if let Some(arr) = v.as_array() { for e in arr { if let Some(s) = e.as_str() { list.push(s.to_string()); } } } } }
if !list.is_empty() {
let list_only = std::env::var("NYASH_NY_PLUGINS_LIST_ONLY").ok().as_deref() == Some("1");
println!("🧩 Ny script plugins ({}):", list.len());
for p in list {
if list_only { println!("{}", p); continue; }
match std::fs::read_to_string(&p) {
Ok(code) => {
// Legacy interpreter removed - ny_plugins execution disabled
println!("[ny_plugins] {}: SKIP (legacy interpreter removed)", p);
}
Err(e) => println!("[ny_plugins] {}: FAIL (read: {})", p, e),
}
}
}
}
}
}
}
// Provider verify (受け口): env で warn/strict のみ動作(未設定時は無処理)
match crate::runtime::provider_verify::verify_from_env() {
Ok(()) => {}
Err(e) => { eprintln!("{}", e); std::process::exit(1); }
}
// Provider Lock — lock after registry and plugins are initialized (受け口)
// Default: no-op behavior change. Exposed for future verify→lock sequencing.
crate::runtime::provider_lock::lock_providers();
}
}