@bolta-io/cli 0.0.15 → 0.0.17
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/CHANGELOG.md +25 -0
- package/CLAUDE.md +5 -1
- package/README.md +2 -0
- package/dist/bin/bolta.js +18 -30
- package/dist/bin/bolta.js.map +1 -1
- package/dist/src/client/bolta-client.d.ts +3 -0
- package/dist/src/client/bolta-client.d.ts.map +1 -1
- package/dist/src/client/bolta-client.js +24 -6
- package/dist/src/client/bolta-client.js.map +1 -1
- package/dist/src/commands/config/index.d.ts.map +1 -1
- package/dist/src/commands/config/index.js +73 -33
- package/dist/src/commands/config/index.js.map +1 -1
- package/dist/src/commands/invoice/amend.d.ts.map +1 -1
- package/dist/src/commands/invoice/amend.js +5 -18
- package/dist/src/commands/invoice/amend.js.map +1 -1
- package/dist/src/commands/invoice/issue-request.d.ts.map +1 -1
- package/dist/src/commands/invoice/issue-request.js +3 -8
- package/dist/src/commands/invoice/issue-request.js.map +1 -1
- package/dist/src/commands/invoice/issue.d.ts.map +1 -1
- package/dist/src/commands/invoice/issue.js +3 -8
- package/dist/src/commands/invoice/issue.js.map +1 -1
- package/dist/src/commands/update/nudge.d.ts +12 -0
- package/dist/src/commands/update/nudge.d.ts.map +1 -0
- package/dist/src/commands/update/nudge.js +104 -0
- package/dist/src/commands/update/nudge.js.map +1 -0
- package/dist/src/commands/update/updater.d.ts.map +1 -1
- package/dist/src/commands/update/updater.js +15 -28
- package/dist/src/commands/update/updater.js.map +1 -1
- package/dist/src/config/config-manager.d.ts +13 -0
- package/dist/src/config/config-manager.d.ts.map +1 -1
- package/dist/src/config/config-manager.js +57 -21
- package/dist/src/config/config-manager.js.map +1 -1
- package/dist/src/config/update-check-cache.d.ts +12 -0
- package/dist/src/config/update-check-cache.d.ts.map +1 -0
- package/dist/src/config/update-check-cache.js +45 -0
- package/dist/src/config/update-check-cache.js.map +1 -0
- package/dist/src/types/api.d.ts +2 -2
- package/dist/src/types/api.d.ts.map +1 -1
- package/dist/src/utils/client.d.ts +17 -0
- package/dist/src/utils/client.d.ts.map +1 -0
- package/dist/src/utils/client.js +17 -0
- package/dist/src/utils/client.js.map +1 -0
- package/dist/src/utils/output.d.ts +10 -2
- package/dist/src/utils/output.d.ts.map +1 -1
- package/dist/src/utils/output.js +17 -3
- package/dist/src/utils/output.js.map +1 -1
- package/dist/src/utils/platform.d.ts +1 -0
- package/dist/src/utils/platform.d.ts.map +1 -1
- package/dist/src/utils/platform.js +36 -9
- package/dist/src/utils/platform.js.map +1 -1
- package/dist/src/utils/version.d.ts +3 -0
- package/dist/src/utils/version.d.ts.map +1 -1
- package/dist/src/utils/version.js +24 -0
- package/dist/src/utils/version.js.map +1 -1
- package/dist/src/validators/schemas.d.ts.map +1 -1
- package/dist/src/validators/schemas.js +60 -45
- package/dist/src/validators/schemas.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-request.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/issue-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"issue-request.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/issue-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,gBAAgB,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACpD,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
|
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BoltaClient } from '../../client/bolta-client.js';
|
|
1
|
+
import { createClient } from '../../utils/client.js';
|
|
3
2
|
import { resolveInput } from '../../utils/input.js';
|
|
4
3
|
import { outputSuccess, outputError, verbose } from '../../utils/output.js';
|
|
5
4
|
import { createTaxInvoiceIssueRequestSchema } from '../../validators/schemas.js';
|
|
6
|
-
import { BoltaValidationError
|
|
5
|
+
import { BoltaValidationError } from '../../utils/errors.js';
|
|
7
6
|
import { ZodError } from 'zod';
|
|
8
7
|
export async function issueRequestAction(options, command) {
|
|
9
8
|
try {
|
|
10
9
|
const globalOpts = command.optsWithGlobals();
|
|
11
|
-
const apiKey = resolveApiKey(globalOpts.apiKey);
|
|
12
|
-
if (!apiKey)
|
|
13
|
-
throw new BoltaAuthError('API 키가 설정되지 않았습니다.');
|
|
14
|
-
const supplierKey = resolveSupplierKey(globalOpts.supplierKey, globalOpts.customerKey);
|
|
15
|
-
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl(), supplierKey });
|
|
16
10
|
const raw = await resolveInput(options);
|
|
17
11
|
let validated;
|
|
18
12
|
try {
|
|
@@ -30,6 +24,7 @@ export async function issueRequestAction(options, command) {
|
|
|
30
24
|
return;
|
|
31
25
|
}
|
|
32
26
|
verbose('세금계산서 역발행 요청');
|
|
27
|
+
const { client, supplierKey } = createClient(globalOpts);
|
|
33
28
|
const result = await client.issueRequestTaxInvoice(validated, {
|
|
34
29
|
supplierKey,
|
|
35
30
|
referenceId: options.referenceId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-request.js","sourceRoot":"","sources":["../../../../src/commands/invoice/issue-request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"issue-request.js","sourceRoot":"","sources":["../../../../src/commands/invoice/issue-request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,kCAAkC,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAG/B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAoD,EACpD,OAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAExC,IAAI,SAAS,CAAC;QACd,IAAI,CAAC;YACH,SAAS,GAAG,kCAAkC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzF,MAAM,IAAI,oBAAoB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtB,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,mCAAmC,EAAE,CAAC,CAAC;YACvG,OAAO;QACT,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,CAAC;QACxB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,SAAS,EAAE;YAC5D,WAAW;YACX,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QACH,aAAa,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACpD,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
|
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BoltaClient } from '../../client/bolta-client.js';
|
|
1
|
+
import { createClient } from '../../utils/client.js';
|
|
3
2
|
import { resolveInput } from '../../utils/input.js';
|
|
4
3
|
import { outputSuccess, outputError, verbose } from '../../utils/output.js';
|
|
5
4
|
import { createTaxInvoiceSchema } from '../../validators/schemas.js';
|
|
6
|
-
import { BoltaValidationError
|
|
5
|
+
import { BoltaValidationError } from '../../utils/errors.js';
|
|
7
6
|
import { ZodError } from 'zod';
|
|
8
7
|
export async function issueAction(options, command) {
|
|
9
8
|
try {
|
|
10
9
|
const globalOpts = command.optsWithGlobals();
|
|
11
|
-
const apiKey = resolveApiKey(globalOpts.apiKey);
|
|
12
|
-
if (!apiKey)
|
|
13
|
-
throw new BoltaAuthError('API 키가 설정되지 않았습니다.');
|
|
14
|
-
const supplierKey = resolveSupplierKey(globalOpts.supplierKey, globalOpts.customerKey);
|
|
15
|
-
const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl(), supplierKey });
|
|
16
10
|
const raw = await resolveInput(options);
|
|
17
11
|
let validated;
|
|
18
12
|
try {
|
|
@@ -30,6 +24,7 @@ export async function issueAction(options, command) {
|
|
|
30
24
|
return;
|
|
31
25
|
}
|
|
32
26
|
verbose('세금계산서 정발행 요청');
|
|
27
|
+
const { client, supplierKey } = createClient(globalOpts);
|
|
33
28
|
const result = await client.issueTaxInvoice(validated, {
|
|
34
29
|
supplierKey,
|
|
35
30
|
referenceId: options.referenceId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue.js","sourceRoot":"","sources":["../../../../src/commands/invoice/issue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"issue.js","sourceRoot":"","sources":["../../../../src/commands/invoice/issue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAG/B,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAoD,EACpD,OAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAExC,IAAI,SAAS,CAAC;QACd,IAAI,CAAC;YACH,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzF,MAAM,IAAI,oBAAoB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtB,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,EAAE,CAAC,CAAC;YAChG,OAAO;QACT,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,CAAC;QACxB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE;YACrD,WAAW;YACX,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QACH,aAAa,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BoltaConfig } from '../../types/api.js';
|
|
2
|
+
import { type InstallMethod } from '../../utils/platform.js';
|
|
3
|
+
/** 백그라운드 캐시 갱신용 숨김 커맨드 이름 */
|
|
4
|
+
export declare const UPDATE_CACHE_COMMAND = "__update-cache";
|
|
5
|
+
export declare function isUpdateCheckDisabled(config: BoltaConfig): boolean;
|
|
6
|
+
export declare function maybeNudgeUpdate(config: BoltaConfig): void;
|
|
7
|
+
export declare function resolveSelfInvocation(installMethod: InstallMethod, execPath?: string, scriptPath?: string): {
|
|
8
|
+
command: string;
|
|
9
|
+
args: string[];
|
|
10
|
+
} | undefined;
|
|
11
|
+
export declare function refreshUpdateCache(): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=nudge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nudge.d.ts","sourceRoot":"","sources":["../../../../src/commands/update/nudge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMtD,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAC;AAKjC,6BAA6B;AAC7B,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAIrD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAElE;AAaD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAiB1D;AAMD,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,aAAa,EAC5B,QAAQ,GAAE,MAAyB,EACnC,UAAU,GAAE,MAA8B,GACzC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAajD;AAkCD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAexD"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { realpathSync } from 'node:fs';
|
|
3
|
+
import { loadUpdateCheckCache, saveUpdateCheckCache, } from '../../config/update-check-cache.js';
|
|
4
|
+
import { detectInstallMethod, getUpdateCommand, } from '../../utils/platform.js';
|
|
5
|
+
import { getCurrentVersion, fetchNudgeVersion, isUpdateAvailable } from '../../utils/version.js';
|
|
6
|
+
const ONE_DAY_MS = 24 * 60 * 60 * 1000;
|
|
7
|
+
/** 백그라운드 캐시 갱신용 숨김 커맨드 이름 */
|
|
8
|
+
export const UPDATE_CACHE_COMMAND = '__update-cache';
|
|
9
|
+
// 넛지 비활성화 여부: env, config, CI 셋 중 하나라도 켜지면 비활성화.
|
|
10
|
+
// config 읽기 비용을 피하도록 env 체크를 먼저 수행한다.
|
|
11
|
+
export function isUpdateCheckDisabled(config) {
|
|
12
|
+
return Boolean(process.env.BOLTA_NO_UPDATE_CHECK || process.env.CI || config.updateCheck === false);
|
|
13
|
+
}
|
|
14
|
+
// 설치 방식이 바뀌었으면(재설치) 캐시된 버전은 다른 소스 기준이므로 신뢰하지 않음
|
|
15
|
+
function trustedVersion(cache, installMethod) {
|
|
16
|
+
return cache?.installMethod === installMethod ? cache.latestVersion : undefined;
|
|
17
|
+
}
|
|
18
|
+
// preAction에서 호출. 캐시 파일만 읽어 넛지를 출력하고(네트워크 없음),
|
|
19
|
+
// 캐시가 오래됐으면 detached 자식으로 갱신을 위임해 프로세스 종료를 지연시키지 않는다.
|
|
20
|
+
// 새 버전 배너는 캐시가 갱신된 다음 실행부터 표시된다 (codex CLI와 동일한 모델).
|
|
21
|
+
export function maybeNudgeUpdate(config) {
|
|
22
|
+
if (isUpdateCheckDisabled(config))
|
|
23
|
+
return;
|
|
24
|
+
const cache = loadUpdateCheckCache();
|
|
25
|
+
const installMethod = detectInstallMethod();
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
const latestVersion = trustedVersion(cache, installMethod);
|
|
28
|
+
if (latestVersion && isUpdateAvailable(getCurrentVersion(), latestVersion)) {
|
|
29
|
+
printUpdateNotice(latestVersion, installMethod);
|
|
30
|
+
}
|
|
31
|
+
if (!cache || cache.installMethod !== installMethod || now - cache.lastCheckedAt >= ONE_DAY_MS) {
|
|
32
|
+
// spawn 전에 시도 시각을 기록: 자식이 죽거나 오프라인이어도 24시간 내 재시도 없음
|
|
33
|
+
const saved = saveUpdateCheckCache({ latestVersion, lastCheckedAt: now, installMethod });
|
|
34
|
+
if (saved)
|
|
35
|
+
spawnBackgroundRefresh(installMethod);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// 자기 자신을 detached로 재실행할 커맨드. 이미 감지된 설치 방식으로 분기:
|
|
39
|
+
// - sea/homebrew: execPath 자체가 bolta 바이너리
|
|
40
|
+
// - npm: node + 전역 bin의 JS 스크립트 (tsx 개발 모드는 .ts라서 제외됨)
|
|
41
|
+
// - unknown: 백그라운드 갱신 생략
|
|
42
|
+
export function resolveSelfInvocation(installMethod, execPath = process.execPath, scriptPath = process.argv[1] || '') {
|
|
43
|
+
if (installMethod === 'sea' || installMethod === 'homebrew') {
|
|
44
|
+
return { command: execPath, args: [] };
|
|
45
|
+
}
|
|
46
|
+
if (installMethod === 'npm') {
|
|
47
|
+
const runnableScriptPath = resolveRunnableNpmScriptPath(scriptPath);
|
|
48
|
+
if (runnableScriptPath) {
|
|
49
|
+
return { command: execPath, args: [runnableScriptPath] };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
function resolveRunnableNpmScriptPath(scriptPath) {
|
|
55
|
+
if (isJavaScriptPath(scriptPath))
|
|
56
|
+
return scriptPath;
|
|
57
|
+
try {
|
|
58
|
+
const realPath = realpathSync(scriptPath);
|
|
59
|
+
return isJavaScriptPath(realPath) ? realPath : undefined;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function isJavaScriptPath(scriptPath) {
|
|
66
|
+
return /\.(c|m)?js$/i.test(scriptPath);
|
|
67
|
+
}
|
|
68
|
+
function spawnBackgroundRefresh(installMethod) {
|
|
69
|
+
const self = resolveSelfInvocation(installMethod);
|
|
70
|
+
if (!self)
|
|
71
|
+
return;
|
|
72
|
+
try {
|
|
73
|
+
spawn(self.command, [...self.args, UPDATE_CACHE_COMMAND], {
|
|
74
|
+
detached: true,
|
|
75
|
+
stdio: 'ignore',
|
|
76
|
+
windowsHide: true,
|
|
77
|
+
}).unref();
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// spawn 실패는 무시 (다음 24시간 주기에 재시도)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// 숨김 커맨드(__update-cache)의 액션. 성공/실패 모두 lastCheckedAt을 갱신하고,
|
|
84
|
+
// 실패 시에는 기존에 알던 버전을 보존한다.
|
|
85
|
+
export async function refreshUpdateCache() {
|
|
86
|
+
const installMethod = detectInstallMethod();
|
|
87
|
+
const cache = {
|
|
88
|
+
lastCheckedAt: Date.now(),
|
|
89
|
+
latestVersion: trustedVersion(loadUpdateCheckCache(), installMethod),
|
|
90
|
+
installMethod,
|
|
91
|
+
};
|
|
92
|
+
try {
|
|
93
|
+
cache.latestVersion = await fetchNudgeVersion(installMethod);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// 네트워크 실패: 시도 시각만 기록
|
|
97
|
+
}
|
|
98
|
+
saveUpdateCheckCache(cache);
|
|
99
|
+
}
|
|
100
|
+
function printUpdateNotice(version, installMethod) {
|
|
101
|
+
const updateCommand = getUpdateCommand(installMethod);
|
|
102
|
+
console.error(`\n[bolta] 새 버전 v${version}이 있습니다. '${updateCommand}'로 업데이트하세요.\n`);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=nudge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nudge.js","sourceRoot":"","sources":["../../../../src/commands/update/nudge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../../../src/commands/update/updater.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../../../src/commands/update/updater.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAmBxD;AAED,wBAAsB,aAAa,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAyFjF"}
|
|
@@ -6,49 +6,36 @@ import { execSync } from 'node:child_process';
|
|
|
6
6
|
import { pipeline } from 'node:stream/promises';
|
|
7
7
|
import { createWriteStream } from 'node:fs';
|
|
8
8
|
import { Readable } from 'node:stream';
|
|
9
|
-
import { detectInstallMethod, detectPlatform } from '../../utils/platform.js';
|
|
10
|
-
import { fetchLatestVersion, getCurrentVersion, isUpdateAvailable, } from '../../utils/version.js';
|
|
9
|
+
import { detectInstallMethod, detectPlatform, getUpdateCommand } from '../../utils/platform.js';
|
|
10
|
+
import { fetchLatestVersion, fetchNudgeVersion, getCurrentVersion, isUpdateAvailable, } from '../../utils/version.js';
|
|
11
|
+
import { saveUpdateCheckCache } from '../../config/update-check-cache.js';
|
|
11
12
|
import { BoltaUpdateError } from '../../utils/errors.js';
|
|
12
13
|
import { verbose } from '../../utils/output.js';
|
|
13
14
|
export async function checkUpdate() {
|
|
14
15
|
const currentVersion = getCurrentVersion();
|
|
15
16
|
const installMethod = detectInstallMethod();
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
updateCommand = 'brew upgrade bolta';
|
|
22
|
-
break;
|
|
23
|
-
case 'npm':
|
|
24
|
-
updateCommand = 'npm update -g @bolta-io/cli';
|
|
25
|
-
break;
|
|
26
|
-
case 'sea':
|
|
27
|
-
updateCommand = 'bolta update';
|
|
28
|
-
break;
|
|
29
|
-
default:
|
|
30
|
-
updateCommand = 'npm update -g @bolta-io/cli 또는 brew upgrade bolta';
|
|
31
|
-
break;
|
|
32
|
-
}
|
|
17
|
+
// 넛지와 같은 소스 사용: homebrew는 formula 버전 기준 (조기 안내 방지)
|
|
18
|
+
const latestVersion = await fetchNudgeVersion(installMethod);
|
|
19
|
+
// 명시적 확인 결과를 넛지 캐시에도 반영해 두 경로가 같은 버전을 말하게 함
|
|
20
|
+
saveUpdateCheckCache({ lastCheckedAt: Date.now(), latestVersion, installMethod });
|
|
21
|
+
const updateAvailable = isUpdateAvailable(currentVersion, latestVersion);
|
|
33
22
|
return {
|
|
34
23
|
currentVersion,
|
|
35
|
-
latestVersion
|
|
24
|
+
latestVersion,
|
|
36
25
|
updateAvailable,
|
|
37
26
|
installMethod,
|
|
38
|
-
updateCommand,
|
|
39
|
-
changelog:
|
|
27
|
+
updateCommand: getUpdateCommand(installMethod),
|
|
28
|
+
changelog: `https://github.com/bolta-io/bolta-cli/releases/tag/v${latestVersion}`,
|
|
40
29
|
};
|
|
41
30
|
}
|
|
42
31
|
export async function performUpdate(force = false) {
|
|
43
32
|
const installMethod = detectInstallMethod();
|
|
44
33
|
// SEA 바이너리만 자체 업데이트 허용 (허용리스트 방식)
|
|
45
34
|
if (installMethod !== 'sea') {
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
};
|
|
51
|
-
throw new BoltaUpdateError(`${installMethod} 환경에서는 직접 업데이트할 수 없습니다.`, suggestions[installMethod] || suggestions.unknown);
|
|
35
|
+
const suggestion = installMethod === 'unknown'
|
|
36
|
+
? '설치 방식을 감지할 수 없습니다. npm이나 Homebrew로 재설치하세요.'
|
|
37
|
+
: `'${getUpdateCommand(installMethod)}' 명령을 사용하세요.`;
|
|
38
|
+
throw new BoltaUpdateError(`${installMethod} 환경에서는 직접 업데이트할 수 없습니다.`, suggestion);
|
|
52
39
|
}
|
|
53
40
|
const currentVersion = getCurrentVersion();
|
|
54
41
|
const latest = await fetchLatestVersion();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../../../src/commands/update/updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,MAAM,EACN,UAAU,GAEX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAY,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../../../src/commands/update/updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
import type { BoltaConfig } from '../types/api.js';
|
|
2
|
+
export declare const CONFIG_DIR: string;
|
|
2
3
|
export declare function loadConfig(): BoltaConfig;
|
|
3
4
|
export declare function saveConfig(config: BoltaConfig): void;
|
|
5
|
+
export type SupplierKeySource = 'flag' | 'legacy-flag' | 'env' | 'config' | 'legacy-env' | 'legacy-config' | 'none';
|
|
6
|
+
export interface ResolvedSupplierKey {
|
|
7
|
+
value?: string;
|
|
8
|
+
source: SupplierKeySource;
|
|
9
|
+
}
|
|
4
10
|
export declare function resolveApiKey(cliFlag?: string): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* supplierKey를 우선순위대로 해석하고, 어느 소스에서 왔는지 함께 반환한다.
|
|
13
|
+
* 모든 값은 앞뒤 공백/개행을 제거한다(헤더 오염 방지).
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveSupplierKeyWithSource(cliFlag?: string, legacyCliFlag?: string): ResolvedSupplierKey;
|
|
5
16
|
export declare function resolveSupplierKey(cliFlag?: string, legacyCliFlag?: string): string | undefined;
|
|
17
|
+
/** 상세 소스를 사용자 노출용 라벨(flag/env/config/none)로 축약한다. */
|
|
18
|
+
export declare function supplierKeySourceLabel(source: SupplierKeySource): 'flag' | 'env' | 'config' | 'none';
|
|
6
19
|
export declare function resolveBaseUrl(): string;
|
|
7
20
|
export declare function maskApiKey(key: string): string;
|
|
8
21
|
//# sourceMappingURL=config-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,eAAO,MAAM,UAAU,QAA4B,CAAC;AAGpD,wBAAgB,UAAU,IAAI,WAAW,CAOxC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAGpD;AAED,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,aAAa,GACb,KAAK,GACL,QAAQ,GACR,YAAY,GACZ,eAAe,GACf,MAAM,CAAC;AAEX,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AASD,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,CAAC,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,mBAAmB,CAgCrB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE/F;AAED,qDAAqD;AACrD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,iBAAiB,GACxB,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAcpC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
|
-
import { deprecationWarning } from '../utils/output.js';
|
|
5
|
-
const CONFIG_DIR = join(homedir(), '.bolta');
|
|
4
|
+
import { deprecationWarning, maskSecret } from '../utils/output.js';
|
|
5
|
+
export const CONFIG_DIR = join(homedir(), '.bolta');
|
|
6
6
|
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
7
7
|
export function loadConfig() {
|
|
8
8
|
try {
|
|
@@ -17,38 +17,74 @@ export function saveConfig(config) {
|
|
|
17
17
|
mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
18
18
|
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
19
19
|
}
|
|
20
|
+
/** 값의 앞뒤 공백/개행을 제거하고, 빈 값이면 undefined로 정규화한다. */
|
|
21
|
+
function normalize(value) {
|
|
22
|
+
if (typeof value !== 'string')
|
|
23
|
+
return undefined;
|
|
24
|
+
const trimmed = value.trim();
|
|
25
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
26
|
+
}
|
|
20
27
|
export function resolveApiKey(cliFlag) {
|
|
21
|
-
return cliFlag || process.env.BOLTA_API_KEY || loadConfig().apiKey;
|
|
28
|
+
return normalize(cliFlag) || normalize(process.env.BOLTA_API_KEY) || normalize(loadConfig().apiKey);
|
|
22
29
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
/**
|
|
31
|
+
* supplierKey를 우선순위대로 해석하고, 어느 소스에서 왔는지 함께 반환한다.
|
|
32
|
+
* 모든 값은 앞뒤 공백/개행을 제거한다(헤더 오염 방지).
|
|
33
|
+
*/
|
|
34
|
+
export function resolveSupplierKeyWithSource(cliFlag, legacyCliFlag) {
|
|
35
|
+
const flag = normalize(cliFlag);
|
|
36
|
+
if (flag)
|
|
37
|
+
return { value: flag, source: 'flag' };
|
|
38
|
+
const legacyFlag = normalize(legacyCliFlag);
|
|
39
|
+
if (legacyFlag) {
|
|
27
40
|
deprecationWarning("'--customer-key' 플래그는 '--supplier-key'로 변경되었습니다.");
|
|
28
|
-
return
|
|
41
|
+
return { value: legacyFlag, source: 'legacy-flag' };
|
|
29
42
|
}
|
|
30
43
|
const config = loadConfig();
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
44
|
+
const envKey = normalize(process.env.BOLTA_SUPPLIER_KEY);
|
|
45
|
+
if (envKey)
|
|
46
|
+
return { value: envKey, source: 'env' };
|
|
47
|
+
const configKey = normalize(config.supplierKey);
|
|
48
|
+
if (configKey)
|
|
49
|
+
return { value: configKey, source: 'config' };
|
|
35
50
|
// 하위호환 폴백: 구 환경변수 / config 필드
|
|
36
|
-
|
|
51
|
+
const legacyEnv = normalize(process.env.BOLTA_CUSTOMER_KEY);
|
|
52
|
+
if (legacyEnv) {
|
|
37
53
|
deprecationWarning("'BOLTA_CUSTOMER_KEY' 환경변수는 'BOLTA_SUPPLIER_KEY'로 변경되었습니다.");
|
|
38
|
-
return
|
|
54
|
+
return { value: legacyEnv, source: 'legacy-env' };
|
|
39
55
|
}
|
|
40
|
-
|
|
56
|
+
const legacyConfig = normalize(config.customerKey);
|
|
57
|
+
if (legacyConfig) {
|
|
41
58
|
deprecationWarning("config의 'customer-key'는 'supplier-key'로 변경되었습니다. 'bolta config set supplier-key <값>'으로 갱신하세요.");
|
|
42
|
-
return config
|
|
59
|
+
return { value: legacyConfig, source: 'legacy-config' };
|
|
60
|
+
}
|
|
61
|
+
return { source: 'none' };
|
|
62
|
+
}
|
|
63
|
+
export function resolveSupplierKey(cliFlag, legacyCliFlag) {
|
|
64
|
+
return resolveSupplierKeyWithSource(cliFlag, legacyCliFlag).value;
|
|
65
|
+
}
|
|
66
|
+
/** 상세 소스를 사용자 노출용 라벨(flag/env/config/none)로 축약한다. */
|
|
67
|
+
export function supplierKeySourceLabel(source) {
|
|
68
|
+
switch (source) {
|
|
69
|
+
case 'flag':
|
|
70
|
+
case 'legacy-flag':
|
|
71
|
+
return 'flag';
|
|
72
|
+
case 'env':
|
|
73
|
+
case 'legacy-env':
|
|
74
|
+
return 'env';
|
|
75
|
+
case 'config':
|
|
76
|
+
case 'legacy-config':
|
|
77
|
+
return 'config';
|
|
78
|
+
default:
|
|
79
|
+
return 'none';
|
|
43
80
|
}
|
|
44
|
-
return undefined;
|
|
45
81
|
}
|
|
46
82
|
export function resolveBaseUrl() {
|
|
47
|
-
return process.env.BOLTA_API_BASE_URL
|
|
83
|
+
return (normalize(process.env.BOLTA_API_BASE_URL) ||
|
|
84
|
+
normalize(loadConfig().baseUrl) ||
|
|
85
|
+
'https://xapi.bolta.io/v1');
|
|
48
86
|
}
|
|
49
87
|
export function maskApiKey(key) {
|
|
50
|
-
|
|
51
|
-
return '***';
|
|
52
|
-
return key.slice(0, 5) + '***' + key.slice(-3);
|
|
88
|
+
return maskSecret(key, 5, 3);
|
|
53
89
|
}
|
|
54
90
|
//# sourceMappingURL=config-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAa,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAa,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEpE,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AACpD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAmB;IAC5C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/E,CAAC;AAgBD,iDAAiD;AACjD,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC;AACtG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAgB,EAChB,aAAsB;IAEtB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjD,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,UAAU,EAAE,CAAC;QACf,kBAAkB,CAAC,kDAAkD,CAAC,CAAC;QACvE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACzD,IAAI,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAEpD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAE7D,8BAA8B;IAC9B,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC5D,IAAI,SAAS,EAAE,CAAC;QACd,kBAAkB,CAAC,2DAA2D,CAAC,CAAC;QAChF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACnD,IAAI,YAAY,EAAE,CAAC;QACjB,kBAAkB,CAAC,+FAA+F,CAAC,CAAC;QACpH,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1D,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAgB,EAAE,aAAsB;IACzE,OAAO,4BAA4B,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC;AACpE,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,sBAAsB,CACpC,MAAyB;IAEzB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,aAAa;YAChB,OAAO,MAAM,CAAC;QAChB,KAAK,KAAK,CAAC;QACX,KAAK,YAAY;YACf,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ,CAAC;QACd,KAAK,eAAe;YAClB,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CACL,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACzC,SAAS,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC;QAC/B,0BAA0B,CAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { InstallMethod } from '../utils/platform.js';
|
|
2
|
+
export interface UpdateCheckCache {
|
|
3
|
+
/** 마지막 확인 "시도" 시각(ms). 실패해도 기록해 오프라인 재시도 폭주 방지 */
|
|
4
|
+
lastCheckedAt: number;
|
|
5
|
+
/** 확인된 넛지 대상 버전 */
|
|
6
|
+
latestVersion?: string;
|
|
7
|
+
/** 어떤 설치 방식 기준으로 확인했는지 (재설치 감지용) */
|
|
8
|
+
installMethod?: InstallMethod;
|
|
9
|
+
}
|
|
10
|
+
export declare function loadUpdateCheckCache(): UpdateCheckCache | undefined;
|
|
11
|
+
export declare function saveUpdateCheckCache(cache: UpdateCheckCache): boolean;
|
|
12
|
+
//# sourceMappingURL=update-check-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check-cache.d.ts","sourceRoot":"","sources":["../../../src/config/update-check-cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAO1D,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,wBAAgB,oBAAoB,IAAI,gBAAgB,GAAG,SAAS,CASnE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAuBrE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, renameSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { CONFIG_DIR } from './config-manager.js';
|
|
4
|
+
// 업데이트 확인 상태 캐시 (~/.bolta/update-check.json)
|
|
5
|
+
// config.json과 분리: 백그라운드 자식 프로세스와 메인 프로세스의 쓰기 경합 방지
|
|
6
|
+
const CACHE_FILE = join(CONFIG_DIR, 'update-check.json');
|
|
7
|
+
export function loadUpdateCheckCache() {
|
|
8
|
+
try {
|
|
9
|
+
const raw = readFileSync(CACHE_FILE, 'utf-8');
|
|
10
|
+
const parsed = JSON.parse(raw);
|
|
11
|
+
if (typeof parsed.lastCheckedAt !== 'number')
|
|
12
|
+
return undefined;
|
|
13
|
+
return parsed;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function saveUpdateCheckCache(cache) {
|
|
20
|
+
try {
|
|
21
|
+
mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const json = JSON.stringify(cache, null, 2);
|
|
27
|
+
const tmpFile = `${CACHE_FILE}.${process.pid}.${Date.now()}.tmp`;
|
|
28
|
+
try {
|
|
29
|
+
// tmp 쓰기 + rename으로 원자적 교체 (동시 실행 시 last-write-wins)
|
|
30
|
+
writeFileSync(tmpFile, json, { mode: 0o600 });
|
|
31
|
+
renameSync(tmpFile, CACHE_FILE);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Windows AV 잠금 등으로 rename 실패 시 직접 쓰기 폴백
|
|
36
|
+
try {
|
|
37
|
+
writeFileSync(CACHE_FILE, json, { mode: 0o600 });
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=update-check-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check-cache.js","sourceRoot":"","sources":["../../../src/config/update-check-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,6CAA6C;AAC7C,oDAAoD;AACpD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;AAWzD,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;QACnD,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAuB;IAC1D,IAAI,CAAC;QACH,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,GAAG,UAAU,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IACjE,IAAI,CAAC;QACH,qDAAqD;QACrD,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;QACzC,IAAI,CAAC;YACH,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/src/types/api.d.ts
CHANGED
|
@@ -129,8 +129,8 @@ export interface BoltaConfig {
|
|
|
129
129
|
baseUrl?: string;
|
|
130
130
|
timeout?: number;
|
|
131
131
|
maxRetries?: number;
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
/** false면 새 버전 넛지 비활성화 (bolta config set update-check false) */
|
|
133
|
+
updateCheck?: boolean;
|
|
134
134
|
guideShown?: boolean;
|
|
135
135
|
}
|
|
136
136
|
export interface GlobalOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/types/api.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/types/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BoltaClient } from '../client/bolta-client.js';
|
|
2
|
+
interface GlobalOptions {
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
supplierKey?: string;
|
|
5
|
+
customerKey?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 글로벌 옵션(및 env/config)으로부터 인증을 해석해 BoltaClient를 만든다.
|
|
9
|
+
* 발행/수정 커맨드에서 반복되던 apiKey 확인 + supplierKey 해석 + 클라이언트 생성을 한곳으로 모은다.
|
|
10
|
+
* 커맨드가 요청 시 supplierKey 값을 함께 넘겨야 하므로 client와 함께 반환한다.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createClient(globalOpts: GlobalOptions): {
|
|
13
|
+
client: BoltaClient;
|
|
14
|
+
supplierKey?: string;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/utils/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,aAAa,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAWrG"}
|