Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
f82406e
refactor: simplify sync and repository validation
oovz Aug 25, 2026
f264cc6
fix(privategit): disable commit and tag signing in private clone Neu…
oovz Aug 26, 2026
0618557
feat(cli): add command timeout support
oovz Aug 26, 2026
f1c7416
fix(doctor): run checks before requiring link state
oovz Aug 26, 2026
d190730
fix(atomicfile): retry Windows file replacement on sharing violations…
oovz Aug 26, 2026
5959651
fix(version): fallback to debug buildinfo when ldflags are omitted
oovz Aug 26, 2026
d39454e
fix(cli): parse --json=false and flag precedence in pre-execution check
oovz Aug 26, 2026
e90e68a
fix(interaction): unblock reader on context cancellation to prevent g…
oovz Aug 26, 2026
ca0a0be
fix(path): reject oversized paths during resolution
oovz Aug 26, 2026
9b4ed19
feat(schema): add schemaVersion to JSON payloads and document schema
oovz Aug 26, 2026
7b17f4e
fix(version): preserve ldflags version over buildinfo fallback Defau…
oovz Aug 28, 2026
74619b0
refactor(cli): simplify command timeout to a single context layer Dr…
oovz Aug 29, 2026
7eac241
refactor: simplify Windows retries and cancellation handling
oovz Aug 29, 2026
33d5c58
fix(githubref): canonicalize owner and repository to lowercase Fold …
oovz Aug 30, 2026
1426429
fix(link): persist public approval and isolate visibility probes
oovz Aug 30, 2026
8d5248b
fix(doctor): report warnings for unlinked workspaces and isolate lock…
oovz Aug 30, 2026
92cccdc
fix(path): restrict MAX_PATH preflight to Windows roots Check worksp…
oovz Aug 30, 2026
10d3263
perf(publicgit): batch exclusion checks into single check-ignore proc…
oovz Aug 30, 2026
8e470bc
fix(filesync): match checkout modes and protect recovery copies
oovz Aug 30, 2026
e922003
fix(cli): stabilize JSON output and error codes
oovz Aug 30, 2026
7bdc265
ci(release): generate build provenance attestations for release artif…
oovz Aug 30, 2026
918fd8d
fix(json): serialize clean sync changes as an array
oovz Aug 30, 2026
2e0ca14
test(git): isolate fixtures from host signing
oovz Aug 30, 2026
7b7bf3a
docs: document JSON, release, and security policies
oovz Aug 30, 2026
46b51fb
docs(link): explain the visibility probe and skip flags
oovz Sep 4, 2026
9fb02ad
refactor(sync): unify public approval persistence
oovz Sep 4, 2026
7de0721
test(json): pin payload variants and doctor exit rules
oovz Sep 4, 2026
52c7750
test(permissions): make config state checks non-vacuous
oovz Sep 4, 2026
70c03ec
ci(release): replace provenance wrapper with actions/attest
oovz Sep 4, 2026
9ba6862
build(go): require Go 1.26.8
oovz Sep 4, 2026
34edb4f
fix(state): enforce the 10,000-path limit before enrollment
oovz Sep 4, 2026
1da9cd7
fix(gitexec): disconnect stdin for non-interactive commands
oovz Sep 4, 2026
3856b04
ci(release): require full CI and CodeQL before building
oovz Sep 4, 2026
043fdbb
test(app): name regressions by behavior
oovz Sep 6, 2026
0fb10c3
fix(add): reject ambiguous Unicode file selections
oovz Sep 6, 2026
61d4000
fix(diff): show additions and report I/O failures
oovz Sep 6, 2026
7a6d9b6
fix(git): preserve exact repository paths and branch names
oovz Sep 7, 2026
5152f8d
fix(merge): reject conflicting and inherited merge options
oovz Sep 7, 2026
4bf56fb
fix(cli): resolve Git paths from the invocation directory
oovz Sep 7, 2026
a0069a5
docs: clarify merge protection and ignore precedence
oovz Sep 7, 2026
3dcd337
fix(privategit): preserve literal branch names
oovz Sep 9, 2026
58f93b8
fix(cli): classify conflicting flags as invalid usage
oovz Sep 9, 2026
62653c7
test(app): fix symlink assertions and linked-state fixtures
oovz Sep 10, 2026
c5204e6
fix(paths): resolve selections through workspace aliases
oovz Sep 10, 2026
afafd14
fix(paths): preserve directory-entry spelling during enrollment
oovz Sep 11, 2026
0824a8a
perf(tests): remove Git proxy race exit delays
oovz Sep 11, 2026
846a83a
ci: disable native test-result caching and retain timing logs
oovz Sep 11, 2026
0fed221
fix(doctor): report repository inspection failures
oovz Sep 12, 2026
23dc210
fix(diff): preserve observed path identity
oovz Sep 12, 2026
c629af9
fix(paths): describe Windows preflight byte limit
oovz Sep 12, 2026
2a263a8
docs(diff): document path aliases and output limits
oovz Sep 12, 2026
14be7bb
test(diff): stage case-only renames with git mv
oovz Sep 12, 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
36 changes: 33 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ on:
push:
branches:
- main
tags:
- "v*"
pull_request:
workflow_call:
workflow_dispatch:

permissions:
Expand Down Expand Up @@ -115,7 +114,38 @@ jobs:
cache: true
cache-dependency-path: go.sum
- name: Test
run: go test -timeout 30m ./...
shell: pwsh
run: |
$PSNativeCommandUseErrorActionPreference = $false
$logs = Join-Path $env:RUNNER_TEMP 'spas-native-tests'
New-Item -ItemType Directory -Path $logs -Force | Out-Null
$timing = [ordered]@{
commit = $env:GITHUB_SHA
startUtc = [DateTimeOffset]::UtcNow.ToString('o')
endUtc = $null
exitCode = $null
}
$timing | ConvertTo-Json -Depth 3 | Set-Content -LiteralPath (Join-Path $logs 'command.json')
$testExit = 1
try {
go test -count=1 -json -timeout 30m ./... 2> (Join-Path $logs 'stderr.log') |
Tee-Object -FilePath (Join-Path $logs 'tests.jsonl')
$testExit = $LASTEXITCODE
}
finally {
$timing.endUtc = [DateTimeOffset]::UtcNow.ToString('o')
$timing.exitCode = $testExit
$timing | ConvertTo-Json -Depth 3 | Set-Content -LiteralPath (Join-Path $logs 'command.json')
}
exit $testExit
- name: Upload native test timing
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: native-test-timing-${{ matrix.name }}-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/spas-native-tests/
if-no-files-found: warn
retention-days: 14
- name: Vet
run: go vet ./...

Expand Down
1 change: 1 addition & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
- main
schedule:
- cron: "17 4 * * 3"
workflow_call:
workflow_dispatch:

permissions:
Expand Down
26 changes: 22 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,30 @@ concurrency:
cancel-in-progress: false

jobs:
verify:
name: Verify release source
permissions:
contents: read
uses: ./.github/workflows/ci.yml

codeql:
name: Analyze release source
permissions:
contents: read
security-events: write
uses: ./.github/workflows/codeql.yml

release:
name: Build draft release
needs:
- verify
- codeql
runs-on: ubuntu-24.04
timeout-minutes: 30
permissions:
contents: write
id-token: write
attestations: write
steps:
- name: Validate semantic version tag
shell: bash
Expand All @@ -38,10 +56,6 @@ jobs:
go-version-file: go.mod
cache: true
cache-dependency-path: go.sum
- name: Verify modules
run: go mod verify
- name: Test tagged source
run: go test ./...
- name: Build draft release
uses: goreleaser/goreleaser-action@f06c13b6b1a9625abc9e6e439d9c05a8f2190e94 # v7.2.3
with:
Expand All @@ -50,3 +64,7 @@ jobs:
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Attest build provenance
uses: actions/attest@1e69f48acb82d1966a394da916b4c1698aa569d6 # v4.2.2
with:
subject-checksums: dist/checksums.txt
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ SPAS (pronounced **"/spæz/"**) seamlessly connects your local workspace to a se

---

Every project relies on files that don't belong in the public or shared Git repository: local `.env` secrets, developer overrides, test fixtures, API mocks, and internal team notes.
Every project relies on files that don't belong in the public or shared Git repository: local `.env` files, developer overrides, test fixtures, API mocks, and internal team notes.

Moving these files elsewhere breaks build paths. Copying them manually across machines is slow and error-prone. Committing them risks secret leaks and repo bloat.
Moving these files elsewhere breaks build paths. Copying them manually across machines is slow and error-prone. Committing them exposes them to every collaborator and bloats history.

**SPAS solves this by bridging the gap:**

Expand Down Expand Up @@ -114,7 +114,7 @@ spas sync

### 3. Workflow Summary

1. **`spas link`** — Connects your project workspace to the dedicated asset repository (offline).
1. **`spas link`** — Connects your project workspace to the dedicated asset repository and warns when that repository is publicly readable.
2. **`spas add`** — Tracks chosen files and creates local exclusion rules in `.git/info/exclude` (offline).
3. **`spas sync`** — Validates, commits, merges, and synchronizes assets with GitHub.

Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/getspas/spas

go 1.26.5
go 1.26.8

require (
github.com/spf13/cobra v1.10.2
Expand Down
Loading
Loading