# 非機能要件定義書

## 概要

本ドキュメントは、Nushell（nu）プロジェクトの非機能要件を定義するものです。Nushellは、Rustで実装されたクロスプラットフォームシェルおよびプログラミング言語であり、構造化データの処理に特化しています。本ドキュメントでは、性能、可用性、セキュリティ、拡張性、保守性、および運用・監視に関する要件を記載します。

## 性能要件

### レスポンスタイム

| 処理種別 | 目標値 | 備考 |
| --- | --- | --- |
| 起動時間 | 数秒以内 | 標準ライブラリの読み込みを含む |
| コマンド実行 | リアルタイム応答 | インタラクティブシェルとしての応答性 |
| HTTPリクエスト | ユーザー指定のタイムアウト | `--max-time` フラグで設定可能（Duration型） |
| プラグインGCタイムアウト | デフォルト10秒 | `plugin_gc.default.stop_after` で設定可能 |

### スループット

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| パイプライン処理 | ストリーミング対応 | メモリ効率的なデータ処理 |
| 履歴エントリ数上限 | 100,000件 | `history.max_size` で設定可能 |
| 外部補完結果上限 | 100件 | `completions.external.max_results` で設定可能 |

### キャッシュ設定

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| ファイルキャッシュ | CachedFile構造体 | ソースコードのキャッシュ（Arc使用） |
| HTTPクライアントプール | GLOBAL_CLIENT | RwLockで管理されるグローバルHTTPクライアントプール |
| LRUキャッシュ | プラグイン関連で使用 | nu_plugin_polarsでデータフレームキャッシュに使用 |

## 可用性要件

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 稼働率 | クライアントアプリケーションのため明示的な目標なし | シェルとして安定動作を目指す |
| 計画停止時間 | 該当なし | クライアントアプリケーション |
| 障害復旧時間（RTO） | 該当なし | ステートレスなシェル |
| 目標復旧時点（RPO） | 該当なし | 履歴はローカルに保存 |

### プラットフォームサポート

**アクティブサポート（CIテスト対象）:**
- macOS（最新版、GitHub CI経由）
- Windows 10/11
- Linux（ubuntu-22.04ベース）

**ビルドターゲット:**
- x86_64/AMD64（全プラットフォーム）
- aarch64（全プラットフォーム）
- musl（Linux）
- riscv64（Linux）
- armv7（Linux）
- loongarch64（Linux、制限あり）

**パッシブサポート:**
- OpenBSD（一部コマンド未対応）
- FreeBSD（一部コマンド未対応）
- Android（Termux経由）

## セキュリティ要件

### 脆弱性報告ポリシー

| 項目 | 内容 |
| --- | --- |
| サポートバージョン | 最新リリースバージョンのみ |
| 報告方法 | Discordまたは GitHub Security Advisories |
| 応答時間 | 1週間以内に初期応答 |
| 開示調整 | 責任ある開示プロセスを実施 |

### TLS/SSL設定

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| TLSバックエンド | rustls-tls（デフォルト）またはnative-tls | 相互排他的な機能フラグ |
| 証明書検証 | デフォルトで有効 | `--insecure`フラグで無効化可能 |
| プロキシサポート | HTTP_PROXY環境変数対応 | SOCKSプロキシも対応 |

### 認証・認可

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| HTTP認証 | Basic認証対応 | `--user`/`--password`フラグで指定 |
| 管理者権限チェック | `is-admin`コマンド | プラットフォーム固有の実装 |

## 拡張性要件

### プラグインシステム

| 項目 | 仕様 | 備考 |
| --- | --- | --- |
| プラグインプロトコル | JSON-RPC | stdin/stdout経由の通信 |
| プラグイン命名規則 | `nu_plugin_*` | パスから自動検出 |
| プラグインGC | 自動停止機能 | 非アクティブ時に自動停止（デフォルト10秒） |
| プラグイン設定 | プラグイン単位で個別設定可能 | `$env.config.plugins`および`$env.config.plugin_gc.plugins` |

### モジュールシステム

