# v0.4.0 Release Notes

> v0.3.0 -> v0.4.0

## Summary

Add four built-in API tools (weather, stock, news, HTTP) and a JSON-driven dynamic API adapter, alongside a Skill auto-matching engine and `patch_edit` tool. Internally, all provider packages migrate to a `provider/` subdirectory, the output layer shifts from `io.Writer` to an event channel model, and file tools are reorganized into a dedicated `internal/tools/file/` subpackage.

<details>
<summary>翻譯</summary>

新增四個內建 API 工具（天氣、股票、新聞、HTTP）與 JSON 驅動的動態 API 擴展套件，同時加入 Skill 自動匹配引擎與 `patch_edit` 工具。內部重構方面，所有 provider 套件遷移至 `provider/` 子目錄，輸出層從 `io.Writer` 改為 Event Channel 模型，檔案工具也整理至獨立的 `internal/tools/file/` 子套件。

</details>

## Changes

### FEAT

- Add `fetch_weather` tool for real-time weather conditions and multi-day forecasts via wttr.in, with automatic XML/JSON response parsing
- Add `fetch_yahoo_finance` tool for stock quotes and candlestick data (interval: `1m`–`1wk`, range: `1d`–`max`)
- Add `fetch_google_rss` tool for Google News RSS search with deduplication and locale/time-range filtering
- Add `apiAdapter` package enabling JSON-config-driven dynamic API tool loading — extend built-in tools without modifying source code
- Add `patch_edit` tool for precise first-match string replacement, safer than full file rewrite
- Add Skill auto-matching engine: LLM selects the best installed Skill from user input; falls back to tool-only mode when no match found
- Add dynamic `.gitignore`-style exclude file parsing and correct `**` wildcard handling in `glob_files`

<details>
<summary>翻譯</summary>

- 新增 `fetch_weather` 工具，透過 wttr.in 取得即時天氣與多日預報，自動解析 XML/JSON 回應格式
- 新增 `fetch_yahoo_finance` 工具，取得股票報價與 K 線資料（interval: `1m`–`1wk`，range: `1d`–`max`）
- 新增 `fetch_google_rss` 工具，支援 Google News RSS 搜尋、去重、語言與時間範圍篩選
- 新增 `apiAdapter` 套件，透過 JSON 設定檔動態載入 API 工具，無需修改原始碼即可擴展內建工具
- 新增 `patch_edit` 工具，精確替換檔案中的第一個匹配字串，比全檔覆寫更安全
- 新增 Skill 自動匹配引擎：LLM 從已安裝的 Skill 中自動選擇最符合需求的項目；無匹配時降級至純工具模式
- 新增動態 `.gitignore` 風格的排除檔解析機制，並修正 `glob_files` 對 `**` 萬用字元的處理邏輯

</details>

### REFACTOR

- Migrate all provider packages (Claude, OpenAI, Copilot, Gemini, Nvidia) from flat `internal/agents/` into `internal/agents/provider/` subdirectory
- Replace `io.Writer` output stream with structured Event Channel model (`internal/agents/types/event.go`) for real-time streaming of text, tool calls, results, and errors
- Reorganize monolithic `internal/tools/file.go` into `internal/tools/file/` subpackage (`readFile`, `writeFile`, `listFiles`, `globFiles`, `patchEdit`, `listExcludes`)
- Serialize googleRSS and yahooFinance output from plain text to JSON for consistent LLM-parseable responses
- Unify `POSTJson`/`POSTForm` into a single `POST` function controlled by `contentType` parameter in `internal/utils`

<details>
<summary>翻譯</summary>

- 將所有 provider 套件（Claude、OpenAI、Copilot、Gemini、Nvidia）從 `internal/agents/` 遷移至 `internal/agents/provider/` 子目錄
- 以結構化 Event Channel 模型（`internal/agents/types/event.go`）取代 `io.Writer` 輸出串流，支援文字、工具呼叫、結果與錯誤的即時串流
- 將單體 `internal/tools/file.go` 拆分為 `internal/tools/file/` 子套件（readFile、writeFile、listFiles、globFiles、patchEdit、listExcludes）
- 將 googleRSS 與 yahooFinance 的格式化輸出從純文字重構為 JSON 序列化，確保 LLM 能一致解析
- 將 `internal/utils` 中的 `POSTJson`/`POSTForm` 合併為以 `contentType` 參數控制格式的統一 `POST` 函式

</details>

### REMOVE

- Remove `internal/agents/sysPrompt.md` (replaced by structured prompt directory `internal/agents/prompt/`)
- Remove `internal/tools/file.go` (split into `internal/tools/file/` subpackage)
- Remove `internal/tools/tools.json` (moved to embedded `internal/tools/embed/tools.json`)

<details>
<summary>翻譯</summary>

- 移除 `internal/agents/sysPrompt.md`（由結構化 prompt 目錄 `internal/agents/prompt/` 取代）
- 移除 `internal/tools/file.go`（已拆分為 `internal/tools/file/` 子套件）
- 移除 `internal/tools/tools.json`（已移至嵌入式 `internal/tools/embed/tools.json`）

