@rosh100yx/outlier 0.3.0 → 0.4.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/README.md CHANGED
@@ -1,7 +1,12 @@
1
1
  <div align="center">
2
+ <img src="assets/cover.jpg" alt="Outlier Cover" width="100%" />
2
3
  <h1>outlier</h1>
3
4
  <p><b>The Governance & Policy Engine for AI Engineering</b></p>
4
5
  <p><i>Measure AI adoption. Enforce Zero-Trust. Protect Human Mastery.</i></p>
6
+ <br/>
7
+ <a href="https://github.com/rosh100yx/outlier/issues/new?assignees=&labels=enhancement&projects=&template=feature_request.md&title=%5BFEATURE%5D+">
8
+ <img src="https://img.shields.io/badge/%E2%9C%A8_Feature_Request-Submit_an_idea-blueviolet?style=for-the-badge&logo=github" alt="Feature Request" />
9
+ </a>
5
10
 
6
11
  <p>
7
12
  <img src="https://img.shields.io/badge/Compliance-Strict-blue?style=for-the-badge" />
@@ -9,6 +14,15 @@
9
14
  <img src="https://img.shields.io/badge/Zero_Trust-Verified-orange?style=for-the-badge" />
10
15
  <img src="https://img.shields.io/badge/Carbon_Footprint-Tracked-lightgrey?style=for-the-badge" />
11
16
  </p>
17
+
18
+ <p>
19
+ <b>Get Started Instantly:</b><br/>
20
+ <code>npx @rosh100yx/outlier status</code>
21
+ </p>
22
+
23
+ <br/>
24
+ <img src="assets/cli-demo.png" alt="Outlier CLI Demo" width="800" />
25
+ <br/>
12
26
  </div>
13
27
 
14
28
  `outlier` is an open-source, local-first policy engine and governance framework designed to measure the true cost and risk of AI code generation. As teams accelerate with LLM agents (Cursor, Copilot, Claude Code), `outlier` acts as the definitive **Bouncer**—auditing AI authorship, mitigating deskilling risks, and tracking regional carbon footprints entirely locally.
@@ -21,22 +35,9 @@
21
35
 
22
36
  > *"In a room full of agents" shifts the perspective. It acknowledges that the developer is no longer a solo coder; they are a manager of bots. The product exists to make sure the human doesn't get lazy while managing them. We all want our time back, but we don't want to lose control of the craft.*
23
37
 
24
- ```text
25
- ┌ outlier
26
-
27
- ◇ [outlier] 4/5 policies • ✓ safe surface • Local CI ───────╮
28
- │ │
29
- │ [1] Capability Engine ▰▰▰▰▰▰▱▱▱▱ Active │
30
- │ status: ✓ Configured │
31
- │ (=^・ω・^=) [2] AI Code Reliance ▰▰▰▰▰▰▰▰▱▱ 85.0% Reliance │
32
- │ vibe: Did you write any of this, or are you just the manager now? (ФДФ)
33
- │ gate: (=ಠᆽಠ=) Deskilling Risk Detected ⚠ Security Audit Required
34
- │ [3] Tokenomics & Cost ▰▰▰▰▰▰▰▰▰▱ 96.5% Cache Bloat │
35
- │ waste: ⚠ 96.5% of tokens are redundant context reads │
36
- │ Governance: (=ಠᆽಠ=) 1 policy failures │
37
- │ │
38
- ├────────────────────────────────────────────────────────────╯
39
- ```
38
+ <div align="center">
39
+ <img src="assets/codecore.gif" alt="Codecore Aesthetic" width="300" />
40
+ </div>
40
41
 
41
42
  ## How It Works
