feat(scripting): add sprintf2 command and fix prompt-wait race (v0.1.2)

- Add TeraTerm-compatible sprintf2 (C printf formatting into a string var)

- Fix SVOS power-cycle script racing ahead by gating prompt waits behind output-completion markers

- Bump version to 0.1.2; docs and README updates
This commit is contained in:
2026-06-04 14:13:43 +08:00
parent a8dc3d4a7a
commit 7b8f04e1dd
14 changed files with 1454 additions and 37 deletions
+65 -1
View File
@@ -32,6 +32,7 @@ ETTerms 是一個給工程師 / 韌體 / 硬體驗證人員用的**單一視窗
| 祕密儲存 | **Windows Credential Manager**DPAPI / CredMan | 連線密碼、SSH key passphrase,不落地明碼 |
| PDU 控制(選用) | **SnmpSharpNet** | 沿用 MyTeraTerm PDU 控制(`pductrl` / `pduconnect` |
| 日誌 | 自製 **AppLogger**(從 MyTeraTerm 移植) | 檔案 + Debug 雙輸出 |
| AI / MCP 整合(選用) | **stdio MCP server**(官方 C# SDK `ModelContextProtocol` | 獨立行程把 serial port 暴露成 AI 可呼叫工具(Kiro CLI / Claude CLI),見 [AI / MCP Integration](#ai--mcp-integrationserial-mcp-server) |
| 打包 | `dotnet publish` + (選用)Inno Setup / MSIX | 單機安裝,current-user |
> **與舊版 MyTeraTerm 的關鍵差異:** 舊版是把真正的 `ttermpro.exe`TeraTerm)嵌進 Panel,靠 **com0com 虛擬 COM 對**攔截 serial 來跑腳本。ETTerms 改走**全原生**SSH.NET 做 SSH、`System.IO.Ports` 做 serial、自繪 VT100 控制項做終端機畫面,**不再依賴外部 TeraTerm exe,也不再需要 com0com**。腳本引擎從「驅動 com0com bridge」改成「驅動原生 `ISessionChannel`」。
@@ -108,7 +109,7 @@ ETTerms/
│ └── MyTeraTerm/ # Script 參考專案(舊版 WinForms
└── src/
── ETTerms/ # 主應用程式(WinForms
── ETTerms/ # 主應用程式(WinForms
├── Program.cs # 進入點
├── ETTerms.csproj # net8.0-windows, UseWindowsForms
@@ -158,6 +159,11 @@ ETTerms/
├── AppLogger.cs # 日誌 (port 自 MyTeraTerm)
├── AppSettings.cs # 使用者偏好 (JSON, %LocalAppData%\ETTerms\settings.json)
└── NativeTheme.cs # 深色標題列 (DWM)
└── ETTerms.SerialMcp/ # 🔜 Serial MCP serverstdio,給 AI agent 直接操作 serial
├── Program.cs # stdio MCP host 進入點
├── SerialTools.cs # serial_list / open / write / read / close 工具
└── ETTerms.SerialMcp.csproj# net8.0 console + ModelContextProtocol SDK
```
> **`For_AI/` 內含兩份參考專案**`KKTerm-main`UI 參考,Tauri+React 的 Windows 工作台)與 `MyTeraTerm`Script 參考,舊版嵌 TeraTerm 的 WinForms)。整個 `For_AI/` 已 gitignore,僅供開發時對照,不進 repo。
@@ -342,6 +348,54 @@ ScriptRunner.RunAsync(scriptText, activeChannel)
---
## AI / MCP IntegrationSerial MCP Server
> 讓 **Kiro CLI / Claude CLI** 等 AI agent 直接對 serial port 下指令、讀輸出。ETTerms 額外提供一支獨立的 **stdio MCP server**`src/ETTerms.SerialMcp/`),把 serial port 包成 AI 可呼叫的工具。它與 WinForms 主程式**各自獨立行程**:由 MCP clientKiro CLI / Claude CLI)啟動並維持整個 session 存活,因此能**持續持有 COM port**——連線狀態可跨多次工具呼叫保留,也能接收裝置主動推送的非同步輸出。
**為何要獨立常駐行程?** CLI agent 的每條 shell 指令都是一個新行程,`open→write→read` 無法跨呼叫保留狀態(port 一關就斷)。常駐的 MCP server 才能維持一條連線、累積 RX。
```
┌── Kiro CLI / Claude CLI (MCP client) ──┐
│ AI 呼叫工具:serial_open / write... │
└───────────────┬─────────────────────────┘
│ stdio (JSON-RPC 2.0)
┌───────────────┴─────────────────────────┐
│ ETTerms.SerialMcp (常駐行程) │
│ 背景 reader 累積 RX → serial_read 取出 │
│ │ System.IO.Ports.SerialPort │
└────────┼─────────────────────────────────┘
│ ← COM 互斥:與 GUI 不可同開同一 port →
[ 實體 COM port / UART / 開發板 ]
```
### 暴露的工具
| 工具 | 參數 | 說明 |
|------|------|------|
| `serial_list` | — | 列出可用 COM port`SerialPort.GetPortNames()` |
| `serial_open` | portName, baudRate, dataBits, parity, stopBits, handshake, newLine | 開啟並持有 port(啟動背景 reader 累積 RX |
| `serial_write` | text, appendNewLine? | 送出文字(可選附加換行) |
| `serial_read` | waitFor?, timeoutMs? | 取出 RX 緩衝;可等待特定字串或逾時 |
| `serial_close` | — | 關閉 port |
### 設計重點
- **技術:** .NET 8 console`net8.0`,無 WinForms+ 官方 C# MCP SDK`ModelContextProtocol`),stdio / JSON-RPC 2.0。
- **參數語意:** 直接用 `System.IO.Ports.SerialPort`,與主程式的 `SerialSettings` 同一組參數(PortName / BaudRate / DataBits / Parity / StopBits / Handshake / NewLine)。
- **COM 互斥:** MCP server 開了某 port 時,ETTerms GUI 不可同時開同一 port(反之亦然)——一個 COM 同時只能被一個行程開啟。
- **安全:** 本機、無雲、不碰 credential;僅操作硬體 serial。
### 註冊(Kiro CLI
```powershell
kiro-cli mcp add --name serial --command dotnet `
--args "run --project src\ETTerms.SerialMcp\ETTerms.SerialMcp.csproj"
```
或寫進 agent.json 的 `mcpServers`Claude CLI 則用其對應的 `mcpServers` 設定。註冊後直接對 AI 說「列出 COM port、開 COM3 115200、送 AT 看回應」即可。
---
## Key Constraints & Business Rules
1. **單機、無雲:** 所有連線 metadata 存本機 SQLite,密碼存 Windows Credential Manager,不回傳任何遙測。
@@ -505,12 +559,22 @@ dotnet publish src\ETTerms\ETTerms.csproj -c Release -r win-x64 --self-contained
- [ ] `dotnet publish` + Inno Setup / MSIX 安裝程式(待使用者指示)
**驗收條件:** ✅ PDU 指令可用;Settings 重啟保留;Local Shell 行為正常(ConPTY);SFTP 可瀏覽遠端目錄。打包待後續。
### Phase 9 — AI 整合:Serial MCP Server(工作量:S)🔜 規劃中
**目標:** 提供獨立 stdio MCP server,讓 Kiro CLI / Claude CLI 等 AI agent 直接對 serial port 下指令、讀輸出。
**包含:**
- [ ] `src/ETTerms.SerialMcp/`.NET 8 console + 官方 C# MCP SDK`ModelContextProtocol`),stdio / JSON-RPC
- [ ] 工具:`serial_list` / `serial_open` / `serial_write` / `serial_read`(含 `waitFor` + `timeout`/ `serial_close`
- [ ] 常駐持有 COM port + 背景 reader 累積 RX(跨呼叫保留狀態、可收 async 輸出)
- [ ] 註冊說明(`kiro-cli mcp add` / agent.json `mcpServers`)寫入 README
**驗收條件:** 在 Kiro CLI 註冊後,能透過 AI 對話「列 COM port → 開 COM3 115200 → 送指令 → 讀回應」完成一輪 serial 互動;同一 COM port 不與 GUI 同時開啟。
---
## Future Extensions
這個版本**不做、但未來可能加**
- **AI / MCP 整合**(🔜 已列為 [Phase 9](#development-phases)Serial MCP Server,讓 AI agent 直接操作 serial;未來可再擴充 SSH / Shell MCP 工具)
- ~~**SFTP 檔案瀏覽**~~(✅ 已於 Phase 8 實作:sidebar SFTP 分頁)
- **Telnet** session 類型(補一個 `TelnetChannel : ISessionChannel`
- **RDP / VNC** 分頁(KKTerm 用 mstscax.dllETTerms 可後期評估)