Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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