From 05cf5f38862abd94ecd0466f4dce45c77d4516f8 Mon Sep 17 00:00:00 2001 From: sirily11 <32106111+sirily11@users.noreply.github.com> Date: Thu, 14 May 2026 14:01:19 +0800 Subject: [PATCH] fix: release ci --- .github/workflows/build.yaml | 9 +- .github/workflows/test.yaml | 34 +- .../Sources/RxCodeChatKit/MessageBubble.swift | 39 +-- RxCode.xcodeproj/project.pbxproj | 4 - RxCodeTests/InputBarDisableTests.swift | 88 ----- appcast.xml | 325 ------------------ 6 files changed, 47 insertions(+), 452 deletions(-) delete mode 100644 RxCodeTests/InputBarDisableTests.swift delete mode 100644 appcast.xml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0d195065..755a832d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -8,6 +8,9 @@ on: push: branches: - main + release: + types: + - created jobs: build: @@ -26,12 +29,6 @@ jobs: with: xcode-version: latest-stable - - name: Cache Xcode derived data - uses: irgaly/xcode-cache@v1 - with: - key: xcode-cache-deriveddata-${{ github.workflow }}-${{ github.ref_name }} - restore-keys: xcode-cache-deriveddata-${{ github.workflow }}-${{ github.ref_name }} - - name: Install create-dmg run: npm install --global create-dmg diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index df1dc22b..17a93366 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ concurrency: on: push: - + jobs: test-packages: name: swift test (Packages) @@ -33,8 +33,8 @@ jobs: set -o pipefail swift test 2>&1 | xcpretty - build-smoke: - name: xcodebuild build (Release) + test-xcode: + name: xcodebuild test (RxCode) runs-on: self-hosted steps: @@ -46,11 +46,31 @@ jobs: with: xcode-version: latest-stable - - name: Cache Xcode derived data - uses: irgaly/xcode-cache@v1 + - name: Install xcpretty + run: gem install xcpretty + + - name: Run Xcode tests + run: | + set -o pipefail && xcodebuild \ + -project RxCode.xcodeproj \ + -scheme RxCode \ + -configuration Debug \ + -destination platform=macOS \ + CODE_SIGNING_ALLOWED=NO \ + test | xcpretty + + build-smoke: + name: xcodebuild build (Release) + runs-on: self-hosted + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Setup Xcode + uses: maxim-lobanov/setup-xcode@v1 with: - key: xcode-cache-deriveddata-${{ github.workflow }}-${{ github.ref_name }} - restore-keys: xcode-cache-deriveddata-${{ github.workflow }}-${{ github.ref_name }} + xcode-version: latest-stable - name: Install xcpretty run: gem install xcpretty diff --git a/Packages/Sources/RxCodeChatKit/MessageBubble.swift b/Packages/Sources/RxCodeChatKit/MessageBubble.swift index 5e59a831..fd835bf4 100644 --- a/Packages/Sources/RxCodeChatKit/MessageBubble.swift +++ b/Packages/Sources/RxCodeChatKit/MessageBubble.swift @@ -260,9 +260,9 @@ struct MessageBubble: View { .buttonStyle(.plain) } } - .fixedSize(horizontal: false, vertical: true) .frame(maxWidth: 500, alignment: .leading) .bubbleStyle(.user) + .fixedSize(horizontal: true, vertical: false) .overlay(alignment: .bottomTrailing) { if isHoveringUserBubble { HStack(spacing: 3) { @@ -473,6 +473,10 @@ struct MessageBubble: View { .aspectRatio(contentMode: .fill) .frame(width: 40, height: 40) .clipShape(RoundedRectangle(cornerRadius: ClaudeTheme.cornerRadiusSmall)) + .overlay( + RoundedRectangle(cornerRadius: ClaudeTheme.cornerRadiusSmall) + .strokeBorder(ClaudeTheme.border, lineWidth: BubbleStyle.borderWidth) + ) .contentShape(Rectangle()) .onTapGesture { previewImagePath = path } } else { @@ -499,6 +503,10 @@ struct MessageBubble: View { .aspectRatio(contentMode: .fill) .frame(width: 40, height: 40) .clipShape(RoundedRectangle(cornerRadius: ClaudeTheme.cornerRadiusSmall)) + .overlay( + RoundedRectangle(cornerRadius: ClaudeTheme.cornerRadiusSmall) + .strokeBorder(ClaudeTheme.border, lineWidth: BubbleStyle.borderWidth) + ) } else { Image(systemName: info.isImage ? "photo" : "doc") .font(.system(size: ClaudeTheme.messageSize(14))) @@ -588,27 +596,7 @@ private struct MessageImagePreviewSheet: View { let onDismiss: () -> Void var body: some View { - VStack(spacing: 0) { - HStack { - Text(URL(fileURLWithPath: path).lastPathComponent) - .font(.system(size: ClaudeTheme.messageSize(12), weight: .medium)) - .foregroundStyle(ClaudeTheme.textSecondary) - .lineLimit(1) - .truncationMode(.middle) - Spacer() - Button(action: onDismiss) { - Image(systemName: "xmark.circle.fill") - .font(.system(size: ClaudeTheme.messageSize(16))) - .foregroundStyle(ClaudeTheme.textSecondary) - } - .buttonStyle(.plain) - .keyboardShortcut(.cancelAction) - } - .padding(.horizontal, 14) - .padding(.vertical, 10) - - Divider() - + NavigationStack { Group { if let nsImage = NSImage(contentsOfFile: path) { Image(nsImage: nsImage) @@ -627,6 +615,13 @@ private struct MessageImagePreviewSheet: View { } } .padding(16) + .navigationTitle(URL(fileURLWithPath: path).lastPathComponent) + .toolbar { + ToolbarItem(placement: .cancellationAction) { + Button(String(localized: "Close", bundle: .module), action: onDismiss) + .keyboardShortcut(.cancelAction) + } + } } .frame(minWidth: 480, idealWidth: 720, minHeight: 360, idealHeight: 540) .background(ClaudeTheme.surfacePrimary) diff --git a/RxCode.xcodeproj/project.pbxproj b/RxCode.xcodeproj/project.pbxproj index a14e10a3..673f2c68 100644 --- a/RxCode.xcodeproj/project.pbxproj +++ b/RxCode.xcodeproj/project.pbxproj @@ -13,7 +13,6 @@ DF06CCD12FB4CAB5005991E1 /* ViewInspector in Frameworks */ = {isa = PBXBuildFile; productRef = DF06CCD02FB4CAB5005991E1 /* ViewInspector */; }; DFA0CCD12FB4CC01005991E1 /* PlanDecisionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFA0CCC02FB4CC01005991E1 /* PlanDecisionTests.swift */; }; DFA0CCD22FB4CC01005991E1 /* PlanCardViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFA0CCC12FB4CC01005991E1 /* PlanCardViewTests.swift */; }; - DFA0CCD32FB4CC01005991E1 /* InputBarDisableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFA0CCC22FB4CC01005991E1 /* InputBarDisableTests.swift */; }; DFA0CCD42FB4CC01005991E1 /* RxCodeChatKit in Frameworks */ = {isa = PBXBuildFile; productRef = DFA0CCC32FB4CC01005991E1 /* RxCodeChatKit */; }; E6821AC12F7CEE7200829FC9 /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = E6A001012F8A000100000001 /* SwiftTerm */; }; E6C001022F9B000100000001 /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = E6C001012F9B000100000001 /* Sparkle */; }; @@ -37,7 +36,6 @@ A9993BB72A5307039A88B729 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.0.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; DFA0CCC02FB4CC01005991E1 /* PlanDecisionTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PlanDecisionTests.swift; sourceTree = ""; }; DFA0CCC12FB4CC01005991E1 /* PlanCardViewTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PlanCardViewTests.swift; sourceTree = ""; }; - DFA0CCC22FB4CC01005991E1 /* InputBarDisableTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InputBarDisableTests.swift; sourceTree = ""; }; E67335382F7356F600FD26C7 /* RxCode.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RxCode.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -81,7 +79,6 @@ 4381E755142272EB2DAA9C96 /* AppStateProjectSwitchTests.swift */, DFA0CCC02FB4CC01005991E1 /* PlanDecisionTests.swift */, DFA0CCC12FB4CC01005991E1 /* PlanCardViewTests.swift */, - DFA0CCC22FB4CC01005991E1 /* InputBarDisableTests.swift */, ); path = RxCodeTests; sourceTree = ""; @@ -240,7 +237,6 @@ 33993F0F87CF4DB09F2813A8 /* AppStateProjectSwitchTests.swift in Sources */, DFA0CCD12FB4CC01005991E1 /* PlanDecisionTests.swift in Sources */, DFA0CCD22FB4CC01005991E1 /* PlanCardViewTests.swift in Sources */, - DFA0CCD32FB4CC01005991E1 /* InputBarDisableTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/RxCodeTests/InputBarDisableTests.swift b/RxCodeTests/InputBarDisableTests.swift deleted file mode 100644 index dfa7a774..00000000 --- a/RxCodeTests/InputBarDisableTests.swift +++ /dev/null @@ -1,88 +0,0 @@ -import XCTest -import RxCodeCore -@testable import RxCodeChatKit - -@MainActor -final class InputBarDisableTests: XCTestCase { - - // MARK: - hasPendingPlanDecision drives the input lock - - func testHasPendingPlanDecision_noMessages() { - let bridge = ChatBridge() - bridge.messages = [] - XCTAssertFalse(bridge.hasPendingPlanDecision) - } - - func testHasPendingPlanDecision_undecidedPlan_isTrue() { - let bridge = ChatBridge() - bridge.messages = [ - makeAssistantMessage(toolCall: makeExitPlanToolCall(result: nil)), - ] - XCTAssertTrue(bridge.hasPendingPlanDecision, - "Input must lock while the latest plan card is awaiting a decision") - } - - func testHasPendingPlanDecision_decidedPlan_isFalse() { - let bridge = ChatBridge() - bridge.messages = [ - makeAssistantMessage(toolCall: makeExitPlanToolCall(result: "Accepted with Edits")), - ] - XCTAssertFalse(bridge.hasPendingPlanDecision, - "Input must unlock once the plan is decided") - } - - func testHasPendingPlanDecision_rejectedWithFeedback_isFalse() { - let bridge = ChatBridge() - bridge.messages = [ - makeAssistantMessage(toolCall: makeExitPlanToolCall(result: "Rejected: try SQLite")), - ] - XCTAssertFalse(bridge.hasPendingPlanDecision) - } - - func testHasPendingPlanDecision_cliNoiseInResult_isTrue() { - // "Exit plan mode?" is CLI-side text, not a user decision summary — - // the input must stay locked until the user actually clicks something. - let bridge = ChatBridge() - bridge.messages = [ - makeAssistantMessage(toolCall: makeExitPlanToolCall(result: "Exit plan mode?")), - ] - XCTAssertTrue(bridge.hasPendingPlanDecision) - } - - func testHasPendingPlanDecision_onlyLatestPlanMatters() { - // A newer decided plan unlocks the input even if an earlier plan is still - // recorded as pending in the message history. - let bridge = ChatBridge() - bridge.messages = [ - makeAssistantMessage(toolCall: makeExitPlanToolCall(id: "old", result: nil)), - makeAssistantMessage(toolCall: makeExitPlanToolCall(id: "new", result: "Accepted with Edits")), - ] - XCTAssertFalse(bridge.hasPendingPlanDecision) - } - - func testHasPendingPlanDecision_ignoresUnrelatedToolCalls() { - let bridge = ChatBridge() - let bash = ToolCall(id: "x", name: "Bash", input: [:], result: nil, isError: false) - bridge.messages = [makeAssistantMessage(toolCall: bash)] - XCTAssertFalse(bridge.hasPendingPlanDecision) - } - - // MARK: - Helpers - - private func makeExitPlanToolCall( - id: String = "tool-1", - result: String? - ) -> ToolCall { - ToolCall( - id: id, - name: "ExitPlanMode", - input: ["plan": .string("# Plan")], - result: result, - isError: false - ) - } - - private func makeAssistantMessage(toolCall: ToolCall) -> ChatMessage { - ChatMessage(role: .assistant, blocks: [.toolCall(toolCall)]) - } -} diff --git a/appcast.xml b/appcast.xml deleted file mode 100644 index 8dc0730e..00000000 --- a/appcast.xml +++ /dev/null @@ -1,325 +0,0 @@ - - - - RxCode - RxCode Updates - en - - - RxCode v1.1.9 - 15 - 1.1.9 - 15.0 - Thu, 24 Apr 2026 00:00:00 +0000 - - - - - RxCode v1.1.8 - 14 - 1.1.8 - 15.0 - Tue, 22 Apr 2026 00:00:00 +0000 - - - - - RxCode v1.1.4 - 9 - 1.1.4 - 15.0 - Sun, 20 Apr 2026 00:00:00 +0000 - - - - RxCode v1.1.3 - 8 - 1.1.3 - 15.0 - Sun, 20 Apr 2026 00:00:00 +0000 - - - - RxCode v1.1.2 - 7 - 1.1.2 - 15.0 - Sun, 20 Apr 2026 00:00:00 +0000 - - - - RxCode v1.1.0 - https://github.com/ttnear/RxCode/releases/tag/v1.1.0 - Fri, 17 Apr 2026 07:56:20 +0000 - - 15.0 - - - RxCode v1.0.2 - https://github.com/ttnear/RxCode/releases/tag/v1.0.2 - Wed, 15 Apr 2026 07:57:18 +0000 - - 15.0 - - - RxCode v1.0.1 - https://github.com/ttnear/RxCode/releases/tag/v1.0.1 - Wed, 15 Apr 2026 06:56:38 +0000 - - 15.0 - - - RxCode v1.0.0 - https://github.com/ttnear/RxCode/releases/tag/v1.0.0 - Tue, 15 Apr 2026 00:00:00 +0000 - - 15.0 - - - RxCode v1.1.1 - 6 - 1.1.1 - 15.0 - Fri, 17 Apr 2026 12:50:10 +0000 - - - - RxCode v1.1.6 - 12 - 1.1.6 - 15.0 - Sun, 20 Apr 2026 00:00:00 +0000 - - - - RxCode v1.1.5 - 11 - 1.1.5 - 15.0 - Mon, 20 Apr 2026 06:47:18 +0000 - - - - RxCode v1.1.7 - 13 - 1.1.7 - 15.0 - Tue, 21 Apr 2026 09:08:19 +0000 - - - - RxCode v1.2.0 - 16 - 1.2.0 - 15.0 - Mon, 27 Apr 2026 08:01:55 +0000 - New -
    -
  • Independent font size controls for the interface and the message area — adjust each separately in Settings.
  • -
  • Auto-preview toggles for pasted images and dropped files, so you can decide when attachments preview automatically.
  • -
-

Improved

-
    -
  • Blockquotes now render as a single continuous vertical bar instead of breaking between lines.
  • -
  • Links open directly in your default browser, skipping the macOS link popup.
  • -
-

Fixed

-
    -
  • An error bubble now appears when a response stream ends without producing any visible output, so failed turns are no longer silent.
  • -
- ]]>
- -
- - RxCode v1.2.1 - 18 - 1.2.1 - 15.0 - Tue, 28 Apr 2026 04:42:34 +0000 - New -
    -
  • Move permission mode, model, and effort chips from the chat toolbar into the input composer for faster per-session control.
  • -
-

Improved

-
    -
  • Redesign the input bar so the attach (+) button and quick chips share a single action row beneath the text editor.
  • -
  • Restore hover and click behavior on attachment preview cards (now 96x104).
  • -
  • Persist the project filter toggle in history view across app restarts.
  • -
-

Fixed

-
    -
  • Handle Korean IME composition correctly when typing in the input bar.
  • -
  • Show the message queue preview above the shortcut bar, right-aligned with the input bar's edge.
  • -
- ]]>
- -
- - RxCode v1.2.3 - 21 - 1.2.3 - 15.0 - Wed, 30 Apr 2026 00:00:00 +0000 - New -
    -
  • Sessions started in RxCode now appear in the claude --resume picker — switch freely between RxCode and the terminal CLI.
  • -
  • Legacy sessions are automatically migrated to the new format.
  • -
-

Improved

-
    -
  • Session timestamps now reflect actual last activity instead of file modification time.
  • -
  • Improved chat text selection and focus behavior.
  • -
  • Shortcut and slash command export files now include locale-specific comment headers.
  • -
  • Branch list in the sidebar now supports multiple Git remotes.
  • -
-

Fixed

-
    -
  • Fixed Korean IME input losing the final syllable.
  • -
  • Clicking a notification now navigates to the current window instead of opening a new one.
  • -
- ]]>
- -
- - - RxCode v1.2.2 - 20 - 1.2.2 - 15.0 - Tue, 28 Apr 2026 06:23:47 +0000 - New -
    -
  • Right-click a file or folder in the sidebar tree (or in search results) to open it in Finder with the item selected.
  • -
-

Improved

-
    -
  • Replace the SwiftUI text rendering in the file viewer and diff viewer with an NSTextView (TextKit2) backend, eliminating multi-second loads on large files.
  • -
  • Raise the file inspector size limit from 1MB to 5MB.
  • -
  • Use ClaudeTheme tokens for diff line colors so they follow the active theme.
  • -
- ]]>
- -
- - RxCode v1.2.4 - 23 - 1.2.4 - 15.0 - Thu, 07 May 2026 06:15:08 +0000 - Fixed -
    -
  • Resolve env: node: No such file or directory error when starting a chat. The app now reads the user's shell PATH so the bundled claude CLI can locate node regardless of where it was installed (Homebrew, nvm, npm-global). (#8)
  • -
- ]]>
- -
- - RxCode v1.2.5 - 24 - 1.2.5 - 15.0 - Thu, 07 May 2026 12:20:34 +0000 - Fixed -
    -
  • Chat: Messages that occasionally went missing during long agent loops or background tool monitoring are now restored automatically. After each turn the app reconciles in-memory state against the CLI session log so any blocks the live stream skipped fill in without an app restart.
  • -
  • Chat: Hide the noisy "No response requested." marker the model emits when a turn arrives without a user prompt (e.g. ScheduleWakeup or hook re-entry). It is now stripped from both live streaming and historical session loads.
  • -
- ]]>
- -
-
-