@jonit-dev/night-watch-cli 1.8.12-beta.12 → 1.8.12-beta.14
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 +32 -6
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +5 -1
- package/dist/commands/audit.js.map +1 -1
- package/dist/scripts/night-watch-audit-cron.sh +11 -1
- package/dist/scripts/night-watch-cron.sh +4 -2
- package/dist/scripts/night-watch-pr-reviewer-cron.sh +27 -2
- package/dist/templates/audit.md +64 -30
- package/dist/templates/night-watch-audit.md +71 -30
- package/dist/web/assets/index-CL3Q-KB4.css +1 -0
- package/dist/web/assets/index-FDOCfjkP.js +442 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -290,13 +290,14 @@ var init_job_registry = __esm({
|
|
|
290
290
|
{
|
|
291
291
|
id: "audit",
|
|
292
292
|
name: "Auditor",
|
|
293
|
-
description: "Performs
|
|
293
|
+
description: "Performs consolidated architecture and code quality audits",
|
|
294
294
|
cliCommand: "audit",
|
|
295
295
|
logName: "audit",
|
|
296
296
|
lockSuffix: "-audit.lock",
|
|
297
297
|
queuePriority: 10,
|
|
298
298
|
envPrefix: "NW_AUDIT",
|
|
299
299
|
extraFields: [
|
|
300
|
+
{ name: "createIssues", type: "boolean", defaultValue: false },
|
|
300
301
|
{
|
|
301
302
|
name: "targetColumn",
|
|
302
303
|
type: "enum",
|
|
@@ -305,9 +306,10 @@ var init_job_registry = __esm({
|
|
|
305
306
|
}
|
|
306
307
|
],
|
|
307
308
|
defaultConfig: {
|
|
308
|
-
enabled:
|
|
309
|
+
enabled: false,
|
|
309
310
|
schedule: "50 3 * * 1",
|
|
310
311
|
maxRuntime: 1800,
|
|
312
|
+
createIssues: false,
|
|
311
313
|
targetColumn: "Draft"
|
|
312
314
|
}
|
|
313
315
|
},
|
|
@@ -390,7 +392,7 @@ function resolveProviderBucketKey(provider, providerEnv) {
|
|
|
390
392
|
return `claude-proxy:${baseUrl}`;
|
|
391
393
|
}
|
|
392
394
|
}
|
|
393
|
-
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_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;
|
|
395
|
+
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;
|
|
394
396
|
var init_constants = __esm({
|
|
395
397
|
"../core/dist/constants.js"() {
|
|
396
398
|
"use strict";
|
|
@@ -471,14 +473,16 @@ var init_constants = __esm({
|
|
|
471
473
|
validatedLabel: DEFAULT_QA_VALIDATED_LABEL
|
|
472
474
|
};
|
|
473
475
|
QA_LOG_NAME = "night-watch-qa";
|
|
474
|
-
DEFAULT_AUDIT_ENABLED =
|
|
476
|
+
DEFAULT_AUDIT_ENABLED = false;
|
|
475
477
|
DEFAULT_AUDIT_SCHEDULE = "50 3 * * 1";
|
|
476
478
|
DEFAULT_AUDIT_MAX_RUNTIME = 1800;
|
|
479
|
+
DEFAULT_AUDIT_CREATE_ISSUES = false;
|
|
477
480
|
DEFAULT_AUDIT_TARGET_COLUMN = "Draft";
|
|
478
481
|
DEFAULT_AUDIT = {
|
|
479
482
|
enabled: DEFAULT_AUDIT_ENABLED,
|
|
480
483
|
schedule: DEFAULT_AUDIT_SCHEDULE,
|
|
481
484
|
maxRuntime: DEFAULT_AUDIT_MAX_RUNTIME,
|
|
485
|
+
createIssues: DEFAULT_AUDIT_CREATE_ISSUES,
|
|
482
486
|
targetColumn: DEFAULT_AUDIT_TARGET_COLUMN
|
|
483
487
|
};
|
|
484
488
|
DEFAULT_ANALYTICS_ENABLED = false;
|
|
@@ -867,7 +871,11 @@ function normalizeConfig(rawConfig) {
|
|
|
867
871
|
continue;
|
|
868
872
|
const rawJob = readObject2(rawConfig[jobId]);
|
|
869
873
|
if (rawJob) {
|
|
870
|
-
|
|
874
|
+
const normalizedJob = normalizeJobConfig(rawJob, jobDef);
|
|
875
|
+
if (jobId === "audit" && rawJob.createIssues === void 0 && rawJob.targetColumn !== void 0) {
|
|
876
|
+
normalizedJob.createIssues = true;
|
|
877
|
+
}
|
|
878
|
+
normalized[jobId] = normalizedJob;
|
|
871
879
|
}
|
|
872
880
|
}
|
|
873
881
|
const prResolverDef = getJobDef("pr-resolver");
|
|
@@ -8667,6 +8675,16 @@ function buildIssueBody(finding) {
|
|
|
8667
8675
|
async function syncAuditFindingsToBoard(config, projectDir) {
|
|
8668
8676
|
const findings = loadAuditFindings(projectDir);
|
|
8669
8677
|
const targetColumn = config.audit.targetColumn;
|
|
8678
|
+
if (!config.audit.createIssues) {
|
|
8679
|
+
return {
|
|
8680
|
+
status: "skipped",
|
|
8681
|
+
findingsCount: findings.length,
|
|
8682
|
+
issuesCreated: 0,
|
|
8683
|
+
issuesFailed: 0,
|
|
8684
|
+
targetColumn: null,
|
|
8685
|
+
summary: "audit board issue creation is disabled"
|
|
8686
|
+
};
|
|
8687
|
+
}
|
|
8670
8688
|
if (findings.length === 0) {
|
|
8671
8689
|
return {
|
|
8672
8690
|
status: "skipped",
|
|
@@ -9613,6 +9631,7 @@ __export(dist_exports, {
|
|
|
9613
9631
|
DEFAULT_ANALYTICS_SCHEDULE: () => DEFAULT_ANALYTICS_SCHEDULE,
|
|
9614
9632
|
DEFAULT_ANALYTICS_TARGET_COLUMN: () => DEFAULT_ANALYTICS_TARGET_COLUMN,
|
|
9615
9633
|
DEFAULT_AUDIT: () => DEFAULT_AUDIT,
|
|
9634
|
+
DEFAULT_AUDIT_CREATE_ISSUES: () => DEFAULT_AUDIT_CREATE_ISSUES,
|
|
9616
9635
|
DEFAULT_AUDIT_ENABLED: () => DEFAULT_AUDIT_ENABLED,
|
|
9617
9636
|
DEFAULT_AUDIT_MAX_RUNTIME: () => DEFAULT_AUDIT_MAX_RUNTIME,
|
|
9618
9637
|
DEFAULT_AUDIT_SCHEDULE: () => DEFAULT_AUDIT_SCHEDULE,
|
|
@@ -12061,6 +12080,7 @@ import * as path26 from "path";
|
|
|
12061
12080
|
function buildEnvVars4(config, options) {
|
|
12062
12081
|
const env = buildBaseEnvVars(config, "audit", options.dryRun);
|
|
12063
12082
|
env.NW_AUDIT_MAX_RUNTIME = String(config.audit.maxRuntime);
|
|
12083
|
+
env.NW_AUDIT_CREATE_ISSUES = config.audit.createIssues ? "1" : "0";
|
|
12064
12084
|
env.NW_CLAUDE_MODEL_ID = CLAUDE_MODEL_IDS[config.primaryFallbackModel ?? config.claudeModel ?? "sonnet"];
|
|
12065
12085
|
const telegramWebhooks = getTelegramStatusWebhooks(config);
|
|
12066
12086
|
if (telegramWebhooks.length > 0) {
|
|
@@ -12100,7 +12120,10 @@ function auditCommand(program2) {
|
|
|
12100
12120
|
configTable.push(["Provider", auditProvider]);
|
|
12101
12121
|
configTable.push(["Provider CLI", PROVIDER_COMMANDS[auditProvider]]);
|
|
12102
12122
|
configTable.push(["Max Runtime", `${config.audit.maxRuntime}s`]);
|
|
12103
|
-
configTable.push(["
|
|
12123
|
+
configTable.push(["Create Board Issues", config.audit.createIssues ? "yes" : "no"]);
|
|
12124
|
+
if (config.audit.createIssues) {
|
|
12125
|
+
configTable.push(["Target Column", config.audit.targetColumn]);
|
|
12126
|
+
}
|
|
12104
12127
|
configTable.push(["Report File", path26.join(projectDir, "logs", "audit-report.md")]);
|
|
12105
12128
|
console.log(configTable.toString());
|
|
12106
12129
|
header("Provider Invocation");
|
|
@@ -16714,6 +16737,9 @@ function validateConfigChanges(changes, currentConfig) {
|
|
|
16714
16737
|
if (audit.maxRuntime !== void 0 && (typeof audit.maxRuntime !== "number" || audit.maxRuntime < 60)) {
|
|
16715
16738
|
return "audit.maxRuntime must be a number >= 60";
|
|
16716
16739
|
}
|
|
16740
|
+
if (audit.createIssues !== void 0 && typeof audit.createIssues !== "boolean") {
|
|
16741
|
+
return "audit.createIssues must be a boolean";
|
|
16742
|
+
}
|
|
16717
16743
|
if (audit.targetColumn !== void 0 && !BOARD_COLUMNS.includes(audit.targetColumn)) {
|
|
16718
16744
|
return `audit.targetColumn must be one of: ${BOARD_COLUMNS.join(", ")}`;
|
|
16719
16745
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAEL,iBAAiB,EAalB,MAAM,mBAAmB,CAAC;AAU3B,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":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAEL,iBAAiB,EAalB,MAAM,mBAAmB,CAAC;AAU3B,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,CAmBxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8KnD"}
|
package/dist/commands/audit.js
CHANGED
|
@@ -14,6 +14,7 @@ export function buildEnvVars(config, options) {
|
|
|
14
14
|
const env = buildBaseEnvVars(config, 'audit', options.dryRun);
|
|
15
15
|
// Audit-specific settings
|
|
16
16
|
env.NW_AUDIT_MAX_RUNTIME = String(config.audit.maxRuntime);
|
|
17
|
+
env.NW_AUDIT_CREATE_ISSUES = config.audit.createIssues ? '1' : '0';
|
|
17
18
|
env.NW_CLAUDE_MODEL_ID =
|
|
18
19
|
CLAUDE_MODEL_IDS[config.primaryFallbackModel ?? config.claudeModel ?? 'sonnet'];
|
|
19
20
|
// Telegram status messages from bash scripts (start/progress/final status)
|
|
@@ -66,7 +67,10 @@ export function auditCommand(program) {
|
|
|
66
67
|
configTable.push(['Provider', auditProvider]);
|
|
67
68
|
configTable.push(['Provider CLI', PROVIDER_COMMANDS[auditProvider]]);
|
|
68
69
|
configTable.push(['Max Runtime', `${config.audit.maxRuntime}s`]);
|
|
69
|
-
configTable.push(['
|
|
70
|
+
configTable.push(['Create Board Issues', config.audit.createIssues ? 'yes' : 'no']);
|
|
71
|
+
if (config.audit.createIssues) {
|
|
72
|
+
configTable.push(['Target Column', config.audit.targetColumn]);
|
|
73
|
+
}
|
|
70
74
|
configTable.push(['Report File', path.join(projectDir, 'logs', 'audit-report.md')]);
|
|
71
75
|
console.log(configTable.toString());
|
|
72
76
|
header('Provider Invocation');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,gBAAgB,EAEhB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,GAAG,EACH,uBAAuB,EACvB,aAAa,EACb,MAAM,EACN,IAAI,EACJ,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAQxD;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAyB,EACzB,OAAsB;IAEtB,mDAAmD;IACnD,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE9D,0BAA0B;IAC1B,GAAG,CAAC,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC3D,GAAG,CAAC,kBAAkB;QACpB,gBAAgB,CAAC,MAAM,CAAC,oBAAoB,IAAI,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,CAAC;IAElF,2EAA2E;IAC3E,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,2BAA2B,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACnE,GAAG,CAAC,qBAAqB,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzD,GAAG,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACvD,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;SAClE,MAAM,CAAC,qBAAqB,EAAE,iCAAiC,CAAC;SAChE,MAAM,CAAC,qBAAqB,EAAE,sCAAsC,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,OAAsB,EAAE,EAAE;QACvC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACjC,IAAI,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QAEpC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpB,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,iFAAiF;YACjF,MAAM,GAAG;gBACP,GAAG,MAAM;gBACT,oBAAoB,EAAE,OAAO,CAAC,QAAyC;aACxE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC7C,IAAI,CAAC,4CAA4C,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,aAAa,CAAC,2BAA2B,CAAC,CAAC;QAE9D,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAEhC,kCAAkC;YAClC,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAE1D,MAAM,CAAC,eAAe,CAAC,CAAC;YACxB,MAAM,WAAW,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YAChE,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;YAC9C,WAAW,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACrE,WAAW,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YACjE,WAAW,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ set -euo pipefail
|
|
|
8
8
|
# The Node.js CLI will inject config values via environment variables.
|
|
9
9
|
# Required env vars (with defaults shown):
|
|
10
10
|
# NW_AUDIT_MAX_RUNTIME=1800 - Maximum runtime in seconds (30 minutes)
|
|
11
|
+
# NW_AUDIT_CREATE_ISSUES=0 - Set to 1 to request per-finding board issue sections
|
|
11
12
|
# NW_PROVIDER_CMD=claude - AI provider CLI to use (claude, codex, etc.)
|
|
12
13
|
# NW_DRY_RUN=0 - Set to 1 for dry-run mode (prints diagnostics only)
|
|
13
14
|
|
|
@@ -73,7 +74,7 @@ fi
|
|
|
73
74
|
rotate_log
|
|
74
75
|
log_separator
|
|
75
76
|
log "RUN-START: audit invoked project=${PROJECT_DIR} provider=${PROVIDER_CMD} dry_run=${NW_DRY_RUN:-0}"
|
|
76
|
-
log "CONFIG: max_runtime=${MAX_RUNTIME}s max_retries=${NW_AUDIT_MAX_RETRIES:-3} retry_delay=${NW_AUDIT_RETRY_DELAY:-120}s"
|
|
77
|
+
log "CONFIG: max_runtime=${MAX_RUNTIME}s create_issues=${NW_AUDIT_CREATE_ISSUES:-0} max_retries=${NW_AUDIT_MAX_RETRIES:-3} retry_delay=${NW_AUDIT_RETRY_DELAY:-120}s"
|
|
77
78
|
|
|
78
79
|
if ! acquire_lock "${LOCK_FILE}"; then
|
|
79
80
|
emit_result "skip_locked"
|
|
@@ -107,6 +108,15 @@ ${AUDIT_PROMPT_TEMPLATE}"
|
|
|
107
108
|
fi
|
|
108
109
|
|
|
109
110
|
AUDIT_PROMPT="$(cat "${AUDIT_PROMPT_TEMPLATE}")"
|
|
111
|
+
if [ "${NW_AUDIT_CREATE_ISSUES:-0}" = "1" ]; then
|
|
112
|
+
AUDIT_PROMPT="${AUDIT_PROMPT}
|
|
113
|
+
|
|
114
|
+
## Explicit Board Issue Mode
|
|
115
|
+
|
|
116
|
+
This project explicitly enabled audit board issue creation. Keep the consolidated report and priority matrix above, and also add a final section named \`## Board Issue Findings\`.
|
|
117
|
+
|
|
118
|
+
In that final section only, include one \`### Finding N\` block for each issue that genuinely needs a separate board card. Use the legacy exact fields \`Location\`, \`Severity\`, \`Category\`, \`Description\`, \`Snippet\`, and \`Suggested Fix\` so Night Watch can sync those selected findings. Do not create a board issue block for every observation; only include independently executable work items."
|
|
119
|
+
fi
|
|
110
120
|
|
|
111
121
|
if [ -n "${NW_DEFAULT_BRANCH:-}" ]; then
|
|
112
122
|
DEFAULT_BRANCH="${NW_DEFAULT_BRANCH}"
|
|
@@ -1255,6 +1255,7 @@ if [ ${EXIT_CODE} -eq 0 ]; then
|
|
|
1255
1255
|
# Board mode: comment with PR URL, then close issue and move to Done
|
|
1256
1256
|
PR_URL=$(gh pr list --state open --json headRefName,url \
|
|
1257
1257
|
--jq ".[] | select(.headRefName == \"${BRANCH_NAME}\") | .url" 2>/dev/null || true)
|
|
1258
|
+
PR_URL=${PR_URL:-${EXECUTOR_PR_URL}}
|
|
1258
1259
|
if [ -n "${PR_URL}" ]; then
|
|
1259
1260
|
"${NW_CLI}" board comment "${ISSUE_NUMBER}" --body "PR opened: ${PR_URL} (via ${EFFECTIVE_PROVIDER_LABEL})" 2>>"${LOG_FILE}" || true
|
|
1260
1261
|
gh pr comment "${PR_URL}" --body "> 🤖 Implemented by ${EFFECTIVE_PROVIDER_LABEL}" 2>>"${LOG_FILE}" || true
|
|
@@ -1262,16 +1263,17 @@ if [ ${EXIT_CODE} -eq 0 ]; then
|
|
|
1262
1263
|
"${NW_CLI}" board close-issue "${ISSUE_NUMBER}" 2>>"${LOG_FILE}" || \
|
|
1263
1264
|
"${NW_CLI}" board move-issue "${ISSUE_NUMBER}" --column "Done" 2>>"${LOG_FILE}" || true
|
|
1264
1265
|
log "SUCCESS: PR opened and ready for review — ${PR_URL}"
|
|
1265
|
-
emit_result "success_open_pr" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}${PR_URL:+|pr_url=${PR_URL}}"
|
|
1266
|
+
emit_result "success_open_pr" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}${PR_URL:+|pr_url=${PR_URL}}${EXECUTOR_PR_NUMBER:+|pr_number=${EXECUTOR_PR_NUMBER}}"
|
|
1266
1267
|
elif finalize_prd_done "implemented, PR opened on ${BRANCH_NAME}"; then
|
|
1267
1268
|
# Non-board mode: post attribution comment to the PR
|
|
1268
1269
|
NON_BOARD_PR_URL=$(gh pr list --state open --json headRefName,url \
|
|
1269
1270
|
--jq ".[] | select(.headRefName == \"${BRANCH_NAME}\") | .url" 2>/dev/null || true)
|
|
1271
|
+
NON_BOARD_PR_URL=${NON_BOARD_PR_URL:-${EXECUTOR_PR_URL}}
|
|
1270
1272
|
if [ -n "${NON_BOARD_PR_URL}" ]; then
|
|
1271
1273
|
gh pr comment "${NON_BOARD_PR_URL}" --body "> 🤖 Implemented by ${EFFECTIVE_PROVIDER_LABEL}" 2>>"${LOG_FILE}" || true
|
|
1272
1274
|
fi
|
|
1273
1275
|
log "SUCCESS: PR opened and ready for review — ${NON_BOARD_PR_URL}"
|
|
1274
|
-
emit_result "success_open_pr" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}${NON_BOARD_PR_URL:+|pr_url=${NON_BOARD_PR_URL}}"
|
|
1276
|
+
emit_result "success_open_pr" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}${NON_BOARD_PR_URL:+|pr_url=${NON_BOARD_PR_URL}}${EXECUTOR_PR_NUMBER:+|pr_number=${EXECUTOR_PR_NUMBER}}"
|
|
1275
1277
|
else
|
|
1276
1278
|
night_watch_history record "${PROJECT_DIR}" "${ELIGIBLE_PRD}" failure --exit-code 1 2>/dev/null || true
|
|
1277
1279
|
emit_result "failure_finalize" "prd=${ELIGIBLE_PRD}|branch=${BRANCH_NAME}|reason=finalize_failed|detail=Failed_to_finalize_open_prd"
|
|
@@ -89,6 +89,26 @@ emit_result() {
|
|
|
89
89
|
fi
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
is_pr_open() {
|
|
93
|
+
local pr_number="${1:?PR number required}"
|
|
94
|
+
local pr_state=""
|
|
95
|
+
|
|
96
|
+
pr_state=$(gh pr view "${pr_number}" --json state --jq '.state // ""' 2>/dev/null || echo "")
|
|
97
|
+
case "${pr_state}" in
|
|
98
|
+
OPEN)
|
|
99
|
+
return 0
|
|
100
|
+
;;
|
|
101
|
+
MERGED|CLOSED)
|
|
102
|
+
return 1
|
|
103
|
+
;;
|
|
104
|
+
esac
|
|
105
|
+
|
|
106
|
+
# Backward-compatible fallback for older gh versions or tests that do not
|
|
107
|
+
# support the state field. Treat an unknown/empty state as open only when the
|
|
108
|
+
# PR is still viewable by number.
|
|
109
|
+
gh pr view "${pr_number}" --json number >/dev/null 2>&1
|
|
110
|
+
}
|
|
111
|
+
|
|
92
112
|
require_provider_on_path() {
|
|
93
113
|
if ! ensure_provider_on_path "${PROVIDER_CMD}"; then
|
|
94
114
|
echo "ERROR: Provider '${PROVIDER_CMD}' not found in PATH or common installation locations" >&2
|
|
@@ -720,7 +740,7 @@ fi
|
|
|
720
740
|
|
|
721
741
|
if [ -n "${TARGET_PR}" ]; then
|
|
722
742
|
OPEN_PRS=$(
|
|
723
|
-
if
|
|
743
|
+
if is_pr_open "${TARGET_PR}"; then
|
|
724
744
|
echo "1"
|
|
725
745
|
else
|
|
726
746
|
echo "0"
|
|
@@ -971,6 +991,7 @@ if [ -z "${TARGET_PR}" ] && [ "${WORKER_MODE}" != "1" ] && [ "${PARALLEL_ENABLED
|
|
|
971
991
|
EXIT_CODE=0
|
|
972
992
|
AUTO_MERGED_PRS=""
|
|
973
993
|
AUTO_MERGE_FAILED_PRS=""
|
|
994
|
+
ACTUAL_REVIEWED_PRS=""
|
|
974
995
|
NO_CHANGES_PRS=""
|
|
975
996
|
MAX_WORKER_ATTEMPTS=1
|
|
976
997
|
MAX_WORKER_FINAL_SCORE=""
|
|
@@ -1015,6 +1036,7 @@ if [ -z "${TARGET_PR}" ] && [ "${WORKER_MODE}" != "1" ] && [ "${PARALLEL_ENABLED
|
|
|
1015
1036
|
worker_status=$(printf '%s' "${worker_result}" | sed -n 's/^NIGHT_WATCH_RESULT:\([^|]*\).*$/\1/p')
|
|
1016
1037
|
worker_auto_merged=$(printf '%s' "${worker_result}" | grep -oP '(?<=auto_merged=)[^|]+' || true)
|
|
1017
1038
|
worker_auto_merge_failed=$(printf '%s' "${worker_result}" | grep -oP '(?<=auto_merge_failed=)[^|]+' || true)
|
|
1039
|
+
worker_reviewed_prs=$(printf '%s' "${worker_result}" | grep -oP '(?<=prs=)[^|]+' || true)
|
|
1018
1040
|
worker_attempts=$(printf '%s' "${worker_result}" | grep -oP '(?<=attempts=)[^|]+' || true)
|
|
1019
1041
|
worker_final_score=$(printf '%s' "${worker_result}" | grep -oP '(?<=final_score=)[^|]+' || true)
|
|
1020
1042
|
worker_no_changes=$(printf '%s' "${worker_result}" | grep -oP '(?<=no_changes_needed=)[^|]+' || true)
|
|
@@ -1022,6 +1044,9 @@ if [ -z "${TARGET_PR}" ] && [ "${WORKER_MODE}" != "1" ] && [ "${PARALLEL_ENABLED
|
|
|
1022
1044
|
|
|
1023
1045
|
AUTO_MERGED_PRS=$(append_csv "${AUTO_MERGED_PRS}" "${worker_auto_merged}")
|
|
1024
1046
|
AUTO_MERGE_FAILED_PRS=$(append_csv "${AUTO_MERGE_FAILED_PRS}" "${worker_auto_merge_failed}")
|
|
1047
|
+
if [ "${worker_status}" = "success_reviewed" ]; then
|
|
1048
|
+
ACTUAL_REVIEWED_PRS=$(append_csv "${ACTUAL_REVIEWED_PRS}" "${worker_reviewed_prs}")
|
|
1049
|
+
fi
|
|
1025
1050
|
NO_CHANGES_PRS=$(append_csv "${NO_CHANGES_PRS}" "${worker_no_changes_prs}")
|
|
1026
1051
|
if [ -z "${worker_no_changes_prs}" ] && [ "${worker_no_changes}" = "1" ]; then
|
|
1027
1052
|
NO_CHANGES_PRS=$(append_csv "${NO_CHANGES_PRS}" "#${worker_pr}")
|
|
@@ -1066,7 +1091,7 @@ if [ -z "${TARGET_PR}" ] && [ "${WORKER_MODE}" != "1" ] && [ "${PARALLEL_ENABLED
|
|
|
1066
1091
|
# worker runs may have left behind.
|
|
1067
1092
|
cleanup_reviewer_worktrees
|
|
1068
1093
|
|
|
1069
|
-
emit_final_status "${EXIT_CODE}" "${
|
|
1094
|
+
emit_final_status "${EXIT_CODE}" "${ACTUAL_REVIEWED_PRS}" "${AUTO_MERGED_PRS}" "${AUTO_MERGE_FAILED_PRS}" "${MAX_WORKER_ATTEMPTS}" "${MAX_WORKER_FINAL_SCORE}" "0" "${NO_CHANGES_PRS}"
|
|
1070
1095
|
exit "${EXIT_CODE}"
|
|
1071
1096
|
fi
|
|
1072
1097
|
|
package/dist/templates/audit.md
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
You are the Night Watch Code Auditor. Your job is to scan the codebase for
|
|
1
|
+
You are the Night Watch Code Auditor. Your job is to scan the codebase for systemic engineering risks and write a consolidated architecture/code-quality audit report for human prioritization.
|
|
2
|
+
|
|
3
|
+
The default output is a broad report, not executor fodder. Do not create or recommend one board issue per finding unless an explicit "Board Issue Mode" section is appended to this prompt.
|
|
2
4
|
|
|
3
5
|
## What to look for
|
|
4
6
|
|
|
@@ -30,65 +32,97 @@ You are the Night Watch Code Auditor. Your job is to scan the codebase for real
|
|
|
30
32
|
|
|
31
33
|
- `node_modules/`, `dist/`, `.git/`, `coverage/`, generated files.
|
|
32
34
|
- Test files (`*.test.ts`, `*.spec.ts`, `__tests__/`) unless they expose production design flaws.
|
|
33
|
-
- Intentional no-op catches in file walkers/read-only probing paths (
|
|
35
|
+
- Intentional no-op catches in file walkers/read-only probing paths (for example, `catch { continue }`, `catch { return null }` when clearly harmless).
|
|
34
36
|
- Cosmetic style-only nits (formatting, naming preference, import order).
|
|
35
|
-
- Hypothetical principle violations without concrete impact.
|
|
37
|
+
- Hypothetical principle violations without concrete code evidence and impact.
|
|
36
38
|
|
|
37
39
|
## How to scan
|
|
38
40
|
|
|
39
41
|
Use file-reading/search tools and scan systematically, prioritizing:
|
|
40
42
|
|
|
41
|
-
- `src/`
|
|
42
|
-
- `scripts/`
|
|
43
|
+
- `src/` and package implementation directories.
|
|
44
|
+
- `scripts/` and automation/runtime shell paths.
|
|
45
|
+
- Shared configuration, scheduler, queue, provider, board, and command flows.
|
|
43
46
|
|
|
44
47
|
For each potential issue, verify:
|
|
45
48
|
|
|
46
49
|
1. It is real and actionable.
|
|
47
|
-
2. It has concrete impact
|
|
48
|
-
3. The
|
|
50
|
+
2. It has concrete impact on correctness, security, scalability, operability, or maintainability.
|
|
51
|
+
3. The affected locations show a pattern or systemic design problem, not just a tiny isolated nit.
|
|
52
|
+
4. The fix direction is useful for human planning.
|
|
53
|
+
|
|
54
|
+
## Priority model
|
|
55
|
+
|
|
56
|
+
Use an Effort x Impact priority model:
|
|
49
57
|
|
|
50
|
-
|
|
58
|
+
- **Impact**: critical, high, medium, low.
|
|
59
|
+
- **Effort**: small, medium, large.
|
|
60
|
+
- **Priority**: P0, P1, P2, P3.
|
|
51
61
|
|
|
52
|
-
|
|
53
|
-
- **high**: significant bug/risk with near-term impact.
|
|
54
|
-
- **medium**: clear risk/smell that should be addressed soon.
|
|
55
|
-
- **low**: valid but lower urgency.
|
|
62
|
+
Assign P0/P1 only when the issue is urgent or unlocks significant risk reduction. Be selective.
|
|
56
63
|
|
|
57
64
|
## Report format
|
|
58
65
|
|
|
59
|
-
Write
|
|
66
|
+
Write `logs/audit-report.md` using this format:
|
|
60
67
|
|
|
61
68
|
```markdown
|
|
62
|
-
# Code Audit
|
|
69
|
+
# Architecture and Code Quality Audit
|
|
63
70
|
|
|
64
71
|
Generated: <ISO timestamp>
|
|
65
72
|
|
|
66
|
-
##
|
|
73
|
+
## Executive Summary
|
|
67
74
|
|
|
68
|
-
|
|
75
|
+
One to three concise paragraphs covering the highest-risk themes, the likely cost of leaving them alone, and the recommended order of attack.
|
|
69
76
|
|
|
70
|
-
|
|
71
|
-
- **Severity**: critical | high | medium | low
|
|
72
|
-
- **Category**: empty_catch | critical_todo | hardcoded_secret | unhandled_promise | unsafe_assertion | scalability_hotspot | architecture_violation | srp_violation | dry_violation | kiss_violation | solid_violation | yagni_violation
|
|
73
|
-
- **Description**: What the issue is, why it matters, and concrete impact
|
|
74
|
-
- **Snippet**: `the offending code`
|
|
75
|
-
- **Suggested Fix**: Specific fix direction (minimal, pragmatic)
|
|
77
|
+
## Priority Matrix
|
|
76
78
|
|
|
77
|
-
|
|
79
|
+
| Priority | Theme | Impact | Effort | Why now |
|
|
80
|
+
| -------- | ------------ | ------ | ------ | -------------- |
|
|
81
|
+
| P1 | <theme name> | high | medium | <short reason> |
|
|
78
82
|
|
|
79
|
-
|
|
80
|
-
```
|
|
83
|
+
## Findings by Theme
|
|
81
84
|
|
|
82
|
-
|
|
85
|
+
### <Theme Name>
|
|
86
|
+
|
|
87
|
+
Impact: critical | high | medium | low
|
|
88
|
+
Effort: small | medium | large
|
|
89
|
+
Priority: P0 | P1 | P2 | P3
|
|
90
|
+
|
|
91
|
+
#### Evidence
|
|
92
|
+
|
|
93
|
+
- `<path>:<line>` - what is happening and why it matters.
|
|
94
|
+
- `<path>:<line>` - related evidence showing this is systemic.
|
|
95
|
+
|
|
96
|
+
#### Architecture or Quality Rule Violated
|
|
97
|
+
|
|
98
|
+
Name the concrete rule or boundary being violated.
|
|
99
|
+
|
|
100
|
+
#### Recommended Direction
|
|
101
|
+
|
|
102
|
+
Describe the pragmatic remediation path. Prefer grouped fixes and sequencing over tiny task breakdowns.
|
|
103
|
+
|
|
104
|
+
#### Full Violation List
|
|
105
|
+
|
|
106
|
+
- `<path>:<line>` - concise violation.
|
|
107
|
+
- `<path>:<line>` - concise violation.
|
|
108
|
+
|
|
109
|
+
## Cross-Cutting Recommendations
|
|
110
|
+
|
|
111
|
+
- <Recommendation that helps multiple themes>
|
|
112
|
+
|
|
113
|
+
## No-Issue Result
|
|
114
|
+
|
|
115
|
+
If there are no actionable systemic issues, write exactly:
|
|
83
116
|
|
|
84
|
-
```
|
|
85
117
|
NO_ISSUES_FOUND
|
|
86
118
|
```
|
|
87
119
|
|
|
88
120
|
## Rules
|
|
89
121
|
|
|
90
|
-
-
|
|
91
|
-
-
|
|
122
|
+
- Favor grouped systemic findings over granular one-off findings.
|
|
123
|
+
- Include a full violation list under each theme so humans can size and prioritize the work.
|
|
124
|
+
- Do not use `### Finding N` headings in default report mode.
|
|
125
|
+
- Do not create one issue per finding, and do not optimize the report for automatic execution.
|
|
126
|
+
- Report principle violations only when they create concrete risk.
|
|
92
127
|
- Avoid theoretical architecture criticism without code evidence.
|
|
93
|
-
- Be decisive: skip noisy false positives.
|
|
94
128
|
- After writing the report, stop. Do NOT open PRs, push code, or make changes.
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
You are the Night Watch Code Auditor. Your job is to scan the codebase for
|
|
1
|
+
You are the Night Watch Code Auditor. Your job is to scan the codebase for systemic engineering risks and write a consolidated architecture/code-quality audit report for human prioritization.
|
|
2
|
+
|
|
3
|
+
The default output is a broad report, not executor fodder. Do not create or recommend one board issue per finding unless an explicit "Board Issue Mode" section is appended to this prompt.
|
|
2
4
|
|
|
3
5
|
## What to look for
|
|
4
6
|
|
|
5
7
|
### 1) Critical runtime and security risks
|
|
8
|
+
|
|
6
9
|
1. **Empty or swallowed catches** - `catch` blocks that discard meaningful errors in non-trivial paths.
|
|
7
10
|
2. **Critical TODOs/FIXMEs/HACKs** - comments mentioning `bug`, `security`, `race`, `leak`, `crash`, `hotfix`, `rollback`, `unsafe`.
|
|
8
11
|
3. **Hardcoded secrets or tokens** - API keys, passwords, tokens in source (exclude env var references).
|
|
@@ -10,12 +13,14 @@ You are the Night Watch Code Auditor. Your job is to scan the codebase for real
|
|
|
10
13
|
5. **Unsafe type assertions** - `as any`, `as unknown as X`, dangerous non-null assertions (`!`) on uncertain input.
|
|
11
14
|
|
|
12
15
|
### 2) Scalability and performance hotspots
|
|
16
|
+
|
|
13
17
|
1. **N+1 / repeated expensive work** - repeated DB/API/file operations in loops.
|
|
14
18
|
2. **Unbounded processing** - full in-memory loading of large datasets, missing pagination/streaming/chunking.
|
|
15
19
|
3. **Blocking work on hot paths** - sync I/O or CPU-heavy work in frequent request/loop paths.
|
|
16
20
|
4. **Missing backpressure/limits** - unbounded queues, retries, fan-out, or concurrency.
|
|
17
21
|
|
|
18
22
|
### 3) Architecture and maintainability risks
|
|
23
|
+
|
|
19
24
|
1. **Architecture violations** - business logic mixed into transport/UI/glue layers; hidden cross-layer dependencies.
|
|
20
25
|
2. **SRP violations** - modules/functions/classes doing multiple unrelated responsibilities.
|
|
21
26
|
3. **DRY violations** - duplicated logic likely to drift and cause inconsistent behavior.
|
|
@@ -27,61 +32,97 @@ You are the Night Watch Code Auditor. Your job is to scan the codebase for real
|
|
|
27
32
|
|
|
28
33
|
- `node_modules/`, `dist/`, `.git/`, `coverage/`, generated files.
|
|
29
34
|
- Test files (`*.test.ts`, `*.spec.ts`, `__tests__/`) unless they expose production design flaws.
|
|
30
|
-
- Intentional no-op catches in file walkers/read-only probing paths (
|
|
35
|
+
- Intentional no-op catches in file walkers/read-only probing paths (for example, `catch { continue }`, `catch { return null }` when clearly harmless).
|
|
31
36
|
- Cosmetic style-only nits (formatting, naming preference, import order).
|
|
32
|
-
- Hypothetical principle violations without concrete impact.
|
|
37
|
+
- Hypothetical principle violations without concrete code evidence and impact.
|
|
33
38
|
|
|
34
39
|
## How to scan
|
|
35
40
|
|
|
36
41
|
Use file-reading/search tools and scan systematically, prioritizing:
|
|
37
|
-
|
|
38
|
-
- `
|
|
42
|
+
|
|
43
|
+
- `src/` and package implementation directories.
|
|
44
|
+
- `scripts/` and automation/runtime shell paths.
|
|
45
|
+
- Shared configuration, scheduler, queue, provider, board, and command flows.
|
|
39
46
|
|
|
40
47
|
For each potential issue, verify:
|
|
48
|
+
|
|
41
49
|
1. It is real and actionable.
|
|
42
|
-
2. It has concrete impact
|
|
43
|
-
3. The
|
|
50
|
+
2. It has concrete impact on correctness, security, scalability, operability, or maintainability.
|
|
51
|
+
3. The affected locations show a pattern or systemic design problem, not just a tiny isolated nit.
|
|
52
|
+
4. The fix direction is useful for human planning.
|
|
53
|
+
|
|
54
|
+
## Priority model
|
|
44
55
|
|
|
45
|
-
|
|
56
|
+
Use an Effort x Impact priority model:
|
|
46
57
|
|
|
47
|
-
- **
|
|
48
|
-
- **
|
|
49
|
-
- **
|
|
50
|
-
|
|
58
|
+
- **Impact**: critical, high, medium, low.
|
|
59
|
+
- **Effort**: small, medium, large.
|
|
60
|
+
- **Priority**: P0, P1, P2, P3.
|
|
61
|
+
|
|
62
|
+
Assign P0/P1 only when the issue is urgent or unlocks significant risk reduction. Be selective.
|
|
51
63
|
|
|
52
64
|
## Report format
|
|
53
65
|
|
|
54
|
-
Write
|
|
66
|
+
Write `logs/audit-report.md` using this format:
|
|
55
67
|
|
|
56
68
|
```markdown
|
|
57
|
-
# Code Audit
|
|
69
|
+
# Architecture and Code Quality Audit
|
|
58
70
|
|
|
59
71
|
Generated: <ISO timestamp>
|
|
60
72
|
|
|
61
|
-
##
|
|
73
|
+
## Executive Summary
|
|
62
74
|
|
|
63
|
-
|
|
64
|
-
- **Location**: `src/path/to/file.ts:42`
|
|
65
|
-
- **Severity**: critical | high | medium | low
|
|
66
|
-
- **Category**: empty_catch | critical_todo | hardcoded_secret | unhandled_promise | unsafe_assertion | scalability_hotspot | architecture_violation | srp_violation | dry_violation | kiss_violation | solid_violation | yagni_violation
|
|
67
|
-
- **Description**: What the issue is, why it matters, and concrete impact
|
|
68
|
-
- **Snippet**: `the offending code`
|
|
69
|
-
- **Suggested Fix**: Specific fix direction (minimal, pragmatic)
|
|
75
|
+
One to three concise paragraphs covering the highest-risk themes, the likely cost of leaving them alone, and the recommended order of attack.
|
|
70
76
|
|
|
71
|
-
|
|
72
|
-
...
|
|
73
|
-
```
|
|
77
|
+
## Priority Matrix
|
|
74
78
|
|
|
75
|
-
|
|
79
|
+
| Priority | Theme | Impact | Effort | Why now |
|
|
80
|
+
| -------- | ------------ | ------ | ------ | -------------- |
|
|
81
|
+
| P1 | <theme name> | high | medium | <short reason> |
|
|
82
|
+
|
|
83
|
+
## Findings by Theme
|
|
84
|
+
|
|
85
|
+
### <Theme Name>
|
|
86
|
+
|
|
87
|
+
Impact: critical | high | medium | low
|
|
88
|
+
Effort: small | medium | large
|
|
89
|
+
Priority: P0 | P1 | P2 | P3
|
|
90
|
+
|
|
91
|
+
#### Evidence
|
|
92
|
+
|
|
93
|
+
- `<path>:<line>` - what is happening and why it matters.
|
|
94
|
+
- `<path>:<line>` - related evidence showing this is systemic.
|
|
95
|
+
|
|
96
|
+
#### Architecture or Quality Rule Violated
|
|
97
|
+
|
|
98
|
+
Name the concrete rule or boundary being violated.
|
|
99
|
+
|
|
100
|
+
#### Recommended Direction
|
|
101
|
+
|
|
102
|
+
Describe the pragmatic remediation path. Prefer grouped fixes and sequencing over tiny task breakdowns.
|
|
103
|
+
|
|
104
|
+
#### Full Violation List
|
|
105
|
+
|
|
106
|
+
- `<path>:<line>` - concise violation.
|
|
107
|
+
- `<path>:<line>` - concise violation.
|
|
108
|
+
|
|
109
|
+
## Cross-Cutting Recommendations
|
|
110
|
+
|
|
111
|
+
- <Recommendation that helps multiple themes>
|
|
112
|
+
|
|
113
|
+
## No-Issue Result
|
|
114
|
+
|
|
115
|
+
If there are no actionable systemic issues, write exactly:
|
|
76
116
|
|
|
77
|
-
```
|
|
78
117
|
NO_ISSUES_FOUND
|
|
79
118
|
```
|
|
80
119
|
|
|
81
120
|
## Rules
|
|
82
121
|
|
|
83
|
-
-
|
|
84
|
-
-
|
|
122
|
+
- Favor grouped systemic findings over granular one-off findings.
|
|
123
|
+
- Include a full violation list under each theme so humans can size and prioritize the work.
|
|
124
|
+
- Do not use `### Finding N` headings in default report mode.
|
|
125
|
+
- Do not create one issue per finding, and do not optimize the report for automatic execution.
|
|
126
|
+
- Report principle violations only when they create concrete risk.
|
|
85
127
|
- Avoid theoretical architecture criticism without code evidence.
|
|
86
|
-
- Be decisive: skip noisy false positives.
|
|
87
128
|
- After writing the report, stop. Do NOT open PRs, push code, or make changes.
|