@orderful/droid 0.44.1 → 0.45.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 (98) hide show
  1. package/.github/workflows/claude-issue-agent.yml +238 -0
  2. package/CHANGELOG.md +22 -0
  3. package/dist/bin/droid.js +53 -23
  4. package/dist/commands/tui.d.ts.map +1 -1
  5. package/dist/integrations/granola/index.d.ts +6 -0
  6. package/dist/integrations/granola/index.d.ts.map +1 -0
  7. package/dist/integrations/granola/index.ts +28 -0
  8. package/dist/tools/brain/.claude-plugin/plugin.json +1 -1
  9. package/dist/tools/brain/TOOL.yaml +1 -1
  10. package/dist/tools/brain/skills/brain/SKILL.md +6 -0
  11. package/dist/tools/coach/.claude-plugin/plugin.json +1 -1
  12. package/dist/tools/coach/TOOL.yaml +5 -1
  13. package/dist/tools/coach/skills/coach/SKILL.md +31 -5
  14. package/dist/tools/code-review/.claude-plugin/plugin.json +1 -1
  15. package/dist/tools/code-review/TOOL.yaml +1 -1
  16. package/dist/tools/code-review/skills/code-review/SKILL.md +6 -0
  17. package/dist/tools/codex/.claude-plugin/plugin.json +1 -1
  18. package/dist/tools/codex/TOOL.yaml +1 -1
  19. package/dist/tools/codex/skills/codex/SKILL.md +6 -0
  20. package/dist/tools/comments/.claude-plugin/plugin.json +1 -1
  21. package/dist/tools/comments/TOOL.yaml +1 -1
  22. package/dist/tools/comments/skills/comments/SKILL.md +6 -0
  23. package/dist/tools/meeting/.claude-plugin/plugin.json +1 -1
  24. package/dist/tools/meeting/TOOL.yaml +1 -1
  25. package/dist/tools/meeting/skills/meeting/SKILL.md +6 -0
  26. package/dist/tools/plan/.claude-plugin/plugin.json +1 -1
  27. package/dist/tools/plan/TOOL.yaml +1 -1
  28. package/dist/tools/plan/skills/plan/SKILL.md +6 -0
  29. package/dist/tools/project/.claude-plugin/plugin.json +1 -1
  30. package/dist/tools/project/TOOL.yaml +1 -1
  31. package/dist/tools/project/skills/project/SKILL.md +6 -0
  32. package/dist/tools/project/skills/project/references/loading.md +1 -0
  33. package/dist/tools/release/.claude-plugin/plugin.json +1 -1
  34. package/dist/tools/release/TOOL.yaml +1 -1
  35. package/dist/tools/release/skills/release/SKILL.md +7 -0
  36. package/dist/tools/release/skills/release/references/templates.md +22 -0
  37. package/dist/tools/release/skills/release/references/workflows.md +28 -4
  38. package/dist/tools/share/.claude-plugin/plugin.json +1 -1
  39. package/dist/tools/share/TOOL.yaml +1 -1
  40. package/dist/tools/share/skills/share/SKILL.md +6 -0
  41. package/dist/tools/status-update/.claude-plugin/plugin.json +1 -1
  42. package/dist/tools/status-update/TOOL.yaml +1 -1
  43. package/dist/tools/status-update/skills/status-update/SKILL.md +6 -0
  44. package/dist/tools/tech-design/.claude-plugin/plugin.json +1 -1
  45. package/dist/tools/tech-design/TOOL.yaml +1 -1
  46. package/dist/tools/tech-design/skills/tech-design/SKILL.md +6 -0
  47. package/dist/tools/wrapup/.claude-plugin/plugin.json +1 -1
  48. package/dist/tools/wrapup/TOOL.yaml +6 -2
  49. package/dist/tools/wrapup/skills/wrapup/SKILL.md +25 -2
  50. package/dist/tools/wrapup/skills/wrapup/references/output-schema.md +5 -3
  51. package/dist/tools/wrapup/skills/wrapup/references/subagent-prompts.md +54 -13
  52. package/package.json +1 -1
  53. package/src/commands/tui.tsx +11 -0
  54. package/src/integrations/granola/index.ts +28 -0
  55. package/src/tools/brain/.claude-plugin/plugin.json +1 -1
  56. package/src/tools/brain/TOOL.yaml +1 -1
  57. package/src/tools/brain/skills/brain/SKILL.md +6 -0
  58. package/src/tools/coach/.claude-plugin/plugin.json +1 -1
  59. package/src/tools/coach/TOOL.yaml +5 -1
  60. package/src/tools/coach/skills/coach/SKILL.md +31 -5
  61. package/src/tools/code-review/.claude-plugin/plugin.json +1 -1
  62. package/src/tools/code-review/TOOL.yaml +1 -1
  63. package/src/tools/code-review/skills/code-review/SKILL.md +6 -0
  64. package/src/tools/codex/.claude-plugin/plugin.json +1 -1
  65. package/src/tools/codex/TOOL.yaml +1 -1
  66. package/src/tools/codex/skills/codex/SKILL.md +6 -0
  67. package/src/tools/comments/.claude-plugin/plugin.json +1 -1
  68. package/src/tools/comments/TOOL.yaml +1 -1
  69. package/src/tools/comments/skills/comments/SKILL.md +6 -0
  70. package/src/tools/meeting/.claude-plugin/plugin.json +1 -1
  71. package/src/tools/meeting/TOOL.yaml +1 -1
  72. package/src/tools/meeting/skills/meeting/SKILL.md +6 -0
  73. package/src/tools/plan/.claude-plugin/plugin.json +1 -1
  74. package/src/tools/plan/TOOL.yaml +1 -1
  75. package/src/tools/plan/skills/plan/SKILL.md +6 -0
  76. package/src/tools/project/.claude-plugin/plugin.json +1 -1
  77. package/src/tools/project/TOOL.yaml +1 -1
  78. package/src/tools/project/skills/project/SKILL.md +6 -0
  79. package/src/tools/project/skills/project/references/loading.md +1 -0
  80. package/src/tools/release/.claude-plugin/plugin.json +1 -1
  81. package/src/tools/release/TOOL.yaml +1 -1
  82. package/src/tools/release/skills/release/SKILL.md +7 -0
  83. package/src/tools/release/skills/release/references/templates.md +22 -0
  84. package/src/tools/release/skills/release/references/workflows.md +28 -4
  85. package/src/tools/share/.claude-plugin/plugin.json +1 -1
  86. package/src/tools/share/TOOL.yaml +1 -1
  87. package/src/tools/share/skills/share/SKILL.md +6 -0
  88. package/src/tools/status-update/.claude-plugin/plugin.json +1 -1
  89. package/src/tools/status-update/TOOL.yaml +1 -1
  90. package/src/tools/status-update/skills/status-update/SKILL.md +6 -0
  91. package/src/tools/tech-design/.claude-plugin/plugin.json +1 -1
  92. package/src/tools/tech-design/TOOL.yaml +1 -1
  93. package/src/tools/tech-design/skills/tech-design/SKILL.md +6 -0
  94. package/src/tools/wrapup/.claude-plugin/plugin.json +1 -1
  95. package/src/tools/wrapup/TOOL.yaml +6 -2
  96. package/src/tools/wrapup/skills/wrapup/SKILL.md +25 -2
  97. package/src/tools/wrapup/skills/wrapup/references/output-schema.md +5 -3
  98. package/src/tools/wrapup/skills/wrapup/references/subagent-prompts.md +54 -13
