Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Skill Manager

For automatic imports into manager-owned storage, publisher updates, user edits, and reconciliation, use managed registrations. Existing source registration and draft APIs below retain their filesystem-authoring behavior.

Development and installation work from this directory independently of the Manager Suite checkout. See standalone development.

Standalone local management of native SKILL.md directories. Installable as aixand-skill-manager==0.1.0b0; import skill_manager; run skill-manager or python -m skill_manager. Python 3.11+ and PyYAML 6.0.3–6.x are required. This MVP uses descriptor-relative access and locks on POSIX; atomic directory commits use Linux renameat2(RENAME_NOREPLACE) or macOS renameatx_np(RENAME_EXCL) with filesystem support. Unsupported environments receive a structured error before directory publication.

Skill Manager registers explicit sources, inspects and edits drafts, validates native metadata, publishes whole-directory snapshots, compares versions, and exports to an explicit consumer directory. It works independently of Agent Manager, Suite, provider credentials, and model services.

Accepted-content updates, reconciliation, and history use the public package lifecycle SDK from aixand-prompt-manager>=0.1.0b0,<0.2. The dependency is one-way: Prompt Manager remains independently usable and does not import Skill Manager. Native skill validation, manifests/blobs, release references, and filesystem export remain owned here. Existing stores require no migration. See the integration contract.

GitHub acquisition is optional: install aixand-skill-manager[github] to use the standalone aixand-lib-github-source library. Creation, local imports, stored skills, history, and releases work without it. Skill Manager owns its acquisition policy and retained jobs. See GitHub sources.

Store locking and Windows pinned-path access use the standalone aixand-lib-filesystem library. The .locks/store.lock path and locking protocol coordinate concurrent store users.

Install and verify

python3 -m venv /tmp/skill-manager-env
/tmp/skill-manager-env/bin/python -m pip install .
/tmp/skill-manager-env/bin/skill-manager --help
/tmp/skill-manager-env/bin/python -B -m unittest discover -s tests -v

Use a temporary home during experiments. Selection order is explicit Manager(home) or --home, then SKILL_MANAGER_HOME, then ${XDG_DATA_HOME:-~/.local/share}/aixand/manager/skill. Construction, listing an absent store, and inspection do not create the store. Registration persists paths and ownership metadata without copying source files. Sources default to read-only.

Public library

The version 1 Python SDK provides explicit per-skill handles, registration returning effective content/status, and revision-pinned resolutions. The project connection workflow adds nested collection import, explicit project skill directories, guarded updates, project variants, and recovery. The existing record APIs below retain JSON-compatible mapping/list results; file reads return original bytes. SkillError(code, message, *, uncertain=False, operation_id=None, recovery=None) exposes those attributes and to_dict().

from pathlib import Path
from skill_manager import Manager

m = Manager("/tmp/skill-store")
root = Path("/tmp/my-skills")
root.mkdir(exist_ok=True)
m.register_source("local", [root], writable=True, owner={"kind": "local"})
entry = m.create_draft("local", "review-notes", {
    "SKILL.md": {"content": b"---\nname: review-notes\ndescription: Review notes when preparing a meeting.\n---\nRead the supplied notes.\n",
                 "executable": False},
    "references/checklist.md": {"content": b"Check dates and unresolved actions.\n",
                                "executable": False},
})
edited = m.save_file(entry["id"], "references/checklist.md",
                     b"Check dates, owners, and unresolved actions.\n",
                     expected_digest=entry["digest"])
assert m.validate(edited["id"])["valid"]
release = m.release(edited["id"], "v1", expected_digest=edited["digest"])
resolved = m.resolve(release["reference"])
receipt = m.export(resolved["reference"], "/tmp/review-notes")
assert receipt["digest"] == release["digest"]
Method Arguments and behavior
register_source (identifier, paths, *, label=None, writable=False, owner=None, expected_revision=None); create-only with null guard; existing registration needs its observed revision.
source, sources (identifier) / (); include location availability; corrupt registrations remain isolated in lists.
unregister_source (identifier, *, expected_revision); removes registration, retains files and releases.
catalog (); source descriptors and source-scoped draft entries, with isolated diagnostics.
show, read_file, validate (entry_id_or_release) / (entry_id_or_release, relative_path) / (entry_id_or_release); inspection, bytes, and validation.
create_draft (source_id, name, files, *, path=None); each file supplies content: bytes, executable: bool; path selects a registered root when several exist.
save_file (entry_id, relative_path, content, *, executable=False, expected_digest); add/replace one file under a complete-draft guard.
release (entry_id, version, *, expected_digest); explicit publication; immutable label.
resolve (reference); validates captured manifest and blobs, independent of sources.
releases (source_id=None, name=None); retained versions, including removed sources, with isolated errors.
diff (before, after); draft IDs or release references; all file, permission, directory, and metadata changes.
export (reference, destination); absent package directory or identical existing package.

