@jonit-dev/night-watch-cli 1.7.50 → 1.7.52
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/cli.js +393 -229
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +6 -24
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +20 -23
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/qa.d.ts.map +1 -1
- package/dist/commands/qa.js +16 -4
- package/dist/commands/qa.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +6 -4
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/shared/env-builder.d.ts +5 -0
- package/dist/commands/shared/env-builder.d.ts.map +1 -1
- package/dist/commands/shared/env-builder.js +32 -0
- package/dist/commands/shared/env-builder.js.map +1 -1
- package/dist/commands/slice.d.ts +8 -0
- package/dist/commands/slice.d.ts.map +1 -1
- package/dist/commands/slice.js +90 -2
- package/dist/commands/slice.js.map +1 -1
- package/dist/scripts/night-watch-audit-cron.sh +17 -4
- package/dist/scripts/night-watch-cron.sh +19 -5
- package/dist/scripts/night-watch-helpers.sh +137 -0
- package/dist/scripts/night-watch-pr-reviewer-cron.sh +268 -5
- package/dist/scripts/night-watch-qa-cron.sh +427 -22
- package/dist/scripts/night-watch-slicer-cron.sh +14 -3
- package/dist/templates/audit.md +87 -0
- package/dist/templates/executor.md +67 -0
- package/dist/templates/night-watch-pr-reviewer.md +33 -0
- package/dist/templates/night-watch.config.json +31 -1
- package/dist/templates/night-watch.md +31 -0
- package/dist/templates/pr-reviewer.md +203 -0
- package/dist/templates/qa.md +157 -0
- package/dist/templates/slicer.md +234 -0
- package/package.json +1 -1
package/dist/commands/slice.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Slice command - executes the roadmap slicer to create PRDs from roadmap items
|
|
3
3
|
*/
|
|
4
|
-
import { LOCK_FILE_PREFIX, PROVIDER_COMMANDS, createSpinner, createTable, dim, getRoadmapStatus, header, info, isProcessRunning, loadConfig, projectRuntimeKey, resolveJobProvider, sendNotifications, sliceNextItem, error as uiError, } from '@night-watch/core';
|
|
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 } from './shared/env-builder.js';
|
|
6
6
|
import * as fs from 'fs';
|
|
7
7
|
import * as path from 'path';
|
|
@@ -37,6 +37,76 @@ function releasePlannerLock(lockFile) {
|
|
|
37
37
|
// ignore cleanup errors
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
+
function resolvePlannerIssueColumn(config) {
|
|
41
|
+
return config.roadmapScanner.issueColumn === 'Ready' ? 'Ready' : 'Draft';
|
|
42
|
+
}
|
|
43
|
+
function buildPlannerIssueBody(projectDir, config, result) {
|
|
44
|
+
const relativePrdPath = path.join(config.prdDir, result.file ?? '').replace(/\\/g, '/');
|
|
45
|
+
const absolutePrdPath = path.join(projectDir, config.prdDir, result.file ?? '');
|
|
46
|
+
const sourceItem = result.item;
|
|
47
|
+
let prdContent = '';
|
|
48
|
+
try {
|
|
49
|
+
prdContent = fs.readFileSync(absolutePrdPath, 'utf-8');
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
prdContent = `Unable to read generated PRD file at \`${relativePrdPath}\`.`;
|
|
53
|
+
}
|
|
54
|
+
const maxBodyChars = 60000;
|
|
55
|
+
const truncated = prdContent.length > maxBodyChars;
|
|
56
|
+
const prdPreview = truncated
|
|
57
|
+
? `${prdContent.slice(0, maxBodyChars)}\n\n...[truncated]`
|
|
58
|
+
: prdContent;
|
|
59
|
+
const sourceLines = sourceItem
|
|
60
|
+
? [
|
|
61
|
+
`- Source section: ${sourceItem.section}`,
|
|
62
|
+
`- Source item: ${sourceItem.title}`,
|
|
63
|
+
sourceItem.description ? `- Source summary: ${sourceItem.description}` : '',
|
|
64
|
+
].filter((line) => line.length > 0)
|
|
65
|
+
: [];
|
|
66
|
+
return [
|
|
67
|
+
'## Planner Generated PRD',
|
|
68
|
+
'',
|
|
69
|
+
`- PRD file: \`${relativePrdPath}\``,
|
|
70
|
+
...sourceLines,
|
|
71
|
+
'',
|
|
72
|
+
'---',
|
|
73
|
+
'',
|
|
74
|
+
prdPreview,
|
|
75
|
+
].join('\n');
|
|
76
|
+
}
|
|
77
|
+
export async function createPlannerIssue(projectDir, config, result) {
|
|
78
|
+
if (!result.sliced || !result.file || !result.item) {
|
|
79
|
+
return { created: false, skippedReason: 'nothing-created' };
|
|
80
|
+
}
|
|
81
|
+
if (!config.boardProvider?.enabled) {
|
|
82
|
+
return { created: false, skippedReason: 'board-disabled' };
|
|
83
|
+
}
|
|
84
|
+
const provider = createBoardProvider(config.boardProvider, projectDir);
|
|
85
|
+
const board = await provider.getBoard();
|
|
86
|
+
if (!board) {
|
|
87
|
+
return { created: false, skippedReason: 'board-not-configured' };
|
|
88
|
+
}
|
|
89
|
+
const existingIssues = await provider.getAllIssues();
|
|
90
|
+
const existing = existingIssues.find((issue) => issue.title.trim().toLowerCase() === result.item.title.trim().toLowerCase());
|
|
91
|
+
if (existing) {
|
|
92
|
+
return {
|
|
93
|
+
created: false,
|
|
94
|
+
skippedReason: 'already-exists',
|
|
95
|
+
issueNumber: existing.number,
|
|
96
|
+
issueUrl: existing.url,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const issue = await provider.createIssue({
|
|
100
|
+
title: result.item.title,
|
|
101
|
+
body: buildPlannerIssueBody(projectDir, config, result),
|
|
102
|
+
column: resolvePlannerIssueColumn(config),
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
created: true,
|
|
106
|
+
issueNumber: issue.number,
|
|
107
|
+
issueUrl: issue.url,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
40
110
|
/**
|
|
41
111
|
* Build environment variables map from config and CLI options for slicer
|
|
42
112
|
*/
|
|
@@ -49,6 +119,7 @@ export function buildEnvVars(config, options) {
|
|
|
49
119
|
env.NW_PRD_DIR = config.prdDir;
|
|
50
120
|
// Roadmap path
|
|
51
121
|
env.NW_ROADMAP_PATH = config.roadmapScanner.roadmapPath;
|
|
122
|
+
env.NW_CLAUDE_MODEL_ID = CLAUDE_MODEL_IDS[config.claudeModel ?? 'sonnet'];
|
|
52
123
|
// Telegram status messages from bash scripts (start/progress/final status)
|
|
53
124
|
const telegramWebhooks = getTelegramStatusWebhooks(config);
|
|
54
125
|
if (telegramWebhooks.length > 0) {
|
|
@@ -121,6 +192,8 @@ export function sliceCommand(program) {
|
|
|
121
192
|
`${config.roadmapScanner.slicerMaxRuntime}s (${Math.floor(config.roadmapScanner.slicerMaxRuntime / 60)}min)`,
|
|
122
193
|
]);
|
|
123
194
|
configTable.push(['Planner Schedule', config.roadmapScanner.slicerSchedule]);
|
|
195
|
+
configTable.push(['Planner Priority Mode', config.roadmapScanner.priorityMode]);
|
|
196
|
+
configTable.push(['Planner Issue Column', resolvePlannerIssueColumn(config)]);
|
|
124
197
|
configTable.push(['Scanner Enabled', config.roadmapScanner.enabled ? 'Yes' : 'No']);
|
|
125
198
|
console.log(configTable.toString());
|
|
126
199
|
// Get roadmap status
|
|
@@ -188,8 +261,23 @@ export function sliceCommand(program) {
|
|
|
188
261
|
});
|
|
189
262
|
}
|
|
190
263
|
const result = await sliceNextItem(projectDir, config);
|
|
264
|
+
let issueSummary = '';
|
|
265
|
+
if (result.sliced) {
|
|
266
|
+
try {
|
|
267
|
+
const issueResult = await createPlannerIssue(projectDir, config, result);
|
|
268
|
+
if (issueResult.created && issueResult.issueNumber) {
|
|
269
|
+
issueSummary = `; issue #${issueResult.issueNumber} (${resolvePlannerIssueColumn(config)})`;
|
|
270
|
+
}
|
|
271
|
+
else if (issueResult.skippedReason === 'already-exists' && issueResult.issueNumber) {
|
|
272
|
+
issueSummary = `; existing issue #${issueResult.issueNumber}`;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch (issueError) {
|
|
276
|
+
warn(`Planner created ${result.file} but failed to create board issue: ${issueError instanceof Error ? issueError.message : String(issueError)}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
191
279
|
if (result.sliced) {
|
|
192
|
-
spinner.succeed(`Planner completed successfully: Created ${result.file}`);
|
|
280
|
+
spinner.succeed(`Planner completed successfully: Created ${result.file}${issueSummary}`);
|
|
193
281
|
}
|
|
194
282
|
else if (result.error) {
|
|
195
283
|
if (result.error === 'No pending items to process') {
|
|
@@ -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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"}
|
|
@@ -19,6 +19,7 @@ REPORT_FILE="${PROJECT_DIR}/logs/audit-report.md"
|
|
|
19
19
|
MAX_RUNTIME="${NW_AUDIT_MAX_RUNTIME:-1800}" # 30 minutes
|
|
20
20
|
MAX_LOG_SIZE="524288" # 512 KB
|
|
21
21
|
PROVIDER_CMD="${NW_PROVIDER_CMD:-claude}"
|
|
22
|
+
PROVIDER_LABEL="${NW_PROVIDER_LABEL:-}"
|
|
22
23
|
|
|
23
24
|
# Ensure NVM / Node / Claude are on PATH
|
|
24
25
|
export NVM_DIR="${HOME}/.nvm"
|
|
@@ -32,7 +33,8 @@ source "${SCRIPT_DIR}/night-watch-helpers.sh"
|
|
|
32
33
|
PROJECT_RUNTIME_KEY=$(project_runtime_key "${PROJECT_DIR}")
|
|
33
34
|
# NOTE: Lock file path must match auditLockPath() in src/utils/status-data.ts
|
|
34
35
|
LOCK_FILE="/tmp/night-watch-audit-${PROJECT_RUNTIME_KEY}.lock"
|
|
35
|
-
AUDIT_PROMPT_TEMPLATE="${SCRIPT_DIR}/../templates/
|
|
36
|
+
AUDIT_PROMPT_TEMPLATE="${SCRIPT_DIR}/../templates/audit.md"
|
|
37
|
+
PROVIDER_MODEL_DISPLAY=$(resolve_provider_model_display "${PROVIDER_CMD}" "${PROVIDER_LABEL}")
|
|
36
38
|
|
|
37
39
|
emit_result() {
|
|
38
40
|
local status="${1:?status required}"
|
|
@@ -59,13 +61,13 @@ if ! acquire_lock "${LOCK_FILE}"; then
|
|
|
59
61
|
fi
|
|
60
62
|
|
|
61
63
|
send_telegram_status_message "🔎 Night Watch Auditor: started" "Project: ${PROJECT_NAME}
|
|
62
|
-
Provider: ${
|
|
63
|
-
|
|
64
|
+
Provider (model): ${PROVIDER_MODEL_DISPLAY}
|
|
65
|
+
Action: running code quality audit."
|
|
64
66
|
|
|
65
67
|
# Dry-run mode: print diagnostics and exit
|
|
66
68
|
if [ "${NW_DRY_RUN:-0}" = "1" ]; then
|
|
67
69
|
echo "=== Dry Run: Code Auditor ==="
|
|
68
|
-
echo "Provider: ${
|
|
70
|
+
echo "Provider (model): ${PROVIDER_MODEL_DISPLAY}"
|
|
69
71
|
echo "Max Runtime: ${MAX_RUNTIME}s"
|
|
70
72
|
echo "Report File: ${REPORT_FILE}"
|
|
71
73
|
echo "Prompt Template: ${AUDIT_PROMPT_TEMPLATE}"
|
|
@@ -76,6 +78,8 @@ fi
|
|
|
76
78
|
if [ ! -f "${AUDIT_PROMPT_TEMPLATE}" ]; then
|
|
77
79
|
log "FAIL: Missing bundled audit prompt template at ${AUDIT_PROMPT_TEMPLATE}"
|
|
78
80
|
send_telegram_status_message "🔎 Night Watch Auditor: failed" "Project: ${PROJECT_NAME}
|
|
81
|
+
Provider (model): ${PROVIDER_MODEL_DISPLAY}
|
|
82
|
+
Failure reason: missing_prompt_template
|
|
79
83
|
Missing prompt template:
|
|
80
84
|
${AUDIT_PROMPT_TEMPLATE}"
|
|
81
85
|
emit_result "failure_missing_prompt"
|
|
@@ -98,6 +102,8 @@ cleanup_worktrees "${PROJECT_DIR}" "${AUDIT_WORKTREE_BASENAME}"
|
|
|
98
102
|
if ! prepare_detached_worktree "${PROJECT_DIR}" "${AUDIT_WORKTREE_DIR}" "${DEFAULT_BRANCH}" "${LOG_FILE}"; then
|
|
99
103
|
log "FAIL: Unable to create isolated audit worktree ${AUDIT_WORKTREE_DIR}"
|
|
100
104
|
send_telegram_status_message "🔎 Night Watch Auditor: failed" "Project: ${PROJECT_NAME}
|
|
105
|
+
Provider (model): ${PROVIDER_MODEL_DISPLAY}
|
|
106
|
+
Failure reason: worktree_setup_failed
|
|
101
107
|
Failed to create audit worktree."
|
|
102
108
|
emit_result "failure" "reason=worktree_setup_failed"
|
|
103
109
|
exit 1
|
|
@@ -179,6 +185,8 @@ if [ "${EXIT_CODE}" -eq 0 ]; then
|
|
|
179
185
|
if [ ! -f "${REPORT_FILE}" ]; then
|
|
180
186
|
log "FAIL: Audit provider exited 0 but no report was generated at ${REPORT_FILE}"
|
|
181
187
|
send_telegram_status_message "🔎 Night Watch Auditor: failed" "Project: ${PROJECT_NAME}
|
|
188
|
+
Provider (model): ${PROVIDER_MODEL_DISPLAY}
|
|
189
|
+
Failure reason: no_report_generated
|
|
182
190
|
Provider exited successfully but no report file was generated."
|
|
183
191
|
emit_result "failure_no_report"
|
|
184
192
|
exit 1
|
|
@@ -187,22 +195,27 @@ Provider exited successfully but no report file was generated."
|
|
|
187
195
|
if grep -q "NO_ISSUES_FOUND" "${REPORT_FILE}" 2>/dev/null; then
|
|
188
196
|
log "DONE: Audit complete — no actionable issues found"
|
|
189
197
|
send_telegram_status_message "🔎 Night Watch Auditor: complete (clean)" "Project: ${PROJECT_NAME}
|
|
198
|
+
Provider (model): ${PROVIDER_MODEL_DISPLAY}
|
|
190
199
|
No actionable issues found."
|
|
191
200
|
emit_result "skip_clean"
|
|
192
201
|
else
|
|
193
202
|
log "DONE: Audit complete — report written to ${REPORT_FILE}"
|
|
194
203
|
send_telegram_status_message "🔎 Night Watch Auditor: complete" "Project: ${PROJECT_NAME}
|
|
204
|
+
Provider (model): ${PROVIDER_MODEL_DISPLAY}
|
|
195
205
|
Report: ${REPORT_FILE}"
|
|
196
206
|
emit_result "success_audit"
|
|
197
207
|
fi
|
|
198
208
|
elif [ "${EXIT_CODE}" -eq 124 ]; then
|
|
199
209
|
log "TIMEOUT: Audit killed after ${MAX_RUNTIME}s"
|
|
200
210
|
send_telegram_status_message "🔎 Night Watch Auditor: timeout" "Project: ${PROJECT_NAME}
|
|
211
|
+
Provider (model): ${PROVIDER_MODEL_DISPLAY}
|
|
201
212
|
Timeout: ${MAX_RUNTIME}s"
|
|
202
213
|
emit_result "timeout"
|
|
203
214
|
else
|
|
204
215
|
log "FAIL: Audit exited with code ${EXIT_CODE}"
|
|
205
216
|
send_telegram_status_message "🔎 Night Watch Auditor: failed" "Project: ${PROJECT_NAME}
|
|
217
|
+
Provider (model): ${PROVIDER_MODEL_DISPLAY}
|
|
218
|
+
Failure reason: provider_exit_${EXIT_CODE}
|
|
206
219
|
Exit code: ${EXIT_CODE}"
|
|
207
220
|
emit_result "failure" "provider_exit=${EXIT_CODE}"
|
|
208
221
|
fi
|
|
@@ -25,6 +25,11 @@ LOG_FILE="${LOG_DIR}/executor.log"
|
|
|
25
25
|
MAX_RUNTIME="${NW_MAX_RUNTIME:-7200}" # 2 hours
|
|
26
26
|
MAX_LOG_SIZE="524288" # 512 KB
|
|
27
27
|
PROVIDER_CMD="${NW_PROVIDER_CMD:-claude}"
|
|
28
|
+
# Human-friendly provider label used in PR comments, board comments, and commit attribution.
|
|
29
|
+
# NW_PROVIDER_LABEL is set by the Node CLI (derived from config.providerLabel or auto-detected).
|
|
30
|
+
# EFFECTIVE_PROVIDER_LABEL may be updated after execution if rate-limit fallback is triggered.
|
|
31
|
+
PROVIDER_LABEL="${NW_PROVIDER_LABEL:-${PROVIDER_CMD}}"
|
|
32
|
+
EFFECTIVE_PROVIDER_LABEL="${PROVIDER_LABEL}"
|
|
28
33
|
BRANCH_PREFIX="${NW_BRANCH_PREFIX:-night-watch}"
|
|
29
34
|
|
|
30
35
|
# Ensure NVM / Node / Claude are on PATH
|
|
@@ -289,7 +294,7 @@ finalize_prd_done() {
|
|
|
289
294
|
fi
|
|
290
295
|
git -C "${BOOKKEEP_WORKTREE_DIR}" commit -m "chore: mark ${ELIGIBLE_PRD} as done (${reason})
|
|
291
296
|
|
|
292
|
-
Co-Authored-By:
|
|
297
|
+
Co-Authored-By: Night Watch [${EFFECTIVE_PROVIDER_LABEL}] <noreply@anthropic.com>" || true
|
|
293
298
|
git -C "${BOOKKEEP_WORKTREE_DIR}" push origin "HEAD:${DEFAULT_BRANCH}" || true
|
|
294
299
|
log "DONE: ${ELIGIBLE_PRD} ${reason}, PRD moved to done/"
|
|
295
300
|
return 0
|
|
@@ -521,6 +526,8 @@ if [ "${RATE_LIMIT_FALLBACK_TRIGGERED}" = "1" ]; then
|
|
|
521
526
|
fi
|
|
522
527
|
|
|
523
528
|
log "RATE-LIMIT-FALLBACK: Native Claude exited with code ${EXIT_CODE}"
|
|
529
|
+
# Update effective provider label to reflect actual executor used
|
|
530
|
+
EFFECTIVE_PROVIDER_LABEL="Claude ${FALLBACK_MODEL} (fallback)"
|
|
524
531
|
fi
|
|
525
532
|
|
|
526
533
|
if [ ${EXIT_CODE} -eq 0 ]; then
|
|
@@ -531,12 +538,19 @@ if [ ${EXIT_CODE} -eq 0 ]; then
|
|
|
531
538
|
PR_URL=$(gh pr list --state open --json headRefName,url \
|
|
532
539
|
--jq ".[] | select(.headRefName == \"${BRANCH_NAME}\") | .url" 2>/dev/null || true)
|
|
533
540
|
if [ -n "${PR_URL}" ]; then
|
|
534
|
-
"${NW_CLI}" board comment "${ISSUE_NUMBER}" --body "PR opened: ${PR_URL}" 2>>"${LOG_FILE}" || true
|
|
541
|
+
"${NW_CLI}" board comment "${ISSUE_NUMBER}" --body "PR opened: ${PR_URL} (via ${EFFECTIVE_PROVIDER_LABEL})" 2>>"${LOG_FILE}" || true
|
|
542
|
+
gh pr comment "${PR_URL}" --body "> 🤖 Implemented by ${EFFECTIVE_PROVIDER_LABEL}" 2>>"${LOG_FILE}" || true
|
|
535
543
|
fi
|
|
536
544
|
"${NW_CLI}" board close-issue "${ISSUE_NUMBER}" 2>>"${LOG_FILE}" || \
|
|
537
545
|
"${NW_CLI}" board move-issue "${ISSUE_NUMBER}" --column "Done" 2>>"${LOG_FILE}" || true
|
|
538
546
|
emit_result "success_open_pr" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}"
|
|
539
547
|
elif finalize_prd_done "implemented, PR opened on ${BRANCH_NAME}"; then
|
|
548
|
+
# Non-board mode: post attribution comment to the PR
|
|
549
|
+
NON_BOARD_PR_URL=$(gh pr list --state open --json headRefName,url \
|
|
550
|
+
--jq ".[] | select(.headRefName == \"${BRANCH_NAME}\") | .url" 2>/dev/null || true)
|
|
551
|
+
if [ -n "${NON_BOARD_PR_URL}" ]; then
|
|
552
|
+
gh pr comment "${NON_BOARD_PR_URL}" --body "> 🤖 Implemented by ${EFFECTIVE_PROVIDER_LABEL}" 2>>"${LOG_FILE}" || true
|
|
553
|
+
fi
|
|
540
554
|
emit_result "success_open_pr" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}"
|
|
541
555
|
else
|
|
542
556
|
night_watch_history record "${PROJECT_DIR}" "${ELIGIBLE_PRD}" failure --exit-code 1 2>/dev/null || true
|
|
@@ -562,7 +576,7 @@ if [ ${EXIT_CODE} -eq 0 ]; then
|
|
|
562
576
|
if [ -n "${ISSUE_NUMBER}" ]; then
|
|
563
577
|
"${NW_CLI}" board move-issue "${ISSUE_NUMBER}" --column "Ready" 2>>"${LOG_FILE}" || true
|
|
564
578
|
"${NW_CLI}" board comment "${ISSUE_NUMBER}" \
|
|
565
|
-
--body "Execution completed but no PR was found. Moved back to Ready for retry." 2>>"${LOG_FILE}" || true
|
|
579
|
+
--body "Execution completed but no PR was found (via ${EFFECTIVE_PROVIDER_LABEL}). Moved back to Ready for retry." 2>>"${LOG_FILE}" || true
|
|
566
580
|
fi
|
|
567
581
|
night_watch_history record "${PROJECT_DIR}" "${ELIGIBLE_PRD}" failure --exit-code 1 2>/dev/null || true
|
|
568
582
|
emit_result "failure_no_pr_after_success" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}"
|
|
@@ -575,7 +589,7 @@ elif [ ${EXIT_CODE} -eq 124 ]; then
|
|
|
575
589
|
if [ -n "${ISSUE_NUMBER}" ]; then
|
|
576
590
|
"${NW_CLI}" board move-issue "${ISSUE_NUMBER}" --column "Ready" 2>>"${LOG_FILE}" || true
|
|
577
591
|
"${NW_CLI}" board comment "${ISSUE_NUMBER}" \
|
|
578
|
-
--body "Execution timed out after ${MAX_RUNTIME}s. Moved back to Ready for retry." 2>>"${LOG_FILE}" || true
|
|
592
|
+
--body "Execution timed out after ${MAX_RUNTIME}s (via ${EFFECTIVE_PROVIDER_LABEL}). Moved back to Ready for retry." 2>>"${LOG_FILE}" || true
|
|
579
593
|
TIMEOUT_FOLLOWUP_COMMENT=$(build_timeout_followup_comment \
|
|
580
594
|
"${MAX_RUNTIME}" \
|
|
581
595
|
"${ELIGIBLE_PRD}" \
|
|
@@ -590,7 +604,7 @@ else
|
|
|
590
604
|
if [ -n "${ISSUE_NUMBER}" ]; then
|
|
591
605
|
"${NW_CLI}" board move-issue "${ISSUE_NUMBER}" --column "Ready" 2>>"${LOG_FILE}" || true
|
|
592
606
|
"${NW_CLI}" board comment "${ISSUE_NUMBER}" \
|
|
593
|
-
--body "Execution failed with exit code ${EXIT_CODE}. Moved back to Ready for retry." 2>>"${LOG_FILE}" || true
|
|
607
|
+
--body "Execution failed with exit code ${EXIT_CODE} (via ${EFFECTIVE_PROVIDER_LABEL}). Moved back to Ready for retry." 2>>"${LOG_FILE}" || true
|
|
594
608
|
fi
|
|
595
609
|
night_watch_history record "${PROJECT_DIR}" "${ELIGIBLE_PRD}" failure --exit-code "${EXIT_CODE}" 2>/dev/null || true
|
|
596
610
|
emit_result "failure" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}"
|
|
@@ -76,6 +76,24 @@ resolve_instruction_path() {
|
|
|
76
76
|
return 1
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
resolve_instruction_path_with_fallback() {
|
|
80
|
+
local project_dir="${1:?project_dir required}"
|
|
81
|
+
shift || true
|
|
82
|
+
local instruction_file=""
|
|
83
|
+
local resolved_path=""
|
|
84
|
+
|
|
85
|
+
for instruction_file in "$@"; do
|
|
86
|
+
[ -z "${instruction_file}" ] && continue
|
|
87
|
+
resolved_path=$(resolve_instruction_path "${project_dir}" "${instruction_file}" || true)
|
|
88
|
+
if [ -n "${resolved_path}" ]; then
|
|
89
|
+
printf "%s" "${resolved_path}"
|
|
90
|
+
return 0
|
|
91
|
+
fi
|
|
92
|
+
done
|
|
93
|
+
|
|
94
|
+
return 1
|
|
95
|
+
}
|
|
96
|
+
|
|
79
97
|
instruction_ref_for_prompt() {
|
|
80
98
|
local root_dir="${1:?root_dir required}"
|
|
81
99
|
local instruction_path="${2:?instruction_path required}"
|
|
@@ -87,6 +105,36 @@ instruction_ref_for_prompt() {
|
|
|
87
105
|
fi
|
|
88
106
|
}
|
|
89
107
|
|
|
108
|
+
prefer_bundled_prompt_if_legacy_command() {
|
|
109
|
+
local project_root="${1:?project_root required}"
|
|
110
|
+
local resolved_prompt_path="${2:?resolved_prompt_path required}"
|
|
111
|
+
local bundled_prompt_name="${3:?bundled_prompt_name required}"
|
|
112
|
+
local script_dir=""
|
|
113
|
+
local bundled_prompt_path=""
|
|
114
|
+
local rel_path=""
|
|
115
|
+
|
|
116
|
+
if [ -n "${SCRIPT_DIR:-}" ]; then
|
|
117
|
+
script_dir="${SCRIPT_DIR}"
|
|
118
|
+
else
|
|
119
|
+
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
120
|
+
fi
|
|
121
|
+
|
|
122
|
+
bundled_prompt_path="${script_dir}/../templates/${bundled_prompt_name}"
|
|
123
|
+
|
|
124
|
+
# Legacy .claude command prompt files often contain slash-command wrappers
|
|
125
|
+
# rather than the full automation prompt. Prefer bundled templates in that case.
|
|
126
|
+
if [[ "${resolved_prompt_path}" == "${project_root}/.claude/commands/"* ]] && [ -f "${bundled_prompt_path}" ]; then
|
|
127
|
+
rel_path="${resolved_prompt_path#${project_root}/}"
|
|
128
|
+
if grep -Eqi '^[[:space:]]*/[a-z0-9._/-]+' "${resolved_prompt_path}" 2>/dev/null; then
|
|
129
|
+
log "WARN: Prompt ${rel_path} looks like a slash-command wrapper; using bundled template ${bundled_prompt_name}"
|
|
130
|
+
printf "%s" "${bundled_prompt_path}"
|
|
131
|
+
return 0
|
|
132
|
+
fi
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
printf "%s" "${resolved_prompt_path}"
|
|
136
|
+
}
|
|
137
|
+
|
|
90
138
|
night_watch_history() {
|
|
91
139
|
local cli_bin
|
|
92
140
|
cli_bin=$(resolve_night_watch_cli) || return 127
|
|
@@ -481,6 +529,95 @@ check_rate_limited() {
|
|
|
481
529
|
fi
|
|
482
530
|
}
|
|
483
531
|
|
|
532
|
+
# Resolve URL host from a URL-like string.
|
|
533
|
+
# Example: "https://api.z.ai/api/anthropic" -> "api.z.ai"
|
|
534
|
+
extract_url_host() {
|
|
535
|
+
local raw_url="${1:-}"
|
|
536
|
+
if [ -z "${raw_url}" ]; then
|
|
537
|
+
return 0
|
|
538
|
+
fi
|
|
539
|
+
printf '%s' "${raw_url}" | sed -E 's#^[[:alpha:]][[:alnum:]+.-]*://##; s#/.*$##'
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
# Resolve a Claude model hint from env vars.
|
|
543
|
+
# Priority:
|
|
544
|
+
# 1) ANTHROPIC_DEFAULT_SONNET_MODEL / ANTHROPIC_DEFAULT_OPUS_MODEL (providerEnv overrides)
|
|
545
|
+
# 2) NW_CLAUDE_MODEL_ID (resolved from config.claudeModel by caller)
|
|
546
|
+
# 3) "default"
|
|
547
|
+
resolve_claude_model_hint() {
|
|
548
|
+
local sonnet="${ANTHROPIC_DEFAULT_SONNET_MODEL:-}"
|
|
549
|
+
local opus="${ANTHROPIC_DEFAULT_OPUS_MODEL:-}"
|
|
550
|
+
local native_model="${NW_CLAUDE_MODEL_ID:-}"
|
|
551
|
+
|
|
552
|
+
if [ -n "${sonnet}" ] && [ -n "${opus}" ]; then
|
|
553
|
+
if [ "${sonnet}" = "${opus}" ]; then
|
|
554
|
+
printf "%s" "${sonnet}"
|
|
555
|
+
else
|
|
556
|
+
printf "sonnet=%s, opus=%s" "${sonnet}" "${opus}"
|
|
557
|
+
fi
|
|
558
|
+
return 0
|
|
559
|
+
fi
|
|
560
|
+
if [ -n "${sonnet}" ]; then
|
|
561
|
+
printf "%s" "${sonnet}"
|
|
562
|
+
return 0
|
|
563
|
+
fi
|
|
564
|
+
if [ -n "${opus}" ]; then
|
|
565
|
+
printf "%s" "${opus}"
|
|
566
|
+
return 0
|
|
567
|
+
fi
|
|
568
|
+
if [ -n "${native_model}" ]; then
|
|
569
|
+
printf "%s" "${native_model}"
|
|
570
|
+
return 0
|
|
571
|
+
fi
|
|
572
|
+
printf "default"
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
# Build a user-facing provider/model display string.
|
|
576
|
+
# Examples:
|
|
577
|
+
# claude (glm-5 via api.z.ai)
|
|
578
|
+
# claude (claude-sonnet-4-6)
|
|
579
|
+
# codex
|
|
580
|
+
# codex (Custom Label)
|
|
581
|
+
resolve_provider_model_display() {
|
|
582
|
+
local provider_cmd="${1:?provider command required}"
|
|
583
|
+
local provider_label="${2:-}"
|
|
584
|
+
local label_trimmed=""
|
|
585
|
+
local model_hint=""
|
|
586
|
+
local endpoint_host=""
|
|
587
|
+
local details=""
|
|
588
|
+
|
|
589
|
+
label_trimmed=$(printf '%s' "${provider_label}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
|
|
590
|
+
|
|
591
|
+
case "${provider_cmd}" in
|
|
592
|
+
claude)
|
|
593
|
+
model_hint=$(resolve_claude_model_hint)
|
|
594
|
+
endpoint_host=$(extract_url_host "${ANTHROPIC_BASE_URL:-}")
|
|
595
|
+
details="${model_hint}"
|
|
596
|
+
if [ -n "${endpoint_host}" ]; then
|
|
597
|
+
details="${details} via ${endpoint_host}"
|
|
598
|
+
fi
|
|
599
|
+
if [ -n "${label_trimmed}" ] && [ "${label_trimmed}" != "Claude" ] && [ "${label_trimmed}" != "Claude (proxy)" ]; then
|
|
600
|
+
details="${label_trimmed}; ${details}"
|
|
601
|
+
fi
|
|
602
|
+
printf "%s (%s)" "${provider_cmd}" "${details}"
|
|
603
|
+
;;
|
|
604
|
+
codex)
|
|
605
|
+
if [ -n "${label_trimmed}" ] && [ "${label_trimmed}" != "Codex" ]; then
|
|
606
|
+
printf "%s (%s)" "${provider_cmd}" "${label_trimmed}"
|
|
607
|
+
else
|
|
608
|
+
printf "%s" "${provider_cmd}"
|
|
609
|
+
fi
|
|
610
|
+
;;
|
|
611
|
+
*)
|
|
612
|
+
if [ -n "${label_trimmed}" ]; then
|
|
613
|
+
printf "%s (%s)" "${provider_cmd}" "${label_trimmed}"
|
|
614
|
+
else
|
|
615
|
+
printf "%s" "${provider_cmd}"
|
|
616
|
+
fi
|
|
617
|
+
;;
|
|
618
|
+
esac
|
|
619
|
+
}
|
|
620
|
+
|
|
484
621
|
# Send a generic Telegram status message.
|
|
485
622
|
# Preferred input: NW_TELEGRAM_STATUS_WEBHOOKS (JSON array with botToken/chatId).
|
|
486
623
|
# Legacy fallback: NW_TELEGRAM_BOT_TOKEN + NW_TELEGRAM_CHAT_ID.
|