@wipcomputer/wip-repos
v1.9.70
Published
Repo manifest reconciler. Single source of truth for repo organization. Like prettier for folder structure.
Maintainers
Readme
WIP Computer
wip-repos
Repo manifest reconciler. Single source of truth for repo organization.
The Problem
You have 50 repos. Someone moves a folder. The README drifts. The manifest drifts. Your AI agent references a path that doesn't exist anymore. Everyone wastes time.
The Solution
repos-manifest.json is the single source of truth. The filesystem adapts to it. Like prettier for folder structure.
Move folders around all day. On sync, everything snaps back to where the manifest says it belongs. Want to change the structure? PR to the manifest. Org owner approves or rejects. Rejected? Your folders snap back on next sync.
Usage
# Check for drift between filesystem and manifest
wip-repos check
wip-repos check --all
wip-repos check --class worktree
# Report release-pipeline enrollment status
wip-repos release-enrollment
wip-repos release-enrollment --strict
# See what sync would do
wip-repos sync
# Actually move folders to match manifest
wip-repos sync --apply
# Add a new repo
wip-repos add ldm-os/utilities/my-tool --remote wipcomputer/my-tool
# Move a repo to a different category
wip-repos move ldm-os/utilities/my-tool --to ldm-os/devops/my-tool
# Generate directory tree from manifest
wip-repos treeOptions
--manifest Path to repos-manifest.json (default: ./repos-manifest.json)
--root Path to repos root directory (default: directory containing manifest)
--dry-run Show what would happen without making changes
--strict Treat missing release enrollment decisions as failures
--json Output as JSONHow It Works
check walks the filesystem, classifies repos, and compares active repos against the manifest. Worktrees, trash, sort, sunsetted, and archived paths are ignored by default and summarized separately. Use
--allor--class <class>to inspect them.sync matches active repos by their git remote URL. If a repo's remote matches a manifest entry but it's at the wrong path, sync prints the move plan by default. It only moves with
--apply, and refuses dirty repos, linked worktrees, and target collisions.add/move update the manifest file. The actual folder moves happen on the next
sync.release-enrollment reports which active manifest repos are enrolled in the release pipeline, explicitly excluded, still need a release-profile decision, missing on disk, or active on disk but unmanifested. By default, missing repos and unmanifested active repos are blockers. With
--strict, missing release decisions are blockers too.
Release enrollment metadata lives in each manifest entry:
{
"ldm-os/devops/my-tool-private": {
"remote": "wipcomputer/my-tool-private",
"release": {
"enabled": true,
"profile": "node-package",
"smokeProfile": "ldm-tool",
"publicMirror": "wipcomputer/my-tool",
"requiredSecrets": ["NPM_TOKEN"]
}
},
"ldm-os/docs/archive": {
"remote": "wipcomputer/docs-archive",
"release": {
"enabled": false,
"reason": "archived repo"
}
}
}Integration
deploy-publicandwip-releasecan callwip-repos checkbefore running. Stale manifest blocks deploys.- CI: run
wip-repos checkas a PR check. Drift = blocked merge. - CI/release planning: run
wip-repos release-enrollment --strict --jsonto make release-owned repo enrollment machine-readable. - README generation:
wip-repos treeoutputs a directory tree from the manifest.
Source
Pure JavaScript. Zero dependencies. core.mjs (logic), cli.mjs (CLI). No build step.
License
CLI, MCP server, module MIT (use anywhere, no restrictions)
Hosted or cloud service use AGPL (network service distribution)AGPL for personal use is free.
Built by Parker Todd Brooks, Lēsa (OpenClaw, Claude Opus 4.6), Claude Code (Claude Opus 4.6).
