Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Required: GitHub Token (Needs "repo" permissions)
# GITHUB_TOKEN=your_personal_access_token_or_org_token

# Required: HackMD Configuration
# Required: HackMD API token (the HackMD team is configured per meeting in
# meetings/<group>.meeting.json)
# HACKMD_API_TOKEN=your_hackmd_api_token
# HACKMD_TEAM_NAME=your_hackmd_team_name_optional # Defaults to your own personal space
3 changes: 1 addition & 2 deletions .github/workflows/create-meeting-artifacts-manual.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ jobs:
id: read-vars
run: |
meeting_group="${{ inputs.meeting_group }}"
user=$(grep '^USER=' "templates/meeting_base_${meeting_group}" | cut -d'=' -f2 | xargs)
user=$(jq -r '.github.owner' "meetings/${meeting_group}.meeting.json")
echo "user=$user" >> $GITHUB_OUTPUT

- name: Create GitHub App Token
Expand All @@ -66,7 +66,6 @@ jobs:
with:
name: meeting-artifacts-${{ inputs.meeting_group || 'tsc' }}
path: |
~/.make-node-meeting/
*.md
retention-days: 7
if-no-files-found: ignore
2 changes: 1 addition & 1 deletion .github/workflows/create-meeting-artifacts-scheduled.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
- name: Get config basenames
id: set-matrix
run: |
CONFIGS=$(find templates/ -maxdepth 1 -type f -name 'meeting_base_*' | jq -R -s -c 'split("\n")[:-1] | map(sub(".*meeting_base_";""))')
CONFIGS=$(find meetings/ -maxdepth 1 -type f -name '*.meeting.json' | jq -R -s -c 'split("\n")[:-1] | map(sub(".*/"; "") | sub("\\.meeting\\.json$"; ""))')
echo "configs=$CONFIGS" >> $GITHUB_OUTPUT
create-artifacts:
Expand Down
169 changes: 65 additions & 104 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,116 +29,77 @@ A modern Node.js application that creates GitHub issues and HackMD documents for
```
create-node-meeting-artifacts/
├── src/
│ ├── config.mjs # Configuration management
│ ├── config.mjs # Environment configuration (API tokens)
│ ├── constants.mjs # Application constants
│ ├── github.mjs # GitHub API integration
│ ├── calendar.mjs # Calendar integration
│ ├── meeting.mjs # Meeting operations
│ └── utils.mjs # Utility functions
├── templates/ # Meeting templates
│ ├── hackmd.mjs # HackMD API integration
│ ├── meeting.mjs # Config loading + template rendering
│ ├── types.d.ts # Type definitions
│ └── utils/ # Date and URL helpers
├── meetings/ # One <group>.meeting.json per meeting group
├── templates/
│ └── meeting.mustache # Single shared template (issue + minutes)
├── .nvmrc # Node.js version
├── .env.example # Environment variables example
├── .env.example # Environment variables example
├── create-node-meeting-artifacts.mjs # Main application
├── TEMPLATES_DOCUMENTATION.md # Template creation guide
├── TEMPLATES_DOCUMENTATION.md # Meeting config reference
└── README.md # This file
```

## 📝 Meeting Templates
## 📝 Meeting Configurations

Meeting configurations are stored in the `templates/` directory. Each meeting group requires four template files:
Every meeting group is described by a single JSON file in the [`meetings/`](./meetings)
directory, named `<group>.meeting.json` (for example, `tsc.meeting.json`). Each
file follows an **identical format**, and the same shared
[`templates/meeting.mustache`](./templates/meeting.mustache) renders both the
GitHub issue and the HackMD minutes for every group — so every meeting's
artifacts look the same.

