create-claude-workspace 2.3.37 → 2.3.38
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/dist/scheduler/loop.mjs +28 -10
- package/package.json +1 -1
package/dist/scheduler/loop.mjs
CHANGED
|
@@ -419,10 +419,7 @@ async function runTaskPipeline(task, workerId, agents, deps) {
|
|
|
419
419
|
const skipTo = resumeStep ?? 'triage';
|
|
420
420
|
const stepOrder = ['triage', 'plan', 'implement', 'test', 'review', 'rework', 'commit', 'pr-create', 'pr-watch', 'merge'];
|
|
421
421
|
const skipToIndex = stepOrder.indexOf(skipTo);
|
|
422
|
-
|
|
423
|
-
const interactiveSkip = new Set(['triage', 'test', 'review', 'rework', 're-review']);
|
|
424
|
-
const shouldSkip = (step) => stepOrder.indexOf(step) < skipToIndex ||
|
|
425
|
-
(state.taskMode === 'interactive' && interactiveSkip.has(step));
|
|
422
|
+
const shouldSkip = (step) => stepOrder.indexOf(step) < skipToIndex;
|
|
426
423
|
try {
|
|
427
424
|
// STEP 0: Triage (platform issues only — features go through PO, bugs go to IT analyst)
|
|
428
425
|
if (!shouldSkip('triage')) {
|
|
@@ -603,10 +600,13 @@ async function runTaskPipeline(task, workerId, agents, deps) {
|
|
|
603
600
|
model: getAgentModel(pipeline.assignedAgent, agents, task),
|
|
604
601
|
}, state, task.id, logger, onMessage, onSpawnStart, onSpawnEnd, mcpServers);
|
|
605
602
|
}
|
|
603
|
+
// Check if changes contain actual code (affects QA + review decisions)
|
|
604
|
+
const postImplFiles = getChangedFiles(worktreePath);
|
|
605
|
+
const codeChanged = hasCodeChanges(postImplFiles);
|
|
606
606
|
// STEP 3: QA (E2E tests, integration tests, acceptance criteria verification)
|
|
607
|
-
//
|
|
607
|
+
// Skip for non-code changes (docs, config, assets) and pure refactoring tasks.
|
|
608
608
|
if (!shouldSkip('test')) {
|
|
609
|
-
const needsQA = task.type !== 'fullstack' || !isRefactoringTask(task);
|
|
609
|
+
const needsQA = codeChanged && (task.type !== 'fullstack' || !isRefactoringTask(task));
|
|
610
610
|
if (needsQA) {
|
|
611
611
|
pipeline.step = 'test';
|
|
612
612
|
appendEvent(projectDir, createEvent('step_changed', { taskId: task.id, step: 'test' }));
|
|
@@ -633,11 +633,11 @@ async function runTaskPipeline(task, workerId, agents, deps) {
|
|
|
633
633
|
}
|
|
634
634
|
}
|
|
635
635
|
else {
|
|
636
|
-
logger.info(`[${task.id}] Skipping QA step (refactoring/config task)`);
|
|
636
|
+
logger.info(`[${task.id}] Skipping QA step (${codeChanged ? 'refactoring/config task' : 'no code changes'})`);
|
|
637
637
|
}
|
|
638
638
|
} // end if !shouldSkip('test')
|
|
639
|
-
// STEP 4: Review
|
|
640
|
-
if (!shouldSkip('review')) {
|
|
639
|
+
// STEP 4: Review (skip for non-code changes — nothing to review)
|
|
640
|
+
if (!shouldSkip('review') && codeChanged) {
|
|
641
641
|
pipeline.step = 'review';
|
|
642
642
|
appendEvent(projectDir, createEvent('step_changed', { taskId: task.id, step: 'review' }));
|
|
643
643
|
const reviewRouting = await orchestrator.routeTask(task, 'review', agents);
|
|
@@ -680,7 +680,10 @@ async function runTaskPipeline(task, workerId, agents, deps) {
|
|
|
680
680
|
}
|
|
681
681
|
}
|
|
682
682
|
}
|
|
683
|
-
}
|
|
683
|
+
}
|
|
684
|
+
else if (!shouldSkip('review') && !codeChanged) {
|
|
685
|
+
logger.info(`[${task.id}] Skipping review (no code changes)`);
|
|
686
|
+
} // end review
|
|
684
687
|
// STEP 5: Commit
|
|
685
688
|
if (!shouldSkip('commit')) {
|
|
686
689
|
pipeline.step = 'commit';
|
|
@@ -882,6 +885,21 @@ function isRefactoringTask(task) {
|
|
|
882
885
|
return lower.includes('refactor') || lower.includes('config') || lower.includes('cleanup')
|
|
883
886
|
|| lower.includes('rename') || lower.includes('migrate') || lower.includes('upgrade');
|
|
884
887
|
}
|
|
888
|
+
/** Code file extensions that warrant QA and review. */
|
|
889
|
+
const CODE_EXTENSIONS = new Set([
|
|
890
|
+
'.ts', '.tsx', '.js', '.jsx', '.mts', '.mjs', '.cts', '.cjs',
|
|
891
|
+
'.vue', '.svelte', '.py', '.rs', '.go', '.java', '.kt',
|
|
892
|
+
'.css', '.scss', '.sass', '.less',
|
|
893
|
+
'.html', '.htm',
|
|
894
|
+
'.sql',
|
|
895
|
+
]);
|
|
896
|
+
/** Check if changed files contain actual code (not just docs/config/assets). */
|
|
897
|
+
function hasCodeChanges(changedFiles) {
|
|
898
|
+
return changedFiles.some(f => {
|
|
899
|
+
const ext = f.slice(f.lastIndexOf('.')).toLowerCase();
|
|
900
|
+
return CODE_EXTENSIONS.has(ext);
|
|
901
|
+
});
|
|
902
|
+
}
|
|
885
903
|
// ─── Orphaned worktree recovery ───
|
|
886
904
|
/** Mark issue as done on the platform after a successful recovery merge */
|
|
887
905
|
export function closeRecoveredIssue(projectDir, branch, logger) {
|