claude-code-workflow 6.3.40 → 6.3.42

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.
@@ -1220,6 +1220,81 @@ async function solutionAction(issueId: string | undefined, options: IssueOptions
1220
1220
  }
1221
1221
  }
1222
1222
 
1223
+ /**
1224
+ * solutions - Batch query solutions for multiple issues
1225
+ * Usage: ccw issue solutions --status planned --brief
1226
+ */
1227
+ async function solutionsAction(options: IssueOptions): Promise<void> {
1228
+ // Get issues filtered by status
1229
+ const issues = readIssues();
1230
+ let targetIssues = issues;
1231
+
1232
+ if (options.status) {
1233
+ const statuses = options.status.split(',').map((s: string) => s.trim());
1234
+ targetIssues = issues.filter((i: Issue) => statuses.includes(i.status));
1235
+ }
1236
+
1237
+ // Filter to only issues with bound_solution_id
1238
+ const boundIssues = targetIssues.filter((i: Issue) => i.bound_solution_id);
1239
+
1240
+ if (boundIssues.length === 0) {
1241
+ if (options.json || options.brief) {
1242
+ console.log('[]');
1243
+ } else {
1244
+ console.log(chalk.yellow('No bound solutions found'));
1245
+ }
1246
+ return;
1247
+ }
1248
+
1249
+ // Collect solutions for all bound issues
1250
+ const allSolutions: Array<{
1251
+ issue_id: string;
1252
+ solution_id: string;
1253
+ is_bound: boolean;
1254
+ task_count: number;
1255
+ files_touched: string[];
1256
+ priority?: number;
1257
+ }> = [];
1258
+
1259
+ for (const issue of boundIssues) {
1260
+ const solutions = readSolutions(issue.id);
1261
+ const boundSolution = solutions.find(s => s.id === issue.bound_solution_id);
1262
+
1263
+ if (boundSolution) {
1264
+ const filesTouched = new Set<string>();
1265
+ for (const task of boundSolution.tasks) {
1266
+ if (task.modification_points) {
1267
+ for (const mp of task.modification_points) {
1268
+ if (mp.file) filesTouched.add(mp.file);
1269
+ }
1270
+ }
1271
+ }
1272
+
1273
+ allSolutions.push({
1274
+ issue_id: issue.id,
1275
+ solution_id: boundSolution.id,
1276
+ is_bound: true,
1277
+ task_count: boundSolution.tasks.length,
1278
+ files_touched: Array.from(filesTouched),
1279
+ priority: issue.priority
1280
+ });
1281
+ }
1282
+ }
1283
+
1284
+ // Brief mode: already minimal
1285
+ if (options.brief || options.json) {
1286
+ console.log(JSON.stringify(allSolutions, null, 2));
1287
+ return;
1288
+ }
1289
+
1290
+ // Human-readable output
1291
+ console.log(chalk.bold.cyan(`\nBound Solutions (${allSolutions.length}):\n`));
1292
+ for (const sol of allSolutions) {
1293
+ console.log(`${chalk.green('◉')} ${sol.issue_id} → ${sol.solution_id}`);
1294
+ console.log(chalk.gray(` Tasks: ${sol.task_count}, Files: ${sol.files_touched.length}`));
1295
+ }
1296
+ }
1297
+
1223
1298
  /**
1224
1299
  * init - Initialize a new issue (manual ID)
1225
1300
  */
@@ -2832,6 +2907,9 @@ export async function issueCommand(
2832
2907
  case 'solution':
2833
2908
  await solutionAction(argsArray[0], options);
2834
2909
  break;
2910
+ case 'solutions':
2911
+ await solutionsAction(options);
2912
+ break;
2835
2913
  case 'init':
2836
2914
  await initAction(argsArray[0], options);
2837
2915
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-workflow",
3
- "version": "6.3.40",
3
+ "version": "6.3.42",
4
4
  "description": "JSON-driven multi-agent development framework with intelligent CLI orchestration (Gemini/Qwen/Codex), context-first architecture, and automated workflow execution",
5
5
  "type": "module",
6
6
  "main": "ccw/src/index.js",