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.
@@ -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
- // Interactive mode: lean pipeline — plan → implement → commit (skip triage, test, review)
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
- // Only for tasks that need it skip for pure refactoring, config changes, etc.
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
- } // end if !shouldSkip('review')
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-claude-workspace",
3
- "version": "2.3.37",
3
+ "version": "2.3.38",
4
4
  "author": "",
5
5
  "repository": {
6
6
  "type": "git",