├── mise.toml ├── plugins └── xcode │ ├── .mcp.json │ ├── README.md │ ├── CLAUDE.md │ ├── .claude-plugin │ └── plugin.json │ └── skills │ ├── tuist │ └── SKILL.md │ └── argus │ └── SKILL.md ├── .claude-plugin └── marketplace.json ├── LICENSE ├── CHANGELOG.md ├── README.md ├── cliff.toml └── .github └── workflows └── release.yml /mise.toml: -------------------------------------------------------------------------------- 1 | [tools] 2 | "git-cliff" = "2.6.1" 3 | -------------------------------------------------------------------------------- /plugins/xcode/.mcp.json: -------------------------------------------------------------------------------- 1 | { 2 | "mcpServers": { 3 | "xcodeproj": { 4 | "command": "mise", 5 | "args": [ 6 | "x", 7 | "spm:giginet/xcodeproj-mcp-server@1.4.0", 8 | "--", 9 | "xcodeproj-mcp-server" 10 | ] 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /plugins/xcode/README.md: -------------------------------------------------------------------------------- 1 | # Xcode Plugin 2 | 3 | Best practices and guidelines for Xcode and Apple platform development. 4 | 5 | ## Requirements 6 | 7 | - **mise** (optional): Required for the xcodeproj MCP server to modify Xcode projects and workspaces 8 | 9 | ## Installation 10 | 11 | ``` 12 | /plugin marketplace add tuist/claude-marketplace 13 | /plugin install xcode@tuist-marketplace 14 | ``` 15 | -------------------------------------------------------------------------------- /plugins/xcode/CLAUDE.md: -------------------------------------------------------------------------------- 1 | # Xcode Development 2 | 3 | - Prefer Swift over Objective-C for new code 4 | - Use modern Swift concurrency (async/await) over completion handlers 5 | - Prefer SwiftUI for new UI, UIKit when needed 6 | - Use `let` over `var` whenever possible 7 | - Prefer value types (structs, enums) over classes 8 | - Follow Swift API Design Guidelines for naming 9 | - Use `[weak self]` in closures to avoid retain cycles 10 | - Write unit tests with XCTest 11 | - Use the xcodeproj MCP server tools to modify Xcode projects and workspaces 12 | -------------------------------------------------------------------------------- /plugins/xcode/.claude-plugin/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "xcode", 3 | "version": "1.3.0", 4 | "description": "Best practices and guidelines for Xcode and Apple platform development", 5 | "author": { 6 | "name": "Tuist", 7 | "url": "https://tuist.dev" 8 | }, 9 | "homepage": "https://github.com/tuist/claude-marketplace/tree/main/plugins/xcode", 10 | "repository": "https://github.com/tuist/claude-marketplace", 11 | "license": "MIT", 12 | "keywords": [ 13 | "xcode", 14 | "swift", 15 | "swiftui", 16 | "uikit", 17 | "ios", 18 | "macos", 19 | "apple" 20 | ], 21 | "mcpServers": "./.mcp.json" 22 | } 23 | -------------------------------------------------------------------------------- /.claude-plugin/marketplace.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tuist-marketplace", 3 | "metadata": { 4 | "description": "A collection of Claude Code plugins for Tuist users", 5 | "version": "1.2.0", 6 | "pluginRoot": "./plugins" 7 | }, 8 | "owner": { 9 | "name": "Tuist", 10 | "email": "contact@tuist.dev", 11 | "url": "https://tuist.dev" 12 | }, 13 | "plugins": [ 14 | { 15 | "name": "xcode", 16 | "source": "./plugins/xcode", 17 | "description": "Best practices and guidelines for Xcode and Apple platform development", 18 | "version": "1.0.0", 19 | "author": { 20 | "name": "Tuist" 21 | }, 22 | "keywords": [ 23 | "xcode", 24 | "swift", 25 | "swiftui", 26 | "uikit", 27 | "ios", 28 | "macos", 29 | "apple" 30 | ], 31 | "category": "development" 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Tuist 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /plugins/xcode/skills/tuist/SKILL.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: tuist 3 | description: Best practices for Tuist projects. Use when working with Tuist manifests, generating projects, or building with xcodebuild in Tuist projects. 4 | --- 5 | 6 | # Tuist 7 | 8 | ## Project Generation 9 | 10 | Generate projects without opening Xcode: 11 | 12 | ```bash 13 | tuist generate --no-open 14 | ``` 15 | 16 | ## Target Declaration 17 | 18 | Use `buildableFolders` when declaring targets to avoid regenerating projects on file changes: 19 | 20 | ```swift 21 | let target = Target( 22 | name: "MyApp", 23 | destinations: [.iPhone], 24 | product: .app, 25 | bundleId: "com.example.app", 26 | buildableFolders: ["Sources/", "Resources/"] 27 | ) 28 | ``` 29 | 30 | ## Building with xcodebuild 31 | 32 | Pass these build settings to enable caching and improve build performance: 33 | 34 | ```bash 35 | xcodebuild build \ 36 | -scheme MyScheme \ 37 | COMPILATION_CACHE_ENABLE_CACHING=YES \ 38 | CLANG_ENABLE_COMPILE_CACHE=YES \ 39 | SWIFT_ENABLE_EXPLICIT_MODULES=YES \ 40 | SWIFT_USE_INTEGRATED_DRIVER=YES 41 | ``` 42 | 43 | ## Disable Signing for CI/Agent Builds 44 | 45 | When building through an agent or CI, disable code signing: 46 | 47 | ```bash 48 | xcodebuild build \ 49 | -scheme MyScheme \ 50 | CODE_SIGN_IDENTITY="" 51 | ``` 52 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [1.3.0] - 2025-12-13 9 | ### Details 10 | #### Feat 11 | - Update Argus skill to 0.4.0 with graph and linking analysis by @pepicrft 12 | 13 | ## [1.2.1] - 2025-12-04 14 | ### Details 15 | #### Fix 16 | - Move marketplace.json to .claude-plugin directory by @asendra-stripe 17 | 18 | ## New Contributors 19 | * @asendra-stripe made their first contribution 20 | ## [1.2.0] - 2025-12-03 21 | ### Details 22 | #### Feat 23 | - Recommend argus 0.3.1 by @pepicrft 24 | 25 | ## [1.1.0] - 2025-12-03 26 | ### Details 27 | #### Feat 28 | - Add Tuist skill to Xcode plugin by @pepicrft 29 | 30 | #### Fix 31 | - Correct buildableFolders syntax to use string paths by @pepicrft 32 | - Use CODE_SIGN_IDENTITY="" to disable signing by @pepicrft 33 | - Correct buildableFolders usage and add signing guidance by @pepicrft 34 | 35 | ## [1.0.0] - 2025-12-03 36 | ### Details 37 | #### Feat 38 | - Add automated release workflow with git-cliff by @pepicrft 39 | 40 | [1.3.0]: https://github.com/tuist/claude-marketplace/compare/1.2.1..1.3.0 41 | [1.2.1]: https://github.com/tuist/claude-marketplace/compare/1.2.0..1.2.1 42 | [1.2.0]: https://github.com/tuist/claude-marketplace/compare/1.1.0..1.2.0 43 | [1.1.0]: https://github.com/tuist/claude-marketplace/compare/1.0.0..1.1.0 44 | 45 | 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Claude Marketplace 2 | 3 | A collection of Claude Code plugins designed for [Tuist](https://tuist.dev) users. These plugins enhance Claude's capabilities with domain-specific knowledge and tooling for various development workflows. 4 | 5 | ## What are Claude Plugins? 6 | 7 | Claude plugins are `CLAUDE.md` files that provide Claude with specialized instructions, context, and guidelines for specific domains or tools. When you include a plugin in your project, Claude gains expertise in that particular area. 8 | 9 | ## Available Plugins 10 | 11 | | Plugin | Description | 12 | |--------|-------------| 13 | | [Xcode](./plugins/xcode) | Best practices and guidelines for Xcode and Apple platform development | 14 | 15 | ## Installation 16 | 17 | ### 1. Add the Marketplace 18 | 19 | First, add the Tuist marketplace to your Claude Code configuration: 20 | 21 | ``` 22 | /plugin marketplace add tuist/claude-marketplace 23 | ``` 24 | 25 | ### 2. Install a Plugin 26 | 27 | Install any plugin from the marketplace: 28 | 29 | ``` 30 | /plugin install xcode@tuist-marketplace 31 | ``` 32 | 33 | Or browse available plugins interactively: 34 | 35 | ``` 36 | /plugin 37 | ``` 38 | 39 | ### Managing the Marketplace 40 | 41 | List configured marketplaces: 42 | 43 | ``` 44 | /plugin marketplace list 45 | ``` 46 | 47 | Update marketplace metadata: 48 | 49 | ``` 50 | /plugin marketplace update tuist-marketplace 51 | ``` 52 | 53 | Remove the marketplace (this will uninstall any plugins you installed from it): 54 | 55 | ``` 56 | /plugin marketplace remove tuist-marketplace 57 | ``` 58 | 59 | ## Contributing 60 | 61 | We welcome contributions! To add a new plugin: 62 | 63 | 1. Create a new directory under `plugins/` with your plugin name (kebab-case) 64 | 2. Add a `CLAUDE.md` file with the plugin instructions 65 | 3. Add a `README.md` explaining what the plugin does and how to use it 66 | 4. Update `marketplace.json` to include your plugin entry 67 | 5. Submit a pull request 68 | 69 | ### Validating Changes 70 | 71 | Before submitting, validate the marketplace configuration: 72 | 73 | ``` 74 | claude plugin validate . 75 | ``` 76 | 77 | ## License 78 | 79 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. 80 | -------------------------------------------------------------------------------- /cliff.toml: -------------------------------------------------------------------------------- 1 | # git-cliff ~ configuration file 2 | # https://git-cliff.org/docs/configuration 3 | 4 | [remote.github] 5 | owner = "tuist" 6 | repo = "claude-marketplace" 7 | 8 | [changelog] 9 | header = """ 10 | # Changelog\n 11 | All notable changes to this project will be documented in this file. 12 | 13 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 14 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n 15 | """ 16 | body = """ 17 | {%- macro remote_url() -%} 18 | https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} 19 | {%- endmacro -%} 20 | 21 | {% if version -%} 22 | ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} 23 | {% else -%} 24 | ## [Unreleased] 25 | {% endif -%} 26 | 27 | ### Details\ 28 | 29 | {% for group, commits in commits | group_by(attribute="group") %} 30 | #### {{ group | upper_first }} 31 | {%- for commit in commits %} 32 | - {{ commit.message | upper_first | trim }}\ 33 | {% if commit.github.username %} by @{{ commit.github.username }}{%- endif -%} 34 | {% if commit.github.pr_number %} in \ 35 | [#{{ commit.github.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.github.pr_number }}) \ 36 | {%- endif -%} 37 | {% endfor %} 38 | {% endfor %} 39 | 40 | {%- if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} 41 | ## New Contributors 42 | {%- endif -%} 43 | 44 | {% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} 45 | * @{{ contributor.username }} made their first contribution 46 | {%- if contributor.pr_number %} in \ 47 | [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ 48 | {%- endif %} 49 | {%- endfor %}\n 50 | """ 51 | footer = """ 52 | {%- macro remote_url() -%} 53 | https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} 54 | {%- endmacro -%} 55 | 56 | {% for release in releases -%} 57 | {% if release.version -%} 58 | {% if release.previous.version -%} 59 | [{{ release.version | trim_start_matches(pat="v") }}]: \ 60 | {{ self::remote_url() }}/compare/{{ release.previous.version }}..{{ release.version }} 61 | {% endif -%} 62 | {% else -%} 63 | [unreleased]: {{ self::remote_url() }}/compare/{{ release.previous.version }}..HEAD 64 | {% endif -%} 65 | {% endfor %} 66 | 67 | """ 68 | trim = true 69 | postprocessors = [] 70 | 71 | [git] 72 | conventional_commits = true 73 | filter_unconventional = true 74 | split_commits = false 75 | commit_preprocessors = [ 76 | { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, 77 | ] 78 | protect_breaking_commits = false 79 | filter_commits = false 80 | tag_pattern = "[0-9].*" 81 | skip_tags = "beta|alpha" 82 | ignore_tags = "rc" 83 | topo_order = false 84 | sort_commits = "newest" 85 | 86 | [bump] 87 | breaking_always_bump_major = true 88 | features_always_bump_minor = true 89 | initial_tag = "1.0.0" 90 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | permissions: 10 | contents: write 11 | pull-requests: read 12 | 13 | jobs: 14 | release: 15 | name: Release 16 | runs-on: ubuntu-latest 17 | timeout-minutes: 15 18 | if: "!startsWith(github.event.head_commit.message, '[Release]')" 19 | steps: 20 | - uses: actions/checkout@v4 21 | with: 22 | fetch-depth: 0 23 | 24 | - uses: jdx/mise-action@v2 25 | with: 26 | experimental: true 27 | 28 | - name: Check if there are releasable changes 29 | id: is-releasable 30 | run: | 31 | bumped_output=$(git cliff --bump --unreleased 2>/dev/null || echo "") 32 | changelog_content=$(cat CHANGELOG.md 2>/dev/null || echo "") 33 | 34 | bumped_hash=$(echo -n "$bumped_output" | shasum -a 256 | awk '{print $1}') 35 | changelog_hash=$(echo -n "$changelog_content" | shasum -a 256 | awk '{print $1}') 36 | 37 | if [ "$bumped_hash" != "$changelog_hash" ] && [ -n "$bumped_output" ]; then 38 | echo "should-release=true" >> $GITHUB_ENV 39 | else 40 | echo "should-release=false" >> $GITHUB_ENV 41 | fi 42 | 43 | - name: Get next version 44 | id: next-version 45 | if: env.should-release == 'true' 46 | env: 47 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 48 | run: echo "NEXT_VERSION=$(git cliff --bumped-version)" >> "$GITHUB_OUTPUT" 49 | 50 | - name: Update CHANGELOG.md 51 | if: env.should-release == 'true' 52 | env: 53 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 54 | run: git cliff --bump -o CHANGELOG.md 55 | 56 | - name: Update version in metadata files 57 | if: env.should-release == 'true' 58 | run: | 59 | VERSION=${{ steps.next-version.outputs.NEXT_VERSION }} 60 | 61 | # Update marketplace.json 62 | jq --arg v "$VERSION" '.metadata.version = $v' marketplace.json > tmp.json && mv tmp.json marketplace.json 63 | 64 | # Update all plugin.json files 65 | find plugins -name "plugin.json" -exec sh -c ' 66 | jq --arg v "$1" ".version = \$v" "$2" > tmp.json && mv tmp.json "$2" 67 | ' _ "$VERSION" {} \; 68 | 69 | - name: Commit changes 70 | id: auto-commit-action 71 | uses: stefanzweifel/git-auto-commit-action@v5 72 | if: env.should-release == 'true' 73 | with: 74 | commit_options: "--allow-empty" 75 | tagging_message: ${{ steps.next-version.outputs.NEXT_VERSION }} 76 | skip_dirty_check: true 77 | commit_message: "[Release] claude-marketplace ${{ steps.next-version.outputs.NEXT_VERSION }}" 78 | 79 | - name: Get release notes 80 | id: release-notes 81 | if: env.should-release == 'true' 82 | env: 83 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 84 | run: | 85 | echo "RELEASE_NOTES<> "$GITHUB_OUTPUT" 86 | git cliff --latest >> "$GITHUB_OUTPUT" 87 | echo "EOF" >> "$GITHUB_OUTPUT" 88 | 89 | - name: Create GitHub Release 90 | uses: softprops/action-gh-release@v2 91 | if: env.should-release == 'true' 92 | with: 93 | draft: false 94 | name: ${{ steps.next-version.outputs.NEXT_VERSION }} 95 | tag_name: ${{ steps.next-version.outputs.NEXT_VERSION }} 96 | body: ${{ steps.release-notes.outputs.RELEASE_NOTES }} 97 | target_commitish: ${{ steps.auto-commit-action.outputs.commit_hash }} 98 | -------------------------------------------------------------------------------- /plugins/xcode/skills/argus/SKILL.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: argus-build-diagnostics 3 | description: Diagnose xcodebuild builds using argus. Use this instead of parsing xcodebuild output to avoid filling the context window. Query build errors, warnings, slowest targets, bottlenecks, implicit/redundant dependencies, and dependency graph with linking information for optimization analysis. 4 | --- 5 | 6 | # Argus Build Diagnostics 7 | 8 | Use argus to analyze Xcode builds instead of parsing raw xcodebuild output. 9 | 10 | ## Installation 11 | 12 | ```bash 13 | mise install github:tuist/argus@0.4.0 14 | ``` 15 | 16 | ## Running a Build 17 | 18 | Run xcodebuild with argus intercepting the build: 19 | 20 | ```bash 21 | BUILD_TRACE_ID=$(uuidgen) 22 | XCBBUILDSERVICE_PATH=$(which argus) BUILD_TRACE_ID=$BUILD_TRACE_ID xcodebuild build -scheme MyScheme 23 | ``` 24 | 25 | ## Querying Build Results 26 | 27 | After the build completes, use these commands to analyze results: 28 | 29 | ```bash 30 | # Get build summary 31 | argus trace summary --build $BUILD_TRACE_ID 32 | 33 | # Get compilation errors 34 | argus trace errors --build $BUILD_TRACE_ID 35 | 36 | # Get slowest targets 37 | argus trace slowest-targets --build $BUILD_TRACE_ID --limit 5 38 | 39 | # Get build bottlenecks 40 | argus trace bottlenecks --build $BUILD_TRACE_ID 41 | ``` 42 | 43 | ## Dependency Analysis 44 | 45 | Detect dependency issues in your project: 46 | 47 | ```bash 48 | # Show what each target imports 49 | argus trace imports --build $BUILD_TRACE_ID 50 | 51 | # Find implicit dependencies (imports not declared as dependencies) 52 | argus trace implicit-deps --build $BUILD_TRACE_ID 53 | 54 | # Find redundant dependencies (declared but never imported) 55 | argus trace redundant-deps --build $BUILD_TRACE_ID 56 | ``` 57 | 58 | Add `--json` flag for structured output. 59 | 60 | ## Dependency Graph and Linking Analysis 61 | 62 | Query the build dependency graph with product type and linking information to identify optimization opportunities: 63 | 64 | ```bash 65 | # Get the full dependency graph with linking info 66 | argus trace graph --build $BUILD_TRACE_ID 67 | 68 | # Query what a specific target depends on (transitive) 69 | argus trace graph --source MyApp 70 | 71 | # Query only direct dependencies 72 | argus trace graph --source MyApp --direct 73 | 74 | # Query what depends on a specific target 75 | argus trace graph --sink CoreKit 76 | 77 | # Find the path between two targets 78 | argus trace graph --source MyApp --sink CoreKit 79 | 80 | # Filter by dependency type 81 | argus trace graph --source MyApp --label package 82 | argus trace graph --source MyApp --label framework 83 | ``` 84 | 85 | ### Available Labels 86 | 87 | - `target`: Project targets 88 | - `package`: Swift package dependencies 89 | - `framework`: Framework dependencies 90 | - `xcframework`: XCFramework dependencies 91 | - `sdk`: System SDK frameworks 92 | - `bundle`: Bundle dependencies 93 | 94 | ### Output Fields 95 | 96 | The graph output includes: 97 | - `name`: Target name 98 | - `productType`: Xcode product type identifier (e.g., `com.apple.product-type.framework`) 99 | - `artifactKind`: The kind of artifact (e.g., `framework`, `staticLibrary`, `dynamicLibrary`) 100 | - `machOType`: Mach-O type (`staticlib`, `mh_dylib`, `mh_execute`) 101 | - `dependencies`: Array of linked dependencies with: 102 | - `kind`: Link kind (`static`, `dynamic`, `framework`) 103 | - `mode`: Link mode 104 | - `isSystem`: Whether it's a system dependency 105 | 106 | ### Optimizing Launch Time and Binary Size 107 | 108 | Use the graph information combined with linking types to make optimization decisions: 109 | 110 | **To improve launch time (reduce dylib loading):** 111 | 1. Query the graph to find dynamically linked dependencies: `argus trace graph --source MyApp --json` 112 | 2. Look for dependencies with `kind: "dynamic"` or `kind: "framework"` 113 | 3. Consider converting frequently-used internal frameworks from dynamic to static linking 114 | 4. Targets with `machOType: "mh_dylib"` that are only used by one app are candidates for static linking 115 | 5. Fewer dynamic libraries means fewer `dlopen` calls at launch 116 | 117 | **To reduce binary size:** 118 | 1. Query the graph to identify statically linked dependencies 119 | 2. Look for large targets with `kind: "static"` that are shared across multiple apps 120 | 3. Converting these to dynamic frameworks allows code sharing and reduces total install size 121 | 4. Targets with `machOType: "staticlib"` used by multiple apps benefit from being dynamic 122 | 123 | **Analysis workflow:** 124 | ```bash 125 | # 1. Get the full graph to understand the dependency structure 126 | argus trace graph --build latest --json > graph.json 127 | 128 | # 2. Find all targets that depend on a library you want to optimize 129 | argus trace graph --sink MyLibrary --json 130 | 131 | # 3. Check if a target is statically or dynamically linked 132 | argus trace graph --source MyApp --direct --json | jq '.dependencies[] | select(.name == "MyLibrary")' 133 | ``` 134 | 135 | **Decision criteria:** 136 | - If a library is used by only one target: prefer **static** linking (better launch time) 137 | - If a library is used by multiple apps/extensions: prefer **dynamic** linking (smaller total size) 138 | - For debug builds: prefer **dynamic** linking (faster incremental builds) 139 | - For release builds with App Thinning: static linking may be preferred 140 | 141 | ## Listing Previous Builds 142 | 143 | ```bash 144 | # List all tracked projects 145 | argus trace projects 146 | 147 | # List builds for a project 148 | argus trace builds --project my-app --limit 10 149 | ``` 150 | --------------------------------------------------------------------------------