gaboesquivel 3.18.0 → 4.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 (144) hide show
  1. package/dist/cli.js +431 -72
  2. package/dist/cli.mjs +2958 -69
  3. package/dist/content/projects/4tius-fitness-data-tracker.md +34 -0
  4. package/dist/content/projects/amc-yeah-tv-facebook-app.md +37 -0
  5. package/dist/content/projects/american-express.md +37 -0
  6. package/dist/content/projects/amex-money-talk.md +30 -0
  7. package/dist/content/projects/arinc-microfids.md +33 -0
  8. package/dist/content/projects/asoblockchain.md +46 -0
  9. package/dist/content/projects/bitcashbank.md +48 -0
  10. package/dist/content/projects/bitlauncher.md +63 -0
  11. package/dist/content/projects/bureau-of-trade-beta.md +33 -0
  12. package/dist/content/projects/capoeira-abolicao.md +32 -0
  13. package/dist/content/projects/chaingraph.md +38 -0
  14. package/dist/content/projects/costa-rica-js.md +48 -0
  15. package/dist/content/projects/cryptocantinacr.md +39 -0
  16. package/dist/content/projects/dboard.md +39 -0
  17. package/dist/content/projects/earth.md +31 -0
  18. package/dist/content/projects/eat-arcade.md +37 -0
  19. package/dist/content/projects/elder-scrolls-online.md +34 -0
  20. package/dist/content/projects/emanate.md +35 -0
  21. package/dist/content/projects/eos-costa-rica.md +45 -0
  22. package/dist/content/projects/eos-rate.md +40 -0
  23. package/dist/content/projects/fantasy-tennis.md +32 -0
  24. package/dist/content/projects/fantasy-top-shots.md +37 -0
  25. package/dist/content/projects/gridium.md +33 -0
  26. package/dist/content/projects/its.md +32 -0
  27. package/dist/content/projects/jockey-hollow-bar-and-kitchen-menu-kiosk-app.md +36 -0
  28. package/dist/content/projects/jockey-hollow-bar-and-kitchen.md +36 -0
  29. package/dist/content/projects/knowledge-io.md +43 -0
  30. package/dist/content/projects/legal-agent.md +44 -0
  31. package/dist/content/projects/living-with-dryness.md +31 -0
  32. package/dist/content/projects/make-sense-labs.md +33 -0
  33. package/dist/content/projects/masterbots.md +48 -0
  34. package/dist/content/projects/mobtion.md +32 -0
  35. package/dist/content/projects/opyn.md +47 -0
  36. package/dist/content/projects/panini.md +31 -0
  37. package/dist/content/projects/photo-and-go.md +36 -0
  38. package/dist/content/projects/proparques.md +31 -0
  39. package/dist/content/projects/raremint.md +45 -0
  40. package/dist/content/projects/scotiatico.md +31 -0
  41. package/dist/content/projects/staples.md +31 -0
  42. package/dist/content/projects/substrate-contracts-ui.md +34 -0
  43. package/dist/content/projects/suntrust.md +30 -0
  44. package/dist/content/projects/tikr.md +35 -0
  45. package/dist/content/projects/tractor-supply.md +34 -0
  46. package/dist/content/projects/trivenzor.md +31 -0
  47. package/dist/content/projects/wink.md +41 -0
  48. package/dist/content/projects/wizard-world.md +39 -0
  49. package/dist/content/projects/ztx.md +42 -0
  50. package/dist/content/tags.md +95 -0
  51. package/dist/content/tech/ai-sdk.md +22 -0
  52. package/dist/content/tech/alchemy.md +18 -0
  53. package/dist/content/tech/angularjs.md +19 -0
  54. package/dist/content/tech/antelope.md +18 -0
  55. package/dist/content/tech/artificial-intelligence.md +24 -0
  56. package/dist/content/tech/aws.md +19 -0
  57. package/dist/content/tech/biometrics.md +18 -0
  58. package/dist/content/tech/blockchain.md +24 -0
  59. package/dist/content/tech/bootstrap.md +19 -0
  60. package/dist/content/tech/cms.md +20 -0
  61. package/dist/content/tech/cpp.md +18 -0
  62. package/dist/content/tech/css.md +19 -0
  63. package/dist/content/tech/dalle.md +18 -0
  64. package/dist/content/tech/data-charts.md +18 -0
  65. package/dist/content/tech/datocms.md +19 -0
  66. package/dist/content/tech/docker.md +19 -0
  67. package/dist/content/tech/eos.md +18 -0
  68. package/dist/content/tech/ethereum.md +23 -0
  69. package/dist/content/tech/ethersjs.md +22 -0
  70. package/dist/content/tech/evm.md +22 -0
  71. package/dist/content/tech/expo.md +19 -0
  72. package/dist/content/tech/faye.md +19 -0
  73. package/dist/content/tech/flow.md +18 -0
  74. package/dist/content/tech/foundry.md +22 -0
  75. package/dist/content/tech/gcloud.md +19 -0
  76. package/dist/content/tech/graphql.md +19 -0
  77. package/dist/content/tech/hardhat.md +18 -0
  78. package/dist/content/tech/heroku.md +18 -0
  79. package/dist/content/tech/javascript.md +19 -0
  80. package/dist/content/tech/less.md +18 -0
  81. package/dist/content/tech/llms.md +22 -0
  82. package/dist/content/tech/mongodb.md +19 -0
  83. package/dist/content/tech/mootools.md +18 -0
  84. package/dist/content/tech/nextjs.md +23 -0
  85. package/dist/content/tech/nft.md +18 -0
  86. package/dist/content/tech/niftory.md +18 -0
  87. package/dist/content/tech/nodejs.md +23 -0
  88. package/dist/content/tech/nuqs.md +19 -0
  89. package/dist/content/tech/openai.md +18 -0
  90. package/dist/content/tech/polkadot.md +18 -0
  91. package/dist/content/tech/ponder.md +22 -0
  92. package/dist/content/tech/postgresql.md +22 -0
  93. package/dist/content/tech/rails.md +19 -0
  94. package/dist/content/tech/react-native.md +22 -0
  95. package/dist/content/tech/reactjs.md +22 -0
  96. package/dist/content/tech/redis.md +18 -0
  97. package/dist/content/tech/redux.md +19 -0
  98. package/dist/content/tech/rxjs.md +18 -0
  99. package/dist/content/tech/serverless.md +18 -0
  100. package/dist/content/tech/shadcn.md +19 -0
  101. package/dist/content/tech/solidity.md +23 -0
  102. package/dist/content/tech/stitches.md +19 -0
  103. package/dist/content/tech/stripe.md +18 -0
  104. package/dist/content/tech/substrate.md +18 -0
  105. package/dist/content/tech/supabase.md +20 -0
  106. package/dist/content/tech/tailwind.md +19 -0
  107. package/dist/content/tech/tanstack-form.md +19 -0
  108. package/dist/content/tech/tanstack-query.md +19 -0
  109. package/dist/content/tech/tanstack-start.md +19 -0
  110. package/dist/content/tech/terraform.md +19 -0
  111. package/dist/content/tech/thirdweb.md +22 -0
  112. package/dist/content/tech/trigger.md +19 -0
  113. package/dist/content/tech/twilio.md +18 -0
  114. package/dist/content/tech/typescript.md +22 -0
  115. package/dist/content/tech/viem.md +23 -0
  116. package/dist/content/tech/viroar.md +19 -0
  117. package/dist/content/tech/wagmi.md +23 -0
  118. package/dist/content/tech/webauthn.md +19 -0
  119. package/dist/content/tech/webgl.md +18 -0
  120. package/dist/content/tech/wordpress.md +19 -0
  121. package/dist/content/tech/zod.md +19 -0
  122. package/dist/content/tech/zustand.md +19 -0
  123. package/dist/index.d.mts +8 -2
  124. package/dist/index.d.ts +8 -2
  125. package/dist/index.js +3279 -1741
  126. package/dist/index.mjs +4067 -4
  127. package/dist/projects.json +1621 -0
  128. package/dist/tags.json +89 -0
  129. package/dist/tech.json +1132 -0
  130. package/package.json +23 -4
  131. package/dist/chunk-2M5YMKJU.mjs +0 -2536
  132. package/dist/chunk-3XJB6JQB.mjs +0 -2475
  133. package/dist/chunk-7BGBLAS7.mjs +0 -2475
  134. package/dist/chunk-EW5XIF7Q.mjs +0 -2474
  135. package/dist/chunk-F5O2AC7V.mjs +0 -2450
  136. package/dist/chunk-FTX6UF5M.mjs +0 -2511
  137. package/dist/chunk-FX52Y6GF.mjs +0 -2474
  138. package/dist/chunk-GQEE5WN4.mjs +0 -2450
  139. package/dist/chunk-LF6T72UC.mjs +0 -2466
  140. package/dist/chunk-LPLZ3JRN.mjs +0 -2475
  141. package/dist/chunk-ME4GIHM6.mjs +0 -2474
  142. package/dist/chunk-QMWCTZHU.mjs +0 -2450
  143. package/dist/chunk-WOFK3FJJ.mjs +0 -2502
  144. package/dist/chunk-Y4OM6UBU.mjs +0 -2461
