This commit is contained in:
Max Goedjen 2025-09-01 19:25:14 -07:00
parent 90d55726bb
commit 0980cdffcd
No known key found for this signature in database
4 changed files with 317 additions and 290 deletions

View File

@ -3,6 +3,94 @@
"strings" : { "strings" : {
"" : { "" : {
},
"agent_details_could_not_start_error" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub."
}
}
}
},
"agent_details_disable_agent_button" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disable Agent"
}
}
}
},
"agent_details_restart_agent_button" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restart Agent"
}
}
}
},
"agent_details_running_since_title" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Running Since"
}
}
}
},
"agent_details_socket_path_title" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Socket Path"
}
}
}
},
"agent_details_start_agent_button" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Start Agent"
}
}
}
},
"agent_details_start_agent_button_starting" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Starting Agent"
}
}
}
},
"agent_details_version_title" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Version"
}
}
}
}, },
"agent_not_running_notice_detail_description" : { "agent_not_running_notice_detail_description" : {
"extractionState" : "manual", "extractionState" : "manual",
@ -400,6 +488,17 @@
} }
} }
}, },
"agentDetailsLocationTitle" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Secret Agent Location"
}
}
}
},
"app_menu_help_button" : { "app_menu_help_button" : {
"extractionState" : "manual", "extractionState" : "manual",
"localizations" : { "localizations" : {
@ -785,16 +884,6 @@
} }
} }
}, },
"Apps" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apps"
}
}
}
},
"auth_context_persist_for_duration" : { "auth_context_persist_for_duration" : {
"comment" : "When the user clicks the notification to leave a secret unlocked, they are shown a prompt to approve the action. This is the description, showing which secret will used. The first placeholder is the name of the secret. The second placeholder is a localized description of the time period it will remain unlocked for (eg: \"five minutes\")", "comment" : "When the user clicks the notification to leave a secret unlocked, they are shown a prompt to approve the action. This is the description, showing which secret will used. The first placeholder is the name of the secret. The second placeholder is a localized description of the time period it will remain unlocked for (eg: \"five minutes\")",
"extractionState" : "manual", "extractionState" : "manual",
@ -1185,46 +1274,6 @@
} }
} }
}, },
"Configuration File" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configuration File"
}
}
}
},
"Configure" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configure"
}
}
}
},
"Configure Integrations" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configure Integrations"
}
}
}
},
"Configuring Tools for Secretive" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configuring Tools for Secretive"
}
}
}
},
"Copy" : { "Copy" : {
"localizations" : { "localizations" : {
"en" : { "en" : {
@ -2555,16 +2604,6 @@
} }
} }
}, },
"Disable Agent" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disable Agent"
}
}
}
},
"Done" : { "Done" : {
"localizations" : { "localizations" : {
"en" : { "en" : {
@ -3112,46 +3151,6 @@
} }
} }
}, },
"If you don't known what shell you use and haven't changed it, you're probably using `%@`." : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "If you don't known what shell you use and haven't changed it, you're probably using `%@`."
}
}
}
},
"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client." : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client."
}
}
}
},
"If you're trying to configure anything your command line runs to use Secretive, configure your shell." : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "If you're trying to configure anything your command line runs to use Secretive, configure your shell."
}
}
}
},
"If you're trying to sign your git commits, set up Git Signing." : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "If you're trying to sign your git commits, set up Git Signing."
}
}
}
},
"Integrations" : { "Integrations" : {
"localizations" : { "localizations" : {
"en" : { "en" : {
@ -3163,6 +3162,7 @@
} }
}, },
"integrations_add_this_title" : { "integrations_add_this_title" : {
"extractionState" : "manual",
"localizations" : { "localizations" : {
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
@ -3172,22 +3172,78 @@
} }
} }
}, },
"integrations_apps_row_title" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apps"
}
}
}
},
"integrations_community_apps_list_description" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help."
}
}
}
},
"integrations_community_shell_list_description" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help."
}
}
}
},
"integrations_path_title" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configuration File"
}
}
}
},
"integrations_view_other_github_link" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "View on GitHub"
}
}
}
},
"integrations_web_link" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "View Documentation on Web"
}
}
}
},
"Integrations..." : { "Integrations..." : {
"localizations" : { "localizations" : {
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value" : "Add This:" "value" : "Integrations…"
}
}
}
},
"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead." : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead."
} }
} }
} }
@ -3423,6 +3479,127 @@
} }
} }
}, },
"onboarding_getting_started_multiple_config" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "You can configure more than one tool, they generally won't interfere with each other."
}
}
}
},
"onboarding_getting_started_suggestion_git" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "If you're trying to sign your git commits, set up Git Signing."
}
}
}
},
"onboarding_getting_started_suggestion_shell" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "If you're trying to configure anything your command line runs to use Secretive, configure your shell."
}
}
}
},
"onboarding_getting_started_suggestion_shell_default" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`."
}
}
}
},
"onboarding_getting_started_suggestion_ssh" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client."
}
}
}
},
"onboarding_getting_started_title" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configuring Tools for Secretive"
}
}
}
},
"onboarding_getting_started_title_description" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead."
}
}
}
},
"onboarding_getting_started_what_should_i_configure_title" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "What Should I Configure?"
}
}
}
},
"onboarding_integrations_button_title" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configure"
}
}
}
},
"onboarding_integrations_description" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tell the tools you use how to talk to Secretive."
}
}
}
},
"onboarding_integrations_title" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configure Integrations"
}
}
}
},
"other" : { "other" : {
}, },
@ -3585,16 +3762,6 @@
} }
} }
}, },
"Restart Agent" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restart Agent"
}
}
}
},
"Reveal in Finder" : { "Reveal in Finder" : {
"localizations" : { "localizations" : {
"en" : { "en" : {
@ -3605,26 +3772,6 @@
} }
} }
}, },
"Running Since" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Running Since"
}
}
}
},
"Secret Agent Location" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Secret Agent Location"
}
}
}
},
"secret_detail_md5_fingerprint_label" : { "secret_detail_md5_fingerprint_label" : {
"extractionState" : "manual", "extractionState" : "manual",
"localizations" : { "localizations" : {
@ -4051,16 +4198,6 @@
} }
} }
}, },
"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub." : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub."
}
}
}
},
"secure_enclave" : { "secure_enclave" : {
"extractionState" : "manual", "extractionState" : "manual",
"localizations" : { "localizations" : {
@ -5450,36 +5587,6 @@
} }
} }
}, },
"Socket Path" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Socket Path"
}
}
}
},
"Start Agent" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Start Agent"
}
}
}
},
"Starting Agent" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Starting Agent"
}
}
}
},
"System" : { "System" : {
"localizations" : { "localizations" : {
"en" : { "en" : {
@ -5490,36 +5597,6 @@
} }
} }
}, },
"Tell the tools you use how to talk to Secretive." : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tell the tools you use how to talk to Secretive."
}
}
}
},
"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help." : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help."
}
}
}
},
"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help." : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help."
}
}
}
},
"unnamed_secret" : { "unnamed_secret" : {
"extractionState" : "manual", "extractionState" : "manual",
"localizations" : { "localizations" : {
@ -6465,56 +6542,6 @@
} }
} }
} }
},
"Version" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Version"
}
}
}
},
"View Documentation on Web" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "View Documentation on Web"
}
}
}
},
"View on GitHub" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "View on GitHub"
}
}
}
},
"What Should I Configure?" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "What Should I Configure?"
}
}
}
},
"You can configure more than one tool, they generally won't interfere with each other." : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "You can configure more than one tool, they generally won't interfere with each other."
}
}
}
} }
}, },
"version" : "1.0" "version" : "1.0"

View File

@ -22,22 +22,22 @@ struct AgentRunningView: View {
Section { Section {
if let process = agentStatusChecker.process { if let process = agentStatusChecker.process {
ConfigurationItemView( ConfigurationItemView(
title: "Secret Agent Location", title: LocalizedStringResource.agentDetailsLocationTitle,
value: process.bundleURL!.path(), value: process.bundleURL!.path(),
action: .revealInFinder(process.bundleURL!.path()), action: .revealInFinder(process.bundleURL!.path()),
) )
ConfigurationItemView( ConfigurationItemView(
title: "Socket Path", title: LocalizedStringResource.agentDetailsSocketPathTitle,
value: socketPath, value: socketPath,
action: .copy(socketPath), action: .copy(socketPath),
) )
ConfigurationItemView( ConfigurationItemView(
title: "Version", title: LocalizedStringResource.agentDetailsVersionTitle,
value: Bundle(url: process.bundleURL!)!.infoDictionary!["CFBundleShortVersionString"] as! String value: Bundle(url: process.bundleURL!)!.infoDictionary!["CFBundleShortVersionString"] as! String
) )
if let launchDate = process.launchDate { if let launchDate = process.launchDate {
ConfigurationItemView( ConfigurationItemView(
title: "Running Since", title: LocalizedStringResource.agentDetailsRunningSinceTitle,
value: launchDate.formatted() value: launchDate.formatted()
) )
} }
@ -51,8 +51,8 @@ struct AgentRunningView: View {
Text(.agentRunningNoticeDetailDescription) Text(.agentRunningNoticeDetailDescription)
HStack { HStack {
Spacer() Spacer()
Menu("Restart Agent") { Menu(.agentDetailsRestartAgentButton) {
Button("Disable Agent") { Button(.agentDetailsDisableAgentButton) {
Task { Task {
_ = await LaunchAgentController() _ = await LaunchAgentController()
.uninstall() .uninstall()
@ -118,10 +118,10 @@ struct AgentNotRunningView: View {
} }
} label: { } label: {
if !loading { if !loading {
Text("Start Agent") Text(.agentDetailsStartAgentButton)
} else { } else {
HStack { HStack {
Text("Starting Agent") Text(.agentDetailsStartAgentButtonStarting)
ProgressView() ProgressView()
.controlSize(.mini) .controlSize(.mini)
} }
@ -129,7 +129,7 @@ struct AgentNotRunningView: View {
} }
.primaryButton() .primaryButton()
} else { } else {
Text("Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.") Text(.agentDetailsCouldNotStartError)
.bold() .bold()
.foregroundStyle(.red) .foregroundStyle(.red)
} }

View File

@ -80,24 +80,24 @@ struct IntegrationsDetailView: View {
switch selectedInstruction.id { switch selectedInstruction.id {
case .gettingStarted: case .gettingStarted:
Form { Form {
Section("Configuring Tools for Secretive") { Section(.onboardingGettingStartedTitle) {
Text("Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.") Text(.onboardingGettingStartedTitleDescription)
} }
Section { Section {
Group { Group {
Text("If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.") Text(.onboardingGettingStartedSuggestionSsh)
.onTapGesture { .onTapGesture {
self.selectedInstruction = instructions.ssh self.selectedInstruction = instructions.ssh
} }
VStack(alignment: .leading, spacing: 5) { VStack(alignment: .leading, spacing: 5) {
Text("If you're trying to configure anything your command line runs to use Secretive, configure your shell.") Text(.onboardingGettingStartedSuggestionShell)
Text("If you don't known what shell you use and haven't changed it, you're probably using `\(instructions.defaultShell.tool)`.") Text(.onboardingGettingStartedSuggestionShellDefault(shellName: instructions.defaultShell.tool))
.font(.caption2) .font(.caption2)
} }
.onTapGesture { .onTapGesture {
self.selectedInstruction = instructions.defaultShell self.selectedInstruction = instructions.defaultShell
} }
Text("If you're trying to sign your git commits, set up Git Signing.") Text(.onboardingGettingStartedSuggestionGit)
.onTapGesture { .onTapGesture {
self.selectedInstruction = instructions.git self.selectedInstruction = instructions.git
} }
@ -105,10 +105,10 @@ struct IntegrationsDetailView: View {
.foregroundStyle(.link) .foregroundStyle(.link)
} header: { } header: {
Text("What Should I Configure?") Text(.onboardingGettingStartedWhatShouldIConfigureTitle)
} }
footer: { footer: {
Text("You can configure more than one tool, they generally won't interfere with each other.") Text(.onboardingGettingStartedMultipleConfig)
} }
} }
.formStyle(.grouped) .formStyle(.grouped)
@ -116,9 +116,9 @@ struct IntegrationsDetailView: View {
Form { Form {
ForEach(selectedInstruction.steps) { stepGroup in ForEach(selectedInstruction.steps) { stepGroup in
Section { Section {
ConfigurationItemView(title: "Configuration File", value: stepGroup.path, action: .revealInFinder(stepGroup.path)) ConfigurationItemView(title: LocalizedStringResource.integrationsPathTitle, value: stepGroup.path, action: .revealInFinder(stepGroup.path))
ForEach(stepGroup.steps, id: \.self) { step in ForEach(stepGroup.steps, id: \.self) { step in
ConfigurationItemView(title: "integrations_add_this_title", action: .copy(step)) { ConfigurationItemView(title: LocalizedStringResource.integrationsAddThisTitle, action: .copy(step)) {
HStack { HStack {
Text(step) Text(step)
.padding(8) .padding(8)
@ -144,7 +144,7 @@ struct IntegrationsDetailView: View {
Section { Section {
Link(destination: url) { Link(destination: url) {
VStack(alignment: .leading, spacing: 5) { VStack(alignment: .leading, spacing: 5) {
Text("View Documentation on Web") Text(.integrationsWebLink)
.font(.headline) .font(.headline)
Text(url.absoluteString) Text(url.absoluteString)
.font(.caption2) .font(.caption2)
@ -157,9 +157,9 @@ struct IntegrationsDetailView: View {
case .otherShell: case .otherShell:
Form { Form {
Section { Section {
Link("View on GitHub", destination: URL(string: "https://github.com/maxgoedjen/secretive-config-instructions/tree/main/shells")!) Link(.integrationsViewOtherGithubLink, destination: URL(string: "https://github.com/maxgoedjen/secretive-config-instructions/tree/main/shells")!)
} header: { } header: {
Text("There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.") Text(.integrationsCommunityShellListDescription)
.font(.body) .font(.body)
} }
} }
@ -168,9 +168,9 @@ struct IntegrationsDetailView: View {
case .otherApp: case .otherApp:
Form { Form {
Section { Section {
Link("View on GitHub", destination: URL(string: "https://github.com/maxgoedjen/secretive-config-instructions/tree/main/apps")!) Link(.integrationsViewOtherGithubLink, destination: URL(string: "https://github.com/maxgoedjen/secretive-config-instructions/tree/main/apps")!)
} header: { } header: {
Text("There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.") Text(.integrationsCommunityAppsListDescription)
.font(.body) .font(.body)
} }
} }
@ -268,7 +268,7 @@ private struct Instructions {
ConfigurationFileInstructions("other", id: .otherShell), ConfigurationFileInstructions("other", id: .otherShell),
]), ]),
ConfigurationGroup(name: "Other", instructions: [ ConfigurationGroup(name: "Other", instructions: [
ConfigurationFileInstructions("Apps", id: .otherApp), ConfigurationFileInstructions(LocalizedStringResource.integrationsAppsRowTitle, id: .otherApp),
]), ]),
] ]
} }

View File

@ -50,12 +50,12 @@ struct SetupView: View {
} }
Divider() Divider()
StepView( StepView(
title: "Configure Integrations", title: .onboardingIntegrationsTitle,
description: "Tell the tools you use how to talk to Secretive.", description: LocalizedStringResource.onboardingIntegrationsDescription,
systemImage: "firewall", systemImage: "firewall",
) { ) {
OnboardingButton( OnboardingButton(
"Configure", LocalizedStringResource.onboardingIntegrationsButtonTitle,
complete: integrations, complete: integrations,
width: buttonWidth width: buttonWidth
) { ) {