@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 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
@@ -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.5.2");
26
+ .version("0.6.0");
27
27
  program.addCommand(taskCommand);
28
28
  program.addCommand(configCommand);
29
29
  program.addCommand(agentCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simonfestl/husky-cli",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "CLI for Huskyv0 Task Orchestration with Claude Agent SDK",
5
5
  "type": "module",
6
6
  "bin": {