@crafter/cli-tree 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-e8jgr5p6.js → chunk-hnjjgt15.js} +2 -2
- package/dist/{chunk-e8jgr5p6.js.map → chunk-hnjjgt15.js.map} +3 -3
- package/dist/cli.js +3 -3
- package/dist/cli.js.map +3 -3
- package/dist/miner/index.js +1 -1
- package/dist/miner/sparkline.d.ts +14 -2
- package/package.json +1 -1
- package/src/cli.ts +1 -1
- package/src/miner/sparkline.ts +15 -3
|
@@ -490,7 +490,7 @@ var BLOCKS = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"];
|
|
|
490
490
|
function sparkline(data, opts = {}) {
|
|
491
491
|
if (data.length === 0)
|
|
492
492
|
return "";
|
|
493
|
-
const zero = opts.zero ?? "
|
|
493
|
+
const zero = opts.zero ?? "░";
|
|
494
494
|
const max = Math.max(...data);
|
|
495
495
|
if (max === 0)
|
|
496
496
|
return zero.repeat(data.length);
|
|
@@ -686,4 +686,4 @@ async function mineCli(cli, options = {}) {
|
|
|
686
686
|
|
|
687
687
|
export { readHistoryFile, detectHistoryFormat, parseHistory, tokenize, defaultHistoryPath, segmentSessions, filterByCli, extractSubcommand, extractSubcommandPath, buildTransitions, normalizeTransitions, extractPaths, clusterIntoWorkflows, computeStats, suggestSkills, minedToFlowWorkflow, computeActivity, formatTimeRange, sparkline, labeledSparkline, mineCrossCli, crossCliToFlowWorkflow, mineCli };
|
|
688
688
|
|
|
689
|
-
//# debugId=
|
|
689
|
+
//# debugId=DFDEDB046E8023FA64756E2164756E21
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
"import type { MinedWorkflow, CliUsageStats } from \"./types\";\n\nexport interface SkillSuggestion {\n\tname: string;\n\tdescription: string;\n\tcli: string;\n\tcommands: string[];\n\tfrequency: number;\n\treason: string;\n\tpriority: \"high\" | \"medium\" | \"low\";\n}\n\nexport function suggestSkills(\n\tworkflows: MinedWorkflow[],\n\tstats: CliUsageStats,\n): SkillSuggestion[] {\n\tconst suggestions: SkillSuggestion[] = [];\n\n\tfor (const wf of workflows) {\n\t\tconst path = wf.path[0] ?? [];\n\t\tif (path.length < 2) continue;\n\n\t\tconst suggestion = workflowToSuggestion(wf, stats);\n\t\tif (suggestion) suggestions.push(suggestion);\n\t}\n\n\treturn suggestions.sort((a, b) => {\n\t\tconst priorityOrder = { high: 0, medium: 1, low: 2 };\n\t\tif (priorityOrder[a.priority] !== priorityOrder[b.priority]) {\n\t\t\treturn priorityOrder[a.priority] - priorityOrder[b.priority];\n\t\t}\n\t\treturn b.frequency - a.frequency;\n\t});\n}\n\nfunction workflowToSuggestion(wf: MinedWorkflow, stats: CliUsageStats): SkillSuggestion | null {\n\tconst path = wf.path[0] ?? [];\n\tif (path.length < 2) return null;\n\n\tconst commands = path.map(sub => `${wf.cli} ${sub}`);\n\tconst frequency = wf.support;\n\n\tconst priority = scorePriority(frequency, path.length, stats.totalInvocations);\n\n\tconst name = generateSkillName(wf.cli, path);\n\tconst description = generateDescription(wf.cli, path);\n\tconst reason = generateReason(frequency, path, stats);\n\n\treturn { name, description, cli: wf.cli, commands, frequency, reason, priority };\n}\n\nfunction scorePriority(frequency: number, pathLength: number, totalInvocations: number): \"high\" | \"medium\" | \"low\" {\n\tconst ratio = frequency / totalInvocations;\n\tconst score = frequency * pathLength * (ratio + 0.1);\n\n\tif (score > 50) return \"high\";\n\tif (score > 15) return \"medium\";\n\treturn \"low\";\n}\n\nfunction generateSkillName(cli: string, path: string[]): string {\n\tconst knownPatterns: Record<string, string> = {\n\t\t\"add,commit\": \"ship\",\n\t\t\"add,commit,push\": \"ship\",\n\t\t\"commit,push\": \"push-latest\",\n\t\t\"install,dev\": \"start\",\n\t\t\"install,run\": \"start\",\n\t\t\"login,publish\": \"release\",\n\t\t\"publish,tag\": \"release\",\n\t\t\"checkout,pull\": \"sync\",\n\t\t\"fetch,pull\": \"sync\",\n\t\t\"build,push\": \"deploy\",\n\t\t\"build,run\": \"test-build\",\n\t\t\"compose,compose\": \"compose-iterate\",\n\t};\n\n\tconst key = path.join(\",\");\n\tif (knownPatterns[key]) return knownPatterns[key]!;\n\n\treturn path.join(\"-\");\n}\n\nfunction generateDescription(cli: string, path: string[]): string {\n\treturn `Run ${cli} ${path.join(\", then \")} as one command`;\n}\n\nfunction generateReason(frequency: number, path: string[], stats: CliUsageStats): string {\n\tconst ratio = frequency / stats.totalInvocations;\n\tconst pct = (ratio * 100).toFixed(0);\n\n\tif (ratio > 0.1) {\n\t\treturn `You run this exact sequence ${frequency} times (${pct}% of all your ${stats.cli} usage)`;\n\t}\n\tif (frequency >= 50) {\n\t\treturn `You run this exact sequence ${frequency} times — that's a lot of repetition`;\n\t}\n\tif (frequency >= 20) {\n\t\treturn `You run this exact sequence ${frequency} times`;\n\t}\n\treturn `Detected ${frequency} times in your shell history`;\n}\n",
|
|
11
11
|
"import type { Workflow } from \"../flow/types\";\nimport type { MinedWorkflow } from \"./types\";\n\n/**\n * Convert a MinedWorkflow (discovered from shell history) into a Workflow\n * that the flow renderer can visualize as an ASCII DAG.\n *\n * The mined workflow is a linear path like [\"add\", \"commit\", \"push\"] with\n * a frequency count. We turn it into a linear Workflow with one node per\n * step and edges in order — matching the shape of the handcrafted YAML\n * workflows in workflows/.\n */\nexport function minedToFlowWorkflow(mined: MinedWorkflow, occurrences?: number): Workflow {\n\tconst path = mined.path[0] ?? [];\n\tconst label = path.join(\" → \");\n\tconst freq = occurrences ?? mined.support;\n\n\tconst nodes = path.map((sub, idx) => ({\n\t\tid: `n${idx}`,\n\t\tcommand: [mined.cli, sub],\n\t\tlabel: sub,\n\t}));\n\n\tconst edges = [];\n\tfor (let i = 0; i < nodes.length - 1; i++) {\n\t\tedges.push({ from: nodes[i]!.id, to: nodes[i + 1]!.id });\n\t}\n\n\treturn {\n\t\tname: label,\n\t\tdescription: `Seen ${freq}× in your shell history`,\n\t\tcli: mined.cli,\n\t\tnodes,\n\t\tedges,\n\t};\n}\n",
|
|
12
12
|
"import type { HistoryEntry } from \"./types\";\n\nexport interface ActivityProfile {\n\t/** Total invocations considered */\n\ttotal: number;\n\t/** Count per hour of day (0-23) */\n\thourOfDay: number[];\n\t/** Count per day of week (0=Sun, 6=Sat) */\n\tdayOfWeek: number[];\n\t/** Count per day over the last 30 days (most recent last) */\n\tlast30Days: number[];\n\t/** Count per ISO week over the last 52 weeks (most recent last) */\n\tlast52Weeks: number[];\n\t/** The earliest timestamp observed (unix seconds) */\n\tfirstSeen: number;\n\t/** The latest timestamp observed (unix seconds) */\n\tlastSeen: number;\n\t/** How many distinct days had at least one invocation */\n\tdaysWithActivity: number;\n}\n\n/**\n * Compute temporal activity histograms from a list of history entries.\n * Assumes entries have unix-second timestamps; entries with timestamp 0 are ignored.\n */\nexport function computeActivity(entries: HistoryEntry[], now: Date = new Date()): ActivityProfile {\n\tconst hourOfDay = new Array(24).fill(0);\n\tconst dayOfWeek = new Array(7).fill(0);\n\tconst last30Days = new Array(30).fill(0);\n\tconst last52Weeks = new Array(52).fill(0);\n\n\tlet first = Infinity;\n\tlet last = 0;\n\tlet total = 0;\n\n\tconst nowMs = now.getTime();\n\tconst dayMs = 24 * 60 * 60 * 1000;\n\tconst weekMs = 7 * dayMs;\n\n\tconst distinctDays = new Set<number>();\n\n\tfor (const entry of entries) {\n\t\tif (!entry.timestamp || entry.timestamp <= 0) continue;\n\n\t\ttotal += 1;\n\t\tif (entry.timestamp < first) first = entry.timestamp;\n\t\tif (entry.timestamp > last) last = entry.timestamp;\n\n\t\tconst date = new Date(entry.timestamp * 1000);\n\t\thourOfDay[date.getHours()] += 1;\n\t\tdayOfWeek[date.getDay()] += 1;\n\n\t\tconst dayKey = Math.floor(date.getTime() / dayMs);\n\t\tdistinctDays.add(dayKey);\n\n\t\tconst ageDays = Math.floor((nowMs - date.getTime()) / dayMs);\n\t\tif (ageDays >= 0 && ageDays < 30) {\n\t\t\t// Index 29 = today, 0 = 29 days ago\n\t\t\tlast30Days[29 - ageDays] += 1;\n\t\t}\n\n\t\tconst ageWeeks = Math.floor((nowMs - date.getTime()) / weekMs);\n\t\tif (ageWeeks >= 0 && ageWeeks < 52) {\n\t\t\t// Index 51 = this week, 0 = 51 weeks ago\n\t\t\tlast52Weeks[51 - ageWeeks] += 1;\n\t\t}\n\t}\n\n\treturn {\n\t\ttotal,\n\t\thourOfDay,\n\t\tdayOfWeek,\n\t\tlast30Days,\n\t\tlast52Weeks,\n\t\tfirstSeen: first === Infinity ? 0 : first,\n\t\tlastSeen: last,\n\t\tdaysWithActivity: distinctDays.size,\n\t};\n}\n\nexport function formatTimeRange(firstSeen: number, lastSeen: number): string {\n\tif (!firstSeen || !lastSeen) return \"no data\";\n\tconst first = new Date(firstSeen * 1000);\n\tconst last = new Date(lastSeen * 1000);\n\tconst days = Math.round((last.getTime() - first.getTime()) / (24 * 60 * 60 * 1000));\n\tif (days < 1) return \"less than a day\";\n\tif (days < 30) return `${days} days`;\n\tif (days < 365) return `${Math.round(days / 30)} months`;\n\treturn `${(days / 365).toFixed(1)} years`;\n}\n",
|
|
13
|
-
"/**\n * Minimal Unicode sparkline for a numeric array.\n *\n * We could depend on @crafter/charts for this, but keeping zero deps means\n * clitree stays as a single focused package. The logic is trivial: bucket each\n * value into one of 8 block characters (▁▂▃▄▅▆▇█), with a distinct marker\n * for zero values so absence is visible at a glance.\n */\n\nconst BLOCKS = [\"▁\", \"▂\", \"▃\", \"▄\", \"▅\", \"▆\", \"▇\", \"█\"] as const;\n\nexport interface SparklineOptions {\n\t/**\n\t * Character used for zero values. Defaults to \"
|
|
13
|
+
"/**\n * Minimal Unicode sparkline for a numeric array.\n *\n * We could depend on @crafter/charts for this, but keeping zero deps means\n * clitree stays as a single focused package. The logic is trivial: bucket each\n * value into one of 8 block characters (▁▂▃▄▅▆▇█), with a distinct marker\n * for zero values so absence is visible at a glance.\n *\n * Design note on the zero character:\n * The Unicode middle dot (·, U+00B7) is centered vertically in most monospace\n * fonts, which makes it float visually in the middle of the line while the\n * block glyphs sit at the baseline — ugly and confusing.\n *\n * We default to \"░\" (U+2591, light shade). It fills the full character cell\n * with a 25% dotted texture, so it's visually distinct from the solid\n * block glyphs but still anchors to the same cell height. Empty slots read\n * as \"no data\" (texture) vs populated slots as \"bar\" (solid) at a glance.\n */\n\nconst BLOCKS = [\"▁\", \"▂\", \"▃\", \"▄\", \"▅\", \"▆\", \"▇\", \"█\"] as const;\n\nexport interface SparklineOptions {\n\t/**\n\t * Character used for zero values. Defaults to \"░\" (U+2591 light shade)\n\t * which fills the full cell with a dotted texture — visually distinct\n\t * from solid blocks but still anchored to the same cell dimensions.\n\t * Pass \" \" for truly blank, \".\" for a baseline dot, etc.\n\t */\n\tzero?: string;\n}\n\nexport function sparkline(data: number[], opts: SparklineOptions = {}): string {\n\tif (data.length === 0) return \"\";\n\tconst zero = opts.zero ?? \"░\";\n\tconst max = Math.max(...data);\n\tif (max === 0) return zero.repeat(data.length);\n\n\treturn data\n\t\t.map(value => {\n\t\t\tif (value === 0) return zero;\n\t\t\tconst idx = Math.min(\n\t\t\t\tBLOCKS.length - 1,\n\t\t\t\tMath.max(0, Math.round((value / max) * (BLOCKS.length - 1))),\n\t\t\t);\n\t\t\treturn BLOCKS[idx];\n\t\t})\n\t\t.join(\"\");\n}\n\n/**\n * Render a labeled row like \"Mon ▁▃▅█▇▅▃▂\" — used for day-of-week activity.\n */\nexport function labeledSparkline(label: string, data: number[], labelWidth = 3): string {\n\treturn `${label.padEnd(labelWidth)} ${sparkline(data)}`;\n}\n",
|
|
14
14
|
"import type { HistoryEntry, Session } from \"./types\";\nimport { segmentSessions } from \"./sessions\";\nimport { parseHistory, readHistoryFile, defaultHistoryPath } from \"./history\";\n\nexport interface CrossCliStep {\n\tcli: string;\n\tsubcommand: string;\n}\n\nexport interface CrossCliWorkflow {\n\tpath: CrossCliStep[];\n\tsupport: number;\n\tsignature: string;\n\tuniqueCLIs: number;\n}\n\nexport interface CrossCliOptions {\n\thistoryPath?: string;\n\tsessionGapMinutes?: number;\n\tminSupport?: number;\n\tminPathLength?: number;\n\tmaxPathLength?: number;\n\ttopK?: number;\n\t/** Only include workflows that cross at least this many distinct CLIs */\n\tminDistinctCLIs?: number;\n\t/** If non-empty, only consider entries whose cli[0] is in this set */\n\tallowedCLIs?: string[];\n\t/** Ignore CLIs that add noise (ls, cd, etc.) */\n\tignoreCLIs?: string[];\n}\n\nexport interface CrossCliResult {\n\tworkflows: CrossCliWorkflow[];\n\tsessionsAnalyzed: number;\n\tdistinctCLIs: string[];\n\ttotalTransitions: number;\n}\n\nconst DEFAULT_IGNORE = new Set([\n\t\"ls\",\n\t\"cd\",\n\t\"pwd\",\n\t\"echo\",\n\t\"cat\",\n\t\"clear\",\n\t\"exit\",\n\t\"env\",\n\t\"export\",\n\t\"which\",\n\t\"source\",\n\t\".\",\n\t\"sudo\",\n\t\"man\",\n\t\"open\",\n]);\n\nfunction entryToStep(entry: HistoryEntry, ignore: Set<string>): CrossCliStep | null {\n\tconst [raw, ...rest] = entry.argv;\n\tif (!raw) return null;\n\n\t// Skip absolute paths, relative paths, and variables being used as the \"cli\"\n\tif (raw.startsWith(\"/\") || raw.startsWith(\"./\") || raw.startsWith(\"../\") || raw.startsWith(\"$\")) return null;\n\n\t// CLI names must look like program names: alphanumeric start, no slashes\n\tif (!/^[a-zA-Z0-9_-]+$/.test(raw)) return null;\n\n\tif (ignore.has(raw)) return null;\n\n\tconst sub =\n\t\trest.find(arg => !arg.startsWith(\"-\") && !arg.startsWith(\"$\") && /^[a-z]/i.test(arg)) ?? \"(root)\";\n\treturn { cli: raw, subcommand: sub };\n}\n\nfunction dedupeConsecutive(steps: CrossCliStep[]): CrossCliStep[] {\n\tconst out: CrossCliStep[] = [];\n\tfor (const s of steps) {\n\t\tconst last = out[out.length - 1];\n\t\tif (!last || last.cli !== s.cli || last.subcommand !== s.subcommand) {\n\t\t\tout.push(s);\n\t\t}\n\t}\n\treturn out;\n}\n\nfunction stepKey(step: CrossCliStep): string {\n\treturn `${step.cli} ${step.subcommand}`;\n}\n\nfunction pathSignature(path: CrossCliStep[]): string {\n\treturn path.map(stepKey).join(\" → \");\n}\n\nfunction countDistinctCLIs(path: CrossCliStep[]): number {\n\treturn new Set(path.map(s => s.cli)).size;\n}\n\n/**\n * Mine workflows that cross multiple CLIs. Unlike `mineCli`, this does NOT filter\n * to a single binary up front. It looks at every command in a session and detects\n * recurring sequences that weave between tools — e.g. `git push → gh pr create`,\n * `docker build → docker push → kubectl apply`, `bun test → git commit → git push`.\n */\nexport async function mineCrossCli(options: CrossCliOptions = {}): Promise<CrossCliResult> {\n\tconst path = options.historyPath ?? defaultHistoryPath();\n\tif (!path) {\n\t\tthrow new Error(\"Could not determine shell history path. Pass historyPath explicitly.\");\n\t}\n\n\tconst text = await readHistoryFile(path);\n\tconst entries = parseHistory(text);\n\tconst sessions = segmentSessions(entries, options.sessionGapMinutes ?? 10);\n\n\tconst ignore = new Set(options.ignoreCLIs ?? Array.from(DEFAULT_IGNORE));\n\tconst allowed = options.allowedCLIs && options.allowedCLIs.length > 0 ? new Set(options.allowedCLIs) : null;\n\n\tconst minSupport = options.minSupport ?? 3;\n\tconst minLen = options.minPathLength ?? 2;\n\tconst maxLen = options.maxPathLength ?? 5;\n\tconst minDistinctCLIs = options.minDistinctCLIs ?? 2;\n\n\tconst pathCounts = new Map<string, { path: CrossCliStep[]; count: number }>();\n\tconst distinctCLIs = new Set<string>();\n\tlet totalTransitions = 0;\n\n\tfor (const session of sessions) {\n\t\tconst steps: CrossCliStep[] = [];\n\t\tfor (const entry of session.entries) {\n\t\t\tconst step = entryToStep(entry, ignore);\n\t\t\tif (!step) continue;\n\t\t\tif (allowed && !allowed.has(step.cli)) continue;\n\t\t\tdistinctCLIs.add(step.cli);\n\t\t\tsteps.push(step);\n\t\t}\n\n\t\tconst deduped = dedupeConsecutive(steps);\n\t\tif (deduped.length >= 2) totalTransitions += deduped.length - 1;\n\n\t\tfor (let start = 0; start < deduped.length; start++) {\n\t\t\tconst maxEnd = Math.min(start + maxLen, deduped.length);\n\t\t\tfor (let end = start + minLen; end <= maxEnd; end++) {\n\t\t\t\tconst slice = deduped.slice(start, end);\n\t\t\t\tif (countDistinctCLIs(slice) < minDistinctCLIs) continue;\n\t\t\t\tconst sig = pathSignature(slice);\n\t\t\t\tconst existing = pathCounts.get(sig);\n\t\t\t\tif (existing) {\n\t\t\t\t\texisting.count += 1;\n\t\t\t\t} else {\n\t\t\t\t\tpathCounts.set(sig, { path: slice, count: 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst clusters = Array.from(pathCounts.entries())\n\t\t.map(([signature, { path, count }]) => ({\n\t\t\tsignature,\n\t\t\tpath,\n\t\t\tsupport: count,\n\t\t\tuniqueCLIs: countDistinctCLIs(path),\n\t\t}))\n\t\t.filter(c => c.support >= minSupport)\n\t\t.sort((a, b) => {\n\t\t\t// Prefer more-distinct, then longer, then higher-support\n\t\t\tif (b.uniqueCLIs !== a.uniqueCLIs) return b.uniqueCLIs - a.uniqueCLIs;\n\t\t\tif (b.path.length !== a.path.length) return b.path.length - a.path.length;\n\t\t\treturn b.support - a.support;\n\t\t});\n\n\t// Remove subpaths fully contained in longer kept paths\n\tconst keptPaths: CrossCliWorkflow[] = [];\n\tfor (const cluster of clusters) {\n\t\tconst coveredBy = keptPaths.find(\n\t\t\tk => k.signature !== cluster.signature && k.signature.includes(cluster.signature) && k.support >= cluster.support * 0.7,\n\t\t);\n\t\tif (!coveredBy) {\n\t\t\tkeptPaths.push({\n\t\t\t\tpath: cluster.path,\n\t\t\t\tsupport: cluster.support,\n\t\t\t\tsignature: cluster.signature,\n\t\t\t\tuniqueCLIs: cluster.uniqueCLIs,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst topK = options.topK ?? 10;\n\n\treturn {\n\t\tworkflows: keptPaths.slice(0, topK),\n\t\tsessionsAnalyzed: sessions.length,\n\t\tdistinctCLIs: Array.from(distinctCLIs).sort(),\n\t\ttotalTransitions,\n\t};\n}\n\n/**\n * Convert a CrossCliWorkflow into a Workflow suitable for the flow renderer.\n * Each node is labeled with \"<cli> <sub>\" so the DAG makes the cross-CLI nature obvious.\n */\nexport function crossCliToFlowWorkflow(workflow: CrossCliWorkflow) {\n\tconst nodes = workflow.path.map((step, idx) => ({\n\t\tid: `n${idx}`,\n\t\tcommand: [step.cli, step.subcommand],\n\t\tlabel: `${step.cli} ${step.subcommand}`,\n\t}));\n\tconst edges = [];\n\tfor (let i = 0; i < nodes.length - 1; i++) {\n\t\tedges.push({ from: nodes[i]!.id, to: nodes[i + 1]!.id });\n\t}\n\treturn {\n\t\tname: workflow.signature,\n\t\tdescription: `Cross-CLI workflow seen ${workflow.support}× (${workflow.uniqueCLIs} tools)`,\n\t\tcli: workflow.path[0]?.cli ?? \"multi\",\n\t\tnodes,\n\t\tedges,\n\t};\n}\n",
|
|
15
15
|
"import { parseHistory, readHistoryFile, defaultHistoryPath, tokenize, detectHistoryFormat } from \"./history\";\nimport { segmentSessions, filterByCli } from \"./sessions\";\nimport { buildTransitions, normalizeTransitions, extractSubcommand, extractSubcommandPath } from \"./transitions\";\nimport { extractPaths, clusterIntoWorkflows } from \"./workflows\";\nimport { computeStats } from \"./stats\";\nimport { suggestSkills, type SkillSuggestion } from \"./suggest\";\nimport { minedToFlowWorkflow } from \"./to-flow\";\nimport { computeActivity, formatTimeRange, type ActivityProfile } from \"./activity\";\nimport { sparkline, labeledSparkline } from \"./sparkline\";\nimport { mineCrossCli, crossCliToFlowWorkflow, type CrossCliOptions, type CrossCliResult, type CrossCliWorkflow, type CrossCliStep } from \"./cross-cli\";\nimport type { HistoryEntry, Session, Transition, MinedWorkflow, CliUsageStats, MineOptions } from \"./types\";\n\nexport type {\n\tHistoryEntry,\n\tSession,\n\tTransition,\n\tMinedWorkflow,\n\tCliUsageStats,\n\tMineOptions,\n\tSkillSuggestion,\n\tActivityProfile,\n\tCrossCliOptions,\n\tCrossCliResult,\n\tCrossCliWorkflow,\n\tCrossCliStep,\n};\nexport {\n\tparseHistory,\n\treadHistoryFile,\n\tdefaultHistoryPath,\n\ttokenize,\n\tdetectHistoryFormat,\n\tsegmentSessions,\n\tfilterByCli,\n\tbuildTransitions,\n\tnormalizeTransitions,\n\textractSubcommand,\n\textractSubcommandPath,\n\textractPaths,\n\tclusterIntoWorkflows,\n\tcomputeStats,\n\tsuggestSkills,\n\tminedToFlowWorkflow,\n\tcomputeActivity,\n\tformatTimeRange,\n\tsparkline,\n\tlabeledSparkline,\n\tmineCrossCli,\n\tcrossCliToFlowWorkflow,\n};\n\nexport interface MineResult {\n\tcli: string;\n\tstats: CliUsageStats;\n\ttransitions: Transition[];\n\tworkflows: MinedWorkflow[];\n\tsuggestions: SkillSuggestion[];\n\tsessionsAnalyzed: number;\n\tactivity: ActivityProfile;\n}\n\nexport async function mineCli(cli: string, options: MineOptions = {}): Promise<MineResult> {\n\tconst path = options.historyPath ?? defaultHistoryPath();\n\tif (!path) {\n\t\tthrow new Error(\"Could not determine shell history path. Pass historyPath explicitly.\");\n\t}\n\n\tconst text = await readHistoryFile(path);\n\tconst entries = parseHistory(text);\n\tconst allSessions = segmentSessions(entries, options.sessionGapMinutes ?? 10);\n\tconst cliSessions = filterByCli(allSessions, cli);\n\n\tconst stats = computeStats(entries, allSessions, cli);\n\n\tconst rawTransitions = buildTransitions(cliSessions);\n\tconst transitions = normalizeTransitions(\n\t\trawTransitions,\n\t\toptions.minSupport ?? 3,\n\t\toptions.minConfidence ?? 0.2,\n\t);\n\n\tconst paths = extractPaths(\n\t\tcliSessions,\n\t\toptions.minPathLength ?? 2,\n\t\toptions.maxPathLength ?? 6,\n\t);\n\tconst workflows = clusterIntoWorkflows(paths, cli, {\n\t\tminSupport: options.minSupport ?? 3,\n\t});\n\n\tconst suggestions = suggestSkills(workflows, stats);\n\n\tconst cliEntries = entries.filter(e => e.argv[0] === cli);\n\tconst activity = computeActivity(cliEntries);\n\n\treturn {\n\t\tcli,\n\t\tstats,\n\t\ttransitions,\n\t\tworkflows,\n\t\tsuggestions,\n\t\tsessionsAnalyzed: cliSessions.length,\n\t\tactivity,\n\t};\n}\n"
|
|
16
16
|
],
|
|
17
|
-
"mappings": ";AAEA,eAAsB,eAAe,CAAC,MAA+B;AAAA,EACpE,OAAO,MAAM,IAAI,KAAK,IAAI,EAAE,KAAK;AAAA;AAG3B,SAAS,mBAAmB,CAAC,MAA4D;AAAA,EAC/F,MAAM,gBAAgB,KAAK,MAAM;AAAA,CAAI,EAAE,KAAK,OAAK,EAAE,KAAK,EAAE,SAAS,CAAC;AAAA,EACpE,IAAI,CAAC;AAAA,IAAe,OAAO;AAAA,EAC3B,IAAI,cAAc,KAAK,aAAa;AAAA,IAAG,OAAO;AAAA,EAC9C,IAAI,WAAW,KAAK,aAAa;AAAA,IAAG,OAAO;AAAA,EAC3C,OAAO;AAAA;AAGD,SAAS,YAAY,CAAC,MAA8B;AAAA,EAC1D,MAAM,SAAS,oBAAoB,IAAI;AAAA,EACvC,QAAQ;AAAA,SACF;AAAA,MACJ,OAAO,iBAAiB,IAAI;AAAA,SACxB;AAAA,MACJ,OAAO,iBAAiB,IAAI;AAAA,SACxB;AAAA;AAAA,MAEJ,OAAO,iBAAiB,IAAI;AAAA;AAAA;AAI/B,SAAS,gBAAgB,CAAC,MAA8B;AAAA,EACvD,MAAM,UAA0B,CAAC;AAAA,EACjC,MAAM,QAAQ,KAAK,MAAM;AAAA,CAAI;AAAA,EAE7B,IAAI,UAAqD;AAAA,EAEzD,WAAW,WAAW,OAAO;AAAA,IAC5B,MAAM,QAAQ,QAAQ,MAAM,oBAAoB;AAAA,IAChD,IAAI,OAAO;AAAA,MACV,IAAI,SAAS;AAAA,QACZ,QAAQ,KAAK,WAAW,QAAQ,WAAW,QAAQ,GAAG,CAAC;AAAA,MACxD;AAAA,MACA,UAAU,EAAE,WAAW,OAAO,SAAS,MAAM,IAAK,EAAE,GAAG,KAAK,MAAM,GAAI;AAAA,IACvE,EAAO,SAAI,SAAS;AAAA,MACnB,QAAQ,OAAO;AAAA,IAAO;AAAA,IACvB;AAAA,EACD;AAAA,EAEA,IAAI,SAAS;AAAA,IACZ,QAAQ,KAAK,WAAW,QAAQ,WAAW,QAAQ,GAAG,CAAC;AAAA,EACxD;AAAA,EAEA,OAAO,QAAQ,OAAO,OAAK,EAAE,KAAK,SAAS,CAAC;AAAA;AAG7C,SAAS,gBAAgB,CAAC,MAA8B;AAAA,EACvD,MAAM,UAA0B,CAAC;AAAA,EACjC,MAAM,QAAQ,KAAK,MAAM;AAAA,CAAI;AAAA,EAC7B,IAAI,mBAAmB;AAAA,EAEvB,WAAW,QAAQ,OAAO;AAAA,IACzB,MAAM,UAAU,KAAK,KAAK;AAAA,IAC1B,IAAI,CAAC;AAAA,MAAS;AAAA,IAEd,IAAI,SAAS,KAAK,OAAO,GAAG;AAAA,MAC3B,mBAAmB,OAAO,SAAS,QAAQ,MAAM,CAAC,GAAG,EAAE;AAAA,MACvD;AAAA,IACD;AAAA,IAEA,QAAQ,KAAK,WAAW,kBAAkB,OAAO,CAAC;AAAA,EACnD;AAAA,EAEA,OAAO,QAAQ,OAAO,OAAK,EAAE,KAAK,SAAS,CAAC;AAAA;AAG7C,SAAS,gBAAgB,CAAC,MAA8B;AAAA,EACvD,MAAM,UAA0B,CAAC;AAAA,EACjC,MAAM,SAAS,KAAK,MAAM,eAAe;AAAA,EAEzC,WAAW,SAAS,QAAQ;AAAA,IAC3B,MAAM,WAAW,MAAM,MAAM,aAAa;AAAA,IAC1C,MAAM,YAAY,MAAM,MAAM,aAAa;AAAA,IAC3C,IAAI,CAAC;AAAA,MAAU;AAAA,IACf,MAAM,YAAY,YAAY,OAAO,SAAS,UAAU,IAAK,EAAE,IAAI;AAAA,IACnE,QAAQ,KAAK,WAAW,WAAW,SAAS,EAAG,CAAC;AAAA,EACjD;AAAA,EAEA,OAAO,QAAQ,OAAO,OAAK,EAAE,KAAK,SAAS,CAAC;AAAA;AAG7C,SAAS,UAAU,CAAC,WAAmB,QAA8B;AAAA,EACpE,MAAM,UAAU,mBAAmB,MAAM,EAAE,KAAK;AAAA,EAChD,MAAM,OAAO,SAAS,OAAO;AAAA,EAC7B,OAAO,EAAE,WAAW,KAAK,SAAS,KAAK;AAAA;AAGxC,SAAS,kBAAkB,CAAC,KAAqB;AAAA,EAChD,OAAO,IAAI,QAAQ,SAAS,GAAG,EAAE,QAAQ,UAAU,GAAG;AAAA;AAGhD,SAAS,QAAQ,CAAC,KAAuB;AAAA,EAC/C,MAAM,SAAmB,CAAC;AAAA,EAC1B,IAAI,UAAU;AAAA,EACd,IAAI,WAAW;AAAA,EACf,IAAI,WAAW;AAAA,EACf,IAAI,SAAS;AAAA,EAEb,SAAS,IAAI,EAAG,IAAI,IAAI,QAAQ,KAAK;AAAA,IACpC,MAAM,KAAK,IAAI;AAAA,IACf,IAAI,QAAQ;AAAA,MACX,WAAW;AAAA,MACX,SAAS;AAAA,MACT;AAAA,IACD;AAAA,IACA,IAAI,OAAO,QAAQ,CAAC,UAAU;AAAA,MAC7B,SAAS;AAAA,MACT;AAAA,IACD;AAAA,IACA,IAAI,OAAO,OAAO,CAAC,UAAU;AAAA,MAC5B,WAAW,CAAC;AAAA,MACZ;AAAA,IACD;AAAA,IACA,IAAI,OAAO,OAAO,CAAC,UAAU;AAAA,MAC5B,WAAW,CAAC;AAAA,MACZ;AAAA,IACD;AAAA,IACA,IAAI,KAAK,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,UAAU;AAAA,MAC5C,IAAI,SAAS;AAAA,QACZ,OAAO,KAAK,OAAO;AAAA,QACnB,UAAU;AAAA,MACX;AAAA,MACA;AAAA,IACD;AAAA,IACA,KAAK,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ,CAAC,YAAY,CAAC,UAAU;AAAA,MACvE,IAAI,SAAS;AAAA,QACZ,OAAO,KAAK,OAAO;AAAA,QACnB,UAAU;AAAA,MACX;AAAA,MACA,OAAO;AAAA,IACR;AAAA,IACA,WAAW;AAAA,EACZ;AAAA,EAEA,IAAI;AAAA,IAAS,OAAO,KAAK,OAAO;AAAA,EAChC,OAAO;AAAA;AAGD,SAAS,kBAAkB,GAAkB;AAAA,EACnD,MAAM,OAAO,QAAQ,IAAI,QAAQ;AAAA,EACjC,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAElB,MAAM,aAAa;AAAA,IAClB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACJ;AAAA,EAEA,OAAO,WAAW,MAAM;AAAA;;;ACxJlB,SAAS,eAAe,CAAC,SAAyB,aAAa,IAAe;AAAA,EACpF,IAAI,QAAQ,WAAW;AAAA,IAAG,OAAO,CAAC;AAAA,EAElC,MAAM,SAAS,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,EACpE,MAAM,aAAa,aAAa;AAAA,EAChC,MAAM,WAAsB,CAAC;AAAA,EAE7B,IAAI,UAA0B,CAAC,OAAO,EAAG;AAAA,EACzC,IAAI,eAAe,OAAO,GAAI;AAAA,EAC9B,IAAI,gBAAgB,OAAO,GAAI;AAAA,EAE/B,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,IACvC,MAAM,QAAQ,OAAO;AAAA,IACrB,MAAM,MAAM,MAAM,YAAY;AAAA,IAE9B,IAAI,MAAM,YAAY;AAAA,MACrB,SAAS,KAAK,EAAE,OAAO,cAAc,KAAK,eAAe,SAAS,QAAQ,CAAC;AAAA,MAC3E,UAAU,CAAC,KAAK;AAAA,MAChB,eAAe,MAAM;AAAA,IACtB,EAAO;AAAA,MACN,QAAQ,KAAK,KAAK;AAAA;AAAA,IAEnB,gBAAgB,MAAM;AAAA,EACvB;AAAA,EAEA,SAAS,KAAK,EAAE,OAAO,cAAc,KAAK,eAAe,SAAS,QAAQ,CAAC;AAAA,EAC3E,OAAO;AAAA;AAGD,SAAS,WAAW,CAAC,UAAqB,KAAwB;AAAA,EACxE,OAAO,SACL,IAAI,cAAY;AAAA,OACb;AAAA,IACH,SAAS,QAAQ,QAAQ,OAAO,OAAK,EAAE,KAAK,OAAO,GAAG;AAAA,EACvD,EAAE,EACD,OAAO,OAAK,EAAE,QAAQ,SAAS,CAAC;AAAA;;;ACnC5B,SAAS,iBAAiB,CAAC,OAA6B;AAAA,EAC9D,YAAY,QAAQ,MAAM;AAAA,EAC1B,MAAM,MAAM,KAAK,KAAK,SAAO,CAAC,IAAI,WAAW,GAAG,KAAK,CAAC,IAAI,WAAW,GAAG,KAAK,UAAU,KAAK,GAAG,CAAC;AAAA,EAChG,OAAO,OAAO;AAAA;AAGR,SAAS,qBAAqB,CAAC,OAAqB,WAAW,GAAa;AAAA,EAClF,YAAY,QAAQ,MAAM;AAAA,EAC1B,MAAM,OAAiB,CAAC;AAAA,EACxB,WAAW,OAAO,MAAM;AAAA,IACvB,IAAI,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,GAAG;AAAA,MAAG;AAAA,IAChD,IAAI,CAAC,UAAU,KAAK,GAAG;AAAA,MAAG;AAAA,IAC1B,KAAK,KAAK,GAAG;AAAA,IACb,IAAI,KAAK,UAAU;AAAA,MAAU;AAAA,EAC9B;AAAA,EACA,OAAO;AAAA;AAGD,SAAS,gBAAgB,CAAC,UAAuD;AAAA,EACvF,MAAM,cAAc,IAAI;AAAA,EAExB,WAAW,WAAW,UAAU;AAAA,IAC/B,SAAS,IAAI,EAAG,IAAI,QAAQ,QAAQ,SAAS,GAAG,KAAK;AAAA,MACpD,MAAM,OAAO,kBAAkB,QAAQ,QAAQ,EAAG;AAAA,MAClD,MAAM,KAAK,kBAAkB,QAAQ,QAAQ,IAAI,EAAG;AAAA,MAEpD,IAAI,CAAC,YAAY,IAAI,IAAI;AAAA,QAAG,YAAY,IAAI,MAAM,IAAI,GAAK;AAAA,MAC3D,MAAM,QAAQ,YAAY,IAAI,IAAI;AAAA,MAClC,MAAM,IAAI,KAAK,MAAM,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,IACvC;AAAA,EACD;AAAA,EAEA,OAAO;AAAA;AAGD,SAAS,oBAAoB,CACnC,KACA,aAAa,GACb,gBAAgB,KACD;AAAA,EACf,MAAM,UAAwB,CAAC;AAAA,EAE/B,YAAY,MAAM,UAAU,IAAI,QAAQ,GAAG;AAAA,IAC1C,MAAM,QAAQ,MAAM,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAAA,IAClE,IAAI,QAAQ;AAAA,MAAY;AAAA,IAExB,YAAY,IAAI,UAAU,MAAM,QAAQ,GAAG;AAAA,MAC1C,IAAI,QAAQ;AAAA,QAAY;AAAA,MACxB,MAAM,aAAa,QAAQ;AAAA,MAC3B,IAAI,aAAa;AAAA,QAAe;AAAA,MAChC,QAAQ,KAAK,EAAE,MAAM,IAAI,OAAO,WAAW,CAAC;AAAA,IAC7C;AAAA,EACD;AAAA,EAEA,OAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA;;;AC/CzC,SAAS,YAAY,CAC3B,UACA,YAAY,GACZ,YAAY,GACI;AAAA,EAChB,MAAM,aAAa,IAAI;AAAA,EAEvB,WAAW,WAAW,UAAU;AAAA,IAC/B,MAAM,cAAc,QAAQ,QAAQ,IAAI,iBAAiB;AAAA,IACzD,MAAM,qBAAqB,kBAAkB,WAAW;AAAA,IAExD,SAAS,QAAQ,EAAG,QAAQ,mBAAmB,QAAQ,SAAS;AAAA,MAC/D,MAAM,SAAS,KAAK,IAAI,QAAQ,WAAW,mBAAmB,MAAM;AAAA,MACpE,SAAS,MAAM,QAAQ,UAAW,OAAO,QAAQ,OAAO;AAAA,QACvD,MAAM,QAAQ,mBAAmB,MAAM,OAAO,GAAG;AAAA,QACjD,MAAM,MAAM,MAAM,KAAK,KAAI;AAAA,QAC3B,MAAM,WAAW,WAAW,IAAI,GAAG;AAAA,QACnC,IAAI,UAAU;AAAA,UACb,SAAS,SAAS;AAAA,QACnB,EAAO;AAAA,UACN,WAAW,IAAI,KAAK,EAAE,MAAM,OAAO,OAAO,EAAE,CAAC;AAAA;AAAA,MAE/C;AAAA,IACD;AAAA,EACD;AAAA,EAEA,OAAO,MAAM,KAAK,WAAW,QAAQ,CAAC,EACpC,IAAI,EAAE,aAAa,MAAM,cAAc;AAAA,IACvC;AAAA,IACA;AAAA,IACA,aAAa;AAAA,EACd,EAAE,EACD,KAAK,CAAC,GAAG,MAAM;AAAA,IACf,IAAI,EAAE,gBAAgB,EAAE;AAAA,MAAa,OAAO,EAAE,cAAc,EAAE;AAAA,IAC9D,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK;AAAA,GAC9B;AAAA;AAGI,SAAS,oBAAoB,CACnC,UACA,KACA,UAAkD,CAAC,GACjC;AAAA,EAClB,MAAM,aAAa,QAAQ,cAAc;AAAA,EACzC,MAAM,OAAO,QAAQ,QAAQ;AAAA,EAE7B,MAAM,WAAW,SAAS,OAAO,OAAK,EAAE,eAAe,UAAU;AAAA,EACjE,MAAM,UAAU,eAAe,QAAQ;AAAA,EAEvC,MAAM,mBAAmB,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,aAAa,CAAC,KAAK;AAAA,EAEhF,OAAO,QAAQ,MAAM,GAAG,IAAI,EAAE,IAAI,cAAY;AAAA,IAC7C,MAAM,QAAQ,KAAK,KAAK,GAAG;AAAA,IAC3B;AAAA,IACA,MAAM,CAAC,QAAQ,IAAI;AAAA,IACnB,SAAS,QAAQ;AAAA,IACjB,YAAY,QAAQ,cAAc;AAAA,IAClC,QAAQ;AAAA,EACT,EAAE;AAAA;AAGH,SAAS,iBAAiB,CAAC,OAA2B;AAAA,EACrD,MAAM,SAAmB,CAAC;AAAA,EAC1B,WAAW,QAAQ,OAAO;AAAA,IACzB,IAAI,OAAO,WAAW,KAAK,OAAO,OAAO,SAAS,OAAO,MAAM;AAAA,MAC9D,OAAO,KAAK,IAAI;AAAA,IACjB;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,cAAc,CAAC,UAAwC;AAAA,EAC/D,MAAM,iBAAiB,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,MAAM;AAAA,EACjF,MAAM,OAAsB,CAAC;AAAA,EAE7B,WAAW,WAAW,gBAAgB;AAAA,IACrC,MAAM,MAAM,QAAQ;AAAA,IACpB,MAAM,mBAAmB,KAAK,KAAK,OAClC,EAAE,UAAU,SAAS,GAAG,KAAK,EAAE,eAAe,QAAQ,cAAc,GACrE;AAAA,IACA,IAAI,CAAC,kBAAkB;AAAA,MACtB,KAAK,KAAK,OAAO;AAAA,IAClB;AAAA,EACD;AAAA,EAEA,OAAO,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW;AAAA;;;AC3FlD,SAAS,YAAY,CAAC,SAAyB,UAAqB,KAA4B;AAAA,EACtG,MAAM,aAAa,QAAQ,OAAO,OAAK,EAAE,KAAK,OAAO,GAAG;AAAA,EACxD,MAAM,cAAc,SAAS,OAAO,OAAK,EAAE,QAAQ,KAAK,OAAK,EAAE,KAAK,OAAO,GAAG,CAAC;AAAA,EAE/E,MAAM,mBAAmB,IAAI;AAAA,EAC7B,MAAM,aAAa,IAAI;AAAA,EAEvB,WAAW,SAAS,YAAY;AAAA,IAC/B,MAAM,MAAM,kBAAkB,KAAK;AAAA,IACnC,iBAAiB,IAAI,MAAM,iBAAiB,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,IAE9D,WAAW,OAAO,MAAM,KAAK,MAAM,CAAC,GAAG;AAAA,MACtC,IAAI,IAAI,WAAW,IAAI,GAAG;AAAA,QACzB,MAAM,OAAO,IAAI,MAAM,GAAG,EAAE;AAAA,QAC5B,WAAW,IAAI,OAAO,WAAW,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,MACrD,EAAO,SAAI,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,GAAG;AAAA,QACnD,WAAW,IAAI,MAAM,WAAW,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,MACnD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,iBAAiB,MAAM,KAAK,iBAAiB,QAAQ,CAAC,EAC1D,IAAI,EAAE,YAAY,YAAY,EAAE,YAAY,MAAM,EAAE,EACpD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,EAAE;AAAA,EAEb,MAAM,WAAW,MAAM,KAAK,WAAW,QAAQ,CAAC,EAC9C,IAAI,EAAE,MAAM,YAAY,EAAE,MAAM,MAAM,EAAE,EACxC,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,EAAE;AAAA,EAEb,OAAO;AAAA,IACN;AAAA,IACA,kBAAkB,WAAW;AAAA,IAC7B,mBAAmB,iBAAiB;AAAA,IACpC;AAAA,IACA;AAAA,IACA,cAAc,YAAY;AAAA,EAC3B;AAAA;;;AC7BM,SAAS,aAAa,CAC5B,WACA,OACoB;AAAA,EACpB,MAAM,cAAiC,CAAC;AAAA,EAExC,WAAW,MAAM,WAAW;AAAA,IAC3B,MAAM,OAAO,GAAG,KAAK,MAAM,CAAC;AAAA,IAC5B,IAAI,KAAK,SAAS;AAAA,MAAG;AAAA,IAErB,MAAM,aAAa,qBAAqB,IAAI,KAAK;AAAA,IACjD,IAAI;AAAA,MAAY,YAAY,KAAK,UAAU;AAAA,EAC5C;AAAA,EAEA,OAAO,YAAY,KAAK,CAAC,GAAG,MAAM;AAAA,IACjC,MAAM,gBAAgB,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AAAA,IACnD,IAAI,cAAc,EAAE,cAAc,cAAc,EAAE,WAAW;AAAA,MAC5D,OAAO,cAAc,EAAE,YAAY,cAAc,EAAE;AAAA,IACpD;AAAA,IACA,OAAO,EAAE,YAAY,EAAE;AAAA,GACvB;AAAA;AAGF,SAAS,oBAAoB,CAAC,IAAmB,OAA8C;AAAA,EAC9F,MAAM,OAAO,GAAG,KAAK,MAAM,CAAC;AAAA,EAC5B,IAAI,KAAK,SAAS;AAAA,IAAG,OAAO;AAAA,EAE5B,MAAM,WAAW,KAAK,IAAI,SAAO,GAAG,GAAG,OAAO,KAAK;AAAA,EACnD,MAAM,YAAY,GAAG;AAAA,EAErB,MAAM,WAAW,cAAc,WAAW,KAAK,QAAQ,MAAM,gBAAgB;AAAA,EAE7E,MAAM,OAAO,kBAAkB,GAAG,KAAK,IAAI;AAAA,EAC3C,MAAM,cAAc,oBAAoB,GAAG,KAAK,IAAI;AAAA,EACpD,MAAM,SAAS,eAAe,WAAW,MAAM,KAAK;AAAA,EAEpD,OAAO,EAAE,MAAM,aAAa,KAAK,GAAG,KAAK,UAAU,WAAW,QAAQ,SAAS;AAAA;AAGhF,SAAS,aAAa,CAAC,WAAmB,YAAoB,kBAAqD;AAAA,EAClH,MAAM,QAAQ,YAAY;AAAA,EAC1B,MAAM,QAAQ,YAAY,cAAc,QAAQ;AAAA,EAEhD,IAAI,QAAQ;AAAA,IAAI,OAAO;AAAA,EACvB,IAAI,QAAQ;AAAA,IAAI,OAAO;AAAA,EACvB,OAAO;AAAA;AAGR,SAAS,iBAAiB,CAAC,KAAa,MAAwB;AAAA,EAC/D,MAAM,gBAAwC;AAAA,IAC7C,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,eAAe;AAAA,IACf,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,cAAc;AAAA,IACd,aAAa;AAAA,IACb,mBAAmB;AAAA,EACpB;AAAA,EAEA,MAAM,MAAM,KAAK,KAAK,GAAG;AAAA,EACzB,IAAI,cAAc;AAAA,IAAM,OAAO,cAAc;AAAA,EAE7C,OAAO,KAAK,KAAK,GAAG;AAAA;AAGrB,SAAS,mBAAmB,CAAC,KAAa,MAAwB;AAAA,EACjE,OAAO,OAAO,OAAO,KAAK,KAAK,SAAS;AAAA;AAGzC,SAAS,cAAc,CAAC,WAAmB,MAAgB,OAA8B;AAAA,EACxF,MAAM,QAAQ,YAAY,MAAM;AAAA,EAChC,MAAM,OAAO,QAAQ,KAAK,QAAQ,CAAC;AAAA,EAEnC,IAAI,QAAQ,KAAK;AAAA,IAChB,OAAO,+BAA+B,oBAAoB,oBAAoB,MAAM;AAAA,EACrF;AAAA,EACA,IAAI,aAAa,IAAI;AAAA,IACpB,OAAO,+BAA+B;AAAA,EACvC;AAAA,EACA,IAAI,aAAa,IAAI;AAAA,IACpB,OAAO,+BAA+B;AAAA,EACvC;AAAA,EACA,OAAO,YAAY;AAAA;;;ACvFb,SAAS,mBAAmB,CAAC,OAAsB,aAAgC;AAAA,EACzF,MAAM,OAAO,MAAM,KAAK,MAAM,CAAC;AAAA,EAC/B,MAAM,QAAQ,KAAK,KAAK,KAAI;AAAA,EAC5B,MAAM,OAAO,eAAe,MAAM;AAAA,EAElC,MAAM,QAAQ,KAAK,IAAI,CAAC,KAAK,SAAS;AAAA,IACrC,IAAI,IAAI;AAAA,IACR,SAAS,CAAC,MAAM,KAAK,GAAG;AAAA,IACxB,OAAO;AAAA,EACR,EAAE;AAAA,EAEF,MAAM,QAAQ,CAAC;AAAA,EACf,SAAS,IAAI,EAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AAAA,IAC1C,MAAM,KAAK,EAAE,MAAM,MAAM,GAAI,IAAI,IAAI,MAAM,IAAI,GAAI,GAAG,CAAC;AAAA,EACxD;AAAA,EAEA,OAAO;AAAA,IACN,MAAM;AAAA,IACN,aAAa,QAAQ;AAAA,IACrB,KAAK,MAAM;AAAA,IACX;AAAA,IACA;AAAA,EACD;AAAA;;;ACTM,SAAS,eAAe,CAAC,SAAyB,MAAY,IAAI,MAAyB;AAAA,EACjG,MAAM,YAAY,IAAI,MAAM,EAAE,EAAE,KAAK,CAAC;AAAA,EACtC,MAAM,YAAY,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC;AAAA,EACrC,MAAM,aAAa,IAAI,MAAM,EAAE,EAAE,KAAK,CAAC;AAAA,EACvC,MAAM,cAAc,IAAI,MAAM,EAAE,EAAE,KAAK,CAAC;AAAA,EAExC,IAAI,QAAQ;AAAA,EACZ,IAAI,OAAO;AAAA,EACX,IAAI,QAAQ;AAAA,EAEZ,MAAM,QAAQ,IAAI,QAAQ;AAAA,EAC1B,MAAM,QAAQ,KAAK,KAAK,KAAK;AAAA,EAC7B,MAAM,SAAS,IAAI;AAAA,EAEnB,MAAM,eAAe,IAAI;AAAA,EAEzB,WAAW,SAAS,SAAS;AAAA,IAC5B,IAAI,CAAC,MAAM,aAAa,MAAM,aAAa;AAAA,MAAG;AAAA,IAE9C,SAAS;AAAA,IACT,IAAI,MAAM,YAAY;AAAA,MAAO,QAAQ,MAAM;AAAA,IAC3C,IAAI,MAAM,YAAY;AAAA,MAAM,OAAO,MAAM;AAAA,IAEzC,MAAM,OAAO,IAAI,KAAK,MAAM,YAAY,IAAI;AAAA,IAC5C,UAAU,KAAK,SAAS,MAAM;AAAA,IAC9B,UAAU,KAAK,OAAO,MAAM;AAAA,IAE5B,MAAM,SAAS,KAAK,MAAM,KAAK,QAAQ,IAAI,KAAK;AAAA,IAChD,aAAa,IAAI,MAAM;AAAA,IAEvB,MAAM,UAAU,KAAK,OAAO,QAAQ,KAAK,QAAQ,KAAK,KAAK;AAAA,IAC3D,IAAI,WAAW,KAAK,UAAU,IAAI;AAAA,MAEjC,WAAW,KAAK,YAAY;AAAA,IAC7B;AAAA,IAEA,MAAM,WAAW,KAAK,OAAO,QAAQ,KAAK,QAAQ,KAAK,MAAM;AAAA,IAC7D,IAAI,YAAY,KAAK,WAAW,IAAI;AAAA,MAEnC,YAAY,KAAK,aAAa;AAAA,IAC/B;AAAA,EACD;AAAA,EAEA,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,UAAU,WAAW,IAAI;AAAA,IACpC,UAAU;AAAA,IACV,kBAAkB,aAAa;AAAA,EAChC;AAAA;AAGM,SAAS,eAAe,CAAC,WAAmB,UAA0B;AAAA,EAC5E,IAAI,CAAC,aAAa,CAAC;AAAA,IAAU,OAAO;AAAA,EACpC,MAAM,QAAQ,IAAI,KAAK,YAAY,IAAI;AAAA,EACvC,MAAM,OAAO,IAAI,KAAK,WAAW,IAAI;AAAA,EACrC,MAAM,OAAO,KAAK,OAAO,KAAK,QAAQ,IAAI,MAAM,QAAQ,MAAM,KAAK,KAAK,KAAK,KAAK;AAAA,EAClF,IAAI,OAAO;AAAA,IAAG,OAAO;AAAA,EACrB,IAAI,OAAO;AAAA,IAAI,OAAO,GAAG;AAAA,EACzB,IAAI,OAAO;AAAA,IAAK,OAAO,GAAG,KAAK,MAAM,OAAO,EAAE;AAAA,EAC9C,OAAO,IAAI,OAAO,KAAK,QAAQ,CAAC;AAAA;;;AC/EjC,IAAM,SAAS,CAAC,KAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAU9C,SAAS,SAAS,CAAC,MAAgB,OAAyB,CAAC,GAAW;AAAA,EAC9E,IAAI,KAAK,WAAW;AAAA,IAAG,OAAO;AAAA,EAC9B,MAAM,OAAO,KAAK,QAAQ;AAAA,EAC1B,MAAM,MAAM,KAAK,IAAI,GAAG,IAAI;AAAA,EAC5B,IAAI,QAAQ;AAAA,IAAG,OAAO,KAAK,OAAO,KAAK,MAAM;AAAA,EAE7C,OAAO,KACL,IAAI,WAAS;AAAA,IACb,IAAI,UAAU;AAAA,MAAG,OAAO;AAAA,IACxB,MAAM,MAAM,KAAK,IAChB,OAAO,SAAS,GAChB,KAAK,IAAI,GAAG,KAAK,MAAO,QAAQ,OAAQ,OAAO,SAAS,EAAE,CAAC,CAC5D;AAAA,IACA,OAAO,OAAO;AAAA,GACd,EACA,KAAK,EAAE;AAAA;AAMH,SAAS,gBAAgB,CAAC,OAAe,MAAgB,aAAa,GAAW;AAAA,EACvF,OAAO,GAAG,MAAM,OAAO,UAAU,KAAK,UAAU,IAAI;AAAA;;;ACHrD,IAAM,iBAAiB,IAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;AAED,SAAS,WAAW,CAAC,OAAqB,QAA0C;AAAA,EACnF,OAAO,QAAQ,QAAQ,MAAM;AAAA,EAC7B,IAAI,CAAC;AAAA,IAAK,OAAO;AAAA,EAGjB,IAAI,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,KAAK,KAAK,IAAI,WAAW,GAAG;AAAA,IAAG,OAAO;AAAA,EAGxG,IAAI,CAAC,mBAAmB,KAAK,GAAG;AAAA,IAAG,OAAO;AAAA,EAE1C,IAAI,OAAO,IAAI,GAAG;AAAA,IAAG,OAAO;AAAA,EAE5B,MAAM,MACL,KAAK,KAAK,SAAO,CAAC,IAAI,WAAW,GAAG,KAAK,CAAC,IAAI,WAAW,GAAG,KAAK,UAAU,KAAK,GAAG,CAAC,KAAK;AAAA,EAC1F,OAAO,EAAE,KAAK,KAAK,YAAY,IAAI;AAAA;AAGpC,SAAS,kBAAiB,CAAC,OAAuC;AAAA,EACjE,MAAM,MAAsB,CAAC;AAAA,EAC7B,WAAW,KAAK,OAAO;AAAA,IACtB,MAAM,OAAO,IAAI,IAAI,SAAS;AAAA,IAC9B,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,OAAO,KAAK,eAAe,EAAE,YAAY;AAAA,MACpE,IAAI,KAAK,CAAC;AAAA,IACX;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,OAAO,CAAC,MAA4B;AAAA,EAC5C,OAAO,GAAG,KAAK,OAAO,KAAK;AAAA;AAG5B,SAAS,aAAa,CAAC,MAA8B;AAAA,EACpD,OAAO,KAAK,IAAI,OAAO,EAAE,KAAK,KAAI;AAAA;AAGnC,SAAS,iBAAiB,CAAC,MAA8B;AAAA,EACxD,OAAO,IAAI,IAAI,KAAK,IAAI,OAAK,EAAE,GAAG,CAAC,EAAE;AAAA;AAStC,eAAsB,YAAY,CAAC,UAA2B,CAAC,GAA4B;AAAA,EAC1F,MAAM,OAAO,QAAQ,eAAe,mBAAmB;AAAA,EACvD,IAAI,CAAC,MAAM;AAAA,IACV,MAAM,IAAI,MAAM,sEAAsE;AAAA,EACvF;AAAA,EAEA,MAAM,OAAO,MAAM,gBAAgB,IAAI;AAAA,EACvC,MAAM,UAAU,aAAa,IAAI;AAAA,EACjC,MAAM,WAAW,gBAAgB,SAAS,QAAQ,qBAAqB,EAAE;AAAA,EAEzE,MAAM,SAAS,IAAI,IAAI,QAAQ,cAAc,MAAM,KAAK,cAAc,CAAC;AAAA,EACvE,MAAM,UAAU,QAAQ,eAAe,QAAQ,YAAY,SAAS,IAAI,IAAI,IAAI,QAAQ,WAAW,IAAI;AAAA,EAEvG,MAAM,aAAa,QAAQ,cAAc;AAAA,EACzC,MAAM,SAAS,QAAQ,iBAAiB;AAAA,EACxC,MAAM,SAAS,QAAQ,iBAAiB;AAAA,EACxC,MAAM,kBAAkB,QAAQ,mBAAmB;AAAA,EAEnD,MAAM,aAAa,IAAI;AAAA,EACvB,MAAM,eAAe,IAAI;AAAA,EACzB,IAAI,mBAAmB;AAAA,EAEvB,WAAW,WAAW,UAAU;AAAA,IAC/B,MAAM,QAAwB,CAAC;AAAA,IAC/B,WAAW,SAAS,QAAQ,SAAS;AAAA,MACpC,MAAM,OAAO,YAAY,OAAO,MAAM;AAAA,MACtC,IAAI,CAAC;AAAA,QAAM;AAAA,MACX,IAAI,WAAW,CAAC,QAAQ,IAAI,KAAK,GAAG;AAAA,QAAG;AAAA,MACvC,aAAa,IAAI,KAAK,GAAG;AAAA,MACzB,MAAM,KAAK,IAAI;AAAA,IAChB;AAAA,IAEA,MAAM,UAAU,mBAAkB,KAAK;AAAA,IACvC,IAAI,QAAQ,UAAU;AAAA,MAAG,oBAAoB,QAAQ,SAAS;AAAA,IAE9D,SAAS,QAAQ,EAAG,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACpD,MAAM,SAAS,KAAK,IAAI,QAAQ,QAAQ,QAAQ,MAAM;AAAA,MACtD,SAAS,MAAM,QAAQ,OAAQ,OAAO,QAAQ,OAAO;AAAA,QACpD,MAAM,QAAQ,QAAQ,MAAM,OAAO,GAAG;AAAA,QACtC,IAAI,kBAAkB,KAAK,IAAI;AAAA,UAAiB;AAAA,QAChD,MAAM,MAAM,cAAc,KAAK;AAAA,QAC/B,MAAM,WAAW,WAAW,IAAI,GAAG;AAAA,QACnC,IAAI,UAAU;AAAA,UACb,SAAS,SAAS;AAAA,QACnB,EAAO;AAAA,UACN,WAAW,IAAI,KAAK,EAAE,MAAM,OAAO,OAAO,EAAE,CAAC;AAAA;AAAA,MAE/C;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,WAAW,MAAM,KAAK,WAAW,QAAQ,CAAC,EAC9C,IAAI,EAAE,aAAa,aAAM,cAAc;AAAA,IACvC;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,YAAY,kBAAkB,KAAI;AAAA,EACnC,EAAE,EACD,OAAO,OAAK,EAAE,WAAW,UAAU,EACnC,KAAK,CAAC,GAAG,MAAM;AAAA,IAEf,IAAI,EAAE,eAAe,EAAE;AAAA,MAAY,OAAO,EAAE,aAAa,EAAE;AAAA,IAC3D,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK;AAAA,MAAQ,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK;AAAA,IACnE,OAAO,EAAE,UAAU,EAAE;AAAA,GACrB;AAAA,EAGF,MAAM,YAAgC,CAAC;AAAA,EACvC,WAAW,WAAW,UAAU;AAAA,IAC/B,MAAM,YAAY,UAAU,KAC3B,OAAK,EAAE,cAAc,QAAQ,aAAa,EAAE,UAAU,SAAS,QAAQ,SAAS,KAAK,EAAE,WAAW,QAAQ,UAAU,GACrH;AAAA,IACA,IAAI,CAAC,WAAW;AAAA,MACf,UAAU,KAAK;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,SAAS,QAAQ;AAAA,QACjB,WAAW,QAAQ;AAAA,QACnB,YAAY,QAAQ;AAAA,MACrB,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAEA,MAAM,OAAO,QAAQ,QAAQ;AAAA,EAE7B,OAAO;AAAA,IACN,WAAW,UAAU,MAAM,GAAG,IAAI;AAAA,IAClC,kBAAkB,SAAS;AAAA,IAC3B,cAAc,MAAM,KAAK,YAAY,EAAE,KAAK;AAAA,IAC5C;AAAA,EACD;AAAA;AAOM,SAAS,sBAAsB,CAAC,UAA4B;AAAA,EAClE,MAAM,QAAQ,SAAS,KAAK,IAAI,CAAC,MAAM,SAAS;AAAA,IAC/C,IAAI,IAAI;AAAA,IACR,SAAS,CAAC,KAAK,KAAK,KAAK,UAAU;AAAA,IACnC,OAAO,GAAG,KAAK,OAAO,KAAK;AAAA,EAC5B,EAAE;AAAA,EACF,MAAM,QAAQ,CAAC;AAAA,EACf,SAAS,IAAI,EAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AAAA,IAC1C,MAAM,KAAK,EAAE,MAAM,MAAM,GAAI,IAAI,IAAI,MAAM,IAAI,GAAI,GAAG,CAAC;AAAA,EACxD;AAAA,EACA,OAAO;AAAA,IACN,MAAM,SAAS;AAAA,IACf,aAAa,2BAA2B,SAAS,aAAY,SAAS;AAAA,IACtE,KAAK,SAAS,KAAK,IAAI,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,EACD;AAAA;;;ACzJD,eAAsB,OAAO,CAAC,KAAa,UAAuB,CAAC,GAAwB;AAAA,EAC1F,MAAM,OAAO,QAAQ,eAAe,mBAAmB;AAAA,EACvD,IAAI,CAAC,MAAM;AAAA,IACV,MAAM,IAAI,MAAM,sEAAsE;AAAA,EACvF;AAAA,EAEA,MAAM,OAAO,MAAM,gBAAgB,IAAI;AAAA,EACvC,MAAM,UAAU,aAAa,IAAI;AAAA,EACjC,MAAM,cAAc,gBAAgB,SAAS,QAAQ,qBAAqB,EAAE;AAAA,EAC5E,MAAM,cAAc,YAAY,aAAa,GAAG;AAAA,EAEhD,MAAM,QAAQ,aAAa,SAAS,aAAa,GAAG;AAAA,EAEpD,MAAM,iBAAiB,iBAAiB,WAAW;AAAA,EACnD,MAAM,cAAc,qBACnB,gBACA,QAAQ,cAAc,GACtB,QAAQ,iBAAiB,GAC1B;AAAA,EAEA,MAAM,QAAQ,aACb,aACA,QAAQ,iBAAiB,GACzB,QAAQ,iBAAiB,CAC1B;AAAA,EACA,MAAM,YAAY,qBAAqB,OAAO,KAAK;AAAA,IAClD,YAAY,QAAQ,cAAc;AAAA,EACnC,CAAC;AAAA,EAED,MAAM,cAAc,cAAc,WAAW,KAAK;AAAA,EAElD,MAAM,aAAa,QAAQ,OAAO,OAAK,EAAE,KAAK,OAAO,GAAG;AAAA,EACxD,MAAM,WAAW,gBAAgB,UAAU;AAAA,EAE3C,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,YAAY;AAAA,IAC9B;AAAA,EACD;AAAA;",
|
|
18
|
-
"debugId": "
|
|
17
|
+
"mappings": "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",
|
|
18
|
+
"debugId": "DFDEDB046E8023FA64756E2164756E21",
|
|
19
19
|
"names": []
|
|
20
20
|
}
|
package/dist/cli.js
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
mineCrossCli,
|
|
12
12
|
minedToFlowWorkflow,
|
|
13
13
|
sparkline
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-hnjjgt15.js";
|
|
15
15
|
import {
|
|
16
16
|
NullDelegate,
|
|
17
17
|
runArchaeology
|
|
@@ -615,7 +615,7 @@ function renderActivitySection(activity, C) {
|
|
|
615
615
|
const range = formatTimeRange(activity.firstSeen, activity.lastSeen);
|
|
616
616
|
console.log(` ${C.dim}Tracked over:${C.reset} ${C.cyan}${range}${C.reset} ${C.dim}(${activity.daysWithActivity} active days)${C.reset}`);
|
|
617
617
|
const hourSpark = sparkline(activity.hourOfDay);
|
|
618
|
-
console.log(` ${C.dim}Hour of day:${C.reset} ${C.cyan}${hourSpark}${C.reset} ${C.dim}0h
|
|
618
|
+
console.log(` ${C.dim}Hour of day:${C.reset} ${C.cyan}${hourSpark}${C.reset} ${C.dim}0h ── 23h${C.reset}`);
|
|
619
619
|
const dowMax = Math.max(...activity.dayOfWeek);
|
|
620
620
|
if (dowMax > 0) {
|
|
621
621
|
console.log(` ${C.dim}Day of week:${C.reset}`);
|
|
@@ -811,4 +811,4 @@ ${C.bold}${C.yellow}\uD83D\uDCA1 Skill suggestions:${C.reset}`);
|
|
|
811
811
|
}
|
|
812
812
|
}
|
|
813
813
|
|
|
814
|
-
//# debugId=
|
|
814
|
+
//# debugId=327F345E39F9947A64756E2164756E21
|
package/dist/cli.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cli.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"#!/usr/bin/env bun\nimport { parseHelpRecursive, parseHelp } from \"./parse\";\nimport { printTree, treeToString, treeToHtml } from \"./index\";\nimport type { TreeOptions } from \"./types\";\nimport { parseWorkflow, validateWorkflow, flowToAnsi, flowToString, flowToHtml } from \"./flow\";\nimport type { FlowRenderOptions } from \"./flow/types\";\nimport {\n\tmineCli,\n\tminedToFlowWorkflow,\n\tmineCrossCli,\n\tcrossCliToFlowWorkflow,\n\tsparkline,\n\tlabeledSparkline,\n\tformatTimeRange,\n} from \"./miner\";\nimport { runArchaeology, NullDelegate } from \"./archaeology\";\n\nconst args = process.argv.slice(2);\nconst subcommand = args[0];\n\nconst HELP_SUBCOMMANDS = new Set([\"flow\", \"mine\", \"archaeology\", \"safe-help\", \"cross\"]);\nconst isHelpFlag = args.includes(\"--help\") || args.includes(\"-h\");\n\nif (!subcommand || (isHelpFlag && !HELP_SUBCOMMANDS.has(subcommand ?? \"\"))) {\n\tprintMainHelp();\n\tprocess.exit(0);\n}\n\nif (isHelpFlag) {\n\tif (subcommand === \"flow\") printFlowHelp();\n\telse if (subcommand === \"mine\") printMineHelp();\n\telse if (subcommand === \"archaeology\") printArchaeologyHelp();\n\telse if (subcommand === \"safe-help\") printSafeHelpHelp();\n\telse if (subcommand === \"cross\") printCrossHelp();\n\telse printMainHelp();\n\tprocess.exit(0);\n}\n\nif (subcommand === \"flow\") {\n\tawait runFlow(args.slice(1));\n} else if (subcommand === \"mine\") {\n\tawait runMine(args.slice(1));\n} else if (subcommand === \"archaeology\") {\n\tawait runArchaeologyCmd(args.slice(1));\n} else if (subcommand === \"safe-help\") {\n\tawait runSafeHelp(args.slice(1));\n} else if (subcommand === \"cross\") {\n\tawait runCross(args.slice(1));\n} else {\n\tawait runTree(args);\n}\n\nfunction printMainHelp() {\n\tconsole.log(`\n clitree — Visualize and explore any CLI\n\n Usage:\n clitree <binary> [options] Render command tree from --help\n clitree flow <file> [options] Render a workflow YAML as a DAG\n clitree mine <binary> [options] Mine shell history for workflows\n clitree cross [options] Detect cross-CLI workflows (git + gh, docker + kubectl)\n clitree archaeology <binary> [options] Full analysis: tree + mining + (LLM)\n clitree safe-help <binary> [sub...] Fetch clean help for any CLI (no pager, no overstriking)\n\n Examples:\n clitree docker # basic tree\n clitree mine git # \"what workflows do I repeat with git?\"\n clitree cross # cross-CLI flows across your history\n clitree archaeology bun # tree + mining + LLM archaeology\n clitree safe-help git commit # avoid the git man-page pager trap\n\n Subcommands:\n tree Parse --help output (default; passing a binary name invokes this)\n flow Render a workflow YAML file as an ASCII DAG\n mine Discover workflows from your shell history (single CLI)\n cross Discover workflows that span multiple CLIs (e.g. git → gh)\n archaeology Run full analysis (tree + mine + LLM proposals when available)\n safe-help Return inline help for any CLI, handling pager/overstrike edge cases\n\n Help for a subcommand: clitree <subcommand> --help\n`);\n}\n\nfunction printCrossHelp() {\n\tconsole.log(`\n clitree cross — Mine cross-CLI workflows from your shell history\n\n Usage:\n clitree cross [options]\n\n This is mineCli's bigger sibling. Instead of filtering history to a single\n binary, it looks at every command in a session and finds sequences that weave\n between tools — e.g.:\n\n git push → gh pr create\n docker build → docker push → kubectl apply\n bun test → git commit → git push\n\n These patterns are invisible to 'clitree mine <cli>' because they cross boundaries.\n\n Examples:\n clitree cross # top 10 cross-CLI workflows\n clitree cross --top-k 5 # just the top 5\n clitree cross --only git,gh,docker # restrict to a set of CLIs\n clitree cross --format json # raw data\n\n Options:\n --top-k <n> Max workflows to return (default: 10)\n --min-support <n> Minimum occurrences (default: 3)\n --min-path-length <n> Minimum chain length (default: 2)\n --max-path-length <n> Maximum chain length (default: 5)\n --min-distinct-clis <n> Require at least this many distinct CLIs (default: 2)\n --only <csv> Whitelist: only include these CLIs (comma-separated)\n --format <fmt> ansi (default) or json\n --no-color Disable ANSI colors\n --no-flow Skip DAG rendering of the top workflow\n -h, --help Show this help\n`);\n}\n\nfunction printSafeHelpHelp() {\n\tconsole.log(`\n clitree safe-help — Fetch clean help output for any CLI\n\n Usage:\n clitree safe-help <binary> [subcommand...] [options]\n\n Why this exists:\n Running '<cli> --help' directly is a minefield on agents and scripts:\n - 'git commit --help' opens a pager in a TTY and hangs\n - Piping 'git <sub> --help' returns nroff with overstrike (ffiixxuupp)\n - Some CLIs use 'help <sub>' instead of '<sub> --help'\n - macOS man pages emit \\\\b sequences that need col -bx\n\n safe-help tries the right variants in order, cleans overstrikes, and\n returns plain text every time.\n\n Strategy (in order):\n 1. <cli> <sub> -h — short inline help\n 2. <cli> <sub> --help — long help (captured, overstrike-stripped)\n 3. <cli> help <sub> — alternate syntax\n 4. MANPAGER=cat man <cli>-<sub> | col -bx — final man fallback\n\n Examples:\n clitree safe-help git commit\n clitree safe-help docker run\n clitree safe-help kubectl get pods\n clitree safe-help bun install\n\n Options:\n --no-color Disable ANSI codes (auto-detects non-TTY)\n -h, --help Show this help\n`);\n}\n\nfunction printMineHelp() {\n\tconsole.log(`\n clitree mine — Mine your shell history for CLI workflows\n\n Usage:\n clitree mine <binary> [options]\n\n Examples:\n clitree mine git\n clitree mine git --top-k 3 # render top 3 workflows as DAGs\n clitree mine docker --min-support 5 --with-flow\n clitree mine bun --format json > bun-flows.json\n clitree mine git --no-color | tee report.txt\n clitree mine git --no-activity # skip temporal sparklines\n\n Options:\n --min-support <n> Minimum occurrences to count as a workflow (default: 3)\n --history-path <p> Custom shell history path (default: ~/.zsh_history)\n --format <fmt> Output format: ansi (default), json\n --max-paths <n> Max workflows to show in text list (default: 10)\n --top-k <n> Render top N workflows as DAGs (default: 1)\n --with-flow Include 2-step workflows in DAG rendering\n --no-flow Skip DAG rendering entirely\n --no-activity Skip hour/day/30-day activity sparklines\n --no-color Disable ANSI colors (also auto-disabled when stdout is not a TTY)\n -h, --help Show this help\n\n By default, the top 3+ step workflow is rendered as a DAG.\n --top-k bumps that to N distinct workflows stacked on top of each other.\n`);\n}\n\nfunction printArchaeologyHelp() {\n\tconsole.log(`\n clitree archaeology — Full CLI analysis: tree + mining + LLM archaeology\n\n Usage:\n clitree archaeology <binary> [options]\n\n When run from the command line without a delegate, only the deterministic\n phases run (help parsing + shell history mining). LLM archaeology requires\n running inside the clitree skill (see ./skill/SKILL.md).\n\n Examples:\n clitree archaeology git # help + history\n clitree archaeology docker --no-cache # bypass cache\n clitree archaeology bun --format json # JSON output\n\n Options:\n --no-cache Skip cache, always re-run\n --max-depth <n> Max --help recursion depth (default: 2)\n --format <fmt> Output format: ansi (default), json\n --no-color Disable ANSI colors (also auto-disabled when stdout is not a TTY)\n -h, --help Show this help\n`);\n}\n\nfunction printFlowHelp() {\n\tconsole.log(`\n cli-tree flow — Render a CLI workflow YAML as a DAG\n\n Usage:\n cli-tree flow <file> [options]\n\n Examples:\n cli-tree flow workflows/git-pr-flow.yml\n cli-tree flow my-workflow.yml --format html > flow.html\n cli-tree flow workflows/docker-deploy.yml --compact --no-color\n\n Options:\n --compact Hide description and legend\n --no-color Disable colors\n --format <fmt> Output format: ansi (default), string, html\n --no-validate Skip validation\n -h, --help Show this help\n`);\n}\n\nasync function runTree(args: string[]) {\n\tconst opts: TreeOptions = {\n\t\tcolor: true,\n\t\tshowFlags: true,\n\t\tshowArgs: true,\n\t\tshowDescriptions: true,\n\t\tshowTypes: true,\n\t\tshowDefaults: true,\n\t\tcompact: false,\n\t};\n\n\tlet depth = 2;\n\tlet format: \"ansi\" | \"string\" | \"html\" | \"json\" = \"ansi\";\n\tlet stdinName: string | null = null;\n\tlet binary: string | null = null;\n\n\topts.color = shouldUseColor(args);\n\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i]!;\n\t\tif (arg === \"--depth\" && args[i + 1]) {\n\t\t\tdepth = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--compact\") {\n\t\t\topts.compact = true;\n\t\t\topts.showDescriptions = false;\n\t\t} else if (arg === \"--no-flags\") {\n\t\t\topts.showFlags = false;\n\t\t} else if (arg === \"--no-args\") {\n\t\t\topts.showArgs = false;\n\t\t} else if (arg === \"--no-color\") {\n\t\t\topts.color = false;\n\t\t} else if (arg === \"--format\" && args[i + 1]) {\n\t\t\tformat = args[++i] as \"ansi\" | \"string\" | \"html\" | \"json\";\n\t\t} else if (arg === \"--stdin\" && args[i + 1]) {\n\t\t\tstdinName = args[++i]!;\n\t\t} else if (!arg.startsWith(\"-\")) {\n\t\t\tbinary = arg;\n\t\t}\n\t}\n\n\ttry {\n\t\tlet tree;\n\t\tif (stdinName) {\n\t\t\tconst input = await readStdin();\n\t\t\ttree = parseHelp(stdinName, input);\n\t\t} else if (binary) {\n\t\t\ttree = await parseHelpRecursive(binary, [], depth);\n\t\t} else {\n\t\t\tconsole.error(\"Error: provide a binary name or use --stdin <name>\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (format === \"json\") {\n\t\t\tconsole.log(JSON.stringify(tree, null, 2));\n\t\t} else if (format === \"html\") {\n\t\t\tconsole.log(treeToHtml(tree, opts));\n\t\t} else if (format === \"string\") {\n\t\t\tconsole.log(treeToString(tree, opts));\n\t\t} else {\n\t\t\tprintTree(tree, opts);\n\t\t}\n\t} catch (err: any) {\n\t\tconsole.error(`Error: ${err.message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function runFlow(args: string[]) {\n\tconst opts: FlowRenderOptions = {\n\t\tcolor: true,\n\t\tshowDescriptions: true,\n\t\tshowCommands: true,\n\t\tcompact: false,\n\t};\n\n\tlet format: \"ansi\" | \"string\" | \"html\" = \"ansi\";\n\tlet file: string | null = null;\n\tlet skipValidate = false;\n\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i]!;\n\t\tif (arg === \"--compact\") {\n\t\t\topts.compact = true;\n\t\t\topts.showDescriptions = false;\n\t\t} else if (arg === \"--no-color\") {\n\t\t\topts.color = false;\n\t\t} else if (arg === \"--no-validate\") {\n\t\t\tskipValidate = true;\n\t\t} else if (arg === \"--format\" && args[i + 1]) {\n\t\t\tformat = args[++i] as \"ansi\" | \"string\" | \"html\";\n\t\t} else if (!arg.startsWith(\"-\")) {\n\t\t\tfile = arg;\n\t\t}\n\t}\n\n\tif (!file) {\n\t\tconsole.error(\"Error: provide a workflow YAML file\");\n\t\tconsole.error(\"Run 'cli-tree flow --help' for usage\");\n\t\tprocess.exit(1);\n\t}\n\n\ttry {\n\t\tconst text = await Bun.file(file).text();\n\t\tconst workflow = parseWorkflow(text);\n\n\t\tif (!skipValidate) {\n\t\t\tconst result = validateWorkflow(workflow);\n\t\t\tfor (const err of result.errors) {\n\t\t\t\tconst prefix = err.severity === \"error\" ? \"\\x1b[31m✗\" : \"\\x1b[33m⚠\";\n\t\t\t\tconst reset = \"\\x1b[0m\";\n\t\t\t\tconst location = err.node ? ` [${err.node}]` : err.edge ? ` [${err.edge.from}→${err.edge.to}]` : \"\";\n\t\t\t\tconsole.error(`${prefix}${location} ${err.message}${reset}`);\n\t\t\t}\n\t\t\tif (!result.valid) process.exit(1);\n\t\t}\n\n\t\tif (format === \"html\") {\n\t\t\tconsole.log(flowToHtml(workflow, opts));\n\t\t} else if (format === \"string\") {\n\t\t\tconsole.log(flowToString(workflow, opts));\n\t\t} else {\n\t\t\tconsole.log(flowToAnsi(workflow, opts));\n\t\t}\n\t} catch (err: any) {\n\t\tconsole.error(`Error: ${err.message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function readStdin(): Promise<string> {\n\tconst chunks: Buffer[] = [];\n\tfor await (const chunk of process.stdin) {\n\t\tchunks.push(chunk as Buffer);\n\t}\n\treturn Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nfunction stripOverstrike(text: string): string {\n\t// Strip nroff bold via char\\bchar, underline via _\\bchar, and stray control chars.\n\t// This is what `col -bx` does.\n\treturn text\n\t\t.replace(/(.)\\b\\1/g, \"$1\")\n\t\t.replace(/_\\b(.)/g, \"$1\")\n\t\t.replace(/\\b/g, \"\")\n\t\t.replace(/\\x1b\\[[0-9;]*[a-zA-Z]/g, \"\");\n}\n\nfunction looksLikeHelp(text: string): boolean {\n\tif (!text.trim()) return false;\n\tif (text.length < 40) return false;\n\tconst firstChunk = text.slice(0, 200).toLowerCase();\n\t// Error messages from unknown subcommands or unsupported flags\n\tif (/(unknown|invalid|no such|not a \\w+ command|flag needs an argument|unrecognized)/.test(firstChunk)) {\n\t\treturn false;\n\t}\n\t// \"Run '... --help' for more information\" is a hint, not the help itself\n\tif (/run '.+' for more information/.test(firstChunk)) return false;\n\treturn true;\n}\n\nasync function tryHelpVariant(binary: string, argv: string[], timeoutMs = 5000): Promise<string | null> {\n\ttry {\n\t\tconst proc = Bun.spawn([binary, ...argv], {\n\t\t\tstdout: \"pipe\",\n\t\t\tstderr: \"pipe\",\n\t\t\tenv: { ...process.env, PAGER: \"cat\", MANPAGER: \"cat\", GIT_PAGER: \"cat\" },\n\t\t});\n\n\t\tconst timer = setTimeout(() => proc.kill(), timeoutMs);\n\n\t\tconst [stdout, stderr] = await Promise.all([\n\t\t\tnew Response(proc.stdout).text(),\n\t\t\tnew Response(proc.stderr).text(),\n\t\t]);\n\t\tclearTimeout(timer);\n\t\tawait proc.exited;\n\n\t\tconst combined = stdout || stderr;\n\t\tif (!looksLikeHelp(combined)) return null;\n\t\treturn stripOverstrike(combined);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function tryManPage(binary: string, subPath: string[], timeoutMs = 5000): Promise<string | null> {\n\t// Try 'man binary-sub' (git-commit), then 'man binary sub' as a fallback.\n\tconst candidates = [\n\t\tsubPath.length > 0 ? [`${binary}-${subPath.join(\"-\")}`] : [binary],\n\t\t[binary, ...subPath],\n\t];\n\n\tfor (const args of candidates) {\n\t\ttry {\n\t\t\tconst proc = Bun.spawn([\"man\", ...args], {\n\t\t\t\tstdout: \"pipe\",\n\t\t\t\tstderr: \"pipe\",\n\t\t\t\tenv: { ...process.env, MANPAGER: \"cat\", PAGER: \"cat\" },\n\t\t\t});\n\n\t\t\tconst timer = setTimeout(() => proc.kill(), timeoutMs);\n\t\t\tconst [stdout] = await Promise.all([\n\t\t\t\tnew Response(proc.stdout).text(),\n\t\t\t\tnew Response(proc.stderr).text(),\n\t\t\t]);\n\t\t\tclearTimeout(timer);\n\t\t\tawait proc.exited;\n\n\t\t\tif (looksLikeHelp(stdout)) return stripOverstrike(stdout);\n\t\t} catch {}\n\t}\n\treturn null;\n}\n\nasync function runSafeHelp(args: string[]) {\n\tlet binary: string | null = null;\n\tconst subPath: string[] = [];\n\n\tfor (const arg of args) {\n\t\tif (arg === \"--no-color\" || arg === \"--help\" || arg === \"-h\") continue;\n\t\tif (!binary) {\n\t\t\tbinary = arg;\n\t\t} else {\n\t\t\tsubPath.push(arg);\n\t\t}\n\t}\n\n\tif (!binary) {\n\t\tconsole.error(\"Error: provide a binary name\");\n\t\tconsole.error(\"Run 'clitree safe-help --help' for usage\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Strategy in order of preference:\n\t// 1. `<cli> <sub> -h` — short inline help, no pager\n\t// 2. `<cli> <sub> --help` — long form, overstrike-stripped\n\t// 3. `<cli> help <sub>` — alternate syntax (git, go, bun)\n\t// 4. `man <cli>-<sub>` or `man <cli> <sub>` — final fallback\n\tconst variants: Array<{ label: string; args: string[] }> = [\n\t\t{ label: \"short help (-h)\", args: [...subPath, \"-h\"] },\n\t\t{ label: \"long help (--help)\", args: [...subPath, \"--help\"] },\n\t];\n\n\tif (subPath.length > 0) {\n\t\tvariants.push({ label: \"help subcommand\", args: [\"help\", ...subPath] });\n\t}\n\n\tfor (const variant of variants) {\n\t\tconst output = await tryHelpVariant(binary, variant.args);\n\t\tif (output) {\n\t\t\tprocess.stdout.write(output);\n\t\t\tif (!output.endsWith(\"\\n\")) process.stdout.write(\"\\n\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Last resort: man page\n\tconst manOutput = await tryManPage(binary, subPath);\n\tif (manOutput) {\n\t\tprocess.stdout.write(manOutput);\n\t\tif (!manOutput.endsWith(\"\\n\")) process.stdout.write(\"\\n\");\n\t\treturn;\n\t}\n\n\tconsole.error(`Error: could not fetch help for ${binary} ${subPath.join(\" \")}`);\n\tconsole.error(\"Tried: -h, --help, help subcommand, and man page.\");\n\tprocess.exit(1);\n}\n\nfunction shouldUseColor(args: string[]): boolean {\n\tif (args.includes(\"--no-color\")) return false;\n\tif (process.env.NO_COLOR) return false;\n\tif (process.env.FORCE_COLOR) return true;\n\treturn !!process.stdout.isTTY;\n}\n\nfunction makeColors(enabled: boolean) {\n\tif (!enabled) {\n\t\treturn { reset: \"\", bold: \"\", dim: \"\", cyan: \"\", green: \"\", yellow: \"\", red: \"\", magenta: \"\", gray: \"\" };\n\t}\n\treturn {\n\t\treset: \"\\x1b[0m\",\n\t\tbold: \"\\x1b[1m\",\n\t\tdim: \"\\x1b[2m\",\n\t\tcyan: \"\\x1b[36m\",\n\t\tgreen: \"\\x1b[32m\",\n\t\tyellow: \"\\x1b[33m\",\n\t\tred: \"\\x1b[31m\",\n\t\tmagenta: \"\\x1b[35m\",\n\t\tgray: \"\\x1b[90m\",\n\t};\n}\n\nasync function runMine(args: string[]) {\n\tlet binary: string | null = null;\n\tlet minSupport = 3;\n\tlet historyPath: string | undefined;\n\tlet format: \"ansi\" | \"json\" = \"ansi\";\n\tlet maxPaths = 10;\n\tlet withFlow: \"auto\" | \"on\" | \"off\" = \"auto\";\n\tlet topK = 1;\n\tlet showActivity = true;\n\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i]!;\n\t\tif (arg === \"--min-support\" && args[i + 1]) {\n\t\t\tminSupport = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--history-path\" && args[i + 1]) {\n\t\t\thistoryPath = args[++i]!;\n\t\t} else if (arg === \"--format\" && args[i + 1]) {\n\t\t\tformat = args[++i] as \"ansi\" | \"json\";\n\t\t} else if (arg === \"--max-paths\" && args[i + 1]) {\n\t\t\tmaxPaths = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--top-k\" && args[i + 1]) {\n\t\t\ttopK = Number.parseInt(args[++i]!, 10);\n\t\t\tif (withFlow === \"auto\") withFlow = \"on\";\n\t\t} else if (arg === \"--with-flow\" || arg === \"--flow\") {\n\t\t\twithFlow = \"on\";\n\t\t} else if (arg === \"--no-flow\") {\n\t\t\twithFlow = \"off\";\n\t\t} else if (arg === \"--no-activity\") {\n\t\t\tshowActivity = false;\n\t\t} else if (arg !== \"--no-color\" && !arg.startsWith(\"-\")) {\n\t\t\tbinary = arg;\n\t\t}\n\t}\n\n\tif (!binary) {\n\t\tconsole.error(\"Error: provide a binary name\");\n\t\tconsole.error(\"Run 'clitree mine --help' for usage\");\n\t\tprocess.exit(1);\n\t}\n\n\ttry {\n\t\tconst result = await mineCli(binary, { minSupport, historyPath });\n\n\t\tif (format === \"json\") {\n\t\t\tconsole.log(JSON.stringify(result, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconst C = makeColors(shouldUseColor(args));\n\n\t\tconsole.log(`\\n${C.bold}${C.magenta}${binary}${C.reset} ${C.gray}— shell history analysis${C.reset}\\n`);\n\t\tconsole.log(`${C.bold}Usage:${C.reset}`);\n\t\tconsole.log(` ${C.dim}Invocations:${C.reset} ${C.cyan}${result.stats.totalInvocations}${C.reset}`);\n\t\tconsole.log(` ${C.dim}Subcommands:${C.reset} ${C.cyan}${result.stats.uniqueSubcommands}${C.reset}`);\n\t\tconsole.log(` ${C.dim}Sessions:${C.reset} ${C.cyan}${result.sessionsAnalyzed}${C.reset}\\n`);\n\n\t\tif (result.stats.topSubcommands.length > 0) {\n\t\t\tconsole.log(`${C.bold}Top subcommands:${C.reset}`);\n\t\t\tconst max = result.stats.topSubcommands[0]!.count;\n\t\t\tfor (const { subcommand, count } of result.stats.topSubcommands.slice(0, 5)) {\n\t\t\t\tconst bar = \"█\".repeat(Math.max(1, Math.round((count / max) * 30)));\n\t\t\t\tconsole.log(` ${C.green}${subcommand.padEnd(20)}${C.reset} ${C.cyan}${bar}${C.reset} ${C.dim}${count}${C.reset}`);\n\t\t\t}\n\t\t\tconsole.log();\n\t\t}\n\n\t\tif (showActivity && result.activity.total > 0) {\n\t\t\trenderActivitySection(result.activity, C);\n\t\t}\n\n\t\tif (result.workflows.length > 0) {\n\t\t\tconsole.log(`${C.bold}Discovered workflows:${C.reset}`);\n\t\t\tfor (const wf of result.workflows.slice(0, maxPaths)) {\n\t\t\t\tconst chain = wf.path[0]!.map(p => `${C.green}${p}${C.reset}`).join(` ${C.gray}→${C.reset} `);\n\t\t\t\tconsole.log(` ${chain} ${C.dim}(${wf.support}×)${C.reset}`);\n\t\t\t}\n\t\t\tconsole.log();\n\t\t}\n\n\t\tif (result.suggestions.length > 0) {\n\t\t\tconsole.log(`${C.bold}${C.yellow}💡 Skill suggestions:${C.reset}`);\n\t\t\tfor (const s of result.suggestions.slice(0, 3)) {\n\t\t\t\tconst badge =\n\t\t\t\t\ts.priority === \"high\"\n\t\t\t\t\t\t? `${C.green}[HIGH]${C.reset}`\n\t\t\t\t\t\t: s.priority === \"medium\"\n\t\t\t\t\t\t\t? `${C.yellow}[MED]${C.reset}`\n\t\t\t\t\t\t\t: `${C.dim}[LOW]${C.reset}`;\n\t\t\t\tconsole.log(`\\n ${badge} ${C.bold}/${s.name}${C.reset} — ${s.description}`);\n\t\t\t\tconsole.log(` ${C.dim}${s.reason}${C.reset}`);\n\t\t\t\tconsole.log(` ${C.dim}${s.commands.join(\" && \")}${C.reset}`);\n\t\t\t}\n\t\t\tconsole.log();\n\t\t}\n\n\t\t// Pick the top-K workflows worth visualizing as DAGs.\n\t\t// Auto mode renders only the first 3+ step workflow.\n\t\t// `--top-k N` renders up to N distinct workflows (skipping shorter 2-step ones by default).\n\t\tif (withFlow !== \"off\") {\n\t\t\tconst minSteps = withFlow === \"on\" ? 2 : 3;\n\t\t\tconst topK_effective = Math.max(1, topK);\n\t\t\tconst candidates = pickWorkflowsForFlow(result.workflows, minSteps, topK_effective);\n\n\t\t\tif (candidates.length > 0) {\n\t\t\t\tconst header = candidates.length === 1 ? \"Top workflow (visualized):\" : `Top ${candidates.length} workflows (visualized):`;\n\t\t\t\tconsole.log(`${C.bold}${header}${C.reset}`);\n\t\t\t\tfor (let i = 0; i < candidates.length; i++) {\n\t\t\t\t\tif (i > 0) console.log(`${C.gray}${\"─\".repeat(60)}${C.reset}`);\n\t\t\t\t\tconst flowWorkflow = minedToFlowWorkflow(candidates[i]!);\n\t\t\t\t\tconst rendered = shouldUseColor(args) ? flowToAnsi(flowWorkflow) : flowToString(flowWorkflow);\n\t\t\t\t\tconsole.log(rendered);\n\t\t\t\t}\n\t\t\t\tconsole.log();\n\t\t\t}\n\t\t}\n\t} catch (err: any) {\n\t\tconsole.error(`Error: ${err.message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction renderActivitySection(\n\tactivity: {\n\t\thourOfDay: number[];\n\t\tdayOfWeek: number[];\n\t\tlast30Days: number[];\n\t\tlast52Weeks: number[];\n\t\tfirstSeen: number;\n\t\tlastSeen: number;\n\t\ttotal: number;\n\t\tdaysWithActivity: number;\n\t},\n\tC: ReturnType<typeof makeColors>,\n) {\n\t// Only show if we have timestamp data\n\tif (activity.firstSeen === 0) return;\n\n\tconst dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\tconsole.log(`${C.bold}Activity:${C.reset} ${C.dim}(blank = no data)${C.reset}`);\n\n\tconst range = formatTimeRange(activity.firstSeen, activity.lastSeen);\n\tconsole.log(` ${C.dim}Tracked over:${C.reset} ${C.cyan}${range}${C.reset} ${C.dim}(${activity.daysWithActivity} active days)${C.reset}`);\n\n\t// Hour-of-day sparkline (24 chars wide — one per hour)\n\tconst hourSpark = sparkline(activity.hourOfDay);\n\tconsole.log(` ${C.dim}Hour of day:${C.reset} ${C.cyan}${hourSpark}${C.reset} ${C.dim}0h······················23h${C.reset}`);\n\n\t// Day-of-week mini bars\n\tconst dowMax = Math.max(...activity.dayOfWeek);\n\tif (dowMax > 0) {\n\t\tconsole.log(` ${C.dim}Day of week:${C.reset}`);\n\t\tfor (let i = 0; i < 7; i++) {\n\t\t\tconst count = activity.dayOfWeek[i]!;\n\t\t\tconst barLen = dowMax > 0 ? Math.round((count / dowMax) * 20) : 0;\n\t\t\tconst bar = \"█\".repeat(Math.max(count > 0 ? 1 : 0, barLen));\n\t\t\tconsole.log(` ${C.gray}${dayNames[i]}${C.reset} ${C.cyan}${bar}${C.reset} ${C.dim}${count}${C.reset}`);\n\t\t}\n\t\tconsole.log();\n\t}\n\n\t// Last 30 days — one character per day, · marks days with zero activity\n\tif (activity.last30Days.some(v => v > 0)) {\n\t\tconst activeDays = activity.last30Days.filter(v => v > 0).length;\n\t\tconst totalLast30 = activity.last30Days.reduce((a, b) => a + b, 0);\n\t\tconst monthSpark = sparkline(activity.last30Days);\n\t\tconsole.log(` ${C.dim}Last 30 days:${C.reset} ${C.cyan}${monthSpark}${C.reset}`);\n\t\tconsole.log(` ${C.dim} └── 1 char per day · ${activeDays}/30 active · ${totalLast30} total${C.reset}`);\n\t}\n\n\t// Last 52 weeks — gives context for heavy-history users (1+ year of tracking)\n\tif (activity.last52Weeks.some(v => v > 0)) {\n\t\tconst activeWeeks = activity.last52Weeks.filter(v => v > 0).length;\n\t\tconst weekSpark = sparkline(activity.last52Weeks);\n\t\tconsole.log(` ${C.dim}Last 52 weeks:${C.reset} ${C.cyan}${weekSpark}${C.reset}`);\n\t\tconsole.log(` ${C.dim} └── 1 char per week · ${activeWeeks}/52 active weeks${C.reset}`);\n\t}\n\n\tconsole.log();\n}\n\nfunction pickWorkflowForFlow<T extends { path: string[][]; support: number }>(\n\tworkflows: T[],\n\tminSteps = 3,\n): T | null {\n\tconst picked = pickWorkflowsForFlow(workflows, minSteps, 1);\n\treturn picked[0] ?? null;\n}\n\nfunction pickWorkflowsForFlow<T extends { path: string[][]; support: number }>(\n\tworkflows: T[],\n\tminSteps: number,\n\ttopK: number,\n): T[] {\n\tconst result: T[] = [];\n\tconst signatures = new Set<string>();\n\tfor (const wf of workflows) {\n\t\tconst len = wf.path[0]?.length ?? 0;\n\t\tif (len < minSteps) continue;\n\t\tconst sig = wf.path[0]!.join(\" → \");\n\t\tif (signatures.has(sig)) continue;\n\t\tsignatures.add(sig);\n\t\tresult.push(wf);\n\t\tif (result.length >= topK) break;\n\t}\n\treturn result;\n}\n\nasync function runCross(args: string[]) {\n\tlet format: \"ansi\" | \"json\" = \"ansi\";\n\tlet topK = 10;\n\tlet minSupport = 3;\n\tlet minPathLength = 2;\n\tlet maxPathLength = 5;\n\tlet minDistinctCLIs = 2;\n\tlet onlyList: string[] = [];\n\tlet withFlow = true;\n\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i]!;\n\t\tif (arg === \"--top-k\" && args[i + 1]) {\n\t\t\ttopK = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--min-support\" && args[i + 1]) {\n\t\t\tminSupport = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--min-path-length\" && args[i + 1]) {\n\t\t\tminPathLength = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--max-path-length\" && args[i + 1]) {\n\t\t\tmaxPathLength = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--min-distinct-clis\" && args[i + 1]) {\n\t\t\tminDistinctCLIs = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--only\" && args[i + 1]) {\n\t\t\tonlyList = args[++i]!.split(\",\").map(s => s.trim()).filter(Boolean);\n\t\t} else if (arg === \"--format\" && args[i + 1]) {\n\t\t\tformat = args[++i] as \"ansi\" | \"json\";\n\t\t} else if (arg === \"--no-flow\") {\n\t\t\twithFlow = false;\n\t\t}\n\t}\n\n\ttry {\n\t\tconst result = await mineCrossCli({\n\t\t\ttopK,\n\t\t\tminSupport,\n\t\t\tminPathLength,\n\t\t\tmaxPathLength,\n\t\t\tminDistinctCLIs,\n\t\t\tallowedCLIs: onlyList.length > 0 ? onlyList : undefined,\n\t\t});\n\n\t\tif (format === \"json\") {\n\t\t\tconsole.log(JSON.stringify(result, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconst C = makeColors(shouldUseColor(args));\n\n\t\tconsole.log(`\\n${C.bold}${C.magenta}cross-CLI workflow analysis${C.reset}\\n`);\n\t\tconsole.log(`${C.bold}Scope:${C.reset}`);\n\t\tconsole.log(` ${C.dim}Sessions analyzed:${C.reset} ${C.cyan}${result.sessionsAnalyzed}${C.reset}`);\n\t\tconsole.log(` ${C.dim}Distinct CLIs:${C.reset} ${C.cyan}${result.distinctCLIs.length}${C.reset}`);\n\t\tconsole.log(` ${C.dim}Transitions:${C.reset} ${C.cyan}${result.totalTransitions}${C.reset}\\n`);\n\n\t\tif (result.workflows.length === 0) {\n\t\t\tconsole.log(`${C.dim}No cross-CLI workflows found. Try lowering --min-support or --min-distinct-clis.${C.reset}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(`${C.bold}Cross-CLI workflows (top ${result.workflows.length}):${C.reset}`);\n\t\tfor (let i = 0; i < result.workflows.length; i++) {\n\t\t\tconst wf = result.workflows[i]!;\n\t\t\tconst chain = wf.path\n\t\t\t\t.map(s => `${C.green}${s.cli}${C.reset} ${C.cyan}${s.subcommand}${C.reset}`)\n\t\t\t\t.join(` ${C.gray}→${C.reset} `);\n\t\t\tconsole.log(` ${C.dim}${(i + 1).toString().padStart(2)}.${C.reset} ${chain}`);\n\t\t\tconsole.log(` ${C.dim}seen ${wf.support}×, ${wf.uniqueCLIs} distinct CLIs${C.reset}`);\n\t\t}\n\t\tconsole.log();\n\n\t\tif (withFlow && result.workflows.length > 0) {\n\t\t\tconst top = result.workflows[0]!;\n\t\t\tconst flowWorkflow = crossCliToFlowWorkflow(top);\n\t\t\tconst rendered = shouldUseColor(args) ? flowToAnsi(flowWorkflow) : flowToString(flowWorkflow);\n\t\t\tconsole.log(`${C.bold}Top cross-CLI workflow (visualized):${C.reset}`);\n\t\t\tconsole.log(rendered);\n\t\t\tconsole.log();\n\t\t}\n\t} catch (err: any) {\n\t\tconsole.error(`Error: ${err.message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function runArchaeologyCmd(args: string[]) {\n\tlet binary: string | null = null;\n\tlet skipCache = false;\n\tlet maxDepth = 2;\n\tlet format: \"ansi\" | \"json\" = \"ansi\";\n\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i]!;\n\t\tif (arg === \"--no-cache\") {\n\t\t\tskipCache = true;\n\t\t} else if (arg === \"--max-depth\" && args[i + 1]) {\n\t\t\tmaxDepth = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--format\" && args[i + 1]) {\n\t\t\tformat = args[++i] as \"ansi\" | \"json\";\n\t\t} else if (arg !== \"--no-color\" && !arg.startsWith(\"-\")) {\n\t\t\tbinary = arg;\n\t\t}\n\t}\n\n\tif (!binary) {\n\t\tconsole.error(\"Error: provide a binary name\");\n\t\tconsole.error(\"Run 'clitree archaeology --help' for usage\");\n\t\tprocess.exit(1);\n\t}\n\n\tconst C = makeColors(shouldUseColor(args));\n\n\ttry {\n\t\tconsole.error(`${C.dim}⚠ LLM archaeology requires running inside the clitree skill.${C.reset}`);\n\t\tconsole.error(`${C.dim} Running deterministic phases only (help + history mining).${C.reset}`);\n\t\tconsole.error(\"\");\n\n\t\tconst [arch, mine] = await Promise.all([\n\t\t\trunArchaeology(binary, new NullDelegate(), { skipCache, maxHelpDepth: maxDepth }),\n\t\t\tmineCli(binary, { minSupport: 3 }).catch(() => null),\n\t\t]);\n\n\t\tif (format === \"json\") {\n\t\t\tconsole.log(JSON.stringify({ archaeology: arch, mining: mine }, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(`${C.bold}${C.magenta}${binary}${C.reset}`);\n\t\tif (arch.tree.description) {\n\t\t\tconsole.log(`${C.gray}${arch.tree.description}${C.reset}`);\n\t\t}\n\t\tconsole.log();\n\n\t\tconsole.log(`${C.bold}Tree:${C.reset}`);\n\t\tconsole.log(` ${C.dim}Commands:${C.reset} ${C.cyan}${arch.stats.helpCommands}${C.reset}`);\n\t\tconsole.log(` ${C.dim}Cached:${C.reset} ${arch.fromCache ? `${C.green}yes${C.reset}` : `${C.dim}no${C.reset}`}`);\n\t\tconsole.log();\n\n\t\tif (mine) {\n\t\t\tconsole.log(`${C.bold}Usage from shell history:${C.reset}`);\n\t\t\tconsole.log(` ${C.dim}Invocations:${C.reset} ${C.cyan}${mine.stats.totalInvocations}${C.reset}`);\n\t\t\tconsole.log(` ${C.dim}Subcommands:${C.reset} ${C.cyan}${mine.stats.uniqueSubcommands}${C.reset}`);\n\n\t\t\tif (mine.workflows.length > 0) {\n\t\t\t\tconsole.log(`\\n${C.bold}Workflows you repeat:${C.reset}`);\n\t\t\t\tfor (const wf of mine.workflows.slice(0, 5)) {\n\t\t\t\t\tconst chain = wf.path[0]!.map(p => `${C.green}${p}${C.reset}`).join(` ${C.gray}→${C.reset} `);\n\t\t\t\t\tconsole.log(` ${chain} ${C.dim}(${wf.support}×)${C.reset}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (mine.suggestions.length > 0) {\n\t\t\t\tconsole.log(`\\n${C.bold}${C.yellow}💡 Skill suggestions:${C.reset}`);\n\t\t\t\tfor (const s of mine.suggestions.slice(0, 3)) {\n\t\t\t\t\tconsole.log(` ${C.bold}/${s.name}${C.reset} — ${s.description}`);\n\t\t\t\t\tconsole.log(` ${C.dim}${s.reason}${C.reset}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconsole.log();\n\t\tconsole.log(`${C.dim}Install the clitree skill for full LLM archaeology:${C.reset}`);\n\t\tconsole.log(`${C.dim} bash ./skill/install.sh${C.reset}`);\n\t\tconsole.log();\n\t} catch (err: any) {\n\t\tconsole.error(`${C.red}Error: ${err.message}${C.reset}`);\n\t\tprocess.exit(1);\n\t}\n}\n"
|
|
5
|
+
"#!/usr/bin/env bun\nimport { parseHelpRecursive, parseHelp } from \"./parse\";\nimport { printTree, treeToString, treeToHtml } from \"./index\";\nimport type { TreeOptions } from \"./types\";\nimport { parseWorkflow, validateWorkflow, flowToAnsi, flowToString, flowToHtml } from \"./flow\";\nimport type { FlowRenderOptions } from \"./flow/types\";\nimport {\n\tmineCli,\n\tminedToFlowWorkflow,\n\tmineCrossCli,\n\tcrossCliToFlowWorkflow,\n\tsparkline,\n\tlabeledSparkline,\n\tformatTimeRange,\n} from \"./miner\";\nimport { runArchaeology, NullDelegate } from \"./archaeology\";\n\nconst args = process.argv.slice(2);\nconst subcommand = args[0];\n\nconst HELP_SUBCOMMANDS = new Set([\"flow\", \"mine\", \"archaeology\", \"safe-help\", \"cross\"]);\nconst isHelpFlag = args.includes(\"--help\") || args.includes(\"-h\");\n\nif (!subcommand || (isHelpFlag && !HELP_SUBCOMMANDS.has(subcommand ?? \"\"))) {\n\tprintMainHelp();\n\tprocess.exit(0);\n}\n\nif (isHelpFlag) {\n\tif (subcommand === \"flow\") printFlowHelp();\n\telse if (subcommand === \"mine\") printMineHelp();\n\telse if (subcommand === \"archaeology\") printArchaeologyHelp();\n\telse if (subcommand === \"safe-help\") printSafeHelpHelp();\n\telse if (subcommand === \"cross\") printCrossHelp();\n\telse printMainHelp();\n\tprocess.exit(0);\n}\n\nif (subcommand === \"flow\") {\n\tawait runFlow(args.slice(1));\n} else if (subcommand === \"mine\") {\n\tawait runMine(args.slice(1));\n} else if (subcommand === \"archaeology\") {\n\tawait runArchaeologyCmd(args.slice(1));\n} else if (subcommand === \"safe-help\") {\n\tawait runSafeHelp(args.slice(1));\n} else if (subcommand === \"cross\") {\n\tawait runCross(args.slice(1));\n} else {\n\tawait runTree(args);\n}\n\nfunction printMainHelp() {\n\tconsole.log(`\n clitree — Visualize and explore any CLI\n\n Usage:\n clitree <binary> [options] Render command tree from --help\n clitree flow <file> [options] Render a workflow YAML as a DAG\n clitree mine <binary> [options] Mine shell history for workflows\n clitree cross [options] Detect cross-CLI workflows (git + gh, docker + kubectl)\n clitree archaeology <binary> [options] Full analysis: tree + mining + (LLM)\n clitree safe-help <binary> [sub...] Fetch clean help for any CLI (no pager, no overstriking)\n\n Examples:\n clitree docker # basic tree\n clitree mine git # \"what workflows do I repeat with git?\"\n clitree cross # cross-CLI flows across your history\n clitree archaeology bun # tree + mining + LLM archaeology\n clitree safe-help git commit # avoid the git man-page pager trap\n\n Subcommands:\n tree Parse --help output (default; passing a binary name invokes this)\n flow Render a workflow YAML file as an ASCII DAG\n mine Discover workflows from your shell history (single CLI)\n cross Discover workflows that span multiple CLIs (e.g. git → gh)\n archaeology Run full analysis (tree + mine + LLM proposals when available)\n safe-help Return inline help for any CLI, handling pager/overstrike edge cases\n\n Help for a subcommand: clitree <subcommand> --help\n`);\n}\n\nfunction printCrossHelp() {\n\tconsole.log(`\n clitree cross — Mine cross-CLI workflows from your shell history\n\n Usage:\n clitree cross [options]\n\n This is mineCli's bigger sibling. Instead of filtering history to a single\n binary, it looks at every command in a session and finds sequences that weave\n between tools — e.g.:\n\n git push → gh pr create\n docker build → docker push → kubectl apply\n bun test → git commit → git push\n\n These patterns are invisible to 'clitree mine <cli>' because they cross boundaries.\n\n Examples:\n clitree cross # top 10 cross-CLI workflows\n clitree cross --top-k 5 # just the top 5\n clitree cross --only git,gh,docker # restrict to a set of CLIs\n clitree cross --format json # raw data\n\n Options:\n --top-k <n> Max workflows to return (default: 10)\n --min-support <n> Minimum occurrences (default: 3)\n --min-path-length <n> Minimum chain length (default: 2)\n --max-path-length <n> Maximum chain length (default: 5)\n --min-distinct-clis <n> Require at least this many distinct CLIs (default: 2)\n --only <csv> Whitelist: only include these CLIs (comma-separated)\n --format <fmt> ansi (default) or json\n --no-color Disable ANSI colors\n --no-flow Skip DAG rendering of the top workflow\n -h, --help Show this help\n`);\n}\n\nfunction printSafeHelpHelp() {\n\tconsole.log(`\n clitree safe-help — Fetch clean help output for any CLI\n\n Usage:\n clitree safe-help <binary> [subcommand...] [options]\n\n Why this exists:\n Running '<cli> --help' directly is a minefield on agents and scripts:\n - 'git commit --help' opens a pager in a TTY and hangs\n - Piping 'git <sub> --help' returns nroff with overstrike (ffiixxuupp)\n - Some CLIs use 'help <sub>' instead of '<sub> --help'\n - macOS man pages emit \\\\b sequences that need col -bx\n\n safe-help tries the right variants in order, cleans overstrikes, and\n returns plain text every time.\n\n Strategy (in order):\n 1. <cli> <sub> -h — short inline help\n 2. <cli> <sub> --help — long help (captured, overstrike-stripped)\n 3. <cli> help <sub> — alternate syntax\n 4. MANPAGER=cat man <cli>-<sub> | col -bx — final man fallback\n\n Examples:\n clitree safe-help git commit\n clitree safe-help docker run\n clitree safe-help kubectl get pods\n clitree safe-help bun install\n\n Options:\n --no-color Disable ANSI codes (auto-detects non-TTY)\n -h, --help Show this help\n`);\n}\n\nfunction printMineHelp() {\n\tconsole.log(`\n clitree mine — Mine your shell history for CLI workflows\n\n Usage:\n clitree mine <binary> [options]\n\n Examples:\n clitree mine git\n clitree mine git --top-k 3 # render top 3 workflows as DAGs\n clitree mine docker --min-support 5 --with-flow\n clitree mine bun --format json > bun-flows.json\n clitree mine git --no-color | tee report.txt\n clitree mine git --no-activity # skip temporal sparklines\n\n Options:\n --min-support <n> Minimum occurrences to count as a workflow (default: 3)\n --history-path <p> Custom shell history path (default: ~/.zsh_history)\n --format <fmt> Output format: ansi (default), json\n --max-paths <n> Max workflows to show in text list (default: 10)\n --top-k <n> Render top N workflows as DAGs (default: 1)\n --with-flow Include 2-step workflows in DAG rendering\n --no-flow Skip DAG rendering entirely\n --no-activity Skip hour/day/30-day activity sparklines\n --no-color Disable ANSI colors (also auto-disabled when stdout is not a TTY)\n -h, --help Show this help\n\n By default, the top 3+ step workflow is rendered as a DAG.\n --top-k bumps that to N distinct workflows stacked on top of each other.\n`);\n}\n\nfunction printArchaeologyHelp() {\n\tconsole.log(`\n clitree archaeology — Full CLI analysis: tree + mining + LLM archaeology\n\n Usage:\n clitree archaeology <binary> [options]\n\n When run from the command line without a delegate, only the deterministic\n phases run (help parsing + shell history mining). LLM archaeology requires\n running inside the clitree skill (see ./skill/SKILL.md).\n\n Examples:\n clitree archaeology git # help + history\n clitree archaeology docker --no-cache # bypass cache\n clitree archaeology bun --format json # JSON output\n\n Options:\n --no-cache Skip cache, always re-run\n --max-depth <n> Max --help recursion depth (default: 2)\n --format <fmt> Output format: ansi (default), json\n --no-color Disable ANSI colors (also auto-disabled when stdout is not a TTY)\n -h, --help Show this help\n`);\n}\n\nfunction printFlowHelp() {\n\tconsole.log(`\n cli-tree flow — Render a CLI workflow YAML as a DAG\n\n Usage:\n cli-tree flow <file> [options]\n\n Examples:\n cli-tree flow workflows/git-pr-flow.yml\n cli-tree flow my-workflow.yml --format html > flow.html\n cli-tree flow workflows/docker-deploy.yml --compact --no-color\n\n Options:\n --compact Hide description and legend\n --no-color Disable colors\n --format <fmt> Output format: ansi (default), string, html\n --no-validate Skip validation\n -h, --help Show this help\n`);\n}\n\nasync function runTree(args: string[]) {\n\tconst opts: TreeOptions = {\n\t\tcolor: true,\n\t\tshowFlags: true,\n\t\tshowArgs: true,\n\t\tshowDescriptions: true,\n\t\tshowTypes: true,\n\t\tshowDefaults: true,\n\t\tcompact: false,\n\t};\n\n\tlet depth = 2;\n\tlet format: \"ansi\" | \"string\" | \"html\" | \"json\" = \"ansi\";\n\tlet stdinName: string | null = null;\n\tlet binary: string | null = null;\n\n\topts.color = shouldUseColor(args);\n\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i]!;\n\t\tif (arg === \"--depth\" && args[i + 1]) {\n\t\t\tdepth = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--compact\") {\n\t\t\topts.compact = true;\n\t\t\topts.showDescriptions = false;\n\t\t} else if (arg === \"--no-flags\") {\n\t\t\topts.showFlags = false;\n\t\t} else if (arg === \"--no-args\") {\n\t\t\topts.showArgs = false;\n\t\t} else if (arg === \"--no-color\") {\n\t\t\topts.color = false;\n\t\t} else if (arg === \"--format\" && args[i + 1]) {\n\t\t\tformat = args[++i] as \"ansi\" | \"string\" | \"html\" | \"json\";\n\t\t} else if (arg === \"--stdin\" && args[i + 1]) {\n\t\t\tstdinName = args[++i]!;\n\t\t} else if (!arg.startsWith(\"-\")) {\n\t\t\tbinary = arg;\n\t\t}\n\t}\n\n\ttry {\n\t\tlet tree;\n\t\tif (stdinName) {\n\t\t\tconst input = await readStdin();\n\t\t\ttree = parseHelp(stdinName, input);\n\t\t} else if (binary) {\n\t\t\ttree = await parseHelpRecursive(binary, [], depth);\n\t\t} else {\n\t\t\tconsole.error(\"Error: provide a binary name or use --stdin <name>\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (format === \"json\") {\n\t\t\tconsole.log(JSON.stringify(tree, null, 2));\n\t\t} else if (format === \"html\") {\n\t\t\tconsole.log(treeToHtml(tree, opts));\n\t\t} else if (format === \"string\") {\n\t\t\tconsole.log(treeToString(tree, opts));\n\t\t} else {\n\t\t\tprintTree(tree, opts);\n\t\t}\n\t} catch (err: any) {\n\t\tconsole.error(`Error: ${err.message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function runFlow(args: string[]) {\n\tconst opts: FlowRenderOptions = {\n\t\tcolor: true,\n\t\tshowDescriptions: true,\n\t\tshowCommands: true,\n\t\tcompact: false,\n\t};\n\n\tlet format: \"ansi\" | \"string\" | \"html\" = \"ansi\";\n\tlet file: string | null = null;\n\tlet skipValidate = false;\n\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i]!;\n\t\tif (arg === \"--compact\") {\n\t\t\topts.compact = true;\n\t\t\topts.showDescriptions = false;\n\t\t} else if (arg === \"--no-color\") {\n\t\t\topts.color = false;\n\t\t} else if (arg === \"--no-validate\") {\n\t\t\tskipValidate = true;\n\t\t} else if (arg === \"--format\" && args[i + 1]) {\n\t\t\tformat = args[++i] as \"ansi\" | \"string\" | \"html\";\n\t\t} else if (!arg.startsWith(\"-\")) {\n\t\t\tfile = arg;\n\t\t}\n\t}\n\n\tif (!file) {\n\t\tconsole.error(\"Error: provide a workflow YAML file\");\n\t\tconsole.error(\"Run 'cli-tree flow --help' for usage\");\n\t\tprocess.exit(1);\n\t}\n\n\ttry {\n\t\tconst text = await Bun.file(file).text();\n\t\tconst workflow = parseWorkflow(text);\n\n\t\tif (!skipValidate) {\n\t\t\tconst result = validateWorkflow(workflow);\n\t\t\tfor (const err of result.errors) {\n\t\t\t\tconst prefix = err.severity === \"error\" ? \"\\x1b[31m✗\" : \"\\x1b[33m⚠\";\n\t\t\t\tconst reset = \"\\x1b[0m\";\n\t\t\t\tconst location = err.node ? ` [${err.node}]` : err.edge ? ` [${err.edge.from}→${err.edge.to}]` : \"\";\n\t\t\t\tconsole.error(`${prefix}${location} ${err.message}${reset}`);\n\t\t\t}\n\t\t\tif (!result.valid) process.exit(1);\n\t\t}\n\n\t\tif (format === \"html\") {\n\t\t\tconsole.log(flowToHtml(workflow, opts));\n\t\t} else if (format === \"string\") {\n\t\t\tconsole.log(flowToString(workflow, opts));\n\t\t} else {\n\t\t\tconsole.log(flowToAnsi(workflow, opts));\n\t\t}\n\t} catch (err: any) {\n\t\tconsole.error(`Error: ${err.message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function readStdin(): Promise<string> {\n\tconst chunks: Buffer[] = [];\n\tfor await (const chunk of process.stdin) {\n\t\tchunks.push(chunk as Buffer);\n\t}\n\treturn Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nfunction stripOverstrike(text: string): string {\n\t// Strip nroff bold via char\\bchar, underline via _\\bchar, and stray control chars.\n\t// This is what `col -bx` does.\n\treturn text\n\t\t.replace(/(.)\\b\\1/g, \"$1\")\n\t\t.replace(/_\\b(.)/g, \"$1\")\n\t\t.replace(/\\b/g, \"\")\n\t\t.replace(/\\x1b\\[[0-9;]*[a-zA-Z]/g, \"\");\n}\n\nfunction looksLikeHelp(text: string): boolean {\n\tif (!text.trim()) return false;\n\tif (text.length < 40) return false;\n\tconst firstChunk = text.slice(0, 200).toLowerCase();\n\t// Error messages from unknown subcommands or unsupported flags\n\tif (/(unknown|invalid|no such|not a \\w+ command|flag needs an argument|unrecognized)/.test(firstChunk)) {\n\t\treturn false;\n\t}\n\t// \"Run '... --help' for more information\" is a hint, not the help itself\n\tif (/run '.+' for more information/.test(firstChunk)) return false;\n\treturn true;\n}\n\nasync function tryHelpVariant(binary: string, argv: string[], timeoutMs = 5000): Promise<string | null> {\n\ttry {\n\t\tconst proc = Bun.spawn([binary, ...argv], {\n\t\t\tstdout: \"pipe\",\n\t\t\tstderr: \"pipe\",\n\t\t\tenv: { ...process.env, PAGER: \"cat\", MANPAGER: \"cat\", GIT_PAGER: \"cat\" },\n\t\t});\n\n\t\tconst timer = setTimeout(() => proc.kill(), timeoutMs);\n\n\t\tconst [stdout, stderr] = await Promise.all([\n\t\t\tnew Response(proc.stdout).text(),\n\t\t\tnew Response(proc.stderr).text(),\n\t\t]);\n\t\tclearTimeout(timer);\n\t\tawait proc.exited;\n\n\t\tconst combined = stdout || stderr;\n\t\tif (!looksLikeHelp(combined)) return null;\n\t\treturn stripOverstrike(combined);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function tryManPage(binary: string, subPath: string[], timeoutMs = 5000): Promise<string | null> {\n\t// Try 'man binary-sub' (git-commit), then 'man binary sub' as a fallback.\n\tconst candidates = [\n\t\tsubPath.length > 0 ? [`${binary}-${subPath.join(\"-\")}`] : [binary],\n\t\t[binary, ...subPath],\n\t];\n\n\tfor (const args of candidates) {\n\t\ttry {\n\t\t\tconst proc = Bun.spawn([\"man\", ...args], {\n\t\t\t\tstdout: \"pipe\",\n\t\t\t\tstderr: \"pipe\",\n\t\t\t\tenv: { ...process.env, MANPAGER: \"cat\", PAGER: \"cat\" },\n\t\t\t});\n\n\t\t\tconst timer = setTimeout(() => proc.kill(), timeoutMs);\n\t\t\tconst [stdout] = await Promise.all([\n\t\t\t\tnew Response(proc.stdout).text(),\n\t\t\t\tnew Response(proc.stderr).text(),\n\t\t\t]);\n\t\t\tclearTimeout(timer);\n\t\t\tawait proc.exited;\n\n\t\t\tif (looksLikeHelp(stdout)) return stripOverstrike(stdout);\n\t\t} catch {}\n\t}\n\treturn null;\n}\n\nasync function runSafeHelp(args: string[]) {\n\tlet binary: string | null = null;\n\tconst subPath: string[] = [];\n\n\tfor (const arg of args) {\n\t\tif (arg === \"--no-color\" || arg === \"--help\" || arg === \"-h\") continue;\n\t\tif (!binary) {\n\t\t\tbinary = arg;\n\t\t} else {\n\t\t\tsubPath.push(arg);\n\t\t}\n\t}\n\n\tif (!binary) {\n\t\tconsole.error(\"Error: provide a binary name\");\n\t\tconsole.error(\"Run 'clitree safe-help --help' for usage\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Strategy in order of preference:\n\t// 1. `<cli> <sub> -h` — short inline help, no pager\n\t// 2. `<cli> <sub> --help` — long form, overstrike-stripped\n\t// 3. `<cli> help <sub>` — alternate syntax (git, go, bun)\n\t// 4. `man <cli>-<sub>` or `man <cli> <sub>` — final fallback\n\tconst variants: Array<{ label: string; args: string[] }> = [\n\t\t{ label: \"short help (-h)\", args: [...subPath, \"-h\"] },\n\t\t{ label: \"long help (--help)\", args: [...subPath, \"--help\"] },\n\t];\n\n\tif (subPath.length > 0) {\n\t\tvariants.push({ label: \"help subcommand\", args: [\"help\", ...subPath] });\n\t}\n\n\tfor (const variant of variants) {\n\t\tconst output = await tryHelpVariant(binary, variant.args);\n\t\tif (output) {\n\t\t\tprocess.stdout.write(output);\n\t\t\tif (!output.endsWith(\"\\n\")) process.stdout.write(\"\\n\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Last resort: man page\n\tconst manOutput = await tryManPage(binary, subPath);\n\tif (manOutput) {\n\t\tprocess.stdout.write(manOutput);\n\t\tif (!manOutput.endsWith(\"\\n\")) process.stdout.write(\"\\n\");\n\t\treturn;\n\t}\n\n\tconsole.error(`Error: could not fetch help for ${binary} ${subPath.join(\" \")}`);\n\tconsole.error(\"Tried: -h, --help, help subcommand, and man page.\");\n\tprocess.exit(1);\n}\n\nfunction shouldUseColor(args: string[]): boolean {\n\tif (args.includes(\"--no-color\")) return false;\n\tif (process.env.NO_COLOR) return false;\n\tif (process.env.FORCE_COLOR) return true;\n\treturn !!process.stdout.isTTY;\n}\n\nfunction makeColors(enabled: boolean) {\n\tif (!enabled) {\n\t\treturn { reset: \"\", bold: \"\", dim: \"\", cyan: \"\", green: \"\", yellow: \"\", red: \"\", magenta: \"\", gray: \"\" };\n\t}\n\treturn {\n\t\treset: \"\\x1b[0m\",\n\t\tbold: \"\\x1b[1m\",\n\t\tdim: \"\\x1b[2m\",\n\t\tcyan: \"\\x1b[36m\",\n\t\tgreen: \"\\x1b[32m\",\n\t\tyellow: \"\\x1b[33m\",\n\t\tred: \"\\x1b[31m\",\n\t\tmagenta: \"\\x1b[35m\",\n\t\tgray: \"\\x1b[90m\",\n\t};\n}\n\nasync function runMine(args: string[]) {\n\tlet binary: string | null = null;\n\tlet minSupport = 3;\n\tlet historyPath: string | undefined;\n\tlet format: \"ansi\" | \"json\" = \"ansi\";\n\tlet maxPaths = 10;\n\tlet withFlow: \"auto\" | \"on\" | \"off\" = \"auto\";\n\tlet topK = 1;\n\tlet showActivity = true;\n\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i]!;\n\t\tif (arg === \"--min-support\" && args[i + 1]) {\n\t\t\tminSupport = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--history-path\" && args[i + 1]) {\n\t\t\thistoryPath = args[++i]!;\n\t\t} else if (arg === \"--format\" && args[i + 1]) {\n\t\t\tformat = args[++i] as \"ansi\" | \"json\";\n\t\t} else if (arg === \"--max-paths\" && args[i + 1]) {\n\t\t\tmaxPaths = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--top-k\" && args[i + 1]) {\n\t\t\ttopK = Number.parseInt(args[++i]!, 10);\n\t\t\tif (withFlow === \"auto\") withFlow = \"on\";\n\t\t} else if (arg === \"--with-flow\" || arg === \"--flow\") {\n\t\t\twithFlow = \"on\";\n\t\t} else if (arg === \"--no-flow\") {\n\t\t\twithFlow = \"off\";\n\t\t} else if (arg === \"--no-activity\") {\n\t\t\tshowActivity = false;\n\t\t} else if (arg !== \"--no-color\" && !arg.startsWith(\"-\")) {\n\t\t\tbinary = arg;\n\t\t}\n\t}\n\n\tif (!binary) {\n\t\tconsole.error(\"Error: provide a binary name\");\n\t\tconsole.error(\"Run 'clitree mine --help' for usage\");\n\t\tprocess.exit(1);\n\t}\n\n\ttry {\n\t\tconst result = await mineCli(binary, { minSupport, historyPath });\n\n\t\tif (format === \"json\") {\n\t\t\tconsole.log(JSON.stringify(result, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconst C = makeColors(shouldUseColor(args));\n\n\t\tconsole.log(`\\n${C.bold}${C.magenta}${binary}${C.reset} ${C.gray}— shell history analysis${C.reset}\\n`);\n\t\tconsole.log(`${C.bold}Usage:${C.reset}`);\n\t\tconsole.log(` ${C.dim}Invocations:${C.reset} ${C.cyan}${result.stats.totalInvocations}${C.reset}`);\n\t\tconsole.log(` ${C.dim}Subcommands:${C.reset} ${C.cyan}${result.stats.uniqueSubcommands}${C.reset}`);\n\t\tconsole.log(` ${C.dim}Sessions:${C.reset} ${C.cyan}${result.sessionsAnalyzed}${C.reset}\\n`);\n\n\t\tif (result.stats.topSubcommands.length > 0) {\n\t\t\tconsole.log(`${C.bold}Top subcommands:${C.reset}`);\n\t\t\tconst max = result.stats.topSubcommands[0]!.count;\n\t\t\tfor (const { subcommand, count } of result.stats.topSubcommands.slice(0, 5)) {\n\t\t\t\tconst bar = \"█\".repeat(Math.max(1, Math.round((count / max) * 30)));\n\t\t\t\tconsole.log(` ${C.green}${subcommand.padEnd(20)}${C.reset} ${C.cyan}${bar}${C.reset} ${C.dim}${count}${C.reset}`);\n\t\t\t}\n\t\t\tconsole.log();\n\t\t}\n\n\t\tif (showActivity && result.activity.total > 0) {\n\t\t\trenderActivitySection(result.activity, C);\n\t\t}\n\n\t\tif (result.workflows.length > 0) {\n\t\t\tconsole.log(`${C.bold}Discovered workflows:${C.reset}`);\n\t\t\tfor (const wf of result.workflows.slice(0, maxPaths)) {\n\t\t\t\tconst chain = wf.path[0]!.map(p => `${C.green}${p}${C.reset}`).join(` ${C.gray}→${C.reset} `);\n\t\t\t\tconsole.log(` ${chain} ${C.dim}(${wf.support}×)${C.reset}`);\n\t\t\t}\n\t\t\tconsole.log();\n\t\t}\n\n\t\tif (result.suggestions.length > 0) {\n\t\t\tconsole.log(`${C.bold}${C.yellow}💡 Skill suggestions:${C.reset}`);\n\t\t\tfor (const s of result.suggestions.slice(0, 3)) {\n\t\t\t\tconst badge =\n\t\t\t\t\ts.priority === \"high\"\n\t\t\t\t\t\t? `${C.green}[HIGH]${C.reset}`\n\t\t\t\t\t\t: s.priority === \"medium\"\n\t\t\t\t\t\t\t? `${C.yellow}[MED]${C.reset}`\n\t\t\t\t\t\t\t: `${C.dim}[LOW]${C.reset}`;\n\t\t\t\tconsole.log(`\\n ${badge} ${C.bold}/${s.name}${C.reset} — ${s.description}`);\n\t\t\t\tconsole.log(` ${C.dim}${s.reason}${C.reset}`);\n\t\t\t\tconsole.log(` ${C.dim}${s.commands.join(\" && \")}${C.reset}`);\n\t\t\t}\n\t\t\tconsole.log();\n\t\t}\n\n\t\t// Pick the top-K workflows worth visualizing as DAGs.\n\t\t// Auto mode renders only the first 3+ step workflow.\n\t\t// `--top-k N` renders up to N distinct workflows (skipping shorter 2-step ones by default).\n\t\tif (withFlow !== \"off\") {\n\t\t\tconst minSteps = withFlow === \"on\" ? 2 : 3;\n\t\t\tconst topK_effective = Math.max(1, topK);\n\t\t\tconst candidates = pickWorkflowsForFlow(result.workflows, minSteps, topK_effective);\n\n\t\t\tif (candidates.length > 0) {\n\t\t\t\tconst header = candidates.length === 1 ? \"Top workflow (visualized):\" : `Top ${candidates.length} workflows (visualized):`;\n\t\t\t\tconsole.log(`${C.bold}${header}${C.reset}`);\n\t\t\t\tfor (let i = 0; i < candidates.length; i++) {\n\t\t\t\t\tif (i > 0) console.log(`${C.gray}${\"─\".repeat(60)}${C.reset}`);\n\t\t\t\t\tconst flowWorkflow = minedToFlowWorkflow(candidates[i]!);\n\t\t\t\t\tconst rendered = shouldUseColor(args) ? flowToAnsi(flowWorkflow) : flowToString(flowWorkflow);\n\t\t\t\t\tconsole.log(rendered);\n\t\t\t\t}\n\t\t\t\tconsole.log();\n\t\t\t}\n\t\t}\n\t} catch (err: any) {\n\t\tconsole.error(`Error: ${err.message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction renderActivitySection(\n\tactivity: {\n\t\thourOfDay: number[];\n\t\tdayOfWeek: number[];\n\t\tlast30Days: number[];\n\t\tlast52Weeks: number[];\n\t\tfirstSeen: number;\n\t\tlastSeen: number;\n\t\ttotal: number;\n\t\tdaysWithActivity: number;\n\t},\n\tC: ReturnType<typeof makeColors>,\n) {\n\t// Only show if we have timestamp data\n\tif (activity.firstSeen === 0) return;\n\n\tconst dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\tconsole.log(`${C.bold}Activity:${C.reset} ${C.dim}(blank = no data)${C.reset}`);\n\n\tconst range = formatTimeRange(activity.firstSeen, activity.lastSeen);\n\tconsole.log(` ${C.dim}Tracked over:${C.reset} ${C.cyan}${range}${C.reset} ${C.dim}(${activity.daysWithActivity} active days)${C.reset}`);\n\n\t// Hour-of-day sparkline (24 chars wide — one per hour)\n\tconst hourSpark = sparkline(activity.hourOfDay);\n\tconsole.log(` ${C.dim}Hour of day:${C.reset} ${C.cyan}${hourSpark}${C.reset} ${C.dim}0h ── 23h${C.reset}`);\n\n\t// Day-of-week mini bars\n\tconst dowMax = Math.max(...activity.dayOfWeek);\n\tif (dowMax > 0) {\n\t\tconsole.log(` ${C.dim}Day of week:${C.reset}`);\n\t\tfor (let i = 0; i < 7; i++) {\n\t\t\tconst count = activity.dayOfWeek[i]!;\n\t\t\tconst barLen = dowMax > 0 ? Math.round((count / dowMax) * 20) : 0;\n\t\t\tconst bar = \"█\".repeat(Math.max(count > 0 ? 1 : 0, barLen));\n\t\t\tconsole.log(` ${C.gray}${dayNames[i]}${C.reset} ${C.cyan}${bar}${C.reset} ${C.dim}${count}${C.reset}`);\n\t\t}\n\t\tconsole.log();\n\t}\n\n\t// Last 30 days — one character per day, · marks days with zero activity\n\tif (activity.last30Days.some(v => v > 0)) {\n\t\tconst activeDays = activity.last30Days.filter(v => v > 0).length;\n\t\tconst totalLast30 = activity.last30Days.reduce((a, b) => a + b, 0);\n\t\tconst monthSpark = sparkline(activity.last30Days);\n\t\tconsole.log(` ${C.dim}Last 30 days:${C.reset} ${C.cyan}${monthSpark}${C.reset}`);\n\t\tconsole.log(` ${C.dim} └── 1 char per day · ${activeDays}/30 active · ${totalLast30} total${C.reset}`);\n\t}\n\n\t// Last 52 weeks — gives context for heavy-history users (1+ year of tracking)\n\tif (activity.last52Weeks.some(v => v > 0)) {\n\t\tconst activeWeeks = activity.last52Weeks.filter(v => v > 0).length;\n\t\tconst weekSpark = sparkline(activity.last52Weeks);\n\t\tconsole.log(` ${C.dim}Last 52 weeks:${C.reset} ${C.cyan}${weekSpark}${C.reset}`);\n\t\tconsole.log(` ${C.dim} └── 1 char per week · ${activeWeeks}/52 active weeks${C.reset}`);\n\t}\n\n\tconsole.log();\n}\n\nfunction pickWorkflowForFlow<T extends { path: string[][]; support: number }>(\n\tworkflows: T[],\n\tminSteps = 3,\n): T | null {\n\tconst picked = pickWorkflowsForFlow(workflows, minSteps, 1);\n\treturn picked[0] ?? null;\n}\n\nfunction pickWorkflowsForFlow<T extends { path: string[][]; support: number }>(\n\tworkflows: T[],\n\tminSteps: number,\n\ttopK: number,\n): T[] {\n\tconst result: T[] = [];\n\tconst signatures = new Set<string>();\n\tfor (const wf of workflows) {\n\t\tconst len = wf.path[0]?.length ?? 0;\n\t\tif (len < minSteps) continue;\n\t\tconst sig = wf.path[0]!.join(\" → \");\n\t\tif (signatures.has(sig)) continue;\n\t\tsignatures.add(sig);\n\t\tresult.push(wf);\n\t\tif (result.length >= topK) break;\n\t}\n\treturn result;\n}\n\nasync function runCross(args: string[]) {\n\tlet format: \"ansi\" | \"json\" = \"ansi\";\n\tlet topK = 10;\n\tlet minSupport = 3;\n\tlet minPathLength = 2;\n\tlet maxPathLength = 5;\n\tlet minDistinctCLIs = 2;\n\tlet onlyList: string[] = [];\n\tlet withFlow = true;\n\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i]!;\n\t\tif (arg === \"--top-k\" && args[i + 1]) {\n\t\t\ttopK = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--min-support\" && args[i + 1]) {\n\t\t\tminSupport = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--min-path-length\" && args[i + 1]) {\n\t\t\tminPathLength = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--max-path-length\" && args[i + 1]) {\n\t\t\tmaxPathLength = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--min-distinct-clis\" && args[i + 1]) {\n\t\t\tminDistinctCLIs = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--only\" && args[i + 1]) {\n\t\t\tonlyList = args[++i]!.split(\",\").map(s => s.trim()).filter(Boolean);\n\t\t} else if (arg === \"--format\" && args[i + 1]) {\n\t\t\tformat = args[++i] as \"ansi\" | \"json\";\n\t\t} else if (arg === \"--no-flow\") {\n\t\t\twithFlow = false;\n\t\t}\n\t}\n\n\ttry {\n\t\tconst result = await mineCrossCli({\n\t\t\ttopK,\n\t\t\tminSupport,\n\t\t\tminPathLength,\n\t\t\tmaxPathLength,\n\t\t\tminDistinctCLIs,\n\t\t\tallowedCLIs: onlyList.length > 0 ? onlyList : undefined,\n\t\t});\n\n\t\tif (format === \"json\") {\n\t\t\tconsole.log(JSON.stringify(result, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconst C = makeColors(shouldUseColor(args));\n\n\t\tconsole.log(`\\n${C.bold}${C.magenta}cross-CLI workflow analysis${C.reset}\\n`);\n\t\tconsole.log(`${C.bold}Scope:${C.reset}`);\n\t\tconsole.log(` ${C.dim}Sessions analyzed:${C.reset} ${C.cyan}${result.sessionsAnalyzed}${C.reset}`);\n\t\tconsole.log(` ${C.dim}Distinct CLIs:${C.reset} ${C.cyan}${result.distinctCLIs.length}${C.reset}`);\n\t\tconsole.log(` ${C.dim}Transitions:${C.reset} ${C.cyan}${result.totalTransitions}${C.reset}\\n`);\n\n\t\tif (result.workflows.length === 0) {\n\t\t\tconsole.log(`${C.dim}No cross-CLI workflows found. Try lowering --min-support or --min-distinct-clis.${C.reset}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(`${C.bold}Cross-CLI workflows (top ${result.workflows.length}):${C.reset}`);\n\t\tfor (let i = 0; i < result.workflows.length; i++) {\n\t\t\tconst wf = result.workflows[i]!;\n\t\t\tconst chain = wf.path\n\t\t\t\t.map(s => `${C.green}${s.cli}${C.reset} ${C.cyan}${s.subcommand}${C.reset}`)\n\t\t\t\t.join(` ${C.gray}→${C.reset} `);\n\t\t\tconsole.log(` ${C.dim}${(i + 1).toString().padStart(2)}.${C.reset} ${chain}`);\n\t\t\tconsole.log(` ${C.dim}seen ${wf.support}×, ${wf.uniqueCLIs} distinct CLIs${C.reset}`);\n\t\t}\n\t\tconsole.log();\n\n\t\tif (withFlow && result.workflows.length > 0) {\n\t\t\tconst top = result.workflows[0]!;\n\t\t\tconst flowWorkflow = crossCliToFlowWorkflow(top);\n\t\t\tconst rendered = shouldUseColor(args) ? flowToAnsi(flowWorkflow) : flowToString(flowWorkflow);\n\t\t\tconsole.log(`${C.bold}Top cross-CLI workflow (visualized):${C.reset}`);\n\t\t\tconsole.log(rendered);\n\t\t\tconsole.log();\n\t\t}\n\t} catch (err: any) {\n\t\tconsole.error(`Error: ${err.message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function runArchaeologyCmd(args: string[]) {\n\tlet binary: string | null = null;\n\tlet skipCache = false;\n\tlet maxDepth = 2;\n\tlet format: \"ansi\" | \"json\" = \"ansi\";\n\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i]!;\n\t\tif (arg === \"--no-cache\") {\n\t\t\tskipCache = true;\n\t\t} else if (arg === \"--max-depth\" && args[i + 1]) {\n\t\t\tmaxDepth = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--format\" && args[i + 1]) {\n\t\t\tformat = args[++i] as \"ansi\" | \"json\";\n\t\t} else if (arg !== \"--no-color\" && !arg.startsWith(\"-\")) {\n\t\t\tbinary = arg;\n\t\t}\n\t}\n\n\tif (!binary) {\n\t\tconsole.error(\"Error: provide a binary name\");\n\t\tconsole.error(\"Run 'clitree archaeology --help' for usage\");\n\t\tprocess.exit(1);\n\t}\n\n\tconst C = makeColors(shouldUseColor(args));\n\n\ttry {\n\t\tconsole.error(`${C.dim}⚠ LLM archaeology requires running inside the clitree skill.${C.reset}`);\n\t\tconsole.error(`${C.dim} Running deterministic phases only (help + history mining).${C.reset}`);\n\t\tconsole.error(\"\");\n\n\t\tconst [arch, mine] = await Promise.all([\n\t\t\trunArchaeology(binary, new NullDelegate(), { skipCache, maxHelpDepth: maxDepth }),\n\t\t\tmineCli(binary, { minSupport: 3 }).catch(() => null),\n\t\t]);\n\n\t\tif (format === \"json\") {\n\t\t\tconsole.log(JSON.stringify({ archaeology: arch, mining: mine }, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(`${C.bold}${C.magenta}${binary}${C.reset}`);\n\t\tif (arch.tree.description) {\n\t\t\tconsole.log(`${C.gray}${arch.tree.description}${C.reset}`);\n\t\t}\n\t\tconsole.log();\n\n\t\tconsole.log(`${C.bold}Tree:${C.reset}`);\n\t\tconsole.log(` ${C.dim}Commands:${C.reset} ${C.cyan}${arch.stats.helpCommands}${C.reset}`);\n\t\tconsole.log(` ${C.dim}Cached:${C.reset} ${arch.fromCache ? `${C.green}yes${C.reset}` : `${C.dim}no${C.reset}`}`);\n\t\tconsole.log();\n\n\t\tif (mine) {\n\t\t\tconsole.log(`${C.bold}Usage from shell history:${C.reset}`);\n\t\t\tconsole.log(` ${C.dim}Invocations:${C.reset} ${C.cyan}${mine.stats.totalInvocations}${C.reset}`);\n\t\t\tconsole.log(` ${C.dim}Subcommands:${C.reset} ${C.cyan}${mine.stats.uniqueSubcommands}${C.reset}`);\n\n\t\t\tif (mine.workflows.length > 0) {\n\t\t\t\tconsole.log(`\\n${C.bold}Workflows you repeat:${C.reset}`);\n\t\t\t\tfor (const wf of mine.workflows.slice(0, 5)) {\n\t\t\t\t\tconst chain = wf.path[0]!.map(p => `${C.green}${p}${C.reset}`).join(` ${C.gray}→${C.reset} `);\n\t\t\t\t\tconsole.log(` ${chain} ${C.dim}(${wf.support}×)${C.reset}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (mine.suggestions.length > 0) {\n\t\t\t\tconsole.log(`\\n${C.bold}${C.yellow}💡 Skill suggestions:${C.reset}`);\n\t\t\t\tfor (const s of mine.suggestions.slice(0, 3)) {\n\t\t\t\t\tconsole.log(` ${C.bold}/${s.name}${C.reset} — ${s.description}`);\n\t\t\t\t\tconsole.log(` ${C.dim}${s.reason}${C.reset}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconsole.log();\n\t\tconsole.log(`${C.dim}Install the clitree skill for full LLM archaeology:${C.reset}`);\n\t\tconsole.log(`${C.dim} bash ./skill/install.sh${C.reset}`);\n\t\tconsole.log();\n\t} catch (err: any) {\n\t\tconsole.error(`${C.red}Error: ${err.message}${C.reset}`);\n\t\tprocess.exit(1);\n\t}\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "327F345E39F9947A64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/miner/index.js
CHANGED
|
@@ -5,11 +5,23 @@
|
|
|
5
5
|
* clitree stays as a single focused package. The logic is trivial: bucket each
|
|
6
6
|
* value into one of 8 block characters (▁▂▃▄▅▆▇█), with a distinct marker
|
|
7
7
|
* for zero values so absence is visible at a glance.
|
|
8
|
+
*
|
|
9
|
+
* Design note on the zero character:
|
|
10
|
+
* The Unicode middle dot (·, U+00B7) is centered vertically in most monospace
|
|
11
|
+
* fonts, which makes it float visually in the middle of the line while the
|
|
12
|
+
* block glyphs sit at the baseline — ugly and confusing.
|
|
13
|
+
*
|
|
14
|
+
* We default to "░" (U+2591, light shade). It fills the full character cell
|
|
15
|
+
* with a 25% dotted texture, so it's visually distinct from the solid
|
|
16
|
+
* block glyphs but still anchors to the same cell height. Empty slots read
|
|
17
|
+
* as "no data" (texture) vs populated slots as "bar" (solid) at a glance.
|
|
8
18
|
*/
|
|
9
19
|
export interface SparklineOptions {
|
|
10
20
|
/**
|
|
11
|
-
* Character used for zero values. Defaults to "
|
|
12
|
-
*
|
|
21
|
+
* Character used for zero values. Defaults to "░" (U+2591 light shade)
|
|
22
|
+
* which fills the full cell with a dotted texture — visually distinct
|
|
23
|
+
* from solid blocks but still anchored to the same cell dimensions.
|
|
24
|
+
* Pass " " for truly blank, "." for a baseline dot, etc.
|
|
13
25
|
*/
|
|
14
26
|
zero?: string;
|
|
15
27
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crafter/cli-tree",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Explore and map any CLI tool deeply. Parse --help trees, mine shell history for repeated workflows, surface hidden flags via LLM archaeology, and suggest new agent skills from your usage patterns.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
package/src/cli.ts
CHANGED
|
@@ -669,7 +669,7 @@ function renderActivitySection(
|
|
|
669
669
|
|
|
670
670
|
// Hour-of-day sparkline (24 chars wide — one per hour)
|
|
671
671
|
const hourSpark = sparkline(activity.hourOfDay);
|
|
672
|
-
console.log(` ${C.dim}Hour of day:${C.reset} ${C.cyan}${hourSpark}${C.reset} ${C.dim}0h
|
|
672
|
+
console.log(` ${C.dim}Hour of day:${C.reset} ${C.cyan}${hourSpark}${C.reset} ${C.dim}0h ── 23h${C.reset}`);
|
|
673
673
|
|
|
674
674
|
// Day-of-week mini bars
|
|
675
675
|
const dowMax = Math.max(...activity.dayOfWeek);
|
package/src/miner/sparkline.ts
CHANGED
|
@@ -5,21 +5,33 @@
|
|
|
5
5
|
* clitree stays as a single focused package. The logic is trivial: bucket each
|
|
6
6
|
* value into one of 8 block characters (▁▂▃▄▅▆▇█), with a distinct marker
|
|
7
7
|
* for zero values so absence is visible at a glance.
|
|
8
|
+
*
|
|
9
|
+
* Design note on the zero character:
|
|
10
|
+
* The Unicode middle dot (·, U+00B7) is centered vertically in most monospace
|
|
11
|
+
* fonts, which makes it float visually in the middle of the line while the
|
|
12
|
+
* block glyphs sit at the baseline — ugly and confusing.
|
|
13
|
+
*
|
|
14
|
+
* We default to "░" (U+2591, light shade). It fills the full character cell
|
|
15
|
+
* with a 25% dotted texture, so it's visually distinct from the solid
|
|
16
|
+
* block glyphs but still anchors to the same cell height. Empty slots read
|
|
17
|
+
* as "no data" (texture) vs populated slots as "bar" (solid) at a glance.
|
|
8
18
|
*/
|
|
9
19
|
|
|
10
20
|
const BLOCKS = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"] as const;
|
|
11
21
|
|
|
12
22
|
export interface SparklineOptions {
|
|
13
23
|
/**
|
|
14
|
-
* Character used for zero values. Defaults to "
|
|
15
|
-
*
|
|
24
|
+
* Character used for zero values. Defaults to "░" (U+2591 light shade)
|
|
25
|
+
* which fills the full cell with a dotted texture — visually distinct
|
|
26
|
+
* from solid blocks but still anchored to the same cell dimensions.
|
|
27
|
+
* Pass " " for truly blank, "." for a baseline dot, etc.
|
|
16
28
|
*/
|
|
17
29
|
zero?: string;
|
|
18
30
|
}
|
|
19
31
|
|
|
20
32
|
export function sparkline(data: number[], opts: SparklineOptions = {}): string {
|
|
21
33
|
if (data.length === 0) return "";
|
|
22
|
-
const zero = opts.zero ?? "
|
|
34
|
+
const zero = opts.zero ?? "░";
|
|
23
35
|
const max = Math.max(...data);
|
|
24
36
|
if (max === 0) return zero.repeat(data.length);
|
|
25
37
|
|