</details>

### ADD

- Add `internal/agents/prompt/` directory with `sysPrompt.md`, `sysPromptBase.md`, `skillSelector.md`
- Add embedded config files: `internal/tools/embed/commands.json`, `internal/tools/embed/tools.json`, `internal/tools/file/embed/exclude.json`
- Add `internal/tools/apiAdapter/example.json` as reference template for custom API definitions
- Add `internal/tools/types/executor.go` for shared executor type definitions

<details>
<summary>翻譯</summary>

- 新增 `internal/agents/prompt/` 目錄，包含 `sysPrompt.md`、`sysPromptBase.md`、`skillSelector.md`
- 新增嵌入式設定檔：`internal/tools/embed/commands.json`、`internal/tools/embed/tools.json`、`internal/tools/file/embed/exclude.json`
- 新增 `internal/tools/apiAdapter/example.json` 作為自訂 API 定義的參考範本
- 新增 `internal/tools/types/executor.go`，統一 executor 型別定義

</details>

### STYLE

- Standardize error message format to caller-prefix style across all provider packages and tool executor

<details>
<summary>翻譯</summary>

- 統一所有 provider 套件與工具執行器的 error message 格式為呼叫點前綴風格

</details>

***

## Files Changed

| File | Status | Tag |
|------|--------|-----|
| `internal/tools/apis/weatherReport/fetch.go` | Added | FEAT |
| `internal/tools/apis/yahooFinance/fetch.go` | Added | FEAT |
| `internal/tools/apis/googleRSS/fetch.go` | Added | FEAT |
| `internal/tools/apiAdapter/execute.go` | Added | FEAT |
| `internal/tools/apiAdapter/request.go` | Added | FEAT |
| `internal/tools/apiAdapter/send.go` | Added | FEAT |
| `internal/tools/apiAdapter/translate.go` | Added | FEAT |
| `internal/tools/apiAdapter/translator.go` | Added | FEAT |
| `internal/tools/file/patchEdit.go` | Added | FEAT |
| `internal/tools/file/globFiles.go` | Added | FEAT |
| `internal/tools/file/listExcludes.go` | Added | FEAT |
| `internal/agents/prompt/skillSelector.md` | Added | FEAT |
| `internal/agents/exec.go` | Modified | REFACTOR |
| `internal/agents/types/event.go` | Added | REFACTOR |
| `internal/agents/provider/claude/new.go` | Renamed | REFACTOR |
| `internal/agents/provider/claude/send.go` | Renamed | REFACTOR |
| `internal/agents/provider/copilot/login.go` | Renamed | REFACTOR |
| `internal/agents/provider/copilot/new.go` | Renamed | REFACTOR |
| `internal/agents/provider/copilot/refresh.go` | Renamed | REFACTOR |
| `internal/agents/provider/copilot/send.go` | Renamed | REFACTOR |
| `internal/agents/provider/gemini/new.go` | Renamed | REFACTOR |
| `internal/agents/provider/gemini/send.go` | Renamed | REFACTOR |
| `internal/agents/provider/nvidia/new.go` | Renamed | REFACTOR |
| `internal/agents/provider/nvidia/send.go` | Renamed | REFACTOR |
| `internal/agents/provider/openai/new.go` | Renamed | REFACTOR |
| `internal/agents/provider/openai/send.go` | Renamed | REFACTOR |
| `internal/tools/file/readFile.go` | Added | REFACTOR |
| `internal/tools/file/writeFile.go` | Added | REFACTOR |
| `internal/tools/file/listFiles.go` | Added | REFACTOR |
| `internal/tools/executor.go` | Modified | REFACTOR |
| `internal/utils/utils.go` | Modified | REFACTOR |
| `internal/agents/sysPrompt.md` | Deleted | REMOVE |
| `internal/tools/file.go` | Deleted | REMOVE |
| `internal/tools/tools.json` | Deleted | REMOVE |
| `internal/agents/prompt/sysPrompt.md` | Added | ADD |
| `internal/agents/prompt/sysPromptBase.md` | Added | ADD |
| `internal/tools/embed/commands.json` | Added | ADD |
| `internal/tools/embed/tools.json` | Added | ADD |
| `internal/tools/file/embed/exclude.json` | Added | ADD |
| `internal/tools/apiAdapter/example.json` | Added | ADD |
| `internal/tools/types/executor.go` | Added | ADD |
| `cover.png` | Added | ADD |
| `cmd/cli/main.go` | Modified | STYLE |
| `README.md` | Modified | DOC |
| `README.zh.md` | Modified | DOC |
| `doc.md` | Added | DOC |
| `doc.zh.md` | Added | DOC |
| `go.mod` | Modified | CHORE |
| `go.sum` | Modified | CHORE |
| `.gitignore` | Modified | CHORE |

***

Generated by [SKILL](https://github.com/pardnchiu/skill-version-generate)
