@opendirectory.dev/skills 0.1.21 → 0.1.23

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opendirectory.dev/skills",
3
- "version": "0.1.21",
3
+ "version": "0.1.23",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "bin": {
package/registry.json CHANGED
@@ -7,6 +7,14 @@
7
7
  "version": "1.0.17",
8
8
  "path": "skills/blog-cover-image-cli"
9
9
  },
10
+ {
11
+ "name": "brand-alchemy",
12
+ "description": "World-class brand strategist and naming expert.",
13
+ "tags": [],
14
+ "author": "Unknown",
15
+ "version": "0.0.1",
16
+ "path": "skills/brand-alchemy"
17
+ },
10
18
  {
11
19
  "name": "claude-md-generator",
12
20
  "description": "Read the codebase. Write a CLAUDE.md that tells Claude exactly what it needs: no more, no less.",
@@ -159,6 +167,14 @@
159
167
  "version": "1.0.0",
160
168
  "path": "skills/pr-description-writer"
161
169
  },
170
+ {
171
+ "name": "pricing-page-psychology-audit",
172
+ "description": "Audits any SaaS pricing page URL against 12 pricing psychology principles and outputs a ranked improvement report with specific rewrite suggestions...",
173
+ "tags": [],
174
+ "author": "ajaycodesitbetter",
175
+ "version": "1.0.0",
176
+ "path": "skills/pricing-page-psychology-audit"
177
+ },
162
178
  {
163
179
  "name": "producthunt-launch-kit",
164
180
  "description": "Generate every asset you need for a Product Hunt launch: listing copy, maker comment, and day-one social posts.",
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: brand-alchemy
3
+ description: World-class brand strategist and naming expert. Uses an interrogation-led discovery phase to extract your brand's DNA, then applies scientific naming frameworks (Phonosemantics) and automated multi-TLD domain checking.
4
+ ---
5
+
6
+ # Brand Alchemy: The Master Naming & Identity Skill
7
+
8
+ Welcome to **Brand Alchemy**. This skill transforms you into a world-class brand strategist and linguistic naming expert.
9
+
10
+ Instead of generating generic names, you will use elite, proven methodologies to build premium brands.
11
+
12
+ ## 📂 Skill Folder Structure & References
13
+ Before executing any branding or naming task, refer to the deep-dive documentation inside the `references/` folder of this skill. **These files are massive, elite playbooks and must be read in their entirety to execute this skill properly:**
14
+ 1. **`references/core-brand-strategy.md`**: The elite brand strategy playbook. Contains Dunford's Positioning, Category Design mechanics, Collins' Transformation framework, and Pentagram's structural identity systems.
15
+ 2. **`references/lexicon-naming-science.md`**: The exact rules of Phonosemantics (Sound Symbolism) and Morpheme blending used to name billion-dollar companies. Contains deep case studies (BlackBerry, Swiffer, Pentium).
16
+ 3. **`scripts/domain-checker.sh`**: The universal bash script for automated domain verification (.com, .ai, .in, .tech, etc.).
17
+
18
+ ---
19
+
20
+ ## 🛠️ Execution Workflow for the AI
21
+
22
+ When the user asks you to help name a brand or build a brand strategy, follow these exact steps:
23
+
24
+ ### Step 1: The Interrogation (Discovery Phase) - DO NOT SKIP
25
+ **CRITICAL:** Do NOT generate names immediately. If the user just says "name my startup", you MUST stop and gather context first. Ask them to provide details on:
26
+ 1. **The Core:** What exactly are you building or offering? How does it work?
27
+ 2. **The Audience:** Who is this for? (Be specific - who feels the pain most?).
28
+ 3. **The Alternative:** What is the customer using right now instead of you? (e.g., Spreadsheets, a competitor, nothing at all?)
29
+ 4. **The Vibe:** If your brand was a person, how would they speak? (e.g., Rebellious, clinical, warm, authoritative, witty?)
30
+
31
+ *Wait for their response before proceeding to Step 2.*
32
+
33
+ ### Step 2: Apply the Frameworks (Read the References)
34
+ - Use `Read` to deeply review `references/core-brand-strategy.md`. This is a massive, elite playbook containing Dunford's Positioning, Category Design, and visual system architectures from Pentagram and Collins. Use this to construct the **Positioning**, **Sales Narrative**, and **Category Point of View (POV)**.
35
+ - Use `Read` to deeply review `references/lexicon-naming-science.md` to apply **Phonosemantics**.
36
+ - **Execution:** Generate 20+ names using specific linguistic rules (Plosives, Fricatives, Morpheme Blending) based on their answers.
37
+ - Categorize the names (e.g., Plosive/Powerful, Fricative/Fast, Liquid/Luxury).
38
+
39
+ ### Step 3: Filter and Select (The Diamond Test)
40
+ Present the top 5-7 names. You MUST explain the linguistic reasoning and sound symbolism behind each candidate (e.g., "I used the plosive 'K' here to evoke technical precision...").
41
+ Run them through the Diamond Test: Distinctiveness, Processing Fluency, Relevance, and Energy.
42
+
43
+ ### Step 4: Universal Automated Domain Verification
44
+ You MUST NOT hallucinate domain availability. You must run the `domain-checker.sh` script located in the `scripts/` folder using the `Bash` tool. It supports all TLDs (.com, .io, .ai, .in, .tech) by utilizing a DNS NXDOMAIN primary check.
45
+
46
+ ```bash
47
+ # How to run the domain checker:
48
+ bash scripts/domain-checker.sh mybrand.com mybrand.ai mybrand.in
49
+ ```
50
+
51
+ ### Step 5: Final Recommendation
52
+ Present the final names, their linguistic breakdowns, and their verified domain availability status. Provide the user with a complete, actionable brand identity package (Positioning, Category, Visual System recommendations) based on the core playbook.
@@ -0,0 +1,148 @@
1
+ # The Core Brand Strategy Playbook: An Elite Masterclass
2
+
3
+ *This document synthesizes the foundational Lunour 4-Pillar methodology with advanced positioning from April Dunford ("Obviously Awesome"), Category Design principles ("Play Bigger"), and elite brand system architectures from studios like COLLINS, Pentagram, and Focus Lab.*
4
+
5
+ ---
6
+
7
+ ## PILLAR 1: POSITIONING & CATEGORY DESIGN
8
+
9
+ **Core premise:** Why should someone choose you over every alternative, *including doing nothing*? In B2B especially, inertia is your biggest competitor. Your positioning must break through the "status quo is fine" default.
10
+
11
+ ### 1.1 The 5-Component Framework (April Dunford)
12
+ Positioning is the "context" that makes your value obvious. It must be worked in this specific order:
13
+
14
+ 1. **Competitive Alternatives**: Start here, not with yourself. What would a customer do if you didn't exist? This includes direct competitors, indirect alternatives, internal hires, spreadsheets, or simply doing nothing. If you don't define the alternative, you cannot define your uniqueness.
15
+ 2. **Unique Attributes**: What do you do that alternatives genuinely can't match? Be ruthless. "Great customer service" isn't unique. "We deliver brand systems via an automated Aspect OS in 6 weeks" might be. These must be factual and provable.
16
+ 3. **Value for the Customer**: Not features. Value. What does the customer *get as a result*? Feature $\rightarrow$ Benefit $\rightarrow$ Value. (e.g., "Real-time sync" $\rightarrow$ "No manual data entry" $\rightarrow$ "Saves 10 hours/week for the CFO").
17
+ 4. **Target Market Characteristics**: Not everyone. The customer who loves you, pays full price, and refers others. Focus on "triggers" or "situations" (e.g., "Companies undergoing a merger").
18
+ 5. **Market Category**: The frame of reference. Are you a "B2B branding agency" or a "brand transformation studio"? The category tells people where to file you in their brain and sets their price expectations.
19
+
20
+ ### 1.2 The "From-To" Positioning Shift
21
+ To move from a generic vendor to a strategic partner, map your brand against this matrix:
22
+
23
+ | Element | From (Old/Generic) | To (New/Strategic) |
24
+ | :--- | :--- | :--- |
25
+ | **Focus** | Feature-led and highly technical | Value-led and business-outcome focused |
26
+ | **Audience** | "Everyone in the industry" | Specific, high-value Ideal Customer Profile (ICP) |
27
+ | **Competition** | Obsessing over direct product rivals | Attacking the status quo and manual workarounds |
28
+ | **Narrative** | "We do X, Y, and Z better." | "We solve the massive problem of A." |
29
+ | **Category** | Fighting in a crowded commodity space | Defining and dominating an ownable category |
30
+
31
+ ### 1.3 Category Design (Play Bigger)
32
+ Category design is about creating a new space in the market rather than competing in an existing one. To build a legendary company, you must design three things in parallel: Product Design, Company Design, and **Category Design**.
33
+
34
+ **The Point of View (POV) Narrative:**
35
+ A POV is a "thesis" about why the world has changed. It makes the competition irrelevant by changing the criteria for success.
36
+ - **The Observation**: "The world has changed in [X] way."
37
+ - **The Gap/Problem**: "Because of this change, the old way of doing [Y] is broken/expensive."
38
+ - **The Ramifications**: "If you don't fix this, [Z] bad thing will happen."
39
+ - **The Vision**: "There is a new way to think about this problem."
40
+ - **The Solution**: "We created [Category Name] to solve this new reality."
41
+
42
+ **Lightning Strikes:**
43
+ Massive, coordinated marketing events designed to grab market attention. Not just product launches—these are moments where you assert category leadership and force the market to take notice. (e.g., The Stunt Strike, The Fight Strike against an incumbent, The Functional Strike).
44
+
45
+ ---
46
+
47
+ ## PILLAR 2: MESSAGING & THE SALES NARRATIVE
48
+
49
+ If positioning is *what you stand for*, messaging is *how you say it*.
50
+ **Most common misdiagnosis:** Companies have a positioning problem they think is a messaging problem. Symptom: "People don't get what we do."
51
+
52
+ ### 2.1 The Four-Level Messaging Hierarchy
53
+
54
+ **Level 1: The One-Liner**
55
+ What you say when asked "What does your company do?" at a dinner party.
56
+ - 7–12 words maximum. No jargon.
57
+ - Name the *outcome*, not the process.
58
+ - *Bad:* "We're a digital-first strategy agency building brands."
59
+ - *Better:* "We build brands for B2B companies that want to charge more."
60
+
61
+ **Level 2: The Elevator Pitch**
62
+ 30 seconds. 3–4 sentences. Who you serve + what you do + why it matters + what makes you different. This is your website headline and LinkedIn summary.
63
+
64
+ **Level 3: The Proof Narrative**
65
+ 2–3 minutes. "Here's a company like yours. Here's what they struggled with. Here's what we did. Here's the result." Specificity builds credibility.
66
+
67
+ **Level 4: The Deep Dive**
68
+ Full methodology, process, philosophy. Blog posts, podcasts, detailed case studies.
69
+
70
+ ### 2.2 Voice and Tone
71
+ - **Voice** = Brand personality expressed through language. Consistent.
72
+ - **Tone** = How that voice adapts to context (an error message vs. a homepage headline).
73
+ - **Exercise:** Choose 3–4 voice attributes (e.g., "Direct. Confident. Warm."). Define what it IS and what it ISN'T.
74
+ - *"Confident"* = state things clearly. NOT: arrogant or dismissive.
75
+ - *"Warm"* = approachable. NOT: cutesy or overly casual.
76
+
77
+ ### 2.3 The 8-Step Sales Pitch Structure
78
+ Weaponize your positioning into a deal-closing narrative:
79
+ 1. **Insight**: Start with a unique perspective on the industry that makes your value necessary.
80
+ 2. **Alternatives**: Discuss the "Old Way" vs. "New Way." Name the trade-offs of the old way.
81
+ 3. **The Perfect World**: Define the "Ideal Solution" criteria. This must perfectly match your unique strengths.
82
+ 4. **Introduction**: Introduce your product as the "Category Leader" for that Perfect World.
83
+ 5. **Differentiated Value**: Show the 2-3 value pillars and the specific features that enable them.
84
+ 6. **Proof**: Use case studies or data.
85
+ 7. **Objections**: Proactively address the "elephant in the room" (e.g., price, implementation).
86
+ 8. **The Ask**: Recommend a specific, low-friction next step.
87
+
88
+ ---
89
+
90
+ ## PILLAR 3: VISUAL IDENTITY & STRUCTURAL ARCHITECTURE
91
+
92
+ Visual identity is the translation of strategy into something people can see and feel. It should come *after* positioning and messaging are locked.
93
+
94
+ ### 3.1 The Core Components
95
+ - **Logo/Wordmark**: The foundational mark. A logo on a white background tells you nothing; a logo on a real website tells you everything.
96
+ - **Typography (The most underrated element)**: Type choices do more heavy lifting than almost anything else. A geometric sans-serif sends a fundamentally different signal than a high-contrast serif.
97
+ - **Color Palette**: Creates an emotional response in 90 milliseconds. Map competitors' colors first to identify white space. Formula: one primary, one secondary, accents, plus a neutral.
98
+ - **Photography/Illustration**: Generic stock photography equals instant brand erosion. Guidelines must be specific: mood, lighting, direction (candid vs. camera).
99
+
100
+ ### 3.2 Pentagram’s Approach: Strategic Reduction
101
+ Pentagram focuses on finding the "purest, most potent conceptual form."
102
+ - **Empty Vessel Theory (Michael Bierut)**: A logo has no inherent meaning; it is a container that the company fills with meaning through consistent action and performance over time.
103
+ - **Kinetic Identity**: Treating "Time as Material." Identity is defined by *Behavior* (how it moves and reacts in digital spaces) rather than static appearance.
104
+ - **Headless Branding**: For decentralized communities (e.g., MIT Media Lab), using a Shared Graphic Lexicon rather than a rigid standards manual, allowing the community to safely remix the brand.
105
+
106
+ ---
107
+
108
+ ## PILLAR 4: BRAND SYSTEMS & THE "BRAND OS"
109
+
110
+ A visual identity gives you the pieces. A brand system gives you the rules for how those pieces work together. The goal is to move from static style guides to a living **Brand Operating System**.
111
+
112
+ ### 4.1 Focus Lab’s B2B Framework
113
+ Focus Lab builds systems for high-growth SaaS environments where internal teams must scale the brand independently.
114
+ - **R.E.D. Process**: Research (dive into the "Why"), Evaluation (audit brand debt), Direction (culminating in a formal *Statement of Intent*).
115
+ - **S.A.U.C.E.**: "Seek to Achieve Unforgettable Customer Experiences." An internal filter for ensuring every touchpoint (even a 404 page) reflects the brand's soul.
116
+ - **Representative UI**: A system for showcasing product interfaces at three fidelity levels: High Fidelity (exact screenshots), Mid Fidelity (simplified for marketing), and Abstract UI (geometric representations for high-level brand moments).
117
+
118
+ ### 4.2 COLLINS’ Transformation Methodology
119
+ COLLINS reframes branding as a lever for **Valuation** (Enterprise Value). They sell "Irresistible Futures."
120
+ - **Valuation Programs**: Moving beyond Product-Market Fit to command premium pricing through Repositioning, Architecture Restructuring, or Turnarounds.
121
+ - **Augments**: Add-on components that enhance a design system (e.g., a *Heritage Capsule* to revitalize dormant assets, or an *Endurance Function* to avoid trends).
122
+ - **Aspect OS**: An AI-driven "asset engine" that automates on-brand work, turning guidelines into programmable infrastructure.
123
+
124
+ ### 4.3 The Complete Brand System Deliverable
125
+ A fully realized Brand System must include:
126
+ - **Logo usage guidelines**: Clear space, size minimums, what never to do.
127
+ - **Typography system**: Weights, heading hierarchy, type pairing rules, character spacing.
128
+ - **Color system**: Ratios (how much of each), WCAG accessibility specs.
129
+ - **Grid and layout system**: Column grids for web, margins, layout templates.
130
+ - **Component library**: Buttons, cards, navigation. Where brand meets product UI.
131
+ - **Motion guidelines**: Animation principles, transitions, loading states.
132
+
133
+ ---
134
+
135
+ ## APPENDIX: ENGAGEMENT & DIY BENCHMARKS
136
+
137
+ **How to Choose a Branding Studio:**
138
+ - Look for **Portfolio AND process**. A studio that shows beautiful logos but can't describe their strategic process is a design shop, not a branding partner.
139
+ - Check for **Specialization**. A studio that brands B2B SaaS, CPG, and restaurants isn't deeply expert in any of them.
140
+ - Look for **Explicit deliverables**. "Brand identity" can mean a 1-page PDF or a comprehensive component library. Get specific.
141
+
142
+ **Investment Benchmarks:**
143
+ - *Pre-seed / Bootstrapped*: $2K–$5K (or DIY). Clean wordmark, color palette, basic templates.
144
+ - *Series A*: $15K–$40K. Strategy + core identity (sprint-style, 4-6 weeks).
145
+ - *Series B+*: $50K–$150K+. Comprehensive strategy + brand system (10-16 weeks).
146
+ - *Enterprise*: $150K–$1M+. Pentagram / Collins / Wolff Olins territory. (6-12 months).
147
+
148
+ **Rule of thumb**: Invest 5–10% of your first-year revenue target. Brand is infrastructure, not an expense.
@@ -0,0 +1,116 @@
1
+ # The Lexicon Naming Science & Phonosemantics Playbook
2
+
3
+ *This playbook details the exact methodologies, linguistic engineering techniques, and psychological sound symbolism rules pioneered by Lexicon Branding (creators of Pentium, Swiffer, BlackBerry, and Dasani).*
4
+
5
+ ---
6
+
7
+ ## 1. THE PHILOSOPHY OF SCIENTIFIC NAMING
8
+
9
+ David Placek, founder of Lexicon Branding, views a brand name not as a mere descriptor, but as a strategic tool and a "visual poem." Naming is not brainstorming; it is **linguistic engineering**.
10
+
11
+ ### Core Principles
12
+ 1. **The Brain is Lazy**: Humans prefer the familiar. A great name must bridge the gap between "new and innovative" and "safe and recognizable." It should be "surprising, but surprisingly familiar."
13
+ 2. **Cumulative Advantage**: Every time a name is typed, spoken, or searched, it should accrue mental equity. A strong name acts as a head start before a single marketing dollar is spent.
14
+ 3. **Avoid the "Safe Port"**: The biggest mistake companies make is seeking safety through literal description (e.g., naming a mop "ReadyMop" instead of "Swiffer"). Description kills imagination and makes the brand invisible in a crowded market.
15
+ 4. **The "Tension Zone"**: If everyone in the room comfortably agrees on a name, it is likely too generic. You want the tension zone—where half the team loves the name and half feels slightly uncomfortable. Tension equals energy.
16
+
17
+ ---
18
+
19
+ ## 2. THE DIAMOND FRAMEWORK & 3-STEP PROCESS
20
+
21
+ Before generating a single word, professional namers define the strategic topography of the project.
22
+
23
+ ### The Diamond Framework
24
+ Lexicon uses a four-point diamond to align stakeholders:
25
+ * **Top (Win)**: How do you define winning in this specific category?
26
+ * **Right (What we have to win)**: What is the specific prize or market share we are going after?
27
+ * **Bottom (What we need to win)**: What assets, features, or consumer perceptions are we currently missing?
28
+ * **Left (What we need to say)**: What is the single most important message the name must convey?
29
+
30
+ ### The 3-Step Engineering Process
31
+ 1. **Identify**: Deep analysis of the competitive landscape. What are the "category codes" (the typical naming conventions in the industry)? Identify these specifically to avoid them.
32
+ 2. **Invent**: Utilize small, independent creative teams working under unconventional, strict constraints. (e.g., Team A only explores "fluid" concepts using liquid consonants; Team B only explores "elemental strength" using Latin suffixes).
33
+ 3. **Implement**: Global linguistic vetting. Names are tested by PhD linguists in 50+ countries to ensure they do not possess negative slang connotations and to clear global trademarks.
34
+
35
+ ---
36
+
37
+ ## 3. ADVANCED PHONOSEMANTICS (SOUND SYMBOLISM)
38
+
39
+ The secret weapon of billion-dollar naming is **phonosemantics**—the study of how specific phonemes (sounds) trigger subconscious psychological associations in the human brain.
40
+
41
+ ### Consonant Manner (The "Vibration" of the Brand)
42
+
43
+ | Sound Class | Phonemes | Psychological Association | Brand Examples |
44
+ | :--- | :--- | :--- | :--- |
45
+ | **Plosives** | P, B, T, D, K, G | **Power, Energy & Precision**: These sounds require completely stopping the breath and then releasing it explosively. They grab attention and sound authoritative. 72% of top global brands use plosives. | **P**en**t**ium, **B**lack**B**erry, **K**oda**k**, **G**oo**g**le |
46
+ | **Fricatives** | F, V, S, Z, SH | **Speed, Agility & Sophistication**: These sounds involve continuous, forced airflow. They evoke a sense of modern friction, rapid movement, and seamlessness. | **S**wi**ff**er, **V**i**s**a, **Z**oom, **V**ercel |
47
+ | **Liquids** | L, R | **Smoothness, Fluidity & Luxury**: These sounds glide off the tongue without friction. They evoke premium, frictionless, and elegant experiences. | **R**o**l**ex, **L**o**r**ea**l**, **L**ucid |
48
+ | **Nasals** | M, N | **Comfort, Nurture & Warmth**: These sounds resonate in the nasal cavity (the "mmm" effect). They feel maternal, approachable, and safe. | **A**m**az**o**n**, **N**oom, **N**estlé |
49
+
50
+ ### Vowel Quality (The "Size" of the Brand)
51
+
52
+ * **Front Vowels (e.g., "i", "e")**: Sounds made at the front of the mouth (like "beet" or "bit").
53
+ * *Association*: Small, fast, light, sharp, and precise.
54
+ * *Examples*: W**ii**, M**i**n**i**, F**i**tb**i**t, Tw**i**tt**e**r.
55
+ * **Back Vowels (e.g., "o", "u")**: Sounds made at the back of the mouth (like "boot" or "boat").
56
+ * *Association*: Large, powerful, heavy, durable, and vast.
57
+ * *Examples*: G**oo**gl**e**, H**u**l**u**, V**o**lv**o**, B**o**se.
58
+
59
+ ---
60
+
61
+ ## 4. MORPHOLOGICAL TECHNIQUES (WORD INVENTION)
62
+
63
+ Do not just mash words together. Use structural linguistics.
64
+
65
+ 1. **Morpheme Blending (The Matrix Approach)**:
66
+ Break concepts down into prefixes (roots) and suffixes.
67
+ *Example*: For a fast deployment platform, combine roots for "Velocity" (*Ver-*) with suffixes for "Accuracy/Flow" (*-cel*). Result: **Vercel**.
68
+ *Example*: Use scientific suffixes like *-ium* to evoke elemental strength, or *-on* to evoke technical precision.
69
+ 2. **Etymological Anchoring**:
70
+ Use ancient Latin or Greek roots as "semantic anchors," but blend them with a modern English noun to make them accessible. (e.g., *GraphBase*, *Novus*).
71
+ 3. **Truncation & Fusion**:
72
+ Distilling a word to its absolute essence.
73
+ *Example*: **Verizon** (from *veritas* [truth] + *horizon*).
74
+ *Example*: **Instagram** (from *instant* + *telegram*).
75
+
76
+ ---
77
+
78
+ ## 5. DEEP CASE STUDIES IN SCIENTIFIC NAMING
79
+
80
+ Study these examples to understand how phonosemantics overrides literal meaning.
81
+
82
+ ### Case Study 1: BlackBerry (The Reliability of "B")
83
+ * **The Narrative**: In 1998, Research In Motion (RIM) had a new email device with tiny oval keys. Internal teams suggested names like "Strawberry" or "Melon."
84
+ * **The Science**: Lexicon’s linguists analyzed the sounds. "Straw-" is a slow, lingering sound that draws out the breath. They needed a "faster" fruit for a high-tech communication device.
85
+ * **The Result**: **BlackBerry**. The "B" sound is researched as the most **reliable** sound in the English language. The explosive plosives "B" and "K" created a sense of rapid, reliable energy. The "berry" suffix added a human, approachable layer to a potentially intimidating piece of enterprise technology.
86
+
87
+ ### Case Study 2: Swiffer (Killing the "Mop")
88
+ * **The Narrative**: Procter & Gamble wanted to name a new electrostatic dry-mop. Internal suggestions were descriptive: "Dr. Mop," "ReadyMop," and "MopHit."
89
+ * **The Science**: Placek instituted a hard rule: **Avoid the word "mop" like the plague.** "Mop" subconsciously evokes drudgery, dirty water, and heavy labor.
90
+ * **The Result**: **Swiffer**. It uses an onomatopoeic blend of "Swift," "Swipe," and "Whiff." It is dominated by fricatives ("S", "ff") which evoke speed and airiness. The "-er" suffix subconsciously suggests that the *tool* is doing the hard work, not the human holding it.
91
+
92
+ ### Case Study 3: Pentium (Elemental Strength)
93
+ * **The Narrative**: Intel could not trademark the number "586" for their 5th generation chip. They needed a name that sounded fundamentally powerful.
94
+ * **The Science**: Lexicon looked to the periodic table of elements.
95
+ * **The Result**: **Pentium**. "Pent-" (Greek for five) subtly signaled the 5th generation, while the suffix **"-ium"** (like Titanium, Sodium, Magnesium) made the microscopic silicon chip feel like a heavy, precious, and incredibly powerful foundational element.
96
+
97
+ ### Case Study 4: Vercel (The Daring "V")
98
+ * **The Narrative**: The startup "Zeit" (German for time) needed a rebrand. "Zeit" was hard to spell, had terrible SEO, and felt static. They needed a name that felt like a "command" for developers to build faster.
99
+ * **The Science**: Linguistically, **"V"** is identified as the most **alive, daring, and energetic** letter in the alphabet (e.g., Viagra, Corvette, Velocity).
100
+ * **The Result**: **Vercel**. A powerful portmanteau of **Versatile**, **Accelerate**, and **Excel**. It is short, globally neutral, and starts with the high-energy fricative "V" to immediately signal rapid deployment and speed.
101
+
102
+ ### Case Study 5: Dasani (The Rhythm of Health)
103
+ * **The Narrative**: Coca-Cola was entering a crowded bottled water market dominated by literal geographic names (e.g., Poland Spring, Evian).
104
+ * **The Science**: Lexicon used linguistic modeling to find phonemes that universally trigger feelings of "well-being" and "purity." They identified **"San"** (Latin root for health/sanity) as a universal trigger.
105
+ * **The Result**: **Dasani**. It utilizes a **CVCVCV** (Consonant-Vowel-Consonant-Vowel) structure. Linguistically, CVCVCV is the most natural, rhythmic, and easily processed pattern across almost all human languages. It sounds relaxing, pure, and premium without relying on a fake mountain spring backstory.
106
+
107
+ ---
108
+
109
+ ## 6. THE FINAL EVALUATION (THE DIAMOND TEST)
110
+
111
+ When you have generated your top candidates, run them through this final gauntlet:
112
+
113
+ 1. **Distinctiveness:** Does it break the category codes? (If every fintech uses "Pay[X]", are you using a completely different structure?)
114
+ 2. **Processing Fluency (Memorability):** Is it easy to say, spell, and remember? Does it follow a natural consonant-vowel rhythm?
115
+ 3. **Suggestive Relevance:** Does it create space for a brand story? It should *suggest* a feeling or benefit, not literally describe the software.
116
+ 4. **Energy (Tension):** Does it create a reaction? Is it polarizing? If it makes the user pause for half a second, it is working.
@@ -0,0 +1,42 @@
1
+ #!/bin/bash
2
+ # Universal Domain Availability Checker (Supports .com, .ai, .in, .tech, .dev, etc.)
3
+ # Uses a DNS NXDOMAIN primary check (works for ALL TLDs) with RDAP fallback.
4
+ # This script is part of the Brand Alchemy skill toolkit.
5
+
6
+ check_domain() {
7
+ local domain=$1
8
+ echo "Checking $domain..."
9
+
10
+ # Primary Check: DNS Lookup (Fastest and universally supports .ai, .in, .io, etc.)
11
+ # If the domain has no SOA record, it is almost certainly available.
12
+ if ! dig +short SOA "$domain" | grep -q "."; then
13
+ # Double check with NXDOMAIN status
14
+ if dig "$domain" | grep -q "status: NXDOMAIN"; then
15
+ echo "✅ $domain : LIKELY AVAILABLE (DNS NXDOMAIN)"
16
+ return
17
+ fi
18
+ fi
19
+
20
+ # Fallback Check: RDAP protocol
21
+ local status_code=$(curl -Ls -o /dev/null -w "%{http_code}" "https://rdap.org/domain/$domain")
22
+
23
+ if [ "$status_code" == "404" ]; then
24
+ echo "✅ $domain : AVAILABLE (404 Not Found)"
25
+ elif [ "$status_code" == "200" ]; then
26
+ echo "❌ $domain : TAKEN (200 OK or Active DNS)"
27
+ else
28
+ echo "⚠️ $domain : TAKEN or UNKNOWN (Code: $status_code, Active DNS)"
29
+ fi
30
+ }
31
+
32
+ # Ensure at least one argument is provided
33
+ if [ $# -eq 0 ]; then
34
+ echo "Usage: ./domain-checker.sh <domain1> [domain2] ..."
35
+ echo "Example: ./domain-checker.sh mybrand.com mybrand.ai mybrand.in"
36
+ exit 1
37
+ fi
38
+
39
+ # Loop through all arguments and check each domain
40
+ for domain in "$@"; do
41
+ check_domain "$domain"
42
+ done
@@ -0,0 +1,26 @@
1
+ # ─────────────────────────────────────────────────────────────
2
+ # pricing-page-psychology-audit — Environment Variables
3
+ # ─────────────────────────────────────────────────────────────
4
+ #
5
+ # NO API KEYS REQUIRED.
6
+ # This skill uses only requests + BeautifulSoup4 to scrape.
7
+ # All analysis is done by the AI agent using scraped text.
8
+ #
9
+ # ─────────────────────────────────────────────────────────────
10
+ # OPTIONAL: Proxy support (use if target site blocks direct requests)
11
+ # ─────────────────────────────────────────────────────────────
12
+
13
+ # HTTP_PROXY=http://your-proxy-host:port
14
+ # HTTPS_PROXY=http://your-proxy-host:port
15
+
16
+ # ─────────────────────────────────────────────────────────────
17
+ # OPTIONAL: Custom request timeout in seconds (default: 15)
18
+ # ─────────────────────────────────────────────────────────────
19
+
20
+ # SCRAPE_TIMEOUT=15
21
+
22
+ # ─────────────────────────────────────────────────────────────
23
+ # OPTIONAL: Custom User-Agent string (override default browser UA)
24
+ # ─────────────────────────────────────────────────────────────
25
+
26
+ # SCRAPE_USER_AGENT=Mozilla/5.0 ...
@@ -0,0 +1,166 @@
1
+ <img src="https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=1280&h=640&fit=crop&q=80" width="100%" alt="cover" />
2
+
3
+ # pricing-page-psychology-audit
4
+
5
+ > Paste any SaaS pricing page URL. Get a full audit against 12 pricing
6
+ > psychology principles — with scores, specific rewrites, and your Top 3
7
+ > Quick Wins ranked by impact.
8
+
9
+ [![opendirectory](https://img.shields.io/badge/opendirectory-skill-blue)](https://opendirectory.dev)
10
+ [![version](https://img.shields.io/badge/version-1.0.0-green)](https://github.com/Varnan-Tech/opendirectory)
11
+ [![license](https://img.shields.io/badge/license-MIT-orange)](https://opensource.org/licenses/MIT)
12
+
13
+ ---
14
+
15
+ ## What It Does
16
+
17
+ Most SaaS pricing pages leave money on the table — not because of bad pricing,
18
+ but because of bad psychology. This skill scrapes any pricing page and audits it
19
+ against 12 proven pricing psychology principles used by companies like Notion,
20
+ Linear, and Vercel.
21
+
22
+ **12 Principles Audited:**
23
+
24
+ | # | Principle | What It Checks |
25
+ |---|-----------|----------------|
26
+ | 1 | Anchoring | Is the priciest plan shown first to anchor perception? |
27
+ | 2 | Decoy Effect | Is there a tier that makes the top plan look like great value? |
28
+ | 3 | Loss Aversion Framing | Does copy use "don't lose access" vs purely gain language? |
29
+ | 4 | Feature-vs-Value Naming | Do tiers sell outcomes or just list features? |
30
+ | 5 | Social Proof Placement | Are testimonials/logos visible near the pricing tiers? |
31
+ | 6 | Urgency / Scarcity | Are there "limited time" signals or countdown elements? |
32
+ | 7 | Plan Naming Psychology | Are names aspirational (Growth, Scale) vs generic (Pro, Basic)? |
33
+ | 8 | CTA Button Copy | Do CTAs say "Start closing more deals" vs "Sign up"? |
34
+ | 9 | Free Trial vs Freemium | Is the free offer framed clearly without confusion? |
35
+ | 10 | Price Ending Tactics | Do prices end in 9 ($49) or round ($50)? |
36
+ | 11 | Visual Hierarchy | Is the recommended tier visually distinct (badge, highlight)? |
37
+ | 12 | Guarantee / Trust Signals | Is there a money-back guarantee near the CTA? |
38
+
39
+ **Output includes:**
40
+ - ✅ / ⚠️ / ❌ score per principle
41
+ - Specific rewrite suggestions per tier
42
+ - **Top 3 Quick Wins** — highest-leverage changes, prioritized by impact vs effort
43
+
44
+ ---
45
+
46
+ ## How It Works
47
+
48
+ ```
49
+ User provides URL
50
+
51
+ scripts/scrape_pricing.py fetches and extracts:
52
+ - Plan names & prices
53
+ - CTA button copy
54
+ - Feature list items
55
+ - Full visible text
56
+
57
+ AI evaluates scraped content against 12 psychology principles
58
+
59
+ Structured Markdown audit report output
60
+ + Top 3 Quick Wins
61
+ ```
62
+
63
+ ---
64
+
65
+ ## Prerequisites
66
+
67
+ - Python 3.10+
68
+ - pip packages:
69
+
70
+ ```bash
71
+ pip install requests beautifulsoup4
72
+ ```
73
+
74
+ - Works with: **Claude Code · Gemini CLI · Cursor · Antigravity**
75
+
76
+ ---
77
+
78
+ ## Install
79
+
80
+ ```bash
81
+ npx @opendirectory.dev/skills install pricing-page-psychology-audit
82
+ ```
83
+
84
+ ---
85
+
86
+ ## Usage
87
+
88
+ ### Basic audit:
89
+ ```
90
+ "Use pricing-page-psychology-audit to audit https://linear.app/pricing"
91
+ ```
92
+
93
+ ### More examples:
94
+ ```
95
+ "Audit the pricing page at https://notion.so/pricing"
96
+ "Run a psychology audit on https://vercel.com/pricing"
97
+ "What's wrong with https://stripe.com/pricing from a psychology perspective?"
98
+ ```
99
+
100
+ ---
101
+
102
+ ## Example Output
103
+
104
+ ```markdown
105
+ # Pricing Page Psychology Audit
106
+ **URL:** https://linear.app/pricing
107
+ **Audited on:** 2026-04-18
108
+ **Overall Score:** 9/12 principles passing
109
+
110
+ ---
111
+
112
+ ## Audit Results
113
+
114
+ ### 1. Anchoring — ✅ Pass
115
+ **What we found:** Enterprise plan is listed last but priced highest at
116
+ custom pricing, creating an anchor that makes the $16/seat Business plan
117
+ feel accessible.
118
+ **Suggestion:** Consider moving Enterprise to first position for stronger
119
+ anchoring effect.
120
+
121
+ ### 2. Decoy Effect — ⚠️ Needs Work
122
+ **What we found:** The Business tier exists between Free and Enterprise
123
+ but is not clearly positioned as the "sweet spot."
124
+ **Suggestion:** Add a "Most Popular" badge to Business and increase visual
125
+ size to activate the decoy effect.
126
+
127
+ [... 10 more principles ...]
128
+
129
+ ---
130
+
131
+ ## 🏆 Top 3 Quick Wins
132
+
133
+ **Quick Win #1 — CTA Button Copy**
134
+ Current: "Get started"
135
+ Rewrite to: "Start shipping faster — free"
136
+ Why: Action-outcome CTAs convert 14% higher than generic "Get started" copy.
137
+
138
+ **Quick Win #2 — Social Proof Placement**
139
+ Current: Logos shown on a separate /customers page
140
+ Rewrite to: Add 3 customer logos directly below the pricing tiers
141
+ Why: Social proof near the decision point reduces purchase anxiety.
142
+
143
+ **Quick Win #3 — Guarantee / Trust Signal**
144
+ Current: No guarantee mentioned on pricing page
145
+ Rewrite to: Add "30-day money-back guarantee. No questions asked." below CTAs
146
+ Why: Guarantees have been shown to increase conversion by up to 21%.
147
+ ```
148
+
149
+ ---
150
+
151
+ ## Project Structure
152
+
153
+ ```
154
+ pricing-page-psychology-audit/
155
+ ├── SKILL.md ← AI instructions (the brain)
156
+ ├── README.md ← This file
157
+ ├── .env.example ← No API keys required
158
+ └── scripts/
159
+ └── scrape_pricing.py ← Python scraper (requests + BeautifulSoup)
160
+ ```
161
+
162
+ ---
163
+
164
+ ## License
165
+
166
+ MIT — Built by [@ajaycodesitbetter](https://github.com/ajaycodesitbetter)
@@ -0,0 +1,154 @@
1
+ ---
2
+ name: pricing-page-psychology-audit
3
+ description: Audits any SaaS pricing page URL against 12 pricing psychology principles and outputs a ranked improvement report with specific rewrite suggestions and quick wins.
4
+ author: ajaycodesitbetter
5
+ version: 1.0.0
6
+ ---
7
+
8
+ # Pricing Page Psychology Audit
9
+
10
+ Scrape any SaaS pricing page and audit it against 12 proven pricing psychology
11
+ principles. Get a scored Markdown report with specific rewrite suggestions per
12
+ tier and a "Top 3 Quick Wins" section.
13
+
14
+ ---
15
+
16
+ ## Step 1: Get the Target URL
17
+
18
+ Ask the user:
19
+ "Which SaaS pricing page should I audit? Share the full URL
20
+ (e.g. https://linear.app/pricing)"
21
+
22
+ If no URL is provided, stop and ask. Do not proceed without a valid URL
23
+ starting with http:// or https://.
24
+
25
+ ---
26
+
27
+ ## Step 2: Run the Scraper
28
+
29
+ Run the scraper script with the URL:
30
+
31
+ ```bash
32
+ python scripts/scrape_pricing.py "URL_HERE"
33
+ ```
34
+
35
+ The script outputs structured text to stdout. Capture the output — it contains:
36
+ - Page title
37
+ - All visible text content
38
+ - Button labels (CTAs)
39
+ - Plan names and prices
40
+ - Feature list items
41
+
42
+ If the script fails (timeout, blocked, invalid URL), tell the user:
43
+ "The page could not be scraped: [error]. Try a different URL or check
44
+ if the site blocks bots."
45
+
46
+ ---
47
+
48
+ ## Step 3: Evaluate Against 12 Psychology Principles
49
+
50
+ Analyze the scraped content against each principle. For each, assign:
51
+ - ✅ Pass — clearly present and well-executed
52
+ - ⚠️ Needs Work — present but weak or could be improved
53
+ - ❌ Missing — not present at all
54
+
55
+ ### The 12 Principles:
56
+
57
+ 1. **Anchoring** — Is there a high-priced plan shown first or prominently to
58
+ make others feel cheaper?
59
+
60
+ 2. **Decoy Effect** — Is there a middle-tier plan designed to make the top
61
+ tier look like better value?
62
+
63
+ 3. **Loss Aversion Framing** — Does copy use "don't miss out", "limited",
64
+ "you'll lose access" rather than purely gain language?
65
+
66
+ 4. **Feature-vs-Value Naming** — Do plan names/descriptions highlight
67
+ outcomes ("Close more deals") vs just features ("10 seats")?
68
+
69
+ 5. **Social Proof Placement** — Are testimonials, logos, or user counts
70
+ shown near pricing tiers (not just on a separate page)?
71
+
72
+ 6. **Urgency / Scarcity Signals** — Is there a countdown timer, limited
73
+ spots badge, or "offer ends" language?
74
+
75
+ 7. **Plan Naming Psychology** — Are plan names aspirational
76
+ (Starter/Growth/Scale) vs generic (Basic/Pro/Enterprise)?
77
+
78
+ 8. **CTA Button Copy** — Do CTAs say action-outcome ("Start growing free")
79
+ vs generic ("Sign up" or "Get started")?
80
+
81
+ 9. **Free Trial vs Freemium Framing** — Is the free offer framed clearly?
82
+ Does it reduce friction or create confusion?
83
+
84
+ 10. **Price Ending Tactics** — Do prices end in 9 ($49, $99) for perceived
85
+ value, or round numbers ($50, $100) for premium feel?
86
+
87
+ 11. **Visual Hierarchy of Tiers** — Is the recommended/popular plan visually
88
+ highlighted (badge, border, size difference)?
89
+
90
+ 12. **Guarantee / Trust Signal Presence** — Is there a money-back guarantee,
91
+ "no credit card required", or security badge near the CTA?
92
+
93
+ ---
94
+
95
+ ## Step 4: Generate the Audit Report
96
+
97
+ Output the report in this exact Markdown structure:
98
+
99
+ ```
100
+ # Pricing Page Psychology Audit
101
+ **URL:** [URL]
102
+ **Audited on:** [today's date]
103
+ **Overall Score:** X/12 principles passing
104
+
105
+ ---
106
+
107
+ ## Audit Results
108
+
109
+ ### 1. Anchoring — ✅ Pass / ⚠️ Needs Work / ❌ Missing
110
+ **What we found:** [1-2 sentences from the page]
111
+ **Suggestion:** [Specific rewrite or change to make]
112
+
113
+ [Repeat for all 12 principles]
114
+
115
+ ---
116
+
117
+ ## 🏆 Top 3 Quick Wins
118
+
119
+ These are your highest-leverage changes, prioritized by impact vs effort:
120
+
121
+ **Quick Win #1 — [Principle name]**
122
+ Current: "[exact copy from page]"
123
+ Rewrite to: "[your improved version]"
124
+ Why: [1 sentence on the psychological mechanism]
125
+
126
+ **Quick Win #2 — [Principle name]**
127
+ ...
128
+
129
+ **Quick Win #3 — [Principle name]**
130
+ ...
131
+ ```
132
+
133
+ ---
134
+
135
+ ## Step 5: Self-QA Before Output
136
+
137
+ Check before presenting the report:
138
+ - [ ] All 12 principles are scored (none skipped)
139
+ - [ ] Each "Suggestion" is specific — no generic advice like "add social proof"
140
+ - [ ] Quick Wins cite actual copy from the page (not invented)
141
+ - [ ] Scores reflect what is literally present in the scraped content
142
+ - [ ] Date is today's actual date
143
+
144
+ Fix any violation before output.
145
+
146
+ ---
147
+
148
+ ## Step 6: Offer Follow-ups
149
+
150
+ After presenting the report, offer:
151
+ 1. "Export this as a PDF-ready Markdown file"
152
+ 2. "Generate rewrite copy for all CTAs on this page"
153
+ 3. "Compare against a competitor's pricing page"
154
+ 4. "Build a prioritized action plan for the dev team"
@@ -0,0 +1,318 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ scrape_pricing.py — Pricing Page Scraper
4
+ Part of: pricing-page-psychology-audit skill
5
+ Author: ajaycodesitbetter
6
+
7
+ Usage:
8
+ python scripts/scrape_pricing.py "https://linear.app/pricing"
9
+
10
+ Output:
11
+ Structured plain-text to stdout for AI analysis.
12
+ Errors are printed to stderr so stdout stays clean.
13
+ """
14
+
15
+ import os
16
+ import sys
17
+ import re
18
+ import requests
19
+ from bs4 import BeautifulSoup
20
+
21
+
22
+ # ── Constants ────────────────────────────────────────────────────────────────
23
+
24
+ TIMEOUT_SECONDS = int(os.environ.get("SCRAPE_TIMEOUT", 15))
25
+
26
+ # Browser-like headers to reduce bot-blocking (no API key needed)
27
+ HEADERS = {
28
+ "User-Agent": (
29
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
30
+ "AppleWebKit/537.36 (KHTML, like Gecko) "
31
+ "Chrome/124.0.0.0 Safari/537.36"
32
+ ),
33
+ "Accept-Language": "en-US,en;q=0.9",
34
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
35
+ }
36
+
37
+ # Allow env var override of User-Agent (e.g. for custom scraping setups)
38
+ _custom_ua = os.environ.get("SCRAPE_USER_AGENT")
39
+ if _custom_ua:
40
+ HEADERS["User-Agent"] = _custom_ua
41
+
42
+ # HTML tags that carry pricing-relevant content
43
+ CONTENT_TAGS = ["h1", "h2", "h3", "h4", "p", "li", "span", "button", "a"]
44
+
45
+
46
+ # ── Helpers ──────────────────────────────────────────────────────────────────
47
+
48
+ def clean(text: str) -> str:
49
+ """Strip extra whitespace and blank lines from a string."""
50
+ return re.sub(r"\s+", " ", text).strip()
51
+
52
+
53
+ def validate_url(url: str) -> bool:
54
+ """Return True if the URL looks valid (starts with http/https)."""
55
+ return url.startswith("http://") or url.startswith("https://")
56
+
57
+
58
+ def fetch_page(url: str) -> str:
59
+ """
60
+ Fetch the raw HTML of a URL.
61
+ Raises a descriptive RuntimeError on failure.
62
+ """
63
+ try:
64
+ response = requests.get(url, headers=HEADERS, timeout=TIMEOUT_SECONDS)
65
+ response.raise_for_status()
66
+ return response.text
67
+
68
+ except requests.exceptions.MissingSchema:
69
+ raise RuntimeError(f"Invalid URL format: '{url}'. Include http:// or https://")
70
+
71
+ except requests.exceptions.ConnectionError:
72
+ raise RuntimeError(f"Could not connect to '{url}'. Check the URL or your internet.")
73
+
74
+ except requests.exceptions.Timeout:
75
+ raise RuntimeError(f"Request timed out after {TIMEOUT_SECONDS}s for '{url}'.")
76
+
77
+ except requests.exceptions.HTTPError as e:
78
+ code = e.response.status_code
79
+ if code == 403:
80
+ raise RuntimeError(
81
+ f"Access blocked (HTTP 403) — '{url}' may have bot protection. "
82
+ "Try opening it in a browser and using the page source manually."
83
+ )
84
+ raise RuntimeError(f"HTTP error {code} for '{url}': {e}")
85
+
86
+ except requests.exceptions.RequestException as e:
87
+ raise RuntimeError(f"Unexpected request error for '{url}': {e}")
88
+
89
+
90
+ # ── Extraction ────────────────────────────────────────────────────────────────
91
+
92
+ def extract_page_title(soup: BeautifulSoup) -> str:
93
+ """Get the <title> tag text."""
94
+ tag = soup.find("title")
95
+ return clean(tag.get_text()) if tag else "No title found"
96
+
97
+
98
+ def extract_buttons(soup: BeautifulSoup) -> list:
99
+ """
100
+ Extract all button and CTA link text.
101
+ Targets <button> tags and <a> tags with common CTA class names.
102
+ """
103
+ buttons = []
104
+
105
+ # All <button> elements
106
+ for btn in soup.find_all("button"):
107
+ text = clean(btn.get_text())
108
+ if text:
109
+ buttons.append(text)
110
+
111
+ # <a> tags that look like CTAs (common class keywords)
112
+ cta_keywords = ["btn", "button", "cta", "action", "signup", "start", "trial"]
113
+ for link in soup.find_all("a", href=True):
114
+ classes = " ".join(link.get("class", [])).lower()
115
+ if any(kw in classes for kw in cta_keywords):
116
+ text = clean(link.get_text())
117
+ if text:
118
+ buttons.append(text)
119
+
120
+ # Deduplicate while preserving order
121
+ seen = set()
122
+ unique = []
123
+ for b in buttons:
124
+ if b.lower() not in seen:
125
+ seen.add(b.lower())
126
+ unique.append(b)
127
+
128
+ return unique
129
+
130
+
131
+ def extract_prices(soup: BeautifulSoup) -> list:
132
+ """
133
+ Extract price strings using regex on page text.
134
+ Catches formats like: $49, $49/mo, $49/month, EUR99, GBP19.99, Free
135
+ """
136
+ text = soup.get_text(" ", strip=True)
137
+ price_pattern = re.compile(
138
+ r"(Free|free|\$[\d,.]+(?:/\w+)?|€[\d,.]+(?:/\w+)?|£[\d,.]+(?:/\w+)?|"
139
+ r"[\d,.]+\s*(?:USD|EUR|GBP)(?:/\w+)?)"
140
+ )
141
+ matches = price_pattern.findall(text)
142
+
143
+ # Deduplicate while preserving order
144
+ seen = set()
145
+ unique = []
146
+ for m in matches:
147
+ val = m.strip()
148
+ if val.lower() not in seen:
149
+ seen.add(val.lower())
150
+ unique.append(val)
151
+
152
+ return unique
153
+
154
+
155
+ def extract_plan_names(soup: BeautifulSoup) -> list:
156
+ """
157
+ Extract likely plan/tier names from headings and elements
158
+ with pricing-related class names.
159
+ """
160
+ plan_keywords = ["plan", "tier", "pricing", "package"]
161
+ candidates = []
162
+
163
+ # Check headings inside pricing-related sections
164
+ for tag in soup.find_all(["h2", "h3", "h4"]):
165
+ parent = tag.find_parent()
166
+ parent_classes = " ".join(parent.get("class", [])).lower() if parent else ""
167
+ if any(kw in parent_classes for kw in plan_keywords):
168
+ text = clean(tag.get_text())
169
+ if text and len(text) < 50: # plan names are short
170
+ candidates.append(text)
171
+
172
+ # Also grab standalone headings that look like tier names
173
+ tier_hints = re.compile(
174
+ r"^(free|starter|basic|pro|growth|scale|business|enterprise|team|"
175
+ r"plus|premium|advanced|essentials|standard)$",
176
+ re.IGNORECASE,
177
+ )
178
+ for tag in soup.find_all(["h2", "h3", "h4", "span", "p"]):
179
+ text = clean(tag.get_text())
180
+ if tier_hints.match(text):
181
+ candidates.append(text)
182
+
183
+ # Deduplicate
184
+ seen = set()
185
+ unique = []
186
+ for c in candidates:
187
+ if c.lower() not in seen:
188
+ seen.add(c.lower())
189
+ unique.append(c)
190
+
191
+ return unique
192
+
193
+
194
+ def extract_features(soup: BeautifulSoup) -> list:
195
+ """
196
+ Extract feature list items — typically <li> elements inside
197
+ pricing card sections.
198
+ """
199
+ features = []
200
+ for li in soup.find_all("li"):
201
+ text = clean(li.get_text())
202
+ # Feature items are usually one short line
203
+ if text and 3 < len(text) < 120:
204
+ features.append(text)
205
+
206
+ # Deduplicate
207
+ seen = set()
208
+ unique = []
209
+ for f in features:
210
+ if f.lower() not in seen:
211
+ seen.add(f.lower())
212
+ unique.append(f)
213
+
214
+ return unique[:60] # Cap at 60 to keep output focused
215
+
216
+
217
+ def extract_all_text(soup: BeautifulSoup) -> str:
218
+ """
219
+ Extract all visible text in document order for full-context analysis.
220
+ Removes <script>, <style>, <nav>, <footer> noise.
221
+ """
222
+ # Remove noisy tags
223
+ for tag in soup(["script", "style", "nav", "footer", "noscript", "meta"]):
224
+ tag.decompose()
225
+
226
+ lines = []
227
+ for tag in soup.find_all(CONTENT_TAGS):
228
+ text = clean(tag.get_text())
229
+ if text and len(text) > 2:
230
+ lines.append(text)
231
+
232
+ # Deduplicate consecutive duplicates (common in SPAs)
233
+ deduped = []
234
+ prev = None
235
+ for line in lines:
236
+ if line != prev:
237
+ deduped.append(line)
238
+ prev = line
239
+
240
+ return "\n".join(deduped)
241
+
242
+
243
+ # ── Main ──────────────────────────────────────────────────────────────────────
244
+
245
+ def main():
246
+ # Validate arguments
247
+ if len(sys.argv) < 2:
248
+ print("ERROR: No URL provided.", file=sys.stderr)
249
+ print("Usage: python scripts/scrape_pricing.py <URL>", file=sys.stderr)
250
+ sys.exit(1)
251
+
252
+ url = sys.argv[1].strip()
253
+
254
+ if not validate_url(url):
255
+ print(f"ERROR: Invalid URL '{url}'. Must start with http:// or https://", file=sys.stderr)
256
+ sys.exit(1)
257
+
258
+ # Fetch the page
259
+ try:
260
+ html = fetch_page(url)
261
+ except RuntimeError as e:
262
+ print(f"ERROR: {e}", file=sys.stderr)
263
+ sys.exit(1)
264
+
265
+ # Parse HTML
266
+ soup = BeautifulSoup(html, "html.parser")
267
+
268
+ # Extract structured data
269
+ title = extract_page_title(soup)
270
+ buttons = extract_buttons(soup)
271
+ prices = extract_prices(soup)
272
+ plan_names = extract_plan_names(soup)
273
+ features = extract_features(soup)
274
+ all_text = extract_all_text(soup)
275
+
276
+ # ── Output to stdout (clean structured text for AI) ──────────────────────
277
+ separator = "\u2500" * 60
278
+
279
+ print(f"PAGE TITLE: {title}")
280
+ print(f"URL: {url}")
281
+ print(separator)
282
+
283
+ print("\n## PLAN NAMES DETECTED")
284
+ if plan_names:
285
+ for name in plan_names:
286
+ print(f" - {name}")
287
+ else:
288
+ print(" (none detected — check page structure)")
289
+
290
+ print("\n## PRICES DETECTED")
291
+ if prices:
292
+ for price in prices:
293
+ print(f" - {price}")
294
+ else:
295
+ print(" (none detected — page may use dynamic pricing)")
296
+
297
+ print("\n## CTA BUTTON TEXT")
298
+ if buttons:
299
+ for btn in buttons:
300
+ print(f" - {btn}")
301
+ else:
302
+ print(" (none detected)")
303
+
304
+ print("\n## FEATURE LIST ITEMS")
305
+ if features:
306
+ for feat in features[:30]: # Show top 30 for readability
307
+ print(f" - {feat}")
308
+ else:
309
+ print(" (none detected)")
310
+
311
+ print(f"\n{separator}")
312
+ print("## FULL PAGE TEXT (for AI analysis)")
313
+ print(separator)
314
+ print(all_text)
315
+
316
+
317
+ if __name__ == "__main__":
318
+ main()