42
43
  ```text
@@ -66,10 +67,13 @@
66
67
  ## Commands
67
68
  | Command | Purpose |
68
69
  |---------|---------|
69
- | `outlier audit` | Run the standard telemetry dashboard (Cats + Vibes + Metrics) |
70
- | `outlier audit --strict` | Run the dashboard without the Cats/Vibes (Enterprise Dry Mode) |
71
- | `outlier policy` | Interactively select and install the Git Pre-Commit Hook (Bouncer) |
72
- | `outlier capabilities` | Audit your workspace for active MCP servers and Open Session Skills |
70
+ | `outlier` | Start the interactive Onboarding Wizard (Recommended for first-timers) |
71
+ | `outlier --help` | View the CLI help menu and all available commands |
72
+ | `outlier status` | Run the full AI reliance & capability audit (Generates the Thermal Receipt) |
73
+ | `outlier authorship` | Scan git history for AI co-authorship ratio and Hallucination Risk |
74
+ | `outlier carbon` | Scan local logs for context waste & token costs |
75
+ | `outlier policy` | Configure Personal, Team, or Enterprise guardrails in CI |
76
+ | `outlier confessional` | Submit qualitative feedback or feature requests directly from the terminal |
73
77
 
74
78
  ## Quickstart: Your First Audit
75
79
 
@@ -103,7 +107,7 @@
103
107
  ## FAQ
104
108
 
105
109
  **Does this send my code or prompts to the cloud?**
106
- No. `outlier` is a zero-trust, local-first engine. It parses `git log` and local JSONL token logs. Your code and token usage never leave your machine.
110
+ **Absolutely not.** `outlier` is built on a strict **Zero-Trust, Local-First Architecture**. It runs native parsing commands against your `.git/` history and your local `~/.claude/` session logs. It never calls an API, it never extracts your proprietary data, and it never phones home. Your research, your code, and your prompts stay 100% on your machine. We believe in open-source integrity.
107
111
 
108
112
  **Do I need to be using a specific IDE?**
109
113
  `outlier` is IDE-agnostic. It works by parsing standard `Co-Authored-By` Git trailers, meaning it supports Claude Code, Cursor, Aider, and manual generation.
package/bin/outlier ADDED
Binary file
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@rosh100yx/outlier",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "AI Code Governance & Capability Auditing for the Terminal. Measures AI reliance, context waste, and enforces local CI/CD policies.",
5
5
  "bin": {
6
- "outlier": "bin/outlier.js"
6
+ "outlier": "bin/outlier"
7
7
  },
8
8
  "files": [
9
- "bin/outlier.js",
9
+ "bin/outlier",
10
10
  "src",
11
11
  "data"
12
12
  ],
@@ -42,7 +42,6 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@clack/prompts": "^1.6.0",
45
- "commander": "^15.0.0",
46
45
  "picocolors": "^1.1.1"
47
46
  }
48
47
  }
package/src/cli.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env bun
2
- import { intro, outro, select, spinner, isCancel, cancel, note } from '@clack/prompts';
2
+ import { intro, outro, select, spinner, isCancel, cancel, note, text } from '@clack/prompts';
3
3
  import pc from 'picocolors';
4
4
  import { getAuthorshipStats } from './git';
5
5
  import { getCarbonStats } from './carbon';
6
6
  import { getCapabilitiesStats } from './capabilities';
7
7
  import { writeFileSync, chmodSync, existsSync } from 'fs';
8
8
  import { join } from 'path';
9
+ import { execSync } from 'child_process';
9
10
 
10
11
  const ASCII_LOGO = `
11
12
  ____ _ _ _____ _ ___ _____ ____
@@ -16,14 +17,92 @@ const ASCII_LOGO = `
16
17
  \\____/|_| |_| |_| |_| |_|___|_____|_| \\_\\
17
18
  `;
18
19
 
