Skip to main content

第 20 課:2.1.x 進階功能

學習目標

完成本課程後,您將能夠:

  • 使用萬用字元權限模式
  • 為技能、代理和指令組態增強的 hooks
  • 分叉和倒轉工作階段
  • 使用外部編輯器(Ctrl+G)
  • 使用增強的 vim 動作
  • 設定任務相依性
  • 組態 WezTerm 支援(2.1.33)

先決條件

  • 已完成第 1-19 課 - 核心操作與進階功能
  • 權限知識 - 建議先完成第 4 課
  • Hooks 經驗 - 建議先完成第 8 課
  • Vim 熟悉度 - 用於 vim 動作章節

預估時間: 40 分鐘


萬用字元權限模式

什麼是萬用字元權限?

萬用字元允許您建立彈性的權限規則,可同時符合多個指令。

萬用字元語法

基本萬用字元:

{
"permissions": {
"allowedOperations": [
"Bash(*)", // 符合所有 bash 指令
"Bash(npm *)", // 符合所有 npm 指令
"Bash(git *)", // 符合所有 git 指令
"Bash(* test)", // 符合以 "test" 結尾的指令
"Bash(git * main)", // Git 指令帶 "main" 引數
"Read(*.md)", // 符合所有 .md 檔案
"Edit(src/*)" // 符合 src/ 中的所有檔案
]
}
}

萬用字元模式

模式類型:

  1. 符合全部:

    • Bash(*) - 所有 bash 指令
    • Read(*) - 所有檔案
    • Edit(*) - 所有檔案
  2. 前綴符合:

    • Bash(npm *) - 所有 npm 指令
    • Bash(git *) - 所有 git 指令
    • Bash(python *) - 所有 Python 指令
  3. 後綴符合:

    • Bash(* test) - 以 "test" 結尾的指令
    • Bash(* install) - 以 "install" 結尾的指令
    • Read(*.md) - 以 .md 結尾的檔案
  4. 中間符合:

    • Bash(git * main) - 帶有 "main" 的 git 指令
    • Bash(npm run *) - 所有 npm run 腳本
    • Edit(src/**/*.ts) - src/ 中的 TypeScript 檔案
  5. 多個萬用字元:

    • Bash(* * *) - 帶有 3+ 部分的指令
    • Bash(git * origin *) - 帶有 origin 的 git 指令

萬用字元範例

範例 1:開發工作流程

{
"permissions": {
"allowedOperations": [
// Git 操作
"Bash(git *)",
"Bash(gh *)", // GitHub CLI

// 套件管理
"Bash(npm *)",
"Bash(npx *)",
"Bash(yarn *)",
"Bash(pnpm *)",

// 測試
"Bash(* test)",
"Bash(npm test)",
"Bash(pytest *)",
"Bash(jest *)",

// 建置
"Bash(npm run build *)",
"Bash(* build)",

// 檔案操作
"Read(src/*)",
"Edit(src/*)",
"Write(src/*)"
]
}
}

範例 2:專案特定權限

{
"permissions": {
"allowedOperations": [
// 允許 tests 目錄中的所有操作
"Read(tests/*)",
"Edit(tests/*)",
"Write(tests/*)",
"Bash(* tests/*)",

// src 中的唯讀
"Read(src/*)",

// 特定寫入操作
"Edit(src/components/*.tsx)",
"Edit(src/api/*.ts)",

// 文件 - 完全存取
"Read(*.md)",
"Edit(*.md)",
"Write(*.md)"
]
}
}

範例 3:安全操作(不詢問模式)

{
"permissions": {
"allowedOperations": [
// 讀取操作 - 始終安全
"Read(*)",
"Bash(cat *)",
"Bash(ls *)",
"Bash(git log *)",
"Bash(git status)",
"Bash(git diff *)",

// 測試指令 - 安全
"Bash(npm test)",
"Bash(npm run test *)",
"Bash(* test)",

// Linting - 安全
"Bash(npm run lint)",
"Bash(prettier --check *)",
"Bash(eslint *)"
]
}
}

