emmetandrews 1.0.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.
Files changed (2) hide show
  1. package/index.js +194 -0
  2. package/package.json +11 -0
package/index.js ADDED
@@ -0,0 +1,194 @@
1
+ #!/usr/bin/env node
2
+
3
+ const readline = require('readline');
4
+
5
+ const C = {
6
+ reset: '\x1b[0m',
7
+ bold: '\x1b[1m',
8
+ dim: '\x1b[2m',
9
+ cyan: '\x1b[96m',
10
+ green: '\x1b[92m',
11
+ yellow: '\x1b[93m',
12
+ white: '\x1b[97m',
13
+ purple: '\x1b[95m'
14
+ };
15
+
16
+ const NAME = 'Emmet Andrews';
17
+ const HANDLE = 'emmetandrews';
18
+ const WIDTH = () => Math.min(process.stdout.columns || 72, 72);
19
+
20
+ // Word-wrap a string to a given width, with an optional hanging indent
21
+ function wrap(text, width, indent = '') {
22
+ const words = text.split(' ');
23
+ const lines = [];
24
+ let line = '';
25
+ for (const word of words) {
26
+ const test = line ? line + ' ' + word : word;
27
+ if (test.length > width - indent.length) {
28
+ if (line) lines.push(line);
29
+ line = word;
30
+ } else {
31
+ line = test;
32
+ }
33
+ }
34
+ if (line) lines.push(line);
35
+ return lines.map((l, i) => (i === 0 ? l : indent + l)).join('\n');
36
+ }
37
+
38
+ // Wrap a bullet point with hanging indent so wrapped lines align past the bullet
39
+ function bullet(text, width) {
40
+ return ' ' + wrap(text, width - 2, ' ');
41
+ }
42
+
43
+ // Section header
44
+ function header(title) {
45
+ return `${C.yellow}${C.bold}${title}${C.reset}`;
46
+ }
47
+
48
+ // Job block
49
+ function job(title, company, dates, bullets, width) {
50
+ const lines = [
51
+ `${C.bold}${C.yellow}${title} @ ${company} · ${dates}${C.reset}`,
52
+ ];
53
+ for (const b of bullets) lines.push(bullet('· ' + b, width));
54
+ return lines.join('\n');
55
+ }
56
+
57
+ const DATA = {
58
+ about: (w) => [
59
+ `${C.bold}${C.yellow}Emmet Andrews${C.reset} ${C.dim}Data Science & Business Strategy${C.reset}`,
60
+ '',
61
+ wrap('After 8 years developing stories for Hollywood studios and streamers, I\'m now excited to uncover and communicate the stories hidden in company data.', w),
62
+ wrap('I translate insights into clear strategies for executives and stakeholders.', w),
63
+ '',
64
+ `${C.dim}Python · SQL · R · Tableau · Machine Learning${C.reset}`,
65
+ `${C.dim}MS Business Analytics Candidate @ UCLA Anderson · Open to new opportunities${C.reset}`,
66
+ ].join('\n'),
67
+
68
+ skills: (w) => [
69
+ header('Programming & Tools'),
70
+ bullet('Python (pandas, NumPy, scikit-learn, statsmodels), SQL (MySQL, DuckDB), R, Jupyter, Tableau, Power BI, dbt, Azure, Git/GitHub', w),
71
+ '',
72
+ header('Machine Learning & Predictive Analytics'),
73
+ bullet('Regression, Classification, Clustering, Feature Engineering, Model Evaluation, Forecasting, Time Series Analysis', w),
74
+ '',
75
+ header('Experimentation & Statistics'),
76
+ bullet('A/B Testing, Experimental Design, Hypothesis Testing, Statistical Inference, Causal Analysis', w),
77
+ '',
78
+ header('Data Analytics & Business Intelligence'),
79
+ bullet('Data Storytelling, Dashboarding, User Segmentation, Audience Insights, Business Strategy, BI Reporting', w),
80
+ '',
81
+ header('Data Engineering & Infrastructure'),
82
+ bullet('ETL Pipelines, API Integration, Data Cleaning, Data Warehousing, Cloud Data Infrastructure', w),
83
+ ].join('\n'),
84
+
85
+ experience: (w) => [
86
+ job(
87
+ 'Development Executive (Contract)', 'Legendary Studios', 'Jan 2022 – Aug 2025',
88
+ [
89
+ 'Analyzed high-volume performance metrics and audience engagement data to improve project development.',
90
+ 'Conducted market and genre analysis to identify emerging growth segments in adult animation, influencing new IP investments across streaming and linear platforms.',
91
+ 'Aligned creative direction with financial and strategic objectives, ensuring projects met predefined market goals.',
92
+ 'Prepared executive presentations translating data analysis and creative development into actionable content strategy recommendations.',
93
+ ], w
94
+ ),
95
+ '',
96
+ job(
97
+ 'Coordinator, Animated TV Series', 'Fox Entertainment', 'Jul 2019 – Jan 2022',
98
+ [
99
+ 'Delivered insights and strategic recommendations shaping greenlight decisions and optimizing Fox\'s animated content slate.',
100
+ 'Identified performance trends using Nielsen ratings and market competition viewership, recommending strategic content adjustments.',
101
+ 'Coordinated full development cycle of 30+ animated series across multiple creative partners, meeting strict linear television airdates.',
102
+ ], w
103
+ ),
104
+ '',
105
+ job(
106
+ 'Research Assistant', 'Badyaev Research Lab, UofA', 'May 2015 – May 2016',
107
+ [
108
+ 'Performed regression and network analyses using SAS and Cytoscape on biological datasets; findings published in peer-reviewed research.',
109
+ ], w
110
+ ),
111
+ ].join('\n'),
112
+
113
+ education: (_w) => [
114
+ `${C.bold}${C.yellow}M.S. Business Analytics${C.reset}`,
115
+ ` UCLA Anderson ${C.dim}· Expected 2026${C.reset}`,
116
+ '',
117
+ `${C.bold}${C.yellow}B.S. Molecular & Cellular Biology${C.reset}`,
118
+ ` University of Arizona ${C.dim}· 2016${C.reset}`,
119
+ ].join('\n'),
120
+
121
+ projects: (_w) => [
122
+ `${C.yellow}portfolio-cli${C.reset}`,
123
+ ` ${C.dim}This resume — you're running it right now${C.reset}`,
124
+ '',
125
+ `${C.yellow}Movie Recommender Engine${C.reset}`,
126
+ ` github.com/emmetand/streaming-recs-project`,
127
+ '',
128
+ `${C.yellow}Quant Equity Simulator${C.reset}`,
129
+ ` github.com/emmetand/dynamic-quant-equity-simulator`,
130
+ '',
131
+ `${C.yellow}Customer Retention Dashboard${C.reset}`,
132
+ ` github.com/emmetand/customer-retention-project`,
133
+ ].join('\n'),
134
+
135
+ contact: (_w) => [
136
+ `${C.yellow}Email${C.reset} emmet.andrews.2026@anderson.ucla.edu`,
137
+ `${C.yellow}GitHub${C.reset} github.com/emmetand`,
138
+ `${C.yellow}LinkedIn${C.reset} linkedin.com/in/emmet-andrews`,
139
+ ].join('\n'),
140
+ };
141
+
142
+ const HELP = () => [
143
+ `${C.yellow}Commands${C.reset}`,
144
+ ` ${C.cyan}about${C.reset} who I am`,
145
+ ` ${C.cyan}skills${C.reset} technical skills`,
146
+ ` ${C.cyan}experience${C.reset} work history`,
147
+ ` ${C.cyan}education${C.reset} academic background`,
148
+ ` ${C.cyan}projects${C.reset} things I've built`,
149
+ ` ${C.cyan}contact${C.reset} get in touch`,
150
+ ` ${C.cyan}clear${C.reset} clear the screen`,
151
+ ` ${C.cyan}exit${C.reset} quit`,
152
+ ].join('\n');
153
+
154
+ function banner() {
155
+ const w = WIDTH();
156
+ const line = '─'.repeat(w);
157
+ console.log('\n' + C.dim + line + C.reset);
158
+ console.log(`${C.bold}${C.yellow} ${NAME}${C.reset} ${C.dim}Interactive Resume${C.reset}`);
159
+ console.log(C.dim + line + C.reset);
160
+ console.log(`${C.dim} Type 'help' to see available commands${C.reset}\n`);
161
+ }
162
+
163
+ const rl = readline.createInterface({
164
+ input: process.stdin,
165
+ output: process.stdout,
166
+ prompt: `${C.cyan}visitor@${HANDLE}${C.reset}:~$ `,
167
+ });
168
+
169
+ banner();
170
+ rl.prompt();
171
+
172
+ rl.on('line', (line) => {
173
+ const cmd = line.trim().toLowerCase();
174
+ const w = WIDTH();
175
+
176
+ if (cmd === 'exit' || cmd === 'quit') {
177
+ console.log('\nBye!\n');
178
+ process.exit(0);
179
+ } else if (cmd === 'clear') {
180
+ console.clear();
181
+ banner();
182
+ } else if (cmd === 'help') {
183
+ console.log('\n' + HELP() + '\n');
184
+ } else if (DATA[cmd]) {
185
+ console.log('\n' + DATA[cmd](w) + '\n');
186
+ } else if (cmd !== '') {
187
+ console.log(`${C.dim}command not found: ${cmd} — try 'help'${C.reset}\n`);
188
+ }
189
+
190
+ rl.prompt();
191
+ }).on('close', () => {
192
+ console.log('\nBye!\n');
193
+ process.exit(0);
194
+ });
package/package.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "emmetandrews",
3
+ "version": "1.0.0",
4
+ "description": "Interactive Terminal resume for Emmet Andrews",
5
+ "bin": {
6
+ "emmetandrews": "./index.js"
7
+ },
8
+ "preferGlobal": false,
9
+ "keywords": ["resume", "cli", "portfolio"],
10
+ "author": "Emmet Andrews"
11
+ }