@jonit-dev/night-watch-cli 1.8.14-beta.0 → 1.8.14-beta.2
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 +27 -4
- package/dist/commands/merge.d.ts.map +1 -1
- package/dist/commands/merge.js +4 -0
- package/dist/commands/merge.js.map +1 -1
- package/dist/scripts/night-watch-merger-cron.sh +181 -9
- package/dist/web/assets/index-6Yf-Q6Di.js +442 -0
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -378,7 +378,18 @@ var init_job_registry = __esm({
|
|
|
378
378
|
{ name: "minReviewScore", type: "number", defaultValue: 80 },
|
|
379
379
|
{ name: "branchPatterns", type: "string[]", defaultValue: [] },
|
|
380
380
|
{ name: "rebaseBeforeMerge", type: "boolean", defaultValue: true },
|
|
381
|
-
{ name: "maxPrsPerRun", type: "number", defaultValue: 0 }
|
|
381
|
+
{ name: "maxPrsPerRun", type: "number", defaultValue: 0 },
|
|
382
|
+
{
|
|
383
|
+
name: "ciPolicy",
|
|
384
|
+
type: "enum",
|
|
385
|
+
enumValues: ["ci-only", "fallback-local", "ignore"],
|
|
386
|
+
defaultValue: "fallback-local"
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
name: "localCheckCommand",
|
|
390
|
+
type: "string",
|
|
391
|
+
defaultValue: "yarn install --frozen-lockfile && yarn verify && yarn test"
|
|
392
|
+
}
|
|
382
393
|
],
|
|
383
394
|
defaultConfig: {
|
|
384
395
|
enabled: false,
|
|
@@ -388,7 +399,9 @@ var init_job_registry = __esm({
|
|
|
388
399
|
minReviewScore: 80,
|
|
389
400
|
branchPatterns: [],
|
|
390
401
|
rebaseBeforeMerge: true,
|
|
391
|
-
maxPrsPerRun: 0
|
|
402
|
+
maxPrsPerRun: 0,
|
|
403
|
+
ciPolicy: "fallback-local",
|
|
404
|
+
localCheckCommand: "yarn install --frozen-lockfile && yarn verify && yarn test"
|
|
392
405
|
}
|
|
393
406
|
}
|
|
394
407
|
];
|
|
@@ -410,7 +423,7 @@ function resolveProviderBucketKey(provider, providerEnv) {
|
|
|
410
423
|
return `claude-proxy:${baseUrl}`;
|
|
411
424
|
}
|
|
412
425
|
}
|
|
413
|
-
var DEFAULT_DEFAULT_BRANCH, DEFAULT_PRD_DIR, DEFAULT_SUMMARY_WINDOW_HOURS, DEFAULT_MAX_RUNTIME, DEFAULT_REVIEWER_MAX_RUNTIME, DEFAULT_CRON_SCHEDULE, DEFAULT_REVIEWER_SCHEDULE, DEFAULT_CRON_SCHEDULE_OFFSET, DEFAULT_MAX_RETRIES, DEFAULT_REVIEWER_MAX_RETRIES, DEFAULT_REVIEWER_RETRY_DELAY, DEFAULT_REVIEWER_MAX_PRS_PER_RUN, DEFAULT_FEEDBACK, DEFAULT_BRANCH_PREFIX, DEFAULT_BRANCH_PATTERNS, DEFAULT_MIN_REVIEW_SCORE, DEFAULT_MAX_LOG_SIZE, DEFAULT_PROVIDER, DEFAULT_EXECUTOR_ENABLED, DEFAULT_REVIEWER_ENABLED, DEFAULT_PROVIDER_ENV, DEFAULT_FALLBACK_ON_RATE_LIMIT, DEFAULT_CLAUDE_MODEL, DEFAULT_PRIMARY_FALLBACK_MODEL, DEFAULT_SECONDARY_FALLBACK_MODEL, VALID_CLAUDE_MODELS, CLAUDE_MODEL_IDS, DEFAULT_NOTIFICATIONS, DEFAULT_PRD_PRIORITY, DEFAULT_SLICER_SCHEDULE, DEFAULT_SLICER_MAX_RUNTIME, DEFAULT_ROADMAP_SCANNER, DEFAULT_TEMPLATES_DIR, DEFAULT_BOARD_PROVIDER, DEFAULT_LOCAL_BOARD_INFO, DEFAULT_AUTO_MERGE, DEFAULT_AUTO_MERGE_METHOD, VALID_MERGE_METHODS, DEFAULT_QA_ENABLED, DEFAULT_QA_SCHEDULE, DEFAULT_QA_MAX_RUNTIME, DEFAULT_QA_ARTIFACTS, DEFAULT_QA_SKIP_LABEL, DEFAULT_QA_AUTO_INSTALL_PLAYWRIGHT, DEFAULT_QA_VALIDATED_LABEL, DEFAULT_QA, QA_LOG_NAME, DEFAULT_AUDIT_ENABLED, DEFAULT_AUDIT_SCHEDULE, DEFAULT_AUDIT_MAX_RUNTIME, DEFAULT_AUDIT_CREATE_ISSUES, DEFAULT_AUDIT_TARGET_COLUMN, DEFAULT_AUDIT, DEFAULT_ANALYTICS_ENABLED, DEFAULT_ANALYTICS_SCHEDULE, DEFAULT_ANALYTICS_MAX_RUNTIME, DEFAULT_ANALYTICS_LOOKBACK_DAYS, DEFAULT_ANALYTICS_TARGET_COLUMN, DEFAULT_ANALYTICS_PROMPT, DEFAULT_ANALYTICS, DEFAULT_PR_RESOLVER_ENABLED, DEFAULT_PR_RESOLVER_SCHEDULE, DEFAULT_PR_RESOLVER_MAX_RUNTIME, DEFAULT_PR_RESOLVER_MAX_PRS_PER_RUN, DEFAULT_PR_RESOLVER_PER_PR_TIMEOUT, DEFAULT_PR_RESOLVER_AI_CONFLICT_RESOLUTION, DEFAULT_PR_RESOLVER_AI_REVIEW_RESOLUTION, DEFAULT_PR_RESOLVER_READY_LABEL, DEFAULT_PR_RESOLVER, DEFAULT_MERGER_ENABLED, DEFAULT_MERGER_SCHEDULE, DEFAULT_MERGER_MAX_RUNTIME, DEFAULT_MERGER_MERGE_METHOD, DEFAULT_MERGER_MIN_REVIEW_SCORE, DEFAULT_MERGER_REBASE_BEFORE_MERGE, DEFAULT_MERGER_MAX_PRS_PER_RUN, DEFAULT_MERGER, MERGER_LOG_NAME, AUDIT_LOG_NAME, PLANNER_LOG_NAME, ANALYTICS_LOG_NAME, PR_RESOLVER_LOG_NAME, VALID_PROVIDERS, VALID_JOB_TYPES, DEFAULT_JOB_PROVIDERS, DEFAULT_PROVIDER_SCHEDULE_OVERRIDES, DEFAULT_WEBHOOK_TRIGGER_SECRET_ENV, DEFAULT_WEBHOOK_TRIGGER_MAX_SKEW_SECONDS, DEFAULT_WEBHOOK_TRIGGERS, BUILT_IN_PRESETS, BUILT_IN_PRESET_IDS, PROVIDER_COMMANDS, CONFIG_FILE_NAME, LOCK_FILE_PREFIX, LOG_DIR, CLAIM_FILE_EXTENSION, EXECUTOR_LOG_NAME, REVIEWER_LOG_NAME, EXECUTOR_LOG_FILE, REVIEWER_LOG_FILE, LOG_FILE_NAMES, GLOBAL_CONFIG_DIR, REGISTRY_FILE_NAME, HISTORY_FILE_NAME, PRD_STATES_FILE_NAME, STATE_DB_FILE_NAME, GLOBAL_NOTIFICATIONS_FILE_NAME, MAX_HISTORY_RECORDS_PER_PRD, DEFAULT_QUEUE_ENABLED, DEFAULT_QUEUE_MODE, DEFAULT_QUEUE_MAX_CONCURRENCY, DEFAULT_QUEUE_MAX_WAIT_TIME, DEFAULT_QUEUE_PRIORITY, DEFAULT_QUEUE, DEFAULT_SCHEDULING_PRIORITY;
|
|
426
|
+
var DEFAULT_DEFAULT_BRANCH, DEFAULT_PRD_DIR, DEFAULT_SUMMARY_WINDOW_HOURS, DEFAULT_MAX_RUNTIME, DEFAULT_REVIEWER_MAX_RUNTIME, DEFAULT_CRON_SCHEDULE, DEFAULT_REVIEWER_SCHEDULE, DEFAULT_CRON_SCHEDULE_OFFSET, DEFAULT_MAX_RETRIES, DEFAULT_REVIEWER_MAX_RETRIES, DEFAULT_REVIEWER_RETRY_DELAY, DEFAULT_REVIEWER_MAX_PRS_PER_RUN, DEFAULT_FEEDBACK, DEFAULT_BRANCH_PREFIX, DEFAULT_BRANCH_PATTERNS, DEFAULT_MIN_REVIEW_SCORE, DEFAULT_MAX_LOG_SIZE, DEFAULT_PROVIDER, DEFAULT_EXECUTOR_ENABLED, DEFAULT_REVIEWER_ENABLED, DEFAULT_PROVIDER_ENV, DEFAULT_FALLBACK_ON_RATE_LIMIT, DEFAULT_CLAUDE_MODEL, DEFAULT_PRIMARY_FALLBACK_MODEL, DEFAULT_SECONDARY_FALLBACK_MODEL, VALID_CLAUDE_MODELS, CLAUDE_MODEL_IDS, DEFAULT_NOTIFICATIONS, DEFAULT_PRD_PRIORITY, DEFAULT_SLICER_SCHEDULE, DEFAULT_SLICER_MAX_RUNTIME, DEFAULT_ROADMAP_SCANNER, DEFAULT_TEMPLATES_DIR, DEFAULT_BOARD_PROVIDER, DEFAULT_LOCAL_BOARD_INFO, DEFAULT_AUTO_MERGE, DEFAULT_AUTO_MERGE_METHOD, VALID_MERGE_METHODS, DEFAULT_QA_ENABLED, DEFAULT_QA_SCHEDULE, DEFAULT_QA_MAX_RUNTIME, DEFAULT_QA_ARTIFACTS, DEFAULT_QA_SKIP_LABEL, DEFAULT_QA_AUTO_INSTALL_PLAYWRIGHT, DEFAULT_QA_VALIDATED_LABEL, DEFAULT_QA, QA_LOG_NAME, DEFAULT_AUDIT_ENABLED, DEFAULT_AUDIT_SCHEDULE, DEFAULT_AUDIT_MAX_RUNTIME, DEFAULT_AUDIT_CREATE_ISSUES, DEFAULT_AUDIT_TARGET_COLUMN, DEFAULT_AUDIT, DEFAULT_ANALYTICS_ENABLED, DEFAULT_ANALYTICS_SCHEDULE, DEFAULT_ANALYTICS_MAX_RUNTIME, DEFAULT_ANALYTICS_LOOKBACK_DAYS, DEFAULT_ANALYTICS_TARGET_COLUMN, DEFAULT_ANALYTICS_PROMPT, DEFAULT_ANALYTICS, DEFAULT_PR_RESOLVER_ENABLED, DEFAULT_PR_RESOLVER_SCHEDULE, DEFAULT_PR_RESOLVER_MAX_RUNTIME, DEFAULT_PR_RESOLVER_MAX_PRS_PER_RUN, DEFAULT_PR_RESOLVER_PER_PR_TIMEOUT, DEFAULT_PR_RESOLVER_AI_CONFLICT_RESOLUTION, DEFAULT_PR_RESOLVER_AI_REVIEW_RESOLUTION, DEFAULT_PR_RESOLVER_READY_LABEL, DEFAULT_PR_RESOLVER, DEFAULT_MERGER_ENABLED, DEFAULT_MERGER_SCHEDULE, DEFAULT_MERGER_MAX_RUNTIME, DEFAULT_MERGER_MERGE_METHOD, DEFAULT_MERGER_MIN_REVIEW_SCORE, DEFAULT_MERGER_REBASE_BEFORE_MERGE, DEFAULT_MERGER_MAX_PRS_PER_RUN, DEFAULT_MERGER_CI_POLICY, DEFAULT_MERGER_LOCAL_CHECK_COMMAND, DEFAULT_MERGER, MERGER_LOG_NAME, AUDIT_LOG_NAME, PLANNER_LOG_NAME, ANALYTICS_LOG_NAME, PR_RESOLVER_LOG_NAME, VALID_PROVIDERS, VALID_JOB_TYPES, DEFAULT_JOB_PROVIDERS, DEFAULT_PROVIDER_SCHEDULE_OVERRIDES, DEFAULT_WEBHOOK_TRIGGER_SECRET_ENV, DEFAULT_WEBHOOK_TRIGGER_MAX_SKEW_SECONDS, DEFAULT_WEBHOOK_TRIGGERS, BUILT_IN_PRESETS, BUILT_IN_PRESET_IDS, PROVIDER_COMMANDS, CONFIG_FILE_NAME, LOCK_FILE_PREFIX, LOG_DIR, CLAIM_FILE_EXTENSION, EXECUTOR_LOG_NAME, REVIEWER_LOG_NAME, EXECUTOR_LOG_FILE, REVIEWER_LOG_FILE, LOG_FILE_NAMES, GLOBAL_CONFIG_DIR, REGISTRY_FILE_NAME, HISTORY_FILE_NAME, PRD_STATES_FILE_NAME, STATE_DB_FILE_NAME, GLOBAL_NOTIFICATIONS_FILE_NAME, MAX_HISTORY_RECORDS_PER_PRD, DEFAULT_QUEUE_ENABLED, DEFAULT_QUEUE_MODE, DEFAULT_QUEUE_MAX_CONCURRENCY, DEFAULT_QUEUE_MAX_WAIT_TIME, DEFAULT_QUEUE_PRIORITY, DEFAULT_QUEUE, DEFAULT_SCHEDULING_PRIORITY;
|
|
414
427
|
var init_constants = __esm({
|
|
415
428
|
"../core/dist/constants.js"() {
|
|
416
429
|
"use strict";
|
|
@@ -547,6 +560,8 @@ If no issues are warranted, output an empty array: []`;
|
|
|
547
560
|
DEFAULT_MERGER_MIN_REVIEW_SCORE = 80;
|
|
548
561
|
DEFAULT_MERGER_REBASE_BEFORE_MERGE = true;
|
|
549
562
|
DEFAULT_MERGER_MAX_PRS_PER_RUN = 0;
|
|
563
|
+
DEFAULT_MERGER_CI_POLICY = "fallback-local";
|
|
564
|
+
DEFAULT_MERGER_LOCAL_CHECK_COMMAND = "yarn install --frozen-lockfile && yarn verify && yarn test";
|
|
550
565
|
DEFAULT_MERGER = {
|
|
551
566
|
enabled: DEFAULT_MERGER_ENABLED,
|
|
552
567
|
schedule: DEFAULT_MERGER_SCHEDULE,
|
|
@@ -555,7 +570,9 @@ If no issues are warranted, output an empty array: []`;
|
|
|
555
570
|
minReviewScore: DEFAULT_MERGER_MIN_REVIEW_SCORE,
|
|
556
571
|
branchPatterns: [],
|
|
557
572
|
rebaseBeforeMerge: DEFAULT_MERGER_REBASE_BEFORE_MERGE,
|
|
558
|
-
maxPrsPerRun: DEFAULT_MERGER_MAX_PRS_PER_RUN
|
|
573
|
+
maxPrsPerRun: DEFAULT_MERGER_MAX_PRS_PER_RUN,
|
|
574
|
+
ciPolicy: DEFAULT_MERGER_CI_POLICY,
|
|
575
|
+
localCheckCommand: DEFAULT_MERGER_LOCAL_CHECK_COMMAND
|
|
559
576
|
};
|
|
560
577
|
MERGER_LOG_NAME = "merger";
|
|
561
578
|
AUDIT_LOG_NAME = "audit";
|
|
@@ -9776,7 +9793,9 @@ __export(dist_exports, {
|
|
|
9776
9793
|
DEFAULT_MAX_RETRIES: () => DEFAULT_MAX_RETRIES,
|
|
9777
9794
|
DEFAULT_MAX_RUNTIME: () => DEFAULT_MAX_RUNTIME,
|
|
9778
9795
|
DEFAULT_MERGER: () => DEFAULT_MERGER,
|
|
9796
|
+
DEFAULT_MERGER_CI_POLICY: () => DEFAULT_MERGER_CI_POLICY,
|
|
9779
9797
|
DEFAULT_MERGER_ENABLED: () => DEFAULT_MERGER_ENABLED,
|
|
9798
|
+
DEFAULT_MERGER_LOCAL_CHECK_COMMAND: () => DEFAULT_MERGER_LOCAL_CHECK_COMMAND,
|
|
9780
9799
|
DEFAULT_MERGER_MAX_PRS_PER_RUN: () => DEFAULT_MERGER_MAX_PRS_PER_RUN,
|
|
9781
9800
|
DEFAULT_MERGER_MAX_RUNTIME: () => DEFAULT_MERGER_MAX_RUNTIME,
|
|
9782
9801
|
DEFAULT_MERGER_MERGE_METHOD: () => DEFAULT_MERGER_MERGE_METHOD,
|
|
@@ -20683,6 +20702,8 @@ function buildEnvVars7(config, options) {
|
|
|
20683
20702
|
env.NW_MERGER_BRANCH_PATTERNS = (config.merger.branchPatterns.length > 0 ? config.merger.branchPatterns : config.branchPatterns).join(",");
|
|
20684
20703
|
env.NW_MERGER_REBASE_BEFORE_MERGE = config.merger.rebaseBeforeMerge ? "1" : "0";
|
|
20685
20704
|
env.NW_MERGER_MAX_PRS_PER_RUN = String(config.merger.maxPrsPerRun);
|
|
20705
|
+
env.NW_MERGER_CI_POLICY = config.merger.ciPolicy;
|
|
20706
|
+
env.NW_MERGER_LOCAL_CHECK_COMMAND = config.merger.localCheckCommand;
|
|
20686
20707
|
return env;
|
|
20687
20708
|
}
|
|
20688
20709
|
function applyCliOverrides6(config, options) {
|
|
@@ -20728,6 +20749,8 @@ function printDryRun(config, envVars, scriptPath, projectDir) {
|
|
|
20728
20749
|
"Max PRs Per Run",
|
|
20729
20750
|
config.merger.maxPrsPerRun === 0 ? "Unlimited" : String(config.merger.maxPrsPerRun)
|
|
20730
20751
|
]);
|
|
20752
|
+
configTable.push(["CI Policy", config.merger.ciPolicy]);
|
|
20753
|
+
configTable.push(["Local Check Command", config.merger.localCheckCommand]);
|
|
20731
20754
|
console.log(configTable.toString());
|
|
20732
20755
|
header("Environment Variables");
|
|
20733
20756
|
for (const [key, value] of Object.entries(envVars)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,iBAAiB,EAalB,MAAM,mBAAmB,CAAC;AAS3B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,iBAAiB,EAalB,MAAM,mBAAmB,CAAC;AAS3B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,iBAAiB,CAgBnB;AAkED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4GnD"}
|
package/dist/commands/merge.js
CHANGED
|
@@ -18,6 +18,8 @@ export function buildEnvVars(config, options) {
|
|
|
18
18
|
env.NW_MERGER_BRANCH_PATTERNS = (config.merger.branchPatterns.length > 0 ? config.merger.branchPatterns : config.branchPatterns).join(',');
|
|
19
19
|
env.NW_MERGER_REBASE_BEFORE_MERGE = config.merger.rebaseBeforeMerge ? '1' : '0';
|
|
20
20
|
env.NW_MERGER_MAX_PRS_PER_RUN = String(config.merger.maxPrsPerRun);
|
|
21
|
+
env.NW_MERGER_CI_POLICY = config.merger.ciPolicy;
|
|
22
|
+
env.NW_MERGER_LOCAL_CHECK_COMMAND = config.merger.localCheckCommand;
|
|
21
23
|
return env;
|
|
22
24
|
}
|
|
23
25
|
/**
|
|
@@ -75,6 +77,8 @@ function printDryRun(config, envVars, scriptPath, projectDir) {
|
|
|
75
77
|
'Max PRs Per Run',
|
|
76
78
|
config.merger.maxPrsPerRun === 0 ? 'Unlimited' : String(config.merger.maxPrsPerRun),
|
|
77
79
|
]);
|
|
80
|
+
configTable.push(['CI Policy', config.merger.ciPolicy]);
|
|
81
|
+
configTable.push(['Local Check Command', config.merger.localCheckCommand]);
|
|
78
82
|
console.log(configTable.toString());
|
|
79
83
|
header('Environment Variables');
|
|
80
84
|
for (const [key, value] of Object.entries(envVars)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAEL,aAAa,EACb,WAAW,EACX,GAAG,EACH,uBAAuB,EACvB,aAAa,EACb,MAAM,EACN,IAAI,EACJ,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,IAAI,OAAO,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAW7B;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAyB,EACzB,OAAsB;IAEtB,mDAAmD;IACnD,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE/D,kDAAkD;IAClD,GAAG,CAAC,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7D,GAAG,CAAC,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;IACvD,GAAG,CAAC,0BAA0B,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACtE,GAAG,CAAC,yBAAyB,GAAG,CAC9B,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAC/F,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,GAAG,CAAC,6BAA6B,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAChF,GAAG,CAAC,yBAAyB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,8 @@ set -euo pipefail
|
|
|
14
14
|
# NW_MERGER_BRANCH_PATTERNS= - Comma-separated branch prefixes (empty = all)
|
|
15
15
|
# NW_MERGER_REBASE_BEFORE_MERGE=1 - Set to 1 to rebase before merging
|
|
16
16
|
# NW_MERGER_MAX_PRS_PER_RUN=0 - Max PRs to merge per run (0 = unlimited)
|
|
17
|
+
# NW_MERGER_CI_POLICY=fallback-local - CI gate: ci-only|fallback-local|ignore
|
|
18
|
+
# NW_MERGER_LOCAL_CHECK_COMMAND=... - Command run in temp PR worktree for local fallback
|
|
17
19
|
# NW_MERGER_CI_MAX_WAIT=300 - Max seconds to wait for checks after rebase
|
|
18
20
|
# NW_MERGER_CI_POLL_INTERVAL=15 - Seconds between check polls after rebase
|
|
19
21
|
# NW_DRY_RUN=0 - Set to 1 for dry-run mode
|
|
@@ -30,6 +32,8 @@ REBASE_BEFORE_MERGE="${NW_MERGER_REBASE_BEFORE_MERGE:-1}"
|
|
|
30
32
|
MAX_PRS_PER_RUN="${NW_MERGER_MAX_PRS_PER_RUN:-0}"
|
|
31
33
|
CI_MAX_WAIT="${NW_MERGER_CI_MAX_WAIT:-300}"
|
|
32
34
|
CI_POLL_INTERVAL="${NW_MERGER_CI_POLL_INTERVAL:-15}"
|
|
35
|
+
CI_POLICY="${NW_MERGER_CI_POLICY:-fallback-local}"
|
|
36
|
+
LOCAL_CHECK_COMMAND="${NW_MERGER_LOCAL_CHECK_COMMAND:-yarn install --frozen-lockfile && yarn verify && yarn test}"
|
|
33
37
|
BRANCH_PATTERNS_RAW="${NW_MERGER_BRANCH_PATTERNS:-}"
|
|
34
38
|
READY_TO_MERGE_LABEL="${NW_PR_RESOLVER_READY_LABEL:-ready-to-merge}"
|
|
35
39
|
SCRIPT_START_TIME=$(date +%s)
|
|
@@ -55,6 +59,10 @@ case "${MERGE_METHOD}" in
|
|
|
55
59
|
squash|merge|rebase) ;;
|
|
56
60
|
*) MERGE_METHOD="squash" ;;
|
|
57
61
|
esac
|
|
62
|
+
case "${CI_POLICY}" in
|
|
63
|
+
ci-only|fallback-local|ignore) ;;
|
|
64
|
+
*) CI_POLICY="fallback-local" ;;
|
|
65
|
+
esac
|
|
58
66
|
|
|
59
67
|
mkdir -p "${LOG_DIR}"
|
|
60
68
|
|
|
@@ -261,6 +269,160 @@ wait_for_ci_passing_on_head() {
|
|
|
261
269
|
[ "${LAST_CI_STATUS}" = "passing" ]
|
|
262
270
|
}
|
|
263
271
|
|
|
272
|
+
find_existing_worktree_for_head() {
|
|
273
|
+
local pr_branch="${1}"
|
|
274
|
+
local expected_head="${2}"
|
|
275
|
+
local project_real=""
|
|
276
|
+
local worktree_path=""
|
|
277
|
+
local branch=""
|
|
278
|
+
local head=""
|
|
279
|
+
|
|
280
|
+
project_real=$(cd "${PROJECT_DIR}" && pwd -P 2>/dev/null || echo "${PROJECT_DIR}")
|
|
281
|
+
|
|
282
|
+
while IFS= read -r line; do
|
|
283
|
+
if [[ "${line}" == worktree\ * ]]; then
|
|
284
|
+
worktree_path="${line#worktree }"
|
|
285
|
+
branch=""
|
|
286
|
+
head=""
|
|
287
|
+
continue
|
|
288
|
+
fi
|
|
289
|
+
if [[ "${line}" == HEAD\ * ]]; then
|
|
290
|
+
head="${line#HEAD }"
|
|
291
|
+
continue
|
|
292
|
+
fi
|
|
293
|
+
if [[ "${line}" == branch\ * ]]; then
|
|
294
|
+
branch="${line#branch refs/heads/}"
|
|
295
|
+
if [ -n "${worktree_path}" ] \
|
|
296
|
+
&& [ "${branch}" = "${pr_branch}" ] \
|
|
297
|
+
&& [ "${head}" = "${expected_head}" ] \
|
|
298
|
+
&& [ -d "${worktree_path}" ]; then
|
|
299
|
+
local worktree_real=""
|
|
300
|
+
worktree_real=$(cd "${worktree_path}" && pwd -P 2>/dev/null || echo "${worktree_path}")
|
|
301
|
+
if [ "${worktree_real}" = "${project_real}" ]; then
|
|
302
|
+
continue
|
|
303
|
+
fi
|
|
304
|
+
if git -C "${worktree_path}" diff --quiet >/dev/null 2>&1 \
|
|
305
|
+
&& git -C "${worktree_path}" diff --cached --quiet >/dev/null 2>&1; then
|
|
306
|
+
printf "%s" "${worktree_path}"
|
|
307
|
+
return 0
|
|
308
|
+
fi
|
|
309
|
+
fi
|
|
310
|
+
fi
|
|
311
|
+
done < <(git worktree list --porcelain 2>/dev/null || true)
|
|
312
|
+
|
|
313
|
+
return 1
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
run_local_check_command_in_dir() {
|
|
317
|
+
local pr_number="${1}"
|
|
318
|
+
local expected_head="${2}"
|
|
319
|
+
local check_dir="${3}"
|
|
320
|
+
local check_exit=1
|
|
321
|
+
|
|
322
|
+
set +e
|
|
323
|
+
(
|
|
324
|
+
cd "${check_dir}"
|
|
325
|
+
bash -lc "${LOCAL_CHECK_COMMAND}"
|
|
326
|
+
) 2>&1 | tee -a "${LOG_FILE}"
|
|
327
|
+
check_exit=${PIPESTATUS[0]}
|
|
328
|
+
set -e
|
|
329
|
+
|
|
330
|
+
if [ "${check_exit}" -eq 0 ]; then
|
|
331
|
+
log "INFO: PR #${pr_number}: Local checks passed for head ${expected_head}"
|
|
332
|
+
return 0
|
|
333
|
+
fi
|
|
334
|
+
|
|
335
|
+
log "INFO: PR #${pr_number}: Local checks failed for head ${expected_head} (exit ${check_exit})"
|
|
336
|
+
return 1
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
run_local_checks_for_head() {
|
|
340
|
+
local pr_number="${1}"
|
|
341
|
+
local pr_branch="${2}"
|
|
342
|
+
local expected_head="${3}"
|
|
343
|
+
local temp_parent=""
|
|
344
|
+
local worktree_dir=""
|
|
345
|
+
local existing_worktree_dir=""
|
|
346
|
+
local temp_ref=""
|
|
347
|
+
|
|
348
|
+
if [ -z "${LOCAL_CHECK_COMMAND}" ]; then
|
|
349
|
+
log "INFO: PR #${pr_number}: Local check command is empty, treating fallback as failed"
|
|
350
|
+
return 1
|
|
351
|
+
fi
|
|
352
|
+
|
|
353
|
+
if existing_worktree_dir=$(find_existing_worktree_for_head "${pr_branch}" "${expected_head}"); then
|
|
354
|
+
log "INFO: PR #${pr_number}: Reusing existing worktree for local checks: ${existing_worktree_dir}"
|
|
355
|
+
run_local_check_command_in_dir "${pr_number}" "${expected_head}" "${existing_worktree_dir}"
|
|
356
|
+
return $?
|
|
357
|
+
fi
|
|
358
|
+
|
|
359
|
+
temp_parent=$(mktemp -d "${TMPDIR:-/tmp}/night-watch-merger-${pr_number}.XXXXXX")
|
|
360
|
+
worktree_dir="${temp_parent}/worktree"
|
|
361
|
+
temp_ref="refs/night-watch/merger/${pr_number}-${expected_head}"
|
|
362
|
+
|
|
363
|
+
cleanup_local_check_worktree() {
|
|
364
|
+
git worktree remove --force "${worktree_dir}" >/dev/null 2>&1 || true
|
|
365
|
+
git update-ref -d "${temp_ref}" >/dev/null 2>&1 || true
|
|
366
|
+
rm -rf "${temp_parent}" >/dev/null 2>&1 || true
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
log "INFO: PR #${pr_number}: Running local checks for head ${expected_head}: ${LOCAL_CHECK_COMMAND}"
|
|
370
|
+
|
|
371
|
+
if ! git cat-file -e "${expected_head}^{commit}" >/dev/null 2>&1; then
|
|
372
|
+
log "INFO: PR #${pr_number}: Fetching PR head ${expected_head} for local checks"
|
|
373
|
+
git fetch --quiet --force origin "pull/${pr_number}/head:${temp_ref}" >/dev/null 2>&1 || {
|
|
374
|
+
log "INFO: PR #${pr_number}: Unable to fetch PR head for local checks"
|
|
375
|
+
cleanup_local_check_worktree
|
|
376
|
+
return 1
|
|
377
|
+
}
|
|
378
|
+
fi
|
|
379
|
+
|
|
380
|
+
if ! git worktree add --detach --quiet "${worktree_dir}" "${expected_head}" >/dev/null 2>&1; then
|
|
381
|
+
if ! git worktree add --detach --quiet "${worktree_dir}" "${temp_ref}" >/dev/null 2>&1; then
|
|
382
|
+
log "INFO: PR #${pr_number}: Unable to create local check worktree"
|
|
383
|
+
cleanup_local_check_worktree
|
|
384
|
+
return 1
|
|
385
|
+
fi
|
|
386
|
+
fi
|
|
387
|
+
|
|
388
|
+
run_local_check_command_in_dir "${pr_number}" "${expected_head}" "${worktree_dir}"
|
|
389
|
+
local check_result=$?
|
|
390
|
+
|
|
391
|
+
cleanup_local_check_worktree
|
|
392
|
+
|
|
393
|
+
return "${check_result}"
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
ci_gate_allows_head() {
|
|
397
|
+
local pr_number="${1}"
|
|
398
|
+
local pr_branch="${2}"
|
|
399
|
+
local expected_head="${3}"
|
|
400
|
+
local context="${4:-CI}"
|
|
401
|
+
local ci_status
|
|
402
|
+
|
|
403
|
+
if [ "${CI_POLICY}" = "ignore" ]; then
|
|
404
|
+
log "INFO: PR #${pr_number} (${pr_branch}): CI policy is ignore; skipping ${context} gate for head ${expected_head}"
|
|
405
|
+
return 0
|
|
406
|
+
fi
|
|
407
|
+
|
|
408
|
+
ci_status=$(ci_status_for_head "${pr_number}" "${expected_head}")
|
|
409
|
+
if [ "${ci_status}" = "passing" ]; then
|
|
410
|
+
return 0
|
|
411
|
+
fi
|
|
412
|
+
|
|
413
|
+
if [ "${CI_POLICY}" = "fallback-local" ]; then
|
|
414
|
+
log "INFO: PR #${pr_number} (${pr_branch}): ${context} not passing on head ${expected_head} (${ci_status}); trying local checks"
|
|
415
|
+
if run_local_checks_for_head "${pr_number}" "${pr_branch}" "${expected_head}"; then
|
|
416
|
+
return 0
|
|
417
|
+
fi
|
|
418
|
+
log "INFO: PR #${pr_number} (${pr_branch}): Local check fallback failed, skipping"
|
|
419
|
+
return 1
|
|
420
|
+
fi
|
|
421
|
+
|
|
422
|
+
log "INFO: PR #${pr_number} (${pr_branch}): ${context} not passing on head ${expected_head} (${ci_status}), skipping"
|
|
423
|
+
return 1
|
|
424
|
+
}
|
|
425
|
+
|
|
264
426
|
# Rebase a PR against its base branch
|
|
265
427
|
rebase_pr() {
|
|
266
428
|
local pr_number="${1}"
|
|
@@ -308,7 +470,7 @@ cd "${PROJECT_DIR}"
|
|
|
308
470
|
|
|
309
471
|
log "========================================"
|
|
310
472
|
log "RUN-START: merger invoked project=${PROJECT_DIR} dry_run=${DRY_RUN}"
|
|
311
|
-
log "CONFIG: merge_method=${MERGE_METHOD} min_review_score=${MIN_REVIEW_SCORE} rebase_before_merge=${REBASE_BEFORE_MERGE} max_prs=${MAX_PRS_PER_RUN} max_runtime=${MAX_RUNTIME}s ready_label=${READY_TO_MERGE_LABEL} branch_patterns=${BRANCH_PATTERNS_RAW:-<all>}"
|
|
473
|
+
log "CONFIG: merge_method=${MERGE_METHOD} min_review_score=${MIN_REVIEW_SCORE} rebase_before_merge=${REBASE_BEFORE_MERGE} max_prs=${MAX_PRS_PER_RUN} max_runtime=${MAX_RUNTIME}s ci_policy=${CI_POLICY} local_check_command=${LOCAL_CHECK_COMMAND} ready_label=${READY_TO_MERGE_LABEL} branch_patterns=${BRANCH_PATTERNS_RAW:-<all>}"
|
|
312
474
|
log "========================================"
|
|
313
475
|
|
|
314
476
|
if ! acquire_lock "${LOCK_FILE}"; then
|
|
@@ -391,10 +553,8 @@ while IFS= read -r pr_json; do
|
|
|
391
553
|
continue
|
|
392
554
|
fi
|
|
393
555
|
|
|
394
|
-
# Check CI status
|
|
395
|
-
|
|
396
|
-
if [ "${ci_status}" != "passing" ]; then
|
|
397
|
-
log "INFO: PR #${pr_number} (${pr_branch}): CI not passing on head ${pr_head_oid} (${ci_status}), skipping"
|
|
556
|
+
# Check CI status, optionally falling back to local checks for provider/billing failures.
|
|
557
|
+
if ! ci_gate_allows_head "${pr_number}" "${pr_branch}" "${pr_head_oid}" "CI"; then
|
|
398
558
|
continue
|
|
399
559
|
fi
|
|
400
560
|
|
|
@@ -436,10 +596,22 @@ while IFS= read -r pr_json; do
|
|
|
436
596
|
log "INFO: PR #${pr_number}: Head unchanged after rebase (${pr_head_after_rebase}); confirming CI"
|
|
437
597
|
fi
|
|
438
598
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
599
|
+
if [ "${CI_POLICY}" = "ignore" ]; then
|
|
600
|
+
log "INFO: PR #${pr_number}: CI policy is ignore; skipping fresh CI gate after rebase"
|
|
601
|
+
else
|
|
602
|
+
# Poll CI until all checks attached to the post-rebase head are complete and passing.
|
|
603
|
+
if ! wait_for_ci_passing_on_head "${pr_number}" "${pr_head_after_rebase}"; then
|
|
604
|
+
log "INFO: PR #${pr_number}: Fresh CI not passing on head ${pr_head_after_rebase} after rebase (${LAST_CI_STATUS}, waited ${CI_MAX_WAIT}s)"
|
|
605
|
+
if [ "${CI_POLICY}" = "fallback-local" ]; then
|
|
606
|
+
if ! run_local_checks_for_head "${pr_number}" "${pr_branch}" "${pr_head_after_rebase}"; then
|
|
607
|
+
log "INFO: PR #${pr_number}: Fresh local check fallback failed after rebase, skipping"
|
|
608
|
+
continue
|
|
609
|
+
fi
|
|
610
|
+
else
|
|
611
|
+
log "INFO: PR #${pr_number}: Skipping because CI policy requires GitHub CI"
|
|
612
|
+
continue
|
|
613
|
+
fi
|
|
614
|
+
fi
|
|
443
615
|
fi
|
|
444
616
|
fi
|
|
445
617
|
|