@jonit-dev/night-watch-cli 1.7.78 → 1.7.79

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.
@@ -166,7 +166,7 @@ for AUDIT_ATTEMPT in $(seq 1 "${AUDIT_MAX_RETRIES}"); do
166
166
  cd "${AUDIT_WORKTREE_DIR}" && timeout "${MAX_RUNTIME}" \
167
167
  claude -p "${AUDIT_PROMPT}" \
168
168
  --dangerously-skip-permissions \
169
- >> "${LOG_FILE}" 2>&1
169
+ 2>&1 | tee -a "${LOG_FILE}"
170
170
  ); then
171
171
  EXIT_CODE=0
172
172
  else
@@ -180,7 +180,7 @@ for AUDIT_ATTEMPT in $(seq 1 "${AUDIT_MAX_RETRIES}"); do
180
180
  -C "${AUDIT_WORKTREE_DIR}" \
181
181
  --yolo \
182
182
  "${AUDIT_PROMPT}" \
183
- >> "${LOG_FILE}" 2>&1
183
+ 2>&1 | tee -a "${LOG_FILE}"
184
184
  ); then
185
185
  EXIT_CODE=0
186
186
  else
@@ -8,7 +8,7 @@ set -euo pipefail
8
8
  # NOTE: This script expects environment variables to be set by the caller.
9
9
  # The Node.js CLI will inject config values via environment variables.
10
10
  # Required env vars (with defaults shown):
11
- # NW_MAX_RUNTIME=7200 - Maximum runtime in seconds (2 hours)
11
+ # NW_MAX_RUNTIME=14400 - Maximum runtime in seconds (4 hours)
12
12
  # NW_PROVIDER_CMD=claude - AI provider CLI to use (claude, codex, etc.)
13
13
  # NW_DRY_RUN=0 - Set to 1 for dry-run mode (prints diagnostics only)
14
14
 
@@ -22,7 +22,7 @@ else
22
22
  fi
23
23
  LOG_DIR="${PROJECT_DIR}/logs"
24
24
  LOG_FILE="${LOG_DIR}/executor.log"
25
- MAX_RUNTIME="${NW_MAX_RUNTIME:-7200}" # 2 hours — used for cooldowns and eligibility
25
+ MAX_RUNTIME="${NW_MAX_RUNTIME:-14400}" # 4 hours — used for cooldowns and eligibility
26
26
  SESSION_MAX_RUNTIME="${NW_SESSION_MAX_RUNTIME:-${MAX_RUNTIME}}" # per-invocation timeout; defaults to MAX_RUNTIME
27
27
  MAX_LOG_SIZE="524288" # 512 KB
28
28
  PROVIDER_CMD="${NW_PROVIDER_CMD:-claude}"
@@ -548,7 +548,7 @@ while [ "${ATTEMPT}" -lt "${MAX_RETRIES}" ]; do
548
548
  cd "${WORKTREE_DIR}" && timeout "${SESSION_MAX_RUNTIME}" \
549
549
  claude -p "${PROMPT}" \
550
550
  --dangerously-skip-permissions \
551
- >> "${LOG_FILE}" 2>&1
551
+ 2>&1 | tee -a "${LOG_FILE}"
552
552
  ); then
553
553
  EXIT_CODE=0
554
554
  else
@@ -562,7 +562,7 @@ while [ "${ATTEMPT}" -lt "${MAX_RETRIES}" ]; do
562
562
  -C "${WORKTREE_DIR}" \
563
563
  --yolo \
564
564
  "${PROMPT}" \
565
- >> "${LOG_FILE}" 2>&1
565
+ 2>&1 | tee -a "${LOG_FILE}"
566
566
  ); then
567
567
  EXIT_CODE=0
568
568
  else
@@ -629,7 +629,7 @@ if [ "${RATE_LIMIT_FALLBACK_TRIGGERED}" = "1" ]; then
629
629
  claude -p "${PROMPT}" \
630
630
  --dangerously-skip-permissions \
631
631
  --model "${FALLBACK_MODEL}" \
632
- >> "${LOG_FILE}" 2>&1
632
+ 2>&1 | tee -a "${LOG_FILE}"
633
633
  ); then
634
634
  EXIT_CODE=0
635
635
  else
@@ -667,6 +667,7 @@ if [ ${EXIT_CODE} -eq 0 ]; then
667
667
  fi
