@crafter/cli-tree 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-k5enbxc9.js → chunk-989emnd7.js} +2 -53
- package/dist/{chunk-k5enbxc9.js.map → chunk-989emnd7.js.map} +4 -5
- package/dist/cli.js +67 -13
- package/dist/cli.js.map +6 -4
- package/dist/miner/index.d.ts +1 -2
- package/dist/miner/index.js +2 -8
- package/dist/miner/index.js.map +1 -1
- package/package.json +4 -1
- package/src/cli.ts +14 -16
- package/src/miner/index.ts +0 -4
- package/dist/miner/sparkline.d.ts +0 -52
- package/src/miner/sparkline.ts +0 -114
|
@@ -485,57 +485,6 @@ function formatTimeRange(firstSeen, lastSeen) {
|
|
|
485
485
|
return `${(days / 365).toFixed(1)} years`;
|
|
486
486
|
}
|
|
487
487
|
|
|
488
|
-
// src/miner/sparkline.ts
|
|
489
|
-
var BLOCKS = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"];
|
|
490
|
-
function sparkline(data, opts = {}) {
|
|
491
|
-
if (data.length === 0)
|
|
492
|
-
return "";
|
|
493
|
-
const zero = opts.zero ?? "░";
|
|
494
|
-
const max = Math.max(...data);
|
|
495
|
-
if (max === 0)
|
|
496
|
-
return zero.repeat(data.length);
|
|
497
|
-
return data.map((value) => {
|
|
498
|
-
if (value === 0)
|
|
499
|
-
return zero;
|
|
500
|
-
const idx = Math.min(BLOCKS.length - 1, Math.max(0, Math.round(value / max * (BLOCKS.length - 1))));
|
|
501
|
-
return BLOCKS[idx];
|
|
502
|
-
}).join("");
|
|
503
|
-
}
|
|
504
|
-
function sparkline2d(data, opts = {}) {
|
|
505
|
-
if (data.length === 0)
|
|
506
|
-
return { top: "", bottom: "" };
|
|
507
|
-
const zero = opts.zero ?? "░";
|
|
508
|
-
const max = Math.max(...data);
|
|
509
|
-
if (max === 0) {
|
|
510
|
-
const row = zero.repeat(data.length);
|
|
511
|
-
return { top: row, bottom: row };
|
|
512
|
-
}
|
|
513
|
-
const topGlyphs = ["▁", "▃", "▅", "█"];
|
|
514
|
-
const bottomGlyphs = ["▁", "▃", "▅", "▇"];
|
|
515
|
-
let top = "";
|
|
516
|
-
let bottom = "";
|
|
517
|
-
for (const value of data) {
|
|
518
|
-
if (value === 0) {
|
|
519
|
-
top += zero;
|
|
520
|
-
bottom += zero;
|
|
521
|
-
continue;
|
|
522
|
-
}
|
|
523
|
-
const level = Math.min(8, Math.max(1, Math.round(value / max * 8)));
|
|
524
|
-
if (level <= 4) {
|
|
525
|
-
top += zero;
|
|
526
|
-
bottom += bottomGlyphs[level - 1];
|
|
527
|
-
} else {
|
|
528
|
-
bottom += "█";
|
|
529
|
-
const topLevel = level - 4;
|
|
530
|
-
top += topGlyphs[topLevel - 1];
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
return { top, bottom };
|
|
534
|
-
}
|
|
535
|
-
function labeledSparkline(label, data, labelWidth = 3) {
|
|
536
|
-
return `${label.padEnd(labelWidth)} ${sparkline(data)}`;
|
|
537
|
-
}
|
|
538
|
-
|
|
539
488
|
// src/miner/cross-cli.ts
|
|
540
489
|
var DEFAULT_IGNORE = new Set([
|
|
541
490
|
"ls",
|
|
@@ -715,6 +664,6 @@ async function mineCli(cli, options = {}) {
|
|
|
715
664
|
};
|
|
716
665
|
}
|
|
717
666
|
|
|
718
|
-
export { readHistoryFile, detectHistoryFormat, parseHistory, tokenize, defaultHistoryPath, segmentSessions, filterByCli, extractSubcommand, extractSubcommandPath, buildTransitions, normalizeTransitions, extractPaths, clusterIntoWorkflows, computeStats, suggestSkills, minedToFlowWorkflow, computeActivity, formatTimeRange,
|
|
667
|
+
export { readHistoryFile, detectHistoryFormat, parseHistory, tokenize, defaultHistoryPath, segmentSessions, filterByCli, extractSubcommand, extractSubcommandPath, buildTransitions, normalizeTransitions, extractPaths, clusterIntoWorkflows, computeStats, suggestSkills, minedToFlowWorkflow, computeActivity, formatTimeRange, mineCrossCli, crossCliToFlowWorkflow, mineCli };
|
|
719
668
|
|
|
720
|
-
//# debugId=
|
|
669
|
+
//# debugId=7491EC0F64B0339E64756E2164756E21
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/miner/history.ts", "../src/miner/sessions.ts", "../src/miner/transitions.ts", "../src/miner/workflows.ts", "../src/miner/stats.ts", "../src/miner/suggest.ts", "../src/miner/to-flow.ts", "../src/miner/activity.ts", "../src/miner/
|
|
3
|
+
"sources": ["../src/miner/history.ts", "../src/miner/sessions.ts", "../src/miner/transitions.ts", "../src/miner/workflows.ts", "../src/miner/stats.ts", "../src/miner/suggest.ts", "../src/miner/to-flow.ts", "../src/miner/activity.ts", "../src/miner/cross-cli.ts", "../src/miner/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import type { HistoryEntry } from \"./types\";\n\nexport async function readHistoryFile(path: string): Promise<string> {\n\treturn await Bun.file(path).text();\n}\n\nexport function detectHistoryFormat(text: string): \"zsh-extended\" | \"bash\" | \"fish\" | \"unknown\" {\n\tconst firstNonEmpty = text.split(\"\\n\").find(l => l.trim().length > 0);\n\tif (!firstNonEmpty) return \"unknown\";\n\tif (/^: \\d+:\\d+;/.test(firstNonEmpty)) return \"zsh-extended\";\n\tif (/^- cmd: /.test(firstNonEmpty)) return \"fish\";\n\treturn \"bash\";\n}\n\nexport function parseHistory(text: string): HistoryEntry[] {\n\tconst format = detectHistoryFormat(text);\n\tswitch (format) {\n\t\tcase \"zsh-extended\":\n\t\t\treturn parseZshExtended(text);\n\t\tcase \"fish\":\n\t\t\treturn parseFishHistory(text);\n\t\tcase \"bash\":\n\t\tdefault:\n\t\t\treturn parseBashHistory(text);\n\t}\n}\n\nfunction parseZshExtended(text: string): HistoryEntry[] {\n\tconst entries: HistoryEntry[] = [];\n\tconst lines = text.split(\"\\n\");\n\n\tlet pending: { timestamp: number; cmd: string } | null = null;\n\n\tfor (const rawLine of lines) {\n\t\tconst match = rawLine.match(/^: (\\d+):\\d+;(.*)$/);\n\t\tif (match) {\n\t\t\tif (pending) {\n\t\t\t\tentries.push(buildEntry(pending.timestamp, pending.cmd));\n\t\t\t}\n\t\t\tpending = { timestamp: Number.parseInt(match[1]!, 10), cmd: match[2]! };\n\t\t} else if (pending) {\n\t\t\tpending.cmd += \"\\n\" + rawLine;\n\t\t}\n\t}\n\n\tif (pending) {\n\t\tentries.push(buildEntry(pending.timestamp, pending.cmd));\n\t}\n\n\treturn entries.filter(e => e.argv.length > 0);\n}\n\nfunction parseBashHistory(text: string): HistoryEntry[] {\n\tconst entries: HistoryEntry[] = [];\n\tconst lines = text.split(\"\\n\");\n\tlet currentTimestamp = 0;\n\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed) continue;\n\n\t\tif (/^#\\d+$/.test(trimmed)) {\n\t\t\tcurrentTimestamp = Number.parseInt(trimmed.slice(1), 10);\n\t\t\tcontinue;\n\t\t}\n\n\t\tentries.push(buildEntry(currentTimestamp, trimmed));\n\t}\n\n\treturn entries.filter(e => e.argv.length > 0);\n}\n\nfunction parseFishHistory(text: string): HistoryEntry[] {\n\tconst entries: HistoryEntry[] = [];\n\tconst blocks = text.split(/\\n(?=- cmd: )/);\n\n\tfor (const block of blocks) {\n\t\tconst cmdMatch = block.match(/- cmd: (.*)/);\n\t\tconst whenMatch = block.match(/when: (\\d+)/);\n\t\tif (!cmdMatch) continue;\n\t\tconst timestamp = whenMatch ? Number.parseInt(whenMatch[1]!, 10) : 0;\n\t\tentries.push(buildEntry(timestamp, cmdMatch[1]!));\n\t}\n\n\treturn entries.filter(e => e.argv.length > 0);\n}\n\nfunction buildEntry(timestamp: number, rawCmd: string): HistoryEntry {\n\tconst cleaned = stripContinuations(rawCmd).trim();\n\tconst argv = tokenize(cleaned);\n\treturn { timestamp, raw: cleaned, argv };\n}\n\nfunction stripContinuations(cmd: string): string {\n\treturn cmd.replace(/\\\\\\n/g, \" \").replace(/\\n\\s*/g, \" \");\n}\n\nexport function tokenize(cmd: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet inSingle = false;\n\tlet inDouble = false;\n\tlet escape = false;\n\n\tfor (let i = 0; i < cmd.length; i++) {\n\t\tconst ch = cmd[i]!;\n\t\tif (escape) {\n\t\t\tcurrent += ch;\n\t\t\tescape = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\\\\" && !inSingle) {\n\t\t\tescape = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"'\" && !inDouble) {\n\t\t\tinSingle = !inSingle;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === '\"' && !inSingle) {\n\t\t\tinDouble = !inDouble;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/\\s/.test(ch) && !inSingle && !inDouble) {\n\t\t\tif (current) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif ((ch === \"|\" || ch === \";\" || ch === \"&\") && !inSingle && !inDouble) {\n\t\t\tif (current) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\treturn tokens;\n\t\t}\n\t\tcurrent += ch;\n\t}\n\n\tif (current) tokens.push(current);\n\treturn tokens;\n}\n\nexport function defaultHistoryPath(): string | null {\n\tconst home = process.env.HOME ?? \"\";\n\tif (!home) return null;\n\n\tconst candidates = [\n\t\t`${home}/.zsh_history`,\n\t\t`${home}/.bash_history`,\n\t\t`${home}/.config/fish/fish_history`,\n\t];\n\n\treturn candidates[0] ?? null;\n}\n",
|
|
6
6
|
"import type { HistoryEntry, Session } from \"./types\";\n\nexport function segmentSessions(entries: HistoryEntry[], gapMinutes = 10): Session[] {\n\tif (entries.length === 0) return [];\n\n\tconst sorted = [...entries].sort((a, b) => a.timestamp - b.timestamp);\n\tconst gapSeconds = gapMinutes * 60;\n\tconst sessions: Session[] = [];\n\n\tlet current: HistoryEntry[] = [sorted[0]!];\n\tlet sessionStart = sorted[0]!.timestamp;\n\tlet lastTimestamp = sorted[0]!.timestamp;\n\n\tfor (let i = 1; i < sorted.length; i++) {\n\t\tconst entry = sorted[i]!;\n\t\tconst gap = entry.timestamp - lastTimestamp;\n\n\t\tif (gap > gapSeconds) {\n\t\t\tsessions.push({ start: sessionStart, end: lastTimestamp, entries: current });\n\t\t\tcurrent = [entry];\n\t\t\tsessionStart = entry.timestamp;\n\t\t} else {\n\t\t\tcurrent.push(entry);\n\t\t}\n\t\tlastTimestamp = entry.timestamp;\n\t}\n\n\tsessions.push({ start: sessionStart, end: lastTimestamp, entries: current });\n\treturn sessions;\n}\n\nexport function filterByCli(sessions: Session[], cli: string): Session[] {\n\treturn sessions\n\t\t.map(session => ({\n\t\t\t...session,\n\t\t\tentries: session.entries.filter(e => e.argv[0] === cli),\n\t\t}))\n\t\t.filter(s => s.entries.length > 0);\n}\n",
|
|
@@ -10,11 +10,10 @@
|
|
|
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 * 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 sparkline across TWO lines so every cell is the same visual height.\n *\n * The single-line `sparkline()` has a subtle problem: block glyphs (▁▂▃...) grow\n * from the baseline upward, leaving the top of the cell empty. When you place\n * them next to \"░\" zero-markers that fill the whole cell, the zeros look like\n * fat rectangles and the active bars look like short stubs floating in gaps —\n * the visual rhythm breaks.\n *\n * This version splits each value across two rows:\n * - Top row shows anything with level ≥ 4 (upper half of the cell filled)\n * - Bottom row shows anything with level ≥ 1 (lower half)\n *\n * The result is a sparkline where every slot is a full-height cell — either\n * two stacked `░` for a zero, two stacked blocks for a full value, or a mix.\n */\nexport function sparkline2d(data: number[], opts: SparklineOptions = {}): { top: string; bottom: string } {\n\tif (data.length === 0) return { top: \"\", bottom: \"\" };\n\tconst zero = opts.zero ?? \"░\";\n\tconst max = Math.max(...data);\n\n\tif (max === 0) {\n\t\tconst row = zero.repeat(data.length);\n\t\treturn { top: row, bottom: row };\n\t}\n\n\t// Each value maps to a level 0-8 where 0 = empty, 8 = fully filled both rows.\n\t// Bottom row renders levels 1-4 as ▁▃▅▇, level ≥ 5 is █ (bottom is full).\n\t// Top row renders levels 5-8 as ▁▃▅█, level < 5 is zero (top is empty).\n\tconst topGlyphs = [\"▁\", \"▃\", \"▅\", \"█\"] as const;\n\tconst bottomGlyphs = [\"▁\", \"▃\", \"▅\", \"▇\"] as const;\n\n\tlet top = \"\";\n\tlet bottom = \"\";\n\n\tfor (const value of data) {\n\t\tif (value === 0) {\n\t\t\ttop += zero;\n\t\t\tbottom += zero;\n\t\t\tcontinue;\n\t\t}\n\t\t// Normalize to level 1-8\n\t\tconst level = Math.min(8, Math.max(1, Math.round((value / max) * 8)));\n\n\t\tif (level <= 4) {\n\t\t\t// Only the bottom cell has content\n\t\t\ttop += zero;\n\t\t\tbottom += bottomGlyphs[level - 1];\n\t\t} else {\n\t\t\t// Bottom is full, top shows the overflow\n\t\t\tbottom += \"█\";\n\t\t\tconst topLevel = level - 4;\n\t\t\ttop += topGlyphs[topLevel - 1];\n\t\t}\n\t}\n\n\treturn { top, bottom };\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
13
|
"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
|
-
"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 {
|
|
14
|
+
"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 { 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\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
15
|
],
|
|
17
|
-
"mappings": "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",
|
|
18
|
-
"debugId": "
|
|
16
|
+
"mappings": "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",
|
|
17
|
+
"debugId": "7491EC0F64B0339E64756E2164756E21",
|
|
19
18
|
"names": []
|
|
20
19
|
}
|
package/dist/cli.js
CHANGED
|
@@ -9,9 +9,8 @@ import {
|
|
|
9
9
|
formatTimeRange,
|
|
10
10
|
mineCli,
|
|
11
11
|
mineCrossCli,
|
|
12
|
-
minedToFlowWorkflow
|
|
13
|
-
|
|
14
|
-
} from "./chunk-k5enbxc9.js";
|
|
12
|
+
minedToFlowWorkflow
|
|
13
|
+
} from "./chunk-989emnd7.js";
|
|
15
14
|
import {
|
|
16
15
|
NullDelegate,
|
|
17
16
|
runArchaeology
|
|
@@ -29,6 +28,64 @@ import {
|
|
|
29
28
|
} from "./chunk-pkfpaae1.js";
|
|
30
29
|
import"./chunk-q4se2rwe.js";
|
|
31
30
|
|
|
31
|
+
// node_modules/@crafter/charts/dist/types.js
|
|
32
|
+
var ANSI_COLORS = {
|
|
33
|
+
red: "\x1B[31m",
|
|
34
|
+
green: "\x1B[32m",
|
|
35
|
+
yellow: "\x1B[33m",
|
|
36
|
+
blue: "\x1B[34m",
|
|
37
|
+
magenta: "\x1B[35m",
|
|
38
|
+
cyan: "\x1B[36m",
|
|
39
|
+
white: "\x1B[37m",
|
|
40
|
+
gray: "\x1B[90m"
|
|
41
|
+
};
|
|
42
|
+
var ANSI_RESET = "\x1B[0m";
|
|
43
|
+
|
|
44
|
+
// node_modules/@crafter/charts/dist/marks/heatmap.js
|
|
45
|
+
var HEAT_CHARS = [" ", "░", "▒", "▓", "█"];
|
|
46
|
+
function sparkHeatmap(data, options = {}) {
|
|
47
|
+
if (data.length === 0)
|
|
48
|
+
return "";
|
|
49
|
+
let min = Number.POSITIVE_INFINITY;
|
|
50
|
+
let max = Number.NEGATIVE_INFINITY;
|
|
51
|
+
for (const row of data) {
|
|
52
|
+
for (const v of row) {
|
|
53
|
+
if (v < min)
|
|
54
|
+
min = v;
|
|
55
|
+
if (v > max)
|
|
56
|
+
max = v;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const range = max - min || 1;
|
|
60
|
+
const cellWidth = Math.max(1, Math.floor(options.cellWidth ?? 2));
|
|
61
|
+
const ramp = options.zero !== undefined ? [options.zero, ...HEAT_CHARS.slice(1)] : HEAT_CHARS;
|
|
62
|
+
const fg = options.color ? ANSI_COLORS[options.color] : null;
|
|
63
|
+
const lines = [];
|
|
64
|
+
const rowLabels = options.labels?.rows;
|
|
65
|
+
const colLabels = options.labels?.cols;
|
|
66
|
+
const labelW = rowLabels ? Math.max(...rowLabels.map((l) => l.length)) + 1 : 0;
|
|
67
|
+
if (colLabels) {
|
|
68
|
+
const header = " ".repeat(labelW) + colLabels.map((l) => l.slice(0, cellWidth).padEnd(cellWidth)).join("");
|
|
69
|
+
lines.push(header);
|
|
70
|
+
}
|
|
71
|
+
for (let r = 0;r < data.length; r++) {
|
|
72
|
+
const row = data[r];
|
|
73
|
+
const prefix = rowLabels?.[r] ? rowLabels[r].padStart(labelW - 1) + " " : "";
|
|
74
|
+
const cells = row.map((v) => {
|
|
75
|
+
const normalized = (v - min) / range;
|
|
76
|
+
const charIdx = Math.round(normalized * (ramp.length - 1));
|
|
77
|
+
return (ramp[charIdx] ?? " ").repeat(cellWidth);
|
|
78
|
+
}).join("");
|
|
79
|
+
if (fg) {
|
|
80
|
+
lines.push(`${prefix}${fg}${cells}${ANSI_RESET}`);
|
|
81
|
+
} else {
|
|
82
|
+
lines.push(`${prefix}${cells}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return lines.join(`
|
|
86
|
+
`);
|
|
87
|
+
}
|
|
88
|
+
|
|
32
89
|
// src/cli.ts
|
|
33
90
|
var args = process.argv.slice(2);
|
|
34
91
|
var subcommand = args[0];
|
|
@@ -614,9 +671,8 @@ function renderActivitySection(activity, C) {
|
|
|
614
671
|
console.log(`${C.bold}Activity:${C.reset} ${C.dim}(blank = no data)${C.reset}`);
|
|
615
672
|
const range = formatTimeRange(activity.firstSeen, activity.lastSeen);
|
|
616
673
|
console.log(` ${C.dim}Tracked over:${C.reset} ${C.cyan}${range}${C.reset} ${C.dim}(${activity.daysWithActivity} active days)${C.reset}`);
|
|
617
|
-
const
|
|
618
|
-
console.log(` ${C.dim}Hour of day:${C.reset} ${C.cyan}${
|
|
619
|
-
console.log(` ${C.cyan}${hourSpark.bottom}${C.reset} ${C.dim}0h ── 23h${C.reset}`);
|
|
674
|
+
const hourRibbon = sparkHeatmap([activity.hourOfDay], { cellWidth: 1, zero: "░" });
|
|
675
|
+
console.log(` ${C.dim}Hour of day:${C.reset} ${C.cyan}${hourRibbon}${C.reset} ${C.dim}0h ── 23h${C.reset}`);
|
|
620
676
|
const dowMax = Math.max(...activity.dayOfWeek);
|
|
621
677
|
if (dowMax > 0) {
|
|
622
678
|
console.log();
|
|
@@ -632,17 +688,15 @@ function renderActivitySection(activity, C) {
|
|
|
632
688
|
console.log();
|
|
633
689
|
const activeDays = activity.last30Days.filter((v) => v > 0).length;
|
|
634
690
|
const totalLast30 = activity.last30Days.reduce((a, b) => a + b, 0);
|
|
635
|
-
const
|
|
636
|
-
console.log(` ${C.dim}Last 30 days:${C.reset} ${C.cyan}${
|
|
637
|
-
console.log(` ${C.cyan}${monthSpark.bottom}${C.reset}`);
|
|
691
|
+
const ribbon = sparkHeatmap([activity.last30Days], { cellWidth: 1, zero: "░" });
|
|
692
|
+
console.log(` ${C.dim}Last 30 days:${C.reset} ${C.cyan}${ribbon}${C.reset}`);
|
|
638
693
|
console.log(` ${C.dim}└── 1 char per day · ${activeDays}/30 active · ${totalLast30} total${C.reset}`);
|
|
639
694
|
}
|
|
640
695
|
if (activity.last52Weeks.some((v) => v > 0)) {
|
|
641
696
|
console.log();
|
|
642
697
|
const activeWeeks = activity.last52Weeks.filter((v) => v > 0).length;
|
|
643
|
-
const
|
|
644
|
-
console.log(` ${C.dim}Last 52 weeks:${C.reset} ${C.cyan}${
|
|
645
|
-
console.log(` ${C.cyan}${weekSpark.bottom}${C.reset}`);
|
|
698
|
+
const ribbon = sparkHeatmap([activity.last52Weeks], { cellWidth: 1, zero: "░" });
|
|
699
|
+
console.log(` ${C.dim}Last 52 weeks:${C.reset} ${C.cyan}${ribbon}${C.reset}`);
|
|
646
700
|
console.log(` ${C.dim}└── 1 char per week · ${activeWeeks}/52 active weeks${C.reset}`);
|
|
647
701
|
}
|
|
648
702
|
console.log();
|
|
@@ -816,4 +870,4 @@ ${C.bold}${C.yellow}\uD83D\uDCA1 Skill suggestions:${C.reset}`);
|
|
|
816
870
|
}
|
|
817
871
|
}
|
|
818
872
|
|
|
819
|
-
//# debugId=
|
|
873
|
+
//# debugId=A4B75540385072D464756E2164756E21
|
package/dist/cli.js.map
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/cli.ts"],
|
|
3
|
+
"sources": ["../node_modules/@crafter/charts/dist/types.js", "../node_modules/@crafter/charts/dist/marks/heatmap.js", "../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\tsparkline2d,\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) — 2D render\n\tconst hourSpark = sparkline2d(activity.hourOfDay);\n\tconsole.log(` ${C.dim}Hour of day:${C.reset} ${C.cyan}${hourSpark.top}${C.reset}`);\n\tconsole.log(` ${C.cyan}${hourSpark.bottom}${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();\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}\n\n\t// Last 30 days — 2D render so every cell has the same visual height\n\tif (activity.last30Days.some(v => v > 0)) {\n\t\tconsole.log();\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 = sparkline2d(activity.last30Days);\n\t\tconsole.log(` ${C.dim}Last 30 days:${C.reset} ${C.cyan}${monthSpark.top}${C.reset}`);\n\t\tconsole.log(` ${C.cyan}${monthSpark.bottom}${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\tconsole.log();\n\t\tconst activeWeeks = activity.last52Weeks.filter(v => v > 0).length;\n\t\tconst weekSpark = sparkline2d(activity.last52Weeks);\n\t\tconsole.log(` ${C.dim}Last 52 weeks:${C.reset} ${C.cyan}${weekSpark.top}${C.reset}`);\n\t\tconsole.log(` ${C.cyan}${weekSpark.bottom}${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
|
+
"export const ANSI_COLORS = {\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n gray: \"\\x1b[90m\",\n};\nexport const ANSI_RESET = \"\\x1b[0m\";\n",
|
|
6
|
+
"import { ANSI_COLORS, ANSI_RESET } from \"../types\";\n/**\n * Default 5-step density ramp. Position 0 is reserved for \"value at min\" (often\n * zero) and uses a blank space so the chart area reads as empty when data is\n * sparse. Use `zero: \"░\"` to make empty cells visible when you want the whole\n * chart area to have a visual presence (e.g. activity heatmaps where absence\n * is meaningful).\n */\nconst HEAT_CHARS = [\" \", \"░\", \"▒\", \"▓\", \"█\"];\nexport function renderHeatmap(grid, data, plotArea, fg) {\n if (data.length === 0)\n return;\n const rows = data.length;\n const cols = Math.max(...data.map((r) => r.length));\n if (cols === 0)\n return;\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n for (const row of data) {\n for (const v of row) {\n if (v < min)\n min = v;\n if (v > max)\n max = v;\n }\n }\n const range = max - min || 1;\n const cellW = Math.max(1, Math.floor(plotArea.w / cols));\n const cellH = Math.max(1, Math.floor(plotArea.h / rows));\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const v = data[r]?.[c] ?? 0;\n const normalized = (v - min) / range;\n const charIdx = Math.round(normalized * (HEAT_CHARS.length - 1));\n const ch = HEAT_CHARS[charIdx] ?? \" \";\n for (let dy = 0; dy < cellH && plotArea.y + r * cellH + dy < plotArea.y + plotArea.h; dy++) {\n for (let dx = 0; dx < cellW && plotArea.x + c * cellW + dx < plotArea.x + plotArea.w; dx++) {\n grid.set(plotArea.x + c * cellW + dx, plotArea.y + r * cellH + dy, ch, fg);\n }\n }\n }\n }\n}\nexport function sparkHeatmap(data, options = {}) {\n if (data.length === 0)\n return \"\";\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n for (const row of data) {\n for (const v of row) {\n if (v < min)\n min = v;\n if (v > max)\n max = v;\n }\n }\n const range = max - min || 1;\n const cellWidth = Math.max(1, Math.floor(options.cellWidth ?? 2));\n // Build the ramp. If the caller provided a zero char, substitute it in the\n // lowest slot so empty data is visible instead of blank.\n const ramp = options.zero !== undefined\n ? [options.zero, ...HEAT_CHARS.slice(1)]\n : HEAT_CHARS;\n const fg = options.color ? ANSI_COLORS[options.color] : null;\n const lines = [];\n const rowLabels = options.labels?.rows;\n const colLabels = options.labels?.cols;\n const labelW = rowLabels ? Math.max(...rowLabels.map((l) => l.length)) + 1 : 0;\n if (colLabels) {\n const header = \" \".repeat(labelW) + colLabels.map((l) => l.slice(0, cellWidth).padEnd(cellWidth)).join(\"\");\n lines.push(header);\n }\n for (let r = 0; r < data.length; r++) {\n const row = data[r];\n const prefix = rowLabels?.[r] ? (rowLabels[r]).padStart(labelW - 1) + \" \" : \"\";\n const cells = row.map((v) => {\n const normalized = (v - min) / range;\n const charIdx = Math.round(normalized * (ramp.length - 1));\n return (ramp[charIdx] ?? \" \").repeat(cellWidth);\n }).join(\"\");\n if (fg) {\n lines.push(`${prefix}${fg}${cells}${ANSI_RESET}`);\n }\n else {\n lines.push(`${prefix}${cells}`);\n }\n }\n return lines.join(\"\\n\");\n}\n",
|
|
7
|
+
"#!/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 { sparkHeatmap } from \"@crafter/charts\";\nimport {\n\tmineCli,\n\tminedToFlowWorkflow,\n\tmineCrossCli,\n\tcrossCliToFlowWorkflow,\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 density ribbon (24 chars wide — one per hour).\n\t// Using sparkHeatmap with single-row data + cellWidth=1 + zero='░' gives\n\t// us gap-free rendering: zero hours look like texture, active hours\n\t// progress through the density ramp (░▒▓█) without leaving black holes.\n\tconst hourRibbon = sparkHeatmap([activity.hourOfDay], { cellWidth: 1, zero: \"░\" });\n\tconsole.log(` ${C.dim}Hour of day:${C.reset} ${C.cyan}${hourRibbon}${C.reset} ${C.dim}0h ── 23h${C.reset}`);\n\n\t// Day-of-week mini bars (solid bars are fine here — plenty of room)\n\tconst dowMax = Math.max(...activity.dayOfWeek);\n\tif (dowMax > 0) {\n\t\tconsole.log();\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}\n\n\t// Last 30 days density ribbon\n\tif (activity.last30Days.some(v => v > 0)) {\n\t\tconsole.log();\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 ribbon = sparkHeatmap([activity.last30Days], { cellWidth: 1, zero: \"░\" });\n\t\tconsole.log(` ${C.dim}Last 30 days:${C.reset} ${C.cyan}${ribbon}${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 density ribbon\n\tif (activity.last52Weeks.some(v => v > 0)) {\n\t\tconsole.log();\n\t\tconst activeWeeks = activity.last52Weeks.filter(v => v > 0).length;\n\t\tconst ribbon = sparkHeatmap([activity.last52Weeks], { cellWidth: 1, zero: \"░\" });\n\t\tconsole.log(` ${C.dim}Last 52 weeks:${C.reset} ${C.cyan}${ribbon}${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
8
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "A4B75540385072D464756E2164756E21",
|
|
9
11
|
"names": []
|
|
10
12
|
}
|
package/dist/miner/index.d.ts
CHANGED
|
@@ -6,11 +6,10 @@ import { computeStats } from "./stats";
|
|
|
6
6
|
import { suggestSkills, type SkillSuggestion } from "./suggest";
|
|
7
7
|
import { minedToFlowWorkflow } from "./to-flow";
|
|
8
8
|
import { computeActivity, formatTimeRange, type ActivityProfile } from "./activity";
|
|
9
|
-
import { sparkline, labeledSparkline, sparkline2d } from "./sparkline";
|
|
10
9
|
import { mineCrossCli, crossCliToFlowWorkflow, type CrossCliOptions, type CrossCliResult, type CrossCliWorkflow, type CrossCliStep } from "./cross-cli";
|
|
11
10
|
import type { HistoryEntry, Session, Transition, MinedWorkflow, CliUsageStats, MineOptions } from "./types";
|
|
12
11
|
export type { HistoryEntry, Session, Transition, MinedWorkflow, CliUsageStats, MineOptions, SkillSuggestion, ActivityProfile, CrossCliOptions, CrossCliResult, CrossCliWorkflow, CrossCliStep, };
|
|
13
|
-
export { parseHistory, readHistoryFile, defaultHistoryPath, tokenize, detectHistoryFormat, segmentSessions, filterByCli, buildTransitions, normalizeTransitions, extractSubcommand, extractSubcommandPath, extractPaths, clusterIntoWorkflows, computeStats, suggestSkills, minedToFlowWorkflow, computeActivity, formatTimeRange,
|
|
12
|
+
export { parseHistory, readHistoryFile, defaultHistoryPath, tokenize, detectHistoryFormat, segmentSessions, filterByCli, buildTransitions, normalizeTransitions, extractSubcommand, extractSubcommandPath, extractPaths, clusterIntoWorkflows, computeStats, suggestSkills, minedToFlowWorkflow, computeActivity, formatTimeRange, mineCrossCli, crossCliToFlowWorkflow, };
|
|
14
13
|
export interface MineResult {
|
|
15
14
|
cli: string;
|
|
16
15
|
stats: CliUsageStats;
|
package/dist/miner/index.js
CHANGED
|
@@ -11,7 +11,6 @@ import {
|
|
|
11
11
|
extractSubcommandPath,
|
|
12
12
|
filterByCli,
|
|
13
13
|
formatTimeRange,
|
|
14
|
-
labeledSparkline,
|
|
15
14
|
mineCli,
|
|
16
15
|
mineCrossCli,
|
|
17
16
|
minedToFlowWorkflow,
|
|
@@ -19,16 +18,12 @@ import {
|
|
|
19
18
|
parseHistory,
|
|
20
19
|
readHistoryFile,
|
|
21
20
|
segmentSessions,
|
|
22
|
-
sparkline,
|
|
23
|
-
sparkline2d,
|
|
24
21
|
suggestSkills,
|
|
25
22
|
tokenize
|
|
26
|
-
} from "../chunk-
|
|
23
|
+
} from "../chunk-989emnd7.js";
|
|
27
24
|
export {
|
|
28
25
|
tokenize,
|
|
29
26
|
suggestSkills,
|
|
30
|
-
sparkline2d,
|
|
31
|
-
sparkline,
|
|
32
27
|
segmentSessions,
|
|
33
28
|
readHistoryFile,
|
|
34
29
|
parseHistory,
|
|
@@ -36,7 +31,6 @@ export {
|
|
|
36
31
|
minedToFlowWorkflow,
|
|
37
32
|
mineCrossCli,
|
|
38
33
|
mineCli,
|
|
39
|
-
labeledSparkline,
|
|
40
34
|
formatTimeRange,
|
|
41
35
|
filterByCli,
|
|
42
36
|
extractSubcommandPath,
|
|
@@ -51,4 +45,4 @@ export {
|
|
|
51
45
|
buildTransitions
|
|
52
46
|
};
|
|
53
47
|
|
|
54
|
-
//# debugId=
|
|
48
|
+
//# debugId=E248D7CBE4DBE1B564756E2164756E21
|
package/dist/miner/index.js.map
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crafter/cli-tree",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
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",
|
|
@@ -81,5 +81,8 @@
|
|
|
81
81
|
},
|
|
82
82
|
"peerDependencies": {
|
|
83
83
|
"typescript": "^5"
|
|
84
|
+
},
|
|
85
|
+
"dependencies": {
|
|
86
|
+
"@crafter/charts": "0.2.0"
|
|
84
87
|
}
|
|
85
88
|
}
|
package/src/cli.ts
CHANGED
|
@@ -4,14 +4,12 @@ import { printTree, treeToString, treeToHtml } from "./index";
|
|
|
4
4
|
import type { TreeOptions } from "./types";
|
|
5
5
|
import { parseWorkflow, validateWorkflow, flowToAnsi, flowToString, flowToHtml } from "./flow";
|
|
6
6
|
import type { FlowRenderOptions } from "./flow/types";
|
|
7
|
+
import { sparkHeatmap } from "@crafter/charts";
|
|
7
8
|
import {
|
|
8
9
|
mineCli,
|
|
9
10
|
minedToFlowWorkflow,
|
|
10
11
|
mineCrossCli,
|
|
11
12
|
crossCliToFlowWorkflow,
|
|
12
|
-
sparkline,
|
|
13
|
-
labeledSparkline,
|
|
14
|
-
sparkline2d,
|
|
15
13
|
formatTimeRange,
|
|
16
14
|
} from "./miner";
|
|
17
15
|
import { runArchaeology, NullDelegate } from "./archaeology";
|
|
@@ -668,12 +666,14 @@ function renderActivitySection(
|
|
|
668
666
|
const range = formatTimeRange(activity.firstSeen, activity.lastSeen);
|
|
669
667
|
console.log(` ${C.dim}Tracked over:${C.reset} ${C.cyan}${range}${C.reset} ${C.dim}(${activity.daysWithActivity} active days)${C.reset}`);
|
|
670
668
|
|
|
671
|
-
// Hour-of-day
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
669
|
+
// Hour-of-day density ribbon (24 chars wide — one per hour).
|
|
670
|
+
// Using sparkHeatmap with single-row data + cellWidth=1 + zero='░' gives
|
|
671
|
+
// us gap-free rendering: zero hours look like texture, active hours
|
|
672
|
+
// progress through the density ramp (░▒▓█) without leaving black holes.
|
|
673
|
+
const hourRibbon = sparkHeatmap([activity.hourOfDay], { cellWidth: 1, zero: "░" });
|
|
674
|
+
console.log(` ${C.dim}Hour of day:${C.reset} ${C.cyan}${hourRibbon}${C.reset} ${C.dim}0h ── 23h${C.reset}`);
|
|
675
675
|
|
|
676
|
-
// Day-of-week mini bars
|
|
676
|
+
// Day-of-week mini bars (solid bars are fine here — plenty of room)
|
|
677
677
|
const dowMax = Math.max(...activity.dayOfWeek);
|
|
678
678
|
if (dowMax > 0) {
|
|
679
679
|
console.log();
|
|
@@ -686,24 +686,22 @@ function renderActivitySection(
|
|
|
686
686
|
}
|
|
687
687
|
}
|
|
688
688
|
|
|
689
|
-
// Last 30 days
|
|
689
|
+
// Last 30 days density ribbon
|
|
690
690
|
if (activity.last30Days.some(v => v > 0)) {
|
|
691
691
|
console.log();
|
|
692
692
|
const activeDays = activity.last30Days.filter(v => v > 0).length;
|
|
693
693
|
const totalLast30 = activity.last30Days.reduce((a, b) => a + b, 0);
|
|
694
|
-
const
|
|
695
|
-
console.log(` ${C.dim}Last 30 days:${C.reset} ${C.cyan}${
|
|
696
|
-
console.log(` ${C.cyan}${monthSpark.bottom}${C.reset}`);
|
|
694
|
+
const ribbon = sparkHeatmap([activity.last30Days], { cellWidth: 1, zero: "░" });
|
|
695
|
+
console.log(` ${C.dim}Last 30 days:${C.reset} ${C.cyan}${ribbon}${C.reset}`);
|
|
697
696
|
console.log(` ${C.dim}└── 1 char per day · ${activeDays}/30 active · ${totalLast30} total${C.reset}`);
|
|
698
697
|
}
|
|
699
698
|
|
|
700
|
-
// Last 52 weeks
|
|
699
|
+
// Last 52 weeks density ribbon
|
|
701
700
|
if (activity.last52Weeks.some(v => v > 0)) {
|
|
702
701
|
console.log();
|
|
703
702
|
const activeWeeks = activity.last52Weeks.filter(v => v > 0).length;
|
|
704
|
-
const
|
|
705
|
-
console.log(` ${C.dim}Last 52 weeks:${C.reset} ${C.cyan}${
|
|
706
|
-
console.log(` ${C.cyan}${weekSpark.bottom}${C.reset}`);
|
|
703
|
+
const ribbon = sparkHeatmap([activity.last52Weeks], { cellWidth: 1, zero: "░" });
|
|
704
|
+
console.log(` ${C.dim}Last 52 weeks:${C.reset} ${C.cyan}${ribbon}${C.reset}`);
|
|
707
705
|
console.log(` ${C.dim}└── 1 char per week · ${activeWeeks}/52 active weeks${C.reset}`);
|
|
708
706
|
}
|
|
709
707
|
|
package/src/miner/index.ts
CHANGED
|
@@ -6,7 +6,6 @@ import { computeStats } from "./stats";
|
|
|
6
6
|
import { suggestSkills, type SkillSuggestion } from "./suggest";
|
|
7
7
|
import { minedToFlowWorkflow } from "./to-flow";
|
|
8
8
|
import { computeActivity, formatTimeRange, type ActivityProfile } from "./activity";
|
|
9
|
-
import { sparkline, labeledSparkline, sparkline2d } from "./sparkline";
|
|
10
9
|
import { mineCrossCli, crossCliToFlowWorkflow, type CrossCliOptions, type CrossCliResult, type CrossCliWorkflow, type CrossCliStep } from "./cross-cli";
|
|
11
10
|
import type { HistoryEntry, Session, Transition, MinedWorkflow, CliUsageStats, MineOptions } from "./types";
|
|
12
11
|
|
|
@@ -43,9 +42,6 @@ export {
|
|
|
43
42
|
minedToFlowWorkflow,
|
|
44
43
|
computeActivity,
|
|
45
44
|
formatTimeRange,
|
|
46
|
-
sparkline,
|
|
47
|
-
labeledSparkline,
|
|
48
|
-
sparkline2d,
|
|
49
45
|
mineCrossCli,
|
|
50
46
|
crossCliToFlowWorkflow,
|
|
51
47
|
};
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal Unicode sparkline for a numeric array.
|
|
3
|
-
*
|
|
4
|
-
* We could depend on @crafter/charts for this, but keeping zero deps means
|
|
5
|
-
* clitree stays as a single focused package. The logic is trivial: bucket each
|
|
6
|
-
* value into one of 8 block characters (▁▂▃▄▅▆▇█), with a distinct marker
|
|
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.
|
|
18
|
-
*/
|
|
19
|
-
export interface SparklineOptions {
|
|
20
|
-
/**
|
|
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.
|
|
25
|
-
*/
|
|
26
|
-
zero?: string;
|
|
27
|
-
}
|
|
28
|
-
export declare function sparkline(data: number[], opts?: SparklineOptions): string;
|
|
29
|
-
/**
|
|
30
|
-
* Render a sparkline across TWO lines so every cell is the same visual height.
|
|
31
|
-
*
|
|
32
|
-
* The single-line `sparkline()` has a subtle problem: block glyphs (▁▂▃...) grow
|
|
33
|
-
* from the baseline upward, leaving the top of the cell empty. When you place
|
|
34
|
-
* them next to "░" zero-markers that fill the whole cell, the zeros look like
|
|
35
|
-
* fat rectangles and the active bars look like short stubs floating in gaps —
|
|
36
|
-
* the visual rhythm breaks.
|
|
37
|
-
*
|
|
38
|
-
* This version splits each value across two rows:
|
|
39
|
-
* - Top row shows anything with level ≥ 4 (upper half of the cell filled)
|
|
40
|
-
* - Bottom row shows anything with level ≥ 1 (lower half)
|
|
41
|
-
*
|
|
42
|
-
* The result is a sparkline where every slot is a full-height cell — either
|
|
43
|
-
* two stacked `░` for a zero, two stacked blocks for a full value, or a mix.
|
|
44
|
-
*/
|
|
45
|
-
export declare function sparkline2d(data: number[], opts?: SparklineOptions): {
|
|
46
|
-
top: string;
|
|
47
|
-
bottom: string;
|
|
48
|
-
};
|
|
49
|
-
/**
|
|
50
|
-
* Render a labeled row like "Mon ▁▃▅█▇▅▃▂" — used for day-of-week activity.
|
|
51
|
-
*/
|
|
52
|
-
export declare function labeledSparkline(label: string, data: number[], labelWidth?: number): string;
|
package/src/miner/sparkline.ts
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal Unicode sparkline for a numeric array.
|
|
3
|
-
*
|
|
4
|
-
* We could depend on @crafter/charts for this, but keeping zero deps means
|
|
5
|
-
* clitree stays as a single focused package. The logic is trivial: bucket each
|
|
6
|
-
* value into one of 8 block characters (▁▂▃▄▅▆▇█), with a distinct marker
|
|
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.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
const BLOCKS = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"] as const;
|
|
21
|
-
|
|
22
|
-
export interface SparklineOptions {
|
|
23
|
-
/**
|
|
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.
|
|
28
|
-
*/
|
|
29
|
-
zero?: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function sparkline(data: number[], opts: SparklineOptions = {}): string {
|
|
33
|
-
if (data.length === 0) return "";
|
|
34
|
-
const zero = opts.zero ?? "░";
|
|
35
|
-
const max = Math.max(...data);
|
|
36
|
-
if (max === 0) return zero.repeat(data.length);
|
|
37
|
-
|
|
38
|
-
return data
|
|
39
|
-
.map(value => {
|
|
40
|
-
if (value === 0) return zero;
|
|
41
|
-
const idx = Math.min(
|
|
42
|
-
BLOCKS.length - 1,
|
|
43
|
-
Math.max(0, Math.round((value / max) * (BLOCKS.length - 1))),
|
|
44
|
-
);
|
|
45
|
-
return BLOCKS[idx];
|
|
46
|
-
})
|
|
47
|
-
.join("");
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Render a sparkline across TWO lines so every cell is the same visual height.
|
|
52
|
-
*
|
|
53
|
-
* The single-line `sparkline()` has a subtle problem: block glyphs (▁▂▃...) grow
|
|
54
|
-
* from the baseline upward, leaving the top of the cell empty. When you place
|
|
55
|
-
* them next to "░" zero-markers that fill the whole cell, the zeros look like
|
|
56
|
-
* fat rectangles and the active bars look like short stubs floating in gaps —
|
|
57
|
-
* the visual rhythm breaks.
|
|
58
|
-
*
|
|
59
|
-
* This version splits each value across two rows:
|
|
60
|
-
* - Top row shows anything with level ≥ 4 (upper half of the cell filled)
|
|
61
|
-
* - Bottom row shows anything with level ≥ 1 (lower half)
|
|
62
|
-
*
|
|
63
|
-
* The result is a sparkline where every slot is a full-height cell — either
|
|
64
|
-
* two stacked `░` for a zero, two stacked blocks for a full value, or a mix.
|
|
65
|
-
*/
|
|
66
|
-
export function sparkline2d(data: number[], opts: SparklineOptions = {}): { top: string; bottom: string } {
|
|
67
|
-
if (data.length === 0) return { top: "", bottom: "" };
|
|
68
|
-
const zero = opts.zero ?? "░";
|
|
69
|
-
const max = Math.max(...data);
|
|
70
|
-
|
|
71
|
-
if (max === 0) {
|
|
72
|
-
const row = zero.repeat(data.length);
|
|
73
|
-
return { top: row, bottom: row };
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Each value maps to a level 0-8 where 0 = empty, 8 = fully filled both rows.
|
|
77
|
-
// Bottom row renders levels 1-4 as ▁▃▅▇, level ≥ 5 is █ (bottom is full).
|
|
78
|
-
// Top row renders levels 5-8 as ▁▃▅█, level < 5 is zero (top is empty).
|
|
79
|
-
const topGlyphs = ["▁", "▃", "▅", "█"] as const;
|
|
80
|
-
const bottomGlyphs = ["▁", "▃", "▅", "▇"] as const;
|
|
81
|
-
|
|
82
|
-
let top = "";
|
|
83
|
-
let bottom = "";
|
|
84
|
-
|
|
85
|
-
for (const value of data) {
|
|
86
|
-
if (value === 0) {
|
|
87
|
-
top += zero;
|
|
88
|
-
bottom += zero;
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
// Normalize to level 1-8
|
|
92
|
-
const level = Math.min(8, Math.max(1, Math.round((value / max) * 8)));
|
|
93
|
-
|
|
94
|
-
if (level <= 4) {
|
|
95
|
-
// Only the bottom cell has content
|
|
96
|
-
top += zero;
|
|
97
|
-
bottom += bottomGlyphs[level - 1];
|
|
98
|
-
} else {
|
|
99
|
-
// Bottom is full, top shows the overflow
|
|
100
|
-
bottom += "█";
|
|
101
|
-
const topLevel = level - 4;
|
|
102
|
-
top += topGlyphs[topLevel - 1];
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return { top, bottom };
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Render a labeled row like "Mon ▁▃▅█▇▅▃▂" — used for day-of-week activity.
|
|
111
|
-
*/
|
|
112
|
-
export function labeledSparkline(label: string, data: number[], labelWidth = 3): string {
|
|
113
|
-
return `${label.padEnd(labelWidth)} ${sparkline(data)}`;
|
|
114
|
-
}
|