chore: settle product naming across app, widget and deployments

One word everywhere: ReplyPier in UI copy, package and image names, the
replypier.site domains (app/api/docs/help), REPLYPIER_* settings and the
--rp-* design tokens.

- public widget API is window.ReplyPier with replypierId / replypierBaseUrl /
  replypierConfig / replypierToken, loader at webclient/replypier.min.js;
  both bundles rebuilt from source
- NOTICE, llms.txt, CONTRIBUTING, HELP_CENTER_INFRA and the demo runtime
  config rewritten; the demo config ships no third-party keys
- migration adds the ReplyPier managed model value to the AI model enum
- local compose project, database, role, volume and Docker network carry the
  same name
This commit is contained in:
WangShen007 committed 2026-10-26 00:57:22 +08:00
1 parent ff0a09f0e5
commit 20fef2b9f3
1156 files changed
+7267 -7148

No files matched your search

+15 -15
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -34,7 +34,7 @@ from app.models.help_center import HelpCenterSettings
from app.repositories.faq import FAQRepository
from app.services.help_center_public import contrast_ink, resolve_help_center, slug_for_host
HOST = "test-org.chattermate.help"
HOST = "test-org.help.replypier.site"
@pytest.fixture(autouse=True)
@@ -108,9 +108,9 @@ def path_client(db, monkeypatch):
# ---------- helpers ----------
def test_slug_for_host():
assert slug_for_host("acme.chattermate.help") == "acme"
assert slug_for_host("a.b.chattermate.help") is None
assert slug_for_host("chattermate.help") is None
assert slug_for_host("acme.help.replypier.site") == "acme"
assert slug_for_host("a.b.help.replypier.site") is None
assert slug_for_host("help.replypier.site") is None
assert slug_for_host("help.acme.com") is None
@@ -279,7 +279,7 @@ def test_widget_embed_points_at_this_install(
client, db, test_organization, help_center, test_widget, monkeypatch
):
"""The loader falls back to the API URL baked in at build time (the vendor
cloud) unless the page sets window.chattermateBaseUrl. Without it, a
cloud) unless the page sets window.replypierBaseUrl. Without it, a
self-hosted help center asks the wrong backend for its widget and the
visitor gets "Chat Unavailable"."""
monkeypatch.setattr(settings, "BACKEND_URL", "https://api.selfhosted.example")
@@ -287,8 +287,8 @@ def test_widget_embed_points_at_this_install(
db.commit()
r = client.get("/", headers={"host": HOST})
assert f'window.chattermateId = "{test_widget.id}"' in r.text
assert 'window.chattermateBaseUrl = "https://api.selfhosted.example/api/v1"' in r.text
assert f'window.replypierId = "{test_widget.id}"' in r.text
assert 'window.replypierBaseUrl = "https://api.selfhosted.example/api/v1"' in r.text
def test_custom_domain_page_is_self_contained(
@@ -316,7 +316,7 @@ def test_custom_domain_page_is_self_contained(
'<meta property="og:image" content="https://help.customer.com/api/v1/uploads/help_center/logo.png">'
in r.text
)
assert 'window.chattermateBaseUrl = "https://api.selfhosted.example/api/v1"' in r.text
assert 'window.replypierBaseUrl = "https://api.selfhosted.example/api/v1"' in r.text
def test_og_card_degrades_without_a_logo(client, db, test_organization, help_center):
@@ -336,7 +336,7 @@ def test_search_filters_results(client, db, test_organization, help_center):
def test_disabled_or_unknown_hosts_404(client, db, test_organization, help_center):
assert client.get("/", headers={"host": "nope.chattermate.help"}).status_code == 404
assert client.get("/", headers={"host": "nope.help.replypier.site"}).status_code == 404
help_center.enabled = False
db.commit()
assert client.get("/", headers={"host": HOST}).status_code == 404
@@ -480,9 +480,9 @@ def test_ask_unanswerable_503(client, db, test_organization, help_center, test_a
# ---------- host dispatch ----------
def test_is_help_center_host_matches_subdomains_only():
assert is_help_center_host("acme.chattermate.help") is True
assert is_help_center_host("chattermate.help") is False
assert is_help_center_host("api.chattermate.chat") is False
assert is_help_center_host("acme.help.replypier.site") is True
assert is_help_center_host("help.replypier.site") is False
assert is_help_center_host("api.replypier.site") is False
assert is_help_center_host("") is False
@@ -566,7 +566,7 @@ def test_preserved_path_drives_canonical_and_json_ld(
r = client.get(MIGRATED_PATH, headers={"host": HOST})
expected = f"https://test-org.chattermate.help{MIGRATED_PATH}"
expected = f"https://test-org.help.replypier.site{MIGRATED_PATH}"
assert f'<link rel="canonical" href="{expected}">' in r.text
assert f'<meta property="og:url" content="{expected}">' in r.text
graph = json.loads(re.search(
@@ -583,7 +583,7 @@ def test_sitemap_lists_the_preserved_path(client, db, test_organization, help_ce
r = client.get("/sitemap.xml", headers={"host": HOST})
assert f"<loc>https://test-org.chattermate.help{MIGRATED_PATH}</loc>" in r.text
assert f"<loc>https://test-org.help.replypier.site{MIGRATED_PATH}</loc>" in r.text
assert "/a/how-do-i-reset-my-password" not in r.text