@respan/cli 0.14.2 → 0.16.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@respan/cli",
3
- "version": "0.14.2",
3
+ "version": "0.16.0",
4
4
  "description": "Respan CLI - manage your LLM observability from the command line",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -17,9 +17,8 @@
17
17
  "directory": "javascript-sdks/respan-cli"
18
18
  },
19
19
  "scripts": {
20
- "build": "npm run generate:skill-refs && tsc && npm run build:hooks",
20
+ "build": "npm run clean && tsc && npm run build:hooks",
21
21
  "build:hooks": "node -e \"const{build}=require('esbuild');const hooks=['claude-code','codex-cli','gemini-cli'];Promise.all(hooks.map(h=>build({entryPoints:['src/hooks/'+h+'.ts'],bundle:true,platform:'node',target:'node18',format:'cjs',outfile:'dist/hooks/'+h+'.cjs',external:[]}))).then(()=>console.log('Hooks bundled.'))\"",
22
- "generate:skill-refs": "node scripts/embed-skill-refs.mjs",
23
22
  "test": "npm run build && node --test tests/*.test.mjs",
24
23
  "clean": "rm -rf dist",
25
24
  "dev": "node --loader ts-node/esm bin/dev.js",
@@ -47,6 +46,7 @@
47
46
  },
48
47
  "dependencies": {
49
48
  "@inquirer/prompts": "^7",
49
+ "@modelcontextprotocol/sdk": "^1.25.1",
50
50
  "@oclif/core": "^4",
51
51
  "@oclif/plugin-autocomplete": "^3",
52
52
  "@oclif/plugin-help": "^6",
@@ -1,25 +0,0 @@
1
- import { BaseCommand } from '../../lib/base-command.js';
2
- export default class IntegrateClaudeCode extends BaseCommand {
3
- static description: string;
4
- static examples: string[];
5
- static flags: {
6
- local: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
- global: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
- enable: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
- disable: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
- 'project-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
- 'base-url': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
- attrs: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
- 'customer-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
- 'span-name': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
- 'workflow-name': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
- 'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
- 'api-key': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
- profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
- json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
20
- csv: import("@oclif/core/interfaces").BooleanFlag<boolean>;
21
- verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
22
- };
23
- run(): Promise<void>;
24
- private resolveApiKey;
25
- }
@@ -1,210 +0,0 @@
1
- import * as fs from 'node:fs';
2
- // execSync no longer needed — JS hooks don't require pip install
3
- import { BaseCommand } from '../../lib/base-command.js';
4
- import { integrateFlags, deepMerge, readJsonFile, writeJsonFile, writeTextFile, expandHome, parseAttrs, getJsHookScript, resolveScope, findProjectRoot, } from '../../lib/integrate.js';
5
- class IntegrateClaudeCode extends BaseCommand {
6
- async run() {
7
- const { flags } = await this.parse(IntegrateClaudeCode);
8
- this.globalFlags = flags;
9
- try {
10
- const dryRun = flags['dry-run'];
11
- const scope = resolveScope(flags, 'both');
12
- const doLocal = scope === 'local' || scope === 'both';
13
- // ── Disable mode ─────────────────────────────────────────────
14
- if (flags.disable) {
15
- // Remove the Stop hook entry from global settings
16
- const globalSettingsPath = expandHome('~/.claude/settings.json');
17
- const globalSettings = readJsonFile(globalSettingsPath);
18
- const hooksSection = (globalSettings.hooks || {});
19
- if (Array.isArray(hooksSection.Stop)) {
20
- hooksSection.Stop = hooksSection.Stop.filter((entry) => {
21
- const inner = Array.isArray(entry.hooks)
22
- ? entry.hooks
23
- : [];
24
- return !inner.some((h) => typeof h.command === 'string' &&
25
- (h.command.includes('respan') || h.command.includes('hook.py') || h.command.includes('claude-code')));
26
- });
27
- }
28
- const merged = deepMerge(globalSettings, { hooks: hooksSection });
29
- if (dryRun) {
30
- this.log(`[dry-run] Would update: ${globalSettingsPath}`);
31
- this.log(JSON.stringify(merged, null, 2));
32
- }
33
- else {
34
- writeJsonFile(globalSettingsPath, merged);
35
- this.log(`Removed hook entry: ${globalSettingsPath}`);
36
- }
37
- this.log('Claude Code tracing disabled. Run "respan integrate claude-code" to re-enable.');
38
- return;
39
- }
40
- // ── Enable mode (default) ────────────────────────────────────
41
- // Verify the user is authenticated (key is read by hook from ~/.respan/)
42
- this.resolveApiKey();
43
- const baseUrl = flags['base-url'];
44
- const projectId = flags['project-id'];
45
- const customerId = flags['customer-id'];
46
- const spanName = flags['span-name'];
47
- const workflowName = flags['workflow-name'];
48
- const attrs = parseAttrs(flags.attrs);
49
- // Claude Code default: both global + local.
50
- const doGlobal = scope === 'global' || scope === 'both';
51
- // ── Global: hook script + registration ────────────────────────
52
- if (doGlobal) {
53
- // 1. Write JS hook script (no Python dependency needed)
54
- const hookDir = expandHome('~/.respan/hooks');
55
- const hookPath = `${hookDir}/claude-code.cjs`;
56
- if (dryRun) {
57
- this.log(`[dry-run] Would write hook script to: ${hookPath}`);
58
- }
59
- else {
60
- writeTextFile(hookPath, getJsHookScript('claude-code'));
61
- fs.chmodSync(hookPath, 0o755);
62
- this.log(`Wrote hook script: ${hookPath}`);
63
- }
64
- // 2. Register Stop hook in global settings (no credentials here)
65
- const globalSettingsPath = expandHome('~/.claude/settings.json');
66
- const globalSettings = readJsonFile(globalSettingsPath);
67
- const hookEntry = {
68
- matcher: '',
69
- hooks: [{ type: 'command', command: `node ${hookPath}` }],
70
- };
71
- const hooksSection = (globalSettings.hooks || {});
72
- const stopHooks = Array.isArray(hooksSection.Stop)
73
- ? [...hooksSection.Stop]
74
- : [];
75
- const existingIdx = stopHooks.findIndex((entry) => {
76
- const inner = Array.isArray(entry.hooks)
77
- ? entry.hooks
78
- : [];
79
- return inner.some((h) => typeof h.command === 'string' &&
80
- (h.command.includes('respan') || h.command.includes('hook.py') || h.command.includes('claude-code.js')));
81
- });
82
- if (existingIdx >= 0) {
83
- stopHooks[existingIdx] = hookEntry;
84
- }
85
- else {
86
- stopHooks.push(hookEntry);
87
- }
88
- const mergedGlobal = deepMerge(globalSettings, {
89
- hooks: { ...hooksSection, Stop: stopHooks },
90
- });
91
- if (dryRun) {
92
- this.log(`[dry-run] Would update: ${globalSettingsPath}`);
93
- this.log(JSON.stringify(mergedGlobal, null, 2));
94
- }
95
- else {
96
- writeJsonFile(globalSettingsPath, mergedGlobal);
97
- this.log(`Updated global settings: ${globalSettingsPath}`);
98
- }
99
- }
100
- // ── Local: credentials + enable in .claude/settings.local.json ─
101
- if (doLocal) {
102
- const projectRoot = findProjectRoot();
103
- const localSettingsPath = `${projectRoot}/.claude/settings.local.json`;
104
- const localSettings = readJsonFile(localSettingsPath);
105
- // settings.local.json: enable flag only (API key from ~/.respan/)
106
- const envBlock = {
107
- TRACE_TO_RESPAN: 'true',
108
- };
109
- const mergedLocal = deepMerge(localSettings, { env: envBlock });
110
- if (dryRun) {
111
- this.log(`[dry-run] Would update: ${localSettingsPath}`);
112
- this.log(JSON.stringify(mergedLocal, null, 2));
113
- }
114
- else {
115
- writeJsonFile(localSettingsPath, mergedLocal);
116
- this.log(`Updated project settings: ${localSettingsPath}`);
117
- }
118
- // respan.json: non-secret config (known fields + custom properties)
119
- const respanConfigPath = `${projectRoot}/.claude/respan.json`;
120
- const respanConfig = readJsonFile(respanConfigPath);
121
- const newConfig = { ...respanConfig };
122
- if (customerId) {
123
- newConfig.customer_id = customerId;
124
- }
125
- if (spanName) {
126
- newConfig.span_name = spanName;
127
- }
128
- if (workflowName) {
129
- newConfig.workflow_name = workflowName;
130
- }
131
- if (projectId) {
132
- newConfig.project_id = projectId;
133
- }
134
- // Custom attrs go as top-level keys (unknown keys = custom properties)
135
- for (const [k, v] of Object.entries(attrs)) {
136
- newConfig[k] = v;
137
- }
138
- if (Object.keys(newConfig).length > 0) {
139
- if (dryRun) {
140
- this.log(`[dry-run] Would write: ${respanConfigPath}`);
141
- this.log(JSON.stringify(newConfig, null, 2));
142
- }
143
- else {
144
- writeJsonFile(respanConfigPath, newConfig);
145
- this.log(`Wrote Respan config: ${respanConfigPath}`);
146
- }
147
- }
148
- }
149
- // ── Done ──────────────────────────────────────────────────────
150
- this.log('');
151
- if (doGlobal && doLocal) {
152
- this.log('Claude Code integration complete (global hook + project config).');
153
- }
154
- else if (doGlobal) {
155
- this.log('Claude Code global hook installed.');
156
- this.log('Run without --global in a project to enable tracing there.');
157
- }
158
- else {
159
- this.log('Claude Code tracing enabled for this project.');
160
- }
161
- this.log('');
162
- this.log('Auth: ~/.respan/credentials.json (from `respan auth login`)');
163
- this.log('Config: .claude/respan.json (shareable, non-secret)');
164
- this.log('');
165
- this.log('Set properties via integrate flags or edit .claude/respan.json:');
166
- this.log(' respan integrate claude-code --customer-id "frank" --span-name "my-app"');
167
- this.log(' respan integrate claude-code --attrs \'{"team":"platform","env":"staging"}\'');
168
- this.log('');
169
- this.log('Override per-session with env vars:');
170
- this.log(' export RESPAN_CUSTOMER_ID="your-name"');
171
- this.log(" export RESPAN_METADATA='{\"task_id\":\"T-123\"}'");
172
- }
173
- catch (error) {
174
- this.handleError(error);
175
- }
176
- }
177
- resolveApiKey() {
178
- const auth = this.getAuth();
179
- if (auth.apiKey)
180
- return auth.apiKey;
181
- if (auth.accessToken) {
182
- this.warn('Using access token (JWT) which may expire. Consider using an API key instead.');
183
- return auth.accessToken;
184
- }
185
- this.error('No API key found. Pass --api-key, set RESPAN_API_KEY, or run: respan auth login');
186
- }
187
- }
188
- IntegrateClaudeCode.description = `Integrate Respan with Claude Code.
189
-
190
- Installs a Stop hook that reads conversation transcripts and sends
191
- them to Respan as structured spans (chat, tool, thinking).
192
-
193
- Scope:
194
- --global Install hook script + register in ~/.claude/settings.json
195
- --local Write credentials + enable flag to .claude/settings.local.json
196
-
197
- Default behavior installs the global hook and writes local project config.`;
198
- IntegrateClaudeCode.examples = [
199
- 'respan integrate claude-code',
200
- 'respan integrate claude-code --disable',
201
- 'respan integrate claude-code --global',
202
- 'respan integrate claude-code --local --project-id my-project',
203
- 'respan integrate claude-code --attrs \'{"env":"prod"}\'',
204
- 'respan integrate claude-code --dry-run',
205
- ];
206
- IntegrateClaudeCode.flags = {
207
- ...BaseCommand.baseFlags,
208
- ...integrateFlags,
209
- };
210
- export default IntegrateClaudeCode;
@@ -1,33 +0,0 @@
1
- import { BaseCommand } from '../../lib/base-command.js';
2
- export default class IntegrateCodexCli extends BaseCommand {
3
- static description: string;
4
- static examples: string[];
5
- static flags: {
6
- local: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
- global: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
- enable: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
- disable: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
- 'project-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
- 'base-url': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
- attrs: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
- 'customer-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
- 'span-name': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
- 'workflow-name': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
- 'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
- 'api-key': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
- profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
- json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
20
- csv: import("@oclif/core/interfaces").BooleanFlag<boolean>;
21
- verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
22
- };
23
- run(): Promise<void>;
24
- /**
25
- * Update or insert the `notify` line in a TOML config string.
26
- *
27
- * TOML bare keys must appear before the first [table] header.
28
- * If a `notify` line already exists, replace it in-place.
29
- * Otherwise, insert the notify line before the first [table] header.
30
- */
31
- private updateTomlNotify;
32
- private resolveApiKey;
33
- }
@@ -1,191 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import { BaseCommand } from '../../lib/base-command.js';
3
- import { integrateFlags, readTextFile, writeTextFile, writeJsonFile, readJsonFile, expandHome, parseAttrs, getJsHookScript, resolveScope, findProjectRoot, } from '../../lib/integrate.js';
4
- class IntegrateCodexCli extends BaseCommand {
5
- async run() {
6
- const { flags } = await this.parse(IntegrateCodexCli);
7
- this.globalFlags = flags;
8
- try {
9
- const dryRun = flags['dry-run'];
10
- // ── Disable mode ─────────────────────────────────────────────
11
- if (flags.disable) {
12
- // Remove the notify line from ~/.codex/config.toml
13
- const configPath = expandHome('~/.codex/config.toml');
14
- const existing = readTextFile(configPath);
15
- const lines = existing.split('\n');
16
- const filtered = lines.filter((line) => !/^\s*notify\s*=/.test(line) && !line.includes('respan integrate codex-cli'));
17
- if (dryRun) {
18
- this.log(`[dry-run] Would update: ${configPath}`);
19
- this.log(filtered.join('\n'));
20
- }
21
- else {
22
- writeTextFile(configPath, filtered.join('\n'));
23
- this.log(`Removed notify hook: ${configPath}`);
24
- }
25
- this.log('Codex CLI tracing disabled. Run "respan integrate codex-cli" to re-enable.');
26
- return;
27
- }
28
- // ── Enable mode (default) ────────────────────────────────────
29
- // Verify the user is authenticated (key is read by hook from ~/.respan/)
30
- this.resolveApiKey();
31
- const projectId = flags['project-id'];
32
- const customerId = flags['customer-id'];
33
- const spanName = flags['span-name'];
34
- const workflowName = flags['workflow-name'];
35
- const attrs = parseAttrs(flags.attrs);
36
- // Codex CLI default: both global + local
37
- const scope = resolveScope(flags, 'both');
38
- const doGlobal = scope === 'global' || scope === 'both';
39
- const doLocal = scope === 'local' || scope === 'both';
40
- // ── Global: hook script + notify registration ──────────────────
41
- if (doGlobal) {
42
- // 1. Write JS hook script (no Python dependency needed)
43
- const hookDir = expandHome('~/.respan/hooks');
44
- const hookPath = `${hookDir}/codex-cli.cjs`;
45
- if (dryRun) {
46
- this.log(`[dry-run] Would write hook script to: ${hookPath}`);
47
- }
48
- else {
49
- writeTextFile(hookPath, getJsHookScript('codex-cli'));
50
- fs.chmodSync(hookPath, 0o755);
51
- this.log(`Wrote hook script: ${hookPath}`);
52
- }
53
- // 2. Register notify hook in ~/.codex/config.toml
54
- const configPath = expandHome('~/.codex/config.toml');
55
- const existing = readTextFile(configPath);
56
- const notifyValue = `notify = ["node", "${hookPath}"]`;
57
- const updated = this.updateTomlNotify(existing, notifyValue);
58
- if (dryRun) {
59
- this.log(`[dry-run] Would update: ${configPath}`);
60
- this.log(updated);
61
- }
62
- else {
63
- writeTextFile(configPath, updated);
64
- this.log(`Updated config: ${configPath}`);
65
- }
66
- }
67
- // ── Local: .codex/respan.json ──────────────────────────────────
68
- if (doLocal) {
69
- const projectRoot = findProjectRoot();
70
- const respanConfigPath = `${projectRoot}/.codex/respan.json`;
71
- const respanConfig = readJsonFile(respanConfigPath);
72
- const newConfig = { ...respanConfig };
73
- if (customerId) {
74
- newConfig.customer_id = customerId;
75
- }
76
- if (spanName) {
77
- newConfig.span_name = spanName;
78
- }
79
- if (workflowName) {
80
- newConfig.workflow_name = workflowName;
81
- }
82
- if (projectId) {
83
- newConfig.project_id = projectId;
84
- }
85
- // Custom attrs go as top-level keys (unknown keys = custom properties)
86
- for (const [k, v] of Object.entries(attrs)) {
87
- newConfig[k] = v;
88
- }
89
- if (Object.keys(newConfig).length > 0) {
90
- if (dryRun) {
91
- this.log(`[dry-run] Would write: ${respanConfigPath}`);
92
- this.log(JSON.stringify(newConfig, null, 2));
93
- }
94
- else {
95
- writeJsonFile(respanConfigPath, newConfig);
96
- this.log(`Wrote Respan config: ${respanConfigPath}`);
97
- }
98
- }
99
- }
100
- // ── Done ────────────────────────────────────────────────────────
101
- this.log('');
102
- if (doGlobal && doLocal) {
103
- this.log('Codex CLI integration complete (global hook + project config).');
104
- }
105
- else if (doGlobal) {
106
- this.log('Codex CLI global hook installed.');
107
- this.log('Run without --global in a project to configure tracing there.');
108
- }
109
- else {
110
- this.log('Codex CLI tracing configured for this project.');
111
- }
112
- this.log('');
113
- this.log('Auth: ~/.respan/credentials.json (from `respan auth login`)');
114
- this.log('Config: .codex/respan.json (shareable, non-secret)');
115
- this.log('');
116
- this.log('Set properties via integrate flags or edit .codex/respan.json:');
117
- this.log(' respan integrate codex-cli --customer-id "frank" --span-name "my-app"');
118
- this.log(' respan integrate codex-cli --attrs \'{"team":"platform","env":"staging"}\'');
119
- this.log('');
120
- this.log('Override per-session with env vars:');
121
- this.log(' export RESPAN_CUSTOMER_ID="your-name"');
122
- this.log(" export RESPAN_METADATA='{\"task_id\":\"T-123\"}'");
123
- this.log('');
124
- this.log('Debug: CODEX_RESPAN_DEBUG=true → check ~/.codex/state/respan_hook.log');
125
- }
126
- catch (error) {
127
- this.handleError(error);
128
- }
129
- }
130
- /**
131
- * Update or insert the `notify` line in a TOML config string.
132
- *
133
- * TOML bare keys must appear before the first [table] header.
134
- * If a `notify` line already exists, replace it in-place.
135
- * Otherwise, insert the notify line before the first [table] header.
136
- */
137
- updateTomlNotify(existing, notifyValue) {
138
- const lines = existing.split('\n');
139
- // Check if notify line already exists
140
- const notifyIdx = lines.findIndex((line) => /^\s*notify\s*=/.test(line));
141
- if (notifyIdx >= 0) {
142
- // Replace existing notify line
143
- lines[notifyIdx] = notifyValue;
144
- return lines.join('\n');
145
- }
146
- // Find the first [table] header to insert before it
147
- const firstTableIdx = lines.findIndex((line) => /^\s*\[/.test(line));
148
- if (firstTableIdx >= 0) {
149
- // Insert notify + comment before the first table header
150
- lines.splice(firstTableIdx, 0, '# Respan observability (added by respan integrate codex-cli)', notifyValue, '');
151
- }
152
- else {
153
- // No tables at all — append to end
154
- lines.push('', '# Respan observability (added by respan integrate codex-cli)', notifyValue);
155
- }
156
- return lines.join('\n');
157
- }
158
- resolveApiKey() {
159
- const auth = this.getAuth();
160
- if (auth.apiKey)
161
- return auth.apiKey;
162
- if (auth.accessToken) {
163
- this.warn('Using access token (JWT) which may expire. Consider using an API key instead.');
164
- return auth.accessToken;
165
- }
166
- this.error('No API key found. Pass --api-key, set RESPAN_API_KEY, or run: respan auth login');
167
- }
168
- }
169
- IntegrateCodexCli.description = `Integrate Respan with Codex CLI.
170
-
171
- Installs a notify hook that reads session JSONL files and sends
172
- them to Respan as structured spans (chat, tool, reasoning).
173
-
174
- Scope:
175
- --global Install hook script + register notify in ~/.codex/config.toml
176
- --local Write .codex/respan.json with customer_id, span_name, etc.
177
-
178
- Default behavior installs the global notify hook and writes local project config.`;
179
- IntegrateCodexCli.examples = [
180
- 'respan integrate codex-cli',
181
- 'respan integrate codex-cli --disable',
182
- 'respan integrate codex-cli --global',
183
- 'respan integrate codex-cli --local --customer-id frank',
184
- 'respan integrate codex-cli --attrs \'{"env":"prod"}\'',
185
- 'respan integrate codex-cli --dry-run',
186
- ];
187
- IntegrateCodexCli.flags = {
188
- ...BaseCommand.baseFlags,
189
- ...integrateFlags,
190
- };
191
- export default IntegrateCodexCli;
@@ -1,25 +0,0 @@
1
- import { BaseCommand } from '../../lib/base-command.js';
2
- export default class IntegrateGeminiCli extends BaseCommand {
3
- static description: string;
4
- static examples: string[];
5
- static flags: {
6
- local: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
- global: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
- enable: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
- disable: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
- 'project-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
- 'base-url': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
- attrs: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
- 'customer-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
- 'span-name': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
- 'workflow-name': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
- 'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
- 'api-key': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
- profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
- json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
20
- csv: import("@oclif/core/interfaces").BooleanFlag<boolean>;
21
- verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
22
- };
23
- run(): Promise<void>;
24
- private resolveApiKey;
25
- }