@simonfestl/husky-cli 0.6.0 → 0.6.1
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/README.md +23 -0
- package/dist/commands/roadmap.js +107 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -160,6 +160,8 @@ husky roadmap create "Q1 2025" --description "..."
|
|
|
160
160
|
husky roadmap update <roadmap-id> --name "Updated"
|
|
161
161
|
husky roadmap delete <roadmap-id>
|
|
162
162
|
husky roadmap add-phase <roadmap-id> --name "Phase 1"
|
|
163
|
+
husky roadmap update-phase <roadmap-id> <phase-id> --name "Updated"
|
|
164
|
+
husky roadmap delete-phase <roadmap-id> <phase-id> --force
|
|
163
165
|
husky roadmap add-feature <roadmap-id> --phase <id> --title "Feature"
|
|
164
166
|
husky roadmap list-features <roadmap-id>
|
|
165
167
|
husky roadmap update-feature <roadmap-id> <feature-id> --status done
|
|
@@ -187,6 +189,20 @@ husky vm-config update <config-id> --machine-type e2-standard-2
|
|
|
187
189
|
husky vm-config delete <config-id>
|
|
188
190
|
```
|
|
189
191
|
|
|
192
|
+
### Git Worktree Management
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
husky worktree list # List all worktrees
|
|
196
|
+
husky worktree create <session-name> # Create worktree
|
|
197
|
+
husky worktree info <session-name> # Show details
|
|
198
|
+
husky worktree status [session-name] # Show status
|
|
199
|
+
husky worktree cd <session-name> # Print path
|
|
200
|
+
husky worktree merge <session-name> # Merge to base
|
|
201
|
+
husky worktree remove <session-name> # Remove worktree
|
|
202
|
+
husky worktree branches # List husky/* branches
|
|
203
|
+
husky worktree cleanup # Clean stale worktrees
|
|
204
|
+
```
|
|
205
|
+
|
|
190
206
|
### Settings
|
|
191
207
|
|
|
192
208
|
```bash
|
|
@@ -283,6 +299,13 @@ husky --version
|
|
|
283
299
|
|
|
284
300
|
## Changelog
|
|
285
301
|
|
|
302
|
+
### v0.6.0 (2026-01-06)
|
|
303
|
+
- Added: Git Worktree support for multi-agent isolation
|
|
304
|
+
- Added: `husky worktree` commands (create, list, merge, remove, etc.)
|
|
305
|
+
- Added: MergeLock mechanism for safe concurrent operations
|
|
306
|
+
- Refactored: Interactive mode into modular components
|
|
307
|
+
- Improved: Based on Auto-Claude's worktree architecture
|
|
308
|
+
|
|
286
309
|
### v0.5.0 (2026-01-06)
|
|
287
310
|
- Full Dashboard feature parity (69 new commands)
|
|
288
311
|
- Added: project, workflow, idea, department, vm, jules, process, strategy, settings, vm-config commands
|
package/dist/commands/roadmap.js
CHANGED
|
@@ -152,6 +152,113 @@ roadmapCommand
|
|
|
152
152
|
process.exit(1);
|
|
153
153
|
}
|
|
154
154
|
});
|
|
155
|
+
// husky roadmap update-phase <roadmapId> <phaseId>
|
|
156
|
+
roadmapCommand
|
|
157
|
+
.command("update-phase <roadmapId> <phaseId>")
|
|
158
|
+
.description("Update a roadmap phase")
|
|
159
|
+
.option("-n, --name <name>", "New phase name")
|
|
160
|
+
.option("-d, --description <description>", "New phase description")
|
|
161
|
+
.option("--status <status>", "Phase status (planned, in_progress, completed)")
|
|
162
|
+
.option("--order <order>", "Phase order (0-based)")
|
|
163
|
+
.action(async (roadmapId, phaseId, options) => {
|
|
164
|
+
const config = ensureConfig();
|
|
165
|
+
// Build update payload
|
|
166
|
+
const updateData = { phaseId };
|
|
167
|
+
if (options.name)
|
|
168
|
+
updateData.name = options.name;
|
|
169
|
+
if (options.description)
|
|
170
|
+
updateData.description = options.description;
|
|
171
|
+
if (options.status) {
|
|
172
|
+
const validStatuses = ["planned", "in_progress", "completed"];
|
|
173
|
+
if (!validStatuses.includes(options.status)) {
|
|
174
|
+
console.error(`Error: Invalid status "${options.status}". Must be one of: ${validStatuses.join(", ")}`);
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
updateData.status = options.status;
|
|
178
|
+
}
|
|
179
|
+
if (options.order !== undefined) {
|
|
180
|
+
const order = parseInt(options.order, 10);
|
|
181
|
+
if (isNaN(order) || order < 0) {
|
|
182
|
+
console.error("Error: Order must be a non-negative integer");
|
|
183
|
+
process.exit(1);
|
|
184
|
+
}
|
|
185
|
+
updateData.order = order;
|
|
186
|
+
}
|
|
187
|
+
if (Object.keys(updateData).length === 1) {
|
|
188
|
+
console.error("Error: No update options provided. Use -n/--name, -d/--description, --status, or --order");
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
try {
|
|
192
|
+
const res = await fetch(`${config.apiUrl}/api/roadmaps/${roadmapId}/phases`, {
|
|
193
|
+
method: "PATCH",
|
|
194
|
+
headers: {
|
|
195
|
+
"Content-Type": "application/json",
|
|
196
|
+
...(config.apiKey ? { "x-api-key": config.apiKey } : {}),
|
|
197
|
+
},
|
|
198
|
+
body: JSON.stringify(updateData),
|
|
199
|
+
});
|
|
200
|
+
if (!res.ok) {
|
|
201
|
+
if (res.status === 404) {
|
|
202
|
+
console.error(`Error: Roadmap or phase not found`);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
const errorBody = await res.json().catch(() => ({}));
|
|
206
|
+
console.error(`Error: API returned ${res.status}`, errorBody.error || "");
|
|
207
|
+
}
|
|
208
|
+
process.exit(1);
|
|
209
|
+
}
|
|
210
|
+
const roadmap = await res.json();
|
|
211
|
+
const updatedPhase = roadmap.phases.find((p) => p.id === phaseId);
|
|
212
|
+
console.log(`✓ Phase updated successfully`);
|
|
213
|
+
if (updatedPhase) {
|
|
214
|
+
console.log(` Name: ${updatedPhase.name}`);
|
|
215
|
+
console.log(` Status: ${updatedPhase.status}`);
|
|
216
|
+
console.log(` Order: ${updatedPhase.order}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
console.error("Error updating phase:", error);
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
// husky roadmap delete-phase <roadmapId> <phaseId>
|
|
225
|
+
roadmapCommand
|
|
226
|
+
.command("delete-phase <roadmapId> <phaseId>")
|
|
227
|
+
.description("Delete a phase from a roadmap (including all its features)")
|
|
228
|
+
.option("--force", "Skip confirmation")
|
|
229
|
+
.action(async (roadmapId, phaseId, options) => {
|
|
230
|
+
const config = ensureConfig();
|
|
231
|
+
if (!options.force) {
|
|
232
|
+
console.log("Warning: This will permanently delete the phase and all its features.");
|
|
233
|
+
console.log("Use --force to confirm deletion.");
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
try {
|
|
237
|
+
const url = new URL(`/api/roadmaps/${roadmapId}/phases`, config.apiUrl);
|
|
238
|
+
url.searchParams.set("phaseId", phaseId);
|
|
239
|
+
const res = await fetch(url.toString(), {
|
|
240
|
+
method: "DELETE",
|
|
241
|
+
headers: config.apiKey ? { "x-api-key": config.apiKey } : {},
|
|
242
|
+
});
|
|
243
|
+
if (!res.ok) {
|
|
244
|
+
if (res.status === 404) {
|
|
245
|
+
console.error(`Error: Roadmap or phase not found`);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
const errorBody = await res.json().catch(() => ({}));
|
|
249
|
+
console.error(`Error: API returned ${res.status}`, errorBody.error || "");
|
|
250
|
+
}
|
|
251
|
+
process.exit(1);
|
|
252
|
+
}
|
|
253
|
+
const roadmap = await res.json();
|
|
254
|
+
console.log(`✓ Phase deleted`);
|
|
255
|
+
console.log(` Remaining phases: ${roadmap.phases.length}`);
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
console.error("Error deleting phase:", error);
|
|
259
|
+
process.exit(1);
|
|
260
|
+
}
|
|
261
|
+
});
|
|
155
262
|
// husky roadmap add-feature <roadmapId> <phaseId> <title>
|
|
156
263
|
roadmapCommand
|
|
157
264
|
.command("add-feature <roadmapId> <phaseId> <title>")
|
package/dist/index.js
CHANGED
|
@@ -23,7 +23,7 @@ const program = new Command();
|
|
|
23
23
|
program
|
|
24
24
|
.name("husky")
|
|
25
25
|
.description("CLI for Huskyv0 Task Orchestration with Claude Agent")
|
|
26
|
-
.version("0.
|
|
26
|
+
.version("0.6.0");
|
|
27
27
|
program.addCommand(taskCommand);
|
|
28
28
|
program.addCommand(configCommand);
|
|
29
29
|
program.addCommand(agentCommand);
|