boohee-cli 1.0.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 (212) hide show
  1. package/README.md +207 -0
  2. package/bin/run.js +75 -0
  3. package/dist/base.d.ts +21 -0
  4. package/dist/base.d.ts.map +1 -0
  5. package/dist/base.js +77 -0
  6. package/dist/base.js.map +1 -0
  7. package/dist/commands/auth/status.d.ts +7 -0
  8. package/dist/commands/auth/status.d.ts.map +1 -0
  9. package/dist/commands/auth/status.js +28 -0
  10. package/dist/commands/auth/status.js.map +1 -0
  11. package/dist/commands/batch.d.ts +15 -0
  12. package/dist/commands/batch.d.ts.map +1 -0
  13. package/dist/commands/batch.js +63 -0
  14. package/dist/commands/batch.js.map +1 -0
  15. package/dist/commands/categories.d.ts +7 -0
  16. package/dist/commands/categories.d.ts.map +1 -0
  17. package/dist/commands/categories.js +14 -0
  18. package/dist/commands/categories.js.map +1 -0
  19. package/dist/commands/config/get.d.ts +10 -0
  20. package/dist/commands/config/get.d.ts.map +1 -0
  21. package/dist/commands/config/get.js +29 -0
  22. package/dist/commands/config/get.js.map +1 -0
  23. package/dist/commands/config/init.d.ts +12 -0
  24. package/dist/commands/config/init.d.ts.map +1 -0
  25. package/dist/commands/config/init.js +38 -0
  26. package/dist/commands/config/init.js.map +1 -0
  27. package/dist/commands/config/list.d.ts +7 -0
  28. package/dist/commands/config/list.d.ts.map +1 -0
  29. package/dist/commands/config/list.js +19 -0
  30. package/dist/commands/config/list.js.map +1 -0
  31. package/dist/commands/config/reset.d.ts +7 -0
  32. package/dist/commands/config/reset.d.ts.map +1 -0
  33. package/dist/commands/config/reset.js +20 -0
  34. package/dist/commands/config/reset.js.map +1 -0
  35. package/dist/commands/config/set.d.ts +11 -0
  36. package/dist/commands/config/set.d.ts.map +1 -0
  37. package/dist/commands/config/set.js +43 -0
  38. package/dist/commands/config/set.js.map +1 -0
  39. package/dist/commands/detail.d.ts +10 -0
  40. package/dist/commands/detail.d.ts.map +1 -0
  41. package/dist/commands/detail.js +27 -0
  42. package/dist/commands/detail.js.map +1 -0
  43. package/dist/commands/food/categories.d.ts +13 -0
  44. package/dist/commands/food/categories.d.ts.map +1 -0
  45. package/dist/commands/food/categories.js +28 -0
  46. package/dist/commands/food/categories.js.map +1 -0
  47. package/dist/commands/food/detail.d.ts +18 -0
  48. package/dist/commands/food/detail.d.ts.map +1 -0
  49. package/dist/commands/food/detail.js +44 -0
  50. package/dist/commands/food/detail.js.map +1 -0
  51. package/dist/commands/food/image-recognize-detail.d.ts +13 -0
  52. package/dist/commands/food/image-recognize-detail.d.ts.map +1 -0
  53. package/dist/commands/food/image-recognize-detail.js +26 -0
  54. package/dist/commands/food/image-recognize-detail.js.map +1 -0
  55. package/dist/commands/food/image-recognize.d.ts +13 -0
  56. package/dist/commands/food/image-recognize.d.ts.map +1 -0
  57. package/dist/commands/food/image-recognize.js +29 -0
  58. package/dist/commands/food/image-recognize.js.map +1 -0
  59. package/dist/commands/food/index.d.ts +7 -0
  60. package/dist/commands/food/index.d.ts.map +1 -0
  61. package/dist/commands/food/index.js +10 -0
  62. package/dist/commands/food/index.js.map +1 -0
  63. package/dist/commands/food/ingredients.d.ts +13 -0
  64. package/dist/commands/food/ingredients.d.ts.map +1 -0
  65. package/dist/commands/food/ingredients.js +31 -0
  66. package/dist/commands/food/ingredients.js.map +1 -0
  67. package/dist/commands/food/list.d.ts +20 -0
  68. package/dist/commands/food/list.d.ts.map +1 -0
  69. package/dist/commands/food/list.js +37 -0
  70. package/dist/commands/food/list.js.map +1 -0
  71. package/dist/commands/food/ranks.d.ts +17 -0
  72. package/dist/commands/food/ranks.d.ts.map +1 -0
  73. package/dist/commands/food/ranks.js +39 -0
  74. package/dist/commands/food/ranks.js.map +1 -0
  75. package/dist/commands/food/search.d.ts +18 -0
  76. package/dist/commands/food/search.d.ts.map +1 -0
  77. package/dist/commands/food/search.js +57 -0
  78. package/dist/commands/food/search.js.map +1 -0
  79. package/dist/commands/food/text-recognize.d.ts +13 -0
  80. package/dist/commands/food/text-recognize.d.ts.map +1 -0
  81. package/dist/commands/food/text-recognize.js +26 -0
  82. package/dist/commands/food/text-recognize.js.map +1 -0
  83. package/dist/commands/food/units.d.ts +10 -0
  84. package/dist/commands/food/units.d.ts.map +1 -0
  85. package/dist/commands/food/units.js +23 -0
  86. package/dist/commands/food/units.js.map +1 -0
  87. package/dist/commands/index.d.ts +6 -0
  88. package/dist/commands/index.d.ts.map +1 -0
  89. package/dist/commands/index.js +62 -0
  90. package/dist/commands/index.js.map +1 -0
  91. package/dist/commands/meta.d.ts +11 -0
  92. package/dist/commands/meta.d.ts.map +1 -0
  93. package/dist/commands/meta.js +76 -0
  94. package/dist/commands/meta.js.map +1 -0
  95. package/dist/commands/rank.d.ts +10 -0
  96. package/dist/commands/rank.d.ts.map +1 -0
  97. package/dist/commands/rank.js +26 -0
  98. package/dist/commands/rank.js.map +1 -0
  99. package/dist/commands/raw.d.ts +19 -0
  100. package/dist/commands/raw.d.ts.map +1 -0
  101. package/dist/commands/raw.js +63 -0
  102. package/dist/commands/raw.js.map +1 -0
  103. package/dist/commands/recognize-image.d.ts +16 -0
  104. package/dist/commands/recognize-image.d.ts.map +1 -0
  105. package/dist/commands/recognize-image.js +106 -0
  106. package/dist/commands/recognize-image.js.map +1 -0
  107. package/dist/commands/recognize.d.ts +16 -0
  108. package/dist/commands/recognize.d.ts.map +1 -0
  109. package/dist/commands/recognize.js +43 -0
  110. package/dist/commands/recognize.js.map +1 -0
  111. package/dist/commands/search.d.ts +10 -0
  112. package/dist/commands/search.d.ts.map +1 -0
  113. package/dist/commands/search.js +28 -0
  114. package/dist/commands/search.js.map +1 -0
  115. package/dist/commands/version.d.ts +7 -0
  116. package/dist/commands/version.d.ts.map +1 -0
  117. package/dist/commands/version.js +10 -0
  118. package/dist/commands/version.js.map +1 -0
  119. package/dist/hooks/prerun.d.ts +4 -0
  120. package/dist/hooks/prerun.d.ts.map +1 -0
  121. package/dist/hooks/prerun.js +24 -0
  122. package/dist/hooks/prerun.js.map +1 -0
  123. package/dist/index.d.ts +2 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +3 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/lib/api/client.d.ts +25 -0
  128. package/dist/lib/api/client.d.ts.map +1 -0
  129. package/dist/lib/api/client.js +59 -0
  130. package/dist/lib/api/client.js.map +1 -0
  131. package/dist/lib/api/endpoints.d.ts +17 -0
  132. package/dist/lib/api/endpoints.d.ts.map +1 -0
  133. package/dist/lib/api/endpoints.js +18 -0
  134. package/dist/lib/api/endpoints.js.map +1 -0
  135. package/dist/lib/api/index.d.ts +4 -0
  136. package/dist/lib/api/index.d.ts.map +1 -0
  137. package/dist/lib/api/index.js +5 -0
  138. package/dist/lib/api/index.js.map +1 -0
  139. package/dist/lib/api/interceptors.d.ts +3 -0
  140. package/dist/lib/api/interceptors.d.ts.map +1 -0
  141. package/dist/lib/api/interceptors.js +44 -0
  142. package/dist/lib/api/interceptors.js.map +1 -0
  143. package/dist/lib/api/types.d.ts +65 -0
  144. package/dist/lib/api/types.d.ts.map +1 -0
  145. package/dist/lib/api/types.js +2 -0
  146. package/dist/lib/api/types.js.map +1 -0
  147. package/dist/lib/auth.d.ts +17 -0
  148. package/dist/lib/auth.d.ts.map +1 -0
  149. package/dist/lib/auth.js +51 -0
  150. package/dist/lib/auth.js.map +1 -0
  151. package/dist/lib/cache.d.ts +13 -0
  152. package/dist/lib/cache.d.ts.map +1 -0
  153. package/dist/lib/cache.js +64 -0
  154. package/dist/lib/cache.js.map +1 -0
  155. package/dist/lib/config.d.ts +22 -0
  156. package/dist/lib/config.d.ts.map +1 -0
  157. package/dist/lib/config.js +139 -0
  158. package/dist/lib/config.js.map +1 -0
  159. package/dist/lib/errors/api-error.d.ts +18 -0
  160. package/dist/lib/errors/api-error.d.ts.map +1 -0
  161. package/dist/lib/errors/api-error.js +24 -0
  162. package/dist/lib/errors/api-error.js.map +1 -0
  163. package/dist/lib/errors/auth-error.d.ts +16 -0
  164. package/dist/lib/errors/auth-error.d.ts.map +1 -0
  165. package/dist/lib/errors/auth-error.js +21 -0
  166. package/dist/lib/errors/auth-error.js.map +1 -0
  167. package/dist/lib/errors/base.d.ts +10 -0
  168. package/dist/lib/errors/base.d.ts.map +1 -0
  169. package/dist/lib/errors/base.js +21 -0
  170. package/dist/lib/errors/base.js.map +1 -0
  171. package/dist/lib/errors/config-error.d.ts +12 -0
  172. package/dist/lib/errors/config-error.d.ts.map +1 -0
  173. package/dist/lib/errors/config-error.js +20 -0
  174. package/dist/lib/errors/config-error.js.map +1 -0
  175. package/dist/lib/errors/index.d.ts +6 -0
  176. package/dist/lib/errors/index.d.ts.map +1 -0
  177. package/dist/lib/errors/index.js +7 -0
  178. package/dist/lib/errors/index.js.map +1 -0
  179. package/dist/lib/errors/validation-error.d.ts +13 -0
  180. package/dist/lib/errors/validation-error.d.ts.map +1 -0
  181. package/dist/lib/errors/validation-error.js +27 -0
  182. package/dist/lib/errors/validation-error.js.map +1 -0
  183. package/dist/lib/logger.d.ts +20 -0
  184. package/dist/lib/logger.d.ts.map +1 -0
  185. package/dist/lib/logger.js +63 -0
  186. package/dist/lib/logger.js.map +1 -0
  187. package/dist/lib/output/formatter.d.ts +9 -0
  188. package/dist/lib/output/formatter.d.ts.map +1 -0
  189. package/dist/lib/output/formatter.js +8 -0
  190. package/dist/lib/output/formatter.js.map +1 -0
  191. package/dist/lib/output/index.d.ts +8 -0
  192. package/dist/lib/output/index.d.ts.map +1 -0
  193. package/dist/lib/output/index.js +19 -0
  194. package/dist/lib/output/index.js.map +1 -0
  195. package/dist/lib/output/json.d.ts +8 -0
  196. package/dist/lib/output/json.d.ts.map +1 -0
  197. package/dist/lib/output/json.js +16 -0
  198. package/dist/lib/output/json.js.map +1 -0
  199. package/dist/lib/output/table.d.ts +17 -0
  200. package/dist/lib/output/table.d.ts.map +1 -0
  201. package/dist/lib/output/table.js +108 -0
  202. package/dist/lib/output/table.js.map +1 -0
  203. package/dist/lib/output/yaml.d.ts +8 -0
  204. package/dist/lib/output/yaml.d.ts.map +1 -0
  205. package/dist/lib/output/yaml.js +18 -0
  206. package/dist/lib/output/yaml.js.map +1 -0
  207. package/dist/types.d.ts +249 -0
  208. package/dist/types.d.ts.map +1 -0
  209. package/dist/types.js +3 -0
  210. package/dist/types.js.map +1 -0
  211. package/package.json +76 -0
  212. package/resources/config-template.json +17 -0
