Merge branch 'benvin/scaffold' into benvin/release-pipeline

This commit is contained in:
2026-09-09 22:35:10 +10:00
3 changed files with 32 additions and 17 deletions
+19 -11
View File
@@ -1,13 +1,15 @@
# arti-pack
A Neovim plugin manager that installs plugins from an artifact store instead of
git. It downloads tagged upstream source archives through
[artifactapi](https://artifactapi.k8s.syd1.au.unkin.net) and unpacks them into
Neovim's native package path — see `:h packages`.
A Neovim plugin manager that installs plugins from an artifact repository
instead of git. It downloads tagged upstream source archives over HTTP and
unpacks them into Neovim's native package path — see `:h packages`.
No git, no submodules, no network access to GitHub from the editor: every
plugin arrives as a cached, immutable, tagged artifact from the same proxy that
serves RPMs, containers and Terraform providers.
It works with any HTTP artifact repository that serves an upstream tag archive
at a stable URL — a JFrog Artifactory remote GitHub repository, or any caching
proxy with the same path shape. Nothing is cloned, no git binary is needed, and
the editor never has to reach GitHub: every plugin arrives as a cached,
immutable, versioned artifact from the same store your builds already pull
from.
## Requirements
@@ -42,7 +44,7 @@ Once installed it can carry itself, since `url` bypasses the registry:
```lua
require('arti-pack').setup({
registry = 'https://artifactapi.k8s.syd1.au.unkin.net/api/v1/remote/github',
registry = 'https://artifacts.example.com/artifactory/github-remote',
plugins = {
{ 'nvim-lua/plenary.nvim', tag = 'v0.1.4' },
{ 'folke/which-key.nvim', tag = 'v3.13.3', opt = true },
@@ -52,6 +54,9 @@ require('arti-pack').setup({
})
```
`registry` is the one option you have to set: the URL prefix your artifact
repository serves upstream tag archives under.
Every plugin needs an explicit `tag` — that is the point. Plugins install to
`stdpath('data')/site/pack/arti-pack/start/<name>`, or `.../opt/<name>` when
`opt = true`.
@@ -71,7 +76,7 @@ Every plugin needs an explicit `tag` — that is the point. Plugins install to
| Option | Default | Meaning |
| ------------- | ------- | ------------------------------------------- |
| `registry` | the estate artifactapi github remote | Proxy prefix placed in front of `owner/repo` |
| `registry` | *site-specific* | Archive URL prefix placed in front of `owner/repo` |
| `auto_sync` | `true` | Sync missing and changed plugins on startup |
| `concurrency` | `4` | Plugins downloaded in parallel |
| `timeout` | `120` | Per-download timeout in seconds |
@@ -91,12 +96,15 @@ Every plugin needs an explicit `tag` — that is the point. Plugins install to
<registry>/<owner>/<repo>/archive/refs/tags/<tag>.<ext>
```
which for the defaults is
which for the example above is
```
https://artifactapi.k8s.syd1.au.unkin.net/api/v1/remote/github/nvim-lua/plenary.nvim/archive/refs/tags/v0.1.4.zip
https://artifacts.example.com/artifactory/github-remote/nvim-lua/plenary.nvim/archive/refs/tags/v0.1.4.zip
```
That is GitHub's own tag-archive path shape, so a remote repository proxying
`github.com` resolves it unchanged.
Archives are cached under `stdpath('cache')/arti-pack`, checked for a real zip
or gzip magic header before being trusted, and unpacked into a staging
directory. Tag archives wrap their contents in a single `<repo>-<version>`
+12 -5
View File
@@ -12,9 +12,14 @@ CONTENTS *arti-pack-contents*
==============================================================================
1. INTRODUCTION *arti-pack-introduction*
arti-pack installs plugins from tagged upstream source archives served through
artifactapi, and unpacks them into Neovim's native package path. See |packages|
for how Neovim loads what arti-pack writes.
arti-pack installs plugins from tagged upstream source archives served over
HTTP by an artifact repository, and unpacks them into Neovim's native package
path. See |packages| for how Neovim loads what arti-pack writes.
Any artifact repository that serves an upstream tag archive at a stable URL
works — a JFrog Artifactory remote GitHub repository, or any caching proxy
with the same path shape. Nothing is cloned and the editor never reaches
GitHub itself.
Requires curl, and unzip or tar.
@@ -24,7 +29,7 @@ Requires curl, and unzip or tar.
*arti-pack.setup()*
>lua
require('arti-pack').setup({
registry = 'https://artifactapi.k8s.syd1.au.unkin.net/api/v1/remote/github',
registry = 'https://artifacts.example.com/artifactory/github-remote',
plugins = {
{ 'nvim-lua/plenary.nvim', tag = 'v0.1.4' },
{ 'folke/which-key.nvim', tag = 'v3.13.3', opt = true },
@@ -33,7 +38,9 @@ Requires curl, and unzip or tar.
<
Options:
registry Proxy prefix placed in front of "owner/repo".
registry Archive URL prefix placed in front of "owner/repo". The
shipped default is site-specific; set it to your own
artifact repository.
plugins List of plugin specs. See |arti-pack-specs|.
auto_sync Sync missing and changed plugins on startup. Default true.
concurrency Plugins downloaded in parallel. Default 4.
+1 -1
View File
@@ -1,7 +1,7 @@
local t = require('tests.harness')
local spec = require('arti-pack.spec')
local REGISTRY = 'https://artifactapi.k8s.syd1.au.unkin.net/api/v1/remote/github'
local REGISTRY = 'https://artifacts.example.com/artifactory/github-remote'
t.describe('spec.parse', function()
t.it('parses a full table spec', function()