@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,801 @@
1
+ import { z } from "zod";
2
+
3
+ import type { ToolPackage } from "../package/types";
4
+
5
+ /**
6
+ * Product Positioning Analyzer(agent Package)。
7
+ * 落地页走 page.standard(对照 community-post-risk-checker);上线 status 只认 Portal catalog。
8
+ */
9
+
10
+ const t = (en: string, zh: string, zhTw: string) => ({ en, zh, "zh-tw": zhTw });
11
+ const list = (en: string[], zh: string[], zhTw: string[]) => ({
12
+ en,
13
+ zh,
14
+ "zh-tw": zhTw,
15
+ });
16
+
17
+ const confidenceSchema = z.enum(["low", "medium", "high"]);
18
+ const competitorCategorySchema = z.enum(["direct", "indirect", "alternative"]);
19
+ const strategyAreaSchema = z.enum([
20
+ "channels",
21
+ "pricing",
22
+ "messaging",
23
+ "segments",
24
+ "product",
25
+ ]);
26
+
27
+ const scoresSchema = z.object({
28
+ price: z.number().int().min(1).max(5),
29
+ availability: z.number().int().min(1).max(5),
30
+ packaging: z.number().int().min(1).max(5),
31
+ performance: z.number().int().min(1).max(5),
32
+ easeOfUse: z.number().int().min(1).max(5),
33
+ assurance: z.number().int().min(1).max(5),
34
+ lifeCycleCost: z.number().int().min(1).max(5),
35
+ socialAcceptance: z.number().int().min(1).max(5),
36
+ });
37
+
38
+ const resultSchema = z.object({
39
+ reportStatus: z.literal("final"),
40
+ inputRead: z.object({
41
+ product: z.string().min(1),
42
+ targetMarket: z.string().min(1),
43
+ targetUsers: z.string().min(1),
44
+ analysisGoal: z.string().min(1),
45
+ assumptions: z.array(z.string()),
46
+ }),
47
+ competitors: z
48
+ .array(
49
+ z.object({
50
+ name: z.string().min(1),
51
+ category: competitorCategorySchema,
52
+ url: z.string().nullable().optional(),
53
+ selectionReason: z.string().min(1),
54
+ evidence: z.array(z.string()).min(1),
55
+ confidence: confidenceSchema,
56
+ }),
57
+ )
58
+ .min(1)
59
+ .max(8),
60
+ appealsTable: z
61
+ .array(
62
+ z.object({
63
+ player: z.string().min(1),
64
+ scores: scoresSchema,
65
+ evidence: z.array(z.string()).min(1),
66
+ confidence: confidenceSchema,
67
+ }),
68
+ )
69
+ .min(2)
70
+ .max(9),
71
+ appealsRows: z
72
+ .array(
73
+ z.object({
74
+ dimension: z.string().min(1),
75
+ ownProductScore: z.number().int().min(1).max(5),
76
+ competitorRange: z.string().min(1),
77
+ strongestCompetitor: z.string().min(1),
78
+ implication: z.string().min(1),
79
+ evidence: z.array(z.string()).min(1),
80
+ confidence: confidenceSchema,
81
+ }),
82
+ )
83
+ .length(8),
84
+ valueCurves: z
85
+ .array(
86
+ z.object({
87
+ player: z.string().min(1),
88
+ values: z.array(z.number().int().min(1).max(5)).length(8),
89
+ }),
90
+ )
91
+ .min(2)
92
+ .max(9),
93
+ positioningDiagnosis: z.object({
94
+ currentPosition: z.string().min(1),
95
+ differentiationOpportunity: z.string().min(1),
96
+ dimensionsToStrengthen: z.array(z.string()).min(1),
97
+ dimensionsToReduce: z.array(z.string()).min(1),
98
+ confidence: confidenceSchema,
99
+ }),
100
+ growthStrategy: z
101
+ .array(
102
+ z.object({
103
+ area: strategyAreaSchema,
104
+ recommendation: z.string().min(1),
105
+ linkedAppealsDimensions: z.array(z.string()).min(1),
106
+ rationale: z.string().min(1),
107
+ confidence: confidenceSchema,
108
+ }),
109
+ )
110
+ .min(5)
111
+ .max(8),
112
+ risksAndValidation: z.array(z.string()).min(1),
113
+ nextActions: z.array(z.string()).min(3),
114
+ disclaimer: z.string().min(1),
115
+ promptVersion: z.string().optional(),
116
+ generatedAt: z.string().optional(),
117
+ });
118
+
119
+ const appealDimensions = {
120
+ en: [
121
+ "Price",
122
+ "Availability",
123
+ "Packaging",
124
+ "Performance",
125
+ "Ease of use",
126
+ "Assurance",
127
+ "Life-cycle cost",
128
+ "Social acceptance",
129
+ ],
130
+ zh: [
131
+ "价格",
132
+ "可获得性",
133
+ "包装",
134
+ "性能",
135
+ "易用性",
136
+ "保证",
137
+ "生命周期成本",
138
+ "社会接受程度",
139
+ ],
140
+ "zh-tw": [
141
+ "價格",
142
+ "可獲得性",
143
+ "包裝",
144
+ "效能",
145
+ "易用性",
146
+ "保證",
147
+ "生命週期成本",
148
+ "社會接受程度",
149
+ ],
150
+ };
151
+
152
+ export const productPositioningAnalyzerPackage: ToolPackage = {
153
+ meta: {
154
+ slug: "product-positioning-analyzer",
155
+ toolType: "analyzer",
156
+ riskLevel: "medium",
157
+ keywordEvidence: "docs/seo-keyword-briefs/product-positioning-analyzer.md",
158
+ seo: {
159
+ updatedAt: "2026-07-05",
160
+ readingTime: "8 min",
161
+ ogImage: "/tools/product-positioning-analyzer-hero.webp",
162
+ },
163
+ },
164
+ copy: {
165
+ title: t("Product Positioning Analyzer", "产品定位分析器", "產品定位分析器"),
166
+ description: t(
167
+ "Compare a product with competitors and substitutes. Get APPEALS scores, a value curve, confidence notes, and actions to validate—not a final market truth.",
168
+ "描述你的产品,即可比较直接竞品、替代方案与间接竞品,获得 APPEALS 评分、战略价值曲线、证据置信度和待验证的定位行动,而不是一份最终市场结论。",
169
+ "描述你的產品,即可比較直接競品、替代方案與間接競品,獲得 APPEALS 評分、戰略價值曲線、證據信心度和待驗證的定位行動,而不是一份最終市場結論。",
170
+ ),
171
+ intro: t(
172
+ "Positioning work usually collapses when the user must know the framework before starting. This tool starts from a product name, URL, or short description, then turns competitor discovery and APPEALS analysis into a report you can inspect and revise.",
173
+ "定位分析不该要求用户先学完整套方法论。这个工具从产品名称、链接或一句话描述开始,自动完成竞品发现和 APPEALS 分析,再输出可以检查、调整、迭代的定位报告。",
174
+ "定位分析不該要求使用者先學完整套方法論。這個工具從產品名稱、連結或一句話描述開始,自動完成競品發現和 APPEALS 分析,再輸出可以檢查、調整、迭代的定位報告。",
175
+ ),
176
+ category: t("Strategy tools", "战略工具", "戰略工具"),
177
+ keywords: list(
178
+ [
179
+ "product positioning analyzer",
180
+ "positioning strategy tool",
181
+ "competitor positioning map",
182
+ "strategic canvas generator",
183
+ "APPEALS analysis",
184
+ ],
185
+ [
186
+ "产品定位分析",
187
+ "竞品定位图",
188
+ "战略布局图",
189
+ "价值曲线生成器",
190
+ "APPEALS 分析",
191
+ ],
192
+ [
193
+ "產品定位分析",
194
+ "競品定位圖",
195
+ "戰略佈局圖",
196
+ "價值曲線產生器",
197
+ "APPEALS 分析",
198
+ ],
199
+ ),
200
+ inputSignal: t(
201
+ "Your product name, URL, or one-sentence description; competitors are optional",
202
+ "你的产品名称、链接或一句话描述;竞品可选填",
203
+ "你的產品名稱、連結或一句話描述;競品可選填",
204
+ ),
205
+ outputSignal: t(
206
+ "Competitor list, APPEALS scores, value curve, positioning diagnosis, and growth plan",
207
+ "竞品清单、APPEALS 评分、价值曲线、定位诊断和增长策略",
208
+ "競品清單、APPEALS 評分、價值曲線、定位診斷和成長策略",
209
+ ),
210
+ boundarySignal: t(
211
+ "Strategic research draft from available public signals; validate pricing, traffic, and customer evidence before acting",
212
+ "基于可获得公开信号的战略研究草案;定价、流量和客户证据需要在行动前验证",
213
+ "基於可獲得公開訊號的戰略研究草案;定價、流量和客戶證據需要在行動前驗證",
214
+ ),
215
+ },
216
+ form: [
217
+ {
218
+ kind: "textarea",
219
+ id: "productInput",
220
+ required: true,
221
+ rows: 4,
222
+ minLength: 8,
223
+ maxLength: 1200,
224
+ fullWidth: true,
225
+ label: t("Your product", "你的产品", "你的產品"),
226
+ hint: t(
227
+ "Name, URL, or one clear description of what it does",
228
+ "填写产品名称、链接,或一句话说明它做什么",
229
+ "填寫產品名稱、連結,或一句話說明它做什麼",
230
+ ),
231
+ placeholder: t(
232
+ "e.g. A browser extension that turns messy meeting notes into CRM updates for small sales teams.",
233
+ "例如:一个把杂乱会议纪要自动整理成 CRM 更新的浏览器插件,面向小型销售团队。",
234
+ "例如:一個把雜亂會議紀要自動整理成 CRM 更新的瀏覽器擴充功能,面向小型銷售團隊。",
235
+ ),
236
+ invalidMessage: t(
237
+ "Add a real product name, URL, or sentence. A single generic keyword will produce weak positioning.",
238
+ "请填写真实产品名、链接或一句完整描述。单个泛词会导致定位判断很弱。",
239
+ "請填寫真實產品名、連結或一句完整描述。單個泛詞會導致定位判斷很弱。",
240
+ ),
241
+ },
242
+ {
243
+ kind: "textarea",
244
+ id: "competitors",
245
+ rows: 3,
246
+ maxLength: 1000,
247
+ fullWidth: true,
248
+ label: t(
249
+ "Competitors, score overrides, or assumptions (optional)",
250
+ "竞品、评分覆盖或假设(选填)",
251
+ "競品、評分覆蓋或假設(選填)",
252
+ ),
253
+ hint: t(
254
+ "Names, URLs, manual score notes, or hypotheses. Leave blank and the agent will discover competitors and substitutes.",
255
+ "可填名称、链接、手动评分说明或分析假设。不填时,Agent 会自动发现竞品和替代方案。",
256
+ "可填名稱、連結、手動評分說明或分析假設。不填時,Agent 會自動發現競品和替代方案。",
257
+ ),
258
+ placeholder: t(
259
+ "e.g. Gong, Fireflies.ai, manual CRM notes; assume our ease of use is 5/5",
260
+ "例如:Gong、Fireflies.ai、人工填写 CRM 记录;假设我们的易用性是 5/5",
261
+ "例如:Gong、Fireflies.ai、人工填寫 CRM 紀錄;假設我們的易用性是 5/5",
262
+ ),
263
+ },
264
+ {
265
+ kind: "text",
266
+ id: "targetMarket",
267
+ maxLength: 160,
268
+ label: t("Market or region", "目标市场/地区", "目標市場/地區"),
269
+ placeholder: t(
270
+ "e.g. US B2B SaaS, China consumer apps",
271
+ "例如:美国 B2B SaaS、中国消费级应用",
272
+ "例如:美國 B2B SaaS、中國消費級應用",
273
+ ),
274
+ },
275
+ {
276
+ kind: "text",
277
+ id: "targetUsers",
278
+ maxLength: 180,
279
+ label: t("Target users", "目标用户", "目標使用者"),
280
+ placeholder: t(
281
+ "e.g. founders, sales managers, indie developers",
282
+ "例如:创始人、销售经理、独立开发者",
283
+ "例如:創辦人、銷售經理、獨立開發者",
284
+ ),
285
+ },
286
+ {
287
+ kind: "select",
288
+ id: "analysisGoal",
289
+ defaultValue: "differentiation",
290
+ label: t("Analysis goal", "分析目标", "分析目標"),
291
+ options: [
292
+ {
293
+ value: "differentiation",
294
+ label: t("Find differentiation", "寻找差异化", "尋找差異化"),
295
+ },
296
+ {
297
+ value: "pricing",
298
+ label: t("Improve pricing", "优化定价", "優化定價"),
299
+ },
300
+ {
301
+ value: "messaging",
302
+ label: t("Sharpen messaging", "调整文案", "調整文案"),
303
+ },
304
+ {
305
+ value: "growth",
306
+ label: t("Plan growth", "制定增长策略", "制定成長策略"),
307
+ },
308
+ {
309
+ value: "marketEntry",
310
+ label: t("Enter a market", "进入新市场", "進入新市場"),
311
+ },
312
+ ],
313
+ },
314
+ ],
315
+ runtime: {
316
+ lane: "agent",
317
+ scene: "product_positioning_analyzer",
318
+ resultType: "product_positioning_report",
319
+ skillId: "$product-positioning-analyzer",
320
+ writebackScript: "product-positioning-analyzer.mjs",
321
+ outputContract: [
322
+ 'reportStatus: exactly "final"',
323
+ "inputRead: { product, targetMarket, targetUsers, analysisGoal, assumptions: string[] }",
324
+ 'competitors: Array<{ name, category: "direct" | "indirect" | "alternative", url?: string | null, selectionReason, evidence: string[], confidence: "low" | "medium" | "high" }>',
325
+ "appealsTable: one row for the user's product and each competitor, with scores { price, availability, packaging, performance, easeOfUse, assurance, lifeCycleCost, socialAcceptance } as 1-5 integers plus evidence[] and confidence",
326
+ "appealsRows: exactly 8 dimension rows with ownProductScore, competitorRange, strongestCompetitor, implication, evidence[], confidence",
327
+ "valueCurves: Array<{ player, values: number[8] }> in this order: price, availability, packaging, performance, easeOfUse, assurance, lifeCycleCost, socialAcceptance",
328
+ "positioningDiagnosis: { currentPosition, differentiationOpportunity, dimensionsToStrengthen: string[], dimensionsToReduce: string[], confidence }",
329
+ 'growthStrategy: Array<{ area: "channels" | "pricing" | "messaging" | "segments" | "product", recommendation, linkedAppealsDimensions: string[], rationale, confidence }>',
330
+ "risksAndValidation: string[]",
331
+ "nextActions: string[]",
332
+ "disclaimer, promptVersion, generatedAt",
333
+ ],
334
+ rules: [
335
+ "Analyze the user's product first. If competitors are missing, discover direct competitors, indirect competitors, and substitute solutions from public signals.",
336
+ "Use APPEALS exactly as eight dimensions: Price, Availability, Packaging, Performance, Ease of Use, Assurance, Life-cycle Cost, Social Acceptance.",
337
+ "Scores are relative 1-5 strategic scores, not objective measurements. Every score row needs evidence and confidence.",
338
+ "Do not invent precise traffic, revenue, pricing, funding, or customer claims. If a signal is missing, state the assumption and lower confidence.",
339
+ "Competitor choice, dimension scores, positioning diagnosis, and growth recommendations must cite evidence or assumptions.",
340
+ "If the user provides score overrides or assumptions in the optional competitor field, treat them as user hypotheses, echo them in inputRead.assumptions, and use them unless public evidence strongly conflicts.",
341
+ "Every growth recommendation must name the APPEALS dimension it changes; avoid generic advice that could fit any product.",
342
+ "Return localized human-readable strings using the brief locale: zh for Simplified Chinese, zh-tw for Traditional Chinese when provided, otherwise English.",
343
+ "Use only this product and discovered/entered competitors. Never output fallback examples or sample companies.",
344
+ ],
345
+ watch: {
346
+ pollIntervalMs: 2500,
347
+ graceWindowMs: 240000,
348
+ },
349
+ },
350
+ resultSchema,
351
+ resultView: [
352
+ {
353
+ block: "keyValues",
354
+ title: t("Positioning diagnosis", "定位诊断", "定位診斷"),
355
+ items: [
356
+ {
357
+ label: t("Current position", "当前定位", "目前定位"),
358
+ path: "positioningDiagnosis.currentPosition",
359
+ },
360
+ {
361
+ label: t("Opportunity", "差异化机会", "差異化機會"),
362
+ path: "positioningDiagnosis.differentiationOpportunity",
363
+ },
364
+ {
365
+ label: t("Confidence", "置信度", "信心度"),
366
+ path: "positioningDiagnosis.confidence",
367
+ },
368
+ ],
369
+ },
370
+ {
371
+ block: "strategicCurve",
372
+ title: t("Strategic value curve", "战略价值曲线", "戰略價值曲線"),
373
+ path: "valueCurves",
374
+ playerField: "player",
375
+ valuesField: "values",
376
+ dimensions: appealDimensions,
377
+ maxScore: 5,
378
+ },
379
+ {
380
+ block: "cardList",
381
+ title: t("Competitors and substitutes", "竞品与替代方案", "競品與替代方案"),
382
+ path: "competitors",
383
+ layout: "grid",
384
+ card: {
385
+ titleField: "name",
386
+ metaField: "category",
387
+ body: {
388
+ field: "selectionReason",
389
+ label: t("Why included", "选择理由", "選擇理由"),
390
+ },
391
+ lists: [
392
+ { field: "evidence", label: t("Evidence", "依据", "依據") },
393
+ ],
394
+ footer: {
395
+ field: "confidence",
396
+ label: t("Confidence", "置信度", "信心度"),
397
+ },
398
+ },
399
+ },
400
+ {
401
+ block: "cardList",
402
+ title: t("APPEALS score read", "APPEALS 评分解读", "APPEALS 評分解讀"),
403
+ path: "appealsRows",
404
+ layout: "grid",
405
+ card: {
406
+ titleField: "dimension",
407
+ metaField: "ownProductScore",
408
+ metaSuffix: t("/5", "/5", "/5"),
409
+ body: {
410
+ field: "implication",
411
+ label: t("Implication", "含义", "含義"),
412
+ },
413
+ lists: [
414
+ { field: "evidence", label: t("Evidence", "依据", "依據") },
415
+ ],
416
+ footer: {
417
+ field: "confidence",
418
+ label: t("Confidence", "置信度", "信心度"),
419
+ },
420
+ },
421
+ },
422
+ {
423
+ block: "cardList",
424
+ title: t("Growth strategy", "增长策略建议", "成長策略建議"),
425
+ path: "growthStrategy",
426
+ layout: "grid",
427
+ card: {
428
+ titleField: "area",
429
+ body: {
430
+ field: "recommendation",
431
+ label: t("Recommendation", "建议", "建議"),
432
+ },
433
+ lists: [
434
+ {
435
+ field: "linkedAppealsDimensions",
436
+ label: t(
437
+ "Linked APPEALS dimensions",
438
+ "关联竞争维度",
439
+ "關聯競爭維度",
440
+ ),
441
+ },
442
+ ],
443
+ footer: {
444
+ field: "rationale",
445
+ label: t("Rationale", "依据", "依據"),
446
+ },
447
+ },
448
+ },
449
+ {
450
+ block: "bulletGroups",
451
+ title: t("What to change next", "下一轮调整方向", "下一輪調整方向"),
452
+ columns: [
453
+ {
454
+ label: t("Strengthen", "应强化", "應強化"),
455
+ path: "positioningDiagnosis.dimensionsToStrengthen",
456
+ tone: "positive",
457
+ },
458
+ {
459
+ label: t("Reduce", "可弱化", "可弱化"),
460
+ path: "positioningDiagnosis.dimensionsToReduce",
461
+ tone: "neutral",
462
+ },
463
+ {
464
+ label: t("Validate", "待验证", "待驗證"),
465
+ path: "risksAndValidation",
466
+ tone: "risk",
467
+ },
468
+ ],
469
+ },
470
+ {
471
+ block: "bulletList",
472
+ title: t("Next actions", "下一步行动", "下一步行動"),
473
+ path: "nextActions",
474
+ tone: "positive",
475
+ },
476
+ ],
477
+ widget: {
478
+ formTitle: t("Start with your product", "从你的产品开始", "從你的產品開始"),
479
+ formHint: t(
480
+ "Competitors are optional. The agent will identify direct competitors, indirect competitors, and substitutes, then score the APPEALS dimensions with evidence.",
481
+ "竞品不是门槛。Agent 会识别直接竞品、间接竞品和替代方案,并为 APPEALS 八个维度标注依据与置信度。",
482
+ "競品不是門檻。Agent 會識別直接競品、間接競品和替代方案,並為 APPEALS 八個維度標註依據與信心度。",
483
+ ),
484
+ submitLabel: t("Analyze positioning", "分析产品定位", "分析產品定位"),
485
+ resultTitle: t("Positioning report", "定位分析报告", "定位分析報告"),
486
+ pendingTitle: t("Researching the market", "正在研究市场", "正在研究市場"),
487
+ pendingHint: t(
488
+ "This usually takes 1-4 minutes because the agent must inspect public evidence, choose competitors, score APPEALS, and write back a structured report.",
489
+ "通常需要 1-4 分钟,因为 Agent 需要检查公开依据、筛选竞品、完成 APPEALS 评分并写回结构化报告。",
490
+ "通常需要 1-4 分鐘,因為 Agent 需要檢查公開依據、篩選競品、完成 APPEALS 評分並寫回結構化報告。",
491
+ ),
492
+ errorOverrides: {
493
+ validation: {
494
+ title: t("Add a product first", "请先填写产品", "請先填寫產品"),
495
+ body: t(
496
+ "A product name, URL, or one clear sentence is required. Competitors, market, and users can be left blank.",
497
+ "必须填写产品名称、链接或一句清楚描述。竞品、市场和用户可以留空。",
498
+ "必須填寫產品名稱、連結或一句清楚描述。競品、市場和使用者可以留空。",
499
+ ),
500
+ },
501
+ resultWritebackMissing: {
502
+ title: t(
503
+ "Report was not written back",
504
+ "报告未成功写回",
505
+ "報告未成功寫回",
506
+ ),
507
+ body: t(
508
+ "The agent may still be running, or the online skill is not deployed. Retry after a moment; if it repeats, this is a deployment issue.",
509
+ "Agent 可能仍在运行,或线上 skill 尚未部署。稍后重试;如果反复出现,这是部署链路问题。",
510
+ "Agent 可能仍在執行,或線上 skill 尚未部署。稍後重試;如果反覆出現,這是部署鏈路問題。",
511
+ ),
512
+ },
513
+ },
514
+ },
515
+ page: {
516
+ workspace: {
517
+ heading: t(
518
+ "Product Positioning Analyzer: find your competitive gap",
519
+ "产品定位分析器:找到你与竞品之间的空位",
520
+ "產品定位分析器:找到你與競品之間的空位",
521
+ ),
522
+ hint: t(
523
+ "Use the form to describe your product. Add competitors only if you already know them. The result stays structured so you can edit competitors, scores, or assumptions and rerun the analysis.",
524
+ "用表单描述你的产品;只有在已知时才需要补充竞品。结果以结构化方式返回,方便你调整竞品、评分或假设后重新分析。",
525
+ "用表單描述你的產品;只有在已知時才需要補充競品。結果以結構化方式回傳,方便你調整競品、評分或假設後重新分析。",
526
+ ),
527
+ badge: t(
528
+ "Agent-backed strategy analysis",
529
+ "Agent 驱动的战略分析",
530
+ "Agent 驅動的戰略分析",
531
+ ),
532
+ },
533
+ standard: {
534
+ benefits: {
535
+ title: t(
536
+ "See where your product overlaps—and where it can stand apart",
537
+ "看清你和竞品哪里重叠,哪里值得拉开差距",
538
+ "看清你和競品哪裡重疊,哪裡值得拉開差距",
539
+ ),
540
+ cards: [
541
+ {
542
+ title: t("Competitor discovery", "竞品发现", "競品發現"),
543
+ body: t(
544
+ "Direct competitors, indirect competitors, and substitute solutions are separated, with a reason for each selection.",
545
+ "区分直接竞品、间接竞品和替代方案,并说明每个对象被纳入分析的原因。",
546
+ "區分直接競品、間接競品和替代方案,並說明每個對象被納入分析的原因。",
547
+ ),
548
+ },
549
+ {
550
+ title: t("APPEALS scoring", "APPEALS 评分", "APPEALS 評分"),
551
+ body: t(
552
+ "The eight APPEALS dimensions are scored on a relative 1-5 scale and annotated with evidence and confidence.",
553
+ "八个 APPEALS 维度按相对 1-5 分评分,并附上依据和置信度。",
554
+ "八個 APPEALS 維度按相對 1-5 分評分,並附上依據和信心度。",
555
+ ),
556
+ },
557
+ {
558
+ title: t("Strategic value curve", "战略价值曲线", "戰略價值曲線"),
559
+ body: t(
560
+ "The scoring table becomes a curve so gaps, overinvestment, and distinctive positions are visible.",
561
+ "评分表会转成曲线,让差距、过度投入和差异化位置更直观。",
562
+ "評分表會轉成曲線,讓差距、過度投入和差異化位置更直觀。",
563
+ ),
564
+ },
565
+ ],
566
+ },
567
+ imageTextSections: [
568
+ {
569
+ id: "section-primary",
570
+ title: t(
571
+ "When do you need a competitor positioning map?",
572
+ "什么时候需要做竞品定位图?",
573
+ "什麼時候需要做競品定位圖?",
574
+ ),
575
+ body: list(
576
+ [
577
+ "You have a product idea or live product but cannot explain why users should choose it.",
578
+ "Competitors look similar on the surface, and you need a sharper comparison than feature lists.",
579
+ "You want to decide whether to compete on price, ease of use, trust, distribution, or a narrower segment.",
580
+ "You are rewriting landing page copy and need the messaging to match an actual strategic choice.",
581
+ ],
582
+ [
583
+ "你有产品想法或已上线产品,但说不清用户为什么要选它。",
584
+ "竞品表面看起来都差不多,需要比功能清单更锋利的比较方式。",
585
+ "你想判断应该在价格、易用性、信任、渠道,还是更窄的人群上竞争。",
586
+ "你正在重写落地页文案,需要让文案服务于真实的战略选择。",
587
+ ],
588
+ [
589
+ "你有產品想法或已上線產品,但說不清使用者為什麼要選它。",
590
+ "競品表面看起來都差不多,需要比功能清單更鋒利的比較方式。",
591
+ "你想判斷應該在價格、易用性、信任、通路,還是更窄的人群上競爭。",
592
+ "你正在重寫到達網頁文案,需要讓文案服務於真實的戰略選擇。",
593
+ ],
594
+ ),
595
+ image: {
596
+ src: "/tools/product-positioning-analyzer-appeals.webp",
597
+ alt: t(
598
+ "APPEALS score rows becoming a strategic curve and dimension cards.",
599
+ "APPEALS 评分行转化为战略曲线和维度卡片的示意图。",
600
+ "APPEALS 評分行轉化為戰略曲線和維度卡片的示意圖。",
601
+ ),
602
+ side: "left",
603
+ },
604
+ imageFirst: true,
605
+ },
606
+ {
607
+ id: "section-variation",
608
+ title: t(
609
+ "Which positioning claims can you actually defend?",
610
+ "哪些定位判断真的有证据支撑?",
611
+ "哪些定位判斷真的有證據支撐?",
612
+ ),
613
+ body: list(
614
+ [
615
+ "Competitors are not just listed; the report explains whether each is a direct competitor, indirect competitor, or substitute.",
616
+ "Weak public signals remain visible as low-confidence assumptions instead of being hidden as certainty.",
617
+ "Growth recommendations name the APPEALS dimensions they should change, so advice stays inspectable.",
618
+ ],
619
+ [
620
+ "竞品不只是列出来;报告会说明每个对象属于直接竞品、间接竞品还是替代方案。",
621
+ "公开信号不足时,会以低置信度假设呈现,而不是伪装成确定结论。",
622
+ "增长建议会写明应改变的 APPEALS 维度,方便检查与改写。",
623
+ ],
624
+ [
625
+ "競品不只是列出來;報告會說明每個對象屬於直接競品、間接競品還是替代方案。",
626
+ "公開訊號不足時,會以低信心度假設呈現,而不是偽裝成確定結論。",
627
+ "成長建議會寫明應改變的 APPEALS 維度,方便檢查與改寫。",
628
+ ],
629
+ ),
630
+ image: {
631
+ src: "/tools/product-positioning-analyzer-evidence.webp",
632
+ alt: t(
633
+ "Public sources being filtered into evidence-backed positioning claims.",
634
+ "公开来源被过滤为有依据的定位判断的示意图。",
635
+ "公開來源被過濾為有依據的定位判斷的示意圖。",
636
+ ),
637
+ side: "right",
638
+ },
639
+ },
640
+ {
641
+ id: "section-support",
642
+ title: t(
643
+ "Turn one positioning gap into a test",
644
+ "把一个定位差异变成可验证的测试",
645
+ "把一個定位差異變成可驗證的測試",
646
+ ),
647
+ body: list(
648
+ [
649
+ "Replace a discovered competitor with a competitor you care about and regenerate.",
650
+ "Challenge a weak score by adding evidence in the product description or competitor field.",
651
+ "Use the next actions as validation tasks: landing page test, pricing interview, or segment comparison.",
652
+ ],
653
+ [
654
+ "把自动发现的竞品替换成你真正关心的竞品,然后重新生成。",
655
+ "如果某个评分不准确,在产品描述或竞品输入里补充证据后再分析。",
656
+ "把下一步行动当成验证任务:落地页测试、定价访谈或用户细分对比。",
657
+ ],
658
+ [
659
+ "把自動發現的競品替換成你真正關心的競品,然後重新產生。",
660
+ "如果某個評分不準確,在產品描述或競品輸入裡補充證據後再分析。",
661
+ "把下一步行動當成驗證任務:到達網頁測試、定價訪談或使用者細分對比。",
662
+ ],
663
+ ),
664
+ image: {
665
+ src: "/tools/product-positioning-analyzer-growth.webp",
666
+ alt: t(
667
+ "A positioning report feeding revised segments, pricing, messaging, and product decisions.",
668
+ "定位报告驱动人群、定价、文案和产品决策调整的示意图。",
669
+ "定位報告驅動人群、定價、文案和產品決策調整的示意圖。",
670
+ ),
671
+ side: "left",
672
+ },
673
+ imageFirst: true,
674
+ },
675
+ ],
676
+ generation: {
677
+ title: t(
678
+ "How to run a positioning pass",
679
+ "如何跑一轮定位分析",
680
+ "如何跑一輪定位分析",
681
+ ),
682
+ image: {
683
+ src: "/tools/product-positioning-analyzer-workspace.webp",
684
+ alt: t(
685
+ "Product input flowing into competitor discovery and a positioning report workspace.",
686
+ "产品输入进入竞品发现和定位报告工作区的示意图。",
687
+ "產品輸入進入競品發現和定位報告工作區的示意圖。",
688
+ ),
689
+ side: "left",
690
+ },
691
+ steps: [
692
+ {
693
+ title: t(
694
+ "Describe your product",
695
+ "描述你的产品",
696
+ "描述你的產品",
697
+ ),
698
+ body: t(
699
+ "Paste a name, URL, or one clear sentence. Competitors and market context are optional.",
700
+ "粘贴名称、链接或一句清楚描述。竞品与市场信息可选。",
701
+ "貼上名稱、連結或一句清楚描述。競品與市場資訊可選。",
702
+ ),
703
+ },
704
+ {
705
+ title: t(
706
+ "Read the curve and diagnosis",
707
+ "阅读价值曲线与诊断",
708
+ "閱讀價值曲線與診斷",
709
+ ),
710
+ body: t(
711
+ "Focus on gaps, overinvestment, and the dimensions the report says to strengthen or reduce.",
712
+ "优先看差距、过度投入,以及报告建议强化或弱化的维度。",
713
+ "優先看差距、過度投入,以及報告建議強化或弱化的維度。",
714
+ ),
715
+ },
716
+ {
717
+ title: t(
718
+ "Revise inputs and rerun",
719
+ "调整输入后重跑",
720
+ "調整輸入後重跑",
721
+ ),
722
+ body: t(
723
+ "Swap competitors, add score hypotheses, then regenerate before turning the sharpest dimensions into copy or launch assets.",
724
+ "替换竞品、补充评分假设后重新生成,再把最关键维度转成文案或上线素材。",
725
+ "替換競品、補充評分假設後重新產生,再把最關鍵維度轉成文案或上線素材。",
726
+ ),
727
+ },
728
+ ],
729
+ ctaLabel: t(
730
+ "Analyze positioning",
731
+ "分析产品定位",
732
+ "分析產品定位",
733
+ ),
734
+ },
735
+ faq: {
736
+ title: t(
737
+ "Product positioning analyzer FAQs",
738
+ "产品定位分析器常见问题",
739
+ "產品定位分析器常見問題",
740
+ ),
741
+ intro: t(
742
+ "Treat the report as a research-backed working model, then validate risky claims with users and market data.",
743
+ "把报告当作有研究依据的工作模型,高风险结论仍需用户与市场数据验证。",
744
+ "把報告當作有研究依據的工作模型,高風險結論仍需使用者與市場資料驗證。",
745
+ ),
746
+ ctaLabel: t(
747
+ "Analyze my product",
748
+ "分析我的产品",
749
+ "分析我的產品",
750
+ ),
751
+ },
752
+ },
753
+ faq: [
754
+ {
755
+ question: t(
756
+ "Can I start without competitors?",
757
+ "不填写竞品也能开始吗?",
758
+ "不填寫競品也能開始嗎?",
759
+ ),
760
+ answer: t(
761
+ "Yes. Competitor input is an enhancement, not a gate. If you leave it blank, the agent discovers direct competitors, indirect competitors, and substitutes, then explains why each was selected.",
762
+ "可以。竞品输入是增强项,不是门槛。留空时,Agent 会自动发现直接竞品、间接竞品和替代方案,并解释选择依据。",
763
+ "可以。競品輸入是增強項,不是門檻。留空時,Agent 會自動發現直接競品、間接競品和替代方案,並解釋選擇依據。",
764
+ ),
765
+ },
766
+ {
767
+ question: t("What is APPEALS?", "APPEALS 是什么?", "APPEALS 是什麼?"),
768
+ answer: t(
769
+ "APPEALS compares products across Price, Availability, Packaging, Performance, Ease of Use, Assurance, Life-cycle Cost, and Social Acceptance. The scores are strategic comparisons, not lab measurements.",
770
+ "APPEALS 用价格、可获得性、包装、性能、易用性、保证、生命周期成本、社会接受程度八个维度比较产品。这里的评分是战略相对评分,不是实验室测量。",
771
+ "APPEALS 用價格、可獲得性、包裝、效能、易用性、保證、生命週期成本、社會接受程度八個維度比較產品。這裡的評分是戰略相對評分,不是實驗室測量。",
772
+ ),
773
+ },
774
+ {
775
+ question: t(
776
+ "Is the strategic curve final truth?",
777
+ "战略曲线是最终真相吗?",
778
+ "戰略曲線是最終真相嗎?",
779
+ ),
780
+ answer: t(
781
+ "No. It is a research-backed working model. Use it to see assumptions, gaps, and differentiation bets, then validate the risky parts with users and market data.",
782
+ "不是。它是基于研究信号的工作模型,用来看到假设、差距和差异化下注点;高风险部分仍需要用户和市场数据验证。",
783
+ "不是。它是基於研究訊號的工作模型,用來看到假設、差距和差異化下注點;高風險部分仍需要使用者與市場資料驗證。",
784
+ ),
785
+ },
786
+ {
787
+ question: t(
788
+ "Why not use the existing competitor analysis tool?",
789
+ "为什么不直接用已有竞品分析工具?",
790
+ "為什麼不直接用既有競品分析工具?",
791
+ ),
792
+ answer: t(
793
+ "The existing tool profiles one competitor URL. This tool starts from your own product, discovers the competitive set, scores APPEALS across all players, and turns the result into positioning and growth choices.",
794
+ "已有工具主要分析单个竞品链接。这个工具从你的产品出发,发现竞争集合,横向评分 APPEALS,并把结果转成定位和增长决策。",
795
+ "既有工具主要分析單個競品連結。這個工具從你的產品出發,發現競爭集合,橫向評分 APPEALS,並把結果轉成定位和成長決策。",
796
+ ),
797
+ },
798
+ ],
799
+ },
800
+ assets: {},
801
+ };