A minimalist, transparent, decentralized package manager for Windows — and a language for describing installations.
Vine is not another winget/scoop/chocolatey. A Vine package is a plain-text .vine file: an ordered list of English-word instructions (download, extract, add_path, ...) that anyone can read and audit. There are no binaries to compile, no tarballs to unpack — a package is a text file, and a source is just a folder (a git repo, planned) full of them.
- Readable: every line is a self-explanatory command. No braces, no symbols, no hidden logic.
- Decentralized: anyone can host a source.
vine source add myrepo D:\myrepoand you're in business. No central index, no accounts. - Atomic: packages install into versioned directories (
packages\<name>-<version>-<hash>); a failed install or upgrade rolls back automatically, and the old version stays intact. - Self-contained: each package saves a copy of its own
.vinescript into its install directory, so uninstall always uses the logic of the exact installed version. - AI-friendly: the language is simple enough that AI can write and maintain packages in bulk.
# 1. Build (a single zero-dependency executable, needs MinGW g++ or similar)
g++ -std=c++17 -Wall src/main.cpp src/exec.cpp src/core.cpp src/inventory.cpp src/source.cpp src/install.cpp src/json.cpp -o build/vine.exe
# 2. Add a source (a folder containing .vine files + manifest.json)
vine source add demo D:\vine\test_repo
# 3. Refresh the local cache
vine update
# 4. Find and install something
vine search node
vine install nodejs
# 5. See what's installed
vine inventoryThat's the whole loop. vine remove nodejs uninstalls; vine upgrade updates everything (after vine update).
vine install <pkg> Install a package
vine remove <pkg> Remove a package
vine upgrade [pkg] Upgrade one package, or all without an argument
vine search <query> Search packages in cached sources
vine source add <name> <path> Add a folder source
vine source remove <name> Remove a source
vine source list List sources
vine update Refresh all source caches
vine inventory List installed packages
vine <block_name> <file_path> Execute one block of a script directly
name 7zip-portable
version 24.08
block install
mkdir $install_dir
download https://www.7-zip.org/a/7z2408-x64.zip $install_dir\7z.zip
check $install_dir\7z.zip 57f71ab3652e797d84acddc79c81cc9ff1c6ddb2a1974cdb83f00fee9bff4c73
extract $install_dir\7z.zip $install_dir
add_path $install_dir
end_block
block remove
rm_path $install_dir
del_dir $install_dir
end_block
- One instruction per line;
#starts a comment;"..."is a string; no escaping, no nesting, no symbols. block <name>...end_block [name]groups instructions forinstall,upgrade,remove.$namesubstitutes variables; the manager injects$root,$install_dir,$pkg_nameand (during upgrades)$old_dir.install_dir <path>as a metadata line forces a fixed installation path instead of a versioned directory.
The complete language reference is in SPEC.md — the formal, implementation-independent specification (including the source format, the state-file schemas, and the atomicity guarantees).
%USERPROFILE%\.vine\ (override with the VINE_ROOT env var)
config.json your sources
inventory.json installed packages + file lists + PATH entries
sources\<name>\ cached copies of sources
packages\<name>-<version>-<hash>\ installed packages (versioned by content)
All state files are indented, human-readable JSON. Uninstalling a package deletes its inventory files list and PATH entries even if its remove script is imperfect.
test_repo/ is a working source with real packages (Node.js LTS, ripgrep) plus a test package. smp/ contains standalone example scripts.
The conformance suite lives in test/ — 56 checks covering every instruction, error codes, UTF-8, and the full install/upgrade/rollback/remove lifecycle:
pwsh test\run_tests.ps1Per the spec, any Vine executor should pass this suite unchanged.
vine.exe executor: GPLv3 (see LICENSE).
The Vine specification (SPEC.md) and example scripts: CC0 — copy, modify, redistribute freely.
Vine belongs to everyone who wants "simple installation". Contact: 2796442619@qq.com · GitHub: Zzc0595