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.
- package/.claude/lib/confluence-api.cjs +153 -0
- package/.claude/lib/credentials.cjs +56 -0
- package/.claude/lib/http-client.cjs +61 -0
- package/.claude/lib/jira-api.cjs +167 -0
- package/.claude/settings.json +11 -0
- package/.claude/skills/autopilot/SKILL.md +167 -0
- package/.claude/skills/confluence/SKILL.md +112 -0
- package/.claude/skills/jira/SKILL.md +97 -0
- package/.env.example +7 -0
- package/CLAUDE.md +40 -0
- package/README.md +4 -0
- package/dist/cli/onboard.d.ts.map +1 -1
- package/dist/cli/onboard.js +68 -1
- package/dist/cli/onboard.js.map +1 -1
- package/dist/credentials/atlassian.d.ts +15 -0
- package/dist/credentials/atlassian.d.ts.map +1 -0
- package/dist/credentials/atlassian.js +65 -0
- package/dist/credentials/atlassian.js.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
|
@@ -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,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":"
|
|
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"}
|
package/dist/cli/onboard.js
CHANGED
|
@@ -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 =
|
|
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
|
|
package/dist/cli/onboard.js.map
CHANGED
|
@@ -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":"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"}
|
|
@@ -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":"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"}
|
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.
|
|
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"
|