分析 Legacy Java Spring Boot 專案中的特定領域邏輯與業務流程
Analyzes specific domain logic in legacy Java Spring Boot projects by tracing call chains from API endpoints to database operations, generating structured documentation.
/plugin marketplace add DennisLiuCk/claude-plugin-marketplace/plugin install legacy-analyzer@claude-plugin-marketplace-zh-tw針對使用者指定的領域/功能關鍵字,深度分析 Java Spring Boot 專案中的相關邏輯與完整調用鏈。
使用方式:
/legacy-analyzer:analyze-java-domain 請分析商品建立的流程
/legacy-analyzer:analyze-java-domain 分析訂單取消邏輯
/legacy-analyzer:analyze-java-domain 整理用戶註冊流程
與 analyze-java 的差異:
analyze-java:掃描全專案,生成完整文件(7-9 分鐘)analyze-java-domain:定向搜尋特定領域,深度追蹤調用鏈(3-5 分鐘)只搜尋以下檔案類型:
.java - Java 原始碼(Controller, Service, Repository, Entity 等).xml - MyBatis Mapper 檔案(SQL 查詢邏輯)排除的檔案:
pom.xml - Maven 依賴定義build.gradle - Gradle 依賴定義.yml / .yaml / .properties - 配置檔(與領域邏輯無關)Grep 搜尋時必須使用 glob 參數限制範圍:
# 正確方式
Grep: pattern="關鍵字" glob="*.java"
Grep: pattern="關鍵字" glob="*.xml" (排除 pom.xml 的結果)
# 錯誤方式(不要這樣做)
Grep: pattern="關鍵字" (會搜尋所有檔案)
要執行此操作,請精確遵循以下步驟:
解析使用者輸入,識別:
輸出搜尋策略 JSON:
{
"user_query": "商品建立的流程",
"domain": "商品建立",
"search_keywords": {
"chinese": ["商品", "產品", "建立", "新增", "創建"],
"english": ["Product", "Item", "Goods", "Create", "Add", "Save"],
"method_patterns": ["create.*Product", "add.*Product", "save.*Product", "insert.*Product"],
"class_patterns": ["Product.*Controller", "Product.*Service", "Product.*Repository"],
"api_patterns": ["/product", "/products", "POST.*product"]
}
}
使用 TodoWrite 建立待辦事項清單
創建工作目錄:.legacy-analysis/domain-{keyword}-{timestamp}/
使用 Haiku 代理快速檢查專案並找出入口點:
代理任務:
搜尋策略(必須限制檔案類型):
# 搜尋 Controller 中的相關端點(只搜尋 .java)
Grep: pattern="@(Post|Put|Get|Delete)Mapping.*product" glob="*.java"
Grep: pattern="@RequestMapping.*product" glob="*.java"
# 搜尋 Service 中的相關方法(只搜尋 .java)
Grep: pattern="(create|add|save|insert).*Product" glob="*.java"
# 搜尋類別定義(只搜尋 .java)
Grep: pattern="class.*Product.*(Controller|Service|Repository)" glob="*.java"
# 搜尋 MyBatis Mapper 中的相關 SQL(只搜尋 .xml,排除 pom.xml)
Grep: pattern="<(select|insert|update|delete).*product" glob="*.xml"
# 注意:過濾結果時排除 pom.xml
輸出入口點 JSON:
{
"project_valid": true,
"total_matches": 45,
"entry_points": [
{
"type": "controller",
"file": "src/main/java/com/example/controller/ProductController.java",
"method": "createProduct",
"http_method": "POST",
"path": "/api/products",
"line": 67
},
{
"type": "controller",
"file": "src/main/java/com/example/controller/ProductController.java",
"method": "addProduct",
"http_method": "POST",
"path": "/api/products/add",
"line": 112
}
],
"related_classes": [
"ProductController",
"ProductService",
"ProductServiceImpl",
"ProductRepository",
"Product",
"ProductDTO"
]
}
如果匹配數量 = 0,輸出建議並終止:
❌ 找不到與「{領域關鍵字}」相關的程式碼
建議嘗試:
1. 使用不同的關鍵字(如「商品」改為「Product」或「Item」)
2. 確認專案中是否有此功能
3. 使用 /legacy-analyzer:analyze-java 進行全專案掃描
將入口點資訊寫入:.legacy-analysis/domain-{keyword}-{timestamp}/01-entry-points.json
對於每個入口點,啟動一個 Sonnet 代理進行深度追蹤。
如果入口點 <= 3 個:全部並行啟動 如果入口點 > 3 個:只追蹤最重要的 3 個(根據 HTTP 方法優先級:POST > PUT > DELETE > GET)
每個追蹤代理的任務:
從入口點開始,遞歸追蹤完整的調用鏈:
Controller.method()
↓ 調用
Service.method()
↓ 調用
Repository.method()
↓ 操作
Entity
追蹤步驟:
a. 讀取入口 Controller 方法:
b. 追蹤 Service 層:
c. 追蹤 Repository 層:
# 根據 Repository/Mapper 介面名稱搜尋對應的 XML
Glob: pattern="**/ProductMapper.xml"
# 或搜尋 XML 中的 namespace
Grep: pattern="namespace.*ProductMapper" glob="*.xml"
d. 追蹤 MyBatis Mapper XML(如果存在):
e. 分析相關 Entity:
f. 識別橫切關注點:
輸出調用鏈 JSON:
{
"entry_point": {
"file": "ProductController.java",
"method": "createProduct",
"line": 67
},
"call_chain": [
{
"level": 0,
"type": "controller",
"class": "ProductController",
"method": "createProduct(ProductDTO)",
"file": "src/.../ProductController.java",
"lines": "67-85",
"annotations": ["@PostMapping", "@Valid"],
"description": "接收商品建立請求,驗證輸入",
"calls": ["productService.createProduct"]
},
{
"level": 1,
"type": "service",
"class": "ProductServiceImpl",
"method": "createProduct(ProductDTO)",
"file": "src/.../ProductServiceImpl.java",
"lines": "45-78",
"annotations": ["@Transactional"],
"description": "核心業務邏輯:檢查商品名稱重複、設定預設值、保存商品",
"calls": ["productRepository.existsByName", "productRepository.save"],
"business_rules": [
"商品名稱不可重複",
"價格必須大於 0",
"庫存預設為 0"
]
},
{
"level": 2,
"type": "repository",
"class": "ProductRepository",
"method": "save(Product)",
"file": "src/.../ProductRepository.java",
"lines": "12",
"description": "JPA 內建方法,保存 Entity 到資料庫",
"calls": []
},
{
"level": 2,
"type": "mybatis-mapper",
"class": "ProductMapper",
"method": "insertProduct",
"file": "src/main/resources/mapper/ProductMapper.xml",
"lines": "25-35",
"sql_type": "insert",
"description": "MyBatis INSERT 語句,將商品資料插入 products 表",
"sql_snippet": "INSERT INTO products (name, price, stock) VALUES (#{name}, #{price}, #{stock})",
"dynamic_sql": false,
"calls": []
}
],
"mybatis_mappers": [
{
"interface": "ProductMapper.java",
"xml": "src/main/resources/mapper/ProductMapper.xml",
"statements": [
{"id": "insertProduct", "type": "insert", "line": 25},
{"id": "selectByName", "type": "select", "line": 40}
]
}
],
"entities_involved": [
{
"class": "Product",
"file": "src/.../entity/Product.java",
"table": "products",
"key_fields": ["id", "name", "price", "stock", "categoryId"]
},
{
"class": "ProductDTO",
"file": "src/.../dto/ProductDTO.java",
"purpose": "請求/響應資料傳輸物件"
}
],
"cross_cutting": {
"transaction": "@Transactional on ProductServiceImpl.createProduct",
"validation": "@Valid on request body",
"exception_handling": "throws ProductAlreadyExistsException"
}
}
重要規則:
src/main/resources/mapper/ 或類似目錄等待所有追蹤代理完成,收集結果
合併所有調用鏈並寫入:.legacy-analysis/domain-{keyword}-{timestamp}/02-call-chains.json
從調用鏈中提取發現(Findings):
將調用鏈轉換為結構化發現,每個發現代表一個重要的知識點:
發現類型:
entry-point:API 入口點business-logic:業務邏輯data-operation:資料操作validation:驗證規則transaction:事務管理exception:異常處理entity:資料模型mybatis-sql:MyBatis SQL 語句(來自 .xml mapper)mybatis-dynamic:MyBatis 動態 SQL(if, choose, foreach)發現格式(與 analyze-java 相容):
{
"finding_id": "DOMAIN-001",
"type": "entry-point",
"title": "商品建立 API 端點",
"description": "POST /api/products 端點接收商品建立請求,使用 @Valid 驗證輸入的 ProductDTO",
"evidence": [
{
"file": "src/main/java/com/example/controller/ProductController.java",
"lines": "67-85",
"snippet": "@PostMapping\npublic ResponseEntity<Product> createProduct(@Valid @RequestBody ProductDTO dto)"
}
],
"importance": "high",
"call_chain_ref": "chain-1"
}
對每個發現啟動 Haiku 代理進行評分(與 analyze-java 相同的評分機制):
評分維度:
輸出格式:
{
"finding_id": "DOMAIN-001",
"scores": {
"evidence": 95,
"importance": 90,
"completeness": 85,
"accuracy": 95
},
"total_score": 92.25,
"confidence_level": "very_high"
}
⚠️ MANDATORY: 等待所有評分完成,不可跳過
將評分結果寫入:.legacy-analysis/domain-{keyword}-{timestamp}/03-scores.json
應用過濾規則(與 analyze-java 相同):
按調用鏈順序組織發現:
寫入結構化資料:.legacy-analysis/domain-{keyword}-{timestamp}/04-structured.json
⚠️ 重要:為避免單一文件過大導致 token 限制問題,採用分檔策略
文件目的:幫助工程師/開發者/新人理解現有專案的 domain know-how 與 project design。
必須刪除的內容類型:
必須保留的內容類型:
程式碼引用原則:
ProductService.java:45-60)避免重複原則:
依章節分檔生成,每個章節由獨立的 Sonnet 代理生成:
輸入(所有代理共用):
由主 session 直接生成,內容:
# {領域名稱} 領域分析
> 本文件幫助你理解 {領域名稱} 的現有實作,不包含改善建議。
## API 端點總覽
| HTTP 方法 | 路徑 | Controller 方法 | 用途 |
|-----------|------|----------------|------|
| POST | /api/products | createProduct | 建立商品 |
| GET | /api/products/{id} | getProduct | 查詢商品 |
## 文件索引
| 文件 | 說明 | 目標讀者 |
|------|------|----------|
| [01-概述](./01-overview.md) | 領域概念、架構全貌 | 新人、PM |
| [02-調用鏈](./02-call-chains.md) | 程式碼導覽、呼叫路徑 | 開發者 |
| [03-資料模型](./03-data-model.md) | DTO/Entity/Enum 參考 | 開發者 |
| [04-業務規則](./04-business-rules.md) | 業務邏輯、錯誤碼 | 開發者、QA |
| [05-檔案索引](./05-guide.md) | 檔案位置速查 | 開發者 |
## 快速統計
- 入口點: {N} 個
- 調用鏈: {M} 條
- 涉及類別: {K} 個
代理任務:生成領域概述和架構圖
保留內容:
刪除內容:
Mermaid 圖表限制:
代理任務:說明程式碼呼叫路徑
保留內容:
刪除內容:
程式碼片段限制:
檔案名:行號// ... 完整實作請見原始檔案 結尾調用鏈呈現格式(精簡版):
### 調用鏈 1: 建立商品
| 層級 | 類別.方法 | 檔案位置 | 說明 |
|------|----------|----------|------|
| 0 | ProductController.createProduct | ProductController.java:67 | 接收請求 |
| 1 | ProductService.createProduct | ProductServiceImpl.java:45 | 業務邏輯 |
| 2 | ProductRepository.save | ProductRepository.java:12 | 資料存取 |
**關鍵邏輯** (`ProductServiceImpl.java:50-55`):
```java
if (productRepository.existsByName(dto.getName())) {
throw new ProductAlreadyExistsException();
}
return productRepository.save(product);
// ... 完整實作請見原始檔案
---
### 文件 4: 資料模型 (03-data-model.md) - 目標 ~200 行
**代理任務**:說明資料結構(唯一來源)
**保留內容**:
- DTO/Entity 關係圖(Mermaid erDiagram)
- Entity 欄位說明表格(類別、欄位、型別、說明)
- DTO 欄位說明表格
- Enum 定義表格
- 常數定義表格(唯一位置)
- 資料流轉說明(簡短)
**刪除內容**:
- ❌ 效能考量
- ❌ 測試資料範例
- ❌ 假設性的表結構
- ❌ 簡化範例 DTO 程式碼
**表格格式範例**:
```markdown
## Entity: Product (`ProductEntity.java:15`)
| 欄位 | 型別 | 對應資料表欄位 | 說明 |
|------|------|---------------|------|
| id | Long | product_id | 主鍵 |
| name | String | product_name | 商品名稱 |
代理任務:整理現有業務規則(唯一來源)
保留內容:
刪除內容:
表格格式範例:
## 業務規則
| 規則 | 程式碼位置 | 說明 |
|------|-----------|------|
| 商品名稱不可重複 | ProductServiceImpl.java:48 | 建立前檢查 |
| 價格必須大於 0 | ProductDTO.java:23 | @Min(1) 驗證 |
## 錯誤碼對照
| 錯誤碼 | HTTP 狀態 | 訊息 | 觸發條件 |
|--------|----------|------|----------|
| PRODUCT_001 | 409 | 商品名稱已存在 | 名稱重複 |
代理任務:提供檔案位置速查(最有價值的參考)
保留內容:
刪除內容:
檔案清單格式:
## 相關檔案
### Controllers
- `src/main/java/.../ProductController.java` - 商品 API 入口
### Services
- `src/main/java/.../ProductService.java` - 介面
- `src/main/java/.../ProductServiceImpl.java` - 實作
### Tests
- `src/test/java/.../ProductServiceTest.java`
- `src/test/java/.../ProductControllerTest.java`
## 常見問題
| 問題 | 相關檔案 |
|------|----------|
| 商品建立失敗 | ProductServiceImpl.java:48 |
| 價格驗證錯誤 | ProductDTO.java:23 |
撰寫風格(所有文件通用):
檔案名:行號並行生成文件:
啟動 4 個 Sonnet 代理並行生成文件 2-5:
01-overview.md(目標 ~150 行)02-call-chains.md(目標 ~200 行)03-data-model.md(目標 ~200 行)04-business-rules.md(~150 行)+ 05-guide.md(~100 行)主 session 同時生成 00-INDEX.md(目標 ~50 行)
預期總行數:約 850 行(相比原本 4000+ 行減少約 80%)
將所有文件寫入:.legacy-analysis/domain-{keyword}-{timestamp}/docs/
docs/
├── 00-INDEX.md # 索引頁 (~50 行)
├── 01-overview.md # 概述 (~150 行)
├── 02-call-chains.md # 調用鏈 (~200 行)
├── 03-data-model.md # 資料模型 (~200 行)
├── 04-business-rules.md # 業務規則 (~150 行)
└── 05-guide.md # 檔案索引 (~100 行)
顯示完成摘要:
╔═══════════════════════════════════════════════════════════╗
║ Legacy Domain Analyzer - 領域分析完成 ║
╚═══════════════════════════════════════════════════════════╝
🎯 分析領域: {領域關鍵字}
📁 工作目錄: .legacy-analysis/domain-{keyword}-{timestamp}/
📄 生成的文件:
├─ 01-entry-points.json (入口點 {N} 個)
├─ 02-call-chains.json (調用鏈 {M} 條)
├─ 03-scores.json (評分結果)
├─ 04-structured.json (結構化發現 {K} 個)
└─ docs/ (領域分析文件 - 精簡版) ⭐
├─ 00-INDEX.md (~50 行) 索引與 API 總覽
├─ 01-overview.md (~150 行) 概述與架構圖
├─ 02-call-chains.md (~200 行) 調用鏈詳解
├─ 03-data-model.md (~200 行) 資料模型
├─ 04-business-rules.md (~150 行) 業務規則
└─ 05-guide.md (~100 行) 檔案索引
📊 分析統計:
- 總執行時間: {X} 分 {Y} 秒
- 追蹤的調用鏈: {M} 條
- 文件總行數: ~850 行(精簡版)
- 平均置信度: {score}
🔗 主要入口點:
1. POST /api/products → ProductController.createProduct
2. ...
📖 閱讀指南:
- 新人/PM: 從 00-INDEX.md → 01-overview.md
- 開發者: 02-call-chains.md → 03-data-model.md
- QA: 04-business-rules.md
💡 文件特色:
- 專注於「理解現有專案」,不含改善建議
- 每個資訊只出現一次,無重複內容
- 所有程式碼引用包含檔案路徑和行號
- 總計約 850 行(相比完整版減少 80%)
並行執行:
精簡文件策略:
與 analyze-java 的互補性:
analyze-java-domain 理解特定功能analyze-java搜尋策略優化:
深度優先 vs 廣度優先:
時間估算: