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.
Meeting Group | Production Command | Development Command |
---|---|---|
UVWASI | npm run uvwasi-meeting |
npm run uvwasi-meeting:dev |
TSC | npm run tsc-meeting |
npm run tsc-meeting:dev |
Build | npm run build-meeting |
npm run build-meeting:dev |
Diagnostics | npm run diag-meeting |
npm run diag-meeting:dev |
Diagnostics Deep Dive | npm run diag-deepdive-meeting |
npm run diag-deepdive-meeting:dev |
TypeScript | npm run typescript-meeting |
npm run typescript-meeting:dev |
Release | npm run release-meeting |
npm run release-meeting:dev |
Cross Project Council | npm run cross-project-council-meeting |
npm run cross-project-council-meeting:dev |
Modules | npm run modules-meeting |
npm run modules-meeting:dev |
Tooling | npm run tooling-meeting |
npm run tooling-meeting:dev |
Security WG | npm run security-wg-meeting |
npm run security-wg-meeting:dev |
Next-10 | npm run next-10-meeting |
npm run next-10-meeting:dev |
Package Maintenance | npm run package-maintenance-meeting |
npm run package-maintenance-meeting:dev |
Package Metadata Interop | npm run package-metadata-interop-meeting |
npm run package-metadata-interop-meeting:dev |
Ecosystem Report | npm run ecosystem-report-meeting |
npm run ecosystem-report-meeting:dev |
Sustainability Collab | npm run sustainability-collab-meeting |
npm run sustainability-collab-meeting:dev |
Standards | npm run standards-meeting |
npm run standards-meeting:dev |
Security Collab | npm run security-collab-meeting |
npm run security-collab-meeting:dev |
Loaders | npm run loaders-meeting |
npm run loaders-meeting:dev |
Web Server Frameworks | npm run web-server-frameworks-meeting |
npm run web-server-frameworks-meeting:dev |
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 here
For 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 here
Add 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=.env
for local testing
- Clone the repository
- Install dependencies:
npm install
- Copy
.env.example
to.env
and 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 npm scripts (recommended)
npm run tsc-meeting:dev
# Direct execution
node --env-file=.env create-node-meeting-artifacts.mjs tsc
The 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="[email protected]"
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"