@@ -0,0 +1,17 @@
1
+ import { BaseCommand } from '../../base.js';
2
+ export default class FoodRanks extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ ingredient: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ sort: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
+ tag: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ 'machine-readable': import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ };
15
+ run(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=ranks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranks.d.ts","sourceRoot":"","sources":["../../../src/commands/food/ranks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAG3C,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,WAAW,SAAkC;IAEpD,MAAM,CAAC,QAAQ,WAGd;IAED,MAAM,CAAC,IAAI;;MAKV;IAED,MAAM,CAAC,KAAK;;;;;;MAUX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB3B"}
@@ -0,0 +1,39 @@
1
+ // src/commands/food/ranks.ts
2
+ import { Flags, Args } from '@oclif/core';
3
+ import { BaseCommand } from '../../base.js';
4
+ import { ApiClient } from '../../lib/api/index.js';
5
+ export default class FoodRanks extends BaseCommand {
6
+ static description = 'Get food rankings by nutrient';
7
+ static examples = [
8
+ '<%= config.bin %> food ranks --ingredient 蛋白质',
9
+ '<%= config.bin %> food ranks --ingredient 维生素C --tag 水果',
10
+ ];
11
+ static args = {
12
+ ingredient: Args.string({
13
+ description: 'Nutrient name for ranking',
14
+ required: true,
15
+ }),
16
+ };
17
+ static flags = {
18
+ ...BaseCommand.baseFlags,
19
+ sort: Flags.string({
20
+ description: 'Sort order: 0=ascending, 1=descending',
21
+ options: ['0', '1'],
22
+ default: '0',
23
+ }),
24
+ tag: Flags.string({
25
+ description: 'Food tag filter',
26
+ }),
27
+ };
28
+ async run() {
29
+ const { args, flags } = await this.parse(FoodRanks);
30
+ const client = new ApiClient(this.getApiKey(), undefined, undefined, this.debugLog.bind(this));
31
+ const result = await client.foodRanks({
32
+ ingredient: args.ingredient,
33
+ sort: flags.sort,
34
+ tag: flags.tag,
35
+ });
36
+ this.output(result);
37
+ }
38
+ }
39
+ //# sourceMappingURL=ranks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranks.js","sourceRoot":"","sources":["../../../src/commands/food/ranks.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,WAAW,GAAG,+BAA+B,CAAA;IAEpD,MAAM,CAAC,QAAQ,GAAG;QAChB,+CAA+C;QAC/C,yDAAyD;KAC1D,CAAA;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,WAAW,EAAE,2BAA2B;YACxC,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,WAAW,CAAC,SAAS;QACxB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,uCAAuC;YACpD,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;YACnB,OAAO,EAAE,GAAG;SACb,CAAC;QACF,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,iBAAiB;SAC/B,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAEnD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,IAAI,CAAC,SAAS,EAAE,EAChB,SAAS,EACT,SAAS,EACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACpC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,IAAI,EAAE,KAAK,CAAC,IAAiB;YAC7B,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { BaseCommand } from '../../base.js';
2
+ export default class FoodSearch extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ keyword: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ barcode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ page: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
9
+ 'per-page': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
10
+ sort: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ 'with-units': import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ 'machine-readable': import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ };
16
+ run(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/food/search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAI3C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,WAAW,SAAqB;IAEvC,MAAM,CAAC,QAAQ,WAId;IAED,MAAM,CAAC,KAAK;;;;;;;;;;MA0BX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA0B3B"}
@@ -0,0 +1,57 @@
1
+ // src/commands/food/search.ts
2
+ import { Flags } from '@oclif/core';
3
+ import { BaseCommand } from '../../base.js';
4
+ import { ApiClient } from '../../lib/api/index.js';
5
+ export default class FoodSearch extends BaseCommand {
6
+ static description = 'Search for foods';
7
+ static examples = [
8
+ '<%= config.bin %> food search --keyword 苹果',
9
+ '<%= config.bin %> food search --keyword 苹果 --sort calorie_desc',
10
+ '<%= config.bin %> food search --barcode 6901234567890',
11
+ ];
12
+ static flags = {
13
+ ...BaseCommand.baseFlags,
14
+ keyword: Flags.string({
15
+ description: 'Search keyword',
16
+ exclusive: ['barcode'],
17
+ }),
18
+ barcode: Flags.string({
19
+ description: 'Food barcode (13 digits)',
20
+ exclusive: ['keyword'],
21
+ }),
22
+ page: Flags.integer({
23
+ description: 'Page number',
24
+ default: 1,
25
+ }),
26
+ 'per-page': Flags.integer({
27
+ description: 'Items per page',
28
+ default: 20,
29
+ }),
30
+ sort: Flags.string({
31
+ description: 'Sort order',
32
+ options: ['calorie_asc', 'calorie_desc'],
33
+ }),
34
+ 'with-units': Flags.boolean({
35
+ description: 'Include units data',
36
+ default: false,
37
+ }),
38
+ };
39
+ async run() {
40
+ const { flags } = await this.parse(FoodSearch);
41
+ if (!flags.keyword && !flags.barcode) {
42
+ this.error('Either --keyword or --barcode is required');
43
+ }
44
+ const client = new ApiClient(this.getApiKey(), undefined, undefined, this.debugLog.bind(this));
45
+ const params = {
46
+ keyword: flags.keyword,
47
+ barcode: flags.barcode,
48
+ page: flags.page,
49
+ per_page: flags['per-page'],
50
+ sort: flags.sort,
51
+ with_units: flags['with-units'],
52
+ };
53
+ const result = await client.foodSearch(params);
54
+ this.output(result);
55
+ }
56
+ }
57
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/commands/food/search.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAGlD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,WAAW,GAAG,kBAAkB,CAAA;IAEvC,MAAM,CAAC,QAAQ,GAAG;QAChB,4CAA4C;QAC5C,gEAAgE;QAChE,uDAAuD;KACxD,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,WAAW,CAAC,SAAS;QACxB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,gBAAgB;YAC7B,SAAS,EAAE,CAAC,SAAS,CAAC;SACvB,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,0BAA0B;YACvC,SAAS,EAAE,CAAC,SAAS,CAAC;SACvB,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;YAClB,WAAW,EAAE,aAAa;YAC1B,OAAO,EAAE,CAAC;SACX,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC;YACxB,WAAW,EAAE,gBAAgB;YAC7B,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,YAAY;YACzB,OAAO,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC;SACzC,CAAC;QACF,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC;YAC1B,WAAW,EAAE,oBAAoB;YACjC,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAE9C,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAA;QACzD,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,IAAI,CAAC,SAAS,EAAE,EAChB,SAAS,EACT,SAAS,EACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB,CAAA;QAED,MAAM,MAAM,GAAqB;YAC/B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC;YAC3B,IAAI,EAAE,KAAK,CAAC,IAAsC;YAClD,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC;SAChC,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { BaseCommand } from '../../base.js';
2
+ export default class TextRecognize extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ text: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
+ output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ 'machine-readable': import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ };
11
+ run(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=text-recognize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-recognize.d.ts","sourceRoot":"","sources":["../../../src/commands/food/text-recognize.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAG3C,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,WAAW,SAA8C;IAEhE,MAAM,CAAC,QAAQ,WAEd;IAED,MAAM,CAAC,KAAK;;;;;MAMX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB3B"}
@@ -0,0 +1,26 @@
1
+ // src/commands/food/text-recognize.ts
2
+ import { Flags } from '@oclif/core';
3
+ import { BaseCommand } from '../../base.js';
4
+ import { ApiClient } from '../../lib/api/index.js';
5
+ export default class TextRecognize extends BaseCommand {
6
+ static description = 'Recognize food from natural language text';
7
+ static examples = [
8
+ '<%= config.bin %> food text-recognize --text "早上喝了一杯牛奶"',
9
+ ];
10
+ static flags = {
11
+ ...BaseCommand.baseFlags,
12
+ text: Flags.string({
13
+ description: 'Natural language description',
14
+ required: true,
15
+ }),
16
+ };
17
+ async run() {
18
+ const { flags } = await this.parse(TextRecognize);
19
+ const client = new ApiClient(this.getApiKey(), undefined, undefined, this.debugLog.bind(this));
20
+ const result = await client.textRecognize({
21
+ text: flags.text,
22
+ });
23
+ this.output(result);
24
+ }
25
+ }
26
+ //# sourceMappingURL=text-recognize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-recognize.js","sourceRoot":"","sources":["../../../src/commands/food/text-recognize.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,WAAW,GAAG,2CAA2C,CAAA;IAEhE,MAAM,CAAC,QAAQ,GAAG;QAChB,yDAAyD;KAC1D,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,WAAW,CAAC,SAAS;QACxB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,8BAA8B;YAC3C,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;QAEjD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,IAAI,CAAC,SAAS,EAAE,EAChB,SAAS,EACT,SAAS,EACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACxC,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { BaseCommand } from '../../base.js';
2
+ export default class FoodUnits extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ code: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=units.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"units.d.ts","sourceRoot":"","sources":["../../../src/commands/food/units.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAG3C,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,WAAW,SAA2B;IAE7C,MAAM,CAAC,QAAQ,WAAyC;IAExD,MAAM,CAAC,IAAI;;MAKV;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB3B"}
@@ -0,0 +1,23 @@
1
+ // src/commands/food/units.ts
2
+ import { Args } from '@oclif/core';
3
+ import { BaseCommand } from '../../base.js';
4
+ import { ApiClient } from '../../lib/api/index.js';
5
+ export default class FoodUnits extends BaseCommand {
6
+ static description = 'Get food units by code';
7
+ static examples = ['<%= config.bin %> food units 10001'];
8
+ static args = {
9
+ code: Args.string({
10
+ description: 'Food code',
11
+ required: true,
12
+ }),
13
+ };
14
+ async run() {
15
+ const { args, flags } = await this.parse(FoodUnits);
16
+ const client = new ApiClient(this.getApiKey(), undefined, undefined, this.debugLog.bind(this));
17
+ const result = await client.foodUnits({
18
+ code: args.code,
19
+ });
20
+ this.output(result);
21
+ }
22
+ }
23
+ //# sourceMappingURL=units.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"units.js","sourceRoot":"","sources":["../../../src/commands/food/units.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,WAAW,GAAG,wBAAwB,CAAA;IAE7C,MAAM,CAAC,QAAQ,GAAG,CAAC,oCAAoC,CAAC,CAAA;IAExD,MAAM,CAAC,IAAI,GAAG;QACZ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,WAAW;YACxB,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAEnD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,IAAI,CAAC,SAAS,EAAE,EAChB,SAAS,EACT,SAAS,EACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACpC,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Index extends Command {
3
+ static description: string;
4
+ run(): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAC,WAAW,SAA+B;IAE3C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwD3B"}
@@ -0,0 +1,62 @@
1
+ // src/commands/index.ts
2
+ import { Command } from '@oclif/core';
3
+ export default class Index extends Command {
4
+ static description = 'Boohee CLI - 薄荷健康开放平台命令行工具';
5
+ async run() {
6
+ this.log(`
7
+ ╔══════════════════════════════════════════════════════════════╗
8
+ ║ ║
9
+ ║ 🍎 Boohee CLI - 薄荷健康开放平台命令行工具 ║
10
+ ║ ║
11
+ ╚══════════════════════════════════════════════════════════════╝
12
+
13
+ 📋 快速开始
14
+
15
+ # 1. 设置 API Key(必需)
16
+ export BOOHEE_API_KEY=sk-xxx
17
+
18
+ # 2. 搜索食物
19
+ boohee search 苹果
20
+
21
+ # 3. 获取食物详情
22
+ boohee detail 10001
23
+
24
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
25
+
26
+ 🚀 常用快捷命令
27
+
28
+ boohee search <关键词> 搜索食物
29
+ boohee detail <食物编码> 获取食物详情
30
+ boohee categories 获取食物分类
31
+ boohee rank <营养素> 食物营养排名
32
+ boohee recognize "<描述>" 文字识别食物
33
+ boohee recognize-image --url <图片URL> 图片识别(自动等待结果)
34
+
35
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
36
+
37
+ 📚 更多命令
38
+
39
+ boohee food --help 查看所有食物相关命令
40
+ boohee config --help 查看配置命令
41
+ boohee auth --help 查看认证命令
42
+
43
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
44
+
45
+ 💡 输出格式
46
+
47
+ boohee search 苹果 表格格式(默认)
48
+ boohee search 苹果 -o json JSON 格式(AI Agent 推荐)
49
+ boohee search 苹果 -o yaml YAML 格式
50
+
51
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
52
+
53
+ 📖 使用文档
54
+
55
+ 查看 USAGE.md 获取完整使用说明
56
+
57
+ GitHub: https://github.com/your-username/boohee-cli
58
+
59
+ `);
60
+ }
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAC,WAAW,GAAG,4BAA4B,CAAA;IAEjD,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDZ,CAAC,CAAA;IACA,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { BaseCommand } from '../base.js';
2
+ export default class Meta extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ command: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ run(): Promise<void>;
9
+ private getCommandMetadata;
10
+ }
11
+ //# sourceMappingURL=meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/commands/meta.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGxC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW;IAC3C,MAAM,CAAC,WAAW,SAAgD;IAElE,MAAM,CAAC,QAAQ,WAGd;IAED,MAAM,CAAC,IAAI;;MAKV;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB1B,OAAO,CAAC,kBAAkB;CAkD3B"}
@@ -0,0 +1,76 @@
1
+ // src/commands/meta.ts
2
+ import { Args } from '@oclif/core';
3
+ import { BaseCommand } from '../base.js';
4
+ export default class Meta extends BaseCommand {
5
+ static description = 'Get command metadata for AI Agent discovery';
6
+ static examples = [
7
+ '<%= config.bin %> meta',
8
+ '<%= config.bin %> meta food:search',
9
+ ];
10
+ static args = {
11
+ command: Args.string({
12
+ description: 'Specific command to get metadata for',
13
+ required: false,
14
+ }),
15
+ };
16
+ async run() {
17
+ const { args } = await this.parse(Meta);
18
+ const commands = this.getCommandMetadata();
19
+ if (args.command) {
20
+ const cmd = commands.find(c => c.id === args.command);
21
+ if (!cmd) {
22
+ this.error(`Command not found: ${args.command}`);
23
+ }
24
+ this.output(cmd);
25
+ }
26
+ else {
27
+ this.output({
28
+ version: this.config.version,
29
+ commands,
30
+ });
31
+ }
32
+ }
33
+ getCommandMetadata() {
34
+ const commands = [];
35
+ for (const command of this.config.commands) {
36
+ // Skip hidden commands
37
+ if (command.hidden)
38
+ continue;
39
+ const meta = {
40
+ id: command.id,
41
+ description: command.description || '',
42
+ args: [],
43
+ flags: [],
44
+ examples: [],
45
+ };
46
+ // Add args (args is an object { [name: string]: Arg.Cached })
47
+ if (command.args && Object.keys(command.args).length > 0) {
48
+ meta.args = Object.entries(command.args).map(([name, arg]) => ({
49
+ name,
50
+ description: arg.description,
51
+ required: arg.required ?? false,
52
+ }));
53
+ }
54
+ // Add flags (flags is an object { [name: string]: Flag.Cached })
55
+ if (command.flags && Object.keys(command.flags).length > 0) {
56
+ meta.flags = Object.entries(command.flags).map(([name, flag]) => {
57
+ const flagOptions = flag.type === 'option' ? flag.options : undefined;
58
+ return {
59
+ name,
60
+ description: flag.description,
61
+ required: flag.required ?? false,
62
+ options: flagOptions ? [...flagOptions] : undefined,
63
+ type: flag.type ?? 'boolean',
64
+ };
65
+ });
66
+ }
67
+ // Add examples
68
+ if (command.examples && Array.isArray(command.examples)) {
69
+ meta.examples = command.examples.map(ex => typeof ex === 'string' ? ex : ex.command);
70
+ }
71
+ commands.push(meta);
72
+ }
73
+ return commands.sort((a, b) => a.id.localeCompare(b.id));
74
+ }
75
+ }
76
+ //# sourceMappingURL=meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../src/commands/meta.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGxC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW;IAC3C,MAAM,CAAC,WAAW,GAAG,6CAA6C,CAAA;IAElE,MAAM,CAAC,QAAQ,GAAG;QAChB,wBAAwB;QACxB,oCAAoC;KACrC,CAAA;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,sCAAsC;YACnD,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAE1C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,CAAA;YACrD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,IAAI,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YAClD,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC;gBACV,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,QAAQ;aACT,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAEO,kBAAkB;QACxB,MAAM,QAAQ,GAAkB,EAAE,CAAA;QAElC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3C,uBAAuB;YACvB,IAAI,OAAO,CAAC,MAAM;gBAAE,SAAQ;YAE5B,MAAM,IAAI,GAAgB;gBACxB,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;gBACtC,IAAI,EAAE,EAAE;gBACR,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,EAAE;aACb,CAAA;YAED,8DAA8D;YAC9D,IAAI,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7D,IAAI;oBACJ,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,KAAK;iBAChC,CAAC,CAAC,CAAA;YACL,CAAC;YAED,iEAAiE;YACjE,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAwC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;oBAC1G,OAAO;wBACL,IAAI;wBACJ,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;wBAChC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;wBACnD,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS;qBAC7B,CAAA;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC;YAED,eAAe;YACf,IAAI,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CACxC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CACzC,CAAA;YACH,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1D,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { BaseCommand } from '../base.js';
2
+ export default class Rank extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ ingredient: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=rank.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rank.d.ts","sourceRoot":"","sources":["../../src/commands/rank.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGxC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW;IAC3C,MAAM,CAAC,WAAW,SAA4D;IAE9E,MAAM,CAAC,QAAQ,WAGd;IAED,MAAM,CAAC,IAAI;;MAKV;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB3B"}
@@ -0,0 +1,26 @@
1
+ // src/commands/rank.ts
2
+ import { Args } from '@oclif/core';
3
+ import { BaseCommand } from '../base.js';
4
+ import { ApiClient } from '../lib/api/index.js';
5
+ export default class Rank extends BaseCommand {
6
+ static description = 'Get food rankings by nutrient (shortcut for food:ranks)';
7
+ static examples = [
8
+ '<%= config.bin %> rank 蛋白质',
9
+ '<%= config.bin %> rank 维生素C',
10
+ ];
11
+ static args = {
12
+ ingredient: Args.string({
13
+ description: 'Nutrient name for ranking',
14
+ required: true,
15
+ }),
16
+ };
17
+ async run() {
18
+ const { args, flags } = await this.parse(Rank);
19
+ const client = new ApiClient(this.getApiKey(), undefined, undefined, this.debugLog.bind(this));
20
+ const result = await client.foodRanks({
21
+ ingredient: args.ingredient,
22
+ });
23
+ this.output(result);
24
+ }
25
+ }
26
+ //# sourceMappingURL=rank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rank.js","sourceRoot":"","sources":["../../src/commands/rank.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW;IAC3C,MAAM,CAAC,WAAW,GAAG,yDAAyD,CAAA;IAE9E,MAAM,CAAC,QAAQ,GAAG;QAChB,4BAA4B;QAC5B,6BAA6B;KAC9B,CAAA;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,WAAW,EAAE,2BAA2B;YACxC,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAE9C,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,IAAI,CAAC,SAAS,EAAE,EAChB,SAAS,EACT,SAAS,EACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACpC,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { BaseCommand } from '../base.js';
2
+ export default class Raw extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ method: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ path: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ query: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ header: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ body: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ 'machine-readable': import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ };
17
+ run(): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=raw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw.d.ts","sourceRoot":"","sources":["../../src/commands/raw.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGxC,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,WAAW;IAC1C,MAAM,CAAC,WAAW,SAAuB;IAEzC,MAAM,CAAC,QAAQ,WAGd;IAED,MAAM,CAAC,IAAI;;;MAUV;IAED,MAAM,CAAC,KAAK;;;;;;;MAaX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwC3B"}
@@ -0,0 +1,63 @@
1
+ // src/commands/raw.ts
2
+ import { Args, Flags } from '@oclif/core';
3
+ import { BaseCommand } from '../base.js';
4
+ import { ApiClient } from '../lib/api/index.js';
5
+ export default class Raw extends BaseCommand {
6
+ static description = 'Make raw API calls';
7
+ static examples = [
8
+ '<%= config.bin %> raw GET /v1/food/search --query keyword=苹果',
9
+ '<%= config.bin %> raw POST /v1/food/ingredients --body \'{"foods":[{"code":"10001","weight":100}]}\'',
10
+ ];
11
+ static args = {
12
+ method: Args.string({
13
+ description: 'HTTP method',
14
+ required: true,
15
+ options: ['GET', 'POST', 'PUT', 'DELETE'],
16
+ }),
17
+ path: Args.string({
18
+ description: 'API path',
19
+ required: true,
20
+ }),
21
+ };
22
+ static flags = {
23
+ ...BaseCommand.baseFlags,
24
+ query: Flags.string({
25
+ description: 'Query parameter (can be used multiple times)',
26
+ multiple: true,
27
+ }),
28
+ header: Flags.string({
29
+ description: 'Custom header (can be used multiple times)',
30
+ multiple: true,
31
+ }),
32
+ body: Flags.string({
33
+ description: 'Request body (JSON)',
34
+ }),
35
+ };
36
+ async run() {
37
+ const { args, flags } = await this.parse(Raw);
38
+ // Parse query parameters
39
+ const params = {};
40
+ if (flags.query) {
41
+ for (const q of flags.query) {
42
+ const [key, value] = q.split('=');
43
+ if (key && value) {
44
+ params[key] = value;
45
+ }
46
+ }
47
+ }
48
+ // Parse body
49
+ let body;
50
+ if (flags.body) {
51
+ try {
52
+ body = JSON.parse(flags.body);
53
+ }
54
+ catch {
55
+ this.error('Invalid JSON in body');
56
+ }
57
+ }
58
+ const client = new ApiClient(this.getApiKey(), undefined, undefined, this.debugLog.bind(this));
59
+ const result = await client.raw(args.method, args.path, params, body);
60
+ this.output(result);
61
+ }
62
+ }
63
+ //# sourceMappingURL=raw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw.js","sourceRoot":"","sources":["../../src/commands/raw.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,WAAW;IAC1C,MAAM,CAAC,WAAW,GAAG,oBAAoB,CAAA;IAEzC,MAAM,CAAC,QAAQ,GAAG;QAChB,8DAA8D;QAC9D,sGAAsG;KACvG,CAAA;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,aAAa;YAC1B,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;SAC1C,CAAC;QACF,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,UAAU;YACvB,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,WAAW,CAAC,SAAS;QACxB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,8CAA8C;YAC3D,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,4CAA4C;YACzD,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,qBAAqB;SACnC,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAE7C,yBAAyB;QACzB,MAAM,MAAM,GAA2B,EAAE,CAAA;QACzC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBACjC,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QAED,aAAa;QACb,IAAI,IAAa,CAAA;QACjB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,IAAI,CAAC,SAAS,EAAE,EAChB,SAAS,EACT,SAAS,EACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC7B,IAAI,CAAC,MAA2C,EAChD,IAAI,CAAC,IAAI,EACT,MAAM,EACN,IAAI,CACL,CAAA;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { BaseCommand } from '../base.js';
2
+ export default class RecognizeImage extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ url: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
+ timeout: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
8
+ interval: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
9
+ output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ 'machine-readable': import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ };
13
+ run(): Promise<void>;
14
+ private sleep;
15
+ }
16
+ //# sourceMappingURL=recognize-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recognize-image.d.ts","sourceRoot":"","sources":["../../src/commands/recognize-image.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAIxC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,MAAM,CAAC,WAAW,SAAkD;IAEpE,MAAM,CAAC,QAAQ,WAGd;IAED,MAAM,CAAC,KAAK;;;;;;;MAcX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAmG1B,OAAO,CAAC,KAAK;CAGd"}