unitup 0.3.0 → 0.4.0

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/docs/index.html DELETED
@@ -1,587 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en" class="light">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <meta name="color-scheme" content="light dark" />
7
- <title>unitup — Cross-Platform Background Service Manager</title>
8
- <meta name="description" content="unitup — Minimal, zero-dependency cross-platform native service manager (systemd, launchd, Windows Services) for Node.js, Python, Ruby, PHP, Bun, Deno, Go, Elixir, Shell, and native binaries." />
9
- <!-- Google tag (gtag.js) -->
10
- <script async src="https://www.googletagmanager.com/gtag/js?id=G-MEASUREMENT_ID"></script>
11
- <script>
12
- window.dataLayer = window.dataLayer || [];
13
- function gtag(){dataLayer.push(arguments);}
14
- gtag('js', new Date());
15
-
16
- gtag('config', 'G-MEASUREMENT_ID');
17
- </script>
18
- <script src="https://cdn.tailwindcss.com"></script>
19
- <script>
20
- tailwind.config = { darkMode: 'class' }
21
- </script>
22
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css" />
23
- <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
24
- <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/bash.min.js"></script>
25
- <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/typescript.min.js"></script>
26
- <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/xml.min.js"></script>
27
- <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/json.min.js"></script>
28
- <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/yaml.min.js"></script>
29
- <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/ini.min.js"></script>
30
- <style>
31
- body { overflow-x: hidden; }
32
- .grid > * { min-width: 0; }
33
- html { scroll-behavior: smooth; }
34
- pre { tab-size: 2; margin: 0; overflow-x: auto; max-width: 100%; }
35
- pre code { padding: 1rem; background: #0f172a; border-radius: 0.75rem; font-size: 0.85rem; display: block; overflow-x: auto; white-space: pre; }
36
- code { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; word-break: break-word; }
37
- .doc-section { scroll-margin-top: 2rem; }
38
- .table-container { width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; border-radius: 0.75rem; border: 1px solid #e2e8f0; margin-bottom: 1rem; }
39
- .dark .table-container { border-color: #334155; }
40
- table { border-collapse: collapse; width: 100%; min-width: 580px; }
41
- th, td { border: 1px solid #e2e8f0; padding: 0.75rem 1rem; text-align: left; }
42
- th { background: #f8fafc; font-weight: 600; }
43
- .dark th, .dark td { border-color: #334155; }
44
- .dark th { background: #1e293b; }
45
- </style>
46
- </head>
47
- <body class="bg-slate-50 text-slate-900 antialiased dark:bg-slate-950 dark:text-slate-100 transition-colors">
48
- <div class="max-w-6xl mx-auto px-4 sm:px-6 py-6 sm:py-10">
49
- <!-- Top Navigation Bar -->
50
- <div class="flex items-center justify-between mb-8 sm:mb-10 gap-4 flex-wrap pb-6 border-b border-slate-200 dark:border-slate-800">
51
- <div class="flex items-center gap-2.5 sm:gap-3">
52
- <span class="text-2xl font-black tracking-tight text-cyan-600 dark:text-cyan-400">unitup</span>
53
- <span class="text-xs px-2.5 py-0.5 rounded-full bg-cyan-100 text-cyan-800 dark:bg-cyan-950 dark:text-cyan-300 font-semibold border border-cyan-300 dark:border-cyan-800">v0.1.5</span>
54
- <a href="https://github.com/litepacks/unitup" target="_blank" rel="noopener noreferrer" class="text-slate-500 hover:text-cyan-600 dark:text-slate-400 dark:hover:text-cyan-400 transition-colors p-1" aria-label="GitHub Repository">
55
- <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.53 1.032 1.53 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"/></svg>
56
- </a>
57
- </div>
58
-
59
- <div class="flex items-center gap-2">
60
- <button id="mobile-menu-btn" type="button" class="md:hidden p-2 rounded-lg border border-slate-200 dark:border-slate-800 text-slate-500 hover:bg-slate-200 dark:hover:bg-slate-800 dark:text-slate-400" aria-label="Toggle navigation menu">
61
- <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/></svg>
62
- </button>
63
- <button id="theme-toggle" type="button" class="p-2 rounded-lg border border-slate-200 dark:border-slate-800 text-slate-500 hover:bg-slate-200 dark:hover:bg-slate-800 dark:text-slate-400 shrink-0" aria-label="Toggle dark mode">
64
- <svg class="w-5 h-5 hidden dark:block" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"/></svg>
65
- <svg class="w-5 h-5 block dark:hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"/></svg>
66
- </button>
67
- </div>
68
-
69
- <nav id="nav-menu" class="hidden md:flex w-full md:w-auto flex-col md:flex-row flex-wrap gap-x-4 gap-y-2 text-sm font-medium pt-3 md:pt-0 border-t md:border-t-0 border-slate-200 dark:border-slate-800" aria-label="Page sections">
70
- <a href="#overview" class="text-slate-600 hover:text-cyan-600 dark:text-slate-400 dark:hover:text-cyan-400 py-1">Overview</a>
71
- <a href="#platforms" class="text-slate-600 hover:text-cyan-600 dark:text-slate-400 dark:hover:text-cyan-400 py-1">Platforms</a>
72
- <a href="#comparison" class="text-slate-600 hover:text-cyan-600 dark:text-slate-400 dark:hover:text-cyan-400 py-1">vs PM2</a>
73
- <a href="#architecture" class="text-slate-600 hover:text-cyan-600 dark:text-slate-400 dark:hover:text-cyan-400 py-1">Architecture</a>
74
- <a href="#runtimes" class="text-slate-600 hover:text-cyan-600 dark:text-slate-400 dark:hover:text-cyan-400 py-1">Runtimes</a>
75
- <a href="#cli" class="text-slate-600 hover:text-cyan-600 dark:text-slate-400 dark:hover:text-cyan-400 py-1">CLI Reference</a>
76
- <a href="#schedules" class="text-slate-600 hover:text-cyan-600 dark:text-slate-400 dark:hover:text-cyan-400 py-1">Schedules</a>
77
- <a href="#api" class="text-slate-600 hover:text-cyan-600 dark:text-slate-400 dark:hover:text-cyan-400 py-1">API</a>
78
- <a href="https://github.com/litepacks/unitup" target="_blank" rel="noopener noreferrer" class="text-cyan-600 dark:text-cyan-400 hover:underline flex items-center gap-1 font-semibold py-1">GitHub &rarr;</a>
79
- </nav>
80
- </div>
81
-
82
- <!-- Header / Hero Section -->
83
- <header class="mb-14">
84
- <div class="inline-flex items-center gap-2 px-3 py-1 rounded-full text-xs font-semibold bg-cyan-50 dark:bg-cyan-950/60 text-cyan-700 dark:text-cyan-300 border border-cyan-200 dark:border-cyan-800 mb-4">
85
- ⚡ Zero-Daemon · Linux systemd · macOS launchd · Windows Services
86
- </div>
87
- <h1 class="text-4xl sm:text-5xl font-extrabold text-slate-900 dark:text-white tracking-tight mb-4">
88
- Cross-Platform Service Management,<br class="hidden sm:inline" />Simplified for Any App.
89
- </h1>
90
- <p class="text-lg text-slate-600 dark:text-slate-400 max-w-3xl leading-relaxed mb-6">
91
- <strong class="text-slate-800 dark:text-slate-200">unitup</strong> is a zero-dependency CLI & library to run Node.js, Python, Ruby, PHP, Bun, Deno, Go, Elixir, Shell scripts, and compiled native executables as native background services across <strong>Linux (<code class="text-cyan-700 dark:text-cyan-400">systemd</code>)</strong>, <strong>macOS (<code class="text-cyan-700 dark:text-cyan-400">launchd</code>)</strong>, and <strong>Windows (<code class="text-cyan-700 dark:text-cyan-400">Windows Services</code>)</strong>.
92
- </p>
93
-
94
- <!-- Quick Try Code Block -->
95
- <div class="rounded-xl border border-slate-200 dark:border-slate-800 bg-slate-900 p-4 max-w-2xl shadow-xl">
96
- <div class="flex items-center justify-between text-xs text-slate-400 mb-2 font-mono border-b border-slate-800 pb-2">
97
- <span>Quick Start</span>
98
- <span>bash</span>
99
- </div>
100
- <pre><code class="language-bash">npm install -g unitup
101
-
102
- # Install & start service natively on Linux, macOS, or Windows
103
- unitup install server.js --name api --start
104
- unitup status api
105
- unitup logs api --follow
106
-
107
- # Preview generated native service configuration without installing
108
- unitup install server.js --name api --dry-run</code></pre>
109
- </div>
110
- </header>
111
-
112
- <!-- Section: Overview -->
113
- <section id="overview" class="doc-section mb-14">
114
- <h2 class="text-2xl font-bold text-slate-900 dark:text-white mb-4">Core Promises</h2>
115
- <div class="grid sm:grid-cols-2 lg:grid-cols-3 gap-4">
116
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50 shadow-sm">
117
- <div class="text-cyan-600 dark:text-cyan-400 text-xl font-bold mb-1">⚡ No Resident Daemon</div>
118
- <p class="text-sm text-slate-600 dark:text-slate-400 leading-relaxed">
119
- Exits immediately after configuring services. No resident unitup master process continuously eating CPU or RAM.
120
- </p>
121
- </div>
122
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50 shadow-sm">
123
- <div class="text-cyan-600 dark:text-cyan-400 text-xl font-bold mb-1">🖥️ Cross-Platform</div>
124
- <p class="text-sm text-slate-600 dark:text-slate-400 leading-relaxed">
125
- First-class adapters for Linux (<code class="text-xs">systemd</code>), macOS (<code class="text-xs">launchd</code>), and Windows (<code class="text-xs">SCM</code>).
126
- </p>
127
- </div>
128
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50 shadow-sm">
129
- <div class="text-cyan-600 dark:text-cyan-400 text-xl font-bold mb-1">🌐 Multi-Runtime</div>
130
- <p class="text-sm text-slate-600 dark:text-slate-400 leading-relaxed">
131
- Out-of-the-box support for Node.js, Python, Ruby, PHP, Bun, Deno, Go, Elixir, Shell, and native binaries.
132
- </p>
133
- </div>
134
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50 shadow-sm">
135
- <div class="text-cyan-600 dark:text-cyan-400 text-xl font-bold mb-1">🔍 Dry-Run Mode</div>
136
- <p class="text-sm text-slate-600 dark:text-slate-400 leading-relaxed">
137
- Use <code class="text-xs">--dry-run</code> to inspect exact generated unit files or XML plists before installing.
138
- </p>
139
- </div>
140
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50 shadow-sm">
141
- <div class="text-cyan-600 dark:text-cyan-400 text-xl font-bold mb-1">📦 Zero Dependencies</div>
142
- <p class="text-sm text-slate-600 dark:text-slate-400 leading-relaxed">
143
- Built strictly with Node.js standard libraries. Zero heavy third-party npm dependencies or native bindings.
144
- </p>
145
- </div>
146
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50 shadow-sm">
147
- <div class="text-cyan-600 dark:text-cyan-400 text-xl font-bold mb-1">🔄 100% Backward Compatible</div>
148
- <p class="text-sm text-slate-600 dark:text-slate-400 leading-relaxed">
149
- Full support for existing Linux systemd workflows, timers, and legacy metadata without breaking changes.
150
- </p>
151
- </div>
152
- </div>
153
- </section>
154
-
155
- <!-- Section: Platforms -->
156
- <section id="platforms" class="doc-section mb-14">
157
- <h2 class="text-2xl font-bold text-slate-900 dark:text-white mb-4">Platform Support Matrix</h2>
158
- <p class="text-slate-600 dark:text-slate-400 mb-6 leading-relaxed">
159
- Unitup provides unified command syntax while leveraging the native service architecture on each operating system:
160
- </p>
161
-
162
- <div class="table-container">
163
- <table>
164
- <thead>
165
- <tr>
166
- <th>Feature</th>
167
- <th>Linux (<code class="text-xs">systemd</code>)</th>
168
- <th>macOS (<code class="text-xs">launchd</code>)</th>
169
- <th>Windows (<code class="text-xs">Windows Services</code>)</th>
170
- </tr>
171
- </thead>
172
- <tbody class="text-sm">
173
- <tr>
174
- <td class="font-semibold">Install / Uninstall</td>
175
- <td><code class="text-xs">systemd</code> user/system unit</td>
176
- <td><code class="text-xs">launchd</code> agent/daemon <code class="text-xs">.plist</code></td>
177
- <td>Windows Service (<code class="text-xs">sc.exe</code>)</td>
178
- </tr>
179
- <tr>
180
- <td class="font-semibold">Start / Stop / Restart</td>
181
- <td><code class="text-xs">systemctl</code></td>
182
- <td><code class="text-xs">launchctl kickstart / kill</code></td>
183
- <td><code class="text-xs">sc.exe start / stop</code></td>
184
- </tr>
185
- <tr>
186
- <td class="font-semibold">Auto-Start on Boot</td>
187
- <td><code class="text-xs">systemctl enable</code></td>
188
- <td><code class="text-xs">RunAtLoad: true</code></td>
189
- <td>Automatic Service Startup</td>
190
- </tr>
191
- <tr>
192
- <td class="font-semibold">Environment Variables</td>
193
- <td><code class="text-xs">Environment=</code></td>
194
- <td><code class="text-xs">EnvironmentVariables</code> plist dict</td>
195
- <td>Process Environment Forwarding</td>
196
- </tr>
197
- <tr>
198
- <td class="font-semibold">Logs</td>
199
- <td><code class="text-xs">journalctl</code></td>
200
- <td>File-based streaming (<code class="text-xs">~/.config/unitup/logs/</code>)</td>
201
- <td>File-based streaming (<code class="text-xs">~/.config/unitup/logs/</code>)</td>
202
- </tr>
203
- <tr>
204
- <td class="font-semibold">Crash Recovery</td>
205
- <td><code class="text-xs">Restart=on-failure</code></td>
206
- <td><code class="text-xs">KeepAlive</code> plist dictionary</td>
207
- <td>Host supervisor auto-restart & uptime reset</td>
208
- </tr>
209
- <tr>
210
- <td class="font-semibold">User Services</td>
211
- <td><code class="text-xs">~/.config/systemd/user/</code></td>
212
- <td><code class="text-xs">~/Library/LaunchAgents/</code></td>
213
- <td>Supported</td>
214
- </tr>
215
- <tr>
216
- <td class="font-semibold">System Services</td>
217
- <td><code class="text-xs">/etc/systemd/system/</code> (<code class="text-xs">--system</code>)</td>
218
- <td><code class="text-xs">/Library/LaunchDaemons/</code> (<code class="text-xs">--system</code>)</td>
219
- <td>Native Windows Service</td>
220
- </tr>
221
- <tr>
222
- <td class="font-semibold">Dry-Run Inspection</td>
223
- <td><code class="text-xs">--dry-run</code> (systemd unit)</td>
224
- <td><code class="text-xs">--dry-run</code> (plist XML)</td>
225
- <td><code class="text-xs">--dry-run</code> (service JSON)</td>
226
- </tr>
227
- </tbody>
228
- </table>
229
- </div>
230
- </section>
231
-
232
- <!-- Section: Comparison -->
233
- <section id="comparison" class="doc-section mb-14">
234
- <h2 class="text-2xl font-bold text-slate-900 dark:text-white mb-4">unitup vs PM2</h2>
235
- <p class="text-slate-600 dark:text-slate-400 mb-6 leading-relaxed">
236
- <strong class="text-slate-800 dark:text-slate-200">unitup</strong> is not a PM2 replacement or an independent process manager. While PM2 runs its own master daemon, unitup is strictly a thin, transparent CLI layer on top of native OS service managers.
237
- </p>
238
-
239
- <div class="table-container">
240
- <table>
241
- <thead>
242
- <tr>
243
- <th>Feature</th>
244
- <th>unitup</th>
245
- <th>PM2</th>
246
- </tr>
247
- </thead>
248
- <tbody class="text-sm">
249
- <tr>
250
- <td class="font-semibold">Background Process (Daemon)</td>
251
- <td><strong class="text-emerald-600 dark:text-emerald-400">No resident daemon</strong>. OS directly supervises processes.</td>
252
- <td>Runs a persistent process-management daemon.</td>
253
- </tr>
254
- <tr>
255
- <td class="font-semibold">System Integration</td>
256
- <td>Native OS service managers (<code class="text-xs">systemd</code>, <code class="text-xs">launchd</code>, <code class="text-xs">Windows Services</code>).</td>
257
- <td>Custom process monitoring via PM2's internal daemon.</td>
258
- </tr>
259
- <tr>
260
- <td class="font-semibold">Multi-Runtime Support</td>
261
- <td><strong class="text-emerald-600 dark:text-emerald-400">Node, Python, Ruby, PHP, Bun, Deno, Go, Elixir, Shell, Native Binaries</strong>.</td>
262
- <td>Node.js-focused process manager with support for running other commands.</td>
263
- </tr>
264
- <tr>
265
- <td class="font-semibold">Privileges Required</td>
266
- <td>Does <strong class="text-emerald-600 dark:text-emerald-400">not</strong> require elevated permissions for user services.</td>
267
- <td>Boot integration commonly requires running PM2 startup with elevated privileges.</td>
268
- </tr>
269
- <tr>
270
- <td class="font-semibold">Dependencies</td>
271
- <td><strong class="text-emerald-600 dark:text-emerald-400">0 Runtime Dependencies</strong> (Node.js standard modules only).</td>
272
- <td>Dozens of 3rd party npm packages.</td>
273
- </tr>
274
- <tr>
275
- <td class="font-semibold">Log Management</td>
276
- <td>Native <code class="text-xs">journald</code> (Linux) / Cross-platform streaming tail files.</td>
277
- <td>Manages <code class="text-xs">.pm2/logs</code> files (requires <code class="text-xs">pm2-logrotate</code> plugin).</td>
278
- </tr>
279
- </tbody>
280
- </table>
281
- </div>
282
- </section>
283
-
284
- <!-- Section: Architecture -->
285
- <section id="architecture" class="doc-section mb-14">
286
- <h2 class="text-2xl font-bold text-slate-900 dark:text-white mb-4">Core Architecture</h2>
287
- <p class="text-slate-600 dark:text-slate-400 mb-6 leading-relaxed">
288
- Unitup generates native service definitions directly from a canonical <code class="text-cyan-600 dark:text-cyan-400">command + args</code> model:
289
- </p>
290
-
291
- <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
292
- <div class="min-w-0">
293
- <h3 class="text-sm font-semibold uppercase tracking-wider text-cyan-600 dark:text-cyan-400 mb-2">Linux (systemd unit)</h3>
294
- <pre><code class="language-ini">[Unit]
295
- Description=unitup service: worker
296
- After=network.target
297
-
298
- [Service]
299
- Type=simple
300
- WorkingDirectory=/home/user/apps
301
- ExecStart=/usr/bin/python3 /home/user/apps/worker.py
302
- Restart=on-failure
303
- RestartSec=3
304
- Environment=APP_ENV="production"
305
-
306
- [Install]
307
- WantedBy=default.target</code></pre>
308
- </div>
309
- <div class="min-w-0">
310
- <h3 class="text-sm font-semibold uppercase tracking-wider text-cyan-600 dark:text-cyan-400 mb-2">macOS (launchd plist)</h3>
311
- <pre><code class="language-xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
312
- &lt;plist version="1.0"&gt;
313
- &lt;dict&gt;
314
- &lt;key&gt;Label&lt;/key&gt;
315
- &lt;string&gt;dev.unitup.worker&lt;/string&gt;
316
- &lt;key&gt;ProgramArguments&lt;/key&gt;
317
- &lt;array&gt;
318
- &lt;string&gt;/usr/bin/python3&lt;/string&gt;
319
- &lt;string&gt;/home/user/apps/worker.py&lt;/string&gt;
320
- &lt;/array&gt;
321
- &lt;key&gt;WorkingDirectory&lt;/key&gt;
322
- &lt;string&gt;/home/user/apps&lt;/string&gt;
323
- &lt;key&gt;RunAtLoad&lt;/key&gt;
324
- &lt;true/&gt;
325
- &lt;key&gt;KeepAlive&lt;/key&gt;
326
- &lt;dict&gt;
327
- &lt;key&gt;SuccessfulExit&lt;/key&gt;&lt;false/&gt;
328
- &lt;key&gt;Crashed&lt;/key&gt;&lt;true/&gt;
329
- &lt;/dict&gt;
330
- &lt;/dict&gt;
331
- &lt;/plist&gt;</code></pre>
332
- </div>
333
- </div>
334
- </section>
335
-
336
- <!-- Section: Runtimes -->
337
- <section id="runtimes" class="doc-section mb-14">
338
- <h2 class="text-2xl font-bold text-slate-900 dark:text-white mb-4">Supported Runtimes & Auto-Detection</h2>
339
-
340
- <div class="table-container">
341
- <table>
342
- <thead>
343
- <tr>
344
- <th>Runtime</th>
345
- <th>Extension / Auto-Detection</th>
346
- <th>Command Executed</th>
347
- </tr>
348
- </thead>
349
- <tbody class="text-sm">
350
- <tr>
351
- <td class="font-semibold text-cyan-600 dark:text-cyan-400">Node.js</td>
352
- <td><code class="text-xs">.js, .mjs, .cjs</code> or shebang <code class="text-xs">#!/usr/bin/env node</code></td>
353
- <td><code class="text-xs">node &lt;script&gt;</code></td>
354
- </tr>
355
- <tr>
356
- <td class="font-semibold text-cyan-600 dark:text-cyan-400">Python</td>
357
- <td><code class="text-xs">.py</code> or shebang <code class="text-xs">#!/usr/bin/env python3</code></td>
358
- <td><code class="text-xs">python3 &lt;script&gt;</code></td>
359
- </tr>
360
- <tr>
361
- <td class="font-semibold text-cyan-600 dark:text-cyan-400">Ruby</td>
362
- <td><code class="text-xs">.rb</code> or shebang <code class="text-xs">#!/usr/bin/env ruby</code></td>
363
- <td><code class="text-xs">ruby &lt;script&gt;</code></td>
364
- </tr>
365
- <tr>
366
- <td class="font-semibold text-cyan-600 dark:text-cyan-400">PHP</td>
367
- <td><code class="text-xs">.php</code> or shebang <code class="text-xs">#!/usr/bin/env php</code></td>
368
- <td><code class="text-xs">php &lt;script&gt;</code> (Supports <code class="text-xs">-S 0.0.0.0:8080</code>)</td>
369
- </tr>
370
- <tr>
371
- <td class="font-semibold text-cyan-600 dark:text-cyan-400">Bun</td>
372
- <td>Explicit <code class="text-xs">--runtime bun</code> or shebang <code class="text-xs">#!/usr/bin/env bun</code></td>
373
- <td><code class="text-xs">bun &lt;script&gt;</code></td>
374
- </tr>
375
- <tr>
376
- <td class="font-semibold text-cyan-600 dark:text-cyan-400">Deno</td>
377
- <td>Explicit <code class="text-xs">--runtime deno</code> or shebang <code class="text-xs">#!/usr/bin/env deno</code></td>
378
- <td><code class="text-xs">deno run &lt;script&gt;</code></td>
379
- </tr>
380
- <tr>
381
- <td class="font-semibold text-cyan-600 dark:text-cyan-400">Go</td>
382
- <td><code class="text-xs">.go</code> or shebang <code class="text-xs">#!/usr/bin/env go</code></td>
383
- <td><code class="text-xs">go run &lt;script&gt;</code></td>
384
- </tr>
385
- <tr>
386
- <td class="font-semibold text-cyan-600 dark:text-cyan-400">Elixir</td>
387
- <td><code class="text-xs">.ex, .exs</code> or shebang <code class="text-xs">#!/usr/bin/env elixir</code></td>
388
- <td><code class="text-xs">elixir &lt;script&gt;</code></td>
389
- </tr>
390
- <tr>
391
- <td class="font-semibold text-cyan-600 dark:text-cyan-400">Shell</td>
392
- <td><code class="text-xs">.sh</code> or shebang <code class="text-xs">#!/bin/bash</code> / <code class="text-xs">#!/bin/sh</code></td>
393
- <td><code class="text-xs">bash &lt;script&gt;</code></td>
394
- </tr>
395
- <tr>
396
- <td class="font-semibold text-cyan-600 dark:text-cyan-400">Native Executable</td>
397
- <td>Explicit <code class="text-xs">--runtime native</code></td>
398
- <td>Direct binary execution (<code class="text-xs">./server</code>)</td>
399
- </tr>
400
- </tbody>
401
- </table>
402
- </div>
403
- </section>
404
-
405
- <!-- Section: CLI Reference -->
406
- <section id="cli" class="doc-section mb-14">
407
- <h2 class="text-2xl font-bold text-slate-900 dark:text-white mb-6">CLI Reference</h2>
408
-
409
- <div class="space-y-6">
410
- <!-- doctor -->
411
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50">
412
- <h3 class="text-lg font-bold text-cyan-600 dark:text-cyan-400 mb-2"><code class="text-base">unitup doctor</code></h3>
413
- <p class="text-sm text-slate-600 dark:text-slate-400 mb-3">Runs cross-platform diagnostics (Platform, Service manager, Node.js path, data directory, permissions, lingering, and detected runtimes).</p>
414
- <pre><code class="language-bash">unitup doctor</code></pre>
415
- </div>
416
-
417
- <!-- install / add -->
418
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50">
419
- <h3 class="text-lg font-bold text-cyan-600 dark:text-cyan-400 mb-2"><code class="text-base">unitup install / add &lt;script|exec&gt; [options]</code></h3>
420
- <p class="text-sm text-slate-600 dark:text-slate-400 mb-3">Generates and installs a new native background service.</p>
421
- <pre><code class="language-bash"># Flags:
422
- # --name <name> Service name (default: script basename)
423
- # --runtime <name> Specify runtime (node, python, ruby, php, bun, deno, shell, go, elixir, native)
424
- # --command <path> Explicit binary executable (bypasses auto-detection)
425
- # --env KEY=val Set environment variable
426
- # --env-file <path> Load environment file
427
- # --dry-run Preview generated service file without installing
428
- # --system Install as system-wide service (LaunchDaemons / root systemd)
429
- # --start Enable and start service immediately
430
- # --force, -f Force overwrite of currently running service
431
-
432
- unitup install server.js --name api --start
433
- unitup install worker.py --name worker --group backend --env APP_ENV=production --start
434
- unitup install server.js --dry-run</code></pre>
435
- </div>
436
-
437
- <!-- list / ls -->
438
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50">
439
- <h3 class="text-lg font-bold text-cyan-600 dark:text-cyan-400 mb-2"><code class="text-base">unitup list</code> / <code class="text-base">unitup ls</code></h3>
440
- <p class="text-sm text-slate-600 dark:text-slate-400 mb-3">Lists all managed services in a clean aligned table.</p>
441
- <pre><code class="language-bash">unitup list --group backend</code></pre>
442
- </div>
443
-
444
- <!-- inspect -->
445
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50">
446
- <h3 class="text-lg font-bold text-cyan-600 dark:text-cyan-400 mb-2"><code class="text-base">unitup inspect &lt;name&gt;</code></h3>
447
- <p class="text-sm text-slate-600 dark:text-slate-400 mb-3">Displays full service configuration overview without revealing secrets or environment variables.</p>
448
- <pre><code class="language-bash">unitup inspect api</code></pre>
449
- </div>
450
-
451
- <!-- start / stop / restart -->
452
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50">
453
- <h3 class="text-lg font-bold text-cyan-600 dark:text-cyan-400 mb-2"><code class="text-base">unitup start / stop / restart &lt;name|@group&gt;</code></h3>
454
- <p class="text-sm text-slate-600 dark:text-slate-400 mb-3">Controls service state individually or in batch using <code class="text-xs">@group</code> syntax.</p>
455
- <pre><code class="language-bash">unitup start api
456
- unitup restart @backend
457
- unitup stop api</code></pre>
458
- </div>
459
-
460
- <!-- enable / disable -->
461
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50">
462
- <h3 class="text-lg font-bold text-cyan-600 dark:text-cyan-400 mb-2"><code class="text-base">unitup enable / disable &lt;name&gt;</code></h3>
463
- <p class="text-sm text-slate-600 dark:text-slate-400 mb-3">Enables or disables service startup on boot.</p>
464
- <pre><code class="language-bash">unitup enable api
465
- unitup disable api</code></pre>
466
- </div>
467
-
468
- <!-- status & logs -->
469
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50">
470
- <h3 class="text-lg font-bold text-cyan-600 dark:text-cyan-400 mb-2"><code class="text-base">unitup status / logs &lt;name&gt;</code></h3>
471
- <p class="text-sm text-slate-600 dark:text-slate-400 mb-3">Inspects process status with live metrics or streams service logs with advanced filtering.</p>
472
- <pre><code class="language-bash">unitup status api --verbose
473
- unitup logs api --follow
474
- unitup logs api --lines 50 --grep "ERROR"</code></pre>
475
- </div>
476
-
477
- <!-- uninstall / remove -->
478
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50">
479
- <h3 class="text-lg font-bold text-cyan-600 dark:text-cyan-400 mb-2"><code class="text-base">unitup uninstall / remove &lt;name|@group&gt; [--force]</code></h3>
480
- <p class="text-sm text-slate-600 dark:text-slate-400 mb-3">Stops, disables, and deletes a service or group. Active running services require <code class="text-xs">--force</code> / <code class="text-xs">-f</code> to prevent accidental deletion.</p>
481
- <pre><code class="language-bash">unitup uninstall api
482
- unitup uninstall @backend --force</code></pre>
483
- </div>
484
- </div>
485
- </section>
486
-
487
- <!-- Section: Schedules -->
488
- <section id="schedules" class="doc-section mb-14">
489
- <h2 class="text-2xl font-bold text-slate-900 dark:text-white mb-4">Systemd Timer Schedules (Linux)</h2>
490
- <p class="text-slate-600 dark:text-slate-400 mb-6 leading-relaxed">
491
- <strong class="text-slate-800 dark:text-slate-200">unitup</strong> supports native systemd timer scheduling on Linux without running continuous worker processes or cron daemons.
492
- </p>
493
-
494
- <div class="space-y-6">
495
- <div class="p-5 rounded-xl border border-slate-200 dark:border-slate-800 bg-white/70 dark:bg-slate-900/50">
496
- <h3 class="text-lg font-bold text-cyan-600 dark:text-cyan-400 mb-2">Schedule Commands</h3>
497
- <pre><code class="language-bash"># Create interval schedule (--every 30m)
498
- unitup schedule cleanup.js --every 30m --persistent --start
499
-
500
- # Create calendar schedule (--calendar daily with random delay jitter)
501
- unitup schedule backup.py --calendar daily --random-delay 10m --persistent --start
502
-
503
- # List all schedule timers
504
- unitup schedules # or unitup timers
505
-
506
- # Detailed schedule status
507
- unitup schedule-status cleanup</code></pre>
508
- </div>
509
- </div>
510
- </section>
511
-
512
- <!-- Section: API -->
513
- <section id="api" class="doc-section mb-14">
514
- <h2 class="text-2xl font-bold text-slate-900 dark:text-white mb-4">Programmatic API</h2>
515
- <p class="text-slate-600 dark:text-slate-400 mb-6 leading-relaxed">
516
- unitup exports full ESM and CommonJS interfaces with complete TypeScript declarations (<code class="text-cyan-600 dark:text-cyan-400">index.d.ts</code>).
517
- </p>
518
-
519
- <div class="space-y-6">
520
- <div>
521
- <h3 class="text-sm font-semibold uppercase tracking-wider text-cyan-600 dark:text-cyan-400 mb-2">Cross-Platform Service Manager</h3>
522
- <pre><code class="language-typescript">import {
523
- ServiceManager,
524
- getAdapter,
525
- getPlatformCapabilities,
526
- createService,
527
- getServiceStatus,
528
- listServices
529
- } from "unitup";
530
-
531
- // High-level service manager (auto-resolves current OS adapter)
532
- const manager = new ServiceManager();
533
-
534
- // Install and start service
535
- await manager.install({
536
- name: "api",
537
- script: "./server.js",
538
- env: { NODE_ENV: "production" }
539
- }, { start: true });
540
-
541
- // Check status
542
- const status = await manager.status("api");
543
- console.log(`State: ${status.state}, PID: ${status.pid}, Platform: ${status.platform}`);
544
-
545
- // Inspect capabilities
546
- const caps = getPlatformCapabilities();
547
- console.log(`Service Manager: ${caps.serviceManager}`);</code></pre>
548
- </div>
549
- </div>
550
- </section>
551
-
552
- <!-- Footer -->
553
- <footer class="pt-8 border-t border-slate-200 dark:border-slate-800 text-center text-sm text-slate-500 dark:text-slate-500">
554
- <p><a href="https://github.com/litepacks/unitup" target="_blank" rel="noopener noreferrer" class="text-cyan-600 dark:text-cyan-400 hover:underline">github.com/litepacks/unitup</a> · Released under <a href="https://opensource.org/licenses/MIT" target="_blank" rel="noopener noreferrer" class="underline hover:text-slate-700 dark:hover:text-slate-300">MIT License</a>.</p>
555
- </footer>
556
- </div>
557
-
558
- <script>
559
- // Theme toggle logic
560
- const themeToggleBtn = document.getElementById('theme-toggle');
561
- themeToggleBtn.addEventListener('click', () => {
562
- document.documentElement.classList.toggle('dark');
563
- });
564
-
565
- // Mobile navigation toggle
566
- const mobileMenuBtn = document.getElementById('mobile-menu-btn');
567
- const navMenu = document.getElementById('nav-menu');
568
- if (mobileMenuBtn && navMenu) {
569
- mobileMenuBtn.addEventListener('click', () => {
570
- navMenu.classList.toggle('hidden');
571
- });
572
- navMenu.querySelectorAll('a').forEach(link => {
573
- link.addEventListener('click', () => {
574
- if (window.innerWidth < 768) {
575
- navMenu.classList.add('hidden');
576
- }
577
- });
578
- });
579
- }
580
-
581
- // Highlight code blocks
582
- document.addEventListener('DOMContentLoaded', () => {
583
- hljs.highlightAll();
584
- });
585
- </script>
586
- </body>
587
- </html>
package/tsconfig.json DELETED
@@ -1,13 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "NodeNext",
5
- "moduleResolution": "NodeNext",
6
- "noEmit": true,
7
- "strict": true,
8
- "skipLibCheck": true,
9
- "allowJs": true,
10
- "checkJs": false
11
- },
12
- "include": ["index.d.ts", "types-test/index.ts"]
13
- }