@jonit-dev/night-watch-cli 1.8.12-beta.1 → 1.8.12-beta.10

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.
Files changed (68) hide show
  1. package/dist/cli.js +3729 -2027
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/agent.d.ts +12 -0
  4. package/dist/commands/agent.d.ts.map +1 -0
  5. package/dist/commands/agent.js +307 -0
  6. package/dist/commands/agent.js.map +1 -0
  7. package/dist/commands/analytics.d.ts.map +1 -1
  8. package/dist/commands/analytics.js +60 -0
  9. package/dist/commands/analytics.js.map +1 -1
  10. package/dist/commands/audit.d.ts.map +1 -1
  11. package/dist/commands/audit.js +45 -0
  12. package/dist/commands/audit.js.map +1 -1
  13. package/dist/commands/init.d.ts.map +1 -1
  14. package/dist/commands/init.js +13 -0
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/merge.d.ts.map +1 -1
  17. package/dist/commands/merge.js +30 -3
  18. package/dist/commands/merge.js.map +1 -1
  19. package/dist/commands/plan.d.ts.map +1 -1
  20. package/dist/commands/plan.js +45 -0
  21. package/dist/commands/plan.js.map +1 -1
  22. package/dist/commands/qa.d.ts.map +1 -1
  23. package/dist/commands/qa.js +24 -0
  24. package/dist/commands/qa.js.map +1 -1
  25. package/dist/commands/queue.d.ts.map +1 -1
  26. package/dist/commands/queue.js +20 -0
  27. package/dist/commands/queue.js.map +1 -1
  28. package/dist/commands/resolve.d.ts.map +1 -1
  29. package/dist/commands/resolve.js +26 -0
  30. package/dist/commands/resolve.js.map +1 -1
  31. package/dist/commands/review.d.ts +2 -0
  32. package/dist/commands/review.d.ts.map +1 -1
  33. package/dist/commands/review.js +46 -1
  34. package/dist/commands/review.js.map +1 -1
  35. package/dist/commands/run.d.ts +16 -1
  36. package/dist/commands/run.d.ts.map +1 -1
  37. package/dist/commands/run.js +85 -1
  38. package/dist/commands/run.js.map +1 -1
  39. package/dist/commands/shared/env-builder.d.ts.map +1 -1
  40. package/dist/commands/shared/env-builder.js +1 -0
  41. package/dist/commands/shared/env-builder.js.map +1 -1
  42. package/dist/commands/shared/feedback.d.ts +24 -0
  43. package/dist/commands/shared/feedback.d.ts.map +1 -0
  44. package/dist/commands/shared/feedback.js +38 -0
  45. package/dist/commands/shared/feedback.js.map +1 -0
  46. package/dist/commands/slice.d.ts.map +1 -1
  47. package/dist/commands/slice.js +48 -1
  48. package/dist/commands/slice.js.map +1 -1
  49. package/dist/scripts/night-watch-audit-cron.sh +1 -0
  50. package/dist/scripts/night-watch-cron.sh +186 -23
  51. package/dist/scripts/night-watch-helpers.sh +65 -2
  52. package/dist/scripts/night-watch-merger-cron.sh +137 -36
  53. package/dist/scripts/night-watch-plan-cron.sh +2 -0
  54. package/dist/scripts/night-watch-pr-resolver-cron.sh +6 -0
  55. package/dist/scripts/night-watch-pr-reviewer-cron.sh +16 -5
  56. package/dist/scripts/night-watch-qa-cron.sh +8 -1
  57. package/dist/scripts/night-watch-slicer-cron.sh +3 -0
  58. package/dist/templates/night-watch.config.json +21 -0
  59. package/dist/templates/slicer.md +3 -0
  60. package/dist/web/assets/index-B6E6kOoR.js +406 -0
  61. package/dist/web/assets/index-C-xpWpS8.css +1 -0
  62. package/dist/web/assets/index-CEYe-290.js +412 -0
  63. package/dist/web/assets/index-DIMUXIP8.css +1 -0
  64. package/dist/web/assets/index-DpvzoXEv.js +442 -0
  65. package/dist/web/assets/index-DyME41HV.css +1 -0
  66. package/dist/web/assets/index-NR27JE3b.js +406 -0
  67. package/dist/web/index.html +2 -2
  68. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/commands/slice.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAGL,iBAAiB,EAkBlB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA4CD,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,YAAY,GACnB,MAAM,CAkCR;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,2BAA2B,CAAC,CA0CtC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,iBAAiB,CAmBnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiLnD"}