package/dist/cli.js CHANGED
@@ -25,6 +25,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
 
26
26
  // src/cli.ts
27
27
  var import_chalk = __toESM(require("chalk"));
28
+ var import_prompts = __toESM(require("prompts"));
28
29
 
29
30
  // src/projects.ts
30
31
  var projects = [
@@ -82,7 +83,8 @@ var projects = [
82
83
  "Zod",
83
84
  "nuqs",
84
85
  "EVM",
85
- "Ethereum"
86
+ "Ethereum",
87
+ "Alchemy"
86
88
  ],
87
89
  type: ["web3", "contract", "featured", "frontend", "backend"],
88
90
  link: "https://opyn.co",
@@ -166,8 +168,7 @@ var projects = [
166
168
  "Zod",
167
169
  "nuqs",
168
170
  "OpenAI",
169
- "AI SDK",
170
- "PostgreSQL"
171
+ "AI SDK"
171
172
  ],
172
173
  type: [
173
174
  "web3",
@@ -221,8 +222,7 @@ var projects = [
221
222
  "Tailwind",
222
223
  "TanStack Query",
223
224
  "Zod",
224
- "nuqs",
225
- "PostgreSQL"
225
+ "nuqs"
226
226
  ],
227
227
  type: ["ai", "oss", "featured", "frontend", "backend", "fullstack"],
228
228
  link: "https://masterbots.ai",
@@ -765,7 +765,7 @@ var projects = [
765
765
  link: "http://tikr.com",
766
766
  image: "https://gaboesquivel.com/images/work/tikr.jpg",
767
767
  type: ["contract", "featured", "frontend"],
768
- tech: ["Ruby on Rails", "Spree", "Heroku", "Postgres", "jQuery", "SASS"],
768
+ tech: ["Ruby on Rails", "Spree", "Heroku", "PostgreSQL", "jQuery", "SASS"],
769
769
  achievements: [
770
770
  "Developed a dynamic pricing engine using Spree and Ruby on Rails.",
771
771
  "Implemented a real-time price fluctuation system for enhanced user engagement.",
@@ -1525,7 +1525,7 @@ var techStack = [
1525
1525
  {
1526
1526
  name: "PostgreSQL",
1527
1527
  slug: "postgresql",
1528
- tag: "Postgres",
1528
+ tag: "PostgreSQL",
1529
1529
  image: "/images/tech/postgresql.png",
1530
1530
  description: "A powerful, open-source object-relational database system with a strong reputation for reliability, feature robustness, and performance.",
1531
1531
  link: "https://www.postgresql.org/",
@@ -2559,113 +2559,472 @@ var techStack = [
2559
2559
  ];
2560
2560
 
2561
2561
  // src/cli.ts
2562
+ var COLORS = {
2563
+ title: import_chalk.default.bold.cyan,
2564
+ subtitle: import_chalk.default.bold.yellow,
2565
+ highlight: import_chalk.default.bold.green,
2566
+ info: import_chalk.default.blue,
2567
+ link: import_chalk.default.underline.blue,
2568
+ dim: import_chalk.default.dim,
2569
+ success: import_chalk.default.green,
2570
+ warning: import_chalk.default.yellow,
2571
+ error: import_chalk.default.red
2572
+ };
2562
2573
  function displayBanner() {
2563
2574
  console.log(
2564
- import_chalk.default.cyan(`
2565
- \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
2566
- \u2502 \u2502
2567
- \u2502 ${import_chalk.default.bold.yellow("Gabo Esquivel - Software Engineer")} \u2502
2568
- \u2502 \u2502
2569
- \u2502 ${import_chalk.default.green("Full-stack software engineer with over 15 years of experience")} \u2502
2570
- \u2502 ${import_chalk.default.green("Specializing in web3 technologies since 2017")} \u2502
2571
- \u2502 ${import_chalk.default.green("Background includes work on numerous blockchain projects")} \u2502
2572
- \u2502 ${import_chalk.default.green("A decade with NodeJS and cloud platforms")} \u2502
2573
- \u2502 ${import_chalk.default.green("Advanced expertise in React, React Native, and TypeScript")} \u2502
2574
- \u2502 ${import_chalk.default.green("Currently exploring AI")} \u2502
2575
- \u2502 \u2502
2576
- \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
2577
- `)
2575
+ COLORS.title(`
2576
+ \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
2577
+ \u2551 \u2551
2578
+ \u2551 ${import_chalk.default.bold.yellow("Gabo Esquivel")} - ${import_chalk.default.bold.cyan("Software Engineer")} \u2551
2579
+ \u2551 \u2551
2580
+ \u2551 ${COLORS.success("Full-stack engineer")} with ${COLORS.highlight("15+ years")} of experience \u2551
2581
+ \u2551 ${COLORS.success("Web3 specialist")} since ${COLORS.highlight("2017")} \u2551
2582
+ \u2551 ${COLORS.success("Node.js expert")} with ${COLORS.highlight("10+ years")} \u2551
2583
+ \u2551 ${COLORS.success("React & TypeScript")} advanced expertise \u2551
2584
+ \u2551 ${COLORS.success("Currently exploring AI")} \u2551
2585
+ \u2551 \u2551
2586
+ \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
2587
+ `)
2578
2588
  );
2579
2589
  }
2580
- function displayInfo() {
2590
+ function displayLinks() {
2591
+ console.log(`
2592
+ ${COLORS.subtitle("\u{1F517} Links:")}`);
2581
2593
  console.log(
2582
- `${import_chalk.default.bold.blue("Website: ")}${import_chalk.default.underline("https://gaboesquivel.com")}`
2594
+ ` ${COLORS.info("Website:")} ${COLORS.link("https://gaboesquivel.com")}`
2583
2595
  );
2584
2596
  console.log(
2585
- `${import_chalk.default.bold.blue("GitHub: ")}${import_chalk.default.underline("https://github.com/gaboesquivel")}`
2597
+ ` ${COLORS.info("GitHub:")} ${COLORS.link("https://github.com/gaboesquivel")}`
2586
2598
  );
2587
2599
  console.log(
2588
- `${import_chalk.default.bold.blue("Twitter: ")}${import_chalk.default.underline("https://twitter.com/gaboesquivel")}`
2600
+ ` ${COLORS.info("Twitter:")} ${COLORS.link("https://twitter.com/gaboesquivel")}`
2589
2601
  );
2590
2602
  console.log(
2591
- `${import_chalk.default.bold.blue("Calendar: ")}${import_chalk.default.underline("https://cal.com/gaboesquivel")}`
2603
+ ` ${COLORS.info("Calendar:")} ${COLORS.link("https://cal.com/gaboesquivel")}`
2592
2604
  );
2593
- console.log(import_chalk.default.bold("\nAvailable commands:"));
2605
+ }
2606
+ function formatProjectCard(project, index) {
2607
+ const prefix = index !== void 0 ? `${COLORS.dim(`${index + 1}.`)} ` : "";
2608
+ const types = project.type?.length ? ` ${COLORS.dim("[")}${project.type.slice(0, 3).map((t) => COLORS.warning(t)).join(COLORS.dim(", "))}${COLORS.dim("]")}` : "";
2609
+ return `${prefix}${COLORS.title(project.title)}${types}`;
2610
+ }
2611
+ function displayProjectSummary(project) {
2594
2612
  console.log(
2595
- `${import_chalk.default.magenta(" npx gaboesquivel --projects ")}List projects with descriptions and links`
2613
+ `
2614
+ ${COLORS.title("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")}`
2596
2615
  );
2616
+ console.log(`
2617
+ ${COLORS.title("\u{1F4E6}")} ${COLORS.title(project.title)}`);
2618
+ console.log(`
2619
+ ${COLORS.subtitle("Description:")}`);
2620
+ console.log(` ${project.description}`);
2621
+ if (project.tech && project.tech.length > 0) {
2622
+ console.log(`
2623
+ ${COLORS.subtitle("Tech Stack:")}`);
2624
+ const techDisplay = project.tech.slice(0, 8).map((t) => COLORS.highlight(t)).join(COLORS.dim(", "));
2625
+ const moreTech = project.tech.length > 8 ? COLORS.dim(` +${project.tech.length - 8} more`) : "";
2626
+ console.log(` ${techDisplay}${moreTech}`);
2627
+ }
2628
+ if (project.type && project.type.length > 0) {
2629
+ console.log(`
2630
+ ${COLORS.subtitle("Type:")}`);
2631
+ console.log(
2632
+ ` ${project.type.map((t) => COLORS.warning(`\u2022 ${t}`)).join(" ")}`
2633
+ );
2634
+ }
2635
+ if (project.achievements && project.achievements.length > 0) {
2636
+ console.log(`
2637
+ ${COLORS.subtitle("Key Achievements:")}`);
2638
+ for (const achievement of project.achievements.slice(0, 3)) {
2639
+ console.log(` ${COLORS.success("\u2713")} ${achievement}`);
2640
+ }
2641
+ if (project.achievements.length > 3) {
2642
+ console.log(
2643
+ ` ${COLORS.dim(`... and ${project.achievements.length - 3} more`)}`
2644
+ );
2645
+ }
2646
+ }
2647
+ if (project.story && project.story.length > 0) {
2648
+ console.log(`
2649
+ ${COLORS.subtitle("Story:")}`);
2650
+ for (const paragraph of project.story) {
2651
+ console.log(` ${paragraph}
2652
+ `);
2653
+ }
2654
+ }
2655
+ const portfolioLink = `https://gaboesquivel.com/project/${project.slug}`;
2656
+ console.log(`
2657
+ ${COLORS.subtitle("Portfolio Link:")}`);
2658
+ console.log(` ${COLORS.link(portfolioLink)}`);
2659
+ if (project.link) {
2660
+ console.log(`
2661
+ ${COLORS.subtitle("Project Link:")}`);
2662
+ console.log(` ${COLORS.link(project.link)}`);
2663
+ }
2664
+ if (project.repo) {
2665
+ console.log(`
2666
+ ${COLORS.subtitle("Repository:")}`);
2667
+ console.log(` ${COLORS.link(project.repo)}`);
2668
+ }
2597
2669
  console.log(
2598
- `${import_chalk.default.magenta(" npx gaboesquivel --tech ")}List technologies with descriptions and links`
2670
+ `
2671
+ ${COLORS.title("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")}`
2599
2672
  );
2600
2673
  }
2601
- function displayProjectList() {
2602
- console.log(import_chalk.default.bold.yellow("\nProjects:\n"));
2603
- if (!projects || !Array.isArray(projects)) {
2604
- console.log(import_chalk.default.red("No projects found"));
2605
- return;
2674
+ function displayProjectList(projectList = projects) {
2675
+ console.log(`
2676
+ ${COLORS.subtitle(`\u{1F4CB} Projects (${projectList.length}):`)}
2677
+ `);
2678
+ for (let index = 0; index < projectList.length; index++) {
2679
+ const project = projectList[index];
2680
+ console.log(formatProjectCard(project, index));
2681
+ const desc = project.description.length > 80 ? `${project.description.substring(0, 80)}...` : project.description;
2682
+ console.log(` ${COLORS.dim(desc)}
2683
+ `);
2606
2684
  }
2607
- for (const [index, project] of projects.entries()) {
2608
- console.log(`${import_chalk.default.bold.yellow(` ${project.title} `)}`);
2609
- const description = project.description.length > 100 ? `${project.description.substring(0, 100)}...` : project.description;
2610
- console.log(import_chalk.default.white(` ${description}`));
2611
- if (project.tech && project.tech.length > 0) {
2612
- console.log(
2613
- ` ${import_chalk.default.bold.blue("Tech:")} ${import_chalk.default.green(
2614
- project.tech.slice(0, 5).join(", ")
2615
- )}${project.tech.length > 5 ? import_chalk.default.dim(", ...") : ""}`
2616
- );
2685
+ }
2686
+ function displayTechSummary(techItem) {
2687
+ console.log(
2688
+ `
2689
+ ${COLORS.title("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")}`
2690
+ );
2691
+ console.log(
2692
+ `
2693
+ ${COLORS.title("\u26A1")} ${COLORS.title(techItem.name)} ${COLORS.warning(`(since ${techItem.since})`)}`
2694
+ );
2695
+ console.log(`
2696
+ ${COLORS.subtitle("Description:")}`);
2697
+ console.log(` ${techItem.description}`);
2698
+ if (techItem.experience && techItem.experience.length > 0) {
2699
+ console.log(`
2700
+ ${COLORS.subtitle("Experience Highlights:")}`);
2701
+ for (const exp of techItem.experience.slice(0, 3)) {
2702
+ console.log(` ${COLORS.success("\u2022")} ${exp}`);
2617
2703
  }
2618
- if (project.type && project.type.length > 0) {
2704
+ if (techItem.experience.length > 3) {
2619
2705
  console.log(
2620
- ` ${import_chalk.default.bold.blue("Type:")} ${import_chalk.default.cyan(project.type.join(", "))}`
2706
+ ` ${COLORS.dim(`... and ${techItem.experience.length - 3} more`)}`
2621
2707
  );
2622
2708
  }
2709
+ }
2710
+ const portfolioLink = `https://gaboesquivel.com/tech/${techItem.slug}`;
2711
+ console.log(`
2712
+ ${COLORS.subtitle("Portfolio Link:")}`);
2713
+ console.log(` ${COLORS.link(portfolioLink)}`);
2714
+ if (techItem.link) {
2715
+ console.log(`
2716
+ ${COLORS.subtitle("Official Link:")}`);
2717
+ console.log(` ${COLORS.link(techItem.link)}`);
2718
+ }
2719
+ console.log(
2720
+ `
2721
+ ${COLORS.title("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")}`
2722
+ );
2723
+ }
2724
+ function displayTechList(techList = techStack) {
2725
+ console.log(`
2726
+ ${COLORS.subtitle(`\u{1F6E0}\uFE0F Technologies (${techList.length}):`)}
2727
+ `);
2728
+ for (const item of techList) {
2623
2729
  console.log(
2624
- ` ${import_chalk.default.bold.blue("Link:")} ${import_chalk.default.underline.blue(`https://gaboesquivel.com/project/${project.slug}`)}`
2730
+ ` ${COLORS.highlight(item.name)} ${COLORS.dim(`(since ${item.since})`)}`
2625
2731
  );
2626
- console.log("");
2732
+ const desc = item.description.length > 70 ? `${item.description.substring(0, 70)}...` : item.description;
2733
+ console.log(` ${COLORS.dim(desc)}
2734
+ `);
2627
2735
  }
2628
2736
  }
2629
- function displayTechList() {
2630
- console.log(import_chalk.default.bold.yellow("\nTechnologies:\n"));
2631
- if (!techStack || !Array.isArray(techStack)) {
2632
- console.log(import_chalk.default.red("No technologies found"));
2633
- return;
2737
+ async function browseProjects() {
2738
+ const projectList = projects;
2739
+ while (true) {
2740
+ const { action } = await (0, import_prompts.default)({
2741
+ type: "select",
2742
+ name: "action",
2743
+ message: COLORS.subtitle("What would you like to do?"),
2744
+ choices: [
2745
+ { title: "\u{1F4CB} View all projects", value: "list" },
2746
+ { title: "\u{1F50D} Search projects", value: "search" },
2747
+ { title: "\u{1F3F7}\uFE0F Filter by type", value: "filter" },
2748
+ { title: "\u{1F519} Back to main menu", value: "back" }
2749
+ ]
2750
+ });
2751
+ if (!action || action === "back") break;
2752
+ if (action === "list") {
2753
+ displayProjectList(projectList);
2754
+ const { selected } = await (0, import_prompts.default)({
2755
+ type: "select",
2756
+ name: "selected",
2757
+ message: COLORS.subtitle("Select a project to view details:"),
2758
+ choices: [
2759
+ ...projectList.map((p, i) => ({
2760
+ title: formatProjectCard(p, i),
2761
+ value: i
2762
+ })),
2763
+ { title: COLORS.dim("\u2190 Back"), value: -1 }
2764
+ ]
2765
+ });
2766
+ if (selected !== void 0 && selected >= 0) {
2767
+ displayProjectSummary(projectList[selected]);
2768
+ await (0, import_prompts.default)({
2769
+ type: "confirm",
2770
+ name: "continue",
2771
+ message: COLORS.info("Press Enter to continue..."),
2772
+ initial: true
2773
+ });
2774
+ }
2775
+ }
2776
+ if (action === "search") {
2777
+ const { query } = await (0, import_prompts.default)({
2778
+ type: "text",
2779
+ name: "query",
2780
+ message: COLORS.subtitle(
2781
+ "Search projects (by name, tech, or description):"
2782
+ )
2783
+ });
2784
+ if (query) {
2785
+ const searchLower = query.toLowerCase();
2786
+ const filtered = projectList.filter(
2787
+ (p) => p.title.toLowerCase().includes(searchLower) || p.description.toLowerCase().includes(searchLower) || p.tech?.some((t) => t.toLowerCase().includes(searchLower)) || p.type?.some((t) => t.toLowerCase().includes(searchLower))
2788
+ );
2789
+ if (filtered.length === 0) {
2790
+ console.log(
2791
+ `
2792
+ ${COLORS.error("No projects found matching your search.")}
2793
+ `
2794
+ );
2795
+ } else {
2796
+ displayProjectList(filtered);
2797
+ const { selected } = await (0, import_prompts.default)({
2798
+ type: "select",
2799
+ name: "selected",
2800
+ message: COLORS.subtitle("Select a project to view details:"),
2801
+ choices: [
2802
+ ...filtered.map((p, i) => ({
2803
+ title: formatProjectCard(p, i),
2804
+ value: i
2805
+ })),
2806
+ { title: COLORS.dim("\u2190 Back"), value: -1 }
2807
+ ]
2808
+ });
2809
+ if (selected !== void 0 && selected >= 0) {
2810
+ displayProjectSummary(filtered[selected]);
2811
+ await (0, import_prompts.default)({
2812
+ type: "confirm",
2813
+ name: "continue",
2814
+ message: COLORS.info("Press Enter to continue..."),
2815
+ initial: true
2816
+ });
2817
+ }
2818
+ }
2819
+ }
2820
+ }
2821
+ if (action === "filter") {
2822
+ const allTypes = /* @__PURE__ */ new Set();
2823
+ for (const p of projectList) {
2824
+ if (p.type) {
2825
+ for (const t of p.type) {
2826
+ allTypes.add(t);
2827
+ }
2828
+ }
2829
+ }
2830
+ const typeArray = Array.from(allTypes).sort();
2831
+ const { selectedType } = await (0, import_prompts.default)({
2832
+ type: "select",
2833
+ name: "selectedType",
2834
+ message: COLORS.subtitle("Filter by project type:"),
2835
+ choices: [
2836
+ ...typeArray.map((t) => ({ title: COLORS.warning(t), value: t })),
2837
+ { title: COLORS.dim("\u2190 Back"), value: "back" }
2838
+ ]
2839
+ });
2840
+ if (selectedType && selectedType !== "back") {
2841
+ const filtered = projectList.filter(
2842
+ (p) => p.type?.includes(selectedType)
2843
+ );
2844
+ displayProjectList(filtered);
2845
+ const { selected } = await (0, import_prompts.default)({
2846
+ type: "select",
2847
+ name: "selected",
2848
+ message: COLORS.subtitle("Select a project to view details:"),
2849
+ choices: [
2850
+ ...filtered.map((p, i) => ({
2851
+ title: formatProjectCard(p, i),
2852
+ value: i
2853
+ })),
2854
+ { title: COLORS.dim("\u2190 Back"), value: -1 }
2855
+ ]
2856
+ });
2857
+ if (selected !== void 0 && selected >= 0) {
2858
+ displayProjectSummary(filtered[selected]);
2859
+ await (0, import_prompts.default)({
2860
+ type: "confirm",
2861
+ name: "continue",
2862
+ message: COLORS.info("Press Enter to continue..."),
2863
+ initial: true
2864
+ });
2865
+ }
2866
+ }
2867
+ }
2634
2868
  }
2635
- for (const item of techStack) {
2636
- console.log(
2637
- ` ${import_chalk.default.bold.green(item.name)} ${import_chalk.default.yellow(`(since ${item.since})`)}`
2638
- );
2639
- const description = item.description.length > 80 ? `${item.description.substring(0, 80)}...` : item.description;
2640
- console.log(` ${import_chalk.default.white(description)}`);
2641
- if (item.experience && item.experience.length > 0) {
2642
- console.log(
2643
- ` ${import_chalk.default.bold.blue("Experience:")} ${import_chalk.default.italic.white(item.experience[0])}`
2644
- );
2869
+ }
2870
+ async function browseTech() {
2871
+ const techList = techStack;
2872
+ while (true) {
2873
+ const { action } = await (0, import_prompts.default)({
2874
+ type: "select",
2875
+ name: "action",
2876
+ message: COLORS.subtitle("What would you like to do?"),
2877
+ choices: [
2878
+ { title: "\u{1F4CB} View all technologies", value: "list" },
2879
+ { title: "\u{1F50D} Search technologies", value: "search" },
2880
+ { title: "\u{1F519} Back to main menu", value: "back" }
2881
+ ]
2882
+ });
2883
+ if (!action || action === "back") break;
2884
+ if (action === "list") {
2885
+ displayTechList(techList);
2886
+ const { selected } = await (0, import_prompts.default)({
2887
+ type: "select",
2888
+ name: "selected",
2889
+ message: COLORS.subtitle("Select a technology to view details:"),
2890
+ choices: [
2891
+ ...techList.map((t, i) => ({
2892
+ title: `${COLORS.highlight(t.name)} ${COLORS.dim(`(since ${t.since})`)}`,
2893
+ value: i
2894
+ })),
2895
+ { title: COLORS.dim("\u2190 Back"), value: -1 }
2896
+ ]
2897
+ });
2898
+ if (selected !== void 0 && selected >= 0) {
2899
+ displayTechSummary(techList[selected]);
2900
+ await (0, import_prompts.default)({
2901
+ type: "confirm",
2902
+ name: "continue",
2903
+ message: COLORS.info("Press Enter to continue..."),
2904
+ initial: true
2905
+ });
2906
+ }
2645
2907
  }
2646
- console.log(
2647
- ` ${import_chalk.default.bold.blue("Portfolio Link:")} ${import_chalk.default.underline.blue(`https://gaboesquivel.com/tech/${item.slug}`)}
2908
+ if (action === "search") {
2909
+ const { query } = await (0, import_prompts.default)({
2910
+ type: "text",
2911
+ name: "query",
2912
+ message: COLORS.subtitle(
2913
+ "Search technologies (by name or description):"
2914
+ )
2915
+ });
2916
+ if (query) {
2917
+ const searchLower = query.toLowerCase();
2918
+ const filtered = techList.filter(
2919
+ (t) => t.name.toLowerCase().includes(searchLower) || t.description.toLowerCase().includes(searchLower) || t.experience?.some((e) => e.toLowerCase().includes(searchLower))
2920
+ );
2921
+ if (filtered.length === 0) {
2922
+ console.log(
2923
+ `
2924
+ ${COLORS.error("No technologies found matching your search.")}
2648
2925
  `
2649
- );
2926
+ );
2927
+ } else {
2928
+ displayTechList(filtered);
2929
+ const { selected } = await (0, import_prompts.default)({
2930
+ type: "select",
2931
+ name: "selected",
2932
+ message: COLORS.subtitle("Select a technology to view details:"),
2933
+ choices: [
2934
+ ...filtered.map((t, i) => ({
2935
+ title: `${COLORS.highlight(t.name)} ${COLORS.dim(`(since ${t.since})`)}`,
2936
+ value: i
2937
+ })),
2938
+ { title: COLORS.dim("\u2190 Back"), value: -1 }
2939
+ ]
2940
+ });
2941
+ if (selected !== void 0 && selected >= 0) {
2942
+ displayTechSummary(filtered[selected]);
2943
+ await (0, import_prompts.default)({
2944
+ type: "confirm",
2945
+ name: "continue",
2946
+ message: COLORS.info("Press Enter to continue..."),
2947
+ initial: true
2948
+ });
2949
+ }
2950
+ }
2951
+ }
2952
+ }
2650
2953
  }
2651
2954
  }
2652
- function handleArgs() {
2955
+ async function mainMenu() {
2956
+ while (true) {
2957
+ const { choice } = await (0, import_prompts.default)({
2958
+ type: "select",
2959
+ name: "choice",
2960
+ message: COLORS.subtitle("What would you like to explore?"),
2961
+ choices: [
2962
+ { title: "\u{1F4E6} Browse Projects", value: "projects" },
2963
+ { title: "\u{1F6E0}\uFE0F Browse Technologies", value: "tech" },
2964
+ { title: "\u{1F44B} Exit", value: "exit" }
2965
+ ]
2966
+ });
2967
+ if (!choice || choice === "exit") {
2968
+ console.log(`
2969
+ ${COLORS.success("Thanks for exploring! \u{1F44B}\n")}`);
2970
+ break;
2971
+ }
2972
+ if (choice === "projects") {
2973
+ await browseProjects();
2974
+ }
2975
+ if (choice === "tech") {
2976
+ await browseTech();
2977
+ }
2978
+ }
2979
+ }
2980
+ async function handleArgs() {
2653
2981
  const args = process.argv.slice(2);
2654
2982
  if (args.length === 0) {
2655
2983
  displayBanner();
2656
- displayInfo();
2984
+ displayLinks();
2985
+ await mainMenu();
2657
2986
  return;
2658
2987
  }
2659
2988
  const command = args[0];
2660
2989
  switch (command) {
2661
2990
  case "--projects":
2662
- displayProjectList();
2991
+ case "-p":
2992
+ displayBanner();
2993
+ await browseProjects();
2663
2994
  break;
2664
2995
  case "--tech":
2665
- displayTechList();
2996
+ case "-t":
2997
+ displayBanner();
2998
+ await browseTech();
2999
+ break;
3000
+ case "--help":
3001
+ case "-h":
3002
+ displayBanner();
3003
+ console.log(`
3004
+ ${COLORS.subtitle("Available Commands:")}
3005
+ `);
3006
+ console.log(
3007
+ ` ${COLORS.info("npx gaboesquivel")} Interactive menu`
3008
+ );
3009
+ console.log(
3010
+ ` ${COLORS.info("npx gaboesquivel --projects")} Browse projects`
3011
+ );
3012
+ console.log(
3013
+ ` ${COLORS.info("npx gaboesquivel --tech")} Browse technologies`
3014
+ );
3015
+ console.log(
3016
+ ` ${COLORS.info("npx gaboesquivel --help")} Show this help
3017
+ `
3018
+ );
2666
3019
  break;
2667
3020
  default:
2668
- console.log(import_chalk.default.red(`Unknown command: ${command}`));
3021
+ console.log(`${COLORS.error(`Unknown command: ${command}`)}`);
3022
+ console.log(
3023
+ `Run ${COLORS.info("npx gaboesquivel --help")} for available commands.`
3024
+ );
2669
3025
  }
2670
3026
  }
2671
- handleArgs();
3027
+ handleArgs().catch((error) => {
3028
+ console.error(COLORS.error("An error occurred:"), error);
3029
+ process.exit(1);
3030
+ });