argos-ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +15 -0
  2. package/dist/commands/default.d.ts +9 -0
  3. package/dist/commands/default.d.ts.map +1 -0
  4. package/dist/commands/default.js +241 -0
  5. package/dist/commands/default.js.map +1 -0
  6. package/dist/commands/hook.d.ts +7 -0
  7. package/dist/commands/hook.d.ts.map +1 -0
  8. package/dist/commands/hook.js +171 -0
  9. package/dist/commands/hook.js.map +1 -0
  10. package/dist/commands/logout.d.ts +5 -0
  11. package/dist/commands/logout.d.ts.map +1 -0
  12. package/dist/commands/logout.js +34 -0
  13. package/dist/commands/logout.js.map +1 -0
  14. package/dist/commands/status.d.ts +5 -0
  15. package/dist/commands/status.d.ts.map +1 -0
  16. package/dist/commands/status.js +51 -0
  17. package/dist/commands/status.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +42 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/lib/api-client.d.ts +9 -0
  23. package/dist/lib/api-client.d.ts.map +1 -0
  24. package/dist/lib/api-client.js +54 -0
  25. package/dist/lib/api-client.js.map +1 -0
  26. package/dist/lib/auth-flow.d.ts +12 -0
  27. package/dist/lib/auth-flow.d.ts.map +1 -0
  28. package/dist/lib/auth-flow.js +80 -0
  29. package/dist/lib/auth-flow.js.map +1 -0
  30. package/dist/lib/config.d.ts +12 -0
  31. package/dist/lib/config.d.ts.map +1 -0
  32. package/dist/lib/config.js +48 -0
  33. package/dist/lib/config.js.map +1 -0
  34. package/dist/lib/hooks-inject.d.ts +8 -0
  35. package/dist/lib/hooks-inject.d.ts.map +1 -0
  36. package/dist/lib/hooks-inject.js +50 -0
  37. package/dist/lib/hooks-inject.js.map +1 -0
  38. package/dist/lib/project.d.ts +21 -0
  39. package/dist/lib/project.d.ts.map +1 -0
  40. package/dist/lib/project.js +52 -0
  41. package/dist/lib/project.js.map +1 -0
  42. package/dist/lib/transcript.d.ts +41 -0
  43. package/dist/lib/transcript.d.ts.map +1 -0
  44. package/dist/lib/transcript.js +110 -0
  45. package/dist/lib/transcript.js.map +1 -0
  46. package/package.json +29 -0
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # argos-ai
2
+
3
+ Claude Code를 사용하는 팀의 AI 활동을 추적하는 CLI 도구.
4
+
5
+ ## 설치
6
+ ```bash
7
+ npm install -g argos-ai
8
+ ```
9
+
10
+ ## 사용법
11
+ ```bash
12
+ argos # 팀 프로젝트 설정
13
+ argos status # 현재 상태 확인
14
+ argos logout # 로그아웃
15
+ ```
@@ -0,0 +1,9 @@
1
+ interface DefaultCommandOptions {
2
+ apiUrl?: string;
3
+ }
4
+ /**
5
+ * Main command - detects context and runs appropriate flow
6
+ */
7
+ export declare function defaultCommand(options: DefaultCommandOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=default.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../src/commands/default.ts"],"names":[],"mappings":"AAWA,UAAU,qBAAqB;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAID;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAelF"}
@@ -0,0 +1,241 @@
1
+ import { join } from 'path';
2
+ import { input } from '@inquirer/prompts';
3
+ import chalk from 'chalk';
4
+ import ora from 'ora';
5
+ import { readConfig, writeConfig } from '../lib/config.js';
6
+ import { findProjectConfig, writeProjectConfig } from '../lib/project.js';
7
+ import { injectHooks } from '../lib/hooks-inject.js';
8
+ import { runLoginFlow } from '../lib/auth-flow.js';
9
+ import { apiRequest } from '../lib/api-client.js';
10
+ const DEFAULT_API_URL = 'https://api.argos.sh';
11
+ /**
12
+ * Main command - detects context and runs appropriate flow
13
+ */
14
+ export async function defaultCommand(options) {
15
+ const config = readConfig();
16
+ const project = findProjectConfig();
17
+ const apiUrl = options.apiUrl || DEFAULT_API_URL;
18
+ // 4-way branch based on config and project presence
19
+ if (!config && !project) {
20
+ await runFullSetup(apiUrl);
21
+ }
22
+ else if (!config && project) {
23
+ await runLoginAndJoin(project, apiUrl);
24
+ }
25
+ else if (config && !project) {
26
+ await runProjectInit(config, apiUrl);
27
+ }
28
+ else if (config && project) {
29
+ await ensureOrgMembershipAndShowStatus(config, project);
30
+ }
31
+ }
32
+ /**
33
+ * Flow 1: Full setup (login + create project + inject hooks)
34
+ */
35
+ async function runFullSetup(apiUrl) {
36
+ console.log(chalk.bold('Argos 초기 설정'));
37
+ console.log();
38
+ // Step 1: Login
39
+ console.log(chalk.dim('→ 로그인'));
40
+ let spinner = ora('로그인 중...').start();
41
+ let loginResponse;
42
+ try {
43
+ loginResponse = await runLoginFlow(apiUrl);
44
+ spinner.succeed(chalk.green(`✓ 로그인 완료 (${loginResponse.user.email})`));
45
+ }
46
+ catch (err) {
47
+ spinner.fail(chalk.red('✗ 로그인 실패'));
48
+ console.error(err instanceof Error ? err.message : String(err));
49
+ process.exit(1);
50
+ }
51
+ // Save config
52
+ writeConfig({
53
+ token: loginResponse.token,
54
+ apiUrl,
55
+ userId: loginResponse.user.id,
56
+ email: loginResponse.user.email,
57
+ });
58
+ // Step 2: Create project
59
+ console.log();
60
+ console.log(chalk.dim('→ 프로젝트 생성'));
61
+ const currentDirName = process.cwd().split('/').pop() || 'my-project';
62
+ const projectName = await input({
63
+ message: '프로젝트 이름을 입력하세요:',
64
+ default: currentDirName,
65
+ });
66
+ spinner = ora('프로젝트 생성 중...').start();
67
+ let projectResponse;
68
+ try {
69
+ projectResponse = await apiRequest(`${apiUrl}/api/projects`, {
70
+ method: 'POST',
71
+ body: JSON.stringify({ name: projectName }),
72
+ token: loginResponse.token,
73
+ baseUrl: '',
74
+ });
75
+ spinner.succeed(chalk.green(`✓ 프로젝트 생성: ${projectResponse.projectName}`));
76
+ console.log(chalk.dim(` 조직: ${projectResponse.orgName}`));
77
+ }
78
+ catch (err) {
79
+ spinner.fail(chalk.red('✗ 프로젝트 생성 실패'));
80
+ console.error(err instanceof Error ? err.message : String(err));
81
+ process.exit(1);
82
+ }
83
+ // Step 3: Write project config
84
+ writeProjectConfig({
85
+ projectId: projectResponse.projectId,
86
+ orgId: projectResponse.orgId,
87
+ orgName: projectResponse.orgName,
88
+ projectName: projectResponse.projectName,
89
+ apiUrl,
90
+ });
91
+ console.log(chalk.green('✓ .argos/project.json 작성'));
92
+ // Step 4: Inject hooks
93
+ const settingsPath = join(process.cwd(), '.claude', 'settings.json');
94
+ const hookResult = injectHooks(settingsPath);
95
+ if (hookResult === 'injected') {
96
+ console.log(chalk.green('✓ Claude Code hooks 설치 완료'));
97
+ }
98
+ else {
99
+ console.log(chalk.yellow('✓ Claude Code hooks 이미 설치됨'));
100
+ }
101
+ // Success message
102
+ console.log();
103
+ console.log(chalk.bold.green('✓ 설정 완료!'));
104
+ console.log();
105
+ console.log(chalk.dim('다음 단계:'));
106
+ console.log(' git add .argos/project.json .claude/settings.json');
107
+ console.log(' git commit -m "chore: add argos tracking"');
108
+ console.log();
109
+ console.log(chalk.dim('팀원들이 이 저장소를 clone한 뒤 argos를 실행하면 자동으로 팀에 합류됩니다.'));
110
+ }
111
+ /**
112
+ * Flow 2: Login and join existing org (project.json exists, but not logged in)
113
+ */
114
+ async function runLoginAndJoin(project, apiUrl) {
115
+ console.log(chalk.bold('Argos 로그인'));
116
+ console.log(chalk.dim(`프로젝트: ${project.projectName}`));
117
+ console.log();
118
+ let spinner = ora('로그인 중...').start();
119
+ let loginResponse;
120
+ try {
121
+ loginResponse = await runLoginFlow(project.apiUrl || apiUrl);
122
+ spinner.succeed(chalk.green(`✓ 로그인 완료 (${loginResponse.user.email})`));
123
+ }
124
+ catch (err) {
125
+ spinner.fail(chalk.red('✗ 로그인 실패'));
126
+ console.error(err instanceof Error ? err.message : String(err));
127
+ process.exit(1);
128
+ }
129
+ // Save config
130
+ writeConfig({
131
+ token: loginResponse.token,
132
+ apiUrl: project.apiUrl || apiUrl,
133
+ userId: loginResponse.user.id,
134
+ email: loginResponse.user.email,
135
+ });
136
+ // Join org
137
+ spinner = ora('조직 합류 중...').start();
138
+ try {
139
+ await apiRequest(`${project.apiUrl || apiUrl}/api/orgs/${project.orgId}/members`, {
140
+ method: 'POST',
141
+ token: loginResponse.token,
142
+ baseUrl: '',
143
+ });
144
+ spinner.succeed(chalk.green(`✓ 조직 합류: ${project.orgName}`));
145
+ }
146
+ catch (err) {
147
+ spinner.fail(chalk.red('✗ 조직 합류 실패'));
148
+ console.error(err instanceof Error ? err.message : String(err));
149
+ process.exit(1);
150
+ }
151
+ console.log();
152
+ console.log(chalk.bold.green('✓ 설정 완료!'));
153
+ console.log();
154
+ console.log('트래킹이 활성화되었습니다. Claude Code를 사용하면 자동으로 기록됩니다.');
155
+ }
156
+ /**
157
+ * Flow 3: Create project (already logged in, but no project.json)
158
+ */
159
+ async function runProjectInit(config, apiUrl) {
160
+ console.log(chalk.green(`✓ 로그인됨: ${config.email}`));
161
+ console.log(chalk.dim('→ 이 디렉토리는 아직 Argos 프로젝트가 아닙니다.'));
162
+ console.log();
163
+ const currentDirName = process.cwd().split('/').pop() || 'my-project';
164
+ const projectName = await input({
165
+ message: '프로젝트 이름을 입력하세요:',
166
+ default: currentDirName,
167
+ });
168
+ const spinner = ora('프로젝트 생성 중...').start();
169
+ let projectResponse;
170
+ try {
171
+ projectResponse = await apiRequest(`${config.apiUrl || apiUrl}/api/projects`, {
172
+ method: 'POST',
173
+ body: JSON.stringify({ name: projectName }),
174
+ token: config.token,
175
+ baseUrl: '',
176
+ });
177
+ spinner.succeed(chalk.green(`✓ 프로젝트 생성: ${projectResponse.projectName}`));
178
+ console.log(chalk.dim(` 조직: ${projectResponse.orgName}`));
179
+ }
180
+ catch (err) {
181
+ spinner.fail(chalk.red('✗ 프로젝트 생성 실패'));
182
+ console.error(err instanceof Error ? err.message : String(err));
183
+ process.exit(1);
184
+ }
185
+ // Write project config
186
+ writeProjectConfig({
187
+ projectId: projectResponse.projectId,
188
+ orgId: projectResponse.orgId,
189
+ orgName: projectResponse.orgName,
190
+ projectName: projectResponse.projectName,
191
+ apiUrl: config.apiUrl || apiUrl,
192
+ });
193
+ console.log(chalk.green('✓ .argos/project.json 작성'));
194
+ // Inject hooks
195
+ const settingsPath = join(process.cwd(), '.claude', 'settings.json');
196
+ const hookResult = injectHooks(settingsPath);
197
+ if (hookResult === 'injected') {
198
+ console.log(chalk.green('✓ Claude Code hooks 설치 완료'));
199
+ }
200
+ else {
201
+ console.log(chalk.yellow('✓ Claude Code hooks 이미 설치됨'));
202
+ }
203
+ console.log();
204
+ console.log(chalk.bold.green('✓ 설정 완료!'));
205
+ }
206
+ /**
207
+ * Flow 4: Everything is set up - just verify membership and show status
208
+ */
209
+ async function ensureOrgMembershipAndShowStatus(config, project) {
210
+ // Check if user is already a member
211
+ const spinner = ora('멤버십 확인 중...').start();
212
+ try {
213
+ await apiRequest(`${project.apiUrl || config.apiUrl}/api/orgs/${project.orgId}/members`, {
214
+ method: 'POST',
215
+ token: config.token,
216
+ baseUrl: '',
217
+ });
218
+ spinner.stop();
219
+ }
220
+ catch (err) {
221
+ spinner.stop();
222
+ // Ignore error - user might already be a member
223
+ }
224
+ // Show status
225
+ console.log(chalk.bold.green('✓ 모두 준비되어 있습니다.'));
226
+ console.log();
227
+ console.log(chalk.dim('사용자: ') + config.email);
228
+ console.log(chalk.dim('프로젝트:') + ` ${project.projectName} (${project.projectId})`);
229
+ console.log(chalk.dim('조직: ') + project.orgName);
230
+ console.log(chalk.dim('API: ') + (project.apiUrl || config.apiUrl));
231
+ // Check hooks
232
+ const settingsPath = join(process.cwd(), '.claude', 'settings.json');
233
+ const hookResult = injectHooks(settingsPath);
234
+ if (hookResult === 'injected') {
235
+ console.log(chalk.dim('Hooks: ') + chalk.green('✓ .claude/settings.json에 설치됨'));
236
+ }
237
+ else {
238
+ console.log(chalk.dim('Hooks: ') + chalk.green('✓ .claude/settings.json에 설치됨'));
239
+ }
240
+ }
241
+ //# sourceMappingURL=default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.js","sourceRoot":"","sources":["../../src/commands/default.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Hook command handler
3
+ * This is called by Claude Code hooks via stdin
4
+ * MUST always exit with code 0
5
+ */
6
+ export declare function hookCommand(): Promise<void>;
7
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAoIA;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAsEjD"}
@@ -0,0 +1,171 @@
1
+ import { homedir } from 'os';
2
+ import { appendFileSync, existsSync, mkdirSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { readConfig } from '../lib/config.js';
5
+ import { findProjectConfig } from '../lib/project.js';
6
+ import { extractUsageFromTranscript, detectSlashCommand, extractMessages } from '../lib/transcript.js';
7
+ /**
8
+ * Read stdin with timeout
9
+ * Returns null if stdin is TTY (user running manually) or if timeout expires
10
+ */
11
+ async function readStdinWithTimeout(timeoutMs) {
12
+ // If stdin is a TTY, return immediately (user ran command manually)
13
+ if (process.stdin.isTTY) {
14
+ return null;
15
+ }
16
+ return new Promise((resolve) => {
17
+ let data = '';
18
+ let timeoutId = null;
19
+ let completed = false;
20
+ const complete = (result) => {
21
+ if (completed)
22
+ return;
23
+ completed = true;
24
+ if (timeoutId)
25
+ clearTimeout(timeoutId);
26
+ process.stdin.removeAllListeners();
27
+ resolve(result);
28
+ };
29
+ timeoutId = setTimeout(() => complete(null), timeoutMs);
30
+ process.stdin.setEncoding('utf8');
31
+ process.stdin.on('data', (chunk) => {
32
+ data += chunk;
33
+ });
34
+ process.stdin.on('end', () => {
35
+ complete(data || null);
36
+ });
37
+ process.stdin.on('error', () => {
38
+ complete(null);
39
+ });
40
+ });
41
+ }
42
+ /**
43
+ * Debug log - only writes if ARGOS_DEBUG=1
44
+ */
45
+ function debugLog(message) {
46
+ if (process.env.ARGOS_DEBUG !== '1')
47
+ return;
48
+ try {
49
+ const argosDir = join(homedir(), '.argos');
50
+ if (!existsSync(argosDir)) {
51
+ mkdirSync(argosDir, { recursive: true });
52
+ }
53
+ const logPath = join(argosDir, 'hook-debug.log');
54
+ const timestamp = new Date().toISOString();
55
+ const logMessage = `[${timestamp}] ${JSON.stringify(message, null, 2)}\n`;
56
+ appendFileSync(logPath, logMessage, 'utf8');
57
+ }
58
+ catch {
59
+ // Ignore logging errors
60
+ }
61
+ }
62
+ /**
63
+ * Convert snake_case hook_event_name to SCREAMING_SNAKE_CASE EventType
64
+ */
65
+ function convertEventType(hookEventName) {
66
+ // SessionStart -> SESSION_START
67
+ // PreToolUse -> PRE_TOOL_USE
68
+ // PostToolUse -> POST_TOOL_USE
69
+ // Stop -> STOP
70
+ // SubagentStop -> SUBAGENT_STOP
71
+ return hookEventName.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase();
72
+ }
73
+ /**
74
+ * Build IngestEventPayload from hook stdin data
75
+ */
76
+ function buildPayload(event, project, config) {
77
+ const payload = {
78
+ projectId: project.projectId,
79
+ sessionId: event.session_id || '',
80
+ hookEventName: convertEventType(event.hook_event_name || ''),
81
+ };
82
+ // Add optional fields
83
+ if (event.tool_name) {
84
+ payload.toolName = event.tool_name;
85
+ }
86
+ if (event.tool_input) {
87
+ payload.toolInput = event.tool_input;
88
+ }
89
+ if (event.tool_response) {
90
+ // Truncate to 2000 characters
91
+ payload.toolResponse = event.tool_response.slice(0, 2000);
92
+ }
93
+ if (event.exit_code !== undefined) {
94
+ payload.exitCode = event.exit_code;
95
+ }
96
+ if (event.agent_id) {
97
+ payload.agentId = event.agent_id;
98
+ }
99
+ return payload;
100
+ }
101
+ /**
102
+ * Hook command handler
103
+ * This is called by Claude Code hooks via stdin
104
+ * MUST always exit with code 0
105
+ */
106
+ export async function hookCommand() {
107
+ try {
108
+ // Read stdin with 100ms timeout
109
+ const raw = await readStdinWithTimeout(100);
110
+ if (!raw) {
111
+ process.exit(0);
112
+ return;
113
+ }
114
+ // Parse hook event
115
+ const event = JSON.parse(raw);
116
+ // Find project config
117
+ const project = findProjectConfig(process.cwd());
118
+ if (!project) {
119
+ process.exit(0);
120
+ return;
121
+ }
122
+ // Read user config
123
+ const config = readConfig();
124
+ if (!config) {
125
+ process.exit(0);
126
+ return;
127
+ }
128
+ // Build base payload
129
+ const payload = buildPayload(event, project, config);
130
+ // SessionStart: detect slash command
131
+ if (event.hook_event_name === 'SessionStart' && event.transcript_path) {
132
+ const slashSkill = await detectSlashCommand(event.transcript_path);
133
+ if (slashSkill) {
134
+ payload.isSlashCommand = true;
135
+ }
136
+ }
137
+ // Stop/SubagentStop: extract usage and messages from transcript
138
+ if (event.hook_event_name === 'Stop' || event.hook_event_name === 'SubagentStop') {
139
+ const transcriptPath = event.transcript_path || event.agent_transcript_path;
140
+ if (transcriptPath) {
141
+ const usage = await extractUsageFromTranscript(transcriptPath);
142
+ if (usage) {
143
+ payload.usage = usage;
144
+ }
145
+ const messages = await extractMessages(transcriptPath);
146
+ if (messages.length > 0) {
147
+ payload.messages = messages;
148
+ }
149
+ }
150
+ }
151
+ // Send to API with 3 second hard timeout
152
+ const apiUrl = project.apiUrl || config.apiUrl;
153
+ await fetch(`${apiUrl}/api/events`, {
154
+ method: 'POST',
155
+ headers: {
156
+ 'Content-Type': 'application/json',
157
+ Authorization: `Bearer ${config.token}`,
158
+ },
159
+ body: JSON.stringify(payload),
160
+ signal: AbortSignal.timeout(3000),
161
+ });
162
+ }
163
+ catch (err) {
164
+ debugLog(err);
165
+ }
166
+ finally {
167
+ // ALWAYS exit with 0 - never block Claude Code
168
+ process.exit(0);
169
+ }
170
+ }
171
+ //# sourceMappingURL=hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAetG;;;GAGG;AACH,KAAK,UAAU,oBAAoB,CAAC,SAAiB;IACnD,oEAAoE;IACpE,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,IAAI,SAAS,GAA0B,IAAI,CAAA;QAC3C,IAAI,SAAS,GAAG,KAAK,CAAA;QAErB,MAAM,QAAQ,GAAG,CAAC,MAAqB,EAAE,EAAE;YACzC,IAAI,SAAS;gBAAE,OAAM;YACrB,SAAS,GAAG,IAAI,CAAA;YAChB,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAA;YACtC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAA;YAClC,OAAO,CAAC,MAAM,CAAC,CAAA;QACjB,CAAC,CAAA;QAED,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAA;QAEvD,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QACjC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,IAAI,IAAI,KAAK,CAAA;QACf,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAC3B,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC7B,QAAQ,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,OAAgB;IAChC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG;QAAE,OAAM;IAE3C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAA;QAC1C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1C,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;QAChD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAC1C,MAAM,UAAU,GAAG,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;QACzE,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,aAAqB;IAC7C,gCAAgC;IAChC,6BAA6B;IAC7B,+BAA+B;IAC/B,eAAe;IACf,gCAAgC;IAChC,OAAO,aAAa,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;AACxE,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CACnB,KAAuB,EACvB,OAA8C,EAC9C,MAA0B;IAE1B,MAAM,OAAO,GAAuB;QAClC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;QACjC,aAAa,EAAE,gBAAgB,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,CAAQ;KACpE,CAAA;IAED,sBAAsB;IACtB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAA;IACpC,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAA;IACtC,CAAC;IAED,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QACxB,8BAA8B;QAC9B,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC3D,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAA;IACpC,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAA;IAClC,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,gCAAgC;QAChC,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAA;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACf,OAAM;QACR,CAAC;QAED,mBAAmB;QACnB,MAAM,KAAK,GAAqB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAE/C,sBAAsB;QACtB,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACf,OAAM;QACR,CAAC;QAED,mBAAmB;QACnB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACf,OAAM;QACR,CAAC;QAED,qBAAqB;QACrB,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QAEpD,qCAAqC;QACrC,IAAI,KAAK,CAAC,eAAe,KAAK,cAAc,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YACtE,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;YAClE,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,cAAc,GAAG,IAAI,CAAA;YAC/B,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,IAAI,KAAK,CAAC,eAAe,KAAK,MAAM,IAAI,KAAK,CAAC,eAAe,KAAK,cAAc,EAAE,CAAC;YACjF,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,qBAAqB,CAAA;YAC3E,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,MAAM,0BAA0B,CAAC,cAAc,CAAC,CAAA;gBAC9D,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;gBACvB,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,CAAA;gBACtD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAA;QAC9C,MAAM,KAAK,CAAC,GAAG,MAAM,aAAa,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;aACxC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,GAAG,CAAC,CAAA;IACf,CAAC;YAAS,CAAC;QACT,+CAA+C;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Logout command - revoke token and delete local config
3
+ */
4
+ export declare function logoutCommand(): Promise<void>;
5
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BnD"}
@@ -0,0 +1,34 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { readConfig, deleteConfig } from '../lib/config.js';
4
+ import { apiRequest } from '../lib/api-client.js';
5
+ /**
6
+ * Logout command - revoke token and delete local config
7
+ */
8
+ export async function logoutCommand() {
9
+ const config = readConfig();
10
+ if (!config) {
11
+ console.log(chalk.yellow('⚠ 로그인 상태가 아닙니다.'));
12
+ return;
13
+ }
14
+ const spinner = ora('로그아웃 중...').start();
15
+ try {
16
+ // Try to revoke token on server
17
+ await apiRequest(`${config.apiUrl}/api/auth/logout`, {
18
+ method: 'POST',
19
+ token: config.token,
20
+ baseUrl: '',
21
+ });
22
+ }
23
+ catch (err) {
24
+ // Ignore API errors - still delete local config
25
+ spinner.warn(chalk.yellow('서버에서 토큰을 취소하는데 실패했지만 로컬 설정은 삭제됩니다.'));
26
+ }
27
+ // Delete local config
28
+ deleteConfig();
29
+ spinner.succeed(chalk.green('✓ 로그아웃 완료'));
30
+ console.log();
31
+ console.log('로컬 인증 정보가 삭제되었습니다.');
32
+ console.log(chalk.dim('다시 로그인하려면 argos를 실행하세요.'));
33
+ }
34
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAE3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAC5C,OAAM;IACR,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAA;IAExC,IAAI,CAAC;QACH,gCAAgC;QAChC,MAAM,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,kBAAkB,EAAE;YACnD,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,EAAE;SACZ,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gDAAgD;QAChD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAA;IAClE,CAAC;IAED,sBAAsB;IACtB,YAAY,EAAE,CAAA;IACd,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAA;IAEzC,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAA;AACnD,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Status command - show current configuration
3
+ */
4
+ export declare function statusCommand(): Promise<void>;
5
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA4CnD"}
@@ -0,0 +1,51 @@
1
+ import { join } from 'path';
2
+ import { existsSync } from 'fs';
3
+ import chalk from 'chalk';
4
+ import { readConfig } from '../lib/config.js';
5
+ import { findProjectConfig } from '../lib/project.js';
6
+ /**
7
+ * Status command - show current configuration
8
+ */
9
+ export async function statusCommand() {
10
+ const config = readConfig();
11
+ const project = findProjectConfig();
12
+ console.log(chalk.bold('Argos 상태'));
13
+ console.log();
14
+ // Login status
15
+ if (config) {
16
+ console.log(chalk.green('✓ 로그인됨'));
17
+ console.log(chalk.dim(' 이메일: ') + config.email);
18
+ console.log(chalk.dim(' 사용자: ') + config.userId);
19
+ console.log(chalk.dim(' API URL: ') + config.apiUrl);
20
+ }
21
+ else {
22
+ console.log(chalk.red('✗ 로그인 안 됨'));
23
+ console.log(chalk.dim(' argos를 실행하여 로그인하세요.'));
24
+ }
25
+ console.log();
26
+ // Project status
27
+ if (project) {
28
+ console.log(chalk.green('✓ 프로젝트 설정됨'));
29
+ console.log(chalk.dim(' 프로젝트: ') + project.projectName);
30
+ console.log(chalk.dim(' 조직: ') + project.orgName);
31
+ console.log(chalk.dim(' ID: ') + project.projectId);
32
+ console.log(chalk.dim(' API URL: ') + project.apiUrl);
33
+ }
34
+ else {
35
+ console.log(chalk.red('✗ 프로젝트 없음'));
36
+ console.log(chalk.dim(' 이 디렉토리는 Argos 프로젝트가 아닙니다.'));
37
+ console.log(chalk.dim(' argos를 실행하여 프로젝트를 생성하세요.'));
38
+ }
39
+ console.log();
40
+ // Hooks status
41
+ const settingsPath = join(process.cwd(), '.claude', 'settings.json');
42
+ if (existsSync(settingsPath)) {
43
+ console.log(chalk.green('✓ Claude Code hooks 설정 파일 존재'));
44
+ console.log(chalk.dim(' 경로: ') + settingsPath);
45
+ }
46
+ else {
47
+ console.log(chalk.yellow('⚠ Claude Code hooks 설정 파일 없음'));
48
+ console.log(chalk.dim(' argos를 실행하여 hooks를 설치하세요.'));
49
+ }
50
+ }
51
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { readFileSync } from 'fs';
4
+ import { join, dirname } from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import { defaultCommand } from './commands/default.js';
7
+ import { hookCommand } from './commands/hook.js';
8
+ import { statusCommand } from './commands/status.js';
9
+ import { logoutCommand } from './commands/logout.js';
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ // Read package.json for version
13
+ const pkgPath = join(__dirname, '..', 'package.json');
14
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
15
+ const program = new Command()
16
+ .name('argos')
17
+ .description('Claude Code observability for AI-native teams')
18
+ .version(pkg.version)
19
+ .option('--api-url <url>', 'API URL override (for self-hosting)');
20
+ // Default command (argos without subcommand)
21
+ program.action(defaultCommand);
22
+ // Hook command (internal - called by Claude Code)
23
+ program
24
+ .command('hook')
25
+ .description('[internal] process hook event from stdin')
26
+ .action(hookCommand);
27
+ // Status command
28
+ program
29
+ .command('status')
30
+ .description('show current setup status')
31
+ .action(statusCommand);
32
+ // Logout command
33
+ program
34
+ .command('logout')
35
+ .description('log out and remove local credentials')
36
+ .action(logoutCommand);
37
+ // Parse and execute
38
+ program.parseAsync(process.argv).catch((err) => {
39
+ console.error('Error:', err.message);
40
+ process.exit(1);
41
+ });
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,gCAAgC;AAChC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAA;AACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,+CAA+C,CAAC;KAC5D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC,CAAA;AAEnE,6CAA6C;AAC7C,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;AAE9B,kDAAkD;AAClD,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,WAAW,CAAC,CAAA;AAEtB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}