@funnelsgrove/cli 0.1.14 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/contracts/step-contract-v2.json +733 -0
  2. package/dist/analyticsOutput.d.ts +30 -15
  3. package/dist/analyticsOutput.js +45 -28
  4. package/dist/apiClient.d.ts +85 -0
  5. package/dist/apiClient.js +225 -8
  6. package/dist/cli.d.ts +149 -1
  7. package/dist/cli.js +1232 -71
  8. package/dist/diagnosticOutput.d.ts +42 -0
  9. package/dist/diagnosticOutput.js +83 -0
  10. package/dist/docsOutput.d.ts +19 -0
  11. package/dist/docsOutput.js +73 -0
  12. package/dist/docsTransaction.d.ts +81 -0
  13. package/dist/docsTransaction.js +1755 -0
  14. package/dist/funnelValidation.d.ts +14 -0
  15. package/dist/funnelValidation.js +297 -0
  16. package/dist/localSync.d.ts +79 -0
  17. package/dist/localSync.js +428 -53
  18. package/dist/projectValidator.d.ts +27 -0
  19. package/dist/projectValidator.js +208 -0
  20. package/dist/reskin.js +27 -1
  21. package/dist/stepContractMigration.d.ts +71 -0
  22. package/dist/stepContractMigration.js +1323 -0
  23. package/dist/templateDocs.js +8 -25
  24. package/docs-release-history.json +66 -0
  25. package/legacy-docs-catalog.json +1012 -0
  26. package/package.json +13 -4
  27. package/template_docs/.funnelsgrove-docs.json +144 -0
  28. package/template_docs/AGENTS.md +30 -58
  29. package/template_docs/CLAUDE.md +0 -2
  30. package/template_docs/docs/funnelsgrove/START-HERE.md +73 -0
  31. package/template_docs/docs/funnelsgrove/contracts/analytics-events.md +59 -0
  32. package/template_docs/docs/funnelsgrove/contracts/content-answers.md +44 -0
  33. package/template_docs/docs/funnelsgrove/contracts/flow-routing.md +41 -0
  34. package/template_docs/docs/funnelsgrove/contracts/payments.md +42 -0
  35. package/template_docs/docs/funnelsgrove/contracts/step-metadata.md +57 -0
  36. package/template_docs/docs/funnelsgrove/migrations/step-contract-v3.md +39 -0
  37. package/template_docs/docs/funnelsgrove/qa/analytics.md +43 -0
  38. package/template_docs/docs/funnelsgrove/qa/local.md +42 -0
  39. package/template_docs/docs/funnelsgrove/qa/paywall-checkout.md +55 -0
  40. package/template_docs/docs/funnelsgrove/qa/publish.md +32 -0
  41. package/template_docs/docs/funnelsgrove/recipes/add-experiment.md +34 -0
  42. package/template_docs/docs/funnelsgrove/recipes/add-step.md +33 -0
  43. package/template_docs/docs/funnelsgrove/recipes/edit-step.md +31 -0
  44. package/template_docs/docs/funnelsgrove/steps/INDEX.md +26 -0
  45. package/template_docs/docs/funnelsgrove/steps/cancellation_offer.md +112 -0
  46. package/template_docs/docs/funnelsgrove/steps/checkout.md +120 -0
  47. package/template_docs/docs/funnelsgrove/steps/form_input.md +115 -0
  48. package/template_docs/docs/funnelsgrove/steps/intro_hero.md +110 -0
  49. package/template_docs/docs/funnelsgrove/steps/multi_select_choice.md +123 -0
  50. package/template_docs/docs/funnelsgrove/steps/paywall_offer.md +115 -0
  51. package/template_docs/docs/funnelsgrove/steps/progress_interstitial.md +111 -0
  52. package/template_docs/docs/funnelsgrove/steps/purchase_completed.md +117 -0
  53. package/template_docs/docs/funnelsgrove/steps/single_step_choice.md +122 -0
  54. package/template_docs/docs/funnelsgrove/steps/single_step_choice_emoji.md +122 -0
  55. package/template_docs/docs/funnelsgrove/steps/social_proof.md +110 -0
  56. package/template_docs/docs/funnelsgrove/steps/subscription_handoff.md +113 -0
  57. package/template_docs/docs/funnelsgrove/steps/subscription_management.md +112 -0
  58. package/template_docs/docs/funnelsgrove/steps/summary_confirmation.md +110 -0
  59. package/template_docs/docs/funnelsgrove/steps/upsell_offer.md +112 -0
  60. package/template_docs/docs/funnelsgrove/steps/value_prop_story.md +110 -0
  61. package/template_docs/funnel-docs.config.json +43 -0
  62. package/template_scaffold/.env.example +41 -0
  63. package/template_scaffold/.funnelsgrove-contract-tools.json +19 -0
  64. package/template_scaffold/.funnelsgrove-docs.json +144 -0
  65. package/template_scaffold/.funnelsgrove-scaffold.json +1078 -0
  66. package/template_scaffold/AGENTS.md +42 -0
  67. package/template_scaffold/CLAUDE.md +1 -0
  68. package/template_scaffold/PLAN.md +81 -0
  69. package/template_scaffold/PRODUCT_SENSE.md +28 -0
  70. package/template_scaffold/context/build-context.md +34 -0
  71. package/template_scaffold/docs/AGENT_FUNNEL_IMPLEMENTATION_SPEC.md +5 -0
  72. package/template_scaffold/docs/ARCHITECTURE.md +5 -0
  73. package/template_scaffold/docs/FLOW_CONFIG_AND_ROUTING.md +5 -0
  74. package/template_scaffold/docs/PAYWALL_AND_PAYMENTS.md +5 -0
  75. package/template_scaffold/docs/README.md +5 -0
  76. package/template_scaffold/docs/funnelsgrove/START-HERE.md +73 -0
  77. package/template_scaffold/docs/funnelsgrove/contracts/analytics-events.md +59 -0
  78. package/template_scaffold/docs/funnelsgrove/contracts/content-answers.md +44 -0
  79. package/template_scaffold/docs/funnelsgrove/contracts/flow-routing.md +41 -0
  80. package/template_scaffold/docs/funnelsgrove/contracts/payments.md +42 -0
  81. package/template_scaffold/docs/funnelsgrove/contracts/step-metadata.md +57 -0
  82. package/template_scaffold/docs/funnelsgrove/migrations/step-contract-v3.md +39 -0
  83. package/template_scaffold/docs/funnelsgrove/qa/analytics.md +43 -0
  84. package/template_scaffold/docs/funnelsgrove/qa/local.md +42 -0
  85. package/template_scaffold/docs/funnelsgrove/qa/paywall-checkout.md +55 -0
  86. package/template_scaffold/docs/funnelsgrove/qa/publish.md +32 -0
  87. package/template_scaffold/docs/funnelsgrove/recipes/add-experiment.md +34 -0
  88. package/template_scaffold/docs/funnelsgrove/recipes/add-step.md +33 -0
  89. package/template_scaffold/docs/funnelsgrove/recipes/edit-step.md +31 -0
  90. package/template_scaffold/docs/funnelsgrove/steps/INDEX.md +26 -0
  91. package/template_scaffold/docs/funnelsgrove/steps/cancellation_offer.md +112 -0
  92. package/template_scaffold/docs/funnelsgrove/steps/checkout.md +120 -0
  93. package/template_scaffold/docs/funnelsgrove/steps/form_input.md +115 -0
  94. package/template_scaffold/docs/funnelsgrove/steps/intro_hero.md +110 -0
  95. package/template_scaffold/docs/funnelsgrove/steps/multi_select_choice.md +123 -0
  96. package/template_scaffold/docs/funnelsgrove/steps/paywall_offer.md +115 -0
  97. package/template_scaffold/docs/funnelsgrove/steps/progress_interstitial.md +111 -0
  98. package/template_scaffold/docs/funnelsgrove/steps/purchase_completed.md +117 -0
  99. package/template_scaffold/docs/funnelsgrove/steps/single_step_choice.md +122 -0
  100. package/template_scaffold/docs/funnelsgrove/steps/single_step_choice_emoji.md +122 -0
  101. package/template_scaffold/docs/funnelsgrove/steps/social_proof.md +110 -0
  102. package/template_scaffold/docs/funnelsgrove/steps/subscription_handoff.md +113 -0
  103. package/template_scaffold/docs/funnelsgrove/steps/subscription_management.md +112 -0
  104. package/template_scaffold/docs/funnelsgrove/steps/summary_confirmation.md +110 -0
  105. package/template_scaffold/docs/funnelsgrove/steps/upsell_offer.md +112 -0
  106. package/template_scaffold/docs/funnelsgrove/steps/value_prop_story.md +110 -0
  107. package/template_scaffold/docs/references/funnel-sdk-user-answers.md +5 -0
  108. package/template_scaffold/eslint.config.mjs +16 -0
  109. package/template_scaffold/funnel-agent-docs.test.ts +699 -0
  110. package/template_scaffold/funnel-docs.config.json +43 -0
  111. package/template_scaffold/funnel.config.json +5 -0
  112. package/template_scaffold/gitignore.template +5 -0
  113. package/template_scaffold/next-env.d.ts +6 -0
  114. package/template_scaffold/next.config.ts +53 -0
  115. package/template_scaffold/package-lock.json +7737 -0
  116. package/template_scaffold/package.json +37 -0
  117. package/template_scaffold/package.test.ts +23 -0
  118. package/template_scaffold/public/claimbee/bee.png +0 -0
  119. package/template_scaffold/public/claimbee/device-iphone.png +0 -0
  120. package/template_scaffold/public/claimbee/device-macbook.png +0 -0
  121. package/template_scaffold/public/claimbee/device-none.png +0 -0
  122. package/template_scaffold/public/claimbee/device-watch.png +0 -0
  123. package/template_scaffold/public/claimbee/glow.svg +3 -0
  124. package/template_scaffold/public/claimbee/steps-sprite-alt.png +0 -0
  125. package/template_scaffold/public/claimbee/steps-sprite-default.png +0 -0
  126. package/template_scaffold/public/claimbee/testimonial-avatar.png +0 -0
  127. package/template_scaffold/public/claimbee/testimonial-star.svg +3 -0
  128. package/template_scaffold/public/paywall/ai-claim-assistant.png +0 -0
  129. package/template_scaffold/public/paywall/claim-history.png +0 -0
  130. package/template_scaffold/public/paywall/clear-progress.png +0 -0
  131. package/template_scaffold/public/paywall/hero.png +0 -0
  132. package/template_scaffold/public/paywall/money-alerts.png +0 -0
  133. package/template_scaffold/public/paywall/money-back-badge.png +0 -0
  134. package/template_scaffold/public/paywall/paywall-image.png +0 -0
  135. package/template_scaffold/public/paywall/r1.png +0 -0
  136. package/template_scaffold/public/paywall/r2.png +0 -0
  137. package/template_scaffold/public/paywall/r3.png +0 -0
  138. package/template_scaffold/public/paywall/r4.png +0 -0
  139. package/template_scaffold/public/paywall/r5.png +0 -0
  140. package/template_scaffold/public/paywall/r6.png +0 -0
  141. package/template_scaffold/public/paywall/special-offer-gift.png +0 -0
  142. package/template_scaffold/public/please/bee.png +0 -0
  143. package/template_scaffold/public/please/device-iphone.png +0 -0
  144. package/template_scaffold/public/please/device-macbook.png +0 -0
  145. package/template_scaffold/public/please/device-none.png +0 -0
  146. package/template_scaffold/public/please/device-watch.png +0 -0
  147. package/template_scaffold/public/please/glow.svg +3 -0
  148. package/template_scaffold/public/please/steps-sprite-alt.png +0 -0
  149. package/template_scaffold/public/please/steps-sprite-default.png +0 -0
  150. package/template_scaffold/public/please/testimonial-avatar.png +0 -0
  151. package/template_scaffold/public/please/testimonial-star.svg +3 -0
  152. package/template_scaffold/public/upsell/upgrade-hero.png +0 -0
  153. package/template_scaffold/src/app/[stepId]/page.test.tsx +59 -0
  154. package/template_scaffold/src/app/[stepId]/page.tsx +62 -0
  155. package/template_scaffold/src/app/globals.css +49 -0
  156. package/template_scaffold/src/app/layout.test.ts +26 -0
  157. package/template_scaffold/src/app/layout.tsx +61 -0
  158. package/template_scaffold/src/app/page.tsx +8 -0
  159. package/template_scaffold/src/app/sdk/page.tsx +673 -0
  160. package/template_scaffold/src/app/subscription-dashboard/page.tsx +274 -0
  161. package/template_scaffold/src/assets/claimbee/bee.png +0 -0
  162. package/template_scaffold/src/assets/claimbee/device-iphone.png +0 -0
  163. package/template_scaffold/src/assets/claimbee/device-macbook.png +0 -0
  164. package/template_scaffold/src/assets/claimbee/device-none.png +0 -0
  165. package/template_scaffold/src/assets/claimbee/device-watch.png +0 -0
  166. package/template_scaffold/src/assets/claimbee/glow.svg +3 -0
  167. package/template_scaffold/src/assets/claimbee/steps-sprite-alt.png +0 -0
  168. package/template_scaffold/src/assets/claimbee/steps-sprite-default.png +0 -0
  169. package/template_scaffold/src/assets/claimbee/testimonial-avatar.png +0 -0
  170. package/template_scaffold/src/assets/claimbee/testimonial-star.svg +3 -0
  171. package/template_scaffold/src/components/FunnelEditorPanel.tsx +194 -0
  172. package/template_scaffold/src/components/FunnelFlow.test.tsx +17 -0
  173. package/template_scaffold/src/components/FunnelFlow.tsx +114 -0
  174. package/template_scaffold/src/components/FunnelStepImage.test.ts +15 -0
  175. package/template_scaffold/src/components/FunnelStepImage.tsx +28 -0
  176. package/template_scaffold/src/components/step/FunnelStepHeader.tsx +35 -0
  177. package/template_scaffold/src/config/billing.plans.test.ts +143 -0
  178. package/template_scaffold/src/config/billing.plans.ts +69 -0
  179. package/template_scaffold/src/config/billing.test.plans.ts +32 -0
  180. package/template_scaffold/src/config/experiments.generated.ts +4 -0
  181. package/template_scaffold/src/config/experiments.test.ts +12 -0
  182. package/template_scaffold/src/config/experiments.ts +9 -0
  183. package/template_scaffold/src/config/funnel.config.ts +12 -0
  184. package/template_scaffold/src/config/funnel.manifest.test.ts +166 -0
  185. package/template_scaffold/src/config/funnel.manifest.ts +139 -0
  186. package/template_scaffold/src/config/offer-sets.generated.ts +4 -0
  187. package/template_scaffold/src/contract/funnel-project.validation.test.ts +80 -0
  188. package/template_scaffold/src/contract/funnel-project.validation.ts +44 -0
  189. package/template_scaffold/src/contract/funnel-validator.vite.config.ts +11 -0
  190. package/template_scaffold/src/contract/golden/cancellation_offer.fixture.ts +29 -0
  191. package/template_scaffold/src/contract/golden/checkout.fixture.ts +37 -0
  192. package/template_scaffold/src/contract/golden/form_input.fixture.ts +28 -0
  193. package/template_scaffold/src/contract/golden/golden-fixtures.test.ts +190 -0
  194. package/template_scaffold/src/contract/golden/intro_hero.fixture.ts +27 -0
  195. package/template_scaffold/src/contract/golden/multi_select_choice.fixture.ts +37 -0
  196. package/template_scaffold/src/contract/golden/paywall_offer.fixture.ts +30 -0
  197. package/template_scaffold/src/contract/golden/progress_interstitial.fixture.ts +28 -0
  198. package/template_scaffold/src/contract/golden/purchase_completed.fixture.ts +33 -0
  199. package/template_scaffold/src/contract/golden/single_step_choice.fixture.ts +36 -0
  200. package/template_scaffold/src/contract/golden/single_step_choice_emoji.fixture.ts +36 -0
  201. package/template_scaffold/src/contract/golden/social_proof.fixture.ts +27 -0
  202. package/template_scaffold/src/contract/golden/subscription_handoff.fixture.ts +30 -0
  203. package/template_scaffold/src/contract/golden/subscription_management.fixture.ts +29 -0
  204. package/template_scaffold/src/contract/golden/summary_confirmation.fixture.ts +27 -0
  205. package/template_scaffold/src/contract/golden/upsell_offer.fixture.ts +29 -0
  206. package/template_scaffold/src/contract/golden/value_prop_story.fixture.ts +27 -0
  207. package/template_scaffold/src/contract/validate-funnel.cli.test.ts +180 -0
  208. package/template_scaffold/src/contract/validate-funnel.cli.ts +199 -0
  209. package/template_scaffold/src/runtime/checkout-runtime-config.test.ts +60 -0
  210. package/template_scaffold/src/runtime/checkout-runtime-config.ts +26 -0
  211. package/template_scaffold/src/runtime/funnel-runtime.test.ts +25 -0
  212. package/template_scaffold/src/runtime/funnel-runtime.ts +118 -0
  213. package/template_scaffold/src/runtime/step-content-context.test.ts +38 -0
  214. package/template_scaffold/src/runtime/step-content-context.ts +65 -0
  215. package/template_scaffold/src/runtime/step-registry.ts +66 -0
  216. package/template_scaffold/src/runtime/step-variable-values.ts +31 -0
  217. package/template_scaffold/src/runtime/use-funnel-flow-controller.integration.test.ts +203 -0
  218. package/template_scaffold/src/runtime/use-funnel-flow-controller.test.ts +76 -0
  219. package/template_scaffold/src/runtime/use-funnel-flow-controller.ts +53 -0
  220. package/template_scaffold/src/steps/content/email-capture.content.ts +29 -0
  221. package/template_scaffold/src/steps/content/manage-subscription.content.ts +62 -0
  222. package/template_scaffold/src/steps/content/paywall.content.ts +191 -0
  223. package/template_scaffold/src/steps/content/step-01.content.ts +23 -0
  224. package/template_scaffold/src/steps/content/step-02.content.ts +77 -0
  225. package/template_scaffold/src/steps/content/step-03.content.ts +40 -0
  226. package/template_scaffold/src/steps/content/step-04.content.ts +49 -0
  227. package/template_scaffold/src/steps/content/step-32-paywall.content.ts +352 -0
  228. package/template_scaffold/src/steps/content/subscription-started.content.ts +68 -0
  229. package/template_scaffold/src/steps/editor/email-capture.editor.ts +58 -0
  230. package/template_scaffold/src/steps/editor/manage-subscription.editor.ts +179 -0
  231. package/template_scaffold/src/steps/editor/paywall.editor.ts +232 -0
  232. package/template_scaffold/src/steps/editor/step-01.editor.ts +22 -0
  233. package/template_scaffold/src/steps/editor/step-02.editor.ts +41 -0
  234. package/template_scaffold/src/steps/editor/step-03.editor.ts +58 -0
  235. package/template_scaffold/src/steps/editor/step-04.editor.ts +98 -0
  236. package/template_scaffold/src/steps/editor/step-32-paywall.editor.ts +478 -0
  237. package/template_scaffold/src/steps/editor/subscription-started.editor.ts +131 -0
  238. package/template_scaffold/src/steps/index.ts +25 -0
  239. package/template_scaffold/src/steps/paywall-checkout-options.test.ts +104 -0
  240. package/template_scaffold/src/steps/paywall-checkout-options.ts +130 -0
  241. package/template_scaffold/src/steps/pricing/paywall-b.pricing.ts +12 -0
  242. package/template_scaffold/src/steps/pricing/paywall.pricing.ts +12 -0
  243. package/template_scaffold/src/steps/pricing/shared-plan-order.ts +17 -0
  244. package/template_scaffold/src/steps/pricing/upsell-form.pricing.ts +16 -0
  245. package/template_scaffold/src/steps/shared-header-contract.test.ts +27 -0
  246. package/template_scaffold/src/steps/step-01.test.ts +38 -0
  247. package/template_scaffold/src/steps/step-01.tsx +108 -0
  248. package/template_scaffold/src/steps/step-02.test.ts +43 -0
  249. package/template_scaffold/src/steps/step-02.tsx +140 -0
  250. package/template_scaffold/src/steps/step-03.test.ts +15 -0
  251. package/template_scaffold/src/steps/step-03.tsx +262 -0
  252. package/template_scaffold/src/steps/step-04.test.ts +32 -0
  253. package/template_scaffold/src/steps/step-04.tsx +673 -0
  254. package/template_scaffold/src/steps/step-31-email-capture.test.ts +22 -0
  255. package/template_scaffold/src/steps/step-31-email-capture.tsx +195 -0
  256. package/template_scaffold/src/steps/step-32-paywall.test.ts +770 -0
  257. package/template_scaffold/src/steps/step-32-paywall.tsx +2253 -0
  258. package/template_scaffold/src/steps/step-32b-paywall-b.tsx +35 -0
  259. package/template_scaffold/src/steps/step-33-subscription-started.test.ts +26 -0
  260. package/template_scaffold/src/steps/step-33-subscription-started.tsx +86 -0
  261. package/template_scaffold/src/steps/step-34-upsell-form.test.ts +27 -0
  262. package/template_scaffold/src/steps/step-35-manage-subscription.tsx +46 -0
  263. package/template_scaffold/src/steps/step-content.registry.ts +45 -0
  264. package/template_scaffold/src/steps/step-image-migration.test.ts +20 -0
  265. package/template_scaffold/src/steps/styles/index.css +2 -0
  266. package/template_scaffold/src/steps/styles/shared/final-flow-shared.css +55 -0
  267. package/template_scaffold/src/steps/styles/shared/funnel-base.css +543 -0
  268. package/template_scaffold/src/steps/styles/shared/info-shared.css +139 -0
  269. package/template_scaffold/src/steps/styles/shared/progress-shared.css +117 -0
  270. package/template_scaffold/src/steps/styles/shared/question-shared.css +76 -0
  271. package/template_scaffold/src/steps/styles/shared/responsive-container.css +176 -0
  272. package/template_scaffold/src/steps/types.ts +7 -0
  273. package/template_scaffold/src/steps/use-claimbee-step-content.ts +15 -0
  274. package/template_scaffold/src/theme/theme.ts +81 -0
  275. package/template_scaffold/tsconfig.json +38 -0
  276. package/template_scaffold/vitest.config.ts +32 -0
  277. package/template_validation/.funnelsgrove-contract-tools.json +19 -0
  278. package/template_validation/src/contract/funnel-project.validation.ts +44 -0
  279. package/template_validation/src/contract/funnel-validator.vite.config.ts +11 -0
  280. package/template_validation/src/contract/validate-funnel.cli.ts +199 -0
  281. package/template_docs/docs/ab-experiments.md +0 -55
  282. package/template_docs/docs/analytics.md +0 -65
  283. package/template_docs/docs/editing-flow.md +0 -125
  284. package/template_docs/docs/editing-step.md +0 -125
  285. package/template_docs/docs/editor-and-content.md +0 -58
  286. package/template_docs/docs/funnel-runtime-architecture.md +0 -125
  287. package/template_docs/docs/meta-pixel-conversions-api.md +0 -50
  288. package/template_docs/docs/payment-plans-and-discounts.md +0 -106
  289. package/template_docs/docs/publishing-and-versioning.md +0 -117
  290. package/template_docs/docs/qa-checklist.md +0 -80
  291. package/template_docs/docs/sdk-api-endpoints.md +0 -78
  292. package/template_docs/docs/step-ui-guidelines.md +0 -110
  293. package/template_docs/docs/theme.md +0 -35
@@ -0,0 +1,112 @@
1
+ # `upsell_offer`
2
+
3
+ ## Use when / do not use when
4
+
5
+ Use for a post-purchase or upgrade offer. Do not use for the primary plan-selection paywall or a non-purchasable value screen.
6
+
7
+ ## Exact metadata contract
8
+
9
+ <!-- funnelsgrove:generated:start contract-v3/step/upsell_offer -->
10
+ ### Generated contract facts — do not edit
11
+
12
+ - Step contract version: `3`
13
+ - Contract hash: `d761e91d5ac6ff9e72c6d49c5bcd014270912473a66f99c49d726c65998085cf`
14
+ - Type: `upsell_offer`
15
+ - Family: `commerce`
16
+ - Description: A post-purchase or upgrade offer.
17
+ - Action owner: `step`
18
+ - Analytics role: _none_
19
+ - Terminal: `false`
20
+ - Required kind: `upsell`
21
+ - Allowed kinds: `upsell`
22
+ - Allowed semantic events: `checkout_started`, `add_payment_info`, `checkout_completed`
23
+ - Forbidden capabilities: `choice-write`, `email-capture`, `subscription-management`, `subscription-handoff`, `hardcoded-navigation`, `provider-direct-analytics`, `browser-registration-completed`
24
+
25
+ #### Choice contract
26
+
27
+ _Not a choice type._
28
+
29
+ #### Automatic lifecycle events
30
+
31
+ `first_step_clicked`, `first_step_viewed`, `funnel_started`, `step_completed`, `step_exited`, `step_started`
32
+
33
+ #### Approved capability owners
34
+
35
+ - `checkout` must be owned by `named-payment-helpers`.
36
+
37
+ #### Reserved identities
38
+
39
+ _No reserved identity for this type._
40
+
41
+ #### Golden fixture source
42
+
43
+ ```ts
44
+ import type { FunnelManifestStep, FunnelStepMeta } from '@funnelsgrove/runtime';
45
+
46
+ const manifestStep = {
47
+ id: 'premium-upgrade',
48
+ name: 'premium-upgrade',
49
+ path: '/premium-upgrade',
50
+ filePath: 'src/steps/step-premium-upgrade.tsx',
51
+ componentKey: 'stepPremiumUpgrade',
52
+ type: 'upsell_offer',
53
+ kind: 'upsell',
54
+ title: 'Add premium support',
55
+ } as const satisfies FunnelManifestStep;
56
+
57
+ const componentMeta = {
58
+ id: 'premium-upgrade',
59
+ name: 'premium-upgrade',
60
+ type: 'upsell_offer',
61
+ kind: 'upsell',
62
+ figmaNodeId: 'golden:upsell-offer',
63
+ title: 'Add premium support',
64
+ description: 'Offer an optional post-purchase upgrade.',
65
+ } as const satisfies FunnelStepMeta;
66
+
67
+ export const goldenFixture = {
68
+ stepType: 'upsell_offer',
69
+ manifestStep,
70
+ componentMeta,
71
+ semanticHelpers: ['trackCheckoutStarted', 'trackPaymentInfoSubmitted', 'trackCheckoutCompleted'],
72
+ } as const;
73
+ ```
74
+ <!-- funnelsgrove:generated:end contract-v3/step/upsell_offer -->
75
+
76
+ ## Interaction and persisted answer shape
77
+
78
+ Resolve the upgrade through shared payment configuration. Accept and decline both flow through controller-owned routes.
79
+
80
+ ## Automatic lifecycle events
81
+
82
+ The controller owns lifecycle completion/exit; the payment boundary owns semantic checkout events.
83
+
84
+ ## Required semantic conversions
85
+
86
+ Call `trackCheckoutStarted`, `trackPaymentInfoSubmitted`, and `trackCheckoutCompleted` only at their matching real boundaries.
87
+
88
+ ## Approved shared helpers
89
+
90
+ Use named payment helpers and manifest routing.
91
+
92
+ ## MUST rules
93
+
94
+ - Keep offer identity and pricing configuration outside the component.
95
+ - Make decline behavior explicit in the manifest.
96
+
97
+ ## NEVER rules
98
+
99
+ - Never emit a completed checkout before provider success.
100
+ - Never call provider analytics directly.
101
+
102
+ ## Golden template or fixture
103
+
104
+ See the [embedded canonical fixture](#golden-fixture-source) generated from `upsell_offer.fixture.ts`.
105
+
106
+ ## Validation command
107
+
108
+ Run `fgrove validate`.
109
+
110
+ ## Manual QA and completion criteria
111
+
112
+ Test accept, decline, provider failure, retry, event deduplication, and both manifest routes.
@@ -0,0 +1,110 @@
1
+ # `value_prop_story`
2
+
3
+ ## Use when / do not use when
4
+
5
+ Use for benefit, explanation, motivation, or narrative value. Do not use for testimonials, answer collection, loading, or an offer.
6
+
7
+ ## Exact metadata contract
8
+
9
+ <!-- funnelsgrove:generated:start contract-v3/step/value_prop_story -->
10
+ ### Generated contract facts — do not edit
11
+
12
+ - Step contract version: `3`
13
+ - Contract hash: `d761e91d5ac6ff9e72c6d49c5bcd014270912473a66f99c49d726c65998085cf`
14
+ - Type: `value_prop_story`
15
+ - Family: `content`
16
+ - Description: Benefit, explanation, motivation, or narrative value screen.
17
+ - Action owner: `shared-shell`
18
+ - Analytics role: _none_
19
+ - Terminal: `false`
20
+ - Required kind: _none_
21
+ - Allowed kinds: _None_
22
+ - Allowed semantic events: _None_
23
+ - Forbidden capabilities: `choice-write`, `email-capture`, `checkout`, `subscription-management`, `subscription-handoff`, `hardcoded-navigation`, `provider-direct-analytics`, `browser-registration-completed`
24
+
25
+ #### Choice contract
26
+
27
+ _Not a choice type._
28
+
29
+ #### Automatic lifecycle events
30
+
31
+ `first_step_clicked`, `first_step_viewed`, `funnel_started`, `step_completed`, `step_exited`, `step_started`
32
+
33
+ #### Approved capability owners
34
+
35
+ _No special capability is allowed._
36
+
37
+ #### Reserved identities
38
+
39
+ _No reserved identity for this type._
40
+
41
+ #### Golden fixture source
42
+
43
+ ```ts
44
+ import type { FunnelManifestStep, FunnelStepMeta } from '@funnelsgrove/runtime';
45
+
46
+ const manifestStep = {
47
+ id: 'your-plan',
48
+ name: 'your-plan',
49
+ path: '/your-plan',
50
+ filePath: 'src/steps/step-your-plan.tsx',
51
+ componentKey: 'stepYourPlan',
52
+ type: 'value_prop_story',
53
+ title: 'Your plan',
54
+ } as const satisfies FunnelManifestStep;
55
+
56
+ const componentMeta = {
57
+ id: 'your-plan',
58
+ name: 'your-plan',
59
+ type: 'value_prop_story',
60
+ figmaNodeId: 'golden:value-prop-story',
61
+ title: 'Your plan',
62
+ description: 'Narrative explanation of the product value.',
63
+ } as const satisfies FunnelStepMeta;
64
+
65
+ export const goldenFixture = {
66
+ stepType: 'value_prop_story',
67
+ manifestStep,
68
+ componentMeta,
69
+ actionOwner: 'shared-shell',
70
+ } as const;
71
+ ```
72
+ <!-- funnelsgrove:generated:end contract-v3/step/value_prop_story -->
73
+
74
+ ## Interaction and persisted answer shape
75
+
76
+ This is a content screen and normally persists no answer. The shared shell owns standard progression.
77
+
78
+ ## Automatic lifecycle events
79
+
80
+ The flow controller owns lifecycle events and suppresses them in preview.
81
+
82
+ ## Required semantic conversions
83
+
84
+ None.
85
+
86
+ ## Approved shared helpers
87
+
88
+ Use shared content and action-bar primitives. Use manifest routing for progression.
89
+
90
+ ## MUST rules
91
+
92
+ - Keep one clear narrative purpose.
93
+ - Keep manifest and component metadata in parity.
94
+
95
+ ## NEVER rules
96
+
97
+ - Never classify a reveal or calculation screen as a value story.
98
+ - Never send provider analytics directly.
99
+
100
+ ## Golden template or fixture
101
+
102
+ See the [embedded canonical fixture](#golden-fixture-source) generated from `value_prop_story.fixture.ts`.
103
+
104
+ ## Validation command
105
+
106
+ Run `fgrove validate`.
107
+
108
+ ## Manual QA and completion criteria
109
+
110
+ Confirm content renders at all supported breakpoints and the shared action advances to the manifest-resolved target.
@@ -0,0 +1,43 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "bundleVersion": "2.0.6",
4
+ "contractSource": "funnelsgrove-repository://apps/funnel-runtime/contracts/step-contract-v2.json",
5
+ "fullyGenerated": [
6
+ ".funnelsgrove-docs.json",
7
+ "AGENTS.md",
8
+ "CLAUDE.md",
9
+ "docs/funnelsgrove/steps/INDEX.md"
10
+ ],
11
+ "curated": [
12
+ { "path": "docs/funnelsgrove/START-HERE.md", "logicalId": "overview/start-here" },
13
+ { "path": "docs/funnelsgrove/contracts/analytics-events.md", "logicalId": "contract/analytics-events" },
14
+ { "path": "docs/funnelsgrove/contracts/content-answers.md", "logicalId": "contract/content-answers" },
15
+ { "path": "docs/funnelsgrove/contracts/flow-routing.md", "logicalId": "contract/flow-routing" },
16
+ { "path": "docs/funnelsgrove/contracts/payments.md", "logicalId": "contract/payments" },
17
+ { "path": "docs/funnelsgrove/contracts/step-metadata.md", "logicalId": "contract/step-metadata" },
18
+ { "path": "docs/funnelsgrove/migrations/step-contract-v3.md", "logicalId": "migration/step-contract-v3" },
19
+ { "path": "docs/funnelsgrove/qa/analytics.md", "logicalId": "qa/analytics" },
20
+ { "path": "docs/funnelsgrove/qa/local.md", "logicalId": "qa/local" },
21
+ { "path": "docs/funnelsgrove/qa/paywall-checkout.md", "logicalId": "qa/paywall-checkout" },
22
+ { "path": "docs/funnelsgrove/qa/publish.md", "logicalId": "qa/publish" },
23
+ { "path": "docs/funnelsgrove/recipes/add-experiment.md", "logicalId": "recipe/add-experiment" },
24
+ { "path": "docs/funnelsgrove/recipes/add-step.md", "logicalId": "recipe/add-step" },
25
+ { "path": "docs/funnelsgrove/recipes/edit-step.md", "logicalId": "recipe/edit-step" },
26
+ { "path": "docs/funnelsgrove/steps/cancellation_offer.md", "logicalId": "step/cancellation_offer" },
27
+ { "path": "docs/funnelsgrove/steps/checkout.md", "logicalId": "step/checkout" },
28
+ { "path": "docs/funnelsgrove/steps/form_input.md", "logicalId": "step/form_input" },
29
+ { "path": "docs/funnelsgrove/steps/intro_hero.md", "logicalId": "step/intro_hero" },
30
+ { "path": "docs/funnelsgrove/steps/multi_select_choice.md", "logicalId": "step/multi_select_choice" },
31
+ { "path": "docs/funnelsgrove/steps/paywall_offer.md", "logicalId": "step/paywall_offer" },
32
+ { "path": "docs/funnelsgrove/steps/progress_interstitial.md", "logicalId": "step/progress_interstitial" },
33
+ { "path": "docs/funnelsgrove/steps/purchase_completed.md", "logicalId": "step/purchase_completed" },
34
+ { "path": "docs/funnelsgrove/steps/single_step_choice.md", "logicalId": "step/single_step_choice" },
35
+ { "path": "docs/funnelsgrove/steps/single_step_choice_emoji.md", "logicalId": "step/single_step_choice_emoji" },
36
+ { "path": "docs/funnelsgrove/steps/social_proof.md", "logicalId": "step/social_proof" },
37
+ { "path": "docs/funnelsgrove/steps/subscription_handoff.md", "logicalId": "step/subscription_handoff" },
38
+ { "path": "docs/funnelsgrove/steps/subscription_management.md", "logicalId": "step/subscription_management" },
39
+ { "path": "docs/funnelsgrove/steps/summary_confirmation.md", "logicalId": "step/summary_confirmation" },
40
+ { "path": "docs/funnelsgrove/steps/upsell_offer.md", "logicalId": "step/upsell_offer" },
41
+ { "path": "docs/funnelsgrove/steps/value_prop_story.md", "logicalId": "step/value_prop_story" }
42
+ ]
43
+ }
@@ -0,0 +1,41 @@
1
+ APP_DEALS_API_BASE_URL=http://localhost:4001
2
+ NEXT_PUBLIC_APP_DEALS_API_BASE_URL=http://localhost:4001
3
+
4
+ # SDK publishable key used by /api/sdk/session and /api/events
5
+ FUNNEL_SDK_PUBLISHABLE_KEY=pk_test_app_deals_seed_public
6
+ NEXT_PUBLIC_FUNNEL_SDK_PUBLISHABLE_KEY=pk_test_app_deals_seed_public
7
+
8
+ # Optional when one SDK key can access multiple funnels
9
+ FUNNEL_ID=
10
+ NEXT_PUBLIC_FUNNEL_ID=
11
+ NEXT_PUBLIC_PROJECT_ID=
12
+ NEXT_PUBLIC_POSTHOG_PROJECT_API_KEY=
13
+ NEXT_PUBLIC_FUNNEL_FAVICON_URL=
14
+ NEXT_PUBLIC_FUNNEL_PAGE_TITLE=
15
+ NEXT_PUBLIC_FUNNEL_PAGE_DESCRIPTION=
16
+ NEXT_PUBLIC_FUNNEL_PAGE_PREVIEW_IMAGE_URL=
17
+ NEXT_PUBLIC_FUNNEL_COMPANY_NAME=
18
+ NEXT_PUBLIC_FUNNEL_COMPANY_ADDRESS=
19
+ NEXT_PUBLIC_FUNNEL_COMPANY_COUNTRY=
20
+ NEXT_PUBLIC_FUNNEL_PRIVACY_URL=
21
+ NEXT_PUBLIC_FUNNEL_TERMS_URL=
22
+ NEXT_PUBLIC_FUNNEL_SUPPORT_EMAIL=
23
+
24
+ # Secret key used by /api/subscription (server-side only)
25
+ FUNNEL_SDK_SECRET_KEY=
26
+
27
+ # Existing Stripe payment intent server config (paywall checkout)
28
+ STRIPE_ACTIVE_MODE=test
29
+ STRIPE_TEST_SECRET_KEY=
30
+ STRIPE_LIVE_SECRET_KEY=
31
+ NEXT_PUBLIC_STRIPE_ACTIVE_MODE=test
32
+ NEXT_PUBLIC_STRIPE_TEST_PUBLISHABLE_KEY=
33
+ NEXT_PUBLIC_STRIPE_LIVE_PUBLISHABLE_KEY=
34
+
35
+ # Post-checkout mobile handoff (step: /subscription-started)
36
+ NEXT_PUBLIC_IOS_APP_STORE_URL=
37
+ NEXT_PUBLIC_ANDROID_PLAY_STORE_URL=
38
+ NEXT_PUBLIC_FUNNEL_UNIVERSAL_LINK=
39
+ NEXT_PUBLIC_FUNNEL_IOS_DEEP_LINK=
40
+ NEXT_PUBLIC_FUNNEL_ANDROID_DEEP_LINK=
41
+ NEXT_PUBLIC_FUNNEL_QR_TARGET=
@@ -0,0 +1,19 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "stepContractVersion": 3,
4
+ "contractHash": "d761e91d5ac6ff9e72c6d49c5bcd014270912473a66f99c49d726c65998085cf",
5
+ "managedFiles": [
6
+ {
7
+ "path": "src/contract/funnel-project.validation.ts",
8
+ "sha256": "b0ec02eac1bd56812eef773be71628ae4e94f80fcd88837bbc5c8bf04e73a62c"
9
+ },
10
+ {
11
+ "path": "src/contract/funnel-validator.vite.config.ts",
12
+ "sha256": "014c0c2c5e29d98e7c91548f233843d83630905ba20c10d248364271ca448e9b"
13
+ },
14
+ {
15
+ "path": "src/contract/validate-funnel.cli.ts",
16
+ "sha256": "1b268b194865d633c760b704a0d4552adc2eb4526801da138ab2a4036f643d58"
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,144 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "bundleVersion": "2.0.6",
4
+ "stepContractVersion": 3,
5
+ "contractHash": "d761e91d5ac6ff9e72c6d49c5bcd014270912473a66f99c49d726c65998085cf",
6
+ "managedFiles": [
7
+ {
8
+ "path": "AGENTS.md",
9
+ "sha256": "952fbafb5841b8f2e6fadab5032374c98390ef90c1ca0ed27747a38d0cc009d7"
10
+ },
11
+ {
12
+ "path": "CLAUDE.md",
13
+ "sha256": "336cc4fbf19beaada7ccf9986414fa91851a8d7a07dfb3ccbe800a69eed0ab49"
14
+ },
15
+ {
16
+ "path": "docs/funnelsgrove/START-HERE.md",
17
+ "sha256": "638615b66f771a36015d747fd8e8a1bf0af311ed24631c3dd041388e8e73c09d"
18
+ },
19
+ {
20
+ "path": "docs/funnelsgrove/contracts/analytics-events.md",
21
+ "sha256": "743ca0d6b3a19b3b9e0bd489b228dab7be73d26073a86aab513a90477da481c6"
22
+ },
23
+ {
24
+ "path": "docs/funnelsgrove/contracts/content-answers.md",
25
+ "sha256": "403b286060dd6cda33757df7c55c5b0e17395f2d90aad0fc133d6ba1919a04b3"
26
+ },
27
+ {
28
+ "path": "docs/funnelsgrove/contracts/flow-routing.md",
29
+ "sha256": "050564846bf7d44afb267e1321d6fe277f032fe7b6237441741570c723543d0e"
30
+ },
31
+ {
32
+ "path": "docs/funnelsgrove/contracts/payments.md",
33
+ "sha256": "1a003f83fa01dba60bd4bb3365fd0a753dadd73d13fed84fd16b70d1df3d2b60"
34
+ },
35
+ {
36
+ "path": "docs/funnelsgrove/contracts/step-metadata.md",
37
+ "sha256": "de89a1a672abbe82d0e9c44da536d2a00893bf85fdec225b3aff7ecd7a965f20"
38
+ },
39
+ {
40
+ "path": "docs/funnelsgrove/migrations/step-contract-v3.md",
41
+ "sha256": "ea1f65198292bfbb2f018fd39f583dfa5c6e1760b77612d804c91d59029ac98d"
42
+ },
43
+ {
44
+ "path": "docs/funnelsgrove/qa/analytics.md",
45
+ "sha256": "5ac36e547155546be230b9f1df144c7875824686627859c97b43e33d6e3e116d"
46
+ },
47
+ {
48
+ "path": "docs/funnelsgrove/qa/local.md",
49
+ "sha256": "97da7e26c5dbe8f63e654e4e0a035a4ecfbb9bcfd80db67d45c627141d6a2756"
50
+ },
51
+ {
52
+ "path": "docs/funnelsgrove/qa/paywall-checkout.md",
53
+ "sha256": "6fc887772e52ddd99ab70d898d8fd9b89869ca49ce1b49152d232cbe32865aae"
54
+ },
55
+ {
56
+ "path": "docs/funnelsgrove/qa/publish.md",
57
+ "sha256": "82b05b8c6eebf25d32d2cff6f05b08bc39661dcbb46caa6b912de6b803aed39c"
58
+ },
59
+ {
60
+ "path": "docs/funnelsgrove/recipes/add-experiment.md",
61
+ "sha256": "832b4331d6690d0596800c5aeb969f608dd62cf63d9ae527054e832fb60f8abd"
62
+ },
63
+ {
64
+ "path": "docs/funnelsgrove/recipes/add-step.md",
65
+ "sha256": "fba92b8394b0d622b9886a677af38ddb78042a633c60ab5cb6b1ff600abe2cb9"
66
+ },
67
+ {
68
+ "path": "docs/funnelsgrove/recipes/edit-step.md",
69
+ "sha256": "49eb688c0b3145c025dffe30a9be35e5f5e018da66cbeddf2a08af6a1cc250dc"
70
+ },
71
+ {
72
+ "path": "docs/funnelsgrove/steps/INDEX.md",
73
+ "sha256": "86db94292eae2fffcd89795dedeab1eca32ce4d360d36f5d4b0806698642384f"
74
+ },
75
+ {
76
+ "path": "docs/funnelsgrove/steps/cancellation_offer.md",
77
+ "sha256": "144e31d14c8a3cc832abcb5404f47da67308c412ec630f88b8ef54cb19a6f73a"
78
+ },
79
+ {
80
+ "path": "docs/funnelsgrove/steps/checkout.md",
81
+ "sha256": "272ce5ae593bd8354e18f20a529daf39005226ca3f57b89db20095017d64c94f"
82
+ },
83
+ {
84
+ "path": "docs/funnelsgrove/steps/form_input.md",
85
+ "sha256": "650a2d84cabf309f90fa7d37ac4101ea4002b2f2da4548ce80ed86f2194eba9e"
86
+ },
87
+ {
88
+ "path": "docs/funnelsgrove/steps/intro_hero.md",
89
+ "sha256": "85de9bd3e4f7ec6af3dedb44340de4087939f679748cf796b9f5214936a8737b"
90
+ },
91
+ {
92
+ "path": "docs/funnelsgrove/steps/multi_select_choice.md",
93
+ "sha256": "d9c6d7d75ccc6c50697033b3ad2a6383554d815d8f952c75f8319e73b09db1d1"
94
+ },
95
+ {
96
+ "path": "docs/funnelsgrove/steps/paywall_offer.md",
97
+ "sha256": "969ee556ca1da3bfa09c21f530726467735693537452fcbf3065f21644b90669"
98
+ },
99
+ {
100
+ "path": "docs/funnelsgrove/steps/progress_interstitial.md",
101
+ "sha256": "7ed2d0bf4ac45ee74e36bd87865c250206353ddbd6b34b93975bf87fb0ea09bb"
102
+ },
103
+ {
104
+ "path": "docs/funnelsgrove/steps/purchase_completed.md",
105
+ "sha256": "4fc5b6973ed5b9520619914e41f9633308ae3d46f391a57be44e5a1a7c210253"
106
+ },
107
+ {
108
+ "path": "docs/funnelsgrove/steps/single_step_choice.md",
109
+ "sha256": "63efe3cdf363342eda69522f9c549f11203b53d2afe10af6ebce4eff90e5a53c"
110
+ },
111
+ {
112
+ "path": "docs/funnelsgrove/steps/single_step_choice_emoji.md",
113
+ "sha256": "ed3593d6b1ff26dfccec515f858304001da1e3739dbc9a4d22dfafb5ebfbbc0c"
114
+ },
115
+ {
116
+ "path": "docs/funnelsgrove/steps/social_proof.md",
117
+ "sha256": "cae4611e44d020ebe7a1792f91666b1a8d9df2798a226808a830f903f58feccb"
118
+ },
119
+ {
120
+ "path": "docs/funnelsgrove/steps/subscription_handoff.md",
121
+ "sha256": "dd2e7fed11f1f08ecfa9a969ea0b55d7d41d28c5ab160f6e4a560ee2a7bc2ff3"
122
+ },
123
+ {
124
+ "path": "docs/funnelsgrove/steps/subscription_management.md",
125
+ "sha256": "291d2c39d414a8ece0c73840b20eed14c86f88700323835c86a518c91382d02d"
126
+ },
127
+ {
128
+ "path": "docs/funnelsgrove/steps/summary_confirmation.md",
129
+ "sha256": "a92a1a5c7e7072a0ac86f808940f72fd4be38f97624219d2a1e7a04580b73cc6"
130
+ },
131
+ {
132
+ "path": "docs/funnelsgrove/steps/upsell_offer.md",
133
+ "sha256": "832ffb5506ccdc72b28c839e1b574e5c9ba0c01755fa6c4be105dbe1136b21d0"
134
+ },
135
+ {
136
+ "path": "docs/funnelsgrove/steps/value_prop_story.md",
137
+ "sha256": "9c62b5c908ffade3dc478b95f67b574817af98d4e8c9359d7db20cccd5eca2b7"
138
+ },
139
+ {
140
+ "path": "funnel-docs.config.json",
141
+ "sha256": "1d255682f3394a650b2d1046de407d2772cec5049c6ff9872d66e893d30076d4"
142
+ }
143
+ ]
144
+ }