diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 5af5e33..59e27a3 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -35,6 +35,19 @@ "license": "Apache-2.0", "keywords": ["android", "clone", "feasibility", "effort-estimation", "market-analysis"], "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" } ] } diff --git a/plugins/market-research/.claude-plugin/plugin.json b/plugins/market-research/.claude-plugin/plugin.json new file mode 100644 index 0000000..655644f --- /dev/null +++ b/plugins/market-research/.claude-plugin/plugin.json @@ -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/" +} diff --git a/plugins/market-research/README.md b/plugins/market-research/README.md new file mode 100644 index 0000000..8c8ccbb --- /dev/null +++ b/plugins/market-research/README.md @@ -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-.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. diff --git a/plugins/market-research/commands/market-research.md b/plugins/market-research/commands/market-research.md new file mode 100644 index 0000000..45f9202 --- /dev/null +++ b/plugins/market-research/commands/market-research.md @@ -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-.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. diff --git a/plugins/market-research/tests/smoke-structure.sh b/plugins/market-research/tests/smoke-structure.sh new file mode 100755 index 0000000..6fa78ac --- /dev/null +++ b/plugins/market-research/tests/smoke-structure.sh @@ -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