@harness-engineering/cli 1.6.2 → 1.8.0
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/dist/agents/personas/documentation-maintainer.yaml +3 -1
- package/dist/agents/personas/performance-guardian.yaml +23 -0
- package/dist/agents/personas/planner.yaml +27 -0
- package/dist/agents/personas/verifier.yaml +30 -0
- package/dist/agents/skills/claude-code/align-documentation/SKILL.md +13 -0
- package/dist/agents/skills/claude-code/cleanup-dead-code/SKILL.md +25 -1
- package/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +5 -2
- package/dist/agents/skills/claude-code/detect-doc-drift/SKILL.md +12 -0
- package/dist/agents/skills/claude-code/enforce-architecture/SKILL.md +67 -1
- package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +5 -2
- package/dist/agents/skills/claude-code/harness-accessibility/SKILL.md +281 -0
- package/dist/agents/skills/claude-code/harness-accessibility/skill.yaml +51 -0
- package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +119 -72
- package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +4 -2
- package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +76 -4
- package/dist/agents/skills/claude-code/harness-brainstorming/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +487 -234
- package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +15 -2
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/SKILL.md +226 -0
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +64 -0
- package/dist/agents/skills/claude-code/harness-dependency-health/SKILL.md +35 -6
- package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +1 -1
- package/dist/agents/skills/claude-code/harness-design/SKILL.md +265 -0
- package/dist/agents/skills/claude-code/harness-design/skill.yaml +53 -0
- package/dist/agents/skills/claude-code/harness-design-mobile/SKILL.md +336 -0
- package/dist/agents/skills/claude-code/harness-design-mobile/skill.yaml +49 -0
- package/dist/agents/skills/claude-code/harness-design-system/SKILL.md +282 -0
- package/dist/agents/skills/claude-code/harness-design-system/skill.yaml +50 -0
- package/dist/agents/skills/claude-code/harness-design-web/SKILL.md +360 -0
- package/dist/agents/skills/claude-code/harness-design-web/skill.yaml +52 -0
- package/dist/agents/skills/claude-code/harness-docs-pipeline/SKILL.md +460 -0
- package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +69 -0
- package/dist/agents/skills/claude-code/harness-execution/SKILL.md +73 -8
- package/dist/agents/skills/claude-code/harness-execution/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-hotspot-detector/SKILL.md +32 -6
- package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +1 -1
- package/dist/agents/skills/claude-code/harness-i18n/SKILL.md +484 -0
- package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +54 -0
- package/dist/agents/skills/claude-code/harness-i18n-process/SKILL.md +388 -0
- package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +43 -0
- package/dist/agents/skills/claude-code/harness-i18n-workflow/SKILL.md +512 -0
- package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +53 -0
- package/dist/agents/skills/claude-code/harness-impact-analysis/SKILL.md +51 -6
- package/dist/agents/skills/claude-code/harness-integrity/SKILL.md +35 -1
- package/dist/agents/skills/claude-code/harness-knowledge-mapper/SKILL.md +46 -5
- package/dist/agents/skills/claude-code/harness-knowledge-mapper/skill.yaml +1 -1
- package/dist/agents/skills/claude-code/harness-onboarding/SKILL.md +19 -1
- package/dist/agents/skills/claude-code/harness-perf/SKILL.md +37 -8
- package/dist/agents/skills/claude-code/harness-perf/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/harness-perf-tdd/SKILL.md +17 -4
- package/dist/agents/skills/claude-code/harness-planning/SKILL.md +57 -3
- package/dist/agents/skills/claude-code/harness-planning/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/harness-release-readiness/SKILL.md +29 -9
- package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +562 -0
- package/dist/agents/skills/claude-code/harness-roadmap/skill.yaml +43 -0
- package/dist/agents/skills/claude-code/harness-security-review/SKILL.md +36 -2
- package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +8 -6
- package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +1 -1
- package/dist/agents/skills/claude-code/harness-soundness-review/SKILL.md +1267 -0
- package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +48 -0
- package/dist/agents/skills/claude-code/harness-test-advisor/SKILL.md +35 -6
- package/dist/agents/skills/claude-code/harness-verification/SKILL.md +66 -0
- package/dist/agents/skills/claude-code/harness-verification/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-verify/SKILL.md +37 -0
- package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +15 -1
- package/dist/agents/skills/claude-code/validate-context-engineering/SKILL.md +12 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/SKILL.md +281 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/skill.yaml +51 -0
- package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +119 -72
- package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +4 -2
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/SKILL.md +226 -0
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +64 -0
- package/dist/agents/skills/gemini-cli/harness-dependency-health/SKILL.md +35 -6
- package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +1 -1
- package/dist/agents/skills/gemini-cli/harness-design/SKILL.md +265 -0
- package/dist/agents/skills/gemini-cli/harness-design/skill.yaml +53 -0
- package/dist/agents/skills/gemini-cli/harness-design-mobile/SKILL.md +336 -0
- package/dist/agents/skills/gemini-cli/harness-design-mobile/skill.yaml +49 -0
- package/dist/agents/skills/gemini-cli/harness-design-system/SKILL.md +282 -0
- package/dist/agents/skills/gemini-cli/harness-design-system/skill.yaml +50 -0
- package/dist/agents/skills/gemini-cli/harness-design-web/SKILL.md +360 -0
- package/dist/agents/skills/gemini-cli/harness-design-web/skill.yaml +52 -0
- package/dist/agents/skills/gemini-cli/harness-docs-pipeline/SKILL.md +460 -0
- package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +69 -0
- package/dist/agents/skills/gemini-cli/harness-hotspot-detector/SKILL.md +32 -6
- package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +1 -1
- package/dist/agents/skills/gemini-cli/harness-i18n/SKILL.md +484 -0
- package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +54 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-process/SKILL.md +388 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +43 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-workflow/SKILL.md +512 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +53 -0
- package/dist/agents/skills/gemini-cli/harness-impact-analysis/SKILL.md +51 -6
- package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/SKILL.md +46 -5
- package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/skill.yaml +1 -1
- package/dist/agents/skills/gemini-cli/harness-perf/SKILL.md +37 -8
- package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/harness-perf-tdd/SKILL.md +17 -4
- package/dist/agents/skills/gemini-cli/harness-release-readiness/SKILL.md +29 -9
- package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +562 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap/skill.yaml +43 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +8 -6
- package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +1 -1
- package/dist/agents/skills/gemini-cli/harness-soundness-review/SKILL.md +1267 -0
- package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +48 -0
- package/dist/agents/skills/gemini-cli/harness-test-advisor/SKILL.md +35 -6
- package/dist/agents/skills/node_modules/.bin/vitest +2 -2
- package/dist/agents/skills/shared/design-knowledge/anti-patterns/color.yaml +106 -0
- package/dist/agents/skills/shared/design-knowledge/anti-patterns/layout.yaml +109 -0
- package/dist/agents/skills/shared/design-knowledge/anti-patterns/motion.yaml +109 -0
- package/dist/agents/skills/shared/design-knowledge/anti-patterns/typography.yaml +112 -0
- package/dist/agents/skills/shared/design-knowledge/industries/creative.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/ecommerce.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/emerging-tech.yaml +83 -0
- package/dist/agents/skills/shared/design-knowledge/industries/fintech.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/healthcare.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/lifestyle.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/saas.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/services.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/palettes/curated.yaml +234 -0
- package/dist/agents/skills/shared/design-knowledge/platform-rules/android.yaml +125 -0
- package/dist/agents/skills/shared/design-knowledge/platform-rules/flutter.yaml +144 -0
- package/dist/agents/skills/shared/design-knowledge/platform-rules/ios.yaml +106 -0
- package/dist/agents/skills/shared/design-knowledge/platform-rules/web.yaml +102 -0
- package/dist/agents/skills/shared/design-knowledge/typography/pairings.yaml +274 -0
- package/dist/agents/skills/shared/i18n-knowledge/accessibility/intersection.yaml +142 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/encoding.yaml +67 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/formatting.yaml +106 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/layout.yaml +80 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/pluralization.yaml +80 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/string-handling.yaml +106 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/android-resources.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/apple-strings.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/backend-patterns.yaml +50 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/flutter-intl.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/i18next.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/react-intl.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/vue-i18n.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/ecommerce.yaml +66 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/fintech.yaml +66 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/gaming.yaml +69 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/healthcare.yaml +66 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/legal.yaml +66 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/ar.yaml +41 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/de.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/en.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/es.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/fi.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/fr.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/he.yaml +41 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/hi.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/it.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/ja.yaml +38 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/ko.yaml +38 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/nl.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/pl.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/pt.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/ru.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/sv.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/th.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/tr.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/zh-Hans.yaml +38 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/zh-Hant.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/i18next-mcp.yaml +56 -0
- package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/lingo-dev.yaml +56 -0
- package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/lokalise.yaml +60 -0
- package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/tolgee.yaml +60 -0
- package/dist/agents/skills/shared/i18n-knowledge/testing/locale-testing.yaml +107 -0
- package/dist/agents/skills/shared/i18n-knowledge/testing/pseudo-localization.yaml +86 -0
- package/dist/bin/harness.js +64 -4
- package/dist/{chunk-UDWGSL3T.js → chunk-3JWCBVUZ.js} +3 -3
- package/dist/{chunk-IUFFBBYV.js → chunk-LNI4T7R6.js} +179 -61
- package/dist/{chunk-USEYPS7F.js → chunk-SJECMKSS.js} +2250 -40
- package/dist/{dist-4MYPT3OE.js → dist-BDO5GFEM.js} +295 -14
- package/dist/{dist-RBZXXJHG.js → dist-NT3GXHQZ.js} +95 -1
- package/dist/index.d.ts +266 -7
- package/dist/index.js +7 -3
- package/dist/validate-cross-check-2OPGCGGU.js +7 -0
- package/package.json +7 -7
- package/dist/validate-cross-check-CPEPNLOD.js +0 -7
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
name: "Lingo.dev"
|
|
2
|
+
description: "AI-powered translation platform with brand voice consistency, multi-engine machine translation, and glossary management"
|
|
3
|
+
mcp_server_id: "lingo-dev-mcp"
|
|
4
|
+
source: "https://github.com/anthropics/lingo-dev-mcp"
|
|
5
|
+
|
|
6
|
+
capabilities:
|
|
7
|
+
- name: "Multi-Engine Machine Translation"
|
|
8
|
+
description: "Translate content using multiple AI/MT engines with quality comparison"
|
|
9
|
+
tools: ["translate_text", "translate_file", "batch_translate"]
|
|
10
|
+
- name: "Glossary Management"
|
|
11
|
+
description: "Manage terminology glossaries to ensure translation consistency"
|
|
12
|
+
tools: ["create_glossary_term", "list_glossary", "update_glossary_term"]
|
|
13
|
+
- name: "Brand Voice Consistency"
|
|
14
|
+
description: "Configure and enforce brand voice profiles for translations"
|
|
15
|
+
tools: ["set_brand_voice", "check_brand_consistency"]
|
|
16
|
+
- name: "Translation Memory"
|
|
17
|
+
description: "Leverage previously approved translations for consistency and cost savings"
|
|
18
|
+
tools: ["search_translation_memory", "add_to_translation_memory"]
|
|
19
|
+
|
|
20
|
+
when_to_use:
|
|
21
|
+
- scenario: "Team needs high-quality machine translation with terminology consistency"
|
|
22
|
+
reason: "Lingo.dev specializes in AI translation quality with glossary enforcement and brand voice"
|
|
23
|
+
- scenario: "Project has established brand terminology that must be preserved across languages"
|
|
24
|
+
reason: "Glossary management ensures product names, features, and key terms are translated consistently"
|
|
25
|
+
- scenario: "Rapid iteration with frequent string changes"
|
|
26
|
+
reason: "AI translation with translation memory enables fast turnaround without waiting for human translators"
|
|
27
|
+
|
|
28
|
+
when_not_to_use:
|
|
29
|
+
- scenario: "Content requiring certified or sworn translations (legal, medical)"
|
|
30
|
+
reason: "AI translation, even high quality, does not meet certification requirements for regulated content"
|
|
31
|
+
- scenario: "Team prefers full human translation workflow"
|
|
32
|
+
reason: "Lingo.dev's value proposition centers on AI translation; pure human workflows are better served by a traditional TMS"
|
|
33
|
+
|
|
34
|
+
integration_patterns:
|
|
35
|
+
- pattern: "Harness workflow with Lingo.dev for rapid translation"
|
|
36
|
+
description: "Use Lingo.dev MCP tools to translate new strings immediately, then queue for human review"
|
|
37
|
+
config_example: |
|
|
38
|
+
// harness.config.json
|
|
39
|
+
{
|
|
40
|
+
"mcp": {
|
|
41
|
+
"servers": {
|
|
42
|
+
"lingo-dev": {
|
|
43
|
+
"command": "npx",
|
|
44
|
+
"args": ["-y", "@anthropic/lingo-dev-mcp"],
|
|
45
|
+
"env": {
|
|
46
|
+
"LINGO_API_KEY": "<your-api-key>"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
limitations:
|
|
54
|
+
- "AI translation quality varies by language pair; low-resource languages may have lower quality"
|
|
55
|
+
- "Brand voice enforcement requires initial setup and training on existing approved translations"
|
|
56
|
+
- "Translation memory benefits increase over time; initial runs have no prior context"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
name: "Lokalise"
|
|
2
|
+
description: "Enterprise translation management system with team collaboration, branching, QA checks, and extensive integration ecosystem"
|
|
3
|
+
mcp_server_id: "lokalise-mcp"
|
|
4
|
+
source: "https://github.com/anthropics/lokalise-mcp"
|
|
5
|
+
|
|
6
|
+
capabilities:
|
|
7
|
+
- name: "Key Management"
|
|
8
|
+
description: "Create, update, delete, and filter translation keys with tags and platform labels"
|
|
9
|
+
tools: ["create_key", "update_key", "delete_key", "list_keys", "bulk_update_keys"]
|
|
10
|
+
- name: "File Operations"
|
|
11
|
+
description: "Upload source files and download translated files in any format"
|
|
12
|
+
tools: ["upload_file", "download_files", "list_files"]
|
|
13
|
+
- name: "Task Management"
|
|
14
|
+
description: "Create and manage translation tasks for team members and external translators"
|
|
15
|
+
tools: ["create_task", "list_tasks", "complete_task"]
|
|
16
|
+
- name: "Branching"
|
|
17
|
+
description: "Create and merge translation branches aligned with code branches"
|
|
18
|
+
tools: ["create_branch", "merge_branch", "list_branches"]
|
|
19
|
+
- name: "QA Checks"
|
|
20
|
+
description: "Run automated quality assurance checks on translations (placeholders, length, glossary)"
|
|
21
|
+
tools: ["run_qa_checks", "get_qa_results"]
|
|
22
|
+
|
|
23
|
+
when_to_use:
|
|
24
|
+
- scenario: "Larger team with multiple translators and complex review workflows"
|
|
25
|
+
reason: "Lokalise excels at team collaboration with task assignment, review stages, and comments"
|
|
26
|
+
- scenario: "Project with release branching that needs translation branching to match"
|
|
27
|
+
reason: "Lokalise's branching model maps to git branches, keeping translations in sync with code releases"
|
|
28
|
+
- scenario: "Enterprise requiring SOC 2 compliance and uptime SLA"
|
|
29
|
+
reason: "Lokalise offers enterprise security certifications and guaranteed uptime SLAs"
|
|
30
|
+
|
|
31
|
+
when_not_to_use:
|
|
32
|
+
- scenario: "Small team or solo developer with simple translation needs"
|
|
33
|
+
reason: "Lokalise's enterprise features add complexity; simpler tools like Tolgee may be more appropriate"
|
|
34
|
+
- scenario: "Team wanting self-hosted translation infrastructure"
|
|
35
|
+
reason: "Lokalise is cloud-only; use Tolgee or Weblate for self-hosted requirements"
|
|
36
|
+
|
|
37
|
+
integration_patterns:
|
|
38
|
+
- pattern: "Harness workflow with Lokalise for enterprise translation management"
|
|
39
|
+
description: "Use Lokalise MCP tools to sync translation keys with code changes, create tasks for translators, and download completed translations"
|
|
40
|
+
config_example: |
|
|
41
|
+
// harness.config.json
|
|
42
|
+
{
|
|
43
|
+
"mcp": {
|
|
44
|
+
"servers": {
|
|
45
|
+
"lokalise": {
|
|
46
|
+
"command": "npx",
|
|
47
|
+
"args": ["-y", "@anthropic/lokalise-mcp"],
|
|
48
|
+
"env": {
|
|
49
|
+
"LOKALISE_API_TOKEN": "<your-api-token>",
|
|
50
|
+
"LOKALISE_PROJECT_ID": "<your-project-id>"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
limitations:
|
|
58
|
+
- "Per-seat pricing can be expensive for large teams"
|
|
59
|
+
- "API rate limits may affect large batch operations via MCP"
|
|
60
|
+
- "Branch merging requires manual conflict resolution for overlapping translations"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
name: "Tolgee"
|
|
2
|
+
description: "Open-source translation management system with in-context editing, AI translation, and comprehensive MCP server exposing 59 tools"
|
|
3
|
+
mcp_server_id: "tolgee-mcp"
|
|
4
|
+
source: "https://github.com/tolgee/tolgee-mcp"
|
|
5
|
+
|
|
6
|
+
capabilities:
|
|
7
|
+
- name: "Project Management"
|
|
8
|
+
description: "Create, list, and manage translation projects"
|
|
9
|
+
tools: ["create_project", "list_projects", "get_project"]
|
|
10
|
+
- name: "Key Management"
|
|
11
|
+
description: "Create, update, delete, and search translation keys with namespace support"
|
|
12
|
+
tools: ["create_key", "update_key", "delete_key", "search_keys", "import_keys"]
|
|
13
|
+
- name: "Translation Operations"
|
|
14
|
+
description: "Get, set, and batch-update translations per locale"
|
|
15
|
+
tools: ["get_translations", "set_translation", "batch_set_translations"]
|
|
16
|
+
- name: "Screenshot Management"
|
|
17
|
+
description: "Upload and manage screenshots linked to translation keys for translator context"
|
|
18
|
+
tools: ["upload_screenshot", "get_screenshots", "delete_screenshot"]
|
|
19
|
+
- name: "Import/Export"
|
|
20
|
+
description: "Import and export translation files in various formats (JSON, XLIFF, PO, etc.)"
|
|
21
|
+
tools: ["import_file", "export_translations"]
|
|
22
|
+
|
|
23
|
+
when_to_use:
|
|
24
|
+
- scenario: "Team wants a self-hosted TMS with developer-friendly workflow"
|
|
25
|
+
reason: "Tolgee can be self-hosted (Docker) and provides in-context editing for developers to see translations in the actual UI"
|
|
26
|
+
- scenario: "Project needs AI-assisted translation with human review"
|
|
27
|
+
reason: "Tolgee integrates AI translation providers while maintaining a human review workflow"
|
|
28
|
+
- scenario: "Small to medium team without budget for enterprise TMS"
|
|
29
|
+
reason: "Open-source core with generous free tier; self-hosting eliminates per-seat costs"
|
|
30
|
+
|
|
31
|
+
when_not_to_use:
|
|
32
|
+
- scenario: "Enterprise requiring SOC 2 compliance and SLA guarantees"
|
|
33
|
+
reason: "Self-hosted requires managing your own infrastructure and compliance; Tolgee Cloud has fewer enterprise certifications than Lokalise"
|
|
34
|
+
- scenario: "Project with complex branching/versioning workflows"
|
|
35
|
+
reason: "Tolgee's branching support is less mature than Lokalise or Crowdin for complex release management"
|
|
36
|
+
|
|
37
|
+
integration_patterns:
|
|
38
|
+
- pattern: "Harness workflow with Tolgee MCP for key management"
|
|
39
|
+
description: "Use Tolgee MCP tools during the i18n audit phase to check translation coverage and create missing keys"
|
|
40
|
+
config_example: |
|
|
41
|
+
// harness.config.json
|
|
42
|
+
{
|
|
43
|
+
"mcp": {
|
|
44
|
+
"servers": {
|
|
45
|
+
"tolgee": {
|
|
46
|
+
"command": "npx",
|
|
47
|
+
"args": ["-y", "@anthropic/tolgee-mcp"],
|
|
48
|
+
"env": {
|
|
49
|
+
"TOLGEE_API_URL": "https://app.tolgee.io",
|
|
50
|
+
"TOLGEE_API_KEY": "<your-api-key>"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
limitations:
|
|
58
|
+
- "59 MCP tools may cause token overhead in LLM context; consider filtering to used capabilities"
|
|
59
|
+
- "Self-hosted instance requires Docker and PostgreSQL infrastructure"
|
|
60
|
+
- "In-context editing SDK adds bundle size to the frontend application"
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
description: "Locale testing techniques — systematic approaches to verify i18n correctness across real locales"
|
|
2
|
+
|
|
3
|
+
techniques:
|
|
4
|
+
- name: "Functional testing per locale"
|
|
5
|
+
description: "Run functional test suites with different locale configurations to verify locale-dependent behavior"
|
|
6
|
+
catches:
|
|
7
|
+
- "Form submission failures with locale-formatted input (commas vs periods in numbers)"
|
|
8
|
+
- "Date picker displaying wrong format or first day of week"
|
|
9
|
+
- "Number input rejecting valid locale-formatted values"
|
|
10
|
+
- "Sort order bugs with locale-specific collation"
|
|
11
|
+
implementation:
|
|
12
|
+
approach: "Parameterize functional tests with locale fixtures; run core user flows per locale"
|
|
13
|
+
tools: ["Playwright with locale option", "Cypress with cy.clock locale", "Jest with Intl mocks"]
|
|
14
|
+
example: |
|
|
15
|
+
// Playwright locale-parameterized test
|
|
16
|
+
for (const locale of ['en-US', 'de-DE', 'ja-JP', 'ar-SA']) {
|
|
17
|
+
test(`checkout flow works in ${locale}`, async ({ browser }) => {
|
|
18
|
+
const context = await browser.newContext({ locale });
|
|
19
|
+
const page = await context.newPage();
|
|
20
|
+
// ... test checkout flow
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
when_to_use: "In CI pipeline for every PR that touches i18n-sensitive code"
|
|
24
|
+
automation: "Run locale matrix in CI: en-US (baseline), de-DE (expansion), ja-JP (CJK), ar-SA (RTL)"
|
|
25
|
+
|
|
26
|
+
- name: "Visual regression testing across locales"
|
|
27
|
+
description: "Capture screenshots per locale and compare against baselines to detect text overflow and layout shifts"
|
|
28
|
+
catches:
|
|
29
|
+
- "Text overflow from translation expansion"
|
|
30
|
+
- "RTL layout mirroring regressions"
|
|
31
|
+
- "Font rendering differences across locales"
|
|
32
|
+
- "Container height changes from multi-line wrapping"
|
|
33
|
+
implementation:
|
|
34
|
+
approach: "Run visual regression tool with locale-specific baselines; flag visual differences above threshold"
|
|
35
|
+
tools: ["Playwright screenshot comparison", "Percy", "Chromatic", "BackstopJS"]
|
|
36
|
+
example: |
|
|
37
|
+
// Capture screenshots for visual comparison
|
|
38
|
+
for (const locale of ['en', 'de', 'ar', 'ja']) {
|
|
39
|
+
await page.goto(`/?locale=${locale}`);
|
|
40
|
+
await expect(page).toHaveScreenshot(`homepage-${locale}.png`);
|
|
41
|
+
}
|
|
42
|
+
when_to_use: "In CI for PRs that touch layout, typography, or translation files"
|
|
43
|
+
automation: "Maintain per-locale visual baselines; auto-update baselines when translations change"
|
|
44
|
+
|
|
45
|
+
- name: "Boundary locale testing"
|
|
46
|
+
description: "Test with the most extreme locales to find edge cases: longest translations, most plural forms, RTL"
|
|
47
|
+
catches:
|
|
48
|
+
- "Worst-case text expansion overflow (German/Finnish)"
|
|
49
|
+
- "Complex pluralization bugs (Arabic with 6 forms)"
|
|
50
|
+
- "Bidi rendering issues (Arabic RTL)"
|
|
51
|
+
- "CJK-specific line breaking and width issues (Japanese)"
|
|
52
|
+
implementation:
|
|
53
|
+
approach: "Select boundary locales that represent extremes: de (long), fi (longest), ar (RTL + 6 plurals), ja (CJK)"
|
|
54
|
+
tools: ["Any test framework with locale configuration"]
|
|
55
|
+
example: |
|
|
56
|
+
// Boundary locale set for maximum coverage
|
|
57
|
+
const BOUNDARY_LOCALES = {
|
|
58
|
+
'de': 'Longest Western European text expansion',
|
|
59
|
+
'fi': 'Extreme expansion with agglutinative grammar',
|
|
60
|
+
'ar': 'RTL + 6 plural forms + letter reshaping',
|
|
61
|
+
'ja': 'CJK no-space + multiple scripts + contraction',
|
|
62
|
+
'th': 'Dictionary-based line breaking + stacking diacritics',
|
|
63
|
+
};
|
|
64
|
+
when_to_use: "For every release; as smoke test in CI for i18n-related changes"
|
|
65
|
+
automation: "Run boundary locale tests as a required CI check; block release if any boundary locale fails"
|
|
66
|
+
|
|
67
|
+
- name: "Input method testing"
|
|
68
|
+
description: "Test text input with locale-specific input methods (CJK IME, Arabic keyboard, Devanagari input)"
|
|
69
|
+
catches:
|
|
70
|
+
- "IME composition events not handled (text appears garbled during CJK input)"
|
|
71
|
+
- "Keyboard layout assumptions (QWERTY vs AZERTY vs others)"
|
|
72
|
+
- "Input field not accepting non-Latin characters"
|
|
73
|
+
- "Search and filter not working with IME-composed text"
|
|
74
|
+
implementation:
|
|
75
|
+
approach: "Use Playwright's keyboard IME simulation or manual testing with actual input methods"
|
|
76
|
+
tools: ["Playwright keyboard API", "BrowserStack with device keyboards", "manual testing with OS IME"]
|
|
77
|
+
example: |
|
|
78
|
+
// Test CJK IME input in Playwright
|
|
79
|
+
await page.locator('input[name="search"]').click();
|
|
80
|
+
await page.keyboard.imeSetComposition('にほん', 3, 3);
|
|
81
|
+
await page.keyboard.imeCommit();
|
|
82
|
+
// Verify search results include Japanese text
|
|
83
|
+
when_to_use: "Before releasing to CJK, Arabic, or Devanagari markets; for search and text input features"
|
|
84
|
+
automation: "Include IME input tests in smoke test suite for markets with non-Latin input methods"
|
|
85
|
+
|
|
86
|
+
- name: "Locale switching testing"
|
|
87
|
+
description: "Test runtime locale change without page reload to verify all components update correctly"
|
|
88
|
+
catches:
|
|
89
|
+
- "Components that cache translated text and do not re-render on locale change"
|
|
90
|
+
- "Date/number formatters that initialize once and do not update"
|
|
91
|
+
- "Stale translations in error messages or toast notifications"
|
|
92
|
+
- "Layout direction not updating when switching between LTR and RTL locales"
|
|
93
|
+
implementation:
|
|
94
|
+
approach: "Switch locale at runtime and verify all visible text, formatting, and layout update"
|
|
95
|
+
tools: ["Framework-specific locale switching API", "Playwright for E2E verification"]
|
|
96
|
+
example: |
|
|
97
|
+
// Test locale switching
|
|
98
|
+
await page.click('[data-testid="language-selector"]');
|
|
99
|
+
await page.click('[data-value="ar"]');
|
|
100
|
+
// Verify RTL layout applied
|
|
101
|
+
const dir = await page.getAttribute('html', 'dir');
|
|
102
|
+
expect(dir).toBe('rtl');
|
|
103
|
+
// Verify translated content
|
|
104
|
+
const heading = await page.textContent('h1');
|
|
105
|
+
expect(heading).toMatch(/[\u0600-\u06FF]/); // Arabic characters
|
|
106
|
+
when_to_use: "When the app supports runtime locale switching; after changes to locale provider or context"
|
|
107
|
+
automation: "Include locale switching in E2E test suite; test switching from LTR to RTL and back"
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
description: "Pseudo-localization testing techniques — automated methods to detect i18n issues without real translations"
|
|
2
|
+
|
|
3
|
+
techniques:
|
|
4
|
+
- name: "Accent character replacement"
|
|
5
|
+
description: "Replace ASCII characters with accented Unicode equivalents (a to a, e to e, etc.) to simulate translated text"
|
|
6
|
+
catches:
|
|
7
|
+
- "Hardcoded strings missed by extraction tools (they remain in plain ASCII)"
|
|
8
|
+
- "Character encoding issues (accented characters display as mojibake)"
|
|
9
|
+
- "Font coverage gaps (missing glyphs for accented characters)"
|
|
10
|
+
- "String comparison bugs (accented versions fail equality checks)"
|
|
11
|
+
implementation:
|
|
12
|
+
approach: "Transform each ASCII letter to its accented equivalent using a lookup table"
|
|
13
|
+
tools: ["pseudo-localization (npm)", "@formatjs/cli --pseudo-locale xx-AC"]
|
|
14
|
+
example: |
|
|
15
|
+
// Input: "Hello, World!"
|
|
16
|
+
// Output: "[Ĥéĺĺö, Ŵöŕĺð!]"
|
|
17
|
+
import { pseudoLocalize } from 'pseudo-localization';
|
|
18
|
+
const pseudo = pseudoLocalize('Hello, World!');
|
|
19
|
+
when_to_use: "During development, before real translations are available"
|
|
20
|
+
automation: "Generate pseudo-locale as part of the build pipeline; run visual regression tests against it"
|
|
21
|
+
|
|
22
|
+
- name: "Text expansion padding"
|
|
23
|
+
description: "Add extra characters to simulate the text expansion that occurs in verbose languages (German, Finnish)"
|
|
24
|
+
catches:
|
|
25
|
+
- "Fixed-width layout overflow"
|
|
26
|
+
- "Text truncation in buttons, labels, and navigation"
|
|
27
|
+
- "Container height overflow from multi-line wrapping"
|
|
28
|
+
- "Tooltip and popup sizing issues"
|
|
29
|
+
implementation:
|
|
30
|
+
approach: "Pad translated strings with repeated characters to simulate 35-40% expansion"
|
|
31
|
+
tools: ["pseudo-localization (npm)", "custom expansion generator"]
|
|
32
|
+
example: |
|
|
33
|
+
// Input: "Settings" (8 chars)
|
|
34
|
+
// Output with 35% expansion: "Settingsxxx" (11 chars)
|
|
35
|
+
// Realistic: "[Séţţîñĝšxxxxx]" (accent + expansion)
|
|
36
|
+
when_to_use: "Before UI review; especially before locking down layout dimensions"
|
|
37
|
+
automation: "Include expansion pseudo-locale in visual regression test suite"
|
|
38
|
+
|
|
39
|
+
- name: "Bracket wrapping"
|
|
40
|
+
description: "Wrap each translated string with brackets [like this] to reveal concatenation boundaries"
|
|
41
|
+
catches:
|
|
42
|
+
- "String concatenation (brackets break across concatenation: '[Hello, ][World!]' instead of '[Hello, World!]')"
|
|
43
|
+
- "Strings assembled from multiple translation calls"
|
|
44
|
+
- "Missing translations (bracketed strings are visually distinct)"
|
|
45
|
+
implementation:
|
|
46
|
+
approach: "Prepend '[' and append ']' to every translated string"
|
|
47
|
+
tools: ["pseudo-localization (npm)", "custom i18next post-processor"]
|
|
48
|
+
example: |
|
|
49
|
+
// Correct: "[Hello, World!]"
|
|
50
|
+
// Concatenation bug: "[Hello, ]" + "[World!]"
|
|
51
|
+
// The broken brackets reveal the concatenation point
|
|
52
|
+
when_to_use: "During string extraction audit; verifying all strings go through translation pipeline"
|
|
53
|
+
automation: "Enable bracket wrapping in development/staging environments as a QA overlay"
|
|
54
|
+
|
|
55
|
+
- name: "Mirror/bidi simulation"
|
|
56
|
+
description: "Reverse text direction to simulate RTL layout without needing a real RTL locale"
|
|
57
|
+
catches:
|
|
58
|
+
- "Layout mirroring issues (margins, padding, flex direction)"
|
|
59
|
+
- "Icon placement that should or should not mirror"
|
|
60
|
+
- "CSS left/right vs logical properties usage"
|
|
61
|
+
- "Mixed-direction text rendering problems"
|
|
62
|
+
implementation:
|
|
63
|
+
approach: "Apply dir='rtl' to the document and reverse string characters for visual simulation"
|
|
64
|
+
tools: ["@formatjs/cli --pseudo-locale xx-HA", "Android ar-XB pseudolocale"]
|
|
65
|
+
example: |
|
|
66
|
+
// Input: "Hello, World!"
|
|
67
|
+
// Output: "!dlroW ,olleH" (reversed for visual RTL simulation)
|
|
68
|
+
// Combined with accent: "[!ðĺŕöŴ ,öĺĺéĤ]"
|
|
69
|
+
when_to_use: "Before adding RTL locale support; during RTL layout review"
|
|
70
|
+
automation: "Include bidi pseudo-locale in visual regression tests alongside standard pseudo-locale"
|
|
71
|
+
|
|
72
|
+
- name: "Placeholder preservation verification"
|
|
73
|
+
description: "Verify that interpolation placeholders ({variable}, {{variable}}, %s) survive pseudo-localization intact"
|
|
74
|
+
catches:
|
|
75
|
+
- "Broken interpolation from accent-replacing characters inside placeholders"
|
|
76
|
+
- "Format string corruption from text transformation"
|
|
77
|
+
- "Missing placeholder values at runtime"
|
|
78
|
+
implementation:
|
|
79
|
+
approach: "Pseudo-localize text while preserving content inside interpolation markers"
|
|
80
|
+
tools: ["pseudo-localization (npm) with placeholder regex", "custom preserving transformer"]
|
|
81
|
+
example: |
|
|
82
|
+
// Input: "Hello, {name}! You have {count} items."
|
|
83
|
+
// Correct: "[Ĥéĺĺö, {name}! Ýöû ĥàvé {count} îţéḿš.]"
|
|
84
|
+
// Wrong: "[Ĥéĺĺö, {ñàḿé}! Ýöû ĥàvé {çöûñţ} îţéḿš.]"
|
|
85
|
+
when_to_use: "When configuring pseudo-localization pipeline; validating custom pseudo generators"
|
|
86
|
+
automation: "Add unit test that pseudo-localizes all messages and verifies placeholders are preserved"
|
package/dist/bin/harness.js
CHANGED
|
@@ -1,20 +1,80 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
createProgram
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
createProgram,
|
|
4
|
+
findConfigFile,
|
|
5
|
+
loadConfig
|
|
6
|
+
} from "../chunk-LNI4T7R6.js";
|
|
7
|
+
import "../chunk-3JWCBVUZ.js";
|
|
8
|
+
import {
|
|
9
|
+
VERSION,
|
|
10
|
+
getUpdateNotification,
|
|
11
|
+
isUpdateCheckEnabled,
|
|
12
|
+
readCheckState,
|
|
13
|
+
shouldRunCheck,
|
|
14
|
+
spawnBackgroundCheck
|
|
15
|
+
} from "../chunk-SJECMKSS.js";
|
|
7
16
|
import {
|
|
8
17
|
handleError
|
|
9
18
|
} from "../chunk-ACMDUQJG.js";
|
|
10
19
|
|
|
20
|
+
// src/bin/update-check-hooks.ts
|
|
21
|
+
var DEFAULT_INTERVAL_MS = 864e5;
|
|
22
|
+
var cachedConfigInterval = null;
|
|
23
|
+
function readConfigInterval() {
|
|
24
|
+
if (cachedConfigInterval !== null) return cachedConfigInterval;
|
|
25
|
+
try {
|
|
26
|
+
const findResult = findConfigFile();
|
|
27
|
+
if (!findResult.ok) {
|
|
28
|
+
cachedConfigInterval = void 0;
|
|
29
|
+
return void 0;
|
|
30
|
+
}
|
|
31
|
+
const configResult = loadConfig(findResult.value);
|
|
32
|
+
if (!configResult.ok) {
|
|
33
|
+
cachedConfigInterval = void 0;
|
|
34
|
+
return void 0;
|
|
35
|
+
}
|
|
36
|
+
const val = configResult.value.updateCheckInterval;
|
|
37
|
+
cachedConfigInterval = val;
|
|
38
|
+
return val;
|
|
39
|
+
} catch {
|
|
40
|
+
cachedConfigInterval = void 0;
|
|
41
|
+
return void 0;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function runUpdateCheckAtStartup() {
|
|
45
|
+
try {
|
|
46
|
+
const configInterval = readConfigInterval();
|
|
47
|
+
if (!isUpdateCheckEnabled(configInterval)) return;
|
|
48
|
+
const state = readCheckState();
|
|
49
|
+
const interval = configInterval ?? DEFAULT_INTERVAL_MS;
|
|
50
|
+
if (!shouldRunCheck(state, interval)) return;
|
|
51
|
+
spawnBackgroundCheck(VERSION);
|
|
52
|
+
} catch {
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function printUpdateNotification() {
|
|
56
|
+
try {
|
|
57
|
+
const configInterval = readConfigInterval();
|
|
58
|
+
if (!isUpdateCheckEnabled(configInterval)) return;
|
|
59
|
+
const message = getUpdateNotification(VERSION);
|
|
60
|
+
if (message) {
|
|
61
|
+
process.stderr.write(`
|
|
62
|
+
${message}
|
|
63
|
+
`);
|
|
64
|
+
}
|
|
65
|
+
} catch {
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
11
69
|
// src/bin/harness.ts
|
|
12
70
|
async function main() {
|
|
71
|
+
runUpdateCheckAtStartup();
|
|
13
72
|
const program = createProgram();
|
|
14
73
|
try {
|
|
15
74
|
await program.parseAsync(process.argv);
|
|
16
75
|
} catch (error) {
|
|
17
76
|
handleError(error);
|
|
18
77
|
}
|
|
78
|
+
printUpdateNotification();
|
|
19
79
|
}
|
|
20
80
|
void main();
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Ok
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-SJECMKSS.js";
|
|
4
4
|
|
|
5
5
|
// src/commands/validate-cross-check.ts
|
|
6
6
|
import * as fs from "fs";
|
|
7
7
|
import * as path from "path";
|
|
8
|
-
import {
|
|
8
|
+
import { execFileSync } from "child_process";
|
|
9
9
|
function findFiles(dir, ext) {
|
|
10
10
|
if (!fs.existsSync(dir)) return [];
|
|
11
11
|
return fs.readdirSync(dir).filter((f) => f.endsWith(ext)).map((f) => path.join(dir, f));
|
|
@@ -21,7 +21,7 @@ function extractPlannedFiles(planContent) {
|
|
|
21
21
|
}
|
|
22
22
|
function getFileModTime(filePath, projectPath) {
|
|
23
23
|
try {
|
|
24
|
-
const output =
|
|
24
|
+
const output = execFileSync("git", ["log", "-1", "--format=%aI", "--", filePath], {
|
|
25
25
|
cwd: projectPath,
|
|
26
26
|
encoding: "utf-8",
|
|
27
27
|
stdio: ["pipe", "pipe", "pipe"]
|