runenv-cli 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 (50) hide show
  1. package/README.md +126 -0
  2. package/dist/commands/export.d.ts +3 -0
  3. package/dist/commands/export.d.ts.map +1 -0
  4. package/dist/commands/export.js +104 -0
  5. package/dist/commands/export.js.map +1 -0
  6. package/dist/commands/init.d.ts +3 -0
  7. package/dist/commands/init.d.ts.map +1 -0
  8. package/dist/commands/init.js +77 -0
  9. package/dist/commands/init.js.map +1 -0
  10. package/dist/commands/list.d.ts +3 -0
  11. package/dist/commands/list.d.ts.map +1 -0
  12. package/dist/commands/list.js +61 -0
  13. package/dist/commands/list.js.map +1 -0
  14. package/dist/commands/login.d.ts +3 -0
  15. package/dist/commands/login.d.ts.map +1 -0
  16. package/dist/commands/login.js +140 -0
  17. package/dist/commands/login.js.map +1 -0
  18. package/dist/commands/pull.d.ts +3 -0
  19. package/dist/commands/pull.d.ts.map +1 -0
  20. package/dist/commands/pull.js +112 -0
  21. package/dist/commands/pull.js.map +1 -0
  22. package/dist/commands/push.d.ts +3 -0
  23. package/dist/commands/push.d.ts.map +1 -0
  24. package/dist/commands/push.js +153 -0
  25. package/dist/commands/push.js.map +1 -0
  26. package/dist/commands/run.d.ts +3 -0
  27. package/dist/commands/run.d.ts.map +1 -0
  28. package/dist/commands/run.js +80 -0
  29. package/dist/commands/run.js.map +1 -0
  30. package/dist/commands/scan.d.ts +3 -0
  31. package/dist/commands/scan.d.ts.map +1 -0
  32. package/dist/commands/scan.js +149 -0
  33. package/dist/commands/scan.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +28 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/lib/api.d.ts +11 -0
  39. package/dist/lib/api.d.ts.map +1 -0
  40. package/dist/lib/api.js +42 -0
  41. package/dist/lib/api.js.map +1 -0
  42. package/dist/lib/config.d.ts +12 -0
  43. package/dist/lib/config.d.ts.map +1 -0
  44. package/dist/lib/config.js +101 -0
  45. package/dist/lib/config.js.map +1 -0
  46. package/dist/lib/project.d.ts +8 -0
  47. package/dist/lib/project.d.ts.map +1 -0
  48. package/dist/lib/project.js +87 -0
  49. package/dist/lib/project.js.map +1 -0
  50. package/package.json +43 -0
