guardlink 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +50 -2
  3. package/dist/agents/config.d.ts +11 -0
  4. package/dist/agents/config.d.ts.map +1 -1
  5. package/dist/agents/config.js +11 -0
  6. package/dist/agents/config.js.map +1 -1
  7. package/dist/agents/index.d.ts +3 -0
  8. package/dist/agents/index.d.ts.map +1 -1
  9. package/dist/agents/index.js +3 -0
  10. package/dist/agents/index.js.map +1 -1
  11. package/dist/agents/launcher.d.ts +11 -8
  12. package/dist/agents/launcher.d.ts.map +1 -1
  13. package/dist/agents/launcher.js +11 -8
  14. package/dist/agents/launcher.js.map +1 -1
  15. package/dist/agents/prompts.d.ts +9 -0
  16. package/dist/agents/prompts.d.ts.map +1 -1
  17. package/dist/agents/prompts.js +9 -0
  18. package/dist/agents/prompts.js.map +1 -1
  19. package/dist/analyze/index.d.ts +10 -7
  20. package/dist/analyze/index.d.ts.map +1 -1
  21. package/dist/analyze/index.js +10 -7
  22. package/dist/analyze/index.js.map +1 -1
  23. package/dist/analyze/llm.d.ts +11 -10
  24. package/dist/analyze/llm.d.ts.map +1 -1
  25. package/dist/analyze/llm.js +11 -10
  26. package/dist/analyze/llm.js.map +1 -1
  27. package/dist/analyze/prompts.d.ts +3 -0
  28. package/dist/analyze/prompts.d.ts.map +1 -1
  29. package/dist/analyze/prompts.js +3 -0
  30. package/dist/analyze/prompts.js.map +1 -1
  31. package/dist/analyze/tools.d.ts +10 -4
  32. package/dist/analyze/tools.d.ts.map +1 -1
  33. package/dist/analyze/tools.js +10 -4
  34. package/dist/analyze/tools.js.map +1 -1
  35. package/dist/analyzer/index.d.ts +3 -0
  36. package/dist/analyzer/index.d.ts.map +1 -1
  37. package/dist/analyzer/index.js +3 -0
  38. package/dist/analyzer/index.js.map +1 -1
  39. package/dist/analyzer/sarif.d.ts +5 -6
  40. package/dist/analyzer/sarif.d.ts.map +1 -1
  41. package/dist/analyzer/sarif.js +5 -6
  42. package/dist/analyzer/sarif.js.map +1 -1
  43. package/dist/cli/index.d.ts +14 -9
  44. package/dist/cli/index.d.ts.map +1 -1
  45. package/dist/cli/index.js +479 -26
  46. package/dist/cli/index.js.map +1 -1
  47. package/dist/dashboard/generate.d.ts +8 -5
  48. package/dist/dashboard/generate.d.ts.map +1 -1
  49. package/dist/dashboard/generate.js +30 -7
  50. package/dist/dashboard/generate.js.map +1 -1
  51. package/dist/dashboard/index.d.ts +5 -0
  52. package/dist/dashboard/index.d.ts.map +1 -1
  53. package/dist/dashboard/index.js +5 -0
  54. package/dist/dashboard/index.js.map +1 -1
  55. package/dist/diff/git.d.ts +10 -7
  56. package/dist/diff/git.d.ts.map +1 -1
  57. package/dist/diff/git.js +10 -7
  58. package/dist/diff/git.js.map +1 -1
  59. package/dist/diff/index.d.ts +4 -0
  60. package/dist/diff/index.d.ts.map +1 -1
  61. package/dist/diff/index.js +4 -0
  62. package/dist/diff/index.js.map +1 -1
  63. package/dist/index.d.ts +2 -0
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +1 -0
  66. package/dist/index.js.map +1 -1
  67. package/dist/init/detect.d.ts +5 -0
  68. package/dist/init/detect.d.ts.map +1 -1
  69. package/dist/init/detect.js +5 -0
  70. package/dist/init/detect.js.map +1 -1
  71. package/dist/init/index.d.ts +26 -6
  72. package/dist/init/index.d.ts.map +1 -1
  73. package/dist/init/index.js +91 -11
  74. package/dist/init/index.js.map +1 -1
  75. package/dist/init/picker.d.ts.map +1 -1
  76. package/dist/init/picker.js +17 -6
  77. package/dist/init/picker.js.map +1 -1
  78. package/dist/init/templates.d.ts +20 -0
  79. package/dist/init/templates.d.ts.map +1 -1
  80. package/dist/init/templates.js +132 -21
  81. package/dist/init/templates.js.map +1 -1
  82. package/dist/mcp/index.d.ts +5 -0
  83. package/dist/mcp/index.d.ts.map +1 -1
  84. package/dist/mcp/index.js +5 -0
  85. package/dist/mcp/index.js.map +1 -1
  86. package/dist/mcp/lookup.d.ts +5 -0
  87. package/dist/mcp/lookup.d.ts.map +1 -1
  88. package/dist/mcp/lookup.js +5 -0
  89. package/dist/mcp/lookup.js.map +1 -1
  90. package/dist/mcp/server.d.ts +17 -13
  91. package/dist/mcp/server.d.ts.map +1 -1
  92. package/dist/mcp/server.js +171 -15
  93. package/dist/mcp/server.js.map +1 -1
  94. package/dist/mcp/suggest.d.ts +8 -6
  95. package/dist/mcp/suggest.d.ts.map +1 -1
  96. package/dist/mcp/suggest.js +8 -6
  97. package/dist/mcp/suggest.js.map +1 -1
  98. package/dist/parser/clear.d.ts +36 -0
  99. package/dist/parser/clear.d.ts.map +1 -0
  100. package/dist/parser/clear.js +148 -0
  101. package/dist/parser/clear.js.map +1 -0
  102. package/dist/parser/index.d.ts +2 -0
  103. package/dist/parser/index.d.ts.map +1 -1
  104. package/dist/parser/index.js +1 -0
  105. package/dist/parser/index.js.map +1 -1
  106. package/dist/parser/parse-file.d.ts +5 -2
  107. package/dist/parser/parse-file.d.ts.map +1 -1
  108. package/dist/parser/parse-file.js +29 -2
  109. package/dist/parser/parse-file.js.map +1 -1
  110. package/dist/parser/parse-line.d.ts +3 -3
  111. package/dist/parser/parse-line.js +3 -3
  112. package/dist/parser/parse-project.d.ts +7 -7
  113. package/dist/parser/parse-project.d.ts.map +1 -1
  114. package/dist/parser/parse-project.js +127 -11
  115. package/dist/parser/parse-project.js.map +1 -1
  116. package/dist/report/index.d.ts +3 -0
  117. package/dist/report/index.d.ts.map +1 -1
  118. package/dist/report/index.js +3 -0
  119. package/dist/report/index.js.map +1 -1
  120. package/dist/report/report.d.ts +4 -7
  121. package/dist/report/report.d.ts.map +1 -1
  122. package/dist/report/report.js +4 -7
  123. package/dist/report/report.js.map +1 -1
  124. package/dist/review/index.d.ts +62 -0
  125. package/dist/review/index.d.ts.map +1 -0
  126. package/dist/review/index.js +226 -0
  127. package/dist/review/index.js.map +1 -0
  128. package/dist/tui/commands.d.ts +23 -0
  129. package/dist/tui/commands.d.ts.map +1 -1
  130. package/dist/tui/commands.js +440 -3
  131. package/dist/tui/commands.js.map +1 -1
  132. package/dist/tui/config.d.ts +6 -0
  133. package/dist/tui/config.d.ts.map +1 -1
  134. package/dist/tui/config.js +6 -0
  135. package/dist/tui/config.js.map +1 -1
  136. package/dist/tui/index.d.ts +8 -8
  137. package/dist/tui/index.d.ts.map +1 -1
  138. package/dist/tui/index.js +45 -9
  139. package/dist/tui/index.js.map +1 -1
  140. package/dist/tui/input.d.ts +6 -0
  141. package/dist/tui/input.d.ts.map +1 -1
  142. package/dist/tui/input.js +6 -0
  143. package/dist/tui/input.js.map +1 -1
  144. package/dist/types/index.d.ts +41 -0
  145. package/dist/types/index.d.ts.map +1 -1
  146. package/dist/workspace/index.d.ts +12 -0
  147. package/dist/workspace/index.d.ts.map +1 -0
  148. package/dist/workspace/index.js +9 -0
  149. package/dist/workspace/index.js.map +1 -0
  150. package/dist/workspace/link.d.ts +91 -0
  151. package/dist/workspace/link.d.ts.map +1 -0
  152. package/dist/workspace/link.js +581 -0
  153. package/dist/workspace/link.js.map +1 -0
  154. package/dist/workspace/merge.d.ts +104 -0
  155. package/dist/workspace/merge.d.ts.map +1 -0
  156. package/dist/workspace/merge.js +752 -0
  157. package/dist/workspace/merge.js.map +1 -0
  158. package/dist/workspace/metadata.d.ts +34 -0
  159. package/dist/workspace/metadata.d.ts.map +1 -0
  160. package/dist/workspace/metadata.js +181 -0
  161. package/dist/workspace/metadata.js.map +1 -0
  162. package/dist/workspace/types.d.ts +134 -0
  163. package/dist/workspace/types.d.ts.map +1 -0
  164. package/dist/workspace/types.js +12 -0
  165. package/dist/workspace/types.js.map +1 -0
  166. package/package.json +1 -1
