@solana-epic/cli 0.1.0-beta.2 → 0.2.0-beta.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.
- package/dist/api.d.ts +12 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +20 -0
- package/dist/api.js.map +1 -0
- package/dist/formatters.d.ts +4 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +134 -0
- package/dist/formatters.js.map +1 -0
- package/dist/index.js +385 -508
- package/dist/index.js.map +1 -1
- package/dist/reports.d.ts +6 -0
- package/dist/reports.d.ts.map +1 -0
- package/dist/reports.js +187 -0
- package/dist/reports.js.map +1 -0
- package/dist/ui.d.ts +51 -4
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +563 -47
- package/dist/ui.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +11 -10
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CompatibilityReport, DiffReport } from "@solana-epic/diff-engine";
|
|
2
|
+
import { config } from "@solana-epic/parser";
|
|
3
|
+
export interface UpgradeReport {
|
|
4
|
+
programName: string;
|
|
5
|
+
compatibility: CompatibilityReport;
|
|
6
|
+
report: DiffReport;
|
|
7
|
+
intelligence: any;
|
|
8
|
+
epicConfig: config.ResolvedEpicConfig;
|
|
9
|
+
}
|
|
10
|
+
export declare function runCheck(oldPath: string, newPath: string, epicConfig: config.ResolvedEpicConfig): Promise<UpgradeReport>;
|
|
11
|
+
export { formatMarkdown, formatSarif } from "./formatters.js";
|
|
12
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,mBAAmB,EACnB,UAAU,EACX,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,mBAAmB,CAAC;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,kBAAkB,CAAC;CACvC;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAiB9H;AAED,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { analyzePrograms, compareAccountLayouts, simulateCompatibility, createUpgradeIntelligence } from "@solana-epic/diff-engine";
|
|
3
|
+
export async function runCheck(oldPath, newPath, epicConfig) {
|
|
4
|
+
const resolvedOldPath = path.resolve(oldPath);
|
|
5
|
+
const resolvedNewPath = path.resolve(newPath);
|
|
6
|
+
const { oldProgram, newProgram } = await analyzePrograms(resolvedOldPath, resolvedNewPath, epicConfig);
|
|
7
|
+
const compatibility = simulateCompatibility(oldProgram, newProgram, epicConfig);
|
|
8
|
+
const report = compareAccountLayouts(oldProgram, newProgram, epicConfig);
|
|
9
|
+
const intelligence = createUpgradeIntelligence(report);
|
|
10
|
+
const programName = compatibility.accounts[0]?.account || report.findings[0]?.account || path.basename(resolvedNewPath);
|
|
11
|
+
return {
|
|
12
|
+
programName,
|
|
13
|
+
compatibility,
|
|
14
|
+
report,
|
|
15
|
+
intelligence,
|
|
16
|
+
epicConfig
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export { formatMarkdown, formatSarif } from "./formatters.js";
|
|
20
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EAG1B,MAAM,0BAA0B,CAAC;AAWlC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe,EAAE,OAAe,EAAE,UAAqC;IACpG,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9C,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,eAAe,CAAC,eAAe,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;IACvG,MAAM,aAAa,GAAG,qBAAqB,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACzE,MAAM,YAAY,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAExH,OAAO;QACL,WAAW;QACX,aAAa;QACb,MAAM;QACN,YAAY;QACZ,UAAU;KACX,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,GAAE,OAAe,GAAG,MAAM,CAoF5F;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,GAAG,CAyDtD"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
export function formatMarkdown(result, configChanged = false) {
|
|
2
|
+
const { compatibility, report, programName, epicConfig } = result;
|
|
3
|
+
const lines = [];
|
|
4
|
+
const blocked = compatibility.overall === "Blocked";
|
|
5
|
+
const migration = compatibility.overall === "Migration-Required";
|
|
6
|
+
const safe = compatibility.overall === "Compatible";
|
|
7
|
+
if (blocked) {
|
|
8
|
+
lines.push("## 🔴 EPIC Guard: UPGRADE BLOCKED");
|
|
9
|
+
}
|
|
10
|
+
else if (migration) {
|
|
11
|
+
lines.push("## 🟡 EPIC Guard: MIGRATION REQUIRED");
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
lines.push("## 🟢 EPIC Guard: APPROVED");
|
|
15
|
+
}
|
|
16
|
+
lines.push("");
|
|
17
|
+
if (configChanged) {
|
|
18
|
+
lines.push("> [!WARNING]");
|
|
19
|
+
lines.push("> **UPGRADE CONFIGURATION GATE MODIFIED**");
|
|
20
|
+
lines.push("> This Pull Request contains changes to `epic.toml` configuration rules.");
|
|
21
|
+
lines.push("> Signers must audit the modifications below to ensure safety limits are not bypassed.");
|
|
22
|
+
lines.push("");
|
|
23
|
+
}
|
|
24
|
+
lines.push(`### Upgrade Compatibility: \`${programName}\``);
|
|
25
|
+
lines.push("");
|
|
26
|
+
if (compatibility.accounts.length === 0) {
|
|
27
|
+
lines.push("No state accounts found. Upgrade is safe.");
|
|
28
|
+
return lines.join("\n");
|
|
29
|
+
}
|
|
30
|
+
for (const acc of compatibility.accounts) {
|
|
31
|
+
const isBlocked = acc.status === "Blocked";
|
|
32
|
+
const isMigration = acc.status === "Migration-Required";
|
|
33
|
+
const icon = isBlocked ? "🔴" : isMigration ? "🟡" : "🟢";
|
|
34
|
+
lines.push(`#### ${icon} Struct \`${acc.account}\` (${acc.status})`);
|
|
35
|
+
if (acc.reasons && acc.reasons.length > 0) {
|
|
36
|
+
lines.push("");
|
|
37
|
+
lines.push("**Reasoning:**");
|
|
38
|
+
for (const r of acc.reasons) {
|
|
39
|
+
lines.push(`* ${r}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (acc.upgradePlan && acc.upgradePlan.length > 0) {
|
|
43
|
+
lines.push("");
|
|
44
|
+
lines.push("**Migration Plan:**");
|
|
45
|
+
if (acc.rentDeltaLamports !== null) {
|
|
46
|
+
lines.push(`* Rent Delta: \`${acc.rentDeltaLamports} lamports\` (\`${acc.sizeDelta} bytes\`)`);
|
|
47
|
+
}
|
|
48
|
+
for (const step of acc.upgradePlan) {
|
|
49
|
+
lines.push(`* ${step}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
lines.push("");
|
|
53
|
+
}
|
|
54
|
+
// Overrides section
|
|
55
|
+
const appliedOverrides = report.findings.filter(f => f.severity !== (f.kind === "FIELD_ADDED" ? "MAJOR" : "CRITICAL"));
|
|
56
|
+
if (appliedOverrides.length > 0) {
|
|
57
|
+
lines.push("### 🔑 Applied Layout Overrides");
|
|
58
|
+
lines.push("");
|
|
59
|
+
lines.push("| Struct | Finding | Field | Severity Shift | Note |");
|
|
60
|
+
lines.push("| :--- | :--- | :--- | :--- | :--- |");
|
|
61
|
+
for (const o of appliedOverrides) {
|
|
62
|
+
const original = o.kind === "FIELD_ADDED" ? "MAJOR" : "CRITICAL";
|
|
63
|
+
// Find note
|
|
64
|
+
let note = "No note provided.";
|
|
65
|
+
for (const [name, program] of epicConfig.programs.entries()) {
|
|
66
|
+
const match = program.overrides.find(override => override.account.toLowerCase() === o.account.toLowerCase() &&
|
|
67
|
+
override.finding.toUpperCase() === o.kind.toUpperCase());
|
|
68
|
+
if (match) {
|
|
69
|
+
note = match.note;
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
lines.push(`| \`${o.account}\` | \`${o.kind}\` | \`${o.field?.name || "global"}\` | \`${original}\` ──► \`${o.severity}\` | ${note} |`);
|
|
74
|
+
}
|
|
75
|
+
lines.push("");
|
|
76
|
+
}
|
|
77
|
+
return lines.join("\n");
|
|
78
|
+
}
|
|
79
|
+
export function formatSarif(result) {
|
|
80
|
+
// Return a valid SARIF structure based on the findings
|
|
81
|
+
const sarif = {
|
|
82
|
+
version: "2.1.0",
|
|
83
|
+
$schema: "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
|
|
84
|
+
runs: [
|
|
85
|
+
{
|
|
86
|
+
tool: {
|
|
87
|
+
driver: {
|
|
88
|
+
name: "EPIC Upgrade Intelligence",
|
|
89
|
+
version: "0.2.0-beta.0",
|
|
90
|
+
informationUri: "https://github.com/solana-epic/epic",
|
|
91
|
+
rules: []
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
results: []
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
};
|
|
98
|
+
const run = sarif.runs[0];
|
|
99
|
+
const rules = new Map();
|
|
100
|
+
for (const finding of result.report.findings) {
|
|
101
|
+
const ruleId = `EPIC-LAYOUT-${finding.kind}`;
|
|
102
|
+
if (!rules.has(ruleId)) {
|
|
103
|
+
rules.set(ruleId, {
|
|
104
|
+
id: ruleId,
|
|
105
|
+
shortDescription: { text: `State Layout Drift: ${finding.kind}` },
|
|
106
|
+
helpUri: "https://github.com/solana-epic/epic"
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Map severity
|
|
110
|
+
let level = "warning";
|
|
111
|
+
if (finding.severity === "CRITICAL")
|
|
112
|
+
level = "error";
|
|
113
|
+
if (finding.severity === "SAFE")
|
|
114
|
+
level = "note";
|
|
115
|
+
run.results.push({
|
|
116
|
+
ruleId,
|
|
117
|
+
level,
|
|
118
|
+
message: {
|
|
119
|
+
text: `Account \`${finding.account}\` changed: ${finding.kind}. Field: ${finding.field?.name || 'N/A'}`
|
|
120
|
+
},
|
|
121
|
+
locations: [
|
|
122
|
+
{
|
|
123
|
+
physicalLocation: {
|
|
124
|
+
artifactLocation: { uri: "epic.toml" },
|
|
125
|
+
region: { startLine: 1 }
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
run.tool.driver.rules = Array.from(rules.values());
|
|
132
|
+
return sarif;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=formatters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"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"}
|