diff --git a/README.md b/README.md index ac8e007e..eab158ee 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ Once setup, you can start coding with Claude Code: ### AST-Driven Coding Workflow -[`.claude/hooks`](internal/utils/assets/.claude/hooks) provide a 4-layer analysis chain from repository to node details: +[`.claude/hooks`](internal/cmd/assets/.claude/hooks) provide a 4-layer analysis chain from repository to node details: ``` list_repos → get_repo_structure → get_package_structure → get_file_structure → get_ast_node @@ -72,13 +72,13 @@ list_repos → get_repo_structure → get_package_structure → get_file_structu ### Claude Code Slash Commands -[`.claude/commands`](internal/utils/assets/.claude/commands) provide three custom slash commands to streamline development: +[`.claude/commands`](internal/cmd/assets/.claude/commands) provide three custom slash commands to streamline development: | Command | Function | Description | |---------|----------|-------------| -| [`/abcoder:schedule` ](internal/utils/assets/.claude/commands/schedule.md) | Design implementation | Analyze codebase by using ABCoder, design technical solution | -| [`/abcoder:task `](internal/utils/assets/.claude/commands/task.md) | Create coding task | Generate standardized CODE_TASK document | -| [`/abcoder:recheck `](internal/utils/assets/.claude/commands/recheck.md) | Verify solution | Critically check CODE_TASK feasibility, useful when a CODE_TASK contains external dependencies | +| [`/abcoder:schedule` ](internal/cmd/assets/.claude/commands/abcoder/schedule.md) | Design implementation | Analyze codebase by using ABCoder, design technical solution | +| [`/abcoder:task `](internal/cmd/assets/.claude/commands/abcoder/task.md) | Create coding task | Generate standardized CODE_TASK document | +| [`/abcoder:recheck `](internal/cmd/assets/.claude/commands/abcoder/recheck.md) | Verify solution | Critically check CODE_TASK feasibility, useful when a CODE_TASK contains external dependencies | ### Workflow @@ -102,11 +102,11 @@ Start coding(sub-agent) ─────────→ Execute Implementation | File | Purpose | |------|---------| -| [`CLAUDE.md`](internal/utils/assets/.claude/CLAUDE.md) | Core AST-Driven Coder role definition | -| [`settings.json`](internal/utils/assets/.claude/settings.json) | Hooks and permissions configuration | -| [`hooks/`](internal/utils/assets/.claude/hooks/) | Automation scripts (parse/prompt/reminder) | -| [`commands/`](internal/utils/assets/.claude/commands/) | Slash command definitions (abcoder:task/abcoder:schedule/abcoder:recheck) | -| [`tmpls/ABCODER_CODE_TASK.md`](internal/utils/assets/.claude/tmpls/ABCODER_CODE_TASK.md) | Coding task template | +| [`CLAUDE.md`](internal/cmd/assets/.claude/CLAUDE.md) | Core AST-Driven Coder role definition | +| [`settings.json`](internal/cmd/assets/.claude/settings.json) | Hooks and permissions configuration | +| [`hooks/`](internal/cmd/assets/.claude/hooks/) | Automation scripts (parse/prompt/reminder) | +| [`commands/`](internal/cmd/assets/.claude/commands/) | Slash command definitions (abcoder:task/abcoder:schedule/abcoder:recheck) | +| [`tmpls/ABCODER_CODE_TASK.md`](internal/cmd/assets/.claude/tmpls/ABCODER_CODE_TASK.md) | Coding task template | ### Dependencies diff --git a/docs/claude-code-spec.md b/docs/claude-code-spec.md index e50bb71f..cf2e6be7 100644 --- a/docs/claude-code-spec.md +++ b/docs/claude-code-spec.md @@ -123,5 +123,5 @@ coding-executor ──────→ 执行实现 ## 相关文档 -- [hooks/README.md](../internal/utils/assets/.claude/hooks/README.md) - 钩子系统详解 -- [commands/README.md](../internal/utils/assets/.claude/commands/README.md) - 斜杠命令详解 +- [hooks/README.md](../internal/cmd/assets/.claude/hooks/README.md) - 钩子系统详解 +- [commands/README.md](../internal/cmd/assets/.claude/commands/README.md) - 斜杠命令详解 diff --git a/internal/utils/assets/.claude/CLAUDE.md b/internal/cmd/assets/.claude/CLAUDE.md similarity index 100% rename from internal/utils/assets/.claude/CLAUDE.md rename to internal/cmd/assets/.claude/CLAUDE.md diff --git a/internal/utils/assets/.claude/commands/README.md b/internal/cmd/assets/.claude/commands/README.md similarity index 100% rename from internal/utils/assets/.claude/commands/README.md rename to internal/cmd/assets/.claude/commands/README.md diff --git a/internal/cmd/assets/.claude/commands/abcoder/recheck.md b/internal/cmd/assets/.claude/commands/abcoder/recheck.md new file mode 100644 index 00000000..776a412d --- /dev/null +++ b/internal/cmd/assets/.claude/commands/abcoder/recheck.md @@ -0,0 +1,32 @@ +--- +name: ABCoder: Recheck +description: Validate CODE_TASK technical feasibility with critical analysis using mcp__abcoder. +category: ABCoder +tags: [abcoder, recheck, validation] +--- +从原始需求出发,使用 mcp__abcoder 进行批判性分析,以验证 CODE_TASK 的技术可行性。 + + +**Guardrails** +- 批判性思考,保持诚实:确保方案可实现需求、无技术风险、最大化复用已有功能、最小化改动。 +- 严格使用 `mcp__abcoder` 验证技术细节,禁止假设。 +- 下钻到 `mcp__abcoder__get_ast_node` 粒度进行验证。 + +**Steps** +Track these steps as TODOs and complete them one by one. +1. 从 `mcp__abcoder__get_repo_structure` 开始,获取目标仓库结构。 +2. 定位相关的 package 和 node。 +3. 使用 `mcp__abcoder__get_ast_node` 深入分析相关代码节点,验证方案的可行性。 +4. 检查方案是否可以实现 CODE_TASK 中的所有需求。 +5. 识别并报告任何潜在的技术风险。 +6. 验证是否最大化复用了已有功能,是否最小化了改动。 +7. 如发现问题,提出具体的修改建议或后续问题。 +8. 总结分析结果,明确指出方案是否可以执行。 + +**Reference** +- `mcp__abcoder__list_repos` - 列出所有可用仓库 +- `mcp__abcoder__get_repo_structure` - 获取仓库结构(必须作为第一步) +- `mcp__abcoder__get_package_structure` - 获取 package 结构 +- `mcp__abcoder__get_file_structure` - 获取文件结构 +- `mcp__abcoder__get_ast_node` - 获取 AST 节点详情(下钻验证) + diff --git a/internal/cmd/assets/.claude/commands/abcoder/schedule.md b/internal/cmd/assets/.claude/commands/abcoder/schedule.md new file mode 100644 index 00000000..be81cd09 --- /dev/null +++ b/internal/cmd/assets/.claude/commands/abcoder/schedule.md @@ -0,0 +1,34 @@ +--- +name: ABCoder: Schedule +description: Design implementation plan using mcp__abcoder analysis and code exploration. +category: ABCoder +tags: [abcoder, schedule, planning] +--- +使用mcp__abcoder分析相关仓库(下钻到mcp__abcoder__get_ast_node查看细节),帮助用户设计实现方案。 + + +**Guardrails** +- 最大化复用项目已有功能,避免重复造轮子。 +- 优先采用直接、最小改动的实现方式,只有在用户明确要求时才增加复杂度。 +- 严格限制修改影响面在所请求的结果范围内。 +- 找出任何模糊或含糊不清的细节,并在修改文件前提出必要的后续问题。 +- 在 Schedule 阶段禁止编写代码,禁止使用 agent。 + +**Steps** +Track these steps as TODOs and complete them one by one. +1. 从 `mcp__abcoder__get_repo_structure` 开始,获取目标仓库结构。 +2. 根据任务描述,定位相关的 package。 +3. 使用 `mcp__abcoder__get_package_structure` 获取 package 内的文件和节点列表。 +4. 使用 `mcp__abcoder__get_ast_node` 深入分析相关代码节点,理解现有实现模式。 +5. 分析依赖关系、调用链、类型信息等。 +6. 设计实现方案,确保最大化复用已有功能、最小化改动。 +7. 找出任何模糊或缺失的技术细节,并向用户提出后续问题。 +8. 输出清晰的技术方案,包括修改范围、涉及的文件、关键实现步骤。 + +**Reference** +- `mcp__abcoder__list_repos` - 列出所有可用仓库 +- `mcp__abcoder__get_repo_structure` - 获取仓库结构(必须作为第一步) +- `mcp__abcoder__get_package_structure` - 获取 package 结构 +- `mcp__abcoder__get_file_structure` - 获取文件结构 +- `mcp__abcoder__get_ast_node` - 获取 AST 节点详情(下钻分析) + diff --git a/internal/cmd/assets/.claude/commands/abcoder/task.md b/internal/cmd/assets/.claude/commands/abcoder/task.md new file mode 100644 index 00000000..03a47403 --- /dev/null +++ b/internal/cmd/assets/.claude/commands/abcoder/task.md @@ -0,0 +1,32 @@ +--- +name: ABCoder: Task +description: Create a SPEC-driven CODE_TASK document from task context. +category: ABCoder +tags: [abcoder, task, creation] +--- +根据任务上下文创建一个由 SPEC 驱动的 CODE_TASK 文档。 + + +**Guardrails** +- 必须提供任务名称,格式为 `/task <任务名称>`。若未提供,根据任务上下文推荐一个名词(确保清晰、简洁)。 +- 文件路径使用 `./task/{{MMDD}}/{{NAME}}__CODE_TASK.md` 格式。 +- 严格遵循 CODE_TASK 模板格式和要求。 +- 清晰列出所有外部依赖包名称(如有)。 +- 创建完成后停止操作,不进行额外工作。 + +**Steps** +Track these steps as TODOs and complete them one by one. +1. 验证用户提供了任务名称,如未提供则提示使用格式 `/task <任务名称>`。 +2. 执行 `d=$(date +%m%d) && mkdir -p "./task/$d/"` 创建 `./task/{{MMDD}}/` 目录。 +3. 读取模板文件 `/Users/bytedance/github/github.com/cloudwego/abcoder/.claude/tmpls/ABCODER_CODE_TASK.md`。 +4. 根据任务上下文和名称,按照模板格式填充内容,生成新文件 `./task/{{MMDD}}/{{NAME}}__CODE_TASK.md`。 +5. 检查并清晰列出 CODE_TASK 包含的外部依赖包(如有)。 +6. 验证生成的文件格式正确,包含所有必要字段。 +7. 告知用户文件已创建成功,包含文件路径和外部依赖信息(如有),停止操作。 + +**Reference** +- 模板文件:`/Users/bytedance/github/github.com/cloudwego/abcoder/.claude/tmpls/ABCODER_CODE_TASK.md` +- 示例: + - `/task Feature_Auth` → 创建 `./task/1013/Feature_Auth__CODE_TASK.md` + - `/task Bugfix-Api` → 创建 `./task/1013/Bugfix_Api__CODE_TASK.md` + diff --git a/internal/utils/assets/.claude/hooks/README.md b/internal/cmd/assets/.claude/hooks/README.md similarity index 100% rename from internal/utils/assets/.claude/hooks/README.md rename to internal/cmd/assets/.claude/hooks/README.md diff --git a/internal/utils/assets/.claude/hooks/abcoder/abcoder-workflow.md b/internal/cmd/assets/.claude/hooks/abcoder/abcoder-workflow.md similarity index 100% rename from internal/utils/assets/.claude/hooks/abcoder/abcoder-workflow.md rename to internal/cmd/assets/.claude/hooks/abcoder/abcoder-workflow.md diff --git a/internal/utils/assets/.claude/hooks/abcoder/need_update.sh b/internal/cmd/assets/.claude/hooks/abcoder/need_update.sh similarity index 100% rename from internal/utils/assets/.claude/hooks/abcoder/need_update.sh rename to internal/cmd/assets/.claude/hooks/abcoder/need_update.sh diff --git a/internal/utils/assets/.claude/hooks/abcoder/parse.sh b/internal/cmd/assets/.claude/hooks/abcoder/parse.sh similarity index 100% rename from internal/utils/assets/.claude/hooks/abcoder/parse.sh rename to internal/cmd/assets/.claude/hooks/abcoder/parse.sh diff --git a/internal/utils/assets/.claude/hooks/abcoder/prompt.sh b/internal/cmd/assets/.claude/hooks/abcoder/prompt.sh similarity index 100% rename from internal/utils/assets/.claude/hooks/abcoder/prompt.sh rename to internal/cmd/assets/.claude/hooks/abcoder/prompt.sh diff --git a/internal/utils/assets/.claude/hooks/abcoder/reminder.sh b/internal/cmd/assets/.claude/hooks/abcoder/reminder.sh similarity index 100% rename from internal/utils/assets/.claude/hooks/abcoder/reminder.sh rename to internal/cmd/assets/.claude/hooks/abcoder/reminder.sh diff --git a/internal/utils/assets/.claude/settings.json b/internal/cmd/assets/.claude/settings.json similarity index 100% rename from internal/utils/assets/.claude/settings.json rename to internal/cmd/assets/.claude/settings.json diff --git a/internal/utils/assets/.claude/tmpls/ABCODER_CODE_TASK.md b/internal/cmd/assets/.claude/tmpls/ABCODER_CODE_TASK.md similarity index 100% rename from internal/utils/assets/.claude/tmpls/ABCODER_CODE_TASK.md rename to internal/cmd/assets/.claude/tmpls/ABCODER_CODE_TASK.md diff --git a/internal/utils/cmd_init_spec.go b/internal/cmd/init_spec.go similarity index 94% rename from internal/utils/cmd_init_spec.go rename to internal/cmd/init_spec.go index a5fdf268..8649c75e 100644 --- a/internal/utils/cmd_init_spec.go +++ b/internal/cmd/init_spec.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package utils +package cmd import ( "embed" @@ -113,6 +113,11 @@ func copyEmbeddedDir(srcPath string, destDir string, projectRootDir string) erro return err } + // Skip README.md files + if strings.HasSuffix(path, "README.md") { + return nil + } + // Skip the root directory itself if relPath == "." { return nil @@ -131,19 +136,6 @@ func copyEmbeddedDir(srcPath string, destDir string, projectRootDir string) erro return fmt.Errorf("failed to create parent directory %s: %w", parentDir, err) } - // Rename command files with abcoder: prefix - if strings.HasPrefix(relPath, "commands/") { - baseName := filepath.Base(relPath) - switch baseName { - case "recheck.md": - destPath = filepath.Join(filepath.Dir(destPath), "abcoder:recheck.md") - case "schedule.md": - destPath = filepath.Join(filepath.Dir(destPath), "abcoder:schedule.md") - case "task.md": - destPath = filepath.Join(filepath.Dir(destPath), "abcoder:task.md") - } - } - // Copy file data, err := claudeFS.ReadFile(path) if err != nil { diff --git a/internal/utils/assets/.claude/commands/recheck.md b/internal/utils/assets/.claude/commands/recheck.md deleted file mode 100644 index 326f1906..00000000 --- a/internal/utils/assets/.claude/commands/recheck.md +++ /dev/null @@ -1,10 +0,0 @@ -# 系统指令: 核对任务实现方案(二次对齐) - - -理解任务 {1},并使用`mcp__abcoder`核对技术细节(下钻到`mcp__abcoder__get_ast_node`粒度); - -IMPORTANT: 批判性思考,保持诚实 -- 确保方案可以实现需求 -- 确保没有技术风险 -- 检查是否最大化复用已有功能、最小化改动。 -IMPORTANT: 必须从`mcp__abcoder__get_repo_strucure`开始 diff --git a/internal/utils/assets/.claude/commands/schedule.md b/internal/utils/assets/.claude/commands/schedule.md deleted file mode 100644 index 0d6bef6f..00000000 --- a/internal/utils/assets/.claude/commands/schedule.md +++ /dev/null @@ -1,13 +0,0 @@ -# 系统指令:规划一个任务(输入:任务描述) - -使用`mcp__abcoder`分析相关仓库(下钻到`mcp__abcoder__get_ast_node`查看细节),帮助用户设计实现方案。 - -## Guardrails -- 最大化复用项目已有功能;不重复造轮子。 -- 优先采用直接、最小改动的实现方式,只有在用户明确要求时才增加复杂度。 -- 严格限制修改影响面在所请求的结果范围内。 -- 找出任何模糊或含糊不清的细节,并在修改文件前提出必要的后续问题。 -- 在Schedule阶段禁止编写代码,禁止使用agent。 - -IMPORTANT: 必须从`mcp__abcoder__get_repo_strucure`开始 - diff --git a/internal/utils/assets/.claude/commands/task.md b/internal/utils/assets/.claude/commands/task.md deleted file mode 100644 index d212e898..00000000 --- a/internal/utils/assets/.claude/commands/task.md +++ /dev/null @@ -1,19 +0,0 @@ -# 系统指令:基于当前上下文创建一个 SPEC 驱动的 CODE_TASK(输入:任务名称) - -请帮我创建一个CODE_TASK。 - -1. `d=$(date +%m%d) && mkdir -p "./task/$d/" && echo "目录 ./task/$d/ 已创建"` 创建 `./task/{{MMDD}}/` 目录 -2. 读取模板文件 `{{CLAUDE_HOME_PATH}}/.claude/tmpls/ABCODER_CODE_TASK.md` -3. 根据任务上下文,按照格式和要求填充模板,创建新文件 `./task/{{MMDD}}/{{NAME}}__CODE_TASK.md` -4. 告知用户这个`CODE_TASK`是否包含外部依赖;如果包含,请清晰列出完整的外部依赖包名称 -5. 提示用户文件已创建成功,停止操作 - -{{NAME}}:{{1}} - -如果用户没有提供任务名称,请提示用户使用格式:`/task <任务名称>` - ---- - -## 使用说明 -- `/task Feature_Auth` → 创建 `./task/1013/Feature_Auth__CODE_TASK.md` -- `/task Bugfix-Api` → 创建 `./task/1013/Bugfix_Api__CODE_TASK.md` diff --git a/main.go b/main.go index 9b50c8d2..e46437b0 100644 --- a/main.go +++ b/main.go @@ -38,7 +38,7 @@ import ( "path/filepath" "strings" - interutils "github.com/cloudwego/abcoder/internal/utils" + internalCmd "github.com/cloudwego/abcoder/internal/cmd" "github.com/cloudwego/abcoder/lang" "github.com/cloudwego/abcoder/lang/log" "github.com/cloudwego/abcoder/lang/uniast" @@ -48,6 +48,7 @@ import ( "github.com/cloudwego/abcoder/llm/mcp" "github.com/cloudwego/abcoder/llm/tool" "github.com/cloudwego/abcoder/version" + "github.com/spf13/cobra" ) @@ -309,7 +310,7 @@ The command will: uri = args[0] } - if err := interutils.RunInitSpec(uri); err != nil { + if err := internalCmd.RunInitSpec(uri); err != nil { log.Error("Failed to init-spec: %v\n", err) return err }