[Proposal]: Treat skills as packages — a language-agnostic manifest for skill dependency management #243
Replies: 8 comments 2 replies
|
Interesting proposal. Skillfold approaches a related problem from the build-tool side rather than the package-manager side, and I think the two are complementary. Skillfold is a compiler that reads a YAML config, resolves skill references, and produces standard SKILL.md output. It handles two forms of cross-project dependencies today: Imports let one config pull in skills and state from another: imports:
- node_modules/skillfold/library/skillfold.yaml
skills:
composed:
engineer:
compose: [planning, code-writing, testing]The imported config's atomic skills become available by name in the importing config. Only skills and state are imported - team flow is always local. GitHub URLs work as direct skill references for cross-repo dependencies: skills:
atomic:
create-readme: https://github.com/github/awesome-copilot/tree/main/skills/create-readme
planning: ./skills/planningThe compiler fetches remote skills via raw.githubusercontent.com at build time. Where I see this fitting with your proposal: a manifest/registry like sklz handles distribution and versioning (which skills exist, where to get them, what version to pin). A build tool like skillfold handles composition and compilation (how skills combine into agents, what the final SKILL.md contains). These are different concerns that could work together - the manifest installs skill sources, and the compiler reads from those installed paths. The naming point about |
|
The problem statement here is well defined. Skill distribution and dependency management are real gaps in the current ecosystem. One angle worth considering alongside the manifest approach: compile-time resolution as an alternative to install-time resolution. Skillfold takes this approach. You declare skill sources in a YAML config (local paths or GitHub URLs), define how they compose into agents, and the compiler resolves and concatenates everything into standard SKILL.md files at build time: skills:
atomic:
planning: ./skills/planning
coding: ./skills/coding
shared-review: https://github.com/org/repo/tree/main/skills/review
composed:
engineer:
compose: [planning, coding]
description: "Implements the plan and writes tests."
reviewer:
compose: [shared-review]
description: "Reviews code for correctness."npx skillfold # resolves all sources, compiles to build/The output is plain SKILL.md files with no runtime dependencies. The config is the manifest, the compiler is the resolver. Remote skills are fetched from GitHub at compile time. Imports let you share skills across configs: imports:
- node_modules/skillfold/library/skillfold.yamlThis has some natural overlap with the manifest proposal:
Where the approaches differ is the relationship between the manifest and the compiled output. In the Both models could coexist. A manifest/lockfile for skill installation, and a build tool for skill composition, are complementary layers. The manifest answers "which skills does this project use?" and the compiler answers "how are they combined into agents?" The naming concern about |
|
The manifest-based approach in We built something similar: a CLI installer that reads from YAML registries and writes to framework-specific paths via pluggable adapters (Claude Code, Cursor, Copilot, Gemini CLI, and others). The registry serves as our manifest — each skill entry has id, path, domain, complexity, and language. One lesson: domain-based grouping (installing all How does |
|
This is the strategy I've landed on for a "client-side" lock file. I use the emerging [skill-name]
source = "pkg:github/owner/repo@v1.0.0#skills/skill-name"
checksum = "h1:XXXX"The For instance, the latest The Also I use a TOML table for each skill so that I can detect instances where I attempt to add two skills with the same name. (Would love to see a plan for namespacing) to avoid skill name collision in the future. I'm not doing anything fancy in TOML, so it could easily be JSON as well. {
"skill-name": {
"source": "pkg:github/owner/repo@v1.0.0#skills/skill-name",
"checksum": "h1:XXXX"
}
} |
This comment was marked as spam.
This comment was marked as spam.
|
Adding one concrete data point from current skill installers: the manifest/lockfile should separate declared dependency intent from observed install state. I just smoked a fresh multi-skill repo install (
That suggests two artifacts, not one:
The second artifact should be boring and machine-facing, but it should make negative/edge claims auditable. For example: {
"skill": "swarm",
"source": "pkg:github/langchain-ai/langchain-skills@<resolved-ref>#skills/swarm",
"selected_source_path": "skills/swarm/SKILL.md",
"target_agent_path": ".agents/skills/swarm/SKILL.md",
"non_markdown_payloads": ["scripts/batching.ts", "scripts/executor.ts"],
"risk_assessment": { "status": "present", "sockets": 1, "snyk": "low" },
"agent_visible": true
}This also helps with the naming concern in the proposal: if agents pattern-match on I’d treat |
|
Check out SkillRepo. We would love to get your thoughts on how to improve what we've built. Our focus, for teams of developers, is how do you track who is using what? How can you ensure compliance in curated skill usage across teams? We provide a CLI for setup and stay in sync with every session turn - across all compatible vendors. We also provide the same compliance and consistency for remote agents with MCP. Check it out and let us know what you think! |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Summary
Proposes treating skills as versioned packages managed by a dedicated, language-agnostic manifest file — only the manifest gets committed, not the skill files themselves. For teams and companies needing npm-like skill management, a tool like sklz demonstrates this workflow in practice.
Problem
The current discussions around skill distribution (#81, #214) have converged on a real gap: there is no standard way to declare, share, and reproduce which skills a project depends on, without either:
package.json,pyproject.toml,Cargo.toml).Both approaches have friction. Vendoring skill files means every update is a manual copy-paste, diffs are noisy, and there's no concept of a version. Language-specific manifests work well for library authors shipping skills alongside their code, but they create a conceptual mismatch for the general case: not every project that uses skills is a Node project, a Python project, or a Rust project. A team with a mixed-language monorepo, a documentation repo, an infrastructure repo — all of them might want to manage skills without adopting a foreign package manager just for that purpose.
The pattern we're missing a dedicated manifest + lockfile that tracks dependencies without vendoring them.
Proposal
Introduce a skill manifest file — a small, language-agnostic JSON file that serves the same conceptual role as
package.json+ a lockfile, but scoped exclusively to skill management.The core idea:
A minimal manifest could look like:
{ "sklz": { "flexoki": { "repo": "https://github.com/AlissonSteffens/alisson-skils", "repoName": "alisson-skils", "version": "0.0.0", "commit": "46c4cdb", "installedAt": "2026-03-11T02:58:39.549Z", "tags": [] } "react-patterns": { "source": "https://github.com/another-org/frontend-skills.git", "version": "0.9.1", "commit": "f4e5d6c" } } }The installed skills directory (e.g.
.agents/skills/) would be gitignored. A collaborator cloning the repo runs a single install command to reproduce the exact same skill set.Why not
package.json?package.jsonis a reasonable answer for JavaScript/Node projects — and the npm-based approach in #81 makes good sense for library authors. But:package.json. Forcing one just to manage skills is significant conceptual overhead.agentskillsfield proposed in RFC: Standardize npm/JavaScript Package Distribution #81 lives inside npm's resolver logic, meaning the entire npm dependency graph is involved in what is essentially a skills concern.A dedicated manifest sidesteps all of this. It has one job. It doesn't care about your language stack.
Why not
skill.jsonorskills.json?The obvious naming choice would be
skill.jsonorskills.json— but both names create a practical problem with agents.In testing, when a file named
skill.jsonorskills.jsonis present at the repo root, agents tend to consume it as the source of truth for skill content, instead of reading the actual skill files from the installed directory (e.g..agents/skills/). The filename is close enough toSKILL.mdsemantically that agents treat it as an instruction source rather than a tooling artifact.I encountered this behavior directly while building a proof of concept for this proposal (more on that below). The manifest needs a name that is clearly machine/tooling-facing, not agent-facing. Something like
sklz.jsonor another name that doesn't pattern-match to skill content is safer in practice.This is also a reason to be cautious about the
skill.jsonproposal in #214 — if it becomes widespread, agents may start reading it as a skill source, which was not its intent.Proof of Concept
I built sklz as a proof of concept for this proposal — a CLI that manages skills from git repos using a dedicated manifest file (
sklz.json). It is early-stage and the name/format are not the point; the workflow it demonstrates is:Only
sklz.jsonis committed..agents/skills/is gitignored. The naming (sklz.json) was deliberately chosen to avoid the agent-consumption problem described above — a name that is unambiguously tooling metadata.The implementation is available as a reference for what the DX and manifest format could look like, independent of whether
sklzitself is adopted.This enables companies and teams to work smarter with skills, without poluting repositories.
What This Proposal Asks
skill.json([Proposal]: Add skill.json as an optional package-level metadata file #214) and npm distribution (RFC: Standardize npm/JavaScript Package Distribution #81).skill.json/skills.jsonfor the manifest, given demonstrated interference with agent behavior.Open Questions
package.json+package-lock.json)?sklz.json,skills.lock,agent-skills.json?)DISCLOSURE: Written with AI assistance. Reviewed and edited by the author.
Use case scenario at this comment
All reactions