happy-stacks 0.3.0 → 0.5.0
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 +93 -40
- package/bin/happys.mjs +158 -16
- package/docs/codex-mcp-resume.md +130 -0
- package/docs/commit-audits/happy/leeroy-wip.commit-analysis.md +17640 -0
- package/docs/commit-audits/happy/leeroy-wip.commit-export.fuller-stat.md +3845 -0
- package/docs/commit-audits/happy/leeroy-wip.commit-inventory.md +102 -0
- package/docs/commit-audits/happy/leeroy-wip.commit-manual-review.md +1452 -0
- package/docs/commit-audits/happy/leeroy-wip.manual-review-queue.md +116 -0
- package/docs/happy-development.md +3 -4
- package/docs/isolated-linux-vm.md +82 -0
- package/docs/mobile-ios.md +112 -54
- package/docs/monorepo-migration.md +286 -0
- package/docs/server-flavors.md +19 -3
- package/docs/stacks.md +35 -0
- package/package.json +5 -1
- package/scripts/auth.mjs +32 -10
- package/scripts/build.mjs +55 -8
- package/scripts/daemon.mjs +166 -10
- package/scripts/dev.mjs +198 -50
- package/scripts/doctor.mjs +0 -4
- package/scripts/edison.mjs +6 -4
- package/scripts/env.mjs +150 -0
- package/scripts/env_cmd.test.mjs +128 -0
- package/scripts/init.mjs +8 -3
- package/scripts/install.mjs +207 -69
- package/scripts/lint.mjs +24 -4
- package/scripts/migrate.mjs +3 -12
- package/scripts/mobile.mjs +88 -104
- package/scripts/mobile_dev_client.mjs +83 -0
- package/scripts/monorepo.mjs +1096 -0
- package/scripts/monorepo_port.test.mjs +1470 -0
- package/scripts/provision/linux-ubuntu-review-pr.sh +51 -0
- package/scripts/review.mjs +908 -0
- package/scripts/review_pr.mjs +353 -0
- package/scripts/run.mjs +101 -21
- package/scripts/service.mjs +2 -2
- package/scripts/setup.mjs +189 -68
- package/scripts/setup_pr.mjs +586 -38
- package/scripts/stack.mjs +990 -196
- package/scripts/stack_archive_cmd.test.mjs +91 -0
- package/scripts/stack_editor_workspace_monorepo_root.test.mjs +65 -0
- package/scripts/stack_env_cmd.test.mjs +87 -0
- package/scripts/stack_happy_cmd.test.mjs +126 -0
- package/scripts/stack_interactive_monorepo_group.test.mjs +71 -0
- package/scripts/stack_monorepo_defaults.test.mjs +62 -0
- package/scripts/stack_monorepo_server_light_from_happy_spec.test.mjs +66 -0
- package/scripts/stack_server_flavors_defaults.test.mjs +55 -0
- package/scripts/stack_shorthand_cmd.test.mjs +55 -0
- package/scripts/stack_wt_list.test.mjs +128 -0
- package/scripts/tailscale.mjs +37 -1
- package/scripts/test.mjs +45 -8
- package/scripts/tui.mjs +395 -39
- package/scripts/typecheck.mjs +24 -4
- package/scripts/utils/auth/daemon_gate.mjs +55 -0
- package/scripts/utils/auth/daemon_gate.test.mjs +37 -0
- package/scripts/utils/auth/guided_pr_auth.mjs +79 -0
- package/scripts/utils/auth/guided_stack_web_login.mjs +75 -0
- package/scripts/utils/auth/interactive_stack_auth.mjs +72 -0
- package/scripts/utils/auth/login_ux.mjs +32 -13
- package/scripts/utils/auth/sources.mjs +26 -0
- package/scripts/utils/auth/stack_guided_login.mjs +353 -0
- package/scripts/utils/cli/cli_registry.mjs +43 -4
- package/scripts/utils/cli/cwd_scope.mjs +136 -0
- package/scripts/utils/cli/cwd_scope.test.mjs +110 -0
- package/scripts/utils/cli/log_forwarder.mjs +157 -0
- package/scripts/utils/cli/prereqs.mjs +75 -0
- package/scripts/utils/cli/prereqs.test.mjs +34 -0
- package/scripts/utils/cli/progress.mjs +126 -0
- package/scripts/utils/cli/verbosity.mjs +12 -0
- package/scripts/utils/cli/wizard.mjs +17 -9
- package/scripts/utils/cli/wizard_prompt_worktree_source_lazy.test.mjs +60 -0
- package/scripts/utils/dev/daemon.mjs +61 -4
- package/scripts/utils/dev/expo_dev.mjs +430 -0
- package/scripts/utils/dev/expo_dev.test.mjs +76 -0
- package/scripts/utils/dev/server.mjs +36 -42
- package/scripts/utils/dev_auth_key.mjs +169 -0
- package/scripts/utils/edison/git_roots.mjs +29 -0
- package/scripts/utils/edison/git_roots.test.mjs +36 -0
- package/scripts/utils/env/env.mjs +7 -3
- package/scripts/utils/env/env_file.mjs +4 -2
- package/scripts/utils/env/env_file.test.mjs +44 -0
- package/scripts/utils/expo/command.mjs +52 -0
- package/scripts/utils/expo/expo.mjs +20 -1
- package/scripts/utils/expo/metro_ports.mjs +114 -0
- package/scripts/utils/git/git.mjs +67 -0
- package/scripts/utils/git/worktrees.mjs +80 -25
- package/scripts/utils/git/worktrees_monorepo.test.mjs +54 -0
- package/scripts/utils/handy_master_secret.mjs +94 -0
- package/scripts/utils/mobile/config.mjs +31 -0
- package/scripts/utils/mobile/dev_client_links.mjs +60 -0
- package/scripts/utils/mobile/identifiers.mjs +47 -0
- package/scripts/utils/mobile/identifiers.test.mjs +42 -0
- package/scripts/utils/mobile/ios_xcodeproj_patch.mjs +128 -0
- package/scripts/utils/mobile/ios_xcodeproj_patch.test.mjs +98 -0
- package/scripts/utils/net/lan_ip.mjs +24 -0
- package/scripts/utils/net/ports.mjs +9 -1
- package/scripts/utils/net/tcp_forward.mjs +162 -0
- package/scripts/utils/net/url.mjs +30 -0
- package/scripts/utils/net/url.test.mjs +20 -0
- package/scripts/utils/paths/localhost_host.mjs +50 -3
- package/scripts/utils/paths/paths.mjs +159 -40
- package/scripts/utils/paths/paths_monorepo.test.mjs +58 -0
- package/scripts/utils/paths/paths_server_flavors.test.mjs +45 -0
- package/scripts/utils/proc/commands.mjs +2 -3
- package/scripts/utils/proc/parallel.mjs +25 -0
- package/scripts/utils/proc/pm.mjs +176 -22
- package/scripts/utils/proc/pm_spawn.test.mjs +76 -0
- package/scripts/utils/proc/pm_stack_cache_env.test.mjs +142 -0
- package/scripts/utils/proc/proc.mjs +136 -4
- package/scripts/utils/proc/proc.test.mjs +77 -0
- package/scripts/utils/review/base_ref.mjs +74 -0
- package/scripts/utils/review/base_ref.test.mjs +54 -0
- package/scripts/utils/review/chunks.mjs +55 -0
- package/scripts/utils/review/chunks.test.mjs +51 -0
- package/scripts/utils/review/findings.mjs +165 -0
- package/scripts/utils/review/findings.test.mjs +85 -0
- package/scripts/utils/review/head_slice.mjs +153 -0
- package/scripts/utils/review/head_slice.test.mjs +91 -0
- package/scripts/utils/review/instructions/deep.md +20 -0
- package/scripts/utils/review/runners/coderabbit.mjs +61 -0
- package/scripts/utils/review/runners/coderabbit.test.mjs +59 -0
- package/scripts/utils/review/runners/codex.mjs +61 -0
- package/scripts/utils/review/runners/codex.test.mjs +35 -0
- package/scripts/utils/review/slices.mjs +140 -0
- package/scripts/utils/review/slices.test.mjs +32 -0
- package/scripts/utils/review/targets.mjs +24 -0
- package/scripts/utils/review/targets.test.mjs +36 -0
- package/scripts/utils/sandbox/review_pr_sandbox.mjs +106 -0
- package/scripts/utils/server/flavor_scripts.mjs +98 -0
- package/scripts/utils/server/flavor_scripts.test.mjs +146 -0
- package/scripts/utils/server/mobile_api_url.mjs +61 -0
- package/scripts/utils/server/mobile_api_url.test.mjs +41 -0
- package/scripts/utils/server/prisma_import.mjs +37 -0
- package/scripts/utils/server/prisma_import.test.mjs +70 -0
- package/scripts/utils/server/ui_env.mjs +14 -0
- package/scripts/utils/server/ui_env.test.mjs +46 -0
- package/scripts/utils/server/urls.mjs +14 -4
- package/scripts/utils/server/validate.mjs +53 -16
- package/scripts/utils/server/validate.test.mjs +89 -0
- package/scripts/utils/service/autostart_darwin.mjs +42 -2
- package/scripts/utils/service/autostart_darwin.test.mjs +50 -0
- package/scripts/utils/stack/context.mjs +2 -2
- package/scripts/utils/stack/editor_workspace.mjs +6 -6
- package/scripts/utils/stack/interactive_stack_config.mjs +185 -0
- package/scripts/utils/stack/pr_stack_name.mjs +16 -0
- package/scripts/utils/stack/runtime_state.mjs +2 -1
- package/scripts/utils/stack/startup.mjs +120 -13
- package/scripts/utils/stack/startup_server_light_dirs.test.mjs +64 -0
- package/scripts/utils/stack/startup_server_light_generate.test.mjs +70 -0
- package/scripts/utils/stack/startup_server_light_legacy.test.mjs +88 -0
- package/scripts/utils/stack/stop.mjs +15 -4
- package/scripts/utils/stack_context.mjs +23 -0
- package/scripts/utils/stack_runtime_state.mjs +104 -0
- package/scripts/utils/stacks.mjs +38 -0
- package/scripts/utils/tailscale/ip.mjs +116 -0
- package/scripts/utils/ui/ansi.mjs +39 -0
- package/scripts/utils/ui/qr.mjs +17 -0
- package/scripts/utils/validate.mjs +88 -0
- package/scripts/where.mjs +2 -2
- package/scripts/worktrees.mjs +755 -179
- package/scripts/worktrees_archive_cmd.test.mjs +245 -0
- package/scripts/worktrees_cursor_monorepo_root.test.mjs +63 -0
- package/scripts/worktrees_list_specs_no_recurse.test.mjs +33 -0
- package/scripts/worktrees_monorepo_use_group.test.mjs +67 -0
- package/scripts/utils/dev/expo_web.mjs +0 -112
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# leeroy-wip manual review queue (oldest → newest)
|
|
2
|
+
|
|
3
|
+
Generated: 2026-01-24
|
|
4
|
+
Source: docs/commit-audits/happy/leeroy-wip.commit-analysis.md
|
|
5
|
+
|
|
6
|
+
Commits flagged for manual review: 71
|
|
7
|
+
|
|
8
|
+
## Bucket counts
|
|
9
|
+
|
|
10
|
+
- `codex`: 9
|
|
11
|
+
- `cli`: 7
|
|
12
|
+
- `sync`: 5
|
|
13
|
+
- `i18n`: 4
|
|
14
|
+
- `new-session`: 4
|
|
15
|
+
- `claude`: 3
|
|
16
|
+
- `expo-app`: 3
|
|
17
|
+
- `secrets`: 3
|
|
18
|
+
- `tools`: 3
|
|
19
|
+
- `ui`: 3
|
|
20
|
+
- `agent-input`: 2
|
|
21
|
+
- `auth`: 2
|
|
22
|
+
- `permission`: 2
|
|
23
|
+
- `profiles`: 2
|
|
24
|
+
- `resume`: 2
|
|
25
|
+
- `server`: 2
|
|
26
|
+
- `app`: 1
|
|
27
|
+
- `crypto`: 1
|
|
28
|
+
- `experiments`: 1
|
|
29
|
+
- `fork`: 1
|
|
30
|
+
- `happy-cli`: 1
|
|
31
|
+
- `new`: 1
|
|
32
|
+
- `pr107`: 1
|
|
33
|
+
- `reducer`: 1
|
|
34
|
+
- `rpc`: 1
|
|
35
|
+
- `security`: 1
|
|
36
|
+
- `server-light`: 1
|
|
37
|
+
- `settings`: 1
|
|
38
|
+
- `terminal`: 1
|
|
39
|
+
- `tmux`: 1
|
|
40
|
+
- `typecheck`: 1
|
|
41
|
+
|
|
42
|
+
## Queue
|
|
43
|
+
|
|
44
|
+
Each entry is: `index date short-sha bucket — subject — reasons`
|
|
45
|
+
|
|
46
|
+
- 001 2026-01-17 58528a7c37d3 `crypto` — chore(crypto): patch react-native-libsodium — YES (safety/security-sensitive area)
|
|
47
|
+
- 004 2026-01-17 4890a471df31 `auth` — fix(auth): harden tokenStorage web persistence — YES (safety/security-sensitive area)
|
|
48
|
+
- 005 2026-01-17 4adc41d92af0 `sync` — feat(sync): add permission mode types and mapping — YES (safety/security-sensitive area)
|
|
49
|
+
- 017 2026-01-17 65bae55a0b61 `i18n` — refactor(i18n): separate translation types and content — YES (diff summary skipped (large change (+1756/-1006)))
|
|
50
|
+
- 018 2026-01-17 2993b5c860ff `new-session` — fix(new-session): restore standard modal flow — YES (diff summary skipped (large change (+3142/-1629)))
|
|
51
|
+
- 019 2026-01-17 9e08047d2478 `profiles` — fix(profiles): harden routing, grouping, and editing — YES (diff summary skipped (large change (+1319/-857)))
|
|
52
|
+
- 020 2026-01-17 8d9f56e85e5a `ui` — refactor(ui): unify list selectors and modal primitives — YES (diff summary skipped (too many files (28)); safety/security-sensitive area)
|
|
53
|
+
- 022 2026-01-17 2d4675a5d051 `agent-input` — fix(agent-input): use compact permission badges — YES (safety/security-sensitive area)
|
|
54
|
+
- 027 2026-01-18 7899bbd8433e `profiles` — feat(profiles): add API key requirements flow — YES (safety/security-sensitive area)
|
|
55
|
+
- 028 2026-01-18 0023ba1ea5aa `i18n` — refactor(i18n): update translations and tooling — YES (diff summary skipped (large change (+2913/-143)))
|
|
56
|
+
- 033 2026-01-18 daa0b4527d7f `new-session` — feat(new-session): add api key selection and wizard extraction — YES (diff summary skipped (large change (+1719/-1116)))
|
|
57
|
+
- 036 2026-01-18 97ca69e0a735 `i18n` — refactor(i18n): replace remaining UI literals — YES (safety/security-sensitive area)
|
|
58
|
+
- 038 2026-01-18 7976b877259c `experiments` — feat(experiments): gate Zen, file viewer, and voice auth flow — YES (safety/security-sensitive area)
|
|
59
|
+
- 039 2026-01-21 6ed379f82c34 `ui` — refactor(ui): add modal + popover overlay primitives — YES (diff summary skipped (too many files (43)))
|
|
60
|
+
- 040 2026-01-21 f0787de5308e `sync` — feat(sync): add secrets + terminal settings primitives — YES (diff summary skipped (too many files (60)); safety/security-sensitive area)
|
|
61
|
+
- 041 2026-01-21 66ee1eaf88a6 `secrets` — feat(secrets): add secrets management + requirement resolver — YES (diff summary skipped (too many files (29)); safety/security-sensitive area)
|
|
62
|
+
- 043 2026-01-21 bc779e4f7909 `new-session` — refactor(new-session): integrate secrets + terminal spawn options — YES (safety/security-sensitive area)
|
|
63
|
+
- 049 2026-01-21 2e956f32f220 `new` — fix(new): keep pick screens above iOS modal — YES (safety/security-sensitive area)
|
|
64
|
+
- 057 2026-01-21 ff7bec72358f `secrets` — fix(secrets): tighten callback deps and fix indentation — YES (safety/security-sensitive area)
|
|
65
|
+
- 058 2026-01-21 1bb65f5dd494 `new-session` — fix(new-session): avoid stuck secret requirement modal guard — YES (safety/security-sensitive area)
|
|
66
|
+
- 060 2026-01-22 bb09f91de715 `settings` — fix(settings): keep valid secrets when one entry is invalid — YES (safety/security-sensitive area)
|
|
67
|
+
- 061 2026-01-22 765423af52b4 `agent-input` — fix(agent-input): cycle permission mode from normalized state — YES (safety/security-sensitive area)
|
|
68
|
+
- 063 2026-01-22 2ed3100311c7 `secrets` — fix(secrets): hide values when using secret vault — YES (safety/security-sensitive area)
|
|
69
|
+
- 064 2026-01-22 e5848c480522 `ui` — fix(ui): harden overlays and permission cycling — YES (safety/security-sensitive area)
|
|
70
|
+
- 065 2026-01-13 69fdcff96a4c `sync` — fix(sync): restore session permission mode from last message — YES (safety/security-sensitive area)
|
|
71
|
+
- 066 2026-01-13 9b499c5dccce `sync` — fix(sync): persist permission mode timestamp for restart-safe arbitration — YES (safety/security-sensitive area)
|
|
72
|
+
- 067 2026-01-13 def8852509d0 `sync` — fix(sync): persist permission mode reliably across devices — YES (safety/security-sensitive area)
|
|
73
|
+
- 069 2026-01-06 c06b6202b5d4 `expo-app` — Add copy-to-clipboard button to message blocks — YES (non-Conventional-Commits subject)
|
|
74
|
+
- 072 2026-01-21 82d74454c3c4 `typecheck` — fix(typecheck): restore permission imports and Popover web styles — YES (safety/security-sensitive area)
|
|
75
|
+
- 086 2026-01-13 86330e263595 `security` — fix(security): redact spawn secrets from daemon logs — YES (safety/security-sensitive area)
|
|
76
|
+
- 089 2026-01-13 ef418bc4dda3 `pr107` — fix(pr107): redact profile secrets in doctor + align tmux tmpDir — YES (safety/security-sensitive area)
|
|
77
|
+
- 096 2026-01-15 2973f7fe6861 `codex` — fix(codex): harden MCP command detection — YES (safety/security-sensitive area)
|
|
78
|
+
- 099 2026-01-15 c52227082c2b `tmux` — fix(tmux): correct env, tmpdir, and session selection — YES (safety/security-sensitive area)
|
|
79
|
+
- 113 2026-01-21 51782fdbfbcd `codex` — test(codex): reset transport instances between tests — YES (safety/security-sensitive area)
|
|
80
|
+
- 124 2026-01-13 8b88dcd73d40 `claude` — fix(claude): carry permission mode across remote/local switches — YES (safety/security-sensitive area)
|
|
81
|
+
- 125 2026-01-13 8f0e10c9428b `claude` — fix(claude): publish permission mode in session metadata — YES (safety/security-sensitive area)
|
|
82
|
+
- 126 2026-01-13 ffad20faa406 `cli` — fix(cli): publish permission mode for codex/gemini sessions — YES (safety/security-sensitive area)
|
|
83
|
+
- 137 2026-01-12 68a6ba4bc244 `fork` — feat(fork): enable Codex inactive-session resume via codex-reply — YES (safety/security-sensitive area)
|
|
84
|
+
- 140 2026-01-22 9c40c54018c2 `cli` — Revert "fix(tools): support Windows arm64 tool unpacking" — YES (non-Conventional-Commits subject; revert commit)
|
|
85
|
+
- 141 2026-01-22 ab35b47ff699 `resume` — fix(resume): make inactive resume reliable; gate Codex resume — YES (multiple major areas: cli, expo-app; safety/security-sensitive area)
|
|
86
|
+
- 144 2026-01-22 0140ae276869 `codex` — refactor(codex): install mcp resume server via install-dep — YES (multiple major areas: cli, expo-app; safety/security-sensitive area)
|
|
87
|
+
- 146 2026-01-22 e1deb6db8ddb `codex` — refactor(codex): add dep-status and drop codex-resume RPCs — YES (multiple major areas: cli, expo-app)
|
|
88
|
+
- 148 2026-01-22 8bebf04aca92 `cli` — refactor(cli): modularize capabilities and env preview — YES (diff summary skipped (large change (+1296/-908)); safety/security-sensitive area)
|
|
89
|
+
- 150 2026-01-22 a5cac698f15b `cli` — feat(cli): harden session queue, switching, and lifecycle — YES (safety/security-sensitive area)
|
|
90
|
+
- 151 2026-01-22 3fc704424e8d `app` — feat(app): add pending queue, discard markers, and capabilities — YES (diff summary skipped (too many files (44)))
|
|
91
|
+
- 156 2026-01-22 8c16ee8f9cef `auth` — fix(auth): surface auth failures and gate unauth routes — YES (safety/security-sensitive area)
|
|
92
|
+
- 158 2026-01-22 3b3609fed434 `rpc` — fix(rpc): add structured code for missing RPC methods — YES (multiple major areas: expo-app, server)
|
|
93
|
+
- 160 2026-01-22 7fbe1f1cc727 `permission` — fix(permission): avoid no-op permissionModeUpdatedAt bumps — YES (safety/security-sensitive area)
|
|
94
|
+
- 162 2026-01-22 ee0bec2a0b90 `resume` — Delete INACTIVE_SESSION_RESUME.md — YES (non-Conventional-Commits subject)
|
|
95
|
+
- 165 2026-01-23 8b3f39f22664 `cli` — feat(cli): add interaction.respond for AskUserQuestion — YES (safety/security-sensitive area)
|
|
96
|
+
- 166 2025-12-24 ed4bc007308a `codex` — feat: add execpolicy approval option for Codex — YES (safety/security-sensitive area)
|
|
97
|
+
- 167 2025-12-24 78adc9c58811 `codex` — feat(codex): support execpolicy approvals and MCP tool calls — YES (safety/security-sensitive area)
|
|
98
|
+
- 168 2026-01-22 9dfa09bef8d8 `i18n` — fix(i18n): add Codex execpolicy button text — YES (safety/security-sensitive area)
|
|
99
|
+
- 169 2026-01-22 559d39da116d `reducer` — fix(reducer): keep permission messages idempotent — YES (safety/security-sensitive area)
|
|
100
|
+
- 171 2026-01-19 d06d5a833f8e `claude` — Add signal forwarding to claudeLocal.ts — YES (non-Conventional-Commits subject)
|
|
101
|
+
- 174 2025-12-24 e956463db3e2 `codex` — fix: use runtime execPath for MCP bridge — YES (safety/security-sensitive area)
|
|
102
|
+
- 175 2026-01-23 f0a7d8d0b40c `codex` — fix(codex): use mcp tool call id for approvals — YES (safety/security-sensitive area)
|
|
103
|
+
- 176 2026-01-22 da620b6865ad `server` — feat(server): add full/light flavors with sqlite migrations — YES (diff summary skipped (too many files (38)))
|
|
104
|
+
- 183 2026-01-23 46186162ae14 `happy-cli` — test(happy-cli): fix timer cleanup and MCP schema mocks — YES (safety/security-sensitive area)
|
|
105
|
+
- 208 2026-01-23 61a18ac95e17 `tools` — fix(tools): require permission id for ExitPlanMode actions — YES (safety/security-sensitive area)
|
|
106
|
+
- 209 2026-01-23 5b36c9bf91c1 `tools` — test(tools): avoid null permission in ExitPlanToolView tests — YES (safety/security-sensitive area)
|
|
107
|
+
- 211 2026-01-23 55428fb0253c `tools` — fix(tools): alert when AskUserQuestion permission id is missing — YES (safety/security-sensitive area)
|
|
108
|
+
- 212 2026-01-23 dc6955f88abd `terminal` — fix(terminal): prevent sessionId path traversal in attachment info — YES (safety/security-sensitive area)
|
|
109
|
+
- 226 2026-01-23 c461ed1cb4ef `permission` — feat(permission): add permission mode option helpers — YES (safety/security-sensitive area)
|
|
110
|
+
- 228 2026-01-23 523989b4de8e `server-light` — fix(server-light): avoid master secret race — YES (safety/security-sensitive area)
|
|
111
|
+
- 237 2026-01-23 241f0ae24b1d `cli` — test(cli): prevent legacy sessionId path traversal — YES (safety/security-sensitive area)
|
|
112
|
+
- 238 2026-01-23 a1e4a6dd3fbd `cli` — fix(cli): block legacy sessionId path traversal — YES (safety/security-sensitive area)
|
|
113
|
+
- 241 2026-01-23 1464402758bf `codex` — fix(codex): preserve falsy MCP tool results — YES (safety/security-sensitive area)
|
|
114
|
+
- 247 2026-01-23 24b607abfa07 `server` — Refactor schema sync and centralize Prisma types — YES (non-Conventional-Commits subject; diff summary skipped (too many files (29)))
|
|
115
|
+
- 248 2026-01-23 bf3027799623 `expo-app` — Set EXPO_UNSTABLE_WEB_MODAL env var in Expo scripts — YES (non-Conventional-Commits subject)
|
|
116
|
+
- 249 2026-01-23 c803115dcbdc `expo-app` — Improve postinstall script for symlinked paths and patching — YES (non-Conventional-Commits subject)
|
|
@@ -375,7 +375,7 @@ In interactive TTY runs, `happys dev` / `happys start` may auto-open the UI in y
|
|
|
375
375
|
- **Dependency install**: ensures component deps are installed when needed.
|
|
376
376
|
- **Schema readiness**:
|
|
377
377
|
- `happy-server` (Postgres): applies `prisma migrate deploy` (configurable via `HAPPY_STACKS_PRISMA_MIGRATE`)
|
|
378
|
-
- `happy-server-light` (SQLite):
|
|
378
|
+
- `happy-server-light` (SQLite): applies `prisma migrate deploy` using the SQLite migration history in the unified server repo
|
|
379
379
|
- **Auth seeding for new stacks** (non-main + non-interactive default):
|
|
380
380
|
- Uses the configured seed stack via `HAPPY_STACKS_AUTH_SEED_FROM` (default: `main`) when the stack looks uninitialized.
|
|
381
381
|
- Recommended for development: create + log into a dedicated seed stack once (usually `dev-auth`) and set:
|
|
@@ -559,9 +559,9 @@ Most commands support `--help` and `--json`.
|
|
|
559
559
|
### Core run commands
|
|
560
560
|
|
|
561
561
|
- **`happys start`**: production-like run (no Expo)
|
|
562
|
-
- Flags: `--server=happy-server|happy-server-light`, `--restart`, `--no-daemon`, `--no-ui`, `--no-browser`
|
|
562
|
+
- Flags: `--server=happy-server|happy-server-light`, `--restart`, `--no-daemon`, `--no-ui`, `--no-browser`, `--mobile`
|
|
563
563
|
- **`happys dev`**: dev run (server + daemon + Expo web)
|
|
564
|
-
- Flags: `--server=happy-server|happy-server-light`, `--restart`, `--no-daemon`, `--no-ui`, `--watch`, `--no-watch`, `--no-browser`
|
|
564
|
+
- Flags: `--server=happy-server|happy-server-light`, `--restart`, `--no-daemon`, `--no-ui`, `--watch`, `--no-watch`, `--no-browser`, `--mobile`
|
|
565
565
|
- **`happys stop`**: stop stacks and related processes
|
|
566
566
|
- Flags: `--except-stacks=main,exp1`, `--yes`, `--aggressive`, `--sweep-owned`, `--no-docker`, `--no-service`
|
|
567
567
|
|
|
@@ -628,7 +628,6 @@ Happy Stacks uses `HAPPY_STACKS_*` as the canonical prefix; most settings also a
|
|
|
628
628
|
- **Full server infra** (happy-server):
|
|
629
629
|
- `HAPPY_STACKS_MANAGED_INFRA=0` (disable Docker-managed Postgres/Redis/Minio; provide URLs yourself)
|
|
630
630
|
- **Prisma behavior**:
|
|
631
|
-
- `HAPPY_STACKS_PRISMA_PUSH=0` (server-light: avoid `prisma db push` in dev mode)
|
|
632
631
|
- `HAPPY_STACKS_PRISMA_MIGRATE=0` (full server: disable `prisma migrate deploy`)
|
|
633
632
|
- **happy-cli build behavior**:
|
|
634
633
|
- `HAPPY_STACKS_CLI_BUILD_MODE=auto|always|never`
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Isolated Linux VM (Apple Silicon) for `review-pr`
|
|
2
|
+
|
|
3
|
+
If you want to validate `happys review-pr` on a **fresh system** (no existing `~/.happy-stacks`, no host tooling), the simplest repeatable approach on Apple Silicon is a Linux VM managed by **Lima** (it uses Apple’s Virtualization.framework).
|
|
4
|
+
|
|
5
|
+
This avoids Docker/container UX issues (browser opening, Expo networking, file watching) while still being truly “clean”.
|
|
6
|
+
|
|
7
|
+
## Option A (recommended): Lima + Ubuntu ARM64
|
|
8
|
+
|
|
9
|
+
### 1) Install Lima (macOS host)
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
brew install lima
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### 2) Create a VM
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
limactl create --name happy-pr --tty=false template://ubuntu-24.04
|
|
19
|
+
limactl start happy-pr
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 3) Provision the VM (Node + build deps)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
limactl shell happy-pr
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Inside the VM:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
curl -fsSL https://raw.githubusercontent.com/leeroybrun/happy-local/main/scripts/provision/linux-ubuntu-review-pr.sh -o /tmp/linux-ubuntu-review-pr.sh && chmod +x /tmp/linux-ubuntu-review-pr.sh && /tmp/linux-ubuntu-review-pr.sh
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 4) Run `review-pr` via `npx` (published package)
|
|
35
|
+
|
|
36
|
+
Inside the VM:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npx --yes happy-stacks@latest review-pr \
|
|
40
|
+
--happy=https://github.com/leeroybrun/happy/pull/10 \
|
|
41
|
+
--happy-cli=https://github.com/leeroybrun/happy-cli/pull/12 \
|
|
42
|
+
--no-mobile \
|
|
43
|
+
--verbose
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Notes:
|
|
47
|
+
- `--no-mobile` keeps the validation focused (Expo mobile dev-client adds more host requirements).
|
|
48
|
+
- You can also add `--keep-sandbox` if you want to inspect the sandbox contents after a failure.
|
|
49
|
+
- For full reproducibility, pin the version: `npx --yes happy-stacks@0.3.0 review-pr ...`
|
|
50
|
+
|
|
51
|
+
### Optional: test **unreleased local changes**
|
|
52
|
+
|
|
53
|
+
If you need to test changes that aren’t published to npm yet:
|
|
54
|
+
|
|
55
|
+
1) On your Mac (repo checkout):
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm pack
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
2) Copy the generated `happy-stacks-*.tgz` into the VM (any method you like), then inside the VM:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
npx --yes ./happy-stacks-*.tgz review-pr ...
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Option B: GUI VM (UTM) – simplest when you want a “real desktop”
|
|
68
|
+
|
|
69
|
+
If you want the most realistic “reviewer” experience (open browser, etc.), a GUI VM is great:
|
|
70
|
+
|
|
71
|
+
1. Install UTM (macOS host): `brew install --cask utm`
|
|
72
|
+
2. Create an Ubuntu 24.04 ARM64 VM (UTM wizard).
|
|
73
|
+
3. Run the same provisioning + `node bin/happys.mjs review-pr ...` inside the VM.
|
|
74
|
+
|
|
75
|
+
## Option C: Apple “container” / Docker
|
|
76
|
+
|
|
77
|
+
Containers are excellent for server-only validation, but are usually **not** the best fit for end-to-end `review-pr` UX because:
|
|
78
|
+
- opening the host browser from inside the container is awkward
|
|
79
|
+
- Expo/dev-server workflows and networking tend to require extra port mapping and host interaction
|
|
80
|
+
|
|
81
|
+
Use containers only if you explicitly want “CLI-only” checks and are okay opening URLs manually.
|
|
82
|
+
|
package/docs/mobile-ios.md
CHANGED
|
@@ -8,101 +8,166 @@ see the “Using Happy from your phone” section in the main README.
|
|
|
8
8
|
- Xcode installed
|
|
9
9
|
- CocoaPods installed (`brew install cocoapods`)
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Two supported modes
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
- **Shared dev-client app** (recommended for development):
|
|
14
|
+
- Install *one* “Happy Stacks Dev” app on your phone.
|
|
15
|
+
- Run any stack with `--mobile`; scan the QR to open that stack inside the dev-client.
|
|
16
|
+
- Per-stack auth/storage is isolated via `EXPO_PUBLIC_HAPPY_STORAGE_SCOPE` (set automatically in stack mode).
|
|
14
17
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
- **Per-stack “release” app** (recommended for demos / strict isolation):
|
|
19
|
+
- Install a separate iOS app per stack (unique bundle id + scheme).
|
|
20
|
+
- Each stack app is isolated by iOS app container (no token collisions).
|
|
21
|
+
|
|
22
|
+
## Shared dev-client app (install once)
|
|
18
23
|
|
|
19
|
-
|
|
24
|
+
Install the dedicated Happy Stacks dev-client app on your iPhone (USB).
|
|
20
25
|
|
|
21
|
-
|
|
26
|
+
This command **runs a prebuild** (generates `ios/` + runs CocoaPods) and then installs a Debug build
|
|
27
|
+
without starting Metro:
|
|
22
28
|
|
|
23
29
|
```bash
|
|
24
|
-
happys mobile
|
|
30
|
+
happys mobile-dev-client --install
|
|
25
31
|
```
|
|
26
32
|
|
|
27
|
-
-
|
|
33
|
+
If you want to ensure the dev-client is built from a specific stack’s active `happy` worktree
|
|
34
|
+
(e.g. to include upstream changes that aren’t merged into your default checkout yet), run:
|
|
28
35
|
|
|
29
36
|
```bash
|
|
30
|
-
happys mobile
|
|
37
|
+
happys stack mobile-dev-client <stack> --install
|
|
31
38
|
```
|
|
32
39
|
|
|
33
|
-
|
|
40
|
+
Optional:
|
|
34
41
|
|
|
35
42
|
```bash
|
|
36
|
-
happys mobile --
|
|
43
|
+
happys mobile-dev-client --install --device="Your iPhone"
|
|
44
|
+
happys mobile-dev-client --install --clean
|
|
37
45
|
```
|
|
38
46
|
|
|
39
|
-
|
|
47
|
+
Then run any stack with mobile enabled:
|
|
40
48
|
|
|
41
49
|
```bash
|
|
42
|
-
happys mobile
|
|
50
|
+
happys stack dev <stack> --mobile
|
|
51
|
+
# or:
|
|
52
|
+
happys dev --mobile
|
|
43
53
|
```
|
|
44
54
|
|
|
45
|
-
|
|
55
|
+
Notes:
|
|
56
|
+
|
|
57
|
+
- **LAN requirement**: for physical iPhones, Metro must be reachable over LAN.
|
|
58
|
+
- Happy Stacks defaults to `lan` for mobile, and will print a QR code + deep link.
|
|
59
|
+
- For simulators you can usually use `localhost` (see `HAPPY_STACKS_MOBILE_HOST` below).
|
|
60
|
+
- **If Expo is already running in web-only mode**: re-run with `--restart` and include `--mobile`.
|
|
61
|
+
|
|
62
|
+
## Per-stack app install (isolated)
|
|
63
|
+
|
|
64
|
+
Install an isolated app for a specific stack (unique bundle id + scheme, Release config, no Metro):
|
|
46
65
|
|
|
47
66
|
```bash
|
|
48
|
-
|
|
49
|
-
|
|
67
|
+
happys stack mobile:install <stack> --name="Happy (<stack>)"
|
|
68
|
+
happys stack mobile:install <stack> --name="Happy PR 272" --device="Your iPhone"
|
|
50
69
|
```
|
|
51
70
|
|
|
52
|
-
|
|
71
|
+
The chosen app name is persisted in the stack env so you can re-run installs without re-typing it.
|
|
72
|
+
|
|
73
|
+
## Native iOS regeneration / “prebuild” (critical)
|
|
74
|
+
|
|
75
|
+
You’ll need to regenerate the iOS native project + Pods when:
|
|
76
|
+
|
|
77
|
+
- you pull changes that affect native deps / Expo config
|
|
78
|
+
- `components/happy/ios/` was deleted
|
|
79
|
+
- you hit CocoaPods / deployment-target mismatches after a dependency bump
|
|
53
80
|
|
|
54
|
-
|
|
81
|
+
Run:
|
|
55
82
|
|
|
56
83
|
```bash
|
|
57
|
-
happys mobile
|
|
84
|
+
happys mobile --prebuild
|
|
85
|
+
# (optional) fully regenerate ios/:
|
|
86
|
+
happys mobile --prebuild --clean
|
|
58
87
|
```
|
|
59
88
|
|
|
60
|
-
|
|
89
|
+
What this does today:
|
|
61
90
|
|
|
62
|
-
-
|
|
91
|
+
- runs `expo prebuild --no-install` (so we can patch before CocoaPods runs)
|
|
92
|
+
- patches `ios/Podfile.properties.json` to:
|
|
93
|
+
- set `ios.deploymentTarget` to `16.0`
|
|
94
|
+
- set `ios.buildReactNativeFromSource` to `true`
|
|
95
|
+
- patches the generated Xcode project deployment target (where applicable)
|
|
96
|
+
- runs `pod install`
|
|
97
|
+
|
|
98
|
+
Notes:
|
|
99
|
+
|
|
100
|
+
- **You usually don’t need to run this manually** because both:
|
|
101
|
+
- `happys mobile-dev-client --install`
|
|
102
|
+
- `happys stack mobile:install <stack>`
|
|
103
|
+
already include `--prebuild`.
|
|
104
|
+
- Legacy alias: `happys mobile:prebuild` exists (hidden), but prefer `happys mobile --prebuild`.
|
|
105
|
+
|
|
106
|
+
## Manual `happys mobile` usage (advanced)
|
|
107
|
+
|
|
108
|
+
If you want to work on the embedded Expo app directly (outside `happys dev --mobile`), `happys mobile` supports:
|
|
63
109
|
|
|
64
110
|
```bash
|
|
65
|
-
|
|
111
|
+
# Start Metro (keeps running):
|
|
112
|
+
happys mobile --host=lan
|
|
113
|
+
|
|
114
|
+
# Build + install on iOS (and exit). If you omit --device, it will try to auto-pick a connected iPhone over USB:
|
|
115
|
+
happys mobile --prebuild --run-ios --device="Your iPhone"
|
|
116
|
+
happys mobile --prebuild --run-ios --configuration=Release --no-metro
|
|
66
117
|
```
|
|
67
118
|
|
|
68
|
-
|
|
119
|
+
## Notes / troubleshooting
|
|
120
|
+
|
|
121
|
+
- **QR opens the wrong app**:
|
|
122
|
+
- The dev-client QR uses the `HAPPY_STACKS_DEV_CLIENT_SCHEME` (default: `happystacks-dev`).
|
|
123
|
+
- Per-stack installs use a different per-stack scheme, so they should not intercept dev-client QR scans.
|
|
124
|
+
|
|
125
|
+
- **List connected devices** (for `--device=`):
|
|
69
126
|
|
|
70
127
|
```bash
|
|
71
|
-
happys mobile
|
|
128
|
+
happys mobile:devices
|
|
72
129
|
```
|
|
73
130
|
|
|
74
|
-
|
|
131
|
+
- **Code signing weirdness on a real iPhone**:
|
|
132
|
+
- Happy Stacks will try to “un-pin” signing fields in the generated `.pbxproj` so Expo/Xcode can reconfigure signing
|
|
133
|
+
(this avoids failures where automatic signing is disabled because `DEVELOPMENT_TEAM`/profiles were pinned).
|
|
134
|
+
- If you want to manage signing manually, pass `--no-signing-fix` to `happys mobile ...` / `happys stack mobile <stack> ...`.
|
|
75
135
|
|
|
76
136
|
## Bake the default server URL into the app (optional)
|
|
77
137
|
|
|
78
138
|
If you want the built app to default to your happy-stacks server URL, set this **when building**:
|
|
79
139
|
|
|
80
140
|
```bash
|
|
81
|
-
HAPPY_STACKS_SERVER_URL="https://<your-machine>.<tailnet>.ts.net" happys mobile
|
|
141
|
+
HAPPY_STACKS_SERVER_URL="https://<your-machine>.<tailnet>.ts.net" happys mobile-dev-client --install
|
|
82
142
|
```
|
|
83
143
|
|
|
84
|
-
Note: changing `HAPPY_STACKS_SERVER_URL` requires rebuilding/reinstalling the
|
|
144
|
+
Note: changing `HAPPY_STACKS_SERVER_URL` requires rebuilding/reinstalling the app you care about.
|
|
85
145
|
|
|
86
|
-
|
|
146
|
+
Important:
|
|
87
147
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
148
|
+
- For **non-main stacks**, `HAPPY_STACKS_SERVER_URL` is only respected if it’s set **in that stack’s env file**
|
|
149
|
+
(safety: we ignore “global” URLs for non-main stacks to avoid accidentally repointing other stacks).
|
|
150
|
+
|
|
151
|
+
## Customizing the app identity (optional / advanced)
|
|
152
|
+
|
|
153
|
+
Happy Stacks uses these identities:
|
|
91
154
|
|
|
92
|
-
|
|
155
|
+
- **Dev-client**: defaults to `Happy Stacks Dev` + bundle id `com.happystacks.dev.<user>`
|
|
156
|
+
- **Per-stack release**: defaults to `Happy (<stack>)` + bundle id `com.happystacks.stack.<user>.<stack>`
|
|
157
|
+
|
|
158
|
+
If you want to build/install *manually* (instead of `mobile-dev-client` / `stack mobile:install`), you can override:
|
|
93
159
|
|
|
94
160
|
- **Bundle identifier (recommended for real iPhones)**:
|
|
95
|
-
- You may
|
|
161
|
+
- You may need this if the bundle id you’re using isn’t available/owned by your Apple team.
|
|
96
162
|
|
|
97
163
|
```bash
|
|
98
|
-
HAPPY_STACKS_IOS_BUNDLE_ID="com.yourname.happy.local.dev" happys mobile --run-ios
|
|
99
|
-
HAPPY_STACKS_IOS_BUNDLE_ID="com.yourname.happy.local.dev" happys mobile:install
|
|
164
|
+
HAPPY_STACKS_IOS_BUNDLE_ID="com.yourname.happy.local.dev" happys mobile --prebuild --run-ios --no-metro
|
|
100
165
|
```
|
|
101
166
|
|
|
102
167
|
- **App name (what shows on the home screen)**:
|
|
103
168
|
|
|
104
169
|
```bash
|
|
105
|
-
HAPPY_STACKS_IOS_APP_NAME="Happy Local" happys mobile
|
|
170
|
+
HAPPY_STACKS_IOS_APP_NAME="Happy Local" happys mobile --prebuild --run-ios --no-metro
|
|
106
171
|
```
|
|
107
172
|
|
|
108
173
|
## Suggested env (recommended)
|
|
@@ -110,25 +175,18 @@ HAPPY_STACKS_IOS_APP_NAME="Happy Local" happys mobile:install
|
|
|
110
175
|
Add these to your main stack env file (`~/.happy/stacks/main/env`) (or `~/.happy-stacks/env.local` for global overrides) so you don’t have to prefix every command:
|
|
111
176
|
|
|
112
177
|
```bash
|
|
113
|
-
#
|
|
114
|
-
|
|
178
|
+
# How the phone reaches Metro:
|
|
179
|
+
# - lan: recommended for real devices
|
|
180
|
+
# - localhost: OK for simulators
|
|
181
|
+
HAPPY_STACKS_MOBILE_HOST="lan"
|
|
115
182
|
|
|
116
|
-
#
|
|
117
|
-
|
|
183
|
+
# (optional) default scheme used in the dev-client QR / deep link
|
|
184
|
+
# (must match your installed dev-client app):
|
|
185
|
+
HAPPY_STACKS_DEV_CLIENT_SCHEME="happystacks-dev"
|
|
186
|
+
|
|
187
|
+
# Default public server URL for the stack (baked into the Expo app config):
|
|
188
|
+
HAPPY_STACKS_SERVER_URL="https://<your-machine>.<tailnet>.ts.net"
|
|
118
189
|
|
|
119
190
|
# Optional: home screen name:
|
|
120
191
|
HAPPY_STACKS_IOS_APP_NAME="Happy Local"
|
|
121
192
|
```
|
|
122
|
-
|
|
123
|
-
## Personal build on iPhone (EAS internal distribution)
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
cd "$HOME/.happy-stacks/workspace/components/happy"
|
|
127
|
-
eas build --profile development --platform ios
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
Then keep Metro running from `happy-stacks`:
|
|
131
|
-
|
|
132
|
-
```bash
|
|
133
|
-
happys mobile --host=lan
|
|
134
|
-
```
|