@orderful/droid 0.42.0 → 0.43.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/.claude-plugin/plugin.json +2 -0
- package/CHANGELOG.md +12 -0
- package/dist/bin/droid.js +183 -16
- package/dist/commands/repos.d.ts.map +1 -1
- package/dist/commands/tui/views/ReposManagementScreen.d.ts.map +1 -1
- package/dist/commands/tui/views/ReposViewerScreen.d.ts.map +1 -1
- package/dist/lib/types.d.ts +2 -0
- package/dist/lib/types.d.ts.map +1 -1
- 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 +15 -7
- package/dist/tools/release/.claude-plugin/plugin.json +22 -0
- package/dist/tools/release/TOOL.yaml +21 -0
- package/dist/tools/release/commands/release.md +28 -0
- package/dist/tools/release/skills/release/SKILL.md +73 -0
- package/dist/tools/release/skills/release/references/templates.md +83 -0
- package/dist/tools/release/skills/release/references/workflows.md +129 -0
- package/package.json +1 -1
- package/src/commands/repos.ts +29 -0
- package/src/commands/tui/views/ReposManagementScreen.tsx +177 -16
- package/src/commands/tui/views/ReposViewerScreen.tsx +5 -0
- package/src/lib/types.ts +2 -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 +15 -7
- package/src/tools/release/.claude-plugin/plugin.json +22 -0
- package/src/tools/release/TOOL.yaml +21 -0
- package/src/tools/release/commands/release.md +28 -0
- package/src/tools/release/skills/release/SKILL.md +73 -0
- package/src/tools/release/skills/release/references/templates.md +83 -0
- package/src/tools/release/skills/release/references/workflows.md +129 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release
|
|
3
|
+
description: "Release ceremony automation"
|
|
4
|
+
argument-hint: "[start [repo] | status | complete [repo]]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /release
|
|
8
|
+
|
|
9
|
+
**User invoked:** `/release $ARGUMENTS`
|
|
10
|
+
|
|
11
|
+
**Your task:** Invoke the **release skill** with these arguments.
|
|
12
|
+
|
|
13
|
+
## Examples
|
|
14
|
+
|
|
15
|
+
- `/release start` → Create release PR for current repo
|
|
16
|
+
- `/release start orderful-workspace` → Create release PR for a specific repo
|
|
17
|
+
- `/release status` → Check CI state across release repos
|
|
18
|
+
- `/release complete` → Post "release complete" to Slack
|
|
19
|
+
|
|
20
|
+
## Quick Reference
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
/release start [repo] # Create release PR + notify Slack
|
|
24
|
+
/release status # CI state across repos
|
|
25
|
+
/release complete [repo] # Notify Slack, close out release
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
See the **release skill** for complete documentation.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release
|
|
3
|
+
description: "Release ceremony automation for dev-to-master releases. Use when starting a release, checking release status, or completing a release. User prompts like 'start a release', 'release status', 'release complete'."
|
|
4
|
+
argument-hint: "[start [repo] | status | complete [repo]]"
|
|
5
|
+
allowed-tools: [Read, Write, Glob, Grep, Bash, Edit]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Release Skill
|
|
9
|
+
|
|
10
|
+
Automate dev → master release ceremonies: create release PRs, notify Slack, and track status.
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
- User wants to start a release (create PR from dev → master)
|
|
15
|
+
- User asks about release status (open PRs, CI checks)
|
|
16
|
+
- User says "release complete" or wants to close out a release
|
|
17
|
+
- Natural language like "start a release", "what's the release status?"
|
|
18
|
+
|
|
19
|
+
## When NOT to Use
|
|
20
|
+
|
|
21
|
+
- Deploying to environments (this is about merging dev → master, not deployment)
|
|
22
|
+
- Feature branch management (this is for release branches only)
|
|
23
|
+
- Hotfixes or cherry-picks (manual process)
|
|
24
|
+
|
|
25
|
+
## Prerequisites
|
|
26
|
+
|
|
27
|
+
1. **`gh` CLI** — authenticated with access to target repos
|
|
28
|
+
2. **Slack integration** — `droid integrations slack post` configured (optional, falls back to terminal)
|
|
29
|
+
|
|
30
|
+
## Configuration
|
|
31
|
+
|
|
32
|
+
Read config at the start of every command:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
droid config --get tools.release
|
|
36
|
+
droid config --get repos
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- **Repos:** Filter `repos` array for entries with `release_branch` set — these are release repos
|
|
40
|
+
- **Slack channel:** From `tools.release.slack_channel` (default: `#release-management`)
|
|
41
|
+
- **Repo detection:** Match cwd against repo paths, or ask user if ambiguous
|
|
42
|
+
|
|
43
|
+
If no repos have `release_branch` set, tell user:
|
|
44
|
+
> "No release repos configured. Run `droid repos add` and set a release branch to get started."
|
|
45
|
+
|
|
46
|
+
## Commands
|
|
47
|
+
|
|
48
|
+
| Command | Action |
|
|
49
|
+
|---------|--------|
|
|
50
|
+
| `/release start [repo]` | Create release PR + notify Slack |
|
|
51
|
+
| `/release status` | Check open release PRs + CI state |
|
|
52
|
+
| `/release complete [repo]` | Post completion to Slack |
|
|
53
|
+
|
|
54
|
+
See `references/workflows.md` for detailed step-by-step procedures and exact `gh` commands.
|
|
55
|
+
|
|
56
|
+
See `references/templates.md` for Slack message and PR body templates.
|
|
57
|
+
|
|
58
|
+
## Repo Detection
|
|
59
|
+
|
|
60
|
+
1. Get cwd and match against configured repo paths
|
|
61
|
+
2. If match found and repo has `release_branch`, use it
|
|
62
|
+
3. If no match or multiple release repos, ask user to pick
|
|
63
|
+
4. Use `release_branch` as source and `production_branch` (default: `master`) as target
|
|
64
|
+
|
|
65
|
+
## Error Handling
|
|
66
|
+
|
|
67
|
+
| Error | Action |
|
|
68
|
+
|-------|--------|
|
|
69
|
+
| No release repos configured | Suggest `droid repos add` with release branch |
|
|
70
|
+
| `gh` CLI not authenticated | Suggest `gh auth login` |
|
|
71
|
+
| Slack not configured | Print message to terminal, suggest `droid integrations setup slack` |
|
|
72
|
+
| Release PR already exists | Show existing PR, ask if user wants to proceed |
|
|
73
|
+
| CI checks failing | Show status, do not auto-merge |
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Release Templates
|
|
2
|
+
|
|
3
|
+
Slack mrkdwn and PR body templates for release notifications.
|
|
4
|
+
|
|
5
|
+
## Slack Messages
|
|
6
|
+
|
|
7
|
+
All Slack messages are posted via `droid integrations slack post`. Format as Slack mrkdwn (not GitHub markdown).
|
|
8
|
+
|
|
9
|
+
### Release Started
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
:rocket: *Release started — {repo_name}*
|
|
13
|
+
|
|
14
|
+
*Risk:* {risk_emoji} {risk_level}
|
|
15
|
+
*PR:* <{pr_url}|#{pr_number}>
|
|
16
|
+
*Branch:* `{release_branch}` → `{production_branch}`
|
|
17
|
+
|
|
18
|
+
{pr_summary}
|
|
19
|
+
|
|
20
|
+
Posted with :droid:
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Risk emojis:
|
|
24
|
+
- Low Risk: `:large_green_circle:`
|
|
25
|
+
- High Risk: `:warning:`
|
|
26
|
+
|
|
27
|
+
### Release Complete
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
:white_check_mark: *Release complete — {repo_name}*
|
|
31
|
+
|
|
32
|
+
*PR:* <{pr_url}|#{pr_number}>
|
|
33
|
+
*Branch:* `{release_branch}` → `{production_branch}`
|
|
34
|
+
|
|
35
|
+
Posted with :droid:
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Release PR Body
|
|
41
|
+
|
|
42
|
+
Used when creating the release PR via `gh pr create --body`.
|
|
43
|
+
|
|
44
|
+
```markdown
|
|
45
|
+
### {repo_name} Release
|
|
46
|
+
|
|
47
|
+
**Risk:** [{risk_level}]
|
|
48
|
+
|
|
49
|
+
**When:** Imminent
|
|
50
|
+
|
|
51
|
+
**PRs included:**
|
|
52
|
+
{pr_list}
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
Created with :robot: [droid](https://github.com/Orderful/droid)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Where `{pr_list}` is a bulleted list of merged PRs:
|
|
60
|
+
```markdown
|
|
61
|
+
- #{number} {title} (@{author})
|
|
62
|
+
- #{number} {title} (@{author})
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Terminal Fallback
|
|
68
|
+
|
|
69
|
+
When Slack is not configured, print a plain-text version to terminal:
|
|
70
|
+
|
|
71
|
+
### Release Started (terminal)
|
|
72
|
+
```
|
|
73
|
+
Release started — {repo_name}
|
|
74
|
+
Risk: {risk_level}
|
|
75
|
+
PR: {pr_url}
|
|
76
|
+
Branch: {release_branch} -> {production_branch}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Release Complete (terminal)
|
|
80
|
+
```
|
|
81
|
+
Release complete — {repo_name}
|
|
82
|
+
PR: {pr_url}
|
|
83
|
+
```
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# Release Workflows
|
|
2
|
+
|
|
3
|
+
Detailed step-by-step procedures for each `/release` subcommand. All commands use `gh` CLI directly.
|
|
4
|
+
|
|
5
|
+
## Common Setup (every command)
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 1. Read config
|
|
9
|
+
SLACK_CHANNEL=$(droid config --get tools.release.slack_channel)
|
|
10
|
+
# Default to #release-management if not set
|
|
11
|
+
SLACK_CHANNEL="${SLACK_CHANNEL:-#release-management}"
|
|
12
|
+
|
|
13
|
+
# 2. Get repos and filter for release repos (those with release_branch set)
|
|
14
|
+
droid config --get repos
|
|
15
|
+
# Parse JSON output — release repos have release_branch defined
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Detect repo from cwd or ask user. Extract `release_branch`, `production_branch` (default: `master`), and the GitHub `owner/repo` slug from the repo's remote.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Get owner/repo from git remote
|
|
22
|
+
git -C {repo_path} remote get-url origin
|
|
23
|
+
# Parse to extract owner/repo (e.g., "Orderful/orderful-workspace")
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## `/release start [repo]`
|
|
29
|
+
|
|
30
|
+
Create a release PR and notify Slack.
|
|
31
|
+
|
|
32
|
+
### Steps
|
|
33
|
+
|
|
34
|
+
1. **Detect repo** — match cwd or ask user to pick from release repos
|
|
35
|
+
|
|
36
|
+
2. **Check for existing release PR:**
|
|
37
|
+
```bash
|
|
38
|
+
gh pr list --search "[RELEASE]" --state open --base {production_branch} --head {release_branch} --json number,title,url --repo {owner}/{repo}
|
|
39
|
+
```
|
|
40
|
+
If one exists, show it and ask: "A release PR already exists. Open it instead?"
|
|
41
|
+
|
|
42
|
+
3. **Generate release notes** — list PRs merged to the release branch since last release:
|
|
43
|
+
```bash
|
|
44
|
+
gh pr list --base {release_branch} --state merged --json number,title,author --limit 50 --repo {owner}/{repo}
|
|
45
|
+
```
|
|
46
|
+
Format as a bulleted list for the PR body.
|
|
47
|
+
|
|
48
|
+
4. **Ask risk level** — use AskUserQuestion:
|
|
49
|
+
- Low Risk (routine release, no breaking changes)
|
|
50
|
+
- High Risk (breaking changes, data migrations, or high-traffic feature)
|
|
51
|
+
|
|
52
|
+
5. **Create the release PR:**
|
|
53
|
+
```bash
|
|
54
|
+
gh pr create \
|
|
55
|
+
--base {production_branch} \
|
|
56
|
+
--head {release_branch} \
|
|
57
|
+
--title "[RELEASE] {repo_name}" \
|
|
58
|
+
--label "READY" \
|
|
59
|
+
--body "{release_pr_body}" \
|
|
60
|
+
--repo {owner}/{repo}
|
|
61
|
+
```
|
|
62
|
+
See `templates.md` for the PR body template.
|
|
63
|
+
|
|
64
|
+
6. **Post to Slack:**
|
|
65
|
+
```bash
|
|
66
|
+
node -e 'process.stdout.write(JSON.stringify({
|
|
67
|
+
channel: "{slack_channel}",
|
|
68
|
+
text: "{slack_message}",
|
|
69
|
+
unfurl_links: false
|
|
70
|
+
}))' | droid integrations slack post
|
|
71
|
+
```
|
|
72
|
+
See `templates.md` for the Slack message template (release started).
|
|
73
|
+
|
|
74
|
+
7. **Confirm to user** — show PR URL and Slack post confirmation.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## `/release status`
|
|
79
|
+
|
|
80
|
+
Check release status across all configured release repos.
|
|
81
|
+
|
|
82
|
+
### Steps
|
|
83
|
+
|
|
84
|
+
1. **Get all release repos** from config
|
|
85
|
+
|
|
86
|
+
2. **For each release repo**, gather:
|
|
87
|
+
|
|
88
|
+
**Open release PRs:**
|
|
89
|
+
```bash
|
|
90
|
+
gh pr list --search "[RELEASE]" --state open --json number,title,url,statusCheckRollup --repo {owner}/{repo}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
3. **Format and display** as a summary:
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
{repo_name}
|
|
97
|
+
Release PR: #{number} — {CI status} (green/pending/failing)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
If no open release PR: "No active release"
|
|
101
|
+
If no release repos configured: "No release repos configured"
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## `/release complete [repo]`
|
|
106
|
+
|
|
107
|
+
Close out a release — notify Slack.
|
|
108
|
+
|
|
109
|
+
### Steps
|
|
110
|
+
|
|
111
|
+
1. **Detect repo** — match cwd or ask user
|
|
112
|
+
|
|
113
|
+
2. **Find the release PR:**
|
|
114
|
+
```bash
|
|
115
|
+
# Check merged first
|
|
116
|
+
gh pr list --search "[RELEASE]" --state merged --base {production_branch} --head {release_branch} --json number,title,url,mergedAt --limit 1 --repo {owner}/{repo}
|
|
117
|
+
```
|
|
118
|
+
If no merged PR found, check open:
|
|
119
|
+
```bash
|
|
120
|
+
gh pr list --search "[RELEASE]" --state open --base {production_branch} --head {release_branch} --json number,title,url --repo {owner}/{repo}
|
|
121
|
+
```
|
|
122
|
+
- If PR is still open (not merged): warn "Release PR #{number} is still open. Merge it first, or complete anyway?"
|
|
123
|
+
- If no PR found at all: warn "No release PR found. Post completion anyway?"
|
|
124
|
+
|
|
125
|
+
3. **Post to Slack** — release complete notification (see `templates.md`).
|
|
126
|
+
|
|
127
|
+
4. **Confirm to user:**
|
|
128
|
+
- "Release complete for `{repo_name}`"
|
|
129
|
+
- Show Slack message confirmation
|