docs: add v0.2.0 changelog & publish convention; drop "Version" label from title

- About: add v0.2.0 "Beta Version Release" changelog entry.
- MainForm: title bar now shows "ETTerms  vX.Y.Z" (drop the word "Version").
- ARCHITECTURE.md + CLAUDE.md: document the publish convention --
  output to src\ETTerms\Publish\ETTerms_v{Version}\, main exe renamed to
  "ETTerms v{Version}.exe", ETTerms.SerialMcp published into a subfolder.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-04 21:39:38 +08:00
co-authored by Claude Opus 4.8
parent e2fa8d87f1
commit 10ec900386
4 changed files with 63 additions and 5 deletions
+45 -2
View File
@@ -480,13 +480,56 @@ cd F:\10_AI\ETTerms
dotnet build dotnet build
dotnet run --project src\ETTerms\ETTerms.csproj dotnet run --project src\ETTerms\ETTerms.csproj
# 5. 打包(後期 Phase # 5. 打包(見下方「Publish / 打包慣例」
dotnet publish src\ETTerms\ETTerms.csproj -c Release -r win-x64 --self-contained false dotnet publish src\ETTerms\ETTerms.csproj -c Release -r win-x64 --self-contained false `
-o src\ETTerms\Publish\ETTerms_v<Version>
# 後續可用 Inno Setup / MSIX 做安裝程式 # 後續可用 Inno Setup / MSIX 做安裝程式
``` ```
--- ---
## Publish / 打包慣例
> 每次發 Release 都依此規則產出,方便辨識版本與一併攜帶 MCP server。
**輸出位置(固定):** `src\ETTerms\Publish\ETTerms_v{Version}\`
- `{Version}` 取自 `src\ETTerms\ETTerms.csproj``<Version>`(例:`0.2.0`)。
- 資料夾命名:`ETTerms_v{Version}`(前綴 `v`,例:`ETTerms_v0.2.0`)。
- `Publish/` 已 gitignore`publish/`),**不入 git**。
**內容結構:**
```
ETTerms_v0.2.0\
├── ETTerms v0.2.0.exe # 主程式 apphost,改名為「ETTerms v{Version}.exe」
├── ETTerms.dll + 各相依 dll # SSH.NET / SQLite / SnmpSharpNet / System.IO.Ports …
└── ETTerms.SerialMcp\ # Serial MCP server,獨立發佈到子資料夾(相依 dll 與 GUI 隔離)
├── ETTerms.SerialMcp.exe
└── ETTerms.SerialMcp.dll + 相依
```
**規則:**
1. **GUI 與 MCP 都發佈**:主程式發到 `ETTerms_v{Version}\``ETTerms.SerialMcp` 發到其下 **`ETTerms.SerialMcp\` 子資料夾**(兩者相依 dll 不互相覆蓋)。
2. **主 exe 改名**`dotnet publish` 產生的 `ETTerms.exe` 重新命名為 **`ETTerms v{Version}.exe`**。
- 可安全改名:.NET apphost 內部記錄要載入的 `ETTerms.dll`,**不靠自身檔名**,改名後仍正常啟動。
3. **框架相依**`--self-contained false -r win-x64`(目標機需已裝 .NET 8 Desktop Runtime)。
**PowerShell 範例:**
```powershell
$ver = ([regex]::Match((Get-Content src\ETTerms\ETTerms.csproj -Raw), '<Version>([^<]+)</Version>')).Groups[1].Value
$root = "src\ETTerms\Publish\ETTerms_v$ver"
if (Test-Path $root) { Remove-Item $root -Recurse -Force }
# 1) GUI
dotnet publish src\ETTerms\ETTerms.csproj -c Release -r win-x64 --self-contained false -o $root
Rename-Item (Join-Path $root "ETTerms.exe") "ETTerms v$ver.exe"
# 2) Serial MCP server → 子資料夾
dotnet publish src\ETTerms.SerialMcp\ETTerms.SerialMcp.csproj -c Release -r win-x64 --self-contained false `
-o (Join-Path $root "ETTerms.SerialMcp")
```
---
## Development Phases ## Development Phases
> 依使用者要求「**前面先把 GUI 做出來,後面再慢慢補功能**」排序: > 依使用者要求「**前面先把 GUI 做出來,後面再慢慢補功能**」排序:
+7 -2
View File
@@ -38,8 +38,12 @@ dotnet run --project src\ETTerms\ETTerms.csproj
# 加套件 # 加套件
dotnet add src\ETTerms package SSH.NET dotnet add src\ETTerms package SSH.NET
# 打包 # 打包(見「Publish / 打包慣例」,輸出固定到 src\ETTerms\Publish\ETTerms_v{Version}\
dotnet publish src\ETTerms\ETTerms.csproj -c Release -r win-x64 --self-contained false $ver = ([regex]::Match((Get-Content src\ETTerms\ETTerms.csproj -Raw), '<Version>([^<]+)</Version>')).Groups[1].Value
$root = "src\ETTerms\Publish\ETTerms_v$ver"
dotnet publish src\ETTerms\ETTerms.csproj -c Release -r win-x64 --self-contained false -o $root
Rename-Item (Join-Path $root "ETTerms.exe") "ETTerms v$ver.exe"
dotnet publish src\ETTerms.SerialMcp\ETTerms.SerialMcp.csproj -c Release -r win-x64 --self-contained false -o (Join-Path $root "ETTerms.SerialMcp")
# 註冊 Serial MCP server(給 AI agent 操作 serial # 註冊 Serial MCP server(給 AI agent 操作 serial
kiro-cli mcp add --name serial --command dotnet --args "run --project src\ETTerms.SerialMcp\ETTerms.SerialMcp.csproj" kiro-cli mcp add --name serial --command dotnet --args "run --project src\ETTerms.SerialMcp\ETTerms.SerialMcp.csproj"
@@ -48,6 +52,7 @@ kiro-cli mcp add --name serial --command dotnet --args "run --project src\ETTerm
## 開發慣例 ## 開發慣例
- **命名:** PascalCase 類別 / 方法,`_camelCase` 私有欄位;檔名 = 類別名。 - **命名:** PascalCase 類別 / 方法,`_camelCase` 私有欄位;檔名 = 類別名。
- **Publish / 打包:** 固定輸出到 `src\ETTerms\Publish\ETTerms_v{Version}\``{Version}` 取自 csproj `<Version>`);主 exe 改名為 `ETTerms v{Version}.exe``ETTerms.SerialMcp` 一併發到其下 `ETTerms.SerialMcp\` 子資料夾。框架相依(`--self-contained false -r win-x64`)。詳見 [ARCHITECTURE.md](ARCHITECTURE.md#publish--打包慣例)。
- **分層:** UI`App/`)只認 `ISessionChannel` 抽象,不直接相依 SSH.NET / SerialPort。 - **分層:** UI`App/`)只認 `ISessionChannel` 抽象,不直接相依 SSH.NET / SerialPort。
- **執行緒:** channel I/O 在背景;所有 UI 更新一律 `Control.Invoke` 回 UI thread。 - **執行緒:** channel I/O 在背景;所有 UI 更新一律 `Control.Invoke` 回 UI thread。
- **commit** 走 Conventional Commits`feat:` / `fix:` / `refactor:` …)。 - **commit** 走 Conventional Commits`feat:` / `fix:` / `refactor:` …)。
+10
View File
@@ -177,6 +177,16 @@ public sealed class AboutView : UserControl
private static readonly ChangelogEntry[] Changelog = private static readonly ChangelogEntry[] Changelog =
[ [
new("0.2.0", new DateOnly(2026, 6, 4), "Beta Version Release",
[
"Phase 9: Serial MCP server — AI agents can send/receive serial while you watch live in the GUI.",
"GUI is the sole COM-port owner; the MCP server bridges over a local named pipe (never opens the port itself).",
"MCP tools: serial_list / serial_attach / serial_write / serial_read / serial_detach.",
"AI-sourced output is echoed into the terminal tagged [AI] so you see exactly what the AI sees.",
"New app icon for the window title bar, taskbar and executable; version now shown in the title bar.",
"About page now displays the app icon.",
"Beta Version: expect bugs and missing features. Feedback welcome!",
]),
new("0.1.0", new DateOnly(2026, 6, 3), "Initial Release", new("0.1.0", new DateOnly(2026, 6, 3), "Initial Release",
[ [
"Beta Version: expect bugs and missing features. Feedback welcome!", "Beta Version: expect bugs and missing features. Feedback welcome!",
+1 -1
View File
@@ -39,7 +39,7 @@ public partial class MainForm : Form
var v = Assembly.GetExecutingAssembly().GetName().Version; var v = Assembly.GetExecutingAssembly().GetName().Version;
var versionStr = v != null ? $"{v.Major}.{v.Minor}.{v.Build}" : "0.1.0"; var versionStr = v != null ? $"{v.Major}.{v.Minor}.{v.Build}" : "0.1.0";
Text = $"ETTerms Version v{versionStr}"; Text = $"ETTerms v{versionStr}";
} }
private void BuildLayout() private void BuildLayout()