A modern Node.js application that creates GitHub issues and HackMD documents for Node.js team meetings. This tool automates the process of reading meeting configuration, fetching calendar events, creating meeting minutes documents, and posting GitHub issues.
- Node.js 22+ (LTS)
- GitHub Personal Access Token
- Google Cloud Project with Calendar API enabled (for meeting scheduling)
- Google API Key for Calendar access
- HackMD API Token (for meeting minutes)
- Create a GitHub Personal Access Token
- Grant the following permissions:
repo(Full control of private repositories)user(Read user information)
- Go to HackMD and sign in to your account
- Navigate to Account Settings > API Tokens
- Create a new API token for the meeting artifacts tool
- Optionally, create or join a team workspace for better organization
- Go to Google Cloud Console
- Create a new project or select an existing one
- Enable the Google Calendar API
- Go to Credentials β Create Credentials β API Key
- Restrict the API key to the Google Calendar API for security
- Add the API key to your environment variables as
GOOGLE_API_KEY
Note: API Keys provide simplified authentication and are sufficient for read-only calendar access. They don't require complex OAuth flows or service account setup.
create-node-meeting-artifacts/
βββ src/
β βββ config.mjs # Configuration management
β βββ constants.mjs # Application constants
β βββ github.mjs # GitHub API integration
β βββ google.mjs # Google APIs integration
β βββ meeting.mjs # Meeting operations
β βββ utils.mjs # Utility functions
βββ templates/ # Meeting templates
βββ .nvmrc # Node.js version
βββ .env.example # Environment variables example
βββ create-node-meeting-artifacts.mjs # Main application
βββ TEMPLATES_DOCUMENTATION.md # Template creation guide
βββ README.md # This file
Meeting configurations are stored in the templates/ directory. Each meeting group requires four template files:
invited_<group>: List of invited attendees (GitHub team mentions)observers_<group>: List of observers with their detailsmeeting_base_<group>: Base meeting configuration (calendar ID, GitHub repo, etc.)minutes_base_<group>: Template for meeting minutes document
For detailed information about creating new templates, see TEMPLATES_DOCUMENTATION.md.
Templates support the following replacement variables:
$TITLE$: Meeting title$AGENDA_CONTENT$: Auto-generated agenda items$INVITED$: Invited attendees list$OBSERVERS$: Observers list$GITHUB_ISSUE$: GitHub issue URL$MINUTES_DOC$: Google Doc URL
To add a new meeting group to the system, you need to create templates and update configuration in three places:
Create four template files in the templates/ directory following the naming convention:
# Replace <shortname> with your meeting group identifier
templates/invited_<shortname>
templates/observers_<shortname>
templates/meeting_base_<shortname>
templates/minutes_base_<shortname>See TEMPLATES_DOCUMENTATION.md for detailed template examples and variable explanations.
Add your meeting group to both workflow files:
.github/workflows/create-meeting-artifacts-manual.yml.github/workflows/create-meeting-artifacts-scheduled.yml
For manual workflow, add your group to the options list under workflow_dispatch.inputs.meeting_group:
workflow_dispatch:
inputs:
meeting_group:
description: 'Meeting group to create artifacts for'
required: true
type: choice
options:
- uvwasi
- tsc
- build
# ... existing groups ...
- your-new-group # Add your group hereFor scheduled workflow, add your group to the matrix.meeting_group list:
strategy:
matrix:
meeting_group:
- uvwasi
- tsc
- build
# ... existing groups ...
- your-new-group # Add your group hereAdd npm scripts to package.json following this pattern:
{
"scripts": {
"your-meeting-group-meeting": "node create-node-meeting-artifacts.mjs your_meeting_group",
"your-meeting-group-meeting:dev": "node --env-file=.env create-node-meeting-artifacts.mjs your_meeting_group"
}
}Important Notes:
- Use kebab-case for script names:
your-meeting-group-meeting - Use snake_case for the actual group parameter:
your_meeting_group - Always create both production and development (
:dev) versions - The development version uses
--env-file=.envfor local testing
- Clone the repository
- Install dependencies:
npm install - Copy
.env.exampleto.envand configure your credentials - Create meeting artifacts:
npm run <group>-meeting:dev
npm run lint # Run ESLint
npm run lint:fix # Fix ESLint issues automatically
npm run format # Format code with Prettier
npm run format:check # Check code formatting
npm run check # Run both linting and formatting checks# Using npx
npx --env-file=.env . tsc
# Direct execution (with a `.env` file)
node --env-file=.env create-node-meeting-artifacts.mjs tscThe application creates:
- GitHub Issue: Posted to the configured repository with meeting details and agenda
- HackMD Document: Meeting minutes document in Markdown format with collaborative editing
- Console Output: Links to both the created issue and HackMD document
GITHUB_TOKEN: GitHub Personal Access TokenHACKMD_API_TOKEN: HackMD API token for creating and managing documentsGOOGLE_API_KEY: Google Calendar API Key for read-only calendar access
Each meeting_base_<group> file contains:
CALENDAR_FILTER="Meeting Name in Calendar"
CALENDAR_ID="nodejs.org_nr77ama8p7d7f9ajrpnu506c98@group.calendar.google.com"
USER="nodejs"
REPO="repository-name"
GROUP_NAME="Full Group Name"
AGENDA_TAG="agenda-label"
ISSUE_LABEL="optional-issue-label"
HACKMD_TEAM_NAME="openjs-nodejs"
JOINING_INSTRUCTIONS="Meeting join instructions"