Azimuth๋ macOS ๋ฉ๋ด๋ฐ ์๋์ฐ ๋งค๋์ ๋ค (Magnet/Rectangle ๋ฅ). Accessibility(AX) API๋ก ๋ค๋ฅธ ์ฑ์ ํฌ์ปค์ค๋ ์ผ๋ฐ ์ฐฝ์ ์๋ณํ๊ณ , ์ ์ญ ๋จ์ถํค ๋๋ ๋ฉ๋ด ๋ช
๋ น์ผ๋ก ๋ฐ๋ถ/1ยท2ยท3๋ถํ /์ต๋ํ/์ด๋/์๋ ๋ณํ/๋๋๋ฆฌ๊ธฐ๋ฅผ ์ํํ๋ค. Swift + AppKit, ์คํ ๋ฆฌ๋ณด๋ ์๋ ํ๋ก๊ทธ๋๋งคํฑ ์ง์
(Azimuth/main.swift). Xcode ํ๋ก์ ํธ(objectVersion 77, file-system synchronized group).
File
Description
Makefile
build(ad-hoc ์ปดํ์ผ/CI ์ ์ฉ) ยท run(Apple Dev ์๋ช
, ๊ถํ ํ
์คํธ์ฉ) ยท lint ยท format ยท test ยท coverage(โฅ90% ๊ฒ์ดํธ) ยท secrets ยท release ยท install-hooks
README.md
ํ๋ก์ ํธ ๊ฐ์(์ค์นยท๋จ์ถํคยท๋ช
๋ น ๋์ยทํ์)
CLAUDE.md
AI ์์ด์ ํธ์ฉ ์ต์์ ์ค๋ฆฌ์ํ
์ด์
(๋น๋/๊ท์น/๊ท์ฝ/docsยทํ์/ํ๊ฒฝ ํจ์ ). ์์ธ๋ ๋๋ ํฐ๋ฆฌ๋ณ AGENTS.md
SECURITY.md ยท CONTRIBUTING.md ยท SUPPORT.md ยท CODE_OF_CONDUCT.md
GitHub ์ปค๋ฎค๋ํฐ ํฌ์ค ํ์ผ(๋ณด์ ์ ๊ณ ยท๊ธฐ์ฌ ๊ฐ์ด๋ยท์ง์ ์๋ดยทํ๋ ๊ฐ๋ น)
RELEASING.md
๋ฆด๋ฆฌ์ค ์ ์ฐจ ๋ฌธ์
LICENSE ยท NOTICE
Apache-2.0 ๋ผ์ด์ ์ค + ๊ณ ์ง
Azimuth.xcodeproj
Xcode ํ๋ก์ ํธ. ๋น์๋๋ฐ์ค, DEVELOPMENT_TEAM=7K6MK3KP9K, SWIFT_DEFAULT_ACTOR_ISOLATION=MainActor, deployment target macOS 14.0
.swiftlint.yml
SwiftLint strict ์ค์
.swiftformat
SwiftFormat ์ค์ (pre-commit + CI์์ --lint)
.gitleaks.toml
์ํฌ๋ฆฟ ์ค์บ ๊ท์น
.gitignore
.docs/, .omc/ ๋ฑ ์ ์ธ
Directory
Purpose
Azimuth/
์ฑ ์์ค ์ ์ฒด (see Azimuth/AGENTS.md)
Tests/
๋ช
๋ น ์์ง ์์ ๋ก์ง ํ๊ท ํ
์คํธ (see Tests/AGENTS.md)
scripts/
build/run/lint/format/test/coverage/secret-scan/release ์ ์คํฌ๋ฆฝํธ (see scripts/AGENTS.md)
docs/
GitHub Pages ์์ค: ๋๋ฉยท๋งค๋ด์ผ(์ด์ค์ธ์ด EN/KO) (see docs/AGENTS.md)
.github/
GitHub Actions CI + ๊ฑฐ๋ฒ๋์ค(FUNDING/CODEOWNERS/PR ํ
ํ๋ฆฟ) (see .github/AGENTS.md)
.githooks/
pre-commit(SwiftFormat --lint + SwiftLint). make install-hooks๋ก ์ค์น
Working In This Directory
๊ถํ/๋ณด์์ ์ ๋ ์ฐํํ์ง ๋ง ๊ฒ (์ ๊ณต๋ฒ). AX ๊ถํ์ ๊ณต์ API๋ก ์์ฒญํ๊ณ ์ฌ์ฉ์๊ฐ System Settings์์ ๋ถ์ฌํ๊ฒ ํ๋ค. tccutil reset(Apple ๊ณต์)์ ํ์ฉ.
๊ถํ ํ
์คํธ๋ make run(Apple Dev ์๋ช
)์ผ๋ก. make build๋ CODE_SIGNING_ALLOWED=NO(ad-hoc)๋ผ cdhash๊ฐ ๋ฐ๋์ด TCC ๊ถํ์ด ์ด๊ธฐํ๋๋ค โ ์ปดํ์ผ/CI ๊ฒ์ฆ ์ ์ฉ.
.docs/๋ ๋ด๋ถ ๋ฌธ์์ด๋ฉฐ git์ ์ปค๋ฐยทํธ์ ๊ธ์ง (gitignore๋จ).
์์ค ์ถ๊ฐ๋ Azimuth/ ์๋์ ๋๋ฉด file-system synchronized group์ผ๋ก ์๋ ํฌํจ ๋๋ค(pbxproj ์์ ๋ถํ์). ๋จ, ์ ํ๊น/์์กด์ฑ ์ถ๊ฐ๋ pbxproj/GUI ํ์.
๋ณ๊ฒฝ ํ ํญ์: make build โ make lint โ make test. ๋จธ์ง ์ ํต๊ณผ ํ์(CI๊ฐ ๋์ผํ๊ฒ ๊ฒ์ฌ).
์์ ๋ก์ง ๋ณ๊ฒฝ์ make test(swiftc ์ง์ ์ปดํ์ผ, ํต๊ณผ ์ PASS โ all N checks ์ถ๋ ฅ)๋ก ๋น ๋ฅด๊ฒ ํ๊ท ํ์ธ.
launch/Info.plist/ํ๊น ์ค์ ๋ณ๊ฒฝ์ "ํ๋ก์ธ์ค ์์กด"๋ง ๋ณด์ง ๋ง๊ณ ์ฐฝ์ด ์ค์ ๋ก ๋จ๋์ง ํ์ธ(๊ณผ๊ฑฐ storyboard ์ ๊ฑฐ๊ฐ delegate ์ฐ๊ฒฐ์ ๋์ ํ๊ท ์์์).
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor โ ๋ชจ๋ ํ์
์ด ๊ธฐ๋ณธ @MainActor. ์์/์ค๋ ๋ ๋ฌด๊ด ๋ก์ง์ ๋ช
์์ ์ผ๋ก nonisolated๋ก ํ์.
์ฐฝ ์ขํ๋ ๋ด๋ถ์ ์ผ๋ก AX ์ขํ(์ข์๋จ ์์ , Y ์๋๋ก) ๋ก ๋ค๋ฃจ๊ณ , ํ๋ฉด ์์
์์ญ ๋ณํ ์ Shared/CoordinateSpace๋ก CocoaโAX ๋ค์ง๊ธฐ.
SwiftLint strict: force-unwrap/force-cast ๊ธ์ง(์์ธ: WindowAccess/AXAttribute์ ๋ฒ์ ํ์ CF ์บ์คํธ + swiftlint:disable ์ฃผ์). function/type body length, line 120 ์ ํ.
๋ช
๋ น ์คํ ๋ฐ์ดํฐ ํ๋ฆ: ๋จ์ถํค/๋ฉ๋ด โ Commands/WindowCommandExecutor โ WindowAccess(์ฑ/์ฐฝ ํด์ยท์ฐ๊ธฐ) + Commands/FrameCalculator(๊ธฐํ) โ Commands/CommandOutcomePolicy(์ค์ AX ๊ฒฐ๊ณผ ๊ธฐ๋ฐ ์ปค๋ฐ ํ๋จ) โ WindowUndoStore/SnapStateStore.
AppKit / Cocoa, ApplicationServices(AX), CoreGraphics, Carbon.HIToolbox(์ ์ญ ๋จ์ถํค), ServiceManagement(๋ก๊ทธ์ธ ์๋ ์คํ).
Sparkle 2 (SPM, 2.9.3, revision d46d456): ์๋ ์
๋ฐ์ดํธ ํ๋ ์์ํฌ. AppDelegate์ SPUStandardUpdaterController๋ก ์ด๊ธฐํ; "Check for Updatesโฆ" ๋ฉ๋ด ํญ๋ชฉ(App ๋ฉ๋ดยท์ํ๋ฐ ๋ฉ๋ดยทSettings Updates ์นด๋)์ ํ๊น์ด ๋๋ค.