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
16 changes: 2 additions & 14 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,29 +65,17 @@ jobs:
~/Library/Caches/org.swift.swiftpm
~/Library/Developer/Xcode/SourcePackages
.spm
key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
key: ${{ runner.os }}-spm-${{ hashFiles('.mise.toml', 'Tuist.swift', 'Workspace.swift', 'Tuist/ProjectDescriptionHelpers/*.swift', 'Application/**/Project.swift', 'Widget/**/Project.swift') }}
restore-keys: |
${{ runner.os }}-spm-

- name: Generate Xcode project with Tuist
- name: Generate Xcode workspace with Tuist
shell: bash
run: |
set -euo pipefail

tuist generate --no-open

git diff --exit-code -- \
DevLog.xcworkspace \
Application/DevLogApp/DevLogApp.xcodeproj \
Application/DevLogCore/DevLogCore.xcodeproj \
Application/DevLogData/DevLogData.xcodeproj \
Application/DevLogDomain/DevLogDomain.xcodeproj \
Application/DevLogInfra/DevLogInfra.xcodeproj \
Application/DevLogPersistence/DevLogPersistence.xcodeproj \
Application/DevLogPresentation/DevLogPresentation.xcodeproj \
Widget/DevLogWidgetCore/DevLogWidgetCore.xcodeproj \
Widget/DevLogWidgetExtension/DevLogWidgetExtension.xcodeproj

- name: Select iOS Simulator Runtime (installed)
id: pick_ios
shell: bash
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
- name: Read release version
id: release_version
run: |
version=$(ruby -e 'project = File.read("Application/DevLogApp/DevLogApp.xcodeproj/project.pbxproj"); match = project.match(/MARKETING_VERSION = ([^;]+);/); abort("MARKETING_VERSION not found") if match.nil?; puts match[1]')
version=$(ruby -e 'version = File.readlines("Application/Shared/Version.xcconfig").find { |line| line.match?(/\AMARKETING_VERSION\s*=/) }; abort("MARKETING_VERSION not found") if version.nil?; puts version.split("=", 2).last.strip')
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "tag=v$version" >> "$GITHUB_OUTPUT"

Expand Down
13 changes: 13 additions & 0 deletions .github/workflows/testflight.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,19 @@ jobs:
sudo xcode-select -s "$XCODE_APP/Contents/Developer"
xcodebuild -version

- name: Set up Tuist
uses: jdx/mise-action@v4
with:
install: true
cache: true

- name: Generate Xcode workspace with Tuist
shell: bash
run: |
set -euo pipefail

tuist generate --no-open

- name: Write App Store Connect API key
env:
ASC_KEY_CONTENT: ${{ secrets.ASC_KEY_CONTENT }}
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ Breakpoints_v2.xcbkptlist
**/build/
**/xcuserdata/
ContentView.swift
**/*.xcworkspace/
**/*.xcodeproj/

# NPM
node_modules/
Expand Down Expand Up @@ -44,7 +46,6 @@ fastlane/logs/
.tmp/
.spm/
Tuist/.build/
DevLog.xcworkspace/.tuist-generated

# drawio
*.drawio.bkp
2 changes: 1 addition & 1 deletion .hermes/skills/devlog-architecture-harness/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Use this skill in the repository root when the task touches any of these areas:
- Widget snapshot, App Group, or widget deep-link data flow.
- Architecture diagrams, README architecture text, or PR architecture explanation.

This repository is an Xcode workspace-based modular iOS app. There is no root `Package.swift`; modules are separate `.xcodeproj` entries under `DevLog.xcworkspace`.
This repository is a Tuist-generated, workspace-based modular iOS app. There is no root `Package.swift`; module projects are generated from `Workspace.swift` and each module's `Project.swift`.

## Required project context

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ The goal is not to make the AI decide more architecture policy. The goal is to m

Use this reference with `AGENTS.md` and `.hermes/skills/devlog-architecture-harness/SKILL.md`.

