@bolta-io/cli 0.0.16 → 0.0.18

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 (68) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/CLAUDE.md +3 -1
  3. package/README.md +3 -0
  4. package/dist/bin/bolta.js +18 -30
  5. package/dist/bin/bolta.js.map +1 -1
  6. package/dist/src/client/bolta-client.d.ts +3 -0
  7. package/dist/src/client/bolta-client.d.ts.map +1 -1
  8. package/dist/src/client/bolta-client.js +24 -6
  9. package/dist/src/client/bolta-client.js.map +1 -1
  10. package/dist/src/commands/config/index.d.ts.map +1 -1
  11. package/dist/src/commands/config/index.js +73 -33
  12. package/dist/src/commands/config/index.js.map +1 -1
  13. package/dist/src/commands/examples/index.d.ts.map +1 -1
  14. package/dist/src/commands/examples/index.js +4 -0
  15. package/dist/src/commands/examples/index.js.map +1 -1
  16. package/dist/src/commands/invoice/amend.d.ts.map +1 -1
  17. package/dist/src/commands/invoice/amend.js +9 -18
  18. package/dist/src/commands/invoice/amend.js.map +1 -1
  19. package/dist/src/commands/invoice/index.d.ts.map +1 -1
  20. package/dist/src/commands/invoice/index.js +3 -0
  21. package/dist/src/commands/invoice/index.js.map +1 -1
  22. package/dist/src/commands/invoice/issue-request.d.ts.map +1 -1
  23. package/dist/src/commands/invoice/issue-request.js +3 -8
  24. package/dist/src/commands/invoice/issue-request.js.map +1 -1
  25. package/dist/src/commands/invoice/issue.d.ts.map +1 -1
  26. package/dist/src/commands/invoice/issue.js +3 -8
  27. package/dist/src/commands/invoice/issue.js.map +1 -1
  28. package/dist/src/commands/update/nudge.d.ts +12 -0
  29. package/dist/src/commands/update/nudge.d.ts.map +1 -0
  30. package/dist/src/commands/update/nudge.js +104 -0
  31. package/dist/src/commands/update/nudge.js.map +1 -0
  32. package/dist/src/commands/update/updater.d.ts.map +1 -1
  33. package/dist/src/commands/update/updater.js +15 -28
  34. package/dist/src/commands/update/updater.js.map +1 -1
  35. package/dist/src/config/config-manager.d.ts +13 -0
  36. package/dist/src/config/config-manager.d.ts.map +1 -1
  37. package/dist/src/config/config-manager.js +57 -21
  38. package/dist/src/config/config-manager.js.map +1 -1
  39. package/dist/src/config/update-check-cache.d.ts +12 -0
  40. package/dist/src/config/update-check-cache.d.ts.map +1 -0
  41. package/dist/src/config/update-check-cache.js +45 -0
  42. package/dist/src/config/update-check-cache.js.map +1 -0
  43. package/dist/src/types/api.d.ts +6 -2
  44. package/dist/src/types/api.d.ts.map +1 -1
  45. package/dist/src/types/api.js +4 -1
  46. package/dist/src/types/api.js.map +1 -1
  47. package/dist/src/utils/client.d.ts +17 -0
  48. package/dist/src/utils/client.d.ts.map +1 -0
  49. package/dist/src/utils/client.js +17 -0
  50. package/dist/src/utils/client.js.map +1 -0
  51. package/dist/src/utils/output.d.ts +10 -2
  52. package/dist/src/utils/output.d.ts.map +1 -1
  53. package/dist/src/utils/output.js +17 -3
  54. package/dist/src/utils/output.js.map +1 -1
  55. package/dist/src/utils/platform.d.ts +1 -0
  56. package/dist/src/utils/platform.d.ts.map +1 -1
  57. package/dist/src/utils/platform.js +36 -9
  58. package/dist/src/utils/platform.js.map +1 -1
  59. package/dist/src/utils/version.d.ts +3 -0
  60. package/dist/src/utils/version.d.ts.map +1 -1
  61. package/dist/src/utils/version.js +24 -0
  62. package/dist/src/utils/version.js.map +1 -1
  63. package/dist/src/validators/schemas.d.ts +41 -1
  64. package/dist/src/validators/schemas.d.ts.map +1 -1
  65. package/dist/src/validators/schemas.js +68 -6
  66. package/dist/src/validators/schemas.js.map +1 -1
  67. package/llms.txt +4 -2
  68. package/package.json +1 -1
@@ -1,9 +1,8 @@
1
- import { resolveApiKey, resolveSupplierKey, resolveBaseUrl } from '../../config/config-manager.js';
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 { amendTerminationSchema, amendChangeSupplyCostSchema } from '../../validators/schemas.js';
6
- import { BoltaValidationError, BoltaAuthError } from '../../utils/errors.js';
5
+ import { BoltaValidationError } from '../../utils/errors.js';
7
6
  import { ZodError } from 'zod';