Select drafts by the catalog id; names alone are ambiguous. Entry identity includes the store, source ID, and canonical absolute package directory. Discovery checks a registered root containing SKILL.md, otherwise its immediate directory children containing SKILL.md. It never recursively searches projects. Missing registrations and unavailable roots remain visible. Pointing at an existing skill supports direct inspection; draft creation requires a collection root.

For an explicit fork of a plugin skill, read its files through read_file, retain the manifest executable flags, and pass them to create_draft in a writable source. Create any empty supporting directories separately; inspection and release capture them. Ordinary catalog, inspection, and validation do not edit plugin caches.

Invalid frontmatter remains editable with digest_kind="draft-files"; the repair digest covers all raw files and directories. Complete valid drafts use digest_kind="package". Publication requires complete metadata and containment validation. Filesystem hazards without a safe digest require explicit filesystem repair (for example, removing a symlink) before guarded editing. Deleting SKILL.md removes an external directory from bounded discovery; restore it directly before selecting the draft again. Existing published releases remain independent.

CLI

Results are strict JSON by default; --json is accepted at each command. Errors are JSON on stderr. Exit codes: 0 success, 2 validation/conflict/not-found or an invalid validation result, 3 unsupported, 4 uncertain, 1 other operational failure. Argument syntax errors are structured validation errors with exit 2. JSON inputs accept inline JSON or @PATH; none is the explicit null revision token.

skill-manager --home /tmp/skill-store source register examples ./examples --json
skill-manager --home /tmp/skill-store source list --json
skill-manager --home /tmp/skill-store source show examples --json
skill-manager --home /tmp/skill-store catalog --json
# Copy the entry id and digest from the catalog result:
skill-manager --home /tmp/skill-store show ENTRY --json
skill-manager --home /tmp/skill-store show ENTRY --file assets/badge.png --json
skill-manager --home /tmp/skill-store validate ENTRY --json
skill-manager --home /tmp/skill-store release ENTRY --version v1 --expected-digest DIGEST --json
skill-manager --home /tmp/skill-store releases --source examples --name csv-audit --json
skill-manager --home /tmp/skill-store resolve examples/csv-audit@v1 --json
skill-manager --home /tmp/skill-store diff examples/csv-audit@v1 ENTRY --json
skill-manager --home /tmp/skill-store export examples/csv-audit@v1 /tmp/csv-audit --json

Writable authoring also supports draft create SOURCE NAME --files @files.json with { "SKILL.md": { "content_b64": "...", "executable": false } }, and draft save ENTRY RELATIVE --file PATH --expected-digest DIGEST [--executable]. Remove a registration with source unregister ID --expected-revision REV. Replacing a source registration requires that same guard; --writable is explicit on each replacement.

Format, release, and export contract

Native frontmatter follows the Agent Skills specification. Required fields are name and description; optional fields are license, compatibility, string-to-string metadata, and string allowed-tools. The name matches the package basename. Safe YAML rejects duplicate keys, custom object tags, aliases, and anchors. Unknown fields belong inside metadata. These restrictions keep validation deterministic and bounded. Instructions and supporting content remain original bytes; validation never executes scripts or calls a model.

All symlinks and special files are rejected, including internal symlinks and resource root ancestors that are symlinks. No-follow descriptor-relative reads recheck types and containment. Portable paths reject absolute/drive paths, backslashes, traversal, control characters, Windows reserved components, trailing dots/spaces, and case or Unicode normalization collisions. Hidden regular files and all supporting directories, including empty directories, are included.

The skill-manager/package-1 manifest contains exactly schema, name, metadata, sorted directories, and sorted files. Each file records path, raw byte size, raw-byte digest, and executable. Any native execute bit means executable; exports use 0755/0644 files and 0755 directories. Timestamps, ownership, and other permission bits do not affect the identity. The package digest hashes the entire strict canonical UTF-8 JSON manifest. Script-only, asset-only, executable-only, and directory-only changes therefore change its identity. See storage details.

