Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .swiftlint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ included:
- Sources/RepoPrompt
- Sources/RepoPromptExecutable
- Sources/RepoPromptMCP
- Sources/RepoPromptProcessSupport
- Sources/RepoPromptShared
- Tests/RepoPromptTests
- Tests/RepoPromptProcessTests
- Packages/RepoPromptAgentProviders/Package.swift
- Packages/RepoPromptAgentProviders/Sources
- Packages/RepoPromptAgentProviders/Tests
Expand Down
15 changes: 14 additions & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ var packageDependencies: [Package.Dependency] = [
]

var repoPromptAppDependencies: [Target.Dependency] = [
"RepoPromptProcessSupport",
"RepoPromptCodeMapCore",
"RepoPromptRegexCore",
"RepoPromptWorkspaceCore",
Expand Down Expand Up @@ -174,6 +175,12 @@ let package = Package(
path: "Sources/RepoPromptShared",
swiftSettings: [.define("DEBUG", .when(configuration: .debug))]
),
.target(
name: "RepoPromptProcessSupport",
dependencies: ["RepoPromptShared"],
path: "Sources/RepoPromptProcessSupport",
swiftSettings: [.define("DEBUG", .when(configuration: .debug))]
),
.target(name: "CSwiftPCRE2", path: "Sources/CSwiftPCRE2", exclude: ["deps/sljit/sljit_src/sljitNativeARM_64.c", "deps/sljit/sljit_src/sljitSerialize.c", "deps/sljit/sljit_src/sljitUtils.c", "deps/sljit/sljit_src/sljitNativeX86_common.c", "deps/sljit/sljit_src/sljitNativeX86_64.c", "deps/sljit/sljit_src/sljitNativeX86_32.c", "deps/sljit/sljit_src/allocator_src/sljitWXExecAllocatorPosix.c", "deps/sljit/sljit_src/allocator_src/sljitProtExecAllocatorPosix.c", "deps/sljit/sljit_src/allocator_src/sljitExecAllocatorPosix.c", "deps/sljit/sljit_src/allocator_src/sljitExecAllocatorCore.c", "deps/sljit/sljit_src/allocator_src/sljitExecAllocatorApple.c"], publicHeadersPath: "include", cSettings: [.headerSearchPath("include"), .headerSearchPath("src"), .define("PCRE2_CODE_UNIT_WIDTH", to: "8"), .define("HAVE_CONFIG_H")]),
.target(name: "RepoPromptC", path: "Sources/RepoPromptC", publicHeadersPath: "include", cSettings: [.headerSearchPath("include")]),
// Exact-snapshot scanner ABI fallback for the JavaScript/Python manifests, whose
Expand Down Expand Up @@ -203,9 +210,15 @@ let package = Package(
),
.testTarget(
name: "RepoPromptTests",
dependencies: repoPromptTestDependencies,
dependencies: repoPromptTestDependencies + ["RepoPromptProcessSupport"],
path: "Tests/RepoPromptTests",
swiftSettings: repoPromptTestSwiftSettings
),
.testTarget(
name: "RepoPromptProcessTests",
dependencies: ["RepoPromptProcessSupport"],
path: "Tests/RepoPromptProcessTests",
swiftSettings: repoPromptTestSwiftSettings
)
],
swiftLanguageModes: [.v5]
Expand Down
825 changes: 220 additions & 605 deletions Scripts/Fixtures/test-suite-contract-ledger.tsv

Large diffs are not rendered by default.

7 changes: 4 additions & 3 deletions Scripts/generate_xcode_workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,15 +155,16 @@ def validate_manifest(manifest: dict, repo_root: Path) -> None:

expected_test_dependencies = {
"RepoPromptApp",
"RepoPromptCodeMapCore",
"RepoPromptMCP",
"RepoPromptProcessSupport",
"RepoPromptCodeMapCore",
"RepoPromptShared",
}
repo_prompt_tests = targets["RepoPromptTests"]
if set(_by_name_dependencies(repo_prompt_tests)) != expected_test_dependencies:
raise GeneratorError(
"RepoPromptTests must depend on RepoPromptApp, RepoPromptCodeMapCore, "
"RepoPromptMCP, and RepoPromptShared"
"RepoPromptTests must depend on RepoPromptApp, RepoPromptMCP, "
"RepoPromptProcessSupport, and RepoPromptShared"
)

