pabal-web-mcp 1.4.0 → 1.4.2

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
 
@@ -1430,7 +1436,7 @@ function generateKeywordLocalizationPrompt(args) {
1430
1436
  `;
1431
1437
  prompt += `2. Replace keywords in translated content (preserve structure/tone/context)
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
 
@@ -1453,7 +1459,7 @@ ${optimizedPrimary}
1453
1459
 
1454
1460
  `;
1455
1461
  if (hasPrimaryResearch) {
1456
- prompt += `**\u{1F4DA} ENGLISH (${primaryLocale}) Keywords - Use as fallback for locales without research:**
1462
+ prompt += `**\u{1F4DA} ENGLISH (${primaryLocale}) Keywords - Use as fallback for locales without research (MUST TRANSLATE to target language):**
1457
1463
  ${primaryResearchSections.join("\n")}
1458
1464
 
1459
1465
  `;
@@ -1472,35 +1478,42 @@ ${researchSections.join(
1472
1478
 
1473
1479
  `;
1474
1480
  } else if (hasPrimaryResearch) {
1475
- prompt += `### Locale ${loc}: \u26A0\uFE0F No saved research - USE ENGLISH (${primaryLocale}) KEYWORDS
1481
+ prompt += `### Locale ${loc}: \u26A0\uFE0F No saved research - TRANSLATE ENGLISH KEYWORDS TO ${loc.toUpperCase()}
1476
1482
  `;
1477
1483
  prompt += `No keyword research found at ${researchDir}.
1478
1484
  `;
1479
- prompt += `**FALLBACK:** Translate English keywords from primary locale (${primaryLocale}) into ${loc}:
1485
+ prompt += `**CRITICAL FALLBACK STRATEGY:** You MUST translate English keywords from primary locale (${primaryLocale}) into ${loc}. DO NOT use English keywords directly.
1486
+
1487
+ `;
1488
+ prompt += `**Translation Steps:**
1480
1489
  `;
1481
- prompt += `1. Take the Tier 1/2/3 keywords from English research above
1490
+ prompt += `1. Take the Tier 1/2/3 keywords from English research above (${primaryLocale})
1482
1491
  `;
1483
- prompt += `2. Translate each English keyword naturally into ${loc} (not literal translation)
1492
+ prompt += `2. **TRANSLATE each English keyword into ${loc}** - use natural, native expressions (NOT literal word-for-word translation)
1484
1493
  `;
1485
- prompt += `3. Use native expressions that ${loc} users would actually search for
1494
+ prompt += `3. Ensure translated keywords are what ${loc} users would actually search for in their language
1486
1495
  `;
1487
- prompt += `4. Verify translations are culturally appropriate
1496
+ prompt += `4. Verify translations are culturally appropriate and contextually relevant
1488
1497
  `;
1489
- prompt += `5. Apply translated keywords following the same tier strategy
1498
+ prompt += `5. Apply the **TRANSLATED** keywords (in ${loc} language) following the same tier strategy
1499
+ `;
1500
+ prompt += `6. **DO NOT use English keywords in ${loc} locale** - all keywords must be in ${loc} language
1490
1501
 
1491
1502
  `;
1492
1503
  } else {
1493
- prompt += `### Locale ${loc}: \u26A0\uFE0F No research - USE ENGLISH KEYWORDS FROM optimizedPrimary
1504
+ prompt += `### Locale ${loc}: \u26A0\uFE0F No research - TRANSLATE ENGLISH KEYWORDS FROM optimizedPrimary TO ${loc.toUpperCase()}
1505
+ `;
1506
+ prompt += `No keyword research found. Extract keywords from the optimizedPrimary JSON above and **TRANSLATE them to ${loc}**:
1494
1507
  `;
1495
- prompt += `No keyword research found. Extract keywords from the optimizedPrimary JSON above and translate them:
1508
+ prompt += `1. Extract keywords from \`aso.keywords\` in optimizedPrimary (these are in English/${primaryLocale})
1496
1509
  `;
1497
- prompt += `1. Extract keywords from \`aso.keywords\` in optimizedPrimary
1510
+ prompt += `2. **TRANSLATE each English keyword naturally into ${loc}** - use native search expressions
1498
1511
  `;
1499
- prompt += `2. Translate each English keyword naturally into ${loc}
1512
+ prompt += `3. Ensure translated keywords match what ${loc} users would actually search for
1500
1513
  `;
1501
- prompt += `3. Use native expressions that ${loc} users would actually search for
1514
+ prompt += `4. Apply the **TRANSLATED** keywords (in ${loc} language) to all ASO fields
1502
1515
  `;
1503
- prompt += `4. Apply translated keywords to all ASO fields
1516
+ prompt += `5. **DO NOT use English keywords in ${loc} locale** - all keywords must be translated to ${loc}
1504
1517
 
1505
1518
  `;
1506
1519
  }
@@ -1528,7 +1541,9 @@ ${researchSections.join(
1528
1541
  `;
1529
1542
  prompt += ` - **Do NOT translate/rename the app name**; keep the original English app name across all locales.
1530
1543
  `;
1531
- prompt += `4. Swap keywords in sentences while keeping:
1544
+ prompt += `4. Deduplicate keywords: final \`aso.keywords\` must be unique and should not repeat title/subtitle terms verbatim
1545
+ `;
1546
+ prompt += `5. Swap keywords in sentences while keeping:
1532
1547
  `;
1533
1548
  prompt += ` - Original sentence structure
1534
1549
  `;
@@ -1539,7 +1554,7 @@ ${researchSections.join(
1539
1554
  prompt += ` - Character limits
1540
1555
 
1541
1556
  `;
1542
- prompt += `4. **CRITICAL**: Update ALL \`landing\` sections:
1557
+ prompt += `6. **CRITICAL**: Update ALL \`landing\` sections:
1543
1558
  `;
1544
1559
  prompt += ` - \`landing.hero.title\` and \`landing.hero.description\`: Include keywords naturally
1545
1560
  `;
@@ -1589,9 +1604,9 @@ ${researchSections.join(
1589
1604
  `;
1590
1605
  prompt += `Process EACH locale in this batch sequentially:
1591
1606
  `;
1592
- prompt += `1. Use saved keyword research OR translate from primary locale if missing (see fallback strategy above)
1607
+ 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)
1593
1608
  `;
1594
- prompt += `2. Replace keywords in ALL fields:
1609
+ prompt += `2. Replace keywords in ALL fields (use translated keywords in target language):
1595
1610
  `;
1596
1611
  prompt += ` - \`aso.keywords\` array
1597
1612
  `;
@@ -1611,7 +1626,7 @@ ${researchSections.join(
1611
1626
  `;
1612
1627
  prompt += `3. **CRITICAL**: Ensure ALL landing fields are translated (not English)
1613
1628
  `;
1614
- prompt += `4. Validate limits
1629
+ prompt += `4. Validate limits + store rules (${FIELD_LIMITS_DOC_PATH2}) + keyword duplication (unique list; avoid repeating title/subtitle terms verbatim)
1615
1630
  `;
1616
1631
  prompt += `5. **SAVE the updated JSON to file** using save-locale-file tool
1617
1632
  `;
@@ -1647,11 +1662,11 @@ ${researchSections.join(
1647
1662
  `;
1648
1663
  prompt += `**1. Keyword Source**
1649
1664
  `;
1650
- prompt += ` - If saved research exists: Cite file(s) used; list selected top 10 keywords
1665
+ prompt += ` - If saved research exists: Cite file(s) used; list selected top 10 keywords (in target language)
1651
1666
  `;
1652
- prompt += ` - If using fallback: List translated keywords from primary locale with translation rationale
1667
+ prompt += ` - If using fallback: List **TRANSLATED** keywords from primary locale (English \u2192 target language) with translation rationale
1653
1668
  `;
1654
- prompt += ` - Show final 10 keywords in target language with tier assignments
1669
+ prompt += ` - Show final 10 keywords **IN TARGET LANGUAGE** with tier assignments - DO NOT show English keywords
1655
1670
 
1656
1671
  `;
1657
1672
  prompt += `**2. Updated JSON** (complete locale structure with keyword replacements)
@@ -1675,7 +1690,19 @@ ${researchSections.join(
1675
1690
  `;
1676
1691
  prompt += `**3. Validation**
1677
1692
  `;
1678
- prompt += ` - All fields within limits \u2713/\u2717
1693
+ prompt += ` - title: X/30 \u2713/\u2717
1694
+ `;
1695
+ prompt += ` - subtitle: X/30 \u2713/\u2717
1696
+ `;
1697
+ prompt += ` - shortDescription: X/80 \u2713/\u2717
1698
+ `;
1699
+ prompt += ` - keywords: X/100 \u2713/\u2717 (deduped \u2713/\u2717; not repeating title/subtitle)
1700
+ `;
1701
+ prompt += ` - intro: X/300 \u2713/\u2717
1702
+ `;
1703
+ prompt += ` - outro: X/200 \u2713/\u2717
1704
+ `;
1705
+ prompt += ` - Store rules (${FIELD_LIMITS_DOC_PATH2}): \u2713/\u2717
1679
1706
 
1680
1707
  `;
1681
1708
  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.0",
3
+ "version": "1.4.2",
4
4
  "type": "module",
5
5
  "description": "MCP server for ASO data management with shared types and utilities",
6
6
  "author": "skyu",