package/README.md ADDED
@@ -0,0 +1,126 @@
1
+ # Runenv CLI
2
+
3
+ > .env 파일 없이 CLI로 런타임에 환경변수를 안전하게 주입하세요.
4
+
5
+ ## 설치
6
+
7
+ ```bash
8
+ npm install -g runenv-cli
9
+ ```
10
+
11
+ ## 빠른 시작
12
+
13
+ ```bash
14
+ # 1. 로그인
15
+ runenv login
16
+
17
+ # 2. 시크릿 주입 후 명령 실행
18
+ runenv run -p my-project -e production -- npm start
19
+
20
+ # 3. .env 파일로 다운로드
21
+ runenv pull -p my-project -e development
22
+
23
+ # 4. .env 파일 업로드
24
+ runenv push -p my-project -e development -f .env
25
+ ```
26
+
27
+ ## 명령어
28
+
29
+ ### `runenv login`
30
+ Runenv 서버에 로그인합니다. 토큰은 `~/.runenv/config.json`에 안전하게 저장됩니다.
31
+
32
+ ```bash
33
+ runenv login # 대화형 로그인
34
+ runenv login -e user@company.com # 이메일 지정
35
+ runenv login -s https://runenv.company.com # 셀프 호스팅 서버
36
+ ```
37
+
38
+ ### `runenv logout`
39
+ 저장된 인증 토큰을 삭제합니다.
40
+
41
+ ### `runenv run`
42
+ Runenv에서 시크릿을 가져와 환경변수로 주입하고 명령어를 실행합니다. 프로세스 종료 시 환경변수가 자동으로 폐기됩니다 (Zero-Disk).
43
+
44
+ ```bash
45
+ runenv run -p my-project -e production -- npm start
46
+ runenv run -p my-project -e staging -- python manage.py runserver
47
+ runenv run -p my-project --override -- node server.js # 기존 환경변수 덮어쓰기
48
+ runenv run --token rtk_abc123... -p my-project -- npm start # 서비스 토큰 사용
49
+ ```
50
+
51
+ | 옵션 | 설명 | 기본값 |
52
+ |---|---|---|
53
+ | `-p, --project <name>` | 프로젝트 이름 (필수) | — |
54
+ | `-e, --env <name>` | 환경 이름 | `development` |
55
+ | `--override` | 기존 환경변수를 덮어씀 | — |
56
+ | `--no-resolve` | `${REF}` 참조 해석 비활성화 | — |
57
+ | `--token <token>` | 서비스 토큰 (CI/CD용) | — |
58
+
59
+ ### `runenv pull`
60
+ Runenv에서 시크릿을 다운로드하여 `.env` 파일로 저장합니다.
61
+
62
+ ```bash
63
+ runenv pull -p my-project -e development # .env에 저장
64
+ runenv pull -p my-project -e production -o .env.prod # 지정 경로
65
+ runenv pull -p my-project -y # 확인 없이 덮어쓰기
66
+ ```
67
+
68
+ ### `runenv push`
69
+ 로컬 `.env` 파일의 내용을 Runenv 서버에 업로드합니다.
70
+
71
+ ```bash
72
+ runenv push -p my-project -e development # .env 업로드
73
+ runenv push -p my-project -e staging -f .env.staging # 지정 파일
74
+ runenv push -p my-project -y # 확인 없이 업로드
75
+ ```
76
+
77
+ ### `runenv list`
78
+ 프로젝트의 시크릿 키 목록을 조회합니다.
79
+
80
+ ```bash
81
+ runenv list -p my-project -e production
82
+ runenv list -p my-project --show-values # 값도 표시
83
+ ```
84
+
85
+ ### `runenv export`
86
+ 시크릿을 다양한 형식으로 내보냅니다.
87
+
88
+ ```bash
89
+ runenv export -p my-project -e production -f dotenv # dotenv 형식 (stdout)
90
+ runenv export -p my-project -e production -f json # JSON 형식
91
+ runenv export -p my-project -e production -f shell # export KEY="value" 형식
92
+ runenv export -p my-project -e production -o .env.prod # 파일로 저장
93
+ ```
94
+
95
+ ## CI/CD 연동
96
+
97
+ 서비스 토큰을 사용하면 로그인 없이 CI/CD 파이프라인에서 사용할 수 있습니다.
98
+
99
+ ### GitHub Actions
100
+
101
+ ```yaml
102
+ jobs:
103
+ deploy:
104
+ runs-on: ubuntu-latest
105
+ steps:
106
+ - uses: actions/checkout@v4
107
+ - run: npm install -g runenv-cli
108
+ - run: runenv run --token ${{ secrets.RUNENV_TOKEN }} -p my-project -e production -- npm start
109
+ ```
110
+
111
+ ### Docker
112
+
113
+ ```dockerfile
114
+ RUN npm install -g runenv-cli
115
+ CMD ["runenv", "run", "--token", "$RUNENV_TOKEN", "-p", "my-project", "-e", "production", "--", "node", "server.js"]
116
+ ```
117
+
118
+ ## 환경 설정
119
+
120
+ | 파일 | 위치 | 설명 |
121
+ |---|---|---|
122
+ | `config.json` | `~/.runenv/config.json` | 서버 URL, 인증 토큰 저장 (0600 권한) |
123
+
124
+ ## 라이선스
125
+
126
+ MIT
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerExportCommand(program: Command): void;
3
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiF5D"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerExportCommand = registerExportCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const api_1 = require("../lib/api");
39
+ const config_1 = require("../lib/config");
40
+ const project_1 = require("../lib/project");
41
+ function registerExportCommand(program) {
42
+ program
43
+ .command("export")
44
+ .description("시크릿을 파일로 내보냅니다")
45
+ .option("-p, --project <name>", "프로젝트 이름 (기본값: .runenv.json)")
46
+ .option("-e, --env <name>", "환경 이름 (기본값: development 또는 .runenv.json)")
47
+ .option("-f, --format <format>", "출력 형식 (dotenv|shell|json)", "dotenv")
48
+ .option("-o, --output <file>", "출력 파일 경로 (없으면 stdout)")
49
+ .option("--token <token>", "서비스 토큰")
50
+ .action(async (options) => {
51
+ try {
52
+ const token = options.token || (0, config_1.getToken)();
53
+ if (!token) {
54
+ console.error("❌ 인증이 필요합니다. `runenv login`으로 먼저 로그인하세요.");
55
+ process.exit(1);
56
+ }
57
+ const projectConfig = (0, project_1.loadProjectConfig)();
58
+ const project = options.project || projectConfig.project;
59
+ const envName = options.env || projectConfig.env || "development";
60
+ if (!project) {
61
+ console.error("❌ 프로젝트 이름이 필요합니다.");
62
+ process.exit(1);
63
+ }
64
+ const data = await (0, api_1.apiRequest)(`/api/cli/secrets?project=${encodeURIComponent(project)}&env=${encodeURIComponent(envName)}&format=json`, { token });
65
+ let output = "";
66
+ switch (options.format) {
67
+ case "shell":
68
+ output = Object.entries(data.secrets)
69
+ .map(([key, value]) => `export ${key}="${value.replace(/"/g, '\\"')}"`)
70
+ .join("\n");
71
+ break;
72
+ case "json":
73
+ output = JSON.stringify(data.secrets, null, 2);
74
+ break;
75
+ default:
76
+ // dotenv
77
+ output = Object.entries(data.secrets)
78
+ .map(([key, value]) => {
79
+ const needsQuote = /[\s#"'\\$`!]/.test(value);
80
+ return needsQuote ? `${key}="${value}"` : `${key}=${value}`;
81
+ })
82
+ .join("\n");
83
+ break;
84
+ }
85
+ if (options.output) {
86
+ fs.writeFileSync(options.output, output + "\n", "utf-8");
87
+ console.error(`✅ ${data.count}개의 시크릿을 ${options.output}에 저장했습니다.`);
88
+ }
89
+ else {
90
+ process.stdout.write(output + "\n");
91
+ }
92
+ }
93
+ catch (err) {
94
+ if (err instanceof api_1.ApiError) {
95
+ console.error(`❌ ${err.message}`);
96
+ }
97
+ else {
98
+ console.error(`❌ 시크릿을 내보내는데 실패했습니다.`);
99
+ }
100
+ process.exit(1);
101
+ }
102
+ });
103
+ }
104
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerInitCommand(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0C1D"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerInitCommand = registerInitCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const project_1 = require("../lib/project");
40
+ function registerInitCommand(program) {
41
+ program
42
+ .command("init")
43
+ .description("현재 폴더에 .runenv.json 설정 파일을 생성합니다")
44
+ .requiredOption("-p, --project <name>", "기본 프로젝트 이름")
45
+ .option("-e, --env <name>", "기본 환경 이름", "development")
46
+ .action(async (options) => {
47
+ try {
48
+ const configPath = path.join(process.cwd(), ".runenv.json");
49
+ // 기존 파일 확인
50
+ if (fs.existsSync(configPath)) {
51
+ const readline = await Promise.resolve().then(() => __importStar(require("readline")));
52
+ const rl = readline.createInterface({
53
+ input: process.stdin,
54
+ output: process.stdout,
55
+ });
56
+ const answer = await new Promise((resolve) => {
57
+ rl.question(`\n⚠️ .runenv.json 파일이 이미 존재합니다. 덮어쓸까요? (y/N) `, resolve);
58
+ });
59
+ rl.close();
60
+ if (answer.toLowerCase() !== "y") {
61
+ console.log("❌ 취소되었습니다.");
62
+ process.exit(0);
63
+ }
64
+ }
65
+ (0, project_1.saveProjectConfig)({ project: options.project, env: options.env });
66
+ console.log(`\n✅ .runenv.json 파일이 생성되었습니다.`);
67
+ console.log(` 📂 프로젝트: ${options.project}`);
68
+ console.log(` 🌍 환 경: ${options.env}\n`);
69
+ console.log(`💡 이제 'runenv run -- npm start' 처럼 간단하게 실행할 수 있습니다.\n`);
70
+ }
71
+ catch (err) {
72
+ console.error(`❌ 초기화에 실패했습니다:`, err);
73
+ process.exit(1);
74
+ }
75
+ });
76
+ }
77
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,kDA0CC;AA9CD,uCAAyB;AACzB,2CAA6B;AAC7B,4CAAmD;AAEnD,SAAgB,mBAAmB,CAAC,OAAgB;IAChD,OAAO;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kCAAkC,CAAC;SAC/C,cAAc,CAAC,sBAAsB,EAAE,YAAY,CAAC;SACpD,MAAM,CAAC,kBAAkB,EAAE,UAAU,EAAE,aAAa,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;YAE5D,WAAW;YACX,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,wDAAa,UAAU,GAAC,CAAC;gBAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;oBAChC,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACzB,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;oBACjD,EAAE,CAAC,QAAQ,CACP,gDAAgD,EAChD,OAAO,CACV,CAAC;gBACN,CAAC,CAAC,CAAC;gBACH,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;oBAC/B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;oBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;YACL,CAAC;YAED,IAAA,2BAAiB,EAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAElE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QAEzE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerListCommand(program: Command): void;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmE1D"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerListCommand = registerListCommand;
4
+ const api_1 = require("../lib/api");
5
+ const config_1 = require("../lib/config");
6
+ const project_1 = require("../lib/project");
7
+ function registerListCommand(program) {
8
+ program
9
+ .command("list")
10
+ .description("시크릿 키 목록을 조회합니다")
11
+ .option("-p, --project <name>", "프로젝트 이름 (기본값: .runenv.json)")
12
+ .option("-e, --env <name>", "환경 이름 (기본값: development 또는 .runenv.json)")
13
+ .option("--show-values", "값도 함께 표시합니다")
14
+ .option("--token <token>", "서비스 토큰")
15
+ .action(async (options) => {
16
+ try {
17
+ const token = options.token || (0, config_1.getToken)();
18
+ if (!token) {
19
+ console.error("❌ 인증이 필요합니다. `runenv login`으로 먼저 로그인하세요.");
20
+ process.exit(1);
21
+ }
22
+ const projectConfig = (0, project_1.loadProjectConfig)();
23
+ const project = options.project || projectConfig.project;
24
+ const envName = options.env || projectConfig.env || "development";
25
+ if (!project) {
26
+ console.error("❌ 프로젝트 이름이 필요합니다.");
27
+ process.exit(1);
28
+ }
29
+ const data = await (0, api_1.apiRequest)(`/api/cli/secrets?project=${encodeURIComponent(project)}&env=${encodeURIComponent(envName)}&format=json`, { token });
30
+ console.log(`\n📦 ${data.project} / ${data.environment} (${data.count}개)\n`);
31
+ if (data.count === 0) {
32
+ console.log(" (시크릿이 없습니다)");
33
+ return;
34
+ }
35
+ // 키 길이 기준 정렬 및 패딩
36
+ const entries = Object.entries(data.secrets);
37
+ const maxKeyLen = Math.max(...entries.map(([k]) => k.length));
38
+ for (const [key, value] of entries) {
39
+ if (options.showValues) {
40
+ const paddedKey = key.padEnd(maxKeyLen);
41
+ const preview = value.length > 40 ? value.slice(0, 37) + "..." : value;
42
+ console.log(` ${paddedKey} = ${preview}`);
43
+ }
44
+ else {
45
+ console.log(` ${key}`);
46
+ }
47
+ }
48
+ console.log();
49
+ }
50
+ catch (err) {
51
+ if (err instanceof api_1.ApiError) {
52
+ console.error(`❌ ${err.message}`);
53
+ }
54
+ else {
55
+ console.error(`❌ 시크릿 목록을 가져오는데 실패했습니다.`);
56
+ }
57
+ process.exit(1);
58
+ }
59
+ });
60
+ }
61
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerLoginCommand(program: Command): void;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2DpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+D3D"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerLoginCommand = registerLoginCommand;
37
+ const readline = __importStar(require("readline"));
38
+ const api_1 = require("../lib/api");
39
+ const config_1 = require("../lib/config");
40
+ function prompt(question, hidden = false) {
41
+ return new Promise((resolve) => {
42
+ const rl = readline.createInterface({
43
+ input: process.stdin,
44
+ output: process.stdout,
45
+ });
46
+ if (hidden) {
47
+ // 비밀번호 입력 시 * 표시
48
+ process.stdout.write(question);
49
+ const stdin = process.stdin;
50
+ stdin.setRawMode?.(true);
51
+ stdin.resume();
52
+ let password = "";
53
+ const onData = (ch) => {
54
+ const c = ch.toString("utf-8");
55
+ if (c === "\n" || c === "\r" || c === "\u0004") {
56
+ stdin.setRawMode?.(false);
57
+ stdin.removeListener("data", onData);
58
+ rl.close();
59
+ process.stdout.write("\n");
60
+ resolve(password);
61
+ }
62
+ else if (c === "\u007F" || c === "\b") {
63
+ // Backspace
64
+ if (password.length > 0) {
65
+ password = password.slice(0, -1);
66
+ process.stdout.write("\b \b");
67
+ }
68
+ }
69
+ else if (c === "\u0003") {
70
+ // Ctrl+C
71
+ process.exit(0);
72
+ }
73
+ else {
74
+ password += c;
75
+ process.stdout.write("*");
76
+ }
77
+ };
78
+ stdin.on("data", onData);
79
+ }
80
+ else {
81
+ rl.question(question, (answer) => {
82
+ rl.close();
83
+ resolve(answer.trim());
84
+ });
85
+ }
86
+ });
87
+ }
88
+ function registerLoginCommand(program) {
89
+ program
90
+ .command("login")
91
+ .description("Runenv에 로그인합니다")
92
+ .option("-e, --email <email>", "이메일 주소")
93
+ .option("-s, --server <url>", "Runenv 서버 URL")
94
+ .action(async (options) => {
95
+ try {
96
+ // 서버 URL 설정
97
+ if (options.server) {
98
+ (0, config_1.saveConfig)({ apiUrl: options.server });
99
+ }
100
+ const apiUrl = (0, config_1.getApiUrl)();
101
+ console.log(`\n🔗 서버: ${apiUrl}\n`);
102
+ const email = options.email || (await prompt("📧 이메일: "));
103
+ const password = await prompt("🔑 비밀번호: ", true);
104
+ if (!email || !password) {
105
+ console.error("❌ 이메일과 비밀번호를 모두 입력하세요.");
106
+ process.exit(1);
107
+ }
108
+ process.stdout.write("\n⏳ 인증 중...");
109
+ const data = await (0, api_1.apiRequest)("/api/cli/auth", {
110
+ method: "POST",
111
+ body: { email, password },
112
+ });
113
+ // 토큰 + 만료 시간 저장
114
+ const expiresAt = new Date(Date.now() + data.expiresIn * 1000).toISOString();
115
+ (0, config_1.saveConfig)({ token: data.token, email: data.user.email, expiresAt });
116
+ console.log(`\r✅ 인증 성공! `);
117
+ console.log(` 👤 ${data.user.name} (${data.user.email})`);
118
+ console.log(` ⏰ 토큰 만료: ${new Date(expiresAt).toLocaleString("ko-KR")}`);
119
+ console.log(`\n💡 시작하기: runenv list --project <프로젝트명>\n`);
120
+ }
121
+ catch (err) {
122
+ if (err instanceof api_1.ApiError) {
123
+ console.error(`\r❌ 로그인 실패: ${err.message}`);
124
+ }
125
+ else {
126
+ console.error(`\r❌ 서버에 연결할 수 없습니다.`);
127
+ console.error(` 서버가 실행 중인지 확인하세요: ${(0, config_1.getApiUrl)()}`);
128
+ }
129
+ process.exit(1);
130
+ }
131
+ });
132
+ program
133
+ .command("logout")
134
+ .description("로그아웃합니다 (저장된 토큰 삭제)")
135
+ .action(() => {
136
+ (0, config_1.clearToken)();
137
+ console.log("✅ 로그아웃되었습니다. 저장된 토큰이 삭제되었습니다.");
138
+ });
139
+ }
140
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerPullCommand(program: Command): void;
3
+ //# sourceMappingURL=pull.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwF1D"}