choavis-agent 1.4.2 → 1.5.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.
@@ -0,0 +1,153 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Confluence REST API 클라이언트
5
+ * Basic Auth 기반. 크레덴셜은 credentials.cjs에서 로딩.
6
+ *
7
+ * 사용법: node .claude/lib/confluence-api.cjs <command> [args...]
8
+ *
9
+ * Commands:
10
+ * search <cql> [limit] — CQL 검색
11
+ * get <pageId> — 페이지 조회
12
+ * create <spaceKey> <title> <body> [parentId] — 페이지 생성
13
+ * update <pageId> <title> <body> — 페이지 수정
14
+ * spaces — 스페이스 목록
15
+ */
16
+
17
+ const { request } = require('./http-client.cjs');
18
+ const { loadConfluenceCredentials } = require('./credentials.cjs');
19
+
20
+ function authHeaders(cred) {
21
+ const token = Buffer.from(`${cred.email}:${cred.apiToken}`).toString('base64');
22
+ return {
23
+ Authorization: `Basic ${token}`,
24
+ Accept: 'application/json',
25
+ };
26
+ }
27
+
28
+ /** CQL 검색 */
29
+ async function searchByCql(cql, limit = 20) {
30
+ const cred = loadConfluenceCredentials();
31
+ const encoded = encodeURIComponent(cql);
32
+ const url = `${cred.baseUrl}/wiki/rest/api/content/search?cql=${encoded}&limit=${limit}&expand=version,space`;
33
+ const result = await request('GET', url, { headers: authHeaders(cred) });
34
+ return result.data;
35
+ }
36
+
37
+ /** 페이지 조회 */
38
+ async function getPageContent(pageId) {
39
+ const cred = loadConfluenceCredentials();
40
+ const url = `${cred.baseUrl}/wiki/rest/api/content/${pageId}?expand=body.view,version,space`;
41
+ const result = await request('GET', url, { headers: authHeaders(cred) });
42
+ return result.data;
43
+ }
44
+
45
+ /** 페이지 생성 */
46
+ async function createPage(spaceKey, title, body, parentId) {
47
+ const cred = loadConfluenceCredentials();
48
+ const url = `${cred.baseUrl}/wiki/rest/api/content`;
49
+
50
+ const payload = {
51
+ type: 'page',
52
+ title,
53
+ space: { key: spaceKey },
54
+ body: {
55
+ storage: {
56
+ value: body,
57
+ representation: 'storage',
58
+ },
59
+ },
60
+ };
61
+
62
+ if (parentId) {
63
+ payload.ancestors = [{ id: parentId }];
64
+ }
65
+
66
+ const result = await request('POST', url, {
67
+ headers: { ...authHeaders(cred), 'Content-Type': 'application/json' },
68
+ body: JSON.stringify(payload),
69
+ });
70
+ return result.data;
71
+ }
72
+
73
+ /** 페이지 수정 */
74
+ async function updatePage(pageId, title, body) {
75
+ const cred = loadConfluenceCredentials();
76
+ // 먼저 현재 버전 조회
77
+ const current = await request('GET', `${cred.baseUrl}/wiki/rest/api/content/${pageId}?expand=version`, {
78
+ headers: authHeaders(cred),
79
+ });
80
+ const version = current.data.version.number;
81
+
82
+ const url = `${cred.baseUrl}/wiki/rest/api/content/${pageId}`;
83
+ const payload = {
84
+ type: 'page',
85
+ title,
86
+ body: {
87
+ storage: {
88
+ value: body,
89
+ representation: 'storage',
90
+ },
91
+ },
92
+ version: { number: version + 1 },
93
+ };
94
+
95
+ const result = await request('PUT', url, {
96
+ headers: { ...authHeaders(cred), 'Content-Type': 'application/json' },
97
+ body: JSON.stringify(payload),
98
+ });
99
+ return result.data;
100
+ }
101
+
102
+ /** 스페이스 목록 */
103
+ async function listSpaces() {
104
+ const cred = loadConfluenceCredentials();
105
+ const url = `${cred.baseUrl}/wiki/rest/api/space?limit=50&expand=description.plain`;
106
+ const result = await request('GET', url, { headers: authHeaders(cred) });
107
+ return result.data;
108
+ }
109
+
110
+ // --- CLI ---
111
+ async function main() {
112
+ const [, , cmd, ...args] = process.argv;
113
+
114
+ if (!cmd) {
115
+ console.error('Usage: node confluence-api.cjs <command> [args...]');
116
+ console.error('Commands: search, get, create, update, spaces');
117
+ process.exit(1);
118
+ }
119
+
120
+ try {
121
+ let result;
122
+ switch (cmd) {
123
+ case 'search':
124
+ if (!args[0]) throw new Error('CQL 쿼리를 지정하세요');
125
+ result = await searchByCql(args[0], parseInt(args[1]) || 20);
126
+ break;
127
+ case 'get':
128
+ if (!args[0]) throw new Error('페이지 ID를 지정하세요');
129
+ result = await getPageContent(args[0]);
130
+ break;
131
+ case 'create':
132
+ if (args.length < 3) throw new Error('사용법: create <spaceKey> <title> <body> [parentId]');
133
+ result = await createPage(args[0], args[1], args[2], args[3]);
134
+ break;
135
+ case 'update':
136
+ if (args.length < 3) throw new Error('사용법: update <pageId> <title> <body>');
137
+ result = await updatePage(args[0], args[1], args[2]);
138
+ break;
139
+ case 'spaces':
140
+ result = await listSpaces();
141
+ break;
142
+ default:
143
+ throw new Error(`알 수 없는 명령: ${cmd}`);
144
+ }
145
+
146
+ console.log(JSON.stringify(result, null, 2));
147
+ } catch (err) {
148
+ console.error(`오류: ${err.message}`);
149
+ process.exit(1);
150
+ }
151
+ }
152
+
153
+ main();
@@ -0,0 +1,56 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const os = require('os');
6
+
7
+ /**
8
+ * Jira 인증 정보 로딩
9
+ * 우선순위: 환경변수 > 파일
10
+ * @returns {{ email: string, apiToken: string, baseUrl: string }}
11
+ */
12
+ const DEFAULT_JIRA_URL = 'https://musinsa-oneteam.atlassian.net';
13
+
14
+ function loadJiraCredentials() {
15
+ if (process.env.JIRA_USERNAME && process.env.JIRA_API_TOKEN) {
16
+ return {
17
+ email: process.env.JIRA_USERNAME,
18
+ apiToken: process.env.JIRA_API_TOKEN,
19
+ baseUrl: (process.env.JIRA_URL || DEFAULT_JIRA_URL).replace(/\/$/, ''),
20
+ };
21
+ }
22
+
23
+ const credPath = path.join(os.homedir(), '.config', 'choavis-agent', 'atlassian-credentials.json');
24
+ if (fs.existsSync(credPath)) {
25
+ const cred = JSON.parse(fs.readFileSync(credPath, 'utf-8'));
26
+ if (!cred.username || !cred.apiToken || !cred.jiraUrl) {
27
+ throw new Error('atlassian-credentials.json에 username, apiToken, jiraUrl이 모두 필요합니다.');
28
+ }
29
+ return {
30
+ email: cred.username,
31
+ apiToken: cred.apiToken,
32
+ baseUrl: cred.jiraUrl.replace(/\/$/, ''),
33
+ };
34
+ }
35
+
36
+ throw new Error(
37
+ 'Jira 인증 정보를 찾을 수 없습니다.\n' +
38
+ ' Slack에서 $jira setup 명령으로 설정하거나\n' +
39
+ ' 환경변수 JIRA_URL, JIRA_USERNAME, JIRA_API_TOKEN을 설정하세요.'
40
+ );
41
+ }
42
+
43
+ /**
44
+ * Confluence 인증 정보 로딩 (Jira와 동일한 Atlassian 크리덴셜 사용)
45
+ * @returns {{ email: string, apiToken: string, baseUrl: string }}
46
+ */
47
+ function loadConfluenceCredentials() {
48
+ const cred = loadJiraCredentials();
49
+ return {
50
+ email: cred.email,
51
+ apiToken: cred.apiToken,
52
+ baseUrl: cred.baseUrl,
53
+ };
54
+ }
55
+
56
+ module.exports = { loadJiraCredentials, loadConfluenceCredentials };
@@ -0,0 +1,61 @@
1
+ 'use strict';
2
+
3
+ const https = require('https');
4
+
5
+ /**
6
+ * HTTPS JSON 요청 (외부 의존성 없음)
7
+ * @param {string} method
8
+ * @param {string} urlStr
9
+ * @param {object} [options]
10
+ * @returns {Promise<{status: number, data: *}>}
11
+ */
12
+ function request(method, urlStr, options = {}) {
13
+ const { headers = {}, body, timeout = 15000 } = options;
14
+
15
+ return new Promise((resolve, reject) => {
16
+ const url = new URL(urlStr);
17
+ const reqOpts = {
18
+ hostname: url.hostname,
19
+ port: url.port || 443,
20
+ path: url.pathname + url.search,
21
+ method,
22
+ headers,
23
+ };
24
+
25
+ if (body) {
26
+ reqOpts.headers['Content-Length'] = Buffer.byteLength(body);
27
+ }
28
+
29
+ const req = https.request(reqOpts, (res) => {
30
+ const chunks = [];
31
+ res.on('data', (c) => chunks.push(c));
32
+ res.on('end', () => {
33
+ const raw = Buffer.concat(chunks).toString('utf-8');
34
+ let data;
35
+ try {
36
+ data = JSON.parse(raw);
37
+ } catch {
38
+ data = raw;
39
+ }
40
+
41
+ if (res.statusCode >= 400) {
42
+ const msg = typeof data === 'string' ? data.slice(0, 200) : JSON.stringify(data).slice(0, 200);
43
+ reject(new Error(`HTTP ${res.statusCode}: ${msg}`));
44
+ return;
45
+ }
46
+
47
+ resolve({ status: res.statusCode, data });
48
+ });
49
+ });
50
+
51
+ req.on('error', reject);
52
+ req.setTimeout(timeout, () => {
53
+ req.destroy(new Error(`HTTP timeout (${timeout}ms)`));
54
+ });
55
+
56
+ if (body) req.write(body);
57
+ req.end();
58
+ });
59
+ }
60
+
61
+ module.exports = { request };
@@ -0,0 +1,167 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Jira Cloud REST API v3 클라이언트
5
+ * Basic Auth 기반. 크레덴셜은 credentials.js에서 로딩.
6
+ *
7
+ * 사용법: node .claude/lib/jira-api.js <command> [args...]
8
+ *
9
+ * Commands:
10
+ * search <jql> [maxResults] — JQL 이슈 검색
11
+ * get <issueKey> — 이슈 상세 조회
12
+ * create <projectKey> <type> <summary> [description] — 이슈 생성
13
+ * transition <issueKey> <transitionId> — 상태 변경
14
+ * transitions <issueKey> — 가능한 상태 전환 조회
15
+ * comment <issueKey> <body> — 댓글 추가
16
+ * projects — 프로젝트 목록
17
+ */
18
+
19
+ const { request } = require('./http-client.cjs');
20
+ const { loadJiraCredentials } = require('./credentials.cjs');
21
+
22
+ function authHeaders(cred) {
23
+ const token = Buffer.from(`${cred.email}:${cred.apiToken}`).toString('base64');
24
+ return {
25
+ Authorization: `Basic ${token}`,
26
+ Accept: 'application/json',
27
+ };
28
+ }
29
+
30
+ /** JQL 이슈 검색 */
31
+ async function search(jql, maxResults = 20) {
32
+ const cred = loadJiraCredentials();
33
+ const encoded = encodeURIComponent(jql);
34
+ const url = `${cred.baseUrl}/rest/api/3/search/jql?jql=${encoded}&maxResults=${maxResults}&fields=summary,status,assignee,priority,issuetype,created`;
35
+ const result = await request('GET', url, { headers: authHeaders(cred) });
36
+ return result.data;
37
+ }
38
+
39
+ /** 이슈 상세 조회 */
40
+ async function getIssue(issueKey) {
41
+ const cred = loadJiraCredentials();
42
+ const url = `${cred.baseUrl}/rest/api/3/issue/${issueKey}?fields=summary,status,assignee,priority,description,comment,issuetype,created,updated,labels,reporter`;
43
+ const result = await request('GET', url, { headers: authHeaders(cred) });
44
+ return result.data;
45
+ }
46
+
47
+ /** 이슈 생성 */
48
+ async function createIssue(projectKey, issueType, summary, description) {
49
+ const cred = loadJiraCredentials();
50
+ const url = `${cred.baseUrl}/rest/api/3/issue`;
51
+
52
+ const fields = {
53
+ project: { key: projectKey },
54
+ issuetype: { name: issueType },
55
+ summary,
56
+ };
57
+
58
+ if (description) {
59
+ fields.description = {
60
+ type: 'doc',
61
+ version: 1,
62
+ content: [{ type: 'paragraph', content: [{ type: 'text', text: description }] }],
63
+ };
64
+ }
65
+
66
+ const result = await request('POST', url, {
67
+ headers: { ...authHeaders(cred), 'Content-Type': 'application/json' },
68
+ body: JSON.stringify({ fields }),
69
+ });
70
+ return result.data;
71
+ }
72
+
73
+ /** 가능한 상태 전환 조회 */
74
+ async function getTransitions(issueKey) {
75
+ const cred = loadJiraCredentials();
76
+ const url = `${cred.baseUrl}/rest/api/3/issue/${issueKey}/transitions`;
77
+ const result = await request('GET', url, { headers: authHeaders(cred) });
78
+ return result.data;
79
+ }
80
+
81
+ /** 이슈 상태 전환 */
82
+ async function transitionIssue(issueKey, transitionId) {
83
+ const cred = loadJiraCredentials();
84
+ const url = `${cred.baseUrl}/rest/api/3/issue/${issueKey}/transitions`;
85
+ const result = await request('POST', url, {
86
+ headers: { ...authHeaders(cred), 'Content-Type': 'application/json' },
87
+ body: JSON.stringify({ transition: { id: transitionId } }),
88
+ });
89
+ return result.data;
90
+ }
91
+
92
+ /** 댓글 추가 */
93
+ async function addComment(issueKey, body) {
94
+ const cred = loadJiraCredentials();
95
+ const url = `${cred.baseUrl}/rest/api/3/issue/${issueKey}/comment`;
96
+ const result = await request('POST', url, {
97
+ headers: { ...authHeaders(cred), 'Content-Type': 'application/json' },
98
+ body: JSON.stringify({
99
+ body: {
100
+ type: 'doc',
101
+ version: 1,
102
+ content: [{ type: 'paragraph', content: [{ type: 'text', text: body }] }],
103
+ },
104
+ }),
105
+ });
106
+ return result.data;
107
+ }
108
+
109
+ /** 프로젝트 목록 */
110
+ async function listProjects() {
111
+ const cred = loadJiraCredentials();
112
+ const url = `${cred.baseUrl}/rest/api/3/project/search?maxResults=50`;
113
+ const result = await request('GET', url, { headers: authHeaders(cred) });
114
+ return result.data;
115
+ }
116
+
117
+ // --- CLI ---
118
+ async function main() {
119
+ const [, , cmd, ...args] = process.argv;
120
+
121
+ if (!cmd) {
122
+ console.error('Usage: node jira-api.js <command> [args...]');
123
+ console.error('Commands: search, get, create, transition, transitions, comment, projects');
124
+ process.exit(1);
125
+ }
126
+
127
+ try {
128
+ let result;
129
+ switch (cmd) {
130
+ case 'search':
131
+ result = await search(args[0] || 'assignee = currentUser()', parseInt(args[1]) || 20);
132
+ break;
133
+ case 'get':
134
+ if (!args[0]) throw new Error('이슈 키를 지정하세요 (예: KEY-123)');
135
+ result = await getIssue(args[0]);
136
+ break;
137
+ case 'create':
138
+ if (args.length < 3) throw new Error('사용법: create <projectKey> <issueType> <summary> [description]');
139
+ result = await createIssue(args[0], args[1], args[2], args[3]);
140
+ break;
141
+ case 'transitions':
142
+ if (!args[0]) throw new Error('이슈 키를 지정하세요');
143
+ result = await getTransitions(args[0]);
144
+ break;
145
+ case 'transition':
146
+ if (args.length < 2) throw new Error('사용법: transition <issueKey> <transitionId>');
147
+ result = await transitionIssue(args[0], args[1]);
148
+ break;
149
+ case 'comment':
150
+ if (args.length < 2) throw new Error('사용법: comment <issueKey> <body>');
151
+ result = await addComment(args[0], args[1]);
152
+ break;
153
+ case 'projects':
154
+ result = await listProjects();
155
+ break;
156
+ default:
157
+ throw new Error(`알 수 없는 명령: ${cmd}`);
158
+ }
159
+
160
+ console.log(JSON.stringify(result, null, 2));
161
+ } catch (err) {
162
+ console.error(`오류: ${err.message}`);
163
+ process.exit(1);
164
+ }
165
+ }
166
+
167
+ main();
@@ -0,0 +1,11 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(curl:*)",
5
+ "Bash(node:*)"
6
+ ]
7
+ },
8
+ "enabledPlugins": {
9
+ "notebooklm@muno-marketplace": true
10
+ }
11
+ }
@@ -0,0 +1,167 @@
1
+ ---
2
+ name: autopilot
3
+ description: Use when the user says autopilot, build me, create me, or wants end-to-end autonomous execution of a multi-phase task from idea to working code without manual intervention at each step
4
+ ---
5
+
6
+ # Autopilot
7
+
8
+ End-to-end autonomous execution from idea to working code. Chain existing superpowers skills without stopping for user confirmation at each phase.
9
+
10
+ **Core principle:** Receive task → design → plan → implement → verify → complete. Stop only when blocked.
11
+
12
+ **Announce at start:** "Autopilot 모드로 실행합니다: [task summary]"
13
+
14
+ ## When to Use
15
+
16
+ - User explicitly says "autopilot", "autopilot: ...", or "/autopilot"
17
+ - "build me...", "create me...", "만들어줘", "구현해줘" + task requires multi-phase work
18
+ - Task needs design + planning + implementation + testing + verification
19
+
20
+ ## When NOT to Use
21
+
22
+ - Single-file bug fix or simple edit → just fix it
23
+ - Question, research, or brainstorming only → use brainstorming skill
24
+ - Already have an implementation plan → use executing-plans or subagent-driven-development directly
25
+ - User wants step-by-step approval → use normal skill chain manually
26
+
27
+ ## Pipeline
28
+
29
+ ```dot
30
+ digraph autopilot {
31
+ rankdir=TB;
32
+
33
+ "Receive task" [shape=doublecircle];
34
+ "Phase 1: Expansion" [shape=box];
35
+ "Phase 2: Planning" [shape=box];
36
+ "Phase 3: Execution" [shape=box];
37
+ "Phase 4: QA Loop" [shape=box];
38
+ "QA passed?" [shape=diamond];
39
+ "Retry count < 3?" [shape=diamond];
40
+ "Fix issues" [shape=box];
41
+ "ESCALATE to user" [shape=box style=filled fillcolor=lightyellow];
42
+ "Phase 5: Completion" [shape=box];
43
+ "Done" [shape=doublecircle];
44
+
45
+ "Receive task" -> "Phase 1: Expansion";
46
+ "Phase 1: Expansion" -> "Phase 2: Planning";
47
+ "Phase 2: Planning" -> "Phase 3: Execution";
48
+ "Phase 3: Execution" -> "Phase 4: QA Loop";
49
+ "Phase 4: QA Loop" -> "QA passed?";
50
+ "QA passed?" -> "Phase 5: Completion" [label="yes"];
51
+ "QA passed?" -> "Retry count < 3?" [label="no"];
52
+ "Retry count < 3?" -> "Fix issues" [label="yes"];
53
+ "Fix issues" -> "Phase 4: QA Loop";
54
+ "Retry count < 3?" -> "ESCALATE to user" [label="no"];
55
+ "Phase 5: Completion" -> "Done";
56
+ }
57
+ ```
58
+
59
+ ## Phase 1: Expansion (Design)
60
+
61
+ **Based on:** superpowers:brainstorming — but WITHOUT user Q&A
62
+
63
+ 1. Explore project context: files, docs, recent commits, existing patterns
64
+ 2. Analyze the task requirements autonomously
65
+ 3. Make design decisions based on project conventions and best practices
66
+ 4. Write concise design to `docs/plans/YYYY-MM-DD-<topic>-design.md`
67
+ 5. Proceed immediately to Phase 2
68
+
69
+ **Key difference from brainstorming:** No questions to user. Explore context, decide, document, move on. If the task is genuinely ambiguous (two equally valid interpretations), STOP and ask.
70
+
71
+ ## Phase 2: Planning
72
+
73
+ **Based on:** superpowers:writing-plans
74
+
75
+ 1. Create bite-sized implementation plan from the design
76
+ 2. Follow writing-plans format: exact file paths, complete code, TDD steps
77
+ 3. Save to `docs/plans/YYYY-MM-DD-<topic>.md`
78
+ 4. Automatically select subagent-driven execution (do NOT ask user which approach)
79
+ 5. Proceed immediately to Phase 3
80
+
81
+ ## Phase 3: Execution
82
+
83
+ **Based on:** superpowers:subagent-driven-development
84
+
85
+ 1. Dispatch fresh subagent per task from the plan
86
+ 2. Each subagent follows TDD (superpowers:test-driven-development)
87
+ 3. Two-stage review per task: spec compliance → code quality
88
+ 4. Answer subagent questions autonomously using project context
89
+ 5. After all tasks complete, proceed to Phase 4
90
+
91
+ ## Phase 4: QA Loop
92
+
93
+ **Based on:** superpowers:verification-before-completion + OMC guardrails
94
+
95
+ 1. Run full verification: build, test, lint
96
+ 2. If all pass → proceed to Phase 5
97
+ 3. If failures:
98
+ - Analyze root cause
99
+ - Fix the issue
100
+ - Re-run verification
101
+ - Maximum 3 retry cycles
102
+ - Same error 3 times → ESCALATE to user
103
+
104
+ ```
105
+ QA_RETRY_LIMIT = 3
106
+ SAME_ERROR_LIMIT = 3
107
+ ```
108
+
109
+ ## Phase 5: Completion
110
+
111
+ **Based on:** superpowers:finishing-a-development-branch
112
+
113
+ 1. Ensure all commits are clean
114
+ 2. Present summary to user:
115
+ - What was built
116
+ - Files created/modified
117
+ - Test results
118
+ - Any decisions made during autonomous execution
119
+ 3. Offer: commit/PR/merge options
120
+
121
+ ## Guardrails
122
+
123
+ ### STOP and ask user immediately when:
124
+
125
+ - Same error repeats 3 times (stuck in loop)
126
+ - Architecture-level decision with no clear project convention
127
+ - Requirements are genuinely ambiguous (2+ equally valid interpretations)
128
+ - Destructive actions needed (mass deletion, schema changes, breaking changes)
129
+ - External service configuration or credentials needed
130
+ - Task scope is significantly larger than initially apparent
131
+
132
+ ### Auto-recover (don't ask user):
133
+
134
+ - Test failures → analyze and fix (up to 3 attempts)
135
+ - Lint errors → auto-fix
136
+ - Build errors → analyze and fix
137
+ - Missing imports → add them
138
+ - Type errors → fix them
139
+
140
+ ### Never do in autopilot:
141
+
142
+ - Force push
143
+ - Delete branches without confirmation
144
+ - Modify CI/CD pipelines
145
+ - Change database schemas destructively
146
+ - Skip tests to make things "pass"
147
+
148
+ ## Progress Reporting
149
+
150
+ At each phase transition, briefly report status:
151
+
152
+ ```
153
+ [Autopilot] Phase 1 완료 — 설계: REST API with JWT auth
154
+ [Autopilot] Phase 2 완료 — 7개 태스크 계획 작성
155
+ [Autopilot] Phase 3 진행중 — 4/7 태스크 완료
156
+ [Autopilot] Phase 4 완료 — 빌드 ✅ 테스트 42/42 ✅ 린트 ✅
157
+ [Autopilot] Phase 5 — 완료 보고
158
+ ```
159
+
160
+ ## Skill References
161
+
162
+ - **superpowers:brainstorming** — Phase 1 design approach
163
+ - **superpowers:writing-plans** — Phase 2 plan format
164
+ - **superpowers:subagent-driven-development** — Phase 3 execution
165
+ - **superpowers:test-driven-development** — Subagent TDD methodology
166
+ - **superpowers:verification-before-completion** — Phase 4 QA
167
+ - **superpowers:finishing-a-development-branch** — Phase 5 completion
@@ -0,0 +1,112 @@
1
+ ---
2
+ name: confluence
3
+ description: Confluence 위키 페이지 검색, 조회, 생성, 수정. 사용자가 위키/문서 관련 작업을 요청할 때 자동 활성화.
4
+ ---
5
+
6
+ # Confluence Skill
7
+
8
+ `.claude/lib/confluence-api.cjs` Node.js 클라이언트를 사용하여 Confluence REST API를 호출합니다.
9
+
10
+ ## 기본 정보
11
+
12
+ - 위키 URL: https://musinsa-oneteam.atlassian.net/wiki
13
+
14
+ ## 인증
15
+
16
+ Jira와 동일한 Atlassian 크리덴셜을 사용합니다 (환경변수 자동 주입).
17
+ 인증 오류 발생 시 사용자에게 `$jira setup` 명령어를 안내하세요.
18
+
19
+ ## API 호출 방법
20
+
21
+ 모든 Confluence 작업은 Bash에서 `node .claude/lib/confluence-api.cjs` CLI를 호출합니다:
22
+
23
+ ### 페이지 검색 (CQL)
24
+
25
+ ```bash
26
+ node .claude/lib/confluence-api.cjs search "title ~ \"검색어\" AND space = \"SPACE_KEY\"" 20
27
+ ```
28
+
29
+ **자주 쓰는 CQL:**
30
+ - 제목 검색: `title ~ "검색어"`
31
+ - 스페이스 내 검색: `space = "KEY" AND title ~ "검색어"`
32
+ - 최근 수정: `lastModified >= "2025-01-01" AND space = "KEY"`
33
+ - 특정 사용자 작성: `creator = "user@email.com" AND type = page`
34
+ - 라벨 검색: `label = "label-name"`
35
+
36
+ ### 페이지 조회
37
+
38
+ ```bash
39
+ node .claude/lib/confluence-api.cjs get PAGE_ID
40
+ ```
41
+
42
+ ### 페이지 생성
43
+
44
+ ```bash
45
+ node .claude/lib/confluence-api.cjs create SPACE_KEY "페이지 제목" "<p>HTML 내용</p>" [부모페이지ID]
46
+ ```
47
+
48
+ **생성 전 반드시 사용자에게 확인을 받으세요.**
49
+
50
+ 본문은 Confluence Storage Format (HTML)으로 작성:
51
+ ```html
52
+ <h2>섹션 제목</h2>
53
+ <p>내용입니다.</p>
54
+ <ul>
55
+ <li>항목 1</li>
56
+ <li>항목 2</li>
57
+ </ul>
58
+ <ac:structured-macro ac:name="code">
59
+ <ac:parameter ac:name="language">javascript</ac:parameter>
60
+ <ac:plain-text-body><![CDATA[console.log('hello');]]></ac:plain-text-body>
61
+ </ac:structured-macro>
62
+ ```
63
+
64
+ ### 페이지 수정
65
+
66
+ ```bash
67
+ node .claude/lib/confluence-api.cjs update PAGE_ID "새 제목" "<p>새 내용</p>"
68
+ ```
69
+
70
+ 버전은 자동으로 증가합니다. **수정 전 반드시 사용자에게 확인을 받으세요.**
71
+
72
+ ### 스페이스 목록
73
+
74
+ ```bash
75
+ node .claude/lib/confluence-api.cjs spaces
76
+ ```
77
+
78
+ ## 트리거 키워드
79
+
80
+ 위키, wiki, confluence, 문서 검색, 페이지 조회, 문서 만들어, 페이지 생성, 문서 수정, 위키 검색, 스페이스
81
+
82
+ ## 응답 형식
83
+
84
+ 검색 결과:
85
+ ```
86
+ [스페이스KEY] 페이지 제목 (수정일: 2025-01-15, 작성자: 홍길동)
87
+ ```
88
+
89
+ 페이지 조회:
90
+ ```
91
+ 제목: 페이지 제목
92
+ 스페이스: SPACE_KEY
93
+ URL: https://...
94
+ 최종 수정: 2025-01-15 by 홍길동
95
+ ---
96
+ (본문 요약)
97
+ ```
98
+
99
+ ## 에러 처리
100
+
101
+ | 에러 | 대응 |
102
+ |------|------|
103
+ | 인증 실패 | `$jira setup`으로 Atlassian 토큰 설정 안내 |
104
+ | 스페이스 없음 | `spaces` 명령으로 목록 제공 |
105
+ | 페이지 없음 | 페이지 ID/제목 확인 안내 |
106
+
107
+ ## 주의사항
108
+
109
+ - 변경 작업(생성, 수정) 전 반드시 사용자 확인
110
+ - 한국어로 응답
111
+ - HTML 본문이 길면 핵심 내용만 요약
112
+ - 페이지 URL이 있으면 함께 제공
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: jira
3
+ description: Jira 이슈 검색, 조회, 생성, 상태 변경, 댓글 추가. 사용자가 Jira 관련 작업을 요청할 때 자동 활성화.
4
+ ---
5
+
6
+ # Jira Skill
7
+
8
+ `.claude/lib/jira-api.cjs` Node.js 클라이언트를 사용하여 Jira Cloud REST API를 호출합니다.
9
+
10
+ ## 인증
11
+
12
+ 환경변수로 인증 정보가 자동 주입됩니다:
13
+ - `JIRA_URL`, `JIRA_USERNAME`, `JIRA_API_TOKEN`
14
+
15
+ 인증 오류 발생 시 사용자에게 `$jira setup` 명령어를 안내하세요.
16
+
17
+ ## API 호출 방법
18
+
19
+ 모든 Jira 작업은 Bash에서 `node .claude/lib/jira-api.cjs` CLI를 호출합니다:
20
+
21
+ ### 이슈 검색
22
+
23
+ ```bash
24
+ node .claude/lib/jira-api.cjs search "assignee = currentUser() AND resolution = Unresolved ORDER BY priority DESC" 20
25
+ ```
26
+
27
+ **자주 쓰는 JQL:**
28
+ - 내 이슈: `assignee = currentUser() AND resolution = Unresolved ORDER BY priority DESC`
29
+ - 프로젝트별: `project = KEY AND resolution = Unresolved ORDER BY created DESC`
30
+ - 스프린트: `sprint in openSprints() AND assignee = currentUser()`
31
+ - 최근 생성: `created >= -7d AND project = KEY ORDER BY created DESC`
32
+ - 상태별: `status = "In Progress" AND project = KEY`
33
+
34
+ ### 이슈 조회
35
+
36
+ ```bash
37
+ node .claude/lib/jira-api.cjs get KEY-123
38
+ ```
39
+
40
+ ### 이슈 생성
41
+
42
+ ```bash
43
+ node .claude/lib/jira-api.cjs create PROJECT_KEY Task "이슈 제목" "설명 내용"
44
+ ```
45
+
46
+ **생성 전 반드시 사용자에게 확인을 받으세요.**
47
+
48
+ ### 상태 전환 조회
49
+
50
+ ```bash
51
+ node .claude/lib/jira-api.cjs transitions KEY-123
52
+ ```
53
+
54
+ ### 상태 변경
55
+
56
+ ```bash
57
+ node .claude/lib/jira-api.cjs transition KEY-123 31
58
+ ```
59
+
60
+ ### 댓글 추가
61
+
62
+ ```bash
63
+ node .claude/lib/jira-api.cjs comment KEY-123 "댓글 내용"
64
+ ```
65
+
66
+ ### 프로젝트 목록
67
+
68
+ ```bash
69
+ node .claude/lib/jira-api.cjs projects
70
+ ```
71
+
72
+ ## 트리거 키워드
73
+
74
+ 지라, jira, 이슈 검색, 이슈 조회, 이슈 생성, 이슈 상태, JQL, 내 이슈, 할당된 이슈, 스프린트, 이슈 만들어, 상태 변경, 댓글 추가
75
+
76
+ ## 응답 형식
77
+
78
+ 검색 결과는 JSON을 파싱하여 사용자에게 읽기 좋은 형태로 변환:
79
+ ```
80
+ [KEY-123] 이슈 제목 (상태: In Progress, 담당: 홍길동)
81
+ [KEY-124] 다른 이슈 (상태: To Do, 담당: 미배정)
82
+ ```
83
+
84
+ ## 에러 처리
85
+
86
+ | 에러 | 대응 |
87
+ |------|------|
88
+ | "인증 정보를 찾을 수 없습니다" | `$jira setup` 안내 |
89
+ | HTTP 401/403 | 토큰 만료 가능성, `$jira setup` 재설정 안내 |
90
+ | HTTP 404 | 이슈/프로젝트 키 확인 안내 |
91
+
92
+ ## 주의사항
93
+
94
+ - 변경 작업(생성, 상태변경, 댓글) 전 반드시 사용자 확인
95
+ - 한국어로 응답
96
+ - 이슈 키는 `[KEY-123]` 형식
97
+ - 긴 설명은 500자 이내로 요약
package/.env.example CHANGED
@@ -36,3 +36,10 @@ ALLOWED_SLACK_USERS=U12345678,U87654321
36
36
 
