@orderful/droid 0.41.0 → 0.42.0

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.
Files changed (31) hide show
  1. package/.claude-plugin/plugin.json +2 -0
  2. package/CHANGELOG.md +19 -0
  3. package/dist/bin/droid.js +132 -4
  4. package/dist/commands/integrations.d.ts.map +1 -1
  5. package/dist/commands/tui/components/IntegrationsDetails.d.ts.map +1 -1
  6. package/dist/commands/tui.d.ts.map +1 -1
  7. package/dist/integrations/github/index.d.ts +6 -0
  8. package/dist/integrations/github/index.d.ts.map +1 -0
  9. package/dist/integrations/github/index.ts +17 -0
  10. package/dist/integrations/github/references/setup.md +61 -0
  11. package/dist/integrations/granola/references/setup.md +54 -0
  12. package/dist/lib/types.d.ts +8 -0
  13. package/dist/lib/types.d.ts.map +1 -1
  14. package/dist/tools/meeting/.claude-plugin/plugin.json +22 -0
  15. package/dist/tools/meeting/TOOL.yaml +15 -0
  16. package/dist/tools/meeting/commands/meeting.md +35 -0
  17. package/dist/tools/meeting/skills/meeting/SKILL.md +105 -0
  18. package/dist/tools/meeting/skills/meeting/references/export-workflow.md +87 -0
  19. package/package.json +1 -1
  20. package/src/commands/integrations.ts +30 -0
  21. package/src/commands/tui/components/IntegrationsDetails.tsx +114 -0
  22. package/src/commands/tui.tsx +26 -4
  23. package/src/integrations/github/index.ts +17 -0
  24. package/src/integrations/github/references/setup.md +61 -0
  25. package/src/integrations/granola/references/setup.md +54 -0
  26. package/src/lib/types.ts +10 -0
  27. package/src/tools/meeting/.claude-plugin/plugin.json +22 -0
  28. package/src/tools/meeting/TOOL.yaml +15 -0
  29. package/src/tools/meeting/commands/meeting.md +35 -0
  30. package/src/tools/meeting/skills/meeting/SKILL.md +105 -0
  31. package/src/tools/meeting/skills/meeting/references/export-workflow.md +87 -0
@@ -22,6 +22,7 @@
22
22
  "./src/tools/comments/skills/comments/SKILL.md",
23
23
  "./src/tools/droid/skills/droid/SKILL.md",
24
24
  "./src/tools/droid/skills/droid-bootstrap/SKILL.md",
25
+ "./src/tools/meeting/skills/meeting/SKILL.md",
25
26
  "./src/tools/plan/skills/plan/SKILL.md",
26
27
  "./src/tools/project/skills/project/SKILL.md",
27
28
  "./src/tools/share/skills/share/SKILL.md",
@@ -36,6 +37,7 @@
36
37
  "./src/tools/codex/commands/codex.md",
37
38
  "./src/tools/comments/commands/comments.md",
38
39
  "./src/tools/droid/commands/setup.md",
40
+ "./src/tools/meeting/commands/meeting.md",
39
41
  "./src/tools/plan/commands/plan.md",
40
42
  "./src/tools/project/commands/project.md",
41
43
  "./src/tools/share/commands/share.md",
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @orderful/droid
2
2
 
