Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
e37c46b
Rebuild NTFS mounting core and add native menu bar app
guoquan Oct 9, 2026
d9c83a7
Fix compatibility with CI lint and upload development app
guoquan Oct 9, 2026
3c99e92
Fix macOS disk metadata parsing and refresh feedback in 0.2.1
guoquan Oct 9, 2026
21eeba5
Keep live metadata smoke test compatible with CI ShellCheck
guoquan Oct 9, 2026
f1dde13
Fix missing NTFS volume identity and package website brand icons (0.2.2)
guoquan Oct 9, 2026
63a13a4
Support UUID-less NTFS volumes with read-only boot identity and usefu…
guoquan Oct 9, 2026
d48908a
Align NTFS identity reads, report precise failures and version build …
guoquan Oct 9, 2026
ae08d65
Preserve test fixture directory when reloading core for reader integr…
guoquan Oct 9, 2026
ab3e3d1
Clarify reader length validation and intentional child-shell/test cal…
guoquan Oct 9, 2026
679962a
Identify UUID-less connected media through IOKit metadata and request…
guoquan Oct 9, 2026
2643392
Keep registry mocks only in tests that query identity metadata
guoquan Oct 9, 2026
2b0fc56
Verify FUSE write access against the kernel mount table; build 0.2.6
guoquan Oct 9, 2026
8bd0155
Quiet successful operations and smooth menu bar mounting flow in 0.2.7
guoquan Oct 9, 2026
853619c
Declare optional native-helper candidate paths explicitly
guoquan Oct 9, 2026
10d6dbf
Reuse a bounded native AppleScript authorization session for GUI moun…
guoquan Oct 9, 2026
10f98af
Restore proven authorization launch path and classify device access e…
guoquan Oct 9, 2026
935265e
Restore user-validated authorization reuse and clarify ntfs-3g disk p…
guoquan Oct 10, 2026
e42765a
Polish native drive menu, keep replaceable app name, and document Tou…
guoquan Oct 10, 2026
35a7553
Use built-in grep for macOS archive validation
guoquan Oct 10, 2026
a608e29
Add opt-in protected NTFS permission helper and native Touch ID confi…
guoquan Oct 10, 2026
0b84fb9
Constrain dynamic driver plugin reads and validate indirect commit mocks
guoquan Oct 10, 2026
66c2d5c
Fix helper delegate visibility and exercise driver sandbox denial on …
guoquan Oct 10, 2026
5aad3b9
Use canonical code hash requirements and retain native confirmation a…
guoquan Oct 10, 2026
e4e6ce9
Validate inline code signing requirements and preflight helper setup …
guoquan Oct 10, 2026
013e30c
fix: guide pending helper approval and support Apple-issued build sig…
guoquan Oct 10, 2026
a08c1a6
fix: keep privileged XPC daemon alive and test real launchd status re…
guoquan Oct 10, 2026
e818649
test: provide root-owned launchd fixture and report bootstrap failures
guoquan Oct 10, 2026
24a8ed0
feat: add targeted helper registration repair and launch-state diagno…
guoquan Oct 10, 2026
bd9df44
Pin helper launch constraint to signed CDHash and verify launchd reje…
guoquan Oct 10, 2026
de5c93f
Separate CI signature pin validation from untested SMAppService enfor…
guoquan Oct 10, 2026
9573a59
Refresh 0.3.4 usage docs and record unresolved helper signing failures
guoquan Oct 10, 2026
c45f597
Move authorization development plans from user guide into staged roadmap
guoquan Oct 10, 2026
ed7fe43
Add isolated macOS native UI capture for documentation
guoquan Oct 10, 2026
facb563
Align bilingual user docs and showcase native app with macOS screenshots
guoquan Oct 10, 2026
9d4e8ee
Restore prominent human–AI collaboration identity in both READMEs
guoquan Oct 10, 2026
b20f0cf
Refresh bilingual product messaging and promotional artwork
guoquan Oct 10, 2026
5848190
Address Copilot identity, helper timeout and protected-copy review
guoquan Oct 10, 2026
81c4adf
Reject source hard links and normalize macOS process-info size compar…
guoquan Oct 10, 2026
8750fbb
Enable Darwin process APIs and preserve executable core script mode
guoquan Oct 10, 2026
0e82a2f
Restrict packaged identity clients and repair documentation capture f…
guoquan Oct 10, 2026
fa38e10
Preserve executable mode of the documentation capture script
guoquan Oct 10, 2026
8996479
Start documentation capture after app activation and isolate sample m…
guoquan Oct 10, 2026
a48ccc8
Share protected device locks across users and rebuild clean app bundles
guoquan Oct 10, 2026
3081d3c
Acquire helper locks at transaction begin and allow release after unplug
guoquan Oct 10, 2026
f507776
Deny executable mappings from mutable storage and confirm timed-out g…
guoquan Oct 10, 2026
d3fd40d
Place shared locks beneath protected Library storage and document per…
guoquan Oct 10, 2026
01a64ff
Execute only protected kernel-pinned authorizers and approved driver …
guoquan Oct 10, 2026
0f74901
Align regression fixtures with shared public driver snapshot module
guoquan Oct 10, 2026
ea3e4ea
Retain device locks on unconfirmed driver termination and align regre…
guoquan Oct 10, 2026
44004df
Exercise lock-retaining status across the AppleScript authorization h…
guoquan Oct 10, 2026
ccc7c8c
Authenticate authorization IPC against the originating shell process …
guoquan Oct 10, 2026
221603f
Test rejection with a detached same-user requester forging the shell PID
guoquan Oct 10, 2026
bd32a0b
Retain helper commit lease until the originating caller acknowledges …
guoquan Oct 10, 2026
b37690d
Address app timeout, mount-state authority, status ordering and CLI d…
guoquan Oct 10, 2026
c0f1136
Preserve uncertain mutating XPC replies as the lock-retaining status
guoquan Oct 10, 2026
f881497
Report uncertain helper startup over authenticated IPC and retain the…
guoquan Oct 10, 2026
9a485bb
Preserve uncertain completion status after cleanup release and acknow…
guoquan Oct 10, 2026
5c2edb9
Fail cleanup explicitly when the native lock-release client disappears
guoquan Oct 10, 2026
7674360
Confirm helper device-lock release before acknowledging completion
guoquan Oct 10, 2026
525eee4
Retire closed helper transactions while preserving persistent stale l…
guoquan Oct 10, 2026
e88c246
Retain identity-verified writable volumes after cleanup failures and …
guoquan Oct 11, 2026
a445acd
Reserve cleanup time and report outer mount deadlines as uncertain co…
guoquan Oct 11, 2026
50871a4
Use an explicitly typed status array in timeout regression
guoquan Oct 11, 2026
dd10e85
Preserve the outer mount cleanup window through bounded-tool timeout …
guoquan Oct 11, 2026
318d15d
Keep authenticated recovery and lock cleanup available after new-work…
guoquan Oct 11, 2026
1ec0826
Bound accepted authorized commands by the remaining phase deadline
guoquan Oct 11, 2026
1ee26c4
Separate confirmed inner tool timeouts from uncertain outer deadline …
guoquan Oct 11, 2026
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
61 changes: 61 additions & 0 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: Checks
on:
push:
pull_request:
permissions:
contents: read
jobs:
core:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Shell syntax and regression simulations
run: |
for script in mountfs.sh scripts/build-app.sh tests/core_tests.sh tests/macos_metadata.sh tests/ntfs_identity_tests.sh tests/media_identity_tests.sh tests/macos_media_identity.sh tests/macos_helper_service.sh tests/mount_state_tests.sh; do bash -n "$script"; done
bash tests/core_tests.sh
bash tests/ntfs_identity_tests.sh
bash tests/media_identity_tests.sh
bash tests/mount_state_tests.sh
cc -Wall -Wextra -Werror -I Sources/MountFSSystemTools/include Sources/MountFSSystemTools/Tools.c tests/tool_runner_tests.c -o /tmp/mountfs-tool-tests
/tmp/mountfs-tool-tests
bash mountfs.sh --help
test "$(bash mountfs.sh --version)" = 0.3.4
- name: ShellCheck
if: runner.os == 'Linux'
run: shellcheck mountfs.sh scripts/build-app.sh tests/core_tests.sh tests/macos_metadata.sh tests/ntfs_identity_tests.sh tests/media_identity_tests.sh tests/macos_media_identity.sh tests/macos_helper_service.sh tests/mount_state_tests.sh
- name: Check actual macOS plist schema and Swift metadata tests
if: runner.os == 'macOS'
run: |
bash tests/macos_metadata.sh
swift test
- name: Build local menu bar app
if: runner.os == 'macOS'
run: |
mkdir -p dist/mouNTFS.app/Contents/Resources
touch dist/mouNTFS.app/Contents/Resources/stale-build-marker
bash scripts/build-app.sh
test ! -e dist/mouNTFS.app/Contents/Resources/stale-build-marker
bash tests/macos_media_identity.sh
bash tests/macos_helper_service.sh
bash tests/macos_sandbox_mapping.sh
bash tests/macos_execution_boundary.sh
VERSION=$(bash mountfs.sh --version)
codesign --verify --deep --strict "dist/mouNTFS.app"
test -f "dist/mouNTFS.app/Contents/Resources/mountfs.sh"
test -s "dist/mouNTFS.app/Contents/Resources/AppIcon.icns"
ARCHIVE="dist/mouNTFS-$VERSION-dev-$(uname -m).zip"
unzip -Z1 "$ARCHIVE" > /tmp/mountfs-archive-entries.txt
grep -E '^mouNTFS\.app/Contents/Info\.plist$' /tmp/mountfs-archive-entries.txt
! grep -E '^mouNTFS-[^/]+\.app/' /tmp/mountfs-archive-entries.txt
echo "MOUNTFS_VERSION=$VERSION" >> "$GITHUB_ENV"
- name: Upload development app
if: runner.os == 'macOS'
uses: actions/upload-artifact@v4
with:
name: mouNTFS-${{ env.MOUNTFS_VERSION }}-development-app
path: dist/mouNTFS-*-dev-*.zip
retention-days: 14
22 changes: 22 additions & 0 deletions .github/workflows/documentation-images.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: Documentation images
on:
workflow_dispatch:
push:
paths:
- scripts/capture-docs.sh
- .github/workflows/documentation-images.yml
- Sources/MountFSApp/**
permissions:
contents: read
jobs:
capture:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Capture native UI with sample volumes
run: bash scripts/capture-docs.sh docs/images
- uses: actions/upload-artifact@v4
with:
name: documentation-ui-screenshots
path: docs/images/*.png
retention-days: 14
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,9 @@ Temporary Items
# iCloud generated files
*.icloud

# End of https://www.toptal.com/developers/gitignore/api/macos
# End of https://www.toptal.com/developers/gitignore/api/macos

# Local Swift builds and development app bundles
.build/
.swiftpm/
dist/
86 changes: 86 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# Contributing

## Local development

App builds require macOS 13+ and Xcode Command Line Tools. From this checkout:

```bash
bash scripts/build-app.sh
open dist/mouNTFS.app
swift test
```

After building the native identity executable, the Bash 3.2-compatible core can also be used from this checkout:

```bash
bash mountfs.sh --list
bash mountfs.sh --diagnose
bash mountfs.sh --device disk4s1
bash mountfs.sh --cli --device disk4s1
```

`disk4s1` is an example; identify the actual partition before acting. Run as the
normal user: CLI mode requests sudo itself. The app/script do not install drivers.
Mounting requires the bundled or checkout-built native identity executable for
protected execution and system-wide locking. The script alone supports read-only
listing/diagnosis, not mounting. Exit codes: 0 success, 1 failure, 2 cancellation/invalid input,
130 interruption.

## Checks and boundaries

```bash
bash -n mountfs.sh
bash tests/core_tests.sh
bash tests/ntfs_identity_tests.sh
bash tests/media_identity_tests.sh
bash tests/mount_state_tests.sh
```

macOS CI adds real metadata parsing, Swift tests, signing pins and disposable root
launchd status checks. The helper test is intentionally restricted to GitHub Actions
runners; do not run it on a daily-use Mac. Automated tests do not establish NTFS
hardware compatibility, SMAppService approval or biometric behavior.
See [VALIDATION.md](docs/VALIDATION.md) for remaining physical tests and
[AUTHORIZATION.md](docs/AUTHORIZATION.md) for signing and privileged boundaries.

## Documentation structure

| Audience | English | Simplified Chinese |
|---|---|---|
| Project overview | README.md | README.zh-CN.md |
| Setup/use/troubleshooting | docs/USAGE.en.md | docs/USAGE.zh-CN.md |

Keep paired documents aligned in section order, functionality, commands, limitations,
image captions and links. Each pair has a language switch at the top. The application
UI is currently English; translated docs do not imply a localized UI.

Development documents are English-only: ROADMAP.md, CONTRIBUTING.md,
docs/AUTHORIZATION.md, docs/VALIDATION.md and docs/PROMOTION.md. The promotion guide
maintains aligned bilingual copy, artwork and brand rules. Explain user-visible behavior in user
docs; put implementation choices, experiments and specific test history in the
appropriate developer document. Planned work belongs in the roadmap.

## Native UI captures

```bash
bash scripts/capture-docs.sh docs/images
```

Requires a macOS GUI session and screen-capture access. The script copies the sources
into a temporary directory and builds the actual app with documentation-only sample
volumes and an example report. It reuses the production menu builder, branded header
and report window. It bypasses disk scanning, helper setup, driver execution and
authorization. No screenshot mode is added to the distributed app.

The **Documentation images** workflow produces the PNGs as an artifact. Review images
before checking them into docs/images. Both language versions use the same screenshots
and disclose sample data. Capture all four states together after relevant UI changes:
read-only, writable, progress and the diagnostic report. Do not present these images
as evidence of a successful real-drive mount or helper setup.

## Safety reviews

Focus on device identity, bounded authorization, exclusive write probes and
same-volume recovery. No forced NTFS recovery or clearing hibernation is supported.
Keep arbitrary shell commands and caller-selected executables out of the privileged
API. Distinguish simulation results from independently confirmed physical behavior.
19 changes: 19 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// swift-tools-version: 5.9
import PackageDescription

let package = Package(
name: "MountFS",
platforms: [.macOS(.v13)],
products: [.executable(name: "MountFS", targets: ["MountFSApp"]),
.executable(name: "MountFSIdentity", targets: ["MountFSIdentity"]),
.executable(name: "MountFSHelper", targets: ["MountFSHelper"])],
targets: [
.target(name: "MountFSCore"),
.target(name: "MountFSSystemTools"),
.target(name: "MountFSPrivileged", dependencies: ["MountFSSystemTools"]),
.executableTarget(name: "MountFSHelper", dependencies: ["MountFSPrivileged"]),
.executableTarget(name: "MountFSIdentity", dependencies: ["MountFSPrivileged", "MountFSSystemTools"], path: "Sources/MountFSIdentity"),
.executableTarget(name: "MountFSApp", dependencies: ["MountFSCore", "MountFSPrivileged"], path: "Sources/MountFSApp"),
.testTarget(name: "MountFSCoreTests", dependencies: ["MountFSCore", "MountFSPrivileged"])
]
)
Loading
Loading