Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e5a1b7ce53 | ||
|
|
90d68f2510 | ||
|
|
1fa8c5ba66 | ||
|
|
b291a119d5 | ||
|
|
e63129d156 |
@@ -24,7 +24,7 @@ API for automation.
|
||||
## Quickstart
|
||||
|
||||
```bash
|
||||
npm install -g triggershell # or: npx triggershell <command> for one-off use
|
||||
npm install -g @valknar/triggershell # or: npx @valknar/triggershell <command> for one-off use
|
||||
triggershell init # scaffold triggershell.yml (+ .env for secrets) in the current directory
|
||||
triggershell users add admin # create a login (skip if you set auth.enabled: false)
|
||||
triggershell start # start the app and open the browser
|
||||
@@ -113,6 +113,7 @@ the script — always as a discrete argv element or env var, never interpolated
|
||||
| `triggershell service install [--system]` | Install a systemd unit that runs `triggershell start` (per-user by default, Linux only) |
|
||||
| `triggershell service uninstall [--system]` | Stop, disable, and remove the systemd unit |
|
||||
| `triggershell service status [--system]` | Show the systemd unit's status |
|
||||
| `triggershell service logs [-n LINES] [--no-follow] [--system]` | Tail the systemd unit's logs (wraps `journalctl -o cat`, so each line is raw JSON - pipe through `jq` for pretty-printing) |
|
||||
|
||||
### Running scripts from the CLI
|
||||
|
||||
|
||||
@@ -74,9 +74,11 @@ installs a per-user unit (`~/.config/systemd/user/triggershell.service`, no root
|
||||
targets `/etc/systemd/system/` instead and prints the `sudo` commands to run if not already root.
|
||||
`install` reloads the systemd daemon but does not enable/start the unit itself — that's a separate,
|
||||
explicit `systemctl --user enable --now triggershell`, since it's the point where the service
|
||||
actually starts listening and running scripts. `triggershell service status`/`uninstall` are thin
|
||||
wrappers around `systemctl`; log tailing is just `journalctl --user -u triggershell -f` — not
|
||||
reimplemented.
|
||||
actually starts listening and running scripts. `triggershell service status`/`uninstall`/`logs` are
|
||||
thin wrappers around `systemctl`/`journalctl` respectively - no unit-file parsing or log storage of
|
||||
our own, journald already does that. `logs` passes `-o cat` so each line is the raw pino JSON
|
||||
payload rather than journalctl's own timestamp/hostname/unit prefix - pipeable straight into `jq`
|
||||
for pretty-printing without pulling `pino-pretty` into the CLI's runtime dependencies.
|
||||
|
||||
## Cross-module-graph state
|
||||
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "triggershell",
|
||||
"version": "1.0.4",
|
||||
"name": "@valknar/triggershell",
|
||||
"version": "1.2.0",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
"repository": {
|
||||
|
||||
@@ -126,3 +126,26 @@ export async function serviceStatusCommand(
|
||||
});
|
||||
process.exitCode = result.exitCode ?? 1;
|
||||
}
|
||||
|
||||
export interface ServiceLogsOptions extends ServiceScopeOptions {
|
||||
follow?: boolean;
|
||||
lines?: number;
|
||||
}
|
||||
|
||||
export async function serviceLogsCommand(
|
||||
opts: ServiceLogsOptions,
|
||||
): Promise<void> {
|
||||
const scope = scopeOf(opts);
|
||||
const args = scope === "user" ? ["--user"] : [];
|
||||
// -o cat strips journalctl's own prefix (timestamp/hostname/unit) so each line is the raw pino
|
||||
// JSON payload - pipeable straight into `jq` or similar without journalctl's wrapper in the way.
|
||||
args.push("-u", SERVICE_NAME, "-o", "cat");
|
||||
if (opts.follow !== false) args.push("-f");
|
||||
if (opts.lines !== undefined) args.push("-n", String(opts.lines));
|
||||
|
||||
const result = await execa("journalctl", args, {
|
||||
stdio: "inherit",
|
||||
reject: false,
|
||||
});
|
||||
process.exitCode = result.exitCode ?? 1;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import { runCommand } from "./commands/run";
|
||||
import { scriptsListCommand, scriptsShowCommand } from "./commands/scripts";
|
||||
import {
|
||||
serviceInstallCommand,
|
||||
serviceLogsCommand,
|
||||
serviceStatusCommand,
|
||||
serviceUninstallCommand,
|
||||
} from "./commands/service";
|
||||
@@ -180,6 +181,23 @@ service
|
||||
)
|
||||
.action(serviceStatusCommand);
|
||||
|
||||
service
|
||||
.command("logs")
|
||||
.description("Tail the systemd unit's logs (journalctl).")
|
||||
.option("-n, --lines <n>", "Number of recent log lines to show.", (v) =>
|
||||
Number(v),
|
||||
)
|
||||
.option(
|
||||
"--no-follow",
|
||||
"Print recent logs and exit instead of tailing continuously.",
|
||||
)
|
||||
.option(
|
||||
"--system",
|
||||
"Target the system-wide unit instead of the per-user one.",
|
||||
false,
|
||||
)
|
||||
.action(serviceLogsCommand);
|
||||
|
||||
if (process.argv.length <= 2) {
|
||||
program.outputHelp();
|
||||
process.exit(1);
|
||||
|
||||
Reference in New Issue
Block a user