3
+ ## 0.42.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#250](https://github.com/Orderful/droid/pull/250) [`e92ed07`](https://github.com/Orderful/droid/commit/e92ed07c9c0f311b6bc39f506c5c8d36b44d9115) Thanks [@frytyler](https://github.com/frytyler)! - Add GitHub CLI (gh) integration to TUI and CLI status
8
+
9
+ - [#252](https://github.com/Orderful/droid/pull/252) [`4e24ce4`](https://github.com/Orderful/droid/commit/4e24ce4423fb3abdc1dc4607d89f13c638422308) Thanks [@frytyler](https://github.com/frytyler)! - Add Granola integration to TUI and `droid integrations status`, with setup guide docs.
10
+
11
+ - [#253](https://github.com/Orderful/droid/pull/253) [`b7b2e85`](https://github.com/Orderful/droid/commit/b7b2e85c6d73a932a5da40feadbc55f45f9d9602) Thanks [@frytyler](https://github.com/frytyler)! - Add meeting tool for working with meeting notes, summaries, and transcripts via Granola MCP.
12
+
13
+ New `/meeting` skill and command with support for:
14
+ - Listing recent meetings by time range
15
+ - Natural language search across meeting content
16
+ - Quick summaries (Granola) and context-aware summaries (transcript + project context)
17
+ - Exporting meetings to codex with source-neutral frontmatter
18
+ - Pulling decisions and action items from recent meetings
19
+
20
+ Includes Granola as a new integration with TUI status display and setup guide.
21
+
3
22
  ## 0.41.0
4
23
 
5
24
  ### Minor Changes
package/dist/bin/droid.js CHANGED
@@ -2533,7 +2533,7 @@ async function updateCommand(tool, options) {
2533
2533
  import { render, Box as Box16, Text as Text17, useInput as useInput9, useApp as useApp2 } from "ink";
2534
2534
  import { useState as useState10, useEffect } from "react";
2535
2535
  import { readFileSync as readFileSync9 } from "fs";
2536
- import { spawnSync as spawnSync3 } from "child_process";
2536
+ import { spawnSync as spawnSync4 } from "child_process";
2537
2537
  import { join as join11, dirname as dirname7 } from "path";
2538
2538
  import { fileURLToPath as fileURLToPath5 } from "url";
2539
2539
 
@@ -2915,6 +2915,74 @@ function AtlassianDetails({ isFocused, selectedAction, connected }) {
2915
2915
  !isFocused && /* @__PURE__ */ jsx6(Box6, { marginTop: 2, children: /* @__PURE__ */ jsx6(Text6, { color: colors.textDim, children: "press enter for options" }) })
2916
2916
  ] });
2917
2917
  }
