Skip to content
Merged
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
659 changes: 659 additions & 0 deletions ClaudeCodeUsage.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2610"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ECF4102A2F03E6AD00DFC0C8"
BuildableName = "ClaudeCodeUsage.app"
BlueprintName = "ClaudeCodeUsage"
ReferencedContainer = "container:ClaudeCodeUsage.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ClaudeUsageCore"
BuildableName = "ClaudeUsageCore"
BlueprintName = "ClaudeUsageCore"
ReferencedContainer = "container:Packages/ClaudeUsageCore">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ClaudeUsageData"
BuildableName = "ClaudeUsageData"
BlueprintName = "ClaudeUsageData"
ReferencedContainer = "container:Packages/ClaudeUsageData">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ClaudeUsageUI"
BuildableName = "ClaudeUsageUI"
BlueprintName = "ClaudeUsageUI"
ReferencedContainer = "container:Packages/ClaudeUsageUI">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ClaudeUsageCoreTests"
BuildableName = "ClaudeUsageCoreTests"
BlueprintName = "ClaudeUsageCoreTests"
ReferencedContainer = "container:Packages/ClaudeUsageCore">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ClaudeUsageDataTests"
BuildableName = "ClaudeUsageDataTests"
BlueprintName = "ClaudeUsageDataTests"
ReferencedContainer = "container:Packages/ClaudeUsageData">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ClaudeUsageUITests"
BuildableName = "ClaudeUsageUITests"
BlueprintName = "ClaudeUsageUITests"
ReferencedContainer = "container:Packages/ClaudeUsageUI">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ECF4102A2F03E6AD00DFC0C8"
BuildableName = "ClaudeCodeUsage.app"
BlueprintName = "ClaudeCodeUsage"
ReferencedContainer = "container:ClaudeCodeUsage.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ECF4102A2F03E6AD00DFC0C8"
BuildableName = "ClaudeCodeUsage.app"
BlueprintName = "ClaudeCodeUsage"
ReferencedContainer = "container:ClaudeCodeUsage.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
40 changes: 40 additions & 0 deletions ClaudeCodeUsage.xctestplan
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"configurations" : [
{
"id" : "863E2FD1-1C91-46C5-B5FA-75CAF5654882",
"name" : "Test Scheme Action",
"options" : {

}
}
],
"defaultOptions" : {
"performanceAntipatternCheckerEnabled" : true,
"targetForVariableExpansion" : {
"containerPath" : "container:ClaudeCodeUsage.xcodeproj",
"identifier" : "ECF4102A2F03E6AD00DFC0C8",
"name" : "ClaudeCodeUsage"
}
},
"testTargets" : [
{
"enabled" : false,
"parallelizable" : true,
"target" : {
"containerPath" : "container:ClaudeCodeUsage.xcodeproj",
"identifier" : "ECF410372F03E6AE00DFC0C8",
"name" : "ClaudeCodeUsageTests"
}
},
{
"enabled" : false,
"parallelizable" : true,
"target" : {
"containerPath" : "container:ClaudeCodeUsage.xcodeproj",
"identifier" : "ECF410412F03E6AE00DFC0C8",
"name" : "ClaudeCodeUsageUITests"
}
}
],
"version" : 1
}
11 changes: 11 additions & 0 deletions ClaudeCodeUsage/Assets.xcassets/AccentColor.colorset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
58 changes: 58 additions & 0 deletions ClaudeCodeUsage/Assets.xcassets/AppIcon.appiconset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
{
"images" : [
{
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
6 changes: 6 additions & 0 deletions ClaudeCodeUsage/Assets.xcassets/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
8 changes: 8 additions & 0 deletions ClaudeCodeUsage/ClaudeCodeUsage.entitlements
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<false/>
</dict>
</plist>
17 changes: 17 additions & 0 deletions ClaudeCodeUsageTests/ClaudeCodeUsageTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// ClaudeCodeUsageTests.swift
// ClaudeCodeUsageTests
//
// Created by Liang on 30-12-2025.
//

import Testing
@testable import ClaudeCodeUsage

struct ClaudeCodeUsageTests {

@Test func example() async throws {
// Write your test here and use APIs like `#expect(...)` to check expected conditions.
}

}
41 changes: 41 additions & 0 deletions ClaudeCodeUsageUITests/ClaudeCodeUsageUITests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//
// ClaudeCodeUsageUITests.swift
// ClaudeCodeUsageUITests
//
// Created by Liang on 30-12-2025.
//

import XCTest

final class ClaudeCodeUsageUITests: XCTestCase {

override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.

// In UI tests it is usually best to stop immediately when a failure occurs.
continueAfterFailure = false

// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}

override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}

@MainActor
func testExample() throws {
// UI tests must launch the application that they test.
let app = XCUIApplication()
app.launch()

// Use XCTAssert and related functions to verify your tests produce the correct results.
}

@MainActor
func testLaunchPerformance() throws {
// This measures how long it takes to launch your application.
measure(metrics: [XCTApplicationLaunchMetric()]) {
XCUIApplication().launch()
}
}
}
33 changes: 33 additions & 0 deletions ClaudeCodeUsageUITests/ClaudeCodeUsageUITestsLaunchTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//
// ClaudeCodeUsageUITestsLaunchTests.swift
// ClaudeCodeUsageUITests
//
// Created by Liang on 30-12-2025.
//

import XCTest

final class ClaudeCodeUsageUITestsLaunchTests: XCTestCase {

override class var runsForEachTargetApplicationUIConfiguration: Bool {
true
}

override func setUpWithError() throws {
continueAfterFailure = false
}

@MainActor
func testLaunch() throws {
let app = XCUIApplication()
app.launch()

// Insert steps here to perform after app launch but before taking a screenshot,
// such as logging into a test account or navigating somewhere in the app

let attachment = XCTAttachment(screenshot: app.screenshot())
attachment.name = "Launch Screen"
attachment.lifetime = .keepAlways
add(attachment)
}
}
Loading