8
7
  export function registerAmendCommands(invoice) {
9
8
  const amend = invoice.command('amend').description('세금계산서 수정 발행');
@@ -20,10 +19,6 @@ Example:
20
19
  .action(async (issuanceKey, options, command) => {
21
20
  try {
22
21
  const globalOpts = command.optsWithGlobals();
23
- const apiKey = resolveApiKey(globalOpts.apiKey);
24
- if (!apiKey)
25
- throw new BoltaAuthError('API 키가 설정되지 않았습니다.');
26
- const supplierKey = resolveSupplierKey(globalOpts.supplierKey, globalOpts.customerKey);
27
22
  let validated;
28
23
  try {
29
24
  validated = amendTerminationSchema.parse({ date: options.date });
@@ -43,8 +38,8 @@ Example:
43
38
  });
44
39
  return;
45
40
  }
46
- const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl(), supplierKey });
47
41
  verbose('수정발행 (계약 해제) 요청', { issuanceKey });
42
+ const { client, supplierKey } = createClient(globalOpts);
48
43
  const result = await client.amendTermination(issuanceKey, validated, supplierKey);
49
44
  outputSuccess(result);
50
45
  }
@@ -59,9 +54,13 @@ Example:
59
54
  .option('--file <path>', 'JSON 파일 경로')
60
55
  .option('--stdin', '표준 입력에서 읽기')
