Skip to content
edgesync Timeline
Login

Timeline

41 ancestors of 67ea6825871cc0fb

2026-05-04
18:34
feat(hub): new package for hub-fossil management and HTTP serving (#109)

Adds a top-level hub/ package that hosts an EdgeSync hub in-process: fossil hub repo bootstrap, embedded NATS server with JetStream, auto-port allocation, libfossil HTTP server (timeline UI + xfer endpoint), user management, and hub-side commits/reads. All libfossil and nats-server types are wrapped internally — the public surface exposes only stdlib types and types defined here.

Public API: - Config + NewHub + ServeHTTP + Stop - NATSURL / LeafUpstream / HTTPAddr accessors - AddUser / GetUser / HasUser / ListUsers / RemoveUser (User type) - Commit / Read / ReadAt (RevID, FileToCommit, CommitOpts types)

Auto port allocation: passing 0 for FossilHTTPPort, NATSClientPort, or NATSLeafPort yields three distinct bound ports. The HTTP listener is bound during NewHub so HTTPAddr() is immediately usable, even before ServeHTTP is called.

SQLite tuning (SetMaxOpenConns(1) + busy_timeout=30s) applied at hub bootstrap, matching the leaf agent's tuning.

Lives inside the EdgeSync root module (not a separate go.mod) so it ships in lockstep with the leaf agent. Can be promoted to its own module later if downstream consumers need to depend on it independently.

Closes #102 check-in: 67ea682587 user: [email protected] tags: trunk

18:29
feat(leaf/agent): libfossil-hidden code-artifact API (#108)

Adds Commit, Sync, SyncTo, Read, Files, Diff, Tip, ExtractTo, Config methods on *Agent that take/return only primitives or types defined in this package. No *libfossil.* in any new signature, so consumers can perform the bones-style code-artifact operations without importing libfossil.

New types: RevID (opaque commit handle), FileToCommit, CommitOpts, SyncOpts, SyncResult — all libfossil-free.

Internal SQLite tuning (SetMaxOpenConns(1) + busy_timeout=30s) is now applied on every agent boot. libfossil PRAGMAs are per-connection so the single-conn cap is what makes them stick — concurrent-write safety that any production agent needs.

Repo() and NotifyRepo() stay as escape hatches for sim/test and advanced consumers; doc comments updated to recommend the new methods.

Closes #103 check-in: 3309ec60d5 user: [email protected] tags: trunk

16:50
chore(agents): scaffold ## Agent skills section + docs/agents/ (#107)

Adds the per-repo configuration that the engineering skills (triage, to-issues, to-prd, diagnose, tdd, improve-codebase-architecture) assume:

- Issue tracker mapping → docs/agents/issue-tracker.md (GitHub via gh CLI) - Triage label vocabulary → docs/agents/triage-labels.md (canonical names; needs-triage, needs-info, ready-for-agent, ready-for-human, wontfix) - Domain doc layout → docs/agents/domain.md (single-context; ADRs live in docs/architecture/, no CONTEXT.md so skills fall back to CLAUDE.md + MEMORY.md)

CLAUDE.md gets an ## Agent skills block pointing at the three docs.

The four missing triage labels (needs-triage, needs-info, ready-for-agent, ready-for-human) were created on the GitHub repo at the same time. check-in: f894e896c1 user: [email protected] tags: trunk

16:44
fix(leaf/notify): lock s.subs append/clear in Subscriber (#106)

Concurrent Subscribe/SubscribeThread callers raced on the unsynchronized append in subscribeReturn (and the iterate/clear in Unsubscribe), which the race detector flagged in downstream bones tests under -race -short.

Subscriber already had s.mu for dedup state — extending it to cover the subs slice is the cleanest fix. Unsubscribe snapshots the slice under the lock and iterates outside it so we never hold s.mu across NATS calls (the dispatch callback path takes s.mu via isDuplicate).

Adds a concurrent-Subscribe stress test that fires the race reliably under -race without the fix.

Closes #95 check-in: 0577a01d66 user: [email protected] tags: trunk

2026-05-01
22:47
fix(leaf/notify): mutex-gate Watch teardown to prevent send-on-closed-channel panic (#101) check-in: 1fe42a59e7 user: [email protected] tags: trunk, leaf/v0.0.6
22:20
fix(leaf): classify ErrNoResponders and ctx.Canceled as benign sync errors (#99) check-in: 8ca34471cd user: [email protected] tags: trunk, leaf/v0.0.5
21:57
fix(leaf): demote per-target sync errors when another target succeeded (#97) check-in: 5bbb70b342 user: [email protected] tags: trunk, leaf/v0.0.4
00:01
build(release): publish standalone leaf brew formula (#94)

Add a second goreleaser build target for the leaf daemon (built from the EdgeSync/leaf submodule via dir: leaf) and a separate Homebrew formula at danmestas/tap/leaf so downstream tools (notably bones, which spawns leaf via exec) can declare it as a brew dependency instead of requiring users to clone EdgeSync and run make leaf.

Existing edgesync formula is now scoped via ids: [edgesync] so it doesn't pick up the new leaf binary. check-in: b601f8a1af user: [email protected] tags: trunk, v0.0.8

2026-04-30
16:01
chore: bump libfossil → v0.4.6-rc3 (#92)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> check-in: f26dbee41f user: [email protected] tags: trunk

16:00
Merge pull request #93 from danmestas/fix/goreleaser-skip-prerelease-brews

fix(release): skip Homebrew formula update on prereleases check-in: 929d7783dc user: [email protected] tags: trunk

15:55
fix(release): skip Homebrew formula update on prereleases

Adds skip_upload: auto to the brews block. With release.prerelease: auto, GoReleaser correctly marks rc/beta/alpha tags as GitHub prereleases — but without skip_upload: auto, the Homebrew formula was still being updated for those prereleases. Effect: brew upgrade edgesync would pull the rc binary as a stable update.

skip_upload: auto skips brew formula updates whenever the release is marked as prerelease. Stable releases (vX.Y.Z without suffix) still update the formula. check-in: 233d9d94d5 user: [email protected] tags: trunk

14:31
Merge pull request #90 from danmestas/feat/upstream-bump-and-dispatch

feat(ci): receive libfossil dispatches, dispatch to bones, group changelog check-in: 4f299fe932 user: [email protected] tags: trunk

14:23
feat(release): add changelog groups (Features/Bug fixes/Other)

Replaces flat commit list with conventional-commit-grouped sections in the auto-generated GitHub release notes. Existing exclude patterns preserved. check-in: e557d54f0d user: [email protected] tags: trunk

14:22
feat(ci): dispatch upstream-bump to bones on tag

After goreleaser publishes a release, fires repository_dispatch to danmestas/bones so it can open a chore-bump PR. Uses DISPATCH_PAT (fine-grained, scoped to bones contents:write).

This closes the edgesync→bones link of the cascade. Combined with PR #6 (libfossil's release.yml), pushing a libfossil tag will fire the full chain: libfossil tag → EdgeSync bump PR → merge+tag → bones bump PR. check-in: e831226826 user: [email protected] tags: trunk

14:21
feat(ci): add bump-upstream receiver workflow

Listens for repository_dispatch event_type=upstream-bump from libfossil's release workflow. Validates payload (repo/module_path/version regex), checks for existing open PR (idempotency), retries go get up to 3 times to absorb GOPROXY propagation lag, opens a chore PR via github-actions[bot].

Falls back to workflow_dispatch with the same inputs for manual recovery.

EXPECTED_REPO=libfossil; EXPECTED_MODULE=github.com/danmestas/libfossil. Other dispatch sources are silently ignored. Mirrors the production-tested shape from bones #90. check-in: 0e93a687f0 user: [email protected] tags: trunk

13:22
Merge pull request #89 from danmestas/chore/local-dev-hygiene

chore: add local dev hygiene targets and pre-push hook check-in: 5ea1ad56be user: [email protected] tags: trunk

13:15
fix(make): ci-fast also tests leaf and bridge sub-modules

leaf/ and bridge/ are separate Go modules (each has go.mod), so 'go test ./...' from repo root does not descend into them. Without this fix, both pre-commit and pre-push hooks would pass even when leaf or bridge is broken — exactly the class of bug the old pre-commit was trying to catch.

Reuse ci-vet (which already runs vet across all three modules) as a dependency, then run -short tests in root, leaf, and bridge sequentially. Sub-module tests run in ~2s each on a dev box; total ci-fast runtime approximately doubles to ~12s (still well under the 60s pre-push budget). check-in: 3f4035e5e2 user: [email protected] tags: trunk

13:09
fix(hooks): replace broken pre-commit with make ci-fast

The previous pre-commit ran 'go test ./leaf/agent/' from repo root, which fails because leaf is a separate Go module. The hook had been masked by a global core.hooksPath override; activating local .githooks/ via 'make setup-hooks' (added in this PR) exposed the breakage.

Replace with the same pattern as pre-push: 'make ci-fast' (~6s in this repo). Skip with: git commit --no-verify. check-in: 9197f23350 user: [email protected] tags: trunk

13:03
feat: add release annotation template

Used by 'make release VERSION=...' as the body skeleton for annotated tags. check-in: 8a43ebc3f7 user: [email protected] tags: trunk

13:03
feat: add pre-push hook running make ci-fast

Catches obvious breakage before push. ~60s. Skip with: git push --no-verify check-in: 1c034a7e90 user: [email protected] tags: trunk

13:01
feat(make): add release VERSION=... helper

Validates clean tree, runs make ci, opens $EDITOR with auto-populated tag annotation template, creates annotated tag locally. Push is intentionally manual. check-in: 3295f73d5d user: [email protected] tags: trunk

13:01
feat(make): add ci and ci-fast targets

ci mirrors .github/workflows/ci.yml verbatim: ci-vet — vet root + leaf + bridge ci-leaf-bridge — leaf and bridge short tests (sequential; CI runs parallel) ci-cmd — cmd/edgesync build + test

ci-fast runs vet + build + short tests (~60s) for pre-push hook.

Note: test.yml's sim/interop tests are slower and need fossil; not mirrored here. Run them on demand for releases. check-in: 13ba906678 user: [email protected] tags: trunk

10:40
Merge pull request #88 from danmestas/docs/changelog-v0.0.7

docs: changelog entry for v0.0.7 + skip CI on docs-only changes check-in: 31f055cc4c user: [email protected] tags: trunk

10:36
ci: skip docs-only changes (paths-ignore) check-in: 60ccb8082f user: [email protected] tags: trunk
10:34
docs: changelog entry for v0.0.7 check-in: 9831416916 user: [email protected] tags: trunk
10:31
Merge pull request #87 from danmestas/chore/bump-libfossil-v0.4.5

chore: bump libfossil v0.4.3 → v0.4.5 check-in: c77ecea4f7 user: [email protected] tags: trunk, v0.0.7

10:27
chore: bump libfossil v0.4.3 → v0.4.5

Pulls in fixes from two libfossil releases:

- v0.4.4 (libfossil#14): hub xfer handler no longer panics with "content.MakePublic: rid must be positive" when a client cancels mid-transfer. Affects EdgeSync hubs that serve concurrent clones.

- v0.4.5 (libfossil#17, libfossil#18): sync.Clone now converges against a hub being written to during the clone session. Three compounding root causes fixed: server-side rid cap (snapshot via CookieCard), client-side CloneSeqNoCard cursor emission, and cookie roundtrip. Wire-format compatible with older peers.

No EdgeSync source changes required — both fixes are libfossil-internal.

Closes #86. leaf check-in: 6c16b3e646 user: [email protected] tags: trunk, chore/bump-libfossil-v0.4.5

2026-04-28
00:44
Merge pull request #85 from danmestas/polish/libfossil-level

polish: CHANGELOG + CONTRIBUTING (libfossil-level hygiene) check-in: c345d7737b user: [email protected] tags: trunk

00:40
polish: add CHANGELOG + CONTRIBUTING (libfossil-level hygiene)

Matches the bones polish template. CHANGELOG covers root-module versions (v0.0.1 initial through v0.0.6 latest) and notes the multi-module tagging scheme (leaf/, bridge/ submodules carry their own tags). CONTRIBUTING covers the make setup bootstrap, test/sim commands, the four-binary build (edgesync + leaf + bridge + iroh-sidecar), wasm targets, and submodule coordination guidance for releases. check-in: d9574335d0 user: [email protected] tags: trunk

00:02
Merge pull request #84 from danmestas/release-tooling

release: GoReleaser config + tag-push workflow + edgesync --version check-in: 30cd2bb5fe user: [email protected] tags: trunk, v0.0.6

00:00
release: GoReleaser config + tag-push workflow + edgesync --version

Cross-compile edgesync for darwin/linux × amd64/arm64, archive as tarballs, generate checksums, publish a GitHub release, and update the Homebrew formula at danmestas/homebrew-tap on every git tag matching v*.

Mirrors the bones release pipeline (PRs danmestas/bones#25, #26).

Files: - .goreleaser.yml — build matrix, archive shape, brews stanza pointing at danmestas/homebrew-tap, ldflags for version injection. - .github/workflows/release.yml — runs on tag push, sets up Go 1.26.0, calls goreleaser-action@v6 with `release --clean`. Needs HOMEBREW_PAT_TOKEN secret on this repo (PAT with contents:write on danmestas/homebrew-tap). - cmd/edgesync/main.go — version/commit/date package vars filled by ldflags. `edgesync --version` and `-V` short-circuit before Kong (avoids collision with `repo extract --version` sub-flag).

After merge: 1. Add HOMEBREW_PAT_TOKEN secret to this repo. 2. Tag v0.0.6 and push — release workflow takes it from there. 3. Verify: brew install danmestas/tap/edgesync. check-in: 176fae9490 user: [email protected] tags: trunk

2026-04-27
20:39
Merge pull request #83 from danmestas/readme-dx-improvements

README: front-load value prop, add prereqs, badges, deep-dive links check-in: 8cbcae9e10 user: [email protected] tags: trunk

20:32
README: front-load value prop, add prereqs, badges, status, deep-dive links

DX-audit pass for public-repo readiness:

1. New tagline + Why EdgeSync section that explains the use case in terms a non-Fossil-aware reader can evaluate (real-time over messaging, no central server, Fossil-compatible wire). 2. Status section sets pre-1.0 expectations honestly. 3. Prerequisites section before Quick Start: Go 1.26+, NATS server, optional Fossil binary, optional direnv. 4. Quick Start now creates a demo repo, starts NATS, and shows a stock fossil clone hitting the leaf — the cold-start path actually works end-to-end. 5. New "Use as a Go library" section with go get for each module and a pkg.go.dev link. 6. New "Deep Dive" section linking docs/architecture/* by topic (was filesystem-grep-only before). 7. Badges: CI status, Go reference, license, Go report card. 8. License section references the Apache-2.0 file added in PR #82.

Project Layout updated: cli/ added, libfossil moved to its own repo note, hugo site path corrected. check-in: f7d05cf9ac user: [email protected] tags: trunk

20:15
Merge pull request #82 from danmestas/pre-public-cleanup

pre-public: LICENSE, IP placeholders, module READMEs, WASM build fix check-in: 83d2a03038 user: [email protected] tags: trunk

19:51
pre-public: LICENSE, untrack .mcp.json, placeholder IPs, module READMEs, fix wasm targets check-in: 28f11dc3c4 user: [email protected] tags: trunk
17:37
Merge pull request #81 from danmestas/fix-root-module-deps

go.mod: pin sub-module deps to real tags so EdgeSync/cli is consumable check-in: 0d8829ccf1 user: [email protected] tags: trunk, v0.0.5

17:29
go.mod: pin sub-module dependencies to real tags

Replace v0.0.0-00010101 placeholders with leaf v0.0.3 and bridge v0.0.2 in the root and bridge go.mod files. Local replace directives stay so intra-repo development against unreleased changes still works; the real version pins make EdgeSync/cli consumable by external repos via `go get`.

Without this, `go get github.com/danmestas/EdgeSync/cli` fails with "unknown revision 000000000000" when the consumer tries to resolve EdgeSync/bridge. check-in: e6c688849f user: [email protected] tags: trunk

16:57
Merge pull request #80 from danmestas/extract-cli-package

cli: extract command tree into reusable package check-in: 18a10cd49e user: [email protected] tags: trunk, v0.0.4

16:36
cli: extract command tree into reusable package

Move sync, bridge, notify, and doctor commands from cmd/edgesync/ into a new top-level cli/ package. The integration struct in cmd/edgesync/cli.go now imports from EdgeSync/cli (aliased as edgecli) and assembles the binary's command surface.

This mirrors libfossil/cli's pattern — the cli/ package exports embeddable Kong command structs that downstream consumers (e.g. agent-infra) can integrate alongside libfossil/cli.RepoCmd into their own unified CLI.

No behavior change: cmd/edgesync still builds the same binary with the same flags, and the existing notify_test.go end-to-end suite passes unchanged. check-in: 845d1d229e user: [email protected] tags: trunk

2026-04-26
15:37
Merge pull request #79 from danmestas/bump-libfossil-v0.4.3

deps: bump libfossil v0.1.0 → v0.4.3 across all modules check-in: efeaf4c90f user: [email protected] tags: trunk, v0.0.3, leaf/v0.0.3, bridge/v0.0.2

15:29
deps: bump libfossil v0.1.0 → v0.4.3 across all modules

Picks up four releases worth of upstream fixes and surface additions:

- v0.4.0 → v0.4.3: xfer protocol fix (always emit project-code on push/pull cards, libfossil#12), diff byte-fidelity ("\\ No newline at end of file", libfossil#10), repo.ResolveVersion + ReadFileAt for symbolic version lookups (libfossil#11). - v0.2.0 / v0.3.0: prior 5xx error mapping, transport rewrites, repo admin surface, content cache, observer rework — all consumed transitively without code changes here.

`go build ./...` clean. `make test` green across leaf/, bridge/, sim/, notify, telemetry. No code changes needed in EdgeSync — the libfossil public API stayed stable across these releases.

This bump is needed by the sibling agent-infra repo, which already pins libfossil v0.4.2 directly for chat/workspace and was relying on the local `replace ../EdgeSync/leaf` directive to mask the version drift. With this bump and a follow-up tag (leaf/v0.0.3), agent-infra can drop the replace and pin clean module versions. check-in: 7db3317617 user: [email protected] tags: trunk

15:20
Merge pull request #78 from danmestas/add-docs-site

docs: Hugo+hextra docs site with Cloudflare Workers deploy check-in: d59e2dece9 user: [email protected] tags: trunk, v0.0.2