happy-stacks 0.6.9 → 0.6.11
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/docs/commit-audits/happy/leeroy-wip.commit-inventory.md +1 -1
- package/docs/commit-audits/happy/leeroy-wip.commit-manual-review.md +93 -45
- package/docs/happy-development.md +15 -0
- package/docs/monorepo-migration.md +19 -0
- package/package.json +1 -1
- package/scripts/auth.mjs +69 -22
- package/scripts/doctor.mjs +22 -12
- package/scripts/import.mjs +69 -6
- package/scripts/monorepo.mjs +283 -34
- package/scripts/monorepo_port.test.mjs +94 -18
- package/scripts/service.mjs +28 -28
- package/scripts/stop.mjs +41 -15
- package/scripts/tailscale.mjs +25 -15
- package/scripts/utils/llm/assist.mjs +97 -25
- package/scripts/utils/llm/tools.mjs +3 -3
|
@@ -45,7 +45,7 @@ Progress tracking (update manually while auditing):
|
|
|
45
45
|
- Next unreviewed commit: n/a (complete)
|
|
46
46
|
- Pass 2 full-diff verification markers: `249/249` (each `## NNN` has a `Pass2FullDiff:` line; patch artifacts under `/tmp/leeroy-wip-pass2/NNN.patch`)
|
|
47
47
|
- Pass 2 diff capture: `249/249` (`/tmp/leeroy-wip-pass2/NNN.patch` exists; hash/size recorded in each `Pass2FullDiff:` line)
|
|
48
|
-
- Pass 2 notes verification (manual): `
|
|
48
|
+
- Pass 2 notes verification (manual): `110/249` (this requires reading the patch and confirming/updating `### Manual Review Notes`)
|
|
49
49
|
|
|
50
50
|
Current state (2026-01-24):
|
|
51
51
|
|
|
@@ -19,7 +19,7 @@ This document is only trustworthy if every commit section is derived from the ac
|
|
|
19
19
|
For every commit `NNN`, even if the diff is very large:
|
|
20
20
|
|
|
21
21
|
1. Generate the full patch to disk (this is the non-negotiable “full diff” evidence):
|
|
22
|
-
- `happys wt git happy slopus/tmp/leeroy-wip -- show --no-color --format=fuller <sha> > /tmp/leeroy-wip-pass2
|
|
22
|
+
- `happys wt git happy slopus/tmp/leeroy-wip -- show --no-color --format=fuller <sha> > /tmp/leeroy-wip-pass2/<NNN>.patch`
|
|
23
23
|
2. Record verifiable evidence for the patch:
|
|
24
24
|
- `patchSha256` (sha256 of the patch file)
|
|
25
25
|
- `patchBytes` and `patchLines`
|
|
@@ -2792,7 +2792,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=cd5771e50881 patchFile=/
|
|
|
2792
2792
|
---
|
|
2793
2793
|
|
|
2794
2794
|
## 079 2026-01-12 456e2ad8e2b8 `resume`
|
|
2795
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=456e2ad8e2b8 patchFile=/tmp/leeroy-wip-pass2/079.patch patchSha256=1038412aa6be537c540443b64b6437f4eb00d0315c79e4e819e2c68d0eb0a234 patchBytes=10666 patchLines=265 notesReviewed=
|
|
2795
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=456e2ad8e2b8 patchFile=/tmp/leeroy-wip-pass2/079.patch patchSha256=1038412aa6be537c540443b64b6437f4eb00d0315c79e4e819e2c68d0eb0a234 patchBytes=10666 patchLines=265 notesReviewed=yes reviewedAt=2026-01-24T20:30:50+0100 notesUpdated=yes
|
|
2796
2796
|
|
|
2797
2797
|
- Subject: refactor(resume): don't require agentSessionId from UI
|
|
2798
2798
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -2804,11 +2804,13 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=456e2ad8e2b8 patchFile=/
|
|
|
2804
2804
|
- `sync/ops.ts` / `SessionView.tsx`:
|
|
2805
2805
|
- Removes `agentSessionId` from the resume request shape; UI resumes by Happy session id and agent type only.
|
|
2806
2806
|
- This pushes “derive vendor resume id” responsibility to the machine/daemon (more secure + less UI coupling to vendor internals).
|
|
2807
|
+
- Likely leaves an unused `getAgentSessionId` import in `SessionView.tsx` (the callsite is removed but the patch does not remove the import); clean up during history rewrite.
|
|
2807
2808
|
- `utils/agentCapabilities.ts`:
|
|
2808
2809
|
- Broadens `canAgentResume(...)` to accept unknown strings safely.
|
|
2809
2810
|
- Adds `SessionMetadata` shape + helpers:
|
|
2810
2811
|
- `getAgentSessionIdField(...)`, `canResumeSession(...)`, and `getAgentSessionId(...)`.
|
|
2811
2812
|
- Adds session-state translation keys (`session.resuming`, `session.resumeFailed`, etc.).
|
|
2813
|
+
- Noted: Spanish `inactiveResumable` uses `reanundable` (likely a typo for `reanudable`).
|
|
2812
2814
|
- Coherence:
|
|
2813
2815
|
- Matches subject and is a solid architectural improvement for the resume feature.
|
|
2814
2816
|
|
|
@@ -2824,7 +2826,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=456e2ad8e2b8 patchFile=/
|
|
|
2824
2826
|
---
|
|
2825
2827
|
|
|
2826
2828
|
## 080 2026-01-11 9b0069e3d30c `fork`
|
|
2827
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=9b0069e3d30c patchFile=/tmp/leeroy-wip-pass2/080.patch patchSha256=d0775d17447e5f09b0c0043294929d4b05c4f7a900063c95323c37df142a214b patchBytes=13508 patchLines=247 notesReviewed=
|
|
2829
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=9b0069e3d30c patchFile=/tmp/leeroy-wip-pass2/080.patch patchSha256=d0775d17447e5f09b0c0043294929d4b05c4f7a900063c95323c37df142a214b patchBytes=13508 patchLines=247 notesReviewed=yes reviewedAt=2026-01-24T20:32:11+0100 notesUpdated=yes
|
|
2828
2830
|
|
|
2829
2831
|
- Subject: feat(fork): enable Codex resume support
|
|
2830
2832
|
- Reasons: fork-only behavior (should not go upstream as-is)
|
|
@@ -2836,9 +2838,9 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=9b0069e3d30c patchFile=/
|
|
|
2836
2838
|
- `utils/agentCapabilities.ts` adds `'codex'` to `RESUMABLE_AGENTS` with an explicit “Fork” note.
|
|
2837
2839
|
- Session Info UX in `app/(app)/session/[id]/info.tsx`:
|
|
2838
2840
|
- Adds a “Codex Session ID” item with copy-to-clipboard behavior (uses translation keys added earlier).
|
|
2839
|
-
- Refactors copy-command handlers (`handleCopyCommand` helper) and unifies “copy resume command”
|
|
2841
|
+
- Refactors copy-command handlers (`handleCopyCommand` helper) and unifies “copy resume command” into `happy resume <happySessionId>` (shown only for inactive sessions that have an agent session ID in metadata).
|
|
2840
2842
|
- `sync/storageTypes.ts` appears to add/validate `codexSessionId` metadata shape (schema alignment).
|
|
2841
|
-
- Adds
|
|
2843
|
+
- Adds i18n key `sessionInfo.copyResumeCommand` across locales (Codex Session ID translation keys were added earlier in 076).
|
|
2842
2844
|
- Coherence:
|
|
2843
2845
|
- This is still within the “resume support” topic, but it’s fork-specific (Codex resume enablement) and should be isolated from any upstream PR stack.
|
|
2844
2846
|
|
|
@@ -2854,7 +2856,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=9b0069e3d30c patchFile=/
|
|
|
2854
2856
|
---
|
|
2855
2857
|
|
|
2856
2858
|
## 081 2026-01-22 4ddaef02210e `sync`
|
|
2857
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=4ddaef02210e patchFile=/tmp/leeroy-wip-pass2/081.patch patchSha256=4898c477cf549a2bf357661b4ade980ba45511fb0c0b93ad24c80baa3e93323d patchBytes=1566 patchLines=43 notesReviewed=
|
|
2859
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=4ddaef02210e patchFile=/tmp/leeroy-wip-pass2/081.patch patchSha256=4898c477cf549a2bf357661b4ade980ba45511fb0c0b93ad24c80baa3e93323d patchBytes=1566 patchLines=43 notesReviewed=yes reviewedAt=2026-01-24T20:33:19+0100 notesUpdated=yes
|
|
2858
2860
|
|
|
2859
2861
|
- Subject: fix(sync): omit model meta for queued messages
|
|
2860
2862
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -2864,7 +2866,9 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=4ddaef02210e patchFile=/
|
|
|
2864
2866
|
- Diffstat: `1 file changed, 7 insertions(+), 6 deletions(-)`
|
|
2865
2867
|
- What changed:
|
|
2866
2868
|
- `sync/sync.ts`:
|
|
2867
|
-
- Computes `model` from `(session.metadata.flavor, session.modelMode)
|
|
2869
|
+
- Computes `model` from `(session.metadata.flavor, session.modelMode)`:
|
|
2870
|
+
- For Gemini: defaults `modelMode` to `'gemini-2.5-pro'` when unset, and includes `model` in outgoing message meta when `modelMode !== 'default'`.
|
|
2871
|
+
- For non-Gemini: omits `model` (`undefined`) from outgoing meta.
|
|
2868
2872
|
- Switches meta construction to `buildOutgoingMessageMeta({ ... })` and drops `fallbackModel`.
|
|
2869
2873
|
- Coherence:
|
|
2870
2874
|
- Matches subject; this is a small correctness tweak to avoid sending irrelevant/incorrect model metadata in queued/outgoing messages.
|
|
@@ -2881,7 +2885,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=4ddaef02210e patchFile=/
|
|
|
2881
2885
|
---
|
|
2882
2886
|
|
|
2883
2887
|
## 082 2026-01-12 3fbdc10018fe `tmux`
|
|
2884
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=3fbdc10018fe patchFile=/tmp/leeroy-wip-pass2/082.patch patchSha256=f2cc8568717d548920cea037c3b6e362272f870517c93ed7e2a86d9115651d03 patchBytes=30647 patchLines=723 notesReviewed=
|
|
2888
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=3fbdc10018fe patchFile=/tmp/leeroy-wip-pass2/082.patch patchSha256=f2cc8568717d548920cea037c3b6e362272f870517c93ed7e2a86d9115651d03 patchBytes=30647 patchLines=723 notesReviewed=yes reviewedAt=2026-01-24T20:34:54+0100 notesUpdated=yes
|
|
2885
2889
|
|
|
2886
2890
|
- Subject: fix: tmux parsing/targeting + review feedback
|
|
2887
2891
|
- Reasons: safety/reliability-sensitive area (process control) + non-Conventional-Commits subject
|
|
@@ -2899,8 +2903,10 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=3fbdc10018fe patchFile=/
|
|
|
2899
2903
|
- Removes env-derived session/window fields from `TmuxSessionInfo` (only keeps `env_pane` + socket path, and relies on tmux query for session/window).
|
|
2900
2904
|
- Additional review feedback items are included (mixed into the same commit):
|
|
2901
2905
|
- Aligns `Machine.metadata` typing to runtime (nullable).
|
|
2902
|
-
- Tightens
|
|
2903
|
-
-
|
|
2906
|
+
- Tightens script/test behavior (`ripgrep_launcher`, `env-wrapper`, continue-test script) and clarifies failure modes (missing args, signal termination).
|
|
2907
|
+
- Adjusts CLI API sending behavior: introduces `ApiSessionClient.canSend(...)` and now returns early (drops the emit) when the socket is disconnected for multiple message/event types (may change socket.io buffering semantics vs prior behavior).
|
|
2908
|
+
- Improves resume/continue ergonomics and cancellation: supports `-r` as `--resume` alias and wires SIGINT/SIGTERM to abort offline `claudeLocal` runs.
|
|
2909
|
+
- Edits a CLI doc file (`cli/docs/bug-fix-plan-2025-01-15-athundt.md`) rather than deleting it.
|
|
2904
2910
|
- Coherence:
|
|
2905
2911
|
- The tmux portion is cohesive and important for correctness.
|
|
2906
2912
|
- The extra “misc scripts/tests/typing” changes make the commit mixed; during rewrite we should consider splitting to keep tmux fixes isolated and bisectable.
|
|
@@ -2922,7 +2928,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=3fbdc10018fe patchFile=/
|
|
|
2922
2928
|
---
|
|
2923
2929
|
|
|
2924
2930
|
## 083 2026-01-13 7292a29822bb `daemon`
|
|
2925
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=7292a29822bb patchFile=/tmp/leeroy-wip-pass2/083.patch patchSha256=40cb173cb1aa03a44ac0c18b4e07de6b8872336399fb768bf21f7a60daef97ab patchBytes=5066 patchLines=99 notesReviewed=
|
|
2931
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=7292a29822bb patchFile=/tmp/leeroy-wip-pass2/083.patch patchSha256=40cb173cb1aa03a44ac0c18b4e07de6b8872336399fb768bf21f7a60daef97ab patchBytes=5066 patchLines=99 notesReviewed=yes reviewedAt=2026-01-24T20:36:02+0100 notesUpdated=no
|
|
2926
2932
|
|
|
2927
2933
|
- Subject: fix(daemon): do not apply CLI active profile to GUI-spawned sessions
|
|
2928
2934
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -2950,7 +2956,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=7292a29822bb patchFile=/
|
|
|
2950
2956
|
---
|
|
2951
2957
|
|
|
2952
2958
|
## 084 2026-01-13 ce94cfa512ac `session`
|
|
2953
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=ce94cfa512ac patchFile=/tmp/leeroy-wip-pass2/084.patch patchSha256=1386819edc6fc6248c2b34ad7ce7260a18396dfd78afa8cbf88eb473d8fc0c87 patchBytes=5925 patchLines=128 notesReviewed=
|
|
2959
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=ce94cfa512ac patchFile=/tmp/leeroy-wip-pass2/084.patch patchSha256=1386819edc6fc6248c2b34ad7ce7260a18396dfd78afa8cbf88eb473d8fc0c87 patchBytes=5925 patchLines=128 notesReviewed=yes reviewedAt=2026-01-24T20:38:18+0100 notesUpdated=no
|
|
2954
2960
|
|
|
2955
2961
|
- Subject: feat(session): persist profileId in session metadata via daemon spawn
|
|
2956
2962
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -2983,7 +2989,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=ce94cfa512ac patchFile=/
|
|
|
2983
2989
|
---
|
|
2984
2990
|
|
|
2985
2991
|
## 085 2026-01-13 e58e97fd7ff4 `pr107`
|
|
2986
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=e58e97fd7ff4 patchFile=/tmp/leeroy-wip-pass2/085.patch patchSha256=d61afad1a74bec40de6ef5fd636e9b200d023a14d4216037b207f4886e009b55 patchBytes=5232 patchLines=122 notesReviewed=
|
|
2992
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=e58e97fd7ff4 patchFile=/tmp/leeroy-wip-pass2/085.patch patchSha256=d61afad1a74bec40de6ef5fd636e9b200d023a14d4216037b207f4886e009b55 patchBytes=5232 patchLines=122 notesReviewed=yes reviewedAt=2026-01-24T20:38:46+0100 notesUpdated=yes
|
|
2987
2993
|
|
|
2988
2994
|
- Subject: fix(pr107): harden daemon spawn + align profile schema
|
|
2989
2995
|
- Reasons: safety/reliability-sensitive area
|
|
@@ -3001,6 +3007,8 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=e58e97fd7ff4 patchFile=/
|
|
|
3001
3007
|
- URL fields (`baseUrl` / `endpoint`) accept either real URLs or `${VAR}` / `${VAR:-default}` template strings.
|
|
3002
3008
|
- `cli/src/utils/expandEnvVars.ts`:
|
|
3003
3009
|
- Adds support for `${VAR:=default}` in addition to `${VAR:-default}` when expanding environment variables.
|
|
3010
|
+
- Notes:
|
|
3011
|
+
- `expandEnvVars` supports `${VAR:=default}`, but `URL_OR_TEMPLATE_REGEX` only validates `${VAR}` / `${VAR:-default}` (and the error string doesn’t mention `:=`). If the GUI starts emitting `:=` templates for URL fields, CLI schema validation would still reject them; consider aligning during history rewrite.
|
|
3004
3012
|
- Coherence:
|
|
3005
3013
|
- All changes relate to daemon spawn robustness and profile schema/env handling; matches subject.
|
|
3006
3014
|
|
|
@@ -3016,7 +3024,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=e58e97fd7ff4 patchFile=/
|
|
|
3016
3024
|
---
|
|
3017
3025
|
|
|
3018
3026
|
## 086 2026-01-13 86330e263595 `security`
|
|
3019
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=86330e263595 patchFile=/tmp/leeroy-wip-pass2/086.patch patchSha256=224fab84d0ef8c04aec8a6ed629c18d85daddae88165e4534d53eff01447f39b patchBytes=3404 patchLines=70 notesReviewed=
|
|
3027
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=86330e263595 patchFile=/tmp/leeroy-wip-pass2/086.patch patchSha256=224fab84d0ef8c04aec8a6ed629c18d85daddae88165e4534d53eff01447f39b patchBytes=3404 patchLines=70 notesReviewed=yes reviewedAt=2026-01-24T20:39:34+0100 notesUpdated=no
|
|
3020
3028
|
|
|
3021
3029
|
- Subject: fix(security): redact spawn secrets from daemon logs
|
|
3022
3030
|
- Reasons: safety/security-sensitive area
|
|
@@ -3054,7 +3062,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=86330e263595 patchFile=/
|
|
|
3054
3062
|
---
|
|
3055
3063
|
|
|
3056
3064
|
## 087 2026-01-15 a25acab22b64 `socket`
|
|
3057
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=a25acab22b64 patchFile=/tmp/leeroy-wip-pass2/087.patch patchSha256=ed7c94b65ed87f75dc10b59af9dc200f2ced915784eb5334567e70f9ed48a4ce patchBytes=6610 patchLines=170 notesReviewed=
|
|
3065
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=a25acab22b64 patchFile=/tmp/leeroy-wip-pass2/087.patch patchSha256=ed7c94b65ed87f75dc10b59af9dc200f2ced915784eb5334567e70f9ed48a4ce patchBytes=6610 patchLines=170 notesReviewed=yes reviewedAt=2026-01-24T20:41:19+0100 notesUpdated=yes
|
|
3058
3066
|
|
|
3059
3067
|
- Subject: fix(socket): restore offline buffering for sends
|
|
3060
3068
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3064,7 +3072,10 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=a25acab22b64 patchFile=/
|
|
|
3064
3072
|
- Diffstat: `3 files changed, 39 insertions(+), 31 deletions(-)`
|
|
3065
3073
|
- What changed:
|
|
3066
3074
|
- `cli/src/api/apiSession.ts` removes the “hard guard” that refused to `emit('message', ...)` while the socket is disconnected, relying on socket.io client buffering instead.
|
|
3075
|
+
- It still keeps a disconnected guard for `sendSessionEvent(...)` (returns early before doing encryption/UUID work), but that guard still calls `this.canSend(...)` even though the `canSend` method is removed in this commit’s diff (possible compile error unless `canSend` exists elsewhere in the file/version; verify during rewrite).
|
|
3076
|
+
- Introduces calls to `this.logSendWhileDisconnected(...)` for Codex + ACP messages, but that helper is not defined/added in this diff (likely already exists or is added in a neighboring commit).
|
|
3067
3077
|
- Adds test coverage in `cli/src/api/apiSession.test.ts` asserting that `sendClaudeSessionMessage(...)` still calls `socket.emit(...)` even when `socket.connected = false`.
|
|
3078
|
+
- `cli/src/claude/runClaude.ts` moves abort-controller + signal handler registration outside the `try` block (behaviorally minor; likely to ensure handlers are always registered before `claudeLocal`).
|
|
3068
3079
|
- Minor related change in `cli/src/claude/runClaude.ts`: moves signal wiring outside the try block (no behavior change intended).
|
|
3069
3080
|
- Coherence:
|
|
3070
3081
|
- The intent is clear and the tests cover the socket buffering assumption.
|
|
@@ -3082,7 +3093,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=a25acab22b64 patchFile=/
|
|
|
3082
3093
|
---
|
|
3083
3094
|
|
|
3084
3095
|
## 088 2026-01-15 a7d23148c311 `logging`
|
|
3085
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=a7d23148c311 patchFile=/tmp/leeroy-wip-pass2/088.patch patchSha256=0f5bed2f94785e97c26294a861d2e95871e3b1775459989ee1f0f821d6dd42a5 patchBytes=10775 patchLines=280 notesReviewed=
|
|
3096
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=a7d23148c311 patchFile=/tmp/leeroy-wip-pass2/088.patch patchSha256=0f5bed2f94785e97c26294a861d2e95871e3b1775459989ee1f0f821d6dd42a5 patchBytes=10775 patchLines=280 notesReviewed=yes reviewedAt=2026-01-24T20:42:12+0100 notesUpdated=no
|
|
3086
3097
|
|
|
3087
3098
|
- Subject: fix(logging): gate debug output and redact templates
|
|
3088
3099
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3115,7 +3126,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=a7d23148c311 patchFile=/
|
|
|
3115
3126
|
---
|
|
3116
3127
|
|
|
3117
3128
|
## 089 2026-01-13 ef418bc4dda3 `pr107`
|
|
3118
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=ef418bc4dda3 patchFile=/tmp/leeroy-wip-pass2/089.patch patchSha256=bf155c744980506ceceb29720199a8f0ddcc98737887771636a03accfe55b292 patchBytes=2577 patchLines=50 notesReviewed=
|
|
3129
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=ef418bc4dda3 patchFile=/tmp/leeroy-wip-pass2/089.patch patchSha256=bf155c744980506ceceb29720199a8f0ddcc98737887771636a03accfe55b292 patchBytes=2577 patchLines=50 notesReviewed=yes reviewedAt=2026-01-24T20:42:51+0100 notesUpdated=no
|
|
3119
3130
|
|
|
3120
3131
|
- Subject: fix(pr107): redact profile secrets in doctor + align tmux tmpDir
|
|
3121
3132
|
- Reasons: safety/security-sensitive area
|
|
@@ -3146,7 +3157,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=ef418bc4dda3 patchFile=/
|
|
|
3146
3157
|
---
|
|
3147
3158
|
|
|
3148
3159
|
## 090 2026-01-13 1f90659694be `profiles`
|
|
3149
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=1f90659694be patchFile=/tmp/leeroy-wip-pass2/090.patch patchSha256=11d16d45035d579a8eb333ac99ff09a2f7a3225147dd595843238eb3d8130ffe patchBytes=4699 patchLines=137 notesReviewed=
|
|
3160
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=1f90659694be patchFile=/tmp/leeroy-wip-pass2/090.patch patchSha256=11d16d45035d579a8eb333ac99ff09a2f7a3225147dd595843238eb3d8130ffe patchBytes=4699 patchLines=137 notesReviewed=yes reviewedAt=2026-01-24T20:43:32+0100 notesUpdated=no
|
|
3150
3161
|
|
|
3151
3162
|
- Subject: refactor(profiles): remove unwired startup script and local env cache
|
|
3152
3163
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3177,7 +3188,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=1f90659694be patchFile=/
|
|
|
3177
3188
|
---
|
|
3178
3189
|
|
|
3179
3190
|
## 091 2026-01-15 7aed8aaee02f `profiles`
|
|
3180
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=7aed8aaee02f patchFile=/tmp/leeroy-wip-pass2/091.patch patchSha256=bd0fd2c41227435a67a7fc7de0f8410764f24a886f6f181cb099cb8f416d7467 patchBytes=11805 patchLines=278 notesReviewed=
|
|
3191
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=7aed8aaee02f patchFile=/tmp/leeroy-wip-pass2/091.patch patchSha256=bd0fd2c41227435a67a7fc7de0f8410764f24a886f6f181cb099cb8f416d7467 patchBytes=11805 patchLines=278 notesReviewed=yes reviewedAt=2026-01-24T20:44:29+0100 notesUpdated=no
|
|
3181
3192
|
|
|
3182
3193
|
- Subject: refactor(profiles): drop provider config objects
|
|
3183
3194
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3208,7 +3219,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=7aed8aaee02f patchFile=/
|
|
|
3208
3219
|
---
|
|
3209
3220
|
|
|
3210
3221
|
## 092 2026-01-15 6b0bfe546d9e `runtime`
|
|
3211
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=6b0bfe546d9e patchFile=/tmp/leeroy-wip-pass2/092.patch patchSha256=f2911b6ee75672a1cddd503f1e9ab32e95b736288b19eb1218217e972c4aaf14 patchBytes=7229 patchLines=195 notesReviewed=
|
|
3222
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=6b0bfe546d9e patchFile=/tmp/leeroy-wip-pass2/092.patch patchSha256=f2911b6ee75672a1cddd503f1e9ab32e95b736288b19eb1218217e972c4aaf14 patchBytes=7229 patchLines=195 notesReviewed=yes reviewedAt=2026-01-24T21:51:01+0100 notesUpdated=yes
|
|
3212
3223
|
|
|
3213
3224
|
- Subject: feat(runtime): support bun for daemon-spawned subprocesses
|
|
3214
3225
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3219,6 +3230,8 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=6b0bfe546d9e patchFile=/
|
|
|
3219
3230
|
- What changed:
|
|
3220
3231
|
- `cli/src/utils/spawnHappyCLI.ts` introduces a single “runtime invocation builder” for spawning subprocesses with `node` vs `bun`.
|
|
3221
3232
|
- Allows overriding runtime via `HAPPY_CLI_SUBPROCESS_RUNTIME`.
|
|
3233
|
+
- Ensures Node subprocesses include `--no-warnings` / `--no-deprecation` flags (mirrors wrapper behavior); bun subprocesses do not.
|
|
3234
|
+
- Adds a helpful “entrypoint missing” error if `dist/index.mjs` is missing.
|
|
3222
3235
|
- Adds solid unit tests for invocation building and spawn behavior (`spawnHappyCLI.invocation.test.ts`, `spawnHappyCLI.test.ts`).
|
|
3223
3236
|
- Coherence:
|
|
3224
3237
|
- Matches subject; this is a scoped runtime feature with good tests.
|
|
@@ -3235,7 +3248,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=6b0bfe546d9e patchFile=/
|
|
|
3235
3248
|
---
|
|
3236
3249
|
|
|
3237
3250
|
## 093 2026-01-15 4071466545ab `rpc`
|
|
3238
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=4071466545ab patchFile=/tmp/leeroy-wip-pass2/093.patch patchSha256=901ae5fe7520f97b4eeb1e33bd3982c80b2bc3488c641697e4653c4290b734a0 patchBytes=2411 patchLines=52 notesReviewed=
|
|
3251
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=4071466545ab patchFile=/tmp/leeroy-wip-pass2/093.patch patchSha256=901ae5fe7520f97b4eeb1e33bd3982c80b2bc3488c641697e4653c4290b734a0 patchBytes=2411 patchLines=52 notesReviewed=yes reviewedAt=2026-01-24T21:51:52+0100 notesUpdated=no
|
|
3239
3252
|
|
|
3240
3253
|
- Subject: refactor(rpc): accept arbitrary env var maps for spawn
|
|
3241
3254
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3261,7 +3274,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=4071466545ab patchFile=/
|
|
|
3261
3274
|
---
|
|
3262
3275
|
|
|
3263
3276
|
## 094 2026-01-17 809be82b53e7 `env`
|
|
3264
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=809be82b53e7 patchFile=/tmp/leeroy-wip-pass2/094.patch patchSha256=21ee926dbf4f14df07d8bb300909dca832ee0c6fb0f7e26b9d52148bd3344522 patchBytes=4976 patchLines=112 notesReviewed=
|
|
3277
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=809be82b53e7 patchFile=/tmp/leeroy-wip-pass2/094.patch patchSha256=21ee926dbf4f14df07d8bb300909dca832ee0c6fb0f7e26b9d52148bd3344522 patchBytes=4976 patchLines=112 notesReviewed=yes reviewedAt=2026-01-24T21:52:35+0100 notesUpdated=no
|
|
3265
3278
|
|
|
3266
3279
|
- Subject: fix(env): implement default assignment semantics
|
|
3267
3280
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3289,7 +3302,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=809be82b53e7 patchFile=/
|
|
|
3289
3302
|
---
|
|
3290
3303
|
|
|
3291
3304
|
## 095 2026-01-17 4c2a671dc3f4 `rpc`
|
|
3292
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=4c2a671dc3f4 patchFile=/tmp/leeroy-wip-pass2/095.patch patchSha256=6aa8fddd2772556524f0568d5a2bccfccdaab0fb4a1df234ae6f8bd33867c558 patchBytes=17576 patchLines=426 notesReviewed=
|
|
3305
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=4c2a671dc3f4 patchFile=/tmp/leeroy-wip-pass2/095.patch patchSha256=6aa8fddd2772556524f0568d5a2bccfccdaab0fb4a1df234ae6f8bd33867c558 patchBytes=17576 patchLines=426 notesReviewed=yes reviewedAt=2026-01-24T21:53:26+0100 notesUpdated=yes
|
|
3293
3306
|
|
|
3294
3307
|
- Subject: feat(rpc): add preview-env handler
|
|
3295
3308
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3303,6 +3316,8 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=4c2a671dc3f4 patchFile=/
|
|
|
3303
3316
|
- Includes strong secret-handling controls:
|
|
3304
3317
|
- policy determined by `HAPPY_ENV_PREVIEW_SECRETS` (`none` | `redacted` | `full`)
|
|
3305
3318
|
- supports caller-supplied `sensitiveKeys` hints, plus daemon-side forced sensitivity heuristics (regex overridable via `HAPPY_ENV_PREVIEW_SECRET_NAME_REGEX` with safe fallback on invalid regex).
|
|
3319
|
+
- Validates key names (`^[A-Z_][A-Z0-9_]*$`) and caps requests to 200 keys.
|
|
3320
|
+
- Returns per-key metadata (`isSet`, `isSensitive`, `isForcedSensitive`, `sensitivitySource`, `display`) for UI correctness.
|
|
3306
3321
|
- Adds `registerCommonHandlers.previewEnv.test.ts` with thorough behavioral coverage (policy modes, expansion correctness, regex override/fallback).
|
|
3307
3322
|
- Coherence:
|
|
3308
3323
|
- Strong match to subject, and the tests are high value for a security-sensitive feature.
|
|
@@ -3319,7 +3334,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=4c2a671dc3f4 patchFile=/
|
|
|
3319
3334
|
---
|
|
3320
3335
|
|
|
3321
3336
|
## 096 2026-01-15 2973f7fe6861 `codex`
|
|
3322
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=2973f7fe6861 patchFile=/tmp/leeroy-wip-pass2/096.patch patchSha256=3e1f48b2afe0e7844cc032ad624ff3bc7f63a1950862666d53aaccd9557490c6 patchBytes=9238 patchLines=242 notesReviewed=
|
|
3337
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=2973f7fe6861 patchFile=/tmp/leeroy-wip-pass2/096.patch patchSha256=3e1f48b2afe0e7844cc032ad624ff3bc7f63a1950862666d53aaccd9557490c6 patchBytes=9238 patchLines=242 notesReviewed=yes reviewedAt=2026-01-24T21:54:17+0100 notesUpdated=no
|
|
3323
3338
|
|
|
3324
3339
|
- Subject: fix(codex): harden MCP command detection
|
|
3325
3340
|
- Reasons: safety/security-sensitive area
|
|
@@ -3354,7 +3369,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=2973f7fe6861 patchFile=/
|
|
|
3354
3369
|
---
|
|
3355
3370
|
|
|
3356
3371
|
## 097 2026-01-15 c863db3d5bbc `offline`
|
|
3357
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c863db3d5bbc patchFile=/tmp/leeroy-wip-pass2/097.patch patchSha256=32bf80f2b0853267c5ae8073e09dc4052cf05cc241006c168614da2cffca5439 patchBytes=4754 patchLines=130 notesReviewed=
|
|
3372
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c863db3d5bbc patchFile=/tmp/leeroy-wip-pass2/097.patch patchSha256=32bf80f2b0853267c5ae8073e09dc4052cf05cc241006c168614da2cffca5439 patchBytes=4754 patchLines=130 notesReviewed=yes reviewedAt=2026-01-24T21:55:09+0100 notesUpdated=no
|
|
3358
3373
|
|
|
3359
3374
|
- Subject: refactor(offline): make offline session stub safer
|
|
3360
3375
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3382,7 +3397,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c863db3d5bbc patchFile=/
|
|
|
3382
3397
|
---
|
|
3383
3398
|
|
|
3384
3399
|
## 098 2026-01-15 0a1a91a631e7 `tmux`
|
|
3385
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=0a1a91a631e7 patchFile=/tmp/leeroy-wip-pass2/098.patch patchSha256=a82d831612efb8e049226844eb4012087d4937724779ec76fa3c899be2a45af2 patchBytes=20638 patchLines=479 notesReviewed=
|
|
3400
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=0a1a91a631e7 patchFile=/tmp/leeroy-wip-pass2/098.patch patchSha256=a82d831612efb8e049226844eb4012087d4937724779ec76fa3c899be2a45af2 patchBytes=20638 patchLines=479 notesReviewed=yes reviewedAt=2026-01-24T21:56:06+0100 notesUpdated=yes
|
|
3386
3401
|
|
|
3387
3402
|
- Subject: feat(tmux): support per-instance socket path
|
|
3388
3403
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3398,9 +3413,16 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=0a1a91a631e7 patchFile=/
|
|
|
3398
3413
|
- Hardens parsing/escaping:
|
|
3399
3414
|
- Adds POSIX-safe quoting helpers for building shell commands.
|
|
3400
3415
|
- Adjusts session/window identifier validation to allow spaces (while keeping separators unambiguous).
|
|
3416
|
+
- Improves parsing helpers to allow spaces in `session:window` output while still enforcing end-of-line matches + name constraints.
|
|
3401
3417
|
- Refines tmux session selection behavior in `spawnInTmux(...)`:
|
|
3402
3418
|
- Differentiates `undefined` (use default session name) vs `''` (pick current/most-recent deterministically).
|
|
3403
3419
|
- Extends return type to include `sessionName`/`windowName` for better caller UX messaging.
|
|
3420
|
+
- Switches `new-window` invocation to:
|
|
3421
|
+
- explicitly target the session via `-t <sessionName>` (correct option ordering),
|
|
3422
|
+
- capture pane PID via `-P -F '#{pane_pid}'`,
|
|
3423
|
+
- and avoid quoting/escaping env values passed via `-e KEY=VALUE` (tmux does not do shell parsing for these).
|
|
3424
|
+
- Changes global caching from a single `_tmuxUtils` to a keyed cache (`sessionName` + socketPath + tmuxCommandEnv) to support multiple isolated tmux instances.
|
|
3425
|
+
- Simplifies `listWindows` to use `-F '#W'` rather than parsing human output.
|
|
3404
3426
|
- Adds `cli/src/utils/tmux.socketPath.test.ts` asserting `-S <socket>` is used when configured.
|
|
3405
3427
|
- Coherence:
|
|
3406
3428
|
- Matches subject; this is a cohesive tmux capability upgrade + test.
|
|
@@ -3417,7 +3439,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=0a1a91a631e7 patchFile=/
|
|
|
3417
3439
|
---
|
|
3418
3440
|
|
|
3419
3441
|
## 099 2026-01-15 c52227082c2b `tmux`
|
|
3420
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c52227082c2b patchFile=/tmp/leeroy-wip-pass2/099.patch patchSha256=8fcb1e38cd9e571e2e71d652bef92d1ff58ecb5c94531bca1ea5c12fcf58de10 patchBytes=68578 patchLines=1678 notesReviewed=
|
|
3442
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c52227082c2b patchFile=/tmp/leeroy-wip-pass2/099.patch patchSha256=8fcb1e38cd9e571e2e71d652bef92d1ff58ecb5c94531bca1ea5c12fcf58de10 patchBytes=68578 patchLines=1678 notesReviewed=yes reviewedAt=2026-01-24T21:59:16+0100 notesUpdated=yes
|
|
3421
3443
|
|
|
3422
3444
|
- Subject: fix(tmux): correct env, tmpdir, and session selection
|
|
3423
3445
|
- Reasons: safety/security-sensitive area
|
|
@@ -3437,11 +3459,12 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c52227082c2b patchFile=/
|
|
|
3437
3459
|
- Restores safe sequencing for Codex auth token persistence:
|
|
3438
3460
|
- `await fs.writeFile(..., auth.json, token)` (this reverts the non-awaited write introduced in commit 086, avoiding a race).
|
|
3439
3461
|
- Adds cleanup hooks for the temporary `CODEX_HOME` directory keyed by PID so it can be removed when spawning fails or after session tracking is established.
|
|
3462
|
+
- Improves safety of log redaction by truncating the list of env var keys logged in `apiMachine` (logs a sample of up to 20 keys + a “truncated” flag).
|
|
3440
3463
|
- `cli/src/utils/tmux.*.test.ts` and new `cli/src/utils/tmux.commandEnv.test.ts`:
|
|
3441
3464
|
- Asserts `TMUX_TMPDIR` is passed via the **tmux subprocess environment** when provided.
|
|
3442
3465
|
- Tightens spawn mocks/types so tests more accurately reflect node child-process behavior.
|
|
3443
3466
|
- Preserves failure semantics by treating signal-terminated tmux commands (`exitCode === null`) as non-zero (via `normalizeExitCode`).
|
|
3444
|
-
- Updates identifier parsing rules (notably: allows spaces in session names
|
|
3467
|
+
- Updates identifier parsing rules (notably: allows spaces in session/window names but rejects special characters like `@` that would break identifier safety).
|
|
3445
3468
|
- Adds opt-in integration tests `cli/src/utils/tmux.real.integration.test.ts`:
|
|
3446
3469
|
- Guarded by `HAPPY_CLI_TMUX_INTEGRATION=1` and designed to use isolated tmux servers so it shouldn’t touch user sessions.
|
|
3447
3470
|
- Adds targeted daemon tests:
|
|
@@ -3450,6 +3473,8 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c52227082c2b patchFile=/
|
|
|
3450
3473
|
- `cli/src/codex/codexMcpClient.ts`: adds Zod validation for elicitation params before calling the permission handler (deny-by-default on invalid payloads).
|
|
3451
3474
|
- `cli/src/ui/logger.test.ts`: changes assertions to validate on-disk log output rather than checking append-file calls.
|
|
3452
3475
|
- Small correctness tweaks (e.g. `createSessionMetadata` env trimming, offline stub test import path).
|
|
3476
|
+
- `cli/src/api/apiSession.ts`: reintroduces “emit while disconnected” behavior safely by adding `logSendWhileDisconnected(...)` (logs once per connection) and resetting the flag on reconnect (fixes gaps from commit 087).
|
|
3477
|
+
- `cli/src/persistence.ts`: drops `tmuxConfig.updateEnvironment` from the schema and stops exporting `TMUX_UPDATE_ENVIRONMENT` (schema alignment cleanup).
|
|
3453
3478
|
|
|
3454
3479
|
### Verdict
|
|
3455
3480
|
|
|
@@ -3473,7 +3498,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c52227082c2b patchFile=/
|
|
|
3473
3498
|
---
|
|
3474
3499
|
|
|
3475
3500
|
## 100 2026-01-16 7a01a8e42629 `claude`
|
|
3476
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=7a01a8e42629 patchFile=/tmp/leeroy-wip-pass2/100.patch patchSha256=3a5b6360339afeb6ed3363fb66a332db4d008bee9b3f1abeb2b0ab6bd473924f patchBytes=4948 patchLines=117 notesReviewed=
|
|
3501
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=7a01a8e42629 patchFile=/tmp/leeroy-wip-pass2/100.patch patchSha256=3a5b6360339afeb6ed3363fb66a332db4d008bee9b3f1abeb2b0ab6bd473924f patchBytes=4948 patchLines=117 notesReviewed=yes reviewedAt=2026-01-24T22:00:22+0100 notesUpdated=no
|
|
3477
3502
|
|
|
3478
3503
|
- Subject: test(claude): align sessionScanner path mapping
|
|
3479
3504
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3501,7 +3526,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=7a01a8e42629 patchFile=/
|
|
|
3501
3526
|
---
|
|
3502
3527
|
|
|
3503
3528
|
## 101 2026-01-17 1075a768e551 `rpc`
|
|
3504
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=1075a768e551 patchFile=/tmp/leeroy-wip-pass2/101.patch patchSha256=d999914eba7a69d93fcfd4671ba844a8b853acf80605549454970438f9ba4f41 patchBytes=7789 patchLines=208 notesReviewed=
|
|
3529
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=1075a768e551 patchFile=/tmp/leeroy-wip-pass2/101.patch patchSha256=d999914eba7a69d93fcfd4671ba844a8b853acf80605549454970438f9ba4f41 patchBytes=7789 patchLines=208 notesReviewed=yes reviewedAt=2026-01-24T22:01:26+0100 notesUpdated=yes
|
|
3505
3530
|
|
|
3506
3531
|
- Subject: feat(rpc): add detect-cli handler
|
|
3507
3532
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3514,6 +3539,8 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=1075a768e551 patchFile=/
|
|
|
3514
3539
|
- checks whether `claude`, `codex`, and `gemini` are resolvable on the daemon’s `PATH` (without relying on a login shell).
|
|
3515
3540
|
- returns `path` + a per-cli `{ available, resolvedPath? }` map.
|
|
3516
3541
|
- Adds `registerCommonHandlers.detectCli.test.ts` using a temporary fake executable to validate detection.
|
|
3542
|
+
- Notes:
|
|
3543
|
+
- Implementation uses a manual PATH scan (`resolveCommandOnPath`) with `fs.access` and PATHEXT handling on Windows (rather than `which`/shell), which matches the “daemon spawn resolution” goal.
|
|
3517
3544
|
- Coherence:
|
|
3518
3545
|
- Strong match to subject and a good foundation for UI gating and diagnostics.
|
|
3519
3546
|
|
|
@@ -3529,7 +3556,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=1075a768e551 patchFile=/
|
|
|
3529
3556
|
---
|
|
3530
3557
|
|
|
3531
3558
|
## 102 2026-01-21 c988f68ca4d0 `ui`
|
|
3532
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c988f68ca4d0 patchFile=/tmp/leeroy-wip-pass2/102.patch patchSha256=11ecb4a4e4ea947f09aa214e51377caec83ba779a548578217f2a7ee5cec5ec7 patchBytes=24188 patchLines=527 notesReviewed=
|
|
3559
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c988f68ca4d0 patchFile=/tmp/leeroy-wip-pass2/102.patch patchSha256=11ecb4a4e4ea947f09aa214e51377caec83ba779a548578217f2a7ee5cec5ec7 patchBytes=24188 patchLines=527 notesReviewed=yes reviewedAt=2026-01-24T22:11:23+0100 notesUpdated=yes
|
|
3533
3560
|
|
|
3534
3561
|
- Subject: feat(ui): surface Codex/Gemini errors in session UI
|
|
3535
3562
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3545,6 +3572,9 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c988f68ca4d0 patchFile=/
|
|
|
3545
3572
|
- `cli/src/codex/runCodex.ts` forwards MCP startup/stream/tool errors to both the Ink UI buffer and `session.sendSessionEvent({ type:'message', ... })` so the app UI doesn’t silently hang.
|
|
3546
3573
|
- Gemini:
|
|
3547
3574
|
- Extracts and centralizes error formatting into `formatGeminiErrorForUi(...)` (+ tests) so users get actionable messages instead of silent failure.
|
|
3575
|
+
- Notes / risks:
|
|
3576
|
+
- `formatErrorForUi` has a minimum `maxChars` of 1000 even if a smaller value is requested (good for preserving meaningful info; slightly surprising API).
|
|
3577
|
+
- `runCodex.ts` now treats `startSession`/`continueSession` tool responses with `isError=true` as “hard failures” and clears the session state immediately; this is likely correct UX-wise, but it is a behavior change worth keeping adjacent to any Codex resume/retry logic during rewrite.
|
|
3548
3578
|
- Coherence:
|
|
3549
3579
|
- Matches subject; a high-value UX reliability improvement for non-Claude agents.
|
|
3550
3580
|
|
|
@@ -3560,7 +3590,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c988f68ca4d0 patchFile=/
|
|
|
3560
3590
|
---
|
|
3561
3591
|
|
|
3562
3592
|
## 103 2026-01-21 b2269ee11252 `claude`
|
|
3563
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=b2269ee11252 patchFile=/tmp/leeroy-wip-pass2/103.patch patchSha256=cf9d1c3d1c11b8f947a6829d1151207b278740561e7e9c0c62812f9979e641b2 patchBytes=62570 patchLines=1600 notesReviewed=
|
|
3593
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=b2269ee11252 patchFile=/tmp/leeroy-wip-pass2/103.patch patchSha256=cf9d1c3d1c11b8f947a6829d1151207b278740561e7e9c0c62812f9979e641b2 patchBytes=62570 patchLines=1600 notesReviewed=yes reviewedAt=2026-01-24T22:15:19+0100 notesUpdated=yes
|
|
3564
3594
|
|
|
3565
3595
|
- Subject: fix(claude): use hook transcript path across switching
|
|
3566
3596
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3579,9 +3609,17 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=b2269ee11252 patchFile=/
|
|
|
3579
3609
|
- Switch RPC hardening:
|
|
3580
3610
|
- Makes the `switch` RPC idempotent by accepting `{ to: 'local'|'remote' }` and returning `boolean`; retains legacy “toggle” semantics when params are missing.
|
|
3581
3611
|
- Waits briefly for hook session info before switching to avoid null sessionId/transcript races.
|
|
3582
|
-
|
|
3583
|
-
|
|
3584
|
-
|
|
3612
|
+
- Misc reliability:
|
|
3613
|
+
- KeepAlive reports correct mode.
|
|
3614
|
+
- Remote init no longer blocks on a long file wait.
|
|
3615
|
+
- Additional (diff-confirmed) details worth preserving in rewrite:
|
|
3616
|
+
- `Session` now tracks `transcriptPath` derived from hook data (`transcript_path`/`transcriptPath`) and notifies sessionFound callbacks with `{ sessionId, transcriptPath }`.
|
|
3617
|
+
- `Session.waitForSessionFound({ timeoutMs, requireTranscriptPath })` is introduced so launchers can avoid switching before session/transcript info exists.
|
|
3618
|
+
- `sessionScanner` supports per-session transcript path overrides:
|
|
3619
|
+
- initial `transcriptPath` is applied before “mark existing messages as processed” to avoid replaying history from the wrong file.
|
|
3620
|
+
- watcher restarts when a session’s resolved file path changes (e.g., hook provides a new transcript path later).
|
|
3621
|
+
- optional `onTranscriptMissing` warning fires after `transcriptMissingWarningMs` (default `5000`), and is guarded to avoid spamming.
|
|
3622
|
+
- Hook server data shape is widened to accept camelCase keys (`transcriptPath`, `hookEventName`) in addition to snake_case.
|
|
3585
3623
|
- Coherence:
|
|
3586
3624
|
- Large, but cohesive: all changes serve “reliable switching + transcript discovery in hook mode”.
|
|
3587
3625
|
|
|
@@ -3600,7 +3638,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=b2269ee11252 patchFile=/
|
|
|
3600
3638
|
---
|
|
3601
3639
|
|
|
3602
3640
|
## 104 2026-01-21 f53cf71d416c `persistence`
|
|
3603
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=f53cf71d416c patchFile=/tmp/leeroy-wip-pass2/104.patch patchSha256=c6a15de58398ba05150e0c76876ff207f0cb46324c1e763401111140eaf9158d patchBytes=2622 patchLines=63 notesReviewed=
|
|
3641
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=f53cf71d416c patchFile=/tmp/leeroy-wip-pass2/104.patch patchSha256=c6a15de58398ba05150e0c76876ff207f0cb46324c1e763401111140eaf9158d patchBytes=2622 patchLines=63 notesReviewed=yes reviewedAt=2026-01-24T22:16:05+0100 notesUpdated=no
|
|
3604
3642
|
|
|
3605
3643
|
- Subject: refactor(persistence): remove deprecated tmuxConfig
|
|
3606
3644
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3627,7 +3665,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=f53cf71d416c patchFile=/
|
|
|
3627
3665
|
---
|
|
3628
3666
|
|
|
3629
3667
|
## 105 2026-01-21 8dae65f6c585 `rpc`
|
|
3630
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=8dae65f6c585 patchFile=/tmp/leeroy-wip-pass2/105.patch patchSha256=2c7d6936b9a9bb12b20a6419899b34039e91bfcb58076ee36ea8189da7804a87 patchBytes=17844 patchLines=416 notesReviewed=
|
|
3668
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=8dae65f6c585 patchFile=/tmp/leeroy-wip-pass2/105.patch patchSha256=2c7d6936b9a9bb12b20a6419899b34039e91bfcb58076ee36ea8189da7804a87 patchBytes=17844 patchLines=416 notesReviewed=yes reviewedAt=2026-01-24T22:16:51+0100 notesUpdated=yes
|
|
3631
3669
|
|
|
3632
3670
|
- Subject: feat(rpc): include tmux in detect-cli
|
|
3633
3671
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3643,8 +3681,10 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=8dae65f6c585 patchFile=/
|
|
|
3643
3681
|
- Adds helper utilities:
|
|
3644
3682
|
- safe “first line” extraction and version parsing (`extractSemver`, `extractTmuxVersion`)
|
|
3645
3683
|
- best-effort `execFile` wrappers with timeouts and non-throwing behavior.
|
|
3684
|
+
- Windows nuance: `.cmd/.bat` are invoked via `cmd.exe /c` for probes (`--version` / `-V` / login status) instead of direct `execFile`.
|
|
3646
3685
|
- Tests:
|
|
3647
3686
|
- expands `registerCommonHandlers.detectCli.test.ts` to validate version parsing and optional login status behavior using fake scripts.
|
|
3687
|
+
- Also updates `SpawnSessionOptions` to prefer `terminal?: TerminalSpawnOptions` over legacy `TMUX_*` env vars (doc-level shape change, consumed in later tmux/terminal commits).
|
|
3648
3688
|
- Coherence:
|
|
3649
3689
|
- Matches subject; this turns detect-cli into a more complete diagnostics primitive for UI gating.
|
|
3650
3690
|
- Security/reliability note:
|
|
@@ -3662,7 +3702,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=8dae65f6c585 patchFile=/
|
|
|
3662
3702
|
---
|
|
3663
3703
|
|
|
3664
3704
|
## 106 2026-01-21 ad66c6aaa3ae `terminal`
|
|
3665
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=ad66c6aaa3ae patchFile=/tmp/leeroy-wip-pass2/106.patch patchSha256=3d6e395250cebf51ffe4f82a279b4407665c893d55d42dee5bd7a69c541c82a0 patchBytes=47830 patchLines=1371 notesReviewed=
|
|
3705
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=ad66c6aaa3ae patchFile=/tmp/leeroy-wip-pass2/106.patch patchSha256=3d6e395250cebf51ffe4f82a279b4407665c893d55d42dee5bd7a69c541c82a0 patchBytes=47830 patchLines=1371 notesReviewed=yes reviewedAt=2026-01-24T22:18:04+0100 notesUpdated=yes
|
|
3666
3706
|
|
|
3667
3707
|
- Subject: feat(terminal): add tmux metadata + attach tooling
|
|
3668
3708
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3675,10 +3715,13 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=ad66c6aaa3ae patchFile=/
|
|
|
3675
3715
|
- `cli/src/api/types.ts` adds `Metadata.terminal` describing runtime mode (`plain|tmux`), requested mode, fallback reasons, and tmux target/tmpDir (non-secret).
|
|
3676
3716
|
- `cli/src/claude/runClaude.ts` builds `terminal` metadata from internal terminal runtime flags and persists best-effort local attachment info once a session ID exists.
|
|
3677
3717
|
- When tmux was requested but unavailable, sends a UI-facing status message into the session transcript (fallback reason).
|
|
3718
|
+
- `cli/src/codex/runCodex.ts` and `cli/src/gemini/runGemini.ts` mirror the same “persist attachment info + fallback message” behavior once a real session ID exists.
|
|
3678
3719
|
- Adds attach workflows + utilities:
|
|
3679
3720
|
- New `happy attach` command (planning + attach selection behavior).
|
|
3680
3721
|
- Adds terminal planning modules (`terminalAttachPlan`, `tmuxSessionSelector`, `terminalAttachmentInfo`, etc.) with a strong test suite.
|
|
3681
3722
|
- Adds headless tmux launcher support (`--tmux`) and internal terminal runtime flags plumbing for spawners (daemon/tmux wrapper).
|
|
3723
|
+
- Internal runtime flags are explicitly parsed + stripped before CLI subcommand parsing (`--happy-terminal-*`, `--happy-tmux-*`) to avoid leaking internal implementation details to users.
|
|
3724
|
+
- Attachment info is persisted per-session under `happyHomeDir/terminal/sessions/<sessionId>.json` using a `*.tmp` write + `rename` (atomic on POSIX).
|
|
3682
3725
|
- Coherence:
|
|
3683
3726
|
- Large but coherent: all changes support “spawn + attach” workflows and consistent UI/metadata reporting.
|
|
3684
3727
|
|
|
@@ -3697,7 +3740,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=ad66c6aaa3ae patchFile=/
|
|
|
3697
3740
|
---
|
|
3698
3741
|
|
|
3699
3742
|
## 107 2026-01-21 c13d51ee4638 `daemon`
|
|
3700
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c13d51ee4638 patchFile=/tmp/leeroy-wip-pass2/107.patch patchSha256=f1b4d85a17e6b6eb2e3b3623b47a9ce05e4634756a9f584ed2873eb0693ed53a patchBytes=28540 patchLines=665 notesReviewed=
|
|
3743
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c13d51ee4638 patchFile=/tmp/leeroy-wip-pass2/107.patch patchSha256=f1b4d85a17e6b6eb2e3b3623b47a9ce05e4634756a9f584ed2873eb0693ed53a patchBytes=28540 patchLines=665 notesReviewed=yes reviewedAt=2026-01-24T22:18:59+0100 notesUpdated=yes
|
|
3701
3744
|
|
|
3702
3745
|
- Subject: feat(daemon): support tmux spawn + harden runtime
|
|
3703
3746
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3711,10 +3754,15 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c13d51ee4638 patchFile=/
|
|
|
3711
3754
|
- Adds `cli/src/api/apiMachine.spawnSession.test.ts` ensuring terminal spawn options are forwarded.
|
|
3712
3755
|
- Adds daemon tmux spawn support:
|
|
3713
3756
|
- Updates `cli/src/daemon/run.ts` to spawn sessions in tmux when requested (including isolated tmux server option) and to record tmux target/fallback metadata.
|
|
3757
|
+
- Uses `resolveTerminalRequestFromSpawnOptions` (typed `terminal` config preferred; legacy `TMUX_*` respected as fallback) and strips `TMUX_SESSION_NAME` / `TMUX_TMPDIR` from the child env (daemon/runtime concerns, not agent-runtime env).
|
|
3758
|
+
- Resolves empty tmux session names (“current/most recent”) deterministically via `tmux list-sessions` + `selectPreferredTmuxSessionName`; builds a per-window target (`<session>:happy-<timestamp>-<agent>`).
|
|
3759
|
+
- On fallback to plain spawn when tmux was requested, injects internal runtime flags (`--happy-terminal-mode plain --happy-terminal-requested tmux --happy-terminal-fallback-reason ...`) so the started CLI can surface the reason + metadata.
|
|
3714
3760
|
- Runtime hardening:
|
|
3715
|
-
- Adds a no-op short-circuit when machine metadata updates do not change (avoids unnecessary writes).
|
|
3716
|
-
- Makes `ApiMachineClient.connect` accept an optional `onConnect` hook
|
|
3717
|
-
-
|
|
3761
|
+
- Adds a no-op short-circuit when machine metadata updates do not change (avoids unnecessary writes); note this uses `JSON.stringify` equality which assumes stable key ordering.
|
|
3762
|
+
- Makes `ApiMachineClient.connect` accept an optional best-effort `onConnect` hook (errors ignored) and uses it in the daemon to refresh machine metadata once after connect.
|
|
3763
|
+
- On macOS, prefers a more user-friendly/stable host name via `scutil --get HostName|LocalHostName|ComputerName` with short timeouts.
|
|
3764
|
+
- Logging is made strictly non-fatal (even with `DEBUG=1`): first file write failure is surfaced once, then silenced.
|
|
3765
|
+
- Backoff utilities are hardened: delay clamps/jitter avoids <minDelay, default `maxFailureCount` is reduced to `8`, adds `shouldRetry` gates (`retryable:false` / `canTryAgain:false`) and introduces `backoffForever` for “keep retrying” flows (`InvalidateSync` now uses `backoffForever`).
|
|
3718
3766
|
- Coherence:
|
|
3719
3767
|
- Matches subject; this is the daemon-side counterpart to the terminal/attach tooling series.
|
|
3720
3768
|
|
|
@@ -3730,7 +3778,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=c13d51ee4638 patchFile=/
|
|
|
3730
3778
|
---
|
|
3731
3779
|
|
|
3732
3780
|
## 108 2026-01-21 f7db44dea458 `docs`
|
|
3733
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=f7db44dea458 patchFile=/tmp/leeroy-wip-pass2/108.patch patchSha256=f5fd09d2bb72379dfd58d163dae1326f5eb30d40f128b29dee41121a0b595514 patchBytes=524 patchLines=18 notesReviewed=
|
|
3781
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=f7db44dea458 patchFile=/tmp/leeroy-wip-pass2/108.patch patchSha256=f5fd09d2bb72379dfd58d163dae1326f5eb30d40f128b29dee41121a0b595514 patchBytes=524 patchLines=18 notesReviewed=yes reviewedAt=2026-01-24T22:20:24+0100 notesUpdated=no
|
|
3734
3782
|
|
|
3735
3783
|
- Subject: docs: add AGENTS.md symlink
|
|
3736
3784
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3755,7 +3803,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=f7db44dea458 patchFile=/
|
|
|
3755
3803
|
---
|
|
3756
3804
|
|
|
3757
3805
|
## 109 2026-01-21 af5000ea6318 `ui`
|
|
3758
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=af5000ea6318 patchFile=/tmp/leeroy-wip-pass2/109.patch patchSha256=60b9f67574d7599d92a182dfa55f618b98bd11e5ce8fee5403d42b1f5de1d361 patchBytes=3587 patchLines=75 notesReviewed=
|
|
3806
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=af5000ea6318 patchFile=/tmp/leeroy-wip-pass2/109.patch patchSha256=60b9f67574d7599d92a182dfa55f618b98bd11e5ce8fee5403d42b1f5de1d361 patchBytes=3587 patchLines=75 notesReviewed=yes reviewedAt=2026-01-24T22:20:50+0100 notesUpdated=no
|
|
3759
3807
|
|
|
3760
3808
|
- Subject: fix(ui): polish Codex and Gemini error messages
|
|
3761
3809
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -3781,7 +3829,7 @@ Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=af5000ea6318 patchFile=/
|
|
|
3781
3829
|
---
|
|
3782
3830
|
|
|
3783
3831
|
## 110 2026-01-21 f68552d03ab9 `tmux`
|
|
3784
|
-
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=f68552d03ab9 patchFile=/tmp/leeroy-wip-pass2/110.patch patchSha256=1a6a3abf018cc15fd95308d7fcabfefbf83bbb49904de901318da0a125378761 patchBytes=3791 patchLines=109 notesReviewed=
|
|
3832
|
+
Pass2FullDiff: CAPTURED at 2026-01-24T17:39:06+0100 sha=f68552d03ab9 patchFile=/tmp/leeroy-wip-pass2/110.patch patchSha256=1a6a3abf018cc15fd95308d7fcabfefbf83bbb49904de901318da0a125378761 patchBytes=3791 patchLines=109 notesReviewed=yes reviewedAt=2026-01-24T22:21:22+0100 notesUpdated=no
|
|
3785
3833
|
|
|
3786
3834
|
- Subject: fix(tmux): print attach instructions in correct order
|
|
3787
3835
|
- Reasons: full manual review coverage (was not in the manual-review queue)
|
|
@@ -32,6 +32,21 @@ npx happy-stacks setup --profile=dev
|
|
|
32
32
|
|
|
33
33
|
This will guide you through workspace setup, bootstrapping components, and the recommended developer auth flow (`dev-auth` seed stack + optional mobile dev-client install).
|
|
34
34
|
|
|
35
|
+
### LLM helpers (optional)
|
|
36
|
+
|
|
37
|
+
Happy Stacks has “LLM prompt” helpers for the two most common “LLM is useful here” flows:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Import + migrate legacy split repos (pre-monorepo)
|
|
41
|
+
happys import llm --mode=import --launch
|
|
42
|
+
happys import llm --mode=migrate --stack=<stack> --launch
|
|
43
|
+
|
|
44
|
+
# Port commits into a monorepo checkout (conflict-resolution helper)
|
|
45
|
+
happys monorepo port llm --target=/abs/path/to/monorepo --launch
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
If `--launch` isn’t available on your system, use `--copy` instead and paste the prompt into any LLM UI.
|
|
49
|
+
|
|
35
50
|
### Components
|
|
36
51
|
|
|
37
52
|
Happy Stacks is a launcher/orchestrator repo. The actual product code lives in component repos under:
|
|
@@ -57,6 +57,25 @@ happys monorepo port continue --target=/abs/path/to/monorepo
|
|
|
57
57
|
- `port status` shows whether a `git am` session is in progress, the current patch subject, and conflicted files.
|
|
58
58
|
- `port continue` runs `git am --continue` for the target repo (after you staged resolved files). If you started from `port guide`, it can also resume the remaining port automatically after each continue.
|
|
59
59
|
|
|
60
|
+
### LLM-assisted conflict resolution (optional)
|
|
61
|
+
|
|
62
|
+
If you want to use an LLM to drive the port and resolve conflicts:
|
|
63
|
+
|
|
64
|
+
- **Best UX (guided)**: run `port guide` and pick **LLM** when it previews the first likely conflict.
|
|
65
|
+
- **Direct prompt helper**:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Launch an LLM CLI in a new terminal (best-effort)
|
|
69
|
+
happys monorepo port llm --target=/abs/path/to/monorepo --launch
|
|
70
|
+
|
|
71
|
+
# Or: print + copy a prompt for copy/paste
|
|
72
|
+
happys monorepo port llm --target=/abs/path/to/monorepo --copy
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Notes:
|
|
76
|
+
- Conflict resolution is **incremental**: `git am` stops at the **first** conflict; resolve it, then continue, and repeat.
|
|
77
|
+
- If no supported LLM CLI is installed (or terminal launching isn’t available), use `--copy` and paste into any LLM UI.
|
|
78
|
+
|
|
60
79
|
How to bring “the changes you want to port” into this environment:
|
|
61
80
|
|
|
62
81
|
- **If you already have local checkouts** of your legacy repos (recommended for forks/branches that aren’t PRs yet):
|