@mcoda/core 0.1.8 → 0.1.11

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 (216) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/README.md +2 -2
  3. package/dist/api/AgentsApi.d.ts +9 -1
  4. package/dist/api/AgentsApi.d.ts.map +1 -1
  5. package/dist/api/AgentsApi.js +201 -6
  6. package/dist/api/QaTasksApi.d.ts.map +1 -1
  7. package/dist/api/QaTasksApi.js +6 -0
  8. package/dist/api/TasksApi.d.ts.map +1 -1
  9. package/dist/api/TasksApi.js +1 -0
  10. package/dist/index.d.ts +4 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -0
  13. package/dist/prompts/PdrPrompts.d.ts.map +1 -1
  14. package/dist/prompts/PdrPrompts.js +9 -1
  15. package/dist/prompts/SdsPrompts.d.ts.map +1 -1
  16. package/dist/prompts/SdsPrompts.js +9 -0
  17. package/dist/services/agents/AgentRatingFormula.d.ts +27 -0
  18. package/dist/services/agents/AgentRatingFormula.d.ts.map +1 -0
  19. package/dist/services/agents/AgentRatingFormula.js +45 -0
  20. package/dist/services/agents/AgentRatingService.d.ts +60 -0
  21. package/dist/services/agents/AgentRatingService.d.ts.map +1 -0
  22. package/dist/services/agents/AgentRatingService.js +363 -0
  23. package/dist/services/agents/GatewayAgentService.d.ts +11 -0
  24. package/dist/services/agents/GatewayAgentService.d.ts.map +1 -1
  25. package/dist/services/agents/GatewayAgentService.js +525 -84
  26. package/dist/services/agents/GatewayHandoff.d.ts +11 -0
  27. package/dist/services/agents/GatewayHandoff.d.ts.map +1 -0
  28. package/dist/services/agents/GatewayHandoff.js +141 -0
  29. package/dist/services/agents/RoutingService.d.ts +1 -0
  30. package/dist/services/agents/RoutingService.d.ts.map +1 -1
  31. package/dist/services/agents/RoutingService.js +4 -4
  32. package/dist/services/backlog/BacklogService.d.ts +23 -0
  33. package/dist/services/backlog/BacklogService.d.ts.map +1 -1
  34. package/dist/services/backlog/BacklogService.js +62 -7
  35. package/dist/services/backlog/TaskOrderingHeuristics.d.ts +12 -0
  36. package/dist/services/backlog/TaskOrderingHeuristics.d.ts.map +1 -0
  37. package/dist/services/backlog/TaskOrderingHeuristics.js +56 -0
  38. package/dist/services/backlog/TaskOrderingService.d.ts +17 -4
  39. package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
  40. package/dist/services/backlog/TaskOrderingService.js +538 -79
  41. package/dist/services/docs/DocInventory.d.ts +11 -0
  42. package/dist/services/docs/DocInventory.d.ts.map +1 -0
  43. package/dist/services/docs/DocInventory.js +230 -0
  44. package/dist/services/docs/DocgenRunContext.d.ts +59 -0
  45. package/dist/services/docs/DocgenRunContext.d.ts.map +1 -0
  46. package/dist/services/docs/DocgenRunContext.js +4 -0
  47. package/dist/services/docs/DocsService.d.ts +70 -3
  48. package/dist/services/docs/DocsService.d.ts.map +1 -1
  49. package/dist/services/docs/DocsService.js +1930 -89
  50. package/dist/services/docs/alignment/DocAlignmentGraph.d.ts +23 -0
  51. package/dist/services/docs/alignment/DocAlignmentGraph.d.ts.map +1 -0
  52. package/dist/services/docs/alignment/DocAlignmentGraph.js +78 -0
  53. package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts +19 -0
  54. package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts.map +1 -0
  55. package/dist/services/docs/alignment/DocAlignmentPatcher.js +222 -0
  56. package/dist/services/docs/patch/DocPatchEngine.d.ts +57 -0
  57. package/dist/services/docs/patch/DocPatchEngine.d.ts.map +1 -0
  58. package/dist/services/docs/patch/DocPatchEngine.js +331 -0
  59. package/dist/services/docs/review/Glossary.d.ts +16 -0
  60. package/dist/services/docs/review/Glossary.d.ts.map +1 -0
  61. package/dist/services/docs/review/Glossary.js +47 -0
  62. package/dist/services/docs/review/ReviewReportRenderer.d.ts +3 -0
  63. package/dist/services/docs/review/ReviewReportRenderer.d.ts.map +1 -0
  64. package/dist/services/docs/review/ReviewReportRenderer.js +133 -0
  65. package/dist/services/docs/review/ReviewReportSchema.d.ts +39 -0
  66. package/dist/services/docs/review/ReviewReportSchema.d.ts.map +1 -0
  67. package/dist/services/docs/review/ReviewReportSchema.js +47 -0
  68. package/dist/services/docs/review/ReviewTypes.d.ts +76 -0
  69. package/dist/services/docs/review/ReviewTypes.d.ts.map +1 -0
  70. package/dist/services/docs/review/ReviewTypes.js +94 -0
  71. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts +7 -0
  72. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts.map +1 -0
  73. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.js +93 -0
  74. package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts +7 -0
  75. package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts.map +1 -0
  76. package/dist/services/docs/review/gates/ApiPathConsistencyGate.js +308 -0
  77. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts +8 -0
  78. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts.map +1 -0
  79. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.js +278 -0
  80. package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts +8 -0
  81. package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts.map +1 -0
  82. package/dist/services/docs/review/gates/DeploymentBlueprintGate.js +487 -0
  83. package/dist/services/docs/review/gates/NoMaybesGate.d.ts +8 -0
  84. package/dist/services/docs/review/gates/NoMaybesGate.d.ts.map +1 -0
  85. package/dist/services/docs/review/gates/NoMaybesGate.js +145 -0
  86. package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts +7 -0
  87. package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts.map +1 -0
  88. package/dist/services/docs/review/gates/OpenApiCoverageGate.js +266 -0
  89. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts +7 -0
  90. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts.map +1 -0
  91. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.js +59 -0
  92. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts +7 -0
  93. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts.map +1 -0
  94. package/dist/services/docs/review/gates/OpenQuestionsGate.js +200 -0
  95. package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts +7 -0
  96. package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts.map +1 -0
  97. package/dist/services/docs/review/gates/PdrInterfacesGate.js +159 -0
  98. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts +8 -0
  99. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts.map +1 -0
  100. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.js +129 -0
  101. package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts +7 -0
  102. package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts.map +1 -0
  103. package/dist/services/docs/review/gates/PdrOwnershipGate.js +169 -0
  104. package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts +10 -0
  105. package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts.map +1 -0
  106. package/dist/services/docs/review/gates/PlaceholderArtifactGate.js +261 -0
  107. package/dist/services/docs/review/gates/RfpConsentGate.d.ts +6 -0
  108. package/dist/services/docs/review/gates/RfpConsentGate.d.ts.map +1 -0
  109. package/dist/services/docs/review/gates/RfpConsentGate.js +127 -0
  110. package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts +7 -0
  111. package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts.map +1 -0
  112. package/dist/services/docs/review/gates/RfpDefinitionGate.js +173 -0
  113. package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts +7 -0
  114. package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts.map +1 -0
  115. package/dist/services/docs/review/gates/SdsAdaptersGate.js +196 -0
  116. package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts +7 -0
  117. package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts.map +1 -0
  118. package/dist/services/docs/review/gates/SdsDecisionsGate.js +89 -0
  119. package/dist/services/docs/review/gates/SdsOpsGate.d.ts +7 -0
  120. package/dist/services/docs/review/gates/SdsOpsGate.d.ts.map +1 -0
  121. package/dist/services/docs/review/gates/SdsOpsGate.js +162 -0
  122. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts +7 -0
  123. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts.map +1 -0
  124. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.js +166 -0
  125. package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts +7 -0
  126. package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts.map +1 -0
  127. package/dist/services/docs/review/gates/SqlRequiredTablesGate.js +273 -0
  128. package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts +7 -0
  129. package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts.map +1 -0
  130. package/dist/services/docs/review/gates/SqlSyntaxGate.js +203 -0
  131. package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts +9 -0
  132. package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts.map +1 -0
  133. package/dist/services/docs/review/gates/TerminologyNormalizationGate.js +217 -0
  134. package/dist/services/docs/review/glossary.json +47 -0
  135. package/dist/services/estimate/EstimateService.d.ts +2 -0
  136. package/dist/services/estimate/EstimateService.d.ts.map +1 -1
  137. package/dist/services/estimate/EstimateService.js +66 -18
  138. package/dist/services/estimate/VelocityService.d.ts +4 -0
  139. package/dist/services/estimate/VelocityService.d.ts.map +1 -1
  140. package/dist/services/estimate/VelocityService.js +179 -36
  141. package/dist/services/estimate/types.d.ts +1 -0
  142. package/dist/services/estimate/types.d.ts.map +1 -1
  143. package/dist/services/execution/GatewayTrioService.d.ts +200 -0
  144. package/dist/services/execution/GatewayTrioService.d.ts.map +1 -0
  145. package/dist/services/execution/GatewayTrioService.js +2492 -0
  146. package/dist/services/execution/QaApiRunner.d.ts +30 -0
  147. package/dist/services/execution/QaApiRunner.d.ts.map +1 -0
  148. package/dist/services/execution/QaApiRunner.js +881 -0
  149. package/dist/services/execution/QaFollowupService.d.ts +2 -0
  150. package/dist/services/execution/QaFollowupService.d.ts.map +1 -1
  151. package/dist/services/execution/QaFollowupService.js +9 -2
  152. package/dist/services/execution/QaPlanValidator.d.ts +10 -0
  153. package/dist/services/execution/QaPlanValidator.d.ts.map +1 -0
  154. package/dist/services/execution/QaPlanValidator.js +128 -0
  155. package/dist/services/execution/QaProfileService.d.ts +27 -1
  156. package/dist/services/execution/QaProfileService.d.ts.map +1 -1
  157. package/dist/services/execution/QaProfileService.js +354 -7
  158. package/dist/services/execution/QaTasksService.d.ts +59 -1
  159. package/dist/services/execution/QaTasksService.d.ts.map +1 -1
  160. package/dist/services/execution/QaTasksService.js +3347 -318
  161. package/dist/services/execution/QaTestCommandBuilder.d.ts +51 -0
  162. package/dist/services/execution/QaTestCommandBuilder.d.ts.map +1 -0
  163. package/dist/services/execution/QaTestCommandBuilder.js +495 -0
  164. package/dist/services/execution/TaskSelectionService.d.ts +4 -2
  165. package/dist/services/execution/TaskSelectionService.d.ts.map +1 -1
  166. package/dist/services/execution/TaskSelectionService.js +144 -28
  167. package/dist/services/execution/TaskStateService.d.ts +19 -6
  168. package/dist/services/execution/TaskStateService.d.ts.map +1 -1
  169. package/dist/services/execution/TaskStateService.js +128 -13
  170. package/dist/services/execution/WorkOnTasksService.d.ts +32 -1
  171. package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
  172. package/dist/services/execution/WorkOnTasksService.js +4667 -722
  173. package/dist/services/jobs/JobInsightsService.d.ts +4 -0
  174. package/dist/services/jobs/JobInsightsService.d.ts.map +1 -1
  175. package/dist/services/jobs/JobInsightsService.js +51 -5
  176. package/dist/services/jobs/JobResumeService.d.ts.map +1 -1
  177. package/dist/services/jobs/JobResumeService.js +23 -10
  178. package/dist/services/jobs/JobService.d.ts +56 -4
  179. package/dist/services/jobs/JobService.d.ts.map +1 -1
  180. package/dist/services/jobs/JobService.js +232 -1
  181. package/dist/services/openapi/OpenApiService.d.ts +51 -0
  182. package/dist/services/openapi/OpenApiService.d.ts.map +1 -1
  183. package/dist/services/openapi/OpenApiService.js +953 -106
  184. package/dist/services/planning/CreateTasksService.d.ts +21 -0
  185. package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
  186. package/dist/services/planning/CreateTasksService.js +569 -31
  187. package/dist/services/planning/RefineTasksService.d.ts +9 -0
  188. package/dist/services/planning/RefineTasksService.d.ts.map +1 -1
  189. package/dist/services/planning/RefineTasksService.js +409 -59
  190. package/dist/services/review/CodeReviewService.d.ts +18 -0
  191. package/dist/services/review/CodeReviewService.d.ts.map +1 -1
  192. package/dist/services/review/CodeReviewService.js +1309 -167
  193. package/dist/services/review/ReviewNormalizer.d.ts +9 -0
  194. package/dist/services/review/ReviewNormalizer.d.ts.map +1 -0
  195. package/dist/services/review/ReviewNormalizer.js +147 -0
  196. package/dist/services/shared/AuthErrors.d.ts +3 -0
  197. package/dist/services/shared/AuthErrors.d.ts.map +1 -0
  198. package/dist/services/shared/AuthErrors.js +17 -0
  199. package/dist/services/shared/DocdexGuidance.d.ts +7 -0
  200. package/dist/services/shared/DocdexGuidance.d.ts.map +1 -0
  201. package/dist/services/shared/DocdexGuidance.js +12 -0
  202. package/dist/services/shared/ProjectGuidance.d.ts +17 -0
  203. package/dist/services/shared/ProjectGuidance.d.ts.map +1 -0
  204. package/dist/services/shared/ProjectGuidance.js +78 -0
  205. package/dist/services/system/ToolDenylist.d.ts +13 -0
  206. package/dist/services/system/ToolDenylist.d.ts.map +1 -0
  207. package/dist/services/system/ToolDenylist.js +85 -0
  208. package/dist/services/tasks/TaskCommentFormatter.d.ts +20 -0
  209. package/dist/services/tasks/TaskCommentFormatter.d.ts.map +1 -0
  210. package/dist/services/tasks/TaskCommentFormatter.js +54 -0
  211. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -1
  212. package/dist/services/telemetry/TelemetryService.js +39 -7
  213. package/dist/workspace/WorkspaceManager.d.ts +26 -0
  214. package/dist/workspace/WorkspaceManager.d.ts.map +1 -1
  215. package/dist/workspace/WorkspaceManager.js +206 -32
  216. package/package.json +6 -5
