@jonit-dev/night-watch-cli 1.7.29 → 1.7.31
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/bin/night-watch.mjs +1 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/{src/cli.js → cli.js} +1 -0
- package/dist/cli.js.map +1 -0
- package/dist/{src/commands → commands}/audit.d.ts +2 -2
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +105 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/{src/commands → commands}/board.d.ts +1 -1
- package/dist/commands/board.d.ts.map +1 -0
- package/dist/commands/board.js +664 -0
- package/dist/commands/board.js.map +1 -0
- package/dist/{src/commands → commands}/cancel.d.ts +3 -3
- package/dist/commands/cancel.d.ts.map +1 -0
- package/dist/{src/commands → commands}/cancel.js +18 -20
- package/dist/commands/cancel.js.map +1 -0
- package/dist/commands/dashboard/tab-actions.d.ts.map +1 -0
- package/dist/commands/dashboard/tab-actions.js.map +1 -0
- package/dist/{src/commands → commands}/dashboard/tab-config.d.ts +3 -3
- package/dist/commands/dashboard/tab-config.d.ts.map +1 -0
- package/dist/{src/commands → commands}/dashboard/tab-config.js +250 -187
- package/dist/commands/dashboard/tab-config.js.map +1 -0
- package/dist/{src/commands → commands}/dashboard/tab-logs.d.ts +1 -1
- package/dist/commands/dashboard/tab-logs.d.ts.map +1 -0
- package/dist/{src/commands → commands}/dashboard/tab-logs.js +62 -38
- package/dist/commands/dashboard/tab-logs.js.map +1 -0
- package/dist/{src/commands → commands}/dashboard/tab-schedules.d.ts +1 -1
- package/dist/commands/dashboard/tab-schedules.d.ts.map +1 -0
- package/dist/{src/commands → commands}/dashboard/tab-schedules.js +85 -76
- package/dist/commands/dashboard/tab-schedules.js.map +1 -0
- package/dist/{src/commands → commands}/dashboard/tab-status.d.ts +7 -7
- package/dist/commands/dashboard/tab-status.d.ts.map +1 -0
- package/dist/{src/commands → commands}/dashboard/tab-status.js +98 -95
- package/dist/commands/dashboard/tab-status.js.map +1 -0
- package/dist/{src/commands → commands}/dashboard/types.d.ts +3 -4
- package/dist/commands/dashboard/types.d.ts.map +1 -0
- package/dist/commands/dashboard/types.js.map +1 -0
- package/dist/{src/commands → commands}/dashboard.d.ts +2 -2
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/{src/commands → commands}/dashboard.js +32 -33
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/{src/commands → commands}/doctor.d.ts +2 -2
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/{src/commands → commands}/doctor.js +40 -43
- package/dist/commands/doctor.js.map +1 -0
- package/dist/{src/commands → commands}/history.d.ts +1 -1
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/{src/commands → commands}/history.js +11 -18
- package/dist/commands/history.js.map +1 -0
- package/dist/{src/commands → commands}/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/{src/commands → commands}/init.js +62 -36
- package/dist/commands/init.js.map +1 -0
- package/dist/{src/commands → commands}/install.d.ts +2 -2
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/{src/commands → commands}/install.js +48 -50
- package/dist/commands/install.js.map +1 -0
- package/dist/{src/commands → commands}/logs.d.ts +1 -1
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/{src/commands → commands}/logs.js +29 -30
- package/dist/commands/logs.js.map +1 -0
- package/dist/{src/commands → commands}/prd-state.d.ts +1 -1
- package/dist/commands/prd-state.d.ts.map +1 -0
- package/dist/{src/commands → commands}/prd-state.js +14 -14
- package/dist/commands/prd-state.js.map +1 -0
- package/dist/{src/commands → commands}/prd.d.ts +1 -1
- package/dist/commands/prd.d.ts.map +1 -0
- package/dist/{src/commands → commands}/prd.js +57 -66
- package/dist/commands/prd.js.map +1 -0
- package/dist/{src/commands → commands}/prds.d.ts +1 -1
- package/dist/commands/prds.d.ts.map +1 -0
- package/dist/{src/commands → commands}/prds.js +51 -53
- package/dist/commands/prds.js.map +1 -0
- package/dist/{src/commands → commands}/prs.d.ts +1 -1
- package/dist/commands/prs.d.ts.map +1 -0
- package/dist/{src/commands → commands}/prs.js +22 -24
- package/dist/commands/prs.js.map +1 -0
- package/dist/{src/commands → commands}/qa.d.ts +2 -2
- package/dist/commands/qa.d.ts.map +1 -0
- package/dist/{src/commands → commands}/qa.js +50 -51
- package/dist/commands/qa.js.map +1 -0
- package/dist/{src/commands → commands}/retry.d.ts +1 -1
- package/dist/commands/retry.d.ts.map +1 -0
- package/dist/{src/commands → commands}/retry.js +9 -10
- package/dist/commands/retry.js.map +1 -0
- package/dist/{src/commands → commands}/review.d.ts +2 -2
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/{src/commands → commands}/review.js +68 -59
- package/dist/commands/review.js.map +1 -0
- package/dist/{src/commands → commands}/run.d.ts +2 -2
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/{src/commands → commands}/run.js +87 -83
- package/dist/commands/run.js.map +1 -0
- package/dist/{src/commands → commands}/serve.d.ts +2 -2
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/{src/commands → commands}/serve.js +18 -18
- package/dist/commands/serve.js.map +1 -0
- package/dist/{src/commands → commands}/slice.d.ts +2 -2
- package/dist/commands/slice.d.ts.map +1 -0
- package/dist/{src/commands → commands}/slice.js +50 -46
- package/dist/commands/slice.js.map +1 -0
- package/dist/{src/commands → commands}/state.d.ts +1 -1
- package/dist/commands/state.d.ts.map +1 -0
- package/dist/{src/commands → commands}/state.js +20 -22
- package/dist/commands/state.js.map +1 -0
- package/dist/{src/commands → commands}/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/{src/commands → commands}/status.js +75 -54
- package/dist/commands/status.js.map +1 -0
- package/dist/{src/commands → commands}/uninstall.d.ts +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/{src/commands → commands}/uninstall.js +12 -14
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/{src/commands → commands}/update.d.ts +1 -1
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/{src/commands → commands}/update.js +23 -23
- package/dist/commands/update.js.map +1 -0
- package/package.json +18 -42
- package/LICENSE +0 -21
- package/README.md +0 -132
- package/dist/shared/types.d.ts +0 -226
- package/dist/shared/types.d.ts.map +0 -1
- package/dist/shared/types.js +0 -7
- package/dist/shared/types.js.map +0 -1
- package/dist/src/agents/soul-compiler.d.ts +0 -11
- package/dist/src/agents/soul-compiler.d.ts.map +0 -1
- package/dist/src/agents/soul-compiler.js +0 -157
- package/dist/src/agents/soul-compiler.js.map +0 -1
- package/dist/src/board/factory.d.ts +0 -3
- package/dist/src/board/factory.d.ts.map +0 -1
- package/dist/src/board/factory.js +0 -10
- package/dist/src/board/factory.js.map +0 -1
- package/dist/src/board/providers/github-graphql.d.ts +0 -16
- package/dist/src/board/providers/github-graphql.d.ts.map +0 -1
- package/dist/src/board/providers/github-graphql.js +0 -43
- package/dist/src/board/providers/github-graphql.js.map +0 -1
- package/dist/src/board/providers/github-projects.d.ts +0 -51
- package/dist/src/board/providers/github-projects.d.ts.map +0 -1
- package/dist/src/board/providers/github-projects.js +0 -672
- package/dist/src/board/providers/github-projects.js.map +0 -1
- package/dist/src/board/types.d.ts +0 -60
- package/dist/src/board/types.d.ts.map +0 -1
- package/dist/src/board/types.js +0 -4
- package/dist/src/board/types.js.map +0 -1
- package/dist/src/cli.d.ts +0 -3
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/cli.js.map +0 -1
- package/dist/src/commands/audit.d.ts.map +0 -1
- package/dist/src/commands/audit.js +0 -98
- package/dist/src/commands/audit.js.map +0 -1
- package/dist/src/commands/board.d.ts.map +0 -1
- package/dist/src/commands/board.js +0 -294
- package/dist/src/commands/board.js.map +0 -1
- package/dist/src/commands/cancel.d.ts.map +0 -1
- package/dist/src/commands/cancel.js.map +0 -1
- package/dist/src/commands/dashboard/tab-actions.d.ts.map +0 -1
- package/dist/src/commands/dashboard/tab-actions.js.map +0 -1
- package/dist/src/commands/dashboard/tab-config.d.ts.map +0 -1
- package/dist/src/commands/dashboard/tab-config.js.map +0 -1
- package/dist/src/commands/dashboard/tab-logs.d.ts.map +0 -1
- package/dist/src/commands/dashboard/tab-logs.js.map +0 -1
- package/dist/src/commands/dashboard/tab-schedules.d.ts.map +0 -1
- package/dist/src/commands/dashboard/tab-schedules.js.map +0 -1
- package/dist/src/commands/dashboard/tab-status.d.ts.map +0 -1
- package/dist/src/commands/dashboard/tab-status.js.map +0 -1
- package/dist/src/commands/dashboard/types.d.ts.map +0 -1
- package/dist/src/commands/dashboard/types.js.map +0 -1
- package/dist/src/commands/dashboard.d.ts.map +0 -1
- package/dist/src/commands/dashboard.js.map +0 -1
- package/dist/src/commands/doctor.d.ts.map +0 -1
- package/dist/src/commands/doctor.js.map +0 -1
- package/dist/src/commands/history.d.ts.map +0 -1
- package/dist/src/commands/history.js.map +0 -1
- package/dist/src/commands/init.d.ts.map +0 -1
- package/dist/src/commands/init.js.map +0 -1
- package/dist/src/commands/install.d.ts.map +0 -1
- package/dist/src/commands/install.js.map +0 -1
- package/dist/src/commands/logs.d.ts.map +0 -1
- package/dist/src/commands/logs.js.map +0 -1
- package/dist/src/commands/prd-state.d.ts.map +0 -1
- package/dist/src/commands/prd-state.js.map +0 -1
- package/dist/src/commands/prd.d.ts.map +0 -1
- package/dist/src/commands/prd.js.map +0 -1
- package/dist/src/commands/prds.d.ts.map +0 -1
- package/dist/src/commands/prds.js.map +0 -1
- package/dist/src/commands/prs.d.ts.map +0 -1
- package/dist/src/commands/prs.js.map +0 -1
- package/dist/src/commands/qa.d.ts.map +0 -1
- package/dist/src/commands/qa.js.map +0 -1
- package/dist/src/commands/retry.d.ts.map +0 -1
- package/dist/src/commands/retry.js.map +0 -1
- package/dist/src/commands/review.d.ts.map +0 -1
- package/dist/src/commands/review.js.map +0 -1
- package/dist/src/commands/run.d.ts.map +0 -1
- package/dist/src/commands/run.js.map +0 -1
- package/dist/src/commands/serve.d.ts.map +0 -1
- package/dist/src/commands/serve.js.map +0 -1
- package/dist/src/commands/slice.d.ts.map +0 -1
- package/dist/src/commands/slice.js.map +0 -1
- package/dist/src/commands/state.d.ts.map +0 -1
- package/dist/src/commands/state.js.map +0 -1
- package/dist/src/commands/status.d.ts.map +0 -1
- package/dist/src/commands/status.js.map +0 -1
- package/dist/src/commands/uninstall.d.ts.map +0 -1
- package/dist/src/commands/uninstall.js.map +0 -1
- package/dist/src/commands/update.d.ts.map +0 -1
- package/dist/src/commands/update.js.map +0 -1
- package/dist/src/config.d.ts +0 -23
- package/dist/src/config.d.ts.map +0 -1
- package/dist/src/config.js +0 -671
- package/dist/src/config.js.map +0 -1
- package/dist/src/constants.d.ts +0 -67
- package/dist/src/constants.d.ts.map +0 -1
- package/dist/src/constants.js +0 -131
- package/dist/src/constants.js.map +0 -1
- package/dist/src/server/index.d.ts +0 -23
- package/dist/src/server/index.d.ts.map +0 -1
- package/dist/src/server/index.js +0 -1704
- package/dist/src/server/index.js.map +0 -1
- package/dist/src/slack/channel-manager.d.ts +0 -32
- package/dist/src/slack/channel-manager.d.ts.map +0 -1
- package/dist/src/slack/channel-manager.js +0 -128
- package/dist/src/slack/channel-manager.js.map +0 -1
- package/dist/src/slack/client.d.ts +0 -76
- package/dist/src/slack/client.d.ts.map +0 -1
- package/dist/src/slack/client.js +0 -193
- package/dist/src/slack/client.js.map +0 -1
- package/dist/src/slack/deliberation.d.ts +0 -87
- package/dist/src/slack/deliberation.d.ts.map +0 -1
- package/dist/src/slack/deliberation.js +0 -1354
- package/dist/src/slack/deliberation.js.map +0 -1
- package/dist/src/slack/index.d.ts +0 -6
- package/dist/src/slack/index.d.ts.map +0 -1
- package/dist/src/slack/index.js +0 -5
- package/dist/src/slack/index.js.map +0 -1
- package/dist/src/slack/interaction-listener.d.ts +0 -130
- package/dist/src/slack/interaction-listener.d.ts.map +0 -1
- package/dist/src/slack/interaction-listener.js +0 -1329
- package/dist/src/slack/interaction-listener.js.map +0 -1
- package/dist/src/storage/json-state-migrator.d.ts +0 -24
- package/dist/src/storage/json-state-migrator.d.ts.map +0 -1
- package/dist/src/storage/json-state-migrator.js +0 -197
- package/dist/src/storage/json-state-migrator.js.map +0 -1
- package/dist/src/storage/repositories/index.d.ts +0 -25
- package/dist/src/storage/repositories/index.d.ts.map +0 -1
- package/dist/src/storage/repositories/index.js +0 -45
- package/dist/src/storage/repositories/index.js.map +0 -1
- package/dist/src/storage/repositories/interfaces.d.ts +0 -60
- package/dist/src/storage/repositories/interfaces.d.ts.map +0 -1
- package/dist/src/storage/repositories/interfaces.js +0 -6
- package/dist/src/storage/repositories/interfaces.js.map +0 -1
- package/dist/src/storage/repositories/sqlite/agent-persona-repository.d.ts +0 -33
- package/dist/src/storage/repositories/sqlite/agent-persona-repository.d.ts.map +0 -1
- package/dist/src/storage/repositories/sqlite/agent-persona-repository.js +0 -715
- package/dist/src/storage/repositories/sqlite/agent-persona-repository.js.map +0 -1
- package/dist/src/storage/repositories/sqlite/execution-history-repository.d.ts +0 -21
- package/dist/src/storage/repositories/sqlite/execution-history-repository.d.ts.map +0 -1
- package/dist/src/storage/repositories/sqlite/execution-history-repository.js +0 -94
- package/dist/src/storage/repositories/sqlite/execution-history-repository.js.map +0 -1
- package/dist/src/storage/repositories/sqlite/prd-state-repository.d.ts +0 -17
- package/dist/src/storage/repositories/sqlite/prd-state-repository.d.ts.map +0 -1
- package/dist/src/storage/repositories/sqlite/prd-state-repository.js +0 -74
- package/dist/src/storage/repositories/sqlite/prd-state-repository.js.map +0 -1
- package/dist/src/storage/repositories/sqlite/project-registry-repository.d.ts +0 -17
- package/dist/src/storage/repositories/sqlite/project-registry-repository.d.ts.map +0 -1
- package/dist/src/storage/repositories/sqlite/project-registry-repository.js +0 -43
- package/dist/src/storage/repositories/sqlite/project-registry-repository.js.map +0 -1
- package/dist/src/storage/repositories/sqlite/roadmap-state-repository.d.ts +0 -14
- package/dist/src/storage/repositories/sqlite/roadmap-state-repository.d.ts.map +0 -1
- package/dist/src/storage/repositories/sqlite/roadmap-state-repository.js +0 -47
- package/dist/src/storage/repositories/sqlite/roadmap-state-repository.js.map +0 -1
- package/dist/src/storage/repositories/sqlite/slack-discussion-repository.d.ts +0 -20
- package/dist/src/storage/repositories/sqlite/slack-discussion-repository.d.ts.map +0 -1
- package/dist/src/storage/repositories/sqlite/slack-discussion-repository.js +0 -88
- package/dist/src/storage/repositories/sqlite/slack-discussion-repository.js.map +0 -1
- package/dist/src/storage/sqlite/client.d.ts +0 -23
- package/dist/src/storage/sqlite/client.d.ts.map +0 -1
- package/dist/src/storage/sqlite/client.js +0 -47
- package/dist/src/storage/sqlite/client.js.map +0 -1
- package/dist/src/storage/sqlite/migrations.d.ts +0 -11
- package/dist/src/storage/sqlite/migrations.d.ts.map +0 -1
- package/dist/src/storage/sqlite/migrations.js +0 -94
- package/dist/src/storage/sqlite/migrations.js.map +0 -1
- package/dist/src/templates/prd-template.d.ts +0 -11
- package/dist/src/templates/prd-template.d.ts.map +0 -1
- package/dist/src/templates/prd-template.js +0 -166
- package/dist/src/templates/prd-template.js.map +0 -1
- package/dist/src/templates/slicer-prompt.d.ts +0 -54
- package/dist/src/templates/slicer-prompt.d.ts.map +0 -1
- package/dist/src/templates/slicer-prompt.js +0 -163
- package/dist/src/templates/slicer-prompt.js.map +0 -1
- package/dist/src/types.d.ts +0 -140
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -5
- package/dist/src/types.js.map +0 -1
- package/dist/src/utils/avatar-generator.d.ts +0 -6
- package/dist/src/utils/avatar-generator.d.ts.map +0 -1
- package/dist/src/utils/avatar-generator.js +0 -133
- package/dist/src/utils/avatar-generator.js.map +0 -1
- package/dist/src/utils/checks.d.ts +0 -55
- package/dist/src/utils/checks.d.ts.map +0 -1
- package/dist/src/utils/checks.js +0 -246
- package/dist/src/utils/checks.js.map +0 -1
- package/dist/src/utils/config-writer.d.ts +0 -16
- package/dist/src/utils/config-writer.d.ts.map +0 -1
- package/dist/src/utils/config-writer.js +0 -45
- package/dist/src/utils/config-writer.js.map +0 -1
- package/dist/src/utils/crontab.d.ts +0 -62
- package/dist/src/utils/crontab.d.ts.map +0 -1
- package/dist/src/utils/crontab.js +0 -168
- package/dist/src/utils/crontab.js.map +0 -1
- package/dist/src/utils/execution-history.d.ts +0 -54
- package/dist/src/utils/execution-history.d.ts.map +0 -1
- package/dist/src/utils/execution-history.js +0 -80
- package/dist/src/utils/execution-history.js.map +0 -1
- package/dist/src/utils/github.d.ts +0 -40
- package/dist/src/utils/github.d.ts.map +0 -1
- package/dist/src/utils/github.js +0 -126
- package/dist/src/utils/github.js.map +0 -1
- package/dist/src/utils/notify.d.ts +0 -64
- package/dist/src/utils/notify.d.ts.map +0 -1
- package/dist/src/utils/notify.js +0 -405
- package/dist/src/utils/notify.js.map +0 -1
- package/dist/src/utils/prd-states.d.ts +0 -16
- package/dist/src/utils/prd-states.d.ts.map +0 -1
- package/dist/src/utils/prd-states.js +0 -28
- package/dist/src/utils/prd-states.js.map +0 -1
- package/dist/src/utils/registry.d.ts +0 -45
- package/dist/src/utils/registry.d.ts.map +0 -1
- package/dist/src/utils/registry.js +0 -86
- package/dist/src/utils/registry.js.map +0 -1
- package/dist/src/utils/roadmap-parser.d.ts +0 -45
- package/dist/src/utils/roadmap-parser.d.ts.map +0 -1
- package/dist/src/utils/roadmap-parser.js +0 -136
- package/dist/src/utils/roadmap-parser.js.map +0 -1
- package/dist/src/utils/roadmap-scanner.d.ts +0 -92
- package/dist/src/utils/roadmap-scanner.d.ts.map +0 -1
- package/dist/src/utils/roadmap-scanner.js +0 -349
- package/dist/src/utils/roadmap-scanner.js.map +0 -1
- package/dist/src/utils/roadmap-state.d.ts +0 -90
- package/dist/src/utils/roadmap-state.d.ts.map +0 -1
- package/dist/src/utils/roadmap-state.js +0 -154
- package/dist/src/utils/roadmap-state.js.map +0 -1
- package/dist/src/utils/script-result.d.ts +0 -12
- package/dist/src/utils/script-result.d.ts.map +0 -1
- package/dist/src/utils/script-result.js +0 -46
- package/dist/src/utils/script-result.js.map +0 -1
- package/dist/src/utils/shell.d.ts +0 -27
- package/dist/src/utils/shell.d.ts.map +0 -1
- package/dist/src/utils/shell.js +0 -64
- package/dist/src/utils/shell.js.map +0 -1
- package/dist/src/utils/status-data.d.ts +0 -148
- package/dist/src/utils/status-data.d.ts.map +0 -1
- package/dist/src/utils/status-data.js +0 -548
- package/dist/src/utils/status-data.js.map +0 -1
- package/dist/src/utils/ui.d.ts +0 -55
- package/dist/src/utils/ui.d.ts.map +0 -1
- package/dist/src/utils/ui.js +0 -121
- package/dist/src/utils/ui.js.map +0 -1
- package/scripts/night-watch-audit-cron.sh +0 -149
- package/scripts/night-watch-cron.sh +0 -484
- package/scripts/night-watch-helpers.sh +0 -499
- package/scripts/night-watch-pr-reviewer-cron.sh +0 -528
- package/scripts/night-watch-qa-cron.sh +0 -281
- package/scripts/night-watch-slicer-cron.sh +0 -90
- package/scripts/test-helpers.bats +0 -77
- package/templates/night-watch-pr-reviewer.md +0 -174
- package/templates/night-watch-qa.md +0 -157
- package/templates/night-watch-slicer.md +0 -219
- package/templates/night-watch.config.json +0 -30
- package/templates/night-watch.md +0 -94
- package/templates/prd-executor.md +0 -235
- package/templates/prd.md +0 -26
- package/web/dist/assets/index-BiJf9LFT.js +0 -458
- package/web/dist/assets/index-OpSgvsYu.css +0 -1
- package/web/dist/avatars/carlos.webp +0 -0
- package/web/dist/avatars/dev.webp +0 -0
- package/web/dist/avatars/maya.webp +0 -0
- package/web/dist/avatars/priya.webp +0 -0
- package/web/dist/index.html +0 -82
- /package/dist/{src/commands → commands}/dashboard/tab-actions.d.ts +0 -0
- /package/dist/{src/commands → commands}/dashboard/tab-actions.js +0 -0
- /package/dist/{src/commands → commands}/dashboard/types.js +0 -0
|
@@ -1,29 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Run command - executes the PRD cron script
|
|
3
3
|
*/
|
|
4
|
-
import { getScriptPath, loadConfig } from
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import { fetchPrDetails, fetchPrDetailsForBranch } from "../utils/github.js";
|
|
9
|
-
import { CLAIM_FILE_EXTENSION, CLAUDE_MODEL_IDS, PROVIDER_COMMANDS } from "../constants.js";
|
|
10
|
-
import * as fs from "fs";
|
|
11
|
-
import * as path from "path";
|
|
12
|
-
import { parseScriptResult } from "../utils/script-result.js";
|
|
13
|
-
import { createSpinner, createTable, dim, header, info, error as uiError, } from "../utils/ui.js";
|
|
4
|
+
import { CLAIM_FILE_EXTENSION, CLAUDE_MODEL_IDS, PROVIDER_COMMANDS, createBoardProvider, createSpinner, createTable, dim, executeScriptWithOutput, fetchPrDetails, fetchPrDetailsForBranch, getScriptPath, header, info, loadConfig, parseScriptResult, sendNotifications, error as uiError, } from '@night-watch/core';
|
|
5
|
+
import { sendSlackBotNotification } from '@night-watch/slack/notify.js';
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
14
8
|
/**
|
|
15
9
|
* Map executor exit/result state to a notification event.
|
|
16
10
|
* Returns null when the run completed with no actionable work (skip/no-op).
|
|
17
11
|
*/
|
|
18
12
|
export function resolveRunNotificationEvent(exitCode, scriptStatus) {
|
|
19
13
|
if (exitCode === 124) {
|
|
20
|
-
return
|
|
14
|
+
return 'run_timeout';
|
|
21
15
|
}
|
|
22
16
|
if (exitCode !== 0) {
|
|
23
|
-
return
|
|
17
|
+
return 'run_failed';
|
|
24
18
|
}
|
|
25
|
-
if (!scriptStatus || scriptStatus ===
|
|
26
|
-
return
|
|
19
|
+
if (!scriptStatus || scriptStatus === 'success_open_pr') {
|
|
20
|
+
return 'run_succeeded';
|
|
27
21
|
}
|
|
28
22
|
return null;
|
|
29
23
|
}
|
|
@@ -32,19 +26,19 @@ export function resolveRunNotificationEvent(exitCode, scriptStatus) {
|
|
|
32
26
|
*/
|
|
33
27
|
export function getRateLimitFallbackTelegramWebhooks(config) {
|
|
34
28
|
return (config.notifications?.webhooks ?? [])
|
|
35
|
-
.filter((wh) => wh.type ===
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
29
|
+
.filter((wh) => wh.type === 'telegram' &&
|
|
30
|
+
typeof wh.botToken === 'string' &&
|
|
31
|
+
wh.botToken.trim().length > 0 &&
|
|
32
|
+
typeof wh.chatId === 'string' &&
|
|
33
|
+
wh.chatId.trim().length > 0 &&
|
|
34
|
+
wh.events.includes('rate_limit_fallback'))
|
|
41
35
|
.map((wh) => ({ botToken: wh.botToken, chatId: wh.chatId }));
|
|
42
36
|
}
|
|
43
37
|
/**
|
|
44
38
|
* Whether the bash execution reported a rate-limit fallback trigger.
|
|
45
39
|
*/
|
|
46
40
|
export function isRateLimitFallbackTriggered(resultData) {
|
|
47
|
-
return resultData?.rate_limit_fallback ===
|
|
41
|
+
return resultData?.rate_limit_fallback === '1';
|
|
48
42
|
}
|
|
49
43
|
/**
|
|
50
44
|
* Build environment variables map from config and CLI options
|
|
@@ -67,14 +61,14 @@ export function buildEnvVars(config, options) {
|
|
|
67
61
|
}
|
|
68
62
|
// PRD priority order
|
|
69
63
|
if (config.prdPriority && config.prdPriority.length > 0) {
|
|
70
|
-
env.NW_PRD_PRIORITY = config.prdPriority.join(
|
|
64
|
+
env.NW_PRD_PRIORITY = config.prdPriority.join(':');
|
|
71
65
|
}
|
|
72
66
|
// Dry run flag
|
|
73
67
|
if (options.dryRun) {
|
|
74
|
-
env.NW_DRY_RUN =
|
|
68
|
+
env.NW_DRY_RUN = '1';
|
|
75
69
|
}
|
|
76
70
|
// Sandbox flag — prevents the agent from modifying crontab during execution
|
|
77
|
-
env.NW_EXECUTION_CONTEXT =
|
|
71
|
+
env.NW_EXECUTION_CONTEXT = 'agent';
|
|
78
72
|
// Max retries for rate-limited API calls (minimum 1 attempt)
|
|
79
73
|
const maxRetries = Number.isFinite(config.maxRetries)
|
|
80
74
|
? Math.max(1, Math.floor(config.maxRetries))
|
|
@@ -88,14 +82,14 @@ export function buildEnvVars(config, options) {
|
|
|
88
82
|
// If projectNumber is missing, `night-watch board next-issue` auto-bootstraps
|
|
89
83
|
// a board and persists it before continuing.
|
|
90
84
|
if (config.boardProvider?.enabled !== false) {
|
|
91
|
-
env.NW_BOARD_ENABLED =
|
|
85
|
+
env.NW_BOARD_ENABLED = 'true';
|
|
92
86
|
}
|
|
93
87
|
// Rate-limit fallback: fall back to native Claude when proxy quota is exhausted
|
|
94
88
|
if (config.fallbackOnRateLimit) {
|
|
95
|
-
env.NW_FALLBACK_ON_RATE_LIMIT =
|
|
89
|
+
env.NW_FALLBACK_ON_RATE_LIMIT = 'true';
|
|
96
90
|
}
|
|
97
91
|
// Claude model used for native / fallback execution
|
|
98
|
-
env.NW_CLAUDE_MODEL_ID = CLAUDE_MODEL_IDS[config.claudeModel ??
|
|
92
|
+
env.NW_CLAUDE_MODEL_ID = CLAUDE_MODEL_IDS[config.claudeModel ?? 'sonnet'];
|
|
99
93
|
// Telegram credentials for in-script fallback warnings.
|
|
100
94
|
// Export only webhooks that explicitly subscribed to rate_limit_fallback.
|
|
101
95
|
const fallbackTelegramWebhooks = getRateLimitFallbackTelegramWebhooks(config);
|
|
@@ -128,20 +122,20 @@ export function applyCliOverrides(config, options) {
|
|
|
128
122
|
*/
|
|
129
123
|
export function scanPrdDirectory(projectDir, prdDir, maxRuntime) {
|
|
130
124
|
const absolutePrdDir = path.join(projectDir, prdDir);
|
|
131
|
-
const doneDir = path.join(absolutePrdDir,
|
|
125
|
+
const doneDir = path.join(absolutePrdDir, 'done');
|
|
132
126
|
const pending = [];
|
|
133
127
|
const completed = [];
|
|
134
128
|
// Scan main PRD directory for pending PRDs
|
|
135
129
|
if (fs.existsSync(absolutePrdDir)) {
|
|
136
130
|
const entries = fs.readdirSync(absolutePrdDir, { withFileTypes: true });
|
|
137
131
|
for (const entry of entries) {
|
|
138
|
-
if (entry.isFile() && entry.name.endsWith(
|
|
132
|
+
if (entry.isFile() && entry.name.endsWith('.md') && entry.name !== 'NIGHT-WATCH-SUMMARY.md') {
|
|
139
133
|
const claimPath = path.join(absolutePrdDir, entry.name + CLAIM_FILE_EXTENSION);
|
|
140
134
|
let claimed = false;
|
|
141
135
|
let claimInfo = null;
|
|
142
136
|
if (fs.existsSync(claimPath)) {
|
|
143
137
|
try {
|
|
144
|
-
const content = fs.readFileSync(claimPath,
|
|
138
|
+
const content = fs.readFileSync(claimPath, 'utf-8');
|
|
145
139
|
const data = JSON.parse(content);
|
|
146
140
|
const age = Math.floor(Date.now() / 1000) - data.timestamp;
|
|
147
141
|
if (age < maxRuntime) {
|
|
@@ -161,7 +155,7 @@ export function scanPrdDirectory(projectDir, prdDir, maxRuntime) {
|
|
|
161
155
|
if (fs.existsSync(doneDir)) {
|
|
162
156
|
const entries = fs.readdirSync(doneDir, { withFileTypes: true });
|
|
163
157
|
for (const entry of entries) {
|
|
164
|
-
if (entry.isFile() && entry.name.endsWith(
|
|
158
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
165
159
|
completed.push(entry.name);
|
|
166
160
|
}
|
|
167
161
|
}
|
|
@@ -173,11 +167,11 @@ export function scanPrdDirectory(projectDir, prdDir, maxRuntime) {
|
|
|
173
167
|
*/
|
|
174
168
|
export function runCommand(program) {
|
|
175
169
|
program
|
|
176
|
-
.command(
|
|
177
|
-
.description(
|
|
178
|
-
.option(
|
|
179
|
-
.option(
|
|
180
|
-
.option(
|
|
170
|
+
.command('run')
|
|
171
|
+
.description('Run PRD executor now')
|
|
172
|
+
.option('--dry-run', 'Show what would be executed without running')
|
|
173
|
+
.option('--timeout <seconds>', 'Override max runtime in seconds')
|
|
174
|
+
.option('--provider <string>', 'AI provider to use (claude or codex)')
|
|
181
175
|
.action(async (options) => {
|
|
182
176
|
// Get the project directory (current working directory)
|
|
183
177
|
const projectDir = process.cwd();
|
|
@@ -188,28 +182,34 @@ export function runCommand(program) {
|
|
|
188
182
|
// Build environment variables
|
|
189
183
|
const envVars = buildEnvVars(config, options);
|
|
190
184
|
// Get the script path
|
|
191
|
-
const scriptPath = getScriptPath(
|
|
185
|
+
const scriptPath = getScriptPath('night-watch-cron.sh');
|
|
192
186
|
if (options.dryRun) {
|
|
193
|
-
header(
|
|
187
|
+
header('Dry Run: PRD Executor');
|
|
194
188
|
// Configuration section with table
|
|
195
|
-
header(
|
|
196
|
-
const configTable = createTable({ head: [
|
|
197
|
-
configTable.push([
|
|
198
|
-
configTable.push([
|
|
199
|
-
configTable.push([
|
|
200
|
-
configTable.push([
|
|
201
|
-
configTable.push([
|
|
202
|
-
|
|
203
|
-
|
|
189
|
+
header('Configuration');
|
|
190
|
+
const configTable = createTable({ head: ['Setting', 'Value'] });
|
|
191
|
+
configTable.push(['Provider', config.provider]);
|
|
192
|
+
configTable.push(['Provider CLI', PROVIDER_COMMANDS[config.provider]]);
|
|
193
|
+
configTable.push(['Default Branch', config.defaultBranch || '(auto-detect)']);
|
|
194
|
+
configTable.push(['PRD Directory', config.prdDir]);
|
|
195
|
+
configTable.push([
|
|
196
|
+
'Max Runtime',
|
|
197
|
+
`${config.maxRuntime}s (${Math.floor(config.maxRuntime / 60)}min)`,
|
|
198
|
+
]);
|
|
199
|
+
configTable.push(['Branch Prefix', config.branchPrefix]);
|
|
200
|
+
configTable.push([
|
|
201
|
+
'Auto-merge',
|
|
202
|
+
config.autoMerge ? `Enabled (${config.autoMergeMethod})` : 'Disabled',
|
|
203
|
+
]);
|
|
204
204
|
console.log(configTable.toString());
|
|
205
|
-
if (envVars.NW_BOARD_ENABLED ===
|
|
206
|
-
header(
|
|
205
|
+
if (envVars.NW_BOARD_ENABLED === 'true') {
|
|
206
|
+
header('Board Status');
|
|
207
207
|
if (config.boardProvider?.projectNumber) {
|
|
208
208
|
try {
|
|
209
209
|
const provider = createBoardProvider(config.boardProvider, projectDir);
|
|
210
|
-
const readyIssues = await provider.getIssuesByColumn(
|
|
210
|
+
const readyIssues = await provider.getIssuesByColumn('Ready');
|
|
211
211
|
if (readyIssues.length === 0) {
|
|
212
|
-
dim(
|
|
212
|
+
dim(' Ready: (none)');
|
|
213
213
|
}
|
|
214
214
|
else {
|
|
215
215
|
info(`Ready (${readyIssues.length}):`);
|
|
@@ -226,19 +226,19 @@ export function runCommand(program) {
|
|
|
226
226
|
}
|
|
227
227
|
}
|
|
228
228
|
else {
|
|
229
|
-
dim(
|
|
229
|
+
dim(' No board configured yet. A board will be auto-created on first board-mode run.');
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
232
|
else {
|
|
233
233
|
// Scan for PRDs in filesystem mode
|
|
234
|
-
header(
|
|
234
|
+
header('PRD Status');
|
|
235
235
|
const prdStatus = scanPrdDirectory(projectDir, config.prdDir, config.maxRuntime);
|
|
236
236
|
if (prdStatus.pending.length === 0) {
|
|
237
|
-
dim(
|
|
237
|
+
dim(' Pending: (none)');
|
|
238
238
|
}
|
|
239
239
|
else {
|
|
240
|
-
const claimedItems = prdStatus.pending.filter(p => p.claimed);
|
|
241
|
-
const unclaimed = prdStatus.pending.filter(p => !p.claimed);
|
|
240
|
+
const claimedItems = prdStatus.pending.filter((p) => p.claimed);
|
|
241
|
+
const unclaimed = prdStatus.pending.filter((p) => !p.claimed);
|
|
242
242
|
info(`Pending (${unclaimed.length} pending, ${claimedItems.length} claimed):`);
|
|
243
243
|
for (const prd of prdStatus.pending) {
|
|
244
244
|
if (prd.claimed && prd.claimInfo) {
|
|
@@ -250,7 +250,7 @@ export function runCommand(program) {
|
|
|
250
250
|
}
|
|
251
251
|
}
|
|
252
252
|
if (prdStatus.completed.length === 0) {
|
|
253
|
-
dim(
|
|
253
|
+
dim(' Completed: (none)');
|
|
254
254
|
}
|
|
255
255
|
else {
|
|
256
256
|
info(`Completed (${prdStatus.completed.length}):`);
|
|
@@ -263,36 +263,36 @@ export function runCommand(program) {
|
|
|
263
263
|
}
|
|
264
264
|
}
|
|
265
265
|
// Provider invocation command
|
|
266
|
-
header(
|
|
266
|
+
header('Provider Invocation');
|
|
267
267
|
const providerCmd = PROVIDER_COMMANDS[config.provider];
|
|
268
|
-
const autoFlag = config.provider ===
|
|
268
|
+
const autoFlag = config.provider === 'claude' ? '--dangerously-skip-permissions' : '--yolo';
|
|
269
269
|
dim(` ${providerCmd} ${autoFlag} -p "/night-watch"`);
|
|
270
270
|
// Environment variables
|
|
271
|
-
header(
|
|
271
|
+
header('Environment Variables');
|
|
272
272
|
for (const [key, value] of Object.entries(envVars)) {
|
|
273
273
|
dim(` ${key}=${value}`);
|
|
274
274
|
}
|
|
275
275
|
// Full command that would be executed
|
|
276
|
-
header(
|
|
276
|
+
header('Command');
|
|
277
277
|
dim(` bash ${scriptPath} ${projectDir}`);
|
|
278
278
|
console.log();
|
|
279
279
|
process.exit(0);
|
|
280
280
|
}
|
|
281
281
|
// Execute the script with spinner
|
|
282
|
-
const spinner = createSpinner(
|
|
282
|
+
const spinner = createSpinner('Running PRD executor...');
|
|
283
283
|
spinner.start();
|
|
284
284
|
try {
|
|
285
285
|
const { exitCode, stdout, stderr } = await executeScriptWithOutput(scriptPath, [projectDir], envVars);
|
|
286
286
|
const scriptResult = parseScriptResult(`${stdout}\n${stderr}`);
|
|
287
287
|
if (exitCode === 0) {
|
|
288
|
-
if (scriptResult?.status?.startsWith(
|
|
289
|
-
spinner.succeed(
|
|
288
|
+
if (scriptResult?.status?.startsWith('skip_')) {
|
|
289
|
+
spinner.succeed('PRD executor completed (no eligible work)');
|
|
290
290
|
}
|
|
291
|
-
else if (scriptResult?.status ===
|
|
292
|
-
spinner.succeed(
|
|
291
|
+
else if (scriptResult?.status === 'success_already_merged') {
|
|
292
|
+
spinner.succeed('PRD executor completed (PRD already merged)');
|
|
293
293
|
}
|
|
294
294
|
else {
|
|
295
|
-
spinner.succeed(
|
|
295
|
+
spinner.succeed('PRD executor completed successfully');
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
298
|
else {
|
|
@@ -303,28 +303,28 @@ export function runCommand(program) {
|
|
|
303
303
|
// Rate-limit fallback notifications are sent immediately to Telegram in bash.
|
|
304
304
|
// Send this event only to non-Telegram webhooks to avoid duplicate alerts.
|
|
305
305
|
if (isRateLimitFallbackTriggered(scriptResult?.data)) {
|
|
306
|
-
const nonTelegramWebhooks = (config.notifications?.webhooks ?? [])
|
|
307
|
-
.filter((wh) => wh.type !== "telegram");
|
|
306
|
+
const nonTelegramWebhooks = (config.notifications?.webhooks ?? []).filter((wh) => wh.type !== 'telegram');
|
|
308
307
|
if (nonTelegramWebhooks.length > 0) {
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
notifications: {
|
|
312
|
-
...config.notifications,
|
|
313
|
-
webhooks: nonTelegramWebhooks,
|
|
314
|
-
},
|
|
315
|
-
}, {
|
|
316
|
-
event: "rate_limit_fallback",
|
|
308
|
+
const _rateLimitCtx = {
|
|
309
|
+
event: 'rate_limit_fallback',
|
|
317
310
|
projectName: path.basename(projectDir),
|
|
318
311
|
exitCode,
|
|
319
312
|
provider: config.provider,
|
|
320
|
-
}
|
|
313
|
+
};
|
|
314
|
+
await Promise.allSettled([
|
|
315
|
+
sendNotifications({
|
|
316
|
+
...config,
|
|
317
|
+
notifications: { ...config.notifications, webhooks: nonTelegramWebhooks },
|
|
318
|
+
}, _rateLimitCtx),
|
|
319
|
+
sendSlackBotNotification(config, _rateLimitCtx),
|
|
320
|
+
]);
|
|
321
321
|
}
|
|
322
322
|
}
|
|
323
323
|
// Backward-compatible fallback: if no marker is present, preserve previous behavior.
|
|
324
324
|
const event = resolveRunNotificationEvent(exitCode, scriptResult?.status);
|
|
325
325
|
// Enrich with PR details on success (graceful — null if gh fails)
|
|
326
326
|
let prDetails = null;
|
|
327
|
-
if (event ===
|
|
327
|
+
if (event === 'run_succeeded') {
|
|
328
328
|
const branch = scriptResult?.data.branch;
|
|
329
329
|
if (branch) {
|
|
330
330
|
prDetails = fetchPrDetailsForBranch(branch, projectDir);
|
|
@@ -334,7 +334,7 @@ export function runCommand(program) {
|
|
|
334
334
|
}
|
|
335
335
|
}
|
|
336
336
|
if (event) {
|
|
337
|
-
|
|
337
|
+
const _ctx = {
|
|
338
338
|
event,
|
|
339
339
|
projectName: path.basename(projectDir),
|
|
340
340
|
exitCode,
|
|
@@ -346,16 +346,20 @@ export function runCommand(program) {
|
|
|
346
346
|
filesChanged: prDetails?.changedFiles,
|
|
347
347
|
additions: prDetails?.additions,
|
|
348
348
|
deletions: prDetails?.deletions,
|
|
349
|
-
}
|
|
349
|
+
};
|
|
350
|
+
await Promise.allSettled([
|
|
351
|
+
sendNotifications(config, _ctx),
|
|
352
|
+
sendSlackBotNotification(config, _ctx),
|
|
353
|
+
]);
|
|
350
354
|
}
|
|
351
355
|
else {
|
|
352
|
-
info(
|
|
356
|
+
info('Skipping completion notification (no actionable run result)');
|
|
353
357
|
}
|
|
354
358
|
}
|
|
355
359
|
process.exit(exitCode);
|
|
356
360
|
}
|
|
357
361
|
catch (err) {
|
|
358
|
-
spinner.fail(
|
|
362
|
+
spinner.fail('Failed to execute run command');
|
|
359
363
|
uiError(`${err instanceof Error ? err.message : String(err)}`);
|
|
360
364
|
process.exit(1);
|
|
361
365
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Serve command for Night Watch CLI
|
|
3
3
|
* Starts the HTTP API server for the Web UI
|
|
4
4
|
*/
|
|
5
|
-
import { Command } from
|
|
6
|
-
type TServeMode =
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
type TServeMode = 'global' | 'local';
|
|
7
7
|
interface IServeLockResult {
|
|
8
8
|
acquired: boolean;
|
|
9
9
|
lockPath: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,KAAK,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAErC,UAAU,gBAAgB;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvE;AAsBD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAqDjF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAYvD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoDnD"}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Serve command for Night Watch CLI
|
|
3
3
|
* Starts the HTTP API server for the Web UI
|
|
4
4
|
*/
|
|
5
|
-
import * as fs from
|
|
6
|
-
import { LOCK_FILE_PREFIX } from
|
|
7
|
-
import { startGlobalServer, startServer } from
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import { LOCK_FILE_PREFIX } from '@night-watch/core';
|
|
7
|
+
import { startGlobalServer, startServer } from '@night-watch/server';
|
|
8
8
|
export function getServeLockPath(mode, port) {
|
|
9
9
|
return `${LOCK_FILE_PREFIX}serve-${mode}-${port}.lock`;
|
|
10
10
|
}
|
|
@@ -21,7 +21,7 @@ function readPid(lockPath) {
|
|
|
21
21
|
try {
|
|
22
22
|
if (!fs.existsSync(lockPath))
|
|
23
23
|
return null;
|
|
24
|
-
const raw = fs.readFileSync(lockPath,
|
|
24
|
+
const raw = fs.readFileSync(lockPath, 'utf-8').trim();
|
|
25
25
|
const pid = parseInt(raw, 10);
|
|
26
26
|
return Number.isFinite(pid) ? pid : null;
|
|
27
27
|
}
|
|
@@ -35,14 +35,14 @@ export function acquireServeLock(mode, port) {
|
|
|
35
35
|
// Two attempts: second after stale lock cleanup.
|
|
36
36
|
for (let attempt = 0; attempt < 2; attempt++) {
|
|
37
37
|
try {
|
|
38
|
-
const fd = fs.openSync(lockPath,
|
|
38
|
+
const fd = fs.openSync(lockPath, 'wx');
|
|
39
39
|
fs.writeFileSync(fd, `${process.pid}\n`);
|
|
40
40
|
fs.closeSync(fd);
|
|
41
41
|
return { acquired: true, lockPath, stalePidCleaned };
|
|
42
42
|
}
|
|
43
43
|
catch (error) {
|
|
44
44
|
const err = error;
|
|
45
|
-
if (err.code !==
|
|
45
|
+
if (err.code !== 'EEXIST') {
|
|
46
46
|
return {
|
|
47
47
|
acquired: false,
|
|
48
48
|
lockPath,
|
|
@@ -78,7 +78,7 @@ export function acquireServeLock(mode, port) {
|
|
|
78
78
|
return {
|
|
79
79
|
acquired: false,
|
|
80
80
|
lockPath,
|
|
81
|
-
message:
|
|
81
|
+
message: 'failed to acquire serve lock',
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
84
|
export function releaseServeLock(lockPath) {
|
|
@@ -97,38 +97,38 @@ export function releaseServeLock(lockPath) {
|
|
|
97
97
|
}
|
|
98
98
|
export function serveCommand(program) {
|
|
99
99
|
program
|
|
100
|
-
.command(
|
|
101
|
-
.description(
|
|
102
|
-
.option(
|
|
103
|
-
.option(
|
|
100
|
+
.command('serve')
|
|
101
|
+
.description('Start the Night Watch web UI server')
|
|
102
|
+
.option('-p, --port <number>', 'Port to run the server on', '7575')
|
|
103
|
+
.option('-g, --global', 'Start in global mode (manage all registered projects)')
|
|
104
104
|
.action((options) => {
|
|
105
105
|
const port = parseInt(options.port, 10);
|
|
106
106
|
if (isNaN(port) || port < 1 || port > 65535) {
|
|
107
107
|
console.error(`Invalid port: ${options.port}. Port must be between 1 and 65535.`);
|
|
108
108
|
process.exit(1);
|
|
109
109
|
}
|
|
110
|
-
const mode = options.global ?
|
|
110
|
+
const mode = options.global ? 'global' : 'local';
|
|
111
111
|
const lock = acquireServeLock(mode, port);
|
|
112
112
|
if (!lock.acquired) {
|
|
113
|
-
const pidPart = lock.existingPid ? ` (PID ${lock.existingPid})` :
|
|
114
|
-
const detail = lock.message ? `: ${lock.message}` :
|
|
113
|
+
const pidPart = lock.existingPid ? ` (PID ${lock.existingPid})` : '';
|
|
114
|
+
const detail = lock.message ? `: ${lock.message}` : '';
|
|
115
115
|
console.error(`[serve] Another Night Watch ${mode} server is already running on port ${port}${pidPart}${detail}`);
|
|
116
|
-
console.error(
|
|
116
|
+
console.error('[serve] Stop the existing process first, or use --port with a different value.');
|
|
117
117
|
process.exit(1);
|
|
118
118
|
}
|
|
119
119
|
if (lock.stalePidCleaned) {
|
|
120
120
|
console.warn(`[serve] cleaned stale lock from PID ${lock.stalePidCleaned} (${lock.lockPath})`);
|
|
121
121
|
}
|
|
122
122
|
console.log(`[serve] lock acquired ${lock.lockPath} pid=${process.pid}`);
|
|
123
|
-
process.on(
|
|
123
|
+
process.on('exit', () => {
|
|
124
124
|
releaseServeLock(lock.lockPath);
|
|
125
125
|
});
|
|
126
126
|
if (options.global) {
|
|
127
|
-
const execArgv = process.execArgv.length > 0 ? process.execArgv.join(
|
|
127
|
+
const execArgv = process.execArgv.length > 0 ? process.execArgv.join(' ') : '(none)';
|
|
128
128
|
console.log(`[serve] mode=global port=${port} pid=${process.pid} node=${process.version}`);
|
|
129
129
|
console.log(`[serve] execPath=${process.execPath}`);
|
|
130
130
|
console.log(`[serve] execArgv=${execArgv}`);
|
|
131
|
-
console.log(`[serve] argv=${process.argv.join(
|
|
131
|
+
console.log(`[serve] argv=${process.argv.join(' ')}`);
|
|
132
132
|
}
|
|
133
133
|
if (options.global) {
|
|
134
134
|
startGlobalServer(port);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Slice command - executes the roadmap slicer to create PRDs from roadmap items
|
|
3
3
|
*/
|
|
4
|
-
import { Command } from
|
|
5
|
-
import { INightWatchConfig } from
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { INightWatchConfig } from '@night-watch/core';
|
|
6
6
|
/**
|
|
7
7
|
* Options for the slice command
|
|
8
8
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/commands/slice.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,iBAAiB,EAalB,MAAM,mBAAmB,CAAC;AAK3B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,iBAAiB,CAkBnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+InD"}
|