Summary
当需要为 bk-cli 扩展 system 能力时使用:无论是新增顶层 system、给已有 system 增加 action、还是为大 system 增加一层 subsystem,都应先使用此技能。技能会先检查目标 system/subsystem 是否已存在,遇到多模块 API 列表时先让用户在扁平 action…
tencentblueking/bk-cli · Archived
当需要为 bk-cli 扩展 system 能力时使用:无论是新增顶层 system、给已有 system 增加 action、还是为大 system 增加一层 subsystem,都应?
npx skills add tencentblueking/bk-cli --skill create-bk-cli-system
当需要为 bk-cli 扩展 system 能力时使用:无论是新增顶层 system、给已有 system 增加 action、还是为大 system 增加一层 subsystem,都应先使用此技能。技能会先检查目标 system/subsystem 是否已存在,遇到多模块 API 列表时先让用户在扁平 action…
This repository is archived — consider an actively maintained alternative.
当任务涉及 bk-cli 的通用使用规则时使用,尤?
7 installs当需要通过 `bk-cli bcs` 调用 BCS API 时使用;当前主要覆盖 `bk-cli bcs cluster_manager` 下的集群…
7 installs当需要通过 `bk-cli apigateway` 发现 BlueKing API Gateway 中所有?
7 installs当需要通过 `bk-cli api` 对任意 BlueKing API Gateway 发起原始 HTTP 调用时使用,尤?
7 installsRelated neighbors and high-traction skills in the same topics — useful to compare before installing.
Create a new Remotion video
74.5K installsCreate a new Google Slides presentation and add initial slides.
29.3K installsCreate a Gmail filter to automatically label, star, or categorize incoming messages.
28.3K installsCopy a Google Docs template, fill in content, and share with collaborators.
27.7K installsCreate a Google Shared Drive and add members with appropriate roles.
27.3K installsOther skills from tencentblueking/bk-cli · top by installs.
npx skills add tencentblueking/bk-cli
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
master
Files included with this skill beyond the listing page.
SKILL.md
25,189 B
SUMMARY.md
453 B
这个技能统一覆盖两类工作:
本技能同时提供创建/扩展 system 时必查的共享契约摘要;详细规则以 docs/design.md 为准。先判断 system 是否已存在,再决定走哪条分支;不要先写代码再回头补注册或补结构。
AGENTS.md 和 docs/design.md,确认仓库边界与设计基线。docs/design.md。如果用户的需求、OpenAPI 列表、资源 tags 或业务描述天然分成多个模块,先暂停实现,给用户两个选项:
bk-cli <system> <action>,通过 action 名区分模块,例如 getpipelinebuild_list。bk-cli <system> <subsystem> <action>,例如 bk-cli devops pipeline getbuildlist、bk-cli devops codecc gettaskdetail、bk-cli devops stream trigger。当前只允许一层 subsystem,不允许 bk-cli <system> <subsystem> <sub_subsystem> <action>。如果用户需要更深层级,停止实现并给出公共契约变更 proposal 建议。
按下面顺序检查:
AGENTS.md、docs/design.md,并先通读本技能后面的“扩展 system 必查摘要”cmd/system/register.go,确认 systemCatalog() 的注册方式- cmd/system/<system>.go - cmd/system/<system>/spec.go - cmd/system/<system>/actions.yaml - cmd/system/<system>/<subsystem>/spec.go - cmd/system/<system>/<subsystem>/actions.yaml
new<System>SystemSpec() 或 NewSystemSpec(),确认该 system 是否已接入 catalog判断结果:
文档分层以 AGENTS.md 为准;详细共享契约以 docs/design.md 为准。生成 system/action 时,至少先确认:
docs/design.md 为准。--stage、timeout、tenant、--header 的优先级不要自己重写;涉及这些行为时回查 docs/design.md。--header 覆盖 X-Bkapi-Authorization,--dry-run / --verbose 仍必须脱敏展示认证内容。authConfig;resourcePermissionRequired: true 必须同时设置 appVerifiedRequired: true。params 只支持 in: path、in: query 和帮助用途的 in: header;不要声明 in: body。--stage、--body '<json>'、重复的 --header 'Key:Value';保留 flag 名冲突时应跳过 action 并给出 warning。--body '<json>',请求体示例放进 examples,并在 YAML action 中配置 bodyschema。如果 OpenAPI 标记 request body 为 required,同时配置 bodyrequired: true。默认 help 按 Usage、Examples、schema 查看提示的顺序展示,完整 schema 通过 bk-cli <system> [subsystem] <action> -h --body-schema 查看。/ 或 ?。systemcmd.ResolveRuntime(deps) 和 systemcmd.ExecuteRequest(...) 或 syslib.ExecuteRequest(...) 走共享执行路径,不要绕过 runtime / output / credential 逻辑。--body 时,把 --body 视为显式覆盖。一个 command group 可以是以下形态之一:
actions.yaml 定义一个 action 的实现方式只看它自己的复杂度,不看别的 action 已经用什么。
同一 parent 下的直接子命令名必须唯一。父 system 的 action 名不能和 subsystem 名冲突。
优先选择满足需求的最简单实现。
优先用 YAML,当且仅当下面条件都满足:
cli args -> 一次 API 调用--body 直接提供完整 JSON,且 examples / body_schema 足以指导 Agent 构造 body,也优先保持 YAML-driven必须用 Go-implemented action,只要满足任一条件:
--bkbizid、--fields、--limit, 封装/处理/编排后再作为请求参数mutate 或手工 envelope 调整返回body_schema 用于“body 很复杂,但 action 本身仍然只是一次 API 调用”的场景。典型例子是 OpenAPI 的 request body 有大量嵌套字段、数组或对象,Agent 需要根据 schema 自行构造完整 JSON。
规则:
path / query 参数转成 flags;body 继续通过共享 --body '<json>' 输入。body_schema 放精简后的 JSON schema 或字段结构说明;可直接作为 --body 起点的 JSON 示例放在 action examples 中,避免和示例重复维护。body_required: true;这样执行时缺少 --body 会在本地失败,不会把空 body 发送到上游。bk-cli <system> [subsystem] <action> --help 必须先展示 Usage 和 Examples,再展示 schema 查看提示;body_schema 必须能通过 bk-cli <system> [subsystem] <action> -h --body-schema 看到。系统专属 skills/*/SKILL.md 只能放常用示例,不能作为唯一的 body 结构来源。--body-schema 是 help modifier,不是执行参数;不带 -h 单独使用时必须快速失败,不能进入认证或请求执行路径。systemcmd.SystemSpectype SystemSpec struct {
Name string
Description string
YAMLFile string
RegisterGoActions RegisterGoActionsFunc
Subsystems []SystemSpec
}
systemcmd.BuildDepstype BuildDeps struct {
GetContext func() string
IsDryRun func() bool
IsVerbose func() bool
WarnWriter io.Writer
}
syslib.RequestSpecGo-implemented action 用它描述单次请求。常用字段:
GatewayNameMethodPathParamsJSONBodyJSONHeadersStageTimeoutAuthConfigAuthConfig 必须显式设置,使用 &syslib.AuthConfig{...}。
| Helper | 用途 |
|---|---|
systemcmd.ResolveRuntime(deps) |
在 RunE 开头统一解析 context、dry-run、verbose、insecure |
systemcmd.ExecuteRequest(cmd, runtime, actionName, spec, mutate) |
单次请求 action 的标准执行路径 |
syslib.ExecuteRequest(runtime, spec) |
多次请求编排、分页聚合 |
systemcmd.EnsureEnvelope(actionName, env) |
防御空 envelope |
| Helper | 用途 |
|---|---|
systemcmd.AddCommonRequestFlags(cmd, &stage, &body, &headers) |
注册 --stage、--body、--header |
systemcmd.AddCommonRequestFlagsWithoutBody(cmd, &stage, &headers) |
注册 --stage、--header |
systemcmd.MarshalJSON(payload) |
统一序列化 body |
systemcmd.ValidatePositiveIntFlag(...) |
校验必填正整数 |
systemcmd.ValidatePositiveIntFlagIfChanged(...) |
校验可选正整数 |
systemcmd.ValidateNonNegativeIntFlag(...) |
校验非负整数 |
systemcmd.ValidateNonEmptyStringFlag(...) |
校验非空字符串 |
systemcmd.ParseJSONObjectFlag(flagName, raw) |
解析 JSON object 类型 flag |
| Helper | 用途 |
|---|---|
testutil.BuildDeps(dryRun bool) |
构造测试依赖 |
testutil.SetupTestContext(baseURL string) |
创建默认 context 与凭据 |
testutil.CaptureCommandStdout(fn) |
捕获 stdout |
testutil.BuildYAMLActionCmd(...) |
构造 YAML action 测试命令 |
不要自己重复实现这些共享能力。
始终需要:
| 文件 | 用途 |
|---|---|
cmd/system/<system>.go |
薄包装,调用 <system>.NewSystemSpec() |
cmd/system/<system>/spec.go |
NewSystemSpec() 实现 |
cmd/system/register.go |
在 systemCatalog() 中注册 |
按需新增:
| 文件 | 条件 |
|---|---|
cmd/system/<system>/actions.yaml |
该 system 需要 YAML actions |
cmd/system/<system>/<action>.go |
该 system 需要 Go-implemented actions |
cmd/system/<system>/common.go |
多个 Go actions 共享逻辑 |
cmd/system/<system>/<system>suitetest.go |
该 system 有 Ginkgo 测试 |
skills/bk-cli-<system>/SKILL.md |
新增公开 system 时必须补齐,且内容用中文 |
package system
import <system>system "github.com/TencentBlueKing/bk-cli/cmd/system/<system>"
func new<System>SystemSpec() SystemSpec {
return <system>system.NewSystemSpec()
}
spec.go 模板func NewSystemSpec() systemcmd.SystemSpec {
return systemcmd.SystemSpec{
Name: "<system>",
Description: "<system> system commands",
YAMLFile: "<system>/actions.yaml",
}
}
func NewSystemSpec() systemcmd.SystemSpec {
return systemcmd.SystemSpec{
Name: "<system>",
Description: "<system> system commands",
RegisterGoActions: func(parent *cobra.Command, deps systemcmd.BuildDeps) error {
parent.AddCommand(newSomeActionCmd(deps))
return nil
},
}
}
func NewSystemSpec() systemcmd.SystemSpec {
return systemcmd.SystemSpec{
Name: "<system>",
Description: "<system> system commands",
YAMLFile: "<system>/actions.yaml",
RegisterGoActions: func(parent *cobra.Command, deps systemcmd.BuildDeps) error {
builders := []func(systemcmd.BuildDeps) *cobra.Command{
newActionOneCmd,
newActionTwoCmd,
}
for _, build := range builders {
parent.AddCommand(build(deps))
}
return nil
},
}
}
在 cmd/system/register.go 的 systemCatalog() 中加入新 system。
如果用了 YAML,文件必须放在 cmd/system/<system>/actions.yaml,因为仓库依赖 //go:embed */actions.yaml 自动嵌入。
common.go 建议多个 Go-implemented actions 共享逻辑时,把下面内容放进 common.go:
该 system 只要出现测试文件,就补 suite 文件:
package <system>_test
import (
"testing"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
func TestSuite(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "<System> Suite")
}
YAML 文件位置固定为:
cmd/system/<system>/actions.yaml
如果 SystemSpec.YAMLFile 已配置,只需要在 actions 列表中追加 action,不需要额外 Go wiring。
name: <system>
gateway_name: bk-<upstream>
description: "System description"
actions:
- ...
| 字段 | 必填 | 说明 |
|---|---|---|
name |
是 | action 命令名 |
description |
是 | Cobra Short |
method |
是 | HTTP 方法 |
path |
是 | API 路径,可带 {param} |
timeout |
否 | 覆盖 context timeout,例如 30s |
authConfig |
是 | 认证配置 |
params |
否 | 参数列表 |
examples |
否 | 命令示例 |
body_schema |
否 | 复杂 request body 的 schema 或字段结构说明;通过 -h --body-schema 帮助 Agent 构造 --body |
body_required |
否 | 执行时是否要求非空 --body;OpenAPI requestBody.required=true 时应设置为 true |
authConfig| 字段 | 必填 | 说明 |
|---|---|---|
appVerifiedRequired |
是 | 是否需要应用认证 |
userVerifiedRequired |
是 | 是否需要用户认证 |
resourcePermissionRequired |
是 | 是否需要资源权限校验 |
约束:
resourcePermissionRequired: true 时,appVerifiedRequired 也必须为 trueX-Bkapi-Authorization--header 覆盖认证头,dry-run / verbose 也必须继续脱敏展示认证内容params| 字段 | 必填 | 说明 |
|---|---|---|
name |
是 | 参数名,也是 flag 名 |
in |
是 | path、query 或 header |
type |
是 | string、bool、int |
description |
否 | 帮助文本 |
required |
否 | 是否必填 |
default |
否 | 默认值 |
规则:
path 与 query 会生成 CLI flagsheader 仅用于帮助文本,不生成独立 flagin: body--stage、--body '<json>' 和重复的 --header 'Key:Value';有 bodyschema 时额外支持 help modifier --body-schema;有 bodyrequired: true 时 --body 是执行必填项body、body-schema、header、stage、help、context、dry-run、format、verbose、insecure| 文件 | 用途 |
|---|---|
cmd/system/<system>/<action>.go |
action 构造函数 |
cmd/system/<system>/spec.go |
注册新 action |
cmd/system/<system>/<action>_test.go |
action 测试 |
cmd/system/<system>/common.go |
共享逻辑,可选 |
func newSomeActionCmd(deps systemcmd.BuildDeps) *cobra.Command {
var (
bizID int
stage string
body string
headers []string
)
cmd := &cobra.Command{
Use: "some_action",
Short: "Short description",
RunE: func(cmd *cobra.Command, args []string) error {
runtime, err := systemcmd.ResolveRuntime(deps)
if err != nil {
return err
}
if err := systemcmd.ValidatePositiveIntFlag("bk_biz_id", bizID); err != nil {
return err
}
bodyJSON, err := buildSomeBody(body, bizID)
if err != nil {
return err
}
return systemcmd.ExecuteRequest(cmd, runtime, "some_action", syslib.RequestSpec{
GatewayName: gatewayName,
Method: "POST",
Path: "/api/v3/some/path/",
BodyJSON: bodyJSON,
Headers: headers,
Stage: stage,
AuthConfig: &syslib.AuthConfig{
AppVerifiedRequired: true,
UserVerifiedRequired: true,
ResourcePermissionRequired: false,
},
}, nil)
},
}
cmd.Flags().IntVar(&bizID, "bk_biz_id", 0, "Business ID")
systemcmd.AddCommonRequestFlags(cmd, &stage, &body, &headers)
return cmd
}
优先使用 bodyOverride 守卫:
func buildSomeBody(bodyOverride string, bizID int) (string, error) {
if bodyOverride != "" {
return bodyOverride, nil
}
if err := systemcmd.ValidatePositiveIntFlag("bk_biz_id", bizID); err != nil {
return "", err
}
return systemcmd.MarshalJSON(map[string]any{
"bk_biz_id": bizID,
})
}
需要在 stdout 前调整 envelope 时,传入 mutate:
return systemcmd.ExecuteRequest(cmd, runtime, "demo_action", spec,
func(env *output.Envelope) error {
if env.DryRun {
env.Data = map[string]any{"received": localData}
return nil
}
env.Data = map[string]any{
"received": localData,
"upstream": env.Data,
}
return nil
})
--body 的 action如果 action 自己管理 body 语义:
systemcmd.AddCommonRequestFlagsWithoutBody--body flagRequestSpec.BodyJSON 由本地逻辑决定多个 action 共享同一套 flag/request 结构时,把公共部分收进 common.go,用 spec struct + factory function 生成命令,避免复制粘贴。
需要分页聚合或多次调用时:
syslib.ExecuteRequest(runtime, spec) 发每次请求systemcmd.EnsureEnvelope(actionName, result.Envelope) 校验结果spec.go 中挂载builders := []func(systemcmd.BuildDeps) *cobra.Command{
newExistingActionCmd,
newSomeActionCmd,
}
for _, build := range builders {
parent.AddCommand(build(deps))
}
| 文件 | 用途 |
|---|---|
cmd/system/<system>/spec.go |
在 SystemSpec.Subsystems 中注册 subsystem |
cmd/system/<system>/<subsystem>/spec.go |
NewSystemSpec() 实现,描述 subsystem 自己的 YAML/Go actions |
cmd/system/<system>/<subsystem>/actions.yaml |
该 subsystem 需要 YAML actions 时使用 |
cmd/system/<system>/<subsystem>/<action>.go |
该 subsystem 需要 Go-implemented actions 时使用 |
cmd/system/<system>/<subsystem>/common.go |
多个 Go actions 共享逻辑,可选 |
cmd/system/<system>/<subsystem>/<subsystem>suitetest.go |
该 subsystem 有测试时必须存在 |
spec.go 模板package <subsystem>
import (
"github.com/spf13/cobra"
systemcmd "github.com/TencentBlueKing/bk-cli/internal/systemcmd"
)
func NewSystemSpec() systemcmd.SystemSpec {
return systemcmd.SystemSpec{
Name: "<subsystem>",
Description: "<subsystem> commands",
YAMLFile: "<system>/<subsystem>/actions.yaml",
RegisterGoActions: func(parent *cobra.Command, deps systemcmd.BuildDeps) error {
parent.AddCommand(newSomeActionCmd(deps))
return nil
},
}
}
func NewSystemSpec() systemcmd.SystemSpec {
return systemcmd.SystemSpec{
Name: "<system>",
Description: "<system> commands",
YAMLFile: "<system>/actions.yaml",
RegisterGoActions: func(parent *cobra.Command, deps systemcmd.BuildDeps) error {
parent.AddCommand(newParentActionCmd(deps))
return nil
},
Subsystems: []systemcmd.SystemSpec{
<subsystem>.NewSystemSpec(),
},
}
}
父 system 的 YAMLFile 和 RegisterGoActions 都是可选的。不要为了挂 subsystem 创建无意义的父 action。
name: <subsystem>
gateway_name: <subsystem-gateway-name>
description: "<subsystem> commands"
actions:
- name: <action>
subsystem YAML 的 gateway_name 必须独立声明,不从父 system 继承。
至少补充或更新:
cmd/system/register_test.go:system 注册行为cmd/system/<system>/<action>_test.go:Go-implemented action 测试cmd/system/<system>/<subsystem>/<action>_test.go:subsystem Go-implemented action 测试cmd/system/<system>/<system>suitetest.go:该 system 有测试时必须存在cmd/system/<system>/<subsystem>/<subsystem>suitetest.go:该 subsystem 有测试时必须存在如果新增公开 system,同步更新:
AGENTS.mdREADME.mdREADME_EN.mdtests/integration/AGENTS.mdskills/bk-cli-<system>/SKILL.md如果只是改动已有命令或参数,也要同步更新 AGENTS.md、README.md、README_EN.md、tests/integration/AGENTS.md 和相关 skill。
如果变更影响公开 system 的可见行为,补充或更新:
tests/integration/cases/system/<system>/ 下的 YAML 集成用例tests/integration/mock_api/app.py(仅当 httpbin 不够表达该行为时)cmd/system/<system>.go 与 cmd/system/<system>/spec.go 都存在SystemSpec.Name、YAML 顶层 name、注册项三者一致cmd/system/register.go 的 systemCatalog() 已包含目标 systemcmd/system/<system>/actions.yamlauthConfigsystemcmd.ResolveRuntimesystemcmd.ExecuteRequest 或 syslib.ExecuteRequestsystemcmd helpercmd/system/testutilskills/bk-cli-<system>/SKILL.mdtests/integration/cases/system/<system>/ 补齐或确认无需变更tests/integration/AGENTS.mdcmd/system/<system>/<subsystem>/...name 是 <subsystem>,并且独立声明 gateway_namemake fmt
make lint
make test
make build
make test-integration SCENARIO=<SCENARIO_ID>
docs/design.md 为准。--dry-run 查看最终请求构造。docs/design.md 深挖。actions.yaml,却没有补 cmd/system/<system>.go 与 spec.gosystemCatalog()cmd/system/<system>/actions.yamlauthConfigparams 中写 in: bodyResolveRuntime 或 ExecuteRequestskills/bk-cli-<system>/SKILL.mdsyslib / systemcmdnamegateway_name 并继承父 system