diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..8d40d8f --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @everettjf diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..dec9e19 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,66 @@ +name: Bug report +description: Report a reproducible problem in GrapeCompare +title: "[Bug]: " +body: + - type: markdown + attributes: + value: | + Thanks for helping improve GrapeCompare. Please remove private information from paths, filenames, screenshots, and sample files before posting. + + - type: textarea + id: summary + attributes: + label: What happened? + description: Tell us what you expected and what happened instead. + placeholder: A clear, concise description of the problem. + validations: + required: true + + - type: textarea + id: reproduce + attributes: + label: Steps to reproduce + placeholder: | + 1. Open ... + 2. Compare ... + 3. See ... + validations: + required: true + + - type: input + id: version + attributes: + label: GrapeCompare version + placeholder: "For example: 1.1.0 (5)" + validations: + required: true + + - type: input + id: macos + attributes: + label: macOS version and Mac model + placeholder: "For example: macOS 27.0, MacBook Pro with Apple silicon" + validations: + required: true + + - type: textarea + id: sample + attributes: + label: Minimal sample or screenshot + description: Attach the smallest non-sensitive sample that reproduces the issue, if possible. + + - type: textarea + id: context + attributes: + label: Additional context + description: Include logs, file counts, approximate file sizes, or anything else that may help. + + - type: checkboxes + id: checks + attributes: + label: Checklist + options: + - label: I searched existing issues and did not find a duplicate. + required: true + - label: I removed private or confidential data from this report. + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..31bb76f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Security vulnerability + url: https://github.com/everettjf/GrapeCompare/security/advisories/new + about: Report security problems privately instead of opening a public issue. + - name: App Store support + url: https://github.com/everettjf/GrapeCompare/blob/main/SUPPORT.md + about: Read the support guide before opening an issue. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..22349e8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,48 @@ +name: Feature request +description: Suggest an improvement or new capability +title: "[Feature]: " +body: + - type: textarea + id: problem + attributes: + label: What problem would this solve? + description: Describe the workflow or limitation behind the request. + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposed solution + description: Explain what you would like GrapeCompare to do. + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: Share any workarounds or alternative designs you tried. + + - type: dropdown + id: area + attributes: + label: Area + options: + - File comparison + - Folder comparison + - Performance + - User interface + - Accessibility + - Documentation + - Other + validations: + required: true + + - type: checkboxes + id: checks + attributes: + label: Checklist + options: + - label: I searched existing issues and did not find a duplicate. + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..0cfa1d7 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,24 @@ +## Summary + +Describe the problem and the approach taken. + +## Validation + +- [ ] `bash macos/Tests/run-tests.sh` +- [ ] I manually tested the affected file/folder comparison workflow. +- [ ] I added or updated tests for behavior changes. +- [ ] I updated documentation for user-visible changes. + +## Performance impact + +If this touches comparison, scanning, filtering, or rendering performance, include reproducible before/after benchmark commands and results. Otherwise write “Not applicable.” + +## Screenshots + +Include before/after screenshots for visible UI changes, or write “Not applicable.” + +## Privacy and compatibility + +- [ ] The change keeps comparison data on-device. +- [ ] The change does not broaden filesystem permissions without explanation. +- [ ] The change preserves current macOS deployment compatibility, or documents why it changes. diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000..eac1d8a --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,19 @@ +changelog: + categories: + - title: New features + labels: + - enhancement + - feature + - title: Performance + labels: + - performance + - title: Fixes + labels: + - bug + - fix + - title: Documentation + labels: + - documentation + - title: Other changes + labels: + - "*" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..fd0b5dd --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,27 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + core-tests: + name: Core correctness and stress tests + runs-on: macos-26 + timeout-minutes: 10 + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Run core tests + run: bash macos/Tests/run-tests.sh diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..3fc3efb --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,21 @@ +# Code of Conduct + +GrapeCompare is committed to a welcoming, respectful, and productive community. + +## Expected behavior + +- Be considerate and constructive when discussing ideas or reviewing work. +- Focus criticism on code, design, and observable behavior rather than people. +- Welcome different levels of experience and help others participate effectively. +- Respect privacy. Never publish another person's confidential files, paths, logs, or identifying information. +- Accept maintainers' decisions about project scope and moderation. + +## Unacceptable behavior + +Harassment, discrimination, threats, personal attacks, deliberate disruption, and publishing private information without permission are not tolerated in project spaces. + +## Reporting and enforcement + +Report conduct concerns privately using the contact information on [the maintainer's GitHub profile](https://github.com/everettjf). Do not open a public issue for a sensitive report. Reports will be reviewed fairly and kept confidential to the extent practical. Maintainers may edit or remove content and temporarily or permanently restrict participation when necessary. + +This policy applies to the repository, issue tracker, pull requests, discussions, and other spaces where someone is representing the project. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e86bd18 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,51 @@ +# Contributing to GrapeCompare + +Thanks for helping make file and folder comparison faster, clearer, and more reliable. + +## Before you start + +- Search [existing issues](https://github.com/everettjf/GrapeCompare/issues) before opening a new one. +- Use the bug or feature issue form and include a minimal, non-sensitive example when possible. +- For a large behavioral or architectural change, open an issue first so the approach can be discussed before substantial implementation work. +- Report vulnerabilities privately according to [SECURITY.md](SECURITY.md). + +## Development setup + +The application currently requires macOS 27+ and Xcode 27+. Open `macos/GrapeCompare.xcodeproj`, select the `GrapeCompare` scheme, and run the app. + +The comparison engines and their tests can also be compiled directly with the Swift toolchain: + +```bash +bash macos/Tests/run-tests.sh +``` + +Run the reproducible Release benchmark with: + +```bash +bash macos/Benchmarks/run-benchmarks.sh +``` + +Optional arguments set generated line and file counts: + +```bash +bash macos/Benchmarks/run-benchmarks.sh 100000 50000 +``` + +## Pull requests + +Keep each pull request focused and explain the user-facing motivation. Before submitting: + +1. Run the full core test suite. +2. Add regression coverage for correctness fixes and edge cases. +3. Manually exercise affected SwiftUI workflows. +4. Update both English and Chinese READMEs for user-facing documentation changes. +5. Include screenshots for visible UI changes. +6. Include the exact fixture, command, and before/after timings for performance changes. + +Comparison accuracy takes priority over benchmark gains. An optimization should retain exact byte validation where required and must not silently discard stable diff structure. + +## Code style + +Follow the surrounding Swift style, favor small focused types and functions, and keep platform-independent comparison logic in `macos/GrapeCompare/Core`. Avoid unrelated formatting changes in the same pull request. + +By participating, you agree to follow the [Code of Conduct](CODE_OF_CONDUCT.md). diff --git a/README.md b/README.md index c824a6e..3e298b3 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,37 @@
+
+
+
+
+
+
+
+