@mrmtsu/mcms-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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +184 -0
  3. package/README.md +185 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +143 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/api.d.ts +2 -0
  8. package/dist/commands/api.js +27 -0
  9. package/dist/commands/api.js.map +1 -0
  10. package/dist/commands/auth.d.ts +2 -0
  11. package/dist/commands/auth.js +238 -0
  12. package/dist/commands/auth.js.map +1 -0
  13. package/dist/commands/completion.d.ts +2 -0
  14. package/dist/commands/completion.js +390 -0
  15. package/dist/commands/completion.js.map +1 -0
  16. package/dist/commands/config.d.ts +2 -0
  17. package/dist/commands/config.js +63 -0
  18. package/dist/commands/config.js.map +1 -0
  19. package/dist/commands/content.d.ts +2 -0
  20. package/dist/commands/content.js +191 -0
  21. package/dist/commands/content.js.map +1 -0
  22. package/dist/commands/media.d.ts +2 -0
  23. package/dist/commands/media.js +47 -0
  24. package/dist/commands/media.js.map +1 -0
  25. package/dist/commands/schema.d.ts +2 -0
  26. package/dist/commands/schema.js +71 -0
  27. package/dist/commands/schema.js.map +1 -0
  28. package/dist/commands/types.d.ts +2 -0
  29. package/dist/commands/types.js +85 -0
  30. package/dist/commands/types.js.map +1 -0
  31. package/dist/commands/utils.d.ts +8 -0
  32. package/dist/commands/utils.js +56 -0
  33. package/dist/commands/utils.js.map +1 -0
  34. package/dist/commands/validate.d.ts +2 -0
  35. package/dist/commands/validate.js +38 -0
  36. package/dist/commands/validate.js.map +1 -0
  37. package/dist/core/auth-store.d.ts +11 -0
  38. package/dist/core/auth-store.js +83 -0
  39. package/dist/core/auth-store.js.map +1 -0
  40. package/dist/core/client.d.ts +33 -0
  41. package/dist/core/client.js +416 -0
  42. package/dist/core/client.js.map +1 -0
  43. package/dist/core/config.d.ts +11 -0
  44. package/dist/core/config.js +73 -0
  45. package/dist/core/config.js.map +1 -0
  46. package/dist/core/context.d.ts +39 -0
  47. package/dist/core/context.js +382 -0
  48. package/dist/core/context.js.map +1 -0
  49. package/dist/core/errors.d.ts +26 -0
  50. package/dist/core/errors.js +167 -0
  51. package/dist/core/errors.js.map +1 -0
  52. package/dist/core/exit-codes.d.ts +10 -0
  53. package/dist/core/exit-codes.js +10 -0
  54. package/dist/core/exit-codes.js.map +1 -0
  55. package/dist/core/http.d.ts +24 -0
  56. package/dist/core/http.js +237 -0
  57. package/dist/core/http.js.map +1 -0
  58. package/dist/core/io.d.ts +2 -0
  59. package/dist/core/io.js +39 -0
  60. package/dist/core/io.js.map +1 -0
  61. package/dist/core/output.d.ts +4 -0
  62. package/dist/core/output.js +182 -0
  63. package/dist/core/output.js.map +1 -0
  64. package/dist/core/schema.d.ts +23 -0
  65. package/dist/core/schema.js +319 -0
  66. package/dist/core/schema.js.map +1 -0
  67. package/dist/validation/payload.d.ts +6 -0
  68. package/dist/validation/payload.js +204 -0
  69. package/dist/validation/payload.js.map +1 -0
  70. package/package.json +39 -0