@@ -0,0 +1,238 @@
1
+ name: Claude Issue Agent
2
+
3
+ on:
4
+ issues:
5
+ types: [labeled]
6
+
7
+ jobs:
8
+ implement:
9
+ if: github.event.label.name == 'claude'
10
+ runs-on: ubuntu-latest
11
+ timeout-minutes: 60
12
+ permissions:
13
+ contents: write
14
+ pull-requests: write
15
+ issues: write
16
+ id-token: write
17
+ actions: read
18
+
19
+ steps:
20
+ - name: Checkout repository
21
+ uses: actions/checkout@v4
22
+ with:
23
+ fetch-depth: 0
24
+
25
+ - name: Checkout codex for project context
26
+ continue-on-error: true
27
+ uses: actions/github-script@v7
28
+ with:
29
+ github-token: ${{ secrets.CODEX_ACCESS_TOKEN }}
30
+ script: |
31
+ const fs = require('fs');
32
+ const path = require('path');
33
+
34
+ const files = [
35
+ 'projects/droid/CONTEXT.md',
36
+ 'projects/droid/DECISIONS.md',
37
+ 'projects/droid/artifacts/concept-skills.md',
38
+ 'projects/droid/artifacts/concept-commands.md',
39
+ 'projects/droid/artifacts/concept-agents.md'
40
+ ];
41
+
42
+ for (const file of files) {
43
+ try {
44
+ const { data } = await github.rest.repos.getContent({
45
+ owner: 'Orderful',
46
+ repo: 'orderful-codex',
47
+ path: file,
48
+ });
49
+ const content = Buffer.from(data.content, 'base64').toString('utf-8');
50
+ const dest = path.join('.codex-context', file);
51
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
52
+ fs.writeFileSync(dest, content);
53
+ console.log(`Fetched ${file}`);
54
+ } catch (e) {
55
+ console.log(`Skipped ${file}: ${e.message}`);
56
+ }
57
+ }
58
+
59
+ - name: Setup Bun
60
+ uses: oven-sh/setup-bun@v2
61
+
62
+ - name: Install dependencies
63
+ run: bun install
64
+
65
+ # ── Step 1: Plan (read-only exploration → structured JSON output) ──
66
+
67
+ - name: Generate implementation plan
68
+ id: plan
69
+ uses: anthropics/claude-code-action@v1
70
+ with:
71
+ claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
72
+ prompt: |
73
+ You are an autonomous coding agent. Read the GitHub issue below and
74
+ create a detailed implementation plan. Do NOT write any code — only
75
+ explore the codebase and plan.
76
+
77
+ ## Issue Context
78
+ REPO: ${{ github.repository }}
79
+ ISSUE NUMBER: ${{ github.event.issue.number }}
80
+ TITLE: ${{ github.event.issue.title }}
81
+ BODY: ${{ github.event.issue.body }}
82
+ LABELS: ${{ join(github.event.issue.labels.*.name, ', ') }}
83
+
84
+ ## Project Knowledge
85
+ If `.codex-context/projects/droid/` exists, read these files first:
86
+ - `.codex-context/projects/droid/CONTEXT.md` — Architecture, tools, patterns
87
+ - `.codex-context/projects/droid/DECISIONS.md` — Historical decisions with rationale
88
+
89
+ Also read CLAUDE.md and AGENTS.md in the repo root for conventions.
90
+
91
+ ## Your Task
92
+ 1. Read the issue carefully. Understand the goal and constraints.
93
+ 2. Read project context files (codex, CLAUDE.md, AGENTS.md).
94
+ 3. Explore the codebase — find relevant files, understand existing patterns.
95
+ 4. Produce a structured plan as JSON with these fields:
96
+ - summary: What the issue asks for and why
97
+ - approach: Your proposed high-level strategy and key design decisions
98
+ - files_to_change: Array of strings, each describing a file path and what to change
99
+ - testing_strategy: How to verify the implementation
100
+ - risks: Any risks, open questions, or assumptions (empty string if none)
101
+
102
+ claude_args: >-
103
+ --max-turns 30
104
+ --model claude-sonnet-4-6
105
+ --allowedTools "Read,Glob,Grep,Bash(ls *),Bash(cat *),Bash(git *),Task"
106
+ --json-schema '{"type":"object","properties":{"summary":{"type":"string"},"approach":{"type":"string"},"files_to_change":{"type":"array","items":{"type":"string"}},"testing_strategy":{"type":"string"},"risks":{"type":"string"}},"required":["summary","approach","files_to_change","testing_strategy","risks"]}'
107
+
108
+ # ── Step 2: Post plan as comment (guaranteed — no agent discretion) ──
109
+
110
+ - name: Post plan to issue
111
+ env:
112
+ GH_TOKEN: ${{ github.token }}
113
+ PLAN_JSON: ${{ steps.plan.outputs.structured_output }}
114
+ run: |
115
+ {
116
+ echo "## Implementation Plan"
117
+ echo ""
118
+ echo "### Summary"
119
+ echo "$PLAN_JSON" | jq -r '.summary'
120
+ echo ""
121
+ echo "### Approach"
122
+ echo "$PLAN_JSON" | jq -r '.approach'
123
+ echo ""
124
+ echo "### Files to Change"
125
+ echo "$PLAN_JSON" | jq -r '.files_to_change[]' | sed 's/^/- /'
126
+ echo ""
127
+ echo "### Testing Strategy"
128
+ echo "$PLAN_JSON" | jq -r '.testing_strategy'
129
+ echo ""
130
+ echo "### Risks / Open Questions"
131
+ echo "$PLAN_JSON" | jq -r 'if .risks == "" then "None identified" else .risks end'
132
+ echo ""
133
+ echo "---"
134
+ echo "*Proceeding with implementation. PR will be opened when complete.*"
135
+ } > /tmp/plan-comment.md
136
+
137
+ gh issue comment ${{ github.event.issue.number }} --body-file /tmp/plan-comment.md
138
+
139
+ # ── Step 3: Implement (follows the plan, makes changes) ──
140
+
141
+ # Re-checkout to refresh git credentials (plan step's action revokes them on cleanup)
142
+ - name: Refresh git credentials
143
+ uses: actions/checkout@v4
144
+ with:
145
+ fetch-depth: 0
146
+
147
+ - name: Implement solution
148
+ id: implement
149
+ uses: anthropics/claude-code-action@v1
150
+ with:
151
+ github_token: ${{ github.token }}
152
+ claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
153
+ track_progress: true
154
+
155
+ prompt: |
156
+ You are an autonomous coding agent. Implement the plan below for
157
+ issue #${{ github.event.issue.number }}.
158
+
159
+ ## Issue
160
+ TITLE: ${{ github.event.issue.title }}
161
+ BODY: ${{ github.event.issue.body }}
162
+
163
+ ## Implementation Plan (follow this)
164
+ ${{ steps.plan.outputs.structured_output }}
165
+
166
+ ## Instructions
167
+ 1. Implement the solution following the plan above.
168
+ 2. Follow all conventions in CLAUDE.md and AGENTS.md:
169
+ - TypeScript strict mode, single quotes
170
+ - Canadian spelling (behaviour, colour, honour)
171
+ - Use "allow list/deny list" not "whitelist/blacklist"
172
+ 3. Keep changes focused — implement what the plan says, nothing more.
173
+ 4. Add a changeset if this changes the droid package:
174
+ ```bash
175
+ mkdir -p .changeset && cat > .changeset/<descriptive-name>.md << 'CHANGESET'
176
+ ---
177
+ "@orderful/droid": patch
178
+ ---
179
+
180
+ Brief description of the change
181
+ CHANGESET
182
+ ```
183
+ 5. Run the linter: `bun run lint`
184
+ 6. Run tests: `bun run test`
185
+ 7. Fix any issues found. If tests/lint fail after 2 attempts, note failures and proceed.
186
+ 8. Run `bun run build` if you changed any TOOL.yaml or plugin.json files.
187
+ 9. Stage and commit changes with a conventional commit message.
188
+ 10. Open a PR with `gh pr create` targeting main, with a clear title and description.
189
+ Add `--reviewer frytyler` and include `Closes #${{ github.event.issue.number }}` in the body.
190
+
191
+ claude_args: >-
192
+ --max-turns 100
193
+ --model claude-sonnet-4-6
194
+ --allowedTools "Bash(bun *),Bash(gh *),Bash(git *),Bash(ls *),Bash(mkdir *),Bash(cat *),Read,Write,Edit,Glob,Grep,Task"
195
+
196
+ # ── Step 4: Ensure PR exists (safety net if agent didn't create one) ──
197
+
198
+ - name: Ensure PR exists
199
+ continue-on-error: true
200
+ if: steps.implement.outputs.branch_name
201
+ env:
202
+ GH_TOKEN: ${{ steps.implement.outputs.github_token || github.token }}
203
+ PLAN_JSON: ${{ steps.plan.outputs.structured_output }}
204
+ run: |
205
+ BRANCH="${{ steps.implement.outputs.branch_name }}"
206
+
207
+ # Check if a PR already exists for this branch (agent may have created one)
208
+ EXISTING_PR=$(gh pr list --head "$BRANCH" --json number --jq '.[0].number // empty')
209
+ if [ -n "$EXISTING_PR" ]; then
210
+ echo "PR #$EXISTING_PR already exists for branch $BRANCH — skipping creation"
211
+ exit 0
212
+ fi
213
+
214
+ SUMMARY=$(echo "$PLAN_JSON" | jq -r '.summary')
215
+
216
+ gh pr create \
217
+ --head "$BRANCH" \
218
+ --title "$(git log -1 --format='%s' "origin/$BRANCH")" \
219
+ --body "$(cat <<EOF
220
+ ### Summary :sparkles:
221
+
222
+ ${SUMMARY}
223
+
224
+ See the **Implementation Plan** comment on #${{ github.event.issue.number }} for the full approach.
225
+
226
+ ### Changes
227
+
228
+ $(git log "origin/main..origin/$BRANCH" --format='- %s')
229
+
230
+ ## Ticket
231
+
232
+ Closes #${{ github.event.issue.number }}
233
+
234
+ ---
235
+ 🤖 Autonomously implemented by [Claude Code](https://claude.com/claude-code)
236
+ EOF
237
+ )" \
238
+ --reviewer frytyler
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @orderful/droid
2
2
 
