mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-10 02:24:35 +08:00
fix(queue): streamline validation and status update logic in queue processing
This commit is contained in:
@@ -332,102 +332,30 @@ const summary = JSON.parse(result);
|
|||||||
### Phase 5: Validation & Status Update
|
### Phase 5: Validation & Status Update
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
// ============ VALIDATION: Prevent "next returns empty" issues ============
|
const queuePath = `.workflow/issues/queues/${queueId}.json`;
|
||||||
|
|
||||||
const queuesDir = '.workflow/issues/queues';
|
// 1. Validate queue has solutions
|
||||||
const indexPath = `${queuesDir}/index.json`;
|
const solCount = Bash(`jq ".solutions | length" "${queuePath}"`).trim();
|
||||||
const queuePath = `${queuesDir}/${queueId}.json`;
|
if (!solCount || solCount === '0') {
|
||||||
|
console.error(`✗ Queue has no solutions. Aborting.`);
|
||||||
// 1. Validate index.json has active_queue_id
|
|
||||||
const indexContent = Bash(`cat "${indexPath}" 2>/dev/null || echo '{}'`);
|
|
||||||
const index = JSON.parse(indexContent);
|
|
||||||
|
|
||||||
if (index.active_queue_id !== queueId) {
|
|
||||||
console.log(`⚠ Fixing: index.json active_queue_id not set to ${queueId}`);
|
|
||||||
index.active_queue_id = queueId;
|
|
||||||
// Ensure queue entry exists in index
|
|
||||||
if (!index.queues) index.queues = [];
|
|
||||||
const existing = index.queues.find(q => q.id === queueId);
|
|
||||||
if (!existing) {
|
|
||||||
index.queues.unshift({
|
|
||||||
id: queueId,
|
|
||||||
status: 'active',
|
|
||||||
issue_ids: summary.issues_queued,
|
|
||||||
total_solutions: summary.total_solutions,
|
|
||||||
completed_solutions: 0,
|
|
||||||
created_at: new Date().toISOString()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
Bash(`echo '${JSON.stringify(index, null, 2)}' > "${indexPath}"`);
|
|
||||||
console.log(`✓ Fixed: index.json updated with active_queue_id: ${queueId}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Validate queue file exists and has correct structure
|
|
||||||
const queueContent = Bash(`cat "${queuePath}" 2>/dev/null || echo '{}'`);
|
|
||||||
const queue = JSON.parse(queueContent);
|
|
||||||
|
|
||||||
if (!queue.solutions || queue.solutions.length === 0) {
|
|
||||||
console.error(`✗ ERROR: Queue file ${queuePath} has no solutions array`);
|
|
||||||
console.error(' Agent did not generate queue correctly. Aborting.');
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. Validate all solutions have status: "pending" (not "queued" or other)
|
// 2. Update issue statuses
|
||||||
let statusFixed = 0;
|
for (const id of summary.issues_queued) {
|
||||||
for (const sol of queue.solutions) {
|
Bash(`ccw issue update ${id} --status queued`);
|
||||||
if (sol.status !== 'pending' && sol.status !== 'executing' && sol.status !== 'completed') {
|
|
||||||
console.log(`⚠ Fixing: ${sol.item_id} status "${sol.status}" → "pending"`);
|
|
||||||
sol.status = 'pending';
|
|
||||||
statusFixed++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. Validate at least one item has no dependencies (DAG entry point)
|
// 3. Summary
|
||||||
const entryPoints = queue.solutions.filter(s =>
|
|
||||||
s.status === 'pending' && (!s.depends_on || s.depends_on.length === 0)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (entryPoints.length === 0) {
|
|
||||||
console.error(`✗ ERROR: No entry points found (all items have dependencies)`);
|
|
||||||
console.error(' This will cause "ccw issue next" to return empty.');
|
|
||||||
console.error(' Check depends_on fields for circular dependencies.');
|
|
||||||
// Try to fix by clearing first item's dependencies
|
|
||||||
if (queue.solutions.length > 0) {
|
|
||||||
console.log(`⚠ Fixing: Clearing depends_on for first item ${queue.solutions[0].item_id}`);
|
|
||||||
queue.solutions[0].depends_on = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write back fixed queue if any changes made
|
|
||||||
if (statusFixed > 0 || entryPoints.length === 0) {
|
|
||||||
Bash(`echo '${JSON.stringify(queue, null, 2)}' > "${queuePath}"`);
|
|
||||||
console.log(`✓ Queue file updated with ${statusFixed} status fixes`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ============ OUTPUT SUMMARY ============
|
|
||||||
|
|
||||||
console.log(`
|
console.log(`
|
||||||
## Queue Formed: ${summary.queue_id}
|
## Queue: ${summary.queue_id}
|
||||||
|
|
||||||
**Solutions**: ${summary.total_solutions}
|
- Solutions: ${summary.total_solutions}
|
||||||
**Tasks**: ${summary.total_tasks}
|
- Tasks: ${summary.total_tasks}
|
||||||
**Issues**: ${summary.issues_queued.join(', ')}
|
- Issues: ${summary.issues_queued.join(', ')}
|
||||||
**Groups**: ${summary.execution_groups.map(g => `${g.id}(${g.count})`).join(', ')}
|
|
||||||
**Conflicts Resolved**: ${summary.conflicts_resolved}
|
|
||||||
**Entry Points**: ${entryPoints.length} (items ready for immediate execution)
|
|
||||||
|
|
||||||
Next: \`/issue:execute\` or \`ccw issue next\`
|
Next: /issue:execute
|
||||||
`);
|
`);
|
||||||
|
|
||||||
// Update issue statuses via CLI
|
|
||||||
for (const issueId of summary.issues_queued) {
|
|
||||||
Bash(`ccw issue update ${issueId} --status queued`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Final verification
|
|
||||||
const verifyResult = Bash(`ccw issue queue dag 2>/dev/null | head -20`);
|
|
||||||
console.log('\n### Verification (DAG Preview):');
|
|
||||||
console.log(verifyResult);
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Error Handling
|
## Error Handling
|
||||||
|
|||||||
Reference in New Issue
Block a user