agent-trajectories 0.2.2 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/abandon.ts","../../src/cli/commands/complete.ts","../../src/cli/commands/decision.ts","../../src/cli/commands/export.ts","../../src/web/styles.ts","../../src/web/generator.ts","../../src/cli/commands/list.ts","../../src/cli/commands/show.ts","../../src/cli/commands/start.ts","../../src/cli/commands/status.ts","../../src/cli/commands/index.ts"],"sourcesContent":["/**\n * Trail CLI\n *\n * Leave a trail of your agent work for others to follow.\n *\n * The name \"trail\" comes from \"trajectory\" - while the trajectory is the\n * complete path an agent takes through a task, the trail is what's left\n * behind for future agents and humans to follow. You don't see the whole\n * trajectory in real-time, but you can always follow the trail.\n */\n\nimport { program } from \"commander\";\nimport { registerCommands } from \"./commands/index.js\";\n\nprogram\n .name(\"trail\")\n .description(\"Leave a trail of your work for others to follow\")\n .version(\"0.1.0\")\n .option(\n \"--data-dir <path>\",\n \"Override trajectory storage directory (or set TRAJECTORIES_DATA_DIR)\",\n )\n .hook(\"preAction\", (thisCommand) => {\n // If --data-dir flag is set, override the env var before commands run\n const opts = thisCommand.opts();\n if (opts.dataDir) {\n process.env.TRAJECTORIES_DATA_DIR = opts.dataDir;\n }\n });\n\n// Register all commands\nregisterCommands(program);\n\n// Parse arguments\nprogram.parse();\n","/**\n * trail abandon command\n */\n\nimport type { Command } from \"commander\";\nimport { abandonTrajectory } from \"../../core/trajectory.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerAbandonCommand(program: Command): void {\n program\n .command(\"abandon\")\n .description(\"Abandon the active trajectory\")\n .option(\"-r, --reason <text>\", \"Reason for abandonment\")\n .action(async (options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n if (!active) {\n console.error(\"Error: No active trajectory\");\n throw new Error(\"No active trajectory\");\n }\n\n const abandoned = abandonTrajectory(active, options.reason);\n await storage.save(abandoned);\n\n console.log(`✓ Trajectory abandoned: ${abandoned.id}`);\n if (options.reason) {\n console.log(` Reason: ${options.reason}`);\n }\n });\n}\n","/**\n * trail complete command\n */\n\nimport type { Command } from \"commander\";\nimport { completeTrajectory } from \"../../core/trajectory.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerCompleteCommand(program: Command): void {\n program\n .command(\"complete\")\n .description(\"Complete the active trajectory with retrospective\")\n .option(\"--summary <text>\", \"Summary of what was accomplished\")\n .option(\"--approach <text>\", \"How the work was approached\")\n .option(\"--confidence <number>\", \"Confidence level 0-1\", Number.parseFloat)\n .action(async (options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n if (!active) {\n console.error(\"Error: No active trajectory\");\n console.error('Start one with: trail start \"Task description\"');\n throw new Error(\"No active trajectory\");\n }\n\n // Require summary and confidence\n if (!options.summary) {\n console.error(\"Error: --summary is required\");\n throw new Error(\"Summary required\");\n }\n\n const confidence = options.confidence ?? 0.8;\n if (confidence < 0 || confidence > 1) {\n console.error(\"Error: --confidence must be between 0 and 1\");\n throw new Error(\"Invalid confidence\");\n }\n\n const completed = completeTrajectory(active, {\n summary: options.summary,\n approach: options.approach || \"Standard approach\",\n confidence,\n });\n\n await storage.save(completed);\n\n console.log(`✓ Trajectory completed: ${completed.id}`);\n console.log(` Summary: ${options.summary}`);\n console.log(` Confidence: ${Math.round(confidence * 100)}%`);\n });\n}\n","/**\n * trail decision command\n */\n\nimport type { Command } from \"commander\";\nimport { addDecision } from \"../../core/trajectory.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerDecisionCommand(program: Command): void {\n program\n .command(\"decision <choice>\")\n .description(\"Record a decision\")\n .option(\n \"-r, --reasoning <text>\",\n \"Why this choice was made (optional for minor decisions)\",\n )\n .option(\n \"-a, --alternatives <items>\",\n \"Comma-separated alternatives considered\",\n )\n .action(async (choice: string, options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n if (!active) {\n console.error(\"Error: No active trajectory\");\n console.error('Start one with: trail start \"Task description\"');\n throw new Error(\"No active trajectory\");\n }\n\n const alternatives = options.alternatives\n ? options.alternatives.split(\",\").map((s: string) => s.trim())\n : [];\n\n const reasoning = options.reasoning || \"\";\n\n const updated = addDecision(active, {\n question: choice,\n chosen: choice,\n alternatives,\n reasoning,\n });\n\n await storage.save(updated);\n\n console.log(`✓ Decision recorded: ${choice}`);\n if (reasoning) {\n console.log(` Reasoning: ${reasoning}`);\n }\n if (alternatives.length > 0) {\n console.log(` Alternatives: ${alternatives.join(\", \")}`);\n }\n });\n}\n","/**\n * trail export command\n */\n\nimport { exec } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { exportToJSON } from \"../../export/json.js\";\nimport { exportToMarkdown } from \"../../export/markdown.js\";\nimport { exportToTimeline } from \"../../export/timeline.js\";\nimport { FileStorage } from \"../../storage/file.js\";\nimport { generateTrajectoryHtml } from \"../../web/generator.js\";\n\nexport function registerExportCommand(program: Command): void {\n program\n .command(\"export [id]\")\n .description(\"Export a trajectory\")\n .option(\n \"-f, --format <format>\",\n \"Export format (md, json, timeline, html)\",\n \"md\",\n )\n .option(\"-o, --output <path>\", \"Output file path\")\n .option(\"--open\", \"Open in browser (html format only)\")\n .action(async (id: string | undefined, options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n // If no ID provided, use active trajectory\n let trajectory;\n if (id) {\n trajectory = await storage.get(id);\n if (!trajectory) {\n console.error(`Error: Trajectory not found: ${id}`);\n throw new Error(\"Trajectory not found\");\n }\n } else {\n trajectory = await storage.getActive();\n if (!trajectory) {\n console.error(\"Error: No active trajectory and no ID provided\");\n console.error(\n \"Usage: trail export <id> or trail export (with active trajectory)\",\n );\n throw new Error(\"No trajectory specified\");\n }\n }\n\n let output: string;\n\n switch (options.format) {\n case \"json\":\n output = exportToJSON(trajectory);\n break;\n case \"timeline\":\n output = exportToTimeline(trajectory);\n break;\n case \"html\":\n output = generateTrajectoryHtml(trajectory);\n break;\n default:\n output = exportToMarkdown(trajectory);\n break;\n }\n\n if (options.output) {\n await writeFile(options.output, output, \"utf-8\");\n console.log(`✓ Exported to ${options.output}`);\n\n if (options.open && options.format === \"html\") {\n openInBrowser(options.output);\n }\n } else if (options.open && options.format === \"html\") {\n // Write to temp location and open\n const outputDir = join(process.cwd(), \".trajectories\", \"html\");\n await mkdir(outputDir, { recursive: true });\n const filePath = join(outputDir, `${trajectory.id}.html`);\n await writeFile(filePath, output, \"utf-8\");\n console.log(`✓ Generated: ${filePath}`);\n openInBrowser(filePath);\n } else {\n console.log(output);\n }\n });\n}\n\nfunction openInBrowser(path: string): void {\n const platform = process.platform;\n let command: string;\n\n if (platform === \"darwin\") {\n command = `open \"${path}\"`;\n } else if (platform === \"win32\") {\n command = `start \"\" \"${path}\"`;\n } else {\n command = `xdg-open \"${path}\"`;\n }\n\n exec(command, (error) => {\n if (error) {\n console.log(`Open manually: file://${path}`);\n }\n });\n}\n","/**\n * Embedded CSS styles for trajectory viewer\n */\n\nexport const styles = `\n:root {\n --bg: #ffffff;\n --bg-secondary: #f8f9fa;\n --text: #1a1a2e;\n --text-muted: #6c757d;\n --border: #e9ecef;\n --accent: #4f46e5;\n --accent-light: #eef2ff;\n --success: #10b981;\n --warning: #f59e0b;\n --error: #ef4444;\n}\n\n@media (prefers-color-scheme: dark) {\n :root {\n --bg: #1a1a2e;\n --bg-secondary: #16213e;\n --text: #e9ecef;\n --text-muted: #adb5bd;\n --border: #2d3748;\n --accent: #818cf8;\n --accent-light: #1e1b4b;\n }\n}\n\n* {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\nbody {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: var(--bg);\n color: var(--text);\n line-height: 1.6;\n padding: 2rem;\n max-width: 900px;\n margin: 0 auto;\n}\n\nh1, h2, h3 {\n margin-bottom: 0.5rem;\n}\n\nh1 {\n font-size: 1.75rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\nh2 {\n font-size: 1.25rem;\n color: var(--text-muted);\n border-bottom: 1px solid var(--border);\n padding-bottom: 0.5rem;\n margin-top: 1.5rem;\n}\n\n.header {\n border-bottom: 2px solid var(--border);\n padding-bottom: 1rem;\n margin-bottom: 1.5rem;\n}\n\n.meta {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 1rem;\n margin: 1rem 0;\n padding: 1rem;\n background: var(--bg-secondary);\n border-radius: 8px;\n}\n\n.meta-item {\n display: flex;\n flex-direction: column;\n}\n\n.meta-label {\n font-size: 0.75rem;\n text-transform: uppercase;\n color: var(--text-muted);\n letter-spacing: 0.05em;\n}\n\n.meta-value {\n font-weight: 500;\n}\n\n.status {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.status-active {\n background: var(--accent-light);\n color: var(--accent);\n}\n\n.status-completed {\n background: #d1fae5;\n color: #065f46;\n}\n\n.status-abandoned {\n background: #fee2e2;\n color: #991b1b;\n}\n\n.section {\n margin: 1.5rem 0;\n}\n\n.collapsible {\n cursor: pointer;\n user-select: none;\n}\n\n.collapsible::before {\n content: '▸ ';\n display: inline-block;\n transition: transform 0.2s;\n}\n\n.collapsible.open::before {\n transform: rotate(90deg);\n}\n\n.collapsible-content {\n display: none;\n margin-top: 0.5rem;\n padding-left: 1rem;\n border-left: 2px solid var(--border);\n}\n\n.collapsible.open + .collapsible-content {\n display: block;\n}\n\n.decision {\n background: var(--bg-secondary);\n border-radius: 8px;\n padding: 1rem;\n margin: 0.75rem 0;\n border-left: 3px solid var(--accent);\n}\n\n.decision-title {\n font-weight: 600;\n margin-bottom: 0.5rem;\n}\n\n.decision-reasoning {\n color: var(--text-muted);\n font-size: 0.9rem;\n}\n\n.alternatives {\n margin-top: 0.5rem;\n font-size: 0.85rem;\n}\n\n.alternatives-label {\n color: var(--text-muted);\n}\n\n.timeline {\n position: relative;\n padding-left: 1.5rem;\n}\n\n.timeline::before {\n content: '';\n position: absolute;\n left: 0.35rem;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--border);\n}\n\n.timeline-item {\n position: relative;\n margin: 1rem 0;\n padding-left: 1rem;\n}\n\n.timeline-item::before {\n content: '';\n position: absolute;\n left: -1.15rem;\n top: 0.5rem;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--accent);\n border: 2px solid var(--bg);\n}\n\n.timeline-item.decision::before {\n background: var(--warning);\n}\n\n.timeline-item.chapter::before {\n background: var(--success);\n}\n\n.timeline-time {\n font-size: 0.75rem;\n color: var(--text-muted);\n}\n\n.timeline-content {\n margin-top: 0.25rem;\n}\n\n.chapter {\n background: var(--bg-secondary);\n border-radius: 8px;\n padding: 1rem;\n margin: 1rem 0;\n}\n\n.chapter-title {\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.chapter-agent {\n font-size: 0.85rem;\n color: var(--text-muted);\n}\n\n.retrospective {\n background: linear-gradient(135deg, var(--accent-light), var(--bg-secondary));\n border-radius: 8px;\n padding: 1.5rem;\n margin: 1.5rem 0;\n}\n\n.retrospective h3 {\n margin-bottom: 1rem;\n}\n\n.confidence {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0.5rem 0;\n}\n\n.confidence-bar {\n flex: 1;\n height: 8px;\n background: var(--border);\n border-radius: 4px;\n overflow: hidden;\n max-width: 200px;\n}\n\n.confidence-fill {\n height: 100%;\n background: var(--accent);\n transition: width 0.3s;\n}\n\n.list {\n list-style: none;\n}\n\n.list li {\n padding: 0.25rem 0;\n padding-left: 1rem;\n position: relative;\n}\n\n.list li::before {\n content: '•';\n position: absolute;\n left: 0;\n color: var(--accent);\n}\n\n.files-changed {\n font-family: monospace;\n font-size: 0.85rem;\n background: var(--bg-secondary);\n padding: 0.75rem;\n border-radius: 4px;\n margin: 0.5rem 0;\n}\n\n.empty {\n color: var(--text-muted);\n font-style: italic;\n}\n\n/* Index page styles */\n.trajectory-list {\n list-style: none;\n}\n\n.trajectory-card {\n display: block;\n padding: 1rem;\n margin: 0.5rem 0;\n background: var(--bg-secondary);\n border-radius: 8px;\n text-decoration: none;\n color: var(--text);\n border: 1px solid var(--border);\n transition: border-color 0.2s, box-shadow 0.2s;\n}\n\n.trajectory-card:hover {\n border-color: var(--accent);\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n}\n\n.trajectory-card-title {\n font-weight: 600;\n margin-bottom: 0.25rem;\n}\n\n.trajectory-card-meta {\n font-size: 0.85rem;\n color: var(--text-muted);\n display: flex;\n gap: 1rem;\n}\n\n.group-header {\n font-size: 0.85rem;\n text-transform: uppercase;\n color: var(--text-muted);\n letter-spacing: 0.05em;\n margin-top: 1.5rem;\n margin-bottom: 0.5rem;\n}\n`;\n","/**\n * Static HTML generator for trajectory viewing\n */\n\nimport type {\n Chapter,\n Decision,\n Trajectory,\n TrajectoryEvent,\n} from \"../core/types.js\";\nimport { styles } from \"./styles.js\";\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\nfunction formatDate(isoDate: string): string {\n const date = new Date(isoDate);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nfunction formatDuration(startDate: string, endDate?: string): string {\n const start = new Date(startDate).getTime();\n const end = endDate ? new Date(endDate).getTime() : Date.now();\n const ms = end - start;\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ${hours % 24}h`;\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m`;\n return `${seconds}s`;\n}\n\nfunction getStatusClass(status: string): string {\n switch (status) {\n case \"active\":\n return \"status-active\";\n case \"completed\":\n return \"status-completed\";\n case \"abandoned\":\n return \"status-abandoned\";\n default:\n return \"\";\n }\n}\n\nfunction renderDecision(decision: Decision): string {\n const alternatives = decision.alternatives?.length\n ? `<div class=\"alternatives\">\n <span class=\"alternatives-label\">Considered:</span>\n ${decision.alternatives.map((a) => escapeHtml(a)).join(\", \")}\n </div>`\n : \"\";\n\n return `\n <div class=\"decision\">\n <div class=\"decision-title\">${escapeHtml(decision.question)}: ${escapeHtml(decision.chosen)}</div>\n <div class=\"decision-reasoning\">${escapeHtml(decision.reasoning)}</div>\n ${alternatives}\n </div>\n `;\n}\n\nfunction renderEvent(event: TrajectoryEvent): string {\n const time = formatDate(new Date(event.ts).toISOString());\n let content = \"\";\n let typeClass = \"\";\n const rawData = event.raw as Record<string, unknown> | undefined;\n\n switch (event.type) {\n case \"decision\":\n typeClass = \"decision\";\n content = `\n <strong>Decision:</strong> ${escapeHtml(event.content)}\n ${rawData?.reasoning ? `<div class=\"decision-reasoning\">${escapeHtml(String(rawData.reasoning))}</div>` : \"\"}\n `;\n break;\n case \"thinking\":\n content = `<strong>Thinking:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"prompt\":\n content = `<strong>Prompt:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"tool_call\":\n content = `<strong>Tool:</strong> <code>${escapeHtml(event.content)}</code>`;\n break;\n case \"tool_result\":\n content = `<strong>Result:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"message_sent\":\n content = `<strong>Sent:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"message_received\":\n content = `<strong>Received:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"error\":\n content = `<strong style=\"color: var(--error)\">Error:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"note\":\n content = escapeHtml(event.content);\n break;\n default:\n content = escapeHtml(event.content);\n }\n\n return `\n <div class=\"timeline-item ${typeClass}\">\n <div class=\"timeline-time\">${time}</div>\n <div class=\"timeline-content\">${content}</div>\n </div>\n `;\n}\n\nfunction renderChapter(chapter: Chapter, index: number): string {\n const events = chapter.events.map(renderEvent).join(\"\");\n\n return `\n <div class=\"chapter\">\n <div class=\"chapter-title\">\n Chapter ${index + 1}: ${escapeHtml(chapter.title)}\n </div>\n <div class=\"chapter-agent\">Agent: ${escapeHtml(chapter.agentName)}</div>\n ${\n chapter.events.length > 0\n ? `\n <h3 class=\"collapsible\" onclick=\"this.classList.toggle('open')\">Events (${chapter.events.length})</h3>\n <div class=\"collapsible-content\">\n <div class=\"timeline\">${events}</div>\n </div>\n `\n : \"\"\n }\n </div>\n `;\n}\n\nfunction renderRetrospective(trajectory: Trajectory): string {\n if (!trajectory.retrospective) {\n return \"\";\n }\n\n const retro = trajectory.retrospective;\n const confidencePercent = Math.round(retro.confidence * 100);\n\n const approach = retro.approach\n ? `<div><strong>Approach:</strong><p>${escapeHtml(retro.approach)}</p></div>`\n : \"\";\n\n const learnings = retro.learnings?.length\n ? `<div><strong>Learnings:</strong><ul class=\"list\">${retro.learnings.map((l) => `<li>${escapeHtml(l)}</li>`).join(\"\")}</ul></div>`\n : \"\";\n\n const challenges = retro.challenges?.length\n ? `<div><strong>Challenges:</strong><ul class=\"list\">${retro.challenges.map((c) => `<li>${escapeHtml(c)}</li>`).join(\"\")}</ul></div>`\n : \"\";\n\n const suggestions = retro.suggestions?.length\n ? `<div><strong>Suggestions:</strong><ul class=\"list\">${retro.suggestions.map((s) => `<li>${escapeHtml(s)}</li>`).join(\"\")}</ul></div>`\n : \"\";\n\n return `\n <div class=\"retrospective\">\n <h3>📝 Retrospective</h3>\n <p>${escapeHtml(retro.summary)}</p>\n\n <div class=\"confidence\">\n <span>Confidence:</span>\n <div class=\"confidence-bar\">\n <div class=\"confidence-fill\" style=\"width: ${confidencePercent}%\"></div>\n </div>\n <span>${confidencePercent}%</span>\n </div>\n\n ${approach}\n ${learnings}\n ${challenges}\n ${suggestions}\n </div>\n `;\n}\n\nexport function generateTrajectoryHtml(trajectory: Trajectory): string {\n const statusClass = getStatusClass(trajectory.status);\n const duration = formatDuration(trajectory.startedAt, trajectory.completedAt);\n\n // Extract all decisions from chapters\n const decisions: Decision[] = trajectory.chapters.flatMap((ch) =>\n ch.events\n .filter((e) => e.type === \"decision\" && e.raw)\n .map((e) => e.raw as Decision)\n .filter(\n (d): d is Decision => d !== undefined && typeof d.question === \"string\",\n ),\n );\n\n const decisionsHtml = decisions.length\n ? `\n <h2 class=\"collapsible open\" onclick=\"this.classList.toggle('open')\">\n Key Decisions (${decisions.length})\n </h2>\n <div class=\"collapsible-content\">\n ${decisions.map(renderDecision).join(\"\")}\n </div>\n `\n : \"\";\n\n const chaptersHtml = trajectory.chapters.length\n ? `\n <h2 class=\"collapsible open\" onclick=\"this.classList.toggle('open')\">\n Chapters (${trajectory.chapters.length})\n </h2>\n <div class=\"collapsible-content\">\n ${trajectory.chapters.map(renderChapter).join(\"\")}\n </div>\n `\n : \"\";\n\n const filesHtml = trajectory.filesChanged.length\n ? `\n <h2>Files Changed (${trajectory.filesChanged.length})</h2>\n <div class=\"files-changed\">\n ${trajectory.filesChanged.map((f) => escapeHtml(f)).join(\"<br>\")}\n </div>\n `\n : \"\";\n\n const commitsHtml = trajectory.commits.length\n ? `\n <h2>Commits (${trajectory.commits.length})</h2>\n <div class=\"files-changed\">\n ${trajectory.commits.map((c) => `<code>${escapeHtml(c)}</code>`).join(\"<br>\")}\n </div>\n `\n : \"\";\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${escapeHtml(trajectory.task.title)} - Trajectory</title>\n <style>${styles}</style>\n</head>\n<body>\n <div class=\"header\">\n <h1>🛤️ ${escapeHtml(trajectory.task.title)}</h1>\n <div class=\"meta\">\n <div class=\"meta-item\">\n <span class=\"meta-label\">ID</span>\n <span class=\"meta-value\"><code>${trajectory.id}</code></span>\n </div>\n <div class=\"meta-item\">\n <span class=\"meta-label\">Status</span>\n <span class=\"meta-value\"><span class=\"status ${statusClass}\">${trajectory.status}</span></span>\n </div>\n <div class=\"meta-item\">\n <span class=\"meta-label\">Duration</span>\n <span class=\"meta-value\">${duration}</span>\n </div>\n <div class=\"meta-item\">\n <span class=\"meta-label\">Started</span>\n <span class=\"meta-value\">${formatDate(trajectory.startedAt)}</span>\n </div>\n ${\n trajectory.task.source\n ? `\n <div class=\"meta-item\">\n <span class=\"meta-label\">Source</span>\n <span class=\"meta-value\">${escapeHtml(trajectory.task.source.system)}:${escapeHtml(trajectory.task.source.id)}</span>\n </div>\n `\n : \"\"\n }\n <div class=\"meta-item\">\n <span class=\"meta-label\">Agents</span>\n <span class=\"meta-value\">${trajectory.agents.map((a) => escapeHtml(a.name)).join(\", \") || \"—\"}</span>\n </div>\n </div>\n </div>\n\n ${renderRetrospective(trajectory)}\n ${decisionsHtml}\n ${chaptersHtml}\n ${filesHtml}\n ${commitsHtml}\n\n <script>\n // Initialize all collapsible sections\n document.querySelectorAll('.collapsible.open').forEach(el => {\n el.nextElementSibling?.style && (el.nextElementSibling.style.display = 'block');\n });\n </script>\n</body>\n</html>`;\n}\n\nexport function generateIndexHtml(trajectories: Trajectory[]): string {\n // Group by status\n const active = trajectories.filter((t) => t.status === \"active\");\n const completed = trajectories.filter((t) => t.status === \"completed\");\n const abandoned = trajectories.filter((t) => t.status === \"abandoned\");\n\n function renderCard(t: Trajectory): string {\n const duration = formatDuration(t.startedAt, t.completedAt);\n const statusClass = getStatusClass(t.status);\n\n return `\n <a href=\"${t.id}.html\" class=\"trajectory-card\">\n <div class=\"trajectory-card-title\">${escapeHtml(t.task.title)}</div>\n <div class=\"trajectory-card-meta\">\n <span class=\"status ${statusClass}\">${t.status}</span>\n <span>${duration}</span>\n <span>${t.chapters.length} chapters</span>\n </div>\n </a>\n `;\n }\n\n function renderGroup(title: string, items: Trajectory[]): string {\n if (items.length === 0) return \"\";\n return `\n <div class=\"group-header\">${title} (${items.length})</div>\n <div class=\"trajectory-list\">\n ${items.map(renderCard).join(\"\")}\n </div>\n `;\n }\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Trajectories</title>\n <style>${styles}</style>\n</head>\n<body>\n <div class=\"header\">\n <h1>🛤️ Trajectories</h1>\n <p>${trajectories.length} total trajectories</p>\n </div>\n\n ${renderGroup(\"Active\", active)}\n ${renderGroup(\"Completed\", completed)}\n ${renderGroup(\"Abandoned\", abandoned)}\n\n ${trajectories.length === 0 ? '<p class=\"empty\">No trajectories yet. Start one with <code>trail start \"Task name\"</code></p>' : \"\"}\n</body>\n</html>`;\n}\n","/**\n * trail list command\n */\n\nimport { existsSync } from \"node:fs\";\nimport type { Command } from \"commander\";\nimport type { TrajectoryStatus, TrajectorySummary } from \"../../core/types.js\";\nimport { FileStorage, getSearchPaths } from \"../../storage/file.js\";\n\nexport function registerListCommand(program: Command): void {\n program\n .command(\"list\")\n .description(\"List and search trajectories\")\n .option(\n \"-s, --status <status>\",\n \"Filter by status (active, completed, abandoned)\",\n )\n .option(\"-l, --limit <number>\", \"Limit results\", Number.parseInt)\n .option(\"--search <query>\", \"Search trajectories by title or content\")\n .action(async (options) => {\n // Get all search paths and aggregate results\n const searchPaths = getSearchPaths();\n let allTrajectories: TrajectorySummary[] = [];\n const seenIds = new Set<string>();\n\n for (const searchPath of searchPaths) {\n // Skip paths that don't exist\n if (!existsSync(searchPath)) {\n continue;\n }\n\n // Create storage pointing to this path directly\n // We set TRAJECTORIES_DATA_DIR temporarily to use this path\n const originalDataDir = process.env.TRAJECTORIES_DATA_DIR;\n process.env.TRAJECTORIES_DATA_DIR = searchPath;\n\n try {\n const storage = new FileStorage();\n await storage.initialize();\n\n const trajectories = await storage.list({\n status: options.status as TrajectoryStatus | undefined,\n limit: options.search ? undefined : undefined, // Don't limit per-path\n });\n\n // Add to results, avoiding duplicates\n for (const traj of trajectories) {\n if (!seenIds.has(traj.id)) {\n seenIds.add(traj.id);\n allTrajectories.push(traj);\n }\n }\n } finally {\n // Restore original env var\n if (originalDataDir !== undefined) {\n process.env.TRAJECTORIES_DATA_DIR = originalDataDir;\n } else {\n process.env.TRAJECTORIES_DATA_DIR = undefined;\n }\n }\n }\n\n // Sort by startedAt descending (most recent first)\n allTrajectories.sort(\n (a, b) =>\n new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),\n );\n\n // Apply search filter if provided\n if (options.search) {\n const query = options.search.toLowerCase();\n allTrajectories = allTrajectories.filter((traj) => {\n // Search in title\n if (traj.title.toLowerCase().includes(query)) return true;\n // Search in ID\n if (traj.id.toLowerCase().includes(query)) return true;\n return false;\n });\n }\n\n // Apply limit after aggregation and search\n if (options.limit) {\n allTrajectories = allTrajectories.slice(0, options.limit);\n }\n\n if (allTrajectories.length === 0) {\n if (options.search) {\n console.log(`No trajectories found matching \"${options.search}\"`);\n } else {\n console.log(\"No trajectories found\");\n }\n return;\n }\n\n const searchNote = options.search ? ` matching \"${options.search}\"` : \"\";\n console.log(\n `Found ${allTrajectories.length} trajectories${searchNote}:\\n`,\n );\n\n for (const traj of allTrajectories) {\n const statusIcon = getStatusIcon(traj.status);\n const confidence = traj.confidence\n ? ` (${Math.round(traj.confidence * 100)}%)`\n : \"\";\n\n console.log(`${statusIcon} ${traj.id}`);\n console.log(` ${traj.title}${confidence}`);\n console.log(` Started: ${formatDate(traj.startedAt)}`);\n if (traj.completedAt) {\n console.log(` Completed: ${formatDate(traj.completedAt)}`);\n }\n console.log(\"\");\n }\n });\n}\n\nfunction getStatusIcon(status: string): string {\n switch (status) {\n case \"active\":\n return \"🔄\";\n case \"completed\":\n return \"✅\";\n case \"abandoned\":\n return \"❌\";\n default:\n return \"•\";\n }\n}\n\nfunction formatDate(isoString: string): string {\n return new Date(isoString).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n","/**\n * trail show command\n */\n\nimport { existsSync } from \"node:fs\";\nimport type { Command } from \"commander\";\nimport type { Decision, Trajectory } from \"../../core/types.js\";\nimport { FileStorage, getSearchPaths } from \"../../storage/file.js\";\n\n/**\n * Search for a trajectory across all search paths\n */\nasync function findTrajectory(id: string): Promise<Trajectory | null> {\n const searchPaths = getSearchPaths();\n\n for (const searchPath of searchPaths) {\n // Skip paths that don't exist\n if (!existsSync(searchPath)) {\n continue;\n }\n\n // Create storage pointing to this path directly\n const originalDataDir = process.env.TRAJECTORIES_DATA_DIR;\n process.env.TRAJECTORIES_DATA_DIR = searchPath;\n\n try {\n const storage = new FileStorage();\n await storage.initialize();\n\n const trajectory = await storage.get(id);\n if (trajectory) {\n return trajectory;\n }\n } finally {\n // Restore original env var\n if (originalDataDir !== undefined) {\n process.env.TRAJECTORIES_DATA_DIR = originalDataDir;\n } else {\n process.env.TRAJECTORIES_DATA_DIR = undefined;\n }\n }\n }\n\n return null;\n}\n\nexport function registerShowCommand(program: Command): void {\n program\n .command(\"show <id>\")\n .description(\"Show trajectory details\")\n .option(\"-d, --decisions\", \"Show decisions only\")\n .action(async (id: string, options) => {\n const trajectory = await findTrajectory(id);\n\n if (!trajectory) {\n console.error(`Error: Trajectory not found: ${id}`);\n throw new Error(\"Trajectory not found\");\n }\n\n if (options.decisions) {\n // Show decisions only\n const decisions = extractDecisions(trajectory);\n\n if (decisions.length === 0) {\n console.log(\"No decisions recorded\");\n return;\n }\n\n console.log(`Decisions for ${trajectory.task.title}:\\n`);\n for (const decision of decisions) {\n console.log(`• ${decision.question}`);\n console.log(` Chose: ${decision.chosen}`);\n console.log(` Reasoning: ${decision.reasoning}`);\n if (decision.alternatives.length > 0) {\n console.log(` Alternatives: ${decision.alternatives.join(\", \")}`);\n }\n console.log(\"\");\n }\n return;\n }\n\n // Show full details\n console.log(`Trajectory: ${trajectory.id}`);\n console.log(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\");\n console.log(`Title: ${trajectory.task.title}`);\n console.log(`Status: ${trajectory.status}`);\n console.log(`Started: ${trajectory.startedAt}`);\n if (trajectory.completedAt) {\n console.log(`Ended: ${trajectory.completedAt}`);\n }\n\n if (trajectory.task.source) {\n console.log(\n `Source: ${trajectory.task.source.system}:${trajectory.task.source.id}`,\n );\n }\n\n console.log(`\\nChapters: ${trajectory.chapters.length}`);\n for (const chapter of trajectory.chapters) {\n console.log(` • ${chapter.title} (${chapter.agentName})`);\n console.log(` Events: ${chapter.events.length}`);\n }\n\n if (trajectory.retrospective) {\n console.log(\"\\nRetrospective:\");\n console.log(` Summary: ${trajectory.retrospective.summary}`);\n console.log(\n ` Confidence: ${Math.round(trajectory.retrospective.confidence * 100)}%`,\n );\n }\n });\n}\n\nfunction extractDecisions(trajectory: any): Decision[] {\n const decisions: Decision[] = [];\n\n // From retrospective\n if (trajectory.retrospective?.decisions) {\n decisions.push(...trajectory.retrospective.decisions);\n }\n\n // From events\n for (const chapter of trajectory.chapters) {\n for (const event of chapter.events) {\n if (event.type === \"decision\" && event.raw) {\n const raw = event.raw as Decision;\n if (raw.question && raw.chosen && raw.reasoning) {\n if (!decisions.some((d) => d.question === raw.question)) {\n decisions.push(raw);\n }\n }\n }\n }\n }\n\n return decisions;\n}\n","/**\n * trail start command\n */\n\nimport type { Command } from \"commander\";\nimport { addChapter, createTrajectory } from \"../../core/trajectory.js\";\nimport type { TaskSource } from \"../../core/types.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerStartCommand(program: Command): void {\n program\n .command(\"start <title>\")\n .description(\"Start a new trajectory\")\n .option(\"-t, --task <id>\", \"External task ID\")\n .option(\n \"-s, --source <system>\",\n \"Task system (github, linear, jira, beads)\",\n )\n .option(\"--url <url>\", \"URL to external task\")\n .option(\"-a, --agent <name>\", \"Agent name (or set TRAJECTORIES_AGENT)\")\n .option(\"-p, --project <id>\", \"Project ID (or set TRAJECTORIES_PROJECT)\")\n .option(\"-q, --quiet\", \"Only output trajectory ID (for scripting)\")\n .action(async (title: string, options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n // Check if there's already an active trajectory\n const active = await storage.getActive();\n if (active) {\n if (!options.quiet) {\n console.error(`Error: Trajectory already active: ${active.id}`);\n console.error(\n \"Complete or abandon it first with: trail complete or trail abandon\",\n );\n }\n throw new Error(\"Trajectory already active\");\n }\n\n // Build task source if provided\n let source: TaskSource | undefined;\n if (options.task) {\n source = {\n system: options.source || \"plain\",\n id: options.task,\n url: options.url,\n };\n }\n\n // Resolve agent name from CLI flag or env var\n const agentName =\n options.agent ?? process.env.TRAJECTORIES_AGENT ?? undefined;\n\n // Resolve project ID from CLI flag or env var\n const projectId =\n options.project ?? process.env.TRAJECTORIES_PROJECT ?? undefined;\n\n // Create the trajectory\n let trajectory = createTrajectory({\n title,\n source,\n projectId,\n });\n\n // If agent specified, add initial chapter with agent name\n if (agentName) {\n trajectory = addChapter(trajectory, {\n title: \"Initial work\",\n agentName,\n });\n }\n\n await storage.save(trajectory);\n\n if (options.quiet) {\n // Only output trajectory ID for scripting\n console.log(trajectory.id);\n } else {\n console.log(`✓ Trajectory started: ${trajectory.id}`);\n console.log(` Title: ${title}`);\n if (agentName) {\n console.log(` Agent: ${agentName}`);\n }\n if (projectId) {\n console.log(` Project: ${projectId}`);\n }\n if (source) {\n console.log(` Linked to: ${source.id} (${source.system})`);\n }\n }\n });\n}\n","/**\n * trail status command\n */\n\nimport type { Command } from \"commander\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerStatusCommand(program: Command): void {\n program\n .command(\"status\")\n .description(\"Show active trajectory status\")\n .action(async () => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n\n if (!active) {\n console.log(\"No active trajectory\");\n console.log('Start one with: trail start \"Task description\"');\n return;\n }\n\n const duration = formatDuration(\n new Date().getTime() - new Date(active.startedAt).getTime(),\n );\n\n const eventCount = active.chapters.reduce(\n (sum, ch) => sum + ch.events.length,\n 0,\n );\n\n const decisionCount = active.chapters.reduce(\n (sum, ch) =>\n sum + ch.events.filter((e) => e.type === \"decision\").length,\n 0,\n );\n\n console.log(`Active Trajectory: ${active.id}`);\n console.log(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\");\n console.log(`Task: ${active.task.title}`);\n if (active.task.source) {\n console.log(\n `Source: ${active.task.source.system}:${active.task.source.id}`,\n );\n }\n console.log(`Status: ${active.status}`);\n console.log(`Started: ${duration} ago`);\n console.log(`Chapters: ${active.chapters.length}`);\n console.log(`Events: ${eventCount}`);\n console.log(`Decisions: ${decisionCount}`);\n\n if (active.chapters.length > 0) {\n const currentChapter = active.chapters[active.chapters.length - 1];\n console.log(`\\nCurrent Chapter: ${currentChapter.title}`);\n console.log(` Agent: ${currentChapter.agentName}`);\n }\n });\n}\n\nfunction formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ${hours % 24}h`;\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m`;\n return `${seconds}s`;\n}\n","/**\n * CLI Command Registration\n *\n * Registers all commands with the program.\n *\n * Core commands (8 total):\n * - start: Begin tracking a new task\n * - status: Show current trajectory state\n * - decision: Record a decision point\n * - complete: Finish with retrospective\n * - abandon: Stop without completing\n * - list: Browse trajectories (with --search)\n * - show: View trajectory details\n * - export: Output in various formats (with --open)\n */\n\nimport type { Command } from \"commander\";\nimport { registerAbandonCommand } from \"./abandon.js\";\nimport { registerCompleteCommand } from \"./complete.js\";\nimport { registerDecisionCommand } from \"./decision.js\";\nimport { registerExportCommand } from \"./export.js\";\nimport { registerListCommand } from \"./list.js\";\nimport { registerShowCommand } from \"./show.js\";\nimport { registerStartCommand } from \"./start.js\";\nimport { registerStatusCommand } from \"./status.js\";\n\n/**\n * Register all CLI commands\n */\nexport function registerCommands(program: Command): void {\n registerStartCommand(program);\n registerStatusCommand(program);\n registerCompleteCommand(program);\n registerAbandonCommand(program);\n registerDecisionCommand(program);\n registerListCommand(program);\n registerShowCommand(program);\n registerExportCommand(program);\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["program","program","program","program","program","formatDate","existsSync","existsSync","program","program","program","formatDuration","program"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/abandon.ts","../../src/cli/commands/complete.ts","../../src/core/trace.ts","../../src/cli/commands/decision.ts","../../src/cli/commands/export.ts","../../src/web/styles.ts","../../src/web/generator.ts","../../src/cli/commands/list.ts","../../src/cli/commands/show.ts","../../src/cli/commands/start.ts","../../src/cli/commands/status.ts","../../src/cli/commands/index.ts"],"sourcesContent":["/**\n * Trail CLI\n *\n * Leave a trail of your agent work for others to follow.\n *\n * The name \"trail\" comes from \"trajectory\" - while the trajectory is the\n * complete path an agent takes through a task, the trail is what's left\n * behind for future agents and humans to follow. You don't see the whole\n * trajectory in real-time, but you can always follow the trail.\n */\n\nimport { program } from \"commander\";\nimport { registerCommands } from \"./commands/index.js\";\n\nprogram\n .name(\"trail\")\n .description(\"Leave a trail of your work for others to follow\")\n .version(\"0.1.0\")\n .option(\n \"--data-dir <path>\",\n \"Override trajectory storage directory (or set TRAJECTORIES_DATA_DIR)\",\n )\n .hook(\"preAction\", (thisCommand) => {\n // If --data-dir flag is set, override the env var before commands run\n const opts = thisCommand.opts();\n if (opts.dataDir) {\n process.env.TRAJECTORIES_DATA_DIR = opts.dataDir;\n }\n });\n\n// Register all commands\nregisterCommands(program);\n\n// Parse arguments\nprogram.parse();\n","/**\n * trail abandon command\n */\n\nimport type { Command } from \"commander\";\nimport { abandonTrajectory } from \"../../core/trajectory.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerAbandonCommand(program: Command): void {\n program\n .command(\"abandon\")\n .description(\"Abandon the active trajectory\")\n .option(\"-r, --reason <text>\", \"Reason for abandonment\")\n .action(async (options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n if (!active) {\n console.error(\"Error: No active trajectory\");\n throw new Error(\"No active trajectory\");\n }\n\n const abandoned = abandonTrajectory(active, options.reason);\n await storage.save(abandoned);\n\n console.log(`✓ Trajectory abandoned: ${abandoned.id}`);\n if (options.reason) {\n console.log(` Reason: ${options.reason}`);\n }\n });\n}\n","/**\n * trail complete command\n */\n\nimport { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { generateTrace, getGitHead } from \"../../core/trace.js\";\nimport { completeTrajectory } from \"../../core/trajectory.js\";\nimport type { TraceRecord, Trajectory } from \"../../core/types.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\n/**\n * Save trace file alongside the trajectory\n */\nasync function saveTraceFile(\n trajectory: Trajectory,\n trace: TraceRecord,\n): Promise<void> {\n // Determine trajectory file location based on status\n const dataDir = process.env.TRAJECTORIES_DATA_DIR;\n const baseDir = dataDir ? dataDir : join(process.cwd(), \".trajectories\");\n const completedDir = join(baseDir, \"completed\");\n\n const date = new Date(trajectory.completedAt ?? trajectory.startedAt);\n const monthDir = join(\n completedDir,\n `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}`,\n );\n\n // Ensure directory exists\n if (!existsSync(monthDir)) {\n await mkdir(monthDir, { recursive: true });\n }\n\n // Save trace file with .trace.json extension\n const tracePath = join(monthDir, `${trajectory.id}.trace.json`);\n await writeFile(tracePath, JSON.stringify(trace, null, 2), \"utf-8\");\n}\n\nexport function registerCompleteCommand(program: Command): void {\n program\n .command(\"complete\")\n .description(\"Complete the active trajectory with retrospective\")\n .option(\"--summary <text>\", \"Summary of what was accomplished\")\n .option(\"--approach <text>\", \"How the work was approached\")\n .option(\"--confidence <number>\", \"Confidence level 0-1\", Number.parseFloat)\n .action(async (options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n if (!active) {\n console.error(\"Error: No active trajectory\");\n console.error('Start one with: trail start \"Task description\"');\n throw new Error(\"No active trajectory\");\n }\n\n // Require summary and confidence\n if (!options.summary) {\n console.error(\"Error: --summary is required\");\n throw new Error(\"Summary required\");\n }\n\n const confidence = options.confidence ?? 0.8;\n if (confidence < 0 || confidence > 1) {\n console.error(\"Error: --confidence must be between 0 and 1\");\n throw new Error(\"Invalid confidence\");\n }\n\n let completed = completeTrajectory(active, {\n summary: options.summary,\n approach: options.approach || \"Standard approach\",\n confidence,\n });\n\n // Generate trace if we have a start reference\n let trace: TraceRecord | null = null;\n if (active._trace?.startRef) {\n trace = generateTrace(completed, active._trace.startRef);\n if (trace) {\n // Update trajectory with final trace reference\n const endRef = getGitHead();\n completed = {\n ...completed,\n _trace: {\n ...completed._trace,\n startRef: active._trace.startRef,\n endRef: endRef ?? undefined,\n traceId: trace.id,\n },\n };\n }\n }\n\n await storage.save(completed);\n\n // Save trace file alongside trajectory if generated\n if (trace) {\n await saveTraceFile(completed, trace);\n }\n\n console.log(`✓ Trajectory completed: ${completed.id}`);\n console.log(` Summary: ${options.summary}`);\n console.log(` Confidence: ${Math.round(confidence * 100)}%`);\n if (trace) {\n console.log(` Trace: ${trace.id} (${trace.files.length} files)`);\n }\n });\n}\n","/**\n * Agent Trace generation logic\n *\n * Captures git state before and after agent work to generate\n * trace records that attribute code contributions to agents.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { generateRandomId } from \"./id.js\";\nimport type {\n TraceFile,\n TraceRange,\n TraceRecord,\n Trajectory,\n TrajectoryTraceRef,\n} from \"./types.js\";\n\n/**\n * Validate a git reference to prevent command injection\n * @param ref - Git reference to validate\n * @returns True if the ref is safe to use in git commands\n */\nexport function isValidGitRef(ref: string): boolean {\n // Allow HEAD, branch names, and commit hashes\n // Git refs can contain alphanumeric, -, _, /, and .\n // Commit hashes are 7-40 hex characters\n const validRefPattern = /^[a-zA-Z0-9_\\-./]+$/;\n const commitHashPattern = /^[a-fA-F0-9]{7,40}$/;\n\n if (ref === \"HEAD\" || ref === \"working\") {\n return true;\n }\n\n if (commitHashPattern.test(ref)) {\n return true;\n }\n\n // For branch names, ensure no shell metacharacters\n if (validRefPattern.test(ref) && ref.length <= 255) {\n // Additional check: no consecutive dots (prevents .. traversal tricks)\n if (!ref.includes(\"..\") || ref.split(\"..\").every((p) => p.length > 0)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Check if the current directory is inside a git repository\n * @returns True if in a git repo, false otherwise\n */\nexport function isGitRepo(): boolean {\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the current git HEAD reference\n * @returns The current HEAD commit hash, or null if not in a git repo\n */\nexport function getGitHead(): string | null {\n if (!isGitRepo()) {\n return null;\n }\n\n try {\n const head = execSync(\"git rev-parse HEAD\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return head;\n } catch {\n return null;\n }\n}\n\n/**\n * Capture the current git state for trace tracking\n * @returns The start reference (commit hash) or null if not in git repo\n */\nexport function captureGitState(): string | null {\n return getGitHead();\n}\n\n/**\n * Parse git diff output to extract changed files and line ranges\n * @param diffOutput - Raw git diff output\n * @returns Array of file paths with their changed line ranges\n */\nfunction parseDiffOutput(\n diffOutput: string,\n): Array<{ path: string; ranges: TraceRange[] }> {\n const files: Array<{ path: string; ranges: TraceRange[] }> = [];\n const lines = diffOutput.split(\"\\n\");\n\n let currentFile: string | null = null;\n let currentRanges: TraceRange[] = [];\n\n for (const line of lines) {\n // Match diff header for file path\n // Format: diff --git a/path/to/file b/path/to/file\n const diffHeaderMatch = line.match(/^diff --git a\\/.+ b\\/(.+)$/);\n if (diffHeaderMatch) {\n // Save previous file if exists\n if (currentFile) {\n files.push({ path: currentFile, ranges: currentRanges });\n }\n currentFile = diffHeaderMatch[1];\n currentRanges = [];\n continue;\n }\n\n // Match hunk header for line ranges\n // Format: @@ -start,count +start,count @@ optional context\n const hunkMatch = line.match(/^@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,(\\d+))? @@/);\n if (hunkMatch && currentFile) {\n const startLine = Number.parseInt(hunkMatch[1], 10);\n const lineCount = hunkMatch[2] ? Number.parseInt(hunkMatch[2], 10) : 1;\n\n if (lineCount > 0) {\n currentRanges.push({\n start_line: startLine,\n end_line: startLine + lineCount - 1,\n });\n }\n }\n }\n\n // Don't forget the last file\n if (currentFile) {\n files.push({ path: currentFile, ranges: currentRanges });\n }\n\n return files;\n}\n\n/**\n * Get the list of changed files between two git refs\n * @param startRef - Starting commit reference\n * @param endRef - Ending commit reference (defaults to HEAD)\n * @returns Array of changed file paths with line ranges\n */\nexport function getChangedFiles(\n startRef: string,\n endRef = \"HEAD\",\n): Array<{ path: string; ranges: TraceRange[] }> {\n if (!isGitRepo()) {\n return [];\n }\n\n // Validate git refs to prevent command injection\n if (!isValidGitRef(startRef) || !isValidGitRef(endRef)) {\n return [];\n }\n\n try {\n const diffOutput = execSync(`git diff ${startRef}..${endRef}`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large diffs\n });\n\n return parseDiffOutput(diffOutput);\n } catch {\n return [];\n }\n}\n\n/**\n * Detect the model from environment variables\n * @returns Model identifier or 'unknown'\n */\nexport function detectModel(): string {\n // Check custom env var first\n if (process.env.TRAIL_TRACE_MODEL) {\n return process.env.TRAIL_TRACE_MODEL;\n }\n\n // Check Anthropic model env var\n if (process.env.ANTHROPIC_MODEL) {\n return process.env.ANTHROPIC_MODEL;\n }\n\n // Check common AI provider model env vars\n if (process.env.OPENAI_MODEL) {\n return process.env.OPENAI_MODEL;\n }\n\n return \"unknown\";\n}\n\n/**\n * Generate a unique trace ID\n * Format: trace_xxxxxxxxxxxx\n * @returns Unique trace ID\n */\nexport function generateTraceId(): string {\n return `trace_${generateRandomId()}`;\n}\n\n/**\n * Compute content hash for a given string\n * @param content - Content to hash\n * @returns SHA-256 hash (first 16 chars)\n */\nexport function computeContentHash(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n}\n\n/**\n * Generate a trace record from a trajectory and git state\n * @param trajectory - The trajectory to generate trace for\n * @param startRef - The git ref from when work started\n * @returns TraceRecord with file contributions, or null if not in git repo\n */\nexport function generateTrace(\n trajectory: Trajectory,\n startRef: string,\n): TraceRecord | null {\n if (!isGitRepo()) {\n return null;\n }\n\n const endRef = getGitHead();\n if (!endRef) {\n return null;\n }\n\n // Get changed files with line ranges\n const changedFiles = getChangedFiles(startRef, endRef);\n\n // Return null if no files changed\n if (changedFiles.length === 0) {\n return null;\n }\n\n // Detect the model used\n const model = detectModel();\n\n // Build trace files\n const traceFiles: TraceFile[] = changedFiles.map(({ path, ranges }) => ({\n path,\n conversations: [\n {\n contributor: {\n type: \"agent\",\n model,\n },\n ranges: ranges.map((range) => ({\n ...range,\n revision: endRef,\n })),\n },\n ],\n }));\n\n return {\n version: 1,\n id: generateTraceId(),\n timestamp: new Date().toISOString(),\n trajectory: trajectory.id,\n files: traceFiles,\n };\n}\n\n/**\n * Create a trace reference for embedding in a trajectory\n * @param startRef - Git ref when trace started\n * @param traceId - Optional ID of the generated trace record\n * @returns TrajectoryTraceRef object\n */\nexport function createTraceRef(\n startRef: string,\n traceId?: string,\n): TrajectoryTraceRef {\n const endRef = getGitHead();\n\n return {\n startRef,\n endRef: endRef ?? undefined,\n traceId,\n };\n}\n","/**\n * trail decision command\n */\n\nimport type { Command } from \"commander\";\nimport { addDecision } from \"../../core/trajectory.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerDecisionCommand(program: Command): void {\n program\n .command(\"decision <choice>\")\n .description(\"Record a decision\")\n .option(\n \"-r, --reasoning <text>\",\n \"Why this choice was made (optional for minor decisions)\",\n )\n .option(\n \"-a, --alternatives <items>\",\n \"Comma-separated alternatives considered\",\n )\n .action(async (choice: string, options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n if (!active) {\n console.error(\"Error: No active trajectory\");\n console.error('Start one with: trail start \"Task description\"');\n throw new Error(\"No active trajectory\");\n }\n\n const alternatives = options.alternatives\n ? options.alternatives\n .split(\",\")\n .map((s: string) => ({ option: s.trim(), reason: \"\" }))\n : [];\n\n const reasoning = options.reasoning || \"\";\n\n const updated = addDecision(active, {\n question: choice,\n chosen: choice,\n alternatives,\n reasoning,\n });\n\n await storage.save(updated);\n\n console.log(`✓ Decision recorded: ${choice}`);\n if (reasoning) {\n console.log(` Reasoning: ${reasoning}`);\n }\n if (alternatives.length > 0) {\n const altStrings = alternatives.map(\n (a: { option: string }) => a.option,\n );\n console.log(` Alternatives: ${altStrings.join(\", \")}`);\n }\n });\n}\n","/**\n * trail export command\n */\n\nimport { exec } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { exportToJSON } from \"../../export/json.js\";\nimport { exportToMarkdown } from \"../../export/markdown.js\";\nimport { exportToTimeline } from \"../../export/timeline.js\";\nimport { FileStorage } from \"../../storage/file.js\";\nimport { generateTrajectoryHtml } from \"../../web/generator.js\";\n\nexport function registerExportCommand(program: Command): void {\n program\n .command(\"export [id]\")\n .description(\"Export a trajectory\")\n .option(\n \"-f, --format <format>\",\n \"Export format (md, json, timeline, html)\",\n \"md\",\n )\n .option(\"-o, --output <path>\", \"Output file path\")\n .option(\"--open\", \"Open in browser (html format only)\")\n .action(async (id: string | undefined, options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n // If no ID provided, use active trajectory\n let trajectory;\n if (id) {\n trajectory = await storage.get(id);\n if (!trajectory) {\n console.error(`Error: Trajectory not found: ${id}`);\n throw new Error(\"Trajectory not found\");\n }\n } else {\n trajectory = await storage.getActive();\n if (!trajectory) {\n console.error(\"Error: No active trajectory and no ID provided\");\n console.error(\n \"Usage: trail export <id> or trail export (with active trajectory)\",\n );\n throw new Error(\"No trajectory specified\");\n }\n }\n\n let output: string;\n\n switch (options.format) {\n case \"json\":\n output = exportToJSON(trajectory);\n break;\n case \"timeline\":\n output = exportToTimeline(trajectory);\n break;\n case \"html\":\n output = generateTrajectoryHtml(trajectory);\n break;\n default:\n output = exportToMarkdown(trajectory);\n break;\n }\n\n if (options.output) {\n await writeFile(options.output, output, \"utf-8\");\n console.log(`✓ Exported to ${options.output}`);\n\n if (options.open && options.format === \"html\") {\n openInBrowser(options.output);\n }\n } else if (options.open && options.format === \"html\") {\n // Write to temp location and open\n const outputDir = join(process.cwd(), \".trajectories\", \"html\");\n await mkdir(outputDir, { recursive: true });\n const filePath = join(outputDir, `${trajectory.id}.html`);\n await writeFile(filePath, output, \"utf-8\");\n console.log(`✓ Generated: ${filePath}`);\n openInBrowser(filePath);\n } else {\n console.log(output);\n }\n });\n}\n\nfunction openInBrowser(path: string): void {\n const platform = process.platform;\n let command: string;\n\n if (platform === \"darwin\") {\n command = `open \"${path}\"`;\n } else if (platform === \"win32\") {\n command = `start \"\" \"${path}\"`;\n } else {\n command = `xdg-open \"${path}\"`;\n }\n\n exec(command, (error) => {\n if (error) {\n console.log(`Open manually: file://${path}`);\n }\n });\n}\n","/**\n * Embedded CSS styles for trajectory viewer\n */\n\nexport const styles = `\n:root {\n --bg: #ffffff;\n --bg-secondary: #f8f9fa;\n --text: #1a1a2e;\n --text-muted: #6c757d;\n --border: #e9ecef;\n --accent: #4f46e5;\n --accent-light: #eef2ff;\n --success: #10b981;\n --warning: #f59e0b;\n --error: #ef4444;\n}\n\n@media (prefers-color-scheme: dark) {\n :root {\n --bg: #1a1a2e;\n --bg-secondary: #16213e;\n --text: #e9ecef;\n --text-muted: #adb5bd;\n --border: #2d3748;\n --accent: #818cf8;\n --accent-light: #1e1b4b;\n }\n}\n\n* {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\nbody {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: var(--bg);\n color: var(--text);\n line-height: 1.6;\n padding: 2rem;\n max-width: 900px;\n margin: 0 auto;\n}\n\nh1, h2, h3 {\n margin-bottom: 0.5rem;\n}\n\nh1 {\n font-size: 1.75rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\nh2 {\n font-size: 1.25rem;\n color: var(--text-muted);\n border-bottom: 1px solid var(--border);\n padding-bottom: 0.5rem;\n margin-top: 1.5rem;\n}\n\n.header {\n border-bottom: 2px solid var(--border);\n padding-bottom: 1rem;\n margin-bottom: 1.5rem;\n}\n\n.meta {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 1rem;\n margin: 1rem 0;\n padding: 1rem;\n background: var(--bg-secondary);\n border-radius: 8px;\n}\n\n.meta-item {\n display: flex;\n flex-direction: column;\n}\n\n.meta-label {\n font-size: 0.75rem;\n text-transform: uppercase;\n color: var(--text-muted);\n letter-spacing: 0.05em;\n}\n\n.meta-value {\n font-weight: 500;\n}\n\n.status {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.status-active {\n background: var(--accent-light);\n color: var(--accent);\n}\n\n.status-completed {\n background: #d1fae5;\n color: #065f46;\n}\n\n.status-abandoned {\n background: #fee2e2;\n color: #991b1b;\n}\n\n.section {\n margin: 1.5rem 0;\n}\n\n.collapsible {\n cursor: pointer;\n user-select: none;\n}\n\n.collapsible::before {\n content: '▸ ';\n display: inline-block;\n transition: transform 0.2s;\n}\n\n.collapsible.open::before {\n transform: rotate(90deg);\n}\n\n.collapsible-content {\n display: none;\n margin-top: 0.5rem;\n padding-left: 1rem;\n border-left: 2px solid var(--border);\n}\n\n.collapsible.open + .collapsible-content {\n display: block;\n}\n\n.decision {\n background: var(--bg-secondary);\n border-radius: 8px;\n padding: 1rem;\n margin: 0.75rem 0;\n border-left: 3px solid var(--accent);\n}\n\n.decision-title {\n font-weight: 600;\n margin-bottom: 0.5rem;\n}\n\n.decision-reasoning {\n color: var(--text-muted);\n font-size: 0.9rem;\n}\n\n.alternatives {\n margin-top: 0.5rem;\n font-size: 0.85rem;\n}\n\n.alternatives-label {\n color: var(--text-muted);\n}\n\n.timeline {\n position: relative;\n padding-left: 1.5rem;\n}\n\n.timeline::before {\n content: '';\n position: absolute;\n left: 0.35rem;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--border);\n}\n\n.timeline-item {\n position: relative;\n margin: 1rem 0;\n padding-left: 1rem;\n}\n\n.timeline-item::before {\n content: '';\n position: absolute;\n left: -1.15rem;\n top: 0.5rem;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--accent);\n border: 2px solid var(--bg);\n}\n\n.timeline-item.decision::before {\n background: var(--warning);\n}\n\n.timeline-item.chapter::before {\n background: var(--success);\n}\n\n.timeline-time {\n font-size: 0.75rem;\n color: var(--text-muted);\n}\n\n.timeline-content {\n margin-top: 0.25rem;\n}\n\n.chapter {\n background: var(--bg-secondary);\n border-radius: 8px;\n padding: 1rem;\n margin: 1rem 0;\n}\n\n.chapter-title {\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.chapter-agent {\n font-size: 0.85rem;\n color: var(--text-muted);\n}\n\n.retrospective {\n background: linear-gradient(135deg, var(--accent-light), var(--bg-secondary));\n border-radius: 8px;\n padding: 1.5rem;\n margin: 1.5rem 0;\n}\n\n.retrospective h3 {\n margin-bottom: 1rem;\n}\n\n.confidence {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0.5rem 0;\n}\n\n.confidence-bar {\n flex: 1;\n height: 8px;\n background: var(--border);\n border-radius: 4px;\n overflow: hidden;\n max-width: 200px;\n}\n\n.confidence-fill {\n height: 100%;\n background: var(--accent);\n transition: width 0.3s;\n}\n\n.list {\n list-style: none;\n}\n\n.list li {\n padding: 0.25rem 0;\n padding-left: 1rem;\n position: relative;\n}\n\n.list li::before {\n content: '•';\n position: absolute;\n left: 0;\n color: var(--accent);\n}\n\n.files-changed {\n font-family: monospace;\n font-size: 0.85rem;\n background: var(--bg-secondary);\n padding: 0.75rem;\n border-radius: 4px;\n margin: 0.5rem 0;\n}\n\n.empty {\n color: var(--text-muted);\n font-style: italic;\n}\n\n/* Index page styles */\n.trajectory-list {\n list-style: none;\n}\n\n.trajectory-card {\n display: block;\n padding: 1rem;\n margin: 0.5rem 0;\n background: var(--bg-secondary);\n border-radius: 8px;\n text-decoration: none;\n color: var(--text);\n border: 1px solid var(--border);\n transition: border-color 0.2s, box-shadow 0.2s;\n}\n\n.trajectory-card:hover {\n border-color: var(--accent);\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n}\n\n.trajectory-card-title {\n font-weight: 600;\n margin-bottom: 0.25rem;\n}\n\n.trajectory-card-meta {\n font-size: 0.85rem;\n color: var(--text-muted);\n display: flex;\n gap: 1rem;\n}\n\n.group-header {\n font-size: 0.85rem;\n text-transform: uppercase;\n color: var(--text-muted);\n letter-spacing: 0.05em;\n margin-top: 1.5rem;\n margin-bottom: 0.5rem;\n}\n`;\n","/**\n * Static HTML generator for trajectory viewing\n */\n\nimport type {\n Chapter,\n Decision,\n Trajectory,\n TrajectoryEvent,\n} from \"../core/types.js\";\nimport { styles } from \"./styles.js\";\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\nfunction formatDate(isoDate: string): string {\n const date = new Date(isoDate);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nfunction formatDuration(startDate: string, endDate?: string): string {\n const start = new Date(startDate).getTime();\n const end = endDate ? new Date(endDate).getTime() : Date.now();\n const ms = end - start;\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ${hours % 24}h`;\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m`;\n return `${seconds}s`;\n}\n\nfunction getStatusClass(status: string): string {\n switch (status) {\n case \"active\":\n return \"status-active\";\n case \"completed\":\n return \"status-completed\";\n case \"abandoned\":\n return \"status-abandoned\";\n default:\n return \"\";\n }\n}\n\nfunction renderDecision(decision: Decision): string {\n const alternatives = decision.alternatives?.length\n ? `<div class=\"alternatives\">\n <span class=\"alternatives-label\">Considered:</span>\n ${decision.alternatives.map((a) => escapeHtml(typeof a === \"string\" ? a : a.option)).join(\", \")}\n </div>`\n : \"\";\n\n return `\n <div class=\"decision\">\n <div class=\"decision-title\">${escapeHtml(decision.question)}: ${escapeHtml(decision.chosen)}</div>\n <div class=\"decision-reasoning\">${escapeHtml(decision.reasoning)}</div>\n ${alternatives}\n </div>\n `;\n}\n\nfunction renderEvent(event: TrajectoryEvent): string {\n const time = formatDate(new Date(event.ts).toISOString());\n let content = \"\";\n let typeClass = \"\";\n const rawData = event.raw as Record<string, unknown> | undefined;\n\n switch (event.type) {\n case \"decision\":\n typeClass = \"decision\";\n content = `\n <strong>Decision:</strong> ${escapeHtml(event.content)}\n ${rawData?.reasoning ? `<div class=\"decision-reasoning\">${escapeHtml(String(rawData.reasoning))}</div>` : \"\"}\n `;\n break;\n case \"thinking\":\n content = `<strong>Thinking:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"prompt\":\n content = `<strong>Prompt:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"tool_call\":\n content = `<strong>Tool:</strong> <code>${escapeHtml(event.content)}</code>`;\n break;\n case \"tool_result\":\n content = `<strong>Result:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"message_sent\":\n content = `<strong>Sent:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"message_received\":\n content = `<strong>Received:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"error\":\n content = `<strong style=\"color: var(--error)\">Error:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"note\":\n content = escapeHtml(event.content);\n break;\n default:\n content = escapeHtml(event.content);\n }\n\n return `\n <div class=\"timeline-item ${typeClass}\">\n <div class=\"timeline-time\">${time}</div>\n <div class=\"timeline-content\">${content}</div>\n </div>\n `;\n}\n\nfunction renderChapter(chapter: Chapter, index: number): string {\n const events = chapter.events.map(renderEvent).join(\"\");\n\n return `\n <div class=\"chapter\">\n <div class=\"chapter-title\">\n Chapter ${index + 1}: ${escapeHtml(chapter.title)}\n </div>\n <div class=\"chapter-agent\">Agent: ${escapeHtml(chapter.agentName)}</div>\n ${\n chapter.events.length > 0\n ? `\n <h3 class=\"collapsible\" onclick=\"this.classList.toggle('open')\">Events (${chapter.events.length})</h3>\n <div class=\"collapsible-content\">\n <div class=\"timeline\">${events}</div>\n </div>\n `\n : \"\"\n }\n </div>\n `;\n}\n\nfunction renderRetrospective(trajectory: Trajectory): string {\n if (!trajectory.retrospective) {\n return \"\";\n }\n\n const retro = trajectory.retrospective;\n const confidencePercent = Math.round(retro.confidence * 100);\n\n const approach = retro.approach\n ? `<div><strong>Approach:</strong><p>${escapeHtml(retro.approach)}</p></div>`\n : \"\";\n\n const learnings = retro.learnings?.length\n ? `<div><strong>Learnings:</strong><ul class=\"list\">${retro.learnings.map((l) => `<li>${escapeHtml(l)}</li>`).join(\"\")}</ul></div>`\n : \"\";\n\n const challenges = retro.challenges?.length\n ? `<div><strong>Challenges:</strong><ul class=\"list\">${retro.challenges.map((c) => `<li>${escapeHtml(c)}</li>`).join(\"\")}</ul></div>`\n : \"\";\n\n const suggestions = retro.suggestions?.length\n ? `<div><strong>Suggestions:</strong><ul class=\"list\">${retro.suggestions.map((s) => `<li>${escapeHtml(s)}</li>`).join(\"\")}</ul></div>`\n : \"\";\n\n return `\n <div class=\"retrospective\">\n <h3>📝 Retrospective</h3>\n <p>${escapeHtml(retro.summary)}</p>\n\n <div class=\"confidence\">\n <span>Confidence:</span>\n <div class=\"confidence-bar\">\n <div class=\"confidence-fill\" style=\"width: ${confidencePercent}%\"></div>\n </div>\n <span>${confidencePercent}%</span>\n </div>\n\n ${approach}\n ${learnings}\n ${challenges}\n ${suggestions}\n </div>\n `;\n}\n\nexport function generateTrajectoryHtml(trajectory: Trajectory): string {\n const statusClass = getStatusClass(trajectory.status);\n const duration = formatDuration(trajectory.startedAt, trajectory.completedAt);\n\n // Extract all decisions from chapters\n const decisions: Decision[] = trajectory.chapters.flatMap((ch) =>\n ch.events\n .filter((e) => e.type === \"decision\" && e.raw)\n .map((e) => e.raw as Decision)\n .filter(\n (d): d is Decision => d !== undefined && typeof d.question === \"string\",\n ),\n );\n\n const decisionsHtml = decisions.length\n ? `\n <h2 class=\"collapsible open\" onclick=\"this.classList.toggle('open')\">\n Key Decisions (${decisions.length})\n </h2>\n <div class=\"collapsible-content\">\n ${decisions.map(renderDecision).join(\"\")}\n </div>\n `\n : \"\";\n\n const chaptersHtml = trajectory.chapters.length\n ? `\n <h2 class=\"collapsible open\" onclick=\"this.classList.toggle('open')\">\n Chapters (${trajectory.chapters.length})\n </h2>\n <div class=\"collapsible-content\">\n ${trajectory.chapters.map(renderChapter).join(\"\")}\n </div>\n `\n : \"\";\n\n const filesHtml = trajectory.filesChanged.length\n ? `\n <h2>Files Changed (${trajectory.filesChanged.length})</h2>\n <div class=\"files-changed\">\n ${trajectory.filesChanged.map((f) => escapeHtml(f)).join(\"<br>\")}\n </div>\n `\n : \"\";\n\n const commitsHtml = trajectory.commits.length\n ? `\n <h2>Commits (${trajectory.commits.length})</h2>\n <div class=\"files-changed\">\n ${trajectory.commits.map((c) => `<code>${escapeHtml(c)}</code>`).join(\"<br>\")}\n </div>\n `\n : \"\";\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${escapeHtml(trajectory.task.title)} - Trajectory</title>\n <style>${styles}</style>\n</head>\n<body>\n <div class=\"header\">\n <h1>🛤️ ${escapeHtml(trajectory.task.title)}</h1>\n <div class=\"meta\">\n <div class=\"meta-item\">\n <span class=\"meta-label\">ID</span>\n <span class=\"meta-value\"><code>${trajectory.id}</code></span>\n </div>\n <div class=\"meta-item\">\n <span class=\"meta-label\">Status</span>\n <span class=\"meta-value\"><span class=\"status ${statusClass}\">${trajectory.status}</span></span>\n </div>\n <div class=\"meta-item\">\n <span class=\"meta-label\">Duration</span>\n <span class=\"meta-value\">${duration}</span>\n </div>\n <div class=\"meta-item\">\n <span class=\"meta-label\">Started</span>\n <span class=\"meta-value\">${formatDate(trajectory.startedAt)}</span>\n </div>\n ${\n trajectory.task.source\n ? `\n <div class=\"meta-item\">\n <span class=\"meta-label\">Source</span>\n <span class=\"meta-value\">${escapeHtml(trajectory.task.source.system)}:${escapeHtml(trajectory.task.source.id)}</span>\n </div>\n `\n : \"\"\n }\n <div class=\"meta-item\">\n <span class=\"meta-label\">Agents</span>\n <span class=\"meta-value\">${trajectory.agents.map((a) => escapeHtml(a.name)).join(\", \") || \"—\"}</span>\n </div>\n </div>\n </div>\n\n ${renderRetrospective(trajectory)}\n ${decisionsHtml}\n ${chaptersHtml}\n ${filesHtml}\n ${commitsHtml}\n\n <script>\n // Initialize all collapsible sections\n document.querySelectorAll('.collapsible.open').forEach(el => {\n el.nextElementSibling?.style && (el.nextElementSibling.style.display = 'block');\n });\n </script>\n</body>\n</html>`;\n}\n\nexport function generateIndexHtml(trajectories: Trajectory[]): string {\n // Group by status\n const active = trajectories.filter((t) => t.status === \"active\");\n const completed = trajectories.filter((t) => t.status === \"completed\");\n const abandoned = trajectories.filter((t) => t.status === \"abandoned\");\n\n function renderCard(t: Trajectory): string {\n const duration = formatDuration(t.startedAt, t.completedAt);\n const statusClass = getStatusClass(t.status);\n\n return `\n <a href=\"${t.id}.html\" class=\"trajectory-card\">\n <div class=\"trajectory-card-title\">${escapeHtml(t.task.title)}</div>\n <div class=\"trajectory-card-meta\">\n <span class=\"status ${statusClass}\">${t.status}</span>\n <span>${duration}</span>\n <span>${t.chapters.length} chapters</span>\n </div>\n </a>\n `;\n }\n\n function renderGroup(title: string, items: Trajectory[]): string {\n if (items.length === 0) return \"\";\n return `\n <div class=\"group-header\">${title} (${items.length})</div>\n <div class=\"trajectory-list\">\n ${items.map(renderCard).join(\"\")}\n </div>\n `;\n }\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Trajectories</title>\n <style>${styles}</style>\n</head>\n<body>\n <div class=\"header\">\n <h1>🛤️ Trajectories</h1>\n <p>${trajectories.length} total trajectories</p>\n </div>\n\n ${renderGroup(\"Active\", active)}\n ${renderGroup(\"Completed\", completed)}\n ${renderGroup(\"Abandoned\", abandoned)}\n\n ${trajectories.length === 0 ? '<p class=\"empty\">No trajectories yet. Start one with <code>trail start \"Task name\"</code></p>' : \"\"}\n</body>\n</html>`;\n}\n","/**\n * trail list command\n */\n\nimport { existsSync } from \"node:fs\";\nimport type { Command } from \"commander\";\nimport type { TrajectoryStatus, TrajectorySummary } from \"../../core/types.js\";\nimport { FileStorage, getSearchPaths } from \"../../storage/file.js\";\n\nexport function registerListCommand(program: Command): void {\n program\n .command(\"list\")\n .description(\"List and search trajectories\")\n .option(\n \"-s, --status <status>\",\n \"Filter by status (active, completed, abandoned)\",\n )\n .option(\"-l, --limit <number>\", \"Limit results\", Number.parseInt)\n .option(\"--search <query>\", \"Search trajectories by title or content\")\n .action(async (options) => {\n // Get all search paths and aggregate results\n const searchPaths = getSearchPaths();\n let allTrajectories: TrajectorySummary[] = [];\n const seenIds = new Set<string>();\n\n for (const searchPath of searchPaths) {\n // Skip paths that don't exist\n if (!existsSync(searchPath)) {\n continue;\n }\n\n // Create storage pointing to this path directly\n // We set TRAJECTORIES_DATA_DIR temporarily to use this path\n const originalDataDir = process.env.TRAJECTORIES_DATA_DIR;\n process.env.TRAJECTORIES_DATA_DIR = searchPath;\n\n try {\n const storage = new FileStorage();\n await storage.initialize();\n\n const trajectories = await storage.list({\n status: options.status as TrajectoryStatus | undefined,\n limit: options.search ? undefined : undefined, // Don't limit per-path\n });\n\n // Add to results, avoiding duplicates\n for (const traj of trajectories) {\n if (!seenIds.has(traj.id)) {\n seenIds.add(traj.id);\n allTrajectories.push(traj);\n }\n }\n } finally {\n // Restore original env var\n if (originalDataDir !== undefined) {\n process.env.TRAJECTORIES_DATA_DIR = originalDataDir;\n } else {\n process.env.TRAJECTORIES_DATA_DIR = undefined;\n }\n }\n }\n\n // Sort by startedAt descending (most recent first)\n allTrajectories.sort(\n (a, b) =>\n new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),\n );\n\n // Apply search filter if provided\n if (options.search) {\n const query = options.search.toLowerCase();\n allTrajectories = allTrajectories.filter((traj) => {\n // Search in title\n if (traj.title.toLowerCase().includes(query)) return true;\n // Search in ID\n if (traj.id.toLowerCase().includes(query)) return true;\n return false;\n });\n }\n\n // Apply limit after aggregation and search\n if (options.limit) {\n allTrajectories = allTrajectories.slice(0, options.limit);\n }\n\n if (allTrajectories.length === 0) {\n if (options.search) {\n console.log(`No trajectories found matching \"${options.search}\"`);\n } else {\n console.log(\"No trajectories found\");\n }\n return;\n }\n\n const searchNote = options.search ? ` matching \"${options.search}\"` : \"\";\n console.log(\n `Found ${allTrajectories.length} trajectories${searchNote}:\\n`,\n );\n\n for (const traj of allTrajectories) {\n const statusIcon = getStatusIcon(traj.status);\n const confidence = traj.confidence\n ? ` (${Math.round(traj.confidence * 100)}%)`\n : \"\";\n\n console.log(`${statusIcon} ${traj.id}`);\n console.log(` ${traj.title}${confidence}`);\n console.log(` Started: ${formatDate(traj.startedAt)}`);\n if (traj.completedAt) {\n console.log(` Completed: ${formatDate(traj.completedAt)}`);\n }\n console.log(\"\");\n }\n });\n}\n\nfunction getStatusIcon(status: string): string {\n switch (status) {\n case \"active\":\n return \"🔄\";\n case \"completed\":\n return \"✅\";\n case \"abandoned\":\n return \"❌\";\n default:\n return \"•\";\n }\n}\n\nfunction formatDate(isoString: string): string {\n return new Date(isoString).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n","/**\n * trail show command\n */\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport type {\n Decision,\n TraceConversation,\n TraceRecord,\n Trajectory,\n} from \"../../core/types.js\";\nimport { FileStorage, getSearchPaths } from \"../../storage/file.js\";\n\n/**\n * Search for a trajectory across all search paths\n */\nasync function findTrajectory(id: string): Promise<Trajectory | null> {\n const searchPaths = getSearchPaths();\n\n for (const searchPath of searchPaths) {\n // Skip paths that don't exist\n if (!existsSync(searchPath)) {\n continue;\n }\n\n // Create storage pointing to this path directly\n const originalDataDir = process.env.TRAJECTORIES_DATA_DIR;\n process.env.TRAJECTORIES_DATA_DIR = searchPath;\n\n try {\n const storage = new FileStorage();\n await storage.initialize();\n\n const trajectory = await storage.get(id);\n if (trajectory) {\n return trajectory;\n }\n } finally {\n // Restore original env var\n if (originalDataDir !== undefined) {\n process.env.TRAJECTORIES_DATA_DIR = originalDataDir;\n } else {\n process.env.TRAJECTORIES_DATA_DIR = undefined;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Find and load the trace file for a trajectory\n */\nasync function findTraceFile(id: string): Promise<TraceRecord | null> {\n const searchPaths = getSearchPaths();\n\n for (const searchPath of searchPaths) {\n if (!existsSync(searchPath)) {\n continue;\n }\n\n const completedDir = join(searchPath, \"completed\");\n if (!existsSync(completedDir)) {\n continue;\n }\n\n // Search through month directories\n try {\n const { readdirSync } = await import(\"node:fs\");\n const months = readdirSync(completedDir);\n for (const month of months) {\n const tracePath = join(completedDir, month, `${id}.trace.json`);\n if (existsSync(tracePath)) {\n const content = await readFile(tracePath, \"utf-8\");\n return JSON.parse(content) as TraceRecord;\n }\n }\n } catch {\n // Continue searching\n }\n }\n\n return null;\n}\n\nexport function registerShowCommand(program: Command): void {\n program\n .command(\"show <id>\")\n .description(\"Show trajectory details\")\n .option(\"-d, --decisions\", \"Show decisions only\")\n .option(\"-t, --trace\", \"Show trace information\")\n .action(async (id: string, options) => {\n const trajectory = await findTrajectory(id);\n\n if (!trajectory) {\n console.error(`Error: Trajectory not found: ${id}`);\n throw new Error(\"Trajectory not found\");\n }\n\n if (options.trace) {\n // Show trace information\n console.log(`Trace for ${trajectory.task.title}:\\n`);\n\n // Show embedded trace reference\n if (trajectory._trace) {\n console.log(\"Trace Reference:\");\n console.log(` Start Ref: ${trajectory._trace.startRef}`);\n if (trajectory._trace.endRef) {\n console.log(` End Ref: ${trajectory._trace.endRef}`);\n }\n if (trajectory._trace.traceId) {\n console.log(` Trace ID: ${trajectory._trace.traceId}`);\n }\n console.log(\"\");\n }\n\n // Load and display trace file\n const trace = await findTraceFile(id);\n if (trace) {\n console.log(\"Trace Details:\");\n console.log(` ID: ${trace.id}`);\n console.log(` Timestamp: ${trace.timestamp}`);\n console.log(` Files: ${trace.files.length}`);\n console.log(\"\");\n\n if (trace.files.length > 0) {\n console.log(\"Modified Files:\");\n for (const file of trace.files) {\n const rangeCount = file.conversations.reduce(\n (sum: number, conv: TraceConversation) =>\n sum + conv.ranges.length,\n 0,\n );\n const model =\n file.conversations[0]?.contributor.model ?? \"unknown\";\n console.log(` • ${file.path}`);\n console.log(` Ranges: ${rangeCount}, Model: ${model}`);\n }\n }\n } else if (!trajectory._trace) {\n console.log(\"No trace information available\");\n console.log(\n \"Trace is captured when starting a trajectory in a git repo\",\n );\n }\n return;\n }\n\n if (options.decisions) {\n // Show decisions only\n const decisions = extractDecisions(trajectory);\n\n if (decisions.length === 0) {\n console.log(\"No decisions recorded\");\n return;\n }\n\n console.log(`Decisions for ${trajectory.task.title}:\\n`);\n for (const decision of decisions) {\n console.log(`• ${decision.question}`);\n console.log(` Chose: ${decision.chosen}`);\n console.log(` Reasoning: ${decision.reasoning}`);\n if (decision.alternatives.length > 0) {\n const altStrings = decision.alternatives.map((a) =>\n typeof a === \"string\" ? a : a.option,\n );\n console.log(` Alternatives: ${altStrings.join(\", \")}`);\n }\n console.log(\"\");\n }\n return;\n }\n\n // Show full details\n console.log(`Trajectory: ${trajectory.id}`);\n console.log(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\");\n console.log(`Title: ${trajectory.task.title}`);\n console.log(`Status: ${trajectory.status}`);\n console.log(`Started: ${trajectory.startedAt}`);\n if (trajectory.completedAt) {\n console.log(`Ended: ${trajectory.completedAt}`);\n }\n\n if (trajectory.task.source) {\n console.log(\n `Source: ${trajectory.task.source.system}:${trajectory.task.source.id}`,\n );\n }\n\n console.log(`\\nChapters: ${trajectory.chapters.length}`);\n for (const chapter of trajectory.chapters) {\n console.log(` • ${chapter.title} (${chapter.agentName})`);\n console.log(` Events: ${chapter.events.length}`);\n }\n\n if (trajectory.retrospective) {\n console.log(\"\\nRetrospective:\");\n console.log(` Summary: ${trajectory.retrospective.summary}`);\n console.log(\n ` Confidence: ${Math.round(trajectory.retrospective.confidence * 100)}%`,\n );\n }\n });\n}\n\nfunction extractDecisions(trajectory: any): Decision[] {\n const decisions: Decision[] = [];\n\n // From retrospective\n if (trajectory.retrospective?.decisions) {\n decisions.push(...trajectory.retrospective.decisions);\n }\n\n // From events\n for (const chapter of trajectory.chapters) {\n for (const event of chapter.events) {\n if (event.type === \"decision\" && event.raw) {\n const raw = event.raw as Decision;\n if (raw.question && raw.chosen && raw.reasoning) {\n if (!decisions.some((d) => d.question === raw.question)) {\n decisions.push(raw);\n }\n }\n }\n }\n }\n\n return decisions;\n}\n","/**\n * trail start command\n */\n\nimport type { Command } from \"commander\";\nimport { captureGitState, createTraceRef } from \"../../core/trace.js\";\nimport { addChapter, createTrajectory } from \"../../core/trajectory.js\";\nimport type { TaskSource } from \"../../core/types.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerStartCommand(program: Command): void {\n program\n .command(\"start <title>\")\n .description(\"Start a new trajectory\")\n .option(\"-t, --task <id>\", \"External task ID\")\n .option(\n \"-s, --source <system>\",\n \"Task system (github, linear, jira, beads)\",\n )\n .option(\"--url <url>\", \"URL to external task\")\n .option(\"-a, --agent <name>\", \"Agent name (or set TRAJECTORIES_AGENT)\")\n .option(\"-p, --project <id>\", \"Project ID (or set TRAJECTORIES_PROJECT)\")\n .option(\"-q, --quiet\", \"Only output trajectory ID (for scripting)\")\n .action(async (title: string, options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n // Check if there's already an active trajectory\n const active = await storage.getActive();\n if (active) {\n if (!options.quiet) {\n console.error(`Error: Trajectory already active: ${active.id}`);\n console.error(\n \"Complete or abandon it first with: trail complete or trail abandon\",\n );\n }\n throw new Error(\"Trajectory already active\");\n }\n\n // Build task source if provided\n let source: TaskSource | undefined;\n if (options.task) {\n source = {\n system: options.source || \"plain\",\n id: options.task,\n url: options.url,\n };\n }\n\n // Resolve agent name from CLI flag or env var\n const agentName =\n options.agent ?? process.env.TRAJECTORIES_AGENT ?? undefined;\n\n // Resolve project ID from CLI flag or env var\n const projectId =\n options.project ?? process.env.TRAJECTORIES_PROJECT ?? undefined;\n\n // Capture git state for trace tracking\n const startRef = captureGitState();\n\n // Create the trajectory\n let trajectory = createTrajectory({\n title,\n source,\n projectId,\n });\n\n // Add trace reference if in a git repo\n if (startRef) {\n trajectory = {\n ...trajectory,\n _trace: createTraceRef(startRef),\n };\n }\n\n // If agent specified, add initial chapter with agent name\n if (agentName) {\n trajectory = addChapter(trajectory, {\n title: \"Initial work\",\n agentName,\n });\n }\n\n await storage.save(trajectory);\n\n if (options.quiet) {\n // Only output trajectory ID for scripting\n console.log(trajectory.id);\n } else {\n console.log(`✓ Trajectory started: ${trajectory.id}`);\n console.log(` Title: ${title}`);\n if (agentName) {\n console.log(` Agent: ${agentName}`);\n }\n if (projectId) {\n console.log(` Project: ${projectId}`);\n }\n if (source) {\n console.log(` Linked to: ${source.id} (${source.system})`);\n }\n }\n });\n}\n","/**\n * trail status command\n */\n\nimport type { Command } from \"commander\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerStatusCommand(program: Command): void {\n program\n .command(\"status\")\n .description(\"Show active trajectory status\")\n .action(async () => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n\n if (!active) {\n console.log(\"No active trajectory\");\n console.log('Start one with: trail start \"Task description\"');\n return;\n }\n\n const duration = formatDuration(\n new Date().getTime() - new Date(active.startedAt).getTime(),\n );\n\n const eventCount = active.chapters.reduce(\n (sum, ch) => sum + ch.events.length,\n 0,\n );\n\n const decisionCount = active.chapters.reduce(\n (sum, ch) =>\n sum + ch.events.filter((e) => e.type === \"decision\").length,\n 0,\n );\n\n console.log(`Active Trajectory: ${active.id}`);\n console.log(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\");\n console.log(`Task: ${active.task.title}`);\n if (active.task.source) {\n console.log(\n `Source: ${active.task.source.system}:${active.task.source.id}`,\n );\n }\n console.log(`Status: ${active.status}`);\n console.log(`Started: ${duration} ago`);\n console.log(`Chapters: ${active.chapters.length}`);\n console.log(`Events: ${eventCount}`);\n console.log(`Decisions: ${decisionCount}`);\n\n if (active.chapters.length > 0) {\n const currentChapter = active.chapters[active.chapters.length - 1];\n console.log(`\\nCurrent Chapter: ${currentChapter.title}`);\n console.log(` Agent: ${currentChapter.agentName}`);\n }\n });\n}\n\nfunction formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ${hours % 24}h`;\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m`;\n return `${seconds}s`;\n}\n","/**\n * CLI Command Registration\n *\n * Registers all commands with the program.\n *\n * Core commands (8 total):\n * - start: Begin tracking a new task\n * - status: Show current trajectory state\n * - decision: Record a decision point\n * - complete: Finish with retrospective\n * - abandon: Stop without completing\n * - list: Browse trajectories (with --search)\n * - show: View trajectory details\n * - export: Output in various formats (with --open)\n */\n\nimport type { Command } from \"commander\";\nimport { registerAbandonCommand } from \"./abandon.js\";\nimport { registerCompleteCommand } from \"./complete.js\";\nimport { registerDecisionCommand } from \"./decision.js\";\nimport { registerExportCommand } from \"./export.js\";\nimport { registerListCommand } from \"./list.js\";\nimport { registerShowCommand } from \"./show.js\";\nimport { registerStartCommand } from \"./start.js\";\nimport { registerStatusCommand } from \"./status.js\";\n\n/**\n * Register all CLI commands\n */\nexport function registerCommands(program: Command): void {\n registerStartCommand(program);\n registerStatusCommand(program);\n registerCompleteCommand(program);\n registerAbandonCommand(program);\n registerDecisionCommand(program);\n registerListCommand(program);\n registerShowCommand(program);\n registerExportCommand(program);\n}\n"],"mappings":"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","names":["program","program","program","mkdir","writeFile","join","program","writeFile","join","mkdir","existsSync","program","existsSync","formatDate","existsSync","join","existsSync","join","program","program","program","formatDuration","program"]}