- `invited_<group>`: List of invited attendees (GitHub team mentions)
- `observers_<group>`: List of observers with their details
- `meeting_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_DOCUMENTATION.md).

### Template Variables

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

## ➕ Adding New Meeting Groups

To add a new meeting group to the system, you need to create templates and update configuration in three places:

### 1. Create Template Files

Create four template files in the `templates/` directory following the naming convention:

```bash
# Replace <shortname> with your meeting group identifier
templates/invited_<shortname>
templates/observers_<shortname>
templates/meeting_base_<shortname>
templates/minutes_base_<shortname>
```json
{
"name": "Technical Steering Committee (TSC)",
"host": "Node.js",
"calendar": {
"filter": "Node.js TSC Meeting",
"url": "https://calendar.google.com/calendar/ical/<id>/public/basic.ics"
},
"github": {
"owner": "nodejs",
"repo": "TSC"
},
"hackmd": {
"team": "openjs-nodejs"
},
"joining": {
"participant": "https://zoom.us/j/611357642",
"observer": "https://www.youtube.com/c/nodejs+foundation/live"
},
"invited": ["@nodejs/tsc"]
}
```

See [TEMPLATES_DOCUMENTATION.md](./TEMPLATES_DOCUMENTATION.md) for detailed template examples and variable explanations.

### 2. Update GitHub Actions Workflows
See [TEMPLATES_DOCUMENTATION.md](./TEMPLATES_DOCUMENTATION.md) for a full reference
of every field, including the optional ones (`github.agendaLabel`,
`github.issueLabels`, `joining.notes`, `observers`, and curated `agenda` sections).

Add your meeting group to both workflow files:

- `.github/workflows/create-meeting-artifacts-manual.yml`
- `.github/workflows/create-meeting-artifacts-scheduled.yml`
## ➕ Adding New Meeting Groups

For manual workflow, add your group to the `options` list under `workflow_dispatch.inputs.meeting_group`:
Adding a group is a single step: create its config file.

```yaml
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
```
### 1. Create the meeting config

For scheduled workflow, add your group to the `matrix.meeting_group` list:

```yaml
strategy:
matrix:
meeting_group:
- uvwasi
- tsc
- build
# ... existing groups ...
- your-new-group # Add your group here
```
Add `meetings/<group>.meeting.json` following the format above. The filename stem
(`<group>`) is what you pass on the command line and to the workflows.

### 3. Update Package.json Scripts
### 2. That's it

Add npm scripts to `package.json` following this pattern:
The GitHub Actions workflows discover meeting groups automatically:

```json
{
"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"
}
}
```
- The **scheduled** workflow builds its matrix by listing `meetings/*.meeting.json`.
- The **manual** workflow reads the owner straight from the JSON file.

**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
No workflow edits and no `package.json` scripts are needed.

## 🏗️ Development

Expand All @@ -147,7 +108,7 @@ Add npm scripts to `package.json` following this pattern:
1. Clone the repository
2. Install dependencies: `npm install`
3. Copy `.env.example` to `.env` and configure your credentials
4. Create meeting artifacts: `npm run <group>-meeting:dev`
4. Create meeting artifacts: `npm run dev -- <group>` (e.g. `npm run dev -- tsc`)

### Code Quality

Expand All @@ -169,8 +130,17 @@ npx --env-file=.env . tsc

# Direct execution (with a `.env` file)
node --env-file=.env create-node-meeting-artifacts.mjs tsc

# Preview the rendered issue without creating anything
node --env-file=.env create-node-meeting-artifacts.mjs tsc --dry-run
```

The CLI accepts the following flags:

- `--dry-run`: render and print the issue without creating an issue or document
- `--force`: create a new issue/document even if one already exists
- `--verbose`: enable debug logging from the GitHub client

## 📂 Output

The application creates:
Expand All @@ -188,17 +158,8 @@ The application creates:
- `GITHUB_TOKEN`: GitHub Personal Access Token
- `HACKMD_API_TOKEN`: HackMD API token for creating and managing documents

### Meeting Base Configuration
### Meeting Configuration

Each `meeting_base_<group>` file contains:

```bash
CALENDAR_FILTER="Meeting Name in Calendar"
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"
```
Each meeting is configured by a `meetings/<group>.meeting.json` file. See
[TEMPLATES_DOCUMENTATION.md](./TEMPLATES_DOCUMENTATION.md) for the complete field
reference.
Loading
Loading