home-hosted 0.7.0 → 0.7.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/AGENTS.md CHANGED
@@ -21,7 +21,8 @@ seed entry, or a path that names one.
21
21
  ```sh
22
22
  pnpm run up|down|restart|status # detached; `down` asks /_hh/shutdown, signals are the fallback
23
23
  pnpm run start # up --foreground (systemd, docker, a foreground shell)
24
- pnpm dev # tsx-watch panel :3999 + the stock UI's Vite :3998 (proxies /api)
24
+ pnpm dev # tsx-watch panel :6000 + the stock UI's Vite :6001 (proxies /api), state in .dev-state/
25
+ pnpm dev --ui noc-console # the same, for another UI; --port/--ui-port override
25
26
  pnpm run build # dist/cli.js + the stock UI (uis/stock/dist)
26
27
  pnpm run build:uis # every UI under uis/, zipped into uis/dist/ (release assets)
27
28
  pnpm run quickcheck # eslint + tsc + vue-tsc for every UI under uis/
@@ -36,6 +37,12 @@ pnpm run media # regenerate docs/media (mockups, both served
36
37
 
37
38
  The published bin is `home-hosted`, with an `hh` alias: both names run the same CLI.
38
39
 
40
+ **Dev servers and test instances stay in the 6xxx range** — panel 6000, UI 6001, test-spawned panels
41
+ 6100+ (`pnpm dev` takes `--ui`/`--port`/`--ui-port`, or `HHOSTED_DEV_PANEL_PORT` /
42
+ `HHOSTED_DEV_UI_PORT`). Never assume 3999 is free: an installed panel or another dev instance may hold
43
+ it, and the CLI's port preflight runs *before* its config guard, so a busy default port turns config
44
+ tests red for the wrong reason.
45
+
39
46
  Releases are dispatched from `.github/workflows/release.yml` with a version (and a `dry-run` switch
40
47
  that stops before pushing). It verifies the version, lints/types/tests, builds the CLI plus the stock
41
48
  UI and every UI zip, lets changelogen write the changelog, bump `package.json`, commit and tag
package/README.md CHANGED
@@ -605,9 +605,10 @@ scripts/ builds, typechecks, media capture, release helpers
605
605
  test/ the vitest suite
606
606
  ```
607
607
 
608
- `pnpm dev` runs the panel with `tsx watch` plus the stock UI's dev server (state goes to
609
- `.dev-state/`); `pnpm build` produces `dist/` and `uis/stock/dist/`; `pnpm quickcheck` is lint plus
610
- types; `pnpm test` is vitest; `pnpm run media` regenerates the GIF above.
608
+ `pnpm dev` runs the panel with `tsx watch` plus one UI's dev server on the 6xxx range — panel `6000`,
609
+ UI `6001` (`pnpm dev --ui noc-console`), state in `.dev-state/` — so a dev instance never fights an
610
+ installed panel's 3999. `pnpm build` produces `dist/` and `uis/stock/dist/`; `pnpm quickcheck` is lint
611
+ plus types; `pnpm test` is vitest; `pnpm run media` regenerates the GIF above.
611
612
 
612
613
  <details>
613
614
  <summary><b>📚 Which doc do I need?</b></summary>
package/dist/cli.js CHANGED
@@ -13029,22 +13029,6 @@ async function runControlPlane(options) {
13029
13029
  const hub = new EventHub();
13030
13030
  let app;
13031
13031
  const token = newToken();
13032
- const controlServer = new ControlServer({
13033
- fetch: (request) => {
13034
- if (!app) throw new Error("the control app is not ready yet");
13035
- return app.fetch(request);
13036
- },
13037
- trustProxy: () => settings.control.auth.trustProxy,
13038
- tls: () => settings.control.tls.enabled ? tls.load() : null
13039
- }, {
13040
- host: settings.control.host,
13041
- port: settings.control.port,
13042
- tls: settings.control.tls.enabled
13043
- });
13044
- if (!auth.passwordSet) {
13045
- auth.ensureDefaultPassword("hh");
13046
- logger.warn(`no password was set — created the default "hh"; change it in Global Settings → Authentication`);
13047
- }
13048
13032
  const configured = settings.control;
13049
13033
  const intendedHost = options.host === void 0 ? configured.host : parseBind(options.host);
13050
13034
  if (intendedHost === null) {
@@ -13059,6 +13043,22 @@ async function runControlPlane(options) {
13059
13043
  logger.error(`invalid control port: ${String(options.port)}`);
13060
13044
  process.exit(1);
13061
13045
  }
13046
+ const controlServer = new ControlServer({
13047
+ fetch: (request) => {
13048
+ if (!app) throw new Error("the control app is not ready yet");
13049
+ return app.fetch(request);
13050
+ },
13051
+ trustProxy: () => settings.control.auth.trustProxy,
13052
+ tls: () => settings.control.tls.enabled ? tls.load() : null
13053
+ }, {
13054
+ host: intended.host,
13055
+ port: intended.port,
13056
+ tls: settings.control.tls.enabled
13057
+ });
13058
+ if (!auth.passwordSet) {
13059
+ auth.ensureDefaultPassword("hh");
13060
+ logger.warn(`no password was set — created the default "hh"; change it in Global Settings → Authentication`);
13061
+ }
13062
13062
  const exposure = checkExposure({
13063
13063
  ...configured,
13064
13064
  host: intended.host