@lwelliott/cortex-cli 1.0.5 → 1.0.7

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 (88) hide show
  1. package/README.md +51 -26
  2. package/dist/cli/formatters/markdown.d.ts.map +1 -1
  3. package/dist/cli/formatters/markdown.js +0 -4
  4. package/dist/cli/formatters/markdown.js.map +1 -1
  5. package/dist/cli/formatters/quiet.d.ts.map +1 -1
  6. package/dist/cli/formatters/quiet.js +0 -2
  7. package/dist/cli/formatters/quiet.js.map +1 -1
  8. package/dist/cli/formatters/table.d.ts.map +1 -1
  9. package/dist/cli/formatters/table.js +0 -5
  10. package/dist/cli/formatters/table.js.map +1 -1
  11. package/dist/cli/index.js +4 -2
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/cli/project-resolver.js +1 -1
  14. package/dist/cli/project-resolver.js.map +1 -1
  15. package/dist/cli/project.d.ts +0 -1
  16. package/dist/cli/project.d.ts.map +1 -1
  17. package/dist/cli/project.js +2 -35
  18. package/dist/cli/project.js.map +1 -1
  19. package/dist/cli/task.d.ts.map +1 -1
  20. package/dist/cli/task.js +22 -7
  21. package/dist/cli/task.js.map +1 -1
  22. package/dist/config/registry.d.ts +0 -9
  23. package/dist/config/registry.d.ts.map +1 -1
  24. package/dist/config/registry.js +1 -31
  25. package/dist/config/registry.js.map +1 -1
  26. package/dist/config/resolver.d.ts +3 -4
  27. package/dist/config/resolver.d.ts.map +1 -1
  28. package/dist/config/resolver.js +7 -24
  29. package/dist/config/resolver.js.map +1 -1
  30. package/dist/db/generated/schema-types.d.ts +2 -2
  31. package/dist/db/generated/schema-types.js +2 -2
  32. package/dist/db/generated/schema-types.js.map +1 -1
  33. package/dist/db/schema.d.ts +1 -1
  34. package/dist/db/schema.d.ts.map +1 -1
  35. package/dist/db/schema.js +70 -4
  36. package/dist/db/schema.js.map +1 -1
  37. package/dist/models/common.d.ts +2 -2
  38. package/dist/models/common.d.ts.map +1 -1
  39. package/dist/models/project.d.ts +2 -4
  40. package/dist/models/project.d.ts.map +1 -1
  41. package/dist/models/project.js +0 -1
  42. package/dist/models/project.js.map +1 -1
  43. package/dist/models/relation.d.ts.map +1 -1
  44. package/dist/models/relation.js +81 -73
  45. package/dist/models/relation.js.map +1 -1
  46. package/dist/services/document-service.d.ts +3 -0
  47. package/dist/services/document-service.d.ts.map +1 -1
  48. package/dist/services/document-service.js +77 -76
  49. package/dist/services/document-service.js.map +1 -1
  50. package/dist/services/project.d.ts +0 -10
  51. package/dist/services/project.d.ts.map +1 -1
  52. package/dist/services/project.js +2 -26
  53. package/dist/services/project.js.map +1 -1
  54. package/dist/services/review-service.d.ts +47 -2
  55. package/dist/services/review-service.d.ts.map +1 -1
  56. package/dist/services/review-service.js +189 -27
  57. package/dist/services/review-service.js.map +1 -1
  58. package/dist/services/schema-migration-service.js +2 -2
  59. package/dist/services/schema-migration-service.js.map +1 -1
  60. package/dist/services/stage-validator.d.ts +19 -18
  61. package/dist/services/stage-validator.d.ts.map +1 -1
  62. package/dist/services/stage-validator.js +41 -42
  63. package/dist/services/stage-validator.js.map +1 -1
  64. package/dist/services/task.d.ts +18 -21
  65. package/dist/services/task.d.ts.map +1 -1
  66. package/dist/services/task.js +96 -86
  67. package/dist/services/task.js.map +1 -1
  68. package/dist/state-machines/task-state.d.ts +8 -8
  69. package/dist/state-machines/task-state.d.ts.map +1 -1
  70. package/dist/state-machines/task-state.js +33 -31
  71. package/dist/state-machines/task-state.js.map +1 -1
  72. package/dist/utils/errors.d.ts +29 -51
  73. package/dist/utils/errors.d.ts.map +1 -1
  74. package/dist/utils/errors.js +79 -114
  75. package/dist/utils/errors.js.map +1 -1
  76. package/dist/utils/format.d.ts +0 -11
  77. package/dist/utils/format.d.ts.map +1 -1
  78. package/dist/utils/format.js +1 -10
  79. package/dist/utils/format.js.map +1 -1
  80. package/dist/utils/levenshtein.d.ts +10 -0
  81. package/dist/utils/levenshtein.d.ts.map +1 -0
  82. package/dist/utils/levenshtein.js +42 -0
  83. package/dist/utils/levenshtein.js.map +1 -0
  84. package/dist/validators/owner-validator.d.ts +20 -16
  85. package/dist/validators/owner-validator.d.ts.map +1 -1
  86. package/dist/validators/owner-validator.js +37 -38
  87. package/dist/validators/owner-validator.js.map +1 -1
  88. package/package.json +9 -2
