From f445381834073ad6f7c4324ed694c3d142b19430 Mon Sep 17 00:00:00 2001 From: Koosha Paridehpour Date: Mon, 23 Feb 2026 03:49:04 -0700 Subject: [PATCH 1/9] chore(worktrees): snapshot cleanup round2 (20260223-034902) --- .../cliproxy-cleanup-targets.txt | 4 ++ .../cliproxyapi-plusplus-lane-d11/meta.txt | 2 + .../cliproxyapi-plusplus-lane-d11/status.txt | 1 + .../tracked.diff.gz | Bin 0 -> 33 bytes .../meta.txt | 2 + .../status.txt | 1 + .../tracked.diff.gz | Bin 0 -> 33 bytes .../meta.txt | 2 + .../status.txt | 44 ++++++++++++++++++ .../tracked.diff.gz | Bin 0 -> 21407 bytes .../cliproxyapi-plusplus-wt-cpb0742/meta.txt | 2 + .../status.txt | 1 + .../tracked.diff.gz | Bin 0 -> 33 bytes 13 files changed, 59 insertions(+) create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxy-cleanup-targets.txt create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d11/meta.txt create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d11/status.txt create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d11/tracked.diff.gz create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d12-retry/meta.txt create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d12-retry/status.txt create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d12-retry/tracked.diff.gz create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-workstream-cpb11-7/meta.txt create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-workstream-cpb11-7/status.txt create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-workstream-cpb11-7/tracked.diff.gz create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-wt-cpb0742/meta.txt create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-wt-cpb0742/status.txt create mode 100644 docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-wt-cpb0742/tracked.diff.gz diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxy-cleanup-targets.txt b/docs/reports/worktree-snapshots/20260223-034902/cliproxy-cleanup-targets.txt new file mode 100644 index 0000000000..3de028cc8a --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-034902/cliproxy-cleanup-targets.txt @@ -0,0 +1,4 @@ +/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-lane-d11 +/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-lane-d12-retry +/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-workstream-cpb11-7 +/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-wt-cpb0742 diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d11/meta.txt b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d11/meta.txt new file mode 100644 index 0000000000..27a1d83512 --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d11/meta.txt @@ -0,0 +1,2 @@ +path=/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-lane-d11 +exists=yes diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d11/status.txt b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d11/status.txt new file mode 100644 index 0000000000..af0a4d22c9 --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d11/status.txt @@ -0,0 +1 @@ +## lane-d11-cpb-0786-0795 diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d11/tracked.diff.gz b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d11/tracked.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..fc2a43a209a29ea7ab41fe8febe60ea1cdc6f745 GIT binary patch literal 33 hcmb2|=HQrbFej6NxuhsDIXg8)FC{ZAje(f~1^}El2RZ-% literal 0 HcmV?d00001 diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d12-retry/meta.txt b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d12-retry/meta.txt new file mode 100644 index 0000000000..d44a36b3a1 --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d12-retry/meta.txt @@ -0,0 +1,2 @@ +path=/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-lane-d12-retry +exists=yes diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d12-retry/status.txt b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d12-retry/status.txt new file mode 100644 index 0000000000..66778eaded --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d12-retry/status.txt @@ -0,0 +1 @@ +## lane/d12-retry-cpb-after-0795 diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d12-retry/tracked.diff.gz b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-lane-d12-retry/tracked.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..fc2a43a209a29ea7ab41fe8febe60ea1cdc6f745 GIT binary patch literal 33 hcmb2|=HQrbFej6NxuhsDIXg8)FC{ZAje(f~1^}El2RZ-% literal 0 HcmV?d00001 diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-workstream-cpb11-7/meta.txt b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-workstream-cpb11-7/meta.txt new file mode 100644 index 0000000000..13d61b7615 --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-workstream-cpb11-7/meta.txt @@ -0,0 +1,2 @@ +path=/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-workstream-cpb11-7 +exists=yes diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-workstream-cpb11-7/status.txt b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-workstream-cpb11-7/status.txt new file mode 100644 index 0000000000..ecce59c7bb --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-workstream-cpb11-7/status.txt @@ -0,0 +1,44 @@ +## cpb-0036-0047-next + M Taskfile.yml + M cmd/server/main.go + M docs/FEATURE_CHANGES_PLUSPLUS.md + M docs/api/openai-compatible.md + M docs/features/auth/USER.md + M docs/features/operations/USER.md + M docs/features/providers/SPEC.md + M docs/planning/reports/fragemented/issue-wave-cpb-0036-0105-lane-1.md + M docs/planning/reports/fragemented/issue-wave-cpb-0036-0105-lane-2.md + M docs/planning/reports/issue-wave-cpb-0036-0105-lane-1.md + M docs/planning/reports/issue-wave-cpb-0036-0105-lane-2.md + M docs/planning/reports/issue-wave-cpb-0176-0245-lane-1.md + M docs/provider-catalog.md + M docs/provider-operations.md + M docs/provider-quickstarts.md + M docs/provider-usage.md + M docs/troubleshooting.md + M pkg/llmproxy/api/modules/amp/fallback_handlers.go + M pkg/llmproxy/api/modules/amp/fallback_handlers_test.go + M pkg/llmproxy/api/modules/amp/response_rewriter_test.go + M pkg/llmproxy/config/config.go + M pkg/llmproxy/config/oauth_model_alias_migration.go + M pkg/llmproxy/config/oauth_model_alias_test.go + M pkg/llmproxy/registry/model_registry.go + M pkg/llmproxy/runtime/executor/claude_executor_test.go + M pkg/llmproxy/runtime/executor/kiro_executor.go + M pkg/llmproxy/runtime/executor/kiro_executor_extra_test.go + M pkg/llmproxy/thinking/apply.go + M pkg/llmproxy/translator/kiro/openai/kiro_openai.go + M pkg/llmproxy/watcher/events.go + M pkg/llmproxy/watcher/watcher.go + M pkg/llmproxy/watcher/watcher_test.go + M sdk/api/handlers/openai/openai_responses_compact_test.go + M sdk/api/handlers/openai/openai_responses_handlers.go +?? docs/planning/reports/issue-wave-cpb-0088-0147-orchestrator.md +?? docs/planning/reports/issue-wave-cpb-0176-0187-orchestrator.md +?? docs/planning/reports/issue-wave-cpb-0188-0237-orchestrator.md +?? docs/planning/reports/issue-wave-cpb-0238-0267-orchestrator.md +?? docs/planning/reports/issue-wave-cpb-0741-0750-lane-d8.md +?? pkg/llmproxy/registry/model_registry_fallback_test.go +?? pkg/llmproxy/thinking/apply_gemini_extract_test.go +?? pkg/llmproxy/thinking/provider/claude/apply_test.go +?? pkg/llmproxy/translator/kiro/openai/kiro_openai_nonstream_usage_test.go diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-workstream-cpb11-7/tracked.diff.gz b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-workstream-cpb11-7/tracked.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..d12dbb45814706c909a9f1fc6a263da91533e46d GIT binary patch literal 21407 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 LS^eD8z(D~32m8(1 literal 0 HcmV?d00001 diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-wt-cpb0742/meta.txt b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-wt-cpb0742/meta.txt new file mode 100644 index 0000000000..7b7d5507a2 --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-wt-cpb0742/meta.txt @@ -0,0 +1,2 @@ +path=/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-wt-cpb0742 +exists=yes diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-wt-cpb0742/status.txt b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-wt-cpb0742/status.txt new file mode 100644 index 0000000000..6e1461f1d9 --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-wt-cpb0742/status.txt @@ -0,0 +1 @@ +## feat/cpb-0742-0744-scoped...origin/feat/cpb-0742-0744-scoped [gone] diff --git a/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-wt-cpb0742/tracked.diff.gz b/docs/reports/worktree-snapshots/20260223-034902/cliproxyapi-plusplus-wt-cpb0742/tracked.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..fc2a43a209a29ea7ab41fe8febe60ea1cdc6f745 GIT binary patch literal 33 hcmb2|=HQrbFej6NxuhsDIXg8)FC{ZAje(f~1^}El2RZ-% literal 0 HcmV?d00001 From f2df50d41e5c79fb56652db2f52bc3d69a1d9aea Mon Sep 17 00:00:00 2001 From: Koosha Paridehpour Date: Mon, 23 Feb 2026 03:50:06 -0700 Subject: [PATCH 2/9] chore(worktrees): snapshot cleanup round2 (20260223-035004) --- .../cliproxy-cleanup-targets.txt | 4 ++ .../cliproxyapi-plusplus-lane-d11/meta.txt | 2 + .../cliproxyapi-plusplus-lane-d11/status.txt | 1 + .../tracked.diff.gz | Bin 0 -> 33 bytes .../meta.txt | 2 + .../status.txt | 1 + .../tracked.diff.gz | Bin 0 -> 33 bytes .../meta.txt | 2 + .../status.txt | 44 ++++++++++++++++++ .../tracked.diff.gz | Bin 0 -> 21407 bytes .../cliproxyapi-plusplus-wt-cpb0742/meta.txt | 2 + .../status.txt | 1 + .../tracked.diff.gz | Bin 0 -> 33 bytes 13 files changed, 59 insertions(+) create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxy-cleanup-targets.txt create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d11/meta.txt create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d11/status.txt create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d11/tracked.diff.gz create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d12-retry/meta.txt create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d12-retry/status.txt create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d12-retry/tracked.diff.gz create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-workstream-cpb11-7/meta.txt create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-workstream-cpb11-7/status.txt create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-workstream-cpb11-7/tracked.diff.gz create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-wt-cpb0742/meta.txt create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-wt-cpb0742/status.txt create mode 100644 docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-wt-cpb0742/tracked.diff.gz diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxy-cleanup-targets.txt b/docs/reports/worktree-snapshots/20260223-035004/cliproxy-cleanup-targets.txt new file mode 100644 index 0000000000..3de028cc8a --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-035004/cliproxy-cleanup-targets.txt @@ -0,0 +1,4 @@ +/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-lane-d11 +/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-lane-d12-retry +/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-workstream-cpb11-7 +/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-wt-cpb0742 diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d11/meta.txt b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d11/meta.txt new file mode 100644 index 0000000000..27a1d83512 --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d11/meta.txt @@ -0,0 +1,2 @@ +path=/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-lane-d11 +exists=yes diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d11/status.txt b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d11/status.txt new file mode 100644 index 0000000000..af0a4d22c9 --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d11/status.txt @@ -0,0 +1 @@ +## lane-d11-cpb-0786-0795 diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d11/tracked.diff.gz b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d11/tracked.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..a40a7342fa76cb573510db56d85cf8fc3e91a3aa GIT binary patch literal 33 hcmb2|=HR$%Fej6NxuhsDIXg8)FC{ZAje(f~1^}Zy2Y3Jg literal 0 HcmV?d00001 diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d12-retry/meta.txt b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d12-retry/meta.txt new file mode 100644 index 0000000000..d44a36b3a1 --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d12-retry/meta.txt @@ -0,0 +1,2 @@ +path=/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-lane-d12-retry +exists=yes diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d12-retry/status.txt b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d12-retry/status.txt new file mode 100644 index 0000000000..66778eaded --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d12-retry/status.txt @@ -0,0 +1 @@ +## lane/d12-retry-cpb-after-0795 diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d12-retry/tracked.diff.gz b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-lane-d12-retry/tracked.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..a40a7342fa76cb573510db56d85cf8fc3e91a3aa GIT binary patch literal 33 hcmb2|=HR$%Fej6NxuhsDIXg8)FC{ZAje(f~1^}Zy2Y3Jg literal 0 HcmV?d00001 diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-workstream-cpb11-7/meta.txt b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-workstream-cpb11-7/meta.txt new file mode 100644 index 0000000000..13d61b7615 --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-workstream-cpb11-7/meta.txt @@ -0,0 +1,2 @@ +path=/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-workstream-cpb11-7 +exists=yes diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-workstream-cpb11-7/status.txt b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-workstream-cpb11-7/status.txt new file mode 100644 index 0000000000..ecce59c7bb --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-workstream-cpb11-7/status.txt @@ -0,0 +1,44 @@ +## cpb-0036-0047-next + M Taskfile.yml + M cmd/server/main.go + M docs/FEATURE_CHANGES_PLUSPLUS.md + M docs/api/openai-compatible.md + M docs/features/auth/USER.md + M docs/features/operations/USER.md + M docs/features/providers/SPEC.md + M docs/planning/reports/fragemented/issue-wave-cpb-0036-0105-lane-1.md + M docs/planning/reports/fragemented/issue-wave-cpb-0036-0105-lane-2.md + M docs/planning/reports/issue-wave-cpb-0036-0105-lane-1.md + M docs/planning/reports/issue-wave-cpb-0036-0105-lane-2.md + M docs/planning/reports/issue-wave-cpb-0176-0245-lane-1.md + M docs/provider-catalog.md + M docs/provider-operations.md + M docs/provider-quickstarts.md + M docs/provider-usage.md + M docs/troubleshooting.md + M pkg/llmproxy/api/modules/amp/fallback_handlers.go + M pkg/llmproxy/api/modules/amp/fallback_handlers_test.go + M pkg/llmproxy/api/modules/amp/response_rewriter_test.go + M pkg/llmproxy/config/config.go + M pkg/llmproxy/config/oauth_model_alias_migration.go + M pkg/llmproxy/config/oauth_model_alias_test.go + M pkg/llmproxy/registry/model_registry.go + M pkg/llmproxy/runtime/executor/claude_executor_test.go + M pkg/llmproxy/runtime/executor/kiro_executor.go + M pkg/llmproxy/runtime/executor/kiro_executor_extra_test.go + M pkg/llmproxy/thinking/apply.go + M pkg/llmproxy/translator/kiro/openai/kiro_openai.go + M pkg/llmproxy/watcher/events.go + M pkg/llmproxy/watcher/watcher.go + M pkg/llmproxy/watcher/watcher_test.go + M sdk/api/handlers/openai/openai_responses_compact_test.go + M sdk/api/handlers/openai/openai_responses_handlers.go +?? docs/planning/reports/issue-wave-cpb-0088-0147-orchestrator.md +?? docs/planning/reports/issue-wave-cpb-0176-0187-orchestrator.md +?? docs/planning/reports/issue-wave-cpb-0188-0237-orchestrator.md +?? docs/planning/reports/issue-wave-cpb-0238-0267-orchestrator.md +?? docs/planning/reports/issue-wave-cpb-0741-0750-lane-d8.md +?? pkg/llmproxy/registry/model_registry_fallback_test.go +?? pkg/llmproxy/thinking/apply_gemini_extract_test.go +?? pkg/llmproxy/thinking/provider/claude/apply_test.go +?? pkg/llmproxy/translator/kiro/openai/kiro_openai_nonstream_usage_test.go diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-workstream-cpb11-7/tracked.diff.gz b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-workstream-cpb11-7/tracked.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..7a320ddf08cc5f2f04bfb0ee8ff30f7b98485c7a GIT binary patch literal 21407 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 LS^eD8z(D~3NU_cs literal 0 HcmV?d00001 diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-wt-cpb0742/meta.txt b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-wt-cpb0742/meta.txt new file mode 100644 index 0000000000..7b7d5507a2 --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-wt-cpb0742/meta.txt @@ -0,0 +1,2 @@ +path=/Users/kooshapari/temp-PRODVERCEL/485/kush/cliproxyapi-plusplus-wt-cpb0742 +exists=yes diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-wt-cpb0742/status.txt b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-wt-cpb0742/status.txt new file mode 100644 index 0000000000..6e1461f1d9 --- /dev/null +++ b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-wt-cpb0742/status.txt @@ -0,0 +1 @@ +## feat/cpb-0742-0744-scoped...origin/feat/cpb-0742-0744-scoped [gone] diff --git a/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-wt-cpb0742/tracked.diff.gz b/docs/reports/worktree-snapshots/20260223-035004/cliproxyapi-plusplus-wt-cpb0742/tracked.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..a40a7342fa76cb573510db56d85cf8fc3e91a3aa GIT binary patch literal 33 hcmb2|=HR$%Fej6NxuhsDIXg8)FC{ZAje(f~1^}Zy2Y3Jg literal 0 HcmV?d00001 From 40ec26b380651e8c13f4dc19a7676914b6e3305f Mon Sep 17 00:00:00 2001 From: Koosha Paridehpour Date: Wed, 25 Feb 2026 04:47:34 -0700 Subject: [PATCH 3/9] feat: add service setup helper and homebrew service docs --- docs/install.md | 16 +- examples/homebrew/cliproxyapi-plusplus.rb | 27 +++ scripts/service | 232 ++++++++++++++++++++++ 3 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 examples/homebrew/cliproxyapi-plusplus.rb create mode 100755 scripts/service diff --git a/docs/install.md b/docs/install.md index c8062542d3..91c3330d8f 100644 --- a/docs/install.md +++ b/docs/install.md @@ -152,6 +152,19 @@ sudo systemctl restart cliproxyapi-plusplus sudo systemctl stop cliproxyapi-plusplus ``` +Cross-platform helper (optional): + +```bash +./scripts/service install +./scripts/service start +./scripts/service status +./scripts/service restart +./scripts/service stop +./scripts/service remove +``` + +On Linux the script writes the systemd unit to `/etc/systemd/system` and requires root privileges. + ### macOS (Homebrew + launchd) Homebrew installs typically place artifacts under `/opt/homebrew`. If installed elsewhere, keep the same launchd flow and swap the binary/config paths. @@ -163,9 +176,10 @@ launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.router-for-me.clipro launchctl kickstart -k gui/$(id -u)/com.router-for-me.cliproxyapi-plusplus ``` -If your Homebrew formula supports service hooks: +You can also use a local Homebrew formula with service hooks: ```bash +brew install --HEAD --formula examples/homebrew/cliproxyapi-plusplus.rb brew services start cliproxyapi-plusplus brew services restart cliproxyapi-plusplus ``` diff --git a/examples/homebrew/cliproxyapi-plusplus.rb b/examples/homebrew/cliproxyapi-plusplus.rb new file mode 100644 index 0000000000..61d090c00a --- /dev/null +++ b/examples/homebrew/cliproxyapi-plusplus.rb @@ -0,0 +1,27 @@ +class CliproxyapiPlusplus < Formula + desc "LLM proxy CLI for OpenAI-compatible and provider-specific APIs" + homepage "https://github.com/router-for-me/CLIProxyAPI" + head "https://github.com/router-for-me/CLIProxyAPI.git", branch: "main" + + depends_on "go" => :build + + def install + system "go", "build", "-o", bin/"cliproxyapi++", "./cmd/server" + end + + service do + run [opt_bin/"cliproxyapi++", "--config", etc/"cliproxyapi/config.yaml"] + working_dir var/"log/cliproxyapi" + keep_alive true + log_path var/"log/cliproxyapi-plusplus.log" + error_log_path var/"log/cliproxyapi-plusplus.err" + end + + def post_install + (etc/"cliproxyapi").mkpath + end + + test do + assert_predicate bin/"cliproxyapi++", :exist? + end +end diff --git a/scripts/service b/scripts/service new file mode 100755 index 0000000000..400efdfcb7 --- /dev/null +++ b/scripts/service @@ -0,0 +1,232 @@ +#!/usr/bin/env bash +set -euo pipefail + +IFS=$'\n\t' + +SERVICE_NAME="cliproxyapi-plusplus" +SERVICE_LABEL="com.router-for-me.cliproxyapi-plusplus" +SYSTEMD_UNIT="$SERVICE_NAME.service" +SYSTEMD_DEST="/etc/systemd/system" +SYSTEMD_ENV="/etc/default/cliproxyapi" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +LAUNCHD_SOURCE="$REPO_ROOT/examples/launchd/$SERVICE_LABEL.plist" +SYSTEMD_SOURCE="$REPO_ROOT/examples/systemd/$SYSTEMD_UNIT" +SYSTEMD_ENV_SOURCE="$REPO_ROOT/examples/systemd/cliproxyapi-plusplus.env" + +usage() { + cat <<'USAGE' +Usage: + ./scripts/service [--config PATH] + +Actions: + install register service files and enable on boot + remove disable and remove service files + start start service now + stop stop service now + restart stop then start + status show service status + +Options: + --config PATH only used for macOS launchd fallback +USAGE +} + +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +ensure_root() { + if [ "$(id -u)" -ne 0 ]; then + echo "This action requires root on Linux. Re-run with sudo." + exit 1 + fi +} + +has_brew_formula() { + command_exists brew && brew list --formula | grep -qx "cliproxyapi-plusplus" +} + +install_macos() { + local cfg="${1:-/opt/homebrew/etc/cliproxyapi/config.yaml}" + + if has_brew_formula; then + brew services start cliproxyapi-plusplus + return 0 + fi + + if ! command_exists launchctl || ! command_exists sed; then + echo "launchctl and sed are required for fallback launchd setup" + exit 1 + fi + + local prefix + local plist_dest="$HOME/Library/LaunchAgents/$SERVICE_LABEL.plist" + prefix="$(command_exists brew && brew --prefix || echo /opt/homebrew)" + mkdir -p "$HOME/Library/LaunchAgents" + sed -e "s#/opt/homebrew#$prefix#g" \ + -e "s#/opt/homebrew/etc/cliproxyapi/config.yaml#$cfg#g" \ + "$LAUNCHD_SOURCE" > "$plist_dest" + launchctl bootstrap "gui/$(id -u)" "$plist_dest" +} + +remove_macos() { + if has_brew_formula; then + brew services stop cliproxyapi-plusplus + brew services uninstall cliproxyapi-plusplus || true + return 0 + fi + + if command_exists launchctl; then + launchctl bootout "gui/$(id -u)" "$SERVICE_LABEL" || true + fi + rm -f "$HOME/Library/LaunchAgents/$SERVICE_LABEL.plist" +} + +start_macos() { + if has_brew_formula; then + brew services start cliproxyapi-plusplus + return 0 + fi + + if command_exists launchctl; then + launchctl kickstart -k "gui/$(id -u)/$SERVICE_LABEL" + fi +} + +stop_macos() { + if has_brew_formula; then + brew services stop cliproxyapi-plusplus + return 0 + fi + + if command_exists launchctl; then + launchctl stop "$SERVICE_LABEL" + fi +} + +status_macos() { + if has_brew_formula; then + brew services list | grep "cliproxyapi-plusplus" + return 0 + fi + + if command_exists launchctl; then + launchctl print "gui/$(id -u)/$SERVICE_LABEL" || true + fi +} + +install_linux() { + ensure_root + + if ! command_exists systemctl; then + echo "systemctl not available" + exit 1 + fi + if [ ! -f "$SYSTEMD_SOURCE" ]; then + echo "systemd unit template missing: $SYSTEMD_SOURCE" + exit 1 + fi + + mkdir -p "$SYSTEMD_DEST" + cp "$SYSTEMD_SOURCE" "$SYSTEMD_DEST/$SYSTEMD_UNIT" + if [ -f "$SYSTEMD_ENV_SOURCE" ]; then + mkdir -p /etc/default + cp "$SYSTEMD_ENV_SOURCE" "$SYSTEMD_ENV" + fi + systemctl daemon-reload + systemctl enable "$SYSTEMD_UNIT" +} + +remove_linux() { + ensure_root + + if ! command_exists systemctl; then + echo "systemctl not available" + exit 1 + fi + + systemctl disable "$SYSTEMD_UNIT" || true + systemctl stop "$SYSTEMD_UNIT" || true + rm -f "$SYSTEMD_DEST/$SYSTEMD_UNIT" "$SYSTEMD_ENV" + systemctl daemon-reload +} + +start_linux() { + ensure_root + systemctl start "$SYSTEMD_UNIT" +} + +stop_linux() { + ensure_root + systemctl stop "$SYSTEMD_UNIT" +} + +status_linux() { + if ! command_exists systemctl; then + echo "systemctl not available" + exit 1 + fi + systemctl status "$SYSTEMD_UNIT" --no-pager +} + +main() { + local action="${1:-}" + local config_path="/opt/homebrew/etc/cliproxyapi/config.yaml" + shift || true + + while [ "$#" -gt 0 ]; do + case "$1" in + --config) + config_path="${2:-}" + shift 2 + ;; + -h|--help) + usage + return 0 + ;; + *) + echo "Unknown option: $1" + usage + return 1 + ;; + esac + done + + if [ -z "$action" ] || [ "$action" = "--help" ] || [ "$action" = "-h" ]; then + usage + return 0 + fi + + case "$(uname -s)" in + Darwin) + case "$action" in + install) install_macos "$config_path" ;; + remove|uninstall) remove_macos ;; + start) start_macos ;; + stop) stop_macos ;; + restart) stop_macos; start_macos ;; + status) status_macos ;; + *) usage; exit 1 ;; + esac + ;; + Linux) + case "$action" in + install) install_linux ;; + remove|uninstall) remove_linux ;; + start) start_linux ;; + stop) stop_linux ;; + restart) stop_linux; start_linux ;; + status) status_linux ;; + *) usage; exit 1 ;; + esac + ;; + *) + echo "Unsupported OS: $(uname -s)" + exit 1 + ;; + esac +} + +main "$@" From 75eac69693b5a7083504d9ba11621e3afadee6fe Mon Sep 17 00:00:00 2001 From: Koosha Paridehpour Date: Thu, 26 Feb 2026 11:41:44 -0700 Subject: [PATCH 4/9] fix(auth): align codex auth import types for sdk build Co-authored-by: Codex --- sdk/auth/codex.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/auth/codex.go b/sdk/auth/codex.go index 83bb49667e..cdf99182fa 100644 --- a/sdk/auth/codex.go +++ b/sdk/auth/codex.go @@ -7,7 +7,7 @@ import ( "strings" "time" - "github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/auth/codex" + "github.com/router-for-me/CLIProxyAPI/v6/internal/auth/codex" "github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/browser" // legacy client removed "github.com/router-for-me/CLIProxyAPI/v6/internal/config" From 41926838eac185a2f01ba4b33038d40ee75aa5a7 Mon Sep 17 00:00:00 2001 From: Koosha Paridehpour Date: Thu, 26 Feb 2026 11:53:48 -0700 Subject: [PATCH 5/9] fix(auth): use internal codex auth packages in sdk login flow Co-authored-by: Codex --- sdk/auth/codex.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/auth/codex.go b/sdk/auth/codex.go index cdf99182fa..7b274233a6 100644 --- a/sdk/auth/codex.go +++ b/sdk/auth/codex.go @@ -11,8 +11,8 @@ import ( "github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/browser" // legacy client removed "github.com/router-for-me/CLIProxyAPI/v6/internal/config" - "github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/misc" - "github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/util" + "github.com/router-for-me/CLIProxyAPI/v6/internal/misc" + "github.com/router-for-me/CLIProxyAPI/v6/internal/util" coreauth "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/auth" log "github.com/sirupsen/logrus" ) From 0d866c967af2116f481d151bb15997604bbf3b1b Mon Sep 17 00:00:00 2001 From: Koosha Paridehpour Date: Thu, 26 Feb 2026 12:00:14 -0700 Subject: [PATCH 6/9] fix(auth): align codex device flow package with sdk login path Co-authored-by: Codex --- sdk/auth/codex_device.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/auth/codex_device.go b/sdk/auth/codex_device.go index 78a95af801..1944d27adc 100644 --- a/sdk/auth/codex_device.go +++ b/sdk/auth/codex_device.go @@ -13,7 +13,7 @@ import ( "strings" "time" - "github.com/router-for-me/CLIProxyAPI/v6/internal/auth/codex" + "github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/auth/codex" "github.com/router-for-me/CLIProxyAPI/v6/internal/browser" "github.com/router-for-me/CLIProxyAPI/v6/internal/config" "github.com/router-for-me/CLIProxyAPI/v6/internal/util" From 42e51bfe77bf488da9d636073894f4aed7f69937 Mon Sep 17 00:00:00 2001 From: Koosha Paridehpour Date: Thu, 26 Feb 2026 14:45:19 -0700 Subject: [PATCH 7/9] chore(repo): ignore local worktrees and build artifacts Ignore local worktree and binary artifact paths to reduce untracked noise.\n\nCo-authored-by: Codex --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index feda9dbf43..c18443cf39 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ cli-proxy-api cliproxy *.exe +cli-proxy-api-plus +server # Configuration @@ -53,3 +55,4 @@ _bmad-output/* .DS_Store ._* *.bak +PROJECT-wtrees/ From c1e01ce0a2f55c25f652c2a34b729b704f22304f Mon Sep 17 00:00:00 2001 From: Koosha Paridehpour Date: Thu, 26 Feb 2026 14:47:12 -0700 Subject: [PATCH 8/9] fix(auth): align codex sdk import types Use the llmproxy codex auth package in both login paths so buildAuthRecord receives consistent types.\n\nCo-authored-by: Codex --- sdk/auth/codex.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/auth/codex.go b/sdk/auth/codex.go index 7b274233a6..c95a40cf23 100644 --- a/sdk/auth/codex.go +++ b/sdk/auth/codex.go @@ -7,8 +7,8 @@ import ( "strings" "time" - "github.com/router-for-me/CLIProxyAPI/v6/internal/auth/codex" "github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/browser" + "github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/auth/codex" // legacy client removed "github.com/router-for-me/CLIProxyAPI/v6/internal/config" "github.com/router-for-me/CLIProxyAPI/v6/internal/misc" From 8e043e900765953a0c3256d8cbebac09a75934b5 Mon Sep 17 00:00:00 2001 From: Koosha Paridehpour Date: Thu, 26 Feb 2026 14:48:03 -0700 Subject: [PATCH 9/9] fix(ci): sync required checks manifest with workflows Align required check manifest entries to the currently defined workflow job names to prevent false guard failures.\n\nCo-authored-by: Codex --- .github/required-checks.txt | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/.github/required-checks.txt b/.github/required-checks.txt index c9cbf6eab7..17aa1b589b 100644 --- a/.github/required-checks.txt +++ b/.github/required-checks.txt @@ -1,16 +1,3 @@ # workflow_file|job_name -pr-test-build.yml|go-ci -pr-test-build.yml|quality-ci -pr-test-build.yml|quality-staged-check -pr-test-build.yml|fmt-check -pr-test-build.yml|golangci-lint -pr-test-build.yml|route-lifecycle -pr-test-build.yml|provider-smoke-matrix -pr-test-build.yml|provider-smoke-matrix-cheapest -pr-test-build.yml|test-smoke -pr-test-build.yml|pre-release-config-compat-smoke -pr-test-build.yml|distributed-critical-paths -pr-test-build.yml|changelog-scope-classifier -pr-test-build.yml|docs-build -pr-test-build.yml|ci-summary +pr-test-build.yml|build pr-path-guard.yml|ensure-no-translator-changes