Skip to content

Commit 9db5e7d

Browse files
committed
resume cli viewer
0 parents  commit 9db5e7d

File tree

6 files changed

+596
-0
lines changed

6 files changed

+596
-0
lines changed

.gitignore

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
node_modules/
2+
.clinerules/byterover-rules.md
3+
.kilocode/rules/byterover-rules.md
4+
.roo/rules/byterover-rules.md
5+
.windsurf/rules/byterover-rules.md
6+
.cursor/rules/byterover-rules.mdc
7+
.kiro/steering/byterover-rules.md
8+
.qoder/rules/byterover-rules.md
9+
.augment/rules/byterover-rules.md
10+
CLAUDE.md
11+
project_rules.md

LICENSE

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
MIT License
2+
3+
Copyright (c) 2025 Bharathkumar Palanisamy
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction...

README.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# @bharathkumar-palanisamy — CLI Resume
2+
3+
Prints the resume of **Bharathkumar Palanisamy** to the terminal.
4+
5+
## Usage
6+
7+
Try these in order:
8+
9+
```bash
10+
# 1) Preferred (assignment requirement)
11+
npx @bharathkumar-palanisamy
12+
13+
# 2) Fallback (if npm rejects scoped single-name)
14+
npx bharathkumar-palanisamy
15+
16+
# 3) Scoped fallback with slash (alternative)
17+
npx @bharathkumar-palanisamy/resume
18+
```
19+
20+
## Local testing
21+
22+
```bash
23+
npm install
24+
chmod +x cli.js
25+
node cli.js
26+
```
27+
28+
## Publish
29+
30+
```bash
31+
npm login
32+
npm publish --access public
33+
```
34+
35+
Notes:
36+
- If you publish the scoped package (`@bharathkumar-palanisamy`) npm may accept or reject the name depending on registry rules.
37+
- If rejected, use one of the fallback names described above.
38+
39+
## Files
40+
41+
- `cli.js` — executable Node script that prints the resume
42+
- `package.json` — package metadata (name, bin, dependencies)
43+
- `README.md` — this file
44+
45+
## License
46+
47+
MIT

