@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.
- package/README.md +12 -0
- package/package.json +629 -0
- package/src/assets/icons/brands/social/bluesky-icon.tsx +9 -0
- package/src/assets/icons/brands/social/facebook-icon.tsx +9 -0
- package/src/assets/icons/brands/social/index.ts +8 -0
- package/src/assets/icons/brands/social/instagram-icon.tsx +9 -0
- package/src/assets/icons/brands/social/linkedin-icon.tsx +9 -0
- package/src/assets/icons/brands/social/threads-icon.tsx +9 -0
- package/src/assets/icons/brands/social/tiktok-icon.tsx +10 -0
- package/src/assets/icons/brands/social/x-icon.tsx +9 -0
- package/src/assets/icons/brands/social/youtube-icon.tsx +9 -0
- package/src/assets/icons/social-profile/facebook-icon.tsx +12 -0
- package/src/assets/icons/social-profile/index.ts +29 -0
- package/src/assets/icons/social-profile/instagram-icon.tsx +18 -0
- package/src/assets/icons/social-profile/linkedin-icon.tsx +12 -0
- package/src/assets/icons/social-profile/tiktok-icon.tsx +12 -0
- package/src/assets/icons/social-profile/x-icon.tsx +13 -0
- package/src/assets/icons/social-profile/youtube-icon.tsx +12 -0
- package/src/components/tools/engine/form-builder.tsx +219 -0
- package/src/components/tools/engine/package-widget-loader.tsx +38 -0
- package/src/components/tools/engine/package-widget-runtime.tsx +409 -0
- package/src/components/tools/engine/package-widget.tsx +77 -0
- package/src/components/tools/engine/result-view.tsx +596 -0
- package/src/components/tools/engine/use-legacy-llm-task.ts +64 -0
- package/src/components/tools/engine/use-tool-task.ts +195 -0
- package/src/components/tools/market-forecast-report.tsx +1150 -0
- package/src/components/tools/registry.ts +13 -0
- package/src/components/tools/workspace/index.ts +39 -0
- package/src/components/tools/workspace/tool-action-bar.tsx +99 -0
- package/src/components/tools/workspace/tool-empty-panel.tsx +32 -0
- package/src/components/tools/workspace/tool-error-panel.tsx +40 -0
- package/src/components/tools/workspace/tool-field.tsx +124 -0
- package/src/components/tools/workspace/tool-file-upload.tsx +112 -0
- package/src/components/tools/workspace/tool-form-section.tsx +21 -0
- package/src/components/tools/workspace/tool-form-shell.tsx +36 -0
- package/src/components/tools/workspace/tool-loading-panel.tsx +269 -0
- package/src/components/tools/workspace/tool-option-row.tsx +97 -0
- package/src/components/tools/workspace/tool-preview-panel.tsx +31 -0
- package/src/components/tools/workspace/tool-result-actions.tsx +67 -0
- package/src/components/tools/workspace/tool-result-file-actions.ts +31 -0
- package/src/components/tools/workspace/tool-result-header.tsx +39 -0
- package/src/components/tools/workspace/tool-status.tsx +13 -0
- package/src/components/tools/workspace/tool-workspace-layout.tsx +226 -0
- package/src/constants/LKS.ts +29 -0
- package/src/constants/related-tools.ts +18 -0
- package/src/constants/social-profile-kit.ts +284 -0
- package/src/constants/tool-assets.ts +7 -0
- package/src/env.d.ts +3 -0
- package/src/features/tools/_templates/standard-tool.container.tsx +90 -0
- package/src/features/tools/app-icon-resizer/app-icon-resizer.container.tsx +11 -0
- package/src/features/tools/app-icon-resizer/app-icon-resizer.spec.ts +15 -0
- package/src/features/tools/app-icon-resizer/widget/app-icon-resizer.tsx +444 -0
- package/src/features/tools/app-icon-resizer/widget/constants.ts +19 -0
- package/src/features/tools/app-icon-resizer/widget/helpers.ts +314 -0
- package/src/features/tools/app-icon-resizer/widget/index.ts +7 -0
- package/src/features/tools/app-icon-resizer/widget/platform-icons.tsx +59 -0
- package/src/features/tools/app-icon-resizer/widget/preview-dialogs.tsx +139 -0
- package/src/features/tools/app-icon-resizer/widget/result-shell.tsx +165 -0
- package/src/features/tools/app-icon-resizer/widget/types.ts +36 -0
- package/src/features/tools/app-store-screenshot-generator/app-store-screenshot-generator.container.tsx +108 -0
- package/src/features/tools/app-store-screenshot-generator/app-store-screenshot-generator.spec.ts +14 -0
- package/src/features/tools/app-store-screenshot-generator/config.ts +3 -0
- package/src/features/tools/app-store-screenshot-generator/widget/app-store-screenshot-generator.tsx +1250 -0
- package/src/features/tools/app-store-screenshot-generator/widget/asset-slots.ts +76 -0
- package/src/features/tools/app-store-screenshot-generator/widget/constants.ts +43 -0
- package/src/features/tools/app-store-screenshot-generator/widget/form-controls.tsx +214 -0
- package/src/features/tools/app-store-screenshot-generator/widget/generation.ts +528 -0
- package/src/features/tools/app-store-screenshot-generator/widget/index.ts +7 -0
- package/src/features/tools/app-store-screenshot-generator/widget/input-media.ts +175 -0
- package/src/features/tools/app-store-screenshot-generator/widget/types.ts +60 -0
- package/src/features/tools/app-store-screenshot-generator/widget/zip.ts +119 -0
- package/src/features/tools/build-in-public-story-generator/build-in-public-story-generator.container.tsx +135 -0
- package/src/features/tools/build-in-public-story-generator/build-in-public-story-generator.spec.ts +15 -0
- package/src/features/tools/build-in-public-story-generator/widget/build-in-public-story-generator.tsx +314 -0
- package/src/features/tools/build-in-public-story-generator/widget/constants.ts +3 -0
- package/src/features/tools/build-in-public-story-generator/widget/helpers.ts +25 -0
- package/src/features/tools/build-in-public-story-generator/widget/index.ts +7 -0
- package/src/features/tools/build-in-public-story-generator/widget/preview-panels.tsx +58 -0
- package/src/features/tools/build-in-public-story-generator/widget/result-shell.tsx +164 -0
- package/src/features/tools/build-in-public-story-generator/widget/types.ts +6 -0
- package/src/features/tools/cold-start-channel-selector/cold-start-channel-selector.container.tsx +30 -0
- package/src/features/tools/cold-start-channel-selector/cold-start-channel-selector.spec.ts +15 -0
- package/src/features/tools/cold-start-channel-selector/widget/cold-start-channel-selector.tsx +417 -0
- package/src/features/tools/cold-start-channel-selector/widget/constants.ts +46 -0
- package/src/features/tools/cold-start-channel-selector/widget/form-controls.tsx +41 -0
- package/src/features/tools/cold-start-channel-selector/widget/helpers.ts +75 -0
- package/src/features/tools/cold-start-channel-selector/widget/index.ts +7 -0
- package/src/features/tools/cold-start-channel-selector/widget/preview-panels.tsx +250 -0
- package/src/features/tools/cold-start-channel-selector/widget/result-shell.tsx +199 -0
- package/src/features/tools/cold-start-channel-selector/widget/types.ts +21 -0
- package/src/features/tools/commercial-bp-generator/commercial-bp-generator.container.tsx +102 -0
- package/src/features/tools/commercial-bp-generator/commercial-bp-generator.spec.ts +14 -0
- package/src/features/tools/commercial-bp-generator/widget/commercial-bp-generator.tsx +676 -0
- package/src/features/tools/commercial-bp-generator/widget/constants.ts +32 -0
- package/src/features/tools/commercial-bp-generator/widget/helpers.ts +147 -0
- package/src/features/tools/commercial-bp-generator/widget/index.ts +7 -0
- package/src/features/tools/commercial-bp-generator/widget/result-shell.tsx +271 -0
- package/src/features/tools/commercial-bp-generator/widget/style-option.tsx +54 -0
- package/src/features/tools/commercial-bp-generator/widget/types.ts +33 -0
- package/src/features/tools/community-feedback-inbox/community-feedback-inbox.container.tsx +126 -0
- package/src/features/tools/community-feedback-inbox/community-feedback-inbox.spec.ts +15 -0
- package/src/features/tools/community-feedback-inbox/widget/community-feedback-inbox.tsx +271 -0
- package/src/features/tools/community-feedback-inbox/widget/constants.ts +3 -0
- package/src/features/tools/community-feedback-inbox/widget/helpers.ts +28 -0
- package/src/features/tools/community-feedback-inbox/widget/index.ts +7 -0
- package/src/features/tools/community-feedback-inbox/widget/preview-panels.tsx +92 -0
- package/src/features/tools/community-feedback-inbox/widget/result-shell.tsx +266 -0
- package/src/features/tools/community-feedback-inbox/widget/types.ts +6 -0
- package/src/features/tools/community-pain-point-extractor/community-pain-point-extractor.container.tsx +124 -0
- package/src/features/tools/community-pain-point-extractor/community-pain-point-extractor.spec.ts +15 -0
- package/src/features/tools/community-pain-point-extractor/widget/community-pain-point-extractor.tsx +404 -0
- package/src/features/tools/community-pain-point-extractor/widget/constants.ts +41 -0
- package/src/features/tools/community-pain-point-extractor/widget/helpers.ts +76 -0
- package/src/features/tools/community-pain-point-extractor/widget/index.ts +8 -0
- package/src/features/tools/community-pain-point-extractor/widget/progress-panels.tsx +251 -0
- package/src/features/tools/community-pain-point-extractor/widget/result-shell.tsx +478 -0
- package/src/features/tools/community-pain-point-extractor/widget/types.ts +33 -0
- package/src/features/tools/community-post-risk-checker/community-post-risk-checker.package.ts +792 -0
- package/src/features/tools/competitor-analysis/competitor-analysis.container.tsx +136 -0
- package/src/features/tools/competitor-analysis/competitor-analysis.spec.ts +15 -0
- package/src/features/tools/competitor-analysis/widget/competitor-analysis.tsx +241 -0
- package/src/features/tools/competitor-analysis/widget/constants.ts +9 -0
- package/src/features/tools/competitor-analysis/widget/index.ts +7 -0
- package/src/features/tools/competitor-analysis/widget/preview-panels.tsx +60 -0
- package/src/features/tools/competitor-analysis/widget/result-shell.tsx +418 -0
- package/src/features/tools/competitor-analysis/widget/types.ts +13 -0
- package/src/features/tools/disclaimer-generator/disclaimer-generator.package.ts +339 -0
- package/src/features/tools/email-template-generator/email-template-generator.container.tsx +224 -0
- package/src/features/tools/email-template-generator/email-template-generator.spec.ts +14 -0
- package/src/features/tools/email-template-generator/widget/email-template-generator.tsx +358 -0
- package/src/features/tools/email-template-generator/widget/helpers.ts +39 -0
- package/src/features/tools/email-template-generator/widget/index.ts +7 -0
- package/src/features/tools/email-template-generator/widget/preview-panel.tsx +311 -0
- package/src/features/tools/email-template-generator/widget/result-text-block.tsx +7 -0
- package/src/features/tools/email-template-generator/widget/types.ts +24 -0
- package/src/features/tools/gtm-readiness-checklist/gtm-readiness-checklist.container.tsx +75 -0
- package/src/features/tools/gtm-readiness-checklist/gtm-readiness-checklist.spec.ts +15 -0
- package/src/features/tools/gtm-readiness-checklist/widget/gtm-readiness-checklist.tsx +122 -0
- package/src/features/tools/gtm-readiness-checklist/widget/index.ts +7 -0
- package/src/features/tools/investor-matching-planner/investor-matching-planner.package.ts +869 -0
- package/src/features/tools/koko-codex-assistant/koko-codex-assistant.container.tsx +151 -0
- package/src/features/tools/koko-codex-assistant/koko-codex-assistant.spec.ts +14 -0
- package/src/features/tools/koko-codex-assistant/widget/index.ts +7 -0
- package/src/features/tools/koko-codex-assistant/widget/koko-codex-assistant-download.tsx +192 -0
- package/src/features/tools/logo-generator/logo-generator.container.tsx +112 -0
- package/src/features/tools/logo-generator/logo-generator.spec.ts +15 -0
- package/src/features/tools/logo-generator/widget/index.ts +7 -0
- package/src/features/tools/logo-generator/widget/logo-generator.tsx +1244 -0
- package/src/features/tools/market-forecast-report/market-forecast-report.container.tsx +73 -0
- package/src/features/tools/market-forecast-report/market-forecast-report.spec.ts +15 -0
- package/src/features/tools/million-user-growth-test/million-user-growth-test.container.tsx +123 -0
- package/src/features/tools/million-user-growth-test/million-user-growth-test.spec.ts +14 -0
- package/src/features/tools/million-user-growth-test/widget/index.ts +7 -0
- package/src/features/tools/million-user-growth-test/widget/million-user-growth-test.tsx +433 -0
- package/src/features/tools/module-loader.ts +107 -0
- package/src/features/tools/og-image-generator/og-image-generator.container.tsx +86 -0
- package/src/features/tools/og-image-generator/og-image-generator.spec.ts +14 -0
- package/src/features/tools/og-image-generator/widget/constants.ts +38 -0
- package/src/features/tools/og-image-generator/widget/form-fields.tsx +240 -0
- package/src/features/tools/og-image-generator/widget/index.ts +7 -0
- package/src/features/tools/og-image-generator/widget/og-image-generator.tsx +742 -0
- package/src/features/tools/og-image-generator/widget/preview-panel.tsx +305 -0
- package/src/features/tools/og-image-generator/widget/types.ts +1 -0
- package/src/features/tools/package/direct-models.ts +20 -0
- package/src/features/tools/package/form.ts +38 -0
- package/src/features/tools/package/l10n.ts +22 -0
- package/src/features/tools/package/package-container.tsx +285 -0
- package/src/features/tools/package/package-loaders.ts +22 -0
- package/src/features/tools/package/package-registry.ts +36 -0
- package/src/features/tools/package/result-markdown.ts +142 -0
- package/src/features/tools/package/schema.ts +379 -0
- package/src/features/tools/package/to-tool-module.ts +20 -0
- package/src/features/tools/package/to-tool-spec.ts +52 -0
- package/src/features/tools/package/types.ts +381 -0
- package/src/features/tools/pitch-deck-generator/pitch-deck-generator.container.tsx +175 -0
- package/src/features/tools/pitch-deck-generator/pitch-deck-generator.spec.ts +14 -0
- package/src/features/tools/pitch-deck-generator/pitch-deck-library-data.ts +476 -0
- package/src/features/tools/pitch-deck-generator/pitch-deck-library.tsx +159 -0
- package/src/features/tools/pitch-deck-generator/widget/ceremony-line.tsx +27 -0
- package/src/features/tools/pitch-deck-generator/widget/constants.ts +27 -0
- package/src/features/tools/pitch-deck-generator/widget/index.ts +7 -0
- package/src/features/tools/pitch-deck-generator/widget/pitch-deck-generator.tsx +763 -0
- package/src/features/tools/pitch-deck-generator/widget/result-helpers.ts +102 -0
- package/src/features/tools/pitch-deck-generator/widget/result-shell.tsx +263 -0
- package/src/features/tools/pitch-deck-generator/widget/slide-frame.tsx +106 -0
- package/src/features/tools/pitch-deck-generator/widget/slide-lightbox.tsx +149 -0
- package/src/features/tools/pitch-deck-generator/widget/style-option.tsx +54 -0
- package/src/features/tools/pitch-deck-generator/widget/types.ts +44 -0
- package/src/features/tools/product-agreement-generator/product-agreement-generator.container.tsx +137 -0
- package/src/features/tools/product-agreement-generator/product-agreement-generator.spec.ts +14 -0
- package/src/features/tools/product-agreement-generator/widget/constants.ts +27 -0
- package/src/features/tools/product-agreement-generator/widget/form-controls.tsx +218 -0
- package/src/features/tools/product-agreement-generator/widget/helpers.ts +68 -0
- package/src/features/tools/product-agreement-generator/widget/index.ts +7 -0
- package/src/features/tools/product-agreement-generator/widget/product-agreement-generator.tsx +671 -0
- package/src/features/tools/product-agreement-generator/widget/result-shell.tsx +473 -0
- package/src/features/tools/product-agreement-generator/widget/types.ts +89 -0
- package/src/features/tools/product-hunt-launch-planner/product-hunt-launch-planner.container.tsx +122 -0
- package/src/features/tools/product-hunt-launch-planner/product-hunt-launch-planner.spec.ts +15 -0
- package/src/features/tools/product-hunt-launch-planner/widget/constants.ts +5 -0
- package/src/features/tools/product-hunt-launch-planner/widget/helpers.ts +44 -0
- package/src/features/tools/product-hunt-launch-planner/widget/index.ts +7 -0
- package/src/features/tools/product-hunt-launch-planner/widget/preview-panel.tsx +143 -0
- package/src/features/tools/product-hunt-launch-planner/widget/product-hunt-launch-planner.tsx +504 -0
- package/src/features/tools/product-hunt-launch-planner/widget/result-shell.tsx +176 -0
- package/src/features/tools/product-hunt-launch-planner/widget/types.ts +20 -0
- package/src/features/tools/product-name-generator/product-name-generator.container.tsx +14 -0
- package/src/features/tools/product-name-generator/product-name-generator.spec.ts +15 -0
- package/src/features/tools/product-name-generator/widget/candidate-card.tsx +273 -0
- package/src/features/tools/product-name-generator/widget/constants.ts +21 -0
- package/src/features/tools/product-name-generator/widget/form-controls.tsx +136 -0
- package/src/features/tools/product-name-generator/widget/helpers.ts +41 -0
- package/src/features/tools/product-name-generator/widget/index.ts +7 -0
- package/src/features/tools/product-name-generator/widget/product-name-generator.tsx +776 -0
- package/src/features/tools/product-name-generator/widget/types.ts +36 -0
- package/src/features/tools/product-positioning-analyzer/product-positioning-analyzer.package.ts +801 -0
- package/src/features/tools/product-poster-generator/product-poster-generator.container.tsx +14 -0
- package/src/features/tools/product-poster-generator/product-poster-generator.spec.ts +15 -0
- package/src/features/tools/product-poster-generator/widget/constants.ts +125 -0
- package/src/features/tools/product-poster-generator/widget/form-controls.tsx +204 -0
- package/src/features/tools/product-poster-generator/widget/helpers.ts +155 -0
- package/src/features/tools/product-poster-generator/widget/index.ts +7 -0
- package/src/features/tools/product-poster-generator/widget/product-poster-generator.tsx +663 -0
- package/src/features/tools/product-poster-generator/widget/result-shell.tsx +12 -0
- package/src/features/tools/product-poster-generator/widget/types.ts +83 -0
- package/src/features/tools/product-ui-generator/product-ui-generator.container.tsx +116 -0
- package/src/features/tools/product-ui-generator/product-ui-generator.spec.ts +14 -0
- package/src/features/tools/product-ui-generator/widget/constants.ts +18 -0
- package/src/features/tools/product-ui-generator/widget/helpers.ts +11 -0
- package/src/features/tools/product-ui-generator/widget/index.ts +7 -0
- package/src/features/tools/product-ui-generator/widget/preview-panels.tsx +73 -0
- package/src/features/tools/product-ui-generator/widget/product-ui-generator.tsx +304 -0
- package/src/features/tools/product-ui-generator/widget/result-shell.tsx +118 -0
- package/src/features/tools/product-ui-generator/widget/types.ts +9 -0
- package/src/features/tools/reddit-pain-point-finder/reddit-pain-point-finder.container.tsx +113 -0
- package/src/features/tools/reddit-pain-point-finder/reddit-pain-point-finder.spec.ts +15 -0
- package/src/features/tools/reddit-pain-point-finder/widget/constants.ts +5 -0
- package/src/features/tools/reddit-pain-point-finder/widget/index.ts +7 -0
- package/src/features/tools/reddit-pain-point-finder/widget/preview-panels.tsx +73 -0
- package/src/features/tools/reddit-pain-point-finder/widget/reddit-pain-point-finder.tsx +281 -0
- package/src/features/tools/reddit-pain-point-finder/widget/result-shell.tsx +203 -0
- package/src/features/tools/reddit-pain-point-finder/widget/types.ts +15 -0
- package/src/features/tools/registry.ts +288 -0
- package/src/features/tools/runtime-registry.ts +186 -0
- package/src/features/tools/shared/create-guide-stack-container.tsx +176 -0
- package/src/features/tools/shared/create-standard-landing-container.tsx +163 -0
- package/src/features/tools/shared/tool-content-sections.tsx +659 -0
- package/src/features/tools/shared/tool-cta.tsx +66 -0
- package/src/features/tools/shared/tool-draft-view.tsx +53 -0
- package/src/features/tools/shared/tool-guide-section.tsx +191 -0
- package/src/features/tools/shared/tool-handoff.tsx +38 -0
- package/src/features/tools/shared/tool-mcp-badge.tsx +23 -0
- package/src/features/tools/shared/tool-message-translator.ts +37 -0
- package/src/features/tools/shared/tool-page-shell.tsx +348 -0
- package/src/features/tools/shared/tool-standard-generation-steps.tsx +52 -0
- package/src/features/tools/shared/tool-standard-landing-sections.tsx +447 -0
- package/src/features/tools/shared/tool-ui-registry.ts +237 -0
- package/src/features/tools/shared/tool-widget-slot.tsx +29 -0
- package/src/features/tools/slogan-generator/slogan-generator.package.ts +641 -0
- package/src/features/tools/social-listening-research-report/social-listening-research-report.container.tsx +124 -0
- package/src/features/tools/social-listening-research-report/social-listening-research-report.spec.ts +15 -0
- package/src/features/tools/social-listening-research-report/widget/constants.ts +4 -0
- package/src/features/tools/social-listening-research-report/widget/index.ts +7 -0
- package/src/features/tools/social-listening-research-report/widget/preview-panels.tsx +73 -0
- package/src/features/tools/social-listening-research-report/widget/result-shell.tsx +216 -0
- package/src/features/tools/social-listening-research-report/widget/social-listening-research-report.tsx +303 -0
- package/src/features/tools/social-listening-research-report/widget/types.ts +15 -0
- package/src/features/tools/social-platform-asset-adapter/social-platform-asset-adapter.container.tsx +123 -0
- package/src/features/tools/social-platform-asset-adapter/social-platform-asset-adapter.spec.ts +15 -0
- package/src/features/tools/social-platform-asset-adapter/widget/constants.ts +43 -0
- package/src/features/tools/social-platform-asset-adapter/widget/helpers.ts +249 -0
- package/src/features/tools/social-platform-asset-adapter/widget/index.ts +7 -0
- package/src/features/tools/social-platform-asset-adapter/widget/result-shell.tsx +350 -0
- package/src/features/tools/social-platform-asset-adapter/widget/section-heading.tsx +18 -0
- package/src/features/tools/social-platform-asset-adapter/widget/social-platform-asset-adapter.tsx +641 -0
- package/src/features/tools/social-platform-asset-adapter/widget/types.ts +40 -0
- package/src/features/tools/social-profile-kit/social-profile-kit.container.tsx +177 -0
- package/src/features/tools/social-profile-kit/social-profile-kit.spec.ts +15 -0
- package/src/features/tools/social-profile-kit/widget/context-editor.tsx +171 -0
- package/src/features/tools/social-profile-kit/widget/generation-runtime.ts +281 -0
- package/src/features/tools/social-profile-kit/widget/index.ts +7 -0
- package/src/features/tools/social-profile-kit/widget/input-panel.tsx +294 -0
- package/src/features/tools/social-profile-kit/widget/platform-dock.tsx +115 -0
- package/src/features/tools/social-profile-kit/widget/profile-canvas.tsx +318 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/bluesky-preview.tsx +188 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/facebook-preview.tsx +168 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/index.ts +1 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/instagram-preview.tsx +278 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/linkedin-preview.tsx +358 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/profile-preview.tsx +348 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/shared.tsx +391 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/threads-preview.tsx +148 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/tiktok-preview.tsx +319 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/x-preview.tsx +341 -0
- package/src/features/tools/social-profile-kit/widget/profile-preview/youtube-preview.tsx +297 -0
- package/src/features/tools/social-profile-kit/widget/social-profile-kit-generator.tsx +1059 -0
- package/src/features/tools/social-profile-kit/widget/types.ts +104 -0
- package/src/features/tools/spec-registry.ts +158 -0
- package/src/features/tools/startup-idea-research/startup-idea-research.container.tsx +111 -0
- package/src/features/tools/startup-idea-research/startup-idea-research.spec.ts +15 -0
- package/src/features/tools/startup-idea-research/widget/constants.ts +11 -0
- package/src/features/tools/startup-idea-research/widget/index.ts +7 -0
- package/src/features/tools/startup-idea-research/widget/preview-panels.tsx +67 -0
- package/src/features/tools/startup-idea-research/widget/result-shell.tsx +323 -0
- package/src/features/tools/startup-idea-research/widget/startup-idea-research.tsx +272 -0
- package/src/features/tools/startup-idea-research/widget/types.ts +21 -0
- package/src/features/tools/tarot-reading/tarot-reading.container.tsx +412 -0
- package/src/features/tools/tarot-reading/tarot-reading.spec.ts +15 -0
- package/src/features/tools/tarot-reading/widget/cards.tsx +152 -0
- package/src/features/tools/tarot-reading/widget/constants.ts +69 -0
- package/src/features/tools/tarot-reading/widget/deck-view.tsx +86 -0
- package/src/features/tools/tarot-reading/widget/deck.ts +86 -0
- package/src/features/tools/tarot-reading/widget/index.ts +7 -0
- package/src/features/tools/tarot-reading/widget/landing-view.tsx +209 -0
- package/src/features/tools/tarot-reading/widget/reading-copy.tsx +138 -0
- package/src/features/tools/tarot-reading/widget/reading-view.tsx +189 -0
- package/src/features/tools/tarot-reading/widget/reveal-view.tsx +50 -0
- package/src/features/tools/tarot-reading/widget/ritual-view.tsx +276 -0
- package/src/features/tools/tarot-reading/widget/tarot-reading.tsx +262 -0
- package/src/features/tools/tarot-reading/widget/types.ts +22 -0
- package/src/features/tools/twitter-gif-downloader/twitter-gif-downloader.container.tsx +114 -0
- package/src/features/tools/twitter-gif-downloader/twitter-gif-downloader.spec.ts +14 -0
- package/src/features/tools/twitter-gif-downloader/widget/index.ts +7 -0
- package/src/features/tools/twitter-gif-downloader/widget/twitter-gif-downloader.tsx +351 -0
- package/src/features/tools/types.ts +68 -0
- package/src/features/tools/user-interview-guide-generator/user-interview-guide-generator.package.ts +774 -0
- package/src/features/tools/user-interview-insight-report-generator/user-interview-insight-report-generator.container.tsx +23 -0
- package/src/features/tools/user-interview-insight-report-generator/user-interview-insight-report-generator.spec.ts +14 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/constants.ts +8 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/helpers.ts +4 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/index.ts +7 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/preview-panels.tsx +55 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/result-shell.tsx +122 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/types.ts +16 -0
- package/src/features/tools/user-interview-insight-report-generator/widget/user-interview-insight-report-generator.tsx +293 -0
- package/src/features/tools/user-interview-record-generator/user-interview-record-generator.container.tsx +18 -0
- package/src/features/tools/user-interview-record-generator/user-interview-record-generator.spec.ts +14 -0
- package/src/features/tools/user-interview-record-generator/widget/constants.ts +9 -0
- package/src/features/tools/user-interview-record-generator/widget/helpers.ts +4 -0
- package/src/features/tools/user-interview-record-generator/widget/index.ts +7 -0
- package/src/features/tools/user-interview-record-generator/widget/preview-panels.tsx +48 -0
- package/src/features/tools/user-interview-record-generator/widget/result-shell.tsx +128 -0
- package/src/features/tools/user-interview-record-generator/widget/types.ts +16 -0
- package/src/features/tools/user-interview-record-generator/widget/user-interview-record-generator.tsx +305 -0
- package/src/features/tools/utm-builder/utm-builder.package.ts +846 -0
- package/src/features/tools/widget-registry.ts +73 -0
- package/src/generated/mcp-tools-registry.json +17 -0
- package/src/host/client-proxy.test.ts +33 -0
- package/src/host/client.ts +678 -0
- package/src/host/server.ts +119 -0
- package/src/i18n/client.ts +11 -0
- package/src/i18n/locale-fallback.ts +38 -0
- package/src/i18n/locale.ts +18 -0
- package/src/i18n/messages/en/page/tools.ts +124 -0
- package/src/i18n/messages/en/tools/app-icon-resizer.ts +244 -0
- package/src/i18n/messages/en/tools/app-store-screenshot-generator.ts +145 -0
- package/src/i18n/messages/en/tools/build-in-public-story-generator.ts +229 -0
- package/src/i18n/messages/en/tools/cold-start-channel-selector.ts +423 -0
- package/src/i18n/messages/en/tools/commercial-bp-generator.ts +304 -0
- package/src/i18n/messages/en/tools/community-feedback-inbox.ts +218 -0
- package/src/i18n/messages/en/tools/community-pain-point-extractor.ts +230 -0
- package/src/i18n/messages/en/tools/community-post-risk-checker.ts +209 -0
- package/src/i18n/messages/en/tools/competitor-analysis.ts +197 -0
- package/src/i18n/messages/en/tools/email-template-generator.ts +302 -0
- package/src/i18n/messages/en/tools/engine.ts +69 -0
- package/src/i18n/messages/en/tools/gtm-readiness-checklist.ts +166 -0
- package/src/i18n/messages/en/tools/index.ts +73 -0
- package/src/i18n/messages/en/tools/koko-codex-assistant.ts +171 -0
- package/src/i18n/messages/en/tools/logo-generator.ts +173 -0
- package/src/i18n/messages/en/tools/market-forecast-report.ts +228 -0
- package/src/i18n/messages/en/tools/million-user-growth-test.ts +386 -0
- package/src/i18n/messages/en/tools/og-image-generator.ts +172 -0
- package/src/i18n/messages/en/tools/pitch-deck-generator.ts +358 -0
- package/src/i18n/messages/en/tools/product-agreement-generator.ts +411 -0
- package/src/i18n/messages/en/tools/product-hunt-launch-planner.ts +272 -0
- package/src/i18n/messages/en/tools/product-name-generator.ts +383 -0
- package/src/i18n/messages/en/tools/product-poster-generator.ts +294 -0
- package/src/i18n/messages/en/tools/product-ui-generator.ts +234 -0
- package/src/i18n/messages/en/tools/reddit-pain-point-finder.ts +163 -0
- package/src/i18n/messages/en/tools/shared.ts +24 -0
- package/src/i18n/messages/en/tools/social-listening-research-report.ts +185 -0
- package/src/i18n/messages/en/tools/social-media-profile-generator.ts +22 -0
- package/src/i18n/messages/en/tools/social-platform-asset-adapter.ts +287 -0
- package/src/i18n/messages/en/tools/social-profile-kit.ts +150 -0
- package/src/i18n/messages/en/tools/startup-idea-research.ts +170 -0
- package/src/i18n/messages/en/tools/tarot-reading.ts +230 -0
- package/src/i18n/messages/en/tools/twitter-gif-downloader.ts +145 -0
- package/src/i18n/messages/en/tools/user-interview-insight-report-generator.ts +242 -0
- package/src/i18n/messages/en/tools/user-interview-record-generator.ts +244 -0
- package/src/i18n/messages/en/tools-ui.ts +704 -0
- package/src/i18n/messages/zh/page/tools.ts +124 -0
- package/src/i18n/messages/zh/tools/app-icon-resizer.ts +242 -0
- package/src/i18n/messages/zh/tools/app-store-screenshot-generator.ts +145 -0
- package/src/i18n/messages/zh/tools/build-in-public-story-generator.ts +230 -0
- package/src/i18n/messages/zh/tools/cold-start-channel-selector.ts +422 -0
- package/src/i18n/messages/zh/tools/commercial-bp-generator.ts +302 -0
- package/src/i18n/messages/zh/tools/community-feedback-inbox.ts +217 -0
- package/src/i18n/messages/zh/tools/community-pain-point-extractor.ts +230 -0
- package/src/i18n/messages/zh/tools/community-post-risk-checker.ts +200 -0
- package/src/i18n/messages/zh/tools/competitor-analysis.ts +192 -0
- package/src/i18n/messages/zh/tools/email-template-generator.ts +302 -0
- package/src/i18n/messages/zh/tools/engine.ts +68 -0
- package/src/i18n/messages/zh/tools/gtm-readiness-checklist.ts +166 -0
- package/src/i18n/messages/zh/tools/index.ts +73 -0
- package/src/i18n/messages/zh/tools/koko-codex-assistant.ts +170 -0
- package/src/i18n/messages/zh/tools/logo-generator.ts +172 -0
- package/src/i18n/messages/zh/tools/market-forecast-report.ts +228 -0
- package/src/i18n/messages/zh/tools/million-user-growth-test.ts +385 -0
- package/src/i18n/messages/zh/tools/og-image-generator.ts +173 -0
- package/src/i18n/messages/zh/tools/pitch-deck-generator.ts +358 -0
- package/src/i18n/messages/zh/tools/product-agreement-generator.ts +401 -0
- package/src/i18n/messages/zh/tools/product-hunt-launch-planner.ts +267 -0
- package/src/i18n/messages/zh/tools/product-name-generator.ts +383 -0
- package/src/i18n/messages/zh/tools/product-poster-generator.ts +282 -0
- package/src/i18n/messages/zh/tools/product-ui-generator.ts +234 -0
- package/src/i18n/messages/zh/tools/reddit-pain-point-finder.ts +162 -0
- package/src/i18n/messages/zh/tools/shared.ts +24 -0
- package/src/i18n/messages/zh/tools/social-listening-research-report.ts +181 -0
- package/src/i18n/messages/zh/tools/social-media-profile-generator.ts +22 -0
- package/src/i18n/messages/zh/tools/social-platform-asset-adapter.ts +284 -0
- package/src/i18n/messages/zh/tools/social-profile-kit.ts +150 -0
- package/src/i18n/messages/zh/tools/startup-idea-research.ts +165 -0
- package/src/i18n/messages/zh/tools/tarot-reading.ts +228 -0
- package/src/i18n/messages/zh/tools/twitter-gif-downloader.ts +138 -0
- package/src/i18n/messages/zh/tools/user-interview-insight-report-generator.ts +224 -0
- package/src/i18n/messages/zh/tools/user-interview-record-generator.ts +226 -0
- package/src/i18n/messages/zh/tools-ui.ts +684 -0
- package/src/i18n/messages/zh-tw/page/tools.ts +115 -0
- package/src/i18n/messages/zh-tw/tools/app-icon-resizer.ts +242 -0
- package/src/i18n/messages/zh-tw/tools/app-store-screenshot-generator.ts +145 -0
- package/src/i18n/messages/zh-tw/tools/build-in-public-story-generator.ts +230 -0
- package/src/i18n/messages/zh-tw/tools/cold-start-channel-selector.ts +440 -0
- package/src/i18n/messages/zh-tw/tools/commercial-bp-generator.ts +302 -0
- package/src/i18n/messages/zh-tw/tools/community-feedback-inbox.ts +217 -0
- package/src/i18n/messages/zh-tw/tools/community-pain-point-extractor.ts +230 -0
- package/src/i18n/messages/zh-tw/tools/community-post-risk-checker.ts +200 -0
- package/src/i18n/messages/zh-tw/tools/competitor-analysis.ts +192 -0
- package/src/i18n/messages/zh-tw/tools/email-template-generator.ts +302 -0
- package/src/i18n/messages/zh-tw/tools/engine.ts +68 -0
- package/src/i18n/messages/zh-tw/tools/gtm-readiness-checklist.ts +166 -0
- package/src/i18n/messages/zh-tw/tools/index.ts +73 -0
- package/src/i18n/messages/zh-tw/tools/koko-codex-assistant.ts +170 -0
- package/src/i18n/messages/zh-tw/tools/logo-generator.ts +71 -0
- package/src/i18n/messages/zh-tw/tools/market-forecast-report.ts +228 -0
- package/src/i18n/messages/zh-tw/tools/million-user-growth-test.ts +385 -0
- package/src/i18n/messages/zh-tw/tools/og-image-generator.ts +173 -0
- package/src/i18n/messages/zh-tw/tools/pitch-deck-generator.ts +358 -0
- package/src/i18n/messages/zh-tw/tools/product-agreement-generator.ts +401 -0
- package/src/i18n/messages/zh-tw/tools/product-hunt-launch-planner.ts +267 -0
- package/src/i18n/messages/zh-tw/tools/product-name-generator.ts +383 -0
- package/src/i18n/messages/zh-tw/tools/product-poster-generator.ts +282 -0
- package/src/i18n/messages/zh-tw/tools/product-ui-generator.ts +234 -0
- package/src/i18n/messages/zh-tw/tools/reddit-pain-point-finder.ts +162 -0
- package/src/i18n/messages/zh-tw/tools/shared.ts +24 -0
- package/src/i18n/messages/zh-tw/tools/social-listening-research-report.ts +181 -0
- package/src/i18n/messages/zh-tw/tools/social-media-profile-generator.ts +22 -0
- package/src/i18n/messages/zh-tw/tools/social-platform-asset-adapter.ts +284 -0
- package/src/i18n/messages/zh-tw/tools/social-profile-kit.ts +150 -0
- package/src/i18n/messages/zh-tw/tools/startup-idea-research.ts +165 -0
- package/src/i18n/messages/zh-tw/tools/tarot-reading.ts +228 -0
- package/src/i18n/messages/zh-tw/tools/twitter-gif-downloader.ts +138 -0
- package/src/i18n/messages/zh-tw/tools/user-interview-insight-report-generator.ts +224 -0
- package/src/i18n/messages/zh-tw/tools/user-interview-record-generator.ts +226 -0
- package/src/i18n/messages/zh-tw/tools-ui.ts +525 -0
- package/src/index.ts +15 -0
- package/src/lib/activity-task-handoff.ts +404 -0
- package/src/lib/api/errors.ts +39 -0
- package/src/lib/app-origin.ts +30 -0
- package/src/lib/fact-claim-contract.ts +68 -0
- package/src/lib/fake-delay.ts +3 -0
- package/src/lib/file/download.ts +10 -0
- package/src/lib/routing/locale-paths.ts +27 -0
- package/src/lib/seo-meta.ts +3 -0
- package/src/lib/tools/app-icon-resizer-schema.ts +191 -0
- package/src/lib/tools/app-store-screenshot-generator-schema.ts +185 -0
- package/src/lib/tools/build-in-public-story-generator-schema.ts +67 -0
- package/src/lib/tools/build-in-public-story-generator.format.ts +507 -0
- package/src/lib/tools/cold-start-channel-selector-schema.ts +147 -0
- package/src/lib/tools/commercial-bp-generator-schema.ts +222 -0
- package/src/lib/tools/community-feedback-inbox-schema.ts +125 -0
- package/src/lib/tools/community-feedback-inbox.format.ts +764 -0
- package/src/lib/tools/community-pain-point-extractor-schema.ts +166 -0
- package/src/lib/tools/community-post-risk-checker-schema.ts +99 -0
- package/src/lib/tools/community-post-risk-checker.format.ts +557 -0
- package/src/lib/tools/competitor-analysis-schema.ts +144 -0
- package/src/lib/tools/draft-preview-access.ts +3 -0
- package/src/lib/tools/draft-store.ts +69 -0
- package/src/lib/tools/email-template-generator-schema.ts +124 -0
- package/src/lib/tools/gtm-checklist-copy.ts +57 -0
- package/src/lib/tools/gtm-checklist-structure.ts +37 -0
- package/src/lib/tools/image-download.ts +68 -0
- package/src/lib/tools/input-quality.ts +97 -0
- package/src/lib/tools/logo-generator-schema.ts +224 -0
- package/src/lib/tools/market-forecast-report-schema.ts +299 -0
- package/src/lib/tools/mcp-registry.ts +16 -0
- package/src/lib/tools/mcp-types.ts +18 -0
- package/src/lib/tools/million-user-growth-test-schema.ts +49 -0
- package/src/lib/tools/million-user-growth-test.ts +181 -0
- package/src/lib/tools/og-image-generator-render.ts +448 -0
- package/src/lib/tools/og-image-generator-schema.ts +140 -0
- package/src/lib/tools/ops-catalog.ts +102 -0
- package/src/lib/tools/pitch-deck-generator-schema.ts +182 -0
- package/src/lib/tools/pitch-deck-package.ts +0 -0
- package/src/lib/tools/product-agreement-generator-schema.ts +168 -0
- package/src/lib/tools/product-hunt-launch-planner-schema.ts +136 -0
- package/src/lib/tools/product-hunt-launch-planner.format.ts +72 -0
- package/src/lib/tools/product-name-generator-schema.ts +563 -0
- package/src/lib/tools/product-poster-generator-schema.ts +215 -0
- package/src/lib/tools/product-ui-generator-schema.ts +157 -0
- package/src/lib/tools/reddit-pain-point-finder-schema.ts +88 -0
- package/src/lib/tools/resolve-tool-locale-copy.ts +75 -0
- package/src/lib/tools/slug.ts +60 -0
- package/src/lib/tools/social-listening-research-report-schema.ts +105 -0
- package/src/lib/tools/social-platform-asset-adapter-schema.ts +152 -0
- package/src/lib/tools/social-profile-kit.constants.ts +12 -0
- package/src/lib/tools/social-profile-kit.generation.ts +257 -0
- package/src/lib/tools/social-profile-kit.input.ts +290 -0
- package/src/lib/tools/social-profile-kit.manual.ts +481 -0
- package/src/lib/tools/social-profile-kit.package.ts +220 -0
- package/src/lib/tools/social-profile-kit.schema.ts +328 -0
- package/src/lib/tools/startup-idea-research-schema.ts +107 -0
- package/src/lib/tools/tarot-imagery.ts +89 -0
- package/src/lib/tools/tarot-reading.ts +1044 -0
- package/src/lib/tools/tool-message-keys.ts +18 -0
- package/src/lib/tools/types.ts +32 -0
- package/src/lib/tools/user-interview.format.ts +147 -0
- package/src/lib/tools/user-interview.generation.ts +670 -0
- package/src/lib/tools/user-interview.schema.ts +192 -0
- package/src/lib/zip.ts +106 -0
- package/src/services/tools/handlers/gtm-readiness-checklist.ts +71 -0
- package/src/services/tools/handlers/types.ts +7 -0
package/src/features/tools/user-interview-guide-generator/user-interview-guide-generator.package.ts
ADDED
|
@@ -0,0 +1,774 @@
|
|
|
1
|
+
import { userInterviewGuideResultSchema } from "../../../lib/tools/user-interview.schema";
|
|
2
|
+
|
|
3
|
+
import type { ToolPackage } from "../package/types";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 金样工具:archetype 引擎迁移的第一个 ToolPackage。
|
|
7
|
+
* 替代原 container(195L) + widget(841L) + service(127L) + i18n×3(~760L),
|
|
8
|
+
* 行为与 2026-07-03 前的 custom 实现对齐。
|
|
9
|
+
*/
|
|
10
|
+
export const userInterviewGuideGeneratorPackage: ToolPackage = {
|
|
11
|
+
meta: {
|
|
12
|
+
slug: "user-interview-guide-generator",
|
|
13
|
+
toolType: "generator",
|
|
14
|
+
keywordEvidence:
|
|
15
|
+
"legacy:2026-06-29 迁移工具,发布前需 pnpm seo:keyword-brief -- --slug user-interview-guide-generator",
|
|
16
|
+
seo: {
|
|
17
|
+
publishedAt: "2026-06-29",
|
|
18
|
+
updatedAt: "2026-07-03",
|
|
19
|
+
readingTime: "7 min",
|
|
20
|
+
featured: false,
|
|
21
|
+
ogImage: "/tools/user-interview-guide-generator-hero-pseo.webp",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
copy: {
|
|
25
|
+
title: {
|
|
26
|
+
en: "User Interview Guide Generator",
|
|
27
|
+
zh: "用户访谈提纲生成器",
|
|
28
|
+
"zh-tw": "用戶訪談提綱生成器",
|
|
29
|
+
},
|
|
30
|
+
description: {
|
|
31
|
+
en: "Generate a decision-oriented user interview guide: who to recruit, how to open, what to ask, how to probe, what counts as strong evidence, and what needs human review.",
|
|
32
|
+
zh: "围绕一个产品决策生成用户访谈提纲:招募谁、怎么开场、问什么、如何追问、哪些回答算强信号,以及哪些问题需要人工复核。",
|
|
33
|
+
"zh-tw":
|
|
34
|
+
"圍繞一個產品決策生成用戶訪談提綱:招募誰、怎麼開場、問什麼、如何追問、哪些回答算強信號,以及哪些問題需要人工複核。",
|
|
35
|
+
},
|
|
36
|
+
intro: {
|
|
37
|
+
en: "Go beyond a generic question list. Connect product stage, recent participant behavior, and the decision you need to make into an executable interview playbook.",
|
|
38
|
+
zh: "不是套一份通用问题清单,而是把产品阶段、受访者近期行为和要支持的决策连在一起,生成可执行的访谈作战手册。",
|
|
39
|
+
"zh-tw":
|
|
40
|
+
"不是套一份通用問題清單,而是把產品階段、受訪者近期行為和要支持的決策連在一起,生成可執行的訪談作戰手冊。",
|
|
41
|
+
},
|
|
42
|
+
category: {
|
|
43
|
+
en: "User research tools",
|
|
44
|
+
zh: "用户研究工具",
|
|
45
|
+
"zh-tw": "用戶研究工具",
|
|
46
|
+
},
|
|
47
|
+
keywords: {
|
|
48
|
+
en: [
|
|
49
|
+
"user interview guide",
|
|
50
|
+
"user interview questions generator",
|
|
51
|
+
"customer interview template",
|
|
52
|
+
"product discovery questions",
|
|
53
|
+
"user research tool",
|
|
54
|
+
],
|
|
55
|
+
zh: ["用户访谈提纲", "用户访谈问题生成器", "用户访谈模板", "产品访谈问题", "用户研究工具"],
|
|
56
|
+
"zh-tw": ["用戶訪談提綱", "用戶訪談問題生成器", "用戶訪談模板", "產品訪談問題", "用戶研究工具"],
|
|
57
|
+
},
|
|
58
|
+
inputSignal: {
|
|
59
|
+
en: "Product stage + interview goal",
|
|
60
|
+
zh: "产品阶段 + 访谈目的",
|
|
61
|
+
"zh-tw": "產品階段 + 訪談目的",
|
|
62
|
+
},
|
|
63
|
+
outputSignal: {
|
|
64
|
+
en: "Strategy + questions + evidence signals",
|
|
65
|
+
zh: "访谈策略 + 问题追问 + 证据信号",
|
|
66
|
+
"zh-tw": "訪談策略 + 問題追問 + 證據信號",
|
|
67
|
+
},
|
|
68
|
+
boundarySignal: {
|
|
69
|
+
en: "Research draft; review and validate in real interviews",
|
|
70
|
+
zh: "研究草案,需人工复核和真实访谈验证",
|
|
71
|
+
"zh-tw": "研究草案,需人工複核和真實訪談驗證",
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
form: [
|
|
75
|
+
{
|
|
76
|
+
kind: "text",
|
|
77
|
+
id: "productName",
|
|
78
|
+
required: true,
|
|
79
|
+
label: { en: "Product or brand name", zh: "产品或项目名称", "zh-tw": "產品或項目名稱" },
|
|
80
|
+
hint: { en: "Real name or working title", zh: "真实名称或暂定名", "zh-tw": "真實名稱或暫定名" },
|
|
81
|
+
placeholder: { en: "e.g. LaunchKit AI", zh: "例如 LaunchKit AI", "zh-tw": "例如 LaunchKit AI" },
|
|
82
|
+
invalidMessage: {
|
|
83
|
+
en: "Add a real product name or working title, not a placeholder.",
|
|
84
|
+
zh: "请填写真实产品名或暂定名,不要只填测试占位文本。",
|
|
85
|
+
"zh-tw": "請填寫真實產品名或暫定名,不要只填測試佔位文字。",
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
kind: "textarea",
|
|
90
|
+
id: "productDescription",
|
|
91
|
+
required: true,
|
|
92
|
+
rows: 4,
|
|
93
|
+
minLength: 12,
|
|
94
|
+
label: { en: "Product / business description", zh: "产品 / 业务描述", "zh-tw": "產品 / 業務描述" },
|
|
95
|
+
hint: { en: "Who, problem, outcome", zh: "给谁、解决什么、卡在哪", "zh-tw": "給誰、解決什麼、卡在哪" },
|
|
96
|
+
placeholder: {
|
|
97
|
+
en: "Write the product, the audience, the problem, and the current blocker. Example: helps indie builders prepare a launch kit before Product Hunt.",
|
|
98
|
+
zh: "写清产品、目标用户、解决的问题和当前卡点。例如:帮独立开发者在 Product Hunt 发布前准备 launch kit。",
|
|
99
|
+
"zh-tw": "寫清產品、目標用戶、解決的問題和當前卡點。例如:幫獨立開發者在 Product Hunt 發布前準備 launch kit。",
|
|
100
|
+
},
|
|
101
|
+
invalidMessage: {
|
|
102
|
+
en: "Say who the product serves and what problem or outcome it addresses. One clear sentence is enough.",
|
|
103
|
+
zh: "说清楚产品给谁用、解决什么问题或带来什么结果。一句清楚的话就够。",
|
|
104
|
+
"zh-tw": "說清楚產品給誰用、解決什麼問題或帶來什麼結果。一句清楚的話就夠。",
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
kind: "select",
|
|
109
|
+
id: "productStage",
|
|
110
|
+
defaultValue: "idea",
|
|
111
|
+
label: { en: "Current stage", zh: "当前阶段", "zh-tw": "當前階段" },
|
|
112
|
+
options: [
|
|
113
|
+
{ value: "idea", label: { en: "Idea stage", zh: "想法阶段", "zh-tw": "想法階段" } },
|
|
114
|
+
{ value: "mvp", label: { en: "Before / during MVP", zh: "MVP 前 / MVP 中", "zh-tw": "MVP 前 / MVP 中" } },
|
|
115
|
+
{ value: "prototype", label: { en: "Prototype exists", zh: "已有原型", "zh-tw": "已有原型" } },
|
|
116
|
+
{ value: "launched", label: { en: "Launched", zh: "已上线", "zh-tw": "已上線" } },
|
|
117
|
+
{ value: "growth", label: { en: "Growth stage", zh: "增长阶段", "zh-tw": "增長階段" } },
|
|
118
|
+
{
|
|
119
|
+
value: "churn",
|
|
120
|
+
label: { en: "Churn / inactive analysis", zh: "流失 / 不活跃分析", "zh-tw": "流失 / 不活躍分析" },
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
kind: "select",
|
|
126
|
+
id: "interviewGoal",
|
|
127
|
+
defaultValue: "problemValidation",
|
|
128
|
+
label: { en: "Interview goal", zh: "访谈目的", "zh-tw": "訪談目的" },
|
|
129
|
+
options: [
|
|
130
|
+
{
|
|
131
|
+
value: "discovery",
|
|
132
|
+
label: { en: "Explore problem and audience", zh: "探索问题和人群", "zh-tw": "探索問題和人群" },
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
value: "problemValidation",
|
|
136
|
+
label: { en: "Validate pain strength", zh: "验证痛点强度", "zh-tw": "驗證痛點強度" },
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
value: "solutionValidation",
|
|
140
|
+
label: { en: "Validate solution direction", zh: "验证方案方向", "zh-tw": "驗證方案方向" },
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
value: "usability",
|
|
144
|
+
label: { en: "Test prototype usability", zh: "测试原型可用性", "zh-tw": "測試原型可用性" },
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
value: "pricing",
|
|
148
|
+
label: {
|
|
149
|
+
en: "Validate pricing and willingness to pay",
|
|
150
|
+
zh: "验证定价和付费意愿",
|
|
151
|
+
"zh-tw": "驗證定價和付費意願",
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
{ value: "churn", label: { en: "Understand churn reasons", zh: "理解流失原因", "zh-tw": "理解流失原因" } },
|
|
155
|
+
{
|
|
156
|
+
value: "positioning",
|
|
157
|
+
label: {
|
|
158
|
+
en: "Find positioning and customer language",
|
|
159
|
+
zh: "提炼定位和用户语言",
|
|
160
|
+
"zh-tw": "提煉定位和用戶語言",
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
kind: "textarea",
|
|
167
|
+
id: "targetParticipants",
|
|
168
|
+
required: true,
|
|
169
|
+
rows: 3,
|
|
170
|
+
minLength: 8,
|
|
171
|
+
label: { en: "Target participants", zh: "目标受访者", "zh-tw": "目標受訪者" },
|
|
172
|
+
hint: { en: "Role plus recent behavior", zh: "人群 + 近期行为", "zh-tw": "人群 + 近期行為" },
|
|
173
|
+
placeholder: {
|
|
174
|
+
en: "e.g. indie builders who launched a product recently but still do not have a stable traffic source.",
|
|
175
|
+
zh: "例如:最近发布过产品、但还没有稳定访问来源的独立开发者 / 小团队。",
|
|
176
|
+
"zh-tw": "例如:最近發布過產品、但還沒有穩定訪問來源的獨立開發者 / 小團隊。",
|
|
177
|
+
},
|
|
178
|
+
invalidMessage: {
|
|
179
|
+
en: "Name the participant group and a recent behavior or situation that makes them relevant.",
|
|
180
|
+
zh: "说清楚要访谈哪类人,以及他们最近做过什么或正处在什么场景。",
|
|
181
|
+
"zh-tw": "說清楚要訪談哪類人,以及他們最近做過什麼或正處在什麼場景。",
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
kind: "textarea",
|
|
186
|
+
id: "knownHypotheses",
|
|
187
|
+
rows: 3,
|
|
188
|
+
label: { en: "Known hypotheses", zh: "已有假设", "zh-tw": "已有假設" },
|
|
189
|
+
placeholder: {
|
|
190
|
+
en: "e.g. developers scramble to create logos, screenshots, and social images before launch; resizing and visual consistency hurt most.",
|
|
191
|
+
zh: "例如:开发者会在上线前临时补齐 Logo、截图、社媒图,最痛的是多尺寸适配和风格统一。",
|
|
192
|
+
"zh-tw": "例如:開發者會在上線前臨時補齊 Logo、截圖、社群圖片,最痛的是多尺寸適配和風格統一。",
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
kind: "textarea",
|
|
197
|
+
id: "decisionToMake",
|
|
198
|
+
rows: 3,
|
|
199
|
+
label: {
|
|
200
|
+
en: "Decision this round should inform",
|
|
201
|
+
zh: "这轮访谈要帮助你做什么决策",
|
|
202
|
+
"zh-tw": "這輪訪談要幫助你做什麼決策",
|
|
203
|
+
},
|
|
204
|
+
placeholder: {
|
|
205
|
+
en: "e.g. whether the MVP should start with Product Hunt/social launch kits or App Store screenshots.",
|
|
206
|
+
zh: "例如:MVP 是否先做 Product Hunt / 社媒发布物料包,还是先做 App Store 截图。",
|
|
207
|
+
"zh-tw": "例如:MVP 是否先做 Product Hunt / 社群發布物料包,還是先做 App Store 截圖。",
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
kind: "toggle",
|
|
212
|
+
id: "hasPrototype",
|
|
213
|
+
defaultValue: false,
|
|
214
|
+
label: { en: "Prototype / demo", zh: "是否已有原型 / demo", "zh-tw": "是否已有原型 / demo" },
|
|
215
|
+
onLabel: { en: "Exists", zh: "已有", "zh-tw": "已有" },
|
|
216
|
+
offLabel: { en: "Not yet", zh: "没有", "zh-tw": "沒有" },
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
kind: "select",
|
|
220
|
+
id: "sessionLength",
|
|
221
|
+
defaultValue: "45",
|
|
222
|
+
label: { en: "Session length", zh: "访谈时长", "zh-tw": "訪談時長" },
|
|
223
|
+
options: [
|
|
224
|
+
{ value: "30", label: { en: "30 min", zh: "30 分钟", "zh-tw": "30 分鐘" } },
|
|
225
|
+
{ value: "45", label: { en: "45 min", zh: "45 分钟", "zh-tw": "45 分鐘" } },
|
|
226
|
+
{ value: "60", label: { en: "60 min", zh: "60 分钟", "zh-tw": "60 分鐘" } },
|
|
227
|
+
],
|
|
228
|
+
},
|
|
229
|
+
],
|
|
230
|
+
/**
|
|
231
|
+
* direct 车道试点(2026-07-04):任务是"表单 brief → 固定 schema 提纲"的单次变换,
|
|
232
|
+
* 无需浏览/调研/文件 IO,符合 direct 判据(tool-package-pipeline.md)。
|
|
233
|
+
* 原 agent 车道契约($user-interview-guide + user-interview-guide.mjs 写回)保留在
|
|
234
|
+
* Skills-OL,如需回退将本块换回 lane: "agent" 即可。
|
|
235
|
+
*/
|
|
236
|
+
runtime: {
|
|
237
|
+
lane: "direct",
|
|
238
|
+
scene: "user_interview_guide",
|
|
239
|
+
system:
|
|
240
|
+
"You are Tomako's user interview research strategist. You design decision-oriented interview guides that ground every question in recent real behavior and honest evidence standards. You never invent user evidence and you surface gaps instead of pretending certainty.",
|
|
241
|
+
promptTemplate: `Design a user interview guide from this structured brief:
|
|
242
|
+
|
|
243
|
+
\`\`\`json
|
|
244
|
+
{{briefJson}}
|
|
245
|
+
\`\`\`
|
|
246
|
+
|
|
247
|
+
Quality requirements:
|
|
248
|
+
- currentRead must restate the brief faithfully: product, stage, interviewGoal, and coreDecision. Derive coreDecision from decisionToMake; if it is empty, infer the nearest product decision this research should support and record that inference in currentRead.assumptions.
|
|
249
|
+
- recommendedInterviewType must match interviewGoal and hasPrototype (discovery, problem validation, solution validation, usability, pricing, churn, or positioning interview).
|
|
250
|
+
- sessionFlow segments must add up to roughly sessionLength minutes; minutes is a string number per segment.
|
|
251
|
+
- Write 6-10 questions. Ground questions in recent real behavior before opinions or solutions. Tie every question to the product decision, a participant criterion, or an evidence signal. Each question needs purpose, listenFor, followUps, and one leading-question pattern to avoid.
|
|
252
|
+
- followUpTrees: 3-5 realistic answer triggers with concrete probes.
|
|
253
|
+
- strongSignals, weakSignals, and riskSignals must be checkable evidence standards a note-taker can apply during the session, not generic advice.
|
|
254
|
+
- If the brief lacks context, state honest assumptions, list the gaps in missingInfo, add human checks to reviewChecklist, and put concrete next actions in postInterviewHandoff.
|
|
255
|
+
- Set promptVersion to "direct-v1".`,
|
|
256
|
+
maxTokens: 8000,
|
|
257
|
+
},
|
|
258
|
+
resultSchema: userInterviewGuideResultSchema,
|
|
259
|
+
resultView: [
|
|
260
|
+
{
|
|
261
|
+
block: "keyValues",
|
|
262
|
+
title: { en: "Current read", zh: "当前判断", "zh-tw": "當前判斷" },
|
|
263
|
+
items: [
|
|
264
|
+
{ label: { en: "Product", zh: "产品", "zh-tw": "產品" }, path: "currentRead.product" },
|
|
265
|
+
{ label: { en: "Stage", zh: "阶段", "zh-tw": "階段" }, path: "currentRead.stage" },
|
|
266
|
+
{ label: { en: "Interview goal", zh: "访谈目的", "zh-tw": "訪談目的" }, path: "currentRead.interviewGoal" },
|
|
267
|
+
{ label: { en: "Core decision", zh: "核心决策", "zh-tw": "核心決策" }, path: "currentRead.coreDecision" },
|
|
268
|
+
{ label: { en: "Assumptions", zh: "假设", "zh-tw": "假設" }, path: "currentRead.assumptions" },
|
|
269
|
+
{
|
|
270
|
+
label: { en: "Recommended interview type", zh: "推荐访谈类型", "zh-tw": "推薦訪談類型" },
|
|
271
|
+
path: "recommendedInterviewType",
|
|
272
|
+
},
|
|
273
|
+
],
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
block: "bulletList",
|
|
277
|
+
title: { en: "Research objectives", zh: "研究目标", "zh-tw": "研究目標" },
|
|
278
|
+
path: "researchObjectives",
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
block: "bulletGroups",
|
|
282
|
+
title: { en: "Target participants", zh: "目标受访者", "zh-tw": "目標受訪者" },
|
|
283
|
+
columns: [
|
|
284
|
+
{
|
|
285
|
+
label: { en: "Recruit", zh: "招募条件", "zh-tw": "招募條件" },
|
|
286
|
+
path: "participantCriteria",
|
|
287
|
+
tone: "positive",
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
label: { en: "Exclude", zh: "排除条件", "zh-tw": "排除條件" },
|
|
291
|
+
path: "exclusionCriteria",
|
|
292
|
+
tone: "risk",
|
|
293
|
+
},
|
|
294
|
+
],
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
block: "cardList",
|
|
298
|
+
title: { en: "Session flow", zh: "访谈流程", "zh-tw": "訪談流程" },
|
|
299
|
+
path: "sessionFlow",
|
|
300
|
+
layout: "grid",
|
|
301
|
+
card: {
|
|
302
|
+
titleField: "label",
|
|
303
|
+
metaField: "minutes",
|
|
304
|
+
metaSuffix: { en: " min", zh: " 分钟", "zh-tw": " 分鐘" },
|
|
305
|
+
body: { field: "goal" },
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
block: "cardList",
|
|
310
|
+
title: { en: "Interview questions", zh: "访谈问题", "zh-tw": "訪談問題" },
|
|
311
|
+
path: "questions",
|
|
312
|
+
card: {
|
|
313
|
+
titleField: "question",
|
|
314
|
+
body: { field: "purpose", label: { en: "Purpose", zh: "目的", "zh-tw": "目的" } },
|
|
315
|
+
lists: [
|
|
316
|
+
{ field: "listenFor", label: { en: "Listen for", zh: "重点听", "zh-tw": "重點聽" } },
|
|
317
|
+
{ field: "followUps", label: { en: "Follow-ups", zh: "追问", "zh-tw": "追問" } },
|
|
318
|
+
],
|
|
319
|
+
footer: { field: "avoid", label: { en: "Avoid", zh: "避免", "zh-tw": "避免" } },
|
|
320
|
+
},
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
block: "cardList",
|
|
324
|
+
title: { en: "Branching probes", zh: "分支追问树", "zh-tw": "分支追問樹" },
|
|
325
|
+
path: "followUpTrees",
|
|
326
|
+
card: {
|
|
327
|
+
titleField: "trigger",
|
|
328
|
+
lists: [{ field: "probes", label: { en: "Probes", zh: "追问", "zh-tw": "追問" } }],
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
block: "bulletGroups",
|
|
333
|
+
title: { en: "Signal watchlist", zh: "重点观察信号", "zh-tw": "重點觀察信號" },
|
|
334
|
+
columns: [
|
|
335
|
+
{ label: { en: "Strong signals", zh: "强信号", "zh-tw": "強信號" }, path: "strongSignals", tone: "positive" },
|
|
336
|
+
{ label: { en: "Weak signals", zh: "弱信号", "zh-tw": "弱信號" }, path: "weakSignals" },
|
|
337
|
+
{ label: { en: "Risk signals", zh: "风险信号", "zh-tw": "風險信號" }, path: "riskSignals", tone: "risk" },
|
|
338
|
+
],
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
block: "bulletList",
|
|
342
|
+
title: { en: "Missing information", zh: "缺失信息", "zh-tw": "缺失資訊" },
|
|
343
|
+
path: "missingInfo",
|
|
344
|
+
tone: "risk",
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
block: "bulletList",
|
|
348
|
+
title: { en: "Human review checklist", zh: "人工复核清单", "zh-tw": "人工複核清單" },
|
|
349
|
+
path: "reviewChecklist",
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
block: "bulletList",
|
|
353
|
+
title: { en: "Post-interview handoff", zh: "访谈后交接", "zh-tw": "訪談後交接" },
|
|
354
|
+
path: "postInterviewHandoff",
|
|
355
|
+
},
|
|
356
|
+
],
|
|
357
|
+
widget: {
|
|
358
|
+
formTitle: { en: "Interview context", zh: "访谈背景", "zh-tw": "訪談背景" },
|
|
359
|
+
formHint: {
|
|
360
|
+
en: "Describe the product, stage, and research goal so the output can center on your decision.",
|
|
361
|
+
zh: "写清产品、阶段和访谈目的,输出会围绕你的产品决策组织。",
|
|
362
|
+
"zh-tw": "寫清產品、階段和訪談目的,輸出會圍繞你的產品決策組織。",
|
|
363
|
+
},
|
|
364
|
+
submitLabel: { en: "Generate interview guide", zh: "生成访谈提纲", "zh-tw": "生成訪談提綱" },
|
|
365
|
+
pendingTitle: {
|
|
366
|
+
en: "Preparing the interview guide",
|
|
367
|
+
zh: "正在准备访谈提纲",
|
|
368
|
+
"zh-tw": "正在準備訪談提綱",
|
|
369
|
+
},
|
|
370
|
+
pendingHint: {
|
|
371
|
+
en: "Tomako will understand the research goal first, then return a reviewable structured result. Keep this page open.",
|
|
372
|
+
zh: "Tomako 会先理解研究目标,再生成可复核的结构化结果。请保持页面打开。",
|
|
373
|
+
"zh-tw": "Tomako 會先理解研究目標,再生成可複核的結構化結果。請保持頁面打開。",
|
|
374
|
+
},
|
|
375
|
+
errorOverrides: {
|
|
376
|
+
validation: {
|
|
377
|
+
title: { en: "Add real context", zh: "请补充真实背景", "zh-tw": "請補充真實背景" },
|
|
378
|
+
body: {
|
|
379
|
+
en: "The product description and participant criteria need to be specific. Test text, numbers, and vague filler are blocked.",
|
|
380
|
+
zh: "产品描述和目标受访者需要足够具体,不能只填测试文本、数字或空泛描述。",
|
|
381
|
+
"zh-tw": "產品描述和目標受訪者需要足夠具體,不能只填測試文字、數字或空泛描述。",
|
|
382
|
+
},
|
|
383
|
+
},
|
|
384
|
+
},
|
|
385
|
+
},
|
|
386
|
+
page: {
|
|
387
|
+
workspace: {
|
|
388
|
+
heading: {
|
|
389
|
+
en: "Design the interview as a product decision test",
|
|
390
|
+
zh: "先把访谈设计成一次产品决策实验",
|
|
391
|
+
"zh-tw": "生成一套可複核的用戶訪談提綱",
|
|
392
|
+
},
|
|
393
|
+
hint: {
|
|
394
|
+
en: "Enter the product context, current stage, decision to validate, and target participants. Tomako turns that into an executable guide: who to recruit, how to open, what to ask, how to probe, and what counts as strong evidence.",
|
|
395
|
+
zh: "输入产品背景、当前阶段、要验证的判断和目标受访者,Tomako 会把它整理成可执行的访谈提纲:招募谁、怎么开场、问什么、追问什么、哪些回答才算强信号。",
|
|
396
|
+
"zh-tw":
|
|
397
|
+
"輸入產品背景、訪談目標和目標受訪者,Tomako 會生成結構化訪談提綱,並把缺失資訊、假設和人工複核點一起寫出來。",
|
|
398
|
+
},
|
|
399
|
+
badge: { en: "Before the interview", zh: "访谈前准备", "zh-tw": "訪談前準備" },
|
|
400
|
+
},
|
|
401
|
+
sections: [
|
|
402
|
+
{
|
|
403
|
+
kind: "cards",
|
|
404
|
+
heading: {
|
|
405
|
+
en: "What you can use immediately",
|
|
406
|
+
zh: "生成后可以直接拿去做什么",
|
|
407
|
+
"zh-tw": "你會得到什麼",
|
|
408
|
+
},
|
|
409
|
+
items: [
|
|
410
|
+
{
|
|
411
|
+
title: { en: "Interview strategy", zh: "访谈策略", "zh-tw": "訪談策略" },
|
|
412
|
+
body: {
|
|
413
|
+
en: "Choose discovery, problem validation, solution validation, pricing, churn, or positioning before writing questions.",
|
|
414
|
+
zh: "先判断应该做探索、问题验证、方案验证、定价、流失还是定位访谈,避免直接套通用问题清单。",
|
|
415
|
+
"zh-tw": "先判斷應該做探索、問題驗證、方案驗證、定價、流失還是定位訪談,避免直接套通用問題清單。",
|
|
416
|
+
},
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
title: { en: "Participant criteria", zh: "受访者筛选条件", "zh-tw": "受訪者篩選條件" },
|
|
420
|
+
body: {
|
|
421
|
+
en: "Turn 'talk to users' into concrete screener criteria that prioritize people with recent real behavior.",
|
|
422
|
+
zh: "把“找用户聊聊”改成可执行的筛选条件,优先找近期发生过相关行为、能讲具体案例的人。",
|
|
423
|
+
"zh-tw": "把“找用戶聊聊”改成可執行的篩選條件,優先找近期發生過相關行為、能講具體案例的人。",
|
|
424
|
+
},
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
title: {
|
|
428
|
+
en: "Questions, purpose, and probes",
|
|
429
|
+
zh: "问题、目的和追问",
|
|
430
|
+
"zh-tw": "問題、目的和追問",
|
|
431
|
+
},
|
|
432
|
+
body: {
|
|
433
|
+
en: "Each question explains why it exists, what to listen for, how to probe, and which leading behavior to avoid.",
|
|
434
|
+
zh: "每个问题都会说明为什么问、重点听什么、怎样继续追问,以及哪些诱导式问法应该避免。",
|
|
435
|
+
"zh-tw": "每個問題都會說明為什麼問、重點聽什麼、怎樣繼續追問,以及哪些誘導式問法應該避免。",
|
|
436
|
+
},
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
title: {
|
|
440
|
+
en: "Evidence signals and review checks",
|
|
441
|
+
zh: "证据信号和复核清单",
|
|
442
|
+
"zh-tw": "證據信號和複核清單",
|
|
443
|
+
},
|
|
444
|
+
body: {
|
|
445
|
+
en: "Separate strong signals, weak feedback, risks, missing information, and post-interview handoff actions.",
|
|
446
|
+
zh: "把强信号、弱反馈、风险信号、缺失信息和访谈后交接动作拆开,方便团队复盘。",
|
|
447
|
+
"zh-tw": "把強信號、弱反饋、風險信號、缺失資訊和訪談後交接動作拆開,方便團隊覆盤。",
|
|
448
|
+
},
|
|
449
|
+
},
|
|
450
|
+
],
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
kind: "bullets",
|
|
454
|
+
heading: {
|
|
455
|
+
en: "Turn “talk to users” into an executable interview",
|
|
456
|
+
zh: "从“找用户聊聊”变成可执行访谈",
|
|
457
|
+
"zh-tw": "適合哪些場景",
|
|
458
|
+
},
|
|
459
|
+
image: {
|
|
460
|
+
src: "/tools/user-interview-guide-generator-support-pseo.webp",
|
|
461
|
+
alt: {
|
|
462
|
+
en: "Illustration of a researcher choosing target participants and recent behavior signals for interview recruiting.",
|
|
463
|
+
zh: "研究者根据目标受访者和近期行为设计访谈招募条件的插画。",
|
|
464
|
+
"zh-tw": "用戶訪談生成器支持場景示意圖,展示目標受訪者、近期行為和產品決策。",
|
|
465
|
+
},
|
|
466
|
+
side: "right",
|
|
467
|
+
wide: true,
|
|
468
|
+
},
|
|
469
|
+
groups: [
|
|
470
|
+
{
|
|
471
|
+
items: {
|
|
472
|
+
en: [
|
|
473
|
+
"You need to validate whether a pain is real and strong before building a feature or MVP.",
|
|
474
|
+
"You want interviews to serve a product decision instead of collecting loose opinions.",
|
|
475
|
+
"You already have a prototype, demo, or page and need to learn when users would actually use it.",
|
|
476
|
+
"You need a guide that another teammate can run with clear flow, probes, and evidence signals.",
|
|
477
|
+
],
|
|
478
|
+
zh: [
|
|
479
|
+
"你要在做功能或 MVP 前验证痛点是否真实、是否够强。",
|
|
480
|
+
"你需要围绕一个产品决策设计访谈,而不是收集泛泛意见。",
|
|
481
|
+
"你已经有原型、demo 或页面,想知道用户在什么条件下会使用。",
|
|
482
|
+
"你要把访谈交给团队成员执行,需要清楚的流程、追问和证据信号。",
|
|
483
|
+
],
|
|
484
|
+
"zh-tw": [
|
|
485
|
+
"你要在做功能或 MVP 前驗證痛點是否真實、是否夠強。",
|
|
486
|
+
"你需要圍繞一個產品決策設計訪談,而不是收集泛泛意見。",
|
|
487
|
+
"你已經有原型、demo 或頁面,想知道用戶在什麼條件下會使用。",
|
|
488
|
+
"你要把訪談交給團隊成員執行,需要清楚的流程、追問和證據信號。",
|
|
489
|
+
],
|
|
490
|
+
},
|
|
491
|
+
},
|
|
492
|
+
],
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
kind: "bullets",
|
|
496
|
+
heading: {
|
|
497
|
+
en: "When not to generate a guide yet",
|
|
498
|
+
zh: "什么时候先不要生成提纲",
|
|
499
|
+
"zh-tw": "不適合哪些場景",
|
|
500
|
+
},
|
|
501
|
+
image: {
|
|
502
|
+
src: "/tools/user-interview-guide-generator-failure-pseo.webp",
|
|
503
|
+
alt: {
|
|
504
|
+
en: "Illustration of a vague research question being clarified into concrete interview goals and probes.",
|
|
505
|
+
zh: "把模糊研究问题澄清成具体访谈目标和追问的插画。",
|
|
506
|
+
"zh-tw": "用戶訪談生成器失敗恢復示意圖,展示任務號、寫回校驗和人工複核。",
|
|
507
|
+
},
|
|
508
|
+
side: "left",
|
|
509
|
+
wide: true,
|
|
510
|
+
},
|
|
511
|
+
groups: [
|
|
512
|
+
{
|
|
513
|
+
items: {
|
|
514
|
+
en: [
|
|
515
|
+
"It does not replace real interviews, behavior data, conversion tests, or paid experiments.",
|
|
516
|
+
"It cannot decide that a product is worth building from one vague idea.",
|
|
517
|
+
"It is not suitable for medical, legal, financial, or other regulated research without professional review.",
|
|
518
|
+
"If the input is test text, numbers, or vague filler, the page blocks it or marks missing context.",
|
|
519
|
+
],
|
|
520
|
+
zh: [
|
|
521
|
+
"不能替代真实访谈、行为数据、转化实验或付款测试。",
|
|
522
|
+
"不能根据一句模糊想法直接判断产品一定值得做。",
|
|
523
|
+
"不适合处理医疗、法律、金融等需要专业合规审查的访谈设计。",
|
|
524
|
+
"如果输入只有测试文本、数字或空泛描述,结果会被阻止或标记为需要补充信息。",
|
|
525
|
+
],
|
|
526
|
+
"zh-tw": [
|
|
527
|
+
"不能替代真實訪談、行為數據、轉化實驗或付款測試。",
|
|
528
|
+
"不能根據一句模糊想法直接判斷產品一定值得做。",
|
|
529
|
+
"不適合處理醫療、法律、金融等需要專業合規審查的訪談設計。",
|
|
530
|
+
"如果輸入只有測試文字、數字或空泛描述,結果會被阻止或標記為需要補充資訊。",
|
|
531
|
+
],
|
|
532
|
+
},
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
title: {
|
|
536
|
+
en: "How thin context is handled",
|
|
537
|
+
zh: "信息不足时怎么处理",
|
|
538
|
+
"zh-tw": "失敗和恢復方式",
|
|
539
|
+
},
|
|
540
|
+
items: {
|
|
541
|
+
en: [
|
|
542
|
+
"If task submission fails, the page keeps your input so you can add context and retry.",
|
|
543
|
+
"If the backend does not return a structured result, the page shows the task id for support debugging.",
|
|
544
|
+
"If the backend returns a result for another tool or the structure does not match, the page will not display a fake success state.",
|
|
545
|
+
"The generated guide still needs human review for sensitive questions, recruit scope, and leading phrasing.",
|
|
546
|
+
],
|
|
547
|
+
zh: [
|
|
548
|
+
"如果任务提交失败,页面会保留输入内容,补充上下文后可以重新生成。",
|
|
549
|
+
"如果后台没有返回结构化结果,页面会显示任务号,方便排查生成链路。",
|
|
550
|
+
"如果返回结果属于其他工具或结构不匹配,页面不会展示伪成功结果。",
|
|
551
|
+
"生成结果仍需人工检查敏感问题、受访者范围和是否过度诱导。",
|
|
552
|
+
],
|
|
553
|
+
"zh-tw": [
|
|
554
|
+
"如果任務提交失敗,頁面會保留輸入內容,補充上下文後可以重新生成。",
|
|
555
|
+
"如果 Agent 沒有寫回結構化結果,頁面會顯示任務號,方便排查寫回鏈路。",
|
|
556
|
+
"如果返回結果類型或 schema 不匹配,頁面不會展示偽成功結果。",
|
|
557
|
+
"生成結果仍需人工檢查敏感問題、受訪者範圍和是否過度誘導。",
|
|
558
|
+
],
|
|
559
|
+
},
|
|
560
|
+
},
|
|
561
|
+
],
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
kind: "bullets",
|
|
565
|
+
heading: {
|
|
566
|
+
en: "How to use the guide during the interview",
|
|
567
|
+
zh: "访谈当天怎么用这份提纲",
|
|
568
|
+
"zh-tw": "如何使用生成結果",
|
|
569
|
+
},
|
|
570
|
+
image: {
|
|
571
|
+
src: "/tools/user-interview-guide-generator-result-use-pseo.webp",
|
|
572
|
+
alt: {
|
|
573
|
+
en: "Illustration of a researcher using an interview guide during a live customer conversation.",
|
|
574
|
+
zh: "研究者在现场访谈中使用提纲追问真实经历的插画。",
|
|
575
|
+
"zh-tw": "用戶訪談結果使用示意圖,展示從訪談提綱到記錄和洞察報告的鏈路。",
|
|
576
|
+
},
|
|
577
|
+
side: "right",
|
|
578
|
+
wide: true,
|
|
579
|
+
},
|
|
580
|
+
groups: [
|
|
581
|
+
{
|
|
582
|
+
items: {
|
|
583
|
+
en: [
|
|
584
|
+
"First check whether the research objective maps to a near-term product decision.",
|
|
585
|
+
"Use the participant criteria as a screener and filter out people without recent real experience.",
|
|
586
|
+
"During the interview, probe concrete behavior before explaining the solution.",
|
|
587
|
+
"After the interview, send the transcript to the record generator, then synthesize multiple records into insights.",
|
|
588
|
+
],
|
|
589
|
+
zh: [
|
|
590
|
+
"先检查研究目标是否真的对应一个近期要做的产品决策。",
|
|
591
|
+
"用受访者条件写 screener,过滤掉没有最近真实经历的人。",
|
|
592
|
+
"访谈中按真实经历追问,不要急着解释你的方案。",
|
|
593
|
+
"访谈后把转写文本交给访谈记录生成器,再把多份记录合成洞察报告。",
|
|
594
|
+
],
|
|
595
|
+
"zh-tw": [
|
|
596
|
+
"先檢查研究目標是否真的對應一個近期要做的產品決策。",
|
|
597
|
+
"用受訪者條件寫 screener,過濾掉沒有最近真實經歷的人。",
|
|
598
|
+
"訪談中按真實經歷追問,不要急著解釋你的方案。",
|
|
599
|
+
"訪談後把逐字稿交給訪談記錄生成器,再把多份記錄合成洞察報告。",
|
|
600
|
+
],
|
|
601
|
+
},
|
|
602
|
+
},
|
|
603
|
+
],
|
|
604
|
+
},
|
|
605
|
+
{
|
|
606
|
+
kind: "cards",
|
|
607
|
+
heading: {
|
|
608
|
+
en: "Why this is not a generic interview template",
|
|
609
|
+
zh: "为什么不是通用访谈模板",
|
|
610
|
+
"zh-tw": "為什麼用 Tomako 做這一步",
|
|
611
|
+
},
|
|
612
|
+
items: [
|
|
613
|
+
{
|
|
614
|
+
title: {
|
|
615
|
+
en: "Built around decisions, not documents",
|
|
616
|
+
zh: "面向决策,而不是面向文档",
|
|
617
|
+
"zh-tw": "面向決策,而不是面向文檔",
|
|
618
|
+
},
|
|
619
|
+
body: {
|
|
620
|
+
en: "The result ties questions, probes, signals, and handoff actions back to the product decision you need to make.",
|
|
621
|
+
zh: "结果会把问题、追问、信号和交接动作绑定到产品决策,减少“聊完但不知道怎么判断”的情况。",
|
|
622
|
+
"zh-tw": "結果會把問題、追問、信號和交接動作綁定到產品決策,減少“聊完但不知道怎麼判斷”的情況。",
|
|
623
|
+
},
|
|
624
|
+
},
|
|
625
|
+
{
|
|
626
|
+
title: { en: "Clear failure boundaries", zh: "有明确的失败边界", "zh-tw": "有明確的失敗邊界" },
|
|
627
|
+
body: {
|
|
628
|
+
en: "The page exposes missing information and review checks, and it does not pass off a local template as a generated result.",
|
|
629
|
+
zh: "页面会暴露缺失信息和复核点;拿不到合法结构化结果时不会把本地模板冒充为生成结果。",
|
|
630
|
+
"zh-tw": "頁面會暴露缺失資訊和複核點;拿不到合法結構化結果時不會把本地模板冒充為生成結果。",
|
|
631
|
+
},
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
title: {
|
|
635
|
+
en: "Connects to the research workflow",
|
|
636
|
+
zh: "能接到后续研究链路",
|
|
637
|
+
"zh-tw": "能接到後續研究鏈路",
|
|
638
|
+
},
|
|
639
|
+
body: {
|
|
640
|
+
en: "The same interview output can feed structured notes and multi-interview insight reports.",
|
|
641
|
+
zh: "同一套访谈结果可以继续进入记录整理和多场访谈洞察报告,减少手动重排证据的成本。",
|
|
642
|
+
"zh-tw": "同一套訪談結果可以繼續進入記錄整理和多場訪談洞察報告,減少手動重排證據的成本。",
|
|
643
|
+
},
|
|
644
|
+
},
|
|
645
|
+
{
|
|
646
|
+
title: { en: "Useful for small teams", zh: "适合小团队快速迭代", "zh-tw": "適合小團隊快速迭代" },
|
|
647
|
+
body: {
|
|
648
|
+
en: "Indie builders, PMs, and founders can get an executable draft, then calibrate it with one or two pilot interviews.",
|
|
649
|
+
zh: "独立开发者、PM 和创始人可以先拿到可执行草案,再用 1-2 场试访谈校准。",
|
|
650
|
+
"zh-tw": "獨立開發者、PM 和創始人可以先拿到可執行草案,再用 1-2 場試訪談校準。",
|
|
651
|
+
},
|
|
652
|
+
},
|
|
653
|
+
],
|
|
654
|
+
},
|
|
655
|
+
{
|
|
656
|
+
kind: "bullets",
|
|
657
|
+
heading: {
|
|
658
|
+
en: "What a good interview guide should protect",
|
|
659
|
+
zh: "好访谈提纲应该保护什么",
|
|
660
|
+
"zh-tw": "好工具的判斷標準",
|
|
661
|
+
},
|
|
662
|
+
image: {
|
|
663
|
+
src: "/tools/user-interview-guide-generator-standard-pseo.webp",
|
|
664
|
+
alt: {
|
|
665
|
+
en: "Illustration of a branching probe tree connected to evidence signals and product decision criteria.",
|
|
666
|
+
zh: "访谈追问树连接到证据信号和产品决策标准的插画。",
|
|
667
|
+
"zh-tw": "好訪談工具標準示意圖,展示問題目的、追問和證據等級。",
|
|
668
|
+
},
|
|
669
|
+
side: "left",
|
|
670
|
+
wide: true,
|
|
671
|
+
},
|
|
672
|
+
groups: [
|
|
673
|
+
{
|
|
674
|
+
items: {
|
|
675
|
+
en: [
|
|
676
|
+
"When input is thin, the tool should expose the gap instead of generating confident filler.",
|
|
677
|
+
"The output should support recruiting, interviewing, note-taking, and review, not just advice.",
|
|
678
|
+
"Every question should have a purpose, probes, and an anti-leading reminder.",
|
|
679
|
+
"The result must be copyable, reviewable, handoff-ready, and tied to a task id for debugging.",
|
|
680
|
+
],
|
|
681
|
+
zh: [
|
|
682
|
+
"输入不足时应该指出缺口,而不是生成看似完整的答案。",
|
|
683
|
+
"输出要能直接支持招募、访谈、记录和复盘,不只是一段建议。",
|
|
684
|
+
"每个问题都应该有目的、追问和反诱导提醒。",
|
|
685
|
+
"结果必须能复制、复核、交接,并保留任务号用于排查。",
|
|
686
|
+
],
|
|
687
|
+
"zh-tw": [
|
|
688
|
+
"輸入不足時應該指出缺口,而不是生成看似完整的答案。",
|
|
689
|
+
"輸出要能直接支持招募、訪談、記錄和覆盤,不只是一段建議。",
|
|
690
|
+
"每個問題都應該有目的、追問和反誘導提醒。",
|
|
691
|
+
"結果必須能複製、複核、交接,並保留任務號用於排查。",
|
|
692
|
+
],
|
|
693
|
+
},
|
|
694
|
+
},
|
|
695
|
+
],
|
|
696
|
+
},
|
|
697
|
+
],
|
|
698
|
+
faq: [
|
|
699
|
+
{
|
|
700
|
+
question: {
|
|
701
|
+
en: "Will this tell me whether the product is worth building?",
|
|
702
|
+
zh: "这个工具会直接告诉我产品是否值得做吗?",
|
|
703
|
+
"zh-tw": "這個工具會直接告訴我產品是否值得做嗎?",
|
|
704
|
+
},
|
|
705
|
+
answer: {
|
|
706
|
+
en: "No. It designs interviews that produce better evidence. The build decision still needs transcripts, behavior data, competition, technical cost, and real conversion tests.",
|
|
707
|
+
zh: "不会。它帮助你设计能获得证据的访谈。是否值得做还要结合访谈记录、行为数据、竞争、技术成本和真实转化实验。",
|
|
708
|
+
"zh-tw": "不會。它幫助你設計能獲得證據的訪談。是否值得做還要結合訪談記錄、行為數據、競爭、技術成本和真實轉化實驗。",
|
|
709
|
+
},
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
question: {
|
|
713
|
+
en: "Can I ask whether users would pay?",
|
|
714
|
+
zh: "可以直接问用户愿不愿意付费吗?",
|
|
715
|
+
"zh-tw": "可以直接問用戶願不願意付費嗎?",
|
|
716
|
+
},
|
|
717
|
+
answer: {
|
|
718
|
+
en: "Yes, but do not rely on stated intent alone. Past spending, current workaround, cost of the problem, and willingness to enter a next-step test matter more.",
|
|
719
|
+
zh: "可以问,但不能只看口头意愿。更重要的是过去是否付过钱、现在怎么解决、问题造成多大代价,以及是否愿意进入下一步测试。",
|
|
720
|
+
"zh-tw": "可以問,但不能只看口頭意願。更重要的是過去是否付過錢、現在怎麼解決、問題造成多大代價,以及是否願意進入下一步測試。",
|
|
721
|
+
},
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
question: {
|
|
725
|
+
en: "Can I interview users without a prototype?",
|
|
726
|
+
zh: "没有原型也能访谈吗?",
|
|
727
|
+
"zh-tw": "沒有原型也能訪談嗎?",
|
|
728
|
+
},
|
|
729
|
+
answer: {
|
|
730
|
+
en: "Yes. Without a prototype, discovery or problem validation is usually stronger. Reconstruct recent behavior before testing solution reactions.",
|
|
731
|
+
zh: "可以。没有原型时更适合做探索或问题验证,先还原用户最近一次真实经历,再决定是否值得做方案验证。",
|
|
732
|
+
"zh-tw": "可以。沒有原型時更適合做探索或問題驗證,先還原用戶最近一次真實經歷,再決定是否值得做方案驗證。",
|
|
733
|
+
},
|
|
734
|
+
},
|
|
735
|
+
{
|
|
736
|
+
question: {
|
|
737
|
+
en: "Why does the generated guide still need review?",
|
|
738
|
+
zh: "生成结果为什么还要人工复核?",
|
|
739
|
+
"zh-tw": "生成結果為什麼還要人工複核?",
|
|
740
|
+
},
|
|
741
|
+
answer: {
|
|
742
|
+
en: "Interviews affect recruiting, privacy, sensitive questions, and product judgment. Tomako drafts a structured guide, but your team still needs to check fit and compliance.",
|
|
743
|
+
zh: "访谈会影响招募、隐私、敏感问题和产品判断。Tomako 会生成结构化草案,但团队仍要确认问题是否合规、是否适合目标受访者。",
|
|
744
|
+
"zh-tw": "訪談會影響招募、隱私、敏感問題和產品判斷。Tomako 會生成結構化草案,但團隊仍要確認問題是否合規、是否適合目標受訪者。",
|
|
745
|
+
},
|
|
746
|
+
},
|
|
747
|
+
],
|
|
748
|
+
cta: {
|
|
749
|
+
hint: {
|
|
750
|
+
en: "After the interview, turn the transcript into a structured record, then synthesize multiple records into insights.",
|
|
751
|
+
zh: "完成访谈后,把转写文本整理成结构化记录,再进入多场访谈洞察分析。",
|
|
752
|
+
"zh-tw": "完成訪談後,把逐字稿整理成結構化記錄,再進入多場訪談洞察分析。",
|
|
753
|
+
},
|
|
754
|
+
primary: {
|
|
755
|
+
href: "/tools/user-interview-record-generator",
|
|
756
|
+
label: { en: "Structure interview notes", zh: "整理访谈记录", "zh-tw": "整理訪談記錄" },
|
|
757
|
+
},
|
|
758
|
+
secondary: {
|
|
759
|
+
href: "/tools",
|
|
760
|
+
label: { en: "Back to all tools", zh: "返回全部工具", "zh-tw": "返回全部工具" },
|
|
761
|
+
},
|
|
762
|
+
},
|
|
763
|
+
},
|
|
764
|
+
assets: {
|
|
765
|
+
hero: {
|
|
766
|
+
src: "/tools/user-interview-guide-generator-hero-pseo.webp",
|
|
767
|
+
alt: {
|
|
768
|
+
en: "Illustration of a researcher preparing a product interview guide with a whiteboard, notebook, and evidence markers.",
|
|
769
|
+
zh: "研究者在白板和笔记本前准备产品用户访谈提纲的插画。",
|
|
770
|
+
"zh-tw": "用戶訪談提綱生成器界面,展示從研究目標到訪談問題和證據信號的流程。",
|
|
771
|
+
},
|
|
772
|
+
},
|
|
773
|
+
},
|
|
774
|
+
};
|