ework-aio 0.1.12 → 0.1.13

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 (2) hide show
  1. package/bin/install.sh +71 -0
  2. package/package.json +1 -1
package/bin/install.sh CHANGED
@@ -38,6 +38,8 @@ BOT_NAME="ework-daemon"
38
38
  NO_START=0
39
39
  ASSUME_YES=0
40
40
  NO_RESTART=0
41
+ AS_USER=""
42
+ ALLOW_ROOT=0
41
43
  CFG_ARGS=()
42
44
  MODE_ARGS=()
43
45
 
@@ -67,6 +69,10 @@ Install options:
67
69
  --bot-name <login> Bot username (default: ework-daemon)
68
70
  --no-start Install units but don't start services
69
71
  --yes Skip all prompts (use generated defaults)
72
+ --as-user <login> (sudo only) drop priv: re-exec install as <login>
73
+ after enabling linger. Data + opencode + npm
74
+ resolved under that user's HOME.
75
+ --allow-root (sudo only) override default refuse-on-root
70
76
 
71
77
  Global options:
72
78
  --no-restart With `config set`: edit .env but skip the restart
@@ -107,12 +113,77 @@ while [[ $# -gt 0 ]]; do
107
113
  --no-start) NO_START=1; shift ;;
108
114
  --no-restart) NO_RESTART=1; shift ;;
109
115
  --yes|-y) ASSUME_YES=1; shift ;;
116
+ --as-user) AS_USER="$2"; shift 2 ;;
117
+ --allow-root) ALLOW_ROOT=1; shift ;;
110
118
  -h|--help) usage; exit 0 ;;
111
119
  --*) die "Unknown option: $1 (try --help)" ;;
112
120
  *) MODE_ARGS+=("$1"); shift ;;
113
121
  esac
114
122
  done
115
123
 
124
+ # ─── Root guard: refuse install as root by default ──────────────────────────
125
+ # Running install as root puts data under /root/.local/share/ework-aio, bakes
126
+ # root-only paths into systemd units, and looks for opencode in root's PATH
127
+ # (usually missing). The right answer is almost always: don't use sudo.
128
+ # --as-user re-execs the script as the named user after enabling linger.
129
+ # --allow-root is an explicit acknowledgement that you've set up root's
130
+ # environment (opencode installed, npm prefix configured, etc.).
131
+ if [[ "$MODE" == "install" && "${EUID:-$(id -u)}" == "0" ]]; then
132
+ if [[ -n "$AS_USER" ]]; then
133
+ AS_USER_HOME="$(getent passwd "$AS_USER" 2>/dev/null | cut -d: -f6 || true)"
134
+ AS_USER_UID="$(getent passwd "$AS_USER" 2>/dev/null | cut -d: -f3 || true)"
135
+ if [[ -z "$AS_USER_HOME" || -z "$AS_USER_UID" ]]; then
136
+ die "--as-user: user '$AS_USER' not found in passwd database"
137
+ fi
138
+ if [[ "$AS_USER_UID" == "0" ]]; then
139
+ die "--as-user: target user is root — just use --allow-root instead"
140
+ fi
141
+ log "Enable linger for '$AS_USER' so --user services survive logout..."
142
+ loginctl enable-linger "$AS_USER" \
143
+ || die "Failed to enable linger for '$AS_USER'. Try: sudo loginctl enable-linger $AS_USER"
144
+ ok "Linger enabled for '$AS_USER'"
145
+ log "Re-execing as '$AS_USER' (HOME=$AS_USER_HOME)..."
146
+ # Strip --as-user <name> from argv, preserve everything else.
147
+ new_args=()
148
+ skip=0
149
+ for a in "$@"; do
150
+ if [[ "$skip" == "1" ]]; then skip=0; continue; fi
151
+ if [[ "$a" == "--as-user" ]]; then skip=1; continue; fi
152
+ new_args+=("$a")
153
+ done
154
+ # Resolve our own path (can't rely on $0 after sudo changes PATH).
155
+ SELF="$(command -v ework-aio 2>/dev/null || true)"
156
+ [[ -n "$SELF" ]] || SELF="${BASH_SOURCE[0]:-$0}"
157
+ exec sudo -u "$AS_USER" --login -- "$SELF" "${new_args[@]}"
158
+ fi
159
+ if [[ "$ALLOW_ROOT" != "1" ]]; then
160
+ cat >&2 <<EOF
161
+ ${c_red}ework-aio install refuses to run as root by default.${c_reset}
162
+
163
+ Why this matters:
164
+ - Data goes under /root/.local/share/ework-aio (unreadable by other users)
165
+ - opencode is searched in root's PATH (usually not installed there)
166
+ - npm packages install to system-wide prefix owned by root
167
+ - systemd units bake root-only paths that other users can't run
168
+
169
+ ${c_bold}Option A (recommended):${c_reset} run as a regular user.
170
+ npm config set prefix '~/.local' # one-time, makes -g user-writable
171
+ npm install -g ework-aio # no sudo needed
172
+ ework-aio install # uses --user systemd scope
173
+
174
+ ${c_bold}Option B:${c_reset} install with sudo but target a regular user.
175
+ sudo ework-aio install --as-user $(logname 2>/dev/null || echo '<your-user>')
176
+ # All data + opencode + npm resolved under that user's HOME.
177
+ # systemd --user scope (linger auto-enabled for the target user).
178
+
179
+ ${c_bold}Option C:${c_reset} really install as root (you've set up root's env).
180
+ sudo ework-aio install --allow-root
181
+ EOF
182
+ exit 1
183
+ fi
184
+ warn "Running install as root with --allow-root — data will live under /root."
185
+ fi
186
+
116
187
  # Resolve scope: default by uid
117
188
  if [[ "$SCOPENAME" == "--user" && "${EUID:-$(id -u)}" == "0" ]]; then
118
189
  SCOPENAME="--system"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ework-aio",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "All-in-one installer for ework (issue tracker) + ework-daemon (AI bridge) + opencode-ework (plugin). One command: npm i -g ework-aio && ework-aio install.",
5
5
  "type": "module",
6
6
  "license": "MIT",