@tractorcow/beefup 0.0.0 → 1.0.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 (165) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +108 -0
  3. package/dist/__tests__/with-safe-chain-stubs.d.ts +5 -0
  4. package/dist/__tests__/with-safe-chain-stubs.js +25 -0
  5. package/dist/__tests__/with-safe-chain-stubs.js.map +1 -0
  6. package/dist/bin.d.ts +2 -0
  7. package/dist/bin.js +6 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/cli/args.d.ts +18 -0
  10. package/dist/cli/args.js +88 -0
  11. package/dist/cli/args.js.map +1 -0
  12. package/dist/cli/main.d.ts +4 -0
  13. package/dist/cli/main.js +81 -0
  14. package/dist/cli/main.js.map +1 -0
  15. package/dist/commands/accept.d.ts +16 -0
  16. package/dist/commands/accept.js +47 -0
  17. package/dist/commands/accept.js.map +1 -0
  18. package/dist/commands/report.d.ts +19 -0
  19. package/dist/commands/report.js +151 -0
  20. package/dist/commands/report.js.map +1 -0
  21. package/dist/commands/stage.d.ts +16 -0
  22. package/dist/commands/stage.js +60 -0
  23. package/dist/commands/stage.js.map +1 -0
  24. package/dist/config/load.d.ts +6 -0
  25. package/dist/config/load.js +103 -0
  26. package/dist/config/load.js.map +1 -0
  27. package/dist/config/types.d.ts +75 -0
  28. package/dist/config/types.js +68 -0
  29. package/dist/config/types.js.map +1 -0
  30. package/dist/diff/diff.d.ts +21 -0
  31. package/dist/diff/diff.js +132 -0
  32. package/dist/diff/diff.js.map +1 -0
  33. package/dist/diff/group.d.ts +5 -0
  34. package/dist/diff/group.js +24 -0
  35. package/dist/diff/group.js.map +1 -0
  36. package/dist/diff/types.d.ts +37 -0
  37. package/dist/diff/types.js +7 -0
  38. package/dist/diff/types.js.map +1 -0
  39. package/dist/errors.d.ts +10 -0
  40. package/dist/errors.js +15 -0
  41. package/dist/errors.js.map +1 -0
  42. package/dist/fsutil.d.ts +20 -0
  43. package/dist/fsutil.js +43 -0
  44. package/dist/fsutil.js.map +1 -0
  45. package/dist/lockfile/locked.d.ts +9 -0
  46. package/dist/lockfile/locked.js +15 -0
  47. package/dist/lockfile/locked.js.map +1 -0
  48. package/dist/lockfile/npm.d.ts +15 -0
  49. package/dist/lockfile/npm.js +152 -0
  50. package/dist/lockfile/npm.js.map +1 -0
  51. package/dist/lockfile/pnpm.d.ts +27 -0
  52. package/dist/lockfile/pnpm.js +155 -0
  53. package/dist/lockfile/pnpm.js.map +1 -0
  54. package/dist/lockfile/resolve.d.ts +10 -0
  55. package/dist/lockfile/resolve.js +20 -0
  56. package/dist/lockfile/resolve.js.map +1 -0
  57. package/dist/lockfile/types.d.ts +49 -0
  58. package/dist/lockfile/types.js +2 -0
  59. package/dist/lockfile/types.js.map +1 -0
  60. package/dist/pm/cve-lite-bin.d.ts +5 -0
  61. package/dist/pm/cve-lite-bin.js +36 -0
  62. package/dist/pm/cve-lite-bin.js.map +1 -0
  63. package/dist/pm/install.d.ts +24 -0
  64. package/dist/pm/install.js +30 -0
  65. package/dist/pm/install.js.map +1 -0
  66. package/dist/pm/runner.d.ts +17 -0
  67. package/dist/pm/runner.js +27 -0
  68. package/dist/pm/runner.js.map +1 -0
  69. package/dist/pm/safe-chain.d.ts +17 -0
  70. package/dist/pm/safe-chain.js +65 -0
  71. package/dist/pm/safe-chain.js.map +1 -0
  72. package/dist/pm/update.d.ts +16 -0
  73. package/dist/pm/update.js +25 -0
  74. package/dist/pm/update.js.map +1 -0
  75. package/dist/policy/alignment.d.ts +13 -0
  76. package/dist/policy/alignment.js +171 -0
  77. package/dist/policy/alignment.js.map +1 -0
  78. package/dist/policy/evaluate.d.ts +19 -0
  79. package/dist/policy/evaluate.js +75 -0
  80. package/dist/policy/evaluate.js.map +1 -0
  81. package/dist/policy/overrides.d.ts +42 -0
  82. package/dist/policy/overrides.js +358 -0
  83. package/dist/policy/overrides.js.map +1 -0
  84. package/dist/policy/ranges.d.ts +13 -0
  85. package/dist/policy/ranges.js +58 -0
  86. package/dist/policy/ranges.js.map +1 -0
  87. package/dist/project/collect.d.ts +15 -0
  88. package/dist/project/collect.js +60 -0
  89. package/dist/project/collect.js.map +1 -0
  90. package/dist/project/detect.d.ts +5 -0
  91. package/dist/project/detect.js +76 -0
  92. package/dist/project/detect.js.map +1 -0
  93. package/dist/project/direct-deps.d.ts +7 -0
  94. package/dist/project/direct-deps.js +28 -0
  95. package/dist/project/direct-deps.js.map +1 -0
  96. package/dist/project/package-json.d.ts +20 -0
  97. package/dist/project/package-json.js +6 -0
  98. package/dist/project/package-json.js.map +1 -0
  99. package/dist/project/paths.d.ts +31 -0
  100. package/dist/project/paths.js +45 -0
  101. package/dist/project/paths.js.map +1 -0
  102. package/dist/project/types.d.ts +13 -0
  103. package/dist/project/types.js +6 -0
  104. package/dist/project/types.js.map +1 -0
  105. package/dist/project/workspace.d.ts +14 -0
  106. package/dist/project/workspace.js +80 -0
  107. package/dist/project/workspace.js.map +1 -0
  108. package/dist/report/ansi.d.ts +31 -0
  109. package/dist/report/ansi.js +59 -0
  110. package/dist/report/ansi.js.map +1 -0
  111. package/dist/report/html.d.ts +6 -0
  112. package/dist/report/html.js +260 -0
  113. package/dist/report/html.js.map +1 -0
  114. package/dist/report/markdown.d.ts +6 -0
  115. package/dist/report/markdown.js +234 -0
  116. package/dist/report/markdown.js.map +1 -0
  117. package/dist/report/shared.d.ts +25 -0
  118. package/dist/report/shared.js +32 -0
  119. package/dist/report/shared.js.map +1 -0
  120. package/dist/report/text.d.ts +10 -0
  121. package/dist/report/text.js +156 -0
  122. package/dist/report/text.js.map +1 -0
  123. package/dist/report/types.d.ts +20 -0
  124. package/dist/report/types.js +2 -0
  125. package/dist/report/types.js.map +1 -0
  126. package/dist/rewrite/constraints.d.ts +20 -0
  127. package/dist/rewrite/constraints.js +64 -0
  128. package/dist/rewrite/constraints.js.map +1 -0
  129. package/dist/rewrite/repin.d.ts +8 -0
  130. package/dist/rewrite/repin.js +28 -0
  131. package/dist/rewrite/repin.js.map +1 -0
  132. package/dist/rewrite/workspace.d.ts +14 -0
  133. package/dist/rewrite/workspace.js +40 -0
  134. package/dist/rewrite/workspace.js.map +1 -0
  135. package/dist/security/classify.d.ts +48 -0
  136. package/dist/security/classify.js +86 -0
  137. package/dist/security/classify.js.map +1 -0
  138. package/dist/security/cve-lite.d.ts +7 -0
  139. package/dist/security/cve-lite.js +78 -0
  140. package/dist/security/cve-lite.js.map +1 -0
  141. package/dist/security/npm-audit.d.ts +10 -0
  142. package/dist/security/npm-audit.js +65 -0
  143. package/dist/security/npm-audit.js.map +1 -0
  144. package/dist/security/refs.d.ts +63 -0
  145. package/dist/security/refs.js +218 -0
  146. package/dist/security/refs.js.map +1 -0
  147. package/dist/security/scan.d.ts +13 -0
  148. package/dist/security/scan.js +32 -0
  149. package/dist/security/scan.js.map +1 -0
  150. package/dist/strategy/git.d.ts +16 -0
  151. package/dist/strategy/git.js +92 -0
  152. package/dist/strategy/git.js.map +1 -0
  153. package/dist/strategy/index.d.ts +7 -0
  154. package/dist/strategy/index.js +13 -0
  155. package/dist/strategy/index.js.map +1 -0
  156. package/dist/strategy/inplace.d.ts +30 -0
  157. package/dist/strategy/inplace.js +77 -0
  158. package/dist/strategy/inplace.js.map +1 -0
  159. package/dist/strategy/types.d.ts +13 -0
  160. package/dist/strategy/types.js +2 -0
  161. package/dist/strategy/types.js.map +1 -0
  162. package/dist/strategy/worktree.d.ts +26 -0
  163. package/dist/strategy/worktree.js +74 -0
  164. package/dist/strategy/worktree.js.map +1 -0
  165. package/package.json +60 -4
