{"id":20992588,"url":"https://github.com/gary-ash/xcodegeedbla","last_synced_at":"2026-05-01T05:37:48.385Z","repository":{"id":247301705,"uuid":"793223557","full_name":"Gary-Ash/XcodeGeeDblA","owner":"Gary-Ash","description":"My Xcode utility extension","archived":false,"fork":false,"pushed_at":"2025-01-07T00:21:16.000Z","size":1736,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-20T08:31:44.889Z","etag":null,"topics":["xcode","xcode-source-editor-extension"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Gary-Ash.png","metadata":{"files":{"readme":"README.markdown","changelog":null,"contributing":".github/CONTRIBUTING.markdown","funding":".github/FUNDING.yml","license":"LICENSE.markdown","code_of_conduct":".github/CODE_OF_CONDUCT.markdown","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["Gary-Ash"]}},"created_at":"2024-04-28T19:05:41.000Z","updated_at":"2025-01-07T00:21:20.000Z","dependencies_parsed_at":"2024-07-08T00:29:04.424Z","dependency_job_id":"7aa752bc-b610-493c-81e5-86c8e92167ed","html_url":"https://github.com/Gary-Ash/XcodeGeeDblA","commit_stats":null,"previous_names":["gary-ash/xcodegeedbla"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gary-Ash%2FXcodeGeeDblA","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gary-Ash%2FXcodeGeeDblA/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gary-Ash%2FXcodeGeeDblA/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gary-Ash%2FXcodeGeeDblA/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Gary-Ash","download_url":"https://codeload.github.com/Gary-Ash/XcodeGeeDblA/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243403878,"owners_count":20285463,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["xcode","xcode-source-editor-extension"],"created_at":"2024-11-19T07:11:42.548Z","updated_at":"2026-05-01T05:37:48.366Z","avatar_url":"https://github.com/Gary-Ash.png","language":"Swift","funding_links":["https://github.com/sponsors/Gary-Ash"],"categories":[],"sub_categories":[],"readme":"# XcodeGeeDblA\n\nAn Xcode Source Editor Extension for macOS that provides convenient source code formatting and file header management tools for Swift, C, C++, and Objective-C files.\n\n![Extension Menu](.github/Screenshot.png)\n\n## Features\n\n### Header Management\n\n- **Update File Header** — Automatically updates the \"Modified\" date in file headers while preserving the \"Created\" date and intelligently handling copyright year ranges (e.g., 2024–2026)\n\n### Comment Formatting\n\n- **Insert Separator Comment** — Inserts a horizontal line comment (`/*----...----*/`)\n- **Insert Asterisk Box Comment** — Creates a decorative comment box with asterisks\n- **Insert Dash Box Comment** — Creates a decorative comment box with dashes\n- **Insert Equals Sign Box Comment** — Creates a decorative comment box with equals signs\n\n### Debugging Utilities\n\n- **Insert Function Trace Comment** — Automatically adds `print(\"# Gee Dbl A: Entering functionName()\")` statements to all functions in the file\n- **Remove Function Trace Comment** — Removes previously added function trace comments\n\n### Configuration App\n\nThe companion macOS application allows you to maintain a list of copyright holders that the extension recognizes when updating file headers.\n\n## Supported File Types\n\n- Swift source files (`.swift`)\n- Swift Playgrounds\n- C/C++ source and header files (`.c`, `.cpp`, `.h`, `.hpp`)\n- Objective-C source files (`.m`, `.mm`)\n- Xcode strings files\n\n## Requirements\n\n- macOS (recent versions)\n- Xcode\n\n## Installation\n\n1. Download the latest release or build from source\n2. Move `XcodeGeeDblA.app` to your Applications folder\n3. Launch the app once to register the extension\n4. Enable the extension in **System Settings → Privacy \u0026 Security → Extensions → Xcode Source Editor**\n5. Restart Xcode\n\n## Usage\n\n1. Open any supported source file in Xcode\n2. Select **Editor → XcodeGeeDblA** from the menu bar\n3. Choose the desired command\n\nYou can also assign keyboard shortcuts to these commands via **Xcode → Settings → Key Bindings**.\n\n## Building from Source\n\n### Xcode\n\n```bash\ngit clone https://github.com/YourUsername/XcodeGeeDblA.git\ncd XcodeGeeDblA\nopen XcodeGeeDblA.xcodeproj\n```\n\nSelect your development team in **Signing \u0026 Capabilities** for both the app and extension targets, then build and run. The extension will be automatically built and registered.\n\n### Distribution Build\n\nThe `build.sh` script automates a full release build including code signing and notarization. It extracts your team ID from the Developer ID Application certificate in your keychain, so no team ID needs to be stored in the project file.\n\n**Prerequisites:**\n\n- A **Developer ID Application** certificate installed in your keychain\n- A notarization keychain profile named `notary-profile` (created via `xcrun notarytool store-credentials`)\n\n```bash\n./build.sh\n```\n\nThe script performs the following steps:\n\n1. Locates your Developer ID Application signing certificate\n2. Extracts the team ID and injects it into the Xcode project file\n3. Builds a Release configuration with `xcodebuild`\n4. Code signs the resulting `XcodeGeeDblA.app`\n5. Submits the app for Apple notarization and waits for approval\n6. Staples the notarization ticket to the app\n7. Cleans up by removing the team ID from the project file and any generated build artifacts\n\nOn completion, a signed and notarized `XcodeGeeDblA.app` is ready for distribution in the project root.\n\n### Debugging the Extension\n\nFor extension debugging, use the `pluginkit` command-line tool:\n\n```bash\n# List registered extensions\npluginkit -m -v -i com.gee-dbl-a.XcodeGeeDblA.Extension\n\n# Reset extension registration\npluginkit -e use -i com.gee-dbl-a.XcodeGeeDblA.Extension\n```\n\n## Project Structure\n\n```\nXcodeGeeDblA/\n├── XcodeGeeDblA/           # Main macOS app (SwiftUI)\n│   ├── XcodeGeeDblAApp.swift\n│   ├── ContentView.swift   # Copyright holders management UI\n│   └── Assets.xcassets/\n├── Extension/              # Xcode Source Editor Extension\n│   ├── SourceEditorCommand.swift   # Core extension logic\n│   ├── SourceEditorExtension.swift\n│   ├── Constants.swift     # Supported UTI definitions\n│   └── Info.plist          # Command registrations\n└── BuildEnv/               # CI/CD and build scripts\n```\n\n## Contributing\n\nContributions are welcome. Please read the [Contributing Guidelines](.github/CONTRIBUTING.markdown) and [Code of Conduct](.github/CODE_OF_CONDUCT.markdown) before submitting a pull request.\n\n## License\n\nThis project is licensed under the MIT License — see [LICENSE.markdown](LICENSE.markdown) for details.\n\nCopyright 2024 Gary Ash\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgary-ash%2Fxcodegeedbla","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgary-ash%2Fxcodegeedbla","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgary-ash%2Fxcodegeedbla/lists"}