cli.js

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
#!/usr/bin/env node
2+
import chalk from "chalk";
3+
import boxen from "boxen";
4+
5+
/**
6+
* Full CLI resume for: Bharathkumar Palanisamy
7+
* - Full-Stack Engineer (JavaScript ecosystem)
8+
* - 5 years professional experience
9+
* - Career gap framed positively with projects / learning
10+
*
11+
* NOTE: replace placeholders (email, phone, github, portfolio) before publishing.
12+
*/
13+
14+
const title = chalk.bold.hex("#ff6b6b")("Bharathkumar Palanisamy");
15+
const role = chalk.bold("Full-Stack Engineer (JavaScript / Node.js & React)");
16+
const location = chalk.green("Bengaluru, India");
17+
18+
const email = chalk.cyan("[email protected]");
19+
const phone = chalk.yellow("+91 9XXXXXXXXX");
20+
const linkedin = chalk.blue("https://linkedin.com/in/bharathkumar-palanisamy");
21+
const github = chalk.blue("https://github.com/your-github");
22+
const portfolio = chalk.underline("https://your-portfolio.example.com");
23+
24+
/* Tech stack */
25+
const techStack = [
26+
"Node.js", "Express", "TypeScript","Sveltekit", "React", "Next.js","Astro","Tailwind","shadcnUI",
27+
"Postgres", "MongoDB", "Redis", "Docker", "Kubernetes",
28+
"GraphQL", "REST", "GitHub Actions", "AWS"
29+
].join(" • ");
30+
31+
/* Profile (includes career gap framing) */
32+
const profile = [
33+
"Full-Stack Engineer with 5 years of professional experience across the JavaScript ecosystem.",
34+
"I build end-to-end web applications and production APIs using Node.js, Express, React/Next.js and modern databases.",
35+
"I took a planned career break to focus on personal priorities while actively upskilling — building personal projects, contributing to open source, and staying current with modern tooling.",
36+
"Now actively seeking to re-enter the workforce and contribute as a focused, production-minded engineer."
37+
].join(" ");
38+
39+
/* Experience (strong 5-year history) */
40+
const experience = [
41+
{
42+
company: "Accenture",
43+
title: "Full-Stack Engineer",
44+
dates: "2019 — 2021",
45+
bullets: [
46+
"Built an enterprise-level **Code Scan Platform** from scratch that identified vulnerabilities in large-scale applications and suggested potential fixes.",
47+
"Designed and implemented secure, scalable REST APIs with **Node.js, Express, and MongoDB** to handle high-volume scan data.",
48+
"Developed **pixel-perfect frontends** by converting Figma designs into responsive React + Redux dashboards, ensuring design consistency and accessibility.",
49+
"Integrated CI/CD pipelines using **GitHub Actions and Docker**, reducing deployment times by 60% and minimizing production errors.",
50+
"Collaborated with product managers, security teams, and designers to deliver a compliant and enterprise-ready product."
51+
]
52+
},
53+
{
54+
company: "Infosys",
55+
title: "Full-Stack Engineer",
56+
dates: "2015 — 2019",
57+
bullets: [
58+
"Worked with **major national banks** to design and deliver secure, high-performance features for customer-facing applications.",
59+
"Developed backend services in **Node.js/Express with PostgreSQL**, optimized queries, and introduced **Redis caching** to improve performance by 40%.",
60+
"Implemented **authentication flows (JWT, OAuth2)** and role-based access to meet banking compliance and security standards.",
61+
"Converted business requirements and **Figma wireframes into production-grade UIs** using React, HTML5, and CSS3.",
62+
"Collaborated in Agile sprints with QA and frontend teams to deliver new banking modules within strict deadlines."
63+
]
64+
}
65+
];
66+
67+
68+
/* Projects (bridge the gap; recent personal work) */
69+
const projects = [
70+
{
71+
name: "Task & Reminder App (Personal)",
72+
desc: "Full-stack productivity app with grouping, reminders, and AI-generated subtasks to help focus and complete work.",
73+
tech: "Next.js • Node.js • MongoDB • TailwindCSS • Vercel"
74+
},
75+
{
76+
name: "Tab Focus Chrome Extension",
77+
desc: "Chrome extension to manage open tabs by encouraging focus and closing unused tabs (Manifest V3).",
78+
tech: "JavaScript • Chrome Extension APIs"
79+
},
80+
{
81+
name: "Portfolio & Blog",
82+
desc: "Personal portfolio built to showcase projects and write technical posts about modern JS tooling.",
83+
tech: "SvelteKit • Vercel • Markdown"
84+
}
85+
];
86+
87+
/* Leadership & mentoring (concise) */
88+
const leadership = [
89+
"Mentored junior developers and reviewed PRs to improve code quality.",
90+
"Collaborated cross-functionally with QA and designers to ship polished features."
91+
];
92+
93+
/* Open source */
94+
const openSource = [
95+
"Small npm package published for internal CI helpers.",
96+
"Contributed documentation fixes and small patches to open-source JavaScript libraries."
97+
];
98+
99+
/* Education (bright, no dim) */
100+
const education = [
101+
{
102+
degree: "B.Tech in Computer Science",
103+
school: "Example University",
104+
dates: "2012 – 2016",
105+
details: [
106+
"Graduated with First Class Honours",
107+
"Relevant coursework: Databases, Web Development, Operating Systems"
108+
]
109+
}
110+
];
111+
112+
/* Formatting helpers */
113+
function formatBoldText(text) {
114+
return text.replace(/\*\*(.*?)\*\*/g, (match, content) => {
115+
return chalk.yellowBright.bold(content);
116+
});
117+
}
118+
119+
function formatExperience() {
120+
return experience.map(e => {
121+
const header = chalk.greenBright.bold(`${e.company}${e.title} (${e.dates})`);
122+
const bullets = e.bullets.map(b => {
123+
const formattedText = formatBoldText(b);
124+
return chalk.white(` • ${formattedText}`);
125+
}).join("\n");
126+
return `${header}\n${bullets}\n`;
127+
}).join("\n");
128+
}
129+
130+
function formatProjects() {
131+
return projects.map(p => {
132+
const name = chalk.magentaBright.bold(p.name);
133+
const desc = chalk.white(` • ${p.desc}`);
134+
const tech = chalk.white(` • ${p.tech}`);
135+
return `${name}\n${desc}\n${tech}\n`;
136+
}).join("\n");
137+
}
138+
139+
function formatList(arr, colorFn) {
140+
return arr.map(i => chalk.white(` • ${i}`)).join("\n");
141+
}
142+
143+
function formatEducation() {
144+
return education.map(ed => {
145+
const header = chalk.whiteBright.bold(`${ed.degree}${ed.school} (${ed.dates})`);
146+
const details = ed.details.map(d => chalk.white(` • ${d}`)).join("\n");
147+
return `${header}\n${details}\n`;
148+
}).join("\n");
149+
}
150+
151+
/* box for tech stack (high contrast yellow bright) */
152+
const boxedTech = boxen(chalk.yellowBright(techStack), {
153+
padding: 1,
154+
margin: 1,
155+
borderStyle: "round",
156+
textAlignment: "center"
157+
});
158+
159+
/* Build final output with high-contrast headings and bright content */
160+
const output = `
161+
${title}
162+
${role} ${chalk.white("•")} ${location}
163+
164+
${chalk.bold("Contact")}
165+
${email}${phone}
166+
${linkedin}
167+
${github}
168+
${portfolio}
169+
170+
${boxedTech}
171+
172+
${chalk.cyanBright.bold("Profile")}
173+
${chalk.white(profile)}
174+
175+
${chalk.yellowBright.bold("Core Skills")}
176+
${chalk.white(techStack)}
177+
178+
${chalk.greenBright.bold("Experience")}
179+
${formatExperience()}
180+
181+
${chalk.magentaBright.bold("Key Projects")}
182+
${formatProjects()}
183+
184+
${chalk.blueBright.bold("Leadership & Mentoring")}
185+
${formatList(leadership)}
186+
187+
${chalk.cyanBright.bold("Open-source & Community")}
188+
${formatList(openSource)}
189+
190+
${chalk.whiteBright.bold("Education")}
191+
${formatEducation()}
192+
193+
${chalk.dim("Run 'npx @bharathkumar-palanisamy' to print this resume.")}
194+
`.trim();
195+
196+
/* Print to terminal */
197+
console.log(output);

0 commit comments

Comments
 (0)