(projectRoot)
| 430 | }; |
| 431 | } |
| 432 | |
| 433 | function readOperatorArtifacts(projectRoot) { |
| 434 | const nextReportPath = path.join(projectRoot, '.planning', 'next-actions', 'latest.md'); |
| 435 | const approvalCapsulePath = path.join(projectRoot, '.planning', 'approval-capsules', 'latest.md'); |
| 436 | const nextContent = readText(nextReportPath); |
| 437 | const approvalContent = readText(approvalCapsulePath); |
| 438 | |
| 439 | return { |
| 440 | nextActionReport: nextContent ? { |
| 441 | path: relativeProjectPath(projectRoot, nextReportPath), |
| 442 | modifiedAt: safeMtime(nextReportPath), |
| 443 | generatedAt: extractReportLine(nextContent, 'Generated'), |
| 444 | mode: extractReportLine(nextContent, 'Mode'), |
| 445 | outcome: extractReportLine(nextContent, 'Outcome'), |
| 446 | finalCommand: extractLastReportLine(nextContent, 'Final command') || |
| 447 | extractLastReportLine(nextContent, 'Command') || |
| 448 | null, |
| 449 | } : null, |
| 450 | approvalCapsule: approvalContent ? { |
| 451 | path: relativeProjectPath(projectRoot, approvalCapsulePath), |
| 452 | modifiedAt: safeMtime(approvalCapsulePath), |
| 453 | generatedAt: extractReportLine(approvalContent, 'Generated'), |
| 454 | boundary: extractReportLine(approvalContent, 'Boundary'), |
| 455 | risk: extractReportLine(approvalContent, 'Risk'), |
| 456 | request: extractBlockLine(approvalContent, 'Request'), |
| 457 | command: extractLastReportLine(approvalContent, 'Command'), |
| 458 | } : null, |
| 459 | }; |
| 460 | } |
| 461 | |
| 462 | function annotateOperatorArtifacts(snapshot) { |
no test coverage detected