37
37
  # 사용량 데이터 경로
38
38
  # USAGE_DATA_DIR=./data/usage
39
+
40
+ # === Jira/Atlassian 연동 (선택) ===
41
+ # 환경변수 또는 $jira setup 명령으로 설정 가능
42
+ # ~/.config/choavis-agent/atlassian-credentials.json 파일로도 설정 가능
43
+ # JIRA_URL=https://your-domain.atlassian.net
44
+ # JIRA_USERNAME=your-email@company.com
45
+ # JIRA_API_TOKEN=ATATT3xF...
package/CLAUDE.md ADDED
@@ -0,0 +1,40 @@
1
+ # Choavis Agent
2
+
3
+ 너는 Choavis Agent다. Slack을 통해 사용자와 대화하는 AI 에이전트로, 사용자의 요청을 이해하고 직접 작업을 수행한다.
4
+
5
+ Slack은 단순한 UI일 뿐이다. 너는 이 프로젝트 루트에서 동작하는 Claude Code 그 자체다.
6
+
7
+ ## 핵심 원칙
8
+
9
+ - 사용자의 요청을 받으면 직접 작업을 수행한다
10
+ - 터미널에서 할 수 있는 모든 작업이 가능하다
11
+ - 필요하면 다른 프로젝트 디렉토리로 이동하여 작업할 수 있다
12
+ - 한국어로 응답한다
13
+
14
+ ## 작업 가능 범위
15
+
16
+ 터미널로 할 수 있는 것은 전부 가능하다:
17
+ - 코드 작성, 수정, 리팩토링, 리뷰
18
+ - 버그 분석 및 수정
19
+ - Git 작업 (커밋, 브랜치, PR, 머지)
20
+ - 테스트 실행, 빌드, 배포 스크립트
21
+ - 파일/디렉토리 탐색 및 검색
22
+ - 패키지 관리 (npm, pnpm, pip 등)
23
+ - 서버 프로세스 관리, API 호출
24
+ - Docker, 인프라 명령어
25
+ - 프로젝트 구조 분석, 문서 작성
26
+ - 그 외 터미널에서 실행 가능한 모든 것
27
+
28
+ ## 프로젝트 맵
29
+
30
+ 이 에이전트 자체의 소스코드:
31
+ - `src/index.ts` - 엔트리포인트
32
+ - `src/slack/` - Slack 연동 (Bolt.js Socket Mode)
33
+ - `src/agent/` - Claude CLI subprocess 관리
34
+
35
+ ## 응답 스타일
36
+
37
+ - 간결하고 명확하게 응답
38
+ - 코드 변경 시 무엇을 왜 변경했는지 설명
39
+ - 긴 코드 블록보다 핵심 변경사항 위주로 설명
40
+ - 불확실한 것은 추측하지 않고 확인 후 답변
package/README.md CHANGED
@@ -91,6 +91,7 @@ Claude Code를 subprocess로 호출하기 때문에 프로젝트에 정의된 **
91
91
  | **사용량 추적** | 사용자별 토큰 소비량 및 비용을 일/주/월 단위로 집계 |