萬用字元最佳實踐

  1. 從特定開始,然後一般化:

    {
    "allowedOperations": [
    "Bash(npm test)", // 先特定
    "Bash(npm run test *)", // 然後模式
    "Bash(* test)" // 最一般的最後
    ]
    }
  2. 與 deniedOperations 結合使用負面模式:

    {
    "permissions": {
    "allowedOperations": ["Bash(git *)"],
    "deniedOperations": [
    "Bash(git push *)", // 禁止 push
    "Bash(git force *)", // 禁止 force
    "Bash(git clean -fd)" // 禁止 clean
    ]
    }
    }
  3. 與模式結合:

    {
    "permissions": {
    "allowedPatterns": [
    {
    "pattern": "^Read\\(.*\\.md\\)$",
    "operation": "Read"
    },
    {
    "pattern": "^Bash\\(npm (test|lint)\\)$",
    "operation": "Bash"
    }
    ]
    }
    }

---

## 增強的 Hooks 系統

### 技能、代理和指令的 Hooks

在 2.1.x 中,hooks 可以在以下位置定義:
- 技能 frontmatter
- 代理定義
- 斜線指令 frontmatter
- 設定檔

### Hook 類型

**可用的 hook 事件:**

1. **工作階段 hooks:**
- `session-start` - 開始工作階段時
- `session-end` - 結束工作階段時

2. **工具 hooks:**
- `pre-tool` - 任何工具使用之前
- `post-tool` - 工具完成之後

3. **權限 hooks:**
- `permission-request` - 需要權限時

4. **代理 hooks:**
- `subagent-start` - 子代理開始時
- `subagent-stop` - 子代理停止時

5. **指令/技能 hooks:**
- 範圍限定於特定指令/技能的 hooks

### 技能 Hooks

**技能中的前/後工具 hooks:**