2918
+ function GithubDetails({ isFocused, selectedAction, connected }) {
2919
+ return /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", paddingLeft: 2, flexGrow: 1, children: [
2920
+ /* @__PURE__ */ jsx6(Text6, { color: colors.text, bold: true, children: "GitHub CLI" }),
2921
+ /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", marginTop: 1, children: [
2922
+ /* @__PURE__ */ jsx6(Text6, { color: colors.textDim, bold: true, children: "Status" }),
2923
+ /* @__PURE__ */ jsxs6(Text6, { children: [
2924
+ /* @__PURE__ */ jsx6(Text6, { color: colors.textDim, children: " CLI " }),
2925
+ connected ? /* @__PURE__ */ jsx6(Text6, { color: colors.success, children: "Installed \u2713" }) : /* @__PURE__ */ jsx6(Text6, { color: "#fbbf24", children: "Not detected" })
2926
+ ] }),
2927
+ /* @__PURE__ */ jsxs6(Text6, { children: [
2928
+ /* @__PURE__ */ jsx6(Text6, { color: colors.textDim, children: " Auth " }),
2929
+ connected ? /* @__PURE__ */ jsx6(Text6, { color: colors.success, children: "Authenticated \u2713" }) : /* @__PURE__ */ jsx6(Text6, { color: "#fbbf24", children: "Not yet verified" })
2930
+ ] })
2931
+ ] }),
2932
+ /* @__PURE__ */ jsx6(Box6, { flexDirection: "column", marginTop: 1, children: /* @__PURE__ */ jsx6(Text6, { color: colors.textDim, children: connected ? "Used by codex, tech-design, code-review, share" : "Run `gh auth login` to connect" }) }),
2933
+ isFocused && /* @__PURE__ */ jsx6(Box6, { marginTop: 2, flexDirection: "row", gap: 2, children: /* @__PURE__ */ jsxs6(
2934
+ Text6,
2935
+ {
2936
+ backgroundColor: selectedAction === 0 ? colors.primary : void 0,
2937
+ color: selectedAction === 0 ? "#ffffff" : colors.textDim,
2938
+ bold: selectedAction === 0,
2939
+ children: [
2940
+ " ",
2941
+ "Setup Guide",
2942
+ " "
2943
+ ]
2944
+ }
2945
+ ) }),
2946
+ isFocused && /* @__PURE__ */ jsx6(Box6, { marginTop: 1, children: /* @__PURE__ */ jsxs6(Text6, { color: colors.textDim, children: [
2947
+ "enter confirm ",
2948
+ "\xB7",
2949
+ " esc back"
2950
+ ] }) }),
2951
+ !isFocused && /* @__PURE__ */ jsx6(Box6, { marginTop: 2, children: /* @__PURE__ */ jsx6(Text6, { color: colors.textDim, children: "press enter for options" }) })
2952
+ ] });
2953
+ }
2954
+ function GranolaDetails({ isFocused, selectedAction, connected }) {
2955
+ return /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", paddingLeft: 2, flexGrow: 1, children: [
2956
+ /* @__PURE__ */ jsx6(Text6, { color: colors.text, bold: true, children: "Granola" }),
2957
+ /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", marginTop: 1, children: [
2958
+ /* @__PURE__ */ jsx6(Text6, { color: colors.textDim, bold: true, children: "MCP Server" }),
2959
+ /* @__PURE__ */ jsxs6(Text6, { children: [
2960
+ /* @__PURE__ */ jsx6(Text6, { color: colors.textDim, children: " Status " }),
2961
+ connected ? /* @__PURE__ */ jsx6(Text6, { color: colors.success, children: "Connected \u2713" }) : /* @__PURE__ */ jsx6(Text6, { color: "#fbbf24", children: "Not yet verified" })
2962
+ ] })
2963
+ ] }),
2964
+ /* @__PURE__ */ jsx6(Box6, { flexDirection: "column", marginTop: 1, children: /* @__PURE__ */ jsx6(Text6, { color: colors.textDim, children: connected ? "Meeting notes and transcripts available via MCP" : "Use /mcp to add the Granola server" }) }),
2965
+ isFocused && /* @__PURE__ */ jsx6(Box6, { marginTop: 2, flexDirection: "row", gap: 2, children: /* @__PURE__ */ jsxs6(
2966
+ Text6,
2967
+ {
2968
+ backgroundColor: selectedAction === 0 ? colors.primary : void 0,
2969
+ color: selectedAction === 0 ? "#ffffff" : colors.textDim,
2970
+ bold: selectedAction === 0,
2971
+ children: [
2972
+ " ",
2973
+ "Setup Guide",
2974
+ " "
2975
+ ]
2976
+ }
2977
+ ) }),
2978
+ isFocused && /* @__PURE__ */ jsx6(Box6, { marginTop: 1, children: /* @__PURE__ */ jsxs6(Text6, { color: colors.textDim, children: [
2979
+ "enter confirm ",
2980
+ "\xB7",
2981
+ " esc back"
2982
+ ] }) }),
2983
+ !isFocused && /* @__PURE__ */ jsx6(Box6, { marginTop: 2, children: /* @__PURE__ */ jsx6(Text6, { color: colors.textDim, children: "press enter for options" }) })
2984
+ ] });
2985
+ }
2918
2986
  function IntegrationsDetails({
2919
2987
  isFocused,
2920
2988
  selectedAction,
@@ -2923,6 +2991,12 @@ function IntegrationsDetails({
2923
2991
  if (integration.id === "atlassian") {
2924
2992
  return /* @__PURE__ */ jsx6(AtlassianDetails, { isFocused, selectedAction, connected: integration.connected });
2925
2993
  }
2994
+ if (integration.id === "github") {
2995
+ return /* @__PURE__ */ jsx6(GithubDetails, { isFocused, selectedAction, connected: integration.connected });
2996
+ }
2997
+ if (integration.id === "granola") {
2998
+ return /* @__PURE__ */ jsx6(GranolaDetails, { isFocused, selectedAction, connected: integration.connected });
2999
+ }
2926
3000
  return /* @__PURE__ */ jsx6(SlackDetails, { isFocused, selectedAction });
2927
3001
  }
2928
3002
 
@@ -4282,10 +4356,30 @@ function useToolUpdates({ onUpdateComplete }) {
4282
4356
  };
4283
4357
  }
4284
4358
 
4359
+ // src/integrations/github/index.ts
4360
+ import { spawnSync as spawnSync3 } from "child_process";
4361
+ function checkGhAuth() {
4362
+ try {
4363
+ const result = spawnSync3("gh", ["auth", "status"], {
4364
+ stdio: "ignore",
4365
+ timeout: 5e3
4366
+ });
4367
+ return result.status === 0;
4368
+ } catch {
4369
+ return false;
4370
+ }
4371
+ }
4372
+
4285
4373
  // src/commands/tui.tsx
4286
4374
  import { Fragment as Fragment2, jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
4287
4375
  var exitMessage = null;
4288
4376
  var exitCommand = null;
4377
+ var INTEGRATION_GUIDE_TITLES = {
4378
+ slack: "Slack Integration Setup",
4379
+ atlassian: "Atlassian Integration Setup",
4380
+ github: "GitHub CLI Setup",
4381
+ granola: "Granola Integration Setup"
4382
+ };
4289
4383
  var __tui_dirname = dirname7(fileURLToPath5(import.meta.url));
4290
4384
  var INTEGRATIONS_DIR = join11(__tui_dirname, "../integrations");
4291
4385
  function loadIntegrationReference(integration, filename) {
@@ -4383,8 +4477,18 @@ function App() {
4383
4477
  const skills = getBundledSkills();
4384
4478
  const integrations2 = [
4385
4479
  { id: "slack", name: "Slack", connected: !!process.env.SLACK_USER_TOKEN },
4386
- { id: "atlassian", name: "Atlassian", connected: !!getConfigValue("integrations.atlassian.configured") }
4480
+ { id: "atlassian", name: "Atlassian", connected: !!getConfigValue("integrations.atlassian.configured") },
4481
+ { id: "github", name: "GitHub", connected: !!getConfigValue("integrations.github.configured") },
4482
+ { id: "granola", name: "Granola", connected: !!getConfigValue("integrations.granola.configured") }
4387
4483
  ];
4484
+ useEffect(() => {
4485
+ if (!getConfigValue("integrations.github.configured")) {
4486
+ const isAuthed = checkGhAuth();
4487
+ if (isAuthed) {
4488
+ setConfigValue("integrations.github.configured", true);
4489
+ }
4490
+ }
4491
+ }, []);
4388
4492
  useInput9(
4389
4493
  (input, key) => {
4390
4494
  if (message) setMessage(null);
@@ -4454,6 +4558,10 @@ function App() {
4454
4558
  ];
4455
4559
  } else if (currentIntegration?.id === "atlassian") {
4456
4560
  intActions = [{ id: "guide" }];
4561
+ } else if (currentIntegration?.id === "github") {
4562
+ intActions = [{ id: "guide" }];
4563
+ } else if (currentIntegration?.id === "granola") {
4564
+ intActions = [{ id: "guide" }];
4457
4565
  }
4458
4566
  const maxIntAction = intActions.length - 1;
4459
4567
  if (key.leftArrow) {
@@ -4469,7 +4577,7 @@ function App() {
4469
4577
  exit();
4470
4578
  } else if (actionId === "guide") {
4471
4579
  const integrationId = currentIntegration?.id ?? "slack";
4472
- const guideTitle = currentIntegration?.id === "atlassian" ? "Atlassian Integration Setup" : "Slack Integration Setup";
4580
+ const guideTitle = INTEGRATION_GUIDE_TITLES[integrationId] ?? `${currentIntegration?.name} Setup`;
4473
4581
  const content = loadIntegrationReference(integrationId, "setup.md");
4474
4582
  if (content) {
4475
4583
  setPreviousView("detail");
@@ -4810,7 +4918,7 @@ async function tuiCommand() {
4810
4918
  if (exitCommand) {
4811
4919
  const [cmd, ...args] = exitCommand;
4812
4920
  exitCommand = null;
4813
- spawnSync3(cmd, args, { stdio: "inherit" });
4921
+ spawnSync4(cmd, args, { stdio: "inherit" });
4814
4922
  return;
4815
4923
  }
4816
4924
  if (exitMessage) {
@@ -5406,6 +5514,26 @@ async function integrationsStatusCommand() {
5406
5514
  console.log(chalk11.gray(" Use /share confluence to verify, or see setup guide"));
5407
5515
  }
5408
5516
  console.log("");
5517
+ console.log(chalk11.bold(" GitHub"));
5518
+ const githubConfigured = getConfigValue("integrations.github.configured");
5519
+ if (githubConfigured) {
5520
+ console.log(chalk11.green(" CLI: Installed"));
5521
+ console.log(chalk11.green(" Status: configured"));
5522
+ } else {
5523
+ console.log(chalk11.yellow(" CLI: Not verified"));
5524
+ console.log(chalk11.gray(" Run: gh auth login"));
5525
+ }
5526
+ console.log("");
5527
+ console.log(chalk11.bold(" Granola"));
5528
+ const granolaConfigured = getConfigValue("integrations.granola.configured");
5529
+ if (granolaConfigured) {
5530
+ console.log(chalk11.green(" MCP: Connected"));
5531
+ console.log(chalk11.green(" Status: configured"));
5532
+ } else {
5533
+ console.log(chalk11.yellow(" MCP: Not yet verified"));
5534
+ console.log(chalk11.gray(" Use /mcp to add the Granola server, then verify with a meeting query"));
5535
+ }
5536
+ console.log("");
5409
5537
  }
5410
5538
  async function slackPostCommand(options) {
5411
5539
  let input;
@@ -1 +1 @@
1
- {"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../src/commands/integrations.ts"],"names":[],"mappings":"AAoNA,wBAAsB,6BAA6B,IAAI,OAAO,CAAC,IAAI,CAAC,CAuInE;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoD/D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCnF"}
1
+ {"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../src/commands/integrations.ts"],"names":[],"mappings":"AAoNA,wBAAsB,6BAA6B,IAAI,OAAO,CAAC,IAAI,CAAC,CAuInE;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkF/D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCnF"}
@@ -1 +1 @@
1
- {"version":3,"file":"IntegrationsDetails.d.ts","sourceRoot":"","sources":["../../../../src/commands/tui/components/IntegrationsDetails.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAyID,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,cAAc,EACd,WAAW,GACZ,EAAE,wBAAwB,2CAO1B"}
1
+ {"version":3,"file":"IntegrationsDetails.d.ts","sourceRoot":"","sources":["../../../../src/commands/tui/components/IntegrationsDetails.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAmPD,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,cAAc,EACd,WAAW,GACZ,EAAE,wBAAwB,2CAe1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/commands/tui.tsx"],"names":[],"mappings":"AA4rBA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBhD"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/commands/tui.tsx"],"names":[],"mappings":"AAktBA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBhD"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Check if the GitHub CLI (gh) is installed and authenticated.
3
+ * Returns true if `gh auth status` exits with code 0.
4
+ */
5
+ export declare function checkGhAuth(): boolean;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/github/index.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAUrC"}
@@ -0,0 +1,17 @@
1
+ import { spawnSync } from 'child_process';
2
+
3
+ /**
4
+ * Check if the GitHub CLI (gh) is installed and authenticated.
5
+ * Returns true if `gh auth status` exits with code 0.
6
+ */
7
+ export function checkGhAuth(): boolean {
8
+ try {
9
+ const result = spawnSync('gh', ['auth', 'status'], {
10
+ stdio: 'ignore',
11
+ timeout: 5000,
12
+ });
13
+ return result.status === 0;
14
+ } catch {
15
+ return false;
16
+ }
17
+ }
@@ -0,0 +1,61 @@
1
+ # GitHub CLI Setup
2
+
3
+ ## Overview
4
+
5
+ The GitHub CLI (`gh`) integration connects droid to GitHub for PR creation, issue management, and repository operations. Several skills depend on it: **codex**, **tech-design**, **code-review**, and **share**.
6
+
7
+ ## Setup
8
+
9
+ ### 1. Install the GitHub CLI
10
+
11
+ ```bash
12
+ brew install gh
13
+ ```
14
+
15
+ ### 2. Authenticate
16
+
17
+ ```bash
18
+ gh auth login
19
+ ```
20
+
21
+ Follow the interactive prompts to authenticate with your GitHub account. Choose HTTPS as the preferred protocol.
22
+
23
+ ### 3. Verify
24
+
25
+ ```bash
26
+ gh auth status
27
+ ```
28
+
29
+ You should see your GitHub username and the scopes available. The TUI Integrations tab will show `GitHub ✓` once detection runs.
30
+
31
+ ## How It Works
32
+
33
+ Unlike Slack (which uses environment variables and OAuth) or Atlassian (which uses MCP), GitHub uses a locally installed CLI binary:
34
+
35
+ | Aspect | Slack | Atlassian | GitHub |
36
+ |--------|-------|-----------|--------|
37
+ | Auth method | OAuth + env vars | MCP server (managed by Claude Code) | `gh auth login` (local CLI) |
38
+ | Setup | `droid integrations setup slack` | `/mcp` in Claude Code | `brew install gh && gh auth login` |
39
+ | API access | `@slack/web-api` SDK | MCP tool calls (`mcp__claude_ai_Atlassian__*`) | `gh` CLI via Bash |
40
+ | Config flag | `integrations.slack.configured` | `integrations.atlassian.configured` | `integrations.github.configured` |
41
+
42
+ The `configured` flag is set automatically when the TUI detects a working `gh auth status` — no manual configuration needed.
43
+
44
+ ## Troubleshooting
45
+
46
+ | Issue | Resolution |
47
+ |-------|------------|
48
+ | `gh: command not found` | Install with `brew install gh` |
49
+ | Not authenticated | Run `gh auth login` and follow prompts |
50
+ | Wrong account | Run `gh auth logout` then `gh auth login` |
51
+ | Scopes missing | Run `gh auth refresh -s <scope>` to add scopes |
52
+ | "Not configured" in TUI | Relaunch the TUI — detection runs on startup |
53
+
54
+ ## Dependent Skills
55
+
56
+ These skills use `gh` and will fail without it:
57
+
58
+ - **codex** — Fetches PR metadata and diffs for context
59
+ - **tech-design** — Creates PRs for tech design documents
60
+ - **code-review** — Reads PR details, checks, and comments
61
+ - **share** — Creates PRs and interacts with GitHub APIs
@@ -0,0 +1,54 @@
1
+ # Granola Integration Setup
2
+
3
+ ## Overview
4
+
5
+ The Granola integration connects droid to your meeting notes, summaries, and transcripts through the Granola MCP server in Claude Code.
6
+
7
+ ## Setup
8
+
9
+ ### 1. Install Granola
10
+
11
+ Install and sign in to the Granola app first if you have not already.
12
+
13
+ ### 2. Add the Granola MCP Server
14
+
15
+ In Claude Code, run:
16
+
17
+ ```bash
18
+ /mcp
19
+ ```
20
+
21
+ Select **Granola** and complete the auth flow.
22
+
23
+ ### 3. Verify Connection
24
+
25
+ Ask Claude to list recent meetings. If successful, droid can use Granola MCP tools and the Integrations tab should show `Granola ✓`.
26
+
27
+ ## Available MCP Tools
28
+
29
+ Depending on your Granola MCP version, tools may include:
30
+
31
+ - `list_meetings`
32
+ - `get_meetings`
33
+ - `get_meeting_transcript`
34
+ - `query_granola_meetings`
35
+
36
+ ## How It Works
37
+
38
+ Granola follows the same integration model as Atlassian: MCP is managed by Claude Code, not by a local CLI.
39
+
40
+ | Aspect | Granola |
41
+ |--------|---------|
42
+ | Auth method | MCP server via Claude Code |
43
+ | Setup command | `/mcp` |
44
+ | Config flag | `integrations.granola.configured` |
45
+
46
+ No `droid integrations setup granola` command is required.
47
+
48
+ ## Troubleshooting
49
+
50
+ | Issue | Resolution |
51
+ |-------|------------|
52
+ | Granola not shown in `/mcp` | Update Claude Code and try again |
53
+ | Not connected in TUI | Re-run `/mcp` and verify with a meeting query |
54
+ | No meetings returned | Confirm the Granola app has synced meetings |
@@ -47,9 +47,17 @@ export interface IntegrationSlackConfig {
47
47
  export interface IntegrationAtlassianConfig {
48
48
  configured?: boolean;
49
49
  }
50
+ export interface IntegrationGithubConfig {
51
+ configured?: boolean;
52
+ }
53
+ export interface IntegrationGranolaConfig {
54
+ configured?: boolean;
55
+ }
50
56
  export interface IntegrationsConfig {
51
57
  slack?: IntegrationSlackConfig;
52
58
  atlassian?: IntegrationAtlassianConfig;
59
+ github?: IntegrationGithubConfig;
60
+ granola?: IntegrationGranolaConfig;
53
61
  }
54
62
  export interface DroidConfig {
55
63
  platform: Platform;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "droid-meeting",
3
+ "version": "0.1.0",
4
+ "description": "Work with meeting notes, summaries, and transcripts. List recent meetings, search content, generate context-aware summaries, export to codex. Backed by Granola MCP.",
5
+ "author": {
6
+ "name": "Orderful",
7
+ "url": "https://github.com/orderful"
8
+ },
9
+ "repository": "https://github.com/orderful/droid",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "droid",
13
+ "ai",
14
+ "meeting"
15
+ ],
16
+ "skills": [
17
+ "./skills/meeting/SKILL.md"
18
+ ],
19
+ "commands": [
20
+ "./commands/meeting.md"
21
+ ]
22
+ }
@@ -0,0 +1,15 @@
1
+ name: meeting
2
+ description: "Work with meeting notes, summaries, and transcripts. List recent meetings, search content, generate context-aware summaries, export to codex. Backed by Granola MCP."
3
+ version: 0.1.0
4
+ status: beta
5
+
6
+ includes:
7
+ skills:
8
+ - name: meeting
9
+ required: true
10
+ commands:
11
+ - name: meeting
12
+ is_alias: false
13
+ agents: []
14
+
15
+ dependencies: []
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: meeting
3
+ description: "Work with meeting notes, summaries, and transcripts"
4
+ argument-hint: "[search {query} | summary {title} | summarize {title} | export {title} | decisions | last week]"
5
+ ---
6
+
7
+ # /meeting
8
+
9
+ **User invoked:** `/meeting $ARGUMENTS`
10
+
11
+ **Your task:** Invoke the **meeting skill** with these arguments.
12
+
13
+ ## Examples
14
+
15
+ - `/meeting` → List recent meetings (this week)
16
+ - `/meeting last week` → List meetings from last week
17
+ - `/meeting search auth decisions` → Search meetings for auth-related decisions
18
+ - `/meeting summary standup` → Quick Granola summary of the standup
19
+ - `/meeting summarize tech design review` → Context-aware summary using transcript
20
+ - `/meeting export partner testing review` → Export meeting to codex
21
+ - `/meeting decisions` → Pull decisions from recent meetings
22
+
23
+ ## Quick Reference
24
+
25
+ ```
26
+ /meeting # List this week's meetings
27
+ /meeting last week # List last week's meetings
28
+ /meeting search {query} # Natural language search
29
+ /meeting summary {title} # Quick summary (Granola)
30
+ /meeting summarize {title} # Deep summary (transcript + context)
31
+ /meeting export {title} # Export to codex
32
+ /meeting decisions # Decisions from recent meetings
33
+ ```
34
+
35
+ See the **meeting skill** for complete documentation.
@@ -0,0 +1,105 @@
1
+ ---
2
+ name: meeting
3
+ description: "Work with meeting notes, summaries, and transcripts. Use when user asks about meetings, wants to review notes, search decisions, or export to codex. User prompts like 'what did we discuss today', 'summarise the tech design review', 'export my meeting with Thea to codex'."
4
+ argument-hint: "[search {query} | summary {title} | summarize {title} | export {title} | decisions | last week]"
5
+ allowed-tools: [Read, Write, Edit, Glob, Grep, Bash(droid:*)]
6
+ ---
7
+
8
+ # Meeting Skill
9
+
10
+ Work with meeting notes, summaries, and transcripts via Granola MCP.
11
+
12
+ ## When to Use
13
+
14
+ - User asks about what was discussed in a meeting
15
+ - User wants a summary of a specific meeting
16
+ - User wants to search across meeting content for decisions/action items
17
+ - User asks to export meeting notes to codex
18
+ - Natural language like "what did we decide in the partner testing review?", "summarise my meeting with Thea", "what were the action items from today?"
19
+
20
+ ## When NOT to Use
21
+
22
+ - Calendar scheduling or upcoming events (this is about past meeting content)
23
+ - User is explicitly asking for Granola app features (this skill does not control Granola)
24
+
25
+ ## Prerequisites
26
+
27
+ Check if Granola MCP is available. Run:
28
+
29
+ ```bash
30
+ droid config --get integrations.granola.configured
31
+ ```
32
+
33
+ If not configured, tell user:
34
+ > "Granola MCP is not connected. Run `/mcp` in Claude Code to add the Granola integration, then try again."
35
+
36
+ If connected, proceed.
37
+
38
+ ## Commands
39
+
40
+ | Command | Action |
41
+ |---------|--------|
42
+ | `/meeting` | List recent meetings (this week) |
43
+ | `/meeting last week` | List meetings from last week |
44
+ | `/meeting search {query}` | Natural language search across all meetings |
45
+ | `/meeting summary {title}` | Quick summary from Granola (fast, no context cost) |
46
+ | `/meeting summarize {title}` | Context-aware summary using transcript + loaded project/codex context |
47
+ | `/meeting export {title}` | Export meeting to codex |
48
+ | `/meeting decisions` | Pull decisions from recent meetings |
49
+
50
+ Natural language is the primary interface. Users should not need these commands. Recognise meeting intent and route accordingly:
51
+ - "what did Calvin say about Mosaic?" → search
52
+ - "summarise the partner testing review" → summary or summarize
53
+ - "export today's standup to codex" → export
54
+ - "what decisions were made this week?" → decisions
55
+
56
+ ## Procedures
57
+
58
+ ### List meetings (`/meeting`, `/meeting last week`)
59
+
60
+ 1. Use `ToolSearch` to load `mcp__granola__list_meetings`
61
+ 2. Call with `time_range`: `"this_week"` (default) or `"last_week"`
62
+ 3. Present results as a table: title, date, participants
63
+
64
+ ### Search (`/meeting search {query}`)
65
+
66
+ 1. Use `ToolSearch` to load `mcp__granola__query_granola_meetings`
67
+ 2. Call with user's query
68
+ 3. Preserve citation links in the response
69
+ 4. Present the response to the user
70
+
71
+ ### Quick summary (`/meeting summary {title}`)
72
+
73
+ 1. First, list recent meetings to find the meeting ID matching `{title}` (fuzzy match)
74
+ 2. Use `ToolSearch` to load `mcp__granola__get_meetings`
75
+ 3. Call with the meeting ID
76
+ 4. Present the structured summary to the user
77
+
78
+ ### Context-aware summary (`/meeting summarize {title}`)
79
+
80
+ 1. First, list recent meetings to find the meeting ID matching `{title}` (fuzzy match)
81
+ 2. Warn user: "This will load the full transcript into context. The meeting was ~{duration}. Proceed, or use `/meeting summary` for a quicker Granola summary?"
82
+ 3. If user confirms, use `ToolSearch` to load `mcp__granola__get_meeting_transcript`
83
+ 4. Call with the meeting ID
84
+ 5. Generate a summary that incorporates any loaded project context, codex knowledge, or brain docs
85
+ 6. Alternative: use the Task tool with a subagent to process the transcript in a separate context window, then return a summary
86
+
87
+ ### Decisions (`/meeting decisions`)
88
+
89
+ 1. Use `ToolSearch` to load `mcp__granola__query_granola_meetings`
90
+ 2. Call with query: "What decisions were made and what are the action items from recent meetings?"
91
+ 3. Preserve citation links in the response
92
+
93
+ ### Export (`/meeting export {title}`)
94
+
95
+ See `references/export-workflow.md` for the full procedure.
96
+
97
+ ## Error Handling
98
+
99
+ | Error | Action |
100
+ |-------|--------|
101
+ | Granola MCP not available | Suggest `/mcp` to connect Granola |
102
+ | No meetings found for time range | Suggest a different time range |
103
+ | Meeting title not found | Show recent meetings, ask user to pick |
104
+ | Transcript too large for context | Offer subagent approach or fall back to Granola summary |
105
+ | Codex not in current context (export) | Prompt for destination (see export workflow) |