product-playbook 1.0.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/LICENSE +21 -0
- package/README.es.md +518 -0
- package/README.ja.md +519 -0
- package/README.ko.md +518 -0
- package/README.md +520 -0
- package/README.zh-CN.md +518 -0
- package/README.zh-TW.md +518 -0
- package/SKILL.md +244 -0
- package/commands/product-build.md +13 -0
- package/commands/product-dev.md +21 -0
- package/commands/product-full.md +13 -0
- package/commands/product-prd.md +14 -0
- package/commands/product-quick.md +13 -0
- package/commands/product-report.md +12 -0
- package/commands/product-revision.md +13 -0
- package/i18n/en/SKILL.md +245 -0
- package/i18n/en/commands/product-build.md +13 -0
- package/i18n/en/commands/product-dev.md +21 -0
- package/i18n/en/commands/product-full.md +13 -0
- package/i18n/en/commands/product-prd.md +14 -0
- package/i18n/en/commands/product-quick.md +13 -0
- package/i18n/en/commands/product-report.md +12 -0
- package/i18n/en/commands/product-revision.md +13 -0
- package/i18n/en/references/00-opportunity-check.md +44 -0
- package/i18n/en/references/01-strategy.md +90 -0
- package/i18n/en/references/02a-persona.md +57 -0
- package/i18n/en/references/02b-jtbd.md +125 -0
- package/i18n/en/references/02c-ost-journey.md +65 -0
- package/i18n/en/references/03-define.md +118 -0
- package/i18n/en/references/04a-prfaq.md +112 -0
- package/i18n/en/references/04b-solutions.md +269 -0
- package/i18n/en/references/04c-mvp.md +21 -0
- package/i18n/en/references/05a-northstar-aha.md +93 -0
- package/i18n/en/references/05b-pmf-gtm.md +102 -0
- package/i18n/en/references/05c-validation-spec.md +117 -0
- package/i18n/en/references/06-html-report.md +128 -0
- package/i18n/en/references/07a-handoff-core.md +152 -0
- package/i18n/en/references/07b-tasks-tickets.md +215 -0
- package/i18n/en/references/07c-architecture-setup.md +197 -0
- package/i18n/en/references/08-security-checklist.md +221 -0
- package/i18n/en/references/rules-build.md +152 -0
- package/i18n/en/references/rules-change-propagation.md +74 -0
- package/i18n/en/references/rules-commands.md +98 -0
- package/i18n/en/references/rules-context.md +291 -0
- package/i18n/en/references/rules-custom.md +63 -0
- package/i18n/en/references/rules-document-tools.md +126 -0
- package/i18n/en/references/rules-end-of-flow.md +150 -0
- package/i18n/en/references/rules-export-document.md +346 -0
- package/i18n/en/references/rules-file-integration.md +65 -0
- package/i18n/en/references/rules-full.md +66 -0
- package/i18n/en/references/rules-import-document.md +261 -0
- package/i18n/en/references/rules-product-type.md +14 -0
- package/i18n/en/references/rules-progress.md +60 -0
- package/i18n/en/references/rules-quick.md +29 -0
- package/i18n/en/references/rules-revision.md +64 -0
- package/i18n/es/SKILL.md +245 -0
- package/i18n/es/commands/product-build.md +13 -0
- package/i18n/es/commands/product-dev.md +21 -0
- package/i18n/es/commands/product-full.md +13 -0
- package/i18n/es/commands/product-prd.md +14 -0
- package/i18n/es/commands/product-quick.md +13 -0
- package/i18n/es/commands/product-report.md +12 -0
- package/i18n/es/commands/product-revision.md +13 -0
- package/i18n/es/references/00-opportunity-check.md +44 -0
- package/i18n/es/references/01-strategy.md +90 -0
- package/i18n/es/references/02a-persona.md +57 -0
- package/i18n/es/references/02b-jtbd.md +125 -0
- package/i18n/es/references/02c-ost-journey.md +65 -0
- package/i18n/es/references/03-define.md +118 -0
- package/i18n/es/references/04a-prfaq.md +114 -0
- package/i18n/es/references/04b-solutions.md +269 -0
- package/i18n/es/references/04c-mvp.md +21 -0
- package/i18n/es/references/05a-northstar-aha.md +93 -0
- package/i18n/es/references/05b-pmf-gtm.md +102 -0
- package/i18n/es/references/05c-validation-spec.md +117 -0
- package/i18n/es/references/06-html-report.md +138 -0
- package/i18n/es/references/07a-handoff-core.md +152 -0
- package/i18n/es/references/07b-tasks-tickets.md +215 -0
- package/i18n/es/references/07c-architecture-setup.md +197 -0
- package/i18n/es/references/08-security-checklist.md +221 -0
- package/i18n/es/references/rules-build.md +152 -0
- package/i18n/es/references/rules-change-propagation.md +74 -0
- package/i18n/es/references/rules-commands.md +98 -0
- package/i18n/es/references/rules-context.md +291 -0
- package/i18n/es/references/rules-custom.md +63 -0
- package/i18n/es/references/rules-document-tools.md +126 -0
- package/i18n/es/references/rules-end-of-flow.md +150 -0
- package/i18n/es/references/rules-export-document.md +346 -0
- package/i18n/es/references/rules-file-integration.md +65 -0
- package/i18n/es/references/rules-full.md +66 -0
- package/i18n/es/references/rules-import-document.md +261 -0
- package/i18n/es/references/rules-product-type.md +14 -0
- package/i18n/es/references/rules-progress.md +60 -0
- package/i18n/es/references/rules-quick.md +29 -0
- package/i18n/es/references/rules-revision.md +64 -0
- package/i18n/ja/SKILL.md +245 -0
- package/i18n/ja/commands/product-build.md +13 -0
- package/i18n/ja/commands/product-dev.md +21 -0
- package/i18n/ja/commands/product-full.md +13 -0
- package/i18n/ja/commands/product-prd.md +14 -0
- package/i18n/ja/commands/product-quick.md +13 -0
- package/i18n/ja/commands/product-report.md +12 -0
- package/i18n/ja/commands/product-revision.md +13 -0
- package/i18n/ja/references/00-opportunity-check.md +44 -0
- package/i18n/ja/references/01-strategy.md +90 -0
- package/i18n/ja/references/02a-persona.md +57 -0
- package/i18n/ja/references/02b-jtbd.md +125 -0
- package/i18n/ja/references/02c-ost-journey.md +65 -0
- package/i18n/ja/references/03-define.md +118 -0
- package/i18n/ja/references/04a-prfaq.md +111 -0
- package/i18n/ja/references/04b-solutions.md +269 -0
- package/i18n/ja/references/04c-mvp.md +21 -0
- package/i18n/ja/references/05a-northstar-aha.md +93 -0
- package/i18n/ja/references/05b-pmf-gtm.md +102 -0
- package/i18n/ja/references/05c-validation-spec.md +117 -0
- package/i18n/ja/references/06-html-report.md +126 -0
- package/i18n/ja/references/07a-handoff-core.md +152 -0
- package/i18n/ja/references/07b-tasks-tickets.md +215 -0
- package/i18n/ja/references/07c-architecture-setup.md +197 -0
- package/i18n/ja/references/08-security-checklist.md +221 -0
- package/i18n/ja/references/rules-build.md +152 -0
- package/i18n/ja/references/rules-change-propagation.md +74 -0
- package/i18n/ja/references/rules-commands.md +98 -0
- package/i18n/ja/references/rules-context.md +291 -0
- package/i18n/ja/references/rules-custom.md +63 -0
- package/i18n/ja/references/rules-document-tools.md +126 -0
- package/i18n/ja/references/rules-end-of-flow.md +150 -0
- package/i18n/ja/references/rules-export-document.md +346 -0
- package/i18n/ja/references/rules-file-integration.md +65 -0
- package/i18n/ja/references/rules-full.md +66 -0
- package/i18n/ja/references/rules-import-document.md +261 -0
- package/i18n/ja/references/rules-product-type.md +14 -0
- package/i18n/ja/references/rules-progress.md +60 -0
- package/i18n/ja/references/rules-quick.md +29 -0
- package/i18n/ja/references/rules-revision.md +64 -0
- package/i18n/ko/SKILL.md +245 -0
- package/i18n/ko/commands/product-build.md +13 -0
- package/i18n/ko/commands/product-dev.md +21 -0
- package/i18n/ko/commands/product-full.md +13 -0
- package/i18n/ko/commands/product-prd.md +14 -0
- package/i18n/ko/commands/product-quick.md +13 -0
- package/i18n/ko/commands/product-report.md +12 -0
- package/i18n/ko/commands/product-revision.md +13 -0
- package/i18n/ko/references/00-opportunity-check.md +44 -0
- package/i18n/ko/references/01-strategy.md +90 -0
- package/i18n/ko/references/02a-persona.md +57 -0
- package/i18n/ko/references/02b-jtbd.md +125 -0
- package/i18n/ko/references/02c-ost-journey.md +65 -0
- package/i18n/ko/references/03-define.md +118 -0
- package/i18n/ko/references/04a-prfaq.md +112 -0
- package/i18n/ko/references/04b-solutions.md +269 -0
- package/i18n/ko/references/04c-mvp.md +21 -0
- package/i18n/ko/references/05a-northstar-aha.md +93 -0
- package/i18n/ko/references/05b-pmf-gtm.md +102 -0
- package/i18n/ko/references/05c-validation-spec.md +117 -0
- package/i18n/ko/references/06-html-report.md +126 -0
- package/i18n/ko/references/07a-handoff-core.md +152 -0
- package/i18n/ko/references/07b-tasks-tickets.md +215 -0
- package/i18n/ko/references/07c-architecture-setup.md +197 -0
- package/i18n/ko/references/08-security-checklist.md +221 -0
- package/i18n/ko/references/rules-build.md +152 -0
- package/i18n/ko/references/rules-change-propagation.md +74 -0
- package/i18n/ko/references/rules-commands.md +98 -0
- package/i18n/ko/references/rules-context.md +291 -0
- package/i18n/ko/references/rules-custom.md +63 -0
- package/i18n/ko/references/rules-document-tools.md +126 -0
- package/i18n/ko/references/rules-end-of-flow.md +150 -0
- package/i18n/ko/references/rules-export-document.md +346 -0
- package/i18n/ko/references/rules-file-integration.md +65 -0
- package/i18n/ko/references/rules-full.md +66 -0
- package/i18n/ko/references/rules-import-document.md +261 -0
- package/i18n/ko/references/rules-product-type.md +14 -0
- package/i18n/ko/references/rules-progress.md +60 -0
- package/i18n/ko/references/rules-quick.md +29 -0
- package/i18n/ko/references/rules-revision.md +64 -0
- package/i18n/zh-CN/SKILL.md +245 -0
- package/i18n/zh-CN/commands/product-build.md +13 -0
- package/i18n/zh-CN/commands/product-dev.md +21 -0
- package/i18n/zh-CN/commands/product-full.md +13 -0
- package/i18n/zh-CN/commands/product-prd.md +14 -0
- package/i18n/zh-CN/commands/product-quick.md +13 -0
- package/i18n/zh-CN/commands/product-report.md +12 -0
- package/i18n/zh-CN/commands/product-revision.md +13 -0
- package/i18n/zh-CN/references/00-opportunity-check.md +44 -0
- package/i18n/zh-CN/references/01-strategy.md +90 -0
- package/i18n/zh-CN/references/02a-persona.md +57 -0
- package/i18n/zh-CN/references/02b-jtbd.md +125 -0
- package/i18n/zh-CN/references/02c-ost-journey.md +65 -0
- package/i18n/zh-CN/references/03-define.md +118 -0
- package/i18n/zh-CN/references/04a-prfaq.md +106 -0
- package/i18n/zh-CN/references/04b-solutions.md +269 -0
- package/i18n/zh-CN/references/04c-mvp.md +21 -0
- package/i18n/zh-CN/references/05a-northstar-aha.md +93 -0
- package/i18n/zh-CN/references/05b-pmf-gtm.md +102 -0
- package/i18n/zh-CN/references/05c-validation-spec.md +117 -0
- package/i18n/zh-CN/references/06-html-report.md +123 -0
- package/i18n/zh-CN/references/07a-handoff-core.md +152 -0
- package/i18n/zh-CN/references/07b-tasks-tickets.md +215 -0
- package/i18n/zh-CN/references/07c-architecture-setup.md +197 -0
- package/i18n/zh-CN/references/08-security-checklist.md +221 -0
- package/i18n/zh-CN/references/rules-build.md +152 -0
- package/i18n/zh-CN/references/rules-change-propagation.md +74 -0
- package/i18n/zh-CN/references/rules-commands.md +98 -0
- package/i18n/zh-CN/references/rules-context.md +291 -0
- package/i18n/zh-CN/references/rules-custom.md +63 -0
- package/i18n/zh-CN/references/rules-document-tools.md +126 -0
- package/i18n/zh-CN/references/rules-end-of-flow.md +150 -0
- package/i18n/zh-CN/references/rules-export-document.md +346 -0
- package/i18n/zh-CN/references/rules-file-integration.md +65 -0
- package/i18n/zh-CN/references/rules-full.md +66 -0
- package/i18n/zh-CN/references/rules-import-document.md +261 -0
- package/i18n/zh-CN/references/rules-product-type.md +14 -0
- package/i18n/zh-CN/references/rules-progress.md +60 -0
- package/i18n/zh-CN/references/rules-quick.md +29 -0
- package/i18n/zh-CN/references/rules-revision.md +64 -0
- package/i18n/zh-TW/SKILL.md +244 -0
- package/i18n/zh-TW/commands/product-build.md +13 -0
- package/i18n/zh-TW/commands/product-dev.md +21 -0
- package/i18n/zh-TW/commands/product-full.md +13 -0
- package/i18n/zh-TW/commands/product-prd.md +14 -0
- package/i18n/zh-TW/commands/product-quick.md +13 -0
- package/i18n/zh-TW/commands/product-report.md +12 -0
- package/i18n/zh-TW/commands/product-revision.md +13 -0
- package/i18n/zh-TW/references/00-opportunity-check.md +44 -0
- package/i18n/zh-TW/references/01-strategy.md +90 -0
- package/i18n/zh-TW/references/02a-persona.md +57 -0
- package/i18n/zh-TW/references/02b-jtbd.md +125 -0
- package/i18n/zh-TW/references/02c-ost-journey.md +65 -0
- package/i18n/zh-TW/references/03-define.md +118 -0
- package/i18n/zh-TW/references/04a-prfaq.md +106 -0
- package/i18n/zh-TW/references/04b-solutions.md +269 -0
- package/i18n/zh-TW/references/04c-mvp.md +21 -0
- package/i18n/zh-TW/references/05a-northstar-aha.md +93 -0
- package/i18n/zh-TW/references/05b-pmf-gtm.md +102 -0
- package/i18n/zh-TW/references/05c-validation-spec.md +117 -0
- package/i18n/zh-TW/references/06-html-report.md +123 -0
- package/i18n/zh-TW/references/07a-handoff-core.md +152 -0
- package/i18n/zh-TW/references/07b-tasks-tickets.md +215 -0
- package/i18n/zh-TW/references/07c-architecture-setup.md +197 -0
- package/i18n/zh-TW/references/08-security-checklist.md +221 -0
- package/i18n/zh-TW/references/rules-build.md +152 -0
- package/i18n/zh-TW/references/rules-change-propagation.md +74 -0
- package/i18n/zh-TW/references/rules-commands.md +98 -0
- package/i18n/zh-TW/references/rules-context.md +291 -0
- package/i18n/zh-TW/references/rules-custom.md +63 -0
- package/i18n/zh-TW/references/rules-document-tools.md +126 -0
- package/i18n/zh-TW/references/rules-end-of-flow.md +150 -0
- package/i18n/zh-TW/references/rules-export-document.md +346 -0
- package/i18n/zh-TW/references/rules-file-integration.md +65 -0
- package/i18n/zh-TW/references/rules-full.md +66 -0
- package/i18n/zh-TW/references/rules-import-document.md +261 -0
- package/i18n/zh-TW/references/rules-product-type.md +14 -0
- package/i18n/zh-TW/references/rules-progress.md +60 -0
- package/i18n/zh-TW/references/rules-quick.md +29 -0
- package/i18n/zh-TW/references/rules-revision.md +64 -0
- package/install.sh +418 -0
- package/package.json +41 -0
- package/references/00-opportunity-check.md +44 -0
- package/references/01-strategy.md +90 -0
- package/references/02a-persona.md +57 -0
- package/references/02b-jtbd.md +125 -0
- package/references/02c-ost-journey.md +65 -0
- package/references/03-define.md +118 -0
- package/references/04a-prfaq.md +106 -0
- package/references/04b-solutions.md +269 -0
- package/references/04c-mvp.md +21 -0
- package/references/05a-northstar-aha.md +93 -0
- package/references/05b-pmf-gtm.md +102 -0
- package/references/05c-validation-spec.md +117 -0
- package/references/06-html-report.md +123 -0
- package/references/07a-handoff-core.md +152 -0
- package/references/07b-tasks-tickets.md +215 -0
- package/references/07c-architecture-setup.md +197 -0
- package/references/08-security-checklist.md +221 -0
- package/references/rules-build.md +152 -0
- package/references/rules-change-propagation.md +74 -0
- package/references/rules-commands.md +98 -0
- package/references/rules-context.md +291 -0
- package/references/rules-custom.md +63 -0
- package/references/rules-document-tools.md +126 -0
- package/references/rules-end-of-flow.md +150 -0
- package/references/rules-export-document.md +346 -0
- package/references/rules-file-integration.md +65 -0
- package/references/rules-full.md +66 -0
- package/references/rules-import-document.md +261 -0
- package/references/rules-product-type.md +14 -0
- package/references/rules-progress.md +60 -0
- package/references/rules-quick.md +29 -0
- package/references/rules-revision.md +64 -0
- package/references/templates/prd-style.css +464 -0
- package/references/templates/report-style.css +114 -0
package/install.sh
ADDED
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# The Product Playbook — Install Script
|
|
3
|
+
# https://github.com/kaminoikari/product-playbook
|
|
4
|
+
#
|
|
5
|
+
# Usage:
|
|
6
|
+
# curl -fsSL https://raw.githubusercontent.com/kaminoikari/product-playbook/main/install.sh | bash
|
|
7
|
+
# bash install.sh
|
|
8
|
+
# bash install.sh --lang en
|
|
9
|
+
# bash install.sh --lang zh-TW
|
|
10
|
+
# bash install.sh --uninstall
|
|
11
|
+
# bash install.sh --help
|
|
12
|
+
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
# ─── Colors ───────────────────────────────────────────────────────────────────
|
|
16
|
+
if [ -z "${NO_COLOR:-}" ] && [ -t 1 ]; then
|
|
17
|
+
RED='\033[0;31m'
|
|
18
|
+
GREEN='\033[0;32m'
|
|
19
|
+
YELLOW='\033[0;33m'
|
|
20
|
+
BLUE='\033[0;34m'
|
|
21
|
+
BOLD='\033[1m'
|
|
22
|
+
RESET='\033[0m'
|
|
23
|
+
else
|
|
24
|
+
RED='' GREEN='' YELLOW='' BLUE='' BOLD='' RESET=''
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
# ─── Constants ────────────────────────────────────────────────────────────────
|
|
28
|
+
REPO_URL="https://github.com/kaminoikari/product-playbook.git"
|
|
29
|
+
TMP_DIR="${TMPDIR:-/tmp}/product-playbook-install-$$"
|
|
30
|
+
SKILL_DIR="$HOME/.claude/skills/product-playbook"
|
|
31
|
+
COMMANDS_DIR="$HOME/.claude/commands"
|
|
32
|
+
SUPPORTED_LANGS="en zh-TW ja zh-CN es ko"
|
|
33
|
+
INSTALL_LANG=""
|
|
34
|
+
|
|
35
|
+
# ─── Language Detection ───────────────────────────────────────────────────────
|
|
36
|
+
detect_language() {
|
|
37
|
+
# 1. Explicit env var
|
|
38
|
+
if [ -n "${TPP_LANG:-}" ]; then
|
|
39
|
+
echo "$TPP_LANG"
|
|
40
|
+
return
|
|
41
|
+
fi
|
|
42
|
+
# 2. System locale
|
|
43
|
+
local sys_lang="${LANG:-${LC_ALL:-${LC_MESSAGES:-}}}"
|
|
44
|
+
case "$sys_lang" in
|
|
45
|
+
zh_TW*|zh_Hant*) echo "zh-TW" ;;
|
|
46
|
+
zh_CN*|zh_Hans*|zh*) echo "zh-CN" ;;
|
|
47
|
+
ja*) echo "ja" ;;
|
|
48
|
+
ko*) echo "ko" ;;
|
|
49
|
+
es*) echo "es" ;;
|
|
50
|
+
*) echo "en" ;;
|
|
51
|
+
esac
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
# ─── i18n Messages ────────────────────────────────────────────────────────────
|
|
55
|
+
msg() {
|
|
56
|
+
local key="$1"
|
|
57
|
+
case "$INSTALL_LANG" in
|
|
58
|
+
zh-TW)
|
|
59
|
+
case "$key" in
|
|
60
|
+
title) echo "The Product Playbook — 安裝程式" ;;
|
|
61
|
+
usage_title) echo "The Product Playbook — 安裝腳本" ;;
|
|
62
|
+
usage_install) echo "安裝或更新" ;;
|
|
63
|
+
usage_lang) echo "指定語言 (en, zh-TW)" ;;
|
|
64
|
+
usage_uninstall) echo "解除安裝" ;;
|
|
65
|
+
usage_help) echo "顯示此訊息" ;;
|
|
66
|
+
usage_paths) echo "安裝路徑:" ;;
|
|
67
|
+
uninstalling) echo "解除安裝 The Product Playbook..." ;;
|
|
68
|
+
deleted_dir) echo "已刪除" ;;
|
|
69
|
+
dir_not_found) echo "Skill 目錄不存在,跳過" ;;
|
|
70
|
+
deleted_cmds) echo "個 slash command 檔案已刪除" ;;
|
|
71
|
+
no_cmds) echo "未找到 product-*.md 指令檔案,跳過" ;;
|
|
72
|
+
uninstall_done) echo "解除安裝完成!" ;;
|
|
73
|
+
git_not_found) echo "找不到 git,請先安裝 git 後再執行。" ;;
|
|
74
|
+
local_repo) echo "偵測到本地 repo,使用本地檔案安裝..." ;;
|
|
75
|
+
downloading) echo "從 GitHub 下載最新版本..." ;;
|
|
76
|
+
version) echo "版本" ;;
|
|
77
|
+
up_to_date) echo "已是最新版本,無需更新。" ;;
|
|
78
|
+
installed_at) echo "已安裝:" ;;
|
|
79
|
+
get_started) echo "開始使用:" ;;
|
|
80
|
+
start_claude) echo "啟動 Claude Code,然後輸入:" ;;
|
|
81
|
+
example_cmd) echo "/product-quick 我想做一個記帳 App" ;;
|
|
82
|
+
old_install) echo "偵測到舊版安裝,更新中..." ;;
|
|
83
|
+
installing_skill) echo "安裝 Skill 檔案..." ;;
|
|
84
|
+
skill_installed) echo "Skill 已安裝至" ;;
|
|
85
|
+
installing_cmds) echo "安裝 Slash Commands..." ;;
|
|
86
|
+
cmds_installed) echo "個 slash commands 已安裝" ;;
|
|
87
|
+
install_done) echo "安裝完成!" ;;
|
|
88
|
+
update_hint) echo "更新:重新執行本安裝指令即可。" ;;
|
|
89
|
+
uninstall_hint) echo "解除安裝:" ;;
|
|
90
|
+
unknown_arg) echo "未知參數" ;;
|
|
91
|
+
lang_label) echo "語言" ;;
|
|
92
|
+
invalid_lang) echo "不支援的語言。支援:" ;;
|
|
93
|
+
esac
|
|
94
|
+
;;
|
|
95
|
+
*)
|
|
96
|
+
case "$key" in
|
|
97
|
+
title) echo "The Product Playbook — Installer" ;;
|
|
98
|
+
usage_title) echo "The Product Playbook — Install Script" ;;
|
|
99
|
+
usage_install) echo "Install or update" ;;
|
|
100
|
+
usage_lang) echo "Set language (en, zh-TW)" ;;
|
|
101
|
+
usage_uninstall) echo "Uninstall" ;;
|
|
102
|
+
usage_help) echo "Show this message" ;;
|
|
103
|
+
usage_paths) echo "Install paths:" ;;
|
|
104
|
+
uninstalling) echo "Uninstalling The Product Playbook..." ;;
|
|
105
|
+
deleted_dir) echo "Deleted" ;;
|
|
106
|
+
dir_not_found) echo "Skill directory not found, skipping" ;;
|
|
107
|
+
deleted_cmds) echo "slash command file(s) deleted" ;;
|
|
108
|
+
no_cmds) echo "No product-*.md command files found, skipping" ;;
|
|
109
|
+
uninstall_done) echo "Uninstall complete!" ;;
|
|
110
|
+
git_not_found) echo "git not found. Please install git first." ;;
|
|
111
|
+
local_repo) echo "Local repo detected, installing from local files..." ;;
|
|
112
|
+
downloading) echo "Downloading latest version from GitHub..." ;;
|
|
113
|
+
version) echo "Version" ;;
|
|
114
|
+
up_to_date) echo "Already up to date, no update needed." ;;
|
|
115
|
+
installed_at) echo "Installed:" ;;
|
|
116
|
+
get_started) echo "Get started:" ;;
|
|
117
|
+
start_claude) echo "Launch Claude Code, then type:" ;;
|
|
118
|
+
example_cmd) echo "/product-quick I want to build an expense tracking app" ;;
|
|
119
|
+
old_install) echo "Previous installation detected, updating..." ;;
|
|
120
|
+
installing_skill) echo "Installing Skill files..." ;;
|
|
121
|
+
skill_installed) echo "Skill installed to" ;;
|
|
122
|
+
installing_cmds) echo "Installing Slash Commands..." ;;
|
|
123
|
+
cmds_installed) echo "slash commands installed" ;;
|
|
124
|
+
install_done) echo "Installation complete!" ;;
|
|
125
|
+
update_hint) echo "Update: re-run this install script." ;;
|
|
126
|
+
uninstall_hint) echo "Uninstall:" ;;
|
|
127
|
+
unknown_arg) echo "Unknown argument" ;;
|
|
128
|
+
lang_label) echo "Language" ;;
|
|
129
|
+
invalid_lang) echo "Unsupported language. Supported:" ;;
|
|
130
|
+
esac
|
|
131
|
+
;;
|
|
132
|
+
esac
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
# ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
136
|
+
info() { printf "${BLUE}▸${RESET} %s\n" "$*"; }
|
|
137
|
+
ok() { printf "${GREEN}✓${RESET} %s\n" "$*"; }
|
|
138
|
+
warn() { printf "${YELLOW}⚠${RESET} %s\n" "$*"; }
|
|
139
|
+
err() { printf "${RED}✗${RESET} %s\n" "$*" >&2; }
|
|
140
|
+
|
|
141
|
+
cleanup() {
|
|
142
|
+
if [ -d "$TMP_DIR" ]; then
|
|
143
|
+
rm -rf "$TMP_DIR"
|
|
144
|
+
fi
|
|
145
|
+
}
|
|
146
|
+
trap cleanup EXIT
|
|
147
|
+
|
|
148
|
+
usage() {
|
|
149
|
+
cat <<EOF
|
|
150
|
+
${BOLD}$(msg usage_title)${RESET}
|
|
151
|
+
|
|
152
|
+
Usage:
|
|
153
|
+
bash install.sh $(msg usage_install)
|
|
154
|
+
bash install.sh --lang <lang> $(msg usage_lang)
|
|
155
|
+
bash install.sh --update Update to latest version
|
|
156
|
+
bash install.sh --uninstall $(msg usage_uninstall)
|
|
157
|
+
bash install.sh --help $(msg usage_help)
|
|
158
|
+
|
|
159
|
+
$(msg usage_paths)
|
|
160
|
+
Skill → ~/.claude/skills/product-playbook/
|
|
161
|
+
Commands → ~/.claude/commands/product-*.md
|
|
162
|
+
EOF
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
# ─── Uninstall ────────────────────────────────────────────────────────────────
|
|
166
|
+
do_uninstall() {
|
|
167
|
+
info "$(msg uninstalling)"
|
|
168
|
+
|
|
169
|
+
if [ -d "$SKILL_DIR" ]; then
|
|
170
|
+
rm -rf "$SKILL_DIR"
|
|
171
|
+
ok "$(msg deleted_dir) $SKILL_DIR"
|
|
172
|
+
else
|
|
173
|
+
warn "$(msg dir_not_found)"
|
|
174
|
+
fi
|
|
175
|
+
|
|
176
|
+
local count=0
|
|
177
|
+
for f in "$COMMANDS_DIR"/product-*.md; do
|
|
178
|
+
[ -f "$f" ] || continue
|
|
179
|
+
rm -f "$f"
|
|
180
|
+
count=$((count + 1))
|
|
181
|
+
done
|
|
182
|
+
|
|
183
|
+
if [ "$count" -gt 0 ]; then
|
|
184
|
+
ok "$count $(msg deleted_cmds)"
|
|
185
|
+
else
|
|
186
|
+
warn "$(msg no_cmds)"
|
|
187
|
+
fi
|
|
188
|
+
|
|
189
|
+
printf "\n${GREEN}${BOLD}$(msg uninstall_done)${RESET}\n"
|
|
190
|
+
exit 0
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
# ─── Install ──────────────────────────────────────────────────────────────────
|
|
194
|
+
do_install() {
|
|
195
|
+
printf "\n${BOLD}🎯 $(msg title)${RESET}\n"
|
|
196
|
+
printf " $(msg lang_label): ${BOLD}$INSTALL_LANG${RESET}\n\n"
|
|
197
|
+
|
|
198
|
+
# Check git
|
|
199
|
+
if ! command -v git &>/dev/null; then
|
|
200
|
+
err "$(msg git_not_found)"
|
|
201
|
+
exit 1
|
|
202
|
+
fi
|
|
203
|
+
|
|
204
|
+
# Determine source: local repo or remote clone
|
|
205
|
+
local src_dir=""
|
|
206
|
+
local script_dir=""
|
|
207
|
+
local commit_hash=""
|
|
208
|
+
|
|
209
|
+
if [ -f "${BASH_SOURCE[0]:-}" ]; then
|
|
210
|
+
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
211
|
+
fi
|
|
212
|
+
|
|
213
|
+
if [ -n "$script_dir" ] && [ -d "$script_dir/i18n" ]; then
|
|
214
|
+
info "$(msg local_repo)"
|
|
215
|
+
src_dir="$script_dir"
|
|
216
|
+
commit_hash=$(git -C "$src_dir" rev-parse --short HEAD 2>/dev/null || echo "")
|
|
217
|
+
if [ -z "$commit_hash" ] && [ -f "$src_dir/package.json" ]; then
|
|
218
|
+
commit_hash=$(grep '"version"' "$src_dir/package.json" | head -1 | sed 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/')
|
|
219
|
+
fi
|
|
220
|
+
commit_hash="${commit_hash:-unknown}"
|
|
221
|
+
elif [ -n "$script_dir" ] && [ -f "$script_dir/SKILL.md" ]; then
|
|
222
|
+
# Fallback: legacy layout (no i18n directory)
|
|
223
|
+
info "$(msg local_repo)"
|
|
224
|
+
src_dir="$script_dir"
|
|
225
|
+
commit_hash=$(git -C "$src_dir" rev-parse --short HEAD 2>/dev/null || echo "")
|
|
226
|
+
if [ -z "$commit_hash" ] && [ -f "$src_dir/package.json" ]; then
|
|
227
|
+
commit_hash=$(grep '"version"' "$src_dir/package.json" | head -1 | sed 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/')
|
|
228
|
+
fi
|
|
229
|
+
commit_hash="${commit_hash:-unknown}"
|
|
230
|
+
else
|
|
231
|
+
info "$(msg downloading)"
|
|
232
|
+
git clone --depth 1 "$REPO_URL" "$TMP_DIR" 2>/dev/null
|
|
233
|
+
src_dir="$TMP_DIR"
|
|
234
|
+
commit_hash=$(git -C "$src_dir" rev-parse --short HEAD 2>/dev/null || echo "unknown")
|
|
235
|
+
local commit_date
|
|
236
|
+
commit_date=$(git -C "$src_dir" log -1 --format='%ci' 2>/dev/null | cut -d' ' -f1 || echo "unknown")
|
|
237
|
+
ok "$(msg version): $commit_hash ($commit_date)"
|
|
238
|
+
fi
|
|
239
|
+
|
|
240
|
+
# Create directories
|
|
241
|
+
mkdir -p "$SKILL_DIR" "$COMMANDS_DIR"
|
|
242
|
+
|
|
243
|
+
# Get current package version (semver)
|
|
244
|
+
local pkg_version=""
|
|
245
|
+
if [ -f "$src_dir/package.json" ]; then
|
|
246
|
+
pkg_version=$(grep '"version"' "$src_dir/package.json" | head -1 | sed 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/')
|
|
247
|
+
fi
|
|
248
|
+
|
|
249
|
+
# Version check: skip if already up to date
|
|
250
|
+
if [ -f "$SKILL_DIR/.version" ]; then
|
|
251
|
+
local installed_version
|
|
252
|
+
installed_version=$(cat "$SKILL_DIR/.version")
|
|
253
|
+
# Detect legacy format (git hash, not semver) — force update
|
|
254
|
+
if echo "$installed_version" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then
|
|
255
|
+
# Semver format — compare with current package version
|
|
256
|
+
if [ "$installed_version" = "$pkg_version" ] && [ -n "$pkg_version" ]; then
|
|
257
|
+
ok "$(msg up_to_date) (v$pkg_version)"
|
|
258
|
+
printf "\n$(msg installed_at)\n"
|
|
259
|
+
printf " Skill → ${BOLD}%s${RESET}\n" "$SKILL_DIR"
|
|
260
|
+
printf " Commands → ${BOLD}%s${RESET}/product-*.md\n" "$COMMANDS_DIR"
|
|
261
|
+
printf "\n$(msg get_started)\n"
|
|
262
|
+
printf " ${BOLD}claude${RESET} $(msg start_claude)\n"
|
|
263
|
+
printf " ${BLUE}$(msg example_cmd)${RESET}\n\n"
|
|
264
|
+
return 0
|
|
265
|
+
fi
|
|
266
|
+
else
|
|
267
|
+
# Legacy format (git hash or unknown) — always update
|
|
268
|
+
warn "Detected legacy installation (v1.x). Upgrading to v${pkg_version:-latest}..."
|
|
269
|
+
fi
|
|
270
|
+
fi
|
|
271
|
+
|
|
272
|
+
# Remove old installation
|
|
273
|
+
if [ -d "$SKILL_DIR" ]; then
|
|
274
|
+
info "$(msg old_install)"
|
|
275
|
+
rm -rf "$SKILL_DIR"
|
|
276
|
+
mkdir -p "$SKILL_DIR"
|
|
277
|
+
fi
|
|
278
|
+
|
|
279
|
+
# Determine default language source paths
|
|
280
|
+
local default_lang_dir="$src_dir/i18n/$INSTALL_LANG"
|
|
281
|
+
local has_i18n=false
|
|
282
|
+
|
|
283
|
+
if [ -d "$src_dir/i18n" ]; then
|
|
284
|
+
has_i18n=true
|
|
285
|
+
fi
|
|
286
|
+
|
|
287
|
+
# Copy Skill files
|
|
288
|
+
info "$(msg installing_skill)"
|
|
289
|
+
cp "$src_dir/LICENSE" "$SKILL_DIR/"
|
|
290
|
+
|
|
291
|
+
if [ "$has_i18n" = true ]; then
|
|
292
|
+
# Install ALL languages
|
|
293
|
+
cp -r "$src_dir/i18n" "$SKILL_DIR/"
|
|
294
|
+
ok "Installed all 6 languages to $SKILL_DIR/i18n/"
|
|
295
|
+
|
|
296
|
+
# Set default language: copy SKILL.md, references/, commands/ from default lang
|
|
297
|
+
if [ -d "$default_lang_dir" ]; then
|
|
298
|
+
cp "$default_lang_dir/SKILL.md" "$SKILL_DIR/"
|
|
299
|
+
cp -r "$default_lang_dir/references" "$SKILL_DIR/"
|
|
300
|
+
cp -r "$default_lang_dir/commands" "$SKILL_DIR/"
|
|
301
|
+
fi
|
|
302
|
+
else
|
|
303
|
+
# Legacy fallback: no i18n directory
|
|
304
|
+
cp "$src_dir/SKILL.md" "$SKILL_DIR/"
|
|
305
|
+
[ -d "$src_dir/references" ] && cp -r "$src_dir/references" "$SKILL_DIR/"
|
|
306
|
+
[ -d "$src_dir/commands" ] && cp -r "$src_dir/commands" "$SKILL_DIR/"
|
|
307
|
+
fi
|
|
308
|
+
|
|
309
|
+
# Write version marker (semver from package.json for npm comparison)
|
|
310
|
+
local pkg_version=""
|
|
311
|
+
if [ -f "$src_dir/package.json" ]; then
|
|
312
|
+
pkg_version=$(grep '"version"' "$src_dir/package.json" | head -1 | sed 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/')
|
|
313
|
+
fi
|
|
314
|
+
if [ -n "$pkg_version" ]; then
|
|
315
|
+
echo "$pkg_version" > "$SKILL_DIR/.version"
|
|
316
|
+
elif [ "$commit_hash" != "unknown" ]; then
|
|
317
|
+
echo "$commit_hash" > "$SKILL_DIR/.version"
|
|
318
|
+
fi
|
|
319
|
+
|
|
320
|
+
# Write default language marker
|
|
321
|
+
echo "$INSTALL_LANG" > "$SKILL_DIR/.lang"
|
|
322
|
+
|
|
323
|
+
ok "$(msg skill_installed) $SKILL_DIR"
|
|
324
|
+
|
|
325
|
+
# Copy slash commands to global commands dir
|
|
326
|
+
info "$(msg installing_cmds)"
|
|
327
|
+
local cmds_src="$SKILL_DIR/commands"
|
|
328
|
+
local cmd_count=0
|
|
329
|
+
for f in "$cmds_src"/*.md; do
|
|
330
|
+
[ -f "$f" ] || continue
|
|
331
|
+
cp "$f" "$COMMANDS_DIR/"
|
|
332
|
+
cmd_count=$((cmd_count + 1))
|
|
333
|
+
done
|
|
334
|
+
ok "$cmd_count $(msg cmds_installed)"
|
|
335
|
+
|
|
336
|
+
# Done
|
|
337
|
+
printf "\n${GREEN}${BOLD}$(msg install_done)${RESET}\n\n"
|
|
338
|
+
printf "$(msg installed_at)\n"
|
|
339
|
+
printf " Skill → ${BOLD}%s${RESET}\n" "$SKILL_DIR"
|
|
340
|
+
printf " Commands → ${BOLD}%s${RESET}/product-*.md\n" "$COMMANDS_DIR"
|
|
341
|
+
printf "\n$(msg get_started)\n"
|
|
342
|
+
printf " ${BOLD}claude${RESET} $(msg start_claude)\n"
|
|
343
|
+
printf " ${BLUE}$(msg example_cmd)${RESET}\n"
|
|
344
|
+
printf "\n$(msg update_hint)\n"
|
|
345
|
+
printf "$(msg uninstall_hint) ${YELLOW}bash install.sh --uninstall${RESET}\n\n"
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
# ─── Main ─────────────────────────────────────────────────────────────────────
|
|
349
|
+
main() {
|
|
350
|
+
# Parse --lang argument first
|
|
351
|
+
local args=()
|
|
352
|
+
while [[ $# -gt 0 ]]; do
|
|
353
|
+
case "$1" in
|
|
354
|
+
--lang)
|
|
355
|
+
if [ -n "${2:-}" ]; then
|
|
356
|
+
INSTALL_LANG="$2"
|
|
357
|
+
shift 2
|
|
358
|
+
else
|
|
359
|
+
err "$(msg invalid_lang) $SUPPORTED_LANGS"
|
|
360
|
+
exit 1
|
|
361
|
+
fi
|
|
362
|
+
;;
|
|
363
|
+
*)
|
|
364
|
+
args+=("$1")
|
|
365
|
+
shift
|
|
366
|
+
;;
|
|
367
|
+
esac
|
|
368
|
+
done
|
|
369
|
+
|
|
370
|
+
# Auto-detect default language if not specified
|
|
371
|
+
if [ -z "$INSTALL_LANG" ]; then
|
|
372
|
+
INSTALL_LANG=$(detect_language)
|
|
373
|
+
fi
|
|
374
|
+
|
|
375
|
+
# Validate language (fallback to en if unsupported)
|
|
376
|
+
local valid=false
|
|
377
|
+
for lang in $SUPPORTED_LANGS; do
|
|
378
|
+
if [ "$INSTALL_LANG" = "$lang" ]; then
|
|
379
|
+
valid=true
|
|
380
|
+
break
|
|
381
|
+
fi
|
|
382
|
+
done
|
|
383
|
+
if [ "$valid" = false ]; then
|
|
384
|
+
warn "'$INSTALL_LANG' is not supported. Supported: $SUPPORTED_LANGS"
|
|
385
|
+
warn "Falling back to English (en)."
|
|
386
|
+
INSTALL_LANG="en"
|
|
387
|
+
fi
|
|
388
|
+
|
|
389
|
+
# Dispatch command
|
|
390
|
+
case "${args[0]:-}" in
|
|
391
|
+
--uninstall|-u)
|
|
392
|
+
do_uninstall
|
|
393
|
+
;;
|
|
394
|
+
--update)
|
|
395
|
+
# Update: detect installed language, then re-install from remote
|
|
396
|
+
if [ -f "$SKILL_DIR/.lang" ]; then
|
|
397
|
+
INSTALL_LANG=$(cat "$SKILL_DIR/.lang")
|
|
398
|
+
fi
|
|
399
|
+
# Force re-download by removing version file
|
|
400
|
+
rm -f "$SKILL_DIR/.version"
|
|
401
|
+
do_install
|
|
402
|
+
;;
|
|
403
|
+
--help|-h)
|
|
404
|
+
usage
|
|
405
|
+
exit 0
|
|
406
|
+
;;
|
|
407
|
+
"")
|
|
408
|
+
do_install
|
|
409
|
+
;;
|
|
410
|
+
*)
|
|
411
|
+
err "$(msg unknown_arg): ${args[0]}"
|
|
412
|
+
usage
|
|
413
|
+
exit 1
|
|
414
|
+
;;
|
|
415
|
+
esac
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
main "$@"
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "product-playbook",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "World-class product planning AI skill for Claude Code — 22 PM frameworks, 6 modes, from idea to dev handoff",
|
|
5
|
+
"bin": {
|
|
6
|
+
"product-playbook": "./install.sh"
|
|
7
|
+
},
|
|
8
|
+
"keywords": [
|
|
9
|
+
"claude",
|
|
10
|
+
"claude-code",
|
|
11
|
+
"product",
|
|
12
|
+
"pm",
|
|
13
|
+
"skill",
|
|
14
|
+
"framework",
|
|
15
|
+
"product-management",
|
|
16
|
+
"planning"
|
|
17
|
+
],
|
|
18
|
+
"author": "Charles Chen",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/kaminoikari/product-playbook.git"
|
|
23
|
+
},
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/kaminoikari/product-playbook/issues"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://github.com/kaminoikari/product-playbook#readme",
|
|
28
|
+
"files": [
|
|
29
|
+
"install.sh",
|
|
30
|
+
"SKILL.md",
|
|
31
|
+
"commands/",
|
|
32
|
+
"references/",
|
|
33
|
+
"i18n/",
|
|
34
|
+
"README.zh-TW.md",
|
|
35
|
+
"README.ja.md",
|
|
36
|
+
"README.zh-CN.md",
|
|
37
|
+
"README.es.md",
|
|
38
|
+
"README.ko.md",
|
|
39
|
+
"LICENSE"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 前置:機會評估(Opportunity Check)
|
|
2
|
+
|
|
3
|
+
> **注意:各模式應執行哪些步驟,以 SKILL.md 中「各模式步驟序列」為權威定義。以下僅供參考。**
|
|
4
|
+
|
|
5
|
+
**適用於:完整模式、高完整性、產出對象為老闆/高層**
|
|
6
|
+
**可跳過:快速模式、直接實作模式、產出對象為工程師/設計師**
|
|
7
|
+
|
|
8
|
+
如果使用者是從頭開始做 0-to-1 產品,先通過這五個問題。任何一題答案是「否」都是需要重新思考的訊號:
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
| # | 評估問題 | 使用者答案 | 評估 |
|
|
12
|
+
|---|----------|-----------|------|
|
|
13
|
+
| 1 | 這是否在解決一個真實且急迫的用戶痛點?第一批受益的客戶是誰?你如何找到他們? | | ✅/⚠️ |
|
|
14
|
+
| 2 | 你是否有解決這個問題的獨特優勢?目標客戶是否至少每週會用到?市場夠大嗎? | | ✅/⚠️ |
|
|
15
|
+
| 3 | 以現有資源,能否在 2-3 年內做出可用的產品? | | ✅/⚠️ |
|
|
16
|
+
| 4 | 競爭格局如何?你能贏嗎?差異化優勢是什麼? | | ✅/⚠️ |
|
|
17
|
+
| 5 | 是否有可持續的用戶增長和商業化路徑? | | ✅/⚠️ |
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## DHM 初步檢驗(Gibson Biddle / Netflix)
|
|
21
|
+
|
|
22
|
+
這個機會是否能做到:
|
|
23
|
+
- **D(Delight)**:讓用戶感到驚喜、超出預期?
|
|
24
|
+
- **H(Hard to copy)**:競爭對手難以輕易複製?
|
|
25
|
+
- **M(Margin-enhancing)**:隨著規模增長,邊際利潤能提升?
|
|
26
|
+
|
|
27
|
+
如果某些市場訊號尚不明確,尋找方向性訊號:
|
|
28
|
+
- 宏觀趨勢(例:AI 普及帶來的工作流程替代機會)
|
|
29
|
+
- 行為轉移(用戶已在用 workaround,代表需求真實存在)
|
|
30
|
+
- 類比市場(找已驗證的相似場景)
|
|
31
|
+
|
|
32
|
+
## 團隊熱情確認
|
|
33
|
+
|
|
34
|
+
確認團隊對這個問題空間真的有熱情。缺乏內在驅動力的團隊在尋找 PMF 的路上必然倒下。
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 📎 本階段的檔案整合提示
|
|
39
|
+
|
|
40
|
+
| 上傳內容 | 整合到 | 整合動作 |
|
|
41
|
+
|---------|-------|---------|
|
|
42
|
+
| 市場報告(PDF) | 五個評估問題(#2 市場規模、#4 競爭格局) | 用報告數據替代假設性回答 |
|
|
43
|
+
| 行業分析 / 趨勢報告 | DHM + 方向性訊號 | 提取宏觀趨勢和行為轉移作為 DHM 佐證 |
|
|
44
|
+
| 競品融資/營收資訊 | 五個評估問題(#4、#5) | 評估競爭強度和市場驗證信號 |
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# 產品策略層
|
|
2
|
+
|
|
3
|
+
> **注意:各模式應執行哪些步驟,以 SKILL.md 中「各模式步驟序列」為權威定義。以下僅供參考。**
|
|
4
|
+
|
|
5
|
+
**適用於:完整模式、高完整性、產出對象為老闆/跨部門對齊**
|
|
6
|
+
**可跳過:快速模式、直接實作模式、低完整性**
|
|
7
|
+
|
|
8
|
+
## Strategy Blocks(Chandra Janakiraman / Headspace / Meta)
|
|
9
|
+
|
|
10
|
+
好策略的層級結構,從上到下每一層都是下一層的基礎:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
Mission(使命)
|
|
14
|
+
└→ Vision(願景)— 5-10 年後你希望世界變成什麼樣?
|
|
15
|
+
└→ Strategy(策略)— 你如何達到那個願景?(關鍵選擇和取捨)
|
|
16
|
+
└→ Goals / OKRs(目標)— 接下來 6-12 個月的優先事項
|
|
17
|
+
└→ Roadmap(路線圖)— 具體要做什麼?
|
|
18
|
+
└→ Tasks(任務)— 誰做什麼、何時完成?
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Richard Rumelt 的「好策略內核(Kernel of Good Strategy)」
|
|
22
|
+
|
|
23
|
+
- **診斷(Diagnosis)**:清楚定義你面臨的挑戰(不是所有問題,而是最關鍵的那個)
|
|
24
|
+
- **指導方針(Guiding Policy)**:你的整體應對方向(不是目標,而是方法)
|
|
25
|
+
- **連貫行動(Coherent Actions)**:相互強化的具體行動,而不是各自獨立的計畫
|
|
26
|
+
|
|
27
|
+
> 壞策略的特徵:只有宏大目標、沒有診斷;用漂亮的措辭掩蓋思維的空洞;把所有計畫都稱為「策略」。
|
|
28
|
+
|
|
29
|
+
## Shreyas Doshi 的三層次產品工作
|
|
30
|
+
|
|
31
|
+
在處理任何產品問題時,先確認你在哪個層次工作:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
Level 3:Product Excellence(卓越執行)— 把正確的事情做得非常好
|
|
35
|
+
Level 2:Product Strategy(產品策略)— 做正確的事情
|
|
36
|
+
Level 1:Product Foundation(產品根基)— 有能力做事情的基礎(文化、流程、人才)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
> 大多數 PM 花太多時間在 Level 3,卻忽略了 Level 2 的問題。大多數所謂的「執行問題」,追根究底都是「策略問題」。
|
|
40
|
+
|
|
41
|
+
## Shreyas Doshi 的 LNO 時間分配框架
|
|
42
|
+
|
|
43
|
+
每週的工作項目,先問:這件事對產品的影響屬於哪一類?
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
L(Leverage,高槓桿):策略、願景、文化 → 投入充足時間,精益求精
|
|
47
|
+
N(Neutral,中性):一般協作、普通溝通 → 做好即可,不必追求完美
|
|
48
|
+
O(Overhead,負擔):行政、會議、文書 → 盡快完成,不要過度投入
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
> 把節省下來的 O 時間,投入到被忽視的 L 工作中。
|
|
52
|
+
|
|
53
|
+
## OKR 撰寫指引
|
|
54
|
+
|
|
55
|
+
Strategy Blocks 中 Goals/OKRs 是策略往下展開的關鍵層。寫好 OKR 的最小規則:
|
|
56
|
+
|
|
57
|
+
**Objective(目標)**:定性、有激勵性、可理解。描述一個你想達到的狀態,不是一個待辦事項。
|
|
58
|
+
- ✅ 好的 O:「讓新用戶在第一天就感受到產品核心價值」
|
|
59
|
+
- ❌ 壞的 O:「完成 Onboarding 改版」(這是任務不是目標)
|
|
60
|
+
|
|
61
|
+
**Key Results(關鍵結果)**:定量、可衡量、有時限。描述你如何知道自己達到了目標。
|
|
62
|
+
- ✅ 好的 KR:「新用戶 D1 核心動作完成率從 20% 提升到 40%」
|
|
63
|
+
- ❌ 壞的 KR:「上線新版 Onboarding 流程」(這是 Output 不是 Outcome)
|
|
64
|
+
|
|
65
|
+
**常見陷阱:**
|
|
66
|
+
- 把任務清單偽裝成 OKR(「完成 X 功能」不是 KR)
|
|
67
|
+
- OKR 太多(每季 2-3 個 Objective,每個 O 下 3-5 個 KR)
|
|
68
|
+
- KR 之間相互矛盾或不相關
|
|
69
|
+
- 只有滯後指標(Lagging),沒有領先指標(Leading)
|
|
70
|
+
|
|
71
|
+
**範例:**
|
|
72
|
+
```
|
|
73
|
+
O:讓目標用戶愛上我們的產品(PMF Level 2 → Level 3)
|
|
74
|
+
KR1:D28 留存率從 12% → 20%
|
|
75
|
+
KR2:Sean Ellis Score 從 28% → 40%
|
|
76
|
+
KR3:每月自然推薦新增用戶佔比從 10% → 25%
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 產品核心三問(貫穿整個流程)
|
|
80
|
+
|
|
81
|
+
這三個問題必須依序釐清,**順序不可對調**:
|
|
82
|
+
|
|
83
|
+
> **Q1:如何吸引顧客進來?(How to get people in the front door?)**
|
|
84
|
+
> **Q2:如何最快讓他們感受到「哇啊!」?(How to reach the Aha Moment?)**
|
|
85
|
+
> **Q3:如何高頻率地傳遞出產品的核心價值?(How to deliver core value repeatedly?)**
|
|
86
|
+
|
|
87
|
+
在 Define 階段,具體轉化為:
|
|
88
|
+
- **Who is it for?** — 為誰做的?
|
|
89
|
+
- **Why build it?** — 為什麼要做?
|
|
90
|
+
- **What is it?** — 做什麼?
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# 階段一:Discovery — Persona 建立
|
|
2
|
+
|
|
3
|
+
## Continuous Discovery 習慣(Teresa Torres)
|
|
4
|
+
|
|
5
|
+
建立一個關鍵習慣:**每週至少接觸一位目標用戶**。Discovery 不是一次性儀式,而是持續系統。
|
|
6
|
+
|
|
7
|
+
> 「Product discovery 應該是持續的習慣,而不是專案開始前的一次性儀式。」— Teresa Torres
|
|
8
|
+
|
|
9
|
+
## 1.1 建立 Persona Table
|
|
10
|
+
|
|
11
|
+
Persona 不是用年齡性別來分群,而是用「用途 / 任務 / 動機」來區分不同類型的用戶。
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
| 欄位 | Persona 1: [暱稱] | Persona 2: [暱稱] | Persona 3: [暱稱] |
|
|
15
|
+
|---|---|---|---|
|
|
16
|
+
| 用途 / 任務 / 動機 | | | |
|
|
17
|
+
| 規模(SIZE) | | | |
|
|
18
|
+
| 問題 / 挑戰 / 驅動力 | | | |
|
|
19
|
+
| 現在做法與理由 | | | |
|
|
20
|
+
| 頻率 | | | |
|
|
21
|
+
| 相關資訊來源 | | | |
|
|
22
|
+
| 採用/執行過程的問題 | | | |
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
說明切分邏輯;檢查是否 MECE(互斥且完整覆蓋);指出核心 TA 和次要 TA。
|
|
26
|
+
|
|
27
|
+
### 📝 Persona 品質自檢清單
|
|
28
|
+
- ✅ 切分是否基於「用途/任務/動機」而非人口統計?
|
|
29
|
+
- ✅ 各 Persona 之間是否 MECE(互斥且完整覆蓋目標市場)?
|
|
30
|
+
- ✅ 是否明確指出核心 TA vs 次要 TA?
|
|
31
|
+
- ✅ 每個 Persona 的「問題/挑戰」是否來自真實觀察或合理推論?
|
|
32
|
+
- ✅ 「現在做法與理由」是否具體到可以識別 Workaround?
|
|
33
|
+
- ❌ 常見問題:按年齡性別分群、Persona 之間差異不明顯、痛點太籠統
|
|
34
|
+
|
|
35
|
+
## 1.2 建立 Persona 卡片
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
## [Persona 暱稱]:[一句話描述]
|
|
39
|
+
|
|
40
|
+
**基本資訊**:年齡 / 性別 / 職業 / 所在地 / 個性特質
|
|
41
|
+
**背景**:[與產品相關的背景描述]
|
|
42
|
+
**目標 / 任務**:[目標1]、[目標2]
|
|
43
|
+
**現行做法與理由**:[目前怎麼做、為什麼這樣做]
|
|
44
|
+
**資訊來源**:[從哪裡獲取相關資訊]
|
|
45
|
+
**阻礙 / 問題 / 挑戰 / 不滿意**:[痛點1]、[痛點2]、[痛點3]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 📎 本階段的檔案整合提示
|
|
51
|
+
|
|
52
|
+
如果使用者在此階段上傳了檔案,Claude 依據以下規則整合:
|
|
53
|
+
|
|
54
|
+
| 上傳內容 | 整合到 | 整合動作 |
|
|
55
|
+
|---------|-------|---------|
|
|
56
|
+
| 用戶訪談逐字稿 / 錄音文字 | 1.1 Persona + 1.3 JTBD | 提取:用戶背景 → Persona 欄位;痛點 + 現行做法 → JTBD 深挖五問;情緒反應 → 情感性/社交性 Job |
|
|
57
|
+
| 用戶調研報告(PDF) | 1.1 + 1.2 + 1.3 | 提取量化數據(用戶分群比例)填入 Persona 規模;提取質化洞見填入 JTBD |
|