@jaimanm/resumake 1.0.0 → 1.0.1

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 (57) hide show
  1. package/.github/workflows/npm-publish.yml +0 -3
  2. package/CONTRIBUTING.md +14 -1
  3. package/package.json +1 -1
  4. package/src/commands/setup.js +6 -4
  5. package/templates/awesome-cv/.github/workflows/build-resume.yml +65 -0
  6. package/templates/awesome-cv/README.md +1 -0
  7. package/templates/awesome-cv/awesome-cv.cls +885 -0
  8. package/templates/awesome-cv/build_all.sh +12 -0
  9. package/templates/awesome-cv/cv/certificates.tex +111 -0
  10. package/templates/awesome-cv/cv/committees.tex +48 -0
  11. package/templates/awesome-cv/cv/education.tex +25 -0
  12. package/templates/awesome-cv/cv/experience.tex +186 -0
  13. package/templates/awesome-cv/cv/extracurricular.tex +81 -0
  14. package/templates/awesome-cv/cv/honors.tex +181 -0
  15. package/templates/awesome-cv/cv/presentation.tex +50 -0
  16. package/templates/awesome-cv/cv/skills.tex +38 -0
  17. package/templates/awesome-cv/cv/writing.tex +37 -0
  18. package/templates/awesome-cv/cv.tex +114 -0
  19. package/templates/jakes-cv/.github/workflows/build-resume.yml +65 -0
  20. package/templates/jakes-cv/README.md +29 -0
  21. package/templates/jakes-cv/build_all.sh +22 -0
  22. package/templates/jakes-cv/cv-sections/certificates.tex +8 -0
  23. package/templates/jakes-cv/cv-sections/committees.tex +19 -0
  24. package/templates/jakes-cv/cv-sections/education.tex +10 -0
  25. package/templates/jakes-cv/cv-sections/experience.tex +22 -0
  26. package/templates/jakes-cv/cv-sections/extracurricular.tex +20 -0
  27. package/templates/jakes-cv/cv-sections/honors.tex +10 -0
  28. package/templates/jakes-cv/cv-sections/presentation.tex +19 -0
  29. package/templates/jakes-cv/cv-sections/projects.tex +15 -0
  30. package/templates/jakes-cv/cv-sections/skills.tex +10 -0
  31. package/templates/jakes-cv/cv-sections/writing.tex +19 -0
  32. package/templates/jakes-cv/cv.tex +174 -0
  33. package/templates/jakes-cv/fonts/Roboto-Bold.ttf +0 -0
  34. package/templates/jakes-cv/fonts/Roboto-BoldItalic.ttf +0 -0
  35. package/templates/jakes-cv/fonts/Roboto-Italic.ttf +0 -0
  36. package/templates/jakes-cv/fonts/Roboto-Light.ttf +0 -0
  37. package/templates/jakes-cv/fonts/Roboto-LightItalic.ttf +0 -0
  38. package/templates/jakes-cv/fonts/Roboto-Medium.ttf +0 -0
  39. package/templates/jakes-cv/fonts/Roboto-MediumItalic.ttf +0 -0
  40. package/templates/jakes-cv/fonts/Roboto-Regular.ttf +0 -0
  41. package/templates/jakes-cv/fonts/Roboto-Thin.ttf +0 -0
  42. package/templates/jakes-cv/fonts/Roboto-ThinItalic.ttf +0 -0
  43. package/templates/jakes-resume/.github/workflows/build-resume.yml +65 -0
  44. package/templates/jakes-resume/README.md +1 -0
  45. package/templates/jakes-resume/build_all.sh +7 -0
  46. package/templates/jakes-resume/resume.tex +218 -0
  47. package/templates/modular-multi/.github/workflows/build-resume.yml +65 -0
  48. package/templates/modular-multi/README.md +1 -0
  49. package/templates/modular-multi/build_all.sh +23 -0
  50. package/templates/modular-multi/resume_aiml.tex +5 -0
  51. package/templates/modular-multi/resume_backend.tex +5 -0
  52. package/templates/modular-multi/resume_content.tex +136 -0
  53. package/templates/modular-multi/resume_preamble.tex +87 -0
  54. package/templates/modular-multi/resume_quantum.tex +5 -0
  55. package/templates/modular-multi/test.txt +80 -0
  56. package/tests/index.test.js +22 -90
  57. package/tests/setup.test.js +8 -4
