@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.
- package/README.md +501 -0
- package/bin/hstack.mjs +348 -0
- package/docs/codex-mcp-resume.md +129 -0
- package/docs/edison.md +74 -0
- package/docs/forking-and-branding.md +189 -0
- package/docs/happy-development.md +22 -0
- package/docs/isolated-linux-vm.md +243 -0
- package/docs/menubar.md +244 -0
- package/docs/mobile-ios.md +322 -0
- package/docs/monorepo-migration.md +20 -0
- package/docs/paths-and-env.md +154 -0
- package/docs/remote-access.md +43 -0
- package/docs/server-flavors.md +147 -0
- package/docs/stacks.md +330 -0
- package/docs/tauri.md +60 -0
- package/docs/worktrees-and-forks.md +133 -0
- package/extras/swiftbar/auth-login.sh +29 -0
- package/extras/swiftbar/git-cache-refresh.sh +122 -0
- package/extras/swiftbar/hstack-term.sh +133 -0
- package/extras/swiftbar/hstack.5s.sh +296 -0
- package/extras/swiftbar/hstack.sh +35 -0
- package/extras/swiftbar/icons/happy-green.png +0 -0
- package/extras/swiftbar/icons/happy-orange.png +0 -0
- package/extras/swiftbar/icons/happy-red.png +0 -0
- package/extras/swiftbar/icons/logo-white.png +0 -0
- package/extras/swiftbar/install.sh +265 -0
- package/extras/swiftbar/lib/git.sh +629 -0
- package/extras/swiftbar/lib/icons.sh +92 -0
- package/extras/swiftbar/lib/render.sh +999 -0
- package/extras/swiftbar/lib/system.sh +244 -0
- package/extras/swiftbar/lib/utils.sh +717 -0
- package/extras/swiftbar/set-interval.sh +65 -0
- package/extras/swiftbar/set-server-flavor.sh +61 -0
- package/extras/swiftbar/wt-pr.sh +140 -0
- package/node_modules/@happier-dev/cli-common/README.md +6 -0
- package/node_modules/@happier-dev/cli-common/dist/index.d.ts +4 -0
- package/node_modules/@happier-dev/cli-common/dist/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/index.js +4 -0
- package/node_modules/@happier-dev/cli-common/dist/index.js.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/links/index.d.ts +18 -0
- package/node_modules/@happier-dev/cli-common/dist/links/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/links/index.js +25 -0
- package/node_modules/@happier-dev/cli-common/dist/links/index.js.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/links.d.ts +2 -0
- package/node_modules/@happier-dev/cli-common/dist/links.d.ts.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/links.js +2 -0
- package/node_modules/@happier-dev/cli-common/dist/links.js.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/update/index.d.ts +67 -0
- package/node_modules/@happier-dev/cli-common/dist/update/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/update/index.js +259 -0
- package/node_modules/@happier-dev/cli-common/dist/update/index.js.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/workspaces/index.d.ts +17 -0
- package/node_modules/@happier-dev/cli-common/dist/workspaces/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/workspaces/index.js +80 -0
- package/node_modules/@happier-dev/cli-common/dist/workspaces/index.js.map +1 -0
- package/node_modules/@happier-dev/cli-common/package.json +26 -0
- package/package.json +77 -0
- package/scripts/auth.mjs +1829 -0
- package/scripts/auth_copy_from_pglite_lock_in_use.integration.test.mjs +90 -0
- package/scripts/auth_copy_from_runCapture.integration.test.mjs +447 -0
- package/scripts/auth_help_cmd.test.mjs +28 -0
- package/scripts/auth_login_flow_in_tty.test.mjs +100 -0
- package/scripts/auth_login_force_default.test.mjs +66 -0
- package/scripts/auth_login_guided_server_no_expo.test.mjs +126 -0
- package/scripts/auth_login_method_override.test.mjs +67 -0
- package/scripts/auth_login_print_includes_configure_links.test.mjs +99 -0
- package/scripts/auth_status_server_validation.integration.test.mjs +140 -0
- package/scripts/build.mjs +266 -0
- package/scripts/bundleWorkspaceDeps.mjs +38 -0
- package/scripts/bundleWorkspaceDeps.test.mjs +77 -0
- package/scripts/ci.mjs +135 -0
- package/scripts/ci.test.mjs +50 -0
- package/scripts/cli-link.mjs +57 -0
- package/scripts/completion.mjs +395 -0
- package/scripts/contrib.mjs +333 -0
- package/scripts/daemon.mjs +1160 -0
- package/scripts/daemon.status_scope.test.mjs +51 -0
- package/scripts/daemon_cmd.mjs +26 -0
- package/scripts/daemon_dist_guard.test.mjs +171 -0
- package/scripts/daemon_invalid_auth_reseed_stack_name.integration.test.mjs +608 -0
- package/scripts/daemon_server_scoped_state.test.mjs +49 -0
- package/scripts/daemon_start_verification.integration.test.mjs +296 -0
- package/scripts/dev.mjs +545 -0
- package/scripts/doctor.mjs +340 -0
- package/scripts/doctor_cmd.test.mjs +22 -0
- package/scripts/doctor_ui_index_missing.test.mjs +37 -0
- package/scripts/eas.mjs +367 -0
- package/scripts/eas_platform_parsing.test.mjs +63 -0
- package/scripts/edison.mjs +1848 -0
- package/scripts/env.mjs +149 -0
- package/scripts/env_cmd.test.mjs +118 -0
- package/scripts/exit_cleanup_kills_detached_children_on_crash.integration.test.mjs +80 -0
- package/scripts/happier.mjs +82 -0
- package/scripts/import.mjs +1327 -0
- package/scripts/init.mjs +464 -0
- package/scripts/install.mjs +550 -0
- package/scripts/lint.mjs +177 -0
- package/scripts/menubar.mjs +202 -0
- package/scripts/migrate.mjs +318 -0
- package/scripts/mobile.mjs +353 -0
- package/scripts/mobile_dev_client.mjs +87 -0
- package/scripts/monorepo.mjs +2234 -0
- package/scripts/monorepo_port.apply.integration.test.mjs +680 -0
- package/scripts/monorepo_port.conflicts.integration.test.mjs +454 -0
- package/scripts/monorepo_port.validation.integration.test.mjs +486 -0
- package/scripts/orchestrated_stack_auth_flow.test.mjs +134 -0
- package/scripts/orchestrated_stack_auth_flow_resolve_port.test.mjs +98 -0
- package/scripts/orchestrated_stack_auth_flow_webapp_url.test.mjs +119 -0
- package/scripts/pack.mjs +257 -0
- package/scripts/pack.test.mjs +68 -0
- package/scripts/pglite_lock.integration.test.mjs +152 -0
- package/scripts/provision/linux-ubuntu-e2e.sh +132 -0
- package/scripts/provision/linux-ubuntu-review-pr.sh +66 -0
- package/scripts/provision/macos-lima-happy-vm.sh +192 -0
- package/scripts/provision/macos-lima-hstack-e2e.sh +100 -0
- package/scripts/release.mjs +53 -0
- package/scripts/release_binary_smoke.integration.test.mjs +159 -0
- package/scripts/review.mjs +1752 -0
- package/scripts/review_pr.mjs +435 -0
- package/scripts/run.mjs +561 -0
- package/scripts/run_script_with_stack_env.restart_port_reuse.test.mjs +30 -0
- package/scripts/self.mjs +465 -0
- package/scripts/self_host.mjs +9 -0
- package/scripts/self_host_binary_smoke.integration.test.mjs +94 -0
- package/scripts/self_host_runtime.mjs +883 -0
- package/scripts/self_host_runtime.test.mjs +82 -0
- package/scripts/self_host_systemd.real.integration.test.mjs +367 -0
- package/scripts/server_flavor.mjs +148 -0
- package/scripts/service.mjs +868 -0
- package/scripts/service_mode_help.test.mjs +27 -0
- package/scripts/setup.mjs +1324 -0
- package/scripts/setup_non_interactive_flag.test.mjs +60 -0
- package/scripts/setup_pr.mjs +605 -0
- package/scripts/setup_pr_orchestrated_auth_flow_util_import.test.mjs +117 -0
- package/scripts/stack/command_arguments.mjs +91 -0
- package/scripts/stack/copy_auth_from_stack.mjs +111 -0
- package/scripts/stack/delegated_script_commands.mjs +92 -0
- package/scripts/stack/help_text.mjs +110 -0
- package/scripts/stack/port_reservation.mjs +74 -0
- package/scripts/stack/repo_checkout_resolution.mjs +31 -0
- package/scripts/stack/run_script_with_stack_env.mjs +634 -0
- package/scripts/stack/stack_daemon_command.mjs +219 -0
- package/scripts/stack/stack_delegated_help.mjs +81 -0
- package/scripts/stack/stack_environment.mjs +151 -0
- package/scripts/stack/stack_environment.sanitization.test.mjs +75 -0
- package/scripts/stack/stack_happier_passthrough_command.mjs +63 -0
- package/scripts/stack/stack_info_snapshot.mjs +167 -0
- package/scripts/stack/stack_mobile_install_command.mjs +61 -0
- package/scripts/stack/stack_resume_command.mjs +76 -0
- package/scripts/stack/stack_stop_command.mjs +34 -0
- package/scripts/stack/stack_workspace_command.mjs +83 -0
- package/scripts/stack/transient_repo_overrides.mjs +29 -0
- package/scripts/stack.mjs +2388 -0
- package/scripts/stack_archive_cmd.integration.test.mjs +31 -0
- package/scripts/stack_audit_fix_light_env.test.mjs +129 -0
- package/scripts/stack_background_pinned_stack_json.test.mjs +81 -0
- package/scripts/stack_copy_auth_server_scoped.test.mjs +243 -0
- package/scripts/stack_daemon_cmd.integration.test.mjs +484 -0
- package/scripts/stack_eas_help.test.mjs +72 -0
- package/scripts/stack_editor_workspace_monorepo_root.test.mjs +102 -0
- package/scripts/stack_env_cmd.test.mjs +107 -0
- package/scripts/stack_guided_login_bundle_error_parse.test.mjs +20 -0
- package/scripts/stack_guided_login_inner_invocation.test.mjs +46 -0
- package/scripts/stack_happy_cmd.integration.test.mjs +263 -0
- package/scripts/stack_info_snapshot_running_status.test.mjs +186 -0
- package/scripts/stack_interactive_monorepo_group.test.mjs +128 -0
- package/scripts/stack_monorepo_defaults.test.mjs +31 -0
- package/scripts/stack_monorepo_repo_dev_token.test.mjs +32 -0
- package/scripts/stack_monorepo_server_light_from_happy_spec.test.mjs +37 -0
- package/scripts/stack_new_name_normalize_cmd.test.mjs +38 -0
- package/scripts/stack_pr_name_normalize_cmd.test.mjs +84 -0
- package/scripts/stack_resume_cmd.integration.test.mjs +134 -0
- package/scripts/stack_server_flavors_defaults.test.mjs +64 -0
- package/scripts/stack_shorthand_cmd.integration.test.mjs +74 -0
- package/scripts/stack_stop_sweeps_legacy_infra_without_kind.integration.test.mjs +44 -0
- package/scripts/stack_stop_sweeps_when_runtime_missing.integration.test.mjs +42 -0
- package/scripts/stack_stop_sweeps_when_runtime_stale.integration.test.mjs +50 -0
- package/scripts/stack_wt_list.test.mjs +117 -0
- package/scripts/start_ui_required_default.test.mjs +63 -0
- package/scripts/stop.mjs +190 -0
- package/scripts/stopStackWithEnv_no_autosweep_when_runtime_missing.integration.test.mjs +95 -0
- package/scripts/swiftbar_git_monorepo_cmd.test.mjs +75 -0
- package/scripts/swiftbar_render_monorepo_wt_actions.integration.test.mjs +116 -0
- package/scripts/swiftbar_utils_cmd.test.mjs +92 -0
- package/scripts/swiftbar_wt_pr_backcompat.test.mjs +162 -0
- package/scripts/systemd_unit_info.test.mjs +24 -0
- package/scripts/tailscale.mjs +490 -0
- package/scripts/test_ci.mjs +36 -0
- package/scripts/test_cmd.mjs +274 -0
- package/scripts/test_cmd.test.mjs +133 -0
- package/scripts/test_integration.mjs +33 -0
- package/scripts/testkit/auth_testkit.mjs +121 -0
- package/scripts/testkit/doctor_testkit.mjs +68 -0
- package/scripts/testkit/monorepo_port_testkit.mjs +157 -0
- package/scripts/testkit/stack_archive_command_testkit.mjs +55 -0
- package/scripts/testkit/stack_new_monorepo_testkit.mjs +83 -0
- package/scripts/testkit/stack_script_command_testkit.mjs +27 -0
- package/scripts/testkit/stack_stop_sweeps_testkit.mjs +172 -0
- package/scripts/testkit/worktrees_monorepo_testkit.mjs +53 -0
- package/scripts/tools.mjs +70 -0
- package/scripts/tui.mjs +914 -0
- package/scripts/tui_stopStackForTuiExit_no_autosweep.integration.test.mjs +95 -0
- package/scripts/typecheck.mjs +178 -0
- package/scripts/ui_gateway.mjs +247 -0
- package/scripts/uninstall.mjs +179 -0
- package/scripts/utils/auth/credentials_paths.mjs +181 -0
- package/scripts/utils/auth/credentials_paths.test.mjs +187 -0
- package/scripts/utils/auth/daemon_gate.mjs +66 -0
- package/scripts/utils/auth/daemon_gate.test.mjs +116 -0
- package/scripts/utils/auth/decode_jwt_payload_unsafe.mjs +16 -0
- package/scripts/utils/auth/dev_key.mjs +163 -0
- package/scripts/utils/auth/files.mjs +56 -0
- package/scripts/utils/auth/guided_pr_auth.mjs +86 -0
- package/scripts/utils/auth/guided_stack_web_login.mjs +56 -0
- package/scripts/utils/auth/handy_master_secret.mjs +42 -0
- package/scripts/utils/auth/interactive_stack_auth.mjs +70 -0
- package/scripts/utils/auth/login_ux.mjs +105 -0
- package/scripts/utils/auth/orchestrated_stack_auth_flow.mjs +291 -0
- package/scripts/utils/auth/sources.mjs +28 -0
- package/scripts/utils/auth/stable_scope_id.mjs +91 -0
- package/scripts/utils/auth/stable_scope_id.test.mjs +51 -0
- package/scripts/utils/auth/stack_guided_login.mjs +438 -0
- package/scripts/utils/cli/arg_values.mjs +23 -0
- package/scripts/utils/cli/arg_values.test.mjs +43 -0
- package/scripts/utils/cli/args.mjs +17 -0
- package/scripts/utils/cli/cli.mjs +24 -0
- package/scripts/utils/cli/cli_registry.mjs +440 -0
- package/scripts/utils/cli/cwd_scope.mjs +158 -0
- package/scripts/utils/cli/cwd_scope.test.mjs +154 -0
- package/scripts/utils/cli/flags.mjs +17 -0
- package/scripts/utils/cli/log_forwarder.mjs +157 -0
- package/scripts/utils/cli/normalize.mjs +16 -0
- package/scripts/utils/cli/prereqs.mjs +103 -0
- package/scripts/utils/cli/prereqs.test.mjs +33 -0
- package/scripts/utils/cli/progress.mjs +141 -0
- package/scripts/utils/cli/smoke_help.mjs +44 -0
- package/scripts/utils/cli/verbosity.mjs +11 -0
- package/scripts/utils/cli/wizard.mjs +139 -0
- package/scripts/utils/cli/wizard_promptSelect.test.mjs +44 -0
- package/scripts/utils/cli/wizard_prompt_worktree_source_lazy.test.mjs +132 -0
- package/scripts/utils/cli/wizard_worktree_slug.test.mjs +33 -0
- package/scripts/utils/crypto/tokens.mjs +14 -0
- package/scripts/utils/dev/daemon.mjs +232 -0
- package/scripts/utils/dev/daemon_watch_resilience.test.mjs +224 -0
- package/scripts/utils/dev/expo_dev.buildEnv.test.mjs +35 -0
- package/scripts/utils/dev/expo_dev.mjs +478 -0
- package/scripts/utils/dev/expo_dev.test.mjs +89 -0
- package/scripts/utils/dev/expo_dev_restart_port_reservation.test.mjs +120 -0
- package/scripts/utils/dev/expo_dev_verbose_logs.test.mjs +60 -0
- package/scripts/utils/dev/server.mjs +180 -0
- package/scripts/utils/dev_auth_key.mjs +7 -0
- package/scripts/utils/edison/git_roots.mjs +30 -0
- package/scripts/utils/edison/git_roots.test.mjs +49 -0
- package/scripts/utils/env/config.mjs +52 -0
- package/scripts/utils/env/dotenv.mjs +32 -0
- package/scripts/utils/env/dotenv.test.mjs +32 -0
- package/scripts/utils/env/env.mjs +130 -0
- package/scripts/utils/env/env_file.mjs +98 -0
- package/scripts/utils/env/env_file.test.mjs +49 -0
- package/scripts/utils/env/env_local.mjs +25 -0
- package/scripts/utils/env/load_env_file.mjs +34 -0
- package/scripts/utils/env/read.mjs +30 -0
- package/scripts/utils/env/sandbox.mjs +13 -0
- package/scripts/utils/env/scrub_env.mjs +69 -0
- package/scripts/utils/env/scrub_env.test.mjs +102 -0
- package/scripts/utils/env/values.mjs +13 -0
- package/scripts/utils/expo/command.mjs +65 -0
- package/scripts/utils/expo/expo.mjs +139 -0
- package/scripts/utils/expo/expo_state_running.test.mjs +48 -0
- package/scripts/utils/expo/metro_ports.mjs +101 -0
- package/scripts/utils/expo/metro_ports.test.mjs +35 -0
- package/scripts/utils/fs/atomic_dir_swap.mjs +55 -0
- package/scripts/utils/fs/atomic_dir_swap.test.mjs +54 -0
- package/scripts/utils/fs/file_has_content.mjs +10 -0
- package/scripts/utils/fs/fs.mjs +11 -0
- package/scripts/utils/fs/json.mjs +25 -0
- package/scripts/utils/fs/ops.mjs +29 -0
- package/scripts/utils/fs/package_json.mjs +8 -0
- package/scripts/utils/fs/tail.mjs +12 -0
- package/scripts/utils/git/dev_checkout.mjs +127 -0
- package/scripts/utils/git/dev_checkout.test.mjs +115 -0
- package/scripts/utils/git/git.mjs +67 -0
- package/scripts/utils/git/parse_name_status_z.mjs +21 -0
- package/scripts/utils/git/refs.mjs +26 -0
- package/scripts/utils/git/worktrees.mjs +323 -0
- package/scripts/utils/git/worktrees_monorepo.test.mjs +60 -0
- package/scripts/utils/git/worktrees_pathstyle.test.mjs +53 -0
- package/scripts/utils/llm/assist.mjs +260 -0
- package/scripts/utils/llm/codex_exec.mjs +61 -0
- package/scripts/utils/llm/codex_exec.test.mjs +46 -0
- package/scripts/utils/llm/hstack_runner.mjs +59 -0
- package/scripts/utils/llm/tools.mjs +56 -0
- package/scripts/utils/llm/tools.test.mjs +67 -0
- package/scripts/utils/menubar/swiftbar.mjs +121 -0
- package/scripts/utils/menubar/swiftbar.test.mjs +85 -0
- package/scripts/utils/mobile/config.mjs +35 -0
- package/scripts/utils/mobile/dev_client_links.mjs +59 -0
- package/scripts/utils/mobile/identifiers.mjs +46 -0
- package/scripts/utils/mobile/identifiers.test.mjs +41 -0
- package/scripts/utils/mobile/ios_xcodeproj_patch.mjs +128 -0
- package/scripts/utils/mobile/ios_xcodeproj_patch.test.mjs +131 -0
- package/scripts/utils/net/bind_mode.mjs +39 -0
- package/scripts/utils/net/dns.mjs +10 -0
- package/scripts/utils/net/lan_ip.mjs +24 -0
- package/scripts/utils/net/ports.mjs +110 -0
- package/scripts/utils/net/tcp_forward.mjs +162 -0
- package/scripts/utils/net/url.mjs +30 -0
- package/scripts/utils/net/url.test.mjs +29 -0
- package/scripts/utils/paths/canonical_home.mjs +15 -0
- package/scripts/utils/paths/canonical_home.test.mjs +28 -0
- package/scripts/utils/paths/localhost_host.mjs +112 -0
- package/scripts/utils/paths/localhost_host.test.mjs +58 -0
- package/scripts/utils/paths/paths.mjs +302 -0
- package/scripts/utils/paths/paths_env_win32.test.mjs +36 -0
- package/scripts/utils/paths/paths_monorepo.test.mjs +58 -0
- package/scripts/utils/paths/paths_server_flavors.test.mjs +50 -0
- package/scripts/utils/paths/runtime.mjs +41 -0
- package/scripts/utils/pglite_lock.mjs +107 -0
- package/scripts/utils/proc/commands.mjs +33 -0
- package/scripts/utils/proc/exit_cleanup.mjs +57 -0
- package/scripts/utils/proc/happy_monorepo_deps.mjs +37 -0
- package/scripts/utils/proc/happy_monorepo_deps.test.mjs +89 -0
- package/scripts/utils/proc/ownership.mjs +217 -0
- package/scripts/utils/proc/ownership_killProcessGroupOwnedByStack.test.mjs +216 -0
- package/scripts/utils/proc/ownership_listPidsWithEnvNeedles.test.mjs +88 -0
- package/scripts/utils/proc/package_scripts.mjs +38 -0
- package/scripts/utils/proc/package_scripts.test.mjs +58 -0
- package/scripts/utils/proc/parallel.mjs +25 -0
- package/scripts/utils/proc/pids.mjs +11 -0
- package/scripts/utils/proc/pm.mjs +478 -0
- package/scripts/utils/proc/pm_spawn.integration.test.mjs +131 -0
- package/scripts/utils/proc/pm_stack_cache_env.test.mjs +313 -0
- package/scripts/utils/proc/proc.mjs +331 -0
- package/scripts/utils/proc/proc.test.mjs +85 -0
- package/scripts/utils/proc/terminate.mjs +69 -0
- package/scripts/utils/proc/terminate.test.mjs +54 -0
- package/scripts/utils/proc/watch.mjs +63 -0
- package/scripts/utils/review/augment_runner_integration.test.mjs +105 -0
- package/scripts/utils/review/base_ref.mjs +82 -0
- package/scripts/utils/review/base_ref.test.mjs +89 -0
- package/scripts/utils/review/chunks.mjs +55 -0
- package/scripts/utils/review/chunks.test.mjs +107 -0
- package/scripts/utils/review/detached_worktree.mjs +61 -0
- package/scripts/utils/review/detached_worktree.test.mjs +61 -0
- package/scripts/utils/review/findings.mjs +278 -0
- package/scripts/utils/review/findings.test.mjs +203 -0
- package/scripts/utils/review/head_slice.mjs +132 -0
- package/scripts/utils/review/head_slice.test.mjs +117 -0
- package/scripts/utils/review/instructions/deep.md +20 -0
- package/scripts/utils/review/prompts.mjs +279 -0
- package/scripts/utils/review/prompts.test.mjs +77 -0
- package/scripts/utils/review/run_reviewers_safe.mjs +12 -0
- package/scripts/utils/review/run_reviewers_safe.test.mjs +45 -0
- package/scripts/utils/review/runners/augment.mjs +91 -0
- package/scripts/utils/review/runners/augment.test.mjs +64 -0
- package/scripts/utils/review/runners/claude.mjs +92 -0
- package/scripts/utils/review/runners/claude.test.mjs +47 -0
- package/scripts/utils/review/runners/coderabbit.mjs +105 -0
- package/scripts/utils/review/runners/coderabbit.test.mjs +32 -0
- package/scripts/utils/review/runners/codex.mjs +129 -0
- package/scripts/utils/review/runners/codex.test.mjs +115 -0
- package/scripts/utils/review/slice_mode.mjs +20 -0
- package/scripts/utils/review/slice_mode.test.mjs +69 -0
- package/scripts/utils/review/sliced_runner.mjs +39 -0
- package/scripts/utils/review/sliced_runner.test.mjs +57 -0
- package/scripts/utils/review/slices.mjs +140 -0
- package/scripts/utils/review/slices.test.mjs +41 -0
- package/scripts/utils/review/targets.mjs +23 -0
- package/scripts/utils/review/targets.test.mjs +31 -0
- package/scripts/utils/review/tool_home_seed.mjs +106 -0
- package/scripts/utils/review/tool_home_seed.test.mjs +124 -0
- package/scripts/utils/review/uncommitted_ops.mjs +77 -0
- package/scripts/utils/review/uncommitted_ops.test.mjs +117 -0
- package/scripts/utils/sandbox/review_pr_sandbox.mjs +105 -0
- package/scripts/utils/server/apply_server_light_env_defaults.mjs +14 -0
- package/scripts/utils/server/flavor_scripts.mjs +138 -0
- package/scripts/utils/server/flavor_scripts.test.mjs +115 -0
- package/scripts/utils/server/infra/happy_server_infra.mjs +444 -0
- package/scripts/utils/server/mobile_api_url.mjs +60 -0
- package/scripts/utils/server/mobile_api_url.test.mjs +58 -0
- package/scripts/utils/server/port.mjs +55 -0
- package/scripts/utils/server/prisma_import.mjs +36 -0
- package/scripts/utils/server/prisma_import.test.mjs +78 -0
- package/scripts/utils/server/server.mjs +109 -0
- package/scripts/utils/server/ui_build_check.mjs +37 -0
- package/scripts/utils/server/ui_build_check.test.mjs +70 -0
- package/scripts/utils/server/ui_env.mjs +13 -0
- package/scripts/utils/server/ui_env.test.mjs +57 -0
- package/scripts/utils/server/urls.mjs +100 -0
- package/scripts/utils/server/validate.mjs +60 -0
- package/scripts/utils/server/validate.test.mjs +76 -0
- package/scripts/utils/service/autostart_darwin.mjs +198 -0
- package/scripts/utils/service/autostart_darwin.test.mjs +49 -0
- package/scripts/utils/service/autostart_darwin_keepalive.test.mjs +19 -0
- package/scripts/utils/stack/cli_identities.mjs +29 -0
- package/scripts/utils/stack/context.mjs +19 -0
- package/scripts/utils/stack/dirs.mjs +26 -0
- package/scripts/utils/stack/editor_workspace.mjs +126 -0
- package/scripts/utils/stack/interactive_stack_config.mjs +266 -0
- package/scripts/utils/stack/interactive_stack_config.port_validation.test.mjs +93 -0
- package/scripts/utils/stack/interactive_stack_config.remote_validation.test.mjs +122 -0
- package/scripts/utils/stack/interactive_stack_config.stack_name_validation.test.mjs +76 -0
- package/scripts/utils/stack/interactive_stack_config_testkit.mjs +18 -0
- package/scripts/utils/stack/names.mjs +27 -0
- package/scripts/utils/stack/names.test.mjs +26 -0
- package/scripts/utils/stack/pr_stack_name.mjs +16 -0
- package/scripts/utils/stack/runtime_state.mjs +88 -0
- package/scripts/utils/stack/stacks.mjs +40 -0
- package/scripts/utils/stack/startup.mjs +370 -0
- package/scripts/utils/stack/startup_server_light_dirs.test.mjs +119 -0
- package/scripts/utils/stack/startup_server_light_generate.test.mjs +20 -0
- package/scripts/utils/stack/startup_server_light_legacy.test.mjs +79 -0
- package/scripts/utils/stack/startup_server_light_testkit.mjs +106 -0
- package/scripts/utils/stack/stop.mjs +284 -0
- package/scripts/utils/stack_context.mjs +1 -0
- package/scripts/utils/stack_runtime_state.mjs +1 -0
- package/scripts/utils/stacks.mjs +1 -0
- package/scripts/utils/tailscale/ip.mjs +116 -0
- package/scripts/utils/tauri/stack_overrides.mjs +22 -0
- package/scripts/utils/test/collect_test_files.mjs +29 -0
- package/scripts/utils/time/get_today_ymd.mjs +7 -0
- package/scripts/utils/tui/cleanup.mjs +38 -0
- package/scripts/utils/ui/ansi.mjs +47 -0
- package/scripts/utils/ui/browser.mjs +31 -0
- package/scripts/utils/ui/browser.test.mjs +56 -0
- package/scripts/utils/ui/clipboard.mjs +38 -0
- package/scripts/utils/ui/layout.mjs +44 -0
- package/scripts/utils/ui/qr.mjs +17 -0
- package/scripts/utils/ui/terminal_launcher.mjs +129 -0
- package/scripts/utils/ui/text.mjs +16 -0
- package/scripts/utils/update/auto_update_notice.mjs +93 -0
- package/scripts/utils/validate.mjs +5 -0
- package/scripts/where.mjs +138 -0
- package/scripts/worktrees.mjs +2174 -0
- package/scripts/worktrees_archive_cmd.integration.test.mjs +228 -0
- package/scripts/worktrees_cursor_monorepo_root.test.mjs +23 -0
- package/scripts/worktrees_list_specs_no_recurse.test.mjs +32 -0
- package/scripts/worktrees_monorepo_testkit.test.mjs +29 -0
- 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
|