agentxchain 2.75.0 → 2.76.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/package.json
CHANGED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
import { execFileSync } from 'node:child_process';
|
|
6
|
+
|
|
7
|
+
function usage() {
|
|
8
|
+
console.error('Usage: node scripts/render-github-release-body.mjs --target-version <semver> [--repo <owner/name>]');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function parseArgs(argv) {
|
|
12
|
+
let targetVersion = '';
|
|
13
|
+
let repo = process.env.GITHUB_REPOSITORY || 'shivamtiwari93/agentXchain.dev';
|
|
14
|
+
|
|
15
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
16
|
+
const arg = argv[i];
|
|
17
|
+
if (arg === '--target-version') {
|
|
18
|
+
targetVersion = argv[i + 1] || '';
|
|
19
|
+
i += 1;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (arg === '--repo') {
|
|
23
|
+
repo = argv[i + 1] || '';
|
|
24
|
+
i += 1;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
usage();
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (!/^\d+\.\d+\.\d+$/.test(targetVersion)) {
|
|
32
|
+
usage();
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return { targetVersion, repo };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function stripFrontmatter(text) {
|
|
40
|
+
return text.replace(/^---\n[\s\S]*?\n---\n*/, '').trim();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function extractSummaryParagraph(text, version) {
|
|
44
|
+
const heading = `# AgentXchain v${version}`;
|
|
45
|
+
const headingIndex = text.indexOf(heading);
|
|
46
|
+
if (headingIndex === -1) {
|
|
47
|
+
throw new Error(`Release heading missing from governed release page for ${version}`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const afterHeading = text.slice(headingIndex + heading.length).trimStart();
|
|
51
|
+
const summaryMatch = afterHeading.match(/^([^\n#][\s\S]*?)\n\s*\n/);
|
|
52
|
+
if (!summaryMatch) {
|
|
53
|
+
throw new Error(`Release summary paragraph missing from governed release page for ${version}`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return summaryMatch[1].replace(/\s+/g, ' ').trim();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function extractAggregateEvidenceLine(text) {
|
|
60
|
+
const matches = [...text.matchAll(/^-\s+.*\b(\d+)\s+tests\b.*\b0 failures\b.*$/gm)];
|
|
61
|
+
if (matches.length === 0) {
|
|
62
|
+
throw new Error('Concrete aggregate evidence line missing from governed release page');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const aggregate = matches.reduce((best, match) => {
|
|
66
|
+
const count = Number(match[1]);
|
|
67
|
+
if (!best || count > best.count) {
|
|
68
|
+
return { count, line: match[0] };
|
|
69
|
+
}
|
|
70
|
+
return best;
|
|
71
|
+
}, null);
|
|
72
|
+
|
|
73
|
+
return aggregate.line.replace(/\*\*/g, '').replace(/`/g, '').trim();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function getPreviousVersionTag(repoRoot, version) {
|
|
77
|
+
const currentTag = `v${version}`;
|
|
78
|
+
const output = execFileSync(
|
|
79
|
+
'git',
|
|
80
|
+
['tag', '--list', 'v*.*.*', '--sort=-v:refname'],
|
|
81
|
+
{ cwd: repoRoot, encoding: 'utf8' },
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
const tags = output.split('\n').map((line) => line.trim()).filter(Boolean);
|
|
85
|
+
const currentIndex = tags.indexOf(currentTag);
|
|
86
|
+
if (currentIndex === -1 || currentIndex === tags.length - 1) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
return tags[currentIndex + 1];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function renderBody({ version, repo, summary, evidence, previousTag }) {
|
|
93
|
+
const docsUrl = `https://agentxchain.dev/docs/releases/v${version.replace(/\./g, '-')}`;
|
|
94
|
+
const npmUrl = `https://www.npmjs.com/package/agentxchain/v/${version}`;
|
|
95
|
+
const lines = [
|
|
96
|
+
`Public release notes: ${docsUrl}`,
|
|
97
|
+
`npm package: ${npmUrl}`,
|
|
98
|
+
'',
|
|
99
|
+
summary,
|
|
100
|
+
'',
|
|
101
|
+
'## Evidence',
|
|
102
|
+
evidence,
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
if (previousTag) {
|
|
106
|
+
lines.push('', `Full Changelog: https://github.com/${repo}/compare/${previousTag}...v${version}`);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return `${lines.join('\n')}\n`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function main() {
|
|
113
|
+
const { targetVersion, repo } = parseArgs(process.argv.slice(2));
|
|
114
|
+
const repoRoot = resolve(import.meta.dirname, '..', '..');
|
|
115
|
+
const releaseDocPath = resolve(
|
|
116
|
+
repoRoot,
|
|
117
|
+
'website-v2',
|
|
118
|
+
'docs',
|
|
119
|
+
'releases',
|
|
120
|
+
`v${targetVersion.replace(/\./g, '-')}.mdx`,
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
if (!existsSync(releaseDocPath)) {
|
|
124
|
+
throw new Error(`Governed release page missing: ${releaseDocPath}`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const rawDoc = readFileSync(releaseDocPath, 'utf8');
|
|
128
|
+
const doc = stripFrontmatter(rawDoc);
|
|
129
|
+
const summary = extractSummaryParagraph(doc, targetVersion);
|
|
130
|
+
const evidence = extractAggregateEvidenceLine(doc);
|
|
131
|
+
const previousTag = getPreviousVersionTag(repoRoot, targetVersion);
|
|
132
|
+
process.stdout.write(
|
|
133
|
+
renderBody({
|
|
134
|
+
version: targetVersion,
|
|
135
|
+
repo,
|
|
136
|
+
summary,
|
|
137
|
+
evidence,
|
|
138
|
+
previousTag,
|
|
139
|
+
}),
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
main();
|