@@ -0,0 +1,136 @@
1
+ \begin{center}
2
+ \textbf{\Huge \scshape Jaiman Munshi} \\ \vspace{1pt}
3
+ \small \href{mailto:jaimanmunshi@gmail.com}{\underline{jaimanmunshi@gmail.com}} $|$
4
+ \href{https://linkedin.com/in/jaimanmunshi}{\underline{linkedin.com/in/jaimanmunshi}} $|$
5
+ \href{https://jaimanm.github.io}{\underline{jaimanm.github.io}}
6
+ \end{center}
7
+
8
+ %-----------EDUCATION-----------
9
+ \section{Education}
10
+ \resumeSubHeadingListStart
11
+ \resumeSubheading
12
+ {University of Maryland}{College Park, MD}
13
+ {B.S. in Computer Science - Machine Learning $|$ GPA: 3.94}{Graduation: May 2027}
14
+ \resumeItemListStart
15
+ \resumeItem{\textbf{Minors}: Quantum Science \& Engineering, Statistics}
16
+ \resumeItem{\textbf{Relevant Coursework}: Quantum Computing, Artificial Intelligence, Algorithms, Data Structures, Computer Systems, Data Science}
17
+ \resumeItemListEnd
18
+
19
+ \resumeProjectHeading
20
+ {\textbf{Certifications}}{}
21
+ \resumeItemListStart
22
+ \resumeItem{\textbf{Microsoft Certified: Machine Learning Operations Engineer Associate} $|$ \emph{MLOps, Azure ML, Automated Pipelines}}
23
+ \resumeItem{\textbf{IBM Certified V2.X Qiskit Developer - Associate} $|$ \emph{Qiskit, Sampler/Estimator, Hardware Transpilation}}
24
+ \resumeItemListEnd
25
+ \resumeSubHeadingListEnd
26
+
27
+ %-----------EXPERIENCE-----------
28
+ \section{Experience}
29
+ \resumeSubHeadingListStart
30
+
31
+ \resumeProjectHeading
32
+ {\textbf{Bank of America} $|$ \emph{Software Engineering Intern}}{Jun 2026 -- Aug 2026}
33
+ \resumeItemListStart
34
+ \iftoggle{aiml}{
35
+ \resumeItem{Engineered a custom AI agent integrated with database and spreadsheet tools to automate manual dividend processing, delivering a conversational chat interface to operations and support teams.}
36
+ \resumeItem{Architected the migration of a legacy enterprise fund database application to a modern React and Spring Boot stack, developing REST APIs and integrating Ping OIDC for secure authentication.}
37
+ \resumeItem{Optimized backend SQL to improve response time by 3x, wrote comprehensive unit tests for both frontend and backend, and accelerated feature delivery using custom Github Copilot workflows and MCP servers.}
38
+ }{
39
+ \resumeItem{Architected the migration of a legacy enterprise fund database application to a modern React and Spring Boot stack, developing REST APIs and integrating Ping OIDC for secure authentication.}
40
+ \resumeItem{Optimized backend SQL to improve response time by 3x, wrote comprehensive unit tests for both frontend and backend, and accelerated feature delivery using custom Github Copilot workflows and MCP servers.}
41
+ \resumeItem{Engineered a custom AI agent integrated with database and spreadsheet tools to automate manual dividend processing, delivering a conversational chat interface to operations and support teams.}
42
+ }
43
+ \resumeItemListEnd
44
+
45
+ \resumeProjectHeading
46
+ {\textbf{Axcellion.ai} $|$ \emph{Software Engineer}}{Jan 2026 -- May 2026}
47
+ \resumeItemListStart
48
+ \iftoggle{aiml}{
49
+ \resumeItem{Engineered a RAG intelligence engine mapping over 100k nodes and relationships in a Neo4j knowledge graph, by utilizing AWS Lambda and EventBridge to automate daily data source synchronization and 768-dim vectorization in under 9 seconds of runtime.}
50
+ \resumeItem{Architected a multithreaded ingestion pipeline to process over 108,000 regulatory filings totaling 80+ GB at 9.1 docs/sec with 0 failures, utilizing AWS EC2 to bypass remote server rate-limits.}
51
+ }{
52
+ \resumeItem{Architected a multithreaded ingestion pipeline to process over 108,000 regulatory filings totaling 80+ GB at 9.1 docs/sec with 0 failures, utilizing AWS EC2 to bypass remote server rate-limits and maximize bandwidth during high-speed bulk transfers.}
53
+ \resumeItem{Engineered a RAG intelligence engine mapping over 100k nodes and relationships in a Neo4j knowledge graph, by utilizing AWS Lambda and EventBridge to automate daily data source synchronization.}
54
+ }
55
+ \resumeItemListEnd
56
+
57
+ \resumeProjectHeading
58
+ {\textbf{IonQ} $|$ \emph{Project Lead}}{Aug 2025 -- Present}
59
+ \resumeItemListStart
60
+ \iftoggle{backend}{
61
+ \resumeItem{Managing SLURM-scheduled parallelization on the Zaratan HPC cluster, optimizing data loading routines to reduce epoch training cycles from 72 hours to 10 minutes.}
62
+ \resumeItem{Directing a 12-engineer team to scale distributed computing workflows into a published arXiv paper, establishing standardized code review, Agile workflows, and documentation protocols.}
63
+ }{
64
+ \iftoggle{quantum}{
65
+ \resumeItem{Directing a 12-engineer team to scale a hybrid quantum-classical model into a published arXiv paper, emphasizing variational quantum circuits and algorithmic abstractions over PennyLane.}
66
+ \resumeItem{Managing SLURM-scheduled parallelization on the Zaratan HPC cluster, optimizing data loading routines to reduce epoch training cycles from 72 hours to 10 minutes.}
67
+ }{
68
+ \resumeItem{Directing a 12-engineer team to scale a hybrid quantum-classical model into a published arXiv paper, establishing standardized code review, Agile workflows, and documentation protocols to maintain development velocity.}
69
+ \resumeItem{Managing SLURM-scheduled parallelization on the Zaratan HPC cluster, optimizing data loading routines to reduce epoch training cycles from 72 hours to 10 minutes.}
70
+ }}
71
+ \resumeItemListEnd
72
+
73
+ \resumeProjectHeading
74
+ {\textbf{National Quantum Laboratory} $|$ \emph{Quantum Computing Research Intern}}{Jul 2025 -- Aug 2025}
75
+ \resumeItemListStart
76
+ \iftoggle{aiml}{
77
+ \resumeItem{Achieved \textgreater 99\% accuracy on MNIST using a hybrid machine learning approach matching published benchmarks, leveraging PyTorch to validate the model architecture.}
78
+ \resumeItem{Established the foundational ML architecture for the QFireNet wildfire segmentation model, executing the first GPU-accelerated training cycles to validate model feasibility.}
79
+ }{
80
+ \iftoggle{quantum}{
81
+ \resumeItem{Achieved \textgreater 99\% accuracy on MNIST using a hybrid quantum approach matching published benchmarks, and validated the hand-built model on both IonQ quantum processors and the PennyLane Lightning simulator.}
82
+ \resumeItem{Established the foundational architecture for the QFireNet wildfire segmentation model, executing the first GPU-accelerated training cycles to validate the feasibility of a hybrid quantum approach to wildfire detection.}
83
+ }{
84
+ \resumeItem{Established the foundational architecture for the QFireNet wildfire segmentation model, executing the first GPU-accelerated training cycles to validate the feasibility of a hybrid quantum approach to wildfire detection.}
85
+ \resumeItem{Achieved \textgreater 99\% accuracy on MNIST using a hybrid quantum approach matching published benchmarks, and validated the hand-built model on both IonQ quantum processors and the Pennylane Lightning simulator.}
86
+ }}
87
+ \resumeItemListEnd
88
+
89
+ \resumeProjectHeading
90
+ {\textbf{General Dynamics IT} $|$ \emph{Backend Engineer}}{Feb 2025 -- May 2025}
91
+ \resumeItemListStart
92
+ \resumeItem{Built an agentic RAG pipeline processing a dataset of 500,000 emails between 150 accounts, developing Qdrant embeddings and a Neo4j knowledge graph to enable Ai-powered insights and summaries in under 6 seconds per query.}
93
+ \resumeItem{Developed an end-to-end React and Flask full-stack application to deliver real-time summarization of the Enron corpus, handling large-scale unstructured email data through custom parsing and preprocessing techniques.}
94
+ \resumeItemListEnd
95
+
96
+ \resumeSubHeadingListEnd
97
+
98
+ %-----------PROJECTS-----------
99
+ \section{Projects}
100
+ \resumeSubHeadingListStart
101
+ \resumeProjectHeading
102
+ {\textbf{QFireNet: Quantum-Enhanced Wildfire Segmentation} $|$ \emph{PyTorch, PennyLane, Jupyter}}{Aug 2025 -- Present}
103
+ \resumeItemListStart
104
+ \iftoggle{aiml}{
105
+ \resumeItem{Improved test F1 score by 11\% over 16 experiments, using angle embedding to prevent NaN gradient collapse during the machine learning training loop.}
106
+ \resumeItem{Published a hybrid U-Net model for multispectral satellite wildfire detection, improving feature extraction in the Sen2Fire dataset.}
107
+ }{
108
+ \iftoggle{quantum}{
109
+ \resumeItem{Published a hybrid quantum-classical U-Net model for multispectral satellite wildfire detection, replacing the classical bottleneck with QuFeX and QB-Net variational quantum circuits to improve feature extraction in the Sen2Fire dataset.}
110
+ \resumeItem{Improved test F1 score by 11\% over 16 experiments, using angle embedding to prevent NaN gradient collapse during training.}
111
+ }{
112
+ \resumeItem{Published a hybrid quantum-classical U-Net model for multispectral satellite wildfire detection, replacing the classical bottleneck with QuFeX and QB-Net variational quantum circuits to improve feature extraction in the Sen2Fire dataset.}
113
+ \resumeItem{Improved test F1 score by 11\% over 16 experiments, using angle embedding to prevent NaN gradient collapse during training.}
114
+ }}
115
+ \resumeItemListEnd
116
+ \resumeProjectHeading
117
+ {\textbf{Trace} $|$ \emph{React, Next.js, Flask, Supabase, OpenCV, XGBoost}}{}
118
+ \resumeItemListStart
119
+ \resumeItem{Trained a custom XGBoost classifier on 1,056 samples to achieve 91\% Parkinson's severity classification accuracy across 5 motor skill metrics, integrating into a web patient monitoring platform processing tracing assessments in under 2 seconds.}
120
+ \resumeItemListEnd
121
+ \resumeSubHeadingListEnd
122
+
123
+ %-----------PROGRAMMING SKILLS-----------
124
+ \section{Technical Skills}
125
+ \begin{itemize}[leftmargin=0.15in, label={}]
126
+ \small{\item{
127
+ \iftoggle{aiml}{
128
+ \textbf{ML \& Quantum}{: PyTorch, Tensorflow, Scikit-learn, Pandas, MLflow, Pennylane, Qiskit, OpenCV, NumPy, Matplotlib} \\
129
+ \textbf{Languages}{: Python, Java, C, Typescript, HTML/CSS, OCaml, C\#, Assembly (x86-64), UML, SQL, SAS} \\
130
+ }{
131
+ \textbf{Languages}{: Python, Java, C, Typescript, HTML/CSS, OCaml, C\#, Assembly (x86-64), UML, SQL, SAS} \\
132
+ \textbf{ML \& Quantum}{: PyTorch, Tensorflow, Pennylane, Qiskit, Scikit-learn, Pandas, MLflow, OpenCV, NumPy, Matplotlib} \\
133
+ }
134
+ \textbf{Frameworks \& Tools}{: React, Git, Jupyter, Spring Boot, Next.js, Flask, AWS, Azure, MLOps, Neo4j, HPC, SQL Server, Oracle}
135
+ }}
136
+ \end{itemize}
@@ -0,0 +1,87 @@
1
+ \documentclass[letterpaper,10pt]{article}
2
+
3
+ \usepackage{latexsym}
4
+ \usepackage[empty]{fullpage}
5
+ \usepackage{titlesec}
6
+ \usepackage{marvosym}
7
+ \usepackage[usenames,dvipsnames]{color}
8
+ \usepackage{verbatim}
9
+ \usepackage{enumitem}
10
+ \usepackage[hidelinks]{hyperref}
11
+ \usepackage{fancyhdr}
12
+ \usepackage[english]{babel}
13
+ \usepackage{tabularx}
14
+ \usepackage{etoolbox}
15
+ \input{glyphtounicode}
16
+
17
+ \pagestyle{fancy}
18
+ \fancyhf{} % clear all header and footer fields
19
+ \fancyfoot{}
20
+ \setlength{\footskip}{4pt}
21
+ \renewcommand{\headrulewidth}{0pt}
22
+ \renewcommand{\footrulewidth}{0pt}
23
+
24
+ % Adjust margins
25
+ \addtolength{\oddsidemargin}{-0.5in}
26
+ \addtolength{\evensidemargin}{-0.5in}
27
+ \addtolength{\textwidth}{1in}
28
+ \addtolength{\topmargin}{-.5in}
29
+ \addtolength{\textheight}{1.0in}
30
+
31
+ \urlstyle{same}
32
+
33
+ \raggedbottom
34
+ \raggedright
35
+ \setlength{\tabcolsep}{0in}
36
+
37
+ % Sections formatting
38
+ \titleformat{\section}{
39
+ \vspace{-4pt}\scshape\raggedright\large
40
+ }{}{0em}{}[\color{black}\titlerule \vspace{-5pt}]
41
+
42
+ % Ensure that generate pdf is machine readable/ATS parsable
43
+ \pdfgentounicode=1
44
+
45
+ %-------------------------
46
+ % Custom commands
47
+ \newcommand{\resumeItem}[1]{
48
+ \item\small{
49
+ {#1 \vspace{-2pt}}
50
+ }
51
+ }
52
+
53
+ \newcommand{\resumeSubheading}[4]{
54
+ \vspace{-2pt}\item
55
+ \begin{tabular*}{0.97\textwidth}[t]{l@{\extracolsep{\fill}}r}
56
+ \textbf{#1} & #2 \\
57
+ \textit{\small#3} & \textit{\small #4} \\
58
+ \end{tabular*}\vspace{-7pt}
59
+ }
60
+
61
+ \newcommand{\resumeSubSubheading}[2]{
62
+ \item
63
+ \begin{tabular*}{0.97\textwidth}{l@{\extracolsep{\fill}}r}
64
+ \textit{\small#1} & \textit{\small #2} \\
65
+ \end{tabular*}\vspace{-7pt}
66
+ }
67
+
68
+ \newcommand{\resumeProjectHeading}[2]{
69
+ \vspace{-2pt}\item
70
+ \begin{tabular*}{0.97\textwidth}[t]{l@{\extracolsep{\fill}}r}
71
+ \small#1 & #2 \\
72
+ \end{tabular*}\vspace{-7pt}
73
+ }
74
+
75
+ \newcommand{\resumeSubItem}[1]{\resumeItem{#1}\vspace{-4pt}}
76
+
77
+ \renewcommand\labelitemii{$\vcenter{\hbox{\tiny$\bullet$}}$}
78
+
79
+ \newcommand{\resumeSubHeadingListStart}{\begin{itemize}[leftmargin=0.15in, label={}]}
80
+ \newcommand{\resumeSubHeadingListEnd}{\end{itemize}}
81
+ \newcommand{\resumeItemListStart}{\begin{itemize}}
82
+ \newcommand{\resumeItemListEnd}{\end{itemize}\vspace{-5pt}}
83
+
84
+ % Toggles for tailoring
85
+ \newtoggle{backend}
86
+ \newtoggle{aiml}
87
+ \newtoggle{quantum}
@@ -0,0 +1,5 @@
1
+ \input{resume_preamble.tex}
2
+ \toggletrue{quantum}
3
+ \begin{document}
4
+ \input{resume_content.tex}
5
+ \end{document}
@@ -0,0 +1,80 @@
1
+ Jaiman Munshi
2
+ jaimanmunshi@gmail.com | linkedin.com/in/jaimanmunshi | jaimanm.github.io
3
+
4
+ Education
5
+ University of Maryland College Park, MD
6
+ B.S. in Computer Science - Machine Learning | GPA: 3.94 Graduation: May 2027
7
+ • Minors: Quantum Science & Engineering, Statistics
8
+
9
+ • Relevant Coursework: Quantum Computing, Artificial Intelligence, Algorithms, Data Structures, Computer Systems,
10
+
11
+ Data Science
12
+ IBM Certified V2.X Qiskit Developer - Associate
13
+ • Proficient in Qiskit patterns, Sampler/Estimator primitives, error correction & mitigation techniques, and optimized
14
+
15
+ hardware transpilation
16
+
17
+ Experience
18
+ Bank of America
19
+ Software Engineering Intern Jun 2026 – Aug 2026
20
+ • Architected the migration of a legacy enterprise fund database application to a modern React and Spring Boot stack,
21
+
22
+ developing REST APIs and integrating Ping OIDC for secure authentication.
23
+ • Optimized backend SQL to improve response time by 3x, wrote comprehensive unit tests for both frontend and backend, and
24
+
25
+ accelerated feature delivery using custom Github Copilot workflows and MCP servers.
26
+ • Engineered a custom AI agent integrated with database and spreadsheet tools to automate manual dividend processing,
27
+
28
+ delivering a conversational chat interface to operations and support teams.
29
+ Axcellion.ai
30
+ Software Engineer Jan 2026 – May 2026
31
+ • Architected a multithreaded ingestion pipeline to process over 108,000 regulatory filings totaling 80+ GB at 9.1 docs/sec with
32
+
33
+ 0 failures, utilizing AWS EC2 to bypass remote server rate-limits and maximize bandwidth during high-speed bulk transfers.
34
+ • Engineered a RAG intelligence engine mapping over 100k nodes and relationships in a Neo4j knowledge graph, by utilizing
35
+
36
+ AWS Lambda and EventBridge to automate daily data source synchronization.
37
+ IonQ
38
+ Project Lead Aug 2025 – Present
39
+ • Managing SLURM-scheduled parallelization on the Zaratan HPC cluster, optimizing data loading routines to reduce epoch
40
+
41
+ training cycles from 72 hours to 10 minutes.
42
+ • Directing a 12-engineer team to scale distributed computing workflows into a published arXiv paper, establishing
43
+
44
+ standardized code review, Agile workflows, and documentation protocols.
45
+ National Quantum Laboratory
46
+ Quantum Computing Research Intern Jul 2025 – Aug 2025
47
+ • Established the foundational architecture for the QFireNet wildfire segmentation model, executing the first GPU-accelerated
48
+
49
+ training cycles to validate the feasibility of a hybrid quantum approach to wildfire detection.
50
+ • Achieved >99% accuracy on MNIST using a hybrid quantum approach matching published benchmarks, and validated the
51
+
52
+ hand-built model on both IonQ quantum processors and the Pennylane Lightning simulator.
53
+ General Dynamics IT
54
+ Backend Engineer Feb 2025 – May 2025
55
+ • Built an agentic RAG pipeline processing a dataset of 500,000 emails between 150 accounts, developing Qdrant embeddings
56
+
57
+ and a Neo4j knowledge graph to enable Ai-powered insights and summaries in under 6 seconds per query.
58
+ • Developed an end-to-end React and Flask full-stack application to deliver real-time summarization of the Enron corpus,
59
+
60
+ handling large-scale unstructured email data through custom parsing and preprocessing techniques.
61
+
62
+ Projects
63
+ QFireNet: Quantum-Enhanced Wildfire Segmentation | PyTorch, PennyLane, Jupyter Aug 2025 – Present
64
+ • Published a hybrid quantum-classical U-Net model for multispectral satellite wildfire detection, replacing the classical
65
+
66
+ bottleneck with QuFeX and QB-Net variational quantum circuits to improve feature extraction in the Sen2Fire dataset.
67
+ • Improved test F1 score by 11% over 16 experiments, using angle embedding to prevent NaN gradient collapse during training.
68
+
69
+
70
+
71
+ Trace | React, Next.js, Flask, Supabase, OpenCV, XGBoost
72
+ • Trained a custom XGBoost classifier on 1,056 samples to achieve 91% Parkinson’s severity classification accuracy across 5
73
+
74
+ motor skill metrics, integrating into a web patient monitoring platform processing tracing assessments in under 2 seconds.
75
+
76
+ Technical Skills
77
+ Languages: Python, Java, C, Typescript, HTML/CSS, OCaml, C#, Assembly (x86-64), UML, SQL, SAS
78
+ ML & Quantum: PyTorch, Tensorflow, Pennylane, Qiskit, Scikit-learn, OpenCV, Pandas, NumPy, Matplotlib
79
+ Frameworks & Tools: React, Git, Jupyter, Spring Boot, Next.js, Flask, Sveltekit, Vitest, AWS, Neo4j, HPC, SQL Server, Oracle
80
+
@@ -20,7 +20,11 @@ describe('CLI Commands', () => {
20
20
  chdirMock = jest.spyOn(process, 'chdir').mockImplementation(() => {});
21
21
  logMock = jest.spyOn(console, 'log').mockImplementation(() => {});
22
22
  errorMock = jest.spyOn(console, 'error').mockImplementation(() => {});
23
-
23
+ fs.cpSync = jest.fn();
24
+ fs.existsSync.mockReturnValue(true);
25
+ fs.readFileSync.mockReturnValue('gdrive:Resumes/');
26
+ fs.writeFileSync.mockReturnValue(true);
27
+
24
28
  jest.clearAllMocks();
25
29
  });
26
30
 
@@ -30,9 +34,11 @@ describe('CLI Commands', () => {
30
34
 
31
35
  describe('setup.js', () => {
32
36
  it('Happy Path: Successfully scaffolds repo, updates action file, and sets Google Drive token', async () => {
33
- execa.mockResolvedValueOnce({ stdout: 'git version' });
34
- execa.mockResolvedValueOnce({ stdout: 'gh version' });
35
- execa.mockResolvedValueOnce({ stdout: 'rclone v1' });
37
+ execa.mockImplementation((cmd, args) => {
38
+ if (cmd === 'rclone' && args[0] === 'authorize') return Promise.resolve({ stdout: '{"access_token":"super-secret-token","token_type":"Bearer"}', stderr: '' });
39
+ if (cmd === 'git' && args[0] === 'config') return Promise.resolve({ stdout: 'https://github.com/test/repo.git\n' });
40
+ return Promise.resolve({ stdout: '' });
41
+ });
36
42
 
37
43
  inquirer.prompt.mockResolvedValueOnce({
38
44
  targetDir: '..',
@@ -42,28 +48,6 @@ describe('CLI Commands', () => {
42
48
  });
43
49
  inquirer.prompt.mockResolvedValueOnce({ ready: true });
44
50
 
45
- execa.mockResolvedValueOnce({ stdout: 'Logged in' }); // gh auth status
46
- execa.mockResolvedValueOnce({}); // gh repo create
47
- execa.mockResolvedValueOnce({ stdout: 'https://github.com/test/repo.git\n' }); // git config --get remote.origin.url
48
- execa.mockResolvedValueOnce({}); // git remote add
49
- execa.mockResolvedValueOnce({}); // git fetch
50
- execa.mockResolvedValueOnce({}); // git reset
51
-
52
- fs.existsSync.mockImplementation((pathStr) => pathStr.includes('build-resume.yml') ? true : false);
53
- fs.readFileSync.mockReturnValueOnce('... rclone sync PDF_Exports/ gdrive:Resumes/ ...');
54
-
55
- execa.mockResolvedValueOnce({}); // git add
56
- execa.mockResolvedValueOnce({}); // git commit
57
-
58
- const fakeToken = `{"access_token":"super-secret-token","token_type":"Bearer"}`;
59
- execa.mockResolvedValueOnce({
60
- stdout: `Paste the following into your remote machine --->\n${fakeToken}\n<---End paste`,
61
- stderr: ''
62
- });
63
-
64
- execa.mockResolvedValueOnce({}); // gh secret set
65
- execa.mockResolvedValueOnce({}); // git push
66
-
67
51
  await setupCommand();
68
52
 
69
53
  expect(fs.writeFileSync).toHaveBeenCalledWith(
@@ -74,81 +58,29 @@ describe('CLI Commands', () => {
74
58
  expect(exitMock).not.toHaveBeenCalled();
75
59
  });
76
60
 
77
- it('Error Path: Logs warning but continues to push if Google Drive sync fails', async () => {
78
- execa.mockResolvedValueOnce({ stdout: 'git version' });
79
- execa.mockResolvedValueOnce({ stdout: 'gh version' });
80
- execa.mockResolvedValueOnce({ stdout: 'rclone v1' });
81
-
82
- inquirer.prompt.mockResolvedValueOnce({
83
- targetDir: '..',
84
- repoName: 'my-test-resume',
85
- template: 'modular-multi',
86
- driveFolder: 'Resumes'
87
- });
88
- inquirer.prompt.mockResolvedValueOnce({ ready: true });
89
-
90
-
91
- execa.mockResolvedValueOnce({ stdout: 'Logged in' }); // gh auth status
92
- execa.mockResolvedValueOnce({}); // gh repo create
93
- execa.mockResolvedValueOnce({ stdout: 'https://github.com/test/repo.git\n' }); // git config --get remote.origin.url
94
- execa.mockResolvedValueOnce({}); // git remote add
95
- execa.mockResolvedValueOnce({}); // git fetch
96
- execa.mockResolvedValueOnce({}); // git reset
97
- fs.existsSync.mockReturnValue(false);
98
- execa.mockResolvedValueOnce({}); // git add
99
- execa.mockResolvedValueOnce({}); // git commit
100
-
101
- // Simulate rclone failure
102
- execa.mockRejectedValueOnce(new Error('rclone crashed'));
103
-
104
- execa.mockResolvedValueOnce({}); // git push
105
-
106
- await setupCommand();
107
- expect(exitMock).not.toHaveBeenCalled();
108
- });
109
-
110
61
  it('Error Path: Triggers Homebrew installer if dependencies are missing', async () => {
111
- execa.mockRejectedValueOnce(new Error('command not found')); // git
112
- execa.mockRejectedValueOnce(new Error('command not found')); // gh
113
- execa.mockRejectedValueOnce(new Error('command not found')); // rclone
114
-
62
+ execa.mockImplementation((cmd, args) => {
63
+ if (['git', 'gh', 'rclone'].includes(cmd) && args[0] === '--version') return Promise.reject(new Error('command not found'));
64
+ return Promise.resolve({ stdout: '' });
65
+ });
115
66
  inquirer.prompt.mockResolvedValueOnce({ install: true });
116
-
117
- execa.mockResolvedValueOnce({}); // brew install git gh rclone
118
-
119
- inquirer.prompt.mockResolvedValueOnce({ targetDir: '..', repoName: 'test', template: 'standard', driveFolder: 'Resumes' });
120
-
121
- execa.mockResolvedValue({ stdout: 'fake-url' }); // Default for all remaining calls
122
- fs.existsSync.mockReturnValue(false);
123
- inquirer.prompt.mockResolvedValueOnce({ ready: false }); // Skip drive auth
67
+ inquirer.prompt.mockResolvedValueOnce({ targetDir: '..', repoName: 'test', template: 'modular-multi', driveFolder: 'Resumes' });
68
+ inquirer.prompt.mockResolvedValueOnce({ ready: false });
124
69
 
125
70
  await setupCommand();
126
71
 
127
72
  expect(execa).toHaveBeenCalledWith('brew', ['install', 'git', 'gh', 'rclone']);
128
73
  });
129
74
 
130
- it('Error Path: Exits if dependencies are missing and user declines install', async () => {
131
- execa.mockRejectedValueOnce(new Error('command not found')); // git
132
- execa.mockResolvedValueOnce({ stdout: 'gh version' });
133
- execa.mockResolvedValueOnce({ stdout: 'rclone v1' });
134
-
135
- inquirer.prompt.mockResolvedValueOnce({ install: false });
136
-
137
- await expect(setupCommand()).rejects.toThrow('process.exit(1) called');
138
- expect(exitMock).toHaveBeenCalledWith(1);
139
- });
140
-
141
75
  it('Error Path: Suggests "gh auth login" if GitHub auth fails', async () => {
142
- execa.mockResolvedValueOnce({ stdout: 'git version' });
143
- execa.mockResolvedValueOnce({ stdout: 'gh version' });
144
- execa.mockResolvedValueOnce({ stdout: 'rclone v1' });
76
+ execa.mockImplementation((cmd, args) => {
77
+ if (cmd === 'gh' && args[0] === 'auth') return Promise.reject(new Error('auth failed'));
78
+ return Promise.resolve({ stdout: '' });
79
+ });
145
80
 
146
- inquirer.prompt.mockResolvedValueOnce({ targetDir: '..', repoName: 'test', template: 'standard', driveFolder: 'Resumes' });
81
+ inquirer.prompt.mockResolvedValueOnce({ targetDir: '..', repoName: 'test', template: 'modular-multi', driveFolder: 'Resumes' });
147
82
  inquirer.prompt.mockResolvedValueOnce({ ready: true });
148
83
 
149
- // Fail GitHub auth
150
- execa.mockRejectedValueOnce(new Error('auth failed'));
151
-
152
84
  await expect(setupCommand()).rejects.toThrow('process.exit(1) called');
153
85
  expect(exitMock).toHaveBeenCalledWith(1);
154
86
  expect(logMock).toHaveBeenCalledWith(expect.stringContaining('gh auth login'));
@@ -170,7 +102,7 @@ describe('CLI Commands', () => {
170
102
 
171
103
  expect(chokidar.watch).toHaveBeenCalledWith('**/*.tex', expect.any(Object));
172
104
 
173
- execa.mockResolvedValueOnce({}); // simulate build_all.sh succeeding
105
+ execa.mockResolvedValueOnce({});
174
106
  await changeCallback('resume.tex');
175
107
 
176
108
  expect(execa).toHaveBeenCalledWith('./build_all.sh');
@@ -33,7 +33,7 @@ describe('resumake setup command', () => {
33
33
  return Promise.resolve({
34
34
  targetDir: '/mock/path',
35
35
  repoName: 'my-resume',
36
- template: 'standard',
36
+ template: 'awesome-cv',
37
37
  driveFolder: 'Resumes'
38
38
  });
39
39
  }
@@ -47,6 +47,7 @@ describe('resumake setup command', () => {
47
47
  fs.existsSync.mockReturnValue(true);
48
48
  fs.readFileSync.mockReturnValue('gdrive:Resumes/');
49
49
  fs.writeFileSync.mockReturnValue(true);
50
+ fs.cpSync = jest.fn();
50
51
 
51
52
  // Spy on process.chdir to avoid changing test runner directory
52
53
  jest.spyOn(process, 'chdir').mockImplementation(() => {});
@@ -65,9 +66,12 @@ describe('resumake setup command', () => {
65
66
  // Verify gh repo create was called
66
67
  expect(execa).toHaveBeenCalledWith('gh', ['repo', 'create', 'my-resume', '--private', '--clone']);
67
68
 
68
- // Verify template was fetched
69
- expect(execa).toHaveBeenCalledWith('git', ['remote', 'add', 'template', 'https://github.com/jaimanm/resumake.git']);
70
- expect(execa).toHaveBeenCalledWith('git', ['reset', '--hard', 'template/template/standard']);
69
+ // Verify template was copied locally
70
+ expect(fs.cpSync).toHaveBeenCalledWith(
71
+ expect.stringContaining('templates/awesome-cv'),
72
+ expect.any(String),
73
+ { recursive: true }
74
+ );
71
75
 
72
76
  // Verify rclone was executed
73
77
  expect(execa).toHaveBeenCalledWith('rclone', ['authorize', 'drive']);