@cantinasecurity/apex-cli 0.1.9 → 0.1.11
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/.claude/skills/apex-cli/SKILL.md +3 -0
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.mcp.claude.json +6 -2
- package/.mcp.codex.json +6 -2
- package/MARKETPLACE.md +1 -1
- package/README.md +91 -10
- package/dist/apex.js +21 -3
- package/dist/api-client.js +5 -0
- package/dist/commands.js +36 -0
- package/dist/config.js +4 -0
- package/dist/help.js +8 -1
- package/dist/mcp.js +101 -24
- package/dist/setup.js +177 -17
- package/dist/shell.js +27 -2
- package/dist/telemetry.js +755 -0
- package/dist/update.js +1 -1
- package/package.json +1 -1
- package/skills/apex-cli/SKILL.md +4 -1
|
@@ -7,6 +7,8 @@ description: Use when a user wants to run Apex scans, inspect findings, export r
|
|
|
7
7
|
|
|
8
8
|
This skill is bundled with Apex CLI and can be installed into the current repository with `apex setup claude`.
|
|
9
9
|
|
|
10
|
+
`apex setup claude` configures the MCP server with client attribution so Apex can distinguish Claude MCP usage from direct CLI usage. Users can inspect or disable anonymous local usage telemetry with `apex telemetry status` and `apex telemetry disable`.
|
|
11
|
+
|
|
10
12
|
## Instructions
|
|
11
13
|
|
|
12
14
|
Use Apex through the MCP server when the `apex-*` tools are available.
|
|
@@ -39,6 +41,7 @@ If the Apex MCP server is not configured, fall back to the local CLI:
|
|
|
39
41
|
- Use `sourceMode: "remote"` only when the user explicitly wants to forbid local snapshot fallbacks.
|
|
40
42
|
- When checking a scan that is not the workspace binding's latest scan, pass `scanId` to `apex-status`; use `apex scans` or `apex-scans` first if you need to discover scan IDs.
|
|
41
43
|
- Finding comments, feedback, and fix review scan starts use the same Apex device-login credentials as read tools. If a write tool reports missing auth, re-run `apex-auth-status` and complete `apex-auth-start` / `apex-auth-wait` instead of asking for browser cookies or auth tokens.
|
|
44
|
+
- Anonymous telemetry records only sanitized command/tool metadata such as command names, enum modes, counts, durations, success/failure categories, CLI version, and client integration. It must not include raw repository paths, scan IDs, finding IDs, comments, file paths, PR URLs, or tokens.
|
|
42
45
|
- Invalid finding feedback requires `dismissalReason`; valid feedback can include `suggestedSeverity`, including `extreme`.
|
|
43
46
|
- Fix PR callback feedback requires valid feedback with `labels: ["fixed"]` and `fixPrUrls`; start the fix review scan with `apex-finding-fix-review` after saving that feedback.
|
|
44
47
|
- Finding identifiers such as `KERN2-25` resolve against the selected or latest scan for the current workspace binding. Pass an explicit `scanId` when needed, or use the finding UUID directly.
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "Cantina agent plugins for security review workflows.",
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.11"
|
|
10
10
|
},
|
|
11
11
|
"plugins": [
|
|
12
12
|
{
|
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
"source": {
|
|
15
15
|
"source": "npm",
|
|
16
16
|
"package": "@cantinasecurity/apex-cli",
|
|
17
|
-
"version": "0.1.
|
|
17
|
+
"version": "0.1.11"
|
|
18
18
|
},
|
|
19
19
|
"description": "Run Apex security scans and review findings from Claude Code.",
|
|
20
|
-
"version": "0.1.
|
|
20
|
+
"version": "0.1.11",
|
|
21
21
|
"author": {
|
|
22
22
|
"name": "Cantina",
|
|
23
23
|
"email": "support@cantina.xyz"
|
package/.mcp.claude.json
CHANGED
package/.mcp.codex.json
CHANGED
package/MARKETPLACE.md
CHANGED
|
@@ -13,7 +13,7 @@ This package is prepared as both a Claude Code plugin and a Codex plugin. The pu
|
|
|
13
13
|
The plugin MCP configs launch the pinned npm CLI package with:
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
npx -y -p @cantinasecurity/apex-cli@0.1.
|
|
16
|
+
npx -y -p @cantinasecurity/apex-cli@0.1.11 apex-mcp
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
That keeps marketplace installs independent of a user's global `apex` install.
|
package/README.md
CHANGED
|
@@ -19,15 +19,17 @@ apex setup
|
|
|
19
19
|
|
|
20
20
|
`apex setup` is the lowest-friction path for agent clients. It:
|
|
21
21
|
|
|
22
|
-
- registers Apex as an MCP server in any installed Codex
|
|
22
|
+
- registers Apex as an MCP server in any installed Codex CLI, Claude Code, and GitHub Copilot CLI clients
|
|
23
23
|
- installs the Codex skill into `$CODEX_HOME/skills/apex-cli`
|
|
24
24
|
- installs the Claude project skill into `.claude/skills/apex-cli` in the current repository
|
|
25
|
+
- installs the GitHub Copilot CLI skill into `$COPILOT_HOME/skills/apex-cli` or `~/.copilot/skills/apex-cli`
|
|
25
26
|
|
|
26
27
|
If you only want one client, run:
|
|
27
28
|
|
|
28
29
|
```bash
|
|
29
30
|
apex setup codex
|
|
30
31
|
apex setup claude
|
|
32
|
+
apex setup copilot
|
|
31
33
|
```
|
|
32
34
|
|
|
33
35
|
If one client is not installed yet, `apex setup` skips it automatically. If you target a client explicitly, its CLI must already be installed.
|
|
@@ -146,7 +148,8 @@ Supported shell commands:
|
|
|
146
148
|
- `apex doctor`
|
|
147
149
|
- `apex login`
|
|
148
150
|
- `apex logout`
|
|
149
|
-
- `apex setup [all|codex|claude]`
|
|
151
|
+
- `apex setup [all|codex|claude|copilot]`
|
|
152
|
+
- `apex telemetry [status|enable|disable]`
|
|
150
153
|
- `apex update`
|
|
151
154
|
- `apex connect github`
|
|
152
155
|
- `apex connect gitlab`
|
|
@@ -219,18 +222,30 @@ If Apex is installed globally, prefer:
|
|
|
219
222
|
apex setup
|
|
220
223
|
```
|
|
221
224
|
|
|
222
|
-
That registers Apex for installed Codex
|
|
225
|
+
That registers Apex for installed Codex CLI, Claude Code, and GitHub Copilot CLI clients automatically. Codex and Claude registrations also set `APEX_MCP_CLIENT` and `APEX_CLIENT_INTEGRATION` so Apex can distinguish agent-driven MCP usage from direct CLI usage.
|
|
223
226
|
|
|
224
227
|
If you want to wire clients manually instead, Apex ships a stable `apex-mcp` binary. For Codex:
|
|
225
228
|
|
|
226
229
|
```bash
|
|
227
|
-
codex mcp add apex
|
|
230
|
+
codex mcp add apex \
|
|
231
|
+
--env APEX_MCP_CLIENT=codex \
|
|
232
|
+
--env APEX_CLIENT_INTEGRATION=codex \
|
|
233
|
+
-- apex-mcp
|
|
228
234
|
```
|
|
229
235
|
|
|
230
236
|
For Claude Code:
|
|
231
237
|
|
|
232
238
|
```bash
|
|
233
|
-
claude mcp add --scope user
|
|
239
|
+
claude mcp add --scope user \
|
|
240
|
+
-e APEX_MCP_CLIENT=claude \
|
|
241
|
+
-e APEX_CLIENT_INTEGRATION=claude \
|
|
242
|
+
apex -- apex-mcp
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
For GitHub Copilot CLI:
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
copilot mcp add apex --type stdio --tools "*" -- apex-mcp
|
|
234
249
|
```
|
|
235
250
|
|
|
236
251
|
For any other MCP client, configure it to launch:
|
|
@@ -239,7 +254,11 @@ For any other MCP client, configure it to launch:
|
|
|
239
254
|
{
|
|
240
255
|
"mcpServers": {
|
|
241
256
|
"apex": {
|
|
242
|
-
"command": "apex-mcp"
|
|
257
|
+
"command": "apex-mcp",
|
|
258
|
+
"env": {
|
|
259
|
+
"APEX_MCP_CLIENT": "custom-mcp-client",
|
|
260
|
+
"APEX_CLIENT_INTEGRATION": "custom-mcp-client"
|
|
261
|
+
}
|
|
243
262
|
}
|
|
244
263
|
}
|
|
245
264
|
}
|
|
@@ -251,7 +270,11 @@ From a local checkout during development, prefer the repo-local binary so the MC
|
|
|
251
270
|
{
|
|
252
271
|
"mcpServers": {
|
|
253
272
|
"apex": {
|
|
254
|
-
"command": "/path/to/apex-cli/bin/apex-mcp"
|
|
273
|
+
"command": "/path/to/apex-cli/bin/apex-mcp",
|
|
274
|
+
"env": {
|
|
275
|
+
"APEX_MCP_CLIENT": "local-dev",
|
|
276
|
+
"APEX_CLIENT_INTEGRATION": "local-dev"
|
|
277
|
+
}
|
|
255
278
|
}
|
|
256
279
|
}
|
|
257
280
|
}
|
|
@@ -265,7 +288,11 @@ If you need to launch through `pnpm`, use `--silent`:
|
|
|
265
288
|
"apex": {
|
|
266
289
|
"command": "pnpm",
|
|
267
290
|
"args": ["--silent", "mcp"],
|
|
268
|
-
"cwd": "/path/to/apex-cli"
|
|
291
|
+
"cwd": "/path/to/apex-cli",
|
|
292
|
+
"env": {
|
|
293
|
+
"APEX_MCP_CLIENT": "local-dev",
|
|
294
|
+
"APEX_CLIENT_INTEGRATION": "local-dev"
|
|
295
|
+
}
|
|
269
296
|
}
|
|
270
297
|
}
|
|
271
298
|
}
|
|
@@ -285,10 +312,64 @@ The MCP server exposes Apex-specific tools for:
|
|
|
285
312
|
|
|
286
313
|
For repository-scoped operations, pass `cwd` explicitly so the server can resolve the right `.apex/workspace.json` binding and repository roots.
|
|
287
314
|
|
|
288
|
-
For Codex-style clients, the packaged skill can be installed with `apex setup codex`. The repo-local source lives at `skills/apex-cli/SKILL.md`.
|
|
315
|
+
For Codex-style clients, the packaged skill can be installed with `apex setup codex`. For GitHub Copilot CLI, the same skill is installed into `~/.copilot/skills/apex-cli` with `apex setup copilot`. The repo-local source lives at `skills/apex-cli/SKILL.md`.
|
|
289
316
|
|
|
290
317
|
For Claude Code, the packaged project skill can be installed into the current repository with `apex setup claude`. The repo-local source lives at `.claude/skills/apex-cli/SKILL.md`. Anthropic documents project skills as filesystem directories under `.claude/skills/<name>/SKILL.md`, and the Claude Agent SDK uses the same location when the `Skill` tool is enabled.
|
|
291
318
|
|
|
319
|
+
## Usage Telemetry
|
|
320
|
+
|
|
321
|
+
Apex CLI emits first-party, privacy-preserving usage telemetry so Cantina can understand how people use the direct CLI, the interactive shell, and MCP tools in Codex, Claude, GitHub Copilot CLI, or other clients.
|
|
322
|
+
|
|
323
|
+
Telemetry is enabled by default and can be disabled locally:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
apex telemetry status
|
|
327
|
+
apex telemetry disable
|
|
328
|
+
apex telemetry enable
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
Environment opt-outs override local config:
|
|
332
|
+
|
|
333
|
+
```bash
|
|
334
|
+
APEX_TELEMETRY_DISABLED=1 apex scan
|
|
335
|
+
# also honored: APEX_DISABLE_TELEMETRY=1 or DO_NOT_TRACK=1
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
Telemetry records lifecycle events such as command/tool start and completion, duration, success/failure category, CLI version, Node/platform basics, anonymous install/session IDs, and sanitized command metadata. It also adds attribution headers to Apex API requests, including surface (`cli`, `interactive_shell`, or `mcp`), client integration, invocation ID, command/tool name, and CLI version.
|
|
339
|
+
|
|
340
|
+
Telemetry does not send raw cwd paths, repository URLs, finding IDs, scan IDs, PR URLs, comments, file paths, tokens, or raw flag values. Sensitive inputs are reduced to booleans, counts, enum values, or length buckets.
|
|
341
|
+
|
|
342
|
+
Telemetry event posts do not include bearer tokens. The telemetry endpoint is `POST /api/cli/v1/telemetry/events` with a batch payload:
|
|
343
|
+
|
|
344
|
+
```json
|
|
345
|
+
{
|
|
346
|
+
"events": [
|
|
347
|
+
{
|
|
348
|
+
"schemaVersion": 1,
|
|
349
|
+
"event": "apex.invocation.completed",
|
|
350
|
+
"cliVersion": "0.1.11",
|
|
351
|
+
"invocation": {
|
|
352
|
+
"surface": "mcp",
|
|
353
|
+
"command": "apex-scan",
|
|
354
|
+
"mcpTool": "apex-scan",
|
|
355
|
+
"metadata": {
|
|
356
|
+
"mode": "pr",
|
|
357
|
+
"pullRequestCount": 1,
|
|
358
|
+
"cwdProvided": true
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
"client": {
|
|
362
|
+
"integration": "codex"
|
|
363
|
+
},
|
|
364
|
+
"outcome": {
|
|
365
|
+
"success": true,
|
|
366
|
+
"durationMs": 1234
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
]
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
292
373
|
## Plugin And Marketplace Packaging
|
|
293
374
|
|
|
294
375
|
The npm package also includes marketplace-ready plugin artifacts:
|
|
@@ -297,7 +378,7 @@ The npm package also includes marketplace-ready plugin artifacts:
|
|
|
297
378
|
- `.claude-plugin/plugin.json` and `.mcp.claude.json` for Claude Code plugin installs
|
|
298
379
|
- `.claude-plugin/marketplace.json` for a Claude marketplace entry backed by the public npm package
|
|
299
380
|
|
|
300
|
-
These plugin installs launch the pinned npm package with `npx -y -p @cantinasecurity/apex-cli@0.1.
|
|
381
|
+
These plugin installs launch the pinned npm package with `npx -y -p @cantinasecurity/apex-cli@0.1.11 apex-mcp`, so users do not need to install `apex` globally before enabling the plugin.
|
|
301
382
|
|
|
302
383
|
The repository also includes `.agents/plugins/marketplace.json` for local Codex marketplace testing from a checkout.
|
|
303
384
|
|
package/dist/apex.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { ApexApiClient, formatApiError } from "./api-client.js";
|
|
2
2
|
import { parseArgs } from "./args.js";
|
|
3
|
-
import { commandCancelScan, commandConnect, commandCredits, commandDoctor, commandExportFindings, commandFindingComment, commandFindingFeedback, commandFindingFixReview, commandFindings, commandLogin, commandLogout, commandScan, commandScans, commandSetup, commandStatus, commandUpdate, commandWorkspace, commandWorkspaceUse, commandWorkspaces, } from "./commands.js";
|
|
3
|
+
import { commandCancelScan, commandConnect, commandCredits, commandDoctor, commandExportFindings, commandFindingComment, commandFindingFeedback, commandFindingFixReview, commandFindings, commandLogin, commandLogout, commandScan, commandScans, commandSetup, commandStatus, commandTelemetry, commandUpdate, commandWorkspace, commandWorkspaceUse, commandWorkspaces, } from "./commands.js";
|
|
4
4
|
import { CLI_HELP_TEXT } from "./help.js";
|
|
5
5
|
import { runMcpServer } from "./mcp.js";
|
|
6
6
|
import { runInteractiveShell } from "./shell.js";
|
|
7
|
+
import { createCliTelemetryInvocation, emitInvocationCompleted, emitInvocationStarted, withTelemetryContext, } from "./telemetry.js";
|
|
7
8
|
import { maybePromptForUpdate } from "./update.js";
|
|
8
|
-
async function
|
|
9
|
-
const parsed = parseArgs(process.argv.slice(2));
|
|
9
|
+
async function dispatch(parsed) {
|
|
10
10
|
if (parsed.flags.help === true || parsed.command === "help") {
|
|
11
11
|
process.stdout.write(CLI_HELP_TEXT);
|
|
12
12
|
return;
|
|
@@ -45,6 +45,9 @@ async function main() {
|
|
|
45
45
|
case "setup":
|
|
46
46
|
await commandSetup(cwd, parsed.flags, parsed.subcommand);
|
|
47
47
|
return;
|
|
48
|
+
case "telemetry":
|
|
49
|
+
await commandTelemetry(parsed.flags, parsed.subcommand);
|
|
50
|
+
return;
|
|
48
51
|
case "doctor":
|
|
49
52
|
await commandDoctor(client, cwd, parsed.flags);
|
|
50
53
|
return;
|
|
@@ -117,6 +120,21 @@ async function main() {
|
|
|
117
120
|
throw new Error(`Unknown command: ${parsed.command}`);
|
|
118
121
|
}
|
|
119
122
|
}
|
|
123
|
+
async function main() {
|
|
124
|
+
const parsed = parseArgs(process.argv.slice(2));
|
|
125
|
+
const invocation = createCliTelemetryInvocation(parsed);
|
|
126
|
+
emitInvocationStarted(invocation);
|
|
127
|
+
await withTelemetryContext(invocation, async () => {
|
|
128
|
+
try {
|
|
129
|
+
await dispatch(parsed);
|
|
130
|
+
emitInvocationCompleted(invocation);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
emitInvocationCompleted(invocation, error);
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
120
138
|
function getFlagValue(value) {
|
|
121
139
|
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
122
140
|
}
|
package/dist/api-client.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { clearCredentials, loadConfig, loadCredentials, saveCredentials } from "./config.js";
|
|
2
|
+
import { getTelemetryRequestHeaders } from "./telemetry.js";
|
|
2
3
|
export class ApiError extends Error {
|
|
3
4
|
status;
|
|
4
5
|
body;
|
|
@@ -84,7 +85,11 @@ export class ApexApiClient {
|
|
|
84
85
|
async request(path, options = {}) {
|
|
85
86
|
const baseUrl = await this.getBaseUrl();
|
|
86
87
|
const headers = new Headers(options.headers ?? {});
|
|
88
|
+
const telemetryHeaders = await getTelemetryRequestHeaders();
|
|
87
89
|
let credentials = options.auth === false ? null : await this.refreshIfNeeded().catch(() => null);
|
|
90
|
+
for (const [key, value] of Object.entries(telemetryHeaders)) {
|
|
91
|
+
headers.set(key, value);
|
|
92
|
+
}
|
|
88
93
|
if (options.json !== undefined) {
|
|
89
94
|
headers.set("Content-Type", "application/json");
|
|
90
95
|
}
|
package/dist/commands.js
CHANGED
|
@@ -12,6 +12,7 @@ import { chooseCompany, createWorkspaceBinding, ensureAuthenticated, remediateMi
|
|
|
12
12
|
import { createWorkspaceBindingFromSummary, fetchCompanyCredits, fetchCompanyWorkspaces, findWorkspaceByRef, } from "./workspaces.js";
|
|
13
13
|
import { loadWorkspaceBinding, saveWorkspaceBinding } from "./workspace-binding.js";
|
|
14
14
|
import { commandSetup as runCliSetup } from "./setup.js";
|
|
15
|
+
import { getTelemetryStatus, setTelemetryEnabled, } from "./telemetry.js";
|
|
15
16
|
import { commandUpdate as runCliUpdate } from "./update.js";
|
|
16
17
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
17
18
|
import path from "node:path";
|
|
@@ -496,6 +497,41 @@ export async function commandUpdate(flags) {
|
|
|
496
497
|
export async function commandSetup(cwd, flags, target) {
|
|
497
498
|
return runCliSetup(cwd, flags, target);
|
|
498
499
|
}
|
|
500
|
+
function formatTelemetryDisabledBy(disabledBy) {
|
|
501
|
+
if (!disabledBy)
|
|
502
|
+
return "not disabled";
|
|
503
|
+
if (disabledBy === "config")
|
|
504
|
+
return "local config";
|
|
505
|
+
return disabledBy.replace(/^env:/, "environment variable ");
|
|
506
|
+
}
|
|
507
|
+
export async function commandTelemetry(flags, target) {
|
|
508
|
+
let payload;
|
|
509
|
+
switch (target ?? "status") {
|
|
510
|
+
case "status":
|
|
511
|
+
payload = await getTelemetryStatus("cli");
|
|
512
|
+
break;
|
|
513
|
+
case "enable":
|
|
514
|
+
payload = await setTelemetryEnabled(true);
|
|
515
|
+
break;
|
|
516
|
+
case "disable":
|
|
517
|
+
payload = await setTelemetryEnabled(false);
|
|
518
|
+
break;
|
|
519
|
+
default:
|
|
520
|
+
throw new Error("Usage: apex telemetry [status|enable|disable]");
|
|
521
|
+
}
|
|
522
|
+
if (isJsonMode(flags)) {
|
|
523
|
+
printJson(payload);
|
|
524
|
+
return payload;
|
|
525
|
+
}
|
|
526
|
+
logLine(`Telemetry: ${payload.enabled ? "enabled" : "disabled"}`, flags);
|
|
527
|
+
logLine(`Disabled by: ${formatTelemetryDisabledBy(payload.disabledBy)}`, flags);
|
|
528
|
+
logLine(`Endpoint: ${payload.endpointPath}`, flags);
|
|
529
|
+
logLine(`Client integration: ${payload.client.integration}`, flags);
|
|
530
|
+
if (payload.installId) {
|
|
531
|
+
logLine(`Install ID: ${payload.installId}`, flags);
|
|
532
|
+
}
|
|
533
|
+
return payload;
|
|
534
|
+
}
|
|
499
535
|
export async function commandDoctor(client, cwd, flags) {
|
|
500
536
|
const me = await ensureAuthenticated(client, flags);
|
|
501
537
|
try {
|
package/dist/config.js
CHANGED
|
@@ -32,12 +32,16 @@ export async function loadConfig() {
|
|
|
32
32
|
version: 1,
|
|
33
33
|
baseUrl: DEFAULT_BASE_URL,
|
|
34
34
|
defaultCompanyId: null,
|
|
35
|
+
telemetryDisabled: config?.telemetryDisabled ?? null,
|
|
36
|
+
telemetryInstallId: config?.telemetryInstallId ?? null,
|
|
35
37
|
};
|
|
36
38
|
}
|
|
37
39
|
return {
|
|
38
40
|
version: 1,
|
|
39
41
|
baseUrl: config.baseUrl,
|
|
40
42
|
defaultCompanyId: config.defaultCompanyId ?? null,
|
|
43
|
+
telemetryDisabled: config.telemetryDisabled ?? null,
|
|
44
|
+
telemetryInstallId: config.telemetryInstallId ?? null,
|
|
41
45
|
};
|
|
42
46
|
}
|
|
43
47
|
export async function saveConfig(config) {
|
package/dist/help.js
CHANGED
|
@@ -21,7 +21,10 @@ export const CLI_HELP_TEXT = `Usage:
|
|
|
21
21
|
apex login Sign in to Apex
|
|
22
22
|
apex logout Sign out locally
|
|
23
23
|
apex mcp Start the Apex MCP server over stdio
|
|
24
|
-
apex setup [all|codex|claude]
|
|
24
|
+
apex setup [all|codex|claude|copilot]
|
|
25
|
+
Configure Apex for Codex, Claude Code, and GitHub Copilot CLI
|
|
26
|
+
apex telemetry [status|enable|disable]
|
|
27
|
+
Show or change local anonymous usage telemetry settings
|
|
25
28
|
apex update Update the local Apex CLI install
|
|
26
29
|
apex connect github Open the GitHub connection flow
|
|
27
30
|
apex connect gitlab Open the GitLab connection flow
|
|
@@ -65,6 +68,7 @@ Tips:
|
|
|
65
68
|
Invalid finding feedback requires --dismissal-reason.
|
|
66
69
|
Fix review scans require valid feedback with --label fixed and at least one --fix-pr-url, then apex findings fix-review.
|
|
67
70
|
Finding identifiers such as KERN2-25 resolve against the selected scan; pass --scan or use the finding UUID directly when needed.
|
|
71
|
+
Anonymous usage telemetry helps Apex understand CLI, MCP, Codex, Claude, and Copilot usage. Disable it with apex telemetry disable or APEX_TELEMETRY_DISABLED=1.
|
|
68
72
|
Quote workspace names that contain spaces:
|
|
69
73
|
apex workspace use "Core Platform"
|
|
70
74
|
`;
|
|
@@ -89,6 +93,8 @@ Commands:
|
|
|
89
93
|
/cancel-scan [scan-id] Cancel a running or most recent scan
|
|
90
94
|
/status [scan-id] Show progress for the most recent or selected scan
|
|
91
95
|
/doctor Validate auth, repos, connections, and workspace binding
|
|
96
|
+
/telemetry [status|enable|disable]
|
|
97
|
+
Show or change local anonymous usage telemetry settings
|
|
92
98
|
/update Update the local Apex CLI install and exit the shell
|
|
93
99
|
/logout Sign out locally and exit the shell
|
|
94
100
|
/repos List detected repositories
|
|
@@ -111,5 +117,6 @@ Tips:
|
|
|
111
117
|
Invalid finding feedback requires a dismissal reason.
|
|
112
118
|
Fix review scans require fixed valid feedback with a Fix PR URL. Use scripted CLI or MCP for attaching Fix PR URLs.
|
|
113
119
|
Use scripted CLI flags for advanced feedback options such as suggested severity or dismissal reason.
|
|
120
|
+
Anonymous usage telemetry can be disabled with /telemetry disable or APEX_TELEMETRY_DISABLED=1.
|
|
114
121
|
Quote workspace names that contain spaces: /workspace use "Core Platform"
|
|
115
122
|
`;
|