hey-alagappan 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/.prettierrc +9 -0
- package/README.md +44 -0
- package/bun.lockb +0 -0
- package/dist/index.js +196 -0
- package/package.json +47 -0
- package/src/index.ts +232 -0
- package/tsconfig.json +14 -0
package/.prettierrc
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# hey-alagappan
|
|
2
|
+
|
|
3
|
+
An interactive terminal-based portfolio that showcases my work, projects, and experiences through a command-line interface.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g hey-alagappan
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
After installation, you can start the interactive portfolio by running:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
hey-alagappan
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Available Commands
|
|
20
|
+
|
|
21
|
+
- `about` - Learn more about me
|
|
22
|
+
- `profile` - View profile info
|
|
23
|
+
- `projects` - View a list of projects
|
|
24
|
+
- `art` - View my art profiles
|
|
25
|
+
- `social` - View my social media profiles
|
|
26
|
+
- `help` - Show all available commands
|
|
27
|
+
- `exit` - Exit the CLI
|
|
28
|
+
|
|
29
|
+
## Requirements
|
|
30
|
+
|
|
31
|
+
- Node.js >= 16.0.0
|
|
32
|
+
|
|
33
|
+
## License
|
|
34
|
+
|
|
35
|
+
MIT
|
|
36
|
+
|
|
37
|
+
## Author
|
|
38
|
+
|
|
39
|
+
Alagappan N ([@alagappan17](https://github.com/alagappan17))
|
|
40
|
+
|
|
41
|
+
## Contact
|
|
42
|
+
|
|
43
|
+
- Email: alagappaforwork@gmail.com
|
|
44
|
+
- LinkedIn: [alagappan-n](https://linkedin.com/in/alagappan-n)
|
package/bun.lockb
ADDED
|
Binary file
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import figlet from 'figlet';
|
|
5
|
+
// Display welcome message
|
|
6
|
+
console.log(chalk.green(figlet.textSync("Hey! I'm Alagappan.", {
|
|
7
|
+
horizontalLayout: 'full',
|
|
8
|
+
font: 'Small',
|
|
9
|
+
})));
|
|
10
|
+
// Add bio and instructions
|
|
11
|
+
console.log(chalk.cyan('\nSoftware Engineer passionate about building innovative solutions and creating impactful applications.'));
|
|
12
|
+
console.log(chalk.cyan('Currently working as a SDE1 at Procedure.\n'));
|
|
13
|
+
console.log(chalk.white('Use commands to explore more information about me.'));
|
|
14
|
+
console.log(chalk.blue("Type 'help' to see all available commands.\n"));
|
|
15
|
+
// Start interactive mode
|
|
16
|
+
const startInteractiveMode = async () => {
|
|
17
|
+
let running = true;
|
|
18
|
+
while (running) {
|
|
19
|
+
const { command } = await inquirer.prompt([
|
|
20
|
+
{
|
|
21
|
+
type: 'input',
|
|
22
|
+
name: 'command',
|
|
23
|
+
message: 'Enter a command:',
|
|
24
|
+
},
|
|
25
|
+
]);
|
|
26
|
+
switch (command.trim().toLowerCase()) {
|
|
27
|
+
case 'help':
|
|
28
|
+
help();
|
|
29
|
+
break;
|
|
30
|
+
case 'profile':
|
|
31
|
+
profile();
|
|
32
|
+
break;
|
|
33
|
+
case 'projects':
|
|
34
|
+
projects();
|
|
35
|
+
break;
|
|
36
|
+
case 'about':
|
|
37
|
+
about();
|
|
38
|
+
break;
|
|
39
|
+
case 'art':
|
|
40
|
+
art();
|
|
41
|
+
break;
|
|
42
|
+
case 'social':
|
|
43
|
+
social();
|
|
44
|
+
break;
|
|
45
|
+
case 'exit':
|
|
46
|
+
running = false;
|
|
47
|
+
exit();
|
|
48
|
+
break;
|
|
49
|
+
case '':
|
|
50
|
+
// Do nothing for empty input
|
|
51
|
+
break;
|
|
52
|
+
default:
|
|
53
|
+
console.log(chalk.yellow(`Unknown command: ${command}`));
|
|
54
|
+
console.log(chalk.blue("Type 'help' to see available commands"));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const help = () => {
|
|
59
|
+
console.log(`
|
|
60
|
+
${chalk.yellow('Available Commands:')}
|
|
61
|
+
- about ${chalk.gray('Learn more about me')}
|
|
62
|
+
- profile ${chalk.gray('View profile info')}
|
|
63
|
+
- projects ${chalk.gray('View a list of projects')}
|
|
64
|
+
- art ${chalk.gray('View my art profiles')}
|
|
65
|
+
- social ${chalk.gray('View my social media profiles')}
|
|
66
|
+
- exit ${chalk.gray('Exit the CLI')}
|
|
67
|
+
`);
|
|
68
|
+
};
|
|
69
|
+
const exit = () => {
|
|
70
|
+
console.log(chalk.red(`
|
|
71
|
+
Goodbye! Thank you for using my CLI!`));
|
|
72
|
+
social();
|
|
73
|
+
};
|
|
74
|
+
const profile = () => {
|
|
75
|
+
console.log(`
|
|
76
|
+
${chalk.cyan('My Profile')}
|
|
77
|
+
Name: Alagappan N
|
|
78
|
+
Role: Software Engineer
|
|
79
|
+
Location: Hyderabad, Telangana, India
|
|
80
|
+
Email: alagappaforwork@gmail.com
|
|
81
|
+
`);
|
|
82
|
+
};
|
|
83
|
+
const projects = async () => {
|
|
84
|
+
console.log(`${chalk.cyan('Projects')}`);
|
|
85
|
+
const answers = await inquirer.prompt([
|
|
86
|
+
{
|
|
87
|
+
type: 'list',
|
|
88
|
+
name: 'project',
|
|
89
|
+
message: 'Select a project to view details:',
|
|
90
|
+
choices: [
|
|
91
|
+
'Bloom',
|
|
92
|
+
'HierBridge',
|
|
93
|
+
'WorkHero',
|
|
94
|
+
'Procedure',
|
|
95
|
+
'Terminal Portfolio',
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
]);
|
|
99
|
+
projectDetails(answers.project);
|
|
100
|
+
};
|
|
101
|
+
const projectDetails = (project) => {
|
|
102
|
+
console.log(`
|
|
103
|
+
${chalk.cyan.bold(project)}`);
|
|
104
|
+
switch (project) {
|
|
105
|
+
case 'HierBridge':
|
|
106
|
+
console.log(`
|
|
107
|
+
I am leading the development of a Voice of Employee platform designed to enhance hierarchical transparency and improve workplace decision-making.
|
|
108
|
+
The platform leverages AI strategies like Retrieval-Augmented Generation (RAG) and AI Agents to provide data-driven insights. Through customer discovery interviews,
|
|
109
|
+
I have identified key market challenges to shape the product effectively.
|
|
110
|
+
Backed by CMU's Project Olympus and other esteemed professors, we're in pre-development, laser-focused on building a product that actually moves the needle.
|
|
111
|
+
|
|
112
|
+
${chalk.yellow('Website:')} https://hierbridge.com/
|
|
113
|
+
${chalk.blue('LinkedIn:')} https://www.linkedin.com/company/hierbridge
|
|
114
|
+
${chalk.magenta('Tech Stack (Planned):')} Nx, Node.js, Koa, Next.js, Mongo
|
|
115
|
+
`);
|
|
116
|
+
break;
|
|
117
|
+
case 'Bloom':
|
|
118
|
+
console.log(`
|
|
119
|
+
I'm part of the team building Bloom, an edtech platform designed to make reading engaging for young learners—because reading should be more fun than frustrating.
|
|
120
|
+
I've worked on crafting complex, dynamic lessons that adapt to different inputs, ensuring an interactive experience that keeps kids hooked. I also built the admin portal for
|
|
121
|
+
content creation and data management, making life easier for educators. On the backend, I set up CI pipelines for testing and optimised and standardised the codebase for
|
|
122
|
+
smoother development and long-term scalability.
|
|
123
|
+
|
|
124
|
+
${chalk.magenta('Tech Stack:')} Nx, Node.js, Koa, React, Mongo
|
|
125
|
+
`);
|
|
126
|
+
break;
|
|
127
|
+
case 'WorkHero':
|
|
128
|
+
console.log(`
|
|
129
|
+
WorkHero pairs a fractional office manager with an LLM-powered platform, ensuring smooth workforce management, customer relations, and administrative operations.
|
|
130
|
+
I built an automated agent testing framework from scratch, designed to evaluate multiple AI agents operating across different LLMs (Claude, Grok, Llama, GPT, etc.).
|
|
131
|
+
These agents handled everything from customer interactions to task management, making rigorous testing essential. The framework introduced a modular design,
|
|
132
|
+
allowing new test executors for evolving tasks. I also developed an AI Test Agent that verified actions, assessed accuracy, and maintained a scoring rubric to track performance.
|
|
133
|
+
|
|
134
|
+
${chalk.yellow('Website:')} https://www.workhero.pro/
|
|
135
|
+
${chalk.magenta('Tech Stack:')} Nx, Node.js, Koa, React, Mongo
|
|
136
|
+
`);
|
|
137
|
+
break;
|
|
138
|
+
case 'Procedure':
|
|
139
|
+
console.log(`
|
|
140
|
+
I worked on a range of internal apps. One of these was Ragnarok, an employee appreciation Slack bot that let colleagues give shoutouts and reward points.
|
|
141
|
+
Built on Frappe, it extended ERPNext, our HR platform. I also helped redesign of the Procedure website, rebuilding it from the ground up with Next.js and Tailwind CSS.
|
|
142
|
+
The new design introduced modern UI elements, improved structure, ensuring a sleek and engaging user experience.
|
|
143
|
+
|
|
144
|
+
${chalk.yellow('Website:')} (To be Hosted Soon)
|
|
145
|
+
`);
|
|
146
|
+
break;
|
|
147
|
+
case 'Terminal Portfolio':
|
|
148
|
+
console.log(`
|
|
149
|
+
I created an interactive terminal-based portfolio. It allows users to navigate through my professional experiences, projects, and skills directly from the command line.
|
|
150
|
+
The portfolio is designed to be both functional and engaging, providing a novel way to showcase my work.
|
|
151
|
+
|
|
152
|
+
This was an experiment to see how well I can leverage AI code editors to their full potential.
|
|
153
|
+
|
|
154
|
+
${chalk.magenta('Tech Stack:')} Node.js, Inquirer, Chalk
|
|
155
|
+
`);
|
|
156
|
+
break;
|
|
157
|
+
default:
|
|
158
|
+
console.log(chalk.yellow(`Unknown project: ${project}`));
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
const about = () => {
|
|
162
|
+
console.log(`
|
|
163
|
+
${chalk.cyan('About Me')}
|
|
164
|
+
Howdy! I'm Alagappan, a ${chalk.green('full-stack engineer')} with a passion for design, development and digital art.
|
|
165
|
+
Back in school, I eagerly looked forward to my computer lab sessions, only to rush off to art class right after.
|
|
166
|
+
These interest have strongly shaped my career as I found programming to be the right blend of my creative and logical personas.
|
|
167
|
+
|
|
168
|
+
Beyond building applications, I'm also a ${chalk.magenta('3D digital artist')}—a passion that started as a hobby during the pandemic
|
|
169
|
+
and has grown into a dedicated craft. In the art community, I go by ${chalk.blue('skidrrow')}. Use the command ${chalk.yellow('art')} to view my art portfolio.
|
|
170
|
+
`);
|
|
171
|
+
};
|
|
172
|
+
const art = () => {
|
|
173
|
+
console.log(`
|
|
174
|
+
${chalk.cyan('Art Profiles')} ${chalk.gray('(@skidrrow)')}
|
|
175
|
+
${chalk.gray('Feel free to follow and reach out for collaborations!')}
|
|
176
|
+
|
|
177
|
+
${chalk.magenta('Instagram:')} https://instagram.com/skidrrow
|
|
178
|
+
${chalk.blue('Behance:')} https://behance.net/alagappann
|
|
179
|
+
${chalk.yellow('ArtGrab:')} https://artgrab.co/art/skidrow
|
|
180
|
+
${chalk.red('YouTube:')} https://www.youtube.com/channel/UCajdq0CHzumeh7QQi-d0l4w
|
|
181
|
+
${chalk.cyan('Email:')} skidrrowforwork@gmail.com
|
|
182
|
+
`);
|
|
183
|
+
};
|
|
184
|
+
const social = () => {
|
|
185
|
+
console.log(`
|
|
186
|
+
${chalk.cyan('Connect with me')}
|
|
187
|
+
${chalk.gray("Let's stay in touch!")}
|
|
188
|
+
|
|
189
|
+
${chalk.green('GitHub:')} https://github.com/alagappan17
|
|
190
|
+
${chalk.blue('LinkedIn:')} https://linkedin.com/in/alagappan-n
|
|
191
|
+
${chalk.gray('Twitter (X):')} https://x.com/alagappantwt
|
|
192
|
+
${chalk.cyan('Email:')} alagappaforwork@gmail.com
|
|
193
|
+
`);
|
|
194
|
+
};
|
|
195
|
+
// Start the interactive mode immediately
|
|
196
|
+
startInteractiveMode();
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hey-alagappan",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "An interactive terminal-based portfolio showcasing Alagappan's work and experiences",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"start": "ts-node src/index.ts",
|
|
10
|
+
"prepublishOnly": "bun run build"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"portfolio",
|
|
14
|
+
"terminal",
|
|
15
|
+
"cli",
|
|
16
|
+
"interactive",
|
|
17
|
+
"resume"
|
|
18
|
+
],
|
|
19
|
+
"author": "Alagappan N <alagappaforwork@gmail.com>",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"chalk": "^5.4.1",
|
|
23
|
+
"commander": "^13.1.0",
|
|
24
|
+
"figlet": "^1.8.0",
|
|
25
|
+
"inquirer": "^12.4.2"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/chalk": "^0.4.31",
|
|
29
|
+
"@types/commander": "^2.12.0",
|
|
30
|
+
"@types/figlet": "^1.7.0",
|
|
31
|
+
"@types/inquirer": "^9.0.7",
|
|
32
|
+
"@types/node": "^22.13.10",
|
|
33
|
+
"ts-node": "^10.9.2",
|
|
34
|
+
"typescript": "^5.8.2"
|
|
35
|
+
},
|
|
36
|
+
"bin": {
|
|
37
|
+
"hey-alagappan": "./dist/index.js"
|
|
38
|
+
},
|
|
39
|
+
"type": "module",
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "https://github.com/alagappan17/terminal-portfolio"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=16.0.0"
|
|
46
|
+
}
|
|
47
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import inquirer from 'inquirer';
|
|
5
|
+
import figlet from 'figlet';
|
|
6
|
+
|
|
7
|
+
// Display welcome message
|
|
8
|
+
console.log(
|
|
9
|
+
chalk.green(
|
|
10
|
+
figlet.textSync("Hey! I'm Alagappan.", {
|
|
11
|
+
horizontalLayout: 'full',
|
|
12
|
+
font: 'Small',
|
|
13
|
+
})
|
|
14
|
+
)
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
// Add bio and instructions
|
|
18
|
+
console.log(
|
|
19
|
+
chalk.cyan(
|
|
20
|
+
'\nSoftware Engineer passionate about building innovative solutions and creating impactful applications.'
|
|
21
|
+
)
|
|
22
|
+
);
|
|
23
|
+
console.log(chalk.cyan('Currently working as a SDE1 at Procedure.\n'));
|
|
24
|
+
|
|
25
|
+
console.log(chalk.white('Use commands to explore more information about me.'));
|
|
26
|
+
console.log(chalk.blue("Type 'help' to see all available commands.\n"));
|
|
27
|
+
|
|
28
|
+
// Start interactive mode
|
|
29
|
+
const startInteractiveMode = async () => {
|
|
30
|
+
let running = true;
|
|
31
|
+
|
|
32
|
+
while (running) {
|
|
33
|
+
const { command } = await inquirer.prompt([
|
|
34
|
+
{
|
|
35
|
+
type: 'input',
|
|
36
|
+
name: 'command',
|
|
37
|
+
message: 'Enter a command:',
|
|
38
|
+
},
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
switch (command.trim().toLowerCase()) {
|
|
42
|
+
case 'help':
|
|
43
|
+
help();
|
|
44
|
+
break;
|
|
45
|
+
case 'profile':
|
|
46
|
+
profile();
|
|
47
|
+
break;
|
|
48
|
+
case 'projects':
|
|
49
|
+
projects();
|
|
50
|
+
break;
|
|
51
|
+
case 'about':
|
|
52
|
+
about();
|
|
53
|
+
break;
|
|
54
|
+
case 'art':
|
|
55
|
+
art();
|
|
56
|
+
break;
|
|
57
|
+
case 'social':
|
|
58
|
+
social();
|
|
59
|
+
break;
|
|
60
|
+
case 'exit':
|
|
61
|
+
running = false;
|
|
62
|
+
exit();
|
|
63
|
+
break;
|
|
64
|
+
case '':
|
|
65
|
+
// Do nothing for empty input
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
console.log(chalk.yellow(`Unknown command: ${command}`));
|
|
69
|
+
console.log(chalk.blue("Type 'help' to see available commands"));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const help = () => {
|
|
75
|
+
console.log(`
|
|
76
|
+
${chalk.yellow('Available Commands:')}
|
|
77
|
+
- about ${chalk.gray('Learn more about me')}
|
|
78
|
+
- profile ${chalk.gray('View profile info')}
|
|
79
|
+
- projects ${chalk.gray('View a list of projects')}
|
|
80
|
+
- art ${chalk.gray('View my art profiles')}
|
|
81
|
+
- social ${chalk.gray('View my social media profiles')}
|
|
82
|
+
- exit ${chalk.gray('Exit the CLI')}
|
|
83
|
+
`);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const exit = () => {
|
|
87
|
+
console.log(
|
|
88
|
+
chalk.red(`
|
|
89
|
+
Goodbye! Thank you for using my CLI!`)
|
|
90
|
+
);
|
|
91
|
+
social();
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const profile = () => {
|
|
95
|
+
console.log(`
|
|
96
|
+
${chalk.cyan('My Profile')}
|
|
97
|
+
Name: Alagappan N
|
|
98
|
+
Role: Software Engineer
|
|
99
|
+
Location: Hyderabad, Telangana, India
|
|
100
|
+
Email: alagappaforwork@gmail.com
|
|
101
|
+
`);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const projects = async () => {
|
|
105
|
+
console.log(`${chalk.cyan('Projects')}`);
|
|
106
|
+
|
|
107
|
+
const answers = await inquirer.prompt([
|
|
108
|
+
{
|
|
109
|
+
type: 'list',
|
|
110
|
+
name: 'project',
|
|
111
|
+
message: 'Select a project to view details:',
|
|
112
|
+
choices: [
|
|
113
|
+
'Bloom',
|
|
114
|
+
'HierBridge',
|
|
115
|
+
'WorkHero',
|
|
116
|
+
'Procedure',
|
|
117
|
+
'Terminal Portfolio',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
]);
|
|
121
|
+
|
|
122
|
+
projectDetails(answers.project);
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
const projectDetails = (project: string) => {
|
|
126
|
+
console.log(`
|
|
127
|
+
${chalk.cyan.bold(project)}`);
|
|
128
|
+
switch (project) {
|
|
129
|
+
case 'HierBridge':
|
|
130
|
+
console.log(`
|
|
131
|
+
I am leading the development of a Voice of Employee platform designed to enhance hierarchical transparency and improve workplace decision-making.
|
|
132
|
+
The platform leverages AI strategies like Retrieval-Augmented Generation (RAG) and AI Agents to provide data-driven insights. Through customer discovery interviews,
|
|
133
|
+
I have identified key market challenges to shape the product effectively.
|
|
134
|
+
Backed by CMU's Project Olympus and other esteemed professors, we're in pre-development, laser-focused on building a product that actually moves the needle.
|
|
135
|
+
|
|
136
|
+
${chalk.yellow('Website:')} https://hierbridge.com/
|
|
137
|
+
${chalk.blue('LinkedIn:')} https://www.linkedin.com/company/hierbridge
|
|
138
|
+
${chalk.magenta('Tech Stack (Planned):')} Nx, Node.js, Koa, Next.js, Mongo
|
|
139
|
+
`);
|
|
140
|
+
break;
|
|
141
|
+
case 'Bloom':
|
|
142
|
+
console.log(`
|
|
143
|
+
I'm part of the team building Bloom, an edtech platform designed to make reading engaging for young learners—because reading should be more fun than frustrating.
|
|
144
|
+
I've worked on crafting complex, dynamic lessons that adapt to different inputs, ensuring an interactive experience that keeps kids hooked. I also built the admin portal for
|
|
145
|
+
content creation and data management, making life easier for educators. On the backend, I set up CI pipelines for testing and optimised and standardised the codebase for
|
|
146
|
+
smoother development and long-term scalability.
|
|
147
|
+
|
|
148
|
+
${chalk.magenta('Tech Stack:')} Nx, Node.js, Koa, React, Mongo
|
|
149
|
+
`);
|
|
150
|
+
break;
|
|
151
|
+
case 'WorkHero':
|
|
152
|
+
console.log(`
|
|
153
|
+
WorkHero pairs a fractional office manager with an LLM-powered platform, ensuring smooth workforce management, customer relations, and administrative operations.
|
|
154
|
+
I built an automated agent testing framework from scratch, designed to evaluate multiple AI agents operating across different LLMs (Claude, Grok, Llama, GPT, etc.).
|
|
155
|
+
These agents handled everything from customer interactions to task management, making rigorous testing essential. The framework introduced a modular design,
|
|
156
|
+
allowing new test executors for evolving tasks. I also developed an AI Test Agent that verified actions, assessed accuracy, and maintained a scoring rubric to track performance.
|
|
157
|
+
|
|
158
|
+
${chalk.yellow('Website:')} https://www.workhero.pro/
|
|
159
|
+
${chalk.magenta('Tech Stack:')} Nx, Node.js, Koa, React, Mongo
|
|
160
|
+
`);
|
|
161
|
+
break;
|
|
162
|
+
case 'Procedure':
|
|
163
|
+
console.log(`
|
|
164
|
+
I worked on a range of internal apps. One of these was Ragnarok, an employee appreciation Slack bot that let colleagues give shoutouts and reward points.
|
|
165
|
+
Built on Frappe, it extended ERPNext, our HR platform. I also helped redesign of the Procedure website, rebuilding it from the ground up with Next.js and Tailwind CSS.
|
|
166
|
+
The new design introduced modern UI elements, improved structure, ensuring a sleek and engaging user experience.
|
|
167
|
+
|
|
168
|
+
${chalk.yellow('Website:')} (To be Hosted Soon)
|
|
169
|
+
`);
|
|
170
|
+
break;
|
|
171
|
+
case 'Terminal Portfolio':
|
|
172
|
+
console.log(`
|
|
173
|
+
I created an interactive terminal-based portfolio. It allows users to navigate through my professional experiences, projects, and skills directly from the command line.
|
|
174
|
+
The portfolio is designed to be both functional and engaging, providing a novel way to showcase my work.
|
|
175
|
+
|
|
176
|
+
This was an experiment to see how well I can leverage AI code editors to their full potential.
|
|
177
|
+
|
|
178
|
+
${chalk.magenta('Tech Stack:')} Node.js, Inquirer, Chalk
|
|
179
|
+
`);
|
|
180
|
+
break;
|
|
181
|
+
default:
|
|
182
|
+
console.log(chalk.yellow(`Unknown project: ${project}`));
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
const about = () => {
|
|
187
|
+
console.log(`
|
|
188
|
+
${chalk.cyan('About Me')}
|
|
189
|
+
Howdy! I'm Alagappan, a ${chalk.green(
|
|
190
|
+
'full-stack engineer'
|
|
191
|
+
)} with a passion for design, development and digital art.
|
|
192
|
+
Back in school, I eagerly looked forward to my computer lab sessions, only to rush off to art class right after.
|
|
193
|
+
These interest have strongly shaped my career as I found programming to be the right blend of my creative and logical personas.
|
|
194
|
+
|
|
195
|
+
Beyond building applications, I'm also a ${chalk.magenta(
|
|
196
|
+
'3D digital artist'
|
|
197
|
+
)}—a passion that started as a hobby during the pandemic
|
|
198
|
+
and has grown into a dedicated craft. In the art community, I go by ${chalk.blue(
|
|
199
|
+
'skidrrow'
|
|
200
|
+
)}. Use the command ${chalk.yellow('art')} to view my art portfolio.
|
|
201
|
+
`);
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
const art = () => {
|
|
205
|
+
console.log(`
|
|
206
|
+
${chalk.cyan('Art Profiles')} ${chalk.gray('(@skidrrow)')}
|
|
207
|
+
${chalk.gray('Feel free to follow and reach out for collaborations!')}
|
|
208
|
+
|
|
209
|
+
${chalk.magenta('Instagram:')} https://instagram.com/skidrrow
|
|
210
|
+
${chalk.blue('Behance:')} https://behance.net/alagappann
|
|
211
|
+
${chalk.yellow('ArtGrab:')} https://artgrab.co/art/skidrow
|
|
212
|
+
${chalk.red(
|
|
213
|
+
'YouTube:'
|
|
214
|
+
)} https://www.youtube.com/channel/UCajdq0CHzumeh7QQi-d0l4w
|
|
215
|
+
${chalk.cyan('Email:')} skidrrowforwork@gmail.com
|
|
216
|
+
`);
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
const social = () => {
|
|
220
|
+
console.log(`
|
|
221
|
+
${chalk.cyan('Connect with me')}
|
|
222
|
+
${chalk.gray("Let's stay in touch!")}
|
|
223
|
+
|
|
224
|
+
${chalk.green('GitHub:')} https://github.com/alagappan17
|
|
225
|
+
${chalk.blue('LinkedIn:')} https://linkedin.com/in/alagappan-n
|
|
226
|
+
${chalk.gray('Twitter (X):')} https://x.com/alagappantwt
|
|
227
|
+
${chalk.cyan('Email:')} alagappaforwork@gmail.com
|
|
228
|
+
`);
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
// Start the interactive mode immediately
|
|
232
|
+
startInteractiveMode();
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ESNext",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "Node",
|
|
6
|
+
"outDir": "dist",
|
|
7
|
+
"rootDir": "src",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"forceConsistentCasingInFileNames": true
|
|
11
|
+
},
|
|
12
|
+
"include": ["src"],
|
|
13
|
+
"exclude": ["node_modules", "dist"]
|
|
14
|
+
}
|