import OpenAI from 'openai'; import path from 'path'; import fs from 'fs'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); /** * @typedef {Object} Node * @property {string} id - The unique identifier for the node * @property {string} text - The text content of the node */ const roadmapId = 'engineering-manager'; /** @type {Node[]} */ const nodes = [ { id: 'oKbeLp4YB8rI1Q3vi0EnG', text: 'Engineering Manager > What is Engineering Management? > EM vs Tech Lead vs IC', }, { id: 'aSZ2uVCmpAdEPjJt6VKG4', text: 'Engineering Manager > What is Engineering Management? > People', }, { id: 'p9ecMvHCqjmvxf67di7pY', text: 'Engineering Manager > What is Engineering Management? > Product', }, { id: 'iZFn0FaRdrGv_-_8zii_-', text: 'Engineering Manager > What is Engineering Management? > Process', }, { id: 'fBENrXdMhoGYgL_d96tgo', text: 'Engineering Manager > Software Engineering Background', }, { id: 'iX4HPgoiEbc_gze1A01n4', text: 'Engineering Manager > > System Design and Architecture', }, { id: 'EY6Hk5wPd9Y_VA1UROk44', text: 'Engineering Manager > Technical Debt and Management', }, { id: '40yK6XzI8lSxdiAXxtF75', text: 'Engineering Manager > Code Review Best Practices', }, { id: '_2xnTKt5yi__jj_WgcLa7', text: 'Engineering Manager > Technical Documentation', }, { id: 'ikCJ8Ybu2AD1w5VuPNVAO', text: 'Engineering Manager > Technical Strategy > Technical Roadmapping', }, { id: 'FtWNnOE3zObmjS-Og26M3', text: 'Engineering Manager > Technical Strategy > Architectural Decision-Making', }, { id: 'H0aav5qKDNiNegJOGP2rx', text: 'Engineering Manager > Technical Strategy > Build vs Buy Evaluation', }, { id: 'd7zMBhMFgY9MwmKC9CVVh', text: 'Engineering Manager > Technical Strategy > Technical Risk Assessment', }, { id: 'EyoVFmqOJbH1sAPHLISFt', text: 'Engineering Manager > Technical Strategy > Scaling Infrastructure', }, { id: 'QUxpEK8smXRBs2gMdDInB', text: 'Engineering Manager > Technical Strategy > Legacy System Retirement', }, { id: 'pduPcv2QPpVmVvDdK4CPi', text: 'Engineering Manager > Quality and Process > System Monitoring & Performance', }, { id: 'gAEmpSMvNyjmTa5q9oZSg', text: 'Engineering Manager > Quality and Process > CI/CD Implementation', }, { id: 'bpJPDbifPwS4ScOoATlEI', text: 'Engineering Manager > Quality and Process > Development / Release Workflow', }, { id: 'q5SJyM1d8cQzzAcR-kotB', text: 'Engineering Manager > Quality and Process > Testing Strategies', }, { id: 'C2YsaZ32An_UXV8lB7opm', text: 'Engineering Manager > Quality and Process > Technical Standards Setting', }, { id: 'sQCLhk__jvbityuuLlxiW', text: 'Engineering Manager > Quality and Process > Security Best Practices', }, { id: 'o1xPrfg8iNWQpD12xsbQJ', text: 'Engineering Manager > Quality and Process > Incident Management', }, { id: '3na5mBIPl5f6mjEzkgD_C', text: 'Engineering Manager > People Management > Hiring and Recruitment', }, { id: 'tPDmXXjvFI_8-MTo_dEUw', text: 'Engineering Manager > People Management > Team Structure and Design', }, { id: 'eJzYnoB6sArLjXRm51cM4', text: 'Engineering Manager > People Management > Performance Evaluations', }, { id: 'fhFSR_N4ZDTHINEinubHG', text: 'Engineering Manager > People Management > Career Development Planning', }, { id: '0ULnfq0ZFJXgoLbKM1gxC', text: 'Engineering Manager > People Management > Mentoring and Coaching', }, { id: 'bx2SMhR58ud45se5dK7qS', text: 'Engineering Manager > People Management > Delegation', }, { id: 'QA5CR5f0geC_RQc_SOK-N', text: 'Engineering Manager > Leadership Skills > Conflict Resolution', }, { id: 'Az9GgkLFoat2t_sYRUBv5', text: 'Engineering Manager > Leadership Skills > Feedback Delivery', }, { id: 'U_oOnDXkCE387r9olvMZB', text: 'Engineering Manager > Leadership Skills > Team Motivation', }, { id: '7PBmYoSmIgZT21a2Ip3_S', text: 'Engineering Manager > Leadership Skills > Trust / Influence Building', }, { id: 'h7gEQNbGiabDA1q1Bk_IB', text: 'Engineering Manager > Leadership Skills > Emotional Intelligence', }, { id: 'b3qoH_LuW-Gz4N8WdGnZs', text: 'Engineering Manager > Communication > One-on-One Meetings', }, { id: 'C2EQ8JMyK6b4PvgK5TpXb', text: 'Engineering Manager > Communication', }, { id: 'e0ZuiCoS8sJ0XB1lNiz7_', text: 'Engineering Manager > Team Meetings', }, { id: 'gqKEgKjEu5sOf5Gl-HS-j', text: 'Engineering Manager > Communication > Status Reporting', }, { id: 'TVqVlJqegLZRSkwNoHbBf', text: 'Engineering Manager > Communication > Stakeholder Management', }, { id: 'ZuZuzwy-Frsn_PFJZVuAQ', text: 'Engineering Manager > Communication > Cross-functional Collaboration', }, { id: 'jt-LF5QbGVs0cwTuHFQF6', text: 'Engineering Manager > Project Management', }, { id: '4v5yLKYVcMh0s7SQuf__C', text: 'Engineering Manager > Project Management > Resource Allocation', }, { id: '7BcToTqL78QmG4qb43X5Q', text: 'Engineering Manager > Project Management > Sprint Planning', }, { id: '-Qc6E3gkUUonfzifYqeJJ', text: 'Engineering Manager > Project Management > Release Management', }, { id: 'mgw6M8I9qy1EoJpJV-gy1', text: 'Engineering Manager > Project Management > Risk Management', }, { id: 'hH-UDVFlgKoMJcI1ssDFv', text: 'Engineering Manager > Project Management > Dependency management', }, { id: 'n9gvPHn4c1U-l6v-W9v6r', text: 'Engineering Manager > Project Management > Agile methodologies', }, { id: 'SuT6q5lMMSyVkadlQp7iU', text: 'Engineering Manager > Project Management > Project Tracking', }, { id: 'PXobPGPgCX3_55w4UtxT9', text: 'Engineering Manager > Project Management > Milestone Management', }, { id: 'C-lJJSjT8Cxw_UT3ocFsO', text: 'Engineering Manager > Project Management > Scope Management', }, { id: 'QWO5QFS7kXwfu3aa8IiRt', text: 'Engineering Manager > Project Management > Timeline Estimation', }, { id: 'Wd8FCEaGZBTvsD-k4t0r4', text: 'Engineering Manager > Project Management > KPI Definition', }, { id: 'idd92ZTBVUzptBl5jRdc3', text: 'Engineering Manager > Project Management > Measurement > Velocity Tracking', }, { id: 'ZWWsuFm_G4kvvl_cv8l_t', text: 'Engineering Manager > Project Management > Measurement > Quality Metrics', }, { id: 'ZWWsuFm_G4kvvl_cv8l_t', text: 'Engineering Manager > Project Management > Measurement > Quality Metrics', }, { id: 'KPDHk7tl_BnIj_obnq3Kl', text: 'Engineering Manager > Project Management > Measurement > Team Health Metrics', }, { id: 'g9WWa50V8ZbhIJgBRx0Nd', text: 'Engineering Manager > Project Management > Measurement > Project Postmortems', }, { id: 'nC5dfGlxbLoXUAp2u-6Gl', text: 'Engineering Manager > Strategic Thinking > Product strategy alignment', }, { id: 'vhOHvfF_lfQrrOK6sGLTY', text: 'Engineering Manager > Strategic Thinking > Business Case Development', }, { id: 'XinUWPahOdufmLYcEwMj_', text: 'Engineering Manager > Strategic Thinking > ROI analysis', }, { id: 'P2gIOt-i0sQEOMBo-XjZO', text: 'Engineering Manager > > Market awareness', }, { id: '76GjwwEYaEX_kh02OSpdr', text: 'Engineering Manager > Strategic Thinking > Competitive Analysis', }, { id: 'TQY4hjo56rDdlbzjs_-nl', text: 'Engineering Manager > Strategic Thinking > Competitive Analysis', }, { id: 'KA0y6KdVTjJFeX3frHUNo', text: 'Engineering Manager > Organizational Awareness > Company Culture', }, { id: 'tt02qGHSn4fPbpboZ1Ni_', text: 'Engineering Manager > Organizational Awareness > Change management', }, { id: 'mjMRNhPkeb4lEZXBb8Iot', text: 'Engineering Manager > Organizational Awareness > Organization structure', }, { id: 'Zoz01JcNU69gr95IcWhYM', text: 'Engineering Manager > Organizational Awareness > Politics navigation', }, { id: 'Hb_rZe4k37Rr0enSh7woV', text: 'Engineering Manager > Organizational Awareness > Cross-department collaboration', }, { id: 'oqjr26B27SHSYVQ4IFnA1', text: 'Engineering Manager > Financial Management > Budget Planning', }, { id: 'iwwxnSVvCmZ57stXwzk8G', text: 'Engineering Manager > Financial Management > Resource forecasting', }, { id: 'rbhZJZtRV1ZZ5QaYW77ry', text: 'Engineering Manager > Financial Management > Cost Optimization', }, { id: 'Imgt669vbUT_Iec2o4Gvt', text: 'Engineering Manager > Financial Management > Vendor Management', }, { id: 'ZuZuzwy-Frsn_PFJZVuAQ', text: 'Engineering Manager > Team Culture > Defining and Enforcing Values', }, { id: '6iM0n4faMNhk4mezS9AcG', text: 'Engineering Manager > Team Culture > Inclusive environment creation', }, { id: '8Nro6PTkEkNugYBjQfJ6O', text: 'Engineering Manager > Team Culture > Team Traditions and Rituals', }, { id: 'Vb3A4a-UpGTAEs-dVI66s', text: 'Engineering Manager > Team Culture > Recognition programs', }, { id: 'LE3ykySYFL23KvuwxeBaR', text: 'Engineering Manager > Team Culture > Social connections', }, { id: 'g9FvFKC715tZL2ZGlPl3N', text: 'Engineering Manager > Team Culture > Bias Recognition / Mitigation', }, { id: 'njqjYPMQK3nGYtqHzUylo', text: 'Engineering Manager > Engineering Culture > Innovation fostering', }, { id: 'aeD-kBZEr1NHFtAD8yHI_', text: 'Engineering Manager > Engineering Culture > Learning culture development', }, { id: '74-7hDXaBVXYo6LJdgac_', text: 'Engineering Manager > Engineering Culture > Knowledge sharing practices', }, { id: 'Cq0OFaWqSRathZO-bxBrP', text: 'Engineering Manager > Engineering Culture > Technical excellence mindset', }, { id: 'fYkKo8D35AHd8agr3YrIP', text: 'Engineering Manager > > Blameless Post-mortems', }, { id: 'Xaeb67Nqdi0kwvehQUYeJ', text: 'Engineering Manager > Incident Response > Emergency protocols', }, { id: 'LQ3YfAgJ4UaDgtnN-cMht', text: 'Engineering Manager > Incident Response > War Room Management', }, { id: 'irEwTIubCjORnlH27QpEo', text: 'Engineering Manager > Incident Response > Stakeholder Communication', }, { id: '2fHcb1dAnf34APCAAlwnR', text: 'Engineering Manager > Incident Response > Service Recovery', }, { id: '8zyK34SwHry2lrWchw0KZ', text: 'Engineering Manager > Incident Response > Post-incident analysis', }, { id: '2RwpGPegD2GyiiV6SVbbM', text: 'Engineering Manager > Risk Mitigation > Contingency planning', }, { id: 'KOTzJ8e7mc0wmF46vrj3I', text: 'Engineering Manager > Risk Mitigation > Disaster recovery', }, { id: 'v6N7BH0B55gX0oNXb55D7', text: 'Engineering Manager > Risk Mitigation > Business continuity', }, { id: 'FNp4-RgPvfC76pJKjX56a', text: 'Engineering Manager > Risk Mitigation > Security incident handling', }, { id: 'kQG_wk66-51dA4Ly9ivjM', text: 'Engineering Manager > Risk Mitigation > Production issues management', }, { id: 'mIUx8zAHWyPWPGvxuTK4y', text: 'Engineering Manager > Team Support > Contingency planning', }, { id: 'nnoVA8W70hrNDxN3XQCVL', text: 'Engineering Manager > Team Support > Disaster recovery', }, { id: 'FwK-B7jRbBXVnuY9JxI1w', text: 'Engineering Manager > Team Support > Business continuity', }, { id: 'QFhhOgwz_bgZgOfKFg5XA', text: 'Engineering Manager > Team Support > Security incident handling', }, { id: 'tmY4Ktu6luFg5wKylJW76', text: 'Engineering Manager > Team Support > Production issues management', }, { id: 'WYoqfmk5ejB2UOiYXh4Zi', text: 'Engineering Manager > Partner Management > Vendor relationships', }, { id: 'xMN575nnnQJeHe2oJYw17', text: 'Engineering Manager > Partner Management > Technology partnerships', }, { id: 'f3P0fF4UzgVQZuMVTVmP1', text: 'Engineering Manager > Partner Management > Integration management', }, { id: 'ukmMMWacekcejEiEKCLzh', text: 'Engineering Manager > Partner Management > API strategy', }, { id: 'Jctp5tPCK_vY35_bh7QFk', text: 'Engineering Manager > Partner Management > External collaboration', }, { id: 'QEViLNgG4Uv9Q9PWig0u3', text: 'Engineering Manager > Customer Relations > Customer feedback integration', }, { id: 'V5s2i-L2tsZFNxMLN_e_U', text: 'Engineering Manager > Customer Relations > Technical customer support', }, { id: 'A-Aa7VdDAYfaMUZD_cWwP', text: 'Engineering Manager > Customer Relations > Customer success alignment', }, { id: '2QwMcO27H3ygtLlWVplxr', text: 'Engineering Manager > Customer Relations > Feature prioritization', }, { id: 'tCT2syTMyEHCspDLXxk6R', text: 'Engineering Manager > Customer Relations > Technical partnerships', }, { id: '5MM1ccB1pmQcd3Uyjmbr7', text: 'Engineering Manager > Executive Communication > Board presentations', }, { id: 'CHothgVl8ulFthwS7uKqK', text: 'Engineering Manager > Executive Communication > Executive summaries', }, { id: 'uBrsV_EocAkRWEqJYjoZn', text: 'Engineering Manager > Executive Communication > Strategic proposals', }, { id: 'pLUOU2AmAJ9aJAmIlVD7D', text: 'Engineering Manager > Executive Communication > Budget requests', }, { id: 'QssXmeifoI3dtu-eXp8PK', text: 'Engineering Manager > Executive Communication > Vision alignment', }, { id: 'gHhNi32MSBmqk-oKOy-uj', text: 'Engineering Manager > Knowledge Management > Documentation > Architecture documentation', }, { id: 'Kwy9O1z2hpeE0Sb3qtxEg', text: 'Engineering Manager > Knowledge Management > Documentation > Process documentation', }, { id: 'dTjp_rEl1ITZjvELqVtfv', text: 'Engineering Manager > Knowledge Management > Documentation > Decision records', }, { id: '4-MCXFOkMGcN369OPG-vw', text: 'Engineering Manager > Knowledge Management > Documentation > Best Practices', }, { id: '4-MCXFOkMGcN369OPG-vw', text: 'Engineering Manager > Knowledge Management > Documentation > Best Practices', }, { id: 'HUQ_-vU2pdBPyF0mBocHz', text: 'Engineering Manager > Knowledge Management > Documentation > Lessons Learned', }, { id: 'g6K9fxWdRQT5h_u4Y_bkq', text: 'Engineering Manager > Knowledge Management > Knowledge Transfer > Mentoring Programs', }, { id: '7t9jmv3_lRCEG5y5DA8bF', text: 'Engineering Manager > Knowledge Management > Knowledge Transfer > Knowledge bases', }, { id: '2LO0iWf-y3l4rA1n_oG1g', text: 'Engineering Manager > Knowledge Management > Knowledge Transfer > Tech Talks', }, { id: 'S8-nwYKlG7YHL2dWwR303', text: 'Engineering Manager > Knowledge Management > Knowledge Transfer > Brown Bags', }, { id: 'QMAIEkVFHrrP6lUWvd0S8', text: 'Engineering Manager > Change Management > Technical Change > Migration planning', }, { id: '9mNLfntu1TPjcX3RoUeMq', text: 'Engineering Manager > Change Management > Technical Change > Legacy system retirement', }, { id: 'jerPoyfCcwZbNuE_cl1hq', text: 'Engineering Manager > Change Management > Technical Change > Technology adoption', }, { id: 'f-52wRfPRrA9iniOMYQB7', text: 'Engineering Manager > Change Management > Technical Change > Tool transitions', }, { id: 'ev9ZKygqETctLMSt1GAFU', text: 'Engineering Manager > Change Management > Technical Change > Process changes', }, { id: '1__zRE1iu1FDX9ynpWSBS', text: 'Engineering Manager > Change Management > Organizational Change > Change strategy', }, { id: 'oGmtkOGVgA4huGJqkBEfj', text: 'Engineering Manager > Change Management > Organizational Change > Impact assessment', }, { id: '34uOnta7dKOyZL0et_RC8', text: 'Engineering Manager > Change Management > Organizational Change > Stakeholder management', }, { id: 'Mxi4g_PzT0oYc3NgR0UVg', text: 'Engineering Manager > Change Management > Organizational Change > Communication planning', }, { id: 'Mxi4g_PzT0oYc3NgR0UVg', text: 'Engineering Manager > Change Management > Organizational Change > Communication planning', }, { id: 'vfp6VmWnhpre_eDORg7ht', text: 'Engineering Manager > Change Management > Organizational Change > Resistance management', }, { id: '5_CE3p5jMA1uEqFNfp7Kh', text: 'Engineering Manager > Change Management > > Reorganizations', }, { id: 'ph0U4l2alVJ8lUJ96q7co', text: 'Engineering Manager > Change Management > Team Change > Team mergers', }, { id: 'FayHWdUHHYFFBwnXx37Gk', text: 'Engineering Manager > Change Management > Team Change > Role transitions', }, { id: 'eIlW4mZKNQfBsTDmZf7ex', text: 'Engineering Manager > Change Management > Team Change > Responsibility shifts', }, { id: 'y7YHIz7OI4sNfC_nhfLcu', text: 'Engineering Manager > Change Management > Team Change > Culture evolution', }, ]; const OPENAI_API_KEY = process.env.OPENAI_API_KEY; if (!OPENAI_API_KEY) { console.error('OPENAI_API_KEY is not set'); process.exit(1); } const openai = new OpenAI({ apiKey: OPENAI_API_KEY, }); const prompt = ` You are a helpful assistant that can help me generate content for a roadmap tree. User will give you roadmap topics in the form of "Parent > Child > Leaf". You need to generate content for the last node in the hierarchy in relation to the parents. Remember that you are describing how an Engineering Manager interacts with or handles the given topic, not just explaining the topic itself. You may explain why the given topic is important in an engineering team. Also, I hate it when you say "In the realm of..." or "In the context of..." or "..in the context of..." or "when we talk about..." or something similar. Content should be helpful and engaging for a technical audience. It can include things like (you can include more or less, depending on the topic): - How does an Engineering Manager work with or handle this area? - What are their key responsibilities related to this topic? - What challenges do they face and how do they address them? - What skills and approaches are needed to succeed in this aspect? The content should be a few short textual paragraphs (MAXIMUM 3) that is NO MORE THAN 130 words. IMPORTANT: Use simple and clear English. Avoid complex words and jargon when possible. Write in a way that is easy to understand. Use short sentences and common words. `; /** * Generates content for a given node using OpenAI's GPT model * @param {Node} node - The node to generate content for * @returns {Promise} The generated content */ const generateContent = async (node) => { try { const content = await openai.chat.completions.create({ model: 'gpt-4', messages: [ { role: 'system', content: prompt }, { role: 'user', content: `Node: ${node.text}`, }, ], }); return content.choices[0].message.content; } catch (error) { console.error( `Error generating content for node ${node.id}:`, error.message, ); throw error; } }; const roadmapContentDir = path.join( __dirname, `../src/data/roadmaps/${roadmapId}/content`, ); const contentFiles = fs.readdirSync(roadmapContentDir); /** * Processes a single node by generating content and writing to file * @param {Node} node - The node to process * @param {string} roadmapContentDir - Directory path for content files * @param {string[]} contentFiles - List of existing content files * @returns {Promise} */ const processNode = async (node, roadmapContentDir, contentFiles) => { try { const nodeId = node.id; const relevantFileName = contentFiles.find((file) => file.endsWith(`${nodeId}.md`), ); if (!relevantFileName) { console.warn(`No matching file found for node ${nodeId}`); return; } const fileTitle = node.text .replace(/\s+>\s+/g, '>') .split('>') .pop(); const content = await generateContent(node); const filePath = path.join(roadmapContentDir, relevantFileName); await fs.promises.writeFile(filePath, `# ${fileTitle}\n\n${content}`); console.log(`Successfully processed node ${nodeId}`); } catch (error) { console.error(`Failed to process node ${node.id}:`, error.message); } }; /** * Main function to run the content generation * @returns {Promise} */ const main = async () => { try { // Process nodes in parallel with concurrency limit const BATCH_SIZE = 20; // Adjust based on API rate limits for (let i = 0; i < nodes.length; i += BATCH_SIZE) { const batch = nodes.slice(i, i + BATCH_SIZE); const promises = batch.map((node) => processNode(node, roadmapContentDir, contentFiles), ); await Promise.allSettled(promises); // Add a small delay between batches to avoid rate limiting if (i + BATCH_SIZE < nodes.length) { await new Promise((resolve) => setTimeout(resolve, 1000)); } } console.log('Content generation completed'); } catch (error) { console.error('Fatal error in main process:', error); process.exit(1); } }; // Add error handling for uncaught exceptions process.on('uncaughtException', (error) => { console.error('Uncaught Exception:', error); process.exit(1); }); process.on('unhandledRejection', (error) => { console.error('Unhandled Rejection:', error); process.exit(1); }); main();