@@ -0,0 +1,234 @@
1
+ import { AlignmentActions } from "../config/types.js";
2
+ import { formatUniqueVersions } from "../diff/diff.js";
3
+ import { groupByChangeType } from "../diff/group.js";
4
+ import { META_VULN_TITLE } from "../security/npm-audit.js";
5
+ import { formatRefsMarkdown } from "../security/refs.js";
6
+ import { packageChangeCounts, policyIssueCount, SecuritySectionIntros, SecuritySectionTitles, } from "./shared.js";
7
+ /**
8
+ * Builds a markdown table for changed packages (from/to version columns).
9
+ */
10
+ function formatChangedTable(changes) {
11
+ const rows = [
12
+ "| Package | From Version | To Version |",
13
+ "|---------|--------------|------------|",
14
+ ];
15
+ for (const change of changes) {
16
+ rows.push(`| ${formatPackageName(change)} | \`${formatUniqueVersions(change.from)}\` | \`${formatUniqueVersions(change.to)}\` |`);
17
+ }
18
+ return rows.join("\n");
19
+ }
20
+ /**
21
+ * Builds a single-column version table for added or removed packages.
22
+ */
23
+ function formatSingleVersionTable(changes, side) {
24
+ const rows = ["| Package | Version |", "|---------|---------|"];
25
+ for (const change of changes) {
26
+ const versions = side === "to"
27
+ ? formatUniqueVersions(change.to)
28
+ : formatUniqueVersions(change.from);
29
+ rows.push(`| ${formatPackageName(change)} | \`${versions}\` |`);
30
+ }
31
+ return rows.join("\n");
32
+ }
33
+ /**
34
+ * Renders a package name as bold (direct) or italic (transitive).
35
+ */
36
+ function formatPackageName(change) {
37
+ if (change.direct) {
38
+ return `**${change.name}**`;
39
+ }
40
+ return `*${change.name}*`;
41
+ }
42
+ /**
43
+ * Wraps content in a collapsed HTML details/summary block for GitHub-compatible markdown.
44
+ */
45
+ function detailsBlock(summary, body) {
46
+ return `<details>\n<summary>${summary}</summary>\n\n${body}\n\n</details>`;
47
+ }
48
+ /**
49
+ * Formats one list of changes into collapsible changed/added/removed blocks.
50
+ */
51
+ function formatChangeGroups(changes) {
52
+ const byType = groupByChangeType(changes);
53
+ const parts = [];
54
+ if (byType.changed.length > 0) {
55
+ parts.push(detailsBlock(`Changed Packages (${byType.changed.length})`, formatChangedTable(byType.changed)));
56
+ }
57
+ if (byType.added.length > 0) {
58
+ parts.push(detailsBlock(`Added Packages (${byType.added.length})`, formatSingleVersionTable(byType.added, "to")));
59
+ }
60
+ if (byType.removed.length > 0) {
61
+ parts.push(detailsBlock(`Removed Packages (${byType.removed.length})`, formatSingleVersionTable(byType.removed, "from")));
62
+ }
63
+ return parts.join("\n\n");
64
+ }
65
+ /**
66
+ * Splits changes into required vs optional/platform and renders both sections.
67
+ */
68
+ function formatDependencyBucket(title, changes) {
69
+ if (changes.length === 0) {
70
+ return "";
71
+ }
72
+ const required = changes.filter((change) => !change.optional);
73
+ const optional = changes.filter((change) => change.optional);
74
+ const parts = [`## ${title}`, ""];
75
+ if (required.length > 0) {
76
+ parts.push(formatChangeGroups(required));
77
+ }
78
+ if (optional.length > 0) {
79
+ parts.push("");
80
+ parts.push(`### Optional / platform (${optional.length})`);
81
+ parts.push("");
82
+ parts.push(formatChangeGroups(optional));
83
+ }
84
+ if (required.length === 0 && optional.length === 0) {
85
+ return "";
86
+ }
87
+ return parts.join("\n");
88
+ }
89
+ /**
90
+ * Formats References cell: advisory links, or a meta-vuln via label.
91
+ */
92
+ function formatFindingReferences(finding) {
93
+ if (finding.refs.length > 0) {
94
+ return formatRefsMarkdown(finding.refs);
95
+ }
96
+ if (finding.viaPackages && finding.viaPackages.length > 0) {
97
+ const via = finding.viaPackages.map((name) => `\`${name}\``).join(", ");
98
+ return `transitive (via ${via})`;
99
+ }
100
+ return "—";
101
+ }
102
+ /**
103
+ * Formats a markdown section listing security findings.
104
+ * Returns an empty string when there are no findings (section omitted).
105
+ */
106
+ function formatFindings(title, intro, findings) {
107
+ if (findings.length === 0) {
108
+ return "";
109
+ }
110
+ const rows = [
111
+ `### ${title} (${findings.length})`,
112
+ "",
113
+ intro,
114
+ "",
115
+ "| Severity | Title | References | Package |",
116
+ "|----------|-------|------------|---------|",
117
+ ...findings.map((item) => {
118
+ const titleText = item.title?.trim() || "—";
119
+ return `| ${item.severity} | ${titleText} | ${formatFindingReferences(item)} | \`${item.packageName}\` |`;
120
+ }),
121
+ ];
122
+ return rows.join("\n");
123
+ }
124
+ /**
125
+ * Joins non-empty security finding sections with blank lines between them.
126
+ */
127
+ function formatSecuritySections(sections) {
128
+ return sections.filter((section) => section.length > 0).join("\n\n");
129
+ }
130
+ /**
131
+ * Renders the top-of-report summary with package and security counts.
132
+ */
133
+ function formatSummary(report) {
134
+ const packages = packageChangeCounts(report);
135
+ const { fixed, introduced, unresolved } = report.security;
136
+ const policy = policyIssueCount(report);
137
+ const lines = [
138
+ "## Summary",
139
+ "",
140
+ `- Mode: \`${report.mode}\``,
141
+ `- Strategy: \`${report.strategy}\``,
142
+ `- Package manager: \`${report.packageManager}\``,
143
+ ];
144
+ if (report.beefupVersion) {
145
+ lines.push(`- Beefup: \`${report.beefupVersion}\``);
146
+ }
147
+ if (report.generatedAt) {
148
+ lines.push(`- Generated: \`${report.generatedAt}\``);
149
+ }
150
+ lines.push(`- Packages: **${packages.changed}** changed, **${packages.added}** added, **${packages.removed}** removed`, `- Security: **${introduced.length}** introduced, **${unresolved.length}** unresolved, **${fixed.length}** fixed`, `- Policy: ${policy === 0 ? "**no issues**" : `**${policy}** issue(s)`}`);
151
+ if (introduced.length === 0) {
152
+ lines.push("- No CVEs introduced by this staged upgrade");
153
+ }
154
+ else {
155
+ lines.push(`- **Warning:** ${introduced.length} CVE(s) introduced — review before accept`);
156
+ }
157
+ return lines.join("\n");
158
+ }
159
+ /**
160
+ * Renders the policy section.
161
+ */
162
+ function formatPolicy(report) {
163
+ const parts = ["## Policy", ""];
164
+ if (policyIssueCount(report) === 0) {
165
+ parts.push("No policy issues.");
166
+ return parts.join("\n");
167
+ }
168
+ for (const item of report.ranges) {
169
+ parts.push(`- **${item.severity}** ${item.message}`);
170
+ }
171
+ for (const item of report.overrides) {
172
+ parts.push(`- **${AlignmentActions.Error}** [${item.override}] ${item.message}`);
173
+ }
174
+ for (const item of report.alignment) {
175
+ parts.push(`- **${item.severity}** [${item.group}] ${item.message}`);
176
+ }
177
+ return parts.join("\n");
178
+ }
179
+ /**
180
+ * Renders footer legend and path hints.
181
+ */
182
+ function formatFooter() {
183
+ return [
184
+ "## Legend",
185
+ "",
186
+ "- **Bold** package names are direct dependencies (declared in a workspace `package.json`).",
187
+ "- *Italic* package names are transitive.",
188
+ "- **Optional / platform** sections list packages marked optional in the lockfile or `optionalDependencies` (still security-scanned).",
189
+ `- Security rows titled “${META_VULN_TITLE}” are npm meta-vulns: the package has no advisory of its own but depends on a vulnerable package.`,
190
+ "",
191
+ "## Paths",
192
+ "",
193
+ "- Staged proposal: `.beefup/staged`",
194
+ "- This report: `.beefup/report`",
195
+ ].join("\n");
196
+ }
197
+ /**
198
+ * Renders a stage report as markdown for files or stdout.
199
+ * Order: Summary → Security (Introduced → Unresolved → Fixed) → Policy → package diffs → Warnings → Legend.
200
+ */
201
+ export function renderMarkdown(report) {
202
+ const parts = [
203
+ "# Beefup upgrade report",
204
+ "",
205
+ formatSummary(report),
206
+ "",
207
+ "## Security",
208
+ "",
209
+ formatSecuritySections([
210
+ formatFindings(SecuritySectionTitles.Introduced, SecuritySectionIntros.Introduced, report.security.introduced),
211
+ formatFindings(SecuritySectionTitles.Unresolved, SecuritySectionIntros.Unresolved, report.security.unresolved),
212
+ formatFindings(SecuritySectionTitles.Fixed, SecuritySectionIntros.Fixed, report.security.fixed),
213
+ ]) || "No security findings.",
214
+ "",
215
+ formatPolicy(report),
216
+ ];
217
+ const deps = formatDependencyBucket("Dependencies", report.diff.dependencies);
218
+ if (deps) {
219
+ parts.push("", deps);
220
+ }
221
+ const devDeps = formatDependencyBucket("Dev Dependencies", report.diff.devDependencies);
222
+ if (devDeps) {
223
+ parts.push("", devDeps);
224
+ }
225
+ if (report.warnings.length > 0) {
226
+ parts.push("", "## Warnings");
227
+ for (const warning of report.warnings) {
228
+ parts.push(`- ${warning}`);
229
+ }
230
+ }
231
+ parts.push("", formatFooter());
232
+ return `${parts.join("\n")}\n`;
233
+ }
234
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/report/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { StageReport } from "./types.js";
2
+ /** Display titles for security finding buckets. */
3
+ export declare const SecuritySectionTitles: {
4
+ readonly Introduced: "Introduced";
5
+ readonly Unresolved: "Unresolved";
6
+ readonly Fixed: "Fixed";
7
+ };
8
+ /** Short blurbs explaining each security section under its heading. */
9
+ export declare const SecuritySectionIntros: {
10
+ readonly Introduced: "New findings that appear only after this staged upgrade. Review before accept — these are regressions.";
11
+ readonly Unresolved: "Findings still present after the upgrade. They were not fixed by this proposal and remain open risk.";
12
+ readonly Fixed: "Findings present before the upgrade that no longer appear afterward. Cleared by this staged proposal.";
13
+ };
14
+ /**
15
+ * Counts package changes across dependencies and devDependencies.
16
+ */
17
+ export declare function packageChangeCounts(report: StageReport): {
18
+ changed: number;
19
+ added: number;
20
+ removed: number;
21
+ };
22
+ /**
23
+ * Counts policy findings for the summary section.
24
+ */
25
+ export declare function policyIssueCount(report: StageReport): number;
@@ -0,0 +1,32 @@
1
+ import { groupByChangeType } from "../diff/group.js";
2
+ /** Display titles for security finding buckets. */
3
+ export const SecuritySectionTitles = {
4
+ Introduced: "Introduced",
5
+ Unresolved: "Unresolved",
6
+ Fixed: "Fixed",
7
+ };
8
+ /** Short blurbs explaining each security section under its heading. */
9
+ export const SecuritySectionIntros = {
10
+ Introduced: "New findings that appear only after this staged upgrade. Review before accept — these are regressions.",
11
+ Unresolved: "Findings still present after the upgrade. They were not fixed by this proposal and remain open risk.",
12
+ Fixed: "Findings present before the upgrade that no longer appear afterward. Cleared by this staged proposal.",
13
+ };
14
+ /**
15
+ * Counts package changes across dependencies and devDependencies.
16
+ */
17
+ export function packageChangeCounts(report) {
18
+ const deps = groupByChangeType(report.diff.dependencies);
19
+ const dev = groupByChangeType(report.diff.devDependencies);
20
+ return {
21
+ changed: deps.changed.length + dev.changed.length,
22
+ added: deps.added.length + dev.added.length,
23
+ removed: deps.removed.length + dev.removed.length,
24
+ };
25
+ }
26
+ /**
27
+ * Counts policy findings for the summary section.
28
+ */
29
+ export function policyIssueCount(report) {
30
+ return report.ranges.length + report.overrides.length + report.alignment.length;
31
+ }
32
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/report/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,mDAAmD;AACnD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,OAAO;CACN,CAAC;AAEX,uEAAuE;AACvE,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,UAAU,EACR,wGAAwG;IAC1G,UAAU,EACR,sGAAsG;IACxG,KAAK,EACH,uGAAuG;CACjG,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IAKrD,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC3D,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM;QACjD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM;QAC3C,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM;KAClD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB;IAClD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;AAClF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { StageReport } from "./types.js";
2
+ export interface TextRenderOptions {
3
+ /** When true, wrap severities and version comparisons in ANSI colour. */
4
+ color?: boolean;
5
+ }
6
+ /**
7
+ * Renders a stage report as plain text for stdout.
8
+ * When `color` is true, severities and from/to versions use ANSI colour.
9
+ */
10
+ export declare function renderText(report: StageReport, options?: TextRenderOptions): string;
@@ -0,0 +1,156 @@
1
+ import { AlignmentActions } from "../config/types.js";
2
+ import { formatUniqueVersions } from "../diff/diff.js";
3
+ import { groupByChangeType } from "../diff/group.js";
4
+ import { PackageChangeTypes } from "../diff/types.js";
5
+ import { formatRefsText } from "../security/refs.js";
6
+ import { Ansi, ansiForSeverity, paint } from "./ansi.js";
7
+ import { packageChangeCounts, policyIssueCount } from "./shared.js";
8
+ /**
9
+ * Formats a version string for display, optionally painting from/to sides.
10
+ */
11
+ function formatVersion(versions, color, side) {
12
+ if (versions.length === 0 || versions === "—") {
13
+ return versions;
14
+ }
15
+ return side === "from"
16
+ ? paint(Ansi.Red, versions, color)
17
+ : paint(Ansi.Green, versions, color);
18
+ }
19
+ /**
20
+ * Formats a single package change as a plain-text report line.
21
+ */
22
+ function formatChange(change, color) {
23
+ const from = formatVersion(formatUniqueVersions(change.from), color, "from");
24
+ const to = formatVersion(formatUniqueVersions(change.to), color, "to");
25
+ const marker = change.direct ? "D" : "T";
26
+ const optional = change.optional ? " [optional]" : "";
27
+ switch (change.type) {
28
+ case PackageChangeTypes.Added:
29
+ return ` + [${marker}]${optional} ${change.name}@${to}`;
30
+ case PackageChangeTypes.Removed:
31
+ return ` - [${marker}]${optional} ${change.name}@${from}`;
32
+ case PackageChangeTypes.Changed:
33
+ return ` ~ [${marker}]${optional} ${change.name}: ${from} → ${to}`;
34
+ }
35
+ }
36
+ /**
37
+ * Formats a titled section of dependency changes grouped by change kind.
38
+ */
39
+ function formatChanges(title, changes, color) {
40
+ if (changes.length === 0) {
41
+ return [];
42
+ }
43
+ const required = changes.filter((change) => !change.optional);
44
+ const optional = changes.filter((change) => change.optional);
45
+ const parts = [title];
46
+ parts.push(...formatChangeGroups(required, color));
47
+ if (optional.length > 0) {
48
+ parts.push(`Optional / platform (${optional.length}):`);
49
+ parts.push(...formatChangeGroups(optional, color));
50
+ }
51
+ return parts;
52
+ }
53
+ /**
54
+ * Formats changed/added/removed groups for one package list.
55
+ */
56
+ function formatChangeGroups(changes, color) {
57
+ if (changes.length === 0) {
58
+ return [];
59
+ }
60
+ const byType = groupByChangeType(changes);
61
+ const parts = [];
62
+ const sections = [
63
+ ["Changed Packages", byType.changed],
64
+ ["Added Packages", byType.added],
65
+ ["Removed Packages", byType.removed],
66
+ ];
67
+ for (const [label, list] of sections) {
68
+ if (list.length === 0) {
69
+ continue;
70
+ }
71
+ parts.push(`${label} (${list.length}):`);
72
+ parts.push(...list.map((item) => formatChange(item, color)));
73
+ }
74
+ return parts;
75
+ }
76
+ /**
77
+ * Formats a finding's refs or meta-vuln via label for plain text.
78
+ */
79
+ function formatFindingRefs(finding) {
80
+ if (finding.refs.length > 0) {
81
+ return formatRefsText(finding.refs);
82
+ }
83
+ if (finding.viaPackages && finding.viaPackages.length > 0) {
84
+ return `transitive (via ${finding.viaPackages.join(", ")})`;
85
+ }
86
+ return "—";
87
+ }
88
+ /**
89
+ * Paints a severity label when colour is enabled.
90
+ */
91
+ function formatSeverity(severity, color) {
92
+ return paint(ansiForSeverity(severity), severity, color);
93
+ }
94
+ /**
95
+ * Paints a count when it is non-zero so zeros stay unstyled.
96
+ */
97
+ function paintCount(count, codes, color) {
98
+ const text = String(count);
99
+ if (count === 0) {
100
+ return text;
101
+ }
102
+ return paint(codes, text, color);
103
+ }
104
+ /**
105
+ * Renders a stage report as plain text for stdout.
106
+ * When `color` is true, severities and from/to versions use ANSI colour.
107
+ */
108
+ export function renderText(report, options = {}) {
109
+ const color = options.color === true;
110
+ const packages = packageChangeCounts(report);
111
+ const { fixed, introduced, unresolved } = report.security;
112
+ const policyCount = policyIssueCount(report);
113
+ const parts = [
114
+ `Beefup stage (${report.packageManager}, mode=${report.mode}, strategy=${report.strategy})`,
115
+ ];
116
+ if (report.beefupVersion) {
117
+ parts.push(`Beefup ${report.beefupVersion}`);
118
+ }
119
+ if (report.generatedAt) {
120
+ parts.push(`Generated ${report.generatedAt}`);
121
+ }
122
+ parts.push(`Summary: ${packages.changed} changed, ${packages.added} added, ${packages.removed} removed packages`, `Security: ${paintCount(introduced.length, Ansi.Red, color)} introduced, ${paintCount(unresolved.length, Ansi.Yellow, color)} unresolved, ${paintCount(fixed.length, Ansi.Green, color)} fixed`, `Policy: ${policyCount === 0 ? "no issues" : `${policyCount} issue(s)`}`);
123
+ if (introduced.length === 0) {
124
+ parts.push("No CVEs introduced by this staged upgrade");
125
+ }
126
+ else {
127
+ parts.push(paint([Ansi.Bold, Ansi.Red], `Warning: ${introduced.length} CVE(s) introduced — review before accept`, color));
128
+ parts.push("Introduced:");
129
+ for (const item of introduced) {
130
+ parts.push(` ! ${formatSeverity(item.severity, color)} ${formatFindingRefs(item)} ${item.packageName}`);
131
+ }
132
+ }
133
+ if (unresolved.length > 0) {
134
+ parts.push(`Unresolved (${unresolved.length}):`);
135
+ for (const item of unresolved) {
136
+ parts.push(` * ${formatSeverity(item.severity, color)} ${formatFindingRefs(item)} ${item.packageName}`);
137
+ }
138
+ }
139
+ parts.push(...formatChanges("DEPENDENCIES", report.diff.dependencies, color));
140
+ parts.push(...formatChanges("DEV DEPENDENCIES", report.diff.devDependencies, color));
141
+ for (const item of report.ranges.filter((finding) => finding.severity === AlignmentActions.Error)) {
142
+ parts.push(paint(Ansi.Red, `error: ${item.message}`, color));
143
+ }
144
+ for (const item of report.overrides) {
145
+ parts.push(paint(Ansi.Red, `error: [${item.override}] ${item.message}`, color));
146
+ }
147
+ for (const item of report.alignment.filter((finding) => finding.severity === AlignmentActions.Error)) {
148
+ parts.push(paint(Ansi.Red, `error: [${item.group}] ${item.message}`, color));
149
+ }
150
+ for (const warning of report.warnings) {
151
+ parts.push(paint(Ansi.Yellow, `warning: ${warning}`, color));
152
+ }
153
+ parts.push("Legend: [D]=direct, [T]=transitive");
154
+ return `${parts.filter((line) => line !== "").join("\n")}\n`;
155
+ }
156
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/report/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ResolutionDiff } from "../diff/types.js";
2
+ import type { AlignmentFinding } from "../policy/alignment.js";
3
+ import type { OverrideFinding } from "../policy/overrides.js";
4
+ import type { RangeFinding } from "../policy/ranges.js";
5
+ import type { ClassifiedFindings } from "../security/classify.js";
6
+ export interface StageReport {
7
+ mode: string;
8
+ strategy: string;
9
+ packageManager: string;
10
+ /** ISO timestamp when the report was generated. */
11
+ generatedAt?: string;
12
+ /** Beefup CLI version that produced the report. */
13
+ beefupVersion?: string;
14
+ diff: ResolutionDiff;
15
+ ranges: RangeFinding[];
16
+ overrides: OverrideFinding[];
17
+ alignment: AlignmentFinding[];
18
+ security: ClassifiedFindings;
19
+ warnings: string[];
20
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/report/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { type UpgradeMode } from "../config/types.js";
2
+ import { type PackageJson } from "../project/package-json.js";
3
+ /**
4
+ * Returns true when a dependency spec should not be rewritten (protocols, paths).
5
+ */
6
+ export declare function shouldSkipSpec(spec: string): boolean;
7
+ /**
8
+ * Extracts a concrete semver version from an exact pin or range minimum.
9
+ */
10
+ export declare function declaredVersion(spec: string): string | null;
11
+ /**
12
+ * Rewrites a dependency constraint for same-major (^) or latest (>=) upgrade mode.
13
+ * Returns null when the spec cannot or should not be rewritten.
14
+ */
15
+ export declare function rewriteConstraint(spec: string, mode: UpgradeMode): string | null;
16
+ /**
17
+ * Rewrites direct dependency constraints in a package.json for the given mode.
18
+ * Leaves peerDependencies and non-rewritable specs unchanged.
19
+ */
20
+ export declare function rewritePackageJson(pkg: PackageJson, mode: UpgradeMode): PackageJson;
@@ -0,0 +1,64 @@
1
+ import semver from "semver";
2
+ import { UpgradeModes } from "../config/types.js";
3
+ import { DIRECT_DEP_FIELDS, } from "../project/package-json.js";
4
+ const SKIP_SPEC = /^(workspace:|file:|link:|catalog:|npm:|http:|https:|git\+|git:|github:|gitlab:|bitbucket:|portal:|pkg:)/;
5
+ /**
6
+ * Returns true when a dependency spec should not be rewritten (protocols, paths).
7
+ */
8
+ export function shouldSkipSpec(spec) {
9
+ const trimmed = spec.trim();
10
+ if (SKIP_SPEC.test(trimmed)) {
11
+ return true;
12
+ }
13
+ if (trimmed.startsWith(".") || trimmed.startsWith("/")) {
14
+ return true;
15
+ }
16
+ return false;
17
+ }
18
+ /**
19
+ * Extracts a concrete semver version from an exact pin or range minimum.
20
+ */
21
+ export function declaredVersion(spec) {
22
+ if (semver.valid(spec)) {
23
+ return spec;
24
+ }
25
+ const min = semver.minVersion(spec);
26
+ return min ? min.version : null;
27
+ }
28
+ /**
29
+ * Rewrites a dependency constraint for same-major (^) or latest (>=) upgrade mode.
30
+ * Returns null when the spec cannot or should not be rewritten.
31
+ */
32
+ export function rewriteConstraint(spec, mode) {
33
+ if (shouldSkipSpec(spec)) {
34
+ return null;
35
+ }
36
+ const version = declaredVersion(spec);
37
+ if (!version) {
38
+ return null;
39
+ }
40
+ return mode === UpgradeModes.Latest ? `>=${version}` : `^${version}`;
41
+ }
42
+ /**
43
+ * Rewrites direct dependency constraints in a package.json for the given mode.
44
+ * Leaves peerDependencies and non-rewritable specs unchanged.
45
+ */
46
+ export function rewritePackageJson(pkg, mode) {
47
+ const next = { ...pkg };
48
+ for (const field of DIRECT_DEP_FIELDS) {
49
+ const bucket = pkg[field];
50
+ if (!bucket) {
51
+ continue;
52
+ }
53
+ const rewritten = { ...bucket };
54
+ for (const [name, spec] of Object.entries(bucket)) {
55
+ const updated = rewriteConstraint(spec, mode);
56
+ if (updated) {
57
+ rewritten[name] = updated;
58
+ }
59
+ }
60
+ next[field] = rewritten;
61
+ }
62
+ return next;
63
+ }
64
+ //# sourceMappingURL=constraints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraints.js","sourceRoot":"","sources":["../../src/rewrite/constraints.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,YAAY,EAAoB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EACL,iBAAiB,GAElB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,SAAS,GACb,yGAAyG,CAAC;AAE5G;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAAiB;IAC/D,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAgB,EAChB,IAAiB;IAEjB,MAAM,IAAI,GAAgB,EAAE,GAAG,GAAG,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAA2B,EAAE,GAAG,MAAM,EAAE,CAAC;QACxD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9C,IAAI,OAAO,EAAE,CAAC;gBACZ,SAAS,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type PackageJson } from "../project/package-json.js";
2
+ /** Map of package name → locked version used when re-pinning ranges. */
3
+ export type LockedVersions = Map<string, string>;
4
+ /**
5
+ * Replaces direct dependency specs with exact locked versions where available.
6
+ * Skips specs that should not be rewritten (e.g. workspace/link protocols).
7
+ */
8
+ export declare function rePinPackageJson(pkg: PackageJson, locked: LockedVersions): PackageJson;
@@ -0,0 +1,28 @@
1
+ import { DIRECT_DEP_FIELDS, } from "../project/package-json.js";
2
+ import { shouldSkipSpec } from "./constraints.js";
3
+ /**
4
+ * Replaces direct dependency specs with exact locked versions where available.
5
+ * Skips specs that should not be rewritten (e.g. workspace/link protocols).
6
+ */
7
+ export function rePinPackageJson(pkg, locked) {
8
+ const next = { ...pkg };
9
+ for (const field of DIRECT_DEP_FIELDS) {
10
+ const bucket = pkg[field];
11
+ if (!bucket) {
12
+ continue;
13
+ }
14
+ const rewritten = { ...bucket };
15
+ for (const [name, spec] of Object.entries(bucket)) {
16
+ if (shouldSkipSpec(spec)) {
17
+ continue;
18
+ }
19
+ const version = locked.get(name);
20
+ if (version) {
21
+ rewritten[name] = version;
22
+ }
23
+ }
24
+ next[field] = rewritten;
25
+ }
26
+ return next;
27
+ }
28
+ //# sourceMappingURL=repin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repin.js","sourceRoot":"","sources":["../../src/rewrite/repin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAElB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKlD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAgB,EAChB,MAAsB;IAEtB,MAAM,IAAI,GAAgB,EAAE,GAAG,GAAG,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAA2B,EAAE,GAAG,MAAM,EAAE,CAAC;QACxD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,SAAS;YACX,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,OAAO,EAAE,CAAC;gBACZ,SAAS,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}