92
92
  | **영구 메모리** | `$memory`로 저장한 메모가 이후 모든 대화에 자동 주입 |
93
93
  | **자동 컨텍스트 압축** | 컨텍스트 창이 가득 차면 자동으로 압축 후 계속 |
94
+ | **Atlassian 연동** | Jira 이슈 관리 + Confluence 위키 검색/편집을 Slack에서 바로 사용 |
94
95
 
95
96
  ---
96
97
 
@@ -128,6 +129,9 @@ Claude Code를 subprocess로 호출하기 때문에 프로젝트에 정의된 **
128
129
  | `ALLOWED_SLACK_USERS` | ✅ | — | 허용 사용자 ID (쉼표 구분) |
129
130
  | `CLAUDE_MODEL` | — | CLI 기본값 | 모델 (`sonnet`, `opus`, `haiku` 또는 전체 ID) |
130
131
  | `AGENT_PERMISSION_MODE` | — | `bypassPermissions` | 권한 모드 |
132
+ | `JIRA_URL` | — | — | Atlassian Cloud URL (`https://your-domain.atlassian.net`) |
133
+ | `JIRA_USERNAME` | — | — | Atlassian 이메일 (Jira + Confluence 공용) |
134
+ | `JIRA_API_TOKEN` | — | — | Atlassian API 토큰 |
131
135
  | `AGENT_WORK_DIR` | — | 현재 디렉토리 | 기본 작업 디렉토리 |
