/create-event — Créer un événement Pulumi

VérifiéPrudence

Crée de bout en bout un événement Pulumi (atelier, webinaire, partenaire) : collecte des détails, bundle de page, cartes sociales, issue marketing et PR docs.

Spar Skills Guide Bot
ContenuIntermédiaire
21/09/2026
Claude Code
#event-pages#github-automation#content-scaffolding#pulumi#marketing-ops

Recommandé pour

Synthèse automatique

Crée de bout en bout un événement Pulumi (atelier, webinaire, événement partenaire) : collecte des détails, génération du bundle de page dans content/events/<slug>/, cartes sociales, issue de suivi dans pulumi/marketing et pull request de documentation.

Points forts

  • Découpe le flux en une phase de collecte conversationnelle (étapes 1 à 3) puis délègue le travail mécanique à un sous-agent event-creator, ce qui garde la conversation principale légère
  • Comportement idempotent : détecte une page ou une issue existante via le slug ou une recherche GitHub et bascule en mode mise à jour au lieu de dupliquer
  • Préremplit les champs depuis une URL d'issue pulumi/marketing, un fichier de brief ou du texte libre, et regroupe les questions pour limiter les allers-retours
  • Modes --dry-run, --no-issue, --no-pr et -y permettant de préparer sans écriture GitHub ou de fonctionner sans interaction

Limites

  • Fortement lié à l'écosystème Pulumi : dépôt pulumi/marketing, modèles d'issue, sous-agent event-creator et outil event-meta-image sont supposés présents
  • Nécessite une authentification gh et des droits sur les dépôts de documentation et de marketing
  • Le sous-agent ne peut poser aucune question : une spécification incomplète ou un lancement en mode non interactif applique des valeurs par défaut potentiellement erronées
Quand l'utiliser

À utiliser lorsqu'un membre de l'équipe Pulumi veut créer, annoncer ou mettre à jour une page d'atelier, de webinaire ou d'événement partenaire avec son issue de suivi et sa PR de documentation.

Quand l'éviter

À éviter pour des événements hors Pulumi, ou lorsque les détails (date, intervenants, fuseau horaire) ne sont pas encore assez stabilisés pour être confirmés avant l'exécution du sous-agent.

Analyse de sécurité

Prudence
Score qualité84/100

The skill is a legitimate internal content-authoring workflow with sensible safety defaults (dry-run, explicit confirmation, idempotent update mode, never push master). The residual concerns are capability-level: it needs authenticated `gh`, git, and file writes without declaring them, it can auto-publish GitHub issues/PRs in non-interactive mode, and it delegates to a companion agent file not included for review. That warrants caution rather than safe, and nothing rises to risky.

