@happier-dev/stack 0.1.0-preview.5.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 (439) hide show
  1. package/README.md +501 -0
  2. package/bin/hstack.mjs +348 -0
  3. package/docs/codex-mcp-resume.md +129 -0
  4. package/docs/edison.md +74 -0
  5. package/docs/forking-and-branding.md +189 -0
  6. package/docs/happy-development.md +22 -0
  7. package/docs/isolated-linux-vm.md +243 -0
  8. package/docs/menubar.md +244 -0
  9. package/docs/mobile-ios.md +322 -0
  10. package/docs/monorepo-migration.md +20 -0
  11. package/docs/paths-and-env.md +154 -0
  12. package/docs/remote-access.md +43 -0
  13. package/docs/server-flavors.md +147 -0
  14. package/docs/stacks.md +330 -0
  15. package/docs/tauri.md +60 -0
  16. package/docs/worktrees-and-forks.md +133 -0
  17. package/extras/swiftbar/auth-login.sh +29 -0
  18. package/extras/swiftbar/git-cache-refresh.sh +122 -0
  19. package/extras/swiftbar/hstack-term.sh +133 -0
  20. package/extras/swiftbar/hstack.5s.sh +296 -0
  21. package/extras/swiftbar/hstack.sh +35 -0
  22. package/extras/swiftbar/icons/happy-green.png +0 -0
  23. package/extras/swiftbar/icons/happy-orange.png +0 -0
  24. package/extras/swiftbar/icons/happy-red.png +0 -0
  25. package/extras/swiftbar/icons/logo-white.png +0 -0
  26. package/extras/swiftbar/install.sh +265 -0
  27. package/extras/swiftbar/lib/git.sh +629 -0
  28. package/extras/swiftbar/lib/icons.sh +92 -0
  29. package/extras/swiftbar/lib/render.sh +999 -0
  30. package/extras/swiftbar/lib/system.sh +244 -0
  31. package/extras/swiftbar/lib/utils.sh +717 -0
  32. package/extras/swiftbar/set-interval.sh +65 -0
  33. package/extras/swiftbar/set-server-flavor.sh +61 -0
  34. package/extras/swiftbar/wt-pr.sh +140 -0
  35. package/node_modules/@happier-dev/cli-common/README.md +6 -0
  36. package/node_modules/@happier-dev/cli-common/dist/index.d.ts +4 -0
  37. package/node_modules/@happier-dev/cli-common/dist/index.d.ts.map +1 -0
  38. package/node_modules/@happier-dev/cli-common/dist/index.js +4 -0
  39. package/node_modules/@happier-dev/cli-common/dist/index.js.map +1 -0
  40. package/node_modules/@happier-dev/cli-common/dist/links/index.d.ts +18 -0
  41. package/node_modules/@happier-dev/cli-common/dist/links/index.d.ts.map +1 -0
  42. package/node_modules/@happier-dev/cli-common/dist/links/index.js +25 -0
  43. package/node_modules/@happier-dev/cli-common/dist/links/index.js.map +1 -0
  44. package/node_modules/@happier-dev/cli-common/dist/links.d.ts +2 -0
  45. package/node_modules/@happier-dev/cli-common/dist/links.d.ts.map +1 -0
  46. package/node_modules/@happier-dev/cli-common/dist/links.js +2 -0
  47. package/node_modules/@happier-dev/cli-common/dist/links.js.map +1 -0
  48. package/node_modules/@happier-dev/cli-common/dist/update/index.d.ts +67 -0
  49. package/node_modules/@happier-dev/cli-common/dist/update/index.d.ts.map +1 -0
  50. package/node_modules/@happier-dev/cli-common/dist/update/index.js +259 -0
  51. package/node_modules/@happier-dev/cli-common/dist/update/index.js.map +1 -0
  52. package/node_modules/@happier-dev/cli-common/dist/workspaces/index.d.ts +17 -0
  53. package/node_modules/@happier-dev/cli-common/dist/workspaces/index.d.ts.map +1 -0
  54. package/node_modules/@happier-dev/cli-common/dist/workspaces/index.js +80 -0
  55. package/node_modules/@happier-dev/cli-common/dist/workspaces/index.js.map +1 -0
  56. package/node_modules/@happier-dev/cli-common/package.json +26 -0
  57. package/package.json +77 -0
  58. package/scripts/auth.mjs +1829 -0
  59. package/scripts/auth_copy_from_pglite_lock_in_use.integration.test.mjs +90 -0
  60. package/scripts/auth_copy_from_runCapture.integration.test.mjs +447 -0
  61. package/scripts/auth_help_cmd.test.mjs +28 -0
  62. package/scripts/auth_login_flow_in_tty.test.mjs +100 -0
  63. package/scripts/auth_login_force_default.test.mjs +66 -0
  64. package/scripts/auth_login_guided_server_no_expo.test.mjs +126 -0
  65. package/scripts/auth_login_method_override.test.mjs +67 -0
  66. package/scripts/auth_login_print_includes_configure_links.test.mjs +99 -0
  67. package/scripts/auth_status_server_validation.integration.test.mjs +140 -0
  68. package/scripts/build.mjs +266 -0
  69. package/scripts/bundleWorkspaceDeps.mjs +38 -0
  70. package/scripts/bundleWorkspaceDeps.test.mjs +77 -0
  71. package/scripts/ci.mjs +135 -0
  72. package/scripts/ci.test.mjs +50 -0
  73. package/scripts/cli-link.mjs +57 -0
  74. package/scripts/completion.mjs +395 -0
  75. package/scripts/contrib.mjs +333 -0
  76. package/scripts/daemon.mjs +1160 -0
  77. package/scripts/daemon.status_scope.test.mjs +51 -0
  78. package/scripts/daemon_cmd.mjs +26 -0
  79. package/scripts/daemon_dist_guard.test.mjs +171 -0
  80. package/scripts/daemon_invalid_auth_reseed_stack_name.integration.test.mjs +608 -0
  81. package/scripts/daemon_server_scoped_state.test.mjs +49 -0
  82. package/scripts/daemon_start_verification.integration.test.mjs +296 -0
  83. package/scripts/dev.mjs +545 -0
  84. package/scripts/doctor.mjs +340 -0
  85. package/scripts/doctor_cmd.test.mjs +22 -0
  86. package/scripts/doctor_ui_index_missing.test.mjs +37 -0
  87. package/scripts/eas.mjs +367 -0
  88. package/scripts/eas_platform_parsing.test.mjs +63 -0
  89. package/scripts/edison.mjs +1848 -0
  90. package/scripts/env.mjs +149 -0
  91. package/scripts/env_cmd.test.mjs +118 -0
  92. package/scripts/exit_cleanup_kills_detached_children_on_crash.integration.test.mjs +80 -0
  93. package/scripts/happier.mjs +82 -0
  94. package/scripts/import.mjs +1327 -0
  95. package/scripts/init.mjs +464 -0
  96. package/scripts/install.mjs +550 -0
  97. package/scripts/lint.mjs +177 -0
  98. package/scripts/menubar.mjs +202 -0
  99. package/scripts/migrate.mjs +318 -0
  100. package/scripts/mobile.mjs +353 -0
  101. package/scripts/mobile_dev_client.mjs +87 -0
  102. package/scripts/monorepo.mjs +2234 -0
  103. package/scripts/monorepo_port.apply.integration.test.mjs +680 -0
  104. package/scripts/monorepo_port.conflicts.integration.test.mjs +454 -0
  105. package/scripts/monorepo_port.validation.integration.test.mjs +486 -0
  106. package/scripts/orchestrated_stack_auth_flow.test.mjs +134 -0
  107. package/scripts/orchestrated_stack_auth_flow_resolve_port.test.mjs +98 -0
  108. package/scripts/orchestrated_stack_auth_flow_webapp_url.test.mjs +119 -0
  109. package/scripts/pack.mjs +257 -0
  110. package/scripts/pack.test.mjs +68 -0
  111. package/scripts/pglite_lock.integration.test.mjs +152 -0
  112. package/scripts/provision/linux-ubuntu-e2e.sh +132 -0
  113. package/scripts/provision/linux-ubuntu-review-pr.sh +66 -0
  114. package/scripts/provision/macos-lima-happy-vm.sh +192 -0
  115. package/scripts/provision/macos-lima-hstack-e2e.sh +100 -0
  116. package/scripts/release.mjs +53 -0
  117. package/scripts/release_binary_smoke.integration.test.mjs +159 -0
  118. package/scripts/review.mjs +1752 -0
  119. package/scripts/review_pr.mjs +435 -0
  120. package/scripts/run.mjs +561 -0
  121. package/scripts/run_script_with_stack_env.restart_port_reuse.test.mjs +30 -0
  122. package/scripts/self.mjs +465 -0
  123. package/scripts/self_host.mjs +9 -0
  124. package/scripts/self_host_binary_smoke.integration.test.mjs +94 -0
  125. package/scripts/self_host_runtime.mjs +883 -0
  126. package/scripts/self_host_runtime.test.mjs +82 -0
  127. package/scripts/self_host_systemd.real.integration.test.mjs +367 -0
  128. package/scripts/server_flavor.mjs +148 -0
  129. package/scripts/service.mjs +868 -0
  130. package/scripts/service_mode_help.test.mjs +27 -0
  131. package/scripts/setup.mjs +1324 -0
  132. package/scripts/setup_non_interactive_flag.test.mjs +60 -0
  133. package/scripts/setup_pr.mjs +605 -0
  134. package/scripts/setup_pr_orchestrated_auth_flow_util_import.test.mjs +117 -0
  135. package/scripts/stack/command_arguments.mjs +91 -0
  136. package/scripts/stack/copy_auth_from_stack.mjs +111 -0
  137. package/scripts/stack/delegated_script_commands.mjs +92 -0
  138. package/scripts/stack/help_text.mjs +110 -0
  139. package/scripts/stack/port_reservation.mjs +74 -0
  140. package/scripts/stack/repo_checkout_resolution.mjs +31 -0
  141. package/scripts/stack/run_script_with_stack_env.mjs +634 -0
  142. package/scripts/stack/stack_daemon_command.mjs +219 -0
  143. package/scripts/stack/stack_delegated_help.mjs +81 -0
  144. package/scripts/stack/stack_environment.mjs +151 -0
  145. package/scripts/stack/stack_environment.sanitization.test.mjs +75 -0
  146. package/scripts/stack/stack_happier_passthrough_command.mjs +63 -0
  147. package/scripts/stack/stack_info_snapshot.mjs +167 -0
  148. package/scripts/stack/stack_mobile_install_command.mjs +61 -0
  149. package/scripts/stack/stack_resume_command.mjs +76 -0
  150. package/scripts/stack/stack_stop_command.mjs +34 -0
  151. package/scripts/stack/stack_workspace_command.mjs +83 -0
  152. package/scripts/stack/transient_repo_overrides.mjs +29 -0
  153. package/scripts/stack.mjs +2388 -0
  154. package/scripts/stack_archive_cmd.integration.test.mjs +31 -0
  155. package/scripts/stack_audit_fix_light_env.test.mjs +129 -0
  156. package/scripts/stack_background_pinned_stack_json.test.mjs +81 -0
  157. package/scripts/stack_copy_auth_server_scoped.test.mjs +243 -0
  158. package/scripts/stack_daemon_cmd.integration.test.mjs +484 -0
  159. package/scripts/stack_eas_help.test.mjs +72 -0
  160. package/scripts/stack_editor_workspace_monorepo_root.test.mjs +102 -0
  161. package/scripts/stack_env_cmd.test.mjs +107 -0
  162. package/scripts/stack_guided_login_bundle_error_parse.test.mjs +20 -0
  163. package/scripts/stack_guided_login_inner_invocation.test.mjs +46 -0
  164. package/scripts/stack_happy_cmd.integration.test.mjs +263 -0
  165. package/scripts/stack_info_snapshot_running_status.test.mjs +186 -0
  166. package/scripts/stack_interactive_monorepo_group.test.mjs +128 -0
  167. package/scripts/stack_monorepo_defaults.test.mjs +31 -0
  168. package/scripts/stack_monorepo_repo_dev_token.test.mjs +32 -0
  169. package/scripts/stack_monorepo_server_light_from_happy_spec.test.mjs +37 -0
  170. package/scripts/stack_new_name_normalize_cmd.test.mjs +38 -0
  171. package/scripts/stack_pr_name_normalize_cmd.test.mjs +84 -0
  172. package/scripts/stack_resume_cmd.integration.test.mjs +134 -0
  173. package/scripts/stack_server_flavors_defaults.test.mjs +64 -0
  174. package/scripts/stack_shorthand_cmd.integration.test.mjs +74 -0
  175. package/scripts/stack_stop_sweeps_legacy_infra_without_kind.integration.test.mjs +44 -0
  176. package/scripts/stack_stop_sweeps_when_runtime_missing.integration.test.mjs +42 -0
  177. package/scripts/stack_stop_sweeps_when_runtime_stale.integration.test.mjs +50 -0
  178. package/scripts/stack_wt_list.test.mjs +117 -0
  179. package/scripts/start_ui_required_default.test.mjs +63 -0
  180. package/scripts/stop.mjs +190 -0
  181. package/scripts/stopStackWithEnv_no_autosweep_when_runtime_missing.integration.test.mjs +95 -0
  182. package/scripts/swiftbar_git_monorepo_cmd.test.mjs +75 -0
  183. package/scripts/swiftbar_render_monorepo_wt_actions.integration.test.mjs +116 -0
  184. package/scripts/swiftbar_utils_cmd.test.mjs +92 -0
  185. package/scripts/swiftbar_wt_pr_backcompat.test.mjs +162 -0
  186. package/scripts/systemd_unit_info.test.mjs +24 -0
  187. package/scripts/tailscale.mjs +490 -0
  188. package/scripts/test_ci.mjs +36 -0
  189. package/scripts/test_cmd.mjs +274 -0
  190. package/scripts/test_cmd.test.mjs +133 -0
  191. package/scripts/test_integration.mjs +33 -0
  192. package/scripts/testkit/auth_testkit.mjs +121 -0
  193. package/scripts/testkit/doctor_testkit.mjs +68 -0
  194. package/scripts/testkit/monorepo_port_testkit.mjs +157 -0
  195. package/scripts/testkit/stack_archive_command_testkit.mjs +55 -0
  196. package/scripts/testkit/stack_new_monorepo_testkit.mjs +83 -0
  197. package/scripts/testkit/stack_script_command_testkit.mjs +27 -0
  198. package/scripts/testkit/stack_stop_sweeps_testkit.mjs +172 -0
  199. package/scripts/testkit/worktrees_monorepo_testkit.mjs +53 -0
  200. package/scripts/tools.mjs +70 -0
  201. package/scripts/tui.mjs +914 -0
  202. package/scripts/tui_stopStackForTuiExit_no_autosweep.integration.test.mjs +95 -0
  203. package/scripts/typecheck.mjs +178 -0
  204. package/scripts/ui_gateway.mjs +247 -0
  205. package/scripts/uninstall.mjs +179 -0
  206. package/scripts/utils/auth/credentials_paths.mjs +181 -0
  207. package/scripts/utils/auth/credentials_paths.test.mjs +187 -0
  208. package/scripts/utils/auth/daemon_gate.mjs +66 -0
  209. package/scripts/utils/auth/daemon_gate.test.mjs +116 -0
  210. package/scripts/utils/auth/decode_jwt_payload_unsafe.mjs +16 -0
  211. package/scripts/utils/auth/dev_key.mjs +163 -0
  212. package/scripts/utils/auth/files.mjs +56 -0
  213. package/scripts/utils/auth/guided_pr_auth.mjs +86 -0
  214. package/scripts/utils/auth/guided_stack_web_login.mjs +56 -0
  215. package/scripts/utils/auth/handy_master_secret.mjs +42 -0
  216. package/scripts/utils/auth/interactive_stack_auth.mjs +70 -0
  217. package/scripts/utils/auth/login_ux.mjs +105 -0
  218. package/scripts/utils/auth/orchestrated_stack_auth_flow.mjs +291 -0
  219. package/scripts/utils/auth/sources.mjs +28 -0
  220. package/scripts/utils/auth/stable_scope_id.mjs +91 -0
  221. package/scripts/utils/auth/stable_scope_id.test.mjs +51 -0
  222. package/scripts/utils/auth/stack_guided_login.mjs +438 -0
  223. package/scripts/utils/cli/arg_values.mjs +23 -0
  224. package/scripts/utils/cli/arg_values.test.mjs +43 -0
  225. package/scripts/utils/cli/args.mjs +17 -0
  226. package/scripts/utils/cli/cli.mjs +24 -0
  227. package/scripts/utils/cli/cli_registry.mjs +440 -0
  228. package/scripts/utils/cli/cwd_scope.mjs +158 -0
  229. package/scripts/utils/cli/cwd_scope.test.mjs +154 -0
  230. package/scripts/utils/cli/flags.mjs +17 -0
  231. package/scripts/utils/cli/log_forwarder.mjs +157 -0
  232. package/scripts/utils/cli/normalize.mjs +16 -0
  233. package/scripts/utils/cli/prereqs.mjs +103 -0
  234. package/scripts/utils/cli/prereqs.test.mjs +33 -0
  235. package/scripts/utils/cli/progress.mjs +141 -0
  236. package/scripts/utils/cli/smoke_help.mjs +44 -0
  237. package/scripts/utils/cli/verbosity.mjs +11 -0
  238. package/scripts/utils/cli/wizard.mjs +139 -0
  239. package/scripts/utils/cli/wizard_promptSelect.test.mjs +44 -0
  240. package/scripts/utils/cli/wizard_prompt_worktree_source_lazy.test.mjs +132 -0
  241. package/scripts/utils/cli/wizard_worktree_slug.test.mjs +33 -0
  242. package/scripts/utils/crypto/tokens.mjs +14 -0
  243. package/scripts/utils/dev/daemon.mjs +232 -0
  244. package/scripts/utils/dev/daemon_watch_resilience.test.mjs +224 -0
  245. package/scripts/utils/dev/expo_dev.buildEnv.test.mjs +35 -0
  246. package/scripts/utils/dev/expo_dev.mjs +478 -0
  247. package/scripts/utils/dev/expo_dev.test.mjs +89 -0
  248. package/scripts/utils/dev/expo_dev_restart_port_reservation.test.mjs +120 -0
  249. package/scripts/utils/dev/expo_dev_verbose_logs.test.mjs +60 -0
  250. package/scripts/utils/dev/server.mjs +180 -0
  251. package/scripts/utils/dev_auth_key.mjs +7 -0
  252. package/scripts/utils/edison/git_roots.mjs +30 -0
  253. package/scripts/utils/edison/git_roots.test.mjs +49 -0
  254. package/scripts/utils/env/config.mjs +52 -0
  255. package/scripts/utils/env/dotenv.mjs +32 -0
  256. package/scripts/utils/env/dotenv.test.mjs +32 -0
  257. package/scripts/utils/env/env.mjs +130 -0
  258. package/scripts/utils/env/env_file.mjs +98 -0
  259. package/scripts/utils/env/env_file.test.mjs +49 -0
  260. package/scripts/utils/env/env_local.mjs +25 -0
  261. package/scripts/utils/env/load_env_file.mjs +34 -0
  262. package/scripts/utils/env/read.mjs +30 -0
  263. package/scripts/utils/env/sandbox.mjs +13 -0
  264. package/scripts/utils/env/scrub_env.mjs +69 -0
  265. package/scripts/utils/env/scrub_env.test.mjs +102 -0
  266. package/scripts/utils/env/values.mjs +13 -0
  267. package/scripts/utils/expo/command.mjs +65 -0
  268. package/scripts/utils/expo/expo.mjs +139 -0
  269. package/scripts/utils/expo/expo_state_running.test.mjs +48 -0
  270. package/scripts/utils/expo/metro_ports.mjs +101 -0
  271. package/scripts/utils/expo/metro_ports.test.mjs +35 -0
  272. package/scripts/utils/fs/atomic_dir_swap.mjs +55 -0
  273. package/scripts/utils/fs/atomic_dir_swap.test.mjs +54 -0
  274. package/scripts/utils/fs/file_has_content.mjs +10 -0
  275. package/scripts/utils/fs/fs.mjs +11 -0
  276. package/scripts/utils/fs/json.mjs +25 -0
  277. package/scripts/utils/fs/ops.mjs +29 -0
  278. package/scripts/utils/fs/package_json.mjs +8 -0
  279. package/scripts/utils/fs/tail.mjs +12 -0
  280. package/scripts/utils/git/dev_checkout.mjs +127 -0
  281. package/scripts/utils/git/dev_checkout.test.mjs +115 -0
  282. package/scripts/utils/git/git.mjs +67 -0
  283. package/scripts/utils/git/parse_name_status_z.mjs +21 -0
  284. package/scripts/utils/git/refs.mjs +26 -0
  285. package/scripts/utils/git/worktrees.mjs +323 -0
  286. package/scripts/utils/git/worktrees_monorepo.test.mjs +60 -0
  287. package/scripts/utils/git/worktrees_pathstyle.test.mjs +53 -0
  288. package/scripts/utils/llm/assist.mjs +260 -0
  289. package/scripts/utils/llm/codex_exec.mjs +61 -0
  290. package/scripts/utils/llm/codex_exec.test.mjs +46 -0
  291. package/scripts/utils/llm/hstack_runner.mjs +59 -0
  292. package/scripts/utils/llm/tools.mjs +56 -0
  293. package/scripts/utils/llm/tools.test.mjs +67 -0
  294. package/scripts/utils/menubar/swiftbar.mjs +121 -0
  295. package/scripts/utils/menubar/swiftbar.test.mjs +85 -0
  296. package/scripts/utils/mobile/config.mjs +35 -0
  297. package/scripts/utils/mobile/dev_client_links.mjs +59 -0
  298. package/scripts/utils/mobile/identifiers.mjs +46 -0
  299. package/scripts/utils/mobile/identifiers.test.mjs +41 -0
  300. package/scripts/utils/mobile/ios_xcodeproj_patch.mjs +128 -0
  301. package/scripts/utils/mobile/ios_xcodeproj_patch.test.mjs +131 -0
  302. package/scripts/utils/net/bind_mode.mjs +39 -0
  303. package/scripts/utils/net/dns.mjs +10 -0
  304. package/scripts/utils/net/lan_ip.mjs +24 -0
  305. package/scripts/utils/net/ports.mjs +110 -0
  306. package/scripts/utils/net/tcp_forward.mjs +162 -0
  307. package/scripts/utils/net/url.mjs +30 -0
  308. package/scripts/utils/net/url.test.mjs +29 -0
  309. package/scripts/utils/paths/canonical_home.mjs +15 -0
  310. package/scripts/utils/paths/canonical_home.test.mjs +28 -0
  311. package/scripts/utils/paths/localhost_host.mjs +112 -0
  312. package/scripts/utils/paths/localhost_host.test.mjs +58 -0
  313. package/scripts/utils/paths/paths.mjs +302 -0
  314. package/scripts/utils/paths/paths_env_win32.test.mjs +36 -0
  315. package/scripts/utils/paths/paths_monorepo.test.mjs +58 -0
  316. package/scripts/utils/paths/paths_server_flavors.test.mjs +50 -0
  317. package/scripts/utils/paths/runtime.mjs +41 -0
  318. package/scripts/utils/pglite_lock.mjs +107 -0
  319. package/scripts/utils/proc/commands.mjs +33 -0
  320. package/scripts/utils/proc/exit_cleanup.mjs +57 -0
  321. package/scripts/utils/proc/happy_monorepo_deps.mjs +37 -0
  322. package/scripts/utils/proc/happy_monorepo_deps.test.mjs +89 -0
  323. package/scripts/utils/proc/ownership.mjs +217 -0
  324. package/scripts/utils/proc/ownership_killProcessGroupOwnedByStack.test.mjs +216 -0
  325. package/scripts/utils/proc/ownership_listPidsWithEnvNeedles.test.mjs +88 -0
  326. package/scripts/utils/proc/package_scripts.mjs +38 -0
  327. package/scripts/utils/proc/package_scripts.test.mjs +58 -0
  328. package/scripts/utils/proc/parallel.mjs +25 -0
  329. package/scripts/utils/proc/pids.mjs +11 -0
  330. package/scripts/utils/proc/pm.mjs +478 -0
  331. package/scripts/utils/proc/pm_spawn.integration.test.mjs +131 -0
  332. package/scripts/utils/proc/pm_stack_cache_env.test.mjs +313 -0
  333. package/scripts/utils/proc/proc.mjs +331 -0
  334. package/scripts/utils/proc/proc.test.mjs +85 -0
  335. package/scripts/utils/proc/terminate.mjs +69 -0
  336. package/scripts/utils/proc/terminate.test.mjs +54 -0
  337. package/scripts/utils/proc/watch.mjs +63 -0
  338. package/scripts/utils/review/augment_runner_integration.test.mjs +105 -0
  339. package/scripts/utils/review/base_ref.mjs +82 -0
  340. package/scripts/utils/review/base_ref.test.mjs +89 -0
  341. package/scripts/utils/review/chunks.mjs +55 -0
  342. package/scripts/utils/review/chunks.test.mjs +107 -0
  343. package/scripts/utils/review/detached_worktree.mjs +61 -0
  344. package/scripts/utils/review/detached_worktree.test.mjs +61 -0
  345. package/scripts/utils/review/findings.mjs +278 -0
  346. package/scripts/utils/review/findings.test.mjs +203 -0
  347. package/scripts/utils/review/head_slice.mjs +132 -0
  348. package/scripts/utils/review/head_slice.test.mjs +117 -0
  349. package/scripts/utils/review/instructions/deep.md +20 -0
  350. package/scripts/utils/review/prompts.mjs +279 -0
  351. package/scripts/utils/review/prompts.test.mjs +77 -0
  352. package/scripts/utils/review/run_reviewers_safe.mjs +12 -0
  353. package/scripts/utils/review/run_reviewers_safe.test.mjs +45 -0
  354. package/scripts/utils/review/runners/augment.mjs +91 -0
  355. package/scripts/utils/review/runners/augment.test.mjs +64 -0
  356. package/scripts/utils/review/runners/claude.mjs +92 -0
  357. package/scripts/utils/review/runners/claude.test.mjs +47 -0
  358. package/scripts/utils/review/runners/coderabbit.mjs +105 -0
  359. package/scripts/utils/review/runners/coderabbit.test.mjs +32 -0
  360. package/scripts/utils/review/runners/codex.mjs +129 -0
  361. package/scripts/utils/review/runners/codex.test.mjs +115 -0
  362. package/scripts/utils/review/slice_mode.mjs +20 -0
  363. package/scripts/utils/review/slice_mode.test.mjs +69 -0
  364. package/scripts/utils/review/sliced_runner.mjs +39 -0
  365. package/scripts/utils/review/sliced_runner.test.mjs +57 -0
  366. package/scripts/utils/review/slices.mjs +140 -0
  367. package/scripts/utils/review/slices.test.mjs +41 -0
  368. package/scripts/utils/review/targets.mjs +23 -0
  369. package/scripts/utils/review/targets.test.mjs +31 -0
  370. package/scripts/utils/review/tool_home_seed.mjs +106 -0
  371. package/scripts/utils/review/tool_home_seed.test.mjs +124 -0
  372. package/scripts/utils/review/uncommitted_ops.mjs +77 -0
  373. package/scripts/utils/review/uncommitted_ops.test.mjs +117 -0
  374. package/scripts/utils/sandbox/review_pr_sandbox.mjs +105 -0
  375. package/scripts/utils/server/apply_server_light_env_defaults.mjs +14 -0
  376. package/scripts/utils/server/flavor_scripts.mjs +138 -0
  377. package/scripts/utils/server/flavor_scripts.test.mjs +115 -0
  378. package/scripts/utils/server/infra/happy_server_infra.mjs +444 -0
  379. package/scripts/utils/server/mobile_api_url.mjs +60 -0
  380. package/scripts/utils/server/mobile_api_url.test.mjs +58 -0
  381. package/scripts/utils/server/port.mjs +55 -0
  382. package/scripts/utils/server/prisma_import.mjs +36 -0
  383. package/scripts/utils/server/prisma_import.test.mjs +78 -0
  384. package/scripts/utils/server/server.mjs +109 -0
  385. package/scripts/utils/server/ui_build_check.mjs +37 -0
  386. package/scripts/utils/server/ui_build_check.test.mjs +70 -0
  387. package/scripts/utils/server/ui_env.mjs +13 -0
  388. package/scripts/utils/server/ui_env.test.mjs +57 -0
  389. package/scripts/utils/server/urls.mjs +100 -0
  390. package/scripts/utils/server/validate.mjs +60 -0
  391. package/scripts/utils/server/validate.test.mjs +76 -0
  392. package/scripts/utils/service/autostart_darwin.mjs +198 -0
  393. package/scripts/utils/service/autostart_darwin.test.mjs +49 -0
  394. package/scripts/utils/service/autostart_darwin_keepalive.test.mjs +19 -0
  395. package/scripts/utils/stack/cli_identities.mjs +29 -0
  396. package/scripts/utils/stack/context.mjs +19 -0
  397. package/scripts/utils/stack/dirs.mjs +26 -0
  398. package/scripts/utils/stack/editor_workspace.mjs +126 -0
  399. package/scripts/utils/stack/interactive_stack_config.mjs +266 -0
  400. package/scripts/utils/stack/interactive_stack_config.port_validation.test.mjs +93 -0
  401. package/scripts/utils/stack/interactive_stack_config.remote_validation.test.mjs +122 -0
  402. package/scripts/utils/stack/interactive_stack_config.stack_name_validation.test.mjs +76 -0
  403. package/scripts/utils/stack/interactive_stack_config_testkit.mjs +18 -0
  404. package/scripts/utils/stack/names.mjs +27 -0
  405. package/scripts/utils/stack/names.test.mjs +26 -0
  406. package/scripts/utils/stack/pr_stack_name.mjs +16 -0
  407. package/scripts/utils/stack/runtime_state.mjs +88 -0
  408. package/scripts/utils/stack/stacks.mjs +40 -0
  409. package/scripts/utils/stack/startup.mjs +370 -0
  410. package/scripts/utils/stack/startup_server_light_dirs.test.mjs +119 -0
  411. package/scripts/utils/stack/startup_server_light_generate.test.mjs +20 -0
  412. package/scripts/utils/stack/startup_server_light_legacy.test.mjs +79 -0
  413. package/scripts/utils/stack/startup_server_light_testkit.mjs +106 -0
  414. package/scripts/utils/stack/stop.mjs +284 -0
  415. package/scripts/utils/stack_context.mjs +1 -0
  416. package/scripts/utils/stack_runtime_state.mjs +1 -0
  417. package/scripts/utils/stacks.mjs +1 -0
  418. package/scripts/utils/tailscale/ip.mjs +116 -0
  419. package/scripts/utils/tauri/stack_overrides.mjs +22 -0
  420. package/scripts/utils/test/collect_test_files.mjs +29 -0
  421. package/scripts/utils/time/get_today_ymd.mjs +7 -0
  422. package/scripts/utils/tui/cleanup.mjs +38 -0
  423. package/scripts/utils/ui/ansi.mjs +47 -0
  424. package/scripts/utils/ui/browser.mjs +31 -0
  425. package/scripts/utils/ui/browser.test.mjs +56 -0
  426. package/scripts/utils/ui/clipboard.mjs +38 -0
  427. package/scripts/utils/ui/layout.mjs +44 -0
  428. package/scripts/utils/ui/qr.mjs +17 -0
  429. package/scripts/utils/ui/terminal_launcher.mjs +129 -0
  430. package/scripts/utils/ui/text.mjs +16 -0
  431. package/scripts/utils/update/auto_update_notice.mjs +93 -0
  432. package/scripts/utils/validate.mjs +5 -0
  433. package/scripts/where.mjs +138 -0
  434. package/scripts/worktrees.mjs +2174 -0
  435. package/scripts/worktrees_archive_cmd.integration.test.mjs +228 -0
  436. package/scripts/worktrees_cursor_monorepo_root.test.mjs +23 -0
  437. package/scripts/worktrees_list_specs_no_recurse.test.mjs +32 -0
  438. package/scripts/worktrees_monorepo_testkit.test.mjs +29 -0
  439. package/scripts/worktrees_monorepo_use_group.test.mjs +41 -0