132
136
  | `AGENT_PROJECTS` | — | `{}` | 프로젝트 맵 (JSON). 예: `{"api":"/home/user/api"}` |
133
137
  | `MAX_CONCURRENT_AGENTS` | — | `5` | 최대 동시 프로세스 수 |
@@ -1 +1 @@
1
- {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../src/cli/onboard.ts"],"names":[],"mappings":"AA6IA,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0Q/D"}
1
+ {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../src/cli/onboard.ts"],"names":[],"mappings":"AA8IA,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkV/D"}
@@ -4,6 +4,7 @@ import { resolve, dirname } from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
5
5
  import { askText, askSecret, askSelect, askConfirm, askEnter, closeRL } from './prompts.js';
6
6
  import { writeEnvFile } from './env.js';
7
+ import { saveAtlassianCredentials } from '../credentials/atlassian.js';
7
8
  const __dirname = dirname(fileURLToPath(import.meta.url));
8
9
  const MODEL_OPTIONS = [
9
10
  { label: '건너뛰기 (Claude Code 기본값 사용)', value: '', description: '사용자의 Claude Code 설정을 따라감' },
@@ -173,7 +174,7 @@ ${divider('═')}`);
173
174
  return;
174
175
  }
175
176
  }
176
- const totalSteps = 5;
177
+ const totalSteps = 6;
177
178
  // ──────────────────────────────────────────────────────────────────────────
178
179
  // Step 1: Slack 앱 생성
179
180
  // ──────────────────────────────────────────────────────────────────────────
@@ -305,6 +306,65 @@ ${divider('═')}`);
305
306
  Slack은 실시간 확인이 어렵기 때문입니다.
306
307
  `);
307
308
  const permissionMode = await askSelect('퍼미션 모드를 선택하세요:', PERMISSION_OPTIONS);
309
+ // ──────────────────────────────────────────────────────────────────────────
310
+ // Step 6: 플러그인 설정
311
+ // ──────────────────────────────────────────────────────────────────────────
312
+ stepHeader(6, totalSteps, '플러그인 설정', '외부 서비스 연동 플러그인을 선택합니다');
313
+ console.log(`
314
+ Choavis Agent는 플러그인으로 외부 서비스와 연동할 수 있습니다.
315
+ 지금 설정하지 않아도 나중에 추가할 수 있습니다.
316
+
317
+ [ 사용 가능한 플러그인 ]
318
+ `);
319
+ info(' 🔗 Atlassian 연동 (Jira + Confluence)');
320
+ info(' 하나의 Atlassian 계정으로 두 서비스를 모두 사용합니다.\n');
321
+ info(' 🎫 Jira — 이슈 검색, 조회, 생성, 상태 변경');
322
+ info(' Slack에서 "내 이슈 검색해줘", "이슈 만들어줘" 등으로 사용');
323
+ info(' 📝 Confluence — 위키 페이지 검색, 조회, 생성, 수정');
324
+ info(' Slack에서 "위키에서 검색해줘", "페이지 만들어줘" 등으로 사용\n');
325
+ const setupJira = await askConfirm('Atlassian 연동을 설정하시겠어요? (Jira + Confluence)', true);
326
+ let jiraUrl = '';
327
+ let jiraUsername = '';
328
+ let jiraApiToken = '';
329
+ if (setupJira) {
330
+ console.log(`
331
+ [ Atlassian 연동 설정 (Jira + Confluence) ]
332
+
333
+ 동일한 Atlassian 계정으로 Jira와 Confluence를 모두 사용합니다.
334
+ Atlassian API 토큰이 필요합니다.
335
+ 발급: https://id.atlassian.com/manage-profile/security/api-tokens
336
+
337
+ 1. 위 링크에서 "Create API token" 클릭
338
+ 2. 이름 입력 (예: choavis-agent) → "Create"
339
+ 3. 생성된 토큰을 복사
340
+ `);
341
+ jiraUrl = await askText('Atlassian Cloud URL (예: https://your-domain.atlassian.net)');
342
+ if (jiraUrl && !jiraUrl.startsWith('https://')) {
343
+ jiraUrl = `https://${jiraUrl}`;
344
+ }
345
+ jiraUrl = jiraUrl.replace(/\/$/, '');
346
+ jiraUsername = await askText('Atlassian 이메일 (로그인 계정)');
347
+ jiraApiToken = await askSecret('Atlassian API 토큰');
348
+ if (jiraUrl && jiraUsername && jiraApiToken) {
349
+ try {
350
+ await saveAtlassianCredentials({ jiraUrl, username: jiraUsername, apiToken: jiraApiToken });
351
+ ok('Atlassian 연동 설정 완료 (Jira + Confluence)');
352
+ hint('크리덴셜 저장 위치: ~/.config/choavis-agent/atlassian-credentials.json');
353
+ }
354
+ catch (e) {
355
+ warn(`Atlassian 설정 저장 실패: ${e instanceof Error ? e.message : String(e)}`);
356
+ hint('나중에 $jira setup 명령으로 다시 설정할 수 있습니다.');
357
+ }
358
+ }
359
+ else {
360
+ warn('Atlassian 설정 정보가 부족합니다. 건너뜁니다.');
361
+ hint('나중에 $jira setup 명령으로 설정할 수 있습니다.');
362
+ }
363
+ }
364
+ else {
365
+ info(' Atlassian 연동을 건너뜁니다.');
366
+ hint('나중에 Slack에서 $jira setup 명령으로 설정할 수 있습니다.');
367
+ }
308
368
  // ── 저장 ────────────────────────────────────────────────────────────────
