1pub mod bus;
40pub mod event;
41pub mod layer;
42pub mod metadata;
43pub mod redaction;
44pub mod renderers;
45
46pub use bus::{EventBus, EventReceiver, EventSender, SendError};
48pub use event::{
49 CiEvent, CommandEvent, CuenvEvent, EventCategory, EventSource, InteractiveEvent, OutputEvent,
50 Stream, SystemEvent, TaskEvent,
51};
52pub use layer::CuenvEventLayer;
53pub use metadata::{MetadataContext, correlation_id, set_correlation_id};
54pub use redaction::{redact, register_secret, register_secrets};
55pub use renderers::{CliRenderer, JsonRenderer};
56
57#[macro_export]
68macro_rules! emit_task_started {
69 ($name:expr, $command:expr, $hermetic:expr) => {
70 ::tracing::info!(
71 target: "cuenv::task",
72 event_type = "task.started",
73 task_name = %$name,
74 command = %$command,
75 hermetic = $hermetic,
76 )
77 };
78}
79
80#[macro_export]
87macro_rules! emit_task_cache_hit {
88 ($name:expr, $cache_key:expr) => {
89 ::tracing::info!(
90 target: "cuenv::task",
91 event_type = "task.cache_hit",
92 task_name = %$name,
93 cache_key = %$cache_key,
94 )
95 };
96}
97
98#[macro_export]
100macro_rules! emit_task_cache_miss {
101 ($name:expr) => {
102 ::tracing::info!(
103 target: "cuenv::task",
104 event_type = "task.cache_miss",
105 task_name = %$name,
106 )
107 };
108}
109
110#[macro_export]
117macro_rules! emit_task_output {
118 ($name:expr, $stream:expr, $content:expr) => {
119 ::tracing::info!(
120 target: "cuenv::task",
121 event_type = "task.output",
122 task_name = %$name,
123 stream = $stream,
124 content = %$content,
125 )
126 };
127}
128
129#[macro_export]
136macro_rules! emit_task_completed {
137 ($name:expr, $success:expr, $exit_code:expr, $duration_ms:expr) => {
138 ::tracing::info!(
139 target: "cuenv::task",
140 event_type = "task.completed",
141 task_name = %$name,
142 success = $success,
143 exit_code = ?$exit_code,
144 duration_ms = $duration_ms,
145 )
146 };
147}
148
149#[macro_export]
151macro_rules! emit_task_group_started {
152 ($name:expr, $sequential:expr, $task_count:expr) => {
153 ::tracing::info!(
154 target: "cuenv::task",
155 event_type = "task.group_started",
156 task_name = %$name,
157 sequential = $sequential,
158 task_count = $task_count,
159 )
160 };
161}
162
163#[macro_export]
165macro_rules! emit_task_group_completed {
166 ($name:expr, $success:expr, $duration_ms:expr) => {
167 ::tracing::info!(
168 target: "cuenv::task",
169 event_type = "task.group_completed",
170 task_name = %$name,
171 success = $success,
172 duration_ms = $duration_ms,
173 )
174 };
175}
176
177#[macro_export]
181macro_rules! emit_ci_context {
182 ($provider:expr, $event_type:expr, $ref_name:expr) => {
183 ::tracing::info!(
184 target: "cuenv::ci",
185 event_type = "ci.context_detected",
186 provider = %$provider,
187 ci_event_type = %$event_type,
188 ref_name = %$ref_name,
189 )
190 };
191}
192
193#[macro_export]
195macro_rules! emit_ci_changed_files {
196 ($count:expr) => {
197 ::tracing::info!(
198 target: "cuenv::ci",
199 event_type = "ci.changed_files",
200 count = $count,
201 )
202 };
203}
204
205#[macro_export]
207macro_rules! emit_ci_projects_discovered {
208 ($count:expr) => {
209 ::tracing::info!(
210 target: "cuenv::ci",
211 event_type = "ci.projects_discovered",
212 count = $count,
213 )
214 };
215}
216
217#[macro_export]
219macro_rules! emit_ci_project_skipped {
220 ($path:expr, $reason:expr) => {
221 ::tracing::info!(
222 target: "cuenv::ci",
223 event_type = "ci.project_skipped",
224 path = %$path,
225 reason = %$reason,
226 )
227 };
228}
229
230#[macro_export]
232macro_rules! emit_ci_task_executing {
233 ($project:expr, $task:expr) => {
234 ::tracing::info!(
235 target: "cuenv::ci",
236 event_type = "ci.task_executing",
237 project = %$project,
238 task = %$task,
239 )
240 };
241}
242
243#[macro_export]
245macro_rules! emit_ci_task_result {
246 ($project:expr, $task:expr, $success:expr) => {
247 ::tracing::info!(
248 target: "cuenv::ci",
249 event_type = "ci.task_result",
250 project = %$project,
251 task = %$task,
252 success = $success,
253 )
254 };
255 ($project:expr, $task:expr, $success:expr, $error:expr) => {
256 ::tracing::info!(
257 target: "cuenv::ci",
258 event_type = "ci.task_result",
259 project = %$project,
260 task = %$task,
261 success = $success,
262 error = %$error,
263 )
264 };
265}
266
267#[macro_export]
269macro_rules! emit_ci_report {
270 ($path:expr) => {
271 ::tracing::info!(
272 target: "cuenv::ci",
273 event_type = "ci.report_generated",
274 path = %$path,
275 )
276 };
277}
278
279#[macro_export]
283macro_rules! emit_command_started {
284 ($command:expr) => {
285 ::tracing::info!(
286 target: "cuenv::command",
287 event_type = "command.started",
288 command = %$command,
289 )
290 };
291 ($command:expr, $args:expr) => {
292 ::tracing::info!(
293 target: "cuenv::command",
294 event_type = "command.started",
295 command = %$command,
296 args = ?$args,
297 )
298 };
299}
300
301#[macro_export]
303macro_rules! emit_command_progress {
304 ($command:expr, $progress:expr, $message:expr) => {
305 ::tracing::info!(
306 target: "cuenv::command",
307 event_type = "command.progress",
308 command = %$command,
309 progress = $progress,
310 message = %$message,
311 )
312 };
313}
314
315#[macro_export]
317macro_rules! emit_command_completed {
318 ($command:expr, $success:expr, $duration_ms:expr) => {
319 ::tracing::info!(
320 target: "cuenv::command",
321 event_type = "command.completed",
322 command = %$command,
323 success = $success,
324 duration_ms = $duration_ms,
325 )
326 };
327}
328
329#[macro_export]
333macro_rules! emit_prompt_requested {
334 ($prompt_id:expr, $message:expr, $options:expr) => {
335 ::tracing::info!(
336 target: "cuenv::interactive",
337 event_type = "interactive.prompt_requested",
338 prompt_id = %$prompt_id,
339 message = %$message,
340 options = ?$options,
341 )
342 };
343}
344
345#[macro_export]
347macro_rules! emit_prompt_resolved {
348 ($prompt_id:expr, $response:expr) => {
349 ::tracing::info!(
350 target: "cuenv::interactive",
351 event_type = "interactive.prompt_resolved",
352 prompt_id = %$prompt_id,
353 response = %$response,
354 )
355 };
356}
357
358#[macro_export]
360macro_rules! emit_wait_progress {
361 ($target:expr, $elapsed_secs:expr) => {
362 ::tracing::info!(
363 target: "cuenv::interactive",
364 event_type = "interactive.wait_progress",
365 task_name = %$target,
366 elapsed_secs = $elapsed_secs,
367 )
368 };
369}
370
371#[macro_export]
375macro_rules! emit_supervisor_log {
376 ($tag:expr, $message:expr) => {
377 ::tracing::info!(
378 target: "cuenv::system",
379 event_type = "system.supervisor_log",
380 tag = %$tag,
381 message = %$message,
382 )
383 };
384}
385
386#[macro_export]
388macro_rules! emit_shutdown {
389 () => {
390 ::tracing::info!(
391 target: "cuenv::system",
392 event_type = "system.shutdown",
393 )
394 };
395}
396
397#[macro_export]
401macro_rules! emit_stdout {
402 ($content:expr) => {
403 ::tracing::info!(
404 target: "cuenv::output",
405 event_type = "output.stdout",
406 content = %$content,
407 )
408 };
409}
410
411#[macro_export]
413macro_rules! emit_stderr {
414 ($content:expr) => {
415 ::tracing::info!(
416 target: "cuenv::output",
417 event_type = "output.stderr",
418 content = %$content,
419 )
420 };
421}
422
423#[cfg(test)]
424mod tests {
425 use super::*;
426 use tokio::sync::mpsc;
427 use tracing_subscriber::layer::SubscriberExt;
428
429 #[tokio::test]
430 async fn test_emit_macros_compile() {
431 let (tx, _rx) = mpsc::unbounded_channel();
432 let layer = CuenvEventLayer::new(tx);
433 let subscriber = tracing_subscriber::registry().with(layer);
434
435 tracing::subscriber::with_default(subscriber, || {
436 emit_task_started!("build", "cargo build", true);
437 emit_task_cache_hit!("build", "abc123");
438 emit_task_cache_miss!("test");
439 emit_task_output!("build", "stdout", "output");
440 emit_task_completed!("build", true, Some(0), 1000_u64);
441 emit_task_group_started!("all", false, 3_usize);
442 emit_task_group_completed!("all", true, 5000_u64);
443
444 emit_ci_context!("github", "push", "main");
445 emit_ci_changed_files!(10_usize);
446 emit_ci_projects_discovered!(3_usize);
447 emit_ci_project_skipped!("/path", "no tasks");
448 emit_ci_task_executing!("/path", "build");
449 emit_ci_task_result!("/path", "build", true);
450 emit_ci_task_result!("/path", "test", false, "assertion failed");
451 emit_ci_report!("/path/report.json");
452
453 emit_command_started!("env");
454 emit_command_started!("task", vec!["build".to_string()]);
455 emit_command_progress!("env", 0.5_f32, "loading");
456 emit_command_completed!("env", true, 100_u64);
457
458 emit_prompt_requested!("p1", "Continue?", vec!["yes", "no"]);
459 emit_prompt_resolved!("p1", "yes");
460 emit_wait_progress!("hook", 5_u64);
461
462 emit_supervisor_log!("supervisor", "started");
463 emit_shutdown!();
464
465 emit_stdout!("hello");
466 emit_stderr!("error");
467 });
468 }
469}