alpha
Login
or
Join now
zicklag.dev
/
mlf
Star
1
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
A human-friendly DSL for ATProto Lexicons
Star
1
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
Overview
Issues
Pulls
1
Pipelines
mlf
/
mlf-cli
/
src
/
at
feat/wildcard
1 folder
15 files
stavola.xyz
Split manifest into its own collection with TID rkeys
3mo ago
de4c5373
generate
Extract mlf-atproto plumbing crate Split protocol-level primitives (DID/NSID/DNS identity resolution, generic XRPC HTTP client, session management, record CRUD wrappers, client-side DAG-CBOR CID computation) out of mlf-lexicon-fetcher into a new mlf-atproto crate. The fetcher is refactored to consume it; its public API is preserved. This is the plumbing foundation for mlf-publish, mlf-plugin-host, and the DNS provider plugin binaries.
3 months ago
check.rs
Split manifest into its own collection with TID rkeys Each publish event now writes a fresh `lol.mlf.package/<tid>` record instead of clobbering a single `com.atproto.lexicon.schema/lol.mlf.package`. The schema definition and the manifest instance are different things in different collections, so they stop colliding when an mlf project dogfoods `lol.mlf.package` as a user lexicon. - mlf-atproto: new tid module (sortable base32 TID generator, CAS loop for monotonicity) - mlf-publish/manifest: drop the schema envelope; instance carries `$type = "lol.mlf.package"` and only instance fields - mlf-cli/publish: write manifest to `lol.mlf.package/<tid>` - mlf-cli/unpublish: list the manifest collection, pick the newest by TID, delete everything it lists + the full publish log
3 months ago
config.rs
Add workspace support ([workspace] mlf.toml) A workspace root is an mlf.toml with a [workspace] section and no [package] — members = ["app", "shared"] lists per-member subdirectories, each with its own [package]. Settings declared under [workspace.publish] and [workspace.dependencies] cascade into any member that doesn't override them (section-level replacement, not field-level merging). ProjectKind::load distinguishes the two shapes and returns either a single ResolvedPackage or the full member list. mlf publish dispatches based on that: single package → existing flow; workspace → publishes every member in declaration order. --package <name> filters to one member by its [package].name. Each member runs through the full validator + DNS reconcile + apply + manifest pipeline independently — every member produces its own lol.mlf.package record. RemoteState::load_at lets the orchestrator target a specific package root without relying on CWD, so running from the workspace root publishes every member cleanly.
3 months ago
credentials.rs
Add mlf login / mlf logout commands + credentials file Plaintext TOML credential storage at ~/.config/mlf/credentials.toml (global) and <workspace>/.mlf/credentials.toml (project-local, opt-in via --project, meant for CI). Files are written mode 0600 on Unix. One [pds] section carrying handle + app_password + did/pds cache; one [dns.<plugin>] section per configured DNS provider whose fields come from the plugin's options_schema and are preserved on round-trip. mlf login [pds|dns <plugin>] validates credentials before writing — PDS login runs handle→DID→PDS resolution via mlf-atproto::identity (adding resolve_handle_to_did with DNS+well-known fallback) and calls createSession; DNS plugin login spawns the plugin binary, collects schema fields via --flag=value → prompt fallback, forwards them via init, and asks the plugin to validate via its login op. Credentials returned from login replace whatever we collected so plugins can normalise them. mlf logout [pds|dns [<plugin>]] mirrors the login tree and rewrites the credentials file minus the targeted sections. --non-interactive on login errors with the exact flag name for any missing field instead of prompting.
3 months ago
diff.rs
Add mlf status and mlf diff read-only commands Introduce mlf-cli/src/remote_state.rs, a shared pipeline that walks the workspace, generates Lexicon JSON for every module, wraps each as a com.atproto.lexicon.schema record, computes its DAG-CBOR CID, and fetches whatever's currently published on the PDS. classify() sorts every NSID into Unchanged/New/Changed/Removed; remote records outside [package].name are left alone so shared-account-per-package setups don't get stepped on. mlf status renders the summary plus per-authority DNS readiness; mlf diff prints unified JSON diffs via the similar crate for any NSID the status would touch. Also fixes a spec-compliance gap in mlf-atproto::identity: per the ATProto lexicon spec, an NSID's publishing authority is the NSID minus the final name segment (so com.example.forum.post and com.example.forum.thread share _lexicon.forum.example.com). authority_of_nsid + authority_dns_name + RealDnsResolver::resolve_authority_did implement the correct drop-final rule used by the new status/diff path; the fetcher's existing helpers are kept unchanged for backwards compatibility.
3 months ago
fetch.rs
Add [package].name scope contract to mlf.toml Introduce a required [package] section whose name field declares the package's NSID prefix. Every .mlf file's namespace must be equal to or descended from it; a mis-scoped file is a miette-rendered error in mlf check rather than a silent pass. mlf init prompts for the name interactively (and derives a placeholder from the directory under --yes); mlf fetch's implicit mlf.toml auto-create is dropped since a package name would need its own prompt — users mlf init first.
3 months ago
init.rs
Add [package].name scope contract to mlf.toml Introduce a required [package] section whose name field declares the package's NSID prefix. Every .mlf file's namespace must be equal to or descended from it; a mis-scoped file is a miette-rendered error in mlf check rather than a silent pass. mlf init prompts for the name interactively (and derives a placeholder from the directory under --yes); mlf fetch's implicit mlf.toml auto-create is dropped since a package name would need its own prompt — users mlf init first.
3 months ago
lib.rs
Add mlf unpublish command Deletes every lexicon the workspace published, using the lol.mlf.package manifest as the list of NSIDs — so we never guess which records on the PDS belong to this workspace. Refuses to proceed if no manifest exists. After record deletes, the manifest record itself is removed. Interactive confirmation by default; --yes skips. Each deleteRecord is idempotent (already-gone records are logged and skipped). Records whose NSID isn't a descendant of [package].name are skipped even if they appear in the manifest — guards against a hand-edited manifest that names foreign NSIDs. DNS TXT records are intentionally left in place so re-publishing doesn't require re-provisioning DNS.
3 months ago
login.rs
Add mlf login / mlf logout commands + credentials file Plaintext TOML credential storage at ~/.config/mlf/credentials.toml (global) and <workspace>/.mlf/credentials.toml (project-local, opt-in via --project, meant for CI). Files are written mode 0600 on Unix. One [pds] section carrying handle + app_password + did/pds cache; one [dns.<plugin>] section per configured DNS provider whose fields come from the plugin's options_schema and are preserved on round-trip. mlf login [pds|dns <plugin>] validates credentials before writing — PDS login runs handle→DID→PDS resolution via mlf-atproto::identity (adding resolve_handle_to_did with DNS+well-known fallback) and calls createSession; DNS plugin login spawns the plugin binary, collects schema fields via --flag=value → prompt fallback, forwards them via init, and asks the plugin to validate via its login op. Credentials returned from login replace whatever we collected so plugins can normalise them. mlf logout [pds|dns [<plugin>]] mirrors the login tree and rewrites the credentials file minus the targeted sections. --non-interactive on login errors with the exact flag name for any missing field instead of prompting.
3 months ago
logout.rs
Add mlf login / mlf logout commands + credentials file Plaintext TOML credential storage at ~/.config/mlf/credentials.toml (global) and <workspace>/.mlf/credentials.toml (project-local, opt-in via --project, meant for CI). Files are written mode 0600 on Unix. One [pds] section carrying handle + app_password + did/pds cache; one [dns.<plugin>] section per configured DNS provider whose fields come from the plugin's options_schema and are preserved on round-trip. mlf login [pds|dns <plugin>] validates credentials before writing — PDS login runs handle→DID→PDS resolution via mlf-atproto::identity (adding resolve_handle_to_did with DNS+well-known fallback) and calls createSession; DNS plugin login spawns the plugin binary, collects schema fields via --flag=value → prompt fallback, forwards them via init, and asks the plugin to validate via its login op. Credentials returned from login replace whatever we collected so plugins can normalise them. mlf logout [pds|dns [<plugin>]] mirrors the login tree and rewrites the credentials file minus the targeted sections. --non-interactive on login errors with the exact flag name for any missing field instead of prompting.
3 months ago
main.rs
Add workspace support ([workspace] mlf.toml) A workspace root is an mlf.toml with a [workspace] section and no [package] — members = ["app", "shared"] lists per-member subdirectories, each with its own [package]. Settings declared under [workspace.publish] and [workspace.dependencies] cascade into any member that doesn't override them (section-level replacement, not field-level merging). ProjectKind::load distinguishes the two shapes and returns either a single ResolvedPackage or the full member list. mlf publish dispatches based on that: single package → existing flow; workspace → publishes every member in declaration order. --package <name> filters to one member by its [package].name. Each member runs through the full validator + DNS reconcile + apply + manifest pipeline independently — every member produces its own lol.mlf.package record. RemoteState::load_at lets the orchestrator target a specific package root without relying on CWD, so running from the workspace root publishes every member cleanly.
3 months ago
publish.rs
Split manifest into its own collection with TID rkeys Each publish event now writes a fresh `lol.mlf.package/<tid>` record instead of clobbering a single `com.atproto.lexicon.schema/lol.mlf.package`. The schema definition and the manifest instance are different things in different collections, so they stop colliding when an mlf project dogfoods `lol.mlf.package` as a user lexicon. - mlf-atproto: new tid module (sortable base32 TID generator, CAS loop for monotonicity) - mlf-publish/manifest: drop the schema envelope; instance carries `$type = "lol.mlf.package"` and only instance fields - mlf-cli/publish: write manifest to `lol.mlf.package/<tid>` - mlf-cli/unpublish: list the manifest collection, pick the newest by TID, delete everything it lists + the full publish log
3 months ago
remote_state.rs
Add workspace support ([workspace] mlf.toml) A workspace root is an mlf.toml with a [workspace] section and no [package] — members = ["app", "shared"] lists per-member subdirectories, each with its own [package]. Settings declared under [workspace.publish] and [workspace.dependencies] cascade into any member that doesn't override them (section-level replacement, not field-level merging). ProjectKind::load distinguishes the two shapes and returns either a single ResolvedPackage or the full member list. mlf publish dispatches based on that: single package → existing flow; workspace → publishes every member in declaration order. --package <name> filters to one member by its [package].name. Each member runs through the full validator + DNS reconcile + apply + manifest pipeline independently — every member produces its own lol.mlf.package record. RemoteState::load_at lets the orchestrator target a specific package root without relying on CWD, so running from the workspace root publishes every member cleanly.
3 months ago
status.rs
Add mlf status and mlf diff read-only commands Introduce mlf-cli/src/remote_state.rs, a shared pipeline that walks the workspace, generates Lexicon JSON for every module, wraps each as a com.atproto.lexicon.schema record, computes its DAG-CBOR CID, and fetches whatever's currently published on the PDS. classify() sorts every NSID into Unchanged/New/Changed/Removed; remote records outside [package].name are left alone so shared-account-per-package setups don't get stepped on. mlf status renders the summary plus per-authority DNS readiness; mlf diff prints unified JSON diffs via the similar crate for any NSID the status would touch. Also fixes a spec-compliance gap in mlf-atproto::identity: per the ATProto lexicon spec, an NSID's publishing authority is the NSID minus the final name segment (so com.example.forum.post and com.example.forum.thread share _lexicon.forum.example.com). authority_of_nsid + authority_dns_name + RealDnsResolver::resolve_authority_did implement the correct drop-final rule used by the new status/diff path; the fetcher's existing helpers are kept unchanged for backwards compatibility.
3 months ago
unpublish.rs
Split manifest into its own collection with TID rkeys Each publish event now writes a fresh `lol.mlf.package/<tid>` record instead of clobbering a single `com.atproto.lexicon.schema/lol.mlf.package`. The schema definition and the manifest instance are different things in different collections, so they stop colliding when an mlf project dogfoods `lol.mlf.package` as a user lexicon. - mlf-atproto: new tid module (sortable base32 TID generator, CAS loop for monotonicity) - mlf-publish/manifest: drop the schema envelope; instance carries `$type = "lol.mlf.package"` and only instance fields - mlf-cli/publish: write manifest to `lol.mlf.package/<tid>` - mlf-cli/unpublish: list the manifest collection, pick the newest by TID, delete everything it lists + the full publish log
3 months ago
workspace_ext.rs
Extract mlf-atproto plumbing crate Split protocol-level primitives (DID/NSID/DNS identity resolution, generic XRPC HTTP client, session management, record CRUD wrappers, client-side DAG-CBOR CID computation) out of mlf-lexicon-fetcher into a new mlf-atproto crate. The fetcher is refactored to consume it; its public API is preserved. This is the plumbing foundation for mlf-publish, mlf-plugin-host, and the DNS provider plugin binaries.
3 months ago