@@ -0,0 +1,238 @@
1
+ import { canUseKeychain, saveApiKey, saveApiKeyForProfile } from "../core/auth-store.js";
2
+ import { createRuntimeContext } from "../core/context.js";
3
+ import { CliError } from "../core/errors.js";
4
+ import { EXIT_CODE } from "../core/exit-codes.js";
5
+ import { printSuccess } from "../core/output.js";
6
+ import { readConfig, writeConfig } from "../core/config.js";
7
+ import { contextFromCommand, getActionCommand } from "./utils.js";
8
+ export function registerAuthCommands(program) {
9
+ const auth = program.command("auth").description("Manage authentication settings");
10
+ auth
11
+ .command("login")
12
+ .description("Save API key in keychain (OAuth is not supported in MVP)")
13
+ .option("--profile <name>", "profile name")
14
+ .option("--service-domain <serviceDomain>", "microCMS service domain")
15
+ .option("--api-key <apiKey>", "microCMS API key (less secure: may leak via shell history/process list)")
16
+ .option("--api-key-stdin", "read API key from stdin")
17
+ .option("--prompt", "prompt API key from TTY without echo")
18
+ .action(async (options, command) => {
19
+ const globals = command.optsWithGlobals();
20
+ const apiKeyOption = typeof globals.apiKey === "string" ? globals.apiKey : options.apiKey;
21
+ const apiKeyStdin = Boolean(options.apiKeyStdin || globals.apiKeyStdin);
22
+ const apiKeyPrompt = Boolean(options.prompt);
23
+ if (apiKeyPrompt && (Boolean(apiKeyOption) || apiKeyStdin)) {
24
+ throw new CliError({
25
+ code: "INVALID_INPUT",
26
+ message: "Use --prompt alone. It conflicts with --api-key and --api-key-stdin.",
27
+ exitCode: EXIT_CODE.INVALID_INPUT
28
+ });
29
+ }
30
+ const ctx = await createRuntimeContext({
31
+ profile: options.profile ?? globals.profile,
32
+ serviceDomain: options.serviceDomain ?? globals.serviceDomain,
33
+ apiKey: apiKeyOption,
34
+ apiKeyStdin,
35
+ apiKeyPrompt,
36
+ json: Boolean(globals.json),
37
+ plain: Boolean(globals.plain),
38
+ table: Boolean(globals.table),
39
+ select: globals.select,
40
+ verbose: Boolean(globals.verbose),
41
+ color: globals.color,
42
+ timeout: globals.timeout,
43
+ retry: globals.retry,
44
+ retryMaxDelay: globals.retryMaxDelay
45
+ });
46
+ if (!ctx.serviceDomain) {
47
+ throw new CliError({
48
+ code: "INVALID_INPUT",
49
+ message: "service domain is required for auth login",
50
+ exitCode: EXIT_CODE.INVALID_INPUT
51
+ });
52
+ }
53
+ if (!ctx.apiKey) {
54
+ throw new CliError({
55
+ code: "INVALID_INPUT",
56
+ message: "API key is required for auth login",
57
+ exitCode: EXIT_CODE.INVALID_INPUT
58
+ });
59
+ }
60
+ const config = await readConfig();
61
+ const profileOption = options.profile ?? command.optsWithGlobals().profile;
62
+ const profile = profileOption ? normalizeProfileName(profileOption) : undefined;
63
+ const nextProfiles = { ...(config.profiles ?? {}) };
64
+ if (profile) {
65
+ nextProfiles[profile] = { serviceDomain: ctx.serviceDomain };
66
+ }
67
+ await writeConfig({
68
+ ...config,
69
+ serviceDomain: profile ? config.serviceDomain : ctx.serviceDomain,
70
+ profiles: Object.keys(nextProfiles).length > 0 ? nextProfiles : config.profiles,
71
+ defaultProfile: config.defaultProfile
72
+ });
73
+ const saveResult = profile
74
+ ? await saveApiKeyForProfile(profile, ctx.apiKey)
75
+ : await saveApiKey(ctx.serviceDomain, ctx.apiKey);
76
+ const keychainAvailable = await canUseKeychain();
77
+ printSuccess(ctx, {
78
+ profile: profile ?? null,
79
+ serviceDomain: ctx.serviceDomain,
80
+ apiKeyStored: saveResult.stored,
81
+ keychainAvailable,
82
+ fallbackToEnv: !saveResult.stored,
83
+ reason: saveResult.reason ?? null
84
+ });
85
+ });
86
+ auth
87
+ .command("status")
88
+ .description("Show auth resolution status")
89
+ .action(async (...actionArgs) => {
90
+ const command = getActionCommand(actionArgs);
91
+ const ctx = await contextFromCommand(command);
92
+ const keychainAvailable = await canUseKeychain();
93
+ printSuccess(ctx, {
94
+ profile: ctx.profile ?? null,
95
+ serviceDomain: ctx.serviceDomain ?? null,
96
+ apiKeyAvailable: Boolean(ctx.apiKey),
97
+ apiKeySource: ctx.apiKeySource,
98
+ apiKeySourceDetail: ctx.apiKeySourceDetail,
99
+ keychainAvailable
100
+ });
101
+ });
102
+ const profile = auth.command("profile").description("Manage named auth profiles");
103
+ profile
104
+ .command("list")
105
+ .description("List configured profiles")
106
+ .action(async (...actionArgs) => {
107
+ const command = getActionCommand(actionArgs);
108
+ const ctx = await contextFromCommand(command);
109
+ const config = await readConfig();
110
+ const defaultProfile = config.defaultProfile ?? null;
111
+ const profiles = Object.entries(config.profiles ?? {}).map(([name, value]) => ({
112
+ name,
113
+ serviceDomain: value.serviceDomain,
114
+ isDefault: defaultProfile === name
115
+ }));
116
+ printSuccess(ctx, {
117
+ defaultProfile,
118
+ profiles
119
+ });
120
+ });
121
+ profile
122
+ .command("add")
123
+ .argument("<name>", "profile name")
124
+ .option("--service-domain <serviceDomain>", "microCMS service domain")
125
+ .option("--set-default", "set this profile as default")
126
+ .description("Add or update a profile")
127
+ .action(async (...actionArgs) => {
128
+ const name = actionArgs[0];
129
+ const options = actionArgs[1];
130
+ const command = getActionCommand(actionArgs);
131
+ const ctx = await contextFromCommand(command);
132
+ const profileName = normalizeProfileName(name);
133
+ const serviceDomain = normalizeServiceDomain(options.serviceDomain ?? command.optsWithGlobals().serviceDomain);
134
+ const config = await readConfig();
135
+ const profiles = { ...(config.profiles ?? {}) };
136
+ profiles[profileName] = { serviceDomain };
137
+ await writeConfig({
138
+ ...config,
139
+ profiles,
140
+ defaultProfile: options.setDefault ? profileName : config.defaultProfile
141
+ });
142
+ printSuccess(ctx, {
143
+ profile: profileName,
144
+ serviceDomain,
145
+ defaultProfile: options.setDefault ? profileName : config.defaultProfile ?? null
146
+ });
147
+ });
148
+ profile
149
+ .command("use")
150
+ .argument("<name>", "profile name")
151
+ .description("Set default profile")
152
+ .action(async (...actionArgs) => {
153
+ const name = actionArgs[0];
154
+ const command = getActionCommand(actionArgs);
155
+ const ctx = await contextFromCommand(command);
156
+ const profileName = normalizeProfileName(name);
157
+ const config = await readConfig();
158
+ if (!config.profiles?.[profileName]) {
159
+ throw new CliError({
160
+ code: "INVALID_INPUT",
161
+ message: `Profile not found: ${profileName}`,
162
+ exitCode: EXIT_CODE.INVALID_INPUT
163
+ });
164
+ }
165
+ await writeConfig({
166
+ ...config,
167
+ defaultProfile: profileName
168
+ });
169
+ printSuccess(ctx, {
170
+ defaultProfile: profileName
171
+ });
172
+ });
173
+ profile
174
+ .command("remove")
175
+ .argument("<name>", "profile name")
176
+ .description("Remove profile from config")
177
+ .action(async (...actionArgs) => {
178
+ const name = actionArgs[0];
179
+ const command = getActionCommand(actionArgs);
180
+ const ctx = await contextFromCommand(command);
181
+ const profileName = normalizeProfileName(name);
182
+ const config = await readConfig();
183
+ const profiles = { ...(config.profiles ?? {}) };
184
+ if (!profiles[profileName]) {
185
+ throw new CliError({
186
+ code: "INVALID_INPUT",
187
+ message: `Profile not found: ${profileName}`,
188
+ exitCode: EXIT_CODE.INVALID_INPUT
189
+ });
190
+ }
191
+ delete profiles[profileName];
192
+ await writeConfig({
193
+ ...config,
194
+ profiles: Object.keys(profiles).length > 0 ? profiles : undefined,
195
+ defaultProfile: config.defaultProfile === profileName ? undefined : config.defaultProfile
196
+ });
197
+ printSuccess(ctx, {
198
+ removed: profileName
199
+ });
200
+ });
201
+ }
202
+ function normalizeProfileName(value) {
203
+ const name = value?.trim();
204
+ if (!name) {
205
+ throw new CliError({
206
+ code: "INVALID_INPUT",
207
+ message: "Profile name is required",
208
+ exitCode: EXIT_CODE.INVALID_INPUT
209
+ });
210
+ }
211
+ if (!/^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,62}[A-Za-z0-9])?$/.test(name)) {
212
+ throw new CliError({
213
+ code: "INVALID_INPUT",
214
+ message: "Invalid profile name format. Use letters, numbers, dot, underscore, hyphen (1-64 chars).",
215
+ exitCode: EXIT_CODE.INVALID_INPUT
216
+ });
217
+ }
218
+ return name;
219
+ }
220
+ function normalizeServiceDomain(value) {
221
+ if (!value) {
222
+ throw new CliError({
223
+ code: "INVALID_INPUT",
224
+ message: "service domain is required",
225
+ exitCode: EXIT_CODE.INVALID_INPUT
226
+ });
227
+ }
228
+ const normalized = value.trim().toLowerCase();
229
+ if (!/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(normalized)) {
230
+ throw new CliError({
231
+ code: "INVALID_INPUT",
232
+ message: "Invalid service domain format. Expected lowercase letters, numbers, hyphens, max 63 chars, no leading/trailing hyphen.",
233
+ exitCode: EXIT_CODE.INVALID_INPUT
234
+ });
235
+ }
236
+ return normalized;
237
+ }
238
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAElE,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;IAEnF,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,kBAAkB,EAAE,cAAc,CAAC;SAC1C,MAAM,CAAC,kCAAkC,EAAE,yBAAyB,CAAC;SACrE,MAAM,CAAC,oBAAoB,EAAE,yEAAyE,CAAC;SACvG,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,CAAC;SACpD,MAAM,CAAC,UAAU,EAAE,sCAAsC,CAAC;SAC1D,MAAM,CACL,KAAK,EACH,OAA+G,EAC/G,OAAgB,EAChB,EAAE;QACJ,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAA6B,CAAC;QACrE,MAAM,YAAY,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1F,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE7C,IAAI,YAAY,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,QAAQ,CAAC;gBACjB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,sEAAsE;gBAC/E,QAAQ,EAAE,SAAS,CAAC,aAAa;aAClC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC;YACrC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAK,OAAO,CAAC,OAA8B;YACnE,aAAa,EAAE,OAAO,CAAC,aAAa,IAAK,OAAO,CAAC,aAAoC;YACrF,MAAM,EAAE,YAAY;YACpB,WAAW;YACX,YAAY;YACZ,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YAC3B,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7B,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7B,MAAM,EAAE,OAAO,CAAC,MAA4B;YAC5C,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,KAA4B;YAC3C,OAAO,EAAE,OAAO,CAAC,OAAsC;YACvD,KAAK,EAAE,OAAO,CAAC,KAAoC;YACnD,aAAa,EAAE,OAAO,CAAC,aAA4C;SACpE,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,IAAI,QAAQ,CAAC;gBACjB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,2CAA2C;gBACpD,QAAQ,EAAE,SAAS,CAAC,aAAa;aAClC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,QAAQ,CAAC;gBACjB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,oCAAoC;gBAC7C,QAAQ,EAAE,SAAS,CAAC,aAAa;aAClC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC;QAC3E,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,MAAM,YAAY,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;QAEpD,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;QAC/D,CAAC;QAED,MAAM,WAAW,CAAC;YAChB,GAAG,MAAM;YACT,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa;YACjE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ;YAC/E,cAAc,EAAE,MAAM,CAAC,cAAc;SACtC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,OAAO;YACxB,CAAC,CAAC,MAAM,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC;YACjD,CAAC,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,iBAAiB,GAAG,MAAM,cAAc,EAAE,CAAC;QAEjD,YAAY,CAAC,GAAG,EAAE;YAChB,OAAO,EAAE,OAAO,IAAI,IAAI;YACxB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,YAAY,EAAE,UAAU,CAAC,MAAM;YAC/B,iBAAiB;YACjB,aAAa,EAAE,CAAC,UAAU,CAAC,MAAM;YACjC,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,IAAI;SAClC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,GAAG,UAAqB,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,iBAAiB,GAAG,MAAM,cAAc,EAAE,CAAC;QAEjD,YAAY,CAAC,GAAG,EAAE;YAChB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;YAC5B,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,IAAI;YACxC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YACpC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;YAC1C,iBAAiB;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAElF,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,GAAG,UAAqB,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7E,IAAI;YACJ,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,SAAS,EAAE,cAAc,KAAK,IAAI;SACnC,CAAC,CAAC,CAAC;QAEJ,YAAY,CAAC,GAAG,EAAE;YAChB,cAAc;YACd,QAAQ;SACT,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;SAClC,MAAM,CAAC,kCAAkC,EAAE,yBAAyB,CAAC;SACrE,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,GAAG,UAAqB,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAW,CAAC;QACrC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAqD,CAAC;QAClF,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,CAAC;QAE/G,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;QAChD,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,aAAa,EAAE,CAAC;QAE1C,MAAM,WAAW,CAAC;YAChB,GAAG,MAAM;YACT,QAAQ;YACR,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc;SACzE,CAAC,CAAC;QAEH,YAAY,CAAC,GAAG,EAAE;YAChB,OAAO,EAAE,WAAW;YACpB,aAAa;YACb,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI;SACjF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;SAClC,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,GAAG,UAAqB,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAW,CAAC;QACrC,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAElC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,QAAQ,CAAC;gBACjB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,sBAAsB,WAAW,EAAE;gBAC5C,QAAQ,EAAE,SAAS,CAAC,aAAa;aAClC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,WAAW,CAAC;YAChB,GAAG,MAAM;YACT,cAAc,EAAE,WAAW;SAC5B,CAAC,CAAC;QAEH,YAAY,CAAC,GAAG,EAAE;YAChB,cAAc,EAAE,WAAW;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;SAClC,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,GAAG,UAAqB,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAW,CAAC;QACrC,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;QAEhD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,QAAQ,CAAC;gBACjB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,sBAAsB,WAAW,EAAE;gBAC5C,QAAQ,EAAE,SAAS,CAAC,aAAa;aAClC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE7B,MAAM,WAAW,CAAC;YAChB,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACjE,cAAc,EAAE,MAAM,CAAC,cAAc,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc;SAC1F,CAAC,CAAC;QAEH,YAAY,CAAC,GAAG,EAAE;YAChB,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAyB;IACrD,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,QAAQ,CAAC;YACjB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,0BAA0B;YACnC,QAAQ,EAAE,SAAS,CAAC,aAAa;SAClC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,mDAAmD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,QAAQ,CAAC;YACjB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,0FAA0F;YACnG,QAAQ,EAAE,SAAS,CAAC,aAAa;SAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAyB;IACvD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,QAAQ,CAAC;YACjB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,4BAA4B;YACrC,QAAQ,EAAE,SAAS,CAAC,aAAa;SAClC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,wCAAwC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,QAAQ,CAAC;YACjB,IAAI,EAAE,eAAe;YACrB,OAAO,EACL,wHAAwH;YAC1H,QAAQ,EAAE,SAAS,CAAC,aAAa;SAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerCompletionCommands(program: Command): void;
@@ -0,0 +1,390 @@
1
+ import { lstat, mkdir, rm, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { listApis } from "../core/client.js";
5
+ import { CliError, normalizeError } from "../core/errors.js";
6
+ import { EXIT_CODE } from "../core/exit-codes.js";
7
+ import { printSuccess } from "../core/output.js";
8
+ import { extractApiEndpoints } from "../core/schema.js";
9
+ import { contextFromCommand, getActionCommand } from "./utils.js";
10
+ const SUPPORTED_SHELLS = ["bash", "zsh", "fish"];
11
+ const GLOBAL_OPTIONS = [
12
+ "--json",
13
+ "--plain",
14
+ "--table",
15
+ "--select",
16
+ "--profile",
17
+ "--service-domain",
18
+ "--api-key",
19
+ "--api-key-stdin",
20
+ "--timeout",
21
+ "--retry",
22
+ "--retry-max-delay",
23
+ "--verbose",
24
+ "--no-color"
25
+ ];
26
+ export function registerCompletionCommands(program) {
27
+ const completion = program.command("completion").description("Install shell completion scripts");
28
+ completion
29
+ .command("install")
30
+ .argument("[shell]", "bash|zsh|fish")
31
+ .description("Install completion script for your shell")
32
+ .action(async (...actionArgs) => {
33
+ const shellArg = actionArgs[0];
34
+ const command = getActionCommand(actionArgs);
35
+ const ctx = await contextFromCommand(command);
36
+ const shell = parseShell(shellArg ?? detectShellFromEnv());
37
+ const targetPath = getCompletionFilePath(shell);
38
+ const script = buildCompletionScript(shell);
39
+ await assertSafeCompletionTargetForWrite(targetPath);
40
+ await mkdir(dirname(targetPath), { recursive: true });
41
+ await writeFile(targetPath, script, "utf8");
42
+ printSuccess(ctx, {
43
+ installed: true,
44
+ shell,
45
+ path: targetPath,
46
+ reloadHint: getReloadHint(shell)
47
+ });
48
+ });
49
+ completion
50
+ .command("uninstall")
51
+ .description("Remove installed completion scripts")
52
+ .action(async (...actionArgs) => {
53
+ const command = getActionCommand(actionArgs);
54
+ const ctx = await contextFromCommand(command);
55
+ const removed = [];
56
+ for (const shell of SUPPORTED_SHELLS) {
57
+ const path = getCompletionFilePath(shell);
58
+ const state = await getPathState(path);
59
+ if (state === "missing") {
60
+ continue;
61
+ }
62
+ if (state === "symlink") {
63
+ throw new CliError({
64
+ code: "INVALID_INPUT",
65
+ message: `Refusing to uninstall completion because target is a symbolic link: ${path}`,
66
+ exitCode: EXIT_CODE.INVALID_INPUT
67
+ });
68
+ }
69
+ if (state !== "file") {
70
+ throw new CliError({
71
+ code: "INVALID_INPUT",
72
+ message: `Refusing to uninstall completion because target is not a regular file: ${path}`,
73
+ exitCode: EXIT_CODE.INVALID_INPUT
74
+ });
75
+ }
76
+ await rm(path, { force: true });
77
+ removed.push(path);
78
+ }
79
+ printSuccess(ctx, {
80
+ uninstalled: true,
81
+ removed
82
+ });
83
+ });
84
+ completion
85
+ .command("endpoints")
86
+ .description("Print endpoint candidates for shell completion")
87
+ .action(async (...actionArgs) => {
88
+ const command = getActionCommand(actionArgs);
89
+ try {
90
+ const ctx = await contextFromCommand(command);
91
+ const result = await listApis(ctx);
92
+ const endpoints = extractApiEndpoints(result.data);
93
+ if (endpoints.length > 0) {
94
+ process.stdout.write(`${endpoints.join("\n")}\n`);
95
+ }
96
+ }
97
+ catch (error) {
98
+ const normalized = normalizeError(error);
99
+ if (isExpectedCompletionFailure(normalized.code)) {
100
+ return;
101
+ }
102
+ throw normalized;
103
+ }
104
+ });
105
+ }
106
+ function parseShell(value) {
107
+ if (!value) {
108
+ throw new CliError({
109
+ code: "INVALID_INPUT",
110
+ message: "Shell is required: bash|zsh|fish",
111
+ exitCode: EXIT_CODE.INVALID_INPUT
112
+ });
113
+ }
114
+ const normalized = value.trim().toLowerCase();
115
+ if (!SUPPORTED_SHELLS.includes(normalized)) {
116
+ throw new CliError({
117
+ code: "INVALID_INPUT",
118
+ message: `Unsupported shell: ${value}. Choose bash, zsh, or fish.`,
119
+ exitCode: EXIT_CODE.INVALID_INPUT
120
+ });
121
+ }
122
+ return normalized;
123
+ }
124
+ function detectShellFromEnv() {
125
+ const shellPath = process.env.SHELL;
126
+ if (!shellPath) {
127
+ return undefined;
128
+ }
129
+ if (shellPath.endsWith("/bash")) {
130
+ return "bash";
131
+ }
132
+ if (shellPath.endsWith("/zsh")) {
133
+ return "zsh";
134
+ }
135
+ if (shellPath.endsWith("/fish")) {
136
+ return "fish";
137
+ }
138
+ return undefined;
139
+ }
140
+ function getCompletionFilePath(shell) {
141
+ switch (shell) {
142
+ case "bash":
143
+ return join(homedir(), ".local", "share", "bash-completion", "completions", "microcms");
144
+ case "zsh":
145
+ return join(homedir(), ".zfunc", "_microcms");
146
+ case "fish":
147
+ return join(homedir(), ".config", "fish", "completions", "microcms.fish");
148
+ }
149
+ }
150
+ function getReloadHint(shell) {
151
+ switch (shell) {
152
+ case "bash":
153
+ return "Open a new shell session, or run: source ~/.bashrc";
154
+ case "zsh":
155
+ return "Open a new shell session, or run: autoload -U compinit && compinit";
156
+ case "fish":
157
+ return "Open a new shell session, or run: source ~/.config/fish/config.fish";
158
+ }
159
+ }
160
+ function isExpectedCompletionFailure(code) {
161
+ return code === "AUTH_FAILED" || code === "FORBIDDEN" || code === "NETWORK_ERROR" || code === "INVALID_INPUT";
162
+ }
163
+ async function assertSafeCompletionTargetForWrite(path) {
164
+ const state = await getPathState(path);
165
+ if (state !== "symlink") {
166
+ return;
167
+ }
168
+ throw new CliError({
169
+ code: "INVALID_INPUT",
170
+ message: `Refusing to write completion because target is a symbolic link: ${path}`,
171
+ exitCode: EXIT_CODE.INVALID_INPUT
172
+ });
173
+ }
174
+ async function getPathState(path) {
175
+ try {
176
+ const entry = await lstat(path);
177
+ if (entry.isSymbolicLink()) {
178
+ return "symlink";
179
+ }
180
+ if (entry.isFile()) {
181
+ return "file";
182
+ }
183
+ return "other";
184
+ }
185
+ catch (error) {
186
+ if (isNoEntryError(error)) {
187
+ return "missing";
188
+ }
189
+ throw error;
190
+ }
191
+ }
192
+ function isNoEntryError(error) {
193
+ return typeof error === "object" && error !== null && error.code === "ENOENT";
194
+ }
195
+ function buildCompletionScript(shell) {
196
+ switch (shell) {
197
+ case "bash":
198
+ return buildBashCompletionScript();
199
+ case "zsh":
200
+ return buildZshCompletionScript();
201
+ case "fish":
202
+ return buildFishCompletionScript();
203
+ }
204
+ }
205
+ function buildBashCompletionScript() {
206
+ const globals = GLOBAL_OPTIONS.join(" ");
207
+ return `# microcms completion for bash
208
+ _microcms_endpoint_candidates() {
209
+ microcms completion endpoints 2>/dev/null
210
+ }
211
+
212
+ _microcms_complete() {
213
+ local cur command subcmd
214
+ cur="\${COMP_WORDS[COMP_CWORD]}"
215
+ command="\${COMP_WORDS[1]}"
216
+ subcmd="\${COMP_WORDS[2]}"
217
+
218
+ local roots="api auth config completion content media schema types validate help"
219
+ local globals="${globals}"
220
+
221
+ if [[ \${COMP_CWORD} -eq 1 ]]; then
222
+ COMPREPLY=( $(compgen -W "\${roots} \${globals}" -- "$cur") )
223
+ return
224
+ fi
225
+
226
+ case "$command" in
227
+ auth)
228
+ COMPREPLY=( $(compgen -W "login status profile" -- "$cur") )
229
+ ;;
230
+ api)
231
+ if [[ "$subcmd" == "info" && \${COMP_CWORD} -eq 3 ]]; then
232
+ COMPREPLY=( $(compgen -W "$( _microcms_endpoint_candidates )" -- "$cur") )
233
+ else
234
+ COMPREPLY=( $(compgen -W "list info" -- "$cur") )
235
+ fi
236
+ ;;
237
+ content)
238
+ if [[ \${COMP_CWORD} -eq 3 ]]; then
239
+ COMPREPLY=( $(compgen -W "$( _microcms_endpoint_candidates )" -- "$cur") )
240
+ else
241
+ COMPREPLY=( $(compgen -W "list get create update delete" -- "$cur") )
242
+ fi
243
+ ;;
244
+ media)
245
+ COMPREPLY=( $(compgen -W "upload" -- "$cur") )
246
+ ;;
247
+ config)
248
+ COMPREPLY=( $(compgen -W "doctor" -- "$cur") )
249
+ ;;
250
+ schema)
251
+ COMPREPLY=( $(compgen -W "pull" -- "$cur") )
252
+ ;;
253
+ types)
254
+ COMPREPLY=( $(compgen -W "generate" -- "$cur") )
255
+ ;;
256
+ completion)
257
+ COMPREPLY=( $(compgen -W "install uninstall bash zsh fish" -- "$cur") )
258
+ ;;
259
+ validate)
260
+ if [[ \${COMP_CWORD} -eq 2 ]]; then
261
+ COMPREPLY=( $(compgen -W "$( _microcms_endpoint_candidates )" -- "$cur") )
262
+ else
263
+ COMPREPLY=( $(compgen -W "--file" -- "$cur") )
264
+ fi
265
+ ;;
266
+ *)
267
+ COMPREPLY=( $(compgen -W "$globals" -- "$cur") )
268
+ ;;
269
+ esac
270
+ }
271
+
272
+ complete -F _microcms_complete microcms
273
+ `;
274
+ }
275
+ function buildZshCompletionScript() {
276
+ const globals = GLOBAL_OPTIONS.join(" ");
277
+ return `#compdef microcms
278
+
279
+ _microcms_endpoints() {
280
+ local -a endpoints
281
+ endpoints=(\${(f)"$(microcms completion endpoints 2>/dev/null)"})
282
+ if (( \${#endpoints[@]} > 0 )); then
283
+ _describe 'endpoint' endpoints
284
+ fi
285
+ }
286
+
287
+ _microcms() {
288
+ local -a roots
289
+ roots=(api auth config completion content media schema types validate)
290
+ _arguments '*::arg:->args'
291
+
292
+ case $state in
293
+ args)
294
+ if (( CURRENT == 2 )); then
295
+ _describe 'command' roots
296
+ return
297
+ fi
298
+
299
+ local subcmd=$words[2]
300
+ local action=$words[3]
301
+
302
+ if [[ "$subcmd" == "api" && "$action" == "info" && CURRENT -eq 4 ]]; then
303
+ _microcms_endpoints
304
+ return
305
+ fi
306
+
307
+ if [[ "$subcmd" == "content" && CURRENT -eq 4 ]]; then
308
+ _microcms_endpoints
309
+ return
310
+ fi
311
+
312
+ if [[ "$subcmd" == "validate" && CURRENT -eq 3 ]]; then
313
+ _microcms_endpoints
314
+ return
315
+ fi
316
+
317
+ case $subcmd in
318
+ auth)
319
+ _values 'auth command' login status profile
320
+ ;;
321
+ api)
322
+ _values 'api command' list info
323
+ ;;
324
+ content)
325
+ _values 'content command' list get create update delete
326
+ ;;
327
+ media)
328
+ _values 'media command' upload
329
+ ;;
330
+ config)
331
+ _values 'config command' doctor
332
+ ;;
333
+ schema)
334
+ _values 'schema command' pull
335
+ ;;
336
+ types)
337
+ _values 'types command' generate
338
+ ;;
339
+ completion)
340
+ _values 'completion command' install uninstall bash zsh fish
341
+ ;;
342
+ validate)
343
+ _values 'option' --file
344
+ ;;
345
+ *)
346
+ _values 'global option' ${globals}
347
+ ;;
348
+ esac
349
+ ;;
350
+ esac
351
+ }
352
+
353
+ _microcms "$@"
354
+ `;
355
+ }
356
+ function buildFishCompletionScript() {
357
+ return `# microcms completion for fish
358
+ complete -c microcms -f
359
+
360
+ complete -c microcms -n '__fish_use_subcommand' -a 'api auth config completion content media schema types validate'
361
+
362
+ complete -c microcms -n '__fish_seen_subcommand_from auth' -a 'login status profile'
363
+ complete -c microcms -n '__fish_seen_subcommand_from api' -a 'list info'
364
+ complete -c microcms -n '__fish_seen_subcommand_from content' -a 'list get create update delete'
365
+ complete -c microcms -n '__fish_seen_subcommand_from media' -a 'upload'
366
+ complete -c microcms -n '__fish_seen_subcommand_from config' -a 'doctor'
367
+ complete -c microcms -n '__fish_seen_subcommand_from schema' -a 'pull'
368
+ complete -c microcms -n '__fish_seen_subcommand_from types' -a 'generate'
369
+ complete -c microcms -n '__fish_seen_subcommand_from completion' -a 'install uninstall bash zsh fish'
370
+
371
+ complete -c microcms -n '__fish_seen_subcommand_from api; and __fish_seen_subcommand_from info; and __fish_is_nth_token 3' -a '(microcms completion endpoints 2>/dev/null)'
372
+ complete -c microcms -n '__fish_seen_subcommand_from content; and __fish_is_nth_token 3' -a '(microcms completion endpoints 2>/dev/null)'
373
+ complete -c microcms -n '__fish_seen_subcommand_from validate; and __fish_is_nth_token 2' -a '(microcms completion endpoints 2>/dev/null)'
374
+
375
+ complete -c microcms -l json
376
+ complete -c microcms -l plain
377
+ complete -c microcms -l table
378
+ complete -c microcms -l select
379
+ complete -c microcms -l profile
380
+ complete -c microcms -l service-domain
381
+ complete -c microcms -l api-key
382
+ complete -c microcms -l api-key-stdin
383
+ complete -c microcms -l timeout
384
+ complete -c microcms -l retry
385
+ complete -c microcms -l retry-max-delay
386
+ complete -c microcms -l verbose
387
+ complete -c microcms -l no-color
388
+ `;
389
+ }
390
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerConfigCommands(program: Command): void;