20
+ import os from 'os';
21
+ import { confirm } from '@clack/prompts';
22
+
23
+ async function runOnboarding() {
24
+ console.clear();
25
+ console.log(pc.cyan(ASCII_LOGO));
26
+ intro(pc.inverse(' outlier: Welcome '));
27
+
28
+ note(
29
+ `Outlier is a local-first Policy Engine & Governance Framework for AI Engineering.
30
+
31
+ Our mission is AI Safety for developers:
32
+ As agents (Cursor, Copilot, Claude) write more of our code, we lose visibility into:
33
+ 1. Deskilling Risk (Are we becoming spectators in our own codebase?)
34
+ 2. Carbon Cost (What is the true regional energy cost of token caching?)
35
+ 3. Capability Drift (What hidden skills and external tools are our agents using?)
36
+
37
+ We built Outlier to enforce Zero-Trust and protect Human Mastery. You are in control.`,
38
+ 'The Problem: AI Safety in Development'
39
+ );
40
+
41
+ note(
42
+ `Outlier operates entirely on your machine.
43
+ - Local Only: No API keys. No cloud telemetry. No data leaves your machine.
44
+ - Native Auditing: We only read your local \`~/.claude\` logs and \`.git/\` commit history.
45
+ - Actionable Policies: We enforce rules locally via terminal or Git pre-commit hooks.`,
46
+ 'Privacy & Zero-Trust Principles'
47
+ );
48
+
49
+ note(
50
+ `Available Commands:
51
+ - status: Run a full system audit (Reliance, Carbon, Capabilities)
52
+ - policy: Configure team/enterprise guardrails and CLI blockers
53
+ - carbon: View isolated token caching metrics and regional counterfactuals
54
+ - authorship: View Git authorship ratio (Human vs AI)`,
55
+ 'How it is used'
56
+ );
57
+
58
+ note(
59
+ `When you start the audit, Outlier will locally parse your Git commits to identify AI co-authorship and cross-reference your agent logs to calculate token waste.
60
+
61
+ The results will assign you a "vibe" and evaluate if you are at risk of deskilling.`,
62
+ 'What to Expect'
63
+ );
64
+
65
+ const ready = await confirm({
66
+ message: 'Are you ready to run your first Governance Audit and measure your AI reliance?',
67
+ initialValue: true,
68
+ });
69
+
70
+ if (isCancel(ready) || !ready) {
71
+ cancel('Onboarding paused. Run outlier again when you are ready.');
72
+ process.exit(0);
73
+ }
74
+
75
+ const configPath = join(os.homedir(), '.outlier_config');
76
+ writeFileSync(configPath, JSON.stringify({ onboarded: true, date: new Date().toISOString() }));
77
+ }
78
+
19
79
  async function main() {
20
80
  console.clear();
21
81
  console.log(pc.cyan(ASCII_LOGO));
22
- console.log(pc.dim(' Outlier v0.3.0 · AI Code Reliance & Telemetry Engine\n'));
82
+ console.log(pc.dim(' Outlier v0.4.0 · AI Code Reliance & Telemetry Engine\n'));
83
+
84
+ let action = process.argv[2] as any;
23
85
 
86
+ if (action === '--help' || action === '-h' || action === 'help') {
87
+ console.log(pc.bold('\nCOMMANDS:'));
88
+ console.log(` ${pc.cyan('outlier')} Interactive menu (Onboarding for first-timers)`);
89
+ console.log(` ${pc.cyan('outlier status')} Run full AI reliance & capability audit`);
90
+ console.log(` ${pc.cyan('outlier authorship')} Scan git history for AI co-authorship ratio`);
91
+ console.log(` ${pc.cyan('outlier carbon')} Scan local logs for token waste & carbon cost`);
92
+ console.log(` ${pc.cyan('outlier policy')} Configure CI/CD guardrails and thresholds`);
93
+ console.log(` ${pc.cyan('outlier confessional')} Submit qualitative feedback or feature requests`);
94
+ console.log('\n' + pc.dim('Run without arguments to start the interactive wizard.'));
95
+ process.exit(0);
96
+ }
97
+
98
+ const configPath = join(os.homedir(), '.outlier_config');
99
+ if (!existsSync(configPath) && !action) {
100
+ await runOnboarding();
101
+ action = 'status'; // auto-run status after onboarding
102
+ }
103
+
24
104
  intro(pc.inverse(' outlier '));
25
105
 
26
- let action = process.argv[2] as any;
27
106
  if (!action || action === 'audit') {
28
107
  if (action !== 'audit') {
29
108
  action = await select({
@@ -33,7 +112,8 @@ async function main() {
33
112
  { value: 'capabilities', label: 'Capabilities Map', hint: 'Audit active MCPs, skills, and orchestrations' },
34
113
  { value: 'authorship', label: 'Code Durability', hint: 'Scan git history for AI Code Reliance & Hallucination Risk' },
35
114
  { value: 'carbon', label: 'Cache Bloat', hint: 'Scan local logs for context waste & token costs' },
36
- { value: 'policy', label: 'Policy Profiles', hint: 'Set Personal, Team, or Enterprise guardrails in CI' }
115
+ { value: 'policy', label: 'Policy Profiles', hint: 'Set Personal, Team, or Enterprise guardrails in CI' },
116
+ { value: 'confessional', label: 'Confessional', hint: 'Tell us how AI is really affecting your job (Feature Requests)' }
37
117
  ],
38
118
  });
39
119
 
@@ -71,15 +151,13 @@ Ratio: ~31x carbon penalty on coal-heavy grid`,
71
151
  s.stop('Audit failed');
72
152
  console.error(pc.red(e.message));
73
153
  }
74
- } else if (action === 'authorship' || action === 'status') {
75
- s.start('Scanning local git history and agent logs...');
76
-
154
+ } else if (action === 'authorship') {
155
+ s.start('Scanning local git history...');
77
156
  try {
78
157
  const gitStats = await getAuthorshipStats().catch(() => null);
79
- const carbon = await getCarbonStats().catch(() => null);
80
158
  s.stop('Audit complete');
81
159
 
82
- if (action === 'authorship' && gitStats) {
160
+ if (gitStats) {
83
161
  const pct = (gitStats.ratio * 100).toFixed(1);
84
162
  const nmPct = (gitStats.ratioNoMerges * 100).toFixed(1);
85
163
 
@@ -103,14 +181,53 @@ AI Co-Authored: ${gitStats.aiNoMerges}
103
181
  Conservative Floor: ${color(nmPct + '%')}`,
104
182
  'Git Authorship Breakdown'
105
183
  );
106
- } else if (action === 'status') {
107
- const isStrict = process.argv.includes('--strict');
108
- s.start('Running outlier telemetry audit...');
109
- const carbon = await getCarbonStats().catch(() => null);
110
- const gitStats = await getAuthorshipStats().catch(() => null);
111
- const capabilities = await getCapabilitiesStats().catch(() => null);
112
- s.stop('Audit complete');
113
-
184
+ }
185
+ } catch (e: any) {
186
+ s.stop('Audit failed');
187
+ console.error(pc.red(e.message));
188
+ }
189
+ } else if (action === 'status') {
190
+ const isStrict = process.argv.includes('--strict');
191
+
192
+ let gitStats: any = null;
193
+ let carbon: any = null;
194
+ let capabilities: any = null;
195
+
196
+ if (!isStrict) {
197
+ s.start('[SYSTEM] Booting local-first sandbox...');
198
+ await new Promise(r => setTimeout(r, 800));
199
+ s.message(`↳ Guarantee: No API calls. Your code and logs never leave this machine.`);
200
+ await new Promise(r => setTimeout(r, 1200));
201
+
202
+ s.message('[GIT] Scanning your commit history...');
203
+ gitStats = await getAuthorshipStats().catch(() => null);
204
+ await new Promise(r => setTimeout(r, 600));
205
+ s.message(`↳ Check: Are you writing the code, or just reviewing what the AI wrote?`);
206
+ await new Promise(r => setTimeout(r, 1200));
207
+
208
+ s.message('[TOKENS] Parsing local AI logs (~/.claude/)...');
209
+ carbon = await getCarbonStats().catch(() => null);
210
+ await new Promise(r => setTimeout(r, 600));
211
+ s.message(`↳ Check: How much API waste is your workflow generating locally?`);
212
+ await new Promise(r => setTimeout(r, 1200));
213
+
214
+ s.message('[ANALYSIS] Calculating your mastery score...');
215
+ capabilities = await getCapabilitiesStats().catch(() => null);
216
+ await new Promise(r => setTimeout(r, 600));
217
+ s.message(`↳ Warning: Heavy AI use creates the 'Illusion of Competence'. Don't lose your edge.`);
218
+ await new Promise(r => setTimeout(r, 1200));
219
+
220
+ s.message('[PRINT] Generating Thermal Receipt...');
221
+ await new Promise(r => setTimeout(r, 600));
222
+ } else {
223
+ s.start('Running outlier telemetry audit...');
224
+ gitStats = await getAuthorshipStats().catch(() => null);
225
+ carbon = await getCarbonStats().catch(() => null);
226
+ capabilities = await getCapabilitiesStats().catch(() => null);
227
+ }
228
+ s.stop('Audit complete');
229
+
230
+ try {
114
231
  let authPct = '0%';
115
232
  let ruleFailures = 0;
116
233
  let authWarning = '';
@@ -165,7 +282,6 @@ ${costIcon}${pc.dim('[3] Tokenomics & Cost')} ${pc.magenta('▰▰▰▰▰▰
165
282
  ${pc.bold('Governance:')} ${ruleFailures > 0 ? pc.red(`${failIcon} ${ruleFailures + 1} policy failures`) : pc.green(`${passIcon} All clear`)}`,
166
283
  `${pc.bold('[outlier]')} ${5 - (ruleFailures+1)}/5 policies • ${authWarning || pc.green(`${passIcon} safe surface`)} • ${co2Str}`
167
284
  );
168
- }
169
285
  } catch (e: any) {
170
286
  s.stop('Audit failed');
171
287
  console.error(pc.red(e.message));
@@ -238,8 +354,8 @@ ${caps.skills.length > 5 ? pc.red('⚠ High Surface Area: Ensure strict authorsh
238
354
 
239
355
  const isStrict = process.argv.includes('--strict');
240
356
  const bouncerMsg = isStrict
241
- ? `echo "outlier policy violation: AI authorship ($CURRENT_RATIO%) exceeds threshold ($MAX_RATIO%)"`
242
- : `echo "😾 The Bouncer says no: Your code is $CURRENT_RATIO% AI-generated."\n echo "A human must review this before it enters the club (main branch)."`;
357
+ ? `echo "⚠️ outlier policy warning: AI authorship ($CURRENT_RATIO%) exceeds threshold ($MAX_RATIO%)"`
358
+ : `echo "🛡️ Outlier Bouncer: Repository AI-generation ($CURRENT_RATIO%) exceeds your defined mastery threshold ($MAX_RATIO%)."\n echo "Take a moment to review your recent architectural decisions. Ensure you still understand the system."`;
243
359
 
244
360
  const hookPath = join(gitDir, 'hooks', 'pre-commit');
245
361
  if (existsSync(hookPath)) {
@@ -257,10 +373,11 @@ if [ "$TOTAL" -eq 0 ]; then exit 0; fi
257
373
  CURRENT_RATIO=$(awk "BEGIN {print ($AI / $TOTAL) * 100}")
258
374
  MAX_RATIO=${maxAuthorship}
259
375
 
260
- OVER_LIMIT=$(awk "BEGIN {if ($CURRENT_RATIO > $MAX_RATIO) print 1; else print 0}")
376
+ OVER_LIMIT=$(awk "BEGIN {print ($CURRENT_RATIO > $MAX_RATIO) ? 1 : 0}")
261
377
  if [ "$OVER_LIMIT" -eq 1 ]; then
262
378
  ${bouncerMsg}
263
- exit 1
379
+ # Warn instead of hard-blocking the commit, protecting human iterations
380
+ exit 0
264
381
  fi
265
382
  echo "✅ Governance Policy OK"
266
383
  `;
@@ -282,7 +399,7 @@ Enforcement: ${pc.cyan('Local pre-commit hook installed (backup created)')}`,
282
399
  await new Promise(resolve => setTimeout(resolve, 1200));
283
400
 
284
401
  const reportPath = join(process.cwd(), 'outlier-audit-report.jsonl');
285
- writeFileSync(reportPath, JSON.stringify({ timestamp: new Date().toISOString(), status: 'COMPLIANT', policy: 'Decree 142', humanOversight: true }) + '\\n');
402
+ writeFileSync(reportPath, JSON.stringify({ timestamp: new Date().toISOString(), status: 'PREVIEW', policy: 'Decree 142', simulatedOversight: true }) + '\n');
286
403
  s.stop('Audit Generated');
287
404
 
288
405
  note(
@@ -293,14 +410,76 @@ Artifact: ${pc.cyan(reportPath)}`,
293
410
  'Regulatory Compliance'
294
411
  );
295
412
  }
413
+ } else if (action === 'confessional') {
414
+ s.start('Connecting to the human element...');
415
+ await new Promise(resolve => setTimeout(resolve, 600));
416
+ s.stop('Secure connection established.');
417
+
418
+ const feedback = await text({
419
+ message: pc.cyan('What is AI actually doing to your codebase? Are you a 10x dev or a 10x reviewer now?\n(Note: This will draft a public GitHub issue)'),
420
+ placeholder: 'Honestly, I just let the agent write the regex...',
421
+ validate(value) {
422
+ if (!value || value.length === 0) return `C'mon, confess something!`;
423
+ },
424
+ });
425
+
426
+ if (isCancel(feedback)) {
427
+ cancel('Confession aborted.');
428
+ process.exit(0);
429
+ }
430
+
431
+ note(
432
+ `${pc.italic(`"${feedback}"`)}\n\nYour confession is safe with us. But if you want to make it official (and help us build what you need), we've generated a secure transmission link for you.`,
433
+ 'The Confessional'
434
+ );
435
+
436
+ const url = `https://github.com/rosh100yx/outlier/issues/new?assignees=&labels=enhancement&projects=&template=feature_request.md&title=%5BConfessional%5D+Feedback&body=${encodeURIComponent(feedback.toString())}`;
437
+ console.log(`\n${pc.bold('Submit here:')} ${pc.underline(pc.cyan(url))}\n`);
438
+
439
+ try {
440
+ if (process.platform === 'darwin') {
441
+ execSync(`open "${url}"`);
442
+ }
443
+ } catch(e) {}
296
444
  }
297
445
 
298
- let shareText = 'Local telemetry run completed. No data left your machine.';
299
- if (action === 'status') {
300
- shareText += `\n\n${pc.dim('└')} ${pc.cyan('Share your audit:')} https://x.com/intent/tweet?text=I%20just%20audited%20my%20codebase%20for%20AI%20reliance%20and%20deskilling%20risk.%20What%20does%20your%20repo%20score%3F%0A%0A%F0%9F%93%8F%20npx%20%40rosh100yx%2Foutlier`;
446
+ outro('Local telemetry run completed. No data left your machine.');
447
+
448
+ // Artifact Level Storytelling: Dither Garden style thermal receipt
449
+ if (action === 'status' || action === 'authorship' || action === 'carbon') {
450
+ const d = new Date();
451
+ const dateStr = d.toLocaleDateString('en-US', { month: 'short', day: '2-digit', year: 'numeric' }).toUpperCase();
452
+ const timeStr = d.toLocaleTimeString('en-US', { hour12: false });
453
+
454
+ let repoName = process.cwd().split('/').pop() || 'Unknown';
455
+
456
+ console.log(`\n${pc.dim('-------------------------')} ${pc.bold('AUDIT RECEIPT')} ${pc.dim('-------------------------')}`);
457
+ console.log(`\n Project ${pc.bold(repoName.padEnd(16).substring(0,16))}`);
458
+ console.log(` Timestamp ${pc.dim(`${dateStr} ${timeStr}`)}\n`);
459
+
460
+ console.log(` 01x Authorship Policy ${process.argv.includes('--strict') ? 'Strict Mode' : 'Vibe Check'}`);
461
+ console.log(` 02x AI Reliance Risk ${action === 'carbon' ? 'N/A' : 'Assessed'}`);
462
+ console.log(` 03x Cache Bloat Tokens ${action === 'authorship' ? 'N/A' : 'Audited'}`);
463
+ console.log(` 04x Regional Grid Check ${action === 'authorship' ? 'N/A' : 'Completed'}\n`);
464
+
465
+ console.log(pc.dim(' **********************************************************'));
466
+ console.log(`\n ${pc.italic('patterns emerge in the commit history,')}`);
467
+ console.log(` ${pc.italic('code becomes commoditized by algorithms.')}`);
468
+ console.log(` ${pc.italic('human mastery is the only true moat.')}\n`);
469
+ console.log(pc.dim(' **********************************************************\n'));
470
+
471
+ console.log(' Outlier Governance Engine');
472
+ console.log(pc.bold('\n ***AUDIT COMPLETE***'));
473
+ console.log(pc.bold(' ***STAY VIGILANT***\n'));
301
474
  }
302
475
 
303
- outro(shareText);
476
+ console.log(
477
+ pc.dim(
478
+ `└ Share your audit: https://x.com/intent/tweet?text=${encodeURIComponent(
479
+ 'I just audited my codebase for AI reliance and deskilling risk. What does your repo score?\n\n📏 npx @rosh100yx/outlier'
480
+ )}`
481
+ )
482
+ );
304
483
  }
305
484
 
306
485
  main().catch(console.error);
package/bin/outlier.js DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env node
2
- import { spawnSync } from 'child_process';
3
- import path from 'path';
4
- import { fileURLToPath } from 'url';
5
-
6
- const __filename = fileURLToPath(import.meta.url);
7
- const __dirname = path.dirname(__filename);
8
-
9
- const cliPath = path.join(__dirname, '../src/cli.ts');
10
- const result = spawnSync('bun', ['run', cliPath, ...process.argv.slice(2)], {
11
- stdio: 'inherit'
12
- });
13
-
14
- process.exit(result.status || 0);