@yoonion/mimi-seed-mcp 0.5.0 → 0.6.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.
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { loadJenkinsConfig, requireJenkinsConfig, saveJenkinsConfig } from '../jenkins/config.js';
3
3
  import * as creds from '../jenkins/credentials.js';
4
+ import * as jobs from '../jenkins/jobs.js';
4
5
  export function registerJenkinsTools(server) {
5
6
  // ── 0. 상태 확인 (항상 첫 번째로 호출) ─────────────────────────────────────
6
7
  server.tool('jenkins_status', [
@@ -42,6 +43,7 @@ export function registerJenkinsTools(server) {
42
43
  '',
43
44
  'jenkins_list_credentials 로 등록된 credential 목록을 확인하거나,',
44
45
  'jenkins_create_credential / jenkins_upload_keystore 로 credential을 추가하세요.',
46
+ '잡은 jenkins_list_jobs / jenkins_get_job_config / jenkins_create_job / jenkins_update_job 로 다룹니다.',
45
47
  ].join('\n'),
46
48
  }],
47
49
  };
@@ -147,4 +149,77 @@ export function registerJenkinsTools(server) {
147
149
  }],
148
150
  };
149
151
  });
152
+ // ── 6. 잡 목록 ─────────────────────────────────────────────────────────────
153
+ server.tool('jenkins_list_jobs', [
154
+ 'Jenkins 잡 목록을 조회합니다 (이름 / URL / 상태색).',
155
+ 'folder를 주면 그 폴더 안만 조회합니다. 재귀하지 않고 한 단계만 봅니다.',
156
+ '설정이 없으면 jenkins_status를 먼저 호출하세요.',
157
+ ].join(' '), {
158
+ folder: z.string().optional().describe('폴더 경로 (예: vir-game). 생략하면 루트'),
159
+ }, async ({ folder }) => {
160
+ const cfg = requireJenkinsConfig();
161
+ const list = await jobs.listJobs(cfg, folder);
162
+ if (list.length === 0) {
163
+ return { content: [{ type: 'text', text: '잡 없음.' }] };
164
+ }
165
+ const lines = list.map((j) => `• ${j.name}${j.color ? ` [${j.color}]` : ' [folder]'}`);
166
+ return {
167
+ content: [{
168
+ type: 'text',
169
+ text: `Jenkins jobs (${list.length}개):\n\n${lines.join('\n')}`,
170
+ }],
171
+ };
172
+ });
173
+ // ── 7. 잡 config.xml 조회 ──────────────────────────────────────────────────
174
+ server.tool('jenkins_get_job_config', [
175
+ '잡의 config.xml 원문을 가져옵니다.',
176
+ '잡을 수정하기 전에 현재 설정을 확인하거나 백업할 때 사용하세요.',
177
+ '폴더 안의 잡은 "folder/job" 형태로 경로를 넘깁니다.',
178
+ ].join(' '), {
179
+ job: z.string().describe('잡 경로 (예: penguinrun, vir-game/client)'),
180
+ }, async ({ job }) => {
181
+ const cfg = requireJenkinsConfig();
182
+ const xml = await jobs.getJobConfig(cfg, job);
183
+ return { content: [{ type: 'text', text: xml }] };
184
+ });
185
+ // ── 8. 잡 생성 ─────────────────────────────────────────────────────────────
186
+ server.tool('jenkins_create_job', [
187
+ 'config.xml 로 새 Jenkins 잡을 생성합니다 (createItem).',
188
+ '같은 이름의 잡이 이미 있으면 실패합니다. 덮어쓰려면 overwrite=true 를 주거나 jenkins_update_job 을 쓰세요.',
189
+ '폴더 안에 만들려면 job 에 "folder/name" 을 넘깁니다 (폴더는 미리 존재해야 합니다).',
190
+ 'config_xml 은 Pipeline job 이면 flow-definition 루트 엘리먼트를 갖는 XML 전문입니다.',
191
+ ].join(' '), {
192
+ job: z.string().describe('잡 경로 (예: penguinrun, vir-game/client)'),
193
+ config_xml: z.string().describe('잡 정의 config.xml 전문'),
194
+ overwrite: z.boolean().default(false).describe('이미 존재하면 덮어쓸지 여부 (기본 false)'),
195
+ }, async ({ job, config_xml, overwrite }) => {
196
+ const cfg = requireJenkinsConfig();
197
+ if (overwrite) {
198
+ const result = await jobs.upsertJob(cfg, job, config_xml);
199
+ return { content: [{ type: 'text', text: `✅ Jenkins 잡 ${result}: \`${job}\`` }] };
200
+ }
201
+ if (await jobs.jobExists(cfg, job)) {
202
+ return {
203
+ content: [{
204
+ type: 'text',
205
+ text: `⚠️ 잡 \`${job}\` 이(가) 이미 존재합니다. jenkins_update_job 을 쓰거나 overwrite=true 로 다시 호출하세요.`,
206
+ }],
207
+ };
208
+ }
209
+ await jobs.createJob(cfg, job, config_xml);
210
+ return { content: [{ type: 'text', text: `✅ Jenkins 잡 created: \`${job}\`` }] };
211
+ });
212
+ // ── 9. 잡 수정 ─────────────────────────────────────────────────────────────
213
+ server.tool('jenkins_update_job', [
214
+ '기존 Jenkins 잡의 config.xml 을 통째로 교체합니다.',
215
+ '잡이 없으면 실패합니다 (생성은 jenkins_create_job).',
216
+ '기존 설정이 사라지므로 jenkins_get_job_config 로 먼저 백업하는 것을 권장합니다.',
217
+ ].join(' '), {
218
+ job: z.string().describe('잡 경로 (예: penguinrun, vir-game/client)'),
219
+ config_xml: z.string().describe('교체할 config.xml 전문'),
220
+ }, async ({ job, config_xml }) => {
221
+ const cfg = requireJenkinsConfig();
222
+ await jobs.updateJob(cfg, job, config_xml);
223
+ return { content: [{ type: 'text', text: `✅ Jenkins 잡 updated: \`${job}\`` }] };
224
+ });
150
225
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yoonion/mimi-seed-mcp",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Mimi Seed MCP server — Firebase + AdMob + Google Play + App Store management for Claude Code / Codex / Cursor / any MCP client.",
5
5
  "type": "module",
6
6
  "bin": {