feat: add shared Product Pulse composite action [ED-24831]#42
Merged
Conversation
Centralizes the product-pulse logic (Cursor Agent generation, JSON parsing, Slack notification) so elementor and elementor-pro can share one implementation instead of maintaining duplicate ~300-line workflows. Callers keep their own repo-specific product-area prompt and pass it in via the prompt-file input. Ref: ED-24831 Co-authored-by: Cursor <cursoragent@cursor.com>
3 tasks
Move ${{ }} expressions (inputs.pr-number, github.action_path,
steps.update.outputs.*, github.event.pull_request.html_url) out of
inline run: script bodies and into env: blocks, addressing CodeQL
code-injection findings in the product-pulse action.
Ref: ED-24831
Co-authored-by: Cursor <cursoragent@cursor.com>
Moves the ~85% of the prompt that was byte-identical between elementor and elementor-pro (goal, decision criteria, type classification, writing style, output format, examples, edge cases) into prompt-template.md, owned by this action. Callers now only supply a small product-areas-file with the three things that genuinely differ per repo: PRODUCT_NAME, the PRODUCT_AREAS file-path mapping, and the PRODUCT_ENUM list. A new render-prompt.py substitutes these into the shared template before it's handed to Cursor Agent. Replaces the prompt-file/default-product inputs accordingly. Ref: ED-24831 Co-authored-by: Cursor <cursoragent@cursor.com>
3 tasks
…name Per-repo file-path -> product-area mapping was more granularity than needed for a Slack pulse feed. The product field is now always the calling repo's name (e.g. "Elementor" or "Elementor Pro"), passed as a plain product-name input instead of a product-areas-file. This removes the whole Product Area Detection section from the shared prompt, drops the AI's product classification (and its validation), and lets callers drop their per-repo areas file entirely. Ref: ED-24831 Co-authored-by: Cursor <cursoragent@cursor.com>
annab1
added a commit
to elementor/elementor
that referenced
this pull request
Jul 13, 2026
The shared action (elementor/elementor-editor-github-actions#42) no longer detects a per-file product area - it just tags every pulse with the calling repo's product name. Passes 'Elementor' directly instead of maintaining a product-pulse-areas.md mapping file. Ref: ED-24831 Co-authored-by: Cursor <cursoragent@cursor.com>
Adds a "Get build artifact link" step that looks up the most recent successful run of the caller repo's Build workflow (build.yml) for the PR's head SHA, resolves its uploaded artifact, and appends a "Build Artifact" link to the Slack notification footer alongside the PR # and Jira ticket links. Skips gracefully if no matching run or artifact is found. Ref: ED-24831 Co-authored-by: Cursor <cursoragent@cursor.com>
Ntnelbaba
previously approved these changes
Jul 14, 2026
Ref: ED-24831 Co-authored-by: Cursor <cursoragent@cursor.com>
…ng it wp-env installs the Elementor plugin but does not reliably auto-activate it, causing the Performance flow CI job to fail intermittently at the "Validating elementor being activated" step. Actively activate the plugin (idempotent) instead of just checking its state. Cherry-picked from ED-24451 (5444eeb). Co-authored-by: Cursor <cursoragent@cursor.com>
Elementor's latest release requires WordPress 6.8+ ("Current WordPress
version (6.6) does not meet minimum requirements for Elementor"), so the
Performance flow job's plugin activation was silently failing even
though wp-env reported the plugin as active. Pin to the current stable
core (7.0.1) instead of the outdated 6.6.
Co-authored-by: Cursor <cursoragent@cursor.com>
Ntnelbaba
approved these changes
Jul 14, 2026
Ntnelbaba
left a comment
Contributor
There was a problem hiding this comment.
The bundled JS can be removed by moving to latest node version, but this is not critical ATM
annab1
added a commit
to elementor/elementor
that referenced
this pull request
Jul 15, 2026
…s [ED-24831] (#36486) ## Summary - Replaces this repo's inline product-pulse workflow (merged in #36412, still on the unpatched version) with a thin caller of `elementor/elementor-editor-github-actions/actions/product-pulse` — see [elementor/elementor-editor-github-actions#42](elementor/elementor-editor-github-actions#42) - The generic prompt (goal, decision criteria, type classification, writing style, output format, examples) now lives in that action's shared `prompt-template.md`, since it was ~85% byte-identical to elementor-pro's copy - Passes `product-name: 'Elementor'` directly — no per-file-path product-area mapping; every pulse from this repo is simply tagged "Elementor" - Removes `.github/extract-pulse-json.py` (now lives in the shared action's `scripts/`) - Companion PR in elementor-pro: [elementor/elementor-pro#7275](elementor/elementor-pro#7275) ## Test plan - [ ] Merge a chore-only PR after this lands and confirm no Slack pulse is posted - [ ] Merge a feature/fix PR and confirm the Slack pulse fires tagged "Elementor" with the correct type-based header - [ ] Verify `elementor/elementor-editor-github-actions#42` is merged before merging this PR (the `@main` ref must resolve) <!--start_gitstream_placeholder--> ### ✨ PR Description ## 1. Problem & Context Extracting product pulse logic into a shared reusable GitHub Action (ED-24831) reduces duplication and maintenance burden across Elementor repositories. ## 2. What Changed (Where) * `.github/workflows/product-pulse.yml`: Replaced 270+ lines of inline bash/script logic with single composable action call; added `actions: read` permission * `.github/extract-pulse-json.py`: Removed (logic now encapsulated in shared action) ## 3. How It Works Workflow now delegates entire pipeline to `elementor/elementor-editor-github-actions/actions/product-pulse@main` via single step, passing PR metadata and secrets as inputs. Shared action owns PR fetching, Cursor API calls, JSON parsing, and Slack notifications. ## 4. Risks Action availability: shared action repo must stay stable/accessible. Credential management: ensure `elementor-editor-github-actions` repo has equivalent secret handling. No rollback plan if shared action breaks—mitigate with pinning to specific commit hash instead of `@main`. _Generated by LinearB AI and added by gitStream._ <sub>AI-generated content may contain inaccuracies. Please verify before using. 💡 **Tip:** You can customize your AI Description using **Guidelines** [Learn how](https://docs.gitstream.cm/automation-actions/#describe-changes)</sub> <!--end_gitstream_placeholder--> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Netanel Baba <50736016+Ntnelbaba@users.noreply.github.com> Co-authored-by: ElementorBot <48412871+elementorbot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
actions/product-pulse, a composite action that centralizes the AI-driven product pulse workflow (Cursor Agent generation + Slack notification) previously duplicated inelementorandelementor-proproduct-pulse-prompt.mdfiles, so it now lives here inprompt-template.mdproduct-name(e.g."Elementor"or"Elementor Pro") plus Cursor/Slack credentials;render-prompt.pysubstitutes it into the shared template. No per-file-path product-area detection — every pulse from a given repo is tagged with that repo's product nameprintf '%s'handling for%-containing diffs, and passing the (up to 500KB) prompt via file instead of a CLI argument to avoidARG_MAXissuesFollow-up
elementor-proandelementorare both updated to call this action with their ownproduct-nameinstead of maintaining full copies of the prompt/workflow: elementor/elementor-pro#7275, elementor/elementor#36486Test plan
@main)Jira
ED-24831
Made with Cursor
✨ PR Description
1. Problem & Context
Introduces a reusable Product Pulse composite action (ED-24831) to share PR-to-Slack notification logic across Elementor repos. Uses Cursor Agent AI to classify merged PRs as product-facing and generates user-friendly pulse updates.
2. What Changed (Where)
actions/product-pulse/action.ymlactions/product-pulse/scripts/extract-pulse-json.pyactions/product-pulse/scripts/render-prompt.pyactions/product-pulse/prompt-template.mdactions/product-pulse/README.mdactions/setup-elementor-env/main.tsvalidate plugin is-activetoactivate plugin— proactive instead of reactive.github/workflows/test-actions.yml3. How It Works
Workflow: checkout → fetch PR+diff → install Cursor CLI → render prompt with product name → invoke Cursor Agent with 5min timeout → extract JSON (skip/title/description/type/reason) → parse Slack context (Loom, Jira URLs) → post formatted block message or error notification on failure. Handles parse failures gracefully by trying raw output, then Python extractor, then exit with error.
4. Risks
AI output parsing fragile if Cursor Agent returns wrapped JSON or malformed structure—mitigated by
extract-pulse-json.pyfallback and timeout handling. Slack integration silent-fails withcontinue-on-error: true, masking delivery issues. No rate limiting on Slack API calls.Generated by LinearB AI and added by gitStream.
AI-generated content may contain inaccuracies. Please verify before using.
💡 Tip: You can customize your AI Description using Guidelines Learn how