1
+ {"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/commands/slice.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAGL,iBAAiB,EAkBlB,MAAM,mBAAmB,CAAC;AAO3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA4CD,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,YAAY,GACnB,MAAM,CAkCR;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,2BAA2B,CAAC,CA8CtC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,iBAAiB,CAmBnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2NnD"}
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { CLAUDE_MODEL_IDS, LOCK_FILE_PREFIX, PROVIDER_COMMANDS, createBoardProvider, createSpinner, createTable, dim, getRoadmapStatus, header, info, isProcessRunning, loadConfig, projectRuntimeKey, resolveJobProvider, sendNotifications, sliceNextItem, error as uiError, warn, } from '@night-watch/core';
5
5
  import { buildBaseEnvVars, getTelegramStatusWebhooks, maybeApplyCronSchedulingDelay, } from './shared/env-builder.js';
6
+ import { recordJobOutcome } from './shared/feedback.js';
6
7
  import * as fs from 'fs';
7
8
  import * as path from 'path';
8
9
  function plannerLockPath(projectDir) {
@@ -85,7 +86,10 @@ export async function createPlannerIssue(projectDir, config, result) {
85
86
  return { created: false, skippedReason: 'board-not-configured' };
86
87
  }
87
88
  const issueTitle = `PRD: ${result.item.title}`;
88
- const normalizeTitle = (t) => t.replace(/^PRD:\s*/i, '').trim().toLowerCase();
89
+ const normalizeTitle = (t) => t
90
+ .replace(/^PRD:\s*/i, '')
91
+ .trim()
92
+ .toLowerCase();
89
93
  const existingIssues = await provider.getAllIssues();
90
94
  const existing = existingIssues.find((issue) => normalizeTitle(issue.title) === normalizeTitle(result.item.title));
91
95
  if (existing) {
@@ -255,6 +259,7 @@ export function sliceCommand(program) {
255
259
  // Execute planner with spinner
256
260
  const spinner = createSpinner('Running Planner...');
257
261
  spinner.start();
262
+ const startedAt = Date.now();
258
263
  try {
259
264
  await maybeApplyCronSchedulingDelay(config, 'slicer', projectDir);
260
265
  const result = await sliceNextItem(projectDir, config);
@@ -287,6 +292,30 @@ export function sliceCommand(program) {
287
292
  // Send notifications (fire-and-forget, failures do not affect exit code)
288
293
  const nothingPending = result.error === 'No pending items to process';
289
294
  const exitCode = result.sliced || nothingPending ? 0 : 1;
295
+ if (!options.dryRun) {
296
+ try {
297
+ recordJobOutcome({
298
+ config,
299
+ exitCode,
300
+ finishedAt: Date.now(),
301
+ jobType: 'planner',
302
+ metadata: {
303
+ error: result.error ?? null,
304
+ file: result.file ?? null,
305
+ itemTitle: result.item?.title ?? null,
306
+ sliced: result.sliced,
307
+ },
308
+ projectDir,
309
+ providerKey: resolveJobProvider(config, 'slicer'),
310
+ startedAt,
311
+ stderr: result.error,
312
+ stdout: result.file ? `Created ${result.file}` : undefined,
313
+ });
314
+ }
315
+ catch {
316
+ // Outcome persistence must not change command exit behavior.
317
+ }
318
+ }
290
319
  if (!options.dryRun && result.sliced) {
291
320
  await sendNotifications(config, {
292
321
  event: 'run_succeeded',
@@ -307,6 +336,24 @@ export function sliceCommand(program) {
307
336
  process.exit(exitCode);
308
337
  }
309
338
  catch (err) {
339
+ try {
340
+ recordJobOutcome({
341
+ config,
342
+ exitCode: 1,
343
+ finishedAt: Date.now(),
344
+ jobType: 'planner',
345
+ metadata: {
346
+ error: err instanceof Error ? err.message : String(err),
347
+ },
348
+ projectDir,
349
+ providerKey: resolveJobProvider(config, 'slicer'),
350
+ startedAt,
351
+ stderr: err instanceof Error ? err.message : String(err),
352
+ });
353
+ }
354
+ catch {
355
+ // Outcome persistence must not change command exit behavior.
356
+ }
310
357
  spinner.fail('Failed to execute planner command');
311
358
  uiError(`${err instanceof Error ? err.message : String(err)}`);
312
359
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"file":"slice.js","sourceRoot":"","sources":["../../src/commands/slice.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slice.js","sourceRoot":"","sources":["../../src/commands/slice.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,7 @@ mkdir -p "${LOG_DIR}"
28
28
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
29
29
  # shellcheck source=night-watch-helpers.sh
30
30
  source "${SCRIPT_DIR}/night-watch-helpers.sh"
31
+ skip_if_job_paused "${SCRIPT_TYPE}" "${PROJECT_DIR}"
31
32
 
32
33
  # emit_result helper - must be defined before use
33
34
  emit_result() {
@@ -50,6 +50,7 @@ PROJECT_RUNTIME_KEY=$(project_runtime_key "${PROJECT_DIR}")
50
50
  # NOTE: Lock file path must match executorLockPath() in src/utils/status-data.ts
51
51
  LOCK_FILE="/tmp/night-watch-${PROJECT_RUNTIME_KEY}.lock"
52
52
  SCRIPT_TYPE="executor"
53
+ skip_if_job_paused "${SCRIPT_TYPE}" "${PROJECT_DIR}"
53
54
 
54
55
  emit_result() {
55
56
  local status="${1:?status required}"
@@ -518,28 +519,43 @@ checkpoint_timeout_progress() {
518
519
  local worktree_dir="${1:?worktree_dir required}"
519
520
  local branch_name="${2:?branch_name required}"
520
521
  local prd_file="${3:?prd_file required}"
522
+ CHECKPOINT_STATUS="none"
521
523
 
522
524
  if [ ! -d "${worktree_dir}" ]; then
523
- return 0
525
+ return 1
524
526
  fi
525
527
 
526
528
  if ! git -C "${worktree_dir}" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
527
- return 0
529
+ return 1
528
530
  fi
529
531
 
530
532
  if [ -z "$(git -C "${worktree_dir}" status --porcelain 2>/dev/null)" ]; then
531
533
  log "TIMEOUT: No local changes to checkpoint for ${prd_file}"
532
- return 0
534
+ if executor_branch_has_commits_ahead_of_base; then
535
+ CHECKPOINT_STATUS="available"
536
+ return 0
537
+ fi
538
+ return 1
533
539
  fi
534
540
 
535
541
  log "TIMEOUT: Checkpointing local progress for ${prd_file} on ${branch_name}"
536
542
  if git -C "${worktree_dir}" add -A >/dev/null 2>&1; then
537
543
  if ! git -C "${worktree_dir}" diff --cached --quiet >/dev/null 2>&1; then
538
- git -C "${worktree_dir}" commit --no-verify \
544
+ if git -C "${worktree_dir}" commit --no-verify \
539
545
  -m "chore: checkpoint timed-out progress for ${prd_file}" \
540
- >> "${LOG_FILE}" 2>&1 || true
546
+ >> "${LOG_FILE}" 2>&1; then
547
+ CHECKPOINT_STATUS="created"
548
+ return 0
549
+ fi
541
550
  fi
542
551
  fi
552
+
553
+ if executor_branch_has_commits_ahead_of_base; then
554
+ CHECKPOINT_STATUS="available"
555
+ return 0
556
+ fi
557
+
558
+ return 1
543
559
  }
544
560
 
545
561
  extract_timeout_phase_titles() {
@@ -569,15 +585,29 @@ build_timeout_followup_comment() {
569
585
  local prd_label="${2:?prd_label required}"
570
586
  local branch_name="${3:?branch_name required}"
571
587
  local issue_body="${4:-}"
588
+ local checkpoint_status="${5:-none}"
572
589
  local phase_titles=""
573
590
  local comment=""
591
+ local resume_note=""
574
592
 
575
593
  phase_titles=$(extract_timeout_phase_titles "${issue_body}" || true)
576
594
 
595
+ case "${checkpoint_status}" in
596
+ created)
597
+ resume_note="Progress was checkpointed on branch ${branch_name}, so the next run will resume from the latest checkpoint."
598
+ ;;
599
+ available)
600
+ resume_note="Existing branch progress is available on ${branch_name}, so the next run can resume from that branch state."
601
+ ;;
602
+ *)
603
+ resume_note="No checkpoint was created because the run produced no local changes or branch commits. The next run will start this issue from the current base branch."
604
+ ;;
605
+ esac
606
+
577
607
  comment="Timeout follow-up:
578
608
 
579
609
  Execution hit the ${max_runtime}s runtime limit while processing ${prd_label}.
580
- Progress was checkpointed on branch ${branch_name}, so the next run will resume from the latest checkpoint.
610
+ ${resume_note}
581
611
 
582
612
  Suggested slices for the next runs:"
583
613
 
@@ -661,8 +691,90 @@ if [ -z "${EXECUTOR_PROMPT_PATH}" ]; then
661
691
  fi
662
692
  EXECUTOR_PROMPT_REF=$(instruction_ref_for_prompt "${PROJECT_DIR}" "${EXECUTOR_PROMPT_PATH}")
663
693
  PROGRESS_PUSH_CMD=$(project_git_push_command "${BRANCH_NAME}")
694
+ AUDIT_TRIAGE_RESULT_FILE=".night-watch-audit-triage-result"
695
+ AUDIT_TRIAGE_RESULT_PATH="${WORKTREE_DIR}/${AUDIT_TRIAGE_RESULT_FILE}"
696
+
697
+ is_audit_board_issue() {
698
+ if [ -z "${ISSUE_NUMBER}" ]; then
699
+ return 1
700
+ fi
701
+
702
+ if printf '%s\n%s\n' "${ISSUE_TITLE_RAW}" "${ISSUE_BODY}" \
703
+ | grep -Eiq '(^|[[:space:]])Audit:|Night Watch audit detected|Report:[[:space:]]+`?logs/audit-report\.md`?|Finding:[[:space:]]+[0-9]+'; then
704
+ return 0
705
+ fi
706
+
707
+ return 1
708
+ }
709
+
710
+ is_tiny_audit_board_issue() {
711
+ if ! is_audit_board_issue; then
712
+ return 1
713
+ fi
714
+
715
+ local line_count
716
+ line_count=$(printf '%s\n' "${ISSUE_BODY}" | wc -l | tr -d '[:space:]')
717
+ if [ "${line_count:-0}" -gt 160 ]; then
718
+ return 1
719
+ fi
720
+
721
+ if printf '%s\n' "${ISSUE_BODY}" \
722
+ | grep -Eiq '^[[:space:]]*#{1,4}[[:space:]]*(Phase|Implementation Plan|Acceptance Criteria|Requirements)\b'; then
723
+ return 1
724
+ fi
725
+
726
+ return 0
727
+ }
728
+
729
+ build_audit_triage_prompt() {
730
+ cat <<EOF
731
+ Audit triage/fix for GitHub issue #${ISSUE_NUMBER}: ${ISSUE_TITLE_RAW}
732
+
733
+ ${ISSUE_BODY}
664
734
 
665
- if [ -n "${ISSUE_NUMBER}" ]; then
735
+ ## Setup
736
+ - You are already inside an isolated worktree at: ${WORKTREE_DIR}
737
+ - Current branch is already checked out: ${BRANCH_NAME}
738
+ - Do NOT run git checkout/switch in ${PROJECT_DIR}
739
+ - Do NOT create or remove worktrees; the cron script manages that
740
+
741
+ ## Lean Audit Workflow
742
+ This is an audit finding, not a full PRD. First validate the claim against the current code.
743
+
744
+ If the finding is false positive or the code is already safe:
745
+ 1. Make no code changes and do not commit.
746
+ 2. Write this marker file in the worktree:
747
+ ${AUDIT_TRIAGE_RESULT_FILE}
748
+ 3. Put "false_positive" on the first line and a concise reason on the following line(s).
749
+ 4. Stop immediately after writing the marker.
750
+
751
+ If the finding is actionable:
752
+ 1. Make the smallest correct fix.
753
+ 2. Add or update focused tests only when they materially protect the behavior.
754
+ 3. Run the relevant verification command(s).
755
+ 4. Commit and push the fix to the existing branch:
756
+ ${PROGRESS_PUSH_CMD}
757
+ 5. Stop immediately after the final push.
758
+
759
+ Do NOT read the full PRD executor workflow. Do NOT use PRD phase planning or parallelize this tiny triage task.
760
+ Do NOT process any other issues.
761
+ EOF
762
+ }
763
+
764
+ read_audit_triage_result() {
765
+ if [ ! -f "${AUDIT_TRIAGE_RESULT_PATH}" ]; then
766
+ return 1
767
+ fi
768
+
769
+ head -n 1 "${AUDIT_TRIAGE_RESULT_PATH}" \
770
+ | tr '[:upper:]' '[:lower:]' \
771
+ | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//'
772
+ }
773
+
774
+ if is_tiny_audit_board_issue; then
775
+ log "PROMPT: Using lean audit triage workflow for issue #${ISSUE_NUMBER}"
776
+ PROMPT="$(build_audit_triage_prompt)"
777
+ elif [ -n "${ISSUE_NUMBER}" ]; then
666
778
  PROMPT="Implement the following PRD (GitHub issue #${ISSUE_NUMBER}: ${ISSUE_TITLE_RAW}):
667
779
 
668
780
  ${ISSUE_BODY}
@@ -724,6 +836,11 @@ Follow all CLAUDE.md conventions (if present).
724
836
  - Do NOT process any other PRDs — only ${ELIGIBLE_PRD}"
725
837
  fi
726
838
 
839
+ if [ -n "${NW_PROJECT_FEEDBACK_PROMPT:-}" ]; then
840
+ PROMPT="${PROMPT}"$'\n\n'"${NW_PROJECT_FEEDBACK_PROMPT}"
841
+ log "INFO: Added project feedback prompt context"
842
+ fi
843
+
727
844
  # Dry-run mode: print diagnostics and exit
728
845
  if [ "${NW_DRY_RUN:-0}" = "1" ]; then
729
846
  log "DRY-RUN: Would process ${ELIGIBLE_PRD}"
@@ -864,14 +981,20 @@ while [ "${ATTEMPT}" -lt "${MAX_RETRIES}" ]; do
864
981
  break
865
982
  fi
866
983
  log "CONTEXT-EXHAUSTED: Session ${ATTEMPT_NUM} hit context limit — checkpointing and resuming (${ATTEMPT}/${MAX_RETRIES})"
867
- checkpoint_timeout_progress "${WORKTREE_DIR}" "${BRANCH_NAME}" "${ELIGIBLE_PRD}"
868
- push_executor_branch "update" >> "${LOG_FILE}" 2>&1 || true
869
- ensure_executor_pr >> "${LOG_FILE}" 2>&1 || true
984
+ CHECKPOINT_STATUS="none"
985
+ checkpoint_timeout_progress "${WORKTREE_DIR}" "${BRANCH_NAME}" "${ELIGIBLE_PRD}" || true
986
+ if [ "${CHECKPOINT_STATUS}" != "none" ]; then
987
+ push_executor_branch "update" >> "${LOG_FILE}" 2>&1 || true
988
+ ensure_executor_pr >> "${LOG_FILE}" 2>&1 || true
989
+ RESUME_PROGRESS_NOTE="Progress is available on branch ${BRANCH_NAME}."
990
+ else
991
+ RESUME_PROGRESS_NOTE="No checkpoint was created because there were no local changes or branch commits."
992
+ fi
870
993
  # Switch prompt to "continue" mode for the next attempt (fresh context)
871
994
  if [ -n "${ISSUE_NUMBER}" ]; then
872
995
  PROMPT="Continue implementing PRD (GitHub issue #${ISSUE_NUMBER}: ${ISSUE_TITLE_RAW}).
873
996
 
874
- The previous session ran out of context window. Progress has been committed on branch ${BRANCH_NAME}.
997
+ The previous session ran out of context window. ${RESUME_PROGRESS_NOTE}
875
998
 
876
999
  ## Your task
877
1000
  1. Review the current state: check git log, existing code changes, and any task list
@@ -901,7 +1024,7 @@ Follow all CLAUDE.md conventions (if present).
901
1024
  else
902
1025
  PROMPT="Continue implementing the PRD at ${PRD_DIR_REL}/${ELIGIBLE_PRD}
903
1026
 
904
- The previous session ran out of context window. Progress has been committed on branch ${BRANCH_NAME}.
1027
+ The previous session ran out of context window. ${RESUME_PROGRESS_NOTE}
905
1028
 
906
1029
  ## Your task
907
1030
  1. Review the current state: check git log, existing code changes, and any task list
@@ -1091,6 +1214,29 @@ if [ "${EXIT_CODE}" -eq 0 ] && grep -qiF 'Exceeded USD budget' "${LOG_FILE}" 2>/
1091
1214
  EXIT_CODE=1
1092
1215
  fi
1093
1216
 
1217
+ if [ ${EXIT_CODE} -eq 0 ] && is_tiny_audit_board_issue; then
1218
+ AUDIT_TRIAGE_RESULT=$(read_audit_triage_result || true)
1219
+ if [ "${AUDIT_TRIAGE_RESULT}" = "false_positive" ]; then
1220
+ AUDIT_TRIAGE_REASON=$(tail -n +2 "${AUDIT_TRIAGE_RESULT_PATH}" 2>/dev/null | sed -E '/^[[:space:]]*$/d' | head -n 5 || true)
1221
+ if [ -z "${AUDIT_TRIAGE_REASON}" ]; then
1222
+ AUDIT_TRIAGE_REASON="Audit finding was validated as a false positive or already safe."
1223
+ fi
1224
+ log "AUDIT-TRIAGE: Issue #${ISSUE_NUMBER} marked false positive; closing without PR"
1225
+ if [ -n "${NW_CLI}" ]; then
1226
+ "${NW_CLI}" board comment "${ISSUE_NUMBER}" \
1227
+ --body "Audit triage found this is a false positive / already safe (via ${EFFECTIVE_PROVIDER_LABEL}).
1228
+
1229
+ ${AUDIT_TRIAGE_REASON}" 2>>"${LOG_FILE}" || true
1230
+ "${NW_CLI}" board close-issue "${ISSUE_NUMBER}" 2>>"${LOG_FILE}" || \
1231
+ "${NW_CLI}" board move-issue "${ISSUE_NUMBER}" --column "Done" 2>>"${LOG_FILE}" || true
1232
+ fi
1233
+ night_watch_history record "${PROJECT_DIR}" "${ELIGIBLE_PRD}" success --exit-code 0 2>/dev/null || true
1234
+ emit_result "success_audit_false_positive" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}|reason=audit_false_positive|detail=$(sanitize_result_value "${AUDIT_TRIAGE_REASON}")"
1235
+ cleanup_worktrees "${PROJECT_DIR}"
1236
+ exit 0
1237
+ fi
1238
+ fi
1239
+
1094
1240
  if [ ${EXIT_CODE} -eq 0 ]; then
1095
1241
  if ! ensure_executor_pr; then
1096
1242
  log "FAIL: Unable to create or reuse executor PR for ${BRANCH_NAME} after provider completion"
@@ -1159,14 +1305,22 @@ if [ ${EXIT_CODE} -eq 0 ]; then
1159
1305
  fi
1160
1306
  elif [ ${EXIT_CODE} -eq 124 ]; then
1161
1307
  log "TIMEOUT: Session limit hit after ${SESSION_MAX_RUNTIME}s while processing ${ELIGIBLE_PRD}"
1162
- checkpoint_timeout_progress "${WORKTREE_DIR}" "${BRANCH_NAME}" "${ELIGIBLE_PRD}"
1163
- push_executor_branch "update" >> "${LOG_FILE}" 2>&1 || true
1164
- ensure_executor_pr >> "${LOG_FILE}" 2>&1 || true
1308
+ CHECKPOINT_STATUS="none"
1309
+ checkpoint_timeout_progress "${WORKTREE_DIR}" "${BRANCH_NAME}" "${ELIGIBLE_PRD}" || true
1310
+ if [ "${CHECKPOINT_STATUS}" != "none" ]; then
1311
+ push_executor_branch "update" >> "${LOG_FILE}" 2>&1 || true
1312
+ ensure_executor_pr >> "${LOG_FILE}" 2>&1 || true
1313
+ fi
1165
1314
  if [ -n "${ISSUE_NUMBER}" ]; then
1166
1315
  "${NW_CLI}" board move-issue "${ISSUE_NUMBER}" --column "Ready" 2>>"${LOG_FILE}" || true
1167
1316
  if [ "${SESSION_MAX_RUNTIME}" != "${MAX_RUNTIME}" ]; then
1317
+ if [ "${CHECKPOINT_STATUS}" = "none" ]; then
1318
+ SESSION_TIMEOUT_BODY="Session paused after ${SESSION_MAX_RUNTIME}s (via ${EFFECTIVE_PROVIDER_LABEL}). No checkpoint was created because there were no local changes or branch commits. Will retry from the current base branch on the next run."
1319
+ else
1320
+ SESSION_TIMEOUT_BODY="Session paused after ${SESSION_MAX_RUNTIME}s (via ${EFFECTIVE_PROVIDER_LABEL}). Progress is available on branch \`${BRANCH_NAME}\`. Will resume automatically on the next run."
1321
+ fi
1168
1322
  "${NW_CLI}" board comment "${ISSUE_NUMBER}" \
1169
- --body "Session paused after ${SESSION_MAX_RUNTIME}s (via ${EFFECTIVE_PROVIDER_LABEL}). Progress checkpointed on branch \`${BRANCH_NAME}\`. Will resume automatically on the next run." 2>>"${LOG_FILE}" || true
1323
+ --body "${SESSION_TIMEOUT_BODY}" 2>>"${LOG_FILE}" || true
1170
1324
  else
1171
1325
  "${NW_CLI}" board comment "${ISSUE_NUMBER}" \
1172
1326
  --body "Execution timed out after ${SESSION_MAX_RUNTIME}s (via ${EFFECTIVE_PROVIDER_LABEL}). Moved back to Ready for retry." 2>>"${LOG_FILE}" || true
@@ -1174,12 +1328,13 @@ elif [ ${EXIT_CODE} -eq 124 ]; then
1174
1328
  "${SESSION_MAX_RUNTIME}" \
1175
1329
  "${ELIGIBLE_PRD}" \
1176
1330
  "${BRANCH_NAME}" \
1177
- "${ISSUE_BODY}")
1331
+ "${ISSUE_BODY}" \
1332
+ "${CHECKPOINT_STATUS}")
1178
1333
  "${NW_CLI}" board comment "${ISSUE_NUMBER}" --body "${TIMEOUT_FOLLOWUP_COMMENT}" 2>>"${LOG_FILE}" || true
1179
1334
  fi
1180
1335
  fi
1181
1336
  night_watch_history record "${PROJECT_DIR}" "${ELIGIBLE_PRD}" timeout --exit-code 124 2>/dev/null || true
1182
- emit_result "timeout" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}"
1337
+ emit_result "timeout" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}|checkpoint=${CHECKPOINT_STATUS}"
1183
1338
  elif [ "${DOUBLE_RATE_LIMITED}" = "1" ]; then
1184
1339
  if [ -n "${ISSUE_NUMBER}" ]; then
1185
1340
  "${NW_CLI}" board move-issue "${ISSUE_NUMBER}" --column "Ready" 2>>"${LOG_FILE}" || true
@@ -1191,16 +1346,24 @@ elif [ "${DOUBLE_RATE_LIMITED}" = "1" ]; then
1191
1346
  elif check_context_exhausted "${LOG_FILE}" "${LOG_LINE_BEFORE}"; then
1192
1347
  # All resume attempts for context exhaustion were used up
1193
1348
  log "FAIL: Context window exhausted after ${MAX_RETRIES} resume attempts for ${ELIGIBLE_PRD}"
1194
- checkpoint_timeout_progress "${WORKTREE_DIR}" "${BRANCH_NAME}" "${ELIGIBLE_PRD}"
1195
- push_executor_branch "update" >> "${LOG_FILE}" 2>&1 || true
1196
- ensure_executor_pr >> "${LOG_FILE}" 2>&1 || true
1349
+ CHECKPOINT_STATUS="none"
1350
+ checkpoint_timeout_progress "${WORKTREE_DIR}" "${BRANCH_NAME}" "${ELIGIBLE_PRD}" || true
1351
+ if [ "${CHECKPOINT_STATUS}" != "none" ]; then
1352
+ push_executor_branch "update" >> "${LOG_FILE}" 2>&1 || true
1353
+ ensure_executor_pr >> "${LOG_FILE}" 2>&1 || true
1354
+ fi
1197
1355
  if [ -n "${ISSUE_NUMBER}" ]; then
1198
1356
  "${NW_CLI}" board move-issue "${ISSUE_NUMBER}" --column "Ready" 2>>"${LOG_FILE}" || true
1357
+ if [ "${CHECKPOINT_STATUS}" = "none" ]; then
1358
+ CONTEXT_COMMENT="Context window exhausted after ${MAX_RETRIES} resume attempts (${TOTAL_ELAPSED}s total, via ${EFFECTIVE_PROVIDER_LABEL}). No checkpoint was created because there were no local changes or branch commits. Will retry from the current base branch."
1359
+ else
1360
+ CONTEXT_COMMENT="Context window exhausted after ${MAX_RETRIES} resume attempts (${TOTAL_ELAPSED}s total, via ${EFFECTIVE_PROVIDER_LABEL}). Progress is available on branch \`${BRANCH_NAME}\`. Will resume on next run."
1361
+ fi
1199
1362
  "${NW_CLI}" board comment "${ISSUE_NUMBER}" \
1200
- --body "Context window exhausted after ${MAX_RETRIES} resume attempts (${TOTAL_ELAPSED}s total, via ${EFFECTIVE_PROVIDER_LABEL}). Progress checkpointed on branch \`${BRANCH_NAME}\`. Will resume on next run." 2>>"${LOG_FILE}" || true
1363
+ --body "${CONTEXT_COMMENT}" 2>>"${LOG_FILE}" || true
1201
1364
  fi
1202
1365
  night_watch_history record "${PROJECT_DIR}" "${ELIGIBLE_PRD}" context_exhausted --exit-code "${EXIT_CODE}" 2>/dev/null || true
1203
- emit_result "failure" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}|reason=context_exhausted|exit_code=${EXIT_CODE}"
1366
+ emit_result "failure" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}|reason=context_exhausted|exit_code=${EXIT_CODE}|checkpoint=${CHECKPOINT_STATUS}"
1204
1367
  else
1205
1368
  PROVIDER_ERROR_DETAIL=$(latest_failure_detail "${LOG_FILE}" "${LOG_LINE_BEFORE}")
1206
1369
  log "FAIL: Night watch exited with code ${EXIT_CODE} while processing ${ELIGIBLE_PRD}"
@@ -126,6 +126,7 @@ project_git_push_command() {
126
126
  NW_EXECUTOR_PARTIAL_LABEL="${NW_EXECUTOR_PARTIAL_LABEL:-nw:partial}"
127
127
  NW_EXECUTOR_RESUMABLE_LABEL="${NW_EXECUTOR_RESUMABLE_LABEL:-nw:resumable}"
128
128
  NW_EXECUTOR_READY_REVIEW_LABEL="${NW_EXECUTOR_READY_REVIEW_LABEL:-nw:ready-review}"
129
+ NW_PR_RESOLVER_READY_LABEL="${NW_PR_RESOLVER_READY_LABEL:-ready-to-merge}"
129
130
 
130
131
  csv_has_label() {
131
132
  local csv="${1:-}"
@@ -188,7 +189,8 @@ find_executor_resume_pr() {
188
189
  printf '%s' "${pr_list}" \
189
190
  | jq -c \
190
191
  --arg primary_prefix "${branch_prefix}/" \
191
- --arg resumable_label "${NW_EXECUTOR_RESUMABLE_LABEL}" '
192
+ --arg resumable_label "${NW_EXECUTOR_RESUMABLE_LABEL}" \
193
+ --arg ready_label "${NW_PR_RESOLVER_READY_LABEL}" '
192
194
  [
193
195
  .[]
194
196
  | select(
@@ -198,6 +200,7 @@ find_executor_resume_pr() {
198
200
  )
199
201
  | .labelNames = ((.labels // []) | map(.name))
200
202
  | select((.labelNames | index($resumable_label)) != null)
203
+ | select((.labelNames | index($ready_label)) == null)
201
204
  ]
202
205
  | sort_by(.createdAt // "")
203
206
  | .[0] // empty
@@ -1243,8 +1246,40 @@ or set primaryFallbackPreset / primaryFallbackModel in night-watch.config.json."
1243
1246
 
1244
1247
  # ── Board mode issue discovery ────────────────────────────────────────────────
1245
1248
 
1249
+ is_audit_board_issue_json() {
1250
+ local issue_json="${1:?issue_json required}"
1251
+
1252
+ printf '%s' "${issue_json}" \
1253
+ | jq -r '[.title // "", .body // ""] | join("\n")' 2>/dev/null \
1254
+ | grep -Eiq '(^|[[:space:]])Audit:|Night Watch audit detected|Report:[[:space:]]+`?logs/audit-report\.md`?|Finding:[[:space:]]+[0-9]+'
1255
+ }
1256
+
1257
+ is_audit_paused_or_disabled() {
1258
+ local cli_bin="${1:?cli_bin required}"
1259
+ local project_dir="${2:?project_dir required}"
1260
+
1261
+ if (cd "${project_dir}" && "${cli_bin}" job is-paused audit >/dev/null 2>&1); then
1262
+ return 0
1263
+ fi
1264
+
1265
+ local audit_enabled
1266
+ audit_enabled=$(
1267
+ cd "${project_dir}" \
1268
+ && "${cli_bin}" config get audit.enabled 2>/dev/null \
1269
+ | tr '[:upper:]' '[:lower:]' \
1270
+ | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//'
1271
+ ) || true
1272
+
1273
+ if [ "${audit_enabled}" = "false" ]; then
1274
+ return 0
1275
+ fi
1276
+
1277
+ return 1
1278
+ }
1279
+
1246
1280
  # Get the next eligible issue from the board provider.
1247
- # Iterates through Ready issues sorted by priority, skipping any in cooldown.
1281
+ # Iterates through Ready issues sorted by priority, skipping audit findings when
1282
+ # audit is disabled/paused and skipping any in cooldown.
1248
1283
  # Prints the JSON of the first eligible issue to stdout, or nothing if none found.
1249
1284
  # Returns 0 on success, 1 if no Ready issues were returned, 2 if Ready issues
1250
1285
  # were found but every candidate was skipped due to cooldown.
@@ -1292,6 +1327,16 @@ find_eligible_board_issue() {
1292
1327
  number=$(printf '%s' "${issue}" | jq -r '.number' 2>/dev/null)
1293
1328
  title=$(printf '%s' "${issue}" | jq -r '.title // empty' 2>/dev/null)
1294
1329
 
1330
+ # Skip stale audit findings while the audit job is paused/disabled. Audit
1331
+ # cron/config gates stop new scans, but Ready board issues can outlive them.
1332
+ if [ -n "${project_dir}" ] \
1333
+ && is_audit_board_issue_json "${issue}" \
1334
+ && is_audit_paused_or_disabled "${cli_bin}" "${project_dir}"; then
1335
+ log "SKIP-BOARD: Issue #${number} — audit issue skipped because audit is paused or disabled"
1336
+ i=$((i + 1))
1337
+ continue
1338
+ fi
1339
+
1295
1340
  # Derive PRD name (same slug format used by the cron script for history keys)
1296
1341
  prd_name="${number}-$(printf '%s' "${title}" | tr '[:upper:]' '[:lower:]' | tr -cs 'a-z0-9' '-' | sed 's/^-\|-$//g')"
1297
1342
 
@@ -1335,6 +1380,22 @@ arm_global_queue_cleanup() {
1335
1380
  append_exit_trap "__night_watch_queue_cleanup \$?"
1336
1381
  }
1337
1382
 
1383
+ skip_if_job_paused() {
1384
+ local script_type="${1:?script_type required}"
1385
+ local project_dir="${2:?project_dir required}"
1386
+
1387
+ local cli_bin
1388
+ cli_bin=$(resolve_night_watch_cli) || return 0
1389
+
1390
+ if (cd "${project_dir}" && "${cli_bin}" job is-paused "${script_type}" >/dev/null 2>&1); then
1391
+ log "SKIP: ${script_type} is paused in night-watch.config.json"
1392
+ if command -v emit_result >/dev/null 2>&1; then
1393
+ emit_result "skip_paused"
1394
+ fi
1395
+ exit 0
1396
+ fi
1397
+ }
1398
+
1338
1399
  # Atomically claim a queue slot or enqueue for later dispatch.
1339
1400
  # Uses DB transaction (via `queue claim` CLI) for atomicity — no flock needed.
1340
1401
  # Sets NW_QUEUE_ENTRY_ID on success and arms the cleanup trap.
@@ -1342,6 +1403,8 @@ arm_global_queue_cleanup() {
1342
1403
  claim_or_enqueue() {
1343
1404
  local script_type="${1:?script_type required}"
1344
1405
  local project_dir="${2:?project_dir required}"
1406
+ skip_if_job_paused "${script_type}" "${project_dir}"
1407
+
1345
1408
  local provider_key
1346
1409
  provider_key=$(resolve_provider_key "${project_dir}" "${script_type}")
1347
1410