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.
Files changed (55) hide show
  1. package/.claude/mysql-config.json +34 -0
  2. package/.claude/skills/jenkins-deploy/SKILL.md +21 -5
  3. package/.claude/skills/jenkins-deploy/assets/jk_build.py +29 -14
  4. package/.claude/skills/leniu-java-amount-handling/SKILL.md +461 -0
  5. package/.claude/skills/leniu-java-export/SKILL.md +570 -0
  6. package/.claude/skills/leniu-java-report-query-param/SKILL.md +291 -0
  7. package/.claude/skills/leniu-java-total-line/SKILL.md +196 -0
  8. package/.claude/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  9. package/.claude/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  10. package/.claude/skills/leniu-mealtime/SKILL.md +215 -0
  11. package/.claude/skills/leniu-report-customization/SKILL.md +415 -0
  12. package/.claude/skills/leniu-report-customization/references/table-fields.md +93 -0
  13. package/.claude/skills/leniu-report-standard-customization/SKILL.md +391 -0
  14. package/.claude/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  15. package/.claude/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  16. package/.claude/skills/loki-log-query/SKILL.md +25 -55
  17. package/.claude/skills/loki-log-query/environments.json +45 -0
  18. package/.claude/skills/mysql-debug/SKILL.md +6 -12
  19. package/.codex/skills/jenkins-deploy/SKILL.md +21 -5
  20. package/.codex/skills/jenkins-deploy/assets/env_param.template.json +51 -0
  21. package/.codex/skills/jenkins-deploy/assets/jk_build.py +415 -0
  22. package/.codex/skills/leniu-java-export/SKILL.md +570 -0
  23. package/.codex/skills/leniu-java-report-query-param/SKILL.md +291 -0
  24. package/.codex/skills/leniu-java-total-line/SKILL.md +196 -0
  25. package/.codex/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  26. package/.codex/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  27. package/.codex/skills/leniu-mealtime/SKILL.md +215 -0
  28. package/.codex/skills/leniu-report-customization/SKILL.md +415 -0
  29. package/.codex/skills/leniu-report-customization/references/table-fields.md +93 -0
  30. package/.codex/skills/leniu-report-standard-customization/SKILL.md +391 -0
  31. package/.codex/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  32. package/.codex/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  33. package/.codex/skills/loki-log-query/SKILL.md +25 -55
  34. package/.codex/skills/mysql-debug/SKILL.md +6 -12
  35. package/.cursor/skills/jenkins-deploy/SKILL.md +21 -5
  36. package/.cursor/skills/jenkins-deploy/assets/env_param.template.json +51 -0
  37. package/.cursor/skills/jenkins-deploy/assets/jk_build.py +415 -0
  38. package/.cursor/skills/leniu-java-export/SKILL.md +570 -0
  39. package/.cursor/skills/leniu-java-report-query-param/SKILL.md +291 -0
  40. package/.cursor/skills/leniu-java-total-line/SKILL.md +196 -0
  41. package/.cursor/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  42. package/.cursor/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  43. package/.cursor/skills/leniu-mealtime/SKILL.md +215 -0
  44. package/.cursor/skills/leniu-report-customization/SKILL.md +415 -0
  45. package/.cursor/skills/leniu-report-customization/references/table-fields.md +93 -0
  46. package/.cursor/skills/leniu-report-standard-customization/SKILL.md +391 -0
  47. package/.cursor/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  48. package/.cursor/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  49. package/.cursor/skills/loki-log-query/SKILL.md +25 -55
  50. package/.cursor/skills/mysql-debug/SKILL.md +6 -12
  51. package/bin/index.js +59 -15
  52. package/package.json +1 -1
  53. package/src/skills/jenkins-deploy/SKILL.md +150 -0
  54. package/src/skills/jenkins-deploy/assets/env_param.template.json +51 -0
  55. 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
- ### 环境匹配规则(含 range)
40
+ ### 环境匹配规则
67
41
 
68
- | 用户说法 | 匹配方式 | 结果 |
69
- |---------|---------|------|
70
- | " test13 的日志" | 精确匹配 key/aliases | `test13` 环境 |
71
- | "去 dev10 查" | **range 匹配**:dev10 在 monitor-dev 的 projects 中 | `monitor-dev`,`project="dev10"` |
72
- | "去 monitor-dev " | 精确匹配 key | `monitor-dev` 环境 |
73
- | "切到体验园" | aliases 匹配 | `monitor-tyy-dev` 环境 |
74
- | 未指定环境 | 使用 `active` 字段 | 默认活跃环境 |
42
+ 用户说的话 匹配环境:
43
+ - "查 test13 的日志" → `test13`
44
+ - " monitor-dev " `monitor-dev`
45
+ - "切到体验园" `monitor-tyy-dev`
46
+ - "去 m02 查一下" `monitor02-dev`
47
+ - 未指定环境 使用 `active` 字段指定的默认环境
75
48
 
76
- ### 读取配置(含全局降级 + range 匹配)
49
+ ### 读取配置
77
50
 
78
51
  ```bash
79
- # 按优先级查找配置文件
80
- find_config() {
81
- local PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
82
- for f in \
83
- "${PROJECT_DIR}/.claude/loki-config.json" \
84
- "${PROJECT_DIR}/.claude/skills/loki-log-query/environments.json" \
85
- "${HOME}/.claude/loki-config.json" \
86
- "${HOME}/.cursor/loki-config.json"; do
87
- [ -f "$f" ] && echo "$f" && return
88
- done
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
- ENV_FILE=$(find_config)
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(f'{key}|'); exit()
102
- for key, env in data['environments'].items():
103
- if alias in env.get('projects', []):
104
- print(f'{key}|{alias}'); exit()
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 环境查一下" → 使用配置中 dev 环境
38
- - "去 dev10 查" → **范围匹配** dev 环境(range: "1~15")
37
+ - "连 dev 环境查一下" → 使用 `.claude/mysql-config.json` 中 dev 环境的配置
39
38
  - 直接给出 host/port/user/password → 直接使用
40
39
 
41
- ### 优先级 2:本地项目 `.claude/mysql-config.json`
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
- toolsToUpdate = userTools.length > 0 ? userTools : detectInstalledTools();
820
- if (toolsToUpdate.length === 0) {
821
- console.log(fmt('yellow', '⚠ 未检测到已安装的 AI 工具配置。'));
822
- console.log(` 请先运行: ${fmt('bold', hintCmd('install --tool claude'))}\n`);
823
- process.exit(1);
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: false,
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
- console.log(` 位置: ${fmt('bold', '~/.claude/ (用户级)')}`);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leniu-dev",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "AI 工程化开发工具 — 一键安装 Skills、Commands、Hooks 到 Claude Code / Cursor / Codex",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -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
+ }