668
668
  "${NW_CLI}" board close-issue "${ISSUE_NUMBER}" 2>>"${LOG_FILE}" || \
669
669
  "${NW_CLI}" board move-issue "${ISSUE_NUMBER}" --column "Done" 2>>"${LOG_FILE}" || true
670
+ log "SUCCESS: PR opened and ready for review — ${PR_URL}"
670
671
  emit_result "success_open_pr" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}"
671
672
  elif finalize_prd_done "implemented, PR opened on ${BRANCH_NAME}"; then
672
673
  # Non-board mode: post attribution comment to the PR
@@ -675,6 +676,7 @@ if [ ${EXIT_CODE} -eq 0 ]; then
675
676
  if [ -n "${NON_BOARD_PR_URL}" ]; then
676
677
  gh pr comment "${NON_BOARD_PR_URL}" --body "> 🤖 Implemented by ${EFFECTIVE_PROVIDER_LABEL}" 2>>"${LOG_FILE}" || true
677
678
  fi
679
+ log "SUCCESS: PR opened and ready for review — ${NON_BOARD_PR_URL}"
678
680
  emit_result "success_open_pr" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}"
679
681
  else
680
682
  night_watch_history record "${PROJECT_DIR}" "${ELIGIBLE_PRD}" failure --exit-code 1 2>/dev/null || true
@@ -168,7 +168,9 @@ log() {
168
168
  _esec=$(( _elapsed % 60 ))
169
169
  elapsed_str=" [+${_emin}m${_esec}s]"
170
170
  fi
171
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] [PID:$$]${elapsed_str} $*" >> "${log_file}"
171
+ local msg="[$(date '+%Y-%m-%d %H:%M:%S')] [PID:$$]${elapsed_str} $*"
172
+ echo "${msg}" >> "${log_file}"
173
+ echo "${msg}" >&2
172
174
  }
173
175
 
174
176
  # Write a visual separator line to the log to delimit separate runs.
@@ -1078,7 +1078,7 @@ for ATTEMPT in $(seq 1 "${TOTAL_ATTEMPTS}"); do
1078
1078
  cd "${REVIEW_WORKTREE_DIR}" && timeout "${ATTEMPT_TIMEOUT}" \
1079
1079
  claude -p "${REVIEWER_PROMPT}" \
1080
1080
  --dangerously-skip-permissions \
1081
- >> "${LOG_FILE}" 2>&1
1081
+ 2>&1 | tee -a "${LOG_FILE}"
1082
1082
  ); then
1083
1083
  EXIT_CODE=0
1084
1084
  else
@@ -1092,7 +1092,7 @@ for ATTEMPT in $(seq 1 "${TOTAL_ATTEMPTS}"); do
1092
1092
  -C "${REVIEW_WORKTREE_DIR}" \
1093
1093
  --yolo \
1094
1094
  "${REVIEWER_PROMPT}" \
1095
- >> "${LOG_FILE}" 2>&1
1095
+ 2>&1 | tee -a "${LOG_FILE}"
1096
1096
  ); then
1097
1097
  EXIT_CODE=0
1098
1098
  else
@@ -598,7 +598,7 @@ Action: generating QA tests and evidence."
598
598
  cd "${QA_WORKTREE_DIR}" && timeout "${MAX_RUNTIME}" \
599
599
  claude -p "${QA_PROMPT}" \
600
600
  --dangerously-skip-permissions \
601
- >> "${LOG_FILE}" 2>&1
601
+ 2>&1 | tee -a "${LOG_FILE}"
602
602
  ); then
603
603
  PROVIDER_OK=1
604
604
  else
@@ -625,7 +625,7 @@ Action: generating QA tests and evidence."
625
625
  -C "${QA_WORKTREE_DIR}" \
626
626
  --yolo \
627
627
  "${QA_PROMPT}" \
628
- >> "${LOG_FILE}" 2>&1
628
+ 2>&1 | tee -a "${LOG_FILE}"
629
629
  ); then
630
630
  PROVIDER_OK=1
631
631
  else
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jonit-dev/night-watch-cli",
3
- "version": "1.7.78",
3
+ "version": "1.7.79",
4
4
  "description": "Autonomous PRD execution using AI Provider CLIs + cron",
5
5
  "type": "module",
6
6
  "bin": {