vibecheck-score 0.1.0 → 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/index.js CHANGED
@@ -4,7 +4,7 @@ import { platform, homedir } from "node:os";
4
4
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { dirname, join } from "node:path";
7
- import { randomUUID } from "node:crypto";
7
+ import { randomUUID, randomBytes } from "node:crypto";
8
8
  import { computeScore } from "./scoring/engine.js";
9
9
  import { runAllScanners } from "./scanners/index.js";
10
10
  import { EnvironmentScanner } from "./scanners/environment.js";
@@ -16,7 +16,9 @@ import { MemoryScanner } from "./scanners/memory.js";
16
16
  import { SecurityScanner } from "./scanners/security.js";
17
17
  import { DeployScanner } from "./scanners/deploy.js";
18
18
  import { SocialScanner } from "./scanners/social.js";
19
- import { UniversalFileScanner, getSupersededIds } from "./scanners/universal-file.js";
19
+ import { GitHistoryScanner } from "./scanners/git-history.js";
20
+ import { UniversalFileScanner, getSupersededMap } from "./scanners/universal-file.js";
21
+ import chalk from "chalk";
20
22
  import { renderResults, createSpinner } from "./output/terminal.js";
21
23
  function getVersion() {
22
24
  try {
@@ -38,14 +40,16 @@ function printHelp() {
38
40
  vibecheck [options]
39
41
 
40
42
  Options:
41
- --help Show this help message
42
- --json Output raw ProbeResult as JSON
43
- --merge <file> Merge detections from another scan (JSON file)
44
- --deep Scan home directory for global AI config (crontab, launchd)
45
- --submit Submit results to vibecheck.dev
46
- --handle <id> Your handle (3-39 chars, lowercase, hyphens, underscores)
47
- --url <url> Override submit URL (default: https://vibecheck.dev)
48
- --yes Skip submit confirmation prompt
43
+ --help Show this help message
44
+ --json Output raw ProbeResult as JSON
45
+ --merge <file> Merge detections from another scan (JSON file)
46
+ --deep Scan home directory for global AI config (crontab, launchd)
47
+ --submit Submit results to vibecheck-brklyngg.vercel.app
48
+ --handle <id> Your handle (auto-generated if omitted)
49
+ --compare create Create a new comparison
50
+ --compare <code> Join an existing comparison
51
+ --url <url> Override submit URL (default: https://vibecheck-brklyngg.vercel.app)
52
+ --yes Skip submit confirmation prompt
49
53
  `);
50
54
  }
51
55
  async function main() {
@@ -57,6 +61,7 @@ async function main() {
57
61
  merge: { type: "string" },
58
62
  submit: { type: "boolean", default: false },
59
63
  handle: { type: "string" },
64
+ compare: { type: "string" },
60
65
  url: { type: "string" },
61
66
  yes: { type: "boolean", default: false },
62
67
  },
@@ -78,24 +83,26 @@ async function main() {
78
83
  new SecurityScanner(),
79
84
  new DeployScanner(),
80
85
  new SocialScanner(),
86
+ new GitHistoryScanner(),
81
87
  new UniversalFileScanner(isDeep), // must be last — supersedes v2 for shared artifacts
82
88
  ];
83
89
  const spinner = isJson ? null : createSpinner("Scanning your AI setup...");
84
90
  spinner?.start();
91
+ const scanStart = performance.now();
85
92
  const scanResults = await runAllScanners(scanners);
93
+ const scanDurationMs = performance.now() - scanStart;
86
94
  spinner?.stop();
87
95
  // Flatten and deduplicate detections by id
88
96
  // UFS runs last — collect its detections to know which v2 IDs to suppress
89
- const supersededV2Ids = getSupersededIds();
97
+ const supersededMap = getSupersededMap(); // v2Id → [ufs IDs that replace it]
90
98
  const ufsResult = scanResults.find((r) => r.scanner === "universal-file");
91
99
  const ufsDetectionIds = new Set(ufsResult?.detections.map((d) => d.id) ?? []);
92
- // Build set of v2 IDs that UFS actually covered (supersedes + UFS emitted something)
100
+ // Only suppress a v2 ID when at least one of its replacement UFS IDs was actually emitted
93
101
  const suppressedV2Ids = new Set();
94
- for (const v2Id of supersededV2Ids) {
95
- // Check if any UFS detection declares it supersedes this v2 ID
96
- const hasUfsReplacement = ufsResult?.detections.some((d) => d.id.startsWith("ufs:"));
97
- if (hasUfsReplacement)
102
+ for (const [v2Id, ufsIds] of supersededMap) {
103
+ if (ufsIds.some((id) => ufsDetectionIds.has(id))) {
98
104
  suppressedV2Ids.add(v2Id);
105
+ }
99
106
  }
100
107
  const seen = new Set();
101
108
  const detections = [];
@@ -111,6 +118,7 @@ async function main() {
111
118
  }
112
119
  }
113
120
  // --merge: fold in detections from an external scan
121
+ let mergeCount = 0;
114
122
  if (values.merge) {
115
123
  try {
116
124
  const external = JSON.parse(readFileSync(values.merge, "utf-8"));
@@ -118,6 +126,7 @@ async function main() {
118
126
  if (!seen.has(d.id)) {
119
127
  seen.add(d.id);
120
128
  detections.push(d);
129
+ mergeCount++;
121
130
  }
122
131
  }
123
132
  }
@@ -140,19 +149,45 @@ async function main() {
140
149
  console.log(JSON.stringify(result, null, 2));
141
150
  }
142
151
  else {
143
- renderResults(score, detections);
144
- // Hint about --merge when autonomy is empty and no merge was used
152
+ // Print merge count before results
153
+ if (values.merge && mergeCount > 0) {
154
+ console.log(` ${chalk.green("✓")} Merged ${mergeCount} signals from ${values.merge}`);
155
+ }
156
+ renderResults(score, detections, scanDurationMs);
157
+ // Hint about --merge when autonomy is low and no merge was used
145
158
  const autonomyScore = score.categories.find((c) => c.category === "autonomy");
146
- if (autonomyScore?.score === 0 && !values.merge) {
147
- console.log(" \x1b[2m💡 Run agents on a separate machine? Export with --json there,");
148
- console.log(" then pass it here with --merge <file> to combine scores.\x1b[0m\n");
159
+ const hasRemoteKeywords = detections.some((d) => d.id.includes("orchestrator") || d.source.includes("remote") || d.source.includes("tailscale"));
160
+ if (!values.merge && ((autonomyScore?.score ?? 0) < 30 || hasRemoteKeywords)) {
161
+ const sep = "─".repeat(49);
162
+ console.log(` ${chalk.gray(sep)}`);
163
+ console.log();
164
+ console.log(` ${chalk.bold.white("SCAN YOUR AGENT'S MACHINE")}`);
165
+ console.log(` ${chalk.gray("If your AI agent runs on a separate machine:")}`);
166
+ console.log();
167
+ console.log(` ${chalk.gray("On the agent machine:")}`);
168
+ console.log(` ${chalk.cyan("npx vibecheck-score --deep --json > agent-scan.json")}`);
169
+ console.log();
170
+ console.log(` ${chalk.gray("Then merge here:")}`);
171
+ console.log(` ${chalk.cyan("npx vibecheck-score --deep --merge agent-scan.json --submit")}`);
172
+ console.log();
173
+ console.log(` ${chalk.gray('Or tell your AI assistant:')}`);
174
+ console.log(` ${chalk.gray('"Run npx vibecheck-score --deep --json in my workspace')}`);
175
+ console.log(` ${chalk.gray(' and save the output to agent-scan.json"')}`);
176
+ console.log();
149
177
  }
150
178
  }
179
+ // --compare requires --submit
180
+ if (values.compare && !values.submit) {
181
+ console.error("\x1b[31m --compare requires --submit\x1b[0m");
182
+ process.exit(1);
183
+ }
151
184
  // --submit flow
152
185
  if (values.submit) {
153
- const handle = values.handle;
154
- if (!handle || !HANDLE_RE.test(handle)) {
155
- console.error("\x1b[31m --handle is required for --submit (3-39 chars, lowercase alphanumeric/hyphens/underscores)\x1b[0m");
186
+ // Auto-generate handle if omitted
187
+ const handle = values.handle ?? randomBytes(4).toString("hex");
188
+ // Only validate if explicitly provided
189
+ if (values.handle && !HANDLE_RE.test(values.handle)) {
190
+ console.error("\x1b[31m --handle must be 3-39 chars, lowercase alphanumeric/hyphens/underscores\x1b[0m");
156
191
  process.exit(1);
157
192
  }
158
193
  // Token management: ~/.vibecheck/token
@@ -170,14 +205,14 @@ async function main() {
170
205
  // Confirmation unless --yes
171
206
  if (!values.yes && !isJson) {
172
207
  const rl = await import("node:readline/promises").then((m) => m.createInterface({ input: process.stdin, output: process.stdout }));
173
- const answer = await rl.question(`\n Submit results as \x1b[1m${handle}\x1b[0m to vibecheck.dev? [Y/n] `);
208
+ const answer = await rl.question(`\n Submit results as \x1b[1m${handle}\x1b[0m to vibecheck-brklyngg.vercel.app? [Y/n] `);
174
209
  rl.close();
175
210
  if (answer.trim().toLowerCase() === "n") {
176
211
  console.log(" Submission skipped.");
177
212
  return;
178
213
  }
179
214
  }
180
- const submitUrl = values.url ?? "https://vibecheck.dev";
215
+ const submitUrl = values.url ?? "https://vibecheck-brklyngg.vercel.app";
181
216
  try {
182
217
  const res = await fetch(`${submitUrl}/api/submit`, {
183
218
  method: "POST",
@@ -195,6 +230,58 @@ async function main() {
195
230
  console.log(` \x1b[32m│\x1b[0m ${inner.padEnd(width - 2)} \x1b[32m│\x1b[0m`);
196
231
  console.log(` \x1b[32m│\x1b[0m ${urlLine.padEnd(width - 2)} \x1b[32m│\x1b[0m`);
197
232
  console.log(` \x1b[32m└${border}┘\x1b[0m\n`);
233
+ // --compare flow
234
+ if (values.compare) {
235
+ const compareAction = values.compare === "create" ? "create" : "join";
236
+ const comparePayload = { action: compareAction, handle };
237
+ if (compareAction === "join") {
238
+ const code = values.compare;
239
+ if (!/^[a-z0-9]{6}$/.test(code)) {
240
+ console.error(chalk.red(" --compare code must be 6 lowercase hex characters"));
241
+ process.exit(1);
242
+ }
243
+ comparePayload.code = code;
244
+ }
245
+ try {
246
+ const cmpRes = await fetch(`${submitUrl}/api/compare`, {
247
+ method: "POST",
248
+ headers: { "Content-Type": "application/json" },
249
+ body: JSON.stringify(comparePayload),
250
+ });
251
+ if (cmpRes.ok) {
252
+ const cmpBody = (await cmpRes.json());
253
+ const sep = "─".repeat(42);
254
+ if (compareAction === "create" && cmpBody.code) {
255
+ console.log(` ${chalk.bold.white("COMPARE MODE")}`);
256
+ console.log(` ${chalk.gray(sep)}`);
257
+ console.log(` Share this code: ${chalk.bold.white(cmpBody.code)}`);
258
+ console.log();
259
+ console.log(` They run:`);
260
+ console.log(` ${chalk.cyan(`npx vibecheck-score --deep --submit --compare ${cmpBody.code}`)}`);
261
+ console.log();
262
+ const compareUrl = cmpBody.url ?? `${submitUrl}/compare/${cmpBody.code}`;
263
+ console.log(` Then both visit:`);
264
+ console.log(` ${chalk.cyan(compareUrl)}`);
265
+ console.log(` ${chalk.gray(sep)}`);
266
+ console.log();
267
+ }
268
+ else if (compareAction === "join" && cmpBody.url) {
269
+ console.log(` ${chalk.green("✓")} Joined comparison ${chalk.bold(values.compare)}`);
270
+ console.log();
271
+ console.log(` View the comparison:`);
272
+ console.log(` ${chalk.cyan(cmpBody.url)}`);
273
+ console.log();
274
+ }
275
+ }
276
+ else {
277
+ const cmpErr = (await cmpRes.json().catch(() => ({})));
278
+ console.error(chalk.red(` Compare failed: ${cmpErr.error ?? cmpRes.statusText}`));
279
+ }
280
+ }
281
+ catch {
282
+ console.error(chalk.yellow(` Could not reach ${submitUrl} for comparison.`));
283
+ }
284
+ }
198
285
  }
199
286
  else if (res.status === 403) {
200
287
  console.error("\n \x1b[31m✗ This handle is owned by a different machine.\x1b[0m");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,7 @@
1
- import type { ScoreResult, Detection } from "../types.js";
1
+ import type { ScoreResult, Detection, TaxonomyCategory } from "../types.js";
2
+ export declare const ARCHETYPE_NAMES: Record<string, string>;
3
+ export declare const ARCHETYPE_DESCRIPTIONS: Record<string, string>;
4
+ export declare const LETTER_MEANINGS: Record<string, [string, string]>;
5
+ export declare function commentaryForScore(cat: TaxonomyCategory, score: number): string;
2
6
  export declare function generateNarrative(score: ScoreResult, detections: Detection[]): string;
3
7
  //# sourceMappingURL=narrative.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"narrative.d.ts","sourceRoot":"","sources":["../../src/output/narrative.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAoB,MAAM,aAAa,CAAC;AAmE5E,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,SAAS,EAAE,GACtB,MAAM,CA8CR"}
1
+ {"version":3,"file":"narrative.d.ts","sourceRoot":"","sources":["../../src/output/narrative.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAiD5E,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkBlD,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkBzD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAK5D,CAAC;AAUF,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,SAAS,EAAE,GACtB,MAAM,CA8CR"}
@@ -44,6 +44,50 @@ const DIMENSION_COMMENTARY = {
44
44
  high: "Full social integration. Published tools, multi-channel AI presence, community builder.",
45
45
  },
46
46
  };
47
+ export const ARCHETYPE_NAMES = {
48
+ MARD: "The Orchestrator",
49
+ MARC: "The Methodist",
50
+ MARL: "The Strategist",
51
+ MACD: "The Planner",
52
+ MACL: "The Analyst",
53
+ MGRD: "The Engineer",
54
+ MGRL: "The Pragmatist",
55
+ MGCD: "The Sentinel",
56
+ MGCL: "The Scholar",
57
+ VARD: "The Powerhouse",
58
+ VARL: "The Maverick",
59
+ VACD: "The Experimenter",
60
+ VACL: "The Freelancer",
61
+ VGRD: "The Blitz Builder",
62
+ VGRL: "The Scrapper",
63
+ VGCD: "The Tinkerer",
64
+ VGCL: "The Explorer",
65
+ };
66
+ export const ARCHETYPE_DESCRIPTIONS = {
67
+ MARD: "Deep model expertise, autonomous agents, rigorous shipping, and a deep tool ecosystem.",
68
+ MARC: "Strategic model selection with autonomous agents, but shipping is measured and deliberate.",
69
+ MARL: "Smart model strategy with autonomous agents and rapid shipping, but a lighter tool footprint.",
70
+ MACD: "Master strategist with autonomous agents and deep tooling, but cautious on shipping.",
71
+ MACL: "Strategic thinker with autonomous agents in a lean setup. Quality over quantity.",
72
+ MGRD: "Model expertise paired with guided agents and rigorous process. You steer the ship.",
73
+ MGRL: "Smart model use, guided agents, and rapid shipping with a lean stack.",
74
+ MGCD: "Deep model knowledge, guided agents, cautious shipping, deep tools. The fortress.",
75
+ MGCL: "Thoughtful model strategy in a guided, lean setup. Methodical and measured.",
76
+ VARD: "Velocity-first with autonomous agents, rapid shipping, and deep tooling.",
77
+ VARL: "Speed plus autonomy plus rapid shipping. Light on tools but heavy on output.",
78
+ VACD: "Velocity seeker with autonomous agents, cautious shipping, and deep tools.",
79
+ VACL: "Fast, autonomous, cautious, light. Moves fast but picks battles carefully.",
80
+ VGRD: "Velocity is the vibe. Ships fast, integrates everything, but keeps the AI on a leash.",
81
+ VGRL: "Fast, guided, rapid, light. Does more with less and ships it yesterday.",
82
+ VGCD: "Velocity seeker who tinkers with deep tools under guided supervision.",
83
+ VGCL: "Fast-moving, guided, cautious, and light. Just getting started, but moving quick.",
84
+ };
85
+ export const LETTER_MEANINGS = {
86
+ intelligence: ["M = Master strategist", "V = Velocity seeker"],
87
+ autonomy: ["A = Autonomous agents", "G = Guided agents"],
88
+ ship: ["R = Rapid shipper", "C = Cautious shipper"],
89
+ depth: ["D = Deep tooling", "L = Light tooling"],
90
+ };
47
91
  const IMPROVEMENT_HINTS = {
48
92
  ship: "Add a GitHub Actions workflow or deploy config to level up.",
49
93
  tooling: "Try connecting an MCP server — filesystem or GitHub are great starters.",
@@ -51,7 +95,7 @@ const IMPROVEMENT_HINTS = {
51
95
  security: "Make sure .env is in your .gitignore and review agent permissions.",
52
96
  ops: "Add build/dev/lint scripts to package.json for a quick ops boost.",
53
97
  };
54
- function commentaryForScore(cat, score) {
98
+ export function commentaryForScore(cat, score) {
55
99
  const c = DIMENSION_COMMENTARY[cat];
56
100
  if (score >= 60)
57
101
  return c.high;
@@ -1 +1 @@
1
- {"version":3,"file":"narrative.js","sourceRoot":"","sources":["../../src/output/narrative.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"narrative.js","sourceRoot":"","sources":["../../src/output/narrative.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import type { ScoreResult, Detection } from "../types.js";
2
2
  export declare function createSpinner(text: string): import("ora").Ora;
3
- export declare function renderResults(score: ScoreResult, detections: Detection[]): void;
3
+ export declare function renderResults(score: ScoreResult, detections: Detection[], durationMs?: number): void;
4
4
  //# sourceMappingURL=terminal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/output/terminal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EAGV,MAAM,aAAa,CAAC;AAqBrB,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,qBAEzC;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,SAAS,EAAE,GACtB,IAAI,CAyGN"}
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/output/terminal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EAEV,MAAM,aAAa,CAAC;AAgJrB,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,qBAEzC;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,SAAS,EAAE,EACvB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CA0GN"}
@@ -3,6 +3,10 @@ import ora from "ora";
3
3
  import { CATEGORY_EMOJI, CATEGORY_LABELS, TAXONOMY_CATEGORIES } from "../types.js";
4
4
  import { getNextTier } from "../scoring/tiers.js";
5
5
  import { generateNarrative } from "./narrative.js";
6
+ import { ARCHETYPE_NAMES, ARCHETYPE_DESCRIPTIONS, LETTER_MEANINGS, commentaryForScore, } from "./narrative.js";
7
+ const HEAVY_SEP = "━".repeat(53);
8
+ const LIGHT_SEP = "─".repeat(52);
9
+ const INDENT = " ";
6
10
  function scoreColor(score) {
7
11
  if (score >= 50)
8
12
  return chalk.green;
@@ -19,77 +23,180 @@ function tierBadge(tier) {
19
23
  };
20
24
  return badges[tier] ?? chalk.gray(`[${tier}]`);
21
25
  }
22
- export function createSpinner(text) {
23
- return ora({ text, spinner: "dots" });
26
+ // Strip ANSI escape codes for width measurement
27
+ function stripAnsi(s) {
28
+ // eslint-disable-next-line no-control-regex
29
+ return s.replace(/\x1b\[[0-9;]*m/g, "");
24
30
  }
25
- export function renderResults(score, detections) {
26
- console.log();
27
- // Header
28
- const levelStr = chalk.bold.white(`Level ${score.level}`);
29
- const tierStr = chalk.bold.cyan(score.tier.title);
30
- const typeStr = chalk.dim(`[${score.typeCode.code}]`);
31
- console.log(` ${levelStr} ${tierStr} ${typeStr}`);
32
- console.log(` ${chalk.dim(score.tier.tagline)}`);
33
- console.log();
34
- // Narrative summary
35
- const narrative = generateNarrative(score, detections);
36
- console.log(` ${chalk.italic(narrative)}`);
37
- console.log();
38
- // Category bar chart
39
- const catMap = new Map(score.categories.map((c) => [c.category, c]));
40
- for (const cat of TAXONOMY_CATEGORIES) {
41
- const cs = catMap.get(cat);
42
- const label = CATEGORY_LABELS[cat].padEnd(12);
43
- const filled = Math.round(cs.score / 10);
44
- const empty = 10 - filled;
45
- const bar = scoreColor(cs.score)("█".repeat(filled)) + chalk.dim("░".repeat(empty));
46
- const scoreStr = scoreColor(cs.score)(String(cs.score).padStart(3));
47
- console.log(` ${label} ${bar} ${scoreStr}`);
31
+ function renderArchetypeBox(typeCode) {
32
+ const name = ARCHETYPE_NAMES[typeCode] ?? "Unknown";
33
+ const desc = ARCHETYPE_DESCRIPTIONS[typeCode] ?? "";
34
+ const keys = Object.keys(LETTER_MEANINGS);
35
+ const line1 = `${typeCode} — ${name}`;
36
+ const meanings1 = `${LETTER_MEANINGS[keys[0]][typeCode[0] === "M" ? 0 : 1]} · ${LETTER_MEANINGS[keys[1]][typeCode[1] === "A" ? 0 : 1]}`;
37
+ const meanings2 = `${LETTER_MEANINGS[keys[2]][typeCode[2] === "R" ? 0 : 1]} · ${LETTER_MEANINGS[keys[3]][typeCode[3] === "D" ? 0 : 1]}`;
38
+ // Truncate description to fit in box (max 49 chars inner width)
39
+ const maxDesc = 49;
40
+ const truncDesc = desc.length > maxDesc ? desc.slice(0, maxDesc - 1) + "…" : desc;
41
+ const boxW = 53;
42
+ const innerW = boxW - 4; // "│ " + " │"
43
+ const pad = (s) => {
44
+ const plain = stripAnsi(s);
45
+ return s + " ".repeat(Math.max(0, innerW - plain.length));
46
+ };
47
+ const lines = [
48
+ `${INDENT}┌${"─".repeat(boxW - 2)}┐`,
49
+ `${INDENT}│ ${pad(chalk.bold.white(line1))} │`,
50
+ `${INDENT}│ ${pad(chalk.gray(meanings1))} │`,
51
+ `${INDENT}│ ${pad(chalk.gray(meanings2))} │`,
52
+ `${INDENT}│ ${pad(chalk.gray(truncDesc))} │`,
53
+ `${INDENT}└${"─".repeat(boxW - 2)}┘`,
54
+ ];
55
+ return lines.join("\n");
56
+ }
57
+ function renderTaxonomyTable(detections, durationMs) {
58
+ const lines = [];
59
+ const catW = 14;
60
+ const nameW = 40;
61
+ // Group detections by category in taxonomy order
62
+ const grouped = new Map();
63
+ for (const d of detections) {
64
+ const list = grouped.get(d.category) ?? [];
65
+ list.push(d);
66
+ grouped.set(d.category, list);
48
67
  }
49
- console.log();
50
- // Detection list grouped by category
51
- console.log(chalk.bold(" Detections"));
52
- console.log(chalk.dim(" " + "-".repeat(52)));
68
+ let categoryCount = 0;
53
69
  for (const cat of TAXONOMY_CATEGORIES) {
54
- const catDetections = detections.filter((d) => d.category === cat);
55
- if (catDetections.length === 0)
70
+ const items = grouped.get(cat);
71
+ if (!items || items.length === 0)
56
72
  continue;
57
- console.log(` ${CATEGORY_EMOJI[cat]} ${chalk.bold(CATEGORY_LABELS[cat])}`);
58
- for (const d of catDetections) {
73
+ categoryCount++;
74
+ for (let i = 0; i < items.length; i++) {
75
+ const d = items[i];
76
+ const catLabel = i === 0 ? CATEGORY_LABELS[cat] : "";
77
+ const truncName = d.name.length > nameW ? d.name.slice(0, nameW - 1) + "…" : d.name;
59
78
  const badge = tierBadge(d.tier);
60
- const innovation = d.taxonomyMatch === null ? chalk.yellow(" *") : "";
61
- const conf = d.confidence === "low" ? chalk.dim(" (low)") : "";
62
- console.log(` ${badge} ${d.name}${innovation}${conf}`);
63
- console.log(` ${chalk.dim(d.source)}`);
79
+ lines.push(`${INDENT} ${catLabel.padEnd(catW)} ${truncName.padEnd(nameW)} ${badge}`);
64
80
  }
65
81
  }
82
+ // Footer
83
+ const scanTime = durationMs ? ` · scanned in ${(durationMs / 1000).toFixed(1)}s` : "";
84
+ lines.push(chalk.gray(`${INDENT} ${detections.length} signals · ${categoryCount} categories${scanTime}`));
85
+ return lines.join("\n");
86
+ }
87
+ function renderKeyMechanisms(detections) {
88
+ const lines = [];
89
+ // Named mechanisms: detections with details.names
90
+ const named = detections.filter((d) => d.details?.names && Array.isArray(d.details.names) && d.details.names.length > 0);
91
+ // Pattern bonuses: id starts with "pattern:"
92
+ const patterns = detections.filter((d) => d.id.startsWith("pattern:"));
93
+ if (named.length === 0 && patterns.length === 0)
94
+ return "";
95
+ lines.push(`${INDENT}${chalk.bold.white("KEY MECHANISMS")}`);
96
+ lines.push(`${INDENT}${chalk.gray(LIGHT_SEP)}`);
97
+ lines.push("");
98
+ for (const d of named) {
99
+ const names = d.details.names;
100
+ const maxShow = 6;
101
+ const shown = names.slice(0, maxShow).join(", ");
102
+ const more = names.length > maxShow ? ` +${names.length - maxShow} more` : "";
103
+ lines.push(`${INDENT} ${chalk.white(d.name)}: ${chalk.gray(shown + more)}`);
104
+ }
105
+ // Deduplicate patterns — only show the primary emission (not :ops, :continuity suffixes)
106
+ const seenPatterns = new Set();
107
+ for (const d of patterns) {
108
+ const base = d.id.includes(":") ? d.id.split(":").slice(0, 2).join(":") : d.id;
109
+ if (seenPatterns.has(base))
110
+ continue;
111
+ seenPatterns.add(base);
112
+ lines.push(`${INDENT} ${chalk.yellow("★")} ${chalk.white(d.name)}`);
113
+ }
114
+ lines.push("");
115
+ return lines.join("\n");
116
+ }
117
+ export function createSpinner(text) {
118
+ return ora({ text, spinner: "dots" });
119
+ }
120
+ export function renderResults(score, detections, durationMs) {
121
+ console.log();
122
+ // 1. Top separator
123
+ console.log(`${INDENT}${chalk.gray(HEAVY_SEP)}`);
124
+ console.log();
125
+ // 2. VIBE CODER SCORE header
126
+ console.log(`${INDENT}${chalk.bold.white("VIBE CODER SCORE")}`);
127
+ console.log();
128
+ // 3. Level · TierTitle [CODE] + tagline
129
+ const levelStr = `Level ${score.level}`;
130
+ const tierStr = score.tier.title;
131
+ const typeStr = `[${score.typeCode.code}]`;
132
+ console.log(`${INDENT}${chalk.bold.white(`${levelStr} · ${tierStr}`)} ${chalk.gray(typeStr)}`);
133
+ console.log(`${INDENT}${chalk.gray(`"${score.tier.tagline}"`)}`);
134
+ console.log();
135
+ // 4. Archetype box
136
+ console.log(renderArchetypeBox(score.typeCode.code));
66
137
  console.log();
67
- // Pioneer badge
138
+ // 5. Pioneer badge (if earned)
68
139
  if (score.pioneer.isPioneer) {
69
- console.log(chalk.yellow.bold(" ★ Pioneer Badge"));
70
- console.log(chalk.yellow(` ${score.pioneer.innovations.length} innovation(s) detected`));
140
+ console.log(`${INDENT}${chalk.yellow.bold("★ Pioneer Badge")}`);
141
+ console.log(`${INDENT}${chalk.yellow(` ${score.pioneer.innovations.length} innovation(s) detected`)}`);
71
142
  for (const inn of score.pioneer.innovations) {
72
- console.log(chalk.yellow(` → ${inn.name} (${inn.source})`));
143
+ console.log(`${INDENT}${chalk.yellow(` → ${inn.name}`)}`);
73
144
  }
74
145
  console.log();
75
146
  }
76
- // Improvement hints
147
+ // 6. YOUR SETUP header + bar chart + narrative
148
+ console.log(`${INDENT}${chalk.bold.white("YOUR SETUP")}`);
149
+ console.log(`${INDENT}${chalk.gray(LIGHT_SEP)}`);
150
+ console.log();
151
+ const catMap = new Map(score.categories.map((c) => [c.category, c.score]));
152
+ for (const cat of TAXONOMY_CATEGORIES) {
153
+ const s = catMap.get(cat) ?? 0;
154
+ const label = CATEGORY_LABELS[cat].padEnd(12);
155
+ const filled = Math.round(s / 10);
156
+ const empty = 10 - filled;
157
+ const bar = scoreColor(s)("█".repeat(filled)) + chalk.gray("░".repeat(empty));
158
+ const scoreStr = chalk.bold.white(String(s).padStart(3));
159
+ console.log(`${INDENT} ${label} ${bar} ${scoreStr}`);
160
+ }
161
+ console.log();
162
+ const narrative = generateNarrative(score, detections);
163
+ console.log(`${INDENT}${chalk.white(narrative)}`);
164
+ console.log();
165
+ // 7. WHAT WE FOUND header + taxonomy table
166
+ console.log(`${INDENT}${chalk.bold.white("WHAT WE FOUND")}`);
167
+ console.log(`${INDENT}${chalk.gray(LIGHT_SEP)}`);
168
+ console.log();
169
+ console.log(renderTaxonomyTable(detections, durationMs));
170
+ console.log();
171
+ // 7b. Key mechanisms (named agents/skills/commands + pattern bonuses)
172
+ const keyMech = renderKeyMechanisms(detections);
173
+ if (keyMech) {
174
+ console.log(keyMech);
175
+ }
176
+ // 8. GROWTH AREAS — up to 3 weakest categories with commentary
77
177
  const weakest = [...score.categories]
78
178
  .filter((c) => c.score < 50)
79
179
  .sort((a, b) => a.score - b.score)
80
180
  .slice(0, 3);
81
181
  if (weakest.length > 0) {
82
- console.log(chalk.bold(" Growth areas"));
182
+ console.log(`${INDENT}${chalk.bold.white("GROWTH AREAS")}`);
183
+ console.log(`${INDENT}${chalk.gray(LIGHT_SEP)}`);
184
+ console.log();
83
185
  for (const w of weakest) {
84
- console.log(` ${chalk.dim("→")} ${CATEGORY_LABELS[w.category]}: ${w.score}/100`);
186
+ const emoji = CATEGORY_EMOJI[w.category];
187
+ console.log(`${INDENT} ${emoji} ${chalk.white(CATEGORY_LABELS[w.category])} ${chalk.gray(`(${w.score}/100)`)}`);
188
+ console.log(`${INDENT} ${chalk.gray(commentaryForScore(w.category, w.score))}`);
85
189
  }
86
190
  console.log();
87
191
  }
88
- // Next tier hint
192
+ // 9. Next tier hint
89
193
  const next = getNextTier(score.tier.title);
90
194
  if (next) {
91
- console.log(chalk.dim(` Next tier: ${next.title} (level ${next.minLevel}+)`));
195
+ console.log(`${INDENT}${chalk.gray(`Next tier: ${next.title} (level ${next.minLevel}+)`)}`);
92
196
  console.log();
93
197
  }
198
+ // 10. Bottom separator
199
+ console.log(`${INDENT}${chalk.gray(HEAVY_SEP)}`);
200
+ console.log();
94
201
  }
95
202
  //# sourceMappingURL=terminal.js.map