@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.
Files changed (31) hide show
  1. package/.claude-plugin/plugin.json +2 -0
  2. package/CHANGELOG.md +12 -0
  3. package/dist/bin/droid.js +183 -16
  4. package/dist/commands/repos.d.ts.map +1 -1
  5. package/dist/commands/tui/views/ReposManagementScreen.d.ts.map +1 -1
  6. package/dist/commands/tui/views/ReposViewerScreen.d.ts.map +1 -1
  7. package/dist/lib/types.d.ts +2 -0
  8. package/dist/lib/types.d.ts.map +1 -1
  9. package/dist/tools/meeting/.claude-plugin/plugin.json +1 -1
  10. package/dist/tools/meeting/TOOL.yaml +1 -1
  11. package/dist/tools/meeting/skills/meeting/SKILL.md +15 -7
  12. package/dist/tools/release/.claude-plugin/plugin.json +22 -0
  13. package/dist/tools/release/TOOL.yaml +21 -0
  14. package/dist/tools/release/commands/release.md +28 -0
  15. package/dist/tools/release/skills/release/SKILL.md +73 -0
  16. package/dist/tools/release/skills/release/references/templates.md +83 -0
  17. package/dist/tools/release/skills/release/references/workflows.md +129 -0
  18. package/package.json +1 -1
  19. package/src/commands/repos.ts +29 -0
  20. package/src/commands/tui/views/ReposManagementScreen.tsx +177 -16
  21. package/src/commands/tui/views/ReposViewerScreen.tsx +5 -0
  22. package/src/lib/types.ts +2 -0
  23. package/src/tools/meeting/.claude-plugin/plugin.json +1 -1
  24. package/src/tools/meeting/TOOL.yaml +1 -1
  25. package/src/tools/meeting/skills/meeting/SKILL.md +15 -7
  26. package/src/tools/release/.claude-plugin/plugin.json +22 -0
  27. package/src/tools/release/TOOL.yaml +21 -0
  28. package/src/tools/release/commands/release.md +28 -0
  29. package/src/tools/release/skills/release/SKILL.md +73 -0
  30. package/src/tools/release/skills/release/references/templates.md +83 -0
  31. 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