@tomako/tools-runtime 0.1.0

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 (531) hide show
  1. package/README.md +12 -0
  2. package/package.json +629 -0
  3. package/src/assets/icons/brands/social/bluesky-icon.tsx +9 -0
  4. package/src/assets/icons/brands/social/facebook-icon.tsx +9 -0
  5. package/src/assets/icons/brands/social/index.ts +8 -0
  6. package/src/assets/icons/brands/social/instagram-icon.tsx +9 -0
  7. package/src/assets/icons/brands/social/linkedin-icon.tsx +9 -0
  8. package/src/assets/icons/brands/social/threads-icon.tsx +9 -0
  9. package/src/assets/icons/brands/social/tiktok-icon.tsx +10 -0
  10. package/src/assets/icons/brands/social/x-icon.tsx +9 -0
  11. package/src/assets/icons/brands/social/youtube-icon.tsx +9 -0
  12. package/src/assets/icons/social-profile/facebook-icon.tsx +12 -0
  13. package/src/assets/icons/social-profile/index.ts +29 -0
  14. package/src/assets/icons/social-profile/instagram-icon.tsx +18 -0
  15. package/src/assets/icons/social-profile/linkedin-icon.tsx +12 -0
  16. package/src/assets/icons/social-profile/tiktok-icon.tsx +12 -0
  17. package/src/assets/icons/social-profile/x-icon.tsx +13 -0
  18. package/src/assets/icons/social-profile/youtube-icon.tsx +12 -0
  19. package/src/components/tools/engine/form-builder.tsx +219 -0
  20. package/src/components/tools/engine/package-widget-loader.tsx +38 -0
  21. package/src/components/tools/engine/package-widget-runtime.tsx +409 -0
  22. package/src/components/tools/engine/package-widget.tsx +77 -0
  23. package/src/components/tools/engine/result-view.tsx +596 -0
  24. package/src/components/tools/engine/use-legacy-llm-task.ts +64 -0
  25. package/src/components/tools/engine/use-tool-task.ts +195 -0
  26. package/src/components/tools/market-forecast-report.tsx +1150 -0
  27. package/src/components/tools/registry.ts +13 -0
  28. package/src/components/tools/workspace/index.ts +39 -0
  29. package/src/components/tools/workspace/tool-action-bar.tsx +99 -0
  30. package/src/components/tools/workspace/tool-empty-panel.tsx +32 -0
  31. package/src/components/tools/workspace/tool-error-panel.tsx +40 -0
  32. package/src/components/tools/workspace/tool-field.tsx +124 -0
  33. package/src/components/tools/workspace/tool-file-upload.tsx +112 -0
  34. package/src/components/tools/workspace/tool-form-section.tsx +21 -0
  35. package/src/components/tools/workspace/tool-form-shell.tsx +36 -0
  36. package/src/components/tools/workspace/tool-loading-panel.tsx +269 -0
  37. package/src/components/tools/workspace/tool-option-row.tsx +97 -0
  38. package/src/components/tools/workspace/tool-preview-panel.tsx +31 -0
  39. package/src/components/tools/workspace/tool-result-actions.tsx +67 -0
  40. package/src/components/tools/workspace/tool-result-file-actions.ts +31 -0
  41. package/src/components/tools/workspace/tool-result-header.tsx +39 -0
  42. package/src/components/tools/workspace/tool-status.tsx +13 -0
  43. package/src/components/tools/workspace/tool-workspace-layout.tsx +226 -0
  44. package/src/constants/LKS.ts +29 -0
  45. package/src/constants/related-tools.ts +18 -0
  46. package/src/constants/social-profile-kit.ts +284 -0
  47. package/src/constants/tool-assets.ts +7 -0
  48. package/src/env.d.ts +3 -0
  49. package/src/features/tools/_templates/standard-tool.container.tsx +90 -0
  50. package/src/features/tools/app-icon-resizer/app-icon-resizer.container.tsx +11 -0
  51. package/src/features/tools/app-icon-resizer/app-icon-resizer.spec.ts +15 -0
  52. package/src/features/tools/app-icon-resizer/widget/app-icon-resizer.tsx +444 -0
  53. package/src/features/tools/app-icon-resizer/widget/constants.ts +19 -0
  54. package/src/features/tools/app-icon-resizer/widget/helpers.ts +314 -0
  55. package/src/features/tools/app-icon-resizer/widget/index.ts +7 -0
  56. package/src/features/tools/app-icon-resizer/widget/platform-icons.tsx +59 -0
  57. package/src/features/tools/app-icon-resizer/widget/preview-dialogs.tsx +139 -0
  58. package/src/features/tools/app-icon-resizer/widget/result-shell.tsx +165 -0
  59. package/src/features/tools/app-icon-resizer/widget/types.ts +36 -0
  60. package/src/features/tools/app-store-screenshot-generator/app-store-screenshot-generator.container.tsx +108 -0
  61. package/src/features/tools/app-store-screenshot-generator/app-store-screenshot-generator.spec.ts +14 -0
  62. package/src/features/tools/app-store-screenshot-generator/config.ts +3 -0
  63. package/src/features/tools/app-store-screenshot-generator/widget/app-store-screenshot-generator.tsx +1250 -0
  64. package/src/features/tools/app-store-screenshot-generator/widget/asset-slots.ts +76 -0
  65. package/src/features/tools/app-store-screenshot-generator/widget/constants.ts +43 -0
  66. package/src/features/tools/app-store-screenshot-generator/widget/form-controls.tsx +214 -0
  67. package/src/features/tools/app-store-screenshot-generator/widget/generation.ts +528 -0
  68. package/src/features/tools/app-store-screenshot-generator/widget/index.ts +7 -0
  69. package/src/features/tools/app-store-screenshot-generator/widget/input-media.ts +175 -0
  70. package/src/features/tools/app-store-screenshot-generator/widget/types.ts +60 -0
  71. package/src/features/tools/app-store-screenshot-generator/widget/zip.ts +119 -0
  72. package/src/features/tools/build-in-public-story-generator/build-in-public-story-generator.container.tsx +135 -0
  73. package/src/features/tools/build-in-public-story-generator/build-in-public-story-generator.spec.ts +15 -0
  74. package/src/features/tools/build-in-public-story-generator/widget/build-in-public-story-generator.tsx +314 -0
  75. package/src/features/tools/build-in-public-story-generator/widget/constants.ts +3 -0
  76. package/src/features/tools/build-in-public-story-generator/widget/helpers.ts +25 -0
  77. package/src/features/tools/build-in-public-story-generator/widget/index.ts +7 -0
  78. package/src/features/tools/build-in-public-story-generator/widget/preview-panels.tsx +58 -0
  79. package/src/features/tools/build-in-public-story-generator/widget/result-shell.tsx +164 -0
  80. package/src/features/tools/build-in-public-story-generator/widget/types.ts +6 -0
  81. package/src/features/tools/cold-start-channel-selector/cold-start-channel-selector.container.tsx +30 -0
  82. package/src/features/tools/cold-start-channel-selector/cold-start-channel-selector.spec.ts +15 -0
  83. package/src/features/tools/cold-start-channel-selector/widget/cold-start-channel-selector.tsx +417 -0
  84. package/src/features/tools/cold-start-channel-selector/widget/constants.ts +46 -0
  85. package/src/features/tools/cold-start-channel-selector/widget/form-controls.tsx +41 -0
  86. package/src/features/tools/cold-start-channel-selector/widget/helpers.ts +75 -0
  87. package/src/features/tools/cold-start-channel-selector/widget/index.ts +7 -0
  88. package/src/features/tools/cold-start-channel-selector/widget/preview-panels.tsx +250 -0
  89. package/src/features/tools/cold-start-channel-selector/widget/result-shell.tsx +199 -0
  90. package/src/features/tools/cold-start-channel-selector/widget/types.ts +21 -0
  91. package/src/features/tools/commercial-bp-generator/commercial-bp-generator.container.tsx +102 -0
  92. package/src/features/tools/commercial-bp-generator/commercial-bp-generator.spec.ts +14 -0
  93. package/src/features/tools/commercial-bp-generator/widget/commercial-bp-generator.tsx +676 -0
  94. package/src/features/tools/commercial-bp-generator/widget/constants.ts +32 -0
  95. package/src/features/tools/commercial-bp-generator/widget/helpers.ts +147 -0
  96. package/src/features/tools/commercial-bp-generator/widget/index.ts +7 -0
  97. package/src/features/tools/commercial-bp-generator/widget/result-shell.tsx +271 -0
  98. package/src/features/tools/commercial-bp-generator/widget/style-option.tsx +54 -0
  99. package/src/features/tools/commercial-bp-generator/widget/types.ts +33 -0
  100. package/src/features/tools/community-feedback-inbox/community-feedback-inbox.container.tsx +126 -0
  101. package/src/features/tools/community-feedback-inbox/community-feedback-inbox.spec.ts +15 -0
  102. package/src/features/tools/community-feedback-inbox/widget/community-feedback-inbox.tsx +271 -0
  103. package/src/features/tools/community-feedback-inbox/widget/constants.ts +3 -0
  104. package/src/features/tools/community-feedback-inbox/widget/helpers.ts +28 -0
  105. package/src/features/tools/community-feedback-inbox/widget/index.ts +7 -0
  106. package/src/features/tools/community-feedback-inbox/widget/preview-panels.tsx +92 -0
  107. package/src/features/tools/community-feedback-inbox/widget/result-shell.tsx +266 -0
  108. package/src/features/tools/community-feedback-inbox/widget/types.ts +6 -0
  109. package/src/features/tools/community-pain-point-extractor/community-pain-point-extractor.container.tsx +124 -0
  110. package/src/features/tools/community-pain-point-extractor/community-pain-point-extractor.spec.ts +15 -0
  111. package/src/features/tools/community-pain-point-extractor/widget/community-pain-point-extractor.tsx +404 -0
  112. package/src/features/tools/community-pain-point-extractor/widget/constants.ts +41 -0
  113. package/src/features/tools/community-pain-point-extractor/widget/helpers.ts +76 -0
  114. package/src/features/tools/community-pain-point-extractor/widget/index.ts +8 -0
  115. package/src/features/tools/community-pain-point-extractor/widget/progress-panels.tsx +251 -0
  116. package/src/features/tools/community-pain-point-extractor/widget/result-shell.tsx +478 -0
  117. package/src/features/tools/community-pain-point-extractor/widget/types.ts +33 -0
  118. package/src/features/tools/community-post-risk-checker/community-post-risk-checker.package.ts +792 -0
  119. package/src/features/tools/competitor-analysis/competitor-analysis.container.tsx +136 -0
  120. package/src/features/tools/competitor-analysis/competitor-analysis.spec.ts +15 -0
  121. package/src/features/tools/competitor-analysis/widget/competitor-analysis.tsx +241 -0
  122. package/src/features/tools/competitor-analysis/widget/constants.ts +9 -0
  123. package/src/features/tools/competitor-analysis/widget/index.ts +7 -0
  124. package/src/features/tools/competitor-analysis/widget/preview-panels.tsx +60 -0
  125. package/src/features/tools/competitor-analysis/widget/result-shell.tsx +418 -0
  126. package/src/features/tools/competitor-analysis/widget/types.ts +13 -0
  127. package/src/features/tools/disclaimer-generator/disclaimer-generator.package.ts +339 -0
  128. package/src/features/tools/email-template-generator/email-template-generator.container.tsx +224 -0
  129. package/src/features/tools/email-template-generator/email-template-generator.spec.ts +14 -0
  130. package/src/features/tools/email-template-generator/widget/email-template-generator.tsx +358 -0
  131. package/src/features/tools/email-template-generator/widget/helpers.ts +39 -0
  132. package/src/features/tools/email-template-generator/widget/index.ts +7 -0
  133. package/src/features/tools/email-template-generator/widget/preview-panel.tsx +311 -0
  134. package/src/features/tools/email-template-generator/widget/result-text-block.tsx +7 -0
  135. package/src/features/tools/email-template-generator/widget/types.ts +24 -0
  136. package/src/features/tools/gtm-readiness-checklist/gtm-readiness-checklist.container.tsx +75 -0
  137. package/src/features/tools/gtm-readiness-checklist/gtm-readiness-checklist.spec.ts +15 -0
  138. package/src/features/tools/gtm-readiness-checklist/widget/gtm-readiness-checklist.tsx +122 -0
  139. package/src/features/tools/gtm-readiness-checklist/widget/index.ts +7 -0
  140. package/src/features/tools/investor-matching-planner/investor-matching-planner.package.ts +869 -0
  141. package/src/features/tools/koko-codex-assistant/koko-codex-assistant.container.tsx +151 -0
  142. package/src/features/tools/koko-codex-assistant/koko-codex-assistant.spec.ts +14 -0
  143. package/src/features/tools/koko-codex-assistant/widget/index.ts +7 -0
  144. package/src/features/tools/koko-codex-assistant/widget/koko-codex-assistant-download.tsx +192 -0
  145. package/src/features/tools/logo-generator/logo-generator.container.tsx +112 -0
  146. package/src/features/tools/logo-generator/logo-generator.spec.ts +15 -0
  147. package/src/features/tools/logo-generator/widget/index.ts +7 -0
  148. package/src/features/tools/logo-generator/widget/logo-generator.tsx +1244 -0
  149. package/src/features/tools/market-forecast-report/market-forecast-report.container.tsx +73 -0
  150. package/src/features/tools/market-forecast-report/market-forecast-report.spec.ts +15 -0
  151. package/src/features/tools/million-user-growth-test/million-user-growth-test.container.tsx +123 -0
  152. package/src/features/tools/million-user-growth-test/million-user-growth-test.spec.ts +14 -0
  153. package/src/features/tools/million-user-growth-test/widget/index.ts +7 -0
  154. package/src/features/tools/million-user-growth-test/widget/million-user-growth-test.tsx +433 -0
  155. package/src/features/tools/module-loader.ts +107 -0
  156. package/src/features/tools/og-image-generator/og-image-generator.container.tsx +86 -0
  157. package/src/features/tools/og-image-generator/og-image-generator.spec.ts +14 -0
  158. package/src/features/tools/og-image-generator/widget/constants.ts +38 -0
  159. package/src/features/tools/og-image-generator/widget/form-fields.tsx +240 -0
  160. package/src/features/tools/og-image-generator/widget/index.ts +7 -0
  161. package/src/features/tools/og-image-generator/widget/og-image-generator.tsx +742 -0
  162. package/src/features/tools/og-image-generator/widget/preview-panel.tsx +305 -0
  163. package/src/features/tools/og-image-generator/widget/types.ts +1 -0
  164. package/src/features/tools/package/direct-models.ts +20 -0
  165. package/src/features/tools/package/form.ts +38 -0
  166. package/src/features/tools/package/l10n.ts +22 -0
  167. package/src/features/tools/package/package-container.tsx +285 -0
  168. package/src/features/tools/package/package-loaders.ts +22 -0
  169. package/src/features/tools/package/package-registry.ts +36 -0
  170. package/src/features/tools/package/result-markdown.ts +142 -0
  171. package/src/features/tools/package/schema.ts +379 -0
  172. package/src/features/tools/package/to-tool-module.ts +20 -0
  173. package/src/features/tools/package/to-tool-spec.ts +52 -0
  174. package/src/features/tools/package/types.ts +381 -0
  175. package/src/features/tools/pitch-deck-generator/pitch-deck-generator.container.tsx +175 -0
  176. package/src/features/tools/pitch-deck-generator/pitch-deck-generator.spec.ts +14 -0
  177. package/src/features/tools/pitch-deck-generator/pitch-deck-library-data.ts +476 -0
  178. package/src/features/tools/pitch-deck-generator/pitch-deck-library.tsx +159 -0
  179. package/src/features/tools/pitch-deck-generator/widget/ceremony-line.tsx +27 -0
  180. package/src/features/tools/pitch-deck-generator/widget/constants.ts +27 -0
  181. package/src/features/tools/pitch-deck-generator/widget/index.ts +7 -0
  182. package/src/features/tools/pitch-deck-generator/widget/pitch-deck-generator.tsx +763 -0
  183. package/src/features/tools/pitch-deck-generator/widget/result-helpers.ts +102 -0
  184. package/src/features/tools/pitch-deck-generator/widget/result-shell.tsx +263 -0
  185. package/src/features/tools/pitch-deck-generator/widget/slide-frame.tsx +106 -0
  186. package/src/features/tools/pitch-deck-generator/widget/slide-lightbox.tsx +149 -0
  187. package/src/features/tools/pitch-deck-generator/widget/style-option.tsx +54 -0
  188. package/src/features/tools/pitch-deck-generator/widget/types.ts +44 -0
  189. package/src/features/tools/product-agreement-generator/product-agreement-generator.container.tsx +137 -0
  190. package/src/features/tools/product-agreement-generator/product-agreement-generator.spec.ts +14 -0
  191. package/src/features/tools/product-agreement-generator/widget/constants.ts +27 -0
  192. package/src/features/tools/product-agreement-generator/widget/form-controls.tsx +218 -0
  193. package/src/features/tools/product-agreement-generator/widget/helpers.ts +68 -0
  194. package/src/features/tools/product-agreement-generator/widget/index.ts +7 -0
  195. package/src/features/tools/product-agreement-generator/widget/product-agreement-generator.tsx +671 -0
  196. package/src/features/tools/product-agreement-generator/widget/result-shell.tsx +473 -0
  197. package/src/features/tools/product-agreement-generator/widget/types.ts +89 -0
  198. package/src/features/tools/product-hunt-launch-planner/product-hunt-launch-planner.container.tsx +122 -0
  199. package/src/features/tools/product-hunt-launch-planner/product-hunt-launch-planner.spec.ts +15 -0
  200. package/src/features/tools/product-hunt-launch-planner/widget/constants.ts +5 -0
  201. package/src/features/tools/product-hunt-launch-planner/widget/helpers.ts +44 -0
  202. package/src/features/tools/product-hunt-launch-planner/widget/index.ts +7 -0
  203. package/src/features/tools/product-hunt-launch-planner/widget/preview-panel.tsx +143 -0
  204. package/src/features/tools/product-hunt-launch-planner/widget/product-hunt-launch-planner.tsx +504 -0
  205. package/src/features/tools/product-hunt-launch-planner/widget/result-shell.tsx +176 -0
  206. package/src/features/tools/product-hunt-launch-planner/widget/types.ts +20 -0
  207. package/src/features/tools/product-name-generator/product-name-generator.container.tsx +14 -0
  208. package/src/features/tools/product-name-generator/product-name-generator.spec.ts +15 -0
  209. package/src/features/tools/product-name-generator/widget/candidate-card.tsx +273 -0
  210. package/src/features/tools/product-name-generator/widget/constants.ts +21 -0
  211. package/src/features/tools/product-name-generator/widget/form-controls.tsx +136 -0
  212. package/src/features/tools/product-name-generator/widget/helpers.ts +41 -0
  213. package/src/features/tools/product-name-generator/widget/index.ts +7 -0
  214. package/src/features/tools/product-name-generator/widget/product-name-generator.tsx +776 -0
  215. package/src/features/tools/product-name-generator/widget/types.ts +36 -0
  216. package/src/features/tools/product-positioning-analyzer/product-positioning-analyzer.package.ts +801 -0
  217. package/src/features/tools/product-poster-generator/product-poster-generator.container.tsx +14 -0
  218. package/src/features/tools/product-poster-generator/product-poster-generator.spec.ts +15 -0
  219. package/src/features/tools/product-poster-generator/widget/constants.ts +125 -0
  220. package/src/features/tools/product-poster-generator/widget/form-controls.tsx +204 -0
  221. package/src/features/tools/product-poster-generator/widget/helpers.ts +155 -0
  222. package/src/features/tools/product-poster-generator/widget/index.ts +7 -0
  223. package/src/features/tools/product-poster-generator/widget/product-poster-generator.tsx +663 -0
  224. package/src/features/tools/product-poster-generator/widget/result-shell.tsx +12 -0
  225. package/src/features/tools/product-poster-generator/widget/types.ts +83 -0
  226. package/src/features/tools/product-ui-generator/product-ui-generator.container.tsx +116 -0
  227. package/src/features/tools/product-ui-generator/product-ui-generator.spec.ts +14 -0
  228. package/src/features/tools/product-ui-generator/widget/constants.ts +18 -0
  229. package/src/features/tools/product-ui-generator/widget/helpers.ts +11 -0
  230. package/src/features/tools/product-ui-generator/widget/index.ts +7 -0
  231. package/src/features/tools/product-ui-generator/widget/preview-panels.tsx +73 -0
  232. package/src/features/tools/product-ui-generator/widget/product-ui-generator.tsx +304 -0
  233. package/src/features/tools/product-ui-generator/widget/result-shell.tsx +118 -0
  234. package/src/features/tools/product-ui-generator/widget/types.ts +9 -0
  235. package/src/features/tools/reddit-pain-point-finder/reddit-pain-point-finder.container.tsx +113 -0
  236. package/src/features/tools/reddit-pain-point-finder/reddit-pain-point-finder.spec.ts +15 -0
  237. package/src/features/tools/reddit-pain-point-finder/widget/constants.ts +5 -0
  238. package/src/features/tools/reddit-pain-point-finder/widget/index.ts +7 -0
  239. package/src/features/tools/reddit-pain-point-finder/widget/preview-panels.tsx +73 -0
  240. package/src/features/tools/reddit-pain-point-finder/widget/reddit-pain-point-finder.tsx +281 -0
  241. package/src/features/tools/reddit-pain-point-finder/widget/result-shell.tsx +203 -0
  242. package/src/features/tools/reddit-pain-point-finder/widget/types.ts +15 -0
  243. package/src/features/tools/registry.ts +288 -0
  244. package/src/features/tools/runtime-registry.ts +186 -0
  245. package/src/features/tools/shared/create-guide-stack-container.tsx +176 -0
  246. package/src/features/tools/shared/create-standard-landing-container.tsx +163 -0
  247. package/src/features/tools/shared/tool-content-sections.tsx +659 -0
  248. package/src/features/tools/shared/tool-cta.tsx +66 -0
  249. package/src/features/tools/shared/tool-draft-view.tsx +53 -0
  250. package/src/features/tools/shared/tool-guide-section.tsx +191 -0
  251. package/src/features/tools/shared/tool-handoff.tsx +38 -0
  252. package/src/features/tools/shared/tool-mcp-badge.tsx +23 -0
  253. package/src/features/tools/shared/tool-message-translator.ts +37 -0
  254. package/src/features/tools/shared/tool-page-shell.tsx +348 -0
  255. package/src/features/tools/shared/tool-standard-generation-steps.tsx +52 -0
  256. package/src/features/tools/shared/tool-standard-landing-sections.tsx +447 -0
  257. package/src/features/tools/shared/tool-ui-registry.ts +237 -0
  258. package/src/features/tools/shared/tool-widget-slot.tsx +29 -0
  259. package/src/features/tools/slogan-generator/slogan-generator.package.ts +641 -0
  260. package/src/features/tools/social-listening-research-report/social-listening-research-report.container.tsx +124 -0
  261. package/src/features/tools/social-listening-research-report/social-listening-research-report.spec.ts +15 -0
  262. package/src/features/tools/social-listening-research-report/widget/constants.ts +4 -0
  263. package/src/features/tools/social-listening-research-report/widget/index.ts +7 -0
  264. package/src/features/tools/social-listening-research-report/widget/preview-panels.tsx +73 -0
  265. package/src/features/tools/social-listening-research-report/widget/result-shell.tsx +216 -0
  266. package/src/features/tools/social-listening-research-report/widget/social-listening-research-report.tsx +303 -0
  267. package/src/features/tools/social-listening-research-report/widget/types.ts +15 -0
  268. package/src/features/tools/social-platform-asset-adapter/social-platform-asset-adapter.container.tsx +123 -0
  269. package/src/features/tools/social-platform-asset-adapter/social-platform-asset-adapter.spec.ts +15 -0
  270. package/src/features/tools/social-platform-asset-adapter/widget/constants.ts +43 -0
  271. package/src/features/tools/social-platform-asset-adapter/widget/helpers.ts +249 -0
  272. package/src/features/tools/social-platform-asset-adapter/widget/index.ts +7 -0
  273. package/src/features/tools/social-platform-asset-adapter/widget/result-shell.tsx +350 -0
  274. package/src/features/tools/social-platform-asset-adapter/widget/section-heading.tsx +18 -0
  275. package/src/features/tools/social-platform-asset-adapter/widget/social-platform-asset-adapter.tsx +641 -0
  276. package/src/features/tools/social-platform-asset-adapter/widget/types.ts +40 -0
  277. package/src/features/tools/social-profile-kit/social-profile-kit.container.tsx +177 -0
  278. package/src/features/tools/social-profile-kit/social-profile-kit.spec.ts +15 -0
  279. package/src/features/tools/social-profile-kit/widget/context-editor.tsx +171 -0
  280. package/src/features/tools/social-profile-kit/widget/generation-runtime.ts +281 -0
  281. package/src/features/tools/social-profile-kit/widget/index.ts +7 -0
  282. package/src/features/tools/social-profile-kit/widget/input-panel.tsx +294 -0
  283. package/src/features/tools/social-profile-kit/widget/platform-dock.tsx +115 -0
  284. package/src/features/tools/social-profile-kit/widget/profile-canvas.tsx +318 -0
  285. package/src/features/tools/social-profile-kit/widget/profile-preview/bluesky-preview.tsx +188 -0
  286. package/src/features/tools/social-profile-kit/widget/profile-preview/facebook-preview.tsx +168 -0
  287. package/src/features/tools/social-profile-kit/widget/profile-preview/index.ts +1 -0
  288. package/src/features/tools/social-profile-kit/widget/profile-preview/instagram-preview.tsx +278 -0
  289. package/src/features/tools/social-profile-kit/widget/profile-preview/linkedin-preview.tsx +358 -0
  290. package/src/features/tools/social-profile-kit/widget/profile-preview/profile-preview.tsx +348 -0
  291. package/src/features/tools/social-profile-kit/widget/profile-preview/shared.tsx +391 -0
  292. package/src/features/tools/social-profile-kit/widget/profile-preview/threads-preview.tsx +148 -0
  293. package/src/features/tools/social-profile-kit/widget/profile-preview/tiktok-preview.tsx +319 -0
  294. package/src/features/tools/social-profile-kit/widget/profile-preview/x-preview.tsx +341 -0
  295. package/src/features/tools/social-profile-kit/widget/profile-preview/youtube-preview.tsx +297 -0
  296. package/src/features/tools/social-profile-kit/widget/social-profile-kit-generator.tsx +1059 -0
  297. package/src/features/tools/social-profile-kit/widget/types.ts +104 -0
  298. package/src/features/tools/spec-registry.ts +158 -0
  299. package/src/features/tools/startup-idea-research/startup-idea-research.container.tsx +111 -0
  300. package/src/features/tools/startup-idea-research/startup-idea-research.spec.ts +15 -0
  301. package/src/features/tools/startup-idea-research/widget/constants.ts +11 -0
  302. package/src/features/tools/startup-idea-research/widget/index.ts +7 -0
  303. package/src/features/tools/startup-idea-research/widget/preview-panels.tsx +67 -0
  304. package/src/features/tools/startup-idea-research/widget/result-shell.tsx +323 -0
  305. package/src/features/tools/startup-idea-research/widget/startup-idea-research.tsx +272 -0
  306. package/src/features/tools/startup-idea-research/widget/types.ts +21 -0
  307. package/src/features/tools/tarot-reading/tarot-reading.container.tsx +412 -0
  308. package/src/features/tools/tarot-reading/tarot-reading.spec.ts +15 -0
  309. package/src/features/tools/tarot-reading/widget/cards.tsx +152 -0
  310. package/src/features/tools/tarot-reading/widget/constants.ts +69 -0
  311. package/src/features/tools/tarot-reading/widget/deck-view.tsx +86 -0
  312. package/src/features/tools/tarot-reading/widget/deck.ts +86 -0
  313. package/src/features/tools/tarot-reading/widget/index.ts +7 -0
  314. package/src/features/tools/tarot-reading/widget/landing-view.tsx +209 -0
  315. package/src/features/tools/tarot-reading/widget/reading-copy.tsx +138 -0
  316. package/src/features/tools/tarot-reading/widget/reading-view.tsx +189 -0
  317. package/src/features/tools/tarot-reading/widget/reveal-view.tsx +50 -0
  318. package/src/features/tools/tarot-reading/widget/ritual-view.tsx +276 -0
  319. package/src/features/tools/tarot-reading/widget/tarot-reading.tsx +262 -0
  320. package/src/features/tools/tarot-reading/widget/types.ts +22 -0
  321. package/src/features/tools/twitter-gif-downloader/twitter-gif-downloader.container.tsx +114 -0
  322. package/src/features/tools/twitter-gif-downloader/twitter-gif-downloader.spec.ts +14 -0
  323. package/src/features/tools/twitter-gif-downloader/widget/index.ts +7 -0
  324. package/src/features/tools/twitter-gif-downloader/widget/twitter-gif-downloader.tsx +351 -0
  325. package/src/features/tools/types.ts +68 -0
  326. package/src/features/tools/user-interview-guide-generator/user-interview-guide-generator.package.ts +774 -0
  327. package/src/features/tools/user-interview-insight-report-generator/user-interview-insight-report-generator.container.tsx +23 -0
  328. package/src/features/tools/user-interview-insight-report-generator/user-interview-insight-report-generator.spec.ts +14 -0
  329. package/src/features/tools/user-interview-insight-report-generator/widget/constants.ts +8 -0
  330. package/src/features/tools/user-interview-insight-report-generator/widget/helpers.ts +4 -0
  331. package/src/features/tools/user-interview-insight-report-generator/widget/index.ts +7 -0
  332. package/src/features/tools/user-interview-insight-report-generator/widget/preview-panels.tsx +55 -0
  333. package/src/features/tools/user-interview-insight-report-generator/widget/result-shell.tsx +122 -0
  334. package/src/features/tools/user-interview-insight-report-generator/widget/types.ts +16 -0
  335. package/src/features/tools/user-interview-insight-report-generator/widget/user-interview-insight-report-generator.tsx +293 -0
  336. package/src/features/tools/user-interview-record-generator/user-interview-record-generator.container.tsx +18 -0
  337. package/src/features/tools/user-interview-record-generator/user-interview-record-generator.spec.ts +14 -0
  338. package/src/features/tools/user-interview-record-generator/widget/constants.ts +9 -0
  339. package/src/features/tools/user-interview-record-generator/widget/helpers.ts +4 -0
  340. package/src/features/tools/user-interview-record-generator/widget/index.ts +7 -0
  341. package/src/features/tools/user-interview-record-generator/widget/preview-panels.tsx +48 -0
  342. package/src/features/tools/user-interview-record-generator/widget/result-shell.tsx +128 -0
  343. package/src/features/tools/user-interview-record-generator/widget/types.ts +16 -0
  344. package/src/features/tools/user-interview-record-generator/widget/user-interview-record-generator.tsx +305 -0
  345. package/src/features/tools/utm-builder/utm-builder.package.ts +846 -0
  346. package/src/features/tools/widget-registry.ts +73 -0
  347. package/src/generated/mcp-tools-registry.json +17 -0
  348. package/src/host/client-proxy.test.ts +33 -0
  349. package/src/host/client.ts +678 -0
  350. package/src/host/server.ts +119 -0
  351. package/src/i18n/client.ts +11 -0
  352. package/src/i18n/locale-fallback.ts +38 -0
  353. package/src/i18n/locale.ts +18 -0
  354. package/src/i18n/messages/en/page/tools.ts +124 -0
  355. package/src/i18n/messages/en/tools/app-icon-resizer.ts +244 -0
  356. package/src/i18n/messages/en/tools/app-store-screenshot-generator.ts +145 -0
  357. package/src/i18n/messages/en/tools/build-in-public-story-generator.ts +229 -0
  358. package/src/i18n/messages/en/tools/cold-start-channel-selector.ts +423 -0
  359. package/src/i18n/messages/en/tools/commercial-bp-generator.ts +304 -0
  360. package/src/i18n/messages/en/tools/community-feedback-inbox.ts +218 -0
  361. package/src/i18n/messages/en/tools/community-pain-point-extractor.ts +230 -0
  362. package/src/i18n/messages/en/tools/community-post-risk-checker.ts +209 -0
  363. package/src/i18n/messages/en/tools/competitor-analysis.ts +197 -0
  364. package/src/i18n/messages/en/tools/email-template-generator.ts +302 -0
  365. package/src/i18n/messages/en/tools/engine.ts +69 -0
  366. package/src/i18n/messages/en/tools/gtm-readiness-checklist.ts +166 -0
  367. package/src/i18n/messages/en/tools/index.ts +73 -0
  368. package/src/i18n/messages/en/tools/koko-codex-assistant.ts +171 -0
  369. package/src/i18n/messages/en/tools/logo-generator.ts +173 -0
  370. package/src/i18n/messages/en/tools/market-forecast-report.ts +228 -0
  371. package/src/i18n/messages/en/tools/million-user-growth-test.ts +386 -0
  372. package/src/i18n/messages/en/tools/og-image-generator.ts +172 -0
  373. package/src/i18n/messages/en/tools/pitch-deck-generator.ts +358 -0
  374. package/src/i18n/messages/en/tools/product-agreement-generator.ts +411 -0
  375. package/src/i18n/messages/en/tools/product-hunt-launch-planner.ts +272 -0
  376. package/src/i18n/messages/en/tools/product-name-generator.ts +383 -0
  377. package/src/i18n/messages/en/tools/product-poster-generator.ts +294 -0
  378. package/src/i18n/messages/en/tools/product-ui-generator.ts +234 -0
  379. package/src/i18n/messages/en/tools/reddit-pain-point-finder.ts +163 -0
  380. package/src/i18n/messages/en/tools/shared.ts +24 -0
  381. package/src/i18n/messages/en/tools/social-listening-research-report.ts +185 -0
  382. package/src/i18n/messages/en/tools/social-media-profile-generator.ts +22 -0
  383. package/src/i18n/messages/en/tools/social-platform-asset-adapter.ts +287 -0
  384. package/src/i18n/messages/en/tools/social-profile-kit.ts +150 -0
  385. package/src/i18n/messages/en/tools/startup-idea-research.ts +170 -0
  386. package/src/i18n/messages/en/tools/tarot-reading.ts +230 -0
  387. package/src/i18n/messages/en/tools/twitter-gif-downloader.ts +145 -0
  388. package/src/i18n/messages/en/tools/user-interview-insight-report-generator.ts +242 -0
  389. package/src/i18n/messages/en/tools/user-interview-record-generator.ts +244 -0
  390. package/src/i18n/messages/en/tools-ui.ts +704 -0
  391. package/src/i18n/messages/zh/page/tools.ts +124 -0
  392. package/src/i18n/messages/zh/tools/app-icon-resizer.ts +242 -0
  393. package/src/i18n/messages/zh/tools/app-store-screenshot-generator.ts +145 -0
  394. package/src/i18n/messages/zh/tools/build-in-public-story-generator.ts +230 -0
  395. package/src/i18n/messages/zh/tools/cold-start-channel-selector.ts +422 -0
  396. package/src/i18n/messages/zh/tools/commercial-bp-generator.ts +302 -0
  397. package/src/i18n/messages/zh/tools/community-feedback-inbox.ts +217 -0
  398. package/src/i18n/messages/zh/tools/community-pain-point-extractor.ts +230 -0
  399. package/src/i18n/messages/zh/tools/community-post-risk-checker.ts +200 -0
  400. package/src/i18n/messages/zh/tools/competitor-analysis.ts +192 -0
  401. package/src/i18n/messages/zh/tools/email-template-generator.ts +302 -0
  402. package/src/i18n/messages/zh/tools/engine.ts +68 -0
  403. package/src/i18n/messages/zh/tools/gtm-readiness-checklist.ts +166 -0
  404. package/src/i18n/messages/zh/tools/index.ts +73 -0
  405. package/src/i18n/messages/zh/tools/koko-codex-assistant.ts +170 -0
  406. package/src/i18n/messages/zh/tools/logo-generator.ts +172 -0
  407. package/src/i18n/messages/zh/tools/market-forecast-report.ts +228 -0
  408. package/src/i18n/messages/zh/tools/million-user-growth-test.ts +385 -0
  409. package/src/i18n/messages/zh/tools/og-image-generator.ts +173 -0
  410. package/src/i18n/messages/zh/tools/pitch-deck-generator.ts +358 -0
  411. package/src/i18n/messages/zh/tools/product-agreement-generator.ts +401 -0
  412. package/src/i18n/messages/zh/tools/product-hunt-launch-planner.ts +267 -0
  413. package/src/i18n/messages/zh/tools/product-name-generator.ts +383 -0
  414. package/src/i18n/messages/zh/tools/product-poster-generator.ts +282 -0
  415. package/src/i18n/messages/zh/tools/product-ui-generator.ts +234 -0
  416. package/src/i18n/messages/zh/tools/reddit-pain-point-finder.ts +162 -0
  417. package/src/i18n/messages/zh/tools/shared.ts +24 -0
  418. package/src/i18n/messages/zh/tools/social-listening-research-report.ts +181 -0
  419. package/src/i18n/messages/zh/tools/social-media-profile-generator.ts +22 -0
  420. package/src/i18n/messages/zh/tools/social-platform-asset-adapter.ts +284 -0
  421. package/src/i18n/messages/zh/tools/social-profile-kit.ts +150 -0
  422. package/src/i18n/messages/zh/tools/startup-idea-research.ts +165 -0
  423. package/src/i18n/messages/zh/tools/tarot-reading.ts +228 -0
  424. package/src/i18n/messages/zh/tools/twitter-gif-downloader.ts +138 -0
  425. package/src/i18n/messages/zh/tools/user-interview-insight-report-generator.ts +224 -0
  426. package/src/i18n/messages/zh/tools/user-interview-record-generator.ts +226 -0
  427. package/src/i18n/messages/zh/tools-ui.ts +684 -0
  428. package/src/i18n/messages/zh-tw/page/tools.ts +115 -0
  429. package/src/i18n/messages/zh-tw/tools/app-icon-resizer.ts +242 -0
  430. package/src/i18n/messages/zh-tw/tools/app-store-screenshot-generator.ts +145 -0
  431. package/src/i18n/messages/zh-tw/tools/build-in-public-story-generator.ts +230 -0
  432. package/src/i18n/messages/zh-tw/tools/cold-start-channel-selector.ts +440 -0
  433. package/src/i18n/messages/zh-tw/tools/commercial-bp-generator.ts +302 -0
  434. package/src/i18n/messages/zh-tw/tools/community-feedback-inbox.ts +217 -0
  435. package/src/i18n/messages/zh-tw/tools/community-pain-point-extractor.ts +230 -0
  436. package/src/i18n/messages/zh-tw/tools/community-post-risk-checker.ts +200 -0
  437. package/src/i18n/messages/zh-tw/tools/competitor-analysis.ts +192 -0
  438. package/src/i18n/messages/zh-tw/tools/email-template-generator.ts +302 -0
  439. package/src/i18n/messages/zh-tw/tools/engine.ts +68 -0
  440. package/src/i18n/messages/zh-tw/tools/gtm-readiness-checklist.ts +166 -0
  441. package/src/i18n/messages/zh-tw/tools/index.ts +73 -0
  442. package/src/i18n/messages/zh-tw/tools/koko-codex-assistant.ts +170 -0
  443. package/src/i18n/messages/zh-tw/tools/logo-generator.ts +71 -0
  444. package/src/i18n/messages/zh-tw/tools/market-forecast-report.ts +228 -0
  445. package/src/i18n/messages/zh-tw/tools/million-user-growth-test.ts +385 -0
  446. package/src/i18n/messages/zh-tw/tools/og-image-generator.ts +173 -0
  447. package/src/i18n/messages/zh-tw/tools/pitch-deck-generator.ts +358 -0
  448. package/src/i18n/messages/zh-tw/tools/product-agreement-generator.ts +401 -0
  449. package/src/i18n/messages/zh-tw/tools/product-hunt-launch-planner.ts +267 -0
  450. package/src/i18n/messages/zh-tw/tools/product-name-generator.ts +383 -0
  451. package/src/i18n/messages/zh-tw/tools/product-poster-generator.ts +282 -0
  452. package/src/i18n/messages/zh-tw/tools/product-ui-generator.ts +234 -0
  453. package/src/i18n/messages/zh-tw/tools/reddit-pain-point-finder.ts +162 -0
  454. package/src/i18n/messages/zh-tw/tools/shared.ts +24 -0
  455. package/src/i18n/messages/zh-tw/tools/social-listening-research-report.ts +181 -0
  456. package/src/i18n/messages/zh-tw/tools/social-media-profile-generator.ts +22 -0
  457. package/src/i18n/messages/zh-tw/tools/social-platform-asset-adapter.ts +284 -0
  458. package/src/i18n/messages/zh-tw/tools/social-profile-kit.ts +150 -0
  459. package/src/i18n/messages/zh-tw/tools/startup-idea-research.ts +165 -0
  460. package/src/i18n/messages/zh-tw/tools/tarot-reading.ts +228 -0
  461. package/src/i18n/messages/zh-tw/tools/twitter-gif-downloader.ts +138 -0
  462. package/src/i18n/messages/zh-tw/tools/user-interview-insight-report-generator.ts +224 -0
  463. package/src/i18n/messages/zh-tw/tools/user-interview-record-generator.ts +226 -0
  464. package/src/i18n/messages/zh-tw/tools-ui.ts +525 -0
  465. package/src/index.ts +15 -0
  466. package/src/lib/activity-task-handoff.ts +404 -0
  467. package/src/lib/api/errors.ts +39 -0
  468. package/src/lib/app-origin.ts +30 -0
  469. package/src/lib/fact-claim-contract.ts +68 -0
  470. package/src/lib/fake-delay.ts +3 -0
  471. package/src/lib/file/download.ts +10 -0
  472. package/src/lib/routing/locale-paths.ts +27 -0
  473. package/src/lib/seo-meta.ts +3 -0
  474. package/src/lib/tools/app-icon-resizer-schema.ts +191 -0
  475. package/src/lib/tools/app-store-screenshot-generator-schema.ts +185 -0
  476. package/src/lib/tools/build-in-public-story-generator-schema.ts +67 -0
  477. package/src/lib/tools/build-in-public-story-generator.format.ts +507 -0
  478. package/src/lib/tools/cold-start-channel-selector-schema.ts +147 -0
  479. package/src/lib/tools/commercial-bp-generator-schema.ts +222 -0
  480. package/src/lib/tools/community-feedback-inbox-schema.ts +125 -0
  481. package/src/lib/tools/community-feedback-inbox.format.ts +764 -0
  482. package/src/lib/tools/community-pain-point-extractor-schema.ts +166 -0
  483. package/src/lib/tools/community-post-risk-checker-schema.ts +99 -0
  484. package/src/lib/tools/community-post-risk-checker.format.ts +557 -0
  485. package/src/lib/tools/competitor-analysis-schema.ts +144 -0
  486. package/src/lib/tools/draft-preview-access.ts +3 -0
  487. package/src/lib/tools/draft-store.ts +69 -0
  488. package/src/lib/tools/email-template-generator-schema.ts +124 -0
  489. package/src/lib/tools/gtm-checklist-copy.ts +57 -0
  490. package/src/lib/tools/gtm-checklist-structure.ts +37 -0
  491. package/src/lib/tools/image-download.ts +68 -0
  492. package/src/lib/tools/input-quality.ts +97 -0
  493. package/src/lib/tools/logo-generator-schema.ts +224 -0
  494. package/src/lib/tools/market-forecast-report-schema.ts +299 -0
  495. package/src/lib/tools/mcp-registry.ts +16 -0
  496. package/src/lib/tools/mcp-types.ts +18 -0
  497. package/src/lib/tools/million-user-growth-test-schema.ts +49 -0
  498. package/src/lib/tools/million-user-growth-test.ts +181 -0
  499. package/src/lib/tools/og-image-generator-render.ts +448 -0
  500. package/src/lib/tools/og-image-generator-schema.ts +140 -0
  501. package/src/lib/tools/ops-catalog.ts +102 -0
  502. package/src/lib/tools/pitch-deck-generator-schema.ts +182 -0
  503. package/src/lib/tools/pitch-deck-package.ts +0 -0
  504. package/src/lib/tools/product-agreement-generator-schema.ts +168 -0
  505. package/src/lib/tools/product-hunt-launch-planner-schema.ts +136 -0
  506. package/src/lib/tools/product-hunt-launch-planner.format.ts +72 -0
  507. package/src/lib/tools/product-name-generator-schema.ts +563 -0
  508. package/src/lib/tools/product-poster-generator-schema.ts +215 -0
  509. package/src/lib/tools/product-ui-generator-schema.ts +157 -0
  510. package/src/lib/tools/reddit-pain-point-finder-schema.ts +88 -0
  511. package/src/lib/tools/resolve-tool-locale-copy.ts +75 -0
  512. package/src/lib/tools/slug.ts +60 -0
  513. package/src/lib/tools/social-listening-research-report-schema.ts +105 -0
  514. package/src/lib/tools/social-platform-asset-adapter-schema.ts +152 -0
  515. package/src/lib/tools/social-profile-kit.constants.ts +12 -0
  516. package/src/lib/tools/social-profile-kit.generation.ts +257 -0
  517. package/src/lib/tools/social-profile-kit.input.ts +290 -0
  518. package/src/lib/tools/social-profile-kit.manual.ts +481 -0
  519. package/src/lib/tools/social-profile-kit.package.ts +220 -0
  520. package/src/lib/tools/social-profile-kit.schema.ts +328 -0
  521. package/src/lib/tools/startup-idea-research-schema.ts +107 -0
  522. package/src/lib/tools/tarot-imagery.ts +89 -0
  523. package/src/lib/tools/tarot-reading.ts +1044 -0
  524. package/src/lib/tools/tool-message-keys.ts +18 -0
  525. package/src/lib/tools/types.ts +32 -0
  526. package/src/lib/tools/user-interview.format.ts +147 -0
  527. package/src/lib/tools/user-interview.generation.ts +670 -0
  528. package/src/lib/tools/user-interview.schema.ts +192 -0
  529. package/src/lib/zip.ts +106 -0
  530. package/src/services/tools/handlers/gtm-readiness-checklist.ts +71 -0
  531. package/src/services/tools/handlers/types.ts +7 -0
@@ -0,0 +1,792 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AppLocale } from "../../../i18n/locale";
4
+ import {
5
+ communityPostRiskBriefSchema,
6
+ type CommunityPostRiskLevel,
7
+ } from "../../../lib/tools/community-post-risk-checker-schema";
8
+ import { createCommunityPostRiskReport } from "../../../lib/tools/community-post-risk-checker.format";
9
+
10
+ import type { FormValues, ToolPackage } from "../package/types";
11
+
12
+ /**
13
+ * Community Post Risk Checker(instant Package 试点)。
14
+ * 复用既有启发式 `createCommunityPostRiskReport`;表单与结果走 Package 引擎。
15
+ * 证据:strategic(存量 SEO 获客页,无独立 keyword brief;发布 KPI 不按新 brief 计)。
16
+ *
17
+ * 相对 legacy widget 的已知折损(阶段 4 go/no-go):
18
+ * - 无侧栏 RiskPreview 色块实时预览
19
+ * - checks 无独立色徽章(cardList meta 文字近似)
20
+ * - 无独立 .md 下载按钮(引擎复制 Markdown 仍可用)
21
+ * - SEO 页从 immersive guide 栈改为 page.standard(内容不弱于迁移前意图)
22
+ */
23
+
24
+ const t = (en: string, zh: string, zhTw: string) => ({ en, zh, "zh-tw": zhTw });
25
+ const list = (en: string[], zh: string[], zhTw: string[]) => ({
26
+ en,
27
+ zh,
28
+ "zh-tw": zhTw,
29
+ });
30
+
31
+ const placeholderPattern =
32
+ /^(test|demo|sample|example|asdf|qwer|lorem ipsum|123+|111+|222+|xxx+)$/i;
33
+
34
+ const linkPattern =
35
+ /(https?:\/\/|www\.|[\w-]+\.(?:com|io|ai|app|dev|co|net|org)\b)/i;
36
+
37
+ const resultSchema = z.object({
38
+ riskScoreDisplay: z.string().min(1),
39
+ riskLevel: z.enum(["low", "medium", "high"]),
40
+ riskLevelLabel: z.string().min(1),
41
+ verdict: z.string().min(1),
42
+ primaryFix: z.string().min(1),
43
+ recommendedCta: z.string().min(1),
44
+ ctaRationale: z.string().min(1),
45
+ saferAlternative: z.string().min(1),
46
+ checks: z
47
+ .array(
48
+ z.object({
49
+ title: z.string().min(1),
50
+ meta: z.string().min(1),
51
+ reason: z.string().min(1),
52
+ fix: z.string().min(1),
53
+ }),
54
+ )
55
+ .min(1),
56
+ flaggedParagraphs: z
57
+ .array(
58
+ z.object({
59
+ title: z.string().min(1),
60
+ excerpt: z.string().min(1),
61
+ reasons: z.array(z.string()).min(1),
62
+ suggestion: z.string().min(1),
63
+ }),
64
+ )
65
+ .min(1),
66
+ revisionPlan: z.array(z.string()).min(1),
67
+ missingInfo: z.array(z.string()),
68
+ reviewChecklist: z.array(z.string()).min(1),
69
+ });
70
+
71
+ const RISK_LEVEL_LABEL: Record<CommunityPostRiskLevel, ReturnType<typeof t>> = {
72
+ low: t("Low risk", "低风险", "低風險"),
73
+ medium: t("Medium risk", "中风险", "中風險"),
74
+ high: t("High risk", "高风险", "高風險"),
75
+ };
76
+
77
+ function pick(text: ReturnType<typeof t>, locale: AppLocale): string {
78
+ if (locale === "en") return text.en;
79
+ if (locale === "zh-tw") return text["zh-tw"] ?? text.zh;
80
+ return text.zh;
81
+ }
82
+
83
+ function isWeakText(value: string, minLength: number) {
84
+ const text = value.trim();
85
+ if (!text) return true;
86
+ if (placeholderPattern.test(text)) return true;
87
+ if (/^\d+$/.test(text)) return true;
88
+ return text.length < minLength;
89
+ }
90
+
91
+ function toPackageResult(
92
+ values: FormValues,
93
+ locale: AppLocale,
94
+ ): z.infer<typeof resultSchema> {
95
+ const title = String(values.title ?? "").trim();
96
+ const postBody = String(values.postBody ?? "").trim();
97
+
98
+ if (isWeakText(title, 8) || isWeakText(postBody, 120)) {
99
+ throw new Error("weak input");
100
+ }
101
+
102
+ const language = locale === "en" ? "en" : "zh";
103
+ const brief = communityPostRiskBriefSchema.parse({
104
+ title,
105
+ postBody,
106
+ community: values.community,
107
+ goal: values.goal,
108
+ ctaPlan: values.ctaPlan,
109
+ linkIncluded: linkPattern.test(`${title}\n${postBody}`),
110
+ language,
111
+ });
112
+
113
+ const report = createCommunityPostRiskReport(brief);
114
+ const levelLabel = pick(RISK_LEVEL_LABEL[report.summary.riskLevel], locale);
115
+
116
+ const flaggedParagraphs =
117
+ report.flaggedParagraphs.length > 0
118
+ ? report.flaggedParagraphs.map((item) => ({
119
+ title:
120
+ locale === "en"
121
+ ? `Paragraph ${item.index} · ${item.riskLevel}`
122
+ : locale === "zh-tw"
123
+ ? `第 ${item.index} 段 · ${item.riskLevel}`
124
+ : `第 ${item.index} 段 · ${item.riskLevel}`,
125
+ excerpt: item.text,
126
+ reasons: [item.reason],
127
+ suggestion: item.suggestion,
128
+ }))
129
+ : [
130
+ {
131
+ title: pick(
132
+ t(
133
+ "No paragraph flags",
134
+ "本次无段落风险标记",
135
+ "本次無段落風險標記",
136
+ ),
137
+ locale,
138
+ ),
139
+ excerpt: pick(
140
+ t(
141
+ "No paragraph crossed the risk threshold in this pass. Still review the target community rules before posting.",
142
+ "本次没有段落超过风险阈值。发布前仍建议核对目标社区规则。",
143
+ "本次沒有段落超過風險閾值。發佈前仍建議核對目標社群規則。",
144
+ ),
145
+ locale,
146
+ ),
147
+ reasons: [
148
+ pick(
149
+ t(
150
+ "Heuristic pass only",
151
+ "仅为启发式通过",
152
+ "僅為啟發式通過",
153
+ ),
154
+ locale,
155
+ ),
156
+ ],
157
+ suggestion: pick(
158
+ t(
159
+ "Re-check subreddit or forum rules before you submit.",
160
+ "提交前请再核对具体社区规则。",
161
+ "提交前請再核對具體社群規則。",
162
+ ),
163
+ locale,
164
+ ),
165
+ },
166
+ ];
167
+
168
+ return {
169
+ riskScoreDisplay: `${report.summary.riskScore}/100`,
170
+ riskLevel: report.summary.riskLevel,
171
+ riskLevelLabel: levelLabel,
172
+ verdict: report.summary.verdict,
173
+ primaryFix: report.summary.primaryFix,
174
+ recommendedCta: report.ctaAdvice.placement,
175
+ ctaRationale: report.ctaAdvice.rationale,
176
+ saferAlternative: report.ctaAdvice.saferAlternative,
177
+ checks: report.checks.map((check) => ({
178
+ title: check.label,
179
+ meta: `${check.score}/100 · ${check.status}`,
180
+ reason: check.reason,
181
+ fix: check.fix,
182
+ })),
183
+ flaggedParagraphs,
184
+ revisionPlan: report.revisionPlan,
185
+ missingInfo: report.missingInfo,
186
+ reviewChecklist: report.reviewChecklist,
187
+ };
188
+ }
189
+
190
+ export const communityPostRiskCheckerPackage: ToolPackage = {
191
+ meta: {
192
+ slug: "community-post-risk-checker",
193
+ toolType: "analyzer",
194
+ riskLevel: "high",
195
+ keywordEvidence:
196
+ "strategic:legacy SEO acquisition page; no dedicated keyword brief yet",
197
+ seo: {
198
+ publishedAt: "2026-06-30",
199
+ updatedAt: "2026-07-29",
200
+ readingTime: "6 min",
201
+ featured: true,
202
+ ogImage: "/tools/community-post-risk-checker-hero.webp",
203
+ },
204
+ },
205
+ copy: {
206
+ title: t(
207
+ "Community Post Risk Checker",
208
+ "社区帖子风险检查器",
209
+ "社群貼文風險檢查器",
210
+ ),
211
+ description: t(
212
+ "Paste a Reddit, r/SaaS, r/indiehackers, or Indie Hackers draft and check whether the title, CTA, process evidence, self-promotion paragraphs, and community tone feel too promotional.",
213
+ "粘贴 Reddit、r/SaaS、r/indiehackers 或 Indie Hackers 草稿,检查标题、CTA、过程证据、自我推广段落与社区语气是否广告感过强。",
214
+ "貼上 Reddit、r/SaaS、r/indiehackers 或 Indie Hackers 草稿,檢查標題、CTA、過程證據、自我推廣段落與社群語氣是否廣告感過強。",
215
+ ),
216
+ intro: t(
217
+ "Run a pre-post risk review before publishing: see which paragraphs feel like ads, whether the CTA belongs in the body, comments, or nowhere, and what real process evidence is missing.",
218
+ "发布前做一轮风险复核:看哪些段落像广告、CTA 该放正文/评论/不放,以及还缺哪些真实过程证据。",
219
+ "發佈前做一輪風險複核:看哪些段落像廣告、CTA 該放正文/留言/不放,以及還缺哪些真實過程證據。",
220
+ ),
221
+ category: t("Community growth tools", "社区增长工具", "社群成長工具"),
222
+ keywords: list(
223
+ [
224
+ "community post risk checker",
225
+ "Reddit self promotion checker",
226
+ "r/SaaS post review tool",
227
+ "indie hackers post checker",
228
+ "startup community post review",
229
+ ],
230
+ [
231
+ "社区帖子风险检查",
232
+ "Reddit 自我推广检查",
233
+ "r/SaaS 发帖检查",
234
+ "Indie Hackers 帖子检查",
235
+ "创业社区发帖复核",
236
+ ],
237
+ [
238
+ "社群貼文風險檢查",
239
+ "Reddit 自我推廣檢查",
240
+ "r/SaaS 發文檢查",
241
+ "Indie Hackers 貼文檢查",
242
+ "創業社群發文複核",
243
+ ],
244
+ ),
245
+ inputSignal: t(
246
+ "Community post title + body draft + target community + CTA plan",
247
+ "帖子标题、正文草稿、目标社区与 CTA 计划",
248
+ "貼文標題、正文草稿、目標社群與 CTA 計畫",
249
+ ),
250
+ outputSignal: t(
251
+ "Risk score + paragraph flags + CTA placement + revision checklist",
252
+ "风险分数、问题段落、CTA 位置建议与重写清单",
253
+ "風險分數、問題段落、CTA 位置建議與改寫清單",
254
+ ),
255
+ boundarySignal: t(
256
+ "Public heuristic checker; reduces promotional risk, does not guarantee moderation outcomes",
257
+ "公开启发式检查;降低推广风险,不保证版主结果",
258
+ "公開啟發式檢查;降低推廣風險,不保證版主結果",
259
+ ),
260
+ },
261
+ form: [
262
+ {
263
+ kind: "text",
264
+ id: "title",
265
+ required: true,
266
+ minLength: 8,
267
+ maxLength: 180,
268
+ fullWidth: true,
269
+ label: t("Post title", "帖子标题", "貼文標題"),
270
+ placeholder: t(
271
+ "Example: I built an AI tool for SaaS founders, feedback?",
272
+ "例如:我做了一个给 SaaS 创始人用的 AI 工具,想听反馈",
273
+ "例如:我做了一個給 SaaS 創辦人用的 AI 工具,想聽回饋",
274
+ ),
275
+ invalidMessage: t(
276
+ "Add a real title (at least 8 characters).",
277
+ "请填写真实标题(至少 8 个字符)。",
278
+ "請填寫真實標題(至少 8 個字元)。",
279
+ ),
280
+ },
281
+ {
282
+ kind: "select",
283
+ id: "community",
284
+ required: true,
285
+ defaultValue: "redditSaas",
286
+ label: t("Target community", "目标社区", "目標社群"),
287
+ options: [
288
+ {
289
+ value: "redditSaas",
290
+ label: t("r/SaaS", "r/SaaS", "r/SaaS"),
291
+ },
292
+ {
293
+ value: "redditIndieHackers",
294
+ label: t("r/indiehackers", "r/indiehackers", "r/indiehackers"),
295
+ },
296
+ {
297
+ value: "indieHackers",
298
+ label: t("Indie Hackers", "Indie Hackers", "Indie Hackers"),
299
+ },
300
+ {
301
+ value: "other",
302
+ label: t("Other community", "其他社区", "其他社群"),
303
+ },
304
+ ],
305
+ },
306
+ {
307
+ kind: "select",
308
+ id: "goal",
309
+ required: true,
310
+ defaultValue: "askFeedback",
311
+ label: t("Post goal", "发帖目的", "發文目的"),
312
+ options: [
313
+ {
314
+ value: "askFeedback",
315
+ label: t("Ask for feedback", "征求反馈", "徵求回饋"),
316
+ },
317
+ {
318
+ value: "shareLearning",
319
+ label: t("Share learning", "分享学习", "分享學習"),
320
+ },
321
+ {
322
+ value: "launchUpdate",
323
+ label: t("Launch update", "发布进展", "發佈進展"),
324
+ },
325
+ {
326
+ value: "findBeta",
327
+ label: t("Find beta users", "招募 Beta", "招募 Beta"),
328
+ },
329
+ {
330
+ value: "askAdvice",
331
+ label: t("Ask advice", "请教建议", "請教建議"),
332
+ },
333
+ ],
334
+ },
335
+ {
336
+ kind: "select",
337
+ id: "ctaPlan",
338
+ required: true,
339
+ defaultValue: "unsure",
340
+ label: t("CTA plan", "CTA 计划", "CTA 計畫"),
341
+ options: [
342
+ { value: "none", label: t("No CTA", "无 CTA", "無 CTA") },
343
+ {
344
+ value: "body",
345
+ label: t("CTA in body", "CTA 在正文", "CTA 在正文"),
346
+ },
347
+ {
348
+ value: "comment",
349
+ label: t("CTA in comment", "CTA 在评论", "CTA 在留言"),
350
+ },
351
+ {
352
+ value: "onlyIfAsked",
353
+ label: t("Only if asked", "仅被问及时", "僅被問及時"),
354
+ },
355
+ { value: "unsure", label: t("Not sure", "不确定", "不確定") },
356
+ ],
357
+ },
358
+ {
359
+ kind: "textarea",
360
+ id: "postBody",
361
+ required: true,
362
+ rows: 10,
363
+ minLength: 120,
364
+ maxLength: 8000,
365
+ fullWidth: true,
366
+ label: t("Post body", "帖子正文", "貼文正文"),
367
+ hint: t(
368
+ "Paste the full draft, including links, asks, and the ending you plan to publish.",
369
+ "粘贴完整草稿,保留链接、请求和结尾,就像真实准备发布的版本。",
370
+ "貼上完整草稿,保留連結、請求與結尾,就像真實準備發佈的版本。",
371
+ ),
372
+ placeholder: t(
373
+ "Paste the full community post draft here…",
374
+ "把完整社区帖草稿粘贴到这里…",
375
+ "把完整社群貼文草稿貼到這裡…",
376
+ ),
377
+ invalidMessage: t(
378
+ "Paste a real body draft (at least 120 characters).",
379
+ "请粘贴足够长的真实正文(至少 120 个字符)。",
380
+ "請貼上足夠長的真實正文(至少 120 個字元)。",
381
+ ),
382
+ },
383
+ ],
384
+ runtime: {
385
+ lane: "instant",
386
+ compute: (values, locale) => toPackageResult(values, locale),
387
+ },
388
+ resultSchema,
389
+ resultView: [
390
+ {
391
+ block: "keyValues",
392
+ title: t("Risk summary", "风险摘要", "風險摘要"),
393
+ items: [
394
+ {
395
+ label: t("Risk score", "风险分数", "風險分數"),
396
+ path: "riskScoreDisplay",
397
+ copyable: true,
398
+ },
399
+ {
400
+ label: t("Risk level", "风险等级", "風險等級"),
401
+ path: "riskLevelLabel",
402
+ },
403
+ {
404
+ label: t("Verdict", "结论", "結論"),
405
+ path: "verdict",
406
+ },
407
+ {
408
+ label: t("Primary fix", "首要修改", "首要修改"),
409
+ path: "primaryFix",
410
+ },
411
+ {
412
+ label: t("Recommended CTA", "建议 CTA", "建議 CTA"),
413
+ path: "recommendedCta",
414
+ },
415
+ ],
416
+ },
417
+ {
418
+ block: "keyValues",
419
+ title: t("CTA recommendation", "CTA 建议", "CTA 建議"),
420
+ items: [
421
+ {
422
+ label: t("Why", "原因", "原因"),
423
+ path: "ctaRationale",
424
+ },
425
+ {
426
+ label: t("Safer alternative", "更安全做法", "更安全做法"),
427
+ path: "saferAlternative",
428
+ },
429
+ ],
430
+ },
431
+ {
432
+ block: "cardList",
433
+ title: t("Risk checks", "风险检查项", "風險檢查項"),
434
+ path: "checks",
435
+ layout: "stack",
436
+ card: {
437
+ titleField: "title",
438
+ metaField: "meta",
439
+ body: { field: "reason" },
440
+ footer: { field: "fix", label: t("Fix", "修复建议", "修復建議") },
441
+ },
442
+ },
443
+ {
444
+ block: "cardList",
445
+ title: t(
446
+ "Paragraphs that may read as self-promotion",
447
+ "可能被读成 self-promotion 的段落",
448
+ "可能被讀成 self-promotion 的段落",
449
+ ),
450
+ path: "flaggedParagraphs",
451
+ layout: "stack",
452
+ card: {
453
+ titleField: "title",
454
+ body: {
455
+ field: "excerpt",
456
+ label: t("Excerpt", "摘录", "摘錄"),
457
+ },
458
+ footer: {
459
+ field: "suggestion",
460
+ label: t("Suggestion", "修改建议", "修改建議"),
461
+ },
462
+ lists: [
463
+ {
464
+ field: "reasons",
465
+ label: t("Why flagged", "为何标记", "為何標記"),
466
+ },
467
+ ],
468
+ },
469
+ },
470
+ {
471
+ block: "bulletList",
472
+ title: t("Revision plan", "修改清单", "修改清單"),
473
+ path: "revisionPlan",
474
+ tone: "risk",
475
+ },
476
+ {
477
+ block: "bulletList",
478
+ title: t("Missing process evidence", "缺失的过程证据", "缺失的過程證據"),
479
+ path: "missingInfo",
480
+ tone: "neutral",
481
+ },
482
+ {
483
+ block: "bulletList",
484
+ title: t("Review checklist", "发布前复核清单", "發佈前複核清單"),
485
+ path: "reviewChecklist",
486
+ tone: "positive",
487
+ },
488
+ ],
489
+ widget: {
490
+ formTitle: t("Pre-post risk review", "发布前风险检查", "發佈前風險檢查"),
491
+ formHint: t(
492
+ "The checker looks for title hype, early CTA, missing process, Reddit-style self-promotion signals, and unclear disclosure.",
493
+ "检查标题广告感、过早 CTA、真实过程缺失、Reddit 风格 self-promotion 信号和身份说明问题。",
494
+ "檢查標題廣告感、過早 CTA、真實過程缺失、Reddit 風格 self-promotion 訊號和身分說明問題。",
495
+ ),
496
+ submitLabel: t("Check risk", "检查风险", "檢查風險"),
497
+ resultTitle: t("Risk report", "风险报告", "風險報告"),
498
+ errorOverrides: {
499
+ computeFailed: {
500
+ title: t("Needs a real draft", "需要真实草稿", "需要真實草稿"),
501
+ body: t(
502
+ "This looks too short or placeholder-like. Paste the actual post draft you would publish.",
503
+ "内容过短或像占位文本。请粘贴你真实准备发布的帖子草稿。",
504
+ "內容過短或像佔位文字。請貼上你真實準備發佈的貼文草稿。",
505
+ ),
506
+ },
507
+ validation: {
508
+ title: t("Add a real draft", "请补充真实草稿", "請補充真實草稿"),
509
+ body: t(
510
+ "Add a real title and body before checking. The body should be long enough to judge context and CTA placement.",
511
+ "检查前请填写真实标题和正文。正文需要足够长,才能判断语境与 CTA 位置。",
512
+ "檢查前請填寫真實標題和正文。正文需要足夠長,才能判斷語境與 CTA 位置。",
513
+ ),
514
+ },
515
+ },
516
+ },
517
+ page: {
518
+ workspace: {
519
+ heading: t(
520
+ "Check whether a community post reads like an ad",
521
+ "检查社区帖是否读起来像广告",
522
+ "檢查社群貼文是否讀起來像廣告",
523
+ ),
524
+ hint: t(
525
+ "Paste a draft from any generator or your own notes. The checker scores promotion risk, flags risky paragraphs, and recommends where the CTA belongs before you post.",
526
+ "粘贴任意生成器或自写草稿。检查器会打分、标记风险段落,并在发帖前建议 CTA 位置。",
527
+ "貼上任意產生器或自寫草稿。檢查器會打分、標記風險段落,並在發文前建議 CTA 位置。",
528
+ ),
529
+ badge: t("Public SEO tool", "公开 SEO 工具", "公開 SEO 工具"),
530
+ },
531
+ standard: {
532
+ benefits: {
533
+ title: t(
534
+ "What the checker returns",
535
+ "检查器会返回什么",
536
+ "檢查器會回傳什麼",
537
+ ),
538
+ cards: [
539
+ {
540
+ title: t("Promotion risk score", "推广风险分数", "推廣風險分數"),
541
+ body: t(
542
+ "A 0-100 risk score across title hype, CTA timing, process evidence, tone, self-promotion, and disclosure.",
543
+ "覆盖标题广告感、CTA 时机、过程证据、语气、自我推广与披露的 0–100 风险分。",
544
+ "涵蓋標題廣告感、CTA 時機、過程證據、語氣、自我推廣與揭露的 0–100 風險分。",
545
+ ),
546
+ },
547
+ {
548
+ title: t("Paragraph flags", "段落标记", "段落標記"),
549
+ body: t(
550
+ "Specific body sections that look like self-promotion, early CTA, or product marketing to community readers.",
551
+ "标出在社区读者眼中像自我推广、过早 CTA 或产品营销的正文段落。",
552
+ "標出在社群讀者眼中像自我推廣、過早 CTA 或產品行銷的正文段落。",
553
+ ),
554
+ },
555
+ {
556
+ title: t("CTA + revision plan", "CTA 与修改清单", "CTA 與修改清單"),
557
+ body: t(
558
+ "A recommendation for CTA placement plus concrete edits that make the post feel more like a founder story.",
559
+ "给出 CTA 位置建议,以及让帖子更像创始人故事的具体修改项。",
560
+ "給出 CTA 位置建議,以及讓貼文更像創辦人故事的具體修改項。",
561
+ ),
562
+ },
563
+ ],
564
+ },
565
+ imageTextSections: [
566
+ {
567
+ id: "section-primary",
568
+ title: t(
569
+ "Use it before Reddit and Indie Hackers posts",
570
+ "在 Reddit 与 Indie Hackers 发帖前使用",
571
+ "在 Reddit 與 Indie Hackers 發文前使用",
572
+ ),
573
+ body: list(
574
+ [
575
+ "Review drafts for r/SaaS, r/indiehackers, Indie Hackers, founder forums, and small niche communities.",
576
+ "Catch the common failure mode: the post is useful in your head, but reads like a launch announcement to everyone else.",
577
+ "Turn the post back toward a real process: what you tried, what failed, what changed, and what you are asking.",
578
+ ],
579
+ [
580
+ "适合复核 r/SaaS、r/indiehackers、Indie Hackers、创始人论坛和小众社区草稿。",
581
+ "抓住常见翻车点:自己觉得有用,别人读起来却像发布会。",
582
+ "把帖子拉回真实过程:试了什么、失败了什么、改了什么、现在想问什么。",
583
+ ],
584
+ [
585
+ "適合複核 r/SaaS、r/indiehackers、Indie Hackers、創辦人論壇和小眾社群草稿。",
586
+ "抓住常見翻車點:自己覺得有用,別人讀起來卻像發表會。",
587
+ "把貼文拉回真實過程:試了什麼、失敗了什麼、改了什麼、現在想問什麼。",
588
+ ],
589
+ ),
590
+ image: {
591
+ src: "/tools/community-post-risk-checker-use-case.webp",
592
+ alt: t(
593
+ "Founder community post workflow with safer CTA placement and process evidence",
594
+ "更安全 CTA 位置与过程证据的创始人社区发帖流程",
595
+ "更安全 CTA 位置與過程證據的創辦人社群發文流程",
596
+ ),
597
+ side: "left",
598
+ },
599
+ imageFirst: true,
600
+ },
601
+ {
602
+ id: "section-variation",
603
+ title: t(
604
+ "It reduces risk; it does not guarantee approval",
605
+ "它降低风险,但不保证过审",
606
+ "它降低風險,但不保證過審",
607
+ ),
608
+ body: list(
609
+ [
610
+ "The checker is a heuristic pre-post review, not a Reddit or Indie Hackers moderation engine.",
611
+ "It should not be framed as a way to bypass platform rules or hide commercial intent.",
612
+ "The safest Tomako workflow is still automatic: generated posts should pass this kind of check before the user sees them.",
613
+ ],
614
+ [
615
+ "检查器是启发式发布前复核,不是 Reddit 或 Indie Hackers 的版主引擎。",
616
+ "不应把它说成绕过平台规则或隐藏商业意图的手段。",
617
+ "Tomako 内部最稳妥的流程仍是自动门禁:生成帖在展示给用户前先过类似检查。",
618
+ ],
619
+ [
620
+ "檢查器是啟發式發佈前複核,不是 Reddit 或 Indie Hackers 的版主引擎。",
621
+ "不應把它說成繞過平台規則或隱藏商業意圖的手段。",
622
+ "Tomako 內部最穩妥的流程仍是自動門禁:產生貼文在展示給使用者前先過類似檢查。",
623
+ ],
624
+ ),
625
+ image: {
626
+ src: "/tools/community-post-risk-checker-boundary.webp",
627
+ alt: t(
628
+ "Decision flow from draft review to revision with platform moderation boundaries",
629
+ "从草稿复核到修改的决策流,并标出版主边界",
630
+ "從草稿複核到修改的決策流,並標出版主邊界",
631
+ ),
632
+ side: "right",
633
+ },
634
+ },
635
+ {
636
+ id: "section-support",
637
+ title: t(
638
+ "Why this works as an acquisition page",
639
+ "为什么适合作为获客页",
640
+ "為什麼適合作為獲客頁",
641
+ ),
642
+ body: list(
643
+ [
644
+ "Search intent is problem-aware: users already fear that a post may look like self-promotion.",
645
+ "The tool gives immediate value without requiring users to understand Tomako's full workspace first.",
646
+ "It creates a natural bridge from public SEO traffic into Tomako's community post and build-in-public workflows.",
647
+ ],
648
+ [
649
+ "搜索意图是问题意识型:用户已经担心帖子会被读成自我推广。",
650
+ "工具能立刻给价值,用户不必先理解整个 Tomako 工作台。",
651
+ "它把公开 SEO 流量自然接到社区帖与 build-in-public 工作流。",
652
+ ],
653
+ [
654
+ "搜尋意圖是問題意識型:使用者已經擔心貼文會被讀成自我推廣。",
655
+ "工具能立刻給價值,使用者不必先理解整個 Tomako 工作台。",
656
+ "它把公開 SEO 流量自然接到社群貼文與 build-in-public 工作流。",
657
+ ],
658
+ ),
659
+ image: {
660
+ src: "/tools/community-post-risk-checker-value.webp",
661
+ alt: t(
662
+ "Risk analysis report showing title, CTA, process, tone, and transparency checks",
663
+ "展示标题、CTA、过程、语气与透明度检查的风险分析报告",
664
+ "展示標題、CTA、過程、語氣與透明度檢查的風險分析報告",
665
+ ),
666
+ side: "left",
667
+ },
668
+ imageFirst: true,
669
+ },
670
+ ],
671
+ generation: {
672
+ title: t(
673
+ "Review standard before you post",
674
+ "发帖前按标准复核",
675
+ "發文前按標準複核",
676
+ ),
677
+ image: {
678
+ src: "/tools/community-post-risk-checker-standard.webp",
679
+ alt: t(
680
+ "Checklist report for promotional title, early CTA, missing process, and disclosure",
681
+ "覆盖标题广告感、早期 CTA、过程缺失与披露的检查清单",
682
+ "涵蓋標題廣告感、早期 CTA、過程缺失與揭露的檢查清單",
683
+ ),
684
+ side: "left",
685
+ },
686
+ steps: [
687
+ {
688
+ title: t(
689
+ "Paste the real draft",
690
+ "粘贴真实草稿",
691
+ "貼上真實草稿",
692
+ ),
693
+ body: t(
694
+ "Include the title, body, links, and ending exactly as you would publish them.",
695
+ "标题、正文、链接和结尾按真实发布版本一并粘贴。",
696
+ "標題、正文、連結和結尾按真實發佈版本一併貼上。",
697
+ ),
698
+ },
699
+ {
700
+ title: t(
701
+ "Read the score and flags",
702
+ "阅读分数与标记",
703
+ "閱讀分數與標記",
704
+ ),
705
+ body: t(
706
+ "Focus on high-risk checks, flagged paragraphs, and the recommended CTA placement.",
707
+ "优先看高风险检查项、标记段落和建议的 CTA 位置。",
708
+ "優先看高風險檢查項、標記段落和建議的 CTA 位置。",
709
+ ),
710
+ },
711
+ {
712
+ title: t(
713
+ "Revise, then re-check",
714
+ "修改后再检查",
715
+ "修改後再檢查",
716
+ ),
717
+ body: t(
718
+ "Apply the revision plan, confirm community rules, then run the checker again before submitting.",
719
+ "按修改清单改稿、核对社区规则,提交前再跑一遍检查。",
720
+ "按修改清單改稿、核對社群規則,提交前再跑一遍檢查。",
721
+ ),
722
+ },
723
+ ],
724
+ ctaLabel: t("Check my draft", "检查帖子草稿", "檢查貼文草稿"),
725
+ },
726
+ faq: {
727
+ title: t(
728
+ "Community post risk checker FAQs",
729
+ "社区帖子风险检查常见问题",
730
+ "社群貼文風險檢查常見問題",
731
+ ),
732
+ intro: t(
733
+ "Use the report as a pre-post review, not as a guarantee that moderators will approve the post.",
734
+ "把报告当作发布前复核,而不是版主一定会通过的保证。",
735
+ "把報告當作發佈前複核,而不是版主一定會通過的保證。",
736
+ ),
737
+ ctaLabel: t("Check risk now", "立即检查风险", "立即檢查風險"),
738
+ },
739
+ },
740
+ faq: [
741
+ {
742
+ question: t(
743
+ "Can this guarantee that Reddit will not remove my post?",
744
+ "它能保证 Reddit 不删帖吗?",
745
+ "它能保證 Reddit 不刪文嗎?",
746
+ ),
747
+ answer: t(
748
+ "No. It is a pre-post risk review based on common community signals. Subreddit rules and moderator judgment still decide the outcome.",
749
+ "不能。它只是基于常见社区信号做发布前风险检查,最终仍取决于具体社区规则和版主判断。",
750
+ "不能。它只是基於常見社群訊號做發佈前風險檢查,最終仍取決於具體社群規則和版主判斷。",
751
+ ),
752
+ },
753
+ {
754
+ question: t(
755
+ "Should this be inside Tomako's post generator too?",
756
+ "这个能力也应该在 Tomako 生成器内部吗?",
757
+ "這個能力也應該在 Tomako 產生器內部嗎?",
758
+ ),
759
+ answer: t(
760
+ "Yes. The public tool is for external drafts and SEO acquisition; Tomako-generated posts should pass a similar gate before final output.",
761
+ "应该。公开工具适合外部草稿和 SEO 获客;Tomako 自己生成的帖子,应该在输出前自动过类似质量门。",
762
+ "應該。公開工具適合外部草稿和 SEO 獲客;Tomako 自己產生的貼文,應該在輸出前自動過類似品質門。",
763
+ ),
764
+ },
765
+ {
766
+ question: t(
767
+ "Why check CTA placement separately?",
768
+ "为什么要单独检查 CTA 位置?",
769
+ "為什麼要單獨檢查 CTA 位置?",
770
+ ),
771
+ answer: t(
772
+ "A useful founder story can become self-promotion the moment a signup link appears too early. Placement changes the perceived intent.",
773
+ "一篇真实复盘可能因为注册链接出现太早,瞬间被读成 self-promotion。位置会改变读者对意图的判断。",
774
+ "一篇真實復盤可能因為註冊連結出現太早,瞬間被讀成 self-promotion。位置會改變讀者對意圖的判斷。",
775
+ ),
776
+ },
777
+ {
778
+ question: t(
779
+ "Does it support Chinese drafts?",
780
+ "支持中文草稿吗?",
781
+ "支援中文草稿嗎?",
782
+ ),
783
+ answer: t(
784
+ "Yes. The interface follows your current locale and the heuristic checks include Chinese and English promotional signals.",
785
+ "支持。界面跟随当前语言,启发式检查也包含中文和英文的推广信号。",
786
+ "支援。介面跟隨目前語言,啟發式檢查也包含中文和英文的推廣訊號。",
787
+ ),
788
+ },
789
+ ],
790
+ },
791
+ assets: {},
792
+ };