unsafe_flags: list[list[str]] = []
Expand Down
48 changes: 45 additions & 3 deletions Scripts/source_layout_guardrails.sh
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,35 @@ if ! tree_sitter_scanner_support_checksum_output="$(shasum -a 256 -c ThirdPartyL
printf '%s\n' "$tree_sitter_scanner_support_checksum_output" >&2
fi

if ! tree_sitter_dependency_manifest_output="$(python3 <<'PY'
if [[ -d "Sources/RepoPromptProcessSupport" ]]; then
unexpected_repo_prompt_process_support_files="$(find Sources/RepoPromptProcessSupport -type f \
! -path 'Sources/RepoPromptProcessSupport/Concurrency/AsyncScope.swift' \
! -path 'Sources/RepoPromptProcessSupport/Concurrency/TaskSemaphore.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/CLIEnvironmentCache.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/CLINativePathDefaults.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/CLIOutputFormat.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/CLIProcessConfiguration.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/CLIProcessLogCollector.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/CLIProcessRunner.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/CommandPathResolver.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/FDWriteSupport.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/ProcessDebugLogging.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/ProcessEnvironmentBuilder.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/ProcessEnvironmentSanitizer.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/ProcessLaunchContext.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/ProcessLauncher.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/ProcessRegistry.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/ProcessStreamFraming.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/ProcessTermination.swift' \
! -path 'Sources/RepoPromptProcessSupport/Process/ChildProcessExitObserver.swift' \
-print)"
if [[ -n "$unexpected_repo_prompt_process_support_files" ]]; then
fail "unexpected file found under narrow RepoPromptProcessSupport canary target"
printf '%s\n' "$unexpected_repo_prompt_process_support_files" >&2
fi
fi

if ! tree_sitter_scanner_support_manifest_output="$(python3 <<'PY'
import json
import re
import subprocess
Expand Down Expand Up @@ -273,12 +301,26 @@ bridging_header = Path("Sources/RepoPrompt/Support/RepoPrompt-Bridging-Header.h"
if "tree_sitter_" in bridging_header or "TSLanguage" in bridging_header:
errors.append("bridging header must not redeclare Tree-sitter grammar APIs")

repo_prompt_process_support = targets.get("RepoPromptProcessSupport")
if repo_prompt_process_support is None:
errors.append("RepoPromptProcessSupport target missing")
else:
if repo_prompt_process_support.get("type") != "regular":
errors.append("RepoPromptProcessSupport target must remain a regular library target")
if repo_prompt_process_support.get("path") != "Sources/RepoPromptProcessSupport":
errors.append("RepoPromptProcessSupport target path drifted")
process_support_dependencies = [d.get("byName", [None])[0] for d in repo_prompt_process_support.get("dependencies", []) if d.get("byName")]
if process_support_dependencies != ["RepoPromptShared"]:
errors.append("RepoPromptProcessSupport must depend only on RepoPromptShared")
if not any(dependency.get("byName", [None])[0] == "RepoPromptProcessSupport" for dependency in repo_prompt_app_dependencies):
errors.append("RepoPromptApp must directly depend on RepoPromptProcessSupport")

if errors:
raise SystemExit("\n".join(errors))
PY
)"; then
fail "Tree-sitter dependency, product, or scanner-support contract drifted"
printf '%s\n' "$tree_sitter_dependency_manifest_output" >&2
fail "Tree-sitter dependency, product, scanner-support, or RepoPromptProcessSupport contract drifted"
printf '%s\n' "$tree_sitter_scanner_support_manifest_output" >&2
fi

