chore(release): bump version to 2.1.6 (build 131)

Version: CURRENT_PROJECT_VERSION 130 -> 131 (project.yml, AGENTS.md, READMEs,
docs/llms.txt).

fix(flow): host-app identification now compiles in every build configuration
(Debug, TestFlight, Release). The arbiter probe and HostAppIdentity were
DEBUG-only, so TestFlight/App Store builds never knew the host bundle id and
could not auto-return after a startflow handoff. Debug-only logging and the
Home test card are unchanged.

Also includes the pending work in the tree:
- Home: single account/setup card surface (HomeAccountSurfacePolicy/Views)
- Wide screens: voice key row and centred mic placement, iPhone Duo layout
- Keyboard: clipboard skill ranking and AI skill layout updates
- Debug: account session handoff to the Simulator (+ import script)
- Docs: portfolio assets, privacy policy URL, site/README refresh
This commit is contained in:
Rocky
2026-10-29 11:54:13 +08:00
parent 055a40976f
commit 4dce67df84
65 changed files with 3682 additions and 787 deletions
@@ -182,6 +182,64 @@ final class AIClipboardSkillTests: XCTestCase {
)
}
func testTranslateToTargetUsesConfiguredTargetLanguage() {
let prompt = AIClipboardSkillCatalog.instruction(
skillID: AIClipboardSkillCatalog.translateToTargetID,
locale: "en",
translationTargetLocaleId: "ja",
preferredLanguages: ["zh-Hans"]
)
XCTAssertTrue(prompt.contains("Japanese"))
XCTAssertFalse(prompt.contains("Chinese"))
}
func testTranslateToTargetPromptFallsBackWhenTargetIsOff() {
let prompt = AIClipboardSkillCatalog.instruction(
skillID: AIClipboardSkillCatalog.translateToTargetID,
locale: "en",
translationTargetLocaleId: TranslationLanguageCatalog.offLocaleId
)
XCTAssertTrue(prompt.contains("English"))
}
func testTranslateToTargetButtonTitleNamesTargetAndHidesWhenOff() {
XCTAssertEqual(
AIClipboardSkillCatalog.translateToTargetButtonTitle(
translationTargetLocaleId: "en",
uiLanguage: .chinese
),
"翻译英语"
)
XCTAssertEqual(
AIClipboardSkillCatalog.translateToTargetButtonTitle(
translationTargetLocaleId: "ja",
uiLanguage: .english
),
"To Japanese"
)
XCTAssertNil(
AIClipboardSkillCatalog.translateToTargetButtonTitle(
translationTargetLocaleId: TranslationLanguageCatalog.offLocaleId,
uiLanguage: .english
)
)
}
func testPolishKeepsOriginalLanguageAndCarriesNeverAnswerBoundary() throws {
let skill = try XCTUnwrap(
AIClipboardSkillCatalog.skill(id: AIClipboardSkillCatalog.polishOriginalID)
)
let prompt = AIClipboardSkillCatalog.instruction(
for: skill,
locale: "en",
translationTargetLocaleId: "ja"
)
XCTAssertTrue(prompt.contains("without changing its language"))
XCTAssertTrue(prompt.contains("grammar"))
XCTAssertTrue(prompt.contains("Non-negotiable boundary"))
XCTAssertFalse(prompt.contains("Japanese"))
}
func testSummarizeAsksForOverviewNotShortening() {
let prompt = AIClipboardSkillCatalog.instruction(
skillID: AIClipboardSkillCatalog.summarizeID,