```markdown
---
name: deploy
hooks:
pre-tool:
command: ./scripts/pre-deploy.sh
once: false
post-tool:
command: ./scripts/post-deploy.sh
timeout: 300000
---

# 部署

使用自動前/後 hooks 的部署。

技能中的權限 hooks:

---
name: auto-approve
hooks:
permission-request:
command: ./scripts/approve-dev-commands.sh
---

# 自動批准開發指令

自動批准安全的開發指令。

代理 Hooks

代理定義中的 hooks:

// .claude/agents/backend.json
{
"name": "backend",
"agentType": "general-purpose",
"systemPrompt": "你是一名後端開發人員。",
"hooks": {
"subagent-start": {
"command": "./scripts/backend-start.sh"
},
"subagent-stop": {
"command": "./scripts/backend-stop.sh"
}
}
}

斜線指令 Hooks

指令 frontmatter 中的 hooks:

---
name: /deploy
hooks:
pre-tool:
command: ./scripts/check-env.sh
post-tool:
command: ./scripts/notify-deployment.sh
---

# 部署指令

使用環境檢查的部署應用程式。

進階 Hook 功能

Hook 的額外情境(2.1.x):

{
"hooks": {
"pre-tool": {
"command": "./scripts/log-tool.sh",
"additionalContext": {
"environment": "production",
"team": "backend"
}
}
}
}

僅一次的 hooks(2.1.x 新增!):

---
hooks:
session-start:
command: ./scripts/init-dev-env.sh
once: true
---

逾時組態(2.1.x - 增加到 10 分鐘):

{
"hooks": {
"pre-tool": {
"command": "./scripts/long-running-check.sh",
"timeout": 600000 // 10 分鐘(毫秒)
}
}
}

Hook 範例

範例 1:前提交 hooks

{
"hooks": {
"pre-commit": [
{
"command": "npm",
"args": ["run", "lint"]
},
{
"command": "npm",
"args": ["run", "test"]
},
{
"command": "./scripts/check-coverage.sh"
}
]
}
}

範例 2:通知 hooks

{
"hooks": {
"post-tool": {
"command": "./scripts/notify-slack.sh",
"enabledForTools": ["Bash", "Edit"],
"onlyOnFailure": true
}
}
}

範例 3:工作階段 hooks

{
"hooks": {
"session-start": {
"command": "./scripts/session-start.sh",
"additionalContext": {
"logFile": "/tmp/claude-session.log"
}
},
"session-end": {
"command": "./scripts/session-summary.sh"
}
}
}

工作階段分叉與倒轉

什麼是工作階段分叉?

分叉建立您工作階段的副本,您可以在不影響原始工作階段的情況下進行實驗。

分叉工作階段

方法 1:指令列

# 分叉目前工作階段
claude --fork-session

# 分叉並繼續特定工作階段
claude --resume session-id --fork-session --session-id new-session-id

方法 2:工作階段期間

您> /fork

Claude:我將建立此工作階段的分叉。

[建立分叉...]

已建立分叉:session-abc123
原始工作階段:session-xyz789

您現在位於分叉的工作階段中。此處的變更不會影響原始工作階段。

方法 3:從繼續畫面

claude --resume

[繼續畫面顯示]
工作階段列表:
session-xyz789 - 原始工作階段
[P] 預覽 [R] 重新命名

session-abc123 - 從 session-xyz789 分叉
[P] 預覽 [R] 重新命名

倒轉工作階段

什麼是倒轉? 透過還原到對話中的先前點來復原變更。

方法 1:/rewind 指令

您> /rewind

Claude:您想要倒轉多遠?

1. 上一則訊息
2. 5 則訊息前
3. 10 則訊息前
4. 上次編輯之前
5. 自訂點

選擇 [1-5]:4

[倒轉到上次編輯之前...]

已還原編輯:
- src/app.ts(還原)
- src/utils.ts(還原)

工作階段成功倒轉。

方法 2:從 VS Code

[在 VS Code 延伸中]
點擊「倒轉」按鈕 → 選擇點 → 確認倒轉

分叉工作流程

工作流程 1:安全實驗

1. 處理功能
2. 想嘗試有風險的事情
3. 分叉工作階段
4. 在分叉中實驗
5. 如果可行:套用到原始
6. 如果失敗:分叉被丟棄,原始安全

工作流程 2:並行探索

1. 分叉工作階段 A → 工作階段 B
2. 分叉工作階段 A → 工作階段 C
3. 在原始中嘗試方法 A
4. 在工作階段 B 中嘗試方法 B
5. 在工作階段 C 中嘗試方法 C
6. 比較結果
7. 使用最佳方法

工作流程 3:除錯 vs. 修正

1. 分叉工作階段
2. 原始:繼續開發
3. 分叉:調查 bug
4. 分叉找到根本原因
5. 將修正套用到原始

外部編輯器(Ctrl+G)

什麼是外部編輯器?

Ctrl+G 在您組態的文字編輯器(vim、nano、VS Code 等)中編輯目前的提示。

設定外部編輯器

方法 1:環境變數

# 設定預設編輯器
export EDITOR=vim
export VISUAL=vim

# 或使用其他編輯器
export EDITOR=nano
export EDITOR="code --wait"
export EDITOR=subl

方法 2:Git config

git config --global core.editor vim
git config --global core.editor "code --wait"

使用 Ctrl+G

基本用法:

您> 我需要重構認證系統以使用 OAuth2 而不是基本 auth,
而我不確定是否應該...

[按 Ctrl+G]

[Vim 開啟您的提示]

# 在 vim 中編輯
我需要重構認證系統以使用 OAuth2。
目前的實作使用具有工作階段的基本 auth。

需求:
- 使用 OAuth2 與 Google 提供者
- 安全儲存 token
- 處理 token 重新整理
- 維持向後相容性

[儲存並退出 vim]

提示已更新您的編輯!

進階用法 - 多行提示:

您> [按 Ctrl+G]

[Vim 開啟]

使用以下端點建立使用者管理的 REST API:

- POST /api/users - 建立使用者
- GET /api/users/:id - 按 ID 取得使用者
- GET /api/users - 列出使用者(含分頁)
- PUT /api/users/:id - 更新使用者
- DELETE /api/users/:id - 刪除使用者

需求:
- 使用 Express.js
- 使用 Joi 驗證輸入
- 儲存在 PostgreSQL
- 新增單元測試
- 包含錯誤處理
- 新增認證中介軟體

[儲存並退出]

Claude:我將建立具有這些端點的 REST API。
[建立全面的 API 實作]

技能中的外部編輯器

「其他」欄位中的外部編輯器(2.1.x):

Claude 詢問:「您想要哪種認證方法?」
選項:[1] OAuth, [2] JWT, [3] 其他

您:選擇 [3] 其他

[在「其他」輸入欄位中按 Ctrl+G]

[編輯器開啟]

自訂需求:
使用 Auth0 搭配社交登入(Google、GitHub、Twitter)
並支援企業 SAML。

[儲存並退出]

已提交您的自訂需求!

增強的 Vim 動作

新的 Vim 動作(2.1.x)

Claude Code 的文字輸入現在支援增強的 vim 動作,用於高效編輯。

新的動作

重複 f/F/t/T:

;    # 向前重複上次 f/F/t/T 動作
, # 向後重複上次 f/F/t/T 動作

Yank 和貼上:

y    # Yank 操作員(複製)
yy # Yank 整行
Y # 與 yy 相同
p # 在游標後貼上
P # 在游標前貼上

文字物件:

# 內部文字物件(不包含周圍字元)
ci" # 在引號內變更
ci' # 在單引號內變更
ci( # 在括號內變更
ci) # 與 ci( 相同
ci[ # 在方括號內變更
ci] # 與 ci[ 相同
ci{ # 在大括號內變更
ci} # 與 ci{ 相同
ciw # 在單字內變更
ciW # 在 WORD 內變更

# 周圍文字物件(包含周圍字元)
ca" # 變更引號周圍(包含引號)
ca' # 變更單引號周圍(包含單引號)
ca( # 變更括號周圍(包含括號)
ca) # 與 ca( 相同
ca[ # 變更方括號周圍(包含方括號)
ca] # 與 ca[ 相同
ca{ # 變更大括號周圍(包含大括號)
ca} # 與 ca{ 相同
caw # 變更單字周圍
caW # 變更 WORD 周圍

# 也適用於刪除(d)、yank(y)、視覺(v)
di" # 刪除引號內
da" # 刪除引號周圍(包含引號)
yi( # Yank 括號內
ya( # Yank 括號周圍

縮排:

>>   # 縮排行或選擇
<< # 取消縮排行或選擇

加入行:

J    # 加入下一行到目前

完整 Vim 動作參考

基本移動:

h    # 左
j # 下
k # 上
l # 右
w # 單字向前
b # 單字向後
e # 單字結尾
0 # 行首
$ # 行尾
gg # 檔案首
G # 檔案尾

操作員:

d    # 刪除
c # 變更
y # Yank(複製)
p # 貼上
v # 視覺

動作:

f<character>   # 向前尋找字元
F<character> # 向後尋找字元
t<character> # 向前直到字元
T<character> # 向後直到字元
; # 向前重複上次 f/F/t/T
, # 向後重複上次 f/F/t/T

範例:

df)  # 刪除直到右括號
cf" # 變更引號內
y$ # Yank 到行尾
dgg # 刪除到檔案首
ci{ # 變更大括號內
daw # 刪除單字周圍

任務相依性

什麼是任務相依性?

任務可以相依於其他任務,為複雜的工作流程建立相依性圖

設定相依性

建立相依任務:

您> 我需要實作使用者認證

Claude:我將為此工作建立任務。

[任務 1] 建立使用者模型
[ ] 定義 User schema
[ ] 新增資料庫遷移
[ ] 建立 User 模型類別

[任務 2] 建立認證服務
- 被任務 1 封鎖
[ ] 實作登入
[ ] 實作註冊
[ ] 實作密碼雜湊

[任務 3] 建立 API 端點
- 被任務 2 封鎖
[ ] POST /api/auth/login
[ ] POST /api/auth/register
[ ] GET /api/auth/me

任務將按相依性順序執行。

管理相依性:

您> 顯示任務相依性

Claude:任務相依性圖:

任務 1:建立使用者模型
└─ 無相依性

任務 2:建立認證服務
└─ 相依於:任務 1

任務 3:建立 API 端點
└─ 相依於:任務 2

流程:任務 1 → 任務 2 → 任務 3

更新相依性:

您:新增任務 4 進行測試,相依於任務 3

Claude:已新增任務:

[任務 4] 撰寫測試
- 被任務 3 封鎖
[ ] 測試登入端點
[ ] 測試註冊端點
[ ] 測試認證中介軟體

已更新圖:
任務 1 → 任務 2 → 任務 3 → 任務 4

相依性工作流程

工作流程 1:順序相依性

資料庫 → 模型 → API → 測試 → 文件

工作流程 2:設定後並行

設定 → 前端 → 測試
└→ 後端 ─┘

工作流程 3:多個相依性

     資料庫模型

┌──────┴──────┐
│ │
Auth API User API
│ │
└──────┬──────┘

整合測試

WezTerm 支援(2.1.33)

WezTerm 用於代理團隊

teammateMode 設定為 WezTerm:

{
"teammateMode": "wezterm"
}

WezTerm 組態:

-- ~/.wezterm.lua
local wezterm = require('wezterm')
local config = {}

config.keys = {
-- 水平分割
{
key = '|',
mods = 'CTRL|SHIFT',
action = wezterm.action.SplitHorizontal {
domain = 'CurrentPaneDomain',
},
},
-- 垂直分割
{
key = '-',
mods = 'CTRL|SHIFT',
action = wezterm.action.SplitVertical {
domain = 'CurrentPaneDomain',
},
},
-- 導航窗格
{
key = 'LeftArrow',
mods = 'CTRL',
action = wezterm.action.ActivatePaneDirection('Left'),
},
{
key = 'RightArrow',
mods = 'CTRL',
action = wezterm.action.ActivatePaneDirection('Right'),
},
}

return config

✅ 檢查您的理解

  1. Bash(npm *) 符合什麼?

    • 只有 npm
    • 所有 npm 指令
    • 以 "npm" 結尾的指令
    • 沒有
  2. 如何在外部編輯器中編輯提示?

    • Ctrl+E
    • Ctrl+G
    • Ctrl+V
    • Ctrl+X
  3. True or False: 技能可以有自己的 hooks。

    • True
    • False
  4. ci" 在 vim 模式中做什麼?

    • 變更引號內
    • 刪除引號內
    • Yank 引號內
    • 複製引號
  5. 什麼指令分叉工作階段?

    • /clone
    • /fork
    • /copy
    • /new

答案: 1-b, 2-b, 3-True, 4-a, 5-b


總結

在本課程中,您學到了:

  • 萬用字元權限 - 彈性的權限模式
  • 增強的 hooks - 用於技能、代理和指令
  • 工作階段分叉 - 安全實驗
  • 外部編輯器 - Ctrl+G 用於提示編輯
  • 增強的 vim 動作 - 強大的文字編輯
  • 任務相依性 - 複雜的工作流程管理
  • WezTerm 支援 - WezTerm 中的代理團隊

恭喜!

您已完成 Claude Code 教程的全部 20 堂課程!您現在配備了:

  • 核心操作與權限
  • 進階功能與工作流程
  • 多代理自動化
  • 代理團隊協作
  • 最新的 2.1.33 功能

下一步

  1. 實作 - 在真實專案中使用功能
  2. 探索 - 查看生態系統和市集
  3. 貢獻 - 分享您的技能和 MCP 伺服器
  4. 保持更新 - 觀看新的 Claude Code 版本

進階閱讀


祝您使用 Claude Code 編碼愉快!🚀