self-evolve-framework 1.0.8 → 1.1.1
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/bin/cli.js +66 -24
- package/package.json +1 -1
package/bin/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync, cpSync } from "fs"
|
|
3
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, cpSync, readdirSync, statSync } from "fs"
|
|
4
4
|
import { join, resolve } from "path"
|
|
5
5
|
import { fileURLToPath } from "url"
|
|
6
6
|
|
|
@@ -9,13 +9,17 @@ const TEMPLATE_DIR = resolve(__dirname, "../template")
|
|
|
9
9
|
|
|
10
10
|
const COMMANDS = {
|
|
11
11
|
init: {
|
|
12
|
-
desc: "
|
|
12
|
+
desc: "一键安装全部 CodeBuddy skill + 规则到当前项目",
|
|
13
13
|
run: async (args) => init(args),
|
|
14
14
|
},
|
|
15
15
|
sync: {
|
|
16
|
-
desc: "
|
|
16
|
+
desc: "从框架项目同步最新的 skill + 规则到当前项目",
|
|
17
17
|
run: async (args) => sync(args),
|
|
18
18
|
},
|
|
19
|
+
list: {
|
|
20
|
+
desc: "列出模板中包含的所有 skill 和规则",
|
|
21
|
+
run: () => listSkills(),
|
|
22
|
+
},
|
|
19
23
|
help: {
|
|
20
24
|
desc: "显示帮助信息",
|
|
21
25
|
run: () => showHelp(),
|
|
@@ -27,22 +31,49 @@ function showHelp() {
|
|
|
27
31
|
self-evolve — CodeBuddy 自我进化飞轮安装工具
|
|
28
32
|
|
|
29
33
|
用法:
|
|
30
|
-
npx self-evolve-framework init
|
|
31
|
-
npx self-evolve-framework
|
|
34
|
+
npx self-evolve-framework init 一键安装全部 skill + 规则
|
|
35
|
+
npx self-evolve-framework list 列出模板中包含的所有 skill
|
|
36
|
+
npx self-evolve-framework sync 从框架同步最新版本
|
|
32
37
|
|
|
33
38
|
选项:
|
|
34
39
|
--project <path> 指定目标项目路径(默认当前目录)
|
|
35
40
|
--skip-claude-md 跳过更新 CLAUDE.md
|
|
36
|
-
--skip-impeccable
|
|
41
|
+
--skip-impeccable 跳过 Impeccable 设计质量 skill
|
|
37
42
|
--dry-run 预览要复制的文件,不实际写入
|
|
38
43
|
|
|
39
44
|
示例:
|
|
40
45
|
npx self-evolve-framework init
|
|
41
46
|
npx self-evolve-framework init --project ./my-app
|
|
42
|
-
npx self-evolve-framework init --skip-claude-md --
|
|
47
|
+
npx self-evolve-framework init --skip-claude-md --dry-run
|
|
43
48
|
`)
|
|
44
49
|
}
|
|
45
50
|
|
|
51
|
+
function listSkills() {
|
|
52
|
+
const rulesDir = resolve(TEMPLATE_DIR, "rules")
|
|
53
|
+
const skillsDir = resolve(TEMPLATE_DIR, "skills")
|
|
54
|
+
console.log("\n📦 模板中包含的规则:")
|
|
55
|
+
if (existsSync(rulesDir)) {
|
|
56
|
+
for (const f of readdirSync(rulesDir).filter(f => f.endsWith(".mdc")).sort()) {
|
|
57
|
+
console.log(` rules/${f}`)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
console.log("\n🧠 模板中包含的技能:")
|
|
61
|
+
if (existsSync(skillsDir)) {
|
|
62
|
+
for (const d of readdirSync(skillsDir).filter(f => statSync(join(skillsDir, f)).isDirectory()).sort()) {
|
|
63
|
+
const skillMd = join(skillsDir, d, "SKILL.md")
|
|
64
|
+
let desc = ""
|
|
65
|
+
if (existsSync(skillMd)) {
|
|
66
|
+
const firstLine = readFileSync(skillMd, "utf-8").split("\n").find(l => l.startsWith("description:"))
|
|
67
|
+
if (firstLine) desc = firstLine.replace("description: ", "").trim()
|
|
68
|
+
}
|
|
69
|
+
console.log(` ${d}/ ${desc ? "— " + desc : ""}`)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (!existsSync(rulesDir) && !existsSync(skillsDir)) {
|
|
73
|
+
console.log(" (模板目录为空)")
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
46
77
|
async function init(args) {
|
|
47
78
|
const baseDir = resolve(args["--project"] || process.cwd())
|
|
48
79
|
const dryRun = !!args["--dry-run"]
|
|
@@ -52,25 +83,35 @@ async function init(args) {
|
|
|
52
83
|
console.log(`📍 项目路径: ${baseDir}`)
|
|
53
84
|
console.log(`🧪 ${dryRun ? "DRY RUN — 不写入文件" : "执行中..."}\n`)
|
|
54
85
|
|
|
55
|
-
|
|
56
|
-
const dirs = [
|
|
57
|
-
{ src: "rules", dest: ".codebuddy/rules" },
|
|
58
|
-
{ src: "skills/skillopt-sleep", dest: ".codebuddy/skills/skillopt-sleep" },
|
|
59
|
-
]
|
|
86
|
+
let count = 0
|
|
60
87
|
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
88
|
+
// 复制 rules(排除 .mdc 文件可以在以后细化)
|
|
89
|
+
const rulesSrc = resolve(TEMPLATE_DIR, "rules")
|
|
90
|
+
if (existsSync(rulesSrc)) {
|
|
91
|
+
if (!dryRun) {
|
|
92
|
+
mkdirSync(resolve(baseDir, ".codebuddy/rules"), { recursive: true })
|
|
93
|
+
cpSync(rulesSrc, resolve(baseDir, ".codebuddy/rules"), { recursive: true, force: true })
|
|
94
|
+
}
|
|
95
|
+
const ruleFiles = readdirSync(rulesSrc).filter(f => f.endsWith(".mdc"))
|
|
96
|
+
console.log(` ${dryRun ? "🔍 将复制" : "✅ 复制"} rules/ → .codebuddy/rules/(${ruleFiles.length} 个规则)`)
|
|
97
|
+
count++
|
|
64
98
|
}
|
|
65
99
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
100
|
+
// 复制 skills(排除 impeccable 如果 --skip-impeccable)
|
|
101
|
+
const skillsSrc = resolve(TEMPLATE_DIR, "skills")
|
|
102
|
+
if (existsSync(skillsSrc)) {
|
|
103
|
+
const skillDirs = readdirSync(skillsSrc).filter(f =>
|
|
104
|
+
statSync(join(skillsSrc, f)).isDirectory() &&
|
|
105
|
+
!(skipImpeccable && f === "impeccable")
|
|
106
|
+
)
|
|
107
|
+
const skillsDest = resolve(baseDir, ".codebuddy/skills")
|
|
108
|
+
if (!dryRun) {
|
|
109
|
+
mkdirSync(skillsDest, { recursive: true })
|
|
110
|
+
for (const dir of skillDirs) {
|
|
111
|
+
cpSync(join(skillsSrc, dir), join(skillsDest, dir), { recursive: true, force: true })
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
console.log(` ${dryRun ? "🔍 将复制" : "✅ 复制"} skills/ → .codebuddy/skills/(${skillDirs.length} 个技能)`)
|
|
74
115
|
count++
|
|
75
116
|
}
|
|
76
117
|
|
|
@@ -105,11 +146,12 @@ async function init(args) {
|
|
|
105
146
|
}
|
|
106
147
|
|
|
107
148
|
console.log(`\n${dryRun ? `🔍 预览完成,共 ${count} 项操作` : `✅ 已完成 ${count} 项操作 — 下次对话即可生效`}`)
|
|
108
|
-
if (!dryRun) {
|
|
149
|
+
if (!dryRun && count > 0) {
|
|
109
150
|
console.log("\n📖 使用指南(在 CodeBuddy 对话中输入):")
|
|
110
151
|
console.log(" skillopt-sleep dry-run → 每日健康检查")
|
|
111
152
|
console.log(" skillopt-sleep run → 周改进提案")
|
|
112
153
|
console.log(" impeccable audit/critique → 设计质量审查")
|
|
154
|
+
console.log(" npx self-evolve-framework list → 查看所有可用 skill")
|
|
113
155
|
}
|
|
114
156
|
}
|
|
115
157
|
|