@youdie006/prodex 0.16.4 → 0.16.5

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.
@@ -857,6 +857,13 @@ export function projectItemRectExpression(name) {
857
857
  }
858
858
  }
859
859
  if (!target) return { ok: false, reason: "project not found in sidebar" };
860
+ // 2026-07 ChatGPT update: the project row (li) is no longer a link - the
861
+ // navigation affordance is a dedicated "Open project home" button inside
862
+ // the row (verified live: clicking the row does nothing, clicking the home
863
+ // button navigates to /g/g-p-...). Prefer it; fall back to the row click
864
+ // for the old UI.
865
+ const home = target.querySelector('[aria-label*="project home" i],[aria-label*="프로젝트 홈"]');
866
+ if (home) return clickPoint(home);
860
867
  return clickPoint(target, 18);
861
868
  })()`;
862
869
  }
@@ -903,7 +910,11 @@ async function selectModelReasoning(cdp, options) {
903
910
  // Open the Pro sub-mode submenu via the chevron, then pick 기본/확장.
904
911
  const expander = await cdp.evaluate(proSubmenuExpanderRectExpression());
905
912
  if (!expander.ok || expander.x === undefined || expander.y === undefined) {
906
- throw new Error(expander.reason ?? "Could not open the ChatGPT Pro sub-mode submenu");
913
+ // The 2026-07 ChatGPT update removed the Pro sub-mode chevron from the
914
+ // model picker (verified live, including on hover) - Pro is a plain
915
+ // radio now. Name the change and the working alternative instead of a
916
+ // bare "expander not found".
917
+ throw new Error("The ChatGPT model menu no longer offers Pro sub-modes (the 2026-07 update removed the Pro submenu; Pro is a single mode now). Use --model Pro instead of --pro-mode. If ChatGPT restores sub-modes, update prodex (npm i -g @youdie006/prodex@latest).");
907
918
  }
908
919
  await verifiedClickAt(cdp, expander.x, expander.y, "Pro sub-mode expander");
909
920
  const subLabels = PRO_MODE_SUBMENU_LABELS[options.proMode];
@@ -1063,7 +1074,14 @@ async function selectProject(cdp, options) {
1063
1074
  await verifiedClickAt(cdp, hit.x, hit.y, `project ${options.project}`);
1064
1075
  const navigated = await waitForExpressionTrue(cdp, `location.href !== ${JSON.stringify(hrefBefore)}`, PROJECT_NAVIGATION_TIMEOUT_MS);
1065
1076
  if (!navigated) {
1066
- throw new Error(`Clicking project "${options.project}" did not navigate the visible tab. If the tab is already inside this project, omit --project and retry.`);
1077
+ // The href staying put is fine when the tab was ALREADY on this project's
1078
+ // home: the click landed on the requested row's own navigation control
1079
+ // (hover-verified above), so an unchanged project URL means "already
1080
+ // there", not a failed click.
1081
+ const alreadyInProject = await cdp.evaluate(`/^https:\\/\\/chatgpt\\.com\\/g\\/g-p-/.test(location.href)`);
1082
+ if (!alreadyInProject) {
1083
+ throw new Error(`Clicking project "${options.project}" did not navigate the visible tab. If the tab is already inside this project, omit --project and retry.`);
1084
+ }
1067
1085
  }
1068
1086
  const composerReady = await waitForExpressionTrue(cdp, `Boolean(document.querySelector('#prompt-textarea,[contenteditable="true"],textarea'))`, PROJECT_NAVIGATION_TIMEOUT_MS);
1069
1087
  if (!composerReady) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@youdie006/prodex",
3
- "version": "0.16.4",
3
+ "version": "0.16.5",
4
4
  "description": "Local receipt bus for coordinating Codex execution with ChatGPT Pro/Projects consultation.",
5
5
  "author": "youdie006",
6
6
  "license": "MIT",