61
56
  .addHelpText('after', `
57
+ Note:
58
+ taxType은 TAXABLE(과세), ZERO_RATE(영세율), TAX_FREE(면세) 중 하나입니다.
59
+
62
60
  Example:
63
61
  bolta invoice amend change-supply-cost 8D529FAD3EBAE050 --data '{
64
62
  "date": "2026-03-25",
63
+ "taxType": "TAXABLE",
65
64
  "items": [{
66
65
  "date": "2026-03-25",
67
66
  "name": "개발 용역 (수정)",
@@ -72,10 +71,6 @@ Example:
72
71
  .action(async (issuanceKey, options, command) => {
73
72
  try {
74
73
  const globalOpts = command.optsWithGlobals();
75
- const apiKey = resolveApiKey(globalOpts.apiKey);
76
- if (!apiKey)
77
- throw new BoltaAuthError('API 키가 설정되지 않았습니다.');
78
- const supplierKey = resolveSupplierKey(globalOpts.supplierKey, globalOpts.customerKey);
79
74
  const raw = await resolveInput(options);
80
75
  let validated;
81
76
  try {
@@ -96,8 +91,8 @@ Example:
96
91
  });
97
92
  return;
98
93
  }
99
- const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl(), supplierKey });
100
94
  verbose('수정발행 (공급가액 변동) 요청', { issuanceKey });
95
+ const { client, supplierKey } = createClient(globalOpts);
101
96
  const result = await client.amendChangeSupplyCost(issuanceKey, validated, supplierKey);
102
97
  outputSuccess(result);
103
98
  }
@@ -117,10 +112,6 @@ Example:
117
112
  .action(async (issuanceKey, options, command) => {
118
113
  try {
119
114
  const globalOpts = command.optsWithGlobals();
120
- const apiKey = resolveApiKey(globalOpts.apiKey);
121
- if (!apiKey)
122
- throw new BoltaAuthError('API 키가 설정되지 않았습니다.');
123
- const supplierKey = resolveSupplierKey(globalOpts.supplierKey, globalOpts.customerKey);
124
115
  if (globalOpts.dryRun) {
125
116
  outputSuccess({
126
117
  dryRun: true,
@@ -129,8 +120,8 @@ Example:
129
120
  });
130
121
  return;
131
122
  }
132
- const client = new BoltaClient({ apiKey, baseUrl: resolveBaseUrl(), supplierKey });
133
123
  verbose('수정발행 (착오에 의한 이중발급) 요청', { issuanceKey });
124
+ const { client, supplierKey } = createClient(globalOpts);
134
125
  const result = await client.amendDoubleIssuance(issuanceKey, supplierKey);
135
126
  outputSuccess(result);
136
127
  }
@@ -1 +1 @@
1
- {"version":3,"file":"amend.js","sourceRoot":"","sources":["../../../../src/commands/invoice/amend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"amend.js","sourceRoot":"","sources":["../../../../src/commands/invoice/amend.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyE9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/invoice/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4E9D"}
@@ -16,11 +16,13 @@ export function registerInvoiceCommands(program) {
16
16
  Notes:
17
17
  - 정발행은 공급받는자 외국인등록번호를 지원합니다.
18
18
  - 외국인등록번호 공급받는자는 최상위 description 없이 요청하세요. 여권번호는 지원하지 않습니다.
19
+ - taxType은 TAXABLE(과세), ZERO_RATE(영세율), TAX_FREE(면세) 중 하나입니다.
19
20
 
20
21
  Example:
21
22
  bolta invoice issue --data '{
22
23
  "date": "2026-03-25",
23
24
  "purpose": "CLAIM",
25
+ "taxType": "TAXABLE",
24
26
  "supplier": {
25
27
  "identificationNumber": "1234567890",
26
28
  "organizationName": "공급자 주식회사",
@@ -51,6 +53,7 @@ Example:
51
53
  .addHelpText('after', `
52
54
  Note:
53
55
  역발행은 supplied.identificationNumber에 사업자등록번호(10자리)만 허용합니다.
56
+ taxType은 TAXABLE(과세), ZERO_RATE(영세율), TAX_FREE(면세) 중 하나입니다.
54
57
 
55
58
  Example:
56
59
  bolta invoice issue-request --data '{...}'`)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/invoice/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAE3E,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC;SACrC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC;SAC/B,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;SAClE,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2BrB,CAAC;SACD,MAAM,CAAC,WAAW,CAAC,CAAC;IAEvB,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC;SACrC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC;SAC/B,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;SAClE,WAAW,CAAC,OAAO,EAAE;;;;;6CAKmB,CAAC;SACzC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAE9B,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,8CAA8C,CAAC;SAC3D,WAAW,CAAC,OAAO,EAAE;;qDAE2B,CAAC;SACjD,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,cAAc,CAAC,qBAAqB,EAAE,8BAA8B,CAAC;SACrE,WAAW,CAAC,OAAO,EAAE;;mDAEyB,CAAC;SAC/C,MAAM,CAAC,YAAY,CAAC,CAAC;IAExB,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/invoice/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAE3E,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC;SACrC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC;SAC/B,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;SAClE,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6BrB,CAAC;SACD,MAAM,CAAC,WAAW,CAAC,CAAC;IAEvB,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC;SACrC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC;SAC/B,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;SAClE,WAAW,CAAC,OAAO,EAAE;;;;;;6CAMmB,CAAC;SACzC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAE9B,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,8CAA8C,CAAC;SAC3D,WAAW,CAAC,OAAO,EAAE;;qDAE2B,CAAC;SACjD,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,cAAc,CAAC,qBAAqB,EAAE,8BAA8B,CAAC;SACrE,WAAW,CAAC,OAAO,EAAE;;mDAEyB,CAAC;SAC/C,MAAM,CAAC,YAAY,CAAC,CAAC;IAExB,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -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;AAQpC,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,CAmCf"}
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 { resolveApiKey, resolveSupplierKey, resolveBaseUrl } from '../../config/config-manager.js';
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, BoltaAuthError } from '../../utils/errors.js';
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,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,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,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7E,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,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,cAAc,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QAEvF,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QACnF,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,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
+ {"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;AAQpC,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,CAmCf"}
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 { resolveApiKey, resolveSupplierKey, resolveBaseUrl } from '../../config/config-manager.js';
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, BoltaAuthError } from '../../utils/errors.js';
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,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,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,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7E,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,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,cAAc,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QAEvF,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QACnF,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,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"}
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":"AA8BA,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,CA+BxD;AAED,wBAAsB,aAAa,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CA2FjF"}
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
- const latest = await fetchLatestVersion();
17
- const updateAvailable = isUpdateAvailable(currentVersion, latest.version);
18
- let updateCommand;
19
- switch (installMethod) {
20
- case 'homebrew':
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: latest.version,
24
+ latestVersion,
36
25
  updateAvailable,
37
26
  installMethod,
38
- updateCommand,
39
- changelog: latest.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 suggestions = {
47
- homebrew: "'brew upgrade bolta' 명령을 사용하세요.",
48
- npm: "'npm update -g @bolta-io/cli' 명령을 사용하세요.",
49
- unknown: '설치 방식을 감지할 없습니다. npm이나 Homebrew로 재설치하세요.',
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":"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"}
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;AAMnD,wBAAgB,UAAU,IAAI,WAAW,CAOxC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAGpD;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAuB/F;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9C"}
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
- export function resolveSupplierKey(cliFlag, legacyCliFlag) {
24
- if (cliFlag)
25
- return cliFlag;
26
- if (legacyCliFlag) {
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 legacyCliFlag;
41
+ return { value: legacyFlag, source: 'legacy-flag' };
29
42
  }
30
43
  const config = loadConfig();
31
- if (process.env.BOLTA_SUPPLIER_KEY)
32
- return process.env.BOLTA_SUPPLIER_KEY;
33
- if (config.supplierKey)
34
- return config.supplierKey;
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
- if (process.env.BOLTA_CUSTOMER_KEY) {
51
+ const legacyEnv = normalize(process.env.BOLTA_CUSTOMER_KEY);
52
+ if (legacyEnv) {
37
53
  deprecationWarning("'BOLTA_CUSTOMER_KEY' 환경변수는 'BOLTA_SUPPLIER_KEY'로 변경되었습니다.");
38
- return process.env.BOLTA_CUSTOMER_KEY;
54
+ return { value: legacyEnv, source: 'legacy-env' };
39
55
  }
40
- if (config.customerKey) {
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.customerKey;
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 || loadConfig().baseUrl || 'https://xapi.bolta.io/v1';
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
- if (key.length <= 8)
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