scottkosman 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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Scott Kosman
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, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,171 @@
1
+ # Scott Kosman CLI
2
+
3
+ A modern, interactive command-line interface built with TypeScript that showcases Scott Kosman's professional information and provides quick access to external links.
4
+
5
+ ## šŸš€ Features
6
+
7
+ - **Interactive Welcome Experience**: Beautiful ASCII art with gradient styling and terminal image display
8
+ - **Professional Bio**: Displays Scott's current role and background information
9
+ - **Quick Links Menu**: Selectable list of external URLs that open in your default browser
10
+ - **Persistent Menu**: Loop back to the menu after opening links - no need to restart
11
+ - **Modern CLI Architecture**: Built with TypeScript, Commander.js, and modern Node.js practices
12
+ - **Professional Branding**: Custom styling with chalk, figlet, and gradient effects
13
+
14
+ ## šŸ“¦ Installation
15
+
16
+ ### Global Installation (Recommended)
17
+
18
+ ```bash
19
+ npm install -g scottkosman
20
+ ```
21
+
22
+ ### Run with npx (No Installation Required)
23
+
24
+ ```bash
25
+ npx scottkosman
26
+ ```
27
+
28
+ ### Local Development
29
+
30
+ ```bash
31
+ # Clone the repository
32
+ git clone https://github.com/humantorch/scottkosman-cli.git
33
+ cd scottkosman-cli
34
+
35
+ # Install dependencies
36
+ npm install
37
+
38
+ # Build the project
39
+ npm run build
40
+
41
+ # Run in development mode
42
+ npm run dev
43
+ ```
44
+
45
+ ## šŸŽÆ Usage
46
+
47
+ ### Default Experience
48
+
49
+ Simply run the CLI without any arguments to get the full interactive experience:
50
+
51
+ ```bash
52
+ scottkosman
53
+ ```
54
+
55
+ This will display:
56
+ - Scott's profile image
57
+ - ASCII art title with gradient effects
58
+ - Professional bio and background information
59
+ - Interactive menu of external links (loops until you choose to exit)
60
+
61
+ ### Available Commands
62
+
63
+ ```bash
64
+ # Show help information
65
+ scottkosman --help
66
+
67
+ # Display version
68
+ scottkosman --version
69
+
70
+ # Show enhanced help
71
+ scottkosman help
72
+
73
+ # Display CLI information
74
+ scottkosman info
75
+
76
+ # Initialize CLI (if needed)
77
+ scottkosman init
78
+ ```
79
+
80
+ ## šŸ”— Quick Links
81
+
82
+ The CLI provides easy access to:
83
+
84
+ - šŸ“ **Blog/Website**: Visit my personal website
85
+ - šŸ™‹šŸ»ā€ā™‚ļø **How To Scott**: My "Manager README", useful info if you currently do or want to work with/for me
86
+ - 🌐 **GitHub Profile**: If you're reading this you probably already know what GitHub is
87
+ - šŸ¢ **LinkedIn Profile**: Join my Professional Networkā„¢
88
+ - šŸ“ø **Instagram**: See what I had for lunch
89
+ - šŸ“§ **Email Me**: Email? In 2025? I do check this, I promise
90
+ - šŸ”‘ **1Password**: Where I work
91
+
92
+ ## šŸ‘Øā€šŸ’¼ About Scott
93
+
94
+ Toronto-based Engineering Manager at 1Password, 20+ year vet of the technology, marketing, and digital strategy world. A recovering front-end developer who pivoted to management back in 2014, I now enjoy leading teams building the next generation of stuff you do on this "internet" thing. He/him.
95
+
96
+ ## šŸ› ļø Development
97
+
98
+ ### Prerequisites
99
+
100
+ - Node.js 18.0.0 or higher
101
+ - npm or yarn
102
+
103
+ ### Scripts
104
+
105
+ ```bash
106
+ # Build the project
107
+ npm run build
108
+
109
+ # Run in development mode
110
+ npm run dev
111
+
112
+ # Start the built version
113
+ npm start
114
+
115
+ # Clean build artifacts
116
+ npm run clean
117
+
118
+ # Run tests
119
+ npm test
120
+
121
+ # Lint code
122
+ npm run lint
123
+
124
+ # Format code
125
+ npm run format
126
+ ```
127
+
128
+ ### Project Structure
129
+
130
+ ```
131
+ scottkosman-cli/
132
+ ā”œā”€ā”€ src/
133
+ │ ā”œā”€ā”€ commands/ # CLI commands
134
+ │ ā”œā”€ā”€ utils/ # Utility functions
135
+ │ ā”œā”€ā”€ types/ # TypeScript type definitions
136
+ │ └── index.ts # Main entry point
137
+ ā”œā”€ā”€ assets/ # Static assets (images, etc.)
138
+ ā”œā”€ā”€ dist/ # Built JavaScript files
139
+ └── package.json
140
+ ```
141
+
142
+ ## šŸŽØ Technologies Used
143
+
144
+ - **TypeScript**: Type-safe JavaScript development
145
+ - **Commander.js**: CLI framework
146
+ - **Chalk**: Terminal styling and colors
147
+ - **Inquirer**: Interactive command-line interfaces
148
+ - **Figlet**: ASCII art text
149
+ - **Gradient-string**: Beautiful gradient effects
150
+ - **Boxen**: Terminal boxes and borders
151
+ - **Terminal-image**: Display images in terminal
152
+ - **Open**: Open URLs in default browser
153
+
154
+ ## šŸ“ License
155
+
156
+ MIT License - see [LICENSE](LICENSE) file for details.
157
+
158
+ ## šŸ¤ Contributing
159
+
160
+ Contributions are welcome! Please feel free to submit a Pull Request.
161
+
162
+ ## šŸ“ž Contact
163
+
164
+ - **Website**: [scottkosman.com](https://scottkosman.com)
165
+ - **Email**: kosman.scott@gmail.com
166
+ - **GitHub**: [@humantorch](https://github.com/humantorch)
167
+ - **LinkedIn**: [Scott Kosman](https://linkedin.com/in/scottkosman)
168
+
169
+ ---
170
+
171
+ Made with ā¤ļø by Scott Kosman
@@ -0,0 +1,25 @@
1
+ # Assets Directory
2
+
3
+ This directory contains images and other assets used by the Scott Kosman CLI.
4
+
5
+ ## Image Requirements
6
+
7
+ - **Format**: PNG or JPG recommended
8
+ - **Size**: Keep images reasonably sized (under 1MB) for fast loading
9
+ - **Aspect Ratio**: Consider terminal display constraints
10
+
11
+ ## Current Images
12
+
13
+ - `scott.jpg` - Main CLI logo/image (30% width display)
14
+
15
+ ## Adding New Images
16
+
17
+ 1. Place your image file in this directory
18
+ 2. Update the path in `src/utils/welcome.ts` if using a different filename
19
+ 3. The CLI will automatically display the image if it exists
20
+
21
+ ## Notes
22
+
23
+ - Images are displayed using `terminal-image` package
24
+ - If an image fails to load, the CLI continues without it
25
+ - Terminal compatibility may vary by platform
Binary file
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function helpCommand(program: Command): void;
3
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8BlD"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.helpCommand = helpCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const boxen_1 = __importDefault(require("boxen"));
9
+ function helpCommand(program) {
10
+ program
11
+ .command('help')
12
+ .description('Show enhanced help information')
13
+ .action(() => {
14
+ const help = (0, boxen_1.default)(`${chalk_1.default.bold.cyan('Scott Kosman CLI Help')}\n\n` +
15
+ `${chalk_1.default.gray('Available Commands:')}\n\n` +
16
+ `${chalk_1.default.yellow('init')} ${chalk_1.default.gray('Initialize and set up the CLI')}\n` +
17
+ `${chalk_1.default.yellow('info')} ${chalk_1.default.gray('Display CLI and system information')}\n` +
18
+ `${chalk_1.default.yellow('help')} ${chalk_1.default.gray('Show this help message')}\n\n` +
19
+ `${chalk_1.default.gray('Global Options:')}\n` +
20
+ `${chalk_1.default.yellow('-v, --version')} ${chalk_1.default.gray('Show version number')}\n` +
21
+ `${chalk_1.default.yellow('-d, --debug')} ${chalk_1.default.gray('Enable debug mode')}\n\n` +
22
+ `${chalk_1.default.gray('Examples:')}\n` +
23
+ `${chalk_1.default.blue('scottkosman init')} ${chalk_1.default.gray('Set up your environment')}\n` +
24
+ `${chalk_1.default.blue('scottkosman info')} ${chalk_1.default.gray('Show system information')}\n` +
25
+ `${chalk_1.default.blue('scottkosman --help')} ${chalk_1.default.gray('Show standard help')}\n\n` +
26
+ `${chalk_1.default.gray('For more information, visit:')}\n` +
27
+ `${chalk_1.default.blue('https://github.com/humantorch/scottkosman-cli')}`, {
28
+ padding: 1,
29
+ margin: 1,
30
+ borderStyle: 'round',
31
+ borderColor: 'cyan',
32
+ });
33
+ console.log(help);
34
+ });
35
+ }
36
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":";;;;;AAIA,kCA8BC;AAjCD,kDAA0B;AAC1B,kDAA0B;AAE1B,SAAgB,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,IAAI,GAAG,IAAA,eAAK,EAChB,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM;YACjD,GAAG,eAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM;YAC1C,GAAG,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,IAAI;YAC9E,GAAG,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,IAAI;YACnF,GAAG,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,MAAM;YACzE,GAAG,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI;YACpC,GAAG,eAAK,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI;YAC1E,GAAG,eAAK,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,eAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM;YAC1E,GAAG,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI;YAC9B,GAAG,eAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI;YAClF,GAAG,eAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI;YAClF,GAAG,eAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,eAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM;YAC/E,GAAG,eAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,IAAI;YACjD,GAAG,eAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,EAAE,EAChE;YACE,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;YACT,WAAW,EAAE,OAAO;YACpB,WAAW,EAAE,MAAM;SACpB,CACF,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function infoCommand(program: Command): void;
3
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4BlD"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.infoCommand = infoCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const boxen_1 = __importDefault(require("boxen"));
9
+ const package_json_1 = require("../../package.json");
10
+ function infoCommand(program) {
11
+ program
12
+ .command('info')
13
+ .description('Display information about the Scott Kosman CLI')
14
+ .action(() => {
15
+ const info = (0, boxen_1.default)(`${chalk_1.default.bold.cyan('Scott Kosman CLI')}\n\n` +
16
+ `${chalk_1.default.gray('Version:')} ${chalk_1.default.white(package_json_1.version)}\n` +
17
+ `${chalk_1.default.gray('Node.js:')} ${chalk_1.default.white(process.version)}\n` +
18
+ `${chalk_1.default.gray('Platform:')} ${chalk_1.default.white(process.platform)}\n` +
19
+ `${chalk_1.default.gray('Architecture:')} ${chalk_1.default.white(process.arch)}\n\n` +
20
+ `${chalk_1.default.gray('Built with modern tools:')}\n` +
21
+ `${chalk_1.default.blue('• TypeScript')}\n` +
22
+ `${chalk_1.default.blue('• Commander.js')}\n` +
23
+ `${chalk_1.default.blue('• Chalk for styling')}\n` +
24
+ `${chalk_1.default.blue('• Inquirer for prompts')}\n` +
25
+ `${chalk_1.default.blue('• Ora for spinners')}\n\n` +
26
+ `${chalk_1.default.yellow('GitHub:')} https://github.com/humantorch/scottkosman-cli`, {
27
+ padding: 1,
28
+ margin: 1,
29
+ borderStyle: 'round',
30
+ borderColor: 'cyan',
31
+ });
32
+ console.log(info);
33
+ });
34
+ }
35
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":";;;;;AAKA,kCA4BC;AAhCD,kDAA0B;AAC1B,kDAA0B;AAC1B,qDAA6C;AAE7C,SAAgB,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,IAAI,GAAG,IAAA,eAAK,EAChB,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM;YAC5C,GAAG,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,eAAK,CAAC,KAAK,CAAC,sBAAO,CAAC,IAAI;YACrD,GAAG,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI;YAC7D,GAAG,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI;YAC/D,GAAG,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM;YACjE,GAAG,eAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI;YAC7C,GAAG,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI;YACjC,GAAG,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI;YACnC,GAAG,eAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI;YACxC,GAAG,eAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI;YAC3C,GAAG,eAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM;YACzC,GAAG,eAAK,CAAC,MAAM,CAAC,SAAS,CAAC,gDAAgD,EAC1E;YACE,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;YACT,WAAW,EAAE,OAAO;YACpB,WAAW,EAAE,MAAM;SACpB,CACF,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function initCommand(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmDlD"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.initCommand = initCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const inquirer_1 = __importDefault(require("inquirer"));
9
+ const ora_1 = __importDefault(require("ora"));
10
+ const welcome_1 = require("../utils/welcome");
11
+ function initCommand(program) {
12
+ program
13
+ .command('init')
14
+ .description('Initialize and set up the Scott Kosman CLI')
15
+ .action(async () => {
16
+ await (0, welcome_1.showWelcome)();
17
+ console.log(chalk_1.default.blue('šŸš€ Initializing Scott Kosman CLI...\n'));
18
+ const spinner = (0, ora_1.default)('Setting up your environment...').start();
19
+ try {
20
+ // Simulate some setup work
21
+ await new Promise(resolve => setTimeout(resolve, 2000));
22
+ spinner.succeed('Environment setup complete!');
23
+ const answers = await inquirer_1.default.prompt([
24
+ {
25
+ type: 'input',
26
+ name: 'name',
27
+ message: 'What\'s your name?',
28
+ default: 'Developer',
29
+ },
30
+ {
31
+ type: 'list',
32
+ name: 'theme',
33
+ message: 'Choose your preferred theme:',
34
+ choices: ['Light', 'Dark', 'Auto'],
35
+ default: 'Auto',
36
+ },
37
+ {
38
+ type: 'confirm',
39
+ name: 'notifications',
40
+ message: 'Enable notifications?',
41
+ default: true,
42
+ },
43
+ ]);
44
+ console.log(chalk_1.default.green('\nāœ… Setup complete!'));
45
+ console.log(chalk_1.default.gray(`Welcome, ${answers.name}!`));
46
+ console.log(chalk_1.default.gray(`Theme: ${answers.theme}`));
47
+ console.log(chalk_1.default.gray(`Notifications: ${answers.notifications ? 'Enabled' : 'Disabled'}`));
48
+ console.log(chalk_1.default.yellow('\nšŸ’” Tip: Run "scottkosman --help" to see all available commands'));
49
+ }
50
+ catch (error) {
51
+ spinner.fail('Setup failed');
52
+ console.error(chalk_1.default.red('Error during setup:'), error);
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;AAMA,kCAmDC;AAxDD,kDAA0B;AAC1B,wDAAgC;AAChC,8CAAsB;AACtB,8CAA+C;AAE/C,SAAgB,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAA,qBAAW,GAAE,CAAC;QAEpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAEjE,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,gCAAgC,CAAC,CAAC,KAAK,EAAE,CAAC;QAE9D,IAAI,CAAC;YACH,2BAA2B;YAC3B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAExD,OAAO,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAE/C,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBACpC;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,oBAAoB;oBAC7B,OAAO,EAAE,WAAW;iBACrB;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,8BAA8B;oBACvC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;oBAClC,OAAO,EAAE,MAAM;iBAChB;gBACD;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,uBAAuB;oBAChC,OAAO,EAAE,IAAI;iBACd;aACF,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAE5F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,kEAAkE,CAAC,CAAC,CAAC;QAEhG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const commander_1 = require("commander");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const package_json_1 = require("../package.json");
10
+ const welcome_1 = require("./utils/welcome");
11
+ const init_1 = require("./commands/init");
12
+ const info_1 = require("./commands/info");
13
+ const help_1 = require("./commands/help");
14
+ const program = new commander_1.Command();
15
+ // Set up the CLI
16
+ program
17
+ .name('scottkosman')
18
+ .description('Scott Kosman CLI - A modern command-line interface')
19
+ .version(package_json_1.version, '-v, --version')
20
+ .option('-d, --debug', 'Enable debug mode');
21
+ // Add commands
22
+ (0, init_1.initCommand)(program);
23
+ (0, info_1.infoCommand)(program);
24
+ (0, help_1.helpCommand)(program);
25
+ // Default action when no command is provided
26
+ program.action(async () => {
27
+ await (0, welcome_1.showWelcome)();
28
+ });
29
+ // Handle errors gracefully
30
+ program.exitOverride();
31
+ try {
32
+ program.parse();
33
+ }
34
+ catch (err) {
35
+ if (err instanceof Error) {
36
+ console.error(chalk_1.default.red('Error:'), err.message);
37
+ }
38
+ else {
39
+ console.error(chalk_1.default.red('An unexpected error occurred'));
40
+ }
41
+ process.exit(1);
42
+ }
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,kDAA0C;AAC1C,6CAA8C;AAC9C,0CAA8C;AAC9C,0CAA8C;AAC9C,0CAA8C;AAE9C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,iBAAiB;AACjB,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,oDAAoD,CAAC;KACjE,OAAO,CAAC,sBAAO,EAAE,eAAe,CAAC;KACjC,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;AAE9C,eAAe;AACf,IAAA,kBAAW,EAAC,OAAO,CAAC,CAAC;AACrB,IAAA,kBAAW,EAAC,OAAO,CAAC,CAAC;AACrB,IAAA,kBAAW,EAAC,OAAO,CAAC,CAAC;AAErB,6CAA6C;AAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;IACxB,MAAM,IAAA,qBAAW,GAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,2BAA2B;AAC3B,OAAO,CAAC,YAAY,EAAE,CAAC;AAEvB,IAAI,CAAC;IACH,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function showWelcome(): Promise<void>;
2
+ //# sourceMappingURL=welcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/utils/welcome.ts"],"names":[],"mappings":"AAqDA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAkFjD"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.showWelcome = showWelcome;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const figlet_1 = __importDefault(require("figlet"));
9
+ const gradient_string_1 = __importDefault(require("gradient-string"));
10
+ const terminal_image_1 = __importDefault(require("terminal-image"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const inquirer_1 = __importDefault(require("inquirer"));
14
+ const open_1 = __importDefault(require("open"));
15
+ const menuItems = [
16
+ {
17
+ name: 'šŸ“ Blog/Website',
18
+ value: 'https://scottkosman.com',
19
+ description: 'Visit my personal website'
20
+ },
21
+ {
22
+ name: 'šŸ™‹šŸ»ā€ā™‚ļø How To Scott',
23
+ value: 'https://scottkosman.com/post/readme/',
24
+ description: 'My "Manager README", useful info if you currently do or want to work with/for me'
25
+ },
26
+ {
27
+ name: '🌐 GitHub Profile',
28
+ value: 'https://github.com/humantorch',
29
+ description: 'If you\'re reading this you probably already know what GitHub is'
30
+ },
31
+ {
32
+ name: 'šŸ¢ LinkedIn Profile',
33
+ value: 'https://linkedin.com/in/scottkosman',
34
+ description: 'Join my Professional Networkā„¢'
35
+ },
36
+ {
37
+ name: 'šŸ“ø Instagram',
38
+ value: 'https://instagram.com/humantorch',
39
+ description: 'See what I had for lunch'
40
+ },
41
+ {
42
+ name: 'šŸ“§ Email Me',
43
+ value: 'mailto:kosman.scott@gmail.com',
44
+ description: 'Email? In 2025? I do check this, I promise.'
45
+ },
46
+ {
47
+ name: 'šŸ”‘ 1Password',
48
+ value: 'https://1password.com',
49
+ description: 'Where I work'
50
+ }
51
+ ];
52
+ async function showWelcome() {
53
+ // Clear the console
54
+ console.clear();
55
+ // Display image (if available)
56
+ const imagePath = path_1.default.join(__dirname, '../../assets/scott.jpg');
57
+ if (fs_1.default.existsSync(imagePath)) {
58
+ try {
59
+ const imageBuffer = fs_1.default.readFileSync(imagePath);
60
+ const image = await terminal_image_1.default.buffer(imageBuffer, { width: '10%', height: 'auto' });
61
+ console.log(image.trim());
62
+ }
63
+ catch (e) {
64
+ // Ignore image errors, continue
65
+ }
66
+ }
67
+ // Create ASCII art title
68
+ const title = figlet_1.default.textSync('Scott Kosman', {
69
+ font: 'Standard',
70
+ horizontalLayout: 'default',
71
+ verticalLayout: 'default',
72
+ });
73
+ // Apply gradient to the title
74
+ const gradientTitle = (0, gradient_string_1.default)(['#ff6b6b', '#4ecdc4', '#45b7d1'])(title);
75
+ // Display everything
76
+ console.log(gradientTitle);
77
+ // Create subtitle
78
+ const subtitle = chalk_1.default.bold('Toronto-based Engineering Manager at 1Password, 20+ year vet of the technology,\nmarketing, and digital strategy world. A recovering front-end developer who pivoted\nto management back in 2014, I now enjoy leading teams building the next generation\nof stuff you do on this "internet" thing. He/him.');
79
+ // Display everything
80
+ console.log(subtitle);
81
+ console.log();
82
+ // Show interactive menu
83
+ try {
84
+ console.log(chalk_1.default.cyan('šŸ”— Quick Links - Select a link to open:\n'));
85
+ while (true) {
86
+ const { selectedUrl } = await inquirer_1.default.prompt([
87
+ {
88
+ type: 'list',
89
+ name: 'selectedUrl',
90
+ message: 'Choose an option:',
91
+ choices: [
92
+ ...menuItems.map(item => ({
93
+ name: `${item.name}${item.description ? ` - ${item.description}` : ''}`,
94
+ value: item.value
95
+ })),
96
+ new inquirer_1.default.Separator(),
97
+ {
98
+ name: 'āŒ Exit',
99
+ value: 'exit'
100
+ }
101
+ ],
102
+ pageSize: 10
103
+ }
104
+ ]);
105
+ if (selectedUrl !== 'exit') {
106
+ console.log(chalk_1.default.green(`\nšŸš€ Opening: ${selectedUrl}`));
107
+ // Open the URL in the default browser
108
+ await (0, open_1.default)(selectedUrl);
109
+ console.log(chalk_1.default.gray('URL opened in your default browser!'));
110
+ console.log(chalk_1.default.cyan('\nšŸ”— Quick Links - Select another link or exit:\n'));
111
+ }
112
+ else {
113
+ console.log(chalk_1.default.gray('\nšŸ‘‹ Thanks for using Scott Kosman CLI!'));
114
+ break;
115
+ }
116
+ }
117
+ }
118
+ catch (error) {
119
+ if (error instanceof Error) {
120
+ console.error(chalk_1.default.red('Error opening URL:'), error.message);
121
+ }
122
+ else {
123
+ console.error(chalk_1.default.red('An unexpected error occurred'));
124
+ }
125
+ }
126
+ }
127
+ //# sourceMappingURL=welcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/utils/welcome.ts"],"names":[],"mappings":";;;;;AAqDA,kCAkFC;AAvID,kDAA0B;AAC1B,oDAA4B;AAC5B,sEAAuC;AACvC,oEAA2C;AAC3C,gDAAwB;AACxB,4CAAoB;AACpB,wDAAgC;AAChC,gDAAwB;AAQxB,MAAM,SAAS,GAAe;IAC5B;QACE,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,2BAA2B;KACzC;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,sCAAsC;QAC7C,WAAW,EAAE,kFAAkF;KAChG;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,+BAA+B;QACtC,WAAW,EAAE,kEAAkE;KAChF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,qCAAqC;QAC5C,WAAW,EAAE,+BAA+B;KAC7C;IACD;QACE,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,kCAAkC;QACzC,WAAW,EAAE,0BAA0B;KACxC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,+BAA+B;QACtC,WAAW,EAAE,6CAA6C;KAC3D;IACD;QACE,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,cAAc;KAC5B;CACF,CAAC;AAEK,KAAK,UAAU,WAAW;IAC/B,oBAAoB;IACpB,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,+BAA+B;IAC/B,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;IACjE,IAAI,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,YAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,wBAAa,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACxF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,KAAK,GAAG,gBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;QAC5C,IAAI,EAAE,UAAU;QAChB,gBAAgB,EAAE,SAAS;QAC3B,cAAc,EAAE,SAAS;KAC1B,CAAC,CAAC;IAEH,8BAA8B;IAC9B,MAAM,aAAa,GAAG,IAAA,yBAAQ,EAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEzE,qBAAqB;IACrB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE3B,kBAAkB;IAClB,MAAM,QAAQ,GAAG,eAAK,CAAC,IAAI,CAAC,6SAA6S,CAAC,CAAC;IAE3U,qBAAqB;IACrB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,wBAAwB;IACxB,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;QAErE,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBAC5C;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,mBAAmB;oBAC5B,OAAO,EAAE;wBACP,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;4BACxB,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;4BACvE,KAAK,EAAE,IAAI,CAAC,KAAK;yBAClB,CAAC,CAAC;wBACH,IAAI,kBAAQ,CAAC,SAAS,EAAE;wBACxB;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,MAAM;yBACd;qBACF;oBACD,QAAQ,EAAE,EAAE;iBACb;aACF,CAAC,CAAC;YAEH,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC,CAAC;gBAEzD,sCAAsC;gBACtC,MAAM,IAAA,cAAI,EAAC,WAAW,CAAC,CAAC;gBAExB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;gBACnE,MAAM;YACR,CAAC;QACH,CAAC;IAEH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "scottkosman",
3
+ "version": "1.0.0",
4
+ "description": "A modern, interactive command-line interface for Scott Kosman with quick access to external links",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "scottkosman": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "assets"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "postbuild": "chmod +x dist/index.js",
16
+ "dev": "tsx src/index.ts",
17
+ "start": "node dist/index.js",
18
+ "clean": "rm -rf dist",
19
+ "prebuild": "npm run clean",
20
+ "prepublishOnly": "npm run build",
21
+ "test": "jest",
22
+ "test:watch": "jest --watch",
23
+ "lint": "eslint src --ext .ts",
24
+ "lint:fix": "eslint src --ext .ts --fix",
25
+ "format": "prettier --write src/**/*.ts",
26
+ "prepare": "npm run build"
27
+ },
28
+ "keywords": [
29
+ "cli",
30
+ "command-line",
31
+ "terminal",
32
+ "scott-kosman",
33
+ "personal-branding",
34
+ "interactive"
35
+ ],
36
+ "author": "Scott Kosman",
37
+ "license": "MIT",
38
+ "dependencies": {
39
+ "boxen": "^7.1.1",
40
+ "chalk": "^5.3.0",
41
+ "commander": "^11.1.0",
42
+ "figlet": "^1.7.0",
43
+ "gradient-string": "^2.0.2",
44
+ "inquirer": "^9.2.12",
45
+ "open": "^10.1.2",
46
+ "ora": "^7.0.1",
47
+ "terminal-image": "^3.1.0"
48
+ },
49
+ "devDependencies": {
50
+ "@types/figlet": "^1.5.8",
51
+ "@types/inquirer": "^9.0.7",
52
+ "@types/jest": "^29.5.8",
53
+ "@types/node": "^20.10.0",
54
+ "@typescript-eslint/eslint-plugin": "^6.13.0",
55
+ "@typescript-eslint/parser": "^6.13.0",
56
+ "eslint": "^8.54.0",
57
+ "jest": "^29.7.0",
58
+ "prettier": "^3.1.0",
59
+ "tsx": "^4.6.0",
60
+ "typescript": "^5.3.0"
61
+ },
62
+ "engines": {
63
+ "node": ">=18.0.0"
64
+ },
65
+ "repository": {
66
+ "type": "git",
67
+ "url": "https://github.com/humantorch/scottkosman-cli.git"
68
+ },
69
+ "bugs": {
70
+ "url": "https://github.com/humantorch/scottkosman-cli/issues"
71
+ },
72
+ "homepage": "https://github.com/humantorch/scottkosman-cli#readme"
73
+ }