@sudocode-ai/integration-speckit 0.1.14

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 (53) hide show
  1. package/dist/id-generator.d.ts +149 -0
  2. package/dist/id-generator.d.ts.map +1 -0
  3. package/dist/id-generator.js +197 -0
  4. package/dist/id-generator.js.map +1 -0
  5. package/dist/index.d.ts +33 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +1017 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/parser/index.d.ts +11 -0
  10. package/dist/parser/index.d.ts.map +1 -0
  11. package/dist/parser/index.js +16 -0
  12. package/dist/parser/index.js.map +1 -0
  13. package/dist/parser/markdown-utils.d.ts +138 -0
  14. package/dist/parser/markdown-utils.d.ts.map +1 -0
  15. package/dist/parser/markdown-utils.js +283 -0
  16. package/dist/parser/markdown-utils.js.map +1 -0
  17. package/dist/parser/plan-parser.d.ts +97 -0
  18. package/dist/parser/plan-parser.d.ts.map +1 -0
  19. package/dist/parser/plan-parser.js +286 -0
  20. package/dist/parser/plan-parser.js.map +1 -0
  21. package/dist/parser/spec-parser.d.ts +95 -0
  22. package/dist/parser/spec-parser.d.ts.map +1 -0
  23. package/dist/parser/spec-parser.js +250 -0
  24. package/dist/parser/spec-parser.js.map +1 -0
  25. package/dist/parser/supporting-docs.d.ts +119 -0
  26. package/dist/parser/supporting-docs.d.ts.map +1 -0
  27. package/dist/parser/supporting-docs.js +324 -0
  28. package/dist/parser/supporting-docs.js.map +1 -0
  29. package/dist/parser/tasks-parser.d.ts +171 -0
  30. package/dist/parser/tasks-parser.d.ts.map +1 -0
  31. package/dist/parser/tasks-parser.js +281 -0
  32. package/dist/parser/tasks-parser.js.map +1 -0
  33. package/dist/relationship-mapper.d.ts +165 -0
  34. package/dist/relationship-mapper.d.ts.map +1 -0
  35. package/dist/relationship-mapper.js +238 -0
  36. package/dist/relationship-mapper.js.map +1 -0
  37. package/dist/watcher.d.ts +137 -0
  38. package/dist/watcher.d.ts.map +1 -0
  39. package/dist/watcher.js +599 -0
  40. package/dist/watcher.js.map +1 -0
  41. package/dist/writer/index.d.ts +8 -0
  42. package/dist/writer/index.d.ts.map +1 -0
  43. package/dist/writer/index.js +10 -0
  44. package/dist/writer/index.js.map +1 -0
  45. package/dist/writer/spec-writer.d.ts +70 -0
  46. package/dist/writer/spec-writer.d.ts.map +1 -0
  47. package/dist/writer/spec-writer.js +261 -0
  48. package/dist/writer/spec-writer.js.map +1 -0
  49. package/dist/writer/tasks-writer.d.ts +47 -0
  50. package/dist/writer/tasks-writer.d.ts.map +1 -0
  51. package/dist/writer/tasks-writer.js +161 -0
  52. package/dist/writer/tasks-writer.js.map +1 -0
  53. package/package.json +42 -0
