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",
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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