@kamaras/venpm 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +204 -0
- package/actions/publish-index/action.yml +50 -0
- package/dist/cli/config-cmd.d.ts +3 -0
- package/dist/cli/config-cmd.d.ts.map +1 -0
- package/dist/cli/config-cmd.js +101 -0
- package/dist/cli/config-cmd.js.map +1 -0
- package/dist/cli/context.d.ts +3 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +153 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/create.d.ts +23 -0
- package/dist/cli/create.d.ts.map +1 -0
- package/dist/cli/create.js +230 -0
- package/dist/cli/create.js.map +1 -0
- package/dist/cli/doctor.d.ts +3 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +68 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/info.d.ts +5 -0
- package/dist/cli/info.d.ts.map +1 -0
- package/dist/cli/info.js +105 -0
- package/dist/cli/info.js.map +1 -0
- package/dist/cli/install.d.ts +5 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +252 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/list.d.ts +5 -0
- package/dist/cli/list.d.ts.map +1 -0
- package/dist/cli/list.js +41 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/rebuild.d.ts +3 -0
- package/dist/cli/rebuild.d.ts.map +1 -0
- package/dist/cli/rebuild.js +84 -0
- package/dist/cli/rebuild.js.map +1 -0
- package/dist/cli/repo.d.ts +3 -0
- package/dist/cli/repo.d.ts.map +1 -0
- package/dist/cli/repo.js +93 -0
- package/dist/cli/repo.js.map +1 -0
- package/dist/cli/search.d.ts +5 -0
- package/dist/cli/search.d.ts.map +1 -0
- package/dist/cli/search.js +50 -0
- package/dist/cli/search.js.map +1 -0
- package/dist/cli/uninstall.d.ts +5 -0
- package/dist/cli/uninstall.d.ts.map +1 -0
- package/dist/cli/uninstall.js +68 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/update.d.ts +5 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +156 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/validate.d.ts +3 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +99 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/core/builder.d.ts +32 -0
- package/dist/core/builder.d.ts.map +1 -0
- package/dist/core/builder.js +76 -0
- package/dist/core/builder.js.map +1 -0
- package/dist/core/cache.d.ts +17 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +36 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/config.d.ts +7 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +32 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/detect.d.ts +28 -0
- package/dist/core/detect.d.ts.map +1 -0
- package/dist/core/detect.js +100 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/fetcher.d.ts +21 -0
- package/dist/core/fetcher.d.ts.map +1 -0
- package/dist/core/fetcher.js +92 -0
- package/dist/core/fetcher.js.map +1 -0
- package/dist/core/json.d.ts +9 -0
- package/dist/core/json.d.ts.map +1 -0
- package/dist/core/json.js +10 -0
- package/dist/core/json.js.map +1 -0
- package/dist/core/lockfile.d.ts +9 -0
- package/dist/core/lockfile.d.ts.map +1 -0
- package/dist/core/lockfile.js +30 -0
- package/dist/core/lockfile.js.map +1 -0
- package/dist/core/log.d.ts +8 -0
- package/dist/core/log.d.ts.map +1 -0
- package/dist/core/log.js +24 -0
- package/dist/core/log.js.map +1 -0
- package/dist/core/paths.d.ts +4 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +33 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/prompt.d.ts +6 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +78 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/registry.d.ts +52 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +134 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/resolver.d.ts +47 -0
- package/dist/core/resolver.d.ts.map +1 -0
- package/dist/core/resolver.js +153 -0
- package/dist/core/resolver.js.map +1 -0
- package/dist/core/schema.d.ts +8 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +47 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/types.d.ts +208 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -6
- package/schemas/v1/config.schema.json +53 -0
- package/schemas/v1/lockfile.schema.json +43 -0
- package/schemas/v1/plugins.schema.json +69 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 kamaras
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://venpm.dev/logo.svg" alt="venpm" width="80" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">venpm</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>The package manager for Vencord userplugins.</strong><br/>
|
|
9
|
+
Install, update, and manage plugins from decentralized JSON indexes.
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
<a href="https://www.npmjs.com/package/@kamaras/venpm"><img src="https://img.shields.io/npm/v/@kamaras/venpm?color=f97316&label=npm" alt="npm version" /></a>
|
|
14
|
+
<a href="https://github.com/theokyr/venpm/actions"><img src="https://img.shields.io/github/actions/workflow/status/theokyr/venpm/ci.yml?label=tests&color=34d399" alt="CI" /></a>
|
|
15
|
+
<a href="https://venpm.dev"><img src="https://img.shields.io/badge/docs-venpm.dev-f97316" alt="docs" /></a>
|
|
16
|
+
<a href="https://github.com/theokyr/venpm/blob/master/LICENSE"><img src="https://img.shields.io/github/license/theokyr/venpm?color=94a3b8" alt="license" /></a>
|
|
17
|
+
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D18-94a3b8" alt="node >= 18" /></a>
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Why venpm?
|
|
23
|
+
|
|
24
|
+
Vencord's userplugin ecosystem is powerful but fragmented. Plugin authors host code in personal repos, users manually clone and rebuild, and there's no dependency resolution, no update tracking, and no discoverability.
|
|
25
|
+
|
|
26
|
+
**venpm fixes this.** Authors publish a small `plugins.json` index alongside their code. Users install plugins with a single command. venpm handles dependencies, version pinning, sparse git checkouts, and Vencord rebuilds automatically.
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
venpm install minimalCallBar
|
|
30
|
+
Resolved minimalCallBar@0.1.0 from kamaras-plugins
|
|
31
|
+
Optional: settingsHub, channelTabs (install with venpm install <name>)
|
|
32
|
+
Fetching via git (sparse checkout)...
|
|
33
|
+
Installed minimalCallBar@0.1.0
|
|
34
|
+
Rebuilding Vencord... done
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Install
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install -g @kamaras/venpm
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Or run without installing:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npx @kamaras/venpm doctor
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Quick Start
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Check your environment
|
|
53
|
+
venpm doctor
|
|
54
|
+
|
|
55
|
+
# Point venpm at your Vencord install
|
|
56
|
+
venpm config set vencord.path ~/Vencord
|
|
57
|
+
|
|
58
|
+
# Add a plugin repository
|
|
59
|
+
venpm repo add https://example.com/plugins.json
|
|
60
|
+
|
|
61
|
+
# Find and install plugins
|
|
62
|
+
venpm search betterFolders
|
|
63
|
+
venpm install BetterFolders
|
|
64
|
+
venpm list
|
|
65
|
+
venpm update
|
|
66
|
+
venpm rebuild
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Commands
|
|
70
|
+
|
|
71
|
+
| Command | Description |
|
|
72
|
+
|---------|-------------|
|
|
73
|
+
| `venpm install <plugin>` | Install a plugin and its dependencies |
|
|
74
|
+
| `venpm uninstall <plugin>` | Remove a plugin (warns about reverse deps) |
|
|
75
|
+
| `venpm update [plugin]` | Update one or all plugins |
|
|
76
|
+
| `venpm list` | Show installed plugins |
|
|
77
|
+
| `venpm search <query>` | Search across all configured repos |
|
|
78
|
+
| `venpm info <plugin>` | Show plugin details |
|
|
79
|
+
| `venpm repo add\|remove\|list` | Manage plugin index repositories |
|
|
80
|
+
| `venpm config set\|get\|path` | View or edit venpm configuration |
|
|
81
|
+
| `venpm create <path>` | Scaffold a new plugin repo or plugin |
|
|
82
|
+
| `venpm rebuild` | Rebuild Vencord after changes |
|
|
83
|
+
| `venpm doctor` | Diagnose environment issues |
|
|
84
|
+
| `venpm validate [path]` | Validate a `plugins.json` index file |
|
|
85
|
+
|
|
86
|
+
**Global flags:** `--yes` (auto-confirm), `--verbose`, `--quiet`, `--json` (structured output)
|
|
87
|
+
|
|
88
|
+
## How It Works
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
Author User
|
|
92
|
+
------ ----
|
|
93
|
+
plugins.json ──publish──> venpm repo add <url>
|
|
94
|
+
| |
|
|
95
|
+
v v
|
|
96
|
+
GitHub / any URL venpm install <plugin>
|
|
97
|
+
|
|
|
98
|
+
resolve deps
|
|
99
|
+
fetch (git sparse checkout / tarball)
|
|
100
|
+
update lockfile
|
|
101
|
+
rebuild Vencord
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
1. **Authors** publish a [`plugins.json`](https://venpm.dev/author/plugin-index) index file — a JSON document describing their plugins, versions, and sources.
|
|
105
|
+
2. **Users** register that URL with `venpm repo add`.
|
|
106
|
+
3. **venpm** resolves the full dependency graph, fetches via git (with sparse checkout for monorepos) or tarball, updates the lockfile, and optionally rebuilds Vencord.
|
|
107
|
+
|
|
108
|
+
## For Plugin Authors
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# Scaffold a new plugin repository
|
|
112
|
+
venpm create my-plugins
|
|
113
|
+
|
|
114
|
+
# Scaffold a plugin inside an existing repo
|
|
115
|
+
venpm create my-plugins/MyPlugin
|
|
116
|
+
|
|
117
|
+
# Validate your index before publishing
|
|
118
|
+
venpm validate plugins.json --strict
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
venpm ships a **GitHub Action** for automated index publishing:
|
|
122
|
+
|
|
123
|
+
```yaml
|
|
124
|
+
- uses: theokyr/venpm/actions/publish-index@master
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
See the [Author Guide](https://venpm.dev/author/your-first-plugin) for the full walkthrough.
|
|
128
|
+
|
|
129
|
+
### Plugin Index Spec
|
|
130
|
+
|
|
131
|
+
The [JSON Schema](https://venpm.dev/schemas/v1/plugins.json) defines the index format. Key features:
|
|
132
|
+
|
|
133
|
+
- **Dependencies & optional dependencies** with automatic resolution
|
|
134
|
+
- **Monorepo support** via `source.git` + `source.path` (sparse checkout)
|
|
135
|
+
- **Multiple source types:** git, tarball, local symlink
|
|
136
|
+
- **Version pinning** with `versions` map of tag/tarball pairs
|
|
137
|
+
- **Informational constraints** for Discord and Vencord versions
|
|
138
|
+
|
|
139
|
+
## Architecture
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
src/
|
|
143
|
+
core/ Pure logic + I/O interfaces (never imports from cli/)
|
|
144
|
+
types.ts All interfaces: IOContext, PluginIndex, Config, Lockfile
|
|
145
|
+
resolver.ts Version resolution, dependency graph, topological sort
|
|
146
|
+
registry.ts Fetch + parse + cache plugin indexes
|
|
147
|
+
fetcher.ts Git clone (sparse checkout), tarball extract, local symlink
|
|
148
|
+
builder.ts Vencord pnpm build, deploy, Discord restart
|
|
149
|
+
... config, lockfile, schema, detect, cache, paths, prompt, log
|
|
150
|
+
cli/ Command handlers (compose core modules)
|
|
151
|
+
context.ts createRealIOContext() — wires real Node.js I/O
|
|
152
|
+
install.ts uninstall.ts update.ts list.ts search.ts ...
|
|
153
|
+
index.ts CLI entry point (commander)
|
|
154
|
+
schemas/v1/ JSON Schemas — the primary deliverable
|
|
155
|
+
actions/ GitHub Action for plugin repo authors
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Design principle:** All I/O is injected via `IOContext` — filesystem, HTTP, git, shell, prompts, logging. Core modules never import `fs`, `fetch`, or `child_process` directly. This makes the entire core testable with pure mocks.
|
|
159
|
+
|
|
160
|
+
## Development
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
git clone https://github.com/theokyr/venpm.git && cd venpm
|
|
164
|
+
node scripts/setup.mjs # install, build, link globally
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
npm run dev # watch mode (live global updates)
|
|
169
|
+
npm test # 240 tests
|
|
170
|
+
npm run lint # type check (tsc --noEmit)
|
|
171
|
+
npm run build # one-shot compile
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Test Suite
|
|
175
|
+
|
|
176
|
+
240 tests across three layers:
|
|
177
|
+
|
|
178
|
+
| Layer | What it tests |
|
|
179
|
+
|-------|---------------|
|
|
180
|
+
| **Unit** | Pure functions — resolver, registry, config, lockfile, schema, detect, cache |
|
|
181
|
+
| **Integration** | Full command flows with mocked IOContext |
|
|
182
|
+
| **E2E** | Compiled CLI as a subprocess against real temp directories |
|
|
183
|
+
|
|
184
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for development guidelines.
|
|
185
|
+
|
|
186
|
+
## Config & State
|
|
187
|
+
|
|
188
|
+
venpm stores configuration in a single XDG-compliant directory:
|
|
189
|
+
|
|
190
|
+
| OS | Path |
|
|
191
|
+
|----|------|
|
|
192
|
+
| Linux | `~/.config/venpm/` |
|
|
193
|
+
| macOS | `~/Library/Application Support/venpm/` |
|
|
194
|
+
| Windows | `%APPDATA%\venpm\` |
|
|
195
|
+
|
|
196
|
+
Files: `config.json`, `venpm-lock.json`, `index-cache.json`
|
|
197
|
+
|
|
198
|
+
## Documentation
|
|
199
|
+
|
|
200
|
+
Full documentation at **[venpm.dev](https://venpm.dev)** — guides, author documentation, API reference, and TypeDoc-generated internals.
|
|
201
|
+
|
|
202
|
+
## License
|
|
203
|
+
|
|
204
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: "venpm Publish Index"
|
|
2
|
+
description: "Validate and publish a venpm plugin index as a GitHub Release"
|
|
3
|
+
|
|
4
|
+
inputs:
|
|
5
|
+
index-path:
|
|
6
|
+
description: "Path to plugins.json"
|
|
7
|
+
required: false
|
|
8
|
+
default: "plugins.json"
|
|
9
|
+
strict:
|
|
10
|
+
description: "Run strict validation (check URLs, deps)"
|
|
11
|
+
required: false
|
|
12
|
+
default: "true"
|
|
13
|
+
|
|
14
|
+
runs:
|
|
15
|
+
using: "composite"
|
|
16
|
+
steps:
|
|
17
|
+
- name: Setup Node.js
|
|
18
|
+
uses: actions/setup-node@v4
|
|
19
|
+
with:
|
|
20
|
+
node-version: "18"
|
|
21
|
+
|
|
22
|
+
- name: Validate index
|
|
23
|
+
shell: bash
|
|
24
|
+
run: |
|
|
25
|
+
STRICT_FLAG=""
|
|
26
|
+
if [ "${{ inputs.strict }}" = "true" ]; then
|
|
27
|
+
STRICT_FLAG="--strict"
|
|
28
|
+
fi
|
|
29
|
+
npx venpm validate "${{ inputs.index-path }}" $STRICT_FLAG
|
|
30
|
+
|
|
31
|
+
- name: Create plugin tarballs
|
|
32
|
+
shell: bash
|
|
33
|
+
run: |
|
|
34
|
+
PLUGINS_DIR=$(dirname "${{ inputs.index-path }}")/plugins
|
|
35
|
+
if [ -d "$PLUGINS_DIR" ]; then
|
|
36
|
+
mkdir -p dist
|
|
37
|
+
for plugin_dir in "$PLUGINS_DIR"/*/; do
|
|
38
|
+
plugin_name=$(basename "$plugin_dir")
|
|
39
|
+
tar -czf "dist/${plugin_name}.tar.gz" -C "$PLUGINS_DIR" "$plugin_name"
|
|
40
|
+
echo "Created dist/${plugin_name}.tar.gz"
|
|
41
|
+
done
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
- name: Upload artifacts
|
|
45
|
+
uses: actions/upload-artifact@v4
|
|
46
|
+
with:
|
|
47
|
+
name: venpm-release
|
|
48
|
+
path: |
|
|
49
|
+
${{ inputs.index-path }}
|
|
50
|
+
dist/*.tar.gz
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-cmd.d.ts","sourceRoot":"","sources":["../../src/cli/config-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0CzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiE5D"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { loadConfig, saveConfig } from "../core/config.js";
|
|
2
|
+
import { getConfigPath, getConfigDir } from "../core/paths.js";
|
|
3
|
+
import { jsonSuccess, jsonError, writeJson } from "../core/json.js";
|
|
4
|
+
import { createRealIOContext } from "./context.js";
|
|
5
|
+
function getNestedValue(obj, keys) {
|
|
6
|
+
let current = obj;
|
|
7
|
+
for (const key of keys) {
|
|
8
|
+
if (current === null || current === undefined || typeof current !== "object") {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
current = current[key];
|
|
12
|
+
}
|
|
13
|
+
return current;
|
|
14
|
+
}
|
|
15
|
+
function setNestedValue(obj, keys, value) {
|
|
16
|
+
let current = obj;
|
|
17
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
18
|
+
const key = keys[i];
|
|
19
|
+
if (current[key] === null || current[key] === undefined || typeof current[key] !== "object") {
|
|
20
|
+
current[key] = {};
|
|
21
|
+
}
|
|
22
|
+
current = current[key];
|
|
23
|
+
}
|
|
24
|
+
current[keys[keys.length - 1]] = value;
|
|
25
|
+
}
|
|
26
|
+
function coerceValue(raw) {
|
|
27
|
+
if (raw === "null")
|
|
28
|
+
return null;
|
|
29
|
+
if (raw === "true")
|
|
30
|
+
return true;
|
|
31
|
+
if (raw === "false")
|
|
32
|
+
return false;
|
|
33
|
+
// Try JSON parse for numbers/arrays/objects
|
|
34
|
+
try {
|
|
35
|
+
return JSON.parse(raw);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return raw;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function registerConfigCommand(program) {
|
|
42
|
+
const config = program
|
|
43
|
+
.command("config")
|
|
44
|
+
.description("View or edit venpm configuration");
|
|
45
|
+
config
|
|
46
|
+
.command("set <key> <value>")
|
|
47
|
+
.description("Set a configuration value (dotted key path)")
|
|
48
|
+
.action(async (key, value) => {
|
|
49
|
+
const parentOpts = program.opts();
|
|
50
|
+
const ctx = createRealIOContext(parentOpts);
|
|
51
|
+
const configPath = parentOpts.config ?? getConfigPath();
|
|
52
|
+
const cfg = await loadConfig(ctx.fs, configPath);
|
|
53
|
+
const keys = key.split(".");
|
|
54
|
+
const coerced = coerceValue(value);
|
|
55
|
+
setNestedValue(cfg, keys, coerced);
|
|
56
|
+
await saveConfig(ctx.fs, configPath, cfg);
|
|
57
|
+
if (parentOpts.json) {
|
|
58
|
+
writeJson(jsonSuccess({ key, value: coerced }));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
ctx.logger.success(`Set ${key} = ${JSON.stringify(coerced)}`);
|
|
62
|
+
});
|
|
63
|
+
config
|
|
64
|
+
.command("get <key>")
|
|
65
|
+
.description("Get a configuration value (dotted key path)")
|
|
66
|
+
.action(async (key) => {
|
|
67
|
+
const parentOpts = program.opts();
|
|
68
|
+
const ctx = createRealIOContext(parentOpts);
|
|
69
|
+
const configPath = parentOpts.config ?? getConfigPath();
|
|
70
|
+
const cfg = await loadConfig(ctx.fs, configPath);
|
|
71
|
+
const keys = key.split(".");
|
|
72
|
+
const value = getNestedValue(cfg, keys);
|
|
73
|
+
if (value === undefined) {
|
|
74
|
+
if (parentOpts.json) {
|
|
75
|
+
writeJson(jsonError(`Key "${key}" not found in config`));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
ctx.logger.error(`Key "${key}" not found in config`);
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (parentOpts.json) {
|
|
83
|
+
writeJson(jsonSuccess({ key, value }));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
ctx.logger.info(JSON.stringify(value, null, 2));
|
|
87
|
+
});
|
|
88
|
+
config
|
|
89
|
+
.command("path")
|
|
90
|
+
.description("Print the venpm config directory path")
|
|
91
|
+
.action(() => {
|
|
92
|
+
const parentOpts = program.opts();
|
|
93
|
+
if (parentOpts.json) {
|
|
94
|
+
writeJson(jsonSuccess({ path: getConfigDir() }));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const ctx = createRealIOContext(parentOpts);
|
|
98
|
+
ctx.logger.info(getConfigDir());
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=config-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-cmd.js","sourceRoot":"","sources":["../../src/cli/config-cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAkD,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,CAgKrE"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { execFile as _execFile, spawn as _spawn } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import * as fsPromises from "node:fs/promises";
|
|
4
|
+
import { createPrompter } from "../core/prompt.js";
|
|
5
|
+
import { createLogger } from "../core/log.js";
|
|
6
|
+
const execFileAsync = promisify(_execFile);
|
|
7
|
+
export function createRealIOContext(options) {
|
|
8
|
+
const fs = {
|
|
9
|
+
async readFile(path, encoding) {
|
|
10
|
+
return fsPromises.readFile(path, { encoding });
|
|
11
|
+
},
|
|
12
|
+
async writeFile(path, data, encoding) {
|
|
13
|
+
return fsPromises.writeFile(path, data, { encoding: encoding ?? "utf8" });
|
|
14
|
+
},
|
|
15
|
+
async exists(path) {
|
|
16
|
+
try {
|
|
17
|
+
await fsPromises.access(path);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
async mkdir(path, opts) {
|
|
25
|
+
await fsPromises.mkdir(path, opts);
|
|
26
|
+
},
|
|
27
|
+
async rm(path, opts) {
|
|
28
|
+
await fsPromises.rm(path, opts);
|
|
29
|
+
},
|
|
30
|
+
async symlink(target, path) {
|
|
31
|
+
return fsPromises.symlink(target, path);
|
|
32
|
+
},
|
|
33
|
+
async readlink(path) {
|
|
34
|
+
return fsPromises.readlink(path);
|
|
35
|
+
},
|
|
36
|
+
async readdir(path) {
|
|
37
|
+
return fsPromises.readdir(path);
|
|
38
|
+
},
|
|
39
|
+
async stat(path) {
|
|
40
|
+
return fsPromises.stat(path);
|
|
41
|
+
},
|
|
42
|
+
async lstat(path) {
|
|
43
|
+
return fsPromises.lstat(path);
|
|
44
|
+
},
|
|
45
|
+
async copyDir(src, dest) {
|
|
46
|
+
await fsPromises.cp(src, dest, { recursive: true });
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
const http = {
|
|
50
|
+
async fetch(url, fetchOptions) {
|
|
51
|
+
const res = await globalThis.fetch(url, { headers: fetchOptions?.headers });
|
|
52
|
+
return {
|
|
53
|
+
ok: res.ok,
|
|
54
|
+
status: res.status,
|
|
55
|
+
headers: res.headers,
|
|
56
|
+
text: () => res.text(),
|
|
57
|
+
json: () => res.json(),
|
|
58
|
+
arrayBuffer: () => res.arrayBuffer(),
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
const git = {
|
|
63
|
+
async available() {
|
|
64
|
+
try {
|
|
65
|
+
await execFileAsync("git", ["--version"]);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
async clone(url, dest, cloneOptions) {
|
|
73
|
+
const args = ["clone", "--filter=blob:none"];
|
|
74
|
+
if (cloneOptions?.sparse && cloneOptions.sparse.length > 0) {
|
|
75
|
+
args.push("--sparse");
|
|
76
|
+
}
|
|
77
|
+
if (cloneOptions?.branch) {
|
|
78
|
+
args.push("--branch", cloneOptions.branch);
|
|
79
|
+
}
|
|
80
|
+
if (cloneOptions?.depth !== undefined) {
|
|
81
|
+
args.push("--depth", String(cloneOptions.depth));
|
|
82
|
+
}
|
|
83
|
+
args.push(url, dest);
|
|
84
|
+
await execFileAsync("git", args);
|
|
85
|
+
if (cloneOptions?.sparse && cloneOptions.sparse.length > 0) {
|
|
86
|
+
await execFileAsync("git", ["-C", dest, "sparse-checkout", "set", ...cloneOptions.sparse]);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
async pull(repoPath) {
|
|
90
|
+
await execFileAsync("git", ["-C", repoPath, "pull"]);
|
|
91
|
+
},
|
|
92
|
+
async revParse(repoPath, ref) {
|
|
93
|
+
const { stdout } = await execFileAsync("git", ["-C", repoPath, "rev-parse", ref]);
|
|
94
|
+
return stdout.trim();
|
|
95
|
+
},
|
|
96
|
+
async checkout(repoPath, ref) {
|
|
97
|
+
await execFileAsync("git", ["-C", repoPath, "checkout", ref]);
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
const shell = {
|
|
101
|
+
async exec(cmd, args, execOptions) {
|
|
102
|
+
try {
|
|
103
|
+
const { stdout, stderr } = await execFileAsync(cmd, args, {
|
|
104
|
+
cwd: execOptions?.cwd,
|
|
105
|
+
env: execOptions?.env ? { ...process.env, ...execOptions.env } : undefined,
|
|
106
|
+
});
|
|
107
|
+
return { stdout: stdout ?? "", stderr: stderr ?? "", exitCode: 0 };
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
const e = err;
|
|
111
|
+
return {
|
|
112
|
+
stdout: e.stdout ?? "",
|
|
113
|
+
stderr: e.stderr ?? "",
|
|
114
|
+
exitCode: e.code ?? 1,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
async spawn(cmd, args, spawnOptions) {
|
|
119
|
+
return new Promise((resolve, reject) => {
|
|
120
|
+
const child = _spawn(cmd, args, {
|
|
121
|
+
cwd: spawnOptions?.cwd,
|
|
122
|
+
detached: spawnOptions?.detached,
|
|
123
|
+
env: spawnOptions?.env ? { ...process.env, ...spawnOptions.env } : undefined,
|
|
124
|
+
stdio: "inherit",
|
|
125
|
+
});
|
|
126
|
+
if (spawnOptions?.detached) {
|
|
127
|
+
child.unref();
|
|
128
|
+
resolve();
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
child.on("close", (code) => {
|
|
132
|
+
if (code === 0)
|
|
133
|
+
resolve();
|
|
134
|
+
else
|
|
135
|
+
reject(new Error(`${cmd} exited with code ${code}`));
|
|
136
|
+
});
|
|
137
|
+
child.on("error", reject);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
const nonInteractive = !process.stdin.isTTY && !options.yes && !options.json;
|
|
143
|
+
const prompter = createPrompter({
|
|
144
|
+
yes: options.yes || options.json || false,
|
|
145
|
+
nonInteractive,
|
|
146
|
+
});
|
|
147
|
+
const logger = createLogger({
|
|
148
|
+
verbose: options.verbose ?? false,
|
|
149
|
+
quiet: options.quiet ?? false,
|
|
150
|
+
});
|
|
151
|
+
return { fs, http, git, shell, prompter, logger };
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { FileSystem, IOContext, GlobalOptions } from "../core/types.js";
|
|
3
|
+
export interface CreateOptions extends GlobalOptions {
|
|
4
|
+
tsx?: boolean;
|
|
5
|
+
css?: boolean;
|
|
6
|
+
native?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Walk up ancestor directories from startPath looking for a plugins.json whose
|
|
10
|
+
* $schema contains "venpm". Returns { path, data } if found, null otherwise.
|
|
11
|
+
*/
|
|
12
|
+
export declare function findAncestorIndex(fs: FileSystem, startPath: string): Promise<{
|
|
13
|
+
path: string;
|
|
14
|
+
data: Record<string, unknown>;
|
|
15
|
+
} | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Walk up ancestor directories from targetPath looking for a venpm plugins.json.
|
|
18
|
+
* Returns "plugin" if found, "repo" otherwise.
|
|
19
|
+
*/
|
|
20
|
+
export declare function detectCreateMode(fs: FileSystem, targetPath: string): Promise<"repo" | "plugin">;
|
|
21
|
+
export declare function executeCreate(ctx: IOContext, targetPath: string, options: CreateOptions): Promise<void>;
|
|
22
|
+
export declare function registerCreateCommand(program: Command): void;
|
|
23
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/cli/create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAM7E,MAAM,WAAW,aAAc,SAAQ,aAAa;IAChD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAID;;;GAGG;AACH,wBAAsB,iBAAiB,CACnC,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAAC,CAoBjE;AAID;;;GAGG;AACH,wBAAsB,gBAAgB,CAClC,EAAE,EAAE,UAAU,EACd,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAG5B;AAwLD,wBAAsB,aAAa,CAC/B,GAAG,EAAE,SAAS,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,GACvB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsB5D"}
|