pabal-web-mcp 1.4.1 → 1.4.3

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.
@@ -1318,6 +1318,10 @@ ${researchSections.join("\n")}
1318
1318
 
1319
1319
  `;
1320
1320
  prompt += `Check all limits: title \u226430, subtitle \u226430, shortDescription \u226480, keywords \u2264100, intro \u2264300, outro \u2264200
1321
+ `;
1322
+ prompt += `- Remove keyword duplicates (unique list; avoid repeating title/subtitle terms verbatim)
1323
+ `;
1324
+ prompt += `- Ensure App Store/Play Store rules from ${FIELD_LIMITS_DOC_PATH2} are satisfied (no disallowed characters/formatting)
1321
1325
 
1322
1326
  `;
1323
1327
  prompt += `## Current Data
@@ -1361,11 +1365,13 @@ ${researchSections.join("\n")}
1361
1365
  `;
1362
1366
  prompt += ` - shortDescription: X/80 \u2713/\u2717
1363
1367
  `;
1364
- prompt += ` - keywords: X/100 \u2713/\u2717
1368
+ prompt += ` - keywords: X/100 \u2713/\u2717 (deduped \u2713/\u2717)
1365
1369
  `;
1366
1370
  prompt += ` - intro: X/300 \u2713/\u2717
1367
1371
  `;
1368
1372
  prompt += ` - outro: X/200 \u2713/\u2717
1373
+ `;
1374
+ prompt += ` - Store rules (${FIELD_LIMITS_DOC_PATH2}): \u2713/\u2717
1369
1375
  `;
1370
1376
  prompt += ` - Density: X% (2.5-3%) \u2713/\u2717
1371
1377
 
@@ -1428,9 +1434,9 @@ function generateKeywordLocalizationPrompt(args) {
1428
1434
  `;
1429
1435
  prompt += `1. Use SAVED keyword research (see per-locale data below). Do NOT invent keywords.
1430
1436
  `;
1431
- prompt += `2. Replace keywords in translated content (preserve structure/tone/context)
1437
+ prompt += `2. **Replace ONLY keywords with optimized keywords** - keep ALL existing content, structure, tone, and context unchanged. Only swap keywords for better ASO keywords.
1432
1438
  `;
1433
- prompt += `3. Validate character limits
1439
+ prompt += `3. Validate character limits + store rules (${FIELD_LIMITS_DOC_PATH2}) + keyword duplication
1434
1440
  `;
1435
1441
  prompt += `4. **SAVE the updated JSON to file** using the save-locale-file tool (only if file exists)
1436
1442
 
@@ -1514,18 +1520,21 @@ ${researchSections.join(
1514
1520
  });
1515
1521
  prompt += `## Keyword Replacement Strategy
1516
1522
 
1523
+ `;
1524
+ prompt += `**CRITICAL: Keep ALL existing content unchanged. Only replace keywords with optimized keywords.**
1525
+
1517
1526
  `;
1518
1527
  prompt += `For EACH locale:
1519
1528
  `;
1520
1529
  prompt += `- Priority: Keep iOS-sourced keywords first; add Android keywords only if there is remaining space after iOS keywords fit within field limits.
1521
1530
  `;
1522
- prompt += `1. Take the TRANSLATED content (below)
1531
+ prompt += `1. Take the EXISTING translated content (below) - **DO NOT change the content itself**
1523
1532
  `;
1524
- prompt += `2. Replace \`aso.keywords\` array with new 10 keywords
1533
+ prompt += `2. Replace \`aso.keywords\` array with optimized keywords (keep same count/structure)
1525
1534
  `;
1526
1535
  prompt += `3. **TITLE FORMAT**: \`aso.title\` must follow **"App Name: Primary Keyword"** format:
1527
1536
  `;