309
369
  const envValues = {
310
370
  SLACK_BOT_TOKEN: botToken,
@@ -317,6 +377,11 @@ ${divider('═')}`);
317
377
  envValues.CLAUDE_MODEL = model;
318
378
  }
319
379
  envValues.AGENT_PERMISSION_MODE = permissionMode;
380
+ if (jiraUrl && jiraUsername && jiraApiToken) {
381
+ envValues.JIRA_URL = jiraUrl;
382
+ envValues.JIRA_USERNAME = jiraUsername;
383
+ envValues.JIRA_API_TOKEN = jiraApiToken;
384
+ }
320
385
  writeEnvFile(envPath, envValues);
321
386
  closeRL();
322
387
  // ── 완료 메시지 ────────────────────────────────────────────────────────
@@ -348,6 +413,8 @@ ${divider('═')}
348
413
 
349
414
  $help # 사용법 안내
350
415
  $status # 에이전트 상태 확인
416
+ $jira setup # Atlassian 연동 설정/변경
417
+ $jira status # Atlassian 연동 상태 확인
351
418
 
352
419
  [ 문서 ]
353
420
 
@@ -1 +1 @@
1
- {"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/cli/onboard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/cli/onboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,aAAa,GAAG;IACpB,EAAE,KAAK,EAAE,2BAA2B,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,0BAA0B,EAAE;IAC1F,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,oBAAoB,EAAE;IACzF,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,cAAc,EAAE;IACvF,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,oBAAoB,EAAE;IAC3F,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE;CACxE,CAAC;AAEF,MAAM,kBAAkB,GAAG;IACzB;QACE,KAAK,EAAE,mBAAmB;QAC1B,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,0BAA0B;KACxC;IACD;QACE,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,yBAAyB;KACvC;IACD;QACE,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,0BAA0B;KACxC;CACF,CAAC;AAEF,6EAA6E;AAE7E,SAAS,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,KAAK,GAAG,EAAE;IACrC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAa,EAAE,KAAa,EAAE,QAAiB;IAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;IAC7C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,EAAE,CAAC,GAAW;IACrB,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,UAAU,GAAG;QACjB,OAAO,CAAC,SAAS,EAAE,+BAA+B,CAAC;QACnD,OAAO,CAAC,SAAS,EAAE,kCAAkC,CAAC;KACvD,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,OAAO,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,uCAAuC,CAAC;AACjD,CAAC;AAED,4EAA4E;AAE5E,SAAS,kBAAkB;IACzB,gBAAgB;IAChB,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;IAE3B,mBAAmB;IACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED,4EAA4E;AAE5E,KAAK,UAAU,WAAW;IACxB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,6BAA6B,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACzC,IAAI,CAAC,+DAA+D,CAAC,CAAC;YACtE,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC,CAAC,WAAW;YACrC,SAAS;QACX,CAAC;QACD,EAAE,CAAC,iBAAiB,CAAC,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,6BAA6B,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACzC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YACzB,SAAS;QACX,CAAC;QACD,EAAE,CAAC,iBAAiB,CAAC,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,2EAA2E;AAE3E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,eAAe;IACf,OAAO,CAAC,GAAG,CAAC;EACZ,OAAO,CAAC,GAAG,CAAC;;EAEZ,OAAO,CAAC,GAAG,CAAC;;;;;;;;EAQZ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,mBAAmB;IACnB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAElD,IAAI,MAAM,EAAE,CAAC;QACX,EAAE,CAAC,WAAW,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,WAAW,OAAO,CAAC,QAAQ,CAAC,IAAI,0BAA0B,CAAC,CAAC;QACjE,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,EAAE,CAAC,uBAAuB,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACrC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACvD,IAAI,CAAC,8CAA8C,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;QACrF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,qCAAqC,CAAC,CAAC;YAC5C,IAAI,CAAC,8CAA8C,CAAC,CAAC;YACrD,IAAI,CAAC,6BAA6B,CAAC,CAAC;YACpC,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAClE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACvB,IAAI,CAAC,qCAAqC,CAAC,CAAC;YAC5C,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,CAAC;IAErB,6EAA6E;IAC7E,qBAAqB;IACrB,6EAA6E;IAC7E,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,8BAA8B,CAAC,CAAC;IAExE,IAAI,CAAC,+CAA+C,CAAC,CAAC;IACtD,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;IAE1E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC;;;;;;;;CAQf,CAAC,CAAC;QACC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC;;;CAGf,CAAC,CAAC;QACC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QACrD,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACxC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACvD,IAAI,CAAC,kEAAkE,CAAC,CAAC;QACzE,IAAI,CAAC,oEAAoE,CAAC,CAAC;QAC3E,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACjD,IAAI,CAAC,8CAA8C,CAAC,CAAC;QACrD,IAAI,CAAC,gEAAgE,CAAC,CAAC;QACvE,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAE1C,MAAM,QAAQ,CAAC,kCAAkC,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,qBAAqB;QACrB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAC3C,IAAI,CAAC,+CAA+C,CAAC,CAAC;QACtD,IAAI,CAAC,oEAAoE,CAAC,CAAC;QAC3E,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAC5D,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAChD,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACtC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAC5C,MAAM,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IACrC,CAAC;IAED,6EAA6E;IAC7E,mBAAmB;IACnB,6EAA6E;IAC7E,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,wBAAwB,EAAE,yBAAyB,CAAC,CAAC;IAE/E,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAEpD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACzC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,6CAA6C,CAAC,CAAC;QACpD,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAC5C,IAAI,CAAC,iFAAiF,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC5B,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACpD,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACjD,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAE1C,MAAM,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAEnC,6EAA6E;IAC7E,gBAAgB;IAChB,6EAA6E;IAC7E,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,2BAA2B,CAAC,CAAC;IAEtE,YAAY;IACZ,OAAO,CAAC,GAAG,CAAC;;;;CAIb,CAAC,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IAErC,YAAY;IACZ,OAAO,CAAC,GAAG,CAAC;;;;;;;;CAQb,CAAC,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IAErC,6EAA6E;IAC7E,gBAAgB;IAChB,6EAA6E;IAC7E,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,wBAAwB,CAAC,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;CAUb,CAAC,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,OAAO,CAChC,4CAA4C,EAC5C,EAAE,CACH,CAAC;IAEF,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC5B,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAChC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9E,EAAE,CAAC,UAAU,QAAQ,CAAC,MAAM,UAAU,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAC7E,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACnC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAE1C,IAAI,KAAK,GAAG,MAAM,SAAS,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;IAChE,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAC7E,KAAK,GAAG,MAAM,OAAO,CAAC,qCAAqC,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC;;;;;;CAMb,CAAC,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAE7E,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAC7E,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAE9D,OAAO,CAAC,GAAG,CAAC;;;;;CAKb,CAAC,CAAC;IACD,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAC9C,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACnD,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC5C,IAAI,CAAC,+CAA+C,CAAC,CAAC;IACtD,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACnD,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAEzD,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,4CAA4C,EAAE,IAAI,CAAC,CAAC;IAEvF,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,YAAY,GAAG,EAAE,CAAC;IAEtB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;CAUf,CAAC,CAAC;QAEC,OAAO,GAAG,MAAM,OAAO,CAAC,4DAA4D,CAAC,CAAC;QACtF,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/C,OAAO,GAAG,WAAW,OAAO,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAErC,YAAY,GAAG,MAAM,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACvD,YAAY,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAEnD,IAAI,OAAO,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,wBAAwB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;gBAC5F,EAAE,CAAC,wCAAwC,CAAC,CAAC;gBAC7C,IAAI,CAAC,gEAAgE,CAAC,CAAC;YACzE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,uBAAuB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1E,IAAI,CAAC,qCAAqC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gCAAgC,CAAC,CAAC;YACvC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC/B,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACnD,CAAC;IAED,yEAAyE;IAEzE,MAAM,SAAS,GAA2B;QACxC,eAAe,EAAE,QAAQ;QACzB,eAAe,EAAE,QAAQ;KAC1B,CAAC;IAEF,IAAI,YAAY,EAAE,CAAC;QACjB,SAAS,CAAC,mBAAmB,GAAG,YAAY,CAAC;IAC/C,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC;IACjC,CAAC;IAED,SAAS,CAAC,qBAAqB,GAAG,cAAc,CAAC;IAEjD,IAAI,OAAO,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;QAC5C,SAAS,CAAC,QAAQ,GAAG,OAAO,CAAC;QAC7B,SAAS,CAAC,aAAa,GAAG,YAAY,CAAC;QACvC,SAAS,CAAC,cAAc,GAAG,YAAY,CAAC;IAC1C,CAAC;IAED,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACjC,OAAO,EAAE,CAAC;IAEV,qEAAqE;IAErE,OAAO,CAAC,GAAG,CAAC;EACZ,OAAO,CAAC,GAAG,CAAC;;EAEZ,OAAO,CAAC,GAAG,CAAC;;WAEH,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BhB,OAAO,CAAC,GAAG,CAAC;CACb,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface AtlassianCredentials {
2
+ jiraUrl: string;
3
+ username: string;
4
+ apiToken: string;
5
+ createdAt?: string;
6
+ }
7
+ export declare function loadAtlassianCredentials(): Promise<AtlassianCredentials | null>;
8
+ export declare function saveAtlassianCredentials(creds: AtlassianCredentials): Promise<void>;
9
+ export declare function deleteAtlassianCredentials(): Promise<boolean>;
10
+ /**
11
+ * 크리덴셜을 로드하여 process.env에 주입.
12
+ * subprocess가 환경변수를 상속받아 MCP 서버에서 사용.
13
+ */
14
+ export declare function injectAtlassianEnv(): Promise<boolean>;
15
+ //# sourceMappingURL=atlassian.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atlassian.d.ts","sourceRoot":"","sources":["../../src/credentials/atlassian.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAqBrF;AAED,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzF;AAED,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,OAAO,CAAC,CAQnE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS3D"}
@@ -0,0 +1,65 @@
1
+ import { readFile, writeFile, mkdir, rm } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import { createLogger } from '../utils/logger.js';
6
+ const log = createLogger('credentials');
7
+ const CONFIG_DIR = join(homedir(), '.config', 'choavis-agent');
8
+ const CRED_FILE = join(CONFIG_DIR, 'atlassian-credentials.json');
9
+ const DEFAULT_JIRA_URL = 'https://musinsa-oneteam.atlassian.net';
10
+ export async function loadAtlassianCredentials() {
11
+ // 1. 환경변수 우선
12
+ if (process.env.JIRA_USERNAME && process.env.JIRA_API_TOKEN) {
13
+ return {
14
+ jiraUrl: process.env.JIRA_URL || DEFAULT_JIRA_URL,
15
+ username: process.env.JIRA_USERNAME,
16
+ apiToken: process.env.JIRA_API_TOKEN,
17
+ };
18
+ }
19
+ // 2. 파일에서 로드
20
+ if (!existsSync(CRED_FILE))
21
+ return null;
22
+ try {
23
+ const raw = await readFile(CRED_FILE, 'utf-8');
24
+ const data = JSON.parse(raw);
25
+ if (!data.jiraUrl || !data.username || !data.apiToken)
26
+ return null;
27
+ return data;
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ export async function saveAtlassianCredentials(creds) {
34
+ if (!existsSync(CONFIG_DIR)) {
35
+ await mkdir(CONFIG_DIR, { recursive: true });
36
+ }
37
+ const data = { ...creds, createdAt: creds.createdAt || new Date().toISOString() };
38
+ await writeFile(CRED_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });
39
+ log.info('Atlassian 크리덴셜 저장 완료', { url: creds.jiraUrl, user: creds.username });
40
+ }
41
+ export async function deleteAtlassianCredentials() {
42
+ if (!existsSync(CRED_FILE))
43
+ return false;
44
+ await rm(CRED_FILE);
45
+ delete process.env.JIRA_URL;
46
+ delete process.env.JIRA_USERNAME;
47
+ delete process.env.JIRA_API_TOKEN;
48
+ log.info('Atlassian 크리덴셜 삭제 완료');
49
+ return true;
50
+ }
51
+ /**
52
+ * 크리덴셜을 로드하여 process.env에 주입.
53
+ * subprocess가 환경변수를 상속받아 MCP 서버에서 사용.
54
+ */
55
+ export async function injectAtlassianEnv() {
56
+ const creds = await loadAtlassianCredentials();
57
+ if (!creds)
58
+ return false;
59
+ process.env.JIRA_URL = creds.jiraUrl;
60
+ process.env.JIRA_USERNAME = creds.username;
61
+ process.env.JIRA_API_TOKEN = creds.apiToken;
62
+ log.info('Atlassian 환경변수 주입 완료', { url: creds.jiraUrl });
63
+ return true;
64
+ }
65
+ //# sourceMappingURL=atlassian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atlassian.js","sourceRoot":"","sources":["../../src/credentials/atlassian.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AAExC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAC;AACjE,MAAM,gBAAgB,GAAG,uCAAuC,CAAC;AASjE,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,aAAa;IACb,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC5D,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,gBAAgB;YACjD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;YACnC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;SACrC,CAAC;IACJ,CAAC;IAED,aAAa;IACb,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,KAA2B;IACxE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAClF,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC9C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACjC,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAClC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,KAAK,GAAG,MAAM,wBAAwB,EAAE,CAAC;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC5C,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/dist/index.js CHANGED
@@ -2,11 +2,17 @@ import 'dotenv/config';
2
2
  import { createApp } from './slack/app.js';
3
3
  import { registerHandlers } from './slack/handlers.js';
4
4
  import { loadSessions, saveSessionsSync } from './agent/session.js';
5
+ import { injectAtlassianEnv } from './credentials/atlassian.js';
5
6
  import { createLogger } from './utils/logger.js';
6
7
  const log = createLogger('main');
7
8
  async function main() {
8
9
  // 세션 복원
9
10
  loadSessions();
11
+ // Atlassian 크리덴셜 환경변수 주입 (subprocess에서 MCP 서버가 사용)
12
+ const hasAtlassian = await injectAtlassianEnv();
13
+ if (hasAtlassian) {
14
+ log.info('Atlassian 연동 활성화됨');
15
+ }
10
16
  // Slack 앱 생성 및 핸들러 등록
11
17
  const app = createApp();
12
18
  registerHandlers(app);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAEjC,KAAK,UAAU,IAAI;IACjB,QAAQ;IACR,YAAY,EAAE,CAAC;IAEf,sBAAsB;IACtB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAEtB,OAAO;IACP,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAClB,GAAG,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAEjD,oBAAoB;IACpB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,CAAC;YACH,gBAAgB,EAAE,CAAC,CAAC,kCAAkC;QACxD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAEjC,KAAK,UAAU,IAAI;IACjB,QAAQ;IACR,YAAY,EAAE,CAAC;IAEf,mDAAmD;IACnD,MAAM,YAAY,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAChD,IAAI,YAAY,EAAE,CAAC;QACjB,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,CAAC;IAED,sBAAsB;IACtB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAEtB,OAAO;IACP,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAClB,GAAG,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAEjD,oBAAoB;IACpB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,CAAC;YACH,gBAAgB,EAAE,CAAC,CAAC,kCAAkC;QACxD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "choavis-agent",
3
- "version": "1.4.2",
3
+ "version": "1.5.1",
4
4
  "description": "Slack ↔ Claude Code bridge agent",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,6 +9,10 @@
9
9
  "files": [
10
10
  "dist/",
11
11
  "scripts/",
12
+ ".claude/skills/",
13
+ ".claude/lib/",
14
+ ".claude/settings.json",
15
+ "CLAUDE.md",
12
16
  "README.md",
13
17
  ".env.example",
14
18
  "slack-app-manifest.json"