Repository navigation
feat(core): in-app previews (Slack, HubSpot, HTML) and workflow dry runs - #697
Conversation
…TML renderers, dry-run workflows) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGC9SnFuqdjX2xH2qeu8vw
…dry runs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGC9SnFuqdjX2xH2qeu8vw
A deal named "*x* <!channel>" interpolated into a Slack template would format or ping the channel. The mrkdwn template filter escapes record data (entities, formatting fences, backticks) and the Slack-posting examples use it; the definition's own markup is untouched. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGC9SnFuqdjX2xH2qeu8vw
There was a problem hiding this comment.
If your organization's extra usage balance is empty, an organization admin can add extra usage credits at claude.ai/admin-settings/usage. If its monthly spend limit was reached, an admin can raise it on the same page. If neither applies, contact Anthropic support.
Once extra usage is available, someone with write access to this repository can comment @claude review on this pull request to trigger a review.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 2348cde. Configure here.
|
ADR reconciliation needed after Stack A/B — drafted with Claude Code at Sean's request Severity: cross-ref only.
|
…renderers Sections 16 and 19 said "renderers are not in v0.1". With previews added, say which: the Slack, HubSpot and HTML renderers are preview renderers that run inside the app; the deployed host renderer is still not built. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGC9SnFuqdjX2xH2qeu8vw
…n-5, admin-routes-5, earlier levels); neutral names in previews Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGC9SnFuqdjX2xH2qeu8vw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGC9SnFuqdjX2xH2qeu8vw
|




Stack 6 of 9. Stacked on #696.
Summary
These show how an integration appears inside the app it touches, before anything is installed.
renderers/for Slack Block Kit, the HubSpot UI-extension component tree, and HTML. A definition's UI surfaces become what that app would display.preview.js). A workflow runs against sample data with no writes. The preview reports every call it would make and what each message would look like.mrkdwntemplate filter escapes record data. Before this, a deal named*x* <!channel>would have formatted the message or pinged the channel. The Slack examples now use the filter.PR 8 checks the HubSpot component names against
@hubspot/ui-extensions.Test plan
nextat this commit. Nothing new fails.Generated by Claude Code
Note
Medium Risk
Changes how Slack message text is built in production via the new
mrkdwnfilter and adds substantial preview/dry-run code paths that must stay non-executing and XSS-safe; misconfiguration could still leak unescaped template content if authors omit the filter.Overview
Adds in-app preview rendering for data-defined integrations so authors can see UI surfaces and workflow side effects before anything is deployed to HubSpot, Slack, or other hosts.
New
renderers/turns resolved view trees into Slack Block Kit, a HubSpot UI-extension component tree, and sandboxed HTML (escaped data, http(s)-only links, Block Kit limits).previewSurfaceandpreviewWorkflowreuse the same query/view/workflow paths as production but swap inrecordingPortsso capability calls are recorded and answered from fixtures—no real API writes. Public exports includeviewToSlack,viewToHubSpot,viewToHtml,decodeAction, and related helpers; ADR-063 and the package README document preview vs future deployed host renderers.Slack safety: a new
mrkdwntemplate filter escapes interpolated record fields in outbound messages; HubSpot/Asana Slack examples now pipe user-controlled names/subjects through it. View-to-Slack rendering also escapes record-driven text and encodesuserActionbutton payloads for round-trip decoding.Coverage is a large
renderers.test.jssuite (escaping, limits, dry runs across examples, network traps).Reviewed by Cursor Bugbot for commit 20e3e54. Bugbot is set up for automated code reviews on this repo. Configure here.
📦 Published PR as canary version:
2.0.0--canary.697.20e3e54.0✨ Test out this PR locally via:
npm install @friggframework/admin-scripts@2.0.0--canary.697.20e3e54.0 npm install @friggframework/core@2.0.0--canary.697.20e3e54.0 npm install @friggframework/devtools@2.0.0--canary.697.20e3e54.0 npm install @friggframework/eslint-config@2.0.0--canary.697.20e3e54.0 npm install @friggframework/prettier-config@2.0.0--canary.697.20e3e54.0 npm install @friggframework/schemas@2.0.0--canary.697.20e3e54.0 npm install @friggframework/serverless-plugin@2.0.0--canary.697.20e3e54.0 npm install @friggframework/test@2.0.0--canary.697.20e3e54.0 npm install @friggframework/ui@2.0.0--canary.697.20e3e54.0 # or yarn add @friggframework/admin-scripts@2.0.0--canary.697.20e3e54.0 yarn add @friggframework/core@2.0.0--canary.697.20e3e54.0 yarn add @friggframework/devtools@2.0.0--canary.697.20e3e54.0 yarn add @friggframework/eslint-config@2.0.0--canary.697.20e3e54.0 yarn add @friggframework/prettier-config@2.0.0--canary.697.20e3e54.0 yarn add @friggframework/schemas@2.0.0--canary.697.20e3e54.0 yarn add @friggframework/serverless-plugin@2.0.0--canary.697.20e3e54.0 yarn add @friggframework/test@2.0.0--canary.697.20e3e54.0 yarn add @friggframework/ui@2.0.0--canary.697.20e3e54.0