leniu-dev 2.0.0 → 2.0.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/.claude/mysql-config.json +34 -0
- package/.claude/skills/jenkins-deploy/SKILL.md +21 -5
- package/.claude/skills/jenkins-deploy/assets/jk_build.py +29 -14
- package/.claude/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.claude/skills/leniu-java-export/SKILL.md +570 -0
- package/.claude/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.claude/skills/leniu-java-total-line/SKILL.md +196 -0
- package/.claude/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.claude/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.claude/skills/leniu-mealtime/SKILL.md +215 -0
- package/.claude/skills/leniu-report-customization/SKILL.md +415 -0
- package/.claude/skills/leniu-report-customization/references/table-fields.md +93 -0
- package/.claude/skills/leniu-report-standard-customization/SKILL.md +391 -0
- package/.claude/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
- package/.claude/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
- package/.claude/skills/loki-log-query/SKILL.md +25 -55
- package/.claude/skills/loki-log-query/environments.json +45 -0
- package/.claude/skills/mysql-debug/SKILL.md +6 -12
- package/.codex/skills/jenkins-deploy/SKILL.md +21 -5
- package/.codex/skills/jenkins-deploy/assets/env_param.template.json +51 -0
- package/.codex/skills/jenkins-deploy/assets/jk_build.py +415 -0
- package/.codex/skills/leniu-java-export/SKILL.md +570 -0
- package/.codex/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.codex/skills/leniu-java-total-line/SKILL.md +196 -0
- package/.codex/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.codex/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.codex/skills/leniu-mealtime/SKILL.md +215 -0
- package/.codex/skills/leniu-report-customization/SKILL.md +415 -0
- package/.codex/skills/leniu-report-customization/references/table-fields.md +93 -0
- package/.codex/skills/leniu-report-standard-customization/SKILL.md +391 -0
- package/.codex/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
- package/.codex/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
- package/.codex/skills/loki-log-query/SKILL.md +25 -55
- package/.codex/skills/mysql-debug/SKILL.md +6 -12
- package/.cursor/skills/jenkins-deploy/SKILL.md +21 -5
- package/.cursor/skills/jenkins-deploy/assets/env_param.template.json +51 -0
- package/.cursor/skills/jenkins-deploy/assets/jk_build.py +415 -0
- package/.cursor/skills/leniu-java-export/SKILL.md +570 -0
- package/.cursor/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.cursor/skills/leniu-java-total-line/SKILL.md +196 -0
- package/.cursor/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.cursor/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.cursor/skills/leniu-mealtime/SKILL.md +215 -0
- package/.cursor/skills/leniu-report-customization/SKILL.md +415 -0
- package/.cursor/skills/leniu-report-customization/references/table-fields.md +93 -0
- package/.cursor/skills/leniu-report-standard-customization/SKILL.md +391 -0
- package/.cursor/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
- package/.cursor/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
- package/.cursor/skills/loki-log-query/SKILL.md +25 -55
- package/.cursor/skills/mysql-debug/SKILL.md +6 -12
- package/bin/index.js +59 -15
- package/package.json +1 -1
- package/src/skills/jenkins-deploy/SKILL.md +150 -0
- package/src/skills/jenkins-deploy/assets/env_param.template.json +51 -0
- package/src/skills/jenkins-deploy/assets/jk_build.py +415 -0
|
@@ -25,35 +25,9 @@ description: |
|
|
|
25
25
|
|
|
26
26
|
## 多环境配置
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
配置文件:`.claude/skills/loki-log-query/environments.json`
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
1. 本地项目:.claude/loki-config.json(新格式)
|
|
32
|
-
2. 本地项目:.claude/skills/loki-log-query/environments.json(旧格式,兼容)
|
|
33
|
-
3. 全局配置:~/.claude/loki-config.json(或 ~/.cursor/loki-config.json)
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
本地优先。全局配置用 `npx ai-engineering-init config --type loki --scope global` 创建。
|
|
37
|
-
|
|
38
|
-
### 配置结构(支持 range 范围匹配)
|
|
39
|
-
|
|
40
|
-
```json
|
|
41
|
-
{
|
|
42
|
-
"active": "monitor-dev",
|
|
43
|
-
"environments": {
|
|
44
|
-
"monitor-dev": {
|
|
45
|
-
"name": "Monitor 开发环境",
|
|
46
|
-
"url": "https://monitor-dev.xnzn.net/grafana",
|
|
47
|
-
"token": "glsa_xxx",
|
|
48
|
-
"aliases": ["mdev", "dev"],
|
|
49
|
-
"range": "dev1~15",
|
|
50
|
-
"projects": ["dev01","dev02","...","dev15"]
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### 环境列表(默认)
|
|
30
|
+
### 环境列表
|
|
57
31
|
|
|
58
32
|
| 环境别名 | 名称 | URL | 快捷词 |
|
|
59
33
|
|----------|------|-----|--------|
|
|
@@ -63,34 +37,31 @@ description: |
|
|
|
63
37
|
| `monitor02-dev` | Monitor02 开发环境 | `https://monitor02-dev.xnzn.net/grafana` | m02, monitor02 |
|
|
64
38
|
| `monitor-tyy-dev` | Monitor 体验园开发环境 | `https://monitor-tyy-dev.xnzn.net/grafana` | tyy, 体验园 |
|
|
65
39
|
|
|
66
|
-
###
|
|
40
|
+
### 环境匹配规则
|
|
67
41
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
| 未指定环境 | 使用 `active` 字段 | 默认活跃环境 |
|
|
42
|
+
用户说的话 → 匹配环境:
|
|
43
|
+
- "查 test13 的日志" → `test13`
|
|
44
|
+
- "去 monitor-dev 查" → `monitor-dev`
|
|
45
|
+
- "切到体验园" → `monitor-tyy-dev`
|
|
46
|
+
- "去 m02 查一下" → `monitor02-dev`
|
|
47
|
+
- 未指定环境 → 使用 `active` 字段指定的默认环境
|
|
75
48
|
|
|
76
|
-
###
|
|
49
|
+
### 读取配置
|
|
77
50
|
|
|
78
51
|
```bash
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
52
|
+
SKILL_DIR="$CLAUDE_PROJECT_DIR/.claude/skills/loki-log-query"
|
|
53
|
+
ENV_FILE="${SKILL_DIR}/environments.json"
|
|
54
|
+
|
|
55
|
+
# 读取指定环境(参数: 环境别名)
|
|
56
|
+
read_env() {
|
|
57
|
+
local ENV_KEY="${1:-$(python3 -c "import json; print(json.load(open('${ENV_FILE}'))['active'])")}"
|
|
58
|
+
GRAFANA_URL=$(python3 -c "import json; print(json.load(open('${ENV_FILE}'))['environments']['${ENV_KEY}']['url'])")
|
|
59
|
+
TOKEN=$(python3 -c "import json; print(json.load(open('${ENV_FILE}'))['environments']['${ENV_KEY}']['token'])")
|
|
60
|
+
API="${GRAFANA_URL}/api/datasources/proxy/uid/loki/loki/api/v1"
|
|
61
|
+
echo "Environment: ${ENV_KEY} → ${GRAFANA_URL}"
|
|
89
62
|
}
|
|
90
63
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
# 通过别名或 range 查找环境 key + project
|
|
64
|
+
# 通过别名查找环境 key
|
|
94
65
|
find_env() {
|
|
95
66
|
python3 -c "
|
|
96
67
|
import json
|
|
@@ -98,11 +69,10 @@ data = json.load(open('${ENV_FILE}'))
|
|
|
98
69
|
alias = '${1}'.lower()
|
|
99
70
|
for key, env in data['environments'].items():
|
|
100
71
|
if alias == key or alias in env.get('aliases', []):
|
|
101
|
-
print(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
print(f'{data[\"active\"]}|')
|
|
72
|
+
print(key)
|
|
73
|
+
break
|
|
74
|
+
else:
|
|
75
|
+
print(data['active'])
|
|
106
76
|
"
|
|
107
77
|
}
|
|
108
78
|
```
|
|
@@ -27,28 +27,22 @@ description: |
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
-
##
|
|
30
|
+
## 连接信息获取(三级降级,自动查找)
|
|
31
31
|
|
|
32
32
|
当本技能被激活时,**按以下优先级获取数据库连接信息**:
|
|
33
33
|
|
|
34
34
|
### 优先级 1:用户对话中指定(最高优先级)
|
|
35
35
|
|
|
36
36
|
用户直接给出连接信息,或指定环境名:
|
|
37
|
-
- "连 dev 环境查一下" →
|
|
38
|
-
- "去 dev10 查" → **范围匹配** dev 环境(range: "1~15")
|
|
37
|
+
- "连 dev 环境查一下" → 使用 `.claude/mysql-config.json` 中 dev 环境的配置
|
|
39
38
|
- 直接给出 host/port/user/password → 直接使用
|
|
40
39
|
|
|
41
|
-
### 优先级 2
|
|
40
|
+
### 优先级 2:`.claude/mysql-config.json`(显式配置,可选)
|
|
42
41
|
|
|
43
|
-
|
|
42
|
+
如果文件存在且当前环境的 password 不是占位符 `YOUR_PASSWORD`,使用该配置。
|
|
43
|
+
**此文件为可选**,主要用于连接非本地环境(dev/prod 远程数据库)。
|
|
44
44
|
|
|
45
|
-
### 优先级 3
|
|
46
|
-
|
|
47
|
-
全局配置文件(通过 `npx ai-engineering-init config --scope global` 创建)。
|
|
48
|
-
查找路径:`~/.claude/mysql-config.json` 或 `~/.cursor/mysql-config.json`(取决于使用的工具)。
|
|
49
|
-
**推荐**:公司统一的数据库连接信息放全局,项目特定的覆盖放本地。
|
|
50
|
-
|
|
51
|
-
### 优先级 4:工程配置文件(零配置,本地开发默认)
|
|
45
|
+
### 优先级 3:工程配置文件(零配置,本地开发默认)
|
|
52
46
|
|
|
53
47
|
从项目的 `bootstrap-dev.yml` 中自动提取连接信息:
|
|
54
48
|
|
package/bin/index.js
CHANGED
|
@@ -804,25 +804,28 @@ function runUpdate(selectedTool) {
|
|
|
804
804
|
if (force) console.log(` ${fmt('yellow', '⚠ --force 模式:将同时更新保留文件')}`);
|
|
805
805
|
console.log('');
|
|
806
806
|
|
|
807
|
+
// 读取安装元数据,恢复之前的角色和工具选择
|
|
808
|
+
const meta = readInstallMeta();
|
|
807
809
|
let toolsToUpdate = [];
|
|
808
810
|
|
|
809
|
-
//
|
|
810
|
-
const detectUserTools = () => Object.keys(GLOBAL_RULES).filter(key =>
|
|
811
|
-
isRealDir(path.join(HOME_DIR, GLOBAL_RULES[key].targetDir || path.join(HOME_DIR, '.' + key)))
|
|
812
|
-
);
|
|
811
|
+
// 优先从元数据恢复,其次自动检测
|
|
813
812
|
const userTools = Object.keys(GLOBAL_RULES).filter(key =>
|
|
814
813
|
isRealDir(GLOBAL_RULES[key].targetDir)
|
|
815
814
|
);
|
|
816
815
|
|
|
817
816
|
if (!selectedTool || selectedTool === 'all') {
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
817
|
+
if (meta && meta.tools && meta.tools.length > 0) {
|
|
818
|
+
toolsToUpdate = meta.tools.filter(k => GLOBAL_RULES[k]);
|
|
819
|
+
console.log(` 从安装记录恢复: ${fmt('bold', toolsToUpdate.join(', '))}`);
|
|
820
|
+
} else {
|
|
821
|
+
toolsToUpdate = userTools.length > 0 ? userTools : detectInstalledTools();
|
|
822
|
+
if (toolsToUpdate.length === 0) {
|
|
823
|
+
console.log(fmt('yellow', '⚠ 未检测到已安装的 AI 工具配置。'));
|
|
824
|
+
console.log(` 请先运行: ${fmt('bold', hintCmd('install --tool claude'))}\n`);
|
|
825
|
+
process.exit(1);
|
|
826
|
+
}
|
|
827
|
+
console.log(` 检测到已安装: ${fmt('bold', toolsToUpdate.join(', '))}`);
|
|
824
828
|
}
|
|
825
|
-
console.log(` 检测到已安装: ${fmt('bold', toolsToUpdate.join(', '))}`);
|
|
826
829
|
} else {
|
|
827
830
|
if (!GLOBAL_RULES[selectedTool]) {
|
|
828
831
|
console.error(fmt('red', `无效工具: "${selectedTool}"。有效选项: claude | cursor | codex | all`));
|
|
@@ -831,9 +834,18 @@ function runUpdate(selectedTool) {
|
|
|
831
834
|
toolsToUpdate = [selectedTool];
|
|
832
835
|
}
|
|
833
836
|
|
|
837
|
+
// 恢复角色过滤(使用安装时选择的角色,或 --role 参数覆盖)
|
|
838
|
+
const role = installRole || (meta && meta.role) || 'all';
|
|
839
|
+
const allowedSkills = getSkillsForRole(role);
|
|
840
|
+
const roleLabels = { backend: '后端研发', frontend: '前端研发', product: '产品经理', all: '全部' };
|
|
841
|
+
|
|
834
842
|
// 判断是否有用户级安装
|
|
835
843
|
const isUserLevel = userTools.length > 0;
|
|
836
844
|
console.log(` 更新模式: ${fmt('bold', isUserLevel ? '用户级' : '项目级')}`);
|
|
845
|
+
console.log(` 安装角色: ${fmt('bold', roleLabels[role] || role)}${meta && meta.role ? '' : '(未记录,默认全部)'}`);
|
|
846
|
+
if (allowedSkills) {
|
|
847
|
+
console.log(` 技能数量: ${fmt('bold', String(allowedSkills.size))} 个`);
|
|
848
|
+
}
|
|
837
849
|
console.log('');
|
|
838
850
|
console.log(fmt('bold', '正在更新框架文件...'));
|
|
839
851
|
console.log('');
|
|
@@ -841,8 +853,8 @@ function runUpdate(selectedTool) {
|
|
|
841
853
|
let totalUpdated = 0, totalFailed = 0, totalPreserved = 0;
|
|
842
854
|
for (let i = 0; i < toolsToUpdate.length; i++) {
|
|
843
855
|
if (isUserLevel) {
|
|
844
|
-
// 用户级更新:使用全局安装逻辑
|
|
845
|
-
const { installed, failed } = globalInstallTool(toolsToUpdate[i]);
|
|
856
|
+
// 用户级更新:使用全局安装逻辑 + 角色过滤
|
|
857
|
+
const { installed, failed } = globalInstallTool(toolsToUpdate[i], allowedSkills);
|
|
846
858
|
totalUpdated += installed;
|
|
847
859
|
totalFailed += failed;
|
|
848
860
|
} else {
|
|
@@ -2051,7 +2063,7 @@ const MCP_REGISTRY = [
|
|
|
2051
2063
|
package: 'alibabacloud-devops-mcp-server',
|
|
2052
2064
|
description: '阿里云效 — DevOps 项目管理、代码仓库、流水线集成',
|
|
2053
2065
|
env: { YUNXIAO_ACCESS_TOKEN: '<YOUR_TOKEN>' },
|
|
2054
|
-
recommended:
|
|
2066
|
+
recommended: true,
|
|
2055
2067
|
},
|
|
2056
2068
|
{
|
|
2057
2069
|
name: 'yuque',
|
|
@@ -2068,6 +2080,34 @@ const MCP_REGISTRY = [
|
|
|
2068
2080
|
env: {},
|
|
2069
2081
|
recommended: false,
|
|
2070
2082
|
},
|
|
2083
|
+
{
|
|
2084
|
+
name: 'lanhu',
|
|
2085
|
+
package: '@anthropic-ai/mcp-lanhu',
|
|
2086
|
+
description: '蓝湖 — 读取 Axure 原型页面、UI 设计图、切图资源',
|
|
2087
|
+
env: { LANHU_TOKEN: '<YOUR_TOKEN>' },
|
|
2088
|
+
recommended: true,
|
|
2089
|
+
},
|
|
2090
|
+
{
|
|
2091
|
+
name: 'apifox',
|
|
2092
|
+
package: '@anthropic-ai/mcp-apifox',
|
|
2093
|
+
description: 'Apifox — 接口文档读取,API 自动化测试联动',
|
|
2094
|
+
env: { APIFOX_TOKEN: '<YOUR_TOKEN>' },
|
|
2095
|
+
recommended: true,
|
|
2096
|
+
},
|
|
2097
|
+
{
|
|
2098
|
+
name: 'firecrawl',
|
|
2099
|
+
package: 'firecrawl-mcp',
|
|
2100
|
+
description: 'Firecrawl — 网页爬取、结构化提取(比 fetch 更强)',
|
|
2101
|
+
env: { FIRECRAWL_API_KEY: '<YOUR_KEY>' },
|
|
2102
|
+
recommended: false,
|
|
2103
|
+
},
|
|
2104
|
+
{
|
|
2105
|
+
name: 'exa',
|
|
2106
|
+
package: 'exa-mcp-server',
|
|
2107
|
+
description: 'Exa — AI 搜索引擎,语义搜索技术文档和代码',
|
|
2108
|
+
env: { EXA_API_KEY: '<YOUR_KEY>' },
|
|
2109
|
+
recommended: false,
|
|
2110
|
+
},
|
|
2071
2111
|
];
|
|
2072
2112
|
|
|
2073
2113
|
/** MCP 配置文件路径映射 */
|
|
@@ -2925,7 +2965,11 @@ function showInstallMenu() {
|
|
|
2925
2965
|
console.log(` 技能: ${fmt('bold', skillCountStr)}`);
|
|
2926
2966
|
console.log(` 配置: ${fmt('bold', selectedConfigs.length > 0 ? selectedConfigs.join(', ') : '无')}`);
|
|
2927
2967
|
console.log(` MCP: ${fmt('bold', installMcp ? '推荐服务器' : '跳过')}`);
|
|
2928
|
-
|
|
2968
|
+
const locationStr = selectedTool === 'all' ? '~/.claude/ ~/.cursor/ ~/.codex/'
|
|
2969
|
+
: selectedTool === 'claude' ? '~/.claude/'
|
|
2970
|
+
: selectedTool === 'cursor' ? '~/.cursor/'
|
|
2971
|
+
: '~/.codex/';
|
|
2972
|
+
console.log(` 位置: ${fmt('bold', locationStr + ' (用户级)')}`);
|
|
2929
2973
|
console.log('');
|
|
2930
2974
|
const confirm = await ask(fmt('bold', '确认安装?[Y/n]: ')) || 'y';
|
|
2931
2975
|
if (confirm.toLowerCase() === 'n') {
|
package/package.json
CHANGED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jenkins-deploy
|
|
3
|
+
description: |
|
|
4
|
+
Jenkins + Portainer 自动打包部署技能。通过 Python 脚本调用 Jenkins API 构建项目,并触发 Portainer Webhook/Update 完成容器更新。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 需要将代码打包部署到 dev/test 环境
|
|
8
|
+
- 需要触发 Jenkins 构建 core 或 api 项目
|
|
9
|
+
- 需要更新 Portainer 容器服务
|
|
10
|
+
- 需要查看或修改构建配置(分支、环境、模式)
|
|
11
|
+
- 定制项目的打包部署
|
|
12
|
+
|
|
13
|
+
触发词:打包、部署、Jenkins、构建、Portainer、发布到dev、发布到test、更新环境、自动部署
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Jenkins + Portainer 自动打包部署
|
|
17
|
+
|
|
18
|
+
## 架构
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
技能目录(随框架更新,不复制到项目):
|
|
22
|
+
~/.claude/skills/jenkins-deploy/assets/jk_build.py ← 构建脚本
|
|
23
|
+
|
|
24
|
+
全局配置(一次性配置,所有项目共享):
|
|
25
|
+
~/.claude/jenkins-config.json ← 凭证(Jenkins/Portainer)
|
|
26
|
+
|
|
27
|
+
项目本地(自动生成):
|
|
28
|
+
jenkins/last_cd_env.json ← 构建状态(环境、分支、模式)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
脚本按 **本地 `.claude/` > 全局 `~/.claude/`** 优先级查找 `jenkins-config.json`。
|
|
32
|
+
|
|
33
|
+
## 构建模式
|
|
34
|
+
|
|
35
|
+
| 模式 | 说明 | 执行步骤 |
|
|
36
|
+
|------|------|---------|
|
|
37
|
+
| `0` | 只构建 | 构建 core + api,不更新 Portainer |
|
|
38
|
+
| `1` | 全构建+更新 | 构建 core + api → 触发 Portainer 更新 |
|
|
39
|
+
| `2` | 构建 api+更新 | 跳过 core,构建 api → 触发 Portainer 更新 |
|
|
40
|
+
| `3` | 只更新 | 不构建,直接触发 Portainer 更新 |
|
|
41
|
+
|
|
42
|
+
## 环境支持
|
|
43
|
+
|
|
44
|
+
| 环境 | 前缀 | Portainer 更新方式 |
|
|
45
|
+
|------|------|-------------------|
|
|
46
|
+
| dev1~15 | `dev` | Webhook 触发 |
|
|
47
|
+
| dev16~43 | `dev` | Force Update(xnzn-dev.xnzn.net) |
|
|
48
|
+
| dev44+ | `dev` | 只支持模式 0(手动更新) |
|
|
49
|
+
| test | `test` | Webhook 触发 |
|
|
50
|
+
|
|
51
|
+
## 使用方式
|
|
52
|
+
|
|
53
|
+
### 运行构建脚本
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
python ~/.claude/skills/jenkins-deploy/assets/jk_build.py
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
脚本交互式询问:模式 → 环境 → core 分支 → api 分支 → 定制工程文件夹
|
|
60
|
+
|
|
61
|
+
### 命令行模式(推荐,AI 调用)
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
python3 ~/.claude/skills/jenkins-deploy/assets/jk_build.py \
|
|
65
|
+
--mode 2 --env dev10 --api-branch release_xxx --folder 常州技师学院
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
| 参数 | 缩写 | 说明 |
|
|
69
|
+
|------|------|------|
|
|
70
|
+
| `--mode` | `-m` | 构建模式(0/1/2/3) |
|
|
71
|
+
| `--env` | `-e` | 目标环境(dev10, test1) |
|
|
72
|
+
| `--core-branch` | | core 分支名 |
|
|
73
|
+
| `--api-branch` | | api 分支名 |
|
|
74
|
+
| `--folder` | `-f` | 定制项目文件夹名 |
|
|
75
|
+
|
|
76
|
+
未传的参数自动使用 `last_cd_env.json` 中的上次值。
|
|
77
|
+
|
|
78
|
+
### 通过 AI 辅助部署
|
|
79
|
+
|
|
80
|
+
当用户说"打包到 devX"时,直接用命令行参数调用,不再需要 heredoc 模拟交互:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
python3 ~/.claude/skills/jenkins-deploy/assets/jk_build.py --mode 2 --env dev10 --api-branch master
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## 配置文件
|
|
87
|
+
|
|
88
|
+
### jenkins-config.json(凭证,全局)
|
|
89
|
+
|
|
90
|
+
位置:`~/.claude/jenkins-config.json`(或本地 `.claude/jenkins-config.json`)
|
|
91
|
+
|
|
92
|
+
模板:`.claude/skills/jenkins-deploy/assets/env_param.template.json`
|
|
93
|
+
|
|
94
|
+
> **注意**:此文件包含敏感凭证,不要将内容输出到对话中。
|
|
95
|
+
|
|
96
|
+
### last_cd_env.json(构建状态,项目本地)
|
|
97
|
+
|
|
98
|
+
位置:`jenkins/last_cd_env.json`(脚本自动创建,无需手动初始化)
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"build_mode": "1",
|
|
103
|
+
"cd_env": "dev1",
|
|
104
|
+
"core_param_branch": "master",
|
|
105
|
+
"api_param_branch": "master",
|
|
106
|
+
"api_param_folder": null
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 定制项目
|
|
111
|
+
|
|
112
|
+
指定 `api_param_folder` 后,Jenkins Job 路径变为:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
{folder_name}/dev-后端-core
|
|
116
|
+
{folder_name}/dev-后端-api
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## 首次初始化(团队成员)
|
|
120
|
+
|
|
121
|
+
只需一步:配置全局凭证文件。
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# 方式 1:从团队成员拷贝
|
|
125
|
+
cp /path/to/teammate/jenkins-config.json ~/.claude/jenkins-config.json
|
|
126
|
+
|
|
127
|
+
# 方式 2:从模板创建,手动填写凭证
|
|
128
|
+
cp ~/.claude/skills/jenkins-deploy/assets/env_param.template.json ~/.claude/jenkins-config.json
|
|
129
|
+
# 然后替换 __JENKINS_*__ 和 __PORTAINER_*__ 占位符
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### AI 初始化行为
|
|
133
|
+
|
|
134
|
+
当技能被触发但 `jenkins-config.json` 不存在时:
|
|
135
|
+
1. 提示"检测到尚未配置 Jenkins 凭证"
|
|
136
|
+
2. 询问是否从模板创建
|
|
137
|
+
3. 复制模板到 `~/.claude/jenkins-config.json`
|
|
138
|
+
4. 提示用户填写凭证(或拷贝已有配置)
|
|
139
|
+
|
|
140
|
+
## 依赖
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
pip install python-jenkins requests
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## 注意
|
|
147
|
+
|
|
148
|
+
- 本技能用于 dev/test 环境部署,**不涉及生产环境**
|
|
149
|
+
- 如果是 Git 提交/分支管理,请使用 `git-workflow` 技能
|
|
150
|
+
- 如果是代码构建错误排查,请使用 `bug-detective` 技能
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"portainer_api_url": {
|
|
3
|
+
"dev": "https://devops-dev.xnzn.net/api",
|
|
4
|
+
"dev16": "https://xnzn-dev.xnzn.net/api",
|
|
5
|
+
"test": "https://devops-test.xnzn.net/api"
|
|
6
|
+
},
|
|
7
|
+
"portainer_user_name": {
|
|
8
|
+
"dev": "__PORTAINER_DEV_USER__",
|
|
9
|
+
"dev16": "__PORTAINER_DEV16_USER__",
|
|
10
|
+
"test": "__PORTAINER_TEST_USER__"
|
|
11
|
+
},
|
|
12
|
+
"portainer_user_pwd": {
|
|
13
|
+
"dev": "__PORTAINER_DEV_PWD__",
|
|
14
|
+
"dev16": "__PORTAINER_DEV16_PWD__",
|
|
15
|
+
"test": "__PORTAINER_TEST_PWD__"
|
|
16
|
+
},
|
|
17
|
+
"portainer_endpoints": {
|
|
18
|
+
"dev": "2",
|
|
19
|
+
"dev16": "1",
|
|
20
|
+
"test": "2"
|
|
21
|
+
},
|
|
22
|
+
"portainer_server_suffix": {
|
|
23
|
+
"dev": "_yunshitang-api",
|
|
24
|
+
"dev16": "_yunshitang-api-offline",
|
|
25
|
+
"test": "_yunshitang-api"
|
|
26
|
+
},
|
|
27
|
+
"core_job": {
|
|
28
|
+
"dev": "dev-tengyun-core",
|
|
29
|
+
"test": "test-tengyun-core"
|
|
30
|
+
},
|
|
31
|
+
"core_job_custom": {
|
|
32
|
+
"dev": "dev-后端-core",
|
|
33
|
+
"test": "test-后端-core"
|
|
34
|
+
},
|
|
35
|
+
"api_job": {
|
|
36
|
+
"dev": "dev-tengyun-yunshitang-api",
|
|
37
|
+
"test": "test-tengyun-yunshitang-api"
|
|
38
|
+
},
|
|
39
|
+
"api_job_custom": {
|
|
40
|
+
"dev": "dev-后端-api",
|
|
41
|
+
"test": "test-后端-api"
|
|
42
|
+
},
|
|
43
|
+
"jenkins_user_id": {
|
|
44
|
+
"dev": "__JENKINS_DEV_USER__",
|
|
45
|
+
"test": "__JENKINS_TEST_USER__"
|
|
46
|
+
},
|
|
47
|
+
"jenkins_api_token": {
|
|
48
|
+
"dev": "__JENKINS_DEV_TOKEN__",
|
|
49
|
+
"test": "__JENKINS_TEST_TOKEN__"
|
|
50
|
+
}
|
|
51
|
+
}
|