feat(market-research): scaffold plugin, command, README, marketplace entry
This commit is contained in:
parent
1baf142ae5
commit
31502b5bbe
|
|
@ -35,6 +35,19 @@
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"keywords": ["android", "clone", "feasibility", "effort-estimation", "market-analysis"],
|
"keywords": ["android", "clone", "feasibility", "effort-estimation", "market-analysis"],
|
||||||
"category": "security"
|
"category": "security"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "market-research",
|
||||||
|
"source": "./plugins/market-research",
|
||||||
|
"description": "Research the app/game market and surface scored, non-repeating clone candidates that feed into clone-app.",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"author": {
|
||||||
|
"name": "masa2146"
|
||||||
|
},
|
||||||
|
"repository": "https://github.com/masa2146/clone-app-skill",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"keywords": ["market-research", "app-discovery", "trends", "clone"],
|
||||||
|
"category": "security"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"name": "market-research",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "Autonomously research the app/game market (free web + LLM trend synthesis) and surface scored, non-repeating clone candidates that feed into the clone-app skill.",
|
||||||
|
"author": {
|
||||||
|
"name": "masa2146"
|
||||||
|
},
|
||||||
|
"repository": "https://github.com/masa2146/clone-app-skill",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"keywords": ["market-research", "app-discovery", "trends", "clone", "play-store", "app-store"],
|
||||||
|
"skills": "./skills/",
|
||||||
|
"commands": "./commands/"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
# market-research
|
||||||
|
|
||||||
|
A Claude Code plugin that autonomously researches the app/game market and surfaces
|
||||||
|
scored, non-repeating clone candidates, then hands user-chosen candidates to the
|
||||||
|
`clone-app` plugin for feasibility analysis.
|
||||||
|
|
||||||
|
## What it does
|
||||||
|
|
||||||
|
`/market-research` runs a 6-phase workflow:
|
||||||
|
|
||||||
|
0. **Seed rotation** — pick varied search angles (category × region × niche) so runs differ.
|
||||||
|
1. **Gather** — App Store RSS chart data (`fetch-charts.py`) + free web search for trends.
|
||||||
|
2. **Synthesize** — cluster findings into ≥10 distinct app/game ideas.
|
||||||
|
3. **Score** — composite score: cloneability + market opportunity + monetization fit.
|
||||||
|
4. **Dedup** — exclude anything already in `./work/market-research/history.json`.
|
||||||
|
5. **Present + handoff** — show the ranked table; chosen candidates flow into `clone-app`.
|
||||||
|
|
||||||
|
## State
|
||||||
|
|
||||||
|
Written under `./work/market-research/` in your current directory:
|
||||||
|
- `history.json` — every past suggestion; the non-repeat memory.
|
||||||
|
- `research-<date>.md` — the full report for a run.
|
||||||
|
|
||||||
|
## Scripts
|
||||||
|
|
||||||
|
- `scripts/fetch-charts.py` — fetch App Store RSS chart feeds → normalized JSON.
|
||||||
|
- `scripts/history.py` — read / append / dedup the suggestion history.
|
||||||
|
|
||||||
|
Python is stdlib-only. Tests run offline against `tests/fixtures/`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash plugins/market-research/tests/run-all.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Effort convention
|
||||||
|
|
||||||
|
Effort is measured in **AI Sprints** (one focused Claude session), never calendar time.
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
---
|
||||||
|
allowed-tools: Bash, Read, Glob, Grep, Write, Edit, WebFetch, WebSearch, Skill
|
||||||
|
description: Research the app/game market and surface scored, non-repeating clone candidates
|
||||||
|
user-invocable: true
|
||||||
|
argument-hint: [optional focus, e.g. "casual games" or "fintech LATAM"]
|
||||||
|
argument: optional market focus or angle (optional)
|
||||||
|
---
|
||||||
|
|
||||||
|
# /market-research
|
||||||
|
|
||||||
|
Run the market-research workflow: scan the market, score candidates, hand picks to clone-app.
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
|
||||||
|
Follow the market-research skill workflow in
|
||||||
|
`${CLAUDE_PLUGIN_ROOT}/skills/market-research/SKILL.md` exactly, phases 0 through 5.
|
||||||
|
|
||||||
|
### Step 1: Optional focus
|
||||||
|
If the user passed a focus argument (e.g. "casual games", "fintech LATAM"), bias
|
||||||
|
the Phase 0 seed selection toward it. Otherwise rotate seeds normally.
|
||||||
|
|
||||||
|
### Step 2: Run the skill
|
||||||
|
Execute Phase 0 → Phase 5 from SKILL.md. Pause for the user at Phase 5 (pick
|
||||||
|
candidates to hand to clone-app).
|
||||||
|
|
||||||
|
### Step 3: Deliver
|
||||||
|
Ensure the report is written to `./work/market-research/research-<date>.md` and
|
||||||
|
the new suggestions are appended to `./work/market-research/history.json`. For
|
||||||
|
each candidate the user picks, resolve it to a Google Play package/URL and invoke
|
||||||
|
the `clone-app` skill on it.
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -uo pipefail
|
||||||
|
ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" # repo root
|
||||||
|
P="$ROOT/plugins/market-research"
|
||||||
|
fail=0
|
||||||
|
must_exist() { [[ -e "$1" ]] && echo "PASS exists: ${1#$ROOT/}" || { echo "FAIL missing: ${1#$ROOT/}"; fail=1; }; }
|
||||||
|
must_exec() { [[ -x "$1" ]] && echo "PASS exec: ${1#$ROOT/}" || { echo "FAIL not exec: ${1#$ROOT/}"; fail=1; }; }
|
||||||
|
|
||||||
|
must_exist "$P/.claude-plugin/plugin.json"
|
||||||
|
must_exist "$P/commands/market-research.md"
|
||||||
|
must_exist "$P/README.md"
|
||||||
|
must_exist "$P/skills/market-research/SKILL.md"
|
||||||
|
for s in fetch-charts.py history.py; do
|
||||||
|
must_exist "$P/skills/market-research/scripts/$s"
|
||||||
|
must_exec "$P/skills/market-research/scripts/$s"
|
||||||
|
done
|
||||||
|
for r in research-angles scoring-guide report-template; do
|
||||||
|
must_exist "$P/skills/market-research/references/$r.md"
|
||||||
|
done
|
||||||
|
|
||||||
|
# JSON validity: plugin manifest + marketplace
|
||||||
|
python3 -c "import json;json.load(open('$P/.claude-plugin/plugin.json'));json.load(open('$ROOT/.claude-plugin/marketplace.json'))" \
|
||||||
|
&& echo "PASS json valid" || { echo "FAIL json invalid"; fail=1; }
|
||||||
|
|
||||||
|
# all three plugins present in marketplace
|
||||||
|
python3 -c "
|
||||||
|
import json;d=json.load(open('$ROOT/.claude-plugin/marketplace.json'))
|
||||||
|
names=[p['name'] for p in d['plugins']]
|
||||||
|
assert 'market-research' in names and 'clone-app' in names and 'android-reverse-engineering' in names
|
||||||
|
print('PASS marketplace has all three plugins')" || { echo "FAIL marketplace entries"; fail=1; }
|
||||||
|
|
||||||
|
exit $fail
|
||||||
Loading…
Reference in New Issue