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
8867f2d
build: consume snapshot-aware crawlkit
vincentkoc Jul 12, 2026
fefc508
feat(cloud): publish content-addressed snapshots
vincentkoc Jul 12, 2026
4b00623
test(cloud): cover snapshot publication and privacy
vincentkoc Jul 12, 2026
d36f374
docs(cloud): explain atomic snapshot publishing
vincentkoc Jul 12, 2026
c255363
build: track reviewed crawlkit snapshot API
vincentkoc Jul 12, 2026
8301159
fix(cloud): publish scoped snapshot bundles
vincentkoc Jul 12, 2026
7f461a3
build: pin landed crawlkit snapshot API
vincentkoc Jul 12, 2026
d67ca5e
fix(cloud): require current PR file hydration
vincentkoc Jul 12, 2026
27e6b4f
fix(cloud): negotiate safe snapshot publication
vincentkoc Jul 12, 2026
8f7bb31
docs(cloud): document explicit snapshot cutover
vincentkoc Jul 12, 2026
347fac0
fix(cloud): prove legacy PR file hydration
vincentkoc Jul 12, 2026
d1d6bc6
fix(cloud): validate the full publish profile
vincentkoc Jul 12, 2026
918c0bc
chore(changelog): preserve release-owned heading
vincentkoc Jul 12, 2026
e67bc9c
fix(cloud): preserve default reader cutover
vincentkoc Jul 12, 2026
a4b3fb4
fix(cloud): resume staged capability snapshots
vincentkoc Jul 12, 2026
a94c58c
build: pin crawlkit v0.14.0
vincentkoc Jul 12, 2026
efe1364
fix(cloud): require reader contract before publish
vincentkoc Jul 12, 2026
1febffe
fix(cloud): align reader query contract
vincentkoc Jul 12, 2026
701fb8f
fix(cloud): resume staged publisher snapshots
vincentkoc Jul 12, 2026
df857aa
fix(cloud): harden staged snapshot resume
vincentkoc Jul 12, 2026
4b1dfab
fix(store): require persisted PR file coverage
vincentkoc Jul 12, 2026
1a37504
docs(cloud): define snapshot retention boundary
vincentkoc Jul 12, 2026
af5ae32
fix(cloud): require complete staged coverage
vincentkoc Jul 12, 2026
4cd93f7
fix(cloud): resume staged publish across processes
vincentkoc Jul 12, 2026
577c349
fix(cloud): compare snapshot times chronologically
vincentkoc Jul 12, 2026
2736106
fix(cloud): allow additive remote query args
vincentkoc Jul 12, 2026
e063d6e
fix(cloud): verify bound snapshot hydration
vincentkoc Jul 12, 2026
2fd1ac8
docs(cloud): require readable snapshot cutover
vincentkoc Jul 12, 2026
00e8738
fix(cloud): align bound hydration contract
vincentkoc Jul 12, 2026
3f0f796
fix(cloud): harden snapshot publication integrity
vincentkoc Jul 12, 2026
5db7271
test(cloud): cover publication integrity guards
vincentkoc Jul 12, 2026
90bb683
docs(cloud): document dual-role publish preflight
vincentkoc Jul 12, 2026
e927c0c
fix(cloud): support portable snapshot preflight
vincentkoc Jul 12, 2026
4904b20
fix(cloud): stream staged snapshot publication
vincentkoc Jul 12, 2026
58caeb8
fix(cloud): require isolated snapshot staging
vincentkoc Jul 12, 2026
b1828a8
test(cloud): cover sparse revision observations
vincentkoc Jul 12, 2026
e0621cb
fix(cloud): count snapshot datasets directly
vincentkoc Jul 12, 2026
6a831eb
test(cloud): preflight portable snapshots end to end
vincentkoc Jul 12, 2026
450b210
fix(cloud): accept admin publish credentials
vincentkoc Jul 12, 2026
0505bb1
fix(cloud): verify publication acknowledgements
vincentkoc Jul 12, 2026
50bc3a4
fix(cloud): preflight export query schemas
vincentkoc Jul 12, 2026
15ab8ad
fix(store): trust current PR file reservations
vincentkoc Jul 12, 2026
b6b1e75
fix(cloud): verify chunked SQLite hydration
vincentkoc Jul 12, 2026
737a5b7
fix(store): require persisted PR file freshness
vincentkoc Jul 12, 2026
38d0545
fix(cloud): require staged snapshot manifests
vincentkoc Jul 12, 2026
86fb98b
fix(cloud): scope publisher status to snapshots
vincentkoc Jul 12, 2026
22a1401
fix(cloud): resume incomplete snapshot ingest
vincentkoc Jul 12, 2026
7003e67
fix(cloud): accept concurrent snapshot completion
vincentkoc Jul 12, 2026
1d2fcfb
fix(cloud): adopt concurrent snapshot generation
vincentkoc Jul 12, 2026
65210f5
fix(cloud): harden snapshot publication exactness
vincentkoc Jul 12, 2026
57c5842
fix(cloud): attest snapshot cutover status
vincentkoc Jul 12, 2026
0ac0a17
fix(cloud): bind bundle digest to snapshot
vincentkoc Jul 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
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## 0.7.2 - Unreleased

- Require every Gitcrawl cloud publisher manifest to opt into snapshot staging so `--stage-only` and normal publish-then-cutover runs cannot activate serving state through the legacy compatibility path.
- Update CrawlKit to v0.14.2 and bind publisher resume plus post-cutover verification to the exact snapshot ID, so a newer concurrently staged candidate cannot be mistaken for the snapshot this publisher owns.
- Fail cloud publication before any remote mutation when local enrichment coverage is incomplete unless operators explicitly pass `--allow-incomplete`.

