一键导入
go-service-guide
MaaFramework Go Agent / go-service 编写指南。用于编写、修改或审查 agent/go-service/ 下的 Go 自定义识别器、动作、EventSink,或了解 MaaFramework Go Agent 的注册、日志、目录组织和参数解析模式。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
MaaFramework Go Agent / go-service 编写指南。用于编写、修改或审查 agent/go-service/ 下的 Go 自定义识别器、动作、EventSink,或了解 MaaFramework Go Agent 的注册、日志、目录组织和参数解析模式。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
调试和优化 MaaFramework Pipeline JSON。用于对照 schema 验证配置,检测缺失引用、循环依赖、孤立节点、命名与行为不匹配、ROI/阈值问题,并给出可靠性、性能和可维护性改进建议。触发词包括 debug pipeline、validate pipeline、optimize pipeline、pipeline error。
MaaFramework Pipeline JSON 编写指南。用于编写、修改或审查 Pipeline JSON,设计节点流程,使用 TemplateMatch/OCR/ColorMatch/Custom 识别或 Click/Swipe/Custom 动作,并检查 MaaFramework 项目的通用 Pipeline 可靠性。
MDA 项目专属开发指南。用于在 MDA 中编写或审查 MaaFramework Pipeline、Project Interface 任务、locale、go-service 组件时补充项目结构、业务域、命名习惯和现有任务选项示例。与通用 pipeline-guide、pipeline-debug、generate-pi-task、go-service-guide 配合使用。
分析 Windows 崩溃转储文件(.dmp),诊断 MaaFramework / MXU 项目及其依赖项的崩溃。用于 issue 日志包或附件中发现 .dmp 文件,或用户要求分析 DMP / 崩溃转储时。
根据 MaaFramework Pipeline 定义生成或更新 Project Interface 任务 JSON。用于创建、编辑或扩展 assets/tasks/ 下的任务文件,将 Pipeline 节点映射为用户可配置选项(switch/select/checkbox/input)并绑定 pipeline_override。
MaaFramework C++ 日志宏用法指南。用于写 C++ MaaFramework 扩展、Custom 组件或工具代码时使用 LogInfo/LogError/LogWarn/LogDebug/LogTrace、VAR、容器输出和自定义类型日志。
| name | go-service-guide |
| description | MaaFramework Go Agent / go-service 编写指南。用于编写、修改或审查 agent/go-service/ 下的 Go 自定义识别器、动作、EventSink,或了解 MaaFramework Go Agent 的注册、日志、目录组织和参数解析模式。 |
Go Service / Go Agent 只处理 Pipeline 难以表达的复杂逻辑,例如图像算法、状态机、外部数据、系统环境检查、运行时上下文处理等。
不要在 Go 中编写大规模业务流程;业务流程控制应优先由 Pipeline JSON 负责。
除非项目另有说明,所有坐标与图像处理以 720p(1280×720)为基准。
agent/go-service/
├── main.go # 入口:初始化、registerAll、启动 AgentServer
├── register.go # registerAll() 聚合各子包 Register()
├── logger.go # 日志初始化
├── pkg/ # 公共工具包
├── common/ # 通用 Custom 组件
├── taskersink/ # TaskerEventSink / ContextEventSink 实现
└── <business>/ # 业务子包
├── register.go # Register() 注册本包组件
└── *.go # 实现文件
实际项目可能只使用其中一部分;遵循当前仓库已有结构。
每个包含 MaaFramework 自定义组件的子包应暴露一个 Register() 函数,在其中注册本包所有组件:
package mypkg
import maa "github.com/MaaXYZ/maa-framework-go/v4"
func Register() {
maa.AgentServerRegisterCustomAction("MyAction", &MyAction{})
maa.AgentServerRegisterCustomRecognition("MyRecognition", &MyRecognition{})
}
注册名称必须与 Pipeline JSON 中 custom_action / custom_recognition 的名称一致。
子包 Register() 必须在总注册函数中调用:
func registerAll() {
mypkg.Register()
}
遗漏调用会导致 Pipeline 中的 Custom 节点运行时找不到组件。
所有注册类型应在定义该类型的文件中包含编译期校验:
var _ maa.CustomActionRunner = &MyAction{}
var _ maa.CustomRecognitionRunner = &MyRecognition{}
var _ maa.TaskerEventSink = &MySink{}
var _ maa.ContextEventSink = &MySink{}
不要把这些校验集中放在 register.go,应靠近类型定义。
.go 文件,但避免无意义碎片化。pkg/ 或当前项目已有公共包中。优先使用当前项目已配置的结构化日志库;常见 MaaFramework Go 项目使用 zerolog。
log.Info().
Str("component", "MyComponent").
Str("step", "Prepare").
Msg("prepared input")
log.Error().
Err(err).
Str("component", "MyComponent").
Msg("failed to parse params")
规则:
Msg。.Err(err)。log.Printf / log.Println,除非项目明确采用标准库日志。package mypkg
import (
"encoding/json"
maa "github.com/MaaXYZ/maa-framework-go/v4"
"github.com/rs/zerolog/log"
)
var _ maa.CustomActionRunner = &MyAction{}
type myActionParam struct {
Target string `json:"target"`
}
// MyAction performs a custom Pipeline action.
type MyAction struct{}
func (a *MyAction) Run(ctx *maa.Context, arg *maa.CustomActionArg) bool {
var params myActionParam
if err := json.Unmarshal([]byte(arg.CustomActionParam), ¶ms); err != nil {
log.Error().
Err(err).
Str("component", "MyAction").
Msg("failed to parse params")
return false
}
return true
}
package mypkg
import (
"encoding/json"
maa "github.com/MaaXYZ/maa-framework-go/v4"
"github.com/rs/zerolog/log"
)
var _ maa.CustomRecognitionRunner = &MyRecognition{}
type myRecognitionParam struct {
Threshold float64 `json:"threshold"`
}
// MyRecognition performs a custom Pipeline recognition.
type MyRecognition struct{}
func (r *MyRecognition) Run(ctx *maa.Context, arg *maa.CustomRecognitionArg) (*maa.CustomRecognitionResult, bool) {
var params myRecognitionParam
if err := json.Unmarshal([]byte(arg.CustomRecognitionParam), ¶ms); err != nil {
log.Error().
Err(err).
Str("component", "MyRecognition").
Msg("failed to parse params")
return nil, false
}
matched := true
if !matched {
return nil, false
}
return &maa.CustomRecognitionResult{
Box: arg.Roi,
Detail: "{}",
}, true
}
package mypkg
import maa "github.com/MaaXYZ/maa-framework-go/v4"
var _ maa.TaskerEventSink = &MySink{}
// MySink handles task lifecycle events.
type MySink struct{}
func (s *MySink) OnTaskerTask(tasker *maa.Tasker, event maa.EventStatus, detail maa.TaskerTaskDetail) {
if event != maa.EventStatusStarting {
return
}
}
如需监听 Context 事件,实现 maa.ContextEventSink 并按项目现有方式注册。未使用的回调方法写空实现。
panic;除非这是启动期不可恢复配置错误且项目已有相同模式。custom_action / custom_recognition 完全一致。Register() 已在总注册函数中调用。time.Sleep。github.com/MaaXYZ/maa-framework-go/v4