diff --git a/openwiki/.claims/concepts/ghostty-terminal-integration.json b/openwiki/.claims/concepts/ghostty-terminal-integration.json index 7685a9e3..c6294f2b 100644 --- a/openwiki/.claims/concepts/ghostty-terminal-integration.json +++ b/openwiki/.claims/concepts/ghostty-terminal-integration.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:336baafb96e319b60db44a8b9d1e95bf43b1b0a1f89c5f8f0b87cd78c359a86a", + "pageVersion": "sha256:9be701c9b59d7a97aabff1b06485a5f6732d67fb7a9d594584d878551220407e", "claims": [ { "id": "claim_5374ba64d60a4b61b1474770c4d3b1a1", @@ -439,6 +439,6 @@ ], "verification": { "by": "openwiki/0.7.2", - "at": "2026-10-18T12:28:54.264Z" + "at": "2026-10-18T17:39:35.546Z" } } diff --git a/openwiki/.claims/operations/build-test-and-release.json b/openwiki/.claims/operations/build-test-and-release.json index d31b9311..0b3000c2 100644 --- a/openwiki/.claims/operations/build-test-and-release.json +++ b/openwiki/.claims/operations/build-test-and-release.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:a802d5311ba01a12ed52b1a6fb06e250847e6e32990b437d11ea6f9fa89b98e9", + "pageVersion": "sha256:b72f64104c706f6b413ec96758f56df5b59d129714bf7f4a1ae045cbb4c20fcc", "claims": [ { "id": "claim_d34d7b16495a44a4a946d3dc9e0456f4", @@ -583,6 +583,6 @@ ], "verification": { "by": "openwiki/0.7.2", - "at": "2026-10-18T12:28:54.264Z" + "at": "2026-10-18T17:39:35.546Z" } } diff --git a/openwiki/.claims/operations/ghostty-dependency-updates.json b/openwiki/.claims/operations/ghostty-dependency-updates.json new file mode 100644 index 00000000..63e152fd --- /dev/null +++ b/openwiki/.claims/operations/ghostty-dependency-updates.json @@ -0,0 +1,154 @@ +{ + "schemaVersion": 1, + "pageVersion": "sha256:bf8eaac6ab30842dc9207d43aab033fed8730421d4327e0fa2dfbc56a8667e66", + "claims": [ + { + "id": "claim_de28b72bd16a498b9257f832828eec29", + "statement": "Ghostty is a remote Swift Package from Lakr233/libghostty-spm declared in project.pbxproj with an upToNextMinorVersion requirement starting at 2.2.2026101502 and resolved products GhosttyTerminal, GhosttyTheme and GhosttyKit; Package.resolved pins the same version at revision 42bacd1339f323a693ddbca779295f4f77e5a697. AGENTS.md still advertises an up-to-next-major requirement, so the project declaration and lockfile are the authoritative policy.", + "evidence": [ + { + "resource": "repo://AGENTS.md#L27-L32", + "version": "repo-lines-v1:sha256:408a8b9d1e2522b899d0b549249117ef030b9fbbe39e5c602e2f20fa32d5e462:eyJzZWxlY3RlZExpbmVDb3VudCI6NiwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNTM4YTMyMGI0ZWU1MWRkNTY4NDExNmM3YWU3ZDhhNTQzZWE3M2MzZThhNmQ1ZjZmYWNhNTIyNTI2ODA5MmRiMyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiYzBkNzY1NjVkNmUyNmQ0MTFiNDEyYTVlNzI4MzgyMDRjZjU3MTZlZDRhMjIzZGYwZWIxMjYxNGIzNzVhYWRkYSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMjEzZTc0MjhkMzkwNDRmYTQzYjhhNWZjN2M0YTQ2NjcwMGZjNzk5ODFkOWRmODczMmY0YjkyMGM4NjBhZDNhNSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYzc1ZDJmNGRjMWZiNDc4MzllMTc0YzU0Mzk2OWI2N2IwY2UwN2M4ZjZhYTcyNzNiYzYyOGRkNTU1NWQ1NDczNCJ9" + }, + { + "resource": "repo://Termind.xcodeproj/project.pbxproj#L2971-L2978", + "version": "repo-lines-v1:sha256:c36a91234b33b2194828e2aa8477d87e91fccc9b40e6abfe2c7220c3f0422ece:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiOTIyMmU4M2Y3NjViMmQ0MjdkMjkyZDIxZmYxZTM1MDY2MTg5YjFjN2ZhNWNkMWU4NTc2NWZjNTBiMGFkMDgzZiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMzYwYjg4YTA1ZDViNTM4NDc2MDIyOWJlNjA1NzJmZTYyYjFjMjljZGM1N2VkYjVlNjk1MWRhYTRmZDQ2YzgwMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiYmZlOGIyNTIxNjIzZWZjMWJiYmIyMTcyNDIyZWQyNGI4NzM4ODdiMDM1ZGUyNDBlZDZiZjcxNDc3YjRjZGExNyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYjkxMTMwZGU5ZDJiY2MxZDVhMDA4ZmE5OGM1YWE0YmU4ZjU2OThmYjRjZGY3NGY0OGM2YTBmNzI5YTI4NDM1NyJ9" + }, + { + "resource": "repo://Termind.xcodeproj/project.pbxproj#L3095-L3104", + "version": "repo-lines-v1:sha256:7ab7f953765ca8612c3de7ce1730a0b8064dbc8f719e80c55b7eaa3bbd95c9e5:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjliZjcyMTNkNTAxOGZjN2MwYjlhZGI4YTMzYmMwNTk1ZGNlYzY4YTc4NDFlZDBlMzY4MzYwNmQwMWM3NTI1YjIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM2MGI4OGEwNWQ1YjUzODQ3NjAyMjliZTYwNTcyZmU2MmIxYzI5Y2RjNTdlZGI1ZTY5NTFkYWE0ZmQ0NmM4MDMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImU4YThmZDAxZDIyMWZiYjQwYWY2ZWNjNmYyNGQ1NTAyYmE4NDk4NzQ5OGQyNDVhZDk0YTNmOTI2MDEzYzkyOTQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImNkNDZiMzQxZmU0YTljOWEyY2NmY2EzMDFjZWZiNWYxOWE3YTcxNTcyN2Q3MjUzNmNiZTdkNzY2YTA4NzE4YjUifQ" + }, + { + "resource": "repo://Termind.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved#L157-L165", + "version": "repo-lines-v1:sha256:1ae8cc3236ac9acc22e57da2302bcb7d55692cacaf301531bdf2d844acddda06:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZjljYTg5MWJmZjdhYzFmN2NlYWFlNDBlZjA1MTA2NmJlOWVmZTQ3YjRlNDI4MWU4NmMzMTliZTJjNTVlYmNlNCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMWYwY2RiOTcyYTdiZmI3ZWQyNDZmOWZmNjcyMzg1ZTU1ZjQ5NjhmYzExMDQzZGM1YjY4NGQ1MWRmYTMxZGJjYiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMDhhNWI3NGY4MGQ0OTdmZWQzMjJiYmVlYWJjNmYwMDdiMGY0NWRiMGVlNDdlNDU2MjEyMzk2NzZmMGE4ZmY5ZiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYTZkZTA5NmFmZTlkMzgwMDk3NWQwMjA4NmQyMjhlYzA3Y2M2M2E1NWI5NDVmMWI1ZjM2ODhiZTY1NmI4ZGMzMiJ9" + } + ] + }, + { + "id": "claim_c02f65cb5b8a4d1abcd4270fb255e722", + "statement": "Termind has no local Ghostty maintenance submodule: .gitmodules declares only AgentKit, libssh2-spm, libtailscale-spm and com.akinokaede.termind, so a Ghostty update touches only the Xcode requirement, the resolved pin and any required app adapter change, with no Termind-owned Ghostty artifact publication.", + "evidence": [ + { + "resource": "repo://.gitmodules#L1-L14", + "version": "repo-lines-v1:sha256:4ee3a7b7921786868dacd9587878cad13360d76d1dfe97c44cbf55b8ed8c06e9:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZlNDI5YzIyYzFmMWVjNGMxN2E4NmY5M2FiN2Y3MjQ3ZTg0MTAwMDY5ZDVlMWUzODdlZTY3MzljMTdmNWYxYzMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhjODQ2NWIyODQzY2Y3N2U5ZjExOTNiMzk3NDhjMjY2ZGJjOTYyYWRmNGU5YWI1YTEwMWM3MWE3ZGM5YTQ5ZjAiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ" + } + ] + }, + { + "id": "claim_c6ca141459704a639d2993f054eecd67", + "statement": "iOS terminal menus route both Ghostty touch entry points through one customizer: MobileTerminalView overrides touchMenuItems(for:) and touchSelectionMenuItems(for:) separately and passes each result to customizedTouchMenuItems, which must keep them distinct because the package builds the selected-text menu independently of the ordinary touch menu.", + "evidence": [ + { + "resource": "repo://TFI/Platform/MobileTerminalSurface.swift#L25-L33", + "version": "repo-lines-v1:sha256:d4966b0d1ee7987fff6c56bc62a8ea0a0681b2afaf28528abf665430cda516f8:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiYjdhNWU4OTliNWFlZmY2YWZjNjA2ZmY3N2EwMzU0YTUwZjFmZDFhNGU4NWVlNzgyZTI1NmRmMWFiOTFmZDk3MiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiYjQ3OGM5ODFkOTE4Y2RiZmE3ODU4N2UyZjZkMTI0YTJlNzVhYjI3YWI1MzNlOWE1OWNkZGZjYmRlNDMxMzNhNCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZWM3N2Q2OTQ4YjI2MTI5YzI0NWY0NTc4NzNhZGNlOWJjN2RmNTc3YTFhNjdlNjFiNmIyNjVhOTdlZGJkN2UwZSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYjJjNjU5MmNhYjlhNDhmN2QzN2FiY2E0ZGZiZGQxZjVkN2JlODlmYmQyMzA4ZjdhNmM2ODk3M2I0OGExZGJkMSJ9" + }, + { + "resource": "repo://TFI/Platform/MobileTerminalSurface.swift#L33-L62", + "version": "repo-lines-v1:sha256:e5694ca53eb763219b60231c4cbf1401e6b5b9e3d0936e50256496a884b78590:eyJzZWxlY3RlZExpbmVDb3VudCI6MzAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImI0NzhjOTgxZDkxOGNkYmZhNzg1ODdlMmY2ZDEyNGEyZTc1YWIyN2FiNTMzZTlhNTljZGRmY2JkZTQzMTMzYTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI1Y2VmYWZiOTUyNjM0OGI1NTA4NWYyMTc5MzFkZDg1Y2MyODIyNzBjY2NlNWFhYmQ5MzdiYTU0MWVmYmRmYzMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRiMjExMWU4MDIzNDY5OWYxNTJkOWEwOTdmMzNmMWQzZGNmMDA2ODU1NTU4ZDY1NzNjZjQ2Y2JlYWU3YzZiYWUifQ" + } + ] + }, + { + "id": "claim_6b5972d544fa4343ae839605bffd7343", + "statement": "iOS touch menu customization localizes recognized editing action identifiers through AppStrings, places them in a first display-inline row with medium preferred element size, inserts the SSH upload group next, and preserves unrelated inherited items so system AutoFill style entries still appear after upload.", + "evidence": [ + { + "resource": "repo://TFI/Platform/MobileTerminalSurface.swift#L33-L62", + "version": "repo-lines-v1:sha256:e5694ca53eb763219b60231c4cbf1401e6b5b9e3d0936e50256496a884b78590:eyJzZWxlY3RlZExpbmVDb3VudCI6MzAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImI0NzhjOTgxZDkxOGNkYmZhNzg1ODdlMmY2ZDEyNGEyZTc1YWIyN2FiNTMzZTlhNTljZGRmY2JkZTQzMTMzYTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI1Y2VmYWZiOTUyNjM0OGI1NTA4NWYyMTc5MzFkZDg1Y2MyODIyNzBjY2NlNWFhYmQ5MzdiYTU0MWVmYmRmYzMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRiMjExMWU4MDIzNDY5OWYxNTJkOWEwOTdmMzNmMWQzZGNmMDA2ODU1NTU4ZDY1NzNjZjQ2Y2JlYWU3YzZiYWUifQ" + }, + { + "resource": "repo://TFITests/MobileTerminalUploadMenuTests.swift#L1-L40", + "version": "repo-lines-v1:sha256:25505dba9fa20ba7e108fbfa2189368a99e8e4068834a92e0d9c953900b17018:eyJzZWxlY3RlZExpbmVDb3VudCI6NDAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRmNWQyN2RhMzljN2E2YzBmYWM0YWEzZjgzMzQ2ZmM0NmI3YTZhZGZiOTAwZWY5NWFhOTgzODRkZWU4MTc5ZTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5ZjZmNjExZDg0NzQxYmExOTVjOWFmMTIwY2UzMDFhNDkyMjc5MjNkNTA2MmVlZmM0ODA0YjE4MDRlNGNmZjkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImYyZGZhZGIwMDU2YzAyYWQwNTI3ODE4N2FhZTU0M2FiZjBjZGFhMzI5NGU2MzljZDdhNzM5NDZmMGY5ZTE1NjIifQ" + } + ] + }, + { + "id": "claim_06b1d50c98a5422781487b3ca60e6db0", + "statement": "The iOS upload submenu is omitted entirely unless uploadFiles is bound and its Photos/Files actions are disabled when canUploadFiles returns false, and each action re-checks canUploadFiles when invoked so a stale menu cannot upload to an unavailable destination.", + "evidence": [ + { + "resource": "repo://TFI/Platform/MobileTerminalSurface.swift#L64-L86", + "version": "repo-lines-v1:sha256:42a7e7585896a8fad943f127e267ab1fb07383453f7d5f0bd10b2488dc98fd6e:eyJzZWxlY3RlZExpbmVDb3VudCI6MjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU0NWM0ZTIzMWM5YjhjNzIxNzM4YmRlZGFhMDgxMWQ3YjU5YTM0ZTZhYWZjNzY2NjAxMzczYmEyMDhmMzhkYjMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVkYzhjMjI5ZDE5ZTJjNTg0YzA4MjAwOThiNGIxZTZkOTJhYjE5NTJhNTQ3ZmUzMGEyNjM0MDRkNmY1OWQzM2EiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjlmZTA5YTAzN2I5M2QwODE0NTg2MjU4ZmU3NjgzMzU3Zjk4Y2FmNjAyNTU4OWU1NDZmOTQwNjgxYmEwYTk3YWEifQ" + }, + { + "resource": "repo://TFITests/MobileTerminalUploadMenuTests.swift#L1-L40", + "version": "repo-lines-v1:sha256:25505dba9fa20ba7e108fbfa2189368a99e8e4068834a92e0d9c953900b17018:eyJzZWxlY3RlZExpbmVDb3VudCI6NDAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRmNWQyN2RhMzljN2E2YzBmYWM0YWEzZjgzMzQ2ZmM0NmI3YTZhZGZiOTAwZWY5NWFhOTgzODRkZWU4MTc5ZTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5ZjZmNjExZDg0NzQxYmExOTVjOWFmMTIwY2UzMDFhNDkyMjc5MjNkNTA2MmVlZmM0ODA0YjE4MDRlNGNmZjkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImYyZGZhZGIwMDU2YzAyYWQwNTI3ODE4N2FhZTU0M2FiZjBjZGFhMzI5NGU2MzljZDdhNzM5NDZmMGY5ZTE1NjIifQ" + } + ] + }, + { + "id": "claim_afe1c10679b94448a71eed833f438771", + "statement": "macOS TermindTerminalView suppresses the selection menu while mouse input is captured by returning nil from selectionMenuPoint(at:), while otherwise offering the app's own default menu even without a text selection.", + "evidence": [ + { + "resource": "repo://TFM/Features/Terminal/PersistentTerminalSurfaceView.swift#L219-L223", + "version": "repo-lines-v1:sha256:b17bd0526870121a8f7d023658faf0d28b9462b7914458ff4e2be9126730c37b:eyJzZWxlY3RlZExpbmVDb3VudCI6NSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZWZmZDU1NmRmZDM2OTRiODAxY2U1ZmRjMzdmMWM4NmQxNTZmZmQ0ZTBjYTgyNWZhODI5NTU3YjZkNDQ5ZTU2YyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiZTZiMDQ0OTE0Njk3MjJlODM2M2E5NGU0MDQ0NTM4ZTAxM2EyYTIxN2UzNmIxZTU2OGJhNjBhY2I3YjRjOGYyZSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZGY4NmZhY2NkOWQ4NjliZWQzYTQzYWQ5MzhjNWRlYTBlNTcyODI1MzMzYzNmNjVlNDFjOWM2NzJlYjdjZTUzYSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiZjI3Zjc2ZTc4MGUwNjliMjg3MmRjMGMwNzY4ZjNjMDEyODRlOTQ3ZjE4ODc4ZDE2ZTg2MGY5MjkwZjIxZmZiYiJ9" + } + ] + }, + { + "id": "claim_ae7b3ea8ed734019931fb08ba5c7cb89", + "statement": "macOS selectionContextMenu() keeps the superclass selection menu only when the superclass reports a selection, localizes Copy, and appends localized Paste (enabled per clipboard contents), Select All, an Upload File item gated on a bound uploadFiles and live canUploadFiles, and an Open with SFTP submenu offering current-workspace and new-workspace placement.", + "evidence": [ + { + "resource": "repo://TFM/Features/Terminal/PersistentTerminalSurfaceView.swift#L225-L282", + "version": "repo-lines-v1:sha256:f10cca7a3cb6a25ef7f85ea116e3858fe4338e90a083d7ae5f8b5ec47b4b577a:eyJzZWxlY3RlZExpbmVDb3VudCI6NTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJjOTk5MTA1MzM4OWFkYjJiZjM0ZmQ0OGZlODFhOGMyZjA1ODJmNmZiNTA0M2RhZWUzOWFkYTYxMzU2ZGZhOGYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjI5MTBlY2M2YjZiZGI4OGZmYWQxMTJiMGNhMDhhYTg0YWM5OTRiZDk0YWEwOGU3MzI2ODFhM2VmNWExNDk2NjgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjljNDViYjc5ZmI3MzBjOTI2NWI4MmQwNDg2NjAzZmFlZDkyMjc4OGJkOTgwYWQxODk4NGQzYWUzY2I4Yzg3MjMifQ" + }, + { + "resource": "repo://TFM/Features/Terminal/PersistentTerminalSurfaceView.swift#L299-L308", + "version": "repo-lines-v1:sha256:ce0399b003db2de301560c82baea79e4c097ec73ccef912b785feb2f50d01fff:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcwZWZlNmVmYWYzOWNjOWUwNDI0ODAyODcyZDU1YTZlM2U4M2RjYjJlMzliZDZiZTJjMjUyNTU1YzM3MDJmMzIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE3N2U4NjFiNDA5MzgzMTA2YzRkOTM0NjU5Y2Y0NjEzYzI5OTA1MzVmMjU1OTliMWM5MDI0MGY2MDkxNjEwYzgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjllNmNhZjQzMjBmYjY4YmJhYTlhMGY3MDZlMzIzMGIwZWMwYmRkOTAyZjQ5YTU0OWJkNTc0ODAxYWJhYzAyNDIifQ" + } + ] + }, + { + "id": "claim_34385093339145c5b20f3410444376cf", + "statement": "Upload and SFTP actions re-check their capability closures at invocation time, so menu availability captured at build time is not treated as authorization to send a file or open SFTP.", + "evidence": [ + { + "resource": "repo://TFM/Features/Terminal/PersistentTerminalSurfaceView.swift#L284-L297", + "version": "repo-lines-v1:sha256:464a38eb302b6971af57a24bd2308587b117507f5d79774b6972f2e020889658:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMxNTkxNDE0ZGM3NzRiMGEyYTBlOGQ1NzZlY2ExMTgzODFiMmY4NTk5YjZlMmU2ODIzZDNlZWQxYTJiOGRhOWMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQwMjU0ZTNkODdhNzA4Y2VmNWI2ZTZiMDcxN2E2N2QzZjYzZTk0YmNhZjZkZDQ4Y2I1OGUyZDljMWZhNWE2M2IiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjA5MmFhYWY4MzBlZTI2MmFmZDM4N2UzNTRmNzk0OGNiNzIxZjY2MWE1NTM5MTk0YmM1ZjY5MDg1ODVkMGU4NWUifQ" + }, + { + "resource": "repo://TFM/Features/Terminal/PersistentTerminalSurfaceView.swift#L95-L98", + "version": "repo-lines-v1:sha256:f3dc44805b2f5f3482c3502d367753f50cf72132cf0585ffa5c1d6dfeeef8bbb:eyJzZWxlY3RlZExpbmVDb3VudCI6NCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMjNhNDhkY2M0OWE5NDBiM2Q5NTRiYTBjYmI0NzRiNzY2ZDAzNDA0NTU5MzlhYmIwNDI4ZTE4M2I0OGI5MzQ5YyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMzM0N2NlNTg2MTNjMzkxMGEzZDk5NTcyYWRmNTAzMTNmNDhmZDkyNTk5YWY1NWY0ZmRjZDk3ZjEwMTkwOWNjNyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiM2Q4ZDRmNGMxNDY0Nzc4NTYxMTI0MjEyNGUzYjQzY2QyMTFlMDI4ZmFjYTEwOTNkYWJlM2Y5ZGI4YzU0OWUzYSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYjE5NWViZWEwM2U0ZWU0OGNiNGI4YzM3MWEwOTc0MGQ1OTJjODE5M2JjOTVjNDMzY2Q1ZGI5NzEyZjU2NzRhYyJ9" + } + ] + }, + { + "id": "claim_8ff547d66f3d4ddf9e1503a20fb1dd8b", + "statement": "Right-click paste on macOS applies only when the paste-on-right-click preference is on, no mouse input is captured and Option is not held, and it is implemented as a host preference over performBindingAction rather than as a package menu contract.", + "evidence": [ + { + "resource": "repo://TFM/Features/Terminal/PersistentTerminalSurfaceView.swift#L305-L312", + "version": "repo-lines-v1:sha256:994054ef2d739bcf1094ddc576754003721e7f04b29d3ebd61c600410b630546:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiYzM3MDA4ZjE0OGM0MjY3YTY3MmI3NDgwNDVkMjU0ZTU2MGRkMzNiMWFhMzEyM2E5ZDgyNjcwY2IzMTZmN2I2ZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiZTZiMDQ0OTE0Njk3MjJlODM2M2E5NGU0MDQ0NTM4ZTAxM2EyYTIxN2UzNmIxZTU2OGJhNjBhY2I3YjRjOGYyZSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZTZhODZhNmJkYzRlMDkyYTE0Yzg4NDJhOTUyZmQ0NGYyOTMxMGY0Y2U1Y2Q0ZDY1MzhlNmNhZTRjNzVhOTk4NSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiOTA3OGYwZmNlZjkxMGUyNDNiNWFlYWMzMzhjNDU3ZWY2OWQwYjhlOTBkZmY0ZTcwYzZiZmE1OGFhYzMzODYzOSJ9" + } + ] + }, + { + "id": "claim_72c4df989f324deaa15cfd5ab7950d87", + "statement": "Termind's Ghostty adapter regressions are covered by TerminalContextMenuTests and TerminalMouseInteractionTests on macOS and MobileTerminalUploadMenuTests plus MobileTerminalKeyboardTests on iOS, with the key-window and visible-window suites remaining opt-in.", + "evidence": [ + { + "resource": "repo://TFITests/MobileTerminalKeyboardTests.swift", + "version": "repo-file-v1:sha256:889d6aee8231d492b12a21ace70ee6f076c928992c48780e8f57258ea07b9900" + }, + { + "resource": "repo://TFITests/MobileTerminalUploadMenuTests.swift#L1-L40", + "version": "repo-lines-v1:sha256:25505dba9fa20ba7e108fbfa2189368a99e8e4068834a92e0d9c953900b17018:eyJzZWxlY3RlZExpbmVDb3VudCI6NDAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRmNWQyN2RhMzljN2E2YzBmYWM0YWEzZjgzMzQ2ZmM0NmI3YTZhZGZiOTAwZWY5NWFhOTgzODRkZWU4MTc5ZTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5ZjZmNjExZDg0NzQxYmExOTVjOWFmMTIwY2UzMDFhNDkyMjc5MjNkNTA2MmVlZmM0ODA0YjE4MDRlNGNmZjkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImYyZGZhZGIwMDU2YzAyYWQwNTI3ODE4N2FhZTU0M2FiZjBjZGFhMzI5NGU2MzljZDdhNzM5NDZmMGY5ZTE1NjIifQ" + }, + { + "resource": "repo://TFMTests/TerminalContextMenuTests.swift#L1-L30", + "version": "repo-lines-v1:sha256:1edaab52ae8f49b5a9ab8c68151e718fd8a34b9fcfedd4d050b5743d5836701d:eyJzZWxlY3RlZExpbmVDb3VudCI6MzAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFjMzYyZGQ0NjUwMDgyZDM0N2RhMTFjMmRlYzc0MjBjNDJjNmMwZDEzMzYwNTAzYjg4OGZjOTgxZmU3Njk3ZDAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM1OTJjMjJlYmY1M2U3YWFhMmYzZjg2ZDdlYzEwOTcxZWE1YmMwMTkyNTQ0ZDhhYTU1Yjg0YWE4OGQ5NWMxZjgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRmNDQxYzc0OWMyZTdmZjFmZDI2MjEwYmU5OTYxNjU0YjllY2I0NzVlMjIwZjgxNTU3MmMxZGI1NzkyMDQxZTcifQ" + }, + { + "resource": "repo://TFMTests/TerminalMouseInteractionTests.swift", + "version": "repo-file-v1:sha256:d1b3cc8fcacbb717a45612f8d89d3d07b11e8cbc2bc4a811bb78375d045d5f0b" + } + ] + } + ], + "verification": { + "by": "openwiki/0.7.2", + "at": "2026-10-18T17:39:35.546Z" + } +} diff --git a/openwiki/.claims/operations/ghostty-fork-maintenance.json b/openwiki/.claims/operations/ghostty-fork-maintenance.json deleted file mode 100644 index bb5e8666..00000000 --- a/openwiki/.claims/operations/ghostty-fork-maintenance.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "schemaVersion": 1, - "pageVersion": "sha256:d582cd363b9d34992901ecc8f174739d22a714e50f0c904c832b2af1836f4f2c", - "claims": [ - { - "id": "claim_178354d1d71f460e9b920a02dd44754f", - "statement": "Ghostty is a direct remote dependency from Lakr233/libghostty-spm with an upToNextMinorVersion requirement starting at 2.2.2026101502 and resolved version 2.2.2026101502 at 42bacd1339f323a693ddbca779295f4f77e5a697. There is no local Ghostty maintenance submodule or staging override; keep the project requirement and resolved pin aligned. AGENTS.md still describes up-to-next-major, unlike the current project declaration.", - "evidence": [ - { - "resource": "repo://.gitmodules", - "version": "repo-file-v1:sha256:4ee3a7b7921786868dacd9587878cad13360d76d1dfe97c44cbf55b8ed8c06e9" - }, - { - "resource": "repo://AGENTS.md", - "version": "repo-file-v1:sha256:5cfa3f4963308f6a30621529da8097b06efa6ae0aa82886cfbbf38cecdde7b10" - }, - { - "resource": "repo://Termind.xcodeproj/project.pbxproj", - "version": "repo-file-v1:sha256:a00f83d572687cd268510180d99f45182897c147ecc89434d1708787ce283a02" - }, - { - "resource": "repo://Termind.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved", - "version": "repo-file-v1:sha256:b33ec75df76fb6e07e9b147f13b910b59c2d1198b6f92f1ccfaf52c35b6d56c3" - } - ] - }, - { - "id": "claim_45912db4e0a443b78ae565fdf3c71686", - "statement": "Termind owns menu customization around upstream Ghostty hooks: MobileTerminalView calls separate superclass touch/selection hooks, localizes recognized editing actions, groups them first, adds upload choices and preserves unrelated inherited items. On macOS, TermindTerminalView offers a default context menu without a selection, suppresses menus during captured mouse input, retains the superclass selection menu only when a selection is reported, localizes Copy and adds clipboard-validated Paste and Select All. Bound Upload File and Open with SFTP additions remain app-owned; SFTP offers current/new workspace placement and rechecks availability on invocation, while paste-on-right-click and Option bypass remain desktop preferences.", - "evidence": [ - { - "resource": "repo://TFI/Platform/MobileTerminalSurface.swift#L25-L85", - "version": "repo-lines-v1:sha256:2791d80b7e32a1dac0189fa2e1cfffbc9cf81d141c79b46b456e39cf710be987:eyJzZWxlY3RlZExpbmVDb3VudCI6NjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImI3YTVlODk5YjVhZWZmNmFmYzYwNmZmNzdhMDM1NGE1MGYxZmQxYTRlODVlZTc4MmUyNTZkZjFhYjkxZmQ5NzIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJhYWU4YTBjYTc2Zjk4ZjdiN2RjNzk4NDk1MWQ2M2U1N2RiM2M2NDU1NzljYTUxYmFkNmE1MzlkNjE0ZWRiYmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVjNzdkNjk0OGIyNjEyOWMyNDVmNDU3ODczYWRjZTliYzdkZjU3N2ExYTY3ZTYxYjZiMjY1YTk3ZWRiZDdlMGUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdkOWRiNDhlZjZhNjNhNjA4ZWZjNzlhYWVhOGYxNTQ0YzE4ZjM5NmU3OWU1ZWFjNTE1ODI2M2M0N2I5YTc1NzkifQ" - }, - { - "resource": "repo://TFITests/MobileTerminalUploadMenuTests.swift#L9-L74", - "version": "repo-lines-v1:sha256:daadfb94ccba7351d3038388bbd2409f1c1c4114ac22975af55cdaec5fc4dd90:eyJzZWxlY3RlZExpbmVDb3VudCI6NjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY4ZmRiMWE0ZmJiNDNlODMyMWI3MmU0Y2Y1ZmI2MDViMzJjMGRhMDlmMDVjZjQ2NjRkOTk1ZWFhYWZmZjk3YjAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJlMTkwODJlZWMzODIxOWNkNWI3N2MwOTI2MjU1NjhhMWE3MzMzNDA2YzY0YTA2MWM3ZTlhYWI0MzYzMDhlMTkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjFlMDIxMzE3MTkxOTFlMjQzYzY5YjBhMzdhYjVlNWY0NTVlYWQxOTczMTFiMDc2MmQ3OTU5N2QwODljYTFiNmIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoyLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjM3OTRkMDJhODEyMTk0NGQxNzZkMjY1ZTliYjljYzU5ZjZhYjg5MGJjYWRmOGFlZmRlYmRiYmI0ZjJlYTg0NDQifQ" - }, - { - "resource": "repo://TFM/Features/Terminal/PersistentTerminalSurfaceView.swift#L209-L312", - "version": "repo-lines-v1:sha256:eef3d4ccc3340bf865ea19cdb717d3f3ab62f18c6668a0015eb1bda622b61de5:eyJzZWxlY3RlZExpbmVDb3VudCI6MTA0LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI5MzRlMmE3OTQ1NGQ3NDIxZWQ0MjIyNmQ3YTU4ZDViN2FjMGJkMTE1MmJiMTE1MzFmMGRhMTQwNWM5Njc4MmEwIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJlNmIwNDQ5MTQ2OTcyMmU4MzYzYTk0ZTQwNDQ1MzhlMDEzYTJhMjE3ZTM2YjFlNTY4YmE2MGFjYjdiNGM4ZjJlIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJkYTlmODZkMjhlNzg0ZjlmZDMxZmI3MmQxNWY2MGNiY2VhYWZkZDY2OWNiZDViNmRhNzg4OGEwMjMzMjFlYmI5IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI5MDc4ZjBmY2VmOTEwZTI0M2I1YWVhYzMzOGM0NTdlZjY5ZDBiOGU5MGRmZjRlNzBjNmJmYTU4YWFjMzM4NjM5In0" - }, - { - "resource": "repo://TFMTests/TerminalContextMenuTests.swift#L51-L88", - "version": "repo-lines-v1:sha256:356419d5a0f594ea1d6497a55a66e9b344856e0bfee3663804fc114e030e4b3e:eyJzZWxlY3RlZExpbmVDb3VudCI6MzgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMGVjMGZlYjQ5NGIzOTg1OTVjMzg1ZDRiMmRhNWU4ZDgxMDQ5NDdjNDY3MmJhZDkwNjNmNDI0MGE0NTNkNTMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJhZmViMTk3YTM1NjgzZmY4NTk3ZmEwNWFmOWU2Y2JhNWMxN2IwMjAyYmFjMzViY2Y2NzE0OGIyZGQzYWI4ZjciLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUxNWVmNTIwMzllMjQ1NDY1ZjE4ZmM3NmJlNTI4NTM5Nzk4MjgwZGE5ZGM2N2UxMWVjY2NjM2ZhMWJmNTI5YzUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoyLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjM3OTRkMDJhODEyMTk0NGQxNzZkMjY1ZTliYjljYzU5ZjZhYjg5MGJjYWRmOGFlZmRlYmRiYmI0ZjJlYTg0NDQifQ" - }, - { - "resource": "repo://TFMTests/TerminalContextMenuTests.swift#L9-L26", - "version": "repo-lines-v1:sha256:ee15519655e5c7ff96d78e8120d60d81762a7d682c1e7759971b9826058c950d:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM2ODNlYTI2YzUwYWRkYjI0NDI0NWQ1ZGUyOWNlZjU1YjNiZDg4MmRiYzdlMTQwODUzZDIxZjdlZGUyMmQ4OWUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjAyYTRjNGM2YjIyOWU4ODE4YTczN2I0MjJiOTA2NmQxMGYzMGNhZjk5NjViMzg3Y2Q5ZGRkNDBhNTRiMTdiZGQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJkNTk3MDczNDljZTQwZWRhMTNjOWE5MDA1NjgzMWVhYWIxY2IyYmRmODE4MmVhNWY3YjM3ZTExMjIwMzEzYTcifQ" - } - ] - }, - { - "id": "claim_5d1cd2ceee1f4371afe2c58075a8caf4", - "statement": "MobileTerminalView omits upload menus without uploadFiles, disables Photos and Files unless canUploadFiles returns true, and rechecks availability in each action handler before invoking its closure.", - "evidence": [ - { - "resource": "repo://TFI/Platform/MobileTerminalSurface.swift#L64-L86", - "version": "repo-lines-v1:sha256:42a7e7585896a8fad943f127e267ab1fb07383453f7d5f0bd10b2488dc98fd6e:eyJzZWxlY3RlZExpbmVDb3VudCI6MjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU0NWM0ZTIzMWM5YjhjNzIxNzM4YmRlZGFhMDgxMWQ3YjU5YTM0ZTZhYWZjNzY2NjAxMzczYmEyMDhmMzhkYjMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVkYzhjMjI5ZDE5ZTJjNTg0YzA4MjAwOThiNGIxZTZkOTJhYjE5NTJhNTQ3ZmUzMGEyNjM0MDRkNmY1OWQzM2EiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjlmZTA5YTAzN2I5M2QwODE0NTg2MjU4ZmU3NjgzMzU3Zjk4Y2FmNjAyNTU4OWU1NDZmOTQwNjgxYmEwYTk3YWEifQ" - } - ] - }, - { - "id": "claim_a6b25d0cd3f94c8188aea2002d83fb23", - "statement": "MobileTerminalUploadMenuTests covers both selection states and pasteboard availability, editing-row identifiers and sizing, upload ordering before system AutoFill, missing upload bindings, and enabled-state changes for Photos and Files. MobileTerminalKeyboardTests checks upstream accessory grouping with Paste last and matching accessibility labels, an intrinsic height of 60 points on iOS 26 and later versus 52 earlier, 36-by-36-point buttons, and Paste reachability after scrolling at widths 320, 390, 430, 844 and 1024.", - "evidence": [ - { - "resource": "repo://TFITests/MobileTerminalKeyboardTests.swift#L9-L45", - "version": "repo-lines-v1:sha256:a3f0f74490c71270939c309d46c6cb79fdf4cba9f77a4b11fb463ad6655fc03c:eyJzZWxlY3RlZExpbmVDb3VudCI6MzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZjODI4MTNjZjZlYzQ4NTFmYzUxZTEzMGMzM2Y3ZWY4MGI3MzhhMDlmYWFiY2VkZjE1NDNhN2M4NWQ5ZTMwNzEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJjYmU2ZmRmMWQ0MTI5NWY2NTAyYmE4MWM1ZDJiN2ZlN2Q5ZmEwMWZlNTQ1ZDdlNmEyYWJjYzliZTMyNGI4YjQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBmYzVkOGVjN2Q1M2E5MTkzMzI1NjYzZGMwZTdjYmZiZDgzZTg3ZGY3N2UxYzk2NmI2NjU3ZmU2NTc4NDBlMGQifQ" - }, - { - "resource": "repo://TFITests/MobileTerminalUploadMenuTests.swift#L7-L75", - "version": "repo-lines-v1:sha256:7d30200f5f7c70f178e78cecba8a82abef2ec722a934424f8426b6e93b7a28df:eyJzZWxlY3RlZExpbmVDb3VudCI6NjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYxNzE3YjRmNjUxZTc1NDllNTM3ZDFkODdkY2Y4M2E1ZGJiOTE4MDM2YmNkMTEwNGRhYzgzZDEyY2Q3NmU1NjMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJjYmU2ZmRmMWQ0MTI5NWY2NTAyYmE4MWM1ZDJiN2ZlN2Q5ZmEwMWZlNTQ1ZDdlNmEyYWJjYzliZTMyNGI4YjQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ" - } - ] - }, - { - "id": "claim_5c29a9dc29664ea585a1282c8f41f597", - "statement": "TerminalContextMenuTests covers AppKit upload binding and live availability including action-time refusal, protection from stale pane teardown, clipboard paste validation and Option bypass of automatic right-click paste.", - "evidence": [ - { - "resource": "repo://TFMTests/TerminalContextMenuTests.swift#L7-L89", - "version": "repo-lines-v1:sha256:c67e996233d0b0b01afa1f2c3be92e5eb2781c5caa18db2e8b73c76f47031586:eyJzZWxlY3RlZExpbmVDb3VudCI6ODMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZjODI4MTNjZjZlYzQ4NTFmYzUxZTEzMGMzM2Y3ZWY4MGI3MzhhMDlmYWFiY2VkZjE1NDNhN2M4NWQ5ZTMwNzEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc1NTJjOTcxMTBhMDM1ZjNkYjQ2MWIzM2VjZmQ1MzAwNzk5ODMxZWJlYjdlMmEzOThkMzJiY2ZmNTJlYjFlNWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ" - } - ] - }, - { - "id": "claim_ad6a24df55d5499ab68506588a271f00", - "statement": "Normal macOS and iOS project builds should retain -onlyUsePackageVersionsFromResolvedFile to use the committed dependency resolution rather than silently advancing pinned dependencies.", - "evidence": [ - { - "resource": "repo://AGENTS.md", - "version": "repo-file-v1:sha256:5cfa3f4963308f6a30621529da8097b06efa6ae0aa82886cfbbf38cecdde7b10" - } - ] - } - ], - "verification": { - "by": "openwiki/0.7.2", - "at": "2026-10-18T12:28:54.264Z" - } -} diff --git a/openwiki/.claims/quickstart.json b/openwiki/.claims/quickstart.json index 4315bda5..7b176371 100644 --- a/openwiki/.claims/quickstart.json +++ b/openwiki/.claims/quickstart.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:190f0aeb752d781c1a02d5809cd293277e2f59fa4468f7590dad0f99b412de4c", + "pageVersion": "sha256:3e427732160fb55215cac7625fc2a5c31836f9eb4678eb860253acdbdabe1c46", "claims": [ { "id": "claim_83870f4f1ad6403ea0d8bd8775729a76", @@ -533,6 +533,6 @@ ], "verification": { "by": "openwiki/0.7.2", - "at": "2026-10-18T12:28:54.264Z" + "at": "2026-10-18T17:39:35.546Z" } } diff --git a/openwiki/.claims/testing/behavioral-boundaries-and-fixtures.json b/openwiki/.claims/testing/behavioral-boundaries-and-fixtures.json index 5c0444b4..42e8fbb7 100644 --- a/openwiki/.claims/testing/behavioral-boundaries-and-fixtures.json +++ b/openwiki/.claims/testing/behavioral-boundaries-and-fixtures.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:03c71c26f247915e1162d221b17fa56241fae31fe2c6456b72458b3c8fc27ccb", + "pageVersion": "sha256:cebaf8f3662471723d04ee965808e64af5cca07cc5771fa8b96cc874b49108d6", "claims": [ { "id": "claim_b7fbd64158554b8b8ca80a0a613b3bc3", @@ -1103,6 +1103,6 @@ ], "verification": { "by": "openwiki/0.7.2", - "at": "2026-10-18T12:28:54.264Z" + "at": "2026-10-18T17:39:35.546Z" } } diff --git a/openwiki/.last-update.json b/openwiki/.last-update.json index 841a85c6..bd1c9f23 100644 --- a/openwiki/.last-update.json +++ b/openwiki/.last-update.json @@ -1,8 +1,8 @@ { - "updatedAt": "2026-10-18T17:29:09.848Z", + "updatedAt": "2026-10-18T17:42:18.275Z", "command": "update", - "gitHead": "4216b55d96679fdf330faeae94eb934fe310e400", - "model": "gpt-6-astra", - "status": "interrupted", + "gitHead": "fb6a61cafe38e396bcd7e62db73440317eacc671", + "model": "host-agent/pi", + "status": "complete", "language": "en" } diff --git a/openwiki/.page-manifest.json b/openwiki/.page-manifest.json index d96a188d..e8b9b58e 100644 --- a/openwiki/.page-manifest.json +++ b/openwiki/.page-manifest.json @@ -2,158 +2,158 @@ "schemaVersion": 1, "pages": { "/openwiki/architecture/desktop-ui.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:411afa453148f09a53a2edc3f282758f9997e34ca9e696b0fdd085081323f32f", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/architecture/engineering-invariants.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:870dcfd3bfe6b3029a4c8ee3f100f81f2ded84eb975813d525af50a5d5ce43c8", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/architecture/mobile-ui.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:b6ccecfe5357621ead3cd2e2492dd7acc3377feff794550a619783208bfa5557", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/architecture/module-map.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:1c9eb98dedb8214587297055a07fc91992205d565e3633d908d4c034ee896b94", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/architecture/platform-runtime.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:387fe317fe9ca8e282233471215d841ecc6f28c32293c51df499d9b740281dd2", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/architecture/system-boundaries.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:2612b6cb5b9bf0cbfdb355c36ba34451aa91c9484226d9c8c244e055019ad48b", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/concepts/agent-runtime-and-assistant.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:077a2e6c26958d4fa5c317530dc67da336500ba7f3beab5c4a487cf9b4c202e6", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/concepts/commerce-localization-and-product-surfaces.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:1ded0719454ae59cc39890bb02fd2c49fb5d26c572726ae2d402cddeb20e2a25", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/concepts/ghostty-terminal-integration.md": { - "pageVersion": "sha256:336baafb96e319b60db44a8b9d1e95bf43b1b0a1f89c5f8f0b87cd78c359a86a", - "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "pageVersion": "sha256:9be701c9b59d7a97aabff1b06485a5f6732d67fb7a9d594584d878551220407e", + "completedBy": "pi", + "completedRunId": "3987da8e-9067-4b2c-9cad-6c1887a6a089", + "gitHead": "fb6a61cafe38e396bcd7e62db73440317eacc671", + "sourceFingerprint": "sha256:4667dee4efe5724b2d14f4c6478fa22ef31e3487d4a0d0b4c44892a2437df10c" }, "/openwiki/concepts/persistence-and-secrets.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:28da4a8937c685126ea644d41a3c10463a61694aed7b1995a0000dc14c2fda26", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/concepts/remote-services-and-forwarding.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:1e4eef5e2d488910ccdbcf3616bc444102385fab199a2943de2f92fdcda2e229", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/concepts/session-persistence.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:2ed59dcbf9ae0617b9e3291aa35a453ee0b51b401583e3290e80d5ead6188004", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/concepts/shell-integration.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:23f30a866e4ea5eecc6052d4148f5020a0c180d8abc1eb35806fb73e02c37352", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/concepts/ssh-multiplexing-and-scheduling.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:49af55e7534ff981f1806d37725b4437e5c29f4d4c7e7b903dfab4731df4f63b", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/concepts/ssh-security-key-authentication.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:2bc89eb45c0a24f252dcf9b6355a8ab968bc10090020793e0476a14767077eae", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/concepts/ui-design-principles.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:b7d62f22f6f3696752172ddd76bc0d504c8f9ff870bb5000ce1f5fd93c04af41", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/integrations/mcp-server-and-bridge.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:c3ccdca16edbdc27416d3c01d7042194d77c10a79dfa5ab4e49382d61bc25c77", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/integrations/mosh-and-eternal-terminal.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:26549556869bfb94ffbd51beb2fb1d6709c0f8ae1cc7d334cf8e7f1dd70863f1", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/integrations/tailscale.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:0f77aea7639220f04174e7eac804efdfc62ad850d8f337e8aa163e65bc454dd0", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/operations/build-test-and-release.md": { - "pageVersion": "sha256:a802d5311ba01a12ed52b1a6fb06e250847e6e32990b437d11ea6f9fa89b98e9", - "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "pageVersion": "sha256:b72f64104c706f6b413ec96758f56df5b59d129714bf7f4a1ae045cbb4c20fcc", + "completedBy": "pi", + "completedRunId": "3987da8e-9067-4b2c-9cad-6c1887a6a089", + "gitHead": "fb6a61cafe38e396bcd7e62db73440317eacc671", + "sourceFingerprint": "sha256:4667dee4efe5724b2d14f4c6478fa22ef31e3487d4a0d0b4c44892a2437df10c" }, "/openwiki/operations/cloudkit-release-readiness.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:ab613bd80fb30d8ff31e61e9a18af80b3badbf8a4e9b8aeb6e4981e9d58341fa", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, - "/openwiki/operations/ghostty-fork-maintenance.md": { - "pageVersion": "sha256:d582cd363b9d34992901ecc8f174739d22a714e50f0c904c832b2af1836f4f2c", - "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "/openwiki/operations/ghostty-dependency-updates.md": { + "pageVersion": "sha256:bf8eaac6ab30842dc9207d43aab033fed8730421d4327e0fa2dfbc56a8667e66", + "completedBy": "pi", + "completedRunId": "3987da8e-9067-4b2c-9cad-6c1887a6a089", + "gitHead": "fb6a61cafe38e396bcd7e62db73440317eacc671", + "sourceFingerprint": "sha256:4667dee4efe5724b2d14f4c6478fa22ef31e3487d4a0d0b4c44892a2437df10c" }, "/openwiki/operations/marketing-assets-and-app-icons.md": { "gitHead": "fd88d64569b27ae4167254134dfa0d2030256ecb", @@ -170,25 +170,25 @@ "completedRunId": "6fb646d2-77a0-4176-995a-ed2f0c240faf" }, "/openwiki/operations/storefront-commerce-release.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:cae2c10c1170161a6b7ee24f7d64a5d16ea8c778ecd4361a45406d2ff07c9abf", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/quickstart.md": { - "pageVersion": "sha256:190f0aeb752d781c1a02d5809cd293277e2f59fa4468f7590dad0f99b412de4c", - "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "pageVersion": "sha256:3e427732160fb55215cac7625fc2a5c31836f9eb4678eb860253acdbdabe1c46", + "completedBy": "pi", + "completedRunId": "3987da8e-9067-4b2c-9cad-6c1887a6a089", + "gitHead": "fb6a61cafe38e396bcd7e62db73440317eacc671", + "sourceFingerprint": "sha256:4667dee4efe5724b2d14f4c6478fa22ef31e3487d4a0d0b4c44892a2437df10c" }, "/openwiki/testing/behavioral-boundaries-and-fixtures.md": { - "pageVersion": "sha256:03c71c26f247915e1162d221b17fa56241fae31fe2c6456b72458b3c8fc27ccb", - "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "pageVersion": "sha256:cebaf8f3662471723d04ee965808e64af5cca07cc5771fa8b96cc874b49108d6", + "completedBy": "pi", + "completedRunId": "3987da8e-9067-4b2c-9cad-6c1887a6a089", + "gitHead": "fb6a61cafe38e396bcd7e62db73440317eacc671", + "sourceFingerprint": "sha256:4667dee4efe5724b2d14f4c6478fa22ef31e3487d4a0d0b4c44892a2437df10c" }, "/openwiki/workflows/desktop-drag-and-drop.md": { "gitHead": "4216b55d96679fdf330faeae94eb934fe310e400", @@ -198,39 +198,39 @@ "completedRunId": "b5a38eee-98d8-49e0-b413-73d07a63a23d" }, "/openwiki/workflows/file-drag-and-drop.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:8a5d9cf23c4888c3f33b010603f3c47a8bf5ead61d29cd914f1f3e0270c94ad2", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/workflows/port-forwarding-pool-and-dispatch.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:43eb476c217d91346b2eb6158ed0e03db476b83c66e8c5844dea40d991d5592b", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/workflows/settings-and-cloud-sync.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:214976e91be022dcf34fd4e93f947993592736e5d63e2e8ac1995804c41bd4b3", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/workflows/sftp-transfer-and-external-edit.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:f02bdf2c30578599ec7f557a88a5ed3247d484efc11a277c1c078a2f120da815", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" }, "/openwiki/workflows/ssh-session-lifecycle.md": { + "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", + "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66", "pageVersion": "sha256:ec1df0647a34dd8c912b22ba83f41b8900eff786f9ccbe921dcdda8780619f42", "completedBy": "openwiki/0.7.2", - "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6", - "gitHead": "fbacda0515467124a84076ceee0f4fc50719b6f8", - "sourceFingerprint": "sha256:b06a052cb10092468e7573a45cf90a8bc1c065a1cd7fd3203d70ba5bce589b66" + "completedRunId": "a497c7c7-16a8-404f-a5c0-980b60bd09b6" } } } diff --git a/openwiki/concepts/ghostty-terminal-integration.md b/openwiki/concepts/ghostty-terminal-integration.md index 092a4ca1..2774e6df 100644 --- a/openwiki/concepts/ghostty-terminal-integration.md +++ b/openwiki/concepts/ghostty-terminal-integration.md @@ -70,17 +70,17 @@ sources: resource: repo://TFMTests/TerminalResizeThrottleTests.swift - id: openwiki-source-91826a88f242f001f33fff89 resource: repo://TFMTests/WindowToolbarFindTests.swift -generated: { by: "openwiki/0.7.2", at: "2026-10-18T12:28:54.264Z" } +generated: { by: "pi", at: "2026-10-18T17:39:35.546Z" } verified: - by: openwiki/0.7.2 - at: 2026-10-18T12:28:54.264Z + at: 2026-10-18T17:39:35.546Z --- # Ghostty Terminal Integration Termind uses the remote `libghostty-spm` package for terminal parsing, rendering and native input. SSH-backed terminals (SSH, Mosh and Eternal Terminal), Telnet and desktop serial transports remain Termind-owned. Each terminal supplies Ghostty's `InMemoryTerminalSession` with received bytes, outgoing writes and resize callbacks; a `TerminalViewState` and native view live with the session or workspace rather than with a transient SwiftUI mount. This preserves the grid, selection and scrollback across navigation and desktop pane moves. -The package is consumed directly from `https://github.com/Lakr233/libghostty-spm.git`, with no local Ghostty maintenance submodule. Xcode's package reference uses `upToNextMinorVersion` with `minimumVersion = 2.2.2026101502`; this is a compatible-version requirement, not an exact-version requirement. `Package.resolved` currently pins version `2.2.2026101502` at revision `42bacd1339f323a693ddbca779295f4f77e5a697`. Treat the requirement and resolved pin as separate parts of the embedding contract. See [Ghostty Dependency Updates](../operations/ghostty-fork-maintenance.md) for dependency-update procedures and requirement/resolution alignment. +The package is consumed directly from `https://github.com/Lakr233/libghostty-spm.git`, with no local Ghostty maintenance submodule. Xcode's package reference uses `upToNextMinorVersion` with `minimumVersion = 2.2.2026101502`; this is a compatible-version requirement, not an exact-version requirement. `Package.resolved` currently pins version `2.2.2026101502` at revision `42bacd1339f323a693ddbca779295f4f77e5a697`. Treat the requirement and resolved pin as separate parts of the embedding contract. See [Ghostty Dependency Updates](../operations/ghostty-dependency-updates.md) for dependency-update procedures and requirement/resolution alignment. ## Shared Find lifecycle and native dismissal diff --git a/openwiki/operations/build-test-and-release.md b/openwiki/operations/build-test-and-release.md index b12a4627..82bd72fc 100644 --- a/openwiki/operations/build-test-and-release.md +++ b/openwiki/operations/build-test-and-release.md @@ -82,10 +82,10 @@ sources: resource: repo://TFMTests/Screenshots/MacScreenshotTests.swift - id: openwiki-source-a08489338be00125d646c77e resource: repo://TFMTests/VisibleWindowTestTrait.swift -generated: { by: "openwiki/0.7.2", at: "2026-10-18T12:28:54.264Z" } +generated: { by: "pi", at: "2026-10-18T17:39:35.546Z" } verified: - by: openwiki/0.7.2 - at: 2026-10-18T12:28:54.264Z + at: 2026-10-18T17:39:35.546Z --- # Build, Test, and Release @@ -340,7 +340,7 @@ Do not skip the release or resolve steps: a project-file bump alone does not est Ghostty now comes directly from `Lakr233/libghostty-spm`, with **up-to-next-minor** minimum and resolved version `2.2.2026101502` at `42bacd1339f323a693ddbca779295f4f77e5a697`. There is no local Ghostty maintenance submodule, Termind native-patch/XCFramework release pipeline or keyword-highlighting override workspace. Do not use the removed preparation script or advance an obsolete fork gitlink. The project requirement is authoritative here: `AGENTS.md` still describes an up-to-next-major requirement. -Update the upstream requirement and `Package.resolved` together, then use resolved-only TFM and TFI builds and the affected adapter tests. Grouping, localization and upload policy remain Termind-owned around the package's separate touch/selection hooks. Package internals need their own source/test review; a host test or pin inspection is not a binary-release or live interaction result. See [Ghostty Dependency Updates](ghostty-fork-maintenance.md). +Update the upstream requirement and `Package.resolved` together, then use resolved-only TFM and TFI builds and the affected adapter tests. Grouping, localization and upload policy remain Termind-owned around the package's separate touch/selection hooks. Package internals need their own source/test review; a host test or pin inspection is not a binary-release or live interaction result. See [Ghostty Dependency Updates](ghostty-dependency-updates.md). ## Release-oriented checklist diff --git a/openwiki/operations/ghostty-dependency-updates.md b/openwiki/operations/ghostty-dependency-updates.md new file mode 100644 index 00000000..0675f1f6 --- /dev/null +++ b/openwiki/operations/ghostty-dependency-updates.md @@ -0,0 +1,163 @@ +--- +type: dependency-operations +title: Ghostty Dependency Updates +description: Update the direct upstream Ghostty Swift Package requirement and its resolved pin while keeping app-owned menu, keyboard, surface and upload behavior intact. +tags: [ghostty, dependencies, spm, macos, ios, terminal] +verified: + - by: openwiki/0.7.2 + at: 2026-10-18T17:39:35.546Z +sources: + - id: openwiki-source-ed77bc20b48d193bace3dde6 + resource: repo://.gitmodules + - id: openwiki-source-8037e2358a2c4f9b2c722a11 + resource: repo://AGENTS.md + - id: openwiki-source-cd0be716a2446029f345525a + resource: repo://Termind.xcodeproj/project.pbxproj + - id: openwiki-source-105d05d558f14996921a83f6 + resource: repo://Termind.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved + - id: openwiki-source-ca0b3e6e839587396cdeaf54 + resource: repo://TFI/Platform/MobileTerminalSurface.swift + - id: openwiki-source-b71d223a365340be42081723 + resource: repo://TFITests/MobileTerminalKeyboardTests.swift + - id: openwiki-source-4be25dd014939527fac996f5 + resource: repo://TFITests/MobileTerminalUploadMenuTests.swift + - id: openwiki-source-fe5539ed6f675410b82b41c4 + resource: repo://TFM/Features/Terminal/PersistentTerminalSurfaceView.swift + - id: openwiki-source-835d474e3dc193359dcfbb0b + resource: repo://TFMTests/TerminalContextMenuTests.swift + - id: openwiki-source-0840663ba1338ab9db59ad37 + resource: repo://TFMTests/TerminalMouseInteractionTests.swift +generated: { by: "pi", at: "2026-10-18T17:39:35.546Z" } +--- + +# Ghostty Dependency Updates + +Termind does not maintain a local Ghostty fork. Xcode consumes +`https://github.com/Lakr233/libghostty-spm.git` directly, and the app owns every +menu, upload and lifetime decision layered on top of the package's native entry +points. A Ghostty update is therefore a dependency-and-adapter change, not a +native patch or binary release. + +## Dependency contract + +| Input | Current value / responsibility | +| --- | --- | +| Remote repository | `Lakr233/libghostty-spm` (remote SPM package, no gitlink). | +| Xcode requirement | `upToNextMinorVersion` from `2.2.2026101502`, resolved product set `GhosttyTerminal`, `GhosttyTheme`, `GhosttyKit`. | +| Resolved version | `2.2.2026101502`. | +| Resolved revision | `42bacd1339f323a693ddbca779295f4f77e5a697`. | +| Local maintenance submodule | None; `.gitmodules` declares only `AgentKit`, `libssh2-spm`, `libtailscale-spm` and `com.akinokaede.termind`. | +| App-owned adapters | macOS `TermindTerminalView` in the persistent surface owner; iOS `MobileTerminalView` behind the retained `MobileTerminalSurface`. | + +The requirement and the resolved pin are separate parts of one contract. The +requirement in `project.pbxproj` expresses policy; `Package.resolved` selects the +revision that `-onlyUsePackageVersionsFromResolvedFile` builds actually use. Both +must land in the same commit as any adapter change they require. + +`AGENTS.md` still describes an up-to-next-major Ghostty requirement. The project +declaration and the committed lockfile are authoritative for the current +policy, so read them rather than the prose when preparing an update. + +```mermaid +flowchart LR + Upstream[Review upstream release and public APIs] --> Requirement[Update Xcode requirement] + Requirement --> Resolve[Re-resolve and inspect lockfile] + Resolve --> Mac[Resolved-only TFM build and adapter tests] + Resolve --> Mobile[Resolved-only TFI build and adapter tests] + Mac --> Commit[Commit requirement, pin and adapter change together] + Mobile --> Commit +``` + +## Update procedure + +1. Review the intended upstream release and the public APIs Termind actually + uses: touch menus, selection menus, key commands, find, resize, clipboard and + drag-and-drop. When a change depends on gesture, search, resize or native + binary internals, inspect the selected package source and its tests; host + overrides alone do not establish package internals. +2. Update the `libghostty-spm` requirement in `Termind.xcodeproj/project.pbxproj`, + re-resolve deliberately, and inspect the resulting `Package.resolved`. Do not + advance unrelated pins as a side effect. +3. Validate both native products against the resolved graph: + + ```sh + xcodebuild -project Termind.xcodeproj -scheme TFM -destination 'platform=macOS' -onlyUsePackageVersionsFromResolvedFile build + xcodebuild -project Termind.xcodeproj -scheme TFI -destination 'generic/platform=iOS Simulator' -onlyUsePackageVersionsFromResolvedFile build + ``` + +4. Run the affected adapter suites (see the regression table below), choosing a + real available simulator for mobile integration and opting into window or + key-window gates only when the interaction itself needs them. +5. Recheck localization for changed app menu copy and run the repository's + AppStrings and localization gates, plus strict Swift formatting for Swift + edits. + +There is no Termind Ghostty gitlink to advance and no Termind-owned binary URL or +checksum to publish: the upstream package owns its artifact publication. The +`libssh2-spm` maintenance-submodule and native-patch release procedure is +unrelated and must not be copied onto Ghostty. + +## Keep menu and surface behavior in Termind + +Ghostty owns rendering, parsing, baseline input and its native menu entry points. +Termind owns grouping, localization, commands, upload authorization and +view/session lifetimes. + +- **iOS touch menus.** `MobileTerminalView` overrides `touchMenuItems(for:)` and + `touchSelectionMenuItems(for:)` separately and routes each through the same + customizer. The two hooks stay distinct because Ghostty builds the selected-text + menu independently of the ordinary touch menu; a single override would drop one + context. Recognized actions are re-titled through `AppStrings`, editing actions + are grouped first as a medium-size inline row, the SSH Upload File group is + inserted, and unrelated inherited items are preserved. +- **macOS selection menu.** `TermindTerminalView` overrides `selectionMenuPoint(at:)` + to return `nil` while mouse input is captured and to offer the app's default + menu even when nothing is selected. `selectionContextMenu()` keeps the + superclass selection menu only when the superclass reports a selection, + localizes Copy, and appends localized Paste, Select All, Upload File and an + Open with SFTP submenu with app-owned actions. +- **Availability is re-checked on invocation.** Upload and SFTP actions test their + capability closure again when the item is triggered, so a stale menu cannot + send a file to a disconnected or changed destination. Paste enablement follows + clipboard contents at menu-build time. +- **Right-click paste stays a host preference.** Paste-on-right-click applies only + when the setting is on, no mouse input is captured and Option is not held; + Option bypass and captured input remain host behavior, not an iOS hook contract. +- **Surfaces outlive SwiftUI mounts.** Native terminal views are owned per + workspace/session, so Find presentation, search suspension during resize and + remount behavior are app concerns and must not be collapsed into package menu + behavior. + +See [Ghostty Terminal Integration](../concepts/ghostty-terminal-integration.md) +for the transport boundary and package-inspection limits. + +## Focused regression checks + +A successful resolve is not acceptance for a Ghostty update. Run the affected +adapter suites against the new resolved graph: + +| Boundary | Regression coverage to retain | +| --- | --- | +| macOS context menu | `TerminalContextMenuTests` checks that Upload File appears only when bound, reflects live availability, and does not fire while unavailable. | +| macOS mouse and drag integration | `TerminalMouseInteractionTests` checks copy-on-release, right-click paste routing and Option bypass, once-only bracketed paste/broadcast, captured mouse reports without broadcast or clipboard mutation, path drops, and upload picker attachment to the persistent window. | +| iOS touch menus | `MobileTerminalUploadMenuTests` checks that editing actions form the first row, AutoFill and upload stay after it, and upload actions are disabled when unavailable. | +| iOS keyboard integration | `MobileTerminalKeyboardTests` checks native accessory grouping and localized labels across OS-specific geometry, plus readiness-gated focus, remount behavior, literal symbol output versus bracketed paste, sticky modifiers and surface identity across keyboard toggles. | + +The mobile keyboard integration suite requires a key window: opt in with +`TEST_RUNNER_TERMIND_MOBILE_UI_TESTS=1`, use `-parallel-testing-enabled NO`, and +target a real available simulator with a narrow +`-only-testing:TFITests/MobileTerminalKeyboardIntegrationTests` filter. The macOS +mouse suite requires a visible window: opt in with +`TEST_RUNNER_TERMIND_WINDOW_TESTS=1` and +`-only-testing:TFMTests/TerminalMouseInteractionTests`. Keep these gates off for +routine logic checks. Extend verification to Find, resize, shell integration and +remote interaction when an upstream change touches those boundaries; see +[Shell Integration](../concepts/shell-integration.md). + +## Verification limits + +Pin and manifest inspection proves dependency selection, not an upstream binary +rebuild, a supported platform slice, a live gesture result or remote terminal +behavior. A host adapter test does not prove package internals. Use +[Build, Test, and Release](build-test-and-release.md) for pinned build commands +and the opt-in test flags. diff --git a/openwiki/operations/ghostty-fork-maintenance.md b/openwiki/operations/ghostty-fork-maintenance.md deleted file mode 100644 index eab76483..00000000 --- a/openwiki/operations/ghostty-fork-maintenance.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -type: dependency-operations -title: Ghostty Dependency Maintenance -description: Update the direct upstream Ghostty Swift Package pin while preserving app-owned menu, input, surface and upload boundaries. -tags: [ghostty, dependencies, spm, macos, ios, terminal] -sources: - - id: openwiki-source-ed77bc20b48d193bace3dde6 - resource: repo://.gitmodules - - id: openwiki-source-8037e2358a2c4f9b2c722a11 - resource: repo://AGENTS.md - - id: openwiki-source-cd0be716a2446029f345525a - resource: repo://Termind.xcodeproj/project.pbxproj - - id: openwiki-source-105d05d558f14996921a83f6 - resource: repo://Termind.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved - - id: openwiki-source-ca0b3e6e839587396cdeaf54 - resource: repo://TFI/Platform/MobileTerminalSurface.swift - - id: openwiki-source-b71d223a365340be42081723 - resource: repo://TFITests/MobileTerminalKeyboardTests.swift - - id: openwiki-source-4be25dd014939527fac996f5 - resource: repo://TFITests/MobileTerminalUploadMenuTests.swift - - id: openwiki-source-fe5539ed6f675410b82b41c4 - resource: repo://TFM/Features/Terminal/PersistentTerminalSurfaceView.swift - - id: openwiki-source-835d474e3dc193359dcfbb0b - resource: repo://TFMTests/TerminalContextMenuTests.swift -generated: { by: "openwiki/0.7.2", at: "2026-10-18T12:28:54.264Z" } -verified: - - by: openwiki/0.7.2 - at: 2026-10-18T12:28:54.264Z ---- - -# Ghostty Dependency Maintenance - -The canonical page path is retained for existing links, but **Termind no longer maintains a local Ghostty fork/submodule**. Xcode consumes `https://github.com/Lakr233/libghostty-spm.git` directly. The former `termind`-branch fork, native patch/XCFramework release workflow and `build/KeywordHighlighting` override workspace are not current Termind operations. - -## Current dependency contract - -| Input | Current value / responsibility | -| --- | --- | -| Remote repository | `Lakr233/libghostty-spm`. | -| Xcode requirement | `upToNextMinorVersion` starting at `2.2.2026101502` (below `2.3.0`). | -| Resolved version | `2.2.2026101502`. | -| Resolved revision | `42bacd1339f323a693ddbca779295f4f77e5a697`. | -| Local maintenance submodule | None; `.gitmodules` does not declare Ghostty. | -| App-owned adapters | macOS `TermindTerminalView` / retained view owner, iOS `MobileTerminalView` / retained `MobileTerminalSurface`. | - -The minimum requirement is not an exact pin; `Package.resolved` selects the revision used by `-onlyUsePackageVersionsFromResolvedFile` builds. No local directory edit or obsolete generated workspace changes that remote build input, and there is no local Ghostty staging override. For the version policy, the [project declaration](../../Termind.xcodeproj/project.pbxproj) and [committed lockfile](../../Termind.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved) are authoritative: `AGENTS.md` still describes an up-to-next-major requirement, but the current project uses up-to-next-minor. - -```mermaid -flowchart LR - Upstream[Review upstream release] --> Requirement[Update Xcode requirement] - Requirement --> Resolve[Re-resolve and inspect lockfile] - Resolve --> Mac[Resolved-only TFM build and adapter tests] - Resolve --> Mobile[Resolved-only TFI build and adapter tests] - Mac --> Commit[Commit requirement and resolved pin together] - Mobile --> Commit -``` -The update workflow validates both app adapters before committing the aligned requirement and resolution. - -## Update procedure - -1. Review the intended upstream release and relevant public APIs. If the change depends on gesture, search, resize, clipboard or native binary internals, inspect the **selected package source/tests**; host overrides alone do not establish those internals. -2. Update the Ghostty requirement in `Termind.xcodeproj/project.pbxproj`, intentionally re-resolve packages, and inspect the resulting `Package.resolved`. Do not advance unrelated dependencies casually. Commit both dependency records together with any required app adapter change. -3. Validate both native products against the resolved graph: - - ```sh - xcodebuild -project Termind.xcodeproj -scheme TFM -destination 'platform=macOS' -onlyUsePackageVersionsFromResolvedFile build - xcodebuild -project Termind.xcodeproj -scheme TFI -destination 'generic/platform=iOS Simulator' -onlyUsePackageVersionsFromResolvedFile build - ``` - -4. Run the affected surface/menu/Find tests, choosing a real available simulator for mobile integration. Keep native window gates off for ordinary logic checks; opt into a narrow visible-window/key-window suite only when its interaction needs validation. Record actual tests and manual interaction results, not just a successful dependency resolve. -5. Recheck localization and both Chinese scripts for changed app menu copy. Run strict Swift formatting for Swift edits and the repository's AppStrings/localization commit gates. - -There is **no Termind Ghostty gitlink to advance** and no Termind-owned binary URL/checksum release to publish first. The upstream package owns its artifact publication. libssh2's maintenance-submodule/native-patch release procedure is separate and must not be copied onto Ghostty. - -## Keep native customization in Termind - -Ghostty owns rendering, parsing, baseline input and its native menu entry points. Termind owns grouping, localization, commands, upload authorization and view/session lifetimes: - -- iOS uses separate `touchMenuItems(for:)` and `touchSelectionMenuItems(for:)` overrides in [MobileTerminalView](../../TFI/Platform/MobileTerminalSurface.swift). Each calls the matching superclass hook, localizes recognized action identifiers, groups editing actions first, adds an SSH Upload File group and preserves unrelated inherited items. -- macOS independently overrides `selectionContextMenu()` and `selectionMenuPoint(at:)` to offer a default menu even without a selection, but suppresses menus during captured mouse input. It retains the superclass selection menu only when the superclass reports a selection, localizes Copy, and appends localized Paste and Select All. Paste availability follows clipboard contents. Bound Upload File and Open with SFTP actions are app-owned additions; the SFTP submenu offers current/new workspace placement and rechecks availability on invocation. Paste-on-right-click and Option bypass remain host preferences, not an iOS hook contract. -- Upload availability is checked again on invocation; a stale menu is not permission to send a file to a disconnected or changed destination. -- Native surfaces remain session/workspace-owned across SwiftUI mount changes. App Find state, native search dismissal and resize coordination must not be collapsed into package menu behavior. - -See [Ghostty Terminal Integration](../concepts/ghostty-terminal-integration.md) for host/test evidence and its explicit package-inspection boundary. The retired app keyword-highlighting feature is handled by V52/Settings compatibility, not a reason to resurrect the deleted fork workspace. See [Persistent Data and Secrets](../concepts/persistence-and-secrets.md). - -## Focused regression checks - -A successful resolve is not sufficient acceptance for a Ghostty update. Run the relevant adapter suites against the new resolved graph: - -| Boundary | Regression coverage to retain | -| --- | --- | -| iOS native accessory | [MobileTerminalKeyboardTests](../../TFITests/MobileTerminalKeyboardTests.swift) checks upstream key grouping with Paste last and matching accessibility labels. Geometry expectations are OS-specific: 60-point intrinsic height on iOS 26 and later, 52 points on earlier systems, and 36 × 36-point buttons. At widths 320, 390, 430, 844 and 1024, scrolling to the end must make Paste reachable. | -| iOS keyboard integration | `MobileTerminalKeyboardIntegrationTests` in the same file checks readiness-gated initial focus, remount behavior, literal symbol output versus bracketed clipboard paste, sticky modifiers during composition, and surface identity across keyboard toggles. | -| macOS mouse and drag integration | [TerminalMouseInteractionTests](../../TFMTests/TerminalMouseInteractionTests.swift) checks copy-on-release, right-click paste routing and Option bypass, once-only bracketed paste/broadcast, captured mouse reports without broadcast or clipboard mutation, path drops, and upload picker attachment to the persistent window. | -| Native menu adapters | `MobileTerminalUploadMenuTests` and `TerminalContextMenuTests` protect menu grouping, localization-facing action identifiers, upload bindings and action-time availability checks. | - -The mobile keyboard integration suite requires a key window: opt in with `TEST_RUNNER_TERMIND_MOBILE_UI_TESTS=1`, use `-parallel-testing-enabled NO`, and select a real available simulator with a narrow `-only-testing:TFITests/MobileTerminalKeyboardIntegrationTests` filter. The macOS mouse suite requires a visible window and active display: opt in with `TEST_RUNNER_TERMIND_WINDOW_TESTS=1` and `-only-testing:TFMTests/TerminalMouseInteractionTests`. Keep these gates off for routine logic checks. Expand verification to Find, resize, shell integration and remote interaction when the upstream change touches those boundaries; see [Shell Integration](../concepts/shell-integration.md). - -## Verification limits - -Pin/manifest inspection proves dependency selection, not an upstream binary rebuild, supported platform slice, live gesture result or remote terminal behavior. This documentation update does not itself claim those builds or interactions ran. Use [Build, Test, and Release](build-test-and-release.md) for pinned validation and opt-in flags. diff --git a/openwiki/operations/index.md b/openwiki/operations/index.md index 718dc5ec..998f29b8 100644 --- a/openwiki/operations/index.md +++ b/openwiki/operations/index.md @@ -2,7 +2,7 @@ - [Build, Test, and Release](build-test-and-release.md) - Reproducible Xcode builds and pinned dependency updates, opt-in UI and commerce test gates, and localization checks for Termind releases. - [CloudKit Release Readiness](cloudkit-release-readiness.md) - Release gates for CloudKit schema deployment, historical SwiftData store upgrades, scoped sync recovery, physical deletion and signed-device compatibility. -- [Ghostty Dependency Maintenance](ghostty-fork-maintenance.md) - Update the direct upstream Ghostty Swift Package pin while preserving app-owned menu, input, surface and upload boundaries. +- [Ghostty Dependency Updates](ghostty-dependency-updates.md) - Update the direct upstream Ghostty Swift Package requirement and its resolved pin while keeping app-owned menu, keyboard, surface and upload behavior intact. - [Marketing Assets and App Icons](marketing-assets-and-app-icons.md) - Ownership and safe updates for localized marketing captures, layered app icons, and runtime host artwork. Covers asset gitlinks, reproducible generation, licensing boundaries, and focused validation. - [Port Forwarding Benchmarks](port-forwarding-benchmarks.md) - Historical forwarding measurements, workload semantics, retained transport decisions, comparison limits, and reproducible loopback commands. - [Storefront and Commerce Release](storefront-commerce-release.md) - Release checklist for the local StoreKit product fixture, RevenueCat entitlement and paywall configuration, cross-platform access refresh, and Sandbox validation. diff --git a/openwiki/quickstart.md b/openwiki/quickstart.md index 0b4d1ab7..0126deb9 100644 --- a/openwiki/quickstart.md +++ b/openwiki/quickstart.md @@ -84,10 +84,10 @@ sources: resource: repo://TFMTests/WebAuthnSSHTests.swift - id: openwiki-source-d798805795e92534f3b13250 resource: repo://TFMTests/WorkspaceCloseConfirmationTests.swift -generated: { by: "openwiki/0.7.2", at: "2026-10-18T12:28:54.264Z" } +generated: { by: "pi", at: "2026-10-18T17:39:35.546Z" } verified: - by: openwiki/0.7.2 - at: 2026-10-18T12:28:54.264Z + at: 2026-10-18T17:39:35.546Z --- # Termind Engineering Quickstart @@ -120,7 +120,7 @@ Termind is one Xcode project with native `TFM` (macOS) and `TFI` (iPhone/iPad) a | SSH admission/backpressure and multiplexed I/O | [SSH Multiplexing and Scheduling](concepts/ssh-multiplexing-and-scheduling.md) | Multiplexer and worker-lifecycle tests | | Security Key registration, signing, Vault metadata, silent-connection restrictions | [SSH Security-Key Authentication](concepts/ssh-security-key-authentication.md) | `WebAuthnVaultMetadataTests`, `WebAuthnSSHTests`, `SSHInteractionPolicyTests` | | Terminal Find, mobile search dismissal, SFTP filtering, retained surfaces | [Ghostty Terminal Integration](concepts/ghostty-terminal-integration.md) and [Mobile UI](architecture/mobile-ui.md) | `TerminalFindControllerTests`, `MobileTerminalSearchIntegrationTests` in `TFITests/MobileTerminalSearchTests.swift` | -| Ghostty menus, touch selection, fonts/themes, surface identity or dependency APIs | [Ghostty Terminal Integration](concepts/ghostty-terminal-integration.md) and [Ghostty Dependency Maintenance](operations/ghostty-fork-maintenance.md) | `MobileTerminalUploadMenuTests`, `TerminalContextMenuTests`; review resolved upstream source for package internals | +| Ghostty menus, touch selection, fonts/themes, surface identity or dependency APIs | [Ghostty Terminal Integration](concepts/ghostty-terminal-integration.md) and [Ghostty Dependency Updates](operations/ghostty-dependency-updates.md) | `MobileTerminalUploadMenuTests`, `TerminalContextMenuTests`; review resolved upstream source for package internals | | Active directory, draft input, command lifecycle and context consumers | [Shell Integration and Terminal Context](concepts/shell-integration.md) | Context and command-monitor tests | | Terminal/metrics/Agent service ownership, host-scoped forwarding | [Remote Services and Forwarding Boundaries](concepts/remote-services-and-forwarding.md) → [Port Forwarding Pool and Dispatch](workflows/port-forwarding-pool-and-dispatch.md) | Service/pump/pool tests; native metrics authentication uses `MetricsJourneyRenderingTests` and `MobileMetricsJourneyTests` | | Tailscale groups, login/logout, peer identity, routing and cleanup | [Tailscale Integration](integrations/tailscale.md) | Group-editor, identity, integration, cleanup, metrics and sync-safety tests | diff --git a/openwiki/testing/behavioral-boundaries-and-fixtures.md b/openwiki/testing/behavioral-boundaries-and-fixtures.md index 509e18d8..e20ee774 100644 --- a/openwiki/testing/behavioral-boundaries-and-fixtures.md +++ b/openwiki/testing/behavioral-boundaries-and-fixtures.md @@ -172,10 +172,10 @@ sources: resource: repo://TFMTests/VisibleWindowTestTrait.swift - id: openwiki-source-d798805795e92534f3b13250 resource: repo://TFMTests/WorkspaceCloseConfirmationTests.swift -generated: { by: "openwiki/0.7.2", at: "2026-10-18T12:28:54.264Z" } +generated: { by: "pi", at: "2026-10-18T17:39:35.546Z" } verified: - by: openwiki/0.7.2 - at: 2026-10-18T12:28:54.264Z + at: 2026-10-18T17:39:35.546Z --- # Behavioral Boundaries and Fixtures @@ -351,7 +351,7 @@ For tool-card changes use `AgentToolPresentationTests`: the registered tool's ar For Ghostty menu changes, test the app seams: `TFMTests/TerminalContextMenuTests.swift` checks AppKit blank-space and selection menus, Paste on Right Click/Option behavior, live upload availability and late pane teardown; `TFITests/MobileTerminalUploadMenuTests.swift` checks the native Photos/Files group and disabled states. The mobile suite also checks localized editing actions before Upload and system AutoFill, for both unselected and selected menus. It is serialized but constructs menus offscreen, without a key window or the mobile UI gate. -Package gesture/selection validation remains a separate **upstream-package step**, not locally inspected or executed coverage here. Ghostty comes directly from `Lakr233/libghostty-spm`; there is no local maintenance submodule to initialize. Inspect the selected package's source/tests for direct-touch, indirect-pointer and dispatch behavior rather than assuming the removed fork's paths. Termind owns grouping/localization through separate `touchMenuItems(for:)` / `touchSelectionMenuItems(for:)` overrides; app composition tests do not establish package internals. See [Ghostty Terminal Integration](../concepts/ghostty-terminal-integration.md) and [Ghostty Dependency Updates](../operations/ghostty-fork-maintenance.md). +Package gesture/selection validation remains a separate **upstream-package step**, not locally inspected or executed coverage here. Ghostty comes directly from `Lakr233/libghostty-spm`; there is no local maintenance submodule to initialize. Inspect the selected package's source/tests for direct-touch, indirect-pointer and dispatch behavior rather than assuming the removed fork's paths. Termind owns grouping/localization through separate `touchMenuItems(for:)` / `touchSelectionMenuItems(for:)` overrides; app composition tests do not establish package internals. See [Ghostty Terminal Integration](../concepts/ghostty-terminal-integration.md) and [Ghostty Dependency Updates](../operations/ghostty-dependency-updates.md). For MCP upload changes use `MCPUploadTests` with the real coordinator and streaming operation, a fake SFTP client and controlled clock. Protect ticket/run scope and capacity, acknowledged-offset resume and full digest, bounded streaming/backpressure, timeout/cancellation and cleanup residue, revocation on disable, conflict policy and queryable terminal status. `actualHTTPRouteStreamsAboveTheMCPBodyLimit` additionally runs a loopback HTTP server for fresh and resumed bodies larger than the ordinary MCP limit; a passing fake SFTP upload does not establish interoperability with a real remote server.