| 項目 | 仕様 | 備考 |
| --- | --- | --- |
| 標準ライブラリ | nu-std | `--no-std-lib`で無効化可能 |
| ライブラリパス | NU_LIB_DIRS | 環境変数または`-I`フラグで設定 |
| プラグインパス | NU_PLUGIN_DIRS | 環境変数で設定 |

### 機能フラグ（Feature Flags）

| フラグ | 説明 | デフォルト |
| --- | --- | --- |
| plugin | プラグインシステム | 有効 |
| network | ネットワーク機能 | 有効 |
| sqlite | SQLite対応 | 有効 |
| trash-support | ゴミ箱機能 | 有効 |
| rustls-tls | RustlsベースのTLS | 有効 |
| native-tls | ネイティブTLS | 無効 |
| system-clipboard | システムクリップボード | 無効 |
| mcp | Model Context Protocol | 有効 |

## 保守性要件

### コード品質

| 項目 | 要件 | 備考 |
| --- | --- | --- |
| Rust版 | 1.91.1（安定版の2リリース前を目標） | rust-toolchain.tomlで管理 |
| Lintツール | Clippy | `-D warnings -D clippy::unwrap_used`を適用 |
| フォーマット | cargo fmt | CIで自動チェック |
| テストカバレッジ | ワークスペース全体テスト | `cargo test --workspace` |

### ビルドプロファイル

| プロファイル | 用途 | 最適化設定 |
| --- | --- | --- |
| release | 本番ビルド | `opt-level = "s"`, `lto = "thin"` |
| profiling | パフォーマンス分析 | debug情報付きrelease |
| ci | CI実行用 | デバッグ情報なし |

### ドキュメント

| 項目 | 場所 | 備考 |
| --- | --- | --- |
| ユーザードキュメント | nushell.sh/book | 外部サイト |
| 開発者ドキュメント | devdocs/ | リポジトリ内 |
| APIドキュメント | doc.rust-lang.org | cargo doc生成 |

## 運用・監視要件

### ログ設定

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| ログレベル | error, warn, info, debug, trace | `--log-level`で指定 |
| ログ出力先 | stdout, stderr, mixed, file | `--log-target`で指定 |
| ログファイル | `$TEMP/nu-{pid}.log` | file指定時の出力先 |
| モジュールフィルタ | 含む/除外リスト | `--log-include`/`--log-exclude` |
| デフォルトフィルタ | "nu"プレフィックス | Nushell関連ログのみ出力 |

### 履歴管理

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| 履歴ファイル形式 | plaintext（デフォルト）またはSQLite | `history.file_format`で設定 |
| 最大履歴サイズ | 100,000件 | `history.max_size`で設定 |
| 履歴同期 | コマンド実行時に同期 | `history.sync_on_enter`で設定 |
| 履歴分離 | SQLite形式のみ対応 | `history.isolation`で設定 |

### シグナル処理

| 項目 | 動作 | 備考 |
| --- | --- | --- |
| Ctrl+C | 割り込みシグナル処理 | ctrlcクレートで実装 |
| パニックリカバリ | panicフックでターミナル復元 | raw modeを無効化 |

### IDE/LSP統合

| 項目 | 機能 | 備考 |
| --- | --- | --- |
| LSPサーバー | `--lsp`フラグで起動 | stdio経由 |
| コード補完 | `--ide-complete` | IDEインテグレーション用 |
| 定義ジャンプ | `--ide-goto-def` | IDEインテグレーション用 |
| ホバー情報 | `--ide-hover` | IDEインテグレーション用 |
| 診断チェック | `--ide-check` | エラー数制限可能 |

### MCP（Model Context Protocol）サポート

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| トランスポート | stdio（デフォルト）またはHTTP | `--mcp-transport`で設定 |
| HTTPポート | 8080（デフォルト） | `--mcp-port`で設定 |

## 備考

### 依存関係管理

- Dependabotによる自動更新（GitHub Dependabot設定）
- 監査ワークフロー（audit.yml）による脆弱性チェック
- Cargo.lockによる依存関係のロック

### 実験的機能

- `--experimental-options`フラグで有効化
- トラッキングイシューによる管理
- opt-in/opt-outの選択が可能

### ライセンス

- MITライセンス
- GPLライセンスの依存関係は受け入れ不可
