arvind 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.
- package/README.md +73 -0
- package/package.json +24 -0
- package/src/commands/about.js +21 -0
- package/src/commands/contact.js +18 -0
- package/src/commands/experience.js +21 -0
- package/src/commands/ml.js +69 -0
- package/src/commands/projects.js +30 -0
- package/src/commands/skills.js +47 -0
- package/src/data/portfolio.js +94 -0
- package/src/index.js +76 -0
- package/src/utils/display.js +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Arvind โ Interactive CLI Portfolio
|
|
2
|
+
|
|
3
|
+
> An AI-powered, interactive developer portfolio that runs directly in your terminal.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx arvind
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## โจ Features
|
|
10
|
+
|
|
11
|
+
| Command | Description |
|
|
12
|
+
|---|---|
|
|
13
|
+
| ๐ค About Me | Profile, bio & social links |
|
|
14
|
+
| ๐ ๏ธ Skills | Tech stack with visual progress bars |
|
|
15
|
+
| ๐ Projects | GitHub projects with stars & links |
|
|
16
|
+
| ๐ผ Experience | Work history with highlights |
|
|
17
|
+
| ๐ค ML Simulation | Live model training simulation |
|
|
18
|
+
| ๐ฌ Contact | How to reach out |
|
|
19
|
+
|
|
20
|
+
## ๐ Quick Start
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# Run directly with npx (no install needed)
|
|
24
|
+
npx arvind
|
|
25
|
+
|
|
26
|
+
# Or install globally
|
|
27
|
+
npm install -g arvind
|
|
28
|
+
arvind
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## ๐ ๏ธ Local Development
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
git clone https://github.com/arvind8162/portfolio-cli
|
|
35
|
+
cd portfolio-cli
|
|
36
|
+
npm install
|
|
37
|
+
npm start
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## ๐ Project Structure
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
src/
|
|
44
|
+
โโโ index.js # Entry point & main menu
|
|
45
|
+
โโโ commands/
|
|
46
|
+
โ โโโ about.js # About section
|
|
47
|
+
โ โโโ skills.js # Skills with progress bars
|
|
48
|
+
โ โโโ projects.js # Projects showcase
|
|
49
|
+
โ โโโ experience.js # Work experience
|
|
50
|
+
โ โโโ ml.js # ML training simulation
|
|
51
|
+
โ โโโ contact.js # Contact info
|
|
52
|
+
โโโ data/
|
|
53
|
+
โ โโโ portfolio.js # All your portfolio data
|
|
54
|
+
โโโ utils/
|
|
55
|
+
โโโ display.js # Helpers: colors, boxes, bars
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## ๐จ Built With
|
|
59
|
+
|
|
60
|
+
- **chalk** โ Terminal colors & styling
|
|
61
|
+
- **inquirer** โ Interactive CLI prompts
|
|
62
|
+
- **ora** โ Elegant spinners
|
|
63
|
+
- **boxen** โ Beautiful terminal boxes
|
|
64
|
+
- **figlet** โ ASCII art banners
|
|
65
|
+
- **gradient-string** โ Gradient text effects
|
|
66
|
+
|
|
67
|
+
## ๐ Customise
|
|
68
|
+
|
|
69
|
+
Edit `src/data/portfolio.js` to update all your info โ name, bio, projects, skills, experience โ everything in one place.
|
|
70
|
+
|
|
71
|
+
## ๐ License
|
|
72
|
+
|
|
73
|
+
MIT ยฉ Arvind
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "arvind",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "AI-powered interactive CLI portfolio of Arvind",
|
|
5
|
+
"main": "src/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"arvind": "./src/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"start": "node src/index.js"
|
|
11
|
+
},
|
|
12
|
+
"keywords": ["portfolio", "cli", "ai", "interactive"],
|
|
13
|
+
"author": "Arvind",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"chalk": "^5.3.0",
|
|
17
|
+
"inquirer": "^9.2.15",
|
|
18
|
+
"ora": "^8.0.1",
|
|
19
|
+
"boxen": "^7.1.1",
|
|
20
|
+
"gradient-string": "^2.0.2",
|
|
21
|
+
"figlet": "^1.7.0",
|
|
22
|
+
"cli-spinners": "^2.9.2"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { profile } from "../data/portfolio.js";
|
|
3
|
+
import { box, header } from "../utils/display.js";
|
|
4
|
+
|
|
5
|
+
export async function showAbout() {
|
|
6
|
+
header("๐ค About Me");
|
|
7
|
+
|
|
8
|
+
const content = [
|
|
9
|
+
chalk.bold.white(profile.name) + " " + chalk.cyan(profile.title),
|
|
10
|
+
"",
|
|
11
|
+
chalk.gray(profile.bio),
|
|
12
|
+
"",
|
|
13
|
+
chalk.yellow("๐") + " " + chalk.white(profile.location),
|
|
14
|
+
chalk.yellow("๐ง") + " " + chalk.white(profile.email),
|
|
15
|
+
chalk.yellow("๐") + " " + chalk.cyan(profile.website),
|
|
16
|
+
chalk.yellow("๐") + " " + chalk.cyan(profile.github),
|
|
17
|
+
chalk.yellow("๐ผ") + " " + chalk.cyan(profile.linkedin),
|
|
18
|
+
].join("\n");
|
|
19
|
+
|
|
20
|
+
console.log(box(content, "โฆ Arvind"));
|
|
21
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { profile } from "../data/portfolio.js";
|
|
3
|
+
import { box } from "../utils/display.js";
|
|
4
|
+
|
|
5
|
+
export async function showContact() {
|
|
6
|
+
const content = [
|
|
7
|
+
chalk.bold.white("Let's build something amazing together! ๐"),
|
|
8
|
+
"",
|
|
9
|
+
chalk.yellow("๐ง Email ") + chalk.cyan(profile.email),
|
|
10
|
+
chalk.yellow("๐ GitHub ") + chalk.cyan(profile.github),
|
|
11
|
+
chalk.yellow("๐ผ LinkedIn ") + chalk.cyan(profile.linkedin),
|
|
12
|
+
chalk.yellow("๐ Website ") + chalk.cyan(profile.website),
|
|
13
|
+
"",
|
|
14
|
+
chalk.gray("Open to: Full-time roles, Freelance, Collab & OSS"),
|
|
15
|
+
].join("\n");
|
|
16
|
+
|
|
17
|
+
console.log("\n" + box(content, "๐ฌ Contact Arvind"));
|
|
18
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { experience } from "../data/portfolio.js";
|
|
3
|
+
import { header, sleep } from "../utils/display.js";
|
|
4
|
+
|
|
5
|
+
export async function showExperience() {
|
|
6
|
+
header("๐ผ Work Experience");
|
|
7
|
+
|
|
8
|
+
for (const job of experience) {
|
|
9
|
+
console.log(
|
|
10
|
+
`\n ${chalk.bold.white(job.role)} ${chalk.gray("@")} ${chalk.cyan(job.company)} ${chalk.gray(job.period)}`
|
|
11
|
+
);
|
|
12
|
+
console.log(chalk.gray(" " + "โ".repeat(46)));
|
|
13
|
+
|
|
14
|
+
for (const h of job.highlights) {
|
|
15
|
+
console.log(chalk.green(" โบ ") + chalk.white(h));
|
|
16
|
+
await sleep(80);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
console.log();
|
|
21
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { mlModels } from "../data/portfolio.js";
|
|
4
|
+
import { header, progressBar, randomBetween, sleep } from "../utils/display.js";
|
|
5
|
+
|
|
6
|
+
async function simulateTraining(modelName) {
|
|
7
|
+
console.log("\n" + chalk.bold.cyan(` ๐ง Training: ${modelName}`) + "\n");
|
|
8
|
+
|
|
9
|
+
const epochs = 6;
|
|
10
|
+
let loss = randomBetween(2.4, 3.0);
|
|
11
|
+
let acc = randomBetween(30, 45);
|
|
12
|
+
|
|
13
|
+
for (let e = 1; e <= epochs; e++) {
|
|
14
|
+
const spinner = ora({
|
|
15
|
+
text: chalk.gray(`Epoch ${e}/${epochs} โ Processing batches...`),
|
|
16
|
+
color: "cyan",
|
|
17
|
+
}).start();
|
|
18
|
+
|
|
19
|
+
await sleep(randomBetween(300, 600));
|
|
20
|
+
|
|
21
|
+
loss -= randomBetween(0.2, 0.5);
|
|
22
|
+
acc += randomBetween(7, 15);
|
|
23
|
+
if (acc > 97) acc = randomBetween(93, 97.8);
|
|
24
|
+
if (loss < 0.08) loss = randomBetween(0.05, 0.15);
|
|
25
|
+
|
|
26
|
+
spinner.stop();
|
|
27
|
+
console.log(
|
|
28
|
+
` ${chalk.bold.white(`Epoch ${String(e).padStart(2, "0")}/${epochs}`)}` +
|
|
29
|
+
` ${chalk.gray("loss:")} ${chalk.red(loss.toFixed(4))}` +
|
|
30
|
+
` ${chalk.gray("acc:")} ${chalk.green(acc.toFixed(2) + "%")}` +
|
|
31
|
+
` ${progressBar(Math.round(acc), 100, 16)}`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
console.log("\n " + chalk.bgGreen.black(" โ TRAINING COMPLETE ") + "\n");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export async function runMLDemo() {
|
|
39
|
+
header("๐ค ML Simulation Lab");
|
|
40
|
+
|
|
41
|
+
console.log(chalk.gray(" Sannidhya's trained models:\n"));
|
|
42
|
+
|
|
43
|
+
mlModels.forEach((m, i) => {
|
|
44
|
+
console.log(
|
|
45
|
+
` ${chalk.cyan((i + 1) + ".")} ${chalk.bold.white(m.name.padEnd(22))}` +
|
|
46
|
+
`${chalk.gray(m.type.padEnd(10))}` +
|
|
47
|
+
`Accuracy: ${progressBar(m.accuracy, 100, 16)}`
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
console.log("\n" + chalk.gray(" โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"));
|
|
52
|
+
console.log(" " + chalk.bold.yellow("โก Live Training Simulation") + "\n");
|
|
53
|
+
|
|
54
|
+
const spinner = ora({ text: "Initializing GPU environment...", color: "magenta" }).start();
|
|
55
|
+
await sleep(1200);
|
|
56
|
+
spinner.succeed(chalk.green("GPU ready [CUDA 12.1 | 4 ร A100]"));
|
|
57
|
+
|
|
58
|
+
const spinner2 = ora({ text: "Loading dataset...", color: "cyan" }).start();
|
|
59
|
+
await sleep(900);
|
|
60
|
+
spinner2.succeed(chalk.green("Dataset loaded [128k samples | 512-dim embeddings]"));
|
|
61
|
+
|
|
62
|
+
const spinner3 = ora({ text: "Compiling model graph...", color: "blue" }).start();
|
|
63
|
+
await sleep(700);
|
|
64
|
+
spinner3.succeed(chalk.green("Model compiled [Transformer 12L | 124M params]"));
|
|
65
|
+
|
|
66
|
+
await simulateTraining("NeuralChat-v2 (GPT-style)");
|
|
67
|
+
|
|
68
|
+
console.log(chalk.gray(" Final model saved โ ") + chalk.cyan("./models/neuralchat-v2.pt\n"));
|
|
69
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { projects } from "../data/portfolio.js";
|
|
3
|
+
import { header, tag, sleep } from "../utils/display.js";
|
|
4
|
+
import boxen from "boxen";
|
|
5
|
+
|
|
6
|
+
export async function showProjects() {
|
|
7
|
+
header("๐ Projects");
|
|
8
|
+
|
|
9
|
+
for (const p of projects) {
|
|
10
|
+
const content = [
|
|
11
|
+
chalk.bold.white(p.name) + " " + chalk.yellow(`โญ ${p.stars}`),
|
|
12
|
+
chalk.gray(p.description),
|
|
13
|
+
"",
|
|
14
|
+
" " + p.tech.map(t => tag(t)).join(" "),
|
|
15
|
+
"",
|
|
16
|
+
chalk.cyan(" ๐ " + p.link),
|
|
17
|
+
].join("\n");
|
|
18
|
+
|
|
19
|
+
console.log(
|
|
20
|
+
boxen(content, {
|
|
21
|
+
padding: { top: 0, bottom: 0, left: 1, right: 1 },
|
|
22
|
+
margin: { top: 0, bottom: 1, left: 2, right: 2 },
|
|
23
|
+
borderStyle: "round",
|
|
24
|
+
borderColor: "blue",
|
|
25
|
+
})
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
await sleep(150);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { skills } from "../data/portfolio.js";
|
|
3
|
+
import { header, box, tag, progressBar, sleep } from "../utils/display.js";
|
|
4
|
+
import ora from "ora";
|
|
5
|
+
|
|
6
|
+
export async function showSkills() {
|
|
7
|
+
header("๐ ๏ธ Skills & Tech Stack");
|
|
8
|
+
|
|
9
|
+
const spinner = ora({ text: "Loading skill matrix...", color: "cyan" }).start();
|
|
10
|
+
await sleep(900);
|
|
11
|
+
spinner.succeed(chalk.green("Skill matrix loaded"));
|
|
12
|
+
|
|
13
|
+
const sections = [
|
|
14
|
+
{ label: "Languages", emoji: "๐ฌ", items: skills.languages },
|
|
15
|
+
{ label: "ML / DL", emoji: "๐ง ", items: skills.ml_dl },
|
|
16
|
+
{ label: "AI & LLMs", emoji: "๐ค", items: skills.ai_llm },
|
|
17
|
+
{ label: "Data Science", emoji: "๐", items: skills.data_science },
|
|
18
|
+
{ label: "MLOps", emoji: "๐", items: skills.mlops },
|
|
19
|
+
{ label: "Cloud & Data", emoji: "โ๏ธ", items: skills.cloud_data },
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
for (const section of sections) {
|
|
23
|
+
const line =
|
|
24
|
+
chalk.bold.yellow(` ${section.emoji} ${section.label.padEnd(12)}`) +
|
|
25
|
+
" " +
|
|
26
|
+
section.items.map(s => tag(s)).join(" ");
|
|
27
|
+
console.log(line);
|
|
28
|
+
await sleep(120);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
console.log("\n" + chalk.bold.cyan(" โก Proficiency Highlights") + "\n");
|
|
32
|
+
|
|
33
|
+
const proficiencies = [
|
|
34
|
+
{ name: "Python / ML libs ", val: 96 },
|
|
35
|
+
{ name: "Deep Learning ", val: 92 },
|
|
36
|
+
{ name: "LLMs & RAG ", val: 89 },
|
|
37
|
+
{ name: "Data Science / EDA", val: 91 },
|
|
38
|
+
{ name: "MLOps / Cloud ", val: 82 },
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
for (const p of proficiencies) {
|
|
42
|
+
console.log(` ${chalk.white(p.name)} ${progressBar(p.val)}`);
|
|
43
|
+
await sleep(100);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
console.log();
|
|
47
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export const profile = {
|
|
2
|
+
name: "Arvind",
|
|
3
|
+
title: "AI ML/ Data Science & AI Engineer",
|
|
4
|
+
location: "India ๐ฎ๐ณ",
|
|
5
|
+
email: "arvindhadiyal8162@gmail.com",
|
|
6
|
+
github: "https://github.com/Arvind8162",
|
|
7
|
+
linkedin: "linkedin.com/in/arvindhadiyal8162",
|
|
8
|
+
website: "arvind.dev",
|
|
9
|
+
bio: "AI/ML Engineer passionate about building intelligent systems, training deep learning models, and turning raw data into real-world impact. Specialised in NLP, computer vision, and scalable ML pipelines. Open source contributor and AI researcher"
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const skills = {
|
|
13
|
+
languages: ["JavaScript", "TypeScript", "Python", "C++", "Rust", "Bash"],
|
|
14
|
+
ml_dl: ["PyTorch", "TensorFlow", "Keras", "Scikit-learn", "XGBoost", "LightGBM"],
|
|
15
|
+
ai_llm: ["LangChain", "LlamaIndex", "OpenAI API", "Hugging Face", "PEFT", "vLLM"],
|
|
16
|
+
data_science:["Pandas", "NumPy", "Matplotlib", "Seaborn", "Plotly", "PySpark"],
|
|
17
|
+
mlops: ["MLflow", "Weights & Biases", "DVC", "Docker", "Airflow", "FastAPI"],
|
|
18
|
+
devops: ["Docker", "GitHub Actions", "AWS", "Vercel", "Redis"],
|
|
19
|
+
cloud_data: ["AWS SageMaker", "GCP Vertex AI", "BigQuery", "Pinecone", "PostgreSQL"]
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const projects = [
|
|
23
|
+
{
|
|
24
|
+
name: "VisionGuard",
|
|
25
|
+
description: "Real-time object detection & anomaly system for industrial safety",
|
|
26
|
+
tech: ["PyTorch", "YOLOv9", "FastAPI", "OpenCV"],
|
|
27
|
+
stars: 521,
|
|
28
|
+
link: "github.com/sannidhya/visionguard"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "DataLens",
|
|
32
|
+
description: "Automated EDA & ML pipeline generator from raw CSV/JSON datasets",
|
|
33
|
+
tech: ["Python", "Pandas", "Scikit-learn", "Streamlit"],
|
|
34
|
+
stars: 384,
|
|
35
|
+
link: "github.com/sannidhya/datalens"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "RAGForge",
|
|
39
|
+
description: "Production-grade Retrieval-Augmented Generation engine with multi-source indexing",
|
|
40
|
+
tech: ["LangChain", "Pinecone", "GPT-4o", "FastAPI"],
|
|
41
|
+
stars: 693,
|
|
42
|
+
link: "github.com/sannidhya/ragforge"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "This CLI Portfolio",
|
|
46
|
+
description: "AI-powered interactive developer portfolio running in your terminal",
|
|
47
|
+
tech: ["Node.js", "Inquirer", "Chalk", "Figlet"],
|
|
48
|
+
stars: 112,
|
|
49
|
+
link: "github.com/sannidhya/portfolio-cli"
|
|
50
|
+
}
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
export const experience = [
|
|
54
|
+
{
|
|
55
|
+
company: "TechStartup XYZ",
|
|
56
|
+
role: "Senior Full Stack Developer",
|
|
57
|
+
period: "2023 โ Present",
|
|
58
|
+
highlights: [
|
|
59
|
+
"Built AI-driven recommendation engine (โ40% engagement)",
|
|
60
|
+
"Led team of 5 devs across 3 microservices",
|
|
61
|
+
"Reduced API latency by 60% via Redis caching"
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
company: "OpenSource Inc.",
|
|
66
|
+
role: "Core Contributor",
|
|
67
|
+
period: "2022 โ 2023",
|
|
68
|
+
highlights: [
|
|
69
|
+
"Contributed 120+ PRs to popular OSS projects",
|
|
70
|
+
"Maintained Node.js CLI toolkit with 3k+ weekly downloads",
|
|
71
|
+
"Wrote technical docs used by 10k+ developers"
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
company: "Freelance",
|
|
76
|
+
role: "Full Stack Developer",
|
|
77
|
+
period: "2020 โ 2022",
|
|
78
|
+
highlights: [
|
|
79
|
+
"Delivered 15+ client projects end-to-end",
|
|
80
|
+
"Built e-commerce platforms with payment integrations",
|
|
81
|
+
"Created custom AI chatbots for businesses"
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
export const mlModels = [
|
|
87
|
+
{ name: "Sentiment Analyzer", accuracy: 94.2, type: "NLP" },
|
|
88
|
+
{ name: "Image Classifier", accuracy: 97.8, type: "Vision" },
|
|
89
|
+
{ name: "Code Completion", accuracy: 88.5, type: "LLM" },
|
|
90
|
+
{ name: "Anomaly Detector", accuracy: 91.3, type: "Tabular" },
|
|
91
|
+
{ name: "LLaMA-3 Fine-tune", accuracy: 96.4, type: "LLM" },
|
|
92
|
+
{ name: "Crop Disease Detector", accuracy: 97.8, type: "Vision" },
|
|
93
|
+
{ name: "Fraud Detector", accuracy: 93.1, type: "Tabular" },
|
|
94
|
+
];
|
package/src/index.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import figlet from "figlet";
|
|
5
|
+
import gradient from "gradient-string";
|
|
6
|
+
import inquirer from "inquirer";
|
|
7
|
+
import { sleep } from "./utils/display.js";
|
|
8
|
+
import { showAbout } from "./commands/about.js";
|
|
9
|
+
import { showSkills } from "./commands/skills.js";
|
|
10
|
+
import { showProjects } from "./commands/projects.js";
|
|
11
|
+
import { showExperience } from "./commands/experience.js";
|
|
12
|
+
import { runMLDemo } from "./commands/ml.js";
|
|
13
|
+
import { showContact } from "./commands/contact.js";
|
|
14
|
+
|
|
15
|
+
const MENU = [
|
|
16
|
+
{ name: "๐ค About Me", value: "about" },
|
|
17
|
+
{ name: "๐ ๏ธ Skills & Stack", value: "skills" },
|
|
18
|
+
{ name: "๐ Projects", value: "projects" },
|
|
19
|
+
{ name: "๐ผ Experience", value: "experience" },
|
|
20
|
+
{ name: "๐ค ML Simulation Lab", value: "ml" },
|
|
21
|
+
{ name: "๐ฌ Contact", value: "contact" },
|
|
22
|
+
{ name: "โ Exit", value: "exit" },
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
async function banner() {
|
|
26
|
+
console.clear();
|
|
27
|
+
const art = figlet.textSync("Arvind", { font: "Slant", horizontalLayout: "default" });
|
|
28
|
+
console.log(gradient.pastel.multiline(art));
|
|
29
|
+
console.log(
|
|
30
|
+
chalk.gray(" ") +
|
|
31
|
+
chalk.bold.white("AI Engineer") +
|
|
32
|
+
chalk.gray(" ยท ") +
|
|
33
|
+
chalk.cyan("AI ML / data scientist") +
|
|
34
|
+
chalk.gray(" ยท ") +
|
|
35
|
+
chalk.yellow("Open Source Contributor")
|
|
36
|
+
);
|
|
37
|
+
console.log(chalk.gray(" โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n"));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function main() {
|
|
41
|
+
await banner();
|
|
42
|
+
|
|
43
|
+
while (true) {
|
|
44
|
+
const { choice } = await inquirer.prompt([
|
|
45
|
+
{
|
|
46
|
+
type: "list",
|
|
47
|
+
name: "choice",
|
|
48
|
+
message: chalk.bold.cyan("What would you like to explore?"),
|
|
49
|
+
choices: MENU,
|
|
50
|
+
pageSize: 10,
|
|
51
|
+
},
|
|
52
|
+
]);
|
|
53
|
+
|
|
54
|
+
if (choice === "exit") {
|
|
55
|
+
console.log("\n" + chalk.bold.cyan("Thanks for visiting Arvind's portfolio! ๐ Let's connect.\n"));
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
console.clear();
|
|
60
|
+
await banner();
|
|
61
|
+
|
|
62
|
+
if (choice === "about") await showAbout();
|
|
63
|
+
if (choice === "skills") await showSkills();
|
|
64
|
+
if (choice === "projects") await showProjects();
|
|
65
|
+
if (choice === "experience") await showExperience();
|
|
66
|
+
if (choice === "ml") await runMLDemo();
|
|
67
|
+
if (choice === "contact") await showContact();
|
|
68
|
+
|
|
69
|
+
await sleep(400);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
main().catch(err => {
|
|
74
|
+
console.error(chalk.red("\n Error: ") + err.message);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import boxen from "boxen";
|
|
3
|
+
|
|
4
|
+
export function header(text) {
|
|
5
|
+
console.log("\n" + chalk.bold.cyan("โ".repeat(50)));
|
|
6
|
+
console.log(chalk.bold.white(` ${text}`));
|
|
7
|
+
console.log(chalk.cyan("โ".repeat(50)));
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function success(msg) {
|
|
11
|
+
console.log(chalk.green(" โ ") + chalk.white(msg));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function info(msg) {
|
|
15
|
+
console.log(chalk.blue(" โน ") + chalk.gray(msg));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function badge(text, color = "cyan") {
|
|
19
|
+
return chalk[color].bold(`[${text}]`);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function tag(text) {
|
|
23
|
+
return chalk.bgBlue.white(` ${text} `);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function progressBar(value, max = 100, width = 20) {
|
|
27
|
+
const filled = Math.round((value / max) * width);
|
|
28
|
+
const bar = chalk.cyan("โ".repeat(filled)) + chalk.gray("โ".repeat(width - filled));
|
|
29
|
+
return `${bar} ${chalk.yellow(value + "%")}`;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function sleep(ms) {
|
|
33
|
+
return new Promise(r => setTimeout(r, ms));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function box(content, title = "") {
|
|
37
|
+
return boxen(content, {
|
|
38
|
+
padding: { top: 1, bottom: 1, left: 2, right: 2 },
|
|
39
|
+
margin: { top: 0, bottom: 1, left: 2, right: 2 },
|
|
40
|
+
borderStyle: "round",
|
|
41
|
+
borderColor: "cyan",
|
|
42
|
+
width: 70,
|
|
43
|
+
title: title ? chalk.bold.cyan(title) : undefined,
|
|
44
|
+
titleAlignment: "center"
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function randomBetween(min, max) {
|
|
49
|
+
return Math.random() * (max - min) + min;
|
|
50
|
+
}
|