| name | mattermost-timeline-dev-smoke |
| description | Boot, provision, deploy, and smoke-test the local Mattermost preview stack for this timeline plugin. Use when reproducing webhook visibility reports, validating RHS event rendering, confirming channel/team IDs, or testing channel-scoped timeline behavior against a real Mattermost server. |
Mattermost Timeline Dev Smoke
Dev stack
Use docker-compose.dev.yml from the repository root. It runs mattermost/mattermost-preview:latest on linux/amd64, publishes ${MATTERMOST_DEV_PORT:-18065}:8065, and persists both Mattermost data and bundled Postgres data with named Docker volumes.
Default local URL:
http://localhost:18065
Default provisioned account:
admin@example.com / Password1!
Default team:
Example Org (example-org)
Bootstrap workflow
From the repository root, run the bundled helper:
.agents/skills/mattermost-timeline-dev-smoke/scripts/bootstrap-dev-mattermost.sh
The script:
- runs
docker compose -f docker-compose.dev.yml up -d when the target URL is not already reachable
- waits for
/api/v4/system/ping
- creates the first admin through
POST /api/v4/users when login fails
- logs in through
POST /api/v4/users/login
- creates the
example-org team if missing
- prints the exact
make deploy and smoke-test commands
Override these env vars only when needed:
MATTERMOST_DEV_PORT=18066
MATTERMOST_DEV_SITE_URL=http://localhost:18066
MM_ADMIN_USERNAME=admin@example.com
MM_ADMIN_PASSWORD='Password1!'
MM_ADMIN_USER=admin
MATTERMOST_DEV_TEAM=example-org
MATTERMOST_DEV_TEAM_DISPLAY='Example Org'
COMPOSE_FILE=docker-compose.dev.yml
TIMELINE_WEBHOOK_SECRET='timeline-smoke-secret'
Do not stop or delete an already-running Mattermost dev instance unless the user explicitly asks. Prefer updating/reusing it so existing smoke-test data survives.
Deploy workflow
Build and deploy through the repository Makefile after the stack is reachable:
MM_SERVICESETTINGS_SITEURL=http://localhost:18065 \
MM_ADMIN_USERNAME=admin@example.com \
MM_ADMIN_PASSWORD='Password1!' \
make deploy
Then configure the plugin's webhook secret in System Console, or set it with the helper:
MM_SERVICESETTINGS_SITEURL=http://localhost:18065 \
MM_ADMIN_USERNAME=admin@example.com \
MM_ADMIN_PASSWORD='Password1!' \
TIMELINE_WEBHOOK_SECRET='timeline-smoke-secret' \
.agents/skills/mattermost-timeline-dev-smoke/scripts/configure-plugin.py
Timeline webhook helper
Use the deterministic helper to send a team-wide or channel-scoped event and read it back through the plugin API:
MM_SERVICESETTINGS_SITEURL=http://localhost:18065 \
MM_ADMIN_USERNAME=admin@example.com \
MM_ADMIN_PASSWORD='Password1!' \
TIMELINE_WEBHOOK_SECRET='timeline-smoke-secret' \
.agents/skills/mattermost-timeline-dev-smoke/scripts/post-sample-event.py
Env vars:
MM_SERVICESETTINGS_SITEURL=http://localhost:18065
MM_ADMIN_USERNAME=admin@example.com
MM_ADMIN_PASSWORD='Password1!'
MATTERMOST_DEV_TEAM=example-org
MATTERMOST_DEV_CHANNEL=town-square
TIMELINE_WEBHOOK_SECRET='timeline-smoke-secret'
TIMELINE_CHANNEL_SCOPE=false
TIMELINE_TEAM_IDENTIFIER=example-org
TIMELINE_CHANNEL_IDENTIFIER=town-square
TIMELINE_EXTERNAL_ID=timeline-smoke-<generated>
Set TIMELINE_CHANNEL_SCOPE=true to send channels: [<channel name>]. By default the helper posts with the team name/slug and channel name to exercise the same path users copy from URLs. Override TIMELINE_TEAM_IDENTIFIER or TIMELINE_CHANNEL_IDENTIFIER with 26-character Mattermost IDs when you need to verify ID-only behavior. The helper then fetches /plugins/ch.icorete.mattermost-timeline/api/v1/events with the resolved ID context and prints the event id plus channel URL.
Browser smoke checklist
Use the local Mattermost UI after deployment:
- login with the provisioned admin
- open
http://localhost:18065/example-org/channels/town-square
- confirm the channel header shows the Event Feed icon button
- click the Event Feed button and confirm the right-hand sidebar opens with the title
Event Feed
- run
post-sample-event.py with TIMELINE_CHANNEL_SCOPE=false
- confirm the RHS shows the new
Timeline smoke test event in town-square
- run
post-sample-event.py with TIMELINE_CHANNEL_SCOPE=true
- confirm the channel-scoped event appears in
town-square
- switch to another channel if available and confirm only the team-wide event remains visible there
Local quality gates
Before claiming the smoke harness is ready, run the focused gates touched by this setup:
docker compose -f docker-compose.dev.yml config
cd server && go test -race ./...
Run cd webapp && npm run lint && npm run test && npm run build, make manifest-check, and make dist when plugin code or packaging changed.