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 +2 -1
- package/bin/shepherd-onboard.js +21 -12
- package/package.json +1 -1
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
|
|
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
|
package/bin/shepherd-onboard.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
646
|
-
|
|
647
|
-
|
|
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(
|
|
844
|
-
return { opened: false, target:
|
|
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
|
|
854
|
-
await sleep(
|
|
855
|
-
|
|
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 (
|
|
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:
|
|
867
|
-
|
|
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
|
|