@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.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +204 -0
  3. package/actions/publish-index/action.yml +50 -0
  4. package/dist/cli/config-cmd.d.ts +3 -0
  5. package/dist/cli/config-cmd.d.ts.map +1 -0
  6. package/dist/cli/config-cmd.js +101 -0
  7. package/dist/cli/config-cmd.js.map +1 -0
  8. package/dist/cli/context.d.ts +3 -0
  9. package/dist/cli/context.d.ts.map +1 -0
  10. package/dist/cli/context.js +153 -0
  11. package/dist/cli/context.js.map +1 -0
  12. package/dist/cli/create.d.ts +23 -0
  13. package/dist/cli/create.d.ts.map +1 -0
  14. package/dist/cli/create.js +230 -0
  15. package/dist/cli/create.js.map +1 -0
  16. package/dist/cli/doctor.d.ts +3 -0
  17. package/dist/cli/doctor.d.ts.map +1 -0
  18. package/dist/cli/doctor.js +68 -0
  19. package/dist/cli/doctor.js.map +1 -0
  20. package/dist/cli/info.d.ts +5 -0
  21. package/dist/cli/info.d.ts.map +1 -0
  22. package/dist/cli/info.js +105 -0
  23. package/dist/cli/info.js.map +1 -0
  24. package/dist/cli/install.d.ts +5 -0
  25. package/dist/cli/install.d.ts.map +1 -0
  26. package/dist/cli/install.js +252 -0
  27. package/dist/cli/install.js.map +1 -0
  28. package/dist/cli/list.d.ts +5 -0
  29. package/dist/cli/list.d.ts.map +1 -0
  30. package/dist/cli/list.js +41 -0
  31. package/dist/cli/list.js.map +1 -0
  32. package/dist/cli/rebuild.d.ts +3 -0
  33. package/dist/cli/rebuild.d.ts.map +1 -0
  34. package/dist/cli/rebuild.js +84 -0
  35. package/dist/cli/rebuild.js.map +1 -0
  36. package/dist/cli/repo.d.ts +3 -0
  37. package/dist/cli/repo.d.ts.map +1 -0
  38. package/dist/cli/repo.js +93 -0
  39. package/dist/cli/repo.js.map +1 -0
  40. package/dist/cli/search.d.ts +5 -0
  41. package/dist/cli/search.d.ts.map +1 -0
  42. package/dist/cli/search.js +50 -0
  43. package/dist/cli/search.js.map +1 -0
  44. package/dist/cli/uninstall.d.ts +5 -0
  45. package/dist/cli/uninstall.d.ts.map +1 -0
  46. package/dist/cli/uninstall.js +68 -0
  47. package/dist/cli/uninstall.js.map +1 -0
  48. package/dist/cli/update.d.ts +5 -0
  49. package/dist/cli/update.d.ts.map +1 -0
  50. package/dist/cli/update.js +156 -0
  51. package/dist/cli/update.js.map +1 -0
  52. package/dist/cli/validate.d.ts +3 -0
  53. package/dist/cli/validate.d.ts.map +1 -0
  54. package/dist/cli/validate.js +99 -0
  55. package/dist/cli/validate.js.map +1 -0
  56. package/dist/core/builder.d.ts +32 -0
  57. package/dist/core/builder.d.ts.map +1 -0
  58. package/dist/core/builder.js +76 -0
  59. package/dist/core/builder.js.map +1 -0
  60. package/dist/core/cache.d.ts +17 -0
  61. package/dist/core/cache.d.ts.map +1 -0
  62. package/dist/core/cache.js +36 -0
  63. package/dist/core/cache.js.map +1 -0
  64. package/dist/core/config.d.ts +7 -0
  65. package/dist/core/config.d.ts.map +1 -0
  66. package/dist/core/config.js +32 -0
  67. package/dist/core/config.js.map +1 -0
  68. package/dist/core/detect.d.ts +28 -0
  69. package/dist/core/detect.d.ts.map +1 -0
  70. package/dist/core/detect.js +100 -0
  71. package/dist/core/detect.js.map +1 -0
  72. package/dist/core/fetcher.d.ts +21 -0
  73. package/dist/core/fetcher.d.ts.map +1 -0
  74. package/dist/core/fetcher.js +92 -0
  75. package/dist/core/fetcher.js.map +1 -0
  76. package/dist/core/json.d.ts +9 -0
  77. package/dist/core/json.d.ts.map +1 -0
  78. package/dist/core/json.js +10 -0
  79. package/dist/core/json.js.map +1 -0
  80. package/dist/core/lockfile.d.ts +9 -0
  81. package/dist/core/lockfile.d.ts.map +1 -0
  82. package/dist/core/lockfile.js +30 -0
  83. package/dist/core/lockfile.js.map +1 -0
  84. package/dist/core/log.d.ts +8 -0
  85. package/dist/core/log.d.ts.map +1 -0
  86. package/dist/core/log.js +24 -0
  87. package/dist/core/log.js.map +1 -0
  88. package/dist/core/paths.d.ts +4 -0
  89. package/dist/core/paths.d.ts.map +1 -0
  90. package/dist/core/paths.js +33 -0
  91. package/dist/core/paths.js.map +1 -0
  92. package/dist/core/prompt.d.ts +6 -0
  93. package/dist/core/prompt.d.ts.map +1 -0
  94. package/dist/core/prompt.js +78 -0
  95. package/dist/core/prompt.js.map +1 -0
  96. package/dist/core/registry.d.ts +52 -0
  97. package/dist/core/registry.d.ts.map +1 -0
  98. package/dist/core/registry.js +134 -0
  99. package/dist/core/registry.js.map +1 -0
  100. package/dist/core/resolver.d.ts +47 -0
  101. package/dist/core/resolver.d.ts.map +1 -0
  102. package/dist/core/resolver.js +153 -0
  103. package/dist/core/resolver.js.map +1 -0
  104. package/dist/core/schema.d.ts +8 -0
  105. package/dist/core/schema.d.ts.map +1 -0
  106. package/dist/core/schema.js +47 -0
  107. package/dist/core/schema.js.map +1 -0
  108. package/dist/core/types.d.ts +208 -0
  109. package/dist/core/types.d.ts.map +1 -0
  110. package/dist/core/types.js +3 -0
  111. package/dist/core/types.js.map +1 -0
  112. package/dist/index.d.ts +3 -0
  113. package/dist/index.d.ts.map +1 -0
  114. package/dist/index.js +40 -0
  115. package/dist/index.js.map +1 -0
  116. package/package.json +42 -6
  117. package/schemas/v1/config.schema.json +53 -0
  118. package/schemas/v1/lockfile.schema.json +43 -0
  119. 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,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerConfigCommand(program: Command): void;