This repository is an Xcode workspace-based modular iOS app. There is no root `Package.swift`; modules are separate `.xcodeproj` entries under `DevLog.xcworkspace`.
This repository is a Tuist-generated, workspace-based modular iOS app. There is no root `Package.swift`; module projects are generated from `Workspace.swift` and each module's `Project.swift`.

## High-level harness flow

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,18 @@ This reference holds DevLog-specific working rules that should live with the pro
- Prefer Xcode Local MCP for iOS project code changes.
- If Xcode Local MCP is unavailable or fails because of session transport, state that explicitly before using a fallback.
- This repository is workspace-based. Prefer workspace/scheme context over standalone project builds when dependencies cross module projects.
- CI truth lives in `.github/workflows/build.yml`: select Xcode 26.3, install Tuist with mise, run `tuist generate --no-open`, assert generated Xcode files are clean with `git diff --exit-code`, then build `DevLog.xcworkspace` scheme `DevLog` with `-resolvePackageDependencies`, `-skipPackagePluginValidation`, and `-skipMacroValidation`.
- CI truth lives in `.github/workflows/build.yml`: select Xcode 26.3, install Tuist with mise, run `tuist generate --no-open`, then build `DevLog.xcworkspace` scheme `DevLogApp` with `-resolvePackageDependencies`, `-skipPackagePluginValidation`, and `-skipMacroValidation`.
- CI is build validation, not a full test run, unless the workflow changes.
- Avoid unrelated `Package.resolved` churn. Keep lockfile changes only when dependency resolution is the task.
- Avoid unrelated generated project and `Package.resolved` churn. Generated Xcode workspace/project files should not be tracked unless the project explicitly changes that policy.

## Xcode project file work

- Inspect Swift imports and `.xcodeproj/project.pbxproj` framework links together.
- Validate touched `project.pbxproj` files with `plutil -lint`.
- Inspect Swift imports and Tuist target dependencies together.
- Validate generated project structure by rerunning `tuist generate --no-open` and building the workspace.
- `plutil -lint` does not prove Xcode save behavior is healthy; for Xcode save crashes, inspect crash reports and project-reference call stacks.
- Do not force a single `objectVersion` across projects. Treat Xcode's actual save output as the source of truth.
- For synchronized-root cleanup, verify on copied files or a narrowed rule set before touching real project files.
- When removing project-file objects, distinguish stale product references, real target links, orphan build files, and plugin churn.
- When changing project structure, update the Tuist manifest first and treat generated Xcode project churn as disposable output.

## PR and review handling

Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ These instructions apply only to the repository root.

Use this harness before any task that changes module boundaries, file ownership, layer dependencies, DI assembly, repository/service contracts, widget data flow, Firebase dependency placement, or architecture documentation.

Treat this repository as an Xcode workspace-based modular iOS app. There is no root `Package.swift`; modules are separate `.xcodeproj` entries under `DevLog.xcworkspace`.
Treat this repository as a Tuist-generated, workspace-based modular iOS app. There is no root `Package.swift`; module projects are generated from `Workspace.swift` and each module's `Project.swift`.

### Mandatory flow

Expand Down Expand Up @@ -89,7 +89,7 @@ These may proceed after inspection when they do not change architecture meaning:
- If iOS project code changes, test build with Xcode Local MCP.
- If Xcode Local MCP is unavailable, state that explicitly before using a fallback.
- Do not claim architecture work is complete without checking the diff scope.
- Do not spend time on unrelated lockfile churn. Keep `Package.resolved` changes only when they are part of the requested task.
- Do not spend time on unrelated generated project or lockfile churn. Keep generated workspace/project and `Package.resolved` changes out of source control unless they are part of an explicitly approved dependency-lock policy.
- For Firebase Cloud Functions, deploy updated functions one by one separately.

## Canonical project rules
Expand Down
Loading