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
Empty file added .xcode-initialized
Empty file.
24 changes: 24 additions & 0 deletions configs/android.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,27 @@ snippets:
enabled: true
features:
- android
- react_native
- keychain
- mac_tools
- direnv
- vscode

duti:
# Archive handlers - Keka for fast extraction
.zip: com.aone.keka
.7z: com.aone.keka
# Code/text editors - VSCode
.zsh: com.microsoft.VSCode
.sh: com.microsoft.VSCode
.js: com.microsoft.VSCode
.json: com.microsoft.VSCode
.md: com.microsoft.VSCode
.txt: com.microsoft.VSCode
.java: com.microsoft.VSCode
.kt: com.microsoft.VSCode
.py: com.microsoft.VSCode
.rb: com.microsoft.VSCode
.xml: com.microsoft.VSCode
.yml: com.microsoft.VSCode
.yaml: com.microsoft.VSCode
21 changes: 21 additions & 0 deletions configs/backend.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,25 @@ snippets:
osasnippets:
enabled: true
features:
- keychain
- mac_tools
- direnv
- vscode

duti:
# Archive handlers - Keka for fast extraction
.zip: com.aone.keka
# Code/text editors - VSCode
.zsh: com.microsoft.VSCode
.sh: com.microsoft.VSCode
.js: com.microsoft.VSCode
.json: com.microsoft.VSCode
.md: com.microsoft.VSCode
.txt: com.microsoft.VSCode
.java: com.microsoft.VSCode
.py: com.microsoft.VSCode
.rb: com.microsoft.VSCode
.go: com.microsoft.VSCode
.yml: com.microsoft.VSCode
.yaml: com.microsoft.VSCode
.sql: com.microsoft.VSCode
33 changes: 33 additions & 0 deletions configs/everything.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,36 @@ snippets:
- mac_tools
- direnv
- vscode

# macOS duti configuration: set default apps for file types
# Pattern: file_extension: bundle_id_or_name
# When enabled via components, duti will be installed and these overrides applied
duti:
# Archive handlers - Keka for fast extraction
.zip: com.aone.keka
.7z: com.aone.keka
.rar: com.aone.keka
# Code/text editors - VSCode
.zsh: com.microsoft.VSCode
.sh: com.microsoft.VSCode
.js: com.microsoft.VSCode
.jsx: com.microsoft.VSCode
.ts: com.microsoft.VSCode
.tsx: com.microsoft.VSCode
.cjs: com.microsoft.VSCode
.mjs: com.microsoft.VSCode
.json: com.microsoft.VSCode
.json5: com.microsoft.VSCode
.md: com.microsoft.VSCode
.txt: com.microsoft.VSCode
.java: com.microsoft.VSCode
.kt: com.microsoft.VSCode
.py: com.microsoft.VSCode
.lock: com.microsoft.VSCode
.rb: com.microsoft.VSCode
.yml: com.microsoft.VSCode
.yaml: com.microsoft.VSCode
.mc: com.microsoft.VSCode
.jungle: com.microsoft.VSCode
.svg: com.microsoft.VSCode
Podfile: com.microsoft.VSCode
7 changes: 7 additions & 0 deletions configs/example-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,10 @@ snippets:
osasnippets:
enabled: true
features: []

# macOS duti configuration: customize default apps for file types
# Example entries - uncomment and customize as needed:
duti:
# .zip: com.aone.keka # Use Keka for ZIP files
# .md: com.microsoft.VSCode # Use VSCode for Markdown
# Uncomment and add your custom overrides
22 changes: 22 additions & 0 deletions configs/ios.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,25 @@ snippets:
features:
- keychain
- xcode
- react_native
- mac_tools
- direnv
- vscode

duti:
# Archive handlers - Keka for fast extraction
.zip: com.aone.keka
# Code/text editors - VSCode
.zsh: com.microsoft.VSCode
.sh: com.microsoft.VSCode
.js: com.microsoft.VSCode
.json: com.microsoft.VSCode
.md: com.microsoft.VSCode
.txt: com.microsoft.VSCode
.swift: com.microsoft.VSCode
.kt: com.microsoft.VSCode
.py: com.microsoft.VSCode
.rb: com.microsoft.VSCode
.yml: com.microsoft.VSCode
.yaml: com.microsoft.VSCode
Podfile: com.microsoft.VSCode
23 changes: 23 additions & 0 deletions configs/macos.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,27 @@ snippets:
enabled: true
features:
- keychain
- xcode
- mac_tools
- direnv
- vscode

# macOS duti configuration: set default apps for file types
# Pattern: file_extension: bundle_id_or_name
# Applied via install-duti setup script and can be customized here
duti:
# Archive handlers - Keka for fast extraction
.zip: com.aone.keka
.7z: com.aone.keka
# Code/text editors - VSCode
.zsh: com.microsoft.VSCode
.sh: com.microsoft.VSCode
.js: com.microsoft.VSCode
.json: com.microsoft.VSCode
.md: com.microsoft.VSCode
.txt: com.microsoft.VSCode
.py: com.microsoft.VSCode
.rb: com.microsoft.VSCode
.yml: com.microsoft.VSCode
.yaml: com.microsoft.VSCode
.svg: com.microsoft.VSCode
6 changes: 6 additions & 0 deletions configs/minimal.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,9 @@ snippets:
osasnippets:
enabled: true
features: []

