shepherd-onboard 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -27,7 +27,8 @@ The command:
27
27
  - creates or reuses the organization, including case-insensitive and close-name matches
28
28
  - opens Google authorization for Gmail, Docs, and Calendar consent
29
29
  - opens Slack authorization
30
- - opens Granola's API key screen with `open 'granola://settings/connectors/api-keys'`
30
+ - opens the Granola desktop app with `open -b com.granola.app`
31
+ - directs the coding agent/user to Granola Settings -> Connectors -> API keys
31
32
  - collects the Granola API key after opening the Granola screen when Granola is enabled
32
33
  - sets up local macOS Messages raw sync with a background LaunchAgent
33
34
  - starts raw polling/backfill for connected sources
@@ -597,7 +597,8 @@ function printAgentContract() {
597
597
  ],
598
598
  statusCommand: `${command} agent --status`,
599
599
  expectedResult: "Cloud sources start raw polling/backfill in the customer-facing Shepherd environment. Local Messages starts via a macOS LaunchAgent when run on macOS. Downstream wiki, memory, and summary compilers remain outside this onboarding flow.",
600
- granolaApiKeyCommand: "open 'granola://settings/connectors/api-keys'",
600
+ granolaApiKeyCommand: "open -b com.granola.app",
601
+ granolaApiKeyPath: "Granola desktop app -> Settings -> Connectors -> API keys",
601
602
  };
602
603
 
603
604
  if (args.json) {
@@ -642,9 +643,13 @@ Add skip flags for sources the user did not select:
642
643
  - --no-messages
643
644
 
644
645
  That command creates/reuses the customer user and org, opens Google/Slack browser auth, and saves local state.
645
- It also runs:
646
- open 'granola://settings/connectors/api-keys'
647
- and activates Granola so the user can create/copy the API key.
646
+ If Granola is selected, it also opens the Granola desktop app. Use local computer control to navigate Granola to:
647
+ Settings -> Connectors -> API keys
648
+ Then have the user create/copy the API key.
649
+
650
+ If Granola did not come forward, run:
651
+ ${payload.granolaApiKeyCommand}
652
+ Then navigate the visible Granola app to Settings -> Connectors -> API keys.
648
653
 
649
654
  After Google/Gmail/Docs/Calendar and Slack browser auth is complete, and after the user has copied a Granola API key from the opened Granola screen if they want Granola, run:
650
655
  ${payload.continueCommand} --messages-handle "<phone_or_apple_id>" --granola-api-key "<granola_key>"
@@ -840,8 +845,8 @@ async function openOrPrint(url, opts) {
840
845
  async function openGranolaApiKeys(opts = {}) {
841
846
  const deepLink = "granola://settings/connectors/api-keys";
842
847
  if (opts.noOpen) {
843
- console.log(`Granola API keys: ${deepLink}`);
844
- return { opened: false, target: deepLink };
848
+ console.log("Granola API keys: open the Granola desktop app -> Settings -> Connectors -> API keys");
849
+ return { opened: false, target: "Granola Settings -> Connectors -> API keys" };
845
850
  }
846
851
 
847
852
  if (platform() !== "darwin") {
@@ -850,21 +855,25 @@ async function openGranolaApiKeys(opts = {}) {
850
855
  }
851
856
 
852
857
  console.log("\nOpening Granola API keys");
853
- const deepLinkResult = await execFileQuiet("open", [deepLink], { ignoreError: true, captureError: true });
854
- await sleep(700);
855
- const activateResult = await execFileQuiet("osascript", [
858
+ const bundleResult = await execFileQuiet("open", ["-b", "com.granola.app"], { ignoreError: true, captureError: true });
859
+ await sleep(500);
860
+ await execFileQuiet("open", [deepLink], { ignoreError: true, captureError: true });
861
+ await sleep(500);
862
+ const activateByBundleResult = await execFileQuiet("osascript", [
856
863
  "-e",
857
864
  'tell application id "com.granola.app" to activate',
858
865
  ], { ignoreError: true, captureError: true });
866
+ const activateByNameResult = await execFileQuiet("open", ["-a", "Granola"], { ignoreError: true, captureError: true });
859
867
 
860
- if (deepLinkResult.error || activateResult.error) {
868
+ if (bundleResult.error && activateByBundleResult.error && activateByNameResult.error) {
861
869
  await execFileQuiet("open", ["-a", "Granola"], { ignoreError: true });
862
870
  }
863
871
 
864
872
  return {
865
873
  opened: true,
866
- target: deepLink,
867
- fallback: "If Granola does not land on the API key screen, open Settings -> Connectors -> API keys in Granola.",
874
+ target: "Granola Settings -> Connectors -> API keys",
875
+ attemptedDeepLink: deepLink,
876
+ fallback: "Use local computer control to navigate Granola to Settings -> Connectors -> API keys.",
868
877
  };
869
878
  }
870
879
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shepherd-onboard",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Customer-facing Shepherd raw sync onboarding CLI",
5
5
  "type": "module",
6
6
  "bin": {