@@ -0,0 +1,104 @@
1
+ /**
2
+ * GuardLink Workspace — Merge engine for multi-repo reports.
3
+ *
4
+ * Takes N per-repo report JSONs and produces a unified MergedReport
5
+ * with cross-repo tag resolution, warning detection, and aggregated stats.
6
+ *
7
+ * @asset Workspace.Merge (#merge-engine) -- "Cross-repo threat model unification"
8
+ * @threat Tag_Collision (#tag-collision) [medium] -- "Duplicate tag definitions across repos"
9
+ * @mitigates #merge-engine against #tag-collision using #prefix-ownership -- "Tag prefix determines owning repo"
10
+ * @flows ReportJSON -> #merge-engine via mergeReports -- "Per-repo reports feed into merge"
11
+ * @flows #merge-engine -> MergedReport via mergeReports -- "Unified output"
12
+ */
13
+ import type { ThreatModel } from '../types/index.js';
14
+ import type { MergedReport, MergeTotals, MergeDiffSummary, TagOwnership, UnresolvedRef, MergeWarning, RepoStatus } from './types.js';
15
+ /** A loaded per-repo report with its origin info */
16
+ interface LoadedReport {
17
+ /** Repo name (from metadata.repo, or inferred from filename) */
18
+ repo: string;
19
+ /** The parsed ThreatModel */
20
+ model: ThreatModel;
21
+ /** Path we loaded from */
22
+ source_path: string;
23
+ }
24
+ /**
25
+ * Load a single report JSON file. Returns the parsed model + repo name.
26
+ * Throws on missing file or invalid JSON; caller handles gracefully.
27
+ */
28
+ export declare function loadReportJson(filePath: string): Promise<LoadedReport>;
29
+ /**
30
+ * Attempt to load multiple report files. Returns loaded reports + statuses.
31
+ * Missing or invalid files produce a RepoStatus with loaded=false rather than throwing.
32
+ */
33
+ export declare function loadAllReports(filePaths: string[], expectedRepos?: string[]): Promise<{
34
+ reports: LoadedReport[];
35
+ statuses: RepoStatus[];
36
+ }>;
37
+ /**
38
+ * Build a unified tag registry from all loaded reports.
39
+ *
40
+ * Ownership rule: the repo whose name matches the tag prefix owns it.
41
+ * e.g. "#payment-svc.refund" → owned by repo "payment-svc" (or "payment-service").
42
+ * If no prefix match, first definition wins.
43
+ *
44
+ * Returns the registry + any duplicate-tag warnings.
45
+ */
46
+ export declare function buildTagRegistry(reports: LoadedReport[]): {
47
+ registry: TagOwnership[];
48
+ warnings: MergeWarning[];
49
+ };
50
+ /**
51
+ * Collect all tag references from relationship annotations (mitigates, exposes,
52
+ * flows, etc.) and check which ones resolve to the tag registry.
53
+ *
54
+ * Returns unresolved refs + additional warnings.
55
+ */
56
+ export declare function resolveReferences(reports: LoadedReport[], registry: TagOwnership[], repoNames: Set<string>): {
57
+ unresolved: UnresolvedRef[];
58
+ warnings: MergeWarning[];
59
+ };
60
+ /**
61
+ * Combine multiple ThreatModels into a single unified model.
62
+ * File paths are prefixed with repo name for disambiguation.
63
+ * Deduplication is by tag ID for definitions (assets/threats/controls).
64
+ * Relationships are kept from all repos (no dedup — same relationship
65
+ * stated in two repos is meaningful).
66
+ */
67
+ export declare function combineModels(reports: LoadedReport[]): ThreatModel;
68
+ /** Compute aggregate totals from a combined model */
69
+ export declare function computeTotals(model: ThreatModel, statuses: RepoStatus[], resolvedCount: number, unresolvedCount: number): MergeTotals;
70
+ export interface MergeOptions {
71
+ /** Workspace name (used in output if no report carries workspace metadata) */
72
+ workspace?: string;
73
+ /** Expected repo names (from workspace.yaml). Missing repos generate warnings. */
74
+ expectedRepos?: string[];
75
+ /** Stale threshold in hours. Reports older than this get a warning. Default: 168 (7 days) */
76
+ staleThresholdHours?: number;
77
+ }
78
+ /**
79
+ * Main entry point: merge N report JSON files into a unified MergedReport.
80
+ *
81
+ * 1. Load all report JSONs (partial load on failure)
82
+ * 2. Build tag registry (who owns each tag)
83
+ * 3. Resolve cross-repo references
84
+ * 4. Combine all ThreatModels into one
85
+ * 5. Compute totals + warnings
86
+ * 6. Return MergedReport
87
+ */
88
+ export declare function mergeReports(filePaths: string[], options?: MergeOptions): Promise<MergedReport>;
89
+ /**
90
+ * Compute a diff summary between two merged reports.
91
+ * Used for weekly "what changed" output.
92
+ */
93
+ export declare function diffMergedReports(current: MergedReport, previous: MergedReport): MergeDiffSummary;
94
+ /**
95
+ * Format a diff summary as markdown for weekly reports / Slack / email.
96
+ */
97
+ export declare function formatDiffSummary(diff: MergeDiffSummary, workspace: string): string;
98
+ /**
99
+ * Generate a human-readable markdown summary of a merged report.
100
+ * Used for terminal output, weekly emails, and Slack notifications.
101
+ */
102
+ export declare function formatMergeSummary(merged: MergedReport): string;
103
+ export {};
104
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/workspace/merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EACV,WAAW,EAMZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EACxE,YAAY,EAAoB,UAAU,EAC3C,MAAM,YAAY,CAAC;AAKpB,oDAAoD;AACpD,UAAU,YAAY;IACpB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAU5E;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC,CAoC9D;AAkCD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EAAE,GACtB;IAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CA+CxD;AAwCD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,EAAE,YAAY,EAAE,EACxB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB;IAAE,UAAU,EAAE,aAAa,EAAE,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAwE3D;AA4ED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,WAAW,CAiFlE;AAsBD,qDAAqD;AACrD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,UAAU,EAAE,EACtB,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,GACtB,WAAW,CAiBb;AAID,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,6FAA6F;IAC7F,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,YAAY,CAAC,CAgEvB;AAwED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,YAAY,GACrB,gBAAgB,CA2ClB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CA8DnF;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgE/D"}