Release references are source/name@version or source/name@sha256:HEX. Resolve an older label explicitly to select its previous content. A label can never be rebound. Repeating publication with the same label/content returns the original record. Digest references require an existing publication in that source/name namespace and return the lexicographically first matching label's captured publication provenance. Source unregister/removal/reuse cannot rewrite that record.

Export requires an existing caller-owned parent and a destination basename equal to the recorded name. The complete staged sibling package is verified before atomic no-replace publication. Different existing content is a conflict; there is no merge or overwrite. An identical existing package succeeds with status="identical". Failure preserves previous destination content, including a competing empty directory.

Limits: 4096 file/directory entries, 64 MiB per file, 256 MiB total bytes, 32 path components, 4096 UTF-8 path bytes, 255 bytes per component, 1 MiB SKILL.md metadata inspection, and 64 MiB per stored JSON record. Exceeding a limit gives an actionable diagnostic. Captures hold bytes in memory. These are local MVP limits, not additional requirements of the Agent Skills specification.

Store mutations use one advisory lock per canonical store, serializing revision comparison and commit. Directory publication also rejects noncooperating competing destinations. Source writers outside Skill Manager are detected through capture checks; they do not participate in its advisory lock. Files are fsynced before commit; full power-loss durability, hostile-writer synchronization across stores, and automatic orphan-blob/staging garbage collection are outside this MVP.

The CSV audit example includes a script, reference, CSV, binary PNG, hidden settings, and an empty supporting directory. Provider-native activation and managed profile assignments belong to Agent Manager. No skill flattening into developer instructions, remote synchronization, marketplace, cloud hosting, or plugin-manager implementation is included.

Local developer commands

Inside the manager-suites source checkout, run from this directory with Python 3.11+ and uv:

./dev.sh develop --local
./dev.sh check
./dev.sh test
./dev.sh build

Use .\dev.ps1 on Windows. Each package owns its development environment and helper; these commands do not invoke suite-wide checks. See the development guide for wheel-based setup without sibling sources, lock updates, build outputs, and the separate suite release lifecycle.

Default storage location

The default product directory is ${XDG_DATA_HOME:-~/.local/share}/aixand/manager/skill. Set AIXAND_MANAGER_ROOT=/custom/managers to use /custom/managers/skill without changing the data location of unrelated applications. Unset, empty, or relative XDG_DATA_HOME values fall back to ~/.local/share. Explicit CLI/SDK paths and product-specific environment overrides take precedence; these paths are used directly. Existing configured storage paths remain supported. Agent and Conversation config overrides remain separate from their state-home overrides. Default path resolution creates no directories and does not move or adopt old stores. To keep using an existing store, supply its original path explicitly. Native provider homes connected by the user and operating-system temporary files retain their locations.

Metadata

Release files for aixand-skill-manager 0.1.0b0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aixand-skill-manager 0.1.0b0
File Size Uploaded Provenance Actions
aixand_skill_manager-0.1.0b0.tar.gz 134.5 kB With provenance Details for aixand_skill_manager-0.1.0b0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for aixand-skill-manager 0.1.0b0
File Interpreter ABI Platform Actions
aixand_skill_manager-0.1.0b0-py3-none-any.whl Python 3 none any Details for aixand_skill_manager-0.1.0b0-py3-none-any.whl

Total release size: 207.6 kB

Release files / aixand_skill_manager-0.1.0b0.tar.gz

Download URL aixand_skill_manager-0.1.0b0.tar.gz
Size 134.5 kB
Tags Source
SHA-256 checksum
How to use checksums
17d588c46f2be591571a762c263e9b044bfec4dcfdffea3b9394531446abab49
BLAKE2b-256 checksum
How to use checksums
4ea6721f96de5fa431f35f940ced0447834cdf83d9ddaf8cd79d53e5111cc8d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 12, 2026.

Transparency log

Release files / aixand_skill_manager-0.1.0b0-py3-none-any.whl

Download URL aixand_skill_manager-0.1.0b0-py3-none-any.whl
Size 73.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
85c7b41d86950df13f8d044706abc85c8ad0bffe6820ac5fe74e99cbef02132c
BLAKE2b-256 checksum
How to use checksums
01ff23be1d70839fee8be747582cabf78a357ad5eaac70035e37dfd29d29820c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 12, 2026.

Transparency log

Security for aixand-skill-manager 0.1.0b0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for aixand_skill_manager-0.1.0b0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 12, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page