@jonit-dev/night-watch-cli 1.7.9 → 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/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/dashboard/tab-config.d.ts.map +1 -1
- package/dist/commands/dashboard/tab-config.js +9 -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/init.d.ts.map +1 -1
- package/dist/commands/init.js +131 -19
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +4 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +24 -0
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/qa.d.ts +30 -0
- package/dist/commands/qa.d.ts.map +1 -0
- package/dist/commands/qa.js +159 -0
- package/dist/commands/qa.js.map +1 -0
- package/dist/commands/review.d.ts +5 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +40 -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 +56 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +3 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +155 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +20 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +40 -0
- package/dist/constants.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +47 -5
- 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/dist/types.d.ts +43 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/notify.d.ts.map +1 -1
- package/dist/utils/notify.js +18 -0
- package/dist/utils/notify.js.map +1 -1
- package/dist/utils/status-data.d.ts +4 -0
- package/dist/utils/status-data.d.ts.map +1 -1
- package/dist/utils/status-data.js +13 -3
- package/dist/utils/status-data.js.map +1 -1
- package/package.json +3 -1
- package/scripts/night-watch-cron.sh +50 -2
- package/scripts/night-watch-helpers.sh +54 -2
- package/scripts/night-watch-pr-reviewer-cron.sh +79 -1
- package/scripts/night-watch-qa-cron.sh +269 -0
- package/templates/night-watch-qa.md +157 -0
- package/templates/night-watch.config.json +14 -1
- 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-C64sy08d.js +0 -360
- package/web/dist/assets/index-DzoZeo_Y.css +0 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite implementation of IExecutionHistoryRepository.
|
|
3
|
+
* Persists execution records in the `execution_history` table.
|
|
4
|
+
*/
|
|
5
|
+
export class SqliteExecutionHistoryRepository {
|
|
6
|
+
_db;
|
|
7
|
+
constructor(db) {
|
|
8
|
+
this._db = db;
|
|
9
|
+
}
|
|
10
|
+
getRecords(projectPath, prdFile) {
|
|
11
|
+
const rows = this._db
|
|
12
|
+
.prepare(`SELECT timestamp, outcome, exit_code, attempt
|
|
13
|
+
FROM execution_history
|
|
14
|
+
WHERE project_path = ? AND prd_file = ?
|
|
15
|
+
ORDER BY timestamp DESC, id DESC`)
|
|
16
|
+
.all(projectPath, prdFile);
|
|
17
|
+
return rows.map((row) => ({
|
|
18
|
+
timestamp: row.timestamp,
|
|
19
|
+
outcome: row.outcome,
|
|
20
|
+
exitCode: row.exit_code,
|
|
21
|
+
attempt: row.attempt,
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
addRecord(projectPath, prdFile, record) {
|
|
25
|
+
this._db
|
|
26
|
+
.prepare(`INSERT INTO execution_history
|
|
27
|
+
(project_path, prd_file, timestamp, outcome, exit_code, attempt)
|
|
28
|
+
VALUES (?, ?, ?, ?, ?, ?)`)
|
|
29
|
+
.run(projectPath, prdFile, record.timestamp, record.outcome, record.exitCode, record.attempt);
|
|
30
|
+
}
|
|
31
|
+
getAllHistory() {
|
|
32
|
+
const rows = this._db
|
|
33
|
+
.prepare(`SELECT project_path, prd_file, timestamp, outcome, exit_code, attempt
|
|
34
|
+
FROM execution_history
|
|
35
|
+
ORDER BY project_path, prd_file, timestamp ASC, id ASC`)
|
|
36
|
+
.all();
|
|
37
|
+
const history = {};
|
|
38
|
+
for (const row of rows) {
|
|
39
|
+
if (!history[row.project_path]) {
|
|
40
|
+
history[row.project_path] = {};
|
|
41
|
+
}
|
|
42
|
+
if (!history[row.project_path][row.prd_file]) {
|
|
43
|
+
history[row.project_path][row.prd_file] = { records: [] };
|
|
44
|
+
}
|
|
45
|
+
history[row.project_path][row.prd_file].records.push({
|
|
46
|
+
timestamp: row.timestamp,
|
|
47
|
+
outcome: row.outcome,
|
|
48
|
+
exitCode: row.exit_code,
|
|
49
|
+
attempt: row.attempt,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return history;
|
|
53
|
+
}
|
|
54
|
+
replaceAll(history) {
|
|
55
|
+
const replaceAll = this._db.transaction(() => {
|
|
56
|
+
this._db.prepare("DELETE FROM execution_history").run();
|
|
57
|
+
const insert = this._db.prepare(`INSERT INTO execution_history
|
|
58
|
+
(project_path, prd_file, timestamp, outcome, exit_code, attempt)
|
|
59
|
+
VALUES (?, ?, ?, ?, ?, ?)`);
|
|
60
|
+
for (const [projectPath, prdMap] of Object.entries(history)) {
|
|
61
|
+
for (const [prdFile, prdHistory] of Object.entries(prdMap)) {
|
|
62
|
+
for (const record of prdHistory.records) {
|
|
63
|
+
insert.run(projectPath, prdFile, record.timestamp, record.outcome, record.exitCode, record.attempt);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
replaceAll();
|
|
69
|
+
}
|
|
70
|
+
trimRecords(projectPath, prdFile, maxCount) {
|
|
71
|
+
// Count current records for this project/prd pair
|
|
72
|
+
const countRow = this._db
|
|
73
|
+
.prepare(`SELECT COUNT(*) as count
|
|
74
|
+
FROM execution_history
|
|
75
|
+
WHERE project_path = ? AND prd_file = ?`)
|
|
76
|
+
.get(projectPath, prdFile);
|
|
77
|
+
const total = countRow?.count ?? 0;
|
|
78
|
+
if (total <= maxCount) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const deleteCount = total - maxCount;
|
|
82
|
+
// Delete the oldest records (lowest timestamp ids)
|
|
83
|
+
this._db
|
|
84
|
+
.prepare(`DELETE FROM execution_history
|
|
85
|
+
WHERE id IN (
|
|
86
|
+
SELECT id FROM execution_history
|
|
87
|
+
WHERE project_path = ? AND prd_file = ?
|
|
88
|
+
ORDER BY timestamp ASC, id ASC
|
|
89
|
+
LIMIT ?
|
|
90
|
+
)`)
|
|
91
|
+
.run(projectPath, prdFile, deleteCount);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=execution-history-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-history-repository.js","sourceRoot":"","sources":["../../../../../src/storage/repositories/sqlite/execution-history-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite implementation of IPrdStateRepository.
|
|
3
|
+
* Persists PRD state entries in the `prd_states` table.
|
|
4
|
+
*/
|
|
5
|
+
import Database from "better-sqlite3";
|
|
6
|
+
import { IPrdStateEntry } from "../../../utils/prd-states.js";
|
|
7
|
+
import { IPrdStateRepository } from "../interfaces.js";
|
|
8
|
+
export declare class SqlitePrdStateRepository implements IPrdStateRepository {
|
|
9
|
+
private readonly _db;
|
|
10
|
+
constructor(db: Database.Database);
|
|
11
|
+
get(projectPath: string, prdName: string): IPrdStateEntry | null;
|
|
12
|
+
getAll(projectPath: string): Record<string, IPrdStateEntry>;
|
|
13
|
+
readAll(): Record<string, Record<string, IPrdStateEntry>>;
|
|
14
|
+
set(projectPath: string, prdName: string, entry: IPrdStateEntry): void;
|
|
15
|
+
delete(projectPath: string, prdName: string): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=prd-state-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prd-state-repository.d.ts","sourceRoot":"","sources":["../../../../../src/storage/repositories/sqlite/prd-state-repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAUvD,qBAAa,wBAAyB,YAAW,mBAAmB;IAClE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;gBAE5B,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAoBhE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;IAoB3D,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAqBzD,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;IAatE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;CAOnD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite implementation of IPrdStateRepository.
|
|
3
|
+
* Persists PRD state entries in the `prd_states` table.
|
|
4
|
+
*/
|
|
5
|
+
export class SqlitePrdStateRepository {
|
|
6
|
+
_db;
|
|
7
|
+
constructor(db) {
|
|
8
|
+
this._db = db;
|
|
9
|
+
}
|
|
10
|
+
get(projectPath, prdName) {
|
|
11
|
+
const row = this._db
|
|
12
|
+
.prepare(`SELECT status, branch, timestamp
|
|
13
|
+
FROM prd_states
|
|
14
|
+
WHERE project_path = ? AND prd_name = ?`)
|
|
15
|
+
.get(projectPath, prdName);
|
|
16
|
+
if (!row) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
status: row.status,
|
|
21
|
+
branch: row.branch,
|
|
22
|
+
timestamp: row.timestamp,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
getAll(projectPath) {
|
|
26
|
+
const rows = this._db
|
|
27
|
+
.prepare(`SELECT prd_name, status, branch, timestamp
|
|
28
|
+
FROM prd_states
|
|
29
|
+
WHERE project_path = ?`)
|
|
30
|
+
.all(projectPath);
|
|
31
|
+
const result = {};
|
|
32
|
+
for (const row of rows) {
|
|
33
|
+
result[row.prd_name] = {
|
|
34
|
+
status: row.status,
|
|
35
|
+
branch: row.branch,
|
|
36
|
+
timestamp: row.timestamp,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
readAll() {
|
|
42
|
+
const rows = this._db
|
|
43
|
+
.prepare("SELECT project_path, prd_name, status, branch, timestamp FROM prd_states")
|
|
44
|
+
.all();
|
|
45
|
+
const result = {};
|
|
46
|
+
for (const row of rows) {
|
|
47
|
+
if (!result[row.project_path]) {
|
|
48
|
+
result[row.project_path] = {};
|
|
49
|
+
}
|
|
50
|
+
result[row.project_path][row.prd_name] = {
|
|
51
|
+
status: row.status,
|
|
52
|
+
branch: row.branch,
|
|
53
|
+
timestamp: row.timestamp,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
set(projectPath, prdName, entry) {
|
|
59
|
+
this._db
|
|
60
|
+
.prepare(`INSERT INTO prd_states (project_path, prd_name, status, branch, timestamp)
|
|
61
|
+
VALUES (?, ?, ?, ?, ?)
|
|
62
|
+
ON CONFLICT(project_path, prd_name)
|
|
63
|
+
DO UPDATE SET status = excluded.status,
|
|
64
|
+
branch = excluded.branch,
|
|
65
|
+
timestamp = excluded.timestamp`)
|
|
66
|
+
.run(projectPath, prdName, entry.status, entry.branch, entry.timestamp);
|
|
67
|
+
}
|
|
68
|
+
delete(projectPath, prdName) {
|
|
69
|
+
this._db
|
|
70
|
+
.prepare(`DELETE FROM prd_states WHERE project_path = ? AND prd_name = ?`)
|
|
71
|
+
.run(projectPath, prdName);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=prd-state-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prd-state-repository.js","sourceRoot":"","sources":["../../../../../src/storage/repositories/sqlite/prd-state-repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,MAAM,OAAO,wBAAwB;IAClB,GAAG,CAAoB;IAExC,YAAY,EAAqB;QAC/B,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,WAAmB,EAAE,OAAe;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG;aACjB,OAAO,CACN;;iDAEyC,CAC1C;aACA,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAE7B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,MAAM,EAAE,GAAG,CAAC,MAAkC;YAC9C,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAmB;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG;aAClB,OAAO,CACN;;gCAEwB,CACzB;aACA,GAAG,CAAC,WAAW,CAAC,CAAC;QAEpB,MAAM,MAAM,GAAmC,EAAE,CAAC;QAClD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG;gBACrB,MAAM,EAAE,GAAG,CAAC,MAAkC;gBAC9C,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,SAAS,EAAE,GAAG,CAAC,SAAS;aACzB,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG;aAClB,OAAO,CACN,0EAA0E,CAC3E;aACA,GAAG,EAAE,CAAC;QAET,MAAM,MAAM,GAAmD,EAAE,CAAC;QAClE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;YAChC,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG;gBACvC,MAAM,EAAE,GAAG,CAAC,MAAkC;gBAC9C,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,SAAS,EAAE,GAAG,CAAC,SAAS;aACzB,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,WAAmB,EAAE,OAAe,EAAE,KAAqB;QAC7D,IAAI,CAAC,GAAG;aACL,OAAO,CACN;;;;;sDAK8C,CAC/C;aACA,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,CAAC,WAAmB,EAAE,OAAe;QACzC,IAAI,CAAC,GAAG;aACL,OAAO,CACN,gEAAgE,CACjE;aACA,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite implementation of IProjectRegistryRepository.
|
|
3
|
+
* Persists project registry entries in the `projects` table.
|
|
4
|
+
*/
|
|
5
|
+
import Database from "better-sqlite3";
|
|
6
|
+
import { IRegistryEntry } from "../../../utils/registry.js";
|
|
7
|
+
import { IProjectRegistryRepository } from "../interfaces.js";
|
|
8
|
+
export declare class SqliteProjectRegistryRepository implements IProjectRegistryRepository {
|
|
9
|
+
private readonly _db;
|
|
10
|
+
constructor(db: Database.Database);
|
|
11
|
+
getAll(): IRegistryEntry[];
|
|
12
|
+
upsert(entry: IRegistryEntry): void;
|
|
13
|
+
remove(projectPath: string): boolean;
|
|
14
|
+
clear(): void;
|
|
15
|
+
updateSlackChannel(path: string, channelId: string): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=project-registry-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-registry-repository.d.ts","sourceRoot":"","sources":["../../../../../src/storage/repositories/sqlite/project-registry-repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAS9D,qBAAa,+BACX,YAAW,0BAA0B;IAErC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;gBAE5B,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,MAAM,IAAI,cAAc,EAAE;IAY1B,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAYnC,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAQpC,KAAK,IAAI,IAAI;IAIb,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;CAO1D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite implementation of IProjectRegistryRepository.
|
|
3
|
+
* Persists project registry entries in the `projects` table.
|
|
4
|
+
*/
|
|
5
|
+
export class SqliteProjectRegistryRepository {
|
|
6
|
+
_db;
|
|
7
|
+
constructor(db) {
|
|
8
|
+
this._db = db;
|
|
9
|
+
}
|
|
10
|
+
getAll() {
|
|
11
|
+
const rows = this._db
|
|
12
|
+
.prepare("SELECT name, path, slack_channel_id FROM projects ORDER BY name")
|
|
13
|
+
.all();
|
|
14
|
+
return rows.map((row) => ({
|
|
15
|
+
name: row.name,
|
|
16
|
+
path: row.path,
|
|
17
|
+
...(row.slack_channel_id ? { slackChannelId: row.slack_channel_id } : {}),
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
upsert(entry) {
|
|
21
|
+
const createdAt = Math.floor(Date.now() / 1000);
|
|
22
|
+
this._db
|
|
23
|
+
.prepare(`INSERT INTO projects (name, path, created_at, slack_channel_id)
|
|
24
|
+
VALUES (?, ?, ?, ?)
|
|
25
|
+
ON CONFLICT(path) DO UPDATE SET name = excluded.name, slack_channel_id = COALESCE(excluded.slack_channel_id, slack_channel_id)`)
|
|
26
|
+
.run(entry.name, entry.path, createdAt, entry.slackChannelId ?? null);
|
|
27
|
+
}
|
|
28
|
+
remove(projectPath) {
|
|
29
|
+
const result = this._db
|
|
30
|
+
.prepare("DELETE FROM projects WHERE path = ?")
|
|
31
|
+
.run(projectPath);
|
|
32
|
+
return result.changes > 0;
|
|
33
|
+
}
|
|
34
|
+
clear() {
|
|
35
|
+
this._db.prepare("DELETE FROM projects").run();
|
|
36
|
+
}
|
|
37
|
+
updateSlackChannel(path, channelId) {
|
|
38
|
+
this._db
|
|
39
|
+
.prepare(`UPDATE projects SET slack_channel_id = ? WHERE path = ?`)
|
|
40
|
+
.run(channelId || null, path);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=project-registry-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-registry-repository.js","sourceRoot":"","sources":["../../../../../src/storage/repositories/sqlite/project-registry-repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,OAAO,+BAA+B;IAGzB,GAAG,CAAoB;IAExC,YAAY,EAAqB;QAC/B,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,MAAM;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG;aAClB,OAAO,CAAkB,iEAAiE,CAAC;aAC3F,GAAG,EAAE,CAAC;QAET,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAC,CAAC,CAAC;IACN,CAAC;IAED,MAAM,CAAC,KAAqB;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAEhD,IAAI,CAAC,GAAG;aACL,OAAO,CACN;;wIAEgI,CACjI;aACA,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,CAAC,WAAmB;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG;aACpB,OAAO,CAAW,qCAAqC,CAAC;aACxD,GAAG,CAAC,WAAW,CAAC,CAAC;QAEpB,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,GAAG,EAAE,CAAC;IACjD,CAAC;IAED,kBAAkB,CAAC,IAAY,EAAE,SAAiB;QAChD,IAAI,CAAC,GAAG;aACL,OAAO,CACN,yDAAyD,CAC1D;aACA,GAAG,CAAC,SAAS,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite implementation of IRoadmapStateRepository.
|
|
3
|
+
* Persists roadmap state in the `roadmap_states` table, keyed by prd_dir.
|
|
4
|
+
*/
|
|
5
|
+
import Database from "better-sqlite3";
|
|
6
|
+
import { IRoadmapState } from "../../../utils/roadmap-state.js";
|
|
7
|
+
import { IRoadmapStateRepository } from "../interfaces.js";
|
|
8
|
+
export declare class SqliteRoadmapStateRepository implements IRoadmapStateRepository {
|
|
9
|
+
private readonly _db;
|
|
10
|
+
constructor(db: Database.Database);
|
|
11
|
+
load(prdDir: string): IRoadmapState | null;
|
|
12
|
+
save(prdDir: string, state: IRoadmapState): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=roadmap-state-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roadmap-state-repository.d.ts","sourceRoot":"","sources":["../../../../../src/storage/repositories/sqlite/roadmap-state-repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAS3D,qBAAa,4BAA6B,YAAW,uBAAuB;IAC1E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;gBAE5B,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IA8B1C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI;CAcjD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite implementation of IRoadmapStateRepository.
|
|
3
|
+
* Persists roadmap state in the `roadmap_states` table, keyed by prd_dir.
|
|
4
|
+
*/
|
|
5
|
+
export class SqliteRoadmapStateRepository {
|
|
6
|
+
_db;
|
|
7
|
+
constructor(db) {
|
|
8
|
+
this._db = db;
|
|
9
|
+
}
|
|
10
|
+
load(prdDir) {
|
|
11
|
+
const row = this._db
|
|
12
|
+
.prepare(`SELECT version, last_scan, items_json
|
|
13
|
+
FROM roadmap_states
|
|
14
|
+
WHERE prd_dir = ?`)
|
|
15
|
+
.get(prdDir);
|
|
16
|
+
if (!row) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
let items = {};
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(row.items_json);
|
|
22
|
+
if (typeof parsed === "object" && parsed !== null) {
|
|
23
|
+
items = parsed;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
items = {};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
version: row.version,
|
|
31
|
+
lastScan: row.last_scan,
|
|
32
|
+
items,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
save(prdDir, state) {
|
|
36
|
+
const itemsJson = JSON.stringify(state.items);
|
|
37
|
+
this._db
|
|
38
|
+
.prepare(`INSERT INTO roadmap_states (prd_dir, version, last_scan, items_json)
|
|
39
|
+
VALUES (?, ?, ?, ?)
|
|
40
|
+
ON CONFLICT(prd_dir)
|
|
41
|
+
DO UPDATE SET version = excluded.version,
|
|
42
|
+
last_scan = excluded.last_scan,
|
|
43
|
+
items_json = excluded.items_json`)
|
|
44
|
+
.run(prdDir, state.version, state.lastScan, itemsJson);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=roadmap-state-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roadmap-state-repository.js","sourceRoot":"","sources":["../../../../../src/storage/repositories/sqlite/roadmap-state-repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,OAAO,4BAA4B;IACtB,GAAG,CAAoB;IAExC,YAAY,EAAqB;QAC/B,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,MAAc;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG;aACjB,OAAO,CACN;;2BAEmB,CACpB;aACA,GAAG,CAAC,MAAM,CAAC,CAAC;QAEf,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,GAA2B,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACnD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClD,KAAK,GAAG,MAAgC,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,GAAG,EAAE,CAAC;QACb,CAAC;QAED,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,KAAK;SACN,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAc,EAAE,KAAoB;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,CAAC,GAAG;aACL,OAAO,CACN;;;;;wDAKgD,CACjD;aACA,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3D,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite implementation of ISlackDiscussionRepository.
|
|
3
|
+
* Persists Slack discussion records in the `slack_discussions` table.
|
|
4
|
+
*/
|
|
5
|
+
import Database from "better-sqlite3";
|
|
6
|
+
import { ConsensusResult, DiscussionStatus, ISlackDiscussion, TriggerType } from "../../../../shared/types.js";
|
|
7
|
+
import { ISlackDiscussionRepository } from "../interfaces.js";
|
|
8
|
+
export declare class SqliteSlackDiscussionRepository implements ISlackDiscussionRepository {
|
|
9
|
+
private readonly _db;
|
|
10
|
+
constructor(db: Database.Database);
|
|
11
|
+
getById(id: string): ISlackDiscussion | null;
|
|
12
|
+
getActive(projectPath: string): ISlackDiscussion[];
|
|
13
|
+
getLatestByTrigger(projectPath: string, triggerType: TriggerType, triggerRef: string): ISlackDiscussion | null;
|
|
14
|
+
create(discussion: Omit<ISlackDiscussion, 'id' | 'createdAt' | 'updatedAt'>): ISlackDiscussion;
|
|
15
|
+
updateStatus(id: string, status: DiscussionStatus, consensusResult?: ConsensusResult): void;
|
|
16
|
+
updateRound(id: string, round: number): void;
|
|
17
|
+
addParticipant(id: string, agentId: string): void;
|
|
18
|
+
close(id: string): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=slack-discussion-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-discussion-repository.d.ts","sourceRoot":"","sources":["../../../../../src/storage/repositories/sqlite/slack-discussion-repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACZ,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAkC9D,qBAAa,+BAAgC,YAAW,0BAA0B;IAChF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;gBAE5B,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAO5C,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAelD,kBAAkB,CAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,GACjB,gBAAgB,GAAG,IAAI;IAa1B,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,gBAAgB;IA4B9F,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI;IAQ3F,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ5C,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAajD,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAGxB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite implementation of ISlackDiscussionRepository.
|
|
3
|
+
* Persists Slack discussion records in the `slack_discussions` table.
|
|
4
|
+
*/
|
|
5
|
+
import { randomUUID } from "crypto";
|
|
6
|
+
function rowToDiscussion(row) {
|
|
7
|
+
return {
|
|
8
|
+
id: row.id,
|
|
9
|
+
projectPath: row.project_path,
|
|
10
|
+
triggerType: row.trigger_type,
|
|
11
|
+
triggerRef: row.trigger_ref,
|
|
12
|
+
channelId: row.channel_id,
|
|
13
|
+
threadTs: row.thread_ts,
|
|
14
|
+
status: row.status,
|
|
15
|
+
round: row.round,
|
|
16
|
+
participants: JSON.parse(row.participants_json || '[]'),
|
|
17
|
+
consensusResult: row.consensus_result,
|
|
18
|
+
createdAt: row.created_at,
|
|
19
|
+
updatedAt: row.updated_at,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export class SqliteSlackDiscussionRepository {
|
|
23
|
+
_db;
|
|
24
|
+
constructor(db) {
|
|
25
|
+
this._db = db;
|
|
26
|
+
}
|
|
27
|
+
getById(id) {
|
|
28
|
+
const row = this._db
|
|
29
|
+
.prepare('SELECT * FROM slack_discussions WHERE id = ?')
|
|
30
|
+
.get(id);
|
|
31
|
+
return row ? rowToDiscussion(row) : null;
|
|
32
|
+
}
|
|
33
|
+
getActive(projectPath) {
|
|
34
|
+
const rows = projectPath
|
|
35
|
+
? this._db
|
|
36
|
+
.prepare("SELECT * FROM slack_discussions WHERE project_path = ? AND status = 'active' ORDER BY created_at DESC")
|
|
37
|
+
.all(projectPath)
|
|
38
|
+
: this._db
|
|
39
|
+
.prepare("SELECT * FROM slack_discussions WHERE status = 'active' ORDER BY created_at DESC")
|
|
40
|
+
.all();
|
|
41
|
+
return rows.map(rowToDiscussion);
|
|
42
|
+
}
|
|
43
|
+
getLatestByTrigger(projectPath, triggerType, triggerRef) {
|
|
44
|
+
const row = this._db
|
|
45
|
+
.prepare(`SELECT *
|
|
46
|
+
FROM slack_discussions
|
|
47
|
+
WHERE project_path = ? AND trigger_type = ? AND trigger_ref = ?
|
|
48
|
+
ORDER BY created_at DESC
|
|
49
|
+
LIMIT 1`)
|
|
50
|
+
.get(projectPath, triggerType, triggerRef);
|
|
51
|
+
return row ? rowToDiscussion(row) : null;
|
|
52
|
+
}
|
|
53
|
+
create(discussion) {
|
|
54
|
+
const id = randomUUID();
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
this._db
|
|
57
|
+
.prepare(`INSERT INTO slack_discussions
|
|
58
|
+
(id, project_path, trigger_type, trigger_ref, channel_id, thread_ts, status, round, participants_json, consensus_result, created_at, updated_at)
|
|
59
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
60
|
+
.run(id, discussion.projectPath, discussion.triggerType, discussion.triggerRef, discussion.channelId, discussion.threadTs, discussion.status, discussion.round, JSON.stringify(discussion.participants), discussion.consensusResult ?? null, now, now);
|
|
61
|
+
return this.getById(id);
|
|
62
|
+
}
|
|
63
|
+
updateStatus(id, status, consensusResult) {
|
|
64
|
+
this._db
|
|
65
|
+
.prepare('UPDATE slack_discussions SET status = ?, consensus_result = ?, updated_at = ? WHERE id = ?')
|
|
66
|
+
.run(status, consensusResult ?? null, Date.now(), id);
|
|
67
|
+
}
|
|
68
|
+
updateRound(id, round) {
|
|
69
|
+
this._db
|
|
70
|
+
.prepare('UPDATE slack_discussions SET round = ?, updated_at = ? WHERE id = ?')
|
|
71
|
+
.run(round, Date.now(), id);
|
|
72
|
+
}
|
|
73
|
+
addParticipant(id, agentId) {
|
|
74
|
+
const discussion = this.getById(id);
|
|
75
|
+
if (!discussion)
|
|
76
|
+
return;
|
|
77
|
+
if (!discussion.participants.includes(agentId)) {
|
|
78
|
+
discussion.participants.push(agentId);
|
|
79
|
+
this._db
|
|
80
|
+
.prepare('UPDATE slack_discussions SET participants_json = ?, updated_at = ? WHERE id = ?')
|
|
81
|
+
.run(JSON.stringify(discussion.participants), Date.now(), id);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
close(id) {
|
|
85
|
+
this.updateStatus(id, 'closed');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=slack-discussion-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-discussion-repository.js","sourceRoot":"","sources":["../../../../../src/storage/repositories/sqlite/slack-discussion-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite database client for Night Watch CLI
|
|
3
|
+
* Opens (or creates) the database at ${NIGHT_WATCH_HOME}/state.db
|
|
4
|
+
* Applies WAL journal mode and busy_timeout pragmas on open.
|
|
5
|
+
*/
|
|
6
|
+
import Database from "better-sqlite3";
|
|
7
|
+
/**
|
|
8
|
+
* Get the path to the SQLite database file.
|
|
9
|
+
* Mirrors the same pattern used by getRegistryPath() and getHistoryPath().
|
|
10
|
+
*/
|
|
11
|
+
export declare function getDbPath(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Return the singleton Database instance, creating it on first call.
|
|
14
|
+
* The database directory is created if it does not exist.
|
|
15
|
+
* Pragmas applied: journal_mode = WAL, busy_timeout = 5000.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getDb(): Database.Database;
|
|
18
|
+
/**
|
|
19
|
+
* Close the current singleton database connection and reset it.
|
|
20
|
+
* Primarily useful in tests to allow re-opening against a different path.
|
|
21
|
+
*/
|
|
22
|
+
export declare function closeDb(): void;
|
|
23
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/storage/sqlite/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAMtC;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAIlC;AAED;;;;GAIG;AACH,wBAAgB,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAezC;AAED;;;GAGG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAK9B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite database client for Night Watch CLI
|
|
3
|
+
* Opens (or creates) the database at ${NIGHT_WATCH_HOME}/state.db
|
|
4
|
+
* Applies WAL journal mode and busy_timeout pragmas on open.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from "fs";
|
|
7
|
+
import * as os from "os";
|
|
8
|
+
import * as path from "path";
|
|
9
|
+
import Database from "better-sqlite3";
|
|
10
|
+
import { GLOBAL_CONFIG_DIR, STATE_DB_FILE_NAME } from "../../constants.js";
|
|
11
|
+
let _db = null;
|
|
12
|
+
/**
|
|
13
|
+
* Get the path to the SQLite database file.
|
|
14
|
+
* Mirrors the same pattern used by getRegistryPath() and getHistoryPath().
|
|
15
|
+
*/
|
|
16
|
+
export function getDbPath() {
|
|
17
|
+
const base = process.env.NIGHT_WATCH_HOME || path.join(os.homedir(), GLOBAL_CONFIG_DIR);
|
|
18
|
+
return path.join(base, STATE_DB_FILE_NAME);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Return the singleton Database instance, creating it on first call.
|
|
22
|
+
* The database directory is created if it does not exist.
|
|
23
|
+
* Pragmas applied: journal_mode = WAL, busy_timeout = 5000.
|
|
24
|
+
*/
|
|
25
|
+
export function getDb() {
|
|
26
|
+
if (_db) {
|
|
27
|
+
return _db;
|
|
28
|
+
}
|
|
29
|
+
const dbPath = getDbPath();
|
|
30
|
+
fs.mkdirSync(path.dirname(dbPath), { recursive: true });
|
|
31
|
+
const db = new Database(dbPath);
|
|
32
|
+
db.pragma("journal_mode = WAL");
|
|
33
|
+
db.pragma("busy_timeout = 5000");
|
|
34
|
+
_db = db;
|
|
35
|
+
return _db;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Close the current singleton database connection and reset it.
|
|
39
|
+
* Primarily useful in tests to allow re-opening against a different path.
|
|
40
|
+
*/
|
|
41
|
+
export function closeDb() {
|
|
42
|
+
if (_db) {
|
|
43
|
+
_db.close();
|
|
44
|
+
_db = null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/storage/sqlite/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEvE,IAAI,GAAG,GAA6B,IAAI,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,IAAI,GACR,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK;IACnB,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAEjC,GAAG,GAAG,EAAE,CAAC;IACT,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO;IACrB,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,GAAG,IAAI,CAAC;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite schema migrations for Night Watch CLI.
|
|
3
|
+
* Creates all required tables if they do not already exist (idempotent).
|
|
4
|
+
*/
|
|
5
|
+
import Database from "better-sqlite3";
|
|
6
|
+
/**
|
|
7
|
+
* Run all migrations against the provided database instance.
|
|
8
|
+
* Safe to call multiple times — all DDL statements use IF NOT EXISTS.
|
|
9
|
+
*/
|
|
10
|
+
export declare function runMigrations(db: Database.Database): void;
|
|
11
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../../src/storage/sqlite/migrations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAqFzD"}
|