@@ -0,0 +1,76 @@
1
+ import { DocArtifactKind } from "../DocgenRunContext.js";
2
+ export type ReviewSeverity = "blocker" | "high" | "medium" | "low" | "info";
3
+ export type ReviewIssueCategory = "structure" | "content" | "consistency" | "completeness" | "compliance" | "terminology" | "open_questions" | "api" | "sql" | "deployment" | "decision" | "other";
4
+ export type ReviewIssueLocation = {
5
+ kind: "heading";
6
+ heading: string;
7
+ path?: string;
8
+ } | {
9
+ kind: "line_range";
10
+ path: string;
11
+ lineStart: number;
12
+ lineEnd: number;
13
+ excerpt?: string;
14
+ };
15
+ export interface ReviewIssue {
16
+ id: string;
17
+ gateId: string;
18
+ severity: ReviewSeverity;
19
+ category: ReviewIssueCategory;
20
+ artifact: DocArtifactKind;
21
+ message: string;
22
+ remediation: string;
23
+ location: ReviewIssueLocation;
24
+ metadata?: Record<string, unknown>;
25
+ }
26
+ export type ReviewGateStatus = "pass" | "warn" | "fail" | "skipped";
27
+ export interface ReviewGateResult {
28
+ gateId: string;
29
+ gateName: string;
30
+ status: ReviewGateStatus;
31
+ issues: ReviewIssue[];
32
+ notes?: string[];
33
+ metadata?: Record<string, unknown>;
34
+ }
35
+ export interface ReviewDecision {
36
+ id: string;
37
+ summary: string;
38
+ rationale: string;
39
+ decidedAt: string;
40
+ relatedIssueIds?: string[];
41
+ metadata?: Record<string, unknown>;
42
+ }
43
+ export interface ReviewFix {
44
+ issueId: string;
45
+ summary: string;
46
+ appliedAt: string;
47
+ metadata?: Record<string, unknown>;
48
+ }
49
+ export type ReviewOutcomeStatus = "pass" | "warn" | "fail";
50
+ export interface ReviewSummary {
51
+ status: ReviewOutcomeStatus;
52
+ issueCount: number;
53
+ severityCounts: Record<ReviewSeverity, number>;
54
+ gateCounts: Record<ReviewGateStatus, number>;
55
+ }
56
+ export interface ReviewOutcome {
57
+ version: 1;
58
+ generatedAt: string;
59
+ gateResults: ReviewGateResult[];
60
+ issues: ReviewIssue[];
61
+ remainingOpenItems: ReviewIssue[];
62
+ fixesApplied: ReviewFix[];
63
+ decisions: ReviewDecision[];
64
+ summary: ReviewSummary;
65
+ }
66
+ export declare const sortIssues: (issues: ReviewIssue[]) => ReviewIssue[];
67
+ export declare const flattenIssues: (gateResults: ReviewGateResult[]) => ReviewIssue[];
68
+ export declare const summarizeGateResults: (gateResults: ReviewGateResult[]) => ReviewSummary;
69
+ export declare const aggregateReviewOutcome: (input: {
70
+ gateResults: ReviewGateResult[];
71
+ remainingOpenItems?: ReviewIssue[];
72
+ fixesApplied?: ReviewFix[];
73
+ decisions?: ReviewDecision[];
74
+ generatedAt?: string;
75
+ }) => ReviewOutcome;
76
+ //# sourceMappingURL=ReviewTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReviewTypes.d.ts","sourceRoot":"","sources":["../../../../src/services/docs/review/ReviewTypes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ const severityOrder = {
2
+ blocker: 0,
3
+ high: 1,
4
+ medium: 2,
5
+ low: 3,
6
+ info: 4,
7
+ };
8
+ const gateStatusOrder = {
9
+ fail: 0,
10
+ warn: 1,
11
+ pass: 2,
12
+ skipped: 3,
13
+ };
14
+ const emptySeverityCounts = () => ({
15
+ blocker: 0,
16
+ high: 0,
17
+ medium: 0,
18
+ low: 0,
19
+ info: 0,
20
+ });
21
+ const emptyGateCounts = () => ({
22
+ pass: 0,
23
+ warn: 0,
24
+ fail: 0,
25
+ skipped: 0,
26
+ });
27
+ const locationKey = (location) => {
28
+ if (location.kind === "heading") {
29
+ return `${location.path ?? ""}#${location.heading}`;
30
+ }
31
+ return `${location.path}:${location.lineStart}-${location.lineEnd}`;
32
+ };
33
+ export const sortIssues = (issues) => {
34
+ return issues.slice().sort((a, b) => {
35
+ const severityDiff = severityOrder[a.severity] - severityOrder[b.severity];
36
+ if (severityDiff !== 0)
37
+ return severityDiff;
38
+ const gateDiff = a.gateId.localeCompare(b.gateId);
39
+ if (gateDiff !== 0)
40
+ return gateDiff;
41
+ const artifactDiff = a.artifact.localeCompare(b.artifact);
42
+ if (artifactDiff !== 0)
43
+ return artifactDiff;
44
+ return locationKey(a.location).localeCompare(locationKey(b.location));
45
+ });
46
+ };
47
+ export const flattenIssues = (gateResults) => {
48
+ const collected = [];
49
+ for (const result of gateResults) {
50
+ collected.push(...result.issues);
51
+ }
52
+ return collected;
53
+ };
54
+ export const summarizeGateResults = (gateResults) => {
55
+ const gateCounts = emptyGateCounts();
56
+ const severityCounts = emptySeverityCounts();
57
+ let status = "pass";
58
+ let issueCount = 0;
59
+ for (const gate of gateResults) {
60
+ gateCounts[gate.status] = (gateCounts[gate.status] ?? 0) + 1;
61
+ if (gate.status === "fail")
62
+ status = "fail";
63
+ if (gate.status === "warn" && status === "pass")
64
+ status = "warn";
65
+ for (const issue of gate.issues) {
66
+ issueCount += 1;
67
+ severityCounts[issue.severity] = (severityCounts[issue.severity] ?? 0) + 1;
68
+ }
69
+ }
70
+ return { status, issueCount, severityCounts, gateCounts };
71
+ };
72
+ export const aggregateReviewOutcome = (input) => {
73
+ const gateResults = input.gateResults.slice().sort((a, b) => {
74
+ const statusDiff = gateStatusOrder[a.status] - gateStatusOrder[b.status];
75
+ if (statusDiff !== 0)
76
+ return statusDiff;
77
+ return a.gateId.localeCompare(b.gateId);
78
+ });
79
+ const issues = sortIssues(flattenIssues(gateResults));
80
+ const remainingOpenItems = sortIssues(input.remainingOpenItems ?? []);
81
+ const fixesApplied = (input.fixesApplied ?? []).slice().sort((a, b) => a.issueId.localeCompare(b.issueId));
82
+ const decisions = (input.decisions ?? []).slice().sort((a, b) => a.decidedAt.localeCompare(b.decidedAt));
83
+ const summary = summarizeGateResults(gateResults);
84
+ return {
85
+ version: 1,
86
+ generatedAt: input.generatedAt ?? new Date().toISOString(),
87
+ gateResults,
88
+ issues,
89
+ remainingOpenItems,
90
+ fixesApplied,
91
+ decisions,
92
+ summary,
93
+ };
94
+ };
@@ -0,0 +1,7 @@
1
+ import { DocgenArtifactInventory } from "../../DocgenRunContext.js";
2
+ import { ReviewGateResult } from "../ReviewTypes.js";
3
+ export interface AdminOpenApiSpecGateInput {
4
+ artifacts: DocgenArtifactInventory;
5
+ }
6
+ export declare const runAdminOpenApiSpecGate: (input: AdminOpenApiSpecGateInput) => Promise<ReviewGateResult>;
7
+ //# sourceMappingURL=AdminOpenApiSpecGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminOpenApiSpecGate.d.ts","sourceRoot":"","sources":["../../../../../src/services/docs/review/gates/AdminOpenApiSpecGate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAe,MAAM,mBAAmB,CAAC;AAGlE,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,uBAAuB,CAAC;CACpC;AA+BD,eAAO,MAAM,uBAAuB,GAClC,OAAO,yBAAyB,KAC/B,OAAO,CAAC,gBAAgB,CAuF1B,CAAC"}
@@ -0,0 +1,93 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { findAdminSurfaceMentions } from "../../../openapi/OpenApiService.js";
4
+ const buildIssue = (input) => {
5
+ return {
6
+ id: `gate-admin-openapi-spec-${input.index + 1}`,
7
+ gateId: "gate-admin-openapi-spec",
8
+ severity: "high",
9
+ category: "api",
10
+ artifact: input.record.kind,
11
+ message: "Admin surface referenced without a matching admin OpenAPI spec.",
12
+ remediation: "Generate or provide an admin OpenAPI spec for the referenced admin surface.",
13
+ location: {
14
+ kind: "line_range",
15
+ path: input.record.path,
16
+ lineStart: input.line,
17
+ lineEnd: input.line,
18
+ excerpt: input.excerpt,
19
+ },
20
+ metadata: {
21
+ heading: input.heading,
22
+ recordPath: input.record.path,
23
+ },
24
+ };
25
+ };
26
+ export const runAdminOpenApiSpecGate = async (input) => {
27
+ const records = [input.artifacts.pdr, input.artifacts.sds].filter((record) => Boolean(record));
28
+ if (records.length === 0) {
29
+ return {
30
+ gateId: "gate-admin-openapi-spec",
31
+ gateName: "Admin OpenAPI Spec",
32
+ status: "skipped",
33
+ issues: [],
34
+ notes: ["No PDR/SDS artifacts available for admin surface checks."],
35
+ };
36
+ }
37
+ const notes = [];
38
+ const mentions = [];
39
+ for (const record of records) {
40
+ try {
41
+ const content = await fs.readFile(record.path, "utf8");
42
+ const found = findAdminSurfaceMentions(content);
43
+ for (const mention of found) {
44
+ mentions.push({
45
+ record,
46
+ line: mention.line,
47
+ excerpt: mention.excerpt,
48
+ heading: mention.heading,
49
+ });
50
+ }
51
+ }
52
+ catch (error) {
53
+ notes.push(`Unable to scan ${record.path} for admin surfaces: ${error.message ?? String(error)}`);
54
+ }
55
+ }
56
+ if (mentions.length === 0) {
57
+ return {
58
+ gateId: "gate-admin-openapi-spec",
59
+ gateName: "Admin OpenAPI Spec",
60
+ status: "pass",
61
+ issues: [],
62
+ notes: notes.length > 0 ? notes : undefined,
63
+ metadata: { mentionCount: 0 },
64
+ };
65
+ }
66
+ const openapiRecords = input.artifacts.openapi ?? [];
67
+ const hasAdminSpec = openapiRecords.some((record) => record.variant === "admin" || /admin/i.test(path.basename(record.path)));
68
+ if (hasAdminSpec) {
69
+ return {
70
+ gateId: "gate-admin-openapi-spec",
71
+ gateName: "Admin OpenAPI Spec",
72
+ status: "pass",
73
+ issues: [],
74
+ notes: notes.length > 0 ? notes : undefined,
75
+ metadata: { mentionCount: mentions.length, hasAdminSpec: true },
76
+ };
77
+ }
78
+ const issues = mentions.map((mention, index) => buildIssue({
79
+ record: mention.record,
80
+ line: mention.line,
81
+ excerpt: mention.excerpt,
82
+ heading: mention.heading,
83
+ index,
84
+ }));
85
+ return {
86
+ gateId: "gate-admin-openapi-spec",
87
+ gateName: "Admin OpenAPI Spec",
88
+ status: "fail",
89
+ issues,
90
+ notes: notes.length > 0 ? notes : undefined,
91
+ metadata: { mentionCount: mentions.length, hasAdminSpec: false },
92
+ };
93
+ };
@@ -0,0 +1,7 @@
1
+ import { DocgenArtifactInventory } from "../../DocgenRunContext.js";
2
+ import { ReviewGateResult } from "../ReviewTypes.js";
3
+ export interface ApiPathConsistencyGateInput {
4
+ artifacts: DocgenArtifactInventory;
5
+ }
6
+ export declare const runApiPathConsistencyGate: (input: ApiPathConsistencyGateInput) => Promise<ReviewGateResult>;
7
+ //# sourceMappingURL=ApiPathConsistencyGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiPathConsistencyGate.d.ts","sourceRoot":"","sources":["../../../../../src/services/docs/review/gates/ApiPathConsistencyGate.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAA+B,MAAM,mBAAmB,CAAC;AAGlF,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,uBAAuB,CAAC;CACpC;AAqOD,eAAO,MAAM,yBAAyB,GACpC,OAAO,2BAA2B,KACjC,OAAO,CAAC,gBAAgB,CAgI1B,CAAC"}
@@ -0,0 +1,308 @@
1
+ import { promises as fs } from "node:fs";
2
+ import { extractOpenApiPaths, normalizeOpenApiPath } from "../../../openapi/OpenApiService.js";
3
+ const ISSUE_SEVERITY = {
4
+ prefix_mismatch: "high",
5
+ doc_missing_openapi: "high",
6
+ openapi_missing_docs: "medium",
7
+ };
8
+ const PREFIX_HINTS = new Set(["api", "apis", "internal", "public", "private", "admin"]);
9
+ const VERSION_PATTERN = /^v\d+(?:\.\d+)?$/i;
10
+ const PATH_PATTERN = /\/[A-Za-z0-9._~{}-]+(?:\/[A-Za-z0-9._~{}-]+)*/g;
11
+ const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
12
+ const isFenceLine = (line) => /^```|^~~~/.test(line.trim());
13
+ const isExampleHeading = (heading) => /example|sample/i.test(heading);
14
+ const sanitizePath = (candidate) => {
15
+ let cleaned = candidate.trim();
16
+ cleaned = cleaned.replace(/^[`"']+/, "");
17
+ cleaned = cleaned.replace(/[`"'\])},.;:!?]+$/g, "");
18
+ return cleaned;
19
+ };
20
+ const derivePrefix = (value) => {
21
+ const normalized = normalizeOpenApiPath(value);
22
+ const segments = normalized.split("/").filter(Boolean);
23
+ if (segments.length === 0)
24
+ return "/";
25
+ const first = segments[0]?.toLowerCase();
26
+ const second = segments[1]?.toLowerCase();
27
+ if (first && PREFIX_HINTS.has(first)) {
28
+ if (second && VERSION_PATTERN.test(second)) {
29
+ return `/${first}/${second}`;
30
+ }
31
+ return `/${first}`;
32
+ }
33
+ if (first && VERSION_PATTERN.test(first)) {
34
+ return `/${first}`;
35
+ }
36
+ return "/";
37
+ };
38
+ const selectCanonicalPrefix = (paths) => {
39
+ if (paths.length === 0)
40
+ return undefined;
41
+ const counts = new Map();
42
+ for (const entry of paths) {
43
+ counts.set(entry.prefix, (counts.get(entry.prefix) ?? 0) + 1);
44
+ }
45
+ const sorted = Array.from(counts.entries()).sort((a, b) => {
46
+ if (b[1] !== a[1])
47
+ return b[1] - a[1];
48
+ if (b[0].length !== a[0].length)
49
+ return b[0].length - a[0].length;
50
+ return a[0].localeCompare(b[0]);
51
+ });
52
+ return sorted[0]?.[0];
53
+ };
54
+ const buildIssue = (input) => {
55
+ const { issueType, entry, canonicalPrefix, expectedPrefix, actualPrefix } = input;
56
+ let message = "";
57
+ let remediation = "";
58
+ switch (issueType) {
59
+ case "prefix_mismatch":
60
+ message = `Expected API prefix "${expectedPrefix}" but found "${actualPrefix}" in ${entry.path}.`;
61
+ remediation = `Align endpoints to use the canonical prefix "${canonicalPrefix}".`;
62
+ break;
63
+ case "doc_missing_openapi":
64
+ message = `Endpoint "${entry.path}" appears in docs but is not present in OpenAPI.`;
65
+ remediation = "Update OpenAPI paths or remove/adjust the docs endpoint list.";
66
+ break;
67
+ case "openapi_missing_docs":
68
+ message = `OpenAPI endpoint "${entry.path}" is not described in docs.`;
69
+ remediation = "Add this endpoint to PDR/SDS interface sections.";
70
+ break;
71
+ default:
72
+ message = `API path consistency issue detected for ${entry.path}.`;
73
+ remediation = "Align docs and OpenAPI paths.";
74
+ }
75
+ return {
76
+ id: `gate-api-path-consistency-${entry.record.kind}-${issueType}-${entry.lineNumber}`,
77
+ gateId: "gate-api-path-consistency",
78
+ severity: ISSUE_SEVERITY[issueType],
79
+ category: "api",
80
+ artifact: entry.record.kind,
81
+ message,
82
+ remediation,
83
+ location: {
84
+ kind: "line_range",
85
+ path: entry.record.path,
86
+ lineStart: entry.lineNumber,
87
+ lineEnd: entry.lineNumber,
88
+ excerpt: entry.path,
89
+ },
90
+ metadata: {
91
+ issueType,
92
+ canonicalPrefix,
93
+ expectedPrefix,
94
+ actualPrefix,
95
+ normalizedPath: entry.normalized,
96
+ heading: entry.heading,
97
+ },
98
+ };
99
+ };
100
+ const dedupeByNormalized = (entries) => {
101
+ const seen = new Set();
102
+ const result = [];
103
+ for (const entry of entries) {
104
+ const key = `${entry.record.kind}:${entry.normalized}`;
105
+ if (seen.has(key))
106
+ continue;
107
+ seen.add(key);
108
+ result.push(entry);
109
+ }
110
+ return result;
111
+ };
112
+ const extractDocPaths = async (record) => {
113
+ const notes = [];
114
+ try {
115
+ const content = await fs.readFile(record.path, "utf8");
116
+ const lines = content.split(/\r?\n/);
117
+ const paths = [];
118
+ let inFence = false;
119
+ let allowSection = false;
120
+ let currentHeading;
121
+ for (let i = 0; i < lines.length; i += 1) {
122
+ const line = lines[i] ?? "";
123
+ const trimmed = line.trim();
124
+ if (!trimmed)
125
+ continue;
126
+ if (isFenceLine(trimmed)) {
127
+ inFence = !inFence;
128
+ continue;
129
+ }
130
+ const headingMatch = trimmed.match(/^#{1,6}\s+(.*)$/);
131
+ if (headingMatch) {
132
+ currentHeading = headingMatch[1]?.trim() || undefined;
133
+ allowSection = currentHeading ? isExampleHeading(currentHeading) : false;
134
+ }
135
+ if (inFence || allowSection)
136
+ continue;
137
+ const matches = line.matchAll(PATH_PATTERN);
138
+ for (const match of matches) {
139
+ const candidate = sanitizePath(match[0]);
140
+ if (!candidate || candidate === "/" || candidate.startsWith("//"))
141
+ continue;
142
+ const normalized = normalizeOpenApiPath(candidate);
143
+ if (!normalized || normalized === "/")
144
+ continue;
145
+ paths.push({
146
+ path: candidate,
147
+ normalized,
148
+ prefix: derivePrefix(normalized),
149
+ lineNumber: i + 1,
150
+ heading: currentHeading,
151
+ record,
152
+ });
153
+ }
154
+ }
155
+ return { paths, notes };
156
+ }
157
+ catch (error) {
158
+ notes.push(`Unable to scan ${record.path}: ${error.message ?? String(error)}`);
159
+ return { paths: [], notes };
160
+ }
161
+ };
162
+ const findOpenApiLine = (lines, target) => {
163
+ const escaped = escapeRegExp(target);
164
+ const pattern = new RegExp(`^\\s*['"]?${escaped}['"]?\\s*:`);
165
+ for (let i = 0; i < lines.length; i += 1) {
166
+ if (pattern.test(lines[i] ?? "")) {
167
+ return i + 1;
168
+ }
169
+ }
170
+ return undefined;
171
+ };
172
+ const extractOpenApiRecords = async (records) => {
173
+ const notes = [];
174
+ const paths = [];
175
+ for (const record of records) {
176
+ try {
177
+ const raw = await fs.readFile(record.path, "utf8");
178
+ const result = extractOpenApiPaths(raw);
179
+ if (result.errors.length > 0) {
180
+ notes.push(...result.errors.map((err) => `${record.path}: ${err}`));
181
+ }
182
+ const lines = raw.split(/\r?\n/);
183
+ for (const entry of result.paths) {
184
+ const normalized = normalizeOpenApiPath(entry);
185
+ if (!normalized || normalized === "/")
186
+ continue;
187
+ const lineNumber = findOpenApiLine(lines, entry) ?? 1;
188
+ paths.push({
189
+ path: entry,
190
+ normalized,
191
+ prefix: derivePrefix(normalized),
192
+ lineNumber,
193
+ record,
194
+ });
195
+ }
196
+ }
197
+ catch (error) {
198
+ notes.push(`Unable to read OpenAPI spec ${record.path}: ${error.message ?? String(error)}`);
199
+ }
200
+ }
201
+ return { paths, notes };
202
+ };
203
+ export const runApiPathConsistencyGate = async (input) => {
204
+ const issues = [];
205
+ const notes = [];
206
+ const docRecords = [input.artifacts.pdr, input.artifacts.sds].filter((record) => Boolean(record));
207
+ const openapiCandidates = input.artifacts.openapi ?? [];
208
+ const primaryOpenapi = openapiCandidates.filter((record) => record.variant !== "admin");
209
+ const openapiRecords = primaryOpenapi.length > 0 ? primaryOpenapi : openapiCandidates;
210
+ if (docRecords.length === 0 && openapiRecords.length === 0) {
211
+ return {
212
+ gateId: "gate-api-path-consistency",
213
+ gateName: "API Path Consistency",
214
+ status: "skipped",
215
+ issues,
216
+ notes: ["No PDR/SDS or OpenAPI artifacts available for path consistency checks."],
217
+ };
218
+ }
219
+ const docPathResults = await Promise.all(docRecords.map((record) => extractDocPaths(record)));
220
+ const docPaths = docPathResults.flatMap((result) => result.paths);
221
+ docPathResults.forEach((result) => notes.push(...result.notes));
222
+ const openapiResult = await extractOpenApiRecords(openapiRecords);
223
+ const openapiPaths = openapiResult.paths;
224
+ notes.push(...openapiResult.notes);
225
+ if (openapiRecords.length === 0) {
226
+ notes.push("OpenAPI spec not found; canonical prefix derived from docs.");
227
+ }
228
+ if (docPaths.length === 0 && openapiPaths.length === 0) {
229
+ return {
230
+ gateId: "gate-api-path-consistency",
231
+ gateName: "API Path Consistency",
232
+ status: "skipped",
233
+ issues,
234
+ notes: notes.length > 0 ? notes : ["No API endpoints detected in docs or OpenAPI."],
235
+ };
236
+ }
237
+ const uniqueDocPaths = dedupeByNormalized(docPaths);
238
+ const uniqueOpenapiPaths = dedupeByNormalized(openapiPaths);
239
+ const canonicalPrefix = selectCanonicalPrefix(uniqueOpenapiPaths.length > 0 ? uniqueOpenapiPaths : uniqueDocPaths);
240
+ if (!canonicalPrefix) {
241
+ return {
242
+ gateId: "gate-api-path-consistency",
243
+ gateName: "API Path Consistency",
244
+ status: "skipped",
245
+ issues,
246
+ notes: notes.length > 0 ? notes : ["Unable to determine canonical API prefix."],
247
+ };
248
+ }
249
+ for (const entry of uniqueDocPaths) {
250
+ if (entry.prefix !== canonicalPrefix) {
251
+ issues.push(buildIssue({
252
+ issueType: "prefix_mismatch",
253
+ entry,
254
+ canonicalPrefix,
255
+ expectedPrefix: canonicalPrefix,
256
+ actualPrefix: entry.prefix,
257
+ }));
258
+ }
259
+ }
260
+ for (const entry of uniqueOpenapiPaths) {
261
+ if (entry.prefix !== canonicalPrefix) {
262
+ issues.push(buildIssue({
263
+ issueType: "prefix_mismatch",
264
+ entry,
265
+ canonicalPrefix,
266
+ expectedPrefix: canonicalPrefix,
267
+ actualPrefix: entry.prefix,
268
+ }));
269
+ }
270
+ }
271
+ if (uniqueOpenapiPaths.length > 0) {
272
+ const openapiSet = new Set(uniqueOpenapiPaths.map((entry) => entry.normalized));
273
+ for (const entry of uniqueDocPaths) {
274
+ if (!openapiSet.has(entry.normalized)) {
275
+ issues.push(buildIssue({
276
+ issueType: "doc_missing_openapi",
277
+ entry,
278
+ canonicalPrefix,
279
+ }));
280
+ }
281
+ }
282
+ }
283
+ if (uniqueDocPaths.length > 0) {
284
+ const docSet = new Set(uniqueDocPaths.map((entry) => entry.normalized));
285
+ for (const entry of uniqueOpenapiPaths) {
286
+ if (!docSet.has(entry.normalized)) {
287
+ issues.push(buildIssue({
288
+ issueType: "openapi_missing_docs",
289
+ entry,
290
+ canonicalPrefix,
291
+ }));
292
+ }
293
+ }
294
+ }
295
+ const status = issues.length > 0 ? "fail" : "pass";
296
+ return {
297
+ gateId: "gate-api-path-consistency",
298
+ gateName: "API Path Consistency",
299
+ status,
300
+ issues,
301
+ notes: notes.length > 0 ? notes : undefined,
302
+ metadata: {
303
+ canonicalPrefix,
304
+ docPathCount: uniqueDocPaths.length,
305
+ openapiPathCount: uniqueOpenapiPaths.length,
306
+ },
307
+ };
308
+ };
@@ -0,0 +1,8 @@
1
+ import { DocgenArtifactInventory } from "../../DocgenRunContext.js";
2
+ import { ReviewGateResult } from "../ReviewTypes.js";
3
+ export interface BuildReadyCompletenessGateInput {
4
+ artifacts: DocgenArtifactInventory;
5
+ buildReady?: boolean;
6
+ }
7
+ export declare const runBuildReadyCompletenessGate: (input: BuildReadyCompletenessGateInput) => Promise<ReviewGateResult>;
8
+ //# sourceMappingURL=BuildReadyCompletenessGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildReadyCompletenessGate.d.ts","sourceRoot":"","sources":["../../../../../src/services/docs/review/gates/BuildReadyCompletenessGate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAA+B,MAAM,mBAAmB,CAAC;AAElF,MAAM,WAAW,+BAA+B;IAC9C,SAAS,EAAE,uBAAuB,CAAC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAmMD,eAAO,MAAM,6BAA6B,GACxC,OAAO,+BAA+B,KACrC,OAAO,CAAC,gBAAgB,CAyJ1B,CAAC"}