@@ -8,8 +8,6 @@ exports.createProject = createProject;
8
8
  exports.registerProject = registerProject;
9
9
  exports.removeProject = removeProject;
10
10
  exports.listAllProjects = listAllProjects;
11
- exports.setProjectDefault = setProjectDefault;
12
- exports.getDefaultProjectName = getDefaultProjectName;
13
11
  exports.getProjectInfo = getProjectInfo;
14
12
  exports.resolveProjectForCommand = resolveProjectForCommand;
15
13
  const fs_1 = require("fs");
@@ -109,14 +107,12 @@ function createProject(name, folder, opts) {
109
107
  db.close();
110
108
  }
111
109
  // Register in global registry
112
- const registry = (0, registry_1.addProject)(name, absoluteFolder, opts?.registryPath);
113
- const isDefault = registry.default === name;
110
+ (0, registry_1.addProject)(name, absoluteFolder, opts?.registryPath);
114
111
  return {
115
112
  name,
116
113
  folder: absoluteFolder,
117
114
  dbPath,
118
115
  isNew: !dbExisted,
119
- isDefault,
120
116
  };
121
117
  }
122
118
  /**
@@ -159,14 +155,12 @@ function registerProject(name, folder, opts) {
159
155
  db.close();
160
156
  }
161
157
  // Register in global registry
162
- const registry = (0, registry_1.addProject)(name, absoluteFolder, opts?.registryPath);
163
- const isDefault = registry.default === name;
158
+ (0, registry_1.addProject)(name, absoluteFolder, opts?.registryPath);
164
159
  return {
165
160
  name,
166
161
  folder: absoluteFolder,
167
162
  dbPath,
168
163
  isNew: !dbExisted,
169
- isDefault,
170
164
  };
171
165
  }
172
166
  /**
@@ -190,21 +184,6 @@ function removeProject(name, opts) {
190
184
  function listAllProjects(opts) {
191
185
  return (0, registry_1.listProjects)(opts?.registryPath);
192
186
  }
193
- /**
194
- * Set the default project.
195
- *
196
- * @throws ProjectNotFoundError (ERR-PROJ-007) if the project doesn't exist
197
- */
198
- function setProjectDefault(name, opts) {
199
- (0, registry_1.setDefaultProject)(name, opts?.registryPath);
200
- }
201
- /**
202
- * Get the current default project name.
203
- */
204
- function getDefaultProjectName(opts) {
205
- const registry = (0, registry_1.loadRegistry)(opts?.registryPath);
206
- return registry.default;
207
- }
208
187
  /**
209
188
  * Show project details: folder, database path, sprint summary, entity counts.
210
189
  *
@@ -212,9 +191,7 @@ function getDefaultProjectName(opts) {
212
191
  */
