@jonit-dev/night-watch-cli 1.7.10 → 1.7.11
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/LICENSE +1 -1
- package/dist/commands/dashboard/tab-config.d.ts.map +1 -1
- package/dist/commands/dashboard/tab-config.js +8 -1
- package/dist/commands/dashboard/tab-config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +3 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/review.d.ts +4 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +30 -0
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/run.d.ts +11 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +47 -7
- package/dist/commands/run.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +43 -3
- package/dist/server/index.js.map +1 -1
- package/dist/shared/types.d.ts +223 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +7 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/src/agents/soul-compiler.d.ts +11 -0
- package/dist/src/agents/soul-compiler.d.ts.map +1 -0
- package/dist/src/agents/soul-compiler.js +103 -0
- package/dist/src/agents/soul-compiler.js.map +1 -0
- package/dist/src/board/factory.d.ts +3 -0
- package/dist/src/board/factory.d.ts.map +1 -0
- package/dist/src/board/factory.js +10 -0
- package/dist/src/board/factory.js.map +1 -0
- package/dist/src/board/providers/github-graphql.d.ts +16 -0
- package/dist/src/board/providers/github-graphql.d.ts.map +1 -0
- package/dist/src/board/providers/github-graphql.js +43 -0
- package/dist/src/board/providers/github-graphql.js.map +1 -0
- package/dist/src/board/providers/github-projects.d.ts +51 -0
- package/dist/src/board/providers/github-projects.d.ts.map +1 -0
- package/dist/src/board/providers/github-projects.js +672 -0
- package/dist/src/board/providers/github-projects.js.map +1 -0
- package/dist/src/board/types.d.ts +60 -0
- package/dist/src/board/types.d.ts.map +1 -0
- package/dist/src/board/types.js +4 -0
- package/dist/src/board/types.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +80 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/board.d.ts +9 -0
- package/dist/src/commands/board.d.ts.map +1 -0
- package/dist/src/commands/board.js +294 -0
- package/dist/src/commands/board.js.map +1 -0
- package/dist/src/commands/cancel.d.ts +46 -0
- package/dist/src/commands/cancel.d.ts.map +1 -0
- package/dist/src/commands/cancel.js +241 -0
- package/dist/src/commands/cancel.js.map +1 -0
- package/dist/src/commands/dashboard/tab-actions.d.ts +10 -0
- package/dist/src/commands/dashboard/tab-actions.d.ts.map +1 -0
- package/dist/src/commands/dashboard/tab-actions.js +245 -0
- package/dist/src/commands/dashboard/tab-actions.js.map +1 -0
- package/dist/src/commands/dashboard/tab-config.d.ts +21 -0
- package/dist/src/commands/dashboard/tab-config.d.ts.map +1 -0
- package/dist/src/commands/dashboard/tab-config.js +829 -0
- package/dist/src/commands/dashboard/tab-config.js.map +1 -0
- package/dist/src/commands/dashboard/tab-logs.d.ts +10 -0
- package/dist/src/commands/dashboard/tab-logs.d.ts.map +1 -0
- package/dist/src/commands/dashboard/tab-logs.js +178 -0
- package/dist/src/commands/dashboard/tab-logs.js.map +1 -0
- package/dist/src/commands/dashboard/tab-schedules.d.ts +21 -0
- package/dist/src/commands/dashboard/tab-schedules.d.ts.map +1 -0
- package/dist/src/commands/dashboard/tab-schedules.js +304 -0
- package/dist/src/commands/dashboard/tab-schedules.js.map +1 -0
- package/dist/src/commands/dashboard/tab-status.d.ts +32 -0
- package/dist/src/commands/dashboard/tab-status.d.ts.map +1 -0
- package/dist/src/commands/dashboard/tab-status.js +421 -0
- package/dist/src/commands/dashboard/tab-status.js.map +1 -0
- package/dist/src/commands/dashboard/types.d.ts +43 -0
- package/dist/src/commands/dashboard/types.d.ts.map +1 -0
- package/dist/src/commands/dashboard/types.js +5 -0
- package/dist/src/commands/dashboard/types.js.map +1 -0
- package/dist/src/commands/dashboard.d.ts +11 -0
- package/dist/src/commands/dashboard.d.ts.map +1 -0
- package/dist/src/commands/dashboard.js +239 -0
- package/dist/src/commands/dashboard.js.map +1 -0
- package/dist/src/commands/doctor.d.ts +16 -0
- package/dist/src/commands/doctor.d.ts.map +1 -0
- package/dist/src/commands/doctor.js +202 -0
- package/dist/src/commands/doctor.js.map +1 -0
- package/dist/src/commands/history.d.ts +7 -0
- package/dist/src/commands/history.d.ts.map +1 -0
- package/dist/src/commands/history.js +56 -0
- package/dist/src/commands/history.js.map +1 -0
- package/dist/src/commands/init.d.ts +25 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/src/commands/init.js +543 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/install.d.ts +48 -0
- package/dist/src/commands/install.d.ts.map +1 -0
- package/dist/src/commands/install.js +303 -0
- package/dist/src/commands/install.js.map +1 -0
- package/dist/src/commands/logs.d.ts +15 -0
- package/dist/src/commands/logs.d.ts.map +1 -0
- package/dist/src/commands/logs.js +104 -0
- package/dist/src/commands/logs.js.map +1 -0
- package/dist/src/commands/prd-state.d.ts +12 -0
- package/dist/src/commands/prd-state.d.ts.map +1 -0
- package/dist/src/commands/prd-state.js +47 -0
- package/dist/src/commands/prd-state.js.map +1 -0
- package/dist/src/commands/prd.d.ts +24 -0
- package/dist/src/commands/prd.d.ts.map +1 -0
- package/dist/src/commands/prd.js +283 -0
- package/dist/src/commands/prd.js.map +1 -0
- package/dist/src/commands/prds.d.ts +13 -0
- package/dist/src/commands/prds.d.ts.map +1 -0
- package/dist/src/commands/prds.js +196 -0
- package/dist/src/commands/prds.js.map +1 -0
- package/dist/src/commands/prs.d.ts +14 -0
- package/dist/src/commands/prs.d.ts.map +1 -0
- package/dist/src/commands/prs.js +106 -0
- package/dist/src/commands/prs.js.map +1 -0
- package/dist/src/commands/qa.d.ts +30 -0
- package/dist/src/commands/qa.d.ts.map +1 -0
- package/dist/src/commands/qa.js +159 -0
- package/dist/src/commands/qa.js.map +1 -0
- package/dist/src/commands/retry.d.ts +9 -0
- package/dist/src/commands/retry.d.ts.map +1 -0
- package/dist/src/commands/retry.js +72 -0
- package/dist/src/commands/retry.js.map +1 -0
- package/dist/src/commands/review.d.ts +35 -0
- package/dist/src/commands/review.d.ts.map +1 -0
- package/dist/src/commands/review.js +252 -0
- package/dist/src/commands/review.js.map +1 -0
- package/dist/src/commands/run.d.ts +61 -0
- package/dist/src/commands/run.d.ts.map +1 -0
- package/dist/src/commands/run.js +364 -0
- package/dist/src/commands/run.js.map +1 -0
- package/dist/src/commands/serve.d.ts +7 -0
- package/dist/src/commands/serve.d.ts.map +1 -0
- package/dist/src/commands/serve.js +27 -0
- package/dist/src/commands/serve.js.map +1 -0
- package/dist/src/commands/slice.d.ts +26 -0
- package/dist/src/commands/slice.d.ts.map +1 -0
- package/dist/src/commands/slice.js +175 -0
- package/dist/src/commands/slice.js.map +1 -0
- package/dist/src/commands/state.d.ts +8 -0
- package/dist/src/commands/state.d.ts.map +1 -0
- package/dist/src/commands/state.js +56 -0
- package/dist/src/commands/state.js.map +1 -0
- package/dist/src/commands/status.d.ts +14 -0
- package/dist/src/commands/status.d.ts.map +1 -0
- package/dist/src/commands/status.js +147 -0
- package/dist/src/commands/status.js.map +1 -0
- package/dist/src/commands/uninstall.d.ts +25 -0
- package/dist/src/commands/uninstall.d.ts.map +1 -0
- package/dist/src/commands/uninstall.js +141 -0
- package/dist/src/commands/uninstall.js.map +1 -0
- package/dist/src/commands/update.d.ts +21 -0
- package/dist/src/commands/update.d.ts.map +1 -0
- package/dist/src/commands/update.js +87 -0
- package/dist/src/commands/update.js.map +1 -0
- package/dist/src/config.d.ts +23 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +629 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/constants.d.ts +60 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +118 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/server/index.d.ts +23 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +1642 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/slack/channel-manager.d.ts +32 -0
- package/dist/src/slack/channel-manager.d.ts.map +1 -0
- package/dist/src/slack/channel-manager.js +128 -0
- package/dist/src/slack/channel-manager.js.map +1 -0
- package/dist/src/slack/client.d.ts +63 -0
- package/dist/src/slack/client.d.ts.map +1 -0
- package/dist/src/slack/client.js +151 -0
- package/dist/src/slack/client.js.map +1 -0
- package/dist/src/slack/deliberation.d.ts +45 -0
- package/dist/src/slack/deliberation.d.ts.map +1 -0
- package/dist/src/slack/deliberation.js +539 -0
- package/dist/src/slack/deliberation.js.map +1 -0
- package/dist/src/slack/index.d.ts +6 -0
- package/dist/src/slack/index.d.ts.map +1 -0
- package/dist/src/slack/index.js +5 -0
- package/dist/src/slack/index.js.map +1 -0
- package/dist/src/slack/interaction-listener.d.ts +47 -0
- package/dist/src/slack/interaction-listener.d.ts.map +1 -0
- package/dist/src/slack/interaction-listener.js +216 -0
- package/dist/src/slack/interaction-listener.js.map +1 -0
- package/dist/src/storage/json-state-migrator.d.ts +24 -0
- package/dist/src/storage/json-state-migrator.d.ts.map +1 -0
- package/dist/src/storage/json-state-migrator.js +197 -0
- package/dist/src/storage/json-state-migrator.js.map +1 -0
- package/dist/src/storage/repositories/index.d.ts +25 -0
- package/dist/src/storage/repositories/index.d.ts.map +1 -0
- package/dist/src/storage/repositories/index.js +43 -0
- package/dist/src/storage/repositories/index.js.map +1 -0
- package/dist/src/storage/repositories/interfaces.d.ts +59 -0
- package/dist/src/storage/repositories/interfaces.d.ts.map +1 -0
- package/dist/src/storage/repositories/interfaces.js +6 -0
- package/dist/src/storage/repositories/interfaces.js.map +1 -0
- package/dist/src/storage/repositories/sqlite/agent-persona-repository.d.ts +27 -0
- package/dist/src/storage/repositories/sqlite/agent-persona-repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/sqlite/agent-persona-repository.js +569 -0
- package/dist/src/storage/repositories/sqlite/agent-persona-repository.js.map +1 -0
- package/dist/src/storage/repositories/sqlite/execution-history-repository.d.ts +21 -0
- package/dist/src/storage/repositories/sqlite/execution-history-repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/sqlite/execution-history-repository.js +94 -0
- package/dist/src/storage/repositories/sqlite/execution-history-repository.js.map +1 -0
- package/dist/src/storage/repositories/sqlite/prd-state-repository.d.ts +17 -0
- package/dist/src/storage/repositories/sqlite/prd-state-repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/sqlite/prd-state-repository.js +74 -0
- package/dist/src/storage/repositories/sqlite/prd-state-repository.js.map +1 -0
- package/dist/src/storage/repositories/sqlite/project-registry-repository.d.ts +17 -0
- package/dist/src/storage/repositories/sqlite/project-registry-repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/sqlite/project-registry-repository.js +43 -0
- package/dist/src/storage/repositories/sqlite/project-registry-repository.js.map +1 -0
- package/dist/src/storage/repositories/sqlite/roadmap-state-repository.d.ts +14 -0
- package/dist/src/storage/repositories/sqlite/roadmap-state-repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/sqlite/roadmap-state-repository.js +47 -0
- package/dist/src/storage/repositories/sqlite/roadmap-state-repository.js.map +1 -0
- package/dist/src/storage/repositories/sqlite/slack-discussion-repository.d.ts +20 -0
- package/dist/src/storage/repositories/sqlite/slack-discussion-repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/sqlite/slack-discussion-repository.js +88 -0
- package/dist/src/storage/repositories/sqlite/slack-discussion-repository.js.map +1 -0
- package/dist/src/storage/sqlite/client.d.ts +23 -0
- package/dist/src/storage/sqlite/client.d.ts.map +1 -0
- package/dist/src/storage/sqlite/client.js +47 -0
- package/dist/src/storage/sqlite/client.js.map +1 -0
- package/dist/src/storage/sqlite/migrations.d.ts +11 -0
- package/dist/src/storage/sqlite/migrations.d.ts.map +1 -0
- package/dist/src/storage/sqlite/migrations.js +94 -0
- package/dist/src/storage/sqlite/migrations.js.map +1 -0
- package/dist/src/templates/prd-template.d.ts +11 -0
- package/dist/src/templates/prd-template.d.ts.map +1 -0
- package/dist/src/templates/prd-template.js +166 -0
- package/dist/src/templates/prd-template.js.map +1 -0
- package/dist/src/templates/slicer-prompt.d.ts +54 -0
- package/dist/src/templates/slicer-prompt.d.ts.map +1 -0
- package/dist/src/templates/slicer-prompt.js +163 -0
- package/dist/src/templates/slicer-prompt.js.map +1 -0
- package/dist/src/types.d.ts +127 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/checks.d.ts +55 -0
- package/dist/src/utils/checks.d.ts.map +1 -0
- package/dist/src/utils/checks.js +246 -0
- package/dist/src/utils/checks.js.map +1 -0
- package/dist/src/utils/config-writer.d.ts +16 -0
- package/dist/src/utils/config-writer.d.ts.map +1 -0
- package/dist/src/utils/config-writer.js +45 -0
- package/dist/src/utils/config-writer.js.map +1 -0
- package/dist/src/utils/crontab.d.ts +62 -0
- package/dist/src/utils/crontab.d.ts.map +1 -0
- package/dist/src/utils/crontab.js +168 -0
- package/dist/src/utils/crontab.js.map +1 -0
- package/dist/src/utils/execution-history.d.ts +54 -0
- package/dist/src/utils/execution-history.d.ts.map +1 -0
- package/dist/src/utils/execution-history.js +80 -0
- package/dist/src/utils/execution-history.js.map +1 -0
- package/dist/src/utils/github.d.ts +40 -0
- package/dist/src/utils/github.d.ts.map +1 -0
- package/dist/src/utils/github.js +126 -0
- package/dist/src/utils/github.js.map +1 -0
- package/dist/src/utils/notify.d.ts +63 -0
- package/dist/src/utils/notify.d.ts.map +1 -0
- package/dist/src/utils/notify.js +389 -0
- package/dist/src/utils/notify.js.map +1 -0
- package/dist/src/utils/prd-states.d.ts +16 -0
- package/dist/src/utils/prd-states.d.ts.map +1 -0
- package/dist/src/utils/prd-states.js +28 -0
- package/dist/src/utils/prd-states.js.map +1 -0
- package/dist/src/utils/registry.d.ts +45 -0
- package/dist/src/utils/registry.d.ts.map +1 -0
- package/dist/src/utils/registry.js +86 -0
- package/dist/src/utils/registry.js.map +1 -0
- package/dist/src/utils/roadmap-parser.d.ts +45 -0
- package/dist/src/utils/roadmap-parser.d.ts.map +1 -0
- package/dist/src/utils/roadmap-parser.js +136 -0
- package/dist/src/utils/roadmap-parser.js.map +1 -0
- package/dist/src/utils/roadmap-scanner.d.ts +92 -0
- package/dist/src/utils/roadmap-scanner.d.ts.map +1 -0
- package/dist/src/utils/roadmap-scanner.js +349 -0
- package/dist/src/utils/roadmap-scanner.js.map +1 -0
- package/dist/src/utils/roadmap-state.d.ts +90 -0
- package/dist/src/utils/roadmap-state.d.ts.map +1 -0
- package/dist/src/utils/roadmap-state.js +154 -0
- package/dist/src/utils/roadmap-state.js.map +1 -0
- package/dist/src/utils/script-result.d.ts +12 -0
- package/dist/src/utils/script-result.d.ts.map +1 -0
- package/dist/src/utils/script-result.js +46 -0
- package/dist/src/utils/script-result.js.map +1 -0
- package/dist/src/utils/shell.d.ts +27 -0
- package/dist/src/utils/shell.d.ts.map +1 -0
- package/dist/src/utils/shell.js +64 -0
- package/dist/src/utils/shell.js.map +1 -0
- package/dist/src/utils/status-data.d.ts +148 -0
- package/dist/src/utils/status-data.d.ts.map +1 -0
- package/dist/src/utils/status-data.js +593 -0
- package/dist/src/utils/status-data.js.map +1 -0
- package/dist/src/utils/ui.d.ts +55 -0
- package/dist/src/utils/ui.d.ts.map +1 -0
- package/dist/src/utils/ui.js +121 -0
- package/dist/src/utils/ui.js.map +1 -0
- package/package.json +3 -1
- package/scripts/night-watch-cron.sh +7 -0
- package/scripts/night-watch-helpers.sh +33 -4
- package/scripts/night-watch-pr-reviewer-cron.sh +11 -3
- package/web/dist/assets/index-BtxQU4oX.css +1 -0
- package/web/dist/assets/index-CsNIryJz.js +473 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/index-BPW-7_1C.js +0 -380
- package/web/dist/assets/index-DVqjjJEO.css +0 -1
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slice command - executes the roadmap slicer to create PRDs from roadmap items
|
|
3
|
+
*/
|
|
4
|
+
import { loadConfig } from "../config.js";
|
|
5
|
+
import { sendNotifications } from "../utils/notify.js";
|
|
6
|
+
import { PROVIDER_COMMANDS } from "../constants.js";
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
import { createSpinner, createTable, dim, header, info, error as uiError, } from "../utils/ui.js";
|
|
9
|
+
import { getRoadmapStatus, sliceNextItem, } from "../utils/roadmap-scanner.js";
|
|
10
|
+
/**
|
|
11
|
+
* Build environment variables map from config and CLI options for slicer
|
|
12
|
+
*/
|
|
13
|
+
export function buildEnvVars(config, options) {
|
|
14
|
+
const env = {};
|
|
15
|
+
// Provider command - the actual CLI binary to call
|
|
16
|
+
env.NW_PROVIDER_CMD = PROVIDER_COMMANDS[config.provider];
|
|
17
|
+
// Slicer runtime
|
|
18
|
+
env.NW_SLICER_MAX_RUNTIME = String(config.roadmapScanner.slicerMaxRuntime);
|
|
19
|
+
// PRD directory for slicer output
|
|
20
|
+
env.NW_PRD_DIR = config.prdDir;
|
|
21
|
+
// Roadmap path
|
|
22
|
+
env.NW_ROADMAP_PATH = config.roadmapScanner.roadmapPath;
|
|
23
|
+
// Provider environment variables (API keys, base URLs, etc.)
|
|
24
|
+
if (config.providerEnv) {
|
|
25
|
+
Object.assign(env, config.providerEnv);
|
|
26
|
+
}
|
|
27
|
+
// Dry run flag
|
|
28
|
+
if (options.dryRun) {
|
|
29
|
+
env.NW_DRY_RUN = "1";
|
|
30
|
+
}
|
|
31
|
+
// Sandbox flag - prevents the agent from modifying crontab during execution
|
|
32
|
+
env.NW_EXECUTION_CONTEXT = "agent";
|
|
33
|
+
return env;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Apply CLI flag overrides to the config for slicer
|
|
37
|
+
*/
|
|
38
|
+
export function applyCliOverrides(config, options) {
|
|
39
|
+
const overridden = { ...config };
|
|
40
|
+
if (options.timeout) {
|
|
41
|
+
const timeout = parseInt(options.timeout, 10);
|
|
42
|
+
if (!isNaN(timeout)) {
|
|
43
|
+
overridden.roadmapScanner = {
|
|
44
|
+
...overridden.roadmapScanner,
|
|
45
|
+
slicerMaxRuntime: timeout,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (options.provider) {
|
|
50
|
+
overridden.provider = options.provider;
|
|
51
|
+
}
|
|
52
|
+
return overridden;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Register the slice command with the program
|
|
56
|
+
*/
|
|
57
|
+
export function sliceCommand(program) {
|
|
58
|
+
program
|
|
59
|
+
.command("slice")
|
|
60
|
+
.description("Run roadmap slicer to create PRD from next roadmap item")
|
|
61
|
+
.option("--dry-run", "Show what would be executed without running")
|
|
62
|
+
.option("--timeout <seconds>", "Override max runtime in seconds for slicer")
|
|
63
|
+
.option("--provider <string>", "AI provider to use (claude or codex)")
|
|
64
|
+
.action(async (options) => {
|
|
65
|
+
// Get the project directory (current working directory)
|
|
66
|
+
const projectDir = process.cwd();
|
|
67
|
+
// Load config from file and environment
|
|
68
|
+
let config = loadConfig(projectDir);
|
|
69
|
+
// Apply CLI flag overrides
|
|
70
|
+
config = applyCliOverrides(config, options);
|
|
71
|
+
// Build environment variables
|
|
72
|
+
const envVars = buildEnvVars(config, options);
|
|
73
|
+
if (options.dryRun) {
|
|
74
|
+
header("Dry Run: Roadmap Slicer");
|
|
75
|
+
// Configuration section with table
|
|
76
|
+
header("Configuration");
|
|
77
|
+
const configTable = createTable({ head: ["Setting", "Value"] });
|
|
78
|
+
configTable.push(["Provider", config.provider]);
|
|
79
|
+
configTable.push(["Provider CLI", PROVIDER_COMMANDS[config.provider]]);
|
|
80
|
+
configTable.push(["PRD Directory", config.prdDir]);
|
|
81
|
+
configTable.push(["Roadmap Path", config.roadmapScanner.roadmapPath]);
|
|
82
|
+
configTable.push(["Slicer Max Runtime", `${config.roadmapScanner.slicerMaxRuntime}s (${Math.floor(config.roadmapScanner.slicerMaxRuntime / 60)}min)`]);
|
|
83
|
+
configTable.push(["Slicer Schedule", config.roadmapScanner.slicerSchedule]);
|
|
84
|
+
configTable.push(["Scanner Enabled", config.roadmapScanner.enabled ? "Yes" : "No"]);
|
|
85
|
+
console.log(configTable.toString());
|
|
86
|
+
// Get roadmap status
|
|
87
|
+
header("Roadmap Status");
|
|
88
|
+
const roadmapStatus = getRoadmapStatus(projectDir, config);
|
|
89
|
+
if (!config.roadmapScanner.enabled) {
|
|
90
|
+
dim(" Roadmap scanner is disabled");
|
|
91
|
+
}
|
|
92
|
+
else if (roadmapStatus.status === "no-roadmap") {
|
|
93
|
+
dim(` ROADMAP.md not found at ${config.roadmapScanner.roadmapPath}`);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const statusTable = createTable({ head: ["Metric", "Count"] });
|
|
97
|
+
statusTable.push(["Total Items", roadmapStatus.totalItems]);
|
|
98
|
+
statusTable.push(["Processed", roadmapStatus.processedItems]);
|
|
99
|
+
statusTable.push(["Pending", roadmapStatus.pendingItems]);
|
|
100
|
+
statusTable.push(["Status", roadmapStatus.status]);
|
|
101
|
+
console.log(statusTable.toString());
|
|
102
|
+
// Show pending items
|
|
103
|
+
if (roadmapStatus.pendingItems > 0) {
|
|
104
|
+
header("Pending Items");
|
|
105
|
+
const pendingItems = roadmapStatus.items.filter((item) => !item.processed && !item.checked);
|
|
106
|
+
for (const item of pendingItems.slice(0, 10)) {
|
|
107
|
+
info(` - ${item.title}`);
|
|
108
|
+
if (item.section) {
|
|
109
|
+
dim(` Section: ${item.section}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (pendingItems.length > 10) {
|
|
113
|
+
dim(` ... and ${pendingItems.length - 10} more`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Provider invocation command
|
|
118
|
+
header("Provider Invocation");
|
|
119
|
+
const providerCmd = PROVIDER_COMMANDS[config.provider];
|
|
120
|
+
const autoFlag = config.provider === "claude" ? "--dangerously-skip-permissions" : "--yolo";
|
|
121
|
+
dim(` ${providerCmd} ${autoFlag} -p "/night-watch-slicer"`);
|
|
122
|
+
// Environment variables
|
|
123
|
+
header("Environment Variables");
|
|
124
|
+
for (const [key, value] of Object.entries(envVars)) {
|
|
125
|
+
dim(` ${key}=${value}`);
|
|
126
|
+
}
|
|
127
|
+
// Full command that would be executed
|
|
128
|
+
header("Action");
|
|
129
|
+
dim(" Would invoke sliceNextItem() to process one roadmap item");
|
|
130
|
+
console.log();
|
|
131
|
+
process.exit(0);
|
|
132
|
+
}
|
|
133
|
+
// Check if roadmap scanner is enabled
|
|
134
|
+
if (!config.roadmapScanner.enabled) {
|
|
135
|
+
uiError("Roadmap scanner is disabled. Enable it in night-watch.config.json to use the slicer.");
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
// Execute the slicer with spinner
|
|
139
|
+
const spinner = createSpinner("Running roadmap slicer...");
|
|
140
|
+
spinner.start();
|
|
141
|
+
try {
|
|
142
|
+
const result = await sliceNextItem(projectDir, config);
|
|
143
|
+
if (result.sliced) {
|
|
144
|
+
spinner.succeed(`Slicer completed successfully: Created ${result.file}`);
|
|
145
|
+
}
|
|
146
|
+
else if (result.error) {
|
|
147
|
+
if (result.error === "No pending items to process") {
|
|
148
|
+
spinner.succeed("No pending items to process");
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
spinner.fail(`Slicer failed: ${result.error}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Send notifications (fire-and-forget, failures do not affect exit code)
|
|
155
|
+
const exitCode = result.sliced ? 0 : (result.error === "No pending items to process" ? 0 : 1);
|
|
156
|
+
if (!options.dryRun && result.sliced) {
|
|
157
|
+
const event = "run_succeeded";
|
|
158
|
+
await sendNotifications(config, {
|
|
159
|
+
event,
|
|
160
|
+
projectName: path.basename(projectDir),
|
|
161
|
+
exitCode,
|
|
162
|
+
provider: config.provider,
|
|
163
|
+
prTitle: result.item?.title,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
process.exit(exitCode);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
spinner.fail("Failed to execute slice command");
|
|
170
|
+
uiError(`${err instanceof Error ? err.message : String(err)}`);
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=slice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice.js","sourceRoot":"","sources":["../../../src/commands/slice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State command — manage Night Watch persistent state.
|
|
3
|
+
* Provides the `night-watch state migrate` subcommand for migrating
|
|
4
|
+
* legacy JSON state files into the SQLite backend.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
export declare function createStateCommand(): Command;
|
|
8
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/commands/state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,kBAAkB,IAAI,OAAO,CAsE5C"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State command — manage Night Watch persistent state.
|
|
3
|
+
* Provides the `night-watch state migrate` subcommand for migrating
|
|
4
|
+
* legacy JSON state files into the SQLite backend.
|
|
5
|
+
*/
|
|
6
|
+
import * as os from "os";
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
import chalk from "chalk";
|
|
9
|
+
import { Command } from "commander";
|
|
10
|
+
import { GLOBAL_CONFIG_DIR } from "../constants.js";
|
|
11
|
+
import { migrateJsonToSqlite } from "../storage/json-state-migrator.js";
|
|
12
|
+
export function createStateCommand() {
|
|
13
|
+
const state = new Command("state");
|
|
14
|
+
state.description("Manage Night Watch state");
|
|
15
|
+
state
|
|
16
|
+
.command("migrate")
|
|
17
|
+
.description("Migrate legacy JSON state files to SQLite")
|
|
18
|
+
.option("--dry-run", "Show what would be migrated without making changes")
|
|
19
|
+
.action((opts) => {
|
|
20
|
+
const nightWatchHome = process.env.NIGHT_WATCH_HOME ||
|
|
21
|
+
path.join(os.homedir(), GLOBAL_CONFIG_DIR);
|
|
22
|
+
if (opts.dryRun) {
|
|
23
|
+
console.log(chalk.cyan("Dry-run mode: no changes will be made.\n"));
|
|
24
|
+
console.log(`Legacy JSON files that would be migrated from: ${chalk.bold(nightWatchHome)}`);
|
|
25
|
+
console.log(` ${path.join(nightWatchHome, "projects.json")}`);
|
|
26
|
+
console.log(` ${path.join(nightWatchHome, "history.json")}`);
|
|
27
|
+
console.log(` ${path.join(nightWatchHome, "prd-states.json")}`);
|
|
28
|
+
console.log(` <project>/<prdDir>/.roadmap-state.json (per project)`);
|
|
29
|
+
console.log(chalk.dim("\nRun without --dry-run to apply the migration."));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
console.log(chalk.cyan("Migrating legacy JSON state to SQLite...\n"));
|
|
33
|
+
let result;
|
|
34
|
+
try {
|
|
35
|
+
result = migrateJsonToSqlite(nightWatchHome);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
39
|
+
console.error(chalk.red(`Migration failed: ${message}`));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
if (result.alreadyMigrated) {
|
|
43
|
+
console.log(chalk.yellow("Migration already completed previously. Nothing to do."));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
console.log(chalk.green("Migration complete.\n"));
|
|
47
|
+
console.log(chalk.bold("Summary:"));
|
|
48
|
+
console.log(` Projects migrated: ${chalk.cyan(String(result.projectsMigrated))}`);
|
|
49
|
+
console.log(` History records migrated: ${chalk.cyan(String(result.historyRecordsMigrated))}`);
|
|
50
|
+
console.log(` PRD states migrated: ${chalk.cyan(String(result.prdStatesMigrated))}`);
|
|
51
|
+
console.log(` Roadmap states migrated: ${chalk.cyan(String(result.roadmapStatesMigrated))}`);
|
|
52
|
+
console.log(`\n Backup directory: ${chalk.dim(result.backupDir)}`);
|
|
53
|
+
});
|
|
54
|
+
return state;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/commands/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status command for Night Watch CLI
|
|
3
|
+
* Shows current status including lock files, PRDs, PRs, and logs
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
export interface IStatusOptions {
|
|
7
|
+
verbose?: boolean;
|
|
8
|
+
json?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Status command implementation
|
|
12
|
+
*/
|
|
13
|
+
export declare function statusCommand(program: Command): void;
|
|
14
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAwDD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyIpD"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status command for Night Watch CLI
|
|
3
|
+
* Shows current status including lock files, PRDs, PRs, and logs
|
|
4
|
+
*/
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
import { loadConfig } from "../config.js";
|
|
7
|
+
import { fetchStatusSnapshot, } from "../utils/status-data.js";
|
|
8
|
+
import { createTable, dim, formatInstalledStatus, formatRunningStatus, header, } from "../utils/ui.js";
|
|
9
|
+
/**
|
|
10
|
+
* Format bytes to human-readable size
|
|
11
|
+
*/
|
|
12
|
+
function formatBytes(bytes) {
|
|
13
|
+
if (bytes === 0)
|
|
14
|
+
return "0 B";
|
|
15
|
+
const k = 1024;
|
|
16
|
+
const sizes = ["B", "KB", "MB", "GB"];
|
|
17
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
18
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Status command implementation
|
|
22
|
+
*/
|
|
23
|
+
export function statusCommand(program) {
|
|
24
|
+
program
|
|
25
|
+
.command("status")
|
|
26
|
+
.description("Show current night-watch status")
|
|
27
|
+
.option("-v, --verbose", "Show detailed status information")
|
|
28
|
+
.option("--json", "Output status as JSON")
|
|
29
|
+
.action(async (options) => {
|
|
30
|
+
try {
|
|
31
|
+
const projectDir = process.cwd();
|
|
32
|
+
const config = loadConfig(projectDir);
|
|
33
|
+
const snapshot = fetchStatusSnapshot(projectDir, config);
|
|
34
|
+
// Derive legacy status shape from snapshot for backward-compatible JSON output
|
|
35
|
+
const executorProc = snapshot.processes.find((p) => p.name === "executor");
|
|
36
|
+
const reviewerProc = snapshot.processes.find((p) => p.name === "reviewer");
|
|
37
|
+
const executorLog = snapshot.logs.find((l) => l.name === "executor");
|
|
38
|
+
const reviewerLog = snapshot.logs.find((l) => l.name === "reviewer");
|
|
39
|
+
const pendingPrds = snapshot.prds.filter((p) => p.status === "ready" || p.status === "blocked").length;
|
|
40
|
+
const claimedPrds = snapshot.prds.filter((p) => p.status === "in-progress").length;
|
|
41
|
+
const donePrds = snapshot.prds.filter((p) => p.status === "done").length;
|
|
42
|
+
const status = {
|
|
43
|
+
projectName: snapshot.projectName,
|
|
44
|
+
projectDir: snapshot.projectDir,
|
|
45
|
+
provider: config.provider,
|
|
46
|
+
reviewerEnabled: config.reviewerEnabled,
|
|
47
|
+
autoMerge: config.autoMerge,
|
|
48
|
+
autoMergeMethod: config.autoMergeMethod,
|
|
49
|
+
executor: { running: executorProc?.running ?? false, pid: executorProc?.pid ?? null },
|
|
50
|
+
reviewer: { running: reviewerProc?.running ?? false, pid: reviewerProc?.pid ?? null },
|
|
51
|
+
prds: { pending: pendingPrds, claimed: claimedPrds, done: donePrds },
|
|
52
|
+
prs: { open: snapshot.prs.length },
|
|
53
|
+
crontab: snapshot.crontab,
|
|
54
|
+
logs: {
|
|
55
|
+
executor: executorLog ? { path: executorLog.path, lastLines: executorLog.lastLines, exists: executorLog.exists, size: executorLog.size } : undefined,
|
|
56
|
+
reviewer: reviewerLog ? { path: reviewerLog.path, lastLines: reviewerLog.lastLines, exists: reviewerLog.exists, size: reviewerLog.size } : undefined,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
// Output as JSON if requested
|
|
60
|
+
if (options.json) {
|
|
61
|
+
console.log(JSON.stringify(status, null, 2));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Print formatted status dashboard
|
|
65
|
+
console.log();
|
|
66
|
+
console.log(chalk.bold.cyan(`Night Watch Status: ${status.projectName}`));
|
|
67
|
+
console.log(chalk.dim("─".repeat(40)));
|
|
68
|
+
console.log();
|
|
69
|
+
dim(`Project Directory: ${status.projectDir}`);
|
|
70
|
+
// Configuration section with table
|
|
71
|
+
header("Configuration");
|
|
72
|
+
const configTable = createTable({ head: ["Setting", "Value"] });
|
|
73
|
+
configTable.push(["Provider", status.provider]);
|
|
74
|
+
configTable.push(["Reviewer", status.reviewerEnabled ? "Enabled" : "Disabled"]);
|
|
75
|
+
configTable.push(["Auto-merge", status.autoMerge ? `Enabled (${status.autoMergeMethod})` : "Disabled"]);
|
|
76
|
+
console.log(configTable.toString());
|
|
77
|
+
// Process status section with colored indicators
|
|
78
|
+
header("Process Status");
|
|
79
|
+
const processTable = createTable({ head: ["Process", "Status"] });
|
|
80
|
+
processTable.push(["Executor", formatRunningStatus(status.executor.running, status.executor.pid)]);
|
|
81
|
+
processTable.push(["Reviewer", formatRunningStatus(status.reviewer.running, status.reviewer.pid)]);
|
|
82
|
+
console.log(processTable.toString());
|
|
83
|
+
// PRD status section with table
|
|
84
|
+
header("PRD Status");
|
|
85
|
+
const prdTable = createTable({ head: ["Status", "Count"] });
|
|
86
|
+
prdTable.push(["Pending", String(status.prds.pending)]);
|
|
87
|
+
prdTable.push(["Claimed", String(status.prds.claimed)]);
|
|
88
|
+
prdTable.push(["Completed", String(status.prds.done)]);
|
|
89
|
+
console.log(prdTable.toString());
|
|
90
|
+
// PR status section with table
|
|
91
|
+
header("PR Status");
|
|
92
|
+
const prTable = createTable({ head: ["Type", "Count"] });
|
|
93
|
+
prTable.push(["Open PRs (night-watch/feat branches)", String(status.prs.open)]);
|
|
94
|
+
console.log(prTable.toString());
|
|
95
|
+
// Crontab status section with colored output
|
|
96
|
+
header("Crontab Status");
|
|
97
|
+
console.log(` ${formatInstalledStatus(status.crontab.installed)}`);
|
|
98
|
+
if (status.crontab.installed && options.verbose) {
|
|
99
|
+
console.log();
|
|
100
|
+
dim(" Entries:");
|
|
101
|
+
status.crontab.entries.forEach((entry) => dim(` ${entry}`));
|
|
102
|
+
}
|
|
103
|
+
console.log();
|
|
104
|
+
// Log status section with table
|
|
105
|
+
header("Log Files");
|
|
106
|
+
const logTable = createTable({ head: ["Log", "Size", "Status"] });
|
|
107
|
+
if (status.logs.executor) {
|
|
108
|
+
logTable.push([
|
|
109
|
+
"Executor",
|
|
110
|
+
status.logs.executor.exists ? formatBytes(status.logs.executor.size) : "-",
|
|
111
|
+
status.logs.executor.exists ? "Exists" : "Not found",
|
|
112
|
+
]);
|
|
113
|
+
}
|
|
114
|
+
if (status.logs.reviewer) {
|
|
115
|
+
logTable.push([
|
|
116
|
+
"Reviewer",
|
|
117
|
+
status.logs.reviewer.exists ? formatBytes(status.logs.reviewer.size) : "-",
|
|
118
|
+
status.logs.reviewer.exists ? "Exists" : "Not found",
|
|
119
|
+
]);
|
|
120
|
+
}
|
|
121
|
+
console.log(logTable.toString());
|
|
122
|
+
// Show last lines in verbose mode
|
|
123
|
+
if (options.verbose) {
|
|
124
|
+
if (status.logs.executor?.exists && status.logs.executor.lastLines.length > 0) {
|
|
125
|
+
dim(" Executor last 5 lines:");
|
|
126
|
+
status.logs.executor.lastLines.forEach((line) => dim(` ${line}`));
|
|
127
|
+
}
|
|
128
|
+
if (status.logs.reviewer?.exists && status.logs.reviewer.lastLines.length > 0) {
|
|
129
|
+
dim(" Reviewer last 5 lines:");
|
|
130
|
+
status.logs.reviewer.lastLines.forEach((line) => dim(` ${line}`));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Tips section with dim styling
|
|
134
|
+
header("Commands");
|
|
135
|
+
dim(" night-watch install - Install crontab entries");
|
|
136
|
+
dim(" night-watch logs - View logs");
|
|
137
|
+
dim(" night-watch run - Run executor now");
|
|
138
|
+
dim(" night-watch review - Run reviewer now");
|
|
139
|
+
console.log();
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
console.error(`Error getting status: ${error instanceof Error ? error.message : String(error)}`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uninstall command for Night Watch CLI
|
|
3
|
+
* Removes crontab entries for the current project
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
export interface IUninstallOptions {
|
|
7
|
+
keepLogs?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface IUninstallResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
removedCount: number;
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Core uninstall logic, reusable from dashboard.
|
|
16
|
+
* Returns result without printing to console.
|
|
17
|
+
*/
|
|
18
|
+
export declare function performUninstall(projectDir: string, options?: {
|
|
19
|
+
keepLogs?: boolean;
|
|
20
|
+
}): IUninstallResult;
|
|
21
|
+
/**
|
|
22
|
+
* Uninstall crontab entries for night-watch
|
|
23
|
+
*/
|
|
24
|
+
export declare function uninstallCommand(program: Command): void;
|
|
25
|
+
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAuBD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B,gBAAgB,CA4ClB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0EvD"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uninstall command for Night Watch CLI
|
|
3
|
+
* Removes crontab entries for the current project
|
|
4
|
+
*/
|
|
5
|
+
import * as path from "path";
|
|
6
|
+
import * as fs from "fs";
|
|
7
|
+
import { generateMarker, getEntries, getProjectEntries, removeEntriesForProject, } from "../utils/crontab.js";
|
|
8
|
+
import { dim, success, error as uiError, warn, } from "../utils/ui.js";
|
|
9
|
+
/**
|
|
10
|
+
* Get the project name from directory or package.json
|
|
11
|
+
*/
|
|
12
|
+
function getProjectName(projectDir) {
|
|
13
|
+
// Try to get name from package.json
|
|
14
|
+
const packageJsonPath = path.join(projectDir, "package.json");
|
|
15
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
16
|
+
try {
|
|
17
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
18
|
+
if (packageJson.name) {
|
|
19
|
+
return packageJson.name;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Ignore parse errors
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Fall back to directory name
|
|
27
|
+
return path.basename(projectDir);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Core uninstall logic, reusable from dashboard.
|
|
31
|
+
* Returns result without printing to console.
|
|
32
|
+
*/
|
|
33
|
+
export function performUninstall(projectDir, options) {
|
|
34
|
+
try {
|
|
35
|
+
const projectName = getProjectName(projectDir);
|
|
36
|
+
const marker = generateMarker(projectName);
|
|
37
|
+
const existingEntries = Array.from(new Set([...getEntries(marker), ...getProjectEntries(projectDir)]));
|
|
38
|
+
if (existingEntries.length === 0) {
|
|
39
|
+
return { success: true, removedCount: 0 };
|
|
40
|
+
}
|
|
41
|
+
const removedCount = removeEntriesForProject(projectDir, marker);
|
|
42
|
+
if (!options?.keepLogs) {
|
|
43
|
+
const logDir = path.join(projectDir, "logs");
|
|
44
|
+
if (fs.existsSync(logDir)) {
|
|
45
|
+
const logFiles = ["executor.log", "reviewer.log", "slicer.log"];
|
|
46
|
+
logFiles.forEach((logFile) => {
|
|
47
|
+
const logPath = path.join(logDir, logFile);
|
|
48
|
+
if (fs.existsSync(logPath)) {
|
|
49
|
+
fs.unlinkSync(logPath);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
try {
|
|
53
|
+
const remainingFiles = fs.readdirSync(logDir);
|
|
54
|
+
if (remainingFiles.length === 0) {
|
|
55
|
+
fs.rmdirSync(logDir);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Ignore errors removing directory
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { success: true, removedCount };
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
return {
|
|
67
|
+
success: false,
|
|
68
|
+
removedCount: 0,
|
|
69
|
+
error: err instanceof Error ? err.message : String(err),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Uninstall crontab entries for night-watch
|
|
75
|
+
*/
|
|
76
|
+
export function uninstallCommand(program) {
|
|
77
|
+
program
|
|
78
|
+
.command("uninstall")
|
|
79
|
+
.description("Remove crontab entries")
|
|
80
|
+
.option("--keep-logs", "Preserve log files")
|
|
81
|
+
.action(async (options) => {
|
|
82
|
+
try {
|
|
83
|
+
// Get project directory
|
|
84
|
+
const projectDir = process.cwd();
|
|
85
|
+
// Get project name
|
|
86
|
+
const projectName = getProjectName(projectDir);
|
|
87
|
+
const marker = generateMarker(projectName);
|
|
88
|
+
// Check if there are entries to remove
|
|
89
|
+
const existingEntries = Array.from(new Set([...getEntries(marker), ...getProjectEntries(projectDir)]));
|
|
90
|
+
if (existingEntries.length === 0) {
|
|
91
|
+
warn(`No Night Watch crontab entries found for ${projectName}.`);
|
|
92
|
+
dim("Nothing to uninstall.");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Show entries that will be removed
|
|
96
|
+
dim(`Removing Night Watch crontab entries for ${projectName}:`);
|
|
97
|
+
existingEntries.forEach((entry) => dim(` ${entry}`));
|
|
98
|
+
// Remove entries
|
|
99
|
+
const removedCount = removeEntriesForProject(projectDir, marker);
|
|
100
|
+
// Handle log files
|
|
101
|
+
if (!options.keepLogs) {
|
|
102
|
+
const logDir = path.join(projectDir, "logs");
|
|
103
|
+
if (fs.existsSync(logDir)) {
|
|
104
|
+
const logFiles = ["executor.log", "reviewer.log", "slicer.log"];
|
|
105
|
+
let logsRemoved = 0;
|
|
106
|
+
logFiles.forEach((logFile) => {
|
|
107
|
+
const logPath = path.join(logDir, logFile);
|
|
108
|
+
if (fs.existsSync(logPath)) {
|
|
109
|
+
fs.unlinkSync(logPath);
|
|
110
|
+
logsRemoved++;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
// Try to remove log directory if empty
|
|
114
|
+
try {
|
|
115
|
+
const remainingFiles = fs.readdirSync(logDir);
|
|
116
|
+
if (remainingFiles.length === 0) {
|
|
117
|
+
fs.rmdirSync(logDir);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Ignore errors removing directory
|
|
122
|
+
}
|
|
123
|
+
if (logsRemoved > 0) {
|
|
124
|
+
console.log();
|
|
125
|
+
dim(`Removed ${logsRemoved} log file(s).`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.log();
|
|
131
|
+
dim("Log files preserved.");
|
|
132
|
+
}
|
|
133
|
+
success(`Successfully removed ${removedCount} crontab entry/entries.`);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
uiError(`Error uninstalling Night Watch: ${err instanceof Error ? err.message : String(err)}`);
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
|