myfreecode 5.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/code-team.md +110 -0
- package/assets/default-claude.template.json +3 -0
- package/assets/default-settings.template.json +137 -0
- package/assets/screenshot.png +0 -0
- package/bin/free-code.js +71 -0
- package/package.json +35 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Code Team
|
|
2
|
+
|
|
3
|
+
This configuration ships with a built-in virtual development team ("Code Team") of specialized subagents. When you mention **Code Team** or any of its members, invoke the corresponding built-in subagent:
|
|
4
|
+
|
|
5
|
+
| 成员 | 职责 | 触发词 |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| code-reviewer | 代码审查,输出 APPROVE/REQUEST_CHANGES/NEEDS_DISCUSSION 结论 | review, cr, 代码检视, 代码审查, review一下, review 一下, codereview |
|
|
8
|
+
| verification | 实现验证,输出 PASS/FAIL/PARTIAL 结论 | verify, 验证 |
|
|
9
|
+
| Explore | 快速代码探索,只读搜索 | explore, 探索 |
|
|
10
|
+
| Plan | 软件架构规划,只读 | plan, 规划 |
|
|
11
|
+
| general-purpose | 通用任务代理 | research, 研究 |
|
|
12
|
+
| statusline-setup | Claude Code 状态栏配置 | statusline, 状态栏 |
|
|
13
|
+
| claude-code-guide | Claude Code/SDK/API 使用指南 | claude guide, claude code guide |
|
|
14
|
+
|
|
15
|
+
## 触发词自动唤醒
|
|
16
|
+
|
|
17
|
+
当用户消息包含以下触发词时,自动调用对应 subagent,无需手动 review:
|
|
18
|
+
|
|
19
|
+
- `cr`, `codereview`, `review`, `代码检视`, `代码审查`, `review一下`, `review 一下` → `code-reviewer`
|
|
20
|
+
- `verify`, `验证`, `验证一下`, `验证一下` → `verification`
|
|
21
|
+
- `explore`, `探索`, `搜索代码` → `Explore`
|
|
22
|
+
- `plan`, `规划`, `实现计划` → `Plan`
|
|
23
|
+
|
|
24
|
+
## Code Team 成员详情
|
|
25
|
+
|
|
26
|
+
### code-reviewer
|
|
27
|
+
代码审查专家。审查维度:正确性、安全性、健壮性、测试覆盖。每个发现必须有文件:行号和证据支持。
|
|
28
|
+
|
|
29
|
+
### verification
|
|
30
|
+
验证专家。在实现完成前尝试打破它,运行构建、测试、检查,输出 PASS/FAIL/PARTIAL 结论。
|
|
31
|
+
|
|
32
|
+
### Explore
|
|
33
|
+
快速代码探索专家。只读搜索,可并行调用工具快速定位文件和问题。
|
|
34
|
+
|
|
35
|
+
### Plan
|
|
36
|
+
软件架构师。为复杂任务设计实现方案,识别关键文件和依赖关系。
|
|
37
|
+
|
|
38
|
+
### general-purpose
|
|
39
|
+
通用任务代理。处理搜索代码、分析架构、执行多步研究任务等。
|
|
40
|
+
|
|
41
|
+
## 🚨 红线:禁止回滚未提交代码
|
|
42
|
+
|
|
43
|
+
**这是一条不可逾越的红线。** 在执行清理、删除、回退等操作时,必须保护未提交的变更不被误删。
|
|
44
|
+
|
|
45
|
+
### 绝对禁止的操作
|
|
46
|
+
|
|
47
|
+
| 禁止命令 | 替代方案 |
|
|
48
|
+
|---|---|
|
|
49
|
+
| `git checkout -- <file>` | `git diff <file>` 先看变更内容,确认只影响目标文件 |
|
|
50
|
+
| `git reset --hard` | 永远不要用,除非用户明确要求 |
|
|
51
|
+
| `git clean -f` / `git clean -fd` | 永远不要用,除非用户明确要求 |
|
|
52
|
+
| `git restore <file>` | 先 `git stash` 暂存,确认无误后再决定 |
|
|
53
|
+
| `rm -rf` 未跟踪文件/目录 | 先检查是否包含未提交工作的依赖 |
|
|
54
|
+
|
|
55
|
+
### 必须遵守的规则
|
|
56
|
+
|
|
57
|
+
1. **清理前必须检查**: 删除或回退任何文件前,先 `git status` 确认当前变更范围
|
|
58
|
+
2. **只删除目标文件**: 删除功能时只删除自己的产出,绝不可随手 `checkout` 或 `restore` 整个文件
|
|
59
|
+
3. **文件级隔离**: 修改文件时用 `Edit` 精准替换,不用 `git checkout` 做清理
|
|
60
|
+
4. **用 stash 代替 checkout**: 如果需要暂存变更,用 `git stash`,不要用 `git checkout --`
|
|
61
|
+
5. **未提交 = 不可逆**: `git checkout -- <file>` 对未提交的修改是不可逆的,一旦执行永久丢失
|
|
62
|
+
|
|
63
|
+
### 典型事故场景
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
❌ 危险操作:清理 echo 命令时
|
|
67
|
+
git checkout -- src/commands.ts # 把 goal 的注册也回退了!
|
|
68
|
+
|
|
69
|
+
✅ 安全操作:清理 echo 命令时
|
|
70
|
+
1. git status 确认涉及的文件
|
|
71
|
+
2. Edit 工具精准删除 echo 的 import 和 COMMANDS 条目
|
|
72
|
+
3. rm -rf src/commands/echo # 只删 echo 目录
|
|
73
|
+
4. 构建验证
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 为什么这是红线
|
|
77
|
+
|
|
78
|
+
- `git checkout --` 是对整个文件生效的,文件内同时可能包含其他功能的未提交代码
|
|
79
|
+
- 未提交的代码没有备份,丢失即永久不可恢复
|
|
80
|
+
- 已经实际发生过多次事故(echo 清理导致 goal 被回退)
|
|
81
|
+
|
|
82
|
+
# 作者署名规范
|
|
83
|
+
|
|
84
|
+
## 规则
|
|
85
|
+
|
|
86
|
+
本仓库所有 Java / 文档文件 `@author` 字段 + git 提交作者名 = **`Liang.Xu`**
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# AI 操作边界规则
|
|
90
|
+
|
|
91
|
+
## Push / Commit 必须经用户明确指示
|
|
92
|
+
|
|
93
|
+
**规则**:AI 在执行 `git push` 或 `git commit` 之前,必须等待用户发出**明确指示**(如"提交代码到远端吧"、"push 一下"、"commit"等显式动词)。**不**主动 push / commit,即便工作树有未提交变更且测试已通过。
|
|
94
|
+
|
|
95
|
+
**Why**:push / commit 是不可逆或影响远端可见性的操作(特别是 push 到远端会污染 origin、影响协作)。用户保留最终决策权,AI 主动 push 可能把未达用户预期的代码推上远端。
|
|
96
|
+
|
|
97
|
+
**How to apply**:
|
|
98
|
+
|
|
99
|
+
- ✅ **允许**:完成编码 + 测试通过后,**只**做以下动作
|
|
100
|
+
- 在工作树留好变更
|
|
101
|
+
- 报告测试结果(如 `mvn test 286/286 通过`)
|
|
102
|
+
- 询问用户是否 push / commit("是否需要提交并推送?")
|
|
103
|
+
- ✅ **触发条件**:用户消息含明确动词
|
|
104
|
+
- "提交代码到远端吧" / "push" / "commit" / "推到远端" / "提一下" / "发版" / "提交"
|
|
105
|
+
- 或 `/goal` workflow 中明确包含 push 步骤(按 workflow 自动执行)
|
|
106
|
+
- ❌ **禁止**:在以下情况主动 push / commit
|
|
107
|
+
- "请继续" / "好的" / "OK" / "可以了" / "继续吧" 等泛化继续指令
|
|
108
|
+
- 仅完成一个 sub-task 就推测"应该也 push 一下"
|
|
109
|
+
- "跑测试" / "跑一下构建" 等测试指令不附带 push
|
|
110
|
+
- ⚠️ **不适用**:`git add` / `git status` / `git diff` / `git log` 等只读操作不受限
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Edit(*)",
|
|
5
|
+
"Write(*)",
|
|
6
|
+
"Read(*)",
|
|
7
|
+
"Glob(*)",
|
|
8
|
+
"Grep(*)",
|
|
9
|
+
"Agent(Explore)",
|
|
10
|
+
"Agent(code-reviewer)",
|
|
11
|
+
"Agent(security-reviewer)"
|
|
12
|
+
],
|
|
13
|
+
"defaultMode": "acceptEdits"
|
|
14
|
+
},
|
|
15
|
+
"skipWebFetchPreflight": true,
|
|
16
|
+
"model": "MiniMax-M2.7",
|
|
17
|
+
"providerProfiles": [
|
|
18
|
+
{
|
|
19
|
+
"id": "volcengine-doubao",
|
|
20
|
+
"name": "火山引擎 Doubao",
|
|
21
|
+
"provider": "firstParty",
|
|
22
|
+
"baseUrl": "https://ark.cn-beijing.volces.com/api/coding",
|
|
23
|
+
"model": "doubao-seed-2.0-pro-260215",
|
|
24
|
+
"availableModels": [
|
|
25
|
+
"doubao-seed-2.0-pro-260215",
|
|
26
|
+
"kimi-k2.5"
|
|
27
|
+
],
|
|
28
|
+
"customModels": [
|
|
29
|
+
{
|
|
30
|
+
"id": "doubao-seed-2.0-pro-260215",
|
|
31
|
+
"model": "doubao-seed-2.0-pro-260215",
|
|
32
|
+
"name": "Doubao Seed 2.0 Pro",
|
|
33
|
+
"description": "火山引擎最新编码模型"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "kimi-k2.5",
|
|
37
|
+
"model": "kimi-k2.5",
|
|
38
|
+
"name": "Kimi K2.5",
|
|
39
|
+
"description": "Kimi K2.5 编码模型"
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"apiKeyEnv": "ANTHROPIC_API_KEY"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "minimax",
|
|
46
|
+
"name": "MiniMax",
|
|
47
|
+
"provider": "firstParty",
|
|
48
|
+
"baseUrl": "https://api.minimaxi.com/anthropic",
|
|
49
|
+
"model": "MiniMax-M2.7",
|
|
50
|
+
"availableModels": [
|
|
51
|
+
"MiniMax-M2.7",
|
|
52
|
+
"MiniMax-M2.5-highspeed"
|
|
53
|
+
],
|
|
54
|
+
"customModels": [
|
|
55
|
+
{
|
|
56
|
+
"id": "MiniMax-M2.7",
|
|
57
|
+
"model": "MiniMax-M2.7",
|
|
58
|
+
"name": "MiniMax-M2.7",
|
|
59
|
+
"description": "MiniMax 最新模型"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "MiniMax-M2.5-highspeed",
|
|
63
|
+
"model": "MiniMax-M2.5-highspeed",
|
|
64
|
+
"name": "MiniMax-M2.5-highspeed",
|
|
65
|
+
"description": "MiniMax-M2.5-highspeed"
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"apiKeyEnv": "ANTHROPIC_API_KEY"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "opencode-zen",
|
|
72
|
+
"name": "OpenCode Zen (免费模型)",
|
|
73
|
+
"provider": "openaiChat",
|
|
74
|
+
"baseUrl": "https://opencode.ai/zen/v1",
|
|
75
|
+
"model": "big-pickle",
|
|
76
|
+
"availableModels": [
|
|
77
|
+
"big-pickle",
|
|
78
|
+
"minimax-m2.5-free",
|
|
79
|
+
"ling-2.6-flash",
|
|
80
|
+
"hy3-preview-free",
|
|
81
|
+
"nemotron-3-super-free"
|
|
82
|
+
],
|
|
83
|
+
"customModels": [
|
|
84
|
+
{
|
|
85
|
+
"id": "big-pickle",
|
|
86
|
+
"model": "big-pickle",
|
|
87
|
+
"name": "Big Pickle",
|
|
88
|
+
"description": "OpenCode Zen 免费编码模型"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "minimax-m2.5-free",
|
|
92
|
+
"model": "minimax-m2.5-free",
|
|
93
|
+
"name": "MiniMax M2.5 Free",
|
|
94
|
+
"description": "MiniMax M2.5 免费版"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"id": "ling-2.6-flash",
|
|
98
|
+
"model": "ling-2.6-flash",
|
|
99
|
+
"name": "Ling 2.6 Flash",
|
|
100
|
+
"description": "Ling 2.6 快速模型"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"id": "hy3-preview-free",
|
|
104
|
+
"model": "hy3-preview-free",
|
|
105
|
+
"name": "Hy3 Preview Free",
|
|
106
|
+
"description": "Hy3 预览免费版"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"id": "nemotron-3-super-free",
|
|
110
|
+
"model": "nemotron-3-super-free",
|
|
111
|
+
"name": "Nemotron 3 Super Free",
|
|
112
|
+
"description": "Nemotron 3 Super 免费版"
|
|
113
|
+
}
|
|
114
|
+
],
|
|
115
|
+
"apiKeyEnv": "OPENCODE_ZEN_API_KEY"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"id": "modal-glm",
|
|
119
|
+
"name": "Modal GLM-5.1",
|
|
120
|
+
"provider": "openaiChat",
|
|
121
|
+
"baseUrl": "https://api.us-west-2.modal.direct/v1",
|
|
122
|
+
"model": "zai-org/GLM-5.1-FP8",
|
|
123
|
+
"availableModels": [
|
|
124
|
+
"zai-org/GLM-5.1-FP8"
|
|
125
|
+
],
|
|
126
|
+
"customModels": [
|
|
127
|
+
{
|
|
128
|
+
"id": "zai-org/GLM-5.1-FP8",
|
|
129
|
+
"model": "zai-org/GLM-5.1-FP8",
|
|
130
|
+
"name": "GLM-5.1",
|
|
131
|
+
"description": "智谱 GLM-5.1 模型 (通过Modal部署)"
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
"apiKeyEnv": "MODAL_API_KEY"
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
}
|
|
Binary file
|
package/bin/free-code.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const { spawnSync } = require('child_process');
|
|
3
|
+
const { platform, arch } = process;
|
|
4
|
+
|
|
5
|
+
// Initialize config files if missing
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const os = require('os');
|
|
9
|
+
|
|
10
|
+
function initConfig() {
|
|
11
|
+
const homeDir = os.homedir();
|
|
12
|
+
const claudeDir = path.join(homeDir, '.claude');
|
|
13
|
+
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
14
|
+
const claudeJsonPath = path.join(homeDir, '.claude.json');
|
|
15
|
+
|
|
16
|
+
// Create ~/.claude/ directory if not exists
|
|
17
|
+
if (!fs.existsSync(claudeDir)) {
|
|
18
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Copy default-settings.template.json if settings.json missing
|
|
22
|
+
if (!fs.existsSync(settingsPath)) {
|
|
23
|
+
try {
|
|
24
|
+
const templatePath = path.join(__dirname, '..', 'assets', 'default-settings.template.json');
|
|
25
|
+
fs.copyFileSync(templatePath, settingsPath);
|
|
26
|
+
} catch (e) {
|
|
27
|
+
// template not found, skip
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Copy default-claude.template.json if .claude.json missing
|
|
32
|
+
if (!fs.existsSync(claudeJsonPath)) {
|
|
33
|
+
try {
|
|
34
|
+
const templatePath = path.join(__dirname, '..', 'assets', 'default-claude.template.json');
|
|
35
|
+
fs.copyFileSync(templatePath, claudeJsonPath);
|
|
36
|
+
} catch (e) {
|
|
37
|
+
// template not found, skip
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Copy code-team.md to ~/.claude/rules/ if missing
|
|
42
|
+
const rulesDir = path.join(claudeDir, 'rules');
|
|
43
|
+
const codeTeamPath = path.join(rulesDir, 'code-team.md');
|
|
44
|
+
if (!fs.existsSync(codeTeamPath)) {
|
|
45
|
+
try {
|
|
46
|
+
fs.mkdirSync(rulesDir, { recursive: true });
|
|
47
|
+
const templatePath = path.join(__dirname, '..', 'assets', 'code-team.md');
|
|
48
|
+
fs.copyFileSync(templatePath, codeTeamPath);
|
|
49
|
+
} catch (e) {
|
|
50
|
+
// template not found, skip
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
initConfig();
|
|
56
|
+
|
|
57
|
+
const binaryName = `cli-${platform}-${arch}${platform === 'win32' ? '.exe' : ''}`;
|
|
58
|
+
const pkgName = `@myfreecode/cli-${platform}-${arch}`;
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
const binaryPath = require.resolve(`${pkgName}/bin/${binaryName}`);
|
|
62
|
+
const result = spawnSync(binaryPath, process.argv.slice(2), {
|
|
63
|
+
stdio: 'inherit',
|
|
64
|
+
env: process.env,
|
|
65
|
+
});
|
|
66
|
+
process.exit(result.status ?? 0);
|
|
67
|
+
} catch (e) {
|
|
68
|
+
console.error(`Platform ${platform}-${arch} is not supported by free-code.`);
|
|
69
|
+
console.error(`Tried to find: ${pkgName}`);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "myfreecode",
|
|
3
|
+
"version": "5.2.8",
|
|
4
|
+
"description": "myfreecode: a local-build-friendly Claude Code fork.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"myfreecode": "./bin/free-code.js",
|
|
7
|
+
"free-code": "./bin/free-code.js",
|
|
8
|
+
"claude": "./bin/free-code.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"bin/",
|
|
12
|
+
"assets/"
|
|
13
|
+
],
|
|
14
|
+
"optionalDependencies": {
|
|
15
|
+
"@myfreecode/cli-darwin-x64": "5.2.8",
|
|
16
|
+
"@myfreecode/cli-darwin-arm64": "5.2.8",
|
|
17
|
+
"@myfreecode/cli-linux-x64": "5.2.8",
|
|
18
|
+
"@myfreecode/cli-linux-arm64": "5.2.8",
|
|
19
|
+
"@myfreecode/cli-win32-x64": "5.2.8"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"claude",
|
|
26
|
+
"ai",
|
|
27
|
+
"cli",
|
|
28
|
+
"coding"
|
|
29
|
+
],
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "git+https://github.com/yonggandewo12/free-code-public.git"
|
|
34
|
+
}
|
|
35
|
+
}
|