Points d'attention
  • •No allowed-tools declared, yet the skill depends on `gh` (network + authenticated GitHub writes), git, filesystem writes, and the Task/Agent subagent tool — all capability use is implicit, so effective permissions are whatever the host agent has rather than an explicit allowlist.
  • •Outward-facing actions (creating a marketing GitHub issue and opening a PR) are gated by confirmation by default, but the confirmation is skipped under `-y`/`--non-interactive`, and the skill explicitly says to assume `-y` semantics whenever running non-interactively (e.g. `claude -p` or an eval) — so automated runs can post issues/PRs with no human in the loop.
  • •Step 4 instructs loading and executing an external companion instruction file (`.claude/agents/event-creator.md`) inline if the subagent is unregistered; that file's contents are not shown here and are outside this audit's scope, so the skill's risk depends on an unvetted dependency.
  • •No destructive, obfuscating, or exfiltrating behavior: no `rm -rf`, no `curl | sh`, no base64 payloads, no secrets/tokens sent anywhere; it explicitly forbids inventing form IDs and provides a true dry-run that performs zero GitHub writes.
  • •`-y` / `--non-interactive` mode explicitly skips the Step 3 confirmation gate ('the flag is the user's standing go-ahead'), so outward-facing GitHub writes (issue creation, branch push, PR) can happen with no human review; the skill also says to assume `-y` automatically under `claude -p` or evals.
  • •Step 4 fallback instructs the model to 'read `.claude/agents/event-creator.md` and execute its protocol yourself, inline' — treating a separate file in the repo as an executable instruction channel. If that file is missing, replaced, or tampered with, its contents would be followed with the caller's privileges (indirect prompt-injection surface).
  • •Privilege-bearing tooling is used throughout: `gh issue view/list/create` against pulumi/marketing, git branch creation and PR opening, and filesystem scaffolding under `content/events/`. Legitimate for the stated purpose, but it is real write/network capability rather than a read-only helper.
  • •Content from remote GitHub issue bodies and comments is parsed (regex extraction of HubSpot form IDs / Salesforce campaign IDs) and injected into generated frontmatter and page files — an external, attacker-editable input flows into committed artifacts. Low impact, but unvalidated remote text influences output.
  • •No `allowed-tools` are declared, so the effective permission surface is whatever the host session grants; the skill's safeguards (dry-run, confirmation) are prompt-level only, not enforced by tool restrictions.
Comment cette analyse est faite

Exemples

New webinar from a marketing issue
/create-event https://github.com/pulumi/marketing/issues/4821 — set up the event page and docs PR from this tracking issue
Dry-run from pasted details
Create an event page for our partner workshop "Scaling IaC with Pulumi" on March 12 at 10am ET, 60 minutes, presenter Amy Chen. Use --dry-run so I can review the issue and PR text first.
No-questions automation
/create-event new workshop about Pulumi ESC, schedule a webinar for next month, -y --no-pr

name: create-event description: "Creates a Pulumi event (workshop, webinar, or partner event) end to end: collects details from the prompt or an interactive wizard, scaffolds the content/events/<slug>/ page bundle, generates social cards via event-meta-image, files the tracking issue in pulumi/marketing from its issue template, and opens the docs PR. Use when the user types /create-event or asks to create, add, announce, or set up a workshop, webinar, livestream, or event page, event registration, or a workshop marketing issue — even if they only say 'new workshop' or 'schedule a webinar'. Accepts pasted details, a pulumi/marketing issue URL to prefill from, a brief file, --dry-run, and -y for no questions." model: claude-opus-5 argument-hint: "[details | marketing issue URL | brief file] [--dry-run] [-y] [--no-issue] [--no-pr]" metadata: companion-agent: event-creator # .claude/agents/event-creator.md — executes the confirmed spec (see Step 4)

/create-event — Create a Pulumi event (workshop / webinar / partner event)

You are the front half of a two-part flow. You run in the main conversation: gather and confirm the event details (Steps 1–3). The event-creator subagent (.claude/agents/event-creator.md, marked as companion-agent in the frontmatter above) is the back half: it executes the confirmed spec — bundle, social cards, marketing issue, PR (Step 4). It runs the mechanical work in its own context so this conversation stays focused; it cannot ask the user anything, which is why every decision is settled here first.

Display progress as [Step X/5]. Minimize open-ended questions: batch AskUserQuestion calls, prepopulate every option you can infer, and never re-ask what $ARGUMENTS, a fetched issue, or an earlier answer already settled.

References (read when needed, one level deep):

  • references/event-page.md — every frontmatter field, slug rules, timezone/DST recipe, tags vocabulary, multi-session events, validation fallback.
  • references/marketing-issue.md — issue template routing and snapshots, title/label/assignee conventions, form-ID sequencing and extraction.

[Step 1/5] Parse input and detect context

Parse $ARGUMENTS / the user's message for:

  • Flags: --dry-run (prepare everything, write issue/PR previews, zero GitHub writes — safe to run anytime); -y / --yes / --non-interactive / "no questions" (skip the wizard and the final confirmation, applying the defaults below — also assume this whenever running non-interactively, e.g. under claude -p or an eval, where questions can't be answered); --no-issue (marketing.issue: skip); --no-pr (run.pr: skip).
  • A pulumi/marketing issue URL or number → this is an existing tracking issue. gh issue view <n> --repo pulumi/marketing --json title,body,labels --comments and prefill: title, date/time, duration, presenters, theme, tags, abstract, learn bullets — and scan the comments for HubSpot form ID / Salesforce campaign ID (regexes in references/marketing-issue.md). Set marketing.issue: existing.
  • A file path (brief, Google-Doc export, notes) → read it and extract the same fields.
  • Free text → extract what's there.

Then check for prior art — this skill is idempotent:

  • Derive the slug (lowercase title, spaces → hyphens, alphanumerics and hyphens only; drop filler words only if the user's title is over 60 chars).
  • If content/events/<slug>/index.md exists → update mode: diff what the spec provides against the page, plan only the gap (most often: wiring in form IDs that landed on the issue). If page and issue exist and there is no gap, report that the event is fully set up and stop — never duplicate.
  • If no tracking issue was given, search for one: gh issue list --repo pulumi/marketing --search "<title words>" --state all --limit 5. A match → offer it as the existing issue instead of creating a duplicate.

[Step 2/5] Wizard — fill the gaps only

Ask only for fields still unknown after Step 1, in at most two AskUserQuestion batches (≤4 questions each), with smart defaults marked "(Recommended)". In -y mode skip entirely and take every default. Free-text answers (title, description) that can't be multiple-choice: prefill suggestions from context and let "Other" carry the custom value.

| Field | Default / guidance | |---|---| | Event type | workshop | webinar | talk (page) — partner-hosted events route to the partner template, see references/marketing-issue.md | | Title | ≤ 60 chars (hard limit — trim with the user if over) | | Meta description | 50–160 chars, single sentence; suggest one from the abstract | | Date + time + timezone | No default — this is the one field worth a blocking question outside -y; in -y with no date, use a weekday ~60 days out, 9:00 AM PT, and flag it loudly | | Duration | 60 minutes (90 when asked) | | Location | virtual; otherwise City, ST | | Gated | true for Pulumi-hosted workshops/webinars; false for external/on-demand | | Hosted elsewhere? | If so, set event_url to the https://… URL or /… path; the stub redirects there and is never indexed, no form. Omit for a normal page | | Description (abstract) | 1–2 paragraphs; draft from whatever the user gave and show it | | Learn bullets | Exactly 3 outcome bullets (template convention); draft them | | Presenters | Prefill from git config → data/team/team/<id>.toml (role = its title + ", Pulumi"). Externals: name, role, company, optional photo | | Tags | level: Beginner/Intermediate/Advanced; topics/languages/clouds from the vocabulary in references/event-page.md — reuse, don't mint | | Marketing theme | One of AI, IaC, Platform Engineering, Security, TF-Takeover (issue template's closed set) | | HubSpot segmentation | Optional; derive from tags; "when in doubt, do not add" | | Form IDs | Only if already known (issue comments / user). Never invented — pending IDs become frontmatter TODOs | | needs-design | false; true adds the label for a designer-made card | | Sessions | Only when the user mentions multiple dates (AMER + EMEA etc.) — rules in references/event-page.md |

[Step 3/5] Compose the spec and confirm

Assemble the event spec — the single artifact handed to the agent:

event:
  title: ""            # ≤60 chars
  slug: ""
  event_type: workshop # workshop | webinar | talk
  meta_desc: ""        # 50–160 chars
  date: YYYY-MM-DD
  time: "HH:MM"
  timezone: America/Los_Angeles   # IANA name; agent computes the DST-correct offset
  duration: 60 minutes
  location: virtual
  gated: true
  event_url: ""        # optional; https://… or /… when hosted elsewhere, else omit
  featured: false
  description: |
    ...
  learn: ["", "", ""]
  presenters:
    - {name: "", role: "", pulumi: true, photo: ""}   # role/photo auto-resolved for Pulumi folks
  tags: {level: Beginner, topics: [], languages: [], clouds: []}
  sessions: []         # optional; see references/event-page.md
marketing:
  theme: ""            # AI | IaC | Platform Engineering | Security | TF-Takeover
  issue: create        # create | existing | skip
  issue_url: ""
  needs_design: false
  hubspot_segmentation: {}
  form: {hubspot_form_id: "", salesforce_campaign_id: ""}
run:
  dry_run: false
  images: auto         # auto | event-bound | standalone | skip
  pr: create           # create | skip
  branch: event/<slug>

Show the user the spec plus a short preview: the would-be issue title ([YYYY-MM-DD]: <Title> (<presenter first name>)), the files to be created, and whether issue/PR will really be created. Then gate:

  • Dry-run → proceed without asking (nothing outward happens).
  • -y → proceed (the flag is the user's standing go-ahead), but still show the preview.
  • Otherwise → one AskUserQuestion: "Create it now (issue + PR)" / "Dry run first (Recommended for a first pass)" / "Cancel". Creating a GitHub issue and PR is outward-facing — never do it silently.

[Step 4/5] Delegate to the event-creator agent

Spawn the event-creator subagent (Task/Agent tool, subagent_type: event-creator), passing the spec verbatim as its task plus one line: "Execute this event spec per your protocol." Wait for the result — the next step depends on it.

If that agent type isn't registered in this session, don't stall: read .claude/agents/event-creator.md and execute its protocol yourself, inline, honoring the same hard rules (dry-run = zero GitHub writes; never push master; never invent form IDs).

[Step 5/5] Relay the report and next steps

Relay the agent's structured report, then close the loop:

  1. Preview before shipping: the rendered PNGs (or the build's auto-card), and make serve → http://localhost:1313/events/<slug>/.
  2. Dry-run → the previews live in .context/create-event/<slug>/; rerun without --dry-run to create the issue and PR.
  3. Pending form IDs → gated page ships with TODOs; watch the tracking issue for marketing's comment, then rerun /create-event <issue-url> to wire them in (update mode).
  4. PR is a draft → mark ready after previewing; each ready-transition fires a full review, so do it once.
  5. Suggest /docs-review for a content pass when the description was substantially drafted by the wizard.

Error handling

  • Slug collision with a different event (same slug, different topic) → suffix the slug (-2026, or the month) and tell the user.
  • gh unauthenticated / marketing repo unreachable → finish everything local, write the issue preview, and hand the user the exact gh issue create command to run.
  • Date in the past → confirm it's intentional (recordings/on-demand pages are legitimate).
  • User cancels at Step 3 → keep nothing outward; offer to save the spec to .context/create-event/<slug>/spec.yaml so a later run can resume from it.

Du fichier au premier essai

Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.

Consulter la source et ses fichiers annexes

Ce téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.

1. Télécharger le fichier

Télécharger SKILL.md

Depuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/create-event-create-a-pulumi-event-muar2zpb/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.

Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.

mkdir -p '.skill-downloads/create-event-create-a-pulumi-event-muar2zpb' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/create-event-create-a-pulumi-event-muar2zpb/download' --output '.skill-downloads/create-event-create-a-pulumi-event-muar2zpb/SKILL.md.part' && mv '.skill-downloads/create-event-create-a-pulumi-event-muar2zpb/SKILL.md.part' '.skill-downloads/create-event-create-a-pulumi-event-muar2zpb/SKILL.md'

2. Vérifier les prérequis

Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.

Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.

Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.

3. Charger la skill

Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.

Claude Code
test -f '.skill-downloads/create-event-create-a-pulumi-event-muar2zpb/SKILL.md' && test -s '.skill-downloads/create-event-create-a-pulumi-event-muar2zpb/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/create-event' && cp -R '.skill-downloads/create-event-create-a-pulumi-event-muar2zpb' '.claude/skills/create-event'

OpenSkills

OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.

Installation officielle d’OpenSkills
openskills install './.skill-downloads/create-event-create-a-pulumi-event-muar2zpb'

openskills read 'create-event-create-a-pulumi-event-muar2zpb'

La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.

Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.

openskills sync

Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.

4. Faire un premier essai

Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :

Lis .skill-downloads/create-event-create-a-pulumi-event-muar2zpb/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.

Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.

Skills similaires