Zakira conduit
A tool that mirrors agent skills from GitHub or local directories into your agent folders, driven by a conduit.json manifest.
npx -y skills add MoaidHathot/Zakira.Conduit --skill zakira-conduitAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use, configure, and troubleshoot Zakira.Conduit - the .NET 10 global CLI tool that mirrors agent skills from GitHub, Azure DevOps, or local directories into one or more target folders via a conduit.json (or conduit.jsonc) manifest. Activate when the user mentions conduit, conduit.json, conduit.jsonc, .conduit-state.json, syncing or mirroring agent skills, pinning a commit, unpinning to restore branch tracking, the in-string `-> Name` alias or `{source, as}` wrapper, include/exclude globs, the orphan cleaner, or runs commands such as `conduit sync`, `conduit list`, `conduit status`, `conduit pin`, `conduit update`, `conduit unpin`, `conduit clean`, `conduit watch`, `conduit init`, or `conduit validate`.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
15.9 KB, ~4.0k tokens by cl100k_base, as published. Nobody here has run it
Using Zakira.Conduit
conduit is a .NET 10 global tool that mirrors agent skills (and any other vendored folder content) from remote sources — GitHub, Azure DevOps, or local directories — into one or more target directories on disk, driven by a single declarative conduit.json (or conduit.jsonc) manifest.
Use this skill whenever the user:
- mentions
conduit,conduit.json,conduit.jsonc,.conduit-state.json, or "mirror skills" - asks to add, remove, rename, or modify a skill source
- wants to pin an entry to a specific commit, unpin back to branch tracking, or refresh a pinned commit (
update) - asks about the in-string
-> Namealias or the{source, as}wrapper - asks about include/exclude globs that filter what gets mirrored
- wants to clean up orphan destination directories (
conduit clean,sync --prune) - runs any
conduit ...subcommand and asks for help interpreting the output
If none of those apply, this skill is probably not the right context — don't read further.
Mental model
A manifest (conduit.json or conduit.jsonc) contains a list of entries. Each entry has:
- an optional
name— identifier and destination subdirectory name (for the defaultwrapstrategy). When omitted, Conduit derives one from the source (GitHub/AzDO repo name, local dir basename). - one
source— either a discriminator-shaped object ({type: "github" | "azdo" | "local" | "uri", ...}), a bare URL string (which is inferred to the right kind), or an array of any of the above (each element becomes its own sub-entry sharing the parent's targets). - one or more
targets— directories on disk to mirror into. - an optional
strategy— one ofwrap(default, places content under<target>/<name>/),flat(merges content into<target>/),expand(lifts each top-level child of the source to its own sub-directory), orskills(discoversSKILL.mdfolders and fans them out across detected agent harnesses under each target). Seereferences/manifest.md"Strategies". - optional
groupBy: "source"— composes with every strategy to wrap each source's output in a source-named sub-directory. - optional
onCollision: error|skip|last-wins— controls behaviour when two destinations resolve to the same path.
conduit sync walks every enabled entry, fetches the source, dispatches to the entry's strategy to plan one or more (source, target) mirror operations, then atomically writes each one. A sibling .conduit-state.json records what was synced so the next run can skip unchanged entries (commit-pinned entries skip without network when the strategy is the default wrap; branch-tracked entries use HTTP If-None-Match; local sources use a content fingerprint).
Discovery: where is the manifest?
If the user doesn't pass --manifest, conduit probes these locations in order and uses the first existing file. At each location both extensions are tried, .json first:
$XDG_CONFIG_HOME/Zakira.Conduit/conduit.{json,jsonc}$HOME/.config/Zakira.Conduit/conduit.{json,jsonc}./conduit.{json,jsonc}(current working directory)
The same XDG-style resolution is used on every OS, including Windows. To find the resolved path, run conduit validate; it prints the path on success and the candidates it searched on failure.
The manifest is parsed as JSONC: line comments (// ...), block comments (/* ... */), and trailing commas are accepted regardless of file extension.
Commands at a glance
| Verb | What it does | When to use |
|---|---|---|
conduit init [-i] | Write a starter manifest. -i walks through prompts. | First-time setup. |
conduit validate | Parse + validate the manifest. No network. | Anywhere there's doubt. |
conduit list | Print the configured entries (text or JSON). | "What's currently configured?" |
conduit status | Per-entry: last SHA, last sync time, target presence (no network). | "What is currently synced?" |
conduit sync | Fetch + mirror. Default parallel, default cached. | The main action. |
conduit pin | Lock each entry to a specific commit by rewriting its source URL to the pinned form. | "Lock to today's tip." |
conduit update | Alias of pin. | "Bump the pinned versions." |
conduit unpin | Restore branch tracking on pinned entries. Inverse of pin. | "Thaw so I can re-sync against current HEAD." |
conduit clean | Remove destination directories whose owning entry has been deleted from the manifest. | "Tidy up after I removed entries." |
conduit watch | Initial sync + re-sync on every manifest change. Ctrl+C to stop. | While editing the manifest iteratively. |
conduit copy <src> <dst> | One-shot mirror with optional --strategy. Bypasses the manifest. | Scripting, ad-hoc installs, strategy previews. |
conduit skills probe <target> | Scan a target for known agent harness layouts. | "Where would skills go if I targeted this dir?" |
Every command accepts:
-m, --manifest <path>— override discovery-o, --output text|json— JSON is stdout-clean for piping intojq--verbose/--quiet
conduit sync additionally accepts:
--entry <name>— restrict to specific entries. Repeatable, and comma-separated (--entry a,b -e c).--dry-run— preview without writing--stop-on-first-error--force— ignore the cached state, refetch everything--parallel N— default 4--prune— after a successful sync, run the orphan cleaner. Pair with--prune-yes(or--yes) in non-interactive sessions.
Step-by-step workflows
A. "Add a new GitHub skill source"
-
Ask whether they want to mirror the whole repo or a sub-path, and which target directories the agent reads from.
-
Open the manifest at the discovered location (run
conduit validateto find it). -
Add a new entry. The simplest form is a bare URL (Conduit derives the entry name from the repo):
{ "source": "https://github.com/owner/repo/sub/path", "targets": ["~/.config/agents/skills"] }The
/sub/pathis optional — omit it to mirror the whole repo. To track a specific branch, append/tree/<branch>before the sub-path:https://github.com/owner/repo/tree/develop/sub/path. To override the auto-derived name, append-> MyNameor use the wrapper form{ "source": "...", "as": "MyName" }.The explicit object form is also fine, especially when you need to pin or set include/exclude:
{ "name": "the-skill-name", "source": { "type": "github", "repo": "owner/repo", "path": "sub/path", "branch": "main", "include": ["**/*.md", "scripts/**"], "exclude": ["**/*.test.*"] }, "targets": ["~/.config/agents/skills"] } -
Run
conduit validateto confirm. -
Run
conduit sync --dry-run --entry the-skill-nameto preview. -
Run
conduit sync --entry the-skill-nameto commit.
B. "Mirror an Azure DevOps repository"
{
"name": "internal-runbooks",
"source": {
"type": "azdo",
"url": "https://dev.azure.com/contoso/Conduit/_git/agent-skills",
"branch": "main",
"path": "skills"
},
"targets": ["~/.config/agents/skills"]
}
Or, equivalently, the URL form (Conduit infers the kind):
{
"source": "https://dev.azure.com/contoso/Conduit/_git/agent-skills?path=/skills&version=GBmain",
"targets": ["~/.config/agents/skills"]
}
AzDO auth uses an ordered chain (default [env, az]): the env provider reads CONDUIT_AZDO_TOKEN -> AZURE_DEVOPS_EXT_PAT -> SYSTEM_ACCESSTOKEN; the az provider shells out to the Azure CLI. Override with "auth": ["pat", "anonymous"] etc.
C. "Mirror a local directory into my agent folders"
{
"source": "./vendor/skills/house-style",
"targets": [
"~/.config/claude/skills",
"~/projects/foo/.agents/skills"
]
}
Local paths can be absolute or relative to the manifest's directory, and accept ~, $VAR, ${VAR}, and %VAR% (Windows). A subsequent conduit sync for an unchanged local source is a no-op — conduit fingerprints the source contents and skips when nothing changed.
D. "Pull several skills out of one repo with one fetch"
Use the plural paths array. With two or more elements, each path becomes its own destination subdirectory (<target>/<basename>/) and the entry's name becomes metadata only:
{
"name": "anthropic-bundle",
"source": {
"type": "github",
"repo": "anthropics/skills",
"paths": ["code-review", "test-writer", "refactor"],
"branch": "main"
},
"targets": ["~/.config/claude/skills"]
}
Result: ~/.config/claude/skills/{code-review, test-writer, refactor}/.
E. "Mirror several different repos in one entry"
Give the entry an array source. Each element becomes its own sub-entry sharing the parent's targets; if you omit the entry-level name, the destination folder is derived from each element's repo name:
{
"source": [
"https://github.com/MoaidHathot/ActionView/skills",
"https://github.com/MoaidHathot/PowerReview/skills",
"./vendor/house-style -> HouseStyle"
],
"targets": ["~/.config/claude/skills"]
}
Result: ~/.config/claude/skills/{ActionView, PowerReview, HouseStyle}/.
F. "Lock today's versions; bump them later"
# Lock every entry to its current SHA. URL-native: GitHub becomes
# /tree/<sha>/<path>, AzDO becomes ?version=GC<sha>.
conduit pin
# Preview before commit:
conduit pin --dry-run
# Later, restore branch tracking on every pinned entry first, then re-pin:
conduit unpin # default behavior queries the repo's default branch
# (falls back to 'main' if discovery fails)
conduit unpin --to main # skip discovery; use a literal branch name
conduit pin # re-lock to current tips
pin is one-way; an already-pinned entry is skipped by pin/update with a pointer at unpin. This is deliberate so the user's branch choice is never silently lost on a refresh.
Comments and trailing commas in the manifest are preserved by pin/unpin/update when every touched entry has a string-shaped source on disk (URL rewrite, leaf-level edit only). They are not preserved when an entry needs an object-key insertion/removal (e.g. dropping branch on an object-form pin); the write falls back to a full reformat in that case.
G. "Filter what gets mirrored from a source"
Use include / exclude glob lists on any source kind:
{
"source": {
"type": "github",
"repo": "owner/repo",
"include": ["**/*.md", "scripts/**"],
"exclude": ["**/*.test.*", "bin/**"]
},
"targets": ["./out"]
}
Patterns use Microsoft.Extensions.FileSystemGlobbing syntax (*, **, ?, character classes). A path is mirrored when it matches at least one include (or include is empty/omitted) and zero exclude patterns.
H. "Clean up after I removed an entry"
# Show what would be removed (dry-run is the default behavior preview).
conduit clean --dry-run
# Actually remove. Prompts for confirmation when stdin is a TTY; pass --yes to
# skip the prompt (required for JSON output or CI sessions).
conduit clean --yes
# Or combine cleanup with sync:
conduit sync --prune --prune-yes
Orphan = a destination directory recorded in state whose owning entry no longer exists in the manifest. Live entries' targets are never touched (cross-checked before deletion).
I. "Why didn't sync do anything?"
Almost always the cache. Check, in order:
conduit status— shows the recorded SHA / last sync time per entry, and whether targets are still on disk.- If
statusreportssyncedandallTargetsPresentis true, that entry is up-to-date and will skip. - To force a full re-fetch:
conduit sync --force(or limit to one entry with--force --entry NAME). - To wipe the cache entirely, delete
.conduit-state.jsonnext to the manifest.
If status reports targets drifted, a target directory was removed manually — the next normal conduit sync will re-mirror it.
Editing the manifest safely
pin,unpin,update, andinit --forcewrite<manifest>.baknext to the file before mutating. If a rewrite goes wrong,cp conduit.json.bak conduit.jsonrestores.- JSONC trivia (comments, trailing commas) survives
pin/unpin/updatewhen every touched entry has a string-shaped source; otherwise the full-reformat path strips comments. - Object form
branchandcommitno longer coexist afterpin. Pin setscommitand removesbranch;unpindoes the opposite. To track a branch AND record its current SHA simultaneously, write both fields manually (the loader still accepts the duality, butpin/unpinenforce the URL-native model on write). targetsandpathsitems can each be either a bare string or an object withpathand optionalas:rename. Per-target aliases are rejected when an entry produces multiple content units (the per-path basename mapping would silently override).- Cross-entry destination uniqueness is enforced at validation time: two entries can't both write into the same
<target>/<destName>/directory. Rename one (setnameor per-targetas:) to disambiguate.
Privacy & auth
- GitHub: auth uses an ordered chain (default
[env, gh, anonymous]):envreadsCONDUIT_GITHUB_TOKEN->GITHUB_TOKEN->GH_TOKEN, first non-empty.ghshells out togh auth token(ghCLI) and caches the token in-process for ~10 minutes.patreads from the env var named bypatEnvon the source (defaultCONDUIT_GITHUB_TOKEN).anonymousproceeds without anAuthorizationheader. Override per-entry with"auth": ["env", "anonymous"]or"auth": "pat".
- AzDO: see workflow B above. Default chain
[env, az]. - Tokens are sent only to their respective API hosts. Conduit never persists them.
Reference material
This skill ships extra files. Load them when the question requires more detail:
references/manifest.md— full field-by-field reference for the manifest (every property, validation rule, accepted shape).references/commands.md— full reference for every CLI command, flag, and exit code.assets/minimal-conduit.json— smallest valid manifest, ready to copy.assets/multi-source-conduit.json— manifest demonstrating multiple source kinds, an array source, aliases, include/exclude, and per-target rename.
Hard rules
- Never invent commands that don't exist. The canonical command set is exactly the rows in the table above.
- Never suggest manually editing
.conduit-state.json. Use--forceor delete it instead. - Never instruct the user to push the API token into the manifest. Tokens live in the environment only.
- Never suggest a custom in-string suffix beyond
-> Name(alias). Pin uses GitHub-native/tree/<sha>/<path>URLs and AzDO-native?version=GC<sha>query strings; there is no conduit-specific pin syntax. - When in doubt about the resolved manifest path or what an entry will do, run
conduit validateandconduit listfirst — both are read-only and fast.
What ships with it: 4 files
35.7 KB alongside SKILL.md
assets/
references/
- commands.md13.0 KB
- manifest.md19.2 KB
Gives 0 of the 12 instructions most pr commit review skills give in ~4.0k tokens
Counted across 888 of the 1,342 authors here whose files we hold, read 2026-08-07
- Use conventional commits formatin 127 of 888, across 115 files
- Keep subject line under 72 charactersin 62 of 888, across 48 files
- Delete branches after mergein 51 of 888, across 38 files
- Use imperative mood in subject linein 51 of 888, across 42 files
- Use imperative mood in commit messagesin 44 of 888
- Verify directory is ignored before creating worktreein 43 of 888, across 12 files
- Generate a conventional commit messagein 43 of 888
- Add unignored worktree directories to gitignorein 42 of 888, across 10 files
- Make atomic commitsin 39 of 888, across 27 files
- Run tests before committingin 36 of 888, across 25 files
- Verify clean test baselinein 35 of 888, across 9 files
- Split unrelated changes into separate commitsin 35 of 888, across 30 files
Said here and by no other author read
- run conduit validate after manifest edits
- run conduit sync dry-run to preview changes
- run conduit sync entry to commit changes
- add a new manifest entry for new sources
- use pin to lock entries to a specific commit
- use unpin to restore branch tracking
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.