## 0.7.1 - 2026-07-09

- Add local, fail-closed packaging and independent verification for official macOS archives signed as `org.openclaw.gitcrawl` by `Developer ID Application: OpenClaw Foundation (FWJYW4S8P8)`, while keeping CI and cross-platform snapshots credential-free and non-publishing.
Expand Down
29 changes: 28 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,34 @@ gitcrawl tui owner/repo
The remote service is deployed separately from gitcrawl in `openclaw/crawl-remote` with Wrangler. gitcrawl only stores the Worker endpoint/archive in config and calls that service.
`gitcrawl remote login` starts the Worker GitHub OAuth flow, verifies org/team membership server-side, and stores the signed bearer token in the OS keyring.
Use `gitcrawl remote login --github-token-env GITHUB_TOKEN` for non-browser bootstrap; the Worker verifies that GitHub token against the same org/team policy and stores only the returned remote session token locally.
`gitcrawl cloud publish` sends the local SQLite repositories and thread rows to a Worker archive through the role-gated ingest endpoint.
`gitcrawl cloud publish` freezes and sanitizes one local SQLite image, uses its
SHA-256 as the snapshot identity, exports repositories, threads, revisions,
fingerprints, summaries, durable clusters, and PR detail/file rows from that
same image, negotiates the remote snapshot-provenance contract before touching
R2, uploads its digest-scoped bundle, and completes staged D1 coverage through
row- and encoded-byte-bounded ingest requests.
Publishing moves unpinned reads to the complete snapshot by default, preserving
the existing reader-refresh behavior. The remote must advertise
`gitcrawl.snapshot.staging.v1`; `--stage-only` keeps the immutable snapshot
staged without changing serving state. A later publish verifies the
candidate through the publisher-only status projection, skips repeated ingest
when its digest, source sync, schema, resolved publication profile, persisted
generation timestamp, and coverage match, then cuts it over. Cutover requires
the remote contract to advertise reader-authenticated `GET /sqlite`; Gitcrawl
validates the cutover acknowledgement, retries the scoped reader projection
until its digest, profile, generation, and dataset coverage are exact, rechecks
the exact publisher metadata, and hashes the downloaded bound SQLite image
before reporting success. Before any upload or ingest, Gitcrawl verifies
the configured credential through the advertised `/v1/whoami` route and
requires both publisher and reader roles, including for stage-only publication.
Incomplete local enrichment fails before any remote mutation;
`--allow-incomplete` is an explicit escape hatch, and `--observation-order`
publishes durable fetch ordering after the remote operator fence is enabled.
Digest-scoped SQLite bundles can contain private issue and pull-request text.
Gitcrawl intentionally exposes no remote deletion command: operators must only
enable publication against a remote deployment with bounded lifecycle rules for
failed, superseded, and uncut staged bundles. `--stage-only` does not transfer
that retention responsibility back to the client.
`gitcrawl clusters-report` writes a Markdown report for the top clusters using the same display view, with an at-a-glance table, per-cluster metadata, member tables, and key snippets. Use `--json` for the hydrated report payload.
`gitcrawl cluster` and `gitcrawl refresh` build ghcrawl-shaped durable clusters by default (`--threshold 0.80`, `--min-size 1`, `--max-cluster-size 40`, `--k 16`, `--cross-kind-threshold 0.93`): every active vector-backed thread is represented, singleton rows use `singleton_orphan`, multi-member rows use `duplicate_candidate`, and stable IDs are derived from the representative thread. They also add deterministic GitHub reference evidence for direct issue/PR links such as `#123`, `issues/123`, and `pull/123`. Weak embedding edges need concrete title-token overlap unless their similarity is already high, which keeps generic low-confidence bridges from forming unrelated clusters.
`gitcrawl tui` infers the most recently updated local repository when `owner/repo` is omitted. `serve` is intentionally not part of `gitcrawl`.
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ require (
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834
github.com/charmbracelet/x/ansi v0.11.7
github.com/mattn/go-isatty v0.0.22
github.com/openclaw/crawlkit v0.13.4
github.com/openclaw/crawlkit v0.14.2
github.com/zalando/go-keyring v0.2.8
golang.org/x/sys v0.46.0
modernc.org/sqlite v1.53.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w=
github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/openclaw/crawlkit v0.13.4 h1:6KZaIzs5BQxBjCeOwg1u2XPLNbsOkrRPQGPtTkxZaYE=
github.com/openclaw/crawlkit v0.13.4/go.mod h1:u5oK8v0gtLzIXtj6gehF0JV2cGX1D/xiogZGCJwONGs=
github.com/openclaw/crawlkit v0.14.2 h1:NA0+fDlyYnQjrI6krkhajHDKMTOt9q8JTlMFsGH37pg=
github.com/openclaw/crawlkit v0.14.2/go.mod h1:u5oK8v0gtLzIXtj6gehF0JV2cGX1D/xiogZGCJwONGs=
github.com/pelletier/go-toml/v2 v2.4.3 h1:GTRvJQutkOSftxIFD5xw9aepkYNuPWmVJpffdDPYVpY=
github.com/pelletier/go-toml/v2 v2.4.3/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -4770,7 +4770,7 @@ Usage:
"cloud": `gitcrawl cloud manages Worker-backed remote archives.

Usage:
gitcrawl cloud publish --remote URL --archive id [--json]
gitcrawl cloud publish --remote URL --archive id [--allow-incomplete] [--observation-order] [--stage-only] [--json]
`,
"whoami": `gitcrawl whoami prints the configured remote archive identity.

Expand Down
Loading