@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.
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +39 -11
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +2 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +23 -0
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/slice.d.ts +26 -0
- package/dist/commands/slice.d.ts.map +1 -0
- package/dist/commands/slice.js +175 -0
- package/dist/commands/slice.js.map +1 -0
- package/dist/commands/state.d.ts +8 -0
- package/dist/commands/state.d.ts.map +1 -0
- package/dist/commands/state.js +56 -0
- package/dist/commands/state.js.map +1 -0
- package/dist/commands/uninstall.js +2 -2
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +32 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +7 -0
- package/dist/constants.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +11 -13
- package/dist/server/index.js.map +1 -1
- package/dist/storage/json-state-migrator.d.ts +24 -0
- package/dist/storage/json-state-migrator.d.ts.map +1 -0
- package/dist/storage/json-state-migrator.js +197 -0
- package/dist/storage/json-state-migrator.js.map +1 -0
- package/dist/storage/repositories/index.d.ts +23 -0
- package/dist/storage/repositories/index.d.ts.map +1 -0
- package/dist/storage/repositories/index.js +37 -0
- package/dist/storage/repositories/index.js.map +1 -0
- package/dist/storage/repositories/interfaces.d.ts +37 -0
- package/dist/storage/repositories/interfaces.d.ts.map +1 -0
- package/dist/storage/repositories/interfaces.js +6 -0
- package/dist/storage/repositories/interfaces.js.map +1 -0
- package/dist/storage/repositories/sqlite/execution-history-repository.d.ts +21 -0
- package/dist/storage/repositories/sqlite/execution-history-repository.d.ts.map +1 -0
- package/dist/storage/repositories/sqlite/execution-history-repository.js +94 -0
- package/dist/storage/repositories/sqlite/execution-history-repository.js.map +1 -0
- package/dist/storage/repositories/sqlite/prd-state-repository.d.ts +17 -0
- package/dist/storage/repositories/sqlite/prd-state-repository.d.ts.map +1 -0
- package/dist/storage/repositories/sqlite/prd-state-repository.js +74 -0
- package/dist/storage/repositories/sqlite/prd-state-repository.js.map +1 -0
- package/dist/storage/repositories/sqlite/project-registry-repository.d.ts +16 -0
- package/dist/storage/repositories/sqlite/project-registry-repository.d.ts.map +1 -0
- package/dist/storage/repositories/sqlite/project-registry-repository.js +34 -0
- package/dist/storage/repositories/sqlite/project-registry-repository.js.map +1 -0
- package/dist/storage/repositories/sqlite/roadmap-state-repository.d.ts +14 -0
- package/dist/storage/repositories/sqlite/roadmap-state-repository.d.ts.map +1 -0
- package/dist/storage/repositories/sqlite/roadmap-state-repository.js +47 -0
- package/dist/storage/repositories/sqlite/roadmap-state-repository.js.map +1 -0
- package/dist/storage/sqlite/client.d.ts +23 -0
- package/dist/storage/sqlite/client.d.ts.map +1 -0
- package/dist/storage/sqlite/client.js +47 -0
- package/dist/storage/sqlite/client.js.map +1 -0
- package/dist/storage/sqlite/migrations.d.ts +11 -0
- package/dist/storage/sqlite/migrations.d.ts.map +1 -0
- package/dist/storage/sqlite/migrations.js +57 -0
- package/dist/storage/sqlite/migrations.js.map +1 -0
- package/dist/templates/slicer-prompt.d.ts +54 -0
- package/dist/templates/slicer-prompt.d.ts.map +1 -0
- package/dist/templates/slicer-prompt.js +163 -0
- package/dist/templates/slicer-prompt.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/execution-history.d.ts +11 -5
- package/dist/utils/execution-history.d.ts.map +1 -1
- package/dist/utils/execution-history.js +27 -130
- package/dist/utils/execution-history.js.map +1 -1
- package/dist/utils/prd-states.d.ts +1 -2
- package/dist/utils/prd-states.d.ts.map +1 -1
- package/dist/utils/prd-states.js +10 -42
- package/dist/utils/prd-states.js.map +1 -1
- package/dist/utils/registry.d.ts +9 -4
- package/dist/utils/registry.d.ts.map +1 -1
- package/dist/utils/registry.js +21 -33
- package/dist/utils/registry.js.map +1 -1
- package/dist/utils/roadmap-scanner.d.ts +34 -2
- package/dist/utils/roadmap-scanner.d.ts.map +1 -1
- package/dist/utils/roadmap-scanner.js +218 -105
- package/dist/utils/roadmap-scanner.js.map +1 -1
- package/dist/utils/roadmap-state.d.ts +13 -6
- package/dist/utils/roadmap-state.d.ts.map +1 -1
- package/dist/utils/roadmap-state.js +50 -27
- package/dist/utils/roadmap-state.js.map +1 -1
- package/package.json +6 -1
- package/scripts/night-watch-cron.sh +65 -24
- package/scripts/night-watch-slicer-cron.sh +90 -0
- package/templates/night-watch-slicer.md +219 -0
- package/templates/night-watch.config.json +1 -0
|
@@ -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
|
|
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
|
|
133
|
+
* @returns The slice result
|
|
92
134
|
*/
|
|
93
|
-
export function
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
121
|
-
// Scan existing PRD files for
|
|
262
|
+
const state = loadRoadmapState(prdDir);
|
|
263
|
+
// Scan existing PRD files for duplicate detection
|
|
122
264
|
const existingPrdSlugs = scanExistingPrdSlugs(prdDir);
|
|
123
|
-
//
|
|
265
|
+
// Find first unprocessed, unchecked, non-duplicate item
|
|
266
|
+
let targetItem;
|
|
124
267
|
for (const item of items) {
|
|
125
|
-
// Skip checked items
|
|
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
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
result.
|
|
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
|
-
*
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
|
|
186
|
-
|
|
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
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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
|
|
339
|
+
// If no item was found (all done or no items), return empty result
|
|
340
|
+
return result;
|
|
199
341
|
}
|
|
200
342
|
/**
|
|
201
|
-
*
|
|
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
|
|
208
|
-
|
|
209
|
-
|
|
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":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
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
|
|
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
|
|
33
|
-
*
|
|
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 (
|
|
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
|
|
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 (
|
|
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
|
|
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
|
|
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
|
-
*
|
|
19
|
-
* Returns
|
|
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
|
-
|
|
25
|
+
function readJsonState(prdDir) {
|
|
25
26
|
const statePath = getStateFilePath(prdDir);
|
|
26
27
|
if (!fs.existsSync(statePath)) {
|
|
27
|
-
return
|
|
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
|
|
34
|
+
return null;
|
|
35
35
|
}
|
|
36
|
-
|
|
37
|
-
if (typeof
|
|
38
|
-
return
|
|
36
|
+
const obj = parsed;
|
|
37
|
+
if (typeof obj.version !== "number" || typeof obj.items !== "object") {
|
|
38
|
+
return null;
|
|
39
39
|
}
|
|
40
|
-
|
|
41
|
-
|
|
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:
|
|
46
|
-
lastScan:
|
|
47
|
-
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
|
-
|
|
52
|
-
return createEmptyState();
|
|
50
|
+
return null;
|
|
53
51
|
}
|
|
54
52
|
}
|
|
55
53
|
/**
|
|
56
|
-
*
|
|
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 (
|
|
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":"AAAA
|
|
1
|
+
{"version":3,"file":"roadmap-state.js","sourceRoot":"","sources":["../../src/utils/roadmap-state.ts"],"names":[],"mappings":"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"}
|