@@ -0,0 +1,599 @@
1
+ /**
2
+ * File watcher for Spec-Kit integration
3
+ *
4
+ * Watches the .specify directory for changes to spec files, plans, tasks,
5
+ * and supporting documents. Detects which entities were created, updated, or deleted.
6
+ */
7
+ import chokidar from "chokidar";
8
+ import * as path from "path";
9
+ import { createHash } from "crypto";
10
+ import { existsSync, readFileSync, readdirSync } from "fs";
11
+ import { parseSpec } from "./parser/spec-parser.js";
12
+ import { parsePlan } from "./parser/plan-parser.js";
13
+ import { parseTasks } from "./parser/tasks-parser.js";
14
+ import { discoverSupportingDocs, } from "./parser/supporting-docs.js";
15
+ import { generateSpecId, generateTaskIssueId, parseSpecId, getFeatureSpecId, getFeaturePlanId, } from "./id-generator.js";
16
+ /**
17
+ * SpecKitWatcher monitors the .specify directory for changes
18
+ *
19
+ * Uses content hashing to detect actual changes vs just file touches.
20
+ * This prevents false positives from atomic writes and other file operations.
21
+ */
22
+ export class SpecKitWatcher {
23
+ watcher = null;
24
+ entityHashes = new Map();
25
+ callback = null;
26
+ isProcessing = false;
27
+ isRelevantFile = null;
28
+ specifyPath;
29
+ specPrefix;
30
+ taskPrefix;
31
+ includeSupportingDocs;
32
+ includeConstitution;
33
+ constructor(options) {
34
+ this.specifyPath = options.specifyPath;
35
+ this.specPrefix = options.specPrefix || "sk";
36
+ this.taskPrefix = options.taskPrefix || "skt";
37
+ this.includeSupportingDocs = options.includeSupportingDocs !== false;
38
+ this.includeConstitution = options.includeConstitution !== false;
39
+ }
40
+ /**
41
+ * Update the cached hash for a specific entity after we wrote to it.
42
+ * This prevents the watcher from detecting our own writes as changes.
43
+ */
44
+ updateEntityHash(entityId, hash) {
45
+ console.log(`[spec-kit-watcher] Updated hash for ${entityId} after outbound write`);
46
+ this.entityHashes.set(entityId, hash);
47
+ }
48
+ /**
49
+ * Remove an entity from the hash cache (after deletion)
50
+ */
51
+ removeEntityHash(entityId) {
52
+ console.log(`[spec-kit-watcher] Removed hash for ${entityId} after outbound delete`);
53
+ this.entityHashes.delete(entityId);
54
+ }
55
+ /**
56
+ * Start watching for changes
57
+ *
58
+ * @param callback - Function to call when changes are detected
59
+ */
60
+ start(callback) {
61
+ if (this.watcher) {
62
+ console.warn("[spec-kit-watcher] Already watching");
63
+ return;
64
+ }
65
+ this.callback = callback;
66
+ // Capture initial state
67
+ this.captureState();
68
+ // Watch paths - use directories instead of glob patterns for better compatibility
69
+ const watchPaths = [];
70
+ // Watch specs directory (chokidar will recursively watch subdirectories)
71
+ const specsDir = path.join(this.specifyPath, "specs");
72
+ if (existsSync(specsDir)) {
73
+ watchPaths.push(specsDir);
74
+ }
75
+ // Watch constitution
76
+ if (this.includeConstitution) {
77
+ const constitutionPath = path.join(this.specifyPath, "memory", "constitution.md");
78
+ if (existsSync(path.dirname(constitutionPath))) {
79
+ watchPaths.push(constitutionPath);
80
+ }
81
+ }
82
+ if (watchPaths.length === 0) {
83
+ console.warn("[spec-kit-watcher] No paths to watch");
84
+ return;
85
+ }
86
+ console.log(`[spec-kit-watcher] Watching paths:`, watchPaths);
87
+ // Only include .md, .json, .yaml, .yml files we care about
88
+ // Filter function to only process relevant files
89
+ const isRelevantFile = (filePath) => {
90
+ const ext = path.extname(filePath).toLowerCase();
91
+ if (ext === ".md")
92
+ return true;
93
+ if (this.includeSupportingDocs) {
94
+ if ([".json", ".yaml", ".yml"].includes(ext)) {
95
+ // Only include contract files
96
+ return filePath.includes("/contracts/");
97
+ }
98
+ }
99
+ return false;
100
+ };
101
+ this.watcher = chokidar.watch(watchPaths, {
102
+ persistent: true,
103
+ ignoreInitial: true,
104
+ awaitWriteFinish: {
105
+ stabilityThreshold: 100, // Wait 100ms for writes to settle
106
+ pollInterval: 50,
107
+ },
108
+ // Note: Don't use 'ignored' patterns with chokidar v4 as they prevent directory scanning
109
+ // We filter files in handleFileChange/handleFileDeleted instead
110
+ });
111
+ // Store file filter for use in handlers
112
+ this.isRelevantFile = isRelevantFile;
113
+ this.watcher.on("ready", () => {
114
+ const watched = this.watcher?.getWatched() || {};
115
+ const dirs = Object.keys(watched);
116
+ console.log(`[spec-kit-watcher] ✓ Ready, watching ${dirs.length} directories in ${this.specifyPath}`);
117
+ });
118
+ this.watcher.on("change", (filePath) => this.handleFileChange(filePath));
119
+ this.watcher.on("add", (filePath) => this.handleFileChange(filePath));
120
+ this.watcher.on("unlink", (filePath) => this.handleFileDeleted(filePath));
121
+ this.watcher.on("error", (error) => {
122
+ console.error("[spec-kit-watcher] Error:", error);
123
+ });
124
+ console.log(`[spec-kit-watcher] Setting up watcher for ${this.specifyPath}...`);
125
+ }
126
+ /**
127
+ * Stop watching for changes
128
+ */
129
+ stop() {
130
+ if (this.watcher) {
131
+ this.watcher.close();
132
+ this.watcher = null;
133
+ this.callback = null;
134
+ console.log("[spec-kit-watcher] Stopped");
135
+ }
136
+ }
137
+ /**
138
+ * Check if watcher is active
139
+ */
140
+ isWatching() {
141
+ return this.watcher !== null;
142
+ }
143
+ /**
144
+ * Handle file change event
145
+ *
146
+ * Uses content hashing to detect actual changes - no explicit debouncing needed.
147
+ * Chokidar's awaitWriteFinish handles write settling, and hash comparison
148
+ * filters out false positives from atomic writes.
149
+ */
150
+ handleFileChange(filePath) {
151
+ // Filter out non-relevant files
152
+ if (this.isRelevantFile && !this.isRelevantFile(filePath)) {
153
+ return;
154
+ }
155
+ console.log(`[spec-kit-watcher] File changed: ${filePath}`);
156
+ this.processChanges();
157
+ }
158
+ /**
159
+ * Handle file deleted event
160
+ */
161
+ handleFileDeleted(filePath) {
162
+ // Filter out non-relevant files
163
+ if (this.isRelevantFile && !this.isRelevantFile(filePath)) {
164
+ return;
165
+ }
166
+ console.log(`[spec-kit-watcher] File deleted: ${filePath}`);
167
+ this.processChanges();
168
+ }
169
+ /**
170
+ * Process changes by comparing current state to cached hashes
171
+ *
172
+ * Uses isProcessing flag to prevent concurrent processing if multiple
173
+ * file events fire rapidly. Content hashing ensures only actual changes
174
+ * are reported.
175
+ */
176
+ processChanges() {
177
+ // Prevent concurrent processing
178
+ if (this.isProcessing) {
179
+ console.log("[spec-kit-watcher] Already processing, skipping");
180
+ return;
181
+ }
182
+ this.isProcessing = true;
183
+ try {
184
+ const changes = this.detectChanges();
185
+ if (changes.length > 0) {
186
+ console.log(`[spec-kit-watcher] Detected ${changes.length} entity change(s):`, changes.map((c) => `${c.change_type}:${c.entity_id}`).join(", "));
187
+ if (this.callback) {
188
+ this.callback(changes);
189
+ }
190
+ }
191
+ else {
192
+ console.log("[spec-kit-watcher] No actual content changes (hashes match)");
193
+ }
194
+ }
195
+ catch (error) {
196
+ console.error("[spec-kit-watcher] Error processing changes:", error);
197
+ }
198
+ finally {
199
+ this.isProcessing = false;
200
+ }
201
+ }
202
+ /**
203
+ * Capture current state (entity hashes) for comparison
204
+ */
205
+ captureState() {
206
+ console.log("[spec-kit-watcher] Capturing initial state...");
207
+ const entities = this.scanAllEntities();
208
+ this.entityHashes.clear();
209
+ for (const entity of entities) {
210
+ const hash = this.computeEntityHash(entity);
211
+ this.entityHashes.set(entity.id, hash);
212
+ }
213
+ console.log(`[spec-kit-watcher] Captured state with ${this.entityHashes.size} entities`);
214
+ }
215
+ /**
216
+ * Detect changes by comparing current state to cached state
217
+ */
218
+ detectChanges() {
219
+ const currentEntities = this.scanAllEntities();
220
+ const changes = [];
221
+ const now = new Date().toISOString();
222
+ const currentIds = new Set();
223
+ // Check for created and updated entities
224
+ for (const entity of currentEntities) {
225
+ currentIds.add(entity.id);
226
+ const newHash = this.computeEntityHash(entity);
227
+ const cachedHash = this.entityHashes.get(entity.id);
228
+ if (!cachedHash) {
229
+ // New entity
230
+ changes.push({
231
+ entity_id: entity.id,
232
+ entity_type: entity.type,
233
+ change_type: "created",
234
+ timestamp: entity.created_at || now,
235
+ data: entity,
236
+ });
237
+ this.entityHashes.set(entity.id, newHash);
238
+ }
239
+ else if (newHash !== cachedHash) {
240
+ // Updated entity
241
+ changes.push({
242
+ entity_id: entity.id,
243
+ entity_type: entity.type,
244
+ change_type: "updated",
245
+ timestamp: entity.updated_at || now,
246
+ data: entity,
247
+ });
248
+ this.entityHashes.set(entity.id, newHash);
249
+ }
250
+ }
251
+ // Check for deleted entities
252
+ for (const [id] of this.entityHashes) {
253
+ if (!currentIds.has(id)) {
254
+ // Determine entity type from ID
255
+ const parsed = parseSpecId(id);
256
+ const entityType = parsed?.isTask ? "issue" : "spec";
257
+ changes.push({
258
+ entity_id: id,
259
+ entity_type: entityType,
260
+ change_type: "deleted",
261
+ timestamp: now,
262
+ });
263
+ this.entityHashes.delete(id);
264
+ }
265
+ }
266
+ return changes;
267
+ }
268
+ /**
269
+ * Scan all entities in the .specify directory
270
+ */
271
+ scanAllEntities() {
272
+ const entities = [];
273
+ // Scan specs directory
274
+ const specsDir = path.join(this.specifyPath, "specs");
275
+ if (existsSync(specsDir)) {
276
+ try {
277
+ const entries = readdirSync(specsDir, { withFileTypes: true });
278
+ for (const entry of entries) {
279
+ if (!entry.isDirectory())
280
+ continue;
281
+ // Feature directories match pattern like "001-auth", "002-payments"
282
+ const featureMatch = entry.name.match(/^(\d+)-/);
283
+ if (!featureMatch)
284
+ continue;
285
+ const featureNumber = featureMatch[1];
286
+ const featureDir = path.join(specsDir, entry.name);
287
+ // Parse spec.md
288
+ const specPath = path.join(featureDir, "spec.md");
289
+ if (existsSync(specPath)) {
290
+ const spec = parseSpec(specPath);
291
+ if (spec) {
292
+ const specId = generateSpecId(`specs/${entry.name}/spec.md`, this.specPrefix);
293
+ entities.push(this.specToExternalEntity(spec, specId, entry.name, "spec"));
294
+ }
295
+ }
296
+ // Parse plan.md
297
+ const planPath = path.join(featureDir, "plan.md");
298
+ if (existsSync(planPath)) {
299
+ const plan = parsePlan(planPath);
300
+ if (plan) {
301
+ const planId = generateSpecId(`specs/${entry.name}/plan.md`, this.specPrefix);
302
+ entities.push(this.planToExternalEntity(plan, planId, entry.name, featureNumber));
303
+ }
304
+ }
305
+ // Parse tasks.md - each task becomes an Issue
306
+ const tasksPath = path.join(featureDir, "tasks.md");
307
+ if (existsSync(tasksPath)) {
308
+ const tasksFile = parseTasks(tasksPath);
309
+ if (tasksFile) {
310
+ for (const task of tasksFile.tasks) {
311
+ const taskIssueId = generateTaskIssueId(featureNumber, task.taskId, this.taskPrefix);
312
+ entities.push(this.taskToExternalEntity(task, featureNumber, taskIssueId, tasksPath));
313
+ }
314
+ }
315
+ }
316
+ // Optionally include supporting docs
317
+ if (this.includeSupportingDocs) {
318
+ const docs = discoverSupportingDocs(featureDir);
319
+ if (docs.research) {
320
+ const docId = generateSpecId(`specs/${entry.name}/research.md`, this.specPrefix);
321
+ entities.push(this.supportingDocToExternalEntity(docs.research, docId, entry.name, featureNumber));
322
+ }
323
+ if (docs.dataModel) {
324
+ const docId = generateSpecId(`specs/${entry.name}/data-model.md`, this.specPrefix);
325
+ entities.push(this.supportingDocToExternalEntity(docs.dataModel, docId, entry.name, featureNumber));
326
+ }
327
+ for (const contract of docs.contracts) {
328
+ const docId = `${this.specPrefix}-${featureNumber}-contract-${contract.name}`;
329
+ entities.push(this.contractToExternalEntity(contract, docId, entry.name, featureNumber));
330
+ }
331
+ for (const other of docs.other) {
332
+ const docId = generateSpecId(`specs/${entry.name}/${other.fileName}.md`, this.specPrefix);
333
+ entities.push(this.supportingDocToExternalEntity(other, docId, entry.name, featureNumber));
334
+ }
335
+ }
336
+ }
337
+ }
338
+ catch (error) {
339
+ console.error("[spec-kit-watcher] Error scanning specs directory:", error);
340
+ }
341
+ }
342
+ // Include constitution.md if configured
343
+ if (this.includeConstitution) {
344
+ const constitutionPath = path.join(this.specifyPath, "memory", "constitution.md");
345
+ if (existsSync(constitutionPath)) {
346
+ const spec = parseSpec(constitutionPath);
347
+ if (spec) {
348
+ const constitutionId = `${this.specPrefix}-constitution`;
349
+ entities.push(this.specToExternalEntity(spec, constitutionId));
350
+ }
351
+ }
352
+ }
353
+ return entities;
354
+ }
355
+ /**
356
+ * Compute a hash for an entity to detect changes
357
+ */
358
+ computeEntityHash(entity) {
359
+ const canonical = JSON.stringify({
360
+ id: entity.id,
361
+ type: entity.type,
362
+ title: entity.title,
363
+ description: entity.description,
364
+ status: entity.status,
365
+ priority: entity.priority,
366
+ });
367
+ return createHash("sha256").update(canonical).digest("hex");
368
+ }
369
+ /**
370
+ * Convert a parsed spec to ExternalEntity
371
+ */
372
+ specToExternalEntity(spec, id, featureDirName, fileType = "spec") {
373
+ // Use directory-based title: "001-test-feature (spec)" instead of extracted title
374
+ const title = featureDirName
375
+ ? `${featureDirName} (${fileType})`
376
+ : spec.title;
377
+ // Read raw file content (including frontmatter) instead of processed content
378
+ let rawContent = spec.content;
379
+ try {
380
+ rawContent = readFileSync(spec.filePath, "utf-8");
381
+ }
382
+ catch {
383
+ // Fall back to parsed content if file read fails
384
+ }
385
+ return {
386
+ id,
387
+ type: "spec",
388
+ title,
389
+ description: rawContent,
390
+ status: spec.status || undefined,
391
+ priority: this.statusToPriority(spec.status),
392
+ created_at: spec.createdAt?.toISOString(),
393
+ raw: {
394
+ rawTitle: spec.rawTitle,
395
+ featureBranch: spec.featureBranch,
396
+ metadata: Object.fromEntries(spec.metadata),
397
+ crossReferences: spec.crossReferences,
398
+ filePath: spec.filePath,
399
+ },
400
+ };
401
+ }
402
+ /**
403
+ * Convert a parsed plan to ExternalEntity
404
+ */
405
+ planToExternalEntity(plan, id, featureDirName, featureNumber) {
406
+ // Use directory-based title: "001-test-feature (plan)" instead of extracted title
407
+ const title = featureDirName ? `${featureDirName} (plan)` : plan.title;
408
+ // Read raw file content (including frontmatter) instead of processed content
409
+ let rawContent = plan.content;
410
+ try {
411
+ rawContent = readFileSync(plan.filePath, "utf-8");
412
+ }
413
+ catch {
414
+ // Fall back to parsed content if file read fails
415
+ }
416
+ // Plan implements Spec relationship
417
+ const relationships = [];
418
+ if (featureNumber) {
419
+ const specId = getFeatureSpecId(featureNumber, this.specPrefix);
420
+ relationships.push({
421
+ targetId: specId,
422
+ targetType: "spec",
423
+ relationshipType: "implements",
424
+ });
425
+ }
426
+ return {
427
+ id,
428
+ type: "spec",
429
+ title,
430
+ description: rawContent,
431
+ status: plan.status || undefined,
432
+ priority: this.statusToPriority(plan.status),
433
+ created_at: plan.createdAt?.toISOString(),
434
+ relationships: relationships.length > 0 ? relationships : undefined,
435
+ raw: {
436
+ rawTitle: plan.rawTitle,
437
+ branch: plan.branch,
438
+ specReference: plan.specReference,
439
+ metadata: Object.fromEntries(plan.metadata),
440
+ crossReferences: plan.crossReferences,
441
+ filePath: plan.filePath,
442
+ },
443
+ };
444
+ }
445
+ /**
446
+ * Convert a parsed task to ExternalEntity (as issue)
447
+ */
448
+ taskToExternalEntity(task, featureNumber, id, tasksFilePath) {
449
+ const status = task.completed ? "closed" : "open";
450
+ // Task implements Plan relationship
451
+ const planId = getFeaturePlanId(featureNumber, this.specPrefix);
452
+ const relationships = [
453
+ {
454
+ targetId: planId,
455
+ targetType: "spec",
456
+ relationshipType: "implements",
457
+ },
458
+ ];
459
+ return {
460
+ id,
461
+ type: "issue",
462
+ title: `${task.taskId}: ${task.description}`,
463
+ description: task.description,
464
+ status,
465
+ priority: task.parallelizable ? 1 : 2,
466
+ relationships,
467
+ raw: {
468
+ taskId: task.taskId,
469
+ completed: task.completed,
470
+ parallelizable: task.parallelizable,
471
+ userStory: task.userStory,
472
+ phase: task.phase,
473
+ phaseName: task.phaseName,
474
+ lineNumber: task.lineNumber,
475
+ indentLevel: task.indentLevel,
476
+ rawLine: task.rawLine,
477
+ featureNumber,
478
+ tasksFilePath,
479
+ },
480
+ };
481
+ }
482
+ /**
483
+ * Convert a parsed supporting document to ExternalEntity
484
+ */
485
+ supportingDocToExternalEntity(doc, id, featureDirName, featureNumber) {
486
+ // Use directory-based title: "001-test-feature (research)" instead of extracted title
487
+ const title = featureDirName
488
+ ? `${featureDirName} (${doc.fileName})`
489
+ : doc.title;
490
+ // Read raw file content (including frontmatter) instead of processed content
491
+ let rawContent = doc.content;
492
+ try {
493
+ rawContent = readFileSync(doc.filePath, "utf-8");
494
+ }
495
+ catch {
496
+ // Fall back to parsed content if file read fails
497
+ }
498
+ // Supporting doc references Plan relationship
499
+ const relationships = [];
500
+ if (featureNumber) {
501
+ const planId = getFeaturePlanId(featureNumber, this.specPrefix);
502
+ relationships.push({
503
+ targetId: planId,
504
+ targetType: "spec",
505
+ relationshipType: "references",
506
+ });
507
+ }
508
+ return {
509
+ id,
510
+ type: "spec",
511
+ title,
512
+ description: rawContent,
513
+ relationships: relationships.length > 0 ? relationships : undefined,
514
+ raw: {
515
+ docType: doc.type,
516
+ metadata: Object.fromEntries(doc.metadata),
517
+ crossReferences: doc.crossReferences,
518
+ filePath: doc.filePath,
519
+ fileName: doc.fileName,
520
+ fileExtension: doc.fileExtension,
521
+ },
522
+ };
523
+ }
524
+ /**
525
+ * Convert a parsed contract to ExternalEntity
526
+ */
527
+ contractToExternalEntity(contract, id, featureDirName, featureNumber) {
528
+ // Use directory-based title: "001-test-feature (contract-api)" instead of just contract name
529
+ const title = featureDirName
530
+ ? `${featureDirName} (contract-${contract.name})`
531
+ : contract.name;
532
+ // Read raw file content for contracts
533
+ let rawContent = JSON.stringify(contract.data, null, 2);
534
+ try {
535
+ rawContent = readFileSync(contract.filePath, "utf-8");
536
+ }
537
+ catch {
538
+ // Fall back to stringified data if file read fails
539
+ }
540
+ // Contract references Plan relationship
541
+ const relationships = [];
542
+ if (featureNumber) {
543
+ const planId = getFeaturePlanId(featureNumber, this.specPrefix);
544
+ relationships.push({
545
+ targetId: planId,
546
+ targetType: "spec",
547
+ relationshipType: "references",
548
+ });
549
+ }
550
+ return {
551
+ id,
552
+ type: "spec",
553
+ title,
554
+ description: rawContent,
555
+ relationships: relationships.length > 0 ? relationships : undefined,
556
+ raw: {
557
+ contractName: contract.name,
558
+ format: contract.format,
559
+ data: contract.data,
560
+ filePath: contract.filePath,
561
+ },
562
+ };
563
+ }
564
+ /**
565
+ * Map spec-kit status to sudocode priority
566
+ */
567
+ statusToPriority(status) {
568
+ if (!status)
569
+ return 2;
570
+ const statusLower = status.toLowerCase();
571
+ if (statusLower === "draft" || statusLower === "open") {
572
+ return 3;
573
+ }
574
+ if (statusLower === "in progress" ||
575
+ statusLower === "in_progress" ||
576
+ statusLower === "active") {
577
+ return 1;
578
+ }
579
+ if (statusLower === "complete" ||
580
+ statusLower === "completed" ||
581
+ statusLower === "done") {
582
+ return 2;
583
+ }
584
+ return 2;
585
+ }
586
+ /**
587
+ * Get current cached hashes (for testing/debugging)
588
+ */
589
+ getEntityHashes() {
590
+ return new Map(this.entityHashes);
591
+ }
592
+ /**
593
+ * Force refresh of cached state (useful after external sync)
594
+ */
595
+ refreshState() {
596
+ this.captureState();
597
+ }
598
+ }
599
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Writers for Spec-Kit Integration
3
+ *
4
+ * Provides outbound sync capabilities (sudocode → spec-kit)
5
+ */
6
+ export { updateTaskStatus, getTaskStatus, getAllTaskStatuses, type TaskUpdateResult, } from "./tasks-writer.js";
7
+ export { updateSpecContent, getSpecTitle, getSpecStatus, type SpecUpdates, type SpecUpdateResult, } from "./spec-writer.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/writer/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Writers for Spec-Kit Integration
3
+ *
4
+ * Provides outbound sync capabilities (sudocode → spec-kit)
5
+ */
6
+ // Tasks writer
7
+ export { updateTaskStatus, getTaskStatus, getAllTaskStatuses, } from "./tasks-writer.js";
8
+ // Spec writer
9
+ export { updateSpecContent, getSpecTitle, getSpecStatus, } from "./spec-writer.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/writer/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,kBAAkB,GAEnB,MAAM,mBAAmB,CAAC;AAE3B,cAAc;AACd,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,aAAa,GAGd,MAAM,kBAAkB,CAAC"}