@mcoda/core 0.1.9 → 0.1.12

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 (204) hide show
  1. package/README.md +2 -2
  2. package/dist/api/AgentsApi.d.ts +1 -0
  3. package/dist/api/AgentsApi.d.ts.map +1 -1
  4. package/dist/api/AgentsApi.js +136 -11
  5. package/dist/api/QaTasksApi.d.ts.map +1 -1
  6. package/dist/api/QaTasksApi.js +4 -0
  7. package/dist/prompts/PdrPrompts.d.ts.map +1 -1
  8. package/dist/prompts/PdrPrompts.js +6 -0
  9. package/dist/prompts/SdsPrompts.d.ts.map +1 -1
  10. package/dist/prompts/SdsPrompts.js +7 -0
  11. package/dist/services/agents/AgentRatingService.d.ts +19 -0
  12. package/dist/services/agents/AgentRatingService.d.ts.map +1 -1
  13. package/dist/services/agents/AgentRatingService.js +66 -2
  14. package/dist/services/agents/GatewayAgentService.d.ts +8 -0
  15. package/dist/services/agents/GatewayAgentService.d.ts.map +1 -1
  16. package/dist/services/agents/GatewayAgentService.js +462 -65
  17. package/dist/services/agents/GatewayHandoff.d.ts +5 -1
  18. package/dist/services/agents/GatewayHandoff.d.ts.map +1 -1
  19. package/dist/services/agents/GatewayHandoff.js +65 -32
  20. package/dist/services/agents/RoutingService.d.ts +1 -0
  21. package/dist/services/agents/RoutingService.d.ts.map +1 -1
  22. package/dist/services/agents/RoutingService.js +4 -4
  23. package/dist/services/backlog/BacklogService.d.ts +23 -0
  24. package/dist/services/backlog/BacklogService.d.ts.map +1 -1
  25. package/dist/services/backlog/BacklogService.js +62 -7
  26. package/dist/services/backlog/TaskOrderingHeuristics.d.ts +12 -0
  27. package/dist/services/backlog/TaskOrderingHeuristics.d.ts.map +1 -0
  28. package/dist/services/backlog/TaskOrderingHeuristics.js +56 -0
  29. package/dist/services/backlog/TaskOrderingService.d.ts +16 -4
  30. package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
  31. package/dist/services/backlog/TaskOrderingService.js +529 -73
  32. package/dist/services/docs/DocInventory.d.ts +11 -0
  33. package/dist/services/docs/DocInventory.d.ts.map +1 -0
  34. package/dist/services/docs/DocInventory.js +230 -0
  35. package/dist/services/docs/DocgenRunContext.d.ts +59 -0
  36. package/dist/services/docs/DocgenRunContext.d.ts.map +1 -0
  37. package/dist/services/docs/DocgenRunContext.js +4 -0
  38. package/dist/services/docs/DocsService.d.ts +59 -2
  39. package/dist/services/docs/DocsService.d.ts.map +1 -1
  40. package/dist/services/docs/DocsService.js +1701 -48
  41. package/dist/services/docs/alignment/DocAlignmentGraph.d.ts +23 -0
  42. package/dist/services/docs/alignment/DocAlignmentGraph.d.ts.map +1 -0
  43. package/dist/services/docs/alignment/DocAlignmentGraph.js +78 -0
  44. package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts +19 -0
  45. package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts.map +1 -0
  46. package/dist/services/docs/alignment/DocAlignmentPatcher.js +222 -0
  47. package/dist/services/docs/patch/DocPatchEngine.d.ts +57 -0
  48. package/dist/services/docs/patch/DocPatchEngine.d.ts.map +1 -0
  49. package/dist/services/docs/patch/DocPatchEngine.js +331 -0
  50. package/dist/services/docs/review/Glossary.d.ts +16 -0
  51. package/dist/services/docs/review/Glossary.d.ts.map +1 -0
  52. package/dist/services/docs/review/Glossary.js +47 -0
  53. package/dist/services/docs/review/ReviewReportRenderer.d.ts +3 -0
  54. package/dist/services/docs/review/ReviewReportRenderer.d.ts.map +1 -0
  55. package/dist/services/docs/review/ReviewReportRenderer.js +133 -0
  56. package/dist/services/docs/review/ReviewReportSchema.d.ts +39 -0
  57. package/dist/services/docs/review/ReviewReportSchema.d.ts.map +1 -0
  58. package/dist/services/docs/review/ReviewReportSchema.js +47 -0
  59. package/dist/services/docs/review/ReviewTypes.d.ts +76 -0
  60. package/dist/services/docs/review/ReviewTypes.d.ts.map +1 -0
  61. package/dist/services/docs/review/ReviewTypes.js +94 -0
  62. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts +7 -0
  63. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts.map +1 -0
  64. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.js +93 -0
  65. package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts +7 -0
  66. package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts.map +1 -0
  67. package/dist/services/docs/review/gates/ApiPathConsistencyGate.js +308 -0
  68. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts +8 -0
  69. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts.map +1 -0
  70. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.js +278 -0
  71. package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts +8 -0
  72. package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts.map +1 -0
  73. package/dist/services/docs/review/gates/DeploymentBlueprintGate.js +487 -0
  74. package/dist/services/docs/review/gates/NoMaybesGate.d.ts +8 -0
  75. package/dist/services/docs/review/gates/NoMaybesGate.d.ts.map +1 -0
  76. package/dist/services/docs/review/gates/NoMaybesGate.js +145 -0
  77. package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts +7 -0
  78. package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts.map +1 -0
  79. package/dist/services/docs/review/gates/OpenApiCoverageGate.js +266 -0
  80. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts +7 -0
  81. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts.map +1 -0
  82. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.js +59 -0
  83. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts +7 -0
  84. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts.map +1 -0
  85. package/dist/services/docs/review/gates/OpenQuestionsGate.js +200 -0
  86. package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts +7 -0
  87. package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts.map +1 -0
  88. package/dist/services/docs/review/gates/PdrInterfacesGate.js +159 -0
  89. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts +8 -0
  90. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts.map +1 -0
  91. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.js +129 -0
  92. package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts +7 -0
  93. package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts.map +1 -0
  94. package/dist/services/docs/review/gates/PdrOwnershipGate.js +169 -0
  95. package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts +10 -0
  96. package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts.map +1 -0
  97. package/dist/services/docs/review/gates/PlaceholderArtifactGate.js +261 -0
  98. package/dist/services/docs/review/gates/RfpConsentGate.d.ts +6 -0
  99. package/dist/services/docs/review/gates/RfpConsentGate.d.ts.map +1 -0
  100. package/dist/services/docs/review/gates/RfpConsentGate.js +127 -0
  101. package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts +7 -0
  102. package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts.map +1 -0
  103. package/dist/services/docs/review/gates/RfpDefinitionGate.js +173 -0
  104. package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts +7 -0
  105. package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts.map +1 -0
  106. package/dist/services/docs/review/gates/SdsAdaptersGate.js +196 -0
  107. package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts +7 -0
  108. package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts.map +1 -0
  109. package/dist/services/docs/review/gates/SdsDecisionsGate.js +89 -0
  110. package/dist/services/docs/review/gates/SdsOpsGate.d.ts +7 -0
  111. package/dist/services/docs/review/gates/SdsOpsGate.d.ts.map +1 -0
  112. package/dist/services/docs/review/gates/SdsOpsGate.js +162 -0
  113. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts +7 -0
  114. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts.map +1 -0
  115. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.js +166 -0
  116. package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts +7 -0
  117. package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts.map +1 -0
  118. package/dist/services/docs/review/gates/SqlRequiredTablesGate.js +273 -0
  119. package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts +7 -0
  120. package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts.map +1 -0
  121. package/dist/services/docs/review/gates/SqlSyntaxGate.js +203 -0
  122. package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts +9 -0
  123. package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts.map +1 -0
  124. package/dist/services/docs/review/gates/TerminologyNormalizationGate.js +217 -0
  125. package/dist/services/docs/review/glossary.json +47 -0
  126. package/dist/services/estimate/EstimateService.d.ts +2 -0
  127. package/dist/services/estimate/EstimateService.d.ts.map +1 -1
  128. package/dist/services/estimate/EstimateService.js +66 -18
  129. package/dist/services/estimate/VelocityService.d.ts +4 -0
  130. package/dist/services/estimate/VelocityService.d.ts.map +1 -1
  131. package/dist/services/estimate/VelocityService.js +179 -36
  132. package/dist/services/estimate/types.d.ts +1 -0
  133. package/dist/services/estimate/types.d.ts.map +1 -1
  134. package/dist/services/execution/GatewayTrioService.d.ts +71 -4
  135. package/dist/services/execution/GatewayTrioService.d.ts.map +1 -1
  136. package/dist/services/execution/GatewayTrioService.js +1695 -328
  137. package/dist/services/execution/QaApiRunner.d.ts +30 -0
  138. package/dist/services/execution/QaApiRunner.d.ts.map +1 -0
  139. package/dist/services/execution/QaApiRunner.js +881 -0
  140. package/dist/services/execution/QaFollowupService.d.ts +1 -0
  141. package/dist/services/execution/QaFollowupService.d.ts.map +1 -1
  142. package/dist/services/execution/QaFollowupService.js +8 -2
  143. package/dist/services/execution/QaPlanValidator.d.ts +10 -0
  144. package/dist/services/execution/QaPlanValidator.d.ts.map +1 -0
  145. package/dist/services/execution/QaPlanValidator.js +128 -0
  146. package/dist/services/execution/QaProfileService.d.ts +21 -1
  147. package/dist/services/execution/QaProfileService.d.ts.map +1 -1
  148. package/dist/services/execution/QaProfileService.js +214 -29
  149. package/dist/services/execution/QaTasksService.d.ts +41 -1
  150. package/dist/services/execution/QaTasksService.d.ts.map +1 -1
  151. package/dist/services/execution/QaTasksService.js +2851 -500
  152. package/dist/services/execution/QaTestCommandBuilder.d.ts +51 -0
  153. package/dist/services/execution/QaTestCommandBuilder.d.ts.map +1 -0
  154. package/dist/services/execution/QaTestCommandBuilder.js +495 -0
  155. package/dist/services/execution/TaskSelectionService.d.ts +4 -2
  156. package/dist/services/execution/TaskSelectionService.d.ts.map +1 -1
  157. package/dist/services/execution/TaskSelectionService.js +144 -28
  158. package/dist/services/execution/TaskStateService.d.ts +19 -6
  159. package/dist/services/execution/TaskStateService.d.ts.map +1 -1
  160. package/dist/services/execution/TaskStateService.js +128 -13
  161. package/dist/services/execution/WorkOnTasksService.d.ts +19 -2
  162. package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
  163. package/dist/services/execution/WorkOnTasksService.js +3913 -1225
  164. package/dist/services/jobs/JobInsightsService.d.ts +4 -0
  165. package/dist/services/jobs/JobInsightsService.d.ts.map +1 -1
  166. package/dist/services/jobs/JobInsightsService.js +51 -5
  167. package/dist/services/jobs/JobResumeService.d.ts.map +1 -1
  168. package/dist/services/jobs/JobResumeService.js +23 -10
  169. package/dist/services/jobs/JobService.d.ts +56 -4
  170. package/dist/services/jobs/JobService.d.ts.map +1 -1
  171. package/dist/services/jobs/JobService.js +232 -1
  172. package/dist/services/openapi/OpenApiService.d.ts +41 -0
  173. package/dist/services/openapi/OpenApiService.d.ts.map +1 -1
  174. package/dist/services/openapi/OpenApiService.js +889 -98
  175. package/dist/services/planning/CreateTasksService.d.ts +15 -0
  176. package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
  177. package/dist/services/planning/CreateTasksService.js +311 -6
  178. package/dist/services/planning/RefineTasksService.d.ts +4 -0
  179. package/dist/services/planning/RefineTasksService.d.ts.map +1 -1
  180. package/dist/services/planning/RefineTasksService.js +225 -24
  181. package/dist/services/review/CodeReviewService.d.ts +4 -0
  182. package/dist/services/review/CodeReviewService.d.ts.map +1 -1
  183. package/dist/services/review/CodeReviewService.js +778 -232
  184. package/dist/services/review/ReviewNormalizer.d.ts +9 -0
  185. package/dist/services/review/ReviewNormalizer.d.ts.map +1 -0
  186. package/dist/services/review/ReviewNormalizer.js +147 -0
  187. package/dist/services/shared/AuthErrors.d.ts +3 -0
  188. package/dist/services/shared/AuthErrors.d.ts.map +1 -0
  189. package/dist/services/shared/AuthErrors.js +17 -0
  190. package/dist/services/shared/DocdexGuidance.d.ts +7 -0
  191. package/dist/services/shared/DocdexGuidance.d.ts.map +1 -0
  192. package/dist/services/shared/DocdexGuidance.js +12 -0
  193. package/dist/services/shared/ProjectGuidance.d.ts +12 -1
  194. package/dist/services/shared/ProjectGuidance.d.ts.map +1 -1
  195. package/dist/services/shared/ProjectGuidance.js +64 -7
  196. package/dist/services/system/ToolDenylist.d.ts +13 -0
  197. package/dist/services/system/ToolDenylist.d.ts.map +1 -0
  198. package/dist/services/system/ToolDenylist.js +85 -0
  199. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -1
  200. package/dist/services/telemetry/TelemetryService.js +39 -7
  201. package/dist/workspace/WorkspaceManager.d.ts +22 -0
  202. package/dist/workspace/WorkspaceManager.d.ts.map +1 -1
  203. package/dist/workspace/WorkspaceManager.js +203 -32
  204. package/package.json +6 -5