213
192
  function getProjectInfo(name, opts) {
214
193
  const entry = (0, registry_1.getProject)(name, opts?.registryPath);
215
- const registry = (0, registry_1.loadRegistry)(opts?.registryPath);
216
194
  const dbPath = `${entry.folder}/pmp/project.db`;
217
- const isDefault = registry.default === name;
218
195
  // Query the database for summary counts
219
196
  let sprintCount = 0;
220
197
  let activeSprintCount = 0;
@@ -236,7 +213,6 @@ function getProjectInfo(name, opts) {
236
213
  name,
237
214
  folder: entry.folder,
238
215
  dbPath,
239
- isDefault,
240
216
  sprintCount,
241
217
  activeSprintCount,
242
218
  docCount,
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/services/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/services/project.ts"],"names":[],"mappings":"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"}
@@ -2,9 +2,10 @@ import type Database from 'better-sqlite3';
2
2
  import type { Review, ReviewDetail, ReviewAddOptions, TestReport, TestReportAddOptions, Lesson, LessonAddOptions, LessonResult, LessonUpdateFields } from '../models/review';
3
3
  /**
4
4
  * Add a review with explicit caller-provided 4-digit ID.
5
+ * Wrapped with review:<reviewId> advisory lock (AD-0006) for multi-process coordination.
5
6
  * Content must be provided (from --content-file).
6
7
  *
7
- * SAD-0031 Part A: No advisory lock — caller provides explicit ID.
8
+ * SAD-0031 Part A: caller provides explicit ID.
8
9
  * Duplicate validation via EXISTS on composite index (sprint_id, review_num).
9
10
  */
10
11
  export declare function addReview(db: Database.Database, sprintId: string, reviewId: string, reviewType: string, verdict: string, content: string, opts?: ReviewAddOptions): Review;
@@ -26,12 +27,56 @@ export declare function listReviews(db: Database.Database, sprintId: string, fil
26
27
  * @throws ReviewNotInSprintError if review not found in the specified sprint
27
28
  */
28
29
  export declare function getReview(db: Database.Database, reviewNum: number, sprintId: string): ReviewDetail;
30
+ /**
31
+ * Update an existing review.
32
+ * Wrapped with review:<reviewId> advisory lock (AD-0006).
33
+ *
34
+ * @param db - Database connection
35
+ * @param reviewNum - Review number (1-based)
36
+ * @param sprintId - Sprint ID (required)
37
+ * @param updates - Fields to update (content, verdict, review_type, counts, etc.)
38
+ * @returns Updated Review detail
39
+ * @throws ReviewNotInSprintError if review not found
40
+ * @throws ReviewNoUpdateFieldsError if no update fields provided
41
+ */
42
+ export declare function updateReview(db: Database.Database, reviewNum: number, sprintId: string, updates: {
43
+ content?: string;
44
+ verdict?: string;
45
+ reviewType?: string;
46
+ assetName?: string;
47
+ assetRef?: string;
48
+ critical?: number;
49
+ major?: number;
50
+ minor?: number;
51
+ suggestion?: number;
52
+ }): ReviewDetail;
29
53
  /**
30
54
  * Add a test report with explicit caller-provided 4-digit ID.
31
- * SAD-0031 Part A: No advisory lock, no task association.
55
+ * Wrapped with review:global advisory lock (AD-0006) for multi-process coordination.
56
+ * SAD-0031 Part A: no task association.
32
57
  * Duplicate validation via EXISTS on composite index (sprint_id, id).
33
58
  */
34
59
  export declare function addTestReport(db: Database.Database, sprintId: string, testReportId: string, total: number, passed: number, failed: number, opts?: TestReportAddOptions): TestReport;
60
+ /**
61
+ * Update an existing test report.
62
+ * Wrapped with review:global advisory lock (AD-0006).
63
+ *
64
+ * @param db - Database connection
65
+ * @param testReportId - Test report ID (4-digit zero-padded)
66
+ * @param sprintId - Sprint ID
67
+ * @param updates - Fields to update
68
+ * @returns Updated TestReport
69
+ * @throws error with ERR-TESTREPORT-004 if not found
70
+ */
71
+ export declare function updateTestReport(db: Database.Database, testReportId: string, sprintId: string, updates: {
72
+ total?: number;
73
+ passed?: number;
74
+ failed?: number;
75
+ skipped?: number;
76
+ command?: string;
77
+ duration?: number;
78
+ content?: string;
79
+ }): TestReport;
35
80
  /**
36
81
  * List test reports. Task filter removed per SAD-0031 Part B.
37
82
  */
@@ -1 +1 @@
1
- {"version":3,"file":"review-service.d.ts","sourceRoot":"","sources":["../../src/services/review-service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAiC7K;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,gBAAgB,GACtB,MAAM,CAuCR;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,MAAM,EAAE,CAUV;AAWD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAalG;AAID;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,oBAAoB,GAC1B,UAAU,CAsCZ;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,CAAC,EAAE,MAAM,GAChB,UAAU,EAAE,CAOd;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAQvG;AAcD;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,gBAAgB,GACvB,MAAM,CAgBR;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/E;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,YAAY,CAM7D;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,kBAAkB,GAC1B,YAAY,CA2Bd"}
1
+ {"version":3,"file":"review-service.d.ts","sourceRoot":"","sources":["../../src/services/review-service.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,14 @@
2
2
  // Review service: orchestrates review, test report, and lesson operations
3
3
  // SAD-0031: Explicit Command IDs, Duplicate ID Validation, Test-Report --task Removal
4
4
  // SAD-0010: Lesson singleton, review show sprint binding, content-file import
5
+ // AD-0006: Advisory lock wrapping for multi-step write operations
5
6
  Object.defineProperty(exports, "__esModule", { value: true });
6
7
  exports.addReview = addReview;
7
8
  exports.listReviews = listReviews;
8
9
  exports.getReview = getReview;
10
+ exports.updateReview = updateReview;
9
11
  exports.addTestReport = addTestReport;
12
+ exports.updateTestReport = updateTestReport;
10
13
  exports.listTestReports = listTestReports;
11
14
  exports.getTestReport = getTestReport;
12
15
  exports.addLesson = addLesson;
@@ -15,6 +18,7 @@ exports.getLesson = getLesson;
15
18
  exports.updateLesson = updateLesson;
16
19
  const errors_1 = require("../utils/errors");
17
20
  const retry_1 = require("../db/retry");
21
+ const locks_1 = require("../db/locks");
18
22
  const sprint_1 = require("./sprint");
19
23
  // ─── Error helper ───
20
24
  function reviewError(code, message, details) {
@@ -30,31 +34,36 @@ function validateFourDigitId(id, errCtor) {
30
34
  // ─── Review API ───
31
35
  /**
32
36
  * Add a review with explicit caller-provided 4-digit ID.
37
+ * Wrapped with review:<reviewId> advisory lock (AD-0006) for multi-process coordination.
33
38
  * Content must be provided (from --content-file).
34
39
  *
35
- * SAD-0031 Part A: No advisory lock — caller provides explicit ID.
40
+ * SAD-0031 Part A: caller provides explicit ID.
36
41
  * Duplicate validation via EXISTS on composite index (sprint_id, review_num).
37
42
  */
38
43
  function addReview(db, sprintId, reviewId, reviewType, verdict, content, opts) {
39
- // Validate sprint exists
44
+ // Validate sprint exists (before lock)
40
45
  (0, sprint_1.resolveSprint)(db, sprintId);
41
46
  // Validate ID format: /^\d{4}$/
42
47
  validateFourDigitId(reviewId, errors_1.ReviewBadIdError);
43
48
  if (!content) {
44
49
  throw new errors_1.ReviewContentRemovedError();
45
50
  }
46
- // Duplicate check via EXISTS on composite index (sprint_id, review_num)
47
- const exists = db.prepare('SELECT EXISTS(SELECT 1 FROM reviews WHERE sprint_id = ? AND review_num = ?) AS e').get(sprintId, reviewId);
48
- if (exists.e) {
49
- throw new errors_1.ReviewDuplicateIdError(reviewId, sprintId);
50
- }
51
- const now = new Date().toISOString();
52
- const rowId = (0, retry_1.withTransaction)(db, () => {
53
- const result = db.prepare(`INSERT INTO reviews (review_num, sprint_id, asset_name, review_type, verdict, critical_count, major_count, minor_count, suggestion_count, open_questions_count, content, asset_ref, created_at, updated_at)
54
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(reviewId, sprintId, opts?.assetName ?? '', reviewType, verdict, opts?.critical ?? 0, opts?.major ?? 0, opts?.minor ?? 0, opts?.suggestion ?? 0, 0, content, opts?.assetRef ?? null, now, now);
55
- return Number(result.lastInsertRowid);
51
+ const owner = (0, locks_1.generateLockOwner)();
52
+ const lockName = `review:${reviewId}`;
53
+ return (0, locks_1.withLock)(db, { name: lockName, owner }, () => {
54
+ // Duplicate check inside lock to prevent TOCTOU races
55
+ const exists = db.prepare('SELECT EXISTS(SELECT 1 FROM reviews WHERE sprint_id = ? AND review_num = ?) AS e').get(sprintId, reviewId);
56
+ if (exists.e) {
57
+ throw new errors_1.ReviewDuplicateIdError(reviewId, sprintId);
58
+ }
59
+ const now = new Date().toISOString();
60
+ const rowId = (0, retry_1.withTransaction)(db, () => {
61
+ const result = db.prepare(`INSERT INTO reviews (review_num, sprint_id, asset_name, review_type, verdict, critical_count, major_count, minor_count, suggestion_count, open_questions_count, content, asset_ref, created_at, updated_at)
62
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(reviewId, sprintId, opts?.assetName ?? '', reviewType, verdict, opts?.critical ?? 0, opts?.major ?? 0, opts?.minor ?? 0, opts?.suggestion ?? 0, 0, content, opts?.assetRef ?? null, now, now);
63
+ return Number(result.lastInsertRowid);
64
+ });
65
+ return getReviewById(db, rowId);
56
66
  });
57
- return getReviewById(db, rowId);
58
67
  }
59
68
  /**
60
69
  * List reviews for a sprint.
@@ -101,10 +110,85 @@ function getReview(db, reviewNum, sprintId) {
101
110
  }
102
111
  return row;
103
112
  }
113
+ /**
114
+ * Update an existing review.
115
+ * Wrapped with review:<reviewId> advisory lock (AD-0006).
116
+ *
117
+ * @param db - Database connection
118
+ * @param reviewNum - Review number (1-based)
119
+ * @param sprintId - Sprint ID (required)
120
+ * @param updates - Fields to update (content, verdict, review_type, counts, etc.)
121
+ * @returns Updated Review detail
122
+ * @throws ReviewNotInSprintError if review not found
123
+ * @throws ReviewNoUpdateFieldsError if no update fields provided
124
+ */
125
+ function updateReview(db, reviewNum, sprintId, updates) {
126
+ // Validate sprint exists (before lock)
127
+ (0, sprint_1.resolveSprint)(db, sprintId);
128
+ // Validate the review exists (before lock to fail fast)
129
+ const numStr = String(reviewNum).padStart(4, '0');
130
+ const existing = db.prepare('SELECT * FROM reviews WHERE review_num = ? AND sprint_id = ?').get(numStr, sprintId);
131
+ if (!existing) {
132
+ throw new errors_1.ReviewNotInSprintError(reviewNum, sprintId);
133
+ }
134
+ // Check that at least one update field is provided
135
+ if (Object.keys(updates).length === 0) {
136
+ throw new errors_1.ReviewNoUpdateFieldsError();
137
+ }
138
+ const owner = (0, locks_1.generateLockOwner)();
139
+ const lockName = `review:${numStr}`;
140
+ return (0, locks_1.withLock)(db, { name: lockName, owner }, () => {
141
+ const now = new Date().toISOString();
142
+ const sets = ['updated_at = ?'];
143
+ const params = [now];
144
+ if (updates.content !== undefined) {
145
+ sets.push('content = ?');
146
+ params.push(updates.content);
147
+ }
148
+ if (updates.verdict !== undefined) {
149
+ sets.push('verdict = ?');
150
+ params.push(updates.verdict);
151
+ }
152
+ if (updates.reviewType !== undefined) {
153
+ sets.push('review_type = ?');
154
+ params.push(updates.reviewType);
155
+ }
156
+ if (updates.assetName !== undefined) {
157
+ sets.push('asset_name = ?');
158
+ params.push(updates.assetName);
159
+ }
160
+ if (updates.assetRef !== undefined) {
161
+ sets.push('asset_ref = ?');
162
+ params.push(updates.assetRef);
163
+ }
164
+ if (updates.critical !== undefined) {
165
+ sets.push('critical_count = ?');
166
+ params.push(updates.critical);
167
+ }
168
+ if (updates.major !== undefined) {
169
+ sets.push('major_count = ?');
170
+ params.push(updates.major);
171
+ }
172
+ if (updates.minor !== undefined) {
173
+ sets.push('minor_count = ?');
174
+ params.push(updates.minor);
175
+ }
176
+ if (updates.suggestion !== undefined) {
177
+ sets.push('suggestion_count = ?');
178
+ params.push(updates.suggestion);
179
+ }
180
+ params.push(numStr, sprintId);
181
+ (0, retry_1.withTransaction)(db, () => {
182
+ db.prepare(`UPDATE reviews SET ${sets.join(', ')} WHERE review_num = ? AND sprint_id = ?`).run(...params);
183
+ });
184
+ return getReview(db, reviewNum, sprintId);
185
+ });
186
+ }
104
187
  // ─── Test Report API ───
105
188
  /**
106
189
  * Add a test report with explicit caller-provided 4-digit ID.
107
- * SAD-0031 Part A: No advisory lock, no task association.
190
+ * Wrapped with review:global advisory lock (AD-0006) for multi-process coordination.
191
+ * SAD-0031 Part A: no task association.
108
192
  * Duplicate validation via EXISTS on composite index (sprint_id, id).
109
193
  */
110
194
  function addTestReport(db, sprintId, testReportId, total, passed, failed, opts) {
@@ -112,24 +196,102 @@ function addTestReport(db, sprintId, testReportId, total, passed, failed, opts)
112
196
  // Validate ID format: /^\d{4}$/
113
197
  validateFourDigitId(testReportId, errors_1.TestReportBadIdError);
114
198
  const skipped = opts?.skipCount ?? 0;
115
- // Count consistency check (FS-SS-028-0008: WRN-TEST-REPORT-001)
199
+ // Count consistency check (FS-SS-028-0008: WRN-TEST-REPORT-001) — non-blocking
116
200
  if (passed + failed + skipped !== total) {
117
201
  console.warn(`WRN-TEST-REPORT-001: passed (${passed}) + failed (${failed}) + skipped (${skipped}) != total (${total})`);
118
202
  }
119
- const blocked = 0;
120
- const computeResult = failed > 0 ? 'FAIL' : 'PASS';
121
- const now = new Date().toISOString();
122
- const reportContent = opts?.content ?? '';
123
- // Duplicate check via EXISTS on composite index (sprint_id, id)
124
- const exists = db.prepare('SELECT EXISTS(SELECT 1 FROM test_reports WHERE sprint_id = ? AND id = ?) AS e').get(sprintId, testReportId);
125
- if (exists.e) {
126
- throw new errors_1.TestReportDuplicateIdError(testReportId, sprintId);
203
+ const owner = (0, locks_1.generateLockOwner)();
204
+ return (0, locks_1.withLock)(db, { name: 'review:global', owner }, () => {
205
+ // Duplicate check inside lock to prevent TOCTOU races
206
+ const exists = db.prepare('SELECT EXISTS(SELECT 1 FROM test_reports WHERE sprint_id = ? AND id = ?) AS e').get(sprintId, testReportId);
207
+ if (exists.e) {
208
+ throw new errors_1.TestReportDuplicateIdError(testReportId, sprintId);
209
+ }
210
+ const blocked = 0;
211
+ const computeResult = failed > 0 ? 'FAIL' : 'PASS';
212
+ const now = new Date().toISOString();
213
+ const reportContent = opts?.content ?? '';
214
+ (0, retry_1.withTransaction)(db, () => {
215
+ db.prepare(`INSERT INTO test_reports (id, sprint_id, total, passed, failed, skipped, blocked, result, command, duration_ms, report_path, module_id, status, content, pass_count, fail_count, skip_count, created_at, updated_at)
216
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(testReportId, sprintId, total, passed, failed, skipped, blocked, computeResult, opts?.command ?? null, opts?.duration ?? null, null, null, computeResult, reportContent, passed, failed, skipped, now, now);
217
+ });
218
+ return getTestReport(db, testReportId, sprintId);
219
+ });
220
+ }
221
+ /**
222
+ * Update an existing test report.
223
+ * Wrapped with review:global advisory lock (AD-0006).
224
+ *
225
+ * @param db - Database connection
226
+ * @param testReportId - Test report ID (4-digit zero-padded)
227
+ * @param sprintId - Sprint ID
228
+ * @param updates - Fields to update
229
+ * @returns Updated TestReport
230
+ * @throws error with ERR-TESTREPORT-004 if not found
231
+ */
232
+ function updateTestReport(db, testReportId, sprintId, updates) {
233
+ // Validate sprint and report exist (before lock to fail fast)
234
+ (0, sprint_1.resolveSprint)(db, sprintId);
235
+ const existing = db.prepare('SELECT * FROM test_reports WHERE id = ? AND sprint_id = ?').get(testReportId, sprintId);
236
+ if (!existing) {
237
+ reviewError('ERR-TESTREPORT-004', `Test report "${testReportId}" not found in sprint "${sprintId}"`, { testReportId, sprintId });
127
238
  }
128
- (0, retry_1.withTransaction)(db, () => {
129
- db.prepare(`INSERT INTO test_reports (id, sprint_id, total, passed, failed, skipped, blocked, result, command, duration_ms, report_path, module_id, status, content, pass_count, fail_count, skip_count, created_at, updated_at)
130
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(testReportId, sprintId, total, passed, failed, skipped, blocked, computeResult, opts?.command ?? null, opts?.duration ?? null, null, null, computeResult, reportContent, passed, failed, skipped, now, now);
239
+ // Check at least one update field
240
+ if (Object.keys(updates).length === 0) {
241
+ throw new errors_1.TestReportNoUpdateFieldsError();
242
+ }
243
+ const owner = (0, locks_1.generateLockOwner)();
244
+ return (0, locks_1.withLock)(db, { name: 'review:global', owner }, () => {
245
+ const now = new Date().toISOString();
246
+ const sets = ['updated_at = ?'];
247
+ const params = [now];
248
+ if (updates.total !== undefined) {
249
+ sets.push('total = ?');
250
+ params.push(updates.total);
251
+ }
252
+ if (updates.passed !== undefined) {
253
+ sets.push('passed = ?');
254
+ params.push(updates.passed);
255
+ }
256
+ if (updates.failed !== undefined) {
257
+ sets.push('failed = ?');
258
+ params.push(updates.failed);
259
+ }
260
+ if (updates.skipped !== undefined) {
261
+ sets.push('skipped = ?');
262
+ params.push(updates.skipped);
263
+ }
264
+ if (updates.command !== undefined) {
265
+ sets.push('command = ?');
266
+ params.push(updates.command);
267
+ }
268
+ if (updates.duration !== undefined) {
269
+ sets.push('duration_ms = ?');
270
+ params.push(updates.duration);
271
+ }
272
+ if (updates.content !== undefined) {
273
+ sets.push('content = ?');
274
+ params.push(updates.content);
275
+ }
276
+ // Recompute result and counts if totals changed
277
+ const newPassed = updates.passed ?? existing.passed;
278
+ const newFailed = updates.failed ?? existing.failed;
279
+ const newSkipped = updates.skipped ?? existing.skipped;
280
+ const computedResult = newFailed > 0 ? 'FAIL' : 'PASS';
281
+ sets.push('result = ?');
282
+ params.push(computedResult);
283
+ sets.push('pass_count = ?');
284
+ params.push(newPassed);
285
+ sets.push('fail_count = ?');
286
+ params.push(newFailed);
287
+ sets.push('skip_count = ?');
288
+ params.push(newSkipped);
289
+ params.push(testReportId, sprintId);
290
+ (0, retry_1.withTransaction)(db, () => {
291
+ db.prepare(`UPDATE test_reports SET ${sets.join(', ')} WHERE id = ? AND sprint_id = ?`).run(...params);
292
+ });
293
+ return getTestReport(db, testReportId, sprintId);
131
294
  });
132
- return getTestReport(db, testReportId, sprintId);
133
295
  }
134
296
  /**
135
297
  * List test reports. Task filter removed per SAD-0031 Part B.
@@ -1 +1 @@
1
- {"version":3,"file":"review-service.js","sourceRoot":"","sources":["../../src/services/review-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review-service.js","sourceRoot":"","sources":["../../src/services/review-service.ts"],"names":[],"mappings":"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"}
@@ -40,8 +40,8 @@ const SURVIVING_UPDATES = {
40
40
  contains: { from: ['MDL'], to: ['US', 'FR', 'NFR'], cardinality: 'one_to_many' },
41
41
  covered_by: { from: ['FS', 'NFS'], to: ['SAD', 'AD', 'QA'], cardinality: 'many_to_many' },
42
42
  covers: { from: ['SAD', 'AD', 'QA'], to: ['FS', 'NFS'], cardinality: 'many_to_many' },
43
- implemented_by: { from: ['SAD', 'AD', 'QA'], to: ['SRC'], cardinality: 'many_to_many' },
44
- implements: { from: ['SRC'], to: ['SAD', 'AD', 'QA'], cardinality: 'many_to_many' },
43
+ implemented_by: { from: ['SAD', 'AD', 'QA', 'TC'], to: ['SRC'], cardinality: 'many_to_many' },
44
+ implements: { from: ['SRC'], to: ['SAD', 'AD', 'QA', 'TC'], cardinality: 'many_to_many' },
45
45
  verified_by: { from: ['FS', 'NFS'], to: ['TS'], cardinality: 'many_to_many' },
46
46
  verifies: { from: ['TS'], to: ['FS', 'NFS'], cardinality: 'many_to_many' },
47
47
  // depends_on: unchanged [MDL] → [MDL]; no update applied