retired_tree_sitter_grammar_dirs=(
Expand Down
2 changes: 2 additions & 0 deletions Scripts/swift_style.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,10 @@ STYLE_PATHS=(
"Sources/RepoPrompt"
"Sources/RepoPromptExecutable"
"Sources/RepoPromptMCP"
"Sources/RepoPromptProcessSupport"
"Sources/RepoPromptShared"
"Tests/RepoPromptTests"
"Tests/RepoPromptProcessTests"
"Packages/RepoPromptAgentProviders/Package.swift"
"Packages/RepoPromptAgentProviders/Sources"
"Packages/RepoPromptAgentProviders/Tests"
Expand Down
3 changes: 2 additions & 1 deletion Scripts/test_xcode_workspace_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ def test_manifest_preserves_thin_app_target_topology(self) -> None:
self.assertEqual(targets["RepoPromptApp"]["path"], "Sources/RepoPrompt")
self.assertEqual(
set(generator._by_name_dependencies(targets["RepoPromptTests"])),
{"RepoPromptApp", "RepoPromptCodeMapCore", "RepoPromptMCP", "RepoPromptShared"},
{"RepoPromptApp", "RepoPromptMCP", "RepoPromptProcessSupport", "RepoPromptShared"},
{"RepoPromptApp", "RepoPromptCodeMapCore", "RepoPromptMCP", "RepoPromptProcessSupport", "RepoPromptShared"},
)
self.assertNotIn("RepoPrompt", generator._by_name_dependencies(targets["RepoPromptTests"]))

Expand Down
1 change: 1 addition & 0 deletions Sources/RepoPrompt/App/AppDelegate.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import Cocoa
import Combine
import Darwin
import RepoPromptProcessSupport
import Sparkle
import SwiftUI

Expand Down
1 change: 1 addition & 0 deletions Sources/RepoPrompt/App/ApplicationSecurity.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import Cocoa
import Foundation
import MachO
import os.lock
import RepoPromptProcessSupport

/// This class handles application security by monitoring the environment
/// for potential tampering or unauthorized access.
Expand Down
1 change: 1 addition & 0 deletions Sources/RepoPrompt/App/RepoPromptApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import AppKit
import Darwin
import Foundation
import Logging
import RepoPromptProcessSupport
import Sparkle
import SwiftUI

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import Foundation
import Logging
import RepoPromptProcessSupport

enum ClaudeCodeRuntimeVariant: String {
case standard
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import AppKit
import Combine
import RepoPromptProcessSupport
import SwiftUI

// AgentLogEntry and AgentLogEntryType are defined in Models/Agent/AgentLogModels.swift
Expand All @@ -12,7 +13,9 @@ enum AgentRunState: Equatable {
case failed(String)

var isRunning: Bool {
if case .running = self { return true }
if case .running = self {
return true
}
return false
}

Expand Down Expand Up @@ -3157,7 +3160,9 @@ final class ContextBuilderAgentViewModel: ObservableObject {
activeSession
}
guard let session else { return false }
if session.isCancelling { return false }
if session.isCancelling {
return false
}
session.isCancelling = true
session.didUserCancelActiveContextBuilderRun = true
updateRuntimeBindings(from: session)
Expand Down Expand Up @@ -3530,7 +3535,9 @@ final class ContextBuilderAgentViewModel: ObservableObject {
}
)
guard finalizedConnections else {
if let contextCommitResult { return contextCommitResult }
if let contextCommitResult {
return contextCommitResult
}
if !acceptsEvents(from: record) {
return MCPServerViewModel.ContextBuilderTabContextCommitResult(
outcome: .staleOrNoLongerCurrent,
Expand Down Expand Up @@ -5281,7 +5288,9 @@ final class ContextBuilderAgentViewModel: ObservableObject {

/// Cancel any pending question for a session (internal helper).
private func cancelPendingQuestion(for session: TabSession, expectedRunID: UUID? = nil) {
if let expectedRunID, session.pendingAskUserRunID != expectedRunID { return }
if let expectedRunID, session.pendingAskUserRunID != expectedRunID {
return
}
invalidatePendingAskUserTimeout(for: session)
let continuation = session.askUserContinuation
session.askUserContinuation = nil
Expand Down
Loading
Loading