@orderful/droid 0.42.1 → 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 +6 -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/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/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
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"./src/tools/meeting/skills/meeting/SKILL.md",
|
|
26
26
|
"./src/tools/plan/skills/plan/SKILL.md",
|
|
27
27
|
"./src/tools/project/skills/project/SKILL.md",
|
|
28
|
+
"./src/tools/release/skills/release/SKILL.md",
|
|
28
29
|
"./src/tools/share/skills/share/SKILL.md",
|
|
29
30
|
"./src/tools/status-update/skills/status-update/SKILL.md",
|
|
30
31
|
"./src/tools/tech-design/skills/tech-design/SKILL.md",
|
|
@@ -40,6 +41,7 @@
|
|
|
40
41
|
"./src/tools/meeting/commands/meeting.md",
|
|
41
42
|
"./src/tools/plan/commands/plan.md",
|
|
42
43
|
"./src/tools/project/commands/project.md",
|
|
44
|
+
"./src/tools/release/commands/release.md",
|
|
43
45
|
"./src/tools/share/commands/share.md",
|
|
44
46
|
"./src/tools/status-update/commands/status-update.md",
|
|
45
47
|
"./src/tools/tech-design/commands/tech-design.md",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @orderful/droid
|
|
2
2
|
|
|
3
|
+
## 0.43.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#256](https://github.com/Orderful/droid/pull/256) [`a90fd0d`](https://github.com/Orderful/droid/commit/a90fd0d7640c2fbf3ee9645e58aa7cc6e5b698ff) Thanks [@frytyler](https://github.com/frytyler)! - Add release tool for ceremony automation — create release PRs, check status, and notify Slack. Extends RepoConfig with optional release_branch and production_branch fields for config-driven release repos.
|
|
8
|
+
|
|
3
9
|
## 0.42.1
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
package/dist/bin/droid.js
CHANGED
|
@@ -3999,7 +3999,10 @@ function ReposManagementScreen({ onComplete: _onComplete, onCancel }) {
|
|
|
3999
3999
|
const [newRepoName, setNewRepoName] = useState7("");
|
|
4000
4000
|
const [newRepoPath, setNewRepoPath] = useState7("");
|
|
4001
4001
|
const [newRepoDesc, setNewRepoDesc] = useState7("");
|
|
4002
|
-
const [
|
|
4002
|
+
const [activeRepo, setActiveRepo] = useState7(null);
|
|
4003
|
+
const [actionIndex, setActionIndex] = useState7(0);
|
|
4004
|
+
const [editReleaseBranch, setEditReleaseBranch] = useState7("");
|
|
4005
|
+
const [editProductionBranch, setEditProductionBranch] = useState7("");
|
|
4003
4006
|
const handleAddRepo = () => {
|
|
4004
4007
|
if (!newRepoName || !newRepoPath) {
|
|
4005
4008
|
setMessage({ text: "Name and path are required", type: "error" });
|
|
@@ -4022,12 +4025,26 @@ function ReposManagementScreen({ onComplete: _onComplete, onCancel }) {
|
|
|
4022
4025
|
removeRepo(repoName);
|
|
4023
4026
|
setRepos(getRepos());
|
|
4024
4027
|
setMessage({ text: `Removed ${repoName}`, type: "success" });
|
|
4025
|
-
|
|
4028
|
+
setActiveRepo(null);
|
|
4026
4029
|
setScreen("list");
|
|
4027
4030
|
if (selectedIndex >= repos2.length - 1) {
|
|
4028
4031
|
setSelectedIndex(Math.max(0, repos2.length - 2));
|
|
4029
4032
|
}
|
|
4030
4033
|
};
|
|
4034
|
+
const handleSaveReleaseBranches = () => {
|
|
4035
|
+
if (!activeRepo) return;
|
|
4036
|
+
const updated = {
|
|
4037
|
+
...activeRepo,
|
|
4038
|
+
release_branch: editReleaseBranch || void 0,
|
|
4039
|
+
production_branch: editReleaseBranch ? editProductionBranch || "master" : void 0
|
|
4040
|
+
};
|
|
4041
|
+
addRepo(updated);
|
|
4042
|
+
setRepos(getRepos());
|
|
4043
|
+
const label = editReleaseBranch ? `Set release: ${editReleaseBranch} \u2192 ${editProductionBranch || "master"}` : "Cleared release branches";
|
|
4044
|
+
setMessage({ text: `${activeRepo.name}: ${label}`, type: "success" });
|
|
4045
|
+
setActiveRepo(null);
|
|
4046
|
+
setScreen("list");
|
|
4047
|
+
};
|
|
4031
4048
|
useInput7((input, key) => {
|
|
4032
4049
|
if (message) setMessage(null);
|
|
4033
4050
|
if (key.escape) {
|
|
@@ -4045,11 +4062,34 @@ function ReposManagementScreen({ onComplete: _onComplete, onCancel }) {
|
|
|
4045
4062
|
if (selectedIndex === repos2.length) {
|
|
4046
4063
|
setScreen("add-name");
|
|
4047
4064
|
} else if (selectedIndex < repos2.length) {
|
|
4048
|
-
|
|
4049
|
-
|
|
4065
|
+
setActiveRepo(repos2[selectedIndex]);
|
|
4066
|
+
setActionIndex(0);
|
|
4067
|
+
setScreen("repo-actions");
|
|
4050
4068
|
}
|
|
4051
4069
|
}
|
|
4052
4070
|
}, { isActive: screen === "list" });
|
|
4071
|
+
useInput7((input, key) => {
|
|
4072
|
+
if (key.escape) {
|
|
4073
|
+
setActiveRepo(null);
|
|
4074
|
+
setScreen("list");
|
|
4075
|
+
return;
|
|
4076
|
+
}
|
|
4077
|
+
if (key.upArrow) {
|
|
4078
|
+
setActionIndex((prev) => Math.max(0, prev - 1));
|
|
4079
|
+
}
|
|
4080
|
+
if (key.downArrow) {
|
|
4081
|
+
setActionIndex((prev) => Math.min(1, prev + 1));
|
|
4082
|
+
}
|
|
4083
|
+
if (key.return && activeRepo) {
|
|
4084
|
+
if (actionIndex === 0) {
|
|
4085
|
+
setEditReleaseBranch(activeRepo.release_branch || "");
|
|
4086
|
+
setEditProductionBranch(activeRepo.production_branch || "");
|
|
4087
|
+
setScreen("edit-release-branch");
|
|
4088
|
+
} else {
|
|
4089
|
+
setScreen("confirm-delete");
|
|
4090
|
+
}
|
|
4091
|
+
}
|
|
4092
|
+
}, { isActive: screen === "repo-actions" });
|
|
4053
4093
|
useInput7((input, key) => {
|
|
4054
4094
|
if (key.escape) {
|
|
4055
4095
|
setNewRepoName("");
|
|
@@ -4068,13 +4108,22 @@ function ReposManagementScreen({ onComplete: _onComplete, onCancel }) {
|
|
|
4068
4108
|
setScreen("add-path");
|
|
4069
4109
|
}
|
|
4070
4110
|
}, { isActive: screen === "add-desc" });
|
|
4111
|
+
useInput7((input, key) => {
|
|
4112
|
+
if (key.escape) {
|
|
4113
|
+
setScreen("repo-actions");
|
|
4114
|
+
}
|
|
4115
|
+
}, { isActive: screen === "edit-release-branch" });
|
|
4116
|
+
useInput7((input, key) => {
|
|
4117
|
+
if (key.escape) {
|
|
4118
|
+
setScreen("edit-release-branch");
|
|
4119
|
+
}
|
|
4120
|
+
}, { isActive: screen === "edit-production-branch" });
|
|
4071
4121
|
useInput7((input, key) => {
|
|
4072
4122
|
if (key.escape || input === "n") {
|
|
4073
|
-
|
|
4074
|
-
setScreen("list");
|
|
4123
|
+
setScreen("repo-actions");
|
|
4075
4124
|
}
|
|
4076
|
-
if (input === "y" &&
|
|
4077
|
-
handleDeleteRepo(
|
|
4125
|
+
if (input === "y" && activeRepo) {
|
|
4126
|
+
handleDeleteRepo(activeRepo.name);
|
|
4078
4127
|
}
|
|
4079
4128
|
}, { isActive: screen === "confirm-delete" });
|
|
4080
4129
|
if (screen === "add-name") {
|
|
@@ -4153,13 +4202,93 @@ function ReposManagementScreen({ onComplete: _onComplete, onCancel }) {
|
|
|
4153
4202
|
/* @__PURE__ */ jsx15(Box14, { marginTop: 1, children: /* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: "enter save \xB7 esc back" }) })
|
|
4154
4203
|
] });
|
|
4155
4204
|
}
|
|
4156
|
-
if (screen === "
|
|
4157
|
-
const
|
|
4205
|
+
if (screen === "repo-actions" && activeRepo) {
|
|
4206
|
+
const actions = ["Edit release branches", "Remove repository"];
|
|
4207
|
+
return /* @__PURE__ */ jsxs14(Box14, { flexDirection: "column", padding: 2, children: [
|
|
4208
|
+
/* @__PURE__ */ jsx15(Text15, { color: colors.text, bold: true, children: activeRepo.name }),
|
|
4209
|
+
/* @__PURE__ */ jsx15(Box14, { marginTop: 0, children: /* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: activeRepo.path }) }),
|
|
4210
|
+
activeRepo.release_branch && /* @__PURE__ */ jsx15(Box14, { marginTop: 0, children: /* @__PURE__ */ jsxs14(Text15, { color: colors.textDim, children: [
|
|
4211
|
+
"Release: ",
|
|
4212
|
+
activeRepo.release_branch,
|
|
4213
|
+
" \u2192 ",
|
|
4214
|
+
activeRepo.production_branch || "master"
|
|
4215
|
+
] }) }),
|
|
4216
|
+
/* @__PURE__ */ jsx15(Box14, { flexDirection: "column", marginTop: 1, children: actions.map((action, index) => /* @__PURE__ */ jsx15(Box14, { children: /* @__PURE__ */ jsxs14(
|
|
4217
|
+
Text15,
|
|
4218
|
+
{
|
|
4219
|
+
color: actionIndex === index ? colors.primary : index === 1 ? colors.error : colors.text,
|
|
4220
|
+
bold: actionIndex === index,
|
|
4221
|
+
children: [
|
|
4222
|
+
actionIndex === index ? "> " : " ",
|
|
4223
|
+
action
|
|
4224
|
+
]
|
|
4225
|
+
}
|
|
4226
|
+
) }, action)) }),
|
|
4227
|
+
/* @__PURE__ */ jsx15(Box14, { marginTop: 2, children: /* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: "\u2191\u2193 navigate \xB7 enter select \xB7 esc back" }) })
|
|
4228
|
+
] });
|
|
4229
|
+
}
|
|
4230
|
+
if (screen === "edit-release-branch" && activeRepo) {
|
|
4231
|
+
return /* @__PURE__ */ jsxs14(Box14, { flexDirection: "column", padding: 2, children: [
|
|
4232
|
+
/* @__PURE__ */ jsxs14(Text15, { color: colors.text, bold: true, children: [
|
|
4233
|
+
"Edit Release Branches \u2014 ",
|
|
4234
|
+
activeRepo.name
|
|
4235
|
+
] }),
|
|
4236
|
+
/* @__PURE__ */ jsxs14(Box14, { marginTop: 1, children: [
|
|
4237
|
+
/* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: 'Release branch (e.g. "dev", blank to clear): ' }),
|
|
4238
|
+
/* @__PURE__ */ jsx15(
|
|
4239
|
+
TextInput3,
|
|
4240
|
+
{
|
|
4241
|
+
value: editReleaseBranch,
|
|
4242
|
+
onChange: setEditReleaseBranch,
|
|
4243
|
+
onSubmit: () => {
|
|
4244
|
+
if (editReleaseBranch) {
|
|
4245
|
+
setScreen("edit-production-branch");
|
|
4246
|
+
} else {
|
|
4247
|
+
handleSaveReleaseBranches();
|
|
4248
|
+
}
|
|
4249
|
+
},
|
|
4250
|
+
placeholder: activeRepo.release_branch || "dev"
|
|
4251
|
+
}
|
|
4252
|
+
)
|
|
4253
|
+
] }),
|
|
4254
|
+
/* @__PURE__ */ jsx15(Box14, { marginTop: 1, children: /* @__PURE__ */ jsxs14(Text15, { color: colors.textDim, children: [
|
|
4255
|
+
"enter ",
|
|
4256
|
+
editReleaseBranch ? "next" : "clear & save",
|
|
4257
|
+
" \xB7 esc back"
|
|
4258
|
+
] }) })
|
|
4259
|
+
] });
|
|
4260
|
+
}
|
|
4261
|
+
if (screen === "edit-production-branch" && activeRepo) {
|
|
4262
|
+
return /* @__PURE__ */ jsxs14(Box14, { flexDirection: "column", padding: 2, children: [
|
|
4263
|
+
/* @__PURE__ */ jsxs14(Text15, { color: colors.text, bold: true, children: [
|
|
4264
|
+
"Edit Release Branches \u2014 ",
|
|
4265
|
+
activeRepo.name
|
|
4266
|
+
] }),
|
|
4267
|
+
/* @__PURE__ */ jsxs14(Box14, { marginTop: 1, children: [
|
|
4268
|
+
/* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: "Release branch: " }),
|
|
4269
|
+
/* @__PURE__ */ jsx15(Text15, { color: colors.text, children: editReleaseBranch })
|
|
4270
|
+
] }),
|
|
4271
|
+
/* @__PURE__ */ jsxs14(Box14, { marginTop: 1, children: [
|
|
4272
|
+
/* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: "Production branch: " }),
|
|
4273
|
+
/* @__PURE__ */ jsx15(
|
|
4274
|
+
TextInput3,
|
|
4275
|
+
{
|
|
4276
|
+
value: editProductionBranch,
|
|
4277
|
+
onChange: setEditProductionBranch,
|
|
4278
|
+
onSubmit: handleSaveReleaseBranches,
|
|
4279
|
+
placeholder: "master"
|
|
4280
|
+
}
|
|
4281
|
+
)
|
|
4282
|
+
] }),
|
|
4283
|
+
/* @__PURE__ */ jsx15(Box14, { marginTop: 1, children: /* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: "enter save \xB7 esc back" }) })
|
|
4284
|
+
] });
|
|
4285
|
+
}
|
|
4286
|
+
if (screen === "confirm-delete" && activeRepo) {
|
|
4158
4287
|
return /* @__PURE__ */ jsxs14(Box14, { flexDirection: "column", padding: 2, children: [
|
|
4159
4288
|
/* @__PURE__ */ jsx15(Text15, { color: colors.text, bold: true, children: "Remove Repository" }),
|
|
4160
4289
|
/* @__PURE__ */ jsxs14(Box14, { marginTop: 1, flexDirection: "column", children: [
|
|
4161
|
-
/* @__PURE__ */ jsx15(Text15, { color: colors.text, children:
|
|
4162
|
-
/* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children:
|
|
4290
|
+
/* @__PURE__ */ jsx15(Text15, { color: colors.text, children: activeRepo.name }),
|
|
4291
|
+
/* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: activeRepo.path })
|
|
4163
4292
|
] }),
|
|
4164
4293
|
/* @__PURE__ */ jsx15(Box14, { marginTop: 2, children: /* @__PURE__ */ jsx15(Text15, { color: colors.error, children: "Remove this repository from the registry?" }) }),
|
|
4165
4294
|
/* @__PURE__ */ jsx15(Box14, { marginTop: 1, children: /* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: "y yes \xB7 n no" }) })
|
|
@@ -4182,7 +4311,13 @@ function ReposManagementScreen({ onComplete: _onComplete, onCancel }) {
|
|
|
4182
4311
|
}
|
|
4183
4312
|
) }),
|
|
4184
4313
|
/* @__PURE__ */ jsx15(Box14, { paddingLeft: 2, children: /* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: repo.path }) }),
|
|
4185
|
-
repo.description && /* @__PURE__ */ jsx15(Box14, { paddingLeft: 2, children: /* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: repo.description }) })
|
|
4314
|
+
repo.description && /* @__PURE__ */ jsx15(Box14, { paddingLeft: 2, children: /* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: repo.description }) }),
|
|
4315
|
+
repo.release_branch && /* @__PURE__ */ jsx15(Box14, { paddingLeft: 2, children: /* @__PURE__ */ jsxs14(Text15, { color: colors.textDim, children: [
|
|
4316
|
+
"Release: ",
|
|
4317
|
+
repo.release_branch,
|
|
4318
|
+
" \u2192 ",
|
|
4319
|
+
repo.production_branch || "master"
|
|
4320
|
+
] }) })
|
|
4186
4321
|
] }, repo.name)),
|
|
4187
4322
|
/* @__PURE__ */ jsx15(Box14, { marginTop: repos2.length > 0 ? 2 : 0, children: /* @__PURE__ */ jsxs14(
|
|
4188
4323
|
Text15,
|
|
@@ -4196,7 +4331,7 @@ function ReposManagementScreen({ onComplete: _onComplete, onCancel }) {
|
|
|
4196
4331
|
}
|
|
4197
4332
|
) })
|
|
4198
4333
|
] }),
|
|
4199
|
-
/* @__PURE__ */ jsx15(Box14, { marginTop: 2, children: /* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: repos2.length > 0 && selectedIndex < repos2.length ? "enter
|
|
4334
|
+
/* @__PURE__ */ jsx15(Box14, { marginTop: 2, children: /* @__PURE__ */ jsx15(Text15, { color: colors.textDim, children: repos2.length > 0 && selectedIndex < repos2.length ? "enter edit \xB7 esc back" : "\u2191\u2193 navigate \xB7 enter select \xB7 esc back" }) })
|
|
4200
4335
|
] });
|
|
4201
4336
|
}
|
|
4202
4337
|
|
|
@@ -4218,7 +4353,13 @@ function ReposViewerScreen({ onClose }) {
|
|
|
4218
4353
|
"Path: ",
|
|
4219
4354
|
repo.path
|
|
4220
4355
|
] }) }),
|
|
4221
|
-
repo.description && /* @__PURE__ */ jsx16(Box15, { marginTop: 0, children: /* @__PURE__ */ jsx16(Text16, { color: colors.textDim, children: repo.description }) })
|
|
4356
|
+
repo.description && /* @__PURE__ */ jsx16(Box15, { marginTop: 0, children: /* @__PURE__ */ jsx16(Text16, { color: colors.textDim, children: repo.description }) }),
|
|
4357
|
+
repo.release_branch && /* @__PURE__ */ jsx16(Box15, { marginTop: 0, children: /* @__PURE__ */ jsxs15(Text16, { color: colors.textDim, children: [
|
|
4358
|
+
"Release: ",
|
|
4359
|
+
repo.release_branch,
|
|
4360
|
+
" \u2192 ",
|
|
4361
|
+
repo.production_branch || "master"
|
|
4362
|
+
] }) })
|
|
4222
4363
|
] }, repo.name)) }),
|
|
4223
4364
|
/* @__PURE__ */ jsx16(Box15, { marginTop: 2, children: /* @__PURE__ */ jsx16(Text16, { color: colors.textDim, children: "esc back" }) })
|
|
4224
4365
|
] });
|
|
@@ -5010,6 +5151,10 @@ async function reposListCommand(options) {
|
|
|
5010
5151
|
if (repo.description) {
|
|
5011
5152
|
console.log(chalk10.gray(` ${repo.description}`));
|
|
5012
5153
|
}
|
|
5154
|
+
if (repo.release_branch) {
|
|
5155
|
+
const prod = repo.production_branch || "master";
|
|
5156
|
+
console.log(chalk10.gray(` Release: ${repo.release_branch} \u2192 ${prod}`));
|
|
5157
|
+
}
|
|
5013
5158
|
console.log();
|
|
5014
5159
|
}
|
|
5015
5160
|
}
|
|
@@ -5050,6 +5195,26 @@ async function reposAddCommand(name, path, description) {
|
|
|
5050
5195
|
]);
|
|
5051
5196
|
repoDescription = answers.description || void 0;
|
|
5052
5197
|
}
|
|
5198
|
+
const releaseAnswers = await inquirer4.prompt([
|
|
5199
|
+
{
|
|
5200
|
+
type: "input",
|
|
5201
|
+
name: "release_branch",
|
|
5202
|
+
message: 'Release branch (optional, e.g. "dev"):'
|
|
5203
|
+
}
|
|
5204
|
+
]);
|
|
5205
|
+
const releaseBranch = releaseAnswers.release_branch || void 0;
|
|
5206
|
+
let productionBranch;
|
|
5207
|
+
if (releaseBranch) {
|
|
5208
|
+
const prodAnswers = await inquirer4.prompt([
|
|
5209
|
+
{
|
|
5210
|
+
type: "input",
|
|
5211
|
+
name: "production_branch",
|
|
5212
|
+
message: "Production branch:",
|
|
5213
|
+
default: "master"
|
|
5214
|
+
}
|
|
5215
|
+
]);
|
|
5216
|
+
productionBranch = prodAnswers.production_branch || "master";
|
|
5217
|
+
}
|
|
5053
5218
|
if (!repoName || !repoPath) {
|
|
5054
5219
|
console.error(chalk10.red("Name and path are required"));
|
|
5055
5220
|
return;
|
|
@@ -5057,7 +5222,9 @@ async function reposAddCommand(name, path, description) {
|
|
|
5057
5222
|
const repo = {
|
|
5058
5223
|
name: repoName,
|
|
5059
5224
|
path: repoPath,
|
|
5060
|
-
description: repoDescription
|
|
5225
|
+
description: repoDescription,
|
|
5226
|
+
...releaseBranch && { release_branch: releaseBranch },
|
|
5227
|
+
...productionBranch && { production_branch: productionBranch }
|
|
5061
5228
|
};
|
|
5062
5229
|
addRepo(repo);
|
|
5063
5230
|
const expandedPath = getRepoPath(repoName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repos.d.ts","sourceRoot":"","sources":["../../src/commands/repos.ts"],"names":[],"mappings":"AAWA,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"repos.d.ts","sourceRoot":"","sources":["../../src/commands/repos.ts"],"names":[],"mappings":"AAWA,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhF;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAuFf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDrE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASjE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReposManagementScreen.d.ts","sourceRoot":"","sources":["../../../../src/commands/tui/views/ReposManagementScreen.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"ReposManagementScreen.d.ts","sourceRoot":"","sources":["../../../../src/commands/tui/views/ReposManagementScreen.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAYD,wBAAgB,qBAAqB,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,0BAA0B,2CA6atG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReposViewerScreen.d.ts","sourceRoot":"","sources":["../../../../src/commands/tui/views/ReposViewerScreen.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"ReposViewerScreen.d.ts","sourceRoot":"","sources":["../../../../src/commands/tui/views/ReposViewerScreen.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,EAAE,sBAAsB,2CA6CpE"}
|
package/dist/lib/types.d.ts
CHANGED
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,UAAU,gBAAgB;IAC1B,QAAQ,aAAa;IACrB,MAAM,WAAW;IACjB,WAAW,iBAAiB;CAC7B;AAID,QAAA,MAAM,WAAW,iBAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,IAAI,MAAM,EAAE,CAAC;AACjC,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC;AAE9B;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAGD,oBAAY,aAAa;IACvB,QAAQ,aAAa;IACrB,MAAM,WAAW;CAClB;AAGD,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,MAAM,CAAC;AAEtD,oBAAY,WAAW;IACrB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,oBAAY,gBAAgB;IAC1B,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "droid-release",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Release ceremony automation — create release PRs, check status, notify Slack.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Orderful",
|
|
7
|
+
"url": "https://github.com/orderful"
|
|
8
|
+
},
|
|
9
|
+
"repository": "https://github.com/orderful/droid",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"keywords": [
|
|
12
|
+
"droid",
|
|
13
|
+
"ai",
|
|
14
|
+
"release"
|
|
15
|
+
],
|
|
16
|
+
"skills": [
|
|
17
|
+
"./skills/release/SKILL.md"
|
|
18
|
+
],
|
|
19
|
+
"commands": [
|
|
20
|
+
"./commands/release.md"
|
|
21
|
+
]
|
|
22
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
description: "Release ceremony automation — create release PRs, check status, notify Slack."
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
status: alpha
|
|
5
|
+
|
|
6
|
+
includes:
|
|
7
|
+
skills:
|
|
8
|
+
- name: release
|
|
9
|
+
required: true
|
|
10
|
+
commands:
|
|
11
|
+
- name: release
|
|
12
|
+
is_alias: false
|
|
13
|
+
agents: []
|
|
14
|
+
|
|
15
|
+
dependencies: []
|
|
16
|
+
|
|
17
|
+
config_schema:
|
|
18
|
+
slack_channel:
|
|
19
|
+
type: string
|
|
20
|
+
description: "Slack channel for release notifications"
|
|
21
|
+
default: "#release-management"
|
|
@@ -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
|
+
```
|