@aisa-one/cli 0.1.3 → 0.1.5
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 +26 -29
- package/dist/commands/account.d.ts +1 -1
- package/dist/commands/account.js +8 -42
- package/dist/commands/api.d.ts +4 -4
- package/dist/commands/api.js +20 -110
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/index.js +18 -18
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -60,16 +60,15 @@ aisa models show gpt-4.1 # model details + pricing
|
|
|
60
60
|
### API Discovery & Execution
|
|
61
61
|
|
|
62
62
|
```bash
|
|
63
|
-
aisa api list #
|
|
64
|
-
aisa api
|
|
65
|
-
aisa api
|
|
66
|
-
aisa api
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
aisa run finance /stock/price -q "symbol=AAPL"
|
|
63
|
+
aisa api list # 🚧 WIP — not yet available
|
|
64
|
+
aisa api search "email finder" # 🚧 WIP
|
|
65
|
+
aisa api show finance /stock/price # 🚧 WIP
|
|
66
|
+
aisa api code finance /stock/price --lang python # 🚧 WIP
|
|
67
|
+
|
|
68
|
+
# Execute any API (works now)
|
|
69
|
+
aisa run financial /insider-trades -q "ticker=AAPL"
|
|
71
70
|
aisa run tavily /search -d '{"query": "AI news"}'
|
|
72
|
-
aisa run twitter /tweet/
|
|
71
|
+
aisa run twitter /tweet/advanced_search -q "query=AI agents" --raw
|
|
73
72
|
```
|
|
74
73
|
|
|
75
74
|
### Web Search
|
|
@@ -85,11 +84,12 @@ aisa scholar "transformer architecture" # academic papers
|
|
|
85
84
|
### Finance
|
|
86
85
|
|
|
87
86
|
```bash
|
|
88
|
-
aisa stock AAPL
|
|
89
|
-
aisa stock
|
|
87
|
+
aisa stock AAPL --field insider # insider trades
|
|
88
|
+
aisa stock AAPL --field news # company news
|
|
90
89
|
aisa stock TSLA --field filings # SEC filings
|
|
91
|
-
aisa stock
|
|
92
|
-
aisa
|
|
90
|
+
aisa stock AAPL --field price # stock price (⚠️ may return empty for some tickers)
|
|
91
|
+
aisa stock MSFT --field earnings # earnings data (⚠️ limited ticker support)
|
|
92
|
+
aisa crypto BTC # crypto price snapshot
|
|
93
93
|
aisa crypto ETH --period 30d # historical
|
|
94
94
|
aisa screener --sector Technology # stock screener
|
|
95
95
|
```
|
|
@@ -97,11 +97,10 @@ aisa screener --sector Technology # stock screener
|
|
|
97
97
|
### Twitter/X
|
|
98
98
|
|
|
99
99
|
```bash
|
|
100
|
-
aisa tweet "Hello world!" # post a tweet
|
|
101
|
-
aisa tweet "Reply" --reply-to 123456 # reply
|
|
102
|
-
aisa twitter search "AI agents" --limit 20 # search tweets
|
|
103
100
|
aisa twitter user elonmusk # user profile
|
|
101
|
+
aisa twitter search "AI agents" --limit 20 # search tweets
|
|
104
102
|
aisa twitter trends # trending topics
|
|
103
|
+
aisa tweet "Hello world!" # post (⚠️ requires login cookies, see docs)
|
|
105
104
|
```
|
|
106
105
|
|
|
107
106
|
### Video Generation
|
|
@@ -115,9 +114,8 @@ aisa video status <task-id> # check status
|
|
|
115
114
|
### Account
|
|
116
115
|
|
|
117
116
|
```bash
|
|
118
|
-
aisa balance #
|
|
119
|
-
aisa usage --limit 20 #
|
|
120
|
-
aisa usage --days 7 # last 7 days
|
|
117
|
+
aisa balance # 🚧 WIP — check https://aisa.one/dashboard
|
|
118
|
+
aisa usage --limit 20 # 🚧 WIP
|
|
121
119
|
```
|
|
122
120
|
|
|
123
121
|
## Skills
|
|
@@ -127,12 +125,11 @@ Skills are markdown files that teach AI coding agents (Claude Code, Cursor, Copi
|
|
|
127
125
|
### Browse & Install
|
|
128
126
|
|
|
129
127
|
```bash
|
|
130
|
-
aisa skills list #
|
|
131
|
-
aisa skills search "financial analysis" #
|
|
132
|
-
aisa skills show aisa-team/finance-analyst #
|
|
133
|
-
aisa skills add aisa-team/finance-analyst #
|
|
134
|
-
aisa skills
|
|
135
|
-
aisa skills remove aisa-team/finance-analyst # uninstall
|
|
128
|
+
aisa skills list # 🚧 WIP — requires backend
|
|
129
|
+
aisa skills search "financial analysis" # 🚧 WIP
|
|
130
|
+
aisa skills show aisa-team/finance-analyst # 🚧 WIP
|
|
131
|
+
aisa skills add aisa-team/finance-analyst # 🚧 WIP
|
|
132
|
+
aisa skills remove aisa-team/finance-analyst # 🚧 WIP
|
|
136
133
|
```
|
|
137
134
|
|
|
138
135
|
Skills install to agent directories automatically:
|
|
@@ -150,12 +147,12 @@ Skills install to agent directories automatically:
|
|
|
150
147
|
### Create & Publish
|
|
151
148
|
|
|
152
149
|
```bash
|
|
153
|
-
aisa skills init my-skill # create from default template
|
|
150
|
+
aisa skills init my-skill # create from default template (works locally)
|
|
154
151
|
aisa skills init my-skill --template finance # finance template
|
|
155
152
|
aisa skills init my-skill --template llm # LLM template
|
|
156
|
-
aisa skills submit ./my-skill #
|
|
157
|
-
aisa skills push owner/my-skill #
|
|
158
|
-
aisa skills request-verification owner/my-skill #
|
|
153
|
+
aisa skills submit ./my-skill # 🚧 WIP — requires backend
|
|
154
|
+
aisa skills push owner/my-skill # 🚧 WIP
|
|
155
|
+
aisa skills request-verification owner/my-skill # 🚧 WIP
|
|
159
156
|
```
|
|
160
157
|
|
|
161
158
|
Available templates: `default`, `llm`, `search`, `finance`, `twitter`, `video`
|
package/dist/commands/account.js
CHANGED
|
@@ -1,47 +1,13 @@
|
|
|
1
|
-
import ora from "ora";
|
|
2
1
|
import chalk from "chalk";
|
|
3
2
|
import { requireApiKey } from "../config.js";
|
|
4
|
-
import {
|
|
5
|
-
import { error, table } from "../utils/display.js";
|
|
3
|
+
import { hint } from "../utils/display.js";
|
|
6
4
|
export async function balanceAction() {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (!res.success || !res.data) {
|
|
11
|
-
spinner.fail("Failed to fetch balance");
|
|
12
|
-
error(res.error || "Unknown error");
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
spinner.stop();
|
|
16
|
-
console.log(` Balance: ${chalk.green("$" + res.data.balance.toFixed(2))} ${res.data.currency}`);
|
|
17
|
-
console.log(chalk.gray(" Add credits at https://aisa.one/dashboard/wallet"));
|
|
5
|
+
requireApiKey();
|
|
6
|
+
console.log(chalk.yellow(" Balance API is not yet available."));
|
|
7
|
+
hint("Check your balance at https://aisa.one/dashboard");
|
|
18
8
|
}
|
|
19
|
-
export async function usageAction(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (options.limit)
|
|
24
|
-
query.limit = options.limit;
|
|
25
|
-
if (options.days)
|
|
26
|
-
query.days = options.days;
|
|
27
|
-
const res = await apiRequest(key, "credits/usage", { query });
|
|
28
|
-
if (!res.success || !res.data) {
|
|
29
|
-
spinner.fail("Failed to fetch usage");
|
|
30
|
-
error(res.error || "Unknown error");
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
spinner.stop();
|
|
34
|
-
const { records } = res.data;
|
|
35
|
-
if (records.length === 0) {
|
|
36
|
-
console.log(" No usage records found.");
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
const rows = records.map((r) => [
|
|
40
|
-
new Date(r.timestamp).toLocaleDateString(),
|
|
41
|
-
r.api,
|
|
42
|
-
r.endpoint,
|
|
43
|
-
`$${r.cost.toFixed(4)}`,
|
|
44
|
-
r.status,
|
|
45
|
-
]);
|
|
46
|
-
console.log(table(["Date", "API", "Endpoint", "Cost", "Status"], rows));
|
|
9
|
+
export async function usageAction(_options) {
|
|
10
|
+
requireApiKey();
|
|
11
|
+
console.log(chalk.yellow(" Usage API is not yet available."));
|
|
12
|
+
hint("View usage history at https://aisa.one/dashboard");
|
|
47
13
|
}
|
package/dist/commands/api.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export declare function apiListAction(
|
|
1
|
+
export declare function apiListAction(_options: {
|
|
2
2
|
category?: string;
|
|
3
3
|
}): Promise<void>;
|
|
4
|
-
export declare function apiSearchAction(
|
|
4
|
+
export declare function apiSearchAction(_query: string, _options: {
|
|
5
5
|
limit?: string;
|
|
6
6
|
}): Promise<void>;
|
|
7
|
-
export declare function apiShowAction(
|
|
8
|
-
export declare function apiCodeAction(
|
|
7
|
+
export declare function apiShowAction(_slug: string, _path?: string): Promise<void>;
|
|
8
|
+
export declare function apiCodeAction(_slug: string, _path: string, _options: {
|
|
9
9
|
lang?: string;
|
|
10
10
|
}): Promise<void>;
|
package/dist/commands/api.js
CHANGED
|
@@ -1,116 +1,26 @@
|
|
|
1
|
-
import ora from "ora";
|
|
2
1
|
import chalk from "chalk";
|
|
3
2
|
import { requireApiKey } from "../config.js";
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const res = await apiRequest(key, "cli/apis", { query });
|
|
13
|
-
if (!res.success || !res.data) {
|
|
14
|
-
spinner.fail("Failed to list APIs");
|
|
15
|
-
error(res.error || "Unknown error");
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
spinner.stop();
|
|
19
|
-
const { apis } = res.data;
|
|
20
|
-
if (apis.length === 0) {
|
|
21
|
-
console.log(" No APIs found.");
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
for (const api of apis) {
|
|
25
|
-
console.log(`\n ${chalk.cyan.bold(api.name)} ${chalk.gray(api.slug)} ${badge(api.category)}`);
|
|
26
|
-
console.log(` ${chalk.gray(api.description)}`);
|
|
27
|
-
const shown = api.endpoints.slice(0, 3);
|
|
28
|
-
for (const ep of shown) {
|
|
29
|
-
console.log(` ${chalk.yellow(ep.method.padEnd(6))} ${ep.path} ${chalk.gray("- " + truncate(ep.description, 50))}`);
|
|
30
|
-
}
|
|
31
|
-
if (api.endpoints.length > 3) {
|
|
32
|
-
hint(`+${api.endpoints.length - 3} more endpoints`);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
console.log(chalk.gray("\n Run 'aisa api show <slug>' for endpoint details"));
|
|
3
|
+
import { hint } from "../utils/display.js";
|
|
4
|
+
const COMING_SOON = chalk.yellow(" API catalog is not yet available.");
|
|
5
|
+
const BROWSE_HINT = "Browse available APIs at https://docs.aisa.one/reference";
|
|
6
|
+
export async function apiListAction(_options) {
|
|
7
|
+
requireApiKey();
|
|
8
|
+
console.log(COMING_SOON);
|
|
9
|
+
hint(BROWSE_HINT);
|
|
10
|
+
hint("Use 'aisa run <slug> <path>' to call APIs directly");
|
|
36
11
|
}
|
|
37
|
-
export async function apiSearchAction(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
method: "POST",
|
|
42
|
-
body: { query, limit: parseInt(options.limit || "10") },
|
|
43
|
-
});
|
|
44
|
-
if (!res.success || !res.data) {
|
|
45
|
-
spinner.fail("Search failed");
|
|
46
|
-
error(res.error || "Unknown error");
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
spinner.stop();
|
|
50
|
-
const { apis } = res.data;
|
|
51
|
-
if (apis.length === 0) {
|
|
52
|
-
console.log(` No APIs found for "${query}".`);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
for (const api of apis) {
|
|
56
|
-
console.log(`\n ${chalk.cyan.bold(api.name)} ${chalk.gray(api.slug)} ${badge(api.category)}`);
|
|
57
|
-
console.log(` ${chalk.gray(api.description)}`);
|
|
58
|
-
for (const ep of api.endpoints.slice(0, 2)) {
|
|
59
|
-
console.log(` ${chalk.yellow(ep.method.padEnd(6))} ${ep.path}`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
console.log(chalk.gray("\n Run 'aisa run <slug> <path>' to execute"));
|
|
12
|
+
export async function apiSearchAction(_query, _options) {
|
|
13
|
+
requireApiKey();
|
|
14
|
+
console.log(COMING_SOON);
|
|
15
|
+
hint(BROWSE_HINT);
|
|
63
16
|
}
|
|
64
|
-
export async function apiShowAction(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const res = await apiRequest(key, endpoint);
|
|
69
|
-
if (!res.success || !res.data) {
|
|
70
|
-
spinner.fail("Failed to load API details");
|
|
71
|
-
error(res.error || "Unknown error");
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
spinner.stop();
|
|
75
|
-
const data = res.data;
|
|
76
|
-
if ("endpoints" in data) {
|
|
77
|
-
// ApiGroup
|
|
78
|
-
console.log(`\n ${chalk.cyan.bold(data.name)} ${badge(data.category)}`);
|
|
79
|
-
console.log(` ${data.description}\n`);
|
|
80
|
-
for (const ep of data.endpoints) {
|
|
81
|
-
console.log(` ${chalk.yellow(ep.method.padEnd(6))} ${ep.path}`);
|
|
82
|
-
console.log(` ${chalk.gray(ep.description)}`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
// ApiEndpoint with parameters
|
|
87
|
-
console.log(`\n ${chalk.yellow(data.method)} ${data.path}`);
|
|
88
|
-
console.log(` ${data.description}\n`);
|
|
89
|
-
if (data.parameters && data.parameters.length > 0) {
|
|
90
|
-
const rows = data.parameters.map((p) => [
|
|
91
|
-
p.name,
|
|
92
|
-
p.type,
|
|
93
|
-
p.required ? chalk.red("required") : "optional",
|
|
94
|
-
truncate(p.description, 40),
|
|
95
|
-
]);
|
|
96
|
-
console.log(table(["Name", "Type", "Required", "Description"], rows));
|
|
97
|
-
}
|
|
98
|
-
console.log(chalk.gray(`\n Example: aisa run ${slug} ${data.path} -q "param=value"`));
|
|
99
|
-
}
|
|
17
|
+
export async function apiShowAction(_slug, _path) {
|
|
18
|
+
requireApiKey();
|
|
19
|
+
console.log(COMING_SOON);
|
|
20
|
+
hint(BROWSE_HINT);
|
|
100
21
|
}
|
|
101
|
-
export async function apiCodeAction(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const res = await apiRequest(key, "cli/apis/code", {
|
|
106
|
-
method: "POST",
|
|
107
|
-
body: { slug, path, language: lang },
|
|
108
|
-
});
|
|
109
|
-
if (!res.success || !res.data) {
|
|
110
|
-
spinner.fail("Failed to generate code");
|
|
111
|
-
error(res.error || "Unknown error");
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
spinner.stop();
|
|
115
|
-
console.log(`\n${res.data.code}`);
|
|
22
|
+
export async function apiCodeAction(_slug, _path, _options) {
|
|
23
|
+
requireApiKey();
|
|
24
|
+
console.log(COMING_SOON);
|
|
25
|
+
hint(BROWSE_HINT);
|
|
116
26
|
}
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const VERSION = "0.1.
|
|
1
|
+
export declare const VERSION = "0.1.5";
|
|
2
2
|
export declare const BASE_URL = "https://api.aisa.one";
|
|
3
3
|
export declare const CLI_BASE_URL = "https://api.aisa.one/v1";
|
|
4
4
|
export declare const APIS_BASE_URL = "https://api.aisa.one/apis/v1";
|
package/dist/constants.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -58,33 +58,33 @@ program
|
|
|
58
58
|
// ── Account ──
|
|
59
59
|
program
|
|
60
60
|
.command("balance")
|
|
61
|
-
.description("Show credit balance")
|
|
61
|
+
.description("Show credit balance (WIP)")
|
|
62
62
|
.action(wrap(balanceAction));
|
|
63
63
|
program
|
|
64
64
|
.command("usage")
|
|
65
|
-
.description("Show usage history")
|
|
65
|
+
.description("Show usage history (WIP)")
|
|
66
66
|
.option("--limit <n>", "Max records")
|
|
67
67
|
.option("--days <n>", "Lookback days")
|
|
68
68
|
.action(wrap(usageAction));
|
|
69
69
|
// ── API ──
|
|
70
|
-
const api = program.command("api").description("Discover and inspect APIs");
|
|
70
|
+
const api = program.command("api").description("Discover and inspect APIs (WIP)");
|
|
71
71
|
api
|
|
72
72
|
.command("list")
|
|
73
|
-
.description("List available API endpoints")
|
|
73
|
+
.description("List available API endpoints (WIP)")
|
|
74
74
|
.option("--category <cat>", "Filter by category (llm, search, finance, twitter, video, scholar)")
|
|
75
75
|
.action(wrap(apiListAction));
|
|
76
76
|
api
|
|
77
77
|
.command("search <query>")
|
|
78
|
-
.description("Search APIs by keyword")
|
|
78
|
+
.description("Search APIs by keyword (WIP)")
|
|
79
79
|
.option("--limit <n>", "Max results")
|
|
80
80
|
.action(wrap(apiSearchAction));
|
|
81
81
|
api
|
|
82
82
|
.command("show <slug> [path]")
|
|
83
|
-
.description("Show API endpoint details")
|
|
83
|
+
.description("Show API endpoint details (WIP)")
|
|
84
84
|
.action(wrap(apiShowAction));
|
|
85
85
|
api
|
|
86
86
|
.command("code <slug> <path>")
|
|
87
|
-
.description("Generate code snippet")
|
|
87
|
+
.description("Generate code snippet (WIP)")
|
|
88
88
|
.option("--lang <language>", "Language: typescript, python, curl", "typescript")
|
|
89
89
|
.action(wrap(apiCodeAction));
|
|
90
90
|
// ── Run ──
|
|
@@ -202,32 +202,32 @@ video
|
|
|
202
202
|
const skills = program.command("skills").description("Browse and manage agent skills");
|
|
203
203
|
skills
|
|
204
204
|
.command("list")
|
|
205
|
-
.description("List available skills")
|
|
205
|
+
.description("List available skills (WIP)")
|
|
206
206
|
.option("--category <cat>", "Filter by category")
|
|
207
207
|
.option("--limit <n>", "Max results")
|
|
208
208
|
.action(wrap(skillsListAction));
|
|
209
209
|
skills
|
|
210
210
|
.command("search <query>")
|
|
211
|
-
.description("Search skills")
|
|
211
|
+
.description("Search skills (WIP)")
|
|
212
212
|
.option("--limit <n>", "Max results")
|
|
213
213
|
.action(wrap(skillsSearchAction));
|
|
214
214
|
skills
|
|
215
215
|
.command("show <slug>")
|
|
216
|
-
.description("Show skill details")
|
|
216
|
+
.description("Show skill details (WIP)")
|
|
217
217
|
.action(wrap(skillsShowAction));
|
|
218
218
|
skills
|
|
219
219
|
.command("add <slug>")
|
|
220
|
-
.description("Install a skill to agent directories")
|
|
220
|
+
.description("Install a skill to agent directories (WIP)")
|
|
221
221
|
.option("--agent <agent>", "Target agent: claude, cursor, copilot, windsurf, codex, gemini, openclaw, all")
|
|
222
222
|
.action(wrap(skillsAddAction));
|
|
223
223
|
skills
|
|
224
224
|
.command("remove <slug>")
|
|
225
|
-
.description("Remove an installed skill")
|
|
225
|
+
.description("Remove an installed skill (WIP)")
|
|
226
226
|
.option("--agent <agent>", "Target agent")
|
|
227
227
|
.action(skillsRemoveAction);
|
|
228
228
|
skills
|
|
229
229
|
.command("update [slug]")
|
|
230
|
-
.description("Update installed skill(s)")
|
|
230
|
+
.description("Update installed skill(s) (WIP)")
|
|
231
231
|
.action(wrap(skillsUpdateAction));
|
|
232
232
|
skills
|
|
233
233
|
.command("init <name>")
|
|
@@ -237,15 +237,15 @@ skills
|
|
|
237
237
|
.action(skillsInitAction);
|
|
238
238
|
skills
|
|
239
239
|
.command("submit <path>")
|
|
240
|
-
.description("Submit a skill to AISA")
|
|
240
|
+
.description("Submit a skill to AISA (WIP)")
|
|
241
241
|
.action(wrap(skillsSubmitAction));
|
|
242
242
|
skills
|
|
243
243
|
.command("push <slug>")
|
|
244
|
-
.description("Push local changes to a submitted skill")
|
|
244
|
+
.description("Push local changes to a submitted skill (WIP)")
|
|
245
245
|
.action(wrap(skillsPushAction));
|
|
246
246
|
skills
|
|
247
247
|
.command("request-verification <slug>")
|
|
248
|
-
.description("Request skill verification")
|
|
248
|
+
.description("Request skill verification (WIP)")
|
|
249
249
|
.action(wrap(skillsVerifyAction));
|
|
250
250
|
// ── MCP ──
|
|
251
251
|
const mcp = program.command("mcp").description("MCP server integration");
|
|
@@ -279,12 +279,12 @@ configCmd
|
|
|
279
279
|
// ── Top-level aliases ──
|
|
280
280
|
program
|
|
281
281
|
.command("search <query>")
|
|
282
|
-
.description("Search APIs (alias for 'api search')")
|
|
282
|
+
.description("Search APIs (alias for 'api search') (WIP)")
|
|
283
283
|
.option("--limit <n>", "Max results")
|
|
284
284
|
.action(wrap(apiSearchAction));
|
|
285
285
|
program
|
|
286
286
|
.command("code <slug> <path>")
|
|
287
|
-
.description("Generate code (alias for 'api code')")
|
|
287
|
+
.description("Generate code (alias for 'api code') (WIP)")
|
|
288
288
|
.option("--lang <language>", "Language", "typescript")
|
|
289
289
|
.action(wrap(apiCodeAction));
|
|
290
290
|
// ── Parse ──
|
package/package.json
CHANGED