1528
- prompt += ` - App name: **ALWAYS in English** (e.g., "Aurora EOS", "Timeline", "Recaply")
1537
+ prompt += ` - App name: **ALWAYS in English** (e.g., "Aurora EOS", "Timeline", "Recaply)
1529
1538
  `;
1530
1539
  prompt += ` - Primary keyword: **In target language** (e.g., "\uC624\uB85C\uB77C \uC608\uBCF4" for Korean, "\u30AA\u30FC\u30ED\u30E9\u4E88\u5831" for Japanese)
1531
1540
  `;
@@ -1535,49 +1544,55 @@ ${researchSections.join(
1535
1544
  `;
1536
1545
  prompt += ` - **Do NOT translate/rename the app name**; keep the original English app name across all locales.
1537
1546
  `;
1538
- prompt += `4. Swap keywords in sentences while keeping:
1547
+ prompt += ` - **Only replace the keyword part** - keep the app name and format structure unchanged
1548
+ `;
1549
+ prompt += `4. Deduplicate keywords: final \`aso.keywords\` must be unique and should not repeat title/subtitle terms verbatim
1539
1550
  `;
1540
- prompt += ` - Original sentence structure
1551
+ prompt += `5. **Replace keywords in existing sentences** - swap ONLY the keywords, keep everything else:
1541
1552
  `;
1542
- prompt += ` - Tone and messaging
1553
+ prompt += ` - **Keep original sentence structure exactly as is**
1543
1554
  `;
1544
- prompt += ` - Context and flow
1555
+ prompt += ` - **Keep original tone and messaging unchanged**
1545
1556
  `;
1546
- prompt += ` - Character limits
1557
+ prompt += ` - **Keep original context and flow unchanged**
1558
+ `;
1559
+ prompt += ` - **Only swap individual keywords** for better ASO keywords
1560
+ `;
1561
+ prompt += ` - Maintain character limits
1547
1562
 
1548
1563
  `;
1549
- prompt += `4. **CRITICAL**: Update ALL \`landing\` sections:
1564
+ prompt += `6. **CRITICAL**: Update keywords in ALL \`landing\` sections (replace keywords only, keep content structure):
1550
1565
  `;
1551
- prompt += ` - \`landing.hero.title\` and \`landing.hero.description\`: Include keywords naturally
1566
+ prompt += ` - \`landing.hero.title\` and \`landing.hero.description\`: Replace keywords only, keep existing text structure
1552
1567
  `;
1553
- prompt += ` - \`landing.screenshots.images[].title\`: Incorporate keywords in all screenshot titles
1568
+ prompt += ` - \`landing.screenshots.images[].title\`: Replace keywords in existing titles, keep structure
1554
1569
  `;
1555
- prompt += ` - \`landing.screenshots.images[].description\`: Include keywords in all screenshot descriptions
1570
+ prompt += ` - \`landing.screenshots.images[].description\`: Replace keywords in existing descriptions, keep structure
1556
1571
  `;
1557
- prompt += ` - \`landing.features.items[].title\`: Add keywords to feature titles where natural
1572
+ prompt += ` - \`landing.features.items[].title\`: Replace keywords in existing titles, keep structure
1558
1573
  `;
1559
- prompt += ` - \`landing.features.items[].body\`: Weave keywords into feature descriptions
1574
+ prompt += ` - \`landing.features.items[].body\`: Replace keywords in existing descriptions, keep structure
1560
1575
  `;
1561
- prompt += ` - \`landing.reviews.title\` and \`landing.reviews.description\`: Include keywords if applicable
1576
+ prompt += ` - \`landing.reviews.title\` and \`landing.reviews.description\`: Replace keywords if applicable, keep structure
1562
1577
  `;
1563
- prompt += ` - \`landing.cta.headline\` and \`landing.cta.description\`: Include keywords if applicable
1578
+ prompt += ` - \`landing.cta.headline\` and \`landing.cta.description\`: Replace keywords if applicable, keep structure
1564
1579
  `;
1565
- prompt += ` - Maintain original context and meaning
1580
+ prompt += ` - **Maintain ALL original context, meaning, and structure**
1566
1581
  `;
1567
- prompt += ` - Use language-specific terms that users actually search for
1582
+ prompt += ` - Use optimized keywords that users actually search for
1568
1583
  `;
1569
- prompt += ` - **DO NOT leave any landing fields in English** - all must be translated
1584
+ prompt += ` - **DO NOT rewrite or restructure content** - only replace keywords
1570
1585
 
1571
1586
  `;
1572
- prompt += `**Example**:
1587
+ prompt += `**Example** (keyword replacement only, content unchanged):
1573
1588
  `;
1574
1589
  prompt += `- Original: "Track aurora with real-time forecasts"
1575
1590
  `;
1576
- prompt += `- Korean keywords: \uC624\uB85C\uB77C, \uC608\uBCF4, \uC2E4\uC2DC\uAC04
1591
+ prompt += `- Optimized keywords: \uC624\uB85C\uB77C, \uC608\uBCF4, \uC2E4\uC2DC\uAC04
1577
1592
  `;
1578
- prompt += `- Result: "\uC2E4\uC2DC\uAC04 \uC608\uBCF4\uB85C \uC624\uB85C\uB77C \uCD94\uC801"
1593
+ prompt += `- Result: "Track \uC624\uB85C\uB77C with \uC2E4\uC2DC\uAC04 \uC608\uBCF4" (keywords replaced, structure kept)
1579
1594
  `;
1580
- prompt += ` (structure changed for Korean, but context preserved)
1595
+ prompt += ` OR: "\uC2E4\uC2DC\uAC04 \uC608\uBCF4\uB85C \uC624\uB85C\uB77C \uCD94\uC801" (if natural keyword placement requires minor word order, but keep meaning identical)
1581
1596
 
1582
1597
  `;
1583
1598
  prompt += `## Current Translated Locales (This Batch)
@@ -1598,7 +1613,7 @@ ${researchSections.join(
1598
1613
  `;
1599
1614
  prompt += `1. Use saved keyword research (in target language) OR **TRANSLATE English keywords from primary locale** if missing (see fallback strategy above - MUST translate, not use English directly)
1600
1615
  `;
1601
- prompt += `2. Replace keywords in ALL fields (use translated keywords in target language):
1616
+ prompt += `2. **Replace keywords ONLY** in ALL fields (keep existing content structure unchanged):
1602
1617
  `;
1603
1618
  prompt += ` - \`aso.keywords\` array
1604
1619
  `;
@@ -1614,11 +1629,11 @@ ${researchSections.join(
1614
1629
  `;
1615
1630
  prompt += ` - \`landing.reviews.title\` and \`landing.reviews.description\`
1616
1631
  `;
1617
- prompt += ` - \`landing.cta.headline\` and \`landing.cta.description\`
1632
+ prompt += ` - **For each field: Replace keywords only, keep existing content structure and meaning unchanged**
1618
1633
  `;
1619
1634
  prompt += `3. **CRITICAL**: Ensure ALL landing fields are translated (not English)
1620
1635
  `;
1621
- prompt += `4. Validate limits
1636
+ prompt += `4. Validate limits + store rules (${FIELD_LIMITS_DOC_PATH2}) + keyword duplication (unique list; avoid repeating title/subtitle terms verbatim)
1622
1637
  `;
1623
1638
  prompt += `5. **SAVE the updated JSON to file** using save-locale-file tool
1624
1639
  `;
@@ -1661,28 +1676,44 @@ ${researchSections.join(
1661
1676
  prompt += ` - Show final 10 keywords **IN TARGET LANGUAGE** with tier assignments - DO NOT show English keywords
1662
1677
 
1663
1678
  `;
1664
- prompt += `**2. Updated JSON** (complete locale structure with keyword replacements)
1679
+ prompt += `**2. Updated JSON** (complete locale structure with keyword replacements only)
1680
+ `;
1681
+ prompt += ` - **CRITICAL**: Keep ALL existing content structure and meaning unchanged - only replace keywords
1665
1682
  `;
1666
- prompt += ` - MUST include complete \`aso\` object
1683
+ prompt += ` - MUST include complete \`aso\` object (keywords replaced, content structure kept)
1667
1684
  `;
1668
- prompt += ` - MUST include complete \`landing\` object with ALL sections:
1685
+ prompt += ` - MUST include complete \`landing\` object with ALL sections (keywords replaced, content structure kept):
1669
1686
  `;
1670
- prompt += ` * hero (title, description, titleHighlight)
1687
+ prompt += ` * hero (title, description, titleHighlight) - replace keywords only
1671
1688
  `;
1672
- prompt += ` * screenshots.images[] (all items with translated title and description)
1689
+ prompt += ` * screenshots.images[] (all items with keywords replaced in existing titles/descriptions)
1673
1690
  `;
1674
- prompt += ` * features.items[] (all items with translated title and body)
1691
+ prompt += ` * features.items[] (all items with keywords replaced in existing titles/bodies)
1675
1692
  `;
1676
- prompt += ` * reviews (title, description, icons, rating, testimonials)
1693
+ prompt += ` * reviews (title, description, icons, rating, testimonials) - replace keywords if applicable
1677
1694
  `;
1678
- prompt += ` * cta (headline, icons, rating, description)
1695
+ prompt += ` * cta (headline, icons, rating, description) - replace keywords if applicable
1679
1696
  `;
1680
1697
  prompt += ` - **NO English text in landing sections** - everything must be translated
1698
+ `;
1699
+ prompt += ` - **DO NOT rewrite or restructure content** - only swap keywords for optimized keywords
1681
1700
 
1682
1701
  `;
1683
1702
  prompt += `**3. Validation**
1684
1703
  `;
1685
- prompt += ` - All fields within limits \u2713/\u2717
1704
+ prompt += ` - title: X/30 \u2713/\u2717
1705
+ `;
1706
+ prompt += ` - subtitle: X/30 \u2713/\u2717
1707
+ `;
1708
+ prompt += ` - shortDescription: X/80 \u2713/\u2717
1709
+ `;
1710
+ prompt += ` - keywords: X/100 \u2713/\u2717 (deduped \u2713/\u2717; not repeating title/subtitle)
1711
+ `;
1712
+ prompt += ` - intro: X/300 \u2713/\u2717
1713
+ `;
1714
+ prompt += ` - outro: X/200 \u2713/\u2717
1715
+ `;
1716
+ prompt += ` - Store rules (${FIELD_LIMITS_DOC_PATH2}): \u2713/\u2717
1686
1717
 
1687
1718
  `;
1688
1719
  prompt += `**4. File Save Confirmation**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pabal-web-mcp",
3
- "version": "1.4.1",
3
+ "version": "1.4.3",
4
4
  "type": "module",
5
5
  "description": "MCP server for ASO data management with shared types and utilities",
6
6
  "author": "skyu",