package/docs/stacks.md ADDED
@@ -0,0 +1,330 @@
1
+ # Stacks (multiple local Happier instances)
2
+
3
+ `hstack` supports running **multiple stacks** in parallel on the same machine.
4
+
5
+ A “stack” is just:
6
+
7
+ - a dedicated **server port**
8
+ - isolated directories for **UI build output**, **CLI home**, and **logs**
9
+ - a repo checkout pin (point at a specific worktree/checkout)
10
+ - (when using `happier-server`) isolated **infra** (Postgres/Redis/Minio) managed per-stack
11
+
12
+ Stacks are configured via a plain env file stored under:
13
+
14
+ ```
15
+ ~/.happier/stacks/<name>/env
16
+ ```
17
+
18
+ ## Create a stack
19
+
20
+ Non-interactive:
21
+
22
+ ```bash
23
+ hstack stack new exp1 --port=3010 --server=happier-server-light
24
+ ```
25
+
26
+ Auto-pick a port:
27
+
28
+ ```bash
29
+ hstack stack new exp2
30
+ ```
31
+
32
+ ## Create a PR test stack (copy/paste friendly)
33
+
34
+ If you want maintainers to be able to try your PR quickly, you can give them a single command that:
35
+
36
+ - creates an isolated stack
37
+ - checks out PR(s) into worktrees
38
+ - pins those worktrees to the stack
39
+ - optionally seeds auth
40
+ - optionally starts the stack in dev mode
41
+
42
+ Example (most common):
43
+
44
+ ```bash
45
+ hstack stack pr pr123 \
46
+ --repo=https://github.com/happier-dev/happier/pull/123 \
47
+ --seed-auth --copy-auth-from=dev-auth --link-auth \
48
+ --dev
49
+ ```
50
+
51
+ Notes:
52
+
53
+ - `--remote` (default `upstream`) controls which Git remote is used to fetch `refs/pull/<n>/head`.
54
+ - `--seed-auth` uses `hstack stack auth <stack> copy-from <source>` under the hood, which also best-effort seeds DB Account rows (avoids FK errors like Prisma `P2003`).
55
+ - `--link-auth` symlinks auth files instead of copying them (keeps credentials in sync, but reduces isolation).
56
+ - For full-server stacks (`happier-server`), seeding may require Docker infra to be running.
57
+
58
+ ## Auth seeding (recommended: dev-auth)
59
+
60
+ Create the `dev-auth` seed stack once, authenticate once, then reuse it when creating new stacks:
61
+
62
+ ```bash
63
+ hstack auth seed
64
+ ```
65
+
66
+ Interactive wizard (TTY only):
67
+
68
+ ```bash
69
+ hstack stack new --interactive
70
+ ```
71
+
72
+ The wizard lets you:
73
+
74
+ - pick the server type (`happier-server-light` or `happier-server`)
75
+ - pick or create a repo worktree for the Happier monorepo
76
+ - choose which Git remote to base newly-created worktrees on (defaults to `upstream`)
77
+
78
+ When creating `--server=happier-server` stacks, hstack will also reserve additional ports and persist
79
+ the stack-scoped infra config in the stack env file (so restarts are stable):
80
+
81
+ - `HAPPIER_STACK_PG_PORT`
82
+ - `HAPPIER_STACK_REDIS_PORT`
83
+ - `HAPPIER_STACK_MINIO_PORT`
84
+ - `HAPPIER_STACK_MINIO_CONSOLE_PORT`
85
+ - `DATABASE_URL`, `REDIS_URL`, `S3_*`
86
+
87
+ ## Run a stack
88
+
89
+ Dev mode:
90
+
91
+ ```bash
92
+ hstack stack dev exp1
93
+ ```
94
+
95
+ Production-like mode:
96
+
97
+ ```bash
98
+ hstack stack start exp1
99
+ ```
100
+
101
+ Build UI for a stack (server-light serving):
102
+
103
+ ```bash
104
+ hstack stack build exp1
105
+ ```
106
+
107
+ Doctor:
108
+
109
+ ```bash
110
+ hstack stack doctor exp1
111
+ ```
112
+
113
+ ## Edit a stack (interactive)
114
+
115
+ To change server flavor, port, or repo worktree for an existing stack:
116
+
117
+ ```bash
118
+ hstack stack edit exp1 --interactive
119
+ ```
120
+
121
+ ## Switch server flavor for a stack
122
+
123
+ You can change `happier-server-light` vs `happier-server` for an existing stack without re-running the full edit wizard:
124
+
125
+ ```bash
126
+ hstack stack srv exp1 -- status
127
+ hstack stack srv exp1 -- use happier-server-light
128
+ hstack stack srv exp1 -- use happier-server
129
+ hstack stack srv exp1 -- use --interactive
130
+ ```
131
+
132
+ ## Switch repo worktree for a stack (`stack wt`)
133
+
134
+ If you want the **exact** same UX as `hstack wt`, but scoped to a stack env file:
135
+
136
+ ```bash
137
+ hstack stack wt exp1 -- status
138
+ hstack stack wt exp1 -- use pr/my-ui-pr
139
+ hstack stack wt exp1 -- use default
140
+ ```
141
+
142
+ This updates the stack env file (`~/.happier/stacks/<name>/env`), not repo `env.local` (legacy path still supported).
143
+
144
+ ## Run the Happier CLI against a specific stack (`stack happier`)
145
+
146
+ If you want to run a `happier` CLI command against a specific stack (instead of whatever your current shell env points at), use:
147
+
148
+ ```bash
149
+ hstack stack happier exp1 -- status
150
+ hstack stack happier exp1 -- daemon status
151
+ ```
152
+
153
+ Stack shorthand also works:
154
+
155
+ ```bash
156
+ hstack exp1 happier status
157
+ ```
158
+
159
+ ## Stack wrappers you can use
160
+
161
+ These commands run with the stack env file applied:
162
+
163
+ - `hstack stack dev <name>`
164
+ - `hstack stack start <name>`
165
+ - `hstack stack build <name>`
166
+ - `hstack stack doctor <name>`
167
+ - `hstack stack mobile <name>`
168
+ - `hstack stack eas <name> [subcommand...]`
169
+ - `hstack stack happier <name> [-- ...]`
170
+ - `hstack stack srv <name> -- status|use ...`
171
+ - `hstack stack wt <name> -- <wt args...>`
172
+ - `hstack stack tailscale:status|enable|disable|url <name>`
173
+ - `hstack stack service:* <name>`
174
+
175
+ Global/non-stack commands:
176
+
177
+ - `hstack setup` (recommended; installs shims/runtime and bootstraps the monorepo)
178
+ - (advanced) `hstack init` (plumbing: shims/runtime/pointer env)
179
+ - (advanced) `hstack bootstrap` (clone/install monorepo + deps)
180
+
181
+ ## Services (autostart)
182
+
183
+ Each stack can have its own autostart service (so multiple stacks can start at login).
184
+
185
+ ```bash
186
+ hstack stack service exp1 install
187
+ hstack stack service exp1 status
188
+ hstack stack service exp1 restart
189
+ hstack stack service exp1 logs
190
+ ```
191
+
192
+ Implementation notes:
193
+
194
+ - Service name/label is stack-scoped:
195
+ - `main` → `com.happier.stack`
196
+ - `exp1` → `com.happier.stack.exp1`
197
+ - macOS: implemented via **launchd LaunchAgents**
198
+ - Linux: implemented via **systemd user services** (if available)
199
+ - The service persists `HAPPIER_STACK_ENV_FILE`, so you can edit the stack env file without reinstalling.
200
+
201
+ ## Repo/worktree selection per stack
202
+
203
+ When creating a stack you can point the stack at a repo worktree:
204
+
205
+ ```bash
206
+ hstack stack new exp3 \\
207
+ --repo=local/my-feature \\
208
+ --server=happier-server
209
+ ```
210
+
211
+ Worktree specs are interpreted relative to the workspace:
212
+
213
+ ```
214
+ main -> <workspace>/main
215
+ dev -> <workspace>/dev
216
+ pr/<...> -> <workspace>/pr/<...>
217
+ local/<...> -> <workspace>/local/<owner>/<...>
218
+ tmp/<...> -> <workspace>/tmp/<owner>/<...>
219
+ ```
220
+
221
+ So `--repo=pr/foo` maps to:
222
+
223
+ ```
224
+ <workspace>/pr/foo
225
+ ```
226
+
227
+ You can also pass an absolute path.
228
+
229
+ ## Stack env + repo env precedence
230
+
231
+ On startup, `hstack` loads env in this order:
232
+
233
+ 1. `~/.happier-stack/.env` (defaults)
234
+ 2. `~/.happier-stack/env.local` (optional global overrides; prefer stack env for persistent config)
235
+ 3. `HAPPIER_STACK_ENV_FILE` (stack env; highest precedence)
236
+
237
+ `hstack stack ...` sets `HAPPIER_STACK_ENV_FILE=~/.happier/stacks/<name>/env` and clears any already-exported `HAPPIER_STACK_*` variables so the stack env stays authoritative.
238
+
239
+ For a full explanation of the different folders/paths (`home` vs `workspace` vs `runtime` vs stack storage) and the exact env precedence rules, see: `[docs/paths-and-env.md](docs/paths-and-env.md)`.
240
+
241
+ Cloned-repo fallback (before you run `hstack init`):
242
+
243
+ 1. `<repo>/.env` (defaults)
244
+ 2. `<repo>/env.local` (optional overrides)
245
+ 3. `HAPPIER_STACK_ENV_FILE` (stack env)
246
+
247
+ ## Manage per-stack environment variables (including API keys)
248
+
249
+ To add/update environment variables in a stack env file from the CLI:
250
+
251
+ ```bash
252
+ hstack stack env <stack> set KEY=VALUE [KEY2=VALUE2...]
253
+ ```
254
+
255
+ To remove keys:
256
+
257
+ ```bash
258
+ hstack stack env <stack> unset KEY [KEY2...]
259
+ ```
260
+
261
+ To inspect:
262
+
263
+ ```bash
264
+ hstack stack env <stack> get KEY
265
+ hstack stack env <stack> list
266
+ hstack stack env <stack> path
267
+ ```
268
+
269
+ Notes:
270
+
271
+ - This is the recommended place for **provider API keys** the daemon needs (example: `OPENAI_API_KEY`).
272
+ - Changes apply on the **next start** of the stack/daemon. Restart to pick them up:
273
+ - `main`: `hstack start --restart`
274
+ - named stack: `hstack stack start <stack> -- --restart` (or `hstack stack dev <stack> -- --restart`)
275
+
276
+ Self-host shortcut (defaults to `main` when not running under a stack wrapper):
277
+
278
+ ```bash
279
+ hstack env set OPENAI_API_KEY=sk-...
280
+ ```
281
+
282
+ ## Daemon auth + “no machine” on first run
283
+
284
+ On a **fresh machine** (or any new stack), the daemon may need to authenticate before it can register a “machine”.
285
+ If the UI shows “no machine” (or the daemon shows `auth_required`), it usually means the stack-specific CLI home
286
+ doesn’t have credentials yet:
287
+
288
+ - `~/.happier/stacks/<stack>/cli/access.key`
289
+
290
+ To check / authenticate a stack, run:
291
+
292
+ ```bash
293
+ hstack stack auth <stack> status
294
+ hstack stack auth <stack> login
295
+ ```
296
+
297
+ Notes:
298
+ - You can run **multiple daemons for the same stack** on **different accounts** using `--identity=<name>`.
299
+ - `default` (no flag): `~/.happier/stacks/<stack>/cli/...`
300
+ - `--identity=account-b`: `~/.happier/stacks/<stack>/cli-identities/account-b/...`
301
+ - To authenticate an identity without auto-opening a browser, use `--no-open` (it prints the URL so you can open it
302
+ in the browser profile/incognito window you want):
303
+
304
+ ```bash
305
+ hstack stack auth <stack> login --identity=account-a --no-open
306
+ hstack stack auth <stack> login --identity=account-b --no-open
307
+ ```
308
+
309
+ - To start/stop an identity’s daemon explicitly:
310
+
311
+ ```bash
312
+ hstack stack daemon <stack> start --identity=account-a
313
+ hstack stack daemon <stack> stop --identity=account-a
314
+ ```
315
+
316
+ - For the **main** stack, use `<stack>=main` and the default `<port>=3005` (unless you changed it).
317
+ - If you use Tailscale Serve, `HAPPIER_WEBAPP_URL` should be your HTTPS URL (what you get from `hstack tailscale url`).
318
+ - Logs live under:
319
+ - default identity: `~/.happier/stacks/<stack>/cli/logs/`
320
+ - named identities: `~/.happier/stacks/<stack>/cli-identities/<identity>/logs/`
321
+
322
+ ## JSON mode
323
+
324
+ For programmatic usage:
325
+
326
+ ```bash
327
+ hstack stack list --json
328
+ hstack stack new exp3 --json
329
+ hstack stack edit exp3 --interactive --json
330
+ ```
package/docs/tauri.md ADDED
@@ -0,0 +1,60 @@
1
+ # Tauri desktop app (optional)
2
+
3
+ The Tauri app is a native desktop wrapper around the web UI. It’s useful when you want:
4
+
5
+ - a native desktop window (instead of a browser tab)
6
+ - separate storage from the “regular” Happier desktop app (so it doesn’t reuse old server URLs/auth)
7
+
8
+ ## Important behavior
9
+
10
+ - The Tauri app must embed an explicit API base URL.
11
+ - By default, `hstack` will embed:
12
+ - a **Tailscale Serve** `https://*.ts.net` URL if it detects one on this machine (so the built app can be copied to other devices on the same tailnet), otherwise
13
+ - the local loopback URL `http://127.0.0.1:<port>` (same-machine only).
14
+ - If you change what URL you want embedded, rebuild the Tauri app.
15
+
16
+ ## Prereqs
17
+
18
+ - Rust toolchain installed
19
+ - Tauri build dependencies installed for your OS
20
+
21
+ ## Build it
22
+
23
+ Build (one-off):
24
+
25
+ ```bash
26
+ hstack build --tauri
27
+ ```
28
+
29
+ Or during bootstrap:
30
+
31
+ ```bash
32
+ hstack bootstrap --tauri
33
+ ```
34
+
35
+ ## Run it
36
+
37
+ 1) Start the local server (or install the service):
38
+
39
+ ```bash
40
+ hstack start
41
+ ```
42
+
43
+ 2) Launch the built app bundle (location is under `~/.happier/stacks/main/tauri-target/`).
44
+
45
+ ## “Portable” Tauri builds (send to another computer)
46
+
47
+ If you build the Tauri app while Tailscale Serve is enabled on the server machine, the app will embed the `https://*.ts.net` URL and can be copied to another computer.
48
+
49
+ Requirements:
50
+
51
+ - The server machine is running `hstack start` and Tailscale Serve is enabled
52
+ - The other computer is on the same tailnet and can access the `https://*.ts.net` URL
53
+
54
+ ## Configuration (high-signal)
55
+
56
+ - `HAPPIER_STACK_TAURI_IDENTIFIER` (default `com.happier.stack`)
57
+ - `HAPPIER_STACK_TAURI_PRODUCT_NAME` (default `Happier`)
58
+ - `HAPPIER_STACK_TAURI_DEBUG=0` (build release-like without devtools)
59
+ - `HAPPIER_STACK_TAURI_SERVER_URL` (force the embedded API URL)
60
+ - `HAPPIER_STACK_TAURI_PREFER_TAILSCALE=0` (disable Tailscale detection; always embed `127.0.0.1`)
@@ -0,0 +1,133 @@
1
+ # Worktrees + forks (hstack)
2
+
3
+ This repo is designed to run the **Happier** stack locally, while still making it easy to:
4
+
5
+ - keep using **your fork** day-to-day
6
+ - create **clean upstream PR branches** quickly (without carrying fork-only patches)
7
+
8
+ hstack is **monorepo-only**: UI/CLI/server all live in the same Happier git repo.
9
+
10
+ ---
11
+
12
+ ## Key idea
13
+
14
+ - Keep a stable checkout at `<workspace>/main`
15
+ - Put all development work in `<workspace>/dev` or repo worktrees under `<workspace>/{pr,local,tmp}/...`
16
+ - Point stacks at a repo checkout via **`HAPPIER_STACK_REPO_DIR`** (managed by `hstack wt use ...` / `hstack stack wt ...`)
17
+
18
+ ---
19
+
20
+ ## Layout
21
+
22
+ Default paths (see `hstack where` for your actual values):
23
+
24
+ - Stable checkout: `<workspace>/main`
25
+ - Dev checkout: `<workspace>/dev` (created by `hstack setup --profile=dev`)
26
+ - Worktrees:
27
+ - PRs: `<workspace>/pr/...`
28
+ - locals: `<workspace>/local/<owner>/...`
29
+ - tmp: `<workspace>/tmp/<owner>/...`
30
+
31
+ Examples:
32
+
33
+ - `<workspace>/pr/123-fix-thing`
34
+ - `<workspace>/local/<owner>/my-feature`
35
+ - `<workspace>/tmp/<owner>/scratch`
36
+
37
+ Inside the monorepo, services live under:
38
+
39
+ - `apps/ui` (UI)
40
+ - `apps/cli` (CLI + daemon)
41
+ - `apps/server` (server; light/full flavors)
42
+
43
+ ---
44
+
45
+ ## Branch naming convention
46
+
47
+ Branches created/managed by `hstack` worktree tooling are typically named:
48
+
49
+ ```
50
+ <owner>/<slug>
51
+ ```
52
+
53
+ PR worktrees use `pr/...` branch names.
54
+
55
+ ---
56
+
57
+ ## Choosing which checkout hstack runs
58
+
59
+ hstack selects the active repo checkout using:
60
+
61
+ - `HAPPIER_STACK_REPO_DIR` (absolute path to the monorepo root)
62
+
63
+ Recommended ways to set it:
64
+
65
+ ```bash
66
+ # Switch the active checkout for the current (non-stack) commands
67
+ hstack wt use pr/123-fix-thing
68
+
69
+ # Switch the active checkout for a specific stack
70
+ hstack stack wt pr123 -- use pr/123-fix-thing
71
+ ```
72
+
73
+ If you want a one-shot override without changing the stack env file:
74
+
75
+ ```bash
76
+ hstack stack typecheck pr123 --repo=pr/123-fix-thing
77
+ hstack stack build pr123 --repo=/absolute/path/to/checkout
78
+ ```
79
+
80
+ ---
81
+
82
+ ## Creating worktrees
83
+
84
+ Create a new local worktree (recommended for day-to-day feature work):
85
+
86
+ ```bash
87
+ hstack wt new my-feature --use
88
+ hstack wt push active --remote=origin
89
+ ```
90
+
91
+ Use `--category=tmp` for truly throwaway worktrees.
92
+
93
+ ---
94
+
95
+ ## Testing a GitHub PR locally (`wt pr`)
96
+
97
+ Create a worktree at the PR head ref:
98
+
99
+ ```bash
100
+ hstack wt pr https://github.com/happier-dev/happier/pull/123 --use
101
+
102
+ # or just the PR number (remote defaults to upstream)
103
+ hstack wt pr 123 --use
104
+ ```
105
+
106
+ Update when the PR changes:
107
+
108
+ ```bash
109
+ hstack wt pr 123 --update --stash
110
+ ```
111
+
112
+ Notes:
113
+
114
+ - `--update` fails closed if the PR was force-pushed and the update is not a fast-forward; re-run with `--force`.
115
+ - `--slug=<name>` creates a nicer local branch name (example: `pr/123-fix-thing`).
116
+
117
+ ---
118
+
119
+ ## Switching server flavor (light vs full)
120
+
121
+ Choose which backend flavor a stack runs with:
122
+
123
+ ```bash
124
+ hstack srv status
125
+ hstack srv use happier-server-light
126
+ hstack srv use happier-server
127
+ hstack srv use --interactive
128
+ ```
129
+
130
+ Notes:
131
+
132
+ - This selects a runtime flavor (light/full). It does **not** select a different git repo.
133
+ - Both flavors come from the same monorepo server code (`apps/server`).
@@ -0,0 +1,29 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+
4
+ # Run auth login (interactive) in the user's preferred terminal.
5
+ #
6
+ # Usage (backwards compatible with older callers):
7
+ # ./auth-login.sh main <serverUrl> <webappUrl>
8
+ # ./auth-login.sh <stackName> <serverUrl> <webappUrl> <cliHomeDir>
9
+ #
10
+ # Behavior:
11
+ # - Delegate to `hstack auth login` / `hstack stack auth <name> login` so URL + cliHome resolution stays centralized.
12
+
13
+ stack="${1:-main}"
14
+ _server_url="${2:-}" # ignored (kept for backwards compatibility)
15
+ _webapp_url="${3:-}" # ignored (kept for backwards compatibility)
16
+ _cli_home_dir="${4:-}" # ignored (kept for backwards compatibility)
17
+
18
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
19
+ hstack_TERM="$SCRIPT_DIR/hstack-term.sh"
20
+ if [[ ! -x "$hstack_TERM" ]]; then
21
+ echo "missing hstack terminal wrapper: $hstack_TERM" >&2
22
+ exit 1
23
+ fi
24
+
25
+ if [[ "$stack" == "main" ]]; then
26
+ exec "$hstack_TERM" auth login
27
+ fi
28
+
29
+ exec "$hstack_TERM" stack auth "$stack" login
@@ -0,0 +1,122 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+
4
+ # Refresh SwiftBar Git/worktree cache.
5
+ #
6
+ # Usage:
7
+ # ./git-cache-refresh.sh all
8
+ # ./git-cache-refresh.sh main
9
+ # ./git-cache-refresh.sh stack <name>
10
+ # ./git-cache-refresh.sh component <context:main|stack> <stackName> <component>
11
+
12
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
+ DEFAULT_ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
14
+
15
+ hstack_ROOT_DIR="${HAPPIER_STACK_CLI_ROOT_DIR:-$DEFAULT_ROOT_DIR}"
16
+ LIB_DIR="$hstack_ROOT_DIR/extras/swiftbar/lib"
17
+ if [[ ! -f "$LIB_DIR/utils.sh" ]]; then
18
+ echo "missing SwiftBar libs at: $LIB_DIR" >&2
19
+ exit 1
20
+ fi
21
+
22
+ # shellcheck source=/dev/null
23
+ source "$LIB_DIR/utils.sh"
24
+ hstack_ROOT_DIR="$(resolve_hstack_root_dir)"
25
+ LIB_DIR="$hstack_ROOT_DIR/extras/swiftbar/lib"
26
+ # shellcheck source=/dev/null
27
+ source "$LIB_DIR/git.sh"
28
+
29
+ components=(happier-ui happier-cli happier-server-light happier-server)
30
+
31
+ refresh_one() {
32
+ local context="$1"
33
+ local stack="$2"
34
+ local component="$3"
35
+ local env_file="$4"
36
+
37
+ local active_dir=""
38
+ if [[ -n "$env_file" && -f "$env_file" ]]; then
39
+ active_dir="$(resolve_component_dir_from_env_file "$env_file" "$component")"
40
+ else
41
+ active_dir="$(resolve_component_dir_from_env "$component")"
42
+ fi
43
+
44
+ git_cache_refresh_one "$context" "$stack" "$component" "$active_dir" >/dev/null
45
+ }
46
+
47
+ refresh_stack() {
48
+ local stack="$1"
49
+ local env_file=""
50
+ if [[ "$stack" == "main" ]]; then
51
+ env_file="$(resolve_main_env_file)"
52
+ [[ -z "$env_file" ]] && env_file="$(resolve_stack_env_file main)"
53
+ else
54
+ env_file="$(resolve_stack_env_file "$stack")"
55
+ fi
56
+
57
+ for c in "${components[@]}"; do
58
+ refresh_one "stack" "$stack" "$c" "$env_file"
59
+ done
60
+ }
61
+
62
+ cmd="${1:-}"
63
+ case "$cmd" in
64
+ all)
65
+ refresh_stack "main"
66
+ STACKS_DIR="$(resolve_stacks_storage_root)"
67
+ STACK_NAMES="$(
68
+ {
69
+ ls -1 "$STACKS_DIR" 2>/dev/null || true
70
+ } | sort -u
71
+ )"
72
+ while IFS= read -r s; do
73
+ [[ -n "$s" ]] || continue
74
+ [[ "$s" == "main" ]] && continue
75
+ refresh_stack "$s"
76
+ done <<<"$STACK_NAMES"
77
+ git_cache_touch_last_refresh "all"
78
+ echo "ok: git cache refreshed (all)"
79
+ ;;
80
+ main)
81
+ # Main stack only (fast).
82
+ local_env="$(resolve_main_env_file)"
83
+ for c in "${components[@]}"; do
84
+ refresh_one "main" "main" "$c" "$local_env"
85
+ done
86
+ git_cache_touch_last_refresh "main"
87
+ echo "ok: git cache refreshed (main)"
88
+ ;;
89
+ stack)
90
+ stack="${2:-}"
91
+ if [[ -z "$stack" ]]; then
92
+ echo "usage: $0 stack <name>" >&2
93
+ exit 2
94
+ fi
95
+ refresh_stack "$stack"
96
+ git_cache_touch_last_refresh "stack:${stack}"
97
+ echo "ok: git cache refreshed (stack $stack)"
98
+ ;;
99
+ component)
100
+ context="${2:-}"
101
+ stack="${3:-}"
102
+ component="${4:-}"
103
+ if [[ -z "$context" || -z "$stack" || -z "$component" ]]; then
104
+ echo "usage: $0 component <main|stack> <stackName> <component>" >&2
105
+ exit 2
106
+ fi
107
+ env_file=""
108
+ if [[ "$stack" == "main" ]]; then
109
+ env_file="$(resolve_main_env_file)"
110
+ [[ -z "$env_file" ]] && env_file="$(resolve_stack_env_file main)"
111
+ else
112
+ env_file="$(resolve_stack_env_file "$stack")"
113
+ fi
114
+ refresh_one "$context" "$stack" "$component" "$env_file"
115
+ git_cache_touch_last_refresh "component:${context}:${stack}:${component}"
116
+ echo "ok: git cache refreshed ($context/$stack/$component)"
117
+ ;;
118
+ *)
119
+ echo "usage: $0 all|main|stack <name>|component <context> <stackName> <component>" >&2
120
+ exit 2
121
+ ;;
122
+ esac