duti:
# Minimal duti configuration - just archives and core files
.zip: com.aone.keka
.txt: com.microsoft.VSCode
.md: com.microsoft.VSCode
27 changes: 26 additions & 1 deletion configs/react-native.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,30 @@ snippets:
enabled: true
features:
- keychain
- xcode
- react_native
- android
- mac_tools
- direnv
- vscode

duti:
# Archive handlers - Keka for fast extraction
.zip: com.aone.keka
.7z: com.aone.keka
# Code/text editors - VSCode
.zsh: com.microsoft.VSCode
.sh: com.microsoft.VSCode
.js: com.microsoft.VSCode
.jsx: com.microsoft.VSCode
.ts: com.microsoft.VSCode
.tsx: com.microsoft.VSCode
.json: com.microsoft.VSCode
.md: com.microsoft.VSCode
.txt: com.microsoft.VSCode
.java: com.microsoft.VSCode
.kt: com.microsoft.VSCode
.swift: com.microsoft.VSCode
.py: com.microsoft.VSCode
.rb: com.microsoft.VSCode
.yml: com.microsoft.VSCode
.yaml: com.microsoft.VSCode
22 changes: 22 additions & 0 deletions configs/web.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -67,5 +67,27 @@ snippets:
osasnippets:
enabled: true
features:
- keychain
- mac_tools
- direnv
- vscode

duti:
# Archive handlers - Keka for fast extraction
.zip: com.aone.keka
# Code/text editors - VSCode
.zsh: com.microsoft.VSCode
.sh: com.microsoft.VSCode
.js: com.microsoft.VSCode
.jsx: com.microsoft.VSCode
.ts: com.microsoft.VSCode
.tsx: com.microsoft.VSCode
.json: com.microsoft.VSCode
.json5: com.microsoft.VSCode
.md: com.microsoft.VSCode
.txt: com.microsoft.VSCode
.py: com.microsoft.VSCode
.rb: com.microsoft.VSCode
.yml: com.microsoft.VSCode
.yaml: com.microsoft.VSCode
.svg: com.microsoft.VSCode
57 changes: 53 additions & 4 deletions osa-cli.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,22 @@ flatten_yaml_to_env_vars() {
done <<< "$snippet_repos"
fi

# Flatten duti section (macOS default app overrides)
# Pattern: .extension: bundle_id
local duti_overrides=$(yq eval '.duti | keys | .[]' "$resolved_path" 2>/dev/null)

if [[ -n "$duti_overrides" ]]; then
while IFS= read -r extension; do
[[ -z "$extension" ]] && continue

local bundle_id=$(yq eval ".duti.\"${extension}\"" "$resolved_path" 2>/dev/null | tr -d '\n')
if [[ -n "$bundle_id" && "$bundle_id" != "null" ]]; then
local ext_var="OSA_CONFIG_DUTI_${extension//./}_BUNDLE_ID"
typeset -gx "${ext_var}=${bundle_id}"
fi
done <<< "$duti_overrides"
fi

return 0
}

