@jonit-dev/night-watch-cli 1.5.8 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/cli.js +6 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/init.d.ts +13 -0
  4. package/dist/commands/init.d.ts.map +1 -1
  5. package/dist/commands/init.js +39 -11
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/install.d.ts +2 -0
  8. package/dist/commands/install.d.ts.map +1 -1
  9. package/dist/commands/install.js +23 -0
  10. package/dist/commands/install.js.map +1 -1
  11. package/dist/commands/slice.d.ts +26 -0
  12. package/dist/commands/slice.d.ts.map +1 -0
  13. package/dist/commands/slice.js +175 -0
  14. package/dist/commands/slice.js.map +1 -0
  15. package/dist/commands/state.d.ts +8 -0
  16. package/dist/commands/state.d.ts.map +1 -0
  17. package/dist/commands/state.js +56 -0
  18. package/dist/commands/state.js.map +1 -0
  19. package/dist/commands/uninstall.js +2 -2
  20. package/dist/commands/uninstall.js.map +1 -1
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +32 -1
  23. package/dist/config.js.map +1 -1
  24. package/dist/constants.d.ts +4 -0
  25. package/dist/constants.d.ts.map +1 -1
  26. package/dist/constants.js +7 -0
  27. package/dist/constants.js.map +1 -1
  28. package/dist/server/index.d.ts.map +1 -1
  29. package/dist/server/index.js +11 -13
  30. package/dist/server/index.js.map +1 -1
  31. package/dist/storage/json-state-migrator.d.ts +24 -0
  32. package/dist/storage/json-state-migrator.d.ts.map +1 -0
  33. package/dist/storage/json-state-migrator.js +197 -0
  34. package/dist/storage/json-state-migrator.js.map +1 -0
  35. package/dist/storage/repositories/index.d.ts +23 -0
  36. package/dist/storage/repositories/index.d.ts.map +1 -0
  37. package/dist/storage/repositories/index.js +37 -0
  38. package/dist/storage/repositories/index.js.map +1 -0
  39. package/dist/storage/repositories/interfaces.d.ts +37 -0
  40. package/dist/storage/repositories/interfaces.d.ts.map +1 -0
  41. package/dist/storage/repositories/interfaces.js +6 -0
  42. package/dist/storage/repositories/interfaces.js.map +1 -0
  43. package/dist/storage/repositories/sqlite/execution-history-repository.d.ts +21 -0
  44. package/dist/storage/repositories/sqlite/execution-history-repository.d.ts.map +1 -0
  45. package/dist/storage/repositories/sqlite/execution-history-repository.js +94 -0
  46. package/dist/storage/repositories/sqlite/execution-history-repository.js.map +1 -0
  47. package/dist/storage/repositories/sqlite/prd-state-repository.d.ts +17 -0
  48. package/dist/storage/repositories/sqlite/prd-state-repository.d.ts.map +1 -0
  49. package/dist/storage/repositories/sqlite/prd-state-repository.js +74 -0
  50. package/dist/storage/repositories/sqlite/prd-state-repository.js.map +1 -0
  51. package/dist/storage/repositories/sqlite/project-registry-repository.d.ts +16 -0
  52. package/dist/storage/repositories/sqlite/project-registry-repository.d.ts.map +1 -0
  53. package/dist/storage/repositories/sqlite/project-registry-repository.js +34 -0
  54. package/dist/storage/repositories/sqlite/project-registry-repository.js.map +1 -0
  55. package/dist/storage/repositories/sqlite/roadmap-state-repository.d.ts +14 -0
  56. package/dist/storage/repositories/sqlite/roadmap-state-repository.d.ts.map +1 -0
  57. package/dist/storage/repositories/sqlite/roadmap-state-repository.js +47 -0
  58. package/dist/storage/repositories/sqlite/roadmap-state-repository.js.map +1 -0
  59. package/dist/storage/sqlite/client.d.ts +23 -0
  60. package/dist/storage/sqlite/client.d.ts.map +1 -0
  61. package/dist/storage/sqlite/client.js +47 -0
  62. package/dist/storage/sqlite/client.js.map +1 -0
  63. package/dist/storage/sqlite/migrations.d.ts +11 -0
  64. package/dist/storage/sqlite/migrations.d.ts.map +1 -0
  65. package/dist/storage/sqlite/migrations.js +57 -0
  66. package/dist/storage/sqlite/migrations.js.map +1 -0
  67. package/dist/templates/slicer-prompt.d.ts +54 -0
  68. package/dist/templates/slicer-prompt.d.ts.map +1 -0
  69. package/dist/templates/slicer-prompt.js +163 -0
  70. package/dist/templates/slicer-prompt.js.map +1 -0
  71. package/dist/types.d.ts +6 -0
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/utils/execution-history.d.ts +11 -5
  74. package/dist/utils/execution-history.d.ts.map +1 -1
  75. package/dist/utils/execution-history.js +27 -130
  76. package/dist/utils/execution-history.js.map +1 -1
  77. package/dist/utils/prd-states.d.ts +1 -2
  78. package/dist/utils/prd-states.d.ts.map +1 -1
  79. package/dist/utils/prd-states.js +10 -42
  80. package/dist/utils/prd-states.js.map +1 -1
  81. package/dist/utils/registry.d.ts +9 -4
  82. package/dist/utils/registry.d.ts.map +1 -1
  83. package/dist/utils/registry.js +21 -33
  84. package/dist/utils/registry.js.map +1 -1
  85. package/dist/utils/roadmap-scanner.d.ts +34 -2
  86. package/dist/utils/roadmap-scanner.d.ts.map +1 -1
  87. package/dist/utils/roadmap-scanner.js +218 -105
  88. package/dist/utils/roadmap-scanner.js.map +1 -1
  89. package/dist/utils/roadmap-state.d.ts +13 -6
  90. package/dist/utils/roadmap-state.d.ts.map +1 -1
  91. package/dist/utils/roadmap-state.js +50 -27
  92. package/dist/utils/roadmap-state.js.map +1 -1
  93. package/package.json +6 -1
  94. package/scripts/night-watch-cron.sh +65 -24
  95. package/scripts/night-watch-slicer-cron.sh +90 -0
  96. package/templates/night-watch-slicer.md +219 -0
  97. package/templates/night-watch.config.json +1 -0
@@ -1,154 +1,53 @@
1
1
  /**
2
2
  * Execution history ledger for Night Watch CLI
3
- * Stores PRD execution records in ~/.night-watch/history.json
3
+ * Stores PRD execution records in the SQLite repository layer.
4
4
  * Decoupled from PRD file paths — keyed by project directory + PRD filename.
5
5
  */
6
- import * as fs from "fs";
7
6
  import * as os from "os";
8
7
  import * as path from "path";
9
8
  import { GLOBAL_CONFIG_DIR, HISTORY_FILE_NAME, MAX_HISTORY_RECORDS_PER_PRD, } from "../constants.js";
10
- const HISTORY_LOCK_SUFFIX = ".lock";
11
- const HISTORY_LOCK_TIMEOUT_MS = 5000;
12
- const HISTORY_LOCK_STALE_MS = 30000;
13
- const HISTORY_LOCK_POLL_MS = 25;
14
- const sleepState = new Int32Array(new SharedArrayBuffer(4));
9
+ import { getRepositories, resetRepositories } from "../storage/repositories/index.js";
10
+ import { closeDb } from "../storage/sqlite/client.js";
15
11
  /**
16
- * Get the path to the history file
12
+ * Get the path to the history file.
13
+ * Kept for backward compatibility.
17
14
  */
18
15
  export function getHistoryPath() {
19
16
  const base = process.env.NIGHT_WATCH_HOME || path.join(os.homedir(), GLOBAL_CONFIG_DIR);
20
17
  return path.join(base, HISTORY_FILE_NAME);
21
18
  }
22
- function sleepMs(ms) {
23
- Atomics.wait(sleepState, 0, 0, ms);
24
- }
25
- function acquireHistoryLock(historyPath) {
26
- const lockPath = `${historyPath}${HISTORY_LOCK_SUFFIX}`;
27
- fs.mkdirSync(path.dirname(lockPath), { recursive: true });
28
- const deadline = Date.now() + HISTORY_LOCK_TIMEOUT_MS;
29
- while (true) {
30
- try {
31
- return fs.openSync(lockPath, "wx");
32
- }
33
- catch (error) {
34
- const err = error;
35
- if (err.code !== "EEXIST") {
36
- throw err;
37
- }
38
- try {
39
- const lockStats = fs.statSync(lockPath);
40
- if (Date.now() - lockStats.mtimeMs > HISTORY_LOCK_STALE_MS) {
41
- fs.unlinkSync(lockPath);
42
- continue;
43
- }
44
- }
45
- catch {
46
- // Lock may have disappeared between checks; retry.
47
- }
48
- if (Date.now() >= deadline) {
49
- throw new Error(`Timed out acquiring execution history lock: ${lockPath}`);
50
- }
51
- sleepMs(HISTORY_LOCK_POLL_MS);
52
- }
53
- }
54
- }
55
- function releaseHistoryLock(lockFd, historyPath) {
56
- const lockPath = `${historyPath}${HISTORY_LOCK_SUFFIX}`;
57
- try {
58
- fs.closeSync(lockFd);
59
- }
60
- catch {
61
- // Ignore close errors; lock cleanup still attempted.
62
- }
63
- try {
64
- fs.unlinkSync(lockPath);
65
- }
66
- catch {
67
- // Ignore lock cleanup errors.
68
- }
69
- }
70
- function loadHistoryFromPath(historyPath) {
71
- if (!fs.existsSync(historyPath)) {
72
- return {};
73
- }
74
- try {
75
- const content = fs.readFileSync(historyPath, "utf-8");
76
- const parsed = JSON.parse(content);
77
- if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
78
- return {};
79
- }
80
- return parsed;
81
- }
82
- catch {
83
- return {};
84
- }
85
- }
86
- function saveHistoryAtomic(historyPath, history) {
87
- const dir = path.dirname(historyPath);
88
- fs.mkdirSync(dir, { recursive: true });
89
- const tmpPath = path.join(dir, `${HISTORY_FILE_NAME}.${process.pid}.${Date.now()}.tmp`);
90
- try {
91
- fs.writeFileSync(tmpPath, JSON.stringify(history, null, 2) + "\n");
92
- fs.renameSync(tmpPath, historyPath);
93
- }
94
- finally {
95
- if (fs.existsSync(tmpPath)) {
96
- fs.rmSync(tmpPath, { force: true });
97
- }
98
- }
99
- }
100
19
  /**
101
- * Load execution history from disk. Returns empty object if missing or invalid.
20
+ * Load execution history from the SQLite repository.
21
+ * Returns the full IExecutionHistory structure reconstructed from the DB.
102
22
  */
103
23
  export function loadHistory() {
104
- return loadHistoryFromPath(getHistoryPath());
24
+ const { executionHistory } = getRepositories();
25
+ return executionHistory.getAllHistory();
105
26
  }
106
27
  /**
107
- * Save execution history to disk.
28
+ * Save execution history to the repository.
29
+ * Full replace: clears all existing records then inserts all records from the
30
+ * provided IExecutionHistory structure in a single transaction.
108
31
  */
109
32
  export function saveHistory(history) {
110
- const historyPath = getHistoryPath();
111
- const lockFd = acquireHistoryLock(historyPath);
112
- try {
113
- saveHistoryAtomic(historyPath, history);
114
- }
115
- finally {
116
- releaseHistoryLock(lockFd, historyPath);
117
- }
33
+ const { executionHistory } = getRepositories();
34
+ executionHistory.replaceAll(history);
118
35
  }
119
36
  /**
120
37
  * Record a PRD execution result.
121
38
  * Appends a record and trims to MAX_HISTORY_RECORDS_PER_PRD.
122
39
  */
123
40
  export function recordExecution(projectDir, prdFile, outcome, exitCode, attempt = 1) {
124
- const historyPath = getHistoryPath();
125
- const lockFd = acquireHistoryLock(historyPath);
126
41
  const resolved = path.resolve(projectDir);
127
- try {
128
- const history = loadHistoryFromPath(historyPath);
129
- if (!history[resolved]) {
130
- history[resolved] = {};
131
- }
132
- if (!history[resolved][prdFile]) {
133
- history[resolved][prdFile] = { records: [] };
134
- }
135
- const record = {
136
- timestamp: Math.floor(Date.now() / 1000),
137
- outcome,
138
- exitCode,
139
- attempt,
140
- };
141
- history[resolved][prdFile].records.push(record);
142
- // Trim to max records (keep most recent)
143
- const records = history[resolved][prdFile].records;
144
- if (records.length > MAX_HISTORY_RECORDS_PER_PRD) {
145
- history[resolved][prdFile].records = records.slice(records.length - MAX_HISTORY_RECORDS_PER_PRD);
146
- }
147
- saveHistoryAtomic(historyPath, history);
148
- }
149
- finally {
150
- releaseHistoryLock(lockFd, historyPath);
151
- }
42
+ const { executionHistory } = getRepositories();
43
+ const record = {
44
+ timestamp: Math.floor(Date.now() / 1000),
45
+ outcome,
46
+ exitCode,
47
+ attempt,
48
+ };
49
+ executionHistory.addRecord(resolved, prdFile, record);
50
+ executionHistory.trimRecords(resolved, prdFile, MAX_HISTORY_RECORDS_PER_PRD);
152
51
  }
153
52
  /**
154
53
  * Get the most recent execution record for a PRD.
@@ -156,12 +55,9 @@ export function recordExecution(projectDir, prdFile, outcome, exitCode, attempt
156
55
  */
157
56
  export function getLastExecution(projectDir, prdFile) {
158
57
  const resolved = path.resolve(projectDir);
159
- const history = loadHistory();
160
- const prdHistory = history[resolved]?.[prdFile];
161
- if (!prdHistory || prdHistory.records.length === 0) {
162
- return null;
163
- }
164
- return prdHistory.records[prdHistory.records.length - 1];
58
+ const { executionHistory } = getRepositories();
59
+ const records = executionHistory.getRecords(resolved, prdFile);
60
+ return records.length > 0 ? records[0] : null;
165
61
  }
166
62
  /**
167
63
  * Check if a PRD is in cooldown after a recent non-success execution.
@@ -180,4 +76,5 @@ export function isInCooldown(projectDir, prdFile, cooldownPeriod) {
180
76
  const age = now - last.timestamp;
181
77
  return age < cooldownPeriod;
182
78
  }
79
+ export { closeDb, resetRepositories };
183
80
  //# sourceMappingURL=execution-history.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"execution-history.js","sourceRoot":"","sources":["../../src/utils/execution-history.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"execution-history.js","sourceRoot":"","sources":["../../src/utils/execution-history.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * PRD state persistence for Night Watch CLI
3
- * Tracks pending-review (and future) PRD states in ~/.night-watch/prd-states.json
4
- * so PRD files do not need to move directories.
3
+ * Tracks pending-review (and future) PRD states via the SQLite repository layer.
5
4
  */
6
5
  export interface IPrdStateEntry {
7
6
  status: "pending-review";
@@ -1 +1 @@
1
- {"version":3,"file":"prd-states.d.ts","sourceRoot":"","sources":["../../src/utils/prd-states.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAMxE,wBAAgB,aAAa,IAAI,UAAU,CAW1C;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAGzF;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,cAAc,GACpB,IAAI,CAWN;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAYvE;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,GACvB,MAAM,EAAE,CAKV"}
1
+ {"version":3,"file":"prd-states.d.ts","sourceRoot":"","sources":["../../src/utils/prd-states.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAExE,wBAAgB,aAAa,IAAI,UAAU,CAG1C;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAGzF;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,cAAc,GACpB,IAAI,CAGN;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGvE;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,GACvB,MAAM,EAAE,CAKV"}
@@ -1,55 +1,23 @@
1
1
  /**
2
2
  * PRD state persistence for Night Watch CLI
3
- * Tracks pending-review (and future) PRD states in ~/.night-watch/prd-states.json
4
- * so PRD files do not need to move directories.
3
+ * Tracks pending-review (and future) PRD states via the SQLite repository layer.
5
4
  */
6
- import * as fs from "fs";
7
- import * as os from "os";
8
- import * as path from "path";
9
- import { GLOBAL_CONFIG_DIR, PRD_STATES_FILE_NAME } from "../constants.js";
10
- function prdStatesPath() {
11
- return path.join(os.homedir(), GLOBAL_CONFIG_DIR, PRD_STATES_FILE_NAME);
12
- }
5
+ import { getRepositories } from "../storage/repositories/index.js";
13
6
  export function readPrdStates() {
14
- const filePath = prdStatesPath();
15
- if (!fs.existsSync(filePath)) {
16
- return {};
17
- }
18
- try {
19
- const raw = fs.readFileSync(filePath, "utf-8");
20
- return JSON.parse(raw);
21
- }
22
- catch {
23
- return {};
24
- }
7
+ const { prdState } = getRepositories();
8
+ return prdState.readAll();
25
9
  }
26
10
  export function getPrdStatesForProject(projectDir) {
27
- const all = readPrdStates();
28
- return all[projectDir] ?? {};
11
+ const { prdState } = getRepositories();
12
+ return prdState.getAll(projectDir);
29
13
  }
30
14
  export function writePrdState(projectDir, prdName, entry) {
31
- const filePath = prdStatesPath();
32
- const dir = path.dirname(filePath);
33
- fs.mkdirSync(dir, { recursive: true });
34
- const all = readPrdStates();
35
- if (!all[projectDir]) {
36
- all[projectDir] = {};
37
- }
38
- all[projectDir][prdName] = entry;
39
- fs.writeFileSync(filePath, JSON.stringify(all, null, 2), "utf-8");
15
+ const { prdState } = getRepositories();
16
+ prdState.set(projectDir, prdName, entry);
40
17
  }
41
18
  export function clearPrdState(projectDir, prdName) {
42
- const filePath = prdStatesPath();
43
- if (!fs.existsSync(filePath))
44
- return;
45
- const all = readPrdStates();
46
- if (!all[projectDir])
47
- return;
48
- delete all[projectDir][prdName];
49
- if (Object.keys(all[projectDir]).length === 0) {
50
- delete all[projectDir];
51
- }
52
- fs.writeFileSync(filePath, JSON.stringify(all, null, 2), "utf-8");
19
+ const { prdState } = getRepositories();
20
+ prdState.delete(projectDir, prdName);
53
21
  }
54
22
  export function listPrdStatesByStatus(projectDir, status) {
55
23
  const states = getPrdStatesForProject(projectDir);
@@ -1 +1 @@
1
- {"version":3,"file":"prd-states.js","sourceRoot":"","sources":["../../src/utils/prd-states.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prd-states.js","sourceRoot":"","sources":["../../src/utils/prd-states.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAUnE,MAAM,UAAU,aAAa;IAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACvC,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACvC,OAAO,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,UAAkB,EAClB,OAAe,EACf,KAAqB;IAErB,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACvC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,OAAe;IAC/D,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,UAAkB,EAClB,MAAwB;IAExB,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC;SAC9C,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -1,21 +1,25 @@
1
1
  /**
2
2
  * Global project registry for Night Watch CLI
3
- * Manages ~/.night-watch/projects.json to track all registered projects
3
+ * Manages project entries via the SQLite repository layer.
4
4
  */
5
+ import { resetRepositories } from "../storage/repositories/index.js";
6
+ import { closeDb } from "../storage/sqlite/client.js";
5
7
  export interface IRegistryEntry {
6
8
  name: string;
7
9
  path: string;
8
10
  }
9
11
  /**
10
- * Get the path to the global registry file
12
+ * Get the path to the global registry file.
13
+ * Kept for backward compatibility.
11
14
  */
12
15
  export declare function getRegistryPath(): string;
13
16
  /**
14
- * Load the global registry, returning [] if the file does not exist
17
+ * Load all registry entries from the SQLite repository.
15
18
  */
16
19
  export declare function loadRegistry(): IRegistryEntry[];
17
20
  /**
18
- * Save the registry (full replace)
21
+ * Save a full set of registry entries (full replace).
22
+ * Deletes all existing entries then upserts each provided entry in a transaction.
19
23
  */
20
24
  export declare function saveRegistry(entries: IRegistryEntry[]): void;
21
25
  /**
@@ -36,4 +40,5 @@ export declare function validateRegistry(): {
36
40
  valid: IRegistryEntry[];
37
41
  invalid: IRegistryEntry[];
38
42
  };
43
+ export { closeDb, resetRepositories };
39
44
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,cAAc,EAAE,CAe/C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CAK5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAmBlE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAS7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,CAczF"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAmB,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAGtD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,cAAc,EAAE,CAG/C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CAM5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAmBlE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAI7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,CAczF;AAED,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -1,47 +1,39 @@
1
1
  /**
2
2
  * Global project registry for Night Watch CLI
3
- * Manages ~/.night-watch/projects.json to track all registered projects
3
+ * Manages project entries via the SQLite repository layer.
4
4
  */
5
5
  import * as fs from "fs";
6
6
  import * as os from "os";
7
7
  import * as path from "path";
8
8
  import { CONFIG_FILE_NAME, GLOBAL_CONFIG_DIR, REGISTRY_FILE_NAME } from "../constants.js";
9
+ import { getRepositories, resetRepositories } from "../storage/repositories/index.js";
10
+ import { closeDb } from "../storage/sqlite/client.js";
9
11
  import { getProjectName } from "./status-data.js";
10
12
  /**
11
- * Get the path to the global registry file
13
+ * Get the path to the global registry file.
14
+ * Kept for backward compatibility.
12
15
  */
13
16
  export function getRegistryPath() {
14
17
  const base = process.env.NIGHT_WATCH_HOME || path.join(os.homedir(), GLOBAL_CONFIG_DIR);
15
18
  return path.join(base, REGISTRY_FILE_NAME);
16
19
  }
17
20
  /**
18
- * Load the global registry, returning [] if the file does not exist
21
+ * Load all registry entries from the SQLite repository.
19
22
  */
20
23
  export function loadRegistry() {
21
- const registryPath = getRegistryPath();
22
- if (!fs.existsSync(registryPath)) {
23
- return [];
24
- }
25
- try {
26
- const content = fs.readFileSync(registryPath, "utf-8");
27
- const parsed = JSON.parse(content);
28
- if (!Array.isArray(parsed)) {
29
- return [];
30
- }
31
- return parsed;
32
- }
33
- catch {
34
- return [];
35
- }
24
+ const { projectRegistry } = getRepositories();
25
+ return projectRegistry.getAll();
36
26
  }
37
27
  /**
38
- * Save the registry (full replace)
28
+ * Save a full set of registry entries (full replace).
29
+ * Deletes all existing entries then upserts each provided entry in a transaction.
39
30
  */
40
31
  export function saveRegistry(entries) {
41
- const registryPath = getRegistryPath();
42
- const dir = path.dirname(registryPath);
43
- fs.mkdirSync(dir, { recursive: true });
44
- fs.writeFileSync(registryPath, JSON.stringify(entries, null, 2) + "\n");
32
+ const { projectRegistry } = getRepositories();
33
+ projectRegistry.clear();
34
+ for (const entry of entries) {
35
+ projectRegistry.upsert(entry);
36
+ }
45
37
  }
46
38
  /**
47
39
  * Register a project in the global registry.
@@ -49,7 +41,8 @@ export function saveRegistry(entries) {
49
41
  */
50
42
  export function registerProject(projectDir) {
51
43
  const resolvedPath = path.resolve(projectDir);
52
- const entries = loadRegistry();
44
+ const { projectRegistry } = getRepositories();
45
+ const entries = projectRegistry.getAll();
53
46
  const existing = entries.find((e) => e.path === resolvedPath);
54
47
  if (existing) {
55
48
  return existing;
@@ -59,8 +52,7 @@ export function registerProject(projectDir) {
59
52
  const nameExists = entries.some((e) => e.name === name);
60
53
  const finalName = nameExists ? `${name}-${path.basename(resolvedPath)}` : name;
61
54
  const entry = { name: finalName, path: resolvedPath };
62
- entries.push(entry);
63
- saveRegistry(entries);
55
+ projectRegistry.upsert(entry);
64
56
  return entry;
65
57
  }
66
58
  /**
@@ -69,13 +61,8 @@ export function registerProject(projectDir) {
69
61
  */
70
62
  export function unregisterProject(projectDir) {
71
63
  const resolvedPath = path.resolve(projectDir);
72
- const entries = loadRegistry();
73
- const filtered = entries.filter((e) => e.path !== resolvedPath);
74
- if (filtered.length === entries.length) {
75
- return false;
76
- }
77
- saveRegistry(filtered);
78
- return true;
64
+ const { projectRegistry } = getRepositories();
65
+ return projectRegistry.remove(resolvedPath);
79
66
  }
80
67
  /**
81
68
  * Validate all registry entries.
@@ -95,4 +82,5 @@ export function validateRegistry() {
95
82
  }
96
83
  return { valid, invalid };
97
84
  }
85
+ export { closeDb, resetRepositories };
98
86
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,19 @@ export interface IScanResult {
37
37
  /** List of errors encountered */
38
38
  errors: string[];
39
39
  }
40
+ /**
41
+ * Result of slicing a single roadmap item
42
+ */
43
+ export interface ISliceResult {
44
+ /** Whether slicing was successful */
45
+ sliced: boolean;
46
+ /** The created PRD file path (relative to PRD dir) */
47
+ file?: string;
48
+ /** Error message if slicing failed */
49
+ error?: string;
50
+ /** The roadmap item that was processed */
51
+ item?: IRoadmapItem;
52
+ }
40
53
  /**
41
54
  * Get the current status of the roadmap scanner
42
55
  *
@@ -46,13 +59,32 @@ export interface IScanResult {
46
59
  */
47
60
  export declare function getRoadmapStatus(projectDir: string, config: INightWatchConfig): IRoadmapStatus;
48
61
  /**
49
- * Scan the roadmap and create PRD files for unprocessed items
62
+ * Slice a single roadmap item into a PRD using the AI provider
63
+ *
64
+ * @param projectDir - The project directory
65
+ * @param prdDir - The PRD directory
66
+ * @param item - The roadmap item to slice
67
+ * @param config - The Night Watch configuration
68
+ * @returns The slice result
69
+ */
70
+ export declare function sliceRoadmapItem(projectDir: string, prdDir: string, item: IRoadmapItem, config: INightWatchConfig): Promise<ISliceResult>;
71
+ /**
72
+ * Slice the next unprocessed roadmap item
73
+ *
74
+ * @param projectDir - The project directory
75
+ * @param config - The Night Watch configuration
76
+ * @returns The slice result
77
+ */
78
+ export declare function sliceNextItem(projectDir: string, config: INightWatchConfig): Promise<ISliceResult>;
79
+ /**
80
+ * Scan the roadmap and slice ONE item
81
+ * This is now async and processes only a single item per call
50
82
  *
51
83
  * @param projectDir - The project directory
52
84
  * @param config - The Night Watch configuration
53
85
  * @returns The scan result with created, skipped, and error lists
54
86
  */
55
- export declare function scanRoadmap(projectDir: string, config: INightWatchConfig): IScanResult;
87
+ export declare function scanRoadmap(projectDir: string, config: INightWatchConfig): Promise<IScanResult>;
56
88
  /**
57
89
  * Check if there are new (unprocessed) items in the roadmap
58
90
  */
@@ -1 +1 @@
1
- {"version":3,"file":"roadmap-scanner.d.ts","sourceRoot":"","sources":["../../src/utils/roadmap-scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAgB,MAAM,qBAAqB,CAAC;AASjE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;IACrE,+CAA+C;IAC/C,KAAK,EAAE,KAAK,CAAC,YAAY,GAAG;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvE;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iCAAiC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,GACxB,cAAc,CA+EhB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,GACxB,WAAW,CAsFb;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAGT"}
1
+ {"version":3,"file":"roadmap-scanner.d.ts","sourceRoot":"","sources":["../../src/utils/roadmap-scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,iBAAiB,EAAY,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAgB,MAAM,qBAAqB,CAAC;AAajE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;IACrE,+CAA+C;IAC/C,KAAK,EAAE,KAAK,CAAC,YAAY,GAAG;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvE;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iCAAiC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,qCAAqC;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,GACxB,cAAc,CA+EhB;AA8CD;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,YAAY,CAAC,CAiHvB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,YAAY,CAAC,CAqFvB;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,WAAW,CAAC,CA2BtB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAGT"}