create-mattermost-plugin
Create a new Mattermost plugin from the starter template in the current directory. Use when creating a new plugin from scratch, scaffolding a Mattermost plugin, or bootstrapping a plugin project.
SKILL.mdplugins/plugin-development/skills/create-mattermost-plugin/SKILL.md
GitHubCreate Mattermost Plugin
Scaffold a new Mattermost plugin by cloning the starter template into the current directory and customizing it.
The plugin name is the current folder name (e.g. if pwd is /home/user/mattermost-plugin-foo, the plugin name is mattermost-plugin-foo).
The Go module path is github.com/mattermost/<plugin-name>.
Step 1: Pre-flight
Check if pwd has files beyond dotfiles. If non-empty, warn the user with AskUserQuestion and let them choose to proceed or abort.
Step 2: Scaffold from the starter template
Prefer Option A so GitHub records the new repo as "Generated from mattermost/mattermost-plugin-starter-template" in its UI. Fall back to Option B when gh is unavailable or not authenticated.
Decide which path to take with:
if command -v gh >/dev/null 2>&1 && gh auth status >/dev/null 2>&1; then
# Option A
else
# Option B
fi
Option A — create remote repo from template via gh
Use
AskUserQuestionto gather:- Owner: the GitHub owner for the new repo. Default to
gh api user --jq .login; offermattermostas an alternative for staff plugins. - Visibility:
--public,--private, or--internal.
- Owner: the GitHub owner for the new repo. Default to
Create the remote repo from the template, then clone it into pwd via a tmpdir so the
.git(with the new remote already wired up) is preserved:TMPDIR=$(mktemp -d) trap 'rm -rf "$TMPDIR"' EXIT INT TERM gh repo create "$OWNER/$PLUGIN_NAME" \ --template mattermost/mattermost-plugin-starter-template \ "$VISIBILITY_FLAG" git clone "https://github.com/$OWNER/$PLUGIN_NAME.git" "$TMPDIR" if command -v rsync >/dev/null 2>&1; then rsync -a "$TMPDIR"/ ./ else cp -R "$TMPDIR"/. ./ fi
Option B — fallback when gh is unavailable
Plain shallow clone of the template, no remote:
TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT INT TERM
git clone --depth 1 https://github.com/mattermost/mattermost-plugin-starter-template "$TMPDIR"
rm -rf "$TMPDIR/.git"
if command -v rsync >/dev/null 2>&1; then
rsync -a "$TMPDIR"/ ./
else
cp -R "$TMPDIR"/. ./
fi
Step 3: Customize (follow README "Getting Started" steps)
Derive values:
PLUGIN_NAME= basename of pwd (e.g.mattermost-plugin-foo)MODULE_PATH=github.com/mattermost/$PLUGIN_NAMEPLUGIN_ID=com.mattermost.$PLUGIN_NAME(dots replaced for the id portion aftercom.mattermost.)
Edit
plugin.json: setid,name,description(use the plugin name as a sensible default for name/description, the user can refine later). Updatehomepage_urlandsupport_urlto point tohttps://$MODULE_PATHandhttps://$MODULE_PATH/issues.Replace the old module path everywhere: Use
Grepto find all files containinggithub.com/mattermost/mattermost-plugin-starter-template, thenEditeach withreplace_allto substitute the newMODULE_PATH.
Step 4: Git commit (and push if Option A)
- Option A path:
.gitis already present and tied to the new remote. Stage + commit, then push. - Option B path (no remote):
- If
.gitdoes not exist, rungit initfirst. - If
.gitalready existed before the skill ran (i.e. pwd was an existing repo), useAskUserQuestionto choose: reuse and commit, skip all git ops, or abort.
- If
Commit:
git add -A
git commit -m "Initial plugin scaffold from mattermost-plugin-starter-template"
If Option A, push the initial commit to the new remote:
git push
Step 5: Verify the build
Run make to confirm the scaffolded plugin builds end-to-end. If it fails, surface the error and stop — do not proceed to the summary until the build is green. Analyze the problems shown during the build and address them.
Step 6: Summary
Print what was created and confirm that make completed successfully.