Expand Down Expand Up @@ -208,7 +224,7 @@ load_json_config() {

# For backward compatibility during installation, also set OSA_SETUP_* variables
# These are used by run_component() to determine what to install
local -a component_keys=(symlinks oh_my_zsh zsh_plugins homebrew mise osa_snippets git android iterm2 vscode cocoapods depot_tools)
local -a component_keys=(symlinks oh_my_zsh zsh_plugins homebrew mise osa_snippets git android iterm2 vscode cocoapods depot_tools 7zip duti)

for key in "${component_keys[@]}"; do
local enabled=$(yq eval ".components.${key} // false" "$resolved_path" 2>/dev/null | tr -d '\n')
Expand Down Expand Up @@ -357,6 +373,8 @@ init_components() {
register_component "git" "Configure Git (version control)" "all" "src/setup/git.zsh"
register_component "cocoapods" "Install CocoaPods for iOS development" "macos" "src/setup/install-cocoapods.zsh"
register_component "depot_tools" "Install depot_tools (Chromium development utilities)" "all" "src/setup/install-depot-tools.zsh"
register_component "7zip" "Install 7zip (fast multi-threaded archive extraction for macOS)" "macos" "src/setup/install-7zip.zsh"
register_component "duti" "Install duti (macOS default app manager)" "macos" "src/setup/install-duti.zsh"
}

# Check if component is available for current platform
Expand Down Expand Up @@ -436,7 +454,7 @@ save_config() {
# If no OSA_CONFIG_* variables exist (interactive mode), convert OSA_SETUP_* to OSA_CONFIG_*
if [[ -z "$(echo $all_vars | grep '^OSA_CONFIG_')" ]]; then
# Convert OSA_SETUP_* component flags to OSA_CONFIG_COMPONENTS_*
local -a component_keys=(symlinks homebrew oh_my_zsh zsh_plugins mise osa_snippets git android iterm2 vscode cocoapods depot_tools)
local -a component_keys=(symlinks homebrew oh_my_zsh zsh_plugins mise osa_snippets git android iterm2 vscode cocoapods depot_tools 7zip duti)
for key in "${component_keys[@]}"; do
local var_name="OSA_SETUP_$(echo $key | tr a-z A-Z | tr '-' '_')"
local value="${(P)var_name}"
Expand Down Expand Up @@ -709,7 +727,7 @@ validate_config() {

# Show enabled components
echo -e "${COLOR_BOLD}Setup Components (to be installed):${COLOR_RESET}"
local -a component_keys=(symlinks oh_my_zsh zsh_plugins homebrew mise osa_snippets git cocoapods depot_tools)
local -a component_keys=(symlinks oh_my_zsh zsh_plugins homebrew mise osa_snippets git cocoapods depot_tools 7zip duti)
for key in "${component_keys[@]}"; do
local enabled=$(yq eval ".components.${key} // false" "$resolved_path" 2>/dev/null)
if [[ "$enabled" == "true" ]]; then
Expand Down Expand Up @@ -1062,6 +1080,10 @@ automated_setup() {
selected_components+=("depot_tools")
fi

if [[ "$OSA_SETUP_DUTI" == "true" ]]; then
selected_components+=("duti")
fi

if [[ ${#selected_components[@]} -eq 0 ]]; then
echo -e "${COLOR_YELLOW}No components enabled in configuration.${COLOR_RESET}"
echo "Run with --interactive to select components."
Expand Down Expand Up @@ -1150,6 +1172,12 @@ ${COLOR_BOLD}SECURITY:${COLOR_RESET}
--migrate-secrets Interactive wizard to move secrets to secure storage
--setup-git-hook Install pre-commit hook to prevent secret commits

${COLOR_BOLD}MACOS TOOLS:${COLOR_RESET}
--xcode-init Initialize Xcode (accept license, run first-launch setup)
Requires: Full Xcode.app installed (not just Command Line Tools)
Tracks initialization state in ~/.osa/.xcode-initialized
Usage: ./osa-cli.zsh --xcode-init

${COLOR_BOLD}RUNTIME COMMANDS (available as 'osa' in shell):${COLOR_RESET}
osa open Open OSA repository in editor (default: VS Code)
osa --help Show this help
Expand Down Expand Up @@ -1316,6 +1344,8 @@ enable_minimal() {
OSA_SETUP_VSCODE=false
OSA_SETUP_OSA_SNIPPETS=false
OSA_SETUP_DEPOT_TOOLS=false
OSA_SETUP_7ZIP=false
OSA_SETUP_DUTI=false

# Enable homebrew on macOS
if [[ "$OSA_IS_MACOS" == "true" ]]; then
Expand Down Expand Up @@ -1770,6 +1800,17 @@ HOOK_EOF
echo " β€’ Guide you to use OSA's secure credential storage instead"
}

# Initialize Xcode after installation
xcode_init() {
if [[ ! -f "$OSA_CLI_DIR/src/setup/xcode-init.zsh" ]]; then
echo -e "${COLOR_RED}βœ—${COLOR_RESET} xcode-init.zsh not found"
return 1
fi

source "$OSA_CLI_DIR/src/setup/xcode-init.zsh"
return $?
}

# Main CLI logic
main() {
init_components
Expand Down Expand Up @@ -1840,7 +1881,7 @@ main() {
shift
;;
# Primary actions (first one wins) - Note: --config is special, it can take optional arg
-i|--interactive|-a|--auto|-l|--list|--list-configs|--info|--scan-secrets|--migrate-secrets|--setup-git-hook|--clean-symlinks|--clean-oh-my-zsh|--minimal|--all|--report|--report-json|--report-url)
-i|--interactive|-a|--auto|-l|--list|--list-configs|--info|--scan-secrets|--migrate-secrets|--setup-git-hook|--clean-symlinks|--clean-oh-my-zsh|--minimal|--all|--report|--report-json|--report-url|--xcode-init)
if [[ -z "$primary_action" ]]; then
primary_action="$1"
fi
Expand Down Expand Up @@ -2027,6 +2068,14 @@ main() {
generate_system_report "url"
exit 0
;;
--xcode-init)
if [[ "$OSA_IS_MACOS" != "true" ]]; then
echo -e "${COLOR_YELLOW}⚠${COLOR_RESET} --xcode-init is only available on macOS"
exit 0
fi
xcode_init
exit $?
;;
*)
echo -e "${COLOR_RED}βœ—${COLOR_RESET} Unknown action: $primary_action"
exit 1
Expand Down
Loading