-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproject.yml
More file actions
96 lines (90 loc) · 3.82 KB
/
Copy pathproject.yml
File metadata and controls
96 lines (90 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# XcodeGen project definition.
# brew install xcodegen && xcodegen generate
#
# Single Xcode target. The app is unsandboxed
# and needs no special entitlements (Accessibility and Screen Recording are TCC
# permissions, not entitlements), so App/AIContentFilter.entitlements is an empty
# dict, wired via CODE_SIGN_ENTITLEMENTS below so signing is explicit and there
# is a home for any future entitlement. Model artifacts in Models/ (produced by
# scripts/convert-model.py) are bundled as resources.
name: AIContentFilter
options:
bundleIdPrefix: dev.aicf
deploymentTarget:
macOS: "14.0"
createIntermediateGroups: true
settings:
base:
SWIFT_VERSION: "5.9"
MACOSX_DEPLOYMENT_TARGET: "14.0"
# Stable local signing identity (self-signed, created once in the login
# keychain). A stable signature means TCC permission grants survive
# rebuilds — with ad-hoc signing, every build invalidated them.
# For distribution, replace with a Developer ID identity.
CODE_SIGN_STYLE: Manual
CODE_SIGN_IDENTITY: AICF Local Dev Signing
# OWNER-GATED placeholder: set to your Apple Developer Team ID for a notarized
# Developer ID distribution build. Empty means local
# dev signing, which is team-less.
DEVELOPMENT_TEAM: ""
CURRENT_PROJECT_VERSION: "2"
MARKETING_VERSION: "1.0.0"
# User-facing brand. The Xcode target stays AIContentFilter and the bundle
# id stays dev.aicf.AIContentFilter; only the .app name and display name
# carry the brand, so a future rename is a one-line change here.
PRODUCT_NAME: Pilcrow
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
packages:
FilterCore:
path: FilterCore
targets:
AIContentFilter:
type: application
platform: macOS
sources:
- App
# App icon + asset catalog (generated by scripts/make-icon.py).
- path: Assets/Assets.xcassets
buildPhase: resources
# Bundle only what scoring needs: the compiled fp16 model + tokenizer
# files (~64MB). The .mlpackage sources and int8 variant stay on disk.
- path: Models/AITextClassifier.mlmodelc
buildPhase: resources
type: folder
- path: Models/vocab.txt
buildPhase: resources
- path: Models/model-info.json
buildPhase: resources
# Stage-2 cascade model (optional): ModernBERT-large (~757MB fp16),
# produced by scripts/convert-stage2-modernbert.py. Bundles as
# Resources/Stage2/ where loadStage2 looks first. Contains ONLY the
# compiled .mlmodelc + bpe-vocab.json + bpe-merges.json + model-info.json
# (+ tokenizer test vectors); the .mlpackage intermediates live in
# Models/Stage2-build, which is deliberately not referenced.
- path: Models/Stage2
buildPhase: resources
type: folder
optional: true
# Built-in pets ride in as a folder reference → Resources/Pets/, which is
# exactly where PetRegistry's convenience init looks (resourceURL/Pets).
# Raw per-frame inspection copies live in Assets/PetPreviews and are NOT
# bundled — only the four pet JSONs are here.
- path: Assets/Pets
buildPhase: resources
type: folder
dependencies:
- package: FilterCore
info:
path: App/Info.plist
properties:
CFBundleDisplayName: Pilcrow
CFBundleShortVersionString: $(MARKETING_VERSION)
CFBundleVersion: $(CURRENT_PROJECT_VERSION)
LSUIElement: true # menu bar only: no Dock icon
LSApplicationCategoryType: public.app-category.utilities
NSHumanReadableCopyright: "© 2026 Jackson Adams. Runs on-device; no network access except one-time license activation."
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: dev.aicf.AIContentFilter
ENABLE_HARDENED_RUNTIME: true
CODE_SIGN_ENTITLEMENTS: App/AIContentFilter.entitlements