@crafter/cli-tree 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-57gtsvhb.js → chunk-dnq2rnr7.js} +25 -2
- package/dist/{chunk-57gtsvhb.js.map → chunk-dnq2rnr7.js.map} +5 -4
- package/dist/cli.js +78 -38
- package/dist/cli.js.map +3 -3
- package/dist/miner/index.d.ts +2 -1
- package/dist/miner/index.js +4 -2
- package/dist/miner/index.js.map +1 -1
- package/dist/miner/to-flow.d.ts +12 -0
- package/package.json +1 -1
- package/skill/SKILL.md +27 -13
- package/src/cli.ts +84 -36
- package/src/miner/index.ts +2 -0
- package/src/miner/to-flow.ts +36 -0
|
@@ -401,6 +401,29 @@ function generateReason(frequency, path, stats) {
|
|
|
401
401
|
return `Detected ${frequency} times in your shell history`;
|
|
402
402
|
}
|
|
403
403
|
|
|
404
|
+
// src/miner/to-flow.ts
|
|
405
|
+
function minedToFlowWorkflow(mined, occurrences) {
|
|
406
|
+
const path = mined.path[0] ?? [];
|
|
407
|
+
const label = path.join(" → ");
|
|
408
|
+
const freq = occurrences ?? mined.support;
|
|
409
|
+
const nodes = path.map((sub, idx) => ({
|
|
410
|
+
id: `n${idx}`,
|
|
411
|
+
command: [mined.cli, sub],
|
|
412
|
+
label: sub
|
|
413
|
+
}));
|
|
414
|
+
const edges = [];
|
|
415
|
+
for (let i = 0;i < nodes.length - 1; i++) {
|
|
416
|
+
edges.push({ from: nodes[i].id, to: nodes[i + 1].id });
|
|
417
|
+
}
|
|
418
|
+
return {
|
|
419
|
+
name: label,
|
|
420
|
+
description: `Seen ${freq}× in your shell history`,
|
|
421
|
+
cli: mined.cli,
|
|
422
|
+
nodes,
|
|
423
|
+
edges
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
|
|
404
427
|
// src/miner/index.ts
|
|
405
428
|
async function mineCli(cli, options = {}) {
|
|
406
429
|
const path = options.historyPath ?? defaultHistoryPath();
|
|
@@ -429,6 +452,6 @@ async function mineCli(cli, options = {}) {
|
|
|
429
452
|
};
|
|
430
453
|
}
|
|
431
454
|
|
|
432
|
-
export { readHistoryFile, detectHistoryFormat, parseHistory, tokenize, defaultHistoryPath, segmentSessions, filterByCli, extractSubcommand, extractSubcommandPath, buildTransitions, normalizeTransitions, extractPaths, clusterIntoWorkflows, computeStats, suggestSkills, mineCli };
|
|
455
|
+
export { readHistoryFile, detectHistoryFormat, parseHistory, tokenize, defaultHistoryPath, segmentSessions, filterByCli, extractSubcommand, extractSubcommandPath, buildTransitions, normalizeTransitions, extractPaths, clusterIntoWorkflows, computeStats, suggestSkills, minedToFlowWorkflow, mineCli };
|
|
433
456
|
|
|
434
|
-
//# debugId=
|
|
457
|
+
//# debugId=9D659A5F2CF096F164756E2164756E21
|
|
@@ -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/index.ts"],
|
|
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/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",
|
|
@@ -8,9 +8,10 @@
|
|
|
8
8
|
"import type { Session, MinedWorkflow } from \"./types\";\nimport { extractSubcommand } from \"./transitions\";\n\nexport interface PathCluster {\n\tsignature: string;\n\tpath: string[];\n\toccurrences: number;\n}\n\nexport function extractPaths(\n\tsessions: Session[],\n\tminLength = 2,\n\tmaxLength = 7,\n): PathCluster[] {\n\tconst pathCounts = new Map<string, { path: string[]; count: number }>();\n\n\tfor (const session of sessions) {\n\t\tconst subcommands = session.entries.map(extractSubcommand);\n\t\tconst dedupedConsecutive = dedupeConsecutive(subcommands);\n\n\t\tfor (let start = 0; start < dedupedConsecutive.length; start++) {\n\t\t\tconst maxEnd = Math.min(start + maxLength, dedupedConsecutive.length);\n\t\t\tfor (let end = start + minLength; end <= maxEnd; end++) {\n\t\t\t\tconst slice = dedupedConsecutive.slice(start, end);\n\t\t\t\tconst sig = slice.join(\" → \");\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\treturn Array.from(pathCounts.entries())\n\t\t.map(([signature, { path, count }]) => ({\n\t\t\tsignature,\n\t\t\tpath,\n\t\t\toccurrences: count,\n\t\t}))\n\t\t.sort((a, b) => {\n\t\t\tif (b.occurrences !== a.occurrences) return b.occurrences - a.occurrences;\n\t\t\treturn b.path.length - a.path.length;\n\t\t});\n}\n\nexport function clusterIntoWorkflows(\n\tclusters: PathCluster[],\n\tcli: string,\n\toptions: { minSupport?: number; topK?: number } = {},\n): MinedWorkflow[] {\n\tconst minSupport = options.minSupport ?? 2;\n\tconst topK = options.topK ?? 10;\n\n\tconst filtered = clusters.filter(c => c.occurrences >= minSupport);\n\tconst deduped = removeSubPaths(filtered);\n\n\tconst totalOccurrences = clusters.reduce((sum, c) => sum + c.occurrences, 0) || 1;\n\n\treturn deduped.slice(0, topK).map(cluster => ({\n\t\tname: cluster.path.join(\"-\"),\n\t\tcli,\n\t\tpath: [cluster.path],\n\t\tsupport: cluster.occurrences,\n\t\tconfidence: cluster.occurrences / totalOccurrences,\n\t\tsource: \"history\" as const,\n\t}));\n}\n\nfunction dedupeConsecutive(items: string[]): string[] {\n\tconst result: string[] = [];\n\tfor (const item of items) {\n\t\tif (result.length === 0 || result[result.length - 1] !== item) {\n\t\t\tresult.push(item);\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction removeSubPaths(clusters: PathCluster[]): PathCluster[] {\n\tconst sortedByLength = [...clusters].sort((a, b) => b.path.length - a.path.length);\n\tconst kept: PathCluster[] = [];\n\n\tfor (const cluster of sortedByLength) {\n\t\tconst sig = cluster.signature;\n\t\tconst alreadyCoveredBy = kept.find(k =>\n\t\t\tk.signature.includes(sig) && k.occurrences >= cluster.occurrences * 0.8,\n\t\t);\n\t\tif (!alreadyCoveredBy) {\n\t\t\tkept.push(cluster);\n\t\t}\n\t}\n\n\treturn kept.sort((a, b) => b.occurrences - a.occurrences);\n}\n",
|
|
9
9
|
"import type { HistoryEntry, CliUsageStats, Session } from \"./types\";\nimport { extractSubcommand } from \"./transitions\";\n\nexport function computeStats(entries: HistoryEntry[], sessions: Session[], cli: string): CliUsageStats {\n\tconst cliEntries = entries.filter(e => e.argv[0] === cli);\n\tconst cliSessions = sessions.filter(s => s.entries.some(e => e.argv[0] === cli));\n\n\tconst subcommandCounts = new Map<string, number>();\n\tconst flagCounts = new Map<string, number>();\n\n\tfor (const entry of cliEntries) {\n\t\tconst sub = extractSubcommand(entry);\n\t\tsubcommandCounts.set(sub, (subcommandCounts.get(sub) ?? 0) + 1);\n\n\t\tfor (const arg of entry.argv.slice(1)) {\n\t\t\tif (arg.startsWith(\"--\")) {\n\t\t\t\tconst flag = arg.split(\"=\")[0]!;\n\t\t\t\tflagCounts.set(flag, (flagCounts.get(flag) ?? 0) + 1);\n\t\t\t} else if (arg.startsWith(\"-\") && arg.length === 2) {\n\t\t\t\tflagCounts.set(arg, (flagCounts.get(arg) ?? 0) + 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst topSubcommands = Array.from(subcommandCounts.entries())\n\t\t.map(([subcommand, count]) => ({ subcommand, count }))\n\t\t.sort((a, b) => b.count - a.count)\n\t\t.slice(0, 10);\n\n\tconst topFlags = Array.from(flagCounts.entries())\n\t\t.map(([flag, count]) => ({ flag, count }))\n\t\t.sort((a, b) => b.count - a.count)\n\t\t.slice(0, 10);\n\n\treturn {\n\t\tcli,\n\t\ttotalInvocations: cliEntries.length,\n\t\tuniqueSubcommands: subcommandCounts.size,\n\t\ttopSubcommands,\n\t\ttopFlags,\n\t\tsessionCount: cliSessions.length,\n\t};\n}\n",
|
|
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
|
-
"import {
|
|
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
|
+
"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 type { HistoryEntry, Session, Transition, MinedWorkflow, CliUsageStats, MineOptions } from \"./types\";\n\nexport type { HistoryEntry, Session, Transition, MinedWorkflow, CliUsageStats, MineOptions, SkillSuggestion };\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};\n\nexport interface MineResult {\n\tcli: string;\n\tstats: CliUsageStats;\n\ttransitions: Transition[];\n\tworkflows: MinedWorkflow[];\n\tsuggestions: SkillSuggestion[];\n\tsessionsAnalyzed: number;\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\treturn {\n\t\tcli,\n\t\tstats,\n\t\ttransitions,\n\t\tworkflows,\n\t\tsuggestions,\n\t\tsessionsAnalyzed: cliSessions.length,\n\t};\n}\n"
|
|
12
13
|
],
|
|
13
|
-
"mappings": "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",
|
|
14
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "9D659A5F2CF096F164756E2164756E21",
|
|
15
16
|
"names": []
|
|
16
17
|
}
|
package/dist/cli.js
CHANGED
|
@@ -5,8 +5,9 @@ import {
|
|
|
5
5
|
treeToString
|
|
6
6
|
} from "./chunk-v5w3w6bd.js";
|
|
7
7
|
import {
|
|
8
|
-
mineCli
|
|
9
|
-
|
|
8
|
+
mineCli,
|
|
9
|
+
minedToFlowWorkflow
|
|
10
|
+
} from "./chunk-dnq2rnr7.js";
|
|
10
11
|
import {
|
|
11
12
|
NullDelegate,
|
|
12
13
|
runArchaeology
|
|
@@ -79,44 +80,52 @@ function printMainHelp() {
|
|
|
79
80
|
}
|
|
80
81
|
function printMineHelp() {
|
|
81
82
|
console.log(`
|
|
82
|
-
|
|
83
|
+
clitree mine — Mine your shell history for CLI workflows
|
|
83
84
|
|
|
84
85
|
Usage:
|
|
85
|
-
|
|
86
|
+
clitree mine <binary> [options]
|
|
86
87
|
|
|
87
88
|
Examples:
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
clitree mine git
|
|
90
|
+
clitree mine docker --min-support 5 --with-flow
|
|
91
|
+
clitree mine bun --format json > bun-flows.json
|
|
92
|
+
clitree mine git --no-color | tee report.txt
|
|
91
93
|
|
|
92
94
|
Options:
|
|
93
95
|
--min-support <n> Minimum occurrences to count as a workflow (default: 3)
|
|
94
96
|
--history-path <p> Custom shell history path (default: ~/.zsh_history)
|
|
95
97
|
--format <fmt> Output format: ansi (default), json
|
|
96
98
|
--max-paths <n> Max workflows to show (default: 10)
|
|
99
|
+
--with-flow Always render the top workflow as an ASCII DAG
|
|
100
|
+
--no-flow Never render the DAG (overrides auto-detect)
|
|
101
|
+
--no-color Disable ANSI colors (also auto-disabled when stdout is not a TTY)
|
|
97
102
|
-h, --help Show this help
|
|
103
|
+
|
|
104
|
+
By default, the top workflow is rendered as a DAG only when it has 3+ steps.
|
|
105
|
+
Use --with-flow to force it on even for 2-step chains, or --no-flow to skip.
|
|
98
106
|
`);
|
|
99
107
|
}
|
|
100
108
|
function printArchaeologyHelp() {
|
|
101
109
|
console.log(`
|
|
102
|
-
|
|
110
|
+
clitree archaeology — Full CLI analysis: tree + mining + LLM archaeology
|
|
103
111
|
|
|
104
112
|
Usage:
|
|
105
|
-
|
|
113
|
+
clitree archaeology <binary> [options]
|
|
106
114
|
|
|
107
115
|
When run from the command line without a delegate, only the deterministic
|
|
108
116
|
phases run (help parsing + shell history mining). LLM archaeology requires
|
|
109
117
|
running inside the clitree skill (see ./skill/SKILL.md).
|
|
110
118
|
|
|
111
119
|
Examples:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
120
|
+
clitree archaeology git # help + history
|
|
121
|
+
clitree archaeology docker --no-cache # bypass cache
|
|
122
|
+
clitree archaeology bun --format json # JSON output
|
|
115
123
|
|
|
116
124
|
Options:
|
|
117
125
|
--no-cache Skip cache, always re-run
|
|
118
126
|
--max-depth <n> Max --help recursion depth (default: 2)
|
|
119
127
|
--format <fmt> Output format: ansi (default), json
|
|
128
|
+
--no-color Disable ANSI colors (also auto-disabled when stdout is not a TTY)
|
|
120
129
|
-h, --help Show this help
|
|
121
130
|
`);
|
|
122
131
|
}
|
|
@@ -154,6 +163,7 @@ async function runTree(args2) {
|
|
|
154
163
|
let format = "ansi";
|
|
155
164
|
let stdinName = null;
|
|
156
165
|
let binary = null;
|
|
166
|
+
opts.color = shouldUseColor(args2);
|
|
157
167
|
for (let i = 0;i < args2.length; i++) {
|
|
158
168
|
const arg = args2[i];
|
|
159
169
|
if (arg === "--depth" && args2[i + 1]) {
|
|
@@ -263,12 +273,38 @@ async function readStdin() {
|
|
|
263
273
|
}
|
|
264
274
|
return Buffer.concat(chunks).toString("utf-8");
|
|
265
275
|
}
|
|
276
|
+
function shouldUseColor(args2) {
|
|
277
|
+
if (args2.includes("--no-color"))
|
|
278
|
+
return false;
|
|
279
|
+
if (process.env.NO_COLOR)
|
|
280
|
+
return false;
|
|
281
|
+
if (process.env.FORCE_COLOR)
|
|
282
|
+
return true;
|
|
283
|
+
return !!process.stdout.isTTY;
|
|
284
|
+
}
|
|
285
|
+
function makeColors(enabled) {
|
|
286
|
+
if (!enabled) {
|
|
287
|
+
return { reset: "", bold: "", dim: "", cyan: "", green: "", yellow: "", red: "", magenta: "", gray: "" };
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
reset: "\x1B[0m",
|
|
291
|
+
bold: "\x1B[1m",
|
|
292
|
+
dim: "\x1B[2m",
|
|
293
|
+
cyan: "\x1B[36m",
|
|
294
|
+
green: "\x1B[32m",
|
|
295
|
+
yellow: "\x1B[33m",
|
|
296
|
+
red: "\x1B[31m",
|
|
297
|
+
magenta: "\x1B[35m",
|
|
298
|
+
gray: "\x1B[90m"
|
|
299
|
+
};
|
|
300
|
+
}
|
|
266
301
|
async function runMine(args2) {
|
|
267
302
|
let binary = null;
|
|
268
303
|
let minSupport = 3;
|
|
269
304
|
let historyPath;
|
|
270
305
|
let format = "ansi";
|
|
271
306
|
let maxPaths = 10;
|
|
307
|
+
let withFlow = "auto";
|
|
272
308
|
for (let i = 0;i < args2.length; i++) {
|
|
273
309
|
const arg = args2[i];
|
|
274
310
|
if (arg === "--min-support" && args2[i + 1]) {
|
|
@@ -279,13 +315,17 @@ async function runMine(args2) {
|
|
|
279
315
|
format = args2[++i];
|
|
280
316
|
} else if (arg === "--max-paths" && args2[i + 1]) {
|
|
281
317
|
maxPaths = Number.parseInt(args2[++i], 10);
|
|
282
|
-
} else if (
|
|
318
|
+
} else if (arg === "--with-flow" || arg === "--flow") {
|
|
319
|
+
withFlow = "on";
|
|
320
|
+
} else if (arg === "--no-flow") {
|
|
321
|
+
withFlow = "off";
|
|
322
|
+
} else if (arg !== "--no-color" && !arg.startsWith("-")) {
|
|
283
323
|
binary = arg;
|
|
284
324
|
}
|
|
285
325
|
}
|
|
286
326
|
if (!binary) {
|
|
287
327
|
console.error("Error: provide a binary name");
|
|
288
|
-
console.error("Run '
|
|
328
|
+
console.error("Run 'clitree mine --help' for usage");
|
|
289
329
|
process.exit(1);
|
|
290
330
|
}
|
|
291
331
|
try {
|
|
@@ -294,16 +334,7 @@ async function runMine(args2) {
|
|
|
294
334
|
console.log(JSON.stringify(result, null, 2));
|
|
295
335
|
return;
|
|
296
336
|
}
|
|
297
|
-
const C =
|
|
298
|
-
reset: "\x1B[0m",
|
|
299
|
-
bold: "\x1B[1m",
|
|
300
|
-
dim: "\x1B[2m",
|
|
301
|
-
cyan: "\x1B[36m",
|
|
302
|
-
green: "\x1B[32m",
|
|
303
|
-
yellow: "\x1B[33m",
|
|
304
|
-
magenta: "\x1B[35m",
|
|
305
|
-
gray: "\x1B[90m"
|
|
306
|
-
};
|
|
337
|
+
const C = makeColors(shouldUseColor(args2));
|
|
307
338
|
console.log(`
|
|
308
339
|
${C.bold}${C.magenta}${binary}${C.reset} ${C.gray}— shell history analysis${C.reset}
|
|
309
340
|
`);
|
|
@@ -340,11 +371,30 @@ ${C.bold}${C.magenta}${binary}${C.reset} ${C.gray}— shell history analysis${C.
|
|
|
340
371
|
}
|
|
341
372
|
console.log();
|
|
342
373
|
}
|
|
374
|
+
if (withFlow !== "off") {
|
|
375
|
+
const minSteps = withFlow === "on" ? 2 : 3;
|
|
376
|
+
const topForFlow = pickWorkflowForFlow(result.workflows, minSteps);
|
|
377
|
+
if (topForFlow) {
|
|
378
|
+
const flowWorkflow = minedToFlowWorkflow(topForFlow);
|
|
379
|
+
const rendered = shouldUseColor(args2) ? flowToAnsi(flowWorkflow) : flowToString(flowWorkflow);
|
|
380
|
+
console.log(`${C.bold}Top workflow (visualized):${C.reset}`);
|
|
381
|
+
console.log(rendered);
|
|
382
|
+
console.log();
|
|
383
|
+
}
|
|
384
|
+
}
|
|
343
385
|
} catch (err) {
|
|
344
386
|
console.error(`Error: ${err.message}`);
|
|
345
387
|
process.exit(1);
|
|
346
388
|
}
|
|
347
389
|
}
|
|
390
|
+
function pickWorkflowForFlow(workflows, minSteps = 3) {
|
|
391
|
+
for (const wf of workflows) {
|
|
392
|
+
const len = wf.path[0]?.length ?? 0;
|
|
393
|
+
if (len >= minSteps)
|
|
394
|
+
return wf;
|
|
395
|
+
}
|
|
396
|
+
return null;
|
|
397
|
+
}
|
|
348
398
|
async function runArchaeologyCmd(args2) {
|
|
349
399
|
let binary = null;
|
|
350
400
|
let skipCache = false;
|
|
@@ -358,26 +408,16 @@ async function runArchaeologyCmd(args2) {
|
|
|
358
408
|
maxDepth = Number.parseInt(args2[++i], 10);
|
|
359
409
|
} else if (arg === "--format" && args2[i + 1]) {
|
|
360
410
|
format = args2[++i];
|
|
361
|
-
} else if (!arg.startsWith("-")) {
|
|
411
|
+
} else if (arg !== "--no-color" && !arg.startsWith("-")) {
|
|
362
412
|
binary = arg;
|
|
363
413
|
}
|
|
364
414
|
}
|
|
365
415
|
if (!binary) {
|
|
366
416
|
console.error("Error: provide a binary name");
|
|
367
|
-
console.error("Run '
|
|
417
|
+
console.error("Run 'clitree archaeology --help' for usage");
|
|
368
418
|
process.exit(1);
|
|
369
419
|
}
|
|
370
|
-
const C =
|
|
371
|
-
reset: "\x1B[0m",
|
|
372
|
-
bold: "\x1B[1m",
|
|
373
|
-
dim: "\x1B[2m",
|
|
374
|
-
cyan: "\x1B[36m",
|
|
375
|
-
green: "\x1B[32m",
|
|
376
|
-
yellow: "\x1B[33m",
|
|
377
|
-
red: "\x1B[31m",
|
|
378
|
-
magenta: "\x1B[35m",
|
|
379
|
-
gray: "\x1B[90m"
|
|
380
|
-
};
|
|
420
|
+
const C = makeColors(shouldUseColor(args2));
|
|
381
421
|
try {
|
|
382
422
|
console.error(`${C.dim}⚠ LLM archaeology requires running inside the clitree skill.${C.reset}`);
|
|
383
423
|
console.error(`${C.dim} Running deterministic phases only (help + history mining).${C.reset}`);
|
|
@@ -430,4 +470,4 @@ ${C.bold}${C.yellow}\uD83D\uDCA1 Skill suggestions:${C.reset}`);
|
|
|
430
470
|
}
|
|
431
471
|
}
|
|
432
472
|
|
|
433
|
-
//# debugId=
|
|
473
|
+
//# debugId=FADAD3DCBCB5252964756E2164756E21
|
package/dist/cli.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cli.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"#!/usr/bin/env bun\nimport { parseHelpRecursive, parseHelp } from \"./parse\";\nimport { printTree, treeToString, treeToHtml } from \"./index\";\nimport type { TreeOptions } from \"./types\";\nimport { parseWorkflow, validateWorkflow, flowToAnsi, flowToString, flowToHtml } from \"./flow\";\nimport type { FlowRenderOptions } from \"./flow/types\";\nimport { mineCli } 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\"]);\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 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 {\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 archaeology <binary> [options] Full analysis: tree + mining + (LLM)\n\n Examples:\n clitree docker # basic tree\n clitree mine git # \"what workflows do I repeat with git?\"\n clitree archaeology bun # tree + mining + LLM archaeology\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\n archaeology Run full analysis (tree + mine + LLM proposals when available)\n\n Help for a subcommand: clitree <subcommand> --help\n`);\n}\n\nfunction printMineHelp() {\n\tconsole.log(`\n cli-tree mine — Mine your shell history for CLI workflows\n\n Usage:\n cli-tree mine <binary> [options]\n\n Examples:\n cli-tree mine git\n cli-tree mine docker --min-support 5\n cli-tree mine bun --format json > bun-flows.json\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 (default: 10)\n -h, --help Show this help\n`);\n}\n\nfunction printArchaeologyHelp() {\n\tconsole.log(`\n cli-tree archaeology — Full CLI analysis: tree + mining + LLM archaeology\n\n Usage:\n cli-tree 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 cli-tree archaeology git # help + history\n cli-tree archaeology docker --no-cache # bypass cache\n cli-tree 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 -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\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\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\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.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 'cli-tree 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 = {\n\t\t\treset: \"\\x1b[0m\",\n\t\t\tbold: \"\\x1b[1m\",\n\t\t\tdim: \"\\x1b[2m\",\n\t\t\tcyan: \"\\x1b[36m\",\n\t\t\tgreen: \"\\x1b[32m\",\n\t\t\tyellow: \"\\x1b[33m\",\n\t\t\tmagenta: \"\\x1b[35m\",\n\t\t\tgray: \"\\x1b[90m\",\n\t\t};\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 (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\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.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 'cli-tree archaeology --help' for usage\");\n\t\tprocess.exit(1);\n\t}\n\n\tconst C = {\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\ttry {\n\t\tconsole.error(`${C.dim}⚠ LLM archaeology requires running inside the clitree skill.${C.reset}`);\n\t\tconsole.error(`${C.dim} Running deterministic phases only (help + history mining).${C.reset}`);\n\t\tconsole.error(\"\");\n\n\t\tconst [arch, mine] = await Promise.all([\n\t\t\trunArchaeology(binary, new NullDelegate(), { skipCache, maxHelpDepth: maxDepth }),\n\t\t\tmineCli(binary, { minSupport: 3 }).catch(() => null),\n\t\t]);\n\n\t\tif (format === \"json\") {\n\t\t\tconsole.log(JSON.stringify({ archaeology: arch, mining: mine }, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(`${C.bold}${C.magenta}${binary}${C.reset}`);\n\t\tif (arch.tree.description) {\n\t\t\tconsole.log(`${C.gray}${arch.tree.description}${C.reset}`);\n\t\t}\n\t\tconsole.log();\n\n\t\tconsole.log(`${C.bold}Tree:${C.reset}`);\n\t\tconsole.log(` ${C.dim}Commands:${C.reset} ${C.cyan}${arch.stats.helpCommands}${C.reset}`);\n\t\tconsole.log(` ${C.dim}Cached:${C.reset} ${arch.fromCache ? `${C.green}yes${C.reset}` : `${C.dim}no${C.reset}`}`);\n\t\tconsole.log();\n\n\t\tif (mine) {\n\t\t\tconsole.log(`${C.bold}Usage from shell history:${C.reset}`);\n\t\t\tconsole.log(` ${C.dim}Invocations:${C.reset} ${C.cyan}${mine.stats.totalInvocations}${C.reset}`);\n\t\t\tconsole.log(` ${C.dim}Subcommands:${C.reset} ${C.cyan}${mine.stats.uniqueSubcommands}${C.reset}`);\n\n\t\t\tif (mine.workflows.length > 0) {\n\t\t\t\tconsole.log(`\\n${C.bold}Workflows you repeat:${C.reset}`);\n\t\t\t\tfor (const wf of mine.workflows.slice(0, 5)) {\n\t\t\t\t\tconst chain = wf.path[0]!.map(p => `${C.green}${p}${C.reset}`).join(` ${C.gray}→${C.reset} `);\n\t\t\t\t\tconsole.log(` ${chain} ${C.dim}(${wf.support}×)${C.reset}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (mine.suggestions.length > 0) {\n\t\t\t\tconsole.log(`\\n${C.bold}${C.yellow}💡 Skill suggestions:${C.reset}`);\n\t\t\t\tfor (const s of mine.suggestions.slice(0, 3)) {\n\t\t\t\t\tconsole.log(` ${C.bold}/${s.name}${C.reset} — ${s.description}`);\n\t\t\t\t\tconsole.log(` ${C.dim}${s.reason}${C.reset}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconsole.log();\n\t\tconsole.log(`${C.dim}Install the clitree skill for full LLM archaeology:${C.reset}`);\n\t\tconsole.log(`${C.dim} bash ./skill/install.sh${C.reset}`);\n\t\tconsole.log();\n\t} catch (err: any) {\n\t\tconsole.error(`${C.red}Error: ${err.message}${C.reset}`);\n\t\tprocess.exit(1);\n\t}\n}\n"
|
|
5
|
+
"#!/usr/bin/env bun\nimport { parseHelpRecursive, parseHelp } from \"./parse\";\nimport { printTree, treeToString, treeToHtml } from \"./index\";\nimport type { TreeOptions } from \"./types\";\nimport { parseWorkflow, validateWorkflow, flowToAnsi, flowToString, flowToHtml } from \"./flow\";\nimport type { FlowRenderOptions } from \"./flow/types\";\nimport { mineCli, minedToFlowWorkflow } 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\"]);\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 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 {\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 archaeology <binary> [options] Full analysis: tree + mining + (LLM)\n\n Examples:\n clitree docker # basic tree\n clitree mine git # \"what workflows do I repeat with git?\"\n clitree archaeology bun # tree + mining + LLM archaeology\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\n archaeology Run full analysis (tree + mine + LLM proposals when available)\n\n Help for a subcommand: clitree <subcommand> --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 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\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 (default: 10)\n --with-flow Always render the top workflow as an ASCII DAG\n --no-flow Never render the DAG (overrides auto-detect)\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 workflow is rendered as a DAG only when it has 3+ steps.\n Use --with-flow to force it on even for 2-step chains, or --no-flow to skip.\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 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\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 === \"--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-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 (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 workflow worth visualizing as a DAG.\n\t\t// In \"auto\" mode, prefer the highest-support workflow with 3+ steps —\n\t\t// 2-step chains are more readable as text than as boxed diagrams.\n\t\t// In \"on\" mode, render whatever is the top regardless of length.\n\t\t// In \"off\" mode, skip.\n\t\tif (withFlow !== \"off\") {\n\t\t\tconst minSteps = withFlow === \"on\" ? 2 : 3;\n\t\t\tconst topForFlow = pickWorkflowForFlow(result.workflows, minSteps);\n\t\t\tif (topForFlow) {\n\t\t\t\tconst flowWorkflow = minedToFlowWorkflow(topForFlow);\n\t\t\t\tconst rendered = shouldUseColor(args) ? flowToAnsi(flowWorkflow) : flowToString(flowWorkflow);\n\t\t\t\tconsole.log(`${C.bold}Top workflow (visualized):${C.reset}`);\n\t\t\t\tconsole.log(rendered);\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 pickWorkflowForFlow<T extends { path: string[][]; support: number }>(\n\tworkflows: T[],\n\tminSteps = 3,\n): T | null {\n\tfor (const wf of workflows) {\n\t\tconst len = wf.path[0]?.length ?? 0;\n\t\tif (len >= minSteps) return wf;\n\t}\n\treturn null;\n}\n\nasync function runArchaeologyCmd(args: string[]) {\n\tlet binary: string | null = null;\n\tlet skipCache = false;\n\tlet maxDepth = 2;\n\tlet format: \"ansi\" | \"json\" = \"ansi\";\n\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i]!;\n\t\tif (arg === \"--no-cache\") {\n\t\t\tskipCache = true;\n\t\t} else if (arg === \"--max-depth\" && args[i + 1]) {\n\t\t\tmaxDepth = Number.parseInt(args[++i]!, 10);\n\t\t} else if (arg === \"--format\" && args[i + 1]) {\n\t\t\tformat = args[++i] as \"ansi\" | \"json\";\n\t\t} else if (arg !== \"--no-color\" && !arg.startsWith(\"-\")) {\n\t\t\tbinary = arg;\n\t\t}\n\t}\n\n\tif (!binary) {\n\t\tconsole.error(\"Error: provide a binary name\");\n\t\tconsole.error(\"Run 'clitree archaeology --help' for usage\");\n\t\tprocess.exit(1);\n\t}\n\n\tconst C = makeColors(shouldUseColor(args));\n\n\ttry {\n\t\tconsole.error(`${C.dim}⚠ LLM archaeology requires running inside the clitree skill.${C.reset}`);\n\t\tconsole.error(`${C.dim} Running deterministic phases only (help + history mining).${C.reset}`);\n\t\tconsole.error(\"\");\n\n\t\tconst [arch, mine] = await Promise.all([\n\t\t\trunArchaeology(binary, new NullDelegate(), { skipCache, maxHelpDepth: maxDepth }),\n\t\t\tmineCli(binary, { minSupport: 3 }).catch(() => null),\n\t\t]);\n\n\t\tif (format === \"json\") {\n\t\t\tconsole.log(JSON.stringify({ archaeology: arch, mining: mine }, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(`${C.bold}${C.magenta}${binary}${C.reset}`);\n\t\tif (arch.tree.description) {\n\t\t\tconsole.log(`${C.gray}${arch.tree.description}${C.reset}`);\n\t\t}\n\t\tconsole.log();\n\n\t\tconsole.log(`${C.bold}Tree:${C.reset}`);\n\t\tconsole.log(` ${C.dim}Commands:${C.reset} ${C.cyan}${arch.stats.helpCommands}${C.reset}`);\n\t\tconsole.log(` ${C.dim}Cached:${C.reset} ${arch.fromCache ? `${C.green}yes${C.reset}` : `${C.dim}no${C.reset}`}`);\n\t\tconsole.log();\n\n\t\tif (mine) {\n\t\t\tconsole.log(`${C.bold}Usage from shell history:${C.reset}`);\n\t\t\tconsole.log(` ${C.dim}Invocations:${C.reset} ${C.cyan}${mine.stats.totalInvocations}${C.reset}`);\n\t\t\tconsole.log(` ${C.dim}Subcommands:${C.reset} ${C.cyan}${mine.stats.uniqueSubcommands}${C.reset}`);\n\n\t\t\tif (mine.workflows.length > 0) {\n\t\t\t\tconsole.log(`\\n${C.bold}Workflows you repeat:${C.reset}`);\n\t\t\t\tfor (const wf of mine.workflows.slice(0, 5)) {\n\t\t\t\t\tconst chain = wf.path[0]!.map(p => `${C.green}${p}${C.reset}`).join(` ${C.gray}→${C.reset} `);\n\t\t\t\t\tconsole.log(` ${chain} ${C.dim}(${wf.support}×)${C.reset}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (mine.suggestions.length > 0) {\n\t\t\t\tconsole.log(`\\n${C.bold}${C.yellow}💡 Skill suggestions:${C.reset}`);\n\t\t\t\tfor (const s of mine.suggestions.slice(0, 3)) {\n\t\t\t\t\tconsole.log(` ${C.bold}/${s.name}${C.reset} — ${s.description}`);\n\t\t\t\t\tconsole.log(` ${C.dim}${s.reason}${C.reset}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconsole.log();\n\t\tconsole.log(`${C.dim}Install the clitree skill for full LLM archaeology:${C.reset}`);\n\t\tconsole.log(`${C.dim} bash ./skill/install.sh${C.reset}`);\n\t\tconsole.log();\n\t} catch (err: any) {\n\t\tconsole.error(`${C.red}Error: ${err.message}${C.reset}`);\n\t\tprocess.exit(1);\n\t}\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "FADAD3DCBCB5252964756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/miner/index.d.ts
CHANGED
|
@@ -4,9 +4,10 @@ import { buildTransitions, normalizeTransitions, extractSubcommand, extractSubco
|
|
|
4
4
|
import { extractPaths, clusterIntoWorkflows } from "./workflows";
|
|
5
5
|
import { computeStats } from "./stats";
|
|
6
6
|
import { suggestSkills, type SkillSuggestion } from "./suggest";
|
|
7
|
+
import { minedToFlowWorkflow } from "./to-flow";
|
|
7
8
|
import type { HistoryEntry, Session, Transition, MinedWorkflow, CliUsageStats, MineOptions } from "./types";
|
|
8
9
|
export type { HistoryEntry, Session, Transition, MinedWorkflow, CliUsageStats, MineOptions, SkillSuggestion };
|
|
9
|
-
export { parseHistory, readHistoryFile, defaultHistoryPath, tokenize, detectHistoryFormat, segmentSessions, filterByCli, buildTransitions, normalizeTransitions, extractSubcommand, extractSubcommandPath, extractPaths, clusterIntoWorkflows, computeStats, suggestSkills, };
|
|
10
|
+
export { parseHistory, readHistoryFile, defaultHistoryPath, tokenize, detectHistoryFormat, segmentSessions, filterByCli, buildTransitions, normalizeTransitions, extractSubcommand, extractSubcommandPath, extractPaths, clusterIntoWorkflows, computeStats, suggestSkills, minedToFlowWorkflow, };
|
|
10
11
|
export interface MineResult {
|
|
11
12
|
cli: string;
|
|
12
13
|
stats: CliUsageStats;
|
package/dist/miner/index.js
CHANGED
|
@@ -9,13 +9,14 @@ import {
|
|
|
9
9
|
extractSubcommandPath,
|
|
10
10
|
filterByCli,
|
|
11
11
|
mineCli,
|
|
12
|
+
minedToFlowWorkflow,
|
|
12
13
|
normalizeTransitions,
|
|
13
14
|
parseHistory,
|
|
14
15
|
readHistoryFile,
|
|
15
16
|
segmentSessions,
|
|
16
17
|
suggestSkills,
|
|
17
18
|
tokenize
|
|
18
|
-
} from "../chunk-
|
|
19
|
+
} from "../chunk-dnq2rnr7.js";
|
|
19
20
|
export {
|
|
20
21
|
tokenize,
|
|
21
22
|
suggestSkills,
|
|
@@ -23,6 +24,7 @@ export {
|
|
|
23
24
|
readHistoryFile,
|
|
24
25
|
parseHistory,
|
|
25
26
|
normalizeTransitions,
|
|
27
|
+
minedToFlowWorkflow,
|
|
26
28
|
mineCli,
|
|
27
29
|
filterByCli,
|
|
28
30
|
extractSubcommandPath,
|
|
@@ -35,4 +37,4 @@ export {
|
|
|
35
37
|
buildTransitions
|
|
36
38
|
};
|
|
37
39
|
|
|
38
|
-
//# debugId=
|
|
40
|
+
//# debugId=34A9477E11B0A64764756E2164756E21
|
package/dist/miner/index.js.map
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Workflow } from "../flow/types";
|
|
2
|
+
import type { MinedWorkflow } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Convert a MinedWorkflow (discovered from shell history) into a Workflow
|
|
5
|
+
* that the flow renderer can visualize as an ASCII DAG.
|
|
6
|
+
*
|
|
7
|
+
* The mined workflow is a linear path like ["add", "commit", "push"] with
|
|
8
|
+
* a frequency count. We turn it into a linear Workflow with one node per
|
|
9
|
+
* step and edges in order — matching the shape of the handcrafted YAML
|
|
10
|
+
* workflows in workflows/.
|
|
11
|
+
*/
|
|
12
|
+
export declare function minedToFlowWorkflow(mined: MinedWorkflow, occurrences?: number): Workflow;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crafter/cli-tree",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Explore and map any CLI tool deeply. Parse --help trees, mine shell history for repeated workflows, surface hidden flags via LLM archaeology, and suggest new agent skills from your usage patterns.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
package/skill/SKILL.md
CHANGED
|
@@ -35,24 +35,27 @@ Phase 3 is your unique contribution as the agent. Phases 1, 2, 4 are handled by
|
|
|
35
35
|
|
|
36
36
|
## Setup
|
|
37
37
|
|
|
38
|
-
The skill
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
CLITREE_LIB=CLITREE_LIB_PATH
|
|
42
|
-
```
|
|
38
|
+
The skill uses the `@crafter/cli-tree` npm package via `bunx` so it works on any machine without a local checkout. No `CLITREE_LIB` path needed — just Bun installed.
|
|
43
39
|
|
|
44
40
|
At the start of every run, verify setup:
|
|
45
41
|
|
|
46
42
|
```bash
|
|
47
|
-
|
|
43
|
+
which bun && which "$TARGET_BINARY"
|
|
48
44
|
```
|
|
49
45
|
|
|
50
46
|
If any check fails, explain what's missing and stop. Don't try to guess paths — tell the user clearly.
|
|
51
47
|
|
|
48
|
+
The helper alias used throughout this skill:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Short hand. The first invocation downloads the package; subsequent runs are cached.
|
|
52
|
+
CLITREE="bunx @crafter/cli-tree@latest"
|
|
53
|
+
```
|
|
54
|
+
|
|
52
55
|
## Phase 1 — Parse the --help tree
|
|
53
56
|
|
|
54
57
|
```bash
|
|
55
|
-
|
|
58
|
+
$CLITREE "$TARGET_BINARY" --format json --depth 2
|
|
56
59
|
```
|
|
57
60
|
|
|
58
61
|
Read the JSON. Note: total commands, top subcommands, total flags. This gives you the documented surface area.
|
|
@@ -64,16 +67,28 @@ If the parse fails completely (empty output, error), try:
|
|
|
64
67
|
|
|
65
68
|
## Phase 2 — Mine shell history
|
|
66
69
|
|
|
70
|
+
Run the miner **twice** — once for structured data you can reason over, and once for the pretty ANSI output you'll paste directly into the report.
|
|
71
|
+
|
|
72
|
+
**2a. Structured data (for your reasoning):**
|
|
73
|
+
|
|
67
74
|
```bash
|
|
68
|
-
|
|
75
|
+
$CLITREE mine "$TARGET_BINARY" --format json
|
|
69
76
|
```
|
|
70
77
|
|
|
71
78
|
Read the result. You get:
|
|
72
79
|
- `stats.totalInvocations` — how much the user uses this CLI
|
|
73
|
-
- `stats.topSubcommands` — their most-used commands
|
|
80
|
+
- `stats.topSubcommands` — their most-used commands with counts
|
|
74
81
|
- `workflows` — sequences that repeat (≥3 times)
|
|
75
82
|
- `suggestions` — candidate skills to create
|
|
76
83
|
|
|
84
|
+
**2b. Pretty output (for the visual report):**
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
$CLITREE mine "$TARGET_BINARY"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
This prints a colorized block with **ASCII bar charts** for top subcommands and a ranked list of discovered workflows with frequency counts. **Capture this entire block — you'll paste it verbatim inside a fenced code block in the `## Your usage` section of the final report.** Do not re-type it; the bar chart is the value.
|
|
91
|
+
|
|
77
92
|
Three scenarios from the invocation count:
|
|
78
93
|
|
|
79
94
|
| Invocations | What it means | What to do |
|
|
@@ -130,12 +145,11 @@ Produce this exact structure. Consistency matters — the user learns the shape
|
|
|
130
145
|
<one-line summary: N commands, M flags>
|
|
131
146
|
|
|
132
147
|
## Your usage
|
|
133
|
-
<from
|
|
134
|
-
<
|
|
148
|
+
<Paste the full ANSI block from `$CLITREE mine <binary>` (phase 2b) inside a triple-backtick fenced code block. This gives the user ASCII bar charts + workflow list + skill suggestions visually, instead of re-typing them as prose.>
|
|
149
|
+
<If history is empty, write: "No usage detected — showing canonical patterns from my knowledge">
|
|
135
150
|
|
|
136
151
|
## Workflows you repeat
|
|
137
|
-
<
|
|
138
|
-
<or omit section entirely if no history>
|
|
152
|
+
<If you pasted the full mine block above, this section can be omitted — the mine output already includes it. Otherwise, list the top 5 workflows with frequency.>
|
|
139
153
|
|
|
140
154
|
## Hidden / undocumented findings
|
|
141
155
|
✓ --flag-a (verified) — what it does
|
package/src/cli.ts
CHANGED
|
@@ -4,7 +4,7 @@ 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 { mineCli } from "./miner";
|
|
7
|
+
import { mineCli, minedToFlowWorkflow } from "./miner";
|
|
8
8
|
import { runArchaeology, NullDelegate } from "./archaeology";
|
|
9
9
|
|
|
10
10
|
const args = process.argv.slice(2);
|
|
@@ -63,45 +63,53 @@ function printMainHelp() {
|
|
|
63
63
|
|
|
64
64
|
function printMineHelp() {
|
|
65
65
|
console.log(`
|
|
66
|
-
|
|
66
|
+
clitree mine — Mine your shell history for CLI workflows
|
|
67
67
|
|
|
68
68
|
Usage:
|
|
69
|
-
|
|
69
|
+
clitree mine <binary> [options]
|
|
70
70
|
|
|
71
71
|
Examples:
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
clitree mine git
|
|
73
|
+
clitree mine docker --min-support 5 --with-flow
|
|
74
|
+
clitree mine bun --format json > bun-flows.json
|
|
75
|
+
clitree mine git --no-color | tee report.txt
|
|
75
76
|
|
|
76
77
|
Options:
|
|
77
78
|
--min-support <n> Minimum occurrences to count as a workflow (default: 3)
|
|
78
79
|
--history-path <p> Custom shell history path (default: ~/.zsh_history)
|
|
79
80
|
--format <fmt> Output format: ansi (default), json
|
|
80
81
|
--max-paths <n> Max workflows to show (default: 10)
|
|
82
|
+
--with-flow Always render the top workflow as an ASCII DAG
|
|
83
|
+
--no-flow Never render the DAG (overrides auto-detect)
|
|
84
|
+
--no-color Disable ANSI colors (also auto-disabled when stdout is not a TTY)
|
|
81
85
|
-h, --help Show this help
|
|
86
|
+
|
|
87
|
+
By default, the top workflow is rendered as a DAG only when it has 3+ steps.
|
|
88
|
+
Use --with-flow to force it on even for 2-step chains, or --no-flow to skip.
|
|
82
89
|
`);
|
|
83
90
|
}
|
|
84
91
|
|
|
85
92
|
function printArchaeologyHelp() {
|
|
86
93
|
console.log(`
|
|
87
|
-
|
|
94
|
+
clitree archaeology — Full CLI analysis: tree + mining + LLM archaeology
|
|
88
95
|
|
|
89
96
|
Usage:
|
|
90
|
-
|
|
97
|
+
clitree archaeology <binary> [options]
|
|
91
98
|
|
|
92
99
|
When run from the command line without a delegate, only the deterministic
|
|
93
100
|
phases run (help parsing + shell history mining). LLM archaeology requires
|
|
94
101
|
running inside the clitree skill (see ./skill/SKILL.md).
|
|
95
102
|
|
|
96
103
|
Examples:
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
104
|
+
clitree archaeology git # help + history
|
|
105
|
+
clitree archaeology docker --no-cache # bypass cache
|
|
106
|
+
clitree archaeology bun --format json # JSON output
|
|
100
107
|
|
|
101
108
|
Options:
|
|
102
109
|
--no-cache Skip cache, always re-run
|
|
103
110
|
--max-depth <n> Max --help recursion depth (default: 2)
|
|
104
111
|
--format <fmt> Output format: ansi (default), json
|
|
112
|
+
--no-color Disable ANSI colors (also auto-disabled when stdout is not a TTY)
|
|
105
113
|
-h, --help Show this help
|
|
106
114
|
`);
|
|
107
115
|
}
|
|
@@ -143,6 +151,8 @@ async function runTree(args: string[]) {
|
|
|
143
151
|
let stdinName: string | null = null;
|
|
144
152
|
let binary: string | null = null;
|
|
145
153
|
|
|
154
|
+
opts.color = shouldUseColor(args);
|
|
155
|
+
|
|
146
156
|
for (let i = 0; i < args.length; i++) {
|
|
147
157
|
const arg = args[i]!;
|
|
148
158
|
if (arg === "--depth" && args[i + 1]) {
|
|
@@ -262,12 +272,37 @@ async function readStdin(): Promise<string> {
|
|
|
262
272
|
return Buffer.concat(chunks).toString("utf-8");
|
|
263
273
|
}
|
|
264
274
|
|
|
275
|
+
function shouldUseColor(args: string[]): boolean {
|
|
276
|
+
if (args.includes("--no-color")) return false;
|
|
277
|
+
if (process.env.NO_COLOR) return false;
|
|
278
|
+
if (process.env.FORCE_COLOR) return true;
|
|
279
|
+
return !!process.stdout.isTTY;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function makeColors(enabled: boolean) {
|
|
283
|
+
if (!enabled) {
|
|
284
|
+
return { reset: "", bold: "", dim: "", cyan: "", green: "", yellow: "", red: "", magenta: "", gray: "" };
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
reset: "\x1b[0m",
|
|
288
|
+
bold: "\x1b[1m",
|
|
289
|
+
dim: "\x1b[2m",
|
|
290
|
+
cyan: "\x1b[36m",
|
|
291
|
+
green: "\x1b[32m",
|
|
292
|
+
yellow: "\x1b[33m",
|
|
293
|
+
red: "\x1b[31m",
|
|
294
|
+
magenta: "\x1b[35m",
|
|
295
|
+
gray: "\x1b[90m",
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
|
|
265
299
|
async function runMine(args: string[]) {
|
|
266
300
|
let binary: string | null = null;
|
|
267
301
|
let minSupport = 3;
|
|
268
302
|
let historyPath: string | undefined;
|
|
269
303
|
let format: "ansi" | "json" = "ansi";
|
|
270
304
|
let maxPaths = 10;
|
|
305
|
+
let withFlow: "auto" | "on" | "off" = "auto";
|
|
271
306
|
|
|
272
307
|
for (let i = 0; i < args.length; i++) {
|
|
273
308
|
const arg = args[i]!;
|
|
@@ -279,14 +314,18 @@ async function runMine(args: string[]) {
|
|
|
279
314
|
format = args[++i] as "ansi" | "json";
|
|
280
315
|
} else if (arg === "--max-paths" && args[i + 1]) {
|
|
281
316
|
maxPaths = Number.parseInt(args[++i]!, 10);
|
|
282
|
-
} else if (
|
|
317
|
+
} else if (arg === "--with-flow" || arg === "--flow") {
|
|
318
|
+
withFlow = "on";
|
|
319
|
+
} else if (arg === "--no-flow") {
|
|
320
|
+
withFlow = "off";
|
|
321
|
+
} else if (arg !== "--no-color" && !arg.startsWith("-")) {
|
|
283
322
|
binary = arg;
|
|
284
323
|
}
|
|
285
324
|
}
|
|
286
325
|
|
|
287
326
|
if (!binary) {
|
|
288
327
|
console.error("Error: provide a binary name");
|
|
289
|
-
console.error("Run '
|
|
328
|
+
console.error("Run 'clitree mine --help' for usage");
|
|
290
329
|
process.exit(1);
|
|
291
330
|
}
|
|
292
331
|
|
|
@@ -298,16 +337,7 @@ async function runMine(args: string[]) {
|
|
|
298
337
|
return;
|
|
299
338
|
}
|
|
300
339
|
|
|
301
|
-
const C =
|
|
302
|
-
reset: "\x1b[0m",
|
|
303
|
-
bold: "\x1b[1m",
|
|
304
|
-
dim: "\x1b[2m",
|
|
305
|
-
cyan: "\x1b[36m",
|
|
306
|
-
green: "\x1b[32m",
|
|
307
|
-
yellow: "\x1b[33m",
|
|
308
|
-
magenta: "\x1b[35m",
|
|
309
|
-
gray: "\x1b[90m",
|
|
310
|
-
};
|
|
340
|
+
const C = makeColors(shouldUseColor(args));
|
|
311
341
|
|
|
312
342
|
console.log(`\n${C.bold}${C.magenta}${binary}${C.reset} ${C.gray}— shell history analysis${C.reset}\n`);
|
|
313
343
|
console.log(`${C.bold}Usage:${C.reset}`);
|
|
@@ -349,12 +379,40 @@ async function runMine(args: string[]) {
|
|
|
349
379
|
}
|
|
350
380
|
console.log();
|
|
351
381
|
}
|
|
382
|
+
|
|
383
|
+
// Pick the top workflow worth visualizing as a DAG.
|
|
384
|
+
// In "auto" mode, prefer the highest-support workflow with 3+ steps —
|
|
385
|
+
// 2-step chains are more readable as text than as boxed diagrams.
|
|
386
|
+
// In "on" mode, render whatever is the top regardless of length.
|
|
387
|
+
// In "off" mode, skip.
|
|
388
|
+
if (withFlow !== "off") {
|
|
389
|
+
const minSteps = withFlow === "on" ? 2 : 3;
|
|
390
|
+
const topForFlow = pickWorkflowForFlow(result.workflows, minSteps);
|
|
391
|
+
if (topForFlow) {
|
|
392
|
+
const flowWorkflow = minedToFlowWorkflow(topForFlow);
|
|
393
|
+
const rendered = shouldUseColor(args) ? flowToAnsi(flowWorkflow) : flowToString(flowWorkflow);
|
|
394
|
+
console.log(`${C.bold}Top workflow (visualized):${C.reset}`);
|
|
395
|
+
console.log(rendered);
|
|
396
|
+
console.log();
|
|
397
|
+
}
|
|
398
|
+
}
|
|
352
399
|
} catch (err: any) {
|
|
353
400
|
console.error(`Error: ${err.message}`);
|
|
354
401
|
process.exit(1);
|
|
355
402
|
}
|
|
356
403
|
}
|
|
357
404
|
|
|
405
|
+
function pickWorkflowForFlow<T extends { path: string[][]; support: number }>(
|
|
406
|
+
workflows: T[],
|
|
407
|
+
minSteps = 3,
|
|
408
|
+
): T | null {
|
|
409
|
+
for (const wf of workflows) {
|
|
410
|
+
const len = wf.path[0]?.length ?? 0;
|
|
411
|
+
if (len >= minSteps) return wf;
|
|
412
|
+
}
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
|
|
358
416
|
async function runArchaeologyCmd(args: string[]) {
|
|
359
417
|
let binary: string | null = null;
|
|
360
418
|
let skipCache = false;
|
|
@@ -369,28 +427,18 @@ async function runArchaeologyCmd(args: string[]) {
|
|
|
369
427
|
maxDepth = Number.parseInt(args[++i]!, 10);
|
|
370
428
|
} else if (arg === "--format" && args[i + 1]) {
|
|
371
429
|
format = args[++i] as "ansi" | "json";
|
|
372
|
-
} else if (!arg.startsWith("-")) {
|
|
430
|
+
} else if (arg !== "--no-color" && !arg.startsWith("-")) {
|
|
373
431
|
binary = arg;
|
|
374
432
|
}
|
|
375
433
|
}
|
|
376
434
|
|
|
377
435
|
if (!binary) {
|
|
378
436
|
console.error("Error: provide a binary name");
|
|
379
|
-
console.error("Run '
|
|
437
|
+
console.error("Run 'clitree archaeology --help' for usage");
|
|
380
438
|
process.exit(1);
|
|
381
439
|
}
|
|
382
440
|
|
|
383
|
-
const C =
|
|
384
|
-
reset: "\x1b[0m",
|
|
385
|
-
bold: "\x1b[1m",
|
|
386
|
-
dim: "\x1b[2m",
|
|
387
|
-
cyan: "\x1b[36m",
|
|
388
|
-
green: "\x1b[32m",
|
|
389
|
-
yellow: "\x1b[33m",
|
|
390
|
-
red: "\x1b[31m",
|
|
391
|
-
magenta: "\x1b[35m",
|
|
392
|
-
gray: "\x1b[90m",
|
|
393
|
-
};
|
|
441
|
+
const C = makeColors(shouldUseColor(args));
|
|
394
442
|
|
|
395
443
|
try {
|
|
396
444
|
console.error(`${C.dim}⚠ LLM archaeology requires running inside the clitree skill.${C.reset}`);
|
package/src/miner/index.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { buildTransitions, normalizeTransitions, extractSubcommand, extractSubco
|
|
|
4
4
|
import { extractPaths, clusterIntoWorkflows } from "./workflows";
|
|
5
5
|
import { computeStats } from "./stats";
|
|
6
6
|
import { suggestSkills, type SkillSuggestion } from "./suggest";
|
|
7
|
+
import { minedToFlowWorkflow } from "./to-flow";
|
|
7
8
|
import type { HistoryEntry, Session, Transition, MinedWorkflow, CliUsageStats, MineOptions } from "./types";
|
|
8
9
|
|
|
9
10
|
export type { HistoryEntry, Session, Transition, MinedWorkflow, CliUsageStats, MineOptions, SkillSuggestion };
|
|
@@ -23,6 +24,7 @@ export {
|
|
|
23
24
|
clusterIntoWorkflows,
|
|
24
25
|
computeStats,
|
|
25
26
|
suggestSkills,
|
|
27
|
+
minedToFlowWorkflow,
|
|
26
28
|
};
|
|
27
29
|
|
|
28
30
|
export interface MineResult {
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Workflow } from "../flow/types";
|
|
2
|
+
import type { MinedWorkflow } from "./types";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Convert a MinedWorkflow (discovered from shell history) into a Workflow
|
|
6
|
+
* that the flow renderer can visualize as an ASCII DAG.
|
|
7
|
+
*
|
|
8
|
+
* The mined workflow is a linear path like ["add", "commit", "push"] with
|
|
9
|
+
* a frequency count. We turn it into a linear Workflow with one node per
|
|
10
|
+
* step and edges in order — matching the shape of the handcrafted YAML
|
|
11
|
+
* workflows in workflows/.
|
|
12
|
+
*/
|
|
13
|
+
export function minedToFlowWorkflow(mined: MinedWorkflow, occurrences?: number): Workflow {
|
|
14
|
+
const path = mined.path[0] ?? [];
|
|
15
|
+
const label = path.join(" → ");
|
|
16
|
+
const freq = occurrences ?? mined.support;
|
|
17
|
+
|
|
18
|
+
const nodes = path.map((sub, idx) => ({
|
|
19
|
+
id: `n${idx}`,
|
|
20
|
+
command: [mined.cli, sub],
|
|
21
|
+
label: sub,
|
|
22
|
+
}));
|
|
23
|
+
|
|
24
|
+
const edges = [];
|
|
25
|
+
for (let i = 0; i < nodes.length - 1; i++) {
|
|
26
|
+
edges.push({ from: nodes[i]!.id, to: nodes[i + 1]!.id });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
name: label,
|
|
31
|
+
description: `Seen ${freq}× in your shell history`,
|
|
32
|
+
cli: mined.cli,
|
|
33
|
+
nodes,
|
|
34
|
+
edges,
|
|
35
|
+
};
|
|
36
|
+
}
|