@tronsfey/openapi2cli 1.0.10

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 (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +173 -0
  3. package/README.zh.md +173 -0
  4. package/bin/openapi2cli +2 -0
  5. package/dist/analyzer/schema-analyzer.d.ts +4 -0
  6. package/dist/analyzer/schema-analyzer.d.ts.map +1 -0
  7. package/dist/analyzer/schema-analyzer.js +329 -0
  8. package/dist/analyzer/schema-analyzer.js.map +1 -0
  9. package/dist/auth/auth-provider.d.ts +22 -0
  10. package/dist/auth/auth-provider.d.ts.map +1 -0
  11. package/dist/auth/auth-provider.js +100 -0
  12. package/dist/auth/auth-provider.js.map +1 -0
  13. package/dist/generator/command-generator.d.ts +3 -0
  14. package/dist/generator/command-generator.d.ts.map +1 -0
  15. package/dist/generator/command-generator.js +96 -0
  16. package/dist/generator/command-generator.js.map +1 -0
  17. package/dist/generator/template-engine.d.ts +2 -0
  18. package/dist/generator/template-engine.d.ts.map +1 -0
  19. package/dist/generator/template-engine.js +154 -0
  20. package/dist/generator/template-engine.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +135 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/parser/oas-parser.d.ts +3 -0
  26. package/dist/parser/oas-parser.d.ts.map +1 -0
  27. package/dist/parser/oas-parser.js +64 -0
  28. package/dist/parser/oas-parser.js.map +1 -0
  29. package/dist/templates/README.md.hbs +197 -0
  30. package/dist/templates/README.zh.md.hbs +197 -0
  31. package/dist/templates/SKILL.md.hbs +134 -0
  32. package/dist/templates/api-client.ts.hbs +217 -0
  33. package/dist/templates/command.ts.hbs +130 -0
  34. package/dist/templates/flat-commands.ts.hbs +126 -0
  35. package/dist/templates/index.ts.hbs +38 -0
  36. package/dist/templates/package.json.hbs +31 -0
  37. package/dist/templates/tsconfig.json.hbs +16 -0
  38. package/dist/types/index.d.ts +104 -0
  39. package/dist/types/index.d.ts.map +1 -0
  40. package/dist/types/index.js +3 -0
  41. package/dist/types/index.js.map +1 -0
  42. package/package.json +88 -0
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.analyzeSchema = analyzeSchema;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const pinyin_pro_1 = require("pinyin-pro");
9
+ const auth_provider_1 = require("../auth/auth-provider");
10
+ const HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'];
11
+ /** True if the string contains at least one CJK unified ideograph. */
12
+ const CJK_RE = /[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]/;
13
+ /**
14
+ * Convert CJK characters in a string to their pinyin romanization.
15
+ * Non-CJK characters are left unchanged. Tone marks are stripped.
16
+ * e.g. "创建用户" → "chuang jian yong hu"
17
+ * "getUserList" → "getUserList" (no-op)
18
+ */
19
+ function cjkToLatin(s) {
20
+ if (!CJK_RE.test(s))
21
+ return s;
22
+ return (0, pinyin_pro_1.pinyin)(s, { toneType: 'none', separator: ' ' });
23
+ }
24
+ function analyzeSchema(api, cliName) {
25
+ const warnings = [];
26
+ const { groups, flatCommands } = buildGroups(api, warnings);
27
+ const { authConfig, allAuthSchemes } = (0, auth_provider_1.extractAuthConfig)(api, cliName);
28
+ const baseUrl = extractBaseUrl(api);
29
+ return {
30
+ name: cliName,
31
+ description: api.info.description ?? `CLI for ${api.info.title}`,
32
+ version: api.info.version,
33
+ baseUrl,
34
+ groups,
35
+ flatCommands,
36
+ globalOptions: buildGlobalOptions(),
37
+ authConfig,
38
+ allAuthSchemes,
39
+ warnings,
40
+ };
41
+ }
42
+ function buildGroups(api, warnings) {
43
+ const groupMap = new Map();
44
+ const flatCommands = [];
45
+ // Seed from top-level tags (preserves defined order and descriptions)
46
+ for (const tag of api.tags ?? []) {
47
+ const converted = cjkToLatin(tag.name);
48
+ if (CJK_RE.test(tag.name)) {
49
+ const kebab = lodash_1.default.kebabCase(converted);
50
+ warnings.push(`[WARN] Tag "${tag.name}" 包含CJK字符,已自动转换为拼音: "${kebab}"`);
51
+ }
52
+ groupMap.set(tag.name, {
53
+ name: lodash_1.default.kebabCase(converted),
54
+ description: tag.description ?? tag.name,
55
+ subcommands: [],
56
+ });
57
+ }
58
+ // Walk every path and method
59
+ for (const [pathStr, pathItem] of Object.entries(api.paths ?? {})) {
60
+ if (!pathItem)
61
+ continue;
62
+ const pathLevelParams = (pathItem.parameters ?? []);
63
+ for (const method of HTTP_METHODS) {
64
+ const operation = pathItem[method];
65
+ if (!operation)
66
+ continue;
67
+ // x-cli-ignore: true → skip this operation entirely
68
+ if (operation['x-cli-ignore'] === true)
69
+ continue;
70
+ const subcommand = buildSubCommand(method, pathStr, operation, pathLevelParams, warnings);
71
+ const tags = operation.tags && operation.tags.length > 0 ? operation.tags : [];
72
+ if (tags.length === 0) {
73
+ flatCommands.push(subcommand);
74
+ }
75
+ else {
76
+ for (const tag of tags) {
77
+ if (!groupMap.has(tag)) {
78
+ const converted = cjkToLatin(tag);
79
+ if (CJK_RE.test(tag)) {
80
+ const kebab = lodash_1.default.kebabCase(converted);
81
+ warnings.push(`[WARN] Tag "${tag}" 包含CJK字符,已自动转换为拼音: "${kebab}"`);
82
+ }
83
+ groupMap.set(tag, {
84
+ name: lodash_1.default.kebabCase(converted),
85
+ description: tag,
86
+ subcommands: [],
87
+ });
88
+ }
89
+ groupMap.get(tag).subcommands.push(subcommand);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ const groups = Array.from(groupMap.values()).filter((g) => g.subcommands.length > 0);
95
+ return { groups, flatCommands };
96
+ }
97
+ function buildSubCommand(method, pathStr, operation, pathLevelParams, warnings) {
98
+ const name = operationToCommandName(operation, method, pathStr, warnings);
99
+ const opParams = (operation.parameters ?? []);
100
+ const mergedParams = mergeParameters(pathLevelParams, opParams);
101
+ const parameters = mergedParams.map(mapParameter);
102
+ const requestBody = operation.requestBody
103
+ ? mapRequestBody(operation.requestBody)
104
+ : undefined;
105
+ const options = buildOptions(parameters, requestBody);
106
+ const responses = buildResponses(operation.responses ?? {});
107
+ const securitySchemes = (operation.security ?? []).flatMap((s) => Object.keys(s));
108
+ // x-cli-aliases extension: ["ls", "list"]
109
+ const xAliases = operation['x-cli-aliases'];
110
+ const aliases = Array.isArray(xAliases) ? xAliases.map(String) : [];
111
+ // SSE detection: any 2xx response with text/event-stream content type
112
+ const streaming = detectStreaming(operation.responses ?? {});
113
+ return {
114
+ name,
115
+ description: operation.summary ?? operation.description ?? `${method.toUpperCase()} ${pathStr}`,
116
+ method,
117
+ path: pathStr,
118
+ parameters,
119
+ requestBody,
120
+ responses,
121
+ options,
122
+ securitySchemes,
123
+ aliases,
124
+ streaming,
125
+ };
126
+ }
127
+ function operationToCommandName(operation, method, pathStr, warnings) {
128
+ // x-cli-name extension takes highest priority
129
+ const xCliName = operation['x-cli-name'];
130
+ if (typeof xCliName === 'string' && xCliName) {
131
+ return lodash_1.default.kebabCase(cjkToLatin(xCliName));
132
+ }
133
+ if (operation.operationId) {
134
+ const hasCJK = CJK_RE.test(operation.operationId);
135
+ const converted = cjkToLatin(operation.operationId);
136
+ const name = lodash_1.default.kebabCase(converted);
137
+ if (hasCJK) {
138
+ warnings.push(`[WARN] operationId "${operation.operationId}" 包含CJK字符,已自动转换为拼音: "${name}"`);
139
+ }
140
+ return name;
141
+ }
142
+ // No operationId → path segments + method joined with underscores
143
+ const segments = pathStr
144
+ .split('/')
145
+ .filter((s) => s)
146
+ .map((seg) => {
147
+ const raw = seg.startsWith('{') && seg.endsWith('}') ? seg.slice(1, -1) : seg;
148
+ return lodash_1.default.snakeCase(cjkToLatin(raw));
149
+ });
150
+ const name = [...segments, method].join('_');
151
+ warnings.push(`[WARN] ${method.toUpperCase()} ${pathStr} 缺少 operationId,已使用路径+方法自动生成命令名: "${name}"`);
152
+ return name;
153
+ }
154
+ function mergeParameters(pathLevel, opLevel) {
155
+ const map = new Map();
156
+ for (const p of pathLevel)
157
+ map.set(`${p.in}:${p.name}`, p);
158
+ for (const p of opLevel)
159
+ map.set(`${p.in}:${p.name}`, p); // operation wins
160
+ return Array.from(map.values());
161
+ }
162
+ function mapParameter(p) {
163
+ const schema = (p.schema ?? {});
164
+ return {
165
+ name: p.name,
166
+ in: p.in,
167
+ description: p.description ?? p.name,
168
+ required: p.required ?? false,
169
+ schema: {
170
+ type: schema.type ?? 'string',
171
+ enum: schema.enum,
172
+ default: schema.default,
173
+ },
174
+ };
175
+ }
176
+ function mapRequestBody(rb) {
177
+ const contentType = Object.keys(rb.content ?? {})[0] ?? 'application/json';
178
+ const schema = rb.content?.[contentType]?.schema ?? {};
179
+ const requiredFields = schema.required ?? [];
180
+ const properties = (schema.properties ?? {});
181
+ const fields = Object.entries(properties).map(([name, prop]) => ({
182
+ name,
183
+ // Commander stores opts as camelCase of the kebab-case flag name
184
+ optKey: lodash_1.default.camelCase(lodash_1.default.kebabCase(name)),
185
+ type: prop.type ?? 'string',
186
+ required: requiredFields.includes(name),
187
+ description: prop.description ?? name,
188
+ enum: prop.enum,
189
+ }));
190
+ return {
191
+ description: rb.description ?? 'Request body',
192
+ required: rb.required ?? false,
193
+ contentType,
194
+ schema: schema,
195
+ fields,
196
+ };
197
+ }
198
+ /** Returns 'sse' when any 2xx response declares a text/event-stream content type. */
199
+ function detectStreaming(rawResponses) {
200
+ for (const [code, response] of Object.entries(rawResponses)) {
201
+ if (!code.startsWith('2'))
202
+ continue;
203
+ const r = response;
204
+ if (r.content && 'text/event-stream' in r.content)
205
+ return 'sse';
206
+ }
207
+ return undefined;
208
+ }
209
+ function buildOptions(parameters, requestBody) {
210
+ const options = parameters.map((p) => ({
211
+ name: lodash_1.default.kebabCase(p.name),
212
+ description: `[${p.in}] (${p.schema.type}) ${p.description}`,
213
+ required: p.required,
214
+ type: oasTypeToTS(p.schema.type),
215
+ defaultValue: p.schema.default,
216
+ enum: p.schema.enum,
217
+ }));
218
+ if (requestBody) {
219
+ if (requestBody.fields.length > 0) {
220
+ // Generate one flag per body field for ergonomic UX
221
+ for (const f of requestBody.fields) {
222
+ options.push({
223
+ name: lodash_1.default.kebabCase(f.name),
224
+ description: `[body] (${f.type}) ${f.description}${f.enum ? ` (choices: ${f.enum.join('|')})` : ''}`,
225
+ required: f.required && requestBody.required,
226
+ type: oasTypeToTS(f.type),
227
+ enum: f.enum,
228
+ });
229
+ }
230
+ // Always provide --data as an optional raw-JSON override
231
+ options.push({
232
+ name: 'data',
233
+ description: 'Override entire request body (JSON string or @filename)',
234
+ required: false,
235
+ type: 'string',
236
+ });
237
+ }
238
+ else {
239
+ // No schema fields known — fall back to raw --data
240
+ options.push({
241
+ name: 'data',
242
+ description: `${requestBody.description} (JSON string or @filename)`,
243
+ required: requestBody.required,
244
+ type: 'string',
245
+ });
246
+ }
247
+ }
248
+ return options;
249
+ }
250
+ function oasTypeToTS(oasType) {
251
+ if (oasType === 'integer' || oasType === 'number')
252
+ return 'number';
253
+ if (oasType === 'boolean')
254
+ return 'boolean';
255
+ return 'string';
256
+ }
257
+ function buildResponses(rawResponses) {
258
+ const result = {};
259
+ for (const [code, response] of Object.entries(rawResponses)) {
260
+ const r = response;
261
+ const contentType = r.content ? Object.keys(r.content)[0] : undefined;
262
+ let fields = [];
263
+ if (contentType) {
264
+ const schema = r.content?.[contentType]?.schema;
265
+ if (schema) {
266
+ const target = schema.type === 'array' ? (schema.items ?? {}) : schema;
267
+ const properties = (target.properties ?? {});
268
+ fields = Object.entries(properties).map(([name, prop]) => ({
269
+ name,
270
+ type: prop.type ?? 'string',
271
+ description: prop.description ?? name,
272
+ }));
273
+ }
274
+ }
275
+ result[code] = {
276
+ statusCode: code,
277
+ description: r.description,
278
+ contentType,
279
+ fields,
280
+ isArray: contentType
281
+ ? r.content?.[contentType]?.schema?.type === 'array'
282
+ : false,
283
+ };
284
+ }
285
+ return result;
286
+ }
287
+ function extractBaseUrl(api) {
288
+ const server = api.servers?.[0];
289
+ if (!server)
290
+ return 'http://localhost';
291
+ return server.url;
292
+ }
293
+ function buildGlobalOptions() {
294
+ return [
295
+ {
296
+ name: 'endpoint',
297
+ description: 'Override the base API URL',
298
+ required: false,
299
+ type: 'string',
300
+ },
301
+ {
302
+ name: 'format',
303
+ description: 'Output format',
304
+ required: false,
305
+ type: 'string',
306
+ defaultValue: 'json',
307
+ enum: ['json', 'yaml', 'table'],
308
+ },
309
+ {
310
+ name: 'query',
311
+ description: 'JMESPath expression to filter the response',
312
+ required: false,
313
+ type: 'string',
314
+ },
315
+ {
316
+ name: 'all-pages',
317
+ description: 'Auto-follow Link rel="next" headers to collect all pages',
318
+ required: false,
319
+ type: 'boolean',
320
+ },
321
+ {
322
+ name: 'verbose',
323
+ description: 'Enable verbose request/response logging',
324
+ required: false,
325
+ type: 'boolean',
326
+ },
327
+ ];
328
+ }
329
+ //# sourceMappingURL=schema-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-analyzer.js","sourceRoot":"","sources":["../../src/analyzer/schema-analyzer.ts"],"names":[],"mappings":";;;;;AAiCA,sCAkBC;AAlDD,oDAAuB;AACvB,2CAAoC;AACpC,yDAA0D;AAc1D,MAAM,YAAY,GAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAEhG,sEAAsE;AACtE,MAAM,MAAM,GAAG,2CAA2C,CAAC;AAE3D;;;;;GAKG;AACH,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,IAAA,mBAAM,EAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,SAAgB,aAAa,CAAC,GAAuB,EAAE,OAAe;IACpE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5D,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,IAAA,iCAAiB,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEpC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE;QAChE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO;QACzB,OAAO;QACP,MAAM;QACN,YAAY;QACZ,aAAa,EAAE,kBAAkB,EAAE;QACnC,UAAU;QACV,cAAc;QACd,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,GAAuB,EACvB,QAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,MAAM,YAAY,GAAiB,EAAE,CAAC;IAEtC,sEAAsE;IACtE,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,gBAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACrC,QAAQ,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,wBAAwB,KAAK,GAAG,CAAC,CAAC;QACzE,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;YACrB,IAAI,EAAE,gBAAC,CAAC,SAAS,CAAC,SAAS,CAAC;YAC5B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI;YACxC,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;IACL,CAAC;IAED,6BAA6B;IAC7B,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,MAAM,eAAe,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAgC,CAAC;QAEnF,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAA0C,CAAC;YAC5E,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,oDAAoD;YACpD,IAAK,SAAqC,CAAC,cAAc,CAAC,KAAK,IAAI;gBAAE,SAAS;YAE9E,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;YAC1F,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAE/E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACvB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;wBAClC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;4BACrB,MAAM,KAAK,GAAG,gBAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;4BACrC,QAAQ,CAAC,IAAI,CAAC,eAAe,GAAG,wBAAwB,KAAK,GAAG,CAAC,CAAC;wBACpE,CAAC;wBACD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;4BAChB,IAAI,EAAE,gBAAC,CAAC,SAAS,CAAC,SAAS,CAAC;4BAC5B,WAAW,EAAE,GAAG;4BAChB,WAAW,EAAE,EAAE;yBAChB,CAAC,CAAC;oBACL,CAAC;oBACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,eAAe,CACtB,MAAkB,EAClB,OAAe,EACf,SAAoC,EACpC,eAA4C,EAC5C,QAAkB;IAElB,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE1E,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAgC,CAAC;IAC7E,MAAM,YAAY,GAAG,eAAe,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAEhE,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW;QACvC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,WAA0C,CAAC;QACtE,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAElF,0CAA0C;IAC1C,MAAM,QAAQ,GAAI,SAAqC,CAAC,eAAe,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,QAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnF,sEAAsE;IACtE,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAE7D,OAAO;QACL,IAAI;QACJ,WAAW,EACT,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,WAAW,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,OAAO,EAAE;QACpF,MAAM;QACN,IAAI,EAAE,OAAO;QACb,UAAU;QACV,WAAW;QACX,SAAS;QACT,OAAO;QACP,eAAe;QACf,OAAO;QACP,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,SAAoC,EACpC,MAAkB,EAClB,OAAe,EACf,QAAkB;IAElB,8CAA8C;IAC9C,MAAM,QAAQ,GAAI,SAAqC,CAAC,YAAY,CAAC,CAAC;IACtE,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAC7C,OAAO,gBAAC,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,gBAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,CAAC,IAAI,CACX,uBAAuB,SAAS,CAAC,WAAW,wBAAwB,IAAI,GAAG,CAC5E,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kEAAkE;IAClE,MAAM,QAAQ,GAAG,OAAO;SACrB,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SAChB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9E,OAAO,gBAAC,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IACL,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,QAAQ,CAAC,IAAI,CACX,UAAU,MAAM,CAAC,WAAW,EAAE,IAAI,OAAO,qCAAqC,IAAI,GAAG,CACtF,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CACtB,SAAsC,EACtC,OAAoC;IAEpC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqC,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,SAAS;QAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB;IAC3E,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,CAA4B;IAChD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAA2B,CAAC;IAC1D,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,EAAE,EAAE,CAAC,CAAC,EAAqB;QAC3B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI;QACpC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,KAAK;QAC7B,MAAM,EAAE;YACN,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ;YAC7B,IAAI,EAAE,MAAM,CAAC,IAA4B;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,EAA+B;IACrD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC;IAC3E,MAAM,MAAM,GAAI,EAAE,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,MAAiC,IAAI,EAAE,CAAC;IACnF,MAAM,cAAc,GAAI,MAAM,CAAC,QAAqB,IAAI,EAAE,CAAC;IAC3D,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAA2C,CAAC;IAEvF,MAAM,MAAM,GAAuB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,IAAI;QACJ,iEAAiE;QACjE,MAAM,EAAE,gBAAC,CAAC,SAAS,CAAC,gBAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,QAAQ;QAC3B,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;QACvC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;QACrC,IAAI,EAAE,IAAI,CAAC,IAA4B;KACxC,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,cAAc;QAC7C,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,KAAK;QAC9B,WAAW;QACX,MAAM,EAAE,MAAiC;QACzC,MAAM;KACP,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,SAAS,eAAe,CACtB,YAAuC;IAEvC,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACpC,MAAM,CAAC,GAAG,QAAoC,CAAC;QAC/C,IAAI,CAAC,CAAC,OAAO,IAAI,mBAAmB,IAAI,CAAC,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;IAClE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,UAAuB,EAAE,WAAyB;IACtE,MAAM,OAAO,GAAa,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,EAAE,gBAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QACzB,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE;QAC5D,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAChC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,OAAiC;QACxD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;KACpB,CAAC,CAAC,CAAC;IAEJ,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,oDAAoD;YACpD,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,gBAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;oBACzB,WAAW,EAAE,WAAW,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACpG,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ;oBAC5C,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,CAAC,CAAC,IAAI;iBACb,CAAC,CAAC;YACL,CAAC;YACD,yDAAyD;YACzD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,yDAAyD;gBACtE,QAAQ,EAAE,KAAK;gBACf,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,mDAAmD;YACnD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,GAAG,WAAW,CAAC,WAAW,6BAA6B;gBACpE,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACnE,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CACrB,YAAuC;IAEvC,MAAM,MAAM,GAAgC,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,GAAG,QAAoC,CAAC;QAC/C,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEtE,IAAI,MAAM,GAAoB,EAAE,CAAC;QACjC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,MAA4C,CAAC;YACtF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,GACV,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,KAAgC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACtF,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAA2C,CAAC;gBACvF,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBACzD,IAAI;oBACJ,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,QAAQ;oBAC3B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;iBACtC,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG;YACb,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW;YACX,MAAM;YACN,OAAO,EAAE,WAAW;gBAClB,CAAC,CAAE,CAAC,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,MAA6C,EAAE,IAAI,KAAK,OAAO;gBAC5F,CAAC,CAAC,KAAK;SACV,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,GAAuB;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,OAAO,kBAAkB,CAAC;IACvC,OAAO,MAAM,CAAC,GAAG,CAAC;AACpB,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO;QACL;YACE,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,2BAA2B;YACxC,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,QAAQ;SACf;QACD;YACE,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,eAAe;YAC5B,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,MAAM;YACpB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;SAChC;QACD;YACE,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,4CAA4C;YACzD,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,QAAQ;SACf;QACD;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,0DAA0D;YACvE,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,SAAS;SAChB;QACD;YACE,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,yCAAyC;YACtD,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,SAAS;SAChB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { OpenAPIV3 } from 'openapi-types';
2
+ import { AuthConfig } from '../types/index';
3
+ /**
4
+ * Inspects the securitySchemes block and returns the primary auth configuration.
5
+ *
6
+ * Precedence (first match wins):
7
+ * bearer with x-cli-token-url → dynamic (custom token provider)
8
+ * oauth2 clientCredentials → oauth2-cc
9
+ * bearer → bearer
10
+ * apiKey → apiKey
11
+ * basic → basic
12
+ * oauth2 (other flows) → bearer (treat access token as bearer)
13
+ * none → none
14
+ *
15
+ * All env var names are prefixed with the CLI name in SCREAMING_SNAKE_CASE so
16
+ * multiple generated CLIs can coexist in the same shell environment.
17
+ */
18
+ export declare function extractAuthConfig(api: OpenAPIV3.Document, cliName: string): {
19
+ authConfig: AuthConfig;
20
+ allAuthSchemes: string[];
21
+ };
22
+ //# sourceMappingURL=auth-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-provider.d.ts","sourceRoot":"","sources":["../../src/auth/auth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAe,MAAM,gBAAgB,CAAC;AAWzD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,SAAS,CAAC,QAAQ,EACvB,OAAO,EAAE,MAAM,GACd;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAqFtD"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.extractAuthConfig = extractAuthConfig;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ /**
9
+ * Derives an environment variable name from the CLI name and a suffix.
10
+ * e.g. cliName="my-service" + suffix="TOKEN" → "MY_SERVICE_TOKEN"
11
+ * cliName="petstore-v2" + suffix="API_KEY" → "PETSTORE_V2_API_KEY"
12
+ */
13
+ function makeEnvVar(cliName, suffix) {
14
+ return `${lodash_1.default.snakeCase(cliName).toUpperCase()}_${suffix}`;
15
+ }
16
+ /**
17
+ * Inspects the securitySchemes block and returns the primary auth configuration.
18
+ *
19
+ * Precedence (first match wins):
20
+ * bearer with x-cli-token-url → dynamic (custom token provider)
21
+ * oauth2 clientCredentials → oauth2-cc
22
+ * bearer → bearer
23
+ * apiKey → apiKey
24
+ * basic → basic
25
+ * oauth2 (other flows) → bearer (treat access token as bearer)
26
+ * none → none
27
+ *
28
+ * All env var names are prefixed with the CLI name in SCREAMING_SNAKE_CASE so
29
+ * multiple generated CLIs can coexist in the same shell environment.
30
+ */
31
+ function extractAuthConfig(api, cliName) {
32
+ const schemes = (api.components?.securitySchemes ?? {});
33
+ const allAuthSchemes = Object.keys(schemes);
34
+ let authConfig = { type: 'none', envVar: '' };
35
+ for (const scheme of Object.values(schemes)) {
36
+ const ext = scheme;
37
+ // ── dynamic (bearer + x-cli-token-url extension) ─────────────────────────
38
+ if (scheme.type === 'http' &&
39
+ scheme.scheme === 'bearer' &&
40
+ typeof ext['x-cli-token-url'] === 'string') {
41
+ const rawEnvVars = ext['x-cli-token-env-vars'];
42
+ const tokenEnvVars = Array.isArray(rawEnvVars)
43
+ ? rawEnvVars.map((v) => ({
44
+ name: String(v.name),
45
+ env: String(v.env),
46
+ }))
47
+ : [];
48
+ authConfig = {
49
+ type: 'dynamic',
50
+ envVar: '',
51
+ tokenUrl: ext['x-cli-token-url'],
52
+ tokenEnvVars,
53
+ };
54
+ break;
55
+ }
56
+ // ── oauth2 client credentials ─────────────────────────────────────────────
57
+ if (scheme.type === 'oauth2') {
58
+ const oauth2 = scheme;
59
+ const ccFlow = oauth2.flows.clientCredentials;
60
+ if (ccFlow) {
61
+ authConfig = {
62
+ type: 'oauth2-cc',
63
+ envVar: '',
64
+ tokenUrl: ccFlow.tokenUrl,
65
+ clientIdEnvVar: makeEnvVar(cliName, 'CLIENT_ID'),
66
+ clientSecretEnvVar: makeEnvVar(cliName, 'CLIENT_SECRET'),
67
+ scopesEnvVar: makeEnvVar(cliName, 'SCOPES'),
68
+ };
69
+ break;
70
+ }
71
+ // Other OAuth2 flows — treat resulting access token as bearer
72
+ authConfig = { type: 'bearer', envVar: makeEnvVar(cliName, 'TOKEN') };
73
+ break;
74
+ }
75
+ // ── bearer ────────────────────────────────────────────────────────────────
76
+ if (scheme.type === 'http' &&
77
+ scheme.scheme === 'bearer') {
78
+ authConfig = { type: 'bearer', envVar: makeEnvVar(cliName, 'TOKEN') };
79
+ break;
80
+ }
81
+ // ── apiKey ────────────────────────────────────────────────────────────────
82
+ if (scheme.type === 'apiKey') {
83
+ const ks = scheme;
84
+ authConfig = {
85
+ type: 'apiKey',
86
+ headerName: ks.name,
87
+ envVar: makeEnvVar(cliName, 'API_KEY'),
88
+ };
89
+ break;
90
+ }
91
+ // ── basic ─────────────────────────────────────────────────────────────────
92
+ if (scheme.type === 'http' &&
93
+ scheme.scheme === 'basic') {
94
+ authConfig = { type: 'basic', envVar: makeEnvVar(cliName, 'CREDENTIALS') };
95
+ break;
96
+ }
97
+ }
98
+ return { authConfig, allAuthSchemes };
99
+ }
100
+ //# sourceMappingURL=auth-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-provider.js","sourceRoot":"","sources":["../../src/auth/auth-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { CommandStructure, GeneratedFile } from '../types/index';
2
+ export declare function generateProject(structure: CommandStructure): Promise<GeneratedFile[]>;
3
+ //# sourceMappingURL=command-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-generator.d.ts","sourceRoot":"","sources":["../../src/generator/command-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGjE,wBAAsB,eAAe,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAkE3F"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateProject = generateProject;
37
+ const path = __importStar(require("path"));
38
+ const template_engine_1 = require("./template-engine");
39
+ async function generateProject(structure) {
40
+ const files = [];
41
+ // 1. package.json for the generated CLI
42
+ files.push({
43
+ relativePath: 'package.json',
44
+ content: await (0, template_engine_1.renderTemplate)('package.json.hbs', { structure }),
45
+ });
46
+ // 2. tsconfig.json
47
+ files.push({
48
+ relativePath: 'tsconfig.json',
49
+ content: await (0, template_engine_1.renderTemplate)('tsconfig.json.hbs', { structure }),
50
+ });
51
+ // 3. Main entry: src/index.ts
52
+ files.push({
53
+ relativePath: path.join('src', 'index.ts'),
54
+ content: await (0, template_engine_1.renderTemplate)('index.ts.hbs', { structure }),
55
+ });
56
+ // 4. One command file per group: src/commands/<group-name>.ts
57
+ for (const group of structure.groups) {
58
+ files.push({
59
+ relativePath: path.join('src', 'commands', `${group.name}.ts`),
60
+ content: await (0, template_engine_1.renderTemplate)('command.ts.hbs', { structure, group }),
61
+ });
62
+ }
63
+ // 4b. Flat commands (untagged operations): src/flat-commands.ts
64
+ if (structure.flatCommands.length > 0) {
65
+ files.push({
66
+ relativePath: path.join('src', 'flat-commands.ts'),
67
+ content: await (0, template_engine_1.renderTemplate)('flat-commands.ts.hbs', { structure, flatCommands: structure.flatCommands }),
68
+ });
69
+ }
70
+ // 5. Shared API client: src/lib/api-client.ts
71
+ files.push({
72
+ relativePath: path.join('src', 'lib', 'api-client.ts'),
73
+ content: await (0, template_engine_1.renderTemplate)('api-client.ts.hbs', { structure }),
74
+ });
75
+ // 6. README (English default + Chinese)
76
+ files.push({
77
+ relativePath: 'README.md',
78
+ content: await (0, template_engine_1.renderTemplate)('README.md.hbs', { structure }),
79
+ });
80
+ files.push({
81
+ relativePath: 'README.zh.md',
82
+ content: await (0, template_engine_1.renderTemplate)('README.zh.md.hbs', { structure }),
83
+ });
84
+ // 7. SKILL.md — Claude Code skill descriptor
85
+ files.push({
86
+ relativePath: 'SKILL.md',
87
+ content: await (0, template_engine_1.renderTemplate)('SKILL.md.hbs', { structure }),
88
+ });
89
+ // 8. bin shebang wrapper
90
+ files.push({
91
+ relativePath: path.join('bin', structure.name),
92
+ content: `#!/usr/bin/env node\nrequire('../dist/index.js');\n`,
93
+ });
94
+ return files;
95
+ }
96
+ //# sourceMappingURL=command-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-generator.js","sourceRoot":"","sources":["../../src/generator/command-generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,0CAkEC;AAtED,2CAA6B;AAE7B,uDAAmD;AAE5C,KAAK,UAAU,eAAe,CAAC,SAA2B;IAC/D,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,wCAAwC;IACxC,KAAK,CAAC,IAAI,CAAC;QACT,YAAY,EAAE,cAAc;QAC5B,OAAO,EAAE,MAAM,IAAA,gCAAc,EAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,CAAC;KACjE,CAAC,CAAC;IAEH,mBAAmB;IACnB,KAAK,CAAC,IAAI,CAAC;QACT,YAAY,EAAE,eAAe;QAC7B,OAAO,EAAE,MAAM,IAAA,gCAAc,EAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,CAAC;KAClE,CAAC,CAAC;IAEH,8BAA8B;IAC9B,KAAK,CAAC,IAAI,CAAC;QACT,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC;QAC1C,OAAO,EAAE,MAAM,IAAA,gCAAc,EAAC,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC;KAC7D,CAAC,CAAC;IAEH,8DAA8D;IAC9D,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC;YACT,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC;YAC9D,OAAO,EAAE,MAAM,IAAA,gCAAc,EAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;IAED,gEAAgE;IAChE,IAAI,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC;YACT,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,CAAC;YAClD,OAAO,EAAE,MAAM,IAAA,gCAAc,EAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;SAC3G,CAAC,CAAC;IACL,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,IAAI,CAAC;QACT,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,CAAC;QACtD,OAAO,EAAE,MAAM,IAAA,gCAAc,EAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,CAAC;KAClE,CAAC,CAAC;IAEH,wCAAwC;IACxC,KAAK,CAAC,IAAI,CAAC;QACT,YAAY,EAAE,WAAW;QACzB,OAAO,EAAE,MAAM,IAAA,gCAAc,EAAC,eAAe,EAAE,EAAE,SAAS,EAAE,CAAC;KAC9D,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,CAAC;QACT,YAAY,EAAE,cAAc;QAC5B,OAAO,EAAE,MAAM,IAAA,gCAAc,EAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,CAAC;KACjE,CAAC,CAAC;IAEH,6CAA6C;IAC7C,KAAK,CAAC,IAAI,CAAC;QACT,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,MAAM,IAAA,gCAAc,EAAC,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC;KAC7D,CAAC,CAAC;IAEH,yBAAyB;IACzB,KAAK,CAAC,IAAI,CAAC;QACT,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;QAC9C,OAAO,EAAE,qDAAqD;KAC/D,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function renderTemplate(templateName: string, context: Record<string, unknown>): Promise<string>;
2
+ //# sourceMappingURL=template-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.d.ts","sourceRoot":"","sources":["../../src/generator/template-engine.ts"],"names":[],"mappings":"AAYA,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC,CAKjB"}