@@ -0,0 +1,23 @@
1
+ import { DocArtifactKind, DocArtifactVariant } from "../DocgenRunContext.js";
2
+ export type DocAlignmentArtifactKind = DocArtifactKind | "rfp" | "telemetry";
3
+ export interface DocAlignmentNode {
4
+ artifact: DocAlignmentArtifactKind;
5
+ section: string;
6
+ variant?: DocArtifactVariant;
7
+ }
8
+ export interface DocAlignmentRule {
9
+ id: string;
10
+ description: string;
11
+ sources: DocAlignmentNode[];
12
+ targets: DocAlignmentNode[];
13
+ tags?: string[];
14
+ }
15
+ export declare class DocAlignmentGraph {
16
+ private rules;
17
+ constructor(rules: DocAlignmentRule[]);
18
+ static createDefault(): DocAlignmentGraph;
19
+ listRules(): DocAlignmentRule[];
20
+ getRule(ruleId: string): DocAlignmentRule | undefined;
21
+ getImpactedSections(ruleId: string): DocAlignmentNode[];
22
+ }
23
+ //# sourceMappingURL=DocAlignmentGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocAlignmentGraph.d.ts","sourceRoot":"","sources":["../../../../src/services/docs/alignment/DocAlignmentGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE7E,MAAM,MAAM,wBAAwB,GAAG,eAAe,GAAG,KAAK,GAAG,WAAW,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,wBAAwB,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAyDD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAAgC;gBAEjC,KAAK,EAAE,gBAAgB,EAAE;IAIrC,MAAM,CAAC,aAAa,IAAI,iBAAiB;IAIzC,SAAS,IAAI,gBAAgB,EAAE;IAI/B,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIrD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,EAAE;CASxD"}
@@ -0,0 +1,78 @@
1
+ const DEFAULT_RULES = [
2
+ {
3
+ id: "consent-model",
4
+ description: "Consent and minimization policies propagate across docs.",
5
+ sources: [{ artifact: "rfp", section: "Consent & Minimization" }],
6
+ targets: [
7
+ { artifact: "pdr", section: "Ownership & Consent Flow" },
8
+ { artifact: "sds", section: "Policy & Telemetry" },
9
+ { artifact: "openapi", variant: "primary", section: "Security Schemes" },
10
+ { artifact: "openapi", variant: "admin", section: "Security Schemes" },
11
+ { artifact: "telemetry", section: "Consent Metadata" },
12
+ ],
13
+ },
14
+ {
15
+ id: "api-prefix",
16
+ description: "Canonical API prefixes should align across docs and specs.",
17
+ sources: [
18
+ { artifact: "pdr", section: "Interfaces / APIs" },
19
+ { artifact: "sds", section: "Interface Contracts" },
20
+ ],
21
+ targets: [
22
+ { artifact: "pdr", section: "Interfaces / APIs" },
23
+ { artifact: "sds", section: "Interface Contracts" },
24
+ { artifact: "openapi", variant: "primary", section: "Paths" },
25
+ { artifact: "openapi", variant: "admin", section: "Paths" },
26
+ ],
27
+ },
28
+ {
29
+ id: "terminology",
30
+ description: "Canonical terminology and naming conventions stay aligned.",
31
+ sources: [{ artifact: "rfp", section: "Definitions" }],
32
+ targets: [
33
+ { artifact: "pdr", section: "Terminology" },
34
+ { artifact: "sds", section: "Terminology" },
35
+ { artifact: "sql", section: "Schema" },
36
+ { artifact: "openapi", variant: "primary", section: "Schemas" },
37
+ { artifact: "openapi", variant: "admin", section: "Schemas" },
38
+ ],
39
+ },
40
+ ];
41
+ const nodeKey = (node) => {
42
+ return `${node.artifact}:${node.variant ?? ""}:${node.section}`;
43
+ };
44
+ const sortNodes = (nodes) => {
45
+ return nodes.slice().sort((a, b) => {
46
+ const artifactDiff = a.artifact.localeCompare(b.artifact);
47
+ if (artifactDiff !== 0)
48
+ return artifactDiff;
49
+ const variantDiff = (a.variant ?? "").localeCompare(b.variant ?? "");
50
+ if (variantDiff !== 0)
51
+ return variantDiff;
52
+ return a.section.localeCompare(b.section);
53
+ });
54
+ };
55
+ export class DocAlignmentGraph {
56
+ constructor(rules) {
57
+ this.rules = new Map(rules.map((rule) => [rule.id, rule]));
58
+ }
59
+ static createDefault() {
60
+ return new DocAlignmentGraph(DEFAULT_RULES);
61
+ }
62
+ listRules() {
63
+ return Array.from(this.rules.values());
64
+ }
65
+ getRule(ruleId) {
66
+ return this.rules.get(ruleId);
67
+ }
68
+ getImpactedSections(ruleId) {
69
+ const rule = this.rules.get(ruleId);
70
+ if (!rule)
71
+ return [];
72
+ const deduped = new Map();
73
+ for (const node of rule.targets) {
74
+ deduped.set(nodeKey(node), node);
75
+ }
76
+ return sortNodes(Array.from(deduped.values()));
77
+ }
78
+ }
@@ -0,0 +1,19 @@
1
+ import { DocAlignmentGraph } from "./DocAlignmentGraph.js";
2
+ import type { DocgenRunContext } from "../DocgenRunContext.js";
3
+ import type { ReviewGateResult } from "../review/ReviewTypes.js";
4
+ import type { ReviewReportDelta } from "../review/ReviewReportSchema.js";
5
+ export interface DocAlignmentPatchInput {
6
+ runContext: DocgenRunContext;
7
+ gateResults: ReviewGateResult[];
8
+ dryRun?: boolean;
9
+ }
10
+ export interface DocAlignmentPatchResult {
11
+ deltas: ReviewReportDelta[];
12
+ warnings: string[];
13
+ }
14
+ export declare class DocAlignmentPatcher {
15
+ private graph;
16
+ constructor(graph?: DocAlignmentGraph);
17
+ apply(input: DocAlignmentPatchInput): Promise<DocAlignmentPatchResult>;
18
+ }
19
+ //# sourceMappingURL=DocAlignmentPatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocAlignmentPatcher.d.ts","sourceRoot":"","sources":["../../../../src/services/docs/alignment/DocAlignmentPatcher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAsC,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACnG,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,0BAA0B,CAAC;AAC9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGzE,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAqGD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAoB;gBAErB,KAAK,CAAC,EAAE,iBAAiB;IAI/B,KAAK,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAiJ7E"}
@@ -0,0 +1,222 @@
1
+ import crypto from "node:crypto";
2
+ import { promises as fs } from "node:fs";
3
+ import path from "node:path";
4
+ import { DocAlignmentGraph } from "./DocAlignmentGraph.js";
5
+ import { DocPatchEngine } from "../patch/DocPatchEngine.js";
6
+ const API_PREFIX_GATE = "gate-api-path-consistency";
7
+ const TERMINOLOGY_GATE = "gate-terminology-normalization";
8
+ const hashContent = (content) => crypto.createHash("sha256").update(content).digest("hex");
9
+ const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
10
+ const isLineRange = (issue) => issue.location.kind === "line_range";
11
+ const findArtifactRecord = (runContext, filePath) => {
12
+ const normalized = path.resolve(filePath);
13
+ const { artifacts } = runContext;
14
+ if (artifacts.pdr && path.resolve(artifacts.pdr.path) === normalized)
15
+ return artifacts.pdr;
16
+ if (artifacts.sds && path.resolve(artifacts.sds.path) === normalized)
17
+ return artifacts.sds;
18
+ if (artifacts.sql && path.resolve(artifacts.sql.path) === normalized)
19
+ return artifacts.sql;
20
+ for (const record of artifacts.openapi) {
21
+ if (path.resolve(record.path) === normalized)
22
+ return record;
23
+ }
24
+ for (const record of artifacts.blueprints) {
25
+ if (path.resolve(record.path) === normalized)
26
+ return record;
27
+ }
28
+ return undefined;
29
+ };
30
+ const collectIssues = (gateResults, gateId) => gateResults.flatMap((result) => (result.gateId === gateId ? result.issues : []));
31
+ const metadataString = (value) => typeof value === "string" && value.trim().length > 0 ? value : undefined;
32
+ const buildApiPrefixReplacement = (issue, line) => {
33
+ const metadata = (issue.metadata ?? {});
34
+ const issueType = metadataString(metadata.issueType);
35
+ if (issueType !== "prefix_mismatch")
36
+ return undefined;
37
+ const expectedPrefix = metadataString(metadata.expectedPrefix) ?? metadataString(metadata.canonicalPrefix);
38
+ const actualPrefix = metadataString(metadata.actualPrefix);
39
+ if (!expectedPrefix || !actualPrefix)
40
+ return undefined;
41
+ if (!line.includes(actualPrefix))
42
+ return undefined;
43
+ const excerpt = isLineRange(issue) ? metadataString(issue.location.excerpt) : undefined;
44
+ let nextLine = line;
45
+ if (excerpt && line.includes(excerpt)) {
46
+ const updated = excerpt.replace(actualPrefix, expectedPrefix);
47
+ if (updated !== excerpt) {
48
+ nextLine = line.replace(excerpt, updated);
49
+ }
50
+ }
51
+ else {
52
+ nextLine = line.replace(actualPrefix, expectedPrefix);
53
+ }
54
+ if (nextLine === line)
55
+ return undefined;
56
+ return {
57
+ nextLine,
58
+ summary: `Aligned API prefix to ${expectedPrefix}`,
59
+ };
60
+ };
61
+ const buildTerminologyReplacement = (issue, line) => {
62
+ const metadata = (issue.metadata ?? {});
63
+ const alias = metadataString(metadata.alias);
64
+ const canonicalTerm = metadataString(metadata.canonicalTerm);
65
+ if (!alias || !canonicalTerm)
66
+ return undefined;
67
+ const pattern = new RegExp(`\\b${escapeRegExp(alias)}\\b`, "i");
68
+ if (!pattern.test(line))
69
+ return undefined;
70
+ const nextLine = line.replace(pattern, canonicalTerm);
71
+ if (nextLine === line)
72
+ return undefined;
73
+ return {
74
+ nextLine,
75
+ summary: `Replaced \"${alias}\" with \"${canonicalTerm}\"`,
76
+ };
77
+ };
78
+ const isRuleTarget = (graph, ruleId, record) => {
79
+ if (!record)
80
+ return false;
81
+ const nodes = graph.getImpactedSections(ruleId);
82
+ return nodes.some((node) => node.artifact === record.kind &&
83
+ (node.variant ? node.variant === record.variant : true));
84
+ };
85
+ export class DocAlignmentPatcher {
86
+ constructor(graph) {
87
+ this.graph = graph ?? DocAlignmentGraph.createDefault();
88
+ }
89
+ async apply(input) {
90
+ const warnings = [];
91
+ const summariesByPath = new Map();
92
+ const issuesByPath = new Map();
93
+ const apiIssues = collectIssues(input.gateResults, API_PREFIX_GATE);
94
+ const terminologyIssues = collectIssues(input.gateResults, TERMINOLOGY_GATE);
95
+ const queueIssue = (issue, ruleId) => {
96
+ if (!isLineRange(issue))
97
+ return;
98
+ const record = findArtifactRecord(input.runContext, issue.location.path);
99
+ if (!isRuleTarget(this.graph, ruleId, record))
100
+ return;
101
+ const existing = issuesByPath.get(issue.location.path);
102
+ if (existing) {
103
+ existing.push(issue);
104
+ }
105
+ else {
106
+ issuesByPath.set(issue.location.path, [issue]);
107
+ }
108
+ };
109
+ for (const issue of apiIssues) {
110
+ queueIssue(issue, "api-prefix");
111
+ }
112
+ for (const issue of terminologyIssues) {
113
+ queueIssue(issue, "terminology");
114
+ }
115
+ if (issuesByPath.size === 0) {
116
+ return { deltas: [], warnings: [] };
117
+ }
118
+ const patches = [];
119
+ const beforeChecksums = new Map();
120
+ for (const [filePath, issues] of issuesByPath.entries()) {
121
+ let content = "";
122
+ try {
123
+ content = await fs.readFile(filePath, "utf8");
124
+ }
125
+ catch (error) {
126
+ warnings.push(`Alignment patch skipped for ${filePath}: ${error.message ?? String(error)}`);
127
+ continue;
128
+ }
129
+ beforeChecksums.set(filePath, hashContent(content));
130
+ const lines = content.split(/\r?\n/);
131
+ const operations = [];
132
+ const lineReplacements = new Map();
133
+ for (const issue of issues) {
134
+ if (!isLineRange(issue))
135
+ continue;
136
+ const lineIndex = issue.location.lineStart - 1;
137
+ if (lineIndex < 0 || lineIndex >= lines.length)
138
+ continue;
139
+ const lineState = lineReplacements.get(lineIndex);
140
+ const line = lineState?.line ?? lines[lineIndex] ?? "";
141
+ let replacement;
142
+ if (issue.gateId === API_PREFIX_GATE) {
143
+ replacement = buildApiPrefixReplacement(issue, line);
144
+ }
145
+ else if (issue.gateId === TERMINOLOGY_GATE) {
146
+ replacement = buildTerminologyReplacement(issue, line);
147
+ }
148
+ if (!replacement)
149
+ continue;
150
+ if (!summariesByPath.has(filePath)) {
151
+ summariesByPath.set(filePath, new Set());
152
+ }
153
+ summariesByPath.get(filePath)?.add(replacement.summary);
154
+ const nextSummaries = lineState?.summaries ?? new Set();
155
+ nextSummaries.add(replacement.summary);
156
+ lineReplacements.set(lineIndex, { line: replacement.nextLine, summaries: nextSummaries });
157
+ }
158
+ const sortedLineEntries = Array.from(lineReplacements.entries()).sort((a, b) => a[0] - b[0]);
159
+ for (const [lineIndex, lineState] of sortedLineEntries) {
160
+ const lineNumber = lineIndex + 1;
161
+ operations.push({
162
+ type: "replace_section",
163
+ location: {
164
+ kind: "line_range",
165
+ path: filePath,
166
+ lineStart: lineNumber,
167
+ lineEnd: lineNumber,
168
+ },
169
+ content: lineState.line,
170
+ });
171
+ }
172
+ if (operations.length > 0) {
173
+ patches.push({ path: filePath, operations });
174
+ }
175
+ }
176
+ if (patches.length === 0) {
177
+ return { deltas: [], warnings };
178
+ }
179
+ const engine = new DocPatchEngine();
180
+ const applyResult = await engine.apply({
181
+ runContext: input.runContext,
182
+ patches,
183
+ dryRun: input.dryRun ?? input.runContext.flags.dryRun,
184
+ });
185
+ const deltas = [];
186
+ for (const result of applyResult.results) {
187
+ if (!result.changed)
188
+ continue;
189
+ let afterContent = "";
190
+ try {
191
+ afterContent = await fs.readFile(result.path, "utf8");
192
+ }
193
+ catch (error) {
194
+ warnings.push(`Alignment patch wrote ${result.path} but could not read it: ${error.message ?? String(error)}`);
195
+ continue;
196
+ }
197
+ const beforeChecksum = beforeChecksums.get(result.path);
198
+ const afterChecksum = hashContent(afterContent);
199
+ const record = findArtifactRecord(input.runContext, result.path);
200
+ if (!record) {
201
+ warnings.push(`Alignment patch applied to ${result.path} but no artifact record was found.`);
202
+ continue;
203
+ }
204
+ const summarySet = summariesByPath.get(result.path);
205
+ const summary = summarySet && summarySet.size > 0
206
+ ? Array.from(summarySet.values()).join("; ")
207
+ : "Alignment patch applied.";
208
+ deltas.push({
209
+ artifact: record.kind,
210
+ path: result.path,
211
+ summary,
212
+ beforeChecksum,
213
+ afterChecksum,
214
+ });
215
+ }
216
+ const combinedWarnings = warnings.slice();
217
+ if (applyResult.warnings?.length) {
218
+ combinedWarnings.push(...applyResult.warnings);
219
+ }
220
+ return { deltas, warnings: combinedWarnings };
221
+ }
222
+ }
@@ -0,0 +1,57 @@
1
+ import type { DocgenArtifactInventory, DocgenRunContext } from "../DocgenRunContext.js";
2
+ import type { ReviewIssueLocation } from "../review/ReviewTypes.js";
3
+ export type DocPatchFormat = "markdown" | "yaml" | "text";
4
+ export type DocPatchPosition = "after" | "before" | "append";
5
+ export type ReplaceSectionOperation = {
6
+ type: "replace_section";
7
+ location: ReviewIssueLocation;
8
+ content: string;
9
+ headingLevel?: number;
10
+ };
11
+ export type InsertSectionOperation = {
12
+ type: "insert_section";
13
+ heading: string;
14
+ content: string;
15
+ location?: ReviewIssueLocation;
16
+ position?: DocPatchPosition;
17
+ headingLevel?: number;
18
+ };
19
+ export type RemoveBlockOperation = {
20
+ type: "remove_block";
21
+ location: ReviewIssueLocation;
22
+ };
23
+ export type DocPatchOperation = ReplaceSectionOperation | InsertSectionOperation | RemoveBlockOperation;
24
+ export interface DocPatchRequest {
25
+ path: string;
26
+ format?: DocPatchFormat;
27
+ operations: DocPatchOperation[];
28
+ }
29
+ export interface DocPatchPlanStep {
30
+ operation: DocPatchOperation;
31
+ applied: boolean;
32
+ reason?: string;
33
+ range?: {
34
+ lineStart: number;
35
+ lineEnd: number;
36
+ };
37
+ }
38
+ export interface DocPatchResult {
39
+ path: string;
40
+ format: DocPatchFormat;
41
+ changed: boolean;
42
+ steps: DocPatchPlanStep[];
43
+ }
44
+ export interface DocPatchApplyInput {
45
+ runContext: DocgenRunContext;
46
+ patches: DocPatchRequest[];
47
+ dryRun?: boolean;
48
+ }
49
+ export interface DocPatchApplyResult {
50
+ results: DocPatchResult[];
51
+ updatedArtifacts?: DocgenArtifactInventory;
52
+ warnings: string[];
53
+ }
54
+ export declare class DocPatchEngine {
55
+ apply(input: DocPatchApplyInput): Promise<DocPatchApplyResult>;
56
+ }
57
+ //# sourceMappingURL=DocPatchEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocPatchEngine.d.ts","sourceRoot":"","sources":["../../../../src/services/docs/patch/DocPatchEngine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,mBAAmB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB,uBAAuB,GACvB,sBAAsB,GACtB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA8RD,qBAAa,cAAc;IACnB,KAAK,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CA2ErE"}