權限設定檔

權限設定檔控制可執行哪些 discli 指令。當 discli 以 AI 代理的子程序執行時,這個機制非常重要,可限制代理可做的操作。

內建設定檔

full

完整權限,允許所有指令。預設值即為 full。

{
"description": "Full access to all commands",
"allowed": ["*"],
"denied": []
}

chat

訊息、反應、討論串、輸入狀態、DM、接聽、服務模式、設定、伺服器查詢。封鎖會造成破壞性的審核與基礎建設操作。

{
"description": "Messages, reactions, threads, typing only",
"allowed": [
"message",
"reaction",
"thread",
"typing",
"dm",
"listen",
"serve",
"config",
"server"
],
"denied": [
"member kick",
"member ban",
"member unban",
"member timeout",
"channel delete",
"role delete",
"role create",
"channel create",
"message bulk-delete",
"webhook delete",
"event delete"
]
}

readonly

唯讀權限。只允許 list、info、get、search 與 listen。其他行為預設全部拒絕。

{
"description": "Read-only: list, info, get, search, listen",
"allowed": [
"message list",
"message get",
"message search",
"message history",
"channel list",
"channel info",
"server list",
"server info",
"role list",
"member list",
"member info",
"reaction list",
"thread list",
"listen",
"config show"
],
"denied": ["*"]
}

moderation

包含所有指令與 moderation 動作的完整權限。功能上等同 full

{
"description": "Full access including moderation",
"allowed": ["*"],
"denied": []
}

檢查目前權限檔

discli permission show

純文字輸出:

Active profile: chat
Description: Messages, reactions, threads, typing only
Allowed: message, reaction, thread, typing, dm, listen, serve, config, server
Denied: member kick, member ban, member unban, member timeout, channel delete, role delete, role create, channel create, message bulk-delete, webhook delete, event delete

使用 --json

{
"active_profile": "chat",
"description": "Messages, reactions, threads, typing only",
"allowed": ["message", "reaction", "thread", "typing", "dm", "listen", "serve", "config", "server"],
"denied": ["member kick", "member ban", "member unban", "member timeout", "channel delete", "role delete", "role create", "channel create", "message bulk-delete", "webhook delete", "event delete"]
}

設定目前權限檔

discli permission set <profile>

<profile> 可使用 fullchatreadonlymoderation

範例:

discli permission set readonly

輸出:

Permission profile set to: readonly (Read-only: list, info, get, search, listen)

設定會儲存在 ~/.discli/permissions.json


列出所有設定檔

discli permission profiles

單次命令覆蓋

使用 --profile 全域參數可覆蓋目前設定,只套用到單一指令,不修改持久化設定:

discli --profile readonly message list general

也可以用 DISCLI_PROFILE 環境變數:

DISCLI_PROFILE=chat discli message send general "Hello"

自訂權限檔

可直接編輯 ~/.discli/permissions.json。檔案格式如下:

{
"active_profile": "my-custom",
"profiles": {
"my-custom": {
"description": "Only messaging and reactions",
"allowed": ["message send", "message reply", "reaction add", "reaction remove"],
"denied": ["*"]
}
}
}

自訂設定檔採用與內建相同比對規則;將 active_profile 設為自訂名稱即可啟用。


權限比對邏輯

執行指令時,discli 會先解析目前權限(來源順序:--profileDISCLI_PROFILE 環境變數、~/.discli/permissions.json),再做以下判斷:

  1. 先比對 denied。 若任何 denied 規則符合,指令會被封鎖;只有在 denied 包含 "*" 的情況下,且同時在 allowed 有明確放行時,才會放行(見步驟 2)。

  2. 全域拒絕("*" 在 denied)。denied 包含 "*" 時,預設封鎖全部指令,只有 allowed 明確列出的指令才放行。readonly 行為即如此。

  3. 再比對 allowed。 若 denied 無任何命中,指令必須符合 allowed 規則才能執行。allowed 中若有 "*" 則放行全部。

模式比對規則:

  • "*" 符合全部指令。
  • "message" 符合 message sendmessage listmessage deletemessage 子指令。
  • "message send" 僅符合 message send
  • "member kick" 僅符合 member kick

比對邏輯是完整指令路徑完全相符,或以 pattern 開頭且後面接一個空白。也就是 "message" 能比對 message send,但不會比對 messaging


Discord 權限對照表

部分指令仍需機器人本身在伺服器上具備對應 Discord 權限:

指令Discord 權限
member kickkick_members
member ban / member unbanban_members
member timeoutmoderate_members
message delete / message bulk-deletemanage_messages
channel create / channel delete / channel editmanage_channels
role create / role delete / role editmanage_roles
webhook create / webhook deletemanage_webhooks
event create / event deletemanage_events

危險操作保護

即使未受權限檔限制,以下指令仍需互動確認:

  • member kick
  • member ban
  • member unban
  • member timeout
  • channel delete
  • message delete
  • message bulk-delete
  • role delete
  • webhook delete
  • event delete

可加上 --yes / -y 全域旗標跳過確認(例如腳本、代理自動化)。破壞性動作都會寫入稽核日誌 ~/.discli/audit.log