3
+ ## 0.45.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#279](https://github.com/Orderful/droid/pull/279) [`c602d09`](https://github.com/Orderful/droid/commit/c602d09fc2ac395a4a4c7a1c92056c68485c28fa) Thanks [@github-actions](https://github.com/apps/github-actions)! - Add `coaching_intensity` config option to coach skill (`light` / `moderate` / `deep`). Shifts the default proposing/questioning ratio from 40/60 to 50/50 at `moderate` intensity and adds per-turn output discipline (3-5 focused points, prefer one sharp question over several surface-level ones). Users wanting the previous Socratic-heavy behaviour can set `coaching_intensity: deep`.
8
+
9
+ - [#271](https://github.com/Orderful/droid/pull/271) [`e3f8a7e`](https://github.com/Orderful/droid/commit/e3f8a7e4a40cd08ae407923a6329a6e08be72e22) Thanks [@github-actions](https://github.com/apps/github-actions)! - Add `--` escape syntax support to all skills for custom instructions
10
+
11
+ Any skill command now accepts a ` -- {instruction}` suffix. Split on the first `--` (space-dash-dash-space): left is the command and args, right is additional context or instruction applied throughout the execution.
12
+
13
+ Example: `/brain research caching -- focus on Redis patterns`
14
+
15
+ - [#281](https://github.com/Orderful/droid/pull/281) [`5cba361`](https://github.com/Orderful/droid/commit/5cba361bbe63a1d41c366673da08daa663bdf786) Thanks [@github-actions](https://github.com/apps/github-actions)! - wrapup: suggest updates to existing codex entries, add persist_recaps config to save session recaps to brain vault
16
+
17
+ ### Patch Changes
18
+
19
+ - [#267](https://github.com/Orderful/droid/pull/267) [`488a37f`](https://github.com/Orderful/droid/commit/488a37f28cfc520e5a9af56b4b66334f22ff09c7) Thanks [@frytyler](https://github.com/frytyler)! - Auto-detect Granola MCP server status from Claude Code settings instead of relying solely on a manually-set config flag
20
+
21
+ - [#286](https://github.com/Orderful/droid/pull/286) [`6d5d9ca`](https://github.com/Orderful/droid/commit/6d5d9cacfe87d18b85e8cefd29a4de9324be201e) Thanks [@github-actions](https://github.com/apps/github-actions)! - project: skip CHANGELOG.md on initial load to preserve context window savings
22
+
23
+ - [#284](https://github.com/Orderful/droid/pull/284) [`992b8ef`](https://github.com/Orderful/droid/commit/992b8efdca3be95b46e50b5ec0cafefcd4683c33) Thanks [@github-actions](https://github.com/apps/github-actions)! - Release tool now detects high-risk PR labels and surfaces them in PR body, Slack notification, status output, and merge confirmation.
24
+
3
25
  ## 0.44.1
4
26
 
5
27
  ### Patch Changes
package/dist/bin/droid.js CHANGED
@@ -2532,9 +2532,9 @@ async function updateCommand(tool, options) {
2532
2532
  // src/commands/tui.tsx
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
- import { readFileSync as readFileSync9 } from "fs";
2535
+ import { readFileSync as readFileSync10 } from "fs";
2536
2536
  import { spawnSync as spawnSync4 } from "child_process";
2537
- import { join as join11, dirname as dirname7 } from "path";
2537
+ import { join as join12, dirname as dirname7 } from "path";
2538
2538
  import { fileURLToPath as fileURLToPath5 } from "url";
2539
2539
 
2540
2540
  // src/commands/tui/constants.ts
@@ -4511,6 +4511,28 @@ function checkGhAuth() {
4511
4511
  }
4512
4512
  }
4513
4513
 
4514
+ // src/integrations/granola/index.ts
4515
+ import { join as join11 } from "path";
4516
+ import { homedir as homedir6 } from "os";
4517
+ import { existsSync as existsSync10, readFileSync as readFileSync9 } from "fs";
4518
+ function checkGranolaAuth() {
4519
+ try {
4520
+ const settingsPath = join11(homedir6(), ".claude", "settings.json");
4521
+ if (!existsSync10(settingsPath)) {
4522
+ return false;
4523
+ }
4524
+ const raw = readFileSync9(settingsPath, "utf-8");
4525
+ const settings = JSON.parse(raw);
4526
+ const mcpServers = settings["mcpServers"];
4527
+ if (!mcpServers || typeof mcpServers !== "object") {
4528
+ return false;
4529
+ }
4530
+ return Object.keys(mcpServers).some((key) => key.toLowerCase().includes("granola"));
4531
+ } catch {
4532
+ return false;
4533
+ }
4534
+ }
4535
+
4514
4536
  // src/commands/tui.tsx
4515
4537
  import { Fragment as Fragment2, jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
4516
4538
  var exitMessage = null;
@@ -4522,10 +4544,10 @@ var INTEGRATION_GUIDE_TITLES = {
4522
4544
  granola: "Granola Integration Setup"
4523
4545
  };
4524
4546
  var __tui_dirname = dirname7(fileURLToPath5(import.meta.url));
4525
- var INTEGRATIONS_DIR = join11(__tui_dirname, "../integrations");
4547
+ var INTEGRATIONS_DIR = join12(__tui_dirname, "../integrations");
4526
4548
  function loadIntegrationReference(integration, filename) {
4527
4549
  try {
4528
- return readFileSync9(join11(INTEGRATIONS_DIR, integration, "references", filename), "utf-8");
4550
+ return readFileSync10(join12(INTEGRATIONS_DIR, integration, "references", filename), "utf-8");
4529
4551
  } catch {
4530
4552
  return null;
4531
4553
  }
@@ -4630,6 +4652,14 @@ function App() {
4630
4652
  }
4631
4653
  }
4632
4654
  }, []);
4655
+ useEffect(() => {
4656
+ if (!getConfigValue("integrations.granola.configured")) {
4657
+ const isConfigured = checkGranolaAuth();
4658
+ if (isConfigured) {
4659
+ setConfigValue("integrations.granola.configured", true);
4660
+ }
4661
+ }
4662
+ }, []);
4633
4663
  useInput9(
4634
4664
  (input, key) => {
4635
4665
  if (message) setMessage(null);
@@ -5071,8 +5101,8 @@ async function tuiCommand() {
5071
5101
  // src/commands/exec.ts
5072
5102
  import chalk9 from "chalk";
5073
5103
  import { spawn } from "child_process";
5074
- import { existsSync as existsSync10 } from "fs";
5075
- import { join as join12 } from "path";
5104
+ import { existsSync as existsSync11 } from "fs";
5105
+ import { join as join13 } from "path";
5076
5106
  function getRuntime(toolPath) {
5077
5107
  if (toolPath.endsWith(".ts") || toolPath.endsWith(".js")) {
5078
5108
  return { cmd: "bun", args: ["run", toolPath] };
@@ -5085,21 +5115,21 @@ function getRuntime(toolPath) {
5085
5115
  async function execCommand(tool, script, args) {
5086
5116
  const config = loadConfig();
5087
5117
  const skillsPath = getSkillsPath(config.platform);
5088
- const toolDir = join12(skillsPath, tool);
5089
- if (!existsSync10(toolDir)) {
5118
+ const toolDir = join13(skillsPath, tool);
5119
+ if (!existsSync11(toolDir)) {
5090
5120
  console.error(chalk9.red(`Tool '${tool}' not found at ${toolDir}`));
5091
5121
  process.exit(1);
5092
5122
  }
5093
- const scriptsDir = join12(toolDir, "scripts");
5094
- if (!existsSync10(scriptsDir)) {
5123
+ const scriptsDir = join13(toolDir, "scripts");
5124
+ if (!existsSync11(scriptsDir)) {
5095
5125
  console.error(chalk9.red(`No scripts directory in tool '${tool}'`));
5096
5126
  process.exit(1);
5097
5127
  }
5098
5128
  const extensions = [".ts", ".js", ".py"];
5099
5129
  let scriptPath = null;
5100
5130
  for (const ext of extensions) {
5101
- const candidate = join12(scriptsDir, script + ext);
5102
- if (existsSync10(candidate)) {
5131
+ const candidate = join13(scriptsDir, script + ext);
5132
+ if (existsSync11(candidate)) {
5103
5133
  scriptPath = candidate;
5104
5134
  break;
5105
5135
  }
@@ -5292,8 +5322,8 @@ import inquirer5 from "inquirer";
5292
5322
  import chalk11 from "chalk";
5293
5323
  import { execSync as execSync6 } from "child_process";
5294
5324
  import { createServer } from "https";
5295
- import { readFileSync as readFileSync10, mkdirSync as mkdirSync7, appendFileSync as appendFileSync2, writeFileSync as writeFileSync6 } from "fs";
5296
- import { join as join13 } from "path";
5325
+ import { readFileSync as readFileSync11, mkdirSync as mkdirSync7, appendFileSync as appendFileSync2, writeFileSync as writeFileSync6 } from "fs";
5326
+ import { join as join14 } from "path";
5297
5327
 
5298
5328
  // src/integrations/slack/index.ts
5299
5329
  import { WebClient } from "@slack/web-api";
@@ -5415,13 +5445,13 @@ var SUCCESS_HTML = `<!DOCTYPE html>
5415
5445
  </div>
5416
5446
  </body>
5417
5447
  </html>`;
5418
- var CERT_DIR = join13(process.env.HOME || "", ".droid", "certs");
5419
- var CERT_KEY_PATH = join13(CERT_DIR, "localhost-key.pem");
5420
- var CERT_PATH = join13(CERT_DIR, "localhost.pem");
5448
+ var CERT_DIR = join14(process.env.HOME || "", ".droid", "certs");
5449
+ var CERT_KEY_PATH = join14(CERT_DIR, "localhost-key.pem");
5450
+ var CERT_PATH = join14(CERT_DIR, "localhost.pem");
5421
5451
  function getOrCreateCert() {
5422
5452
  try {
5423
- const key = readFileSync10(CERT_KEY_PATH, "utf-8");
5424
- const cert = readFileSync10(CERT_PATH, "utf-8");
5453
+ const key = readFileSync11(CERT_KEY_PATH, "utf-8");
5454
+ const cert = readFileSync11(CERT_PATH, "utf-8");
5425
5455
  if (key && cert) return { key, cert };
5426
5456
  } catch {
5427
5457
  }
@@ -5431,8 +5461,8 @@ function getOrCreateCert() {
5431
5461
  { stdio: "ignore" }
5432
5462
  );
5433
5463
  return {
5434
- key: readFileSync10(CERT_KEY_PATH, "utf-8"),
5435
- cert: readFileSync10(CERT_PATH, "utf-8")
5464
+ key: readFileSync11(CERT_KEY_PATH, "utf-8"),
5465
+ cert: readFileSync11(CERT_PATH, "utf-8")
5436
5466
  };
5437
5467
  }
5438
5468
  function trustCertInKeychain() {
@@ -5494,7 +5524,7 @@ function writeTokenToShellRc(key, value) {
5494
5524
  const exportLine = buildExportLine(key, value, isFish);
5495
5525
  const fullPath = expandHome(rcPath);
5496
5526
  try {
5497
- const existing = readFileSync10(fullPath, "utf-8");
5527
+ const existing = readFileSync11(fullPath, "utf-8");
5498
5528
  if (existing.includes(`${key}=`) || existing.includes(`${key} "`)) {
5499
5529
  const lines = existing.split("\n");
5500
5530
  const pattern = isFish ? new RegExp(`^set\\s+-gx\\s+${key}\\s+`) : new RegExp(`^export\\s+${key}=`);
@@ -5705,7 +5735,7 @@ async function integrationsStatusCommand() {
5705
5735
  async function slackPostCommand(options) {
5706
5736
  let input;
5707
5737
  try {
5708
- input = readFileSync10(0, "utf-8").trim();
5738
+ input = readFileSync11(0, "utf-8").trim();
5709
5739
  } catch {
5710
5740
  console.log(JSON.stringify({ ok: false, error: "Failed to read from stdin. Pipe JSON payload via stdin." }));
5711
5741
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/commands/tui.tsx"],"names":[],"mappings":"AAktBA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBhD"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/commands/tui.tsx"],"names":[],"mappings":"AA6tBA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBhD"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Check if a Granola MCP server is registered in Claude Code's settings.
3
+ * Returns true if any mcpServers entry key contains "granola" (case-insensitive).
4
+ */
5
+ export declare function checkGranolaAuth(): boolean;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/granola/index.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAmB1C"}
@@ -0,0 +1,28 @@
1
+ import { join } from 'path';
2
+ import { homedir } from 'os';
3
+ import { existsSync, readFileSync } from 'fs';
4
+
5
+ /**
6
+ * Check if a Granola MCP server is registered in Claude Code's settings.
7
+ * Returns true if any mcpServers entry key contains "granola" (case-insensitive).
8
+ */
9
+ export function checkGranolaAuth(): boolean {
10
+ try {
11
+ const settingsPath = join(homedir(), '.claude', 'settings.json');
12
+ if (!existsSync(settingsPath)) {
13
+ return false;
14
+ }
15
+
16
+ const raw = readFileSync(settingsPath, 'utf-8');
17
+ const settings = JSON.parse(raw) as Record<string, unknown>;
18
+
19
+ const mcpServers = settings['mcpServers'];
20
+ if (!mcpServers || typeof mcpServers !== 'object') {
21
+ return false;
22
+ }
23
+
24
+ return Object.keys(mcpServers).some((key) => key.toLowerCase().includes('granola'));
25
+ } catch {
26
+ return false;
27
+ }
28
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-brain",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Your scratchpad (or brain) - a collaborative space for planning and research. Create docs with /brain plan, /brain research, or /brain review. Use @mentions for async discussion. Docs persist across sessions.",
5
5
  "author": {
6
6
  "name": "Orderful",
@@ -1,6 +1,6 @@
1
1
  name: brain
2
2
  description: "Your scratchpad (or brain) - a collaborative space for planning and research. Create docs with /brain plan, /brain research, or /brain review. Use @mentions for async discussion. Docs persist across sessions."
3
- version: 0.4.0
3
+ version: 0.4.1
4
4
  status: beta
5
5
 
6
6
  includes:
@@ -47,6 +47,12 @@ droid config --set tools.brain.brain_dir="{user's choice}"
47
47
 
48
48
  **Overrides:** This skill supports user-defined overrides. See `/droid` skill § Skill Overrides for how to create, register, and use overrides.
49
49
 
50
+ ## Custom Instructions
51
+
52
+ Any command accepts a ` -- {instruction}` suffix. Split on the **first** ` -- ` (space-dash-dash-space): left is the command and its args, right is additional context or instruction to carry through the entire execution.
53
+
54
+ Example: `/brain research caching -- focus on Redis patterns`
55
+
50
56
  ## Commands
51
57
 
52
58
  **Reserved keywords:** `search`, `add`, `check`, `cleanup`, `done`
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-coach",
3
- "version": "0.2.4",
3
+ "version": "0.3.0",
4
4
  "description": "Learning-mode AI assistance - AI as coach, not crutch. Use /coach plan for co-authored planning, /coach scaffold for structure with hints, /coach review for Socratic questions.",
5
5
  "author": {
6
6
  "name": "Orderful",
@@ -1,6 +1,6 @@
1
1
  name: coach
2
2
  description: "Learning-mode AI assistance - AI as coach, not crutch. Use /coach plan for co-authored planning, /coach scaffold for structure with hints, /coach review for Socratic questions."
3
- version: 0.2.4
3
+ version: 0.3.0
4
4
  status: beta
5
5
 
6
6
  includes:
@@ -20,3 +20,7 @@ config_schema:
20
20
  type: string
21
21
  description: "How detailed scaffold hints should be: minimal (signatures only), medium (hints), detailed (pseudocode)"
22
22
  default: "medium"
23
+ coaching_intensity:
24
+ type: string
25
+ description: "How Socratic coaching interactions are: light (1-2 targeted questions, concise), moderate (2-3 questions, brief context), deep (thorough exploration, current behaviour)"
26
+ default: "moderate"
@@ -49,10 +49,11 @@ plan → AI scaffolds → human implements → AI coaches → iterate → ship
49
49
 
50
50
  ## Configuration
51
51
 
52
- | Setting | Default | Description |
53
- | -------------------- | -------- | ------------------------------------------------------- |
54
- | `scaffold_verbosity` | `medium` | How detailed hints are: `minimal`, `medium`, `detailed` |
55
- | `override` | (none) | User-defined behaviour overrides |
52
+ | Setting | Default | Description |
53
+ | --------------------- | ---------- | ------------------------------------------------------------------------------------------------- |
54
+ | `scaffold_verbosity` | `medium` | How detailed hints are: `minimal`, `medium`, `detailed` |
55
+ | `coaching_intensity` | `moderate` | How Socratic interactions are: `light` (1-2 questions, concise), `moderate` (2-3 questions), `deep` (thorough Socratic exploration) |
56
+ | `override` | (none) | User-defined behaviour overrides |
56
57
 
57
58
  **Overrides:** This skill supports user-defined overrides. See `/droid` skill § Skill Overrides.
58
59
 
@@ -62,6 +63,26 @@ plan → AI scaffolds → human implements → AI coaches → iterate → ship
62
63
 
63
64
  Run `droid config --get tools.coach` to get the merged configuration.
64
65
 
66
+ ## Custom Instructions
67
+
68
+ Any command accepts a ` -- {instruction}` suffix. Split on the **first** ` -- ` (space-dash-dash-space): left is the command and its args, right is additional context or instruction to carry through the entire execution.
69
+
70
+ Example: `/coach plan add auth endpoint -- treat me as a junior learning OAuth for the first time`
71
+
72
+ ---
73
+
74
+ ## Output Discipline
75
+
76
+ Before each coaching interaction, read `coaching_intensity` from config (`droid config --get tools.coach`):
77
+
78
+ | Intensity | Questions per turn | Response length |
79
+ | ---------- | ------------------ | --------------------------------------- |
80
+ | `light` | 1–2 targeted | Concise — one short paragraph per point |
81
+ | `moderate` | 2–3 focused | Brief — 3–5 points, context per question (default) |
82
+ | `deep` | 3+ | Thorough — current behaviour |
83
+
84
+ **Regardless of intensity:** Prefer one sharp, well-framed question over three surface-level ones. Limit each response to 3–5 focused points rather than exhaustive lists. Quality of challenge over quantity of questions.
85
+
65
86
  ---
66
87
 
67
88
  ## /coach plan
@@ -70,7 +91,10 @@ Run `droid config --get tools.coach` to get the merged configuration.
70
91
 
71
92
  **Behaviour:**
72
93
 
73
- - Ratio: ~40% proposing, ~60% questioning
94
+ - Proposing/questioning ratio by intensity:
95
+ - `light` — ~60% proposing, ~40% questioning (lead with concrete guidance)
96
+ - `moderate` — ~50% proposing, ~50% questioning (default)
97
+ - `deep` — ~40% proposing, ~60% questioning (current Socratic-heavy behaviour)
74
98
  - Ask questions that probe requirements, edge cases, and design tradeoffs
75
99
  - Propose structure but let human refine
76
100
  - Offer to create a brain doc: "Would you like me to create a brain doc to capture this plan?"
@@ -135,6 +159,7 @@ Run `droid config --get tools.coach` to get the merged configuration.
135
159
  - Add inline `// @{user} {question}` comments using the comments skill pattern
136
160
  - Questions should probe reasoning, not just confirm choices
137
161
  - Focus on: design decisions, edge cases, potential issues, alternatives
162
+ - Question density follows `coaching_intensity`: `light` → 1–2 comments per changed block; `moderate` → 2–3; `deep` → as many as warranted
138
163
 
139
164
  **Example inline comments:**
140
165
 
@@ -179,6 +204,7 @@ Run `droid config --get tools.coach` to get the merged configuration.
179
204
 
180
205
  - Identify alternative approaches the human might not have considered
181
206
  - Use Socratic prompting to guide discovery
207
+ - Question density follows `coaching_intensity`: `light` → 1–2 sharp challenges; `moderate` → 2–3 challenges; `deep` → thorough exploration
182
208
  - Ask questions like:
183
209
  - "What if I told you there's a potential issue here? Can you find it?"
184
210
  - "I can think of another way to implement this. What might it be?"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-code-review",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "description": "Comprehensive code review using specialized agents. Reviews PRs, staged changes, branches, or specific files with confidence scoring.",
5
5
  "author": {
6
6
  "name": "Orderful",
@@ -1,6 +1,6 @@
1
1
  name: code-review
2
2
  description: "Comprehensive code review using specialized agents. Reviews PRs, staged changes, branches, or specific files with confidence scoring."
3
- version: 0.2.3
3
+ version: 0.2.4
4
4
  status: alpha
5
5
 
6
6
  includes:
@@ -18,6 +18,12 @@ Code-review has no configuration of its own. Optional integration with other too
18
18
 
19
19
  **Overrides:** This skill supports user-defined overrides. See `/droid` skill § Skill Overrides.
20
20
 
21
+ ## Custom Instructions
22
+
23
+ Any command accepts a ` -- {instruction}` suffix. Split on the **first** ` -- ` (space-dash-dash-space): left is the command and its args, right is additional context or instruction to carry through the entire execution.
24
+
25
+ Example: `/code-review #123 -- pay close attention to SQL injection risks`
26
+
21
27
  ## How It Works
22
28
 
23
29
  The `/code-review` command orchestrates multiple specialized agents in parallel:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-codex",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Shared organizational knowledge - PRDs, tech designs, domains, proposals, patterns, and explored topics. Self-describing: structure and workflows defined in codex repo. Use when loading project context, searching codex, capturing decisions, or creating new entries.",
5
5
  "author": {
6
6
  "name": "Orderful",
@@ -1,6 +1,6 @@
1
1
  name: codex
2
2
  description: "Shared organizational knowledge - PRDs, tech designs, domains, proposals, patterns, and explored topics. Self-describing: structure and workflows defined in codex repo. Use when loading project context, searching codex, capturing decisions, or creating new entries."
3
- version: 0.3.0
3
+ version: 0.3.1
4
4
  status: beta
5
5
 
6
6
  includes: