@jonit-dev/night-watch-cli 1.8.12-beta.0 → 1.8.12-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.js +1812 -631
  3. package/dist/cli.js.map +1 -0
  4. package/dist/commands/agent.d.ts +12 -0
  5. package/dist/commands/agent.d.ts.map +1 -0
  6. package/dist/commands/agent.js +307 -0
  7. package/dist/commands/agent.js.map +1 -0
  8. package/dist/commands/analytics.d.ts +14 -0
  9. package/dist/commands/analytics.js +69 -0
  10. package/dist/commands/analytics.js.map +1 -0
  11. package/dist/commands/audit.d.ts +19 -0
  12. package/dist/commands/audit.js +144 -0
  13. package/dist/commands/audit.js.map +1 -0
  14. package/dist/commands/board.d.ts +9 -0
  15. package/dist/commands/board.js +702 -0
  16. package/dist/commands/board.js.map +1 -0
  17. package/dist/commands/cancel.d.ts +46 -0
  18. package/dist/commands/cancel.js +239 -0
  19. package/dist/commands/cancel.js.map +1 -0
  20. package/dist/commands/cron.d.ts +8 -0
  21. package/dist/commands/cron.js +134 -0
  22. package/dist/commands/cron.js.map +1 -0
  23. package/dist/commands/dashboard/tab-actions.d.ts +10 -0
  24. package/dist/commands/dashboard/tab-actions.js +247 -0
  25. package/dist/commands/dashboard/tab-actions.js.map +1 -0
  26. package/dist/commands/dashboard/tab-config.d.ts +21 -0
  27. package/dist/commands/dashboard/tab-config.js +874 -0
  28. package/dist/commands/dashboard/tab-config.js.map +1 -0
  29. package/dist/commands/dashboard/tab-logs.d.ts +10 -0
  30. package/dist/commands/dashboard/tab-logs.js +202 -0
  31. package/dist/commands/dashboard/tab-logs.js.map +1 -0
  32. package/dist/commands/dashboard/tab-schedules.d.ts +21 -0
  33. package/dist/commands/dashboard/tab-schedules.js +320 -0
  34. package/dist/commands/dashboard/tab-schedules.js.map +1 -0
  35. package/dist/commands/dashboard/tab-status.d.ts +32 -0
  36. package/dist/commands/dashboard/tab-status.js +424 -0
  37. package/dist/commands/dashboard/tab-status.js.map +1 -0
  38. package/dist/commands/dashboard/types.d.ts +42 -0
  39. package/dist/commands/dashboard/types.js +5 -0
  40. package/dist/commands/dashboard/types.js.map +1 -0
  41. package/dist/commands/dashboard.d.ts +11 -0
  42. package/dist/commands/dashboard.js +242 -0
  43. package/dist/commands/dashboard.js.map +1 -0
  44. package/dist/commands/doctor.d.ts +16 -0
  45. package/dist/commands/doctor.js +195 -0
  46. package/dist/commands/doctor.js.map +1 -0
  47. package/dist/commands/history.d.ts +7 -0
  48. package/dist/commands/history.js +49 -0
  49. package/dist/commands/history.js.map +1 -0
  50. package/dist/commands/init.d.ts +45 -0
  51. package/dist/commands/init.d.ts.map +1 -1
  52. package/dist/commands/init.js +12 -0
  53. package/dist/commands/init.js.map +1 -1
  54. package/dist/commands/install.d.ts +65 -0
  55. package/dist/commands/install.js +405 -0
  56. package/dist/commands/install.js.map +1 -0
  57. package/dist/commands/logs.d.ts +15 -0
  58. package/dist/commands/logs.js +155 -0
  59. package/dist/commands/logs.js.map +1 -0
  60. package/dist/commands/merge.d.ts +26 -0
  61. package/dist/commands/merge.js +159 -0
  62. package/dist/commands/merge.js.map +1 -0
  63. package/dist/commands/notify.d.ts +7 -0
  64. package/dist/commands/notify.js +43 -0
  65. package/dist/commands/notify.js.map +1 -0
  66. package/dist/commands/plan.d.ts +19 -0
  67. package/dist/commands/plan.js +88 -0
  68. package/dist/commands/plan.js.map +1 -0
  69. package/dist/commands/prd-state.d.ts +12 -0
  70. package/dist/commands/prd-state.js +47 -0
  71. package/dist/commands/prd-state.js.map +1 -0
  72. package/dist/commands/prd.d.ts +18 -0
  73. package/dist/commands/prd.js +363 -0
  74. package/dist/commands/prd.js.map +1 -0
  75. package/dist/commands/prds.d.ts +13 -0
  76. package/dist/commands/prds.js +194 -0
  77. package/dist/commands/prds.js.map +1 -0
  78. package/dist/commands/prs.d.ts +14 -0
  79. package/dist/commands/prs.js +104 -0
  80. package/dist/commands/prs.js.map +1 -0
  81. package/dist/commands/qa.d.ts +34 -0
  82. package/dist/commands/qa.js +214 -0
  83. package/dist/commands/qa.js.map +1 -0
  84. package/dist/commands/queue.d.ts +8 -0
  85. package/dist/commands/queue.d.ts.map +1 -1
  86. package/dist/commands/queue.js +398 -0
  87. package/dist/commands/queue.js.map +1 -0
  88. package/dist/commands/resolve.d.ts +26 -0
  89. package/dist/commands/resolve.js +186 -0
  90. package/dist/commands/resolve.js.map +1 -0
  91. package/dist/commands/retry.d.ts +9 -0
  92. package/dist/commands/retry.js +71 -0
  93. package/dist/commands/retry.js.map +1 -0
  94. package/dist/commands/review.d.ts +77 -0
  95. package/dist/commands/review.d.ts.map +1 -1
  96. package/dist/commands/review.js +1 -74
  97. package/dist/commands/review.js.map +1 -1
  98. package/dist/commands/run.d.ts +73 -0
  99. package/dist/commands/serve.d.ts +19 -0
  100. package/dist/commands/serve.js +142 -0
  101. package/dist/commands/serve.js.map +1 -0
  102. package/dist/commands/shared/env-builder.d.ts +49 -0
  103. package/dist/commands/shared/env-builder.d.ts.map +1 -1
  104. package/dist/commands/shared/env-builder.js +152 -0
  105. package/dist/commands/shared/env-builder.js.map +1 -0
  106. package/dist/commands/slice.d.ts +35 -0
  107. package/dist/commands/slice.js +316 -0
  108. package/dist/commands/slice.js.map +1 -0
  109. package/dist/commands/state.d.ts +8 -0
  110. package/dist/commands/state.js +54 -0
  111. package/dist/commands/state.js.map +1 -0
  112. package/dist/commands/status.d.ts +14 -0
  113. package/dist/commands/status.js +297 -0
  114. package/dist/commands/status.js.map +1 -0
  115. package/dist/commands/summary.d.ts +14 -0
  116. package/dist/commands/summary.js +193 -0
  117. package/dist/commands/summary.js.map +1 -0
  118. package/dist/commands/uninstall.d.ts +25 -0
  119. package/dist/commands/uninstall.js +134 -0
  120. package/dist/commands/uninstall.js.map +1 -0
  121. package/dist/commands/update.d.ts +22 -0
  122. package/dist/commands/update.js +90 -0
  123. package/dist/commands/update.js.map +1 -0
  124. package/dist/scripts/night-watch-audit-cron.sh +1 -0
  125. package/dist/scripts/night-watch-cron.sh +1 -0
  126. package/dist/scripts/night-watch-helpers.sh +22 -1
  127. package/dist/scripts/night-watch-merger-cron.sh +32 -3
  128. package/dist/scripts/night-watch-plan-cron.sh +2 -0
  129. package/dist/scripts/night-watch-pr-resolver-cron.sh +6 -0
  130. package/dist/scripts/night-watch-pr-reviewer-cron.sh +18 -5
  131. package/dist/scripts/night-watch-qa-cron.sh +8 -1
  132. package/dist/scripts/night-watch-slicer-cron.sh +3 -0
  133. package/dist/templates/night-watch.config.json +21 -20
  134. package/dist/web/assets/index-C-xpWpS8.css +1 -0
  135. package/dist/web/assets/index-CEYe-290.js +412 -0
  136. package/dist/web/index.html +2 -2
  137. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Machine-readable agent manageability commands.
3
+ */
4
+ import { Command } from 'commander';
5
+ export interface IJsonOptions {
6
+ json?: boolean;
7
+ }
8
+ export declare function agentCommand(program: Command): void;
9
+ export declare function configCommand(program: Command): void;
10
+ export declare function healthCommand(program: Command): void;
11
+ export declare function jobCommand(program: Command): void;
12
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAwPD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUnD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiDpD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoBpD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6DjD"}
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Machine-readable agent manageability commands.
3
+ */
4
+ import { createBoardProvider, fetchStatusSnapshot, getConfigValue, getJobRunsAnalytics, getQueueStatus, getValidJobTypes, loadConfig, parseConfigValue, setConfigValue, } from '@night-watch/core';
5
+ const SCHEMA_VERSION = 1;
6
+ const JSON_OPTION = '--json';
7
+ const JSON_OPTION_DESCRIPTION = 'Output as JSON';
8
+ function writeJson(value) {
9
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
10
+ }
11
+ function fail(message, options) {
12
+ if (options?.json) {
13
+ const payload = {
14
+ schemaVersion: SCHEMA_VERSION,
15
+ ok: false,
16
+ error: message,
17
+ };
18
+ process.stderr.write(`${JSON.stringify(payload, null, 2)}\n`);
19
+ }
20
+ else {
21
+ process.stderr.write(`${message}\n`);
22
+ }
23
+ process.exit(1);
24
+ }
25
+ function getProcess(snapshot, name) {
26
+ const processInfo = snapshot.processes.find((processEntry) => processEntry.name === name);
27
+ return { running: processInfo?.running ?? false, pid: processInfo?.pid ?? null };
28
+ }
29
+ function buildLegacyStatus(snapshot, config) {
30
+ const pendingPrds = snapshot.prds.filter((prd) => prd.status === 'ready' || prd.status === 'blocked').length;
31
+ const claimedPrds = snapshot.prds.filter((prd) => prd.status === 'in-progress').length;
32
+ const donePrds = snapshot.prds.filter((prd) => prd.status === 'done').length;
33
+ const logs = Object.fromEntries(snapshot.logs.map((log) => [
34
+ log.name,
35
+ { path: log.path, lastLines: log.lastLines, exists: log.exists, size: log.size },
36
+ ]));
37
+ return {
38
+ projectName: snapshot.projectName,
39
+ projectDir: snapshot.projectDir,
40
+ provider: config.provider,
41
+ reviewerEnabled: config.reviewerEnabled,
42
+ autoMerge: config.autoMerge,
43
+ autoMergeMethod: config.autoMergeMethod,
44
+ executor: getProcess(snapshot, 'executor'),
45
+ reviewer: getProcess(snapshot, 'reviewer'),
46
+ qa: getProcess(snapshot, 'qa'),
47
+ audit: getProcess(snapshot, 'audit'),
48
+ planner: getProcess(snapshot, 'planner'),
49
+ analytics: getProcess(snapshot, 'analytics'),
50
+ merger: getProcess(snapshot, 'merger'),
51
+ prds: { pending: pendingPrds, claimed: claimedPrds, done: donePrds },
52
+ prs: { open: snapshot.prs.length },
53
+ crontab: snapshot.crontab,
54
+ logs,
55
+ };
56
+ }
57
+ function buildPausedState(config) {
58
+ return Object.fromEntries(getValidJobTypes().map((jobType) => [jobType, config.pausedJobs?.[jobType] === true]));
59
+ }
60
+ function buildLastRuns(analytics) {
61
+ const lastRuns = Object.fromEntries(getValidJobTypes().map((jobType) => [
62
+ jobType,
63
+ { lastSuccessAt: null, lastFailureAt: null, lastExitCode: null },
64
+ ]));
65
+ for (const run of analytics.recentRuns) {
66
+ const item = lastRuns[run.jobType];
67
+ if (!item)
68
+ continue;
69
+ const finishedAt = run.finishedAt ? new Date(run.finishedAt * 1000).toISOString() : null;
70
+ if (run.status === 'success' && item.lastSuccessAt === null) {
71
+ item.lastSuccessAt = finishedAt;
72
+ item.lastExitCode = 0;
73
+ }
74
+ else if (run.status !== 'success' && item.lastFailureAt === null) {
75
+ item.lastFailureAt = finishedAt;
76
+ item.lastExitCode = 1;
77
+ }
78
+ }
79
+ return lastRuns;
80
+ }
81
+ async function getBoardSnapshot(projectDir, config) {
82
+ if (config.boardProvider?.enabled === false || !config.boardProvider?.projectNumber) {
83
+ return { configured: false, columns: [], items: [], error: null };
84
+ }
85
+ try {
86
+ const provider = createBoardProvider(config.boardProvider, projectDir);
87
+ const [columns, items] = await Promise.all([provider.getColumns(), provider.getAllIssues()]);
88
+ return { configured: true, columns, items, error: null };
89
+ }
90
+ catch (error) {
91
+ return {
92
+ configured: true,
93
+ columns: [],
94
+ items: [],
95
+ error: error instanceof Error ? error.message : String(error),
96
+ };
97
+ }
98
+ }
99
+ function buildHealth(snapshot, config) {
100
+ const checks = [
101
+ {
102
+ name: 'config',
103
+ ok: true,
104
+ message: 'Configuration loaded',
105
+ },
106
+ {
107
+ name: 'cron',
108
+ ok: snapshot.crontab.installed,
109
+ message: snapshot.crontab.installed
110
+ ? 'Cron entries installed'
111
+ : 'No Night Watch cron entries found',
112
+ },
113
+ {
114
+ name: 'queue',
115
+ ok: true,
116
+ message: config.queue.enabled ? 'Global queue enabled' : 'Global queue disabled',
117
+ },
118
+ {
119
+ name: 'provider',
120
+ ok: Boolean(config.provider),
121
+ message: config.provider
122
+ ? `Provider configured: ${config.provider}`
123
+ : 'No provider configured',
124
+ },
125
+ ];
126
+ const staleLocks = snapshot.processes.filter((processInfo) => !processInfo.running && processInfo.pid !== null);
127
+ checks.push({
128
+ name: 'locks',
129
+ ok: staleLocks.length === 0,
130
+ message: staleLocks.length === 0
131
+ ? 'No stale lock files detected'
132
+ : `Stale lock files detected for ${staleLocks.map((lock) => lock.name).join(', ')}`,
133
+ });
134
+ return { schemaVersion: SCHEMA_VERSION, ok: checks.every((check) => check.ok), checks };
135
+ }
136
+ async function buildAgentStatus(projectDir) {
137
+ const config = loadConfig(projectDir);
138
+ const snapshot = await fetchStatusSnapshot(projectDir, config);
139
+ const analytics = getJobRunsAnalytics(24 * 30);
140
+ const health = buildHealth(snapshot, config);
141
+ return {
142
+ schemaVersion: SCHEMA_VERSION,
143
+ generatedAt: snapshot.timestamp.toISOString(),
144
+ project: { name: snapshot.projectName, dir: snapshot.projectDir, provider: config.provider },
145
+ status: buildLegacyStatus(snapshot, config),
146
+ paused: buildPausedState(config),
147
+ queue: getQueueStatus(),
148
+ board: await getBoardSnapshot(projectDir, config),
149
+ health,
150
+ lastRuns: buildLastRuns(analytics),
151
+ };
152
+ }
153
+ function normalizeJobType(job) {
154
+ if (getValidJobTypes().includes(job)) {
155
+ return job;
156
+ }
157
+ throw new Error(`Invalid job: ${job}. Valid jobs: ${getValidJobTypes().join(', ')}`);
158
+ }
159
+ export function agentCommand(program) {
160
+ const agent = program.command('agent').description('Machine-readable agent operations');
161
+ agent
162
+ .command('status')
163
+ .description('Print a stable machine-readable project snapshot')
164
+ .requiredOption(JSON_OPTION, 'Output status as JSON')
165
+ .action(async () => {
166
+ writeJson(await buildAgentStatus(process.cwd()));
167
+ });
168
+ }
169
+ export function configCommand(program) {
170
+ const config = program.command('config').description('Inspect and edit Night Watch config');
171
+ config
172
+ .command('list')
173
+ .description('Print resolved config')
174
+ .option(JSON_OPTION, JSON_OPTION_DESCRIPTION)
175
+ .action((options) => {
176
+ const value = loadConfig(process.cwd());
177
+ if (options.json) {
178
+ writeJson({ schemaVersion: SCHEMA_VERSION, config: value });
179
+ }
180
+ else {
181
+ writeJson(value);
182
+ }
183
+ });
184
+ config
185
+ .command('get <path>')
186
+ .description('Read a resolved config value by dot path')
187
+ .option(JSON_OPTION, JSON_OPTION_DESCRIPTION)
188
+ .action((dotPath, options) => {
189
+ try {
190
+ const result = getConfigValue(process.cwd(), dotPath);
191
+ if (options.json) {
192
+ writeJson({ schemaVersion: SCHEMA_VERSION, ...result });
193
+ }
194
+ else {
195
+ writeJson(result.value);
196
+ }
197
+ }
198
+ catch (error) {
199
+ fail(error instanceof Error ? error.message : String(error), options);
200
+ }
201
+ });
202
+ config
203
+ .command('set <path> <value>')
204
+ .description('Write a config value by dot path')
205
+ .option(JSON_OPTION, JSON_OPTION_DESCRIPTION)
206
+ .action((dotPath, rawValue, options) => {
207
+ try {
208
+ const result = setConfigValue(process.cwd(), dotPath, parseConfigValue(rawValue));
209
+ if (options.json) {
210
+ writeJson({ schemaVersion: SCHEMA_VERSION, ok: true, ...result });
211
+ }
212
+ else {
213
+ process.stdout.write(`Updated ${result.path}\n`);
214
+ }
215
+ }
216
+ catch (error) {
217
+ fail(error instanceof Error ? error.message : String(error), options);
218
+ }
219
+ });
220
+ }
221
+ export function healthCommand(program) {
222
+ program
223
+ .command('health')
224
+ .description('Check automation readiness')
225
+ .option(JSON_OPTION, JSON_OPTION_DESCRIPTION)
226
+ .action(async (options) => {
227
+ const config = loadConfig(process.cwd());
228
+ const snapshot = await fetchStatusSnapshot(process.cwd(), config);
229
+ const health = buildHealth(snapshot, config);
230
+ if (options.json) {
231
+ writeJson(health);
232
+ }
233
+ else {
234
+ for (const check of health.checks) {
235
+ process.stdout.write(`${check.ok ? 'ok' : 'fail'} ${check.name}: ${check.message}\n`);
236
+ }
237
+ }
238
+ if (!health.ok) {
239
+ process.exitCode = 1;
240
+ }
241
+ });
242
+ }
243
+ export function jobCommand(program) {
244
+ const job = program.command('job').description('Manage Night Watch jobs');
245
+ job
246
+ .command('pause <job>')
247
+ .description('Pause a cron/queue-dispatched job')
248
+ .option(JSON_OPTION, JSON_OPTION_DESCRIPTION)
249
+ .action((jobName, options) => {
250
+ try {
251
+ const jobType = normalizeJobType(jobName);
252
+ const result = setConfigValue(process.cwd(), `pausedJobs.${jobType}`, true);
253
+ if (options.json) {
254
+ writeJson({
255
+ schemaVersion: SCHEMA_VERSION,
256
+ ok: true,
257
+ job: jobType,
258
+ paused: result.value,
259
+ });
260
+ }
261
+ else {
262
+ process.stdout.write(`Paused ${jobType}\n`);
263
+ }
264
+ }
265
+ catch (error) {
266
+ fail(error instanceof Error ? error.message : String(error), options);
267
+ }
268
+ });
269
+ job
270
+ .command('resume <job>')
271
+ .description('Resume a cron/queue-dispatched job')
272
+ .option(JSON_OPTION, JSON_OPTION_DESCRIPTION)
273
+ .action((jobName, options) => {
274
+ try {
275
+ const jobType = normalizeJobType(jobName);
276
+ const result = setConfigValue(process.cwd(), `pausedJobs.${jobType}`, false);
277
+ if (options.json) {
278
+ writeJson({
279
+ schemaVersion: SCHEMA_VERSION,
280
+ ok: true,
281
+ job: jobType,
282
+ paused: result.value,
283
+ });
284
+ }
285
+ else {
286
+ process.stdout.write(`Resumed ${jobType}\n`);
287
+ }
288
+ }
289
+ catch (error) {
290
+ fail(error instanceof Error ? error.message : String(error), options);
291
+ }
292
+ });
293
+ job
294
+ .command('is-paused <job>')
295
+ .description('Return zero when a job is paused')
296
+ .action((jobName) => {
297
+ try {
298
+ const jobType = normalizeJobType(jobName);
299
+ const paused = loadConfig(process.cwd()).pausedJobs?.[jobType] === true;
300
+ process.exit(paused ? 0 : 1);
301
+ }
302
+ catch {
303
+ process.exit(1);
304
+ }
305
+ });
306
+ }
307
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Analytics command - runs the Amplitude analytics job
3
+ */
4
+ import { Command } from 'commander';
5
+ export interface IAnalyticsOptions {
6
+ dryRun: boolean;
7
+ timeout?: string;
8
+ provider?: string;
9
+ }
10
+ /**
11
+ * Register the analytics command with the program
12
+ */
13
+ export declare function analyticsCommand(program: Command): void;
14
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Analytics command - runs the Amplitude analytics job
3
+ */
4
+ import { createSpinner, createTable, header, info, loadConfig, resolveJobProvider, runAnalytics, } from '@night-watch/core';
5
+ import { maybeApplyCronSchedulingDelay } from './shared/env-builder.js';
6
+ /**
7
+ * Register the analytics command with the program
8
+ */
9
+ export function analyticsCommand(program) {
10
+ program
11
+ .command('analytics')
12
+ .description('Run Amplitude analytics job now')
13
+ .option('--dry-run', 'Show what would be executed without running')
14
+ .option('--timeout <seconds>', 'Override max runtime in seconds')
15
+ .option('--provider <string>', 'AI provider to use (claude or codex)')
16
+ .action(async (options) => {
17
+ const projectDir = process.cwd();
18
+ let config = loadConfig(projectDir);
19
+ if (options.timeout) {
20
+ const timeout = parseInt(options.timeout, 10);
21
+ if (!isNaN(timeout)) {
22
+ config = { ...config, analytics: { ...config.analytics, maxRuntime: timeout } };
23
+ }
24
+ }
25
+ if (options.provider) {
26
+ config = {
27
+ ...config,
28
+ _cliProviderOverride: options.provider,
29
+ };
30
+ }
31
+ if (!config.analytics.enabled && !options.dryRun) {
32
+ info('Analytics is disabled in config; skipping run.');
33
+ process.exit(0);
34
+ }
35
+ // Validate Amplitude keys
36
+ const apiKey = config.providerEnv?.AMPLITUDE_API_KEY;
37
+ const secretKey = config.providerEnv?.AMPLITUDE_SECRET_KEY;
38
+ if (!apiKey || !secretKey) {
39
+ info('AMPLITUDE_API_KEY and AMPLITUDE_SECRET_KEY must be set in providerEnv to run analytics.');
40
+ process.exit(1);
41
+ }
42
+ if (options.dryRun) {
43
+ header('Dry Run: Analytics Job');
44
+ const analyticsProvider = resolveJobProvider(config, 'analytics');
45
+ header('Configuration');
46
+ const configTable = createTable({ head: ['Setting', 'Value'] });
47
+ configTable.push(['Provider', analyticsProvider]);
48
+ configTable.push(['Max Runtime', `${config.analytics.maxRuntime}s`]);
49
+ configTable.push(['Lookback Days', String(config.analytics.lookbackDays)]);
50
+ configTable.push(['Target Column', config.analytics.targetColumn]);
51
+ configTable.push(['Amplitude API Key', apiKey ? '***' + apiKey.slice(-4) : 'not set']);
52
+ console.log(configTable.toString());
53
+ console.log();
54
+ process.exit(0);
55
+ }
56
+ const spinner = createSpinner('Running analytics job...');
57
+ spinner.start();
58
+ try {
59
+ await maybeApplyCronSchedulingDelay(config, 'analytics', projectDir);
60
+ const result = await runAnalytics(config, projectDir);
61
+ spinner.succeed(`Analytics complete — ${result.summary}`);
62
+ }
63
+ catch (err) {
64
+ spinner.fail(`Analytics failed: ${err instanceof Error ? err.message : String(err)}`);
65
+ process.exit(1);
66
+ }
67
+ });
68
+ }
69
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/commands/analytics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Audit command - runs the AI provider to scan the codebase for code quality issues
3
+ */
4
+ import { Command } from 'commander';
5
+ import { INightWatchConfig } from '@night-watch/core';
6
+ export interface IAuditOptions {
7
+ dryRun: boolean;
8
+ timeout?: string;
9
+ provider?: string;
10
+ }
11
+ /**
12
+ * Build environment variables map from config and CLI options for audit
13
+ */
14
+ export declare function buildEnvVars(config: INightWatchConfig, options: IAuditOptions): Record<string, string>;
15
+ /**
16
+ * Register the audit command with the program
17
+ */
18
+ export declare function auditCommand(program: Command): void;
19
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Audit command - runs the AI provider to scan the codebase for code quality issues
3
+ */
4
+ import { CLAUDE_MODEL_IDS, PROVIDER_COMMANDS, createSpinner, createTable, dim, executeScriptWithOutput, getScriptPath, header, info, loadConfig, parseScriptResult, resolveJobProvider, syncAuditFindingsToBoard, } from '@night-watch/core';
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import { buildBaseEnvVars, getTelegramStatusWebhooks, maybeApplyCronSchedulingDelay, } from './shared/env-builder.js';
8
+ /**
9
+ * Build environment variables map from config and CLI options for audit
10
+ */
11
+ export function buildEnvVars(config, options) {
12
+ // Start with base env vars shared by all job types
13
+ const env = buildBaseEnvVars(config, 'audit', options.dryRun);
14
+ // Audit-specific settings
15
+ env.NW_AUDIT_MAX_RUNTIME = String(config.audit.maxRuntime);
16
+ env.NW_CLAUDE_MODEL_ID =
17
+ CLAUDE_MODEL_IDS[config.primaryFallbackModel ?? config.claudeModel ?? 'sonnet'];
18
+ // Telegram status messages from bash scripts (start/progress/final status)
19
+ const telegramWebhooks = getTelegramStatusWebhooks(config);
20
+ if (telegramWebhooks.length > 0) {
21
+ env.NW_TELEGRAM_STATUS_WEBHOOKS = JSON.stringify(telegramWebhooks);
22
+ env.NW_TELEGRAM_BOT_TOKEN = telegramWebhooks[0].botToken;
23
+ env.NW_TELEGRAM_CHAT_ID = telegramWebhooks[0].chatId;
24
+ }
25
+ return env;
26
+ }
27
+ /**
28
+ * Register the audit command with the program
29
+ */
30
+ export function auditCommand(program) {
31
+ program
32
+ .command('audit')
33
+ .description('Run AI provider code audit now')
34
+ .option('--dry-run', 'Show what would be executed without running')
35
+ .option('--timeout <seconds>', 'Override max runtime in seconds')
36
+ .option('--provider <string>', 'AI provider to use (claude or codex)')
37
+ .action(async (options) => {
38
+ const projectDir = process.cwd();
39
+ let config = loadConfig(projectDir);
40
+ if (options.timeout) {
41
+ const timeout = parseInt(options.timeout, 10);
42
+ if (!isNaN(timeout)) {
43
+ config = { ...config, audit: { ...config.audit, maxRuntime: timeout } };
44
+ }
45
+ }
46
+ if (options.provider) {
47
+ // Use _cliProviderOverride to ensure CLI flag takes precedence over jobProviders
48
+ config = {
49
+ ...config,
50
+ _cliProviderOverride: options.provider,
51
+ };
52
+ }
53
+ if (!config.audit.enabled && !options.dryRun) {
54
+ info('Audit is disabled in config; skipping run.');
55
+ process.exit(0);
56
+ }
57
+ const envVars = buildEnvVars(config, options);
58
+ const scriptPath = getScriptPath('night-watch-audit-cron.sh');
59
+ if (options.dryRun) {
60
+ header('Dry Run: Code Auditor');
61
+ // Resolve audit-specific provider
62
+ const auditProvider = resolveJobProvider(config, 'audit');
63
+ header('Configuration');
64
+ const configTable = createTable({ head: ['Setting', 'Value'] });
65
+ configTable.push(['Provider', auditProvider]);
66
+ configTable.push(['Provider CLI', PROVIDER_COMMANDS[auditProvider]]);
67
+ configTable.push(['Max Runtime', `${config.audit.maxRuntime}s`]);
68
+ configTable.push(['Target Column', config.audit.targetColumn]);
69
+ configTable.push(['Report File', path.join(projectDir, 'logs', 'audit-report.md')]);
70
+ console.log(configTable.toString());
71
+ header('Provider Invocation');
72
+ const providerCmd = PROVIDER_COMMANDS[auditProvider];
73
+ if (auditProvider === 'claude') {
74
+ dim(` ${providerCmd} -p "<bundled night-watch-audit.md>" --dangerously-skip-permissions`);
75
+ }
76
+ else {
77
+ dim(` ${providerCmd} exec --yolo "<bundled night-watch-audit.md>"`);
78
+ }
79
+ header('Command');
80
+ dim(` bash ${scriptPath} ${projectDir}`);
81
+ console.log();
82
+ process.exit(0);
83
+ }
84
+ const spinner = createSpinner('Running code audit...');
85
+ spinner.start();
86
+ try {
87
+ await maybeApplyCronSchedulingDelay(config, 'audit', projectDir);
88
+ const { exitCode, stdout, stderr } = await executeScriptWithOutput(scriptPath, [projectDir], envVars);
89
+ const scriptResult = parseScriptResult(`${stdout}\n${stderr}`);
90
+ if (exitCode === 0) {
91
+ if (scriptResult?.status === 'queued') {
92
+ spinner.succeed('Code audit queued — another job is currently running');
93
+ }
94
+ else if (scriptResult?.status === 'skip_clean') {
95
+ spinner.succeed('Code audit complete — no actionable issues found');
96
+ }
97
+ else if (scriptResult?.status?.startsWith('skip_')) {
98
+ spinner.succeed('Code audit skipped');
99
+ }
100
+ else {
101
+ const reportPath = path.join(projectDir, 'logs', 'audit-report.md');
102
+ if (!fs.existsSync(reportPath)) {
103
+ spinner.fail('Code audit finished without a report file');
104
+ process.exit(1);
105
+ }
106
+ const syncResult = await syncAuditFindingsToBoard(config, projectDir);
107
+ const message = `Code audit complete — report written to ${reportPath}; ${syncResult.summary}`;
108
+ if (syncResult.status === 'failed' || syncResult.status === 'partial') {
109
+ spinner.warn(message);
110
+ }
111
+ else {
112
+ spinner.succeed(message);
113
+ }
114
+ }
115
+ }
116
+ else {
117
+ const statusSuffix = scriptResult?.status ? ` (${scriptResult.status})` : '';
118
+ const providerExit = scriptResult?.data?.provider_exit;
119
+ const exitDetail = providerExit && providerExit !== String(exitCode)
120
+ ? `, provider exit ${providerExit}`
121
+ : '';
122
+ spinner.fail(`Code audit exited with code ${exitCode}${statusSuffix}${exitDetail}`);
123
+ // Print last audit log lines so the parent process captures the actual failure reason
124
+ const logPath = path.join(projectDir, 'logs', 'audit.log');
125
+ if (fs.existsSync(logPath)) {
126
+ const logLines = fs
127
+ .readFileSync(logPath, 'utf-8')
128
+ .split('\n')
129
+ .filter((l) => l.trim())
130
+ .slice(-8);
131
+ if (logLines.length > 0) {
132
+ process.stderr.write(logLines.join('\n') + '\n');
133
+ }
134
+ }
135
+ process.exit(exitCode || 1);
136
+ }
137
+ }
138
+ catch (err) {
139
+ spinner.fail(`Code audit failed: ${err instanceof Error ? err.message : String(err)}`);
140
+ process.exit(1);
141
+ }
142
+ });
143
+ }
144
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Board command group — manage the PRD tracking board
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Register the board command group with the program.
7
+ */
8
+ export declare function boardCommand(program: Command): void;
9
+ //# sourceMappingURL=board.d.ts.map