@principal-ai/principal-studio-cli 0.35.3
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 +172 -0
- package/dist/commands/agent-session.d.ts +3 -0
- package/dist/commands/agent-session.d.ts.map +1 -0
- package/dist/commands/agent-session.js +67 -0
- package/dist/commands/agent-sessions.d.ts +11 -0
- package/dist/commands/agent-sessions.d.ts.map +1 -0
- package/dist/commands/agent-sessions.js +39 -0
- package/dist/commands/auxiliary/index.d.ts +3 -0
- package/dist/commands/auxiliary/index.d.ts.map +1 -0
- package/dist/commands/auxiliary/index.js +9 -0
- package/dist/commands/auxiliary/validate.d.ts +3 -0
- package/dist/commands/auxiliary/validate.d.ts.map +1 -0
- package/dist/commands/auxiliary/validate.js +123 -0
- package/dist/commands/collector/check.d.ts +6 -0
- package/dist/commands/collector/check.d.ts.map +1 -0
- package/dist/commands/collector/check.js +153 -0
- package/dist/commands/collector/diagnose.d.ts +6 -0
- package/dist/commands/collector/diagnose.d.ts.map +1 -0
- package/dist/commands/collector/diagnose.js +229 -0
- package/dist/commands/collector/index.d.ts +6 -0
- package/dist/commands/collector/index.d.ts.map +1 -0
- package/dist/commands/collector/index.js +16 -0
- package/dist/commands/collector/status.d.ts +6 -0
- package/dist/commands/collector/status.d.ts.map +1 -0
- package/dist/commands/collector/status.js +77 -0
- package/dist/commands/collector/utils.d.ts +92 -0
- package/dist/commands/collector/utils.d.ts.map +1 -0
- package/dist/commands/collector/utils.js +154 -0
- package/dist/commands/coverage.d.ts +9 -0
- package/dist/commands/coverage.d.ts.map +1 -0
- package/dist/commands/coverage.js +252 -0
- package/dist/commands/create.d.ts +6 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +50 -0
- package/dist/commands/events/index.d.ts +3 -0
- package/dist/commands/events/index.d.ts.map +1 -0
- package/dist/commands/events/index.js +9 -0
- package/dist/commands/events/validate.d.ts +3 -0
- package/dist/commands/events/validate.d.ts.map +1 -0
- package/dist/commands/events/validate.js +124 -0
- package/dist/commands/formats.d.ts +6 -0
- package/dist/commands/formats.d.ts.map +1 -0
- package/dist/commands/formats.js +1118 -0
- package/dist/commands/hooks.d.ts +9 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +295 -0
- package/dist/commands/inbox.d.ts +13 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +179 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +220 -0
- package/dist/commands/lint.d.ts +11 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +71 -0
- package/dist/commands/list.d.ts +6 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +78 -0
- package/dist/commands/migrate-nodes.d.ts +9 -0
- package/dist/commands/migrate-nodes.d.ts.map +1 -0
- package/dist/commands/migrate-nodes.js +363 -0
- package/dist/commands/migrate-scopes-to-canvas.d.ts +3 -0
- package/dist/commands/migrate-scopes-to-canvas.d.ts.map +1 -0
- package/dist/commands/migrate-scopes-to-canvas.js +143 -0
- package/dist/commands/migration.d.ts +6 -0
- package/dist/commands/migration.d.ts.map +1 -0
- package/dist/commands/migration.js +247 -0
- package/dist/commands/open-studio.d.ts +10 -0
- package/dist/commands/open-studio.d.ts.map +1 -0
- package/dist/commands/open-studio.js +32 -0
- package/dist/commands/opencode/fetch.d.ts +3 -0
- package/dist/commands/opencode/fetch.d.ts.map +1 -0
- package/dist/commands/opencode/fetch.js +25 -0
- package/dist/commands/opencode/index.d.ts +3 -0
- package/dist/commands/opencode/index.d.ts.map +1 -0
- package/dist/commands/opencode/index.js +11 -0
- package/dist/commands/opencode/list-sessions.d.ts +3 -0
- package/dist/commands/opencode/list-sessions.d.ts.map +1 -0
- package/dist/commands/opencode/list-sessions.js +20 -0
- package/dist/commands/repo.d.ts +18 -0
- package/dist/commands/repo.d.ts.map +1 -0
- package/dist/commands/repo.js +233 -0
- package/dist/commands/schema.d.ts +6 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +367 -0
- package/dist/commands/scopes/index.d.ts +3 -0
- package/dist/commands/scopes/index.d.ts.map +1 -0
- package/dist/commands/scopes/index.js +9 -0
- package/dist/commands/scopes/validate.d.ts +3 -0
- package/dist/commands/scopes/validate.d.ts.map +1 -0
- package/dist/commands/scopes/validate.js +187 -0
- package/dist/commands/setup.d.ts +6 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +406 -0
- package/dist/commands/starred-collections.d.ts +12 -0
- package/dist/commands/starred-collections.d.ts.map +1 -0
- package/dist/commands/starred-collections.js +310 -0
- package/dist/commands/subsystem-model.d.ts +11 -0
- package/dist/commands/subsystem-model.d.ts.map +1 -0
- package/dist/commands/subsystem-model.js +249 -0
- package/dist/commands/topic.d.ts +15 -0
- package/dist/commands/topic.d.ts.map +1 -0
- package/dist/commands/topic.js +683 -0
- package/dist/commands/tour.d.ts +23 -0
- package/dist/commands/tour.d.ts.map +1 -0
- package/dist/commands/tour.js +783 -0
- package/dist/commands/trace/flow.d.ts +6 -0
- package/dist/commands/trace/flow.d.ts.map +1 -0
- package/dist/commands/trace/flow.js +158 -0
- package/dist/commands/trace/index.d.ts +6 -0
- package/dist/commands/trace/index.d.ts.map +1 -0
- package/dist/commands/trace/index.js +20 -0
- package/dist/commands/trace/inspect.d.ts +6 -0
- package/dist/commands/trace/inspect.d.ts.map +1 -0
- package/dist/commands/trace/inspect.js +187 -0
- package/dist/commands/trace/list.d.ts +6 -0
- package/dist/commands/trace/list.d.ts.map +1 -0
- package/dist/commands/trace/list.js +145 -0
- package/dist/commands/trace/registrations.d.ts +6 -0
- package/dist/commands/trace/registrations.d.ts.map +1 -0
- package/dist/commands/trace/registrations.js +81 -0
- package/dist/commands/trace/validate.d.ts +6 -0
- package/dist/commands/trace/validate.d.ts.map +1 -0
- package/dist/commands/trace/validate.js +276 -0
- package/dist/commands/trail.d.ts +36 -0
- package/dist/commands/trail.d.ts.map +1 -0
- package/dist/commands/trail.js +622 -0
- package/dist/commands/validate.d.ts +12 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +3334 -0
- package/dist/commands/workflow/implementation.d.ts +3 -0
- package/dist/commands/workflow/implementation.d.ts.map +1 -0
- package/dist/commands/workflow/implementation.js +51 -0
- package/dist/commands/workflow/index.d.ts +3 -0
- package/dist/commands/workflow/index.d.ts.map +1 -0
- package/dist/commands/workflow/index.js +19 -0
- package/dist/commands/workflow/inspect.d.ts +3 -0
- package/dist/commands/workflow/inspect.d.ts.map +1 -0
- package/dist/commands/workflow/inspect.js +123 -0
- package/dist/commands/workflow/list.d.ts +3 -0
- package/dist/commands/workflow/list.d.ts.map +1 -0
- package/dist/commands/workflow/list.js +95 -0
- package/dist/commands/workflow/render.d.ts +3 -0
- package/dist/commands/workflow/render.d.ts.map +1 -0
- package/dist/commands/workflow/render.js +88 -0
- package/dist/commands/workflow/test.d.ts +3 -0
- package/dist/commands/workflow/test.d.ts.map +1 -0
- package/dist/commands/workflow/test.js +141 -0
- package/dist/commands/workflow/utils.d.ts +49 -0
- package/dist/commands/workflow/utils.d.ts.map +1 -0
- package/dist/commands/workflow/utils.js +164 -0
- package/dist/commands/workflow/validate.d.ts +3 -0
- package/dist/commands/workflow/validate.d.ts.map +1 -0
- package/dist/commands/workflow/validate.js +344 -0
- package/dist/file-utils.d.ts +15 -0
- package/dist/file-utils.d.ts.map +1 -0
- package/dist/file-utils.js +29 -0
- package/dist/index.cjs +285718 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/lib/bridge-ipc.d.ts +29 -0
- package/dist/lib/bridge-ipc.d.ts.map +1 -0
- package/dist/lib/bridge-ipc.js +128 -0
- package/dist/lib/github-user.d.ts +17 -0
- package/dist/lib/github-user.d.ts.map +1 -0
- package/dist/lib/github-user.js +53 -0
- package/dist/lib/open-url.d.ts +11 -0
- package/dist/lib/open-url.d.ts.map +1 -0
- package/dist/lib/open-url.js +45 -0
- package/dist/lib/subsystem-model-store.d.ts +74 -0
- package/dist/lib/subsystem-model-store.d.ts.map +1 -0
- package/dist/lib/subsystem-model-store.js +292 -0
- package/dist/lib/tour-cache.d.ts +26 -0
- package/dist/lib/tour-cache.d.ts.map +1 -0
- package/dist/lib/tour-cache.js +46 -0
- package/dist/lib/trail-cache.d.ts +40 -0
- package/dist/lib/trail-cache.d.ts.map +1 -0
- package/dist/lib/trail-cache.js +97 -0
- package/dist/lib/viewer-ipc.d.ts +44 -0
- package/dist/lib/viewer-ipc.d.ts.map +1 -0
- package/dist/lib/viewer-ipc.js +68 -0
- package/package.json +68 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trace validate - Validate traces against workflow.json definitions
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { readFile } from 'node:fs/promises';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
import { selectScenario, ExecutionValidator, } from '@principal-ai/subsystems-core';
|
|
9
|
+
const DEFAULT_APP_PORT = 3043;
|
|
10
|
+
export function createValidateCommand() {
|
|
11
|
+
const command = new Command('validate');
|
|
12
|
+
command
|
|
13
|
+
.description('Validate traces against a workflow.json definition')
|
|
14
|
+
.requiredOption('-w, --workflow <path>', 'Path to .workflow.json file')
|
|
15
|
+
.option('-p, --port <port>', 'Electron-app port (default: 3043, dev: 3045)')
|
|
16
|
+
.option('-n, --limit <count>', 'Number of traces to validate (default: 10)')
|
|
17
|
+
.option('-t, --trace-id <id>', 'Validate a specific trace by ID')
|
|
18
|
+
.option('--show-all', 'Show all scenario match details')
|
|
19
|
+
.option('--json', 'Output as JSON')
|
|
20
|
+
.action(async (options) => {
|
|
21
|
+
try {
|
|
22
|
+
const appPort = options.port ? parseInt(options.port, 10) : DEFAULT_APP_PORT;
|
|
23
|
+
const limit = options.limit ? parseInt(options.limit, 10) : 10;
|
|
24
|
+
// Load workflow
|
|
25
|
+
const workflow = await loadWorkflow(resolve(options.workflow));
|
|
26
|
+
// Fetch traces from electron-app
|
|
27
|
+
const traces = await fetchTraces(appPort, limit, options.traceId);
|
|
28
|
+
if (traces.length === 0) {
|
|
29
|
+
if (options.json) {
|
|
30
|
+
console.log(JSON.stringify({ success: false, error: 'No traces found', results: [] }, null, 2));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.log(chalk.yellow('\nNo traces found to validate.'));
|
|
34
|
+
console.log(chalk.gray('Ensure the electron-app is receiving traces.'));
|
|
35
|
+
}
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
// Validate each trace
|
|
39
|
+
const results = await validateTraces(traces, workflow);
|
|
40
|
+
if (options.json) {
|
|
41
|
+
outputJson(results, workflow, options);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
outputText(results, workflow, options);
|
|
45
|
+
}
|
|
46
|
+
// Exit with error if any trace failed validation
|
|
47
|
+
const hasFailures = results.some((r) => !r.success);
|
|
48
|
+
if (hasFailures) {
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error(chalk.red('Error:'), error.message);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return command;
|
|
58
|
+
}
|
|
59
|
+
async function loadWorkflow(filePath) {
|
|
60
|
+
try {
|
|
61
|
+
const content = await readFile(filePath, 'utf-8');
|
|
62
|
+
return JSON.parse(content);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (error.code === 'ENOENT') {
|
|
66
|
+
throw new Error(`Workflow file not found: ${filePath}`);
|
|
67
|
+
}
|
|
68
|
+
throw new Error(`Failed to parse workflow file: ${error.message}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function fetchTraces(port, limit, traceId) {
|
|
72
|
+
const url = traceId
|
|
73
|
+
? `http://localhost:${port}/otel/traces/${traceId}`
|
|
74
|
+
: `http://localhost:${port}/otel/traces?limit=${limit}`;
|
|
75
|
+
try {
|
|
76
|
+
const response = await fetch(url, { signal: AbortSignal.timeout(5000) });
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
throw new Error(`Failed to fetch traces: ${response.statusText}`);
|
|
79
|
+
}
|
|
80
|
+
const data = await response.json();
|
|
81
|
+
if (traceId) {
|
|
82
|
+
// Single trace response
|
|
83
|
+
const singleResponse = data;
|
|
84
|
+
if (!singleResponse.success || !singleResponse.trace) {
|
|
85
|
+
throw new Error(singleResponse.error || 'Trace not found');
|
|
86
|
+
}
|
|
87
|
+
return [singleResponse.trace];
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// List response
|
|
91
|
+
const listResponse = data;
|
|
92
|
+
if (!listResponse.success) {
|
|
93
|
+
throw new Error(listResponse.error || 'Failed to fetch traces');
|
|
94
|
+
}
|
|
95
|
+
return listResponse.traces;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (error.name === 'AbortError') {
|
|
100
|
+
throw new Error('Request timeout - electron-app not responding');
|
|
101
|
+
}
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function validateTraces(traces, workflow) {
|
|
106
|
+
const results = [];
|
|
107
|
+
const validator = new ExecutionValidator();
|
|
108
|
+
for (const trace of traces) {
|
|
109
|
+
try {
|
|
110
|
+
// Convert OTLP format to ExecutionData
|
|
111
|
+
// The trace.data contains resourceSpans in OTLP format
|
|
112
|
+
const executionData = validator.validateOrThrow(trace.data, `trace:${trace.traceId}`);
|
|
113
|
+
// Convert to OtelEvent array
|
|
114
|
+
const events = executionToEvents(executionData);
|
|
115
|
+
// Run scenario matching
|
|
116
|
+
const matchResult = selectScenario(workflow, events);
|
|
117
|
+
// Extract service name
|
|
118
|
+
const serviceName = extractServiceName(trace);
|
|
119
|
+
// Count spans and events
|
|
120
|
+
const spanCount = executionData.spans.length;
|
|
121
|
+
const eventCount = events.length;
|
|
122
|
+
// Determine success: has at least one full match
|
|
123
|
+
const success = matchResult.fullMatches.length > 0;
|
|
124
|
+
results.push({
|
|
125
|
+
traceId: trace.traceId,
|
|
126
|
+
success,
|
|
127
|
+
serviceName,
|
|
128
|
+
spanCount,
|
|
129
|
+
eventCount,
|
|
130
|
+
matchResult: {
|
|
131
|
+
fullMatches: matchResult.fullMatches.map(toScenarioMatch),
|
|
132
|
+
partialMatches: matchResult.partialMatches.map(toScenarioMatch),
|
|
133
|
+
recommendedScenario: matchResult.recommendedScenario
|
|
134
|
+
? toScenarioMatch(matchResult.recommendedScenario)
|
|
135
|
+
: null,
|
|
136
|
+
totalTraceEvents: matchResult.totalTraceEvents,
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
results.push({
|
|
142
|
+
traceId: trace.traceId,
|
|
143
|
+
success: false,
|
|
144
|
+
serviceName: extractServiceName(trace),
|
|
145
|
+
spanCount: 0,
|
|
146
|
+
eventCount: 0,
|
|
147
|
+
matchResult: {
|
|
148
|
+
fullMatches: [],
|
|
149
|
+
partialMatches: [],
|
|
150
|
+
recommendedScenario: null,
|
|
151
|
+
totalTraceEvents: 0,
|
|
152
|
+
},
|
|
153
|
+
error: error.message,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return results;
|
|
158
|
+
}
|
|
159
|
+
function executionToEvents(execution) {
|
|
160
|
+
const events = [];
|
|
161
|
+
for (const span of execution.spans) {
|
|
162
|
+
for (const event of span.events) {
|
|
163
|
+
events.push({
|
|
164
|
+
name: event.name,
|
|
165
|
+
timestamp: event.time,
|
|
166
|
+
type: 'log',
|
|
167
|
+
attributes: {
|
|
168
|
+
...event.attributes,
|
|
169
|
+
'span.id': span.id,
|
|
170
|
+
'span.name': span.name,
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return events;
|
|
176
|
+
}
|
|
177
|
+
function toScenarioMatch(match) {
|
|
178
|
+
return {
|
|
179
|
+
scenarioId: match.scenario.id,
|
|
180
|
+
priority: match.scenario.priority,
|
|
181
|
+
matchPercentage: match.matchPercentage,
|
|
182
|
+
matchedEventCount: match.matchedEventCount,
|
|
183
|
+
totalRequiredEvents: match.totalRequiredEvents,
|
|
184
|
+
matchedEventNames: match.matchedEventNames,
|
|
185
|
+
missingEventNames: match.missingEventNames,
|
|
186
|
+
isFullMatch: match.isFullMatch,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function extractServiceName(trace) {
|
|
190
|
+
try {
|
|
191
|
+
const resourceSpans = trace.data.resourceSpans;
|
|
192
|
+
const attrs = resourceSpans?.[0]?.resource?.attributes ?? [];
|
|
193
|
+
const serviceAttr = attrs.find((a) => a.key === 'service.name');
|
|
194
|
+
return serviceAttr?.value?.stringValue ?? 'unknown';
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return 'unknown';
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function outputJson(results, workflow, options) {
|
|
201
|
+
const passed = results.filter((r) => r.success).length;
|
|
202
|
+
const failed = results.length - passed;
|
|
203
|
+
console.log(JSON.stringify({
|
|
204
|
+
workflow: {
|
|
205
|
+
name: workflow.name || options.workflow,
|
|
206
|
+
scenarios: workflow.scenarios.length,
|
|
207
|
+
},
|
|
208
|
+
summary: {
|
|
209
|
+
total: results.length,
|
|
210
|
+
passed,
|
|
211
|
+
failed,
|
|
212
|
+
passRate: results.length > 0 ? ((passed / results.length) * 100).toFixed(1) : '0',
|
|
213
|
+
},
|
|
214
|
+
results: results.map((r) => ({
|
|
215
|
+
traceId: r.traceId,
|
|
216
|
+
success: r.success,
|
|
217
|
+
serviceName: r.serviceName,
|
|
218
|
+
spanCount: r.spanCount,
|
|
219
|
+
eventCount: r.eventCount,
|
|
220
|
+
matchResult: r.matchResult,
|
|
221
|
+
error: r.error,
|
|
222
|
+
})),
|
|
223
|
+
}, null, 2));
|
|
224
|
+
}
|
|
225
|
+
function outputText(results, workflow, options) {
|
|
226
|
+
const passed = results.filter((r) => r.success).length;
|
|
227
|
+
const failed = results.length - passed;
|
|
228
|
+
console.log(chalk.bold('\nTrace Validation'));
|
|
229
|
+
console.log('━'.repeat(60));
|
|
230
|
+
console.log(chalk.gray(`Workflow: ${workflow.name || options.workflow}`));
|
|
231
|
+
console.log(chalk.gray(`Scenarios: ${workflow.scenarios.length}`));
|
|
232
|
+
console.log();
|
|
233
|
+
for (const result of results) {
|
|
234
|
+
const statusIcon = result.success ? chalk.green('✓') : chalk.red('✗');
|
|
235
|
+
const traceIdShort = result.traceId.slice(0, 16);
|
|
236
|
+
console.log(`${statusIcon} ${chalk.cyan(traceIdShort)}... ${chalk.gray(`(${result.serviceName})`)}`);
|
|
237
|
+
if (result.error) {
|
|
238
|
+
console.log(chalk.red(` Error: ${result.error}`));
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
console.log(chalk.gray(` Spans: ${result.spanCount}, Events: ${result.eventCount}`));
|
|
242
|
+
if (result.matchResult.fullMatches.length > 0) {
|
|
243
|
+
for (const match of result.matchResult.fullMatches) {
|
|
244
|
+
console.log(chalk.green(` ✓ ${match.scenarioId}`) +
|
|
245
|
+
chalk.gray(` (${match.matchedEventCount}/${match.totalRequiredEvents} events)`));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
else if (result.matchResult.partialMatches.length > 0) {
|
|
249
|
+
const top = result.matchResult.partialMatches[0];
|
|
250
|
+
console.log(chalk.yellow(` ~ ${top.scenarioId}`) +
|
|
251
|
+
chalk.gray(` (${top.matchPercentage.toFixed(0)}% - ${top.matchedEventCount}/${top.totalRequiredEvents})`));
|
|
252
|
+
if (options.showAll && top.missingEventNames.length > 0) {
|
|
253
|
+
console.log(chalk.gray(' Missing events:'));
|
|
254
|
+
for (const event of top.missingEventNames.slice(0, 5)) {
|
|
255
|
+
console.log(chalk.red(` ✗ ${event}`));
|
|
256
|
+
}
|
|
257
|
+
if (top.missingEventNames.length > 5) {
|
|
258
|
+
console.log(chalk.gray(` ... and ${top.missingEventNames.length - 5} more`));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
console.log(chalk.red(' ✗ No matching scenario'));
|
|
264
|
+
}
|
|
265
|
+
console.log();
|
|
266
|
+
}
|
|
267
|
+
console.log('━'.repeat(60));
|
|
268
|
+
if (failed === 0) {
|
|
269
|
+
console.log(chalk.green(`✓ All ${passed} trace(s) validated successfully`));
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
console.log(chalk.red(`✗ ${failed}/${results.length} trace(s) failed validation`));
|
|
273
|
+
console.log(chalk.gray(' Use --show-all to see missing events'));
|
|
274
|
+
}
|
|
275
|
+
console.log();
|
|
276
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trail command — fetch or publish trails to the Principal ADE backend.
|
|
3
|
+
*
|
|
4
|
+
* Resolves a GitHub token locally (gh CLI → git credential helper) and calls
|
|
5
|
+
* the web-ade trail API with `Authorization: Bearer <token>`. The token is
|
|
6
|
+
* never echoed to argv, env, stdout, or stderr. stdout is trail JSON (fetch)
|
|
7
|
+
* or the share URL (publish) only.
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
export declare const BASE_URL: string;
|
|
11
|
+
export declare function resolveToken(): string | null;
|
|
12
|
+
export declare function exitWithTokenError(): never;
|
|
13
|
+
export declare function describeHttpError(response: Response): Promise<string>;
|
|
14
|
+
export declare function gitRemoteUrl(cwd: string): string | null;
|
|
15
|
+
export declare function ownerRepoFromGitRemote(remoteUrl: string): {
|
|
16
|
+
owner: string;
|
|
17
|
+
name: string;
|
|
18
|
+
} | null;
|
|
19
|
+
export type ViewerLaunch = {
|
|
20
|
+
kind: 'installed';
|
|
21
|
+
bin: string;
|
|
22
|
+
} | {
|
|
23
|
+
kind: 'source';
|
|
24
|
+
dir: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function resolveViewerLaunch(flag: string | undefined): ViewerLaunch;
|
|
27
|
+
/** Soft resolve for callers that can fall back (e.g. subsystem-model create). */
|
|
28
|
+
export declare function tryResolveViewerLaunch(flag: string | undefined): {
|
|
29
|
+
ok: true;
|
|
30
|
+
launch: ViewerLaunch;
|
|
31
|
+
} | {
|
|
32
|
+
ok: false;
|
|
33
|
+
error: string;
|
|
34
|
+
};
|
|
35
|
+
export declare function createTrailCommand(): Command;
|
|
36
|
+
//# sourceMappingURL=trail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trail.d.ts","sourceRoot":"","sources":["../../src/commands/trail.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,eAAO,MAAM,QAAQ,QAEY,CAAC;AA4ClC,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED,wBAAgB,kBAAkB,IAAI,KAAK,CAK1C;AAqGD,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB3E;AAgID,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOvD;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIhG;AAwDD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAIpC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAO1E;AAED,iFAAiF;AACjF,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA4BnE;AA8ND,wBAAgB,kBAAkB,IAAI,OAAO,CAoF5C"}
|