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.
- package/README.md +207 -0
- package/bin/run.js +75 -0
- package/dist/base.d.ts +21 -0
- package/dist/base.d.ts.map +1 -0
- package/dist/base.js +77 -0
- package/dist/base.js.map +1 -0
- package/dist/commands/auth/status.d.ts +7 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +28 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/batch.d.ts +15 -0
- package/dist/commands/batch.d.ts.map +1 -0
- package/dist/commands/batch.js +63 -0
- package/dist/commands/batch.js.map +1 -0
- package/dist/commands/categories.d.ts +7 -0
- package/dist/commands/categories.d.ts.map +1 -0
- package/dist/commands/categories.js +14 -0
- package/dist/commands/categories.js.map +1 -0
- package/dist/commands/config/get.d.ts +10 -0
- package/dist/commands/config/get.d.ts.map +1 -0
- package/dist/commands/config/get.js +29 -0
- package/dist/commands/config/get.js.map +1 -0
- package/dist/commands/config/init.d.ts +12 -0
- package/dist/commands/config/init.d.ts.map +1 -0
- package/dist/commands/config/init.js +38 -0
- package/dist/commands/config/init.js.map +1 -0
- package/dist/commands/config/list.d.ts +7 -0
- package/dist/commands/config/list.d.ts.map +1 -0
- package/dist/commands/config/list.js +19 -0
- package/dist/commands/config/list.js.map +1 -0
- package/dist/commands/config/reset.d.ts +7 -0
- package/dist/commands/config/reset.d.ts.map +1 -0
- package/dist/commands/config/reset.js +20 -0
- package/dist/commands/config/reset.js.map +1 -0
- package/dist/commands/config/set.d.ts +11 -0
- package/dist/commands/config/set.d.ts.map +1 -0
- package/dist/commands/config/set.js +43 -0
- package/dist/commands/config/set.js.map +1 -0
- package/dist/commands/detail.d.ts +10 -0
- package/dist/commands/detail.d.ts.map +1 -0
- package/dist/commands/detail.js +27 -0
- package/dist/commands/detail.js.map +1 -0
- package/dist/commands/food/categories.d.ts +13 -0
- package/dist/commands/food/categories.d.ts.map +1 -0
- package/dist/commands/food/categories.js +28 -0
- package/dist/commands/food/categories.js.map +1 -0
- package/dist/commands/food/detail.d.ts +18 -0
- package/dist/commands/food/detail.d.ts.map +1 -0
- package/dist/commands/food/detail.js +44 -0
- package/dist/commands/food/detail.js.map +1 -0
- package/dist/commands/food/image-recognize-detail.d.ts +13 -0
- package/dist/commands/food/image-recognize-detail.d.ts.map +1 -0
- package/dist/commands/food/image-recognize-detail.js +26 -0
- package/dist/commands/food/image-recognize-detail.js.map +1 -0
- package/dist/commands/food/image-recognize.d.ts +13 -0
- package/dist/commands/food/image-recognize.d.ts.map +1 -0
- package/dist/commands/food/image-recognize.js +29 -0
- package/dist/commands/food/image-recognize.js.map +1 -0
- package/dist/commands/food/index.d.ts +7 -0
- package/dist/commands/food/index.d.ts.map +1 -0
- package/dist/commands/food/index.js +10 -0
- package/dist/commands/food/index.js.map +1 -0
- package/dist/commands/food/ingredients.d.ts +13 -0
- package/dist/commands/food/ingredients.d.ts.map +1 -0
- package/dist/commands/food/ingredients.js +31 -0
- package/dist/commands/food/ingredients.js.map +1 -0
- package/dist/commands/food/list.d.ts +20 -0
- package/dist/commands/food/list.d.ts.map +1 -0
- package/dist/commands/food/list.js +37 -0
- package/dist/commands/food/list.js.map +1 -0
- package/dist/commands/food/ranks.d.ts +17 -0
- package/dist/commands/food/ranks.d.ts.map +1 -0
- package/dist/commands/food/ranks.js +39 -0
- package/dist/commands/food/ranks.js.map +1 -0
- package/dist/commands/food/search.d.ts +18 -0
- package/dist/commands/food/search.d.ts.map +1 -0
- package/dist/commands/food/search.js +57 -0
- package/dist/commands/food/search.js.map +1 -0
- package/dist/commands/food/text-recognize.d.ts +13 -0
- package/dist/commands/food/text-recognize.d.ts.map +1 -0
- package/dist/commands/food/text-recognize.js +26 -0
- package/dist/commands/food/text-recognize.js.map +1 -0
- package/dist/commands/food/units.d.ts +10 -0
- package/dist/commands/food/units.d.ts.map +1 -0
- package/dist/commands/food/units.js +23 -0
- package/dist/commands/food/units.js.map +1 -0
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +62 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/meta.d.ts +11 -0
- package/dist/commands/meta.d.ts.map +1 -0
- package/dist/commands/meta.js +76 -0
- package/dist/commands/meta.js.map +1 -0
- package/dist/commands/rank.d.ts +10 -0
- package/dist/commands/rank.d.ts.map +1 -0
- package/dist/commands/rank.js +26 -0
- package/dist/commands/rank.js.map +1 -0
- package/dist/commands/raw.d.ts +19 -0
- package/dist/commands/raw.d.ts.map +1 -0
- package/dist/commands/raw.js +63 -0
- package/dist/commands/raw.js.map +1 -0
- package/dist/commands/recognize-image.d.ts +16 -0
- package/dist/commands/recognize-image.d.ts.map +1 -0
- package/dist/commands/recognize-image.js +106 -0
- package/dist/commands/recognize-image.js.map +1 -0
- package/dist/commands/recognize.d.ts +16 -0
- package/dist/commands/recognize.d.ts.map +1 -0
- package/dist/commands/recognize.js +43 -0
- package/dist/commands/recognize.js.map +1 -0
- package/dist/commands/search.d.ts +10 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +28 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/version.d.ts +7 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +10 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/hooks/prerun.d.ts +4 -0
- package/dist/hooks/prerun.d.ts.map +1 -0
- package/dist/hooks/prerun.js +24 -0
- package/dist/hooks/prerun.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api/client.d.ts +25 -0
- package/dist/lib/api/client.d.ts.map +1 -0
- package/dist/lib/api/client.js +59 -0
- package/dist/lib/api/client.js.map +1 -0
- package/dist/lib/api/endpoints.d.ts +17 -0
- package/dist/lib/api/endpoints.d.ts.map +1 -0
- package/dist/lib/api/endpoints.js +18 -0
- package/dist/lib/api/endpoints.js.map +1 -0
- package/dist/lib/api/index.d.ts +4 -0
- package/dist/lib/api/index.d.ts.map +1 -0
- package/dist/lib/api/index.js +5 -0
- package/dist/lib/api/index.js.map +1 -0
- package/dist/lib/api/interceptors.d.ts +3 -0
- package/dist/lib/api/interceptors.d.ts.map +1 -0
- package/dist/lib/api/interceptors.js +44 -0
- package/dist/lib/api/interceptors.js.map +1 -0
- package/dist/lib/api/types.d.ts +65 -0
- package/dist/lib/api/types.d.ts.map +1 -0
- package/dist/lib/api/types.js +2 -0
- package/dist/lib/api/types.js.map +1 -0
- package/dist/lib/auth.d.ts +17 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +51 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/cache.d.ts +13 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +64 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/config.d.ts +22 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +139 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors/api-error.d.ts +18 -0
- package/dist/lib/errors/api-error.d.ts.map +1 -0
- package/dist/lib/errors/api-error.js +24 -0
- package/dist/lib/errors/api-error.js.map +1 -0
- package/dist/lib/errors/auth-error.d.ts +16 -0
- package/dist/lib/errors/auth-error.d.ts.map +1 -0
- package/dist/lib/errors/auth-error.js +21 -0
- package/dist/lib/errors/auth-error.js.map +1 -0
- package/dist/lib/errors/base.d.ts +10 -0
- package/dist/lib/errors/base.d.ts.map +1 -0
- package/dist/lib/errors/base.js +21 -0
- package/dist/lib/errors/base.js.map +1 -0
- package/dist/lib/errors/config-error.d.ts +12 -0
- package/dist/lib/errors/config-error.d.ts.map +1 -0
- package/dist/lib/errors/config-error.js +20 -0
- package/dist/lib/errors/config-error.js.map +1 -0
- package/dist/lib/errors/index.d.ts +6 -0
- package/dist/lib/errors/index.d.ts.map +1 -0
- package/dist/lib/errors/index.js +7 -0
- package/dist/lib/errors/index.js.map +1 -0
- package/dist/lib/errors/validation-error.d.ts +13 -0
- package/dist/lib/errors/validation-error.d.ts.map +1 -0
- package/dist/lib/errors/validation-error.js +27 -0
- package/dist/lib/errors/validation-error.js.map +1 -0
- package/dist/lib/logger.d.ts +20 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +63 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/output/formatter.d.ts +9 -0
- package/dist/lib/output/formatter.d.ts.map +1 -0
- package/dist/lib/output/formatter.js +8 -0
- package/dist/lib/output/formatter.js.map +1 -0
- package/dist/lib/output/index.d.ts +8 -0
- package/dist/lib/output/index.d.ts.map +1 -0
- package/dist/lib/output/index.js +19 -0
- package/dist/lib/output/index.js.map +1 -0
- package/dist/lib/output/json.d.ts +8 -0
- package/dist/lib/output/json.d.ts.map +1 -0
- package/dist/lib/output/json.js +16 -0
- package/dist/lib/output/json.js.map +1 -0
- package/dist/lib/output/table.d.ts +17 -0
- package/dist/lib/output/table.d.ts.map +1 -0
- package/dist/lib/output/table.js +108 -0
- package/dist/lib/output/table.js.map +1 -0
- package/dist/lib/output/yaml.d.ts +8 -0
- package/dist/lib/output/yaml.d.ts.map +1 -0
- package/dist/lib/output/yaml.js +18 -0
- package/dist/lib/output/yaml.js.map +1 -0
- package/dist/types.d.ts +249 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +76 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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"}
|