$npx -y skills add MoizIbnYousaf/marketing-cli --skill landscape-scanScan the current market landscape and produce a ground-truth ecosystem snapshot. Chains /last30days for live research, validates with user, and writes brand/landscape.md with a Claims Blacklist that hard-gates all content generation. Use when: "landscape", "ecosystem", "market sn
| 1 | # /landscape-scan -- Ground-Truth Ecosystem Snapshot |
| 2 | |
| 3 | Every claim your marketing makes sits on top of an assumption about the market. |
| 4 | "We're the first to..." "Nobody else does..." "The market is moving toward..." |
| 5 | When these assumptions are wrong, your positioning collapses on contact with |
| 6 | reality. Customers who Google your claims and find them false don't come back. |
| 7 | |
| 8 | This skill builds a verified ecosystem snapshot that becomes the single source |
| 9 | of truth for all downstream content. The Claims Blacklist it produces hard-gates |
| 10 | every content skill -- if a claim is blacklisted, no skill writes it. Period. |
| 11 | |
| 12 | No SaaS tools needed. Live web research + user validation. |
| 13 | |
| 14 | --- |
| 15 | |
| 16 | ## On Activation |
| 17 | |
| 18 | 1. Check if `brand/` directory exists in the project root. |
| 19 | 2. If it does, read available files in priority order: |
| 20 | - `competitors.md` -- existing competitive intel (primary input) |
| 21 | - `positioning.md` -- current positioning angles and claims |
| 22 | - `audience.md` -- target market and buyer personas |
| 23 | - `voice-profile.md` -- brand personality (for tone of output) |
| 24 | - `learnings.md` -- past marketing learnings and corrections |
| 25 | 3. Apply loaded brand context to focus the landscape scan -- existing competitor |
| 26 | data narrows the research query, positioning data identifies claims to verify. |
| 27 | 4. If `brand/` does not exist or is empty, proceed without it -- this skill |
| 28 | works standalone by asking the user foundational questions. |
| 29 | |
| 30 | --- |
| 31 | |
| 32 | ## Iteration Detection |
| 33 | |
| 34 | Before starting, check whether `./brand/landscape.md` already exists. |
| 35 | |
| 36 | ### If landscape.md EXISTS --> Refresh Mode |
| 37 | |
| 38 | Do not start from scratch. Instead: |
| 39 | |
| 40 | 1. Read the existing landscape file. |
| 41 | 2. Present a summary of the current state: |
| 42 | ``` |
| 43 | EXISTING LANDSCAPE SNAPSHOT |
| 44 | Last updated {date} by /landscape-scan |
| 45 | |
| 46 | Ecosystem segments: {N} |
| 47 | Claims blacklisted: {N} |
| 48 | Market shifts tracked: {N} |
| 49 | |
| 50 | Freshness: {days} days old (threshold: 14 days) |
| 51 | |
| 52 | ------------------------------------------ |
| 53 | |
| 54 | What would you like to do? |
| 55 | |
| 56 | 1. Full refresh -- re-run /last30days, revalidate everything |
| 57 | 2. Verify claims -- check if blacklisted claims are still invalid |
| 58 | 3. Add new segment -- expand to cover a new market area |
| 59 | 4. Rebuild from scratch -- discard and start over |
| 60 | ``` |
| 61 | |
| 62 | 3. Process the user's choice: |
| 63 | - Option 1 --> Re-research with fresh /last30days query, merge with existing data |
| 64 | - Option 2 --> Focused validation of Claims Blacklist items only |
| 65 | - Option 3 --> Targeted research on a new ecosystem segment, merge into existing file |
| 66 | - Option 4 --> Full process from scratch |
| 67 | |
| 68 | 4. Before overwriting, show a diff of what changed and ask for confirmation. |
| 69 | |
| 70 | ### If landscape.md DOES NOT EXIST --> Full Scan Mode |
| 71 | |
| 72 | Proceed to the full process below. |
| 73 | |
| 74 | --- |
| 75 | |
| 76 | ## The Core Job |
| 77 | |
| 78 | Map current ecosystem reality so every downstream skill operates on verified |
| 79 | ground truth. The output has two critical components: |
| 80 | |
| 81 | 1. **Ecosystem Snapshot** -- what is actually happening in the market right now |
| 82 | (players, trends, shifts, emerging categories, consolidation, funding rounds) |
| 83 | 2. **Claims Blacklist** -- specific claims your marketing MUST NOT make because |
| 84 | they are verifiably false, outdated, or easily disproven by a customer who |
| 85 | spends 30 seconds searching |
| 86 | |
| 87 | The Claims Blacklist is not advisory. It is a hard gate. Every content-generating |
| 88 | skill reads `brand/landscape.md` and refuses to write blacklisted claims. |
| 89 | |
| 90 | --- |
| 91 | |
| 92 | ## Orchestration Flow |
| 93 | |
| 94 | ### Phase 1: Preflight |
| 95 | |
| 96 | 1. Read brand/ context files (see On Activation above). |
| 97 | 2. Detect mode: create vs refresh (see Iteration Detection above). |
| 98 | 3. Determine context level: |
| 99 | - **L0** -- No brand/ files. Need to ask everything. |
| 100 | - **L1** -- Have product name/description only. |
| 101 | - **L2** -- Have competitors.md and/or positioning.md. |
| 102 | - **L3** -- Have L2 + will run /last30days for live data. |
| 103 | - **L4** -- Have L3 + existing landscape.md (refresh mode). |
| 104 | 4. If `--dry-run` is set, report what WOULD happen and exit. Do not make any |
| 105 | network calls or write any files. |
| 106 | |
| 107 | ### Phase 2: Build Research Query |
| 108 | |
| 109 | Extract search parameters from available context: |
| 110 | |
| 111 | - **Product/Category**: from positioning.md `primary_gap` or user input |
| 112 | - **Competitors**: from competitors.md competitor names, or user input |
| 113 | - **Target market**: from audience.md `primary_persona`, or user input |
| 114 | - **Time window**: last 30 days (default), or user-specified |
| 115 | |
| 116 | Build the research query (see `references/query-templates.md` for industry-specific |
| 117 | templates). The query should cover: |
| 118 | |
| 119 | 1. Market movements -- funding, acquisitions, pivots, shu |