3
+ //# sourceMappingURL=config-cmd.d.ts.map
@@ -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":"AAEA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,SAAS,cAAc,CAAC,GAAY,EAAE,IAAc;IAChD,IAAI,OAAO,GAAY,GAAG,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC3E,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,GAAI,OAAmC,CAAC,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,GAA4B,EAAE,IAAc,EAAE,KAAc;IAChF,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACtB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,GAAG,CAA4B,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC5B,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAClC,4CAA4C;IAC5C,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,GAAG,CAAC;IACf,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IAClD,MAAM,MAAM,GAAG,OAAO;SACjB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC,CAAC;IAErD,MAAM;SACD,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,KAAa,EAAE,EAAE;QACzC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAC;QACjD,MAAM,GAAG,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACnC,cAAc,CAAC,GAAyC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QAE1C,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YAClB,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAChD,OAAO;QACX,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEP,MAAM;SACD,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAC;QACjD,MAAM,GAAG,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;gBAClB,SAAS,CAAC,SAAS,CAAC,QAAQ,GAAG,uBAAuB,CAAC,CAAC,CAAC;gBACzD,OAAO;YACX,CAAC;YACD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,uBAAuB,CAAC,CAAC;YACrD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACX,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YAClB,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACvC,OAAO;QACX,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEP,MAAM;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,GAAG,EAAE;QACT,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAC;QACjD,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YAClB,SAAS,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;YACjD,OAAO;QACX,CAAC;QACD,MAAM,GAAG,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC5C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { IOContext, GlobalOptions } from "../core/types.js";
2
+ export declare function createRealIOContext(options: GlobalOptions): IOContext;
3
+ //# sourceMappingURL=context.d.ts.map
@@ -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"}