Manifest¶
The manifest.json file is the module index that the CLI uses to discover available modules, their metadata, and dependency relationships.
Overview¶
- Location:
manifest.jsonin the repository root - Generated by:
zerodep manifest(ormake manifest) - Source of truth: module source files (
# /// zerodepfrontmatter + docstrings) - Consumers: the
zerodepCLI tool (list, info, add commands)
Format¶
{
"version": "1",
"generated": "2026-03-28T05:27:00+00:00",
"modules": {
"scheduler": {
"description": "Zero-dependency in-process task scheduler with cron support",
"files": ["scheduler/scheduler.py"],
"version": "0.4.0",
"deps": [],
"tier": "subsystem",
"category": "util",
"last_updated": "2026-04-09T22:14:17+08:00",
"content_hash": "a1b2c3..."
},
"sse": {
"description": "Zero-dependency SSE (Server-Sent Events) client",
"files": ["sse/sse.py"],
"version": "0.4.0",
"deps": ["httpclient"],
"tier": "subsystem",
"category": "network",
"last_updated": "2026-04-09T22:14:17+08:00",
"content_hash": "d4e5f6..."
}
}
}
Top-Level Fields¶
| Field | Type | Description |
|---|---|---|
version |
string |
Manifest schema version (currently "1") |
generated |
string |
ISO 8601 timestamp of generation |
modules |
object |
Map of module name to module metadata |
Module Fields¶
| Field | Type | Description |
|---|---|---|
description |
string |
First line of the module docstring |
files |
list[string] |
Relative paths to the module's .py files |
version |
string |
Version from the frontmatter block |
deps |
list[string] |
Sibling module dependencies |
tier |
string |
Complexity tier (simple, moderate, subsystem) |
category |
string |
Functional category (data, network, util, etc.) |
last_updated |
string\|null |
ISO 8601 timestamp of the last git commit touching the primary file |
content_hash |
string |
SHA-256 hex digest of the primary file with frontmatter stripped |
Tip
content_hash excludes the # /// zerodep frontmatter block, so metadata-only changes (version bumps, tier reclassification) do not alter the hash. Use zerodep outdated to compare your local files against these hashes.
How It's Generated¶
The zerodep manifest command recursively scans the repository for module directories:
- Discover directories — recursively walk all directories, skip known non-module dirs (
.git,docs_en,plans, etc.) at any depth - Find Python files — collect non-test
.pyfiles in each directory - Identify primary file — prefer
<dirname>.py, fall back to the first file - Register module — the module name is the leaf directory name (e.g.
network/httpclient/registers ashttpclient). Intermediate grouping directories that contain no.pyfiles are traversed but not registered. Duplicate module names trigger a warning, keeping the first one found - Extract metadata from the primary file:
versionanddeps— from# /// zerodepfrontmatter block viaast.literal_eval- Module docstring first line — via
ast.parse
- Write
manifest.jsonwith all discovered modules
Skipped Directories¶
The following directories are not scanned for modules:
Module Metadata Convention¶
Each module's primary .py file should declare a PEP 723-style frontmatter block at the very top, before the module docstring:
# /// zerodep
# version = "0.1.0"
# deps = ["httpclient"]
# ///
"""First line becomes the description in manifest.json."""
| Field | Required | Description |
|---|---|---|
version |
Yes | Semantic version string |
deps |
Yes | List of sibling zerodep module names this module imports |
| Module docstring | Recommended | First line used as description |
Note
This format is inspired by PEP 723 inline script metadata. It lives entirely in comments, so it has zero runtime impact — no namespace pollution, no risk of Python reserving the variable name.
Current Dependency Graph¶
graph LR
a2a --> jsonrpc
acp --> jsonrpc
config --> dotenv
config --> yaml
config --> jsonx
frontmatter --> yaml
skills --> frontmatter
skills --> search
sse --> httpclient
vcs --> diff
All other modules have deps = [] (no sibling dependencies).
Regenerating¶
Via CLI¶
Via Make¶
When to Regenerate¶
Regenerate manifest.json whenever you:
- Add a new module
- Change a module's
versionin the frontmatter - Add or remove a
depsentry - Change a module's docstring first line
Tip
The manifest should be committed to the repository so that remote users can fetch it without cloning the full repo. Consider adding make manifest to your CI pipeline to keep it in sync.