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:
+65
-1
@@ -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 server(stdio,給 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 Integration(Serial MCP Server)
|
||||
|
||||
> 讓 **Kiro CLI / Claude CLI** 等 AI agent 直接對 serial port 下指令、讀輸出。ETTerms 額外提供一支獨立的 **stdio MCP server**(`src/ETTerms.SerialMcp/`),把 serial port 包成 AI 可呼叫的工具。它與 WinForms 主程式**各自獨立行程**:由 MCP client(Kiro 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.dll;ETTerms 可後期評估)
|
||||
|
||||
Reference in New Issue
Block a user