@anselmdk/feature-spec-md 0.5.0-rc.1 → 0.5.0-rc.2
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"githubActionDiffReport.d.ts","sourceRoot":"","sources":["../src/githubActionDiffReport.ts"],"names":[],"mappings":"AAKA,OAAO,EAQL,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,MAAM,6BAA6B,GAAG,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"githubActionDiffReport.d.ts","sourceRoot":"","sources":["../src/githubActionDiffReport.ts"],"names":[],"mappings":"AAKA,OAAO,EAQL,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,MAAM,6BAA6B,GAAG,mBAAmB,CAAC;AAsBhE,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,6BAA6B,iBAyCvC"}
|
|
@@ -8,29 +8,18 @@ import { writeGithubOutput, writeGithubSummary } from "./githubActionOutput.js";
|
|
|
8
8
|
export async function publishGithubActionDiffReport(options) {
|
|
9
9
|
const config = ftpConfig(options);
|
|
10
10
|
const prNumber = config.prNumber;
|
|
11
|
-
if (!prNumber)
|
|
11
|
+
if (!prNumber)
|
|
12
12
|
throw new Error("Missing required option --pr-number or FEATURE_SPEC_PR_NUMBER.");
|
|
13
|
-
}
|
|
14
13
|
const buildsRoot = pathJoin(config.remoteDir, "build");
|
|
15
14
|
const builds = await listBuildNumbers(buildsRoot, config);
|
|
16
15
|
const currentBuild = config.buildNumber;
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
: {
|
|
25
|
-
prNumber,
|
|
26
|
-
currentBuild,
|
|
27
|
-
currentBuildUrl,
|
|
28
|
-
files: [],
|
|
29
|
-
};
|
|
30
|
-
if (previousBuild) {
|
|
31
|
-
report.previousBuild = previousBuild;
|
|
32
|
-
report.previousBuildUrl = previousBuildUrl;
|
|
33
|
-
}
|
|
16
|
+
const requestedBaseBuild = optionValue(options, "base-build-number", "FEATURE_SPEC_BASE_BUILD_NUMBER");
|
|
17
|
+
const hasRequestedBaseBuild = Boolean(requestedBaseBuild && builds.includes(requestedBaseBuild));
|
|
18
|
+
const baseBuild = hasRequestedBaseBuild ? requestedBaseBuild : previousBuildNumber(builds, currentBuild);
|
|
19
|
+
const baseLabel = hasRequestedBaseBuild ? "main" : baseBuild ? "previous" : "none";
|
|
20
|
+
const report = baseBuild
|
|
21
|
+
? await compareBuilds(config, baseBuild, currentBuild, prNumber, baseLabel)
|
|
22
|
+
: emptyReport(config, prNumber, currentBuild);
|
|
34
23
|
const localReportDir = join(tmpdir(), `feature-spec-md-pr-diff-${process.pid}-${prNumber}-${currentBuild}`);
|
|
35
24
|
await mkdir(localReportDir, { recursive: true });
|
|
36
25
|
await writeFile(join(localReportDir, "index.html"), renderDiffReport(report), "utf8");
|
|
@@ -41,98 +30,87 @@ export async function publishGithubActionDiffReport(options) {
|
|
|
41
30
|
"## Feature Spec PR Diff",
|
|
42
31
|
"",
|
|
43
32
|
`<p><strong>Diff report:</strong> <a href=\"${html(reportUrl)}\">PR #${html(prNumber)} build ${html(currentBuild)}</a></p>`,
|
|
44
|
-
report
|
|
45
|
-
? `<p>Compared build <strong>${html(report.previousBuild)}</strong> with build <strong>${html(currentBuild)}</strong>.</p>`
|
|
46
|
-
: `<p>No earlier build was found, so this report establishes the first comparison baseline.</p>`,
|
|
33
|
+
summaryComparisonSentence(report),
|
|
47
34
|
"",
|
|
48
35
|
].join("\n"));
|
|
49
36
|
await writeGithubOutput({
|
|
50
37
|
"diff-report-url": reportUrl,
|
|
51
38
|
"diff-comment-body": commentBody(report, reportUrl),
|
|
52
|
-
"
|
|
39
|
+
"base-build": report.baseLabel === "main" ? report.baseBuild ?? "" : "",
|
|
40
|
+
"previous-build": report.baseLabel === "previous" ? report.baseBuild ?? "" : "",
|
|
53
41
|
"current-build": currentBuild,
|
|
54
42
|
});
|
|
55
43
|
console.log(`Feature spec PR diff report uploaded to ${reportUrl}`);
|
|
56
44
|
}
|
|
57
|
-
|
|
58
|
-
|
|
45
|
+
function emptyReport(config, prNumber, currentBuild) {
|
|
46
|
+
return {
|
|
47
|
+
prNumber,
|
|
48
|
+
currentBuild,
|
|
49
|
+
currentBuildUrl: publicUrl(config.baseUrl, "build", currentBuild, ""),
|
|
50
|
+
baseLabel: "none",
|
|
51
|
+
files: [],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async function compareBuilds(config, baseBuild, currentBuild, prNumber, baseLabel) {
|
|
55
|
+
const baseRoot = pathJoin(config.remoteDir, "build", baseBuild);
|
|
59
56
|
const currentRoot = pathJoin(config.remoteDir, "build", currentBuild);
|
|
60
|
-
const
|
|
57
|
+
const baseFiles = await listRemoteFilesRecursive(baseRoot, config);
|
|
61
58
|
const currentFiles = await listRemoteFilesRecursive(currentRoot, config);
|
|
62
|
-
const
|
|
59
|
+
const baseRelative = new Set(baseFiles.map((file) => relativeRemotePath(baseRoot, file)));
|
|
63
60
|
const currentRelative = new Set(currentFiles.map((file) => relativeRemotePath(currentRoot, file)));
|
|
64
|
-
const allPaths = Array.from(new Set([...
|
|
65
|
-
const localRoot = join(tmpdir(), `feature-spec-md-build-compare-${process.pid}-${
|
|
61
|
+
const allPaths = Array.from(new Set([...baseRelative, ...currentRelative])).sort();
|
|
62
|
+
const localRoot = join(tmpdir(), `feature-spec-md-build-compare-${process.pid}-${baseBuild}-${currentBuild}`);
|
|
66
63
|
const files = [];
|
|
67
64
|
for (const filePath of allPaths) {
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const currentRemote = currentRelative.has(filePath)
|
|
72
|
-
? pathJoin(currentRoot, filePath)
|
|
73
|
-
: undefined;
|
|
74
|
-
const previousLocal = previousRemote
|
|
75
|
-
? join(localRoot, "previous", filePath)
|
|
76
|
-
: undefined;
|
|
65
|
+
const baseRemote = baseRelative.has(filePath) ? pathJoin(baseRoot, filePath) : undefined;
|
|
66
|
+
const currentRemote = currentRelative.has(filePath) ? pathJoin(currentRoot, filePath) : undefined;
|
|
67
|
+
const baseLocal = baseRemote ? join(localRoot, "base", filePath) : undefined;
|
|
77
68
|
const currentLocal = currentRemote ? join(localRoot, "current", filePath) : undefined;
|
|
78
|
-
if (
|
|
79
|
-
await downloadRemoteFile(
|
|
80
|
-
|
|
81
|
-
if (currentRemote && currentLocal) {
|
|
69
|
+
if (baseRemote && baseLocal)
|
|
70
|
+
await downloadRemoteFile(baseRemote, baseLocal, config);
|
|
71
|
+
if (currentRemote && currentLocal)
|
|
82
72
|
await downloadRemoteFile(currentRemote, currentLocal, config);
|
|
83
|
-
|
|
84
|
-
const previousInfo = previousLocal ? await fileInfo(previousLocal) : undefined;
|
|
73
|
+
const baseInfo = baseLocal ? await fileInfo(baseLocal) : undefined;
|
|
85
74
|
const currentInfo = currentLocal ? await fileInfo(currentLocal) : undefined;
|
|
86
|
-
const status = !
|
|
87
|
-
? "added"
|
|
88
|
-
: !currentInfo
|
|
89
|
-
? "removed"
|
|
90
|
-
: previousInfo.hash === currentInfo.hash
|
|
91
|
-
? "unchanged"
|
|
92
|
-
: "changed";
|
|
75
|
+
const status = !baseInfo ? "added" : !currentInfo ? "removed" : baseInfo.hash === currentInfo.hash ? "unchanged" : "changed";
|
|
93
76
|
files.push({
|
|
94
77
|
path: filePath,
|
|
95
78
|
kind: fileKind(filePath),
|
|
96
79
|
status,
|
|
97
|
-
previousHash:
|
|
80
|
+
previousHash: baseInfo?.hash,
|
|
98
81
|
currentHash: currentInfo?.hash,
|
|
99
|
-
previousSize:
|
|
82
|
+
previousSize: baseInfo?.size,
|
|
100
83
|
currentSize: currentInfo?.size,
|
|
101
84
|
});
|
|
102
85
|
}
|
|
103
86
|
return {
|
|
104
87
|
prNumber,
|
|
105
|
-
|
|
88
|
+
baseBuild,
|
|
106
89
|
currentBuild,
|
|
107
|
-
|
|
90
|
+
baseBuildUrl: publicUrl(config.baseUrl, "build", baseBuild, ""),
|
|
108
91
|
currentBuildUrl: publicUrl(config.baseUrl, "build", currentBuild, ""),
|
|
92
|
+
baseLabel,
|
|
109
93
|
files,
|
|
110
94
|
};
|
|
111
95
|
}
|
|
112
96
|
function previousBuildNumber(builds, currentBuild) {
|
|
113
97
|
const current = Number(currentBuild);
|
|
114
|
-
return builds
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
.at(0)
|
|
119
|
-
?.toString();
|
|
98
|
+
return builds.map(Number).filter((build) => Number.isFinite(build) && build < current).sort((a, b) => b - a).at(0)?.toString();
|
|
99
|
+
}
|
|
100
|
+
function optionValue(options, key, envKey) {
|
|
101
|
+
return options[key] ?? process.env[envKey];
|
|
120
102
|
}
|
|
121
103
|
async function fileInfo(filePath) {
|
|
122
104
|
const buffer = await readFile(filePath);
|
|
123
|
-
return {
|
|
124
|
-
hash: createHash("sha256").update(buffer).digest("hex"),
|
|
125
|
-
size: buffer.byteLength,
|
|
126
|
-
};
|
|
105
|
+
return { hash: createHash("sha256").update(buffer).digest("hex"), size: buffer.byteLength };
|
|
127
106
|
}
|
|
128
107
|
function relativeRemotePath(root, filePath) {
|
|
129
108
|
return relative(root, filePath).split("\\").join("/");
|
|
130
109
|
}
|
|
131
110
|
function fileKind(filePath) {
|
|
132
111
|
const name = basename(filePath).toLowerCase();
|
|
133
|
-
if (name === "index.html" || name.endsWith(".html") || name.endsWith(".json"))
|
|
112
|
+
if (name === "index.html" || name.endsWith(".html") || name.endsWith(".json"))
|
|
134
113
|
return "report";
|
|
135
|
-
}
|
|
136
114
|
if (/\.(png|jpe?g|webp|gif)$/i.test(name))
|
|
137
115
|
return "screenshot";
|
|
138
116
|
return "asset";
|
|
@@ -140,46 +118,12 @@ function fileKind(filePath) {
|
|
|
140
118
|
function renderDiffReport(report) {
|
|
141
119
|
const changed = report.files.filter((file) => file.status !== "unchanged");
|
|
142
120
|
const byKind = (kind) => changed.filter((file) => file.kind === kind);
|
|
143
|
-
|
|
144
|
-
renderFileSection("Report output", byKind("report")),
|
|
145
|
-
renderFileSection("Screenshots", byKind("screenshot")),
|
|
146
|
-
renderFileSection("Other assets", byKind("asset")),
|
|
147
|
-
].join("\n");
|
|
148
|
-
return `<!doctype html>
|
|
149
|
-
<html lang="en">
|
|
150
|
-
<head>
|
|
151
|
-
<meta charset="utf-8">
|
|
152
|
-
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
153
|
-
<title>Feature spec PR diff</title>
|
|
154
|
-
<style>
|
|
155
|
-
body{font-family:system-ui,sans-serif;max-width:1180px;margin:0 auto;padding:40px 24px;color:#1f2328}
|
|
156
|
-
.panel{border:1px solid #d0d7de;border-radius:8px;padding:20px;margin:18px 0}
|
|
157
|
-
.badge{border:1px solid #d0d7de;border-radius:999px;padding:2px 8px;font-size:12px;white-space:nowrap}
|
|
158
|
-
.added{color:#1a7f37}.removed{color:#cf222e}.changed{color:#9a6700}.muted{color:#57606a}
|
|
159
|
-
table{border-collapse:collapse;width:100%;font-size:14px} th,td{border:1px solid #d0d7de;padding:6px 8px;text-align:left;vertical-align:top} th{background:#f6f8fa}
|
|
160
|
-
a{color:#0969da}
|
|
161
|
-
</style>
|
|
162
|
-
</head>
|
|
163
|
-
<body>
|
|
164
|
-
<h1>Feature spec PR diff for PR #${html(report.prNumber)}</h1>
|
|
165
|
-
<p>Generated ${html(new Date().toISOString())}.</p>
|
|
166
|
-
<section class="panel">
|
|
167
|
-
<h2>Compared builds</h2>
|
|
168
|
-
<p>${report.previousBuild ? `Previous: <a href="${html(report.previousBuildUrl ?? "")}">build ${html(report.previousBuild)}</a>` : "No previous build found."}</p>
|
|
169
|
-
<p>Current: <a href="${html(report.currentBuildUrl)}">build ${html(report.currentBuild)}</a></p>
|
|
170
|
-
<p><span class="badge">${changed.length} changed file${changed.length === 1 ? "" : "s"}</span> <span class="muted">${report.files.length} file${report.files.length === 1 ? "" : "s"} checked</span></p>
|
|
171
|
-
</section>
|
|
172
|
-
${sections}
|
|
173
|
-
</body>
|
|
174
|
-
</html>`;
|
|
121
|
+
return `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Feature spec PR diff</title><style>body{font-family:system-ui,sans-serif;max-width:1180px;margin:0 auto;padding:40px 24px;color:#1f2328}.panel{border:1px solid #d0d7de;border-radius:8px;padding:20px;margin:18px 0}.badge{border:1px solid #d0d7de;border-radius:999px;padding:2px 8px;font-size:12px}.added{color:#1a7f37}.removed{color:#cf222e}.changed{color:#9a6700}.muted{color:#57606a}table{border-collapse:collapse;width:100%;font-size:14px}th,td{border:1px solid #d0d7de;padding:6px 8px;text-align:left;vertical-align:top}th{background:#f6f8fa}a{color:#0969da}</style></head><body><h1>Feature spec PR diff for PR #${html(report.prNumber)}</h1><p>Generated ${html(new Date().toISOString())}.</p><section class="panel"><h2>Compared builds</h2><p>${report.baseBuild ? `${baseLabel(report)}: <a href="${html(report.baseBuildUrl ?? "")}">build ${html(report.baseBuild)}</a>` : "No base build found."}</p><p>PR: <a href="${html(report.currentBuildUrl)}">build ${html(report.currentBuild)}</a></p><p><span class="badge">${changed.length} changed file${changed.length === 1 ? "" : "s"}</span> <span class="muted">${report.files.length} file${report.files.length === 1 ? "" : "s"} checked</span></p></section>${renderFileSection("Report output", byKind("report"))}${renderFileSection("Screenshots", byKind("screenshot"))}${renderFileSection("Other assets", byKind("asset"))}</body></html>`;
|
|
175
122
|
}
|
|
176
123
|
function renderFileSection(title, files) {
|
|
177
|
-
if (!files.length)
|
|
124
|
+
if (!files.length)
|
|
178
125
|
return `<section class="panel"><h2>${html(title)}</h2><p class="muted">No changes.</p></section>`;
|
|
179
|
-
}
|
|
180
|
-
return `<section class="panel"><h2>${html(title)}</h2><table><thead><tr><th>Status</th><th>File</th><th>Size change</th></tr></thead><tbody>${files
|
|
181
|
-
.map((file) => `<tr><td class="${file.status}">${html(file.status)}</td><td><code>${html(file.path)}</code></td><td>${html(sizeChange(file))}</td></tr>`)
|
|
182
|
-
.join("")}</tbody></table></section>`;
|
|
126
|
+
return `<section class="panel"><h2>${html(title)}</h2><table><thead><tr><th>Status</th><th>File</th><th>Size change</th></tr></thead><tbody>${files.map((file) => `<tr><td class="${file.status}">${html(file.status)}</td><td><code>${html(file.path)}</code></td><td>${html(sizeChange(file))}</td></tr>`).join("")}</tbody></table></section>`;
|
|
183
127
|
}
|
|
184
128
|
function sizeChange(file) {
|
|
185
129
|
if (file.previousSize === undefined)
|
|
@@ -187,23 +131,29 @@ function sizeChange(file) {
|
|
|
187
131
|
if (file.currentSize === undefined)
|
|
188
132
|
return `-${file.previousSize} bytes`;
|
|
189
133
|
const diff = file.currentSize - file.previousSize;
|
|
190
|
-
|
|
191
|
-
return "same size";
|
|
192
|
-
return `${diff > 0 ? "+" : ""}${diff} bytes`;
|
|
134
|
+
return diff === 0 ? "same size" : `${diff > 0 ? "+" : ""}${diff} bytes`;
|
|
193
135
|
}
|
|
194
136
|
function commentBody(report, reportUrl) {
|
|
195
137
|
const changed = report.files.filter((file) => file.status !== "unchanged");
|
|
196
138
|
const reportChanges = changed.filter((file) => file.kind === "report").length;
|
|
197
139
|
const screenshotChanges = changed.filter((file) => file.kind === "screenshot").length;
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
140
|
+
return ["## Feature spec PR diff", "", `[Open the diff report](${reportUrl}) for ${comparisonText(report)}.`, "", `Changed files: **${changed.length}** total, **${reportChanges}** report output, **${screenshotChanges}** screenshots.`].join("\n");
|
|
141
|
+
}
|
|
142
|
+
function comparisonText(report) {
|
|
143
|
+
if (!report.baseBuild)
|
|
144
|
+
return `PR build ${report.currentBuild}`;
|
|
145
|
+
return `${baseLabel(report).toLowerCase()} build ${report.baseBuild} → PR build ${report.currentBuild}`;
|
|
146
|
+
}
|
|
147
|
+
function summaryComparisonSentence(report) {
|
|
148
|
+
if (!report.baseBuild)
|
|
149
|
+
return `<p>No base build was found, so this report establishes the first comparison baseline.</p>`;
|
|
150
|
+
return `<p>Compared ${html(baseLabel(report).toLowerCase())} build <strong>${html(report.baseBuild)}</strong> with PR build <strong>${html(report.currentBuild)}</strong>.</p>`;
|
|
151
|
+
}
|
|
152
|
+
function baseLabel(report) {
|
|
153
|
+
if (report.baseLabel === "main")
|
|
154
|
+
return "Main";
|
|
155
|
+
if (report.baseLabel === "previous")
|
|
156
|
+
return "Previous";
|
|
157
|
+
return "Base";
|
|
208
158
|
}
|
|
209
159
|
//# sourceMappingURL=githubActionDiffReport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"githubActionDiffReport.js","sourceRoot":"","sources":["../src/githubActionDiffReport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,wBAAwB,EACxB,QAAQ,EACR,SAAS,EACT,eAAe,GAEhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"githubActionDiffReport.js","sourceRoot":"","sources":["../src/githubActionDiffReport.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anselmdk/feature-spec-md",
|
|
3
|
-
"version": "0.5.0-rc.
|
|
3
|
+
"version": "0.5.0-rc.2",
|
|
4
4
|
"description": "Markdown specs for AI-assisted, testable spec driven development across model, feature, stack, and design documents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|