@orderful/droid 0.41.0 → 0.42.1
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/.claude-plugin/plugin.json +2 -0
- package/CHANGELOG.md +25 -0
- package/dist/bin/droid.js +132 -4
- package/dist/commands/integrations.d.ts.map +1 -1
- package/dist/commands/tui/components/IntegrationsDetails.d.ts.map +1 -1
- package/dist/commands/tui.d.ts.map +1 -1
- package/dist/integrations/github/index.d.ts +6 -0
- package/dist/integrations/github/index.d.ts.map +1 -0
- package/dist/integrations/github/index.ts +17 -0
- package/dist/integrations/github/references/setup.md +61 -0
- package/dist/integrations/granola/references/setup.md +54 -0
- package/dist/lib/types.d.ts +8 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/tools/meeting/.claude-plugin/plugin.json +22 -0
- package/dist/tools/meeting/TOOL.yaml +15 -0
- package/dist/tools/meeting/commands/meeting.md +35 -0
- package/dist/tools/meeting/skills/meeting/SKILL.md +113 -0
- package/dist/tools/meeting/skills/meeting/references/export-workflow.md +87 -0
- package/package.json +1 -1
- package/src/commands/integrations.ts +30 -0
- package/src/commands/tui/components/IntegrationsDetails.tsx +114 -0
- package/src/commands/tui.tsx +26 -4
- package/src/integrations/github/index.ts +17 -0
- package/src/integrations/github/references/setup.md +61 -0
- package/src/integrations/granola/references/setup.md +54 -0
- package/src/lib/types.ts +10 -0
- package/src/tools/meeting/.claude-plugin/plugin.json +22 -0
- package/src/tools/meeting/TOOL.yaml +15 -0
- package/src/tools/meeting/commands/meeting.md +35 -0
- package/src/tools/meeting/skills/meeting/SKILL.md +113 -0
- 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,30 @@
|
|
|
1
1
|
# @orderful/droid
|
|
2
2
|
|
|
3
|
+
## 0.42.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#254](https://github.com/Orderful/droid/pull/254) [`9b1bb79`](https://github.com/Orderful/droid/commit/9b1bb797b257660c8f36df41260a3c7684ac5c72) Thanks [@frytyler](https://github.com/frytyler)! - Meeting search defaults to latest matching meeting instead of all matches. Use `--all` flag to search across all recurring meetings.
|
|
8
|
+
|
|
9
|
+
## 0.42.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#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
|
|
14
|
+
|
|
15
|
+
- [#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.
|
|
16
|
+
|
|
17
|
+
- [#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.
|
|
18
|
+
|
|
19
|
+
New `/meeting` skill and command with support for:
|
|
20
|
+
- Listing recent meetings by time range
|
|
21
|
+
- Natural language search across meeting content
|
|
22
|
+
- Quick summaries (Granola) and context-aware summaries (transcript + project context)
|
|
23
|
+
- Exporting meetings to codex with source-neutral frontmatter
|
|
24
|
+
- Pulling decisions and action items from recent meetings
|
|
25
|
+
|
|
26
|
+
Includes Granola as a new integration with TUI status display and setup guide.
|
|
27
|
+
|
|
3
28
|
## 0.41.0
|
|
4
29
|
|
|
5
30
|
### 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
|
|
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?.
|
|
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
|
-
|
|
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,
|
|
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;
|
|
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":"
|
|
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 @@
|
|
|
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 |
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -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;
|
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,UAAU,gBAAgB;IAC1B,QAAQ,aAAa;IACrB,MAAM,WAAW;IACjB,WAAW,iBAAiB;CAC7B;AAID,QAAA,MAAM,WAAW,iBAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,IAAI,MAAM,EAAE,CAAC;AACjC,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC;AAE9B;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAGD,oBAAY,aAAa;IACvB,QAAQ,aAAa;IACrB,MAAM,WAAW;CAClB;AAGD,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,MAAM,CAAC;AAEtD,oBAAY,WAAW;IACrB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,oBAAY,gBAAgB;IAC1B,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAC/B,SAAS,CAAC,EAAE,0BAA0B,CAAC;
|
|
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.1",
|
|
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.1
|
|
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,113 @@
|
|
|
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} [--all] | 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}` | Search meetings (latest match by default; use `--all` for all matches) |
|
|
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}` / `/meeting search {query} --all`)
|
|
65
|
+
|
|
66
|
+
**Default behaviour: latest match.** Recurring meetings (dailies, weeklies) return multiple hits. Searching all of them is rarely what the user wants — they usually mean the most recent one.
|
|
67
|
+
|
|
68
|
+
1. Use `ToolSearch` to load `mcp__granola__list_meetings` and `mcp__granola__query_granola_meetings`
|
|
69
|
+
2. Call `list_meetings` with `time_range: "this_week"` (or `"last_week"` / `"last_30_days"` if no matches)
|
|
70
|
+
3. Fuzzy-match the query against meeting titles in the list
|
|
71
|
+
4. **If multiple meetings match the query title:**
|
|
72
|
+
- **Without `--all`:** Scope the Granola query to only the **most recent** matching meeting ID (pass `document_ids`). Mention: "Showing results from {date}'s {title}. Use `--all` to search across all {N} matches."
|
|
73
|
+
- **With `--all`:** Query across all matching meeting IDs (pass all IDs in `document_ids`). Mention: "Searching across {N} {title} meetings."
|
|
74
|
+
5. **If only one meeting matches:** Query that single meeting (pass `document_ids`)
|
|
75
|
+
6. **If no title matches but query looks like a topic:** Fall back to a broad Granola query without `document_ids` (original behaviour)
|
|
76
|
+
7. Preserve citation links in the response
|
|
77
|
+
8. Present the response to the user
|
|
78
|
+
|
|
79
|
+
### Quick summary (`/meeting summary {title}`)
|
|
80
|
+
|
|
81
|
+
1. First, list recent meetings to find the meeting ID matching `{title}` (fuzzy match)
|
|
82
|
+
2. Use `ToolSearch` to load `mcp__granola__get_meetings`
|
|
83
|
+
3. Call with the meeting ID
|
|
84
|
+
4. Present the structured summary to the user
|
|
85
|
+
|
|
86
|
+
### Context-aware summary (`/meeting summarize {title}`)
|
|
87
|
+
|
|
88
|
+
1. First, list recent meetings to find the meeting ID matching `{title}` (fuzzy match)
|
|
89
|
+
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?"
|
|
90
|
+
3. If user confirms, use `ToolSearch` to load `mcp__granola__get_meeting_transcript`
|
|
91
|
+
4. Call with the meeting ID
|
|
92
|
+
5. Generate a summary that incorporates any loaded project context, codex knowledge, or brain docs
|
|
93
|
+
6. Alternative: use the Task tool with a subagent to process the transcript in a separate context window, then return a summary
|
|
94
|
+
|
|
95
|
+
### Decisions (`/meeting decisions`)
|
|
96
|
+
|
|
97
|
+
1. Use `ToolSearch` to load `mcp__granola__query_granola_meetings`
|
|
98
|
+
2. Call with query: "What decisions were made and what are the action items from recent meetings?"
|
|
99
|
+
3. Preserve citation links in the response
|
|
100
|
+
|
|
101
|
+
### Export (`/meeting export {title}`)
|
|
102
|
+
|
|
103
|
+
See `references/export-workflow.md` for the full procedure.
|
|
104
|
+
|
|
105
|
+
## Error Handling
|
|
106
|
+
|
|
107
|
+
| Error | Action |
|
|
108
|
+
|-------|--------|
|
|
109
|
+
| Granola MCP not available | Suggest `/mcp` to connect Granola |
|
|
110
|
+
| No meetings found for time range | Suggest a different time range |
|
|
111
|
+
| Meeting title not found | Show recent meetings, ask user to pick |
|
|
112
|
+
| Transcript too large for context | Offer subagent approach or fall back to Granola summary |
|
|
113
|
+
| Codex not in current context (export) | Prompt for destination (see export workflow) |
|