chinese
This commit is contained in:
parent
c2a7a526af
commit
fdf10dc9bc
|
|
@ -1,32 +0,0 @@
|
||||||
# 總開發規範
|
|
||||||
|
|
||||||
## 安全政策
|
|
||||||
- 禁止所有安全風險的套件
|
|
||||||
- 所有API 呼叫必須使用HTTPS
|
|
||||||
- 敏感資料必須加密存儲
|
|
||||||
|
|
||||||
## 程式開發標準
|
|
||||||
- 測試覆蓋率不得低於 80%
|
|
||||||
|
|
||||||
## 合規要求
|
|
||||||
- 遵循 GDPR 資料保護規範
|
|
||||||
- 記錄所有資料存取操作
|
|
||||||
|
|
||||||
# 全域開發偏好
|
|
||||||
|
|
||||||
## 語言偏好
|
|
||||||
- 預設使用繁體中文回應自然語言內容
|
|
||||||
- 程式碼註解和文件使用繁體中文撰寫
|
|
||||||
- 不要有太多 emoji
|
|
||||||
- 思考過程也使用繁體中文
|
|
||||||
|
|
||||||
## 程式設計偏好
|
|
||||||
- 偏好函式程式設計風格
|
|
||||||
- 重視程式碼可讀性多過簡潔性
|
|
||||||
- 喜歡詳細的錯誤處理和日誌記錄
|
|
||||||
- 可以有時間複雜度小的方案絕不使用時間複雜度大方案解決,且要兼顧可讀性
|
|
||||||
|
|
||||||
## 解釋風格
|
|
||||||
- 先解釋概念,在給出程式碼
|
|
||||||
- 提出多種解決方案並說明優缺點
|
|
||||||
- 包含實際的使用範例
|
|
||||||
|
|
@ -1,119 +0,0 @@
|
||||||
---
|
|
||||||
description: 讀取現有 PRD 文件,針對指定部分進行深化、修改或補充。支援局部改寫與全文增強。
|
|
||||||
---
|
|
||||||
|
|
||||||
# /pm-edit — PRD 編輯與深化指令
|
|
||||||
|
|
||||||
這個指令讓你針對**已存在的 PRD**進行修改、補充或深化,不需要重跑完整的多 agent 流程。
|
|
||||||
|
|
||||||
## 使用方式
|
|
||||||
|
|
||||||
```
|
|
||||||
/pm-edit [PRD路徑或直接在編輯器中開啟] [編輯指令]
|
|
||||||
```
|
|
||||||
|
|
||||||
### 常見使用情境
|
|
||||||
|
|
||||||
```
|
|
||||||
# 深化功能規格(最常用)
|
|
||||||
/pm-edit 目前 PRD 的功能規格太少,幫我把 Must Have 功能從 3 個擴充到至少 10 個
|
|
||||||
|
|
||||||
# 補充競品體驗分析
|
|
||||||
/pm-edit 競品分析只有功能比較,幫我加入完整的 UX 體驗評估(Onboarding、情緒曲線等)
|
|
||||||
|
|
||||||
# 加入 EARS 驗收標準
|
|
||||||
/pm-edit 把所有功能的驗收標準改為 EARS 格式,並加入錯誤處理表格
|
|
||||||
|
|
||||||
# 參考競品網站重寫定位
|
|
||||||
/pm-edit 參考:https://notion.so 和 https://coda.io ,重新分析我們的差異化定位
|
|
||||||
|
|
||||||
# 更新 Roadmap
|
|
||||||
/pm-edit 把 Phase 1 的時程從 3 個月改成 6 個月,重新估算功能範圍
|
|
||||||
|
|
||||||
# 補充用戶洞察
|
|
||||||
/pm-edit 用戶 Persona 太薄弱,幫我深化為 3 個完整 Persona,每個都要有 JTBD 三層分析
|
|
||||||
```
|
|
||||||
|
|
||||||
## 工作流程
|
|
||||||
|
|
||||||
### Step 1:讀取現有 PRD
|
|
||||||
使用 `Read` tool 讀取當前開啟的 PRD 文件(或使用者指定的路徑)。
|
|
||||||
|
|
||||||
若使用者沒有指定路徑:
|
|
||||||
1. 先檢查 `docs/prd/` 目錄下最新的 PRD 文件
|
|
||||||
2. 若有多個,列出讓使用者選擇
|
|
||||||
|
|
||||||
### Step 2:理解編輯意圖
|
|
||||||
分析使用者的編輯指令,判斷需要:
|
|
||||||
|
|
||||||
| 編輯類型 | 需要的 Agent | 處理方式 |
|
|
||||||
|---------|------------|---------|
|
|
||||||
| 深化功能規格 | Prioritization Planner + PRD Writer | 重新規劃並局部重寫 |
|
|
||||||
| 補充競品分析 | Competitor Analyst | 呼叫 sub-agent 補充後合併 |
|
|
||||||
| 深化用戶洞察 | User Insight Researcher | 重新搜尋並更新 Persona |
|
|
||||||
| 格式轉換(改 EARS) | PRD Writer | 直接轉換格式 |
|
|
||||||
| 參考 URL 更新 | 對應 Agent + PRD Writer | 讀取 URL 後針對性更新 |
|
|
||||||
| 風險評估更新 | 直接推理 | 不需要呼叫 sub-agent |
|
|
||||||
|
|
||||||
### Step 3:若提供 URL 參考
|
|
||||||
若使用者在指令中包含 `參考:https://...`:
|
|
||||||
- 使用 `Read` tool 讀取該 URL(競品網站、文章、既有文件)
|
|
||||||
- 將讀取到的關鍵資訊摘要,傳遞給對應的 sub-agent
|
|
||||||
|
|
||||||
### Step 4:執行局部更新
|
|
||||||
**只更新受影響的章節**,不重寫整份 PRD。
|
|
||||||
|
|
||||||
更新原則:
|
|
||||||
- 保留原有 PRD 中已有的好內容
|
|
||||||
- 在指定章節進行深化或修改
|
|
||||||
- 新增章節時插入適當位置
|
|
||||||
- 確保整份文件風格與格式一致
|
|
||||||
|
|
||||||
### Step 5:儲存更新版本
|
|
||||||
使用 `Write` tool:
|
|
||||||
- 儲存為新版本:`docs/prd/[原檔名]-v2.md`(或 v3、v4...)
|
|
||||||
- 在文件末尾的「變更記錄」表格中加入此次修改說明
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 常用快捷編輯指令
|
|
||||||
|
|
||||||
### 功能深化
|
|
||||||
```
|
|
||||||
/pm-edit 把所有功能的驗收標準改為 EARS 格式表格,並補充錯誤處理
|
|
||||||
```
|
|
||||||
→ PRD Writer 直接轉換現有功能規格格式
|
|
||||||
|
|
||||||
### 競品補充
|
|
||||||
```
|
|
||||||
/pm-edit 幫我補充 [競品名] 的完整使用體驗分析,包含 Onboarding 和情緒曲線
|
|
||||||
```
|
|
||||||
→ Competitor Analyst 針對指定競品深化分析
|
|
||||||
|
|
||||||
### 功能擴充
|
|
||||||
```
|
|
||||||
/pm-edit Must Have 功能只有 [N] 個,幫我至少擴充到 10 個,優先考慮 [方向] 相關的功能
|
|
||||||
```
|
|
||||||
→ Prioritization Planner 重新規劃,PRD Writer 補充功能規格
|
|
||||||
|
|
||||||
### 參考競品重新定位
|
|
||||||
```
|
|
||||||
/pm-edit 參考:https://[競品URL] 重新分析我們的差異化定位並更新第 2 節
|
|
||||||
```
|
|
||||||
→ 讀取 URL → Competitor Analyst 更新 → PRD Writer 更新第 2 節
|
|
||||||
|
|
||||||
### 格式對齊
|
|
||||||
```
|
|
||||||
/pm-edit 把使用者故事改為標準格式 "AS a..., I WANT to..., SO THAT..."
|
|
||||||
```
|
|
||||||
→ PRD Writer 直接格式化,不需要呼叫其他 agent
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 重要原則
|
|
||||||
|
|
||||||
- **局部更新優先**:不要因為一個小改動就重寫整份 PRD
|
|
||||||
- **版本保留**:每次修改都存為新版本(v2, v3...),不覆蓋原版
|
|
||||||
- **說明改了什麼**:在「變更記錄」中清楚記錄本次修改範圍
|
|
||||||
- **保持一致性**:新增的內容要與原有文件的語氣、格式、詳細程度一致
|
|
||||||
- **URL 優先讀取**:若使用者提供了 URL 參考,先讀取再做任何分析
|
|
||||||
|
|
@ -1,117 +0,0 @@
|
||||||
---
|
|
||||||
description: 呼叫 PM Coordinator,拆解需求並協調多個專業 sub-agent,最終輸出完整的 PRD 文件。
|
|
||||||
---
|
|
||||||
|
|
||||||
# /pm — 產品規劃指令
|
|
||||||
|
|
||||||
這個指令啟動 **PM Coordinator**,由它協調所有專業 sub-agent,產出結構化的 Product Requirements Document(PRD)。
|
|
||||||
|
|
||||||
## 你的角色
|
|
||||||
|
|
||||||
執行此指令時,你扮演 **PM Coordinator**(定義於 `.claude/agents/pm-coordinator.md`)。
|
|
||||||
|
|
||||||
## 工作流程
|
|
||||||
|
|
||||||
### Step 1:需求澄清
|
|
||||||
接收使用者的產品描述後,先確認以下資訊(最多問 3 個問題):
|
|
||||||
|
|
||||||
- 這是 0→1 新產品,還是既有產品的新功能?
|
|
||||||
- 目標用戶是誰?有無既有的用戶研究或數據?
|
|
||||||
- 有無特定競品作為參考?
|
|
||||||
- 預計的時程與團隊規模?
|
|
||||||
|
|
||||||
**若資訊足夠,直接進入 Step 2,不要過度提問。**
|
|
||||||
|
|
||||||
### Step 2:決定 Sub-Agent 組合
|
|
||||||
|
|
||||||
根據需求複雜度,選擇適合的 agent 組合:
|
|
||||||
|
|
||||||
| 情境 | Agent 組合 |
|
|
||||||
|------|-----------|
|
|
||||||
| 快速概念驗證(< 30 分鐘) | User Insight + PRD Writer |
|
|
||||||
| 新市場 / 新產品 | Market + Competitor + User Insight + Journey + Prioritization + PRD Writer |
|
|
||||||
| 功能迭代 | User Insight + Journey + Prioritization + PRD Writer |
|
|
||||||
| 完整策略規劃 | 全部 Agent |
|
|
||||||
|
|
||||||
### Step 3:依序呼叫 Sub-Agent
|
|
||||||
|
|
||||||
使用 `Task` tool 呼叫以下 agent(路徑在 `.claude/agents/`):
|
|
||||||
|
|
||||||
#### 可平行執行(無依賴關係):
|
|
||||||
1. **`pm-market-researcher`** — 市場規模與趨勢分析
|
|
||||||
2. **`pm-competitor-analyst`** — 競品分析與定位建議
|
|
||||||
3. **`pm-user-insight-researcher`** — Persona 建立與 JTBD 分析
|
|
||||||
|
|
||||||
#### 依序執行(需要前面的產出):
|
|
||||||
4. **`pm-journey-designer`** — 輸入:User Insight 結果
|
|
||||||
5. **`pm-prioritization-planner`** — 輸入:User Insight + Journey 結果
|
|
||||||
6. **`pm-prd-writer`** — 輸入:所有 agent 的完整產出
|
|
||||||
|
|
||||||
### Step 4:整合與品質把關
|
|
||||||
|
|
||||||
收到所有 sub-agent 產出後,在呼叫 PRD Writer 前確認:
|
|
||||||
|
|
||||||
- [ ] 目標用戶描述是否一致?
|
|
||||||
- [ ] 核心功能是否對應 JTBD?
|
|
||||||
- [ ] Roadmap 是否反映優先級決策?
|
|
||||||
- [ ] 有無明顯矛盾或遺漏?
|
|
||||||
|
|
||||||
### Step 5:輸出 PRD
|
|
||||||
|
|
||||||
呼叫 `pm-prd-writer` 輸出最終 PRD,並:
|
|
||||||
1. 顯示完整 PRD 給使用者
|
|
||||||
2. 儲存至 `docs/prd/[產品名]-prd-[YYYY-MM-DD].md`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 呼叫 Sub-Agent 的範例格式
|
|
||||||
|
|
||||||
```
|
|
||||||
Task: 呼叫 pm-market-researcher
|
|
||||||
Description: 分析 [產品類別] 的市場規模與近期趨勢
|
|
||||||
Input:
|
|
||||||
- 產品概述:[使用者的原始描述]
|
|
||||||
- 目標地區:[台灣 / 全球 / 東南亞...]
|
|
||||||
- 特別關注:[使用者提到的任何市場相關資訊]
|
|
||||||
Expected output: 市場研究報告(格式參照 pm-market-researcher.md)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Sub-Agent 一覽
|
|
||||||
|
|
||||||
| Agent 文件 | 主要職責 | 所需工具 |
|
|
||||||
|-----------|---------|---------|
|
|
||||||
| `pm-coordinator.md` | 協調者(你自己) | Task, WebSearch, Read, Write |
|
|
||||||
| `pm-market-researcher.md` | 市場與趨勢研究 | WebSearch, Read |
|
|
||||||
| `pm-competitor-analyst.md` | 競品分析與定位 | WebSearch, Read |
|
|
||||||
| `pm-user-insight-researcher.md` | 用戶洞察與 JTBD | WebSearch, Read |
|
|
||||||
| `pm-journey-designer.md` | 旅程與 UX 流程設計 | Read |
|
|
||||||
| `pm-prioritization-planner.md` | 功能優先級與 Roadmap | Read |
|
|
||||||
| `pm-prd-writer.md` | PRD 文件撰寫 | Write, Read |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 使用範例
|
|
||||||
|
|
||||||
```
|
|
||||||
/pm 我想做一個幫助獨立接案者管理客戶與發票的 SaaS 工具,
|
|
||||||
目標用戶是台灣的設計師和工程師,
|
|
||||||
預計 3 個月內上線 MVP,只有我一個工程師和一個設計師。
|
|
||||||
```
|
|
||||||
|
|
||||||
```
|
|
||||||
/pm 我們的電商平台需要新增一個 AI 推薦功能,
|
|
||||||
希望提升用戶的二次購買率,
|
|
||||||
參考競品:Amazon、momo、蝦皮。
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 重要注意事項
|
|
||||||
|
|
||||||
- **不要自己做市場研究**:交給 `pm-market-researcher` sub-agent
|
|
||||||
- **不要跳過澄清**:需求不清楚是後續所有浪費的根源
|
|
||||||
- **輸出前做整合**:各 sub-agent 的輸出可能有矛盾,需要你統一
|
|
||||||
- **保持語言一致**:整份 PRD 使用繁體中文,技術術語可保留英文
|
|
||||||
- **PRD 必須可執行**:驗收標準應具體、可測試,不能是模糊描述
|
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
# 總開發規範
|
||||||
|
|
||||||
|
## 安全政策
|
||||||
|
- 禁止所有安全風險的套件
|
||||||
|
- 所有 API 呼叫必須使用 HTTPS
|
||||||
|
- 敏感資料必須加密存儲
|
||||||
|
- 絕不在原始碼中寫死 secrets(API keys、密碼、token)
|
||||||
|
- 所有使用者輸入必須驗證;使用參數化查詢防止 SQL injection
|
||||||
|
- 發現安全問題時:立即停止 → 使用 **security-reviewer** agent → 修復後繼續
|
||||||
|
|
||||||
|
## 程式開發標準
|
||||||
|
- 測試覆蓋率不得低於 80%
|
||||||
|
- 優先不可變資料(immutability):永遠回傳新物件,不直接修改原物件
|
||||||
|
- 檔案大小:一般 200-400 行,最多 800 行;超過時拆分
|
||||||
|
- 錯誤處理:每一層都要明確處理,不可靜默吞掉錯誤
|
||||||
|
|
||||||
|
## 合規要求
|
||||||
|
- 遵循 GDPR 資料保護規範
|
||||||
|
- 記錄所有資料存取操作
|
||||||
|
|
||||||
|
## Agent 使用規範
|
||||||
|
- 複雜功能請求 → 先用 **planner** agent 規劃
|
||||||
|
- 寫完程式碼後 → 立即用 **code-reviewer** agent
|
||||||
|
- 新功能或 bug fix → 用 **tdd-guide** agent(先寫測試)
|
||||||
|
- 架構決策 → 用 **architect** agent
|
||||||
|
- 獨立任務盡量平行啟動多個 agent,不要依序執行
|
||||||
|
|
||||||
|
## Git 規範
|
||||||
|
- Commit message 格式:`<type>: <description>`
|
||||||
|
- Types: feat, fix, refactor, docs, test, chore, perf, ci
|
||||||
|
- PR 時用 `git diff [base-branch]...HEAD` 分析完整變更
|
||||||
|
|
||||||
|
## 模型選擇
|
||||||
|
- **Haiku**:輕量 agent、頻繁呼叫的 worker
|
||||||
|
- **Sonnet**:主要開發工作、orchestration
|
||||||
|
- **Opus**:複雜架構決策、深度研究分析
|
||||||
|
|
||||||
|
# 全域開發偏好
|
||||||
|
|
||||||
|
## 語言偏好
|
||||||
|
- 預設使用繁體中文回應自然語言內容
|
||||||
|
- 程式碼註解和文件使用繁體中文撰寫
|
||||||
|
- 不要有太多 emoji
|
||||||
|
- 思考過程也使用繁體中文
|
||||||
|
|
||||||
|
## 程式設計偏好
|
||||||
|
- 偏好函式程式設計風格
|
||||||
|
- 重視程式碼可讀性多過簡潔性
|
||||||
|
- 喜歡詳細的錯誤處理和日誌記錄
|
||||||
|
- 可以有時間複雜度小的方案絕不使用時間複雜度大方案解決,且要兼顧可讀性
|
||||||
|
|
||||||
|
## 解釋風格
|
||||||
|
- 先解釋概念,在給出程式碼
|
||||||
|
- 提出多種解決方案並說明優缺點
|
||||||
|
- 包含實際的使用範例
|
||||||
|
|
@ -0,0 +1,82 @@
|
||||||
|
---
|
||||||
|
description: 讀取現有 PRD 文件,針對指定部分進行深化、修改或補充。支援局部改寫與全文增強。
|
||||||
|
---
|
||||||
|
|
||||||
|
# /pm-edit — PRD 編輯與深化
|
||||||
|
|
||||||
|
針對**已存在的 PRD** 進行修改、補充或深化,不需要重跑完整流程。
|
||||||
|
|
||||||
|
## 使用方式
|
||||||
|
|
||||||
|
```
|
||||||
|
# 深化功能規格
|
||||||
|
/pm-edit 目前 PRD 的功能規格太少,幫我把 Must Have 功能擴充到至少 10 個
|
||||||
|
|
||||||
|
# 補充競品體驗分析
|
||||||
|
/pm-edit 競品分析只有功能比較,幫我加入完整的 UX 體驗評估
|
||||||
|
|
||||||
|
# 加入 EARS 驗收標準
|
||||||
|
/pm-edit 把所有功能的驗收標準改為 EARS 格式
|
||||||
|
|
||||||
|
# 參考競品網站重寫定位
|
||||||
|
/pm-edit 參考:https://notion.so 和 https://coda.io ,重新分析差異化定位
|
||||||
|
|
||||||
|
# 更新 Roadmap
|
||||||
|
/pm-edit 把 Phase 1 時程從 3 個月改成 6 個月
|
||||||
|
|
||||||
|
# 補充用戶洞察
|
||||||
|
/pm-edit 用戶 Persona 太薄弱,幫我深化痛點分析
|
||||||
|
```
|
||||||
|
|
||||||
|
## 工作流程
|
||||||
|
|
||||||
|
### Step 1:讀取現有 PRD
|
||||||
|
|
||||||
|
使用 `Read` tool 讀取當前開啟的 PRD(或使用者指定的路徑)。
|
||||||
|
|
||||||
|
若未指定路徑:
|
||||||
|
1. 檢查 `docs/prd/` 目錄下最新的 PRD
|
||||||
|
2. 若有多個,列出讓使用者選擇
|
||||||
|
|
||||||
|
### Step 2:判斷需要哪個 Agent
|
||||||
|
|
||||||
|
| 編輯類型 | 需要的 Agent |
|
||||||
|
|---------|-------------|
|
||||||
|
| 深化功能規格 | PM Strategist + PM Writer |
|
||||||
|
| 補充競品分析 | PM Researcher |
|
||||||
|
| 深化用戶洞察 | PM User Analyst |
|
||||||
|
| 格式轉換(改 EARS) | PM Writer |
|
||||||
|
| 參考 URL 更新 | PM Researcher + PM Writer |
|
||||||
|
| 風險評估更新 | 直接推理,不需呼叫 Agent |
|
||||||
|
| Roadmap 調整 | PM Strategist |
|
||||||
|
|
||||||
|
### Step 3:若提供 URL
|
||||||
|
|
||||||
|
若指令中包含 `參考:https://...`:
|
||||||
|
- 先用 web-to-markdown skill 爬取 URL
|
||||||
|
- 將爬取內容傳給對應 Agent
|
||||||
|
|
||||||
|
### Step 4:執行局部更新
|
||||||
|
|
||||||
|
**只更新受影響的章節**,不重寫整份 PRD。
|
||||||
|
|
||||||
|
更新原則:
|
||||||
|
- 保留原有好內容
|
||||||
|
- 在指定章節進行深化或修改
|
||||||
|
- 新增章節插入適當位置
|
||||||
|
- 確保整份文件風格格式一致
|
||||||
|
|
||||||
|
### Step 5:儲存新版本
|
||||||
|
|
||||||
|
- 存為新版本:`[原檔名]-v2.md`(v3、v4...)
|
||||||
|
- 在「變更記錄」中加入修改說明
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 重要原則
|
||||||
|
|
||||||
|
- **局部更新優先**:不要因小改動重寫整份 PRD
|
||||||
|
- **版本保留**:每次存為新版本,不覆蓋原版
|
||||||
|
- **說明改了什麼**:在變更記錄中清楚記錄
|
||||||
|
- **保持一致性**:新增內容要與原文風格一致
|
||||||
|
- **URL 優先讀取**:有提供 URL 的話,先讀取再分析
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
---
|
||||||
|
description: 呼叫完整 PM 流程,依序執行研究、用戶洞察、策略規劃,最終輸出結構完整的 PRD 文件。
|
||||||
|
---
|
||||||
|
|
||||||
|
# /pm — 完整產品規劃
|
||||||
|
|
||||||
|
啟動完整的產品規劃流程,依序呼叫 4 個專業 Agent,最終產出結構化的 PRD。
|
||||||
|
|
||||||
|
## 使用方式
|
||||||
|
|
||||||
|
```
|
||||||
|
/pm 我想做一個幫助獨立接案者管理客戶與發票的 SaaS 工具,
|
||||||
|
目標用戶是台灣的設計師和工程師,
|
||||||
|
預計 3 個月內上線 MVP,只有我一個工程師和一個設計師。
|
||||||
|
|
||||||
|
/pm 我們的電商平台需要新增一個 AI 推薦功能,
|
||||||
|
參考競品:Amazon、momo、蝦皮。
|
||||||
|
```
|
||||||
|
|
||||||
|
## 工作流程
|
||||||
|
|
||||||
|
### Step 1:需求澄清
|
||||||
|
|
||||||
|
接收使用者的產品描述後,快速確認以下資訊(**最多問 3 個問題**):
|
||||||
|
|
||||||
|
- 這是 0→1 新產品,還是既有產品的新功能?
|
||||||
|
- 目標用戶是誰?
|
||||||
|
- 有無特定競品作為參考(名稱或 URL)?
|
||||||
|
- 預計時程與團隊規模?
|
||||||
|
|
||||||
|
**若資訊足夠,直接進入 Step 2。**
|
||||||
|
|
||||||
|
### Step 2:決定執行範圍
|
||||||
|
|
||||||
|
根據需求複雜度選擇 Agent 組合:
|
||||||
|
|
||||||
|
| 情境 | Agent 組合 |
|
||||||
|
|------|-----------|
|
||||||
|
| 快速概念驗證(< 30 分鐘) | PM User Analyst + PM Writer |
|
||||||
|
| 新市場 / 新產品 | 全部 4 個 Agent |
|
||||||
|
| 功能迭代 | PM User Analyst + PM Strategist + PM Writer |
|
||||||
|
| 完整策略規劃 | 全部 4 個 Agent |
|
||||||
|
|
||||||
|
### Step 3:建立草稿目錄
|
||||||
|
|
||||||
|
建立 `docs/prd/drafts/[產品名稱]-[YYYY-MM-DD]/` 目錄。
|
||||||
|
|
||||||
|
### Step 4:依序呼叫 Agent
|
||||||
|
|
||||||
|
#### 可平行執行(無依賴):
|
||||||
|
1. **`pm-researcher`**(`.claude/agents/pm-researcher.md`)
|
||||||
|
- 市場規模 + 趨勢 + 競品功能盤點 + UX 體驗
|
||||||
|
- 輸出:`01-market-research.md` + `02-competitor-analysis.md`
|
||||||
|
|
||||||
|
2. **`pm-user-analyst`**(`.claude/agents/pm-user-analyst.md`)
|
||||||
|
- 真實用戶痛點挖掘
|
||||||
|
- 輸出:`03-user-insights.md`
|
||||||
|
|
||||||
|
#### 依序執行(需前面產出):
|
||||||
|
3. **`pm-strategist`**(`.claude/agents/pm-strategist.md`)
|
||||||
|
- 讀取 User Analyst 和 Researcher 的報告 → 旅程設計 + 功能排序 + Roadmap
|
||||||
|
- 輸出:`04-journey-strategy.md` + `05-prioritization.md`
|
||||||
|
|
||||||
|
4. **`pm-writer`**(`.claude/agents/pm-writer.md`)
|
||||||
|
- 讀取所有草稿 → 一致性檢查 → 整合為完整 PRD
|
||||||
|
- 輸出:`docs/prd/[產品名]-prd-[YYYY-MM-DD].md`
|
||||||
|
|
||||||
|
### Step 5:品質把關
|
||||||
|
|
||||||
|
在呼叫 PM Writer 前確認:
|
||||||
|
|
||||||
|
| 項目 | 最低標準 |
|
||||||
|
|------|---------|
|
||||||
|
| 功能數量(Must Have) | ≥ 8 個 |
|
||||||
|
| 用戶痛點 | ≥ 8 個具體痛點 |
|
||||||
|
| 競品數量 | ≥ 3 個完整分析 |
|
||||||
|
| 旅程流程 | ≥ 1 Macro + 2 Micro Journey |
|
||||||
|
| 風險清單 | ≥ 5 個 |
|
||||||
|
|
||||||
|
未達標則要求對應 Agent 補充,**不要自行湊數**。
|
||||||
|
|
||||||
|
### Step 6:輸出 PRD
|
||||||
|
|
||||||
|
最終 PRD 存至 `docs/prd/[產品名]-prd-[YYYY-MM-DD].md`,同時顯示給使用者。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Agent 一覽
|
||||||
|
|
||||||
|
| Agent | 主要職責 | 使用的 Skills |
|
||||||
|
|-------|---------|-------------|
|
||||||
|
| `pm-researcher` | 市場研究 + 競品分析 | web-research, web-to-markdown, competitor-profiling |
|
||||||
|
| `pm-user-analyst` | 用戶痛點挖掘 | web-research, user-voice-mining |
|
||||||
|
| `pm-strategist` | 旅程設計 + 功能排序 + Roadmap | prioritization-framework |
|
||||||
|
| `pm-writer` | PRD 整合撰寫 | report-writer |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 重要注意事項
|
||||||
|
|
||||||
|
- **不要自己做市場研究**:交給 `pm-researcher`
|
||||||
|
- **不要跳過澄清**:需求不清楚是後續所有浪費的根源
|
||||||
|
- **輸出前做整合**:各 Agent 產出可能有矛盾,需統一
|
||||||
|
- **語言一致**:繁體中文,技術術語保留英文
|
||||||
|
- **PRD 必須可執行**:驗收標準應具體、可測試
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 若已有部分研究
|
||||||
|
|
||||||
|
如果之前已經執行過 `/pm-research` 或 `/pm-user`,`/pm` 會自動讀取草稿資料夾中已有的報告,**跳過已完成的步驟**,從缺少的部分繼續。
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# Development Workflow
|
# Development Workflow
|
||||||
|
|
||||||
> This file extends [common/git-workflow.md](./git-workflow.md) with the full feature development process that happens before git operations.
|
> This file extends [common/git-workflow.md](git-workflow.md) with the full feature development process that happens before git operations.
|
||||||
|
|
||||||
The Feature Implementation Workflow describes the development pipeline: planning, TDD, code review, and then committing to git.
|
The Feature Implementation Workflow describes the development pipeline: planning, TDD, code review, and then committing to git.
|
||||||
|
|
||||||
|
|
@ -26,4 +26,4 @@ The Feature Implementation Workflow describes the development pipeline: planning
|
||||||
4. **Commit & Push**
|
4. **Commit & Push**
|
||||||
- Detailed commit messages
|
- Detailed commit messages
|
||||||
- Follow conventional commits format
|
- Follow conventional commits format
|
||||||
- See [git-workflow.md](./git-workflow.md) for commit message format and PR process
|
- See [git-workflow.md](git-workflow.md) for commit message format and PR process
|
||||||
|
|
@ -21,4 +21,4 @@ When creating PRs:
|
||||||
5. Push with `-u` flag if new branch
|
5. Push with `-u` flag if new branch
|
||||||
|
|
||||||
> For the full development process (planning, TDD, code review) before git operations,
|
> For the full development process (planning, TDD, code review) before git operations,
|
||||||
> see [development-workflow.md](./development-workflow.md).
|
> see [development-workflow.md](development-workflow.md).
|
||||||
|
|
@ -135,14 +135,14 @@ Add to your `~/.claude/settings.json`.
|
||||||
"matcher": "*",
|
"matcher": "*",
|
||||||
"hooks": [{
|
"hooks": [{
|
||||||
"type": "command",
|
"type": "command",
|
||||||
"command": "~/.claude/skills/continuous-learning-v2/hooks/observe.sh pre"
|
"command": "~/claude/skills/continuous-learning-v2/hooks/observe.sh pre"
|
||||||
}]
|
}]
|
||||||
}],
|
}],
|
||||||
"PostToolUse": [{
|
"PostToolUse": [{
|
||||||
"matcher": "*",
|
"matcher": "*",
|
||||||
"hooks": [{
|
"hooks": [{
|
||||||
"type": "command",
|
"type": "command",
|
||||||
"command": "~/.claude/skills/continuous-learning-v2/hooks/observe.sh post"
|
"command": "~/claude/skills/continuous-learning-v2/hooks/observe.sh post"
|
||||||
}]
|
}]
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
|
@ -154,8 +154,8 @@ Add to your `~/.claude/settings.json`.
|
||||||
The Python CLI will create these automatically, but you can also create them manually:
|
The Python CLI will create these automatically, but you can also create them manually:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir -p ~/.claude/homunculus/{instincts/{personal,inherited},evolved/{agents,skills,commands}}
|
mkdir -p ~/claude/homunculus/{instincts/{personal,inherited},evolved/{agents,skills,commands}}
|
||||||
touch ~/.claude/homunculus/observations.jsonl
|
touch ~/claude/homunculus/observations.jsonl
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Use the Instinct Commands
|
### 3. Use the Instinct Commands
|
||||||
|
|
@ -185,13 +185,13 @@ Edit `config.json`:
|
||||||
"version": "2.0",
|
"version": "2.0",
|
||||||
"observation": {
|
"observation": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"store_path": "~/.claude/homunculus/observations.jsonl",
|
"store_path": "~/claude/homunculus/observations.jsonl",
|
||||||
"max_file_size_mb": 10,
|
"max_file_size_mb": 10,
|
||||||
"archive_after_days": 7
|
"archive_after_days": 7
|
||||||
},
|
},
|
||||||
"instincts": {
|
"instincts": {
|
||||||
"personal_path": "~/.claude/homunculus/instincts/personal/",
|
"personal_path": "~/claude/homunculus/instincts/personal/",
|
||||||
"inherited_path": "~/.claude/homunculus/instincts/inherited/",
|
"inherited_path": "~/claude/homunculus/instincts/inherited/",
|
||||||
"min_confidence": 0.3,
|
"min_confidence": 0.3,
|
||||||
"auto_approve_threshold": 0.7,
|
"auto_approve_threshold": 0.7,
|
||||||
"confidence_decay_rate": 0.05
|
"confidence_decay_rate": 0.05
|
||||||
|
|
@ -209,7 +209,7 @@ Edit `config.json`:
|
||||||
},
|
},
|
||||||
"evolution": {
|
"evolution": {
|
||||||
"cluster_threshold": 3,
|
"cluster_threshold": 3,
|
||||||
"evolved_path": "~/.claude/homunculus/evolved/"
|
"evolved_path": "~/claude/homunculus/evolved/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
# Captures tool use events for pattern analysis.
|
# Captures tool use events for pattern analysis.
|
||||||
# Claude Code passes hook data via stdin as JSON.
|
# Claude Code passes hook data via stdin as JSON.
|
||||||
#
|
#
|
||||||
# Hook config (in ~/.claude/settings.json):
|
# Hook config (in ~/claude/settings.json):
|
||||||
#
|
#
|
||||||
# If installed as a plugin, use ${CLAUDE_PLUGIN_ROOT}:
|
# If installed as a plugin, use ${CLAUDE_PLUGIN_ROOT}:
|
||||||
# {
|
# {
|
||||||
|
|
@ -20,16 +20,16 @@
|
||||||
# }
|
# }
|
||||||
# }
|
# }
|
||||||
#
|
#
|
||||||
# If installed manually to ~/.claude/skills:
|
# If installed manually to ~/claude/skills:
|
||||||
# {
|
# {
|
||||||
# "hooks": {
|
# "hooks": {
|
||||||
# "PreToolUse": [{
|
# "PreToolUse": [{
|
||||||
# "matcher": "*",
|
# "matcher": "*",
|
||||||
# "hooks": [{ "type": "command", "command": "~/.claude/skills/continuous-learning-v2/hooks/observe.sh pre" }]
|
# "hooks": [{ "type": "command", "command": "~/claude/skills/continuous-learning-v2/hooks/observe.sh pre" }]
|
||||||
# }],
|
# }],
|
||||||
# "PostToolUse": [{
|
# "PostToolUse": [{
|
||||||
# "matcher": "*",
|
# "matcher": "*",
|
||||||
# "hooks": [{ "type": "command", "command": "~/.claude/skills/continuous-learning-v2/hooks/observe.sh post" }]
|
# "hooks": [{ "type": "command", "command": "~/claude/skills/continuous-learning-v2/hooks/observe.sh post" }]
|
||||||
# }]
|
# }]
|
||||||
# }
|
# }
|
||||||
# }
|
# }
|
||||||
|
|
@ -33,7 +33,7 @@ Edit `config.json` to customize:
|
||||||
"min_session_length": 10,
|
"min_session_length": 10,
|
||||||
"extraction_threshold": "medium",
|
"extraction_threshold": "medium",
|
||||||
"auto_approve": false,
|
"auto_approve": false,
|
||||||
"learned_skills_path": "~/.claude/skills/learned/",
|
"learned_skills_path": "~/claude/skills/learned/",
|
||||||
"patterns_to_detect": [
|
"patterns_to_detect": [
|
||||||
"error_resolution",
|
"error_resolution",
|
||||||
"user_corrections",
|
"user_corrections",
|
||||||
|
|
@ -70,7 +70,7 @@ Add to your `~/.claude/settings.json`:
|
||||||
"matcher": "*",
|
"matcher": "*",
|
||||||
"hooks": [{
|
"hooks": [{
|
||||||
"type": "command",
|
"type": "command",
|
||||||
"command": "~/.claude/skills/continuous-learning/evaluate-session.sh"
|
"command": "~/claude/skills/continuous-learning/evaluate-session.sh"
|
||||||
}]
|
}]
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
|
@ -6,14 +6,14 @@
|
||||||
# - Stop runs once at session end (lightweight)
|
# - Stop runs once at session end (lightweight)
|
||||||
# - UserPromptSubmit runs every message (heavy, adds latency)
|
# - UserPromptSubmit runs every message (heavy, adds latency)
|
||||||
#
|
#
|
||||||
# Hook config (in ~/.claude/settings.json):
|
# Hook config (in ~/claude/settings.json):
|
||||||
# {
|
# {
|
||||||
# "hooks": {
|
# "hooks": {
|
||||||
# "Stop": [{
|
# "Stop": [{
|
||||||
# "matcher": "*",
|
# "matcher": "*",
|
||||||
# "hooks": [{
|
# "hooks": [{
|
||||||
# "type": "command",
|
# "type": "command",
|
||||||
# "command": "~/.claude/skills/continuous-learning/evaluate-session.sh"
|
# "command": "~/claude/skills/continuous-learning/evaluate-session.sh"
|
||||||
# }]
|
# }]
|
||||||
# }]
|
# }]
|
||||||
# }
|
# }
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
#
|
#
|
||||||
# Patterns to detect: error_resolution, debugging_techniques, workarounds, project_specific
|
# Patterns to detect: error_resolution, debugging_techniques, workarounds, project_specific
|
||||||
# Patterns to ignore: simple_typos, one_time_fixes, external_api_issues
|
# Patterns to ignore: simple_typos, one_time_fixes, external_api_issues
|
||||||
# Extracted skills saved to: ~/.claude/skills/learned/
|
# Extracted skills saved to: ~/claude/skills/learned/
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
|
@ -36,7 +36,7 @@ if [ -f "$CONFIG_FILE" ]; then
|
||||||
echo "[ContinuousLearning] jq is required to parse config.json but not installed, using defaults" >&2
|
echo "[ContinuousLearning] jq is required to parse config.json but not installed, using defaults" >&2
|
||||||
else
|
else
|
||||||
MIN_SESSION_LENGTH=$(jq -r '.min_session_length // 10' "$CONFIG_FILE")
|
MIN_SESSION_LENGTH=$(jq -r '.min_session_length // 10' "$CONFIG_FILE")
|
||||||
LEARNED_SKILLS_PATH=$(jq -r '.learned_skills_path // "~/.claude/skills/learned/"' "$CONFIG_FILE" | sed "s|~|$HOME|")
|
LEARNED_SKILLS_PATH=$(jq -r '.learned_skills_path // "~/claude/skills/learned/"' "$CONFIG_FILE" | sed "s|~|$HOME|")
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
name: security-scan
|
name: security-scan
|
||||||
description: Scan your Claude Code configuration (.claude/ directory) for security vulnerabilities, misconfigurations, and injection risks using AgentShield. Checks CLAUDE.md, settings.json, MCP servers, hooks, and agent definitions.
|
description: Scan your Claude Code configuration (claude/ directory) for security vulnerabilities, misconfigurations, and injection risks using AgentShield. Checks CLAUDE.md, settings.json, MCP servers, hooks, and agent definitions.
|
||||||
origin: ECC
|
origin: ECC
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -52,7 +52,7 @@ Run against the current project's `.claude/` directory:
|
||||||
npx ecc-agentshield scan
|
npx ecc-agentshield scan
|
||||||
|
|
||||||
# Scan a specific path
|
# Scan a specific path
|
||||||
npx ecc-agentshield scan --path /path/to/.claude
|
npx ecc-agentshield scan --path /path/to/claude
|
||||||
|
|
||||||
# Scan with minimum severity filter
|
# Scan with minimum severity filter
|
||||||
npx ecc-agentshield scan --min-severity medium
|
npx ecc-agentshield scan --min-severity medium
|
||||||
|
|
@ -160,7 +160,7 @@ Obtain via Bash: `date -u +%Y-%m-%dT%H:%M:%SZ`. Never use a date-only approximat
|
||||||
},
|
},
|
||||||
"skills": {
|
"skills": {
|
||||||
"skill-name": {
|
"skill-name": {
|
||||||
"path": "~/.claude/skills/skill-name/SKILL.md",
|
"path": "~/claude/skills/skill-name/SKILL.md",
|
||||||
"verdict": "Keep",
|
"verdict": "Keep",
|
||||||
"reason": "Concrete, actionable, unique value for X workflow",
|
"reason": "Concrete, actionable, unique value for X workflow",
|
||||||
"mtime": "2026-01-15T08:30:00Z"
|
"mtime": "2026-01-15T08:30:00Z"
|
||||||
|
|
@ -3,28 +3,28 @@
|
||||||
# Usage: quick-diff.sh RESULTS_JSON [CWD_SKILLS_DIR]
|
# Usage: quick-diff.sh RESULTS_JSON [CWD_SKILLS_DIR]
|
||||||
# Output: JSON array of changed/new files to stdout (empty [] if no changes)
|
# Output: JSON array of changed/new files to stdout (empty [] if no changes)
|
||||||
#
|
#
|
||||||
# When CWD_SKILLS_DIR is omitted, defaults to $PWD/.claude/skills so the
|
# When CWD_SKILLS_DIR is omitted, defaults to $PWD/claude/skills so the
|
||||||
# script always picks up project-level skills without relying on the caller.
|
# script always picks up project-level skills without relying on the caller.
|
||||||
#
|
#
|
||||||
# Environment:
|
# Environment:
|
||||||
# SKILL_STOCKTAKE_GLOBAL_DIR Override ~/.claude/skills (for testing only;
|
# SKILL_STOCKTAKE_GLOBAL_DIR Override ~/claude/skills (for testing only;
|
||||||
# do not set in production — intended for bats tests)
|
# do not set in production — intended for bats tests)
|
||||||
# SKILL_STOCKTAKE_PROJECT_DIR Override project dir detection (for testing only)
|
# SKILL_STOCKTAKE_PROJECT_DIR Override project dir detection (for testing only)
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
RESULTS_JSON="${1:-}"
|
RESULTS_JSON="${1:-}"
|
||||||
CWD_SKILLS_DIR="${SKILL_STOCKTAKE_PROJECT_DIR:-${2:-$PWD/.claude/skills}}"
|
CWD_SKILLS_DIR="${SKILL_STOCKTAKE_PROJECT_DIR:-${2:-$PWD/claude/skills}}"
|
||||||
GLOBAL_DIR="${SKILL_STOCKTAKE_GLOBAL_DIR:-$HOME/.claude/skills}"
|
GLOBAL_DIR="${SKILL_STOCKTAKE_GLOBAL_DIR:-$HOME/claude/skills}"
|
||||||
|
|
||||||
if [[ -z "$RESULTS_JSON" || ! -f "$RESULTS_JSON" ]]; then
|
if [[ -z "$RESULTS_JSON" || ! -f "$RESULTS_JSON" ]]; then
|
||||||
echo "Error: RESULTS_JSON not found: ${RESULTS_JSON:-<empty>}" >&2
|
echo "Error: RESULTS_JSON not found: ${RESULTS_JSON:-<empty>}" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Validate CWD_SKILLS_DIR looks like a .claude/skills path (defense-in-depth).
|
# Validate CWD_SKILLS_DIR looks like a claude/skills path (defense-in-depth).
|
||||||
# Only warn when the path exists — a nonexistent path poses no traversal risk.
|
# Only warn when the path exists — a nonexistent path poses no traversal risk.
|
||||||
if [[ -n "$CWD_SKILLS_DIR" && -d "$CWD_SKILLS_DIR" && "$CWD_SKILLS_DIR" != */.claude/skills* ]]; then
|
if [[ -n "$CWD_SKILLS_DIR" && -d "$CWD_SKILLS_DIR" && "$CWD_SKILLS_DIR" != */claude/skills* ]]; then
|
||||||
echo "Warning: CWD_SKILLS_DIR does not look like a .claude/skills path: $CWD_SKILLS_DIR" >&2
|
echo "Warning: CWD_SKILLS_DIR does not look like a .claude/skills path: $CWD_SKILLS_DIR" >&2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -3,25 +3,25 @@
|
||||||
# Usage: scan.sh [CWD_SKILLS_DIR]
|
# Usage: scan.sh [CWD_SKILLS_DIR]
|
||||||
# Output: JSON to stdout
|
# Output: JSON to stdout
|
||||||
#
|
#
|
||||||
# When CWD_SKILLS_DIR is omitted, defaults to $PWD/.claude/skills so the
|
# When CWD_SKILLS_DIR is omitted, defaults to $PWD/claude/skills so the
|
||||||
# script always picks up project-level skills without relying on the caller.
|
# script always picks up project-level skills without relying on the caller.
|
||||||
#
|
#
|
||||||
# Environment:
|
# Environment:
|
||||||
# SKILL_STOCKTAKE_GLOBAL_DIR Override ~/.claude/skills (for testing only;
|
# SKILL_STOCKTAKE_GLOBAL_DIR Override ~/claude/skills (for testing only;
|
||||||
# do not set in production — intended for bats tests)
|
# do not set in production — intended for bats tests)
|
||||||
# SKILL_STOCKTAKE_PROJECT_DIR Override project dir detection (for testing only)
|
# SKILL_STOCKTAKE_PROJECT_DIR Override project dir detection (for testing only)
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
GLOBAL_DIR="${SKILL_STOCKTAKE_GLOBAL_DIR:-$HOME/.claude/skills}"
|
GLOBAL_DIR="${SKILL_STOCKTAKE_GLOBAL_DIR:-$HOME/claude/skills}"
|
||||||
CWD_SKILLS_DIR="${SKILL_STOCKTAKE_PROJECT_DIR:-${1:-$PWD/.claude/skills}}"
|
CWD_SKILLS_DIR="${SKILL_STOCKTAKE_PROJECT_DIR:-${1:-$PWD/claude/skills}}"
|
||||||
# Path to JSONL file containing tool-use observations (optional; used for usage frequency counts).
|
# Path to JSONL file containing tool-use observations (optional; used for usage frequency counts).
|
||||||
# Override via SKILL_STOCKTAKE_OBSERVATIONS env var if your setup uses a different path.
|
# Override via SKILL_STOCKTAKE_OBSERVATIONS env var if your setup uses a different path.
|
||||||
OBSERVATIONS="${SKILL_STOCKTAKE_OBSERVATIONS:-$HOME/.claude/observations.jsonl}"
|
OBSERVATIONS="${SKILL_STOCKTAKE_OBSERVATIONS:-$HOME/claude/observations.jsonl}"
|
||||||
|
|
||||||
# Validate CWD_SKILLS_DIR looks like a .claude/skills path (defense-in-depth).
|
# Validate CWD_SKILLS_DIR looks like a claude/skills path (defense-in-depth).
|
||||||
# Only warn when the path exists — a nonexistent path poses no traversal risk.
|
# Only warn when the path exists — a nonexistent path poses no traversal risk.
|
||||||
if [[ -n "$CWD_SKILLS_DIR" && -d "$CWD_SKILLS_DIR" && "$CWD_SKILLS_DIR" != */.claude/skills* ]]; then
|
if [[ -n "$CWD_SKILLS_DIR" && -d "$CWD_SKILLS_DIR" && "$CWD_SKILLS_DIR" != */claude/skills* ]]; then
|
||||||
echo "Warning: CWD_SKILLS_DIR does not look like a .claude/skills path: $CWD_SKILLS_DIR" >&2
|
echo "Warning: CWD_SKILLS_DIR does not look like a .claude/skills path: $CWD_SKILLS_DIR" >&2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue