@jonit-dev/night-watch-cli 1.5.9 → 1.7.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 (100) 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 +9 -4
  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
  98. package/web/dist/assets/{index-CP0r6Epl.js → index-D4AfwSvr.js} +52 -52
  99. package/web/dist/assets/index-Dx_ZY5CY.css +1 -0
  100. package/web/dist/index.html +2 -2
@@ -4,10 +4,11 @@
4
4
  */
5
5
  import * as fs from "fs";
6
6
  import * as path from "path";
7
+ import { spawn } from "child_process";
7
8
  import { getNextPrdNumber, slugify } from "../commands/prd.js";
8
- import { renderPrdTemplate } from "../templates/prd-template.js";
9
9
  import { parseRoadmap } from "./roadmap-parser.js";
10
10
  import { isItemProcessed, loadRoadmapState, markItemProcessed, saveRoadmapState, } from "./roadmap-state.js";
11
+ import { createSlicerPromptVars, renderSlicerPrompt, } from "../templates/slicer-prompt.js";
11
12
  /**
12
13
  * Get the current status of the roadmap scanner
13
14
  *
@@ -84,153 +85,265 @@ export function getRoadmapStatus(projectDir, config) {
84
85
  };
85
86
  }
86
87
  /**
87
- * Scan the roadmap and create PRD files for unprocessed items
88
+ * Scan existing PRD files and extract their slugs for duplicate detection
89
+ */
90
+ function scanExistingPrdSlugs(prdDir) {
91
+ const slugs = new Set();
92
+ if (!fs.existsSync(prdDir)) {
93
+ return slugs;
94
+ }
95
+ const files = fs.readdirSync(prdDir);
96
+ for (const file of files) {
97
+ // Skip non-markdown files and special files
98
+ if (!file.endsWith(".md") || file === "NIGHT-WATCH-SUMMARY.md") {
99
+ continue;
100
+ }
101
+ // Extract slug from filename (e.g., "01-feature-name.md" -> "feature-name")
102
+ const match = file.match(/^\d+-(.+)\.md$/);
103
+ if (match) {
104
+ slugs.add(match[1]);
105
+ }
106
+ else {
107
+ // Handle files without number prefix
108
+ const slugMatch = file.match(/^(.+)\.md$/);
109
+ if (slugMatch) {
110
+ slugs.add(slugMatch[1]);
111
+ }
112
+ }
113
+ }
114
+ return slugs;
115
+ }
116
+ /**
117
+ * Build provider CLI arguments based on provider type
118
+ */
119
+ function buildProviderArgs(provider, prompt) {
120
+ if (provider === "codex") {
121
+ return ["--quiet", "--yolo", "--prompt", prompt];
122
+ }
123
+ // Default: claude
124
+ return ["-p", prompt, "--dangerously-skip-permissions"];
125
+ }
126
+ /**
127
+ * Slice a single roadmap item into a PRD using the AI provider
88
128
  *
89
129
  * @param projectDir - The project directory
130
+ * @param prdDir - The PRD directory
131
+ * @param item - The roadmap item to slice
90
132
  * @param config - The Night Watch configuration
91
- * @returns The scan result with created, skipped, and error lists
133
+ * @returns The slice result
92
134
  */
93
- export function scanRoadmap(projectDir, config) {
94
- const result = {
95
- created: [],
96
- skipped: [],
97
- errors: [],
98
- };
99
- // Check if enabled
135
+ export async function sliceRoadmapItem(projectDir, prdDir, item, config) {
136
+ // Check for duplicate by slug
137
+ const itemSlug = slugify(item.title);
138
+ const existingPrdSlugs = scanExistingPrdSlugs(prdDir);
139
+ if (existingPrdSlugs.has(itemSlug)) {
140
+ return {
141
+ sliced: false,
142
+ error: `Duplicate detected: PRD with slug "${itemSlug}" already exists`,
143
+ item,
144
+ };
145
+ }
146
+ // Compute next PRD number and filename
147
+ const nextNum = getNextPrdNumber(prdDir);
148
+ const padded = String(nextNum).padStart(2, "0");
149
+ const filename = `${padded}-${itemSlug}.md`;
150
+ const filePath = path.join(prdDir, filename);
151
+ // Ensure PRD directory exists
152
+ if (!fs.existsSync(prdDir)) {
153
+ fs.mkdirSync(prdDir, { recursive: true });
154
+ }
155
+ // Build slicer prompt
156
+ const promptVars = createSlicerPromptVars(item.title, item.section, item.description, prdDir, filename);
157
+ const prompt = renderSlicerPrompt(promptVars);
158
+ // Spawn the AI provider
159
+ const providerArgs = buildProviderArgs(config.provider, prompt);
160
+ // Create log file for stdout/stderr
161
+ const logDir = path.join(projectDir, "logs");
162
+ if (!fs.existsSync(logDir)) {
163
+ fs.mkdirSync(logDir, { recursive: true });
164
+ }
165
+ const logFile = path.join(logDir, `slicer-${itemSlug}.log`);
166
+ const logStream = fs.createWriteStream(logFile, { flags: "w" });
167
+ // Handle log stream errors silently (don't fail the slice on logging errors)
168
+ logStream.on("error", () => {
169
+ // Silently ignore log file errors - the main operation is more important
170
+ });
171
+ return new Promise((resolve) => {
172
+ // Merge providerEnv with process.env
173
+ const childEnv = {
174
+ ...process.env,
175
+ ...config.providerEnv,
176
+ };
177
+ const child = spawn(config.provider, providerArgs, {
178
+ env: childEnv,
179
+ cwd: projectDir,
180
+ stdio: ["inherit", "pipe", "pipe"],
181
+ });
182
+ // Pipe stdout to log file
183
+ child.stdout?.on("data", (data) => {
184
+ logStream.write(data);
185
+ });
186
+ // Pipe stderr to log file
187
+ child.stderr?.on("data", (data) => {
188
+ logStream.write(data);
189
+ });
190
+ // Handle process errors
191
+ child.on("error", (error) => {
192
+ logStream.end();
193
+ resolve({
194
+ sliced: false,
195
+ error: `Failed to spawn provider: ${error.message}`,
196
+ item,
197
+ });
198
+ });
199
+ // Handle process completion
200
+ child.on("close", (code) => {
201
+ logStream.end();
202
+ if (code !== 0) {
203
+ resolve({
204
+ sliced: false,
205
+ error: `Provider exited with code ${code ?? 1}`,
206
+ item,
207
+ });
208
+ return;
209
+ }
210
+ // Verify output file was created
211
+ if (!fs.existsSync(filePath)) {
212
+ resolve({
213
+ sliced: false,
214
+ error: `Provider did not create expected file: ${filePath}`,
215
+ item,
216
+ });
217
+ return;
218
+ }
219
+ resolve({
220
+ sliced: true,
221
+ file: filename,
222
+ item,
223
+ });
224
+ });
225
+ });
226
+ }
227
+ /**
228
+ * Slice the next unprocessed roadmap item
229
+ *
230
+ * @param projectDir - The project directory
231
+ * @param config - The Night Watch configuration
232
+ * @returns The slice result
233
+ */
234
+ export async function sliceNextItem(projectDir, config) {
235
+ // Check if scanner is enabled
100
236
  if (!config.roadmapScanner.enabled) {
101
- return result;
237
+ return {
238
+ sliced: false,
239
+ error: "Roadmap scanner is disabled",
240
+ };
102
241
  }
103
242
  const roadmapPath = path.join(projectDir, config.roadmapScanner.roadmapPath);
104
243
  // Check if roadmap file exists
105
244
  if (!fs.existsSync(roadmapPath)) {
106
- return result;
245
+ return {
246
+ sliced: false,
247
+ error: "ROADMAP.md not found",
248
+ };
107
249
  }
108
250
  // Parse roadmap
109
251
  const content = fs.readFileSync(roadmapPath, "utf-8");
110
252
  const items = parseRoadmap(content);
111
253
  if (items.length === 0) {
112
- return result;
254
+ return {
255
+ sliced: false,
256
+ error: "No items in roadmap",
257
+ };
113
258
  }
114
259
  // Setup PRD directory
115
260
  const prdDir = path.join(projectDir, config.prdDir);
116
- if (!fs.existsSync(prdDir)) {
117
- fs.mkdirSync(prdDir, { recursive: true });
118
- }
119
261
  // Load state
120
- let state = loadRoadmapState(prdDir);
121
- // Scan existing PRD files for title-based duplicate detection
262
+ const state = loadRoadmapState(prdDir);
263
+ // Scan existing PRD files for duplicate detection
122
264
  const existingPrdSlugs = scanExistingPrdSlugs(prdDir);
123
- // Process each item
265
+ // Find first unprocessed, unchecked, non-duplicate item
266
+ let targetItem;
124
267
  for (const item of items) {
125
- // Skip checked items (completed in roadmap)
268
+ // Skip checked items
126
269
  if (item.checked) {
127
- result.skipped.push(`${item.title} (checked)`);
128
270
  continue;
129
271
  }
130
272
  // Skip already processed items
131
273
  if (isItemProcessed(state, item.hash)) {
132
- result.skipped.push(`${item.title} (processed)`);
133
274
  continue;
134
275
  }
135
- // Skip items that have a PRD with matching title
276
+ // Skip duplicates by title
136
277
  const itemSlug = slugify(item.title);
137
278
  if (existingPrdSlugs.has(itemSlug)) {
138
- result.skipped.push(`${item.title} (duplicate by title)`);
139
279
  continue;
140
280
  }
141
- try {
142
- // Generate PRD file
143
- const prdFile = createPrdFromItem(prdDir, item);
144
- // Update state
145
- const stateItem = {
146
- title: item.title,
147
- prdFile,
148
- createdAt: new Date().toISOString(),
149
- };
150
- state = markItemProcessed(state, item.hash, stateItem);
151
- // Add to existing slugs to prevent duplicates in same scan
152
- existingPrdSlugs.add(itemSlug);
153
- result.created.push(prdFile);
154
- }
155
- catch (error) {
156
- const errorMessage = error instanceof Error ? error.message : String(error);
157
- result.errors.push(`${item.title}: ${errorMessage}`);
158
- }
281
+ targetItem = item;
282
+ break;
283
+ }
284
+ if (!targetItem) {
285
+ return {
286
+ sliced: false,
287
+ error: "No pending items to process",
288
+ };
289
+ }
290
+ // Slice the item
291
+ const result = await sliceRoadmapItem(projectDir, prdDir, targetItem, config);
292
+ // On success, update state
293
+ if (result.sliced && result.file) {
294
+ let updatedState = loadRoadmapState(prdDir);
295
+ const stateItem = {
296
+ title: targetItem.title,
297
+ prdFile: result.file,
298
+ createdAt: new Date().toISOString(),
299
+ };
300
+ updatedState = markItemProcessed(updatedState, targetItem.hash, stateItem);
301
+ saveRoadmapState(prdDir, updatedState);
159
302
  }
160
- // Save state
161
- saveRoadmapState(prdDir, state);
162
303
  return result;
163
304
  }
164
305
  /**
165
- * Check if there are new (unprocessed) items in the roadmap
166
- */
167
- export function hasNewItems(projectDir, config) {
168
- const status = getRoadmapStatus(projectDir, config);
169
- return status.pendingItems > 0;
170
- }
171
- /**
172
- * Scan existing PRD files and extract their slugs for duplicate detection
306
+ * Scan the roadmap and slice ONE item
307
+ * This is now async and processes only a single item per call
308
+ *
309
+ * @param projectDir - The project directory
310
+ * @param config - The Night Watch configuration
311
+ * @returns The scan result with created, skipped, and error lists
173
312
  */
174
- function scanExistingPrdSlugs(prdDir) {
175
- const slugs = new Set();
176
- if (!fs.existsSync(prdDir)) {
177
- return slugs;
313
+ export async function scanRoadmap(projectDir, config) {
314
+ const result = {
315
+ created: [],
316
+ skipped: [],
317
+ errors: [],
318
+ };
319
+ // Slice just one item
320
+ const sliceResult = await sliceNextItem(projectDir, config);
321
+ if (sliceResult.sliced && sliceResult.file) {
322
+ result.created.push(sliceResult.file);
178
323
  }
179
- const files = fs.readdirSync(prdDir);
180
- for (const file of files) {
181
- // Skip non-markdown files and special files
182
- if (!file.endsWith(".md") || file === "NIGHT-WATCH-SUMMARY.md") {
183
- continue;
324
+ else if (sliceResult.item) {
325
+ // Item was found but not sliced
326
+ if (sliceResult.error?.includes("checked")) {
327
+ result.skipped.push(`${sliceResult.item.title} (checked)`);
184
328
  }
185
- // Extract slug from filename (e.g., "01-feature-name.md" -> "feature-name")
186
- const match = file.match(/^\d+-(.+)\.md$/);
187
- if (match) {
188
- slugs.add(match[1]);
329
+ else if (sliceResult.error?.includes("processed")) {
330
+ result.skipped.push(`${sliceResult.item.title} (processed)`);
189
331
  }
190
- else {
191
- // Handle files without number prefix
192
- const slugMatch = file.match(/^(.+)\.md$/);
193
- if (slugMatch) {
194
- slugs.add(slugMatch[1]);
195
- }
332
+ else if (sliceResult.error?.includes("duplicate")) {
333
+ result.skipped.push(`${sliceResult.item.title} (duplicate)`);
334
+ }
335
+ else if (sliceResult.error) {
336
+ result.errors.push(`${sliceResult.item.title}: ${sliceResult.error}`);
196
337
  }
197
338
  }
198
- return slugs;
339
+ // If no item was found (all done or no items), return empty result
340
+ return result;
199
341
  }
200
342
  /**
201
- * Create a PRD file from a roadmap item
202
- *
203
- * @param prdDir - The PRD directory
204
- * @param item - The roadmap item
205
- * @returns The filename of the created PRD
343
+ * Check if there are new (unprocessed) items in the roadmap
206
344
  */
207
- function createPrdFromItem(prdDir, item) {
208
- // Get next PRD number
209
- const nextNum = getNextPrdNumber(prdDir);
210
- const padded = String(nextNum).padStart(2, "0");
211
- // Generate filename
212
- const slug = slugify(item.title);
213
- const filename = `${padded}-${slug}.md`;
214
- const filePath = path.join(prdDir, filename);
215
- // Render PRD template
216
- const prdContent = renderPrdTemplate({
217
- title: item.title,
218
- dependsOn: [],
219
- complexityScore: 5,
220
- complexityLevel: "MEDIUM",
221
- complexityBreakdown: [],
222
- phaseCount: 3,
223
- });
224
- // Prepend roadmap context comment
225
- const roadmapContext = `<!-- Roadmap Context:
226
- Section: ${item.section}
227
- Description: ${item.description}
228
- -->
229
-
230
- `;
231
- const fullContent = roadmapContext + prdContent;
232
- // Write file
233
- fs.writeFileSync(filePath, fullContent, "utf-8");
234
- return filename;
345
+ export function hasNewItems(projectDir, config) {
346
+ const status = getRoadmapStatus(projectDir, config);
347
+ return status.pendingItems > 0;
235
348
  }
236
349
  //# sourceMappingURL=roadmap-scanner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"roadmap-scanner.js","sourceRoot":"","sources":["../../src/utils/roadmap-scanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"roadmap-scanner.js","sourceRoot":"","sources":["../../src/utils/roadmap-scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAgB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAEL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AAgDvC;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAkB,EAClB,MAAyB;IAEzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAE7E,mBAAmB;IACnB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QACnC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,CAAC;YACb,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,CAAC;YACf,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,CAAC;YACb,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,CAAC;YACf,MAAM,EAAE,YAAY;YACpB,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEpC,aAAa;IACb,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEvC,8DAA8D;IAC9D,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEtD,qBAAqB;IACrB,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzC,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;QAExE,OAAO;YACL,GAAG,IAAI;YACP,SAAS,EAAE,SAAS,IAAI,kBAAkB;YAC1C,OAAO,EAAE,SAAS,EAAE,OAAO;SAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAC9B,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CACrC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,CAC3C,CAAC,MAAM,CAAC;IAET,mBAAmB;IACnB,IAAI,MAAgC,CAAC;IACrC,IAAI,YAAY,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,MAAM,GAAG,UAAU,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,CAAC;IAClB,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,KAAK,CAAC,MAAM;QACxB,cAAc;QACd,YAAY;QACZ,MAAM;QACN,KAAK,EAAE,WAAW;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,MAAc;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,4CAA4C;QAC5C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,wBAAwB,EAAE,CAAC;YAC/D,SAAS;QACX,CAAC;QAED,4EAA4E;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,QAAkB,EAAE,MAAc;IAC3D,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IACD,kBAAkB;IAClB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,gCAAgC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,MAAc,EACd,IAAkB,EAClB,MAAyB;IAEzB,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEtD,IAAI,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO;YACL,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,sCAAsC,QAAQ,kBAAkB;YACvE,IAAI;SACL,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,QAAQ,KAAK,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE7C,8BAA8B;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,sBAAsB,CACvC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,WAAW,EAChB,MAAM,EACN,QAAQ,CACT,CAAC;IACF,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAE9C,wBAAwB;IACxB,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEhE,oCAAoC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,QAAQ,MAAM,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAEhE,6EAA6E;IAC7E,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACzB,yEAAyE;IAC3E,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,qCAAqC;QACrC,MAAM,QAAQ,GAAsB;YAClC,GAAG,OAAO,CAAC,GAAG;YACd,GAAG,MAAM,CAAC,WAAW;SACtB,CAAC;QAEF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE;YACjD,GAAG,EAAE,QAAQ;YACb,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;SACnC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,wBAAwB;QACxB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;YACjC,SAAS,CAAC,GAAG,EAAE,CAAC;YAChB,OAAO,CAAC;gBACN,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,6BAA6B,KAAK,CAAC,OAAO,EAAE;gBACnD,IAAI;aACL,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,4BAA4B;QAC5B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;YACxC,SAAS,CAAC,GAAG,EAAE,CAAC;YAEhB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC;oBACN,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,6BAA6B,IAAI,IAAI,CAAC,EAAE;oBAC/C,IAAI;iBACL,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,iCAAiC;YACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC;oBACN,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,0CAA0C,QAAQ,EAAE;oBAC3D,IAAI;iBACL,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,OAAO,CAAC;gBACN,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,QAAQ;gBACd,IAAI;aACL,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB,EAClB,MAAyB;IAEzB,8BAA8B;IAC9B,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QACnC,OAAO;YACL,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,6BAA6B;SACrC,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAE7E,+BAA+B;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,sBAAsB;SAC9B,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,qBAAqB;SAC7B,CAAC;IACJ,CAAC;IAED,sBAAsB;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAEpD,aAAa;IACb,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEvC,kDAAkD;IAClD,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEtD,wDAAwD;IACxD,IAAI,UAAoC,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,qBAAqB;QACrB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,+BAA+B;QAC/B,IAAI,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,SAAS;QACX,CAAC;QAED,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,SAAS;QACX,CAAC;QAED,UAAU,GAAG,IAAI,CAAC;QAClB,MAAM;IACR,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,6BAA6B;SACrC,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE9E,2BAA2B;IAC3B,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAsB;YACnC,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,OAAO,EAAE,MAAM,CAAC,IAAI;YACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,YAAY,GAAG,iBAAiB,CAAC,YAAY,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3E,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAkB,EAClB,MAAyB;IAEzB,MAAM,MAAM,GAAgB;QAC1B,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,sBAAsB;IACtB,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAE5D,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;QAC5B,gCAAgC;QAChC,IAAI,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IACD,mEAAmE;IAEnE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,UAAkB,EAClB,MAAyB;IAEzB,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;AACjC,CAAC"}
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * Roadmap State Manager for Night Watch CLI
3
- * Manages .roadmap-state.json for tracking processed items
3
+ * Manages roadmap processing state via the SQLite repository layer.
4
+ * Writes the legacy .roadmap-state.json file alongside SQLite for backward
5
+ * compatibility and falls back to it when no SQLite row exists for a given
6
+ * prdDir (migration path).
4
7
  */
5
8
  /**
6
9
  * Represents the state of a single processed roadmap item
@@ -29,17 +32,21 @@ export interface IRoadmapState {
29
32
  */
30
33
  export declare function getStateFilePath(prdDir: string): string;
31
34
  /**
32
- * Load the roadmap state from disk
33
- * Returns an empty state if the file does not exist or is invalid
35
+ * Load the roadmap state.
36
+ * Checks the SQLite repository first; falls back to the legacy JSON file when
37
+ * no SQLite entry exists for prdDir (supports migration from old installs).
38
+ * Returns an empty state if neither source has data.
34
39
  *
35
- * @param prdDir - Directory containing PRD files (where state file lives)
40
+ * @param prdDir - Directory containing PRD files (primary key in SQLite)
36
41
  * @returns The loaded or empty roadmap state
37
42
  */
38
43
  export declare function loadRoadmapState(prdDir: string): IRoadmapState;
39
44
  /**
40
- * Save the roadmap state to disk
45
+ * Save the roadmap state.
46
+ * Writes to SQLite (primary) and also writes the legacy .roadmap-state.json
47
+ * file so that external tooling and existing tests continue to work.
41
48
  *
42
- * @param prdDir - Directory containing PRD files (where state file lives)
49
+ * @param prdDir - Directory containing PRD files (primary key in SQLite)
43
50
  * @param state - The state to save
44
51
  */
45
52
  export declare function saveRoadmapState(prdDir: string, state: IRoadmapState): void;
@@ -1 +1 @@
1
- {"version":3,"file":"roadmap-state.d.ts","sourceRoot":"","sources":["../../src/utils/roadmap-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC1C;AAQD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAmC9D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAc3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAMhD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3E;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,iBAAiB,GACtB,aAAa,CAGf;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAM/E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,EAAE,CAEjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,MAAM,GACX,iBAAiB,GAAG,SAAS,CAE/B"}
1
+ {"version":3,"file":"roadmap-state.d.ts","sourceRoot":"","sources":["../../src/utils/roadmap-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC1C;AAQD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD;AAyCD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAa9D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAe3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAMhD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3E;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,iBAAiB,GACtB,aAAa,CAGf;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAM/E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,EAAE,CAEjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,MAAM,GACX,iBAAiB,GAAG,SAAS,CAE/B"}
@@ -1,9 +1,13 @@
1
1
  /**
2
2
  * Roadmap State Manager for Night Watch CLI
3
- * Manages .roadmap-state.json for tracking processed items
3
+ * Manages roadmap processing state via the SQLite repository layer.
4
+ * Writes the legacy .roadmap-state.json file alongside SQLite for backward
5
+ * compatibility and falls back to it when no SQLite row exists for a given
6
+ * prdDir (migration path).
4
7
  */
5
8
  import * as fs from "fs";
6
9
  import * as path from "path";
10
+ import { getRepositories } from "../storage/repositories/index.js";
7
11
  /** Current version of the state file format */
8
12
  const STATE_VERSION = 1;
9
13
  /** Name of the state file */
@@ -15,59 +19,78 @@ export function getStateFilePath(prdDir) {
15
19
  return path.join(prdDir, STATE_FILE_NAME);
16
20
  }
17
21
  /**
18
- * Load the roadmap state from disk
19
- * Returns an empty state if the file does not exist or is invalid
20
- *
21
- * @param prdDir - Directory containing PRD files (where state file lives)
22
- * @returns The loaded or empty roadmap state
22
+ * Attempt to read state from the legacy JSON file.
23
+ * Returns null if the file does not exist or is invalid.
23
24
  */
24
- export function loadRoadmapState(prdDir) {
25
+ function readJsonState(prdDir) {
25
26
  const statePath = getStateFilePath(prdDir);
26
27
  if (!fs.existsSync(statePath)) {
27
- return createEmptyState();
28
+ return null;
28
29
  }
29
30
  try {
30
31
  const content = fs.readFileSync(statePath, "utf-8");
31
32
  const parsed = JSON.parse(content);
32
- // Validate structure
33
33
  if (typeof parsed !== "object" || parsed === null) {
34
- return createEmptyState();
34
+ return null;
35
35
  }
36
- // Ensure version and items exist
37
- if (typeof parsed.version !== "number" || typeof parsed.items !== "object") {
38
- return createEmptyState();
36
+ const obj = parsed;
37
+ if (typeof obj.version !== "number" || typeof obj.items !== "object") {
38
+ return null;
39
39
  }
40
- // Validate lastScan is a string if present
41
- if (parsed.lastScan !== undefined && typeof parsed.lastScan !== "string") {
42
- parsed.lastScan = new Date().toISOString();
40
+ if (obj.lastScan !== undefined && typeof obj.lastScan !== "string") {
41
+ obj.lastScan = new Date().toISOString();
43
42
  }
44
43
  return {
45
- version: parsed.version,
46
- lastScan: parsed.lastScan || "",
47
- items: parsed.items || {},
44
+ version: obj.version,
45
+ lastScan: typeof obj.lastScan === "string" ? obj.lastScan : "",
46
+ items: (obj.items ?? {}),
48
47
  };
49
48
  }
50
49
  catch {
51
- // Invalid JSON or other error
52
- return createEmptyState();
50
+ return null;
53
51
  }
54
52
  }
55
53
  /**
56
- * Save the roadmap state to disk
54
+ * Load the roadmap state.
55
+ * Checks the SQLite repository first; falls back to the legacy JSON file when
56
+ * no SQLite entry exists for prdDir (supports migration from old installs).
57
+ * Returns an empty state if neither source has data.
57
58
  *
58
- * @param prdDir - Directory containing PRD files (where state file lives)
59
+ * @param prdDir - Directory containing PRD files (primary key in SQLite)
60
+ * @returns The loaded or empty roadmap state
61
+ */
62
+ export function loadRoadmapState(prdDir) {
63
+ const { roadmapState } = getRepositories();
64
+ const fromDb = roadmapState.load(prdDir);
65
+ if (fromDb !== null) {
66
+ return fromDb;
67
+ }
68
+ const fromJson = readJsonState(prdDir);
69
+ if (fromJson !== null) {
70
+ return fromJson;
71
+ }
72
+ return createEmptyState();
73
+ }
74
+ /**
75
+ * Save the roadmap state.
76
+ * Writes to SQLite (primary) and also writes the legacy .roadmap-state.json
77
+ * file so that external tooling and existing tests continue to work.
78
+ *
79
+ * @param prdDir - Directory containing PRD files (primary key in SQLite)
59
80
  * @param state - The state to save
60
81
  */
61
82
  export function saveRoadmapState(prdDir, state) {
83
+ // Update lastScan timestamp
84
+ state.lastScan = new Date().toISOString();
85
+ // Persist to SQLite
86
+ const { roadmapState } = getRepositories();
87
+ roadmapState.save(prdDir, state);
88
+ // Also write the legacy JSON file for backward compatibility
62
89
  const statePath = getStateFilePath(prdDir);
63
- // Ensure directory exists
64
90
  const dir = path.dirname(statePath);
65
91
  if (!fs.existsSync(dir)) {
66
92
  fs.mkdirSync(dir, { recursive: true });
67
93
  }
68
- // Update lastScan timestamp
69
- state.lastScan = new Date().toISOString();
70
- // Write with pretty formatting
71
94
  fs.writeFileSync(statePath, JSON.stringify(state, null, 2) + "\n", "utf-8");
72
95
  }
73
96
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"roadmap-state.js","sourceRoot":"","sources":["../../src/utils/roadmap-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"roadmap-state.js","sourceRoot":"","sources":["../../src/utils/roadmap-state.ts"],"names":[],"mappings":"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"}