@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.
- package/.github/workflows/claude-issue-agent.yml +238 -0
- package/CHANGELOG.md +22 -0
- package/dist/bin/droid.js +53 -23
- package/dist/commands/tui.d.ts.map +1 -1
- package/dist/integrations/granola/index.d.ts +6 -0
- package/dist/integrations/granola/index.d.ts.map +1 -0
- package/dist/integrations/granola/index.ts +28 -0
- package/dist/tools/brain/.claude-plugin/plugin.json +1 -1
- package/dist/tools/brain/TOOL.yaml +1 -1
- package/dist/tools/brain/skills/brain/SKILL.md +6 -0
- package/dist/tools/coach/.claude-plugin/plugin.json +1 -1
- package/dist/tools/coach/TOOL.yaml +5 -1
- package/dist/tools/coach/skills/coach/SKILL.md +31 -5
- package/dist/tools/code-review/.claude-plugin/plugin.json +1 -1
- package/dist/tools/code-review/TOOL.yaml +1 -1
- package/dist/tools/code-review/skills/code-review/SKILL.md +6 -0
- package/dist/tools/codex/.claude-plugin/plugin.json +1 -1
- package/dist/tools/codex/TOOL.yaml +1 -1
- package/dist/tools/codex/skills/codex/SKILL.md +6 -0
- package/dist/tools/comments/.claude-plugin/plugin.json +1 -1
- package/dist/tools/comments/TOOL.yaml +1 -1
- package/dist/tools/comments/skills/comments/SKILL.md +6 -0
- package/dist/tools/meeting/.claude-plugin/plugin.json +1 -1
- package/dist/tools/meeting/TOOL.yaml +1 -1
- package/dist/tools/meeting/skills/meeting/SKILL.md +6 -0
- package/dist/tools/plan/.claude-plugin/plugin.json +1 -1
- package/dist/tools/plan/TOOL.yaml +1 -1
- package/dist/tools/plan/skills/plan/SKILL.md +6 -0
- package/dist/tools/project/.claude-plugin/plugin.json +1 -1
- package/dist/tools/project/TOOL.yaml +1 -1
- package/dist/tools/project/skills/project/SKILL.md +6 -0
- package/dist/tools/project/skills/project/references/loading.md +1 -0
- package/dist/tools/release/.claude-plugin/plugin.json +1 -1
- package/dist/tools/release/TOOL.yaml +1 -1
- package/dist/tools/release/skills/release/SKILL.md +7 -0
- package/dist/tools/release/skills/release/references/templates.md +22 -0
- package/dist/tools/release/skills/release/references/workflows.md +28 -4
- package/dist/tools/share/.claude-plugin/plugin.json +1 -1
- package/dist/tools/share/TOOL.yaml +1 -1
- package/dist/tools/share/skills/share/SKILL.md +6 -0
- package/dist/tools/status-update/.claude-plugin/plugin.json +1 -1
- package/dist/tools/status-update/TOOL.yaml +1 -1
- package/dist/tools/status-update/skills/status-update/SKILL.md +6 -0
- package/dist/tools/tech-design/.claude-plugin/plugin.json +1 -1
- package/dist/tools/tech-design/TOOL.yaml +1 -1
- package/dist/tools/tech-design/skills/tech-design/SKILL.md +6 -0
- package/dist/tools/wrapup/.claude-plugin/plugin.json +1 -1
- package/dist/tools/wrapup/TOOL.yaml +6 -2
- package/dist/tools/wrapup/skills/wrapup/SKILL.md +25 -2
- package/dist/tools/wrapup/skills/wrapup/references/output-schema.md +5 -3
- package/dist/tools/wrapup/skills/wrapup/references/subagent-prompts.md +54 -13
- package/package.json +1 -1
- package/src/commands/tui.tsx +11 -0
- package/src/integrations/granola/index.ts +28 -0
- package/src/tools/brain/.claude-plugin/plugin.json +1 -1
- package/src/tools/brain/TOOL.yaml +1 -1
- package/src/tools/brain/skills/brain/SKILL.md +6 -0
- package/src/tools/coach/.claude-plugin/plugin.json +1 -1
- package/src/tools/coach/TOOL.yaml +5 -1
- package/src/tools/coach/skills/coach/SKILL.md +31 -5
- package/src/tools/code-review/.claude-plugin/plugin.json +1 -1
- package/src/tools/code-review/TOOL.yaml +1 -1
- package/src/tools/code-review/skills/code-review/SKILL.md +6 -0
- package/src/tools/codex/.claude-plugin/plugin.json +1 -1
- package/src/tools/codex/TOOL.yaml +1 -1
- package/src/tools/codex/skills/codex/SKILL.md +6 -0
- package/src/tools/comments/.claude-plugin/plugin.json +1 -1
- package/src/tools/comments/TOOL.yaml +1 -1
- package/src/tools/comments/skills/comments/SKILL.md +6 -0
- package/src/tools/meeting/.claude-plugin/plugin.json +1 -1
- package/src/tools/meeting/TOOL.yaml +1 -1
- package/src/tools/meeting/skills/meeting/SKILL.md +6 -0
- package/src/tools/plan/.claude-plugin/plugin.json +1 -1
- package/src/tools/plan/TOOL.yaml +1 -1
- package/src/tools/plan/skills/plan/SKILL.md +6 -0
- package/src/tools/project/.claude-plugin/plugin.json +1 -1
- package/src/tools/project/TOOL.yaml +1 -1
- package/src/tools/project/skills/project/SKILL.md +6 -0
- package/src/tools/project/skills/project/references/loading.md +1 -0
- package/src/tools/release/.claude-plugin/plugin.json +1 -1
- package/src/tools/release/TOOL.yaml +1 -1
- package/src/tools/release/skills/release/SKILL.md +7 -0
- package/src/tools/release/skills/release/references/templates.md +22 -0
- package/src/tools/release/skills/release/references/workflows.md +28 -4
- package/src/tools/share/.claude-plugin/plugin.json +1 -1
- package/src/tools/share/TOOL.yaml +1 -1
- package/src/tools/share/skills/share/SKILL.md +6 -0
- package/src/tools/status-update/.claude-plugin/plugin.json +1 -1
- package/src/tools/status-update/TOOL.yaml +1 -1
- package/src/tools/status-update/skills/status-update/SKILL.md +6 -0
- package/src/tools/tech-design/.claude-plugin/plugin.json +1 -1
- package/src/tools/tech-design/TOOL.yaml +1 -1
- package/src/tools/tech-design/skills/tech-design/SKILL.md +6 -0
- package/src/tools/wrapup/.claude-plugin/plugin.json +1 -1
- package/src/tools/wrapup/TOOL.yaml +6 -2
- package/src/tools/wrapup/skills/wrapup/SKILL.md +25 -2
- package/src/tools/wrapup/skills/wrapup/references/output-schema.md +5 -3
- 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
|
|
2535
|
+
import { readFileSync as readFileSync10 } from "fs";
|
|
2536
2536
|
import { spawnSync as spawnSync4 } from "child_process";
|
|
2537
|
-
import { join as
|
|
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 =
|
|
4547
|
+
var INTEGRATIONS_DIR = join12(__tui_dirname, "../integrations");
|
|
4526
4548
|
function loadIntegrationReference(integration, filename) {
|
|
4527
4549
|
try {
|
|
4528
|
-
return
|
|
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
|
|
5075
|
-
import { join as
|
|
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 =
|
|
5089
|
-
if (!
|
|
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 =
|
|
5094
|
-
if (!
|
|
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 =
|
|
5102
|
-
if (
|
|
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
|
|
5296
|
-
import { join as
|
|
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 =
|
|
5419
|
-
var CERT_KEY_PATH =
|
|
5420
|
-
var CERT_PATH =
|
|
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 =
|
|
5424
|
-
const cert =
|
|
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:
|
|
5435
|
-
cert:
|
|
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 =
|
|
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 =
|
|
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":"
|
|
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 @@
|
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
53
|
-
|
|
|
54
|
-
| `scaffold_verbosity`
|
|
55
|
-
| `
|
|
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
|
-
-
|
|
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?"
|
|
@@ -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.
|
|
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.
|
|
3
|
+
version: 0.3.1
|
|
4
4
|
status: beta
|
|
5
5
|
|
|
6
6
|
includes:
|