Files
hakorune/docs/ideas/new-features/2025-08-27-simple-man-shell-revolution.md

181 lines
5.4 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.

# 簡単マン流シェル革命 - Everything is Box Shell
作成日: 2025-08-27
Status: 構想段階
Priority: High
Related: ChatGPT5との共同構想
## 🎯 ビジョン
**Windows/Ubuntu差異を感じさせない、Boxベースの最小シェル**
すべてをBoxで統一することで
- クォート地獄からの解放
- OS差異の完全吸収
- 暗黙展開による事故の根絶
- 思考速度に追いつくUI
## 🏗️ コア設計全部Box
### 基本Box群
```nyash
// 環境変数は Map<str,str>常にUTF-8
EnvBox: 環境変数管理、OS差異はアダプタで吸収
// 引数は常に配列(トークナイズ済)
ArgvBox: スペース/クォート解釈は一切しない
// プロセス表現
ProcBox: spawn/exec/wait/kill メソッド、I/OはPipeBox/FileBox
// パスは正規化(/区切りで統一)
PathBox: Windows/Unix差はアダプタで解決
// パイプはBoxで明示
PipelineBox: lhs | rhs も等価メソッドで表現可
```
## 💎 使用例(クォート地獄からの解放)
### 従来のシェル(地獄)
```bash
# スペースとクォートの悪夢
git commit -m "fix: handle 'quotes' and \"escapes\" properly"
tar czf archive.tar.gz $(find . -name "*.md" -o -name "*.txt")
```
### 簡単マン流シェル(天国)
```nyash
// クォート不要!配列で書く
Cmd(["git", "commit", "-m", "fix: handle 'quotes' and \"escapes\" properly"])
.run(cwd, env).wait()
// 変数展開も明示的
let files = Glob("*.{md,txt}").expand(cwd)
Cmd(["tar", "czf", "archive.tar.gz"].concat(files))
.run(cwd, env).wait()
```
## 🚀 思考速度UI設計
### 反応速度の約束
- **20ms以内**: タイプ開始〜候補提示
- **80ms以内**: 実行プレビュー表示
- **モードレス**: 学習不要・覚えるコマンド最小
### UI構成要素全部Box
```nyash
InputLineBox: 1行入力、文脈で自動パース
SuggestBox: リアルタイム3レベル候補コマンド/アクション/引数)
ArgChipsBox: 引数を"チップ"で視覚化Tab/矢印で移動)
PreviewBox: 実行前プレビュー(結果サマリ/影響件数/危険度)
HistoryStackBox: 直前操作の即戻しCtrl+Z/Y
```
### 入力体験
```
git → [commit, status, log] → commit → [message:"", add:[]]
→ Preview: "3 files staged, commit message: fix"
→ Enter実行
```
## 🐳 軽量コンテナ統合Docker級をシンプルに
### コンテナもBox
```nyash
// イメージからコンテナ作成
let img = ImageBox.from_tar("ubuntu-min.tar")
let fs = FSBox.overlay(img, rw_dir="/tmp/ctr1")
let net = NetBox.bridge("ny0").expose(8080->80)
// コンテナ構成
let ctr = ContainerBox {
fs, net,
env: EnvBox.default().set("RUST_LOG", "info"),
ns: NamespaceBox.default().isolate_pid().isolate_mount(),
caps: CapsBox.minimal().seccomp_profile("default"),
cmd: Cmd(["/usr/bin/nginx", "-g", "daemon off;"])
}
// 実行・操作
ctr.start()
let logs = ctr.attach_stdout()
ctr.exec(Cmd(["ls", "-la", "/"]))
ctr.stop()
ctr.commit("myimg:latest")
```
### fini伝播による確定的クリーンアップ
- プロセスkill → アンマウント → veth破棄 → temp削除
- GCオン/オフでも観測等価
## 📺 ハイブリッドシェルテキスト最小GUI
### 設計原則
1. **真実はテキスト**: 常にテキスト実行可能CLI互換
2. **GUIは注釈**: テキスト結果に薄いメタを添えるだけ
3. **レンダはクライアント責務**: サーバは重いUIを送らない
### メッセージ設計(超軽量)
```bash
git status
```
```json
{"ui":"table","cols":["file","status"],"data":[["src/app.rs","M"],["README.md","U"]]}
```
### 3テンプレートで統一
- `table`: ファイル一覧、git status等
- `list`: 検索結果、ファイル列挙等
- `log`: 実行ログ、HTTPレスポンス等
## 🔒 セキュリティ・安全性
### 構造化による根本解決
- **インジェクション不可能**: すべて配列引数
- **暗黙展開禁止**: $VAR、*, ? の自動展開なし
- **AllowList**: 実行可能コマンド限定
- **Timeout/Limit**: リソース制限明示
### Lintルール
- L1: スペース区切り文字列禁止 → 配列で書け
- L2: 環境変数の暗黙展開禁止 → env.get()使用
- L3: 相対パスのみ警告 → cwd明示
- L4: 未捕捉stderr警告
## 📅 実装ロードマップ
### Phase 1: 構造シェル基盤1週間
- [ ] CmdBox + EnvBox配列引数/UTF-8
- [ ] PipelineBox + PipeBoxパイプ実装
- [ ] File redirect + GlobBox
- [ ] 基本Lintルール実装
### Phase 2: 思考速度UI1週間
- [ ] SuggestBox20ms補完
- [ ] ArgChipsBox引数可視化
- [ ] PreviewBox80msプレビュー
- [ ] HistoryStackBoxUndo/Redo
### Phase 3: コンテナ統合2週間
- [ ] ContainerBox基盤
- [ ] FSBoxoverlay/bind
- [ ] NetBoxbridge/port
- [ ] NamespaceBox隔離
### Phase 4: ハイブリッドGUI1週間
- [ ] 3テンプレート実装
- [ ] UiMetaBox設計
- [ ] テキスト↔GUI等価性
- [ ] WebSocket/stdio両対応
## 💡 期待される革命
1. **開発効率10倍**: クォート地獄・OS差異から解放
2. **学習コスト1/10**: Everything is Boxで統一
3. **事故率1/100**: 構造化・明示化で根本安全
4. **思考速度実現**: 20ms反応でストレスフリー
---
*「簡単マン」の究極形態 - すべてが箱になった世界*