ai-engineering-init 1.4.3 → 1.5.0
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/.cursor/skills/bug-detective/SKILL.md +19 -19
- package/.cursor/skills/project-navigator/SKILL.md +164 -258
- package/package.json +7 -1
- package/scripts/build-skills.js +180 -0
- package/src/platform-map.json +56 -0
- package/src/skills/add-skill/SKILL.md +488 -0
- package/src/skills/add-todo/SKILL.md +269 -0
- package/src/skills/api-development/SKILL.md +266 -0
- package/src/skills/architecture-design/SKILL.md +262 -0
- package/src/skills/backend-annotations/SKILL.md +302 -0
- package/src/skills/banana-image/CHANGELOG.md +37 -0
- package/src/skills/banana-image/README.md +146 -0
- package/src/skills/banana-image/SKILL.md +171 -0
- package/src/skills/banana-image/assets/logo.png +0 -0
- package/src/skills/banana-image/references/advanced-usage.md +189 -0
- package/src/skills/banana-image/scripts/apply_template.py +125 -0
- package/src/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/src/skills/banana-image/scripts/batch_prep.py +82 -0
- package/src/skills/banana-image/scripts/package-lock.json +1437 -0
- package/src/skills/banana-image/scripts/package.json +18 -0
- package/src/skills/banana-image/scripts/requirements.txt +10 -0
- package/src/skills/banana-image/templates/poster.json +22 -0
- package/src/skills/banana-image/templates/product.json +17 -0
- package/src/skills/banana-image/templates/social.json +22 -0
- package/src/skills/banana-image/templates/thumbnail.json +17 -0
- package/src/skills/brainstorm/SKILL.md +216 -0
- package/src/skills/bug-detective/SKILL.md +256 -0
- package/src/skills/bug-detective/references/error-patterns.md +242 -0
- package/src/skills/check/SKILL.md +367 -0
- package/src/skills/code-patterns/SKILL.md +280 -0
- package/src/skills/code-patterns/references/leniu-code-patterns.md +87 -0
- package/src/skills/codex-code-review/SKILL.md +135 -0
- package/src/skills/collaborating-with-codex/SKILL.md +174 -0
- package/src/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/src/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/src/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/src/skills/crud/SKILL.md +265 -0
- package/src/skills/crud-development/SKILL.md +409 -0
- package/src/skills/data-permission/SKILL.md +292 -0
- package/src/skills/data-permission/references/custom-data-scope.md +90 -0
- package/src/skills/database-ops/SKILL.md +407 -0
- package/src/skills/dev/SKILL.md +187 -0
- package/src/skills/error-handler/SKILL.md +371 -0
- package/src/skills/file-oss-management/SKILL.md +255 -0
- package/src/skills/file-oss-management/references/entities.md +105 -0
- package/src/skills/file-oss-management/references/service-impl.md +104 -0
- package/src/skills/git-workflow/SKILL.md +397 -0
- package/src/skills/init-docs/SKILL.md +194 -0
- package/src/skills/json-serialization/SKILL.md +357 -0
- package/src/skills/leniu-api-development/SKILL.md +319 -0
- package/src/skills/leniu-api-development/references/real-examples.md +273 -0
- package/src/skills/leniu-architecture-design/SKILL.md +383 -0
- package/src/skills/leniu-backend-annotations/SKILL.md +277 -0
- package/src/skills/leniu-brainstorm/SKILL.md +242 -0
- package/src/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
- package/src/skills/leniu-code-patterns/SKILL.md +411 -0
- package/src/skills/leniu-crud-development/SKILL.md +404 -0
- package/src/skills/leniu-crud-development/references/templates.md +597 -0
- package/src/skills/leniu-customization-location/SKILL.md +410 -0
- package/src/skills/leniu-data-permission/SKILL.md +341 -0
- package/src/skills/leniu-database-ops/SKILL.md +426 -0
- package/src/skills/leniu-error-handler/SKILL.md +462 -0
- package/src/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/src/skills/leniu-java-code-style/SKILL.md +510 -0
- package/src/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/src/skills/leniu-java-entity/SKILL.md +237 -0
- package/src/skills/leniu-java-entity/references/templates.md +237 -0
- package/src/skills/leniu-java-export/SKILL.md +570 -0
- package/src/skills/leniu-java-logging/SKILL.md +229 -0
- package/src/skills/leniu-java-logging/references/data-mask.md +46 -0
- package/src/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
- package/src/skills/leniu-java-mq/SKILL.md +338 -0
- package/src/skills/leniu-java-mybatis/SKILL.md +267 -0
- package/src/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
- package/src/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/src/skills/leniu-java-task/SKILL.md +367 -0
- package/src/skills/leniu-java-total-line/SKILL.md +196 -0
- package/src/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/src/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/src/skills/leniu-mealtime/SKILL.md +215 -0
- package/src/skills/leniu-redis-cache/SKILL.md +331 -0
- package/src/skills/leniu-report-customization/SKILL.md +335 -0
- package/src/skills/leniu-report-customization/references/table-fields.md +93 -0
- package/src/skills/leniu-report-standard-customization/SKILL.md +328 -0
- package/src/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
- package/src/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
- package/src/skills/leniu-security-guard/SKILL.md +306 -0
- package/src/skills/leniu-utils-toolkit/SKILL.md +380 -0
- package/src/skills/mysql-debug/SKILL.md +364 -0
- package/src/skills/next/SKILL.md +137 -0
- package/src/skills/openspec-apply-change/SKILL.md +165 -0
- package/src/skills/openspec-archive-change/SKILL.md +122 -0
- package/src/skills/openspec-bulk-archive-change/SKILL.md +254 -0
- package/src/skills/openspec-continue-change/SKILL.md +126 -0
- package/src/skills/openspec-explore/SKILL.md +299 -0
- package/src/skills/openspec-ff-change/SKILL.md +109 -0
- package/src/skills/openspec-new-change/SKILL.md +82 -0
- package/src/skills/openspec-onboard/SKILL.md +414 -0
- package/src/skills/openspec-sync-specs/SKILL.md +146 -0
- package/src/skills/openspec-verify-change/SKILL.md +176 -0
- package/src/skills/performance-doctor/SKILL.md +303 -0
- package/src/skills/progress/SKILL.md +193 -0
- package/src/skills/project-navigator/SKILL.md +211 -0
- package/src/skills/redis-cache/SKILL.md +333 -0
- package/src/skills/redis-cache/references/listeners.md +23 -0
- package/src/skills/scheduled-jobs/SKILL.md +314 -0
- package/src/skills/security-guard/SKILL.md +353 -0
- package/src/skills/security-guard/references/encrypt-config.md +103 -0
- package/src/skills/security-guard/references/sensitive-strategies.md +42 -0
- package/src/skills/sms-mail/SKILL.md +308 -0
- package/src/skills/sms-mail/references/mail-config.md +88 -0
- package/src/skills/sms-mail/references/sms-config.md +74 -0
- package/src/skills/social-login/SKILL.md +266 -0
- package/src/skills/social-login/references/provider-configs.md +118 -0
- package/src/skills/start/SKILL.md +154 -0
- package/src/skills/store-pc/SKILL.md +366 -0
- package/src/skills/sync/SKILL.md +149 -0
- package/src/skills/task-tracker/SKILL.md +307 -0
- package/src/skills/tech-decision/SKILL.md +393 -0
- package/src/skills/tenant-management/SKILL.md +288 -0
- package/src/skills/tenant-management/references/tenant-scenarios.md +91 -0
- package/src/skills/test-development/SKILL.md +301 -0
- package/src/skills/test-development/references/parameterized-examples.md +119 -0
- package/src/skills/ui-pc/SKILL.md +438 -0
- package/src/skills/update-status/SKILL.md +159 -0
- package/src/skills/utils-toolkit/SKILL.md +362 -0
- package/src/skills/utils-toolkit/references/redis-utils-api.md +56 -0
- package/src/skills/websocket-sse/SKILL.md +271 -0
- package/src/skills/workflow-engine/SKILL.md +321 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* build-skills.js
|
|
5
|
+
*
|
|
6
|
+
* 从 src/skills/ 单一源生成 .claude/skills/, .codex/skills/, .cursor/skills/ 三个平台目录。
|
|
7
|
+
* 根据 src/platform-map.json 决定每个技能分发到哪些平台。
|
|
8
|
+
*
|
|
9
|
+
* 用法:
|
|
10
|
+
* node scripts/build-skills.js # 构建
|
|
11
|
+
* node scripts/build-skills.js --check # 仅检查一致性(CI 用)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const fs = require('fs');
|
|
15
|
+
const path = require('path');
|
|
16
|
+
const crypto = require('crypto');
|
|
17
|
+
|
|
18
|
+
const ROOT = path.resolve(__dirname, '..');
|
|
19
|
+
const SRC_DIR = path.join(ROOT, 'src', 'skills');
|
|
20
|
+
const PLATFORM_MAP_PATH = path.join(ROOT, 'src', 'platform-map.json');
|
|
21
|
+
|
|
22
|
+
const PLATFORM_DIRS = {
|
|
23
|
+
claude: path.join(ROOT, '.claude', 'skills'),
|
|
24
|
+
codex: path.join(ROOT, '.codex', 'skills'),
|
|
25
|
+
cursor: path.join(ROOT, '.cursor', 'skills'),
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const CHECK_MODE = process.argv.includes('--check');
|
|
29
|
+
|
|
30
|
+
// ── 工具函数 ────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
function loadPlatformMap() {
|
|
33
|
+
const raw = fs.readFileSync(PLATFORM_MAP_PATH, 'utf-8');
|
|
34
|
+
return JSON.parse(raw);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function getSkillPlatforms(skillName, platformMap) {
|
|
38
|
+
if (platformMap.overrides[skillName]) {
|
|
39
|
+
return platformMap.overrides[skillName].platforms;
|
|
40
|
+
}
|
|
41
|
+
return platformMap.defaults.platforms;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function hashFile(filePath) {
|
|
45
|
+
const content = fs.readFileSync(filePath);
|
|
46
|
+
return crypto.createHash('md5').update(content).digest('hex').slice(0, 8);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function copyDirRecursive(src, dest) {
|
|
50
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
51
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
52
|
+
|
|
53
|
+
for (const entry of entries) {
|
|
54
|
+
const srcPath = path.join(src, entry.name);
|
|
55
|
+
const destPath = path.join(dest, entry.name);
|
|
56
|
+
|
|
57
|
+
if (entry.isDirectory()) {
|
|
58
|
+
copyDirRecursive(srcPath, destPath);
|
|
59
|
+
} else {
|
|
60
|
+
fs.copyFileSync(srcPath, destPath);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function dirContentsEqual(dir1, dir2) {
|
|
66
|
+
if (!fs.existsSync(dir1) || !fs.existsSync(dir2)) return false;
|
|
67
|
+
|
|
68
|
+
const entries1 = getAllFiles(dir1).map(f => path.relative(dir1, f)).sort();
|
|
69
|
+
const entries2 = getAllFiles(dir2).map(f => path.relative(dir2, f)).sort();
|
|
70
|
+
|
|
71
|
+
if (entries1.length !== entries2.length) return false;
|
|
72
|
+
|
|
73
|
+
for (let i = 0; i < entries1.length; i++) {
|
|
74
|
+
if (entries1[i] !== entries2[i]) return false;
|
|
75
|
+
|
|
76
|
+
const content1 = fs.readFileSync(path.join(dir1, entries1[i]));
|
|
77
|
+
const content2 = fs.readFileSync(path.join(dir2, entries2[i]));
|
|
78
|
+
|
|
79
|
+
if (!content1.equals(content2)) return false;
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function getAllFiles(dir) {
|
|
85
|
+
const results = [];
|
|
86
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
87
|
+
for (const entry of entries) {
|
|
88
|
+
const fullPath = path.join(dir, entry.name);
|
|
89
|
+
if (entry.isDirectory()) {
|
|
90
|
+
results.push(...getAllFiles(fullPath));
|
|
91
|
+
} else {
|
|
92
|
+
results.push(fullPath);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return results;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function removeDirRecursive(dirPath) {
|
|
99
|
+
if (fs.existsSync(dirPath)) {
|
|
100
|
+
fs.rmSync(dirPath, { recursive: true, force: true });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ── 主逻辑 ──────────────────────────────────────────────
|
|
105
|
+
|
|
106
|
+
function build() {
|
|
107
|
+
const platformMap = loadPlatformMap();
|
|
108
|
+
const skillDirs = fs.readdirSync(SRC_DIR, { withFileTypes: true })
|
|
109
|
+
.filter(d => d.isDirectory())
|
|
110
|
+
.map(d => d.name)
|
|
111
|
+
.sort();
|
|
112
|
+
|
|
113
|
+
const stats = { claude: 0, codex: 0, cursor: 0 };
|
|
114
|
+
const errors = [];
|
|
115
|
+
|
|
116
|
+
// 构建每个技能到目标平台
|
|
117
|
+
for (const skillName of skillDirs) {
|
|
118
|
+
const platforms = getSkillPlatforms(skillName, platformMap);
|
|
119
|
+
const srcSkillDir = path.join(SRC_DIR, skillName);
|
|
120
|
+
|
|
121
|
+
for (const platform of platforms) {
|
|
122
|
+
const destSkillDir = path.join(PLATFORM_DIRS[platform], skillName);
|
|
123
|
+
|
|
124
|
+
if (CHECK_MODE) {
|
|
125
|
+
// 检查模式:对比内容是否一致
|
|
126
|
+
if (!dirContentsEqual(srcSkillDir, destSkillDir)) {
|
|
127
|
+
errors.push(`${platform}/skills/${skillName} 与 src/skills/${skillName} 不一致`);
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
// 构建模式:删除旧的,复制新的
|
|
131
|
+
removeDirRecursive(destSkillDir);
|
|
132
|
+
copyDirRecursive(srcSkillDir, destSkillDir);
|
|
133
|
+
}
|
|
134
|
+
stats[platform]++;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (CHECK_MODE) {
|
|
139
|
+
// 反向检查:平台目录中是否存在 src 中没有的技能
|
|
140
|
+
for (const [platform, platformDir] of Object.entries(PLATFORM_DIRS)) {
|
|
141
|
+
if (!fs.existsSync(platformDir)) continue;
|
|
142
|
+
const platformSkills = fs.readdirSync(platformDir, { withFileTypes: true })
|
|
143
|
+
.filter(d => d.isDirectory())
|
|
144
|
+
.map(d => d.name);
|
|
145
|
+
|
|
146
|
+
for (const skill of platformSkills) {
|
|
147
|
+
const platforms = getSkillPlatforms(skill, platformMap);
|
|
148
|
+
if (!platforms.includes(platform)) {
|
|
149
|
+
errors.push(`${platform}/skills/${skill} 不应存在(platform-map 未配置)`);
|
|
150
|
+
}
|
|
151
|
+
if (!fs.existsSync(path.join(SRC_DIR, skill))) {
|
|
152
|
+
errors.push(`${platform}/skills/${skill} 在 src/skills/ 中不存在`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return { stats, errors, skillCount: skillDirs.length };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// ── 执行 ────────────────────────────────────────────────
|
|
162
|
+
|
|
163
|
+
console.log(CHECK_MODE ? '🔍 检查三平台一致性...' : '🔨 从 src/skills/ 构建三平台目录...');
|
|
164
|
+
console.log();
|
|
165
|
+
|
|
166
|
+
const { stats, errors, skillCount } = build();
|
|
167
|
+
|
|
168
|
+
console.log(`📦 src/skills/ 源技能数: ${skillCount}`);
|
|
169
|
+
console.log(` → .claude/skills/: ${stats.claude} 个`);
|
|
170
|
+
console.log(` → .codex/skills/: ${stats.codex} 个`);
|
|
171
|
+
console.log(` → .cursor/skills/: ${stats.cursor} 个`);
|
|
172
|
+
console.log();
|
|
173
|
+
|
|
174
|
+
if (errors.length > 0) {
|
|
175
|
+
console.error(`❌ 发现 ${errors.length} 个不一致:`);
|
|
176
|
+
errors.forEach(e => console.error(` • ${e}`));
|
|
177
|
+
process.exit(1);
|
|
178
|
+
} else {
|
|
179
|
+
console.log(CHECK_MODE ? '✅ 三平台与 src/skills/ 完全一致' : '✅ 构建完成');
|
|
180
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "平台映射配置 - 定义每个技能分发到哪些平台",
|
|
3
|
+
"defaults": {
|
|
4
|
+
"platforms": ["claude", "codex", "cursor"]
|
|
5
|
+
},
|
|
6
|
+
"overrides": {
|
|
7
|
+
"codex-code-review": {
|
|
8
|
+
"platforms": ["claude"],
|
|
9
|
+
"note": "Codex 代码审查工作流,仅 Claude 平台使用"
|
|
10
|
+
},
|
|
11
|
+
"add-todo": {
|
|
12
|
+
"platforms": ["codex"],
|
|
13
|
+
"note": "快速添加待办,仅 Codex 平台 slash command"
|
|
14
|
+
},
|
|
15
|
+
"check": {
|
|
16
|
+
"platforms": ["codex"],
|
|
17
|
+
"note": "代码规范检查,仅 Codex 平台 slash command"
|
|
18
|
+
},
|
|
19
|
+
"crud": {
|
|
20
|
+
"platforms": ["codex"],
|
|
21
|
+
"note": "快速生成 CRUD,仅 Codex 平台 slash command"
|
|
22
|
+
},
|
|
23
|
+
"dev": {
|
|
24
|
+
"platforms": ["codex"],
|
|
25
|
+
"note": "开发新功能,仅 Codex 平台 slash command"
|
|
26
|
+
},
|
|
27
|
+
"init-docs": {
|
|
28
|
+
"platforms": ["codex"],
|
|
29
|
+
"note": "初始化业务文档,仅 Codex 平台 slash command"
|
|
30
|
+
},
|
|
31
|
+
"next": {
|
|
32
|
+
"platforms": ["codex"],
|
|
33
|
+
"note": "下一步建议,仅 Codex 平台 slash command"
|
|
34
|
+
},
|
|
35
|
+
"progress": {
|
|
36
|
+
"platforms": ["codex"],
|
|
37
|
+
"note": "项目进度梳理,仅 Codex 平台 slash command"
|
|
38
|
+
},
|
|
39
|
+
"start": {
|
|
40
|
+
"platforms": ["codex"],
|
|
41
|
+
"note": "项目快速了解,仅 Codex 平台 slash command"
|
|
42
|
+
},
|
|
43
|
+
"sync": {
|
|
44
|
+
"platforms": ["codex"],
|
|
45
|
+
"note": "项目代码状态同步,仅 Codex 平台 slash command"
|
|
46
|
+
},
|
|
47
|
+
"update-status": {
|
|
48
|
+
"platforms": ["codex"],
|
|
49
|
+
"note": "项目状态智能更新,仅 Codex 平台 slash command"
|
|
50
|
+
},
|
|
51
|
+
"leniu-java-code-style": {
|
|
52
|
+
"platforms": ["codex", "cursor"],
|
|
53
|
+
"note": "代码风格规范,Codex 和 Cursor 平台使用"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|